diff --git a/.build/build-rat.xml b/.build/build-rat.xml
index cab1d4f..49d20cc 100644
--- a/.build/build-rat.xml
+++ b/.build/build-rat.xml
@@ -51,14 +51,18 @@
         <rat:report reportFile="${build.dir}/rat.txt">
             <fileset dir="." includesfile="${build.dir}/.ratinclude">
                  <!-- Config files with not much creativity -->
+                 <exclude name="**/.asf.yaml"/>
                  <exclude name="**/ide/**/*"/>
                  <exclude name="**/metrics-reporter-config-sample.yaml"/>
                  <exclude name="**/cassandra.yaml"/>
                  <exclude name="**/cassandra-murmur.yaml"/>
                  <exclude name="**/cassandra-seeds.yaml"/>
+                 <exclude name="**/harry-generic.yaml"/>
                  <exclude NAME="**/doc/antora.yml"/>
                  <exclude name="**/test/conf/cassandra.yaml"/>
-                 <exclude name="**/test/conf/cassandra_deprecated_parameters_names.yaml"/>
+                 <exclude name="**/test/conf/cassandra-old.yaml"/>
+                 <exclude name="**/test/conf/cassandra-converters-special-cases-old-names.yaml"/>
+                 <exclude name="**/test/conf/cassandra-converters-special-cases.yaml"/>
                  <exclude name="**/test/conf/cassandra_encryption.yaml"/>
                  <exclude name="**/test/conf/cdc.yaml"/>
                  <exclude name="**/test/conf/commitlog_compression_LZ4.yaml"/>
@@ -69,12 +73,18 @@
                  <exclude name="**/test/data/jmxdump/cassandra-3.0-jmx.yaml"/>
                  <exclude name="**/test/data/jmxdump/cassandra-3.11-jmx.yaml"/>
                  <exclude name="**/test/data/jmxdump/cassandra-4.0-jmx.yaml"/>
+                 <exclude name="**/test/data/jmxdump/cassandra-4.1-jmx.yaml"/>
+                 <exclude name="**/test/data/config/version=3.0.0-alpha1.yml"/>
+                 <exclude name="**/test/data/config/version=3.11.0.yml"/>
+                 <exclude name="**/test/data/config/version=4.0-alpha1.yml"/>
+                 <exclude name="**/test/resources/data/config/YamlConfigurationLoaderTest/shared_client_error_reporting_exclusions.yaml"/>
                  <exclude name="**/tools/cqlstress-counter-example.yaml"/>
                  <exclude name="**/tools/cqlstress-example.yaml"/>
                  <exclude name="**/tools/cqlstress-insanity-example.yaml"/>
                  <exclude name="**/tools/cqlstress-lwt-example.yaml"/>
                  <!-- Documentation files -->
                  <exclude NAME="**/doc/modules/**/*"/>
+                 <exclude NAME="**/src/java/**/*.md"/>
                  <!-- NOTICE files -->
                  <exclude NAME="**/NOTICE.md"/>
                  <!-- LICENSE files -->
diff --git a/.build/build-resolver.xml b/.build/build-resolver.xml
index 03db1c8..c38a272 100644
--- a/.build/build-resolver.xml
+++ b/.build/build-resolver.xml
@@ -56,6 +56,8 @@
         <resolver:remoterepos id="all">
             <remoterepo id="resolver-central" url="${artifact.remoteRepository.central}"/>
             <remoterepo id="resolver-apache" url="${artifact.remoteRepository.apache}"/>
+            <!-- Snapshots are not allowed, but for feature branches they may be needed, so uncomment the below to allow snapshots to work -->
+            <!-- <remoterepo id="resolver-apache-snapshot" url="https://repository.apache.org/content/repositories/snapshots" releases="false" snapshots="true" updates="always" checksums="fail" /> -->
         </resolver:remoterepos>
 
         <macrodef name="resolve">
@@ -199,6 +201,7 @@
         <!-- files.pythonhosted.org -->
         <get src="${artifact.python.pypi}/59/a0/cf4cd997e1750f0c2d91c6ea5abea218251c43c3581bcc2f118b00baf5cf/futures-2.1.6-py2.py3-none-any.whl" dest="${local.repository}/org/apache/cassandra/deps/futures-2.1.6-py2.py3-none-any.zip" usetimestamp="true" quiet="true" skipexisting="true"/>
         <get src="${artifact.python.pypi}/73/fb/00a976f728d0d1fecfe898238ce23f502a721c0ac0ecfedb80e0d88c64e9/six-1.12.0-py2.py3-none-any.whl" dest="${local.repository}/org/apache/cassandra/deps/six-1.12.0-py2.py3-none-any.zip" usetimestamp="true" quiet="true" skipexisting="true"/>
+        <get src="${artifact.python.pypi}/37/b2/ef1124540ee2c0b417be8d0f74667957e6aa084a3f26621aa67e2e77f3fb/pure_sasl-0.6.2-py2-none-any.whl" dest="${local.repository}/org/apache/cassandra/deps/pure_sasl-0.6.2-py2-none-any.zip" usetimestamp="true" quiet="true" skipexisting="true"/>
 
         <!-- apache/cassandra/lib -->
         <get src="${lib.download.base.url}/lib/geomet-0.1.0.zip" dest="${local.repository}/org/apache/cassandra/deps/geomet-0.1.0.zip" usetimestamp="true" quiet="true" skipexisting="true"/>
@@ -223,15 +226,13 @@
             <url url="${lib.download.base.url}/lib/sigar-bin/libsigar-x86-freebsd-6.so"/>
             <url url="${lib.download.base.url}/lib/sigar-bin/libsigar-x86-linux.so"/>
             <url url="${lib.download.base.url}/lib/sigar-bin/libsigar-x86-solaris.so"/>
-            <url url="${lib.download.base.url}/lib/sigar-bin/sigar-amd64-winnt.dll"/>
-            <url url="${lib.download.base.url}/lib/sigar-bin/sigar-x86-winnt.dll"/>
-            <url url="${lib.download.base.url}/lib/sigar-bin/sigar-x86-winnt.lib"/>
         </get>
         
         <copy todir="${build.lib}" quiet="true">
             <file file="${local.repository}/org/apache/cassandra/deps/futures-2.1.6-py2.py3-none-any.zip"/>
             <file file="${local.repository}/org/apache/cassandra/deps/six-1.12.0-py2.py3-none-any.zip"/>
             <file file="${local.repository}/org/apache/cassandra/deps/geomet-0.1.0.zip"/>
+            <file file="${local.repository}/org/apache/cassandra/deps/pure_sasl-0.6.2-py2-none-any.zip"/>
         </copy>
         <copy todir="${build.lib}/sigar-bin/" quiet="true">
             <file file="${local.repository}/org/apache/cassandra/deps/sigar-bin/libsigar-amd64-freebsd-6.so"/>
@@ -254,9 +255,6 @@
             <file file="${local.repository}/org/apache/cassandra/deps/sigar-bin/libsigar-x86-freebsd-6.so"/>
             <file file="${local.repository}/org/apache/cassandra/deps/sigar-bin/libsigar-x86-linux.so"/>
             <file file="${local.repository}/org/apache/cassandra/deps/sigar-bin/libsigar-x86-solaris.so"/>
-            <file file="${local.repository}/org/apache/cassandra/deps/sigar-bin/sigar-amd64-winnt.dll"/>
-            <file file="${local.repository}/org/apache/cassandra/deps/sigar-bin/sigar-x86-winnt.dll"/>
-            <file file="${local.repository}/org/apache/cassandra/deps/sigar-bin/sigar-x86-winnt.lib"/>
         </copy>
     </target>
 </project>
diff --git a/.circleci/config.yml b/.circleci/config.yml
index 1bae80b..b009cd1 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -83,7 +83,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -118,6 +118,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -131,6 +133,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -169,111 +172,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=fqltool-test
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant fqltool-test $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -310,6 +209,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -323,76 +224,32 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
-  j8_cqlsh-dtests-py2-with-vnodes:
+  j11_cqlshlib_cython_tests:
     docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
     resource_class: medium
     working_directory: ~/
     shell: /bin/bash -eo pipefail -l
-    parallelism: 4
+    parallelism: 1
     steps:
     - attach_workspace:
         at: /home/cassandra
     - run:
-        name: Clone Cassandra dtest Repository (via git)
+        name: Run cqlshlib Unit Tests
         command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
           export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_with_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_with_vnodes_raw /tmp/all_dtest_tests_j8_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_with_vnodes_raw > /tmp/all_dtest_tests_j8_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_with_vnodes > /tmp/split_dtest_tests_j8_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j8_with_vnodes)
+          export cython="yes"
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
     - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_with_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_with_vnodes_logs
+        path: /tmp/cassandra/pylib
     environment:
     - ANT_HOME: /usr/share/ant
     - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -418,6 +275,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -431,9 +290,11 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
   j8_cqlsh_dtests_py311_vnode:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -487,7 +348,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -525,6 +386,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -538,6 +401,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -590,7 +454,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -678,6 +542,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -691,6 +557,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -728,7 +595,7 @@
     - run:
         name: Run dtests (j8_large_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -762,6 +629,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -775,6 +644,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -843,7 +713,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-system-keyspace-directory -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -878,6 +748,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -891,6 +763,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -949,6 +822,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -962,6 +837,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1000,111 +876,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=stress-test-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1141,6 +913,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1154,6 +928,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1211,7 +986,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1249,6 +1024,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1262,10 +1039,130 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_jvm_dtests_vnode:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine distributed Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/distributed/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Unit Tests (testclasslist)
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          test_timeout=$(grep 'name="test.distributed.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+          if [ -z "$test_timeout" ]; then
+            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+          fi
+          ant testclasslist -Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j8_utests_compression_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -1301,111 +1198,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-compression
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-compression $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1442,6 +1235,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1455,6 +1250,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1523,7 +1319,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -1558,6 +1354,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1571,6 +1369,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1628,7 +1427,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1666,6 +1465,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1679,6 +1480,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1735,7 +1537,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1773,6 +1575,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1786,6 +1590,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1825,111 +1630,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-compression
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-compression $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1966,6 +1667,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1979,6 +1682,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2059,7 +1763,8 @@
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
                     $target == "long-test" || \
-                    $target == "stress-test" ]]; then
+                    $target == "stress-test" || \
+                    $target == "test-simulator-dtest" ]]; then
                 name="-Dtest.name=$class_name"
               else
                 name="-Dtest.name=$class_path"
@@ -2072,6 +1777,12 @@
                 methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
               fi
 
+              # Prepare the JVM dtests vnodes argument, which is optional
+              vnodes_args=""
+              if ${REPEATED_ANT_TEST_VNODES}; then
+                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+              fi
+
               # Run the test target as many times as requested collecting the exit code,
               # stopping the iteration only if stop_on_failure is set.
               exit_code="$?"
@@ -2081,7 +1792,7 @@
 
                 # run the test
                 status="passes"
-                if !( set -o pipefail && ant $target $name $methods -Dno-build-test=true | tee stdout.txt ); then
+                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                   status="fails"
                   exit_code=1
                 fi
@@ -2152,6 +1863,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2165,6 +1878,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2202,7 +1916,7 @@
     - run:
         name: Run dtests (j11_large_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -2236,6 +1950,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2249,6 +1965,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2280,7 +1997,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -2368,6 +2085,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2381,6 +2100,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2438,7 +2158,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2476,6 +2196,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2489,6 +2211,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -2545,7 +2268,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2583,6 +2306,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2596,6 +2321,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2633,7 +2359,7 @@
     - run:
         name: Run dtests (j11_large_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -2667,6 +2393,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2680,6 +2408,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2719,111 +2448,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-system-keyspace-directory
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-system-keyspace-directory $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2860,6 +2485,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2873,6 +2500,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2930,7 +2558,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2968,6 +2596,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2981,6 +2611,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3037,7 +2668,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -3075,6 +2706,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3088,10 +2721,76 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_cqlshlib_cython_tests:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run cqlshlib Unit Tests
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          export cython="yes"
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/pylib
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j11_utests_cdc:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -3157,7 +2856,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-cdc   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3192,6 +2891,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3205,6 +2906,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3263,6 +2965,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3276,6 +2980,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3345,7 +3050,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-system-keyspace-directory -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3380,6 +3085,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3393,6 +3100,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3423,7 +3131,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -3511,6 +3219,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3524,113 +3234,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j8_cqlsh-dtests-py2-offheap:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_dtests_offheap)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_dtests_offheap_raw /tmp/all_dtest_tests_j8_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_dtests_offheap_raw > /tmp/all_dtest_tests_j8_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_dtests_offheap > /tmp/split_dtest_tests_j8_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n"
-    - run:
-        name: Run dtests (j8_dtests_offheap)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt"
-          cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_dtests_offheap
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_dtests_offheap_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3661,7 +3265,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -3749,6 +3353,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3762,6 +3368,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3793,7 +3400,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -3881,6 +3488,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3894,6 +3503,242 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+  j11_jvm_dtests_vnode:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine distributed Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/distributed/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Unit Tests (testclasslist)
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          test_timeout=$(grep 'name="test.distributed.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+          if [ -z "$test_timeout" ]; then
+            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+          fi
+          ant testclasslist -Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j8_simulator_dtests:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine unit Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/unit/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/unit/;;g" | grep "Test\.java$"  > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Simulator Tests
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant test-simulator-dtest -Dno-build-test=true
+        no_output_timeout: 30m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3962,7 +3807,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-compression -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3997,6 +3842,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4010,6 +3857,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4067,6 +3915,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4080,6 +3930,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -4119,111 +3970,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4260,6 +4007,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4273,6 +4022,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4309,7 +4059,7 @@
     - run:
         name: Run dtests (j8_large_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -4343,6 +4093,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4356,113 +4108,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j8_cqlsh-dtests-py2-no-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_without_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_without_vnodes_raw /tmp/all_dtest_tests_j8_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_without_vnodes_raw > /tmp/all_dtest_tests_j8_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_without_vnodes > /tmp/split_dtest_tests_j8_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j8_without_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_without_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_without_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4520,6 +4166,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4533,6 +4181,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -4590,7 +4239,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -4628,6 +4277,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4641,6 +4292,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4671,7 +4323,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_UPGRADE_DTESTS}" == "<nil>" ]; then
@@ -4759,6 +4411,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4772,117 +4426,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-with-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_with_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_with_vnodes_raw /tmp/all_dtest_tests_j11_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_with_vnodes_raw > /tmp/all_dtest_tests_j11_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_with_vnodes > /tmp/split_dtest_tests_j11_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j11_with_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_with_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_with_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j11_utests_cdc_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -4918,111 +4465,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-cdc
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5059,6 +4502,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5072,6 +4517,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5125,7 +4571,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -5213,6 +4659,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5226,6 +4674,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5265,111 +4714,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=fqltool-test
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant fqltool-test $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5406,6 +4751,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5419,6 +4766,98 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+  j8_jvm_dtests_vnode_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -5487,7 +4926,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-compression -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -5522,6 +4961,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5535,6 +4976,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5592,7 +5034,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5630,6 +5072,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5643,6 +5087,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -5699,7 +5144,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5737,6 +5182,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5750,10 +5197,102 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_simulator_dtests_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_SIMULATOR_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-simulator-dtest\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-simulator-dtest $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j11_cqlsh_dtests_py311_offheap:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -5807,7 +5346,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5845,6 +5384,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5858,6 +5399,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5897,111 +5439,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-system-keyspace-directory
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-system-keyspace-directory $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6038,6 +5476,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6051,6 +5491,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6081,7 +5522,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -6169,6 +5610,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6182,6 +5625,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6239,7 +5683,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -6277,6 +5721,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6290,6 +5736,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6328,111 +5775,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=stress-test-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6469,6 +5812,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6482,6 +5827,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6512,7 +5858,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -6600,6 +5946,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6613,6 +5961,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6669,7 +6018,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -6707,6 +6056,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6720,6 +6071,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6757,7 +6109,7 @@
     - run:
         name: Run dtests (j8_upgradetests_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_upgradetests_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_upgradetests_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -6791,6 +6143,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6804,6 +6158,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6862,7 +6217,7 @@
     - run:
         name: Run dtests (j11_dtests_offheap)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -6896,6 +6251,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6909,6 +6266,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6948,111 +6306,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7089,6 +6343,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7102,6 +6358,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7158,7 +6415,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -7196,6 +6453,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7209,6 +6468,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7248,111 +6508,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7389,6 +6545,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7402,6 +6560,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7459,7 +6618,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -7497,6 +6656,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7510,6 +6671,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7549,111 +6711,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=long-testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant long-testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7690,6 +6748,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7703,6 +6763,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7739,7 +6800,7 @@
     - run:
         name: Run dtests (j8_dtests_offheap)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -7773,6 +6834,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7786,6 +6849,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7854,7 +6918,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -7889,6 +6953,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7902,6 +6968,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7970,7 +7037,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -8005,6 +7072,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8018,6 +7087,99 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j11_jvm_dtests_vnode_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8111,6 +7273,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8124,6 +7288,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8161,7 +7326,7 @@
     - run:
         name: Run dtests (j8_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8195,6 +7360,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8208,117 +7375,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-no-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_without_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_without_vnodes_raw /tmp/all_dtest_tests_j11_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_without_vnodes_raw > /tmp/all_dtest_tests_j11_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_without_vnodes > /tmp/split_dtest_tests_j11_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j11_without_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_without_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_without_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j8_dtests_vnode:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -8352,7 +7412,7 @@
     - run:
         name: Run dtests (j8_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8386,6 +7446,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8399,6 +7461,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -8417,8 +7480,8 @@
         command: |
           export PATH=$JAVA_HOME/bin:$PATH
           time mv ~/cassandra /tmp
-          cd /tmp/cassandra/pylib
-          ./cassandra-cqlsh-tests.sh ..
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/pylib
@@ -8447,6 +7510,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8460,6 +7525,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8499,111 +7565,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8640,6 +7602,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8653,6 +7617,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -8711,7 +7676,7 @@
     - run:
         name: Run dtests (j11_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8745,6 +7710,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8758,6 +7725,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8838,7 +7806,8 @@
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
                     $target == "long-test" || \
-                    $target == "stress-test" ]]; then
+                    $target == "stress-test" || \
+                    $target == "test-simulator-dtest" ]]; then
                 name="-Dtest.name=$class_name"
               else
                 name="-Dtest.name=$class_path"
@@ -8851,6 +7820,12 @@
                 methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
               fi
 
+              # Prepare the JVM dtests vnodes argument, which is optional
+              vnodes_args=""
+              if ${REPEATED_ANT_TEST_VNODES}; then
+                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+              fi
+
               # Run the test target as many times as requested collecting the exit code,
               # stopping the iteration only if stop_on_failure is set.
               exit_code="$?"
@@ -8860,7 +7835,7 @@
 
                 # run the test
                 status="passes"
-                if !( set -o pipefail && ant $target $name $methods -Dno-build-test=true | tee stdout.txt ); then
+                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                   status="fails"
                   exit_code=1
                 fi
@@ -8931,6 +7906,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8944,6 +7921,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9001,6 +7979,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9014,6 +7994,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9082,7 +8063,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-cdc   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -9117,6 +8098,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9130,6 +8113,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9186,7 +8170,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -9224,6 +8208,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9237,6 +8223,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9267,7 +8254,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -9355,6 +8342,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9368,6 +8357,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9436,7 +8426,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -9471,6 +8461,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9484,6 +8476,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9576,6 +8569,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9589,6 +8584,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9645,7 +8641,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -9683,6 +8679,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9696,117 +8694,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-offheap:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_dtests_offheap)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_dtests_offheap_raw /tmp/all_dtest_tests_j11_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_dtests_offheap_raw > /tmp/all_dtest_tests_j11_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_dtests_offheap > /tmp/split_dtest_tests_j11_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n"
-    - run:
-        name: Run dtests (j11_dtests_offheap)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt"
-          cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_dtests_offheap
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_dtests_offheap_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j11_unit_tests_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -9842,111 +8733,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9983,6 +8770,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9996,6 +8785,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10054,6 +8844,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10067,6 +8859,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10085,8 +8878,8 @@
         command: |
           export PATH=$JAVA_HOME/bin:$PATH
           time mv ~/cassandra /tmp
-          cd /tmp/cassandra/pylib
-          ./cassandra-cqlsh-tests.sh ..
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/pylib
@@ -10115,6 +8908,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10128,6 +8923,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10186,7 +8982,7 @@
     - run:
         name: Run dtests (j11_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -10220,6 +9016,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10233,6 +9031,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10272,111 +9071,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-cdc
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -10413,6 +9108,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10426,6 +9123,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10456,7 +9154,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -10544,6 +9242,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10557,6 +9257,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10595,111 +9296,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=long-testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant long-testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -10736,6 +9333,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10749,6 +9348,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10770,7 +9370,7 @@
           cd ~/cassandra
           mkdir ~/dtest_jars
           git remote add apache https://github.com/apache/cassandra.git
-          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 trunk; do
+          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 cassandra-4.1 trunk; do
             # check out the correct cassandra version:
             git remote set-branches --add apache '$branch'
             git fetch --depth 1 apache $branch
@@ -10839,6 +9439,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10852,6 +9454,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10876,12 +9479,54 @@
         requires:
         - start_j8_jvm_dtests
         - j8_build
+    - start_j8_jvm_dtests_vnode:
+        type: approval
+    - j8_jvm_dtests_vnode:
+        requires:
+        - start_j8_jvm_dtests_vnode
+        - j8_build
+    - start_j11_jvm_dtests:
+        type: approval
+    - j11_jvm_dtests:
+        requires:
+        - start_j11_jvm_dtests
+        - j8_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+        - start_j11_jvm_dtests_vnode
+        - j8_build
+    - start_j8_simulator_dtests:
+        type: approval
+    - j8_simulator_dtests:
+        requires:
+        - start_j8_simulator_dtests
+        - j8_build
     - start_j8_cqlshlib_tests:
         type: approval
     - j8_cqlshlib_tests:
         requires:
         - start_j8_cqlshlib_tests
         - j8_build
+    - start_j8_cqlshlib_cython_tests:
+        type: approval
+    - j8_cqlshlib_cython_tests:
+        requires:
+        - start_j8_cqlshlib_cython_tests
+        - j8_build
+    - start_j11_cqlshlib_tests:
+        type: approval
+    - j11_cqlshlib_tests:
+        requires:
+        - start_j11_cqlshlib_tests
+        - j8_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - start_j11_cqlshlib_cython_tests
+        - j8_build
     - start_j11_unit_tests:
         type: approval
     - j11_unit_tests:
@@ -10990,18 +9635,6 @@
         requires:
         - start_j8_dtests_offheap
         - j8_build
-    - start_j8_dtests_large:
-        type: approval
-    - j8_dtests_large:
-        requires:
-        - start_j8_dtests_large
-        - j8_build
-    - start_j8_dtests_large_vnode:
-        type: approval
-    - j8_dtests_large_vnode:
-        requires:
-        - start_j8_dtests_large_vnode
-        - j8_build
     - start_j11_dtests:
         type: approval
     - j11_dtests:
@@ -11020,6 +9653,18 @@
         requires:
         - start_j11_dtests_offheap
         - j8_build
+    - start_j8_dtests_large:
+        type: approval
+    - j8_dtests_large:
+        requires:
+        - start_j8_dtests_large
+        - j8_build
+    - start_j8_dtests_large_vnode:
+        type: approval
+    - j8_dtests_large_vnode:
+        requires:
+        - start_j8_dtests_large_vnode
+        - j8_build
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -11032,15 +9677,15 @@
         requires:
         - start_j11_dtests_large_vnode
         - j8_build
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
-        - start_upgrade_tests
+        - start_upgrade_dtests
         - j8_build
     - start_j8_cqlsh_tests:
         type: approval
-    - j8_cqlsh-dtests-py2-with-vnodes:
+    - j8_cqlsh_dtests_py3:
         requires:
         - start_j8_cqlsh_tests
         - j8_build
@@ -11048,22 +9693,6 @@
         requires:
         - start_j8_cqlsh_tests
         - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py3:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
         - start_j8_cqlsh_tests
@@ -11072,12 +9701,16 @@
         requires:
         - start_j8_cqlsh_tests
         - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
     - start_j8_cqlsh_tests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j8_cqlsh_tests_offheap
-        - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
         - start_j8_cqlsh_tests_offheap
@@ -11092,7 +9725,7 @@
         - j8_build
     - start_j11_cqlsh_tests:
         type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - j11_cqlsh_dtests_py3:
         requires:
         - start_j11_cqlsh_tests
         - j8_build
@@ -11100,22 +9733,6 @@
         requires:
         - start_j11_cqlsh_tests
         - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
         - start_j11_cqlsh_tests
@@ -11124,12 +9741,16 @@
         requires:
         - start_j11_cqlsh_tests
         - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j8_build
     - start_j11_cqlsh_tests_offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh_tests_offheap
-        - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh_tests_offheap
@@ -11152,12 +9773,33 @@
     - j8_unit_tests:
         requires:
         - j8_build
+    - j8_simulator_dtests:
+        requires:
+        - j8_build
     - j8_jvm_dtests:
         requires:
         - j8_build
+    - j8_jvm_dtests_vnode:
+        requires:
+        - j8_build
+    - j11_jvm_dtests:
+        requires:
+        - j8_build
+    - j11_jvm_dtests_vnode:
+        requires:
+        - j8_build
     - j8_cqlshlib_tests:
         requires:
         - j8_build
+    - j8_cqlshlib_cython_tests:
+        requires:
+        - j8_build
+    - j11_cqlshlib_tests:
+        requires:
+        - j8_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - j8_build
     - j11_unit_tests:
         requires:
         - j8_build
@@ -11273,42 +9915,32 @@
         requires:
         - start_j11_dtests_large
         - j8_build
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
         - j8_build
-        - start_upgrade_tests
-    - j8_cqlsh-dtests-py2-with-vnodes:
+        - start_upgrade_dtests
+    - j8_cqlsh_dtests_py3:
         requires:
         - j8_build
     - j8_cqlsh_dtests_py3_vnode:
         requires:
         - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-        - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-        - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j8_build
-    - j8_cqlsh_dtests_py3:
-        requires:
-        - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
         - j8_build
     - j8_cqlsh_dtests_py311:
         requires:
         - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+        - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+        - j8_build
     - start_j8_cqlsh_dtests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j8_cqlsh_dtests_offheap
-        - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
         - start_j8_cqlsh_dtests_offheap
@@ -11321,36 +9953,26 @@
         requires:
         - start_j8_cqlsh_dtests_offheap
         - j8_build
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - j11_cqlsh_dtests_py3:
         requires:
         - j8_build
     - j11_cqlsh_dtests_py3_vnode:
         requires:
         - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j8_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
         - j8_build
     - j11_cqlsh_dtests_py311:
         requires:
         - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - j8_build
     - start_j11_cqlsh-dtests-offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh-dtests-offheap
@@ -11382,12 +10004,24 @@
         requires:
         - start_j11_jvm_dtests
         - j11_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+        - start_j11_jvm_dtests_vnode
+        - j11_build
     - start_j11_cqlshlib_tests:
         type: approval
     - j11_cqlshlib_tests:
         requires:
         - start_j11_cqlshlib_tests
         - j11_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - start_j11_cqlshlib_cython_tests
+        - j11_build
     - start_j11_dtests:
         type: approval
     - j11_dtests:
@@ -11406,58 +10040,6 @@
         requires:
         - start_j11_dtests_offheap
         - j11_build
-    - start_j11_cqlsh_tests:
-        type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py3_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py38:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py311:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - start_j11_cqlsh-dtests-offheap:
-        type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py3_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py38_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py311_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -11470,6 +10052,46 @@
         requires:
         - start_j11_dtests_large_vnode
         - j11_build
+    - start_j11_cqlsh_tests:
+        type: approval
+    - j11_cqlsh_dtests_py3:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py3_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py38:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py311:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - start_j11_cqlsh-dtests-offheap:
+        type: approval
+    - j11_cqlsh_dtests_py3_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
+    - j11_cqlsh_dtests_py38_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
+    - j11_cqlsh_dtests_py311_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
     - start_j11_utests_long:
         type: approval
     - j11_utests_long:
@@ -11519,15 +10141,15 @@
     - j11_jvm_dtests:
         requires:
         - j11_build
-    - j11_cqlshlib_tests:
-        requires:
-        - j11_build
-    - j11_jvm_dtests:
+    - j11_jvm_dtests_vnode:
         requires:
         - j11_build
     - j11_cqlshlib_tests:
         requires:
         - j11_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - j11_build
     - j11_dtests:
         requires:
         - j11_build
@@ -11540,36 +10162,36 @@
         requires:
         - start_j11_dtests_offheap
         - j11_build
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - start_j11_dtests_large:
+        type: approval
+    - j11_dtests_large:
+        requires:
+        - start_j11_dtests_large
+        - j11_build
+    - j11_dtests_large_vnode:
+        requires:
+        - start_j11_dtests_large
+        - j11_build
+    - j11_cqlsh_dtests_py3:
         requires:
         - j11_build
     - j11_cqlsh_dtests_py3_vnode:
         requires:
         - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - j11_build
     - j11_cqlsh_dtests_py38:
         requires:
         - j11_build
     - j11_cqlsh_dtests_py311:
         requires:
         - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - j11_build
     - start_j11_cqlsh-dtests-offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh-dtests-offheap
@@ -11582,16 +10204,6 @@
         requires:
         - start_j11_cqlsh-dtests-offheap
         - j11_build
-    - start_j11_dtests_large:
-        type: approval
-    - j11_dtests_large:
-        requires:
-        - start_j11_dtests_large
-        - j11_build
-    - j11_dtests_large_vnode:
-        requires:
-        - start_j11_dtests_large
-        - j11_build
     - start_utests_long:
         type: approval
     - j11_utests_long:
diff --git a/.circleci/config.yml.FREE b/.circleci/config.yml.FREE
index 1bae80b..b009cd1 100644
--- a/.circleci/config.yml.FREE
+++ b/.circleci/config.yml.FREE
@@ -83,7 +83,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -118,6 +118,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -131,6 +133,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -169,111 +172,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=fqltool-test
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant fqltool-test $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -310,6 +209,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -323,76 +224,32 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
-  j8_cqlsh-dtests-py2-with-vnodes:
+  j11_cqlshlib_cython_tests:
     docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
     resource_class: medium
     working_directory: ~/
     shell: /bin/bash -eo pipefail -l
-    parallelism: 4
+    parallelism: 1
     steps:
     - attach_workspace:
         at: /home/cassandra
     - run:
-        name: Clone Cassandra dtest Repository (via git)
+        name: Run cqlshlib Unit Tests
         command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
           export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_with_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_with_vnodes_raw /tmp/all_dtest_tests_j8_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_with_vnodes_raw > /tmp/all_dtest_tests_j8_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_with_vnodes > /tmp/split_dtest_tests_j8_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j8_with_vnodes)
+          export cython="yes"
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
     - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_with_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_with_vnodes_logs
+        path: /tmp/cassandra/pylib
     environment:
     - ANT_HOME: /usr/share/ant
     - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -418,6 +275,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -431,9 +290,11 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
   j8_cqlsh_dtests_py311_vnode:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -487,7 +348,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -525,6 +386,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -538,6 +401,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -590,7 +454,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -678,6 +542,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -691,6 +557,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -728,7 +595,7 @@
     - run:
         name: Run dtests (j8_large_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -762,6 +629,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -775,6 +644,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -843,7 +713,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-system-keyspace-directory -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -878,6 +748,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -891,6 +763,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -949,6 +822,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -962,6 +837,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1000,111 +876,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=stress-test-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1141,6 +913,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1154,6 +928,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1211,7 +986,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1249,6 +1024,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1262,10 +1039,130 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_jvm_dtests_vnode:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine distributed Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/distributed/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Unit Tests (testclasslist)
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          test_timeout=$(grep 'name="test.distributed.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+          if [ -z "$test_timeout" ]; then
+            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+          fi
+          ant testclasslist -Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j8_utests_compression_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -1301,111 +1198,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-compression
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-compression $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1442,6 +1235,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1455,6 +1250,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1523,7 +1319,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -1558,6 +1354,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1571,6 +1369,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1628,7 +1427,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1666,6 +1465,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1679,6 +1480,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1735,7 +1537,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1773,6 +1575,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1786,6 +1590,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1825,111 +1630,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-compression
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-compression $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1966,6 +1667,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1979,6 +1682,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2059,7 +1763,8 @@
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
                     $target == "long-test" || \
-                    $target == "stress-test" ]]; then
+                    $target == "stress-test" || \
+                    $target == "test-simulator-dtest" ]]; then
                 name="-Dtest.name=$class_name"
               else
                 name="-Dtest.name=$class_path"
@@ -2072,6 +1777,12 @@
                 methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
               fi
 
+              # Prepare the JVM dtests vnodes argument, which is optional
+              vnodes_args=""
+              if ${REPEATED_ANT_TEST_VNODES}; then
+                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+              fi
+
               # Run the test target as many times as requested collecting the exit code,
               # stopping the iteration only if stop_on_failure is set.
               exit_code="$?"
@@ -2081,7 +1792,7 @@
 
                 # run the test
                 status="passes"
-                if !( set -o pipefail && ant $target $name $methods -Dno-build-test=true | tee stdout.txt ); then
+                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                   status="fails"
                   exit_code=1
                 fi
@@ -2152,6 +1863,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2165,6 +1878,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2202,7 +1916,7 @@
     - run:
         name: Run dtests (j11_large_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -2236,6 +1950,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2249,6 +1965,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2280,7 +1997,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -2368,6 +2085,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2381,6 +2100,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2438,7 +2158,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2476,6 +2196,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2489,6 +2211,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -2545,7 +2268,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2583,6 +2306,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2596,6 +2321,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2633,7 +2359,7 @@
     - run:
         name: Run dtests (j11_large_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -2667,6 +2393,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2680,6 +2408,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2719,111 +2448,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-system-keyspace-directory
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-system-keyspace-directory $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2860,6 +2485,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2873,6 +2500,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2930,7 +2558,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2968,6 +2596,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2981,6 +2611,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3037,7 +2668,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -3075,6 +2706,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3088,10 +2721,76 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_cqlshlib_cython_tests:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run cqlshlib Unit Tests
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          export cython="yes"
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/pylib
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j11_utests_cdc:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -3157,7 +2856,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-cdc   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3192,6 +2891,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3205,6 +2906,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3263,6 +2965,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3276,6 +2980,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3345,7 +3050,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-system-keyspace-directory -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3380,6 +3085,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3393,6 +3100,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3423,7 +3131,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -3511,6 +3219,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3524,113 +3234,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j8_cqlsh-dtests-py2-offheap:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_dtests_offheap)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_dtests_offheap_raw /tmp/all_dtest_tests_j8_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_dtests_offheap_raw > /tmp/all_dtest_tests_j8_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_dtests_offheap > /tmp/split_dtest_tests_j8_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n"
-    - run:
-        name: Run dtests (j8_dtests_offheap)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt"
-          cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_dtests_offheap
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_dtests_offheap_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3661,7 +3265,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -3749,6 +3353,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3762,6 +3368,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3793,7 +3400,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -3881,6 +3488,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3894,6 +3503,242 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+  j11_jvm_dtests_vnode:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine distributed Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/distributed/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Unit Tests (testclasslist)
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          test_timeout=$(grep 'name="test.distributed.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+          if [ -z "$test_timeout" ]; then
+            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+          fi
+          ant testclasslist -Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j8_simulator_dtests:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine unit Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/unit/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/unit/;;g" | grep "Test\.java$"  > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Simulator Tests
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant test-simulator-dtest -Dno-build-test=true
+        no_output_timeout: 30m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3962,7 +3807,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-compression -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3997,6 +3842,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4010,6 +3857,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4067,6 +3915,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4080,6 +3930,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -4119,111 +3970,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4260,6 +4007,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4273,6 +4022,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4309,7 +4059,7 @@
     - run:
         name: Run dtests (j8_large_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -4343,6 +4093,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4356,113 +4108,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j8_cqlsh-dtests-py2-no-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_without_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_without_vnodes_raw /tmp/all_dtest_tests_j8_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_without_vnodes_raw > /tmp/all_dtest_tests_j8_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_without_vnodes > /tmp/split_dtest_tests_j8_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j8_without_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_without_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_without_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4520,6 +4166,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4533,6 +4181,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -4590,7 +4239,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -4628,6 +4277,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4641,6 +4292,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4671,7 +4323,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_UPGRADE_DTESTS}" == "<nil>" ]; then
@@ -4759,6 +4411,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4772,117 +4426,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-with-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_with_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_with_vnodes_raw /tmp/all_dtest_tests_j11_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_with_vnodes_raw > /tmp/all_dtest_tests_j11_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_with_vnodes > /tmp/split_dtest_tests_j11_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j11_with_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_with_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_with_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j11_utests_cdc_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -4918,111 +4465,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-cdc
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5059,6 +4502,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5072,6 +4517,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5125,7 +4571,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -5213,6 +4659,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5226,6 +4674,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5265,111 +4714,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=fqltool-test
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant fqltool-test $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5406,6 +4751,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5419,6 +4766,98 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+  j8_jvm_dtests_vnode_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -5487,7 +4926,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-compression -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -5522,6 +4961,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5535,6 +4976,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5592,7 +5034,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5630,6 +5072,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5643,6 +5087,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -5699,7 +5144,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5737,6 +5182,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5750,10 +5197,102 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_simulator_dtests_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_SIMULATOR_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-simulator-dtest\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-simulator-dtest $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j11_cqlsh_dtests_py311_offheap:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -5807,7 +5346,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5845,6 +5384,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5858,6 +5399,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5897,111 +5439,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-system-keyspace-directory
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-system-keyspace-directory $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6038,6 +5476,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6051,6 +5491,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6081,7 +5522,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -6169,6 +5610,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6182,6 +5625,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6239,7 +5683,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -6277,6 +5721,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6290,6 +5736,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6328,111 +5775,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=stress-test-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6469,6 +5812,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6482,6 +5827,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6512,7 +5858,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -6600,6 +5946,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6613,6 +5961,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6669,7 +6018,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -6707,6 +6056,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6720,6 +6071,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6757,7 +6109,7 @@
     - run:
         name: Run dtests (j8_upgradetests_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_upgradetests_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_upgradetests_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -6791,6 +6143,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6804,6 +6158,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6862,7 +6217,7 @@
     - run:
         name: Run dtests (j11_dtests_offheap)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -6896,6 +6251,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6909,6 +6266,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6948,111 +6306,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7089,6 +6343,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7102,6 +6358,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7158,7 +6415,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -7196,6 +6453,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7209,6 +6468,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7248,111 +6508,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7389,6 +6545,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7402,6 +6560,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7459,7 +6618,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -7497,6 +6656,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7510,6 +6671,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7549,111 +6711,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=long-testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant long-testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7690,6 +6748,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7703,6 +6763,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7739,7 +6800,7 @@
     - run:
         name: Run dtests (j8_dtests_offheap)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -7773,6 +6834,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7786,6 +6849,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7854,7 +6918,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -7889,6 +6953,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7902,6 +6968,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7970,7 +7037,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -8005,6 +7072,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8018,6 +7087,99 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j11_jvm_dtests_vnode_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 4
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8111,6 +7273,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8124,6 +7288,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8161,7 +7326,7 @@
     - run:
         name: Run dtests (j8_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8195,6 +7360,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8208,117 +7375,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-no-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_without_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_without_vnodes_raw /tmp/all_dtest_tests_j11_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_without_vnodes_raw > /tmp/all_dtest_tests_j11_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_without_vnodes > /tmp/split_dtest_tests_j11_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j11_without_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_without_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_without_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j8_dtests_vnode:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -8352,7 +7412,7 @@
     - run:
         name: Run dtests (j8_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8386,6 +7446,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8399,6 +7461,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -8417,8 +7480,8 @@
         command: |
           export PATH=$JAVA_HOME/bin:$PATH
           time mv ~/cassandra /tmp
-          cd /tmp/cassandra/pylib
-          ./cassandra-cqlsh-tests.sh ..
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/pylib
@@ -8447,6 +7510,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8460,6 +7525,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8499,111 +7565,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8640,6 +7602,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8653,6 +7617,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -8711,7 +7676,7 @@
     - run:
         name: Run dtests (j11_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8745,6 +7710,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8758,6 +7725,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8838,7 +7806,8 @@
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
                     $target == "long-test" || \
-                    $target == "stress-test" ]]; then
+                    $target == "stress-test" || \
+                    $target == "test-simulator-dtest" ]]; then
                 name="-Dtest.name=$class_name"
               else
                 name="-Dtest.name=$class_path"
@@ -8851,6 +7820,12 @@
                 methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
               fi
 
+              # Prepare the JVM dtests vnodes argument, which is optional
+              vnodes_args=""
+              if ${REPEATED_ANT_TEST_VNODES}; then
+                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+              fi
+
               # Run the test target as many times as requested collecting the exit code,
               # stopping the iteration only if stop_on_failure is set.
               exit_code="$?"
@@ -8860,7 +7835,7 @@
 
                 # run the test
                 status="passes"
-                if !( set -o pipefail && ant $target $name $methods -Dno-build-test=true | tee stdout.txt ); then
+                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                   status="fails"
                   exit_code=1
                 fi
@@ -8931,6 +7906,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8944,6 +7921,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9001,6 +7979,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9014,6 +7994,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9082,7 +8063,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-cdc   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -9117,6 +8098,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9130,6 +8113,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9186,7 +8170,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -9224,6 +8208,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9237,6 +8223,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9267,7 +8254,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -9355,6 +8342,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9368,6 +8357,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9436,7 +8426,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -9471,6 +8461,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9484,6 +8476,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9576,6 +8569,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9589,6 +8584,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9645,7 +8641,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -9683,6 +8679,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9696,117 +8694,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-offheap:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: medium
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 4
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_dtests_offheap)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_dtests_offheap_raw /tmp/all_dtest_tests_j11_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_dtests_offheap_raw > /tmp/all_dtest_tests_j11_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_dtests_offheap > /tmp/split_dtest_tests_j11_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n"
-    - run:
-        name: Run dtests (j11_dtests_offheap)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt"
-          cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_dtests_offheap
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_dtests_offheap_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j11_unit_tests_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -9842,111 +8733,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9983,6 +8770,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9996,6 +8785,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10054,6 +8844,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10067,6 +8859,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10085,8 +8878,8 @@
         command: |
           export PATH=$JAVA_HOME/bin:$PATH
           time mv ~/cassandra /tmp
-          cd /tmp/cassandra/pylib
-          ./cassandra-cqlsh-tests.sh ..
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/pylib
@@ -10115,6 +8908,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10128,6 +8923,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10186,7 +8982,7 @@
     - run:
         name: Run dtests (j11_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -10220,6 +9016,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10233,6 +9031,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10272,111 +9071,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-cdc
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -10413,6 +9108,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10426,6 +9123,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10456,7 +9154,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -10544,6 +9242,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10557,6 +9257,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10595,111 +9296,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=long-testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant long-testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -10736,6 +9333,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10749,6 +9348,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10770,7 +9370,7 @@
           cd ~/cassandra
           mkdir ~/dtest_jars
           git remote add apache https://github.com/apache/cassandra.git
-          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 trunk; do
+          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 cassandra-4.1 trunk; do
             # check out the correct cassandra version:
             git remote set-branches --add apache '$branch'
             git fetch --depth 1 apache $branch
@@ -10839,6 +9439,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10852,6 +9454,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10876,12 +9479,54 @@
         requires:
         - start_j8_jvm_dtests
         - j8_build
+    - start_j8_jvm_dtests_vnode:
+        type: approval
+    - j8_jvm_dtests_vnode:
+        requires:
+        - start_j8_jvm_dtests_vnode
+        - j8_build
+    - start_j11_jvm_dtests:
+        type: approval
+    - j11_jvm_dtests:
+        requires:
+        - start_j11_jvm_dtests
+        - j8_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+        - start_j11_jvm_dtests_vnode
+        - j8_build
+    - start_j8_simulator_dtests:
+        type: approval
+    - j8_simulator_dtests:
+        requires:
+        - start_j8_simulator_dtests
+        - j8_build
     - start_j8_cqlshlib_tests:
         type: approval
     - j8_cqlshlib_tests:
         requires:
         - start_j8_cqlshlib_tests
         - j8_build
+    - start_j8_cqlshlib_cython_tests:
+        type: approval
+    - j8_cqlshlib_cython_tests:
+        requires:
+        - start_j8_cqlshlib_cython_tests
+        - j8_build
+    - start_j11_cqlshlib_tests:
+        type: approval
+    - j11_cqlshlib_tests:
+        requires:
+        - start_j11_cqlshlib_tests
+        - j8_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - start_j11_cqlshlib_cython_tests
+        - j8_build
     - start_j11_unit_tests:
         type: approval
     - j11_unit_tests:
@@ -10990,18 +9635,6 @@
         requires:
         - start_j8_dtests_offheap
         - j8_build
-    - start_j8_dtests_large:
-        type: approval
-    - j8_dtests_large:
-        requires:
-        - start_j8_dtests_large
-        - j8_build
-    - start_j8_dtests_large_vnode:
-        type: approval
-    - j8_dtests_large_vnode:
-        requires:
-        - start_j8_dtests_large_vnode
-        - j8_build
     - start_j11_dtests:
         type: approval
     - j11_dtests:
@@ -11020,6 +9653,18 @@
         requires:
         - start_j11_dtests_offheap
         - j8_build
+    - start_j8_dtests_large:
+        type: approval
+    - j8_dtests_large:
+        requires:
+        - start_j8_dtests_large
+        - j8_build
+    - start_j8_dtests_large_vnode:
+        type: approval
+    - j8_dtests_large_vnode:
+        requires:
+        - start_j8_dtests_large_vnode
+        - j8_build
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -11032,15 +9677,15 @@
         requires:
         - start_j11_dtests_large_vnode
         - j8_build
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
-        - start_upgrade_tests
+        - start_upgrade_dtests
         - j8_build
     - start_j8_cqlsh_tests:
         type: approval
-    - j8_cqlsh-dtests-py2-with-vnodes:
+    - j8_cqlsh_dtests_py3:
         requires:
         - start_j8_cqlsh_tests
         - j8_build
@@ -11048,22 +9693,6 @@
         requires:
         - start_j8_cqlsh_tests
         - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py3:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
         - start_j8_cqlsh_tests
@@ -11072,12 +9701,16 @@
         requires:
         - start_j8_cqlsh_tests
         - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
     - start_j8_cqlsh_tests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j8_cqlsh_tests_offheap
-        - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
         - start_j8_cqlsh_tests_offheap
@@ -11092,7 +9725,7 @@
         - j8_build
     - start_j11_cqlsh_tests:
         type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - j11_cqlsh_dtests_py3:
         requires:
         - start_j11_cqlsh_tests
         - j8_build
@@ -11100,22 +9733,6 @@
         requires:
         - start_j11_cqlsh_tests
         - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
         - start_j11_cqlsh_tests
@@ -11124,12 +9741,16 @@
         requires:
         - start_j11_cqlsh_tests
         - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j8_build
     - start_j11_cqlsh_tests_offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh_tests_offheap
-        - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh_tests_offheap
@@ -11152,12 +9773,33 @@
     - j8_unit_tests:
         requires:
         - j8_build
+    - j8_simulator_dtests:
+        requires:
+        - j8_build
     - j8_jvm_dtests:
         requires:
         - j8_build
+    - j8_jvm_dtests_vnode:
+        requires:
+        - j8_build
+    - j11_jvm_dtests:
+        requires:
+        - j8_build
+    - j11_jvm_dtests_vnode:
+        requires:
+        - j8_build
     - j8_cqlshlib_tests:
         requires:
         - j8_build
+    - j8_cqlshlib_cython_tests:
+        requires:
+        - j8_build
+    - j11_cqlshlib_tests:
+        requires:
+        - j8_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - j8_build
     - j11_unit_tests:
         requires:
         - j8_build
@@ -11273,42 +9915,32 @@
         requires:
         - start_j11_dtests_large
         - j8_build
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
         - j8_build
-        - start_upgrade_tests
-    - j8_cqlsh-dtests-py2-with-vnodes:
+        - start_upgrade_dtests
+    - j8_cqlsh_dtests_py3:
         requires:
         - j8_build
     - j8_cqlsh_dtests_py3_vnode:
         requires:
         - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-        - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-        - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j8_build
-    - j8_cqlsh_dtests_py3:
-        requires:
-        - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
         - j8_build
     - j8_cqlsh_dtests_py311:
         requires:
         - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+        - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+        - j8_build
     - start_j8_cqlsh_dtests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j8_cqlsh_dtests_offheap
-        - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
         - start_j8_cqlsh_dtests_offheap
@@ -11321,36 +9953,26 @@
         requires:
         - start_j8_cqlsh_dtests_offheap
         - j8_build
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - j11_cqlsh_dtests_py3:
         requires:
         - j8_build
     - j11_cqlsh_dtests_py3_vnode:
         requires:
         - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j8_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
         - j8_build
     - j11_cqlsh_dtests_py311:
         requires:
         - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - j8_build
     - start_j11_cqlsh-dtests-offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh-dtests-offheap
@@ -11382,12 +10004,24 @@
         requires:
         - start_j11_jvm_dtests
         - j11_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+        - start_j11_jvm_dtests_vnode
+        - j11_build
     - start_j11_cqlshlib_tests:
         type: approval
     - j11_cqlshlib_tests:
         requires:
         - start_j11_cqlshlib_tests
         - j11_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - start_j11_cqlshlib_cython_tests
+        - j11_build
     - start_j11_dtests:
         type: approval
     - j11_dtests:
@@ -11406,58 +10040,6 @@
         requires:
         - start_j11_dtests_offheap
         - j11_build
-    - start_j11_cqlsh_tests:
-        type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py3_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py38:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py311:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - start_j11_cqlsh-dtests-offheap:
-        type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py3_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py38_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py311_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -11470,6 +10052,46 @@
         requires:
         - start_j11_dtests_large_vnode
         - j11_build
+    - start_j11_cqlsh_tests:
+        type: approval
+    - j11_cqlsh_dtests_py3:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py3_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py38:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py311:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - start_j11_cqlsh-dtests-offheap:
+        type: approval
+    - j11_cqlsh_dtests_py3_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
+    - j11_cqlsh_dtests_py38_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
+    - j11_cqlsh_dtests_py311_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
     - start_j11_utests_long:
         type: approval
     - j11_utests_long:
@@ -11519,15 +10141,15 @@
     - j11_jvm_dtests:
         requires:
         - j11_build
-    - j11_cqlshlib_tests:
-        requires:
-        - j11_build
-    - j11_jvm_dtests:
+    - j11_jvm_dtests_vnode:
         requires:
         - j11_build
     - j11_cqlshlib_tests:
         requires:
         - j11_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - j11_build
     - j11_dtests:
         requires:
         - j11_build
@@ -11540,36 +10162,36 @@
         requires:
         - start_j11_dtests_offheap
         - j11_build
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - start_j11_dtests_large:
+        type: approval
+    - j11_dtests_large:
+        requires:
+        - start_j11_dtests_large
+        - j11_build
+    - j11_dtests_large_vnode:
+        requires:
+        - start_j11_dtests_large
+        - j11_build
+    - j11_cqlsh_dtests_py3:
         requires:
         - j11_build
     - j11_cqlsh_dtests_py3_vnode:
         requires:
         - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - j11_build
     - j11_cqlsh_dtests_py38:
         requires:
         - j11_build
     - j11_cqlsh_dtests_py311:
         requires:
         - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - j11_build
     - start_j11_cqlsh-dtests-offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh-dtests-offheap
@@ -11582,16 +10204,6 @@
         requires:
         - start_j11_cqlsh-dtests-offheap
         - j11_build
-    - start_j11_dtests_large:
-        type: approval
-    - j11_dtests_large:
-        requires:
-        - start_j11_dtests_large
-        - j11_build
-    - j11_dtests_large_vnode:
-        requires:
-        - start_j11_dtests_large
-        - j11_build
     - start_utests_long:
         type: approval
     - j11_utests_long:
diff --git a/.circleci/config.yml.PAID b/.circleci/config.yml.PAID
index be6f6f8..3118f37 100644
--- a/.circleci/config.yml.PAID
+++ b/.circleci/config.yml.PAID
@@ -83,7 +83,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -118,6 +118,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -131,6 +133,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -169,111 +172,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=fqltool-test
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant fqltool-test $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -310,6 +209,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -323,76 +224,32 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
-  j8_cqlsh-dtests-py2-with-vnodes:
+  j11_cqlshlib_cython_tests:
     docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
-    resource_class: large
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
     working_directory: ~/
     shell: /bin/bash -eo pipefail -l
-    parallelism: 50
+    parallelism: 1
     steps:
     - attach_workspace:
         at: /home/cassandra
     - run:
-        name: Clone Cassandra dtest Repository (via git)
+        name: Run cqlshlib Unit Tests
         command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
           export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_with_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_with_vnodes_raw /tmp/all_dtest_tests_j8_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_with_vnodes_raw > /tmp/all_dtest_tests_j8_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_with_vnodes > /tmp/split_dtest_tests_j8_with_vnodes.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j8_with_vnodes)
+          export cython="yes"
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
     - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_with_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_with_vnodes_logs
+        path: /tmp/cassandra/pylib
     environment:
     - ANT_HOME: /usr/share/ant
     - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -418,6 +275,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -431,9 +290,11 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
   j8_cqlsh_dtests_py311_vnode:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -487,7 +348,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -525,6 +386,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -538,6 +401,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -590,7 +454,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -678,6 +542,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -691,6 +557,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -728,7 +595,7 @@
     - run:
         name: Run dtests (j8_large_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -762,6 +629,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -775,6 +644,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -843,7 +713,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-system-keyspace-directory -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -878,6 +748,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -891,6 +763,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -949,6 +822,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -962,6 +837,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1000,111 +876,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=stress-test-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1141,6 +913,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1154,6 +928,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1211,7 +986,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1249,6 +1024,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1262,10 +1039,130 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_jvm_dtests_vnode:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: large
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 10
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine distributed Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/distributed/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Unit Tests (testclasslist)
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          test_timeout=$(grep 'name="test.distributed.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+          if [ -z "$test_timeout" ]; then
+            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+          fi
+          ant testclasslist -Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j8_utests_compression_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -1301,111 +1198,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-compression
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-compression $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1442,6 +1235,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1455,6 +1250,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1523,7 +1319,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -1558,6 +1354,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1571,6 +1369,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1628,7 +1427,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1666,6 +1465,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1679,6 +1480,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -1735,7 +1537,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -1773,6 +1575,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1786,6 +1590,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -1825,111 +1630,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-compression
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-compression $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-compression\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-compression $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -1966,6 +1667,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -1979,6 +1682,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2059,7 +1763,8 @@
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
                     $target == "long-test" || \
-                    $target == "stress-test" ]]; then
+                    $target == "stress-test" || \
+                    $target == "test-simulator-dtest" ]]; then
                 name="-Dtest.name=$class_name"
               else
                 name="-Dtest.name=$class_path"
@@ -2072,6 +1777,12 @@
                 methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
               fi
 
+              # Prepare the JVM dtests vnodes argument, which is optional
+              vnodes_args=""
+              if ${REPEATED_ANT_TEST_VNODES}; then
+                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+              fi
+
               # Run the test target as many times as requested collecting the exit code,
               # stopping the iteration only if stop_on_failure is set.
               exit_code="$?"
@@ -2081,7 +1792,7 @@
 
                 # run the test
                 status="passes"
-                if !( set -o pipefail && ant $target $name $methods -Dno-build-test=true | tee stdout.txt ); then
+                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                   status="fails"
                   exit_code=1
                 fi
@@ -2152,6 +1863,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2165,6 +1878,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2202,7 +1916,7 @@
     - run:
         name: Run dtests (j11_large_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -2236,6 +1950,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2249,6 +1965,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2280,7 +1997,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -2368,6 +2085,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2381,6 +2100,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2438,7 +2158,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2476,6 +2196,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2489,6 +2211,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -2545,7 +2268,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2583,6 +2306,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2596,6 +2321,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2633,7 +2359,7 @@
     - run:
         name: Run dtests (j11_large_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -2667,6 +2393,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2680,6 +2408,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2719,111 +2448,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-system-keyspace-directory
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-system-keyspace-directory $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -2860,6 +2485,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2873,6 +2500,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -2930,7 +2558,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -2968,6 +2596,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -2981,6 +2611,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3037,7 +2668,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -3075,6 +2706,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3088,10 +2721,76 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_cqlshlib_cython_tests:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Run cqlshlib Unit Tests
+        command: |
+          export PATH=$JAVA_HOME/bin:$PATH
+          export cython="yes"
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/pylib
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j11_utests_cdc:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -3157,7 +2856,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-cdc   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3192,6 +2891,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3205,6 +2906,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3263,6 +2965,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3276,6 +2980,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3345,7 +3050,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-system-keyspace-directory -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-system-keyspace-directory   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3380,6 +3085,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3393,6 +3100,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3423,7 +3131,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -3511,6 +3219,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3524,113 +3234,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j8_cqlsh-dtests-py2-offheap:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
-    resource_class: large
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 50
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_dtests_offheap)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_dtests_offheap_raw /tmp/all_dtest_tests_j8_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_dtests_offheap_raw > /tmp/all_dtest_tests_j8_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_dtests_offheap > /tmp/split_dtest_tests_j8_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n"
-    - run:
-        name: Run dtests (j8_dtests_offheap)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt"
-          cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_dtests_offheap
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_dtests_offheap_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3661,7 +3265,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -3749,6 +3353,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3762,6 +3368,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -3793,7 +3400,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -3881,6 +3488,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -3894,6 +3503,242 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+  j11_jvm_dtests_vnode:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: large
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 10
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine distributed Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/distributed/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/distributed/;;g" | grep "Test\.java$" | grep -v upgrade > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Unit Tests (testclasslist)
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          test_timeout=$(grep 'name="test.distributed.timeout"' build.xml | awk -F'"' '{print $4}' || true)
+          if [ -z "$test_timeout" ]; then
+            test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
+          fi
+          ant testclasslist -Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16' -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
+        no_output_timeout: 15m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j8_simulator_dtests:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 1
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Determine unit Tests to Run
+        command: |
+          # reminder: this code (along with all the steps) is independently executed on every circle container
+          # so the goal here is to get the circleci script to return the tests *this* container will run
+          # which we do via the `circleci` cli tool.
+
+          rm -fr ~/cassandra-dtest/upgrade_tests
+          echo "***java tests***"
+
+          # get all of our unit test filenames
+          set -eo pipefail && circleci tests glob "$HOME/cassandra/test/unit/**/*.java" > /tmp/all_java_unit_tests.txt
+
+          # split up the unit tests into groups based on the number of containers we have
+          set -eo pipefail && circleci tests split --split-by=timings --timings-type=filename --index=${CIRCLE_NODE_INDEX} --total=${CIRCLE_NODE_TOTAL} /tmp/all_java_unit_tests.txt > /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt
+          set -eo pipefail && cat /tmp/java_tests_${CIRCLE_NODE_INDEX}.txt | sed "s;^/home/cassandra/cassandra/test/unit/;;g" | grep "Test\.java$"  > /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+          echo "** /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt"
+          cat /tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt
+        no_output_timeout: 15m
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Run Simulator Tests
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant test-simulator-dtest -Dno-build-test=true
+        no_output_timeout: 30m
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -3962,7 +3807,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-compression -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -3997,6 +3842,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4010,6 +3857,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4067,6 +3915,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4080,6 +3930,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -4119,111 +3970,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -4260,6 +4007,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4273,6 +4022,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4309,7 +4059,7 @@
     - run:
         name: Run dtests (j8_large_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_large_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --only-resource-intensive-tests --force-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_large_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -4343,6 +4093,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4356,113 +4108,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j8_cqlsh-dtests-py2-no-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
-    resource_class: large
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 50
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j8_without_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j8_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j8_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j8_without_vnodes_raw /tmp/all_dtest_tests_j8_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j8_without_vnodes_raw > /tmp/all_dtest_tests_j8_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j8_without_vnodes > /tmp/split_dtest_tests_j8_without_vnodes.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j8_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j8_without_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j8_without_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j8_without_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4520,6 +4166,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4533,6 +4181,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -4590,7 +4239,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -4628,6 +4277,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4641,6 +4292,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -4671,7 +4323,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_UPGRADE_DTESTS}" == "<nil>" ]; then
@@ -4759,6 +4411,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -4772,117 +4426,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-with-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: large
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 50
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_with_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_with_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_with_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_with_vnodes_raw /tmp/all_dtest_tests_j11_with_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_with_vnodes_raw > /tmp/all_dtest_tests_j11_with_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_with_vnodes > /tmp/split_dtest_tests_j11_with_vnodes.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_with_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j11_with_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_with_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_with_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j11_utests_cdc_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -4918,111 +4465,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-cdc
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5059,6 +4502,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5072,6 +4517,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5125,7 +4571,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -5213,6 +4659,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5226,6 +4674,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5265,111 +4714,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=fqltool-test
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant fqltool-test $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_FQLTOOL_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_FQLTOOL_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_FQLTOOL} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=fqltool-test\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant fqltool-test $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -5406,6 +4751,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5419,6 +4766,98 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+  j8_jvm_dtests_vnode_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 25
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -5487,7 +4926,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-compression -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-compression   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -5522,6 +4961,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5535,6 +4976,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5592,7 +5034,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5630,6 +5072,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5643,6 +5087,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -5699,7 +5144,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5737,6 +5182,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5750,10 +5197,102 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - CASSANDRA_USE_JDK11: true
+  j8_simulator_dtests_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 25
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_SIMULATOR_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_SIMULATOR_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_SIMULATOR_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-simulator-dtest\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-simulator-dtest $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j11_cqlsh_dtests_py311_offheap:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -5807,7 +5346,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -5845,6 +5384,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -5858,6 +5399,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -5897,111 +5439,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-system-keyspace-directory
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-system-keyspace-directory $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-system-keyspace-directory\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-system-keyspace-directory $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6038,6 +5476,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6051,6 +5491,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6081,7 +5522,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -6169,6 +5610,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6182,6 +5625,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6239,7 +5683,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -6277,6 +5721,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6290,6 +5736,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6328,111 +5775,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=stress-test-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant stress-test-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_STRESS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_STRESS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_STRESS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=stress-test-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant stress-test-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -6469,6 +5812,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6482,6 +5827,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6512,7 +5858,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -6600,6 +5946,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6613,6 +5961,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6669,7 +6018,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -6707,6 +6056,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6720,6 +6071,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6757,7 +6109,7 @@
     - run:
         name: Run dtests (j8_upgradetests_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_upgradetests_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_upgradetests_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_upgradetests_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -6791,6 +6143,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6804,6 +6158,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -6862,7 +6217,7 @@
     - run:
         name: Run dtests (j11_dtests_offheap)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -6896,6 +6251,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -6909,6 +6266,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -6948,111 +6306,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_UPGRADE_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_UPGRADE_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_UPGRADE_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7089,6 +6343,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7102,6 +6358,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7158,7 +6415,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -7196,6 +6453,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7209,6 +6468,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7248,111 +6508,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7389,6 +6545,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7402,6 +6560,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7459,7 +6618,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -7497,6 +6656,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7510,6 +6671,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -7549,111 +6711,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=long-testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant long-testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -7690,6 +6748,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7703,6 +6763,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7739,7 +6800,7 @@
     - run:
         name: Run dtests (j8_dtests_offheap)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\"\ncat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -7773,6 +6834,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7786,6 +6849,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -7854,7 +6918,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -7889,6 +6953,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -7902,13 +6968,14 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
   j11_jvm_dtests:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: medium
+    resource_class: large
     working_directory: ~/
     shell: /bin/bash -eo pipefail -l
     parallelism: 10
@@ -7970,7 +7037,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -8005,6 +7072,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8018,6 +7087,99 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
+    - REPEATED_ANT_TEST_COUNT: 500
+    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - CASSANDRA_USE_JDK11: true
+  j11_jvm_dtests_vnode_repeat:
+    docker:
+    - image: apache/cassandra-testing-ubuntu2004-java11:latest
+    resource_class: medium
+    working_directory: ~/
+    shell: /bin/bash -eo pipefail -l
+    parallelism: 25
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - run:
+        name: Log Environment Information
+        command: |
+          echo '*** id ***'
+          id
+          echo '*** cat /proc/cpuinfo ***'
+          cat /proc/cpuinfo
+          echo '*** free -m ***'
+          free -m
+          echo '*** df -m ***'
+          df -m
+          echo '*** ifconfig -a ***'
+          ifconfig -a
+          echo '*** uname -a ***'
+          uname -a
+          echo '*** mount ***'
+          mount
+          echo '*** env ***'
+          env
+          echo '*** java ***'
+          which java
+          java -version
+    - run:
+        name: Repeatedly run new or modifed JUnit tests
+        no_output_timeout: 15m
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=true\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
+    - store_test_results:
+        path: /tmp/results/repeated_utests/output
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/stdout
+        destination: stdout
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/results/repeated_utests/logs
+        destination: logs
+    environment:
+    - ANT_HOME: /usr/share/ant
+    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
+    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
+    - LANG: en_US.UTF-8
+    - KEEP_TEST_DIR: true
+    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
+    - PYTHONIOENCODING: utf-8
+    - PYTHONUNBUFFERED: true
+    - CASS_DRIVER_NO_EXTENSIONS: true
+    - CASS_DRIVER_NO_CYTHON: true
+    - CASSANDRA_SKIP_SYNC: true
+    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
+    - DTEST_BRANCH: trunk
+    - CCM_MAX_HEAP_SIZE: 1024M
+    - CCM_HEAP_NEWSIZE: 256M
+    - REPEATED_TESTS_STOP_ON_FAILURE: false
+    - REPEATED_UTESTS: null
+    - REPEATED_UTESTS_COUNT: 500
+    - REPEATED_UTESTS_FQLTOOL: null
+    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
+    - REPEATED_UTESTS_LONG: null
+    - REPEATED_UTESTS_LONG_COUNT: 100
+    - REPEATED_UTESTS_STRESS: null
+    - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
+    - REPEATED_JVM_DTESTS: null
+    - REPEATED_JVM_DTESTS_COUNT: 500
+    - REPEATED_JVM_UPGRADE_DTESTS: null
+    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
+    - REPEATED_DTESTS: null
+    - REPEATED_DTESTS_COUNT: 500
+    - REPEATED_LARGE_DTESTS: null
+    - REPEATED_LARGE_DTESTS_COUNT: 100
+    - REPEATED_UPGRADE_DTESTS: null
+    - REPEATED_UPGRADE_DTESTS_COUNT: 25
+    - REPEATED_ANT_TEST_TARGET: testsome
+    - REPEATED_ANT_TEST_CLASS: null
+    - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8111,6 +7273,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8124,6 +7288,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8161,7 +7326,7 @@
     - run:
         name: Run dtests (j8_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8195,6 +7360,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8208,117 +7375,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-no-vnodes:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: large
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 50
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_without_vnodes)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_without_vnodes)***\"\nset -eo pipefail && ./run_dtests.py --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_without_vnodes_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_without_vnodes_raw /tmp/all_dtest_tests_j11_without_vnodes\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_without_vnodes_raw > /tmp/all_dtest_tests_j11_without_vnodes || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_without_vnodes > /tmp/split_dtest_tests_j11_without_vnodes.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_without_vnodes_final.txt\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n"
-    - run:
-        name: Run dtests (j11_without_vnodes)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt"
-          cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_without_vnodes
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_without_vnodes_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j8_dtests_vnode:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11-w-dependencies:latest
@@ -8352,7 +7412,7 @@
     - run:
         name: Run dtests (j8_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j8_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8386,6 +7446,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8399,6 +7461,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -8417,8 +7480,8 @@
         command: |
           export PATH=$JAVA_HOME/bin:$PATH
           time mv ~/cassandra /tmp
-          cd /tmp/cassandra/pylib
-          ./cassandra-cqlsh-tests.sh ..
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/pylib
@@ -8447,6 +7510,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8460,6 +7525,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8499,111 +7565,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_JVM_DTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-jvm-dtest-some
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-jvm-dtest-some $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_JVM_DTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_JVM_DTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_JVM_DTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-jvm-dtest-some\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-jvm-dtest-some $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -8640,6 +7602,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8653,6 +7617,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -8711,7 +7676,7 @@
     - run:
         name: Run dtests (j11_without_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_without_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_without_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_without_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -8745,6 +7710,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8758,6 +7725,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -8838,7 +7806,8 @@
                     $target == "test-system-keyspace-directory" || \
                     $target == "fqltool-test" || \
                     $target == "long-test" || \
-                    $target == "stress-test" ]]; then
+                    $target == "stress-test" || \
+                    $target == "test-simulator-dtest" ]]; then
                 name="-Dtest.name=$class_name"
               else
                 name="-Dtest.name=$class_path"
@@ -8851,6 +7820,12 @@
                 methods="-Dtest.methods=${REPEATED_ANT_TEST_METHODS}"
               fi
 
+              # Prepare the JVM dtests vnodes argument, which is optional
+              vnodes_args=""
+              if ${REPEATED_ANT_TEST_VNODES}; then
+                vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+              fi
+
               # Run the test target as many times as requested collecting the exit code,
               # stopping the iteration only if stop_on_failure is set.
               exit_code="$?"
@@ -8860,7 +7835,7 @@
 
                 # run the test
                 status="passes"
-                if !( set -o pipefail && ant $target $name $methods -Dno-build-test=true | tee stdout.txt ); then
+                if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                   status="fails"
                   exit_code=1
                 fi
@@ -8931,6 +7906,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -8944,6 +7921,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9001,6 +7979,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9014,6 +7994,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9082,7 +8063,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist-cdc -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=unit -Dno-build-test=true
+          ant testclasslist-cdc   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=unit -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -9117,6 +8098,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9130,6 +8113,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9186,7 +8170,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_dtests_offheap_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -9224,6 +8208,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9237,6 +8223,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9267,7 +8254,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_DTESTS}" == "<nil>" ]; then
@@ -9355,6 +8342,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9368,6 +8357,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9436,7 +8426,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant testclasslist -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=distributed -Dno-build-test=true
+          ant testclasslist   -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=distributed -Dno-build-test=true
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -9471,6 +8461,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9484,6 +8476,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9576,6 +8569,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9589,6 +8584,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -9645,7 +8641,7 @@
           # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
           export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j8_with_vnodes_final.txt`
           if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_j8_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
           else
             echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
             (exit 1)
@@ -9683,6 +8679,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9696,117 +8694,10 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-  j11_cqlsh-dtests-py2-offheap:
-    docker:
-    - image: apache/cassandra-testing-ubuntu2004-java11:latest
-    resource_class: large
-    working_directory: ~/
-    shell: /bin/bash -eo pipefail -l
-    parallelism: 50
-    steps:
-    - attach_workspace:
-        at: /home/cassandra
-    - run:
-        name: Clone Cassandra dtest Repository (via git)
-        command: |
-          git clone --single-branch --branch $DTEST_BRANCH --depth 1 $DTEST_REPO ~/cassandra-dtest
-    - run:
-        name: Configure virtualenv and python Dependencies
-        command: |
-          # note, this should be super quick as all dependencies should be pre-installed in the docker image
-          # if additional dependencies were added to requirmeents.txt and the docker image hasn't been updated
-          # we'd have to install it here at runtime -- which will make things slow, so do yourself a favor and
-          # rebuild the docker image! (it automatically pulls the latest requirements.txt on build)
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          pip3 install --exists-action w --upgrade -r ~/cassandra-dtest/requirements.txt
-          pip3 uninstall -y cqlsh
-          pip3 freeze
-    - run:
-        name: Determine Tests to Run (j11_dtests_offheap)
-        no_output_timeout: 5m
-        command: "# reminder: this code (along with all the steps) is independently executed on every circle container\n# so the goal here is to get the circleci script to return the tests *this* container will run\n# which we do via the `circleci` cli tool.\n\ncd cassandra-dtest\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\n\nif [ -n '' ]; then\n  export \nfi\n\necho \"***Collected DTests (j11_dtests_offheap)***\"\nset -eo pipefail && ./run_dtests.py --use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql' --dtest-print-tests-only --dtest-print-tests-output=/tmp/all_dtest_tests_j11_dtests_offheap_raw --cassandra-dir=../cassandra\nif [ -z '' ]; then\n  mv /tmp/all_dtest_tests_j11_dtests_offheap_raw /tmp/all_dtest_tests_j11_dtests_offheap\nelse\n  grep -e '' /tmp/all_dtest_tests_j11_dtests_offheap_raw > /tmp/all_dtest_tests_j11_dtests_offheap || { echo \"Filter did not match any tests! Exiting build.\"; exit 0; }\nfi\nset -eo pipefail && circleci tests split --split-by=timings --timings-type=classname /tmp/all_dtest_tests_j11_dtests_offheap > /tmp/split_dtest_tests_j11_dtests_offheap.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap.txt | tr '\\n' ' ' > /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\ncat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt\n"
-    - run:
-        name: Run dtests (j11_dtests_offheap)
-        no_output_timeout: 15m
-        command: |
-          echo "cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt"
-          cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt
-
-          source ~/env3.6/bin/activate
-          export PATH=$JAVA_HOME/bin:$PATH
-          if [ -n 'CQLSH_PYTHON=/usr/bin/python2.7' ]; then
-            export CQLSH_PYTHON=/usr/bin/python2.7
-          fi
-
-          java -version
-          cd ~/cassandra-dtest
-          mkdir -p /tmp/dtest
-
-          echo "env: $(env)"
-          echo "** done env"
-          mkdir -p /tmp/results/dtests
-          # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
-          export SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_dtests_offheap_final.txt`
-          if [ ! -z "$SPLIT_TESTS" ]; then
-            set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_dtests_offheap.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
-          else
-            echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
-            (exit 1)
-          fi
-    - store_test_results:
-        path: /tmp/results
-    - store_artifacts:
-        path: /tmp/dtest
-        destination: dtest_j11_dtests_offheap
-    - store_artifacts:
-        path: ~/cassandra-dtest/logs
-        destination: dtest_j11_dtests_offheap_logs
-    environment:
-    - ANT_HOME: /usr/share/ant
-    - JAVA11_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JAVA8_HOME: /usr/lib/jvm/java-8-openjdk-amd64
-    - LANG: en_US.UTF-8
-    - KEEP_TEST_DIR: true
-    - DEFAULT_DIR: /home/cassandra/cassandra-dtest
-    - PYTHONIOENCODING: utf-8
-    - PYTHONUNBUFFERED: true
-    - CASS_DRIVER_NO_EXTENSIONS: true
-    - CASS_DRIVER_NO_CYTHON: true
-    - CASSANDRA_SKIP_SYNC: true
-    - DTEST_REPO: https://github.com/apache/cassandra-dtest.git
-    - DTEST_BRANCH: trunk
-    - CCM_MAX_HEAP_SIZE: 1024M
-    - CCM_HEAP_NEWSIZE: 256M
-    - REPEATED_TESTS_STOP_ON_FAILURE: false
-    - REPEATED_UTESTS: null
-    - REPEATED_UTESTS_COUNT: 500
-    - REPEATED_UTESTS_FQLTOOL: null
-    - REPEATED_UTESTS_FQLTOOL_COUNT: 500
-    - REPEATED_UTESTS_LONG: null
-    - REPEATED_UTESTS_LONG_COUNT: 100
-    - REPEATED_UTESTS_STRESS: null
-    - REPEATED_UTESTS_STRESS_COUNT: 500
-    - REPEATED_JVM_DTESTS: null
-    - REPEATED_JVM_DTESTS_COUNT: 500
-    - REPEATED_JVM_UPGRADE_DTESTS: null
-    - REPEATED_JVM_UPGRADE_DTESTS_COUNT: 500
-    - REPEATED_DTESTS: null
-    - REPEATED_DTESTS_COUNT: 500
-    - REPEATED_LARGE_DTESTS: null
-    - REPEATED_LARGE_DTESTS_COUNT: 100
-    - REPEATED_UPGRADE_DTESTS: null
-    - REPEATED_UPGRADE_DTESTS_COUNT: 25
-    - REPEATED_ANT_TEST_TARGET: testsome
-    - REPEATED_ANT_TEST_CLASS: null
-    - REPEATED_ANT_TEST_METHODS: null
-    - REPEATED_ANT_TEST_COUNT: 500
-    - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
-    - CASSANDRA_USE_JDK11: true
   j11_unit_tests_repeat:
     docker:
     - image: apache/cassandra-testing-ubuntu2004-java11:latest
@@ -9842,111 +8733,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -9983,6 +8770,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -9996,6 +8785,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10054,6 +8844,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10067,6 +8859,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10085,8 +8878,8 @@
         command: |
           export PATH=$JAVA_HOME/bin:$PATH
           time mv ~/cassandra /tmp
-          cd /tmp/cassandra/pylib
-          ./cassandra-cqlsh-tests.sh ..
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: 15m
     - store_test_results:
         path: /tmp/cassandra/pylib
@@ -10115,6 +8908,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10128,6 +8923,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10186,7 +8982,7 @@
     - run:
         name: Run dtests (j11_with_vnodes)
         no_output_timeout: 15m
-        command: "echo \"cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
+        command: "echo \"cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\"\ncat /tmp/split_dtest_tests_j11_with_vnodes_final.txt\n\nsource ~/env3.6/bin/activate\nexport PATH=$JAVA_HOME/bin:$PATH\nif [ -n '' ]; then\n  export \nfi\n\njava -version\ncd ~/cassandra-dtest\nmkdir -p /tmp/dtest\n\necho \"env: $(env)\"\necho \"** done env\"\nmkdir -p /tmp/results/dtests\n# we need the \"set -o pipefail\" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee\nexport SPLIT_TESTS=`cat /tmp/split_dtest_tests_j11_with_vnodes_final.txt`\nif [ ! -z \"$SPLIT_TESTS\" ]; then\n  set -o pipefail && cd ~/cassandra-dtest && pytest --use-vnodes --num-tokens=16 --skip-resource-intensive-tests --log-level=\"DEBUG\" --junit-xml=/tmp/results/dtests/pytest_result_j11_with_vnodes.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt\nelse\n  echo \"Tune your parallelism, there are more containers than test classes. Nothing to do in this container\"\n  (exit 1)\nfi\n"
     - store_test_results:
         path: /tmp/results
     - store_artifacts:
@@ -10220,6 +9016,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10233,6 +9031,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10272,111 +9071,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=test-cdc
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant test-cdc $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=test-cdc\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant test-cdc $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -10413,6 +9108,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10426,6 +9123,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10456,7 +9154,7 @@
           pip3 uninstall -y cqlsh
           pip3 freeze
     - run:
-        name: Run repeated Python dtest
+        name: Run repeated Python DTests
         no_output_timeout: 15m
         command: |
           if [ "${REPEATED_LARGE_DTESTS}" == "<nil>" ]; then
@@ -10544,6 +9242,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10557,6 +9257,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10595,111 +9296,7 @@
     - run:
         name: Repeatedly run new or modifed JUnit tests
         no_output_timeout: 15m
-        command: |
-          set -x
-          export PATH=$JAVA_HOME/bin:$PATH
-          time mv ~/cassandra /tmp
-          cd /tmp/cassandra
-          if [ -d ~/dtest_jars ]; then
-            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
-          fi
-
-          # Calculate the number of test iterations to be run by the current parallel runner.
-          count=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))
-          if (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then
-            count=$((count+1))
-          fi
-
-          # Put manually specified tests and automatically detected tests together, removing duplicates
-          tests=$(echo ${REPEATED_UTESTS_LONG} | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
-          echo "Tests to be repeated: ${tests}"
-
-          # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
-          target=long-testsome
-          testtag=""
-          if [[ $target == "test-cdc" ]]; then
-            testtag="cdc"
-          elif [[ $target == "test-compression" ]]; then
-            testtag="compression"
-          elif [[ $target == "test-system-keyspace-directory" ]]; then
-            testtag="system_keyspace_directory"
-          fi
-
-          # Run each test class as many times as requested.
-          exit_code="$?"
-          for test in $tests; do
-
-              # Split class and method names from the test name
-              if [[ $test =~ "#" ]]; then
-                class=${test%"#"*}
-                method=${test#*"#"}
-              else
-                class=$test
-                method=""
-              fi
-
-              # Prepare the -Dtest.name argument.
-              # It can be the fully qualified class name or the short class name, depending on the target.
-              if [[ $target == "test" || \
-                    $target == "test-cdc" || \
-                    $target == "test-compression" || \
-                    $target == "test-system-keyspace-directory" || \
-                    $target == "fqltool-test" || \
-                    $target == "long-test" || \
-                    $target == "stress-test" ]]; then
-                name_arg="-Dtest.name=${class##*.}"
-              else
-                name_arg="-Dtest.name=$class"
-              fi
-
-              # Prepare the -Dtest.methods argument, which is optional
-              if [[ $method == "" ]]; then
-                methods_arg=""
-              else
-                methods_arg="-Dtest.methods=$method"
-              fi
-
-              for i in $(seq -w 1 $count); do
-                echo "Running test $test, iteration $i of $count"
-
-                # run the test
-                status="passes"
-                if !( set -o pipefail && \
-                      ant long-testsome $name_arg $methods_arg -Dno-build-test=true | \
-                      tee stdout.txt \
-                    ); then
-                  status="fails"
-                  exit_code=1
-                fi
-
-                # move the stdout output file
-                dest=/tmp/results/repeated_utests/stdout/${status}/${i}
-                mkdir -p $dest
-                mv stdout.txt $dest/${test}.txt
-
-                # move the XML output files
-                source=build/test/output/${testtag}
-                dest=/tmp/results/repeated_utests/output/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # move the log files
-                source=build/test/logs/${testtag}
-                dest=/tmp/results/repeated_utests/logs/${status}/${i}
-                mkdir -p $dest
-                if [[ -d $source && -n "$(ls $source)" ]]; then
-                  mv $source/* $dest/
-                fi
-
-                # maybe stop iterations on test failure
-                if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then
-                  break
-                fi
-              done
-          done
-          (exit ${exit_code})
+        command: "set -x\nexport PATH=$JAVA_HOME/bin:$PATH\ntime mv ~/cassandra /tmp\ncd /tmp/cassandra\nif [ -d ~/dtest_jars ]; then\n  cp ~/dtest_jars/dtest* /tmp/cassandra/build/\nfi\n\n# Calculate the number of test iterations to be run by the current parallel runner.\ncount=$((${REPEATED_UTESTS_LONG_COUNT} / CIRCLE_NODE_TOTAL))\nif (($CIRCLE_NODE_INDEX < (${REPEATED_UTESTS_LONG_COUNT} % CIRCLE_NODE_TOTAL))); then\n  count=$((count+1))\nfi\n\n# Put manually specified tests and automatically detected tests together, removing duplicates\ntests=$(echo ${REPEATED_UTESTS_LONG} | sed -e \"s/<nil>//\" | sed -e \"s/ //\" | tr \",\" \"\\n\" | tr \" \" \"\\n\" | sort -n | uniq -u)\necho \"Tests to be repeated: ${tests}\"\n\n# Prepare the JVM dtests vnodes argument, which is optional.\nvnodes=false\nvnodes_args=\"\"\nif [ \"$vnodes\" = true ] ; then\n  vnodes_args=\"-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'\"\nfi\n\n# Prepare the testtag for the target, used by the test macro in build.xml to group the output files\ntarget=long-testsome\ntesttag=\"\"\nif [[ $target == \"test-cdc\" ]]; then\n  testtag=\"cdc\"\nelif [[ $target == \"test-compression\" ]]; then\n  testtag=\"compression\"\nelif [[ $target == \"test-system-keyspace-directory\" ]]; then\n  testtag=\"system_keyspace_directory\"\nfi\n\n# Run each test class as many times as requested.\nexit_code=\"$?\"\nfor test in $tests; do\n\n    # Split class and method names from the test name\n    if [[ $test =~ \"#\" ]]; then\n      class=${test%\"#\"*}\n      method=${test#*\"#\"}\n    else\n      class=$test\n      method=\"\"\n    fi\n\n    # Prepare the -Dtest.name argument.\n    # It can be the fully qualified class name or the short class name, depending on the target.\n    if [[ $target == \"test\" || \\\n          $target == \"test-cdc\" || \\\n          $target == \"test-compression\" || \\\n          $target == \"test-system-keyspace-directory\" || \\\n          $target == \"fqltool-test\" || \\\n          $target == \"long-test\" || \\\n          $target == \"stress-test\" || \\\n          $target == \"test-simulator-dtest\" ]]; then\n      name_arg=\"-Dtest.name=${class##*.}\"\n    else\n      name_arg=\"-Dtest.name=$class\"\n    fi\n\n    # Prepare the -Dtest.methods argument, which is optional\n    if [[ $method == \"\" ]]; then\n      methods_arg=\"\"\n    else\n      methods_arg=\"-Dtest.methods=$method\"\n    fi\n\n    for i in $(seq -w 1 $count); do\n      echo \"Running test $test, iteration $i of $count\"\n\n      # run the test\n      status=\"passes\"\n      if !( set -o pipefail && \\\n            ant long-testsome $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \\\n            tee stdout.txt \\\n          ); then\n        status=\"fails\"\n        exit_code=1\n      fi\n\n      # move the stdout output file\n      dest=/tmp/results/repeated_utests/stdout/${status}/${i}\n      mkdir -p $dest\n      mv stdout.txt $dest/${test}.txt\n\n      # move the XML output files\n      source=build/test/output/${testtag}\n      dest=/tmp/results/repeated_utests/output/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n\n      # move the log files\n      source=build/test/logs/${testtag}\n      dest=/tmp/results/repeated_utests/logs/${status}/${i}\n      mkdir -p $dest\n      if [[ -d $source && -n \"$(ls $source)\" ]]; then\n        mv $source/* $dest/\n      fi\n      \n      # maybe stop iterations on test failure\n      if [[ ${REPEATED_TESTS_STOP_ON_FAILURE} = true ]] && (( $exit_code > 0 )); then\n        break\n      fi\n    done\ndone\n(exit ${exit_code})\n"
     - store_test_results:
         path: /tmp/results/repeated_utests/output
     - store_artifacts:
@@ -10736,6 +9333,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10749,6 +9348,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-11-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-11-openjdk-amd64
@@ -10770,7 +9370,7 @@
           cd ~/cassandra
           mkdir ~/dtest_jars
           git remote add apache https://github.com/apache/cassandra.git
-          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 trunk; do
+          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 cassandra-4.1 trunk; do
             # check out the correct cassandra version:
             git remote set-branches --add apache '$branch'
             git fetch --depth 1 apache $branch
@@ -10839,6 +9439,8 @@
     - REPEATED_UTESTS_LONG_COUNT: 100
     - REPEATED_UTESTS_STRESS: null
     - REPEATED_UTESTS_STRESS_COUNT: 500
+    - REPEATED_SIMULATOR_DTESTS: null
+    - REPEATED_SIMULATOR_DTESTS_COUNT: 500
     - REPEATED_JVM_DTESTS: null
     - REPEATED_JVM_DTESTS_COUNT: 500
     - REPEATED_JVM_UPGRADE_DTESTS: null
@@ -10852,6 +9454,7 @@
     - REPEATED_ANT_TEST_TARGET: testsome
     - REPEATED_ANT_TEST_CLASS: null
     - REPEATED_ANT_TEST_METHODS: null
+    - REPEATED_ANT_TEST_VNODES: false
     - REPEATED_ANT_TEST_COUNT: 500
     - JAVA_HOME: /usr/lib/jvm/java-8-openjdk-amd64
     - JDK_HOME: /usr/lib/jvm/java-8-openjdk-amd64
@@ -10876,12 +9479,54 @@
         requires:
         - start_j8_jvm_dtests
         - j8_build
+    - start_j8_jvm_dtests_vnode:
+        type: approval
+    - j8_jvm_dtests_vnode:
+        requires:
+        - start_j8_jvm_dtests_vnode
+        - j8_build
+    - start_j11_jvm_dtests:
+        type: approval
+    - j11_jvm_dtests:
+        requires:
+        - start_j11_jvm_dtests
+        - j8_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+        - start_j11_jvm_dtests_vnode
+        - j8_build
+    - start_j8_simulator_dtests:
+        type: approval
+    - j8_simulator_dtests:
+        requires:
+        - start_j8_simulator_dtests
+        - j8_build
     - start_j8_cqlshlib_tests:
         type: approval
     - j8_cqlshlib_tests:
         requires:
         - start_j8_cqlshlib_tests
         - j8_build
+    - start_j8_cqlshlib_cython_tests:
+        type: approval
+    - j8_cqlshlib_cython_tests:
+        requires:
+        - start_j8_cqlshlib_cython_tests
+        - j8_build
+    - start_j11_cqlshlib_tests:
+        type: approval
+    - j11_cqlshlib_tests:
+        requires:
+        - start_j11_cqlshlib_tests
+        - j8_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - start_j11_cqlshlib_cython_tests
+        - j8_build
     - start_j11_unit_tests:
         type: approval
     - j11_unit_tests:
@@ -10990,18 +9635,6 @@
         requires:
         - start_j8_dtests_offheap
         - j8_build
-    - start_j8_dtests_large:
-        type: approval
-    - j8_dtests_large:
-        requires:
-        - start_j8_dtests_large
-        - j8_build
-    - start_j8_dtests_large_vnode:
-        type: approval
-    - j8_dtests_large_vnode:
-        requires:
-        - start_j8_dtests_large_vnode
-        - j8_build
     - start_j11_dtests:
         type: approval
     - j11_dtests:
@@ -11020,6 +9653,18 @@
         requires:
         - start_j11_dtests_offheap
         - j8_build
+    - start_j8_dtests_large:
+        type: approval
+    - j8_dtests_large:
+        requires:
+        - start_j8_dtests_large
+        - j8_build
+    - start_j8_dtests_large_vnode:
+        type: approval
+    - j8_dtests_large_vnode:
+        requires:
+        - start_j8_dtests_large_vnode
+        - j8_build
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -11032,15 +9677,15 @@
         requires:
         - start_j11_dtests_large_vnode
         - j8_build
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
-        - start_upgrade_tests
+        - start_upgrade_dtests
         - j8_build
     - start_j8_cqlsh_tests:
         type: approval
-    - j8_cqlsh-dtests-py2-with-vnodes:
+    - j8_cqlsh_dtests_py3:
         requires:
         - start_j8_cqlsh_tests
         - j8_build
@@ -11048,22 +9693,6 @@
         requires:
         - start_j8_cqlsh_tests
         - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py3:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
         - start_j8_cqlsh_tests
@@ -11072,12 +9701,16 @@
         requires:
         - start_j8_cqlsh_tests
         - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
     - start_j8_cqlsh_tests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j8_cqlsh_tests_offheap
-        - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
         - start_j8_cqlsh_tests_offheap
@@ -11092,7 +9725,7 @@
         - j8_build
     - start_j11_cqlsh_tests:
         type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - j11_cqlsh_dtests_py3:
         requires:
         - start_j11_cqlsh_tests
         - j8_build
@@ -11100,22 +9733,6 @@
         requires:
         - start_j11_cqlsh_tests
         - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
         - start_j11_cqlsh_tests
@@ -11124,12 +9741,16 @@
         requires:
         - start_j11_cqlsh_tests
         - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j8_build
     - start_j11_cqlsh_tests_offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh_tests_offheap
-        - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh_tests_offheap
@@ -11152,12 +9773,33 @@
     - j8_unit_tests:
         requires:
         - j8_build
+    - j8_simulator_dtests:
+        requires:
+        - j8_build
     - j8_jvm_dtests:
         requires:
         - j8_build
+    - j8_jvm_dtests_vnode:
+        requires:
+        - j8_build
+    - j11_jvm_dtests:
+        requires:
+        - j8_build
+    - j11_jvm_dtests_vnode:
+        requires:
+        - j8_build
     - j8_cqlshlib_tests:
         requires:
         - j8_build
+    - j8_cqlshlib_cython_tests:
+        requires:
+        - j8_build
+    - j11_cqlshlib_tests:
+        requires:
+        - j8_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - j8_build
     - j11_unit_tests:
         requires:
         - j8_build
@@ -11273,42 +9915,32 @@
         requires:
         - start_j11_dtests_large
         - j8_build
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
         - j8_build
-        - start_upgrade_tests
-    - j8_cqlsh-dtests-py2-with-vnodes:
+        - start_upgrade_dtests
+    - j8_cqlsh_dtests_py3:
         requires:
         - j8_build
     - j8_cqlsh_dtests_py3_vnode:
         requires:
         - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-        - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-        - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j8_build
-    - j8_cqlsh_dtests_py3:
-        requires:
-        - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
         - j8_build
     - j8_cqlsh_dtests_py311:
         requires:
         - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+        - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+        - j8_build
     - start_j8_cqlsh_dtests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j8_cqlsh_dtests_offheap
-        - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
         - start_j8_cqlsh_dtests_offheap
@@ -11321,36 +9953,26 @@
         requires:
         - start_j8_cqlsh_dtests_offheap
         - j8_build
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - j11_cqlsh_dtests_py3:
         requires:
         - j8_build
     - j11_cqlsh_dtests_py3_vnode:
         requires:
         - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j8_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
         - j8_build
     - j11_cqlsh_dtests_py311:
         requires:
         - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - j8_build
     - start_j11_cqlsh-dtests-offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh-dtests-offheap
@@ -11382,12 +10004,24 @@
         requires:
         - start_j11_jvm_dtests
         - j11_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+        - start_j11_jvm_dtests_vnode
+        - j11_build
     - start_j11_cqlshlib_tests:
         type: approval
     - j11_cqlshlib_tests:
         requires:
         - start_j11_cqlshlib_tests
         - j11_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - start_j11_cqlshlib_cython_tests
+        - j11_build
     - start_j11_dtests:
         type: approval
     - j11_dtests:
@@ -11406,58 +10040,6 @@
         requires:
         - start_j11_dtests_offheap
         - j11_build
-    - start_j11_cqlsh_tests:
-        type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py3_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py38:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - j11_cqlsh_dtests_py311:
-        requires:
-        - start_j11_cqlsh_tests
-        - j11_build
-    - start_j11_cqlsh-dtests-offheap:
-        type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py3_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py38_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
-    - j11_cqlsh_dtests_py311_offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -11470,6 +10052,46 @@
         requires:
         - start_j11_dtests_large_vnode
         - j11_build
+    - start_j11_cqlsh_tests:
+        type: approval
+    - j11_cqlsh_dtests_py3:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py3_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py38:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py311:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j11_build
+    - start_j11_cqlsh-dtests-offheap:
+        type: approval
+    - j11_cqlsh_dtests_py3_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
+    - j11_cqlsh_dtests_py38_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
+    - j11_cqlsh_dtests_py311_offheap:
+        requires:
+        - start_j11_cqlsh-dtests-offheap
+        - j11_build
     - start_j11_utests_long:
         type: approval
     - j11_utests_long:
@@ -11519,15 +10141,15 @@
     - j11_jvm_dtests:
         requires:
         - j11_build
-    - j11_cqlshlib_tests:
-        requires:
-        - j11_build
-    - j11_jvm_dtests:
+    - j11_jvm_dtests_vnode:
         requires:
         - j11_build
     - j11_cqlshlib_tests:
         requires:
         - j11_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+        - j11_build
     - j11_dtests:
         requires:
         - j11_build
@@ -11540,36 +10162,36 @@
         requires:
         - start_j11_dtests_offheap
         - j11_build
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - start_j11_dtests_large:
+        type: approval
+    - j11_dtests_large:
+        requires:
+        - start_j11_dtests_large
+        - j11_build
+    - j11_dtests_large_vnode:
+        requires:
+        - start_j11_dtests_large
+        - j11_build
+    - j11_cqlsh_dtests_py3:
         requires:
         - j11_build
     - j11_cqlsh_dtests_py3_vnode:
         requires:
         - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-        - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-        - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-        - j11_build
     - j11_cqlsh_dtests_py38:
         requires:
         - j11_build
     - j11_cqlsh_dtests_py311:
         requires:
         - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+        - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+        - j11_build
     - start_j11_cqlsh-dtests-offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-        - start_j11_cqlsh-dtests-offheap
-        - j11_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
         - start_j11_cqlsh-dtests-offheap
@@ -11582,16 +10204,6 @@
         requires:
         - start_j11_cqlsh-dtests-offheap
         - j11_build
-    - start_j11_dtests_large:
-        type: approval
-    - j11_dtests_large:
-        requires:
-        - start_j11_dtests_large
-        - j11_build
-    - j11_dtests_large_vnode:
-        requires:
-        - start_j11_dtests_large
-        - j11_build
     - start_utests_long:
         type: approval
     - j11_utests_long:
diff --git a/.circleci/config_template.yml b/.circleci/config_template.yml
index 38f5c75..4367bdc 100644
--- a/.circleci/config_template.yml
+++ b/.circleci/config_template.yml
@@ -81,6 +81,14 @@
     # The number of times that new, modified or manually specified stress unit tests should be run.
     REPEATED_UTESTS_STRESS_COUNT: 500
 
+    # Comma-separated list of tests that should be included in the repeated run for simulator dtests,
+    # in addition to automatically detected new and modified tests. For example:
+    # REPEATED_SIMULATOR_DTESTS: org.apache.cassandra.simulator.test.TrivialSimulationTest
+    # REPEATED_SIMULATOR_DTESTS: org.apache.cassandra.simulator.test.TrivialSimulationTest#trivialTest
+    REPEATED_SIMULATOR_DTESTS:
+    # The number of times that new, modified or manually specified simulator dtests should be run.
+    REPEATED_SIMULATOR_DTESTS_COUNT: 500
+
     # Comma-separated list of tests that should be included in the repeated run for JVM dtests,
     # in addition to automatically detected new and modified tests. For example:
     # REPEATED_JVM_DTESTS: org.apache.cassandra.distributed.test.PagingTest
@@ -139,6 +147,10 @@
     # REPEATED_ANT_TEST_METHODS: testCompoundPartitionKey,testStaticTable
     # Please note that some Ant targets will ignore the -Dtest.methods argument produced by this.
     REPEATED_ANT_TEST_METHODS:
+    # Whether the test iteration should use vnodes for JVM dtests (-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16').
+    # This will only be applied as a default to JVM dtests that don't provide their own initial tokens or token count,
+    # in the same way that it's done for *_jvm_dtests_vnode jobs. Ant targets other than JVM dtests will ignore this.
+    REPEATED_ANT_TEST_VNODES: false
     # The number of times that the repeated JUnit test should be run.
     REPEATED_ANT_TEST_COUNT: 500
 
@@ -258,18 +270,84 @@
         requires:
           - start_j8_jvm_dtests
           - j8_build
+    - start_j8_jvm_dtests_vnode:
+        type: approval
+    - j8_jvm_dtests_vnode:
+        requires:
+          - start_j8_jvm_dtests_vnode
+          - j8_build
     - start_j8_jvm_dtests_repeat:
         type: approval
     - j8_jvm_dtests_repeat:
         requires:
           - start_j8_jvm_dtests_repeat
           - j8_build
+    - start_j8_jvm_dtests_vnode_repeat:
+        type: approval
+    - j8_jvm_dtests_vnode_repeat:
+        requires:
+          - start_j8_jvm_dtests_vnode_repeat
+          - j8_build
+    - start_j11_jvm_dtests:
+        type: approval
+    - j11_jvm_dtests:
+        requires:
+          - start_j11_jvm_dtests
+          - j8_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+          - start_j11_jvm_dtests_vnode
+          - j8_build
+    - start_j11_jvm_dtests_repeat:
+        type: approval
+    - j11_jvm_dtests_repeat:
+        requires:
+          - start_j11_jvm_dtests_repeat
+          - j8_build
+    - start_j11_jvm_dtests_vnode_repeat:
+        type: approval
+    - j11_jvm_dtests_vnode_repeat:
+        requires:
+          - start_j11_jvm_dtests_vnode_repeat
+          - j8_build
+    - start_j8_simulator_dtests:
+        type: approval
+    - j8_simulator_dtests:
+        requires:
+          - start_j8_simulator_dtests
+          - j8_build
+    - start_j8_simulator_dtests_repeat:
+        type: approval
+    - j8_simulator_dtests_repeat:
+        requires:
+          - start_j8_simulator_dtests_repeat
+          - j8_build
     - start_j8_cqlshlib_tests:
         type: approval
     - j8_cqlshlib_tests:
         requires:
           - start_j8_cqlshlib_tests
           - j8_build
+    - start_j8_cqlshlib_cython_tests:
+        type: approval
+    - j8_cqlshlib_cython_tests:
+        requires:
+          - start_j8_cqlshlib_cython_tests
+          - j8_build
+    - start_j11_cqlshlib_tests:
+        type: approval
+    - j11_cqlshlib_tests:
+        requires:
+          - start_j11_cqlshlib_tests
+          - j8_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+          - start_j11_cqlshlib_cython_tests
+          - j8_build
     # Java 11 unit tests
     - start_j11_unit_tests:
         type: approval
@@ -446,31 +524,19 @@
         requires:
           - start_jvm_upgrade_dtests_repeat
           - j8_dtest_jars_build
-    # Java 8 dtests
+    # Python DTests
     - start_j8_dtests:
         type: approval
     - j8_dtests:
         requires:
           - start_j8_dtests
           - j8_build
-    - start_j8_dtests_repeat:
-        type: approval
-    - j8_dtests_repeat:
-        requires:
-          - start_j8_dtests_repeat
-          - j8_build
     - start_j8_dtests_vnode:
         type: approval
     - j8_dtests_vnode:
         requires:
           - start_j8_dtests_vnode
           - j8_build
-    - start_j8_dtests_vnode_repeat:
-        type: approval
-    - j8_dtests_vnode_repeat:
-        requires:
-          - start_j8_dtests_vnode_repeat
-          - j8_build
     # Java 8 off-heap dtests
     - start_j8_dtests_offheap:
         type: approval
@@ -484,7 +550,33 @@
         requires:
           - start_j8_dtests_offheap_repeat
           - j8_build
-    # Java 8 large DTests
+    # Java 11 dtests
+    - start_j11_dtests:
+        type: approval
+    - j11_dtests:
+        requires:
+        - start_j11_dtests
+        - j8_build
+    - start_j11_dtests_vnode:
+        type: approval
+    - j11_dtests_vnode:
+        requires:
+          - start_j11_dtests_vnode
+          - j8_build
+    # Java 11 off-heap dtests
+    - start_j11_dtests_offheap:
+        type: approval
+    - j11_dtests_offheap:
+        requires:
+          - start_j11_dtests_offheap
+          - j8_build
+    - start_j11_dtests_offheap_repeat:
+        type: approval
+    - j11_dtests_offheap_repeat:
+        requires:
+          - start_j11_dtests_offheap_repeat
+          - j8_build
+    # Python large DTests
     - start_j8_dtests_large:
         type: approval
     - j8_dtests_large:
@@ -509,45 +601,6 @@
         requires:
           - start_j8_dtests_large_vnode_repeat
           - j8_build
-    # Java 11 dtests
-    - start_j11_dtests:
-        type: approval
-    - j11_dtests:
-        requires:
-          - start_j11_dtests
-          - j8_build
-    - start_j11_dtests_repeat:
-        type: approval
-    - j11_dtests_repeat:
-        requires:
-          - start_j11_dtests_repeat
-          - j8_build
-    - start_j11_dtests_vnode:
-        type: approval
-    - j11_dtests_vnode:
-        requires:
-          - start_j11_dtests_vnode
-          - j8_build
-    - start_j11_dtests_vnode_repeat:
-        type: approval
-    - j11_dtests_vnode_repeat:
-        requires:
-          - start_j11_dtests_vnode_repeat
-          - j8_build
-    # Java 11 off-heap dtests
-    - start_j11_dtests_offheap:
-        type: approval
-    - j11_dtests_offheap:
-        requires:
-          - start_j11_dtests_offheap
-          - j8_build
-    - start_j11_dtests_offheap_repeat:
-        type: approval
-    - j11_dtests_offheap_repeat:
-        requires:
-          - start_j11_dtests_offheap_repeat
-          - j8_build
-    # Java 11 Python large DTests
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -566,50 +619,30 @@
         requires:
           - start_j11_dtests_large_vnode
           - j8_build
+    - start_j11_dtests_large_vnode_repeat:
+        type: approval
     - j11_dtests_large_vnode_repeat:
         requires:
-          - start_j11_dtests_large_repeat
+          - start_j11_dtests_large_vnode_repeat
           - j8_build
     # Java 8 upgrade tests
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
-          - start_upgrade_tests
-          - j8_build
-    - start_j8_upgrade_dtests_repeat:
-        type: approval
-    - j8_upgrade_dtests_repeat:
-        requires:
-          - start_j8_upgrade_dtests_repeat
+          - start_upgrade_dtests
           - j8_build
     # Java 8 cqlsh dtests
     - start_j8_cqlsh_tests:
         type: approval
-    - j8_cqlsh-dtests-py2-with-vnodes:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py3_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-        - start_j8_cqlsh_tests
-        - j8_build
     - j8_cqlsh_dtests_py3:
         requires:
-        - start_j8_cqlsh_tests
-        - j8_build
+          - start_j8_cqlsh_tests
+          - j8_build
+    - j8_cqlsh_dtests_py3_vnode:
+        requires:
+          - start_j8_cqlsh_tests
+          - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
           - start_j8_cqlsh_tests
@@ -618,13 +651,17 @@
         requires:
           - start_j8_cqlsh_tests
           - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+        - start_j8_cqlsh_tests
+        - j8_build
     # Java 8 cqlsh offheap dtests offheap
     - start_j8_cqlsh_tests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-          - start_j8_cqlsh_tests_offheap
-          - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
           - start_j8_cqlsh_tests_offheap
@@ -640,30 +677,14 @@
     # Java 11 cqlsh dtests
     - start_j11_cqlsh_tests:
         type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py3_vnode:
-        requires:
-        - start_j11_cqlsh_tests
-        - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-          - start_j11_cqlsh_tests
-          - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-          - start_j11_cqlsh_tests
-          - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-          - start_j11_cqlsh_tests
-          - j8_build
     - j11_cqlsh_dtests_py3:
         requires:
           - start_j11_cqlsh_tests
           - j8_build
+    - j11_cqlsh_dtests_py3_vnode:
+        requires:
+        - start_j11_cqlsh_tests
+        - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
           - start_j11_cqlsh_tests
@@ -672,13 +693,17 @@
         requires:
           - start_j11_cqlsh_tests
           - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+          - start_j11_cqlsh_tests
+          - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+          - start_j11_cqlsh_tests
+          - j8_build
     # Java 11 cqlsh dtests off-heap
     - start_j11_cqlsh_tests_offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-          - start_j11_cqlsh_tests_offheap
-          - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
           - start_j11_cqlsh_tests_offheap
@@ -705,6 +730,39 @@
         requires:
           - start_j11_repeated_ant_test
           - j8_build
+    # Java 8 repeated dtest
+    - start_j8_dtests_repeat:
+        type: approval
+    - j8_dtests_repeat:
+        requires:
+          - start_j8_dtests_repeat
+          - j8_build
+    - start_j8_dtests_vnode_repeat:
+        type: approval
+    - j8_dtests_vnode_repeat:
+        requires:
+          - start_j8_dtests_vnode_repeat
+          - j8_build
+    # Java 11 repeated dtest
+    - start_j11_dtests_repeat:
+        type: approval
+    - j11_dtests_repeat:
+        requires:
+          - start_j11_dtests_repeat
+          - j8_build
+    - start_j11_dtests_vnode_repeat:
+        type: approval
+    - j11_dtests_vnode_repeat:
+        requires:
+          - start_j11_dtests_vnode_repeat
+          - j8_build
+    # Repeated Python upgrade dtest
+    - start_j8_upgrade_dtests_repeat:
+        type: approval
+    - j8_upgrade_dtests_repeat:
+        requires:
+            - start_j8_upgrade_dtests_repeat
+            - j8_build
 
 j8_pre-commit_jobs: &j8_pre-commit_jobs
   jobs:
@@ -720,15 +778,48 @@
     - j8_unit_tests_repeat:
         requires:
           - j8_build
+    - j8_simulator_dtests:
+        requires:
+          - j8_build
+    - j8_simulator_dtests_repeat:
+        requires:
+          - j8_build
     - j8_jvm_dtests:
         requires:
           - j8_build
     - j8_jvm_dtests_repeat:
         requires:
           - j8_build
+    - j8_jvm_dtests_vnode:
+        requires:
+          - j8_build
+    - j8_jvm_dtests_vnode_repeat:
+        requires:
+          - j8_build
+    - j11_jvm_dtests:
+        requires:
+          - j8_build
+    - j11_jvm_dtests_repeat:
+        requires:
+          - j8_build
+    - j11_jvm_dtests_vnode:
+        requires:
+          - j8_build
+    - j11_jvm_dtests_vnode_repeat:
+        requires:
+          - j8_build
     - j8_cqlshlib_tests:
         requires:
           - j8_build
+    - j8_cqlshlib_cython_tests:
+        requires:
+          - j8_build
+    - j11_cqlshlib_tests:
+        requires:
+          - j8_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+          - j8_build
     # Java 11 unit tests
     - j11_unit_tests:
         requires:
@@ -855,7 +946,7 @@
     - j8_jvm_upgrade_dtests_repeat:
         requires:
           - j8_dtest_jars_build
-    # Java 8 dtests
+    # Python DTests
     - j8_dtests:
         requires:
           - j8_build
@@ -901,7 +992,7 @@
         requires:
           - start_j11_dtests_offheap
           - j8_build
-    # Java 8 large DTests
+    # Large Python DTests
     - start_j8_dtests_large:
         type: approval
     - j8_dtests_large:
@@ -920,7 +1011,6 @@
         requires:
           - start_j8_dtests_large
           - j8_build
-    # Java 11 large DTests
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -940,48 +1030,38 @@
           - start_j11_dtests_large
           - j8_build
     # Java 8 upgrade tests (on request)
-    - start_upgrade_tests:
+    - start_upgrade_dtests:
         type: approval
     - j8_upgrade_dtests:
         requires:
           - j8_build
-          - start_upgrade_tests
+          - start_upgrade_dtests
     - j8_upgrade_dtests_repeat:
         requires:
           - j8_build
-          - start_upgrade_tests
+          - start_upgrade_dtests
     # Java 8 cqlsh dtests
-    - j8_cqlsh-dtests-py2-with-vnodes:
+    - j8_cqlsh_dtests_py3:
         requires:
           - j8_build
     - j8_cqlsh_dtests_py3_vnode:
         requires:
           - j8_build
-    - j8_cqlsh_dtests_py38_vnode:
-        requires:
-          - j8_build
-    - j8_cqlsh_dtests_py311_vnode:
-        requires:
-          - j8_build
-    - j8_cqlsh-dtests-py2-no-vnodes:
-        requires:
-          - j8_build
-    - j8_cqlsh_dtests_py3:
-        requires:
-          - j8_build
     - j8_cqlsh_dtests_py38:
         requires:
           - j8_build
     - j8_cqlsh_dtests_py311:
         requires:
           - j8_build
+    - j8_cqlsh_dtests_py38_vnode:
+        requires:
+          - j8_build
+    - j8_cqlsh_dtests_py311_vnode:
+        requires:
+          - j8_build
     # Java 8 cqlsh dtests offheap
     - start_j8_cqlsh_dtests_offheap:
         type: approval
-    - j8_cqlsh-dtests-py2-offheap:
-        requires:
-          - start_j8_cqlsh_dtests_offheap
-          - j8_build
     - j8_cqlsh_dtests_py3_offheap:
         requires:
           - start_j8_cqlsh_dtests_offheap
@@ -995,37 +1075,27 @@
           - start_j8_cqlsh_dtests_offheap
           - j8_build
     # Java 11 cqlsh dtests
-    - j11_cqlsh-dtests-py2-with-vnodes:
+    - j11_cqlsh_dtests_py3:
         requires:
           - j8_build
     - j11_cqlsh_dtests_py3_vnode:
         requires:
           - j8_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-          - j8_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-          - j8_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-          - j8_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-          - j8_build
     - j11_cqlsh_dtests_py38:
         requires:
           - j8_build
     - j11_cqlsh_dtests_py311:
         requires:
           - j8_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+          - j8_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+          - j8_build
     # Java 11 cqlsh dtests off-heap
     - start_j11_cqlsh-dtests-offheap:
         type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j8_build
     - j11_cqlsh_dtests_py3_offheap:
         requires:
           - start_j11_cqlsh-dtests-offheap
@@ -1065,18 +1135,36 @@
         requires:
           - start_j11_jvm_dtests
           - j11_build
+    - start_j11_jvm_dtests_vnode:
+        type: approval
+    - j11_jvm_dtests_vnode:
+        requires:
+          - start_j11_jvm_dtests_vnode
+          - j11_build
     - start_j11_jvm_dtests_repeat:
         type: approval
     - j11_jvm_dtests_repeat:
         requires:
           - start_j11_jvm_dtests_repeat
           - j11_build
+    - start_j11_jvm_dtests_vnode_repeat:
+        type: approval
+    - j11_jvm_dtests_vnode_repeat:
+        requires:
+          - start_j11_jvm_dtests_vnode_repeat
+          - j11_build
     - start_j11_cqlshlib_tests:
         type: approval
     - j11_cqlshlib_tests:
         requires:
           - start_j11_cqlshlib_tests
           - j11_build
+    - start_j11_cqlshlib_cython_tests:
+        type: approval
+    - j11_cqlshlib_cython_tests:
+        requires:
+          - start_j11_cqlshlib_cython_tests
+          - j11_build
     # Java 11 dtests
     - start_j11_dtests:
         type: approval
@@ -1090,18 +1178,6 @@
         requires:
           - start_j11_dtests_vnode
           - j11_build
-    - start_j11_dtests_repeat:
-        type: approval
-    - j11_dtests_repeat:
-        requires:
-          - start_j11_dtests_repeat
-          - j11_build
-    - start_j11_dtests_vnode_repeat:
-        type: approval
-    - j11_dtests_vnode_repeat:
-        requires:
-          - start_j11_dtests_vnode_repeat
-          - j11_build
     - start_j11_dtests_offheap:
         type: approval
     - j11_dtests_offheap:
@@ -1114,59 +1190,6 @@
         requires:
           - start_j11_dtests_offheap_repeat
           - j11_build
-    - start_j11_cqlsh_tests:
-        type: approval
-    - j11_cqlsh-dtests-py2-with-vnodes:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - j11_cqlsh_dtests_py3_vnode:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - j11_cqlsh_dtests_py38:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - j11_cqlsh_dtests_py311:
-        requires:
-          - start_j11_cqlsh_tests
-          - j11_build
-    - start_j11_cqlsh-dtests-offheap:
-        type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    - j11_cqlsh_dtests_py3_offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    - j11_cqlsh_dtests_py38_offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    - j11_cqlsh_dtests_py311_offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    # Python large DTests
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -1191,6 +1214,46 @@
         requires:
           - start_j11_dtests_large_vnode_repeat
           - j11_build
+    - start_j11_cqlsh_tests:
+        type: approval
+    - j11_cqlsh_dtests_py3:
+        requires:
+          - start_j11_cqlsh_tests
+          - j11_build
+    - j11_cqlsh_dtests_py3_vnode:
+        requires:
+          - start_j11_cqlsh_tests
+          - j11_build
+    - j11_cqlsh_dtests_py38:
+        requires:
+          - start_j11_cqlsh_tests
+          - j11_build
+    - j11_cqlsh_dtests_py311:
+        requires:
+          - start_j11_cqlsh_tests
+          - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+          - start_j11_cqlsh_tests
+          - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+          - start_j11_cqlsh_tests
+          - j11_build
+    - start_j11_cqlsh-dtests-offheap:
+        type: approval
+    - j11_cqlsh_dtests_py3_offheap:
+        requires:
+          - start_j11_cqlsh-dtests-offheap
+          - j11_build
+    - j11_cqlsh_dtests_py38_offheap:
+        requires:
+          - start_j11_cqlsh-dtests-offheap
+          - j11_build
+    - j11_cqlsh_dtests_py311_offheap:
+        requires:
+          - start_j11_cqlsh-dtests-offheap
+          - j11_build
     # specialized unit tests (all run on request)
     - start_j11_utests_long:
         type: approval
@@ -1271,6 +1334,19 @@
         requires:
           - start_j11_repeated_ant_test
           - j11_build
+    # Java 11 repeated dtest
+    - start_j11_dtests_repeat:
+        type: approval
+    - j11_dtests_repeat:
+        requires:
+          - start_j11_dtests_repeat
+          - j11_build
+    - start_j11_dtests_vnode_repeat:
+        type: approval
+    - j11_dtests_vnode_repeat:
+        requires:
+          - start_j11_dtests_vnode_repeat
+          - j11_build
 
 j11_pre-commit_jobs: &j11_pre-commit_jobs
   jobs:
@@ -1291,15 +1367,18 @@
     - j11_jvm_dtests_repeat:
         requires:
           - j11_build
-    - j11_cqlshlib_tests:
+    - j11_jvm_dtests_vnode:
         requires:
           - j11_build
-    - j11_jvm_dtests:
+    - j11_jvm_dtests_vnode_repeat:
         requires:
           - j11_build
     - j11_cqlshlib_tests:
         requires:
           - j11_build
+    - j11_cqlshlib_cython_tests:
+        requires:
+          - j11_build
     - j11_dtests:
         requires:
           - j11_build
@@ -1324,49 +1403,6 @@
         requires:
           - start_j11_dtests_offheap_repeat
           - j11_build
-    - j11_cqlsh-dtests-py2-with-vnodes:
-        requires:
-          - j11_build
-    - j11_cqlsh_dtests_py3_vnode:
-        requires:
-          - j11_build
-    - j11_cqlsh_dtests_py38_vnode:
-        requires:
-          - j11_build
-    - j11_cqlsh_dtests_py311_vnode:
-        requires:
-          - j11_build
-    - j11_cqlsh-dtests-py2-no-vnodes:
-        requires:
-          - j11_build
-    - j11_cqlsh_dtests_py3:
-        requires:
-          - j11_build
-    - j11_cqlsh_dtests_py38:
-        requires:
-          - j11_build
-    - j11_cqlsh_dtests_py311:
-        requires:
-          - j11_build
-    - start_j11_cqlsh-dtests-offheap:
-        type: approval
-    - j11_cqlsh-dtests-py2-offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    - j11_cqlsh_dtests_py3_offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    - j11_cqlsh_dtests_py38_offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    - j11_cqlsh_dtests_py311_offheap:
-        requires:
-          - start_j11_cqlsh-dtests-offheap
-          - j11_build
-    # Large Python DTests
     - start_j11_dtests_large:
         type: approval
     - j11_dtests_large:
@@ -1385,6 +1421,38 @@
         requires:
           - start_j11_dtests_large
           - j11_build
+    - j11_cqlsh_dtests_py3:
+        requires:
+          - j11_build
+    - j11_cqlsh_dtests_py3_vnode:
+        requires:
+          - j11_build
+    - j11_cqlsh_dtests_py38:
+        requires:
+          - j11_build
+    - j11_cqlsh_dtests_py311:
+        requires:
+          - j11_build
+    - j11_cqlsh_dtests_py38_vnode:
+        requires:
+          - j11_build
+    - j11_cqlsh_dtests_py311_vnode:
+        requires:
+          - j11_build
+    - start_j11_cqlsh-dtests-offheap:
+        type: approval
+    - j11_cqlsh_dtests_py3_offheap:
+        requires:
+          - start_j11_cqlsh-dtests-offheap
+          - j11_build
+    - j11_cqlsh_dtests_py38_offheap:
+        requires:
+          - start_j11_cqlsh-dtests-offheap
+          - j11_build
+    - j11_cqlsh_dtests_py311_offheap:
+        requires:
+          - start_j11_cqlsh-dtests-offheap
+          - j11_build
     # specialized unit tests (all run on request)
     - start_utests_long:
         type: approval
@@ -1529,6 +1597,15 @@
       - log_environment
       - run_parallel_junit_tests
 
+  j8_simulator_dtests:
+    <<: *j8_small_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - create_junit_containers
+      - log_environment
+      - run_simulator_tests
+
   j8_jvm_dtests:
     <<: *j8_small_par_executor
     steps:
@@ -1542,6 +1619,20 @@
           classlistprefix: distributed
           target: "testclasslist"
 
+  j8_jvm_dtests_vnode:
+    <<: *j8_small_par_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - create_junit_containers:
+          classlistprefix: distributed
+          extra_filters: "| grep -v upgrade"
+      - log_environment
+      - run_parallel_junit_tests:
+          classlistprefix: distributed
+          target: "testclasslist"
+          arguments: "-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+
   j11_jvm_dtests:
     <<: *j11_small_par_executor
     steps:
@@ -1555,6 +1646,20 @@
           classlistprefix: distributed
           target: "testclasslist"
 
+  j11_jvm_dtests_vnode:
+    <<: *j11_small_par_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - create_junit_containers:
+          classlistprefix: distributed
+          extra_filters: "| grep -v upgrade"
+      - log_environment
+      - run_parallel_junit_tests:
+          classlistprefix: distributed
+          target: "testclasslist"
+          arguments: "-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+
   j8_jvm_upgrade_dtests:
     <<: *j8_medium_par_executor
     steps:
@@ -1584,6 +1689,13 @@
           at: /home/cassandra
       - run_cqlshlib_tests
 
+  j8_cqlshlib_cython_tests:
+    <<: *j8_small_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - run_cqlshlib_cython_tests
+
   j11_cqlshlib_tests:
     <<: *j11_small_executor
     steps:
@@ -1591,6 +1703,13 @@
           at: /home/cassandra
       - run_cqlshlib_tests
 
+  j11_cqlshlib_cython_tests:
+    <<: *j11_small_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - run_cqlshlib_cython_tests
+
   j8_utests_long:
     <<: *j8_seq_executor
     steps:
@@ -1786,62 +1905,6 @@
         file_tag: j11_without_vnodes
         pytest_extra_args: '--skip-resource-intensive-tests'
 
-  j8_dtests_large_vnode:
-    <<: *j8_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j8_large_with_vnodes
-          run_dtests_extra_args: '--use-vnodes --only-resource-intensive-tests --force-resource-intensive-tests'
-      - run_dtests:
-          file_tag: j8_large_with_vnodes
-          pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
-
-  j8_dtests_large:
-    <<: *j8_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j8_large_without_vnodes
-          run_dtests_extra_args: '--only-resource-intensive-tests --force-resource-intensive-tests'
-      - run_dtests:
-          file_tag: j8_large_without_vnodes
-          pytest_extra_args: '--num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
-
-  j11_dtests_large_vnode:
-    <<: *j11_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j11_large_with_vnodes
-          run_dtests_extra_args: '--use-vnodes --only-resource-intensive-tests --force-resource-intensive-tests'
-      - run_dtests:
-          file_tag: j11_large_with_vnodes
-          pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
-
-  j11_dtests_large:
-    <<: *j11_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j11_large_without_vnodes
-          run_dtests_extra_args: '--only-resource-intensive-tests --force-resource-intensive-tests'
-      - run_dtests:
-          file_tag: j11_large_without_vnodes
-          pytest_extra_args: '--num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
-
   j8_upgrade_dtests:
     <<: *j8_par_executor
     steps:
@@ -1856,36 +1919,6 @@
           file_tag: j8_upgradetests_without_vnodes
           pytest_extra_args: '--execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all'
 
-  j8_cqlsh-dtests-py2-with-vnodes:
-    <<: *j8_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j8_with_vnodes
-          run_dtests_extra_args: "--use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql'"
-      - run_dtests:
-          file_tag: j8_with_vnodes
-          pytest_extra_args: '--use-vnodes --num-tokens=16 --skip-resource-intensive-tests'
-          extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
-
-  j8_cqlsh-dtests-py2-offheap:
-    <<: *j8_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j8_dtests_offheap
-          run_dtests_extra_args: "--use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql'"
-      - run_dtests:
-          file_tag: j8_dtests_offheap
-          pytest_extra_args: '--use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests'
-          extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
-
   j8_cqlsh_dtests_py3_vnode:
     <<: *j8_par_executor
     steps:
@@ -1988,21 +2021,6 @@
           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.11'
           python_version: '3.11'
 
-  j8_cqlsh-dtests-py2-no-vnodes:
-    <<: *j8_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j8_without_vnodes
-          run_dtests_extra_args: "--skip-resource-intensive-tests --pytest-options '-k cql'"
-      - run_dtests:
-          file_tag: j8_without_vnodes
-          pytest_extra_args: '--skip-resource-intensive-tests'
-          extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
-
   j8_cqlsh_dtests_py3:
     <<: *j8_par_executor
     steps:
@@ -2054,36 +2072,6 @@
           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.11'
           python_version: '3.11'
 
-  j11_cqlsh-dtests-py2-with-vnodes:
-    <<: *j11_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j11_with_vnodes
-          run_dtests_extra_args: "--use-vnodes --skip-resource-intensive-tests --pytest-options '-k cql'"
-      - run_dtests:
-          file_tag: j11_with_vnodes
-          pytest_extra_args: '--use-vnodes --num-tokens=16 --skip-resource-intensive-tests'
-          extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
-
-  j11_cqlsh-dtests-py2-offheap:
-    <<: *j11_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j11_dtests_offheap
-          run_dtests_extra_args: "--use-vnodes --use-off-heap-memtables --skip-resource-intensive-tests --pytest-options '-k cql'"
-      - run_dtests:
-          file_tag: j11_dtests_offheap
-          pytest_extra_args: '--use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests'
-          extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
-
   j11_cqlsh_dtests_py3_vnode:
     <<: *j11_par_executor
     steps:
@@ -2186,21 +2174,6 @@
           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.11'
           python_version: '3.11'
 
-  j11_cqlsh-dtests-py2-no-vnodes:
-    <<: *j11_par_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - create_dtest_containers:
-          file_tag: j11_without_vnodes
-          run_dtests_extra_args: "--skip-resource-intensive-tests --pytest-options '-k cql'"
-      - run_dtests:
-          file_tag: j11_without_vnodes
-          pytest_extra_args: '--skip-resource-intensive-tests'
-          extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
-
   j11_cqlsh_dtests_py3:
     <<: *j11_par_executor
     steps:
@@ -2252,6 +2225,62 @@
           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.11'
           python_version: '3.11'
 
+  j8_dtests_large_vnode:
+    <<: *j8_par_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - clone_dtest
+      - create_venv
+      - create_dtest_containers:
+          file_tag: j8_large_with_vnodes
+          run_dtests_extra_args: '--use-vnodes --only-resource-intensive-tests --force-resource-intensive-tests'
+      - run_dtests:
+          file_tag: j8_large_with_vnodes
+          pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
+
+  j8_dtests_large:
+    <<: *j8_par_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - clone_dtest
+      - create_venv
+      - create_dtest_containers:
+          file_tag: j8_large_without_vnodes
+          run_dtests_extra_args: '--only-resource-intensive-tests --force-resource-intensive-tests'
+      - run_dtests:
+          file_tag: j8_large_without_vnodes
+          pytest_extra_args: '--only-resource-intensive-tests --force-resource-intensive-tests'
+
+  j11_dtests_large_vnode:
+    <<: *j11_par_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - clone_dtest
+      - create_venv
+      - create_dtest_containers:
+          file_tag: j11_large_with_vnodes
+          run_dtests_extra_args: '--use-vnodes --only-resource-intensive-tests --force-resource-intensive-tests'
+      - run_dtests:
+          file_tag: j11_large_with_vnodes
+          pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
+
+  j11_dtests_large:
+    <<: *j11_par_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - clone_dtest
+      - create_venv
+      - create_dtest_containers:
+          file_tag: j11_large_without_vnodes
+          run_dtests_extra_args: '--only-resource-intensive-tests --force-resource-intensive-tests'
+      - run_dtests:
+          file_tag: j11_large_without_vnodes
+          pytest_extra_args: '--only-resource-intensive-tests --force-resource-intensive-tests'
+
   j8_unit_tests_repeat:
     <<: *j8_repeated_utest_executor
     steps:
@@ -2372,66 +2401,21 @@
       - log_environment
       - run_jvm_dtests_repeat
 
-
-  j8_dtests_large_repeat:
-    <<: *j8_repeated_dtest_executor
+  j8_jvm_dtests_vnode_repeat:
+    <<: *j8_repeated_utest_executor
     steps:
       - attach_workspace:
           at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - run_repeated_dtest:
-          tests: ${REPEATED_LARGE_DTESTS}
-          vnodes: "false"
-          upgrade: "false"
-          count: ${REPEATED_LARGE_DTESTS_COUNT}
-          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
-          extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
+      - log_environment
+      - run_jvm_dtests_vnode_repeat
 
-  j8_dtests_large_vnode_repeat:
-    <<: *j8_repeated_dtest_executor
+  j8_simulator_dtests_repeat:
+    <<: *j8_repeated_utest_executor
     steps:
       - attach_workspace:
           at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - run_repeated_dtest:
-          tests: ${REPEATED_LARGE_DTESTS}
-          vnodes: "true"
-          upgrade: "false"
-          count: ${REPEATED_LARGE_DTESTS_COUNT}
-          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
-          extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
-
-  j11_dtests_large_repeat:
-    <<: *j11_repeated_dtest_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - run_repeated_dtest:
-          tests: ${REPEATED_LARGE_DTESTS}
-          vnodes: "false"
-          upgrade: "false"
-          count: ${REPEATED_LARGE_DTESTS_COUNT}
-          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
-          extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
-
-  j11_dtests_large_vnode_repeat:
-    <<: *j11_repeated_dtest_executor
-    steps:
-      - attach_workspace:
-          at: /home/cassandra
-      - clone_dtest
-      - create_venv
-      - run_repeated_dtest:
-          tests: ${REPEATED_LARGE_DTESTS}
-          vnodes: "true"
-          upgrade: "false"
-          count: ${REPEATED_LARGE_DTESTS_COUNT}
-          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
-          extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
+      - log_environment
+      - run_simulator_dtests_repeat
 
   j8_jvm_upgrade_dtests_repeat:
     <<: *j8_repeated_jvm_upgrade_dtest_executor
@@ -2449,6 +2433,14 @@
       - log_environment
       - run_jvm_dtests_repeat
 
+  j11_jvm_dtests_vnode_repeat:
+    <<: *j11_repeated_utest_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - log_environment
+      - run_jvm_dtests_vnode_repeat
+
   j8_repeated_ant_test:
     <<: *j8_repeated_utest_executor
     steps:
@@ -2459,6 +2451,7 @@
           target: ${REPEATED_ANT_TEST_TARGET}
           class: ${REPEATED_ANT_TEST_CLASS}
           methods: ${REPEATED_ANT_TEST_METHODS}
+          vnodes: ${REPEATED_ANT_TEST_VNODES}
           count: ${REPEATED_ANT_TEST_COUNT}
           stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
 
@@ -2472,6 +2465,7 @@
           target: ${REPEATED_ANT_TEST_TARGET}
           class: ${REPEATED_ANT_TEST_CLASS}
           methods: ${REPEATED_ANT_TEST_METHODS}
+          vnodes: ${REPEATED_ANT_TEST_VNODES}
           count: ${REPEATED_ANT_TEST_COUNT}
           stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
 
@@ -2518,6 +2512,36 @@
           stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
           extra_dtest_args: "--use-off-heap-memtables --skip-resource-intensive-tests"
 
+  j8_dtests_large_repeat:
+    <<: *j8_repeated_dtest_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - clone_dtest
+      - create_venv
+      - run_repeated_dtest:
+          tests: ${REPEATED_LARGE_DTESTS}
+          vnodes: "false"
+          upgrade: "false"
+          count: ${REPEATED_LARGE_DTESTS_COUNT}
+          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
+          extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
+
+  j8_dtests_large_vnode_repeat:
+    <<: *j8_repeated_dtest_executor
+    steps:
+    - attach_workspace:
+        at: /home/cassandra
+    - clone_dtest
+    - create_venv
+    - run_repeated_dtest:
+        tests: ${REPEATED_LARGE_DTESTS}
+        vnodes: "true"
+        upgrade: "false"
+        count: ${REPEATED_LARGE_DTESTS_COUNT}
+        stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
+        extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
+
   j11_dtests_repeat:
     <<: *j11_repeated_dtest_executor
     steps:
@@ -2563,6 +2587,36 @@
           stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
           extra_dtest_args: "--use-off-heap-memtables --skip-resource-intensive-tests"
 
+  j11_dtests_large_repeat:
+    <<: *j11_repeated_dtest_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - clone_dtest
+      - create_venv
+      - run_repeated_dtest:
+          tests: ${REPEATED_LARGE_DTESTS}
+          vnodes: "false"
+          upgrade: "false"
+          count: ${REPEATED_LARGE_DTESTS_COUNT}
+          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
+          extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
+
+  j11_dtests_large_vnode_repeat:
+    <<: *j11_repeated_dtest_executor
+    steps:
+      - attach_workspace:
+          at: /home/cassandra
+      - clone_dtest
+      - create_venv
+      - run_repeated_dtest:
+          tests: ${REPEATED_LARGE_DTESTS}
+          vnodes: "true"
+          upgrade: "false"
+          count: ${REPEATED_LARGE_DTESTS_COUNT}
+          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
+          extra_dtest_args: "--only-resource-intensive-tests --force-resource-intensive-tests"
+
   j8_upgrade_dtests_repeat:
     <<: *j8_repeated_upgrade_dtest_executor
     steps:
@@ -2648,7 +2702,7 @@
           cd ~/cassandra
           mkdir ~/dtest_jars
           git remote add apache https://github.com/apache/cassandra.git
-          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 trunk; do
+          for branch in cassandra-2.2 cassandra-3.0 cassandra-3.11 cassandra-4.0 cassandra-4.1 trunk; do
             # check out the correct cassandra version:
             git remote set-branches --add apache '$branch'
             git fetch --depth 1 apache $branch
@@ -2728,6 +2782,33 @@
 
         no_output_timeout: 15m
 
+  run_simulator_tests:
+    parameters:
+      no_output_timeout:
+        type: string
+        default: 30m
+    steps:
+    - run:
+        name: Run Simulator Tests
+        command: |
+          set -x
+          export PATH=$JAVA_HOME/bin:$PATH
+          time mv ~/cassandra /tmp
+          cd /tmp/cassandra
+          if [ -d ~/dtest_jars ]; then
+            cp ~/dtest_jars/dtest* /tmp/cassandra/build/
+          fi
+          ant test-simulator-dtest -Dno-build-test=true
+        no_output_timeout: <<parameters.no_output_timeout>>
+    - store_test_results:
+        path: /tmp/cassandra/build/test/output/
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/output
+        destination: junitxml
+    - store_artifacts:
+        path: /tmp/cassandra/build/test/logs
+        destination: logs
+
   run_junit_tests:
     parameters:
       target:
@@ -2767,12 +2848,30 @@
         command: |
           export PATH=$JAVA_HOME/bin:$PATH
           time mv ~/cassandra /tmp
-          cd /tmp/cassandra/pylib
-          ./cassandra-cqlsh-tests.sh ..
+          cd /tmp/cassandra/
+          ./pylib/cassandra-cqlsh-tests.sh $(pwd)
         no_output_timeout: <<parameters.no_output_timeout>>
     - store_test_results:
         path: /tmp/cassandra/pylib
 
+  run_cqlshlib_cython_tests:
+    parameters:
+      no_output_timeout:
+        type: string
+        default: 15m
+    steps:
+      - run:
+          name: Run cqlshlib Unit Tests
+          command: |
+            export PATH=$JAVA_HOME/bin:$PATH
+            export cython="yes"
+            time mv ~/cassandra /tmp
+            cd /tmp/cassandra/
+            ./pylib/cassandra-cqlsh-tests.sh $(pwd)
+          no_output_timeout: <<parameters.no_output_timeout>>
+      - store_test_results:
+          path: /tmp/cassandra/pylib
+
   run_parallel_junit_tests:
     parameters:
       target:
@@ -2784,6 +2883,9 @@
       classlistprefix:
         type: string
         default: unit
+      arguments:
+        type: string
+        default: " "
     steps:
     - run:
         name: Run Unit Tests (<<parameters.target>>)
@@ -2799,7 +2901,7 @@
           if [ -z "$test_timeout" ]; then
             test_timeout=$(grep 'name="test.timeout"' build.xml | awk -F'"' '{print $4}')
           fi
-          ant <<parameters.target>> -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt  -Dtest.classlistprefix=<<parameters.classlistprefix>> -Dno-build-test=true
+          ant <<parameters.target>> <<parameters.arguments>> -Dtest.timeout="$test_timeout" -Dtest.classlistfile=/tmp/java_tests_${CIRCLE_NODE_INDEX}_final.txt -Dtest.classlistprefix=<<parameters.classlistprefix>> -Dno-build-test=true
         no_output_timeout: <<parameters.no_output_timeout>>
     - store_test_results:
         path: /tmp/cassandra/build/test/output/
@@ -2913,7 +3015,7 @@
             # we need the "set -o pipefail" here so that the exit code that circleci will actually use is from pytest and not the exit code from tee
             export SPLIT_TESTS=`cat /tmp/split_dtest_tests_<<parameters.file_tag>>_final.txt`
             if [ ! -z "$SPLIT_TESTS" ]; then
-              set -o pipefail && cd ~/cassandra-dtest && pytest <<parameters.pytest_extra_args>> --log-cli-level=DEBUG --junit-xml=/tmp/results/dtests/pytest_result_<<parameters.file_tag>>.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
+              set -o pipefail && cd ~/cassandra-dtest && pytest <<parameters.pytest_extra_args>> --log-level="DEBUG" --junit-xml=/tmp/results/dtests/pytest_result_<<parameters.file_tag>>.xml -s --cassandra-dir=/home/cassandra/cassandra --keep-test-dir $SPLIT_TESTS 2>&1 | tee /tmp/dtest/stdout.txt
             else
               echo "Tune your parallelism, there are more containers than test classes. Nothing to do in this container"
               (exit 1)
@@ -2989,6 +3091,24 @@
           target: test-jvm-dtest-some
           tests: ${REPEATED_JVM_DTESTS}
           count: ${REPEATED_JVM_DTESTS_COUNT}
+          vnodes: false
+          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
+
+  run_simulator_dtests_repeat:
+    steps:
+      - run_repeated_utests:
+          target: test-simulator-dtest
+          tests: ${REPEATED_SIMULATOR_DTESTS}
+          count: ${REPEATED_SIMULATOR_DTESTS_COUNT}
+          stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
+
+  run_jvm_dtests_vnode_repeat:
+    steps:
+      - run_repeated_utests:
+          target: test-jvm-dtest-some
+          tests: ${REPEATED_JVM_DTESTS}
+          count: ${REPEATED_JVM_DTESTS_COUNT}
+          vnodes: true
           stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
 
   run_jvm_upgrade_dtests_repeat:
@@ -2997,6 +3117,7 @@
           target: test-jvm-dtest-some
           tests: ${REPEATED_JVM_UPGRADE_DTESTS}
           count: ${REPEATED_JVM_UPGRADE_DTESTS_COUNT}
+          vnodes: false
           stop_on_failure: ${REPEATED_TESTS_STOP_ON_FAILURE}
 
   run_repeated_utests:
@@ -3007,6 +3128,9 @@
         type: string
       count:
         type: string
+      vnodes:
+        type: boolean
+        default: false
       stop_on_failure:
         type: string
     steps:
@@ -3032,6 +3156,13 @@
             tests=$(echo <<parameters.tests>> | sed -e "s/<nil>//" | sed -e "s/ //" | tr "," "\n" | tr " " "\n" | sort -n | uniq -u)
             echo "Tests to be repeated: ${tests}"
 
+            # Prepare the JVM dtests vnodes argument, which is optional.
+            vnodes=<<parameters.vnodes>>
+            vnodes_args=""
+            if [ "$vnodes" = true ] ; then
+              vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+            fi
+
             # Prepare the testtag for the target, used by the test macro in build.xml to group the output files
             target=<<parameters.target>>
             testtag=""
@@ -3064,7 +3195,8 @@
                       $target == "test-system-keyspace-directory" || \
                       $target == "fqltool-test" || \
                       $target == "long-test" || \
-                      $target == "stress-test" ]]; then
+                      $target == "stress-test" || \
+                      $target == "test-simulator-dtest" ]]; then
                   name_arg="-Dtest.name=${class##*.}"
                 else
                   name_arg="-Dtest.name=$class"
@@ -3083,7 +3215,7 @@
                   # run the test
                   status="passes"
                   if !( set -o pipefail && \
-                        ant <<parameters.target>> $name_arg $methods_arg -Dno-build-test=true | \
+                        ant <<parameters.target>> $name_arg $methods_arg $vnodes_args -Dno-build-test=true | \
                         tee stdout.txt \
                       ); then
                     status="fails"
@@ -3110,7 +3242,7 @@
                   if [[ -d $source && -n "$(ls $source)" ]]; then
                     mv $source/* $dest/
                   fi
-            
+                  
                   # maybe stop iterations on test failure
                   if [[ <<parameters.stop_on_failure>> = true ]] && (( $exit_code > 0 )); then
                     break
@@ -3138,6 +3270,8 @@
         type: string
       methods:
         type: string
+      vnodes:
+        type: string
       count:
         type: string
       stop_on_failure:
@@ -3187,7 +3321,8 @@
                       $target == "test-system-keyspace-directory" || \
                       $target == "fqltool-test" || \
                       $target == "long-test" || \
-                      $target == "stress-test" ]]; then
+                      $target == "stress-test" || \
+                      $target == "test-simulator-dtest" ]]; then
                   name="-Dtest.name=$class_name"
                 else
                   name="-Dtest.name=$class_path"
@@ -3199,6 +3334,12 @@
                 else
                   methods="-Dtest.methods=<<parameters.methods>>"
                 fi
+            
+                # Prepare the JVM dtests vnodes argument, which is optional
+                vnodes_args=""
+                if <<parameters.vnodes>>; then
+                  vnodes_args="-Dtest.jvm.args='-Dcassandra.dtest.num_tokens=16'"
+                fi
 
                 # Run the test target as many times as requested collecting the exit code,
                 # stopping the iteration only if stop_on_failure is set.
@@ -3209,7 +3350,7 @@
 
                   # run the test
                   status="passes"
-                  if !( set -o pipefail && ant $target $name $methods -Dno-build-test=true | tee stdout.txt ); then
+                  if !( set -o pipefail && ant $target $name $methods $vnodes_args -Dno-build-test=true | tee stdout.txt ); then
                     status="fails"
                     exit_code=1
                   fi
@@ -3273,7 +3414,7 @@
         default: ""
     steps:
       - run:
-          name: Run repeated Python dtest
+          name: Run repeated Python DTests
           no_output_timeout: 15m
           command: |
             if [ "<<parameters.tests>>" == "<nil>" ]; then
diff --git a/.circleci/config_template.yml.PAID.patch b/.circleci/config_template.yml.PAID.patch
index a39b6ec..098ccd2 100644
--- a/.circleci/config_template.yml.PAID.patch
+++ b/.circleci/config_template.yml.PAID.patch
@@ -1,6 +1,6 @@
---- config-2_1.yml	2023-02-07 21:22:17.000000000 -0500
-+++ config-2_1.yml.MIDRES	2023-02-08 10:15:45.000000000 -0500
-@@ -145,14 +145,14 @@
+--- config-2_1.yml	2023-02-02 21:24:39.000000000 -0500
++++ config-2_1.yml.MIDRES	2023-02-02 21:25:05.000000000 -0500
+@@ -157,14 +157,14 @@
  j8_par_executor: &j8_par_executor
    executor:
      name: java8-executor
@@ -19,15 +19,10 @@
  
  j8_small_executor: &j8_small_executor
    executor:
-@@ -163,26 +163,38 @@
- j8_medium_par_executor: &j8_medium_par_executor
-   executor:
-     name: java8-executor
--    #exec_resource_class: xlarge
--  parallelism: 1
-+    exec_resource_class: xlarge
-+  parallelism: 4
-+
+@@ -172,29 +172,41 @@
+     exec_resource_class: medium
+   parallelism: 1
+ 
 +j8_large_par_executor: &j8_large_par_executor
 +  executor:
 +    name: java8-executor
@@ -39,6 +34,14 @@
 +    name: java8-executor
 +    exec_resource_class: xlarge
 +  parallelism: 100
++
+ j8_medium_par_executor: &j8_medium_par_executor
+   executor:
+     name: java8-executor
+-    #exec_resource_class: xlarge
+-  parallelism: 1
++    exec_resource_class: xlarge
++  parallelism: 4
  
  j8_seq_executor: &j8_seq_executor
    executor:
@@ -60,12 +63,12 @@
      name: java11-executor
 -    #exec_resource_class: xlarge
 -  parallelism: 1
-+    #exec_resource_class: large
++    exec_resource_class: large
 +  parallelism: 10
  
  j11_small_executor: &j11_small_executor
    executor:
-@@ -193,44 +205,56 @@
+@@ -205,44 +217,56 @@
  j11_medium_par_executor: &j11_medium_par_executor
    executor:
      name: java11-executor
@@ -131,7 +134,7 @@
  
  j8_separate_jobs: &j8_separate_jobs
    jobs:
-@@ -1700,7 +1724,7 @@
+@@ -1819,7 +1843,7 @@
            target: testclasslist-system-keyspace-directory
  
    j8_dtests_vnode:
@@ -140,7 +143,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1714,7 +1738,7 @@
+@@ -1833,7 +1857,7 @@
            pytest_extra_args: '--use-vnodes --num-tokens=16 --skip-resource-intensive-tests'
  
    j8_dtests_offheap:
@@ -149,7 +152,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1728,7 +1752,7 @@
+@@ -1847,7 +1871,7 @@
            pytest_extra_args: '--use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests'
  
    j11_dtests_vnode:
@@ -158,7 +161,7 @@
      steps:
      - attach_workspace:
          at: /home/cassandra
-@@ -1743,7 +1767,7 @@
+@@ -1862,7 +1886,7 @@
          pytest_extra_args: '--use-vnodes --num-tokens=16 --skip-resource-intensive-tests'
  
    j11_dtests_offheap:
@@ -167,7 +170,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1758,7 +1782,7 @@
+@@ -1877,7 +1901,7 @@
            pytest_extra_args: '--use-vnodes --num-tokens=16 --use-off-heap-memtables --skip-resource-intensive-tests'
  
    j8_dtests:
@@ -176,7 +179,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1772,7 +1796,7 @@
+@@ -1891,7 +1915,7 @@
            pytest_extra_args: '--skip-resource-intensive-tests'
  
    j11_dtests:
@@ -185,79 +188,25 @@
      steps:
      - attach_workspace:
          at: /home/cassandra
-@@ -1787,7 +1811,7 @@
+@@ -1906,7 +1930,7 @@
          pytest_extra_args: '--skip-resource-intensive-tests'
  
-   j8_dtests_large_vnode:
--    <<: *j8_par_executor
-+    <<: *j8_medium_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -1801,7 +1825,7 @@
-           pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
- 
-   j8_dtests_large:
--    <<: *j8_par_executor
-+    <<: *j8_medium_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -1815,7 +1839,7 @@
-           pytest_extra_args: '--num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
- 
-   j11_dtests_large_vnode:
--    <<: *j11_par_executor
-+    <<: *j11_medium_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -1829,7 +1853,7 @@
-           pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
- 
-   j11_dtests_large:
--    <<: *j11_par_executor
-+    <<: *j11_medium_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -1843,7 +1867,7 @@
-           pytest_extra_args: '--num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
- 
    j8_upgrade_dtests:
 -    <<: *j8_par_executor
 +    <<: *j8_very_large_par_executor
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1857,7 +1881,7 @@
+@@ -1920,7 +1944,7 @@
            pytest_extra_args: '--execute-upgrade-tests-only --upgrade-target-version-only --upgrade-version-selection all'
  
-   j8_cqlsh-dtests-py2-with-vnodes:
--    <<: *j8_par_executor
-+    <<: *j8_large_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -1872,7 +1896,7 @@
-           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
- 
-   j8_cqlsh-dtests-py2-offheap:
--    <<: *j8_par_executor
-+    <<: *j8_large_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -1887,7 +1911,7 @@
-           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
- 
    j8_cqlsh_dtests_py3_vnode:
 -    <<: *j8_par_executor
 +    <<: *j8_large_par_executor
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1902,7 +1926,7 @@
+@@ -1935,7 +1959,7 @@
            extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.6'
  
    j8_cqlsh_dtests_py3_offheap:
@@ -266,7 +215,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1917,7 +1941,7 @@
+@@ -1950,7 +1974,7 @@
            extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.6'
  
    j8_cqlsh_dtests_py38_vnode:
@@ -275,7 +224,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1935,7 +1959,7 @@
+@@ -1968,7 +1992,7 @@
            python_version: '3.8'
  
    j8_cqlsh_dtests_py311_vnode:
@@ -284,7 +233,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1953,7 +1977,7 @@
+@@ -1986,7 +2010,7 @@
            python_version: '3.11'
  
    j8_cqlsh_dtests_py38_offheap:
@@ -293,7 +242,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1971,7 +1995,7 @@
+@@ -2004,7 +2028,7 @@
            python_version: '3.8'
  
    j8_cqlsh_dtests_py311_offheap:
@@ -302,25 +251,16 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -1989,7 +2013,7 @@
+@@ -2022,7 +2046,7 @@
            python_version: '3.11'
  
-   j8_cqlsh-dtests-py2-no-vnodes:
--    <<: *j8_par_executor
-+    <<: *j8_large_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -2004,7 +2028,7 @@
-           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
- 
    j8_cqlsh_dtests_py3:
 -    <<: *j8_par_executor
 +    <<: *j8_large_par_executor
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2019,7 +2043,7 @@
+@@ -2037,7 +2061,7 @@
            extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.6'
  
    j8_cqlsh_dtests_py38:
@@ -329,7 +269,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2037,7 +2061,7 @@
+@@ -2055,7 +2079,7 @@
            python_version: '3.8'
  
    j8_cqlsh_dtests_py311:
@@ -338,34 +278,16 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2055,7 +2079,7 @@
+@@ -2073,7 +2097,7 @@
            python_version: '3.11'
  
-   j11_cqlsh-dtests-py2-with-vnodes:
--    <<: *j11_par_executor
-+    <<: *j11_large_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -2070,7 +2094,7 @@
-           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
- 
-   j11_cqlsh-dtests-py2-offheap:
--    <<: *j11_par_executor
-+    <<: *j11_large_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -2085,7 +2109,7 @@
-           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
- 
    j11_cqlsh_dtests_py3_vnode:
 -    <<: *j11_par_executor
 +    <<: *j11_large_par_executor
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2100,7 +2124,7 @@
+@@ -2088,7 +2112,7 @@
            extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.6'
  
    j11_cqlsh_dtests_py3_offheap:
@@ -374,7 +296,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2115,7 +2139,7 @@
+@@ -2103,7 +2127,7 @@
            extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.6'
  
    j11_cqlsh_dtests_py38_vnode:
@@ -383,7 +305,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2133,7 +2157,7 @@
+@@ -2121,7 +2145,7 @@
            python_version: '3.8'
  
    j11_cqlsh_dtests_py311_vnode:
@@ -392,7 +314,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2151,7 +2175,7 @@
+@@ -2139,7 +2163,7 @@
            python_version: '3.11'
  
    j11_cqlsh_dtests_py38_offheap:
@@ -401,7 +323,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2169,7 +2193,7 @@
+@@ -2157,7 +2181,7 @@
            python_version: '3.8'
  
    j11_cqlsh_dtests_py311_offheap:
@@ -410,25 +332,16 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2187,7 +2211,7 @@
+@@ -2175,7 +2199,7 @@
            python_version: '3.11'
  
-   j11_cqlsh-dtests-py2-no-vnodes:
--    <<: *j11_par_executor
-+    <<: *j11_large_par_executor
-     steps:
-       - attach_workspace:
-           at: /home/cassandra
-@@ -2202,7 +2226,7 @@
-           extra_env_args: 'CQLSH_PYTHON=/usr/bin/python2.7'
- 
    j11_cqlsh_dtests_py3:
 -    <<: *j11_par_executor
 +    <<: *j11_large_par_executor
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2217,7 +2241,7 @@
+@@ -2190,7 +2214,7 @@
            extra_env_args: 'CQLSH_PYTHON=/usr/bin/python3.6'
  
    j11_cqlsh_dtests_py38:
@@ -437,7 +350,7 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -2235,7 +2259,7 @@
+@@ -2208,7 +2232,7 @@
            python_version: '3.8'
  
    j11_cqlsh_dtests_py311:
@@ -446,8 +359,39 @@
      steps:
        - attach_workspace:
            at: /home/cassandra
-@@ -3336,3 +3360,4 @@
-       - store_artifacts:
-           path: ~/cassandra-dtest/logs
-           destination: dtest_logs
-+
+@@ -2226,7 +2250,7 @@
+           python_version: '3.11'
+ 
+   j8_dtests_large_vnode:
+-    <<: *j8_par_executor
++    <<: *j8_medium_par_executor
+     steps:
+       - attach_workspace:
+           at: /home/cassandra
+@@ -2240,7 +2264,7 @@
+           pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
+ 
+   j8_dtests_large:
+-    <<: *j8_par_executor
++    <<: *j8_medium_par_executor
+     steps:
+       - attach_workspace:
+           at: /home/cassandra
+@@ -2254,7 +2278,7 @@
+           pytest_extra_args: '--only-resource-intensive-tests --force-resource-intensive-tests'
+ 
+   j11_dtests_large_vnode:
+-    <<: *j11_par_executor
++    <<: *j11_medium_par_executor
+     steps:
+       - attach_workspace:
+           at: /home/cassandra
+@@ -2268,7 +2292,7 @@
+           pytest_extra_args: '--use-vnodes --num-tokens=16 --only-resource-intensive-tests --force-resource-intensive-tests'
+ 
+   j11_dtests_large:
+-    <<: *j11_par_executor
++    <<: *j11_medium_par_executor
+     steps:
+       - attach_workspace:
+           at: /home/cassandra
diff --git a/.circleci/generate.sh b/.circleci/generate.sh
index 4fee247..29f66a2 100755
--- a/.circleci/generate.sh
+++ b/.circleci/generate.sh
@@ -18,7 +18,7 @@
 #
 
 BASEDIR=`dirname $0`
-BASE_BRANCH=cassandra-4.0
+BASE_BRANCH=cassandra-4.1
 set -e
 
 die ()
@@ -48,6 +48,8 @@
   echo "                   -e REPEATED_UTESTS_LONG_COUNT=100"
   echo "                   -e REPEATED_UTESTS_STRESS=org.apache.cassandra.stress.generate.DistributionGaussianTest"
   echo "                   -e REPEATED_UTESTS_STRESS_COUNT=500"
+  echo "                   -e REPEATED_SIMULATOR_DTESTS=org.apache.cassandra.simulator.test.TrivialSimulationTest"
+  echo "                   -e REPEATED_SIMULATOR_DTESTS_COUNT=500"
   echo "                   -e REPEATED_JVM_DTESTS=org.apache.cassandra.distributed.test.PagingTest"
   echo "                   -e REPEATED_JVM_DTESTS_COUNT=500"
   echo "                   -e REPEATED_JVM_UPGRADE_DTESTS=org.apache.cassandra.distributed.upgrade.GroupByTest"
@@ -61,6 +63,7 @@
   echo "                   -e REPEATED_ANT_TEST_TARGET=testsome"
   echo "                   -e REPEATED_ANT_TEST_CLASS=org.apache.cassandra.cql3.ViewTest"
   echo "                   -e REPEATED_ANT_TEST_METHODS=testCompoundPartitionKey,testStaticTable"
+  echo "                   -e REPEATED_ANT_TEST_VNODES=false"
   echo "                   -e REPEATED_ANT_TEST_COUNT=500"
   echo "                  For the complete list of environment variables, please check the"
   echo "                  list of examples in config_template.yml and/or the documentation."
@@ -83,7 +86,7 @@
           ;;
       p ) paid=true
           ;;
-      e ) if (!($has_env_vars)); then
+      e ) if (! ($has_env_vars)); then
             env_vars="$OPTARG"
           else
             env_vars="$env_vars|$OPTARG"
@@ -116,6 +119,8 @@
        [ "$key" != "REPEATED_UTESTS_LONG_COUNT" ] &&
        [ "$key" != "REPEATED_UTESTS_STRESS" ] &&
        [ "$key" != "REPEATED_UTESTS_STRESS_COUNT" ] &&
+       [ "$key" != "REPEATED_SIMULATOR_DTESTS" ] &&
+       [ "$key" != "REPEATED_SIMULATOR_DTESTS_COUNT" ] &&
        [ "$key" != "REPEATED_JVM_DTESTS" ] &&
        [ "$key" != "REPEATED_JVM_DTESTS_COUNT" ] &&
        [ "$key" != "REPEATED_JVM_UPGRADE_DTESTS" ]  &&
@@ -129,6 +134,7 @@
        [ "$key" != "REPEATED_ANT_TEST_TARGET" ] &&
        [ "$key" != "REPEATED_ANT_TEST_CLASS" ] &&
        [ "$key" != "REPEATED_ANT_TEST_METHODS" ] &&
+       [ "$key" != "REPEATED_ANT_TEST_VNODES" ] &&
        [ "$key" != "REPEATED_ANT_TEST_COUNT" ]; then
       die "Unrecognised environment variable name: $key"
     fi
@@ -170,13 +176,13 @@
   # copy free tier into config.yml to make sure this gets updated
   cp $BASEDIR/config.yml.FREE $BASEDIR/config.yml
 
-elif (!($has_env_vars)); then
+elif (! ($has_env_vars)); then
   print_help
   exit 0
 fi
 
 # add new or modified tests to the sets of tests to be repeated
-if (!($all)); then
+if (! ($all)); then
   add_diff_tests ()
   {
     dir="${BASEDIR}/../${2}"
@@ -207,6 +213,7 @@
   add_diff_tests "REPEATED_UTESTS_LONG" "test/long/" "org.apache.cassandra"
   add_diff_tests "REPEATED_UTESTS_STRESS" "tools/stress/test/unit/" "org.apache.cassandra.stress"
   add_diff_tests "REPEATED_UTESTS_FQLTOOL" "tools/fqltool/test/unit/" "org.apache.cassandra.fqltool"
+  add_diff_tests "REPEATED_SIMULATOR_DTESTS" "test/simulator/test/" "org.apache.cassandra.simulator.test"
   add_diff_tests "REPEATED_JVM_DTESTS" "test/distributed/" "org.apache.cassandra.distributed.test"
   add_diff_tests "REPEATED_JVM_UPGRADE_DTESTS" "test/distributed/" "org.apache.cassandra.distributed.upgrade"
 fi
@@ -266,6 +273,10 @@
     delete_job "$1" "j8_utests_fqltool_repeat"
     delete_job "$1" "j11_utests_fqltool_repeat"
   fi
+  if (! (echo "$env_vars" | grep -q "REPEATED_SIMULATOR_DTESTS=")); then
+    delete_job "$1" "j8_simulator_dtests_repeat"
+    delete_job "$1" "j11_simulator_dtests_repeat"
+  fi
   if (! (echo "$env_vars" | grep -q "REPEATED_JVM_DTESTS=")); then
     delete_job "$1" "j8_jvm_dtests_repeat"
     delete_job "$1" "j8_jvm_dtests_vnode_repeat"
diff --git a/.circleci/readme.md b/.circleci/readme.md
index 67b00e6..d5389f6 100644
--- a/.circleci/readme.md
+++ b/.circleci/readme.md
@@ -99,6 +99,7 @@
   -e REPEATED_UTESTS_FQLTOOL=org.apache.cassandra.fqltool.FQLCompareTest \
   -e REPEATED_UTESTS_LONG=org.apache.cassandra.io.sstable.CQLSSTableWriterLongTest#testWideRow \
   -e REPEATED_UTESTS_STRESS=org.apache.cassandra.stress.generate.DistributionGaussianTest \
+  -e REPEATED_SIMULATOR_DTESTS=org.apache.cassandra.simulator.test.TrivialSimulationTest \
   -e REPEATED_DTESTS=cql_test.py,consistency_test.py::TestAvailability::test_simple_strategy \
   -e REPEATED_LARGE_DTESTS=replace_address_test.py::TestReplaceAddress::test_replace_stopped_node \
   -e REPEATED_JVM_DTESTS=org.apache.cassandra.distributed.test.PagingTest#testPaging \
@@ -112,6 +113,7 @@
   -e REPEATED_ANT_TEST_TARGET=test-cdc \
   -e REPEATED_ANT_TEST_CLASS=org.apache.cassandra.cql3.ViewTest \
   -e REPEATED_ANT_TEST_METHODS=testCompoundPartitionKey,testStaticTable \
+  -e REPEATED_ANT_TEST_VNODES=false \
   -e REPEATED_ANT_TEST_COUNT=500
 ```
 Putting all together, you can have runs as complex as:
@@ -126,6 +128,8 @@
   -e REPEATED_UTESTS_LONG_COUNT=100 \
   -e REPEATED_UTESTS_STRESS=org.apache.cassandra.stress.generate.DistributionGaussianTest \
   -e REPEATED_UTESTS_STRESS_COUNT=500 \
+  -e REPEATED_SIMULATOR_DTESTS=org.apache.cassandra.simulator.test.TrivialSimulationTest \
+  -e REPEATED_SIMULATOR_DTESTS_COUNT=500 \
   -e REPEATED_DTESTS=cql_test.py,consistency_test.py::TestAvailability::test_simple_strategy \
   -e REPEATED_DTESTS_COUNT=500 \
   -e REPEATED_LARGE_DTESTS=replace_address_test.py,materialized_views_test.py \
@@ -139,6 +143,7 @@
   -e REPEATED_ANT_TEST_TARGET=test-cdc \
   -e REPEATED_ANT_TEST_CLASS=org.apache.cassandra.cql3.ViewTest \
   -e REPEATED_ANT_TEST_METHODS=testCompoundPartitionKey,testStaticTable \
+  -e REPEATED_ANT_TEST_VNODES=false \
   -e REPEATED_ANT_TEST_COUNT=500
 ```
 
diff --git a/.gitignore b/.gitignore
index 318f200..916ab0d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,7 +13,9 @@
 doc/build/
 lib/
 pylib/src/
+**/cqlshlib.xml
 !lib/cassandra-driver-internal-only-*.zip
+!lib/puresasl-*.zip
 
 # C* debs
 build-stamp
@@ -66,8 +68,9 @@
 *.tmp
 .DS_Store
 Thumbs.db
+.ccm/
 
-/.ant-targets-build.xml
+**/.ant-targets-build.xml
 .ant_targets
 
 # Generated files from the documentation
@@ -81,3 +84,5 @@
 # build-scripts will put cassandra-builds into the directory
 cassandra-builds/
 cassandra-dtest/
+
+conf/triggers/trigger-example.jar
diff --git a/CHANGES.txt b/CHANGES.txt
index 786a8a6..246ba58 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,9 +1,17 @@
-4.0.11
+4.1.3
+Merged from 4.0:
  * Remove unnecessary shuffling of GossipDigests in Gossiper#makeRandomGossipDigest (CASSANDRA-18546)
 Merged from 3.11:
 Merged from 3.0:
 
-4.0.10
+4.1.2
+ * Allow keystore and trustrore passwords to be nullable (CASSANDRA-18124)
+ * Return snapshots with dots in their name in nodetool listsnapshots (CASSANDRA-18371)
+ * Fix NPE when loading snapshots and data directory is one directory from root (CASSANDRA-18359)
+ * Do not submit hints when hinted_handoff_enabled=false (CASSANDRA-18304)
+ * Fix COPY ... TO STDOUT behavior in cqlsh (CASSANDRA-18353)
+ * Remove six and Py2SaferScanner merge cruft (CASSANDRA-18354)
+Merged from 4.0:
  * Improve nodetool enable{audit,fullquery}log (CASSANDRA-18550)
  * Report network cache info in nodetool (CASSANDRa-18400)
  * Partial compaction can resurrect deleted data (CASSANDRA-18507)
@@ -14,6 +22,7 @@
  * Incremental repairs fail on mixed IPv4/v6 addresses serializing SyncRequest (CASSANDRA-18474)
  * Deadlock updating sstable metadata if disk boundaries need reloading (CASSANDRA-18443)
  * Fix nested selection of reversed collections (CASSANDRA-17913)
+ * Update zstd-jni library to version 1.5.5 (CASSANDRA-18429)
 Merged from 3.11:
  * Remove unnecessary String.format invocation in QueryProcessor when getting a prepared statement from cache (CASSANDRA-17202)
  * Fix the capital P usage in the CQL parser (CASSANDRA-17919)
@@ -37,11 +46,24 @@
  * Suppress CVE-2022-45688 (CASSANDRA-18389)
  * Fix Splitter sometimes creating more splits than requested (CASSANDRA-18013)
 Merged from 3.0:
+ * Do not remove SSTables when cause of FSReadError is OutOfMemoryError while using best_effort disk failure policy (CASSANDRA-18336)
+ * Do not remove truncated_at entry in system.local while dropping an index (CASSANDRA-18105)
  * Save host id to system.local and flush immediately after startup (CASSANDRA-18153)
- * Fix the ordering of sstables when running sstableupgrade tool (CASSANDRA-18143)
- * Fix default file system error handler for disk_failure_policy die (CASSANDRA-18294)
 
-4.0.8
+4.1.1
+ * Deprecate org.apache.cassandra.hadoop code (CASSANDRA-16984)
+ * Fix too early schema version change in sysem local table (CASSANDRA-18291)
+ * Fix copying of JAR of a trigger to temporary file (CASSANDRA-18264)
+ * Fix possible NoSuchFileException when removing a snapshot (CASSANDRA-18211)
+ * PaxosPrepare may add instances to the Electorate that are not in gossip (CASSANDRA-18194)
+ * Fix PAXOS2_COMMIT_AND_PREPARE_RSP serialisation AssertionError (CASSANDRA-18164)
+ * Streaming progress virtual table lock contention can trigger TCP_USER_TIMEOUT and fail streaming (CASSANDRA-18110)
+ * Fix perpetual load of denylist on read in cases where denylist can never be loaded (CASSANDRA-18116)
+Merged from 4.0:
+ * Fix BufferPool incorrect memoryInUse when putUnusedPortion is used (CASSANDRA-18311)
+ * Improve memtable allocator accounting when updating AtomicBTreePartition (CASSANDRA-18125)
+ * Update zstd-jni to version 1.5.4-1 (CASSANDRA-18259)
+ * Split and order IDEA workspace template VM_PARAMETERS (CASSANDRA-18242)
  * Log warning message on aggregation queries without key or on multiple keys (CASSANDRA-18219)
  * Fix the output of FQL dump tool to properly separate entries (CASSANDRA-18215)
  * Add cache type information for maximum memory usage warning message (CASSANDRA-18184)
@@ -55,13 +77,10 @@
  * Fix sstable loading of keyspaces named snapshots or backups (CASSANDRA-14013)
  * Avoid ConcurrentModificationException in STCS/DTCS/TWCS.getSSTables (CASSANDRA-17977)
  * Restore internode custom tracing on 4.0's new messaging system (CASSANDRA-17981)
- * Harden parsing of boolean values in CQL in PropertyDefinitions (CASSANDRA-17878)
- * Fix error message about type hints (CASSANDRA-17915)
- * Fix possible race condition on repair snapshots (CASSANDRA-17955)
- * Fix ASM bytecode version inconsistency (CASSANDRA-17873)
 Merged from 3.11:
- * Fix Splitter sometimes creating more splits than requested (CASSANDRA-18013)
 Merged from 3.0:
+ * Fix the ordering of sstables when running sstableupgrade tool (CASSANDRA-18143)
+ * Fix default file system error handler for disk_failure_policy die (CASSANDRA-18294)
  * Introduce check for names of test classes (CASSANDRA-17964)
  * Suppress CVE-2022-41915 (CASSANDRA-18147)
  * Suppress CVE-2021-1471, CVE-2021-3064, CVE-2021-4235 (CASSANDRA-18149)
@@ -73,33 +92,79 @@
  * Add to the IntelliJ Git Window issue navigation links to Cassandra's Jira (CASSANDRA-18126)
  * Avoid anticompaction mixing data from two different time windows with TWCS (CASSANDRA-17970)
  * Do not spam the logs with MigrationCoordinator not being able to pull schemas (CASSANDRA-18096)
+
+4.1.0
+ * Fix ContentionStrategy backoff and Clock.waitUntil (CASSANDRA-18086)
+Merged from 4.0:
+Merged from 3.11:
+Merged from 3.0:
  * Fix incorrect resource name in LIST PERMISSION output (CASSANDRA-17848)
  * Suppress CVE-2022-41854 and similar (CASSANDRA-18083)
- * Fix running Ant rat targets without git (CASSANDRA-17974)
 
-4.0.7
+
+4.1-rc1
+ * Avoid schema mismatch problems on memtable API misconfiguration (CASSANDRA-18040)
+ * Start Paxos auto repair in CassandraDaemon (CASSANDRA-18029)
+ * Restore streaming_keep_alive_period on the netty control streaming channel (CASSANDRA-17768)
+ * Move Schema.FORCE_LOAD_KEYSPACES and Schema.FORCE_LOAD_KEYSPACES_PROP to CassandraRelevantProps (CASSANDRA-17783)
+ * Add --resolve-ip option to nodetool gossipinfo (CASSANDRA-17934)
+ * Allow pre-V5 global limit on bytes in flight to revert to zero asynchronously in RateLimitingTest (CASSANDRA-17927)
+Merged from 4.0:
+ * Backport CASSANDRA-17205 to 4.0 branch - Remove self-reference in SSTableTidier (CASSANDRA-18332)
+ * Avoid loading the preferred IP for BulkLoader streaming (CASSANDRA-18370)
+ * Harden parsing of boolean values in CQL in PropertyDefinitions (CASSANDRA-17878)
+ * Fix error message about type hints (CASSANDRA-17915)
+ * Fix possible race condition on repair snapshots (CASSANDRA-17955)
+ * Fix ASM bytecode version inconsistency (CASSANDRA-17873)
  * Remove empty cq4 files in log directory to not fail the startup of BinLog (CASSANDRA-17933)
  * Fix multiple BufferPool bugs (CASSANDRA-16681)
  * Fix StorageService.getNativeaddress handling of IPv6 addresses (CASSANDRA-17945)
+Merged from 3.11:
+ * Fix Splitter sometimes creating more splits than requested (CASSANDRA-18013)
+ * Suppress CVE-2022-42003 and CVE-2022-42004 (CASSANDRA-17966)
+ * Make LongBufferPoolTest insensitive to timing (CASSANDRA-16681)
+Merged from 3.0:
+ * Fix running Ant rat targets without git (CASSANDRA-17974)
+ * Harden JMX by resolving beanshooter issues (CASSANDRA-17921)
+ * Suppress CVE-2019-2684 (CASSANDRA-17965)
+ * Fix auto-completing "WITH" when creating a materialized view (CASSANDRA-17879)
+
+4.1-beta1
+ * We should not emit deprecation warning on startup for `key_cache_save_period`, `row_cache_save_period`, `counter_cache_save_period` (CASSANDRA-17904)
+ * upsert with adder support is not consistent with numbers and strings in LWT (CASSANDRA-17857)
+ * Fix race and return after failing connections (CASSANDRA-17618)
+ * Speculative execution threshold unit mismatch (CASSANDRA-17877)
+ * Fix BulkLoader to load entireSSTableThrottle and entireSSTableInterDcThrottle (CASSANDRA-17677)
+ * Fix a race condition where a keyspace can be oopened while it is being removed (CASSANDRA-17658)
+ * DatabaseDescriptor will set the default failure detector during client initialization (CASSANDRA-17782)
+ * Avoid initializing schema via SystemKeyspace.getPreferredIP() with the BulkLoader tool (CASSANDRA-17740)
+ * Improve JMX methods signatures, fix JMX and config backward compatibility (CASSANDRA-17725)
+ * Fix sstable_preemptive_open_interval disabled value. sstable_preemptive_open_interval = null backward compatible with
+   sstable_preemptive_open_interval_in_mb = -1 (CASSANDRA-17737)
+ * Remove usages of Path#toFile() in the snapshot apparatus (CASSANDRA-17769)
+ * Fix Settings Virtual Table to update paxos_variant after startup and rename enable_uuid_sstable_identifiers to
+   uuid_sstable_identifiers_enabled as per our config naming conventions (CASSANDRA-17738)
+ * index_summary_resize_interval_in_minutes = -1 is equivalent to index_summary_resize_interval being set to null or
+   disabled. JMX MBean IndexSummaryManager, setResizeIntervalInMinutes method still takes resizeIntervalInMinutes = -1 for disabled (CASSANDRA-17735)
+ * min_tracked_partition_size_bytes parameter from 4.1 alpha1 was renamed to min_tracked_partition_size (CASSANDRA-17733)
+ * Remove commons-lang dependency during build runtime (CASSANDRA-17724)
+ * Relax synchronization on StreamSession#onError() to avoid deadlock (CASSANDRA-17706)
+ * Fix AbstractCell#toString throws MarshalException for cell in collection (CASSANDRA-17695)
+ * Add new vtable output option to compactionstats (CASSANDRA-17683)
+ * Fix commitLogUpperBound initialization in AbstractMemtableWithCommitlog (CASSANDRA-17587)
+ * Fix widening to long in getBatchSizeFailThreshold (CASSANDRA-17650)
+ * Fix widening from mebibytes to bytes in IntMebibytesBound (CASSANDRA-17716)
+ * Revert breaking change in nodetool clientstats and expose cient options through nodetool clientstats --client-options. (CASSANDRA-17715)
+ * Fix missed nowInSec values in QueryProcessor (CASSANDRA-17458)
+ * Revert removal of withBufferSizeInMB(int size) in CQLSSTableWriter.Builder class and deprecate it in favor of withBufferSizeInMiB(int size) (CASSANDRA-17675)
+ * Remove expired snapshots of dropped tables after restart (CASSANDRA-17619)
+Merged from 4.0:
  * Mitigate direct buffer memory OOM on replacements (CASSANDRA-17895)
  * Fix repair failure on assertion if two peers have overlapping mismatching ranges (CASSANDRA-17900)
  * Better handle null state in Gossip schema migration to avoid NPE (CASSANDRA-17864)
  * HintedHandoffAddRemoveNodesTest now accounts for the fact that StorageMetrics.totalHints is not updated synchronously w/ writes (CASSANDRA-16679)
  * Avoid getting hanging repairs due to repair message timeouts (CASSANDRA-17613)
  * Prevent infinite loop in repair coordinator on FailSession (CASSANDRA-17834)
-Merged from 3.11:
- * Suppress CVE-2022-42003 and CVE-2022-42004 (CASSANDRA-17966)
- * Make LongBufferPoolTest insensitive to timing (CASSANDRA-16681)
- * Suppress CVE-2022-25857 and other snakeyaml CVEs (CASSANDRA-17907)
- * Fix potential IndexOutOfBoundsException in PagingState in mixed mode clusters (CASSANDRA-17840)
-Merged from 3.0:
- * Harden JMX by resolving beanshooter issues (CASSANDRA-17921)
- * Suppress CVE-2019-2684 (CASSANDRA-17965)
- * Fix auto-completing "WITH" when creating a materialized view (CASSANDRA-17879)
- * Fix scrubber falling into infinite loop when the last partition is broken (CASSANDRA-17862)
- * Fix resetting schema (CASSANDRA-17819)
-
-4.0.6
  * Fix race condition on updating cdc size and advancing to next segment (CASSANDRA-17792)
  * Add 'noboolean' rpm build for older distros like CentOS7 (CASSANDRA-17765)
  * Fix default value for compaction_throughput_mb_per_sec in Config class to match  the one in cassandra.yaml (CASSANDRA-17790)
@@ -109,30 +174,202 @@
  * Fix Settings Virtual Table - index_summary_resize_interval and index_summary_capacity were not updated after startup (CASSANDRA-17735)
  * Clean up ScheduledExecutors, CommitLog, and MessagingService shutdown for in-JVM dtests (CASSANDRA-17731)
  * Remove extra write to system table for prepared statements (CASSANDRA-17764)
-Merged from 3.11:
- * Document usage of closed token intervals in manual compaction (CASSANDRA-17575)
-Merged from 3.0:
- * Improve libjemalloc resolution in bin/cassandra (CASSANDRA-15767)
- * Fix restarting of services on gossipping-only member (CASSANDRA-17752)
-
-4.0.5
- * Utilise BTree improvements to reduce garbage and improve throughput (CASSANDRA-15511)
- * Make sure existing delayed tasks in StreamTransferTask cannot prevent clean shutdown (CASSANDRA-17706)
  * SSL storage port in sstableloader is deprecated (CASSANDRA-17602)
  * Fix counter write timeouts at ONE (CASSANDRA-17411)
  * Fix NPE in getLocalPrimaryRangeForEndpoint (CASSANDRA-17680)
- * Remove SSL storage port from sstableloader (CASSANDRA-17602)
  * Allow Java 11 to satisfy RPM/Debian packaging (CASSANDRA-17669)
  * Ensure FileStreamTask cannot compromise shared channel proxy for system table when interrupted (CASSANDRA-17663)
  * silence benign SslClosedEngineException (CASSANDRA-17565)
 Merged from 3.11:
+ * Fix potential IndexOutOfBoundsException in PagingState in mixed mode clusters (CASSANDRA-17840)
+ * Document usage of closed token intervals in manual compaction (CASSANDRA-17575)
  * Creating of a keyspace on insufficient number of replicas should filter out gosspping-only members (CASSANDRA-17759)
+ * Suppress CVE-2022-25857 and other snakeyaml CVEs (CASSANDRA-17907)
+Merged from 3.0:
+ * Improve libjemalloc resolution in bin/cassandra (CASSANDRA-15767)
+ * Fix restarting of services on gossipping-only member (CASSANDRA-17752)
+ * Fix scrubber falling into infinite loop when the last partition is broken (CASSANDRA-17862)
+ * Fix resetting schema (CASSANDRA-17819)
+
+4.1-alpha1
+ * Handle config parameters upper bound on startup; Fix auto_snapshot_ttl and paxos_purge_grace_period min unit validations (CASSANDRA-17571)
+ * Fix leak of non-standard Java types in our Exceptions as clients using JMX are unable to handle them.
+   Remove useless validation that leads to unnecessary additional read of cassandra.yaml on startup (CASSANDRA-17638)
+ * Fix repair_request_timeout_in_ms and remove paxos_auto_repair_threshold_mb (CASSANDRA-17557)
+ * Incremental repair leaks SomeRepairFailedException after switch away from flatMap (CASSANDRA-17620)
+ * StorageService read threshold get methods throw NullPointerException due to not handling null configs (CASSANDRA-17593)
+ * Rename truncate_drop guardrail to drop_truncate_table (CASSANDRA-17592)
+ * nodetool enablefullquerylog can NPE when directory has no files (CASSANDRA-17595)
+ * Add auto_snapshot_ttl configuration (CASSANDRA-16790)
+ * List snapshots of dropped tables (CASSANDRA-16843)
+ * Add information whether sstables are dropped to SchemaChangeListener (CASSANDRA-17582)
+ * Add a pluggable memtable API (CEP-11 / CASSANDRA-17034)
+ * Save sstable id as string in activity table (CASSANDRA-17585)
+ * Implement startup check to prevent Cassandra to potentially spread zombie data (CASSANDRA-17180)
+ * Allow failing startup on duplicate config keys (CASSANDRA-17379)
+ * Migrate threshold for minimum keyspace replication factor to guardrails (CASSANDRA-17212)
+ * Add guardrail to disallow TRUNCATE and DROP TABLE commands (CASSANDRA-17558)
+ * Add plugin support for CQLSH (CASSANDRA-16456)
+ * Add guardrail to disallow querying with ALLOW FILTERING (CASSANDRA-17370)
+ * Enhance SnakeYAML properties to be reusable outside of YAML parsing, support camel case conversion to snake case, and add support to ignore properties (CASSANDRA-17166)
+ * nodetool compact should support using a key string to find the range to avoid operators having to manually do this (CASSANDRA-17537)
+ * Add guardrail for data disk usage (CASSANDRA-17150)
+ * Tool to list data paths of existing tables (CASSANDRA-17568)
+ * Migrate track_warnings to more standard naming conventions and use latest configuration types rather than long (CASSANDRA-17560)
+ * Add support for CONTAINS and CONTAINS KEY in conditional UPDATE and DELETE statement (CASSANDRA-10537)
+ * Migrate advanced config parameters to the new Config types (CASSANDRA-17431)
+ * Make null to be meaning disabled and leave 0 as a valid value for permissions_update_interval, roles_update_interval, credentials_update_interval (CASSANDRA-17431)
+ * Fix typo in Config annotation (CASSANDRA-17431)
+ * Made Converters type safe and fixed a few cases where converters used the wrong type (CASSANDRA-17431)
+ * Fix null bug in DataStorageSpec and DurationSpec and require units to be added when providing 0 value (CASSANDRA-17431)
+ * Shutdown ScheduledExecutors as part of node drainage (CASSANDRA-17493)
+ * Provide JMX endpoint to allow transient logging of blocking read repairs (CASSANDRA-17471)
+ * Add guardrail for GROUP BY queries (CASSANDRA-17509)
+ * make pylib PEP and pylint compliant (CASSANDRA-17546)
+ * Add support for vnodes in jvm-dtest (CASSANDRA-17332)
+ * Remove guardrails global enable flag (CASSANDRA-17499)
+ * Clients using JMX are unable to handle non-standard java types but we leak this into our interfaces (CASSANDRA-17527)
+ * Remove stress server functionality (CASSANDRA-17535)
+ * Reduce histogram snapshot long[] allocation overhead during speculative read and write threshold updates (CASSANDRA-17523)
+ * Add guardrail for creation of secondary indexes (CASSANDRA-17498)
+ * Add guardrail to disallow creation of uncompressed tables (CASSANDRA-17504)
+ * Add guardrail to disallow creation of new COMPACT STORAGE tables (CASSANDRA-17522)
+ * repair vtables should expose a completed field due to lack of filtering options in CQL (CASSANDRA-17520)
+ * remove outdated code from cqlsh (CASSANDRA-17490)
+ * remove support for deprecated version specific TLS in Python 3.6 (CASSANDRA-17365)
+ * Add support for IF EXISTS and IF NOT EXISTS in ALTER statements (CASSANDRA-16916)
+ * resolve several pylint issues in cqlsh.py and pylib (CASSANDRA-17480)
+ * Streaming sessions longer than 3 minutes fail with timeout (CASSANDRA-17510)
+ * Add ability to track state in repair (CASSANDRA-15399)
+ * Remove unused 'parse' module (CASSANDRA-17484)
+ * change six functions in cqlshlib to native Python 3 (CASSANDRA-17417)
+ * reduce hot-path object allocations required to record local/remote requests against the client request metrics (CASSANDRA-17424)
+ * Disallow removing DC from system_auth while nodes are active in the DC (CASSANDRA-17478)
+ * Add guardrail for the number of fields per UDT (CASSANDRA-17385)
+ * Allow users to change cqlsh history location using env variable (CASSANDRA-17448)
+ * Add required -f option to use nodetool verify and standalone sstableverify (CASSANDRA-17017)
+ * Add support for UUID based sstable generation identifiers (CASSANDRA-17048)
+ * Log largest memtable flush at info instead of debug (CASSANDRA-17472)
+ * Add native transport rate limiter options to example cassandra.yaml, and expose metric for dispatch rate (CASSANDRA-17423)
+ * Add diagnostic events for guardrails (CASSANDRA-17197)
+ * Pre hashed passwords in CQL (CASSANDRA-17334)
+ * Increase cqlsh version (CASSANDRA-17432)
+ * Update SUPPORTED_UPGRADE_PATHS to include 3.0 and 3.x to 4.1 paths and remove obsolete tests (CASSANDRA-17362)
+ * Support DELETE in CQLSSTableWriter (CASSANDRA-14797)
+ * Failed inbound internode authentication failures generate ugly warning with stack trace (CASSANDRA-17068)
+ * Expose gossip information in system_views.gossip_info virtual table (CASSANDRA-17002)
+ * Add guardrails for collection items and size (CASSANDRA-17153)
+ * Improve guardrails messages (CASSANDRA-17430)
+ * Remove all usages of junit.framework and ban them via Checkstyle (CASSANDRA-17316)
+ * Add guardrails for read/write consistency levels (CASSANDRA-17188)
+ * Add guardrail for SELECT IN terms and their cartesian product (CASSANDRA-17187)
+ * remove unused imports in cqlsh.py and cqlshlib (CASSANDRA-17413)
+ * deprecate property windows_timer_interval (CASSANDRA-17404)
+ * Expose streaming as a vtable (CASSANDRA-17390)
+ * Expose all client options via system_views.clients and nodetool clientstats (CASSANDRA-16378)
+ * Make startup checks configurable (CASSANDRA-17220)
+ * Add guardrail for number of partition keys on IN queries (CASSANDRA-17186)
+ * update Python test framework from nose to pytest (CASSANDRA-17293)
+ * Fix improper CDC commit log segments deletion in non-blocking mode (CASSANDRA-17233)
+ * Add support for string concatenations through the + operator (CASSANDRA-17190)
+ * Limit the maximum hints size per host (CASSANDRA-17142)
+ * Add a virtual table for exposing batch metrics (CASSANDRA-17225)
+ * Flatten guardrails config (CASSANDRA-17353)
+ * Instance failed to start up due to NPE in StartupClusterConnectivityChecker (CASSANDRA-17347)
+ * add the shorter version of version flag (-v) in cqlsh (CASSANDRA-17236)
+ * Make vtables accessible via internode messaging (CASSANDRA-17295)
+ * Add support for PEM based key material for SSL (CASSANDRA-17031)
+ * Standardize storage configuration parameters' names. Support unit suffixes. (CASSANDRA-15234)
+ * Remove support for Windows (CASSANDRA-16956)
+ * Runtime-configurable YAML option to prohibit USE statements (CASSANDRA-17318)
+ * When streaming sees a ClosedChannelException this triggers the disk failure policy (CASSANDRA-17116)
+ * Add a virtual table for exposing prepared statements metrics (CASSANDRA-17224)
+ * Remove python 2.x support from cqlsh (CASSANDRA-17242)
+ * Prewarm role and credential caches to avoid timeouts at startup (CASSANDRA-16958)
+ * Make capacity/validity/updateinterval/activeupdate for Auth Caches configurable via nodetool (CASSANDRA-17063)
+ * Added startup check for read_ahead_kb setting (CASSANDRA-16436)
+ * Avoid unecessary array allocations and initializations when performing query checks (CASSANDRA-17209)
+ * Add guardrail for list operations that require read before write (CASSANDRA-17154)
+ * Migrate thresholds for number of keyspaces and tables to guardrails (CASSANDRA-17195)
+ * Remove self-reference in SSTableTidier (CASSANDRA-17205)
+ * Add guardrail for query page size (CASSANDRA-17189)
+ * Allow column_index_size_in_kb to be configurable through nodetool (CASSANDRA-17121)
+ * Emit a metric for number of local read and write calls
+ * Add non-blocking mode for CDC writes (CASSANDRA-17001)
+ * Add guardrails framework (CASSANDRA-17147)
+ * Harden resource management on SSTable components to prevent future leaks (CASSANDRA-17174)
+ * Make nodes more resilient to local unrelated files during startup (CASSANDRA-17082)
+ * repair prepare message would produce a wrong error message if network timeout happened rather than reply wait timeout (CASSANDRA-16992)
+ * Log queries that fail on timeout or unavailable errors up to once per minute by default (CASSANDRA-17159)
+ * Refactor normal/preview/IR repair to standardize repair cleanup and error handling of failed RepairJobs (CASSANDRA-17069)
+ * Log missing peers in StartupClusterConnectivityChecker (CASSANDRA-17130)
+ * Introduce separate rate limiting settings for entire SSTable streaming (CASSANDRA-17065)
+ * Implement Virtual Tables for Auth Caches (CASSANDRA-16914)
+ * Actively update auth cache in the background (CASSANDRA-16957)
+ * Add unix time conversion functions (CASSANDRA-17029)
+ * JVMStabilityInspector.forceHeapSpaceOomMaybe should handle all non-heap OOMs rather than only supporting direct only (CASSANDRA-17128)
+ * Forbid other Future implementations with checkstyle (CASSANDRA-17055)
+ * commit log was switched from non-daemon to daemon threads, which causes the JVM to exit in some case as no non-daemon threads are active (CASSANDRA-17085)
+ * Add a Denylist to block reads and writes on specific partition keys (CASSANDRA-12106)
+ * v4+ protocol did not clean up client warnings, which caused leaking the state (CASSANDRA-17054)
+ * Remove duplicate toCQLString in ReadCommand (CASSANDRA-17023)
+ * Ensure hint window is persistent across restarts of a node (CASSANDRA-14309)
+ * Allow to GRANT or REVOKE multiple permissions in a single statement (CASSANDRA-17030)
+ * Allow to grant permission for all tables in a keyspace (CASSANDRA-17027)
+ * Log time spent writing keys during compaction (CASSANDRA-17037)
+ * Make nodetool compactionstats and sstable_tasks consistent (CASSANDRA-16976)
+ * Add metrics and logging around index summary redistribution (CASSANDRA-17036)
+ * Add configuration options for minimum allowable replication factor and default replication factor (CASSANDRA-14557)
+ * Expose information about stored hints via a nodetool command and a virtual table (CASSANDRA-14795)
+ * Add broadcast_rpc_address to system.local (CASSANDRA-11181)
+ * Add support for type casting in WHERE clause components and in the values of INSERT/UPDATE statements (CASSANDRA-14337)
+ * add credentials file support to CQLSH (CASSANDRA-16983)
+ * Skip remaining bytes in the Envelope buffer when a ProtocolException is thrown to avoid double decoding (CASSANDRA-17026)
+ * Allow reverse iteration of resources during permissions checking (CASSANDRA-17016)
+ * Add feature to verify correct ownership of attached locations on disk at startup (CASSANDRA-16879)
+ * Make SSLContext creation pluggable/extensible (CASSANDRA-16666)
+ * Add soft/hard limits to local reads to protect against reading too much data in a single query (CASSANDRA-16896)
+ * Avoid token cache invalidation for removing a non-member node (CASSANDRA-15290)
+ * Allow configuration of consistency levels on auth operations (CASSANDRA-12988)
+ * Add number of sstables in a compaction to compactionstats output (CASSANDRA-16844)
+ * Upgrade Caffeine to 2.9.2 (CASSANDRA-15153)
+ * Allow DELETE and TRUNCATE to work on Virtual Tables if the implementation allows it (CASSANDRA-16806)
+ * Include SASI components to snapshots (CASSANDRA-15134)
+ * Fix missed wait latencies in the output of `nodetool tpstats -F` (CASSANDRA-16938)
+ * Reduce native transport max frame size to 16MB (CASSANDRA-16886)
+ * Add support for filtering using IN restrictions (CASSANDRA-14344)
+ * Provide a nodetool command to invalidate auth caches (CASSANDRA-16404)
+ * Catch read repair timeout exceptions and add metric (CASSANDRA-16880)
+ * Exclude Jackson 1.x transitive dependency of hadoop* provided dependencies (CASSANDRA-16854)
+ * Add client warnings and abort to tombstone and coordinator reads which go past a low/high watermark (CASSANDRA-16850)
+ * Add TTL support to nodetool snapshots (CASSANDRA-16789)
+ * Allow CommitLogSegmentReader to optionally skip sync marker CRC checks (CASSANDRA-16842)
+ * allow blocking IPs from updating metrics about traffic (CASSANDRA-16859)
+ * Request-Based Native Transport Rate-Limiting (CASSANDRA-16663)
+ * Implement nodetool getauditlog command (CASSANDRA-16725)
+ * Clean up repair code (CASSANDRA-13720)
+ * Background schedule to clean up orphaned hints files (CASSANDRA-16815)
+ * Modify SecondaryIndexManager#indexPartition() to retrieve only columns for which indexes are actually being built (CASSANDRA-16776)
+ * Batch the token metadata update to improve the speed (CASSANDRA-15291)
+ * Reduce the log level on "expected" repair exceptions (CASSANDRA-16775)
+ * Make JMXTimer expose attributes using consistent time unit (CASSANDRA-16760)
+ * Remove check on gossip status from DynamicEndpointSnitch::updateScores (CASSANDRA-11671)
+ * Fix AbstractReadQuery::toCQLString not returning valid CQL (CASSANDRA-16510)
+ * Log when compacting many tombstones (CASSANDRA-16780)
+ * Display bytes per level in tablestats for LCS tables (CASSANDRA-16799)
+ * Add isolated flush timer to CommitLogMetrics and ensure writes correspond to single WaitingOnCommit data points (CASSANDRA-16701)
+ * GossiperTest.testHasVersion3Nodes didn't take into account trunk version changes, fixed to rely on latest version (CASSANDRA-16651)
+ * Update JNA library to 5.9.0 and snappy-java to version 1.1.8.4 (CASSANDRA-17040)
+Merged from 4.0:
+ * Utilise BTree improvements to reduce garbage and improve throughput (CASSANDRA-15511)
+Merged from 3.11:
 Merged from 3.0:
  * Fix writetime and ttl functions forbidden for collections instead of multicell columns (CASSANDRA-17628)
  * Fix issue where frozen maps may not be serialized in the correct order (CASSANDRA-17623)
  * Suppress CVE-2022-24823 (CASSANDRA-17633)
  * fsync TOC and digest files (CASSANDRA-10709)
 
+
 4.0.4
  * Optimise BTree build,update and transform operations (CASSANDRA-15510)
  * Clean up schema migration coordinator and tests (CASSANDRA-17533)
@@ -148,10 +385,6 @@
  * Fix ignored streaming encryption settings in sstableloader (CASSANDRA-17367)
  * Streaming tasks handle empty SSTables correctly (CASSANDRA-16349)
  * Prevent SSTableLoader from doing unnecessary work (CASSANDRA-16349)
- * emit warning on keyspace creation when replication factor is bigger than the number of nodes (CASSANDRA-16747)
- * Fix snapshot true size calculation (CASSANDRA-17267)
- * dropping of a materialized view creates a snapshot with dropped- prefix (CASSANDRA-17415)
- * Validate existence of DCs when repairing (CASSANDRA-17407)
 Merged from 3.11:
  * Upgrade jackson-databind to 2.13.2.2 (CASSANDRA-17556)
  * Upgrade slf4j to 1.7.25 (CASSANDRA-17474)
@@ -161,6 +394,7 @@
  * Validate existence of DCs when repairing (CASSANDRA-17407)
  * dropping of a materialized view creates a snapshot with dropped- prefix (CASSANDRA-17415)
 Merged from 3.0:
+ * fsync TOC and digest files (CASSANDRA-10709)
  * Fix URISyntaxException in nodetool with updated Java (CASSANDRA-17581)
  * Schema mutations may not be completed on drain (CASSANDRA-17524)
  * Fix data corruption in AbstractCompositeType due to static boolean byte buffers (CASSANDRA-14752)
@@ -179,8 +413,6 @@
  * Deprecate otc_coalescing_strategy, otc_coalescing_window_us, otc_coalescing_enough_coalesced_messages,
    otc_backlog_expiration_interval_ms (CASSANDRA-17377)
  * Improve start up processing of Incremental Repair information read from system.repairs (CASSANDRA-17342)
-
-4.0.2
  * Extend operator control over the UDF threading model for CVE-2021-44521 (CASSANDRA-17352)
  * Full Java 11 support (CASSANDRA-16894)
  * Remove unused 'geomet' package from cqlsh path (CASSANDRA-17271)
@@ -204,19 +436,54 @@
  * Avoid rewriting all sstables during cleanup when transient replication is enabled (CASSANDRA-16966)
  * Prevent CQLSH from failure on Python 3.10 (CASSANDRA-16987)
  * Avoid trying to acquire 0 permits from the rate limiter when taking snapshot (CASSANDRA-16872)
- * Upgrade Caffeine to 2.5.6 (CASSANDRA-15153)
- * Include SASI components to snapshots (CASSANDRA-15134)
- * Fix missed wait latencies in the output of `nodetool tpstats -F` (CASSANDRA-16938)
  * Remove all the state pollution between tests in SSTableReaderTest (CASSANDRA-16888)
  * Delay auth setup until after gossip has settled to avoid unavailables on startup (CASSANDRA-16783)
- * Fix clustering order logic in CREATE MATERIALIZED VIEW (CASSANDRA-16898)
  * org.apache.cassandra.db.rows.ArrayCell#unsharedHeapSizeExcludingData includes data twice (CASSANDRA-16900)
+ * Fix clustering order logic in CREATE MATERIALIZED VIEW (CASSANDRA-16898)
  * Exclude Jackson 1.x transitive dependency of hadoop* provided dependencies (CASSANDRA-16854)
+ * Tolerate missing DNS entry when completing a host replacement (CASSANDRA-16873)
+ * Harden PrunableArrayQueue against Pruner implementations that might throw exceptions (CASSANDRA-16866)
+ * Move RepairedDataInfo to the execution controller rather than the ReadCommand to avoid unintended sharing (CASSANDRA-16721)
+ * Bump zstd-jni version to 1.5.0-4 (CASSANDRA-16884)
+ * Remove assumption that all urgent messages are small (CASSANDRA-16877)
+ * ArrayClustering.unsharedHeapSize does not include the data so undercounts the heap size (CASSANDRA-16845)
+ * Improve help, doc and error messages about sstabledump -k and -x arguments (CASSANDRA-16818)
+ * Add repaired/unrepaired bytes back to nodetool (CASSANDRA-15282)
+ * Upgrade lz4-java to 1.8.0 to add RH6 support back (CASSANDRA-16753)
+ * Improve DiagnosticEventService.publish(event) logging message of events (CASSANDRA-16749)
+ * Cleanup dependency scopes (CASSANDRA-16704)
+ * Make JmxHistogram#getRecentValues() and JmxTimer#getRecentValues() thread-safe (CASSANDRA-16707)
 Merged from 3.11:
+ * Upgrade jackson-databind to 2.13.2.2 (CASSANDRA-17556)
+ * Upgrade slf4j to 1.7.25 (CASSANDRA-17474)
+ * Upgrade jackson to 2.13.2 (CASSANDRA-17492)
+ * emit warning on keyspace creation when replication factor is bigger than the number of nodes (CASSANDRA-16747)
+ * Fix snapshot true size calculation (CASSANDRA-17267)
+ * dropping of a materialized view creates a snapshot with dropped- prefix (CASSANDRA-17415)
+ * Validate existence of DCs when repairing (CASSANDRA-17407)
  * Add key validation to ssstablescrub (CASSANDRA-16969)
  * Update Jackson from 2.9.10 to 2.12.5 (CASSANDRA-16851)
  * Make assassinate more resilient to missing tokens (CASSANDRA-16847)
+ * Validate SASI tokenizer options before adding index to schema (CASSANDRA-15135)
+ * Fixup scrub output when no data post-scrub and clear up old use of row, which really means partition (CASSANDRA-16835)
+ * Reduce thread contention in CommitLogSegment and HintsBuffer (CASSANDRA-16072)
+ * Make cqlsh use the same set of reserved keywords than the server uses (CASSANDRA-15663)
+ * Optimize bytes skipping when reading SSTable files (CASSANDRA-14415)
+ * Enable tombstone compactions when unchecked_tombstone_compaction is set in TWCS (CASSANDRA-14496)
+ * Read only the required SSTables for single partition queries (CASSANDRA-16737)
 Merged from 3.0:
+ * Schema mutations may not be completed on drain (CASSANDRA-17524)
+ * Fix data corruption in AbstractCompositeType due to static boolean byte buffers (CASSANDRA-14752)
+ * Add procps dependency to RPM/Debian packages (CASSANDRA-17516)
+ * Suppress CVE-2021-44521 (CASSANDRA-17492)
+ * ConnectionLimitHandler may leaks connection count if remote connection drops (CASSANDRA-17252)
+ * Require ant >= 1.10 (CASSANDRA-17428)
+ * Disallow CONTAINS for UPDATE and DELETE (CASSANDRA-15266)
+ * Suppress inapplicable CVEs (CASSANDRA-17368)
+ * Fix flaky test - test_cqlsh_completion.TestCqlshCompletion (CASSANDRA-17338)
+ * Fixed TestCqlshOutput failing tests (CASSANDRA-17386)
+ * Lazy transaction log replica creation allows incorrect replica content divergence during anticompaction (CASSANDRA-17273)
+ * LeveledCompactionStrategy disk space check improvements (CASSANDRA-17272)
  * Fix conversion from megabits to bytes in streaming rate limiter (CASSANDRA-17243)
  * Upgrade logback to 1.2.9 (CASSANDRA-17204)
  * Avoid race in AbstractReplicationStrategy endpoint caching (CASSANDRA-16673)
@@ -237,30 +504,7 @@
  * Catch UnsatisfiedLinkError in WindowsTimer (CASSANDRA-16085)
  * Avoid removing batch when it's not created during view replication (CASSANDRA-16175)
  * Make the addition of regular column to COMPACT tables throw an InvalidRequestException (CASSANDRA-14564)
- * Race in CompactionExecutorTest (CASSANDRA-17239)
-
-4.0.1
- * Tolerate missing DNS entry when completing a host replacement (CASSANDRA-16873)
- * Harden PrunableArrayQueue against Pruner implementations that might throw exceptions (CASSANDRA-16866)
- * Move RepairedDataInfo to the execution controller rather than the ReadCommand to avoid unintended sharing (CASSANDRA-16721)
- * Bump zstd-jni version to 1.5.0-4 (CASSANDRA-16884)
- * Remove assumption that all urgent messages are small (CASSANDRA-16877)
- * ArrayClustering.unsharedHeapSize does not include the data so undercounts the heap size (CASSANDRA-16845)
- * Improve help, doc and error messages about sstabledump -k and -x arguments (CASSANDRA-16818)
- * Add repaired/unrepaired bytes back to nodetool (CASSANDRA-15282)
- * Upgrade lz4-java to 1.8.0 to add RH6 support back (CASSANDRA-16753)
- * Improve DiagnosticEventService.publish(event) logging message of events (CASSANDRA-16749)
- * Cleanup dependency scopes (CASSANDRA-16704)
- * Make JmxHistogram#getRecentValues() and JmxTimer#getRecentValues() thread-safe (CASSANDRA-16707)
-Merged from 3.11:
- * Validate SASI tokenizer options before adding index to schema (CASSANDRA-15135)
- * Fixup scrub output when no data post-scrub and clear up old use of row, which really means partition (CASSANDRA-16835)
- * Reduce thread contention in CommitLogSegment and HintsBuffer (CASSANDRA-16072)
- * Make cqlsh use the same set of reserved keywords than the server uses (CASSANDRA-15663)
- * Optimize bytes skipping when reading SSTable files (CASSANDRA-14415)
- * Enable tombstone compactions when unchecked_tombstone_compaction is set in TWCS (CASSANDRA-14496)
- * Read only the required SSTables for single partition queries (CASSANDRA-16737)
-Merged from 3.0:
+ * Make the addition of regular column to COMPACT tables throw an InvalidRequestException (CASSANDRA-14564)
  * Fix secondary indexes on primary key columns skipping some writes (CASSANDRA-16868)
  * Use JMX to validate nodetool --jobs parameter (CASSANDRA-16104)
  * Handle properly UnsatisfiedLinkError in NativeLibrary#getProcessID() (CASSANDRA-16578)
@@ -281,8 +525,6 @@
  * Fix fwd to/from headers in DC write forwarding (CASSANDRA-16797)
  * Fix CassandraVersion::compareTo (CASSANDRA-16794)
  * BinLog does not close chronicle queue leaving this to GC to cleanup (CASSANDRA-16774)
-Merged from 3.11:
-Merged from 3.0:
 
 4.0-rc2
  * Improved password obfuscation (CASSANDRA-16801)
diff --git a/NEWS.txt b/NEWS.txt
index 4915652..0930ac0 100644
--- a/NEWS.txt
+++ b/NEWS.txt
@@ -51,86 +51,257 @@
 'sstableloader' tool. You can upgrade the file format of your snapshots
 using the provided 'sstableupgrade' tool.
 
-4.0.8
+
+4.1.1
 =====
 
-New features
-------------
+G1GC Recommended
+----------------
+    - The G1 settings in jvm8-server.options and jvm11-server.options are updated according to broad feedback
+      and testing. The G1 settings remain commented out by default in 4.1.x. It is recommended to switch
+      to G1 for performance and for simpler GC tuning. CMS is already deprecated in JDK9, and the next major
+      release of Cassandra makes G1 the default configuration.
 
 Upgrading
 ---------
     - All previous versions of 4.x contained a mistake on the implementation of the old CQL native protocol v3. That
-    mistake produced issues when paging over tables with compact storage and a single clustering column during rolling
-    upgrades involving 3.x and 4.x nodes. The fix for that issue makes it can now appear during rolling upgrades from
-    4.0.0-4.0.7. If that is your case, please use protocol v4 or higher in your driver. See CASSANDRA-17507 for further
-    details.
-
-4.0.6
-=====
-
-New features
-------------
-
-
-Upgrading
----------
-    - If you haven't set the compaction_thoroughput_mb_per_sec in your 4.0 cassandra.yaml file but you relied on the internal
-     default value,then compaction_throughput_mb_per_sec was equal to an old default value of 16MiB/s in Cassandra 4.0.
-     After CASSANDRA-17790 this is changed to 64MiB/s to match the default value in cassandra.yaml. If you prefer the old
-     one of 16MiB/s, you need to set it explicitly in your cassandra.yaml file.
+     mistake produced issues when paging over tables with compact storage and a single clustering column during rolling
+     upgrades involving 3.x and 4.x nodes. The fix for that issue makes it can now appear during rolling upgrades from
+     4.1.0 or 4.0.0-4.0.7. If that is your case, please use protocol v4 or higher in your driver. See CASSANDRA-17507
+     for further details.
 
 Deprecation
----------
+-----------
+    - Hadoop integration in package org.apache.cassandra.hadoop is deprecated and no longer actively maintained.
+      This code is scheduled to be removed in the next major version of Cassandra.
 
-4.0.3
-=====
+4.1
+===
 
 New features
 ------------
-
-
-Upgrading
----------
-    - otc_coalescing_strategy, otc_coalescing_window_us, otc_coalescing_enough_coalesced_messages,
-      otc_backlog_expiration_interval_ms are deprecated and will be removed at earliest with next major release.
-      otc_coalescing_strategy is disabled since 3.11.
-
-Deprecation
----------
-    - JavaScript user-defined functions have been deprecated. They are planned for removal
-      in the next major release. (CASSANDRA-17280)
-
-4.0.2
-=====
-
-New features
-------------
-    - Full support for Java 11, it is not experimental anymore.
+    - Added API for alternative memtable implementations. For details, see
+      src/java/org/apache/cassandra/db/memtable/Memtable_API.md
+    - Added a new guardrails framework allowing to define soft/hard limits for different user actions, such as limiting
+      the number of tables, columns per table or the size of collections. These guardrails are only applied to regular
+      user queries, and superusers and internal queries are excluded. Reaching the soft limit raises a client warning,
+      whereas reaching the hard limit aborts the query. In both cases a log message and a diagnostic event are emitted.
+      Additionally, some guardrails are not linked to specific user queries due to techincal limitations, such as
+      detecting the size of large collections during compaction or periodically monitoring the disk usage. These
+      guardrails would only emit the proper logs and diagnostic events when triggered, without aborting any processes.
+      Guardrails config is defined through cassandra.yaml properties, and they can be dynamically updated through the
+      JMX MBean `org.apache.cassandra.db:type=Guardrails`. There are guardrails for:
+        - Number of user keyspaces.
+        - Number of user tables.
+        - Number of columns per table.
+        - Number of secondary indexes per table.
+        - Number of materialized tables per table.
+        - Number of fields per user-defined type.
+        - Number of items in a collection .
+        - Number of partition keys selected by an IN restriction.
+        - Number of partition keys selected by the cartesian product of multiple IN restrictions.
+        - Allowed table properties.
+        - Allowed read consistency levels.
+        - Allowed write consistency levels.
+        - Collections size.
+        - Query page size.
+        - Minimum replication factor.
+        - Data disk usage, defined either as a percentage or as an absolute size.
+        - Whether user-defined timestamps are allowed.
+        - Whether GROUP BY queries are allowed.
+        - Whether the creation of secondary indexes is allowed.
+        - Whether the creation of uncompressed tables is allowed.
+        - Whether querying with ALLOW FILTERING is allowed.
+        - Whether DROP or TRUNCATE TABLE commands are allowed.
+    - Add support for the use of pure monotonic functions on the last attribute of the GROUP BY clause.
+    - Add floor functions that can be use to group by time range.
+    - Support for native transport rate limiting via native_transport_rate_limiting_enabled and
+      native_transport_max_requests_per_second in cassandra.yaml.
+    - Support for pre hashing passwords on CQL DCL commands
+    - Expose all client options via system_views.clients and nodetool clientstats --client-options.
+    - Add new nodetool compactionstats --vtable option to match the sstable_tasks vtable.
+    - Support for String concatenation has been added through the + operator.
+    - New configuration max_hints_size_per_host to limit the size of local hints files per host in mebibytes. Setting to
+      non-positive value disables the limit, which is the default behavior. Setting to a positive value to ensure
+      the total size of the hints files per host does not exceed the limit.
+    - Added ability to configure auth caches through corresponding `nodetool` commands.
+    - CDC data flushing now can be configured to be non-blocking with the configuration cdc_block_writes. Setting to true,
+      any writes to the CDC-enabled tables will be blocked when reaching to the limit for CDC data on disk, which is the
+      existing and the default behavior. Setting to false, the writes to the CDC-enabled tables will be accepted and
+      the oldest CDC data on disk will be deleted to ensure the size constraint.
+    - Top partitions based on partition size or tombstone count are now tracked per table. These partitions are stored
+      in a new system.top_partitions table and exposed via JMX and nodetool tablestats. The partitions are tracked
+      during full or validation repairs but not incremental ones since those don't include all sstables and the partition
+      size/tombstone count would not be correct.
+    - New native functions to convert unix time values into C* native types: toDate(bigint), toTimestamp(bigint),
+      mintimeuuid(bigint) and maxtimeuuid(bigint)
+    - Support for multiple permission in a single GRANT/REVOKE/LIST statement has been added. It allows to
+      grant/revoke/list multiple permissions using a single statement by providing a list of comma-separated
+      permissions.
+    - A new ALL TABLES IN KEYSPACE resource has been added. It allows to grant permissions for all tables and user types
+      in a keyspace while preventing the user to use those permissions on the keyspace itself.
+    - Added support for type casting in the WHERE clause components and in the values of INSERT and UPDATE statements.
+    - A new implementation of Paxos (named v2) has been included that improves the safety and performance of LWT operations.
+      Importantly, v2 guarantees linearizability across safe range movements, so users are encouraged to enable v2.
+      v2 also halves the number of WAN messages required to be exchanged if used on conjunction with the new Paxos Repair
+      mechanism (see below) and with some minor modifications to applications using LWTs.
+      The new implementation may be enabled at any time by setting paxos_variant: v2, and disabled by setting to v1,
+      and this alone will reduce the number of WAN round-trips by between one and two for reads, and one for writes.
+    - A new Paxos Repair mechanism has been introduced as part of Repair, that permits further reducing the number of WAN
+      round-trips for write LWTs. This process may be manually executed for v1 and is run automatically alongside normal
+      repairs for v2. Once users are running regular repairs that include paxos repairs they are encouraged to set
+      paxos_state_purging: repaired. Once this has been set across the cluster, users are encouraged to set their
+      applications to supply a Commit consistency level of ANY with their LWT write operations, saving one additional WAN
+      round-trip. See upgrade notes below.
+    - Warn/fail thresholds added to read queries notifying clients when these thresholds trigger (by
+      emitting a client warning or failing the query).  This feature is disabled by default, scheduled
+      to be enabled in 4.2; it is controlled with the configuration read_thresholds_enabled,
+      setting to true will enable this feature.  Each check has its own warn/fail thresholds, currently
+      tombstones (tombstone_warn_threshold, and tombstone_failure_threshold), coordinator result set
+      materialized size (coordinator_read_size_warn_threshold and coordinator_read_size_fail_threshold),
+      local read materialized heap size
+      (local_read_size_warn_threshold and local_read_size_fail_threshold),
+      and RowIndexEntry estimated memory size (row_index_read_size_warn_threshold and
+      row_index_read_size_fail_threshold) are supported; more checks will be added over time.
+    - Prior to this version, the hint system was storing a window of hints as defined by
+      configuration property max_hint_window_in_ms, however this window is not persistent across restarts.
+      For example, if a node is restarted, it will be still eligible for a hint to be sent to it because it
+      was down less than max_hint_window_in_ms. Hence if that node continues restarting without hint delivery completing,
+      hints will be sent to that node indefinitely which would occupy more and more disk space.
+      This behaviour was changed in CASSANDRA-14309. From now on, by default, if a node is not down longer than
+      max_hint_window_in_ms, there is an additional check to see if there is a hint to be delivered which is older
+      than max_window_in_ms. If there is, a hint is not persisted. If there is not, it is.
+      This behaviour might be reverted as it was in previous version by property hint_window_persistent_enabled by
+      setting it to false. This property is by default set to true.
+    - Added a new feature to allow denylisting (i.e. blocking read, write, or range read configurable) access to partition
+      keys in configured keyspaces and tables. See doc/operating/denylisting_partitions.rst for details on using this new
+      feature. Also see CASSANDRA-12106.
+    - Information about pending hints is now available through `nodetool listpendinghints` and `pending_hints` virtual
+      table.
+    - Added ability to invalidate auth caches through corresponding `nodetool` commands and virtual tables.
     - DCL statements in audit logs will now obscure only the password if they don't fail to parse.
+    - Starting from 4.1 sstables support UUID based generation identifiers. They are globally unique and thus they let
+      the node to create sstables without any prior knowledge about the existing sstables in the data directory.
+      The feature is disabled by default in cassandra.yaml because once enabled, there is no easy way to downgrade.
+      When the node is restarted with UUID based generation identifiers enabled, each newly created sstable will have
+      a UUID based generation identifier and such files are not readable by previous Cassandra versions. In the future
+      those new identifiers will become enabled by default.
+    - Resetting schema behavior has changed in 4.1 so that: 1) resetting schema is prohibited when there is no live node
+      where the schema could be fetched from, and 2) truncating local schema keyspace is postponed to the moment when
+      the node receives schema from some other node.
 
 Upgrading
 ---------
+    - `cache_load_timeout_seconds` being negative for disabled is equivalent to `cache_load_timeout` = 0 for disabled.
+    - `sstable_preemptive_open_interval_in_mb` being negative for disabled is equivalent to `sstable_preemptive_open_interval`
+      being null again. In the JMX MBean `org.apache.cassandra.db:type=StorageService`, the setter method
+      `setSSTablePreemptiveOpenIntervalInMB`still takes `intervalInMB` negative numbers for disabled.
+    - `enable_uuid_sstable_identifiers` parameter from 4.1 alpha1 was renamed to `uuid_sstable_identifiers_enabled`.
+    - `index_summary_resize_interval_in_minutes = -1` is equivalent to index_summary_resize_interval being set to `null` or
+      disabled. In the JMX MBean `org.apache.cassandra.db:type=IndexSummaryManager`, the setter method `setResizeIntervalInMinutes` still takes
+      `resizeIntervalInMinutes = -1` for disabled.
+    - min_tracked_partition_size_bytes parameter from 4.1 alpha1 was renamed to min_tracked_partition_size.
+    - Parameters of type data storage, duration and data rate cannot be set to Long.MAX_VALUE (former parameters of long type)
+      and Integer.MAX_VALUE (former parameters of int type). Those numbers are used during conversion between units to prevent
+      an overflow from happening. (CASSANDRA-17571)
+    - We added new JMX methods `setStreamThroughputMbitPerSec`, `getStreamThroughputMbitPerSec`, `setInterDCStreamThroughputMbitPerSec`,
+      `getInterDCStreamThroughputMbitPerSec` to the JMX MBean `org.apache.cassandra.db:type=StorageService`. They replace the now
+      deprecated methods `setStreamThroughputMbPerSec`, `getStreamThroughputMbPerSec`, `setInterDCStreamThroughputMbPerSec`, and
+      `getInterDCStreamThroughputMbPerSec`, which will be removed in a future major release.
+    - The config property `repair_session_space_in_mb` was wrongly advertised in previous versions that it should be set in
+      megabytes when it is interpreted internally in mebibytes. To reduce the confusion we added two new JMX methods
+      `setRepairSessionSpaceInMebibytes(int sizeInMebibytes)` and `getRepairSessionSpaceInMebibytes`. They replace the now
+      deprecated methods `setRepairSessionSpaceInMegabytes(int sizeInMegabytes)` and `getRepairSessionSpaceInMegabytes`, which
+      will be removed in a future major release.
+    - There is a new cassandra.yaml version 2. Units suffixes should be provided for all rates(B/s|KiB/s|MiB/s),
+      memory (B|KiB|MiB|GiB) and duration(d|h|m|s|ms|us|µs|ns)
+      parameters. List of changed parameters and details to consider during configuration setup can be
+      found at https://cassandra.apache.org/doc/latest/cassandra/new/configuration.html. (CASSANDRA-15234)
+      Backward compatibility with the old cassandra.yaml file will be in place until at least the next major version.
+      By default we refuse starting Cassandra with a config containing both old and new config keys for the same parameter. Start
+      Cassandra with -Dcassandra.allow_new_old_config_keys=true to override. For historical reasons duplicate config keys
+      in cassandra.yaml are allowed by default, start Cassandra with -Dcassandra.allow_duplicate_config_keys=false to disallow this.
+    - Many cassandra.yaml parameters' names have been changed. Full list and details to consider during configuration setup
+      when installing/upgrading Cassandra can be found at https://cassandra.apache.org/doc/latest/cassandra/new/configuration.html (CASSANDRA-15234)
+    - Negative values cannot be used for parameters of type data rate, duration and data storage with both old and new cassandra.yaml version.
+      Only exception is if you use old cassandra.yaml, pre-CASSANDRA-15234 - then -1 or other negative values which were advertised as an option
+      to disable config parameters in the old cassandra.yaml are still used. Those are probably converted to null value with the new cassandra.yaml,
+      as written in the new cassandra.yaml version and docs.
+    - Before you upgrade, if you are using `cassandra.auth_bcrypt_gensalt_log2_rounds` property,
+      confirm it is set to value lower than 31 otherwise Cassandra will fail to start. See CASSANDRA-9384
+      for further details. You also need to regenerate passwords for users for who the password
+      was created while the above property was set to be more than 30 otherwise they will not be able to log in.
+    - JNA library was updated from 5.6.0 to 5.9.0. In version 5.7.0, Darwin support for M1 devices
+      was fixed but prebuild native library for Darwin x86 (32bit Java on Mac OS) was removed.
     - The config properties for setting the streaming throughput `stream_throughput_outbound_megabits_per_sec` and
       `inter_dc_stream_throughput_outbound_megabits_per_sec` were incorrectly interpreted as mebibits. This has
       been fixed by CASSANDRA-17243, so the values for these properties will now indicate a throughput ~4.6% lower than
       what was actually applied in previous versions. This also affects the setters and getters for these properties in
       the JMX MBean `org.apache.cassandra.db:type=StorageService` and the nodetool commands `set/getstreamthroughput`
       and `set/getinterdcstreamthroughput`.
-    - Before you upgrade, if you are using `cassandra.auth_bcrypt_gensalt_log2_rounds` property,
-      confirm it is set to value lower than 31 otherwise Cassandra will fail to start. See CASSANDRA-9384
-      for further details. You also need to regenerate passwords for users for who the password
-      was created while the above property was set to be more than 30 otherwise they will not be able to log in.
-    - As part of the Internode Messaging improvement work in CASSANDRA-15066, internode_send_buff_size_in_bytes and
-      internode_recv_buff_size_in_bytes were renamed to internode_socket_send_buffer_size_in_bytes and
-      internode_socket_receive_buffer_size_in_bytes. To support upgrades pre-4.0, we add backward compatibility and
-      currently both old and new names should work. Cassandra 4.0.0 and Cassandra 4.0.1 work ONLY with the new names
-      (They weren't updated in cassandra.yaml though).
+    - Steps for upgrading Paxos
+        - Set paxos_variant: v2 across the cluster. This may be set via JMX, but should also be written
+          persistently to any yaml.
+        - Ensure paxos repairs are running regularly, either as part of normal incremental repair workflows or on their
+          own separate schedule. These operations are cheap and better to run frequently (e.g. once per hour)
+        - Set paxos_state_purging: repaired across the cluster.  This may be set via JMX, but should also be written
+          persistently to any yaml. NOTE: once this has been set, you must not restore paxos_state_purging: legacy. If
+          this setting must be disabled you must instead set paxos_state_purging: gc_grace. This may be necessary if
+          paxos repairs must be disabled for some reason on an extended basis, but in this case your applications must
+          restore default commit consistency to ensure correctness.
+        - Applications may now safely be updated to use ANY commit consistency level (or LOCAL_QUORUM, as preferred).
+          Uncontended writes should now take 2 round-trips, and uncontended reads should typically take one round-trip.
+    - A required [f|force] flag has been added to both "nodetool verify" and the standalone "sstableverify" tools.
+      These tools have some subtleties and should not be used unless the operator is familiar with what they do
+      and do not do, as well as the edge cases associated with their use.
+      NOTE: ANY SCRIPTS THAT RELY ON sstableverify OR nodetool verify WILL STOP WORKING UNTIL MODIFIED.
+      Please see CASSANDRA-17017 for details: https://issues.apache.org/jira/browse/CASSANDRA-17017
+    - `MutationExceededMaxSizeException` thrown when a mutation exceeds `max_mutation_size` inherits
+      from `InvalidRequestException` instead of `RuntimeException`. See CASSANDRA-17456 for details.
+
+Deprecation
+-----------
+    - In the command line options for `org.apache.cassandra.tools.LoaderOptions`: deprecate the `-t`, `--throttle`,
+      `-idct`, and `--inter-dc-throttle` options for setting the throttle and inter-datacenter throttle options in
+      Mbps. Instead, users are instructed to use the `--throttle-mib`, and `--inter-dc-throttle-mib` for setting the
+      throttling options in MiB/s. Additionally, in the loader options builder
+      `org.apache.cassandra.tools.LoaderOptions$Builder`: deprecate the `throttle(int)`, `interDcThrottle(int)`,
+      `entireSSTableThrottle(int)`, and the `entireSSTableInterDcThrottle(int)` methods.
+    - In the JMX MBean `org.apache.cassandra.db:type=StorageService`: deprecate getter method `getStreamThroughputMbitPerSec`
+      in favor of getter method `getStreamThroughputMbitPerSecAsDouble`; deprecate getter method `getStreamThroughputMbPerSec`
+      in favor of getter methods `getStreamThroughputMebibytesPerSec` and `getStreamThroughputMebibytesPerSecAsDouble`;
+      deprecate getter method `getInterDCStreamThroughputMbitPerSec` in favor of getter method `getInterDCStreamThroughputMbitPerSecAsDouble`;
+      deprecate getter method `getInterDCStreamThroughputMbPerSec` in favor of getter methods `getInterDCStreamThroughputMebibytesPerSecAsDouble`;
+      deprecate getter method `getCompactionThroughputMbPerSec` in favor of getter methods `getCompactionThroughtputMibPerSecAsDouble`
+      and `getCompactionThroughtputBytesPerSec`; deprecate setter methods `setStreamThroughputMbPerSec` and `setStreamThroughputMbitPerSec`
+      in favor of `setStreamThroughputMebibytesPerSec`; deprecate setter methods `setInterDCStreamThroughputMbitPerSec` and
+      `setInterDCStreamThroughputMbPerSec` in favor of `setInterDCStreamThroughputMebibytesPerSec`. The deprecated JMX methods
+      may return a rounded value so if precision is important, you want to use the new getters. While those deprecated JMX getters
+      will return a rounded number, the nodetool commands `getstreamthroughput` and `getinterdcstreamthroughput`
+      will throw Runtime Exceptions advising to use the new -d flag in case an integer cannot be returned. See CASSANDRA-17725 for further details.
+    - Deprecate public method `setRate(final double throughputMbPerSec)` in `Compaction Manager` in favor of
+      `setRateInBytes(final double throughputBytesPerSec)`
+    - `withBufferSizeInMB(int size)` in `StressCQLSSTableWriter.Builder` class is deprecated in favor of `withBufferSizeInMiB(int size)`
+      No change of functionality in the new one, only name change for clarity in regards to units and to follow naming
+      standartization.
+    - `withBufferSizeInMB(int size)` in `CQLSSTableWriter.Builder` class is deprecated in favor of `withBufferSizeInMiB(int size)`
+      No change of functionality in the new one, only name change for clarity in regards to units and to follow naming
+      standartization.
+    - The properties `keyspace_count_warn_threshold` and `table_count_warn_threshold` in cassandra.yaml have been
+      deprecated in favour of the new `guardrails.keyspaces` and `guardrails.tables` properties and will be removed
+      in a subsequent major version. This also affects the setters and getters for those properties in the JMX MBean
+      `org.apache.cassandra.db:type=StorageService`, which are equally deprecated in favour of the analogous methods
+      in the JMX MBean `org.apache.cassandra.db:type=Guardrails`. See CASSANDRA-17195 for further details.
+    - The functionality behind the property `windows_timer_interval` was removed as part of CASSANDRA-16956. The
+      property is still present but it is deprecated and it is just a place-holder to prevent breaking upgrades. This
+      property is expected to be fully removed in the next major release of Cassandra.
 
 4.0
 ===
 
 New features
 ------------
+    - Full support for Java 11, it is not experimental anymore.
     - The data of the system keyspaces using a local strategy (at the exception of the system.batches,
       system.paxos, system.compaction_history, system.prepared_statements and system.repair tables)
       is now stored by default in the first data directory, instead of being distributed among all
@@ -214,9 +385,24 @@
       See CASSANDRA-10190 for details.
     - Support for server side DESCRIBE statements has been added. See CASSANDRA-14825
     - It is now possible to rate limit snapshot creation/clearing. See CASSANDRA-13019
+    - Authentication reads and writes have been changed from a mix of ONE, LOCAL_ONE, and QUORUM
+      to LOCAL_QUORUM on reads and EACH_QUORUM on writes. This is configurable via cassandra.yaml with
+      auth_read_consistency_level and auth_write_consistency_level respectively. See CASSANDRA-12988.
 
 Upgrading
 ---------
+    - If you were on 4.0.1 - 4.0.5 and if you haven't set the compaction_thoroughput_mb_per_sec in your 4.0 cassandra.yaml
+      file but you relied on the internal default value,then compaction_throughput_mb_per_sec was equal to an old default
+      value of 16MiB/s in Cassandra 4.0. After CASSANDRA-17790 this is changed to 64MiB/s to match the default value in
+      cassandra.yaml. If you prefer the old one of 16MiB/s, you need to set it explicitly in your cassandra.yaml file.
+    - otc_coalescing_strategy, otc_coalescing_window_us, otc_coalescing_enough_coalesced_messages,
+      otc_backlog_expiration_interval_ms are deprecated and will be removed at earliest with next major release.
+      otc_coalescing_strategy is disabled since 3.11.
+    - As part of the Internode Messaging improvement work in CASSANDRA-15066, internode_send_buff_size_in_bytes and
+      internode_recv_buff_size_in_bytes were renamed to internode_socket_send_buffer_size_in_bytes and
+      internode_socket_receive_buffer_size_in_bytes. To support upgrades pre-4.0, we add backward compatibility and
+      currently both old and new names should work. Cassandra 4.0.0 and Cassandra 4.0.1 work ONLY with the new names
+      (They weren't updated in cassandra.yaml though).
     - DESCRIBE|DESC was moved to server side in Cassandra 4.0. As a consequence DESRIBE|DESC will not work in cqlsh 6.0.0
       being connected to earlier major Cassandra versions where DESCRIBE does not exist server side.
     - cqlsh shell startup script now prefers 'python3' before 'python' when identifying a runtime.
@@ -382,7 +568,8 @@
 
 Deprecation
 -----------
-
+    - JavaScript user-defined functions have been deprecated. They are planned for removal
+      in the next major release. (CASSANDRA-17280)
     - The JMX MBean org.apache.cassandra.metrics:type=Streaming,name=ActiveOutboundStreams has been
       deprecated and will be removed in a subsequent major version. This metric was not updated since several version
       already.
diff --git a/README.asc b/README.asc
index f1270a8..f484aa2 100644
--- a/README.asc
+++ b/README.asc
@@ -12,7 +12,7 @@
 Requirements
 ------------
 . Java >= 1.8 (OpenJDK and Oracle JVMS have been tested)
-. Python 3.6+ (for cqlsh; 2.7 works but is deprecated)
+. Python 3.6+ (for cqlsh)
 
 Getting started
 ---------------
@@ -39,7 +39,7 @@
 
 ----
 Connected to Test Cluster at localhost:9160.
-[cqlsh 2.2.0 | Cassandra 1.2.0 | CQL spec 3.0.0 | Thrift protocol 19.35.0]
+[cqlsh 6.0.0 | Cassandra 4.1 | CQL spec 3.4.6 | Native protocol v5]
 Use HELP for help.
 cqlsh>
 ----
diff --git a/bin/cassandra b/bin/cassandra
index 1e0b4c0..3fafe91 100755
--- a/bin/cassandra
+++ b/bin/cassandra
@@ -119,14 +119,6 @@
   CASSANDRA_LOG_DIR=$CASSANDRA_HOME/logs
 fi
 
-# Special-case path variables.
-case "`uname`" in
-    CYGWIN*|MINGW*) 
-        CLASSPATH=`cygpath -p -w "$CLASSPATH"`
-        CASSANDRA_CONF=`cygpath -p -w "$CASSANDRA_CONF"`
-    ;;
-esac
-
 # Cassandra uses an installed jemalloc via LD_PRELOAD / DYLD_INSERT_LIBRARIES by default to improve off-heap
 # memory allocation performance. The following code searches for an installed libjemalloc.dylib/.so/.1.so using
 # Linux and OS-X specific approaches.
diff --git a/bin/cqlsh b/bin/cqlsh
index a962e11..90c9b00 100755
--- a/bin/cqlsh
+++ b/bin/cqlsh
@@ -62,8 +62,8 @@
     version=$1
     major_version="${version%.*}"
     minor_version="${version#*.}"
-    # python3.6+ is supported. python2.7 is deprecated but still compatible.
-    if [ "$major_version" = 3 ] && [ "$minor_version" -ge 6 ] || [ "$version" = "2.7" ]; then
+    # python3.6+ is supported
+    if [ "$major_version" = 3 ] && [ "$minor_version" -ge 6 ]; then
         echo "supported"
     else
         echo "unsupported"
@@ -79,6 +79,8 @@
         if [ "$(is_supported_version "$version")" = "supported" ]; then
             exec "$interpreter" "$($interpreter -c "import os; print(os.path.dirname(os.path.realpath('$0')))")/cqlsh.py" "$@"
             exit
+        else
+            echo "Warning: unsupported version of Python:" $version >&2
         fi
     fi
 }
@@ -88,7 +90,7 @@
     # run a user specified Python interpreter
     run_if_supported_version "$USER_SPECIFIED_PYTHON" "$@"
 else
-    for interpreter in python3 python python2.7; do
+    for interpreter in python3 python; do
         run_if_supported_version "$interpreter" "$@"
     done
 fi
diff --git a/bin/cqlsh.py b/bin/cqlsh.py
index df08203..6c1e7bd 100755
--- a/bin/cqlsh.py
+++ b/bin/cqlsh.py
@@ -16,36 +16,38 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import division, unicode_literals, print_function
-
 import cmd
 import codecs
+import configparser
 import csv
+import errno
 import getpass
 import optparse
 import os
 import platform
 import re
+import stat
+import subprocess
 import sys
 import traceback
 import warnings
 import webbrowser
 from contextlib import contextmanager
 from glob import glob
+from io import StringIO
 from uuid import UUID
 
-if sys.version_info < (3, 6) and sys.version_info[0:2] != (2, 7):
-    sys.exit("\ncqlsh requires Python 3.6+ or Python 2.7 (deprecated)\n")
+if sys.version_info < (3, 6):
+    sys.exit("\ncqlsh requires Python 3.6+\n")
 
 # see CASSANDRA-10428
 if platform.python_implementation().startswith('Jython'):
     sys.exit("\nCQL Shell does not run on Jython\n")
 
 UTF8 = 'utf-8'
-CP65001 = 'cp65001'  # Win utf-8 variant
 
 description = "CQL Shell for Apache Cassandra"
-version = "6.0.0"
+version = "6.1.0"
 
 readline = None
 try:
@@ -90,14 +92,8 @@
 # use bundled lib for python-cql if available. if there
 # is a ../lib dir, use bundled libs there preferentially.
 ZIPLIB_DIRS = [os.path.join(CASSANDRA_PATH, 'lib')]
-myplatform = platform.system()
-is_win = myplatform == 'Windows'
 
-# Workaround for supporting CP65001 encoding on python < 3.3 (https://bugs.python.org/issue13216)
-if is_win and sys.version_info < (3, 3):
-    codecs.register(lambda name: codecs.lookup(UTF8) if name == CP65001 else None)
-
-if myplatform == 'Linux':
+if platform.system() == 'Linux':
     ZIPLIB_DIRS.append('/usr/share/cassandra/lib')
 
 if os.environ.get('CQLSH_NO_BUNDLED', ''):
@@ -116,20 +112,14 @@
     ver = os.path.splitext(os.path.basename(cql_zip))[0][len(CQL_LIB_PREFIX):]
     sys.path.insert(0, os.path.join(cql_zip, 'cassandra-driver-' + ver))
 
-third_parties = ('futures-', 'six-')
+# the driver needs dependencies
+third_parties = ('six-', 'pure_sasl-')
 
 for lib in third_parties:
     lib_zip = find_zip(lib)
     if lib_zip:
         sys.path.insert(0, lib_zip)
 
-# We cannot import six until we add its location to sys.path so the Python
-# interpreter can find it. Do not move this to the top.
-import six
-
-from six.moves import configparser, input
-from six import StringIO, ensure_text, ensure_str
-
 warnings.filterwarnings("ignore", r".*blist.*")
 try:
     import cassandra
@@ -144,8 +134,7 @@
 from cassandra.cluster import Cluster
 from cassandra.cqltypes import cql_typename
 from cassandra.marshal import int64_unpack
-from cassandra.metadata import (ColumnMetadata, KeyspaceMetadata,
-                                TableMetadata, protect_name, protect_names)
+from cassandra.metadata import (ColumnMetadata, KeyspaceMetadata, TableMetadata)
 from cassandra.policies import WhiteListRoundRobinPolicy
 from cassandra.query import SimpleStatement, ordered_dict_factory, TraceUnavailable
 from cassandra.util import datetime_from_timestamp
@@ -156,15 +145,17 @@
 if os.path.isdir(cqlshlibdir):
     sys.path.insert(0, cqlshlibdir)
 
-from cqlshlib import cql3handling, cqlhandling, pylexotron, sslhandling, cqlshhandling
+from cqlshlib import cql3handling, pylexotron, sslhandling, cqlshhandling, authproviderhandling
 from cqlshlib.copyutil import ExportTask, ImportTask
 from cqlshlib.displaying import (ANSI_RESET, BLUE, COLUMN_NAME_COLORS, CYAN,
                                  RED, WHITE, FormattedValue, colorme)
 from cqlshlib.formatting import (DEFAULT_DATE_FORMAT, DEFAULT_NANOTIME_FORMAT,
                                  DEFAULT_TIMESTAMP_FORMAT, CqlType, DateTimeFormat,
-                                 format_by_type, formatter_for)
+                                 format_by_type)
 from cqlshlib.tracing import print_trace, print_trace_session
-from cqlshlib.util import get_file_encoding_bomsize, trim_if_present
+from cqlshlib.util import get_file_encoding_bomsize
+from cqlshlib.util import is_file_secure
+
 
 DEFAULT_HOST = '127.0.0.1'
 DEFAULT_PORT = 9042
@@ -211,6 +202,7 @@
 parser.add_option("--encoding", help="Specify a non-default encoding for output."
                   + " (Default: %s)" % (UTF8,))
 parser.add_option("--cqlshrc", help="Specify an alternative cqlshrc file location.")
+parser.add_option("--credentials", help="Specify an alternative credentials file location.")
 parser.add_option('--cqlversion', default=None,
                   help='Specify a particular CQL version, '
                        'by default the highest version supported by the server will be used.'
@@ -225,42 +217,58 @@
                   help='Specify the default request timeout in seconds (default: %default seconds).')
 parser.add_option("-t", "--tty", action='store_true', dest='tty',
                   help='Force tty mode (command prompt).')
+parser.add_option('-v', action="version", help='Print the current version of cqlsh.')
 
-optvalues = optparse.Values()
-(options, arguments) = parser.parse_args(sys.argv[1:], values=optvalues)
+# This is a hidden option to suppress the warning when the -p/--password command line option is used.
+# Power users may use this option if they know no other people has access to the system where cqlsh is run or don't care about security.
+# Use of this option in scripting is discouraged. Please use a (temporary) credentials file where possible.
+# The Cassandra distributed tests (dtests) also use this option in some tests when a well-known password is supplied via the command line.
+parser.add_option("--insecure-password-without-warning", action='store_true', dest='insecure_password_without_warning',
+                  help=optparse.SUPPRESS_HELP)
+
+opt_values = optparse.Values()
+(options, arguments) = parser.parse_args(sys.argv[1:], values=opt_values)
 
 # BEGIN history/config definition
-HISTORY_DIR = os.path.expanduser(os.path.join('~', '.cassandra'))
+
+
+def mkdirp(path):
+    """Creates all parent directories up to path parameter or fails when path exists, but it is not a directory."""
+
+    try:
+        os.makedirs(path)
+    except OSError:
+        if not os.path.isdir(path):
+            raise
+
+
+def resolve_cql_history_file():
+    default_cql_history = os.path.expanduser(os.path.join('~', '.cassandra', 'cqlsh_history'))
+    if 'CQL_HISTORY' in os.environ:
+        return os.environ['CQL_HISTORY']
+    else:
+        return default_cql_history
+
+
+HISTORY = resolve_cql_history_file()
+HISTORY_DIR = os.path.dirname(HISTORY)
+
+try:
+    mkdirp(HISTORY_DIR)
+except OSError:
+    print('\nWarning: Cannot create directory at `%s`. Command history will not be saved. Please check what was the environment property CQL_HISTORY set to.\n' % HISTORY_DIR)
+
+DEFAULT_CQLSHRC = os.path.expanduser(os.path.join('~', '.cassandra', 'cqlshrc'))
 
 if hasattr(options, 'cqlshrc'):
-    CONFIG_FILE = options.cqlshrc
+    CONFIG_FILE = os.path.expanduser(options.cqlshrc)
     if not os.path.exists(CONFIG_FILE):
-        print('\nWarning: Specified cqlshrc location `%s` does not exist.  Using `%s` instead.\n' % (CONFIG_FILE, HISTORY_DIR))
-        CONFIG_FILE = os.path.join(HISTORY_DIR, 'cqlshrc')
+        print('\nWarning: Specified cqlshrc location `%s` does not exist.  Using `%s` instead.\n' % (CONFIG_FILE, DEFAULT_CQLSHRC))
+        CONFIG_FILE = DEFAULT_CQLSHRC
 else:
-    CONFIG_FILE = os.path.join(HISTORY_DIR, 'cqlshrc')
+    CONFIG_FILE = DEFAULT_CQLSHRC
 
-HISTORY = os.path.join(HISTORY_DIR, 'cqlsh_history')
-if not os.path.exists(HISTORY_DIR):
-    try:
-        os.mkdir(HISTORY_DIR)
-    except OSError:
-        print('\nWarning: Cannot create directory at `%s`. Command history will not be saved.\n' % HISTORY_DIR)
-
-OLD_CONFIG_FILE = os.path.expanduser(os.path.join('~', '.cqlshrc'))
-if os.path.exists(OLD_CONFIG_FILE):
-    if os.path.exists(CONFIG_FILE):
-        print('\nWarning: cqlshrc config files were found at both the old location ({0})'
-              + ' and the new location ({1}), the old config file will not be migrated to the new'
-              + ' location, and the new location will be used for now.  You should manually'
-              + ' consolidate the config files at the new location and remove the old file.'
-              .format(OLD_CONFIG_FILE, CONFIG_FILE))
-    else:
-        os.rename(OLD_CONFIG_FILE, CONFIG_FILE)
-OLD_HISTORY = os.path.expanduser(os.path.join('~', '.cqlsh_history'))
-if os.path.exists(OLD_HISTORY):
-    os.rename(OLD_HISTORY, HISTORY)
-# END history/config definition
+CQL_DIR = os.path.dirname(CONFIG_FILE)
 
 CQL_ERRORS = (
     cassandra.AlreadyExists, cassandra.AuthenticationFailed, cassandra.CoordinationFailure,
@@ -336,7 +344,7 @@
 
 
 def maybe_ensure_text(val):
-    return ensure_text(val) if val else val
+    return str(val) if val else val
 
 
 class FormatError(DecodeError):
@@ -401,7 +409,7 @@
 
 
 class Shell(cmd.Cmd):
-    custom_prompt = ensure_text(os.getenv('CQLSH_PROMPT', ''))
+    custom_prompt = os.getenv('CQLSH_PROMPT', '')
     if custom_prompt != '':
         custom_prompt += "\n"
     default_prompt = custom_prompt + "cqlsh> "
@@ -420,7 +428,7 @@
     default_page_size = 100
 
     def __init__(self, hostname, port, color=False,
-                 username=None, password=None, encoding=None, stdin=None, tty=True,
+                 username=None, encoding=None, stdin=None, tty=True,
                  completekey=DEFAULT_COMPLETEKEY, browser=None, use_conn=None,
                  cqlver=None, keyspace=None,
                  tracing_enabled=False, expand_enabled=False,
@@ -436,16 +444,21 @@
                  request_timeout=DEFAULT_REQUEST_TIMEOUT_SECONDS,
                  protocol_version=None,
                  connect_timeout=DEFAULT_CONNECT_TIMEOUT_SECONDS,
-                 is_subshell=False):
+                 is_subshell=False,
+                 auth_provider=None):
         cmd.Cmd.__init__(self, completekey=completekey)
         self.hostname = hostname
         self.port = port
-        self.auth_provider = None
-        if username:
-            if not password:
-                password = getpass.getpass()
-            self.auth_provider = PlainTextAuthProvider(username=username, password=password)
+        self.auth_provider = auth_provider
         self.username = username
+
+        if isinstance(auth_provider, PlainTextAuthProvider):
+            self.username = auth_provider.username
+            if not auth_provider.password:
+                # if no password is provided, we need to query the user to get one.
+                password = getpass.getpass()
+                self.auth_provider = PlainTextAuthProvider(username=auth_provider.username, password=password)
+
         self.keyspace = keyspace
         self.ssl = ssl
         self.tracing_enabled = tracing_enabled
@@ -498,7 +511,6 @@
 
         self.tty = tty
         self.encoding = encoding
-        self.check_windows_encoding()
 
         self.output_codec = codecs.lookup(encoding)
 
@@ -512,7 +524,6 @@
 
         if tty:
             self.reset_prompt()
-            self.maybe_warn_py2()
             self.report_connection()
             print('Use HELP for help.')
         else:
@@ -531,19 +542,6 @@
     def batch_mode(self):
         return not self.tty
 
-    @property
-    def is_using_utf8(self):
-        # utf8 encodings from https://docs.python.org/{2,3}/library/codecs.html
-        return self.encoding.replace('-', '_').lower() in ['utf', 'utf_8', 'u8', 'utf8', CP65001]
-
-    def check_windows_encoding(self):
-        if is_win and os.name == 'nt' and self.tty and \
-           self.is_using_utf8 and sys.stdout.encoding != CP65001:
-            self.printerr("\nWARNING: console codepage must be set to cp65001 "
-                          "to support {} encoding on Windows platforms.\n"
-                          "If you experience encoding problems, change your console"
-                          " codepage with 'chcp 65001' before starting cqlsh.\n".format(self.encoding))
-
     def set_expanded_cql_version(self, ver):
         ver, vertuple = full_cql_version(ver)
         self.cql_version = ver
@@ -599,12 +597,6 @@
         vers['cql'] = self.cql_version
         print("[cqlsh %(shver)s | Cassandra %(build)s | CQL spec %(cql)s | Native protocol v%(protocol)s]" % vers)
 
-    def maybe_warn_py2(self):
-        py2_suppress_warn = 'CQLSH_NO_WARN_PY2'
-        if sys.version_info[0:2] == (2, 7) and not os.environ.get(py2_suppress_warn):
-            print("Python 2.7 support is deprecated. "
-                  "Install Python 3.6+ or set %s to suppress this message.\n" % (py2_suppress_warn,))
-
     def show_session(self, sessionid, partial_session=False):
         print_trace_session(self, self.session, sessionid, partial_session)
 
@@ -768,13 +760,6 @@
 
         raise ObjectNotFound("'{}' not found in keyspace '{}'".format(name, ks))
 
-    def get_usertypes_meta(self):
-        data = self.session.execute("select * from system.schema_usertypes")
-        if not data:
-            return cql3handling.UserTypesMeta({})
-
-        return cql3handling.UserTypesMeta.from_layout(data)
-
     def get_trigger_names(self, ksname=None):
         if ksname is None:
             ksname = self.current_keyspace
@@ -814,8 +799,6 @@
             try:
                 import readline
             except ImportError:
-                if is_win:
-                    print("WARNING: pyreadline dependency missing.  Install to enable tab completion.")
                 pass
             else:
                 old_completer = readline.get_completer()
@@ -829,9 +812,9 @@
         # start coverage collection if requested, unless in subshell
         if self.coverage and not self.is_subshell:
             # check for coveragerc file, write it if missing
-            if os.path.exists(HISTORY_DIR):
-                self.coveragerc_path = os.path.join(HISTORY_DIR, '.coveragerc')
-                covdata_path = os.path.join(HISTORY_DIR, '.coverage')
+            if os.path.exists(CQL_DIR):
+                self.coveragerc_path = os.path.join(CQL_DIR, '.coveragerc')
+                covdata_path = os.path.join(CQL_DIR, '.coverage')
                 if not os.path.isfile(self.coveragerc_path):
                     with open(self.coveragerc_path, 'w') as f:
                         f.writelines(["[run]\n",
@@ -853,15 +836,14 @@
 
     def get_input_line(self, prompt=''):
         if self.tty:
-            self.lastcmd = input(ensure_str(prompt))
-            line = ensure_text(self.lastcmd) + '\n'
+            self.lastcmd = input(str(prompt))
+            line = self.lastcmd + '\n'
         else:
-            self.lastcmd = ensure_text(self.stdin.readline())
+            self.lastcmd = self.stdin.readline()
             line = self.lastcmd
             if not len(line):
                 raise EOFError
         self.lineno += 1
-        line = ensure_text(line)
         return line
 
     def use_stdin_reader(self, until='', prompt=''):
@@ -875,7 +857,7 @@
                 return
             yield newline
 
-    def cmdloop(self):
+    def cmdloop(self, intro=None):
         """
         Adapted from cmd.Cmd's version, because there is literally no way with
         cmd.Cmd.cmdloop() to tell the difference between "EOF" showing up in
@@ -922,7 +904,6 @@
         Returns true if the statement is complete and was handled (meaning it
         can be reset).
         """
-        statementtext = ensure_text(statementtext)
         statementtext = self.strip_comment_blocks(statementtext)
         try:
             statements, endtoken_escaped = cqlruleset.cql_split_statements(statementtext)
@@ -968,7 +949,7 @@
         if readline is not None:
             nl_count = srcstr.count("\n")
 
-            new_hist = ensure_str(srcstr.replace("\n", " ").rstrip())
+            new_hist = srcstr.replace("\n", " ").rstrip()
 
             if nl_count > 1 and self.last_hist != new_hist:
                 readline.add_history(new_hist)
@@ -1019,7 +1000,6 @@
         self.tracing_enabled = tracing_was_enabled
 
     def perform_statement(self, statement):
-        statement = ensure_text(statement)
 
         stmt = SimpleStatement(statement, consistency_level=self.consistency_level, serial_consistency_level=self.serial_consistency_level, fetch_size=self.page_size if self.use_paging else None)
         success, future = self.perform_simple_statement(stmt)
@@ -1075,7 +1055,7 @@
         try:
             result = future.result()
         except CQL_ERRORS as err:
-            err_msg = ensure_text(err.message if hasattr(err, 'message') else str(err))
+            err_msg = err.message if hasattr(err, 'message') else str(err)
             self.printerr(str(err.__class__.__name__) + ": " + err_msg)
         except Exception:
             import traceback
@@ -1114,11 +1094,11 @@
         def print_all(result, table_meta, tty):
             # Return the number of rows in total
             num_rows = 0
-            isFirst = True
+            is_first = True
             while True:
                 # Always print for the first page even it is empty
-                if result.current_rows or isFirst:
-                    with_header = isFirst or tty
+                if result.current_rows or is_first:
+                    with_header = is_first or tty
                     self.print_static_result(result, table_meta, with_header, tty, num_rows)
                     num_rows += len(result.current_rows)
                 if result.has_more_pages:
@@ -1130,7 +1110,7 @@
                     if not tty:
                         self.writeresult("")
                     break
-                isFirst = False
+                is_first = False
             return num_rows
 
         num_rows = print_all(result, table_meta, self.tty)
@@ -1390,7 +1370,7 @@
                     self.describe_element(result)
 
             except CQL_ERRORS as err:
-                err_msg = ensure_text(err.message if hasattr(err, 'message') else str(err))
+                err_msg = err.message if hasattr(err, 'message') else str(err)
                 self.printerr(err_msg.partition("message=")[2].strip('"'))
             except Exception:
                 import traceback
@@ -1406,7 +1386,7 @@
         """
         Print the output for a DESCRIBE KEYSPACES query
         """
-        names = [ensure_str(r['name']) for r in rows]
+        names = [r['name'] for r in rows]
 
         print('')
         cmd.Cmd.columnize(self, names)
@@ -1426,7 +1406,7 @@
                 keyspace = row['keyspace_name']
                 names = list()
 
-            names.append(ensure_str(row['name']))
+            names.append(str(row['name']))
 
         if keyspace is not None:
             self.print_keyspace_element_names(keyspace, names)
@@ -1564,7 +1544,7 @@
         if fname is not None:
             fname = self.cql_unprotect_value(fname)
 
-        copyoptnames = list(map(six.text_type.lower, parsed.get_binding('optnames', ())))
+        copyoptnames = list(map(str.lower, parsed.get_binding('optnames', ())))
         copyoptvals = list(map(self.cql_unprotect_value, parsed.get_binding('optvals', ())))
         opts = dict(list(zip(copyoptnames, copyoptvals)))
 
@@ -1640,10 +1620,8 @@
         except IOError as e:
             self.printerr('Could not open %r: %s' % (fname, e))
             return
-        username = self.auth_provider.username if self.auth_provider else None
-        password = self.auth_provider.password if self.auth_provider else None
         subshell = Shell(self.hostname, self.port, color=self.color,
-                         username=username, password=password,
+                         username=self.username,
                          encoding=self.encoding, stdin=f, tty=False, use_conn=self.conn,
                          cqlver=self.cql_version, keyspace=self.current_keyspace,
                          tracing_enabled=self.tracing_enabled,
@@ -1656,7 +1634,8 @@
                          max_trace_wait=self.max_trace_wait, ssl=self.ssl,
                          request_timeout=self.session.default_timeout,
                          connect_timeout=self.conn.connect_timeout,
-                         is_subshell=True)
+                         is_subshell=True,
+                         auth_provider=self.auth_provider)
         # duplicate coverage related settings in subshell
         if self.coverage:
             subshell.coverage = True
@@ -1883,8 +1862,7 @@
 
         Clears the console.
         """
-        import subprocess
-        subprocess.call(['clear', 'cls'][is_win], shell=True)
+        subprocess.call('clear', shell=True)
     do_cls = do_clear
 
     def do_debug(self, parsed):
@@ -1986,11 +1964,10 @@
             out = self.query_out
 
         # convert Exceptions, etc to text
-        if not isinstance(text, six.text_type):
-            text = "{}".format(text)
+        if not isinstance(text, str):
+            text = str(text)
 
         to_write = self.applycolor(text, color) + ('\n' if newline else '')
-        to_write = ensure_str(to_write)
         out.write(to_write)
 
     def flush_output(self):
@@ -2068,7 +2045,7 @@
             binary_switch_value = True
         except (ValueError, TypeError):
             value = None
-        return (binary_switch_value, value)
+        return binary_switch_value, value
 
 
 def option_with_default(cparser_getter, section, option, default=None):
@@ -2095,7 +2072,6 @@
     if os.environ.get('TERM', '') in ('dumb', ''):
         return False
     try:
-        import subprocess
         p = subprocess.Popen(['tput', 'colors'], stdout=subprocess.PIPE)
         stdout, _ = p.communicate()
         if int(stdout.strip()) < 8:
@@ -2108,15 +2084,27 @@
 
 
 def read_options(cmdlineargs, environment):
-    configs = configparser.SafeConfigParser() if sys.version_info < (3, 2) else configparser.ConfigParser()
+    configs = configparser.ConfigParser()
     configs.read(CONFIG_FILE)
 
     rawconfigs = configparser.RawConfigParser()
     rawconfigs.read(CONFIG_FILE)
 
+    username_from_cqlshrc = option_with_default(configs.get, 'authentication', 'username')
+    password_from_cqlshrc = option_with_default(rawconfigs.get, 'authentication', 'password')
+    if username_from_cqlshrc or password_from_cqlshrc:
+        if password_from_cqlshrc and not is_file_secure(os.path.expanduser(CONFIG_FILE)):
+            print("\nWarning: Password is found in an insecure cqlshrc file. The file is owned or readable by other users on the system.",
+                  end='', file=sys.stderr)
+        print("\nNotice: Credentials in the cqlshrc file is deprecated and will be ignored in the future."
+              "\nPlease use a credentials file to specify the username and password.\n", file=sys.stderr)
+
     optvalues = optparse.Values()
-    optvalues.username = option_with_default(configs.get, 'authentication', 'username')
-    optvalues.password = option_with_default(rawconfigs.get, 'authentication', 'password')
+
+    optvalues.username = None
+    optvalues.password = None
+    optvalues.credentials = os.path.expanduser(option_with_default(configs.get, 'authentication', 'credentials',
+                                                                   os.path.join(CQL_DIR, 'credentials')))
     optvalues.keyspace = option_with_default(configs.get, 'authentication', 'keyspace')
     optvalues.browser = option_with_default(configs.get, 'ui', 'browser', None)
     optvalues.completekey = option_with_default(configs.get, 'ui', 'completekey',
@@ -2153,8 +2141,46 @@
     optvalues.connect_timeout = option_with_default(configs.getint, 'connection', 'timeout', DEFAULT_CONNECT_TIMEOUT_SECONDS)
     optvalues.request_timeout = option_with_default(configs.getint, 'connection', 'request_timeout', DEFAULT_REQUEST_TIMEOUT_SECONDS)
     optvalues.execute = None
+    optvalues.insecure_password_without_warning = False
 
     (options, arguments) = parser.parse_args(cmdlineargs, values=optvalues)
+
+    # Credentials from cqlshrc will be expanded,
+    # credentials from the command line are also expanded if there is a space...
+    # we need the following so that these two scenarios will work
+    #   cqlsh --credentials=~/.cassandra/creds
+    #   cqlsh --credentials ~/.cassandra/creds
+    options.credentials = os.path.expanduser(options.credentials)
+
+    if not is_file_secure(options.credentials):
+        print("\nWarning: Credentials file '{0}' exists but is not used, because:"
+              "\n  a. the file owner is not the current user; or"
+              "\n  b. the file is readable by group or other."
+              "\nPlease ensure the file is owned by the current user and is not readable by group or other."
+              "\nOn a Linux or UNIX-like system, you often can do this by using the `chown` and `chmod` commands:"
+              "\n  chown YOUR_USERNAME credentials"
+              "\n  chmod 600 credentials\n".format(options.credentials),
+              file=sys.stderr)
+        options.credentials = ''  # ConfigParser.read() will ignore unreadable files
+
+    if not options.username:
+        credentials = configparser.ConfigParser()
+        credentials.read(options.credentials)
+
+        # use the username from credentials file but fallback to cqlshrc if username is absent from the command line parameters
+        options.username = username_from_cqlshrc
+
+    if not options.password:
+        rawcredentials = configparser.RawConfigParser()
+        rawcredentials.read(options.credentials)
+
+        # handling password in the same way as username, priority cli > credentials > cqlshrc
+        options.password = option_with_default(rawcredentials.get, 'plain_text_auth', 'password', password_from_cqlshrc)
+        options.password = password_from_cqlshrc
+    elif not options.insecure_password_without_warning:
+        print("\nWarning: Using a password on the command line interface can be insecure."
+              "\nRecommendation: use the credentials file to securely provide the password.\n", file=sys.stderr)
+
     # Make sure some user values read from the command line are in unicode
     options.execute = maybe_ensure_text(options.execute)
     options.username = maybe_ensure_text(options.username)
@@ -2304,7 +2330,6 @@
                       port,
                       color=options.color,
                       username=options.username,
-                      password=options.password,
                       stdin=stdin,
                       tty=options.tty,
                       completekey=options.completekey,
@@ -2323,7 +2348,12 @@
                       single_statement=options.execute,
                       request_timeout=options.request_timeout,
                       connect_timeout=options.connect_timeout,
-                      encoding=options.encoding)
+                      encoding=options.encoding,
+                      auth_provider=authproviderhandling.load_auth_provider(
+                          config_file=CONFIG_FILE,
+                          cred_file=options.credentials,
+                          username=options.username,
+                          password=options.password))
     except KeyboardInterrupt:
         sys.exit('Connection aborted.')
     except CQL_ERRORS as e:
@@ -2350,7 +2380,7 @@
 
 
 # always call this regardless of module name: when a sub-process is spawned
-# on Windows then the module name is not __main__, see CASSANDRA-9304
+# on Windows then the module name is not __main__, see CASSANDRA-9304 (Windows support was dropped in CASSANDRA-16956)
 insert_driver_hooks()
 
 if __name__ == '__main__':
diff --git a/bin/debug-cql b/bin/debug-cql
index 9550ddf..d5866d3 100755
--- a/bin/debug-cql
+++ b/bin/debug-cql
@@ -36,14 +36,6 @@
     . "$CASSANDRA_CONF/cassandra-env.sh"
 fi
 
-# Special-case path variables.
-case "`uname`" in
-    CYGWIN*|MINGW*) 
-        CLASSPATH="`cygpath -p -w "$CLASSPATH"`"
-        CASSANDRA_CONF="`cygpath -p -w "$CASSANDRA_CONF"`"
-    ;;
-esac
-
 class="org.apache.cassandra.transport.Client"
 cassandra_parms="-Dlogback.configurationFile=logback-tools.xml"
 "$JAVA" $JVM_OPTS $cassandra_parms  -cp "$CLASSPATH" "$class" $@
diff --git a/build.xml b/build.xml
index f9dc014..e56c1f8 100644
--- a/build.xml
+++ b/build.xml
@@ -33,7 +33,7 @@
     <property name="debuglevel" value="source,lines,vars"/>
 
     <!-- default version and SCM information -->
-    <property name="base.version" value="4.0.11"/>
+    <property name="base.version" value="4.1.3"/>
     <property name="scm.connection" value="scm:https://gitbox.apache.org/repos/asf/cassandra.git"/>
     <property name="scm.developerConnection" value="scm:https://gitbox.apache.org/repos/asf/cassandra.git"/>
     <property name="scm.url" value="https://gitbox.apache.org/repos/asf?p=cassandra.git;a=tree"/>
@@ -63,8 +63,8 @@
     <property name="test.classlistfile" value="testlist.txt"/>
     <property name="test.classlistprefix" value="unit"/>
     <property name="benchmark.name" value=""/>
-    <property name="test.anttasks.src" value="${test.dir}/anttasks"/>
     <property name="test.methods" value=""/>
+    <property name="test.anttasks.src" value="${test.dir}/anttasks"/>
     <property name="test.unit.src" value="${test.dir}/unit"/>
     <property name="test.long.src" value="${test.dir}/long"/>
     <property name="test.burn.src" value="${test.dir}/burn"/>
@@ -72,8 +72,13 @@
     <property name="test.microbench.src" value="${test.dir}/microbench"/>
     <property name="test.distributed.src" value="${test.dir}/distributed"/>
     <property name="test.compression.algo" value="LZ4"/>
-    <property name="test.driver.connection_timeout_ms" value="5000"/>
-    <property name="test.driver.read_timeout_ms" value="12000"/>
+    <property name="test.simulator.src" value="${test.dir}/simulator/main"/>
+    <property name="test.simulator-asm.src" value="${test.dir}/simulator/asm"/>
+    <property name="test.simulator-bootstrap.src" value="${test.dir}/simulator/bootstrap"/>
+    <property name="test.simulator-test.src" value="${test.dir}/simulator/test"/>
+    <property name="test.driver.connection_timeout_ms" value="10000"/>
+    <property name="test.driver.read_timeout_ms" value="24000"/>
+    <property name="test.jvm.args" value="" />
     <property name="dist.dir" value="${build.dir}/dist"/>
     <property name="tmp.dir" value="${java.io.tmpdir}"/>
 
@@ -105,17 +110,18 @@
     <property name="maven-repository-url" value="https://repository.apache.org/content/repositories/snapshots"/>
     <property name="maven-repository-id" value="apache.snapshots.https"/>
 
-    <property name="test.timeout" value="240000" />
+    <property name="test.timeout" value="480000" />
     <property name="test.memory.timeout" value="480000" />
     <property name="test.long.timeout" value="600000" />
     <property name="test.burn.timeout" value="60000000" />
     <property name="test.distributed.timeout" value="900000" />
+    <property name="test.simulation.timeout" value="1800000" />
 
     <!-- default for cql tests. Can be overridden by -Dcassandra.test.use_prepared=false -->
     <property name="cassandra.test.use_prepared" value="true" />
 
     <!-- The number of active processors seen by JVM -->
-    <property name="cassandra.test.processorCount" value="4"/>
+    <property name="cassandra.test.processorCount" value="2"/>
 
     <!-- skip flushing schema tables during tests -->
     <property name="cassandra.test.flush_local_schema_changes" value="false" />
@@ -134,7 +140,7 @@
     <property name="jamm.version" value="0.3.2"/>
     <property name="ecj.version" value="4.6.1"/>
     <property name="ohc.version" value="0.5.1"/>
-    <property name="asm.version" value="7.1"/>
+    <property name="asm.version" value="9.1"/>
     <property name="allocation-instrumenter.version" value="3.1.0"/>
     <property name="bytebuddy.version" value="1.10.10"/>
     <property name="jflex.version" value="1.8.2"/>
@@ -146,6 +152,8 @@
     <property name="chronicle-wire.version" value="2.20.117" />
     <property name="chronicle-threads.version" value="2.20.111" />
 
+    <property name="dtest-api.version" value="0.0.13" />
+
     <condition property="maven-ant-tasks.jar.exists">
       <available file="${build.dir}/maven-ant-tasks-${maven-ant-tasks.version}.jar" />
     </condition>
@@ -162,19 +170,22 @@
         <os family="windows" />
     </condition>
 
-    <!-- Check if all tests are being run or just one. If it's all tests don't spam the console with test output.
+    <!-- Check if all tests are being run or just one (check testclasslist target). If it's all tests don't spam the
+         console with test output.
          If it's an individual test print the output from the test under the assumption someone is debugging the test
          and wants to know what is going on without having to context switch to the log file that is generated.
          Debug level output still needs to be retrieved from the log file.  -->
-    <script language="javascript">
-        if (project.getProperty("cassandra.keepBriefBrief") == null)
-        {
-            if (project.getProperty("test.name").equals("*Test"))
-                project.setProperty("cassandra.keepBriefBrief", "true");
-            else
-                project.setProperty("cassandra.keepBriefBrief", "false");
-        }
-    </script>
+    <macrodef name="set-keepbrief-property">
+        <attribute name="test-name" />
+        <sequential>
+            <condition property="cassandra.keepBriefBrief" value="false" else="true">
+                <not>
+                    <equals arg1="@{test-name}" arg2="*Test"/>
+                </not>
+            </condition>
+        </sequential>
+    </macrodef>
+    <set-keepbrief-property test-name="${test.name}" />
 
     <condition property="java.version.8">
         <equals arg1="${ant.java.version}" arg2="1.8"/>
@@ -250,7 +261,7 @@
         <string>-Dio.netty.tryReflectionSetAccessible=true</string>
     </resources>
     <pathconvert property="_jvm11_test_arg_items_concat" refid="_jvm11_test_arg_items" pathsep=" "/>
-    <condition property="test-jvmargs" value="${_jvm11_test_arg_items_concat}" else="${_jvm8_test_arg_items_concat}">
+    <condition property="_std-test-jvmargs" value="${_jvm11_test_arg_items_concat}" else="${_jvm8_test_arg_items_concat}">
         <not>
             <equals arg1="${ant.java.version}" arg2="1.8"/>
         </not>
@@ -397,7 +408,7 @@
 
     <target name="realclean" depends="clean" description="Remove the entire build directory and all downloaded artifacts">
         <delete>
-          <fileset dir="${build.lib}" excludes="cassandra-driver-internal-only-*"/>
+          <fileset dir="${build.lib}" excludes="cassandra-driver-internal-only-*,puresasl-internal-only-*"/>
         </delete>
         <delete dir="${build.dir}" />
         <delete dir="${doc.dir}/build" />
@@ -509,7 +520,7 @@
         <license name="The Apache Software License, Version 2.0" url="https://www.apache.org/licenses/LICENSE-2.0.txt"/>
         <scm connection="${scm.connection}" developerConnection="${scm.developerConnection}" url="${scm.url}"/>
         <dependencyManagement>
-          <dependency groupId="org.xerial.snappy" artifactId="snappy-java" version="1.1.2.6"/>
+          <dependency groupId="org.xerial.snappy" artifactId="snappy-java" version="1.1.8.4"/>
           <dependency groupId="org.lz4" artifactId="lz4-java" version="1.8.0"/>
           <dependency groupId="com.ning" artifactId="compress-lzf" version="0.8.4" scope="provided"/>
           <dependency groupId="com.github.luben" artifactId="zstd-jni" version="1.5.5-1"/>
@@ -521,10 +532,11 @@
             <exclusion groupId="org.checkerframework" artifactId="checker-qual" />
             <exclusion groupId="com.google.errorprone" artifactId="error_prone_annotations" />
           </dependency>
+          <dependency groupId="com.google.jimfs" artifactId="jimfs" version="1.1"/>
           <dependency groupId="org.hdrhistogram" artifactId="HdrHistogram" version="2.1.9"/>
           <dependency groupId="commons-cli" artifactId="commons-cli" version="1.1"/>
           <dependency groupId="commons-codec" artifactId="commons-codec" version="1.9"/>
-          <dependency groupId="commons-io" artifactId="commons-io" version="2.6" scope="test"/>
+          <dependency groupId="commons-io" artifactId="commons-io" version="2.6"/>
           <dependency groupId="org.apache.commons" artifactId="commons-lang3" version="3.11"/>
           <dependency groupId="org.apache.commons" artifactId="commons-math3" version="3.2"/>
           <dependency groupId="org.antlr" artifactId="antlr" version="3.5.2" scope="provided">
@@ -542,6 +554,10 @@
           <dependency groupId="com.fasterxml.jackson.core" artifactId="jackson-core" version="2.13.2"/>
           <dependency groupId="com.fasterxml.jackson.core" artifactId="jackson-databind" version="2.13.2.2"/>
           <dependency groupId="com.fasterxml.jackson.core" artifactId="jackson-annotations" version="2.13.2"/>
+          <dependency groupId="com.fasterxml.jackson.datatype" artifactId="jackson-datatype-jsr310" version="2.13.2"/>
+          <dependency groupId="com.fasterxml.jackson.dataformat" artifactId="jackson-dataformat-yaml" version="2.13.2"  scope="test">
+            <exclusion groupId="org.yaml" artifactId="snakeyaml"/>
+          </dependency>
           <dependency groupId="com.googlecode.json-simple" artifactId="json-simple" version="1.1"/>
           <dependency groupId="com.boundary" artifactId="high-scale-lib" version="1.0.6"/>
           <dependency groupId="com.github.jbellis" artifactId="jamm" version="${jamm.version}"/>
@@ -554,11 +570,14 @@
           <dependency groupId="com.google.code.java-allocation-instrumenter" artifactId="java-allocation-instrumenter" version="${allocation-instrumenter.version}" scope="test">
             <exclusion groupId="com.google.guava" artifactId="guava"/>
           </dependency>
-          <dependency groupId="org.apache.cassandra" artifactId="dtest-api" version="0.0.13" scope="test"/>
+          <dependency groupId="org.apache.cassandra" artifactId="harry-core" version="0.0.1" scope="test"/>
           <dependency groupId="org.reflections" artifactId="reflections" version="0.10.2" scope="test"/>
+          <dependency groupId="org.apache.cassandra" artifactId="dtest-api" version="${dtest-api.version}" scope="test"/>
+          <dependency groupId="com.puppycrawl.tools" artifactId="checkstyle" version="8.40" scope="test"/>
           <dependency groupId="org.apache.hadoop" artifactId="hadoop-core" version="1.0.3" scope="provided">
             <exclusion groupId="org.mortbay.jetty" artifactId="servlet-api"/>
             <exclusion groupId="commons-logging" artifactId="commons-logging"/>
+            <exclusion groupId="commons-lang" artifactId="commons-lang"/>
             <exclusion groupId="org.eclipse.jdt" artifactId="core"/>
             <exclusion groupId="ant" artifactId="ant"/>
             <exclusion groupId="junit" artifactId="junit"/>
@@ -567,13 +586,15 @@
           </dependency>
           <dependency groupId="org.apache.hadoop" artifactId="hadoop-minicluster" version="1.0.3" scope="provided">
             <exclusion groupId="asm" artifactId="asm"/> <!-- this is the outdated version 3.1 -->
-            <exclusion groupId="org.slf4j" artifactId="slf4j-api"/>
             <exclusion groupId="org.codehaus.jackson" artifactId="jackson-mapper-asl"/>
+            <exclusion groupId="org.slf4j" artifactId="slf4j-api"/>
           </dependency>
-          <dependency groupId="net.java.dev.jna" artifactId="jna" version="5.6.0"/>
+          <dependency groupId="net.java.dev.jna" artifactId="jna" version="5.9.0"/>
 
           <dependency groupId="org.jacoco" artifactId="org.jacoco.agent" version="${jacoco.version}" scope="test"/>
-          <dependency groupId="org.jacoco" artifactId="org.jacoco.ant" version="${jacoco.version}" scope="test"/>
+          <dependency groupId="org.jacoco" artifactId="org.jacoco.ant" version="${jacoco.version}" scope="test">
+            <exclusion groupId="org.ow2.asm" artifactId="asm"/>
+          </dependency>
 
           <dependency groupId="org.jboss.byteman" artifactId="byteman-install" version="${byteman.version}" scope="provided"/>
           <dependency groupId="org.jboss.byteman" artifactId="byteman" version="${byteman.version}" scope="provided"/>
@@ -621,7 +642,7 @@
             <exclusion groupId="net.java.dev.jna" artifactId="jna" />
             <exclusion groupId="net.java.dev.jna" artifactId="jna-platform" />
           </dependency>
-          <dependency groupId="com.google.code.findbugs" artifactId="jsr305" version="2.0.2" scope="provided"/>
+          <dependency groupId="com.google.code.findbugs" artifactId="jsr305" version="2.0.2"/>
           <dependency groupId="com.clearspring.analytics" artifactId="stream" version="2.5.2">
             <exclusion groupId="it.unimi.dsi" artifactId="fastutil" />
           </dependency>
@@ -649,11 +670,12 @@
           </dependency>
           <dependency groupId="com.github.rholder" artifactId="snowball-stemmer" version="1.3.0.581.1" />
           <dependency groupId="com.googlecode.concurrent-trees" artifactId="concurrent-trees" version="2.4.0" />
-          <dependency groupId="com.github.ben-manes.caffeine" artifactId="caffeine" version="2.5.6" />
+          <dependency groupId="com.github.ben-manes.caffeine" artifactId="caffeine" version="2.9.2" />
           <dependency groupId="org.jctools" artifactId="jctools-core" version="3.1.0"/>
           <dependency groupId="org.ow2.asm" artifactId="asm" version="${asm.version}"/>
           <dependency groupId="org.ow2.asm" artifactId="asm-tree" version="${asm.version}" scope="test"/>
           <dependency groupId="org.ow2.asm" artifactId="asm-commons" version="${asm.version}" scope="test"/>
+          <dependency groupId="org.ow2.asm" artifactId="asm-util" version="${asm.version}" scope="test"/>
           <dependency groupId="org.gridkit.jvmtool" artifactId="sjk-cli" version="0.14"/>
           <dependency groupId="org.gridkit.jvmtool" artifactId="sjk-core" version="0.14">
             <exclusion groupId="org.gridkit.jvmtool" artifactId="sjk-hflame"/>
@@ -680,6 +702,7 @@
             <exclusion groupId="org.hamcrest" artifactId="hamcrest"/>
           </dependency>
           <dependency groupId="org.hamcrest" artifactId="hamcrest" version="2.2" scope="test"/>
+          <dependency groupId="com.github.seancfoley" artifactId="ipaddress" version="5.3.3" />
         </dependencyManagement>
         <developer id="adelapena" name="Andres de la Peña"/>
         <developer id="alakshman" name="Avinash Lakshman"/>
@@ -736,16 +759,24 @@
                 artifactId="cassandra-parent"
                 version="${version}"
                 relativePath="${final.name}-parent.pom"/>
-        <dependency groupId="junit" artifactId="junit"/>
-        <dependency groupId="commons-io" artifactId="commons-io"/>
-        <dependency groupId="org.mockito" artifactId="mockito-core"/>
-        <dependency groupId="org.quicktheories" artifactId="quicktheories"/>
-        <dependency groupId="org.reflections" artifactId="reflections"/>
-        <dependency groupId="com.google.code.java-allocation-instrumenter" artifactId="java-allocation-instrumenter" version="${allocation-instrumenter.version}"/>
-        <dependency groupId="org.apache.cassandra" artifactId="dtest-api"/>
-        <dependency groupId="org.openjdk.jmh" artifactId="jmh-core"/>
-        <dependency groupId="org.openjdk.jmh" artifactId="jmh-generator-annprocess"/>
-        <dependency groupId="org.apache.ant" artifactId="ant-junit"/>
+        <dependency groupId="junit" artifactId="junit" scope="test"/>
+        <dependency groupId="commons-io" artifactId="commons-io" scope="test"/>
+        <dependency groupId="org.mockito" artifactId="mockito-core" scope="test"/>
+        <dependency groupId="org.ow2.asm" artifactId="asm" version="${asm.version}"/>
+        <dependency groupId="org.ow2.asm" artifactId="asm-tree" version="${asm.version}" scope="test"/>
+        <dependency groupId="org.ow2.asm" artifactId="asm-commons" version="${asm.version}" scope="test"/>
+        <dependency groupId="org.ow2.asm" artifactId="asm-util" version="${asm.version}" scope="test"/>
+        <dependency groupId="com.google.jimfs" artifactId="jimfs" version="1.1" scope="test"/>
+        <dependency groupId="com.puppycrawl.tools" artifactId="checkstyle" scope="test"/>
+        <dependency groupId="org.quicktheories" artifactId="quicktheories" scope="test"/>
+        <dependency groupId="org.reflections" artifactId="reflections" scope="test"/>
+        <dependency groupId="com.google.code.java-allocation-instrumenter" artifactId="java-allocation-instrumenter" version="${allocation-instrumenter.version}" scope="test"/>
+        <dependency groupId="org.apache.cassandra" artifactId="dtest-api" scope="test"/>
+        <dependency groupId="org.openjdk.jmh" artifactId="jmh-core" scope="test"/>
+        <dependency groupId="org.openjdk.jmh" artifactId="jmh-generator-annprocess" scope="test"/>
+        <dependency groupId="net.ju-n.compile-command-annotations" artifactId="compile-command-annotations" scope="test"/>
+        <dependency groupId="org.apache.ant" artifactId="ant-junit" scope="test"/>
+        <dependency groupId="org.apache.cassandra" artifactId="harry-core"/>
         <!-- adding this dependency is necessary for assertj. When updating assertj, need to also update the version of
              this that the new assertj's `assertj-parent-pom` depends on. -->
         <dependency groupId="org.junit" artifactId="junit-bom" type="pom"/>
@@ -754,6 +785,8 @@
         <!-- coverage debs -->
         <dependency groupId="org.jacoco" artifactId="org.jacoco.agent"/>
         <dependency groupId="org.jacoco" artifactId="org.jacoco.ant"/>
+
+        <dependency groupId="com.fasterxml.jackson.dataformat" artifactId="jackson-dataformat-yaml"/>
       </artifact:pom>
 
       <!-- now the pom's for artifacts being deployed to Maven Central -->
@@ -783,6 +816,7 @@
         <dependency groupId="com.fasterxml.jackson.core" artifactId="jackson-core"/>
         <dependency groupId="com.fasterxml.jackson.core" artifactId="jackson-databind"/>
         <dependency groupId="com.fasterxml.jackson.core" artifactId="jackson-annotations"/>
+        <dependency groupId="com.fasterxml.jackson.datatype" artifactId="jackson-datatype-jsr310"/>
         <dependency groupId="com.googlecode.json-simple" artifactId="json-simple"/>
         <dependency groupId="com.boundary" artifactId="high-scale-lib"/>
         <dependency groupId="org.yaml" artifactId="snakeyaml"/>
@@ -851,6 +885,7 @@
         <dependency groupId="org.jboss.byteman" artifactId="byteman"/>
         <dependency groupId="org.jboss.byteman" artifactId="byteman-submit"/>
         <dependency groupId="org.jboss.byteman" artifactId="byteman-bmunit"/>
+        <dependency groupId="com.github.seancfoley" artifactId="ipaddress" />
       </artifact:pom>
     </target>
 
@@ -878,6 +913,7 @@
           <pathelement location="${test.conf}"/>
         </classpath>
         <jvmarg value="-Dstorage-config=${test.conf}"/>
+        <jvmarg value="-Dcassandra.reads.thresholds.coordinator.defensive_checks_enabled=true" /> <!-- enable defensive checks -->
         <jvmarg value="-javaagent:${build.lib}/jamm-${jamm.version}.jar" />
         <jvmarg value="-ea"/>
         <jvmarg line="${java11-jvmargs}"/>
@@ -887,7 +923,8 @@
     <!--
         The build target builds all the .class files
     -->
-    <target name="build" depends="resolver-retrieve-build,build-project" description="Compile Cassandra classes"/>
+    <target name="build" depends="resolver-retrieve-build,build-project,checkstyle" description="Compile Cassandra classes"/>
+    <target name="_build_unsafe" depends="resolver-retrieve-build,build-project" description="Compile Cassandra classes without checks"/>
     <target name="codecoverage" depends="jacoco-run,jacoco-report" description="Create code coverage report"/>
 
     <target name="_build_java">
@@ -1018,6 +1055,60 @@
         </testmacro>
     </target>
 
+    <!--
+        simulator asm build file
+        -->
+    <property name="simulator-asm.build.src" value="${test.simulator-asm.src}" />
+    <property name="simulator-asm.build.classes" value="${build.classes}/simulator-asm" />
+    <property name="simulator-asm.manifest" value="${simulator-asm.build.classes}/MANIFEST.MF" />
+
+    <property name="simulator-bootstrap.build.src" value="${test.simulator-bootstrap.src}" />
+    <property name="simulator-bootstrap.build.classes" value="${build.classes}/simulator-bootstrap" />
+    <property name="simulator-bootstrap.manifest" value="${simulator-bootstrap.build.classes}/MANIFEST.MF" />
+
+    <target name="simulator-asm-build" depends="_build_unsafe" description="build simulator-asm">
+        <antcall target="_simulator-asm_build"/>
+    </target>
+
+    <target name="simulator-bootstrap-build" depends="_build_unsafe" description="build simulator-bootstrap">
+        <antcall target="_simulator-bootstrap_build"/>
+    </target>
+
+    <target name="_simulator-asm_build">
+    	<mkdir dir="${simulator-asm.build.classes}" />
+        <javac compiler="modern" debug="true" debuglevel="${debuglevel}"
+               source="${source.version}" target="${target.version}"
+               encoding="utf-8" destdir="${simulator-asm.build.classes}" includeantruntime="true">
+            <src path="${simulator-asm.build.src}" />
+            <classpath>
+                <fileset dir="${test.lib}">
+                     <include name="**/asm-*${asm.version}.jar" />
+                </fileset>
+                <fileset dir="${build.lib}">
+                     <include name="**/asm-*${asm.version}.jar" />
+                </fileset>
+            </classpath>
+        </javac>
+    </target>
+
+    <target name="_simulator-bootstrap_build">
+    	<mkdir dir="${simulator-bootstrap.build.classes}" />
+        <javac compiler="modern" debug="true" debuglevel="${debuglevel}"
+               source="${source.version}" target="${target.version}"
+               encoding="utf-8" destdir="${simulator-bootstrap.build.classes}" includeantruntime="true">
+            <src path="${simulator-bootstrap.build.src}" />
+            <classpath>
+                <fileset dir="${test.lib}">
+                     <include name="**/asm-*${asm.version}.jar" />
+                </fileset>
+                <fileset dir="${build.lib}">
+                     <include name="**/asm-*${asm.version}.jar" />
+                </fileset>
+            </classpath>
+            <compilerarg value="-XDignore.symbol.file"/>
+        </javac>
+    </target>
+
 	<target name="_write-poms" depends="maven-declare-dependencies">
 	    <artifact:writepom pomRefId="parent-pom" file="${build.dir}/${final.name}-parent.pom"/>
 	    <artifact:writepom pomRefId="all-pom" file="${build.dir}/${final.name}.pom"/>
@@ -1054,29 +1145,76 @@
         </manifest>
       </jar>
     </target>
-    <target name="jar"
-            depends="_main-jar,build-test,stress-build,fqltool-build,write-poms"
+
+    <target name="stress-jar"
+            depends="stress-build"
             description="Assemble Cassandra JAR files">
-      <!-- Stress jar -->
-      <manifest file="${stress.manifest}">
-        <attribute name="Built-By" value="Pavel Yaskevich"/>
-        <attribute name="Main-Class" value="org.apache.cassandra.stress.Stress"/>
-      </manifest>
-      <mkdir dir="${stress.build.classes}/META-INF" />
-      <mkdir dir="${build.dir}/tools/lib/" />
-      <jar destfile="${build.dir}/tools/lib/stress.jar" manifest="${stress.manifest}">
-        <fileset dir="${stress.build.classes}"/>
-      </jar>
-      <!-- fqltool jar -->
-      <manifest file="${fqltool.manifest}">
-        <attribute name="Built-By" value="Marcus Eriksson"/>
-        <attribute name="Main-Class" value="org.apache.cassandra.fqltool.FullQueryLogTool"/>
-      </manifest>
-      <mkdir dir="${fqltool.build.classes}/META-INF" />
-      <mkdir dir="${build.dir}/tools/lib/" />
-      <jar destfile="${build.dir}/tools/lib/fqltool.jar" manifest="${fqltool.manifest}">
-        <fileset dir="${fqltool.build.classes}"/>
-      </jar>
+        <!-- Stress jar -->
+        <manifest file="${stress.manifest}">
+            <attribute name="Built-By" value="Pavel Yaskevich"/>
+            <attribute name="Main-Class" value="org.apache.cassandra.stress.Stress"/>
+        </manifest>
+        <mkdir dir="${stress.build.classes}/META-INF" />
+        <mkdir dir="${build.dir}/tools/lib/" />
+        <jar destfile="${build.dir}/tools/lib/stress.jar" manifest="${stress.manifest}">
+            <fileset dir="${stress.build.classes}"/>
+        </jar>
+    </target>
+
+    <target name="fqltool-jar"
+            depends="fqltool-build"
+            description="Assemble Cassandra JAR files">
+
+        <!-- fqltool jar -->
+        <manifest file="${fqltool.manifest}">
+            <attribute name="Built-By" value="Marcus Eriksson"/>
+            <attribute name="Main-Class" value="org.apache.cassandra.fqltool.FullQueryLogTool"/>
+        </manifest>
+        <mkdir dir="${fqltool.build.classes}/META-INF" />
+        <mkdir dir="${build.dir}/tools/lib/" />
+        <jar destfile="${build.dir}/tools/lib/fqltool.jar" manifest="${fqltool.manifest}">
+            <fileset dir="${fqltool.build.classes}"/>
+        </jar>
+    </target>
+
+    <target name="simulator-jars"
+            depends="simulator-asm-build,simulator-bootstrap-build"
+            description="Assemble Cassandra JAR files">
+
+        <!-- simulator asm jar -->
+        <manifest file="${simulator-asm.manifest}">
+            <attribute name="Built-By" value="Benedict Elliott Smith"/>
+            <attribute name="Premain-Class" value="org.apache.cassandra.simulator.asm.InterceptAgent"/>
+            <attribute name="Agent-Class" value="org.apache.cassandra.simulator.asm.InterceptAgent"/>
+            <attribute name="Can-Redefine-Classes" value="true"/>
+            <attribute name="Can-Retransform-Classes" value="true"/>
+        </manifest>
+        <mkdir dir="${simulator-asm.build.classes}/META-INF" />
+        <mkdir dir="${test.lib}/jars/" />
+        <jar destfile="${test.lib}/jars/simulator-asm.jar" manifest="${simulator-asm.manifest}">
+            <fileset dir="${simulator-asm.build.classes}"/>
+            <fileset dir="${test.lib}/jars">
+                <include name="**/asm-*${asm.version}.jar" />
+            </fileset>
+        </jar>
+
+        <!-- simulator bootstrap jar -->
+        <manifest file="${simulator-bootstrap.manifest}">
+            <attribute name="Built-By" value="Benedict Elliott Smith"/>
+        </manifest>
+        <mkdir dir="${simulator-bootstrap.build.classes}/META-INF" />
+        <mkdir dir="${test.lib}/jars/" />
+        <jar destfile="${test.lib}/jars/simulator-bootstrap.jar" manifest="${simulator-bootstrap.manifest}">
+            <fileset dir="${simulator-bootstrap.build.classes}"/>
+            <fileset dir="${test.lib}/jars">
+                <include name="**/asm-*${asm.version}.jar" />
+            </fileset>
+        </jar>
+    </target>
+
+    <target name="jar"
+            depends="_main-jar,build-test,stress-jar,fqltool-jar,simulator-jars,write-poms"
+            description="Assemble Cassandra JAR files">
     </target>
 
     <!--
@@ -1283,7 +1421,7 @@
     <antcall target="build-test" inheritRefs="true"/>
   </target>
 
-  <target name="build-test" depends="_main-jar,stress-build-test,fqltool-build,resolver-dist-lib"
+  <target name="build-test" depends="_main-jar,stress-build-test,fqltool-build,resolver-dist-lib,simulator-jars,checkstyle-test"
           description="Compile test classes">
     <antcall target="_build-test"/>
   </target>
@@ -1310,6 +1448,10 @@
      <src path="${test.memory.src}"/>
      <src path="${test.microbench.src}"/>
      <src path="${test.distributed.src}"/>
+     <src path="${test.simulator.src}"/>
+     <src path="${test.simulator-asm.src}"/>
+     <src path="${test.simulator-bootstrap.src}"/>
+     <src path="${test.simulator-test.src}"/>
     </javac>
 
     <checktestnameshelper/>
@@ -1336,7 +1478,8 @@
   <macrodef name="testhelper">
     <attribute name="testdelegate"/>
     <sequential>
-      <testhelper_ testdelegate="@{testdelegate}"/>
+        <taskdef name="testhelper_" classname="org.apache.cassandra.anttasks.TestHelper" classpath="${test.classes}"/>
+        <testhelper_ property="@{testdelegate}"/>
       <fail message="Some test(s) failed.">
         <condition>
             <and>
@@ -1353,21 +1496,6 @@
   <!-- Run a list of junit tasks but don't track errors or generate a report after
        If a test fails the testfailed property will be set. All the tests are run using the testdelegate
        macro that is specified as an attribute and they will be run sequentially in this ant process -->
-  <scriptdef name="testhelper_" language="javascript">
-    <attribute name="testdelegate"/>
-    <![CDATA[
-        sep = project.getProperty("path.separator");
-        all = project.getProperty("all-test-classes").split(sep);
-        var p = project.createTask('sequential');
-        for (i = 0; i < all.length; i++) {
-            if (all[i] == undefined) continue;
-            task = project.createTask( attributes.get("testdelegate") );
-            task.setDynamicAttribute( "test.file.list", "" + all[i]);
-            p.addTask(task);
-        }
-        p.perform();
-    ]]>
-  </scriptdef>
 
   <!-- Defines how to run a set of tests. If you change the defaults for attributes
        you should also update them in testmacro.,
@@ -1427,13 +1555,15 @@
         <jvmarg value="-Dcassandra.testtag=@{testtag}"/>
         <jvmarg value="-Dcassandra.keepBriefBrief=${cassandra.keepBriefBrief}" />
         <jvmarg value="-Dcassandra.strict.runtime.checks=true" />
+        <jvmarg value="-Dcassandra.reads.thresholds.coordinator.defensive_checks_enabled=true" /> <!-- enable defensive checks -->
         <jvmarg value="-Dcassandra.test.flush_local_schema_changes=${cassandra.test.flush_local_schema_changes}"/>
         <jvmarg value="-Dcassandra.test.messagingService.nonGracefulShutdown=${cassandra.test.messagingService.nonGracefulShutdown}"/>
         <jvmarg value="-Dcassandra.use_nix_recursive_delete=${cassandra.use_nix_recursive_delete}"/>
         <jvmarg line="${java11-jvmargs}"/>
         <!-- disable shrinks in quicktheories CASSANDRA-15554 -->
         <jvmarg value="-DQT_SHRINKS=0"/>
-        <jvmarg line="${test-jvmargs}" />
+        <jvmarg line="${_std-test-jvmargs}" />
+        <jvmarg line="${test.jvm.args}" />
         <optjvmargs/>
         <!-- Uncomment to debug unittest, attach debugger to port 1416 -->
         <!--
@@ -1443,11 +1573,13 @@
           <pathelement path="${java.class.path}"/>
           <pathelement location="${stress.build.classes}"/>
           <pathelement location="${fqltool.build.classes}"/>
-          <path refid="cassandra.classpath.test" />
           <pathelement location="${test.classes}"/>
+          <path refid="cassandra.classpath.test" />
           <pathelement location="${stress.test.classes}"/>
           <pathelement location="${fqltool.test.classes}"/>
           <pathelement location="${test.conf}"/>
+          <pathelement path="${java.class.path}"/>
+          <path refid="cassandra.classpath" />
           <fileset dir="${test.lib}">
             <include name="**/*.jar" />
               <exclude name="**/ant-*.jar"/>
@@ -1570,6 +1702,7 @@
   </target>
 
   <!-- Use this with an FQDN for test class, and an optional csv list of methods like this:
+    ant testsome -Dtest.name=org.apache.cassandra.service.StorageServiceServerTest
     ant testsome -Dtest.name=org.apache.cassandra.service.StorageServiceServerTest -Dtest.methods=testRegularMode,testGetAllRangesEmpty
   -->
   <target name="testsome" depends="maybe-build-test" description="Execute specific unit tests" >
@@ -1724,9 +1857,9 @@
   </target>
 
   <!-- Use this with an simple class name for test class, and an optional csv list of methods like this:
-      ant cql-test-some -Dtest.name=ListsTest
-      ant cql-test-some -Dtest.name=ListsTest -Dtest.methods=testPrecisionTime_getNext_simple
-    -->
+    ant cql-test-some -Dtest.name=ListsTest
+    ant cql-test-some -Dtest.name=ListsTest -Dtest.methods=testPrecisionTime_getNext_simple
+  -->
   <target name="cql-test-some" depends="maybe-build-test" description="Execute specific CQL tests" >
     <sequential>
       <echo message="running ${test.methods} tests from ${test.name}"/>
@@ -1903,17 +2036,18 @@
   </target>
 
   <target name="dtest-jar" depends="build-test, build" description="Create dtest-compatible jar, including all dependencies">
-      <jar jarfile="${build.dir}/dtest-${base.version}.jar">
-          <zipgroupfileset dir="${build.lib}" includes="*.jar" excludes="META-INF/*.SF"/>
-          <zipgroupfileset dir="${build.dir.lib}/jars" includes="javassist-*.jar,reflections-*.jar" excludes="META-INF/*.SF"/>
+      <jar jarfile="${build.dir}/dtest-${base.version}.jar" duplicate="preserve">
           <fileset dir="${build.classes.main}"/>
           <fileset dir="${test.classes}"/>
           <fileset dir="${test.conf}" />
+          <zipgroupfileset dir="${build.lib}" includes="*.jar" excludes="META-INF/*.SF"/>
+          <zipgroupfileset dir="${test.lib}/jars" includes="jimfs-1.1.jar,dtest-api-*.jar,asm-*.jar,javassist-*.jar,reflections-*.jar,semver4j-*.jar" excludes="META-INF/*.SF"/>
+          <zipgroupfileset dir="${build.dir.lib}/jars" includes="asm-*.jar" excludes="META-INF/*.SF"/>
       </jar>
   </target>
 
   <target name="test-jvm-dtest" depends="maybe-build-test" description="Execute in-jvm dtests">
-    <testmacro inputdir="${test.distributed.src}" timeout="${test.distributed.timeout}" forkmode="once" showoutput="true" filter="**/test/*Test.java">
+    <testmacro inputdir="${test.distributed.src}" timeout="${test.distributed.timeout}" forkmode="once" showoutput="true" filter="**/test/${test.name}.java">
       <jvmarg value="-Dlogback.configurationFile=test/conf/logback-dtest.xml"/>
       <jvmarg value="-Dcassandra.ring_delay_ms=10000"/>
       <jvmarg value="-Dcassandra.tolerate_sstable_size=true"/>
@@ -1921,6 +2055,27 @@
     </testmacro>
   </target>
 
+  <target name="test-simulator-dtest" depends="maybe-build-test" description="Execute simulator dtests">
+    <testmacro inputdir="${test.simulator-test.src}" timeout="${test.simulation.timeout}" forkmode="perTest" showoutput="true" filter="**/test/${test.name}.java">
+      <jvmarg value="-Dlogback.configurationFile=test/conf/logback-simulator.xml"/>
+      <jvmarg value="-Dcassandra.ring_delay_ms=10000"/>
+      <jvmarg value="-Dcassandra.tolerate_sstable_size=true"/>
+      <jvmarg value="-Dcassandra.skip_sync=true" />
+      <jvmarg value="-Dcassandra.debugrefcount=false"/>
+      <jvmarg value="-Dcassandra.test.simulator.determinismcheck=strict"/>
+      <!-- Support Simulator Tests -->
+      <jvmarg line="-javaagent:${test.lib}/jars/simulator-asm.jar"/>
+      <jvmarg line="-Xbootclasspath/a:${test.lib}/jars/simulator-bootstrap.jar"/>
+      <jvmarg line="-XX:ActiveProcessorCount=4"/>
+      <jvmarg line="-XX:-TieredCompilation"/>
+      <jvmarg line="-XX:-BackgroundCompilation"/>
+      <jvmarg line="-XX:CICompilerCount=1"/>
+      <jvmarg line="-XX:Tier4CompileThreshold=1000"/>
+      <jvmarg line="-XX:ReservedCodeCacheSize=256M"/>
+      <jvmarg line="-Xmx8G"/>
+    </testmacro>
+  </target>
+
   <target name="test-jvm-upgrade-dtest" depends="maybe-build-test" description="Execute in-jvm dtests">
     <testmacro inputdir="${test.distributed.src}" timeout="${test.distributed.timeout}" forkmode="once" showoutput="true" filter="**/upgrade/*Test.java">
       <jvmarg value="-Dlogback.configurationFile=test/conf/logback-dtest.xml"/>
@@ -1931,6 +2086,7 @@
   </target>
 
   <!-- Use this with an FQDN for test class, and an optional csv list of methods like this:
+      ant test-jvm-dtest-some -Dtest.name=org.apache.cassandra.distributed.test.ResourceLeakTest
       ant test-jvm-dtest-some -Dtest.name=org.apache.cassandra.distributed.test.ResourceLeakTest -Dtest.methods=looperTest
     -->
   <target name="test-jvm-dtest-some" depends="maybe-build-test" description="Execute some in-jvm dtests">
@@ -1992,7 +2148,7 @@
               <pathelement location="${test.classes}"/>
               <pathelement location="${test.conf}"/>
               <fileset dir="${test.lib}">
-                  <include name="**/*.jar" />
+                  asm-<include name="**/*.jar" />
               </fileset>
           </classpath>
       </java>
@@ -2055,7 +2211,24 @@
   </natures>
 </projectDescription>]]>
     </echo>
-	<echo file=".classpath"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
+    <path id="eclipse-project-libs-path">
+        <fileset dir="lib">
+            <include name="**/*.jar" />
+        </fileset>
+        <fileset dir="build/lib/jars">
+            <include name="**/*.jar" />
+        </fileset>
+        <fileset dir="build/test/lib/jars">
+            <include name="**/*.jar" />
+        </fileset>
+    </path>
+    <pathconvert property="eclipse-libs-list" refid="eclipse-project-libs-path" pathsep="${line.separator}">
+        <mapper>
+            <regexpmapper from="^(.*)$$" to='&lt;classpathentry kind="lib" path="\1\" \/&gt;'/>
+        </mapper>
+    </pathconvert>
+    <property name="eclipse-project-libs" refid="eclipse-project-libs-path"/>
+    <echo file=".classpath"><![CDATA[<?xml version="1.0" encoding="UTF-8"?>
 <classpath>
   <classpathentry kind="src" path="src/java"/>
   <classpathentry kind="src" path="src/resources"/>
@@ -2064,6 +2237,8 @@
   <classpathentry kind="src" output="build/test/classes" path="test/unit"/>
   <classpathentry kind="src" output="build/test/classes" path="test/long"/>
   <classpathentry kind="src" output="build/test/classes" path="test/distributed"/>
+  <classpathentry kind="src" output="build/test/classes" path="test/simulator/asm"/>
+  <classpathentry kind="src" output="build/test/classes" path="test/simulator/main"/>
   <classpathentry kind="src" output="build/test/classes" path="test/resources" />
   <classpathentry kind="src" path="tools/stress/src"/>
   <classpathentry kind="src" path="tools/fqltool/src"/>
@@ -2073,51 +2248,16 @@
   <classpathentry kind="output" path="build/classes/eclipse"/>
   <classpathentry kind="lib" path="test/conf"/>
   <classpathentry kind="lib" path="${java.home}/../lib/tools.jar"/>
+  ${eclipse-libs-list}
+</classpath>
 ]]>
 	</echo>
-  	<path id="eclipse-project-libs-path">
-  	 <fileset dir="lib">
-  	    <include name="**/*.jar" />
-     </fileset>
- 	 <fileset dir="build/lib/jars">
-  	    <include name="**/*.jar" />
-  	 </fileset>
-     <fileset dir="build/test/lib/jars">
-        <include name="**/*.jar" />
-     </fileset>
-  	</path>
-  	<property name="eclipse-project-libs" refid="eclipse-project-libs-path"/>
-       <script language="javascript">
+    <taskdef name="echoeclipseprojectslibs" classname="org.apache.cassandra.anttasks.EchoEclipseProjectLibs" classpath="${test.classes}">
         <classpath>
             <path refid="cassandra.classpath"/>
             <path refid="cassandra.classpath.test"/>
         </classpath>
-        <![CDATA[
-        var File = java.io.File;
-  		var FilenameUtils = Packages.org.apache.commons.io.FilenameUtils;
-  		jars = project.getProperty("eclipse-project-libs").split(project.getProperty("path.separator"));
-
-  		cp = "";
-  	    for (i=0; i< jars.length; i++) {
-  	       srcjar = FilenameUtils.getBaseName(jars[i]) + '-sources.jar';
-           srcdir = FilenameUtils.concat(project.getProperty("build.test.dir"), 'sources');
-  		   srcfile = new File(FilenameUtils.concat(srcdir, srcjar));
-
-  		   cp += ' <classpathentry kind="lib" path="' + jars[i] + '"';
-  		   if (srcfile.exists()) {
-  		      cp += ' sourcepath="' + srcfile.getAbsolutePath() + '"';
-  		   }
-  		   cp += '/>\n';
-  		}
-
-  		cp += '</classpath>';
-
-  		echo = project.createTask("echo");
-  	    echo.setMessage(cp);
-  		echo.setFile(new File(".classpath"));
-  		echo.setAppend(true);
-  	    echo.perform();
-  	]]> </script>
+    </taskdef>
     <mkdir dir=".settings" />
   </target>
 
@@ -2167,6 +2307,47 @@
         </java>
   </target>
 
+  <target name="init-checkstyle" depends="maven-ant-tasks-retrieve-build,build-project" unless="no-checkstyle">
+      <path id="checkstyle.lib.path">
+          <fileset dir="${test.lib}/jars" includes="*.jar"/>
+      </path>
+      <!-- Sevntu custom checks are retrieved by Ivy into lib folder
+         and will be accessible to checkstyle-->
+      <taskdef resource="com/puppycrawl/tools/checkstyle/ant/checkstyle-ant-task.properties"
+               classpathref="checkstyle.lib.path"/>
+  </target>
+
+  <target name="checkstyle" depends="init-checkstyle,maven-ant-tasks-retrieve-build,build-project" description="Run custom checkstyle code analysis" if="java.version.8" unless="no-checkstyle">
+      <property name="checkstyle.log.dir" value="${build.dir}/checkstyle" />
+      <property name="checkstyle.report.file" value="${checkstyle.log.dir}/checkstyle_report.xml"/>
+      <mkdir  dir="${checkstyle.log.dir}" />
+
+      <property name="checkstyle.properties" value="${basedir}/checkstyle.xml" />
+      <property name="checkstyle.suppressions" value="${basedir}/checkstyle_suppressions.xml" />
+      <checkstyle config="${checkstyle.properties}"
+                  failureProperty="checkstyle.failure"
+                  failOnViolation="true">
+          <formatter type="plain"/>
+          <formatter type="xml" tofile="${checkstyle.report.file}"/>
+          <fileset dir="${build.src.java}" includes="**/*.java"/>
+      </checkstyle>
+  </target>
+
+  <target name="checkstyle-test" depends="init-checkstyle,maven-ant-tasks-retrieve-build,build-project" description="Run custom checkstyle code analysis on tests" if="java.version.8" unless="no-checkstyle">
+      <property name="checkstyle.log.dir" value="${build.dir}/checkstyle" />
+      <property name="checkstyle_test.report.file" value="${checkstyle.log.dir}/checkstyle_report_test.xml"/>
+      <mkdir  dir="${checkstyle.log.dir}" />
+
+      <property name="checkstyle_test.properties" value="${basedir}/checkstyle_test.xml" />
+      <property name="checkstyle.suppressions" value="${basedir}/checkstyle_suppressions.xml" />
+      <checkstyle config="${checkstyle_test.properties}"
+                  failureProperty="checkstyle.failure"
+                  failOnViolation="true">
+          <formatter type="plain"/>
+          <formatter type="xml" tofile="${checkstyle_test.report.file}"/>
+          <fileset dir="${test.dir}" includes="**/*.java"/>
+      </checkstyle>
+  </target>
 
   <!-- Installs artifacts to local Maven repository -->
   <target name="mvn-install"
diff --git a/checkstyle.xml b/checkstyle.xml
new file mode 100644
index 0000000..053cc73
--- /dev/null
+++ b/checkstyle.xml
@@ -0,0 +1,113 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!DOCTYPE module PUBLIC
+          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
+          "https://checkstyle.org/dtds/configuration_1_3.dtd">
+
+<module name="Checker">
+  <property name="severity" value="error"/>
+
+  <property name="fileExtensions" value="java, properties, xml"/>
+
+  <module name="BeforeExecutionExclusionFileFilter">
+    <property name="fileNamePattern" value="module\-info\.java$"/>
+  </module>
+
+  <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
+  <!-- this exists only because for some reason the comment filter does not seem to work for Semaphore -->
+  <module name="SuppressionFilter">
+    <property name="file" value="${checkstyle.suppressions}"
+              default="checkstyle-suppressions.xml" />
+    <property name="optional" value="false"/>
+  </module>
+
+  <module name="TreeWalker">
+    <module name="SuppressWithNearbyCommentFilter">
+       <property name="commentFormat" value="checkstyle: permit this import"/>
+       <property name="checkFormat" value="IllegalImport"/>
+       <property name="influenceFormat" value="0"/>
+    </module>
+ 
+    <module name="SuppressWithNearbyCommentFilter">
+       <property name="commentFormat" value="checkstyle: permit this instantiation"/>
+       <property name="checkFormat" value="IllegalInstantiation"/>
+       <property name="influenceFormat" value="0"/>
+    </module>
+ 
+    <module name="SuppressWithNearbyCommentFilter">
+       <property name="commentFormat" value="checkstyle: permit system clock"/>
+       <property name="idFormat" value="blockSystemClock"/>
+       <property name="influenceFormat" value="0"/>
+    </module>
+
+    <module name="SuppressWithNearbyCommentFilter">
+      <property name="commentFormat" value="checkstyle: permit this invocation"/>
+      <property name="idFormat" value="blockPathToFile"/>
+      <property name="influenceFormat" value="0"/>
+    </module>
+ 
+    <module name="RegexpSinglelineJava">
+      <!-- block system time -->
+      <property name="id" value="blockSystemClock"/>
+      <property name="format" value="System\.(currentTimeMillis|nanoTime)"/>
+      <property name="ignoreComments" value="true"/>
+      <property name="message" value="Avoid System for time, should use org.apache.cassandra.utils.Clock.Global or org.apache.cassandra.utils.Clock interface" />
+    </module>
+
+    <module name="RegexpSinglelineJava">
+      <!-- block Instant.now -->
+      <property name="id" value="blockInstantNow"/>
+      <property name="format" value="Instant\.now"/>
+      <property name="ignoreComments" value="true"/>
+      <property name="message" value="Avoid Instant.now() for time, should use org.apache.cassandra.util.FBUtilities.now()" />
+    </module>
+
+    <module name="RegexpSinglelineJava">
+      <!-- block normal executors -->
+      <property name="id" value="blockExecutors"/>
+      <property name="format" value="newSingleThreadExecutor|newFixedThreadPool|newCachedThreadPool|newSingleThreadScheduledExecutor|newWorkStealingPool|newScheduledThreadPool|defaultThreadFactory"/>
+      <property name="ignoreComments" value="true"/>
+      <property name="message" value="Avoid creating an executor directly, should use org.apache.cassandra.concurrent.ExecutorFactory.Global#executorFactory" />
+    </module>
+    <module name="RegexpSinglelineJava">
+      <!-- block guavas directExecutor -->
+      <property name="id" value="blockGuavaDirectExecutor"/>
+      <property name="format" value="MoreExecutors\.directExecutor"/>
+      <property name="ignoreComments" value="true"/>
+      <property name="message" value="Avoid MoreExecutors.directExecutor() in favor of ImmediateExecutor.INSTANCE" />
+    </module>
+    <module name="IllegalImport">
+      <property name="illegalPkgs" value="junit.framework"/>
+      <property name="illegalClasses" value="java.io.File,java.io.FileInputStream,java.io.FileOutputStream,java.io.FileReader,java.io.FileWriter,java.io.RandomAccessFile,java.util.concurrent.Semaphore,java.util.concurrent.CountDownLatch,java.util.concurrent.Executors,java.util.concurrent.LinkedBlockingQueue,java.util.concurrent.SynchronousQueue,java.util.concurrent.ArrayBlockingQueue,com.google.common.util.concurrent.Futures,java.util.concurrent.CompletableFuture,io.netty.util.concurrent.Future,io.netty.util.concurrent.Promise,io.netty.util.concurrent.AbstractFuture,com.google.common.util.concurrent.ListenableFutureTask,com.google.common.util.concurrent.ListenableFuture,com.google.common.util.concurrent.AbstractFuture,java.nio.file.Paths"/>
+    </module>
+    <module name="IllegalInstantiation">
+      <property name="classes" value="java.io.File,java.lang.Thread,java.util.concurrent.FutureTask,java.util.concurrent.Semaphore,java.util.concurrent.CountDownLatch,java.util.concurrent.ScheduledThreadPoolExecutor,java.util.concurrent.ThreadPoolExecutor,java.util.concurrent.ForkJoinPool,java.lang.OutOfMemoryError"/>
+    </module>
+
+    <module name="RegexpSinglelineJava">
+      <!-- block Path#toFile() -->
+      <property name="id" value="blockPathToFile"/>
+      <property name="format" value="toFile\(\)"/>
+      <property name="message" value="Avoid Path#toFile(), as some implementations may not support it." />
+    </module>
+
+    <module name="RedundantImport"/>
+    <module name="UnusedImports"/>
+  </module>
+
+</module>
diff --git a/checkstyle_suppressions.xml b/checkstyle_suppressions.xml
new file mode 100644
index 0000000..ed4d144
--- /dev/null
+++ b/checkstyle_suppressions.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+
+<!DOCTYPE suppressions PUBLIC
+        "-//Checkstyle//DTD SuppressionFilter Configuration 1.1//EN"
+        "https://checkstyle.org/dtds/suppressions_1_1.dtd">
+
+<suppressions>
+  <suppress checks="RegexpSinglelineJava" files="Semaphore\.java"/>
+</suppressions>
diff --git a/checkstyle_test.xml b/checkstyle_test.xml
new file mode 100644
index 0000000..d237827
--- /dev/null
+++ b/checkstyle_test.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You under the Apache License, Version 2.0
+  (the "License"); you may not use this file except in compliance with
+  the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+-->
+<!DOCTYPE module PUBLIC
+          "-//Checkstyle//DTD Checkstyle Configuration 1.3//EN"
+          "https://checkstyle.org/dtds/configuration_1_3.dtd">
+
+<module name="Checker">
+  <property name="severity" value="error"/>
+
+  <property name="fileExtensions" value="java, properties, xml"/>
+
+  <module name="BeforeExecutionExclusionFileFilter">
+    <property name="fileNamePattern" value="module\-info\.java$"/>
+  </module>
+
+  <!-- https://checkstyle.org/config_filters.html#SuppressionFilter -->
+  <!-- this exists only because for some reason the comment filter does not seem to work for Semaphore -->
+  <module name="SuppressionFilter">
+    <property name="file" value="${checkstyle.suppressions}"
+              default="checkstyle-suppressions.xml" />
+    <property name="optional" value="false"/>
+  </module>
+
+  <module name="TreeWalker">
+    <module name="SuppressWithNearbyCommentFilter">
+       <property name="commentFormat" value="checkstyle: permit this import"/>
+       <property name="checkFormat" value="IllegalImport"/>
+       <property name="influenceFormat" value="0"/>
+    </module>
+
+    <module name="SuppressWithNearbyCommentFilter">
+       <property name="commentFormat" value="checkstyle: permit this instantiation"/>
+       <property name="checkFormat" value="IllegalInstantiation"/>
+       <property name="influenceFormat" value="0"/>
+    </module>
+
+    <module name="IllegalImport">
+      <property name="illegalPkgs" value="junit.framework"/>
+      <property name="illegalClasses" value=""/>
+    </module>
+    <module name="IllegalInstantiation">
+      <property name="classes" value=""/>
+    </module>
+
+    <module name="RedundantImport"/>
+    <module name="UnusedImports"/>
+  </module>
+
+</module>
diff --git a/conf/cassandra-topology.properties b/conf/cassandra-topology.properties.example
similarity index 100%
rename from conf/cassandra-topology.properties
rename to conf/cassandra-topology.properties.example
diff --git a/conf/cassandra.yaml b/conf/cassandra.yaml
index 3e4da52..4b2711c 100644
--- a/conf/cassandra.yaml
+++ b/conf/cassandra.yaml
@@ -61,14 +61,16 @@
 # this defines the maximum amount of time a dead host will have hints
 # generated.  After it has been dead this long, new hints for it will not be
 # created until it has been seen alive and gone down again.
-max_hint_window_in_ms: 10800000 # 3 hours
+# Min unit: ms
+max_hint_window: 3h
 
-# Maximum throttle in KBs per second, per delivery thread.  This will be
+# Maximum throttle in KiBs per second, per delivery thread.  This will be
 # reduced proportionally to the number of nodes in the cluster.  (If there
 # are two nodes in the cluster, each delivery thread will use the maximum
 # rate; if there are three, each will throttle to half of the maximum,
 # since we expect two nodes to be delivering hints simultaneously.)
-hinted_handoff_throttle_in_kb: 1024
+# Min unit: KiB
+hinted_handoff_throttle: 1024KiB
 
 # Number of threads with which to deliver hints;
 # Consider increasing this number when you have multi-dc deployments, since
@@ -81,10 +83,21 @@
 
 # How often hints should be flushed from the internal buffers to disk.
 # Will *not* trigger fsync.
-hints_flush_period_in_ms: 10000
+# Min unit: ms
+hints_flush_period: 10000ms
 
-# Maximum size for a single hints file, in megabytes.
-max_hints_file_size_in_mb: 128
+# Maximum size for a single hints file, in mebibytes.
+# Min unit: MiB
+max_hints_file_size: 128MiB
+
+# The file size limit to store hints for an unreachable host, in mebibytes.
+# Once the local hints files have reached the limit, no more new hints will be created.
+# Set a non-positive value will disable the size limit.
+# max_hints_size_per_host: 0MiB
+
+# Enable / disable automatic cleanup for the expired and orphaned hints file.
+# Disable the option in order to preserve those hints on the disk.
+auto_hints_cleanup_enabled: false
 
 # Compression to apply to the hint files. If omitted, hints files
 # will be written uncompressed. LZ4, Snappy, and Deflate compressors
@@ -94,9 +107,24 @@
 #     parameters:
 #         -
 
-# Maximum throttle in KBs per second, total. This will be
+# Enable / disable persistent hint windows.
+#
+# If set to false, a hint will be stored only in case a respective node
+# that hint is for is down less than or equal to max_hint_window.
+#
+# If set to true, a hint will be stored in case there is not any
+# hint which was stored earlier than max_hint_window. This is for cases
+# when a node keeps to restart and hints are not delivered yet, we would be saving
+# hints for that node indefinitely.
+#
+# Defaults to true.
+#
+# hint_window_persistent_enabled: true
+
+# Maximum throttle in KiBs per second, total. This will be
 # reduced proportionally to the number of nodes in the cluster.
-batchlog_replay_throttle_in_kb: 1024
+# Min unit: KiB
+batchlog_replay_throttle: 1024KiB
 
 # Authentication backend, implementing IAuthenticator; used to identify users
 # Out of the box, Cassandra provides org.apache.cassandra.auth.{AllowAllAuthenticator,
@@ -139,35 +167,68 @@
 #   increase system_auth keyspace replication factor if you use this authorizer.
 network_authorizer: AllowAllNetworkAuthorizer
 
+# Depending on the auth strategy of the cluster, it can be beneficial to iterate
+# from root to table (root -> ks -> table) instead of table to root (table -> ks -> root).
+# As the auth entries are whitelisting, once a permission is found you know it to be
+# valid. We default to false as the legacy behavior is to query at the table level then
+# move back up to the root. See CASSANDRA-17016 for details.
+# traverse_auth_from_root: false
+
 # Validity period for roles cache (fetching granted roles can be an expensive
 # operation depending on the role manager, CassandraRoleManager is one example)
 # Granted roles are cached for authenticated sessions in AuthenticatedUser and
 # after the period specified here, become eligible for (async) reload.
 # Defaults to 2000, set to 0 to disable caching entirely.
 # Will be disabled automatically for AllowAllAuthenticator.
-roles_validity_in_ms: 2000
+# For a long-running cache using roles_cache_active_update, consider
+# setting to something longer such as a daily validation: 86400000
+# Min unit: ms
+roles_validity: 2000ms
 
 # Refresh interval for roles cache (if enabled).
 # After this interval, cache entries become eligible for refresh. Upon next
 # access, an async reload is scheduled and the old value returned until it
-# completes. If roles_validity_in_ms is non-zero, then this must be
+# completes. If roles_validity is non-zero, then this must be
 # also.
-# Defaults to the same value as roles_validity_in_ms.
-# roles_update_interval_in_ms: 2000
+# This setting is also used to inform the interval of auto-updating if
+# using roles_cache_active_update.
+# Defaults to the same value as roles_validity.
+# For a long-running cache, consider setting this to 60000 (1 hour) etc.
+# Min unit: ms
+# roles_update_interval: 2000ms
+
+# If true, cache contents are actively updated by a background task at the
+# interval set by roles_update_interval. If false, cache entries
+# become eligible for refresh after their update interval. Upon next access,
+# an async reload is scheduled and the old value returned until it completes.
+# roles_cache_active_update: false
 
 # Validity period for permissions cache (fetching permissions can be an
 # expensive operation depending on the authorizer, CassandraAuthorizer is
 # one example). Defaults to 2000, set to 0 to disable.
 # Will be disabled automatically for AllowAllAuthorizer.
-permissions_validity_in_ms: 2000
+# For a long-running cache using permissions_cache_active_update, consider
+# setting to something longer such as a daily validation: 86400000ms
+# Min unit: ms
+permissions_validity: 2000ms
 
 # Refresh interval for permissions cache (if enabled).
 # After this interval, cache entries become eligible for refresh. Upon next
 # access, an async reload is scheduled and the old value returned until it
-# completes. If permissions_validity_in_ms is non-zero, then this must be
+# completes. If permissions_validity is non-zero, then this must be
 # also.
-# Defaults to the same value as permissions_validity_in_ms.
-# permissions_update_interval_in_ms: 2000
+# This setting is also used to inform the interval of auto-updating if
+# using permissions_cache_active_update.
+# Defaults to the same value as permissions_validity.
+# For a longer-running permissions cache, consider setting to update hourly (60000)
+# Min unit: ms
+# permissions_update_interval: 2000ms
+
+# If true, cache contents are actively updated by a background task at the
+# interval set by permissions_update_interval. If false, cache entries
+# become eligible for refresh after their update interval. Upon next access,
+# an async reload is scheduled and the old value returned until it completes.
+# permissions_cache_active_update: false
 
 # Validity period for credentials cache. This cache is tightly coupled to
 # the provided PasswordAuthenticator implementation of IAuthenticator. If
@@ -178,15 +239,28 @@
 # underlying table, it may not  bring a significant reduction in the
 # latency of individual authentication attempts.
 # Defaults to 2000, set to 0 to disable credentials caching.
-credentials_validity_in_ms: 2000
+# For a long-running cache using credentials_cache_active_update, consider
+# setting to something longer such as a daily validation: 86400000
+# Min unit: ms
+credentials_validity: 2000ms
 
 # Refresh interval for credentials cache (if enabled).
 # After this interval, cache entries become eligible for refresh. Upon next
 # access, an async reload is scheduled and the old value returned until it
-# completes. If credentials_validity_in_ms is non-zero, then this must be
+# completes. If credentials_validity is non-zero, then this must be
 # also.
-# Defaults to the same value as credentials_validity_in_ms.
-# credentials_update_interval_in_ms: 2000
+# This setting is also used to inform the interval of auto-updating if
+# using credentials_cache_active_update.
+# Defaults to the same value as credentials_validity.
+# For a longer-running permissions cache, consider setting to update hourly (60000)
+# Min unit: ms
+# credentials_update_interval: 2000ms
+
+# If true, cache contents are actively updated by a background task at the
+# interval set by credentials_update_interval. If false (default), cache entries
+# become eligible for refresh after their update interval. Upon next access,
+# an async reload is scheduled and the old value returned until it completes.
+# credentials_cache_active_update: false
 
 # The partitioner is responsible for distributing groups of rows (by
 # partition key) across nodes in the cluster. The partitioner can NOT be
@@ -286,8 +360,9 @@
 # fit in the cache. In most cases it is not neccessary to change this value.
 # Constantly re-preparing statements is a performance penalty.
 #
-# Default value ("auto") is 1/256th of the heap or 10MB, whichever is greater
-prepared_statements_cache_size_mb:
+# Default value ("auto") is 1/256th of the heap or 10MiB, whichever is greater
+# Min unit: MiB
+prepared_statements_cache_size:
 
 # Maximum size of the key cache in memory.
 #
@@ -300,8 +375,9 @@
 #
 # NOTE: if you reduce the size, you may not get you hottest keys loaded on startup.
 #
-# Default value is empty to make it "auto" (min(5% of Heap (in MB), 100MB)). Set to 0 to disable key cache.
-key_cache_size_in_mb:
+# Default value is empty to make it "auto" (min(5% of Heap (in MiB), 100MiB)). Set to 0 to disable key cache.
+# Min unit: MiB
+key_cache_size:
 
 # Duration in seconds after which Cassandra should
 # save the key cache. Caches are saved to saved_caches_directory as
@@ -312,7 +388,8 @@
 # has limited use.
 #
 # Default is 14400 or 4 hours.
-key_cache_save_period: 14400
+# Min unit: s
+key_cache_save_period: 4h
 
 # Number of keys from the key cache to save
 # Disabled by default, meaning all keys are going to be saved
@@ -336,7 +413,8 @@
 # headroom for OS block level cache. Do never allow your system to swap.
 #
 # Default value is 0, to disable row caching.
-row_cache_size_in_mb: 0
+# Min unit: MiB
+row_cache_size: 0MiB
 
 # Duration in seconds after which Cassandra should save the row cache.
 # Caches are saved to saved_caches_directory as specified in this configuration file.
@@ -346,7 +424,8 @@
 # has limited use.
 #
 # Default is 0 to disable saving the row cache.
-row_cache_save_period: 0
+# Min unit: s
+row_cache_save_period: 0s
 
 # Number of keys from the row cache to save.
 # Specify 0 (which is the default), meaning all keys are going to be saved
@@ -363,16 +442,18 @@
 #
 # NOTE: if you reduce the size, you may not get you hottest keys loaded on startup.
 #
-# Default value is empty to make it "auto" (min(2.5% of Heap (in MB), 50MB)). Set to 0 to disable counter cache.
+# Default value is empty to make it "auto" (min(2.5% of Heap (in MiB), 50MiB)). Set to 0 to disable counter cache.
 # NOTE: if you perform counter deletes and rely on low gcgs, you should disable the counter cache.
-counter_cache_size_in_mb:
+# Min unit: MiB
+counter_cache_size:
 
 # Duration in seconds after which Cassandra should
 # save the counter cache (keys only). Caches are saved to saved_caches_directory as
 # specified in this configuration file.
 #
 # Default is 7200 or 2 hours.
-counter_cache_save_period: 7200
+# Min unit: s
+counter_cache_save_period: 7200s
 
 # Number of keys from the counter cache to save
 # Disabled by default, meaning all keys are going to be saved
@@ -383,9 +464,10 @@
 # saved_caches_directory: /var/lib/cassandra/saved_caches
 
 # Number of seconds the server will wait for each cache (row, key, etc ...) to load while starting
-# the Cassandra process. Setting this to a negative value is equivalent to disabling all cache loading on startup
+# the Cassandra process. Setting this to zero is equivalent to disabling all cache loading on startup
 # while still having the cache during runtime.
-# cache_load_timeout_seconds: 30
+# Min unit: s
+# cache_load_timeout: 30s
 
 # commitlog_sync may be either "periodic", "group", or "batch." 
 # 
@@ -398,19 +480,22 @@
 #
 # group mode is similar to batch mode, where Cassandra will not ack writes
 # until the commit log has been flushed to disk. The difference is group
-# mode will wait up to commitlog_sync_group_window_in_ms between flushes.
+# mode will wait up to commitlog_sync_group_window between flushes.
 #
-# commitlog_sync_group_window_in_ms: 1000
+# Min unit: ms
+# commitlog_sync_group_window: 1000ms
 #
 # the default option is "periodic" where writes may be acked immediately
-# and the CommitLog is simply synced every commitlog_sync_period_in_ms
+# and the CommitLog is simply synced every commitlog_sync_period
 # milliseconds.
 commitlog_sync: periodic
-commitlog_sync_period_in_ms: 10000
+# Min unit: ms
+commitlog_sync_period: 10000ms
 
 # When in periodic commitlog mode, the number of milliseconds to block writes
 # while waiting for a slow disk flush to complete.
-# periodic_commitlog_sync_lag_block_in_ms: 
+# Min unit: ms
+# periodic_commitlog_sync_lag_block:
 
 # The size of the individual commitlog file segments.  A commitlog
 # segment may be archived, deleted, or recycled once all the data
@@ -421,14 +506,15 @@
 # archiving commitlog segments (see commitlog_archiving.properties),
 # then you probably want a finer granularity of archiving; 8 or 16 MB
 # is reasonable.
-# Max mutation size is also configurable via max_mutation_size_in_kb setting in
-# cassandra.yaml. The default is half the size commitlog_segment_size_in_mb * 1024.
+# Max mutation size is also configurable via max_mutation_size setting in
+# cassandra.yaml. The default is half the size commitlog_segment_size in bytes.
 # This should be positive and less than 2048.
 #
-# NOTE: If max_mutation_size_in_kb is set explicitly then commitlog_segment_size_in_mb must
-# be set to at least twice the size of max_mutation_size_in_kb / 1024
+# NOTE: If max_mutation_size is set explicitly then commitlog_segment_size must
+# be set to at least twice the size of max_mutation_size
 #
-commitlog_segment_size_in_mb: 32
+# Min unit: MiB
+commitlog_segment_size: 32MiB
 
 # Compression to apply to the commit log. If omitted, the commit log
 # will be written uncompressed.  LZ4, Snappy, and Deflate compressors
@@ -456,15 +542,15 @@
 # any class that implements the SeedProvider interface and has a
 # constructor that takes a Map<String, String> of parameters will do.
 seed_provider:
-    # Addresses of hosts that are deemed contact points. 
-    # Cassandra nodes use this list of hosts to find each other and learn
-    # the topology of the ring.  You must change this if you are running
-    # multiple nodes!
-    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
-      parameters:
-          # seeds is actually a comma-delimited list of addresses.
-          # Ex: "<ip1>,<ip2>,<ip3>"
-          - seeds: "127.0.0.1:7000"
+  # Addresses of hosts that are deemed contact points.
+  # Cassandra nodes use this list of hosts to find each other and learn
+  # the topology of the ring.  You must change this if you are running
+  # multiple nodes!
+  - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+    parameters:
+      # seeds is actually a comma-delimited list of addresses.
+      # Ex: "<ip1>,<ip2>,<ip3>"
+      - seeds: "127.0.0.1:7000"
 
 # For workloads with more data than can fit in memory, Cassandra's
 # bottleneck will be reads that need to fetch data from
@@ -492,7 +578,8 @@
 # overhead which is roughly 128 bytes per chunk (i.e. 0.2% of the reserved size
 # if the default 64k chunk size is used).
 # Memory is only allocated when needed.
-# networking_cache_size_in_mb: 128
+# Min unit: MiB
+# networking_cache_size: 128MiB
 
 # Enable the sstable chunk cache.  The chunk cache will store recently accessed
 # sections of the sstable in-memory as uncompressed buffers.
@@ -506,11 +593,12 @@
 # overhead which is roughly 128 bytes per chunk (i.e. 0.2% of the reserved size
 # if the default 64k chunk size is used).
 # Memory is only allocated when needed.
-# file_cache_size_in_mb: 512
+# Min unit: MiB
+# file_cache_size: 512MiB
 
 # Flag indicating whether to allocate on or off heap when the sstable buffer
 # pool is exhausted, that is when it has exceeded the maximum memory
-# file_cache_size_in_mb, beyond which it will not cache buffers but allocate on request.
+# file_cache_size, beyond which it will not cache buffers but allocate on request.
 
 # buffer_pool_use_heap_if_exhausted: true
 
@@ -524,8 +612,10 @@
 # accepting writes when the limit is exceeded until a flush completes,
 # and will trigger a flush based on memtable_cleanup_threshold
 # If omitted, Cassandra will set both to 1/4 the size of the heap.
-# memtable_heap_space_in_mb: 2048
-# memtable_offheap_space_in_mb: 2048
+# Min unit: MiB
+# memtable_heap_space: 2048MiB
+# Min unit: MiB
+# memtable_offheap_space: 2048MiB
 
 # memtable_cleanup_threshold is deprecated. The default calculation
 # is the only reasonable choice. See the comments on  memtable_flush_writers
@@ -557,12 +647,13 @@
 # is 1/16th of the available heap. The main tradeoff is that smaller trees
 # have less resolution, which can lead to over-streaming data. If you see heap
 # pressure during repairs, consider lowering this, but you cannot go below
-# one megabyte. If you see lots of over-streaming, consider raising
+# one mebibyte. If you see lots of over-streaming, consider raising
 # this or using subrange repair.
 #
 # For more details see https://issues.apache.org/jira/browse/CASSANDRA-14096.
 #
-# repair_session_space_in_mb:
+# Min unit: MiB
+# repair_session_space:
 
 # Total space to use for commit logs on disk.
 #
@@ -573,7 +664,7 @@
 # The default value is the smaller of 8192, and 1/4 of the total space
 # of the commitlog volume.
 #
-# commitlog_total_space_in_mb: 8192
+# commitlog_total_space: 8192MiB
 
 # This sets the number of memtable flush writer threads per disk
 # as well as the total number of memtables that can be flushed concurrently.
@@ -602,7 +693,7 @@
 # and flush size and frequency. More is not better you just need enough flush writers
 # to never stall waiting for flushing to free memory.
 #
-#memtable_flush_writers: 2
+# memtable_flush_writers: 2
 
 # Total space to use for change-data-capture logs on disk.
 #
@@ -610,14 +701,16 @@
 # on Mutations including tables with CDC enabled. A CDCCompactor is responsible
 # for parsing the raw CDC logs and deleting them when parsing is completed.
 #
-# The default value is the min of 4096 mb and 1/8th of the total space
+# The default value is the min of 4096 MiB and 1/8th of the total space
 # of the drive where cdc_raw_directory resides.
-# cdc_total_space_in_mb: 4096
+# Min unit: MiB
+# cdc_total_space: 4096MiB
 
 # When we hit our cdc_raw limit and the CDCCompactor is either running behind
 # or experiencing backpressure, we check at the following interval to see if any
 # new space for cdc-tracked tables has been made available. Default to 250ms
-# cdc_free_space_check_interval_ms: 250
+# Min unit: ms
+# cdc_free_space_check_interval: 250ms
 
 # A fixed memory pool size in MB for for SSTable index summaries. If left
 # empty, this will default to 5% of the heap size. If the memory usage of
@@ -625,13 +718,15 @@
 # shrink their index summaries in order to meet this limit.  However, this
 # is a best-effort process. In extreme conditions Cassandra may need to use
 # more than this amount of memory.
-index_summary_capacity_in_mb:
+# Min unit: KiB
+index_summary_capacity:
 
 # How frequently index summaries should be resampled.  This is done
 # periodically to redistribute memory from the fixed-size pool to sstables
-# proportional their recent read rates.  Setting to -1 will disable this
+# proportional their recent read rates.  Setting to null value will disable this
 # process, leaving existing index summaries at their current sampling level.
-index_summary_resize_interval_in_minutes: 60
+# Min unit: m
+index_summary_resize_interval: 60m
 
 # Whether to, when doing sequential writing, fsync() at intervals in
 # order to force the operating system to flush the dirty
@@ -639,7 +734,8 @@
 # impacting read latencies. Almost always a good idea on SSDs; not
 # necessarily on platters.
 trickle_fsync: false
-trickle_fsync_interval_in_kb: 10240
+# Min unit: KiB
+trickle_fsync_interval: 10240KiB
 
 # TCP port, for commands and data
 # For security reasons, you should not expose this port to the internet.  Firewall it if needed.
@@ -711,9 +807,10 @@
 # native_transport_max_threads: 128
 #
 # The maximum size of allowed frame. Frame (requests) larger than this will
-# be rejected as invalid. The default is 256MB. If you're changing this parameter,
-# you may want to adjust max_value_size_in_mb accordingly. This should be positive and less than 2048.
-# native_transport_max_frame_size_in_mb: 256
+# be rejected as invalid. The default is 16MiB. If you're changing this parameter,
+# you may want to adjust max_value_size accordingly. This should be positive and less than 2048.
+# Min unit: MiB
+# native_transport_max_frame_size: 16MiB
 
 # The maximum number of concurrent client connections.
 # The default is -1, which means unlimited.
@@ -735,7 +832,18 @@
 # values for heartbeat intervals have to be set on the client side.
 #
 # Idle connection timeouts are disabled by default.
-# native_transport_idle_timeout_in_ms: 60000
+# Min unit: ms
+# native_transport_idle_timeout: 60000ms
+
+# When enabled, limits the number of native transport requests dispatched for processing per second.
+# Behavior once the limit has been breached depends on the value of THROW_ON_OVERLOAD specified in
+# the STARTUP message sent by the client during connection establishment. (See section "4.1.1. STARTUP"
+# in "CQL BINARY PROTOCOL v5".) With the THROW_ON_OVERLOAD flag enabled, messages that breach the limit
+# are dropped, and an OverloadedException is thrown for the client to handle. When the flag is not
+# enabled, the server will stop consuming messages from the channel/socket, putting backpressure on
+# the client while already dispatched messages are processed.
+# native_transport_rate_limiting_enabled: false
+# native_transport_max_requests_per_second: 1000000
 
 # The address or interface to bind the native transport server to.
 #
@@ -778,12 +886,14 @@
 # /proc/sys/net/ipv4/tcp_wmem
 # /proc/sys/net/ipv4/tcp_wmem
 # and 'man tcp'
-# internode_socket_send_buffer_size_in_bytes:
+# Min unit: B
+# internode_socket_send_buffer_size:
 
 # Uncomment to set socket buffer size for internode communication
 # Note that when setting this, the buffer size is limited by net.core.wmem_max
 # and when not setting it it is defined by net.ipv4.tcp_wmem
-# internode_socket_receive_buffer_size_in_bytes:
+# Min unit: B
+# internode_socket_receive_buffer_size:
 
 # Set to true to have Cassandra create a hard link to each sstable
 # flushed or streamed locally in a backups/ subdirectory of the
@@ -803,6 +913,14 @@
 # lose data on truncation or drop.
 auto_snapshot: true
 
+# Adds a time-to-live (TTL) to auto snapshots generated by table
+# truncation or drop (when enabled).
+# After the TTL is elapsed, the snapshot is automatically cleared.
+# By default, auto snapshots *do not* have TTL, uncomment the property below
+# to enable TTL on auto snapshots.
+# Accepted units: d (days), h (hours) or m (minutes)
+# auto_snapshot_ttl: 30d
+
 # The act of creating or clearing a snapshot involves creating or removing
 # potentially tens of thousands of links, which can cause significant performance
 # impact, especially on consumer grade SSDs. A non-zero value here can
@@ -820,7 +938,8 @@
 # - but, Cassandra will keep the collation index in memory for hot
 #   rows (as part of the key cache), so a larger granularity means
 #   you can cache more hot rows
-column_index_size_in_kb: 64
+# Min unit: KiB
+column_index_size: 64KiB
 
 # Per sstable indexed key cache entries (the collation index in memory
 # mentioned above) exceeding this size will not be held on heap.
@@ -829,7 +948,8 @@
 #
 # Note that this size refers to the size of the
 # serialized index information and not the size of the partition.
-column_index_cache_size_in_kb: 2
+# Min unit: KiB
+column_index_cache_size: 2KiB
 
 # Number of simultaneous compactions to allow, NOT including
 # validation "compactions" for anti-entropy repair.  Simultaneous
@@ -838,14 +958,14 @@
 # during a single long running compactions. The default is usually
 # fine and if you experience problems with compaction running too
 # slowly or too fast, you should look at
-# compaction_throughput_mb_per_sec first.
+# compaction_throughput first.
 #
 # concurrent_compactors defaults to the smaller of (number of disks,
 # number of cores), with a minimum of 2 and a maximum of 8.
 # 
 # If your data directories are backed by SSD, you should increase this
 # to the number of cores.
-#concurrent_compactors: 1
+# concurrent_compactors: 1
 
 # Number of simultaneous repair validations to allow. If not set or set to
 # a value less than 1, it defaults to the value of concurrent_compactors.
@@ -866,37 +986,60 @@
 # Setting this to 0 disables throttling. Note that this accounts for all types
 # of compaction, including validation compaction (building Merkle trees
 # for repairs).
-compaction_throughput_mb_per_sec: 64
+compaction_throughput: 64MiB/s
 
 # When compacting, the replacement sstable(s) can be opened before they
 # are completely written, and used in place of the prior sstables for
 # any range that has been written. This helps to smoothly transfer reads 
 # between the sstables, reducing page cache churn and keeping hot rows hot
-sstable_preemptive_open_interval_in_mb: 50
+# Set sstable_preemptive_open_interval to null for disabled which is equivalent to
+# sstable_preemptive_open_interval_in_mb being negative
+# Min unit: MiB
+sstable_preemptive_open_interval: 50MiB
+
+# Starting from 4.1 sstables support UUID based generation identifiers. They are disabled by default
+# because once enabled, there is no easy way to downgrade. When the node is restarted with this option
+# set to true, each newly created sstable will have a UUID based generation identifier and such files are
+# not readable by previous Cassandra versions. At some point, this option will become true by default
+# and eventually get removed from the configuration.
+uuid_sstable_identifiers_enabled: false
 
 # When enabled, permits Cassandra to zero-copy stream entire eligible
 # SSTables between nodes, including every component.
 # This speeds up the network transfer significantly subject to
-# throttling specified by stream_throughput_outbound_megabits_per_sec.
+# throttling specified by entire_sstable_stream_throughput_outbound,
+# and entire_sstable_inter_dc_stream_throughput_outbound
+# for inter-DC transfers.
 # Enabling this will reduce the GC pressure on sending and receiving node.
 # When unset, the default is enabled. While this feature tries to keep the
 # disks balanced, it cannot guarantee it. This feature will be automatically
 # disabled if internode encryption is enabled.
 # stream_entire_sstables: true
 
+# Throttles entire SSTable outbound streaming file transfers on
+# this node to the given total throughput in Mbps.
+# Setting this value to 0 it disables throttling.
+# When unset, the default is 200 Mbps or 24 MiB/s.
+# entire_sstable_stream_throughput_outbound: 24MiB/s
+
+# Throttles entire SSTable file streaming between datacenters.
+# Setting this value to 0 disables throttling for entire SSTable inter-DC file streaming.
+# When unset, the default is 200 Mbps or 24 MiB/s.
+# entire_sstable_inter_dc_stream_throughput_outbound: 24MiB/s
+
 # Throttles all outbound streaming file transfers on this node to the
 # given total throughput in Mbps. This is necessary because Cassandra does
 # mostly sequential IO when streaming data during bootstrap or repair, which
 # can lead to saturating the network connection and degrading rpc performance.
-# When unset, the default is 200 Mbps or 25 MB/s.
-# stream_throughput_outbound_megabits_per_sec: 200
+# When unset, the default is 200 Mbps or 24 MiB/s.
+# stream_throughput_outbound: 24MiB/s
 
 # Throttles all streaming file transfer between the datacenters,
 # this setting allows users to throttle inter dc stream throughput in addition
 # to throttling all network stream traffic as configured with
 # stream_throughput_outbound_megabits_per_sec
-# When unset, the default is 200 Mbps or 25 MB/s
-# inter_dc_stream_throughput_outbound_megabits_per_sec: 200
+# When unset, the default is 200 Mbps or 24 MiB/s.
+# inter_dc_stream_throughput_outbound: 24MiB/s
 
 # Server side timeouts for requests. The server will return a timeout exception
 # to the client if it can't complete an operation within the corresponding
@@ -905,52 +1048,62 @@
 #      failures.
 #   2) operations that use too much CPU/read too much data (leading to memory build
 #      up) by putting a limit to how long an operation will execute.
-# For this reason, you should avoid putting these settings too high. In other words, 
-# if you are timing out requests because of underlying resource constraints then 
-# increasing the timeout will just cause more problems. Of course putting them too 
-# low is equally ill-advised since clients could get timeouts even for successful 
+# For this reason, you should avoid putting these settings too high. In other words,
+# if you are timing out requests because of underlying resource constraints then
+# increasing the timeout will just cause more problems. Of course putting them too
+# low is equally ill-advised since clients could get timeouts even for successful
 # operations just because the timeout setting is too tight.
 
 # How long the coordinator should wait for read operations to complete.
 # Lowest acceptable value is 10 ms.
-read_request_timeout_in_ms: 5000
+# Min unit: ms
+read_request_timeout: 5000ms
 # How long the coordinator should wait for seq or index scans to complete.
 # Lowest acceptable value is 10 ms.
-range_request_timeout_in_ms: 10000
+# Min unit: ms
+range_request_timeout: 10000ms
 # How long the coordinator should wait for writes to complete.
 # Lowest acceptable value is 10 ms.
-write_request_timeout_in_ms: 2000
+# Min unit: ms
+write_request_timeout: 2000ms
 # How long the coordinator should wait for counter writes to complete.
 # Lowest acceptable value is 10 ms.
-counter_write_request_timeout_in_ms: 5000
+# Min unit: ms
+counter_write_request_timeout: 5000ms
 # How long a coordinator should continue to retry a CAS operation
 # that contends with other proposals for the same row.
 # Lowest acceptable value is 10 ms.
-cas_contention_timeout_in_ms: 1000
+# Min unit: ms
+cas_contention_timeout: 1000ms
 # How long the coordinator should wait for truncates to complete
 # (This can be much longer, because unless auto_snapshot is disabled
 # we need to flush first so we can snapshot before removing the data.)
 # Lowest acceptable value is 10 ms.
-truncate_request_timeout_in_ms: 60000
+# Min unit: ms
+truncate_request_timeout: 60000ms
 # The default timeout for other, miscellaneous operations.
 # Lowest acceptable value is 10 ms.
-request_timeout_in_ms: 10000
+# Min unit: ms
+request_timeout: 10000ms
 
 # Defensive settings for protecting Cassandra from true network partitions.
 # See (CASSANDRA-14358) for details.
 #
 # The amount of time to wait for internode tcp connections to establish.
-# internode_tcp_connect_timeout_in_ms: 2000
+# Min unit: ms
+# internode_tcp_connect_timeout: 2000ms
 #
 # The amount of time unacknowledged data is allowed on a connection before we throw out the connection
 # Note this is only supported on Linux + epoll, and it appears to behave oddly above a setting of 30000
 # (it takes much longer than 30s) as of Linux 4.12. If you want something that high set this to 0
 # which picks up the OS default and configure the net.ipv4.tcp_retries2 sysctl to be ~8.
-# internode_tcp_user_timeout_in_ms: 30000
+# Min unit: ms
+# internode_tcp_user_timeout: 30000ms
 
 # The amount of time unacknowledged data is allowed on a streaming connection.
 # The default is 5 minutes. Increase it or set it to 0 in order to increase the timeout.
-# internode_streaming_tcp_user_timeout_in_ms: 300000
+# Min unit: ms
+# internode_streaming_tcp_user_timeout: 300000ms
 
 # Global, per-endpoint and per-connection limits imposed on messages queued for delivery to other nodes
 # and waiting to be processed on arrival from other nodes in the cluster.  These limits are applied to the on-wire
@@ -958,7 +1111,7 @@
 #
 # The basic per-link limit is consumed in isolation before any endpoint or global limit is imposed.
 # Each node-pair has three links: urgent, small and large.  So any given node may have a maximum of
-# N*3*(internode_application_send_queue_capacity_in_bytes+internode_application_receive_queue_capacity_in_bytes)
+# N*3*(internode_application_send_queue_capacity+internode_application_receive_queue_capacity)
 # messages queued without any coordination between them although in practice, with token-aware routing, only RF*tokens
 # nodes should need to communicate with significant bandwidth.
 #
@@ -967,18 +1120,20 @@
 # The global limit is imposed on all messages exceeding the per-link limit, simultaneously with the per-endpoint limit,
 # on all links to or from any node in the cluster.
 #
-# internode_application_send_queue_capacity_in_bytes: 4194304                       #4MiB
-# internode_application_send_queue_reserve_endpoint_capacity_in_bytes: 134217728    #128MiB
-# internode_application_send_queue_reserve_global_capacity_in_bytes: 536870912      #512MiB
-# internode_application_receive_queue_capacity_in_bytes: 4194304                    #4MiB
-# internode_application_receive_queue_reserve_endpoint_capacity_in_bytes: 134217728 #128MiB
-# internode_application_receive_queue_reserve_global_capacity_in_bytes: 536870912   #512MiB
+# Min unit: B
+# internode_application_send_queue_capacity: 4MiB
+# internode_application_send_queue_reserve_endpoint_capacity: 128MiB
+# internode_application_send_queue_reserve_global_capacity: 512MiB
+# internode_application_receive_queue_capacity: 4MiB
+# internode_application_receive_queue_reserve_endpoint_capacity: 128MiB
+# internode_application_receive_queue_reserve_global_capacity: 512MiB
 
 
 # How long before a node logs slow queries. Select queries that take longer than
 # this timeout to execute, will generate an aggregated log message, so that slow queries
 # can be identified. Set this value to zero to disable slow query logging.
-slow_query_log_timeout_in_ms: 500
+# Min unit: ms
+slow_query_log_timeout: 500ms
 
 # Enable operation timeout information exchange between nodes to accurately
 # measure request timeouts.  If disabled, replicas will assume that requests
@@ -988,21 +1143,66 @@
 #
 # Warning: It is generally assumed that users have setup NTP on their clusters, and that clocks are modestly in sync, 
 # since this is a requirement for general correctness of last write wins.
-#cross_node_timeout: true
+# internode_timeout: true
 
-# Set keep-alive period for streaming
-# This node will send a keep-alive message periodically with this period.
-# If the node does not receive a keep-alive message from the peer for
-# 2 keep-alive cycles the stream session times out and fail
-# Default value is 300s (5 minutes), which means stalled stream
-# times out in 10 minutes by default
-# streaming_keep_alive_period_in_secs: 300
+# Set period for idle state control messages for earlier detection of failed streams
+# This node will send a keep-alive message periodically on the streaming's control channel.
+# This ensures that any eventual SocketTimeoutException will occur within 2 keep-alive cycles
+# If the node cannot send, or timeouts sending, the keep-alive message on the netty control channel
+# the stream session is closed.
+# Default value is 300s (5 minutes), which means stalled streams
+# are detected within 10 minutes
+# Specify 0 to disable.
+# Min unit: s
+# streaming_keep_alive_period: 300s
 
 # Limit number of connections per host for streaming
 # Increase this when you notice that joins are CPU-bound rather that network
 # bound (for example a few nodes with big files).
 # streaming_connections_per_host: 1
 
+# Settings for stream stats tracking; used by system_views.streaming table
+# How long before a stream is evicted from tracking; this impacts both historic and currently running
+# streams.
+# streaming_state_expires: 3d
+# How much memory may be used for tracking before evicting session from tracking; once crossed
+# historic and currently running streams maybe impacted.
+# streaming_state_size: 40MiB
+# Enable/Disable tracking of streaming stats
+# streaming_stats_enabled: true
+
+# Allows denying configurable access (rw/rr) to operations on configured ks, table, and partitions, intended for use by
+# operators to manage cluster health vs application access. See CASSANDRA-12106 and CEP-13 for more details.
+# partition_denylist_enabled: false
+
+# denylist_writes_enabled: true
+# denylist_reads_enabled: true
+# denylist_range_reads_enabled: true
+
+# The interval at which keys in the cache for denylisting will "expire" and async refresh from the backing DB.
+# Note: this serves only as a fail-safe, as the usage pattern is expected to be "mutate state, refresh cache" on any
+# changes to the underlying denylist entries. See documentation for details.
+# Min unit: s
+# denylist_refresh: 600s
+
+# In the event of errors on attempting to load the denylist cache, retry on this interval.
+# Min unit: s
+# denylist_initial_load_retry: 5s
+
+# We cap the number of denylisted keys allowed per table to keep things from growing unbounded. Nodes will warn above
+# this limit while allowing new denylisted keys to be inserted. Denied keys are loaded in natural query / clustering
+# ordering by partition key in case of overflow.
+# denylist_max_keys_per_table: 1000
+
+# We cap the total number of denylisted keys allowed in the cluster to keep things from growing unbounded.
+# Nodes will warn on initial cache load that there are too many keys and be direct the operator to trim down excess
+# entries to within the configured limits.
+# denylist_max_keys_total: 10000
+
+# Since the denylist in many ways serves to protect the health of the cluster from partitions operators have identified
+# as being in a bad state, we usually want more robustness than just CL.ONE on operations to/from these tables to
+# ensure that these safeguards are in place. That said, we allow users to configure this if they're so inclined.
+# denylist_consistency_level: QUORUM
 
 # phi value that must be reached for a host to be marked down.
 # most users should never need to adjust this.
@@ -1075,10 +1275,12 @@
 
 # controls how often to perform the more expensive part of host score
 # calculation
-dynamic_snitch_update_interval_in_ms: 100 
+# Min unit: ms
+dynamic_snitch_update_interval: 100ms
 # controls how often to reset all host scores, allowing a bad host to
 # possibly recover
-dynamic_snitch_reset_interval_in_ms: 600000
+# Min unit: ms
+dynamic_snitch_reset_interval: 600000ms
 # if set greater than zero, this will allow
 # 'pinning' of replicas to hosts in order to increase cache capacity.
 # The badness threshold will control how much worse the pinned host has to be
@@ -1111,39 +1313,44 @@
 # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual
 # auth set require_client_auth=true. Restart all nodes
 server_encryption_options:
-    # On outbound connections, determine which type of peers to securely connect to.
-    #   The available options are :
-    #     none : Do not encrypt outgoing connections
-    #     dc   : Encrypt connections to peers in other datacenters but not within datacenters
-    #     rack : Encrypt connections to peers in other racks but not within racks
-    #     all  : Always use encrypted connections
-    internode_encryption: none
-    # When set to true, encrypted and unencrypted connections are allowed on the storage_port
-    # This should _only be true_ while in unencrypted or transitional operation
-    # optional defaults to true if internode_encryption is none
-    # optional: true
-    # If enabled, will open up an encrypted listening socket on ssl_storage_port. Should only be used
-    # during upgrade to 4.0; otherwise, set to false.
-    enable_legacy_ssl_storage_port: false
-    # Set to a valid keystore if internode_encryption is dc, rack or all
-    keystore: conf/.keystore
-    keystore_password: cassandra
-    # Verify peer server certificates
-    require_client_auth: false
-    # Set to a valid trustore if require_client_auth is true
-    truststore: conf/.truststore
-    truststore_password: cassandra
-    # Verify that the host name in the certificate matches the connected host
-    require_endpoint_verification: false
-    # More advanced defaults:
-    # protocol: TLS
-    # store_type: JKS
-    # cipher_suites: [
-    #   TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-    #   TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
-    #   TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA,
-    #   TLS_RSA_WITH_AES_256_CBC_SHA
-    # ]
+  # On outbound connections, determine which type of peers to securely connect to.
+  #   The available options are :
+  #     none : Do not encrypt outgoing connections
+  #     dc   : Encrypt connections to peers in other datacenters but not within datacenters
+  #     rack : Encrypt connections to peers in other racks but not within racks
+  #     all  : Always use encrypted connections
+  internode_encryption: none
+  # When set to true, encrypted and unencrypted connections are allowed on the storage_port
+  # This should _only be true_ while in unencrypted or transitional operation
+  # optional defaults to true if internode_encryption is none
+  # optional: true
+  # If enabled, will open up an encrypted listening socket on ssl_storage_port. Should only be used
+  # during upgrade to 4.0; otherwise, set to false.
+  legacy_ssl_storage_port_enabled: false
+  # Set to a valid keystore if internode_encryption is dc, rack or all
+  keystore: conf/.keystore
+  keystore_password: cassandra
+  # Configure the way Cassandra creates SSL contexts.
+  # To use PEM-based key material, see org.apache.cassandra.security.PEMBasedSslContextFactory
+  # ssl_context_factory:
+  #     # Must be an instance of org.apache.cassandra.security.ISslContextFactory
+  #     class_name: org.apache.cassandra.security.DefaultSslContextFactory
+  # Verify peer server certificates
+  require_client_auth: false
+  # Set to a valid trustore if require_client_auth is true
+  truststore: conf/.truststore
+  truststore_password: cassandra
+  # Verify that the host name in the certificate matches the connected host
+  require_endpoint_verification: false
+  # More advanced defaults:
+  # protocol: TLS
+  # store_type: JKS
+  # cipher_suites: [
+  #   TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+  #   TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
+  #   TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA,
+  #   TLS_RSA_WITH_AES_256_CBC_SHA
+  # ]
 
 # Configure client-to-server encryption.
 #
@@ -1158,29 +1365,34 @@
 # Step 2: Set optional=false (or remove it) and if you generated truststores and want to use mutual
 # auth set require_client_auth=true. Restart all nodes
 client_encryption_options:
-    # Enable client-to-server encryption
-    enabled: false
-    # When set to true, encrypted and unencrypted connections are allowed on the native_transport_port
-    # This should _only be true_ while in unencrypted or transitional operation
-    # optional defaults to true when enabled is false, and false when enabled is true.
-    # optional: true
-    # Set keystore and keystore_password to valid keystores if enabled is true
-    keystore: conf/.keystore
-    keystore_password: cassandra
-    # Verify client certificates
-    require_client_auth: false
-    # Set trustore and truststore_password if require_client_auth is true
-    # truststore: conf/.truststore
-    # truststore_password: cassandra
-    # More advanced defaults:
-    # protocol: TLS
-    # store_type: JKS
-    # cipher_suites: [
-    #   TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
-    #   TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
-    #   TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA,
-    #   TLS_RSA_WITH_AES_256_CBC_SHA
-    # ]
+  # Enable client-to-server encryption
+  enabled: false
+  # When set to true, encrypted and unencrypted connections are allowed on the native_transport_port
+  # This should _only be true_ while in unencrypted or transitional operation
+  # optional defaults to true when enabled is false, and false when enabled is true.
+  # optional: true
+  # Set keystore and keystore_password to valid keystores if enabled is true
+  keystore: conf/.keystore
+  keystore_password: cassandra
+  # Configure the way Cassandra creates SSL contexts.
+  # To use PEM-based key material, see org.apache.cassandra.security.PEMBasedSslContextFactory
+  # ssl_context_factory:
+  #     # Must be an instance of org.apache.cassandra.security.ISslContextFactory
+  #     class_name: org.apache.cassandra.security.DefaultSslContextFactory
+  # Verify client certificates
+  require_client_auth: false
+  # Set trustore and truststore_password if require_client_auth is true
+  # truststore: conf/.truststore
+  # truststore_password: cassandra
+  # More advanced defaults:
+  # protocol: TLS
+  # store_type: JKS
+  # cipher_suites: [
+  #   TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
+  #   TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
+  #   TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA, TLS_RSA_WITH_AES_128_GCM_SHA256, TLS_RSA_WITH_AES_128_CBC_SHA,
+  #   TLS_RSA_WITH_AES_256_CBC_SHA
+  # ]
 
 # internode_compression controls whether traffic between nodes is
 # compressed.
@@ -1203,28 +1415,22 @@
 inter_dc_tcp_nodelay: false
 
 # TTL for different trace types used during logging of the repair process.
-tracetype_query_ttl: 86400
-tracetype_repair_ttl: 604800
+# Min unit: s
+trace_type_query_ttl: 1d
+# Min unit: s
+trace_type_repair_ttl: 7d
 
-# If unset, all GC Pauses greater than gc_log_threshold_in_ms will log at
+# If unset, all GC Pauses greater than gc_log_threshold will log at
 # INFO level
 # UDFs (user defined functions) are disabled by default.
 # As of Cassandra 3.0 there is a sandbox in place that should prevent execution of evil code.
-enable_user_defined_functions: false
+user_defined_functions_enabled: false
 
 # Enables scripted UDFs (JavaScript UDFs).
-# Java UDFs are always enabled, if enable_user_defined_functions is true.
+# Java UDFs are always enabled, if user_defined_functions_enabled is true.
 # Enable this option to be able to use UDFs with "language javascript" or any custom JSR-223 provider.
-# This option has no effect, if enable_user_defined_functions is false.
-enable_scripted_user_defined_functions: false
-
-# The default Windows kernel timer and scheduling resolution is 15.6ms for power conservation.
-# Lowering this value on Windows can provide much tighter latency and better throughput, however
-# some virtualized environments may see a negative performance impact from changing this setting
-# below their system default. The sysinternals 'clockres' tool can confirm your system's default
-# setting.
-windows_timer_interval: 1
-
+# This option has no effect, if user_defined_functions_enabled is false.
+scripted_user_defined_functions_enabled: false
 
 # Enables encrypting data at-rest (on disk). Different key providers can be plugged in, but the default reads from
 # a JCE-style keystore. A single keystore can hold multiple keys, but the one referenced by
@@ -1239,19 +1445,19 @@
 # Currently, only the following file types are supported for transparent data encryption, although
 # more are coming in future cassandra releases: commitlog, hints
 transparent_data_encryption_options:
-    enabled: false
-    chunk_length_kb: 64
-    cipher: AES/CBC/PKCS5Padding
-    key_alias: testing:1
-    # CBC IV length for AES needs to be 16 bytes (which is also the default size)
-    # iv_length: 16
-    key_provider:
-      - class_name: org.apache.cassandra.security.JKSKeyProvider
-        parameters:
-          - keystore: conf/.keystore
-            keystore_password: cassandra
-            store_type: JCEKS
-            key_password: cassandra
+  enabled: false
+  chunk_length_kb: 64
+  cipher: AES/CBC/PKCS5Padding
+  key_alias: testing:1
+  # CBC IV length for AES needs to be 16 bytes (which is also the default size)
+  # iv_length: 16
+  key_provider:
+    - class_name: org.apache.cassandra.security.JKSKeyProvider
+      parameters:
+        - keystore: conf/.keystore
+          keystore_password: cassandra
+          store_type: JCEKS
+          key_password: cassandra
 
 
 #####################
@@ -1290,32 +1496,54 @@
     cached_rows_warn_threshold: 2000
     cached_rows_fail_threshold: 32000
 
-# Log WARN on any multiple-partition batch size exceeding this value. 5kb per batch by default.
+# Log WARN on any multiple-partition batch size exceeding this value. 5KiB per batch by default.
 # Caution should be taken on increasing the size of this threshold as it can lead to node instability.
-batch_size_warn_threshold_in_kb: 5
+# Min unit: KiB
+batch_size_warn_threshold: 5KiB
 
-# Fail any multiple-partition batch exceeding this value. 50kb (10x warn threshold) by default.
-batch_size_fail_threshold_in_kb: 50
+# Fail any multiple-partition batch exceeding this value. 50KiB (10x warn threshold) by default.
+# Min unit: KiB
+batch_size_fail_threshold: 50KiB
 
 # Log WARN on any batches not of type LOGGED than span across more partitions than this limit
 unlogged_batch_across_partitions_warn_threshold: 10
 
 # Log a warning when compacting partitions larger than this value
-compaction_large_partition_warning_threshold_mb: 100
+compaction_large_partition_warning_threshold: 100MiB
+
+# Log a warning when writing more tombstones than this value to a partition
+compaction_tombstone_warning_threshold: 100000
 
 # GC Pauses greater than 200 ms will be logged at INFO level
 # This threshold can be adjusted to minimize logging if necessary
-# gc_log_threshold_in_ms: 200
+# Min unit: ms
+# gc_log_threshold: 200ms
 
-# GC Pauses greater than gc_warn_threshold_in_ms will be logged at WARN level
+# GC Pauses greater than gc_warn_threshold will be logged at WARN level
 # Adjust the threshold based on your application throughput requirement. Setting to 0
 # will deactivate the feature.
-# gc_warn_threshold_in_ms: 1000
+# Min unit: ms
+# gc_warn_threshold: 1000ms
 
 # Maximum size of any value in SSTables. Safety measure to detect SSTable corruption
 # early. Any value size larger than this threshold will result into marking an SSTable
-# as corrupted. This should be positive and less than 2048.
-# max_value_size_in_mb: 256
+# as corrupted. This should be positive and less than 2GiB.
+# Min unit: MiB
+# max_value_size: 256MiB
+
+# ** Impact on keyspace creation **
+# If replication factor is not mentioned as part of keyspace creation, default_keyspace_rf would apply.
+# Changing this configuration would only take effect for keyspaces created after the change, but does not impact
+# existing keyspaces created prior to the change.
+# ** Impact on keyspace alter **
+# When altering a keyspace from NetworkTopologyStrategy to SimpleStrategy, default_keyspace_rf is applied if rf is not
+# explicitly mentioned.
+# ** Impact on system keyspaces **
+# This would also apply for any system keyspaces that need replication factor.
+# A further note about system keyspaces - system_traces and system_distributed keyspaces take RF of 2 or default,
+# whichever is higher, and system_auth keyspace takes RF of 1 or default, whichever is higher.
+# Suggested value for use in production: 3
+# default_keyspace_rf: 1
 
 # Track a metric per keyspace indicating whether replication achieved the ideal consistency
 # level for writes without timing out. This is different from the consistency level requested by
@@ -1331,38 +1559,38 @@
 # Audit logging - Logs every incoming CQL command request, authentication to a node. See the docs
 # on audit_logging for full details about the various configuration options.
 audit_logging_options:
-    enabled: false
-    logger:
-      - class_name: BinAuditLogger
-    # audit_logs_dir:
-    # included_keyspaces:
-    # excluded_keyspaces: system, system_schema, system_virtual_schema
-    # included_categories:
-    # excluded_categories:
-    # included_users:
-    # excluded_users:
-    # roll_cycle: HOURLY
-    # block: true
-    # max_queue_weight: 268435456 # 256 MiB
-    # max_log_size: 17179869184 # 16 GiB
-    ## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
-    # archive_command:
-    # max_archive_retries: 10
+  enabled: false
+  logger:
+    - class_name: BinAuditLogger
+  # audit_logs_dir:
+  # included_keyspaces:
+  # excluded_keyspaces: system, system_schema, system_virtual_schema
+  # included_categories:
+  # excluded_categories:
+  # included_users:
+  # excluded_users:
+  # roll_cycle: HOURLY
+  # block: true
+  # max_queue_weight: 268435456 # 256 MiB
+  # max_log_size: 17179869184 # 16 GiB
+  ## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
+  # archive_command:
+  # max_archive_retries: 10
 
 
 # default options for full query logging - these can be overridden from command line when executing
 # nodetool enablefullquerylog
-#full_query_logging_options:
-    # log_dir:
-    # roll_cycle: HOURLY
-    # block: true
-    # max_queue_weight: 268435456 # 256 MiB
-    # max_log_size: 17179869184 # 16 GiB
-    ## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
-    # archive_command:
-    ## note that enabling this allows anyone with JMX/nodetool access to run local shell commands as the user running cassandra
-    # allow_nodetool_archive_command: false
-    # max_archive_retries: 10
+# full_query_logging_options:
+  # log_dir:
+  # roll_cycle: HOURLY
+  # block: true
+  # max_queue_weight: 268435456 # 256 MiB
+  # max_log_size: 17179869184 # 16 GiB
+  ## archive command is "/path/to/script.sh %path" where %path is replaced with the file being rolled:
+  # archive_command:
+  ## note that enabling this allows anyone with JMX/nodetool access to run local shell commands as the user running cassandra
+  # allow_nodetool_archive_command: false
+  # max_archive_retries: 10
 
 # validate tombstones on reads and compaction
 # can be either "disabled", "warn" or "exception"
@@ -1397,25 +1625,195 @@
 # Having many tables and/or keyspaces negatively affects performance of many operations in the
 # cluster. When the number of tables/keyspaces in the cluster exceeds the following thresholds
 # a client warning will be sent back to the user when creating a table or keyspace.
+# As of cassandra 4.1, these properties are deprecated in favor of keyspaces_warn_threshold and tables_warn_threshold
 # table_count_warn_threshold: 150
 # keyspace_count_warn_threshold: 40
 
+# configure the read and write consistency levels for modifications to auth tables
+# auth_read_consistency_level: LOCAL_QUORUM
+# auth_write_consistency_level: EACH_QUORUM
+
+# Delays on auth resolution can lead to a thundering herd problem on reconnects; this option will enable
+# warming of auth caches prior to node completing startup. See CASSANDRA-16958
+# auth_cache_warming_enabled: false
+
 #########################
 # EXPERIMENTAL FEATURES #
 #########################
 
 # Enables materialized view creation on this node.
 # Materialized views are considered experimental and are not recommended for production use.
-enable_materialized_views: false
+materialized_views_enabled: false
 
 # Enables SASI index creation on this node.
 # SASI indexes are considered experimental and are not recommended for production use.
-enable_sasi_indexes: false
+sasi_indexes_enabled: false
 
 # Enables creation of transiently replicated keyspaces on this node.
 # Transient replication is experimental and is not recommended for production use.
-enable_transient_replication: false
+transient_replication_enabled: false
 
 # Enables the used of 'ALTER ... DROP COMPACT STORAGE' statements on this node.
 # 'ALTER ... DROP COMPACT STORAGE' is considered experimental and is not recommended for production use.
-enable_drop_compact_storage: false
+drop_compact_storage_enabled: false
+
+# Whether or not USE <keyspace> is allowed. This is enabled by default to avoid failure on upgrade.
+#use_statements_enabled: true
+
+# When the client triggers a protocol exception or unknown issue (Cassandra bug) we increment
+# a client metric showing this; this logic will exclude specific subnets from updating these
+# metrics
+#client_error_reporting_exclusions:
+#  subnets:
+#    - 127.0.0.1
+#    - 127.0.0.0/31
+
+# Enables read thresholds (warn/fail) across all replicas for reporting back to the client.
+# See: CASSANDRA-16850
+# read_thresholds_enabled: false # scheduled to be set true in 4.2
+# When read_thresholds_enabled: true, this tracks the materialized size of a query on the
+# coordinator. If coordinator_read_size_warn_threshold is defined, this will emit a warning
+# to clients with details on what query triggered this as well as the size of the result set; if
+# coordinator_read_size_fail_threshold is defined, this will fail the query after it
+# has exceeded this threshold, returning a read error to the user.
+# coordinator_read_size_warn_threshold:
+# coordinator_read_size_fail_threshold:
+# When read_thresholds_enabled: true, this tracks the size of the local read (as defined by
+# heap size), and will warn/fail based off these thresholds; undefined disables these checks.
+# local_read_size_warn_threshold:
+# local_read_size_fail_threshold:
+# When read_thresholds_enabled: true, this tracks the expected memory size of the RowIndexEntry
+# and will warn/fail based off these thresholds; undefined disables these checks
+# row_index_read_size_warn_threshold:
+# row_index_read_size_fail_threshold:
+
+# Guardrail to warn or fail when creating more user keyspaces than threshold.
+# The two thresholds default to -1 to disable.
+# keyspaces_warn_threshold: -1
+# keyspaces_fail_threshold: -1
+# Guardrail to warn or fail when creating more user tables than threshold.
+# The two thresholds default to -1 to disable.
+# tables_warn_threshold: -1
+# tables_fail_threshold: -1
+# Guardrail to enable or disable the ability to create uncompressed tables
+# uncompressed_tables_enabled: true
+# Guardrail to warn or fail when creating/altering a table with more columns per table than threshold.
+# The two thresholds default to -1 to disable.
+# columns_per_table_warn_threshold: -1
+# columns_per_table_fail_threshold: -1
+# Guardrail to warn or fail when creating more secondary indexes per table than threshold.
+# The two thresholds default to -1 to disable.
+# secondary_indexes_per_table_warn_threshold: -1
+# secondary_indexes_per_table_fail_threshold: -1
+# Guardrail to enable or disable the creation of secondary indexes
+# secondary_indexes_enabled: true
+# Guardrail to warn or fail when creating more materialized views per table than threshold.
+# The two thresholds default to -1 to disable.
+# materialized_views_per_table_warn_threshold: -1
+# materialized_views_per_table_fail_threshold: -1
+# Guardrail to warn about, ignore or reject properties when creating tables. By default all properties are allowed.
+# table_properties_warned: []
+# table_properties_ignored: []
+# table_properties_disallowed: []
+# Guardrail to allow/disallow user-provided timestamps. Defaults to true.
+# user_timestamps_enabled: true
+# Guardrail to allow/disallow GROUP BY functionality.
+# group_by_enabled: true
+# Guardrail to allow/disallow TRUNCATE and DROP TABLE statements
+# drop_truncate_table_enabled: true
+# Guardrail to warn or fail when using a page size greater than threshold.
+# The two thresholds default to -1 to disable.
+# page_size_warn_threshold: -1
+# page_size_fail_threshold: -1
+# Guardrail to allow/disallow list operations that require read before write, i.e. setting list element by index and
+# removing list elements by either index or value. Defaults to true.
+# read_before_write_list_operations_enabled: true
+# Guardrail to warn or fail when querying with an IN restriction selecting more partition keys than threshold.
+# The two thresholds default to -1 to disable.
+# partition_keys_in_select_warn_threshold: -1
+# partition_keys_in_select_fail_threshold: -1
+# Guardrail to warn or fail when an IN query creates a cartesian product with a size exceeding threshold,
+# eg. "a in (1,2,...10) and b in (1,2...10)" results in cartesian product of 100.
+# The two thresholds default to -1 to disable.
+# in_select_cartesian_product_warn_threshold: -1
+# in_select_cartesian_product_fail_threshold: -1
+# Guardrail to warn about or reject read consistency levels. By default, all consistency levels are allowed.
+# read_consistency_levels_warned: []
+# read_consistency_levels_disallowed: []
+# Guardrail to warn about or reject write consistency levels. By default, all consistency levels are allowed.
+# write_consistency_levels_warned: []
+# write_consistency_levels_disallowed: []
+# Guardrail to warn or fail when encountering larger size of collection data than threshold.
+# At query time this guardrail is applied only to the collection fragment that is being writen, even though in the case
+# of non-frozen collections there could be unaccounted parts of the collection on the sstables. This is done this way to
+# prevent read-before-write. The guardrail is also checked at sstable write time to detect large non-frozen collections,
+# although in that case exceeding the fail threshold will only log an error message, without interrupting the operation.
+# The two thresholds default to null to disable.
+# Min unit: B
+# collection_size_warn_threshold:
+# Min unit: B
+# collection_size_fail_threshold:
+# Guardrail to warn or fail when encountering more elements in collection than threshold.
+# At query time this guardrail is applied only to the collection fragment that is being writen, even though in the case
+# of non-frozen collections there could be unaccounted parts of the collection on the sstables. This is done this way to
+# prevent read-before-write. The guardrail is also checked at sstable write time to detect large non-frozen collections,
+# although in that case exceeding the fail threshold will only log an error message, without interrupting the operation.
+# The two thresholds default to -1 to disable.
+# items_per_collection_warn_threshold: -1
+# items_per_collection_fail_threshold: -1
+# Guardrail to allow/disallow querying with ALLOW FILTERING. Defaults to true.
+# allow_filtering_enabled: true
+# Guardrail to warn or fail when creating a user-defined-type with more fields in than threshold.
+# Default -1 to disable.
+# fields_per_udt_warn_threshold: -1
+# fields_per_udt_fail_threshold: -1
+# Guardrail to warn or fail when local data disk usage percentage exceeds threshold. Valid values are in [1, 100].
+# This is only used for the disks storing data directories, so it won't count any separate disks used for storing
+# the commitlog, hints nor saved caches. The disk usage is the ratio between the amount of space used by the data
+# directories and the addition of that same space and the remaining free space on disk. The main purpose of this
+# guardrail is rejecting user writes when the disks are over the defined usage percentage, so the writes done by
+# background processes such as compaction and streaming don't fail due to a full disk. The limits should be defined
+# accordingly to the expected data growth due to those background processes, so for example a compaction strategy
+# doubling the size of the data would require to keep the disk usage under 50%.
+# The two thresholds default to -1 to disable.
+# data_disk_usage_percentage_warn_threshold: -1
+# data_disk_usage_percentage_fail_threshold: -1
+# Allows defining the max disk size of the data directories when calculating thresholds for
+# disk_usage_percentage_warn_threshold and disk_usage_percentage_fail_threshold, so if this is greater than zero they
+# become percentages of a fixed size on disk instead of percentages of the physically available disk size. This should
+# be useful when we have a large disk and we only want to use a part of it for Cassandra's data directories.
+# Valid values are in [1, max available disk size of all data directories].
+# Defaults to null to disable and use the physically available disk size of data directories during calculations.
+# Min unit: B
+# data_disk_usage_max_disk_size:
+# Guardrail to warn or fail when the minimum replication factor is lesser than threshold.
+# This would also apply to system keyspaces.
+# Suggested value for use in production: 2 or higher
+# minimum_replication_factor_warn_threshold: -1
+# minimum_replication_factor_fail_threshold: -1
+
+# Startup Checks are executed as part of Cassandra startup process, not all of them
+# are configurable (so you can disable them) but these which are enumerated bellow.
+# Uncomment the startup checks and configure them appropriately to cover your needs.
+#
+#startup_checks:
+# Verifies correct ownership of attached locations on disk at startup. See CASSANDRA-16879 for more details.
+#  check_filesystem_ownership:
+#    enabled: false
+#    ownership_token: "sometoken" # (overriden by "CassandraOwnershipToken" system property)
+#    ownership_filename: ".cassandra_fs_ownership" # (overriden by "cassandra.fs_ownership_filename")
+# Prevents a node from starting if snitch's data center differs from previous data center.
+#  check_dc:
+#    enabled: true # (overriden by cassandra.ignore_dc system property)
+# Prevents a node from starting if snitch's rack differs from previous rack.
+#  check_rack:
+#    enabled: true # (overriden by cassandra.ignore_rack system property)
+# Enable this property to fail startup if the node is down for longer than gc_grace_seconds, to potentially
+# prevent data resurrection on tables with deletes. By default, this will run against all keyspaces and tables
+# except the ones specified on excluded_keyspaces and excluded_tables.
+#  check_data_resurrection:
+#    enabled: false
+# file where Cassandra periodically writes the last time it was known to run
+#    heartbeat_file: /var/lib/cassandra/data/cassandra-heartbeat
+#    excluded_keyspaces: # comma separated list of keyspaces to exclude from the check
+#    excluded_tables: # comma separated list of keyspace.table pairs to exclude from the check
diff --git a/conf/commitlog_archiving.properties b/conf/commitlog_archiving.properties
index 393259c..1488ced 100644
--- a/conf/commitlog_archiving.properties
+++ b/conf/commitlog_archiving.properties
@@ -44,5 +44,14 @@
 # or equal to this timestamp will be applied.
 restore_point_in_time=
 
+# Snapshot commit log position override. This should not be normally necessary, unless the snapshot used a method other
+# than sstables to store data (e.g. persistent memtable was restored from snapshot).
+# Format: segmentId, position
+#
+# Recovery will not replay any commit log data before the specified commit log position. It will NOT exclude the
+# intervals covered by existing sstables from the replay interval, i.e. it will replay data that may already be in
+# sstables.
+snapshot_commitlog_position=
+
 # precision of the timestamp used in the inserts (MILLISECONDS, MICROSECONDS, ...)
 precision=MICROSECONDS
diff --git a/conf/cqlshrc.sample b/conf/cqlshrc.sample
index 2c00d4a..4878b58 100644
--- a/conf/cqlshrc.sample
+++ b/conf/cqlshrc.sample
@@ -19,11 +19,19 @@
 
 [authentication]
 ;; If Cassandra has auth enabled, fill out these options
-; username = fred
-; password = !!bang!!$
+;; Path to the credentials file, an initial ~ or ~user is expanded to that user's home directory
+; credentials = ~/.cassandra/credentials
 ; keyspace = ks1
 
 
+[auth_provider]
+;; you can specify any auth provider found in your python environment
+;; module and class will be used to dynamically load the class
+;; all other properties found here and in the credentials file under the class name
+;; will be passed to the constructor
+; module = cassandra.auth
+; classname = PlainTextAuthProvider
+; username = user1
 
 [ui]
 ;; Whether or not to display query results with colors
@@ -112,7 +120,9 @@
 ;; To be provided when require_client_auth=true
 ;usercert = ~/cert.pem
 
-
+; this is effectively ignored from 4.1 included as TLS protocol is auto-negotiated and will
+; be removed in the next major version of Cassandra, possible values were TLSv1, TLSv1_1 or TLSv1_2
+;version =
 
 ;; Optional section, overrides default certfile in [ssl] section, if present
 ; [certfiles]
diff --git a/conf/credentials.sample b/conf/credentials.sample
new file mode 100644
index 0000000..23d0beb
--- /dev/null
+++ b/conf/credentials.sample
@@ -0,0 +1,25 @@
+; 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.
+;
+; Sample ~/.cassandra/credentials file.
+;
+; Please ensure this file is owned by the user and is not readable by group and other users
+
+[PlainTextAuthProvider]
+; username = fred
+; password = !!bang!!$
+
diff --git a/conf/jvm11-server.options b/conf/jvm11-server.options
index 7e78467..1fc3503 100644
--- a/conf/jvm11-server.options
+++ b/conf/jvm11-server.options
@@ -29,6 +29,8 @@
 ## Use the Hotspot garbage-first collector.
 #-XX:+UseG1GC
 #-XX:+ParallelRefProcEnabled
+#-XX:MaxTenuringThreshold=1
+#-XX:G1HeapRegionSize=16m
 
 #
 ## Have the JVM do less remembered set work during STW, instead
@@ -38,7 +40,7 @@
 ## Main G1GC tunable: lowering the pause target will lower throughput and vise versa.
 ## 200ms is the JVM default and lowest viable setting
 ## 1000ms increases throughput. Keep it smaller than the timeouts in cassandra.yaml.
-#-XX:MaxGCPauseMillis=500
+#-XX:MaxGCPauseMillis=300
 
 ## Optional G1 Settings
 # Save CPU time on large (>= 16GB) heaps by delaying region scanning
diff --git a/conf/jvm8-server.options b/conf/jvm8-server.options
index 6214669..ba800db 100644
--- a/conf/jvm8-server.options
+++ b/conf/jvm8-server.options
@@ -35,6 +35,8 @@
 ## Use the Hotspot garbage-first collector.
 #-XX:+UseG1GC
 #-XX:+ParallelRefProcEnabled
+#-XX:MaxTenuringThreshold=1
+#-XX:G1HeapRegionSize=16m
 
 #
 ## Have the JVM do less remembered set work during STW, instead
@@ -44,7 +46,7 @@
 ## Main G1GC tunable: lowering the pause target will lower throughput and vise versa.
 ## 200ms is the JVM default and lowest viable setting
 ## 1000ms increases throughput. Keep it smaller than the timeouts in cassandra.yaml.
-#-XX:MaxGCPauseMillis=500
+#-XX:MaxGCPauseMillis=300
 
 ## Optional G1 Settings
 # Save CPU time on large (>= 16GB) heaps by delaying region scanning
diff --git a/debian/cassandra.install b/debian/cassandra.install
index 6df6f57..f54d1ad 100644
--- a/debian/cassandra.install
+++ b/debian/cassandra.install
@@ -2,7 +2,7 @@
 conf/cassandra-env.sh etc/cassandra
 conf/cassandra-rackdc.properties etc/cassandra
 conf/commitlog_archiving.properties etc/cassandra
-conf/cassandra-topology.properties etc/cassandra
+conf/cassandra-topology.properties.example etc/cassandra
 conf/logback.xml etc/cassandra
 conf/logback-tools.xml etc/cassandra
 conf/jvm*.options etc/cassandra
@@ -24,6 +24,7 @@
 tools/bin/fqltool usr/bin
 tools/bin/auditlogviewer usr/bin
 tools/bin/jmxtool usr/bin
+tools/bin/hash_password usr/bin
 lib/*.jar usr/share/cassandra/lib
 lib/*.zip usr/share/cassandra/lib
 lib/sigar-bin/* usr/share/cassandra/lib/sigar-bin
diff --git a/debian/changelog b/debian/changelog
index 937aa65..1bb1d0d 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,74 +1,44 @@
-cassandra (4.0.11) UNRELEASED; urgency=medium
+cassandra (4.1.3) UNRELEASED; urgency=medium
 
   * New release
 
- -- Mick Semb Wever <mck@apache.org>  Thu, 25 May 2023 14:44:07 +0200
+ -- Mick Semb Wever <mck@apache.org>  Thu, 25 May 2023 16:11:28 +0200
 
-cassandra (4.0.10) unstable; urgency=medium
+cassandra (4.1.2) unstable; urgency=medium
 
   * New release
 
- -- Mick Semb Wever <mck@apache.org>  Thu, 25 May 2023 14:44:07 +0200
+ -- Mick Semb Wever <mck@apache.org>  Thu, 25 May 2023 16:11:28 +0200
 
-cassandra (4.0.9) unstable; urgency=medium
+cassandra (4.1.1) unstable; urgency=medium
 
   * New release
 
- -- Stefan Miklosovic <smiklosovic@apache.org>  Tue, 11 Apr 2023 09:31:33 +0200
+ -- Stefan Miklosovic <smiklosovic@apache.org>  Wed, 15 Mar 2023 09:08:40 +0100
 
-cassandra (4.0.8) unstable; urgency=medium
+cassandra (4.1.0) unstable; urgency=medium
 
   * New release
 
- -- Stefan Miklosovic <smiklosovic@apache.org>  Tue, 07 Feb 2023 22:33:43 +0100
+ -- Mick Semb Wever <mck@apache.org>  Wed, 07 Dec 2022 21:53:33 +0100
 
-cassandra (4.0.7) unstable; urgency=medium
+cassandra (4.1~rc1) unstable; urgency=medium
 
   * New release
 
- -- Mick Semb Wever <mck@apache.org>  Wed, 19 Oct 2022 10:57:06 +0200
+ -- Mick Semb Wever <mck@apache.org>  Thu, 17 Nov 2022 11:33:25 +0100
 
-cassandra (4.0.6) unstable; urgency=medium
+cassandra (4.1~beta1) unstable; urgency=medium
 
   * New release
 
- -- Mick Semb Wever <mck@apache.org>  Thu, 18 Aug 2022 20:30:16 +0200
+ -- Mick Semb Wever <mck@apache.org>  Tue, 27 Sep 2022 00:08:07 +0200
 
-cassandra (4.0.5) unstable; urgency=medium
+cassandra (4.1~alpha1) unstable; urgency=medium
 
   * New release
 
- -- Mick Semb Wever <mck@apache.org>  Tue, 12 Jul 2022 12:16:22 +0200
-
-cassandra (4.0.4) unstable; urgency=medium
-
-  * New release
-
- -- Mick Semb Wever <mck@apache.org>  Fri, 06 May 2022 18:38:33 +0200
-
-cassandra (4.0.3) unstable; urgency=medium
-
-  * New release
-
- -- Mick Semb Wever <mck@apache.org>  Sun, 13 Feb 2022 22:37:37 +0100
-
-cassandra (4.0.2) unstable; urgency=medium
-
-  * New release 
-
- -- Mick Semb Wever <mck@apache.org>  Mon, 07 Feb 2022 14:42:07 +0100
-
-cassandra (4.0.1) unstable; urgency=medium
-
-  * New release
-
- -- Sam Tunnicliffe <samt@apache.org>  Mon, 30 Aug 2021 11:28:21 +0100
-
-cassandra (4.0~rc2) unstable; urgency=medium
-
-  * New release
-
- -- Mick Semb Wever <mck@apache.org>  Sun, 27 Jun 2021 16:36:29 +0200
+ -- Mick Semb Wever <mck@apache.org>  Fri, 20 May 2022 22:02:50 +0200
 
 cassandra (4.0~rc1) unstable; urgency=medium
 
diff --git a/doc/antora.yml b/doc/antora.yml
index 771311b..08ed5e2 100644
--- a/doc/antora.yml
+++ b/doc/antora.yml
@@ -1,6 +1,6 @@
 name: Cassandra
-version: '4.0'
-display_version: '4.0'
+version: '4.1'
+display_version: '4.1'
 asciidoc:
   attributes:
     cass_url: 'http://cassandra.apache.org/'
diff --git a/doc/cql3/CQL.textile b/doc/cql3/CQL.textile
index f85cb81..d2a4b72 100644
--- a/doc/cql3/CQL.textile
+++ b/doc/cql3/CQL.textile
@@ -18,7 +18,7 @@
 #
 -->
 
-h1. Cassandra Query Language (CQL) v3.4.5
+h1. Cassandra Query Language (CQL) v3.4.6
 
 
 
@@ -122,6 +122,7 @@
                | <collection-literal>
                | <variable>
                | <function> '(' (<term> (',' <term>)*)? ')'
+               | CAST '(' <term> AS <type> ')'
 
   <collection-literal> ::= <map-literal>
                          | <set-literal>
@@ -214,7 +215,7 @@
 __Syntax:__
 
 bc(syntax).. 
-<create-keyspace-stmt> ::= ALTER KEYSPACE <identifier> WITH <properties>
+<create-keyspace-stmt> ::= ALTER KEYSPACE (IF EXISTS)? <identifier> WITH <properties>
 p. 
 __Sample:__
 
@@ -224,6 +225,7 @@
 
 p. 
 The @ALTER KEYSPACE@ statement alters the properties of an existing keyspace. The supported @<properties>@ are the same as for the "@CREATE KEYSPACE@":#createKeyspaceStmt statement.
+If the keyspace does not exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
 
 
 h3(#dropKeyspaceStmt). DROP KEYSPACE
@@ -409,12 +411,11 @@
 __Syntax:__
 
 bc(syntax).. 
-<alter-table-stmt> ::= ALTER (TABLE | COLUMNFAMILY) <tablename> <instruction>
+<alter-table-stmt> ::= ALTER (TABLE | COLUMNFAMILY) (IF NOT EXISTS)? <tablename> <instruction>
 
-<instruction> ::= ADD   <identifier> <type>
-                | ADD   ( <identifier> <type> ( , <identifier> <type> )* )
-                | DROP  <identifier>
-                | DROP  ( <identifier> ( , <identifier> )* )
+<instruction> ::= ADD (IF NOT EXISTS)? ( <identifier> <type> ( , <identifier> <type> )* )
+                | DROP  (IF EXISTS)? ( <identifier> ( , <identifier> )* )
+                | RENAME (IF EXISTS)? <identifier> to <identifier> (AND <identifier> to <identifier>)*
                 | DROP COMPACT STORAGE
                 | WITH  <option> ( AND <option> )*
 p. 
@@ -431,9 +432,12 @@
 p. 
 The @ALTER@ statement is used to manipulate table definitions. It allows for adding new columns, dropping existing ones, or updating the table options. As with table creation, @ALTER COLUMNFAMILY@ is allowed as an alias for @ALTER TABLE@.
 
+If the table does not exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
+
 The @<tablename>@ is the table name optionally preceded by the keyspace name.  The @<instruction>@ defines the alteration to perform:
-* @ADD@: Adds a new column to the table. The @<identifier>@ for the new column must not conflict with an existing column. Moreover, columns cannot be added to tables defined with the @COMPACT STORAGE@ option.
-* @DROP@: Removes a column from the table. Dropped columns will immediately become unavailable in the queries and will not be included in compacted sstables in the future. If a column is readded, queries won't return values written before the column was last dropped. It is assumed that timestamps represent actual time, so if this is not your case, you should NOT readd previously dropped columns. Columns can't be dropped from tables defined with the @COMPACT STORAGE@ option.
+* @ADD@: Adds a new column to the table. The @<identifier>@ for the new column must not conflict with an existing column. Moreover, columns cannot be added to tables defined with the @COMPACT STORAGE@ option. If the new column already exists, the statement will return an error, unless @IF NOT EXISTS@ is used in which case the operation is a no-op.
+* @DROP@: Removes a column from the table. Dropped columns will immediately become unavailable in the queries and will not be included in compacted sstables in the future. If a column is readded, queries won't return values written before the column was last dropped. It is assumed that timestamps represent actual time, so if this is not your case, you should NOT readd previously dropped columns. Columns can't be dropped from tables defined with the @COMPACT STORAGE@ option. If the dropped column does not already exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
+* @RENAME@ a primary key column of a table. Non primary key columns cannot be renamed. Furthermore, renaming a column to another name which already exists isn't allowed. It's important to keep in mind that renamed columns shouldn't have dependent secondary indexes. If the renamed column does not already exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
 * @DROP COMPACT STORAGE@: Removes Thrift compatibility mode from the table.
 * @WITH@: Allows to update the options of the table. The "supported @<option>@":#createTableOptions (and syntax) are the same as for the @CREATE TABLE@ statement except that @COMPACT STORAGE@ is not supported. Note that setting any @compaction@ sub-options has the effect of erasing all previous @compaction@ options, so you  need to re-specify all the sub-options if you want to keep them. The same note applies to the set of @compression@ sub-options.
 
@@ -567,12 +571,12 @@
 
 __Syntax:__
 
-bc(syntax). <alter-materialized-view-stmt> ::= ALTER MATERIALIZED VIEW <viewname>
+bc(syntax). <alter-materialized-view-stmt> ::= ALTER MATERIALIZED VIEW (IF EXISTS)? <viewname>
                                                  WITH <option> ( AND <option> )*
 
 p. 
 The @ALTER MATERIALIZED VIEW@ statement allows options to be update; these options are the same as <a href="#createTableOptions">@CREATE TABLE@'s options</a>.
-
+If the view does not exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
 
 h3(#dropMVStmt). DROP MATERIALIZED VIEW
 
@@ -632,10 +636,10 @@
 __Syntax:__
 
 bc(syntax).. 
-<alter-type-stmt> ::= ALTER TYPE <typename> <instruction>
+<alter-type-stmt> ::= ALTER TYPE (IF EXISTS)? <typename> <instruction>
 
-<instruction> ::= ADD <field-name> <type>
-                | RENAME <field-name> TO <field-name> ( AND <field-name> TO <field-name> )*
+<instruction> ::= ADD (IF NOT EXISTS)? <field-name> <type>
+                | RENAME (IF EXISTS)? <field-name> TO <field-name> ( AND <field-name> TO <field-name> )*
 p. 
 __Sample:__
 
@@ -645,6 +649,7 @@
 ALTER TYPE address RENAME zip TO zipcode AND street_name TO street
 p. 
 The @ALTER TYPE@ statement is used to manipulate type definitions. It allows for adding new fields, renaming existing fields, or changing the type of existing fields.
+If the type does not exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
 
 h3(#dropTypeStmt). DROP TYPE
 
@@ -854,7 +859,7 @@
 bc(syntax).. 
 <insertStatement> ::= INSERT INTO <tablename>
                       ( ( <name-list> VALUES <value-list> )
-                      | ( JSON <string> [ DEFAULT ( NULL | UNSET ) ]))
+                      | ( JSON <string> (DEFAULT ( NULL | UNSET ))?))
                       ( IF NOT EXISTS )?
                       ( USING <option> ( AND <option> )* )?
 
@@ -908,7 +913,7 @@
               | <identifier> '.' <field> <op> <term>
               | <identifier> '.' <field> IN <in-values>
 
-<op> ::= '<' | '<=' | '=' | '!=' | '>=' | '>'
+<op> ::= '<' | '<=' | '=' | '!=' | '>=' | '>' | CONTAINS ( KEY )?
 <in-values> ::= (<variable> | '(' ( <term> ( ',' <term> )* )? ')')
 
 <where-clause> ::= <relation> ( AND <relation> )*
@@ -979,7 +984,7 @@
              | '(' <identifier> (',' <identifier>)* ')' IN '(' ( <term-tuple> ( ',' <term-tuple>)* )? ')'
              | '(' <identifier> (',' <identifier>)* ')' IN <variable>
 
-<op> ::= '=' | '<' | '>' | '<=' | '>='
+<op> ::= '=' | '<' | '>' | '<=' | '>=' | CONTAINS ( KEY )?
 <in-values> ::= (<variable> | '(' ( <term> ( ',' <term> )* )? ')')
 
 <condition> ::= <identifier> (<op> | '!=') <term>
@@ -1099,7 +1104,7 @@
              | TOKEN '(' <identifier> ( ',' <identifer>)* ')' <op> <term>
 
 <op> ::= '=' | '<' | '>' | '<=' | '>=' | CONTAINS | CONTAINS KEY
-<group-by> ::= <identifier> (',' <identifier>)*
+<group-by> ::= (<identifier>,)* (<identifier> | <function>)
 <order-by> ::= <ordering> ( ',' <odering> )*
 <ordering> ::= <identifer> ( ASC | DESC )?
 <term-tuple> ::= '(' <term> (',' <term>)* ')'
@@ -1200,7 +1205,7 @@
 
 The @GROUP BY@ option allows to condense into a single row all selected rows that share the same values for a set of columns.
 
-Using the @GROUP BY@ option, it is only possible to group rows at the partition key level or at a clustering column level. By consequence, the @GROUP BY@ option only accept as arguments primary key column names in the primary key order. If a primary key column is restricted by an equality restriction it is not required to be present in the @GROUP BY@ clause.
+Using the @GROUP BY@ option, it is only possible to group rows at the partition key level or at a clustering column level. By consequence, the @GROUP BY@ option only accept as arguments primary key column names in the primary key order. If a primary key column is restricted by an equality restriction it is not required to be present in the @GROUP BY@ clause. The last argument can be a monotonic function on the primary key column.
 
 Aggregate functions will produce a separate value for each group. If no @GROUP BY@ clause is specified, aggregates functions will produce a single value for all the rows.
 
@@ -1257,7 +1262,7 @@
 bc(syntax).. 
 <create-role-stmt> ::= CREATE ROLE ( IF NOT EXISTS )? <identifier> ( WITH <option> ( AND <option> )* )?
 
-<option> ::= PASSWORD = <string>
+<option> ::= ("HASHED")? PASSWORD = <string>
            | LOGIN = <boolean>
            | SUPERUSER = <boolean>
            | OPTIONS = <map_literal>
@@ -1299,7 +1304,7 @@
 __Syntax:__
 
 bc(syntax).. 
-<alter-role-stmt> ::= ALTER ROLE <identifier> ( WITH <option> ( AND <option> )* )?
+<alter-role-stmt> ::= ALTER ROLE (IF EXISTS)? <identifier> ( WITH <option> ( AND <option> )* )?
 
 <option> ::= PASSWORD = <string>
            | LOGIN = <boolean>
@@ -1318,7 +1323,7 @@
 * A client cannot alter the @SUPERUSER@ status of any role it currently holds
 * A client can only modify certain properties of the role with which it identified at login (e.g. @PASSWORD@)
 * To modify properties of a role, the client must be granted @ALTER@ "permission":#permissions on that role
-
+If the role does not exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
 
 h3(#dropRoleStmt). DROP ROLE
 
@@ -1410,7 +1415,7 @@
 __Syntax:__ 
 
 bc(syntax).. 
-<create-user-statement> ::= CREATE USER ( IF NOT EXISTS )? <identifier> ( WITH PASSWORD <string> )? (<option>)?
+<create-user-statement> ::= CREATE USER ( IF NOT EXISTS )? <identifier> ( WITH ("HASHED")? PASSWORD <string> )? (<option>)?
 
 <option> ::= SUPERUSER
            | NOSUPERUSER
@@ -1446,11 +1451,12 @@
 __Syntax:__ 
 
 bc(syntax).. 
-<alter-user-statement> ::= ALTER USER <identifier> ( WITH PASSWORD <string> )? ( <option> )?
+<alter-user-statement> ::= ALTER USER (IF EXISTS)? <identifier> ( WITH PASSWORD <string> )? ( <option> )?
 
 <option> ::= SUPERUSER
            | NOSUPERUSER
 p. 
+If the user does not exist, the statement will return an error, unless @IF EXISTS@ is used in which case the operation is a no-op.
 
 bc(sample). 
 ALTER USER alice WITH PASSWORD 'PASSWORD_A';
@@ -1580,12 +1586,13 @@
 __Syntax:__ 
 
 bc(syntax).. 
-<grant-permission-stmt> ::= GRANT ( ALL ( PERMISSIONS )? | <permission> ( PERMISSION )? ) ON <resource> TO <identifier>
+<grant-permission-stmt> ::= GRANT ( ALL ( PERMISSIONS )? | <permission> ( PERMISSION )? (, PERMISSION)* ) ON <resource> TO <identifier>
 
 <permission> ::= CREATE | ALTER | DROP | SELECT | MODIFY | AUTHORIZE | DESRIBE | EXECUTE
 
 <resource> ::= ALL KEYSPACES
              | KEYSPACE <identifier>
+             | ALL TABLES IN KEYSPACE <identifier>
              | ( TABLE )? <tablename>
              | ALL ROLES
              | ROLE <identifier>
@@ -1636,12 +1643,13 @@
 __Syntax:__ 
 
 bc(syntax).. 
-<revoke-permission-stmt> ::= REVOKE ( ALL ( PERMISSIONS )? | <permission> ( PERMISSION )? ) ON <resource> FROM <identifier>
+<revoke-permission-stmt> ::= REVOKE ( ALL ( PERMISSIONS )? | <permission> ( PERMISSION )? (, PERMISSION)* ) ON <resource> FROM <identifier>
 
 <permission> ::= CREATE | ALTER | DROP | SELECT | MODIFY | AUTHORIZE | DESRIBE | EXECUTE
 
 <resource> ::= ALL KEYSPACES
              | KEYSPACE <identifier>
+             | ALL TABLES IN KEYSPACE <identifier>
              | ( TABLE )? <tablename>
              | ALL ROLES
              | ROLE <identifier>
@@ -1672,6 +1680,7 @@
 
 <resource> ::= ALL KEYSPACES
              | KEYSPACE <identifier>
+             | ALL TABLES IN KEYSPACE <identifier>
              | ( TABLE )? <tablename>
              | ALL ROLES
              | ROLE <identifier>
@@ -2032,7 +2041,7 @@
 
 h3(#castFun). Cast
 
-The @cast@ function can be used to converts one native datatype to another.
+The @cast@ function can be used to convert one native datatype to another.
 
 The following table describes the conversions supported by the @cast@ function. Cassandra will silently ignore any cast converting a datatype into its own datatype.
 
@@ -2052,7 +2061,7 @@
 |@timestamp@|@date@, @text@, @varchar@                                                                           |
 |@timeuuid@ |@timestamp@, @date@, @text@, @varchar@                                                              |
 |@tinyint@  |@tinyint@, @smallint@, @int@, @bigint@, @float@, @double@, @decimal@, @varint@, @text@, @varchar@   |
-|@uuid@      |@text@, @varchar@                                                                                  |
+|@uuid@     |@text@, @varchar@                                                                                  |
 |@varint@   |@tinyint@, @smallint@, @int@, @bigint@, @float@, @double@, @decimal@, @text@, @varchar@             |
 
 
@@ -2119,11 +2128,11 @@
 
 The following functions can be used to retrieve the date/time at the time where the function is invoked:
 
-|_. function name       |_.    output type       |
-| @currentTimestamp@    |  @timestamp@           |
-| @currentDate@         |  @date@                |
-| @currentTime@         |  @time@                |
-| @currentTimeUUID@     |  @timeUUID@            |
+|_. function name         |_.    output type       |
+| @currentTimestamp@      |  @timestamp@           |
+| @currentDate@           |  @date@                |
+| @currentTime@           |  @time@                |
+| @currentTimeUUID@       |  @timeUUID@            |
 
 For example the last 2 days of data can be retrieved using:
 
@@ -2145,6 +2154,16 @@
 |@dateOf@            |@timeuuid@      |Similar to @toTimestamp(timeuuid)@ (DEPRECATED)|
 |@unixTimestampOf@   |@timeuuid@      |Similar to @toUnixTimestamp(timeuuid)@ (DEPRECATED)|
 
+h4(#floorFun). Floor function
+
+Rounds date and time to the nearest value.
+
+|_. type      |_. function                                     |_. |
+|@timestamp@  | floor(timestamp, duration [, start_timestamp]) | If the start_timestamp is not used, then the start timestamp is January 1, 1970 00:00:00.000 GMT |
+|@timeuuid@   | floor(timeuuid, duration [, start_timestamp])  | If the start_timestamp is not used, then the start timestamp is January 1, 1970 00:00:00.000 GMT |
+|@date@       | floor(date, duration [, start_date])           | If the start_date is not used, then the start date is January 1, 1970 GMT |
+|@time@       | floor(time, duration [, start_time])           | ==If the start_time is not used, then the start time is 00:00:00[000000000]== |
+
 h3(#blobFun). Blob conversion functions
 
 A number of functions are provided to "convert" the native types into binary data (@blob@). For every @<native-type>@ @type@ supported by CQL3 (a notable exceptions is @blob@, for obvious reasons), the function @typeAsBlob@ takes a argument of type @type@ and return it as a @blob@.  Conversely, the function @blobAsType@ takes a 64-bit @blob@ argument and convert it to a @bigint@ value.  And so for instance, @bigintAsBlob(3)@ is @0x0000000000000003@ and @blobAsBigint(0x0000000000000003)@ is @3@.
@@ -2551,6 +2570,17 @@
 
 The following describes the changes in each version of CQL.
 
+h3. 3.4.6
+
+* Add support for @IF EXISTS@ and @IF NOT EXISTS@ in @ALTER@ statements (see "CASSANDRA-16916":https://issues.apache.org/jira/browse/CASSANDRA-16916).
+* Allow @GRANT/REVOKE@ multiple permissions in a single statement (see "CASSANDRA-17030":https://issues.apache.org/jira/browse/CASSANDRA-17030).
+* Pre hashed passwords in CQL (see "CASSANDRA-17334":https://issues.apache.org/jira/browse/CASSANDRA-17334).
+* Add support for type casting in @WHERE@ clause components and in the values of @INSERT/UPDATE@ statements (see "CASSANDRA-14337":https://issues.apache.org/jira/browse/CASSANDRA-14337).
+* Add support for @CONTAINS@ and @CONTAINS KEY@ in conditional @UPDATE@ and @DELETE@ statement (see "CASSANDRA-10537":https://issues.apache.org/jira/browse/CASSANDRA-10537).
+* Allow to grant permission for all tables in a keyspace (see "CASSANDRA-17027":https://issues.apache.org/jira/browse/CASSANDRA-17027).
+* Allow to use pure monotonic functions on the last attribute of the @GROUP BY@ clause (see "CASSANDRA-11871":https://issues.apache.org/jira/browse/CASSANDRA-11871).
+* Add floor function to allow grouping by time range (see "CASSANDRA-11871":https://issues.apache.org/jira/browse/CASSANDRA-11871).
+
 h3. 3.4.5
 
 * Adds support for arithmetic operators. See "Number Arithmetic":#numberArithmetic (see "CASSANDRA-11935":https://issues.apache.org/jira/browse/CASSANDRA-11935).
@@ -2572,9 +2602,6 @@
 h3. 3.4.2
 
 * Support for selecting elements and slices of a collection ("CASSANDRA-7396":https://issues.apache.org/jira/browse/CASSANDRA-7396).
-
-h3. 3.4.2
-
 * "@INSERT/UPDATE options@":#updateOptions for tables having a default_time_to_live specifying a TTL of 0 will remove the TTL from the inserted or updated values
 * "@ALTER TABLE@":#alterTableStmt @ADD@ and @DROP@ now allow mutiple columns to be added/removed
 * New "@PER PARTITION LIMIT@":#selectLimit option (see "CASSANDRA-7017":https://issues.apache.org/jira/browse/CASSANDRA-7017).
diff --git a/doc/modules/ROOT/pages/index.adoc b/doc/modules/ROOT/pages/index.adoc
index 6a0c745..4c7a3fd 100644
--- a/doc/modules/ROOT/pages/index.adoc
+++ b/doc/modules/ROOT/pages/index.adoc
@@ -17,7 +17,7 @@
 
 | xref:cassandra:getting_started/index.adoc[Getting started] | Newbie starting point
 
-| xref:cassandra:new/index.adoc[What's new in 4.0] | What's new in Cassandra 4.0
+| xref:cassandra:new/index.adoc[What's new in 4.1] | What's new in Cassandra 4.1
 
 | xref:cassandra:architecture/index.adoc[Architecture] | Cassandra's big picture
 
diff --git a/doc/modules/cassandra/assets/images/cassandra_ssl_context_factory_pem.png b/doc/modules/cassandra/assets/images/cassandra_ssl_context_factory_pem.png
new file mode 100644
index 0000000..5c666b0
--- /dev/null
+++ b/doc/modules/cassandra/assets/images/cassandra_ssl_context_factory_pem.png
Binary files differ
diff --git a/doc/modules/cassandra/examples/BASH/get_deb_package.sh b/doc/modules/cassandra/examples/BASH/get_deb_package.sh
index 5445122..69648e8 100644
--- a/doc/modules/cassandra/examples/BASH/get_deb_package.sh
+++ b/doc/modules/cassandra/examples/BASH/get_deb_package.sh
@@ -1,2 +1,2 @@
-$ echo "deb https://debian.cassandra.apache.org 40x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
-deb https://debian.cassandra.apache.org 40x main
+$ echo "deb https://debian.cassandra.apache.org 41x main" | sudo tee -a /etc/apt/sources.list.d/cassandra.sources.list
+deb https://debian.cassandra.apache.org 41x main
diff --git a/doc/modules/cassandra/examples/BNF/alter_ks.bnf b/doc/modules/cassandra/examples/BNF/alter_ks.bnf
index 5f82d34..6f5e4fe 100644
--- a/doc/modules/cassandra/examples/BNF/alter_ks.bnf
+++ b/doc/modules/cassandra/examples/BNF/alter_ks.bnf
@@ -1,2 +1,2 @@
-alter_keyspace_statement::= ALTER KEYSPACE keyspace_name
+alter_keyspace_statement::= ALTER KEYSPACE [ IF EXISTS ] keyspace_name
 	WITH options
diff --git a/doc/modules/cassandra/examples/BNF/alter_mv_statement.bnf b/doc/modules/cassandra/examples/BNF/alter_mv_statement.bnf
index ff97edb..886e913 100644
--- a/doc/modules/cassandra/examples/BNF/alter_mv_statement.bnf
+++ b/doc/modules/cassandra/examples/BNF/alter_mv_statement.bnf
@@ -1 +1 @@
-alter_materialized_view_statement::= ALTER MATERIALIZED VIEW view_name WITH table_options
+alter_materialized_view_statement::= ALTER MATERIALIZED VIEW [ IF EXISTS ] view_name WITH table_options
diff --git a/doc/modules/cassandra/examples/BNF/alter_role_statement.bnf b/doc/modules/cassandra/examples/BNF/alter_role_statement.bnf
index 36958d7..7b67608 100644
--- a/doc/modules/cassandra/examples/BNF/alter_role_statement.bnf
+++ b/doc/modules/cassandra/examples/BNF/alter_role_statement.bnf
@@ -1 +1 @@
-alter_role_statement ::= ALTER ROLE role_name WITH role_options
+alter_role_statement ::= ALTER ROLE [ IF EXISTS ] role_name WITH role_options
diff --git a/doc/modules/cassandra/examples/BNF/alter_table.bnf b/doc/modules/cassandra/examples/BNF/alter_table.bnf
index bf1b4b7..728a78a 100644
--- a/doc/modules/cassandra/examples/BNF/alter_table.bnf
+++ b/doc/modules/cassandra/examples/BNF/alter_table.bnf
@@ -1,4 +1,5 @@
-alter_table_statement::= ALTER TABLE table_name alter_table_instruction 
-alter_table_instruction::= ADD column_name cql_type ( ',' column_name cql_type )* 
-	| DROP column_name ( column_name )*  
+alter_table_statement::= ALTER TABLE [ IF EXISTS ] table_name alter_table_instruction
+alter_table_instruction::= ADD [ IF NOT EXISTS ] column_name cql_type ( ',' column_name cql_type )*
+	| DROP [ IF EXISTS ] column_name ( column_name )*
+	| RENAME [ IF EXISTS ] column_name to column_name (AND column_name to column_name)*
 	| WITH options
diff --git a/doc/modules/cassandra/examples/BNF/alter_udt_statement.bnf b/doc/modules/cassandra/examples/BNF/alter_udt_statement.bnf
index 4f409e6..c23ed41 100644
--- a/doc/modules/cassandra/examples/BNF/alter_udt_statement.bnf
+++ b/doc/modules/cassandra/examples/BNF/alter_udt_statement.bnf
@@ -1,3 +1,3 @@
-alter_type_statement::= ALTER TYPE udt_name alter_type_modification
-alter_type_modification::= ADD field_definition
-        | RENAME identifier TO identifier( identifier TO identifier )*
+alter_type_statement::= ALTER TYPE [ IF EXISTS ] udt_name alter_type_modification
+alter_type_modification::= ADD [ IF NOT EXISTS ] field_definition
+        | RENAME [ IF EXISTS ] identifier TO identifier (AND identifier TO identifier )*
diff --git a/doc/modules/cassandra/examples/BNF/alter_user_statement.bnf b/doc/modules/cassandra/examples/BNF/alter_user_statement.bnf
index 129607c..06bef1b 100644
--- a/doc/modules/cassandra/examples/BNF/alter_user_statement.bnf
+++ b/doc/modules/cassandra/examples/BNF/alter_user_statement.bnf
@@ -1 +1 @@
-alter_user_statement ::= ALTER USER role_name [ WITH PASSWORD string] [ user_option]
+alter_user_statement ::= ALTER USER [ IF EXISTS ] role_name [ WITH [ HASHED ] PASSWORD string] [ user_option]
diff --git a/doc/modules/cassandra/examples/BNF/create_role_statement.bnf b/doc/modules/cassandra/examples/BNF/create_role_statement.bnf
index bc93fbc..4236cc6 100644
--- a/doc/modules/cassandra/examples/BNF/create_role_statement.bnf
+++ b/doc/modules/cassandra/examples/BNF/create_role_statement.bnf
@@ -2,6 +2,7 @@
                           [ WITH role_options# ]
 role_options ::= role_option ( AND role_option)*
 role_option ::= PASSWORD '=' string
+                | HASHED PASSWORD '=' string
                 | LOGIN '=' boolean
                 | SUPERUSER '=' boolean
                 | OPTIONS '=' map_literal
diff --git a/doc/modules/cassandra/examples/BNF/create_user_statement.bnf b/doc/modules/cassandra/examples/BNF/create_user_statement.bnf
index 19f9903..e090e38 100644
--- a/doc/modules/cassandra/examples/BNF/create_user_statement.bnf
+++ b/doc/modules/cassandra/examples/BNF/create_user_statement.bnf
@@ -1,4 +1,4 @@
 create_user_statement ::= CREATE USER [ IF NOT EXISTS ] role_name
-                          [ WITH PASSWORD string ]
+                          [ WITH [ HASHED ] PASSWORD string ]
                           [ user_option ]
 user_option: SUPERUSER | NOSUPERUSER
diff --git a/doc/modules/cassandra/examples/CQL/alter_role.cql b/doc/modules/cassandra/examples/CQL/alter_role.cql
index c5f7d3d..1e858ae 100644
--- a/doc/modules/cassandra/examples/CQL/alter_role.cql
+++ b/doc/modules/cassandra/examples/CQL/alter_role.cql
@@ -1 +1,2 @@
 ALTER ROLE bob WITH PASSWORD = 'PASSWORD_B' AND SUPERUSER = false;
+ALTER ROLE bob WITH HASHED PASSWORD = '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG' AND SUPERUSER = false;
diff --git a/doc/modules/cassandra/examples/CQL/alter_user.cql b/doc/modules/cassandra/examples/CQL/alter_user.cql
index 97de7ba..a0bf30e 100644
--- a/doc/modules/cassandra/examples/CQL/alter_user.cql
+++ b/doc/modules/cassandra/examples/CQL/alter_user.cql
@@ -1,2 +1,3 @@
 ALTER USER alice WITH PASSWORD 'PASSWORD_A';
+ALTER USER alice WITH HASHED PASSWORD '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG';
 ALTER USER bob SUPERUSER;
diff --git a/doc/modules/cassandra/examples/CQL/create_role.cql b/doc/modules/cassandra/examples/CQL/create_role.cql
index c8d0d64..2ceee54 100644
--- a/doc/modules/cassandra/examples/CQL/create_role.cql
+++ b/doc/modules/cassandra/examples/CQL/create_role.cql
@@ -1,5 +1,6 @@
 CREATE ROLE new_role;
 CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true;
+CREATE ROLE alice WITH HASHED PASSWORD = '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG' AND LOGIN = true;
 CREATE ROLE bob WITH PASSWORD = 'password_b' AND LOGIN = true AND SUPERUSER = true;
 CREATE ROLE carlos WITH OPTIONS = { 'custom_option1' : 'option1_value', 'custom_option2' : 99 };
 CREATE ROLE alice WITH PASSWORD = 'password_a' AND LOGIN = true AND ACCESS TO DATACENTERS {'DC1', 'DC3'};
diff --git a/doc/modules/cassandra/examples/CQL/create_user.cql b/doc/modules/cassandra/examples/CQL/create_user.cql
index b6531eb..d754227 100644
--- a/doc/modules/cassandra/examples/CQL/create_user.cql
+++ b/doc/modules/cassandra/examples/CQL/create_user.cql
@@ -1,2 +1,3 @@
 CREATE USER alice WITH PASSWORD 'password_a' SUPERUSER;
 CREATE USER bob WITH PASSWORD 'password_b' NOSUPERUSER;
+CREATE USER bob WITH HASHED PASSWORD '$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG' NOSUPERUSER;
diff --git a/doc/modules/cassandra/examples/RESULTS/add_yum_repo.result b/doc/modules/cassandra/examples/RESULTS/add_yum_repo.result
index 24409f3..6fe704a 100644
--- a/doc/modules/cassandra/examples/RESULTS/add_yum_repo.result
+++ b/doc/modules/cassandra/examples/RESULTS/add_yum_repo.result
@@ -1,6 +1,6 @@
 [cassandra]
 name=Apache Cassandra
-baseurl=https://redhat.cassandra.apache.org/40x/
+baseurl=https://redhat.cassandra.apache.org/41x/
 gpgcheck=1
 repo_gpgcheck=1
 gpgkey=https://downloads.apache.org/cassandra/KEYS
diff --git a/doc/modules/cassandra/nav.adoc b/doc/modules/cassandra/nav.adoc
index 2188006..4849abb 100644
--- a/doc/modules/cassandra/nav.adoc
+++ b/doc/modules/cassandra/nav.adoc
@@ -4,22 +4,18 @@
 *** xref:getting_started/configuring.adoc[Configuring Cassandra]
 *** xref:getting_started/querying.adoc[Inserting and querying]
 *** xref:getting_started/drivers.adoc[Client drivers]
+*** xref:getting_started/java11.adoc[Support for Java 11]
 *** xref:getting_started/production.adoc[Production recommendations]
 
 ** xref:new/index.adoc[What's new]
-*** xref:new/java11.adoc[Support for Java 11]
-*** xref:new/virtualtables.adoc[Virtual tables]
-*** xref:new/auditlogging.adoc[Audit logging]
-*** xref:new/fqllogging.adoc[Full query logging]
-*** xref:new/messaging.adoc[Improved internode Messaging]
-*** xref:new/streaming.adoc[Improved streaming]
-*** xref:new/transientreplication.adoc[Transient replication]
 
 ** xref:architecture/index.adoc[Architecture]
 *** xref:architecture/overview.adoc[Overview]
 *** xref:architecture/dynamo.adoc[Dynamo]		
 *** xref:architecture/storage_engine.adoc[Storage engine]
 *** xref:architecture/guarantees.adoc[Guarantees]
+*** xref:architecture/messaging.adoc[Improved internode messaging]
+*** xref:architecture/streaming.adoc[Improved streaming]
 
 ** xref:data_modeling/index.adoc[Data modeling]
 *** xref:data_modeling/intro.adoc[Introduction]
@@ -57,6 +53,7 @@
 *** xref:configuration/cass_cl_archive_file.adoc[commitlog-archiving.properties]
 *** xref:configuration/cass_logback_xml_file.adoc[logback.xml]
 *** xref:configuration/cass_jvm_options_file.adoc[jvm-* files]
+*** xref:configuration/configuration.adoc[Liberating cassandra.yaml Parameters' Names from Their Units]
 
 ** xref:operating/index.adoc[Operating]
 *** xref:operating/snitch.adoc[Snitches]
@@ -72,8 +69,12 @@
 *** xref:operating/metrics.adoc[Metrics]
 *** xref:operating/security.adoc[Security]
 *** xref:operating/hardware.adoc[Hardware]
-*** xref:operating/audit_logging.adoc[Audit logging]
-*** xref:operating/compaction/index.adoc[Compaction]		
+*** xref:operating/compaction/index.adoc[Compaction]
+*** xref:operating/virtualtables.adoc[Virtual tables]
+*** xref:operating/auditlogging.adoc[Audit logging]
+*** xref:operating/audit_logging.adoc[Audit logging 2]
+*** xref:operating/fqllogging.adoc[Full query logging]
+*** xref:operating/transientreplication.adoc[Transient replication]
 
 ** xref:tools/index.adoc[Tools]
 *** xref:tools/cqlsh.adoc[cqlsh: the CQL shell]
diff --git a/doc/modules/cassandra/pages/architecture/messaging.adoc b/doc/modules/cassandra/pages/architecture/messaging.adoc
new file mode 100644
index 0000000..2e01fd4
--- /dev/null
+++ b/doc/modules/cassandra/pages/architecture/messaging.adoc
@@ -0,0 +1,360 @@
+= Improved Internode Messaging
+
+Apache Cassandra 4.0 has added several new improvements to internode
+messaging.
+
+== Optimized Internode Messaging Protocol
+
+The internode messaging protocol has been optimized
+(https://issues.apache.org/jira/browse/CASSANDRA-14485[CASSANDRA-14485]).
+Previously the `IPAddressAndPort` of the sender was included with each
+message that was sent even though the `IPAddressAndPort` had already
+been sent once when the initial connection/session was established. In
+Cassandra 4.0 `IPAddressAndPort` has been removed from every separate
+message sent and only sent when connection/session is initiated.
+
+Another improvement is that at several instances (listed) a fixed 4-byte
+integer value has been replaced with `vint` as a `vint` is almost always
+less than 1 byte:
+
+* The `paramSize` (the number of parameters in the header)
+* Each individual parameter value
+* The `payloadSize`
+
+== NIO Messaging
+
+In Cassandra 4.0 peer-to-peer (internode) messaging has been switched to
+non-blocking I/O (NIO) via Netty
+(https://issues.apache.org/jira/browse/CASSANDRA-8457[CASSANDRA-8457]).
+
+As serialization format, each message contains a header with several
+fixed fields, an optional key-value parameters section, and then the
+message payload itself. Note: the IP address in the header may be either
+IPv4 (4 bytes) or IPv6 (16 bytes).
+
+____
+The diagram below shows the IPv4 address for brevity.
+____
+
+....
+1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6
+0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                       PROTOCOL MAGIC                          |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                         Message ID                            |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                         Timestamp                             |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|  Addr len |           IP Address (IPv4)                       /
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/           |                 Verb                              /
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/           |            Parameters size                        /
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/           |             Parameter data                        /
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+/                                                               |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                        Payload size                           |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+|                                                               /
+/                           Payload                             /
+/                                                               |
++-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+....
+
+An individual parameter has a String key and a byte array value. The key
+is serialized with its length, encoded as two bytes, followed by the
+UTF-8 byte encoding of the string. The body is serialized with its
+length, encoded as four bytes, followed by the bytes of the value.
+
+== Resource limits on Queued Messages
+
+System stability is improved by enforcing strict resource limits
+(https://issues.apache.org/jira/browse/CASSANDRA-15066[CASSANDRA-15066])
+on the number of outbound messages that are queued, measured by the
+`serializedSize` of the message. There are three separate limits imposed
+simultaneously to ensure that progress is always made without any
+reasonable combination of failures impacting a node’s stability.
+
+[arabic]
+. Global, per-endpoint and per-connection limits are imposed on messages
+queued for delivery to other nodes and waiting to be processed on
+arrival from other nodes in the cluster. These limits are applied to the
+on-wire size of the message being sent or received.
+. The basic per-link limit is consumed in isolation before any endpoint
+or global limit is imposed. Each node-pair has three links: urgent,
+small and large. Any given node may have a maximum of
+`N*3 * (internode_application_send_queue_capacity in bytes + internode_application_receive_queue_capacity in bytes)`
+of messages data queued without any coordination between them although in
+practice, with token-aware routing, only RF*tokens nodes should need to
+communicate with significant bandwidth.
+. The per-endpoint limit is imposed on all messages exceeding the
+per-link limit, simultaneously with the global limit, on all links to or
+from a single node in the cluster. The global limit is imposed on all
+messages exceeding the per-link limit, simultaneously with the
+per-endpoint limit, on all links to or from any node in the cluster. The
+following configuration settings have been added to `cassandra.yaml` for
+resource limits on queued messages.
+
+....
+internode_application_send_queue_capacity: 4MiB
+internode_application_send_queue_reserve_endpoint_capacity: 128MiB
+internode_application_send_queue_reserve_global_capacity: 512MiB
+internode_application_receive_queue_capacity: 4MiB
+internode_application_receive_queue_reserve_endpoint_capacity: 128MiB
+internode_application_receive_queue_reserve_global_capacity: 512MiB
+....
+
+== Virtual Tables for Messaging Metrics
+
+Metrics is improved by keeping metrics using virtual tables for
+inter-node inbound and outbound messaging
+(https://issues.apache.org/jira/browse/CASSANDRA-15066[CASSANDRA-15066]).
+For inbound messaging a virtual table (`internode_inbound`) has been
+added to keep metrics for:
+
+* Bytes and count of messages that could not be serialized or flushed
+due to an error
+* Bytes and count of messages scheduled
+* Bytes and count of messages successfully processed
+* Bytes and count of messages successfully received
+* Nanos and count of messages throttled
+* Bytes and count of messages expired
+* Corrupt frames recovered and unrecovered
+
+A separate virtual table (`internode_outbound`) has been added for
+outbound inter-node messaging. The outbound virtual table keeps metrics
+for:
+
+* Bytes and count of messages pending
+* Bytes and count of messages sent
+* Bytes and count of messages expired
+* Bytes and count of messages that could not be sent due to an error
+* Bytes and count of messages overloaded
+* Active Connection Count
+* Connection Attempts
+* Successful Connection Attempts
+
+== Hint Messaging
+
+A specialized version of hint message that takes an already encoded in a
+`ByteBuffer` hint and sends it verbatim has been added. It is an
+optimization for when dispatching a hint file of the current messaging
+version to a node of the same messaging version, which is the most
+common case. It saves on extra `ByteBuffer` allocations one redundant
+hint deserialization-serialization cycle.
+
+== Internode Application Timeout
+
+A configuration setting has been added to `cassandra.yaml` for the
+maximum continuous period a connection may be unwritable in application
+space.
+
+....
+# internode_application_timeout_in_ms = 30000
+....
+
+Some other new features include logging of message size to trace message
+for tracing a query.
+
+== Paxos prepare and propose stage for local requests optimized
+
+In pre-4.0 Paxos prepare and propose messages always go through entire
+`MessagingService` stack in Cassandra even if request is to be served
+locally, we can enhance and make local requests severed w/o involving
+`MessagingService`. Similar things are done elsewhere in Cassandra which
+skips `MessagingService` stage for local requests.
+
+This is what it looks like in pre 4.0 if we have tracing on and run a
+light-weight transaction:
+
+....
+Sending PAXOS_PREPARE message to /A.B.C.D [MessagingService-Outgoing-/A.B.C.D] | 2017-09-11
+21:55:18.971000 | A.B.C.D | 15045
+… REQUEST_RESPONSE message received from /A.B.C.D [MessagingService-Incoming-/A.B.C.D] |
+2017-09-11 21:55:18.976000 | A.B.C.D | 20270
+… Processing response from /A.B.C.D [SharedPool-Worker-4] | 2017-09-11 21:55:18.976000 |
+A.B.C.D | 20372
+....
+
+Same thing applies for Propose stage as well.
+
+In version 4.0 Paxos prepare and propose stage for local requests are
+optimized
+(https://issues.apache.org/jira/browse/CASSANDRA-13862[CASSANDRA-13862]).
+
+== Quality Assurance
+
+Several other quality assurance improvements have been made in version
+4.0
+(https://issues.apache.org/jira/browse/CASSANDRA-15066[CASSANDRA-15066]).
+
+=== Framing
+
+Version 4.0 introduces framing to all internode messages, i.e. the
+grouping of messages into a single logical payload with headers and
+trailers; these frames are guaranteed to either contain at most one
+message, that is split into its own unique sequence of frames (for large
+messages), or that a frame contains only complete messages.
+
+=== Corruption prevention
+
+Previously, intra-datacenter internode messages would be unprotected
+from corruption by default, as only LZ4 provided any integrity checks.
+All messages to post 4.0 nodes are written to explicit frames, which may
+be:
+
+* LZ4 encoded
+* CRC protected
+
+The Unprotected option is still available.
+
+=== Resilience
+
+For resilience, all frames are written with a separate CRC protected
+header, of 8 and 6 bytes respectively. If corruption occurs in this
+header, the connection must be reset, as before. If corruption occurs
+anywhere outside of the header, the corrupt frame will be skipped,
+leaving the connection intact and avoiding the loss of any messages
+unnecessarily.
+
+Previously, any issue at any point in the stream would result in the
+connection being reset, with the loss of any in-flight messages.
+
+=== Efficiency
+
+The overall memory usage, and number of byte shuffles, on both inbound
+and outbound messages is reduced.
+
+Outbound the Netty LZ4 encoder maintains a chunk size buffer (64KiB),
+that is filled before any compressed frame can be produced. Our frame
+encoders avoid this redundant copy, as well as freeing 192KiB per
+endpoint.
+
+Inbound, frame decoders guarantee only to copy the number of bytes
+necessary to parse a frame, and to never store more bytes than
+necessary. This improvement applies twice to LZ4 connections, improving
+both the message decode and the LZ4 frame decode.
+
+=== Inbound Path
+
+Version 4.0 introduces several improvements to the inbound path.
+
+An appropriate message handler is used based on whether large or small
+messages are expected on a particular connection as set in a flag.
+`NonblockingBufferHandler`, running on event loop, is used for small
+messages, and `BlockingBufferHandler`, running off event loop, for large
+messages. The single implementation of `InboundMessageHandler` handles
+messages of any size effectively by deriving size of the incoming
+message from the byte stream. In addition to deriving size of the
+message from the stream, incoming message expiration time is proactively
+read, before attempting to deserialize the entire message. If it’s
+expired at the time when a message is encountered the message is just
+skipped in the byte stream altogether. And if a message fails to be
+deserialized while still on the receiving side - say, because of table
+id or column being unknown - bytes are skipped, without dropping the
+entire connection and losing all the buffered messages. An immediately
+reply back is sent to the coordinator node with the failure reason,
+rather than waiting for the coordinator callback to expire. This logic
+is extended to a corrupted frame; a corrupted frame is safely skipped
+over without dropping the connection.
+
+Inbound path imposes strict limits on memory utilization. Specifically,
+the memory occupied by all parsed, but unprocessed messages is bound -
+on per-connection, per-endpoint, and global basis. Once a connection
+exceeds its local unprocessed capacity and cannot borrow any permits
+from per-endpoint and global reserve, it simply stops processing further
+messages, providing natural backpressure - until sufficient capacity is
+regained.
+
+=== Outbound Connections
+
+==== Opening a connection
+
+A consistent approach is adopted for all kinds of failure to connect,
+including: refused by endpoint, incompatible versions, or unexpected
+exceptions;
+
+* Retry forever, until either success or no messages waiting to deliver.
+* Wait incrementally longer periods before reconnecting, up to a maximum
+of 1s.
+* While failing to connect, no reserve queue limits are acquired.
+
+==== Closing a connection
+
+* Correctly drains outbound messages that are waiting to be delivered
+(unless disconnected and fail to reconnect).
+* Messages written to a closing connection are either delivered or
+rejected, with a new connection being opened if the old is irrevocably
+closed.
+* Unused connections are pruned eventually.
+
+==== Reconnecting
+
+We sometimes need to reconnect a perfectly valid connection, e.g. if the
+preferred IP address changes. We ensure that the underlying connection
+has no in-progress operations before closing it and reconnecting.
+
+==== Message Failure
+
+Propagates to callbacks instantly, better preventing overload by
+reclaiming committed memory.
+
+===== Expiry
+
+* No longer experiences head-of-line blocking (e.g. undroppable message
+preventing all droppable messages from being expired).
+* While overloaded, expiry is attempted eagerly on enqueuing threads.
+* While disconnected we schedule regular pruning, to handle the case
+where messages are no longer being sent, but we have a large backlog to
+expire.
+
+===== Overload
+
+* Tracked by bytes queued, as opposed to number of messages.
+
+===== Serialization Errors
+
+* Do not result in the connection being invalidated; the message is
+simply completed with failure, and then erased from the frame.
+* Includes detected mismatch between calculated serialization size to
+actual.
+
+Failures to flush to network, perhaps because the connection has been
+reset are not currently notified to callback handlers, as the necessary
+information has been discarded, though it would be possible to do so in
+future if we decide it is worth our while.
+
+==== QoS
+
+"Gossip" connection has been replaced with a general purpose "Urgent"
+connection, for any small messages impacting system stability.
+
+==== Metrics
+
+We track, and expose via Virtual Table and JMX, the number of messages
+and bytes that: we could not serialize or flush due to an error, we
+dropped due to overload or timeout, are pending, and have successfully
+sent.
+
+== Added a Message size limit
+
+Cassandra pre-4.0 doesn't protect the server from allocating huge
+buffers for the inter-node Message objects. Adding a message size limit
+would be good to deal with issues such as a malfunctioning cluster
+participant. Version 4.0 introduced max message size config param, akin
+to max mutation size - set to endpoint reserve capacity by default.
+
+== Recover from unknown table when deserializing internode messages
+
+As discussed in
+(https://issues.apache.org/jira/browse/CASSANDRA-9289[CASSANDRA-9289])
+it would be nice to gracefully recover from seeing an unknown table in a
+message from another node. Pre-4.0, we close the connection and
+reconnect, which can cause other concurrent queries to fail. Version 4.0
+fixes the issue by wrapping message in-stream with
+`TrackedDataInputPlus`, catching `UnknownCFException`, and skipping the
+remaining bytes in this message. TCP won't be closed and it will remain
+connected for other messages.
diff --git a/doc/modules/cassandra/pages/architecture/snitch.adoc b/doc/modules/cassandra/pages/architecture/snitch.adoc
index 90b32fb..3ae066d 100644
--- a/doc/modules/cassandra/pages/architecture/snitch.adoc
+++ b/doc/modules/cassandra/pages/architecture/snitch.adoc
@@ -18,9 +18,9 @@
 
 * `dynamic_snitch`: whether the dynamic snitch should be enabled or
 disabled.
-* `dynamic_snitch_update_interval_in_ms`: controls how often to perform
+* `dynamic_snitch_update_interval`: 100ms, controls how often to perform
 the more expensive part of host score calculation.
-* `dynamic_snitch_reset_interval_in_ms`: if set greater than zero, this
+* `dynamic_snitch_reset_interval`: 10m, if set greater than zero, this
 will allow 'pinning' of replicas to hosts in order to increase cache
 capacity.
 * `dynamic_snitch_badness_threshold:`: The badness threshold will
diff --git a/doc/modules/cassandra/pages/architecture/storage_engine.adoc b/doc/modules/cassandra/pages/architecture/storage_engine.adoc
index 77c52e5..9a0c37a 100644
--- a/doc/modules/cassandra/pages/architecture/storage_engine.adoc
+++ b/doc/modules/cassandra/pages/architecture/storage_engine.adoc
@@ -11,7 +11,7 @@
 
 All mutations write optimized by storing in commitlog segments, reducing
 the number of seeks needed to write to disk. Commitlog Segments are
-limited by the `commitlog_segment_size_in_mb` option, once the size is
+limited by the `commitlog_segment_size` option, once the size is
 reached, a new commitlog segment is created. Commitlog segments can be
 archived, deleted, or recycled once all its data has been flushed to
 SSTables. Commitlog segments are truncated when Cassandra has written
@@ -19,16 +19,16 @@
 drain" before stopping Cassandra will write everything in the memtables
 to SSTables and remove the need to sync with the commitlogs on startup.
 
-* `commitlog_segment_size_in_mb`: The default size is 32, which is
+* `commitlog_segment_size`: The default size is 32MiB, which is
 almost always fine, but if you are archiving commitlog segments (see
 commitlog_archiving.properties), then you probably want a finer
-granularity of archiving; 8 or 16 MB is reasonable. Max mutation size is
-also configurable via `max_mutation_size_in_kb` setting in `cassandra.yaml`.
-The default is half the size `commitlog_segment_size_in_mb * 1024`.
+granularity of archiving; 8 or 16 MiB is reasonable. `commitlog_segment_size`
+also determines the default value of `max_mutation_size` in cassandra.yaml.
+By default, max_mutation_size is half the size of `commitlog_segment_size`.
 
-**NOTE: If `max_mutation_size_in_kb` is set explicitly then
-`commitlog_segment_size_in_mb` must be set to at least twice the size of
-`max_mutation_size_in_kb / 1024`**.
+**NOTE: If `max_mutation_size` is set explicitly then
+`commitlog_segment_size` must be set to at least twice the size of
+`max_mutation_size`**.
 
 Commitlogs are an append only log of all mutations local to a Cassandra
 node. Any data written to Cassandra will first be written to a commit
@@ -47,11 +47,11 @@
 - `commitlog_sync_batch_window_in_ms`: Time to wait between "batch"
 fsyncs _Default Value:_ 2
 ** `periodic`: In periodic mode, writes are immediately ack'ed, and the
-CommitLog is simply synced every "commitlog_sync_period_in_ms"
+CommitLog is simply synced every "commitlog_sync_period"
 milliseconds.
 +
-- `commitlog_sync_period_in_ms`: Time to wait between "periodic" fsyncs
-_Default Value:_ 10000
+- `commitlog_sync_period`: Time to wait between "periodic" fsyncs
+_Default Value:_ 10000ms
 
 _Default Value:_ batch
 
@@ -79,7 +79,7 @@
 #     parameters:
 ----
 
-* `commitlog_total_space_in_mb`: Total space to use for commit logs on
+* `commitlog_total_space`: Total space to use for commit logs on
 disk.
 
 If space gets above this value, Cassandra will flush every dirty CF in
@@ -89,7 +89,7 @@
 The default value is the smaller of 8192, and 1/4 of the total space of
 the commitlog volume.
 
-_Default Value:_ 8192
+_Default Value:_ 8192MiB
 
 == Memtables
 
diff --git a/doc/modules/cassandra/pages/architecture/streaming.adoc b/doc/modules/cassandra/pages/architecture/streaming.adoc
new file mode 100644
index 0000000..8495ccf
--- /dev/null
+++ b/doc/modules/cassandra/pages/architecture/streaming.adoc
@@ -0,0 +1,217 @@
+= Improved Streaming
+
+Apache Cassandra 4.0 has made several improvements to streaming.
+Streaming is the process used by nodes of a cluster to exchange data in
+the form of SSTables. Streaming of SSTables is performed for several
+operations, such as:
+
+* SSTable Repair
+* Host Replacement
+* Range movements
+* Bootstrapping
+* Rebuild
+* Cluster expansion
+
+== Streaming based on Netty
+
+Streaming in Cassandra 4.0 is based on Non-blocking Input/Output (NIO)
+with Netty
+(https://issues.apache.org/jira/browse/CASSANDRA-12229[CASSANDRA-12229]).
+It replaces the single-threaded (or sequential), synchronous, blocking
+model of streaming messages and transfer of files. Netty supports
+non-blocking, asynchronous, multi-threaded streaming with which multiple
+connections are opened simultaneously. Non-blocking implies that threads
+are not blocked as they don’t wait for a response for a sent request. A
+response could be returned in a different thread. With asynchronous,
+connections and threads are decoupled and do not have a 1:1 relation.
+Several more connections than threads may be opened.
+
+== Zero Copy Streaming
+
+Pre-4.0, during streaming Cassandra reifies the SSTables into objects.
+This creates unnecessary garbage and slows down the whole streaming
+process as some SSTables can be transferred as a whole file rather than
+individual partitions. Cassandra 4.0 has added support for streaming
+entire SSTables when possible
+(https://issues.apache.org/jira/browse/CASSANDRA-14556[CASSANDRA-14556])
+for faster Streaming using ZeroCopy APIs. If enabled, Cassandra will use
+ZeroCopy for eligible SSTables significantly speeding up transfers and
+increasing throughput. A zero-copy path avoids bringing data into
+user-space on both sending and receiving side. Any streaming related
+operations will notice corresponding improvement. Zero copy streaming is
+hardware bound; only limited by the hardware limitations (Network and
+Disk IO ).
+
+=== High Availability
+
+In benchmark tests Zero Copy Streaming is 5x faster than partitions
+based streaming. Faster streaming provides the benefit of improved
+availability. A cluster’s recovery mainly depends on the streaming
+speed, Cassandra clusters with failed nodes will be able to recover much
+more quickly (5x faster). If a node fails, SSTables need to be streamed
+to a replacement node. During the replacement operation, the new
+Cassandra node streams SSTables from the neighboring nodes that hold
+copies of the data belonging to this new node’s token range. Depending
+on the amount of data stored, this process can require substantial
+network bandwidth, taking some time to complete. The longer these range
+movement operations take, the more the cluster availability is lost.
+Failure of multiple nodes would reduce high availability greatly. The
+faster the new node completes streaming its data, the faster it can
+serve traffic, increasing the availability of the cluster.
+
+=== Enabling Zero Copy Streaming
+
+Zero copy streaming is enabled by setting the following setting in
+`cassandra.yaml`.
+
+....
+stream_entire_sstables: true
+....
+
+By default zero copy streaming is enabled.
+
+=== SSTables Eligible for Zero Copy Streaming
+
+Zero copy streaming is used if all partitions within the SSTable need to
+be transmitted. This is common when using `LeveledCompactionStrategy` or
+when partitioning SSTables by token range has been enabled. All
+partition keys in the SSTables are iterated over to determine the
+eligibility for Zero Copy streaming.
+
+=== Benefits of Zero Copy Streaming
+
+When enabled, it permits Cassandra to zero-copy stream entire eligible
+SSTables between nodes, including every component. This speeds up the
+network transfer significantly subject to throttling specified by
+`stream_throughput_outbound`.
+
+Enabling this will reduce the GC pressure on sending and receiving node.
+While this feature tries to keep the disks balanced, it cannot guarantee
+it. This feature will be automatically disabled if internode encryption
+is enabled. Currently this can be used with Leveled Compaction.
+
+=== Configuring for Zero Copy Streaming
+
+Throttling would reduce the streaming speed. The
+`stream_throughput_outbound` throttles all outbound
+streaming file transfers on a node to the given total throughput in
+Mbps. When unset, the default is 200 Mbps or 24 MiB/s.
+
+....
+stream_throughput_outbound: 24MiB/s
+....
+
+To run any Zero Copy streaming benchmark the
+`stream_throughput_outbound` must be set to a really
+high value otherwise, throttling will be significant and the benchmark
+results will not be meaningful.
+
+The `inter_dc_stream_throughput_outbound` throttles all
+streaming file transfer between the datacenters, this setting allows
+users to throttle inter dc stream throughput in addition to throttling
+all network stream traffic as configured with
+`stream_throughput_outbound`. When unset, the default
+is 200 Mbps or 25 MB/s.
+
+....
+inter_dc_stream_throughput_outbound: 24MiB/s
+....
+
+=== SSTable Components Streamed with Zero Copy Streaming
+
+Zero Copy Streaming streams entire SSTables. SSTables are made up of
+multiple components in separate files. SSTable components streamed are
+listed in Table 1.
+
+Table 1. SSTable Components
+
+[width="98%",cols="27%,73%",]
+|===
+|SSTable Component |Description
+
+|Data.db |The base data for an SSTable: the remaining components can be
+regenerated based on the data component.
+
+|Index.db |Index of the row keys with pointers to their positions in the
+data file.
+
+|Filter.db |Serialized bloom filter for the row keys in the SSTable.
+
+|CompressionInfo.db |File to hold information about uncompressed data
+length, chunk offsets etc.
+
+|Statistics.db |Statistical metadata about the content of the SSTable.
+
+|Digest.crc32 |Holds CRC32 checksum of the data file size_bytes.
+
+|CRC.db |Holds the CRC32 for chunks in an uncompressed file.
+
+|Summary.db |Holds SSTable Index Summary (sampling of Index component)
+
+|TOC.txt |Table of contents, stores the list of all components for the
+SSTable.
+|===
+
+Custom component, used by e.g. custom compaction strategy may also be
+included.
+
+== Repair Streaming Preview
+
+Repair with `nodetool repair` involves streaming of repaired SSTables
+and a repair preview has been added to provide an estimate of the amount
+of repair streaming that would need to be performed. Repair preview
+(https://issues.apache.org/jira/browse/CASSANDRA-13257[CASSANDRA-13257])
+is invoke with `nodetool repair --preview` using option:
+
+....
+-prv, --preview
+....
+
+It determines ranges and amount of data to be streamed, but doesn't
+actually perform repair.
+
+== Parallelizing of Streaming of Keyspaces
+
+The streaming of the different keyspaces for bootstrap and rebuild has
+been parallelized in Cassandra 4.0
+(https://issues.apache.org/jira/browse/CASSANDRA-4663[CASSANDRA-4663]).
+
+== Unique nodes for Streaming in Multi-DC deployment
+
+Range Streamer picks unique nodes to stream data from when number of
+replicas in each DC is three or more
+(https://issues.apache.org/jira/browse/CASSANDRA-4650[CASSANDRA-4650]).
+What the optimization does is to even out the streaming load across the
+cluster. Without the optimization, some node can be picked up to stream
+more data than others. This patch allows to select dedicated node to
+stream only one range.
+
+This will increase the performance of bootstrapping a node and will also
+put less pressure on nodes serving the data. This does not affect if N <
+3 in each DC as then it streams data from only 2 nodes.
+
+Stream Operation Types ^^^^^^^^^^^^^
+
+It is important to know the type or purpose of a certain stream. Version
+4.0
+(https://issues.apache.org/jira/browse/CASSANDRA-13064[CASSANDRA-13064])
+adds an `enum` to distinguish between the different types of streams.
+Stream types are available both in a stream request and a stream task.
+The different stream types are:
+
+* Restore replica count
+* Unbootstrap
+* Relocation
+* Bootstrap
+* Rebuild
+* Bulk Load
+* Repair
+
+== Disallow Decommission when number of Replicas will drop below configured RF
+
+https://issues.apache.org/jira/browse/CASSANDRA-12510[CASSANDRA-12510]
+guards against decommission that will drop # of replicas below
+configured replication factor (RF), and adds the `--force` option that
+allows decommission to continue if intentional; force decommission of
+this node even when it reduces the number of replicas to below
+configured RF.
diff --git a/doc/modules/cassandra/pages/configuration/configuration.adoc b/doc/modules/cassandra/pages/configuration/configuration.adoc
new file mode 100644
index 0000000..9b4df24
--- /dev/null
+++ b/doc/modules/cassandra/pages/configuration/configuration.adoc
@@ -0,0 +1,220 @@
+= Liberating cassandra.yaml Parameters' Names from Their Units
+
+== Objective
+
+Three big things happened as part of https://issues.apache.org/jira/browse/CASSANDRA-15234[CASSANDRA-15234]:
+
+1) Renaming of parameters in `cassandra.yaml` to follow the form `noun_verb`.
+
+2) Liberating `cassandra.yaml` parameters from their units (DataStorage, DataRate and Duration) and introducing temporary smallest accepted unit per parameter (only for DataStorage and Duration ones)
+
+3) Backward compatibility framework to support the old names and lack of units support until at least the next major release.
+
+
+== Renamed Parameters
+
+The community has decided to allow operators to specify units for Cassandra parameters of types duration, data storage, and data rate.
+All parameters which had a particular unit (most of the time added as a suffix to their name) can be now set by using the format [value][unit]. The unit suffix has been removed from their names.
+Supported units:
+[cols=",",options="header",]
+|===
+|Parameter Type |Units Supported
+|Duration | d, h, m, s, ms, us, µs, ns
+|Data Storage | B, KiB, MiB, GiB
+|Data Rate | B/s, MiB/s, KiB/s
+|===
+
+
+*Example*:
+
+Old name and value format:
+....
+permissions_update_interval_ms: 0
+....
+New name and possible value formats:
+....
+permissions_update_interval: 0ms
+permissions_update_interval: 0s
+permissions_update_interval: 0d
+permissions_update_interval: 0us
+permissions_update_interval: 0µs
+....
+
+The work in https://issues.apache.org/jira/browse/CASSANDRA-15234[CASSANDRA-15234] was already quite big, so we decided
+to introduce the notion of the smallest allowed unit per parameter for duration and data storage parameters. What does this mean?
+Cassandra's internals still use the old units for parameters. If, for example, seconds are used internally, but you want
+to add a value in nanoseconds in `cassandra.yaml`, you will get a configuration exception that contains the following information:
+....
+Accepted units: seconds, minutes, hours, days.
+....
+
+Why was this needed?
+Because we can run into precision issues. The full solution to the problem is to convert internally all parameters’ values
+to be manipulated with the smallest supported by Cassandra unit. A series of tickets to assess and maybe migrate to the smallest unit
+our parameters (incrementally, post https://issues.apache.org/jira/browse/CASSANDRA-15234[CASSANDRA-15234]) will be opened in the future.
+
+
+[cols=",,",options="header",]
+|===
+|Old Name |New Name |The Smallest Supported Unit
+|permissions_validity_in_ms |permissions_validity |ms
+|permissions_update_interval_in_ms |permissions_update_interval |ms
+|roles_validity_in_ms |roles_validity |ms
+|roles_update_interval_in_ms |roles_update_interval |ms
+|credentials_validity_in_ms |credentials_validity |ms
+|credentials_update_interval_in_ms |credentials_update_interval |ms
+|max_hint_window_in_ms |max_hint_window |ms
+|native_transport_idle_timeout_in_ms |native_transport_idle_timeout |ms
+|request_timeout_in_ms |request_timeout |ms
+|read_request_timeout_in_ms |read_request_timeout |ms
+|range_request_timeout_in_ms |range_request_timeout |ms
+|write_request_timeout_in_ms |write_request_timeout |ms
+|counter_write_request_timeout_in_ms |counter_write_request_timeout |ms
+|cas_contention_timeout_in_ms |cas_contention_timeout |ms
+|truncate_request_timeout_in_ms |truncate_request_timeout |ms
+|streaming_keep_alive_period_in_secs |streaming_keep_alive_period |s
+|cross_node_timeout |internode_timeout |-
+|slow_query_log_timeout_in_ms |slow_query_log_timeout |ms
+|memtable_heap_space_in_mb |memtable_heap_space |MiB
+|memtable_offheap_space_in_mb |memtable_offheap_space |MiB
+|repair_session_space_in_mb |repair_session_space |MiB
+|internode_max_message_size_in_bytes |internode_max_message_size |B
+|internode_send_buff_size_in_bytes |internode_socket_send_buffer_size |B
+|internode_socket_send_buffer_size_in_bytes |internode_socket_send_buffer_size |B
+|internode_socket_receive_buffer_size_in_bytes |internode_socket_receive_buffer_size |B
+|internode_recv_buff_size_in_bytes |internode_socket_receive_buffer_size |B
+|internode_application_send_queue_capacity_in_bytes |internode_application_send_queue_capacity |B
+|internode_application_send_queue_reserve_endpoint_capacity_in_bytes |internode_application_send_queue_reserve_endpoint_capacity |B
+|internode_application_send_queue_reserve_global_capacity_in_bytes |internode_application_send_queue_reserve_global_capacity |B
+|internode_application_receive_queue_capacity_in_bytes |internode_application_receive_queue_capacity |B
+|internode_application_receive_queue_reserve_endpoint_capacity_in_bytes |internode_application_receive_queue_reserve_endpoint_capacity |B
+|internode_application_receive_queue_reserve_global_capacity_in_bytes |internode_application_receive_queue_reserve_global_capacity |B
+|internode_tcp_connect_timeout_in_ms |internode_tcp_connect_timeout |ms
+|internode_tcp_user_timeout_in_ms |internode_tcp_user_timeout |ms
+|internode_streaming_tcp_user_timeout_in_ms |internode_streaming_tcp_user_timeout |ms
+|native_transport_max_frame_size_in_mb |native_transport_max_frame_size |MiB
+|max_value_size_in_mb |max_value_size |MiB
+|column_index_size_in_kb |column_index_size |KiB
+|column_index_cache_size_in_kb |column_index_cache_size |KiB
+|batch_size_warn_threshold_in_kb |batch_size_warn_threshold |KiB
+|batch_size_fail_threshold_in_kb |batch_size_fail_threshold |KiB
+|compaction_throughput_mb_per_sec |compaction_throughput |MiB/s
+|compaction_large_partition_warning_threshold_mb |compaction_large_partition_warning_threshold |MiB
+|min_free_space_per_drive_in_mb |min_free_space_per_drive |MiB
+|stream_throughput_outbound_megabits_per_sec |stream_throughput_outbound |MiB/s
+|inter_dc_stream_throughput_outbound_megabits_per_sec |inter_dc_stream_throughput_outbound |MiB/s
+|commitlog_total_space_in_mb |commitlog_total_space |MiB
+|commitlog_sync_group_window_in_ms |commitlog_sync_group_window |ms
+|commitlog_sync_period_in_ms |commitlog_sync_period |ms
+|commitlog_segment_size_in_mb |commitlog_segment_size |MiB
+|periodic_commitlog_sync_lag_block_in_ms |periodic_commitlog_sync_lag_block |ms
+|max_mutation_size_in_kb |max_mutation_size |KiB
+|cdc_total_space_in_mb |cdc_total_space |MiB
+|cdc_free_space_check_interval_ms |cdc_free_space_check_interval |ms
+|dynamic_snitch_update_interval_in_ms |dynamic_snitch_update_interval |ms
+|dynamic_snitch_reset_interval_in_ms |dynamic_snitch_reset_interval |ms
+|hinted_handoff_throttle_in_kb |hinted_handoff_throttle |KiB
+|batchlog_replay_throttle_in_kb |batchlog_replay_throttle |KiB
+|hints_flush_period_in_ms |hints_flush_period |ms
+|max_hints_file_size_in_mb |max_hints_file_size |MiB
+|trickle_fsync_interval_in_kb |trickle_fsync_interval |KiB
+|sstable_preemptive_open_interval_in_mb |sstable_preemptive_open_interval |MiB
+|key_cache_size_in_mb |key_cache_size |MiB
+|row_cache_size_in_mb |row_cache_size |MiB
+|counter_cache_size_in_mb |counter_cache_size |MiB
+|networking_cache_size_in_mb |networking_cache_size |MiB
+|file_cache_size_in_mb |file_cache_size |MiB
+|index_summary_capacity_in_mb |index_summary_capacity |MiB
+|index_summary_resize_interval_in_minutes |index_summary_resize_interval |m
+|gc_log_threshold_in_ms |gc_log_threshold |ms
+|gc_warn_threshold_in_ms |gc_warn_threshold |ms
+|tracetype_query_ttl |trace_type_query_ttl |s
+|tracetype_repair_ttl |trace_type_repair_ttl |s
+|prepared_statements_cache_size_mb |prepared_statements_cache_size |MiB
+|enable_user_defined_functions |user_defined_functions_enabled |-
+|enable_scripted_user_defined_functions |scripted_user_defined_functions_enabled |-
+|enable_materialized_views |materialized_views_enabled |-
+|enable_transient_replication |transient_replication_enabled |-
+|enable_sasi_indexes |sasi_indexes_enabled |-
+|enable_drop_compact_storage |drop_compact_storage_enabled |-
+|enable_user_defined_functions_threads |user_defined_functions_threads_enabled |-
+|enable_legacy_ssl_storage_port |legacy_ssl_storage_port_enabled |-
+|user_defined_function_fail_timeout |user_defined_functions_fail_timeout |ms
+|user_defined_function_warn_timeout |user_defined_functions_warn_timeout |ms
+|cache_load_timeout_seconds |cache_load_timeout |s
+|===
+
+Another TO DO is to add JMX methods supporting the new format. However, we may abandon this if virtual tables support
+configuration changes in the near future.
+
+*Notes for Cassandra Developers*:
+
+- Most of our parameters are already moved to the new framework as part of https://issues.apache.org/jira/browse/CASSANDRA-15234[CASSANDRA-15234].
+`@Replaces` is the annotation to be used when you make changes to any configuration parameters in `Config` class and `cassandra.yaml`, and you want to add backward
+compatibility with previous Cassandra versions. `Converters` class enumerates the different methods used for backward compatibility.
+`IDENTITY` is the one used for name change only. For more information about the other Converters, please, check the JavaDoc in the class.
+For backward compatibility virtual table `Settings` contains both the old and the new
+parameters with the old and the new value format. Only exception at the moment are the following three parameters: `key_cache_save_period`,
+`row_cache_save_period` and `counter_cache_save_period` which appear only once with the new value format.
+The old names and value format still can be used at least until the next major release. Deprecation warning is emitted on startup.
+If the parameter is of type duration, data rate or data storage, its value should be accompanied by a unit when new name is used.
+
+- Please follow the new format `noun_verb` when adding new configuration parameters.
+
+- Please consider adding any new parameters with the lowest supported by Cassandra unit when possible. Our new types also
+support long and integer upper bound, depending on your needs. All options for configuration parameters' types are nested
+classes in our three main abstract classes - `DurationSpec`, `DataStorageSpec`, `DataRateSpec`.
+
+- If for some reason you consider the smallest unit for a new parameter shouldn’t be the one that is supported as such in
+Cassandra, you can use the rest of the nested classes in `DurationSpec`, `DataStorageSpec`. The smallest allowed unit is
+the one we use internally for the property, so we don't have to do conversions to bigger units which will lead to precision
+problems. This is a problem only with `DurationSpec` and `DataStorageSpec`. `DataRateSpec` is handled internally in double.
+
+- New parameters should be added as non-negative numbers. For parameters where you would have set -1 to disable in the past, you might
+want to consider a separate flag parameter or null value. In case you use the null value, please, ensure that any default value
+introduced in the DatabaseDescriptor to handle it is also duplicated in any related setters.
+
+- Parameters of type data storage, duration and data rate cannot be set to Long.MAX_VALUE (former parameters of long type)
+and Integer.MAX_VALUE (former parameters of int type). That numbers are used during conversion between units to prevent
+an overflow from happening.
+
+- Any time you add @Replaces with a name change, we need to add an entry in this https://github.com/riptano/ccm/blob/808b6ca13526785b0fddfe1ead2383c060c4b8b6/ccmlib/common.py#L62[Python dictionary in CCM] to support the same backward compatibility as SnakeYAML.
+
+Please follow the instructions in requirements.txt in the DTest repo how to retag CCM after committing any changes.
+You might want to test also with tagging in your repo to ensure that there will be no surprise after retagging the official CCM.
+Please be sure to run a full CI after any changes as CCM affects a few of our testing suites.
+
+- Some configuration parameters are not announced in cassandra.yaml, but they are presented in the Config class for advanced users.
+Those also should be using the new framework and naming conventions.
+
+- As we have backward compatibility, we didn’t have to rework all python DTests to set config in the new format, and we exercise
+the backward compatibility while testing. Please consider adding any new tests using the new names and value format though.
+
+- In-JVM upgrade tests do not support per-version configuration at the moment, so we have to keep the old names and value format.
+Currently, if we try to use the new config for a newer version, that will be silently ignored and default config will be used.
+
+- SnakeYAML supports overloading of parameters. This means that if you add a configuration parameter more than once in your `cassandra.yaml` -
+the latest occasion will be the one to load in Config during Cassandra startup. In order to make upgrades as less disruptive as possible,
+we continue supporting that behavior also with adding old and new names of a parameter into `cassandra.yaml`.
+
+- Please ensure that any JMX setters/getters update the Config class properties and not some local copies. Settings Virtual Table
+reports the configuration loaded at any time from the Config class.
+
+*Example*:
+
+If you add the following to `cassandra.yaml`:
+....
+hinted_handoff_enabled: true
+enabled_hinted_handolff: false
+....
+
+you will get loaded in `Config`:
+....
+hinted_handoff_enabled: false
+....
+
+https://issues.apache.org/jira/browse/CASSANDRA-17379[CASSANDRA-17379] was opened to improve the user experience and deprecate the overloading.
+By default, we refuse starting Cassandra with a config containing both old and new config keys for the same parameter. Start
+Cassandra with `-Dcassandra.allow_new_old_config_keys=true` to override. For historical reasons duplicate config keys
+in `cassandra.yaml` are allowed by default, start Cassandra with `-Dcassandra.allow_duplicate_config_keys=false` to disallow this.
+Please note that `key_cache_save_period`, `row_cache_save_period`, `counter_cache_save_period` will be affected only by `-Dcassandra.allow_duplicate_config_keys`.
\ No newline at end of file
diff --git a/doc/modules/cassandra/pages/cql/changes.adoc b/doc/modules/cassandra/pages/cql/changes.adoc
index 1f89469..df99a39 100644
--- a/doc/modules/cassandra/pages/cql/changes.adoc
+++ b/doc/modules/cassandra/pages/cql/changes.adoc
@@ -2,6 +2,16 @@
 
 The following describes the changes in each version of CQL.
 
+== 3.4.6
+
+* Add support for IF EXISTS and IF NOT EXISTS in ALTER statements  (`16916`)
+* Allow GRANT/REVOKE multiple permissions in a single statement (`17030`)
+* Pre hashed passwords in CQL (`17334`)
+* Add support for type casting in WHERE clause components and in the values of INSERT/UPDATE statements (`14337`)
+* Add support for CONTAINS and CONTAINS KEY in conditional UPDATE and DELETE statement (`10537`)
+* Allow to grant permission for all tables in a keyspace (`17027`)
+* Allow to aggregate by time intervals (`11871`)
+
 == 3.4.5
 
 * Adds support for arithmetic operators (`11935`)
diff --git a/doc/modules/cassandra/pages/cql/cql_singlefile.adoc b/doc/modules/cassandra/pages/cql/cql_singlefile.adoc
index 89ed359..d99e12b 100644
--- a/doc/modules/cassandra/pages/cql/cql_singlefile.adoc
+++ b/doc/modules/cassandra/pages/cql/cql_singlefile.adoc
@@ -323,7 +323,7 @@
 _Syntax:_
 
 bc(syntax).. +
-::= ALTER KEYSPACE WITH  +
+::= ALTER KEYSPACE (IF EXISTS)? WITH  +
 p. +
 _Sample:_
 
@@ -713,12 +713,13 @@
 _Syntax:_
 
 bc(syntax).. +
-::= ALTER (TABLE | COLUMNFAMILY)
+::= ALTER (TABLE | COLUMNFAMILY) (IF EXISTS)?
 
-::= ADD  +
-| ADD ( ( , )* ) +
-| DROP  +
-| DROP ( ( , )* ) +
+::= ADD (IF NOT EXISTS)? +
+| ADD  (IF NOT EXISTS)? ( ( , )* ) +
+| DROP (IF EXISTS)?  +
+| DROP (IF EXISTS)? ( ( , )* ) +
+| RENAME (IF EXISTS)? TO (AND TO)* +
 | WITH ( AND )* +
 p. +
 _Sample:_
@@ -736,6 +737,7 @@
 for adding new columns, dropping existing ones, or updating the table
 options. As with table creation, `ALTER COLUMNFAMILY` is allowed as an
 alias for `ALTER TABLE`.
+If the table does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 
 The `<tablename>` is the table name optionally preceded by the keyspace
 name. The `<instruction>` defines the alteration to perform:
@@ -743,13 +745,20 @@
 * `ADD`: Adds a new column to the table. The `<identifier>` for the new
 column must not conflict with an existing column. Moreover, columns
 cannot be added to tables defined with the `COMPACT STORAGE` option.
+If the new column already exists, the statement will return an error, unless `IF NOT EXISTS` is used in which case the operation is a no-op.
 * `DROP`: Removes a column from the table. Dropped columns will
 immediately become unavailable in the queries and will not be included
 in compacted sstables in the future. If a column is readded, queries
 won’t return values written before the column was last dropped. It is
 assumed that timestamps represent actual time, so if this is not your
-case, you should NOT readd previously dropped columns. Columns can’t be
+case, you should NOT read previously dropped columns. Columns can’t be
 dropped from tables defined with the `COMPACT STORAGE` option.
+If the dropped column does not already exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
+* `RENAME` a primary key column of a table. Non primary key columns cannot be renamed.
+Furthermore, renaming a column to another name which already exists isn't allowed.
+It's important to keep in mind that renamed columns shouldn't have dependent seconday indexes.
+If the renamed column does not already exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
+
 * `WITH`: Allows to update the options of the table. The
 link:#createTableOptions[supported `<option>`] (and syntax) are the same
 as for the `CREATE TABLE` statement except that `COMPACT STORAGE` is not
@@ -1020,10 +1029,10 @@
 _Syntax:_
 
 bc(syntax).. +
-::= ALTER TYPE
+::= ALTER TYPE (IF EXISTS)?
 
-::= ADD  +
-| RENAME TO ( AND TO )* +
+::= ADD (IF NOT EXISTS)?  +
+| RENAME (IF EXISTS)? TO ( AND TO )* +
 p. +
 _Sample:_
 
@@ -1034,7 +1043,7 @@
 p. +
 The `ALTER TYPE` statement is used to manipulate type definitions. It
 allows for adding new fields, renaming existing fields, or changing the
-type of existing fields.
+type of existing fields. If the type does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 
 [[dropTypeStmt]]
 ==== DROP TYPE
@@ -1377,6 +1386,7 @@
 | `.' `='
 
 ::=  +
+| CONTAINS (KEY)? +
 | IN  +
 | `[' `]'  +
 | `[' `]' IN  +
@@ -1489,6 +1499,7 @@
 ::= ( | `(' ( ( `,' )* )? `)')
 
 ::= ( | `!=')  +
+| CONTAINS (KEY)? +
 | IN  +
 | `[' `]' ( | `!=')  +
 | `[' `]' IN  +
@@ -1990,7 +2001,7 @@
 _Syntax:_
 
 bc(syntax).. +
-::= ALTER ROLE ( WITH ( AND )* )?
+::= ALTER ROLE (IF EXISTS)? ( WITH ( AND )* )?
 
 ::= PASSWORD =  +
 | LOGIN =  +
@@ -2003,6 +2014,8 @@
 bc(sample). +
 ALTER ROLE bob WITH PASSWORD = `PASSWORD_B' AND SUPERUSER = false;
 
+If the role does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
+
 Conditions on executing `ALTER ROLE` statements:
 
 * A client must have `SUPERUSER` status to alter the `SUPERUSER` status
@@ -2161,7 +2174,7 @@
 _Syntax:_
 
 bc(syntax).. +
-::= ALTER USER ( WITH PASSWORD )? ( )?
+::= ALTER USER (IF EXISTS)? ( WITH PASSWORD )? ( )?
 
 ::= SUPERUSER +
 | NOSUPERUSER +
@@ -2171,6 +2184,8 @@
 ALTER USER alice WITH PASSWORD `PASSWORD_A'; +
 ALTER USER bob SUPERUSER;
 
+If the user does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
+
 [[dropUserStmt]]
 ==== DROP USER
 
diff --git a/doc/modules/cassandra/pages/cql/ddl.adoc b/doc/modules/cassandra/pages/cql/ddl.adoc
index be93bc2..36cce45 100644
--- a/doc/modules/cassandra/pages/cql/ddl.adoc
+++ b/doc/modules/cassandra/pages/cql/ddl.adoc
@@ -211,7 +211,7 @@
 ----
 include::example$CQL/alter_ks.cql[]
 ----
-
+If the keyspace does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 The supported options are the same as for xref:cql/ddl.adoc#create-keyspace-statement[creating a keyspace].
 
 [[drop-keyspace-statement]]
@@ -729,6 +729,7 @@
 ----
 include::example$BNF/alter_table.bnf[]
 ----
+If the table does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 
 For example:
 
@@ -743,12 +744,14 @@
 * `ADD` a new column to a table. The primary key of a table cannot ever be altered.
 A new column, thus, cannot be part of the primary key. 
 Adding a column is a constant-time operation based on the amount of data in the table.
+If the new column already exists, the statement will return an error, unless `IF NOT EXISTS` is used in which case the operation is a no-op.
 * `DROP` a column from a table. This command drops both the column and all
 its content. Be aware that, while the column becomes immediately
 unavailable, its content are removed lazily during compaction. Because of this lazy removal,
 the command is a constant-time operation based on the amount of data in the table. 
 Also, it is important to know that once a column is dropped, a column with the same name can be re-added,
-unless the dropped column was a non-frozen column like a collection. 
+unless the dropped column was a non-frozen column like a collection.
+If the dropped column does not already exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 
 [WARNING]
 .Warning
@@ -761,6 +764,11 @@
 if you do so, dropping a column will not correctly execute.
 ====
 
+* `RENAME` a primary key column of a table. Non primary key columns cannot be renamed.
+Furthermore, renaming a column to another name which already exists isn't allowed.
+It's important to keep in mind that renamed columns shouldn't have dependent seconday indexes.
+If the renamed column does not already exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
+
 * Use `WITH` to change a table option. The xref:CQL/ddl.adoc#create-table-options[supported options]
 are the same as those used when creating a table, with the exception of `CLUSTERING ORDER`.
 However, setting any `compaction` sub-options will erase *ALL* previous `compaction` options, so you need to re-specify
diff --git a/doc/modules/cassandra/pages/cql/functions.adoc b/doc/modules/cassandra/pages/cql/functions.adoc
index 7f7dbf9..93439a3 100644
--- a/doc/modules/cassandra/pages/cql/functions.adoc
+++ b/doc/modules/cassandra/pages/cql/functions.adoc
@@ -18,7 +18,7 @@
 security concerns (even when enabled, the execution of user-defined
 functions is sandboxed and a "rogue" function should not be allowed to
 do evil, but no sandbox is perfect so using user-defined functions is
-opt-in). See the `enable_user_defined_functions` in `cassandra.yaml` to
+opt-in). See the `user_defined_functions_enabled` in `cassandra.yaml` to
 enable them.
 ====
 
diff --git a/doc/modules/cassandra/pages/cql/mvs.adoc b/doc/modules/cassandra/pages/cql/mvs.adoc
index 6da0fa4..89ba0ce 100644
--- a/doc/modules/cassandra/pages/cql/mvs.adoc
+++ b/doc/modules/cassandra/pages/cql/mvs.adoc
@@ -127,7 +127,7 @@
 
 The options that can be updated are the same than at creation time and
 thus the `same than for tables
-<create-table-options>`.
+<create-table-options>`. If the view does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 
 [[drop-materialized-view-statement]]
 == DROP MATERIALIZED VIEW
diff --git a/doc/modules/cassandra/pages/cql/security.adoc b/doc/modules/cassandra/pages/cql/security.adoc
index 7ea0620..904dea0 100644
--- a/doc/modules/cassandra/pages/cql/security.adoc
+++ b/doc/modules/cassandra/pages/cql/security.adoc
@@ -58,6 +58,8 @@
 If internal authentication has not been set up or the role does not have
 `LOGIN` privileges, the `WITH PASSWORD` clause is not necessary.
 
+USE `WITH HASHED PASSWORD` to provide the jBcrypt hashed password directly. See the `hash_password` tool.
+
 ==== Restricting connections to specific datacenters
 
 If a `network_authorizer` has been configured, you can restrict login
@@ -94,6 +96,9 @@
 ----
 include::example$CQL/alter_role.cql[]
 ----
+If the role does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
+
+USE `WITH HASHED PASSWORD` to provide the jBcrypt hashed password directly. See the `hash_password` tool.
 
 ==== Restricting connections to specific datacenters
 
@@ -277,7 +282,7 @@
 ----
 include::example$BNF/alter_user_statement.bnf[]
 ----
-
+If the role does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 For example:
 
 [source,cql]
diff --git a/doc/modules/cassandra/pages/cql/types.adoc b/doc/modules/cassandra/pages/cql/types.adoc
index 0cee1f3..17c78b5 100644
--- a/doc/modules/cassandra/pages/cql/types.adoc
+++ b/doc/modules/cassandra/pages/cql/types.adoc
@@ -457,13 +457,13 @@
 ----
 include::example$BNF/alter_udt_statement.bnf[]
 ----
-
+If the type does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 You can:
 
 * Add a new field to the type (`ALTER TYPE address ADD country text`).
 That new field will be `NULL` for any values of the type created before
-the addition.
-* Rename the fields of the type.
+the addition. If the new field exists, the statement will return an error, unless `IF NOT EXISTS` is used in which case the operation is a no-op.
+* Rename the fields of the type. If the field(s) does not exist, the statement will return an error, unless `IF EXISTS` is used in which case the operation is a no-op.
 
 [source,cql]
 ----
diff --git a/doc/modules/cassandra/pages/faq/index.adoc b/doc/modules/cassandra/pages/faq/index.adoc
index 03868b3..df74db9 100644
--- a/doc/modules/cassandra/pages/faq/index.adoc
+++ b/doc/modules/cassandra/pages/faq/index.adoc
@@ -89,10 +89,10 @@
 storing small blobs (less than single digit MB) should not be a problem,
 but it is advised to manually split large blobs into smaller chunks.
 
-Please note in particular that by default, any value greater than 16MB
-will be rejected by Cassandra due the `max_mutation_size_in_kb`
+Please note in particular that by default, any value greater than 16MiB
+will be rejected by Cassandra due the `max_mutation_size`
 configuration of the `cassandra-yaml` file (which default to half of
-`commitlog_segment_size_in_mb`, which itself default to 32MB).
+`commitlog_segment_size`, which itself default to 32MiB).
 
 [[nodetool-connection-refused]]
 == Nodetool says "Connection refused to host: 127.0.1.1" for any remote host. What gives?
diff --git a/doc/modules/cassandra/pages/new/java11.adoc b/doc/modules/cassandra/pages/getting_started/java11.adoc
similarity index 100%
rename from doc/modules/cassandra/pages/new/java11.adoc
rename to doc/modules/cassandra/pages/getting_started/java11.adoc
diff --git a/doc/modules/cassandra/pages/new/Figure_1.jpg b/doc/modules/cassandra/pages/new/Figure_1.jpg
deleted file mode 100644
index ccaec67..0000000
--- a/doc/modules/cassandra/pages/new/Figure_1.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/modules/cassandra/pages/new/Figure_2.jpg b/doc/modules/cassandra/pages/new/Figure_2.jpg
deleted file mode 100644
index 099e15f..0000000
--- a/doc/modules/cassandra/pages/new/Figure_2.jpg
+++ /dev/null
Binary files differ
diff --git a/doc/modules/cassandra/pages/new/index.adoc b/doc/modules/cassandra/pages/new/index.adoc
index 50fafa7..a6545a7 100644
--- a/doc/modules/cassandra/pages/new/index.adoc
+++ b/doc/modules/cassandra/pages/new/index.adoc
@@ -1,11 +1,20 @@
-= New Features in Apache Cassandra 4.0
+= New Features in Apache Cassandra 4.1
 
-This section covers the new features in Apache Cassandra 4.0.
+This section covers the new features in Apache Cassandra 4.1.
 
-* xref:new/java11.adoc[Java 11]
-* xref:new/virtualtables.adoc[Virtual tables]
-* xref:new/auditlogging.adoc[Audit logging]
-* xref:new/fqllogging.adoc[Full query logging]
-* xref:new/messaging.adoc[Messaging]
-* xref:new/streaming.adoc[Streaming]
-* xref:new/transientreplication.adoc[Transient replication]
+
+* https://issues.apache.org/jira/browse/CASSANDRA-17164[Paxos v2]
+* link:/_/blog/Apache-Cassandra-4.1-Features-Guardrails-Framework.html[Guardrails]
+* link:/_/blog/Apache-Cassandra-4.1-Configuration-Standardization.html[New and Improved Configuration Format]
+* link:/_/blog/Apache-Cassandra-4.1-Features-Client-side-Password-Hashing.html[Client-side Password Hashing]
+* link:/_/blog/Apache-Cassandra-4.1-Denylisting-Partitions.html[Partition Denylist]
+* Lots of CQL improvements
+* link:/_/blog/Apache-Cassandra-4.1-New-SSTable-Identifiers.html[New SSTable Identifiers]
+* https://issues.apache.org/jira/browse/CASSANDRA-17423[Native Transport rate limiting]
+* https://issues.apache.org/jira/browse/CASSANDRA-16310[Top partition tracking per table]
+* https://issues.apache.org/jira/browse/CASSANDRA-14309[Hint Window consistency]
+* https://issues.apache.org/jira/browse/CASSANDRA-17044[Pluggability]
+** link:/_/blog/Apache-Cassandra-4.1-Features-Pluggable-Memtable-Implementations.html[Memtable]
+** Encryption
+** link:/_/blog/Apache-Cassandra-4.1-Features-Authentication-Plugin-Support-for-CQLSH.html[CQLSH Authentication]
+* and much link:https://github.com/apache/cassandra/blob/cassandra-4.1/NEWS.txt[more]
diff --git a/doc/modules/cassandra/pages/new/messaging.adoc b/doc/modules/cassandra/pages/new/messaging.adoc
deleted file mode 100644
index 07a423b..0000000
--- a/doc/modules/cassandra/pages/new/messaging.adoc
+++ /dev/null
@@ -1,360 +0,0 @@
-= Improved Internode Messaging
-
-Apache Cassandra 4.0 has added several new improvements to internode
-messaging.
-
-== Optimized Internode Messaging Protocol
-
-The internode messaging protocol has been optimized
-(https://issues.apache.org/jira/browse/CASSANDRA-14485[CASSANDRA-14485]).
-Previously the `IPAddressAndPort` of the sender was included with each
-message that was sent even though the `IPAddressAndPort` had already
-been sent once when the initial connection/session was established. In
-Cassandra 4.0 `IPAddressAndPort` has been removed from every separate
-message sent and only sent when connection/session is initiated.
-
-Another improvement is that at several instances (listed) a fixed 4-byte
-integer value has been replaced with `vint` as a `vint` is almost always
-less than 1 byte:
-
-* The `paramSize` (the number of parameters in the header)
-* Each individual parameter value
-* The `payloadSize`
-
-== NIO Messaging
-
-In Cassandra 4.0 peer-to-peer (internode) messaging has been switched to
-non-blocking I/O (NIO) via Netty
-(https://issues.apache.org/jira/browse/CASSANDRA-8457[CASSANDRA-8457]).
-
-As serialization format, each message contains a header with several
-fixed fields, an optional key-value parameters section, and then the
-message payload itself. Note: the IP address in the header may be either
-IPv4 (4 bytes) or IPv6 (16 bytes).
-
-____
-The diagram below shows the IPv4 address for brevity.
-____
-
-....
-1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5 6 6
-0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2 4 6 8 0 2
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                       PROTOCOL MAGIC                          |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                         Message ID                            |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                         Timestamp                             |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|  Addr len |           IP Address (IPv4)                       /
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-/           |                 Verb                              /
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-/           |            Parameters size                        /
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-/           |             Parameter data                        /
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-/                                                               |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                        Payload size                           |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-|                                                               /
-/                           Payload                             /
-/                                                               |
-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-....
-
-An individual parameter has a String key and a byte array value. The key
-is serialized with its length, encoded as two bytes, followed by the
-UTF-8 byte encoding of the string. The body is serialized with its
-length, encoded as four bytes, followed by the bytes of the value.
-
-== Resource limits on Queued Messages
-
-System stability is improved by enforcing strict resource limits
-(https://issues.apache.org/jira/browse/CASSANDRA-15066[CASSANDRA-15066])
-on the number of outbound messages that are queued, measured by the
-`serializedSize` of the message. There are three separate limits imposed
-simultaneously to ensure that progress is always made without any
-reasonable combination of failures impacting a node’s stability.
-
-[arabic]
-. Global, per-endpoint and per-connection limits are imposed on messages
-queued for delivery to other nodes and waiting to be processed on
-arrival from other nodes in the cluster. These limits are applied to the
-on-wire size of the message being sent or received.
-. The basic per-link limit is consumed in isolation before any endpoint
-or global limit is imposed. Each node-pair has three links: urgent,
-small and large. So any given node may have a maximum of
-`N*3 * (internode_application_send_queue_capacity_in_bytes + internode_application_receive_queue_capacity_in_bytes)`
-messages queued without any coordination between them although in
-practice, with token-aware routing, only RF*tokens nodes should need to
-communicate with significant bandwidth.
-. The per-endpoint limit is imposed on all messages exceeding the
-per-link limit, simultaneously with the global limit, on all links to or
-from a single node in the cluster. The global limit is imposed on all
-messages exceeding the per-link limit, simultaneously with the
-per-endpoint limit, on all links to or from any node in the cluster. The
-following configuration settings have been added to `cassandra.yaml` for
-resource limits on queued messages.
-
-....
-internode_application_send_queue_capacity_in_bytes: 4194304 #4MiB
-internode_application_send_queue_reserve_endpoint_capacity_in_bytes: 134217728  #128MiB
-internode_application_send_queue_reserve_global_capacity_in_bytes: 536870912    #512MiB
-internode_application_receive_queue_capacity_in_bytes: 4194304                  #4MiB
-internode_application_receive_queue_reserve_endpoint_capacity_in_bytes: 134217728 #128MiB
-internode_application_receive_queue_reserve_global_capacity_in_bytes: 536870912   #512MiB
-....
-
-== Virtual Tables for Messaging Metrics
-
-Metrics is improved by keeping metrics using virtual tables for
-inter-node inbound and outbound messaging
-(https://issues.apache.org/jira/browse/CASSANDRA-15066[CASSANDRA-15066]).
-For inbound messaging a virtual table (`internode_inbound`) has been
-added to keep metrics for:
-
-* Bytes and count of messages that could not be serialized or flushed
-due to an error
-* Bytes and count of messages scheduled
-* Bytes and count of messages successfully processed
-* Bytes and count of messages successfully received
-* Nanos and count of messages throttled
-* Bytes and count of messages expired
-* Corrupt frames recovered and unrecovered
-
-A separate virtual table (`internode_outbound`) has been added for
-outbound inter-node messaging. The outbound virtual table keeps metrics
-for:
-
-* Bytes and count of messages pending
-* Bytes and count of messages sent
-* Bytes and count of messages expired
-* Bytes and count of messages that could not be sent due to an error
-* Bytes and count of messages overloaded
-* Active Connection Count
-* Connection Attempts
-* Successful Connection Attempts
-
-== Hint Messaging
-
-A specialized version of hint message that takes an already encoded in a
-`ByteBuffer` hint and sends it verbatim has been added. It is an
-optimization for when dispatching a hint file of the current messaging
-version to a node of the same messaging version, which is the most
-common case. It saves on extra `ByteBuffer` allocations one redundant
-hint deserialization-serialization cycle.
-
-== Internode Application Timeout
-
-A configuration setting has been added to `cassandra.yaml` for the
-maximum continuous period a connection may be unwritable in application
-space.
-
-....
-# internode_application_timeout_in_ms = 30000
-....
-
-Some other new features include logging of message size to trace message
-for tracing a query.
-
-== Paxos prepare and propose stage for local requests optimized
-
-In pre-4.0 Paxos prepare and propose messages always go through entire
-`MessagingService` stack in Cassandra even if request is to be served
-locally, we can enhance and make local requests severed w/o involving
-`MessagingService`. Similar things are done elsewhere in Cassandra which
-skips `MessagingService` stage for local requests.
-
-This is what it looks like in pre 4.0 if we have tracing on and run a
-light-weight transaction:
-
-....
-Sending PAXOS_PREPARE message to /A.B.C.D [MessagingService-Outgoing-/A.B.C.D] | 2017-09-11
-21:55:18.971000 | A.B.C.D | 15045
-… REQUEST_RESPONSE message received from /A.B.C.D [MessagingService-Incoming-/A.B.C.D] |
-2017-09-11 21:55:18.976000 | A.B.C.D | 20270
-… Processing response from /A.B.C.D [SharedPool-Worker-4] | 2017-09-11 21:55:18.976000 |
-A.B.C.D | 20372
-....
-
-Same thing applies for Propose stage as well.
-
-In version 4.0 Paxos prepare and propose stage for local requests are
-optimized
-(https://issues.apache.org/jira/browse/CASSANDRA-13862[CASSANDRA-13862]).
-
-== Quality Assurance
-
-Several other quality assurance improvements have been made in version
-4.0
-(https://issues.apache.org/jira/browse/CASSANDRA-15066[CASSANDRA-15066]).
-
-=== Framing
-
-Version 4.0 introduces framing to all internode messages, i.e. the
-grouping of messages into a single logical payload with headers and
-trailers; these frames are guaranteed to either contain at most one
-message, that is split into its own unique sequence of frames (for large
-messages), or that a frame contains only complete messages.
-
-=== Corruption prevention
-
-Previously, intra-datacenter internode messages would be unprotected
-from corruption by default, as only LZ4 provided any integrity checks.
-All messages to post 4.0 nodes are written to explicit frames, which may
-be:
-
-* LZ4 encoded
-* CRC protected
-
-The Unprotected option is still available.
-
-=== Resilience
-
-For resilience, all frames are written with a separate CRC protected
-header, of 8 and 6 bytes respectively. If corruption occurs in this
-header, the connection must be reset, as before. If corruption occurs
-anywhere outside of the header, the corrupt frame will be skipped,
-leaving the connection intact and avoiding the loss of any messages
-unnecessarily.
-
-Previously, any issue at any point in the stream would result in the
-connection being reset, with the loss of any in-flight messages.
-
-=== Efficiency
-
-The overall memory usage, and number of byte shuffles, on both inbound
-and outbound messages is reduced.
-
-Outbound the Netty LZ4 encoder maintains a chunk size buffer (64KiB),
-that is filled before any compressed frame can be produced. Our frame
-encoders avoid this redundant copy, as well as freeing 192KiB per
-endpoint.
-
-Inbound, frame decoders guarantee only to copy the number of bytes
-necessary to parse a frame, and to never store more bytes than
-necessary. This improvement applies twice to LZ4 connections, improving
-both the message decode and the LZ4 frame decode.
-
-=== Inbound Path
-
-Version 4.0 introduces several improvements to the inbound path.
-
-An appropriate message handler is used based on whether large or small
-messages are expected on a particular connection as set in a flag.
-`NonblockingBufferHandler`, running on event loop, is used for small
-messages, and `BlockingBufferHandler`, running off event loop, for large
-messages. The single implementation of `InboundMessageHandler` handles
-messages of any size effectively by deriving size of the incoming
-message from the byte stream. In addition to deriving size of the
-message from the stream, incoming message expiration time is proactively
-read, before attempting to deserialize the entire message. If it’s
-expired at the time when a message is encountered the message is just
-skipped in the byte stream altogether. And if a message fails to be
-deserialized while still on the receiving side - say, because of table
-id or column being unknown - bytes are skipped, without dropping the
-entire connection and losing all the buffered messages. An immediately
-reply back is sent to the coordinator node with the failure reason,
-rather than waiting for the coordinator callback to expire. This logic
-is extended to a corrupted frame; a corrupted frame is safely skipped
-over without dropping the connection.
-
-Inbound path imposes strict limits on memory utilization. Specifically,
-the memory occupied by all parsed, but unprocessed messages is bound -
-on per-connection, per-endpoint, and global basis. Once a connection
-exceeds its local unprocessed capacity and cannot borrow any permits
-from per-endpoint and global reserve, it simply stops processing further
-messages, providing natural backpressure - until sufficient capacity is
-regained.
-
-=== Outbound Connections
-
-==== Opening a connection
-
-A consistent approach is adopted for all kinds of failure to connect,
-including: refused by endpoint, incompatible versions, or unexpected
-exceptions;
-
-* Retry forever, until either success or no messages waiting to deliver.
-* Wait incrementally longer periods before reconnecting, up to a maximum
-of 1s.
-* While failing to connect, no reserve queue limits are acquired.
-
-==== Closing a connection
-
-* Correctly drains outbound messages that are waiting to be delivered
-(unless disconnected and fail to reconnect).
-* Messages written to a closing connection are either delivered or
-rejected, with a new connection being opened if the old is irrevocably
-closed.
-* Unused connections are pruned eventually.
-
-==== Reconnecting
-
-We sometimes need to reconnect a perfectly valid connection, e.g. if the
-preferred IP address changes. We ensure that the underlying connection
-has no in-progress operations before closing it and reconnecting.
-
-==== Message Failure
-
-Propagates to callbacks instantly, better preventing overload by
-reclaiming committed memory.
-
-===== Expiry
-
-* No longer experiences head-of-line blocking (e.g. undroppable message
-preventing all droppable messages from being expired).
-* While overloaded, expiry is attempted eagerly on enqueuing threads.
-* While disconnected we schedule regular pruning, to handle the case
-where messages are no longer being sent, but we have a large backlog to
-expire.
-
-===== Overload
-
-* Tracked by bytes queued, as opposed to number of messages.
-
-===== Serialization Errors
-
-* Do not result in the connection being invalidated; the message is
-simply completed with failure, and then erased from the frame.
-* Includes detected mismatch between calculated serialization size to
-actual.
-
-Failures to flush to network, perhaps because the connection has been
-reset are not currently notified to callback handlers, as the necessary
-information has been discarded, though it would be possible to do so in
-future if we decide it is worth our while.
-
-==== QoS
-
-"Gossip" connection has been replaced with a general purpose "Urgent"
-connection, for any small messages impacting system stability.
-
-==== Metrics
-
-We track, and expose via Virtual Table and JMX, the number of messages
-and bytes that: we could not serialize or flush due to an error, we
-dropped due to overload or timeout, are pending, and have successfully
-sent.
-
-== Added a Message size limit
-
-Cassandra pre-4.0 doesn't protect the server from allocating huge
-buffers for the inter-node Message objects. Adding a message size limit
-would be good to deal with issues such as a malfunctioning cluster
-participant. Version 4.0 introduced max message size config param, akin
-to max mutation size - set to endpoint reserve capacity by default.
-
-== Recover from unknown table when deserializing internode messages
-
-As discussed in
-(https://issues.apache.org/jira/browse/CASSANDRA-9289[CASSANDRA-9289])
-it would be nice to gracefully recover from seeing an unknown table in a
-message from another node. Pre-4.0, we close the connection and
-reconnect, which can cause other concurrent queries to fail. Version 4.0
-fixes the issue by wrapping message in-stream with
-`TrackedDataInputPlus`, catching `UnknownCFException`, and skipping the
-remaining bytes in this message. TCP won't be closed and it will remain
-connected for other messages.
diff --git a/doc/modules/cassandra/pages/new/streaming.adoc b/doc/modules/cassandra/pages/new/streaming.adoc
deleted file mode 100644
index 991bec7..0000000
--- a/doc/modules/cassandra/pages/new/streaming.adoc
+++ /dev/null
@@ -1,217 +0,0 @@
-= Improved Streaming
-
-Apache Cassandra 4.0 has made several improvements to streaming.
-Streaming is the process used by nodes of a cluster to exchange data in
-the form of SSTables. Streaming of SSTables is performed for several
-operations, such as:
-
-* SSTable Repair
-* Host Replacement
-* Range movements
-* Bootstrapping
-* Rebuild
-* Cluster expansion
-
-== Streaming based on Netty
-
-Streaming in Cassandra 4.0 is based on Non-blocking Input/Output (NIO)
-with Netty
-(https://issues.apache.org/jira/browse/CASSANDRA-12229[CASSANDRA-12229]).
-It replaces the single-threaded (or sequential), synchronous, blocking
-model of streaming messages and transfer of files. Netty supports
-non-blocking, asynchronous, multi-threaded streaming with which multiple
-connections are opened simultaneously. Non-blocking implies that threads
-are not blocked as they don’t wait for a response for a sent request. A
-response could be returned in a different thread. With asynchronous,
-connections and threads are decoupled and do not have a 1:1 relation.
-Several more connections than threads may be opened.
-
-== Zero Copy Streaming
-
-Pre-4.0, during streaming Cassandra reifies the SSTables into objects.
-This creates unnecessary garbage and slows down the whole streaming
-process as some SSTables can be transferred as a whole file rather than
-individual partitions. Cassandra 4.0 has added support for streaming
-entire SSTables when possible
-(https://issues.apache.org/jira/browse/CASSANDRA-14556[CASSANDRA-14556])
-for faster Streaming using ZeroCopy APIs. If enabled, Cassandra will use
-ZeroCopy for eligible SSTables significantly speeding up transfers and
-increasing throughput. A zero-copy path avoids bringing data into
-user-space on both sending and receiving side. Any streaming related
-operations will notice corresponding improvement. Zero copy streaming is
-hardware bound; only limited by the hardware limitations (Network and
-Disk IO ).
-
-=== High Availability
-
-In benchmark tests Zero Copy Streaming is 5x faster than partitions
-based streaming. Faster streaming provides the benefit of improved
-availability. A cluster’s recovery mainly depends on the streaming
-speed, Cassandra clusters with failed nodes will be able to recover much
-more quickly (5x faster). If a node fails, SSTables need to be streamed
-to a replacement node. During the replacement operation, the new
-Cassandra node streams SSTables from the neighboring nodes that hold
-copies of the data belonging to this new node’s token range. Depending
-on the amount of data stored, this process can require substantial
-network bandwidth, taking some time to complete. The longer these range
-movement operations take, the more the cluster availability is lost.
-Failure of multiple nodes would reduce high availability greatly. The
-faster the new node completes streaming its data, the faster it can
-serve traffic, increasing the availability of the cluster.
-
-=== Enabling Zero Copy Streaming
-
-Zero copy streaming is enabled by setting the following setting in
-`cassandra.yaml`.
-
-....
-stream_entire_sstables: true
-....
-
-By default zero copy streaming is enabled.
-
-=== SSTables Eligible for Zero Copy Streaming
-
-Zero copy streaming is used if all partitions within the SSTable need to
-be transmitted. This is common when using `LeveledCompactionStrategy` or
-when partitioning SSTables by token range has been enabled. All
-partition keys in the SSTables are iterated over to determine the
-eligibility for Zero Copy streaming.
-
-=== Benefits of Zero Copy Streaming
-
-When enabled, it permits Cassandra to zero-copy stream entire eligible
-SSTables between nodes, including every component. This speeds up the
-network transfer significantly subject to throttling specified by
-`stream_throughput_outbound_megabits_per_sec`.
-
-Enabling this will reduce the GC pressure on sending and receiving node.
-While this feature tries to keep the disks balanced, it cannot guarantee
-it. This feature will be automatically disabled if internode encryption
-is enabled. Currently this can be used with Leveled Compaction.
-
-=== Configuring for Zero Copy Streaming
-
-Throttling would reduce the streaming speed. The
-`stream_throughput_outbound_megabits_per_sec` throttles all outbound
-streaming file transfers on a node to the given total throughput in
-Mbps. When unset, the default is 200 Mbps or 25 MB/s.
-
-....
-stream_throughput_outbound_megabits_per_sec: 200
-....
-
-To run any Zero Copy streaming benchmark the
-`stream_throughput_outbound_megabits_per_sec` must be set to a really
-high value otherwise, throttling will be significant and the benchmark
-results will not be meaningful.
-
-The `inter_dc_stream_throughput_outbound_megabits_per_sec` throttles all
-streaming file transfer between the datacenters, this setting allows
-users to throttle inter dc stream throughput in addition to throttling
-all network stream traffic as configured with
-`stream_throughput_outbound_megabits_per_sec`. When unset, the default
-is 200 Mbps or 25 MB/s.
-
-....
-inter_dc_stream_throughput_outbound_megabits_per_sec: 200
-....
-
-=== SSTable Components Streamed with Zero Copy Streaming
-
-Zero Copy Streaming streams entire SSTables. SSTables are made up of
-multiple components in separate files. SSTable components streamed are
-listed in Table 1.
-
-Table 1. SSTable Components
-
-[width="98%",cols="27%,73%",]
-|===
-|SSTable Component |Description
-
-|Data.db |The base data for an SSTable: the remaining components can be
-regenerated based on the data component.
-
-|Index.db |Index of the row keys with pointers to their positions in the
-data file.
-
-|Filter.db |Serialized bloom filter for the row keys in the SSTable.
-
-|CompressionInfo.db |File to hold information about uncompressed data
-length, chunk offsets etc.
-
-|Statistics.db |Statistical metadata about the content of the SSTable.
-
-|Digest.crc32 |Holds CRC32 checksum of the data file size_bytes.
-
-|CRC.db |Holds the CRC32 for chunks in an uncompressed file.
-
-|Summary.db |Holds SSTable Index Summary (sampling of Index component)
-
-|TOC.txt |Table of contents, stores the list of all components for the
-SSTable.
-|===
-
-Custom component, used by e.g. custom compaction strategy may also be
-included.
-
-== Repair Streaming Preview
-
-Repair with `nodetool repair` involves streaming of repaired SSTables
-and a repair preview has been added to provide an estimate of the amount
-of repair streaming that would need to be performed. Repair preview
-(https://issues.apache.org/jira/browse/CASSANDRA-13257[CASSANDRA-13257])
-is invoke with `nodetool repair --preview` using option:
-
-....
--prv, --preview
-....
-
-It determines ranges and amount of data to be streamed, but doesn't
-actually perform repair.
-
-== Parallelizing of Streaming of Keyspaces
-
-The streaming of the different keyspaces for bootstrap and rebuild has
-been parallelized in Cassandra 4.0
-(https://issues.apache.org/jira/browse/CASSANDRA-4663[CASSANDRA-4663]).
-
-== Unique nodes for Streaming in Multi-DC deployment
-
-Range Streamer picks unique nodes to stream data from when number of
-replicas in each DC is three or more
-(https://issues.apache.org/jira/browse/CASSANDRA-4650[CASSANDRA-4650]).
-What the optimization does is to even out the streaming load across the
-cluster. Without the optimization, some node can be picked up to stream
-more data than others. This patch allows to select dedicated node to
-stream only one range.
-
-This will increase the performance of bootstrapping a node and will also
-put less pressure on nodes serving the data. This does not affect if N <
-3 in each DC as then it streams data from only 2 nodes.
-
-Stream Operation Types ^^^^^^^^^^^^^
-
-It is important to know the type or purpose of a certain stream. Version
-4.0
-(https://issues.apache.org/jira/browse/CASSANDRA-13064[CASSANDRA-13064])
-adds an `enum` to distinguish between the different types of streams.
-Stream types are available both in a stream request and a stream task.
-The different stream types are:
-
-* Restore replica count
-* Unbootstrap
-* Relocation
-* Bootstrap
-* Rebuild
-* Bulk Load
-* Repair
-
-== Disallow Decommission when number of Replicas will drop below configured RF
-
-https://issues.apache.org/jira/browse/CASSANDRA-12510[CASSANDRA-12510]
-guards against decommission that will drop # of replicas below
-configured replication factor (RF), and adds the `--force` option that
-allows decommission to continue if intentional; force decommission of
-this node even when it reduces the number of replicas to below
-configured RF.
diff --git a/doc/modules/cassandra/pages/new/transientreplication.adoc b/doc/modules/cassandra/pages/new/transientreplication.adoc
deleted file mode 100644
index c939497..0000000
--- a/doc/modules/cassandra/pages/new/transientreplication.adoc
+++ /dev/null
@@ -1,186 +0,0 @@
-= Transient Replication
-
-*Note*:
-
-Transient Replication
-(https://issues.apache.org/jira/browse/CASSANDRA-14404[CASSANDRA-14404])
-is an experimental feature designed for expert Apache Cassandra users
-who are able to validate every aspect of the database for their
-application and deployment. That means being able to check that
-operations like reads, writes, decommission, remove, rebuild, repair,
-and replace all work with your queries, data, configuration, operational
-practices, and availability requirements. Apache Cassandra 4.0 has the
-initial implementation of transient replication. Future releases of
-Cassandra will make this feature suitable for a wider audience. It is
-anticipated that a future version will support monotonic reads with
-transient replication as well as LWT, logged batches, and counters.
-Being experimental, Transient replication is *not* recommended for
-production use.
-
-== Objective
-
-The objective of transient replication is to decouple storage
-requirements from data redundancy (or consensus group size) using
-incremental repair, in order to reduce storage overhead. Certain nodes
-act as full replicas (storing all the data for a given token range), and
-some nodes act as transient replicas, storing only unrepaired data for
-the same token ranges.
-
-The optimization that is made possible with transient replication is
-called "Cheap quorums", which implies that data redundancy is increased
-without corresponding increase in storage usage.
-
-Transient replication is useful when sufficient full replicas are
-unavailable to receive and store all the data. Transient replication
-allows you to configure a subset of replicas to only replicate data that
-hasn't been incrementally repaired. As an optimization, we can avoid
-writing data to a transient replica if we have successfully written data
-to the full replicas.
-
-After incremental repair, transient data stored on transient replicas
-can be discarded.
-
-== Enabling Transient Replication
-
-Transient replication is not enabled by default. Transient replication
-must be enabled on each node in a cluster separately by setting the
-following configuration property in `cassandra.yaml`.
-
-....
-enable_transient_replication: true
-....
-
-Transient replication may be configured with both `SimpleStrategy` and
-`NetworkTopologyStrategy`. Transient replication is configured by
-setting replication factor as `<total_replicas>/<transient_replicas>`.
-
-As an example, create a keyspace with replication factor (RF) 3.
-
-....
-CREATE KEYSPACE CassandraKeyspaceSimple WITH replication = {'class': 'SimpleStrategy',
-'replication_factor' : 4/1};
-....
-
-As another example, `some_keysopace keyspace` will have 3 replicas in
-DC1, 1 of which is transient, and 5 replicas in DC2, 2 of which are
-transient:
-
-....
-CREATE KEYSPACE some_keysopace WITH replication = {'class': 'NetworkTopologyStrategy',
-'DC1' : '3/1'', 'DC2' : '5/2'};
-....
-
-Transiently replicated keyspaces only support tables with `read_repair`
-set to `NONE`.
-
-Important Restrictions:
-
-* RF cannot be altered while some endpoints are not in a normal state
-(no range movements).
-* You can't add full replicas if there are any transient replicas. You
-must first remove all transient replicas, then change the # of full
-replicas, then add back the transient replicas.
-* You can only safely increase number of transients one at a time with
-incremental repair run in between each time.
-
-Additionally, transient replication cannot be used for:
-
-* Monotonic Reads
-* Lightweight Transactions (LWTs)
-* Logged Batches
-* Counters
-* Keyspaces using materialized views
-* Secondary indexes (2i)
-
-== Cheap Quorums
-
-Cheap quorums are a set of optimizations on the write path to avoid
-writing to transient replicas unless sufficient full replicas are not
-available to satisfy the requested consistency level. Hints are never
-written for transient replicas. Optimizations on the read path prefer
-reading from transient replicas. When writing at quorum to a table
-configured to use transient replication the quorum will always prefer
-available full replicas over transient replicas so that transient
-replicas don't have to process writes. Tail latency is reduced by rapid
-write protection (similar to rapid read protection) when full replicas
-are slow or unavailable by sending writes to transient replicas.
-Transient replicas can serve reads faster as they don't have to do
-anything beyond bloom filter checks if they have no data. With vnodes
-and large cluster sizes they will not have a large quantity of data even
-for failure of one or more full replicas where transient replicas start
-to serve a steady amount of write traffic for some of their transiently
-replicated ranges.
-
-== Speculative Write Option
-
-The `CREATE TABLE` adds an option `speculative_write_threshold` for use
-with transient replicas. The option is of type `simple` with default
-value as `99PERCENTILE`. When replicas are slow or unresponsive
-`speculative_write_threshold` specifies the threshold at which a cheap
-quorum write will be upgraded to include transient replicas.
-
-== Pending Ranges and Transient Replicas
-
-Pending ranges refers to the movement of token ranges between transient
-replicas. When a transient range is moved, there will be a period of
-time where both transient replicas would need to receive any write
-intended for the logical transient replica so that after the movement
-takes effect a read quorum is able to return a response. Nodes are _not_
-temporarily transient replicas during expansion. They stream data like a
-full replica for the transient range before they can serve reads. A
-pending state is incurred similar to how there is a pending state for
-full replicas. Transient replicas also always receive writes when they
-are pending. Pending transient ranges are sent a bit more data and
-reading from them is avoided.
-
-== Read Repair and Transient Replicas
-
-Read repair never attempts to repair a transient replica. Reads will
-always include at least one full replica. They should also prefer
-transient replicas where possible. Range scans ensure the entire scanned
-range performs replica selection that satisfies the requirement that
-every range scanned includes one full replica. During incremental &
-validation repair handling, at transient replicas anti-compaction does
-not output any data for transient ranges as the data will be dropped
-after repair, and transient replicas never have data streamed to them.
-
-== Transitioning between Full Replicas and Transient Replicas
-
-The additional state transitions that transient replication introduces
-requires streaming and `nodetool cleanup` to behave differently. When
-data is streamed it is ensured that it is streamed from a full replica
-and not a transient replica.
-
-Transitioning from not replicated to transiently replicated means that a
-node must stay pending until the next incremental repair completes at
-which point the data for that range is known to be available at full
-replicas.
-
-Transitioning from transiently replicated to fully replicated requires
-streaming from a full replica and is identical to how data is streamed
-when transitioning from not replicated to replicated. The transition is
-managed so the transient replica is not read from as a full replica
-until streaming completes. It can be used immediately for a write
-quorum.
-
-Transitioning from fully replicated to transiently replicated requires
-cleanup to remove repaired data from the transiently replicated range to
-reclaim space. It can be used immediately for a write quorum.
-
-Transitioning from transiently replicated to not replicated requires
-cleanup to be run to remove the formerly transiently replicated data.
-
-When transient replication is in use ring changes are supported
-including add/remove node, change RF, add/remove DC.
-
-== Transient Replication supports EACH_QUORUM
-
-(https://issues.apache.org/jira/browse/CASSANDRA-14727[CASSANDRA-14727])
-adds support for Transient Replication support for `EACH_QUORUM`. Per
-(https://issues.apache.org/jira/browse/CASSANDRA-14768[CASSANDRA-14768]),
-we ensure we write to at least a `QUORUM` of nodes in every DC,
-regardless of how many responses we need to wait for and our requested
-consistency level. This is to minimally surprise users with transient
-replication; with normal writes, we soft-ensure that we reach `QUORUM`
-in all DCs we are able to, by writing to every node; even if we don't
-wait for ACK, we have in both cases sent sufficient messages.
diff --git a/doc/modules/cassandra/pages/new/virtualtables.adoc b/doc/modules/cassandra/pages/new/virtualtables.adoc
index b18ba31..7a7a4be 100644
--- a/doc/modules/cassandra/pages/new/virtualtables.adoc
+++ b/doc/modules/cassandra/pages/new/virtualtables.adoc
@@ -74,8 +74,12 @@
 
 |coordinator_write_latency |Records counts, keyspace_name, table_name, max, median, and per_second for coordinator writes.
 
+|cql_metrics |Metrics specific to CQL prepared statement caching.
+
 |disk_usage |Records disk usage including disk_space, keyspace_name, and table_name, sorted by system keyspaces.
 
+|gossip_info |Lists the gossip information for the cluster.
+
 |internode_inbound |Lists information about the inbound internode messaging.
 
 |internode_outbound |Information about the outbound internode messaging.
@@ -99,6 +103,7 @@
 |thread_pools |Lists metrics for each thread pool.
 
 |tombstones_per_read |Records counts, keyspace_name, tablek_name, max, and median for tombstones.
+
 |===
 
 We shall discuss some of the virtual tables in more detail next.
@@ -106,18 +111,80 @@
 === Clients Virtual Table
 
 The `clients` virtual table lists all active connections (connected
-clients) including their ip address, port, connection stage, driver
+clients) including their ip address, port, client_options, connection stage, driver
 name, driver version, hostname, protocol version, request count, ssl
 enabled, ssl protocol and user name:
 
 ....
-cqlsh:system_views> select * from system_views.clients;
- address   | port  | connection_stage | driver_name | driver_version | hostname  | protocol_version | request_count | ssl_cipher_suite | ssl_enabled | ssl_protocol | username
------------+-------+------------------+-------------+----------------+-----------+------------------+---------------+------------------+-------------+--------------+-----------
- 127.0.0.1 | 50628 |            ready |        null |           null | localhost |                4 |            55 |             null |       False |         null | anonymous
- 127.0.0.1 | 50630 |            ready |        null |           null | localhost |                4 |            70 |             null |       False |         null | anonymous
+cqlsh> EXPAND ON ;
+Now Expanded output is enabled
+cqlsh> SELECT * FROM system_views.clients;
 
-(2 rows)
+@ Row 1
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50687
+ client_options   | {'CQL_VERSION': '3.4.6', 'DRIVER_NAME': 'DataStax Python Driver', 'DRIVER_VERSION': '3.25.0'}
+ connection_stage | ready
+ driver_name      | DataStax Python Driver
+ driver_version   | 3.25.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 16
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+@ Row 2
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50688
+ client_options   | {'CQL_VERSION': '3.4.6', 'DRIVER_NAME': 'DataStax Python Driver', 'DRIVER_VERSION': '3.25.0'}
+ connection_stage | ready
+ driver_name      | DataStax Python Driver
+ driver_version   | 3.25.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 4
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+@ Row 3
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50753
+ client_options   | {'APPLICATION_NAME': 'TestApp', 'APPLICATION_VERSION': '1.0.0', 'CLIENT_ID': '55b3efbd-c56b-469d-8cca-016b860b2f03', 'CQL_VERSION': '3.0.0', 'DRIVER_NAME': 'DataStax Java driver for Apache Cassandra(R)', 'DRIVER_VERSION': '4.13.0'}
+ connection_stage | ready
+ driver_name      | DataStax Java driver for Apache Cassandra(R)
+ driver_version   | 4.13.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 18
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+@ Row 4
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50755
+ client_options   | {'APPLICATION_NAME': 'TestApp', 'APPLICATION_VERSION': '1.0.0', 'CLIENT_ID': '55b3efbd-c56b-469d-8cca-016b860b2f03', 'CQL_VERSION': '3.0.0', 'DRIVER_NAME': 'DataStax Java driver for Apache Cassandra(R)', 'DRIVER_VERSION': '4.13.0'}
+ connection_stage | ready
+ driver_name      | DataStax Java driver for Apache Cassandra(R)
+ driver_version   | 4.13.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 7
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+(4 rows)
 ....
 
 Some examples of how `clients` can be used are:
@@ -127,29 +194,36 @@
 `nodetool disableoldprotocolversions` during upgrades.
 * To identify clients sending too many requests.
 * To find if SSL is enabled during the migration to and from ssl.
+* To identify all options the client is sending, e.g. APPLICATION_NAME and APPLICATION_VERSION
 
 The virtual tables may be described with `DESCRIBE` statement. The DDL
 listed however cannot be run to create a virtual table. As an example
 describe the `system_views.clients` virtual table:
 
 ....
-cqlsh:system_views> DESC TABLE system_views.clients;
-CREATE TABLE system_views.clients (
-  address inet,
-  connection_stage text,
-  driver_name text,
-  driver_version text,
-  hostname text,
-  port int,
-  protocol_version int,
-  request_count bigint,
-  ssl_cipher_suite text,
-  ssl_enabled boolean,
-  ssl_protocol text,
-  username text,
-  PRIMARY KEY (address, port)) WITH CLUSTERING ORDER BY (port ASC)
-  AND compaction = {'class': 'None'}
-  AND compression = {};
+cqlsh> DESCRIBE TABLE system_views.clients;
+
+/*
+Warning: Table system_views.clients is a virtual table and cannot be recreated with CQL.
+Structure, for reference:
+VIRTUAL TABLE system_views.clients (
+    address inet,
+    port int,
+    client_options frozen<map<text, text>>,
+    connection_stage text,
+    driver_name text,
+    driver_version text,
+    hostname text,
+    protocol_version int,
+    request_count bigint,
+    ssl_cipher_suite text,
+    ssl_enabled boolean,
+    ssl_protocol text,
+    username text,
+    PRIMARY KEY (address, port)
+) WITH CLUSTERING ORDER BY (port ASC)
+    AND comment = 'currently connected clients';
+*/
 ....
 
 === Caches Virtual Table
@@ -170,6 +244,21 @@
 (4 rows)
 ....
 
+=== CQL metrics Virtual Table
+The `cql_metrics` virtual table lists metrics specific to CQL prepared statement caching. A query on `cql_metrics` virtual table lists below metrics.
+
+....
+cqlsh> select * from system_views.cql_metrics ;
+
+ name                         | value
+------------------------------+-------
+    prepared_statements_count |     0
+  prepared_statements_evicted |     0
+ prepared_statements_executed |     0
+    prepared_statements_ratio |     0
+  regular_statements_executed |    17
+....
+
 === Settings Virtual Table
 
 The `settings` table is rather useful and lists all the current
@@ -188,7 +277,7 @@
   auto_snapshot                      | true
   automatic_sstable_upgrade          | false
   cluster_name                       | Test Cluster
-  enable_transient_replication       | false
+  transient_replication_enabled      | false
   hinted_handoff_enabled             | true
   hints_directory                    | /home/ec2-user/cassandra/data/hints
   incremental_backups                | false
@@ -290,6 +379,24 @@
 FROM system_views.sstable_tasks;
 ....
 
+=== Gossip Information Virtual Table
+
+The `gossip_info` virtual table lists the Gossip information for the cluster. An example query is as follows:
+
+....
+cqlsh> select address, port, generation, heartbeat, load, dc, rack from system_views.gossip_info;
+
+ address   | port | generation | heartbeat | load    | dc          | rack
+-----------+------+------------+-----------+---------+-------------+-------
+ 127.0.0.1 | 7000 | 1645575140 |       312 | 70542.0 | datacenter1 | rack1
+ 127.0.0.2 | 7000 | 1645575135 |       318 | 70499.0 | datacenter1 | rack1
+ 127.0.0.3 | 7000 | 1645575140 |       312 | 70504.0 | datacenter1 | rack1
+ 127.0.0.4 | 7000 | 1645575141 |       311 | 70502.0 | datacenter1 | rack1
+ 127.0.0.5 | 7000 | 1645575136 |       315 | 70500.0 | datacenter1 | rack1
+
+(5 rows)
+....
+
 === Other Virtual Tables
 
 Some examples of using other virtual tables are as follows.
diff --git a/doc/modules/cassandra/pages/new/auditlogging.adoc b/doc/modules/cassandra/pages/operating/auditlogging.adoc
similarity index 100%
rename from doc/modules/cassandra/pages/new/auditlogging.adoc
rename to doc/modules/cassandra/pages/operating/auditlogging.adoc
diff --git a/doc/modules/cassandra/pages/operating/bulk_loading.adoc b/doc/modules/cassandra/pages/operating/bulk_loading.adoc
index 2b11f27..0d85ae4 100644
--- a/doc/modules/cassandra/pages/operating/bulk_loading.adoc
+++ b/doc/modules/cassandra/pages/operating/bulk_loading.adoc
@@ -80,13 +80,23 @@
 -d,--nodes <initial hosts>                                   Required.
                                                              Try to connect to these hosts (comma separated) initially for ring information
 
+--entire-sstable-throttle-mib <throttle-mib>                 Entire SSTable throttle
+                                                             speed in MiB/s (default 0 for unlimited).
+
+--entire-sstable-inter-dc-throttle-mib                       <inter-dc-throttle-mib>
+                                                             Entire SSTable inter-datacenter throttle
+                                                             speed in MiB/s (default 0 for unlimited).
+
 -f,--conf-path <path to config file>                         cassandra.yaml file path for streaming throughput and client/server SSL.
 
 -h,--help                                                    Display this help message
 
 -i,--ignore <NODES>                                          Don't stream to this (comma separated) list of nodes
 
--idct,--inter-dc-throttle <inter-dc-throttle>                Inter-datacenter throttle speed in Mbits (default unlimited)
+-idct,--inter-dc-throttle <inter-dc-throttle>                (deprecated) Inter-datacenter throttle speed in Mbits (default 0 for unlimited).
+                                                             Use --inter-dc-throttle-mib instead.
+
+--inter-dc-throttle-mib <inter-dc-throttle-mib>              Inter-datacenter throttle speed in MiB/s (default 0 for unlimited)
 
 -k,--target-keyspace <target keyspace name>                  Target
                                                              keyspace name
@@ -111,8 +121,10 @@
                                                              for TLS internode communication (default 7001)
 -st,--store-type <STORE-TYPE>                                Client SSL:
                                                              type of store
--t,--throttle <throttle>                                     Throttle
-                                                             speed in Mbits (default unlimited)
+-t,--throttle <throttle>                                     (deprecated) Throttle speed in Mbits (default 0 for unlimited).
+                                                             Use --throttle-mib instead.
+--throttle-mib <throttle-mib>                                Throttle
+                                                             speed in MiB/s (default 0 for unlimited)
 -ts,--truststore <TRUSTSTORE>                                Client SSL:
                                                              full path to truststore
 -tspw,--truststore-password <TRUSTSTORE-PASSWORD>            Client SSL:
@@ -821,13 +833,17 @@
 variables will be bound to values by the resulting SSTable writer. This
 is a mandatory option.
 
-|withBufferSizeInMB(int size) |The size of the buffer to use. This
+|withBufferSizeInMiB(int size) |The size of the buffer to use. This
 defines how much data will be buffered before being written as a new
 SSTable. This corresponds roughly to the data size that will have the
 created SSTable. The default is 128MB, which should be reasonable for a
 1GB heap. If OutOfMemory exception gets generated while using the
 SSTable writer, should lower this value.
 
+|withBufferSizeInMB(int size) |Deprecated, and it will be available
+at least until next major release. Please use withBufferSizeInMiB(int size)
+which is the same method with a new name.
+
 |sorted() |Creates a CQLSSTableWriter that expects sorted inputs. If
 this option is used, the resulting SSTable writer will expect rows to be
 added in SSTable sorted order (and an exception will be thrown if that
diff --git a/doc/modules/cassandra/pages/operating/cdc.adoc b/doc/modules/cassandra/pages/operating/cdc.adoc
index b0d5c19..e12decd 100644
--- a/doc/modules/cassandra/pages/operating/cdc.adoc
+++ b/doc/modules/cassandra/pages/operating/cdc.adoc
@@ -16,12 +16,17 @@
 human-readable word "COMPLETED" will be added to the _cdc.idx file
 indicating that Cassandra has completed all processing on the file.
 
-We we use an index file rather than just encouraging clients to parse
+We use an index file rather than just encouraging clients to parse
 the log realtime off a memory mapped handle as data can be reflected in
 a kernel buffer that is not yet persisted to disk. Parsing only up to
 the listed offset in the _cdc.idx file will ensure that you only parse
 CDC data for data that is durable.
 
+Please note that in rare chances, e.g. slow disk, it is possible for the
+consumer to read an empty value from the _cdc.idx file because update is
+achieved with first truncating the file then write to the file. In such
+case, the consumer should retry read the index file.
+
 A threshold of total disk space allowed is specified in the yaml at
 which time newly allocated CommitLogSegments will not allow CDC data
 until a consumer parses and removes files from the specified cdc_raw
@@ -52,10 +57,10 @@
 `cdc_raw_directory` (default: `$CASSANDRA_HOME/data/cdc_raw`)::
   Destination for CommitLogSegments to be moved after all corresponding
   memtables are flushed.
-`cdc_free_space_in_mb`: (default: min of 4096 and 1/8th volume space)::
+`cdc_total_space`: (default: min of 4096MiB and 1/8th volume space)::
   Calculated as sum of all active CommitLogSegments that permit CDC +
   all flushed CDC segments in `cdc_raw_directory`.
-`cdc_free_space_check_interval_ms` (default: 250)::
+`cdc_free_space_check_interval` (default: 250ms)::
   When at capacity, we limit the frequency with which we re-calculate
   the space taken up by `cdc_raw_directory` to prevent burning CPU
   cycles unnecessarily. Default is to check 4 times per second.
diff --git a/doc/modules/cassandra/pages/new/fqllogging.adoc b/doc/modules/cassandra/pages/operating/fqllogging.adoc
similarity index 100%
rename from doc/modules/cassandra/pages/new/fqllogging.adoc
rename to doc/modules/cassandra/pages/operating/fqllogging.adoc
diff --git a/doc/modules/cassandra/pages/operating/hints.adoc b/doc/modules/cassandra/pages/operating/hints.adoc
index 567e0cd..4de2cb7 100644
--- a/doc/modules/cassandra/pages/operating/hints.adoc
+++ b/doc/modules/cassandra/pages/operating/hints.adoc
@@ -39,7 +39,7 @@
 to the client. If a replica node is unavailable, however, the
 coordinator stores a hint locally to the filesystem for later
 application. New hints will be retained for up to
-`max_hint_window_in_ms` of downtime (defaults to `3 hours`). If the
+`max_hint_windowin_ms` of downtime (defaults to `3 h`). If the
 unavailable replica does return to the cluster before the window
 expires, the coordinator applies any pending hinted mutations against
 the replica to ensure that eventual consistency is maintained.
@@ -87,18 +87,18 @@
 === Hints for Timed Out Write Requests
 
 Hints are also stored for write requests that time out. The
-`write_request_timeout_in_ms` setting in `cassandra.yaml` configures the
+`write_request_timeout` setting in `cassandra.yaml` configures the
 timeout for write requests.
 
 [source,none]
 ----
-write_request_timeout_in_ms: 2000
+write_request_timeout: 2000ms
 ----
 
 The coordinator waits for the configured amount of time for write
 requests to complete, at which point it will time out and generate a
 hint for the timed out request. The lowest acceptable value for
-`write_request_timeout_in_ms` is 10 ms.
+`write_request_timeout` is 10 ms.
 
 == Configuring Hints
 
@@ -127,15 +127,15 @@
 
 |`unset`
 
-|`max_hint_window_in_ms` |Defines the maximum amount of time (ms) a node
-shall have hints generated after it has failed. |`10800000` # 3 hours
+|`max_hint_window` |Defines the maximum amount of time a node
+shall have hints generated after it has failed. |`3h` 
 
-|`hinted_handoff_throttle_in_kb` |Maximum throttle in KBs per second,
+|`hinted_handoff_throttle` |Maximum throttle in KiBs per second,
 per delivery thread. This will be reduced proportionally to the number
 of nodes in the cluster. (If there are two nodes in the cluster, each
 delivery thread will use the maximum rate; if there are 3, each will
 throttle to half of the maximum,since it is expected for two nodes to be
-delivering hints simultaneously.) |`1024`
+delivering hints simultaneously.) |`1024KiB`
 
 |`max_hints_delivery_threads` |Number of threads with which to deliver
 hints; Consider increasing this number when you have multi-dc
@@ -144,11 +144,11 @@
 |`hints_directory` |Directory where Cassandra stores hints.
 |`$CASSANDRA_HOME/data/hints`
 
-|`hints_flush_period_in_ms` |How often hints should be flushed from the
-internal buffers to disk. Will _not_ trigger fsync. |`10000`
+|`hints_flush_period` |How often hints should be flushed from the
+internal buffers to disk. Will _not_ trigger fsync. |`10000ms`
 
-|`max_hints_file_size_in_mb` |Maximum size for a single hints file, in
-megabytes. |`128`
+|`max_hints_file_size |Maximum size for a single hints file, in
+megabytes. |`128MiB`
 
 |`hints_compression` |Compression to apply to the hint files. If
 omitted, hints files will be written uncompressed. LZ4, Snappy, and
@@ -222,9 +222,9 @@
 === Allow a Node to be Down Longer at Runtime
 
 Sometimes a node may be down for more than the normal
-`max_hint_window_in_ms`, (default of three hours), but the hardware and
+`max_hint_window`, (default of three hours), but the hardware and
 data itself will still be accessible. In such a case you may consider
-raising the `max_hint_window_in_ms` dynamically via the
+raising the `max_hint_window` dynamically via the
 `nodetool setmaxhintwindow` command added in Cassandra 4.0
 (https://issues.apache.org/jira/browse/CASSANDRA-11720[CASSANDRA-11720]).
 This will instruct Cassandra to continue holding hints for the down
@@ -232,7 +232,7 @@
 
 This command should be applied on all nodes in the cluster that may be
 holding hints. If needed, the setting can be applied permanently by
-setting the `max_hint_window_in_ms` setting in `cassandra.yaml` followed
+setting the `max_hint_window` setting in `cassandra.yaml` followed
 by a rolling restart.
 
 == Monitoring Hint Delivery
diff --git a/doc/modules/cassandra/pages/operating/security.adoc b/doc/modules/cassandra/pages/operating/security.adoc
index a74c042..258917d 100644
--- a/doc/modules/cassandra/pages/operating/security.adoc
+++ b/doc/modules/cassandra/pages/operating/security.adoc
@@ -43,20 +43,91 @@
 https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/FIPS.html[the
 java document on FIPS] for more details.
 
-For information on generating the keystore and truststore files used in
-SSL communications, see the
+Cassandra provides flexibility of using Java based key material or
+completely customizing the SSL context. You can choose any keystore
+format supported by Java (JKS, PKCS12 etc) as well as other standards
+like PEM. You can even customize the SSL context creation to use Cloud
+Native technologies like Kuberenetes Secrets for storing the key
+material or to integrate with your in-house Key Management System.
+
+For information on generating the keystore and truststore files
+required with the Java supported keystores used in SSL communications,
+see the
 http://download.oracle.com/javase/6/docs/technotes/guides/security/jsse/JSSERefGuide.html#CreateKeystore[java
-documentation on creating keystores]
+documentation on creating keystores].
+
+For customizing the SSL context creation you can implement
+https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/security/ISslContextFactory.java[ISslContextCreationFactory]
+interface or extend one of its public subclasses appropriately. You
+can then use the `ssl_context_factory` setting for
+`server_encryption_options` or `client_encryption_options` sections
+appropriately. See https://github.com/apache/cassandra/tree/trunk/examples/ssl-factory[ssl-factory examples]
+for details. Refer to the below class diagram to understand the
+class hierarchy.
+
+image::cassandra_ssl_context_factory_pem.png[image]
+
+=== Using PEM based key material
+
+You can use the in-built class `PEMBasedSSLContextFactory` as the
+`ssl_context_factory` setting for the PEM based key material.
+
+You can configure this factory with either inline PEM data or with the
+files having the required PEM data as shown below,
+
+* Configuration: PEM keys/certs defined in-line (mind the spaces in the
+YAML!)
+
+....
+   client/server_encryption_options:
+     ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+        parameters:
+            private_key: |
+             -----BEGIN ENCRYPTED PRIVATE KEY----- OR -----BEGIN PRIVATE KEY-----
+             <your base64 encoded private key>
+             -----END ENCRYPTED PRIVATE KEY----- OR -----END PRIVATE KEY-----
+             -----BEGIN CERTIFICATE-----
+             <your base64 encoded certificate chain>
+             -----END CERTIFICATE-----
+
+            private_key_password: "<your password if the private key is encrypted with a password>"
+
+            trusted_certificates: |
+              -----BEGIN CERTIFICATE-----
+              <your base64 encoded certificate>
+              -----END CERTIFICATE-----
+....
+
+* Configuration: PEM keys/certs defined in files
+....
+    client/server_encryption_options:
+     ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+     keystore: <file path to the keystore file in the PEM format with the private key and the certificate chain>
+     keystore_password: "<your password if the private key is encrypted with a password>"
+     truststore: <file path to the truststore file in the PEM format>
+....
 
 == SSL Certificate Hot Reloading
 
 Beginning with Cassandra 4, Cassandra supports hot reloading of SSL
-Certificates. If SSL/TLS support is enabled in Cassandra, the node
-periodically polls the Trust and Key Stores specified in cassandra.yaml.
-When the files are updated, Cassandra will reload them and use them for
-subsequent connections. Please note that the Trust & Key Store passwords
-are part of the yaml so the updated files should also use the same
-passwords. The default polling interval is 10 minutes.
+Certificates. If SSL/TLS support is enabled in Cassandra and you are
+using default file based key material, the node periodically (every
+10 minutes) polls the Trust and Key Stores specified in
+cassandra.yaml. When the files are updated, Cassandra will reload
+them and use them for subsequent connections. Please note that the
+Trust & Key Store passwords are part of the yaml so the updated files
+should also use the same passwords.
+
+If you are customizing the SSL configuration via `ssl_context_factory`
+setting, Cassandra polls (at the same periodic interval mentioned above)
+your implementation to check if the SSL certificates need to be
+reloaded. See the https://github.com/apache/cassandra/blob/trunk/src/java/org/apache/cassandra/security/ISslContextFactory.java#L90[ISslContextFactory] documentation for more details.
+If you are using one of the Cassandra's in-built SSL context factory
+class (example: PEMBasedSslContextFactory) with file based key
+material, it supports the hot reloading of the SSL certificates like
+mentioned above.
 
 Certificate Hot reloading may also be triggered using the
 `nodetool reloadssl` command. Use this if you want to Cassandra to
@@ -327,8 +398,8 @@
 more closely with Cassandra's own auth subsystem.
 
 The default settings for Cassandra make JMX accessible only from
-localhost. To enable remote JMX connections, edit `cassandra-env.sh` (or
-`cassandra-env.ps1` on Windows) to change the `LOCAL_JMX` setting to
+localhost. To enable remote JMX connections, edit `cassandra-env.sh`
+to change the `LOCAL_JMX` setting to
 `no`. Under the standard configuration, when remote JMX connections are
 enabled, `standard JMX authentication <standard-jmx-auth>` is also
 switched on.
@@ -490,7 +561,7 @@
 
 JMX SSL configuration is controlled by a number of system properties,
 some of which are optional. To turn on SSL, edit the relevant lines in
-`cassandra-env.sh` (or `cassandra-env.ps1` on Windows) to uncomment and
+`cassandra-env.sh` to uncomment and
 set the values of these properties as required:
 
 `com.sun.management.jmxremote.ssl`::
diff --git a/doc/modules/cassandra/pages/operating/topo_changes.adoc b/doc/modules/cassandra/pages/operating/topo_changes.adoc
index 368056d..98b17c2 100644
--- a/doc/modules/cassandra/pages/operating/topo_changes.adoc
+++ b/doc/modules/cassandra/pages/operating/topo_changes.adoc
@@ -111,10 +111,10 @@
 the replacement process.
 
 [arabic]
-. The node is down for longer than `max_hint_window_in_ms` before being
+. The node is down for longer than `max_hint_window` before being
 replaced.
 . You are replacing using the same IP address as the dead node *and*
-replacement takes longer than `max_hint_window_in_ms`.
+replacement takes longer than `max_hint_window`.
 ====
 
 == Monitoring progress
diff --git a/doc/modules/cassandra/pages/operating/transientreplication.adoc b/doc/modules/cassandra/pages/operating/transientreplication.adoc
new file mode 100644
index 0000000..c2a8384
--- /dev/null
+++ b/doc/modules/cassandra/pages/operating/transientreplication.adoc
@@ -0,0 +1,186 @@
+= Transient Replication
+
+*Note*:
+
+Transient Replication
+(https://issues.apache.org/jira/browse/CASSANDRA-14404[CASSANDRA-14404])
+is an experimental feature designed for expert Apache Cassandra users
+who are able to validate every aspect of the database for their
+application and deployment. That means being able to check that
+operations like reads, writes, decommission, remove, rebuild, repair,
+and replace all work with your queries, data, configuration, operational
+practices, and availability requirements. Apache Cassandra 4.0 has the
+initial implementation of transient replication. Future releases of
+Cassandra will make this feature suitable for a wider audience. It is
+anticipated that a future version will support monotonic reads with
+transient replication as well as LWT, logged batches, and counters.
+Being experimental, Transient replication is *not* recommended for
+production use.
+
+== Objective
+
+The objective of transient replication is to decouple storage
+requirements from data redundancy (or consensus group size) using
+incremental repair, in order to reduce storage overhead. Certain nodes
+act as full replicas (storing all the data for a given token range), and
+some nodes act as transient replicas, storing only unrepaired data for
+the same token ranges.
+
+The optimization that is made possible with transient replication is
+called "Cheap quorums", which implies that data redundancy is increased
+without corresponding increase in storage usage.
+
+Transient replication is useful when sufficient full replicas are
+unavailable to receive and store all the data. Transient replication
+allows you to configure a subset of replicas to only replicate data that
+hasn't been incrementally repaired. As an optimization, we can avoid
+writing data to a transient replica if we have successfully written data
+to the full replicas.
+
+After incremental repair, transient data stored on transient replicas
+can be discarded.
+
+== Enabling Transient Replication
+
+Transient replication is not enabled by default. Transient replication
+must be enabled on each node in a cluster separately by setting the
+following configuration property in `cassandra.yaml`.
+
+....
+transient_replication_enabled: true
+....
+
+Transient replication may be configured with both `SimpleStrategy` and
+`NetworkTopologyStrategy`. Transient replication is configured by
+setting replication factor as `<total_replicas>/<transient_replicas>`.
+
+As an example, create a keyspace with replication factor (RF) 3.
+
+....
+CREATE KEYSPACE CassandraKeyspaceSimple WITH replication = {'class': 'SimpleStrategy',
+'replication_factor' : 4/1};
+....
+
+As another example, `some_keysopace keyspace` will have 3 replicas in
+DC1, 1 of which is transient, and 5 replicas in DC2, 2 of which are
+transient:
+
+....
+CREATE KEYSPACE some_keysopace WITH replication = {'class': 'NetworkTopologyStrategy',
+'DC1' : '3/1'', 'DC2' : '5/2'};
+....
+
+Transiently replicated keyspaces only support tables with `read_repair`
+set to `NONE`.
+
+Important Restrictions:
+
+* RF cannot be altered while some endpoints are not in a normal state
+(no range movements).
+* You can't add full replicas if there are any transient replicas. You
+must first remove all transient replicas, then change the # of full
+replicas, then add back the transient replicas.
+* You can only safely increase number of transients one at a time with
+incremental repair run in between each time.
+
+Additionally, transient replication cannot be used for:
+
+* Monotonic Reads
+* Lightweight Transactions (LWTs)
+* Logged Batches
+* Counters
+* Keyspaces using materialized views
+* Secondary indexes (2i)
+
+== Cheap Quorums
+
+Cheap quorums are a set of optimizations on the write path to avoid
+writing to transient replicas unless sufficient full replicas are not
+available to satisfy the requested consistency level. Hints are never
+written for transient replicas. Optimizations on the read path prefer
+reading from transient replicas. When writing at quorum to a table
+configured to use transient replication the quorum will always prefer
+available full replicas over transient replicas so that transient
+replicas don't have to process writes. Tail latency is reduced by rapid
+write protection (similar to rapid read protection) when full replicas
+are slow or unavailable by sending writes to transient replicas.
+Transient replicas can serve reads faster as they don't have to do
+anything beyond bloom filter checks if they have no data. With vnodes
+and large cluster sizes they will not have a large quantity of data even
+for failure of one or more full replicas where transient replicas start
+to serve a steady amount of write traffic for some of their transiently
+replicated ranges.
+
+== Speculative Write Option
+
+The `CREATE TABLE` adds an option `speculative_write_threshold` for use
+with transient replicas. The option is of type `simple` with default
+value as `99PERCENTILE`. When replicas are slow or unresponsive
+`speculative_write_threshold` specifies the threshold at which a cheap
+quorum write will be upgraded to include transient replicas.
+
+== Pending Ranges and Transient Replicas
+
+Pending ranges refers to the movement of token ranges between transient
+replicas. When a transient range is moved, there will be a period of
+time where both transient replicas would need to receive any write
+intended for the logical transient replica so that after the movement
+takes effect a read quorum is able to return a response. Nodes are _not_
+temporarily transient replicas during expansion. They stream data like a
+full replica for the transient range before they can serve reads. A
+pending state is incurred similar to how there is a pending state for
+full replicas. Transient replicas also always receive writes when they
+are pending. Pending transient ranges are sent a bit more data and
+reading from them is avoided.
+
+== Read Repair and Transient Replicas
+
+Read repair never attempts to repair a transient replica. Reads will
+always include at least one full replica. They should also prefer
+transient replicas where possible. Range scans ensure the entire scanned
+range performs replica selection that satisfies the requirement that
+every range scanned includes one full replica. During incremental &
+validation repair handling, at transient replicas anti-compaction does
+not output any data for transient ranges as the data will be dropped
+after repair, and transient replicas never have data streamed to them.
+
+== Transitioning between Full Replicas and Transient Replicas
+
+The additional state transitions that transient replication introduces
+requires streaming and `nodetool cleanup` to behave differently. When
+data is streamed it is ensured that it is streamed from a full replica
+and not a transient replica.
+
+Transitioning from not replicated to transiently replicated means that a
+node must stay pending until the next incremental repair completes at
+which point the data for that range is known to be available at full
+replicas.
+
+Transitioning from transiently replicated to fully replicated requires
+streaming from a full replica and is identical to how data is streamed
+when transitioning from not replicated to replicated. The transition is
+managed so the transient replica is not read from as a full replica
+until streaming completes. It can be used immediately for a write
+quorum.
+
+Transitioning from fully replicated to transiently replicated requires
+cleanup to remove repaired data from the transiently replicated range to
+reclaim space. It can be used immediately for a write quorum.
+
+Transitioning from transiently replicated to not replicated requires
+cleanup to be run to remove the formerly transiently replicated data.
+
+When transient replication is in use ring changes are supported
+including add/remove node, change RF, add/remove DC.
+
+== Transient Replication supports EACH_QUORUM
+
+(https://issues.apache.org/jira/browse/CASSANDRA-14727[CASSANDRA-14727])
+adds support for Transient Replication support for `EACH_QUORUM`. Per
+(https://issues.apache.org/jira/browse/CASSANDRA-14768[CASSANDRA-14768]),
+we ensure we write to at least a `QUORUM` of nodes in every DC,
+regardless of how many responses we need to wait for and our requested
+consistency level. This is to minimally surprise users with transient
+replication; with normal writes, we soft-ensure that we reach `QUORUM`
+in all DCs we are able to, by writing to every node; even if we don't
+wait for ACK, we have in both cases sent sufficient messages.
diff --git a/doc/modules/cassandra/pages/operating/virtualtables.adoc b/doc/modules/cassandra/pages/operating/virtualtables.adoc
new file mode 100644
index 0000000..2963ecb
--- /dev/null
+++ b/doc/modules/cassandra/pages/operating/virtualtables.adoc
@@ -0,0 +1,478 @@
+= Virtual Tables
+
+Apache Cassandra 4.0 implements virtual tables (https://issues.apache.org/jira/browse/CASSANDRA-7622[CASSANDRA-7622]).
+Virtual tables are tables backed by an API instead of data explicitly managed and stored as SSTables. 
+Apache Cassandra 4.0 implements a virtual keyspace interface for virtual tables. 
+Virtual tables are specific to each node.
+
+Some of the features of virtual tables are the ability to:
+
+* expose metrics through CQL
+* expose YAML configuration information
+
+Virtual keyspaces and tables are quite different from regular tables and keyspaces:
+
+* Virtual tables are created in special keyspaces and not just any keyspace.
+* Virtual tables are managed by Cassandra. Users cannot run DDL to create new virtual tables or DML to modify existing virtual tables.
+* Virtual tables are currently read-only, although that may change in a later version.
+* Virtual tables are local only, non-distributed, and thus not replicated.
+* Virtual tables have no associated SSTables.
+* Consistency level of the queries sent to virtual tables are ignored.
+* All existing virtual tables use `LocalPartitioner`. 
+Since a virtual table is not replicated the partitioner sorts in order of partition keys instead of by their hash.
+* Making advanced queries using `ALLOW FILTERING` and aggregation functions can be executed in virtual tables, even though in normal tables we dont recommend it.
+
+== Virtual Keyspaces
+
+Apache Cassandra 4.0 has added two new keyspaces for virtual tables:
+
+* `system_virtual_schema` 
+* `system_views`. 
+
+The `system_virtual_schema` keyspace has three tables: `keyspaces`,
+`columns` and `tables` for the virtual keyspace, table, and column definitions, respectively.
+These tables contain schema information for the virtual tables.
+It is used by Cassandra internally and a user should not access it directly.
+
+The `system_views` keyspace contains the actual virtual tables.
+
+== Virtual Table Limitations
+
+Before disccusing virtual keyspaces and tables, note that virtual keyspaces and tables have some limitations. 
+These limitations are subject to change.
+Virtual keyspaces cannot be altered or dropped. 
+In fact, no operations can be performed against virtual keyspaces.
+
+Virtual tables cannot be created in virtual keyspaces.
+Virtual tables cannot be altered, dropped, or truncated.
+Secondary indexes, types, functions, aggregates, materialized views, and triggers cannot be created for virtual tables.
+Expiring time-to-live (TTL) columns cannot be created.
+Virtual tables do not support conditional updates or deletes.
+Aggregates may be run in SELECT statements.
+
+Conditional batch statements cannot include mutations for virtual tables, nor can a virtual table statement be included in a logged batch.
+In fact, mutations for virtual and regular tables cannot occur in the same batch table.
+
+== Virtual Tables
+
+Each of the virtual tables in the `system_views` virtual keyspace contain different information.
+
+The following table describes the virtual tables: 
+
+[width="98%",cols="27%,73%",]
+|===
+|Virtual Table |Description
+
+|caches |Displays the general cache information including cache name, capacity_bytes, entry_count, hit_count, hit_ratio double,
+recent_hit_rate_per_second, recent_request_rate_per_second, request_count, and size_bytes.
+
+|clients |Lists information about all connected clients.
+
+|coordinator_read_latency |Records counts, keyspace_name, table_name, max, median, and per_second for coordinator reads.
+
+|coordinator_scan |Records counts, keyspace_name, table_name, max, median, and per_second for coordinator scans.
+
+|coordinator_write_latency |Records counts, keyspace_name, table_name, max, median, and per_second for coordinator writes.
+
+|disk_usage |Records disk usage including disk_space, keyspace_name, and table_name, sorted by system keyspaces.
+
+|internode_inbound |Lists information about the inbound internode messaging.
+
+|internode_outbound |Information about the outbound internode messaging.
+
+|local_read_latency |Records counts, keyspace_name, table_name, max, median, and per_second for local reads.
+
+|local_scan |Records counts, keyspace_name, table_name, max, median, and per_second for local scans.
+
+|local_write_latency |Records counts, keyspace_name, table_name, max, median, and per_second for local writes.
+
+|max_partition_size |A table metric for maximum partition size.
+
+|rows_per_read |Records counts, keyspace_name, tablek_name, max, and median for rows read.
+
+|settings |Displays configuration settings in cassandra.yaml.
+
+|sstable_tasks |Lists currently running tasks and progress on SSTables, for operations like compaction and upgrade.
+
+|system_properties |Displays environmental system properties set on the node.
+
+|thread_pools |Lists metrics for each thread pool.
+
+|tombstones_per_read |Records counts, keyspace_name, tablek_name, max, and median for tombstones.
+|===
+
+We shall discuss some of the virtual tables in more detail next.
+
+=== Clients Virtual Table
+
+The `clients` virtual table lists all active connections (connected
+clients) including their ip address, port, client_options, connection stage, driver
+name, driver version, hostname, protocol version, request count, ssl
+enabled, ssl protocol and user name:
+
+....
+cqlsh> EXPAND ON ;
+Now Expanded output is enabled
+cqlsh> SELECT * FROM system_views.clients;
+
+@ Row 1
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50687
+ client_options   | {'CQL_VERSION': '3.4.6', 'DRIVER_NAME': 'DataStax Python Driver', 'DRIVER_VERSION': '3.25.0'}
+ connection_stage | ready
+ driver_name      | DataStax Python Driver
+ driver_version   | 3.25.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 16
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+@ Row 2
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50688
+ client_options   | {'CQL_VERSION': '3.4.6', 'DRIVER_NAME': 'DataStax Python Driver', 'DRIVER_VERSION': '3.25.0'}
+ connection_stage | ready
+ driver_name      | DataStax Python Driver
+ driver_version   | 3.25.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 4
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+@ Row 3
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50753
+ client_options   | {'APPLICATION_NAME': 'TestApp', 'APPLICATION_VERSION': '1.0.0', 'CLIENT_ID': '55b3efbd-c56b-469d-8cca-016b860b2f03', 'CQL_VERSION': '3.0.0', 'DRIVER_NAME': 'DataStax Java driver for Apache Cassandra(R)', 'DRIVER_VERSION': '4.13.0'}
+ connection_stage | ready
+ driver_name      | DataStax Java driver for Apache Cassandra(R)
+ driver_version   | 4.13.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 18
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+@ Row 4
+------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
+ address          | 127.0.0.1
+ port             | 50755
+ client_options   | {'APPLICATION_NAME': 'TestApp', 'APPLICATION_VERSION': '1.0.0', 'CLIENT_ID': '55b3efbd-c56b-469d-8cca-016b860b2f03', 'CQL_VERSION': '3.0.0', 'DRIVER_NAME': 'DataStax Java driver for Apache Cassandra(R)', 'DRIVER_VERSION': '4.13.0'}
+ connection_stage | ready
+ driver_name      | DataStax Java driver for Apache Cassandra(R)
+ driver_version   | 4.13.0
+ hostname         | localhost
+ protocol_version | 5
+ request_count    | 7
+ ssl_cipher_suite | null
+ ssl_enabled      | False
+ ssl_protocol     | null
+ username         | anonymous
+
+(4 rows)
+....
+
+Some examples of how `clients` can be used are:
+
+* To find applications using old incompatible versions of drivers before
+upgrading and with `nodetool enableoldprotocolversions` and
+`nodetool disableoldprotocolversions` during upgrades.
+* To identify clients sending too many requests.
+* To find if SSL is enabled during the migration to and from ssl.
+
+The virtual tables may be described with `DESCRIBE` statement. The DDL
+listed however cannot be run to create a virtual table. As an example
+describe the `system_views.clients` virtual table:
+
+....
+cqlsh> DESCRIBE TABLE system_views.clients;
+
+/*
+Warning: Table system_views.clients is a virtual table and cannot be recreated with CQL.
+Structure, for reference:
+VIRTUAL TABLE system_views.clients (
+  address inet,
+  port int,
+  client_options frozen<map<text, text>>,
+  connection_stage text,
+  driver_name text,
+  driver_version text,
+  hostname text,
+  protocol_version int,
+  request_count bigint,
+  ssl_cipher_suite text,
+  ssl_enabled boolean,
+  ssl_protocol text,
+  username text,
+    PRIMARY KEY (address, port)
+) WITH CLUSTERING ORDER BY (port ASC)
+    AND comment = 'currently connected clients';
+*/
+....
+
+=== Caches Virtual Table
+
+The `caches` virtual table lists information about the caches. The four
+caches presently created are chunks, counters, keys and rows. A query on
+the `caches` virtual table returns the following details:
+
+....
+cqlsh:system_views> SELECT * FROM system_views.caches;
+name     | capacity_bytes | entry_count | hit_count | hit_ratio | recent_hit_rate_per_second | recent_request_rate_per_second | request_count | size_bytes
+---------+----------------+-------------+-----------+-----------+----------------------------+--------------------------------+---------------+------------
+  chunks |      229638144 |          29 |       166 |      0.83 |                          5 |                              6 |           200 |     475136
+counters |       26214400 |           0 |         0 |       NaN |                          0 |                              0 |             0 |          0
+    keys |       52428800 |          14 |       124 |  0.873239 |                          4 |                              4 |           142 |       1248
+    rows |              0 |           0 |         0 |       NaN |                          0 |                              0 |             0 |          0
+
+(4 rows)
+....
+
+=== Settings Virtual Table
+
+The `settings` table is rather useful and lists all the current
+configuration settings from the `cassandra.yaml`. The encryption options
+are overridden to hide the sensitive truststore information or
+passwords. The configuration settings however cannot be set using DML on
+the virtual table presently: :
+
+....
+cqlsh:system_views> SELECT * FROM system_views.settings;
+
+name                                 | value
+-------------------------------------+--------------------
+  allocate_tokens_for_keyspace       | null
+  audit_logging_options_enabled      | false
+  auto_snapshot                      | true
+  automatic_sstable_upgrade          | false
+  cluster_name                       | Test Cluster
+  enable_transient_replication       | false
+  hinted_handoff_enabled             | true
+  hints_directory                    | /home/ec2-user/cassandra/data/hints
+  incremental_backups                | false
+  initial_token                      | null
+                           ...
+                           ...
+                           ...
+  rpc_address                        | localhost
+  ssl_storage_port                   | 7001
+  start_native_transport             | true
+  storage_port                       | 7000
+  stream_entire_sstables             | true
+  (224 rows)
+....
+
+The `settings` table can be really useful if yaml file has been changed
+since startup and dont know running configuration, or to find if they
+have been modified via jmx/nodetool or virtual tables.
+
+=== Thread Pools Virtual Table
+
+The `thread_pools` table lists information about all thread pools.
+Thread pool information includes active tasks, active tasks limit,
+blocked tasks, blocked tasks all time, completed tasks, and pending
+tasks. A query on the `thread_pools` returns following details:
+
+....
+cqlsh:system_views> select * from system_views.thread_pools;
+
+name                         | active_tasks | active_tasks_limit | blocked_tasks | blocked_tasks_all_time | completed_tasks | pending_tasks
+------------------------------+--------------+--------------------+---------------+------------------------+-----------------+---------------
+            AntiEntropyStage |            0 |                  1 |             0 |                      0 |               0 |             0
+        CacheCleanupExecutor |            0 |                  1 |             0 |                      0 |               0 |             0
+          CompactionExecutor |            0 |                  2 |             0 |                      0 |             881 |             0
+        CounterMutationStage |            0 |                 32 |             0 |                      0 |               0 |             0
+                 GossipStage |            0 |                  1 |             0 |                      0 |               0 |             0
+             HintsDispatcher |            0 |                  2 |             0 |                      0 |               0 |             0
+       InternalResponseStage |            0 |                  2 |             0 |                      0 |               0 |             0
+         MemtableFlushWriter |            0 |                  2 |             0 |                      0 |               1 |             0
+           MemtablePostFlush |            0 |                  1 |             0 |                      0 |               2 |             0
+       MemtableReclaimMemory |            0 |                  1 |             0 |                      0 |               1 |             0
+              MigrationStage |            0 |                  1 |             0 |                      0 |               0 |             0
+                   MiscStage |            0 |                  1 |             0 |                      0 |               0 |             0
+               MutationStage |            0 |                 32 |             0 |                      0 |               0 |             0
+   Native-Transport-Requests |            1 |                128 |             0 |                      0 |             130 |             0
+      PendingRangeCalculator |            0 |                  1 |             0 |                      0 |               1 |             0
+PerDiskMemtableFlushWriter_0 |            0 |                  2 |             0 |                      0 |               1 |             0
+                   ReadStage |            0 |                 32 |             0 |                      0 |              13 |             0
+                 Repair-Task |            0 |         2147483647 |             0 |                      0 |               0 |             0
+        RequestResponseStage |            0 |                  2 |             0 |                      0 |               0 |             0
+                     Sampler |            0 |                  1 |             0 |                      0 |               0 |             0
+    SecondaryIndexManagement |            0 |                  1 |             0 |                      0 |               0 |             0
+          ValidationExecutor |            0 |         2147483647 |             0 |                      0 |               0 |             0
+           ViewBuildExecutor |            0 |                  1 |             0 |                      0 |               0 |             0
+           ViewMutationStage |            0 |                 32 |             0 |                      0 |               0 |             0
+....
+
+(24 rows)
+
+=== Internode Inbound Messaging Virtual Table
+
+The `internode_inbound` virtual table is for the internode inbound
+messaging. Initially no internode inbound messaging may get listed. In
+addition to the address, port, datacenter and rack information includes
+corrupt frames recovered, corrupt frames unrecovered, error bytes, error
+count, expired bytes, expired count, processed bytes, processed count,
+received bytes, received count, scheduled bytes, scheduled count,
+throttled count, throttled nanos, using bytes, using reserve bytes. A
+query on the `internode_inbound` returns following details:
+
+....
+cqlsh:system_views> SELECT * FROM system_views.internode_inbound;
+address | port | dc | rack | corrupt_frames_recovered | corrupt_frames_unrecovered |
+error_bytes | error_count | expired_bytes | expired_count | processed_bytes |
+processed_count | received_bytes | received_count | scheduled_bytes | scheduled_count | throttled_count | throttled_nanos | using_bytes | using_reserve_bytes
+---------+------+----+------+--------------------------+----------------------------+-
+----------
+(0 rows)
+....
+
+=== SSTables Tasks Virtual Table
+
+The `sstable_tasks` could be used to get information about running
+tasks. It lists following columns:
+
+....
+cqlsh:system_views> SELECT * FROM sstable_tasks;
+keyspace_name | table_name | task_id                              | kind       | progress | total    | unit
+---------------+------------+--------------------------------------+------------+----------+----------+-------
+       basic |      wide2 | c3909740-cdf7-11e9-a8ed-0f03de2d9ae1 | compaction | 60418761 | 70882110 | bytes
+       basic |      wide2 | c7556770-cdf7-11e9-a8ed-0f03de2d9ae1 | compaction |  2995623 | 40314679 | bytes
+....
+
+As another example, to find how much time is remaining for SSTable
+tasks, use the following query:
+
+....
+SELECT total - progress AS remaining
+FROM system_views.sstable_tasks;
+....
+
+=== Other Virtual Tables
+
+Some examples of using other virtual tables are as follows.
+
+Find tables with most disk usage:
+
+....
+cqlsh> SELECT * FROM disk_usage WHERE mebibytes > 1 ALLOW FILTERING;
+
+keyspace_name | table_name | mebibytes
+---------------+------------+-----------
+   keyspace1 |  standard1 |       288
+  tlp_stress |   keyvalue |      3211
+....
+
+Find queries on table/s with greatest read latency:
+
+....
+cqlsh> SELECT * FROM  local_read_latency WHERE per_second > 1 ALLOW FILTERING;
+
+keyspace_name | table_name | p50th_ms | p99th_ms | count    | max_ms  | per_second
+---------------+------------+----------+----------+----------+---------+------------
+  tlp_stress |   keyvalue |    0.043 |    0.152 | 49785158 | 186.563 |  11418.356
+....
+
+
+== Example
+
+[arabic, start=1]
+. To list the keyspaces, enter ``cqlsh`` and run the CQL command ``DESCRIBE KEYSPACES``:
+
+[source, cql]
+----
+cqlsh> DESC KEYSPACES;
+system_schema  system          system_distributed  system_virtual_schema
+system_auth    system_traces   system_views
+----
+
+[arabic, start=2]
+. To view the virtual table schema, run the CQL commands ``USE system_virtual_schema`` and ``SELECT * FROM tables``:
+
+[source, cql]
+----
+cqlsh> USE system_virtual_schema;
+cqlsh> SELECT * FROM tables;
+----
+ 
+results in:
+
+[source, cql]
+----
+ keyspace_name         | table_name                | comment
+-----------------------+---------------------------+--------------------------------------
+          system_views |                    caches |                        system caches
+          system_views |                   clients |          currently connected clients
+          system_views |  coordinator_read_latency |
+          system_views |  coordinator_scan_latency |
+          system_views | coordinator_write_latency |
+          system_views |                disk_usage |
+          system_views |         internode_inbound |
+          system_views |        internode_outbound |
+          system_views |        local_read_latency |
+          system_views |        local_scan_latency |
+          system_views |       local_write_latency |
+          system_views |        max_partition_size |
+          system_views |             rows_per_read |
+          system_views |                  settings |                     current settings
+          system_views |             sstable_tasks |                current sstable tasks
+          system_views |         system_properties | Cassandra relevant system properties
+          system_views |              thread_pools |
+          system_views |       tombstones_per_read |
+ system_virtual_schema |                   columns |           virtual column definitions
+ system_virtual_schema |                 keyspaces |         virtual keyspace definitions
+ system_virtual_schema |                    tables |            virtual table definitions
+
+(21 rows)
+----
+
+[arabic, start=3]
+. To view the virtual tables, run the CQL commands ``USE system_view`` and ``DESCRIBE tables``:
+
+[source, cql]
+----
+cqlsh> USE system_view;;
+cqlsh> DESCRIBE tables;
+----
+
+results in:
+
+[source, cql]
+----
+sstable_tasks       clients                   coordinator_write_latency
+disk_usage          local_write_latency       tombstones_per_read
+thread_pools        internode_outbound        settings
+local_scan_latency  coordinator_scan_latency  system_properties
+internode_inbound   coordinator_read_latency  max_partition_size
+local_read_latency  rows_per_read             caches
+----
+
+[arabic, start=4]
+. To look at any table data, run the CQL command ``SELECT``:
+
+[source, cql]
+----
+cqlsh> USE system_view;;
+cqlsh> SELECT * FROM clients LIMIT 2;
+----
+ results in:
+
+[source, cql]
+----
+ address   | port  | connection_stage | driver_name            | driver_version | hostname  | protocol_version | request_count | ssl_cipher_suite | ssl_enabled | ssl_protocol | username
+-----------+-------+------------------+------------------------+----------------+-----------+------------------+---------------+------------------+-------------+--------------+-----------
+ 127.0.0.1 | 37308 |            ready | DataStax Python Driver |   3.21.0.post0 | localhost |                4 |            17 |             null |       False |         null | anonymous
+ 127.0.0.1 | 37310 |            ready | DataStax Python Driver |   3.21.0.post0 | localhost |                4 |             8 |             null |       False |         null | anonymous
+
+(2 rows)
+----
diff --git a/doc/modules/cassandra/pages/tools/cassandra_stress.adoc b/doc/modules/cassandra/pages/tools/cassandra_stress.adoc
index bcef193..7cf3548 100644
--- a/doc/modules/cassandra/pages/tools/cassandra_stress.adoc
+++ b/doc/modules/cassandra/pages/tools/cassandra_stress.adoc
@@ -67,8 +67,6 @@
     Custom transport factories
   -port:;;
     The port to connect to cassandra nodes on
-  -sendto:;;
-    Specify a stress server to send this command to
   -graph:;;
     Graph recorded metrics
   -tokenrange:;;
diff --git a/doc/modules/cassandra/pages/tools/cqlsh.adoc b/doc/modules/cassandra/pages/tools/cqlsh.adoc
index 162259a..8050ee5 100644
--- a/doc/modules/cassandra/pages/tools/cqlsh.adoc
+++ b/doc/modules/cassandra/pages/tools/cqlsh.adoc
@@ -46,52 +46,72 @@
 You can also view the latest version of the
 https://github.com/apache/cassandra/blob/trunk/conf/cqlshrc.sample[cqlshrc file online].
 
+[[cql_history]]
+== cql history
+
+All CQL commands you execute are written to a history file. By default, CQL history will be written to `~/.cassandra/cql_history`. You can change this default by setting the environment variable `CQL_HISTORY` like `~/some/other/path/to/cqlsh_history` where `cqlsh_history` is a file. All parent directories to history file will be created if they do not exist. If you do not want to persist history, you can do so by setting CQL_HISTORY to /dev/null.
+This feature is supported from Cassandra 4.1.
+
 == Command Line Options
 
-Usage:
+Usage: `cqlsh.py [options] [host [port]]`
 
-`cqlsh [options] [host [port]]`
+CQL Shell for Apache Cassandra
 
 Options:
 
+`--version`::
+  show program's version number and exit
+
+`-h` `--help`::
+  show this help message and exit
 `-C` `--color`::
-  Force color output
+  Always use color output
 `--no-color`::
-  Disable color output
-`--browser`::
-  Specify the browser to use for displaying cqlsh help. This can be one
-  of the https://docs.python.org/2/library/webbrowser.html[supported
-  browser names] (e.g. `firefox`) or a browser path followed by `%s`
-  (e.g. `/usr/bin/google-chrome-stable %s`).
+  Never use color output
+`--browser=BROWSER`::
+  The browser to use to display CQL help, where BROWSER can be:
+  one of the supported browsers in https://docs.python.org/3/library/webbrowser.html.
+  browser path followed by %s, example: /usr/bin/google-chrome-stable %s
 `--ssl`::
-  Use SSL when connecting to Cassandra
-`-u` `--user`::
-  Username to authenticate against Cassandra with
-`-p` `--password`::
-  Password to authenticate against Cassandra with, should be used in
-  conjunction with `--user`
-`-k` `--keyspace`::
-  Keyspace to authenticate to, should be used in conjunction with
-  `--user`
-`-f` `--file`::
-  Execute commands from the given file, then exit
+  Use SSL
+
+`-u USERNAME` `--username=USERNAME`::
+  Authenticate as user.
+`-p PASSWORD` `--password=PASSWORD`::
+  Authenticate using password.
+`-k KEYSPACE` `--keyspace=KEYSPACE`::
+  Authenticate to the given keyspace.
+`-f FILE` `--file=FILE`::
+  Execute commands from FILE, then exit
 `--debug`::
-  Print additional debugging information
-`--encoding`::
-  Specify a non-default encoding for output (defaults to UTF-8)
-`--cqlshrc`::
-  Specify a non-default location for the `cqlshrc` file
-`-e` `--execute`::
-  Execute the given statement, then exit
-`--connect-timeout`::
-  Specify the connection timeout in seconds (defaults to 2s)
-`--python /path/to/python`::
-  Specify the full path to Python interpreter to override default on
-  systems with multiple interpreters installed
-`--request-timeout`::
-  Specify the request timeout in seconds (defaults to 10s)
-`-t` `--tty`::
-  Force tty mode (command prompt)
+  Show additional debugging information
+`--coverage`::
+  Collect coverage data
+`--encoding=ENCODING`::
+  Specify a non-default encoding for output. (Default: utf-8)
+`--cqlshrc=CQLSHRC`::
+  Specify an alternative cqlshrc file location.
+`--credentials=CREDENTIALS`::
+  Specify an alternative credentials file location.
+`--cqlversion=CQLVERSION`::
+  Specify a particular CQL version, by default the
+  highest version supported by the server will be used.
+  Examples: "3.0.3", "3.1.0"
+`--protocol-version=PROTOCOL_VERSION`::
+  Specify a specific protcol version otherwise the
+  client will default and downgrade as necessary
+`-e EXECUTE` `--execute=EXECUTE`::
+  Execute the statement and quit.
+`--connect-timeout=CONNECT_TIMEOUT`::
+  Specify the connection timeout in seconds (default: 5 seconds).
+`--request-timeout=REQUEST_TIMEOUT`::
+  Specify the default request timeout in seconds
+  (default: 10 seconds).
+`-t, --tty`::
+  Force tty mode (command prompt).
+`-v` `--v`::
+  Print the current version of cqlsh.
 
 == Special Commands
 
diff --git a/doc/modules/cassandra/pages/tools/hash_password.adoc b/doc/modules/cassandra/pages/tools/hash_password.adoc
new file mode 100644
index 0000000..b2e8e0f
--- /dev/null
+++ b/doc/modules/cassandra/pages/tools/hash_password.adoc
@@ -0,0 +1,31 @@
+= Hash password
+
+The `hash_password` tool is used to get the jBcrypt hash of a password. This hash 
+can be used in CREATE/ALTER ROLE/USER statements for improved security.
+
+This feature can be useful if we want to make sure no intermediate system, logging or 
+any other possible plain text password leak can happen.
+
+== Usage
+
+hash_password <options>
+
+[cols=",",]
+|===
+
+|-h,--help |Displays help message
+
+|-e,--environment-var <arg> |Use value of the specified environment
+variable as the password
+
+|-i,--input <arg> |Input is a file (or - for stdin) to read the
+password from. Make sure that the whole input including newlines is
+considered. For example, the shell command `echo -n foobar \| hash_password
+-i -` will work as intended and just hash 'foobar'.
+
+|-p,--plain <arg> |Argument is the plain text password
+
+|-r,--logrounds <arg> |Number of hash rounds (default: 10).
+|===
+
+One of the options --environment-var, --plain or --input must be used.
\ No newline at end of file
diff --git a/doc/modules/cassandra/pages/tools/index.adoc b/doc/modules/cassandra/pages/tools/index.adoc
index a25af55..ca8b791 100644
--- a/doc/modules/cassandra/pages/tools/index.adoc
+++ b/doc/modules/cassandra/pages/tools/index.adoc
@@ -7,3 +7,4 @@
 * xref:tools/nodetool/nodetool.adoc[nodetool]
 * xref:tools/sstable/index.adoc[SSTable tools] 
 * xref:tools/cassandra_stress.adoc[cassandra-stress tool]
+* xref:tools/hash_password.adoc[hash password tool]
diff --git a/doc/modules/cassandra/pages/tools/sstable/sstableloader.adoc b/doc/modules/cassandra/pages/tools/sstable/sstableloader.adoc
index 4234a0b..e980dc2 100644
--- a/doc/modules/cassandra/pages/tools/sstable/sstableloader.adoc
+++ b/doc/modules/cassandra/pages/tools/sstable/sstableloader.adoc
@@ -45,10 +45,23 @@
 
 |--no-progress |don't display progress
 
-|-t, --throttle <throttle> |throttle speed in Mbits (default unlimited)
+|-t, --throttle <throttle> |(deprecated) throttle speed in Mbits
+(default 0 for unlimited) Use --throttle-mib instead
 
-|-idct, --inter-dc-throttle <inter-dc-throttle> |inter-datacenter
-throttle speed in Mbits (default unlimited)
+|--throttle-mib <throttle-mib> |throttle speed in MiB/s
+(default 0 for unlimited)
+
+|-idct, --inter-dc-throttle <inter-dc-throttle> |(deprecated) inter-datacenter
+throttle speed in Mbits (default 0 for unlimited) Use --inter-dc-throttle-mib instead
+
+|--inter-dc-throttle-mib <inter-dc-throttle-mib> |inter-datacenter
+throttle speed in MiB/s (default 0 for unlimited)
+
+|--entire-sstable-throttle-mib <throttle-mib> |entire SSTable throttle
+speed in MiB/s (default 0 for unlimited)
+
+|--entire-sstable-inter-dc-throttle-mib <inter-dc-throttle-mib> |entire
+SSTable inter-datacenter throttle speed in MiB/s (default 0 for unlimited)
 
 |-cph, --connections-per-host <connectionsPerHost> |number of concurrent
 connections-per-host
@@ -89,7 +102,7 @@
 
 You can provide a cassandra.yaml file with the -f command line option to
 set up streaming throughput, and client and server encryption options.
-Only stream_throughput_outbound_megabits_per_sec,
+Only stream_throughput_outbound,
 server_encryption_options, and client_encryption_options are read from
 yaml. You can override options read from cassandra.yaml with
 corresponding command line options.
diff --git a/doc/modules/cassandra/pages/tools/sstable/sstableverify.adoc b/doc/modules/cassandra/pages/tools/sstable/sstableverify.adoc
index 0af2f15..061edf4 100644
--- a/doc/modules/cassandra/pages/tools/sstable/sstableverify.adoc
+++ b/doc/modules/cassandra/pages/tools/sstable/sstableverify.adoc
@@ -8,6 +8,11 @@
 results will occur. Note: the script does not verify that Cassandra is
 stopped.
 
+== WARNING
+See CASSANDRA-9947 and CASSANDRA-17017 for discussion around risks with this tool. Specifically: "We mark sstables that fail verification as unrepaired, but that's not going to do what you think.  What it means is that the local node will use that sstable in the next repair, but other nodes will not. So all we'll end up doing is streaming whatever data we can read from it, to the other replicas.  If we could magically mark whatever sstables correspond on the remote nodes, to the data in the local sstable, that would work, but we can't."
+
+This tool requires the use of a -f or --force flag to indicate that the user understands the risks and would like to attempt its usage anyway.
+
 == Usage
 
 sstableverify <options> <keyspace> <table>
@@ -18,6 +23,7 @@
 |-e, --extended |extended verification
 |-h, --help |display this help message
 |-v, --verbose |verbose output
+|-f, --force |allow use of tool (see CASSANDRA-17017 for risks)
 |===
 
 == Basic Verification
diff --git a/doc/modules/cassandra/pages/troubleshooting/use_nodetool.adoc b/doc/modules/cassandra/pages/troubleshooting/use_nodetool.adoc
index f80d039..a313432 100644
--- a/doc/modules/cassandra/pages/troubleshooting/use_nodetool.adoc
+++ b/doc/modules/cassandra/pages/troubleshooting/use_nodetool.adoc
@@ -240,3 +240,46 @@
 take too many resources away from query threads is very important for
 performance. If you notice compaction unable to keep up, try tuning
 Cassandra's `concurrent_compactors` or `compaction_throughput` options.
+
+[[nodetool-datapaths]]
+== Paths used for data files
+
+Cassandra is persisting data on disk within the configured directories. Data
+files are distributed among the directories configured with `data_file_directories`.
+Resembling the structure of keyspaces and tables, Cassandra is creating
+subdirectories within `data_file_directories`. However, directories aren't removed
+even if the tables and keyspaces are dropped. While these directories are kept with
+the reason of holding snapshots, they are subject to removal. This is where operators
+need to know which directories are still in use. Running the `nodetool datapaths`
+command is an easy way to list in which directories Cassandra is actually storing
+sstable data on disk.
+
+[source, bash]
+----
+% nodetool datapaths -- system_auth
+Keyspace: system_auth
+	Table: role_permissions
+	Paths:
+		/var/lib/cassandra/data/system_auth/role_permissions-3afbe79f219431a7add7f5ab90d8ec9c
+
+	Table: network_permissions
+	Paths:
+		/var/lib/cassandra/data/system_auth/network_permissions-d46780c22f1c3db9b4c1b8d9fbc0cc23
+
+	Table: resource_role_permissons_index
+	Paths:
+		/var/lib/cassandra/data/system_auth/resource_role_permissons_index-5f2fbdad91f13946bd25d5da3a5c35ec
+
+	Table: roles
+	Paths:
+		/var/lib/cassandra/data/system_auth/roles-5bc52802de2535edaeab188eecebb090
+
+	Table: role_members
+	Paths:
+		/var/lib/cassandra/data/system_auth/role_members-0ecdaa87f8fb3e6088d174fb36fe5c0d
+
+----
+
+By default all keyspaces and tables are listed, however, a list of `keyspace` and
+`keyspace.table` arguments can be given to query specific data paths. Using the `--format`
+option the output can be formatted as YAML or JSON.
diff --git a/doc/native_protocol_v4.spec b/doc/native_protocol_v4.spec
index 2220000..6def737 100644
--- a/doc/native_protocol_v4.spec
+++ b/doc/native_protocol_v4.spec
@@ -1103,7 +1103,7 @@
                              - "VIEW": the timeout occured when a write involves
                                 VIEW update and failure to acqiure local view(MV)
                                 lock for key within timeout
-                             - "CDC": the timeout occured when cdc_total_space_in_mb is
+                             - "CDC": the timeout occured when cdc_total_space is
                                 exceeded when doing a write to data tracked by cdc.
     0x1200    Read_timeout: Timeout exception during a read request. The rest
               of the ERROR message body will be
@@ -1176,7 +1176,7 @@
                              - "VIEW": the failure occured when a write involves
                                 VIEW update and failure to acqiure local view(MV)
                                 lock for key within timeout
-                             - "CDC": the failure occured when cdc_total_space_in_mb is
+                             - "CDC": the failure occured when cdc_total_space is
                                 exceeded when doing a write to data tracked by cdc.
 
     0x2000    Syntax_error: The submitted query has a syntax error.
diff --git a/doc/native_protocol_v5.spec b/doc/native_protocol_v5.spec
index 3e24707..17f7368 100644
--- a/doc/native_protocol_v5.spec
+++ b/doc/native_protocol_v5.spec
@@ -1316,7 +1316,7 @@
                              - "VIEW": the timeout occured when a write involves
                                VIEW update and failure to acqiure local view(MV)
                                lock for key within timeout
-                             - "CDC": the timeout occured when cdc_total_space_in_mb is
+                             - "CDC": the timeout occured when cdc_total_space is
                                exceeded when doing a write to data tracked by cdc.
                 <contentions> is a [short] that describes the number of contentions occured during the CAS operation.
                               The field only presents when the <writeType> is "CAS".
@@ -1399,7 +1399,7 @@
                              - "VIEW": the failure occured when a write involves
                                VIEW update and failure to acqiure local view(MV)
                                lock for key within timeout
-                             - "CDC": the failure occured when cdc_total_space_in_mb is
+                             - "CDC": the failure occured when cdc_total_space is
                                exceeded when doing a write to data tracked by cdc.
     0x1600    CDC_WRITE_FAILURE: // todo
     0x1700    CAS_WRITE_UNKNOWN: An exception occured due to contended Compare And Set write/update.
diff --git a/examples/ssl-factory/README.adoc b/examples/ssl-factory/README.adoc
new file mode 100644
index 0000000..eb89f6f
--- /dev/null
+++ b/examples/ssl-factory/README.adoc
@@ -0,0 +1,22 @@
+Cassandra Custom SslContextFactory Example
+==========================================
+
+This example shows custom SslContextFactory implementation based on Kubernetes secrets
+For the documentation please refer to the javadocs for `K8SecretsSslContextFactory.java.`
+
+Installation
+-------------
+
+Step 1: Build the Cassandra classes locally
+
+----
+$ cd <cassandra_src_dir>
+$ ant build
+----
+
+Step 2: Run tests for the security examples
+
+----
+$ cd <cassandra_src_dir>/examples/ssl-factory
+$ ant test
+----
diff --git a/examples/ssl-factory/build.xml b/examples/ssl-factory/build.xml
new file mode 100644
index 0000000..d803aeb
--- /dev/null
+++ b/examples/ssl-factory/build.xml
@@ -0,0 +1,103 @@
+﻿<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one
+ ~ or more contributor license agreements.  See the NOTICE file
+ ~ distributed with this work for additional information
+ ~ regarding copyright ownership.  The ASF licenses this file
+ ~ to you under the Apache License, Version 2.0 (the
+ ~ "License"); you may not use this file except in compliance
+ ~ with the License.  You may obtain a copy of the License at
+ ~
+ ~   http://www.apache.org/licenses/LICENSE-2.0
+ ~
+ ~ Unless required by applicable law or agreed to in writing,
+ ~ software distributed under the License is distributed on an
+ ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ ~ KIND, either express or implied.  See the License for the
+ ~ specific language governing permissions and limitations
+ ~ under the License.
+-->
+
+<project default="jar" name="ssl-factory-example">
+	<property name="cassandra.dir" value="../.." />
+	<property name="cassandra.dir.lib" value="${cassandra.dir}/lib" />
+	<property name="cassandra.classes" value="${cassandra.dir}/build/classes/main" />
+	<property name="cassandra.test.lib" value="${cassandra.dir}/build/test/lib" />
+	<property name="build.src" value="${basedir}/src" />
+	<property name="build.dir" value="${basedir}/build" />
+	<property name="conf.dir" value="${basedir}/conf" />
+	<property name="build.classes" value="${build.dir}/classes" />
+	<property name="test.src" value="${basedir}/test/unit" />
+	<property name="test.build.dir" value="${build.dir}/test" />
+	<property name="test.conf.dir" value="${test.src}/conf" />
+	<property name="test.build.classes" value="${test.build.dir}/classes" />
+	<property name="test.build.conf" value="${test.build.dir}/conf" />
+	<property name="final.name" value="ssl-factory-example" />
+
+	<path id="build.classpath">
+		<fileset dir="${cassandra.dir.lib}">
+			<include name="**/*.jar" />
+		</fileset>
+		<fileset dir="${cassandra.dir}/build/lib/jars">
+			<include name="**/*.jar" />
+		</fileset>
+		<pathelement location="${cassandra.classes}" />
+	</path>
+
+	<path id="test.classpath">
+		<fileset dir="${cassandra.test.lib}/jars">
+			<include name="**/*.jar" />
+			<exclude name="**/ant-*.jar"/>
+		</fileset>
+		<path refid="build.classpath"/>
+		<path location="${build.dir}/${final.name}.jar"/>
+		<pathelement location="${build.classes}"/>
+		<pathelement location="${test.build.classes}"/>
+		<pathelement location="${test.build.conf}"/>
+	</path>
+
+	<target name="init">
+		<mkdir dir="${build.classes}" />
+		<mkdir dir="${test.build.classes}" />
+	</target>
+
+	<target name="build" depends="init">
+		<javac destdir="${build.classes}" debug="true" includeantruntime="false">
+			<src path="${build.src}" />
+			<classpath refid="build.classpath" />
+		</javac>
+	</target>
+
+	<target name="jar" depends="build">
+		<jar jarfile="${build.dir}/${final.name}.jar">
+			<fileset dir="${build.classes}" />
+		</jar>
+	</target>
+
+	<target name="buildTests" depends="build">
+		<delete dir="${test.build.dir}/conf"/>
+		<copy todir="${test.build.dir}/conf">
+			<fileset dir="test/conf" includes="**"/>
+		</copy>
+		<javac destdir="${test.build.classes}" debug="true" includeantruntime="false">
+			<src path="${test.src}" />
+			<src path="${test.build.dir}/conf" />
+			<classpath refid="test.classpath"/>
+		</javac>
+	</target>
+
+	<target name="test" depends="jar, buildTests">
+		<junit printsummary="on" haltonfailure="yes" fork="true">
+			<classpath refid="test.classpath"/>
+			<formatter type="brief" usefile="false" />
+			<batchtest>
+				<fileset dir="${test.src}" includes="**/*Test.java" />
+			</batchtest>
+		</junit>
+	</target>
+
+	<target name="clean">
+		<delete dir="${build.dir}" />
+		<delete dir="${test.build.classes}" />
+	</target>
+</project>
diff --git a/examples/ssl-factory/src/org/apache/cassandra/security/KubernetesSecretsPEMSslContextFactory.java b/examples/ssl-factory/src/org/apache/cassandra/security/KubernetesSecretsPEMSslContextFactory.java
new file mode 100644
index 0000000..fb11c91
--- /dev/null
+++ b/examples/ssl-factory/src/org/apache/cassandra/security/KubernetesSecretsPEMSslContextFactory.java
@@ -0,0 +1,184 @@
+/*
+ * 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.security;
+
+import java.util.Map;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.TrustManagerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Custom {@link ISslContextFactory} implementation based on Kubernetes Secrets. It allows the keystore and
+ * truststore paths to be configured from the K8 secrets via volumeMount and passwords via K8 secrets environment
+ * variables. The official Kubernetes Secret Spec can be found <a href="https://kubernetes.io/docs/concepts/configuration/secret/ ">here</a>.
+ * <p>
+ * When keystore or truststore is updated, this implementation can detect that based on updated K8 secrets
+ * at the mounted paths ({@code KEYSTORE_UPDATED_TIMESTAMP_PATH} for the keystore and {@code
+ * TRUSTSTORE_UPDATED_TIMESTAMP_PATH} for the truststore. The values in those paths are expected to be numeric values.
+ * The most obvious choice might be to just use the time in nano/milli-seconds precision but any other strategy would work
+ * as well, as far as the comparison of those values can be done in a consistent/predictable manner. Again, those
+ * values do not have to necessarily reflect actual file's update timestamps, using the actual file's timestamps is
+ * just one of the valid options to signal updates.
+ * <p>
+ * Defaults:
+ * <pre>
+ *     private key password = cassandra
+ *     keystore updated timestamp path = /etc/my-ssl-store/keystore-last-updatedtime
+ *     truststore updated timestamp path = /etc/my-ssl-store/truststore-last-updatedtime
+ * </pre>
+ * <p>
+ * Customization: In order to customize the K8s secret configuration, override appropriate values in the below Cassandra
+ * configuration. The similar configuration can be applied to {@code client_encryption_options}.
+ * <pre>
+ *     server_encryption_options:
+ *       internode_encryption: none
+ *       ssl_context_factory:
+ *         class_name: org.apache.cassandra.security.KubernetesSecretsPEMSslContextFactory
+ *         parameters:
+ *           PRIVATE_KEY_ENV_VAR: PRIVATE_KEY
+ *           PRIVATE_KEY_PASSWORD_ENV_VAR: PRIVATE_KEY_PASSWORD
+ *           KEYSTORE_UPDATED_TIMESTAMP_PATH: /etc/my-ssl-store/keystore-last-updatedtime
+ *           TRUSTED_CERTIFICATES_ENV_VAR: TRUSTED_CERTIFICATES
+ *           TRUSTSTORE_UPDATED_TIMESTAMP_PATH: /etc/my-ssl-store/truststore-last-updatedtime
+ * </pre>
+ * <p>
+ * Below is the corresponding sample YAML configuration for K8 env.
+ * <pre>
+ * apiVersion: v1
+ * kind: Pod
+ * metadata:
+ *   name: my-pod
+ *   labels:
+ *     app: my-app
+ * spec:
+ *   containers:
+ *   - name: my-app
+ *     image: my-app:latest
+ *     imagePullPolicy: Always
+ *     env:
+ *       - name: PRIVATE_KEY
+ *         valueFrom:
+ *           secretKeyRef:
+ *             name: my-ssl-store
+ *             key: private-key
+ *       - name: PRIVATE_KEY_PASSWORD
+ *         valueFrom:
+ *           secretKeyRef:
+ *             name: my-ssl-store
+ *             key: private-key-password
+ *       - name: TRUSTED_CERTIFICATES
+ *         valueFrom:
+ *           secretKeyRef:
+ *             name: my-ssl-store
+ *             key: trusted-certificates
+ *     volumeMounts:
+ *     - name: my-ssl-store
+ *       mountPath: "/etc/my-ssl-store"
+ *       readOnly: true
+ *   volumes:
+ *   - name: my-ssl-store
+ *     secret:
+ *       secretName: my-ssl-store
+ *       items:
+ *         - key: keystore-last-updatedtime
+ *           path: keystore-last-updatedtime
+ *         - key: truststore-last-updatedtime
+ *           path: truststore-last-updatedtime
+ * </pre>
+ */
+public class KubernetesSecretsPEMSslContextFactory extends KubernetesSecretsSslContextFactory
+{
+    public static final String DEFAULT_PRIVATE_KEY = "";
+    public static final String DEFAULT_PRIVATE_KEY_PASSWORD = "";
+    public static final String DEFAULT_TRUSTED_CERTIFICATES = "";
+
+    @VisibleForTesting
+    static final String DEFAULT_PRIVATE_KEY_ENV_VAR_NAME = "PRIVATE_KEY";
+    @VisibleForTesting
+    static final String DEFAULT_PRIVATE_KEY_PASSWORD_ENV_VAR_NAME = "PRIVATE_KEY_PASSWORD";
+    @VisibleForTesting
+    static final String DEFAULT_TRUSTED_CERTIFICATES_ENV_VAR_NAME = "TRUSTED_CERTIFICATES";
+
+    private static final Logger logger = LoggerFactory.getLogger(KubernetesSecretsPEMSslContextFactory.class);
+    private String pemEncodedKey;
+    private String keyPassword;
+    private String pemEncodedCertificates;
+    private PEMBasedSslContextFactory pemBasedSslContextFactory;
+
+    public KubernetesSecretsPEMSslContextFactory()
+    {
+        pemBasedSslContextFactory = new PEMBasedSslContextFactory();
+    }
+
+    public KubernetesSecretsPEMSslContextFactory(Map<String, Object> parameters)
+    {
+        super(parameters);
+
+        pemEncodedKey = getValueFromEnv(getString(PEMConfigKey.PRIVATE_KEY_ENV_VAR, DEFAULT_PRIVATE_KEY_ENV_VAR_NAME),
+                                        DEFAULT_PRIVATE_KEY);
+        keyPassword = getValueFromEnv(getString(PEMConfigKey.PRIVATE_KEY_PASSWORD_ENV_VAR,
+                                                DEFAULT_PRIVATE_KEY_PASSWORD_ENV_VAR_NAME),
+                                      DEFAULT_PRIVATE_KEY_PASSWORD);
+        pemEncodedCertificates = getValueFromEnv(getString(PEMConfigKey.TRUSTED_CERTIFICATE_ENV_VAR, DEFAULT_TRUSTED_CERTIFICATES_ENV_VAR_NAME),
+                                                 DEFAULT_TRUSTED_CERTIFICATES);
+
+        parameters.put(PEMBasedSslContextFactory.ConfigKey.ENCODED_KEY.getKeyName(), pemEncodedKey);
+        parameters.put(PEMBasedSslContextFactory.ConfigKey.KEY_PASSWORD.getKeyName(), keyPassword);
+        parameters.put(PEMBasedSslContextFactory.ConfigKey.ENCODED_CERTIFICATES.getKeyName(), pemEncodedCertificates);
+
+        pemBasedSslContextFactory = new PEMBasedSslContextFactory(parameters);
+    }
+
+    @Override
+    public synchronized void initHotReloading()
+    {
+        // No-op
+    }
+
+    @Override
+    public boolean hasKeystore()
+    {
+        return pemBasedSslContextFactory.hasKeystore();
+    }
+
+    @Override
+    protected KeyManagerFactory buildKeyManagerFactory() throws SSLException
+    {
+        KeyManagerFactory kmf = pemBasedSslContextFactory.buildKeyManagerFactory();
+        checkedExpiry = pemBasedSslContextFactory.checkedExpiry;
+        return kmf;
+    }
+
+    @Override
+    protected TrustManagerFactory buildTrustManagerFactory() throws SSLException
+    {
+        return pemBasedSslContextFactory.buildTrustManagerFactory();
+    }
+
+    public interface PEMConfigKey
+    {
+        String PRIVATE_KEY_ENV_VAR = "PRIVATE_KEY_ENV_VAR";
+        String PRIVATE_KEY_PASSWORD_ENV_VAR = "PRIVATE_KEY_PASSWORD_ENV_VAR";
+        String TRUSTED_CERTIFICATE_ENV_VAR = "TRUSTED_CERTIFICATE_ENV_VAR";
+    }
+}
diff --git a/examples/ssl-factory/src/org/apache/cassandra/security/KubernetesSecretsSslContextFactory.java b/examples/ssl-factory/src/org/apache/cassandra/security/KubernetesSecretsSslContextFactory.java
new file mode 100644
index 0000000..c83fb03
--- /dev/null
+++ b/examples/ssl-factory/src/org/apache/cassandra/security/KubernetesSecretsSslContextFactory.java
@@ -0,0 +1,287 @@
+/*
+ * 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.security;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Optional;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.EncryptionOptions;
+
+/**
+ * Custom {@link ISslContextFactory} implementation based on Kubernetes Secrets. It allows the keystore and
+ * truststore paths to be configured from the K8 secrets via volumeMount and passwords via K8 secrets environment
+ * variables. The official Kubernetes Secret Spec can be found <a href="https://kubernetes.io/docs/concepts/configuration/secret/ ">here</a>.
+ *
+ * When keystore or truststore is updated, this implementation can detect that based on updated K8 secrets
+ * at the mounted paths ({@code KEYSTORE_UPDATED_TIMESTAMP_PATH} for the keystore and {@code
+ * TRUSTSTORE_UPDATED_TIMESTAMP_PATH} for the truststore. The values in those paths are expected to be numeric values.
+ * The most obvious choice might be to just use the time in nano/milli-seconds precision but any other strategy would work
+ * as well, as far as the comparison of those values can be done in a consistent/predictable manner. Again, those
+ * values do not have to necessarily reflect actual file's update timestamps, using the actual file's timestamps is
+ * just one of the valid options to signal updates.
+ *
+ * Defaults:
+ * <pre>
+ *     keystore path = /etc/my-ssl-store/keystore
+ *     keystore password = cassandra
+ *     keystore updated timestamp path = /etc/my-ssl-store/keystore-last-updatedtime
+ *     truststore path = /etc/my-ssl-store/truststore
+ *     truststore password = cassandra
+ *     truststore updated timestamp path = /etc/my-ssl-store/truststore-last-updatedtime
+ * </pre>
+ *
+ * Customization: In order to customize the K8s secret configuration, override appropriate values in the below Cassandra
+ * configuration. The similar configuration can be applied to {@code client_encryption_options}.
+ * <pre>
+ *     server_encryption_options:
+ *       internode_encryption: none
+ *       ssl_context_factory:
+ *         class_name: org.apache.cassandra.security.KubernetesSecretsSslContextFactory
+ *         parameters:
+ *           KEYSTORE_PASSWORD_ENV_VAR: KEYSTORE_PASSWORD
+ *           KEYSTORE_UPDATED_TIMESTAMP_PATH: /etc/my-ssl-store/keystore-last-updatedtime
+ *           TRUSTSTORE_PASSWORD_ENV_VAR: TRUSTSTORE_PASSWORD
+ *           TRUSTSTORE_UPDATED_TIMESTAMP_PATH: /etc/my-ssl-store/truststore-last-updatedtime
+ *       keystore: /etc/my-ssl-store/keystore
+ *       truststore: /etc/my-ssl-store/truststore
+ * </pre>
+ *
+ * Below is the corresponding sample YAML configuration for K8 env.
+ * <pre>
+ * apiVersion: v1
+ * kind: Pod
+ * metadata:
+ *   name: my-pod
+ *   labels:
+ *     app: my-app
+ * spec:
+ *   containers:
+ *   - name: my-app
+ *     image: my-app:latest
+ *     imagePullPolicy: Always
+ *     env:
+ *       - name: KEYSTORE_PASSWORD
+ *         valueFrom:
+ *           secretKeyRef:
+ *             name: my-ssl-store
+ *             key: keystore-password
+ *       - name: TRUSTSTORE_PASSWORD
+ *         valueFrom:
+ *           secretKeyRef:
+ *             name: my-ssl-store
+ *             key: truststore-password
+ *     volumeMounts:
+ *     - name: my-ssl-store
+ *       mountPath: "/etc/my-ssl-store"
+ *       readOnly: true
+ *   volumes:
+ *   - name: my-ssl-store
+ *     secret:
+ *       secretName: my-ssl-store
+ *       items:
+ *         - key: cassandra_ssl_keystore
+ *           path: keystore
+ *         - key: keystore-last-updatedtime
+ *           path: keystore-last-updatedtime
+ *         - key: cassandra_ssl_truststore
+ *           path: truststore
+ *         - key: truststore-last-updatedtime
+ *           path: truststore-last-updatedtime
+ * </pre>
+ */
+public class KubernetesSecretsSslContextFactory extends FileBasedSslContextFactory
+{
+    private static final Logger logger = LoggerFactory.getLogger(KubernetesSecretsSslContextFactory.class);
+
+    /**
+     * Use below config-keys to configure this factory.
+     */
+    public interface ConfigKeys {
+        String KEYSTORE_PASSWORD_ENV_VAR = "KEYSTORE_PASSWORD_ENV_VAR";
+        String TRUSTSTORE_PASSWORD_ENV_VAR = "TRUSTSTORE_PASSWORD_ENV_VAR";
+        String KEYSTORE_UPDATED_TIMESTAMP_PATH = "KEYSTORE_UPDATED_TIMESTAMP_PATH";
+        String TRUSTSTORE_UPDATED_TIMESTAMP_PATH = "TRUSTSTORE_UPDATED_TIMESTAMP_PATH";
+    }
+
+    public static final String DEFAULT_KEYSTORE_PASSWORD = "";
+    public static final String DEFAULT_TRUSTSTORE_PASSWORD = "";
+
+    @VisibleForTesting
+    static final String DEFAULT_KEYSTORE_PASSWORD_ENV_VAR_NAME = "KEYSTORE_PASSWORD";
+    @VisibleForTesting
+    static final String DEFAULT_TRUSTSTORE_PASSWORD_ENV_VAR_NAME = "TRUSTSTORE_PASSWORD";
+
+    private static final String KEYSTORE_PATH_VALUE = "/etc/my-ssl-store/keystore";
+    private static final String TRUSTSTORE_PATH_VALUE = "/etc/my-ssl-store/truststore";
+    private static final String KEYSTORE_PASSWORD_ENV_VAR_NAME = DEFAULT_KEYSTORE_PASSWORD_ENV_VAR_NAME;
+    private static final String KEYSTORE_UPDATED_TIMESTAMP_PATH_VALUE = "/etc/my-ssl-store/keystore-last-updatedtime";
+    private static final String TRUSTSTORE_PASSWORD_ENV_VAR_NAME = DEFAULT_TRUSTSTORE_PASSWORD_ENV_VAR_NAME;
+    private static final String TRUSTSTORE_UPDATED_TIMESTAMP_PATH_VALUE = "/etc/my-ssl-store/truststore-last-updatedtime";
+
+    private final String keystoreUpdatedTimeSecretKeyPath;
+    private final String truststoreUpdatedTimeSecretKeyPath;
+    private long keystoreLastUpdatedTime;
+    private long truststoreLastUpdatedTime;
+
+    public KubernetesSecretsSslContextFactory()
+    {
+        keystore = getString(EncryptionOptions.ConfigKey.KEYSTORE.toString(), KEYSTORE_PATH_VALUE);
+        keystore_password = getValueFromEnv(KEYSTORE_PASSWORD_ENV_VAR_NAME,
+                                            DEFAULT_KEYSTORE_PASSWORD);
+        truststore = getString(EncryptionOptions.ConfigKey.TRUSTSTORE.toString(), TRUSTSTORE_PATH_VALUE);
+        truststore_password = getValueFromEnv(TRUSTSTORE_PASSWORD_ENV_VAR_NAME,
+                                              DEFAULT_TRUSTSTORE_PASSWORD);
+        keystoreLastUpdatedTime = System.nanoTime();
+        keystoreUpdatedTimeSecretKeyPath = getString(ConfigKeys.KEYSTORE_UPDATED_TIMESTAMP_PATH,
+                                                     KEYSTORE_UPDATED_TIMESTAMP_PATH_VALUE);
+        truststoreLastUpdatedTime = keystoreLastUpdatedTime;
+        truststoreUpdatedTimeSecretKeyPath = getString(ConfigKeys.TRUSTSTORE_UPDATED_TIMESTAMP_PATH,
+                                                       TRUSTSTORE_UPDATED_TIMESTAMP_PATH_VALUE);
+    }
+
+    public KubernetesSecretsSslContextFactory(Map<String, Object> parameters)
+    {
+        super(parameters);
+        keystore = getString(EncryptionOptions.ConfigKey.KEYSTORE.toString(), KEYSTORE_PATH_VALUE);
+        keystore_password = getValueFromEnv(getString(ConfigKeys.KEYSTORE_PASSWORD_ENV_VAR,
+                                                      KEYSTORE_PASSWORD_ENV_VAR_NAME), DEFAULT_KEYSTORE_PASSWORD);
+        truststore = getString(EncryptionOptions.ConfigKey.TRUSTSTORE.toString(), TRUSTSTORE_PATH_VALUE);
+        truststore_password = getValueFromEnv(getString(ConfigKeys.TRUSTSTORE_PASSWORD_ENV_VAR,
+                                                        TRUSTSTORE_PASSWORD_ENV_VAR_NAME), DEFAULT_TRUSTSTORE_PASSWORD);
+        keystoreLastUpdatedTime = System.nanoTime();
+        keystoreUpdatedTimeSecretKeyPath = getString(ConfigKeys.KEYSTORE_UPDATED_TIMESTAMP_PATH,
+                                                     KEYSTORE_UPDATED_TIMESTAMP_PATH_VALUE);
+        truststoreLastUpdatedTime = keystoreLastUpdatedTime;
+        truststoreUpdatedTimeSecretKeyPath = getString(ConfigKeys.TRUSTSTORE_UPDATED_TIMESTAMP_PATH,
+                                                       TRUSTSTORE_UPDATED_TIMESTAMP_PATH_VALUE);
+    }
+
+    @Override
+    public synchronized void initHotReloading() {
+        // No-op
+    }
+
+    /**
+     * Checks mounted paths for {@code KEYSTORE_UPDATED_TIMESTAMP_PATH} and {@code TRUSTSTORE_UPDATED_TIMESTAMP_PATH}
+     * and compares the values for those variables with the current timestamps. In case the mounted paths are
+     * not valid (either they are not initialized yet, got removed or got corrupted in-flight), this method considers
+     * that nothing has changed.
+     * @return {@code true} if either of the timestamps (keystore or truststore) got updated;{@code false} otherwise
+     */
+    @Override
+    public boolean shouldReload()
+    {
+        return hasKeystoreUpdated() || hasTruststoreUpdated();
+    }
+
+    @VisibleForTesting
+    String getValueFromEnv(String envVarName, String defaultValue) {
+        String valueFromEnv = StringUtils.isEmpty(envVarName) ? null : System.getenv(envVarName);
+        return StringUtils.isEmpty(valueFromEnv) ? defaultValue : valueFromEnv;
+    }
+
+    private boolean hasKeystoreUpdated() {
+        long keystoreUpdatedTime = getKeystoreLastUpdatedTime();
+        logger.info("Comparing keystore timestamps oldValue {} and newValue {}", keystoreLastUpdatedTime,
+                    keystoreUpdatedTime);
+        if (keystoreUpdatedTime > keystoreLastUpdatedTime) {
+            logger.info("Updating the keystoreLastUpdatedTime from oldValue {} to newValue {}",
+                        keystoreLastUpdatedTime, keystoreUpdatedTime);
+            keystoreLastUpdatedTime = keystoreUpdatedTime;
+            return true;
+        } else {
+            logger.info("Based on the comparision, no keystore update needed");
+            return false;
+        }
+    }
+
+    private boolean hasTruststoreUpdated() {
+        long truststoreUpdatedTime = getTruststoreLastUpdatedTime();
+        logger.info("Comparing truststore timestamps oldValue {} and newValue {}", truststoreLastUpdatedTime,
+                    truststoreUpdatedTime);
+        if (truststoreUpdatedTime > truststoreLastUpdatedTime) {
+            logger.info("Updating the truststoreLastUpdatedTime from oldValue {} to newValue {}",
+                        truststoreLastUpdatedTime, truststoreUpdatedTime);
+            truststoreLastUpdatedTime = truststoreUpdatedTime;
+            return true;
+        } else {
+            logger.info("Based on the comparision, no truststore update needed");
+            return false;
+        }
+    }
+
+    private long getKeystoreLastUpdatedTime() {
+        Optional<String> keystoreUpdatedTimeSecretKeyValue = readSecretFromMountedVolume(keystoreUpdatedTimeSecretKeyPath);
+        if (keystoreUpdatedTimeSecretKeyValue.isPresent())
+        {
+            return parseLastUpdatedTime(keystoreUpdatedTimeSecretKeyValue.get(), keystoreLastUpdatedTime);
+        }
+        else
+        {
+            logger.warn("Failed to load {}'s value. Will use existing value {}", keystoreUpdatedTimeSecretKeyPath,
+                        keystoreLastUpdatedTime);
+            return keystoreLastUpdatedTime;
+        }
+    }
+
+    private long getTruststoreLastUpdatedTime() {
+        Optional<String> truststoreUpdatedTimeSecretKeyValue = readSecretFromMountedVolume(truststoreUpdatedTimeSecretKeyPath);
+        if (truststoreUpdatedTimeSecretKeyValue.isPresent())
+        {
+            return parseLastUpdatedTime(truststoreUpdatedTimeSecretKeyValue.get(), truststoreLastUpdatedTime);
+        }
+        else
+        {
+            logger.warn("Failed to load {}'s value. Will use existing value {}", truststoreUpdatedTimeSecretKeyPath,
+                        truststoreLastUpdatedTime);
+            return truststoreLastUpdatedTime;
+        }
+    }
+
+    private Optional<String> readSecretFromMountedVolume(String secretKeyPath) {
+        try
+        {
+            return Optional.of(new String(Files.readAllBytes(Paths.get(secretKeyPath))));
+        }
+        catch (IOException e)
+        {
+            logger.warn(String.format("Failed to read secretKeyPath %s from the mounted volume: %s", secretKeyPath, e.getMessage()));
+            return Optional.empty();
+        }
+    }
+
+    private long parseLastUpdatedTime(String latestUpdatedTime, long currentUpdatedTime) {
+        try
+        {
+            return Long.parseLong(latestUpdatedTime);
+        } catch(NumberFormatException e) {
+            logger.warn("Failed to parse the latestUpdatedTime {}. Will use current time {}", latestUpdatedTime,
+                        currentUpdatedTime, e);
+            return currentUpdatedTime;
+        }
+    }
+}
diff --git a/examples/ssl-factory/test/conf/cassandra_encrypted_private_key.pem b/examples/ssl-factory/test/conf/cassandra_encrypted_private_key.pem
new file mode 100644
index 0000000..ed981cc
--- /dev/null
+++ b/examples/ssl-factory/test/conf/cassandra_encrypted_private_key.pem
@@ -0,0 +1,51 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/
+g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl
+xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29
+L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V
+sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/
+f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8
+RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR
+0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs
+evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU
+tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6
+wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN
+K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv
+zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5
+mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo
+WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ
+jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6
+eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny
+DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn
+AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY
+Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow
+Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut
+ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr
+bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH
+hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI
+RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw
+pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP
+FujZhqbKUDbYAcqTkoQ=
+-----END ENCRYPTED PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+n3MVF9w=
+-----END CERTIFICATE-----
diff --git a/examples/ssl-factory/test/conf/cassandra_encrypted_private_key_multiplecerts.pem b/examples/ssl-factory/test/conf/cassandra_encrypted_private_key_multiplecerts.pem
new file mode 100644
index 0000000..fed57d4
--- /dev/null
+++ b/examples/ssl-factory/test/conf/cassandra_encrypted_private_key_multiplecerts.pem
@@ -0,0 +1,71 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIE6TAbBgkqhkiG9w0BBQMwDgQI4QuRiKYzf88CAggABIIEyPRVmPp38SIFr8H3
+wi+oc6b+HJH7SPflXO6XZe4Tignw/aSyBTsLm2dWrzojRAYMIRd1xC7yQ2ffYrvx
+uoYbtOQeAminNqvwXdRTnwu6oC0rxdBT8RQ9NK7xL2tQyD/shmOeTJG/glXxaeqS
+rT0CZ5P5GJh6xdIWLEu3lEa3NSWVFE2YacUphmxBoaWjBjsJfWTgkF665SgP+2lh
+8R2WTcHrHjD8jR4jHB03wlup0LOmOwzplUmqHB9TyuA4wF6tlJajwBcPa0PNI6ny
+e9YcdcRr7Y0IxnPQr7PhQNV5AQb9TivwX4WaZxR+BXtwMglp+mz0ohjwLS3z6pqr
+tLrFhv2qcacSl+CKukFb9umV/QBkUk/iu+jwLcNJKPC965GWdieNbO0akBQpQsUN
+mqaF9DYHogW5lRnybl8WWPIR8tXmSCbSUIgzw4lRK+o15I4vaMI0NfkwFD/2y1sn
+t3m9LnVBukkpx3g/CPKd9PbZZeWpOTrnRJQfOu9Fj2lmkpGp0peCBqLJpO0pieVl
+87EQ0ZCErtAGLGIAhWnDUqRK0MaWZ+DMQNKYn5klF4YTVBkfRc9tQbIgBaa77wvz
+gvVWBuJtTFpCt9c8jByTH1gLbchC4bhLsy1nO7moevypMmNW4rqw9x5f0EIR3zCU
+L5/buoIh91TG5JB7BaIbVHtbB/Y2siARRXJibuw3ChBjqPOfzQ66j//NCMqhfTwT
+x2wn7L1BB4xyLJgVW9803FUTzaaL3EvJjzpdvrGC7vzcB6Jd0La9cjHhWSAPOKro
+nD9XPCbgLs10vW9g1Tc8drnZklhw6f7xrIQhWFg6VlwmVpvCQhEpX48rCCo2PH9X
+uzeJA+oqFEH3zfDp0r+q6jbAl+5TkkbBBgC2GCoI1vTYSKaWjeKKHkgzGG0QQLAz
+YXWMXvWKOME4wVPkeVxJv80RqDv0JsoOrnVoaFAzAHJMWa7UZQnjkrbVz/y8ZbV4
+oLJjQjvuOnU2PoXXs6SXbzOs1xx5zbX1UUH3Wc7/CCaUec2hemQJ5m6b1XJciyrY
+GHpMKWtXky9Mo1ruTP7ZH1nk03b4PTObKSx2gQD5AZ/ASuTeahMqMb/2PJkDkpHA
+sy8b1zOn2YTbf4K6NWVNIOkiaApmKhhX0Af6Lg8Wr2ymRTXdp/Um8f+SQLADpB/F
+xOydEN622wmihKDge9DrUFqPG/bdIiRGLXLg8efNboC6/cn/i/sheO7/YlrvcUNo
+qxDa/Bb1N/DgmtgAQ1ZP+AKjk6FKkwZRF1X/VZkZ6auscDlaPetF7razPeIJUrKN
+z/x4AD2txGYKmeYztYR577hPXBw+PPKdggRhIugb6z5Tk89C2pDEwfnByA/wcGJr
+w5avxrubosPrp0QtJpZMzouOvcD52VUiZzDfu9dqI/hpinyt5rETj5E19qxBjIZt
+X3Nq5lY2ktbyqVIo8Z8w4EUU+3XHZKqDwjyYvjxCxv5lVVnqvQrH9h3kENBMrPYQ
+4XonQHpUGG7g7pA3ylmHi+nEedr0H5qKHzyFZlRdI7CLVNoAtBSdwvmtGd2cVVXU
+EaToKNbHPXXYYPX/oVAWZYwD7PHXIRJkiEZnrFARNhLypicU7yjvejUPXcVy5HMh
+XqEbrODPp4VXfbYhVg==
+-----END ENCRYPTED PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIDXjCCAkYCAhI0MA0GCSqGSIb3DQEBBAUAMHcxCzAJBgNVBAYTAlVTMRMwEQYD
+VQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhTYW4gSm9zZTEXMBUGA1UECgwOUGVy
+c29uYWwsIEluYy4xEDAOBgNVBAsMB1Jvb3QgQ0ExFTATBgNVBAMMDG15ZG9tYWlu
+LmNvbTAeFw0yMTExMjIyMjQ5MzlaFw0yMjExMjIyMjQ5MzlaMHIxCzAJBgNVBAYT
+AlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhTYW4gSm9zZTEXMBUG
+A1UECgwOUGVyc29uYWwsIEluYy4xCzAJBgNVBAsMAklUMRUwEwYDVQQDDAxteWRv
+bWFpbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5fdA7wwD9
+9e5RcdLscvGB+hqJUEHuNC53SYKg5X4Sf0H4ExQUbsy8UaoWzWHhgGbCtTvUVavl
+72xsO74ei0EblopW7QknF0kaTO8Vi3mxhUAdtZFLG/o0NS9J16HdGDGojJwuqU9+
+sMQt1w0HCTMlriELnxaUFKP7M9b0uK5VODEKJ38QKNGXUDt66D7BVYeT/6hz2cXK
+QWDoHk/JadALSzW5ES8KIHfxCLnl2TcKxQhJ4CnL8qeGvc8N3VyTh2AXajaJW5RB
+8Oy4CVoYxcdmP1IapxCD+yNcmNt9XpUTD+6eM5gnvtbye+MSfwPz2MW+fWEDZXOv
+3VxhJyTRFNVTAgMBAAEwDQYJKoZIhvcNAQEEBQADggEBADYK/pn6QG7bvUL0Xnnw
+1KPf1nx36gfJE2V0bNk4uyNNeYufMKS8gPLzC+a3RigCEDc+hIZFE5BJexHd7DXA
+CWgHZJtdjM/Xlgoxbf1yfGV3DWeIZlNFSFZujBIpbm1Ug2BAeV31YRWODPZlUSEZ
+0jv8NEs8/oEz9bM4jwRdn09lo4D9hE6o8qDnrzmN2LBZP5dDIJ6g/M+mq/SJFnho
+qBrfUABZhbgk2+tkZ89OI2xpASCLo6X/vqua2iho6km3x+cz6EI9BbvVr6xOOdVK
+m6gs/Bi4MGTh35jdmvyXoyBUOd1w3yBBj86qbEt2ZHYqreRTxntQYx06598Q9Dsi
+xdg=
+-----END CERTIFICATE-----
+-----BEGIN CERTIFICATE-----
+MIIDajCCAlICCQD/7mxPcMTPIDANBgkqhkiG9w0BAQsFADB3MQswCQYDVQQGEwJV
+UzETMBEGA1UECAwKQ2FsaWZvcm5pYTERMA8GA1UEBwwIU2FuIEpvc2UxFzAVBgNV
+BAoMDlBlcnNvbmFsLCBJbmMuMRAwDgYDVQQLDAdSb290IENBMRUwEwYDVQQDDAxt
+eWRvbWFpbi5jb20wHhcNMjExMTIyMjExODAwWhcNNDkwNDA5MjExODAwWjB3MQsw
+CQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTERMA8GA1UEBwwIU2FuIEpv
+c2UxFzAVBgNVBAoMDlBlcnNvbmFsLCBJbmMuMRAwDgYDVQQLDAdSb290IENBMRUw
+EwYDVQQDDAxteWRvbWFpbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK
+AoIBAQCkIwuNGv3ckew/o2UwaDlYgXH9bh1jap4ZCb6qpjvR3tq9nCerY6XMli0Z
+Xxg0wMHDNUr/jmVYIdQjbz0DVNz/l6ZBJHzHCEgqR40pNM3NgC5sDyuNhF3WLNvj
+WgHEwYosfb/9kFRjKUPqqtJ0ccj87OP3XrE/4epCTdJdmugroAQSpXt1ZZfwwPO4
+K27DzMD9W01EmeLcUhMfrpUnKGCfL22c0sZZm/6Khk4BExC3pSILP/NREKeUEAHw
++rxhNqbUyD/e4/DutdtJ5zONA+GVVGYCpu1Iy0W78Jve4MD2/TFPcEzf5omiWpPz
+WjpOWayD43ur0SZnYJ5haUlZ+bSLAgMBAAEwDQYJKoZIhvcNAQELBQADggEBABqN
+/eb+mKEw2zklPZuzy5uhOc7ImG2LP/ha3oc2ntwkqZQ2LmVA/2ZNVfcNrRRngIfn
+Ir9Kual7djmKmIQvanpnSyXOKOlIiuN0VOrewgzlBZZwlFJL/AH1l7K9uZfBbV5h
+oFfaR9wc+vRGsg3nqO9+hEuk6xbp0jk8QCt26EVhEPlijxzbxTQYiNPNSLuf/kPW
+C9xtIKSWIDT4N6DtH7BtHGQKQdRJ2b4SSUF4joEmBe6jcrLBeDybmuFtKqlVJKUk
+tzBd9CPseqMML1c518KzxlSkXNxTCa7PWEnuN5atLZ+pGGjxtGcDKkrZ9Cgi09G8
+MzB8b4C/goypyhBNlyI=
+-----END CERTIFICATE-----
\ No newline at end of file
diff --git a/examples/ssl-factory/test/conf/cassandra_ssl_test.keystore b/examples/ssl-factory/test/conf/cassandra_ssl_test.keystore
new file mode 100644
index 0000000..8b2b218
--- /dev/null
+++ b/examples/ssl-factory/test/conf/cassandra_ssl_test.keystore
Binary files differ
diff --git a/examples/ssl-factory/test/conf/cassandra_ssl_test.truststore b/examples/ssl-factory/test/conf/cassandra_ssl_test.truststore
new file mode 100644
index 0000000..49cf332
--- /dev/null
+++ b/examples/ssl-factory/test/conf/cassandra_ssl_test.truststore
Binary files differ
diff --git a/examples/ssl-factory/test/conf/cassandra_ssl_test.truststore-without-password b/examples/ssl-factory/test/conf/cassandra_ssl_test.truststore-without-password
new file mode 100644
index 0000000..0031b15
--- /dev/null
+++ b/examples/ssl-factory/test/conf/cassandra_ssl_test.truststore-without-password
Binary files differ
diff --git a/examples/ssl-factory/test/conf/cassandra_trusted_certificates.pem b/examples/ssl-factory/test/conf/cassandra_trusted_certificates.pem
new file mode 100644
index 0000000..8806ce8
--- /dev/null
+++ b/examples/ssl-factory/test/conf/cassandra_trusted_certificates.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+n3MVF9w=
+-----END CERTIFICATE-----
diff --git a/examples/ssl-factory/test/conf/cassandra_unencrypted_private_key.pem b/examples/ssl-factory/test/conf/cassandra_unencrypted_private_key.pem
new file mode 100644
index 0000000..ce3d8e7
--- /dev/null
+++ b/examples/ssl-factory/test/conf/cassandra_unencrypted_private_key.pem
@@ -0,0 +1,50 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOSZVf8dLj1xLw
+efqjbogbAwhwRXd3tmEfQY1zHyudJF3XR1T0Xp26BKNvAYUxxZRDNg16M3prPRZv
+wkhDJdE9NaN+BpZPJUavRsZOfGDq/CHN8j/2PPKrn3G/b065JjV3GZjfV/Sln047
+DeZptaSyOg7ZN7F8qjGqxEcnw+szV/wTzhnjGjZMlcbOm4jFGQAn6xUOooQCGsoB
+9FgxKB0nvNG3xVe/2eCNfbS4DabT3Y1wfQqZ62hOa5ZS0rwT+pw3tQs3zFFY1Sfi
+G7qYbqZrKTheWIZGojVVm6mqH4yA2ofOe5N3RsBitCwU/D0dpnaG9Wcl98nmXueM
+B6Rk04v7AgMBAAECggEAYnxIKjrFz/JkJ5MmiszM5HV698r9YB0aqHnFIHPoykIL
+uiCjiumantDrFsCkosixULwvI/BRwbxstTpyrheU9psT6P1CONICVPvV8ylgJAYU
+l+ofn56cEXKxVuICSWFLDH7pM1479g+IJJQAchbKQpqxAGTuMu3SpvJolfuj5srt
+bM7/RYhJFLwDuvHNA3ivlogMneItP03+C25aaxstM+lBuBf68+n78zMgSvt6J/6Y
+G2TOMKnxveMlG2qu9l2lAw/2i8daG/qre08nTH7wpRx0gZLZqNpe45exkrzticzF
+FgWYjG2K2brX21jqHroFgMhdXF7zhhRgLoIeC0BrIQKBgQDCfGfWrJESKBbVai5u
+7wqD9nlzjv6N6FXfTDOPXO1vz5frdvtLVWbs0SMPy+NglkaZK0iqHvb9mf2of8eC
+0D5cmewjn7WCDBQMypIMYgT912ak/BBVuGXcxb6UgD+xARfSARo2C8NG1hfprw1W
+ad14CjS5xhFMs44HpVYhI7iPYwKBgQC7SqVG/b37vZ7CINemdvoMujLvvYXDJJM8
+N21LqNJfVXdukdH3T0xuLnh9Z/wPHjJDMF/9+1foxSEPHijtyz5P19EilNEC/3qw
+fI19+VZoY0mdhPtXSGzy+rbTE2v71QgwFLizSos14Gr+eNiIjF7FYccK05++K/zk
+cd8ZA3bwiQKBgQCl+HTFBs9mpz+VMOAfW2+l3hkXPNiPUc62mNkHZ05ZNNd44jjh
+uSf0wSUiveR08MmevQlt5K7zDQ8jVKh2QjB15gVXAVxsdtJFeDnax2trFP9LnLBz
+9sE2/qn9INU5wK0LUlWD+dXUBbCyg+jl7cJKRqtoPldVFYYHkFlIPqup8QKBgHXv
+hyuw1FUVDkdHzwOvn70r8q8sNHKxMVWVwWkHIZGOi+pAQGrusD4hXRX6yKnsZdIR
+QCD6iFy25R5T64nxlYdJaxPPid3NakB/7ckJnPOWseBSwMIxhQlr/nvjmve1Kba9
+FaEwq4B9lGIxToiNe4/nBiM3JzvlDxX67nUdzWOhAoGAdFvriyvjshSJ4JHgIY9K
+37BVB0VKMcFV2P8fLVWO5oyRtE1bJhU4QVpQmauABU4RGSojJ3NPIVH1wxmJeYtj
+Q3b7EZaqI6ovna2eK2qtUx4WwxhRaXTT8xueBI2lgL6sBSTGG+K69ZOzGQzG/Mfr
+RXKInnLInFD9JD94VqmMozo=
+-----END PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+n3MVF9w=
+-----END CERTIFICATE-----
diff --git a/examples/ssl-factory/test/unit/org/apache/cassandra/security/KubernetesSecretsPEMSslContextFactoryTest.java b/examples/ssl-factory/test/unit/org/apache/cassandra/security/KubernetesSecretsPEMSslContextFactoryTest.java
new file mode 100644
index 0000000..2d127f3
--- /dev/null
+++ b/examples/ssl-factory/test/unit/org/apache/cassandra/security/KubernetesSecretsPEMSslContextFactoryTest.java
@@ -0,0 +1,346 @@
+/*
+ * 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.security;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static org.apache.cassandra.security.KubernetesSecretsPEMSslContextFactory.DEFAULT_PRIVATE_KEY_ENV_VAR_NAME;
+import static org.apache.cassandra.security.KubernetesSecretsPEMSslContextFactory.DEFAULT_PRIVATE_KEY_PASSWORD_ENV_VAR_NAME;
+import static org.apache.cassandra.security.KubernetesSecretsPEMSslContextFactory.PEMConfigKey.PRIVATE_KEY_PASSWORD_ENV_VAR;
+import static org.apache.cassandra.security.KubernetesSecretsPEMSslContextFactory.PEMConfigKey.TRUSTED_CERTIFICATE_ENV_VAR;
+import static org.apache.cassandra.security.KubernetesSecretsSslContextFactory.ConfigKeys.KEYSTORE_UPDATED_TIMESTAMP_PATH;
+import static org.apache.cassandra.security.KubernetesSecretsSslContextFactory.ConfigKeys.TRUSTSTORE_UPDATED_TIMESTAMP_PATH;
+
+public class KubernetesSecretsPEMSslContextFactoryTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(KubernetesSecretsPEMSslContextFactoryTest.class);
+
+    private static final String ENCRYPTED_PRIVATE_KEY_FILEPATH = "build/test/conf/cassandra_encrypted_private_key.pem";
+    private static final String ENCRYPTED_PRIVATE_KEY_WITH_MULTIPLE_CERTS_IN_CERTCHAIN_FILEPATH = "build/test/conf" +
+                                                                                                  "/cassandra_encrypted_private_key_multiplecerts.pem";
+    private static final String UNENCRYPTED_PRIVATE_KEY_FILEPATH = "build/test/conf/cassandra_unencrypted_private_key.pem";
+    private static final String TRUSTED_CERTIFICATES_FILEPATH = "build/test/conf/cassandra_trusted_certificates.pem";
+    private final static String TRUSTSTORE_UPDATED_TIMESTAMP_FILEPATH = "build/test/conf/cassandra_truststore_last_updatedtime";
+    private final static String KEYSTORE_UPDATED_TIMESTAMP_FILEPATH = "build/test/conf/cassandra_keystore_last_updatedtime";
+
+    private static String private_key;
+    private static String unencrypted_private_key;
+    private static String trusted_certificates;
+
+    private final Map<String, Object> commonConfig = new HashMap<>();
+
+    @BeforeClass
+    public static void prepare()
+    {
+        deleteFileIfExists(TRUSTSTORE_UPDATED_TIMESTAMP_FILEPATH);
+        deleteFileIfExists(KEYSTORE_UPDATED_TIMESTAMP_FILEPATH);
+        private_key = readFile(ENCRYPTED_PRIVATE_KEY_FILEPATH);
+        unencrypted_private_key = readFile(UNENCRYPTED_PRIVATE_KEY_FILEPATH);
+        trusted_certificates = readFile(TRUSTED_CERTIFICATES_FILEPATH);
+    }
+
+    private static void deleteFileIfExists(String filePath)
+    {
+        try
+        {
+            logger.info("Deleting the file {} to prepare for the tests", new File(filePath).getAbsolutePath());
+            File file = new File(filePath);
+            if (file.exists())
+            {
+                file.delete();
+            }
+        }
+        catch (Exception e)
+        {
+            logger.warn("File {} could not be deleted.", filePath, e);
+        }
+    }
+
+    private static String readFile(String file)
+    {
+        try
+        {
+            return new String(Files.readAllBytes(Paths.get(file)));
+        }
+        catch (Exception e)
+        {
+            logger.error("Unable to read the file {}. Without this tests in this file would fail.", file);
+        }
+        return null;
+    }
+
+    @Before
+    public void setup()
+    {
+        commonConfig.put(TRUSTED_CERTIFICATE_ENV_VAR,
+                         "MY_TRUSTED_CERTIFICATES");
+        commonConfig.put("MY_TRUSTED_CERTIFICATES", trusted_certificates);
+        commonConfig.put(TRUSTSTORE_UPDATED_TIMESTAMP_PATH, TRUSTSTORE_UPDATED_TIMESTAMP_FILEPATH);
+        /*
+         * In order to test with real 'env' variables comment out this line and set appropriate env variable. This is
+         * done to avoid having a dependency on env in the unit test.
+         */
+        commonConfig.put("require_client_auth", Boolean.FALSE);
+        commonConfig.put("cipher_suites", Arrays.asList("TLS_RSA_WITH_AES_128_CBC_SHA"));
+    }
+
+    private void addKeystoreOptions(Map<String, Object> config)
+    {
+        config.put(DEFAULT_PRIVATE_KEY_ENV_VAR_NAME, private_key);
+        config.put(PRIVATE_KEY_PASSWORD_ENV_VAR, "MY_KEY_PASSWORD");
+        config.put(KEYSTORE_UPDATED_TIMESTAMP_PATH, KEYSTORE_UPDATED_TIMESTAMP_FILEPATH);
+        /*
+         * In order to test with real 'env' variables comment out this line and set appropriate env variable. This is
+         *  done to avoid having a dependency on env in the unit test.
+         */
+        config.put("MY_KEY_PASSWORD", "cassandra");
+    }
+
+    private void addUnencryptedKeystoreOptions(Map<String, Object> config)
+    {
+        config.put(DEFAULT_PRIVATE_KEY_ENV_VAR_NAME, unencrypted_private_key);
+        config.put(KEYSTORE_UPDATED_TIMESTAMP_PATH, KEYSTORE_UPDATED_TIMESTAMP_FILEPATH);
+        config.remove(DEFAULT_PRIVATE_KEY_PASSWORD_ENV_VAR_NAME);
+        config.remove(PRIVATE_KEY_PASSWORD_ENV_VAR);
+    }
+
+    @Test(expected = SSLException.class)
+    public void buildTrustManagerFactoryWithInvalidTrustedCertificates() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put("MY_TRUSTED_CERTIFICATES", trusted_certificates.replaceAll("\\s", String.valueOf(System.nanoTime())));
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory =
+        new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+    }
+
+    @Test
+    public void buildTrustManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        TrustManagerFactory trustManagerFactory = kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+        Assert.assertNotNull(trustManagerFactory);
+    }
+
+    @Test(expected = SSLException.class)
+    public void buildKeyManagerFactoryWithInvalidPrivateKey() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put(DEFAULT_PRIVATE_KEY_ENV_VAR_NAME, private_key.replaceAll("\\s", String.valueOf(System.nanoTime())));
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory =
+        new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        kubernetesSecretsSslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test(expected = IOException.class)
+    public void buildKeyManagerFactoryWithBadPassword() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put(DEFAULT_PRIVATE_KEY_ENV_VAR_NAME, private_key);
+        config.put(DEFAULT_PRIVATE_KEY_PASSWORD_ENV_VAR_NAME, "HomeOfBadPasswords");
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory =
+        new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildKeyManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory1 = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        // Make sure the exiry check didn't happen so far for the private key
+        Assert.assertFalse(kubernetesSecretsSslContextFactory1.checkedExpiry);
+
+        addKeystoreOptions(config);
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory2 = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        // Trigger the private key loading. That will also check for expired private key
+        kubernetesSecretsSslContextFactory2.buildKeyManagerFactory();
+        // Now we should have checked the private key's expiry
+        Assert.assertTrue(kubernetesSecretsSslContextFactory2.checkedExpiry);
+
+        // Make sure that new factory object preforms the fresh private key expiry check
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory3 =
+        new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory3.checkedExpiry);
+        kubernetesSecretsSslContextFactory3.buildKeyManagerFactory();
+        Assert.assertTrue(kubernetesSecretsSslContextFactory3.checkedExpiry);
+    }
+
+    @Test
+    public void buildKeyManagerFactoryWithMultipleCertsInCertChain() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeystoreOptions(config);
+        config.put(DEFAULT_PRIVATE_KEY_ENV_VAR_NAME, readFile(ENCRYPTED_PRIVATE_KEY_WITH_MULTIPLE_CERTS_IN_CERTCHAIN_FILEPATH));
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory2 = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        // Trigger the private key loading. That will also check for expired private key
+        kubernetesSecretsSslContextFactory2.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildKeyManagerFactoryHappyPathForUnencryptedKey() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory1 = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        // Make sure the exiry check didn't happen so far for the private key
+        Assert.assertFalse(kubernetesSecretsSslContextFactory1.checkedExpiry);
+
+        addUnencryptedKeystoreOptions(config);
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory2 = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        // Trigger the private key loading. That will also check for expired private key
+        kubernetesSecretsSslContextFactory2.buildKeyManagerFactory();
+        // Now we should have checked the private key's expiry
+        Assert.assertTrue(kubernetesSecretsSslContextFactory2.checkedExpiry);
+
+        // Make sure that new factory object preforms the fresh private key expiry check
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory3 =
+        new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory3.checkedExpiry);
+        kubernetesSecretsSslContextFactory3.buildKeyManagerFactory();
+        Assert.assertTrue(kubernetesSecretsSslContextFactory3.checkedExpiry);
+    }
+
+    @Test
+    public void checkTruststoreUpdateReloading() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeystoreOptions(config);
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        TrustManagerFactory trustManagerFactory = kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+        Assert.assertNotNull(trustManagerFactory);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+
+        updateTimestampFile(config, TRUSTSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertTrue(kubernetesSecretsSslContextFactory.shouldReload());
+
+        config.remove(TRUSTSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+    }
+
+    @Test
+    public void checkKeystoreUpdateReloading() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeystoreOptions(config);
+
+        KubernetesSecretsPEMSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsPEMSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        KeyManagerFactory keyManagerFactory = kubernetesSecretsSslContextFactory.buildKeyManagerFactory();
+        Assert.assertNotNull(keyManagerFactory);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+
+        updateTimestampFile(config, KEYSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertTrue(kubernetesSecretsSslContextFactory.shouldReload());
+
+        config.remove(KEYSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+    }
+
+    private void updateTimestampFile(Map<String, Object> config, String filePathKey)
+    {
+        String filePath = config.containsKey(filePathKey) ? config.get(filePathKey).toString() : null;
+        try (OutputStream os = Files.newOutputStream(Paths.get(filePath)))
+        {
+            String timestamp = String.valueOf(System.nanoTime());
+            os.write(timestamp.getBytes());
+            logger.info("Successfully wrote to file {}", filePath);
+        }
+        catch (IOException e)
+        {
+            logger.warn("Failed to write to filePath {} from the mounted volume", filePath, e);
+        }
+    }
+
+    private static class KubernetesSecretsPEMSslContextFactoryForTestOnly extends KubernetesSecretsPEMSslContextFactory
+    {
+
+        public KubernetesSecretsPEMSslContextFactoryForTestOnly()
+        {
+        }
+
+        public KubernetesSecretsPEMSslContextFactoryForTestOnly(Map<String, Object> config)
+        {
+            super(config);
+        }
+
+        /*
+         * This is overriden to first give priority to the input map configuration since we should not be setting env
+         * variables from the unit tests. However, if the input map configuration doesn't have the value for the
+         * given key then fallback to loading from the real environment variables.
+         */
+        @Override
+        String getValueFromEnv(String envVarName, String defaultValue)
+        {
+            String envVarValue = parameters.get(envVarName) != null ? parameters.get(envVarName).toString() : null;
+            if (StringUtils.isEmpty(envVarValue))
+            {
+                logger.info("Configuration doesn't have env variable {}. Will use parent's implementation", envVarName);
+                return super.getValueFromEnv(envVarName, defaultValue);
+            }
+            else
+            {
+                logger.info("Configuration has environment variable {} with value {}. Will use that.",
+                            envVarName, envVarValue);
+                return envVarValue;
+            }
+        }
+    }
+}
diff --git a/examples/ssl-factory/test/unit/org/apache/cassandra/security/KubernetesSecretsSslContextFactoryTest.java b/examples/ssl-factory/test/unit/org/apache/cassandra/security/KubernetesSecretsSslContextFactoryTest.java
new file mode 100644
index 0000000..d37992a
--- /dev/null
+++ b/examples/ssl-factory/test/unit/org/apache/cassandra/security/KubernetesSecretsSslContextFactoryTest.java
@@ -0,0 +1,291 @@
+/*
+ * 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.security;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.io.util.File;
+
+import static org.apache.cassandra.security.KubernetesSecretsSslContextFactory.ConfigKeys.KEYSTORE_PASSWORD_ENV_VAR;
+import static org.apache.cassandra.security.KubernetesSecretsSslContextFactory.ConfigKeys.KEYSTORE_UPDATED_TIMESTAMP_PATH;
+import static org.apache.cassandra.security.KubernetesSecretsSslContextFactory.ConfigKeys.TRUSTSTORE_PASSWORD_ENV_VAR;
+import static org.apache.cassandra.security.KubernetesSecretsSslContextFactory.ConfigKeys.TRUSTSTORE_UPDATED_TIMESTAMP_PATH;
+
+public class KubernetesSecretsSslContextFactoryTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(KubernetesSecretsSslContextFactoryTest.class);
+    private static final String TRUSTSTORE_PATH = EncryptionOptions.ConfigKey.TRUSTSTORE.toString();
+    private static final String KEYSTORE_PATH = EncryptionOptions.ConfigKey.KEYSTORE.toString();
+    private final static String truststoreUpdatedTimestampFilepath = "build/test/conf/cassandra_truststore_last_updatedtime";
+    private final static String keystoreUpdatedTimestampFilepath = "build/test/conf/cassandra_keystore_last_updatedtime";
+    private final Map<String, Object> commonConfig = new HashMap<>();
+
+    @BeforeClass
+    public static void prepare()
+    {
+        deleteFileIfExists(truststoreUpdatedTimestampFilepath);
+        deleteFileIfExists(keystoreUpdatedTimestampFilepath);
+    }
+
+    private static void deleteFileIfExists(String file)
+    {
+        Path filePath = Paths.get(file);
+        boolean deleted = new File(filePath).toJavaIOFile().delete();
+        if (!deleted)
+        {
+            logger.warn("File {} could not be deleted.", filePath);
+        }
+    }
+
+    @Before
+    public void setup()
+    {
+        commonConfig.put(TRUSTSTORE_PATH, "build/test/conf/cassandra_ssl_test.truststore");
+        commonConfig.put(TRUSTSTORE_PASSWORD_ENV_VAR, "MY_TRUSTSTORE_PASSWORD");
+        commonConfig.put(TRUSTSTORE_UPDATED_TIMESTAMP_PATH, truststoreUpdatedTimestampFilepath);
+        /*
+         * In order to test with real 'env' variables comment out this line and set appropriate env variable. This is
+         * done to avoid having a dependency on env in the unit test.
+         */
+        commonConfig.put("MY_TRUSTSTORE_PASSWORD", "cassandra");
+        commonConfig.put("require_client_auth", Boolean.FALSE);
+        commonConfig.put("cipher_suites", Arrays.asList("TLS_RSA_WITH_AES_128_CBC_SHA"));
+    }
+
+    private void addKeystoreOptions(Map<String, Object> config)
+    {
+        config.put(KEYSTORE_PATH, "build/test/conf/cassandra_ssl_test.keystore");
+        config.put(KEYSTORE_PASSWORD_ENV_VAR, "MY_KEYSTORE_PASSWORD");
+        config.put(KEYSTORE_UPDATED_TIMESTAMP_PATH, keystoreUpdatedTimestampFilepath);
+        /*
+         * In order to test with real 'env' variables comment out this line and set appropriate env variable. This is
+         *  done to avoid having a dependency on env in the unit test.
+         */
+        config.put("MY_KEYSTORE_PASSWORD", "cassandra");
+    }
+
+    @Test(expected = IOException.class)
+    public void buildTrustManagerFactoryWithInvalidTruststoreFile() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put(TRUSTSTORE_PATH, "/this/is/probably/not/a/file/on/your/test/machine");
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+    }
+
+    @Test(expected = IOException.class)
+    public void buildTrustManagerFactoryWithBadPassword() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.remove(TRUSTSTORE_PASSWORD_ENV_VAR);
+        config.put(KubernetesSecretsSslContextFactory.DEFAULT_TRUSTSTORE_PASSWORD_ENV_VAR_NAME, "HomeOfBadPasswords");
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+    }
+
+    @Test
+    public void buildTrustManagerFactoryWithEmptyPassword() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put(TRUSTSTORE_PATH, "build/test/conf/cassandra_ssl_test.truststore-without-password");
+        config.remove(TRUSTSTORE_PASSWORD_ENV_VAR);
+        config.put(KubernetesSecretsSslContextFactory.DEFAULT_TRUSTSTORE_PASSWORD_ENV_VAR_NAME, "");
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+    }
+
+    @Test
+    public void buildTrustManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        TrustManagerFactory trustManagerFactory = kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+        Assert.assertNotNull(trustManagerFactory);
+    }
+
+    @Test(expected = IOException.class)
+    public void buildKeyManagerFactoryWithInvalidKeystoreFile() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put(KEYSTORE_PATH, "/this/is/probably/not/a/file/on/your/test/machine");
+        config.put(KEYSTORE_PASSWORD_ENV_VAR, "MY_KEYSTORE_PASSWORD");
+        config.put("MY_KEYSTORE_PASSWORD","ThisWontMatter");
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        kubernetesSecretsSslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test(expected = IOException.class)
+    public void buildKeyManagerFactoryWithBadPassword() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put(KEYSTORE_PATH, "build/test/conf/cassandra_ssl_test.keystore");
+        config.put(KubernetesSecretsSslContextFactory.DEFAULT_KEYSTORE_PASSWORD_ENV_VAR_NAME, "HomeOfBadPasswords");
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildKeyManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory1 = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        // Make sure the exiry check didn't happen so far for the private key
+        Assert.assertFalse(kubernetesSecretsSslContextFactory1.checkedExpiry);
+
+        addKeystoreOptions(config);
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory2 = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        // Trigger the private key loading. That will also check for expired private key
+        kubernetesSecretsSslContextFactory2.buildKeyManagerFactory();
+        // Now we should have checked the private key's expiry
+        Assert.assertTrue(kubernetesSecretsSslContextFactory2.checkedExpiry);
+
+        // Make sure that new factory object preforms the fresh private key expiry check
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory3 = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory3.checkedExpiry);
+        kubernetesSecretsSslContextFactory3.buildKeyManagerFactory();
+        Assert.assertTrue(kubernetesSecretsSslContextFactory3.checkedExpiry);
+    }
+
+    @Test
+    public void checkTruststoreUpdateReloading() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeystoreOptions(config);
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        TrustManagerFactory trustManagerFactory = kubernetesSecretsSslContextFactory.buildTrustManagerFactory();
+        Assert.assertNotNull(trustManagerFactory);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+
+        updateTimestampFile(config, TRUSTSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertTrue(kubernetesSecretsSslContextFactory.shouldReload());
+
+        config.remove(TRUSTSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+    }
+
+    @Test
+    public void checkKeystoreUpdateReloading() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeystoreOptions(config);
+
+        KubernetesSecretsSslContextFactory kubernetesSecretsSslContextFactory = new KubernetesSecretsSslContextFactoryForTestOnly(config);
+        kubernetesSecretsSslContextFactory.checkedExpiry = false;
+        KeyManagerFactory keyManagerFactory = kubernetesSecretsSslContextFactory.buildKeyManagerFactory();
+        Assert.assertNotNull(keyManagerFactory);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+
+        updateTimestampFile(config, KEYSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertTrue(kubernetesSecretsSslContextFactory.shouldReload());
+
+        config.remove(KEYSTORE_UPDATED_TIMESTAMP_PATH);
+        Assert.assertFalse(kubernetesSecretsSslContextFactory.shouldReload());
+    }
+
+    private void updateTimestampFile(Map<String, Object> config, String filePathKey)
+    {
+        String filePath = config.containsKey(filePathKey) ? config.get(filePathKey).toString() : null;
+        try (OutputStream os = Files.newOutputStream(Paths.get(filePath)))
+        {
+            String timestamp = String.valueOf(System.nanoTime());
+            os.write(timestamp.getBytes());
+            logger.info("Successfully wrote to file {}", filePath);
+        }
+        catch (IOException e)
+        {
+            logger.warn("Failed to write to filePath {} from the mounted volume", filePath, e);
+        }
+    }
+
+    private static class KubernetesSecretsSslContextFactoryForTestOnly extends KubernetesSecretsSslContextFactory
+    {
+
+        public KubernetesSecretsSslContextFactoryForTestOnly()
+        {
+        }
+
+        public KubernetesSecretsSslContextFactoryForTestOnly(Map<String, Object> config)
+        {
+            super(config);
+        }
+
+        /*
+         * This is overriden to first give priority to the input map configuration since we should not be setting env
+         * variables from the unit tests. However, if the input map configuration doesn't have the value for the
+         * given key then fallback to loading from the real environment variables.
+         */
+        @Override
+        String getValueFromEnv(String envVarName, String defaultValue)
+        {
+            String envVarValue = parameters.get(envVarName) != null ? parameters.get(envVarName).toString() : null;
+            if (StringUtils.isEmpty(envVarValue))
+            {
+                logger.info("Configuration doesn't have env variable {}. Will use parent's implementation", envVarName);
+                return super.getValueFromEnv(envVarName, defaultValue);
+            }
+            else
+            {
+                logger.info("Configuration has env variable {} with value {}. Will use that.",
+                            envVarName, envVarValue);
+                return envVarValue;
+            }
+        }
+    }
+}
diff --git a/examples/triggers/README.adoc b/examples/triggers/README.adoc
new file mode 100644
index 0000000..9c2461d
--- /dev/null
+++ b/examples/triggers/README.adoc
@@ -0,0 +1,63 @@
+Cassandra Trigger Example
+==========================
+
+The `AuditTrigger` class will create a basic audit of
+activity on a table.
+
+Installation
+-------------
+
+----
+$ cd <cassandra_src_dir>/examples/triggers
+$ ant install
+----
+
+It will build the trigger and copy it to `conf/triggers`. `AuditTrigger.properties`
+in `conf` directory of this example will be automatically bundled into built jar file.
+It is not needed to copy it to `conf/triggers` directory.
+
+Usage
+-----
+
+Create the keyspace and table configured in `AuditTrigger.properties`:
+
+----
+cqlsh> CREATE KEYSPACE test WITH REPLICATION =
+    { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };
+cqlsh> CREATE TABLE test.audit (key timeuuid, keyspace_name text,
+    table_name text, primary_key text, PRIMARY KEY(key));
+----
+
+Create a table to add the trigger to:
+
+Note: The example currently only handles non-composite partition keys
+----
+cqlsh> CREATE TABLE test.test (key text, value text, PRIMARY KEY(key));
+----
+
+Configure the trigger on the table:
+
+----
+cqlsh> CREATE TRIGGER test1 ON test.test USING 'org.apache.cassandra.triggers.AuditTrigger';
+----
+
+Start inserting data to the table that has the trigger. For each
+partition added to the table an entry should appear in the 'audit' table:
+
+----
+cqlsh> INSERT INTO test.test (key, value) VALUES ('1', '1');
+----
+
+An entry will be automatically added to `test.audit` table:
+
+----
+cqlsh> SELECT * FROM test.audit ;
+
+@ Row 1
+---------------+--------------------------------------
+ key           | 885141d0-ad7c-11ed-b917-9958320828b8
+ keyspace_name | test
+ primary_key   | 1
+ table_name    | test
+----
+
diff --git a/examples/triggers/README.txt b/examples/triggers/README.txt
deleted file mode 100644
index e5f1ecf..0000000
--- a/examples/triggers/README.txt
+++ /dev/null
@@ -1,36 +0,0 @@
-Cassandra Trigger Example:
-==========================
-
-The AuditTrigger class will create a basic audit of
-activity on a table.
-
-Installation:
-============
-change directory to <cassandra_src_dir>/examples/triggers
-run "ant jar"
-Copy build/trigger-example.jar to <cassandra_conf>/triggers/
-Copy conf/* to <cassandra_home>/conf/
-
-Create the keyspace and table configured in AuditTrigger.properties:
-    CREATE KEYSPACE test WITH REPLICATION =
-        { 'class' : 'SimpleStrategy', 'replication_factor' : '1' };
-    CREATE TABLE test.audit (key timeuuid, keyspace_name text,
-        table_name text, primary_key text, PRIMARY KEY(key));
-
-Create a table to add the trigger to:
-    CREATE TABLE test.test (key text, value text, PRIMARY KEY(key));
-    Note: The example currently only handles non-composite partition keys
-
-Configure the trigger on the table:
-    CREATE TRIGGER test1 ON test.test
-        USING 'org.apache.cassandra.triggers.AuditTrigger';
-
-Start inserting data to the table that has the trigger. For each
-partition added to the table an entry should appear in the 'audit' table:
-    INSERT INTO test.test (key, value) values ('1', '1');
-    SELECT * FROM test.audit;
-
-    key                                  | keyspace_name | primary_key | table_name
-   --------------------------------------+---------------+-------------+------------
-    7dc75b60-770f-11e5-9019-033d8af33e6f |          test |           1 |       test
-
diff --git a/examples/triggers/build.xml b/examples/triggers/build.xml
index 450def6..b5a0f6f 100644
--- a/examples/triggers/build.xml
+++ b/examples/triggers/build.xml
@@ -57,7 +57,12 @@
 		</jar>
 	</target>
 
+	<target name="install" depends="jar">
+		<copy verbose="true" file="${build.dir}/${final.name}.jar" todir="${cassandra.dir}/conf/triggers" overwrite="true"/>
+	</target>
+
 	<target name="clean">
 		<delete dir="${build.dir}" />
+		<delete file="${cassandra.dir}/conf/triggers/${final.name}.jar"/>
 	</target>
 </project>
diff --git a/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java b/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java
index b0172b0..657394a 100644
--- a/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java
+++ b/examples/triggers/src/org/apache/cassandra/triggers/AuditTrigger.java
@@ -29,19 +29,27 @@
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class AuditTrigger implements ITrigger
 {
-    private Properties properties = loadProperties();
+    private static final String AUDIT_PROPERTIES_FILE_NAME = "AuditTrigger.properties";
+
+    private final Properties properties;
+    private final String auditKeyspace;
+    private final String auditTable;
+
+    public AuditTrigger()
+    {
+        properties = loadProperties();
+        auditKeyspace = properties.getProperty("keyspace");
+        auditTable = properties.getProperty("table");
+    }
 
     public Collection<Mutation> augment(Partition update)
     {
-        String auditKeyspace = properties.getProperty("keyspace");
-        String auditTable = properties.getProperty("table");
-
         TableMetadata metadata = Schema.instance.getTableMetadata(auditKeyspace, auditTable);
-        PartitionUpdate.SimpleBuilder audit = PartitionUpdate.simpleBuilder(metadata, UUIDGen.getTimeUUID());
+        PartitionUpdate.SimpleBuilder audit = PartitionUpdate.simpleBuilder(metadata, TimeUUID.Generator.nextTimeUUID());
 
         audit.row()
              .add("keyspace_name", update.metadata().keyspace)
@@ -54,7 +62,7 @@
     private static Properties loadProperties()
     {
         Properties properties = new Properties();
-        InputStream stream = AuditTrigger.class.getClassLoader().getResourceAsStream("AuditTrigger.properties");
+        InputStream stream = AuditTrigger.class.getClassLoader().getResourceAsStream(AUDIT_PROPERTIES_FILE_NAME);
         try
         {
             properties.load(stream);
diff --git a/ide/idea-iml-file.xml b/ide/idea-iml-file.xml
index 59fb99e..c0b5584 100644
--- a/ide/idea-iml-file.xml
+++ b/ide/idea-iml-file.xml
@@ -36,6 +36,9 @@
             <sourceFolder url="file://$MODULE_DIR$/test/microbench" isTestSource="true" />
             <sourceFolder url="file://$MODULE_DIR$/test/burn" isTestSource="true" />
             <sourceFolder url="file://$MODULE_DIR$/test/distributed" isTestSource="true" />
+            <sourceFolder url="file://$MODULE_DIR$/test/simulator/asm" isTestSource="true" />
+            <sourceFolder url="file://$MODULE_DIR$/test/simulator/bootstrap" isTestSource="true" />
+            <sourceFolder url="file://$MODULE_DIR$/test/simulator/main" isTestSource="true" />
             <sourceFolder url="file://$MODULE_DIR$/test/resources" type="java-test-resource" />
             <sourceFolder url="file://$MODULE_DIR$/test/conf" type="java-test-resource" />
             <excludeFolder url="file://$MODULE_DIR$/.idea" />
diff --git a/ide/idea/workspace.xml b/ide/idea/workspace.xml
index 5f28853..8aea315 100644
--- a/ide/idea/workspace.xml
+++ b/ide/idea/workspace.xml
@@ -147,6 +147,7 @@
                                           -DQT_SHRINKS=0
                                           -Dcassandra.config=file://$PROJECT_DIR$/conf/cassandra.yaml
                                           -Dcassandra.logdir=$PROJECT_DIR$/data/logs
+                                          -Dcassandra.reads.thresholds.coordinator.defensive_checks_enabled=true
                                           -Dcassandra.storagedir=$PROJECT_DIR$/data
                                           -Djava.library.path=$PROJECT_DIR$/lib/sigar-bin
                                           -Dlogback.configurationFile=file://$PROJECT_DIR$/conf/logback.xml
@@ -183,6 +184,7 @@
       <option name="VM_PARAMETERS" value="
                                           -Dcassandra.config=file://$PROJECT_DIR$/test/conf/cassandra.yaml
                                           -Dcassandra.logdir=$PROJECT_DIR$/build/test/logs
+                                          -Dcassandra.reads.thresholds.coordinator.defensive_checks_enabled=true
                                           -Dcassandra.ring_delay_ms=1000
                                           -Dcassandra.skip_sync=true
                                           -Dcassandra.strict.runtime.checks=true
@@ -195,7 +197,7 @@
                                           -Dlegacy-sstable-root=$PROJECT_DIR$/test/data/legacy-sstables
                                           -Dlogback.configurationFile=file://$PROJECT_DIR$/test/conf/logback-test.xml
                                           -Dmigration-sstable-root=$PROJECT_DIR$/test/data/migration-sstables
-                                          -XX:ActiveProcessorCount=4
+                                          -XX:ActiveProcessorCount=2
                                           -XX:MaxMetaspaceSize=384M
                                           -XX:SoftRefLRUPolicyMSPerMB=0
                                           -ea" />
@@ -223,7 +225,9 @@
                                           -Dcassandra.config=file://$PROJECT_DIR$/conf/cassandra.yaml
                                           -Dcassandra.jmx.local.port=7199
                                           -Dcassandra.logdir=$PROJECT_DIR$/data/logs
+                                          -Dcassandra.reads.thresholds.coordinator.defensive_checks_enabled=true
                                           -Dcassandra.storagedir=$PROJECT_DIR$/data
+                                          -Dcassandra.triggers_dir=$PROJECT_DIR$/conf/triggers
                                           -Djava.library.path=$PROJECT_DIR$/lib/sigar-bin
                                           -Dlogback.configurationFile=file://$PROJECT_DIR$/conf/logback.xml
                                           -Xmx1G
diff --git a/ide/nbproject/project.xml b/ide/nbproject/project.xml
index 12c06b6..3900f1f 100644
--- a/ide/nbproject/project.xml
+++ b/ide/nbproject/project.xml
@@ -7,7 +7,7 @@
             <properties>
                 <property name="project.dir">..</property>
                 <!-- the compile classpaths should be distinct per compilation unit… but it is kept simple and the build will catch errors -->
-                <property name="cassandra.classpath.jars">${project.dir}/build/lib/jars/HdrHistogram-2.1.9.jar:${project.dir}/build/lib/jars/ST4-4.0.8.jar:${project.dir}/build/lib/jars/airline-0.8.jar:${project.dir}/build/lib/jars/antlr-3.5.2.jar:${project.dir}/build/lib/jars/antlr-runtime-3.5.2.jar:${project.dir}/build/lib/jars/asm-7.1.jar:${project.dir}/build/lib/jars/assertj-core-3.15.0.jar:${project.dir}/build/lib/jars/byteman-4.0.6.jar:${project.dir}/build/lib/jars/byteman-bmunit-4.0.6.jar:${project.dir}/build/lib/jars/byteman-install-4.0.6.jar:${project.dir}/build/lib/jars/byteman-submit-4.0.6.jar:${project.dir}/build/lib/jars/caffeine-2.5.6.jar:${project.dir}/build/lib/jars/cassandra-driver-core-3.11.0-shaded.jar:${project.dir}/build/lib/jars/chronicle-bytes-2.20.111.jar:${project.dir}/build/lib/jars/chronicle-core-2.20.126.jar:${project.dir}/build/lib/jars/chronicle-queue-5.20.123.jar:${project.dir}/build/lib/jars/chronicle-threads-2.20.111.jar:${project.dir}/build/lib/jars/chronicle-wire-2.20.117.jar:${project.dir}/build/lib/jars/commons-beanutils-1.7.0.jar:${project.dir}/build/lib/jars/commons-beanutils-core-1.8.0.jar:${project.dir}/build/lib/jars/commons-cli-1.1.jar:${project.dir}/build/lib/jars/commons-codec-1.9.jar:${project.dir}/build/lib/jars/commons-collections-3.2.1.jar:${project.dir}/build/lib/jars/commons-configuration-1.6.jar:${project.dir}/build/lib/jars/commons-digester-1.8.jar:${project.dir}/build/lib/jars/commons-el-1.0.jar:${project.dir}/build/lib/jars/commons-httpclient-3.0.1.jar:${project.dir}/build/lib/jars/commons-lang-2.4.jar:${project.dir}/build/lib/jars/commons-lang3-3.11.jar:${project.dir}/build/lib/jars/commons-math-2.1.jar:${project.dir}/build/lib/jars/commons-math3-3.2.jar:${project.dir}/build/lib/jars/commons-net-1.4.1.jar:${project.dir}/build/lib/jars/compile-command-annotations-1.2.0.jar:${project.dir}/build/lib/jars/compress-lzf-0.8.4.jar:${project.dir}/build/lib/jars/concurrent-trees-2.4.0.jar:${project.dir}/build/lib/jars/ecj-4.6.1.jar:${project.dir}/build/lib/jars/ftplet-api-1.0.0.jar:${project.dir}/build/lib/jars/ftpserver-core-1.0.0.jar:${project.dir}/build/lib/jars/ftpserver-deprecated-1.0.0-M2.jar:${project.dir}/build/lib/jars/guava-27.0-jre.jar:${project.dir}/build/lib/jars/hadoop-core-1.0.3.jar:${project.dir}/build/lib/jars/hadoop-minicluster-1.0.3.jar:${project.dir}/build/lib/jars/hadoop-test-1.0.3.jar:${project.dir}/build/lib/jars/high-scale-lib-1.0.6.jar:${project.dir}/build/lib/jars/hppc-0.8.1.jar:${project.dir}/build/lib/jars/hsqldb-1.8.0.10.jar:${project.dir}/build/lib/jars/j2objc-annotations-1.3.jar:${project.dir}/build/lib/jars/jackson-annotations-2.13.2.jar:${project.dir}/build/lib/jars/jackson-core-2.13.2.jar:${project.dir}/build/lib/jars/jackson-databind-2.13.2.2.jar:${project.dir}/build/lib/jars/jacocoagent.jar:${project.dir}/build/lib/jars/jamm-0.3.2.jar:${project.dir}/build/lib/jars/jasper-compiler-5.5.12.jar:${project.dir}/build/lib/jars/jasper-runtime-5.5.12.jar:${project.dir}/build/lib/jars/java-cup-runtime-11b-20160615.jar:${project.dir}/build/lib/jars/javax.inject-1.jar:${project.dir}/build/lib/jars/jbcrypt-0.4.jar:${project.dir}/build/lib/jars/jcl-over-slf4j-1.7.25.jar:${project.dir}/build/lib/jars/jcommander-1.30.jar:${project.dir}/build/lib/jars/jctools-core-3.1.0.jar:${project.dir}/build/lib/jars/jersey-core-1.0.jar:${project.dir}/build/lib/jars/jersey-server-1.0.jar:${project.dir}/build/lib/jars/jets3t-0.7.1.jar:${project.dir}/build/lib/jars/jetty-6.1.26.jar:${project.dir}/build/lib/jars/jetty-util-6.1.26.jar:${project.dir}/build/lib/jars/jflex-1.8.2.jar:${project.dir}/build/lib/jars/jna-5.6.0.jar:${project.dir}/build/lib/jars/json-simple-1.1.jar:${project.dir}/build/lib/jars/jsp-2.1-6.1.14.jar:${project.dir}/build/lib/jars/jsp-api-2.1-6.1.14.jar:${project.dir}/build/lib/jars/jsr305-2.0.2.jar:${project.dir}/build/lib/jars/jsr311-api-1.0.jar:${project.dir}/build/lib/jars/jvm-attach-api-1.5.jar:${project.dir}/build/lib/jars/kfs-0.3.jar:${project.dir}/build/lib/jars/log4j-over-slf4j-1.7.25.jar:${project.dir}/build/lib/jars/logback-classic-1.2.9.jar:${project.dir}/build/lib/jars/logback-core-1.2.9.jar:${project.dir}/build/lib/jars/lz4-java-1.8.0.jar:${project.dir}/build/lib/jars/metrics-core-3.1.5.jar:${project.dir}/build/lib/jars/metrics-jvm-3.1.5.jar:${project.dir}/build/lib/jars/metrics-logback-3.1.5.jar:${project.dir}/build/lib/jars/mina-core-2.0.0-M5.jar:${project.dir}/build/lib/jars/mxdump-0.14.jar:${project.dir}/build/lib/jars/netty-all-4.1.58.Final.jar:${project.dir}/build/lib/jars/netty-tcnative-boringssl-static-2.0.36.Final.jar:${project.dir}/build/lib/jars/ohc-core-0.5.1.jar:${project.dir}/build/lib/jars/ohc-core-j8-0.5.1.jar:${project.dir}/build/lib/jars/oro-2.0.8.jar:${project.dir}/build/lib/jars/psjava-0.1.19.jar:${project.dir}/build/lib/jars/reporter-config-base-3.0.3.jar:${project.dir}/build/lib/jars/reporter-config3-3.0.3.jar:${project.dir}/build/lib/jars/servlet-api-2.5-6.1.14.jar:${project.dir}/build/lib/jars/sigar-1.6.4.jar:${project.dir}/build/lib/jars/sjk-cli-0.14.jar:${project.dir}/build/lib/jars/sjk-core-0.14.jar:${project.dir}/build/lib/jars/sjk-json-0.14.jar:${project.dir}/build/lib/jars/sjk-stacktrace-0.14.jar:${project.dir}/build/lib/jars/slf4j-api-1.7.25.jar:${project.dir}/build/lib/jars/snakeyaml-1.26.jar:${project.dir}/build/lib/jars/snappy-java-1.1.2.6.jar:${project.dir}/build/lib/jars/snowball-stemmer-1.3.0.581.1.jar:${project.dir}/build/lib/jars/stream-2.5.2.jar:${project.dir}/build/lib/jars/xmlenc-0.52.jar:${project.dir}/build/lib/jars/zstd-jni-1.5.0-4.jar:${project.dir}/build/test/lib/jars/ant-1.10.12.jar:${project.dir}/build/test/lib/jars/ant-junit-1.10.12.jar:${project.dir}/build/test/lib/jars/ant-launcher-1.10.12.jar:${project.dir}/build/test/lib/jars/asm-6.0.jar:${project.dir}/build/test/lib/jars/asm-analysis-6.0.jar:${project.dir}/build/test/lib/jars/asm-commons-6.0.jar:${project.dir}/build/test/lib/jars/asm-tree-6.0.jar:${project.dir}/build/test/lib/jars/asm-util-6.0.jar:${project.dir}/build/test/lib/jars/asm-xml-6.0.jar:${project.dir}/build/test/lib/jars/awaitility-4.0.3.jar:${project.dir}/build/test/lib/jars/byte-buddy-1.10.5.jar:${project.dir}/build/test/lib/jars/byte-buddy-agent-1.10.5.jar:${project.dir}/build/test/lib/jars/commons-io-2.6.jar:${project.dir}/build/test/lib/jars/commons-math3-3.2.jar:${project.dir}/build/test/lib/jars/dtest-api-0.0.13.jar:${project.dir}/build/test/lib/jars/hamcrest-2.2.jar:${project.dir}/build/test/lib/jars/java-allocation-instrumenter-3.1.0.jar:${project.dir}/build/test/lib/jars/javassist-3.26.0-GA.jar:${project.dir}/build/test/lib/jars/jmh-core-1.21.jar:${project.dir}/build/test/lib/jars/jmh-generator-annprocess-1.21.jar:${project.dir}/build/test/lib/jars/jopt-simple-4.6.jar:${project.dir}/build/test/lib/jars/junit-4.12.jar:${project.dir}/build/test/lib/jars/mockito-core-3.2.4.jar:${project.dir}/build/test/lib/jars/objenesis-2.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.agent-0.8.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.ant-0.8.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.core-0.8.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.report-0.8.6.jar:${project.dir}/build/test/lib/jars/quicktheories-0.26.jar:${project.dir}/build/test/lib/jars/reflections-0.9.12.jar:${project.dir}/build/test/lib/jars/semver4j-3.1.0.jar:${project.dir}/build/test/lib/jars/slf4j-api-1.7.25.jar:</property>
+                <property name="cassandra.classpath.jars">${project.dir}/build/lib/jars/HdrHistogram-2.1.9.jar:${project.dir}/build/lib/jars/ST4-4.0.8.jar:${project.dir}/build/lib/jars/airline-0.8.jar:${project.dir}/build/lib/jars/antlr-3.5.2.jar:${project.dir}/build/lib/jars/antlr-runtime-3.5.2.jar:${project.dir}/build/lib/jars/asm-9.1.jar:${project.dir}/build/lib/jars/assertj-core-3.15.0.jar:${project.dir}/build/lib/jars/byteman-4.0.6.jar:${project.dir}/build/lib/jars/byteman-bmunit-4.0.6.jar:${project.dir}/build/lib/jars/byteman-install-4.0.6.jar:${project.dir}/build/lib/jars/byteman-submit-4.0.6.jar:${project.dir}/build/lib/jars/caffeine-2.9.2.jar:${project.dir}/build/lib/jars/cassandra-driver-core-3.11.0-shaded.jar:${project.dir}/build/lib/jars/checker-qual-3.10.0.jar:${project.dir}/build/lib/jars/chronicle-bytes-2.20.111.jar:${project.dir}/build/lib/jars/chronicle-core-2.20.126.jar:${project.dir}/build/lib/jars/chronicle-queue-5.20.123.jar:${project.dir}/build/lib/jars/chronicle-threads-2.20.111.jar:${project.dir}/build/lib/jars/chronicle-wire-2.20.117.jar:${project.dir}/build/lib/jars/commons-beanutils-1.7.0.jar:${project.dir}/build/lib/jars/commons-beanutils-core-1.8.0.jar:${project.dir}/build/lib/jars/commons-cli-1.1.jar:${project.dir}/build/lib/jars/commons-codec-1.9.jar:${project.dir}/build/lib/jars/commons-collections-3.2.1.jar:${project.dir}/build/lib/jars/commons-configuration-1.6.jar:${project.dir}/build/lib/jars/commons-digester-1.8.jar:${project.dir}/build/lib/jars/commons-el-1.0.jar:${project.dir}/build/lib/jars/commons-httpclient-3.0.1.jar:${project.dir}/build/lib/jars/commons-lang3-3.11.jar:${project.dir}/build/lib/jars/commons-math-2.1.jar:${project.dir}/build/lib/jars/commons-math3-3.2.jar:${project.dir}/build/lib/jars/commons-net-1.4.1.jar:${project.dir}/build/lib/jars/compile-command-annotations-1.2.0.jar:${project.dir}/build/lib/jars/compress-lzf-0.8.4.jar:${project.dir}/build/lib/jars/concurrent-trees-2.4.0.jar:${project.dir}/build/lib/jars/ecj-4.6.1.jar:${project.dir}/build/lib/jars/error_prone_annotations-2.5.1.jar:${project.dir}/build/lib/jars/ftplet-api-1.0.0.jar:${project.dir}/build/lib/jars/ftpserver-core-1.0.0.jar:${project.dir}/build/lib/jars/ftpserver-deprecated-1.0.0-M2.jar:${project.dir}/build/lib/jars/guava-27.0-jre.jar:${project.dir}/build/lib/jars/hadoop-core-1.0.3.jar:${project.dir}/build/lib/jars/hadoop-minicluster-1.0.3.jar:${project.dir}/build/lib/jars/hadoop-test-1.0.3.jar:${project.dir}/build/lib/jars/high-scale-lib-1.0.6.jar:${project.dir}/build/lib/jars/hppc-0.8.1.jar:${project.dir}/build/lib/jars/hsqldb-1.8.0.10.jar:${project.dir}/build/lib/jars/ipaddress-5.3.3.jar:${project.dir}/build/lib/jars/j2objc-annotations-1.3.jar:${project.dir}/build/lib/jars/jackson-annotations-2.13.2.jar:${project.dir}/build/lib/jars/jackson-core-2.13.2.jar:${project.dir}/build/lib/jars/jackson-databind-2.13.2.2.jar:${project.dir}/build/lib/jars/jackson-datatype-jsr310-2.13.2.jar:${project.dir}/build/lib/jars/jacocoagent.jar:${project.dir}/build/lib/jars/jamm-0.3.2.jar:${project.dir}/build/lib/jars/jasper-compiler-5.5.12.jar:${project.dir}/build/lib/jars/jasper-runtime-5.5.12.jar:${project.dir}/build/lib/jars/java-cup-runtime-11b-20160615.jar:${project.dir}/build/lib/jars/javax.inject-1.jar:${project.dir}/build/lib/jars/jbcrypt-0.4.jar:${project.dir}/build/lib/jars/jcl-over-slf4j-1.7.25.jar:${project.dir}/build/lib/jars/jcommander-1.30.jar:${project.dir}/build/lib/jars/jctools-core-3.1.0.jar:${project.dir}/build/lib/jars/jersey-core-1.0.jar:${project.dir}/build/lib/jars/jersey-server-1.0.jar:${project.dir}/build/lib/jars/jets3t-0.7.1.jar:${project.dir}/build/lib/jars/jetty-6.1.26.jar:${project.dir}/build/lib/jars/jetty-util-6.1.26.jar:${project.dir}/build/lib/jars/jflex-1.8.2.jar:${project.dir}/build/lib/jars/jna-5.9.0.jar:${project.dir}/build/lib/jars/json-simple-1.1.jar:${project.dir}/build/lib/jars/jsp-2.1-6.1.14.jar:${project.dir}/build/lib/jars/jsp-api-2.1-6.1.14.jar:${project.dir}/build/lib/jars/jsr305-2.0.2.jar:${project.dir}/build/lib/jars/jsr311-api-1.0.jar:${project.dir}/build/lib/jars/jvm-attach-api-1.5.jar:${project.dir}/build/lib/jars/kfs-0.3.jar:${project.dir}/build/lib/jars/log4j-over-slf4j-1.7.25.jar:${project.dir}/build/lib/jars/logback-classic-1.2.9.jar:${project.dir}/build/lib/jars/logback-core-1.2.9.jar:${project.dir}/build/lib/jars/lz4-java-1.8.0.jar:${project.dir}/build/lib/jars/metrics-core-3.1.5.jar:${project.dir}/build/lib/jars/metrics-jvm-3.1.5.jar:${project.dir}/build/lib/jars/metrics-logback-3.1.5.jar:${project.dir}/build/lib/jars/mina-core-2.0.0-M5.jar:${project.dir}/build/lib/jars/mxdump-0.14.jar:${project.dir}/build/lib/jars/netty-all-4.1.58.Final.jar:${project.dir}/build/lib/jars/netty-tcnative-boringssl-static-2.0.36.Final.jar:${project.dir}/build/lib/jars/ohc-core-0.5.1.jar:${project.dir}/build/lib/jars/ohc-core-j8-0.5.1.jar:${project.dir}/build/lib/jars/oro-2.0.8.jar:${project.dir}/build/lib/jars/psjava-0.1.19.jar:${project.dir}/build/lib/jars/reporter-config-base-3.0.3.jar:${project.dir}/build/lib/jars/reporter-config3-3.0.3.jar:${project.dir}/build/lib/jars/servlet-api-2.5-6.1.14.jar:${project.dir}/build/lib/jars/sigar-1.6.4.jar:${project.dir}/build/lib/jars/sjk-cli-0.14.jar:${project.dir}/build/lib/jars/sjk-core-0.14.jar:${project.dir}/build/lib/jars/sjk-json-0.14.jar:${project.dir}/build/lib/jars/sjk-stacktrace-0.14.jar:${project.dir}/build/lib/jars/slf4j-api-1.7.25.jar:${project.dir}/build/lib/jars/snakeyaml-1.26.jar:${project.dir}/build/lib/jars/snappy-java-1.1.8.4.jar:${project.dir}/build/lib/jars/snowball-stemmer-1.3.0.581.1.jar:${project.dir}/build/lib/jars/stream-2.5.2.jar:${project.dir}/build/lib/jars/xmlenc-0.52.jar:${project.dir}/build/lib/jars/zstd-jni-1.5.0-4.jar:${project.dir}/build/test/lib/jars/Saxon-HE-10.3.jar:${project.dir}/build/test/lib/jars/ant-1.10.12.jar:${project.dir}/build/test/lib/jars/ant-junit-1.10.12.jar:${project.dir}/build/test/lib/jars/ant-launcher-1.10.12.jar:${project.dir}/build/test/lib/jars/antlr-2.7.7.jar:${project.dir}/build/test/lib/jars/antlr4-runtime-4.9.1.jar:${project.dir}/build/test/lib/jars/asm-analysis-9.1.jar:${project.dir}/build/test/lib/jars/asm-commons-9.1.jar:${project.dir}/build/test/lib/jars/asm-tree-9.1.jar:${project.dir}/build/test/lib/jars/asm-util-9.1.jar:${project.dir}/build/test/lib/jars/asm-xml-6.0.jar:${project.dir}/build/test/lib/jars/awaitility-4.0.3.jar:${project.dir}/build/test/lib/jars/byte-buddy-1.10.5.jar:${project.dir}/build/test/lib/jars/byte-buddy-agent-1.10.5.jar:${project.dir}/build/test/lib/jars/checkstyle-8.40.jar:${project.dir}/build/test/lib/jars/commons-beanutils-1.9.4.jar:${project.dir}/build/test/lib/jars/commons-collections-3.2.2.jar:${project.dir}/build/test/lib/jars/commons-io-2.6.jar:${project.dir}/build/test/lib/jars/commons-logging-1.2.jar:${project.dir}/build/test/lib/jars/commons-math3-3.2.jar:${project.dir}/build/test/lib/jars/compile-command-annotations-1.2.0.jar:${project.dir}/build/test/lib/jars/dtest-api-0.0.13.jar:${project.dir}/build/test/lib/jars/guava-18.0.jar:${project.dir}/build/test/lib/jars/hamcrest-2.2.jar:${project.dir}/build/test/lib/jars/harry-core-0.0.1.jar:${project.dir}/build/test/lib/jars/jackson-annotations-2.11.3.jar:${project.dir}/build/test/lib/jars/jackson-core-2.13.2.jar:${project.dir}/build/test/lib/jars/jackson-databind-2.11.3.jar:${project.dir}/build/test/lib/jars/jackson-dataformat-yaml-2.13.2.jar:${project.dir}/build/test/lib/jars/java-allocation-instrumenter-3.1.0.jar:${project.dir}/build/test/lib/jars/javassist-3.28.0-GA.jar:${project.dir}/build/test/lib/jars/jimfs-1.1.jar:${project.dir}/build/test/lib/jars/jmh-core-1.21.jar:${project.dir}/build/test/lib/jars/jmh-generator-annprocess-1.21.jar:${project.dir}/build/test/lib/jars/jopt-simple-4.6.jar:${project.dir}/build/test/lib/jars/jsr305-3.0.2.jar:${project.dir}/build/test/lib/jars/junit-4.12.jar:${project.dir}/build/test/lib/jars/mockito-core-3.2.4.jar:${project.dir}/build/test/lib/jars/objenesis-2.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.agent-0.8.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.ant-0.8.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.core-0.8.6.jar:${project.dir}/build/test/lib/jars/org.jacoco.report-0.8.6.jar:${project.dir}/build/test/lib/jars/picocli-4.6.1.jar:${project.dir}/build/test/lib/jars/quicktheories-0.26.jar:${project.dir}/build/test/lib/jars/reflections-0.10.2.jar:${project.dir}/build/test/lib/jars/semver4j-3.1.0.jar:${project.dir}/build/test/lib/jars/simulator-asm.jar:${project.dir}/build/test/lib/jars/simulator-bootstrap.jar:${project.dir}/build/test/lib/jars/slf4j-api-1.7.32.jar:</property>
             </properties>
             <folders>
                 <source-folder>
diff --git a/pylib/Dockerfile.ubuntu.py2 b/pylib/Dockerfile.ubuntu.py2
deleted file mode 100644
index 93016f0..0000000
--- a/pylib/Dockerfile.ubuntu.py2
+++ /dev/null
@@ -1,2 +0,0 @@
-FROM ubuntu:bionic
-RUN apt-get update && apt-get install -y python-minimal
diff --git a/pylib/README.asc b/pylib/README.asc
index b0b6c7d..53c40ea 100644
--- a/pylib/README.asc
+++ b/pylib/README.asc
@@ -1,17 +1,26 @@
 == Overview
 
 This directory contains code primarily for cqlsh. cqlsh uses cqlshlib in this directory.
-Currently, cqlshlib supports Python 2 as well as Python 3. Support for Python 3 is relatively
-new.
 
 == Requirements
-. Python 3 and 2.7 (for cqlsh)
+. Python 3.6+ (for cqlsh)
 . virtualenv
 . Docker (optional)
 
 == Running tests
 
-In order to run tests for cqlshlib, run cassandra-cqlsh-tests.sh in this directory. It will
+The following environment variables can be configured for the database connection -
+
+. CQL_TEST_HOST, default 127.0.0.1
+. CQL_TEST_PORT, default 9042
+. CQL_TEST_USER, default 'cassandra'
+. CQL_TEST_PWD
+
+You can run tests with a local Cassandra server simply by -
+
+  $ pytest
+
+In order to run tests in a virtual environment for cqlshlib, run cassandra-cqlsh-tests.sh in this directory. It will
 automatically setup a virtualenv with the appropriate version of Python and run tests inside it.
 
 There are Dockerfiles that can be used to test whether cqlsh works with a default, barebones
@@ -32,4 +41,4 @@
 with minimal Python installation. It will try to connect to the Cassandra instance running on the
 Docker host at port 9042. If you have Cassandra running elsewhere, replace host.docker.internal
 with the IP / hostname as usual. Please ensure that the IP / host is accessible from _within_ the
-Docker container.
\ No newline at end of file
+Docker container.
diff --git a/pylib/cassandra-cqlsh-tests.sh b/pylib/cassandra-cqlsh-tests.sh
index b2d2c50..ad6ae75 100755
--- a/pylib/cassandra-cqlsh-tests.sh
+++ b/pylib/cassandra-cqlsh-tests.sh
@@ -24,21 +24,13 @@
 ################################
 
 WORKSPACE=$1
-PYTHON_VERSION=$2
 
 if [ "${WORKSPACE}" = "" ]; then
     echo "Specify Cassandra source directory"
     exit
 fi
 
-if [ "${PYTHON_VERSION}" = "" ]; then
-    PYTHON_VERSION=python3
-fi
-
-if [ "${PYTHON_VERSION}" != "python3" -a "${PYTHON_VERSION}" != "python2" ]; then
-    echo "Specify Python version python3 or python2"
-    exit
-fi
+PYTHON_VERSION=python3
 
 export PYTHONIOENCODING="utf-8"
 export PYTHONUNBUFFERED=true
@@ -47,7 +39,7 @@
 export CCM_MAX_HEAP_SIZE="2048M"
 export CCM_HEAP_NEWSIZE="200M"
 export CCM_CONFIG_DIR=${WORKSPACE}/.ccm
-export NUM_TOKENS="32"
+export NUM_TOKENS="16"
 export CASSANDRA_DIR=${WORKSPACE}
 export TESTSUITE_NAME="cqlshlib.${PYTHON_VERSION}"
 
@@ -104,8 +96,8 @@
 
 ccm remove test || true # in case an old ccm cluster is left behind
 ccm create test -n 1 --install-dir=${CASSANDRA_DIR}
-ccm updateconf "enable_user_defined_functions: true"
-ccm updateconf "enable_scripted_user_defined_functions: true"
+ccm updateconf "user_defined_functions_enabled: true"
+ccm updateconf "scripted_user_defined_functions_enabled: true"
 
 version_from_build=$(ccm node1 versionfrombuild)
 export pre_or_post_cdc=$(python -c """from distutils.version import LooseVersion
@@ -129,14 +121,13 @@
 cd ${CASSANDRA_DIR}/pylib/cqlshlib/
 
 set +e # disable immediate exit from this point
-pytest
+pytest --junitxml=${WORKSPACE}/cqlshlib.xml
 RETURN="$?"
 
+sed -i "s/testsuite errors=\(\".*\"\) failures=\(\".*\"\) hostname=\(\".*\"\) name=\"pytest\"/testsuite errors=\1 failures=\2 hostname=\3 name=\"${TESTSUITE_NAME}\"/g" ${WORKSPACE}/cqlshlib.xml
+sed -i "s/testcase classname=\"cqlshlib./testcase classname=\"${TESTSUITE_NAME}./g" ${WORKSPACE}/cqlshlib.xml
+
 ccm remove
-# hack around --xunit-prefix-with-testsuite-name not being available in nose 1.3.7
-sed -i "s/testsuite name=\"nosetests\"/testsuite name=\"${TESTSUITE_NAME}\"/g" nosetests.xml
-sed -i "s/testcase classname=\"cqlshlib./testcase classname=\"${TESTSUITE_NAME}./g" nosetests.xml
-mv nosetests.xml ${WORKSPACE}/cqlshlib.xml
 
 ################################
 #
diff --git a/pylib/cqlshlib/authproviderhandling.py b/pylib/cqlshlib/authproviderhandling.py
new file mode 100644
index 0000000..68031e5
--- /dev/null
+++ b/pylib/cqlshlib/authproviderhandling.py
@@ -0,0 +1,176 @@
+# 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.
+"""
+Handles loading of AuthProvider for CQLSH authentication.
+"""
+
+import configparser
+import sys
+from importlib import import_module
+from cqlshlib.util import is_file_secure
+
+
+def _warn_for_plain_text_security(config_file, provider_settings):
+    """
+    Call when using PlainTextAuthProvider
+    check to see if password appears in the basic provider settings
+    as this is a security risk
+
+    Will write errors to stderr
+    """
+    if 'password' in provider_settings:
+        if not is_file_secure(config_file):
+            print("""\nWarning: Password is found in an insecure cqlshrc file.
+                    The file is owned or readable by other users on the system.""",
+                  end='',
+                  file=sys.stderr)
+        print("""\nNotice: Credentials in the cqlshrc file is deprecated and
+        will be ignored in the future.\n
+        Please use a credentials file to
+        specify the username and password.\n""",
+              file=sys.stderr)
+
+
+def load_auth_provider(config_file=None, cred_file=None, username=None, password=None):
+    """
+    Function which loads an auth provider from available config.
+
+    Params:
+    * config_file ..: path to cqlsh config file (usually ~/.cassandra/cqlshrc).
+    * cred_file ....: path to cqlsh credentials file (default is  ~/.cassandra/credentials).
+    * username .....: override used to return PlainTextAuthProvider according to legacy case
+    * password .....: override used to return PlainTextAuthProvider according to legacy case
+
+    Will attempt to load an auth provider from available config file, using what's found in
+    credentials file as an override.
+
+    Config file is expected to list module name /class in the *auth_provider*
+    section for dynamic loading (which is to be of type auth_provider)
+
+    Additional params passed to the constructor of class should be specified
+    in the *auth_provider* section and can be freely named to match
+    auth provider's expectation.
+
+    If passed username and password these will be overridden and passed to auth provider
+
+    None is returned if no possible auth provider is found, and no username/password can be
+    returned.  If a username is found, system will assume that PlainTextAuthProvider was
+    specified
+
+    EXAMPLE  CQLSHRC:
+    # .. inside cqlshrc file
+
+    [auth_provider]
+    module = cassandra.auth
+    classname = PlainTextAuthProvider
+    username = user1
+    password = password1
+
+    if credentials file is specified put relevant properties under the class name
+    EXAMPLE
+    # ... inside credentials file for above example
+    [PlainTextAuthProvider]
+    password = password2
+
+    Credential attributes will override found in the cqlshrc.
+    in the above example, PlainTextAuthProvider would be used with a password of 'password2',
+    and username of 'user1'
+    """
+
+    def get_settings_from_config(section_name,
+                                 conf_file,
+                                 interpolation=configparser.BasicInterpolation()):
+        """
+        Returns dict from section_name, and ini based conf_file
+
+        * section_name ..: Section to read map of properties from (ex: [auth_provider])
+        * conf_file .....: Ini based config file to read.  Will return empty dict if None.
+        * interpolation .: Interpolation to use.
+
+        If section is not found, or conf_file is None, function will return an empty dictionary.
+        """
+        conf = configparser.ConfigParser(interpolation=interpolation)
+        if conf_file is None:
+            return {}
+
+        conf.read(conf_file)
+        if section_name in conf.sections():
+            return dict(conf.items(section_name))
+        return {}
+
+    def get_cred_file_settings(classname, creds_file):
+        # Since this is the credentials file we may be encountering raw strings
+        # as these are what passwords, or security tokens may inadvertently fall into
+        # we don't want interpolation to mess with them.
+        return get_settings_from_config(
+            section_name=classname,
+            conf_file=creds_file,
+            interpolation=None)
+
+    def get_auth_provider_settings(conf_file):
+        return get_settings_from_config(
+            section_name='auth_provider',
+            conf_file=conf_file)
+
+    def get_legacy_settings(legacy_username, legacy_password):
+        result = {}
+        if legacy_username is not None:
+            result['username'] = legacy_username
+        if legacy_password is not None:
+            result['password'] = legacy_password
+        return result
+
+    provider_settings = get_auth_provider_settings(config_file)
+
+    module_name = provider_settings.pop('module', None)
+    class_name = provider_settings.pop('classname', None)
+
+    if module_name is None and class_name is None:
+        # not specified, default to plaintext auth provider
+        module_name = 'cassandra.auth'
+        class_name = 'PlainTextAuthProvider'
+    elif module_name is None or class_name is None:
+        # then this was PARTIALLY specified.
+        return None
+
+    credential_settings = get_cred_file_settings(class_name, cred_file)
+
+    if module_name == 'cassandra.auth' and class_name == 'PlainTextAuthProvider':
+        # merge credential settings as overrides on top of provider settings.
+
+        # we need to ensure that password property gets "set" in all cases.
+        # this is to support the ability to give the user a prompt in other parts
+        # of the code.
+        _warn_for_plain_text_security(config_file, provider_settings)
+        ctor_args = {'password': None,
+                     **provider_settings,
+                     **credential_settings,
+                     **get_legacy_settings(username, password)}
+        # if no username, we can't create PlainTextAuthProvider
+        if 'username' not in ctor_args:
+            return None
+    else:
+        # merge credential settings as overrides on top of provider settings.
+        ctor_args = {**provider_settings,
+                     **credential_settings,
+                     **get_legacy_settings(username, password)}
+
+    # Load class definitions
+    module = import_module(module_name)
+    auth_provider_klass = getattr(module, class_name)
+
+    # instantiate the class
+    return auth_provider_klass(**ctor_args)
diff --git a/pylib/cqlshlib/copyutil.py b/pylib/cqlshlib/copyutil.py
index c1bdffe..2a8a11d 100644
--- a/pylib/cqlshlib/copyutil.py
+++ b/pylib/cqlshlib/copyutil.py
@@ -16,7 +16,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import unicode_literals
 import csv
 import datetime
 import json
@@ -27,32 +26,27 @@
 import random
 import re
 import signal
-import six
 import struct
 import sys
 import threading
 import time
 import traceback
-import errno
 
 from bisect import bisect_right
 from calendar import timegm
 from collections import defaultdict, namedtuple
 from decimal import Decimal
 from random import randint
-from io import BytesIO, StringIO
+from io import StringIO
 from select import select
 from uuid import UUID
-from .util import profile_on, profile_off
 
-from six import ensure_str, ensure_text
-from six.moves import configparser
-from six.moves import range
-from six.moves.queue import Queue
+import configparser
+from queue import Queue
 
 from cassandra import OperationTimedOut
 from cassandra.cluster import Cluster, DefaultConnection
-from cassandra.cqltypes import ReversedType, UserType, BytesType, VarcharType
+from cassandra.cqltypes import ReversedType, UserType, VarcharType
 from cassandra.metadata import protect_name, protect_names, protect_value
 from cassandra.policies import RetryPolicy, WhiteListRoundRobinPolicy, DCAwareRoundRobinPolicy, FallthroughRetryPolicy
 from cassandra.query import BatchStatement, BatchType, SimpleStatement, tuple_factory
@@ -67,6 +61,7 @@
 PROFILE_ON = False
 STRACE_ON = False
 DEBUG = False  # This may be set to True when initializing the task
+# TODO: review this for MacOS, maybe use in ('Linux', 'Darwin')
 IS_LINUX = platform.system() == 'Linux'
 
 CopyOptions = namedtuple('CopyOptions', 'copy dialect unrecognized')
@@ -85,14 +80,14 @@
         printmsg(msg)
 
 
-def printmsg(msg, eol='\n', encoding='utf8'):
+def printmsg(msg, eol='\n'):
     sys.stdout.write(msg)
     sys.stdout.write(eol)
     sys.stdout.flush()
 
 
 # Keep arguments in sync with printmsg
-def swallowmsg(msg, eol='', encoding=''):
+def swallowmsg(msg, eol='\n'):
     None
 
 
@@ -175,7 +170,7 @@
         for ch in self.channels:
             try:
                 ch.close()
-            except Exception:
+            except ValueError:
                 pass
 
 
@@ -201,10 +196,8 @@
         while True:
             try:
                 readable, _, _ = select(self._readers, [], [], timeout)
-            except select.error as exc:
-                # Do not abort on window resize:
-                if exc[0] != errno.EINTR:
-                    raise
+            except OSError:
+                raise
             else:
                 break
         for r in readable:
@@ -237,7 +230,7 @@
         for ch in self.channels:
             try:
                 ch.close()
-            except Exception:
+            except ValueError:
                 pass
 
 
@@ -261,8 +254,7 @@
             DEBUG = True
 
         # do not display messages when exporting to STDOUT unless --debug is set
-        self.printmsg = printmsg if self.fname is not None or direction == 'from' or DEBUG \
-            else swallowmsg
+        self.printmsg = printmsg if self.fname is not None or direction == 'from' or DEBUG else swallowmsg
         self.options = self.parse_options(opts, direction)
 
         self.num_processes = self.options.copy['numprocesses']
@@ -292,7 +284,7 @@
             return opts
 
         configs = configparser.RawConfigParser()
-        configs.readfp(open(config_file))
+        configs.read_file(open(config_file))
 
         ret = dict()
         config_sections = list(['copy', 'copy-%s' % (direction,),
@@ -334,9 +326,9 @@
         opts = self.clean_options(self.maybe_read_config_file(opts, direction))
 
         dialect_options = dict()
-        dialect_options['quotechar'] = ensure_str(opts.pop('quote', '"'))
-        dialect_options['escapechar'] = ensure_str(opts.pop('escape', '\\'))
-        dialect_options['delimiter'] = ensure_str(opts.pop('delimiter', ','))
+        dialect_options['quotechar'] = opts.pop('quote', '"')
+        dialect_options['escapechar'] = opts.pop('escape', '\\')
+        dialect_options['delimiter'] = opts.pop('delimiter', ',')
         if dialect_options['quotechar'] == dialect_options['escapechar']:
             dialect_options['doublequote'] = True
             del dialect_options['escapechar']
@@ -344,7 +336,7 @@
             dialect_options['doublequote'] = False
 
         copy_options = dict()
-        copy_options['nullval'] = ensure_str(opts.pop('null', ''))
+        copy_options['nullval'] = opts.pop('null', '')
         copy_options['header'] = bool(opts.pop('header', '').lower() == 'true')
         copy_options['encoding'] = opts.pop('encoding', 'utf8')
         copy_options['maxrequests'] = int(opts.pop('maxrequests', 6))
@@ -366,7 +358,7 @@
         copy_options['consistencylevel'] = shell.consistency_level
         copy_options['decimalsep'] = opts.pop('decimalsep', '.')
         copy_options['thousandssep'] = opts.pop('thousandssep', '')
-        copy_options['boolstyle'] = [ensure_str(s.strip()) for s in opts.pop('boolstyle', 'True, False').split(',')]
+        copy_options['boolstyle'] = [s.strip() for s in opts.pop('boolstyle', 'True, False').split(',')]
         copy_options['numprocesses'] = int(opts.pop('numprocesses', self.get_num_processes(16)))
         copy_options['begintoken'] = opts.pop('begintoken', '')
         copy_options['endtoken'] = opts.pop('endtoken', '')
@@ -569,7 +561,7 @@
 
         if self.header:
             writer = csv.writer(self.current_dest.output, **self.options.dialect)
-            writer.writerow([ensure_str(c) for c in self.columns])
+            writer.writerow([str(c) for c in self.columns])
 
         return True
 
@@ -665,7 +657,7 @@
             return 0
 
         columns = "[" + ", ".join(self.columns) + "]"
-        self.printmsg("\nStarting copy of %s.%s with columns %s." % (self.ks, self.table, columns), encoding=self.encoding)
+        self.printmsg("\nStarting copy of %s.%s with columns %s." % (self.ks, self.table, columns))
 
         params = self.make_params()
         for i in range(self.num_processes):
@@ -774,6 +766,7 @@
             #  For the last ring interval we query the same replicas that hold the first token in the ring
             if previous is not None and (not end_token or previous < end_token):
                 ranges[(previous, end_token)] = first_range_data
+            # TODO: fix this logic added in 4.0: if previous is None, then it can't be compared with less than
             elif previous is None and (not end_token or previous < end_token):
                 previous = begin_token if begin_token else min_token
                 ranges[(previous, end_token)] = first_range_data
@@ -885,12 +878,13 @@
         self.max_rows = options.copy['maxrows']
         self.skip_rows = options.copy['skiprows']
         self.fname = fname
-        self.sources = None  # must be created later due to pickle problems on Windows
+        self.sources = None  # might be initialised directly here? (see CASSANDRA-17350)
         self.num_sources = 0
         self.current_source = None
         self.num_read = 0
 
-    def get_source(self, paths):
+    @staticmethod
+    def get_source(paths):
         """
          Return a source generator. Each source is a named tuple
          wrapping the source input, file name and a boolean indicating
@@ -912,7 +906,7 @@
                     raise IOError("Can't open %r for reading: no matching file found" % (path,))
 
                 for f in result:
-                    yield (make_source(f))
+                    yield make_source(f)
 
     def start(self):
         self.sources = self.get_source(self.fname)
@@ -1167,7 +1161,7 @@
             return 0
 
         columns = "[" + ", ".join(self.valid_columns) + "]"
-        self.printmsg("\nStarting copy of %s.%s with columns %s." % (self.ks, self.table, columns), encoding=self.encoding)
+        self.printmsg("\nStarting copy of %s.%s with columns %s." % (self.ks, self.table, columns))
 
         try:
             params = self.make_params()
@@ -1300,9 +1294,9 @@
         self.inpipe = inpipe
         self.outpipe = outpipe
         self.worker_pipes = worker_pipes
-        self.inmsg = None  # must be created after forking on Windows
-        self.outmsg = None  # must be created after forking on Windows
-        self.worker_channels = None  # must be created after forking on Windows
+        self.inmsg = None  # might be initialised directly here? (see CASSANDRA-17350)
+        self.outmsg = None  # might be initialised directly here? (see CASSANDRA-17350)
+        self.worker_channels = None  # might be initialised directly here? (see CASSANDRA-17350)
         self.reader = FilesReader(fname, options) if fname else PipeReader(inpipe, options)
         self.send_meter = RateMeter(log_fcn=None, update_interval=1)
         self.ingest_rate = options.copy['ingestrate']
@@ -1341,7 +1335,8 @@
         try:
             reader.start()
         except IOError as exc:
-            self.outmsg.send(ImportTaskError(exc.__class__.__name__, exc.message if hasattr(exc, 'message') else str(exc)))
+            self.outmsg.send(
+                ImportTaskError(exc.__class__.__name__, exc.message if hasattr(exc, 'message') else str(exc)))
 
         channels = self.worker_channels
         max_pending_chunks = self.max_pending_chunks
@@ -1370,7 +1365,8 @@
                     if rows:
                         sent += self.send_chunk(ch, rows)
                 except Exception as exc:
-                    self.outmsg.send(ImportTaskError(exc.__class__.__name__, exc.message if hasattr(exc, 'message') else str(exc)))
+                    self.outmsg.send(
+                        ImportTaskError(exc.__class__.__name__, exc.message if hasattr(exc, 'message') else str(exc)))
 
                 if reader.exhausted:
                     break
@@ -1406,8 +1402,8 @@
         super(ChildProcess, self).__init__(target=target)
         self.inpipe = params['inpipe']
         self.outpipe = params['outpipe']
-        self.inmsg = None  # must be initialized after fork on Windows
-        self.outmsg = None  # must be initialized after fork on Windows
+        self.inmsg = None  # might be initialised directly here? (see CASSANDRA-17350)
+        self.outmsg = None  # might be initialised directly here? (see CASSANDRA-17350)
         self.ks = params['ks']
         self.table = params['table']
         self.local_dc = params['local_dc']
@@ -1728,7 +1724,7 @@
             return  # no rows in this range
 
         try:
-            output = StringIO() if six.PY3 else BytesIO()
+            output = StringIO()
             writer = csv.writer(output, **self.options.dialect)
 
             for row in rows:
@@ -1758,7 +1754,7 @@
                               float_precision=cqltype.precision, nullval=self.nullval, quote=False,
                               decimal_sep=self.decimal_sep, thousands_sep=self.thousands_sep,
                               boolean_styles=self.boolean_styles)
-        return formatted if six.PY3 else formatted.encode('utf8')
+        return formatted
 
     def close(self):
         ChildProcess.close(self)
@@ -1898,7 +1894,7 @@
         select_query = 'SELECT * FROM %s.%s WHERE %s' % (protect_name(parent.ks),
                                                          protect_name(parent.table),
                                                          where_clause)
-        return parent.session.prepare(ensure_str(select_query))
+        return parent.session.prepare(select_query)
 
     @staticmethod
     def unprotect(v):
@@ -1934,20 +1930,20 @@
                 return BlobType(v[2:].decode("hex"))
 
         def convert_text(v, **_):
-            return ensure_str(v)
+            return str(v)
 
         def convert_uuid(v, **_):
             return UUID(v)
 
         def convert_bool(v, **_):
-            return True if v.lower() == ensure_str(self.boolean_styles[0]).lower() else False
+            return True if v.lower() == self.boolean_styles[0].lower() else False
 
         def get_convert_integer_fcn(adapter=int):
             """
             Return a slow and a fast integer conversion function depending on self.thousands_sep
             """
             if self.thousands_sep:
-                return lambda v, ct=cql_type: adapter(v.replace(self.thousands_sep, ensure_str('')))
+                return lambda v, ct=cql_type: adapter(v.replace(self.thousands_sep, ''))
             else:
                 return lambda v, ct=cql_type: adapter(v)
 
@@ -1955,10 +1951,11 @@
             """
             Return a slow and a fast decimal conversion function depending on self.thousands_sep and self.decimal_sep
             """
-            empty_str = ensure_str('')
-            dot_str = ensure_str('.')
+            empty_str = ''
+            dot_str = '.'
             if self.thousands_sep and self.decimal_sep:
-                return lambda v, ct=cql_type: adapter(v.replace(self.thousands_sep, empty_str).replace(self.decimal_sep, dot_str))
+                return lambda v, ct=cql_type: \
+                    adapter(v.replace(self.thousands_sep, empty_str).replace(self.decimal_sep, dot_str))
             elif self.thousands_sep:
                 return lambda v, ct=cql_type: adapter(v.replace(self.thousands_sep, empty_str))
             elif self.decimal_sep:
@@ -2014,20 +2011,14 @@
             return ret
 
         # this should match all possible CQL and CQLSH datetime formats
-        p = re.compile(r"(\d{4})\-(\d{2})\-(\d{2})\s?(?:'T')?"  # YYYY-MM-DD[( |'T')]
+        p = re.compile(r"(\d{4})-(\d{2})-(\d{2})\s?(?:'T')?"  # YYYY-MM-DD[( |'T')]
                        + r"(?:(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{1,6}))?))?"  # [HH:MM[:SS[.NNNNNN]]]
                        + r"(?:([+\-])(\d{2}):?(\d{2}))?")  # [(+|-)HH[:]MM]]
 
         def convert_datetime(val, **_):
             try:
-                if six.PY2:
-                    # Python 2 implementation
-                    tval = time.strptime(val, self.date_time_format)
-                    return timegm(tval) * 1e3  # scale seconds to millis for the raw value
-                else:
-                    # Python 3 implementation
-                    dtval = datetime.datetime.strptime(val, self.date_time_format)
-                    return dtval.timestamp() * 1000
+                dtval = datetime.datetime.strptime(val, self.date_time_format)
+                return dtval.timestamp() * 1000
             except ValueError:
                 pass  # if it's not in the default format we try CQL formats
 
@@ -2078,8 +2069,8 @@
             """
             See ImmutableDict above for a discussion of why a special object is needed here.
             """
-            split_format_str = ensure_str('{%s}')
-            sep = ensure_str(':')
+            split_format_str = '{%s}'
+            sep = ':'
             return ImmutableDict(frozenset((convert_mandatory(ct.subtypes[0], v[0]), convert(ct.subtypes[1], v[1]))
                                  for v in [split(split_format_str % vv, sep=sep) for vv in split(val)]))
 
@@ -2092,8 +2083,8 @@
             Also note that it is possible that the subfield names in the csv are in the
             wrong order, so we must sort them according to ct.fieldnames, see CASSANDRA-12959.
             """
-            split_format_str = ensure_str('{%s}')
-            sep = ensure_str(':')
+            split_format_str = '{%s}'
+            sep = ':'
             vals = [v for v in [split(split_format_str % vv, sep=sep) for vv in split(val)]]
             dict_vals = dict((unprotect(v[0]), v[1]) for v in vals)
             sorted_converted_vals = [(n, convert(t, dict_vals[n]) if n in dict_vals else self.get_null_val())
@@ -2151,7 +2142,7 @@
         or "NULL" otherwise. Note that for counters we never use prepared statements, so we
         only check is_counter when use_prepared_statements is false.
         """
-        return None if self.use_prepared_statements else (ensure_str("0") if self.is_counter else ensure_str("NULL"))
+        return None if self.use_prepared_statements else ("0" if self.is_counter else "NULL")
 
     def convert_row(self, row):
         """
@@ -2436,7 +2427,6 @@
             if self.ttl >= 0:
                 query += 'USING TTL %s' % (self.ttl,)
             make_statement = self.wrap_make_statement(self.make_non_prepared_batch_statement)
-            query = ensure_str(query)
 
         conv = ImportConversion(self, table_meta, prepared_statement)
         tm = TokenMap(self.ks, self.hostname, self.local_dc, self.session)
@@ -2504,12 +2494,12 @@
             set_clause = []
             for i, value in enumerate(row):
                 if i in conv.primary_key_indexes:
-                    where_clause.append(ensure_text("{}={}").format(self.valid_columns[i], ensure_text(value)))
+                    where_clause.append("{}={}".format(self.valid_columns[i], str(value)))
                 else:
-                    set_clause.append(ensure_text("{}={}+{}").format(self.valid_columns[i], self.valid_columns[i], ensure_text(value)))
+                    set_clause.append("{}={}+{}".format(self.valid_columns[i], self.valid_columns[i], str(value)))
 
-            full_query_text = query % (ensure_text(',').join(set_clause), ensure_text(' AND ').join(where_clause))
-            statement.add(ensure_str(full_query_text))
+            full_query_text = query % (','.join(set_clause), ' AND '.join(where_clause))
+            statement.add(full_query_text)
         return statement
 
     def make_prepared_batch_statement(self, query, _, batch, replicas):
@@ -2533,7 +2523,7 @@
         statement = BatchStatement(batch_type=BatchType.UNLOGGED, consistency_level=self.consistency_level)
         statement.replicas = replicas
         statement.keyspace = self.ks
-        field_sep = b',' if six.PY2 else ','
+        field_sep = ','
         statement._statements_and_parameters = [(False, query % (field_sep.join(r),), ()) for r in batch['rows']]
         return statement
 
@@ -2642,7 +2632,8 @@
                     yield filter_replicas(replicas[ring_pos]), make_batch(chunk['id'], rows[i:i + max_batch_size])
             else:
                 # select only the first valid replica to guarantee more overlap or none at all
-                rows_by_replica[tuple(filter_replicas(replicas[ring_pos])[:1])].extend(rows)  # TODO: revisit tuple wrapper
+                # TODO: revisit tuple wrapper
+                rows_by_replica[tuple(filter_replicas(replicas[ring_pos])[:1])].extend(rows)
 
         # Now send the batches by replica
         for replicas, rows in rows_by_replica.items():
@@ -2664,6 +2655,7 @@
             future.add_callbacks(callback=self.result_callback, callback_args=(batch, chunk),
                                  errback=self.err_callback, errback_args=(batch, chunk, replicas))
 
+    # TODO: review why this is defined twice
     def report_error(self, err, chunk=None, rows=None, attempts=1, final=True):
         if self.debug and sys.exc_info()[1] == err:
             traceback.print_exc()
diff --git a/pylib/cqlshlib/cql3handling.py b/pylib/cqlshlib/cql3handling.py
index c45b310..03e06d8 100644
--- a/pylib/cqlshlib/cql3handling.py
+++ b/pylib/cqlshlib/cql3handling.py
@@ -18,8 +18,9 @@
 from cqlshlib import helptopics
 from cqlshlib.cqlhandling import CqlParsingRuleSet, Hint
 
-simple_cql_types = set(('ascii', 'bigint', 'blob', 'boolean', 'counter', 'date', 'decimal', 'double', 'duration', 'float',
-                        'inet', 'int', 'smallint', 'text', 'time', 'timestamp', 'timeuuid', 'tinyint', 'uuid', 'varchar', 'varint'))
+simple_cql_types = {'ascii', 'bigint', 'blob', 'boolean', 'counter', 'date', 'decimal', 'double', 'duration', 'float',
+                    'inet', 'int', 'smallint', 'text', 'time', 'timestamp', 'timeuuid', 'tinyint', 'uuid', 'varchar',
+                    'varint'}
 simple_cql_types.difference_update(('set', 'map', 'list'))
 
 cqldocs = helptopics.CQL3HelpTopics()
@@ -34,7 +35,8 @@
         return 'Unexpected table structure; may not translate correctly to CQL. ' + self.msg
 
 
-SYSTEM_KEYSPACES = ('system', 'system_schema', 'system_traces', 'system_auth', 'system_distributed', 'system_views', 'system_virtual_schema')
+SYSTEM_KEYSPACES = ('system', 'system_schema', 'system_traces', 'system_auth', 'system_distributed', 'system_views',
+                    'system_virtual_schema')
 NONALTERBALE_KEYSPACES = ('system', 'system_schema', 'system_views', 'system_virtual_schema')
 
 
@@ -58,7 +60,8 @@
         # (CQL3 option name, schema_columnfamilies column name (or None if same),
         #  list of known map keys)
         ('compaction', 'compaction_strategy_options',
-            ('class', 'max_threshold', 'tombstone_compaction_interval', 'tombstone_threshold', 'enabled', 'unchecked_tombstone_compaction', 'only_purge_repaired_tombstones', 'provide_overlapping_tombstones')),
+            ('class', 'max_threshold', 'tombstone_compaction_interval', 'tombstone_threshold', 'enabled',
+             'unchecked_tombstone_compaction', 'only_purge_repaired_tombstones', 'provide_overlapping_tombstones')),
         ('compression', 'compression_parameters',
             ('sstable_compression', 'chunk_length_kb', 'crc_check_chance')),
         ('caching', None,
@@ -455,7 +458,7 @@
     else:
         return ["'class'"]
     if repclass == 'SimpleStrategy':
-        opts = set(('replication_factor',))
+        opts = {'replication_factor'}
     elif repclass == 'NetworkTopologyStrategy':
         return [Hint('<dc_name>')]
     return list(map(escape_value, opts.difference(keysseen)))
@@ -744,7 +747,13 @@
 <orderByClause> ::= [ordercol]=<cident> ( "ASC" | "DESC" )?
                   ;
 <groupByClause> ::= [groupcol]=<cident>
+                  | <functionName><groupByFunctionArguments>
                   ;
+<groupByFunctionArguments> ::= "(" ( <groupByFunctionArgument> ( "," <groupByFunctionArgument> )* )? ")"
+                             ;
+<groupByFunctionArgument> ::= [groupcol]=<cident>
+                            | <term>
+                            ;
 '''
 
 
@@ -958,7 +967,7 @@
                ;
 <conditions> ::=  <condition> ( "AND" <condition> )*
                ;
-<condition_op_and_rhs> ::= (("=" | "<" | ">" | "<=" | ">=" | "!=") <term>)
+<condition_op_and_rhs> ::= (("=" | "<" | ">" | "<=" | ">=" | "!=" | "CONTAINS" ( "KEY" )? ) <term>)
                            | ("IN" "(" <term> ( "," <term> )* ")" )
                          ;
 <condition> ::= conditioncol=<cident>
@@ -1403,21 +1412,21 @@
 
 
 syntax_rules += r'''
-<alterTableStatement> ::= "ALTER" wat=( "COLUMNFAMILY" | "TABLE" ) cf=<columnFamilyName>
+<alterTableStatement> ::= "ALTER" wat=( "COLUMNFAMILY" | "TABLE" ) ("IF" "EXISTS")? cf=<columnFamilyName>
                                <alterInstructions>
                         ;
-<alterInstructions> ::= "ADD" newcol=<cident> <storageType> ("static")?
-                      | "DROP" existcol=<cident>
+<alterInstructions> ::= "ADD" ("IF" "NOT" "EXISTS")? newcol=<cident> <storageType> ("static")?
+                      | "DROP" ("IF" "EXISTS")? existcol=<cident>
                       | "WITH" <cfamProperty> ( "AND" <cfamProperty> )*
-                      | "RENAME" existcol=<cident> "TO" newcol=<cident>
+                      | "RENAME" ("IF" "EXISTS")? existcol=<cident> "TO" newcol=<cident>
                          ( "AND" existcol=<cident> "TO" newcol=<cident> )*
                       ;
 
-<alterUserTypeStatement> ::= "ALTER" "TYPE" ut=<userTypeName>
+<alterUserTypeStatement> ::= "ALTER" "TYPE" ("IF" "EXISTS")? ut=<userTypeName>
                                <alterTypeInstructions>
                              ;
-<alterTypeInstructions> ::= "ADD" newcol=<cident> <storageType>
-                           | "RENAME" existcol=<cident> "TO" newcol=<cident>
+<alterTypeInstructions> ::= "ADD" ("IF" "NOT" "EXISTS")? newcol=<cident> <storageType>
+                           | "RENAME" ("IF" "EXISTS")? existcol=<cident> "TO" newcol=<cident>
                               ( "AND" existcol=<cident> "TO" newcol=<cident> )*
                            ;
 '''
@@ -1433,7 +1442,7 @@
 @completer_for('alterTypeInstructions', 'existcol')
 def alter_type_field_completer(ctxt, cass):
     layout = get_ut_layout(ctxt, cass)
-    fields = [tuple[0] for tuple in layout]
+    fields = [atuple[0] for atuple in layout]
     return list(map(maybe_escape_name, fields))
 
 
@@ -1442,7 +1451,7 @@
 
 
 syntax_rules += r'''
-<alterKeyspaceStatement> ::= "ALTER" wat=( "KEYSPACE" | "SCHEMA" ) ks=<alterableKeyspaceName>
+<alterKeyspaceStatement> ::= "ALTER" wat=( "KEYSPACE" | "SCHEMA" ) ("IF" "EXISTS")? ks=<alterableKeyspaceName>
                                  "WITH" <property> ( "AND" <property> )*
                            ;
 '''
@@ -1452,11 +1461,11 @@
              ;
 
 <createUserStatement> ::= "CREATE" "USER" ( "IF" "NOT" "EXISTS" )? <username>
-                              ( "WITH" "PASSWORD" <stringLiteral> )?
+                              ( "WITH" ("HASHED")? "PASSWORD" <stringLiteral> )?
                               ( "SUPERUSER" | "NOSUPERUSER" )?
                         ;
 
-<alterUserStatement> ::= "ALTER" "USER" <username>
+<alterUserStatement> ::= "ALTER" "USER" ("IF" "EXISTS")? <username>
                               ( "WITH" "PASSWORD" <stringLiteral> )?
                               ( "SUPERUSER" | "NOSUPERUSER" )?
                        ;
@@ -1478,11 +1487,11 @@
                               ( "WITH" <roleProperty> ("AND" <roleProperty>)*)?
                         ;
 
-<alterRoleStatement> ::= "ALTER" "ROLE" <rolename>
+<alterRoleStatement> ::= "ALTER" "ROLE" ("IF" "EXISTS")? <rolename>
                               ( "WITH" <roleProperty> ("AND" <roleProperty>)*)?
                        ;
 
-<roleProperty> ::= "PASSWORD" "=" <stringLiteral>
+<roleProperty> ::= (("HASHED")? "PASSWORD") "=" <stringLiteral>
                  | "OPTIONS" "=" <mapLiteral>
                  | "SUPERUSER" "=" <boolean>
                  | "LOGIN" "=" <boolean>
@@ -1525,7 +1534,7 @@
                | "EXECUTE"
                ;
 
-<permissionExpr> ::= ( <permission> "PERMISSION"? )
+<permissionExpr> ::= ( [newpermission]=<permission> "PERMISSION"? ( "," [newpermission]=<permission> "PERMISSION"? )* )
                    | ( "ALL" "PERMISSIONS"? )
                    ;
 
@@ -1537,6 +1546,7 @@
 
 <dataResource> ::= ( "ALL" "KEYSPACES" )
                  | ( "KEYSPACE" <keyspaceName> )
+                 | ( "ALL" "TABLES" "IN" "KEYSPACE" <keyspaceName> )
                  | ( "TABLE"? <columnFamilyName> )
                  ;
 
@@ -1559,6 +1569,16 @@
 '''
 
 
+@completer_for('permissionExpr', 'newpermission')
+def permission_completer(ctxt, _):
+    new_permissions = set([permission.upper() for permission in ctxt.get_binding('newpermission')])
+    all_permissions = set([permission.arg for permission in ctxt.ruleset['permission'].arg])
+    suggestions = all_permissions - new_permissions
+    if len(suggestions) == 0:
+        return [Hint('No more permissions here.')]
+    return suggestions
+
+
 @completer_for('username', 'name')
 def username_name_completer(ctxt, cass):
     def maybe_quote(name):
diff --git a/pylib/cqlshlib/cqlhandling.py b/pylib/cqlshlib/cqlhandling.py
index 3da0ab1..ca12a25 100644
--- a/pylib/cqlshlib/cqlhandling.py
+++ b/pylib/cqlshlib/cqlhandling.py
@@ -24,13 +24,12 @@
 
 Hint = pylexotron.Hint
 
-cql_keywords_reserved = set((
-    'add', 'allow', 'alter', 'and', 'apply', 'asc', 'authorize', 'batch', 'begin', 'by', 'columnfamily', 'create',
-    'delete', 'desc', 'describe', 'drop', 'entries', 'execute', 'from', 'full', 'grant', 'if', 'in', 'index',
-    'infinity', 'insert', 'into', 'is', 'keyspace', 'limit', 'materialized', 'modify', 'nan', 'norecursive', 'not',
-    'null', 'of', 'on', 'or', 'order', 'primary', 'rename', 'revoke', 'schema', 'select', 'set', 'table', 'to', 'token',
-    'truncate', 'unlogged', 'update', 'use', 'using', 'view', 'where', 'with'
-))
+cql_keywords_reserved = {'add', 'allow', 'alter', 'and', 'apply', 'asc', 'authorize', 'batch', 'begin', 'by',
+                         'columnfamily', 'create', 'delete', 'desc', 'describe', 'drop', 'entries', 'execute', 'from',
+                         'full', 'grant', 'if', 'in', 'index', 'infinity', 'insert', 'into', 'is', 'keyspace', 'limit',
+                         'materialized', 'modify', 'nan', 'norecursive', 'not', 'null', 'of', 'on', 'or', 'order',
+                         'primary', 'rename', 'revoke', 'schema', 'select', 'set', 'table', 'to', 'token', 'truncate',
+                         'unlogged', 'update', 'use', 'using', 'view', 'where', 'with'}
 """
 Set of reserved keywords in CQL.
 
@@ -60,7 +59,7 @@
     )
 
     def __init__(self, *args, **kwargs):
-        pylexotron.ParsingRuleSet.__init__(self, *args, **kwargs)
+        pylexotron.ParsingRuleSet.__init__(self)
 
         # note: commands_end_with_newline may be extended by callers.
         self.commands_end_with_newline = set()
@@ -111,12 +110,6 @@
                     # don't put any 'endline' tokens in output
                     continue
 
-            # Convert all unicode tokens to ascii, where possible.  This
-            # helps avoid problems with performing unicode-incompatible
-            # operations on tokens (like .lower()).  See CASSANDRA-9083
-            # for one example of this.
-            str_token = t[1]
-
             curstmt.append(t)
             if t[0] == 'endtoken':
                 term_on_nl = False
@@ -158,10 +151,10 @@
                     in_batch = True
         return output, in_batch or in_pg_string
 
-    def cql_complete_single(self, text, partial, init_bindings={}, ignore_case=True,
+    def cql_complete_single(self, text, partial, init_bindings=None, ignore_case=True,
                             startsymbol='Start'):
         tokens = (self.cql_split_statements(text)[0] or [[]])[-1]
-        bindings = init_bindings.copy()
+        bindings = {} if init_bindings is None else init_bindings.copy()
 
         # handle some different completion scenarios- in particular, completing
         # inside a string literal
diff --git a/pylib/cqlshlib/displaying.py b/pylib/cqlshlib/displaying.py
index ef076f7..424d633 100644
--- a/pylib/cqlshlib/displaying.py
+++ b/pylib/cqlshlib/displaying.py
@@ -14,8 +14,6 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import unicode_literals
-
 from collections import defaultdict
 
 RED = '\033[0;1;31m'
@@ -43,7 +41,7 @@
     return val
 
 
-class FormattedValue(object):
+class FormattedValue:
 
     def __init__(self, strval, coloredval=None, displaywidth=None):
         self.strval = strval
diff --git a/pylib/cqlshlib/formatting.py b/pylib/cqlshlib/formatting.py
index e521544..ebf9fc7 100644
--- a/pylib/cqlshlib/formatting.py
+++ b/pylib/cqlshlib/formatting.py
@@ -14,18 +14,12 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import unicode_literals
-
-import binascii
 import calendar
 import datetime
 import math
 import os
 import re
 import sys
-import platform
-
-from six import ensure_text
 
 from collections import defaultdict
 
@@ -35,8 +29,6 @@
 from .displaying import colorme, get_str, FormattedValue, DEFAULT_VALUE_COLORS, NO_COLOR_MAP
 from .util import UTC
 
-is_win = platform.system() == 'Windows'
-
 unicode_controlchars_re = re.compile(r'[\x00-\x1f\x7f-\xa0]')
 controlchars_re = re.compile(r'[\x00-\x1f\x7f-\xff]')
 
@@ -126,7 +118,7 @@
         self.milliseconds_only = milliseconds_only  # the microseconds part, .NNNNNN, wil be rounded to .NNN
 
 
-class CqlType(object):
+class CqlType:
     """
     A class for converting a string into a cql type name that can match a formatter
     and a list of its sub-types, if any.
@@ -208,7 +200,7 @@
 
 
 def format_value_default(val, colormap, **_):
-    val = ensure_text(str(val))
+    val = str(val)
     escapedval = val.replace('\\', '\\\\')
     bval = controlchars_re.sub(_show_control_chars, escapedval)
     return bval if colormap is NO_COLOR_MAP else color_text(bval, colormap)
@@ -240,7 +232,7 @@
     return registrator
 
 
-class BlobType(object):
+class BlobType:
     def __init__(self, val):
         self.val = val
 
@@ -250,7 +242,7 @@
 
 @formatter_for('BlobType')
 def format_value_blob(val, colormap, **_):
-    bval = ensure_text('0x') + ensure_text(binascii.hexlify(val))
+    bval = '0x' + val.hex()
     return colorme(bval, colormap, 'blob')
 
 
@@ -260,7 +252,7 @@
 
 
 def format_python_formatted_type(val, colormap, color, quote=False):
-    bval = ensure_text(str(val))
+    bval = str(val)
     if quote:
         bval = "'%s'" % bval
     return colorme(bval, colormap, color)
@@ -330,7 +322,7 @@
 def format_integer_type(val, colormap, thousands_sep=None, **_):
     # base-10 only for now; support others?
     bval = format_integer_with_thousands_sep(val, thousands_sep) if thousands_sep else str(val)
-    bval = ensure_text(bval)
+    bval = str(bval)
     return colorme(bval, colormap, 'int')
 
 
@@ -365,7 +357,7 @@
         if date_time_format.milliseconds_only:
             bval = round_microseconds(bval)
     else:
-        bval = ensure_text(str(val))
+        bval = str(val)
 
     if quote:
         bval = "'%s'" % bval
diff --git a/pylib/cqlshlib/helptopics.py b/pylib/cqlshlib/helptopics.py
index 46cd156..9be56b9 100644
--- a/pylib/cqlshlib/helptopics.py
+++ b/pylib/cqlshlib/helptopics.py
@@ -15,7 +15,7 @@
 # limitations under the License.
 
 
-class CQL3HelpTopics(object):
+class CQL3HelpTopics:
     def get_help_topics(self):
         return [t[5:] for t in dir(self) if t.startswith('help_')]
 
diff --git a/pylib/cqlshlib/saferscanner.py b/pylib/cqlshlib/saferscanner.py
index 6d7ba57..2c2b610 100644
--- a/pylib/cqlshlib/saferscanner.py
+++ b/pylib/cqlshlib/saferscanner.py
@@ -19,7 +19,6 @@
 # regex in-pattern flags. Any of those can break correct operation of Scanner.
 
 import re
-import six
 try:
     from sre_constants import BRANCH, SUBPATTERN, GROUPREF, GROUPREF_IGNORE, GROUPREF_EXISTS
 except ImportError:
@@ -53,23 +52,6 @@
         return re.sre_parse.SubPattern(sub.pattern, scrubbedsub)
 
 
-class Py2SaferScanner(SaferScannerBase):
-
-    def __init__(self, lexicon, flags=0):
-        self.lexicon = lexicon
-        p = []
-        s = re.sre_parse.Pattern()
-        s.flags = flags
-        for phrase, action in lexicon:
-            p.append(re.sre_parse.SubPattern(s, [
-                (SUBPATTERN, (len(p) + 1, self.subpat(phrase, flags))),
-            ]))
-        s.groups = len(p) + 1
-        p = re.sre_parse.SubPattern(s, [(BRANCH, (None, p))])
-        self.p = p
-        self.scanner = re.sre_compile.compile(p)
-
-
 class Py36SaferScanner(SaferScannerBase):
 
     def __init__(self, lexicon, flags=0):
@@ -118,7 +100,7 @@
         self.scanner = re._compiler.compile(p)
 
 
-SaferScanner = Py36SaferScanner if six.PY3 else Py2SaferScanner
+SaferScanner = Py36SaferScanner
 if version_info >= (3, 11):
     SaferScanner = Py311SaferScanner
 elif version_info >= (3, 8):
diff --git a/pylib/cqlshlib/setup.cfg b/pylib/cqlshlib/setup.cfg
deleted file mode 100644
index 6c523ee..0000000
--- a/pylib/cqlshlib/setup.cfg
+++ /dev/null
@@ -1,4 +0,0 @@
-[nosetests]
-verbosity=3
-detailed-errors=1
-with-xunit=1
diff --git a/pylib/cqlshlib/sslhandling.py b/pylib/cqlshlib/sslhandling.py
index 8a7592c..4fc6eae 100644
--- a/pylib/cqlshlib/sslhandling.py
+++ b/pylib/cqlshlib/sslhandling.py
@@ -18,7 +18,7 @@
 import sys
 import ssl
 
-from six.moves import configparser
+import configparser
 
 
 def ssl_settings(host, config_file, env=os.environ):
@@ -39,7 +39,7 @@
     either in the config file or as an environment variable.
     Environment variables override any options set in cqlsh config file.
     """
-    configs = configparser.SafeConfigParser()
+    configs = configparser.ConfigParser()
     configs.read(config_file)
 
     def get_option(section, option):
@@ -49,16 +49,9 @@
             return None
 
     def get_best_tls_protocol(ssl_ver_str):
-        # newer python versions suggest to use PROTOCOL_TLS to negotiate the highest TLS version.
-        # older protocol versions have been deprecated:
-        # https://docs.python.org/2/library/ssl.html#ssl.PROTOCOL_TLS
-        # https://docs.python.org/3/library/ssl.html#ssl.PROTOCOL_TLS
         if ssl_ver_str:
-            return getattr(ssl, "PROTOCOL_%s" % ssl_ver_str, None)
-        for protocol in ['PROTOCOL_TLS', 'PROTOCOL_TLSv1_2', 'PROTOCOL_TLSv1_1', 'PROTOCOL_TLSv1']:
-            if hasattr(ssl, protocol):
-                return getattr(ssl, protocol)
-        return None
+            print("Warning: Explicit SSL and TLS versions in the cqlshrc file or in SSL_VERSION environment property are ignored as the protocol is auto-negotiated.\n")
+        return ssl.PROTOCOL_TLS
 
     ssl_validate = env.get('SSL_VALIDATE')
     if ssl_validate is None:
@@ -70,9 +63,6 @@
         ssl_version_str = get_option('ssl', 'version')
 
     ssl_version = get_best_tls_protocol(ssl_version_str)
-    if ssl_version is None:
-        sys.exit("%s is not a valid SSL protocol, please use one of "
-                 "TLS, TLSv1_2, TLSv1_1, or TLSv1" % (ssl_version_str,))
 
     ssl_certfile = env.get('SSL_CERTFILE')
     if ssl_certfile is None:
diff --git a/pylib/cqlshlib/test/__init__.py b/pylib/cqlshlib/test/__init__.py
index 4bb037e..635f0d9 100644
--- a/pylib/cqlshlib/test/__init__.py
+++ b/pylib/cqlshlib/test/__init__.py
@@ -13,5 +13,3 @@
 # 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.
-
-from .cassconnect import create_db, remove_db
diff --git a/pylib/cqlshlib/test/ansi_colors.py b/pylib/cqlshlib/test/ansi_colors.py
index 9fc3411..494b7c6 100644
--- a/pylib/cqlshlib/test/ansi_colors.py
+++ b/pylib/cqlshlib/test/ansi_colors.py
@@ -14,10 +14,7 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import unicode_literals
-
 import re
-import six
 
 LIGHT = 0o10
 
@@ -65,6 +62,7 @@
     for c in nameset:
         colors_by_name[c] = colorcode
 
+
 class ColoredChar(object):
     def __init__(self, c, colorcode):
         self.c = c
@@ -104,9 +102,10 @@
     def colortag(self):
         return lookup_letter_from_code(self._colorcode)
 
+
 class ColoredText(object):
     def __init__(self, source=''):
-        if isinstance(source, six.text_type):
+        if isinstance(source, str):
             plain, colors = self.parse_ansi_colors(source)
             self.chars = list(map(ColoredChar, plain, colors))
         else:
@@ -152,7 +151,6 @@
 
     @staticmethod
     def parse_sgr_param(curclr, paramstr):
-        oldclr = curclr
         args = list(map(int, paramstr.split(';')))
         for a in args:
             if a == 0:
@@ -179,15 +177,19 @@
     def colortags(self):
         return ''.join([c.colortag() for c in self.chars])
 
+
 def lookup_colorcode(name):
     return colors_by_name[name]
 
+
 def lookup_colorname(code):
     return colors_by_num.get(code, 'Unknown-color-0%o' % code)
 
+
 def lookup_colorletter(letter):
     return colors_by_letter[letter]
 
+
 def lookup_letter_from_code(code):
     letr = letters_by_num.get(code, ' ')
     if letr == 'n':
diff --git a/pylib/cqlshlib/test/basecase.py b/pylib/cqlshlib/test/basecase.py
index 096853f..ce4fd5c 100644
--- a/pylib/cqlshlib/test/basecase.py
+++ b/pylib/cqlshlib/test/basecase.py
@@ -29,14 +29,10 @@
 
 sys.path.append(cqlsh_dir)
 
-import cqlsh
-
-cql = cqlsh.cassandra.cluster.Cluster
-policy = cqlsh.cassandra.policies.RoundRobinPolicy()
-quote_name = cqlsh.cassandra.metadata.maybe_escape_name
-
 TEST_HOST = os.environ.get('CQL_TEST_HOST', '127.0.0.1')
 TEST_PORT = int(os.environ.get('CQL_TEST_PORT', 9042))
+TEST_USER = os.environ.get('CQL_TEST_USER', 'cassandra')
+TEST_PWD = os.environ.get('CQL_TEST_PWD')
 
 
 class BaseTestCase(unittest.TestCase):
diff --git a/pylib/cqlshlib/test/cassconnect.py b/pylib/cqlshlib/test/cassconnect.py
index 909e88a..0118e07 100644
--- a/pylib/cqlshlib/test/cassconnect.py
+++ b/pylib/cqlshlib/test/cassconnect.py
@@ -20,16 +20,23 @@
 import os.path
 import random
 import string
-import pytest
 
-from .basecase import TEST_HOST, TEST_PORT, cql, cqlsh, cqlshlog, policy, quote_name, test_dir
+from cassandra.cluster import Cluster
+from cassandra.metadata import maybe_escape_name as quote_name
+from cassandra.auth import PlainTextAuthProvider
+from cqlshlib.cql3handling import CqlRuleSet
+
+from .basecase import TEST_HOST, TEST_PORT, TEST_USER, TEST_PWD, cqlshlog, test_dir
 from .run_cqlsh import run_cqlsh, call_cqlsh
 
 test_keyspace_init = os.path.join(test_dir, 'test_keyspace_init.cql')
 
 
 def get_cassandra_connection(cql_version=None):
-    conn = cql((TEST_HOST,), TEST_PORT, cql_version=cql_version, load_balancing_policy=policy)
+
+    auth_provider = PlainTextAuthProvider(username=TEST_USER, password=TEST_PWD)
+    conn = Cluster((TEST_HOST,), TEST_PORT, auth_provider=auth_provider, cql_version=cql_version)
+
     # until the cql lib does this for us
     conn.cql_version = cql_version
     return conn
@@ -118,7 +125,8 @@
     try:
         yield conn
     finally:
-        conn.close()
+        conn.shutdown()
+
 
 @contextlib.contextmanager
 def cassandra_cursor(cql_version=None, ks=''):
@@ -146,13 +154,14 @@
 
 
 def cql_rule_set():
-    return cqlsh.cql3handling.CqlRuleSet
+    return CqlRuleSet
 
 
-class DEFAULTVAL: pass
+class DEFAULTVAL:
+    pass
 
 
-@pytest.mark.skip(reason="not a test")
+__TEST__ = False
 def testrun_cqlsh(keyspace=DEFAULTVAL, **kwargs):
     # use a positive default sentinel so that keyspace=None can be used
     # to override the default behavior
@@ -161,7 +170,7 @@
     return run_cqlsh(keyspace=keyspace, **kwargs)
 
 
-@pytest.mark.skip(reason="not a test")
+__TEST__ = False
 def testcall_cqlsh(keyspace=None, **kwargs):
     if keyspace is None:
         keyspace = get_keyspace()
diff --git a/pylib/cqlshlib/test/config/sslhandling.config b/pylib/cqlshlib/test/config/sslhandling.config
deleted file mode 100644
index 63f41c7..0000000
--- a/pylib/cqlshlib/test/config/sslhandling.config
+++ /dev/null
@@ -1,2 +0,0 @@
-[ssl]
-version = TLSv1
\ No newline at end of file
diff --git a/pylib/cqlshlib/test/config/sslhandling_invalid.config b/pylib/cqlshlib/test/config/sslhandling_invalid.config
deleted file mode 100644
index 90e061f..0000000
--- a/pylib/cqlshlib/test/config/sslhandling_invalid.config
+++ /dev/null
@@ -1,2 +0,0 @@
-[ssl]
-version = invalid_ssl
\ No newline at end of file
diff --git a/pylib/cqlshlib/test/run_cqlsh.py b/pylib/cqlshlib/test/run_cqlsh.py
index cd14b7f..180796a 100644
--- a/pylib/cqlshlib/test/run_cqlsh.py
+++ b/pylib/cqlshlib/test/run_cqlsh.py
@@ -16,31 +16,21 @@
 
 # NOTE: this testing tool is *nix specific
 
-from __future__ import unicode_literals
-
 import os
 import sys
 import re
 import contextlib
 import subprocess
 import signal
-import math
 from time import time
 from . import basecase
-from os.path import join, normpath
+from os.path import join
 
 
-def is_win():
-    return sys.platform in ("cygwin", "win32")
+import pty
+DEFAULT_PREFIX = os.linesep
 
-if is_win():
-    from .winpty import WinPty
-    DEFAULT_PREFIX = ''
-else:
-    import pty
-    DEFAULT_PREFIX = os.linesep
-
-DEFAULT_CQLSH_PROMPT = DEFAULT_PREFIX + '(\S+@)?cqlsh(:\S+)?> '
+DEFAULT_CQLSH_PROMPT = DEFAULT_PREFIX + r'(\S+@)?cqlsh(:\S+)?> '
 DEFAULT_CQLSH_TERM = 'xterm'
 
 try:
@@ -49,6 +39,7 @@
     # Python 3.7+
     Pattern = re.Pattern
 
+
 def get_smm_sequence(term='xterm'):
     """
     Return the set meta mode (smm) sequence, if any.
@@ -56,19 +47,20 @@
     before each prompt.
     """
     result = ''
-    if not is_win():
-        tput_proc = subprocess.Popen(['tput', '-T{}'.format(term), 'smm'], stdout=subprocess.PIPE)
-        tput_stdout = tput_proc.communicate()[0]
-        if (tput_stdout and (tput_stdout != b'')):
-            result = tput_stdout
-            if isinstance(result, bytes):
-                result = result.decode("utf-8")
+    tput_proc = subprocess.Popen(['tput', '-T{}'.format(term), 'smm'], stdout=subprocess.PIPE)
+    tput_stdout = tput_proc.communicate()[0]
+    if (tput_stdout and (tput_stdout != b'')):
+        result = tput_stdout
+        if isinstance(result, bytes):
+            result = result.decode("utf-8")
     return result
 
+
 DEFAULT_SMM_SEQUENCE = get_smm_sequence()
 
 cqlshlog = basecase.cqlshlog
 
+
 def set_controlling_pty(master, slave):
     os.setsid()
     os.close(master)
@@ -78,6 +70,7 @@
         os.close(slave)
     os.close(os.open(os.ttyname(1), os.O_RDWR))
 
+
 @contextlib.contextmanager
 def raising_signal(signum, exc):
     """
@@ -93,11 +86,13 @@
     finally:
         signal.signal(signum, oldhandlr)
 
+
 class TimeoutError(Exception):
     pass
 
+
 @contextlib.contextmanager
-def timing_out_itimer(seconds):
+def timing_out(seconds):
     if seconds is None:
         yield
         return
@@ -111,46 +106,16 @@
         finally:
             signal.setitimer(signal.ITIMER_REAL, 0)
 
-@contextlib.contextmanager
-def timing_out_alarm(seconds):
-    if seconds is None:
-        yield
-        return
-    with raising_signal(signal.SIGALRM, TimeoutError):
-        oldval = signal.alarm(int(math.ceil(seconds)))
-        if oldval != 0:
-            signal.alarm(oldval)
-            raise RuntimeError("SIGALRM already in use")
-        try:
-            yield
-        finally:
-            signal.alarm(0)
-
-if is_win():
-    try:
-        import eventlet
-    except ImportError as e:
-        sys.exit("evenlet library required to run cqlshlib tests on Windows")
-
-    def timing_out(seconds):
-        return eventlet.Timeout(seconds, TimeoutError)
-else:
-    # setitimer is new in 2.6, but it's still worth supporting, for potentially
-    # faster tests because of sub-second resolution on timeouts.
-    if hasattr(signal, 'setitimer'):
-        timing_out = timing_out_itimer
-    else:
-        timing_out = timing_out_alarm
 
 def noop(*a):
     pass
 
+
 class ProcRunner:
     def __init__(self, path, tty=True, env=None, args=()):
         self.exe_path = path
         self.args = args
-        self.tty = bool(tty)
-        self.realtty = self.tty and not is_win()
+        self.tty = tty
         if env is None:
             env = {}
         self.env = env
@@ -163,7 +128,7 @@
         stdin = stdout = stderr = None
         cqlshlog.info("Spawning %r subprocess with args: %r and env: %r"
                       % (self.exe_path, self.args, self.env))
-        if self.realtty:
+        if self.tty:
             masterfd, slavefd = pty.openpty()
             preexec = (lambda: set_controlling_pty(masterfd, slavefd))
             self.proc = subprocess.Popen((self.exe_path,) + tuple(self.args),
@@ -181,15 +146,11 @@
                                          env=self.env, stdin=stdin, stdout=stdout,
                                          stderr=stderr, bufsize=0, close_fds=False)
             self.send = self.send_pipe
-            if self.tty:
-                self.winpty = WinPty(self.proc.stdout)
-                self.read = self.read_winpty
-            else:
-                self.read = self.read_pipe
+            self.read = self.read_pipe
 
     def close(self):
         cqlshlog.info("Closing %r subprocess." % (self.exe_path,))
-        if self.realtty:
+        if self.tty:
             os.close(self.childpty)
         else:
             self.proc.stdin.close()
@@ -216,12 +177,6 @@
             buf = buf.decode("utf-8")
         return buf
 
-    def read_winpty(self, blksize, timeout=None):
-        buf = self.winpty.read(blksize, timeout)
-        if isinstance(buf, bytes):
-            buf = buf.decode("utf-8")
-        return buf
-
     def read_until(self, until, blksize=4096, timeout=None,
                    flags=0, ptty_timeout=None, replace=[]):
         if not isinstance(until, Pattern):
@@ -271,10 +226,10 @@
             curtime = time()
         return got
 
+
 class CqlshRunner(ProcRunner):
     def __init__(self, path=None, host=None, port=None, keyspace=None, cqlver=None,
-                 args=(), prompt=DEFAULT_CQLSH_PROMPT, env=None,
-                 win_force_colors=True, tty=True, **kwargs):
+                 args=(), prompt=DEFAULT_CQLSH_PROMPT, env=None, tty=True, **kwargs):
         if path is None:
             path = join(basecase.cqlsh_dir, 'cqlsh')
         if host is None:
@@ -283,9 +238,6 @@
             port = basecase.TEST_PORT
         if env is None:
             env = {}
-        if is_win():
-            env['PYTHONUNBUFFERED'] = '1'
-            env.update(os.environ.copy())
         env.setdefault('TERM', 'xterm')
         env.setdefault('CQLSH_NO_BUNDLED', os.environ.get('CQLSH_NO_BUNDLED', ''))
         env.setdefault('PYTHONPATH', os.environ.get('PYTHONPATH', ''))
@@ -297,11 +249,6 @@
             args += ('--cqlversion', str(cqlver))
         if keyspace is not None:
             args += ('--keyspace', keyspace.lower())
-        if tty and is_win():
-            args += ('--tty',)
-            args += ('--encoding', 'utf-8')
-            if win_force_colors:
-                args += ('--color',)
         if coverage:
             args += ('--coverage',)
         self.keyspace = keyspace
@@ -314,7 +261,7 @@
             self.output_header = self.read_to_next_prompt()
 
     def read_to_next_prompt(self, timeout=10.0):
-        return self.read_until(self.prompt, timeout=timeout, ptty_timeout=3, replace=[DEFAULT_SMM_SEQUENCE,])
+        return self.read_until(self.prompt, timeout=timeout, ptty_timeout=3, replace=[DEFAULT_SMM_SEQUENCE])
 
     def read_up_to_timeout(self, timeout, blksize=4096):
         output = ProcRunner.read_up_to_timeout(self, timeout, blksize=blksize)
@@ -330,7 +277,7 @@
         output = output.replace(' \r', '')
         output = output.replace('\r', '')
         output = output.replace(' \b', '')
-        if self.realtty:
+        if self.tty:
             echo, output = output.split('\n', 1)
             assert echo == cmd, "unexpected echo %r instead of %r" % (echo, cmd)
         try:
@@ -339,12 +286,14 @@
             promptline = output
             output = ''
         assert re.match(self.prompt, DEFAULT_PREFIX + promptline), \
-                'last line of output %r does not match %r?' % (promptline, self.prompt)
+            'last line of output %r does not match %r?' % (promptline, self.prompt)
         return output + '\n'
 
+
 def run_cqlsh(**kwargs):
     return contextlib.closing(CqlshRunner(**kwargs))
 
+
 def call_cqlsh(**kwargs):
     kwargs.setdefault('prompt', None)
     proginput = kwargs.pop('input', '')
diff --git a/pylib/cqlshlib/test/test_authproviderhandling.py b/pylib/cqlshlib/test/test_authproviderhandling.py
new file mode 100644
index 0000000..19a6133
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling.py
@@ -0,0 +1,190 @@
+#  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.
+
+import unittest
+import io
+import os
+import sys
+import pytest
+
+from cassandra.auth import PlainTextAuthProvider
+from cqlshlib.authproviderhandling import load_auth_provider
+
+
+def construct_config_path(config_file_name):
+    return os.path.join(os.path.dirname(__file__),
+                        'test_authproviderhandling_config',
+                        config_file_name)
+
+
+# Simple class to help verify AuthProviders that don't need arguments.
+class NoUserNamePlainTextAuthProvider(PlainTextAuthProvider):
+    def __init__(self):
+        super(NoUserNamePlainTextAuthProvider, self).__init__('', '')
+
+
+class ComplexTextAuthProvider(PlainTextAuthProvider):
+    def __init__(self, username, password='default_pass', extra_flag=None):
+        super(ComplexTextAuthProvider, self).__init__(username, password)
+        self.extra_flag = extra_flag
+
+
+def _assert_auth_provider_matches(actual, klass, expected_props):
+    """
+    Assert that the provider matches class and properties
+    * actual ..........: Thing to compare with it
+    * klass ...........: Class to ensure this matches to (ie PlainTextAuthProvider)
+    * expected_props ..: Dict of var properties to match
+    """
+    assert isinstance(actual, klass)
+    assert expected_props == vars(actual)
+
+class CustomAuthProviderTest(unittest.TestCase):
+
+    def setUp(self):
+        self._captured_std_err = io.StringIO()
+        sys.stderr = self._captured_std_err
+
+    def tearDown(self):
+        self._captured_std_err.close()
+        sys.stdout = sys.__stderr__
+
+    def test_no_warning_insecure_if_no_pass(self):
+        load_auth_provider(construct_config_path('plain_text_partial_example'))
+        err_msg = self._captured_std_err.getvalue()
+        assert err_msg == ''
+
+    def test_insecure_creds(self):
+        load_auth_provider(construct_config_path('full_plain_text_example'))
+        err_msg = self._captured_std_err.getvalue()
+        assert "Notice:" in err_msg
+        assert "Warning:" in err_msg
+
+    def test_creds_not_checked_for_non_plaintext(self):
+        load_auth_provider(construct_config_path('complex_auth_provider_with_pass'))
+        err_msg = self._captured_std_err.getvalue()
+        assert err_msg == ''
+
+    def test_partial_property_example(self):
+        actual = load_auth_provider(construct_config_path('partial_example'))
+        _assert_auth_provider_matches(
+                actual,
+                NoUserNamePlainTextAuthProvider,
+                {"username": '',
+                 "password": ''})
+
+    def test_full_property_example(self):
+        actual = load_auth_provider(construct_config_path('full_plain_text_example'))
+        _assert_auth_provider_matches(
+                actual,
+                PlainTextAuthProvider,
+                {"username": 'user1',
+                 "password": 'pass1'})
+
+    def test_empty_example(self):
+        actual = load_auth_provider(construct_config_path('empty_example'))
+        assert actual is None
+
+    def test_plaintextauth_when_not_defined(self):
+        creds_file = construct_config_path('plain_text_full_creds')
+        actual = load_auth_provider(cred_file=creds_file)
+        _assert_auth_provider_matches(
+                actual,
+                PlainTextAuthProvider,
+                {"username": 'user2',
+                 "password": 'pass2'})
+
+    def test_no_cqlshrc_file(self):
+        actual = load_auth_provider()
+        assert actual is None
+
+    def test_no_classname_example(self):
+        actual = load_auth_provider(construct_config_path('no_classname_example'))
+        assert actual is None
+
+    def test_improper_config_example(self):
+        with pytest.raises(ModuleNotFoundError) as error:
+            load_auth_provider(construct_config_path('illegal_example'))
+            assert error is not None
+
+    def test_username_password_passed_from_commandline(self):
+        creds_file = construct_config_path('complex_auth_provider_creds')
+        cqlshrc = construct_config_path('complex_auth_provider')
+
+        actual = load_auth_provider(cqlshrc, creds_file, 'user-from-legacy', 'pass-from-legacy')
+        _assert_auth_provider_matches(
+                 actual,
+                 ComplexTextAuthProvider,
+                 {"username": 'user-from-legacy',
+                  "password": 'pass-from-legacy',
+                  "extra_flag": 'flag2'})
+
+    def test_creds_example(self):
+        creds_file = construct_config_path('complex_auth_provider_creds')
+        cqlshrc = construct_config_path('complex_auth_provider')
+
+        actual = load_auth_provider(cqlshrc, creds_file)
+        _assert_auth_provider_matches(
+                actual,
+                ComplexTextAuthProvider,
+                {"username": 'user1',
+                 "password": 'pass2',
+                 "extra_flag": 'flag2'})
+
+    def test_legacy_example_use_passed_username(self):
+        creds_file = construct_config_path('plain_text_partial_creds')
+        cqlshrc = construct_config_path('plain_text_partial_example')
+
+        actual = load_auth_provider(cqlshrc, creds_file, 'user3')
+        _assert_auth_provider_matches(
+                actual,
+                PlainTextAuthProvider,
+                {"username": 'user3',
+                 "password": 'pass2'})
+
+    def test_legacy_example_no_auth_provider_given(self):
+        cqlshrc = construct_config_path('empty_example')
+        creds_file = construct_config_path('complex_auth_provider_creds')
+
+        actual = load_auth_provider(cqlshrc, creds_file, 'user3', 'pass3')
+        _assert_auth_provider_matches(
+                actual,
+                PlainTextAuthProvider,
+                {"username": 'user3',
+                 "password": 'pass3'})
+
+    def test_shouldnt_pass_no_password_when_alt_auth_provider(self):
+        cqlshrc = construct_config_path('complex_auth_provider')
+        creds_file = None
+
+        actual = load_auth_provider(cqlshrc, creds_file, 'user3')
+        _assert_auth_provider_matches(
+                actual,
+                ComplexTextAuthProvider,
+                {"username": 'user3',
+                 "password": 'default_pass',
+                 "extra_flag": 'flag1'})
+
+    def test_legacy_example_no_password(self):
+        cqlshrc = construct_config_path('plain_text_partial_example')
+        creds_file = None
+
+        actual = load_auth_provider(cqlshrc, creds_file, 'user3')
+        _assert_auth_provider_matches(
+                actual,
+                PlainTextAuthProvider,
+                {"username": 'user3',
+                 "password": None})
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider b/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider
new file mode 100644
index 0000000..879b7a6
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider
@@ -0,0 +1,10 @@
+; Config for a custom auth provider that uses the auth_provider field
+; ComplexTextAuthProvider is a PlainTextAuthProvider in the driver which 
+; takes an extra field (extra_flag).
+; used by unit testing
+
+[auth_provider]
+module = cqlshlib.test.test_authproviderhandling
+classname = ComplexTextAuthProvider
+username = user1
+extra_flag = flag1
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_creds b/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_creds
new file mode 100644
index 0000000..bb102bc
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_creds
@@ -0,0 +1,3 @@
+[ComplexTextAuthProvider]
+extra_flag = flag2
+password = pass2
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_with_pass b/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_with_pass
new file mode 100644
index 0000000..c322008
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/complex_auth_provider_with_pass
@@ -0,0 +1,11 @@
+; Config for a custom auth provider that uses the auth_provider field
+; ComplexTextAuthProvider is a PlainTextAuthProvider in the driver which
+; takes an extra field (extra_flag).
+; used by unit testing
+
+[auth_provider]
+module = cqlshlib.test.test_authproviderhandling
+classname = ComplexTextAuthProvider
+username = user1
+password = pass1
+extra_flag = flag1
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/empty_example b/pylib/cqlshlib/test/test_authproviderhandling_config/empty_example
new file mode 100644
index 0000000..3dfda04
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/empty_example
@@ -0,0 +1,2 @@
+; Config for a custom auth provider that uses only the auth_provider field
+
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/full_plain_text_example b/pylib/cqlshlib/test/test_authproviderhandling_config/full_plain_text_example
new file mode 100644
index 0000000..b962e63
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/full_plain_text_example
@@ -0,0 +1,10 @@
+; Config for a custom auth provider that uses all possible fields
+; This example loads the PlainTextAuthProvider and passes username and password to constructor
+; dynamically.  
+; used by unit testing
+
+[auth_provider]
+module = cassandra.auth
+classname = PlainTextAuthProvider
+username = user1
+password = pass1
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/illegal_example b/pylib/cqlshlib/test/test_authproviderhandling_config/illegal_example
new file mode 100644
index 0000000..615fe9f
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/illegal_example
@@ -0,0 +1,5 @@
+; Example that shouldn't work
+
+[auth_provider]
+module = nowhere.illegal.wrong
+classname = badclass
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/no_classname_example b/pylib/cqlshlib/test/test_authproviderhandling_config/no_classname_example
new file mode 100644
index 0000000..cf27bfd
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/no_classname_example
@@ -0,0 +1,5 @@
+; Config for a custom auth provider that uses only the auth_provider field
+; this version doesn't have a classname, but has a module name.
+
+[auth_provider]
+module = cqlshlib.test
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/partial_example b/pylib/cqlshlib/test/test_authproviderhandling_config/partial_example
new file mode 100644
index 0000000..23be26e
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/partial_example
@@ -0,0 +1,8 @@
+; Config for a custom auth provider that uses only the auth_provider field
+; NoUserNamePlainTextAuthProvider is a PlainTextAuthProvider in the driver which 
+; doesn't take a username or password.
+; used by unit testing
+
+[auth_provider]
+module = cqlshlib.test.test_authproviderhandling
+classname = NoUserNamePlainTextAuthProvider
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_full_creds b/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_full_creds
new file mode 100644
index 0000000..3cd4470
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_full_creds
@@ -0,0 +1,3 @@
+[PlainTextAuthProvider]
+password = pass2
+username = user2
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_creds b/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_creds
new file mode 100644
index 0000000..1faf24d
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_creds
@@ -0,0 +1,2 @@
+[PlainTextAuthProvider]
+password = pass2
diff --git a/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_example b/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_example
new file mode 100644
index 0000000..37baebd
--- /dev/null
+++ b/pylib/cqlshlib/test/test_authproviderhandling_config/plain_text_partial_example
@@ -0,0 +1,8 @@
+; Config for a custom auth provider that uses some possible fields
+; validate that the partial breakdown works successfully
+; used by unit testing
+
+[auth_provider]
+module = cassandra.auth
+classname = PlainTextAuthProvider
+username = user1
diff --git a/pylib/cqlshlib/test/test_copyutil.py b/pylib/cqlshlib/test/test_copyutil.py
index 18b167a..19fcdd1 100644
--- a/pylib/cqlshlib/test/test_copyutil.py
+++ b/pylib/cqlshlib/test/test_copyutil.py
@@ -20,7 +20,7 @@
 
 import unittest
 
-from cassandra.metadata import MIN_LONG, Murmur3Token, TokenMap
+from cassandra.metadata import MIN_LONG, Murmur3Token
 from cassandra.policies import SimpleConvictionPolicy
 from cassandra.pool import Host
 from unittest.mock import Mock
@@ -75,10 +75,11 @@
         }
         # merge override options with standard options
         overridden_opts = dict(self.opts)
-        for k,v in opts.items():
+        for k, v in opts.items():
             overridden_opts[k] = v
         export_task = ExportTask(shell, self.ks, self.table, self.columns, self.fname, overridden_opts, self.protocol_version, self.config_file)
         assert export_task.get_ranges() == expected_ranges
+        export_task.close()
 
     def test_get_ranges_murmur3(self):
         """
@@ -92,19 +93,19 @@
         self._test_get_ranges_murmur3_base({'begintoken': 1, 'endtoken': -1}, {})
 
         # simple case of a single range
-        expected_ranges = {(1,2): {'hosts': ('10.0.0.4', '10.0.0.1', '10.0.0.2'), 'attempts': 0, 'rows': 0, 'workerno': -1}}
+        expected_ranges = {(1, 2): {'hosts': ('10.0.0.4', '10.0.0.1', '10.0.0.2'), 'attempts': 0, 'rows': 0, 'workerno': -1}}
         self._test_get_ranges_murmur3_base({'begintoken': 1, 'endtoken': 2}, expected_ranges)
 
         # simple case of two contiguous ranges
         expected_ranges = {
-            (-4611686018427387903,0): {'hosts': ('10.0.0.3', '10.0.0.4', '10.0.0.1'), 'attempts': 0, 'rows': 0, 'workerno': -1},
-            (0,1): {'hosts': ('10.0.0.4', '10.0.0.1', '10.0.0.2'), 'attempts': 0, 'rows': 0, 'workerno': -1}
+            (-4611686018427387903, 0): {'hosts': ('10.0.0.3', '10.0.0.4', '10.0.0.1'), 'attempts': 0, 'rows': 0, 'workerno': -1},
+            (0, 1): {'hosts': ('10.0.0.4', '10.0.0.1', '10.0.0.2'), 'attempts': 0, 'rows': 0, 'workerno': -1}
         }
         self._test_get_ranges_murmur3_base({'begintoken': -4611686018427387903, 'endtoken': 1}, expected_ranges)
 
         # specify a begintoken only (endtoken defaults to None)
         expected_ranges = {
-            (4611686018427387905,None): {'hosts': ('10.0.0.1', '10.0.0.2', '10.0.0.3'), 'attempts': 0, 'rows': 0, 'workerno': -1}
+            (4611686018427387905, None): {'hosts': ('10.0.0.1', '10.0.0.2', '10.0.0.3'), 'attempts': 0, 'rows': 0, 'workerno': -1}
         }
         self._test_get_ranges_murmur3_base({'begintoken': 4611686018427387905}, expected_ranges)
 
@@ -113,4 +114,3 @@
             (None, MIN_LONG + 1): {'hosts': ('10.0.0.2', '10.0.0.3', '10.0.0.4'), 'attempts': 0, 'rows': 0, 'workerno': -1}
         }
         self._test_get_ranges_murmur3_base({'endtoken': MIN_LONG + 1}, expected_ranges)
-
diff --git a/pylib/cqlshlib/test/test_cql_parsing.py b/pylib/cqlshlib/test/test_cql_parsing.py
index 8631d7a..b1f45f5 100644
--- a/pylib/cqlshlib/test/test_cql_parsing.py
+++ b/pylib/cqlshlib/test/test_cql_parsing.py
@@ -778,12 +778,12 @@
 
 
 def parse_cqlsh_statements(text):
-    '''
+    """
     Runs its argument through the sequence of parsing steps that cqlsh takes its
     input through.
 
     Currently does not handle batch statements.
-    '''
+    """
     # based on onecmd
     statements, _ = CqlRuleSet.cql_split_statements(text)
     # stops here. For regular cql commands, onecmd just splits it and sends it
@@ -799,13 +799,13 @@
 
 
 def strip_final_empty_items(xs):
-    '''
+    """
     Returns its a copy of argument as a list, but with any terminating
     subsequence of falsey values removed.
 
     >>> strip_final_empty_items([[3, 4], [5, 6, 7], [], [], [1], []])
     [[3, 4], [5, 6, 7], [], [], [1]]
-    '''
+    """
     rv = list(xs)
 
     while rv and not rv[-1]:
diff --git a/pylib/cqlshlib/test/test_cqlsh_completion.py b/pylib/cqlshlib/test/test_cqlsh_completion.py
index 9d902e4..af9d05e 100644
--- a/pylib/cqlshlib/test/test_cqlsh_completion.py
+++ b/pylib/cqlshlib/test/test_cqlsh_completion.py
@@ -21,11 +21,10 @@
 import locale
 import os
 import re
-from .basecase import BaseTestCase, cqlsh, cqlshlog
+from .basecase import BaseTestCase
 from .cassconnect import create_db, remove_db, testrun_cqlsh
 from .run_cqlsh import TimeoutError
-import unittest
-import sys
+from cqlshlib.cql3handling import CqlRuleSet
 
 BEL = '\x07'  # the terminal-bell character
 CTRL_C = '\x03'
@@ -40,7 +39,6 @@
 completion_separation_re = re.compile(r'\s+')
 
 
-@unittest.skipIf(sys.platform == "win32", 'Tab completion tests not supported on Windows')
 class CqlshCompletionCase(BaseTestCase):
 
     @classmethod
@@ -55,7 +53,7 @@
         env = os.environ.copy()
         env['COLUMNS'] = '100000'
         if (locale.getpreferredencoding() != 'UTF-8'):
-             env['LC_CTYPE'] = 'en_US.utf8'
+            env['LC_CTYPE'] = 'en_US.utf8'
         self.cqlsh_runner = testrun_cqlsh(cqlver=None, env=env)
         self.cqlsh = self.cqlsh_runner.__enter__()
 
@@ -153,15 +151,13 @@
                 # retry once
                 self.cqlsh.send(CTRL_C)
                 self.cqlsh.read_to_next_prompt(timeout=10.0)
- 
 
     def strategies(self):
-        return self.module.CqlRuleSet.replication_strategies
+        return CqlRuleSet.replication_strategies
 
 
 class TestCqlshCompletion(CqlshCompletionCase):
     cqlver = '3.1.6'
-    module = cqlsh.cql3handling
 
     def test_complete_on_empty_string(self):
         self.trycompletions('', choices=('?', 'ALTER', 'BEGIN', 'CAPTURE', 'CONSISTENCY',
@@ -385,7 +381,16 @@
                             choices=['EXISTS', '<quotedName>', '<identifier>'])
 
         self.trycompletions("UPDATE empty_table SET lonelycol = 'eggs' WHERE TOKEN(lonelykey) <= TOKEN(13) IF EXISTS ",
-                            choices=['>=', '!=', '<=', 'IN', '[', ';', '=', '<', '>', '.'])
+                            choices=['>=', '!=', '<=', 'IN', '[', ';', '=', '<', '>', '.', 'CONTAINS'])
+
+        self.trycompletions("UPDATE empty_table SET lonelycol = 'eggs' WHERE TOKEN(lonelykey) <= TOKEN(13) IF lonelykey ",
+                            choices=['>=', '!=', '<=', 'IN', '=', '<', '>', 'CONTAINS'])
+
+        self.trycompletions("UPDATE empty_table SET lonelycol = 'eggs' WHERE TOKEN(lonelykey) <= TOKEN(13) IF lonelykey CONTAINS ",
+                            choices=['false', 'true', '<pgStringLiteral>',
+                                     '-', '<float>', 'TOKEN', '<identifier>',
+                                     '<uuid>', '{', '[', 'NULL', '<quotedStringLiteral>',
+                                     '<blobLiteral>', '<wholenumber>', 'KEY'])
 
     def test_complete_in_delete(self):
         self.trycompletions('DELETE F', choices=['FROM', '<identifier>', '<quotedName>'])
@@ -467,7 +472,13 @@
                             choices=['EXISTS', '<identifier>', '<quotedName>'])
         self.trycompletions(('DELETE FROM twenty_rows_composite_table USING TIMESTAMP 0 WHERE '
                              'TOKEN(a) >= TOKEN(0) IF b '),
-                            choices=['>=', '!=', '<=', 'IN', '=', '<', '>'])
+                            choices=['>=', '!=', '<=', 'IN', '=', '<', '>', 'CONTAINS'])
+        self.trycompletions(('DELETE FROM twenty_rows_composite_table USING TIMESTAMP 0 WHERE '
+                             'TOKEN(a) >= TOKEN(0) IF b CONTAINS '),
+                            choices=['false', 'true', '<pgStringLiteral>',
+                                     '-', '<float>', 'TOKEN', '<identifier>',
+                                     '<uuid>', '{', '[', 'NULL','<quotedStringLiteral>',
+                                     '<blobLiteral>','<wholenumber>', 'KEY'])
         self.trycompletions(('DELETE FROM twenty_rows_composite_table USING TIMESTAMP 0 WHERE '
                              'TOKEN(a) >= TOKEN(0) IF b < 0 '),
                             choices=['AND', ';'])
@@ -684,7 +695,7 @@
                                      'timestamp_resolution', 'min_threshold', 'class', 'max_threshold',
                                      'tombstone_compaction_interval', 'tombstone_threshold',
                                      'enabled', 'unchecked_tombstone_compaction',
-                                     'only_purge_repaired_tombstones','provide_overlapping_tombstones'])
+                                     'only_purge_repaired_tombstones', 'provide_overlapping_tombstones'])
 
     def test_complete_in_create_columnfamily(self):
         self.trycompletions('CREATE C', choices=['COLUMNFAMILY', 'CUSTOM'])
@@ -833,7 +844,111 @@
     def test_complete_in_alter_keyspace(self):
         self.trycompletions('ALTER KEY', 'SPACE ')
         self.trycompletions('ALTER KEYSPACE ', '', choices=[self.cqlsh.keyspace, 'system_auth',
-                                                            'system_distributed', 'system_traces'])
+                                                            'system_distributed', 'system_traces', 'IF'])
+        self.trycompletions('ALTER KEYSPACE I', immediate='F EXISTS ')
         self.trycompletions('ALTER KEYSPACE system_trac', "es WITH replication = {'class': '")
         self.trycompletions("ALTER KEYSPACE system_traces WITH replication = {'class': '", '',
                             choices=['NetworkTopologyStrategy', 'SimpleStrategy'])
+
+    def test_complete_in_grant(self):
+        self.trycompletions("GR",
+                            immediate='ANT ')
+        self.trycompletions("GRANT ",
+                            choices=['ALL', 'ALTER', 'AUTHORIZE', 'CREATE', 'DESCRIBE', 'DROP', 'EXECUTE', 'MODIFY', 'SELECT'],
+                            other_choices_ok=True)
+        self.trycompletions("GRANT MODIFY ",
+                            choices=[',', 'ON', 'PERMISSION'])
+        self.trycompletions("GRANT MODIFY P",
+                            immediate='ERMISSION ')
+        self.trycompletions("GRANT MODIFY PERMISSION ",
+                            choices=[',', 'ON'])
+        self.trycompletions("GRANT MODIFY PERMISSION, ",
+                            choices=['ALTER', 'AUTHORIZE', 'CREATE', 'DESCRIBE', 'DROP', 'EXECUTE', 'SELECT'])
+        self.trycompletions("GRANT MODIFY PERMISSION, D",
+                            choices=['DESCRIBE', 'DROP'])
+        self.trycompletions("GRANT MODIFY PERMISSION, DR",
+                            immediate='OP ')
+        self.trycompletions("GRANT MODIFY PERMISSION, DROP O",
+                            immediate='N ')
+        self.trycompletions("GRANT MODIFY, DROP ON ",
+                            choices=['ALL', 'KEYSPACE', 'MBEANS', 'ROLE', 'FUNCTION', 'MBEAN', 'TABLE'],
+                            other_choices_ok=True)
+        self.trycompletions("GRANT MODIFY, DROP ON ALL ",
+                            choices=['KEYSPACES', 'TABLES'],
+                            other_choices_ok=True)
+        self.trycompletions("GRANT MODIFY PERMISSION ON KEY",
+                            immediate='SPACE ')
+        self.trycompletions("GRANT MODIFY PERMISSION ON KEYSPACE system_tr",
+                            immediate='aces TO ')
+
+    def test_complete_in_revoke(self):
+        self.trycompletions("RE",
+                            immediate='VOKE ')
+        self.trycompletions("REVOKE ",
+                            choices=['ALL', 'ALTER', 'AUTHORIZE', 'CREATE', 'DESCRIBE', 'DROP', 'EXECUTE', 'MODIFY', 'SELECT'],
+                            other_choices_ok=True)
+        self.trycompletions("REVOKE MODIFY ",
+                            choices=[',', 'ON', 'PERMISSION'])
+        self.trycompletions("REVOKE MODIFY P",
+                            immediate='ERMISSION ')
+        self.trycompletions("REVOKE MODIFY PERMISSION ",
+                            choices=[',', 'ON'])
+        self.trycompletions("REVOKE MODIFY PERMISSION, ",
+                            choices=['ALTER', 'AUTHORIZE', 'CREATE', 'DESCRIBE', 'DROP', 'EXECUTE', 'SELECT'])
+        self.trycompletions("REVOKE MODIFY PERMISSION, D",
+                            choices=['DESCRIBE', 'DROP'])
+        self.trycompletions("REVOKE MODIFY PERMISSION, DR",
+                            immediate='OP ')
+        self.trycompletions("REVOKE MODIFY PERMISSION, DROP ",
+                            choices=[',', 'ON', 'PERMISSION'])
+        self.trycompletions("REVOKE MODIFY PERMISSION, DROP O",
+                            immediate='N ')
+        self.trycompletions("REVOKE MODIFY PERMISSION, DROP ON ",
+                            choices=['ALL', 'KEYSPACE', 'MBEANS', 'ROLE', 'FUNCTION', 'MBEAN', 'TABLE'],
+                            other_choices_ok=True)
+        self.trycompletions("REVOKE MODIFY, DROP ON ALL ",
+                            choices=['KEYSPACES', 'TABLES'],
+                            other_choices_ok=True)
+        self.trycompletions("REVOKE MODIFY PERMISSION, DROP ON KEY",
+                            immediate='SPACE ')
+        self.trycompletions("REVOKE MODIFY PERMISSION, DROP ON KEYSPACE system_tr",
+                            immediate='aces FROM ')
+
+    def test_complete_in_alter_table(self):
+        self.trycompletions('ALTER TABLE I', immediate='F EXISTS ')
+        self.trycompletions('ALTER TABLE IF', immediate=' EXISTS ')
+        self.trycompletions('ALTER TABLE ', choices=['IF', 'twenty_rows_table',
+                                                     'ascii_with_special_chars', 'users',
+                                                     'has_all_types', 'system.',
+                                                     'empty_composite_table', 'empty_table',
+                                                     'system_auth.', 'undefined_values_table',
+                                                     'dynamic_columns',
+                                                     'twenty_rows_composite_table',
+                                                     'utf8_with_special_chars',
+                                                     'system_traces.', 'songs', 'system_views.',
+                                                     'system_virtual_schema.',
+                                                     'system_schema.', 'system_distributed.',
+                                                     self.cqlsh.keyspace + '.'])
+        self.trycompletions('ALTER TABLE IF EXISTS new_table ADD ', choices=['<new_column_name>', 'IF'])
+        self.trycompletions('ALTER TABLE IF EXISTS new_table ADD IF NOT EXISTS ', choices=['<new_column_name>'])
+        self.trycompletions('ALTER TABLE new_table ADD IF NOT EXISTS ', choices=['<new_column_name>'])
+        self.trycompletions('ALTER TABLE IF EXISTS new_table RENAME ', choices=['IF', '<quotedName>', '<identifier>'])
+        self.trycompletions('ALTER TABLE new_table RENAME ', choices=['IF', '<quotedName>', '<identifier>'])
+        self.trycompletions('ALTER TABLE IF EXISTS new_table DROP ', choices=['IF', '<quotedName>', '<identifier>'])
+
+    def test_complete_in_alter_type(self):
+        self.trycompletions('ALTER TYPE I', immediate='F EXISTS ')
+        self.trycompletions('ALTER TYPE ', choices=['IF', 'system_views.',
+                                                    'tags', 'system_traces.', 'system_distributed.',
+                                                    'phone_number', 'band_info_type', 'address', 'system.', 'system_schema.',
+                                                    'system_auth.', 'system_virtual_schema.', self.cqlsh.keyspace + '.'
+                                                    ])
+        self.trycompletions('ALTER TYPE IF EXISTS new_type ADD ', choices=['<new_field_name>', 'IF'])
+        self.trycompletions('ALTER TYPE IF EXISTS new_type ADD IF NOT EXISTS ', choices=['<new_field_name>'])
+        self.trycompletions('ALTER TYPE IF EXISTS new_type RENAME ', choices=['IF', '<quotedName>', '<identifier>'])
+
+    def test_complete_in_alter_user(self):
+        self.trycompletions('ALTER USER ', choices=['<identifier>', 'IF', '<pgStringLiteral>', '<quotedStringLiteral>'])
+
+    def test_complete_in_alter_role(self):
+        self.trycompletions('ALTER ROLE ', choices=['<identifier>', 'IF', '<quotedName>'])
diff --git a/pylib/cqlshlib/test/test_cqlsh_output.py b/pylib/cqlshlib/test/test_cqlsh_output.py
index ed40683..52f564a 100644
--- a/pylib/cqlshlib/test/test_cqlsh_output.py
+++ b/pylib/cqlshlib/test/test_cqlsh_output.py
@@ -17,18 +17,12 @@
 # to configure behavior, define $CQL_TEST_HOST to the destination address
 # and $CQL_TEST_PORT to the associated port.
 
-from __future__ import unicode_literals, with_statement
-
 import locale
 import os
 import re
-import subprocess
-import sys
-import six
-import unittest
 
 from .basecase import (BaseTestCase, TEST_HOST, TEST_PORT,
-                       at_a_time, cqlsh, cqlshlog, dedent)
+                       at_a_time, cqlshlog, dedent)
 from .cassconnect import (cassandra_cursor, create_db, get_keyspace,
                           quote_name, remove_db, split_cql_commands,
                           testcall_cqlsh, testrun_cqlsh)
@@ -124,8 +118,7 @@
         for termname in ('', 'dumb', 'vt100'):
             cqlshlog.debug('TERM=%r' % termname)
             env['TERM'] = termname
-            with testrun_cqlsh(tty=True, env=env,
-                               win_force_colors=False) as c:
+            with testrun_cqlsh(tty=True, env=env) as c:
                 c.send('select * from has_all_types;\n')
                 self.assertNoHasColors(c.read_to_next_prompt())
                 c.send('select count(*) from has_all_types;\n')
@@ -610,7 +603,7 @@
             outputlines = c.read_to_next_prompt().splitlines()
 
             start_index = 0
-            if c.realtty:
+            if c.tty:
                 self.assertEqual(outputlines[start_index], 'use NONEXISTENTKEYSPACE;')
                 start_index = 1
 
@@ -688,6 +681,7 @@
                 AND comment = ''
                 AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}
                 AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}
+                AND memtable = 'default'
                 AND crc_check_chance = 1.0
                 AND default_time_to_live = 0
                 AND extensions = {}
@@ -791,37 +785,19 @@
                 self.assertIn('VIRTUAL KEYSPACE system_virtual_schema', output)
                 self.assertIn("\nCREATE KEYSPACE system_auth WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}  AND durable_writes = true;\n",
                               output)
-                self.assertRegex(output, '.*\s*$')
+                self.assertRegex(output, r'.*\s*$')
 
     def test_show_output(self):
         with testrun_cqlsh(tty=True, env=self.default_env) as c:
             output = c.cmd_and_response('show version;')
             self.assertRegex(output,
-                    '^\[cqlsh \S+ \| Cassandra \S+ \| CQL spec \S+ \| Native protocol \S+\]$')
+                    r'^\[cqlsh \S+ \| Cassandra \S+ \| CQL spec \S+ \| Native protocol \S+\]$')
 
             output = c.cmd_and_response('show host;')
             self.assertHasColors(output)
             self.assertRegex(output, '^Connected to .* at %s:%d$'
                                              % (re.escape(TEST_HOST), TEST_PORT))
 
-    @unittest.skipIf(six.PY3, 'Will not emit warning when running Python 3')
-    def test_warn_py2(self):
-        # has the warning
-        with testrun_cqlsh(tty=True, env=self.default_env) as c:
-            self.assertIn('Python 2.7 support is deprecated.', c.output_header, 'cqlsh did not output expected warning.')
-
-        # can suppress
-        env = self.default_env.copy()
-        env['CQLSH_NO_WARN_PY2'] = '1'
-        with testrun_cqlsh(tty=True, env=env) as c:
-            self.assertNotIn('Python 2.7 support is deprecated.', c.output_header, 'cqlsh did not output expected warning.')
-
-    @unittest.skipIf(six.PY2, 'Warning will be emitted when running Python 2.7')
-    def test_no_warn_py3(self):
-        with testrun_cqlsh(tty=True, env=self.default_env) as c:
-            self.assertNotIn('Python 2.7 support is deprecated.', c.output_header, 'cqlsh did not output expected warning.')
-
-    @unittest.skipIf(sys.platform == "win32", 'EOF signaling not supported on Windows')
     def test_eof_prints_newline(self):
         with testrun_cqlsh(tty=True, env=self.default_env) as c:
             c.send(CONTROL_D)
@@ -836,9 +812,8 @@
             with testrun_cqlsh(tty=True, env=self.default_env) as c:
                 cmd = 'exit%s\n' % semicolon
                 c.send(cmd)
-                if c.realtty:
-                    out = c.read_lines(1)[0].replace('\r', '')
-                    self.assertEqual(out, cmd)
+                out = c.read_lines(1)[0].replace('\r', '')
+                self.assertEqual(out, cmd)
                 with self.assertRaises(BaseException) as cm:
                     c.read_lines(1)
                 self.assertIn(type(cm.exception), (EOFError, OSError))
diff --git a/pylib/cqlshlib/test/test_sslhandling.py b/pylib/cqlshlib/test/test_sslhandling.py
deleted file mode 100644
index a96089d..0000000
--- a/pylib/cqlshlib/test/test_sslhandling.py
+++ /dev/null
@@ -1,75 +0,0 @@
-#  Licensed to the Apache Software Foundation (ASF) under one
-#  or more contributor license agreements.  See the NOTICE file
-#  distributed with this work for additional information
-#  regarding copyright ownership.  The ASF licenses this file
-#  to you under the Apache License, Version 2.0 (the
-#  "License"); you may not use this file except in compliance
-#  with the License.  You may obtain a copy of the License at
-#
-#      http://www.apache.org/licenses/LICENSE-2.0
-#
-#  Unless required by applicable law or agreed to in writing, software
-#  distributed under the License is distributed on an "AS IS" BASIS,
-#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-#  See the License for the specific language governing permissions and
-#  limitations under the License.
-
-from cassandra.policies import SimpleConvictionPolicy
-from cassandra.pool import Host
-from cqlshlib.sslhandling import ssl_settings
-
-import unittest
-import os
-import ssl
-import pytest
-
-class SslSettingsTest(unittest.TestCase):
-
-    def setUp(self):
-        os.environ['SSL_VALIDATE'] = 'False'
-        self.config_file = 'test_config'
-        self.host = Host('10.0.0.1', SimpleConvictionPolicy, 9000)
-
-    def tearDown(self):
-        del os.environ['SSL_VALIDATE']
-        try:
-            del os.environ['SSL_VERSION']
-        except KeyError:
-            pass
-
-    def _test_ssl_version_from_env(self, version):
-        """
-        Getting SSL version string from env variable SSL_VERSION.
-        """
-        os.environ['SSL_VERSION'] = version
-        ssl_ret_val = ssl_settings(self.host, self.config_file)
-        assert ssl_ret_val is not None
-        assert ssl_ret_val.get('ssl_version') == getattr(ssl, 'PROTOCOL_%s' % version)
-
-    def test_ssl_versions_from_env(self):
-        versions = ['TLS', 'TLSv1_1', 'TLSv1_2', 'TLSv1']
-        for version in versions:
-            self._test_ssl_version_from_env(version)
-
-    def test_invalid_ssl_versions_from_env(self):
-        msg = "invalid_ssl is not a valid SSL protocol, please use one of TLSv1, TLSv1_1, or TLSv1_2"
-        with pytest.raises(SystemExit) as error:
-            self._test_ssl_version_from_env('invalid_ssl')
-            assert msg == error.exception.message
-
-    def test_default_ssl_version(self):
-        ssl_ret_val = ssl_settings(self.host, self.config_file)
-        assert ssl_ret_val is not None
-        assert ssl_ret_val.get('ssl_version') == getattr(ssl, 'PROTOCOL_TLS')
-
-    def test_ssl_version_config(self):
-        ssl_ret_val = ssl_settings(self.host, os.path.join('test', 'config', 'sslhandling.config'))
-        assert ssl_ret_val is not None
-        assert ssl_ret_val.get('ssl_version') == getattr(ssl, 'PROTOCOL_TLSv1')
-
-    def test_invalid_ssl_version_config(self):
-        msg = "invalid_ssl is not a valid SSL protocol, please use one of TLSv1, TLSv1_1, or TLSv1_2"
-        with pytest.raises(SystemExit) as error:
-            ssl_settings(self.host, os.path.join('test', 'config', 'sslhandling_invalid.config'))
-            assert msg in error.exception.message
-            
diff --git a/pylib/cqlshlib/test/test_unicode.py b/pylib/cqlshlib/test/test_unicode.py
index 9fc052f..d24a787 100644
--- a/pylib/cqlshlib/test/test_unicode.py
+++ b/pylib/cqlshlib/test/test_unicode.py
@@ -15,13 +15,10 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from __future__ import unicode_literals, with_statement
-
 import os
-import subprocess
 
 from .basecase import BaseTestCase
-from .cassconnect import (get_cassandra_connection, create_keyspace, testrun_cqlsh)
+from .cassconnect import (get_cassandra_connection, create_keyspace, remove_db, testrun_cqlsh)
 from cqlshlib.formatting import unicode_controlchars_re
 
 
@@ -38,6 +35,10 @@
         env['LC_CTYPE'] = 'UTF-8'
         cls.default_env = env
 
+    @classmethod
+    def tearDownClass(cls):
+        remove_db()
+
     def test_unicode_value_round_trip(self):
         with testrun_cqlsh(tty=True, env=self.default_env) as c:
             value = 'ϑΉӁװڜ'
@@ -72,7 +73,7 @@
             output = c.cmd_and_response('CREATE TYPE "%s" ( "%s" int );' % (v1, v2))
             output = c.cmd_and_response('DESC TYPES;')
             self.assertIn(v1, output)
-            output = c.cmd_and_response('DESC TYPE "%s";' %(v1,))
+            output = c.cmd_and_response('DESC TYPE "%s";' % (v1,))
             self.assertIn(v2, output)
 
     def test_unicode_esc(self):  # CASSANDRA-17617
diff --git a/pylib/cqlshlib/test/winpty.py b/pylib/cqlshlib/test/winpty.py
index f197aa5..02b1981 100644
--- a/pylib/cqlshlib/test/winpty.py
+++ b/pylib/cqlshlib/test/winpty.py
@@ -15,8 +15,8 @@
 # limitations under the License.
 
 from threading import Thread
-from six import StringIO
-from six.moves.queue import Queue, Empty
+from io import StringIO
+from queue import Queue, Empty
 
 
 class WinPty(object):
@@ -47,4 +47,4 @@
                 count = count + 1
         except Empty:
             pass
-        return buf.getvalue()
\ No newline at end of file
+        return buf.getvalue()
diff --git a/pylib/cqlshlib/tracing.py b/pylib/cqlshlib/tracing.py
index 0f1988a..3db8e34 100644
--- a/pylib/cqlshlib/tracing.py
+++ b/pylib/cqlshlib/tracing.py
@@ -14,12 +14,11 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-from datetime import datetime, timedelta
+from datetime import datetime
 import time
 
 from cassandra.query import QueryTrace, TraceUnavailable
 from cqlshlib.displaying import MAGENTA
-from cqlshlib.formatting import CqlType
 
 
 def print_trace_session(shell, session, session_id, partial_session=False):
@@ -74,8 +73,6 @@
     if trace.duration:
         finished_at = (datetime_from_utc_to_local(trace.started_at) + trace.duration)
         rows.append(['Request complete', str(finished_at), trace.coordinator, total_micro_seconds(trace.duration), trace.client])
-    else:
-        finished_at = trace.duration = "--"
 
     return rows
 
diff --git a/pylib/cqlshlib/util.py b/pylib/cqlshlib/util.py
index 82a332f..144586a 100644
--- a/pylib/cqlshlib/util.py
+++ b/pylib/cqlshlib/util.py
@@ -18,10 +18,12 @@
 import cProfile
 import codecs
 import pstats
-
+import os
+import errno
+import stat
 
 from datetime import timedelta, tzinfo
-from six import StringIO
+from io import StringIO
 
 try:
     from line_profiler import LineProfiler
@@ -112,6 +114,21 @@
     return s
 
 
+def is_file_secure(filename):
+    try:
+        st = os.stat(filename)
+    except OSError as e:
+        if e.errno != errno.ENOENT:
+            raise
+        # the file doesn't exist, the security of it is irrelevant
+        return True
+    uid = os.getuid()
+
+    # Skip enforcing the file owner and UID matching for the root user (uid == 0).
+    # This is to allow "sudo cqlsh" to work with user owned credentials file.
+    return (uid == 0 or st.st_uid == uid) and stat.S_IMODE(st.st_mode) & (stat.S_IRGRP | stat.S_IROTH) == 0
+
+
 def get_file_encoding_bomsize(filename):
     """
     Checks the beginning of a file for a Unicode BOM.  Based on this check,
diff --git a/pylib/pytest.ini b/pylib/pytest.ini
deleted file mode 100644
index d360f07..0000000
--- a/pylib/pytest.ini
+++ /dev/null
@@ -1,2 +0,0 @@
-[pytest]
-addopts = --junit-xml=nosetests.xml
diff --git a/pylib/requirements.txt b/pylib/requirements.txt
index 8788690..c030460 100644
--- a/pylib/requirements.txt
+++ b/pylib/requirements.txt
@@ -1,17 +1,5 @@
-# See python driver docs: six have to be installed before
-# cythonizing the driver, perhaps only on old pips.
-# http://datastax.github.io/python-driver/installation.html#cython-based-extensions
-six>=1.12.0
 -e git+https://github.com/datastax/python-driver.git@cassandra-test#egg=cassandra-driver
 # Used ccm version is tracked by cassandra-test branch in ccm repo. Please create a PR there for fixes or upgrades to new releases.
 -e git+https://github.com/riptano/ccm.git@cassandra-test#egg=ccm
 coverage
-decorator
-docopt
-enum34
-flaky
-mock
 pytest
-parse
-pycodestyle
-psutil
diff --git a/redhat/cassandra.spec b/redhat/cassandra.spec
index 4785262..7431c1c 100644
--- a/redhat/cassandra.spec
+++ b/redhat/cassandra.spec
@@ -191,7 +191,6 @@
 
 %files tools
 %attr(755,root,root) %{_bindir}/sstabledump
-%attr(755,root,root) %{_bindir}/cassandra-stressd
 %attr(755,root,root) %{_bindir}/compaction-stress
 %attr(755,root,root) %{_bindir}/sstableexpiredblockers
 %attr(755,root,root) %{_bindir}/sstablelevelreset
@@ -203,6 +202,7 @@
 %attr(755,root,root) %{_bindir}/jmxtool
 %attr(755,root,root) %{_bindir}/fqltool
 %attr(755,root,root) %{_bindir}/generatetokens
+%attr(755,root,root) %{_bindir}/hash_password
 
 
 %changelog
diff --git a/redhat/noboolean/cassandra.spec b/redhat/noboolean/cassandra.spec
index c1ff712..a3abaa6 100644
--- a/redhat/noboolean/cassandra.spec
+++ b/redhat/noboolean/cassandra.spec
@@ -191,7 +191,6 @@
 
 %files tools
 %attr(755,root,root) %{_bindir}/sstabledump
-%attr(755,root,root) %{_bindir}/cassandra-stressd
 %attr(755,root,root) %{_bindir}/compaction-stress
 %attr(755,root,root) %{_bindir}/sstableexpiredblockers
 %attr(755,root,root) %{_bindir}/sstablelevelreset
@@ -203,6 +202,7 @@
 %attr(755,root,root) %{_bindir}/jmxtool
 %attr(755,root,root) %{_bindir}/fqltool
 %attr(755,root,root) %{_bindir}/generatetokens
+%attr(755,root,root) %{_bindir}/hash_password
 
 
 %changelog
diff --git a/src/antlr/Lexer.g b/src/antlr/Lexer.g
index d7c0d23..72ab7db 100644
--- a/src/antlr/Lexer.g
+++ b/src/antlr/Lexer.g
@@ -150,6 +150,7 @@
 K_SUPERUSER:   S U P E R U S E R;
 K_NOSUPERUSER: N O S U P E R U S E R;
 K_PASSWORD:    P A S S W O R D;
+K_HASHED:      H A S H E D;
 K_LOGIN:       L O G I N;
 K_NOLOGIN:     N O L O G I N;
 K_OPTIONS:     O P T I O N S;
diff --git a/src/antlr/Parser.g b/src/antlr/Parser.g
index b3ba7b3..d061ee4 100644
--- a/src/antlr/Parser.g
+++ b/src/antlr/Parser.g
@@ -267,7 +267,7 @@
         Term.Raw limit = null;
         Term.Raw perPartitionLimit = null;
         Map<ColumnIdentifier, Boolean> orderings = new LinkedHashMap<>();
-        List<ColumnIdentifier> groups = new ArrayList<>();
+        List<Selectable.Raw> groups = new ArrayList<>();
         boolean allowFiltering = false;
         boolean isJson = false;
     }
@@ -463,8 +463,8 @@
     : c=cident (K_ASC | K_DESC { reversed = true; })? { orderings.put(c, reversed); }
     ;
 
-groupByClause[List<ColumnIdentifier> groups]
-    : c=cident { groups.add(c); }
+groupByClause[List<Selectable.Raw> groups]
+    : s=unaliasedSelector { groups.add(s); }
     ;
 
 /**
@@ -915,37 +915,45 @@
     ;
 
 /**
- * ALTER KEYSPACE <KS> WITH <property> = <value>;
+ * ALTER KEYSPACE [IF EXISTS] <KS> WITH <property> = <value>;
  */
 alterKeyspaceStatement returns [AlterKeyspaceStatement.Raw stmt]
-    @init { KeyspaceAttributes attrs = new KeyspaceAttributes(); }
-    : K_ALTER K_KEYSPACE ks=keyspaceName
-        K_WITH properties[attrs] { $stmt = new AlterKeyspaceStatement.Raw(ks, attrs); }
+    @init {
+     KeyspaceAttributes attrs = new KeyspaceAttributes();
+     boolean ifExists = false;
+    }
+    : K_ALTER K_KEYSPACE (K_IF K_EXISTS { ifExists = true; } )? ks=keyspaceName
+        K_WITH properties[attrs] { $stmt = new AlterKeyspaceStatement.Raw(ks, attrs, ifExists); }
     ;
 
 /**
  * ALTER TABLE <table> ALTER <column> TYPE <newtype>;
- * ALTER TABLE <table> ADD <column> <newtype>; | ALTER TABLE <table> ADD (<column> <newtype>,<column1> <newtype1>..... <column n> <newtype n>)
- * ALTER TABLE <table> DROP <column>; | ALTER TABLE <table> DROP ( <column>,<column1>.....<column n>)
- * ALTER TABLE <table> RENAME <column> TO <column>;
- * ALTER TABLE <table> WITH <property> = <value>;
+ * ALTER TABLE [IF EXISTS] <table> ADD [IF NOT EXISTS] <column> <newtype>; | ALTER TABLE [IF EXISTS] <table> ADD [IF NOT EXISTS] (<column> <newtype>,<column1> <newtype1>..... <column n> <newtype n>)
+ * ALTER TABLE [IF EXISTS] <table> DROP [IF EXISTS] <column>; | ALTER TABLE [IF EXISTS] <table> DROP [IF EXISTS] ( <column>,<column1>.....<column n>)
+ * ALTER TABLE [IF EXISTS] <table> RENAME [IF EXISTS] <column> TO <column>;
+ * ALTER TABLE [IF EXISTS] <table> WITH <property> = <value>;
  */
 alterTableStatement returns [AlterTableStatement.Raw stmt]
-    : K_ALTER K_COLUMNFAMILY cf=columnFamilyName { $stmt = new AlterTableStatement.Raw(cf); }
+    @init { boolean ifExists = false; }
+    : K_ALTER K_COLUMNFAMILY (K_IF K_EXISTS { ifExists = true; } )?
+      cf=columnFamilyName { $stmt = new AlterTableStatement.Raw(cf, ifExists); }
       (
         K_ALTER id=cident K_TYPE v=comparatorType { $stmt.alter(id, v); }
 
-      | K_ADD  (        id=ident  v=comparatorType  b=isStaticColumn { $stmt.add(id,  v,  b);  }
+      | K_ADD ( K_IF K_NOT K_EXISTS { $stmt.ifColumnNotExists(true); } )?
+              (        id=ident  v=comparatorType  b=isStaticColumn { $stmt.add(id,  v,  b);  }
                | ('('  id1=ident v1=comparatorType b1=isStaticColumn { $stmt.add(id1, v1, b1); }
                  ( ',' idn=ident vn=comparatorType bn=isStaticColumn { $stmt.add(idn, vn, bn); } )* ')') )
 
-      | K_DROP (        id=ident { $stmt.drop(id);  }
+      | K_DROP ( K_IF K_EXISTS { $stmt.ifColumnExists(true); } )?
+               (       id=ident { $stmt.drop(id);  }
                | ('('  id1=ident { $stmt.drop(id1); }
                  ( ',' idn=ident { $stmt.drop(idn); } )* ')') )
                ( K_USING K_TIMESTAMP t=INTEGER { $stmt.timestamp(Long.parseLong(Constants.Literal.integer($t.text).getText())); } )?
 
-      | K_RENAME id1=ident K_TO toId1=ident { $stmt.rename(id1, toId1); }
-         ( K_AND idn=ident K_TO toIdn=ident { $stmt.rename(idn, toIdn); } )*
+      | K_RENAME ( K_IF K_EXISTS { $stmt.ifColumnExists(true); } )?
+               (        id1=ident K_TO toId1=ident { $stmt.rename(id1, toId1); }
+                ( K_AND idn=ident K_TO toIdn=ident { $stmt.rename(idn, toIdn); } )* )
 
       | K_DROP K_COMPACT K_STORAGE { $stmt.dropCompactStorage(); }
 
@@ -961,28 +969,32 @@
 alterMaterializedViewStatement returns [AlterViewStatement.Raw stmt]
     @init {
         TableAttributes attrs = new TableAttributes();
+        boolean ifExists = false;
     }
-    : K_ALTER K_MATERIALIZED K_VIEW name=columnFamilyName
+    : K_ALTER K_MATERIALIZED K_VIEW (K_IF K_EXISTS { ifExists = true; } )? name=columnFamilyName
           K_WITH properties[attrs]
     {
-        $stmt = new AlterViewStatement.Raw(name, attrs);
+        $stmt = new AlterViewStatement.Raw(name, attrs, ifExists);
     }
     ;
 
 
 /**
- * ALTER TYPE <name> ALTER <field> TYPE <newtype>;
- * ALTER TYPE <name> ADD <field> <newtype>;
- * ALTER TYPE <name> RENAME <field> TO <newtype> AND ...;
+ * ALTER TYPE [IF EXISTS] <name> ALTER <field> TYPE <newtype>;
+ * ALTER TYPE [IF EXISTS] <name> ADD [IF NOT EXISTS]<field> <newtype>;
+ * ALTER TYPE [IF EXISTS] <name> RENAME [IF EXISTS] <field> TO <newtype> AND ...;
  */
 alterTypeStatement returns [AlterTypeStatement.Raw stmt]
-    : K_ALTER K_TYPE name=userTypeName { $stmt = new AlterTypeStatement.Raw(name); }
+    @init {
+        boolean ifExists = false;
+    }
+    : K_ALTER K_TYPE (K_IF K_EXISTS { ifExists = true; } )? name=userTypeName { $stmt = new AlterTypeStatement.Raw(name, ifExists); }
       (
         K_ALTER   f=fident K_TYPE v=comparatorType { $stmt.alter(f, v); }
 
-      | K_ADD     f=fident v=comparatorType        { $stmt.add(f, v); }
+      | K_ADD (K_IF K_NOT K_EXISTS { $stmt.ifFieldNotExists(true); } )?     f=fident v=comparatorType        { $stmt.add(f, v); }
 
-      | K_RENAME f1=fident K_TO toF1=fident        { $stmt.rename(f1, toF1); }
+      | K_RENAME (K_IF K_EXISTS { $stmt.ifFieldExists(true); } )? f1=fident K_TO toF1=fident        { $stmt.rename(f1, toF1); }
          ( K_AND fn=fident K_TO toFn=fident        { $stmt.rename(fn, toFn); } )*
       )
     ;
@@ -1037,7 +1049,7 @@
     ;
 
 /**
- * GRANT <permission> ON <resource> TO <rolename>
+ * GRANT <permission>[, <permission>]* | ALL ON <resource> TO <rolename>
  */
 grantPermissionsStatement returns [GrantPermissionsStatement stmt]
     : K_GRANT
@@ -1050,7 +1062,7 @@
     ;
 
 /**
- * REVOKE <permission> ON <resource> FROM <rolename>
+ * REVOKE <permission>[, <permission>]* | ALL ON <resource> FROM <rolename>
  */
 revokePermissionsStatement returns [RevokePermissionsStatement stmt]
     : K_REVOKE
@@ -1105,7 +1117,7 @@
 
 permissionOrAll returns [Set<Permission> perms]
     : K_ALL ( K_PERMISSIONS )?       { $perms = Permission.ALL; }
-    | p=permission ( K_PERMISSION )? { $perms = EnumSet.of($p.perm); }
+    | p=permission ( K_PERMISSION )? { $perms = EnumSet.of($p.perm); } ( ',' p=permission ( K_PERMISSION )? { $perms.add($p.perm); } )*
     ;
 
 resource returns [IResource res]
@@ -1118,8 +1130,8 @@
 dataResource returns [DataResource res]
     : K_ALL K_KEYSPACES { $res = DataResource.root(); }
     | K_KEYSPACE ks = keyspaceName { $res = DataResource.keyspace($ks.id); }
-    | ( K_COLUMNFAMILY )? cf = columnFamilyName
-      { $res = DataResource.table($cf.name.getKeyspace(), $cf.name.getName()); }
+    | ( K_COLUMNFAMILY )? cf = columnFamilyName { $res = DataResource.table($cf.name.getKeyspace(), $cf.name.getName()); }
+    | K_ALL K_TABLES K_IN K_KEYSPACE ks = keyspaceName { $res = DataResource.allTables($ks.id); }
     ;
 
 jmxResource returns [JMXResource res]
@@ -1169,22 +1181,33 @@
       ( K_WITH userPassword[opts] )?
       ( K_SUPERUSER { superuser = true; } | K_NOSUPERUSER { superuser = false; } )?
       { opts.setOption(IRoleManager.Option.SUPERUSER, superuser);
+        if (opts.getPassword().isPresent() && opts.getHashedPassword().isPresent())
+        {
+           throw new SyntaxException("Options 'password' and 'hashed password' are mutually exclusive");
+        }
         $stmt = new CreateRoleStatement(name, opts, DCPermissions.all(), ifNotExists); }
     ;
 
 /**
- * ALTER USER <username> [WITH PASSWORD <password>] [SUPERUSER|NOSUPERUSER]
+ * ALTER USER [IF EXISTS] <username> [WITH PASSWORD <password>] [SUPERUSER|NOSUPERUSER]
  */
 alterUserStatement returns [AlterRoleStatement stmt]
     @init {
         RoleOptions opts = new RoleOptions();
         RoleName name = new RoleName();
+        boolean ifExists = false;
     }
-    : K_ALTER K_USER u=username { name.setName($u.text, true); }
+    : K_ALTER K_USER (K_IF K_EXISTS { ifExists = true; })? u=username { name.setName($u.text, true); }
       ( K_WITH userPassword[opts] )?
       ( K_SUPERUSER { opts.setOption(IRoleManager.Option.SUPERUSER, true); }
         | K_NOSUPERUSER { opts.setOption(IRoleManager.Option.SUPERUSER, false); } ) ?
-      {  $stmt = new AlterRoleStatement(name, opts, null); }
+      {
+         if (opts.getPassword().isPresent() && opts.getHashedPassword().isPresent())
+         {
+            throw new SyntaxException("Options 'password' and 'hashed password' are mutually exclusive");
+         }
+         $stmt = new AlterRoleStatement(name, opts, null, ifExists);
+      }
     ;
 
 /**
@@ -1232,12 +1255,16 @@
         {
             opts.setOption(IRoleManager.Option.SUPERUSER, false);
         }
+        if (opts.getPassword().isPresent() && opts.getHashedPassword().isPresent())
+        {
+            throw new SyntaxException("Options 'password' and 'hashed password' are mutually exclusive");
+        }
         $stmt = new CreateRoleStatement(name, opts, dcperms.build(), ifNotExists);
       }
     ;
 
 /**
- * ALTER ROLE <rolename> [ [WITH] option [ [AND] option ]* ]
+ * ALTER ROLE [IF EXISTS] <rolename> [ [WITH] option [ [AND] option ]* ]
  *
  * where option can be:
  *  PASSWORD = '<password>'
@@ -1249,10 +1276,17 @@
     @init {
         RoleOptions opts = new RoleOptions();
         DCPermissions.Builder dcperms = DCPermissions.builder();
+        boolean ifExists = false;
     }
-    : K_ALTER K_ROLE name=userOrRoleName
+    : K_ALTER K_ROLE (K_IF K_EXISTS { ifExists = true; })? name=userOrRoleName
       ( K_WITH roleOptions[opts, dcperms] )?
-      {  $stmt = new AlterRoleStatement(name, opts, dcperms.isModified() ? dcperms.build() : null); }
+      {
+         if (opts.getPassword().isPresent() && opts.getHashedPassword().isPresent())
+         {
+            throw new SyntaxException("Options 'password' and 'hashed password' are mutually exclusive");
+         }
+         $stmt = new AlterRoleStatement(name, opts, dcperms.isModified() ? dcperms.build() : null, ifExists);
+      }
     ;
 
 /**
@@ -1286,6 +1320,7 @@
 
 roleOption[RoleOptions opts, DCPermissions.Builder dcperms]
     :  K_PASSWORD '=' v=STRING_LITERAL { opts.setOption(IRoleManager.Option.PASSWORD, $v.text); }
+    |  K_HASHED K_PASSWORD '=' v=STRING_LITERAL { opts.setOption(IRoleManager.Option.HASHED_PASSWORD, $v.text); }
     |  K_OPTIONS '=' m=fullMapLiteral { opts.setOption(IRoleManager.Option.OPTIONS, convertPropertyMap(m)); }
     |  K_SUPERUSER '=' b=BOOLEAN { opts.setOption(IRoleManager.Option.SUPERUSER, Boolean.valueOf($b.text)); }
     |  K_LOGIN '=' b=BOOLEAN { opts.setOption(IRoleManager.Option.LOGIN, Boolean.valueOf($b.text)); }
@@ -1300,6 +1335,7 @@
 // for backwards compatibility in CREATE/ALTER USER, this has no '='
 userPassword[RoleOptions opts]
     :  K_PASSWORD v=STRING_LITERAL { opts.setOption(IRoleManager.Option.PASSWORD, $v.text); }
+    |  K_HASHED K_PASSWORD v=STRING_LITERAL { opts.setOption(IRoleManager.Option.HASHED_PASSWORD, $v.text); }
     ;
 
 /**
@@ -1554,9 +1590,10 @@
     ;
 
 simpleTerm returns [Term.Raw term]
-    : v=value                                 { $term = v; }
-    | f=function                              { $term = f; }
-    | '(' c=comparatorType ')' t=simpleTerm   { $term = new TypeCast(c, t); }
+    : v=value                                        { $term = v; }
+    | f=function                                     { $term = f; }
+    | '(' c=comparatorType ')' t=simpleTerm          { $term = new TypeCast(c, t); }
+    | K_CAST '(' t=simpleTerm K_AS n=native_type ')' { $term = FunctionCall.Raw.newCast(t, n); }
     ;
 
 columnOperation[List<Pair<ColumnIdentifier, Operation.RawUpdate>> operations]
@@ -1625,6 +1662,7 @@
     // Note: we'll reject duplicates later
     : key=cident
         ( op=relationType t=term { conditions.add(Pair.create(key, ColumnCondition.Raw.simpleCondition(t, op))); }
+        | op=containsOperator t=term { conditions.add(Pair.create(key, ColumnCondition.Raw.simpleCondition(t, op))); }
         | K_IN
             ( values=singleColumnInValues { conditions.add(Pair.create(key, ColumnCondition.Raw.simpleInCondition(values))); }
             | marker=inMarker { conditions.add(Pair.create(key, ColumnCondition.Raw.simpleInCondition(marker))); }
@@ -1776,7 +1814,7 @@
     | K_COUNTER   { $t = CQL3Type.Native.COUNTER; }
     | K_DECIMAL   { $t = CQL3Type.Native.DECIMAL; }
     | K_DOUBLE    { $t = CQL3Type.Native.DOUBLE; }
-    | K_DURATION    { $t = CQL3Type.Native.DURATION; }
+    | K_DURATION  { $t = CQL3Type.Native.DURATION; }
     | K_FLOAT     { $t = CQL3Type.Native.FLOAT; }
     | K_INET      { $t = CQL3Type.Native.INET;}
     | K_INT       { $t = CQL3Type.Native.INT; }
@@ -1868,6 +1906,7 @@
         | K_NOLOGIN
         | K_OPTIONS
         | K_PASSWORD
+        | K_HASHED
         | K_EXISTS
         | K_CUSTOM
         | K_TRIGGER
diff --git a/src/java/org/apache/cassandra/audit/AuditLogEntry.java b/src/java/org/apache/cassandra/audit/AuditLogEntry.java
index 4d3b867..02db076 100644
--- a/src/java/org/apache/cassandra/audit/AuditLogEntry.java
+++ b/src/java/org/apache/cassandra/audit/AuditLogEntry.java
@@ -32,6 +32,8 @@
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class AuditLogEntry
 {
     private final InetAddressAndPort host = FBUtilities.getBroadcastAddressAndPort();
@@ -74,10 +76,10 @@
         StringBuilder builder = new StringBuilder(100);
         builder.append("user:").append(user)
                .append("|host:").append(host)
-               .append("|source:").append(source.address);
-        if (source.port > 0)
+               .append("|source:").append(source.getAddress());
+        if (source.getPort() > 0)
         {
-            builder.append("|port:").append(source.port);
+            builder.append("|port:").append(source.getPort());
         }
 
         builder.append("|timestamp:").append(timestamp)
@@ -214,7 +216,7 @@
                 user = AuthenticatedUser.SYSTEM_USER.getName();
             }
 
-            timestamp = System.currentTimeMillis();
+            timestamp = currentTimeMillis();
         }
 
         public Builder(AuditLogEntry entry)
@@ -312,7 +314,7 @@
 
         public AuditLogEntry build()
         {
-            timestamp = timestamp > 0 ? timestamp : System.currentTimeMillis();
+            timestamp = timestamp > 0 ? timestamp : currentTimeMillis();
             return new AuditLogEntry(type, source, user, timestamp, batch, keyspace, scope, operation, options, state);
         }
     }
diff --git a/src/java/org/apache/cassandra/audit/AuditLogEntryCategory.java b/src/java/org/apache/cassandra/audit/AuditLogEntryCategory.java
index 616658c..9db4ce0 100644
--- a/src/java/org/apache/cassandra/audit/AuditLogEntryCategory.java
+++ b/src/java/org/apache/cassandra/audit/AuditLogEntryCategory.java
@@ -24,4 +24,4 @@
 public enum AuditLogEntryCategory
 {
     QUERY, DML, DDL, DCL, OTHER, AUTH, ERROR, PREPARE
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/audit/AuditLogFilter.java b/src/java/org/apache/cassandra/audit/AuditLogFilter.java
index 163114d..d240e78 100644
--- a/src/java/org/apache/cassandra/audit/AuditLogFilter.java
+++ b/src/java/org/apache/cassandra/audit/AuditLogFilter.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.audit;
 
-import java.util.HashSet;
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
@@ -25,18 +24,18 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-public class AuditLogFilter
+final class AuditLogFilter
 {
     private static final Logger logger = LoggerFactory.getLogger(AuditLogFilter.class);
 
     private static ImmutableSet<String> EMPTY_FILTERS = ImmutableSet.of();
 
-    private final ImmutableSet<String> excludedKeyspaces;
-    private final ImmutableSet<String> includedKeyspaces;
-    private final ImmutableSet<String> excludedCategories;
-    private final ImmutableSet<String> includedCategories;
-    private final ImmutableSet<String> includedUsers;
-    private final ImmutableSet<String> excludedUsers;
+    final ImmutableSet<String> excludedKeyspaces;
+    final ImmutableSet<String> includedKeyspaces;
+    final ImmutableSet<String> excludedCategories;
+    final ImmutableSet<String> includedCategories;
+    final ImmutableSet<String> includedUsers;
+    final ImmutableSet<String> excludedUsers;
 
     private AuditLogFilter(ImmutableSet<String> excludedKeyspaces, ImmutableSet<String> includedKeyspaces, ImmutableSet<String> excludedCategories, ImmutableSet<String> includedCategories, ImmutableSet<String> excludedUsers, ImmutableSet<String> includedUsers)
     {
diff --git a/src/java/org/apache/cassandra/audit/AuditLogManager.java b/src/java/org/apache/cassandra/audit/AuditLogManager.java
index 88e0251..ed10460 100644
--- a/src/java/org/apache/cassandra/audit/AuditLogManager.java
+++ b/src/java/org/apache/cassandra/audit/AuditLogManager.java
@@ -25,6 +25,7 @@
 import java.util.UUID;
 
 import javax.annotation.Nullable;
+import javax.management.openmbean.CompositeData;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
@@ -49,29 +50,32 @@
 import org.apache.cassandra.transport.Message;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.MBeanWrapper;
 
 /**
  * Central location for managing the logging of client/user-initated actions (like queries, log in commands, and so on).
  *
  */
-public class AuditLogManager implements QueryEvents.Listener, AuthEvents.Listener
+public class AuditLogManager implements QueryEvents.Listener, AuthEvents.Listener, AuditLogManagerMBean
 {
     private static final Logger logger = LoggerFactory.getLogger(AuditLogManager.class);
+
+    public static final String MBEAN_NAME = "org.apache.cassandra.db:type=AuditLogManager";
     public static final AuditLogManager instance = new AuditLogManager();
 
     // auditLogger can write anywhere, as it's pluggable (logback, BinLog, DiagnosticEvents, etc ...)
     private volatile IAuditLogger auditLogger;
-
     private volatile AuditLogFilter filter;
+    private volatile AuditLogOptions auditLogOptions;
 
     private AuditLogManager()
     {
-        final AuditLogOptions auditLogOptions = DatabaseDescriptor.getAuditLoggingOptions();
+        auditLogOptions = DatabaseDescriptor.getAuditLoggingOptions();
 
         if (auditLogOptions.enabled)
         {
             logger.info("Audit logging is enabled.");
-            auditLogger = getAuditLogger(auditLogOptions.logger);
+            auditLogger = getAuditLogger(auditLogOptions);
         }
         else
         {
@@ -86,16 +90,21 @@
     {
         if (DatabaseDescriptor.getAuditLoggingOptions().enabled)
             registerAsListener();
+
+        if (!MBeanWrapper.instance.isRegistered(MBEAN_NAME))
+            MBeanWrapper.instance.registerMBean(this, MBEAN_NAME);
     }
 
-    private IAuditLogger getAuditLogger(ParameterizedClass logger) throws ConfigurationException
+    private IAuditLogger getAuditLogger(AuditLogOptions options) throws ConfigurationException
     {
-        if (logger.class_name != null)
+        final ParameterizedClass logger = options.logger;
+
+        if (logger != null && logger.class_name != null)
         {
             return FBUtilities.newAuditLogger(logger.class_name, logger.parameters == null ? Collections.emptyMap() : logger.parameters);
         }
 
-        return FBUtilities.newAuditLogger(BinAuditLogger.class.getName(), Collections.emptyMap());
+        return new BinAuditLogger(options);
     }
 
     @VisibleForTesting
@@ -109,6 +118,17 @@
         return auditLogger.isEnabled();
     }
 
+    public AuditLogOptions getAuditLogOptions()
+    {
+        return auditLogger.isEnabled() ? auditLogOptions : DatabaseDescriptor.getAuditLoggingOptions();
+    }
+
+    @Override
+    public CompositeData getAuditLogOptionsData()
+    {
+        return AuditLogOptionsCompositeData.toCompositeData(AuditLogManager.instance.getAuditLogOptions());
+    }
+
     /**
      * Logs AudigLogEntry to standard audit logger
      * @param logEntry AuditLogEntry to be logged
@@ -166,16 +186,28 @@
      */
     public synchronized void enable(AuditLogOptions auditLogOptions) throws ConfigurationException
     {
-        // always reload the filters
-        filter = AuditLogFilter.create(auditLogOptions);
-
-        // next, check to see if we're changing the logging implementation; if not, keep the same instance and bail.
-        // note: auditLogger should never be null
         IAuditLogger oldLogger = auditLogger;
-        if (oldLogger.getClass().getSimpleName().equals(auditLogOptions.logger.class_name))
-            return;
 
-        auditLogger = getAuditLogger(auditLogOptions.logger);
+        try
+        {
+            // next, check to see if we're changing the logging implementation; if not, keep the same instance and bail.
+            // note: auditLogger should never be null
+            if (oldLogger.getClass().getSimpleName().equals(auditLogOptions.logger.class_name))
+                return;
+
+            auditLogger = getAuditLogger(auditLogOptions);
+            // switch to these audit log options after getAuditLogger() has not thrown
+            // otherwise we might stay with new options but with old logger if it failed
+            this.auditLogOptions = auditLogOptions;
+        }
+        finally
+        {
+            // always reload the filters
+            filter = AuditLogFilter.create(auditLogOptions);
+            // update options so the changed filters are reflected in options,
+            // for example upon nodetool's getauditlog command
+            updateAuditLogOptions(this.auditLogOptions, filter);
+        }
 
         // note that we might already be registered here and we rely on the fact that Query/AuthEvents have a Set of listeners
         registerAsListener();
@@ -185,6 +217,16 @@
         oldLogger.stop();
     }
 
+    private void updateAuditLogOptions(final AuditLogOptions options, final AuditLogFilter filter)
+    {
+        options.included_keyspaces = String.join(",", filter.includedKeyspaces.asList());
+        options.excluded_keyspaces = String.join(",", filter.excludedKeyspaces.asList());
+        options.included_categories = String.join(",", filter.includedCategories.asList());
+        options.excluded_categories = String.join(",", filter.excludedCategories.asList());
+        options.included_users = String.join(",", filter.includedUsers.asList());
+        options.excluded_users = String.join(",", filter.excludedUsers.asList());
+    }
+
     private void registerAsListener()
     {
         QueryEvents.instance.registerListener(this);
diff --git a/src/java/org/apache/cassandra/audit/AuditLogManagerMBean.java b/src/java/org/apache/cassandra/audit/AuditLogManagerMBean.java
new file mode 100644
index 0000000..5d2f661
--- /dev/null
+++ b/src/java/org/apache/cassandra/audit/AuditLogManagerMBean.java
@@ -0,0 +1,29 @@
+/*
+ * 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.audit;
+
+import javax.management.openmbean.CompositeData;
+
+public interface AuditLogManagerMBean
+{
+    /**
+     * Returns the current state of Audit Log framework.
+     */
+    CompositeData getAuditLogOptionsData();
+}
diff --git a/src/java/org/apache/cassandra/audit/AuditLogOptions.java b/src/java/org/apache/cassandra/audit/AuditLogOptions.java
index e8691df..e9e31c9 100644
--- a/src/java/org/apache/cassandra/audit/AuditLogOptions.java
+++ b/src/java/org/apache/cassandra/audit/AuditLogOptions.java
@@ -17,12 +17,21 @@
  */
 package org.apache.cassandra.audit;
 
+import java.nio.file.Path;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.stream.Collectors;
 
+import com.google.common.base.Strings;
 import org.apache.commons.lang3.StringUtils;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.ParameterizedClass;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.binlog.BinLogOptions;
 
 public class AuditLogOptions extends BinLogOptions
@@ -37,11 +46,242 @@
     public String included_users = StringUtils.EMPTY;
     public String excluded_users = StringUtils.EMPTY;
 
-    /**
-     * AuditLogs directory can be configured using `cassandra.logdir.audit` or default is set to `cassandra.logdir` + /audit/
-     */
-    public String audit_logs_dir = System.getProperty("cassandra.logdir.audit",
-                                                      System.getProperty("cassandra.logdir",".")+"/audit/");
+    public String audit_logs_dir;
+
+    public AuditLogOptions()
+    {
+        String auditLogDir = CassandraRelevantProperties.LOG_DIR_AUDIT.getString();
+        String logDir = CassandraRelevantProperties.LOG_DIR.getString() + "/audit";
+        Path path = auditLogDir == null ? File.getPath(logDir) : File.getPath(auditLogDir);
+        audit_logs_dir = path.normalize().toString();
+    }
+
+    public static AuditLogOptions validate(final AuditLogOptions options) throws ConfigurationException
+    {
+        // not validating keyspaces nor users on purpose,
+        // logging might be enabled on these entities before they exist
+        // so they are picked up automatically
+
+        validateCategories(options.included_categories);
+        validateCategories(options.excluded_categories);
+
+        // other fields in BinLogOptions are validated upon BinAuditLogger initialisation
+
+        return options;
+    }
+
+    public static class Builder
+    {
+        private boolean enabled;
+        private ParameterizedClass logger;
+        private String includedKeyspaces;
+        private String excludedKeyspaces;
+        private String includedCategories;
+        private String excludedCategories;
+        private String includedUsers;
+        private String excludedUsers;
+        private String auditLogDir;
+        private int maxQueueWeight;
+        private int maxArchiveRetries;
+        private String rollCycle;
+        private String archiveCommand;
+        private boolean block;
+        private long maxLogSize;
+
+        public Builder()
+        {
+            this(new AuditLogOptions());
+        }
+
+        public Builder(final AuditLogOptions opts)
+        {
+            this.enabled = opts.enabled;
+            this.logger = opts.logger;
+            this.includedKeyspaces = opts.included_keyspaces;
+            this.excludedKeyspaces = opts.excluded_keyspaces;
+            this.includedCategories = opts.included_categories;
+            this.excludedCategories = opts.excluded_categories;
+            this.includedUsers = opts.included_users;
+            this.excludedUsers = opts.excluded_users;
+            this.auditLogDir = opts.audit_logs_dir;
+            this.maxQueueWeight = opts.max_queue_weight;
+            this.maxArchiveRetries = opts.max_archive_retries;
+            this.rollCycle = opts.roll_cycle;
+            this.archiveCommand = opts.archive_command;
+            this.block = opts.block;
+            this.maxLogSize = opts.max_log_size;
+        }
+
+        public Builder withEnabled(boolean enabled)
+        {
+            this.enabled = enabled;
+            return this;
+        }
+
+        public Builder withLogger(final String loggerName, Map<String, String> parameters)
+        {
+
+            if (loggerName != null && !loggerName.trim().isEmpty())
+            {
+                this.logger = new ParameterizedClass(loggerName.trim(), parameters);
+            }
+
+            return this;
+        }
+
+        public Builder withIncludedKeyspaces(final String includedKeyspaces)
+        {
+            sanitise(includedKeyspaces).map(v -> this.includedKeyspaces = v);
+            return this;
+        }
+
+        public Builder withExcludedKeyspaces(final String excludedKeyspaces)
+        {
+            sanitise(excludedKeyspaces).map(v -> this.excludedKeyspaces = v);
+            return this;
+        }
+
+        public Builder withIncludedCategories(final String includedCategories)
+        {
+            sanitise(includedCategories).map(v -> this.includedCategories = v.toUpperCase());
+            return this;
+        }
+
+        public Builder withExcludedCategories(final String excludedCategories)
+        {
+            sanitise(excludedCategories).map(v -> this.excludedCategories = v.toUpperCase());
+            return this;
+        }
+
+        public Builder withIncludedUsers(final String includedUsers)
+        {
+            sanitise(includedUsers).map(v -> this.includedUsers = v);
+            return this;
+        }
+
+        public Builder withExcludedUsers(final String excludedUsers)
+        {
+            sanitise(excludedUsers).map(v -> this.excludedUsers = v);
+            return this;
+        }
+
+        public Builder withAuditLogDir(final String auditLogDir)
+        {
+            this.auditLogDir = auditLogDir;
+            return this;
+        }
+
+        public Builder withRollCycle(final String rollCycle)
+        {
+            sanitise(rollCycle).map(v -> this.rollCycle = v.toUpperCase());
+            return this;
+        }
+
+        public Builder withArchiveCommand(final String archiveCommand)
+        {
+            if (archiveCommand != null)
+            {
+                this.archiveCommand = archiveCommand;
+            }
+            return this;
+        }
+
+        public Builder withBlock(final Boolean block)
+        {
+            if (block != null)
+            {
+                this.block = block;
+            }
+            return this;
+        }
+
+        public Builder withMaxLogSize(final long maxLogSize)
+        {
+            if (maxLogSize != Long.MIN_VALUE)
+            {
+                this.maxLogSize = maxLogSize;
+            }
+            return this;
+        }
+
+        public Builder withMaxArchiveRetries(final int maxArchiveRetries)
+        {
+            if (maxArchiveRetries != Integer.MIN_VALUE)
+            {
+                this.maxArchiveRetries = maxArchiveRetries;
+            }
+            return this;
+        }
+
+        public Builder withMaxQueueWeight(final int maxQueueWeight)
+        {
+            if (maxQueueWeight != Integer.MIN_VALUE)
+            {
+                this.maxQueueWeight = maxQueueWeight;
+            }
+            return this;
+        }
+
+        public AuditLogOptions build()
+        {
+            final AuditLogOptions opts = new AuditLogOptions();
+
+            opts.enabled = this.enabled;
+            opts.logger = this.logger;
+            sanitise(this.includedKeyspaces).map(v -> opts.included_keyspaces = v);
+            sanitise(this.excludedKeyspaces).map(v -> opts.excluded_keyspaces = v);
+            sanitise(this.includedCategories).map(v -> opts.included_categories = v.toUpperCase());
+            sanitise(this.excludedCategories).map(v -> opts.excluded_categories = v.toUpperCase());
+            sanitise(this.includedUsers).map(v -> opts.included_users = v);
+            sanitise(this.excludedUsers).map(v -> opts.excluded_users = v);
+            opts.roll_cycle = this.rollCycle;
+            opts.audit_logs_dir = this.auditLogDir;
+            opts.max_queue_weight = this.maxQueueWeight;
+            opts.max_archive_retries = this.maxArchiveRetries;
+            opts.archive_command = this.archiveCommand;
+            opts.block = this.block;
+            opts.max_log_size = this.maxLogSize;
+
+            AuditLogOptions.validate(opts);
+
+            return opts;
+        }
+
+        private static Optional<String> sanitise(final String input)
+        {
+            if (input == null || input.trim().isEmpty())
+                return Optional.empty();
+
+            return Optional.of(Arrays.stream(input.split(","))
+                                     .map(String::trim)
+                                     .map(Strings::emptyToNull)
+                                     .filter(Objects::nonNull)
+                                     .collect(Collectors.joining(",")));
+        }
+    }
+
+    private static void validateCategories(final String categories)
+    {
+        assert categories != null;
+
+        if (categories.isEmpty())
+            return;
+
+        for (final String includedCategory : categories.split(","))
+        {
+            try
+            {
+                AuditLogEntryCategory.valueOf(includedCategory);
+            }
+            catch (final IllegalArgumentException ex)
+            {
+                throw new ConfigurationException(String.format("category %s not found in %s",
+                                                               includedCategory,
+                                                               AuditLogEntryCategory.class.getName()),
+                                                 ex);
+            }
+        }
+    }
 
     public String toString()
     {
@@ -60,6 +300,7 @@
                ", block=" + block +
                ", max_queue_weight=" + max_queue_weight +
                ", max_log_size=" + max_log_size +
+               ", max_archive_retries=" + max_archive_retries +
                '}';
     }
 }
diff --git a/src/java/org/apache/cassandra/audit/AuditLogOptionsCompositeData.java b/src/java/org/apache/cassandra/audit/AuditLogOptionsCompositeData.java
new file mode 100644
index 0000000..6812e71
--- /dev/null
+++ b/src/java/org/apache/cassandra/audit/AuditLogOptionsCompositeData.java
@@ -0,0 +1,232 @@
+/*
+ * 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.audit;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+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 org.apache.cassandra.config.ParameterizedClass;
+import org.apache.cassandra.utils.Pair;
+
+import static org.apache.cassandra.audit.AuditLogOptionsCompositeData.AuditLogOption.option;
+
+public class AuditLogOptionsCompositeData
+{
+    public static class AuditLogOption
+    {
+        // TODO these constants will be used in upcoming audit log vtable too, see CASSANDRA-16725
+        public static final String AUDIT_LOGS_DIR = "audit_logs_dir";
+        public static final String ARCHIVE_COMMAND = "archive_command";
+        public static final String ROLL_CYCLE = "roll_cycle";
+        public static final String BLOCK = "block";
+        public static final String MAX_QUEUE_WEIGHT = "max_queue_weight";
+        public static final String MAX_LOG_SIZE = "max_log_size";
+        public static final String MAX_ARCHIVE_RETRIES = "max_archive_retries";
+        public static final String ENABLED = "enabled";
+        public static final String INCLUDED_KEYSPACES = "included_keyspaces";
+        public static final String EXCLUDED_KEYSPACES = "excluded_keyspaces";
+        public static final String INCLUDED_CATEGORIES = "included_categories";
+        public static final String EXCLUDED_CATEGORIES = "excluded_categories";
+        public static final String INCLUDED_USERS = "included_users";
+        public static final String EXCLUDED_USERS = "excluded_users";
+        public static final String LOGGER = "logger";
+
+        private final String name;
+        private final String description;
+        private final OpenType<?> type;
+        private final Function<AuditLogOptions, Object> toCompositeMapping;
+        private final BiConsumer<AuditLogOptions, Object> fromCompositeMapping;
+
+        public AuditLogOption(final String name,
+                              final String description,
+                              final OpenType<?> type,
+                              final Function<AuditLogOptions, Object> toCompositeMapping,
+                              final BiConsumer<AuditLogOptions, Object> fromCompositeMapping)
+        {
+            this.name = name;
+            this.description = description;
+            this.type = type;
+            this.toCompositeMapping = toCompositeMapping;
+            this.fromCompositeMapping = fromCompositeMapping;
+        }
+
+        public static AuditLogOption option(final String name,
+                                            final String description,
+                                            final OpenType<?> type,
+                                            final Function<AuditLogOptions, Object> toCompositeMapping,
+                                            final BiConsumer<AuditLogOptions, Object> fromCompositeMapping)
+        {
+            return new AuditLogOption(name, description, type, toCompositeMapping, fromCompositeMapping);
+        }
+    }
+
+    private static final AuditLogOption[] options = new AuditLogOption[]{
+    option(AuditLogOption.AUDIT_LOGS_DIR,
+           "directory where audit data are stored",
+           SimpleType.STRING,
+           o -> o.audit_logs_dir,
+           (opts, obj) -> opts.audit_logs_dir = (String) obj),
+
+    option(AuditLogOption.ARCHIVE_COMMAND,
+           "archive command for audit data",
+           SimpleType.STRING,
+           o -> o.archive_command,
+           (opts, obj) -> opts.archive_command = (String) obj),
+
+    option(AuditLogOption.ROLL_CYCLE,
+           "how often to roll BinLog segments so they can potentially be reclaimed",
+           SimpleType.STRING,
+           o -> o.roll_cycle,
+           (opts, obj) -> opts.roll_cycle = (String) obj),
+
+    option(AuditLogOption.BLOCK,
+           "indicates if the BinLog should block if it falls behind or should drop bin log records",
+           SimpleType.BOOLEAN,
+           o -> o.block,
+           (opts, obj) -> opts.block = (Boolean) obj),
+
+    option(AuditLogOption.MAX_QUEUE_WEIGHT,
+           "maximum weight of in-memory queue for records waiting to be written to the binlog file before blocking or dropping the log records",
+           SimpleType.INTEGER,
+           o -> o.max_queue_weight,
+           (opts, obj) -> opts.max_queue_weight = (Integer) obj),
+
+    option(AuditLogOption.MAX_LOG_SIZE,
+           "maximum size of the rolled files to retain on disk before deleting the oldest file",
+           SimpleType.LONG,
+           o -> o.max_log_size,
+           (opts, obj) -> opts.max_log_size = (Long) obj),
+
+    option(AuditLogOption.MAX_ARCHIVE_RETRIES,
+           "number of times to retry an archive command",
+           SimpleType.INTEGER,
+           o -> o.max_archive_retries,
+           (opts, obj) -> opts.max_archive_retries = (Integer) obj),
+
+    option(AuditLogOption.ENABLED,
+           "boolean telling if we are enabled or not",
+           SimpleType.BOOLEAN,
+           o -> o.enabled,
+           (opts, obj) -> opts.enabled = (Boolean) obj),
+
+    option(AuditLogOption.INCLUDED_KEYSPACES,
+           "included keyspaces",
+           SimpleType.STRING,
+           o -> o.included_keyspaces,
+           (opts, obj) -> opts.included_keyspaces = (String) obj),
+
+    option(AuditLogOption.EXCLUDED_KEYSPACES,
+           "excluded keyspaces",
+           SimpleType.STRING,
+           o -> o.excluded_keyspaces,
+           (opts, obj) -> opts.excluded_keyspaces = (String) obj),
+
+    option(AuditLogOption.INCLUDED_CATEGORIES,
+           "included categories",
+           SimpleType.STRING,
+           o -> o.included_categories,
+           (opts, obj) -> opts.included_categories = (String) obj),
+
+    option(AuditLogOption.EXCLUDED_CATEGORIES,
+           "excluded categories",
+           SimpleType.STRING,
+           o -> o.excluded_categories,
+           (opts, obj) -> opts.excluded_categories = (String) obj),
+
+    option(AuditLogOption.INCLUDED_USERS,
+           "included users",
+           SimpleType.STRING,
+           o -> o.included_users,
+           (opts, obj) -> opts.included_users = (String) obj),
+
+    option(AuditLogOption.EXCLUDED_USERS,
+           "excluded users",
+           SimpleType.STRING,
+           o -> o.excluded_users,
+           (opts, obj) -> opts.excluded_users = (String) obj),
+
+    option(AuditLogOption.LOGGER,
+           "audit logger implementation class name",
+           SimpleType.STRING,
+           o -> o.logger.class_name,
+           (opts, obj) -> opts.logger = new ParameterizedClass((String) obj, new HashMap<>()))
+    };
+
+    public static final CompositeType COMPOSITE_TYPE;
+
+    static
+    {
+        try
+        {
+            COMPOSITE_TYPE = new CompositeType(AuditLogOptions.class.getName(),
+                                               "AuditLogOptions",
+                                               Arrays.stream(options).map(o -> o.name).toArray(String[]::new),
+                                               Arrays.stream(options).map(o -> o.description).toArray(String[]::new),
+                                               Arrays.stream(options).map(o -> o.type).toArray(OpenType[]::new));
+        }
+        catch (final OpenDataException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static CompositeData toCompositeData(final AuditLogOptions opts)
+    {
+        try
+        {
+            final Map<String, Object> valueMap = new HashMap<>();
+
+            for (final Pair<String, Function<AuditLogOptions, Object>> pair : Arrays.stream(options).map(o -> Pair.create(o.name, o.toCompositeMapping)).collect(Collectors.toList()))
+            {
+                valueMap.put(pair.left, pair.right.apply(opts));
+            }
+
+            return new CompositeDataSupport(COMPOSITE_TYPE, valueMap);
+        }
+        catch (final OpenDataException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static AuditLogOptions fromCompositeData(final CompositeData data)
+    {
+        assert data.getCompositeType().equals(COMPOSITE_TYPE);
+
+        final Object[] values = data.getAll(Arrays.stream(options).map(o -> o.name).toArray(String[]::new));
+        final AuditLogOptions opts = new AuditLogOptions();
+
+        for (int i = 0; i < values.length; i++)
+        {
+            options[i].fromCompositeMapping.accept(opts, values[i]);
+        }
+
+        return opts;
+    }
+}
diff --git a/src/java/org/apache/cassandra/audit/BinAuditLogger.java b/src/java/org/apache/cassandra/audit/BinAuditLogger.java
index 95a53f1..607d9fe 100644
--- a/src/java/org/apache/cassandra/audit/BinAuditLogger.java
+++ b/src/java/org/apache/cassandra/audit/BinAuditLogger.java
@@ -17,17 +17,16 @@
  */
 package org.apache.cassandra.audit;
 
-import java.nio.file.Paths;
 import java.util.Map;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import net.openhft.chronicle.wire.WireOut;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.binlog.BinLog;
 import org.apache.cassandra.utils.concurrent.WeightedQueue;
@@ -41,11 +40,9 @@
 
     private volatile BinLog binLog;
 
-    public BinAuditLogger(Map<String, String> params)
+    public BinAuditLogger(AuditLogOptions auditLoggingOptions)
     {
-        AuditLogOptions auditLoggingOptions = DatabaseDescriptor.getAuditLoggingOptions();
-
-        this.binLog = new BinLog.Builder().path(Paths.get(auditLoggingOptions.audit_logs_dir))
+        this.binLog = new BinLog.Builder().path(File.getPath(auditLoggingOptions.audit_logs_dir))
                                           .rollCycle(auditLoggingOptions.roll_cycle)
                                           .blocking(auditLoggingOptions.block)
                                           .maxQueueWeight(auditLoggingOptions.max_queue_weight)
@@ -55,6 +52,11 @@
                                           .build(false);
     }
 
+    public BinAuditLogger(Map<String, String> params)
+    {
+        this(DatabaseDescriptor.getAuditLoggingOptions());
+    }
+
     /**
      * Stop the audit log leaving behind any generated files.
      */
diff --git a/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java b/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java
index 3b40979..a943db0 100644
--- a/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/AllowAllAuthorizer.java
@@ -33,12 +33,12 @@
         return resource.applicablePermissions();
     }
 
-    public void grant(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource to)
+    public Set<Permission> grant(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource to)
     {
         throw new UnsupportedOperationException("GRANT operation is not supported by AllowAllAuthorizer");
     }
 
-    public void revoke(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource from)
+    public Set<Permission> revoke(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource from)
     {
         throw new UnsupportedOperationException("REVOKE operation is not supported by AllowAllAuthorizer");
     }
diff --git a/src/java/org/apache/cassandra/auth/AuthCache.java b/src/java/org/apache/cassandra/auth/AuthCache.java
index 6393da7..66a2a4f 100644
--- a/src/java/org/apache/cassandra/auth/AuthCache.java
+++ b/src/java/org/apache/cassandra/auth/AuthCache.java
@@ -18,43 +18,82 @@
 
 package org.apache.cassandra.auth;
 
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.BiPredicate;
 import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.IntConsumer;
 import java.util.function.IntSupplier;
+import java.util.function.Supplier;
 
+import com.google.common.util.concurrent.Uninterruptibles;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
+import com.github.benmanes.caffeine.cache.Policy;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.concurrent.Shutdownable;
+import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.MBeanWrapper;
 
 import static com.google.common.base.Preconditions.checkNotNull;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 
-public class AuthCache<K, V> implements AuthCacheMBean
+public class AuthCache<K, V> implements AuthCacheMBean, Shutdownable
 {
     private static final Logger logger = LoggerFactory.getLogger(AuthCache.class);
 
-    private static final String MBEAN_NAME_BASE = "org.apache.cassandra.auth:type=";
+    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
+    private static final Set<Shutdownable> REGISTRY = new HashSet<>(4);
+
+    public static void shutdownAllAndWait(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
+    {
+        ExecutorUtils.shutdownNowAndWait(timeout, unit, REGISTRY);
+    }
 
     /**
      * Underlying cache. LoadingCache will call underlying load function on {@link #get} if key is not present
      */
     protected volatile LoadingCache<K, V> cache;
-    private DebuggableThreadPoolExecutor cacheRefreshExecutor;
+    private ExecutorPlus cacheRefreshExecutor;
 
-    private String name;
-    private IntConsumer setValidityDelegate;
-    private IntSupplier getValidityDelegate;
-    private IntConsumer setUpdateIntervalDelegate;
-    private IntSupplier getUpdateIntervalDelegate;
-    private IntConsumer setMaxEntriesDelegate;
-    private IntSupplier getMaxEntriesDelegate;
-    private Function<K, V> loadFunction;
-    private BooleanSupplier enableCache;
+    private final String name;
+    private final IntConsumer setValidityDelegate;
+    private final IntSupplier getValidityDelegate;
+    private final IntConsumer setUpdateIntervalDelegate;
+    private final IntSupplier getUpdateIntervalDelegate;
+    private final IntConsumer setMaxEntriesDelegate;
+    private final IntSupplier getMaxEntriesDelegate;
+    private final Consumer<Boolean> setActiveUpdate;
+    private final BooleanSupplier getActiveUpdate;
+    private final Function<K, V> loadFunction;
+    private final Supplier<Map<K, V>> bulkLoadFunction;
+    private final BooleanSupplier enableCache;
+
+    // Determines whether the presence of a specific value should trigger the invalidation of
+    // the supplied key. Used by CredentialsCache & CacheRefresher to identify when the
+    // credentials for a role couldn't be loaded without throwing an exception or serving stale
+    // values until the natural expiry time.
+    private final BiPredicate<K, V> invalidateCondition;
 
     /**
      * @param name Used for MBean
@@ -64,6 +103,8 @@
      * @param getUpdateIntervalDelegate Getter for update interval
      * @param setMaxEntriesDelegate Used to set max # entries in cache. See {@link com.github.benmanes.caffeine.cache.Policy.Eviction#setMaximum(long)}
      * @param getMaxEntriesDelegate Getter for max entries.
+     * @param setActiveUpdate Method to process config to actively update the auth cache prior to configured cache expiration
+     * @param getActiveUpdate Getter for active update
      * @param loadFunction Function to load the cache. Called on {@link #get(Object)}
      * @param cacheEnabledDelegate Used to determine if cache is enabled.
      */
@@ -74,9 +115,56 @@
                         IntSupplier getUpdateIntervalDelegate,
                         IntConsumer setMaxEntriesDelegate,
                         IntSupplier getMaxEntriesDelegate,
+                        Consumer<Boolean> setActiveUpdate,
+                        BooleanSupplier getActiveUpdate,
                         Function<K, V> loadFunction,
+                        Supplier<Map<K, V>> bulkLoadFunction,
                         BooleanSupplier cacheEnabledDelegate)
     {
+        this(name,
+             setValidityDelegate,
+             getValidityDelegate,
+             setUpdateIntervalDelegate,
+             getUpdateIntervalDelegate,
+             setMaxEntriesDelegate,
+             getMaxEntriesDelegate,
+             setActiveUpdate,
+             getActiveUpdate,
+             loadFunction,
+             bulkLoadFunction,
+             cacheEnabledDelegate,
+             (k, v) -> false);
+    }
+
+    /**
+     * @param name Used for MBean
+     * @param setValidityDelegate Used to set cache validity period. See {@link Policy#expireAfterWrite()}
+     * @param getValidityDelegate Getter for validity period
+     * @param setUpdateIntervalDelegate Used to set cache update interval. See {@link Policy#refreshAfterWrite()}
+     * @param getUpdateIntervalDelegate Getter for update interval
+     * @param setMaxEntriesDelegate Used to set max # entries in cache. See {@link com.github.benmanes.caffeine.cache.Policy.Eviction#setMaximum(long)}
+     * @param getMaxEntriesDelegate Getter for max entries.
+     * @param setActiveUpdate Actively update the cache before expiry
+     * @param getActiveUpdate Getter for active update
+     * @param loadFunction Function to load the cache. Called on {@link #get(Object)}
+     * @param cacheEnabledDelegate Used to determine if cache is enabled.
+     * @param invalidationCondition Used during active updates to determine if a refreshed value indicates a missing
+     *                              entry in the underlying table. If satisfied, the key will be invalidated.
+     */
+    protected AuthCache(String name,
+                        IntConsumer setValidityDelegate,
+                        IntSupplier getValidityDelegate,
+                        IntConsumer setUpdateIntervalDelegate,
+                        IntSupplier getUpdateIntervalDelegate,
+                        IntConsumer setMaxEntriesDelegate,
+                        IntSupplier getMaxEntriesDelegate,
+                        Consumer<Boolean> setActiveUpdate,
+                        BooleanSupplier getActiveUpdate,
+                        Function<K, V> loadFunction,
+                        Supplier<Map<K, V>> bulkLoadFunction,
+                        BooleanSupplier cacheEnabledDelegate,
+                        BiPredicate<K, V> invalidationCondition)
+    {
         this.name = checkNotNull(name);
         this.setValidityDelegate = checkNotNull(setValidityDelegate);
         this.getValidityDelegate = checkNotNull(getValidityDelegate);
@@ -84,8 +172,12 @@
         this.getUpdateIntervalDelegate = checkNotNull(getUpdateIntervalDelegate);
         this.setMaxEntriesDelegate = checkNotNull(setMaxEntriesDelegate);
         this.getMaxEntriesDelegate = checkNotNull(getMaxEntriesDelegate);
+        this.setActiveUpdate = checkNotNull(setActiveUpdate);
+        this.getActiveUpdate = checkNotNull(getActiveUpdate);
         this.loadFunction = checkNotNull(loadFunction);
+        this.bulkLoadFunction = checkNotNull(bulkLoadFunction);
         this.enableCache = checkNotNull(cacheEnabledDelegate);
+        this.invalidateCondition = checkNotNull(invalidationCondition);
         init();
     }
 
@@ -94,9 +186,10 @@
      */
     protected void init()
     {
-        this.cacheRefreshExecutor = new DebuggableThreadPoolExecutor(name + "Refresh", Thread.NORM_PRIORITY);
+        this.cacheRefreshExecutor = executorFactory().sequential(name + "Refresh");
         cache = initCache(null);
         MBeanWrapper.instance.registerMBean(this, getObjectName());
+        REGISTRY.add(this);
     }
 
     protected void unregisterMBean()
@@ -110,6 +203,18 @@
     }
 
     /**
+     * Retrieve all cached entries. Will call {@link LoadingCache#asMap()} which does not trigger "load".
+     * @return a map of cached key-value pairs
+     */
+    public Map<K, V> getAll()
+    {
+        if (cache == null)
+            return Collections.emptyMap();
+
+        return Collections.unmodifiableMap(cache.asMap());
+    }
+
+    /**
      * Retrieve a value from the cache. Will call {@link LoadingCache#get(Object)} which will
      * "load" the value if it's not present, thus populating the key.
      * @param k
@@ -128,13 +233,13 @@
     /**
      * Invalidate the entire cache.
      */
-    public void invalidate()
+    public synchronized void invalidate()
     {
         cache = initCache(null);
     }
 
     /**
-     * Invalidate a key
+     * Invalidate a key.
      * @param k key to invalidate
      */
     public void invalidate(K k)
@@ -147,7 +252,7 @@
      * Time in milliseconds that a value in the cache will expire after.
      * @param validityPeriod in milliseconds
      */
-    public void setValidity(int validityPeriod)
+    public synchronized void setValidity(int validityPeriod)
     {
         if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
             throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
@@ -165,7 +270,7 @@
      * Time in milliseconds after which an entry in the cache should be refreshed (it's load function called again)
      * @param updateInterval in milliseconds
      */
-    public void setUpdateInterval(int updateInterval)
+    public synchronized void setUpdateInterval(int updateInterval)
     {
         if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
             throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
@@ -183,7 +288,7 @@
      * Set maximum number of entries in the cache.
      * @param maxEntries
      */
-    public void setMaxEntries(int maxEntries)
+    public synchronized void setMaxEntries(int maxEntries)
     {
         if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
             throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
@@ -197,6 +302,25 @@
         return getMaxEntriesDelegate.getAsInt();
     }
 
+    public boolean getActiveUpdate()
+    {
+        return getActiveUpdate.getAsBoolean();
+    }
+
+    public synchronized void setActiveUpdate(boolean update)
+    {
+        if (Boolean.getBoolean("cassandra.disable_auth_caches_remote_configuration"))
+            throw new UnsupportedOperationException("Remote configuration of auth caches is disabled");
+
+        setActiveUpdate.accept(update);
+        cache = initCache(cache);
+    }
+
+    public long getEstimatedSize()
+    {
+        return cache == null ? 0L : cache.estimatedSize();
+    }
+
     /**
      * (Re-)initialise the underlying cache. Will update validity, max entries, and update interval if
      * any have changed. The underlying {@link LoadingCache} will be initiated based on the provided {@code loadFunction}.
@@ -212,25 +336,109 @@
         if (getValidity() <= 0)
             return null;
 
-        logger.info("(Re)initializing {} (validity period/update interval/max entries) ({}/{}/{})",
-                    name, getValidity(), getUpdateInterval(), getMaxEntries());
+        boolean activeUpdate = getActiveUpdate();
+        logger.info("(Re)initializing {} (validity period/update interval/max entries/active update) ({}/{}/{}/{})",
+                    name, getValidity(), getUpdateInterval(), getMaxEntries(), activeUpdate);
+        LoadingCache<K, V> updatedCache;
 
-        if (existing == null) {
-          return Caffeine.newBuilder()
-                         .refreshAfterWrite(getUpdateInterval(), TimeUnit.MILLISECONDS)
-                         .expireAfterWrite(getValidity(), TimeUnit.MILLISECONDS)
-                         .maximumSize(getMaxEntries())
-                         .executor(cacheRefreshExecutor)
-                         .build(loadFunction::apply);
+        if (existing == null)
+        {
+            updatedCache = Caffeine.newBuilder().refreshAfterWrite(activeUpdate ? getValidity() : getUpdateInterval(), TimeUnit.MILLISECONDS)
+                                   .expireAfterWrite(getValidity(), TimeUnit.MILLISECONDS)
+                                   .maximumSize(getMaxEntries())
+                                   .executor(cacheRefreshExecutor)
+                                   .build(loadFunction::apply);
+        }
+        else
+        {
+            updatedCache = cache;
+            // Always set as mandatory
+            cache.policy().refreshAfterWrite().ifPresent(policy ->
+                policy.setExpiresAfter(activeUpdate ? getValidity() : getUpdateInterval(), TimeUnit.MILLISECONDS));
+            cache.policy().expireAfterWrite().ifPresent(policy -> policy.setExpiresAfter(getValidity(), TimeUnit.MILLISECONDS));
+            cache.policy().eviction().ifPresent(policy -> policy.setMaximum(getMaxEntries()));
         }
 
-        // Always set as mandatory
-        cache.policy().refreshAfterWrite().ifPresent(policy ->
-            policy.setExpiresAfter(getUpdateInterval(), TimeUnit.MILLISECONDS));
-        cache.policy().expireAfterWrite().ifPresent(policy ->
-            policy.setExpiresAfter(getValidity(), TimeUnit.MILLISECONDS));
-        cache.policy().eviction().ifPresent(policy ->
-            policy.setMaximum(getMaxEntries()));
-        return cache;
+        if (cacheRefresher != null)
+        {
+            cacheRefresher.cancel(false); // permit the two refreshers to race until the old one dies, should be harmless.
+            cacheRefresher = null;
+        }
+
+        if (activeUpdate)
+        {
+            cacheRefresher = ScheduledExecutors.optionalTasks.scheduleAtFixedRate(CacheRefresher.create(name,
+                                                                                                        updatedCache,
+                                                                                                        invalidateCondition),
+                                                                                  getUpdateInterval(),
+                                                                                  getUpdateInterval(),
+                                                                                  TimeUnit.MILLISECONDS);
+        }
+        return updatedCache;
+    }
+
+    @Override
+    public boolean isTerminated()
+    {
+        return cacheRefreshExecutor.isTerminated();
+    }
+
+    @Override
+    public void shutdown()
+    {
+        cacheRefreshExecutor.shutdown();
+    }
+
+    @Override
+    public Object shutdownNow()
+    {
+        return cacheRefreshExecutor.shutdownNow();
+    }
+
+    @Override
+    public boolean awaitTermination(long timeout, TimeUnit units) throws InterruptedException
+    {
+        return cacheRefreshExecutor.awaitTermination(timeout, units);
+    }
+
+    public void warm()
+    {
+        if (cache == null)
+        {
+            logger.info("{} cache not enabled, skipping pre-warming", name);
+            return;
+        }
+
+        int retries = Integer.getInteger(CACHE_LOAD_RETRIES_PROPERTY, 10);
+        long retryInterval = Long.getLong(CACHE_LOAD_RETRY_INTERVAL_PROPERTY, 1000);
+
+        while (retries-- > 0)
+        {
+            try
+            {
+                Map<K, V> entries = bulkLoadFunction.get();
+                cache.putAll(entries);
+                break;
+            }
+            catch (Exception e)
+            {
+                Uninterruptibles.sleepUninterruptibly(retryInterval, TimeUnit.MILLISECONDS);
+            }
+        }
+    }
+
+    /*
+     * Implemented when we can provide an efficient way to bulk load all entries for a cache. This isn't a
+     * @FunctionalInterface due to the default impl, which is for IRoleManager, IAuthorizer, and INetworkAuthorizer.
+     * They all extend this interface so that implementations only need to provide an override if it's useful.
+     * IAuthenticator doesn't implement this interface because CredentialsCache is more tightly coupled to
+     * PasswordAuthenticator, which does expose a bulk loader.
+     */
+    public interface BulkLoader<K, V>
+    {
+        default Supplier<Map<K, V>> bulkLoader()
+        {
+            return Collections::emptyMap;
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/auth/AuthCacheMBean.java b/src/java/org/apache/cassandra/auth/AuthCacheMBean.java
index 43fb88e..e443434 100644
--- a/src/java/org/apache/cassandra/auth/AuthCacheMBean.java
+++ b/src/java/org/apache/cassandra/auth/AuthCacheMBean.java
@@ -33,4 +33,10 @@
     public void setMaxEntries(int maxEntries);
 
     public int getMaxEntries();
+
+    public boolean getActiveUpdate();
+
+    public void setActiveUpdate(boolean update);
+
+    public long getEstimatedSize();
 }
diff --git a/src/java/org/apache/cassandra/auth/AuthCacheService.java b/src/java/org/apache/cassandra/auth/AuthCacheService.java
new file mode 100644
index 0000000..f6ee02e
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/AuthCacheService.java
@@ -0,0 +1,80 @@
+/*
+ * 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.auth;
+
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import javax.annotation.concurrent.ThreadSafe;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@ThreadSafe
+public class AuthCacheService
+{
+    private static final Logger logger = LoggerFactory.getLogger(AuthCacheService.class);
+    public static final AuthCacheService instance = new AuthCacheService();
+
+    private final Set<AuthCache<?, ?>> caches = new HashSet<>();
+    private static final AtomicBoolean cachesRegistered = new AtomicBoolean(false);
+
+    public synchronized void register(AuthCache<?, ?> cache)
+    {
+        Preconditions.checkNotNull(cache);
+        caches.add(cache);
+    }
+
+    public synchronized void unregister(AuthCache<?, ?> cache)
+    {
+        Preconditions.checkNotNull(cache);
+        caches.remove(cache);
+    }
+
+    public synchronized void warmCaches()
+    {
+        logger.info("Initiating bulk load of {} auth cache(s)", caches.size());
+        for (AuthCache<?, ?> cache : caches)
+        {
+            cache.warm();
+        }
+    }
+
+    /**
+     * NOTE: Can only be called once per instance run.
+     *
+     * We have a couple of static initializer functions to create caches scattered across various classes, some solo
+     * and some with multiple member variables. As we expect these caches to be created and initialized in one logical
+     * block, we tie them together and use them here.
+     *
+     * Note: We also register the PasswordAuthenticator cache with the {@link AuthCacheService} in it's constructor
+     */
+    @VisibleForTesting
+    public static void initializeAndRegisterCaches()
+    {
+        if (!cachesRegistered.getAndSet(true))
+        {
+            AuthenticatedUser.init();
+            Roles.init();
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/auth/AuthConfig.java b/src/java/org/apache/cassandra/auth/AuthConfig.java
index cc38296..9c5fceb 100644
--- a/src/java/org/apache/cassandra/auth/AuthConfig.java
+++ b/src/java/org/apache/cassandra/auth/AuthConfig.java
@@ -56,11 +56,11 @@
         // work with PasswordAuthenticator, so log a message if some other authenticator
         // is in use and non-default values are detected
         if (!(authenticator instanceof PasswordAuthenticator)
-            && (conf.credentials_update_interval_in_ms != -1
-                || conf.credentials_validity_in_ms != 2000
+            && (conf.credentials_update_interval != null
+                || conf.credentials_validity.toMilliseconds() != 2000
                 || conf.credentials_cache_max_entries != 1000))
         {
-            logger.info("Configuration options credentials_update_interval_in_ms, credentials_validity_in_ms and " +
+            logger.info("Configuration options credentials_update_interval, credentials_validity and " +
                         "credentials_cache_max_entries may not be applicable for the configured authenticator ({})",
                         authenticator.getClass().getName());
         }
diff --git a/src/java/org/apache/cassandra/auth/AuthKeyspace.java b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
index a57257c..67fc9c1 100644
--- a/src/java/org/apache/cassandra/auth/AuthKeyspace.java
+++ b/src/java/org/apache/cassandra/auth/AuthKeyspace.java
@@ -19,7 +19,9 @@
 
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.SchemaConstants;
@@ -35,6 +37,8 @@
     {
     }
 
+    private static final int DEFAULT_RF = CassandraRelevantProperties.SYSTEM_AUTH_DEFAULT_RF.getInt();
+
     /**
      * Generation is used as a timestamp for automatic table creation on startup.
      * If you make any changes to the tables below, make sure to increment the
@@ -109,7 +113,7 @@
     public static KeyspaceMetadata metadata()
     {
         return KeyspaceMetadata.create(SchemaConstants.AUTH_KEYSPACE_NAME,
-                                       KeyspaceParams.simple(1),
+                                       KeyspaceParams.simple(Math.max(DEFAULT_RF, DatabaseDescriptor.getDefaultKeyspaceRF())),
                                        Tables.of(Roles, RoleMembers, RolePermissions, ResourceRoleIndex, NetworkPermissions));
     }
 }
diff --git a/src/java/org/apache/cassandra/auth/AuthProperties.java b/src/java/org/apache/cassandra/auth/AuthProperties.java
new file mode 100644
index 0000000..036cbe2
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/AuthProperties.java
@@ -0,0 +1,70 @@
+/*
+ * 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.auth;
+
+import javax.management.ObjectName;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.utils.MBeanWrapper;
+
+public class AuthProperties implements AuthPropertiesMXBean
+{
+    public static AuthProperties instance = new AuthProperties(DatabaseDescriptor.getAuthWriteConsistencyLevel(),
+                                                               DatabaseDescriptor.getAuthReadConsistencyLevel(),
+                                                               true);
+
+    public AuthProperties(ConsistencyLevel writeConsistencyLevel, ConsistencyLevel readConsistencyLevel, boolean registerMBean)
+    {
+        setWriteConsistencyLevel(writeConsistencyLevel);
+        setReadConsistencyLevel(readConsistencyLevel);
+
+        if (registerMBean)
+        {
+            try
+            {
+                MBeanWrapper.instance.registerMBean(this, new ObjectName("org.apache.cassandra.auth:type=AuthProperties"));
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    public void setWriteConsistencyLevel(ConsistencyLevel cl)
+    {
+        DatabaseDescriptor.setAuthWriteConsistencyLevel(cl);
+    }
+
+    public ConsistencyLevel getWriteConsistencyLevel()
+    {
+        return DatabaseDescriptor.getAuthWriteConsistencyLevel();
+    }
+
+    public void setReadConsistencyLevel(ConsistencyLevel cl)
+    {
+        DatabaseDescriptor.setAuthReadConsistencyLevel(cl);
+    }
+
+    public ConsistencyLevel getReadConsistencyLevel()
+    {
+        return DatabaseDescriptor.getAuthReadConsistencyLevel();
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/auth/AuthPropertiesMXBean.java b/src/java/org/apache/cassandra/auth/AuthPropertiesMXBean.java
new file mode 100644
index 0000000..f52a380
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/AuthPropertiesMXBean.java
@@ -0,0 +1,29 @@
+/*
+ * 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.auth;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+
+public interface AuthPropertiesMXBean
+{
+    void setReadConsistencyLevel(ConsistencyLevel cl);
+    ConsistencyLevel getReadConsistencyLevel();
+    void setWriteConsistencyLevel(ConsistencyLevel cl);
+    ConsistencyLevel getWriteConsistencyLevel();
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java b/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java
index 6c21d7b..88a2940 100644
--- a/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java
+++ b/src/java/org/apache/cassandra/auth/AuthSchemaChangeListener.java
@@ -17,37 +17,43 @@
  */
 package org.apache.cassandra.auth;
 
-import java.util.List;
-
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.cql3.functions.UDAggregate;
+import org.apache.cassandra.cql3.functions.UDFunction;
+import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.SchemaChangeListener;
+import org.apache.cassandra.schema.TableMetadata;
 
 /**
  * SchemaChangeListener implementation that cleans up permissions on dropped resources.
  */
-public class AuthSchemaChangeListener extends SchemaChangeListener
+public class AuthSchemaChangeListener implements SchemaChangeListener
 {
-    public void onDropKeyspace(String ksName)
+    @Override
+    public void onDropKeyspace(KeyspaceMetadata keyspace, boolean dropData)
     {
-        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.keyspace(ksName));
-        DatabaseDescriptor.getAuthorizer().revokeAllOn(FunctionResource.keyspace(ksName));
+        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.keyspace(keyspace.name));
+        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.allTables(keyspace.name));
+        DatabaseDescriptor.getAuthorizer().revokeAllOn(FunctionResource.keyspace(keyspace.name));
     }
 
-    public void onDropTable(String ksName, String cfName)
+    @Override
+    public void onDropTable(TableMetadata table, boolean dropData)
     {
-        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.table(ksName, cfName));
+        DatabaseDescriptor.getAuthorizer().revokeAllOn(DataResource.table(table.keyspace, table.name));
     }
 
-    public void onDropFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+    @Override
+    public void onDropFunction(UDFunction function)
     {
         DatabaseDescriptor.getAuthorizer()
-                          .revokeAllOn(FunctionResource.function(ksName, functionName, argTypes));
+                          .revokeAllOn(FunctionResource.function(function.name().keyspace, function.name().name, function.argTypes()));
     }
 
-    public void onDropAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+    @Override
+    public void onDropAggregate(UDAggregate aggregate)
     {
         DatabaseDescriptor.getAuthorizer()
-                          .revokeAllOn(FunctionResource.function(ksName, aggregateName, argTypes));
+                          .revokeAllOn(FunctionResource.function(aggregate.name().keyspace, aggregate.name().name, aggregate.argTypes()));
     }
 }
diff --git a/src/java/org/apache/cassandra/auth/AuthenticatedUser.java b/src/java/org/apache/cassandra/auth/AuthenticatedUser.java
index 9f22bea..620a1d2 100644
--- a/src/java/org/apache/cassandra/auth/AuthenticatedUser.java
+++ b/src/java/org/apache/cassandra/auth/AuthenticatedUser.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.auth;
 
 import java.util.Set;
-
 import com.google.common.base.Objects;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -28,7 +27,7 @@
  * Returned from IAuthenticator#authenticate(), represents an authenticated user everywhere internally.
  *
  * Holds the name of the user and the roles that have been granted to the user. The roles will be cached
- * for roles_validity_in_ms.
+ * for roles_validity.
  */
 public class AuthenticatedUser
 {
@@ -39,11 +38,19 @@
     public static final AuthenticatedUser ANONYMOUS_USER = new AuthenticatedUser(ANONYMOUS_USERNAME);
 
     // User-level permissions cache.
-    private static final PermissionsCache permissionsCache = new PermissionsCache(DatabaseDescriptor.getAuthorizer());
-    private static final NetworkAuthCache networkAuthCache = new NetworkAuthCache(DatabaseDescriptor.getNetworkAuthorizer());
+    public static final PermissionsCache permissionsCache = new PermissionsCache(DatabaseDescriptor.getAuthorizer());
+    public static final NetworkPermissionsCache networkPermissionsCache = new NetworkPermissionsCache(DatabaseDescriptor.getNetworkAuthorizer());
+
+    /** Use {@link AuthCacheService#initializeAndRegisterCaches} rather than calling this directly */
+    public static void init()
+    {
+        AuthCacheService.instance.register(permissionsCache);
+        AuthCacheService.instance.register(networkPermissionsCache);
+    }
 
     private final String name;
-    // primary Role of the logged in user
+
+    // Primary Role of the logged in user
     private final RoleResource role;
 
     public AuthenticatedUser(String name)
@@ -136,7 +143,7 @@
      */
     public boolean hasLocalAccess()
     {
-        return networkAuthCache.get(this.getPrimaryRole()).canAccess(Datacenters.thisDatacenter());
+        return networkPermissionsCache.get(this.getPrimaryRole()).canAccess(Datacenters.thisDatacenter());
     }
 
     @Override
@@ -164,5 +171,4 @@
     {
         return Objects.hashCode(name);
     }
-
 }
diff --git a/src/java/org/apache/cassandra/auth/CacheRefresher.java b/src/java/org/apache/cassandra/auth/CacheRefresher.java
new file mode 100644
index 0000000..a199601
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/CacheRefresher.java
@@ -0,0 +1,94 @@
+/*
+ * 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.auth;
+
+import java.util.Set;
+import java.util.function.BiPredicate;
+import java.util.function.BooleanSupplier;
+
+import com.github.benmanes.caffeine.cache.LoadingCache;
+import com.google.common.annotations.VisibleForTesting;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.service.StorageService;
+
+public class CacheRefresher<K, V> implements Runnable
+{
+    private static final Logger logger = LoggerFactory.getLogger(CacheRefresher.class);
+
+    private final String name;
+    private final LoadingCache<K, V> cache;
+    private final BiPredicate<K, V> invalidationCondition;
+    private final BooleanSupplier skipCondition;
+
+    private CacheRefresher(String name, LoadingCache<K, V> cache,  BiPredicate<K, V> invalidationCondition, BooleanSupplier skipCondition)
+    {
+        this.name = name;
+        this.cache = cache;
+        this.invalidationCondition = invalidationCondition;
+        this.skipCondition = skipCondition;
+    }
+
+    public void run()
+    {
+        if (skipCondition.getAsBoolean())
+        {
+            logger.debug("Skipping {} cache refresh", name);
+            return;
+        }
+
+        try
+        {
+            logger.debug("Refreshing {} cache", name);
+            Set<K> ks = cache.asMap().keySet();
+            for (K key : ks)
+            {
+                cache.refresh(key);
+                V value = cache.getIfPresent(key);
+                if (invalidationCondition.test(key, value))
+                {
+                    logger.debug("Invalidating key");
+                    cache.invalidate(key);
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            logger.error("Unexpected exception refreshing {} cache", name, e);
+        }
+    }
+
+    @VisibleForTesting
+    public static <K, V> CacheRefresher<K, V> create(String name,
+                                                     LoadingCache<K, V> cache,
+                                                     BiPredicate<K, V> invalidationCondition,
+                                                     BooleanSupplier skipCondition)
+    {
+        logger.info("Creating CacheRefresher for {}", name);
+        return new CacheRefresher<>(name, cache, invalidationCondition, skipCondition);
+    }
+
+    public static <K, V> CacheRefresher<K, V> create(String name, LoadingCache<K, V> cache, BiPredicate<K, V> invalidationCondition)
+    {
+        // By default we skip cache refreshes if the node has been decommed
+        return create(name, cache, invalidationCondition, StorageService.instance::isDecommissioned);
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
index 6397154..b3f85e8 100644
--- a/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/CassandraAuthorizer.java
@@ -18,27 +18,39 @@
 package org.apache.cassandra.auth;
 
 import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.HashBasedTable;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.collect.Table;
+import com.google.common.collect.Sets;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.*;
+import org.apache.cassandra.cql3.UntypedResultSet.Row;
 import org.apache.cassandra.cql3.statements.BatchStatement;
 import org.apache.cassandra.cql3.statements.ModificationStatement;
-import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.Pair;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * CassandraAuthorizer is an IAuthorizer implementation that keeps
@@ -83,18 +95,37 @@
         }
     }
 
-    public void grant(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource grantee)
+    public Set<Permission> grant(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource grantee)
     throws RequestValidationException, RequestExecutionException
     {
-        modifyRolePermissions(permissions, resource, grantee, "+");
-        addLookupEntry(resource, grantee);
+        String roleName = escape(grantee.getRoleName());
+        String resourceName = escape(resource.getName());
+        Set<Permission> existingPermissions = getExistingPermissions(roleName, resourceName, permissions);
+        Set<Permission> nonExistingPermissions = Sets.difference(permissions, existingPermissions);
+
+        if (!nonExistingPermissions.isEmpty())
+        {
+            modifyRolePermissions(nonExistingPermissions, resource, grantee, "+");
+            addLookupEntry(resource, grantee);
+        }
+
+        return nonExistingPermissions;
     }
 
-    public void revoke(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource revokee)
+    public Set<Permission> revoke(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource revokee)
     throws RequestValidationException, RequestExecutionException
     {
-        modifyRolePermissions(permissions, resource, revokee, "-");
-        removeLookupEntry(resource, revokee);
+        String roleName = escape(revokee.getRoleName());
+        String resourceName = escape(resource.getName());
+        Set<Permission> existingPermissions = getExistingPermissions(roleName, resourceName, permissions);
+
+        if (!existingPermissions.isEmpty())
+        {
+            modifyRolePermissions(existingPermissions, resource, revokee, "-");
+            removeLookupEntry(resource, revokee);
+        }
+
+        return existingPermissions;
     }
 
     // Called when deleting a role with DROP ROLE query.
@@ -109,7 +140,8 @@
             UntypedResultSet rows = process(String.format("SELECT resource FROM %s.%s WHERE role = '%s'",
                                                           SchemaConstants.AUTH_KEYSPACE_NAME,
                                                           AuthKeyspace.ROLE_PERMISSIONS,
-                                                          escape(revokee.getRoleName())));
+                                                          escape(revokee.getRoleName())),
+                                            authReadConsistencyLevel());
 
             List<CQLStatement> statements = new ArrayList<>();
             for (UntypedResultSet.Row row : rows)
@@ -148,7 +180,8 @@
             UntypedResultSet rows = process(String.format("SELECT role FROM %s.%s WHERE resource = '%s'",
                                                           SchemaConstants.AUTH_KEYSPACE_NAME,
                                                           AuthKeyspace.RESOURCE_ROLE_INDEX,
-                                                          escape(droppedResource.getName())));
+                                                          escape(droppedResource.getName())),
+                                            authReadConsistencyLevel());
 
             List<CQLStatement> statements = new ArrayList<>();
             for (UntypedResultSet.Row row : rows)
@@ -175,6 +208,40 @@
         }
     }
 
+    /**
+     * Checks that the specified role has at least one of the expected permissions on the resource.
+     *
+     * @param roleName the role name
+     * @param resourceName the resource name
+     * @param expectedPermissions the permissions to check for
+     * @return The existing permissions
+     */
+    private Set<Permission> getExistingPermissions(String roleName,
+                                                   String resourceName,
+                                                   Set<Permission> expectedPermissions)
+    {
+        UntypedResultSet rs = process(String.format("SELECT permissions FROM %s.%s WHERE role = '%s' AND resource = '%s'",
+                                                    SchemaConstants.AUTH_KEYSPACE_NAME,
+                                                    AuthKeyspace.ROLE_PERMISSIONS,
+                                                    roleName,
+                                                    resourceName),
+                                      ConsistencyLevel.LOCAL_ONE);
+
+        if (rs.isEmpty())
+            return Collections.emptySet();
+
+        Row one = rs.one();
+
+        Set<Permission> existingPermissions = Sets.newHashSetWithExpectedSize(expectedPermissions.size());
+        for (String permissionName : one.getSet("permissions", UTF8Type.instance))
+        {
+            Permission permission = Permission.valueOf(permissionName);
+            if (expectedPermissions.contains(permission))
+                existingPermissions.add(permission);
+        }
+        return existingPermissions;
+    }
+
     private void executeLoggedBatch(List<CQLStatement> statements)
     throws RequestExecutionException, RequestValidationException
     {
@@ -189,7 +256,7 @@
     private void addPermissionsForRole(Set<Permission> permissions, IResource resource, RoleResource role)
     throws RequestExecutionException, RequestValidationException
     {
-        QueryOptions options = QueryOptions.forInternalCalls(ConsistencyLevel.LOCAL_ONE,
+        QueryOptions options = QueryOptions.forInternalCalls(authReadConsistencyLevel(),
                                                              Lists.newArrayList(ByteBufferUtil.bytes(role.getRoleName()),
                                                                                 ByteBufferUtil.bytes(resource.getName())));
 
@@ -216,7 +283,8 @@
                               op,
                               "'" + StringUtils.join(permissions, "','") + "'",
                               escape(role.getRoleName()),
-                              escape(resource.getName())));
+                              escape(resource.getName())),
+                authWriteConsistencyLevel());
     }
 
     // Removes an entry from the inverted index table (from resource -> role with defined permissions)
@@ -226,7 +294,8 @@
                               SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.RESOURCE_ROLE_INDEX,
                               escape(resource.getName()),
-                              escape(role.getRoleName())));
+                              escape(role.getRoleName())),
+                authWriteConsistencyLevel());
     }
 
     // Adds an entry to the inverted index table (from resource -> role with defined permissions)
@@ -236,7 +305,8 @@
                               SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.RESOURCE_ROLE_INDEX,
                               escape(resource.getName()),
-                              escape(role.getRoleName())));
+                              escape(role.getRoleName())),
+                authWriteConsistencyLevel());
     }
 
     // 'grantee' can be null - in that case everyone's permissions have been requested. Otherwise, only single user's.
@@ -274,7 +344,7 @@
     throws RequestExecutionException
     {
         Set<PermissionDetails> details = new HashSet<>();
-        for (UntypedResultSet.Row row : process(buildListQuery(resource, role)))
+        for (UntypedResultSet.Row row : process(buildListQuery(resource, role), authReadConsistencyLevel()))
         {
             if (row.has(PERMISSIONS))
             {
@@ -351,19 +421,114 @@
 
     ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
     {
-        return statement.execute(QueryState.forInternalCalls(), options, System.nanoTime());
+        return statement.execute(QueryState.forInternalCalls(), options, nanoTime());
     }
 
-    UntypedResultSet process(String query) throws RequestExecutionException
+    /**
+     * This is exposed so we can override the consistency level for tests that are single node
+     */
+    @VisibleForTesting
+    UntypedResultSet process(String query, ConsistencyLevel cl) throws RequestExecutionException
     {
-        return QueryProcessor.process(query, ConsistencyLevel.LOCAL_ONE);
+        return QueryProcessor.process(query, cl);
     }
 
     void processBatch(BatchStatement statement)
     {
+        QueryOptions options = QueryOptions.forInternalCalls(authWriteConsistencyLevel(), Collections.emptyList());
         QueryProcessor.instance.processBatch(statement,
                                              QueryState.forInternalCalls(),
-                                             BatchQueryOptions.withoutPerStatementVariables(QueryOptions.DEFAULT),
-                                             System.nanoTime());
+                                             BatchQueryOptions.withoutPerStatementVariables(options),
+                                             nanoTime());
+    }
+
+    public static ConsistencyLevel authWriteConsistencyLevel()
+    {
+        return AuthProperties.instance.getWriteConsistencyLevel();
+    }
+
+    public static ConsistencyLevel authReadConsistencyLevel()
+    {
+        return AuthProperties.instance.getReadConsistencyLevel();
+    }
+
+    /**
+     * Get an initial set of permissions to load into the PermissionsCache at startup
+     * @return map of User/Resource -> Permissions for cache initialisation
+     */
+    public Supplier<Map<Pair<AuthenticatedUser, IResource>, Set<Permission>>> bulkLoader()
+    {
+        return () ->
+        {
+            Map<Pair<AuthenticatedUser, IResource>, Set<Permission>> entries = new HashMap<>();
+            String cqlTemplate = "SELECT %s, %s, %s FROM %s.%s";
+
+            logger.info("Warming permissions cache from role_permissions table");
+            UntypedResultSet results = process(String.format(cqlTemplate,
+                                                             ROLE, RESOURCE, PERMISSIONS,
+                                                             SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLE_PERMISSIONS),
+                                                             AuthProperties.instance.getReadConsistencyLevel());
+
+            // role_name -> (resource, permissions)
+            Table<String, IResource, Set<Permission>> individualRolePermissions = HashBasedTable.create();
+            results.forEach(row -> {
+                if (row.has(PERMISSIONS))
+                {
+                    individualRolePermissions.put(row.getString(ROLE),
+                                                  Resources.fromName(row.getString(RESOURCE)),
+                                                  permissions(row.getSet(PERMISSIONS, UTF8Type.instance)));
+                }
+            });
+
+            // Iterate all user level roles in the system and accumulate the permissions of their granted roles
+            Roles.getAllRoles().forEach(roleResource -> {
+                // If the role has login priv, accumulate the permissions of all its granted roles
+                if (Roles.canLogin(roleResource))
+                {
+                    // Structure to accumulate the resource -> permission mappings for the closure of granted roles
+                    Map<IResource, ImmutableSet.Builder<Permission>> userPermissions = new HashMap<>();
+                    BiConsumer<IResource, Set<Permission>> accumulator = accumulator(userPermissions);
+
+                    // For each role granted to this primary, lookup the specific resource/permissions grants
+                    // we read in the first step. We'll accumlate those in the userPermissions map, which we'll turn
+                    // into cache entries when we're done.
+                    // Note: we need to provide a default empty set of permissions for roles without any explicitly
+                    // granted to them (e.g. superusers or roles with no direct perms).
+                    Roles.getRoleDetails(roleResource).forEach(grantedRole ->
+                                                               individualRolePermissions.rowMap()
+                                                                                        .getOrDefault(grantedRole.resource.getRoleName(), Collections.emptyMap())
+                                                                                        .forEach(accumulator));
+
+                    // Having iterated all the roles granted to this user, finalize the transitive permissions
+                    // (i.e. turn them into entries for the PermissionsCache)
+                    userPermissions.forEach((resource, builder) -> entries.put(cacheKey(roleResource, resource),
+                                                                               builder.build()));
+                }
+            });
+
+            return entries;
+        };
+    }
+
+    // Helper function to group the transitive set of permissions granted
+    // to user by the specific resources to which they apply
+    private static BiConsumer<IResource, Set<Permission>> accumulator(Map<IResource, ImmutableSet.Builder<Permission>> accumulator)
+    {
+        return (resource, permissions) -> accumulator.computeIfAbsent(resource, k -> new ImmutableSet.Builder<>()).addAll(permissions);
+    }
+
+    private static Set<Permission> permissions(Set<String> permissionNames)
+    {
+        return permissionNames.stream().map(Permission::valueOf).collect(Collectors.toSet());
+    }
+
+    private static Pair<AuthenticatedUser, IResource> cacheKey(RoleResource role, IResource resource)
+    {
+        return cacheKey(role.getRoleName(), resource);
+    }
+
+    private static Pair<AuthenticatedUser, IResource> cacheKey(String roleName, IResource resource)
+    {
+        return Pair.create(new AuthenticatedUser(roleName), resource);
     }
 }
diff --git a/src/java/org/apache/cassandra/auth/CassandraNetworkAuthorizer.java b/src/java/org/apache/cassandra/auth/CassandraNetworkAuthorizer.java
index 6fdcd69..cc08e93 100644
--- a/src/java/org/apache/cassandra/auth/CassandraNetworkAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/CassandraNetworkAuthorizer.java
@@ -18,27 +18,36 @@
 
 package org.apache.cassandra.auth;
 
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
 
-import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.exceptions.RequestExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.cql3.statements.SelectStatement;
-import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.service.QueryState.forInternalCalls;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class CassandraNetworkAuthorizer implements INetworkAuthorizer
 {
+    private static final Logger logger = LoggerFactory.getLogger(CassandraNetworkAuthorizer.class);
     private SelectStatement authorizeUserStatement = null;
 
     public void setup()
@@ -52,18 +61,21 @@
     @VisibleForTesting
     ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
     {
-        return statement.execute(QueryState.forInternalCalls(), options, System.nanoTime());
+        return statement.execute(forInternalCalls(), options, nanoTime());
     }
 
+    /**
+     * This is exposed so we can override the consistency level for tests that are single node
+     */
     @VisibleForTesting
-    void process(String query)
+    UntypedResultSet process(String query, ConsistencyLevel cl) throws RequestExecutionException
     {
-        QueryProcessor.process(query, ConsistencyLevel.LOCAL_ONE);
+        return QueryProcessor.process(query, cl);
     }
 
     private Set<String> getAuthorizedDcs(String name)
     {
-        QueryOptions options = QueryOptions.forInternalCalls(ConsistencyLevel.LOCAL_ONE,
+        QueryOptions options = QueryOptions.forInternalCalls(CassandraAuthorizer.authReadConsistencyLevel(),
                                                              Lists.newArrayList(ByteBufferUtil.bytes(name)));
 
         ResultMessage.Rows rows = select(authorizeUserStatement, options);
@@ -137,7 +149,7 @@
                                      getSetString(permissions),
                                      role.getName());
 
-        process(query);
+        process(query, CassandraAuthorizer.authWriteConsistencyLevel());
     }
 
     public void drop(RoleResource role)
@@ -147,11 +159,36 @@
                                      AuthKeyspace.NETWORK_PERMISSIONS,
                                      role.getName());
 
-        process(query);
+        process(query, CassandraAuthorizer.authWriteConsistencyLevel());
     }
 
     public void validateConfiguration() throws ConfigurationException
     {
         // noop
     }
+
+    @Override
+    public Supplier<Map<RoleResource, DCPermissions>> bulkLoader()
+    {
+        return () -> {
+            logger.info("Pre-warming datacenter permissions cache from network_permissions table");
+            Map<RoleResource, DCPermissions> entries = new HashMap<>();
+            UntypedResultSet rows = process(String.format("SELECT role, dcs FROM %s.%s",
+                                                          SchemaConstants.AUTH_KEYSPACE_NAME,
+                                                          AuthKeyspace.NETWORK_PERMISSIONS),
+                                            CassandraAuthorizer.authReadConsistencyLevel());
+
+            for (UntypedResultSet.Row row : rows)
+            {
+                RoleResource role = RoleResource.role(row.getString("role"));
+                DCPermissions.Builder builder = new DCPermissions.Builder();
+                Set<String> dcs = row.getFrozenSet("dcs", UTF8Type.instance);
+                for (String dc : dcs)
+                    builder.add(dc);
+                entries.put(role, builder.build());
+            }
+
+            return entries;
+        };
+    }
 }
diff --git a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
index 7aed51a..733e9da 100644
--- a/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
+++ b/src/java/org/apache/cassandra/auth/CassandraRoleManager.java
@@ -22,6 +22,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -42,12 +43,14 @@
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.mindrot.jbcrypt.BCrypt;
 
+import static org.apache.cassandra.service.QueryState.forInternalCalls;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * Responsible for the creation, maintenance and deletion of roles
  * for the purposes of authentication and authorization.
@@ -77,9 +80,16 @@
 {
     private static final Logger logger = LoggerFactory.getLogger(CassandraRoleManager.class);
 
-    static final String DEFAULT_SUPERUSER_NAME = "cassandra";
+    public static final String DEFAULT_SUPERUSER_NAME = "cassandra";
     static final String DEFAULT_SUPERUSER_PASSWORD = "cassandra";
 
+    /**
+     * We need to treat the default superuser as a special case since during initial node startup, we may end up with
+     * duplicate creation or deletion + re-creation of this user on different nodes unless we check at quorum to see if
+     * it's already been done.
+     */
+    static final ConsistencyLevel DEFAULT_SUPERUSER_CONSISTENCY_LEVEL = ConsistencyLevel.QUORUM;
+
     // Transform a row in the AuthKeyspace.ROLES to a Role instance
     private static final Function<UntypedResultSet.Row, Role> ROW_TO_ROLE = row ->
     {
@@ -122,30 +132,33 @@
     private final Set<Option> supportedOptions;
     private final Set<Option> alterableOptions;
 
-    // Will be set to true when all nodes in the cluster are on a version which supports roles (i.e. 2.2+)
-    private volatile boolean isClusterReady = false;
-
     public CassandraRoleManager()
     {
-        supportedOptions = DatabaseDescriptor.getAuthenticator().getClass() == PasswordAuthenticator.class
-                         ? ImmutableSet.of(Option.LOGIN, Option.SUPERUSER, Option.PASSWORD)
+        supportedOptions = DatabaseDescriptor.getAuthenticator() instanceof PasswordAuthenticator
+                         ? ImmutableSet.of(Option.LOGIN, Option.SUPERUSER, Option.PASSWORD, Option.HASHED_PASSWORD)
                          : ImmutableSet.of(Option.LOGIN, Option.SUPERUSER);
-        alterableOptions = DatabaseDescriptor.getAuthenticator().getClass().equals(PasswordAuthenticator.class)
-                         ? ImmutableSet.of(Option.PASSWORD)
+        alterableOptions = DatabaseDescriptor.getAuthenticator() instanceof PasswordAuthenticator
+                         ? ImmutableSet.of(Option.PASSWORD, Option.HASHED_PASSWORD)
                          : ImmutableSet.<Option>of();
     }
 
+    @Override
     public void setup()
     {
-        loadRoleStatement = (SelectStatement) prepare("SELECT * from %s.%s WHERE role = ?",
-                                                      SchemaConstants.AUTH_KEYSPACE_NAME,
-                                                      AuthKeyspace.ROLES);
+        loadRoleStatement();
         scheduleSetupTask(() -> {
             setupDefaultRole();
             return null;
         });
     }
 
+    protected final void loadRoleStatement()
+    {
+        loadRoleStatement = (SelectStatement) prepare("SELECT * from %s.%s WHERE role = ?",
+                                                      SchemaConstants.AUTH_KEYSPACE_NAME,
+                                                      AuthKeyspace.ROLES);
+    }
+
     public Set<Option> supportedOptions()
     {
         return supportedOptions;
@@ -159,21 +172,21 @@
     public void createRole(AuthenticatedUser performer, RoleResource role, RoleOptions options)
     throws RequestValidationException, RequestExecutionException
     {
-        String insertCql = options.getPassword().isPresent()
+        String insertCql = options.getPassword().isPresent() || options.getHashedPassword().isPresent()
                          ? String.format("INSERT INTO %s.%s (role, is_superuser, can_login, salted_hash) VALUES ('%s', %s, %s, '%s')",
                                          SchemaConstants.AUTH_KEYSPACE_NAME,
                                          AuthKeyspace.ROLES,
                                          escape(role.getRoleName()),
-                                         options.getSuperuser().or(false),
-                                         options.getLogin().or(false),
-                                         escape(hashpw(options.getPassword().get())))
+                                         options.getSuperuser().orElse(false),
+                                         options.getLogin().orElse(false),
+                                         options.getHashedPassword().orElseGet(() -> escape(hashpw(options.getPassword().get()))))
                          : String.format("INSERT INTO %s.%s (role, is_superuser, can_login) VALUES ('%s', %s, %s)",
                                          SchemaConstants.AUTH_KEYSPACE_NAME,
                                          AuthKeyspace.ROLES,
                                          escape(role.getRoleName()),
-                                         options.getSuperuser().or(false),
-                                         options.getLogin().or(false));
-        process(insertCql, consistencyForRole(role.getRoleName()));
+                                         options.getSuperuser().orElse(false),
+                                         options.getLogin().orElse(false));
+        process(insertCql, consistencyForRoleWrite(role.getRoleName()));
     }
 
     public void dropRole(AuthenticatedUser performer, RoleResource role) throws RequestValidationException, RequestExecutionException
@@ -182,7 +195,7 @@
                               SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLES,
                               escape(role.getRoleName())),
-                consistencyForRole(role.getRoleName()));
+                consistencyForRoleWrite(role.getRoleName()));
         removeAllMembers(role.getRoleName());
     }
 
@@ -198,7 +211,7 @@
                                   AuthKeyspace.ROLES,
                                   assignments,
                                   escape(role.getRoleName())),
-                    consistencyForRole(role.getRoleName()));
+                    consistencyForRoleWrite(role.getRoleName()));
         }
     }
 
@@ -220,7 +233,7 @@
                               AuthKeyspace.ROLE_MEMBERS,
                               escape(role.getRoleName()),
                               escape(grantee.getRoleName())),
-                consistencyForRole(role.getRoleName()));
+                consistencyForRoleWrite(role.getRoleName()));
     }
 
     public void revokeRole(AuthenticatedUser performer, RoleResource role, RoleResource revokee)
@@ -237,7 +250,7 @@
                               AuthKeyspace.ROLE_MEMBERS,
                               escape(role.getRoleName()),
                               escape(revokee.getRoleName())),
-                consistencyForRole(role.getRoleName()));
+                consistencyForRoleWrite(role.getRoleName()));
     }
 
     public Set<RoleResource> getRoles(RoleResource grantee, boolean includeInherited)
@@ -245,7 +258,8 @@
     {
         return collectRoles(getRole(grantee.getRoleName()),
                             includeInherited,
-                            filter())
+                            filter(),
+                            this::getRole)
                .map(r -> r.resource)
                .collect(Collectors.toSet());
     }
@@ -254,10 +268,16 @@
     {
         return collectRoles(getRole(grantee.getRoleName()),
                             true,
-                            filter())
+                            filter(),
+                            this::getRole)
                .collect(Collectors.toSet());
     }
 
+    /**
+     * We hard-code this query to Quorum regardless of the role or auth credentials of the queryer given the nature of
+     * this query: we expect to know *all* roles across the entire cluster when we query this, not just local quorum or
+     * on a single node.
+     */
     public Set<RoleResource> getAllRoles() throws RequestValidationException, RequestExecutionException
     {
         ImmutableSet.Builder<RoleResource> builder = ImmutableSet.builder();
@@ -329,13 +349,8 @@
         {
             if (!hasExistingRoles())
             {
-                QueryProcessor.process(String.format("INSERT INTO %s.%s (role, is_superuser, can_login, salted_hash) " +
-                                                     "VALUES ('%s', true, true, '%s') USING TIMESTAMP 0",
-                                                     SchemaConstants.AUTH_KEYSPACE_NAME,
-                                                     AuthKeyspace.ROLES,
-                                                     DEFAULT_SUPERUSER_NAME,
-                                                     escape(hashpw(DEFAULT_SUPERUSER_PASSWORD))),
-                                       consistencyForRole(DEFAULT_SUPERUSER_NAME));
+                QueryProcessor.process(createDefaultRoleQuery(),
+                                       consistencyForRoleWrite(DEFAULT_SUPERUSER_NAME));
                 logger.info("Created default superuser role '{}'", DEFAULT_SUPERUSER_NAME);
             }
         }
@@ -347,6 +362,16 @@
     }
 
     @VisibleForTesting
+    public static String createDefaultRoleQuery()
+    {
+        return String.format("INSERT INTO %s.%s (role, is_superuser, can_login, salted_hash) VALUES ('%s', true, true, '%s') USING TIMESTAMP 0",
+                             SchemaConstants.AUTH_KEYSPACE_NAME,
+                             AuthKeyspace.ROLES,
+                             DEFAULT_SUPERUSER_NAME,
+                             escape(hashpw(DEFAULT_SUPERUSER_PASSWORD)));
+    }
+
+    @VisibleForTesting
     public static boolean hasExistingRoles() throws RequestExecutionException
     {
         // Try looking up the 'cassandra' default role first, to avoid the range query if possible.
@@ -360,8 +385,7 @@
     protected void scheduleSetupTask(final Callable<Void> setupTask)
     {
         // The delay is to give the node a chance to see its peers before attempting the operation
-        ScheduledExecutors.optionalTasks.schedule(() -> {
-            isClusterReady = true;
+        ScheduledExecutors.optionalTasks.scheduleSelfRecurring(() -> {
             try
             {
                 setupTask.call();
@@ -386,19 +410,22 @@
         }
     }
 
-    private Stream<Role> collectRoles(Role role, boolean includeInherited, Predicate<String> distinctFilter)
+    // Providing a function to fetch the details of granted roles allows us to read from the underlying tables during
+    // normal usage and fetch from a prepopulated in memory structure when building an initial set of roles to warm
+    // the RolesCache at startup
+    private Stream<Role> collectRoles(Role role, boolean includeInherited, Predicate<String> distinctFilter, Function<String, Role> loaderFunction)
     {
         if (Roles.isNullRole(role))
             return Stream.empty();
 
         if (!includeInherited)
-            return Stream.concat(Stream.of(role), role.memberOf.stream().map(this::getRole));
+            return Stream.concat(Stream.of(role), role.memberOf.stream().map(loaderFunction));
 
 
         return Stream.concat(Stream.of(role),
                              role.memberOf.stream()
                                           .filter(distinctFilter)
-                                          .flatMap(r -> collectRoles(getRole(r), true, distinctFilter)));
+                                          .flatMap(r -> collectRoles(loaderFunction.apply(r), true, distinctFilter, loaderFunction)));
     }
 
     // Used as a stateful filtering function when recursively collecting granted roles
@@ -415,7 +442,7 @@
      */
     private Role getRole(String name)
     {
-        QueryOptions options = QueryOptions.forInternalCalls(consistencyForRole(name),
+        QueryOptions options = QueryOptions.forInternalCalls(consistencyForRoleRead(name),
                                                              Collections.singletonList(ByteBufferUtil.bytes(name)));
         ResultMessage.Rows rows = select(loadRoleStatement, options);
         if (rows.result.isEmpty())
@@ -437,7 +464,7 @@
                               op,
                               escape(role),
                               escape(grantee)),
-                consistencyForRole(grantee));
+                consistencyForRoleWrite(grantee));
     }
 
     /*
@@ -450,7 +477,7 @@
                                                       SchemaConstants.AUTH_KEYSPACE_NAME,
                                                       AuthKeyspace.ROLE_MEMBERS,
                                                       escape(role)),
-                                        consistencyForRole(role));
+                                        consistencyForRoleRead(role));
         if (rows.isEmpty())
             return;
 
@@ -463,7 +490,7 @@
                               SchemaConstants.AUTH_KEYSPACE_NAME,
                               AuthKeyspace.ROLE_MEMBERS,
                               escape(role)),
-                consistencyForRole(role));
+                consistencyForRoleWrite(role));
     }
 
     /*
@@ -484,6 +511,8 @@
                                        return String.format("is_superuser = %s", entry.getValue());
                                    case PASSWORD:
                                        return String.format("salted_hash = '%s'", escape(hashpw((String) entry.getValue())));
+                                   case HASHED_PASSWORD:
+                                       return String.format("salted_hash = '%s'", (String) entry.getValue());
                                    default:
                                        return null;
                                }
@@ -492,14 +521,6 @@
                       .collect(Collectors.joining(","));
     }
 
-    protected static ConsistencyLevel consistencyForRole(String role)
-    {
-        if (role.equals(DEFAULT_SUPERUSER_NAME))
-            return ConsistencyLevel.QUORUM;
-        else
-            return ConsistencyLevel.LOCAL_ONE;
-    }
-
     private static String hashpw(String password)
     {
         return BCrypt.hashpw(password, BCrypt.gensalt(GENSALT_LOG2_ROUNDS));
@@ -510,6 +531,21 @@
         return StringUtils.replace(name, "'", "''");
     }
 
+    /** Allows selective overriding of the consistency level for specific roles. */
+    protected static ConsistencyLevel consistencyForRoleWrite(String role)
+    {
+        return role.equals(DEFAULT_SUPERUSER_NAME) ?
+               DEFAULT_SUPERUSER_CONSISTENCY_LEVEL :
+               CassandraAuthorizer.authWriteConsistencyLevel();
+    }
+
+    protected static ConsistencyLevel consistencyForRoleRead(String role)
+    {
+        return role.equals(DEFAULT_SUPERUSER_NAME) ?
+               DEFAULT_SUPERUSER_CONSISTENCY_LEVEL :
+               CassandraAuthorizer.authReadConsistencyLevel();
+    }
+
     /**
      * Executes the provided query.
      * This shouldn't be used during setup as this will directly return an error if the manager is not setup yet. Setup tasks
@@ -519,18 +555,35 @@
     UntypedResultSet process(String query, ConsistencyLevel consistencyLevel)
     throws RequestValidationException, RequestExecutionException
     {
-        if (!isClusterReady)
-            throw new InvalidRequestException("Cannot process role related query as the role manager isn't yet setup. "
-                                            + "This is likely because some of nodes in the cluster are on version 2.1 or earlier. "
-                                            + "You need to upgrade all nodes to Cassandra 2.2 or more to use roles.");
-
         return QueryProcessor.process(query, consistencyLevel);
     }
 
     @VisibleForTesting
     ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
     {
-        return statement.execute(QueryState.forInternalCalls(), options, System.nanoTime());
+        return statement.execute(forInternalCalls(), options, nanoTime());
     }
 
+    @Override
+    public Supplier<Map<RoleResource, Set<Role>>> bulkLoader()
+    {
+        return () ->
+        {
+            Map<RoleResource, Set<Role>> entries = new HashMap<>();
+
+            logger.info("Warming roles cache from roles table");
+            UntypedResultSet results = process("SELECT * FROM system_auth.roles", CassandraAuthorizer.authReadConsistencyLevel());
+
+            // Create flat temporary lookup of name -> role mappings
+            Map<String, Role> roles = new HashMap<>();
+            results.forEach(row -> roles.put(row.getString("role"), ROW_TO_ROLE.apply(row)));
+
+            // Iterate the flat structure and populate the fully hierarchical one
+            roles.forEach((key, value) ->
+                          entries.put(RoleResource.role(key),
+                                      collectRoles(value, true, filter(), roles::get).collect(Collectors.toSet()))
+            );
+            return entries;
+        };
+    }
 }
diff --git a/src/java/org/apache/cassandra/auth/DataResource.java b/src/java/org/apache/cassandra/auth/DataResource.java
index c3f5b32..2421930 100644
--- a/src/java/org/apache/cassandra/auth/DataResource.java
+++ b/src/java/org/apache/cassandra/auth/DataResource.java
@@ -31,13 +31,14 @@
  * Used to represent a table or a keyspace or the root level "data" resource.
  * "data"                                 - the root level data resource.
  * "data/keyspace_name"                   - keyspace-level data resource.
+ * "data/keyspace_name/*"                 - all tables-level data resource.
  * "data/keyspace_name/table_name"        - table-level data resource.
  */
 public class DataResource implements IResource
 {
     enum Level
     {
-        ROOT, KEYSPACE, TABLE
+        ROOT, KEYSPACE, ALL_TABLES, TABLE
     }
 
     // permissions which may be granted on tables
@@ -46,6 +47,15 @@
                                                                                          Permission.SELECT,
                                                                                          Permission.MODIFY,
                                                                                          Permission.AUTHORIZE);
+
+    // permissions which may be granted on all tables of a given keyspace
+    private static final Set<Permission> ALL_TABLES_LEVEL_PERMISSIONS = Sets.immutableEnumSet(Permission.CREATE,
+                                                                                              Permission.ALTER,
+                                                                                              Permission.DROP,
+                                                                                              Permission.SELECT,
+                                                                                              Permission.MODIFY,
+                                                                                              Permission.AUTHORIZE);
+
     // permissions which may be granted on one or all keyspaces
     private static final Set<Permission> KEYSPACE_LEVEL_PERMISSIONS = Sets.immutableEnumSet(Permission.CREATE,
                                                                                             Permission.ALTER,
@@ -92,6 +102,17 @@
     }
 
     /**
+     * Creates a DataResource representing all tables of a keyspace.
+     *
+     * @param keyspace Name of the keyspace.
+     * @return DataResource instance representing the keyspace.
+     */
+    public static DataResource allTables(String keyspace)
+    {
+        return new DataResource(Level.ALL_TABLES, keyspace, null);
+    }
+
+    /**
      * Creates a DataResource instance representing a table.
      *
      * @param keyspace Name of the keyspace.
@@ -122,6 +143,9 @@
         if (parts.length == 2)
             return keyspace(parts[1]);
 
+        if ("*".equals(parts[2]))
+            return allTables(parts[1]);
+
         return table(parts[1], parts[2]);
     }
 
@@ -136,6 +160,8 @@
                 return ROOT_NAME;
             case KEYSPACE:
                 return String.format("%s/%s", ROOT_NAME, keyspace);
+            case ALL_TABLES:
+                return String.format("%s/%s/*", ROOT_NAME, keyspace);
             case TABLE:
                 return String.format("%s/%s/%s", ROOT_NAME, keyspace, table);
         }
@@ -151,8 +177,10 @@
         {
             case KEYSPACE:
                 return root();
-            case TABLE:
+            case ALL_TABLES:
                 return keyspace(keyspace);
+            case TABLE:
+                return allTables(keyspace);
         }
         throw new IllegalStateException("Root-level resource can't have a parent");
     }
@@ -167,6 +195,11 @@
         return level == Level.KEYSPACE;
     }
 
+    public boolean isAllTablesLevel()
+    {
+        return level == Level.ALL_TABLES;
+    }
+
     public boolean isTableLevel()
     {
         return level == Level.TABLE;
@@ -209,6 +242,7 @@
             case ROOT:
                 return true;
             case KEYSPACE:
+            case ALL_TABLES:
                 return Schema.instance.getKeyspaces().contains(keyspace);
             case TABLE:
                 return Schema.instance.getTableMetadata(keyspace, table) != null;
@@ -223,6 +257,8 @@
             case ROOT:
             case KEYSPACE:
                 return KEYSPACE_LEVEL_PERMISSIONS;
+            case ALL_TABLES:
+                return ALL_TABLES_LEVEL_PERMISSIONS;
             case TABLE:
                 return TABLE_LEVEL_PERMISSIONS;
         }
@@ -238,6 +274,8 @@
                 return "<all keyspaces>";
             case KEYSPACE:
                 return String.format("<keyspace %s>", keyspace);
+            case ALL_TABLES:
+                return String.format("<all tables in %s>", keyspace);
             case TABLE:
                 return String.format("<table %s.%s>", keyspace, table);
         }
diff --git a/src/java/org/apache/cassandra/auth/FunctionResource.java b/src/java/org/apache/cassandra/auth/FunctionResource.java
index ef7d99a..a67ef1a 100644
--- a/src/java/org/apache/cassandra/auth/FunctionResource.java
+++ b/src/java/org/apache/cassandra/auth/FunctionResource.java
@@ -158,7 +158,7 @@
                                               "explictly qualified by a keyspace");
         List<AbstractType<?>> abstractTypes = new ArrayList<>(argTypes.size());
         for (CQL3Type.Raw cqlType : argTypes)
-            abstractTypes.add(cqlType.prepare(keyspace).getType());
+            abstractTypes.add(cqlType.prepare(keyspace).getType().udfType());
 
         return new FunctionResource(keyspace, name, abstractTypes);
     }
diff --git a/src/java/org/apache/cassandra/auth/IAuthorizer.java b/src/java/org/apache/cassandra/auth/IAuthorizer.java
index a023e3e..b39e315 100644
--- a/src/java/org/apache/cassandra/auth/IAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/IAuthorizer.java
@@ -22,11 +22,12 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.exceptions.RequestValidationException;
+import org.apache.cassandra.utils.Pair;
 
 /**
  * Primary Cassandra authorization interface.
  */
-public interface IAuthorizer
+public interface IAuthorizer extends AuthCache.BulkLoader<Pair<AuthenticatedUser, IResource>, Set<Permission>>
 {
     /**
      * Whether or not the authorizer will attempt authorization.
@@ -61,12 +62,14 @@
      * @param permissions Set of permissions to grant.
      * @param resource Resource on which to grant the permissions.
      * @param grantee Role to which the permissions are to be granted.
+     * @return the permissions that have been successfully granted, comprised by the requested permissions excluding
+     * those permissions that were already granted.
      *
      * @throws RequestValidationException
      * @throws RequestExecutionException
      * @throws java.lang.UnsupportedOperationException
      */
-    void grant(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource grantee)
+    Set<Permission> grant(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource grantee)
     throws RequestValidationException, RequestExecutionException;
 
     /**
@@ -79,12 +82,14 @@
      * @param permissions Set of permissions to revoke.
      * @param revokee Role from which to the permissions are to be revoked.
      * @param resource Resource on which to revoke the permissions.
+     * @return the permissions that have been successfully revoked, comprised by the requested permissions excluding
+     * those permissions that were already not granted.
      *
      * @throws RequestValidationException
      * @throws RequestExecutionException
      * @throws java.lang.UnsupportedOperationException
      */
-    void revoke(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource revokee)
+    Set<Permission> revoke(AuthenticatedUser performer, Set<Permission> permissions, IResource resource, RoleResource revokee)
     throws RequestValidationException, RequestExecutionException;
 
     /**
diff --git a/src/java/org/apache/cassandra/auth/INetworkAuthorizer.java b/src/java/org/apache/cassandra/auth/INetworkAuthorizer.java
index 4582b5e..9f815ac 100644
--- a/src/java/org/apache/cassandra/auth/INetworkAuthorizer.java
+++ b/src/java/org/apache/cassandra/auth/INetworkAuthorizer.java
@@ -20,7 +20,7 @@
 
 import org.apache.cassandra.exceptions.ConfigurationException;
 
-public interface INetworkAuthorizer
+public interface INetworkAuthorizer extends AuthCache.BulkLoader<RoleResource, DCPermissions>
 {
     /**
      * Whether or not the authorizer will attempt authorization.
@@ -46,7 +46,7 @@
     void setRoleDatacenters(RoleResource role, DCPermissions permissions);
 
     /**
-     * Called when a role is deleted, so any corresponding network auth
+     * Called when a role is deleted, so any corresponding network permissions
      * data can also be cleaned up
      */
     void drop(RoleResource role);
diff --git a/src/java/org/apache/cassandra/auth/IRoleManager.java b/src/java/org/apache/cassandra/auth/IRoleManager.java
index 1d47bee..688d5bb 100644
--- a/src/java/org/apache/cassandra/auth/IRoleManager.java
+++ b/src/java/org/apache/cassandra/auth/IRoleManager.java
@@ -31,7 +31,7 @@
  * alteration and the granting and revoking of roles to other
  * roles.
  */
-public interface IRoleManager
+public interface IRoleManager extends AuthCache.BulkLoader<RoleResource, Set<Role>>
 {
 
     /**
@@ -41,7 +41,7 @@
      */
     public enum Option
     {
-        SUPERUSER, PASSWORD, LOGIN, OPTIONS
+        SUPERUSER, PASSWORD, LOGIN, OPTIONS, HASHED_PASSWORD
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/auth/NetworkAuthCache.java b/src/java/org/apache/cassandra/auth/NetworkAuthCache.java
deleted file mode 100644
index 6b3c74e..0000000
--- a/src/java/org/apache/cassandra/auth/NetworkAuthCache.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.auth;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-
-public class NetworkAuthCache extends AuthCache<RoleResource, DCPermissions>
-{
-    public NetworkAuthCache(INetworkAuthorizer authorizer)
-    {
-        super("NetworkAuthCache",
-              DatabaseDescriptor::setRolesValidity,
-              DatabaseDescriptor::getRolesValidity,
-              DatabaseDescriptor::setRolesUpdateInterval,
-              DatabaseDescriptor::getRolesUpdateInterval,
-              DatabaseDescriptor::setRolesCacheMaxEntries,
-              DatabaseDescriptor::getRolesCacheMaxEntries,
-              authorizer::authorize,
-              () -> DatabaseDescriptor.getAuthenticator().requireAuthentication());
-    }
-}
diff --git a/src/java/org/apache/cassandra/auth/NetworkPermissionsCache.java b/src/java/org/apache/cassandra/auth/NetworkPermissionsCache.java
new file mode 100644
index 0000000..1c18fed
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/NetworkPermissionsCache.java
@@ -0,0 +1,55 @@
+/*
+ * 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.auth;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.utils.MBeanWrapper;
+
+public class NetworkPermissionsCache extends AuthCache<RoleResource, DCPermissions> implements NetworkPermissionsCacheMBean
+{
+    public NetworkPermissionsCache(INetworkAuthorizer authorizer)
+    {
+        super(CACHE_NAME,
+              DatabaseDescriptor::setRolesValidity,
+              DatabaseDescriptor::getRolesValidity,
+              DatabaseDescriptor::setRolesUpdateInterval,
+              DatabaseDescriptor::getRolesUpdateInterval,
+              DatabaseDescriptor::setRolesCacheMaxEntries,
+              DatabaseDescriptor::getRolesCacheMaxEntries,
+              DatabaseDescriptor::setRolesCacheActiveUpdate,
+              DatabaseDescriptor::getRolesCacheActiveUpdate,
+              authorizer::authorize,
+              authorizer.bulkLoader(),
+              () -> DatabaseDescriptor.getAuthenticator().requireAuthentication());
+
+        MBeanWrapper.instance.registerMBean(this, MBEAN_NAME_BASE + DEPRECATED_CACHE_NAME);
+    }
+
+    public void invalidateNetworkPermissions(String roleName)
+    {
+        invalidate(RoleResource.role(roleName));
+    }
+
+    @Override
+    protected void unregisterMBean()
+    {
+        super.unregisterMBean();
+        MBeanWrapper.instance.unregisterMBean(MBEAN_NAME_BASE + DEPRECATED_CACHE_NAME, MBeanWrapper.OnException.LOG);
+    }
+}
diff --git a/src/java/org/apache/cassandra/auth/NetworkPermissionsCacheMBean.java b/src/java/org/apache/cassandra/auth/NetworkPermissionsCacheMBean.java
new file mode 100644
index 0000000..b0e72b0
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/NetworkPermissionsCacheMBean.java
@@ -0,0 +1,28 @@
+/*
+ * 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.auth;
+
+public interface NetworkPermissionsCacheMBean extends AuthCacheMBean
+{
+    public static final String CACHE_NAME = "NetworkPermissionsCache";
+    @Deprecated
+    public static final String DEPRECATED_CACHE_NAME = "NetworkAuthCache";
+
+    public void invalidateNetworkPermissions(String roleName);
+}
diff --git a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
index 9da99a9..0ce96d8 100644
--- a/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
+++ b/src/java/org/apache/cassandra/auth/PasswordAuthenticator.java
@@ -20,15 +20,19 @@
 import java.net.InetAddress;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Supplier;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.QueryOptions;
@@ -43,7 +47,8 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.mindrot.jbcrypt.BCrypt;
 
-import static org.apache.cassandra.auth.CassandraRoleManager.consistencyForRole;
+import static org.apache.cassandra.auth.CassandraRoleManager.consistencyForRoleRead;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * PasswordAuthenticator is an IAuthenticator implementation
@@ -54,10 +59,13 @@
  * PasswordAuthenticator requires the use of CassandraRoleManager
  * for storage and retrieval of encrypted passwords.
  */
-public class PasswordAuthenticator implements IAuthenticator
+public class PasswordAuthenticator implements IAuthenticator, AuthCache.BulkLoader<String, String>
 {
     private static final Logger logger = LoggerFactory.getLogger(PasswordAuthenticator.class);
 
+    /** We intentionally use an empty string sentinel to allow object equality comparison */
+    private static final String NO_SUCH_CREDENTIAL = "";
+
     // name of the hash column.
     private static final String SALTED_HASH = "salted_hash";
 
@@ -68,7 +76,13 @@
     static final byte NUL = 0;
     private SelectStatement authenticateStatement;
 
-    private CredentialsCache cache;
+    private final CredentialsCache cache;
+
+    public PasswordAuthenticator()
+    {
+        cache = new CredentialsCache(this);
+        AuthCacheService.instance.register(cache);
+    }
 
     // No anonymous access.
     public boolean requireAuthentication()
@@ -76,6 +90,30 @@
         return true;
     }
 
+    @Override
+    public Supplier<Map<String, String>> bulkLoader()
+    {
+        return () ->
+        {
+            Map<String, String> entries = new HashMap<>();
+
+            logger.info("Pre-warming credentials cache from roles table");
+            UntypedResultSet results = process("SELECT role, salted_hash FROM system_auth.roles", CassandraAuthorizer.authReadConsistencyLevel());
+            results.forEach(row -> {
+                if (row.has("salted_hash"))
+                {
+                    entries.put(row.getString("role"), row.getString("salted_hash"));
+                }
+            });
+            return entries;
+        };
+    }
+
+    public CredentialsCache getCredentialsCache()
+    {
+        return cache;
+    }
+
     protected static boolean checkpw(String password, String hash)
     {
         try
@@ -90,9 +128,39 @@
         }
     }
 
+    /**
+     * This is exposed so we can override the consistency level for tests that are single node
+     */
+    @VisibleForTesting
+    UntypedResultSet process(String query, ConsistencyLevel cl)
+    {
+        return QueryProcessor.process(query, cl);
+    }
+
     private AuthenticatedUser authenticate(String username, String password) throws AuthenticationException
     {
         String hash = cache.get(username);
+
+        // intentional use of object equality
+        if (hash == NO_SUCH_CREDENTIAL)
+        {
+            // The cache was unable to load credentials via queryHashedPassword, probably because the supplied
+            // rolename doesn't exist. If caching is enabled we will have now cached the sentinel value for that key
+            // so we should invalidate it otherwise the cache will continue to serve that until it expires which
+            // will be a problem if the role is added in the meantime.
+            //
+            // We can't just throw the AuthenticationException directly from queryHashedPassword for a similar reason:
+            // if an existing role is dropped and active updates are enabled for the cache, the refresh in
+            // CacheRefresher::run will log and swallow the exception and keep serving the stale credentials until they
+            // eventually expire.
+            //
+            // So whenever we encounter the sentinal value, here and also in CacheRefresher (if active updates are
+            // enabled), we manually expunge the key from the cache. If caching is not enabled, AuthCache::invalidate
+            // is a safe no-op.
+            cache.invalidateCredentials(username);
+            throw new AuthenticationException(String.format("Provided username %s and/or password are incorrect", username));
+        }
+
         if (!checkpw(password, hash))
             throw new AuthenticationException(String.format("Provided username %s and/or password are incorrect", username));
 
@@ -103,21 +171,21 @@
     {
         try
         {
-            ResultMessage.Rows rows =
-            authenticateStatement.execute(QueryState.forInternalCalls(),
-                                            QueryOptions.forInternalCalls(consistencyForRole(username),
-                                                                          Lists.newArrayList(ByteBufferUtil.bytes(username))),
-                                            System.nanoTime());
+            QueryOptions options = QueryOptions.forInternalCalls(consistencyForRoleRead(username),
+                    Lists.newArrayList(ByteBufferUtil.bytes(username)));
+
+            ResultMessage.Rows rows = select(authenticateStatement, options);
 
             // If either a non-existent role name was supplied, or no credentials
-            // were found for that role we don't want to cache the result so we throw
-            // an exception.
+            // were found for that role, we don't want to cache the result so we
+            // return a sentinel value. On receiving the sentinel, the caller can
+            // invalidate the cache and throw an appropriate exception.
             if (rows.result.isEmpty())
-                throw new AuthenticationException(String.format("Provided username %s and/or password are incorrect", username));
+                return NO_SUCH_CREDENTIAL;
 
             UntypedResultSet result = UntypedResultSet.create(rows.result);
             if (!result.one().has(SALTED_HASH))
-                throw new AuthenticationException(String.format("Provided username %s and/or password are incorrect", username));
+                return NO_SUCH_CREDENTIAL;
 
             return result.one().getString(SALTED_HASH);
         }
@@ -127,6 +195,12 @@
         }
     }
 
+    @VisibleForTesting
+    ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
+    {
+        return statement.execute(QueryState.forInternalCalls(), options, nanoTime());
+    }
+
     public Set<DataResource> protectedResources()
     {
         // Also protected by CassandraRoleManager, but the duplication doesn't hurt and is more explicit
@@ -144,8 +218,6 @@
                                      SchemaConstants.AUTH_KEYSPACE_NAME,
                                      AuthKeyspace.ROLES);
         authenticateStatement = prepare(query);
-
-        cache = new CredentialsCache(this);
     }
 
     public AuthenticatedUser legacyAuthenticate(Map<String, String> credentials) throws AuthenticationException
@@ -239,19 +311,24 @@
         }
     }
 
-    private static class CredentialsCache extends AuthCache<String, String> implements CredentialsCacheMBean
+    public static class CredentialsCache extends AuthCache<String, String> implements CredentialsCacheMBean
     {
         private CredentialsCache(PasswordAuthenticator authenticator)
         {
-            super("CredentialsCache",
+            super(CACHE_NAME,
                   DatabaseDescriptor::setCredentialsValidity,
                   DatabaseDescriptor::getCredentialsValidity,
                   DatabaseDescriptor::setCredentialsUpdateInterval,
                   DatabaseDescriptor::getCredentialsUpdateInterval,
                   DatabaseDescriptor::setCredentialsCacheMaxEntries,
                   DatabaseDescriptor::getCredentialsCacheMaxEntries,
+                  DatabaseDescriptor::setCredentialsCacheActiveUpdate,
+                  DatabaseDescriptor::getCredentialsCacheActiveUpdate,
                   authenticator::queryHashedPassword,
-                  () -> true);
+                  authenticator.bulkLoader(),
+                  () -> true,
+                  (k,v) -> NO_SUCH_CREDENTIAL == v); // use a known object as a sentinel value. CacheRefresher will
+                                                     // invalidate the key if the sentinel is loaded during a refresh
         }
 
         public void invalidateCredentials(String roleName)
@@ -262,6 +339,8 @@
 
     public static interface CredentialsCacheMBean extends AuthCacheMBean
     {
+        public static final String CACHE_NAME = "CredentialsCache";
+
         public void invalidateCredentials(String roleName);
     }
 }
diff --git a/src/java/org/apache/cassandra/auth/PermissionsCache.java b/src/java/org/apache/cassandra/auth/PermissionsCache.java
index a33f5d1..0757b5e 100644
--- a/src/java/org/apache/cassandra/auth/PermissionsCache.java
+++ b/src/java/org/apache/cassandra/auth/PermissionsCache.java
@@ -23,22 +23,31 @@
 import org.apache.cassandra.utils.Pair;
 
 public class PermissionsCache extends AuthCache<Pair<AuthenticatedUser, IResource>, Set<Permission>>
+        implements PermissionsCacheMBean
 {
     public PermissionsCache(IAuthorizer authorizer)
     {
-        super("PermissionsCache",
+        super(CACHE_NAME,
               DatabaseDescriptor::setPermissionsValidity,
               DatabaseDescriptor::getPermissionsValidity,
               DatabaseDescriptor::setPermissionsUpdateInterval,
               DatabaseDescriptor::getPermissionsUpdateInterval,
               DatabaseDescriptor::setPermissionsCacheMaxEntries,
               DatabaseDescriptor::getPermissionsCacheMaxEntries,
+              DatabaseDescriptor::setPermissionsCacheActiveUpdate,
+              DatabaseDescriptor::getPermissionsCacheActiveUpdate,
               (p) -> authorizer.authorize(p.left, p.right),
-              () -> DatabaseDescriptor.getAuthorizer().requireAuthorization());
+              authorizer.bulkLoader(),
+              authorizer::requireAuthorization);
     }
 
     public Set<Permission> getPermissions(AuthenticatedUser user, IResource resource)
     {
         return get(Pair.create(user, resource));
     }
+
+    public void invalidatePermissions(String roleName, String resourceName)
+    {
+        invalidate(Pair.create(new AuthenticatedUser(roleName), Resources.fromName(resourceName)));
+    }
 }
diff --git a/src/java/org/apache/cassandra/auth/PermissionsCacheMBean.java b/src/java/org/apache/cassandra/auth/PermissionsCacheMBean.java
new file mode 100644
index 0000000..4d55c37
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/PermissionsCacheMBean.java
@@ -0,0 +1,26 @@
+/*
+ * 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.auth;
+
+public interface PermissionsCacheMBean extends AuthCacheMBean
+{
+    public static final String CACHE_NAME = "PermissionsCache";
+
+    public void invalidatePermissions(String roleName, String resourceName);
+}
diff --git a/src/java/org/apache/cassandra/auth/Role.java b/src/java/org/apache/cassandra/auth/Role.java
index e98cc7d..5c9140a 100644
--- a/src/java/org/apache/cassandra/auth/Role.java
+++ b/src/java/org/apache/cassandra/auth/Role.java
@@ -34,7 +34,7 @@
      * for IRoleManager implementations (in particular, CassandraRoleManager)
      */
 
-    public final RoleResource resource ;
+    public final RoleResource resource;
     public final boolean isSuper;
     public final boolean canLogin;
     public final Set<String> memberOf;
diff --git a/src/java/org/apache/cassandra/auth/RoleOptions.java b/src/java/org/apache/cassandra/auth/RoleOptions.java
index 1205d34..c3ec56c 100644
--- a/src/java/org/apache/cassandra/auth/RoleOptions.java
+++ b/src/java/org/apache/cassandra/auth/RoleOptions.java
@@ -19,13 +19,13 @@
 
 import java.util.HashMap;
 import java.util.Map;
-
-import com.google.common.base.Optional;
+import java.util.Optional;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.utils.FBUtilities;
+import org.mindrot.jbcrypt.BCrypt;
 
 public class RoleOptions
 {
@@ -68,7 +68,7 @@
      */
     public Optional<Boolean> getSuperuser()
     {
-        return Optional.fromNullable((Boolean)options.get(IRoleManager.Option.SUPERUSER));
+        return Optional.ofNullable((Boolean) options.get(IRoleManager.Option.SUPERUSER));
     }
 
     /**
@@ -77,7 +77,7 @@
      */
     public Optional<Boolean> getLogin()
     {
-        return Optional.fromNullable((Boolean)options.get(IRoleManager.Option.LOGIN));
+        return Optional.ofNullable((Boolean) options.get(IRoleManager.Option.LOGIN));
     }
 
     /**
@@ -86,7 +86,16 @@
      */
     public Optional<String> getPassword()
     {
-        return Optional.fromNullable((String)options.get(IRoleManager.Option.PASSWORD));
+        return Optional.ofNullable((String)options.get(IRoleManager.Option.PASSWORD));
+    }
+
+    /**
+     * Return the string value of the hashed password option.
+     * @return hashed password option value
+     */
+    public Optional<String> getHashedPassword()
+    {
+        return Optional.ofNullable((String) options.get(IRoleManager.Option.HASHED_PASSWORD));
     }
 
     /**
@@ -99,7 +108,7 @@
     @SuppressWarnings("unchecked")
     public Optional<Map<String, String>> getCustomOptions()
     {
-        return Optional.fromNullable((Map<String, String>)options.get(IRoleManager.Option.OPTIONS));
+        return Optional.ofNullable((Map<String, String>) options.get(IRoleManager.Option.OPTIONS));
     }
 
     /**
@@ -134,6 +143,26 @@
                         throw new InvalidRequestException(String.format("Invalid value for property '%s'. " +
                                                                         "It must be a string",
                                                                         option.getKey()));
+                    if (options.containsKey(IRoleManager.Option.HASHED_PASSWORD))
+                        throw new InvalidRequestException(String.format("Properties '%s' and '%s' are mutually exclusive",
+                                                                        IRoleManager.Option.PASSWORD, IRoleManager.Option.HASHED_PASSWORD));
+                    break;
+                case HASHED_PASSWORD:
+                    if (!(option.getValue() instanceof String))
+                        throw new InvalidRequestException(String.format("Invalid value for property '%s'. " +
+                                                                        "It must be a string",
+                                                                        option.getKey()));
+                    if (options.containsKey(IRoleManager.Option.PASSWORD))
+                        throw new InvalidRequestException(String.format("Properties '%s' and '%s' are mutually exclusive",
+                                                                        IRoleManager.Option.PASSWORD, IRoleManager.Option.HASHED_PASSWORD));
+                    try
+                    {
+                        BCrypt.checkpw("dummy", (String) option.getValue());
+                    }
+                    catch (Exception e)
+                    {
+                        throw new InvalidRequestException("Invalid hashed password value. Please use jBcrypt.");
+                    }
                     break;
                 case OPTIONS:
                     if (!(option.getValue() instanceof Map))
diff --git a/src/java/org/apache/cassandra/auth/Roles.java b/src/java/org/apache/cassandra/auth/Roles.java
index 527451e..f18851a 100644
--- a/src/java/org/apache/cassandra/auth/Roles.java
+++ b/src/java/org/apache/cassandra/auth/Roles.java
@@ -20,11 +20,8 @@
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
-import java.util.function.BooleanSupplier;
 import java.util.stream.Collectors;
 
-import com.google.common.annotations.VisibleForTesting;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,25 +35,12 @@
 
     private static final Role NO_ROLE = new Role("", false, false, Collections.emptyMap(), Collections.emptySet());
 
-    private static RolesCache cache;
-    static
-    {
-        initRolesCache(DatabaseDescriptor.getRoleManager(),
-                       () -> DatabaseDescriptor.getAuthenticator().requireAuthentication());
-    }
+    public static final RolesCache cache = new RolesCache(DatabaseDescriptor.getRoleManager(), () -> DatabaseDescriptor.getAuthenticator().requireAuthentication());
 
-    @VisibleForTesting
-    public static void initRolesCache(IRoleManager roleManager, BooleanSupplier enableCache)
+    /** Use {@link AuthCacheService#initializeAndRegisterCaches} rather than calling this directly */
+    public static void init()
     {
-        if (cache != null)
-            cache.unregisterMBean();
-        cache = new RolesCache(roleManager, enableCache);
-    }
-
-    @VisibleForTesting
-    public static void clearCache()
-    {
-        cache.invalidate();
+        AuthCacheService.instance.register(cache);
     }
 
     /**
@@ -77,7 +61,7 @@
      * Get detailed info on all the roles granted to the role identified by the supplied RoleResource.
      * This includes superuser status and login privileges for the primary role and all roles granted directly
      * to it or inherited.
-     * The returnred roles may be cached if roles_validity_in_ms > 0
+     * The returned roles may be cached if roles_validity > 0
      * This method is used where we need to know specific attributes of the collection of granted roles, i.e.
      * when checking for superuser status which may be inherited from *any* granted role.
      *
@@ -90,6 +74,15 @@
     }
 
     /**
+     * Enumerate all the roles in the system, preferably these will be fetched from the cache, which in turn
+     * may have been warmed during startup.
+     */
+    public static Set<RoleResource> getAllRoles()
+    {
+        return cache.getAllRoles();
+    }
+
+    /**
      * Returns true if the supplied role or any other role granted to it
      * (directly or indirectly) has superuser status.
      *
diff --git a/src/java/org/apache/cassandra/auth/RolesCache.java b/src/java/org/apache/cassandra/auth/RolesCache.java
index d01de63..d34de19 100644
--- a/src/java/org/apache/cassandra/auth/RolesCache.java
+++ b/src/java/org/apache/cassandra/auth/RolesCache.java
@@ -23,19 +23,25 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 
-public class RolesCache extends AuthCache<RoleResource, Set<Role>>
+public class RolesCache extends AuthCache<RoleResource, Set<Role>> implements RolesCacheMBean
 {
+    private final IRoleManager roleManager;
+
     public RolesCache(IRoleManager roleManager, BooleanSupplier enableCache)
     {
-        super("RolesCache",
+        super(CACHE_NAME,
               DatabaseDescriptor::setRolesValidity,
               DatabaseDescriptor::getRolesValidity,
               DatabaseDescriptor::setRolesUpdateInterval,
               DatabaseDescriptor::getRolesUpdateInterval,
               DatabaseDescriptor::setRolesCacheMaxEntries,
               DatabaseDescriptor::getRolesCacheMaxEntries,
+              DatabaseDescriptor::setRolesCacheActiveUpdate,
+              DatabaseDescriptor::getRolesCacheActiveUpdate,
               roleManager::getRoleDetails,
+              roleManager.bulkLoader(),
               enableCache);
+        this.roleManager = roleManager;
     }
 
     /**
@@ -62,4 +68,18 @@
     {
         return get(primaryRole);
     }
+
+    Set<RoleResource> getAllRoles()
+    {
+        // This method seems kind of unnecessary as it is only called from Roles::getAllRoles,
+        // but we are able to inject the RoleManager to this class, making testing possible. If
+        // we lose this method and did everything in Roles, we'd be dependent on the IRM impl
+        // supplied by DatabaseDescriptor
+        return roleManager.getAllRoles();
+    }
+
+    public void invalidateRoles(String roleName)
+    {
+        invalidate(RoleResource.role(roleName));
+    }
 }
diff --git a/src/java/org/apache/cassandra/auth/RolesCacheMBean.java b/src/java/org/apache/cassandra/auth/RolesCacheMBean.java
new file mode 100644
index 0000000..18b3c40
--- /dev/null
+++ b/src/java/org/apache/cassandra/auth/RolesCacheMBean.java
@@ -0,0 +1,26 @@
+/*
+ * 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.auth;
+
+public interface RolesCacheMBean extends AuthCacheMBean
+{
+    public static final String CACHE_NAME = "RolesCache";
+
+    void invalidateRoles(String roleName);
+}
diff --git a/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java b/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java
index 36c552c..afc8b46 100644
--- a/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java
+++ b/src/java/org/apache/cassandra/auth/jmx/AuthorizationProxy.java
@@ -22,6 +22,7 @@
 import java.security.AccessControlContext;
 import java.security.AccessController;
 import java.security.Principal;
+import java.util.Collections;
 import java.util.Set;
 import java.util.function.BooleanSupplier;
 import java.util.function.Function;
@@ -41,6 +42,7 @@
 import org.apache.cassandra.auth.*;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.MBeanWrapper;
 
 /**
  * Provides a proxy interface to the platform's MBeanServer instance to perform
@@ -104,7 +106,7 @@
                                                                       "registerMBean",
                                                                       "unregisterMBean");
 
-    private static final JMXPermissionsCache permissionsCache = new JMXPermissionsCache();
+    public static final JmxPermissionsCache jmxPermissionsCache = new JmxPermissionsCache();
     private MBeanServer mbs;
 
     /*
@@ -118,7 +120,7 @@
      the permissions from the local cache, which in turn loads them from the configured IAuthorizer
      but can be overridden for testing.
      */
-    protected Function<RoleResource, Set<PermissionDetails>> getPermissions = permissionsCache::get;
+    protected Function<RoleResource, Set<PermissionDetails>> getPermissions = jmxPermissionsCache::get;
 
     /*
      Used to decide whether authorization is enabled or not, usually this depends on the configured
@@ -187,7 +189,7 @@
      *             as an invocation of a method on the MBeanServer.
      */
     @VisibleForTesting
-    boolean authorize(Subject subject, String methodName, Object[] args)
+    public boolean authorize(Subject subject, String methodName, Object[] args)
     {
         logger.trace("Authorizing JMX method invocation {} for {}",
                      methodName,
@@ -546,19 +548,46 @@
             throw new SecurityException("Access is denied!");
     }
 
-    private static final class JMXPermissionsCache extends AuthCache<RoleResource, Set<PermissionDetails>>
+    public static final class JmxPermissionsCache extends AuthCache<RoleResource, Set<PermissionDetails>>
+        implements JmxPermissionsCacheMBean
     {
-        protected JMXPermissionsCache()
+        protected JmxPermissionsCache()
         {
-            super("JMXPermissionsCache",
+            super(CACHE_NAME,
                   DatabaseDescriptor::setPermissionsValidity,
                   DatabaseDescriptor::getPermissionsValidity,
                   DatabaseDescriptor::setPermissionsUpdateInterval,
                   DatabaseDescriptor::getPermissionsUpdateInterval,
                   DatabaseDescriptor::setPermissionsCacheMaxEntries,
                   DatabaseDescriptor::getPermissionsCacheMaxEntries,
+                  DatabaseDescriptor::setPermissionsCacheActiveUpdate,
+                  DatabaseDescriptor::getPermissionsCacheActiveUpdate,
                   AuthorizationProxy::loadPermissions,
+                  Collections::emptyMap,
                   () -> true);
+
+            MBeanWrapper.instance.registerMBean(this, MBEAN_NAME_BASE + DEPRECATED_CACHE_NAME);
         }
+
+        public void invalidatePermissions(String roleName)
+        {
+            invalidate(RoleResource.role(roleName));
+        }
+
+        @Override
+        protected void unregisterMBean()
+        {
+            super.unregisterMBean();
+            MBeanWrapper.instance.unregisterMBean(MBEAN_NAME_BASE + DEPRECATED_CACHE_NAME, MBeanWrapper.OnException.LOG);
+        }
+    }
+
+    public static interface JmxPermissionsCacheMBean extends AuthCacheMBean
+    {
+        public static final String CACHE_NAME = "JmxPermissionsCache";
+        @Deprecated
+        public static final String DEPRECATED_CACHE_NAME = "JMXPermissionsCache";
+
+        public void invalidatePermissions(String roleName);
     }
 }
diff --git a/src/java/org/apache/cassandra/batchlog/Batch.java b/src/java/org/apache/cassandra/batchlog/Batch.java
index 7b205e0..b5a6288 100644
--- a/src/java/org/apache/cassandra/batchlog/Batch.java
+++ b/src/java/org/apache/cassandra/batchlog/Batch.java
@@ -29,7 +29,7 @@
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.db.TypeSizes.sizeof;
 import static org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
@@ -38,14 +38,14 @@
 {
     public static final Serializer serializer = new Serializer();
 
-    public final UUID id;
+    public final TimeUUID id;
     public final long creationTime; // time of batch creation (in microseconds)
 
     // one of these will always be empty
     final Collection<Mutation> decodedMutations;
     final Collection<ByteBuffer> encodedMutations;
 
-    private Batch(UUID id, long creationTime, Collection<Mutation> decodedMutations, Collection<ByteBuffer> encodedMutations)
+    private Batch(TimeUUID id, long creationTime, Collection<Mutation> decodedMutations, Collection<ByteBuffer> encodedMutations)
     {
         this.id = id;
         this.creationTime = creationTime;
@@ -57,7 +57,7 @@
     /**
      * Creates a 'local' batch - with all enclosed mutations in decoded form (as Mutation instances)
      */
-    public static Batch createLocal(UUID id, long creationTime, Collection<Mutation> mutations)
+    public static Batch createLocal(TimeUUID id, long creationTime, Collection<Mutation> mutations)
     {
         return new Batch(id, creationTime, mutations, Collections.emptyList());
     }
@@ -68,7 +68,7 @@
      * The mutations will always be encoded using the current messaging version.
      */
     @SuppressWarnings("RedundantTypeArguments")
-    public static Batch createRemote(UUID id, long creationTime, Collection<ByteBuffer> mutations)
+    public static Batch createRemote(TimeUUID id, long creationTime, Collection<ByteBuffer> mutations)
     {
         return new Batch(id, creationTime, Collections.<Mutation>emptyList(), mutations);
     }
@@ -105,7 +105,7 @@
         {
             assert batch.isLocal() : "attempted to serialize a 'remote' batch";
 
-            long size = UUIDSerializer.serializer.serializedSize(batch.id, version);
+            long size = TimeUUID.sizeInBytes();
             size += sizeof(batch.creationTime);
 
             size += sizeofUnsignedVInt(batch.decodedMutations.size());
@@ -123,7 +123,7 @@
         {
             assert batch.isLocal() : "attempted to serialize a 'remote' batch";
 
-            UUIDSerializer.serializer.serialize(batch.id, out, version);
+            batch.id.serialize(out);
             out.writeLong(batch.creationTime);
 
             out.writeUnsignedVInt(batch.decodedMutations.size());
@@ -136,7 +136,7 @@
 
         public Batch deserialize(DataInputPlus in, int version) throws IOException
         {
-            UUID id = UUIDSerializer.serializer.deserialize(in, version);
+            TimeUUID id = TimeUUID.deserialize(in);
             long creationTime = in.readLong();
 
             /*
diff --git a/src/java/org/apache/cassandra/batchlog/BatchRemoveVerbHandler.java b/src/java/org/apache/cassandra/batchlog/BatchRemoveVerbHandler.java
index 3443cab..89b8aa8 100644
--- a/src/java/org/apache/cassandra/batchlog/BatchRemoveVerbHandler.java
+++ b/src/java/org/apache/cassandra/batchlog/BatchRemoveVerbHandler.java
@@ -17,16 +17,15 @@
  */
 package org.apache.cassandra.batchlog;
 
-import java.util.UUID;
-
 import org.apache.cassandra.net.IVerbHandler;
 import org.apache.cassandra.net.Message;
+import org.apache.cassandra.utils.TimeUUID;
 
-public final class BatchRemoveVerbHandler implements IVerbHandler<UUID>
+public final class BatchRemoveVerbHandler implements IVerbHandler<TimeUUID>
 {
     public static final BatchRemoveVerbHandler instance = new BatchRemoveVerbHandler();
 
-    public void doVerb(Message<UUID> message)
+    public void doVerb(Message<TimeUUID> message)
     {
         BatchlogManager.remove(message.payload);
     }
diff --git a/src/java/org/apache/cassandra/batchlog/BatchlogManager.java b/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
index 0f22b4b..6d102b0 100644
--- a/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
+++ b/src/java/org/apache/cassandra/batchlog/BatchlogManager.java
@@ -28,19 +28,19 @@
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.ScheduledExecutorService;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
+import java.util.function.Supplier;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Iterables;
 import com.google.common.util.concurrent.RateLimiter;
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -50,7 +50,6 @@
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.WriteType;
 import org.apache.cassandra.db.marshal.BytesType;
-import org.apache.cassandra.db.marshal.UUIDType;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.WriteFailureException;
@@ -75,12 +74,14 @@
 import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MBeanWrapper;
-import org.apache.cassandra.utils.UUIDGen;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 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;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class BatchlogManager implements BatchlogManagerMBean
 {
@@ -93,18 +94,16 @@
     public static final long BATCHLOG_REPLAY_TIMEOUT = Long.getLong("cassandra.batchlog.replay_timeout_in_ms", DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2);
 
     private volatile long totalBatchesReplayed = 0; // no concurrency protection necessary as only written by replay thread.
-    private volatile UUID lastReplayedUuid = UUIDGen.minTimeUUID(0);
+    private volatile TimeUUID lastReplayedUuid = TimeUUID.minAtUnixMillis(0);
 
     // Single-thread executor service for scheduling and serializing log replay.
-    private final ScheduledExecutorService batchlogTasks;
+    private final ScheduledExecutorPlus batchlogTasks;
 
     private final RateLimiter rateLimiter = RateLimiter.create(Double.MAX_VALUE);
 
     public BatchlogManager()
     {
-        ScheduledThreadPoolExecutor executor = new DebuggableScheduledThreadPoolExecutor("BatchlogTasks");
-        executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
-        batchlogTasks = executor;
+        batchlogTasks = executorFactory().scheduled(false, "BatchlogTasks");
     }
 
     public void start()
@@ -112,7 +111,7 @@
         MBeanWrapper.instance.registerMBean(this, MBEAN_NAME);
 
         batchlogTasks.scheduleWithFixedDelay(this::replayFailedBatches,
-                                             StorageService.RING_DELAY,
+                                             StorageService.RING_DELAY_MILLIS,
                                              REPLAY_INTERVAL,
                                              MILLISECONDS);
     }
@@ -122,10 +121,10 @@
         ExecutorUtils.shutdownAndWait(timeout, unit, batchlogTasks);
     }
 
-    public static void remove(UUID id)
+    public static void remove(TimeUUID id)
     {
         new Mutation(PartitionUpdate.fullPartitionDelete(SystemKeyspace.Batches,
-                                                         UUIDType.instance.decompose(id),
+                                                         id.toBytes(),
                                                          FBUtilities.timestampMicros(),
                                                          FBUtilities.nowInSeconds()))
             .apply();
@@ -209,9 +208,9 @@
             logger.trace("Replay cancelled as there are no peers in the ring.");
             return;
         }
-        setRate(DatabaseDescriptor.getBatchlogReplayThrottleInKB());
+        setRate(DatabaseDescriptor.getBatchlogReplayThrottleInKiB());
 
-        UUID limitUuid = UUIDGen.maxTimeUUID(System.currentTimeMillis() - getBatchlogTimeout());
+        TimeUUID limitUuid = TimeUUID.maxAtUnixMillis(currentTimeMillis() - getBatchlogTimeout());
         ColumnFamilyStore store = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES);
         int pageSize = calculatePageSize(store);
         // There cannot be any live content where token(id) <= token(lastReplayedUuid) as every processed batch is
@@ -230,18 +229,18 @@
      * Sets the rate for the current rate limiter. When {@code throttleInKB} is 0, this sets the rate to
      * {@link Double#MAX_VALUE} bytes per second.
      *
-     * @param throttleInKB throughput to set in KB per second
+     * @param throttleInKB throughput to set in KiB per second
      */
     public void setRate(final int throttleInKB)
     {
         int endpointsCount = StorageService.instance.getTokenMetadata().getSizeOfAllEndpoints();
         if (endpointsCount > 0)
         {
-            int endpointThrottleInKB = throttleInKB / endpointsCount;
-            double throughput = endpointThrottleInKB == 0 ? Double.MAX_VALUE : endpointThrottleInKB * 1024.0;
+            int endpointThrottleInKiB = throttleInKB / endpointsCount;
+            double throughput = endpointThrottleInKiB == 0 ? Double.MAX_VALUE : endpointThrottleInKiB * 1024.0;
             if (rateLimiter.getRate() != throughput)
             {
-                logger.debug("Updating batchlog replay throttle to {} KB/s, {} KB/s per endpoint", throttleInKB, endpointThrottleInKB);
+                logger.debug("Updating batchlog replay throttle to {} KB/s, {} KB/s per endpoint", throttleInKB, endpointThrottleInKiB);
                 rateLimiter.setRate(throughput);
             }
         }
@@ -263,14 +262,14 @@
         ArrayList<ReplayingBatch> unfinishedBatches = new ArrayList<>(pageSize);
 
         Set<UUID> hintedNodes = new HashSet<>();
-        Set<UUID> replayedBatches = new HashSet<>();
+        Set<TimeUUID> replayedBatches = new HashSet<>();
         Exception caughtException = null;
         int skipped = 0;
 
         // Sending out batches for replay without waiting for them, so that one stuck batch doesn't affect others
         for (UntypedResultSet.Row row : batches)
         {
-            UUID id = row.getUUID("id");
+            TimeUUID id = row.getTimeUUID("id");
             int version = row.getInt("version");
             try
             {
@@ -316,7 +315,7 @@
         replayedBatches.forEach(BatchlogManager::remove);
     }
 
-    private void finishAndClearBatches(ArrayList<ReplayingBatch> batches, Set<UUID> hintedNodes, Set<UUID> replayedBatches)
+    private void finishAndClearBatches(ArrayList<ReplayingBatch> batches, Set<UUID> hintedNodes, Set<TimeUUID> replayedBatches)
     {
         // schedule hints for timed out deliveries
         for (ReplayingBatch batch : batches)
@@ -336,17 +335,17 @@
 
     private static class ReplayingBatch
     {
-        private final UUID id;
+        private final TimeUUID id;
         private final long writtenAt;
         private final List<Mutation> mutations;
         private final int replayedBytes;
 
         private List<ReplayWriteResponseHandler<Mutation>> replayHandlers;
 
-        ReplayingBatch(UUID id, int version, List<ByteBuffer> serializedMutations) throws IOException
+        ReplayingBatch(TimeUUID id, int version, List<ByteBuffer> serializedMutations) throws IOException
         {
             this.id = id;
-            this.writtenAt = UUIDGen.unixTimestamp(id);
+            this.writtenAt = id.unix(MILLISECONDS);
             this.mutations = new ArrayList<>(serializedMutations.size());
             this.replayedBytes = addMutations(version, serializedMutations);
         }
@@ -501,12 +500,12 @@
                 }
             }
 
-            ReplicaPlan.ForTokenWrite replicaPlan = new ReplicaPlan.ForTokenWrite(keyspace, liveAndDown.replicationStrategy(),
-                    ConsistencyLevel.ONE, liveRemoteOnly.pending(), liveRemoteOnly.all(), liveRemoteOnly.all(), liveRemoteOnly.all());
-            ReplayWriteResponseHandler<Mutation> handler = new ReplayWriteResponseHandler<>(replicaPlan, System.nanoTime());
+            ReplicaPlan.ForWrite replicaPlan = new ReplicaPlan.ForWrite(keyspace, liveAndDown.replicationStrategy(),
+                                                                        ConsistencyLevel.ONE, liveRemoteOnly.pending(), liveRemoteOnly.all(), liveRemoteOnly.all(), liveRemoteOnly.all());
+            ReplayWriteResponseHandler<Mutation> handler = new ReplayWriteResponseHandler<>(replicaPlan, mutation, nanoTime());
             Message<Mutation> message = Message.outWithFlag(MUTATION_REQ, mutation, MessageFlag.CALL_BACK_ON_FAILURE);
             for (Replica replica : liveRemoteOnly.all())
-                MessagingService.instance().sendWriteWithCallback(message, replica, handler, false);
+                MessagingService.instance().sendWriteWithCallback(message, replica, handler);
             return handler;
         }
 
@@ -526,9 +525,10 @@
         {
             private final Set<InetAddressAndPort> undelivered = Collections.newSetFromMap(new ConcurrentHashMap<>());
 
-            ReplayWriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan, long queryStartNanoTime)
+            // TODO: should we be hinting here, since presumably batch log will retry? Maintaining historical behaviour for the moment.
+            ReplayWriteResponseHandler(ReplicaPlan.ForWrite replicaPlan, Supplier<Mutation> hintOnFailure, long queryStartNanoTime)
             {
-                super(replicaPlan, null, WriteType.UNLOGGED_BATCH, queryStartNanoTime);
+                super(replicaPlan, null, WriteType.UNLOGGED_BATCH, hintOnFailure, queryStartNanoTime);
                 Iterables.addAll(undelivered, replicaPlan.contacts().endpoints());
             }
 
diff --git a/src/java/org/apache/cassandra/cache/AutoSavingCache.java b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
index 430161f..1f383ec 100644
--- a/src/java/org/apache/cassandra/cache/AutoSavingCache.java
+++ b/src/java/org/apache/cassandra/cache/AutoSavingCache.java
@@ -17,11 +17,13 @@
  */
 package org.apache.cassandra.cache;
 
-import java.io.*;
+import java.io.BufferedInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.nio.file.NoSuchFileException;
 import java.util.*;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 
@@ -29,10 +31,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
@@ -46,19 +45,22 @@
 import org.apache.cassandra.db.compaction.CompactionInfo.Unit;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.*;
-import org.apache.cassandra.io.util.CorruptFileException;
 import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.concurrent.Future;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class AutoSavingCache<K extends CacheKey, V> extends InstrumentingCache<K, V>
 {
     public interface IStreamFactory
     {
         InputStream getInputStream(File dataPath, File crcPath) throws IOException;
-        OutputStream getOutputStream(File dataPath, File crcPath) throws FileNotFoundException;
+        OutputStream getOutputStream(File dataPath, File crcPath);
     }
 
     private static final Logger logger = LoggerFactory.getLogger(AutoSavingCache.class);
@@ -90,7 +92,7 @@
     {
         private final SequentialWriterOption writerOption = SequentialWriterOption.newBuilder()
                                                                     .trickleFsync(DatabaseDescriptor.getTrickleFsync())
-                                                                    .trickleFsyncByteInterval(DatabaseDescriptor.getTrickleFsyncIntervalInKb() * 1024)
+                                                                    .trickleFsyncByteInterval(DatabaseDescriptor.getTrickleFsyncIntervalInKiB() * 1024)
                                                                     .finishOnClose(true).build();
 
         public InputStream getInputStream(File dataPath, File crcPath) throws IOException
@@ -155,32 +157,20 @@
         }
     }
 
-    public ListenableFuture<Integer> loadSavedAsync()
+    public Future<Integer> loadSavedAsync()
     {
-        final ListeningExecutorService es = MoreExecutors.listeningDecorator(Executors.newSingleThreadExecutor());
-        final long start = System.nanoTime();
+        final ExecutorPlus es = executorFactory().sequential("loadSavedCache");
+        final long start = nanoTime();
 
-        ListenableFuture<Integer> cacheLoad = es.submit(new Callable<Integer>()
-        {
-            @Override
-            public Integer call()
-            {
-                return loadSaved();
-            }
+        Future<Integer> cacheLoad = es.submit(this::loadSaved);
+        cacheLoad.addListener(() -> {
+            if (size() > 0)
+                logger.info("Completed loading ({} ms; {} keys) {} cache",
+                        TimeUnit.NANOSECONDS.toMillis(nanoTime() - start),
+                        CacheService.instance.keyCache.size(),
+                        cacheType);
+            es.shutdown();
         });
-        cacheLoad.addListener(new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                if (size() > 0)
-                    logger.info("Completed loading ({} ms; {} keys) {} cache",
-                            TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start),
-                            CacheService.instance.keyCache.size(),
-                            cacheType);
-                es.shutdown();
-            }
-        }, MoreExecutors.directExecutor());
 
         return cacheLoad;
     }
@@ -188,7 +178,7 @@
     public int loadSaved()
     {
         int count = 0;
-        long start = System.nanoTime();
+        long start = nanoTime();
 
         // modern format, allows both key and value (so key cache load can be purely sequential)
         File dataPath = getCacheDataPath(CURRENT_VERSION);
@@ -211,7 +201,7 @@
 
                 ArrayDeque<Future<Pair<K, V>>> futures = new ArrayDeque<>();
                 long loadByNanos = start + TimeUnit.SECONDS.toNanos(DatabaseDescriptor.getCacheLoadTimeout());
-                while (System.nanoTime() < loadByNanos && in.available() > 0)
+                while (nanoTime() < loadByNanos && in.available() > 0)
                 {
                     //tableId and indexName are serialized by the serializers in CacheService
                     //That is delegated there because there are serializer specific conditions
@@ -263,12 +253,12 @@
             catch (CorruptFileException e)
             {
                 JVMStabilityInspector.inspectThrowable(e);
-                logger.warn(String.format("Non-fatal checksum error reading saved cache %s", dataPath.getAbsolutePath()), e);
+                logger.warn(String.format("Non-fatal checksum error reading saved cache %s", dataPath.absolutePath()), e);
             }
             catch (Throwable t)
             {
                 JVMStabilityInspector.inspectThrowable(t);
-                logger.info(String.format("Harmless error reading saved cache %s", dataPath.getAbsolutePath()), t);
+                logger.info(String.format("Harmless error reading saved cache %s", dataPath.absolutePath()), t);
             }
             finally
             {
@@ -278,7 +268,7 @@
         }
         if (logger.isTraceEnabled())
             logger.trace("completed reading ({} ms; {} keys) saved cache {}",
-                    TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start), count, dataPath);
+                    TimeUnit.NANOSECONDS.toMillis(nanoTime() - start), count, dataPath);
         return count;
     }
 
@@ -323,7 +313,7 @@
                                                   0,
                                                   keysEstimate,
                                                   Unit.KEYS,
-                                                  UUIDGen.getTimeUUID());
+                                                  nextTimeUUID());
         }
 
         public CacheService.CacheType cacheType()
@@ -349,7 +339,7 @@
                 return;
             }
 
-            long start = System.nanoTime();
+            long start = nanoTime();
 
             Pair<File, File> cacheFilePaths = tempCacheFiles();
             try (WrappedDataOutputStreamPlus writer = new WrappedDataOutputStreamPlus(streamFactory.getOutputStream(cacheFilePaths.left, cacheFilePaths.right)))
@@ -357,11 +347,6 @@
 
                 //Need to be able to check schema version because CF names are ambiguous
                 UUID schemaVersion = Schema.instance.getVersion();
-                if (schemaVersion == null)
-                {
-                    Schema.instance.updateVersion();
-                    schemaVersion = Schema.instance.getVersion();
-                }
                 writer.writeLong(schemaVersion.getMostSignificantBits());
                 writer.writeLong(schemaVersion.getLeastSignificantBits());
 
@@ -382,7 +367,7 @@
                         break;
                 }
             }
-            catch (FileNotFoundException e)
+            catch (FileNotFoundException | NoSuchFileException e)
             {
                 throw new RuntimeException(e);
             }
@@ -394,31 +379,31 @@
             File cacheFile = getCacheDataPath(CURRENT_VERSION);
             File crcFile = getCacheCrcPath(CURRENT_VERSION);
 
-            cacheFile.delete(); // ignore error if it didn't exist
-            crcFile.delete();
+            cacheFile.tryDelete(); // ignore error if it didn't exist
+            crcFile.tryDelete();
 
-            if (!cacheFilePaths.left.renameTo(cacheFile))
+            if (!cacheFilePaths.left.tryMove(cacheFile))
                 logger.error("Unable to rename {} to {}", cacheFilePaths.left, cacheFile);
 
-            if (!cacheFilePaths.right.renameTo(crcFile))
+            if (!cacheFilePaths.right.tryMove(crcFile))
                 logger.error("Unable to rename {} to {}", cacheFilePaths.right, crcFile);
 
-            logger.info("Saved {} ({} items) in {} ms", cacheType, keysWritten, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
+            logger.info("Saved {} ({} items) in {} ms", cacheType, keysWritten, TimeUnit.NANOSECONDS.toMillis(nanoTime() - start));
         }
 
         private Pair<File, File> tempCacheFiles()
         {
             File dataPath = getCacheDataPath(CURRENT_VERSION);
             File crcPath = getCacheCrcPath(CURRENT_VERSION);
-            return Pair.create(FileUtils.createTempFile(dataPath.getName(), null, dataPath.getParentFile()),
-                               FileUtils.createTempFile(crcPath.getName(), null, crcPath.getParentFile()));
+            return Pair.create(FileUtils.createTempFile(dataPath.name(), null, dataPath.parent()),
+                               FileUtils.createTempFile(crcPath.name(), null, crcPath.parent()));
         }
 
         private void deleteOldCacheFiles()
         {
             File savedCachesDir = new File(DatabaseDescriptor.getSavedCachesLocation());
             assert savedCachesDir.exists() && savedCachesDir.isDirectory();
-            File[] files = savedCachesDir.listFiles();
+            File[] files = savedCachesDir.tryList();
             if (files != null)
             {
                 String cacheNameFormat = String.format("%s-%s.db", cacheType.toString(), CURRENT_VERSION);
@@ -427,11 +412,11 @@
                     if (!file.isFile())
                         continue; // someone's been messing with our directory.  naughty!
 
-                    if (file.getName().endsWith(cacheNameFormat)
-                     || file.getName().endsWith(cacheType.toString()))
+                    if (file.name().endsWith(cacheNameFormat)
+                     || file.name().endsWith(cacheType.toString()))
                     {
-                        if (!file.delete())
-                            logger.warn("Failed to delete {}", file.getAbsolutePath());
+                        if (!file.tryDelete())
+                            logger.warn("Failed to delete {}", file.absolutePath());
                     }
                 }
             }
diff --git a/src/java/org/apache/cassandra/cache/CaffeineCache.java b/src/java/org/apache/cassandra/cache/CaffeineCache.java
index d51ea84..717fb78 100644
--- a/src/java/org/apache/cassandra/cache/CaffeineCache.java
+++ b/src/java/org/apache/cassandra/cache/CaffeineCache.java
@@ -21,12 +21,11 @@
 
 import java.util.Iterator;
 
-import com.google.common.util.concurrent.MoreExecutors;
-
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.Policy.Eviction;
 import com.github.benmanes.caffeine.cache.Weigher;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 
 /**
  * An adapter from a Caffeine cache to the ICache interface. This provides an on-heap cache using
@@ -54,7 +53,7 @@
         Cache<K, V> cache = Caffeine.newBuilder()
                 .maximumWeight(weightedCapacity)
                 .weigher(weigher)
-                .executor(MoreExecutors.directExecutor())
+                .executor(ImmediateExecutor.INSTANCE)
                 .build();
         return new CaffeineCache<>(cache);
     }
@@ -64,7 +63,7 @@
         return create(weightedCapacity, (key, value) -> {
             long size = key.unsharedHeapSize() + value.unsharedHeapSize();
             if (size > Integer.MAX_VALUE) {
-                throw new IllegalArgumentException("Serialized size cannot be more than 2GB/Integer.MAX_VALUE");
+                throw new IllegalArgumentException("Serialized size cannot be more than 2GiB/Integer.MAX_VALUE");
             }
             return (int) size;
         });
diff --git a/src/java/org/apache/cassandra/cache/ChunkCache.java b/src/java/org/apache/cassandra/cache/ChunkCache.java
index c53810a..51dbdc6 100644
--- a/src/java/org/apache/cassandra/cache/ChunkCache.java
+++ b/src/java/org/apache/cassandra/cache/ChunkCache.java
@@ -26,9 +26,9 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Throwables;
 import com.google.common.collect.Iterables;
-import com.google.common.util.concurrent.MoreExecutors;
 
 import com.github.benmanes.caffeine.cache.*;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.util.*;
@@ -39,8 +39,8 @@
 public class ChunkCache
         implements CacheLoader<ChunkCache.Key, ChunkCache.Buffer>, RemovalListener<ChunkCache.Key, ChunkCache.Buffer>, CacheSize
 {
-    public static final int RESERVED_POOL_SPACE_IN_MB = 32;
-    public static final long cacheSize = 1024L * 1024L * Math.max(0, DatabaseDescriptor.getFileCacheSizeInMB() - RESERVED_POOL_SPACE_IN_MB);
+    public static final int RESERVED_POOL_SPACE_IN_MiB = 32;
+    public static final long cacheSize = 1024L * 1024L * Math.max(0, DatabaseDescriptor.getFileCacheSizeInMiB() - RESERVED_POOL_SPACE_IN_MiB);
     public static final boolean roundUp = DatabaseDescriptor.getFileCacheRoundUp();
 
     private static boolean enabled = DatabaseDescriptor.getFileCacheEnabled() && cacheSize > 0;
@@ -143,7 +143,7 @@
         metrics = new ChunkCacheMetrics(this);
         cache = Caffeine.newBuilder()
                         .maximumWeight(cacheSize)
-                        .executor(MoreExecutors.directExecutor())
+                        .executor(ImmediateExecutor.INSTANCE)
                         .weigher((key, buffer) -> ((Buffer) buffer).buffer.capacity())
                         .removalListener(this)
                         .recordStats(() -> metrics)
diff --git a/src/java/org/apache/cassandra/cache/OHCProvider.java b/src/java/org/apache/cassandra/cache/OHCProvider.java
index afdc872..4a705a6 100644
--- a/src/java/org/apache/cassandra/cache/OHCProvider.java
+++ b/src/java/org/apache/cassandra/cache/OHCProvider.java
@@ -37,7 +37,7 @@
     public ICache<RowCacheKey, IRowCacheEntry> create()
     {
         OHCacheBuilder<RowCacheKey, IRowCacheEntry> builder = OHCacheBuilder.newBuilder();
-        builder.capacity(DatabaseDescriptor.getRowCacheSizeInMB() * 1024 * 1024)
+        builder.capacity(DatabaseDescriptor.getRowCacheSizeInMiB() * 1024 * 1024)
                .keySerializer(KeySerializer.instance)
                .valueSerializer(ValueSerializer.instance)
                .throwOOME(true);
diff --git a/src/java/org/apache/cassandra/cache/SerializingCache.java b/src/java/org/apache/cassandra/cache/SerializingCache.java
index 55c20ec..8ee8e02 100644
--- a/src/java/org/apache/cassandra/cache/SerializingCache.java
+++ b/src/java/org/apache/cassandra/cache/SerializingCache.java
@@ -21,6 +21,7 @@
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.Weigher;
 
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.io.ISerializer;
 import org.apache.cassandra.io.util.MemoryInputStream;
 import org.apache.cassandra.io.util.MemoryOutputStream;
@@ -32,8 +33,6 @@
 import java.io.IOException;
 import java.util.Iterator;
 
-import com.google.common.util.concurrent.MoreExecutors;
-
 /**
  * Serializes cache values off-heap.
  */
@@ -51,7 +50,7 @@
         this.cache = Caffeine.newBuilder()
                    .weigher(weigher)
                    .maximumWeight(capacity)
-                   .executor(MoreExecutors.directExecutor())
+                   .executor(ImmediateExecutor.INSTANCE)
                    .removalListener((key, mem, cause) -> {
                        if (cause.wasEvicted()) {
                            mem.unreference();
@@ -70,7 +69,7 @@
         return create(weightedCapacity, (key, value) -> {
             long size = value.size();
             if (size > Integer.MAX_VALUE) {
-                throw new IllegalArgumentException("Serialized size must not be more than 2GB");
+                throw new IllegalArgumentException("Serialized size must not be more than 2GiB");
             }
             return (int) size;
         }, serializer);
diff --git a/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java b/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java
index 813f6fe..56393c4 100644
--- a/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java
+++ b/src/java/org/apache/cassandra/cache/SerializingCacheProvider.java
@@ -30,7 +30,7 @@
 {
     public ICache<RowCacheKey, IRowCacheEntry> create()
     {
-        return SerializingCache.create(DatabaseDescriptor.getRowCacheSizeInMB() * 1024 * 1024, new RowCacheSerializer());
+        return SerializingCache.create(DatabaseDescriptor.getRowCacheSizeInMiB() * 1024 * 1024, new RowCacheSerializer());
     }
 
     // Package Public: used by external Row Cache plugins
diff --git a/src/java/org/apache/cassandra/concurrent/AbstractLocalAwareExecutorService.java b/src/java/org/apache/cassandra/concurrent/AbstractLocalAwareExecutorService.java
deleted file mode 100644
index e7bec19..0000000
--- a/src/java/org/apache/cassandra/concurrent/AbstractLocalAwareExecutorService.java
+++ /dev/null
@@ -1,231 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.concurrent;
-
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
-import org.apache.cassandra.utils.JVMStabilityInspector;
-
-public abstract class AbstractLocalAwareExecutorService implements LocalAwareExecutorService
-{
-    private static final Logger logger = LoggerFactory.getLogger(AbstractLocalAwareExecutorService.class);
-
-    protected abstract void addTask(FutureTask<?> futureTask);
-    protected abstract void onCompletion();
-
-    /** Task Submission / Creation / Objects **/
-
-    public <T> FutureTask<T> submit(Callable<T> task)
-    {
-        return submit(newTaskFor(task));
-    }
-
-    public FutureTask<?> submit(Runnable task)
-    {
-        return submit(newTaskFor(task, null));
-    }
-
-    public <T> FutureTask<T> submit(Runnable task, T result)
-    {
-        return submit(newTaskFor(task, result));
-    }
-
-    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> List<Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    protected <T> FutureTask<T> newTaskFor(Runnable runnable, T result)
-    {
-        return newTaskFor(runnable, result, ExecutorLocals.create());
-    }
-
-    protected <T> FutureTask<T> newTaskFor(Runnable runnable, T result, ExecutorLocals locals)
-    {
-        if (locals != null)
-        {
-            if (runnable instanceof LocalSessionFutureTask)
-                return (LocalSessionFutureTask<T>) runnable;
-            return new LocalSessionFutureTask<T>(runnable, result, locals);
-        }
-        if (runnable instanceof FutureTask)
-            return (FutureTask<T>) runnable;
-        return new FutureTask<>(runnable, result);
-    }
-
-    protected <T> FutureTask<T> newTaskFor(Callable<T> callable)
-    {
-        return newTaskFor(callable, ExecutorLocals.create());
-    }
-
-    protected <T> FutureTask<T> newTaskFor(Callable<T> callable, ExecutorLocals locals)
-    {
-        if (locals != null)
-        {
-            if (callable instanceof LocalSessionFutureTask)
-                return (LocalSessionFutureTask<T>) callable;
-            return new LocalSessionFutureTask<T>(callable, ExecutorLocals.create());
-        }
-        if (callable instanceof FutureTask)
-            return (FutureTask<T>) callable;
-        return new FutureTask<>(callable);
-    }
-
-    private class LocalSessionFutureTask<T> extends FutureTask<T>
-    {
-        private final ExecutorLocals locals;
-
-        public LocalSessionFutureTask(Callable<T> callable, ExecutorLocals locals)
-        {
-            super(callable);
-            this.locals = locals;
-        }
-
-        public LocalSessionFutureTask(Runnable runnable, T result, ExecutorLocals locals)
-        {
-            super(runnable, result);
-            this.locals = locals;
-        }
-
-        public void run()
-        {
-            ExecutorLocals old = ExecutorLocals.create();
-            ExecutorLocals.set(locals);
-            try
-            {
-                super.run();
-            }
-            finally
-            {
-                ExecutorLocals.set(old);
-            }
-        }
-    }
-
-    class FutureTask<T> extends SimpleCondition implements Future<T>, Runnable
-    {
-        private boolean failure;
-        private Object result = this;
-        private final Callable<T> callable;
-
-        public FutureTask(Callable<T> callable)
-        {
-            this.callable = callable;
-        }
-        public FutureTask(Runnable runnable, T result)
-        {
-            this(Executors.callable(runnable, result));
-        }
-
-        public void run()
-        {
-            try
-            {
-                result = callable.call();
-            }
-            catch (Throwable t)
-            {
-                logger.error("Uncaught exception on thread {}", Thread.currentThread(), t);
-                result = t;
-                failure = true;
-                JVMStabilityInspector.inspectThrowable(t);
-            }
-            finally
-            {
-                signalAll();
-                onCompletion();
-            }
-        }
-
-        public boolean cancel(boolean mayInterruptIfRunning)
-        {
-            return false;
-        }
-
-        public boolean isCancelled()
-        {
-            return false;
-        }
-
-        public boolean isDone()
-        {
-            return isSignaled();
-        }
-
-        public T get() throws InterruptedException, ExecutionException
-        {
-            await();
-            Object result = this.result;
-            if (failure)
-                throw new ExecutionException((Throwable) result);
-            return (T) result;
-        }
-
-        public T get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
-        {
-            if (!await(timeout, unit))
-                throw new TimeoutException();
-            Object result = this.result;
-            if (failure)
-                throw new ExecutionException((Throwable) result);
-            return (T) result;
-        }
-    }
-
-    private <T> FutureTask<T> submit(FutureTask<T> task)
-    {
-        addTask(task);
-        return task;
-    }
-
-    public void execute(Runnable command)
-    {
-        addTask(newTaskFor(command, null, ExecutorLocals.create()));
-    }
-
-    public void execute(Runnable command, ExecutorLocals locals)
-    {
-        addTask(newTaskFor(command, null, locals));
-    }
-}
diff --git a/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java
deleted file mode 100644
index 3b9d2ff..0000000
--- a/src/java/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutor.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.concurrent;
-
-import java.util.concurrent.*;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.JVMStabilityInspector;
-
-/**
- * Like DebuggableThreadPoolExecutor, DebuggableScheduledThreadPoolExecutor always
- * logs exceptions from the tasks it is given, even if Future.get is never called elsewhere.
- *
- * DebuggableScheduledThreadPoolExecutor also catches exceptions during Task execution
- * so that they don't supress subsequent invocations of the task.
- *
- * Finally, there is a special rejected execution handler for tasks rejected during the shutdown hook.
- *
- * For fire and forget tasks (like ref tidy) we can safely ignore the exceptions.
- * For any callers that care to know their task was rejected we cancel passed task.
- */
-public class DebuggableScheduledThreadPoolExecutor extends ScheduledThreadPoolExecutor
-{
-    private static final Logger logger = LoggerFactory.getLogger(DebuggableScheduledThreadPoolExecutor.class);
-
-    public static final RejectedExecutionHandler rejectedExecutionHandler = new RejectedExecutionHandler()
-    {
-        public void rejectedExecution(Runnable task, ThreadPoolExecutor executor)
-        {
-            if (executor.isShutdown())
-            {
-                if (!StorageService.instance.isShutdown())
-                    throw new RejectedExecutionException("ScheduledThreadPoolExecutor has shut down.");
-
-                //Give some notification to the caller the task isn't going to run
-                if (task instanceof Future)
-                    ((Future) task).cancel(false);
-
-                logger.debug("ScheduledThreadPoolExecutor has shut down as part of C* shutdown");
-            }
-            else
-            {
-                throw new AssertionError("Unknown rejection of ScheduledThreadPoolExecutor task");
-            }
-        }
-    };
-
-    public DebuggableScheduledThreadPoolExecutor(int corePoolSize, String threadPoolName, int priority)
-    {
-        super(corePoolSize, new NamedThreadFactory(threadPoolName, priority));
-        setRejectedExecutionHandler(rejectedExecutionHandler);
-    }
-
-    public DebuggableScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory)
-    {
-        super(corePoolSize, threadFactory);
-        setRejectedExecutionHandler(rejectedExecutionHandler);
-    }
-
-    public DebuggableScheduledThreadPoolExecutor(String threadPoolName)
-    {
-        this(1, threadPoolName, Thread.NORM_PRIORITY);
-        setRejectedExecutionHandler(rejectedExecutionHandler);
-    }
-
-    // We need this as well as the wrapper for the benefit of non-repeating tasks
-    @Override
-    public void afterExecute(Runnable r, Throwable t)
-    {
-        super.afterExecute(r,t);
-        DebuggableThreadPoolExecutor.logExceptionsAfterExecute(r, t);
-    }
-
-    // override scheduling to supress exceptions that would cancel future executions
-    @Override
-    public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
-    {
-        return super.scheduleAtFixedRate(new UncomplainingRunnable(command), initialDelay, period, unit);
-    }
-
-    @Override
-    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
-    {
-        return super.scheduleWithFixedDelay(new UncomplainingRunnable(command), initialDelay, delay, unit);
-    }
-
-    private static class UncomplainingRunnable implements Runnable
-    {
-        private final Runnable runnable;
-
-        public UncomplainingRunnable(Runnable runnable)
-        {
-            this.runnable = runnable;
-        }
-
-        public void run()
-        {
-            try
-            {
-                runnable.run();
-            }
-            catch (Throwable t)
-            {
-                JVMStabilityInspector.inspectThrowable(t);
-                DebuggableThreadPoolExecutor.handleOrLog(t);
-            }
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutor.java
deleted file mode 100644
index 7d9da4d..0000000
--- a/src/java/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutor.java
+++ /dev/null
@@ -1,442 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.concurrent;
-
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.Callable;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionException;
-import java.util.concurrent.RejectedExecutionHandler;
-import java.util.concurrent.RunnableFuture;
-import java.util.concurrent.SynchronousQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This class encorporates some Executor best practices for Cassandra.  Most of the executors in the system
- * should use or extend this.  There are two main improvements over a vanilla TPE:
- *
- * - If a task throws an exception, the default uncaught exception handler will be invoked; if there is
- *   no such handler, the exception will be logged.
- * - MaximumPoolSize is not supported.  Here is what that means (quoting TPE javadoc):
- *
- *     If fewer than corePoolSize threads are running, the Executor always prefers adding a new thread rather than queuing.
- *     If corePoolSize or more threads are running, the Executor always prefers queuing a request rather than adding a new thread.
- *     If a request cannot be queued, a new thread is created unless this would exceed maximumPoolSize, in which case, the task will be rejected.
- *
- *   We don't want this last stage of creating new threads if the queue is full; it makes it needlessly difficult to
- *   reason about the system's behavior.  In other words, if DebuggableTPE has allocated our maximum number of (core)
- *   threads and the queue is full, we want the enqueuer to block.  But to allow the number of threads to drop if a
- *   stage is less busy, core thread timeout is enabled.
- */
-public class DebuggableThreadPoolExecutor extends ThreadPoolExecutor implements LocalAwareExecutorService
-{
-    protected static final Logger logger = LoggerFactory.getLogger(DebuggableThreadPoolExecutor.class);
-    public static final RejectedExecutionHandler blockingExecutionHandler = new RejectedExecutionHandler()
-    {
-        public void rejectedExecution(Runnable task, ThreadPoolExecutor executor)
-        {
-            ((DebuggableThreadPoolExecutor) executor).onInitialRejection(task);
-            BlockingQueue<Runnable> queue = executor.getQueue();
-            while (true)
-            {
-                if (executor.isShutdown())
-                {
-                    ((DebuggableThreadPoolExecutor) executor).onFinalRejection(task);
-                    throw new RejectedExecutionException("ThreadPoolExecutor has shut down");
-                }
-                try
-                {
-                    if (queue.offer(task, 1000, TimeUnit.MILLISECONDS))
-                    {
-                        ((DebuggableThreadPoolExecutor) executor).onFinalAccept(task);
-                        break;
-                    }
-                }
-                catch (InterruptedException e)
-                {
-                    throw new AssertionError(e);
-                }
-            }
-        }
-    };
-
-    public DebuggableThreadPoolExecutor(String threadPoolName, int priority)
-    {
-        this(1, Integer.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory(threadPoolName, priority));
-    }
-
-    public DebuggableThreadPoolExecutor(int corePoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> queue, ThreadFactory factory)
-    {
-        this(corePoolSize, corePoolSize, keepAliveTime, unit, queue, factory);
-    }
-
-    public DebuggableThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory)
-    {
-        super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory);
-        allowCoreThreadTimeOut(true);
-
-        // block task submissions until queue has room.
-        // this is fighting TPE's design a bit because TPE rejects if queue.offer reports a full queue.
-        // we'll just override this with a handler that retries until it gets in.  ugly, but effective.
-        // (there is an extensive analysis of the options here at
-        //  http://today.java.net/pub/a/today/2008/10/23/creating-a-notifying-blocking-thread-pool-executor.html)
-        this.setRejectedExecutionHandler(blockingExecutionHandler);
-    }
-
-    /**
-     * Creates a thread pool that creates new threads as needed, but
-     * will reuse previously constructed threads when they are
-     * available.
-     * @param threadPoolName the name of the threads created by this executor
-     * @return The new DebuggableThreadPoolExecutor
-     */
-    public static DebuggableThreadPoolExecutor createCachedThreadpoolWithMaxSize(String threadPoolName)
-    {
-        return new DebuggableThreadPoolExecutor(0, Integer.MAX_VALUE,
-                                                60L, TimeUnit.SECONDS,
-                                                new SynchronousQueue<Runnable>(),
-                                                new NamedThreadFactory(threadPoolName));
-    }
-
-    /**
-     * Returns a ThreadPoolExecutor with a fixed number of threads.
-     * When all threads are actively executing tasks, new tasks are queued.
-     * If (most) threads are expected to be idle most of the time, prefer createWithMaxSize() instead.
-     * @param threadPoolName the name of the threads created by this executor
-     * @param size the fixed number of threads for this executor
-     * @return the new DebuggableThreadPoolExecutor
-     */
-    public static DebuggableThreadPoolExecutor createWithFixedPoolSize(String threadPoolName, int size)
-    {
-        return createWithMaximumPoolSize(threadPoolName, size, Integer.MAX_VALUE, TimeUnit.SECONDS);
-    }
-
-    /**
-     * Returns a ThreadPoolExecutor with a fixed maximum number of threads, but whose
-     * threads are terminated when idle for too long.
-     * When all threads are actively executing tasks, new tasks are queued.
-     * @param threadPoolName the name of the threads created by this executor
-     * @param size the maximum number of threads for this executor
-     * @param keepAliveTime the time an idle thread is kept alive before being terminated
-     * @param unit tht time unit for {@code keepAliveTime}
-     * @return the new DebuggableThreadPoolExecutor
-     */
-    public static DebuggableThreadPoolExecutor createWithMaximumPoolSize(String threadPoolName, int size, int keepAliveTime, TimeUnit unit)
-    {
-        return new DebuggableThreadPoolExecutor(size, Integer.MAX_VALUE, keepAliveTime, unit, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory(threadPoolName));
-    }
-
-    protected void onInitialRejection(Runnable task) {}
-    protected void onFinalAccept(Runnable task) {}
-    protected void onFinalRejection(Runnable task) {}
-
-    public void execute(Runnable command, ExecutorLocals locals)
-    {
-        super.execute(locals == null || command instanceof LocalSessionWrapper
-                      ? command
-                      : LocalSessionWrapper.create(command, null, locals));
-    }
-
-    public void maybeExecuteImmediately(Runnable command)
-    {
-        execute(command);
-    }
-
-    private ExecutorLocals maybeCreateExecutorLocals(Object command)
-    {
-        return command instanceof LocalSessionWrapper ? null : ExecutorLocals.create();
-    }
-
-    // execute does not call newTaskFor
-    @Override
-    public void execute(Runnable command)
-    {
-        ExecutorLocals locals = maybeCreateExecutorLocals(command);
-        super.execute(locals != null
-                      ? LocalSessionWrapper.create(command, locals)
-                      : command);
-    }
-
-    @Override
-    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T result)
-    {
-        ExecutorLocals locals = maybeCreateExecutorLocals(runnable);
-        if (locals != null)
-            return LocalSessionWrapper.create(runnable, result, locals);
-        if (runnable instanceof RunnableFuture)
-            return new ForwardingRunnableFuture<>((RunnableFuture) runnable, result);
-        return super.newTaskFor(runnable, result);
-    }
-
-    @Override
-    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable)
-    {
-        ExecutorLocals locals = maybeCreateExecutorLocals(callable);
-        if (locals != null)
-            return LocalSessionWrapper.create(callable, locals);
-        return super.newTaskFor(callable);
-    }
-
-    @Override
-    protected void afterExecute(Runnable r, Throwable t)
-    {
-        super.afterExecute(r, t);
-
-        maybeResetLocalSessionWrapper(r);
-        logExceptionsAfterExecute(r, t);
-    }
-
-    protected static void maybeResetLocalSessionWrapper(Runnable r)
-    {
-        if (r instanceof LocalSessionWrapper)
-        {
-            LocalSessionWrapper tsw = (LocalSessionWrapper) r;
-            // we have to reset trace state as its presence is what denotes the current thread is tracing
-            // and if left this thread might start tracing unrelated tasks
-            tsw.reset();
-        }
-    }
-
-    @Override
-    protected void beforeExecute(Thread t, Runnable r)
-    {
-        if (r instanceof LocalSessionWrapper)
-            ((LocalSessionWrapper) r).setupContext();
-
-        super.beforeExecute(t, r);
-    }
-
-    @Override
-    public int getActiveTaskCount()
-    {
-        return getActiveCount();
-    }
-
-    @Override
-    public int getPendingTaskCount()
-    {
-        return getQueue().size();
-    }
-
-    /**
-     * Send @param t and any exception wrapped by @param r to the default uncaught exception handler,
-     * or log them if none such is set up
-     */
-    public static void logExceptionsAfterExecute(Runnable r, Throwable t)
-    {
-        Throwable hiddenThrowable = extractThrowable(r);
-        if (hiddenThrowable != null)
-            handleOrLog(hiddenThrowable);
-
-        // ThreadPoolExecutor will re-throw exceptions thrown by its Task (which will be seen by
-        // the default uncaught exception handler) so we only need to do anything if that handler
-        // isn't set up yet.
-        if (t != null && Thread.getDefaultUncaughtExceptionHandler() == null)
-            handleOrLog(t);
-    }
-
-    /**
-     * Send @param t to the default uncaught exception handler, or log it if none such is set up
-     */
-    public static void handleOrLog(Throwable t)
-    {
-        if (Thread.getDefaultUncaughtExceptionHandler() == null)
-            logger.error("Error in ThreadPoolExecutor", t);
-        else
-            Thread.getDefaultUncaughtExceptionHandler().uncaughtException(Thread.currentThread(), t);
-    }
-
-    /**
-     * @return any exception wrapped by @param runnable, i.e., if it is a FutureTask
-     */
-    public static Throwable extractThrowable(Runnable runnable)
-    {
-        // Check for exceptions wrapped by FutureTask or tasks which wrap FutureTask (HasDelegateFuture interface)
-        Throwable throwable = null;
-        if (runnable instanceof Future<?>)
-        {
-            throwable = extractThrowable(((Future<?>) runnable));
-        }
-        if (throwable == null && runnable instanceof HasDelegateFuture)
-        {
-            throwable =  extractThrowable(((HasDelegateFuture) runnable).getDelegate());
-        }
-
-        return throwable;
-    }
-
-    private static Throwable extractThrowable(Future<?> future)
-    {
-        // Check for exceptions wrapped by Future.  We do this by calling get(), which will
-        // cause it to throw any saved exception.
-        //
-        // Complicating things, calling get() on a ScheduledFutureTask will block until the task
-        // is cancelled.  Hence, the extra isDone check beforehand.
-        if (future.isDone())
-        {
-            try
-            {
-                future.get();
-            }
-            catch (InterruptedException e)
-            {
-                throw new AssertionError(e);
-            }
-            catch (CancellationException e)
-            {
-                logger.trace("Task cancelled", e);
-            }
-            catch (ExecutionException e)
-            {
-                return e.getCause();
-            }
-        }
-        return null;
-    }
-
-    /**
-     * If a task wraps a {@link Future} then it should implement this interface to expose the underlining future for
-     * {@link #extractThrowable(Runnable)} to handle.
-     */
-    private interface HasDelegateFuture
-    {
-        Future<?> getDelegate();
-    }
-
-    /**
-     * Used to wrap a Runnable or Callable passed to submit or execute so we can clone the ExecutorLocals and move
-     * them into the worker thread.
-     *
-     * The {@link DebuggableThreadPoolExecutor#afterExecute(java.lang.Runnable, java.lang.Throwable)}
-     * method is called after the runnable completes, which will then call {@link #extractThrowable(Runnable)} to
-     * attempt to get the "hidden" throwable from a task which implements {@link Future}.  The problem is that {@link LocalSessionWrapper}
-     * expects that the {@link Callable} provided to it will throw; which is not true for {@link RunnableFuture} tasks;
-     * the expected semantic in this case is to have the LocalSessionWrapper future be successful and a new implementation
-     * {@link FutureLocalSessionWrapper} is created to expose the underline {@link Future} for {@link #extractThrowable(Runnable)}.
-     *
-     * If a task is a {@link Runnable} the create family of methods should be called rather than {@link Executors#callable(Runnable)}
-     * since they will handle the case where the task is also a future, and will make sure the {@link #extractThrowable(Runnable)}
-     * is able to detect the task's underline exception.
-     *
-     * @param <T>
-     */
-    private static class LocalSessionWrapper<T> extends FutureTask<T>
-    {
-        private final ExecutorLocals locals;
-
-        private LocalSessionWrapper(Callable<T> callable, ExecutorLocals locals)
-        {
-            super(callable);
-            this.locals = locals;
-        }
-
-        static LocalSessionWrapper<Object> create(Runnable command)
-        {
-            return create(command, null, ExecutorLocals.create());
-        }
-
-        static LocalSessionWrapper<Object> create(Runnable command, ExecutorLocals locals)
-        {
-            return create(command, null, locals);
-        }
-
-        static <T> LocalSessionWrapper<T> create(Runnable command, T result)
-        {
-            return create(command, result, ExecutorLocals.create());
-        }
-
-        static <T> LocalSessionWrapper<T> create(Runnable command, T result, ExecutorLocals locals)
-        {
-            if (command instanceof RunnableFuture)
-                return new FutureLocalSessionWrapper<>((RunnableFuture) command, result, locals);
-            return new LocalSessionWrapper<>(Executors.callable(command, result), locals);
-        }
-
-        static <T> LocalSessionWrapper<T> create(Callable<T> command)
-        {
-            return new LocalSessionWrapper<>(command, ExecutorLocals.create());
-        }
-
-        static <T> LocalSessionWrapper<T> create(Callable<T> command, ExecutorLocals locals)
-        {
-            return new LocalSessionWrapper<>(command, locals);
-        }
-
-        private void setupContext()
-        {
-            ExecutorLocals.set(locals);
-        }
-
-        private void reset()
-        {
-            ExecutorLocals.set(null);
-        }
-    }
-
-    private static class FutureLocalSessionWrapper<T> extends LocalSessionWrapper<T> implements HasDelegateFuture
-    {
-        private final RunnableFuture<T> delegate;
-
-        private FutureLocalSessionWrapper(RunnableFuture command, T result, ExecutorLocals locals)
-        {
-            super(() -> {
-                command.run();
-                return result;
-            }, locals);
-            this.delegate = command;
-        }
-
-        public Future<T> getDelegate()
-        {
-            return delegate;
-        }
-    }
-
-    /**
-     * Similar to {@link FutureLocalSessionWrapper}, this class wraps a {@link Future} and will be success
-     * if the underline future is marked as failed; the main difference is that this class does not setup
-     * {@link ExecutorLocals}.
-     *
-     * @param <T>
-     */
-    private static class ForwardingRunnableFuture<T> extends FutureTask<T> implements HasDelegateFuture
-    {
-        private final RunnableFuture<T> delegate;
-
-        public ForwardingRunnableFuture(RunnableFuture<T> delegate, T result)
-        {
-            super(delegate, result);
-            this.delegate = delegate;
-        }
-
-        public Future<T> getDelegate()
-        {
-            return delegate;
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/concurrent/ExecutionFailure.java b/src/java/org/apache/cassandra/concurrent/ExecutionFailure.java
new file mode 100644
index 0000000..7fa7dcb
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ExecutionFailure.java
@@ -0,0 +1,179 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.Future;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.compaction.CompactionInterruptedException;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.WithResources;
+
+/**
+ * Standardised handling of failures during execution - mostly this involves invoking a thread's
+ * {@link java.lang.Thread.UncaughtExceptionHandler} or
+ * {@link JVMStabilityInspector#uncaughtException(Thread, Throwable)},
+ * with special handling for {@link CompactionInterruptedException}.
+ * This class also provides wrappers for {@link WithResources} with {@link Runnable} and {@link Callable}.
+ */
+public class ExecutionFailure
+{
+    private static final Logger logger = LoggerFactory.getLogger(ExecutionFailure.class);
+
+    /**
+     * Invoke the relevant {@link java.lang.Thread.UncaughtExceptionHandler},
+     * ignoring (except for logging) any {@link CompactionInterruptedException}
+     */
+    public static void handle(Throwable t)
+    {
+        try
+        {
+            if (t instanceof CompactionInterruptedException)
+            {
+                // TODO: should we check to see there aren't nested CompactionInterruptedException?
+                logger.info(t.getMessage());
+                if (t.getSuppressed() != null && t.getSuppressed().length > 0)
+                    logger.warn("Interruption of compaction encountered exceptions:", t);
+                else
+                    logger.trace("Full interruption stack trace:", t);
+            }
+            else
+            {
+                Thread thread = Thread.currentThread();
+                Thread.UncaughtExceptionHandler handler = thread.getUncaughtExceptionHandler();
+                if (handler == null)
+                    handler = JVMStabilityInspector::uncaughtException;
+                handler.uncaughtException(thread, t);
+            }
+        }
+        catch (Throwable shouldNeverHappen)
+        {
+            logger.error("Unexpected error while handling unexpected error", shouldNeverHappen);
+        }
+    }
+
+    /**
+     * See {@link #propagating(WithResources, Runnable)}
+     */
+    static Runnable propagating(Runnable wrap)
+    {
+        return wrap instanceof FutureTask<?> ? wrap : propagating(WithResources.none(), wrap);
+    }
+
+    /**
+     * In the case of plain executions, we want to handle exceptions without the full {@link FutureTask} machinery
+     * while still propagating the exception to the encapsulating Future
+     */
+    static Runnable propagating(WithResources withResources, Runnable wrap)
+    {
+        return enforceOptions(withResources, wrap, true);
+    }
+
+    /**
+     * See {@link #suppressing(WithResources, Runnable)}
+     */
+    static Runnable suppressing(Runnable wrap)
+    {
+        return wrap instanceof FutureTask<?> ? wrap : suppressing(WithResources.none(), wrap);
+    }
+
+    /**
+     * In the case of scheduled periodic tasks, we don't want exceptions propagating to cancel the recurring execution.
+     */
+    static Runnable suppressing(WithResources withResources, Runnable wrap)
+    {
+        return enforceOptions(withResources, wrap, false);
+    }
+
+    /**
+     * Encapsulate the execution, propagating or suppressing any exceptions as requested.
+     *
+     * note that if {@code wrap} is a {@link java.util.concurrent.Future} its exceptions may not be captured,
+     * however the codebase should be using our internal {@link Future} variants which handle exceptions in the
+     * desired way.
+     */
+    private static Runnable enforceOptions(WithResources withResources, Runnable wrap, boolean propagate)
+    {
+        return new Runnable()
+        {
+            @Override
+            public void run()
+            {
+                try (Closeable close = withResources.get())
+                {
+                    wrap.run();
+                }
+                catch (Throwable t)
+                {
+                    handle(t);
+                    if (propagate)
+                        throw t;
+                }
+            }
+
+            @Override
+            public String toString()
+            {
+                return wrap.toString();
+            }
+        };
+    }
+
+    /**
+     * See {@link #enforceOptions(WithResources, Callable)}
+     */
+    static <V> Callable<V> propagating(Callable<V> wrap)
+    {
+        return enforceOptions(WithResources.none(), wrap);
+    }
+
+    /**
+     * In the case of non-recurring scheduled tasks, we want to handle exceptions without the full {@link FutureTask}
+     * machinery, while still propagating the exception to the encapsulating Future
+     */
+    static <V> Callable<V> enforceOptions(WithResources withResources, Callable<V> wrap)
+    {
+        return new Callable<V>()
+        {
+            @Override
+            public V call() throws Exception
+            {
+                try (Closeable close = withResources.get())
+                {
+                    return wrap.call();
+                }
+                catch (Throwable t)
+                {
+                    handle(t);
+                    throw t;
+                }
+            }
+
+            @Override
+            public String toString()
+            {
+                return wrap.toString();
+            }
+        };
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ExecutorBuilder.java b/src/java/org/apache/cassandra/concurrent/ExecutorBuilder.java
new file mode 100644
index 0000000..c1d39d5
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ExecutorBuilder.java
@@ -0,0 +1,96 @@
+/*
+ * 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.concurrent;
+
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Configure an executor before creating it.
+ * See {@link ThreadPoolExecutorBuilder}
+ */
+@Shared(scope = SIMULATION)
+public interface ExecutorBuilder<E extends ExecutorService>
+{
+    /**
+     * Threads for the executor built by this factory will timeout (terminate) after the specified period.
+     */
+    ExecutorBuilder<E> withKeepAlive(long keepAlive, TimeUnit keepAliveUnits);
+
+    /**
+     * Core threads for the executor built by this factory will never timeout (default for single threaded builders).
+     * Note that there is ordinarily no difference between core and non-core threads; only when the queue limit is zero
+     * do we create non-core threads.
+     */
+    ExecutorBuilder<E> withKeepAlive();
+
+    /**
+     * Specify the priority of threads that service the executor built by this factory (default to {@link Thread#NORM_PRIORITY})
+     */
+    ExecutorBuilder<E> withThreadPriority(int threadPriority);
+
+    /**
+     * Threads for the executor built by this factory will all be (transitively) members of {@code threadGroup},
+     * but may directly reside in a child thread group.
+     */
+    ExecutorBuilder<E> withThreadGroup(ThreadGroup threadGroup);
+
+    /**
+     * Use the system default thread group for the threads we create.
+     * This is used only for testing, so that we do not hold onto a transitive global reference to all threads.
+     */
+    @VisibleForTesting
+    ExecutorBuilder<E> withDefaultThreadGroup();
+
+    /**
+     * The executor built by this factory will limit the number of queued tasks; default is unlimited.
+     * Once the queue limit is reached and all threads are executing tasks will be rejected
+     * (see {@link #withRejectedExecutionHandler(RejectedExecutionHandler)})
+     */
+    ExecutorBuilder<E> withQueueLimit(int queueLimit);
+
+    /**
+     * Set the {@link RejectedExecutionHandler} for the executor built by this factory.
+     * By default this is executor-specific, either:
+     * <li> {@link ThreadPoolExecutorBase#blockingExecutionHandler}
+     * <li> {@link ScheduledThreadPoolExecutorPlus#rejectedExecutionHandler}
+     * <li> and maybe wrapped by {@link ThreadPoolExecutorJMXAdapter#rejectedExecutionHandler}
+     */
+    ExecutorBuilder<E> withRejectedExecutionHandler(RejectedExecutionHandler rejectedExecutionHandler);
+
+    /**
+     * Set the {@link UncaughtExceptionHandler} for threads that service executors built by this factory.
+     * By default {@link JVMStabilityInspector#uncaughtException(Thread, Throwable)}
+     */
+    ExecutorBuilder<E> withUncaughtExceptionHandler(UncaughtExceptionHandler uncaughtExceptionHandler);
+
+    /**
+     * Build the configured executor
+     */
+    E build();
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ExecutorBuilderFactory.java b/src/java/org/apache/cassandra/concurrent/ExecutorBuilderFactory.java
new file mode 100644
index 0000000..465226a
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ExecutorBuilderFactory.java
@@ -0,0 +1,87 @@
+/*
+ * 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.concurrent;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Entry point for configuring and creating new executors.
+ *
+ * Supports quick and easy construction of default-configured executors via
+ * <li>{@link #sequential(String)}
+ * <li>{@link #pooled(String, int)}
+ *
+ * Supports custom configuration of executors via
+ * <li>{@link #configureSequential(String)}
+ * <li>{@link #configurePooled(String, int)}
+ */
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface ExecutorBuilderFactory<E extends ExecutorPlus, S extends SequentialExecutorPlus>
+{
+    /**
+     * Configure a sequential (single threaded) executor
+     */
+    ExecutorBuilder<? extends S> configureSequential(String name);
+
+    /**
+     * Configure a pooled executor with the requested number of threads
+     */
+    ExecutorBuilder<? extends E> configurePooled(String name, int threads);
+
+    /**
+     * Return a default configuration of sequential executor
+     */
+    default S sequential(String name) { return configureSequential(name).build(); }
+
+    /**
+     * Return a default configuration of pooled executor
+     */
+    default E pooled(String name, int threads) { return configurePooled(name, threads).build(); }
+
+    /**
+     * Entry point for configuring and creating new executors.
+     *
+     * Supports quick and easy construction of default-configured executors via
+     * <li>{@link #sequential(String)}
+     * <li>{@link #pooled(String, int)}
+     *
+     * Supports custom configuration of executors via
+     * <li>{@link #configureSequential(String)}
+     * <li>{@link #configurePooled(String, int)}
+     *
+     * Supports any of the above with added JMX registration via sub-factories
+     * <li>{@link #withJmx(String)}
+     * <li>{@link #withJmxInternal()}
+     */
+    interface Jmxable<E extends ExecutorPlus, S extends SequentialExecutorPlus> extends ExecutorBuilderFactory<E, S>
+    {
+        /**
+         * @return a factory that configures executors that register against JMX using the provided jmx path
+         */
+        ExecutorBuilderFactory<E, S> withJmx(String jmxPath);
+
+        /**
+         * @return a factory that configures executors that register against JMX using the "internal" jmx path
+         */
+        default ExecutorBuilderFactory<E, S> withJmxInternal() { return withJmx("internal"); }
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ExecutorFactory.java b/src/java/org/apache/cassandra/concurrent/ExecutorFactory.java
new file mode 100644
index 0000000..0a62747
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ExecutorFactory.java
@@ -0,0 +1,316 @@
+/*
+ * 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.concurrent;
+
+import org.apache.cassandra.concurrent.InfiniteLoopExecutor.Daemon;
+import org.apache.cassandra.concurrent.InfiniteLoopExecutor.Interrupts;
+import org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe;
+import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.Shared;
+
+import static java.lang.Thread.*;
+import static org.apache.cassandra.concurrent.ExecutorFactory.SimulatorSemantics.NORMAL;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Daemon.DAEMON;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Interrupts.UNSYNCHRONIZED;
+import static org.apache.cassandra.concurrent.NamedThreadFactory.createThread;
+import static org.apache.cassandra.concurrent.NamedThreadFactory.setupThread;
+import static org.apache.cassandra.concurrent.ThreadPoolExecutorBuilder.pooledJmx;
+import static org.apache.cassandra.concurrent.ThreadPoolExecutorBuilder.sequentialJmx;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Entry point for configuring and creating new executors.
+ *
+ * Supports quick and easy construction of default-configured executors via
+ * <li>{@link #sequential(String)}
+ * <li>{@link #pooled(String, int)}
+ * <li>{@link #scheduled(String)}
+ * <li>{@link #scheduled(boolean, String)}
+ * <li>{@link #scheduled(boolean, String, int)}
+ *
+ * Supports custom configuration of executors via
+ * <li>{@link #configureSequential(String)}
+ * <li>{@link #configurePooled(String, int)}
+ *
+ * Supports any of the above with added JMX registration via sub-factories
+ * <li>{@link #withJmx(String)}
+ * <li>{@link #withJmxInternal()}
+ *
+ * Supports any of the above with the resultant executor propagating {@link ExecutorLocals} via sub-factory
+ * <li>{@link #localAware()}
+ *
+ * Supports shared executors via sub-factory {@code localAware().withJMX()}
+ * using {@link LocalAwareSubFactoryWithJMX#shared(String, int, ExecutorPlus.MaximumPoolSizeListener)}
+ */
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface ExecutorFactory extends ExecutorBuilderFactory.Jmxable<ExecutorPlus, SequentialExecutorPlus>
+{
+    public interface LocalAwareSubFactoryWithJMX extends ExecutorBuilderFactory<LocalAwareExecutorPlus, LocalAwareSequentialExecutorPlus>
+    {
+        LocalAwareExecutorPlus shared(String name, int threads, ExecutorPlus.MaximumPoolSizeListener onSetMaxSize);
+    }
+
+    public interface LocalAwareSubFactory extends ExecutorBuilderFactory<LocalAwareExecutorPlus, LocalAwareSequentialExecutorPlus>
+    {
+        LocalAwareSubFactoryWithJMX withJmx(String jmxPath);
+        default LocalAwareSubFactoryWithJMX withJmxInternal() { return withJmx("internal"); }
+    }
+
+    public enum SimulatorSemantics
+    {
+        NORMAL, DISCARD
+    }
+
+    /**
+     * @return a factory that configures executors that propagate {@link ExecutorLocals} to the executing thread
+     */
+    LocalAwareSubFactory localAware();
+
+    /**
+     * @param name the name of the executor, the executor's thread group, and of any worker threads
+     * @return a default-configured {@link ScheduledExecutorPlus}
+     */
+    default ScheduledExecutorPlus scheduled(String name) { return scheduled(true, name, NORM_PRIORITY); }
+
+    /**
+     * @param name the name of the executor, the executor's thread group, and of any worker threads
+     * @param simulatorSemantics indicate special semantics for the executor under simulation
+     * @return a default-configured {@link ScheduledExecutorPlus}
+     */
+    default ScheduledExecutorPlus scheduled(String name, SimulatorSemantics simulatorSemantics) { return scheduled(true, name, NORM_PRIORITY, simulatorSemantics); }
+
+    /**
+     * @param executeOnShutdown if false, waiting tasks will be cancelled on shutdown
+     * @param name the name of the executor, the executor's thread group, and of any worker threads
+     * @return a {@link ScheduledExecutorPlus} with normal thread priority
+     */
+    default ScheduledExecutorPlus scheduled(boolean executeOnShutdown, String name) { return scheduled(executeOnShutdown, name, NORM_PRIORITY); }
+
+    /**
+     * @param executeOnShutdown if false, waiting tasks will be cancelled on shutdown
+     * @param name the name of the executor, the executor's thread group, and of any worker threads
+     * @param priority the thread priority of workers
+     * @return a {@link ScheduledExecutorPlus}
+     */
+    default ScheduledExecutorPlus scheduled(boolean executeOnShutdown, String name, int priority) { return scheduled(executeOnShutdown, name, priority, NORMAL); }
+
+    /**
+     * @param executeOnShutdown if false, waiting tasks will be cancelled on shutdown
+     * @param name the name of the executor, the executor's thread group, and of any worker threads
+     * @param priority the thread priority of workers
+     * @param simulatorSemantics indicate special semantics for the executor under simulation
+     * @return a {@link ScheduledExecutorPlus}
+     */
+    ScheduledExecutorPlus scheduled(boolean executeOnShutdown, String name, int priority, SimulatorSemantics simulatorSemantics);
+
+    /**
+     * Create and start a new thread to execute {@code runnable}
+     * @param name the name of the thread
+     * @param runnable the task to execute
+     * @param daemon flag to indicate whether the thread should be a daemon or not
+     * @return the new thread
+     */
+    Thread startThread(String name, Runnable runnable, Daemon daemon);
+
+    /**
+     * Create and start a new thread to execute {@code runnable}; this thread will be a daemon thread.
+     * @param name the name of the thread
+     * @param runnable the task to execute
+     * @return the new thread
+     */
+    default Thread startThread(String name, Runnable runnable)
+    {
+        return startThread(name, runnable, DAEMON);
+    }
+
+    /**
+     * Create and start a new InfiniteLoopExecutor to repeatedly invoke {@code runnable}.
+     * On shutdown, the executing thread will be interrupted; to support clean shutdown
+     * {@code runnable} should propagate {@link InterruptedException}
+     *
+     * @param name the name of the thread used to invoke the task repeatedly
+     * @param task the task to execute repeatedly
+     * @param simulatorSafe flag indicating if the loop thread can be intercepted / rescheduled during cluster simulation
+     * @param daemon flag to indicate whether the loop thread should be a daemon thread or not
+     * @param interrupts flag to indicate whether to synchronize interrupts of the task execution thread
+     *                   using the task's monitor this can be used to prevent interruption while performing
+     *                   IO operations which forbid interrupted threads.
+     *                   See: {@link org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager::start}
+     * @return the new thread
+     */
+    Interruptible infiniteLoop(String name, Interruptible.Task task, SimulatorSafe simulatorSafe, Daemon daemon, Interrupts interrupts);
+
+    /**
+     * Create and start a new InfiniteLoopExecutor to repeatedly invoke {@code runnable}.
+     * On shutdown, the executing thread will be interrupted; to support clean shutdown
+     * {@code runnable} should propagate {@link InterruptedException}
+     *
+     * @param name the name of the thread used to invoke the task repeatedly
+     * @param task the task to execute repeatedly
+     * @param simulatorSafe flag indicating if the loop thread can be intercepted / rescheduled during cluster simulation
+     * @return the new thread
+     */
+    default Interruptible infiniteLoop(String name, Interruptible.SimpleTask task, SimulatorSafe simulatorSafe)
+    {
+        return infiniteLoop(name, Interruptible.Task.from(task), simulatorSafe, DAEMON, UNSYNCHRONIZED);
+    }
+
+    /**
+     * Create a new thread group for use with builders - this thread group will be situated within
+     * this factory's parent thread group, and may be supplied to multiple executor builders.
+     */
+    ThreadGroup newThreadGroup(String name);
+
+    public static final class Global
+    {
+        // deliberately not volatile to ensure zero overhead outside of testing;
+        // depend on other memory visibility primitives to ensure visibility
+        private static ExecutorFactory FACTORY = new ExecutorFactory.Default(Global.class.getClassLoader(), null, JVMStabilityInspector::uncaughtException);
+        private static boolean modified;
+
+        public static ExecutorFactory executorFactory()
+        {
+            return FACTORY;
+        }
+
+        public static synchronized void unsafeSet(ExecutorFactory executorFactory)
+        {
+            FACTORY = executorFactory;
+            modified = true;
+        }
+
+        public static synchronized boolean tryUnsafeSet(ExecutorFactory executorFactory)
+        {
+            if (modified)
+                return false;
+            unsafeSet(executorFactory);
+            return true;
+        }
+    }
+
+    public static final class Default extends NamedThreadFactory.MetaFactory implements ExecutorFactory
+    {
+        public Default(ClassLoader contextClassLoader, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler)
+        {
+            super(contextClassLoader, threadGroup, uncaughtExceptionHandler);
+        }
+
+        @Override
+        public LocalAwareSubFactory localAware()
+        {
+            return new LocalAwareSubFactory()
+            {
+                public ExecutorBuilder<? extends LocalAwareSequentialExecutorPlus> configureSequential(String name)
+                {
+                    return ThreadPoolExecutorBuilder.sequential(LocalAwareSingleThreadExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name);
+                }
+
+                public ExecutorBuilder<LocalAwareThreadPoolExecutorPlus> configurePooled(String name, int threads)
+                {
+                    return ThreadPoolExecutorBuilder.pooled(LocalAwareThreadPoolExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, threads);
+                }
+
+                public LocalAwareSubFactoryWithJMX withJmx(String jmxPath)
+                {
+                    return new LocalAwareSubFactoryWithJMX()
+                    {
+                        public ExecutorBuilder<LocalAwareSingleThreadExecutorPlus> configureSequential(String name)
+                        {
+                            return sequentialJmx(LocalAwareSingleThreadExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, jmxPath);
+                        }
+
+                        public ExecutorBuilder<LocalAwareThreadPoolExecutorPlus> configurePooled(String name, int threads)
+                        {
+                            return pooledJmx(LocalAwareThreadPoolExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, threads, jmxPath);
+                        }
+
+                        public LocalAwareExecutorPlus shared(String name, int threads, ExecutorPlus.MaximumPoolSizeListener onSetMaxSize)
+                        {
+                            return SharedExecutorPool.SHARED.newExecutor(threads, onSetMaxSize, jmxPath, name);
+                        }
+                    };
+                }
+            };
+        }
+
+        @Override
+        public ExecutorBuilderFactory<ExecutorPlus, SequentialExecutorPlus> withJmx(String jmxPath)
+        {
+            return new ExecutorBuilderFactory<ExecutorPlus, SequentialExecutorPlus>()
+            {
+                @Override
+                public ExecutorBuilder<? extends SequentialExecutorPlus> configureSequential(String name)
+                {
+                    return ThreadPoolExecutorBuilder.sequentialJmx(SingleThreadExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, jmxPath);
+                }
+
+                @Override
+                public ExecutorBuilder<? extends ExecutorPlus> configurePooled(String name, int threads)
+                {
+                    return ThreadPoolExecutorBuilder.pooledJmx(ThreadPoolExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, threads, jmxPath);
+                }
+            };
+        }
+
+        @Override
+        public ExecutorBuilder<SingleThreadExecutorPlus> configureSequential(String name)
+        {
+            return ThreadPoolExecutorBuilder.sequential(SingleThreadExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name);
+        }
+
+        @Override
+        public ExecutorBuilder<ThreadPoolExecutorPlus> configurePooled(String name, int threads)
+        {
+            return ThreadPoolExecutorBuilder.pooled(ThreadPoolExecutorPlus::new, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, threads);
+        }
+
+        @Override
+        public ScheduledExecutorPlus scheduled(boolean executeOnShutdown, String name, int priority, SimulatorSemantics simulatorSemantics)
+        {
+            ScheduledThreadPoolExecutorPlus executor = new ScheduledThreadPoolExecutorPlus(newThreadFactory(name, priority));
+            if (!executeOnShutdown)
+                executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
+            return executor;
+        }
+
+        @Override
+        public Thread startThread(String name, Runnable runnable, Daemon daemon)
+        {
+            Thread thread = setupThread(createThread(threadGroup, runnable, name, daemon == DAEMON),
+                                        Thread.NORM_PRIORITY,
+                                        contextClassLoader,
+                                        uncaughtExceptionHandler);
+            thread.start();
+            return thread;
+        }
+
+        @Override
+        public Interruptible infiniteLoop(String name, Interruptible.Task task, SimulatorSafe simulatorSafe, Daemon daemon, Interrupts interrupts)
+        {
+            return new InfiniteLoopExecutor(this, name, task, daemon, interrupts);
+        }
+
+        @Override
+        public ThreadGroup newThreadGroup(String name)
+        {
+            return threadGroup == null ? null : new ThreadGroup(threadGroup, name);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/concurrent/ExecutorLocal.java b/src/java/org/apache/cassandra/concurrent/ExecutorLocal.java
deleted file mode 100644
index 6577b3d..0000000
--- a/src/java/org/apache/cassandra/concurrent/ExecutorLocal.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.concurrent;
-
-import org.apache.cassandra.service.ClientWarn;
-import org.apache.cassandra.tracing.Tracing;
-
-public interface ExecutorLocal<T>
-{
-    ExecutorLocal[] all = { Tracing.instance, ClientWarn.instance };
-
-    /**
-     * This is called when scheduling the task, and also before calling {@link #set(Object)} when running on a
-     * executor thread.
-     *
-     * @return The thread-local value that we want to copy across executor boundaries; may be null if not set.
-     */
-    T get();
-
-    /**
-     * Before a task has been run, this will be called with the value from the thread that scheduled the task, and after
-     * the task is finished, the value that was previously retrieved from this thread is restored.
-     *
-     * @param value Value to use for the executor local state; may be null.
-     */
-    void set(T value);
-}
diff --git a/src/java/org/apache/cassandra/concurrent/ExecutorLocals.java b/src/java/org/apache/cassandra/concurrent/ExecutorLocals.java
index 8e6d6ea..4eeb2e5 100644
--- a/src/java/org/apache/cassandra/concurrent/ExecutorLocals.java
+++ b/src/java/org/apache/cassandra/concurrent/ExecutorLocals.java
@@ -18,11 +18,11 @@
 
 package org.apache.cassandra.concurrent;
 
-import java.util.Arrays;
-
+import io.netty.util.concurrent.FastThreadLocal;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.tracing.TraceState;
-import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.WithResources;
 
 /*
  * This class only knows about Tracing and ClientWarn, so if any different executor locals are added, it must be
@@ -30,55 +30,80 @@
  *
  * We don't enumerate the ExecutorLocal.all array each time because it would be much slower.
  */
-public class ExecutorLocals
+public class ExecutorLocals implements WithResources, Closeable
 {
-    private static final ExecutorLocal<TraceState> tracing = Tracing.instance;
-    private static final ExecutorLocal<ClientWarn.State> clientWarn = ClientWarn.instance;
+    private static final ExecutorLocals none = new ExecutorLocals(null, null);
+    private static final FastThreadLocal<ExecutorLocals> locals = new FastThreadLocal<ExecutorLocals>()
+    {
+        @Override
+        protected ExecutorLocals initialValue()
+        {
+            return none;
+        }
+    };
+
+    public static class Impl
+    {
+        @SuppressWarnings("resource")
+        protected static void set(TraceState traceState, ClientWarn.State clientWarnState)
+        {
+            if (traceState == null && clientWarnState == null) locals.set(none);
+            else locals.set(new ExecutorLocals(traceState, clientWarnState));
+        }
+    }
 
     public final TraceState traceState;
     public final ClientWarn.State clientWarnState;
 
-    private ExecutorLocals(TraceState traceState, ClientWarn.State clientWarnState)
+    protected ExecutorLocals(TraceState traceState, ClientWarn.State clientWarnState)
     {
         this.traceState = traceState;
         this.clientWarnState = clientWarnState;
     }
 
-    static
+    /**
+     * @return an ExecutorLocals object which has the current trace state and client warn state.
+     */
+    public static ExecutorLocals current()
     {
-        assert Arrays.equals(ExecutorLocal.all, new ExecutorLocal[]{ tracing, clientWarn })
-        : "ExecutorLocals has not been updated to reflect new ExecutorLocal.all";
+        return locals.get();
     }
 
     /**
-     * This creates a new ExecutorLocals object based on what is already set.
-     *
-     * @return an ExecutorLocals object which has the trace state and client warn state captured if either has been set,
-     *         or null if both are unset. The null result short-circuits logic in
-     *         {@link AbstractLocalAwareExecutorService#newTaskFor(Runnable, Object, ExecutorLocals)}, preventing
-     *         unnecessarily calling {@link ExecutorLocals#set(ExecutorLocals)}.
+     * The {@link #current}Locals, if any; otherwise {@link WithResources#none()}.
+     * Used to propagate current to other executors as a {@link WithResources}.
      */
-    public static ExecutorLocals create()
+    public static WithResources propagate()
     {
-        TraceState traceState = tracing.get();
-        ClientWarn.State clientWarnState = clientWarn.get();
-        if (traceState == null && clientWarnState == null)
-            return null;
-        else
-            return new ExecutorLocals(traceState, clientWarnState);
+        ExecutorLocals locals = current();
+        return locals == none ? WithResources.none() : locals;
     }
 
+    @SuppressWarnings("resource")
     public static ExecutorLocals create(TraceState traceState)
     {
-        ClientWarn.State clientWarnState = clientWarn.get();
-        return new ExecutorLocals(traceState, clientWarnState);
+        ExecutorLocals current = locals.get();
+        return current.traceState == traceState ? current : new ExecutorLocals(traceState, current.clientWarnState);
     }
 
-    public static void set(ExecutorLocals locals)
+    public static void clear()
     {
-        TraceState traceState = locals == null ? null : locals.traceState;
-        ClientWarn.State clientWarnState = locals == null ? null : locals.clientWarnState;
-        tracing.set(traceState);
-        clientWarn.set(clientWarnState);
+        locals.set(none);
+    }
+
+    /**
+     * Overwrite current locals, and return the previous ones
+     */
+    public Closeable get()
+    {
+        ExecutorLocals old = current();
+        if (old != this)
+            locals.set(this);
+        return old;
+    }
+
+    public void close()
+    {
+        locals.set(this);
     }
 }
diff --git a/src/java/org/apache/cassandra/concurrent/ExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/ExecutorPlus.java
new file mode 100644
index 0000000..1fca66f
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ExecutorPlus.java
@@ -0,0 +1,188 @@
+/*
+ * 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.concurrent;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Future;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Cassandra's extension of {@link ExecutorService}, using our own {@link Future}, supporting
+ * {@link #inExecutor()}, and execution with associated resources {@link #execute(WithResources, Runnable)}
+ * (which is primarily used for encapsulating {@link ExecutorLocals} without leaking implementing classes).
+ */
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface ExecutorPlus extends ExecutorService, ResizableThreadPool
+{
+    interface MaximumPoolSizeListener
+    {
+        /**
+         * Listener to follow changes to the maximum pool size
+         */
+        void onUpdateMaximumPoolSize(int maximumPoolSize);
+    }
+
+    /**
+     * MAY execute {@code task} immediately, if the calling thread is permitted to do so.
+     */
+    default void maybeExecuteImmediately(Runnable task)
+    {
+        execute(task);
+    }
+
+    /**
+     * Overrides {@link ExecutorService#submit(Callable)} to return a Cassandra {@link Future}
+     */
+    @Override
+    <T> Future<T> submit(Callable<T> task);
+
+    /**
+     * Overrides {@link ExecutorService#submit(Runnable, Object)} to return a Cassandra {@link Future}
+     */
+    @Override
+    <T> Future<T> submit(Runnable task, T result);
+
+    /**
+     * Overrides {@link ExecutorService#submit(Runnable)} to return a Cassandra {@link Future}
+     */
+    @Override
+    Future<?> submit(Runnable task);
+
+    /*
+     * ==============================================
+     * WithResources variants of submit and execute.
+     *
+     * (We need a way to inject a TraceState directly into the Executor context without going through
+     * the global Tracing sessions; see CASSANDRA-5668)
+     * ==============================================
+     */
+
+    /**
+     * Invoke {@code task}. The invoking thread will first instantiate the resources provided before
+     * invoking {@code task}, so that thread state may be modified and cleaned up.
+     *
+     * The invoking thread will execute something semantically equivlent to:
+     *
+     * <code>
+     *     try (Closeable close = withResources.get())
+     *     {
+     *         task.run();
+     *     }
+     * </code>
+     *
+     * @param withResources the resources to create and hold while executing {@code task}
+     * @param task the task to execute
+     */
+    void execute(WithResources withResources, Runnable task);
+
+    /**
+     * Invoke {@code task}, returning a future representing this computation.
+     * The invoking thread will first instantiate the resources provided before
+     * invoking {@code task}, so that thread state may be modified and cleaned up.
+     *
+     * The invoking thread will execute something semantically equivlent to:
+     *
+     * <code>
+     *     try (Closeable close = withResources.get())
+     *     {
+     *         return task.call();
+     *     }
+     * </code>
+     *
+     * @param withResources the resources to create and hold while executing {@code task}
+     * @param task the task to execute
+     */
+    <T> Future<T> submit(WithResources withResources, Callable<T> task);
+
+    /**
+     * Invoke {@code task}, returning a future yielding {@code null} if successful,
+     * or the abnormal termination of {@code task} otherwise.
+     *
+     * The invoking thread will first instantiate the resources provided before
+     * invoking {@code task}, so that thread state may be modified and cleaned up
+     *
+     * <code>
+     *     try (Closeable close = withResources.get())
+     *     {
+     *         task.run();
+     *         return null;
+     *     }
+     * </code>
+     *
+     * @param withResources the resources to create and hold while executing {@code task}
+     * @param task the task to execute
+     */
+    Future<?> submit(WithResources withResources, Runnable task);
+
+    /**
+     * Invoke {@code task}, returning a future yielding {@code result} if successful,
+     * or the abnormal termination of {@code task} otherwise.
+     *
+     * The invoking thread will first instantiate the resources provided before
+     * invoking {@code task}, so that thread state may be modified and cleaned up.
+     *
+     * The invoking thread will execute something semantically equivlent to:
+     *
+     * <code>
+     *     try (Closeable close = withResources.get())
+     *     {
+     *         task.run();
+     *         return result;
+     *     }
+     * </code>
+     *
+     * @param withResources the resources to create and hold while executing {@code task}
+     * @param task the task to execute
+     * @param result the result if successful
+     */
+    <T> Future<T> submit(WithResources withResources, Runnable task, T result);
+
+    /**
+     * @return true iff the caller is a worker thread actively serving this executor
+     */
+    boolean inExecutor();
+
+    default <T> List<java.util.concurrent.Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
+    {
+        throw new UnsupportedOperationException();
+    }
+    default <T> List<java.util.concurrent.Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
+    {
+        throw new UnsupportedOperationException();
+    }
+    default <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
+    {
+        throw new UnsupportedOperationException();
+    }
+    default <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
+    {
+        throw new UnsupportedOperationException();
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/FutureTask.java b/src/java/org/apache/cassandra/concurrent/FutureTask.java
new file mode 100644
index 0000000..2348ff6
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/FutureTask.java
@@ -0,0 +1,149 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.Callable;
+
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+
+/**
+ * A FutureTask that utilises Cassandra's {@link AsyncFuture}, making it compatible with {@link ExecutorPlus}.
+ * Propagates exceptions to the uncaught exception handler.
+ */
+public class FutureTask<V> extends AsyncFuture<V> implements RunnableFuture<V>
+{
+    private Callable<? extends V> call;
+
+    public FutureTask(Callable<? extends V> call)
+    {
+        this.call = call;
+    }
+
+    public FutureTask(Runnable run)
+    {
+        this.call = callable(run);
+    }
+
+    V call() throws Exception
+    {
+        return call.call();
+    }
+
+    public void run()
+    {
+        try
+        {
+            if (!setUncancellable())
+                return;
+
+            trySuccess(call());
+        }
+        catch (Throwable t)
+        {
+            tryFailure(t);
+        }
+        finally
+        {
+            call = null;
+        }
+    }
+
+    protected boolean tryFailure(Throwable t)
+    {
+        ExecutionFailure.handle(t);
+        return super.tryFailure(t);
+    }
+
+    public static <T> Callable<T> callable(Runnable run)
+    {
+        return new Callable<T>()
+        {
+            public T call()
+            {
+                run.run();
+                return null;
+            }
+
+            public String toString()
+            {
+                return run.toString();
+            }
+        };
+    }
+
+    public static <T> Callable<T> callable(Object id, Runnable run)
+    {
+        return new Callable<T>()
+        {
+            public T call()
+            {
+                run.run();
+                return null;
+            }
+
+            public String toString()
+            {
+                return id.toString();
+            }
+        };
+    }
+
+    public static <T> Callable<T> callable(Runnable run, T result)
+    {
+        return new Callable<T>()
+        {
+            public T call()
+            {
+                run.run();
+                return result;
+            }
+
+            public String toString()
+            {
+                return run + "->" + result;
+            }
+        };
+    }
+
+    public static <T> Callable<T> callable(Object id, Runnable run, T result)
+    {
+        return new Callable<T>()
+        {
+            public T call()
+            {
+                run.run();
+                return result;
+            }
+
+            public String toString()
+            {
+                return id.toString();
+            }
+        };
+    }
+
+    @Override
+    protected String description()
+    {
+        Object desc = call;
+        return desc == null ? null : call.toString();
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/FutureTaskWithResources.java b/src/java/org/apache/cassandra/concurrent/FutureTaskWithResources.java
new file mode 100644
index 0000000..78c4987
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/FutureTaskWithResources.java
@@ -0,0 +1,57 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.Callable;
+
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+
+/**
+ * A FutureTask that utilises Cassandra's {@link AsyncFuture}, making it compatible with {@link ExecutorPlus}.
+ * Encapsulates a {@link WithResources}; the call will instantiate the resources before executing,
+ * and close them after executing but before completing the task.
+ *
+ * Propagates exceptions to the uncaught exception handler.
+ */
+public class FutureTaskWithResources<V> extends FutureTask<V>
+{
+    private final WithResources withResources;
+
+    public FutureTaskWithResources(WithResources withResources, Callable<V> call)
+    {
+        super(call);
+        this.withResources = withResources;
+    }
+
+    public FutureTaskWithResources(WithResources withResources, Runnable task)
+    {
+        super(task);
+        this.withResources = withResources;
+    }
+
+    V call() throws Exception
+    {
+        try (Closeable ignore = withResources.get())
+        {
+            return super.call();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ImmediateExecutor.java b/src/java/org/apache/cassandra/concurrent/ImmediateExecutor.java
index 10c369c..5edc5be 100644
--- a/src/java/org/apache/cassandra/concurrent/ImmediateExecutor.java
+++ b/src/java/org/apache/cassandra/concurrent/ImmediateExecutor.java
@@ -18,30 +18,131 @@
 
 package org.apache.cassandra.concurrent;
 
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+
 import java.util.Collections;
 import java.util.List;
-import java.util.concurrent.AbstractExecutorService;
+import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 
-public class ImmediateExecutor extends AbstractExecutorService implements LocalAwareExecutorService
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION) // shared to support instanceof check in SimulatedAction
+public class ImmediateExecutor implements LocalAwareExecutorPlus
 {
     public static final ImmediateExecutor INSTANCE = new ImmediateExecutor();
 
     private ImmediateExecutor() {}
 
-    public void execute(Runnable command, ExecutorLocals locals)
+    public <T> Future<T> submit(Callable<T> task)
     {
-        command.run();
+        try
+        {
+            return ImmediateFuture.success(task.call());
+        }
+        catch (Throwable t)
+        {
+            ExecutionFailure.handle(t);
+            return ImmediateFuture.failure(t);
+        }
     }
 
-    public void maybeExecuteImmediately(Runnable command)
+    public <T> Future<T> submit(Runnable task, T result)
     {
-        command.run();
+        try
+        {
+            task.run();
+            return ImmediateFuture.success(result);
+        }
+        catch (Throwable t)
+        {
+            ExecutionFailure.handle(t);
+            return ImmediateFuture.failure(t);
+        }
     }
 
-    public void execute(Runnable command)
+    public Future<?> submit(Runnable task)
     {
-        command.run();
+        try
+        {
+            task.run();
+            return ImmediateFuture.success(null);
+        }
+        catch (Throwable t)
+        {
+            ExecutionFailure.handle(t);
+            return ImmediateFuture.failure(t);
+        }
+    }
+
+    @Override
+    public void execute(WithResources withResources, Runnable task)
+    {
+        try (Closeable ignored = withResources.get())
+        {
+            task.run();
+        }
+        catch (Throwable t)
+        {
+            ExecutionFailure.handle(t);
+        }
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Callable<T> task)
+    {
+        try (Closeable ignored = withResources.get())
+        {
+            return ImmediateFuture.success(task.call());
+        }
+        catch (Throwable t)
+        {
+            ExecutionFailure.handle(t);
+            return ImmediateFuture.failure(t);
+        }
+    }
+
+    @Override
+    public Future<?> submit(WithResources withResources, Runnable task)
+    {
+        return submit(withResources, task, null);
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Runnable task, T result)
+    {
+        try (Closeable ignored = withResources.get())
+        {
+            task.run();
+            return ImmediateFuture.success(result);
+        }
+        catch (Throwable t)
+        {
+            ExecutionFailure.handle(t);
+            return ImmediateFuture.failure(t);
+        }
+    }
+
+    @Override
+    public boolean inExecutor()
+    {
+        return true;
+    }
+
+    public void execute(Runnable task)
+    {
+        try
+        {
+            task.run();
+        }
+        catch (Throwable t)
+        {
+            ExecutionFailure.handle(t);
+        }
     }
 
     public int  getActiveTaskCount()    { return 0; }
diff --git a/src/java/org/apache/cassandra/concurrent/InfiniteLoopExecutor.java b/src/java/org/apache/cassandra/concurrent/InfiniteLoopExecutor.java
index 8e72d91..51c5f9f 100644
--- a/src/java/org/apache/cassandra/concurrent/InfiniteLoopExecutor.java
+++ b/src/java/org/apache/cassandra/concurrent/InfiniteLoopExecutor.java
@@ -24,64 +24,158 @@
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.annotations.VisibleForTesting;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
 
-public class InfiniteLoopExecutor
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.InternalState.SHUTTING_DOWN_NOW;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.InternalState.TERMINATED;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Interrupts.SYNCHRONIZED;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Interrupts.UNSYNCHRONIZED;
+import static org.apache.cassandra.concurrent.Interruptible.State.INTERRUPTED;
+import static org.apache.cassandra.concurrent.Interruptible.State.NORMAL;
+import static org.apache.cassandra.concurrent.Interruptible.State.SHUTTING_DOWN;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+
+public class InfiniteLoopExecutor implements Interruptible
 {
     private static final Logger logger = LoggerFactory.getLogger(InfiniteLoopExecutor.class);
 
-    public interface InterruptibleRunnable
-    {
-        void run() throws InterruptedException;
-    }
+    @Shared(scope = Shared.Scope.SIMULATION)
+    public enum InternalState { SHUTTING_DOWN_NOW, TERMINATED }
 
+    @Shared(scope = Shared.Scope.SIMULATION)
+    public enum SimulatorSafe { SAFE, UNSAFE }
+
+    @Shared(scope = Shared.Scope.SIMULATION)
+    public enum Daemon        { DAEMON, NON_DAEMON }
+
+    @Shared(scope = Shared.Scope.SIMULATION)
+    public enum Interrupts    { SYNCHRONIZED, UNSYNCHRONIZED }
+
+    private static final AtomicReferenceFieldUpdater<InfiniteLoopExecutor, Object> stateUpdater = AtomicReferenceFieldUpdater.newUpdater(InfiniteLoopExecutor.class, Object.class, "state");
     private final Thread thread;
-    private final InterruptibleRunnable runnable;
-    private volatile boolean isShutdown = false;
+    private final Task task;
+    private volatile Object state = NORMAL;
+    private final Consumer<Thread> interruptHandler;
+    private final Condition isTerminated = newOneTimeCondition();
 
-    public InfiniteLoopExecutor(String name, InterruptibleRunnable runnable)
+    public InfiniteLoopExecutor(String name, Task task, Daemon daemon)
     {
-        this.runnable = runnable;
-        this.thread = new Thread(this::loop, name);
-        this.thread.setDaemon(true);
+        this(ExecutorFactory.Global.executorFactory(), name, task, daemon, UNSYNCHRONIZED);
     }
 
+    public InfiniteLoopExecutor(ExecutorFactory factory, String name, Task task, Daemon daemon)
+    {
+        this(factory, name, task, daemon, UNSYNCHRONIZED);
+    }
+
+    public InfiniteLoopExecutor(ExecutorFactory factory, String name, Task task, Daemon daemon, Interrupts interrupts)
+    {
+        this.task = task;
+        this.thread = factory.startThread(name, this::loop, daemon);
+        this.interruptHandler = interrupts == SYNCHRONIZED
+                                ? interruptHandler(task)
+                                : Thread::interrupt;
+    }
+
+    public InfiniteLoopExecutor(BiFunction<String, Runnable, Thread> threadStarter, String name, Task task, Interrupts interrupts)
+    {
+        this.task = task;
+        this.thread = threadStarter.apply(name, this::loop);
+        this.interruptHandler = interrupts == SYNCHRONIZED
+                                ? interruptHandler(task)
+                                : Thread::interrupt;
+    }
+
+    private static Consumer<Thread> interruptHandler(final Object monitor)
+    {
+        return thread -> {
+            synchronized (monitor)
+            {
+                thread.interrupt();
+            }
+        };
+    }
+
+
     private void loop()
     {
-        while (!isShutdown)
+        boolean interrupted = false;
+        try
         {
-            try
+            while (true)
             {
-                runnable.run();
+                try
+                {
+                    Object cur = state;
+                    if (cur == SHUTTING_DOWN_NOW) break;
+
+                    interrupted |= Thread.interrupted();
+                    if (cur == NORMAL && interrupted) cur = INTERRUPTED;
+                    task.run((State) cur);
+
+                    interrupted = false;
+                    if (cur == SHUTTING_DOWN) break;
+                }
+                catch (TerminateException ignore)
+                {
+                    break;
+                }
+                catch (UncheckedInterruptedException | InterruptedException ignore)
+                {
+                    interrupted = true;
+                }
+                catch (Throwable t)
+                {
+                    logger.error("Exception thrown by runnable, continuing with loop", t);
+                }
             }
-            catch (InterruptedException ie)
-            {
-                if (isShutdown)
-                    return;
-                logger.error("Interrupted while executing {}, but not shutdown; continuing with loop", runnable, ie);
-            }
-            catch (Throwable t)
-            {
-                logger.error("Exception thrown by runnable, continuing with loop", t);
-            }
+        }
+        finally
+        {
+            state = TERMINATED;
+            isTerminated.signal();
         }
     }
 
-    public InfiniteLoopExecutor start()
+    public void interrupt()
     {
-        thread.start();
-        return this;
+        interruptHandler.accept(thread);
     }
 
-    public void shutdownNow()
+    public void shutdown()
     {
-        isShutdown = true;
-        thread.interrupt();
+        stateUpdater.updateAndGet(this, cur -> cur != TERMINATED && cur != SHUTTING_DOWN_NOW ? SHUTTING_DOWN : cur);
+        interruptHandler.accept(thread);
+    }
+
+    public Object shutdownNow()
+    {
+        stateUpdater.updateAndGet(this, cur -> cur != TERMINATED ? SHUTTING_DOWN_NOW : TERMINATED);
+        interruptHandler.accept(thread);
+        return null;
+    }
+
+    @Override
+    public boolean isTerminated()
+    {
+        return state == TERMINATED;
     }
 
     public boolean awaitTermination(long time, TimeUnit unit) throws InterruptedException
     {
-        thread.join(unit.toMillis(time));
-        return !thread.isAlive();
+        if (isTerminated())
+            return true;
+
+        long deadlineNanos = nanoTime() + unit.toNanos(time);
+        isTerminated.awaitUntil(deadlineNanos);
+        return isTerminated();
     }
 
     @VisibleForTesting
diff --git a/src/java/org/apache/cassandra/concurrent/Interruptible.java b/src/java/org/apache/cassandra/concurrent/Interruptible.java
new file mode 100644
index 0000000..8641ec8
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/Interruptible.java
@@ -0,0 +1,54 @@
+/*
+ * 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.concurrent;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.concurrent.Interruptible.State.*;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface Interruptible extends Shutdownable
+{
+    public enum State { NORMAL, INTERRUPTED, SHUTTING_DOWN }
+
+    public static class TerminateException extends InterruptedException {}
+
+    public interface Task
+    {
+        void run(State state) throws InterruptedException;
+
+        static Task from(SimpleTask simpleTask)
+        {
+            return state -> { if (state == NORMAL) simpleTask.run(); };
+        }
+    }
+
+    /**
+     * A Task that only runs on NORMAL states
+     */
+    public interface SimpleTask
+    {
+        void run() throws InterruptedException;
+    }
+
+    void interrupt();
+}
+
diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledSingleThreadExecutor.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledSingleThreadExecutor.java
deleted file mode 100644
index ed54b3e..0000000
--- a/src/java/org/apache/cassandra/concurrent/JMXEnabledSingleThreadExecutor.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.concurrent;
-
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeUnit;
-
-public class JMXEnabledSingleThreadExecutor extends JMXEnabledThreadPoolExecutor
-{
-    public JMXEnabledSingleThreadExecutor(String threadPoolName, String jmxPath)
-    {
-        super(1, Integer.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new SingleThreadFactory(threadPoolName), jmxPath);
-    }
-
-    @Override
-    public void setCoreThreads(int number)
-    {
-        throw new UnsupportedOperationException("Cannot change core pool size for single threaded executor.");
-    }
-
-    @Override
-    public void setMaximumThreads(int number)
-    {
-        throw new UnsupportedOperationException("Cannot change max threads for single threaded executor.");
-    }
-
-    @Override
-    public void setMaximumPoolSize(int newMaximumPoolSize)
-    {
-        setMaximumThreads(newMaximumPoolSize);
-    }
-
-    public boolean isExecutedBy(Thread test)
-    {
-        return getThreadFactory().thread == test;
-    }
-
-    public SingleThreadFactory getThreadFactory()
-    {
-        return (SingleThreadFactory) super.getThreadFactory();
-    }
-
-    public void setThreadFactory(ThreadFactory threadFactory)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    private static class SingleThreadFactory extends NamedThreadFactory
-    {
-        private volatile Thread thread;
-        SingleThreadFactory(String id)
-        {
-            super(id);
-        }
-
-        @Override
-        public Thread newThread(Runnable r)
-        {
-            Thread thread = super.newThread(r);
-            this.thread = thread;
-            return thread;
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java
deleted file mode 100644
index 4283d4f..0000000
--- a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutor.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.concurrent;
-
-import java.util.List;
-import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionHandler;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.cassandra.metrics.ThreadPoolMetrics;
-import org.apache.cassandra.utils.MBeanWrapper;
-
-/**
- * This is a wrapper class for the <i>ScheduledThreadPoolExecutor</i>. It provides an implementation
- * for the <i>afterExecute()</i> found in the <i>ThreadPoolExecutor</i> class to log any unexpected
- * Runtime Exceptions.
- */
-
-public class JMXEnabledThreadPoolExecutor extends DebuggableThreadPoolExecutor implements JMXEnabledThreadPoolExecutorMBean
-{
-    private final String mbeanName;
-    public final ThreadPoolMetrics metrics;
-
-    public JMXEnabledThreadPoolExecutor(String threadPoolName)
-    {
-        this(1, Integer.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory(threadPoolName), "internal");
-    }
-
-    public JMXEnabledThreadPoolExecutor(String threadPoolName, String jmxPath)
-    {
-        this(1, Integer.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory(threadPoolName), jmxPath);
-    }
-
-    public JMXEnabledThreadPoolExecutor(String threadPoolName, int priority)
-    {
-        this(1, Integer.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), new NamedThreadFactory(threadPoolName, priority), "internal");
-    }
-
-    public JMXEnabledThreadPoolExecutor(NamedThreadFactory threadFactory, String jmxPath)
-    {
-        this(1, Integer.MAX_VALUE, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory, jmxPath);
-    }
-
-    public JMXEnabledThreadPoolExecutor(int corePoolSize,
-            long keepAliveTime,
-            TimeUnit unit,
-            BlockingQueue<Runnable> workQueue,
-            NamedThreadFactory threadFactory,
-            String jmxPath)
-    {
-        this(corePoolSize, corePoolSize, keepAliveTime, unit, workQueue, threadFactory, jmxPath);
-    }
-
-    public JMXEnabledThreadPoolExecutor(int corePoolSize,
-                                        int maxPoolSize,
-                                        long keepAliveTime,
-                                        TimeUnit unit,
-                                        BlockingQueue<Runnable> workQueue,
-                                        NamedThreadFactory threadFactory,
-                                        String jmxPath)
-    {
-        super(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, threadFactory);
-        super.prestartAllCoreThreads();
-        metrics = new ThreadPoolMetrics(this, jmxPath, threadFactory.id).register();
-
-        mbeanName = "org.apache.cassandra." + jmxPath + ":type=" + threadFactory.id;
-        MBeanWrapper.instance.registerMBean(this, mbeanName);
-    }
-
-    public JMXEnabledThreadPoolExecutor(int corePoolSize,
-                                        int maxPoolSize,
-                                        long keepAliveTime,
-                                        TimeUnit unit,
-                                        BlockingQueue<Runnable> workQueue,
-                                        NamedThreadFactory threadFactory,
-                                        String jmxPath,
-                                        RejectedExecutionHandler rejectedExecutionHandler)
-    {
-        this(corePoolSize, maxPoolSize, keepAliveTime, unit, workQueue, threadFactory, jmxPath);
-        setRejectedExecutionHandler(rejectedExecutionHandler);
-    }
-
-    private void unregisterMBean()
-    {
-        MBeanWrapper.instance.unregisterMBean(mbeanName);
-
-        // release metrics
-        metrics.release();
-    }
-
-    @Override
-    public synchronized void shutdown()
-    {
-        // synchronized, because there is no way to access super.mainLock, which would be
-        // the preferred way to make this threadsafe
-        if (!isShutdown())
-        {
-            unregisterMBean();
-        }
-        super.shutdown();
-    }
-
-    @Override
-    public synchronized List<Runnable> shutdownNow()
-    {
-        // synchronized, because there is no way to access super.mainLock, which would be
-        // the preferred way to make this threadsafe
-        if (!isShutdown())
-        {
-            unregisterMBean();
-        }
-        return super.shutdownNow();
-    }
-
-    public int getTotalBlockedTasks()
-    {
-        return (int) metrics.totalBlocked.getCount();
-    }
-
-    public int getCurrentlyBlockedTasks()
-    {
-        return (int) metrics.currentBlocked.getCount();
-    }
-
-    @Deprecated
-    public int getCoreThreads()
-    {
-        return getCorePoolSize();
-    }
-
-    @Deprecated
-    public void setCoreThreads(int number)
-    {
-        setCorePoolSize(number);
-    }
-
-    @Deprecated
-    public int getMaximumThreads()
-    {
-        return getMaximumPoolSize();
-    }
-
-    @Deprecated
-    public void setMaximumThreads(int number)
-    {
-        setMaximumPoolSize(number);
-    }
-
-    @Override
-    public void setMaximumPoolSize(int newMaximumPoolSize)
-    {
-        if (newMaximumPoolSize < getCorePoolSize())
-            throw new IllegalArgumentException("maximum pool size cannot be less than core pool size");
-        super.setMaximumPoolSize(newMaximumPoolSize);
-    }
-
-    @Override
-    protected void onInitialRejection(Runnable task)
-    {
-        metrics.totalBlocked.inc();
-        metrics.currentBlocked.inc();
-    }
-
-    @Override
-    protected void onFinalAccept(Runnable task)
-    {
-        metrics.currentBlocked.dec();
-    }
-
-    @Override
-    protected void onFinalRejection(Runnable task)
-    {
-        metrics.currentBlocked.dec();
-    }
-}
diff --git a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutorMBean.java b/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutorMBean.java
deleted file mode 100644
index c2959df..0000000
--- a/src/java/org/apache/cassandra/concurrent/JMXEnabledThreadPoolExecutorMBean.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.concurrent;
-
-public interface JMXEnabledThreadPoolExecutorMBean extends ResizableThreadPool
-{
-    /**
-     * Returns core pool size of thread pool.
-     * Deprecated, use getCorePoolSize instead.
-     */
-    @Deprecated
-    public int getCoreThreads();
-
-    /**
-     * Allows user to resize core pool size of the thread pool.
-     * Deprecated, use setCorePoolSize instead.
-     */
-    @Deprecated
-    public void setCoreThreads(int number);
-
-    /**
-     * Returns maximum pool size of thread pool.
-     * Deprecated, use getMaximumThreads instead.
-     */
-    @Deprecated
-    public int getMaximumThreads();
-
-    /**
-     * Allows user to resize maximum size of the thread pool.
-     * Deprecated, use setMaximumThreads instead.
-     */
-    @Deprecated
-    public void setMaximumThreads(int number);
-}
diff --git a/src/java/org/apache/cassandra/concurrent/LocalAwareExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/LocalAwareExecutorPlus.java
new file mode 100644
index 0000000..743cacc
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/LocalAwareExecutorPlus.java
@@ -0,0 +1,31 @@
+/*
+ * 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.concurrent;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * An {@link ExecutorPlus} that is aware of, and propagates to execution, any ExecutorLocals
+ */
+@Shared(scope = SIMULATION)
+public interface LocalAwareExecutorPlus extends ExecutorPlus
+{
+}
diff --git a/src/java/org/apache/cassandra/concurrent/LocalAwareExecutorService.java b/src/java/org/apache/cassandra/concurrent/LocalAwareExecutorService.java
deleted file mode 100644
index d6ac8e4..0000000
--- a/src/java/org/apache/cassandra/concurrent/LocalAwareExecutorService.java
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- *
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- *
- */
-
-package org.apache.cassandra.concurrent;
-
-import java.util.concurrent.ExecutorService;
-
-public interface LocalAwareExecutorService extends ExecutorService, ResizableThreadPool
-{
-    // we need a way to inject a TraceState directly into the Executor context without going through
-    // the global Tracing sessions; see CASSANDRA-5668
-    void execute(Runnable command, ExecutorLocals locals);
-
-    // permits executing in the context of the submitting thread
-    void maybeExecuteImmediately(Runnable command);
-
-    /**
-     * Returns the approximate number of threads that are actively
-     * executing tasks.
-     *
-     * @return the number of threads
-     */
-    int getActiveTaskCount();
-
-    /**
-     * Returns the approximate total number of tasks that have
-     * completed execution. Because the states of tasks and threads
-     * may change dynamically during computation, the returned value
-     * is only an approximation, but one that does not ever decrease
-     * across successive calls.
-     *
-     * @return the number of tasks
-     */
-    long getCompletedTaskCount();
-
-    /**
-     * Returns the approximate total of tasks waiting to be executed.
-     * Because the states of tasks and threads
-     * may change dynamically during computation, the returned value
-     * is only an approximation, but one that does not ever decrease
-     * across successive calls.
-     *
-     * @return the number of tasks
-     */
-    int getPendingTaskCount();
-
-    default int getMaxTasksQueued()
-    {
-        return -1;
-    }
-
-    interface MaximumPoolSizeListener
-    {
-        /**
-         * Listener to follow changes to the maximum pool size
-         */
-        void onUpdateMaximumPoolSize(int maximumPoolSize);
-    }
-}
diff --git a/src/java/org/apache/cassandra/concurrent/LocalAwareSequentialExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/LocalAwareSequentialExecutorPlus.java
new file mode 100644
index 0000000..99e44b0
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/LocalAwareSequentialExecutorPlus.java
@@ -0,0 +1,31 @@
+/*
+ * 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.concurrent;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A {@link SequentialExecutorPlus} that is aware of, and propagates to execution, any ExecutorLocals
+ */
+@Shared(scope = SIMULATION)
+public interface LocalAwareSequentialExecutorPlus extends LocalAwareExecutorPlus, SequentialExecutorPlus
+{
+}
diff --git a/src/java/org/apache/cassandra/concurrent/LocalAwareSingleThreadExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/LocalAwareSingleThreadExecutorPlus.java
new file mode 100644
index 0000000..cf67c1a
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/LocalAwareSingleThreadExecutorPlus.java
@@ -0,0 +1,26 @@
+/*
+ * 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.concurrent;
+
+public class LocalAwareSingleThreadExecutorPlus extends SingleThreadExecutorPlus implements LocalAwareSequentialExecutorPlus
+{
+    LocalAwareSingleThreadExecutorPlus(ThreadPoolExecutorBuilder<LocalAwareSingleThreadExecutorPlus> builder)
+    {
+        super(builder, TaskFactory.localAware());
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/LocalAwareThreadPoolExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/LocalAwareThreadPoolExecutorPlus.java
new file mode 100644
index 0000000..10d107e
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/LocalAwareThreadPoolExecutorPlus.java
@@ -0,0 +1,26 @@
+/*
+ * 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.concurrent;
+
+public class LocalAwareThreadPoolExecutorPlus extends ThreadPoolExecutorPlus implements LocalAwareExecutorPlus
+{
+    LocalAwareThreadPoolExecutorPlus(ThreadPoolExecutorBuilder<? extends LocalAwareThreadPoolExecutorPlus> builder)
+    {
+        super(builder, TaskFactory.localAware());
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java b/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java
index bcf686f..9816649 100644
--- a/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java
+++ b/src/java/org/apache/cassandra/concurrent/NamedThreadFactory.java
@@ -22,9 +22,8 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
-import io.netty.util.concurrent.FastThreadLocal;
 import io.netty.util.concurrent.FastThreadLocalThread;
-import org.apache.cassandra.utils.memory.BufferPool;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 
 /**
  * This class is an implementation of the <i>ThreadFactory</i> interface. This
@@ -34,18 +33,49 @@
 
 public class NamedThreadFactory implements ThreadFactory
 {
+    private static final AtomicInteger anonymousCounter = new AtomicInteger();
     private static volatile String globalPrefix;
+
     public static void setGlobalPrefix(String prefix) { globalPrefix = prefix; }
-    public static String globalPrefix() {
+    public static String globalPrefix()
+    {
         String prefix = globalPrefix;
         return prefix == null ? "" : prefix;
     }
 
+    public static class MetaFactory
+    {
+        protected ClassLoader contextClassLoader;
+        protected ThreadGroup threadGroup;
+        protected Thread.UncaughtExceptionHandler uncaughtExceptionHandler;
+
+        public MetaFactory(ClassLoader contextClassLoader, ThreadGroup threadGroup, Thread.UncaughtExceptionHandler uncaughtExceptionHandler)
+        {
+            this.contextClassLoader = contextClassLoader;
+            if (threadGroup == null)
+            {
+                threadGroup = Thread.currentThread().getThreadGroup();
+                while (threadGroup.getParent() != null)
+                    threadGroup = threadGroup.getParent();
+            }
+            this.threadGroup = threadGroup;
+            this.uncaughtExceptionHandler = uncaughtExceptionHandler;
+        }
+
+        NamedThreadFactory newThreadFactory(String name, int threadPriority)
+        {
+            // We create a unique thread group for each factory, so that e.g. executors can determine which threads are members of the executor
+            ThreadGroup threadGroup = this.threadGroup == null ? null : new ThreadGroup(this.threadGroup, name);
+            return new NamedThreadFactory(name, threadPriority, contextClassLoader, threadGroup, uncaughtExceptionHandler);
+        }
+    }
+
     public final String id;
     private final int priority;
     private final ClassLoader contextClassLoader;
-    private final ThreadGroup threadGroup;
+    public final ThreadGroup threadGroup;
     protected final AtomicInteger n = new AtomicInteger(1);
+    private final Thread.UncaughtExceptionHandler uncaughtExceptionHandler;
 
     public NamedThreadFactory(String id)
     {
@@ -54,33 +84,61 @@
 
     public NamedThreadFactory(String id, int priority)
     {
-        this(id, priority, null, null);
+        this(id, priority, null, null, JVMStabilityInspector::uncaughtException);
+    }
+
+    public NamedThreadFactory(String id, ClassLoader contextClassLoader, ThreadGroup threadGroup)
+    {
+        this(id, Thread.NORM_PRIORITY, contextClassLoader, threadGroup, JVMStabilityInspector::uncaughtException);
     }
 
     public NamedThreadFactory(String id, int priority, ClassLoader contextClassLoader, ThreadGroup threadGroup)
     {
+        this(id, priority, contextClassLoader, threadGroup, JVMStabilityInspector::uncaughtException);
+    }
+
+    public NamedThreadFactory(String id, int priority, ClassLoader contextClassLoader, ThreadGroup threadGroup, Thread.UncaughtExceptionHandler uncaughtExceptionHandler)
+    {
         this.id = id;
         this.priority = priority;
         this.contextClassLoader = contextClassLoader;
         this.threadGroup = threadGroup;
+        this.uncaughtExceptionHandler = uncaughtExceptionHandler;
     }
 
+    @Override
     public Thread newThread(Runnable runnable)
     {
         String name = id + ':' + n.getAndIncrement();
-        Thread thread = createThread(threadGroup, runnable, name, true);
+        return newThread(threadGroup, runnable, name);
+    }
+
+    protected Thread newThread(ThreadGroup threadGroup, Runnable runnable, String name)
+    {
+        return setupThread(createThread(threadGroup, runnable, name, true));
+    }
+
+    protected <T extends Thread> T setupThread(T thread)
+    {
+        return setupThread(thread, priority, contextClassLoader, uncaughtExceptionHandler);
+    }
+
+    public static Thread createThread(ThreadGroup threadGroup, Runnable runnable, String name, int priority, ClassLoader contextClassLoader, Thread.UncaughtExceptionHandler uncaughtExceptionHandler)
+    {
+        String prefix = globalPrefix;
+        Thread thread = createThread(threadGroup, runnable, prefix != null ? prefix + name : name, true);
         thread.setPriority(priority);
         if (contextClassLoader != null)
             thread.setContextClassLoader(contextClassLoader);
+        if (uncaughtExceptionHandler != null)
+            thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);
         return thread;
     }
 
-    private static final AtomicInteger threadCounter = new AtomicInteger();
-
     @VisibleForTesting
-    public static Thread createThread(Runnable runnable)
+    public static Thread createAnonymousThread(Runnable runnable)
     {
-        return createThread(null, runnable, "anonymous-" + threadCounter.incrementAndGet());
+        return createThread(null, runnable, "anonymous-" + anonymousCounter.incrementAndGet());
     }
 
     public static Thread createThread(Runnable runnable, String name)
@@ -88,7 +146,7 @@
         return createThread(null, runnable, name);
     }
 
-    public static Thread createThread(Runnable runnable, String name, boolean daemon)
+    public Thread createThread(Runnable runnable, String name, boolean daemon)
     {
         return createThread(null, runnable, name, daemon);
     }
@@ -105,4 +163,37 @@
         thread.setDaemon(daemon);
         return thread;
     }
+
+    public static  <T extends Thread> T setupThread(T thread, int priority, ClassLoader contextClassLoader, Thread.UncaughtExceptionHandler uncaughtExceptionHandler)
+    {
+        thread.setPriority(priority);
+        if (contextClassLoader != null)
+            thread.setContextClassLoader(contextClassLoader);
+        if (uncaughtExceptionHandler != null)
+            thread.setUncaughtExceptionHandler(uncaughtExceptionHandler);
+        return thread;
+    }
+
+    @Override
+    public String toString()
+    {
+        return threadGroup != null ? id + " in " + threadGroup.getName() : id;
+    }
+
+    public void close()
+    {
+        synchronized (threadGroup)
+        {
+            threadGroup.setDaemon(true);
+            // ThreadGroup API is terrible; setDaemon does not destroy if already empty, and establishing if empty
+            // otherwise is tortuous - easier to just try to destroy and fail if currently an invalid action
+            try
+            {
+                threadGroup.destroy();
+            }
+            catch (IllegalThreadStateException ignore)
+            {
+            }
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/concurrent/ResizableThreadPool.java b/src/java/org/apache/cassandra/concurrent/ResizableThreadPool.java
index bd3b8ea..9c1dba6 100644
--- a/src/java/org/apache/cassandra/concurrent/ResizableThreadPool.java
+++ b/src/java/org/apache/cassandra/concurrent/ResizableThreadPool.java
@@ -18,15 +18,22 @@
 
 package org.apache.cassandra.concurrent;
 
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
 public interface ResizableThreadPool
 {
     /**
-     * Returns maximum pool size of thread pool.
+     * Returns core pool size of thread pool, the minimum
+     * number of workers (where that makes sense for a thread pool,
+     * SEPExecutor does not have a minimum size).
      */
     public int getCorePoolSize();
 
     /**
-     * Allows user to resize maximum size of the thread pool.
+     * Allows user to resize minimum size of the thread pool.
      */
     public void setCorePoolSize(int newCorePoolSize);
 
@@ -39,4 +46,37 @@
      * Allows user to resize maximum size of the thread pool.
      */
     public void setMaximumPoolSize(int newMaximumPoolSize);
+
+    /**
+     * Returns the approximate number of threads that are actively
+     * executing tasks.
+     *
+     * @return the number of threads
+     */
+    int getActiveTaskCount();
+
+    /**
+     * Returns the approximate total number of tasks that have
+     * completed execution. Because the states of tasks and threads
+     * may change dynamically during computation, the returned value
+     * is only an approximation, but one that does not ever decrease
+     * across successive calls.
+     *
+     * @return the number of tasks
+     */
+    long getCompletedTaskCount();
+
+    /**
+     * Returns the approximate total of tasks waiting to be executed.
+     * Because the states of tasks and threads may change dynamically
+     * during computation, the returned value is only an approximation.
+     *
+     * @return the number of tasks
+     */
+    int getPendingTaskCount();
+
+    default int getMaxTasksQueued()
+    {
+        return -1;
+    }
 }
diff --git a/src/java/org/apache/cassandra/concurrent/ResizableThreadPoolMXBean.java b/src/java/org/apache/cassandra/concurrent/ResizableThreadPoolMXBean.java
new file mode 100644
index 0000000..1c247d6
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ResizableThreadPoolMXBean.java
@@ -0,0 +1,49 @@
+/*
+ * 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.concurrent;
+
+public interface ResizableThreadPoolMXBean extends ResizableThreadPool
+{
+    /**
+     * Returns core pool size of thread pool.
+     * Deprecated, use getCorePoolSize instead.
+     */
+    @Deprecated
+    public int getCoreThreads();
+
+    /**
+     * Allows user to resize core pool size of the thread pool.
+     * Deprecated, use setCorePoolSize instead.
+     */
+    @Deprecated
+    public void setCoreThreads(int number);
+
+    /**
+     * Returns maximum pool size of thread pool.
+     * Deprecated, use getMaximumThreads instead.
+     */
+    @Deprecated
+    public int getMaximumThreads();
+
+    /**
+     * Allows user to resize maximum size of the thread pool.
+     * Deprecated, use setMaximumThreads instead.
+     */
+    @Deprecated
+    public void setMaximumThreads(int number);
+}
diff --git a/src/java/org/apache/cassandra/concurrent/SEPExecutor.java b/src/java/org/apache/cassandra/concurrent/SEPExecutor.java
index 675e047..05b59c6 100644
--- a/src/java/org/apache/cassandra/concurrent/SEPExecutor.java
+++ b/src/java/org/apache/cassandra/concurrent/SEPExecutor.java
@@ -19,6 +19,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -26,18 +27,24 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.MBeanWrapper;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.metrics.ThreadPoolMetrics;
-import org.apache.cassandra.utils.MBeanWrapper;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
 
+import static org.apache.cassandra.concurrent.SEPExecutor.TakeTaskPermitResult.*;
 import static org.apache.cassandra.concurrent.SEPWorker.Work;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
-public class SEPExecutor extends AbstractLocalAwareExecutorService implements SEPExecutorMBean
+public class SEPExecutor implements LocalAwareExecutorPlus, SEPExecutorMBean
 {
     private static final Logger logger = LoggerFactory.getLogger(SEPExecutor.class);
+    private static final TaskFactory taskFactory = TaskFactory.localAware();
+
     private final SharedExecutorPool pool;
 
     private final AtomicInteger maximumPoolSize;
@@ -55,10 +62,10 @@
     private final AtomicLong completedTasks = new AtomicLong();
 
     volatile boolean shuttingDown = false;
-    final SimpleCondition shutdown = new SimpleCondition();
+    final Condition shutdown = newOneTimeCondition();
 
     // TODO: see if other queue implementations might improve throughput
-    protected final ConcurrentLinkedQueue<FutureTask<?>> tasks = new ConcurrentLinkedQueue<>();
+    protected final ConcurrentLinkedQueue<Runnable> tasks = new ConcurrentLinkedQueue<>();
 
     SEPExecutor(SharedExecutorPool pool, int maximumPoolSize, MaximumPoolSizeListener maximumPoolSizeListener, String jmxPath, String name)
     {
@@ -94,7 +101,7 @@
         return true;
     }
 
-    protected void addTask(FutureTask<?> task)
+    protected <T extends Runnable> T addTask(T task)
     {
         // we add to the queue first, so that when a worker takes a task permit it can be certain there is a task available
         // this permits us to schedule threads non-spuriously; it also means work is serviced fairly
@@ -119,6 +126,7 @@
             // worker, we simply start a worker in a spinning state
             pool.maybeStartSpinningWorker();
         }
+        return task;
     }
 
     public enum TakeTaskPermitResult
@@ -126,7 +134,7 @@
         NONE_AVAILABLE,        // No task permits available
         TOOK_PERMIT,           // Took a permit and reduced task permits
         RETURNED_WORK_PERMIT   // Detected pool shrinking and returned work permit ahead of SEPWorker exit.
-    };
+    }
 
     // takes permission to perform a task, if any are available; once taken it is guaranteed
     // that a proceeding call to tasks.poll() will return some work
@@ -144,14 +152,14 @@
                 // Work permits are negative when the pool is reducing in size.  Atomically
                 // adjust the number of work permits so there is no race of multiple SEPWorkers
                 // exiting.  On conflicting update, recheck.
-                result = TakeTaskPermitResult.RETURNED_WORK_PERMIT;
+                result = RETURNED_WORK_PERMIT;
                 updated = updateWorkPermits(current, workPermits + 1);
             }
             else
             {
                 if (taskPermits == 0)
-                    return TakeTaskPermitResult.NONE_AVAILABLE;
-                result = TakeTaskPermitResult.TOOK_PERMIT;
+                    return NONE_AVAILABLE;
+                result = TOOK_PERMIT;
                 updated = updateTaskPermits(current, taskPermits - 1);
             }
             if (permits.compareAndSet(current, updated))
@@ -192,18 +200,18 @@
     }
 
     @Override
-    public void maybeExecuteImmediately(Runnable command)
+    public void maybeExecuteImmediately(Runnable task)
     {
-        FutureTask<?> ft = newTaskFor(command, null);
+        task = taskFactory.toExecute(task);
         if (!takeWorkPermit(false))
         {
-            addTask(ft);
+            addTask(task);
         }
         else
         {
             try
             {
-                ft.run();
+                task.run();
             }
             finally
             {
@@ -216,6 +224,60 @@
         }
     }
 
+    @Override
+    public void execute(Runnable run)
+    {
+        addTask(taskFactory.toExecute(run));
+    }
+
+    @Override
+    public void execute(WithResources withResources, Runnable run)
+    {
+        addTask(taskFactory.toExecute(withResources, run));
+    }
+
+    @Override
+    public Future<?> submit(Runnable run)
+    {
+        return addTask(taskFactory.toSubmit(run));
+    }
+
+    @Override
+    public <T> Future<T> submit(Runnable run, T result)
+    {
+        return addTask(taskFactory.toSubmit(run, result));
+    }
+
+    @Override
+    public <T> Future<T> submit(Callable<T> call)
+    {
+        return addTask(taskFactory.toSubmit(call));
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Runnable run, T result)
+    {
+        return addTask(taskFactory.toSubmit(withResources, run, result));
+    }
+
+    @Override
+    public Future<?> submit(WithResources withResources, Runnable run)
+    {
+        return addTask(taskFactory.toSubmit(withResources, run));
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Callable<T> call)
+    {
+        return addTask(taskFactory.toSubmit(withResources, call));
+    }
+
+    @Override
+    public boolean inExecutor()
+    {
+        throw new UnsupportedOperationException();
+    }
+
     public synchronized void shutdown()
     {
         if (shuttingDown)
@@ -234,7 +296,7 @@
     {
         shutdown();
         List<Runnable> aborted = new ArrayList<>();
-        while (takeTaskPermit(false) == TakeTaskPermitResult.TOOK_PERMIT)
+        while (takeTaskPermit(false) == TOOK_PERMIT)
             aborted.add(tasks.poll());
         return aborted;
     }
@@ -246,7 +308,7 @@
 
     public boolean isTerminated()
     {
-        return shuttingDown && shutdown.isSignaled();
+        return shuttingDown && shutdown.isSignalled();
     }
 
     public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
diff --git a/src/java/org/apache/cassandra/concurrent/SEPWorker.java b/src/java/org/apache/cassandra/concurrent/SEPWorker.java
index de5185d..c7b9abf 100644
--- a/src/java/org/apache/cassandra/concurrent/SEPWorker.java
+++ b/src/java/org/apache/cassandra/concurrent/SEPWorker.java
@@ -30,6 +30,7 @@
 
 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.utils.Clock.Global.nanoTime;
 
 final class SEPWorker extends AtomicReference<SEPWorker.Work> implements Runnable
 {
@@ -47,11 +48,11 @@
     long prevStopCheck = 0;
     long soleSpinnerSpinTime = 0;
 
-    SEPWorker(Long workerId, Work initialState, SharedExecutorPool pool)
+    SEPWorker(ThreadGroup threadGroup, Long workerId, Work initialState, SharedExecutorPool pool)
     {
         this.pool = pool;
         this.workerId = workerId;
-        thread = new FastThreadLocalThread(this, pool.poolName + "-Worker-" + workerId);
+        thread = new FastThreadLocalThread(threadGroup, this, threadGroup.getName() + "-Worker-" + workerId);
         thread.setDaemon(true);
         set(initialState);
         thread.start();
@@ -117,6 +118,7 @@
 
                     // we know there is work waiting, as we have a work permit, so poll() will always succeed
                     task.run();
+                    assigned.onCompletion();
                     task = null;
 
                     if (shutdown = assigned.shuttingDown)
@@ -162,9 +164,14 @@
             if (assigned != null)
                 assigned.returnWorkPermit();
             if (task != null)
+            {
                 logger.error("Failed to execute task, unexpected exception killed worker", t);
+                assigned.onCompletion();
+            }
             else
+            {
                 logger.error("Unexpected exception killed worker", t);
+            }
         }
     }
 
@@ -257,7 +264,7 @@
         sleep *= ThreadLocalRandom.current().nextDouble();
         sleep = Math.max(10000, sleep);
 
-        long start = System.nanoTime();
+        long start = nanoTime();
 
         // place ourselves in the spinning collection; if we clash with another thread just exit
         Long target = start + sleep;
@@ -269,7 +276,7 @@
         pool.spinning.remove(target, this);
 
         // finish timing and grab spinningTime (before we finish timing so it is under rather than overestimated)
-        long end = System.nanoTime();
+        long end = nanoTime();
         long spin = end - start;
         long stopCheck = pool.stopCheck.addAndGet(spin);
         maybeStop(stopCheck, end);
diff --git a/src/java/org/apache/cassandra/concurrent/ScheduledExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/ScheduledExecutorPlus.java
new file mode 100644
index 0000000..a2b033a
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ScheduledExecutorPlus.java
@@ -0,0 +1,54 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface ScheduledExecutorPlus extends ExecutorPlus, ScheduledExecutorService
+{
+    /**
+     * Schedule an action that is recurring but self-administered.
+     */
+    ScheduledFuture<?> scheduleSelfRecurring(Runnable run, long delay, TimeUnit units);
+
+    /**
+     * Schedule a timeout action. This method is primarily used by the Simulator to modify its
+     * scheduling behaviour with respect to this operation.
+     */
+    ScheduledFuture<?> scheduleAt(Runnable run, long deadline);
+
+    /**
+     * Schedule a timeout action. This method is primarily used by the Simulator to modify its
+     * scheduling behaviour with respect to this operation.
+     */
+    ScheduledFuture<?> scheduleTimeoutAt(Runnable run, long deadline);
+
+    /**
+     * Schedule a timeout action. This method is primarily used by the Simulator to modify its
+     * scheduling behaviour with respect to this operation.
+     */
+    ScheduledFuture<?> scheduleTimeoutWithDelay(Runnable run, long delay, TimeUnit units);
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ScheduledExecutors.java b/src/java/org/apache/cassandra/concurrent/ScheduledExecutors.java
index ff9d1b4..8da600c 100644
--- a/src/java/org/apache/cassandra/concurrent/ScheduledExecutors.java
+++ b/src/java/org/apache/cassandra/concurrent/ScheduledExecutors.java
@@ -24,6 +24,8 @@
 
 import org.apache.cassandra.utils.ExecutorUtils;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
 /**
  * Centralized location for shared executors
  */
@@ -32,26 +34,26 @@
     /**
      * This pool is used for periodic fast (sub-microsecond) tasks.
      */
-    public static final DebuggableScheduledThreadPoolExecutor scheduledFastTasks = new DebuggableScheduledThreadPoolExecutor("ScheduledFastTasks");
+    public static final ScheduledExecutorPlus scheduledFastTasks = executorFactory().scheduled("ScheduledFastTasks");
 
     /**
      * This pool is used for periodic short (sub-second) tasks.
      */
-     public static final DebuggableScheduledThreadPoolExecutor scheduledTasks = new DebuggableScheduledThreadPoolExecutor("ScheduledTasks");
+     public static final ScheduledExecutorPlus scheduledTasks = executorFactory().scheduled("ScheduledTasks");
 
     /**
      * This executor is used for tasks that can have longer execution times, and usually are non periodic.
      */
-    public static final DebuggableScheduledThreadPoolExecutor nonPeriodicTasks = new DebuggableScheduledThreadPoolExecutor("NonPeriodicTasks");
+    public static final ScheduledExecutorPlus nonPeriodicTasks = executorFactory().scheduled("NonPeriodicTasks");
 
     /**
      * This executor is used for tasks that do not need to be waited for on shutdown/drain.
      */
-    public static final DebuggableScheduledThreadPoolExecutor optionalTasks = new DebuggableScheduledThreadPoolExecutor("OptionalTasks");
+    public static final ScheduledExecutorPlus optionalTasks = executorFactory().scheduled(false, "OptionalTasks");
 
     @VisibleForTesting
-    public static void shutdownAndWait(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
+    public static void shutdownNowAndWait(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
     {
-        ExecutorUtils.shutdownNowAndWait(timeout, unit, scheduledFastTasks, scheduledTasks, nonPeriodicTasks, optionalTasks);
+        ExecutorUtils.shutdownNowAndWait(timeout, unit, scheduledTasks, scheduledFastTasks, nonPeriodicTasks, optionalTasks);
     }
 }
diff --git a/src/java/org/apache/cassandra/concurrent/ScheduledThreadPoolExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/ScheduledThreadPoolExecutorPlus.java
new file mode 100644
index 0000000..0ab09a4
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ScheduledThreadPoolExecutorPlus.java
@@ -0,0 +1,267 @@
+/*
+ * 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.concurrent;
+
+import java.util.List;
+import java.util.concurrent.*;
+
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.service.StorageService;
+
+import static com.google.common.primitives.Longs.max;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.concurrent.ExecutionFailure.propagating;
+import static org.apache.cassandra.concurrent.ExecutionFailure.suppressing;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+/**
+ * Like ExecutorPlus, ScheduledThreadPoolExecutorPlus always
+ * logs exceptions from the tasks it is given, even if Future.get is never called elsewhere.
+ *
+ * Catches exceptions during Task execution so that they don't suppress subsequent invocations of the task.
+ *
+ * Finally, there is a special rejected execution handler for tasks rejected during the shutdown hook.
+ *  - For fire and forget tasks (like ref tidy) we can safely ignore the exceptions.
+ *  - For any callers that care to know their task was rejected we cancel passed task.
+ */
+public class ScheduledThreadPoolExecutorPlus extends ScheduledThreadPoolExecutor implements ScheduledExecutorPlus
+{
+    private static final Logger logger = LoggerFactory.getLogger(ScheduledThreadPoolExecutorPlus.class);
+    private static final TaskFactory taskFactory = TaskFactory.standard();
+
+    public static final RejectedExecutionHandler rejectedExecutionHandler = (task, executor) ->
+    {
+        if (executor.isShutdown())
+        {
+            // TODO: this sequence of events seems poorly thought out
+            if (!StorageService.instance.isShutdown())
+                throw new RejectedExecutionException("ScheduledThreadPoolExecutor has shut down.");
+
+            //Give some notification to the caller the task isn't going to run
+            if (task instanceof java.util.concurrent.Future)
+                ((java.util.concurrent.Future<?>) task).cancel(false);
+
+            logger.debug("ScheduledThreadPoolExecutor has shut down as part of C* shutdown");
+        }
+        else
+        {
+            throw new AssertionError("Unknown rejection of ScheduledThreadPoolExecutor task");
+        }
+    };
+
+    ScheduledThreadPoolExecutorPlus(NamedThreadFactory threadFactory)
+    {
+        super(1, threadFactory);
+        setRejectedExecutionHandler(rejectedExecutionHandler);
+    }
+
+    @Override
+    public ScheduledFuture<?> schedule(Runnable task, long delay, TimeUnit unit)
+    {
+        return super.schedule(propagating(task), delay, unit);
+    }
+
+    @Override
+    public <V> ScheduledFuture<V> schedule(Callable<V> task, long delay, TimeUnit unit)
+    {
+        return super.schedule(propagating(task), delay, unit);
+    }
+
+    // override scheduling to suppress exceptions that would cancel future executions
+    @Override
+    public ScheduledFuture<?> scheduleAtFixedRate(Runnable task, long initialDelay, long period, TimeUnit unit)
+    {
+        return super.scheduleAtFixedRate(suppressing(task), initialDelay, period, unit);
+    }
+
+    @Override
+    public ScheduledFuture<?> scheduleWithFixedDelay(Runnable task, long initialDelay, long delay, TimeUnit unit)
+    {
+        return super.scheduleWithFixedDelay(suppressing(task), initialDelay, delay, unit);
+    }
+
+    @Override
+    public ScheduledFuture<?> scheduleSelfRecurring(Runnable run, long delay, TimeUnit units)
+    {
+        return schedule(run, delay, units);
+    }
+
+    @Override
+    public ScheduledFuture<?> scheduleAt(Runnable run, long deadline)
+    {
+        return schedule(run, max(0, deadline - nanoTime()), NANOSECONDS);
+    }
+
+    @Override
+    public ScheduledFuture<?> scheduleTimeoutAt(Runnable run, long deadline)
+    {
+        return scheduleTimeoutWithDelay(run, max(0, deadline - nanoTime()), NANOSECONDS);
+    }
+
+    @Override
+    public ScheduledFuture<?> scheduleTimeoutWithDelay(Runnable run, long delay, TimeUnit units)
+    {
+        return schedule(run, delay, units);
+    }
+
+    /*======== BEGIN DIRECT COPY OF ThreadPoolExecutorPlus ===============*/
+
+    private <T extends Runnable> T addTask(T task)
+    {
+        super.execute(task);
+        return task;
+    }
+
+    @Override
+    public void execute(Runnable run)
+    {
+        addTask(taskFactory.toExecute(run));
+    }
+
+    @Override
+    public void execute(WithResources withResources, Runnable run)
+    {
+        addTask(taskFactory.toExecute(withResources, run));
+    }
+
+    @Override
+    public Future<?> submit(Runnable run)
+    {
+        return addTask(taskFactory.toSubmit(run));
+    }
+
+    @Override
+    public <T> Future<T> submit(Runnable run, T result)
+    {
+        return addTask(taskFactory.toSubmit(run, result));
+    }
+
+    @Override
+    public <T> Future<T> submit(Callable<T> call)
+    {
+        return addTask(taskFactory.toSubmit(call));
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Runnable run, T result)
+    {
+        return addTask(taskFactory.toSubmit(withResources, run, result));
+    }
+
+    @Override
+    public Future<?> submit(WithResources withResources, Runnable run)
+    {
+        return addTask(taskFactory.toSubmit(withResources, run));
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Callable<T> call)
+    {
+        return addTask(taskFactory.toSubmit(withResources, call));
+    }
+
+    @Override
+    public boolean inExecutor()
+    {
+        return Thread.currentThread().getThreadGroup() == getThreadFactory().threadGroup;
+    }
+
+    @Override
+    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value)
+    {
+        return taskFactory.toSubmit(runnable, value);
+    }
+
+    @Override
+    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable)
+    {
+        return taskFactory.toSubmit(callable);
+    }
+
+    @Override
+    public NamedThreadFactory getThreadFactory()
+    {
+        return (NamedThreadFactory) super.getThreadFactory();
+    }
+
+    /*======== DIRECT COPY OF ThreadPoolExecutorBase ===============*/
+
+    @Override
+    public List<Runnable> shutdownNow()
+    {
+        List<Runnable> cancelled = super.shutdownNow();
+        for (Runnable c : cancelled)
+        {
+            if (c instanceof java.util.concurrent.Future<?>)
+                ((java.util.concurrent.Future<?>) c).cancel(true);
+        }
+        return cancelled;
+    }
+
+    @Override
+    protected void terminated()
+    {
+        getThreadFactory().close();
+    }
+
+    @Override
+    public int getActiveTaskCount()
+    {
+        return getActiveCount();
+    }
+
+    @Override
+    public int getPendingTaskCount()
+    {
+        return getQueue().size();
+    }
+
+    /*======== DIRECT COPY OF SingleThreadExecutorPlus ===============*/
+
+    @Override
+    public int getCorePoolSize()
+    {
+        return 1;
+    }
+    @Override
+    public void setCorePoolSize(int number)
+    {
+        throw new UnsupportedOperationException();
+    }
+    @Override
+    public int getMaximumPoolSize()
+    {
+        return 1;
+    }
+    @Override
+    public void setMaximumPoolSize(int number)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int getMaxTasksQueued()
+    {
+        return Integer.MAX_VALUE;
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/SequentialExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/SequentialExecutorPlus.java
new file mode 100644
index 0000000..2b63f14
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/SequentialExecutorPlus.java
@@ -0,0 +1,59 @@
+/*
+ * 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.concurrent;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * An {@link ExecutorPlus} that guarantees the order of execution matches the order of task submission,
+ * and provides a simple mechanism for the recurring pattern of ensuring a job is executed at least once
+ * after some point in time (i.e. ensures that at most one copy of the task is queued, with up to one
+ * copy running as well)
+ */
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface SequentialExecutorPlus extends ExecutorPlus
+{
+    public interface AtLeastOnceTrigger
+    {
+        /**
+         * Ensure the job is run at least once in its entirety after this method is invoked (including any already queued)
+         */
+        public boolean trigger();
+
+        /**
+         * Run the provided task after all queued and executing jobs have completed
+         */
+        public void runAfter(Runnable run);
+
+        /**
+         * Wait until all queued and executing jobs have completed
+         */
+        public void sync();
+    }
+
+    /**
+     * Return an object for orchestrating the execution of this task at least once (in its entirety) after
+     * the trigger is invoked, i.e. saturating the number of pending tasks at 1 (2 including any possibly executing
+     * at the time of invocation)
+     */
+    public AtLeastOnceTrigger atLeastOnceTrigger(Runnable runnable);
+}
diff --git a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java
index 7a07cf4..f74854f 100644
--- a/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java
+++ b/src/java/org/apache/cassandra/concurrent/SharedExecutorPool.java
@@ -27,7 +27,9 @@
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.LockSupport;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.concurrent.SEPWorker.Work;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * A pool of worker threads that are shared between all Executors created with it. Each executor is treated as a distinct
@@ -56,11 +58,10 @@
  */
 public class SharedExecutorPool
 {
-
     public static final SharedExecutorPool SHARED = new SharedExecutorPool("SharedPool");
 
     // the name assigned to workers in the pool, and the id suffix
-    final String poolName;
+    final ThreadGroup threadGroup;
     final AtomicLong workerId = new AtomicLong();
 
     // the collection of executors serviced by this pool; periodically ordered by traffic volume
@@ -79,9 +80,14 @@
 
     volatile boolean shuttingDown = false;
 
-    public SharedExecutorPool(String poolName)
+    public SharedExecutorPool(String name)
     {
-        this.poolName = poolName;
+        this(executorFactory().newThreadGroup(name));
+    }
+
+    public SharedExecutorPool(ThreadGroup threadGroup)
+    {
+        this.threadGroup = threadGroup;
     }
 
     void schedule(Work work)
@@ -96,7 +102,7 @@
                 return;
 
         if (!work.isStop())
-            new SEPWorker(workerId.incrementAndGet(), work, this);
+            new SEPWorker(threadGroup, workerId.incrementAndGet(), work, this);
     }
 
     void maybeStartSpinningWorker()
@@ -108,12 +114,12 @@
             schedule(Work.SPINNING);
     }
 
-    public synchronized LocalAwareExecutorService newExecutor(int maxConcurrency, String jmxPath, String name)
+    public synchronized LocalAwareExecutorPlus newExecutor(int maxConcurrency, String jmxPath, String name)
     {
         return newExecutor(maxConcurrency, i -> {}, jmxPath, name);
     }
 
-    public LocalAwareExecutorService newExecutor(int maxConcurrency, LocalAwareExecutorService.MaximumPoolSizeListener maximumPoolSizeListener, String jmxPath, String name)
+    public LocalAwareExecutorPlus newExecutor(int maxConcurrency, ExecutorPlus.MaximumPoolSizeListener maximumPoolSizeListener, String jmxPath, String name)
     {
         SEPExecutor executor = new SEPExecutor(this, maxConcurrency, maximumPoolSizeListener, jmxPath, name);
         executors.add(executor);
@@ -128,10 +134,10 @@
 
         terminateWorkers();
 
-        long until = System.nanoTime() + unit.toNanos(timeout);
+        long until = nanoTime() + unit.toNanos(timeout);
         for (SEPExecutor executor : executors)
         {
-            executor.shutdown.await(until - System.nanoTime(), TimeUnit.NANOSECONDS);
+            executor.shutdown.await(until - nanoTime(), TimeUnit.NANOSECONDS);
             if (!executor.isTerminated())
                 throw new TimeoutException(executor.name + " not terminated");
         }
diff --git a/src/java/org/apache/cassandra/concurrent/Shutdownable.java b/src/java/org/apache/cassandra/concurrent/Shutdownable.java
new file mode 100644
index 0000000..185875b
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/Shutdownable.java
@@ -0,0 +1,46 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface Shutdownable
+{
+    boolean isTerminated();
+
+    /**
+     * Shutdown once any remaining work has completed (however this is defined for the implementation).
+     */
+    void shutdown();
+
+    /**
+     * Shutdown immediately, possibly interrupting ongoing work, and cancelling work that is queued.
+     */
+    Object shutdownNow();
+
+    /**
+     * Await termination of this object, i.e. the cessation of all current and future work.
+     */
+    public boolean awaitTermination(long timeout, TimeUnit units) throws InterruptedException;
+}
diff --git a/src/java/org/apache/cassandra/concurrent/SingleThreadExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/SingleThreadExecutorPlus.java
new file mode 100644
index 0000000..eb28277
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/SingleThreadExecutorPlus.java
@@ -0,0 +1,106 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.apache.cassandra.utils.concurrent.Future;
+
+public class SingleThreadExecutorPlus extends ThreadPoolExecutorPlus implements SequentialExecutorPlus
+{
+    public static class AtLeastOnce extends AtomicBoolean implements AtLeastOnceTrigger, Runnable
+    {
+        protected final SequentialExecutorPlus executor;
+        protected final Runnable run;
+
+        public AtLeastOnce(SequentialExecutorPlus executor, Runnable run)
+        {
+            this.executor = executor;
+            this.run = run;
+        }
+
+        public boolean trigger()
+        {
+            boolean success;
+            if (success = compareAndSet(false, true))
+                executor.execute(this);
+            return success;
+        }
+
+        public void runAfter(Runnable run)
+        {
+            executor.execute(run);
+        }
+
+        public void sync()
+        {
+            Future<?> done = executor.submit(() -> {});
+            done.awaitThrowUncheckedOnInterrupt();
+            done.rethrowIfFailed(); // executor might get shutdown before we execute; propagate cancellation exception
+        }
+
+        public void run()
+        {
+            set(false);
+            run.run();
+        }
+
+        @Override
+        public String toString()
+        {
+            return run.toString();
+        }
+    }
+
+    SingleThreadExecutorPlus(ThreadPoolExecutorBuilder<? extends SingleThreadExecutorPlus> builder)
+    {
+        this(builder, TaskFactory.standard());
+    }
+
+    SingleThreadExecutorPlus(ThreadPoolExecutorBuilder<? extends SingleThreadExecutorPlus> builder, TaskFactory taskFactory)
+    {
+        super(builder, taskFactory);
+    }
+
+    @Override
+    public int getCorePoolSize()
+    {
+        return 1;
+    }
+    @Override
+    public void setCorePoolSize(int number)
+    {
+        throw new UnsupportedOperationException();
+    }
+    @Override
+    public int getMaximumPoolSize()
+    {
+        return 1;
+    }
+    @Override
+    public void setMaximumPoolSize(int number)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public AtLeastOnce atLeastOnceTrigger(Runnable run)
+    {
+        return new AtLeastOnce(this, run);
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/Stage.java b/src/java/org/apache/cassandra/concurrent/Stage.java
index 5efaf16..ac609aa 100644
--- a/src/java/org/apache/cassandra/concurrent/Stage.java
+++ b/src/java/org/apache/cassandra/concurrent/Stage.java
@@ -20,15 +20,7 @@
 import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.Callable;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RejectedExecutionHandler;
-import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.function.IntSupplier;
@@ -42,10 +34,11 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.utils.ExecutorUtils;
-
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.Future;
 
 import static java.util.stream.Collectors.toMap;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 
 public enum Stage
 {
@@ -56,28 +49,29 @@
     GOSSIP            (true,  "GossipStage",           "internal", () -> 1,                                         null,                                            Stage::singleThreadedStage),
     REQUEST_RESPONSE  (false, "RequestResponseStage",  "request",  FBUtilities::getAvailableProcessors,             null,                                            Stage::multiThreadedLowSignalStage),
     ANTI_ENTROPY      (false, "AntiEntropyStage",      "internal", () -> 1,                                         null,                                            Stage::singleThreadedStage),
-    MIGRATION         (false, "MigrationStage",        "internal", () -> 1,                                         null,                                            Stage::singleThreadedStage),
+    MIGRATION         (false, "MigrationStage",        "internal", () -> 1,                                         null,                                            Stage::migrationStage),
     MISC              (false, "MiscStage",             "internal", () -> 1,                                         null,                                            Stage::singleThreadedStage),
-    TRACING           (false, "TracingStage",          "internal", () -> 1,                                         null,                                            Stage::tracingExecutor),
+    TRACING           (false, "TracingStage",          "internal", () -> 1,                                         null,                                            Stage::tracingStage),
     INTERNAL_RESPONSE (false, "InternalResponseStage", "internal", FBUtilities::getAvailableProcessors,             null,                                            Stage::multiThreadedStage),
-    IMMEDIATE         (false, "ImmediateStage",        "internal", () -> 0,                                         null,                                            Stage::immediateExecutor);
+    IMMEDIATE         (false, "ImmediateStage",        "internal", () -> 0,                                         null,                                            Stage::immediateExecutor),
+    PAXOS_REPAIR      (false, "PaxosRepairStage",      "internal", FBUtilities::getAvailableProcessors,             null,                                            Stage::multiThreadedStage),
+    ;
 
-    public static final long KEEP_ALIVE_SECONDS = 60; // seconds to keep "extra" threads alive for when idle
     public final String jmxName;
+    private final Supplier<ExecutorPlus> executorSupplier;
+    private volatile ExecutorPlus executor;
     /** Set true if this executor should be gracefully shutdown before stopping
      * the commitlog allocator. Tasks on executors that issue mutations may
      * block indefinitely waiting for a new commitlog segment, preventing a
      * clean drain/shutdown.
      */
     public final boolean shutdownBeforeCommitlog;
-    private final Supplier<LocalAwareExecutorService> initialiser;
-    private volatile LocalAwareExecutorService executor = null;
 
-    Stage(Boolean shutdownBeforeCommitlog, String jmxName, String jmxType, IntSupplier numThreads, LocalAwareExecutorService.MaximumPoolSizeListener onSetMaximumPoolSize, ExecutorServiceInitialiser initialiser)
+    Stage(boolean shutdownBeforeCommitlog, String jmxName, String jmxType, IntSupplier numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize, ExecutorServiceInitialiser executorSupplier)
     {
         this.shutdownBeforeCommitlog = shutdownBeforeCommitlog;
         this.jmxName = jmxName;
-        this.initialiser = () -> initialiser.init(jmxName,jmxType, numThreads.getAsInt(), onSetMaximumPoolSize);
+        this.executorSupplier = () -> executorSupplier.init(jmxName, jmxType, numThreads.getAsInt(), onSetMaximumPoolSize);
     }
 
     private static String normalizeName(String stageName)
@@ -128,14 +122,14 @@
     }
 
     // Convenience functions to execute on this stage
-    public void execute(Runnable command) { executor().execute(command); }
-    public void execute(Runnable command, ExecutorLocals locals) { executor().execute(command, locals); }
-    public void maybeExecuteImmediately(Runnable command) { executor().maybeExecuteImmediately(command); }
+    public void execute(Runnable task) { executor().execute(task); }
+    public void execute(ExecutorLocals locals, Runnable task) { executor().execute(locals, task); }
+    public void maybeExecuteImmediately(Runnable task) { executor().maybeExecuteImmediately(task); }
     public <T> Future<T> submit(Callable<T> task) { return executor().submit(task); }
     public Future<?> submit(Runnable task) { return executor().submit(task); }
     public <T> Future<T> submit(Runnable task, T result) { return executor().submit(task, result); }
 
-    public LocalAwareExecutorService executor()
+    public ExecutorPlus executor()
     {
         if (executor == null)
         {
@@ -143,21 +137,21 @@
             {
                 if (executor == null)
                 {
-                    executor = initialiser.get();
+                    executor = executorSupplier.get();
                 }
             }
         }
         return executor;
     }
 
-    private static List<ExecutorService> executors()
+    private static List<ExecutorPlus> executors()
     {
         return Stream.of(Stage.values())
                      .map(Stage::executor)
                      .collect(Collectors.toList());
     }
 
-    private static List<ExecutorService> mutatingExecutors()
+    private static List<ExecutorPlus> mutatingExecutors()
     {
         return Stream.of(Stage.values())
                      .filter(stage -> stage.shutdownBeforeCommitlog)
@@ -175,57 +169,66 @@
 
     public static void shutdownAndAwaitMutatingExecutors(boolean interrupt, long timeout, TimeUnit units) throws InterruptedException, TimeoutException
     {
-        List<ExecutorService> executors = mutatingExecutors();
+        List<ExecutorPlus> executors = mutatingExecutors();
         ExecutorUtils.shutdown(interrupt, executors);
         ExecutorUtils.awaitTermination(timeout, units, executors);
     }
 
     public static boolean areMutationExecutorsTerminated()
     {
-        return mutatingExecutors().stream().allMatch(ExecutorService::isTerminated);
+        return mutatingExecutors().stream().allMatch(ExecutorPlus::isTerminated);
     }
 
     @VisibleForTesting
     public static void shutdownAndWait(long timeout, TimeUnit units) throws InterruptedException, TimeoutException
     {
-        List<ExecutorService> executors = executors();
+        List<ExecutorPlus> executors = executors();
         ExecutorUtils.shutdownNow(executors);
         ExecutorUtils.awaitTermination(timeout, units, executors);
     }
 
-    static LocalAwareExecutorService tracingExecutor(String jmxName, String jmxType, int numThreads, LocalAwareExecutorService.MaximumPoolSizeListener onSetMaximumPoolSize)
+    private static ExecutorPlus tracingStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize)
     {
-        RejectedExecutionHandler reh = (r, executor) -> MessagingService.instance().metrics.recordSelfDroppedMessage(Verb._TRACE);
-        return new TracingExecutor(1,
-                                   1,
-                                   KEEP_ALIVE_SECONDS,
-                                   TimeUnit.SECONDS,
-                                   new ArrayBlockingQueue<>(1000),
-                                   new NamedThreadFactory(jmxName),
-                                   reh);
+        return executorFactory()
+                .withJmx(jmxType)
+                .configureSequential(jmxName)
+                .withQueueLimit(1000)
+                .withRejectedExecutionHandler((r, executor) -> MessagingService.instance().metrics.recordSelfDroppedMessage(Verb._TRACE)).build();
     }
 
-    static LocalAwareExecutorService multiThreadedStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorService.MaximumPoolSizeListener onSetMaximumPoolSize)
+    private static ExecutorPlus migrationStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize)
     {
-        return new JMXEnabledThreadPoolExecutor(numThreads,
-                                                KEEP_ALIVE_SECONDS,
-                                                TimeUnit.SECONDS,
-                                                new LinkedBlockingQueue<>(),
-                                                new NamedThreadFactory(jmxName),
-                                                jmxType);
+        return executorFactory()
+               .localAware()
+               .withJmx(jmxType)
+               .sequential(jmxName);
     }
 
-    static LocalAwareExecutorService multiThreadedLowSignalStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorService.MaximumPoolSizeListener onSetMaximumPoolSize)
+    private static LocalAwareExecutorPlus singleThreadedStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize)
     {
-        return SharedExecutorPool.SHARED.newExecutor(numThreads, onSetMaximumPoolSize, jmxType, jmxName);
+        return executorFactory()
+                .localAware()
+                .withJmx(jmxType)
+                .sequential(jmxName);
     }
 
-    static LocalAwareExecutorService singleThreadedStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorService.MaximumPoolSizeListener onSetMaximumPoolSize)
+    static LocalAwareExecutorPlus multiThreadedStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize)
     {
-        return new JMXEnabledSingleThreadExecutor(jmxName, jmxType);
+        return executorFactory()
+                .localAware()
+                .withJmx(jmxType)
+                .pooled(jmxName, numThreads);
     }
 
-    static LocalAwareExecutorService immediateExecutor(String jmxName, String jmxType, int numThreads, LocalAwareExecutorService.MaximumPoolSizeListener onSetMaximumPoolSize)
+    static LocalAwareExecutorPlus multiThreadedLowSignalStage(String jmxName, String jmxType, int numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize)
+    {
+        return executorFactory()
+                .localAware()
+                .withJmx(jmxType)
+                .shared(jmxName, numThreads, onSetMaximumPoolSize);
+    }
+
+    static LocalAwareExecutorPlus immediateExecutor(String jmxName, String jmxType, int numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize)
     {
         return ImmediateExecutor.INSTANCE;
     }
@@ -233,7 +236,7 @@
     @FunctionalInterface
     public interface ExecutorServiceInitialiser
     {
-        public LocalAwareExecutorService init(String jmxName, String jmxType, int numThreads, LocalAwareExecutorService.MaximumPoolSizeListener onSetMaximumPoolSize);
+        public ExecutorPlus init(String jmxName, String jmxType, int numThreads, LocalAwareExecutorPlus.MaximumPoolSizeListener onSetMaximumPoolSize);
     }
 
     /**
@@ -267,38 +270,4 @@
     {
         executor().setMaximumPoolSize(newMaximumPoolSize);
     }
-
-    /**
-     * The executor used for tracing.
-     */
-    private static class TracingExecutor extends ThreadPoolExecutor implements LocalAwareExecutorService
-    {
-        TracingExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
-        {
-            super(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue, threadFactory, handler);
-        }
-
-        public void execute(Runnable command, ExecutorLocals locals)
-        {
-            assert locals == null;
-            super.execute(command);
-        }
-
-        public void maybeExecuteImmediately(Runnable command)
-        {
-            execute(command);
-        }
-
-        @Override
-        public int getActiveTaskCount()
-        {
-            return getActiveCount();
-        }
-
-        @Override
-        public int getPendingTaskCount()
-        {
-            return getQueue().size();
-        }
-    }
 }
diff --git a/src/java/org/apache/cassandra/concurrent/SyncFutureTask.java b/src/java/org/apache/cassandra/concurrent/SyncFutureTask.java
new file mode 100644
index 0000000..422da99
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/SyncFutureTask.java
@@ -0,0 +1,83 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.Callable;
+
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+import org.apache.cassandra.utils.concurrent.SyncFuture;
+
+public class SyncFutureTask<T> extends SyncFuture<T> implements RunnableFuture<T>
+{
+    final Callable<T> call;
+
+    public SyncFutureTask(Callable<T> call)
+    {
+        this.call = call;
+    }
+
+    public SyncFutureTask(WithResources withResources, Callable<T> call)
+    {
+        this.call = new Callable<T>()
+        {
+            @Override
+            public T call() throws Exception
+            {
+                try (Closeable close = withResources.get())
+                {
+                    return call.call();
+                }
+            }
+
+            @Override
+            public String toString()
+            {
+                return call.toString();
+            }
+        };
+    }
+
+    public void run()
+    {
+        try
+        {
+            if (!setUncancellable())
+            {
+                if (isCancelled()) return;
+                else throw new IllegalStateException();
+            }
+
+            if (!trySuccess(call.call()))
+                throw new IllegalStateException();
+        }
+        catch (Throwable t)
+        {
+            tryFailure(t);
+            ExecutionFailure.handle(t);
+        }
+    }
+
+    @Override
+    public String description()
+    {
+        return call.toString();
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/TaskFactory.java b/src/java/org/apache/cassandra/concurrent/TaskFactory.java
new file mode 100644
index 0000000..56087d9
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/TaskFactory.java
@@ -0,0 +1,182 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.Callable;
+
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+
+import static org.apache.cassandra.concurrent.FutureTask.callable;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A simple mechanism to impose our desired semantics on the execution of a task without requiring a specialised
+ * executor service. We wrap tasks in a suitable {@link FutureTask} or encapsulating {@link Runnable}.
+ *
+ * The encapsulations handle any exceptions in our standard way, as well as ensuring {@link ExecutorLocals} are
+ * propagated in the case of {@link #localAware()}
+ */
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface TaskFactory
+{
+    Runnable toExecute(Runnable runnable);
+    <T> RunnableFuture<T> toSubmit(Runnable runnable);
+    <T> RunnableFuture<T> toSubmit(Runnable runnable, T result);
+    <T> RunnableFuture<T> toSubmit(Callable<T> callable);
+
+    Runnable toExecute(WithResources withResources, Runnable runnable);
+    <T> RunnableFuture<T> toSubmit(WithResources withResources, Runnable runnable);
+    <T> RunnableFuture<T> toSubmit(WithResources withResources, Runnable runnable, T result);
+    <T> RunnableFuture<T> toSubmit(WithResources withResources, Callable<T> callable);
+
+    static TaskFactory standard() { return Standard.INSTANCE; }
+    static TaskFactory localAware() { return LocalAware.INSTANCE; }
+
+    public class Standard implements TaskFactory
+    {
+        static final Standard INSTANCE = new Standard();
+        protected Standard() {}
+
+        @Override
+        public Runnable toExecute(Runnable runnable)
+        {
+            return ExecutionFailure.suppressing(runnable);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(Runnable runnable)
+        {
+            return newTask(callable(runnable));
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(Runnable runnable, T result)
+        {
+            return newTask(callable(runnable, result));
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(Callable<T> callable)
+        {
+            return newTask(callable);
+        }
+
+        @Override
+        public Runnable toExecute(WithResources withResources, Runnable runnable)
+        {
+            return ExecutionFailure.suppressing(withResources, runnable);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(WithResources withResources, Runnable runnable)
+        {
+            return withResources.isNoOp() ? newTask(callable(runnable))
+                                          : newTask(withResources, callable(runnable));
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(WithResources withResources, Runnable runnable, T result)
+        {
+            return withResources.isNoOp() ? newTask(callable(runnable, result))
+                                          : newTask(withResources, callable(runnable, result));
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(WithResources withResources, Callable<T> callable)
+        {
+            return withResources.isNoOp() ? newTask(callable)
+                                          : newTask(withResources, callable);
+        }
+
+        protected <T> RunnableFuture<T> newTask(Callable<T> call)
+        {
+            return new FutureTask<>(call);
+        }
+
+        protected <T> RunnableFuture<T> newTask(WithResources withResources, Callable<T> call)
+        {
+            return new FutureTaskWithResources<>(withResources, call);
+        }
+    }
+
+    public class LocalAware extends Standard
+    {
+        static final LocalAware INSTANCE = new LocalAware();
+
+        protected LocalAware() {}
+
+        @Override
+        public Runnable toExecute(Runnable runnable)
+        {
+            // no reason to propagate exception when it is inaccessible to caller
+            return ExecutionFailure.suppressing(ExecutorLocals.propagate(), runnable);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(Runnable runnable)
+        {
+            return super.toSubmit(ExecutorLocals.propagate(), runnable);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(Runnable runnable, T result)
+        {
+            return super.toSubmit(ExecutorLocals.propagate(), runnable, result);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(Callable<T> callable)
+        {
+            return super.toSubmit(ExecutorLocals.propagate(), callable);
+        }
+
+        @Override
+        public Runnable toExecute(WithResources withResources, Runnable runnable)
+        {
+            return ExecutionFailure.suppressing(withLocals(withResources), runnable);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(WithResources withResources, Runnable runnable)
+        {
+            return super.toSubmit(withLocals(withResources), runnable);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(WithResources withResources, Runnable runnable, T result)
+        {
+            return super.toSubmit(withLocals(withResources), runnable, result);
+        }
+
+        @Override
+        public <T> RunnableFuture<T> toSubmit(WithResources withResources, Callable<T> callable)
+        {
+            return super.toSubmit(withLocals(withResources), callable);
+        }
+
+        private static WithResources withLocals(WithResources withResources)
+        {
+            return withResources instanceof ExecutorLocals ? withResources : ExecutorLocals.propagate().and(withResources);
+        }
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorBase.java b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorBase.java
new file mode 100644
index 0000000..b90485a
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorBase.java
@@ -0,0 +1,186 @@
+/*
+ * 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.concurrent;
+
+import java.util.List;
+import java.util.concurrent.*;
+
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+/**
+ * This class incorporates some Executor best practices for Cassandra.  Most of the executors in the system
+ * should use or extend {@link ThreadPoolExecutorPlus}, or in rare exceptions this class.
+ *
+ * This class provides some very basic improvements:
+ * <li>We are configured by {@link ThreadPoolExecutorBuilder}
+ * <li>Tasks rejected due to overflow of the queue block the submitting thread rather than throwing {@link RejectedExecutionException}
+ * <li>{@link RunnableFuture} rejected due to executor shutdown will be cancelled
+ * <li>{@link RunnableFuture} removed by {@link #shutdownNow()} will be cancelled
+ *
+ * We also provide a shutdown hook for JMX registration cleanup.
+ */
+public class ThreadPoolExecutorBase extends ThreadPoolExecutor implements ResizableThreadPool
+{
+    public static final RejectedExecutionHandler blockingExecutionHandler = (task, executor) ->
+    {
+        BlockingQueue<Runnable> queue = executor.getQueue();
+        try
+        {
+            while (true)
+            {
+                try
+                {
+                    if (executor.isShutdown())
+                        throw new RejectedExecutionException(executor + " has shut down");
+
+                    if (queue.offer(task, 1, TimeUnit.SECONDS))
+                        break;
+                }
+                catch (InterruptedException e)
+                {
+                    throw new UncheckedInterruptedException(e);
+                }
+            }
+        }
+        catch (Throwable t)
+        {
+            //Give some notification to the caller the task isn't going to run
+            if (task instanceof java.util.concurrent.Future)
+                ((java.util.concurrent.Future<?>) task).cancel(false);
+            throw t;
+        }
+    };
+
+    private Runnable onShutdown;
+
+    // maximumPoolSize is only used when corePoolSize == 0
+    // if keepAliveTime < 0 and unit == null, we forbid core thread timeouts (e.g. single threaded executors by default)
+    public ThreadPoolExecutorBase(ThreadPoolExecutorBuilder<?> builder)
+    {
+        super(builder.coreThreads(), builder.maxThreads(), builder.keepAlive(), builder.keepAliveUnits(), builder.newQueue(), builder.newThreadFactory());
+        allowCoreThreadTimeOut(builder.allowCoreThreadTimeouts());
+
+        // block task submissions until queue has room.
+        // this is fighting TPE's design a bit because TPE rejects if queue.offer reports a full queue.
+        // we'll just override this with a handler that retries until it gets in.  ugly, but effective.
+        // (there is an extensive analysis of the options here at
+        //  http://today.java.net/pub/a/today/2008/10/23/creating-a-notifying-blocking-thread-pool-executor.html)
+        setRejectedExecutionHandler(builder.rejectedExecutionHandler(blockingExecutionHandler));
+    }
+
+    // no RejectedExecutionHandler
+    public ThreadPoolExecutorBase(int threads, int keepAlive, TimeUnit keepAliveUnits, BlockingQueue<Runnable> queue, NamedThreadFactory threadFactory)
+    {
+        super(threads, threads, keepAlive, keepAliveUnits, queue, threadFactory);
+        assert queue.isEmpty() : "Executor initialized with non-empty task queue";
+        allowCoreThreadTimeOut(true);
+    }
+
+    public void onShutdown(Runnable onShutdown)
+    {
+        this.onShutdown = onShutdown;
+    }
+
+    public Runnable onShutdown()
+    {
+        return onShutdown;
+    }
+
+    @Override
+    protected void terminated()
+    {
+        getThreadFactory().close();
+    }
+
+    @Override
+    public void shutdown()
+    {
+        try
+        {
+            super.shutdown();
+        }
+        finally
+        {
+            if (onShutdown != null)
+                onShutdown.run();
+        }
+    }
+
+    @Override
+    public List<Runnable> shutdownNow()
+    {
+        try
+        {
+            List<Runnable> cancelled = super.shutdownNow();
+            for (Runnable c : cancelled)
+            {
+                if (c instanceof java.util.concurrent.Future<?>)
+                    ((java.util.concurrent.Future<?>) c).cancel(true);
+            }
+            return cancelled;
+        }
+        finally
+        {
+            if (onShutdown != null)
+                onShutdown.run();
+        }
+    }
+    
+    @Override
+    public int getActiveTaskCount()
+    {
+        return getActiveCount();
+    }
+
+    @Override
+    public int getPendingTaskCount()
+    {
+        return getQueue().size();
+    }
+
+    public int getCoreThreads()
+    {
+        return getCorePoolSize();
+    }
+
+    public void setCoreThreads(int number)
+    {
+        setCorePoolSize(number);
+    }
+
+    public int getMaximumThreads()
+    {
+        return getMaximumPoolSize();
+    }
+
+    public void setMaximumThreads(int number)
+    {
+        setMaximumPoolSize(number);
+    }
+
+    @Override
+    public NamedThreadFactory getThreadFactory()
+    {
+        return (NamedThreadFactory) super.getThreadFactory();
+    }
+
+    public String toString()
+    {
+        return getThreadFactory().id;
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorBuilder.java b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorBuilder.java
new file mode 100644
index 0000000..5e578a5
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorBuilder.java
@@ -0,0 +1,204 @@
+/*
+ * 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.concurrent;
+
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+
+import org.apache.cassandra.concurrent.NamedThreadFactory.MetaFactory;
+
+import static java.lang.Thread.NORM_PRIORITY;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
+
+/**
+ * Configure a {@link ThreadPoolExecutorPlus}, applying Cassandra's best practices by default
+ * <li>Core threads may timeout, and use a default {@link #keepAlive} time in {@link #keepAliveUnits}
+ * <li>Threads share the same {@link ThreadGroup}, which may be configurably a child of a specified {@link ThreadGroup}
+ *     descended from the same parent of the {@link MetaFactory}
+ * <li>By default queues are unbounded in length
+ * <li>The default {@link RejectedExecutionHandler} is implementation dependent, but may be overridden
+ * <li>The default {@link UncaughtExceptionHandler} is inherited from {@link MetaFactory}, which in turn receives it
+ *     from the {@link ExecutorBuilderFactory}
+ */
+public class ThreadPoolExecutorBuilder<E extends ExecutorPlus> extends MetaFactory implements ExecutorBuilder<E>
+{
+    static <E extends SequentialExecutorPlus> ExecutorBuilder<E> sequential(Function<ThreadPoolExecutorBuilder<E>, E> constructor, ClassLoader contextClassLoader, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler, String name)
+    {
+        ThreadPoolExecutorBuilder<E> result = new ThreadPoolExecutorBuilder<>(constructor, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, 1);
+        result.withKeepAlive();
+        return result;
+    }
+
+    static <E extends SingleThreadExecutorPlus> ExecutorBuilder<E> sequentialJmx(Function<ThreadPoolExecutorBuilder<E>, E> constructor, ClassLoader contextClassLoader, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler, String name, String jmxPath)
+    {
+        return new ThreadPoolExecutorJMXAdapter.Builder<>(sequential(constructor, contextClassLoader, threadGroup, uncaughtExceptionHandler, name), jmxPath);
+    }
+
+    static <E extends ExecutorPlus> ExecutorBuilder<E> pooled(Function<ThreadPoolExecutorBuilder<E>, E> constructor, ClassLoader contextClassLoader, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler, String name, int threads)
+    {
+        return new ThreadPoolExecutorBuilder<>(constructor, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, threads);
+    }
+
+    static <E extends ThreadPoolExecutorPlus> ExecutorBuilder<E> pooledJmx(Function<ThreadPoolExecutorBuilder<E>, E> constructor, ClassLoader contextClassLoader, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler, String name, int threads, String jmxPath)
+    {
+        return new ThreadPoolExecutorJMXAdapter.Builder<>(pooled(constructor, contextClassLoader, threadGroup, uncaughtExceptionHandler, name, threads), jmxPath);
+    }
+
+    private final Function<ThreadPoolExecutorBuilder<E>, E> constructor;
+    private final String name;
+    private final int threads;
+    private int threadPriority = NORM_PRIORITY;
+    private Integer queueLimit;
+
+    private long keepAlive = 1;
+    private TimeUnit keepAliveUnits = MINUTES;
+    private boolean allowCoreThreadTimeouts = true;
+
+    private RejectedExecutionHandler rejectedExecutionHandler = null;
+
+    protected ThreadPoolExecutorBuilder(Function<ThreadPoolExecutorBuilder<E>, E> constructor, ClassLoader contextClassLoader, ThreadGroup overrideThreadGroup, UncaughtExceptionHandler uncaughtExceptionHandler, String name, int threads)
+    {
+        super(contextClassLoader, overrideThreadGroup, uncaughtExceptionHandler);
+        this.constructor = constructor;
+        this.name = name;
+        this.threads = threads;
+    }
+
+    // core and non-core threads will die after this period of inactivity
+    public ThreadPoolExecutorBuilder<E> withKeepAlive(long keepAlive, TimeUnit keepAliveUnits)
+    {
+        this.allowCoreThreadTimeouts = true;
+        this.keepAlive = keepAlive;
+        this.keepAliveUnits = keepAliveUnits;
+        return this;
+    }
+
+    // once started, core threads will never die
+    public ThreadPoolExecutorBuilder<E> withKeepAlive()
+    {
+        this.allowCoreThreadTimeouts = false;
+        return this;
+    }
+
+    public ThreadPoolExecutorBuilder<E> withThreadPriority(int threadPriority)
+    {
+        this.threadPriority = threadPriority;
+        return this;
+    }
+
+    @Override
+    public ExecutorBuilder<E> withThreadGroup(ThreadGroup threadGroup)
+    {
+        ThreadGroup current = this.threadGroup;
+
+        ThreadGroup parent = threadGroup;
+        while (parent != null && parent != current)
+            parent = parent.getParent();
+        if (parent != current)
+            throw new IllegalArgumentException("threadGroup may only be overridden with a child of the default threadGroup");
+
+        this.threadGroup = threadGroup;
+        return this;
+    }
+
+    @Override
+    public ExecutorBuilder<E> withDefaultThreadGroup()
+    {
+        this.threadGroup = null;
+        return this;
+    }
+
+    public ThreadPoolExecutorBuilder<E> withQueueLimit(int queueLimit)
+    {
+        this.queueLimit = queueLimit;
+        return this;
+    }
+
+    public ThreadPoolExecutorBuilder<E> withRejectedExecutionHandler(RejectedExecutionHandler rejectedExecutionHandler)
+    {
+        this.rejectedExecutionHandler = rejectedExecutionHandler;
+        return this;
+    }
+
+    public ThreadPoolExecutorBuilder<E> withUncaughtExceptionHandler(UncaughtExceptionHandler uncaughtExceptionHandler)
+    {
+        this.uncaughtExceptionHandler = uncaughtExceptionHandler;
+        return this;
+    }
+
+    @Override
+    public E build()
+    {
+        return constructor.apply(this);
+    }
+
+    NamedThreadFactory newThreadFactory()
+    {
+        return newThreadFactory(name, threadPriority);
+    }
+
+    BlockingQueue<Runnable> newQueue()
+    {
+        // if our pool can have an infinite number of threads, there is no point having an infinite queue length
+        int size = queueLimit != null
+                ? queueLimit
+                : threads == Integer.MAX_VALUE
+                    ? 0 : Integer.MAX_VALUE;
+        return newBlockingQueue(size);
+    }
+
+    /**
+     * If our queue blocks on/rejects all submissions, we can configure our core pool size to 0,
+     * as new threads will always be created for new work, and core threads timeout at the same
+     * rate as non-core threads.
+     */
+    int coreThreads()
+    {
+        return (queueLimit != null && queueLimit == 0) || threads == Integer.MAX_VALUE ? 0 : threads;
+    }
+
+    int maxThreads()
+    {
+        return threads;
+    }
+
+    RejectedExecutionHandler rejectedExecutionHandler(RejectedExecutionHandler ifNotSet)
+    {
+        return rejectedExecutionHandler == null ? ifNotSet : rejectedExecutionHandler;
+    }
+
+    long keepAlive()
+    {
+        return keepAlive;
+    }
+
+    TimeUnit keepAliveUnits()
+    {
+        return keepAliveUnits;
+    }
+
+    boolean allowCoreThreadTimeouts()
+    {
+        return allowCoreThreadTimeouts;
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorJMXAdapter.java b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorJMXAdapter.java
new file mode 100644
index 0000000..c596d2b
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorJMXAdapter.java
@@ -0,0 +1,246 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.metrics.ThreadPoolMetrics;
+import org.apache.cassandra.utils.MBeanWrapper;
+
+/**
+ * A {@link ThreadPoolExecutorBase} adapter to expose it via JMX.
+ * The executor is not itself modified to maximise code re-use.
+ * Only its rejected execution handler is updated, and a shutdown listener is registered.
+ */
+@VisibleForTesting
+public class ThreadPoolExecutorJMXAdapter implements Runnable, ResizableThreadPoolMXBean
+{
+    /**
+     * A builder wrapper that delegates all methods except {@link Builder#build()}
+     * @param <E>
+     */
+    static class Builder<E extends ThreadPoolExecutorBase> implements ExecutorBuilder<E>
+    {
+        final ExecutorBuilder<E> wrapped;
+        final String jmxPath;
+        Builder(ExecutorBuilder<E> wrapped, String jmxPath)
+        {
+            this.wrapped = wrapped;
+            this.jmxPath = jmxPath;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withKeepAlive(long keepAlive, TimeUnit keepAliveUnits)
+        {
+            wrapped.withKeepAlive(keepAlive, keepAliveUnits);
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withKeepAlive()
+        {
+            wrapped.withKeepAlive();
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withThreadPriority(int threadPriority)
+        {
+            wrapped.withThreadPriority(threadPriority);
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withQueueLimit(int queueLimit)
+        {
+            wrapped.withQueueLimit(queueLimit);
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withThreadGroup(ThreadGroup threadGroup)
+        {
+            wrapped.withThreadGroup(threadGroup);
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withDefaultThreadGroup()
+        {
+            wrapped.withDefaultThreadGroup();
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withRejectedExecutionHandler(RejectedExecutionHandler rejectedExecutionHandler)
+        {
+            wrapped.withRejectedExecutionHandler(rejectedExecutionHandler);
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withUncaughtExceptionHandler(Thread.UncaughtExceptionHandler uncaughtExceptionHandler)
+        {
+            wrapped.withUncaughtExceptionHandler(uncaughtExceptionHandler);
+            return this;
+        }
+
+        /**
+         * Invoke {@link ExecutorBuilder#build()} on {@link #wrapped}, and register the resultant
+         * {@link ThreadPoolExecutorBase} with a new {@link ThreadPoolExecutorJMXAdapter}.
+         *
+         * The executor constructed by {@link #wrapped} is returned.
+         */
+        @Override
+        public E build()
+        {
+            E result = wrapped.build();
+            register(jmxPath, result);
+            return result;
+        }
+    }
+
+    public static void register(String jmxPath, ThreadPoolExecutorBase executor)
+    {
+        new ThreadPoolExecutorJMXAdapter(jmxPath, executor);
+    }
+
+    final String mbeanName;
+    final ThreadPoolExecutorBase executor;
+    final ThreadPoolMetrics metrics;
+    boolean released;
+
+    private ThreadPoolExecutorJMXAdapter(String jmxPath, ThreadPoolExecutorBase executor)
+    {
+        this.executor = executor;
+        this.mbeanName = "org.apache.cassandra." + jmxPath + ":type=" + executor.getThreadFactory().id;
+        this.metrics = new ThreadPoolMetrics(executor, jmxPath, executor.getThreadFactory().id).register();
+        executor.setRejectedExecutionHandler(rejectedExecutionHandler(metrics, executor.getRejectedExecutionHandler()));
+        MBeanWrapper.instance.registerMBean(this, mbeanName);
+        executor.onShutdown(this);
+    }
+
+    @Override
+    public synchronized void run()
+    {
+        if (released)
+            return;
+
+        MBeanWrapper.instance.unregisterMBean(mbeanName);
+        metrics.release();
+        released = true;
+    }
+
+    public ThreadPoolMetrics metrics()
+    {
+        return metrics;
+    }
+
+    @Override
+    public int getActiveTaskCount()
+    {
+        return executor.getActiveTaskCount();
+    }
+
+    @Override
+    public int getPendingTaskCount()
+    {
+        return executor.getPendingTaskCount();
+    }
+
+    @Override
+    public int getCoreThreads()
+    {
+        return executor.getCoreThreads();
+    }
+
+    @Override
+    public void setCoreThreads(int number)
+    {
+        executor.setCoreThreads(number);
+    }
+
+    @Override
+    public int getMaximumThreads()
+    {
+        return executor.getMaximumThreads();
+    }
+
+    @Override
+    public void setMaximumThreads(int number)
+    {
+        executor.setMaximumThreads(number);
+    }
+
+    @Override
+    public void setCorePoolSize(int corePoolSize)
+    {
+        executor.setCorePoolSize(corePoolSize);
+    }
+
+    @Override
+    public int getCorePoolSize()
+    {
+        return executor.getCorePoolSize();
+    }
+
+    @Override
+    public void setMaximumPoolSize(int maximumPoolSize)
+    {
+        executor.setMaximumPoolSize(maximumPoolSize);
+    }
+
+    @Override
+    public int getMaximumPoolSize()
+    {
+        return executor.getMaximumPoolSize();
+    }
+
+    @Override
+    public long getCompletedTaskCount()
+    {
+        return executor.getCompletedTaskCount();
+    }
+
+    @Override
+    public int getMaxTasksQueued()
+    {
+        return executor.getMaxTasksQueued();
+    }
+
+    static RejectedExecutionHandler rejectedExecutionHandler(ThreadPoolMetrics metrics, RejectedExecutionHandler wrap)
+    {
+        return (task, executor) ->
+        {
+            metrics.totalBlocked.inc();
+            metrics.currentBlocked.inc();
+            try
+            {
+                wrap.rejectedExecution(task, executor);
+            }
+            finally
+            {
+                metrics.currentBlocked.dec();
+            }
+        };
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorPlus.java
new file mode 100644
index 0000000..ad735d9
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/ThreadPoolExecutorPlus.java
@@ -0,0 +1,125 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.RunnableFuture;
+
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Future;
+
+/**
+ * This class inherits Executor best practices from {@link ThreadPoolExecutorBase}
+ * and {@link ThreadPoolExecutorBuilder}. Most Cassandra executors should use or extend this.
+ *
+ * This class' addition is to abstract the semantics of task encapsulation to handle
+ * exceptions and {@link ExecutorLocals}. See {@link TaskFactory} for more detail.
+ */
+public class ThreadPoolExecutorPlus extends ThreadPoolExecutorBase implements ExecutorPlus
+{
+    final TaskFactory taskFactory;
+
+    ThreadPoolExecutorPlus(ThreadPoolExecutorBuilder<? extends ThreadPoolExecutorPlus> builder)
+    {
+        this(builder, TaskFactory.standard());
+    }
+
+    ThreadPoolExecutorPlus(ThreadPoolExecutorBuilder<? extends ThreadPoolExecutorPlus> builder, TaskFactory taskFactory)
+    {
+        super(builder);
+        this.taskFactory = taskFactory;
+    }
+
+    private <T extends Runnable> T addTask(T task)
+    {
+        super.execute(task);
+        return task;
+    }
+
+    @Override
+    public void execute(Runnable run)
+    {
+        addTask(taskFactory.toExecute(run));
+    }
+
+    @Override
+    public void execute(WithResources withResources, Runnable run)
+    {
+        addTask(taskFactory.toExecute(withResources, run));
+    }
+
+    @Override
+    public Future<?> submit(Runnable run)
+    {
+        return addTask(taskFactory.toSubmit(run));
+    }
+
+    @Override
+    public <T> Future<T> submit(Runnable run, T result)
+    {
+        return addTask(taskFactory.toSubmit(run, result));
+    }
+
+    @Override
+    public <T> Future<T> submit(Callable<T> call)
+    {
+        return addTask(taskFactory.toSubmit(call));
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Runnable run, T result)
+    {
+        return addTask(taskFactory.toSubmit(withResources, run, result));
+    }
+
+    @Override
+    public Future<?> submit(WithResources withResources, Runnable run)
+    {
+        return addTask(taskFactory.toSubmit(withResources, run));
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Callable<T> call)
+    {
+        return addTask(taskFactory.toSubmit(withResources, call));
+    }
+
+    @Override
+    public boolean inExecutor()
+    {
+        return Thread.currentThread().getThreadGroup() == getThreadFactory().threadGroup;
+    }
+
+    @Override
+    protected <T> RunnableFuture<T> newTaskFor(Runnable runnable, T value)
+    {
+        return taskFactory.toSubmit(runnable, value);
+    }
+
+    @Override
+    protected <T> RunnableFuture<T> newTaskFor(Callable<T> callable)
+    {
+        return taskFactory.toSubmit(callable);
+    }
+
+    @Override
+    public int getMaxTasksQueued()
+    {
+        return getQueue().size();
+    }
+}
diff --git a/src/java/org/apache/cassandra/concurrent/WrappedExecutorPlus.java b/src/java/org/apache/cassandra/concurrent/WrappedExecutorPlus.java
new file mode 100644
index 0000000..7408c33
--- /dev/null
+++ b/src/java/org/apache/cassandra/concurrent/WrappedExecutorPlus.java
@@ -0,0 +1,178 @@
+/*
+ * 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.concurrent;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Future;
+
+public class WrappedExecutorPlus implements ExecutorPlus
+{
+    protected final ExecutorPlus executor;
+
+    public WrappedExecutorPlus(ExecutorPlus executor)
+    {
+        this.executor = executor;
+    }
+
+    public void maybeExecuteImmediately(Runnable task)
+    {
+        executor.maybeExecuteImmediately(task);
+    }
+
+    public void execute(WithResources withResources, Runnable task)
+    {
+        executor.execute(withResources, task);
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Callable<T> task)
+    {
+        return executor.submit(withResources, task);
+    }
+
+    @Override
+    public <T> Future<T> submit(WithResources withResources, Runnable task, T result)
+    {
+        return executor.submit(withResources, task, result);
+    }
+
+    @Override
+    public Future<?> submit(WithResources withResources, Runnable task)
+    {
+        return executor.submit(withResources, task);
+    }
+
+    @Override
+    public boolean inExecutor()
+    {
+        return executor.inExecutor();
+    }
+
+    public <T> Future<T> submit(Callable<T> task)
+    {
+        return executor.submit(task);
+    }
+
+    public <T> Future<T> submit(Runnable task, T result)
+    {
+        return executor.submit(task, result);
+    }
+
+    public Future<?> submit(Runnable task)
+    {
+        return executor.submit(task);
+    }
+
+    public int getActiveTaskCount()
+    {
+        return executor.getActiveTaskCount();
+    }
+
+    public long getCompletedTaskCount()
+    {
+        return executor.getCompletedTaskCount();
+    }
+
+    public int getPendingTaskCount()
+    {
+        return executor.getPendingTaskCount();
+    }
+
+    public int getMaxTasksQueued()
+    {
+        return executor.getMaxTasksQueued();
+    }
+
+    public int getCorePoolSize()
+    {
+        return executor.getCorePoolSize();
+    }
+
+    public void setCorePoolSize(int newCorePoolSize)
+    {
+        executor.setCorePoolSize(newCorePoolSize);
+    }
+
+    public int getMaximumPoolSize()
+    {
+        return executor.getMaximumPoolSize();
+    }
+
+    public void setMaximumPoolSize(int newMaximumPoolSize)
+    {
+        executor.setMaximumPoolSize(newMaximumPoolSize);
+    }
+
+    public <T> List<java.util.concurrent.Future<T>> invokeAll(Collection<? extends Callable<T>> tasks) throws InterruptedException
+    {
+        return executor.invokeAll(tasks);
+    }
+
+    public <T> List<java.util.concurrent.Future<T>> invokeAll(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException
+    {
+        return executor.invokeAll(tasks, timeout, unit);
+    }
+
+    public <T> T invokeAny(Collection<? extends Callable<T>> tasks) throws InterruptedException, ExecutionException
+    {
+        return executor.invokeAny(tasks);
+    }
+
+    public <T> T invokeAny(Collection<? extends Callable<T>> tasks, long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
+    {
+        return executor.invokeAny(tasks, timeout, unit);
+    }
+
+    public void shutdown()
+    {
+        executor.shutdown();
+    }
+
+    public List<Runnable> shutdownNow()
+    {
+        return executor.shutdownNow();
+    }
+
+    public boolean isShutdown()
+    {
+        return executor.isShutdown();
+    }
+
+    public boolean isTerminated()
+    {
+        return executor.isTerminated();
+    }
+
+    public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
+    {
+        return executor.awaitTermination(timeout, unit);
+    }
+
+    public void execute(Runnable task)
+    {
+        executor.execute(task);
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java
index 67de29b..3e45ebc 100644
--- a/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java
+++ b/src/java/org/apache/cassandra/config/CassandraRelevantProperties.java
@@ -21,6 +21,7 @@
 import java.util.concurrent.TimeUnit;
 
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.service.FileSystemOwnershipCheck;
 
 /** A class that extracts system properties for the cassandra node it runs within. */
 public enum CassandraRelevantProperties
@@ -95,8 +96,9 @@
      */
     COM_SUN_MANAGEMENT_JMXREMOTE_RMI_PORT ("com.sun.management.jmxremote.rmi.port", "0"),
 
-    /** Cassandra jmx remote port */
+    /** Cassandra jmx remote and local port */
     CASSANDRA_JMX_REMOTE_PORT("cassandra.jmx.remote.port"),
+    CASSANDRA_JMX_LOCAL_PORT("cassandra.jmx.local.port"),
 
     /** 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"),
@@ -138,6 +140,8 @@
     /** mx4jport */
     MX4JPORT ("mx4jport"),
 
+    RING_DELAY("cassandra.ring_delay_ms"),
+
     /**
      * 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.
@@ -159,10 +163,14 @@
      */
     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"),
 
     IGNORED_SCHEMA_CHECK_ENDPOINTS("cassandra.skip_schema_check_for_endpoints"),
 
+    SHUTDOWN_ANNOUNCE_DELAY_IN_MS("cassandra.shutdown_announce_in_ms", "2000"),
+
     /**
      * 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
@@ -171,6 +179,22 @@
     REPLACEMENT_ALLOW_EMPTY("cassandra.allow_empty_replace_address", "true"),
 
     /**
+     * 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"),
@@ -186,25 +210,93 @@
 
     DEFAULT_PROVIDE_OVERLAPPING_TOMBSTONES ("default.provide.overlapping.tombstones"),
     ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION ("org.apache.cassandra.disable_mbean_registration"),
-    //only for testing
-    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"),
 
     /** 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"),
+
     /** 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"),
+
+    MEMTABLE_OVERHEAD_SIZE("cassandra.memtable.row_overhead_size", "-1"),
+    MEMTABLE_OVERHEAD_COMPUTE_STEPS("cassandra.memtable_row_overhead_computation_step", "100000"),
     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"),
-    /**
-     * Minimum delay after a failed pull request before it is reattempted. It prevents reattempting failed requests
-     * immediately as it is high chance they will fail anyway. It is better to wait a bit instead of flooding logs
-     * and wasting resources.
-     */
-    SCHEMA_PULL_BACKOFF_DELAY_MS("cassandra.schema_pull_backoff_delay_ms", "3000"),
+
+    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))),
+
+    // 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"),
+
+    /** 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"),
 
     /** 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.*/
@@ -255,6 +347,16 @@
     }
 
     /**
+     * Returns default value.
+     *
+     * @return default value, if any, otherwise null.
+     */
+    public String getDefaultValue()
+    {
+        return defaultVal;
+    }
+
+    /**
      * Sets the property to its default value if a default value was specified. Remove the property otherwise.
      */
     public void reset()
@@ -278,6 +380,15 @@
         return STRING_CONVERTER.convert(value);
     }
 
+    public <T> T convert(PropertyConverter<T> converter)
+    {
+        String value = System.getProperty(key);
+        if (value == null)
+            value = defaultVal;
+
+        return converter.convert(value);
+    }
+
     /**
      * Sets the value into system properties.
      * @param value to set
@@ -333,6 +444,17 @@
 
     /**
      * Gets the value of a system property as a int.
+     * @return system property int value if it exists, defaultValue otherwise.
+     */
+    public long getLong()
+    {
+        String value = System.getProperty(key);
+
+        return LONG_CONVERTER.convert(value == null ? defaultVal : value);
+    }
+
+    /**
+     * Gets the value of a system property as a int.
      * @return system property int value if it exists, overrideDefaultValue otherwise.
      */
     public int getInt(int overrideDefaultValue)
@@ -353,7 +475,16 @@
         System.setProperty(key, Integer.toString(value));
     }
 
-    private interface PropertyConverter<T>
+    /**
+     * Sets the value into system properties.
+     * @param value to set
+     */
+    public void setLong(long value)
+    {
+        System.setProperty(key, Long.toString(value));
+    }
+
+    public interface PropertyConverter<T>
     {
         T convert(String value);
     }
@@ -375,6 +506,19 @@
         }
     };
 
+    private static final PropertyConverter<Long> LONG_CONVERTER = value ->
+    {
+        try
+        {
+            return Long.decode(value);
+        }
+        catch (NumberFormatException e)
+        {
+            throw new ConfigurationException(String.format("Invalid value for system property: " +
+                                                           "expected integer value but got '%s'", value));
+        }
+    };
+
     /**
      * @return whether a system property is present or not.
      */
diff --git a/src/java/org/apache/cassandra/config/Config.java b/src/java/org/apache/cassandra/config/Config.java
index f8d8d46..8a59ca2 100644
--- a/src/java/org/apache/cassandra/config/Config.java
+++ b/src/java/org/apache/cassandra/config/Config.java
@@ -19,23 +19,28 @@
 
 import java.lang.reflect.Field;
 import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
-import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 
+import javax.annotation.Nullable;
+
 import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.audit.AuditLogOptions;
-import org.apache.cassandra.fql.FullQueryLoggerOptions;
 import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.fql.FullQueryLoggerOptions;
+import org.apache.cassandra.service.StartupChecks.StartupCheckType;
 
 /**
  * A class that contains configuration properties for the cassandra node it runs within.
@@ -46,6 +51,20 @@
 {
     private static final Logger logger = LoggerFactory.getLogger(Config.class);
 
+    public static Set<String> splitCommaDelimited(String src)
+    {
+        if (src == null)
+            return ImmutableSet.of();
+        String[] split = src.split(",\\s*");
+        ImmutableSet.Builder<String> builder = ImmutableSet.builder();
+        for (String s : split)
+        {
+            s = s.trim();
+            if (!s.isEmpty())
+                builder.add(s);
+        }
+        return builder.build();
+    }
     /*
      * Prefix for Java properties for internal Cassandra configuration options
      */
@@ -56,15 +75,24 @@
     public String authorizer;
     public String role_manager;
     public String network_authorizer;
-    public volatile int permissions_validity_in_ms = 2000;
+    @Replaces(oldName = "permissions_validity_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound permissions_validity = new DurationSpec.IntMillisecondsBound("2s");
     public volatile int permissions_cache_max_entries = 1000;
-    public volatile int permissions_update_interval_in_ms = -1;
-    public volatile int roles_validity_in_ms = 2000;
+    @Replaces(oldName = "permissions_update_interval_in_ms", converter = Converters.MILLIS_CUSTOM_DURATION, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound permissions_update_interval = null;
+    public volatile boolean permissions_cache_active_update = false;
+    @Replaces(oldName = "roles_validity_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound roles_validity = new DurationSpec.IntMillisecondsBound("2s");
     public volatile int roles_cache_max_entries = 1000;
-    public volatile int roles_update_interval_in_ms = -1;
-    public volatile int credentials_validity_in_ms = 2000;
+    @Replaces(oldName = "roles_update_interval_in_ms", converter = Converters.MILLIS_CUSTOM_DURATION, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound roles_update_interval = null;
+    public volatile boolean roles_cache_active_update = false;
+    @Replaces(oldName = "credentials_validity_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound credentials_validity = new DurationSpec.IntMillisecondsBound("2s");
     public volatile int credentials_cache_max_entries = 1000;
-    public volatile int credentials_update_interval_in_ms = -1;
+    @Replaces(oldName = "credentials_update_interval_in_ms", converter = Converters.MILLIS_CUSTOM_DURATION, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound credentials_update_interval = null;
+    public volatile boolean credentials_cache_active_update = false;
 
     /* Hashing strategy Random or OPHF */
     public String partitioner;
@@ -72,8 +100,10 @@
     public boolean auto_bootstrap = true;
     public volatile boolean hinted_handoff_enabled = true;
     public Set<String> hinted_handoff_disabled_datacenters = Sets.newConcurrentHashSet();
-    public volatile int max_hint_window_in_ms = 3 * 3600 * 1000; // three hours
+    @Replaces(oldName = "max_hint_window_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound max_hint_window = new DurationSpec.IntMillisecondsBound("3h");
     public String hints_directory;
+    public boolean hint_window_persistent_enabled = true;
 
     public volatile boolean force_new_prepared_statement_behaviour = false;
 
@@ -83,6 +113,8 @@
     public DiskFailurePolicy disk_failure_policy = DiskFailurePolicy.ignore;
     public CommitFailurePolicy commit_failure_policy = CommitFailurePolicy.stop;
 
+    public volatile boolean use_deterministic_table_id = false;
+
     /* initial token in the ring */
     public String initial_token;
     public Integer num_tokens;
@@ -91,28 +123,42 @@
     /** Triggers automatic allocation of tokens if set, based on the provided replica count for a datacenter */
     public Integer allocate_tokens_for_local_replication_factor = null;
 
-    public long native_transport_idle_timeout_in_ms = 0L;
+    @Replaces(oldName = "native_transport_idle_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public DurationSpec.LongMillisecondsBound native_transport_idle_timeout = new DurationSpec.LongMillisecondsBound("0ms");
 
-    public volatile long request_timeout_in_ms = 10000L;
+    @Replaces(oldName = "request_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound request_timeout = new DurationSpec.LongMillisecondsBound("10000ms");
 
-    public volatile long read_request_timeout_in_ms = 5000L;
+    @Replaces(oldName = "read_request_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound read_request_timeout = new DurationSpec.LongMillisecondsBound("5000ms");
 
-    public volatile long range_request_timeout_in_ms = 10000L;
+    @Replaces(oldName = "range_request_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound range_request_timeout = new DurationSpec.LongMillisecondsBound("10000ms");
 
-    public volatile long write_request_timeout_in_ms = 2000L;
+    @Replaces(oldName = "write_request_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound write_request_timeout = new DurationSpec.LongMillisecondsBound("2000ms");
 
-    public volatile long counter_write_request_timeout_in_ms = 5000L;
+    @Replaces(oldName = "counter_write_request_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound counter_write_request_timeout = new DurationSpec.LongMillisecondsBound("5000ms");
 
-    public volatile long cas_contention_timeout_in_ms = 1000L;
+    @Replaces(oldName = "cas_contention_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound cas_contention_timeout = new DurationSpec.LongMillisecondsBound("1800ms");
 
-    public volatile long truncate_request_timeout_in_ms = 60000L;
+    @Replaces(oldName = "truncate_request_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound truncate_request_timeout = new DurationSpec.LongMillisecondsBound("60000ms");
+
+    @Replaces(oldName = "repair_request_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound repair_request_timeout = new DurationSpec.LongMillisecondsBound("120000ms");
 
     public Integer streaming_connections_per_host = 1;
-    public Integer streaming_keep_alive_period_in_secs = 300; //5 minutes
+    @Replaces(oldName = "streaming_keep_alive_period_in_secs", converter = Converters.SECONDS_DURATION, deprecated = true)
+    public DurationSpec.IntSecondsBound streaming_keep_alive_period = new DurationSpec.IntSecondsBound("300s");
 
-    public boolean cross_node_timeout = true;
+    @Replaces(oldName = "cross_node_timeout", converter = Converters.IDENTITY, deprecated = true)
+    public boolean internode_timeout = true;
 
-    public volatile long slow_query_log_timeout_in_ms = 500L;
+    @Replaces(oldName = "slow_query_log_timeout_in_ms", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public volatile DurationSpec.LongMillisecondsBound slow_query_log_timeout = new DurationSpec.LongMillisecondsBound("500ms");
 
     public volatile double phi_convict_threshold = 8.0;
 
@@ -120,21 +166,34 @@
     public int concurrent_writes = 32;
     public int concurrent_counter_writes = 32;
     public int concurrent_materialized_view_writes = 32;
+    public int available_processors = -1;
 
     @Deprecated
     public Integer concurrent_replicates = null;
 
     public int memtable_flush_writers = 0;
-    public Integer memtable_heap_space_in_mb;
-    public Integer memtable_offheap_space_in_mb;
+    @Replaces(oldName = "memtable_heap_space_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound memtable_heap_space;
+    @Replaces(oldName = "memtable_offheap_space_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound memtable_offheap_space;
     public Float memtable_cleanup_threshold = null;
 
+    public static class MemtableOptions
+    {
+        public LinkedHashMap<String, InheritingClass> configurations; // order must be preserved
+
+        public MemtableOptions()
+        {
+        }
+    }
+
+    public MemtableOptions memtable;
+
     // Limit the maximum depth of repair session merkle trees
     @Deprecated
     public volatile Integer repair_session_max_tree_depth = null;
-    public volatile Integer repair_session_space_in_mb = null;
-
-    public volatile long repair_request_timeout_in_ms = TimeUnit.MILLISECONDS.convert(1, TimeUnit.MINUTES);
+    @Replaces(oldName = "repair_session_space_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public volatile DataStorageSpec.IntMebibytesBound repair_session_space = null;
 
     public volatile boolean use_offheap_merkle_trees = true;
 
@@ -147,6 +206,8 @@
     public boolean listen_on_broadcast_address = false;
     public String internode_authenticator;
 
+    public boolean traverse_auth_from_root = false;
+
     /*
      * RPC address and interface refer to the address/interface used for the native protocol used to communicate with
      * clients. It's still called RPC in some places even though Thrift RPC is gone. If you see references to native
@@ -160,71 +221,109 @@
     public String broadcast_rpc_address;
     public boolean rpc_keepalive = true;
 
-    public Integer internode_max_message_size_in_bytes;
+    @Replaces(oldName = "internode_max_message_size_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated=true)
+    public DataStorageSpec.IntBytesBound internode_max_message_size;
 
-    @Replaces(oldName = "internode_send_buff_size_in_bytes", deprecated = true)
-    public int internode_socket_send_buffer_size_in_bytes = 0;
-    @Replaces(oldName = "internode_recv_buff_size_in_bytes", deprecated = true)
-    public int internode_socket_receive_buffer_size_in_bytes = 0;
+    @Replaces(oldName = "internode_socket_send_buffer_size_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    @Replaces(oldName = "internode_send_buff_size_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_socket_send_buffer_size = new DataStorageSpec.IntBytesBound("0B");
+    @Replaces(oldName = "internode_socket_receive_buffer_size_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    @Replaces(oldName = "internode_recv_buff_size_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_socket_receive_buffer_size = new DataStorageSpec.IntBytesBound("0B");
 
     // TODO: derive defaults from system memory settings?
-    public int internode_application_send_queue_capacity_in_bytes = 1 << 22; // 4MiB
-    public int internode_application_send_queue_reserve_endpoint_capacity_in_bytes = 1 << 27; // 128MiB
-    public int internode_application_send_queue_reserve_global_capacity_in_bytes = 1 << 29; // 512MiB
+    @Replaces(oldName = "internode_application_send_queue_capacity_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_application_send_queue_capacity = new DataStorageSpec.IntBytesBound("4MiB");
+    @Replaces(oldName = "internode_application_send_queue_reserve_endpoint_capacity_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_application_send_queue_reserve_endpoint_capacity = new DataStorageSpec.IntBytesBound("128MiB");
+    @Replaces(oldName = "internode_application_send_queue_reserve_global_capacity_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_application_send_queue_reserve_global_capacity = new DataStorageSpec.IntBytesBound("512MiB");
 
-    public int internode_application_receive_queue_capacity_in_bytes = 1 << 22; // 4MiB
-    public int internode_application_receive_queue_reserve_endpoint_capacity_in_bytes = 1 << 27; // 128MiB
-    public int internode_application_receive_queue_reserve_global_capacity_in_bytes = 1 << 29; // 512MiB
+    @Replaces(oldName = "internode_application_receive_queue_capacity_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_application_receive_queue_capacity = new DataStorageSpec.IntBytesBound("4MiB");
+    @Replaces(oldName = "internode_application_receive_queue_reserve_endpoint_capacity_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_application_receive_queue_reserve_endpoint_capacity = new DataStorageSpec.IntBytesBound("128MiB");
+    @Replaces(oldName = "internode_application_receive_queue_reserve_global_capacity_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound internode_application_receive_queue_reserve_global_capacity = new DataStorageSpec.IntBytesBound("512MiB");
 
     // Defensive settings for protecting Cassandra from true network partitions. See (CASSANDRA-14358) for details.
     // The amount of time to wait for internode tcp connections to establish.
-    public volatile int internode_tcp_connect_timeout_in_ms = 2000;
+    @Replaces(oldName = "internode_tcp_connect_timeout_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound internode_tcp_connect_timeout = new DurationSpec.IntMillisecondsBound("2s");
     // The amount of time unacknowledged data is allowed on a connection before we throw out the connection
     // Note this is only supported on Linux + epoll, and it appears to behave oddly above a setting of 30000
     // (it takes much longer than 30s) as of Linux 4.12. If you want something that high set this to 0
     // (which picks up the OS default) and configure the net.ipv4.tcp_retries2 sysctl to be ~8.
-    public volatile int internode_tcp_user_timeout_in_ms = 30000;
-    // Similar to internode_tcp_user_timeout_in_ms but used specifically for streaming connection.
+    @Replaces(oldName = "internode_tcp_user_timeout_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound internode_tcp_user_timeout = new DurationSpec.IntMillisecondsBound("30s");
+    // Similar to internode_tcp_user_timeout but used specifically for streaming connection.
     // The default is 5 minutes. Increase it or set it to 0 in order to increase the timeout.
-    public volatile int internode_streaming_tcp_user_timeout_in_ms = 300_000; // 5 minutes
+    @Replaces(oldName = "internode_streaming_tcp_user_timeout_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound internode_streaming_tcp_user_timeout = new DurationSpec.IntMillisecondsBound("300s"); // 5 minutes
 
     public boolean start_native_transport = true;
     public int native_transport_port = 9042;
     public Integer native_transport_port_ssl = null;
     public int native_transport_max_threads = 128;
-    public int native_transport_max_frame_size_in_mb = 256;
+    @Replaces(oldName = "native_transport_max_frame_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound native_transport_max_frame_size = new DataStorageSpec.IntMebibytesBound("16MiB");
     public volatile long native_transport_max_concurrent_connections = -1L;
     public volatile long native_transport_max_concurrent_connections_per_ip = -1L;
     public boolean native_transport_flush_in_batches_legacy = false;
     public volatile boolean native_transport_allow_older_protocols = true;
-    public volatile long native_transport_max_concurrent_requests_in_bytes_per_ip = -1L;
-    public volatile long native_transport_max_concurrent_requests_in_bytes = -1L;
-    public int native_transport_receive_queue_capacity_in_bytes = 1 << 20; // 1MiB
+    // Below 2 parameters were fixed in 4.0 + to get default value when ==-1 (old name and value format) or ==null(new name and value format),
+    // not <=0 as it is in previous versions. Throwing config exceptions on < -1
+    @Replaces(oldName = "native_transport_max_concurrent_requests_in_bytes_per_ip", converter = Converters.BYTES_CUSTOM_DATASTORAGE, deprecated = true)
+    public volatile DataStorageSpec.LongBytesBound native_transport_max_request_data_in_flight_per_ip = null;
+    @Replaces(oldName = "native_transport_max_concurrent_requests_in_bytes", converter = Converters.BYTES_CUSTOM_DATASTORAGE, deprecated = true)
+    public volatile DataStorageSpec.LongBytesBound native_transport_max_request_data_in_flight = null;
+    public volatile boolean native_transport_rate_limiting_enabled = false;
+    public volatile int native_transport_max_requests_per_second = 1000000;
+    @Replaces(oldName = "native_transport_receive_queue_capacity_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntBytesBound native_transport_receive_queue_capacity = new DataStorageSpec.IntBytesBound("1MiB");
 
     @Deprecated
     public Integer native_transport_max_negotiable_protocol_version = null;
 
     /**
-     * Max size of values in SSTables, in MegaBytes.
-     * Default is the same as the native protocol frame limit: 256Mb.
+     * Max size of values in SSTables, in MebiBytes.
+     * Default is the same as the native protocol frame limit: 256MiB.
      * See AbstractType for how it is used.
      */
-    public int max_value_size_in_mb = 256;
+    @Replaces(oldName = "max_value_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound max_value_size = new DataStorageSpec.IntMebibytesBound("256MiB");
 
     public boolean snapshot_before_compaction = false;
     public boolean auto_snapshot = true;
+
+    /**
+     * When auto_snapshot is true and this property
+     * is set, snapshots created by truncation or
+     * drop use this TTL.
+     */
+    public String auto_snapshot_ttl;
+
     public volatile long snapshot_links_per_second = 0;
 
     /* if the size of columns or super-columns are more than this, indexing will kick in */
-    public int column_index_size_in_kb = 64;
-    public volatile int column_index_cache_size_in_kb = 2;
-    public volatile int batch_size_warn_threshold_in_kb = 5;
-    public volatile int batch_size_fail_threshold_in_kb = 50;
+    @Replaces(oldName = "column_index_size_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public volatile DataStorageSpec.IntKibibytesBound column_index_size = new DataStorageSpec.IntKibibytesBound("64KiB");
+    @Replaces(oldName = "column_index_cache_size_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public volatile DataStorageSpec.IntKibibytesBound column_index_cache_size = new DataStorageSpec.IntKibibytesBound("2KiB");
+    @Replaces(oldName = "batch_size_warn_threshold_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public volatile DataStorageSpec.IntKibibytesBound batch_size_warn_threshold = new DataStorageSpec.IntKibibytesBound("5KiB");
+    @Replaces(oldName = "batch_size_fail_threshold_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public volatile DataStorageSpec.IntKibibytesBound batch_size_fail_threshold = new DataStorageSpec.IntKibibytesBound("50KiB");
+
     public Integer unlogged_batch_across_partitions_warn_threshold = 10;
     public volatile Integer concurrent_compactors;
-    public volatile int compaction_throughput_mb_per_sec = 64;
-    public volatile int compaction_large_partition_warning_threshold_mb = 100;
-    public int min_free_space_per_drive_in_mb = 50;
+    @Replaces(oldName = "compaction_throughput_mb_per_sec", converter = Converters.MEBIBYTES_PER_SECOND_DATA_RATE, deprecated = true)
+    public volatile DataRateSpec.LongBytesPerSecondBound compaction_throughput = new DataRateSpec.LongBytesPerSecondBound("64MiB/s");
+    @Replaces(oldName = "compaction_large_partition_warning_threshold_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public volatile DataStorageSpec.IntMebibytesBound compaction_large_partition_warning_threshold = new DataStorageSpec.IntMebibytesBound("100MiB");
+    @Replaces(oldName = "min_free_space_per_drive_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound min_free_space_per_drive = new DataStorageSpec.IntMebibytesBound("50MiB");
+    public volatile Integer compaction_tombstone_warning_threshold = 100000;
 
     public volatile int concurrent_materialized_view_builders = 1;
     public volatile int reject_repair_compaction_threshold = Integer.MAX_VALUE;
@@ -235,8 +334,13 @@
     @Deprecated
     public int max_streaming_retries = 3;
 
-    public volatile int stream_throughput_outbound_megabits_per_sec = 200;
-    public volatile int inter_dc_stream_throughput_outbound_megabits_per_sec = 200;
+    @Replaces(oldName = "stream_throughput_outbound_megabits_per_sec", converter = Converters.MEGABITS_TO_BYTES_PER_SECOND_DATA_RATE, deprecated = true)
+    public volatile DataRateSpec.LongBytesPerSecondBound stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound("24MiB/s");
+    @Replaces(oldName = "inter_dc_stream_throughput_outbound_megabits_per_sec", converter = Converters.MEGABITS_TO_BYTES_PER_SECOND_DATA_RATE, deprecated = true)
+    public volatile DataRateSpec.LongBytesPerSecondBound inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound("24MiB/s");
+
+    public volatile DataRateSpec.LongBytesPerSecondBound entire_sstable_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound("24MiB/s");
+    public volatile DataRateSpec.LongBytesPerSecondBound entire_sstable_inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound("24MiB/s");
 
     public String[] data_file_directories = new String[0];
 
@@ -250,88 +354,124 @@
 
     // Commit Log
     public String commitlog_directory;
-    public Integer commitlog_total_space_in_mb;
+    @Replaces(oldName = "commitlog_total_space_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound commitlog_total_space;
     public CommitLogSync commitlog_sync;
 
     /**
      * @deprecated since 4.0 This value was near useless, and we're not using it anymore
      */
     public double commitlog_sync_batch_window_in_ms = Double.NaN;
-    public double commitlog_sync_group_window_in_ms = Double.NaN;
-    public int commitlog_sync_period_in_ms;
-    public int commitlog_segment_size_in_mb = 32;
+    @Replaces(oldName = "commitlog_sync_group_window_in_ms", converter = Converters.MILLIS_DURATION_DOUBLE, deprecated = true)
+    public DurationSpec.IntMillisecondsBound commitlog_sync_group_window = new DurationSpec.IntMillisecondsBound("0ms");
+    @Replaces(oldName = "commitlog_sync_period_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public DurationSpec.IntMillisecondsBound commitlog_sync_period = new DurationSpec.IntMillisecondsBound("0ms");
+    @Replaces(oldName = "commitlog_segment_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound commitlog_segment_size = new DataStorageSpec.IntMebibytesBound("32MiB");
     public ParameterizedClass commitlog_compression;
     public FlushCompression flush_compression = FlushCompression.fast;
     public int commitlog_max_compression_buffers_in_pool = 3;
-    public Integer periodic_commitlog_sync_lag_block_in_ms;
+    @Replaces(oldName = "periodic_commitlog_sync_lag_block_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public DurationSpec.IntMillisecondsBound periodic_commitlog_sync_lag_block;
     public TransparentDataEncryptionOptions transparent_data_encryption_options = new TransparentDataEncryptionOptions();
 
-    public Integer max_mutation_size_in_kb;
+    @Replaces(oldName = "max_mutation_size_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntKibibytesBound max_mutation_size;
 
     // Change-data-capture logs
     public boolean cdc_enabled = false;
+    // When true, new CDC mutations are rejected/blocked when reaching max CDC storage.
+    // When false, new CDC mutations can always be added. But it will remove the oldest CDC commit log segment on full.
+    public volatile boolean cdc_block_writes = true;
     public String cdc_raw_directory;
-    public int cdc_total_space_in_mb = 0;
-    public int cdc_free_space_check_interval_ms = 250;
+    @Replaces(oldName = "cdc_total_space_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound cdc_total_space = new DataStorageSpec.IntMebibytesBound("0MiB");
+    @Replaces(oldName = "cdc_free_space_check_interval_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public DurationSpec.IntMillisecondsBound cdc_free_space_check_interval = new DurationSpec.IntMillisecondsBound("250ms");
 
     @Deprecated
     public int commitlog_periodic_queue_size = -1;
 
     public String endpoint_snitch;
     public boolean dynamic_snitch = true;
-    public int dynamic_snitch_update_interval_in_ms = 100;
-    public int dynamic_snitch_reset_interval_in_ms = 600000;
+    @Replaces(oldName = "dynamic_snitch_update_interval_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public DurationSpec.IntMillisecondsBound dynamic_snitch_update_interval = new DurationSpec.IntMillisecondsBound("100ms");
+    @Replaces(oldName = "dynamic_snitch_reset_interval_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public DurationSpec.IntMillisecondsBound dynamic_snitch_reset_interval = new DurationSpec.IntMillisecondsBound("10m");
     public double dynamic_snitch_badness_threshold = 1.0;
 
+    public String failure_detector = "FailureDetector";
+
     public EncryptionOptions.ServerEncryptionOptions server_encryption_options = new EncryptionOptions.ServerEncryptionOptions();
     public EncryptionOptions client_encryption_options = new EncryptionOptions();
 
     public InternodeCompression internode_compression = InternodeCompression.none;
 
-    public int hinted_handoff_throttle_in_kb = 1024;
-    public int batchlog_replay_throttle_in_kb = 1024;
+    @Replaces(oldName = "hinted_handoff_throttle_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntKibibytesBound hinted_handoff_throttle = new DataStorageSpec.IntKibibytesBound("1024KiB");
+    @Replaces(oldName = "batchlog_replay_throttle_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntKibibytesBound batchlog_replay_throttle = new DataStorageSpec.IntKibibytesBound("1024KiB");
     public int max_hints_delivery_threads = 2;
-    public int hints_flush_period_in_ms = 10000;
-    public int max_hints_file_size_in_mb = 128;
+    @Replaces(oldName = "hints_flush_period_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public DurationSpec.IntMillisecondsBound hints_flush_period = new DurationSpec.IntMillisecondsBound("10s");
+    @Replaces(oldName = "max_hints_file_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound max_hints_file_size = new DataStorageSpec.IntMebibytesBound("128MiB");
+    public volatile DataStorageSpec.LongBytesBound max_hints_size_per_host = new DataStorageSpec.LongBytesBound("0B"); // 0 means disabled
+
     public ParameterizedClass hints_compression;
+    public volatile boolean auto_hints_cleanup_enabled = false;
 
     public volatile boolean incremental_backups = false;
     public boolean trickle_fsync = false;
-    public int trickle_fsync_interval_in_kb = 10240;
+    @Replaces(oldName = "trickle_fsync_interval_in_kb", converter = Converters.KIBIBYTES_DATASTORAGE, deprecated = true)
+    public DataStorageSpec.IntKibibytesBound trickle_fsync_interval = new DataStorageSpec.IntKibibytesBound("10240KiB");
 
-    public volatile int sstable_preemptive_open_interval_in_mb = 50;
+    @Nullable
+    @Replaces(oldName = "sstable_preemptive_open_interval_in_mb", converter = Converters.NEGATIVE_MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public volatile DataStorageSpec.IntMebibytesBound sstable_preemptive_open_interval = new DataStorageSpec.IntMebibytesBound("50MiB");
 
     public volatile boolean key_cache_migrate_during_compaction = true;
-    public Long key_cache_size_in_mb = null;
-    public volatile int key_cache_save_period = 14400;
     public volatile int key_cache_keys_to_save = Integer.MAX_VALUE;
+    @Replaces(oldName = "key_cache_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_LONG, deprecated = true)
+    public DataStorageSpec.LongMebibytesBound key_cache_size = null;
+    @Replaces(oldName = "key_cache_save_period", converter = Converters.SECONDS_CUSTOM_DURATION)
+    public volatile DurationSpec.IntSecondsBound key_cache_save_period = new DurationSpec.IntSecondsBound("4h");
 
     public String row_cache_class_name = "org.apache.cassandra.cache.OHCProvider";
-    public long row_cache_size_in_mb = 0;
-    public volatile int row_cache_save_period = 0;
+    @Replaces(oldName = "row_cache_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_LONG, deprecated = true)
+    public DataStorageSpec.LongMebibytesBound row_cache_size = new DataStorageSpec.LongMebibytesBound("0MiB");
+    @Replaces(oldName = "row_cache_save_period", converter = Converters.SECONDS_CUSTOM_DURATION)
+    public volatile DurationSpec.IntSecondsBound row_cache_save_period = new DurationSpec.IntSecondsBound("0s");
     public volatile int row_cache_keys_to_save = Integer.MAX_VALUE;
 
-    public Long counter_cache_size_in_mb = null;
-    public volatile int counter_cache_save_period = 7200;
+    @Replaces(oldName = "counter_cache_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_LONG, deprecated = true)
+    public DataStorageSpec.LongMebibytesBound counter_cache_size = null;
+    @Replaces(oldName = "counter_cache_save_period", converter = Converters.SECONDS_CUSTOM_DURATION)
+    public volatile DurationSpec.IntSecondsBound counter_cache_save_period = new DurationSpec.IntSecondsBound("7200s");
     public volatile int counter_cache_keys_to_save = Integer.MAX_VALUE;
 
-    public int cache_load_timeout_seconds = 30;
+    public DataStorageSpec.LongMebibytesBound paxos_cache_size = null;
+
+    @Replaces(oldName = "cache_load_timeout_seconds", converter = Converters.NEGATIVE_SECONDS_DURATION, deprecated = true)
+    public DurationSpec.IntSecondsBound cache_load_timeout = new DurationSpec.IntSecondsBound("30s");
 
     private static boolean isClientMode = false;
     private static Supplier<Config> overrideLoadConfig = null;
 
-    public Integer networking_cache_size_in_mb;
+    @Replaces(oldName = "networking_cache_size_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_INT, deprecated = true)
+    public DataStorageSpec.IntMebibytesBound networking_cache_size;
 
-    public Integer file_cache_size_in_mb;
+    @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");
 
     /**
-     * Because of the current {@link org.apache.cassandra.utils.memory.BufferPool} slab sizes of 64 kb, we
-     * store in the file cache buffers that divide 64 kb, so we need to round the buffer sizes to powers of two.
+     * Because of the current {@link org.apache.cassandra.utils.memory.BufferPool} slab sizes of 64 KiB, we
+     * store in the file cache buffers that divide 64 KiB, so we need to round the buffer sizes to powers of two.
      * This boolean controls weather they are rounded up or down. Set it to true to round up to the
      * next power of two, set it to false to round down to the previous power of two. Note that buffer sizes are
-     * already rounded to 4 kb and capped between 4 kb minimum and 64 kb maximum by the {@link DiskOptimizationStrategy}.
+     * already rounded to 4 KiB and capped between 4 KiB minimum and 64 kb maximum by the {@link DiskOptimizationStrategy}.
      * By default, this boolean is set to round down when {@link #disk_optimization_strategy} is {@code ssd},
      * and to round up when it is {@code spinning}.
      */
@@ -350,20 +490,35 @@
 
     public MemtableAllocationType memtable_allocation_type = MemtableAllocationType.heap_buffers;
 
+    public volatile boolean read_thresholds_enabled = false;
+    public volatile DataStorageSpec.LongBytesBound coordinator_read_size_warn_threshold = null;
+    public volatile DataStorageSpec.LongBytesBound coordinator_read_size_fail_threshold = null;
+    public volatile DataStorageSpec.LongBytesBound local_read_size_warn_threshold = null;
+    public volatile DataStorageSpec.LongBytesBound local_read_size_fail_threshold = null;
+    public volatile DataStorageSpec.LongBytesBound row_index_read_size_warn_threshold = null;
+    public volatile DataStorageSpec.LongBytesBound row_index_read_size_fail_threshold = null;
+
     public volatile int tombstone_warn_threshold = 1000;
     public volatile int tombstone_failure_threshold = 100000;
 
     public final ReplicaFilteringProtectionOptions replica_filtering_protection = new ReplicaFilteringProtectionOptions();
 
-    public volatile Long index_summary_capacity_in_mb;
-    public volatile int index_summary_resize_interval_in_minutes = 60;
+    @Replaces(oldName = "index_summary_capacity_in_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_LONG, deprecated = true)
+    public volatile DataStorageSpec.LongMebibytesBound index_summary_capacity;
+    @Nullable
+    @Replaces(oldName = "index_summary_resize_interval_in_minutes", converter = Converters.MINUTES_CUSTOM_DURATION, deprecated = true)
+    public volatile DurationSpec.IntMinutesBound index_summary_resize_interval = new DurationSpec.IntMinutesBound("60m");
 
-    public volatile int gc_log_threshold_in_ms = 200;
-    public volatile int gc_warn_threshold_in_ms = 1000;
+    @Replaces(oldName = "gc_log_threshold_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound gc_log_threshold = new DurationSpec.IntMillisecondsBound("200ms");
+    @Replaces(oldName = "gc_warn_threshold_in_ms", converter = Converters.MILLIS_DURATION_INT, deprecated = true)
+    public volatile DurationSpec.IntMillisecondsBound gc_warn_threshold = new DurationSpec.IntMillisecondsBound("1s");
 
     // TTL for different types of trace events.
-    public int tracetype_query_ttl = (int) TimeUnit.DAYS.toSeconds(1);
-    public int tracetype_repair_ttl = (int) TimeUnit.DAYS.toSeconds(7);
+    @Replaces(oldName = "tracetype_query_ttl", converter = Converters.SECONDS_DURATION, deprecated=true)
+    public DurationSpec.IntSecondsBound trace_type_query_ttl = new DurationSpec.IntSecondsBound("1d");
+    @Replaces(oldName = "tracetype_repair_ttl", converter = Converters.SECONDS_DURATION, deprecated=true)
+    public DurationSpec.IntSecondsBound trace_type_repair_ttl = new DurationSpec.IntSecondsBound("7d");
 
     /**
      * Maintain statistics on whether writes achieve the ideal consistency level
@@ -372,6 +527,9 @@
     public volatile ConsistencyLevel ideal_consistency_level = null;
 
     @Deprecated
+    public int windows_timer_interval = 0;
+
+    @Deprecated
     public String otc_coalescing_strategy = "DISABLED";
 
     @Deprecated
@@ -385,24 +543,31 @@
     @Deprecated
     public volatile int otc_backlog_expiration_interval_ms = otc_backlog_expiration_interval_ms_default;
 
-    public int windows_timer_interval = 0;
-
     /**
-     * Size of the CQL prepared statements cache in MB.
-     * Defaults to 1/256th of the heap size or 10MB, whichever is greater.
+     * Size of the CQL prepared statements cache in MiB.
+     * Defaults to 1/256th of the heap size or 10MiB, whichever is greater.
      */
-    public Long prepared_statements_cache_size_mb = null;
+    @Replaces(oldName = "prepared_statements_cache_size_mb", converter = Converters.MEBIBYTES_DATA_STORAGE_LONG, deprecated = true)
+    public DataStorageSpec.LongMebibytesBound prepared_statements_cache_size = null;
 
-    public boolean enable_user_defined_functions = false;
-    public boolean enable_scripted_user_defined_functions = false;
+    @Replaces(oldName = "enable_user_defined_functions", converter = Converters.IDENTITY, deprecated = true)
+    public boolean user_defined_functions_enabled = false;
+    @Replaces(oldName = "enable_scripted_user_defined_functions", converter = Converters.IDENTITY, deprecated = true)
+    public boolean scripted_user_defined_functions_enabled = false;
 
-    public boolean enable_materialized_views = false;
+    @Replaces(oldName = "enable_materialized_views", converter = Converters.IDENTITY, deprecated = true)
+    public boolean materialized_views_enabled = false;
 
-    public boolean enable_transient_replication = false;
+    @Replaces(oldName = "enable_transient_replication", converter = Converters.IDENTITY, deprecated = true)
+    public boolean transient_replication_enabled = false;
 
-    public boolean enable_sasi_indexes = false;
+    @Replaces(oldName = "enable_sasi_indexes", converter = Converters.IDENTITY, deprecated = true)
+    public boolean sasi_indexes_enabled = false;
 
-    public volatile boolean enable_drop_compact_storage = false;
+    @Replaces(oldName = "enable_drop_compact_storage", converter = Converters.IDENTITY, deprecated = true)
+    public volatile boolean drop_compact_storage_enabled = false;
+
+    public volatile boolean use_statements_enabled = true;
 
     /**
      * Optionally disable asynchronous UDF execution.
@@ -415,7 +580,10 @@
      *
      * This requires allow_insecure_udfs to be true
      */
-    public boolean enable_user_defined_functions_threads = true;
+    // Below parameter is not presented in cassandra.yaml but to be on the safe side that no one was directly using it
+    // I still added backward compatibility (CASSANDRA-15234)
+    @Replaces(oldName = "enable_user_defined_functions_threads", converter = Converters.IDENTITY, deprecated = true)
+    public boolean user_defined_functions_threads_enabled = true;
 
     /**
      * Set this to true to allow running insecure UDFs.
@@ -429,22 +597,24 @@
 
     /**
      * Time in milliseconds after a warning will be emitted to the log and to the client that a UDF runs too long.
-     * (Only valid, if enable_user_defined_functions_threads==true)
+     * (Only valid, if user_defined_functions_threads_enabled==true)
      */
-    public long user_defined_function_warn_timeout = 500;
+    @Replaces(oldName = "user_defined_function_warn_timeout", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public DurationSpec.LongMillisecondsBound user_defined_functions_warn_timeout = new DurationSpec.LongMillisecondsBound("500ms");
     /**
      * Time in milliseconds after a fatal UDF run-time situation is detected and action according to
      * user_function_timeout_policy will take place.
-     * (Only valid, if enable_user_defined_functions_threads==true)
+     * (Only valid, if user_defined_functions_threads_enabled==true)
      */
-    public long user_defined_function_fail_timeout = 1500;
+    @Replaces(oldName = "user_defined_function_fail_timeout", converter = Converters.MILLIS_DURATION_LONG, deprecated = true)
+    public DurationSpec.LongMillisecondsBound user_defined_functions_fail_timeout = new DurationSpec.LongMillisecondsBound("1500ms");
     /**
-     * Defines what to do when a UDF ran longer than user_defined_function_fail_timeout.
+     * Defines what to do when a UDF ran longer than user_defined_functions_fail_timeout.
      * Possible options are:
      * - 'die' - i.e. it is able to emit a warning to the client before the Cassandra Daemon will shut down.
      * - 'die_immediate' - shut down C* daemon immediately (effectively prevent the chance that the client will receive a warning).
      * - 'ignore' - just log - the most dangerous option.
-     * (Only valid, if enable_user_defined_functions_threads==true)
+     * (Only valid, if user_defined_functions_threads_enabled==true)
      */
     public UserFunctionTimeoutPolicy user_function_timeout_policy = UserFunctionTimeoutPolicy.die;
 
@@ -490,6 +660,10 @@
 
     public volatile boolean diagnostic_events_enabled = false;
 
+    // Default keyspace replication factors allow validation of newly created keyspaces
+    // and good defaults if no replication factor is provided by the user
+    public volatile int default_keyspace_rf = 1;
+
     /**
      * flags for enabling tracking repaired state of data during reads
      * separate flags for range & single partition reads as single partition reads are only tracked
@@ -517,11 +691,52 @@
     public volatile boolean snapshot_on_repaired_data_mismatch = false;
 
     /**
-     * number of seconds to set nowInSec into the future when performing validation previews against repaired data
+     * Number of seconds to set nowInSec into the future when performing validation previews against repaired data
      * this (attempts) to prevent a race where validations on different machines are started on different sides of
      * a tombstone being compacted away
      */
-    public volatile int validation_preview_purge_head_start_in_sec = 60 * 60;
+
+    @Replaces(oldName = "validation_preview_purge_head_start_in_sec", converter = Converters.NEGATIVE_SECONDS_DURATION, deprecated = true)
+    public volatile DurationSpec.IntSecondsBound validation_preview_purge_head_start = new DurationSpec.IntSecondsBound("3600s");
+
+    public boolean auth_cache_warming_enabled = false;
+
+    // Using String instead of ConsistencyLevel here to keep static initialization from cascading and starting
+    // threads during tool usage mode. See CASSANDRA-12988 and DatabaseDescriptorRefTest for details
+    public volatile String auth_read_consistency_level = "LOCAL_QUORUM";
+    public volatile String auth_write_consistency_level = "EACH_QUORUM";
+
+    /** This feature allows denying access to operations on certain key partitions, intended for use by operators to
+     * provide another tool to manage cluster health vs application access. See CASSANDRA-12106 and CEP-13 for more details.
+     */
+    public volatile boolean partition_denylist_enabled = false;
+
+    public volatile boolean denylist_writes_enabled = true;
+
+    public volatile boolean denylist_reads_enabled = true;
+
+    public volatile boolean denylist_range_reads_enabled = true;
+
+    public DurationSpec.IntSecondsBound denylist_refresh = new DurationSpec.IntSecondsBound("600s");
+
+    public DurationSpec.IntSecondsBound denylist_initial_load_retry = new DurationSpec.IntSecondsBound("5s");
+
+    /** We cap the number of denylisted keys allowed per table to keep things from growing unbounded. Operators will
+     * receive warnings and only denylist_max_keys_per_table in natural query ordering will be processed on overflow.
+     */
+    public volatile int denylist_max_keys_per_table = 1000;
+
+    /** We cap the total number of denylisted keys allowed in the cluster to keep things from growing unbounded.
+     * Operators will receive warnings on initial cache load that there are too many keys and be directed to trim
+     * down the entries to within the configured limits.
+     */
+    public volatile int denylist_max_keys_total = 10000;
+
+    /** Since the denylist in many ways serves to protect the health of the cluster from partitions operators have identified
+     * as being in a bad state, we usually want more robustness than just CL.ONE on operations to/from these tables to
+     * ensure that these safeguards are in place. That said, we allow users to configure this if they're so inclined.
+     */
+    public ConsistencyLevel denylist_consistency_level = ConsistencyLevel.QUORUM;
 
     /**
      * The intial capacity for creating RangeTombstoneList.
@@ -566,6 +781,9 @@
     public volatile boolean auto_optimise_full_repair_streams = false;
     public volatile boolean auto_optimise_preview_repair_streams = false;
 
+    // see CASSANDRA-17048 and the comment in cassandra.yaml
+    public boolean uuid_sstable_identifiers_enabled = false;
+
     /**
      * Client mode means that the process is a pure client, that uses C* code base but does
      * not read or write local C* database files.
@@ -578,11 +796,255 @@
         isClientMode = clientMode;
     }
 
+    @Deprecated // this warning threshold will be replaced by an equivalent guardrail
     public volatile int table_count_warn_threshold = 150;
+    @Deprecated // this warning threshold will be replaced by an equivalent guardrail
     public volatile int keyspace_count_warn_threshold = 40;
 
     public volatile int consecutive_message_errors_threshold = 1;
 
+    public volatile SubnetGroups client_error_reporting_exclusions = new SubnetGroups();
+    public volatile SubnetGroups internode_error_reporting_exclusions = new SubnetGroups();
+
+    public volatile int keyspaces_warn_threshold = -1;
+    public volatile int keyspaces_fail_threshold = -1;
+    public volatile int tables_warn_threshold = -1;
+    public volatile int tables_fail_threshold = -1;
+    public volatile int columns_per_table_warn_threshold = -1;
+    public volatile int columns_per_table_fail_threshold = -1;
+    public volatile int secondary_indexes_per_table_warn_threshold = -1;
+    public volatile int secondary_indexes_per_table_fail_threshold = -1;
+    public volatile int materialized_views_per_table_warn_threshold = -1;
+    public volatile int materialized_views_per_table_fail_threshold = -1;
+    public volatile int page_size_warn_threshold = -1;
+    public volatile int page_size_fail_threshold = -1;
+    public volatile int partition_keys_in_select_warn_threshold = -1;
+    public volatile int partition_keys_in_select_fail_threshold = -1;
+    public volatile int in_select_cartesian_product_warn_threshold = -1;
+    public volatile int in_select_cartesian_product_fail_threshold = -1;
+    public volatile Set<String> table_properties_warned = Collections.emptySet();
+    public volatile Set<String> table_properties_ignored = Collections.emptySet();
+    public volatile Set<String> table_properties_disallowed = Collections.emptySet();
+    public volatile Set<ConsistencyLevel> read_consistency_levels_warned = Collections.emptySet();
+    public volatile Set<ConsistencyLevel> read_consistency_levels_disallowed = Collections.emptySet();
+    public volatile Set<ConsistencyLevel> write_consistency_levels_warned = Collections.emptySet();
+    public volatile Set<ConsistencyLevel> write_consistency_levels_disallowed = Collections.emptySet();
+    public volatile boolean user_timestamps_enabled = true;
+    public volatile boolean group_by_enabled = true;
+    public volatile boolean drop_truncate_table_enabled = true;
+    public volatile boolean secondary_indexes_enabled = true;
+    public volatile boolean uncompressed_tables_enabled = true;
+    public volatile boolean compact_tables_enabled = true;
+    public volatile boolean read_before_write_list_operations_enabled = true;
+    public volatile boolean allow_filtering_enabled = true;
+    public volatile DataStorageSpec.LongBytesBound collection_size_warn_threshold = null;
+    public volatile DataStorageSpec.LongBytesBound collection_size_fail_threshold = null;
+    public volatile int items_per_collection_warn_threshold = -1;
+    public volatile int items_per_collection_fail_threshold = -1;
+    public volatile int fields_per_udt_warn_threshold = -1;
+    public volatile int fields_per_udt_fail_threshold = -1;
+    public volatile int data_disk_usage_percentage_warn_threshold = -1;
+    public volatile int data_disk_usage_percentage_fail_threshold = -1;
+    public volatile DataStorageSpec.LongBytesBound data_disk_usage_max_disk_size = null;
+    public volatile int minimum_replication_factor_warn_threshold = -1;
+    public volatile int minimum_replication_factor_fail_threshold = -1;
+
+    public volatile DurationSpec.LongNanosecondsBound streaming_state_expires = new DurationSpec.LongNanosecondsBound("3d");
+    public volatile DataStorageSpec.LongBytesBound streaming_state_size = new DataStorageSpec.LongBytesBound("40MiB");
+
+    public volatile boolean streaming_stats_enabled = true;
+    public volatile DurationSpec.IntSecondsBound streaming_slow_events_log_timeout = new DurationSpec.IntSecondsBound("10s");
+
+    /** The configuration of startup checks. */
+    public volatile Map<StartupCheckType, Map<String, Object>> startup_checks = new HashMap<>();
+
+    public volatile DurationSpec.LongNanosecondsBound repair_state_expires = new DurationSpec.LongNanosecondsBound("3d");
+    public volatile int repair_state_size = 100_000;
+
+    /**
+     * The variants of paxos implementation and semantics supported by Cassandra.
+     */
+    public enum PaxosVariant
+    {
+        /**
+         * v1 Paxos lacks most optimisations. Expect 4RTs for a write and 2RTs for a read.
+         *
+         * With legacy semantics for read/read and rejected write linearizability, i.e. not guaranteed.
+         */
+        v1_without_linearizable_reads_or_rejected_writes,
+
+        /**
+         * v1 Paxos lacks most optimisations. Expect 4RTs for a write and 3RTs for a read.
+         */
+        v1,
+
+        /**
+         * v2 Paxos. With PaxosStatePurging.repaired safe to use ANY Commit consistency.
+         * Expect 2RTs for a write and 1RT for a read.
+         *
+         * With legacy semantics for read/read linearizability, i.e. not guaranteed.
+         */
+        v2_without_linearizable_reads,
+
+        /**
+         * v2 Paxos. With PaxosStatePurging.repaired safe to use ANY Commit consistency.
+         * Expect 2RTs for a write and 1RT for a read.
+         *
+         * With legacy semantics for read/read and rejected write linearizability, i.e. not guaranteed.
+         */
+        v2_without_linearizable_reads_or_rejected_writes,
+
+        /**
+         * v2 Paxos. With PaxosStatePurging.repaired safe to use ANY Commit consistency.
+         * Expect 2RTs for a write, and either 1RT or 2RT for a read.
+         */
+        v2
+    }
+
+    /**
+     * Select the kind of paxos state purging to use. Migration to repaired is recommended, but requires that
+     * regular paxos repairs are performed (which by default run as part of incremental repair).
+     *
+     * Once migrated from legacy it is unsafe to return to legacy, but gc_grace mode may be used in its place
+     * and performs a very similar cleanup process.
+     *
+     * Should only be modified once paxos_variant = v2.
+     */
+    public enum PaxosStatePurging
+    {
+        /**
+         * system.paxos records are written and garbage collected with TTLs. Unsafe to use with Commit consistency ANY.
+         * Once migrated from, cannot be migrated back to safely. Must use gc_grace or repaired instead, as TTLs
+         * will not have been set.
+         */
+        legacy,
+
+        /**
+         * Functionally similar to legacy, but the gc_grace expiry is applied at compaction and read time rather than
+         * using TTLs, so may be safely enabled at any point.
+         */
+        gc_grace,
+
+        /**
+         * Clears system.paxos records only once they are known to be persisted to a quorum of replica's base tables
+         * through the use of paxos repair. Requires that regular paxos repairs are performed on the cluster
+         * (which by default are included in incremental repairs if paxos_variant = v2).
+         *
+         * This setting permits the use of Commit consistency ANY or LOCAL_QUORUM without any loss of durability or consistency,
+         * saving 1 RT.
+         */
+        repaired;
+
+        public static PaxosStatePurging fromBoolean(boolean enabled)
+        {
+            return enabled ? repaired : gc_grace;
+        }
+    }
+
+    /**
+     * See {@link PaxosVariant}. Defaults to v1, recommend upgrading to v2 at earliest opportunity.
+     */
+    public volatile PaxosVariant paxos_variant = PaxosVariant.v1;
+
+    /**
+     * If true, paxos topology change repair will not run on a topology change - this option should only be used in
+     * 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");
+
+    /**
+     * A safety margin when purging paxos state information that has been safely replicated to a quorum.
+     * Data for transactions initiated within this grace period will not be expunged.
+     */
+    public volatile DurationSpec.LongSecondsBound paxos_purge_grace_period = new DurationSpec.LongSecondsBound("60s");
+
+    /**
+     * A safety mechanism for detecting incorrect paxos state, that may be down either to a bug or incorrect usage of LWTs
+     * (most likely due to unsafe mixing of SERIAL and LOCAL_SERIAL operations), and rejecting
+     */
+    public enum PaxosOnLinearizabilityViolation
+    {
+        // reject an operation when a linearizability violation is detected.
+        // note this does not guarantee a violation has been averted,
+        // as it may be a prior operation that invalidated the state.
+        fail,
+        // log any detected linearizability violation
+        log,
+        // ignore any detected linearizability violation
+        ignore
+    }
+
+    /**
+     * See {@link PaxosOnLinearizabilityViolation}.
+     *
+     * Default is to ignore, as applications may readily mix SERIAL and LOCAL_SERIAL and this is the most likely source
+     * of linearizability violations. this facility should be activated only for debugging Cassandra or by power users
+     * who are investigating their own application behaviour.
+     */
+    public volatile PaxosOnLinearizabilityViolation paxos_on_linearizability_violations = PaxosOnLinearizabilityViolation.ignore;
+
+    /**
+     * See {@link PaxosStatePurging} default is legacy.
+     */
+    public volatile PaxosStatePurging paxos_state_purging;
+
+    /**
+     * Enable/disable paxos repair. This is a global flag that not only determines default behaviour but overrides
+     * explicit paxos repair requests, paxos repair on topology changes and paxos auto repairs.
+     */
+    public volatile boolean paxos_repair_enabled = true;
+
+    /**
+     * If true, paxos topology change repair only requires a global quorum of live nodes. If false,
+     * it requires a global quorum as well as a local quorum for each dc (EACH_QUORUM), with the
+     * exception explained in paxos_topology_repair_strict_each_quorum
+     */
+    public boolean paxos_topology_repair_no_dc_checks = false;
+
+    /**
+     * If true, a quorum will be required for the global and local quorum checks. If false, we will
+     * accept a quorum OR n - 1 live nodes. This is to allow for topologies like 2:2:2, where paxos queries
+     * always use SERIAL, and a single node down in a dc should not preclude a paxos repair
+     */
+    public boolean paxos_topology_repair_strict_each_quorum = false;
+
+    /**
+     * 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"));
+
+    /**
+     * See {@link org.apache.cassandra.service.paxos.ContentionStrategy}
+     */
+    public String paxos_contention_wait_randomizer;
+
+    /**
+     * See {@link org.apache.cassandra.service.paxos.ContentionStrategy}
+     */
+    public String paxos_contention_min_wait;
+
+    /**
+     * See {@link org.apache.cassandra.service.paxos.ContentionStrategy}
+     */
+    public String paxos_contention_max_wait;
+
+    /**
+     * See {@link org.apache.cassandra.service.paxos.ContentionStrategy}
+     */
+    public String paxos_contention_min_delta;
+
+    /**
+     * The number of keys we may simultaneously attempt to finish incomplete paxos operations for.
+     */
+    public volatile int paxos_repair_parallelism = -1;
+
+    public volatile int max_top_size_partition_count = 10;
+    public volatile int max_top_tombstone_partition_count = 10;
+    public volatile DataStorageSpec.LongBytesBound min_tracked_partition_size = new DataStorageSpec.LongBytesBound("1MiB");
+    public volatile long min_tracked_partition_tombstone_count = 5000;
+    public volatile boolean top_partitions_enabled = true;
+
     public static Supplier<Config> getOverrideLoadConfig()
     {
         return overrideLoadConfig;
@@ -623,6 +1085,7 @@
     public enum MemtableAllocationType
     {
         unslabbed_heap_buffers,
+        unslabbed_heap_buffers_logged,
         heap_buffers,
         offheap_buffers,
         offheap_objects
@@ -671,7 +1134,7 @@
         exception
     }
 
-    private static final List<String> SENSITIVE_KEYS = new ArrayList<String>() {{
+    private static final Set<String> SENSITIVE_KEYS = new HashSet<String>() {{
         add("client_encryption_options");
         add("server_encryption_options");
     }};
diff --git a/src/java/org/apache/cassandra/config/Converters.java b/src/java/org/apache/cassandra/config/Converters.java
new file mode 100644
index 0000000..c898c08
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/Converters.java
@@ -0,0 +1,174 @@
+/*
+ * 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.config;
+
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+
+import static org.apache.cassandra.config.DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND;
+
+/**
+ * Converters for backward compatibility with the old cassandra.yaml where duration, data rate and
+ * data storage configuration parameters were provided only by value and the expected unit was part of the configuration
+ * parameter name(suffix). (CASSANDRA-15234)
+ * It is important to be noted that this converter is not intended to be used when we don't change name of a configuration
+ * parameter but we want to add unit. This would always default to the old value provided without a unit at the moment.
+ * In case this functionality is needed at some point, please, raise a Jira ticket. There is only one exception handling
+ * three parameters (key_cache_save_period, row_cache_save_period, counter_cache_save_period) - the SECONDS_CUSTOM_DURATION
+ * converter.
+ */
+public enum Converters
+{
+    /**
+     * This converter is used when we change the name of a cassandra.yaml configuration parameter but we want to be
+     * able to still use the old name too. No units involved.
+     */
+    IDENTITY(null, null, o -> o, o -> o),
+    MILLIS_DURATION_LONG(Long.class, DurationSpec.LongMillisecondsBound.class,
+                         DurationSpec.LongMillisecondsBound::new,
+                         o -> o == null ? null : o.toMilliseconds()),
+    MILLIS_DURATION_INT(Integer.class, DurationSpec.IntMillisecondsBound.class,
+                        DurationSpec.IntMillisecondsBound::new,
+                        o -> o == null ? null : o.toMilliseconds()),
+    MILLIS_DURATION_DOUBLE(Double.class, DurationSpec.IntMillisecondsBound.class,
+                           o -> Double.isNaN(o) ? new DurationSpec.IntMillisecondsBound(0) :
+                                new DurationSpec.IntMillisecondsBound(o, TimeUnit.MILLISECONDS),
+                           o -> (double) o.toMilliseconds()),
+    /**
+     * This converter is used to support backward compatibility for parameters where in the past -1 was used as a value
+     * Example: credentials_update_interval_in_ms = -1 and credentials_update_interval = null are equal.
+     */
+    MILLIS_CUSTOM_DURATION(Integer.class, DurationSpec.IntMillisecondsBound.class,
+                           o -> o == -1 ? null : new DurationSpec.IntMillisecondsBound(o),
+                           o -> o == null ? -1 : o.toMilliseconds()),
+    SECONDS_DURATION(Integer.class, DurationSpec.IntSecondsBound.class,
+                     DurationSpec.IntSecondsBound::new,
+                     o -> o == null ? null : o.toSeconds()),
+    NEGATIVE_SECONDS_DURATION(Integer.class, DurationSpec.IntSecondsBound.class,
+                              o -> o < 0 ? new DurationSpec.IntSecondsBound(0) : new DurationSpec.IntSecondsBound(o),
+                              o -> o == null ? null : o.toSeconds()),
+    /**
+     * This converter is used to support backward compatibility for Duration parameters where we added the opportunity
+     * for the users to add a unit in the parameters' values but we didn't change the names. (key_cache_save_period,
+     * row_cache_save_period, counter_cache_save_period)
+     * Example: row_cache_save_period = 0 and row_cache_save_period = 0s (quantity of 0s) are equal.
+     */
+    SECONDS_CUSTOM_DURATION(String.class, DurationSpec.IntSecondsBound.class,
+                            DurationSpec.IntSecondsBound::inSecondsString,
+                            o -> o == null ? null : Long.toString(o.toSeconds())),
+    /**
+     * This converter is used to support backward compatibility for parameters where in the past -1 was used as a value
+     * Example:  index_summary_resize_interval_in_minutes = -1 and  index_summary_resize_interval = null are equal.
+     */
+    MINUTES_CUSTOM_DURATION(Integer.class, DurationSpec.IntMinutesBound.class,
+                            o -> o == -1 ? null : new DurationSpec.IntMinutesBound(o),
+                            o -> o == null ? -1 : o.toMinutes()),
+    MEBIBYTES_DATA_STORAGE_LONG(Long.class, DataStorageSpec.LongMebibytesBound.class,
+                                DataStorageSpec.LongMebibytesBound::new,
+                                o -> o == null ? null : o.toMebibytes()),
+    MEBIBYTES_DATA_STORAGE_INT(Integer.class, DataStorageSpec.IntMebibytesBound.class,
+                               DataStorageSpec.IntMebibytesBound::new,
+                               o -> o == null ? null : o.toMebibytes()),
+    NEGATIVE_MEBIBYTES_DATA_STORAGE_INT(Integer.class, DataStorageSpec.IntMebibytesBound.class,
+                                        o -> o < 0 ? null : new DataStorageSpec.IntMebibytesBound(o),
+                                        o -> o == null ? -1 : o.toMebibytes()),
+    KIBIBYTES_DATASTORAGE(Integer.class, DataStorageSpec.IntKibibytesBound.class,
+                          DataStorageSpec.IntKibibytesBound::new,
+                          o -> o == null ? null : o.toKibibytes()),
+    BYTES_DATASTORAGE(Integer.class, DataStorageSpec.IntBytesBound.class,
+                      DataStorageSpec.IntBytesBound::new,
+                      o -> o == null ? null : o.toBytes()),
+    /**
+     * This converter is used to support backward compatibility for parameters where in the past negative number was used as a value
+     * Example: native_transport_max_concurrent_requests_in_bytes_per_ip = -1 and native_transport_max_request_data_in_flight_per_ip = null
+     * are equal. All negative numbers are printed as 0 in virtual tables.
+     */
+    BYTES_CUSTOM_DATASTORAGE(Long.class, DataStorageSpec.LongBytesBound.class,
+                             o -> o == -1 ? null : new DataStorageSpec.LongBytesBound(o),
+                             o -> o == null ? null : o.toBytes()),
+    MEBIBYTES_PER_SECOND_DATA_RATE(Integer.class, DataRateSpec.LongBytesPerSecondBound.class,
+                                   i -> new DataRateSpec.LongBytesPerSecondBound(i, MEBIBYTES_PER_SECOND),
+                                   o -> o == null ? null : o.toMebibytesPerSecondAsInt()),
+    /**
+     * This converter is a custom one to support backward compatibility for stream_throughput_outbound and
+     * inter_dc_stream_throughput_outbound which were provided in megabits per second prior CASSANDRA-15234.
+     */
+    MEGABITS_TO_BYTES_PER_SECOND_DATA_RATE(Integer.class, DataRateSpec.LongBytesPerSecondBound.class,
+                                           i -> DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(i),
+                                           o -> o == null ? null : o.toMegabitsPerSecondAsInt());
+    private final Class<?> oldType;
+    private final Class<?> newType;
+    private final Function<Object, Object> convert;
+    private final Function<Object, Object> reverseConvert;
+
+    <Old, New> Converters(Class<Old> oldType, Class<New> newType, Function<Old, New> convert, Function<New, Old> reverseConvert)
+    {
+        this.oldType = oldType;
+        this.newType = newType;
+        this.convert = (Function<Object, Object>) convert;
+        this.reverseConvert = (Function<Object, Object>) reverseConvert;
+    }
+
+    /**
+     * A method to identify what type is needed to be returned by the converter used for a configuration parameter
+     * in {@link Replaces} annotation in {@link Config}
+     *
+     * @return class type
+     */
+    public Class<?> getOldType()
+    {
+        return oldType;
+    }
+
+    /**
+     * Expected return type from {@link #convert(Object)}, and input type to {@link #unconvert(Object)}
+     *
+     * @return type that {@link #convert(Object)} is expected to return
+     */
+    public Class<?> getNewType()
+    {
+        return newType;
+    }
+
+    /**
+     * Apply the converter specified as part of the {@link Replaces} annotation in {@link Config}
+     *
+     * @param value we will use from cassandra.yaml to create a new {@link Config} parameter of type {@link DurationSpec},
+     *              {@link DataRateSpec} or {@link DataStorageSpec}
+     * @return new object of type {@link DurationSpec}, {@link DataRateSpec} or {@link DataStorageSpec}
+     */
+    public Object convert(Object value)
+    {
+        if (value == null) return null;
+        return convert.apply(value);
+    }
+
+    /**
+     * Apply the converter specified as part of the {@link Replaces} annotation in {@link Config} to get config parameters'
+     * values in the old format pre-CASSANDRA-15234 and in the right units, used in the Virtual Tables to ensure backward
+     * compatibility
+     *
+     * @param value we will use to calculate the output value
+     * @return the numeric value
+     */
+    public Object unconvert(Object value)
+    {
+        return reverseConvert.apply(value);
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/DataRateSpec.java b/src/java/org/apache/cassandra/config/DataRateSpec.java
new file mode 100644
index 0000000..1ec2d1e
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/DataRateSpec.java
@@ -0,0 +1,426 @@
+/*
+ * 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.config;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import com.google.common.math.DoubleMath;
+import com.google.common.primitives.Ints;
+
+import static org.apache.cassandra.config.DataRateSpec.DataRateUnit.BYTES_PER_SECOND;
+
+/**
+ * Represents a data rate type used for cassandra configuration. It supports the opportunity for the users to be able to
+ * add units to the confiuration parameter value. (CASSANDRA-15234)
+ */
+public abstract class DataRateSpec
+{
+    /**
+     * The Regexp used to parse the rate provided as String in cassandra.yaml.
+     */
+    private static final Pattern UNITS_PATTERN = Pattern.compile("^(\\d+)(MiB/s|KiB/s|B/s)$");
+
+    private final long quantity;
+
+    private final DataRateUnit unit;
+
+    private DataRateSpec(String value)
+    {
+        //parse the string field value
+        Matcher matcher = UNITS_PATTERN.matcher(value);
+
+        if (!matcher.find())
+            throw new IllegalArgumentException("Invalid data rate: " + value + " Accepted units: MiB/s, KiB/s, B/s where " +
+                                                "case matters and " + "only non-negative values are valid");
+
+        quantity = Long.parseLong(matcher.group(1));
+        unit = DataRateUnit.fromSymbol(matcher.group(2));
+    }
+
+    private DataRateSpec(String value, DataRateUnit minUnit, long max)
+    {
+        this(value);
+
+        validateQuantity(value, quantity(), unit(), minUnit, max);
+    }
+
+    private DataRateSpec(long quantity, DataRateUnit unit, DataRateUnit minUnit, long max)
+    {
+        this.quantity = quantity;
+        this.unit = unit;
+
+        validateQuantity(quantity, unit, minUnit, max);
+    }
+
+    private static void validateQuantity(String value, double quantity, DataRateUnit unit, DataRateUnit minUnit, long max)
+    {
+        // negatives are not allowed by the regex pattern
+        if (minUnit.convert(quantity, unit) >= max)
+            throw new IllegalArgumentException("Invalid data rate: " + value + ". It shouldn't be more than " +
+                                             (max - 1) + " in " + minUnit.name().toLowerCase());
+    }
+
+    private static void validateQuantity(double quantity, DataRateUnit unit, DataRateUnit minUnit, long max)
+    {
+        if (quantity < 0)
+            throw new IllegalArgumentException("Invalid data rate: value must be non-negative");
+
+        if (minUnit.convert(quantity, unit) >= max)
+            throw new IllegalArgumentException(String.format("Invalid data rate: %s %s. It shouldn't be more than %d in %s",
+                                                       quantity, unit.name().toLowerCase(),
+                                                       max - 1, minUnit.name().toLowerCase()));
+    }
+
+    // get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is
+    // imporant to be explicit about get/set as this changes how parsing is done; this class is a data-type, so is
+    // not nested, having get/set can confuse parsing thinking this is a nested type
+    /**
+     * @return the data rate unit assigned.
+     */
+    public DataRateUnit unit()
+    {
+        return unit;
+    }
+
+    /**
+     * @return the data rate quantity.
+     */
+    private double quantity()
+    {
+        return quantity;
+    }
+
+    /**
+     * @return the data rate in bytes per second
+     */
+    public double toBytesPerSecond()
+    {
+        return unit.toBytesPerSecond(quantity);
+    }
+
+    /**
+     * Returns the data rate in bytes per second as an {@code int}
+     *
+     * @return the data rate in bytes per second or {@code Integer.MAX_VALUE} if the rate is too large.
+     */
+    public int toBytesPerSecondAsInt()
+    {
+        return Ints.saturatedCast(Math.round(toBytesPerSecond()));
+    }
+
+    /**
+     * @return the data rate in kibibytes per second
+     */
+    public double toKibibytesPerSecond()
+    {
+        return unit.toKibibytesPerSecond(quantity);
+    }
+
+    /**
+     * Returns the data rate in kibibytes per second as an {@code int}
+     *
+     * @return the data rate in kibibytes per second or {@code Integer.MAX_VALUE} if the number of kibibytes is too large.
+     */
+    public int toKibibytesPerSecondAsInt()
+    {
+        return Ints.saturatedCast(Math.round(toKibibytesPerSecond()));
+    }
+
+    /**
+     * @return the data rate in mebibytes per second
+     */
+    public double toMebibytesPerSecond()
+    {
+        return unit.toMebibytesPerSecond(quantity);
+    }
+
+    /**
+     * Returns the data rate in mebibytes per second as an {@code int}
+     *
+     * @return the data rate in mebibytes per second or {@code Integer.MAX_VALUE} if the number of mebibytes is too large.
+     */
+    public int toMebibytesPerSecondAsInt()
+    {
+        return Ints.saturatedCast(Math.round(toMebibytesPerSecond()));
+    }
+
+    /**
+     * This method is required in order to support backward compatibility with the old unit used for a few Data Rate
+     * parameters before CASSANDRA-15234
+     *
+     * @return the data rate in megabits per second.
+     */
+    public double toMegabitsPerSecond()
+    {
+        return unit.toMegabitsPerSecond(quantity);
+    }
+
+    /**
+     * Returns the data rate in megabits per second as an {@code int}. This method is required in order to support
+     * backward compatibility with the old unit used for a few Data Rate parameters before CASSANDRA-15234
+     *
+     * @return the data rate in mebibytes per second or {@code Integer.MAX_VALUE} if the number of mebibytes is too large.
+     */
+    public int toMegabitsPerSecondAsInt()
+    {
+        return Ints.saturatedCast(Math.round(toMegabitsPerSecond()));
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(unit.toKibibytesPerSecond(quantity));
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+            return true;
+
+        if (!(obj instanceof DataRateSpec))
+            return false;
+
+        DataRateSpec other = (DataRateSpec) obj;
+        if (unit == other.unit)
+            return quantity == other.quantity;
+
+        // Due to overflows we can only guarantee that the 2 data rates are equal if we get the same results
+        // doing the conversion in both directions.
+        return unit.convert(other.quantity, other.unit) == quantity && other.unit.convert(quantity, unit) == other.quantity;
+    }
+
+    @Override
+    public String toString()
+    {
+        return (DoubleMath.isMathematicalInteger(quantity) ? (long) quantity : quantity) + unit.symbol;
+    }
+
+    /**
+     * Represents a data rate used for Cassandra configuration. The bound is [0, Long.MAX_VALUE) in bytes per second.
+     * If the user sets a different unit, we still validate that converted to bytes per second the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class LongBytesPerSecondBound extends DataRateSpec
+    {
+        /**
+         * Creates a {@code DataRateSpec.LongBytesPerSecondBound} of the specified amount.
+         *
+         * @param value the data rate
+         */
+        public LongBytesPerSecondBound(String value)
+        {
+            super(value, BYTES_PER_SECOND, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DataRateSpec.LongBytesPerSecondBound} of the specified amount in the specified unit.
+         *
+         * @param quantity where quantity shouldn't be bigger than Long.MAX_VALUE - 1 in bytes per second
+         * @param unit     in which the provided quantity is
+         */
+        public LongBytesPerSecondBound(long quantity, DataRateUnit unit)
+        {
+            super(quantity, unit, BYTES_PER_SECOND, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DataRateSpec.LongBytesPerSecondBound} of the specified amount in bytes per second.
+         *
+         * @param bytesPerSecond where bytesPerSecond shouldn't be bigger than Long.MAX_VALUE
+         */
+        public LongBytesPerSecondBound(long bytesPerSecond)
+        {
+            this(bytesPerSecond, BYTES_PER_SECOND);
+        }
+
+        // this one should be used only for backward compatibility for stream_throughput_outbound and inter_dc_stream_throughput_outbound
+        // which were in megabits per second in 4.0. Do not start using it for any new properties
+        @Deprecated
+        public static LongBytesPerSecondBound megabitsPerSecondInBytesPerSecond(long megabitsPerSecond)
+        {
+            final long BYTES_PER_MEGABIT = 125_000;
+            long bytesPerSecond = megabitsPerSecond * BYTES_PER_MEGABIT;
+
+            if (megabitsPerSecond >= Integer.MAX_VALUE)
+                throw new IllegalArgumentException("Invalid data rate: " + megabitsPerSecond + " megabits per second; " +
+                                                   "stream_throughput_outbound and inter_dc_stream_throughput_outbound" +
+                                                   " should be between 0 and " + (Integer.MAX_VALUE - 1) + " in megabits per second");
+
+            return new LongBytesPerSecondBound(bytesPerSecond, BYTES_PER_SECOND);
+        }
+    }
+
+    public enum DataRateUnit
+    {
+        BYTES_PER_SECOND("B/s")
+        {
+            public double toBytesPerSecond(double d)
+            {
+                return d;
+            }
+
+            public double toKibibytesPerSecond(double d)
+            {
+                return d / 1024.0;
+            }
+
+            public double toMebibytesPerSecond(double d)
+            {
+                return d / (1024.0 * 1024.0);
+            }
+
+            public double toMegabitsPerSecond(double d)
+            {
+                return (d / 125000.0);
+            }
+
+            public double convert(double source, DataRateUnit sourceUnit)
+            {
+                return sourceUnit.toBytesPerSecond(source);
+            }
+        },
+        KIBIBYTES_PER_SECOND("KiB/s")
+        {
+            public double toBytesPerSecond(double d)
+            {
+                return x(d, 1024.0, (MAX / 1024.0));
+            }
+
+            public double toKibibytesPerSecond(double d)
+            {
+                return d;
+            }
+
+            public double toMebibytesPerSecond(double d)
+            {
+                return d / 1024.0;
+            }
+
+            public double toMegabitsPerSecond(double d)
+            {
+                return d / 122.0;
+            }
+
+            public double convert(double source, DataRateUnit sourceUnit)
+            {
+                return sourceUnit.toKibibytesPerSecond(source);
+            }
+        },
+        MEBIBYTES_PER_SECOND("MiB/s")
+        {
+            public double toBytesPerSecond(double d)
+            {
+                return x(d, (1024.0 * 1024.0), (MAX / (1024.0 * 1024.0)));
+            }
+
+            public double toKibibytesPerSecond(double d)
+            {
+                return x(d, 1024.0, (MAX / 1024.0));
+            }
+
+            public double toMebibytesPerSecond(double d)
+            {
+                return d;
+            }
+
+            public double toMegabitsPerSecond(double d)
+            {
+                if (d > MAX / (MEGABITS_PER_MEBIBYTE))
+                    return MAX;
+                return d * MEGABITS_PER_MEBIBYTE;
+            }
+
+            public double convert(double source, DataRateUnit sourceUnit)
+            {
+                return sourceUnit.toMebibytesPerSecond(source);
+            }
+        };
+
+        static final double MAX = Long.MAX_VALUE;
+        static final double MEGABITS_PER_MEBIBYTE = 8.388608;
+
+        /**
+         * Scale d by m, checking for overflow. This has a short name to make above code more readable.
+         */
+        static double x(double d, double m, double over)
+        {
+            assert (over > 0.0) && (over < (MAX - 1)) && (over == (MAX / m));
+
+            if (d > over)
+                return MAX;
+            return d * m;
+        }
+
+        /**
+         * @param symbol the unit symbol
+         * @return the rate unit corresponding to the given symbol
+         */
+        public static DataRateUnit fromSymbol(String symbol)
+        {
+            for (DataRateUnit value : values())
+            {
+                if (value.symbol.equalsIgnoreCase(symbol))
+                    return value;
+            }
+            throw new IllegalArgumentException(String.format("Unsupported data rate unit: %s. Supported units are: %s",
+                                                             symbol, Arrays.stream(values())
+                                                                           .map(u -> u.symbol)
+                                                                           .collect(Collectors.joining(", "))));
+        }
+
+        /**
+         * The unit symbol
+         */
+        private final String symbol;
+
+        DataRateUnit(String symbol)
+        {
+            this.symbol = symbol;
+        }
+
+        public double toBytesPerSecond(double d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public double toKibibytesPerSecond(double d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public double toMebibytesPerSecond(double d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public double toMegabitsPerSecond(double d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public double convert(double source, DataRateUnit sourceUnit)
+        {
+            throw new AbstractMethodError();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/DataStorageSpec.java b/src/java/org/apache/cassandra/config/DataStorageSpec.java
new file mode 100644
index 0000000..f0d3aca
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/DataStorageSpec.java
@@ -0,0 +1,647 @@
+/*
+ * 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.config;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import com.google.common.primitives.Ints;
+
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.BYTES;
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES;
+
+/**
+ * Represents an amount of data storage. Wrapper class for Cassandra configuration parameters, providing to the
+ * users the opportunity to be able to provide config with a unit of their choice in cassandra.yaml as per the available
+ * options. (CASSANDRA-15234)
+ */
+public abstract class DataStorageSpec
+{
+    /**
+     * The Regexp used to parse the storage provided as String.
+     */
+    private static final Pattern UNITS_PATTERN = Pattern.compile("^(\\d+)(GiB|MiB|KiB|B)$");
+
+    private final long quantity;
+
+    private final DataStorageUnit unit;
+
+    private DataStorageSpec(long quantity, DataStorageUnit unit, DataStorageUnit minUnit, long max, String value)
+    {
+        this.quantity = quantity;
+        this.unit = unit;
+
+        validateMinUnit(unit, minUnit, value);
+        validateQuantity(quantity, unit, minUnit, max);
+    }
+
+    private DataStorageSpec(String value, DataStorageUnit minUnit)
+    {
+        //parse the string field value
+        Matcher matcher = UNITS_PATTERN.matcher(value);
+
+        if (matcher.find())
+        {
+            quantity = Long.parseLong(matcher.group(1));
+            unit = DataStorageUnit.fromSymbol(matcher.group(2));
+
+            // this constructor is used only by extended classes for min unit; upper bound and min unit are guarded there accordingly
+        }
+        else
+        {
+            throw new IllegalArgumentException("Invalid data storage: " + value + " Accepted units:" + acceptedUnits(minUnit) +
+                                               " where case matters and only non-negative values are accepted");
+        }
+    }
+
+    private DataStorageSpec(String value, DataStorageUnit minUnit, long max)
+    {
+        this(value, minUnit);
+
+        validateMinUnit(unit, minUnit, value);
+        validateQuantity(value, quantity(), unit(), minUnit, max);
+    }
+
+    private static void validateMinUnit(DataStorageUnit sourceUnit, DataStorageUnit minUnit, String value)
+    {
+        if (sourceUnit.compareTo(minUnit) < 0)
+            throw new IllegalArgumentException(String.format("Invalid data storage: %s Accepted units:%s", value, acceptedUnits(minUnit)));
+    }
+
+    private static String acceptedUnits(DataStorageUnit minUnit)
+    {
+        DataStorageUnit[] units = DataStorageUnit.values();
+        return Arrays.toString(Arrays.copyOfRange(units, minUnit.ordinal(), units.length));
+    }
+
+    private static void validateQuantity(String value, long quantity, DataStorageUnit sourceUnit, DataStorageUnit minUnit, long max)
+    {
+        // no need to validate for negatives as they are not allowed at first place from the regex
+
+        if (minUnit.convert(quantity, sourceUnit) >= max)
+            throw new IllegalArgumentException("Invalid data storage: " + value + ". It shouldn't be more than " +
+                                               (max - 1) + " in " + minUnit.name().toLowerCase());
+    }
+
+    private static void validateQuantity(long quantity, DataStorageUnit sourceUnit, DataStorageUnit minUnit, long max)
+    {
+        if (quantity < 0)
+            throw new IllegalArgumentException("Invalid data storage: value must be non-negative");
+
+        if (minUnit.convert(quantity, sourceUnit) >= max)
+            throw new IllegalArgumentException(String.format("Invalid data storage: %d %s. It shouldn't be more than %d in %s",
+                                                             quantity, sourceUnit.name().toLowerCase(),
+                                                             max - 1, minUnit.name().toLowerCase()));
+    }
+
+    // get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is
+    // imporant to be explicit about get/set as this changes how parsing is done; this class is a data-type, so is
+    // not nested, having get/set can confuse parsing thinking this is a nested type
+    /**
+     * @return the data storage quantity.
+     */
+    public long quantity()
+    {
+        return quantity;
+    }
+
+    /**
+     * @return the data storage unit.
+     */
+    public DataStorageUnit unit()
+    {
+        return unit;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(unit.toKibibytes(quantity));
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+            return true;
+
+        if (!(obj instanceof DataStorageSpec))
+            return false;
+
+        DataStorageSpec other = (DataStorageSpec) obj;
+        if (unit == other.unit)
+            return quantity == other.quantity;
+
+        // Due to overflows we can only guarantee that the 2 storages are equal if we get the same results
+        // doing the convertion in both directions.
+        return unit.convert(other.quantity, other.unit) == quantity && other.unit.convert(quantity, unit) == other.quantity;
+    }
+
+    @Override
+    public String toString()
+    {
+        return quantity + unit.symbol;
+    }
+
+    /**
+     * Represents a data storage quantity used for Cassandra configuration. The bound is [0, Long.MAX_VALUE) in bytes.
+     * If the user sets a different unit - we still validate that converted to bytes the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class LongBytesBound extends DataStorageSpec
+    {
+        /**
+         * Creates a {@code DataStorageSpec.LongBytesBound} of the specified amount.
+         *
+         * @param value the data storage
+         */
+        public LongBytesBound(String value)
+        {
+            super(value, BYTES, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.LongBytesBound} of the specified amount in the specified unit.
+         *
+         * @param quantity where quantity shouldn't be bigger than Long.MAX_VALUE - 1 in bytes
+         * @param unit in which the provided quantity is
+         */
+        public LongBytesBound(long quantity, DataStorageUnit unit)
+        {
+            super(quantity, unit, BYTES, Long.MAX_VALUE, quantity + unit.symbol);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.LongBytesBound} of the specified amount in bytes.
+         *
+         * @param bytes where bytes shouldn't be bigger than Long.MAX_VALUE-1
+         */
+        public LongBytesBound(long bytes)
+        {
+            this(bytes, BYTES);
+        }
+
+        /**
+         * @return the amount of data storage in bytes
+         */
+        public long toBytes()
+        {
+            return unit().toBytes(quantity());
+        }
+    }
+
+    /**
+     * Represents a data storage quantity used for Cassandra configuration. The bound is [0, Integer.MAX_VALUE) in bytes.
+     * If the user sets a different unit - we still validate that converted to bytes the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class IntBytesBound extends DataStorageSpec
+    {
+        /**
+         * Creates a {@code DataStorageSpec.IntBytesBound} of the specified amount.
+         *
+         * @param value the data storage
+         */
+        public IntBytesBound(String value)
+        {
+            super(value, BYTES, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.IntBytesBound} of the specified amount in the specified unit.
+         *
+         * @param quantity where quantity shouldn't be bigger than Integer.MAX_VALUE - 1 in bytes
+         * @param unit in which the provided quantity is
+         */
+        public IntBytesBound(long quantity, DataStorageUnit unit)
+        {
+            super(quantity, unit, BYTES, Integer.MAX_VALUE, quantity + unit.symbol);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.IntBytesBound} of the specified amount in bytes.
+         *
+         * @param bytes where bytes shouldn't be bigger than Integer.MAX_VALUE-1
+         */
+        public IntBytesBound(long bytes)
+        {
+            this(bytes, BYTES);
+        }
+
+        /**
+         * Returns the amount of data storage in bytes as an {@code int}
+         *
+         * @return the amount of data storage in bytes or {@code Integer.MAX_VALUE} if the number of bytes is too large.
+         */
+        public int toBytes()
+        {
+            return Ints.saturatedCast(unit().toBytes(quantity()));
+        }
+    }
+
+    /**
+     * Represents a data storage quantity used for Cassandra configuration. The bound is [0, Integer.MAX_VALUE) in kibibytes.
+     * If the user sets a different unit - we still validate that converted to kibibytes the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class IntKibibytesBound extends DataStorageSpec
+    {
+        /**
+         * Creates a {@code DataStorageSpec.IntKibibytesBound} of the specified amount.
+         *
+         * @param value the data storage
+         */
+        public IntKibibytesBound(String value)
+        {
+            super(value, KIBIBYTES, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.IntKibibytesBound} of the specified amount in the specified unit.
+         *
+         * @param quantity where quantity shouldn't be bigger than Integer.MAX_VALUE - 1 in kibibytes
+         * @param unit in which the provided quantity is
+         */
+        public IntKibibytesBound(long quantity, DataStorageUnit unit)
+        {
+            super(quantity, unit, KIBIBYTES, Integer.MAX_VALUE, quantity + unit.symbol);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.IntKibibytesBound} of the specified amount in kibibytes.
+         *
+         * @param kibibytes where kibibytes shouldn't be bigger than Integer.MAX_VALUE-1
+         */
+        public IntKibibytesBound(long kibibytes)
+        {
+            this(kibibytes, KIBIBYTES);
+        }
+
+        /**
+         * Returns the amount of data storage in bytes as an {@code int}
+         *
+         * @return the amount of data storage in bytes or {@code Integer.MAX_VALUE} if the number of bytes is too large.
+         */
+        public int toBytes()
+        {
+            return Ints.saturatedCast(unit().toBytes(quantity()));
+        }
+
+        /**
+         * Returns the amount of data storage in kibibytes as an {@code int}
+         *
+         * @return the amount of data storage in kibibytes or {@code Integer.MAX_VALUE} if the number of kibibytes is too large.
+         */
+        public int toKibibytes()
+        {
+            return Ints.saturatedCast(unit().toKibibytes(quantity()));
+        }
+
+        /**
+         * @return the amount of data storage in bytes.
+         */
+        public long toBytesInLong()
+        {
+           return unit().toBytes(quantity());
+        }
+    }
+
+    /**
+     * Represents a data storage quantity used for Cassandra configuration. The bound is [0, Long.MAX_VALUE) in mebibytes.
+     * If the user sets a different unit - we still validate that converted to mebibytes the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class LongMebibytesBound extends DataStorageSpec
+    {
+        /**
+         * Creates a {@code DataStorageSpec.LongMebibytesBound} of the specified amount.
+         *
+         * @param value the data storage
+         */
+        public LongMebibytesBound(String value)
+        {
+            super(value, MEBIBYTES, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.LongMebibytesBound} of the specified amount in the specified unit.
+         *
+         * @param quantity where quantity shouldn't be bigger than Long.MAX_VALUE - 1 in mebibytes
+         * @param unit in which the provided quantity is
+         */
+        public LongMebibytesBound(long quantity, DataStorageUnit unit)
+        {
+            super(quantity, unit, MEBIBYTES, Long.MAX_VALUE, quantity + unit.symbol);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.LongMebibytesBound} of the specified amount in mebibytes.
+         *
+         * @param mebibytes where mebibytes shouldn't be bigger than Long.MAX_VALUE-1
+         */
+        public LongMebibytesBound(long mebibytes)
+        {
+            this(mebibytes, MEBIBYTES);
+        }
+
+        /**
+         * @return the amount of data storage in bytes
+         */
+        public long toBytes()
+        {
+            return unit().toBytes(quantity());
+        }
+
+        /**
+         * @return the amount of data storage in kibibytes
+         */
+        public long toKibibytes()
+        {
+            return unit().toKibibytes(quantity());
+        }
+
+        /**
+         * @return the amount of data storage in mebibytes
+         */
+        public long toMebibytes()
+        {
+            return unit().toMebibytes(quantity());
+        }
+    }
+
+    /**
+     * Represents a data storage quantity used for Cassandra configuration. The bound is [0, Integer.MAX_VALUE) in mebibytes.
+     * If the user sets a different unit - we still validate that converted to mebibytes the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class IntMebibytesBound extends DataStorageSpec
+    {
+        /**
+         * Creates a {@code DataStorageSpec.IntMebibytesBound} of the specified amount.
+         *
+         * @param value the data storage
+         */
+        public IntMebibytesBound(String value)
+        {
+            super(value, MEBIBYTES, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.IntMebibytesBound} of the specified amount in the specified unit.
+         *
+         * @param quantity where quantity shouldn't be bigger than Integer.MAX_VALUE - 1 in mebibytes
+         * @param unit in which the provided quantity is
+         */
+        public IntMebibytesBound(long quantity, DataStorageUnit unit)
+        {
+            super(quantity, unit, MEBIBYTES, Integer.MAX_VALUE, quantity + unit.symbol);
+        }
+
+        /**
+         * Creates a {@code DataStorageSpec.IntMebibytesBound} of the specified amount in mebibytes.
+         *
+         * @param mebibytes where mebibytes shouldn't be bigger than Integer.MAX_VALUE-1
+         */
+        public IntMebibytesBound(long mebibytes)
+        {
+            this(mebibytes, MEBIBYTES);
+        }
+
+        /**
+         * Returns the amount of data storage in bytes as an {@code int}
+         *
+         * @return the amount of data storage in bytes or {@code Integer.MAX_VALUE} if the number of bytes is too large.
+         */
+        public int toBytes()
+        {
+            return Ints.saturatedCast(unit().toBytes(quantity()));
+        }
+
+        /**
+         * Returns the amount of data storage in kibibytes as an {@code int}
+         *
+         * @return the amount of data storage in kibibytes or {@code Integer.MAX_VALUE} if the number of kibibytes is too large.
+         */
+        public int toKibibytes()
+        {
+            return Ints.saturatedCast(unit().toKibibytes(quantity()));
+        }
+
+        /**
+         * Returns the amount of data storage in mebibytes as an {@code int}
+         *
+         * @return the amount of data storage in mebibytes or {@code Integer.MAX_VALUE} if the number of mebibytes is too large.
+         */
+        public int toMebibytes()
+        {
+            return Ints.saturatedCast(unit().toMebibytes(quantity()));
+        }
+
+        /**
+         * Returns the amount of data storage in bytes as {@code long}
+         *
+         * @return the amount of data storage in bytes.
+         */
+        public long toBytesInLong()
+        {
+            return unit().toBytes(quantity());
+        }
+    }
+
+    public enum DataStorageUnit
+    {
+        BYTES("B")
+        {
+            public long toBytes(long d)
+            {
+                return d;
+            }
+
+            public long toKibibytes(long d)
+            {
+                return (d / 1024L);
+            }
+
+            public long toMebibytes(long d)
+            {
+                return (d / (1024L * 1024));
+            }
+
+            public long toGibibytes(long d)
+            {
+                return (d / (1024L * 1024 * 1024));
+            }
+
+            public long convert(long source, DataStorageUnit sourceUnit)
+            {
+                return sourceUnit.toBytes(source);
+            }
+        },
+        KIBIBYTES("KiB")
+        {
+            public long toBytes(long d)
+            {
+                return x(d, 1024L, (MAX / 1024L));
+            }
+
+            public long toKibibytes(long d)
+            {
+                return d;
+            }
+
+            public long toMebibytes(long d)
+            {
+                return (d / 1024L);
+            }
+
+            public long toGibibytes(long d)
+            {
+                return (d / (1024L * 1024));
+            }
+
+            public long convert(long source, DataStorageUnit sourceUnit)
+            {
+                return sourceUnit.toKibibytes(source);
+            }
+        },
+        MEBIBYTES("MiB")
+        {
+            public long toBytes(long d)
+            {
+                return x(d, (1024L * 1024), MAX / (1024L * 1024));
+            }
+
+            public long toKibibytes(long d)
+            {
+                return x(d, 1024L, (MAX / 1024L));
+            }
+
+            public long toMebibytes(long d)
+            {
+                return d;
+            }
+
+            public long toGibibytes(long d)
+            {
+                return (d / 1024L);
+            }
+
+            public long convert(long source, DataStorageUnit sourceUnit)
+            {
+                return sourceUnit.toMebibytes(source);
+            }
+        },
+        GIBIBYTES("GiB")
+        {
+            public long toBytes(long d)
+            {
+                return x(d, (1024L * 1024 * 1024), MAX / (1024L * 1024 * 1024));
+            }
+
+            public long toKibibytes(long d)
+            {
+                return x(d, (1024L * 1024), MAX / (1024L * 1024));
+            }
+
+            public long toMebibytes(long d)
+            {
+                return x(d, 1024L, (MAX / 1024L));
+            }
+
+            public long toGibibytes(long d)
+            {
+                return d;
+            }
+
+            public long convert(long source, DataStorageUnit sourceUnit)
+            {
+                return sourceUnit.toGibibytes(source);
+            }
+        };
+
+        /**
+         * Scale d by m, checking for overflow. This has a short name to make above code more readable.
+         */
+        static long x(long d, long m, long over)
+        {
+            assert (over > 0) && (over < (MAX-1L)) && (over == (MAX / m));
+
+            if (d > over)
+                return Long.MAX_VALUE;
+            return Math.multiplyExact(d, m);
+        }
+
+        /**
+         * @param symbol the unit symbol
+         * @return the memory unit corresponding to the given symbol
+         */
+        public static DataStorageUnit fromSymbol(String symbol)
+        {
+            for (DataStorageUnit value : values())
+            {
+                if (value.symbol.equalsIgnoreCase(symbol))
+                    return value;
+            }
+            throw new IllegalArgumentException(String.format("Unsupported data storage unit: %s. Supported units are: %s",
+                                                           symbol, Arrays.stream(values())
+                                                                         .map(u -> u.symbol)
+                                                                         .collect(Collectors.joining(", "))));
+        }
+
+        static final long MAX = Long.MAX_VALUE;
+
+        /**
+         * The unit symbol
+         */
+        private final String symbol;
+
+        DataStorageUnit(String symbol)
+        {
+            this.symbol = symbol;
+        }
+
+        public long toBytes(long d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public long toKibibytes(long d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public long toMebibytes(long d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public long toGibibytes(long d)
+        {
+            throw new AbstractMethodError();
+        }
+
+        public long convert(long source, DataStorageUnit sourceUnit)
+        {
+            throw new AbstractMethodError();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
index 8893f58..a04e85c 100644
--- a/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
+++ b/src/java/org/apache/cassandra/config/DatabaseDescriptor.java
@@ -17,30 +17,41 @@
  */
 package org.apache.cassandra.config;
 
-import java.io.File;
 import java.io.IOException;
-import java.net.*;
+import java.net.Inet4Address;
+import java.net.Inet6Address;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.net.UnknownHostException;
 import java.nio.file.FileStore;
-import java.nio.file.NoSuchFileException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Function;
 import java.util.function.Supplier;
 
+import javax.annotation.Nullable;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.primitives.Ints;
 import com.google.common.primitives.Longs;
 import com.google.common.util.concurrent.RateLimiter;
-
+import org.apache.commons.lang3.ArrayUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.audit.AuditLogOptions;
-import org.apache.cassandra.fql.FullQueryLoggerOptions;
 import org.apache.cassandra.auth.AllowAllInternodeAuthenticator;
 import org.apache.cassandra.auth.AuthConfig;
 import org.apache.cassandra.auth.IAuthenticator;
@@ -49,6 +60,8 @@
 import org.apache.cassandra.auth.INetworkAuthorizer;
 import org.apache.cassandra.auth.IRoleManager;
 import org.apache.cassandra.config.Config.CommitLogSync;
+import org.apache.cassandra.config.Config.PaxosOnLinearizabilityViolation;
+import org.apache.cassandra.config.Config.PaxosStatePurging;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.commitlog.AbstractCommitLogSegmentManager;
 import org.apache.cassandra.db.commitlog.CommitLog;
@@ -56,9 +69,13 @@
 import org.apache.cassandra.db.commitlog.CommitLogSegmentManagerStandard;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.fql.FullQueryLoggerOptions;
+import org.apache.cassandra.gms.IFailureDetector;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.DiskOptimizationStrategy;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.PathUtils;
 import org.apache.cassandra.io.util.SpinningDiskOptimizationStrategy;
 import org.apache.cassandra.io.util.SsdDiskOptimizationStrategy;
 import org.apache.cassandra.locator.DynamicEndpointSnitch;
@@ -70,16 +87,18 @@
 import org.apache.cassandra.security.EncryptionContext;
 import org.apache.cassandra.security.SSLFactory;
 import org.apache.cassandra.service.CacheService.CacheType;
+import org.apache.cassandra.service.paxos.Paxos;
 import org.apache.cassandra.utils.FBUtilities;
 
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.StringUtils;
-
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.OS_ARCH;
 import static org.apache.cassandra.config.CassandraRelevantProperties.SUN_ARCH_DATA_MODEL;
-import static org.apache.cassandra.io.util.FileUtils.ONE_GB;
-import static org.apache.cassandra.io.util.FileUtils.ONE_MB;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_JVM_DTEST_DISABLE_SSL;
+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;
+import static org.apache.cassandra.io.util.FileUtils.ONE_GIB;
+import static org.apache.cassandra.io.util.FileUtils.ONE_MIB;
+import static org.apache.cassandra.utils.Clock.Global.logInitializationOutcome;
 
 public class DatabaseDescriptor
 {
@@ -93,7 +112,7 @@
     private static final Logger logger = LoggerFactory.getLogger(DatabaseDescriptor.class);
 
     /**
-     * Tokens are serialized in a Gossip VersionedValue String.  VV are restricted to 64KB
+     * Tokens are serialized in a Gossip VersionedValue String.  VV are restricted to 64KiB
      * when we send them over the wire, which works out to about 1700 tokens.
      */
     private static final int MAX_NUM_TOKENS = 1536;
@@ -103,8 +122,9 @@
     /**
      * Request timeouts can not be less than below defined value (see CASSANDRA-9375)
      */
-    static final long LOWEST_ACCEPTED_TIMEOUT = 10L;
+    static final DurationSpec.LongMillisecondsBound LOWEST_ACCEPTED_TIMEOUT = new DurationSpec.LongMillisecondsBound(10L);
 
+    private static Supplier<IFailureDetector> newFailureDetector;
     private static IEndpointSnitch snitch;
     private static InetAddress listenAddress; // leave null so we can fall through to getLocalHost
     private static InetAddress broadcastAddress;
@@ -126,11 +146,12 @@
     // depend on the configured IAuthenticator, so defer creating it until that's been set.
     private static IRoleManager roleManager;
 
-    private static long preparedStatementsCacheSizeInMB;
+    private static long preparedStatementsCacheSizeInMiB;
 
-    private static long keyCacheSizeInMB;
-    private static long counterCacheSizeInMB;
-    private static long indexSummaryCapacityInMB;
+    private static long keyCacheSizeInMiB;
+    private static long paxosCacheSizeInMiB;
+    private static long counterCacheSizeInMiB;
+    private static long indexSummaryCapacityInMiB;
 
     private static String localDC;
     private static Comparator<Replica> localComparator;
@@ -144,6 +165,7 @@
     private static boolean daemonInitialized;
 
     private static final int searchConcurrencyFactor = Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "search_concurrency_factor", "1"));
+    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");
@@ -153,6 +175,10 @@
 
     public static volatile boolean allowUnlimitedConcurrentValidations = Boolean.getBoolean("cassandra.allow_unlimited_concurrent_validations");
 
+    /** The configuration for guardrails. */
+    private static GuardrailsOptions guardrails;
+    private static StartupChecksOptions startupChecksOptions;
+
     private static Function<CommitLog, AbstractCommitLogSegmentManager> commitLogSegmentMgrProvider = c -> DatabaseDescriptor.isCDCEnabled()
                                        ? new CommitLogSegmentManagerCDC(c, DatabaseDescriptor.getCommitLogLocation())
                                        : new CommitLogSegmentManagerStandard(c, DatabaseDescriptor.getCommitLogLocation());
@@ -257,7 +283,7 @@
         if (clientInitialized)
             return;
         clientInitialized = true;
-
+        setDefaultFailureDetector();
         Config.setClientMode(true);
         conf = new Config();
         diskOptimizationStrategy = new SpinningDiskOptimizationStrategy();
@@ -362,6 +388,10 @@
         applyEncryptionContext();
 
         applySslContext();
+
+        applyGuardrails();
+
+        applyStartupChecks();
     }
 
     private static void applySimpleConfig()
@@ -370,42 +400,56 @@
         //InetAddressAndPort and get the right defaults
         InetAddressAndPort.initializeDefaultPort(getStoragePort());
 
+        validateUpperBoundStreamingConfig();
+
+        if (conf.auto_snapshot_ttl != null)
+        {
+            try
+            {
+                autoSnapshoTtl = new DurationSpec.IntSecondsBound(conf.auto_snapshot_ttl);
+            }
+            catch (IllegalArgumentException e)
+            {
+                throw new ConfigurationException("Invalid value of auto_snapshot_ttl: " + conf.auto_snapshot_ttl, false);
+            }
+        }
+
         if (conf.commitlog_sync == null)
         {
             throw new ConfigurationException("Missing required directive CommitLogSync", false);
         }
 
-        if (conf.commitlog_sync == Config.CommitLogSync.batch)
+        if (conf.commitlog_sync == CommitLogSync.batch)
         {
-            if (conf.commitlog_sync_period_in_ms != 0)
+            if (conf.commitlog_sync_period.toMilliseconds() != 0)
             {
-                throw new ConfigurationException("Batch sync specified, but commitlog_sync_period_in_ms found. Only specify commitlog_sync_batch_window_in_ms when using batch sync", false);
+                throw new ConfigurationException("Batch sync specified, but commitlog_sync_period found.", false);
             }
             logger.debug("Syncing log with batch mode");
         }
         else if (conf.commitlog_sync == CommitLogSync.group)
         {
-            if (Double.isNaN(conf.commitlog_sync_group_window_in_ms) || conf.commitlog_sync_group_window_in_ms <= 0d)
+            if (conf.commitlog_sync_group_window.toMilliseconds() == 0)
             {
-                throw new ConfigurationException("Missing value for commitlog_sync_group_window_in_ms: positive double value expected.", false);
+                throw new ConfigurationException("Missing value for commitlog_sync_group_window.", false);
             }
-            else if (conf.commitlog_sync_period_in_ms != 0)
+            else if (conf.commitlog_sync_period.toMilliseconds() != 0)
             {
-                throw new ConfigurationException("Group sync specified, but commitlog_sync_period_in_ms found. Only specify commitlog_sync_group_window_in_ms when using group sync", false);
+                throw new ConfigurationException("Group sync specified, but commitlog_sync_period found. Only specify commitlog_sync_group_window when using group sync", false);
             }
-            logger.debug("Syncing log with a group window of {}", conf.commitlog_sync_period_in_ms);
+            logger.debug("Syncing log with a group window of {}", conf.commitlog_sync_period.toString());
         }
         else
         {
-            if (conf.commitlog_sync_period_in_ms <= 0)
+            if (conf.commitlog_sync_period.toMilliseconds() == 0)
             {
-                throw new ConfigurationException("Missing value for commitlog_sync_period_in_ms: positive integer expected", false);
+                throw new ConfigurationException("Missing value for commitlog_sync_period.", false);
             }
             else if (!Double.isNaN(conf.commitlog_sync_batch_window_in_ms))
             {
-                throw new ConfigurationException("commitlog_sync_period_in_ms specified, but commitlog_sync_batch_window_in_ms found.  Only specify commitlog_sync_period_in_ms when using periodic sync.", false);
+                throw new ConfigurationException("commitlog_sync_period specified, but commitlog_sync_batch_window found.  Only specify commitlog_sync_period when using periodic sync.", false);
             }
-            logger.debug("Syncing log with a period of {}", conf.commitlog_sync_period_in_ms);
+            logger.debug("Syncing log with a period of {}", conf.commitlog_sync_period.toString());
         }
 
         /* evaluate the DiskAccessMode Config directive, which also affects indexAccessMode selection */
@@ -427,11 +471,6 @@
             logger.info("DiskAccessMode is {}, indexAccessMode is {}", conf.disk_access_mode, indexAccessMode);
         }
 
-        if (conf.gc_warn_threshold_in_ms < 0)
-        {
-            throw new ConfigurationException("gc_warn_threshold_in_ms must be a positive integer");
-        }
-
         /* phi convict threshold for FailureDetector */
         if (conf.phi_convict_threshold < 5 || conf.phi_convict_threshold > 16)
         {
@@ -455,34 +494,32 @@
         if (conf.concurrent_replicates != null)
             logger.warn("concurrent_replicates has been deprecated and should be removed from cassandra.yaml");
 
-        if (conf.networking_cache_size_in_mb == null)
-            conf.networking_cache_size_in_mb = Math.min(128, (int) (Runtime.getRuntime().maxMemory() / (16 * 1048576)));
+        if (conf.networking_cache_size == null)
+            conf.networking_cache_size = new DataStorageSpec.IntMebibytesBound(Math.min(128, (int) (Runtime.getRuntime().maxMemory() / (16 * 1048576))));
 
-        if (conf.file_cache_size_in_mb == null)
-            conf.file_cache_size_in_mb = Math.min(512, (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576)));
+        if (conf.file_cache_size == null)
+            conf.file_cache_size = new DataStorageSpec.IntMebibytesBound(Math.min(512, (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576))));
 
         // round down for SSDs and round up for spinning disks
         if (conf.file_cache_round_up == null)
             conf.file_cache_round_up = conf.disk_optimization_strategy == Config.DiskOptimizationStrategy.spinning;
 
-        if (conf.memtable_offheap_space_in_mb == null)
-            conf.memtable_offheap_space_in_mb = (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576));
-        if (conf.memtable_offheap_space_in_mb < 0)
-            throw new ConfigurationException("memtable_offheap_space_in_mb must be positive, but was " + conf.memtable_offheap_space_in_mb, false);
+        if (conf.memtable_offheap_space == null)
+            conf.memtable_offheap_space = new DataStorageSpec.IntMebibytesBound((int) (Runtime.getRuntime().maxMemory() / (4 * 1048576)));
         // for the moment, we default to twice as much on-heap space as off-heap, as heap overhead is very large
-        if (conf.memtable_heap_space_in_mb == null)
-            conf.memtable_heap_space_in_mb = (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576));
-        if (conf.memtable_heap_space_in_mb <= 0)
-            throw new ConfigurationException("memtable_heap_space_in_mb must be positive, but was " + conf.memtable_heap_space_in_mb, false);
-        logger.info("Global memtable on-heap threshold is enabled at {}MB", conf.memtable_heap_space_in_mb);
-        if (conf.memtable_offheap_space_in_mb == 0)
+        if (conf.memtable_heap_space == null)
+            conf.memtable_heap_space = new DataStorageSpec.IntMebibytesBound((int) (Runtime.getRuntime().maxMemory() / (4 * 1048576)));
+        if (conf.memtable_heap_space.toMebibytes() == 0)
+            throw new ConfigurationException("memtable_heap_space must be positive, but was " + conf.memtable_heap_space, false);
+        logger.info("Global memtable on-heap threshold is enabled at {}", conf.memtable_heap_space);
+        if (conf.memtable_offheap_space.toMebibytes() == 0)
             logger.info("Global memtable off-heap threshold is disabled, HeapAllocator will be used instead");
         else
-            logger.info("Global memtable off-heap threshold is enabled at {}MB", conf.memtable_offheap_space_in_mb);
+            logger.info("Global memtable off-heap threshold is enabled at {}", conf.memtable_offheap_space);
 
         if (conf.repair_session_max_tree_depth != null)
         {
-            logger.warn("repair_session_max_tree_depth has been deprecated and should be removed from cassandra.yaml. Use repair_session_space_in_mb instead");
+            logger.warn("repair_session_max_tree_depth has been deprecated and should be removed from cassandra.yaml. Use repair_session_space instead");
             if (conf.repair_session_max_tree_depth < 10)
                 throw new ConfigurationException("repair_session_max_tree_depth should not be < 10, but was " + conf.repair_session_max_tree_depth);
             if (conf.repair_session_max_tree_depth > 20)
@@ -493,27 +530,28 @@
             conf.repair_session_max_tree_depth = 20;
         }
 
-        if (conf.repair_session_space_in_mb == null)
-            conf.repair_session_space_in_mb = Math.max(1, (int) (Runtime.getRuntime().maxMemory() / (16 * 1048576)));
+        if (conf.repair_session_space == null)
+            conf.repair_session_space = new DataStorageSpec.IntMebibytesBound(Math.max(1, (int) (Runtime.getRuntime().maxMemory() / (16 * 1048576))));
 
-        if (conf.repair_session_space_in_mb < 1)
-            throw new ConfigurationException("repair_session_space_in_mb must be > 0, but was " + conf.repair_session_space_in_mb);
-        else if (conf.repair_session_space_in_mb > (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576)))
-            logger.warn("A repair_session_space_in_mb of " + conf.repair_session_space_in_mb + " megabytes is likely to cause heap pressure");
+        if (conf.repair_session_space.toMebibytes() < 1)
+            throw new ConfigurationException("repair_session_space must be > 0, but was " + conf.repair_session_space);
+        else if (conf.repair_session_space.toMebibytes() > (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576)))
+            logger.warn("A repair_session_space of " + conf.repair_session_space+ " mebibytes is likely to cause heap pressure");
 
         checkForLowestAcceptedTimeouts(conf);
 
-        checkValidForByteConversion(conf.native_transport_max_frame_size_in_mb,
-                                    "native_transport_max_frame_size_in_mb", ByteUnit.MEBI_BYTES);
+        long valueInBytes = conf.native_transport_max_frame_size.toBytes();
+        if (valueInBytes < 0 || valueInBytes > Integer.MAX_VALUE-1)
+        {
+            throw new ConfigurationException(String.format("native_transport_max_frame_size must be positive value < %dB, but was %dB",
+                                                           Integer.MAX_VALUE,
+                                                           valueInBytes),
+                                             false);
+        }
 
-        checkValidForByteConversion(conf.column_index_size_in_kb,
-                                    "column_index_size_in_kb", ByteUnit.KIBI_BYTES);
-
-        checkValidForByteConversion(conf.column_index_cache_size_in_kb,
-                                    "column_index_cache_size_in_kb", ByteUnit.KIBI_BYTES);
-
-        checkValidForByteConversion(conf.batch_size_warn_threshold_in_kb,
-                                    "batch_size_warn_threshold_in_kb", ByteUnit.KIBI_BYTES);
+        checkValidForByteConversion(conf.column_index_size, "column_index_size");
+        checkValidForByteConversion(conf.column_index_cache_size, "column_index_cache_size");
+        checkValidForByteConversion(conf.batch_size_warn_threshold, "batch_size_warn_threshold");
 
         if (conf.native_transport_max_negotiable_protocol_version != null)
             logger.warn("The configuration option native_transport_max_negotiable_protocol_version has been deprecated " +
@@ -531,68 +569,52 @@
             conf.hints_directory = storagedirFor("hints");
         }
 
-        if (conf.native_transport_max_concurrent_requests_in_bytes <= 0)
+        if (conf.native_transport_max_request_data_in_flight == null)
         {
-            conf.native_transport_max_concurrent_requests_in_bytes = Runtime.getRuntime().maxMemory() / 10;
+            conf.native_transport_max_request_data_in_flight = new DataStorageSpec.LongBytesBound(Runtime.getRuntime().maxMemory() / 10);
         }
 
-        if (conf.native_transport_max_concurrent_requests_in_bytes_per_ip <= 0)
+        if (conf.native_transport_max_request_data_in_flight_per_ip == null)
         {
-            conf.native_transport_max_concurrent_requests_in_bytes_per_ip = Runtime.getRuntime().maxMemory() / 40;
+            conf.native_transport_max_request_data_in_flight_per_ip = new DataStorageSpec.LongBytesBound(Runtime.getRuntime().maxMemory() / 40);
         }
 
-        if (conf.commitlog_total_space_in_mb == null)
-        {
-            final int preferredSizeInMB = 8192;
-            try
-            {
-                // use 1/4 of available space.  See discussion on #10013 and #10199
-                final long totalSpaceInBytes = guessFileStore(conf.commitlog_directory).getTotalSpace();
-                conf.commitlog_total_space_in_mb = calculateDefaultSpaceInMB("commitlog",
-                                                                             conf.commitlog_directory,
-                                                                             "commitlog_total_space_in_mb",
-                                                                             preferredSizeInMB,
-                                                                             totalSpaceInBytes, 1, 4);
+        if (conf.native_transport_rate_limiting_enabled)
+            logger.info("Native transport rate-limiting enabled at {} requests/second.", conf.native_transport_max_requests_per_second);
+        else
+            logger.info("Native transport rate-limiting disabled.");
 
-            }
-            catch (IOException e)
-            {
-                logger.debug("Error checking disk space", e);
-                throw new ConfigurationException(String.format("Unable to check disk space available to '%s'. Perhaps the Cassandra user does not have the necessary permissions",
-                                                               conf.commitlog_directory), e);
-            }
+        if (conf.commitlog_total_space == null)
+        {
+            final int preferredSizeInMiB = 8192;
+            // use 1/4 of available space.  See discussion on #10013 and #10199
+            final long totalSpaceInBytes = tryGetSpace(conf.commitlog_directory, FileStore::getTotalSpace);
+            int defaultSpaceInMiB = calculateDefaultSpaceInMiB("commitlog",
+                                                               conf.commitlog_directory,
+                                                               "commitlog_total_space",
+                                                               preferredSizeInMiB,
+                                                               totalSpaceInBytes, 1, 4);
+            conf.commitlog_total_space = new DataStorageSpec.IntMebibytesBound(defaultSpaceInMiB);
         }
 
         if (conf.cdc_enabled)
         {
-            // Windows memory-mapped CommitLog files is incompatible with CDC as we hard-link files in cdc_raw. Confirm we don't have both enabled.
-            if (FBUtilities.isWindows && conf.commitlog_compression == null)
-                throw new ConfigurationException("Cannot enable cdc on Windows with uncompressed commitlog.");
-
             if (conf.cdc_raw_directory == null)
             {
                 conf.cdc_raw_directory = storagedirFor("cdc_raw");
             }
 
-            if (conf.cdc_total_space_in_mb == 0)
+            if (conf.cdc_total_space.toMebibytes() == 0)
             {
-                final int preferredSizeInMB = 4096;
-                try
-                {
-                    // use 1/8th of available space.  See discussion on #10013 and #10199 on the CL, taking half that for CDC
-                    final long totalSpaceInBytes = guessFileStore(conf.cdc_raw_directory).getTotalSpace();
-                    conf.cdc_total_space_in_mb = calculateDefaultSpaceInMB("cdc",
-                                                                           conf.cdc_raw_directory,
-                                                                           "cdc_total_space_in_mb",
-                                                                           preferredSizeInMB,
-                                                                           totalSpaceInBytes, 1, 8);
-                }
-                catch (IOException e)
-                {
-                    logger.debug("Error checking disk space", e);
-                    throw new ConfigurationException(String.format("Unable to check disk space available to '%s'. Perhaps the Cassandra user does not have the necessary permissions",
-                                                                   conf.cdc_raw_directory), e);
-                }
+                final int preferredSizeInMiB = 4096;
+                // use 1/8th of available space.  See discussion on #10013 and #10199 on the CL, taking half that for CDC
+                final long totalSpaceInBytes = tryGetSpace(conf.cdc_raw_directory, FileStore::getTotalSpace);
+                int defaultSpaceInMiB = calculateDefaultSpaceInMiB("cdc",
+                                                                   conf.cdc_raw_directory,
+                                                                   "cdc_total_space",
+                                                                   preferredSizeInMiB,
+                                                                   totalSpaceInBytes, 1, 8);
+                conf.cdc_total_space = new DataStorageSpec.IntMebibytesBound(defaultSpaceInMiB);
             }
 
             logger.info("cdc_enabled is true. Starting casssandra node with Change-Data-Capture enabled.");
@@ -604,7 +626,7 @@
         }
         if (conf.data_file_directories == null || conf.data_file_directories.length == 0)
         {
-            conf.data_file_directories = new String[]{ storagedir("data_file_directories") + File.separator + "data" };
+            conf.data_file_directories = new String[]{ storagedir("data_file_directories") + File.pathSeparator() + "data" };
         }
 
         long dataFreeBytes = 0;
@@ -622,9 +644,9 @@
             if (datadir.equals(conf.saved_caches_directory))
                 throw new ConfigurationException("saved_caches_directory must not be the same as any data_file_directories", false);
 
-            dataFreeBytes = saturatedSum(dataFreeBytes, getUnallocatedSpace(datadir));
+            dataFreeBytes = saturatedSum(dataFreeBytes, tryGetSpace(datadir, FileStore::getUnallocatedSpace));
         }
-        if (dataFreeBytes < 64 * ONE_GB) // 64 GB
+        if (dataFreeBytes < 64 * ONE_GIB) // 64 GB
             logger.warn("Only {} free across all data volumes. Consider adding more capacity to your cluster or removing obsolete snapshots",
                         FBUtilities.prettyPrintMemory(dataFreeBytes));
 
@@ -637,9 +659,9 @@
             if (conf.local_system_data_file_directory.equals(conf.hints_directory))
                 throw new ConfigurationException("local_system_data_file_directory must not be the same as the hints_directory", false);
 
-            long freeBytes = getUnallocatedSpace(conf.local_system_data_file_directory);
+            long freeBytes = tryGetSpace(conf.local_system_data_file_directory, FileStore::getUnallocatedSpace);
 
-            if (freeBytes < ONE_GB)
+            if (freeBytes < ONE_GIB)
                 logger.warn("Only {} free in the system data volume. Consider adding more capacity or removing obsolete snapshots",
                             FBUtilities.prettyPrintMemory(freeBytes));
         }
@@ -683,6 +705,7 @@
 
         applyConcurrentValidations(conf);
         applyRepairCommandPoolSize(conf);
+        applyReadThresholdsValidations(conf);
 
         if (conf.concurrent_materialized_view_builders <= 0)
             throw new ConfigurationException("concurrent_materialized_view_builders should be strictly greater than 0, but was " + conf.concurrent_materialized_view_builders, false);
@@ -692,101 +715,112 @@
 
         try
         {
-            // if prepared_statements_cache_size_mb option was set to "auto" then size of the cache should be "max(1/256 of Heap (in MB), 10MB)"
-            preparedStatementsCacheSizeInMB = (conf.prepared_statements_cache_size_mb == null)
+            // if prepared_statements_cache_size option was set to "auto" then size of the cache should be "max(1/256 of Heap (in MiB), 10MiB)"
+            preparedStatementsCacheSizeInMiB = (conf.prepared_statements_cache_size == null)
                                               ? Math.max(10, (int) (Runtime.getRuntime().maxMemory() / 1024 / 1024 / 256))
-                                              : conf.prepared_statements_cache_size_mb;
+                                              : conf.prepared_statements_cache_size.toMebibytes();
 
-            if (preparedStatementsCacheSizeInMB <= 0)
+            if (preparedStatementsCacheSizeInMiB == 0)
                 throw new NumberFormatException(); // to escape duplicating error message
 
             // we need this assignment for the Settings virtual table - CASSANDRA-17734
-            conf.prepared_statements_cache_size_mb = preparedStatementsCacheSizeInMB;
+            conf.prepared_statements_cache_size = new DataStorageSpec.LongMebibytesBound(preparedStatementsCacheSizeInMiB);
         }
         catch (NumberFormatException e)
         {
-            throw new ConfigurationException("prepared_statements_cache_size_mb option was set incorrectly to '"
-                                             + conf.prepared_statements_cache_size_mb + "', supported values are <integer> >= 0.", false);
+            throw new ConfigurationException("prepared_statements_cache_size option was set incorrectly to '"
+                                             + (conf.prepared_statements_cache_size != null ? conf.prepared_statements_cache_size.toString() : null) + "', supported values are <integer> >= 0.", false);
         }
 
         try
         {
-            // if key_cache_size_in_mb option was set to "auto" then size of the cache should be "min(5% of Heap (in MB), 100MB)
-            keyCacheSizeInMB = (conf.key_cache_size_in_mb == null)
+            // if key_cache_size option was set to "auto" then size of the cache should be "min(5% of Heap (in MiB), 100MiB)
+            keyCacheSizeInMiB = (conf.key_cache_size == null)
                                ? Math.min(Math.max(1, (int) (Runtime.getRuntime().totalMemory() * 0.05 / 1024 / 1024)), 100)
-                               : conf.key_cache_size_in_mb;
+                               : conf.key_cache_size.toMebibytes();
 
-            if (keyCacheSizeInMB < 0)
+            if (keyCacheSizeInMiB < 0)
                 throw new NumberFormatException(); // to escape duplicating error message
 
             // we need this assignment for the Settings Virtual Table - CASSANDRA-17734
-            conf.key_cache_size_in_mb = keyCacheSizeInMB;
+            conf.key_cache_size = new DataStorageSpec.LongMebibytesBound(keyCacheSizeInMiB);
         }
         catch (NumberFormatException e)
         {
-            throw new ConfigurationException("key_cache_size_in_mb option was set incorrectly to '"
-                                             + conf.key_cache_size_in_mb + "', supported values are <integer> >= 0.", false);
+            throw new ConfigurationException("key_cache_size option was set incorrectly to '"
+                                             + (conf.key_cache_size != null ? conf.key_cache_size.toString() : null) + "', supported values are <integer> >= 0.", false);
         }
 
         try
         {
-            // if counter_cache_size_in_mb option was set to "auto" then size of the cache should be "min(2.5% of Heap (in MB), 50MB)
-            counterCacheSizeInMB = (conf.counter_cache_size_in_mb == null)
+            // if counter_cache_size option was set to "auto" then size of the cache should be "min(2.5% of Heap (in MiB), 50MiB)
+            counterCacheSizeInMiB = (conf.counter_cache_size == null)
                                    ? Math.min(Math.max(1, (int) (Runtime.getRuntime().totalMemory() * 0.025 / 1024 / 1024)), 50)
-                                   : conf.counter_cache_size_in_mb;
+                                   : conf.counter_cache_size.toMebibytes();
 
-            if (counterCacheSizeInMB < 0)
+            if (counterCacheSizeInMiB < 0)
                 throw new NumberFormatException(); // to escape duplicating error message
         }
         catch (NumberFormatException e)
         {
-            throw new ConfigurationException("counter_cache_size_in_mb option was set incorrectly to '"
-                                             + conf.counter_cache_size_in_mb + "', supported values are <integer> >= 0.", false);
+            throw new ConfigurationException("counter_cache_size option was set incorrectly to '"
+                                             + (conf.counter_cache_size !=null ?conf.counter_cache_size.toString() : null) + "', supported values are <integer> >= 0.", false);
+        }
+
+        try
+        {
+            // if paxosCacheSizeInMiB option was set to "auto" then size of the cache should be "min(1% of Heap (in MB), 50MB)
+            paxosCacheSizeInMiB = (conf.paxos_cache_size == null)
+                    ? Math.min(Math.max(1, (int) (Runtime.getRuntime().totalMemory() * 0.01 / 1024 / 1024)), 50)
+                    : conf.paxos_cache_size.toMebibytes();
+
+            if (paxosCacheSizeInMiB < 0)
+                throw new NumberFormatException(); // to escape duplicating error message
+        }
+        catch (NumberFormatException e)
+        {
+            throw new ConfigurationException("paxos_cache_size option was set incorrectly to '"
+                    + conf.paxos_cache_size + "', supported values are <integer> >= 0.", false);
         }
 
         // we need this assignment for the Settings virtual table - CASSANDRA-17735
-        conf.counter_cache_size_in_mb = counterCacheSizeInMB;
+        conf.counter_cache_size = new DataStorageSpec.LongMebibytesBound(counterCacheSizeInMiB);
 
         // if set to empty/"auto" then use 5% of Heap size
-        indexSummaryCapacityInMB = (conf.index_summary_capacity_in_mb == null)
+        indexSummaryCapacityInMiB = (conf.index_summary_capacity == null)
                                    ? Math.max(1, (int) (Runtime.getRuntime().totalMemory() * 0.05 / 1024 / 1024))
-                                   : conf.index_summary_capacity_in_mb;
+                                   : conf.index_summary_capacity.toMebibytes();
 
-        if (indexSummaryCapacityInMB < 0)
-            throw new ConfigurationException("index_summary_capacity_in_mb option was set incorrectly to '"
-                                             + conf.index_summary_capacity_in_mb + "', it should be a non-negative integer.", false);
+        if (indexSummaryCapacityInMiB < 0)
+            throw new ConfigurationException("index_summary_capacity option was set incorrectly to '"
+                                             + conf.index_summary_capacity.toString() + "', it should be a non-negative integer.", false);
 
         // we need this assignment for the Settings virtual table - CASSANDRA-17735
-        conf.index_summary_capacity_in_mb = indexSummaryCapacityInMB;
+        conf.index_summary_capacity = new DataStorageSpec.LongMebibytesBound(indexSummaryCapacityInMiB);
 
-        if (conf.user_defined_function_fail_timeout < 0)
-            throw new ConfigurationException("user_defined_function_fail_timeout must not be negative", false);
-        if (conf.user_defined_function_warn_timeout < 0)
-            throw new ConfigurationException("user_defined_function_warn_timeout must not be negative", false);
+        if (conf.user_defined_functions_fail_timeout.toMilliseconds() < conf.user_defined_functions_warn_timeout.toMilliseconds())
+            throw new ConfigurationException("user_defined_functions_warn_timeout must less than user_defined_function_fail_timeout", false);
 
-        if (conf.user_defined_function_fail_timeout < conf.user_defined_function_warn_timeout)
-            throw new ConfigurationException("user_defined_function_warn_timeout must less than user_defined_function_fail_timeout", false);
-
-        if (!conf.allow_insecure_udfs && !conf.enable_user_defined_functions_threads)
+        if (!conf.allow_insecure_udfs && !conf.user_defined_functions_threads_enabled)
             throw new ConfigurationException("To be able to set enable_user_defined_functions_threads: false you need to set allow_insecure_udfs: true - this is an unsafe configuration and is not recommended.");
 
         if (conf.allow_extra_insecure_udfs)
             logger.warn("Allowing java.lang.System.* access in UDFs is dangerous and not recommended. Set allow_extra_insecure_udfs: false to disable.");
 
-        if(conf.enable_scripted_user_defined_functions)
+        if(conf.scripted_user_defined_functions_enabled)
             logger.warn("JavaScript user-defined functions have been deprecated. You can still use them but the plan is to remove them in the next major version. For more information - CASSANDRA-17280");
 
-        if (conf.commitlog_segment_size_in_mb <= 0)
-            throw new ConfigurationException("commitlog_segment_size_in_mb must be positive, but was "
-                    + conf.commitlog_segment_size_in_mb, false);
-        else if (conf.commitlog_segment_size_in_mb >= 2048)
-            throw new ConfigurationException("commitlog_segment_size_in_mb must be smaller than 2048, but was "
-                    + conf.commitlog_segment_size_in_mb, false);
+        if (conf.commitlog_segment_size.toMebibytes() == 0)
+            throw new ConfigurationException("commitlog_segment_size must be positive, but was "
+                                             + conf.commitlog_segment_size.toString(), false);
+        else if (conf.commitlog_segment_size.toMebibytes() >= 2048)
+            throw new ConfigurationException("commitlog_segment_size must be smaller than 2048, but was "
+                                             + conf.commitlog_segment_size.toString(), false);
 
-        if (conf.max_mutation_size_in_kb == null)
-            conf.max_mutation_size_in_kb = conf.commitlog_segment_size_in_mb * 1024 / 2;
-        else if (conf.commitlog_segment_size_in_mb * 1024 < 2 * conf.max_mutation_size_in_kb)
-            throw new ConfigurationException("commitlog_segment_size_in_mb must be at least twice the size of max_mutation_size_in_kb / 1024", false);
+        if (conf.max_mutation_size == null)
+            conf.max_mutation_size = new DataStorageSpec.IntKibibytesBound(conf.commitlog_segment_size.toKibibytes() / 2);
+        else if (conf.commitlog_segment_size.toKibibytes() < 2 * conf.max_mutation_size.toKibibytes())
+            throw new ConfigurationException("commitlog_segment_size must be at least twice the size of max_mutation_size / 1024", false);
 
         // native transport encryption options
         if (conf.client_encryption_options != null)
@@ -804,11 +838,11 @@
         if (conf.snapshot_links_per_second < 0)
             throw new ConfigurationException("snapshot_links_per_second must be >= 0");
 
-        if (conf.max_value_size_in_mb <= 0)
-            throw new ConfigurationException("max_value_size_in_mb must be positive", false);
-        else if (conf.max_value_size_in_mb >= 2048)
-            throw new ConfigurationException("max_value_size_in_mb must be smaller than 2048, but was "
-                    + conf.max_value_size_in_mb, false);
+        if (conf.max_value_size.toMebibytes() == 0)
+            throw new ConfigurationException("max_value_size must be positive", false);
+        else if (conf.max_value_size.toMebibytes() >= 2048)
+            throw new ConfigurationException("max_value_size must be smaller than 2048, but was "
+                    + conf.max_value_size.toString(), false);
 
         switch (conf.disk_optimization_strategy)
         {
@@ -824,35 +858,84 @@
         {
             conf.server_encryption_options.applyConfig();
 
-            if (conf.server_encryption_options.enable_legacy_ssl_storage_port &&
+            if (conf.server_encryption_options.legacy_ssl_storage_port_enabled &&
                 conf.server_encryption_options.tlsEncryptionPolicy() == EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED)
             {
-                throw new ConfigurationException("enable_legacy_ssl_storage_port is true (enabled) with internode encryption disabled (none). Enable encryption or disable the legacy ssl storage port.");
+                throw new ConfigurationException("legacy_ssl_storage_port_enabled is true (enabled) with internode encryption disabled (none). Enable encryption or disable the legacy ssl storage port.");
             }
         }
-        Integer maxMessageSize = conf.internode_max_message_size_in_bytes;
-        if (maxMessageSize != null)
+
+        if (conf.internode_max_message_size != null)
         {
-            if (maxMessageSize > conf.internode_application_receive_queue_reserve_endpoint_capacity_in_bytes)
-                throw new ConfigurationException("internode_max_message_size_in_mb must no exceed internode_application_receive_queue_reserve_endpoint_capacity_in_bytes", false);
+            long maxMessageSize = conf.internode_max_message_size.toBytes();
 
-            if (maxMessageSize > conf.internode_application_receive_queue_reserve_global_capacity_in_bytes)
-                throw new ConfigurationException("internode_max_message_size_in_mb must no exceed internode_application_receive_queue_reserve_global_capacity_in_bytes", false);
+            if (maxMessageSize > conf.internode_application_receive_queue_reserve_endpoint_capacity.toBytes())
+                throw new ConfigurationException("internode_max_message_size must no exceed internode_application_receive_queue_reserve_endpoint_capacity", false);
 
-            if (maxMessageSize > conf.internode_application_send_queue_reserve_endpoint_capacity_in_bytes)
-                throw new ConfigurationException("internode_max_message_size_in_mb must no exceed internode_application_send_queue_reserve_endpoint_capacity_in_bytes", false);
+            if (maxMessageSize > conf.internode_application_receive_queue_reserve_global_capacity.toBytes())
+                throw new ConfigurationException("internode_max_message_size must no exceed internode_application_receive_queue_reserve_global_capacity", false);
 
-            if (maxMessageSize > conf.internode_application_send_queue_reserve_global_capacity_in_bytes)
-                throw new ConfigurationException("internode_max_message_size_in_mb must no exceed internode_application_send_queue_reserve_global_capacity_in_bytes", false);
+            if (maxMessageSize > conf.internode_application_send_queue_reserve_endpoint_capacity.toBytes())
+                throw new ConfigurationException("internode_max_message_size must no exceed internode_application_send_queue_reserve_endpoint_capacity", false);
+
+            if (maxMessageSize > conf.internode_application_send_queue_reserve_global_capacity.toBytes())
+                throw new ConfigurationException("internode_max_message_size must no exceed internode_application_send_queue_reserve_global_capacity", false);
         }
         else
         {
-            conf.internode_max_message_size_in_bytes =
-                Math.min(conf.internode_application_receive_queue_reserve_endpoint_capacity_in_bytes,
-                         conf.internode_application_send_queue_reserve_endpoint_capacity_in_bytes);
+            long maxMessageSizeInBytes =
+            Math.min(conf.internode_application_receive_queue_reserve_endpoint_capacity.toBytes(),
+                     conf.internode_application_send_queue_reserve_endpoint_capacity.toBytes());
+
+            conf.internode_max_message_size = new DataStorageSpec.IntBytesBound(maxMessageSizeInBytes);
         }
 
         validateMaxConcurrentAutoUpgradeTasksConf(conf.max_concurrent_automatic_sstable_upgrades);
+
+        if (conf.default_keyspace_rf < conf.minimum_replication_factor_fail_threshold)
+        {
+            throw new ConfigurationException(String.format("default_keyspace_rf (%d) cannot be less than minimum_replication_factor_fail_threshold (%d)",
+                                                           conf.default_keyspace_rf, conf.minimum_replication_factor_fail_threshold));
+        }
+
+        if (conf.paxos_repair_parallelism <= 0)
+            conf.paxos_repair_parallelism = Math.max(1, conf.concurrent_writes / 8);
+
+        Paxos.setPaxosVariant(conf.paxos_variant);
+        if (conf.paxos_state_purging == null)
+            conf.paxos_state_purging = PaxosStatePurging.legacy;
+
+        logInitializationOutcome(logger);
+    }
+
+    @VisibleForTesting
+    static void validateUpperBoundStreamingConfig() throws ConfigurationException
+    {
+        // below 2 checks are needed in order to match the pre-CASSANDRA-15234 upper bound for those parameters which were still in megabits per second
+        if (conf.stream_throughput_outbound.toMegabitsPerSecond() >= Integer.MAX_VALUE)
+        {
+            throw new ConfigurationException("Invalid value of stream_throughput_outbound: " + conf.stream_throughput_outbound.toString(), false);
+        }
+
+        if (conf.inter_dc_stream_throughput_outbound.toMegabitsPerSecond() >= Integer.MAX_VALUE)
+        {
+            throw new ConfigurationException("Invalid value of inter_dc_stream_throughput_outbound: " + conf.inter_dc_stream_throughput_outbound.toString(), false);
+        }
+
+        if (conf.entire_sstable_stream_throughput_outbound.toMebibytesPerSecond() >= Integer.MAX_VALUE)
+        {
+            throw new ConfigurationException("Invalid value of entire_sstable_stream_throughput_outbound: " + conf.entire_sstable_stream_throughput_outbound.toString(), false);
+        }
+
+        if (conf.entire_sstable_inter_dc_stream_throughput_outbound.toMebibytesPerSecond() >= Integer.MAX_VALUE)
+        {
+            throw new ConfigurationException("Invalid value of entire_sstable_inter_dc_stream_throughput_outbound: " + conf.entire_sstable_inter_dc_stream_throughput_outbound.toString(), false);
+        }
+
+        if (conf.compaction_throughput.toMebibytesPerSecond() >= Integer.MAX_VALUE)
+        {
+            throw new ConfigurationException("Invalid value of compaction_throughput: " + conf.compaction_throughput.toString(), false);
+        }
     }
 
     @VisibleForTesting
@@ -876,9 +959,52 @@
             config.repair_command_pool_size = config.concurrent_validations;
     }
 
+    @VisibleForTesting
+    static void applyReadThresholdsValidations(Config config)
+    {
+        validateReadThresholds("coordinator_read_size", config.coordinator_read_size_warn_threshold, config.coordinator_read_size_fail_threshold);
+        validateReadThresholds("local_read_size", config.local_read_size_warn_threshold, config.local_read_size_fail_threshold);
+        validateReadThresholds("row_index_read_size", config.row_index_read_size_warn_threshold, config.row_index_read_size_fail_threshold);
+    }
+
+    private static void validateReadThresholds(String name, DataStorageSpec.LongBytesBound warn, DataStorageSpec.LongBytesBound fail)
+    {
+        if (fail != null && warn != null && fail.toBytes() < warn.toBytes())
+            throw new ConfigurationException(String.format("%s (%s) must be greater than or equal to %s (%s)",
+                                                           name + "_fail_threshold", fail,
+                                                           name + "_warn_threshold", warn));
+    }
+
+    public static GuardrailsOptions getGuardrailsConfig()
+    {
+        return guardrails;
+    }
+
+    private static void applyGuardrails()
+    {
+        try
+        {
+            guardrails = new GuardrailsOptions(conf);
+        }
+        catch (IllegalArgumentException e)
+        {
+            throw new ConfigurationException("Invalid guardrails configuration: " + e.getMessage(), e);
+        }
+    }
+
+    public static StartupChecksOptions getStartupChecksOptions()
+    {
+        return startupChecksOptions;
+    }
+
+    private static void applyStartupChecks()
+    {
+        startupChecksOptions = new StartupChecksOptions(conf.startup_checks);
+    }
+
     private static String storagedirFor(String type)
     {
-        return storagedir(type + "_directory") + File.separator + type;
+        return storagedir(type + "_directory") + File.pathSeparator() + type;
     }
 
     private static String storagedir(String errMsgType)
@@ -889,20 +1015,20 @@
         return storagedir;
     }
 
-    static int calculateDefaultSpaceInMB(String type, String path, String setting, int preferredSizeInMB, long totalSpaceInBytes, long totalSpaceNumerator, long totalSpaceDenominator)
+    static int calculateDefaultSpaceInMiB(String type, String path, String setting, int preferredSizeInMiB, long totalSpaceInBytes, long totalSpaceNumerator, long totalSpaceDenominator)
     {
-        final long totalSizeInMB = totalSpaceInBytes / ONE_MB;
-        final int minSizeInMB = Ints.saturatedCast(totalSpaceNumerator * totalSizeInMB / totalSpaceDenominator);
+        final long totalSizeInMiB = totalSpaceInBytes / ONE_MIB;
+        final int minSizeInMiB = Ints.saturatedCast(totalSpaceNumerator * totalSizeInMiB / totalSpaceDenominator);
 
-        if (minSizeInMB < preferredSizeInMB)
+        if (minSizeInMiB < preferredSizeInMiB)
         {
             logger.warn("Small {} volume detected at '{}'; setting {} to {}.  You can override this in cassandra.yaml",
-                        type, path, setting, minSizeInMB);
-            return minSizeInMB;
+                        type, path, setting, minSizeInMiB);
+            return minSizeInMiB;
         }
         else
         {
-            return preferredSizeInMB;
+            return preferredSizeInMiB;
         }
     }
 
@@ -1015,6 +1141,9 @@
 
     public static void applySslContext()
     {
+        if (TEST_JVM_DTEST_DISABLE_SSL.getBoolean())
+            return;
+
         try
         {
             SSLFactory.validateSslContext("Internode messaging", conf.server_encryption_options, true, true);
@@ -1051,52 +1180,55 @@
     @VisibleForTesting
     static void checkForLowestAcceptedTimeouts(Config conf)
     {
-        if(conf.read_request_timeout_in_ms < LOWEST_ACCEPTED_TIMEOUT)
+        if(conf.read_request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())
         {
-           logInfo("read_request_timeout_in_ms", conf.read_request_timeout_in_ms, LOWEST_ACCEPTED_TIMEOUT);
-           conf.read_request_timeout_in_ms = LOWEST_ACCEPTED_TIMEOUT;
+            logInfo("read_request_timeout", conf.read_request_timeout, LOWEST_ACCEPTED_TIMEOUT);
+            conf.read_request_timeout = new DurationSpec.LongMillisecondsBound("10ms");
         }
 
-        if(conf.range_request_timeout_in_ms < LOWEST_ACCEPTED_TIMEOUT)
+        if(conf.range_request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())
         {
-           logInfo("range_request_timeout_in_ms", conf.range_request_timeout_in_ms, LOWEST_ACCEPTED_TIMEOUT);
-           conf.range_request_timeout_in_ms = LOWEST_ACCEPTED_TIMEOUT;
+            logInfo("range_request_timeout", conf.range_request_timeout, LOWEST_ACCEPTED_TIMEOUT);
+            conf.range_request_timeout = new DurationSpec.LongMillisecondsBound("10ms");
         }
 
-        if(conf.request_timeout_in_ms < LOWEST_ACCEPTED_TIMEOUT)
+        if(conf.request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())
         {
-           logInfo("request_timeout_in_ms", conf.request_timeout_in_ms, LOWEST_ACCEPTED_TIMEOUT);
-           conf.request_timeout_in_ms = LOWEST_ACCEPTED_TIMEOUT;
+            logInfo("request_timeout", conf.request_timeout, LOWEST_ACCEPTED_TIMEOUT);
+            conf.request_timeout = new DurationSpec.LongMillisecondsBound("10ms");
         }
 
-        if(conf.write_request_timeout_in_ms < LOWEST_ACCEPTED_TIMEOUT)
+        if(conf.write_request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())
         {
-           logInfo("write_request_timeout_in_ms", conf.write_request_timeout_in_ms, LOWEST_ACCEPTED_TIMEOUT);
-           conf.write_request_timeout_in_ms = LOWEST_ACCEPTED_TIMEOUT;
+            logInfo("write_request_timeout", conf.write_request_timeout, LOWEST_ACCEPTED_TIMEOUT);
+            conf.write_request_timeout = new DurationSpec.LongMillisecondsBound("10ms");
         }
 
-        if(conf.cas_contention_timeout_in_ms < LOWEST_ACCEPTED_TIMEOUT)
+        if(conf.cas_contention_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())
         {
-           logInfo("cas_contention_timeout_in_ms", conf.cas_contention_timeout_in_ms, LOWEST_ACCEPTED_TIMEOUT);
-           conf.cas_contention_timeout_in_ms = LOWEST_ACCEPTED_TIMEOUT;
+            logInfo("cas_contention_timeout", conf.cas_contention_timeout, LOWEST_ACCEPTED_TIMEOUT);
+            conf.cas_contention_timeout = new DurationSpec.LongMillisecondsBound("10ms");
         }
 
-        if(conf.counter_write_request_timeout_in_ms < LOWEST_ACCEPTED_TIMEOUT)
+        if(conf.counter_write_request_timeout.toMilliseconds()< LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())
         {
-           logInfo("counter_write_request_timeout_in_ms", conf.counter_write_request_timeout_in_ms, LOWEST_ACCEPTED_TIMEOUT);
-           conf.counter_write_request_timeout_in_ms = LOWEST_ACCEPTED_TIMEOUT;
+            logInfo("counter_write_request_timeout", conf.counter_write_request_timeout, LOWEST_ACCEPTED_TIMEOUT);
+            conf.counter_write_request_timeout = new DurationSpec.LongMillisecondsBound("10ms");
         }
-
-        if(conf.truncate_request_timeout_in_ms < LOWEST_ACCEPTED_TIMEOUT)
+        if(conf.truncate_request_timeout.toMilliseconds() < LOWEST_ACCEPTED_TIMEOUT.toMilliseconds())
         {
-           logInfo("truncate_request_timeout_in_ms", conf.truncate_request_timeout_in_ms, LOWEST_ACCEPTED_TIMEOUT);
-           conf.truncate_request_timeout_in_ms = LOWEST_ACCEPTED_TIMEOUT;
+            logInfo("truncate_request_timeout", conf.truncate_request_timeout, LOWEST_ACCEPTED_TIMEOUT);
+            conf.truncate_request_timeout = LOWEST_ACCEPTED_TIMEOUT;
         }
     }
 
-    private static void logInfo(String property, long actualValue, long lowestAcceptedValue)
+    private static void logInfo(String property, DurationSpec.LongMillisecondsBound actualValue, DurationSpec.LongMillisecondsBound lowestAcceptedValue)
     {
-        logger.info("found {}::{} less than lowest acceptable value {}, continuing with {}", property, actualValue, lowestAcceptedValue, lowestAcceptedValue);
+        logger.info("found {}::{} less than lowest acceptable value {}, continuing with {}",
+                    property,
+                    actualValue.toString(),
+                    lowestAcceptedValue.toString(),
+                    lowestAcceptedValue);
     }
 
     public static void applyTokensConfig()
@@ -1155,6 +1287,7 @@
                 return 1;
             return 0;
         };
+        newFailureDetector = () -> createFailureDetector(conf.failure_detector);
     }
 
     // definitely not safe for tools + clients - implicitly instantiates schema
@@ -1198,45 +1331,9 @@
         return sum < 0 ? Long.MAX_VALUE : sum;
     }
 
-    private static FileStore guessFileStore(String dir) throws IOException
+    private static long tryGetSpace(String dir, PathUtils.IOToLongFunction<FileStore> getSpace)
     {
-        Path path = Paths.get(dir);
-        while (true)
-        {
-            try
-            {
-                return FileUtils.getFileStore(path);
-            }
-            catch (IOException e)
-            {
-                if (e instanceof NoSuchFileException)
-                {
-                    path = path.getParent();
-                    if (path == null)
-                    {
-                        throw new ConfigurationException("Unable to find filesystem for '" + dir + "'.");
-                    }
-                }
-                else
-                {
-                    throw e;
-                }
-            }
-        }
-    }
-
-    private static long getUnallocatedSpace(String directory)
-    {
-        try
-        {
-            return guessFileStore(directory).getUnallocatedSpace();
-        }
-        catch (IOException e)
-        {
-            logger.debug("Error checking disk space", e);
-            throw new ConfigurationException(String.format("Unable to check disk space available to %s. Perhaps the Cassandra user does not have the necessary permissions",
-                                                           directory), e);
-        }
+        return PathUtils.tryGetSpace(new File(dir).toPath(), getSpace, e -> { throw new ConfigurationException("Unable check disk space in '" + dir + "'. Perhaps the Cassandra user does not have the necessary permissions"); });
     }
 
     public static IEndpointSnitch createEndpointSnitch(boolean dynamic, String snitchClassName) throws ConfigurationException
@@ -1247,6 +1344,14 @@
         return dynamic ? new DynamicEndpointSnitch(snitch) : snitch;
     }
 
+    private static IFailureDetector createFailureDetector(String detectorClassName) throws ConfigurationException
+    {
+        if (!detectorClassName.contains("."))
+            detectorClassName = "org.apache.cassandra.gms." + detectorClassName;
+        IFailureDetector detector = FBUtilities.construct(detectorClassName, "failure detector");
+        return detector;
+    }
+
     public static IAuthenticator getAuthenticator()
     {
         return authenticator;
@@ -1277,6 +1382,16 @@
         DatabaseDescriptor.networkAuthorizer = networkAuthorizer;
     }
 
+    public static void setAuthFromRoot(boolean fromRoot)
+    {
+        conf.traverse_auth_from_root = fromRoot;
+    }
+
+    public static boolean getAuthFromRoot()
+    {
+        return conf.traverse_auth_from_root;
+    }
+
     public static IRoleManager getRoleManager()
     {
         return roleManager;
@@ -1289,24 +1404,27 @@
 
     public static int getPermissionsValidity()
     {
-        return conf.permissions_validity_in_ms;
+        return conf.permissions_validity.toMilliseconds();
     }
 
     public static void setPermissionsValidity(int timeout)
     {
-        conf.permissions_validity_in_ms = timeout;
+        conf.permissions_validity = new DurationSpec.IntMillisecondsBound(timeout);
     }
 
     public static int getPermissionsUpdateInterval()
     {
-        return conf.permissions_update_interval_in_ms == -1
-             ? conf.permissions_validity_in_ms
-             : conf.permissions_update_interval_in_ms;
+        return conf.permissions_update_interval == null
+             ? conf.permissions_validity.toMilliseconds()
+             : conf.permissions_update_interval.toMilliseconds();
     }
 
     public static void setPermissionsUpdateInterval(int updateInterval)
     {
-        conf.permissions_update_interval_in_ms = updateInterval;
+        if (updateInterval == -1)
+            conf.permissions_update_interval = null;
+        else
+            conf.permissions_update_interval = new DurationSpec.IntMillisecondsBound(updateInterval);
     }
 
     public static int getPermissionsCacheMaxEntries()
@@ -1319,26 +1437,49 @@
         return conf.permissions_cache_max_entries = maxEntries;
     }
 
+    public static boolean getPermissionsCacheActiveUpdate()
+    {
+        return conf.permissions_cache_active_update;
+    }
+
+    public static void setPermissionsCacheActiveUpdate(boolean update)
+    {
+        conf.permissions_cache_active_update = update;
+    }
+
     public static int getRolesValidity()
     {
-        return conf.roles_validity_in_ms;
+        return conf.roles_validity.toMilliseconds();
     }
 
     public static void setRolesValidity(int validity)
     {
-        conf.roles_validity_in_ms = validity;
+        conf.roles_validity = new DurationSpec.IntMillisecondsBound(validity);
     }
 
     public static int getRolesUpdateInterval()
     {
-        return conf.roles_update_interval_in_ms == -1
-             ? conf.roles_validity_in_ms
-             : conf.roles_update_interval_in_ms;
+        return conf.roles_update_interval == null
+             ? conf.roles_validity.toMilliseconds()
+             : conf.roles_update_interval.toMilliseconds();
+    }
+
+    public static void setRolesCacheActiveUpdate(boolean update)
+    {
+        conf.roles_cache_active_update = update;
+    }
+
+    public static boolean getRolesCacheActiveUpdate()
+    {
+        return conf.roles_cache_active_update;
     }
 
     public static void setRolesUpdateInterval(int interval)
     {
-        conf.roles_update_interval_in_ms = interval;
+        if (interval == -1)
+            conf.roles_update_interval = null;
+        else
+            conf.roles_update_interval = new DurationSpec.IntMillisecondsBound(interval);
     }
 
     public static int getRolesCacheMaxEntries()
@@ -1353,24 +1494,27 @@
 
     public static int getCredentialsValidity()
     {
-        return conf.credentials_validity_in_ms;
+        return conf.credentials_validity.toMilliseconds();
     }
 
     public static void setCredentialsValidity(int timeout)
     {
-        conf.credentials_validity_in_ms = timeout;
+        conf.credentials_validity = new DurationSpec.IntMillisecondsBound(timeout);
     }
 
     public static int getCredentialsUpdateInterval()
     {
-        return conf.credentials_update_interval_in_ms == -1
-               ? conf.credentials_validity_in_ms
-               : conf.credentials_update_interval_in_ms;
+        return conf.credentials_update_interval == null
+               ? conf.credentials_validity.toMilliseconds()
+               : conf.credentials_update_interval.toMilliseconds();
     }
 
     public static void setCredentialsUpdateInterval(int updateInterval)
     {
-        conf.credentials_update_interval_in_ms = updateInterval;
+        if (updateInterval == -1)
+            conf.credentials_update_interval = null;
+        else
+            conf.credentials_update_interval = new DurationSpec.IntMillisecondsBound(updateInterval);
     }
 
     public static int getCredentialsCacheMaxEntries()
@@ -1383,14 +1527,25 @@
         return conf.credentials_cache_max_entries = maxEntries;
     }
 
+    public static boolean getCredentialsCacheActiveUpdate()
+    {
+        return conf.credentials_cache_active_update;
+    }
+
+    public static void setCredentialsCacheActiveUpdate(boolean update)
+    {
+        conf.credentials_cache_active_update = update;
+    }
+
     public static int getMaxValueSize()
     {
-        return conf.max_value_size_in_mb * 1024 * 1024;
+        return Ints.saturatedCast(conf.max_value_size.toMebibytes() * 1024L * 1024);
     }
 
     public static void setMaxValueSize(int maxValueSizeInBytes)
     {
-        conf.max_value_size_in_mb = maxValueSizeInBytes / 1024 / 1024;
+        // the below division is safe as this setter is used only in tests with values that won't lead to precision loss
+        conf.max_value_size = new DataStorageSpec.IntMebibytesBound((maxValueSizeInBytes / (1024L * 1024)), MEBIBYTES);
     }
 
     /**
@@ -1465,57 +1620,64 @@
         snitch = eps;
     }
 
+    public static IFailureDetector newFailureDetector()
+    {
+        return newFailureDetector.get();
+    }
+
+    public static void setDefaultFailureDetector()
+    {
+        newFailureDetector = () -> createFailureDetector("FailureDetector");
+    }
+
     public static int getColumnIndexSize()
     {
-        return (int) ByteUnit.KIBI_BYTES.toBytes(conf.column_index_size_in_kb);
+        return conf.column_index_size.toBytes();
     }
 
-    public static int getColumnIndexSizeInKB()
+    public static int getColumnIndexSizeInKiB()
     {
-        return conf.column_index_size_in_kb;
+        return conf.column_index_size.toKibibytes();
     }
 
-    @VisibleForTesting
     public static void setColumnIndexSize(int val)
     {
-        checkValidForByteConversion(val, "column_index_size_in_kb", ByteUnit.KIBI_BYTES);
-        conf.column_index_size_in_kb = val;
+        conf.column_index_size =  createIntKibibyteBoundAndEnsureItIsValidForByteConversion(val,"column_index_size");
     }
 
     public static int getColumnIndexCacheSize()
     {
-        return (int) ByteUnit.KIBI_BYTES.toBytes(conf.column_index_cache_size_in_kb);
+        return conf.column_index_cache_size.toBytes();
     }
 
-    public static int getColumnIndexCacheSizeInKB()
+    public static int getColumnIndexCacheSizeInKiB()
     {
-        return conf.column_index_cache_size_in_kb;
+        return conf.column_index_cache_size.toKibibytes();
     }
 
     public static void setColumnIndexCacheSize(int val)
     {
-        checkValidForByteConversion(val, "column_index_cache_size_in_kb", ByteUnit.KIBI_BYTES);
-        conf.column_index_cache_size_in_kb = val;
+        conf.column_index_cache_size = createIntKibibyteBoundAndEnsureItIsValidForByteConversion(val,"column_index_cache_size");
     }
 
     public static int getBatchSizeWarnThreshold()
     {
-        return (int) ByteUnit.KIBI_BYTES.toBytes(conf.batch_size_warn_threshold_in_kb);
+        return conf.batch_size_warn_threshold.toBytes();
     }
 
-    public static int getBatchSizeWarnThresholdInKB()
+    public static int getBatchSizeWarnThresholdInKiB()
     {
-        return conf.batch_size_warn_threshold_in_kb;
+        return conf.batch_size_warn_threshold.toKibibytes();
     }
 
     public static long getBatchSizeFailThreshold()
     {
-        return ByteUnit.KIBI_BYTES.toBytes(conf.batch_size_fail_threshold_in_kb);
+        return conf.batch_size_fail_threshold.toBytesInLong();
     }
 
-    public static int getBatchSizeFailThresholdInKB()
+    public static int getBatchSizeFailThresholdInKiB()
     {
-        return conf.batch_size_fail_threshold_in_kb;
+        return conf.batch_size_fail_threshold.toKibibytes();
     }
 
     public static int getUnloggedBatchAcrossPartitionsWarnThreshold()
@@ -1523,15 +1685,14 @@
         return conf.unlogged_batch_across_partitions_warn_threshold;
     }
 
-    public static void setBatchSizeWarnThresholdInKB(int threshold)
+    public static void setBatchSizeWarnThresholdInKiB(int threshold)
     {
-        checkValidForByteConversion(threshold, "batch_size_warn_threshold_in_kb", ByteUnit.KIBI_BYTES);
-        conf.batch_size_warn_threshold_in_kb = threshold;
+        conf.batch_size_warn_threshold = createIntKibibyteBoundAndEnsureItIsValidForByteConversion(threshold,"batch_size_warn_threshold");
     }
 
-    public static void setBatchSizeFailThresholdInKB(int threshold)
+    public static void setBatchSizeFailThresholdInKiB(int threshold)
     {
-        conf.batch_size_fail_threshold_in_kb = threshold;
+        conf.batch_size_fail_threshold = new DataStorageSpec.IntKibibytesBound(threshold);
     }
 
     public static Collection<String> getInitialTokens()
@@ -1612,97 +1773,107 @@
 
     public static long nativeTransportIdleTimeout()
     {
-        return conf.native_transport_idle_timeout_in_ms;
+        return conf.native_transport_idle_timeout.toMilliseconds();
     }
 
     public static void setNativeTransportIdleTimeout(long nativeTransportTimeout)
     {
-        conf.native_transport_idle_timeout_in_ms = nativeTransportTimeout;
+        conf.native_transport_idle_timeout = new DurationSpec.LongMillisecondsBound(nativeTransportTimeout);
     }
 
     public static long getRpcTimeout(TimeUnit unit)
     {
-        return unit.convert(conf.request_timeout_in_ms, MILLISECONDS);
+        return conf.request_timeout.to(unit);
     }
 
     public static void setRpcTimeout(long timeOutInMillis)
     {
-        conf.request_timeout_in_ms = timeOutInMillis;
+        conf.request_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
     }
 
     public static long getReadRpcTimeout(TimeUnit unit)
     {
-        return unit.convert(conf.read_request_timeout_in_ms, MILLISECONDS);
+        return conf.read_request_timeout.to(unit);
     }
 
     public static void setReadRpcTimeout(long timeOutInMillis)
     {
-        conf.read_request_timeout_in_ms = timeOutInMillis;
+        conf.read_request_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
     }
 
     public static long getRangeRpcTimeout(TimeUnit unit)
     {
-        return unit.convert(conf.range_request_timeout_in_ms, MILLISECONDS);
+        return conf.range_request_timeout.to(unit);
     }
 
     public static void setRangeRpcTimeout(long timeOutInMillis)
     {
-        conf.range_request_timeout_in_ms = timeOutInMillis;
+        conf.range_request_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
     }
 
     public static long getWriteRpcTimeout(TimeUnit unit)
     {
-        return unit.convert(conf.write_request_timeout_in_ms, MILLISECONDS);
+        return conf.write_request_timeout.to(unit);
     }
 
     public static void setWriteRpcTimeout(long timeOutInMillis)
     {
-        conf.write_request_timeout_in_ms = timeOutInMillis;
+        conf.write_request_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
     }
 
     public static long getCounterWriteRpcTimeout(TimeUnit unit)
     {
-        return unit.convert(conf.counter_write_request_timeout_in_ms, MILLISECONDS);
+        return conf.counter_write_request_timeout.to(unit);
     }
 
     public static void setCounterWriteRpcTimeout(long timeOutInMillis)
     {
-        conf.counter_write_request_timeout_in_ms = timeOutInMillis;
+        conf.counter_write_request_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
     }
 
     public static long getCasContentionTimeout(TimeUnit unit)
     {
-        return unit.convert(conf.cas_contention_timeout_in_ms, MILLISECONDS);
+        return conf.cas_contention_timeout.to(unit);
     }
 
     public static void setCasContentionTimeout(long timeOutInMillis)
     {
-        conf.cas_contention_timeout_in_ms = timeOutInMillis;
+        conf.cas_contention_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
     }
 
     public static long getTruncateRpcTimeout(TimeUnit unit)
     {
-        return unit.convert(conf.truncate_request_timeout_in_ms, MILLISECONDS);
+        return conf.truncate_request_timeout.to(unit);
     }
 
     public static void setTruncateRpcTimeout(long timeOutInMillis)
     {
-        conf.truncate_request_timeout_in_ms = timeOutInMillis;
+        conf.truncate_request_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
+    }
+
+    public static long getRepairRpcTimeout(TimeUnit unit)
+    {
+        return conf.repair_request_timeout.to(unit);
+    }
+
+    public static void setRepairRpcTimeout(Long timeOutInMillis)
+    {
+        conf.repair_request_timeout = new DurationSpec.LongMillisecondsBound(timeOutInMillis);
     }
 
     public static boolean hasCrossNodeTimeout()
     {
-        return conf.cross_node_timeout;
+        return conf.internode_timeout;
     }
 
     public static void setCrossNodeTimeout(boolean crossNodeTimeout)
     {
-        conf.cross_node_timeout = crossNodeTimeout;
+        conf.internode_timeout = crossNodeTimeout;
     }
 
-    public static long getSlowQueryTimeout(TimeUnit units)
+    public static long getSlowQueryTimeout(TimeUnit unit)
     {
-        return units.convert(conf.slow_query_log_timeout_in_ms, MILLISECONDS);
+        return conf.slow_query_log_timeout.to(unit);
     }
 
     /**
@@ -1723,16 +1894,6 @@
         return unit.convert(getBlockForPeersTimeoutInSeconds(), TimeUnit.SECONDS);
     }
 
-    public static long getRepairRpcTimeout(TimeUnit unit)
-    {
-        return unit.convert(conf.repair_request_timeout_in_ms, MILLISECONDS);
-    }
-
-    public static void setRepairRpcTimeout(long time, TimeUnit unit)
-    {
-        conf.repair_request_timeout_in_ms = MILLISECONDS.convert(time, unit);
-    }
-
     public static double getPhiConvictThreshold()
     {
         return conf.phi_convict_threshold;
@@ -1804,6 +1965,11 @@
         return conf.memtable_flush_writers;
     }
 
+    public static int getAvailableProcessors()
+    {
+        return conf == null ? -1 : conf.available_processors;
+    }
+
     public static int getConcurrentCompactors()
     {
         return conf.concurrent_compactors;
@@ -1814,17 +1980,53 @@
         conf.concurrent_compactors = value;
     }
 
-    public static int getCompactionThroughputMbPerSec()
+    public static int getCompactionThroughputMebibytesPerSecAsInt()
     {
-        return conf.compaction_throughput_mb_per_sec;
+        return conf.compaction_throughput.toMebibytesPerSecondAsInt();
     }
 
-    public static void setCompactionThroughputMbPerSec(int value)
+    public static double getCompactionThroughputBytesPerSec()
     {
-        conf.compaction_throughput_mb_per_sec = value;
+        return conf.compaction_throughput.toBytesPerSecond();
     }
 
-    public static long getCompactionLargePartitionWarningThreshold() { return ByteUnit.MEBI_BYTES.toBytes(conf.compaction_large_partition_warning_threshold_mb); }
+    public static double getCompactionThroughputMebibytesPerSec()
+    {
+        return conf.compaction_throughput.toMebibytesPerSecond();
+    }
+
+    @VisibleForTesting // only for testing!
+    public static void setCompactionThroughputBytesPerSec(int value)
+    {
+        if (BYTES_PER_SECOND.toMebibytesPerSecond(value) >= Integer.MAX_VALUE)
+            throw new IllegalArgumentException("compaction_throughput: " + value +
+                                               " is too large; it should be less than " +
+                                               Integer.MAX_VALUE + " in MiB/s");
+
+        conf.compaction_throughput = new DataRateSpec.LongBytesPerSecondBound(value);
+    }
+
+    public static void setCompactionThroughputMebibytesPerSec(int value)
+    {
+        if (value == Integer.MAX_VALUE)
+            throw new IllegalArgumentException("compaction_throughput: " + value +
+                                               " is too large; it should be less than " +
+                                               Integer.MAX_VALUE + " in MiB/s");
+
+        conf.compaction_throughput = new DataRateSpec.LongBytesPerSecondBound(value, MEBIBYTES_PER_SECOND);
+    }
+
+    public static long getCompactionLargePartitionWarningThreshold() { return conf.compaction_large_partition_warning_threshold.toBytesInLong(); }
+
+    public static int getCompactionTombstoneWarningThreshold()
+    {
+        return conf.compaction_tombstone_warning_threshold;
+    }
+
+    public static void setCompactionTombstoneWarningThreshold(int count)
+    {
+        conf.compaction_tombstone_warning_threshold = count;
+    }
 
     public static int getConcurrentValidations()
     {
@@ -1849,7 +2051,7 @@
 
     public static long getMinFreeSpacePerDriveInBytes()
     {
-        return ByteUnit.MEBI_BYTES.toBytes(conf.min_free_space_per_drive_in_mb);
+        return conf.min_free_space_per_drive.toBytesInLong();
     }
 
     public static boolean getDisableSTCSInL0()
@@ -1864,22 +2066,132 @@
 
     public static int getStreamThroughputOutboundMegabitsPerSec()
     {
-        return conf.stream_throughput_outbound_megabits_per_sec;
+        return conf.stream_throughput_outbound.toMegabitsPerSecondAsInt();
+    }
+
+    public static double getStreamThroughputOutboundMegabitsPerSecAsDouble()
+    {
+        return conf.stream_throughput_outbound.toMegabitsPerSecond();
+    }
+
+    public static double getStreamThroughputOutboundMebibytesPerSec()
+    {
+        return conf.stream_throughput_outbound.toMebibytesPerSecond();
+    }
+
+    public static double getStreamThroughputOutboundBytesPerSec()
+    {
+        return conf.stream_throughput_outbound.toBytesPerSecond();
+    }
+
+    public static int getStreamThroughputOutboundMebibytesPerSecAsInt()
+    {
+        return conf.stream_throughput_outbound.toMebibytesPerSecondAsInt();
+    }
+
+    public static void setStreamThroughputOutboundMebibytesPerSecAsInt(int value)
+    {
+        if (MEBIBYTES_PER_SECOND.toMegabitsPerSecond(value) >= Integer.MAX_VALUE)
+            throw new IllegalArgumentException("stream_throughput_outbound: " + value  +
+                                               " is too large; it should be less than " +
+                                               Integer.MAX_VALUE + " in megabits/s");
+
+        conf.stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(value, MEBIBYTES_PER_SECOND);
+    }
+
+    public static void setStreamThroughputOutboundBytesPerSec(long value)
+    {
+        conf.stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(value, BYTES_PER_SECOND);
     }
 
     public static void setStreamThroughputOutboundMegabitsPerSec(int value)
     {
-        conf.stream_throughput_outbound_megabits_per_sec = value;
+        conf.stream_throughput_outbound = DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(value);
+    }
+
+    public static double getEntireSSTableStreamThroughputOutboundMebibytesPerSec()
+    {
+        return conf.entire_sstable_stream_throughput_outbound.toMebibytesPerSecond();
+    }
+
+    public static double getEntireSSTableStreamThroughputOutboundBytesPerSec()
+    {
+        return conf.entire_sstable_stream_throughput_outbound.toBytesPerSecond();
+    }
+
+    public static void setEntireSSTableStreamThroughputOutboundMebibytesPerSec(int value)
+    {
+        if (value == Integer.MAX_VALUE)
+            throw new IllegalArgumentException("entire_sstable_stream_throughput_outbound: " + value +
+                                               " is too large; it should be less than " +
+                                               Integer.MAX_VALUE + " in MiB/s");
+
+        conf.entire_sstable_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(value, MEBIBYTES_PER_SECOND);
     }
 
     public static int getInterDCStreamThroughputOutboundMegabitsPerSec()
     {
-        return conf.inter_dc_stream_throughput_outbound_megabits_per_sec;
+        return conf.inter_dc_stream_throughput_outbound.toMegabitsPerSecondAsInt();
+    }
+
+    public static double getInterDCStreamThroughputOutboundMegabitsPerSecAsDouble()
+    {
+        return conf.inter_dc_stream_throughput_outbound.toMegabitsPerSecond();
+    }
+
+    public static double getInterDCStreamThroughputOutboundMebibytesPerSec()
+    {
+        return conf.inter_dc_stream_throughput_outbound.toMebibytesPerSecond();
+    }
+
+    public static double getInterDCStreamThroughputOutboundBytesPerSec()
+    {
+        return conf.inter_dc_stream_throughput_outbound.toBytesPerSecond();
+    }
+
+    public static int getInterDCStreamThroughputOutboundMebibytesPerSecAsInt()
+    {
+        return conf.inter_dc_stream_throughput_outbound.toMebibytesPerSecondAsInt();
+    }
+
+    public static void setInterDCStreamThroughputOutboundMebibytesPerSecAsInt(int value)
+    {
+        if (MEBIBYTES_PER_SECOND.toMegabitsPerSecond(value) >= Integer.MAX_VALUE)
+            throw new IllegalArgumentException("inter_dc_stream_throughput_outbound: " + value +
+                                               " is too large; it should be less than " +
+                                               Integer.MAX_VALUE + " in megabits/s");
+
+        conf.inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(value, MEBIBYTES_PER_SECOND);
+    }
+
+    public static void setInterDCStreamThroughputOutboundBytesPerSec(long value)
+    {
+        conf.inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(value, BYTES_PER_SECOND);
     }
 
     public static void setInterDCStreamThroughputOutboundMegabitsPerSec(int value)
     {
-        conf.inter_dc_stream_throughput_outbound_megabits_per_sec = value;
+        conf.inter_dc_stream_throughput_outbound = DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(value);
+    }
+
+    public static double getEntireSSTableInterDCStreamThroughputOutboundBytesPerSec()
+    {
+        return conf.entire_sstable_inter_dc_stream_throughput_outbound.toBytesPerSecond();
+    }
+
+    public static double getEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec()
+    {
+        return conf.entire_sstable_inter_dc_stream_throughput_outbound.toMebibytesPerSecond();
+    }
+
+    public static void setEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec(int value)
+    {
+        if (value == Integer.MAX_VALUE)
+            throw new IllegalArgumentException("entire_sstable_inter_dc_stream_throughput_outbound: " + value +
+                                               " is too large; it should be less than " +
+                                               Integer.MAX_VALUE + " in MiB/s");
+
+        conf.entire_sstable_inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(value, MEBIBYTES_PER_SECOND);
     }
 
     /**
@@ -1981,7 +2293,7 @@
 
     public static int getMaxMutationSize()
     {
-        return (int) ByteUnit.KIBI_BYTES.toBytes(conf.max_mutation_size_in_kb);
+        return conf.max_mutation_size.toBytes();
     }
 
     public static int getTombstoneWarnThreshold()
@@ -2029,12 +2341,19 @@
      */
     public static int getCommitLogSegmentSize()
     {
-        return (int) ByteUnit.MEBI_BYTES.toBytes(conf.commitlog_segment_size_in_mb);
+        return conf.commitlog_segment_size.toBytes();
     }
 
-    public static void setCommitLogSegmentSize(int sizeMegabytes)
+    /**
+     * Update commitlog_segment_size in the tests.
+     * {@link CommitLogSegmentManagerCDC} uses the CommitLogSegmentSize to estimate the file size on allocation.
+     * It is important to keep the value unchanged for the estimation to be correct.
+     * @param sizeMebibytes
+     */
+    @VisibleForTesting /* Only for testing */
+    public static void setCommitLogSegmentSize(int sizeMebibytes)
     {
-        conf.commitlog_segment_size_in_mb = sizeMegabytes;
+        conf.commitlog_segment_size = new DataStorageSpec.IntMebibytesBound(sizeMebibytes);
     }
 
     public static String getSavedCachesLocation()
@@ -2139,83 +2458,83 @@
 
     public static int getInternodeSocketSendBufferSizeInBytes()
     {
-        return conf.internode_socket_send_buffer_size_in_bytes;
+        return conf.internode_socket_send_buffer_size.toBytes();
     }
 
     public static int getInternodeSocketReceiveBufferSizeInBytes()
     {
-        return conf.internode_socket_receive_buffer_size_in_bytes;
+        return conf.internode_socket_receive_buffer_size.toBytes();
     }
 
     public static int getInternodeApplicationSendQueueCapacityInBytes()
     {
-        return conf.internode_application_send_queue_capacity_in_bytes;
+        return conf.internode_application_send_queue_capacity.toBytes();
     }
 
     public static int getInternodeApplicationSendQueueReserveEndpointCapacityInBytes()
     {
-        return conf.internode_application_send_queue_reserve_endpoint_capacity_in_bytes;
+        return conf.internode_application_send_queue_reserve_endpoint_capacity.toBytes();
     }
 
     public static int getInternodeApplicationSendQueueReserveGlobalCapacityInBytes()
     {
-        return conf.internode_application_send_queue_reserve_global_capacity_in_bytes;
+        return conf.internode_application_send_queue_reserve_global_capacity.toBytes();
     }
 
     public static int getInternodeApplicationReceiveQueueCapacityInBytes()
     {
-        return conf.internode_application_receive_queue_capacity_in_bytes;
+        return conf.internode_application_receive_queue_capacity.toBytes();
     }
 
     public static int getInternodeApplicationReceiveQueueReserveEndpointCapacityInBytes()
     {
-        return conf.internode_application_receive_queue_reserve_endpoint_capacity_in_bytes;
+        return conf.internode_application_receive_queue_reserve_endpoint_capacity.toBytes();
     }
 
     public static int getInternodeApplicationReceiveQueueReserveGlobalCapacityInBytes()
     {
-        return conf.internode_application_receive_queue_reserve_global_capacity_in_bytes;
+        return conf.internode_application_receive_queue_reserve_global_capacity.toBytes();
     }
 
     public static int getInternodeTcpConnectTimeoutInMS()
     {
-        return conf.internode_tcp_connect_timeout_in_ms;
+        return conf.internode_tcp_connect_timeout.toMilliseconds();
     }
 
     public static void setInternodeTcpConnectTimeoutInMS(int value)
     {
-        conf.internode_tcp_connect_timeout_in_ms = value;
+        conf.internode_tcp_connect_timeout = new DurationSpec.IntMillisecondsBound(value);
     }
 
     public static int getInternodeTcpUserTimeoutInMS()
     {
-        return conf.internode_tcp_user_timeout_in_ms;
+        return conf.internode_tcp_user_timeout.toMilliseconds();
     }
 
     public static void setInternodeTcpUserTimeoutInMS(int value)
     {
-        conf.internode_tcp_user_timeout_in_ms = value;
+        conf.internode_tcp_user_timeout = new DurationSpec.IntMillisecondsBound(value);
     }
 
     public static int getInternodeStreamingTcpUserTimeoutInMS()
     {
-        return conf.internode_streaming_tcp_user_timeout_in_ms;
+        return conf.internode_streaming_tcp_user_timeout.toMilliseconds();
     }
 
     public static void setInternodeStreamingTcpUserTimeoutInMS(int value)
     {
-        conf.internode_streaming_tcp_user_timeout_in_ms = value;
+        conf.internode_streaming_tcp_user_timeout = new DurationSpec.IntMillisecondsBound(value);
     }
 
     public static int getInternodeMaxMessageSizeInBytes()
     {
-        return conf.internode_max_message_size_in_bytes;
+        return conf.internode_max_message_size.toBytes();
     }
 
     @VisibleForTesting
     public static void setInternodeMaxMessageSizeInBytes(int value)
     {
-        conf.internode_max_message_size_in_bytes = value;
+        conf.internode_max_message_size = new DataStorageSpec.IntBytesBound(value);
     }
 
     public static boolean startNativeTransport()
@@ -2261,7 +2580,12 @@
 
     public static int getNativeTransportMaxFrameSize()
     {
-        return (int) ByteUnit.MEBI_BYTES.toBytes(conf.native_transport_max_frame_size_in_mb);
+        return conf.native_transport_max_frame_size.toBytes();
+    }
+
+    public static void setNativeTransportMaxFrameSize(int bytes)
+    {
+        conf.native_transport_max_frame_size = new DataStorageSpec.IntMebibytesBound(bytes);
     }
 
     public static long getNativeTransportMaxConcurrentConnections()
@@ -2299,62 +2623,210 @@
         conf.native_transport_allow_older_protocols = isEnabled;
     }
 
-    public static double getCommitLogSyncGroupWindow()
+    public static long getCommitLogSyncGroupWindow()
     {
-        return conf.commitlog_sync_group_window_in_ms;
+        return conf.commitlog_sync_group_window.toMilliseconds();
     }
 
-    public static void setCommitLogSyncGroupWindow(double windowMillis)
+    public static void setCommitLogSyncGroupWindow(long windowMillis)
     {
-        conf.commitlog_sync_group_window_in_ms = windowMillis;
+        conf.commitlog_sync_group_window = new DurationSpec.IntMillisecondsBound(windowMillis);
     }
 
     public static int getNativeTransportReceiveQueueCapacityInBytes()
     {
-        return conf.native_transport_receive_queue_capacity_in_bytes;
+        return conf.native_transport_receive_queue_capacity.toBytes();
     }
 
     public static void setNativeTransportReceiveQueueCapacityInBytes(int queueSize)
     {
-        conf.native_transport_receive_queue_capacity_in_bytes = queueSize;
+        conf.native_transport_receive_queue_capacity = new DataStorageSpec.IntBytesBound(queueSize);
     }
 
-    public static long getNativeTransportMaxConcurrentRequestsInBytesPerIp()
+    public static long getNativeTransportMaxRequestDataInFlightPerIpInBytes()
     {
-        return conf.native_transport_max_concurrent_requests_in_bytes_per_ip;
+        return conf.native_transport_max_request_data_in_flight_per_ip.toBytes();
     }
 
-    public static void setNativeTransportMaxConcurrentRequestsInBytesPerIp(long maxConcurrentRequestsInBytes)
+    public static Config.PaxosVariant getPaxosVariant()
     {
-        conf.native_transport_max_concurrent_requests_in_bytes_per_ip = maxConcurrentRequestsInBytes;
+        return conf.paxos_variant;
     }
 
-    public static long getNativeTransportMaxConcurrentRequestsInBytes()
+    public static void setPaxosVariant(Config.PaxosVariant variant)
     {
-        return conf.native_transport_max_concurrent_requests_in_bytes;
+        conf.paxos_variant = variant;
     }
 
-    public static void setNativeTransportMaxConcurrentRequestsInBytes(long maxConcurrentRequestsInBytes)
+    public static String getPaxosContentionWaitRandomizer()
     {
-        conf.native_transport_max_concurrent_requests_in_bytes = maxConcurrentRequestsInBytes;
+        return conf.paxos_contention_wait_randomizer;
+    }
+
+    public static String getPaxosContentionMinWait()
+    {
+        return conf.paxos_contention_min_wait;
+    }
+
+    public static String getPaxosContentionMaxWait()
+    {
+        return conf.paxos_contention_max_wait;
+    }
+
+    public static String getPaxosContentionMinDelta()
+    {
+        return conf.paxos_contention_min_delta;
+    }
+
+    public static void setPaxosContentionWaitRandomizer(String waitRandomizer)
+    {
+        conf.paxos_contention_wait_randomizer = waitRandomizer;
+    }
+
+    public static void setPaxosContentionMinWait(String minWait)
+    {
+        conf.paxos_contention_min_wait = minWait;
+    }
+
+    public static void setPaxosContentionMaxWait(String maxWait)
+    {
+        conf.paxos_contention_max_wait = maxWait;
+    }
+
+    public static void setPaxosContentionMinDelta(String minDelta)
+    {
+        conf.paxos_contention_min_delta = minDelta;
+    }
+
+    public static boolean skipPaxosRepairOnTopologyChange()
+    {
+        return conf.skip_paxos_repair_on_topology_change;
+    }
+
+    public static void setSkipPaxosRepairOnTopologyChange(boolean value)
+    {
+        conf.skip_paxos_repair_on_topology_change = value;
+    }
+
+    public static long getPaxosPurgeGrace(TimeUnit units)
+    {
+        return conf.paxos_purge_grace_period.to(units);
+    }
+
+    public static void setPaxosPurgeGrace(long seconds)
+    {
+        conf.paxos_purge_grace_period = new DurationSpec.LongSecondsBound(seconds);
+    }
+
+    public static PaxosOnLinearizabilityViolation paxosOnLinearizabilityViolations()
+    {
+        return conf.paxos_on_linearizability_violations;
+    }
+
+    public static void setPaxosOnLinearizabilityViolations(PaxosOnLinearizabilityViolation v)
+    {
+        conf.paxos_on_linearizability_violations = v;
+    }
+
+    public static PaxosStatePurging paxosStatePurging()
+    {
+        return conf.paxos_state_purging;
+    }
+
+    public static void setPaxosStatePurging(PaxosStatePurging v)
+    {
+        conf.paxos_state_purging = v;
+    }
+
+    public static boolean paxosRepairEnabled()
+    {
+        return conf.paxos_repair_enabled;
+    }
+
+    public static void setPaxosRepairEnabled(boolean v)
+    {
+        conf.paxos_repair_enabled = v;
+    }
+
+    public static Set<String> skipPaxosRepairOnTopologyChangeKeyspaces()
+    {
+        return conf.skip_paxos_repair_on_topology_change_keyspaces;
+    }
+
+    public static void setSkipPaxosRepairOnTopologyChangeKeyspaces(String keyspaces)
+    {
+        conf.skip_paxos_repair_on_topology_change_keyspaces = Config.splitCommaDelimited(keyspaces);
+    }
+
+    public static boolean paxoTopologyRepairNoDcChecks()
+    {
+        return conf.paxos_topology_repair_no_dc_checks;
+    }
+
+    public static boolean paxoTopologyRepairStrictEachQuorum()
+    {
+        return conf.paxos_topology_repair_strict_each_quorum;
+    }
+
+    public static void setNativeTransportMaxRequestDataInFlightPerIpInBytes(long maxRequestDataInFlightInBytes)
+    {
+        if (maxRequestDataInFlightInBytes == -1)
+            maxRequestDataInFlightInBytes = Runtime.getRuntime().maxMemory() / 40;
+
+        conf.native_transport_max_request_data_in_flight_per_ip = new DataStorageSpec.LongBytesBound(maxRequestDataInFlightInBytes);
+    }
+
+    public static long getNativeTransportMaxRequestDataInFlightInBytes()
+    {
+        return conf.native_transport_max_request_data_in_flight.toBytes();
+    }
+
+    public static void setNativeTransportConcurrentRequestDataInFlightInBytes(long maxRequestDataInFlightInBytes)
+    {
+        if (maxRequestDataInFlightInBytes == -1)
+            maxRequestDataInFlightInBytes = Runtime.getRuntime().maxMemory() / 10;
+
+        conf.native_transport_max_request_data_in_flight = new DataStorageSpec.LongBytesBound(maxRequestDataInFlightInBytes);
+    }
+
+    public static int getNativeTransportMaxRequestsPerSecond()
+    {
+        return conf.native_transport_max_requests_per_second;
+    }
+
+    public static void setNativeTransportMaxRequestsPerSecond(int perSecond)
+    {
+        Preconditions.checkArgument(perSecond > 0, "native_transport_max_requests_per_second must be greater than zero");
+        conf.native_transport_max_requests_per_second = perSecond;
+    }
+
+    public static void setNativeTransportRateLimitingEnabled(boolean enabled)
+    {
+        logger.info("native_transport_rate_limiting_enabled set to {}", enabled);
+        conf.native_transport_rate_limiting_enabled = enabled;
+    }
+
+    public static boolean getNativeTransportRateLimitingEnabled()
+    {
+        return conf.native_transport_rate_limiting_enabled;
     }
 
     public static int getCommitLogSyncPeriod()
     {
-        return conf.commitlog_sync_period_in_ms;
+        return conf.commitlog_sync_period.toMilliseconds();
     }
 
     public static long getPeriodicCommitLogSyncBlock()
     {
-        Integer blockMillis = conf.periodic_commitlog_sync_lag_block_in_ms;
+        DurationSpec.IntMillisecondsBound blockMillis = conf.periodic_commitlog_sync_lag_block;
         return blockMillis == null
                ? (long)(getCommitLogSyncPeriod() * 1.5)
-               : blockMillis;
+               : blockMillis.toMilliseconds();
     }
 
     public static void setCommitLogSyncPeriod(int periodMillis)
     {
-        conf.commitlog_sync_period_in_ms = periodMillis;
+        conf.commitlog_sync_period = new DurationSpec.IntMillisecondsBound(periodMillis);
     }
 
     public static Config.CommitLogSync getCommitLogSync()
@@ -2421,6 +2893,17 @@
         return conf.auto_snapshot;
     }
 
+    public static DurationSpec.IntSecondsBound getAutoSnapshotTtl()
+    {
+        return autoSnapshoTtl;
+    }
+
+    @VisibleForTesting
+    public static void setAutoSnapshotTtl(DurationSpec.IntSecondsBound newTtl)
+    {
+        autoSnapshoTtl = newTtl;
+    }
+
     @VisibleForTesting
     public static void setAutoSnapshot(boolean autoSnapshot)
     {
@@ -2470,6 +2953,16 @@
         return conf.hinted_handoff_disabled_datacenters;
     }
 
+    public static boolean useDeterministicTableID()
+    {
+        return conf != null && conf.use_deterministic_table_id;
+    }
+
+    public static void useDeterministicTableID(boolean value)
+    {
+        conf.use_deterministic_table_id = value;
+    }
+
     public static void enableHintsForDC(String dc)
     {
         conf.hinted_handoff_disabled_datacenters.remove(dc);
@@ -2482,12 +2975,28 @@
 
     public static void setMaxHintWindow(int ms)
     {
-        conf.max_hint_window_in_ms = ms;
+        conf.max_hint_window = new DurationSpec.IntMillisecondsBound(ms);
     }
 
     public static int getMaxHintWindow()
     {
-        return conf.max_hint_window_in_ms;
+        return conf.max_hint_window.toMilliseconds();
+    }
+
+    public static void setMaxHintsSizePerHostInMiB(int value)
+    {
+        conf.max_hints_size_per_host = new DataStorageSpec.LongBytesBound(value, MEBIBYTES);
+    }
+
+    public static int getMaxHintsSizePerHostInMiB()
+    {
+        // Warnings: this conversion rounds down while converting bytes to mebibytes
+        return Ints.saturatedCast(conf.max_hints_size_per_host.unit().toMebibytes(conf.max_hints_size_per_host.quantity()));
+    }
+
+    public static long getMaxHintsSizePerHost()
+    {
+        return conf.max_hints_size_per_host.toBytes();
     }
 
     public static File getHintsDirectory()
@@ -2495,6 +3004,11 @@
         return new File(conf.hints_directory);
     }
 
+    public static boolean hintWindowPersistentEnabled()
+    {
+        return conf.hint_window_persistent_enabled;
+    }
+
     public static File getSerializedCachePath(CacheType cacheType, String version, String extension)
     {
         String name = cacheType.toString()
@@ -2504,20 +3018,20 @@
 
     public static int getDynamicUpdateInterval()
     {
-        return conf.dynamic_snitch_update_interval_in_ms;
+        return conf.dynamic_snitch_update_interval.toMilliseconds();
     }
     public static void setDynamicUpdateInterval(int dynamicUpdateInterval)
     {
-        conf.dynamic_snitch_update_interval_in_ms = dynamicUpdateInterval;
+        conf.dynamic_snitch_update_interval = new DurationSpec.IntMillisecondsBound(dynamicUpdateInterval);
     }
 
     public static int getDynamicResetInterval()
     {
-        return conf.dynamic_snitch_reset_interval_in_ms;
+        return conf.dynamic_snitch_reset_interval.toMilliseconds();
     }
     public static void setDynamicResetInterval(int dynamicResetInterval)
     {
-        conf.dynamic_snitch_reset_interval_in_ms = dynamicResetInterval;
+        conf.dynamic_snitch_reset_interval = new DurationSpec.IntMillisecondsBound(dynamicResetInterval);
     }
 
     public static double getDynamicBadnessThreshold()
@@ -2551,24 +3065,24 @@
         conf.client_encryption_options = update.apply(conf.client_encryption_options);
     }
 
-    public static int getHintedHandoffThrottleInKB()
+    public static int getHintedHandoffThrottleInKiB()
     {
-        return conf.hinted_handoff_throttle_in_kb;
+        return conf.hinted_handoff_throttle.toKibibytes();
     }
 
-    public static void setHintedHandoffThrottleInKB(int throttleInKB)
+    public static void setHintedHandoffThrottleInKiB(int throttleInKiB)
     {
-        conf.hinted_handoff_throttle_in_kb = throttleInKB;
+        conf.hinted_handoff_throttle = new DataStorageSpec.IntKibibytesBound(throttleInKiB);
     }
 
-    public static int getBatchlogReplayThrottleInKB()
+    public static int getBatchlogReplayThrottleInKiB()
     {
-        return conf.batchlog_replay_throttle_in_kb;
+        return conf.batchlog_replay_throttle.toKibibytes();
     }
 
-    public static void setBatchlogReplayThrottleInKB(int throttleInKB)
+    public static void setBatchlogReplayThrottleInKiB(int throttleInKiB)
     {
-        conf.batchlog_replay_throttle_in_kb = throttleInKB;
+        conf.batchlog_replay_throttle = new DataStorageSpec.IntKibibytesBound(throttleInKiB);
     }
 
     public static int getMaxHintsDeliveryThreads()
@@ -2578,12 +3092,12 @@
 
     public static int getHintsFlushPeriodInMS()
     {
-        return conf.hints_flush_period_in_ms;
+        return conf.hints_flush_period.toMilliseconds();
     }
 
     public static long getMaxHintsFileSize()
     {
-        return  ByteUnit.MEBI_BYTES.toBytes(conf.max_hints_file_size_in_mb);
+        return  conf.max_hints_file_size.toBytesInLong();
     }
 
     public static ParameterizedClass getHintsCompression()
@@ -2596,6 +3110,16 @@
         conf.hints_compression = parameterizedClass;
     }
 
+    public static boolean isAutoHintsCleanupEnabled()
+    {
+        return conf.auto_hints_cleanup_enabled;
+    }
+
+    public static void setAutoHintsCleanupEnabled(boolean value)
+    {
+        conf.auto_hints_cleanup_enabled = value;
+    }
+
     public static boolean isIncrementalBackupsEnabled()
     {
         return conf.incremental_backups;
@@ -2611,27 +3135,27 @@
         return conf.file_cache_enabled;
     }
 
-    public static int getFileCacheSizeInMB()
+    public static int getFileCacheSizeInMiB()
     {
-        if (conf.file_cache_size_in_mb == null)
+        if (conf.file_cache_size == null)
         {
             // In client mode the value is not set.
             assert DatabaseDescriptor.isClientInitialized();
             return 0;
         }
 
-        return conf.file_cache_size_in_mb;
+        return conf.file_cache_size.toMebibytes();
     }
 
-    public static int getNetworkingCacheSizeInMB()
+    public static int getNetworkingCacheSizeInMiB()
     {
-        if (conf.networking_cache_size_in_mb == null)
+        if (conf.networking_cache_size == null)
         {
             // In client mode the value is not set.
             assert DatabaseDescriptor.isClientInitialized();
             return 0;
         }
-        return conf.networking_cache_size_in_mb;
+        return conf.networking_cache_size.toMebibytes();
     }
 
     public static boolean getFileCacheRoundUp()
@@ -2656,9 +3180,9 @@
         return conf.disk_optimization_estimate_percentile;
     }
 
-    public static long getTotalCommitlogSpaceInMB()
+    public static long getTotalCommitlogSpaceInMiB()
     {
-        return conf.commitlog_total_space_in_mb;
+        return conf.commitlog_total_space.toMebibytes();
     }
 
     public static boolean shouldMigrateKeycacheOnCompaction()
@@ -2671,13 +3195,21 @@
         conf.key_cache_migrate_during_compaction = migrateCacheEntry;
     }
 
-    public static int getSSTablePreemptiveOpenIntervalInMB()
+    /** This method can return negative number for disabled */
+    public static int getSSTablePreemptiveOpenIntervalInMiB()
     {
-        return FBUtilities.isWindows ? -1 : conf.sstable_preemptive_open_interval_in_mb;
+        if (conf.sstable_preemptive_open_interval == null)
+            return -1;
+        return conf.sstable_preemptive_open_interval.toMebibytes();
     }
-    public static void setSSTablePreemptiveOpenIntervalInMB(int mb)
+
+    /** Negative number for disabled */
+    public static void setSSTablePreemptiveOpenIntervalInMiB(int mib)
     {
-        conf.sstable_preemptive_open_interval_in_mb = mb;
+        if (mib < 0)
+            conf.sstable_preemptive_open_interval = null;
+        else
+            conf.sstable_preemptive_open_interval = new DataStorageSpec.IntMebibytesBound(mib);
     }
 
     public static boolean getTrickleFsync()
@@ -2685,29 +3217,29 @@
         return conf.trickle_fsync;
     }
 
-    public static int getTrickleFsyncIntervalInKb()
+    public static int getTrickleFsyncIntervalInKiB()
     {
-        return conf.trickle_fsync_interval_in_kb;
+        return conf.trickle_fsync_interval.toKibibytes();
     }
 
-    public static long getKeyCacheSizeInMB()
+    public static long getKeyCacheSizeInMiB()
     {
-        return keyCacheSizeInMB;
+        return keyCacheSizeInMiB;
     }
 
-    public static long getIndexSummaryCapacityInMB()
+    public static long getIndexSummaryCapacityInMiB()
     {
-        return indexSummaryCapacityInMB;
+        return indexSummaryCapacityInMiB;
     }
 
     public static int getKeyCacheSavePeriod()
     {
-        return conf.key_cache_save_period;
+        return conf.key_cache_save_period.toSeconds();
     }
 
     public static void setKeyCacheSavePeriod(int keyCacheSavePeriod)
     {
-        conf.key_cache_save_period = keyCacheSavePeriod;
+        conf.key_cache_save_period = new DurationSpec.IntSecondsBound(keyCacheSavePeriod);
     }
 
     public static int getKeyCacheKeysToSave()
@@ -2725,25 +3257,25 @@
         return conf.row_cache_class_name;
     }
 
-    public static long getRowCacheSizeInMB()
+    public static long getRowCacheSizeInMiB()
     {
-        return conf.row_cache_size_in_mb;
+        return conf.row_cache_size.toMebibytes();
     }
 
     @VisibleForTesting
-    public static void setRowCacheSizeInMB(long val)
+    public static void setRowCacheSizeInMiB(long val)
     {
-        conf.row_cache_size_in_mb = val;
+        conf.row_cache_size = new DataStorageSpec.LongMebibytesBound(val);
     }
 
     public static int getRowCacheSavePeriod()
     {
-        return conf.row_cache_save_period;
+        return conf.row_cache_save_period.toSeconds();
     }
 
     public static void setRowCacheSavePeriod(int rowCacheSavePeriod)
     {
-        conf.row_cache_save_period = rowCacheSavePeriod;
+        conf.row_cache_save_period = new DurationSpec.IntSecondsBound(rowCacheSavePeriod);
     }
 
     public static int getRowCacheKeysToSave()
@@ -2751,9 +3283,14 @@
         return conf.row_cache_keys_to_save;
     }
 
-    public static long getCounterCacheSizeInMB()
+    public static long getPaxosCacheSizeInMiB()
     {
-        return counterCacheSizeInMB;
+        return paxosCacheSizeInMiB;
+    }
+
+    public static long getCounterCacheSizeInMiB()
+    {
+        return counterCacheSizeInMiB;
     }
 
     public static void setRowCacheKeysToSave(int rowCacheKeysToSave)
@@ -2763,23 +3300,23 @@
 
     public static int getCounterCacheSavePeriod()
     {
-        return conf.counter_cache_save_period;
+        return conf.counter_cache_save_period.toSeconds();
     }
 
     public static void setCounterCacheSavePeriod(int counterCacheSavePeriod)
     {
-        conf.counter_cache_save_period = counterCacheSavePeriod;
+        conf.counter_cache_save_period = new DurationSpec.IntSecondsBound(counterCacheSavePeriod);
     }
 
     public static int getCacheLoadTimeout()
     {
-        return conf.cache_load_timeout_seconds;
+        return conf.cache_load_timeout.toSeconds();
     }
 
     @VisibleForTesting
     public static void setCacheLoadTimeout(int seconds)
     {
-        conf.cache_load_timeout_seconds = seconds;
+        conf.cache_load_timeout = new DurationSpec.IntSecondsBound(seconds);
     }
 
     public static int getCounterCacheKeysToSave()
@@ -2794,7 +3331,7 @@
 
     public static int getStreamingKeepAlivePeriod()
     {
-        return conf.streaming_keep_alive_period_in_secs;
+        return conf.streaming_keep_alive_period.toSeconds();
     }
 
     public static int getStreamingConnectionsPerHost()
@@ -2832,14 +3369,14 @@
         return conf.inter_dc_tcp_nodelay;
     }
 
-    public static long getMemtableHeapSpaceInMb()
+    public static long getMemtableHeapSpaceInMiB()
     {
-        return conf.memtable_heap_space_in_mb;
+        return conf.memtable_heap_space.toMebibytes();
     }
 
-    public static long getMemtableOffheapSpaceInMb()
+    public static long getMemtableOffheapSpaceInMiB()
     {
-        return conf.memtable_offheap_space_in_mb;
+        return conf.memtable_offheap_space.toMebibytes();
     }
 
     public static Config.MemtableAllocationType getMemtableAllocationType()
@@ -2863,21 +3400,32 @@
         conf.repair_session_max_tree_depth = depth;
     }
 
-    public static int getRepairSessionSpaceInMegabytes()
+    public static int getRepairSessionSpaceInMiB()
     {
-        return conf.repair_session_space_in_mb;
+        return conf.repair_session_space.toMebibytes();
     }
 
-    public static void setRepairSessionSpaceInMegabytes(int sizeInMegabytes)
+    public static void setRepairSessionSpaceInMiB(int sizeInMiB)
     {
-        if (sizeInMegabytes < 1)
-            throw new ConfigurationException("Cannot set repair_session_space_in_mb to " + sizeInMegabytes +
-                                             " < 1 megabyte");
-        else if (sizeInMegabytes > (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576)))
-            logger.warn("A repair_session_space_in_mb of " + conf.repair_session_space_in_mb +
-                        " megabytes is likely to cause heap pressure.");
+        if (sizeInMiB < 1)
+            throw new ConfigurationException("Cannot set repair_session_space to " + sizeInMiB +
+                                             " < 1 mebibyte");
+        else if (sizeInMiB > (int) (Runtime.getRuntime().maxMemory() / (4 * 1048576)))
+            logger.warn("A repair_session_space of " + conf.repair_session_space +
+                        " is likely to cause heap pressure.");
 
-        conf.repair_session_space_in_mb = sizeInMegabytes;
+        conf.repair_session_space = new DataStorageSpec.IntMebibytesBound(sizeInMiB);
+    }
+
+    public static int getPaxosRepairParallelism()
+    {
+        return conf.paxos_repair_parallelism;
+    }
+
+    public static void setPaxosRepairParallelism(int v)
+    {
+        Preconditions.checkArgument(v > 0);
+        conf.paxos_repair_parallelism = v;
     }
 
     public static Float getMemtableCleanupThreshold()
@@ -2885,14 +3433,27 @@
         return conf.memtable_cleanup_threshold;
     }
 
+    public static Map<String, InheritingClass> getMemtableConfigurations()
+    {
+        if (conf == null || conf.memtable == null)
+            return null;
+        return conf.memtable.configurations;
+    }
+
     public static int getIndexSummaryResizeIntervalInMinutes()
     {
-        return conf.index_summary_resize_interval_in_minutes;
+        if (conf.index_summary_resize_interval == null)
+            return -1;
+
+        return conf.index_summary_resize_interval.toMinutes();
     }
 
     public static void setIndexSummaryResizeIntervalInMinutes(int value)
     {
-        conf.index_summary_resize_interval_in_minutes = value;
+        if (value == -1)
+            conf.index_summary_resize_interval = null;
+        else
+            conf.index_summary_resize_interval = new DurationSpec.IntMinutesBound(value);
     }
 
     public static boolean hasLargeAddressSpace()
@@ -2913,52 +3474,47 @@
 
     public static int getTracetypeRepairTTL()
     {
-        return conf.tracetype_repair_ttl;
+        return conf.trace_type_repair_ttl.toSeconds();
     }
 
     public static int getTracetypeQueryTTL()
     {
-        return conf.tracetype_query_ttl;
+        return conf.trace_type_query_ttl.toSeconds();
     }
 
-    public static int getWindowsTimerInterval()
+    public static long getPreparedStatementsCacheSizeMiB()
     {
-        return conf.windows_timer_interval;
-    }
-
-    public static long getPreparedStatementsCacheSizeMB()
-    {
-        return preparedStatementsCacheSizeInMB;
+        return preparedStatementsCacheSizeInMiB;
     }
 
     public static boolean enableUserDefinedFunctions()
     {
-        return conf.enable_user_defined_functions;
+        return conf.user_defined_functions_enabled;
     }
 
     public static boolean enableScriptedUserDefinedFunctions()
     {
-        return conf.enable_scripted_user_defined_functions;
+        return conf.scripted_user_defined_functions_enabled;
     }
 
     public static void enableScriptedUserDefinedFunctions(boolean enableScriptedUserDefinedFunctions)
     {
-        conf.enable_scripted_user_defined_functions = enableScriptedUserDefinedFunctions;
+        conf.scripted_user_defined_functions_enabled = enableScriptedUserDefinedFunctions;
     }
 
     public static boolean enableUserDefinedFunctionsThreads()
     {
-        return conf.enable_user_defined_functions_threads;
+        return conf.user_defined_functions_threads_enabled;
     }
 
     public static long getUserDefinedFunctionWarnTimeout()
     {
-        return conf.user_defined_function_warn_timeout;
+        return conf.user_defined_functions_warn_timeout.toMilliseconds();
     }
 
     public static void setUserDefinedFunctionWarnTimeout(long userDefinedFunctionWarnTimeout)
     {
-        conf.user_defined_function_warn_timeout = userDefinedFunctionWarnTimeout;
+        conf.user_defined_functions_warn_timeout = new DurationSpec.LongMillisecondsBound(userDefinedFunctionWarnTimeout);
     }
 
     public static boolean allowInsecureUDFs()
@@ -2971,55 +3527,55 @@
         return conf.allow_extra_insecure_udfs;
     }
 
-    public static boolean getEnableMaterializedViews()
+    public static boolean getMaterializedViewsEnabled()
     {
-        return conf.enable_materialized_views;
+        return conf.materialized_views_enabled;
     }
 
-    public static void setEnableMaterializedViews(boolean enableMaterializedViews)
+    public static void setMaterializedViewsEnabled(boolean enableMaterializedViews)
     {
-        conf.enable_materialized_views = enableMaterializedViews;
+        conf.materialized_views_enabled = enableMaterializedViews;
     }
 
-    public static boolean getEnableSASIIndexes()
+    public static boolean getSASIIndexesEnabled()
     {
-        return conf.enable_sasi_indexes;
+        return conf.sasi_indexes_enabled;
     }
 
-    public static void setEnableSASIIndexes(boolean enableSASIIndexes)
+    public static void setSASIIndexesEnabled(boolean enableSASIIndexes)
     {
-        conf.enable_sasi_indexes = enableSASIIndexes;
+        conf.sasi_indexes_enabled = enableSASIIndexes;
     }
 
     public static boolean isTransientReplicationEnabled()
     {
-        return conf.enable_transient_replication;
+        return conf.transient_replication_enabled;
     }
 
     public static void setTransientReplicationEnabledUnsafe(boolean enabled)
     {
-        conf.enable_transient_replication = enabled;
+        conf.transient_replication_enabled = enabled;
     }
 
     public static boolean enableDropCompactStorage()
     {
-        return conf.enable_drop_compact_storage;
+        return conf.drop_compact_storage_enabled;
     }
 
     @VisibleForTesting
     public static void setEnableDropCompactStorage(boolean enableDropCompactStorage)
     {
-        conf.enable_drop_compact_storage = enableDropCompactStorage;
+        conf.drop_compact_storage_enabled = enableDropCompactStorage;
     }
 
     public static long getUserDefinedFunctionFailTimeout()
     {
-        return conf.user_defined_function_fail_timeout;
+        return conf.user_defined_functions_fail_timeout.toMilliseconds();
     }
 
     public static void setUserDefinedFunctionFailTimeout(long userDefinedFunctionFailTimeout)
     {
-        conf.user_defined_function_fail_timeout = userDefinedFunctionFailTimeout;
+        conf.user_defined_functions_fail_timeout = new DurationSpec.LongMillisecondsBound(userDefinedFunctionFailTimeout);
     }
 
     public static Config.UserFunctionTimeoutPolicy getUserFunctionTimeoutPolicy()
@@ -3034,12 +3590,12 @@
 
     public static long getGCLogThreshold()
     {
-        return conf.gc_log_threshold_in_ms;
+        return conf.gc_log_threshold.toMilliseconds();
     }
 
     public static void setGCLogThreshold(int gcLogThreshold)
     {
-        conf.gc_log_threshold_in_ms = gcLogThreshold;
+        conf.gc_log_threshold = new DurationSpec.IntMillisecondsBound(gcLogThreshold);
     }
 
     public static EncryptionContext getEncryptionContext()
@@ -3049,12 +3605,12 @@
 
     public static long getGCWarnThreshold()
     {
-        return conf.gc_warn_threshold_in_ms;
+        return conf.gc_warn_threshold.toMilliseconds();
     }
 
     public static void setGCWarnThreshold(int threshold)
     {
-        conf.gc_warn_threshold_in_ms = threshold;
+        conf.gc_warn_threshold = new DurationSpec.IntMillisecondsBound(threshold);
     }
 
     public static boolean isCDCEnabled()
@@ -3068,25 +3624,35 @@
         conf.cdc_enabled = cdc_enabled;
     }
 
+    public static boolean getCDCBlockWrites()
+    {
+        return conf.cdc_block_writes;
+    }
+
+    public static void setCDCBlockWrites(boolean val)
+    {
+        conf.cdc_block_writes = val;
+    }
+
     public static String getCDCLogLocation()
     {
         return conf.cdc_raw_directory;
     }
 
-    public static int getCDCSpaceInMB()
+    public static long getCDCTotalSpace()
     {
-        return conf.cdc_total_space_in_mb;
+        return conf.cdc_total_space.toBytesInLong();
     }
 
     @VisibleForTesting
-    public static void setCDCSpaceInMB(int input)
+    public static void setCDCTotalSpaceInMiB(int mibs)
     {
-        conf.cdc_total_space_in_mb = input;
+        conf.cdc_total_space = new DataStorageSpec.IntMebibytesBound(mibs);
     }
 
     public static int getCDCDiskCheckInterval()
     {
-        return conf.cdc_free_space_check_interval_ms;
+        return conf.cdc_free_space_check_interval.toMilliseconds();
     }
 
     @VisibleForTesting
@@ -3187,7 +3753,7 @@
         if (value > getConcurrentCompactors())
             logger.warn("max_concurrent_automatic_sstable_upgrades ({}) is larger than concurrent_compactors ({})", value, getConcurrentCompactors());
     }
-    
+
     public static AuditLogOptions getAuditLoggingOptions()
     {
         return conf.audit_logging_options;
@@ -3195,7 +3761,7 @@
 
     public static void setAuditLoggingOptions(AuditLogOptions auditLoggingOptions)
     {
-        conf.audit_logging_options = auditLoggingOptions;
+        conf.audit_logging_options = new AuditLogOptions.Builder(auditLoggingOptions).build();
     }
 
     public static Config.CorruptedTombstoneStrategy getCorruptedTombstoneStrategy()
@@ -3284,52 +3850,32 @@
         commitLogSegmentMgrProvider = provider;
     }
 
-    /**
-     * Class that primarily tracks overflow thresholds during conversions
-     */
-    private enum ByteUnit {
-        KIBI_BYTES(2048 * 1024, 1024),
-        MEBI_BYTES(2048, 1024 * 1024);
-
-        private final int overflowThreshold;
-        private final int multiplier;
-
-        ByteUnit(int t, int m)
-        {
-            this.overflowThreshold = t;
-            this.multiplier = m;
-        }
-
-        public int overflowThreshold()
-        {
-            return overflowThreshold;
-        }
-
-        public boolean willOverflowInBytes(int val)
-        {
-            return val >= overflowThreshold;
-        }
-
-        public long toBytes(int val)
-        {
-            return val * multiplier;
-        }
+    private static DataStorageSpec.IntKibibytesBound createIntKibibyteBoundAndEnsureItIsValidForByteConversion(int kibibytes, String propertyName)
+    {
+        DataStorageSpec.IntKibibytesBound intKibibytesBound = new DataStorageSpec.IntKibibytesBound(kibibytes);
+        checkValidForByteConversion(intKibibytesBound, propertyName);
+        return intKibibytesBound;
     }
 
     /**
      * Ensures passed in configuration value is positive and will not overflow when converted to Bytes
      */
-    private static void checkValidForByteConversion(int val, final String name, final ByteUnit unit)
+    private static void checkValidForByteConversion(final DataStorageSpec.IntKibibytesBound value, String name)
     {
-        if (val < 0 || unit.willOverflowInBytes(val))
-            throw new ConfigurationException(String.format("%s must be positive value < %d, but was %d",
-                                                           name, unit.overflowThreshold(), val), false);
+        long valueInBytes = value.toBytesInLong();
+        if (valueInBytes < 0 || valueInBytes > Integer.MAX_VALUE - 1)
+        {
+            throw new ConfigurationException(String.format("%s must be positive value <= %dB, but was %dB",
+                                                           name,
+                                                           Integer.MAX_VALUE - 1,
+                                                           valueInBytes),
+                                             false);
+        }
     }
 
     public static int getValidationPreviewPurgeHeadStartInSec()
     {
-        int seconds = conf.validation_preview_purge_head_start_in_sec;
-        return Math.max(seconds, 0);
+        return conf.validation_preview_purge_head_start.toSeconds();
     }
 
     public static boolean checkForDuplicateRowsDuringReads()
@@ -3423,26 +3969,51 @@
         conf.auto_optimise_preview_repair_streams = enabled;
     }
 
+    @Deprecated
     public static int tableCountWarnThreshold()
     {
         return conf.table_count_warn_threshold;
     }
 
+    @Deprecated // this warning threshold will be replaced by an equivalent guardrail
     public static void setTableCountWarnThreshold(int value)
     {
         conf.table_count_warn_threshold = value;
     }
 
+    @Deprecated // this warning threshold will be replaced by an equivalent guardrail
     public static int keyspaceCountWarnThreshold()
     {
         return conf.keyspace_count_warn_threshold;
     }
 
+    @Deprecated // this warning threshold will be replaced by an equivalent guardrail
     public static void setKeyspaceCountWarnThreshold(int value)
     {
         conf.keyspace_count_warn_threshold = value;
     }
 
+    @Deprecated // this warning threshold will be replaced by an equivalent guardrail
+    public static ConsistencyLevel getAuthWriteConsistencyLevel()
+    {
+        return ConsistencyLevel.valueOf(conf.auth_write_consistency_level);
+    }
+
+    public static ConsistencyLevel getAuthReadConsistencyLevel()
+    {
+        return ConsistencyLevel.valueOf(conf.auth_read_consistency_level);
+    }
+
+    public static void setAuthWriteConsistencyLevel(ConsistencyLevel cl)
+    {
+        conf.auth_write_consistency_level = cl.toString();
+    }
+
+    public static void setAuthReadConsistencyLevel(ConsistencyLevel cl)
+    {
+        conf.auth_read_consistency_level = cl.toString();
+    }
+
     public static int getConsecutiveMessageErrorsThreshold()
     {
         return conf.consecutive_message_errors_threshold;
@@ -3453,6 +4024,239 @@
         conf.consecutive_message_errors_threshold = value;
     }
 
+    public static boolean getPartitionDenylistEnabled()
+    {
+        return conf.partition_denylist_enabled;
+    }
+
+    public static void setPartitionDenylistEnabled(boolean enabled)
+    {
+        conf.partition_denylist_enabled = enabled;
+    }
+
+    public static boolean getDenylistWritesEnabled()
+    {
+        return conf.denylist_writes_enabled;
+    }
+
+    public static void setDenylistWritesEnabled(boolean enabled)
+    {
+        conf.denylist_writes_enabled = enabled;
+    }
+
+    public static boolean getDenylistReadsEnabled()
+    {
+        return conf.denylist_reads_enabled;
+    }
+
+    public static void setDenylistReadsEnabled(boolean enabled)
+    {
+        conf.denylist_reads_enabled = enabled;
+    }
+
+    public static boolean getDenylistRangeReadsEnabled()
+    {
+        return conf.denylist_range_reads_enabled;
+    }
+
+    public static void setDenylistRangeReadsEnabled(boolean enabled)
+    {
+        conf.denylist_range_reads_enabled = enabled;
+    }
+
+    public static int getDenylistRefreshSeconds()
+    {
+        return conf.denylist_refresh.toSeconds();
+    }
+
+    public static void setDenylistRefreshSeconds(int seconds)
+    {
+        if (seconds <= 0)
+            throw new IllegalArgumentException("denylist_refresh must be a positive integer.");
+
+        conf.denylist_refresh = new DurationSpec.IntSecondsBound(seconds);
+    }
+
+    public static int getDenylistInitialLoadRetrySeconds()
+    {
+        return conf.denylist_initial_load_retry.toSeconds();
+    }
+
+    public static void setDenylistInitialLoadRetrySeconds(int seconds)
+    {
+        if (seconds <= 0)
+            throw new IllegalArgumentException("denylist_initial_load_retry must be a positive integer.");
+
+        conf.denylist_initial_load_retry = new DurationSpec.IntSecondsBound(seconds);
+    }
+
+    public static ConsistencyLevel getDenylistConsistencyLevel()
+    {
+        return conf.denylist_consistency_level;
+    }
+
+    public static void setDenylistConsistencyLevel(ConsistencyLevel cl)
+    {
+        conf.denylist_consistency_level = cl;
+    }
+
+    public static int getDenylistMaxKeysPerTable()
+    {
+        return conf.denylist_max_keys_per_table;
+    }
+
+    public static void setDenylistMaxKeysPerTable(int value)
+    {
+        if (value <= 0)
+            throw new IllegalArgumentException("denylist_max_keys_per_table must be a positive integer.");
+        conf.denylist_max_keys_per_table = value;
+    }
+
+    public static int getDenylistMaxKeysTotal()
+    {
+        return conf.denylist_max_keys_total;
+    }
+
+    public static void setDenylistMaxKeysTotal(int value)
+    {
+        if (value <= 0)
+            throw new IllegalArgumentException("denylist_max_keys_total must be a positive integer.");
+        conf.denylist_max_keys_total = value;
+    }
+
+    public static boolean getAuthCacheWarmingEnabled()
+    {
+        return conf.auth_cache_warming_enabled;
+    }
+
+    public static SubnetGroups getClientErrorReportingExclusions()
+    {
+        return conf.client_error_reporting_exclusions;
+    }
+
+    public static SubnetGroups getInternodeErrorReportingExclusions()
+    {
+        return conf.internode_error_reporting_exclusions;
+    }
+
+    public static boolean getReadThresholdsEnabled()
+    {
+        return conf.read_thresholds_enabled;
+    }
+
+    public static void setReadThresholdsEnabled(boolean value)
+    {
+        if (conf.read_thresholds_enabled != value)
+        {
+            conf.read_thresholds_enabled = value;
+            logger.info("updated read_thresholds_enabled to {}", value);
+        }
+    }
+
+    @Nullable
+    public static DataStorageSpec.LongBytesBound getCoordinatorReadSizeWarnThreshold()
+    {
+        return conf.coordinator_read_size_warn_threshold;
+    }
+
+    public static void setCoordinatorReadSizeWarnThreshold(@Nullable DataStorageSpec.LongBytesBound value)
+    {
+        logger.info("updating  coordinator_read_size_warn_threshold to {}", value);
+        conf.coordinator_read_size_warn_threshold = value;
+    }
+
+    @Nullable
+    public static DataStorageSpec.LongBytesBound getCoordinatorReadSizeFailThreshold()
+    {
+        return conf.coordinator_read_size_fail_threshold;
+    }
+
+    public static void setCoordinatorReadSizeFailThreshold(@Nullable DataStorageSpec.LongBytesBound value)
+    {
+        logger.info("updating  coordinator_read_size_fail_threshold to {}", value);
+        conf.coordinator_read_size_fail_threshold = value;
+    }
+
+    @Nullable
+    public static DataStorageSpec.LongBytesBound getLocalReadSizeWarnThreshold()
+    {
+        return conf.local_read_size_warn_threshold;
+    }
+
+    public static void setLocalReadSizeWarnThreshold(@Nullable DataStorageSpec.LongBytesBound value)
+    {
+        logger.info("updating  local_read_size_warn_threshold to {}", value);
+        conf.local_read_size_warn_threshold = value;
+    }
+
+    @Nullable
+    public static DataStorageSpec.LongBytesBound getLocalReadSizeFailThreshold()
+    {
+        return conf.local_read_size_fail_threshold;
+    }
+
+    public static void setLocalReadSizeFailThreshold(@Nullable DataStorageSpec.LongBytesBound value)
+    {
+        logger.info("updating  local_read_size_fail_threshold to {}", value);
+        conf.local_read_size_fail_threshold = value;
+    }
+
+    @Nullable
+    public static DataStorageSpec.LongBytesBound getRowIndexReadSizeWarnThreshold()
+    {
+        return conf.row_index_read_size_warn_threshold;
+    }
+
+    public static void setRowIndexReadSizeWarnThreshold(@Nullable DataStorageSpec.LongBytesBound value)
+    {
+        logger.info("updating  row_index_size_warn_threshold to {}", value);
+        conf.row_index_read_size_warn_threshold = value;
+    }
+
+    @Nullable
+    public static DataStorageSpec.LongBytesBound getRowIndexReadSizeFailThreshold()
+    {
+        return conf.row_index_read_size_fail_threshold;
+    }
+
+    public static void setRowIndexReadSizeFailThreshold(@Nullable DataStorageSpec.LongBytesBound value)
+    {
+        logger.info("updating  row_index_read_size_fail_threshold to {}", value);
+        conf.row_index_read_size_fail_threshold = value;
+    }
+
+    public static int getDefaultKeyspaceRF() { return conf.default_keyspace_rf; }
+
+    public static void setDefaultKeyspaceRF(int value) throws IllegalArgumentException
+    {
+        if (value < 1)
+        {
+            throw new IllegalArgumentException("default_keyspace_rf cannot be less than 1");
+        }
+
+        if (value < guardrails.getMinimumReplicationFactorFailThreshold())
+        {
+            throw new IllegalArgumentException(String.format("default_keyspace_rf to be set (%d) cannot be less than minimum_replication_factor_fail_threshold (%d)", value, guardrails.getMinimumReplicationFactorFailThreshold()));
+        }
+
+        conf.default_keyspace_rf = value;
+    }
+
+
+    public static boolean getUseStatementsEnabled()
+    {
+        return conf.use_statements_enabled;
+    }
+
+    public static void setUseStatementsEnabled(boolean enabled)
+    {
+        if (enabled != conf.use_statements_enabled)
+        {
+            logger.info("Setting use_statements_enabled to {}", enabled);
+            conf.use_statements_enabled = enabled;
+        }
+    }
+
     public static boolean getForceNewPreparedStatementBehaviour()
     {
         return conf.force_new_prepared_statement_behaviour;
@@ -3466,4 +4270,137 @@
             conf.force_new_prepared_statement_behaviour = value;
         }
     }
+
+    public static DurationSpec.LongNanosecondsBound getStreamingStateExpires()
+    {
+        return conf.streaming_state_expires;
+    }
+
+    public static void setStreamingStateExpires(DurationSpec.LongNanosecondsBound duration)
+    {
+        if (!conf.streaming_state_expires.equals(Objects.requireNonNull(duration, "duration")))
+        {
+            logger.info("Setting streaming_state_expires to {}", duration);
+            conf.streaming_state_expires = duration;
+        }
+    }
+
+    public static DataStorageSpec.LongBytesBound getStreamingStateSize()
+    {
+        return conf.streaming_state_size;
+    }
+
+    public static void setStreamingStateSize(DataStorageSpec.LongBytesBound duration)
+    {
+        if (!conf.streaming_state_size.equals(Objects.requireNonNull(duration, "duration")))
+        {
+            logger.info("Setting streaming_state_size to {}", duration);
+            conf.streaming_state_size = duration;
+        }
+    }
+
+    public static boolean getStreamingStatsEnabled()
+    {
+        return conf.streaming_stats_enabled;
+    }
+
+    public static void setStreamingStatsEnabled(boolean streamingStatsEnabled)
+    {
+        if (conf.streaming_stats_enabled != streamingStatsEnabled)
+        {
+            logger.info("Setting streaming_stats_enabled to {}", streamingStatsEnabled);
+            conf.streaming_stats_enabled = streamingStatsEnabled;
+        }
+    }
+
+    public static DurationSpec.IntSecondsBound getStreamingSlowEventsLogTimeout() {
+        return conf.streaming_slow_events_log_timeout;
+    }
+
+    public static void setStreamingSlowEventsLogTimeout(String value) {
+        DurationSpec.IntSecondsBound next = new DurationSpec.IntSecondsBound(value);
+        if (!conf.streaming_slow_events_log_timeout.equals(next))
+        {
+            logger.info("Setting streaming_slow_events_log to " + value);
+            conf.streaming_slow_events_log_timeout = next;
+        }
+    }
+
+    public static boolean isUUIDSSTableIdentifiersEnabled()
+    {
+        return conf.uuid_sstable_identifiers_enabled;
+    }
+
+    public static DurationSpec.LongNanosecondsBound getRepairStateExpires()
+    {
+        return conf.repair_state_expires;
+    }
+
+    public static void setRepairStateExpires(DurationSpec.LongNanosecondsBound duration)
+    {
+        if (!conf.repair_state_expires.equals(Objects.requireNonNull(duration, "duration")))
+        {
+            logger.info("Setting repair_state_expires to {}", duration);
+            conf.repair_state_expires = duration;
+        }
+    }
+
+    public static int getRepairStateSize()
+    {
+        return conf.repair_state_size;
+    }
+
+    public static void setRepairStateSize(int size)
+    {
+        if (conf.repair_state_size != size)
+        {
+            logger.info("Setting repair_state_size to {}", size);
+            conf.repair_state_size = size;
+        }
+    }
+
+    public static boolean topPartitionsEnabled()
+    {
+        return conf.top_partitions_enabled;
+    }
+
+    public static int getMaxTopSizePartitionCount()
+    {
+        return conf.max_top_size_partition_count;
+    }
+
+    public static void setMaxTopSizePartitionCount(int value)
+    {
+        conf.max_top_size_partition_count = value;
+    }
+
+    public static int getMaxTopTombstonePartitionCount()
+    {
+        return conf.max_top_tombstone_partition_count;
+    }
+
+    public static void setMaxTopTombstonePartitionCount(int value)
+    {
+        conf.max_top_tombstone_partition_count = value;
+    }
+
+    public static DataStorageSpec.LongBytesBound getMinTrackedPartitionSizeInBytes()
+    {
+        return conf.min_tracked_partition_size;
+    }
+
+    public static void setMinTrackedPartitionSizeInBytes(DataStorageSpec.LongBytesBound spec)
+    {
+        conf.min_tracked_partition_size = spec;
+    }
+
+    public static long getMinTrackedPartitionTombstoneCount()
+    {
+        return conf.min_tracked_partition_tombstone_count;
+    }
+
+    public static void setMinTrackedPartitionTombstoneCount(long value)
+    {
+        conf.min_tracked_partition_tombstone_count = value;
+    }
 }
diff --git a/src/java/org/apache/cassandra/config/DefaultLoader.java b/src/java/org/apache/cassandra/config/DefaultLoader.java
new file mode 100644
index 0000000..6767d8a
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/DefaultLoader.java
@@ -0,0 +1,119 @@
+/*
+ * 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.config;
+
+import java.beans.IntrospectionException;
+import java.beans.Introspector;
+import java.beans.PropertyDescriptor;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.yaml.snakeyaml.error.YAMLException;
+import org.yaml.snakeyaml.introspector.FieldProperty;
+import org.yaml.snakeyaml.introspector.MethodProperty;
+import org.yaml.snakeyaml.introspector.Property;
+
+import static org.apache.cassandra.utils.FBUtilities.camelToSnake;
+
+public class DefaultLoader implements Loader
+{
+    @Override
+    public Map<String, Property> getProperties(Class<?> root)
+    {
+        Map<String, Property> properties = new HashMap<>();
+        for (Class<?> c = root; c != null; c = c.getSuperclass())
+        {
+            for (Field f : c.getDeclaredFields())
+            {
+                String name = camelToSnake(f.getName());
+                int modifiers = f.getModifiers();
+                if (!Modifier.isStatic(modifiers)
+                    && !f.isAnnotationPresent(JsonIgnore.class)
+                    && !Modifier.isTransient(modifiers)
+                    && Modifier.isPublic(modifiers)
+                    && !properties.containsKey(name))
+                    properties.put(name, new FieldProperty(f));
+            }
+        }
+        try
+        {
+            PropertyDescriptor[] descriptors = Introspector.getBeanInfo(root).getPropertyDescriptors();
+            if (descriptors != null)
+            {
+                for (PropertyDescriptor d : descriptors)
+                {
+                    String name = camelToSnake(d.getName());
+                    Method writeMethod = d.getWriteMethod();
+                    // if the property can't be written to, then ignore it
+                    if (writeMethod == null || writeMethod.isAnnotationPresent(JsonIgnore.class))
+                        continue;
+                    // if read method exists, override the field version in case get/set does validation
+                    if (properties.containsKey(name) && (d.getReadMethod() == null || d.getReadMethod().isAnnotationPresent(JsonIgnore.class)))
+                        continue;
+                    d.setName(name);
+                    properties.put(name, new MethodPropertyPlus(d));
+                }
+            }
+        }
+        catch (IntrospectionException e)
+        {
+            throw new RuntimeException(e);
+        }
+        return properties;
+    }
+
+    /**
+     * .get() acts differently than .set() and doesn't do a good job showing the cause of the failure, this
+     * class rewrites to make the errors easier to reason with.
+     */
+    private static class MethodPropertyPlus extends MethodProperty
+    {
+        private final Method readMethod;
+
+        public MethodPropertyPlus(PropertyDescriptor property)
+        {
+            super(property);
+            this.readMethod = property.getReadMethod();
+        }
+
+        @Override
+        public Object get(Object object)
+        {
+            if (!isReadable())
+                throw new YAMLException("No readable property '" + getName() + "' on class: " + object.getClass().getName());
+
+            try
+            {
+                return readMethod.invoke(object);
+            }
+            catch (IllegalAccessException e)
+            {
+                throw new YAMLException("Unable to find getter for property '" + getName() + "' on class " + object.getClass().getName(), e);
+            }
+            catch (InvocationTargetException e)
+            {
+                throw new YAMLException("Failed calling getter for property '" + getName() + "' on class " + object.getClass().getName(), e.getCause());
+            }
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/DurationSpec.java b/src/java/org/apache/cassandra/config/DurationSpec.java
new file mode 100644
index 0000000..10d56c2
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/DurationSpec.java
@@ -0,0 +1,617 @@
+/*
+ * 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.config;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.concurrent.TimeUnit;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import com.google.common.primitives.Ints;
+
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+/**
+ * Represents a positive time duration. Wrapper class for Cassandra duration configuration parameters, providing to the
+ * users the opportunity to be able to provide config with a unit of their choice in cassandra.yaml as per the available
+ * options. (CASSANDRA-15234)
+ */
+public abstract class DurationSpec
+{
+    /**
+     * The Regexp used to parse the duration provided as String.
+     */
+    private static final Pattern UNITS_PATTERN = Pattern.compile(("^(\\d+)(d|h|s|ms|us|µs|ns|m)$"));
+
+    private final long quantity;
+
+    private final TimeUnit unit;
+
+    private DurationSpec(long quantity, TimeUnit unit, TimeUnit minUnit, long max)
+    {
+        this.quantity = quantity;
+        this.unit = unit;
+
+        validateMinUnit(unit, minUnit, quantity + " " + unit);
+        validateQuantity(quantity, unit, minUnit, max);
+    }
+
+    private DurationSpec(double quantity, TimeUnit unit, TimeUnit minUnit, long max)
+    {
+        this(Math.round(quantity), unit, minUnit, max);
+    }
+
+    private DurationSpec(String value, TimeUnit minUnit)
+    {
+        Matcher matcher = UNITS_PATTERN.matcher(value);
+
+        if (matcher.find())
+        {
+            quantity = Long.parseLong(matcher.group(1));
+            unit = fromSymbol(matcher.group(2));
+
+            // this constructor is used only by extended classes for min unit; upper bound and min unit are guarded there accordingly
+        }
+        else
+        {
+            throw new IllegalArgumentException("Invalid duration: " + value + " Accepted units:" + acceptedUnits(minUnit) +
+                                               " where case matters and only non-negative values.");
+        }
+    }
+
+    private DurationSpec(String value, TimeUnit minUnit, long max)
+    {
+        this(value, minUnit);
+
+        validateMinUnit(unit, minUnit, value);
+        validateQuantity(value, quantity(), unit(), minUnit, max);
+    }
+
+    private static void validateMinUnit(TimeUnit unit, TimeUnit minUnit, String value)
+    {
+        if (unit.compareTo(minUnit) < 0)
+            throw new IllegalArgumentException(String.format("Invalid duration: %s Accepted units:%s", value, acceptedUnits(minUnit)));
+    }
+
+    private static String acceptedUnits(TimeUnit minUnit)
+    {
+        TimeUnit[] units = TimeUnit.values();
+        return Arrays.toString(Arrays.copyOfRange(units, minUnit.ordinal(), units.length));
+    }
+
+    private static void validateQuantity(String value, long quantity, TimeUnit sourceUnit, TimeUnit minUnit, long max)
+    {
+        // no need to validate for negatives as they are not allowed at first place from the regex
+
+        if (minUnit.convert(quantity, sourceUnit) >= max)
+            throw new IllegalArgumentException("Invalid duration: " + value + ". It shouldn't be more than " +
+                                             (max - 1) + " in " + minUnit.name().toLowerCase());
+    }
+
+    private static void validateQuantity(long quantity, TimeUnit sourceUnit, TimeUnit minUnit, long max)
+    {
+        if (quantity < 0)
+            throw new IllegalArgumentException("Invalid duration: value must be non-negative");
+
+        if (minUnit.convert(quantity, sourceUnit) >= max)
+            throw new IllegalArgumentException(String.format("Invalid duration: %d %s. It shouldn't be more than %d in %s",
+                                                           quantity, sourceUnit.name().toLowerCase(),
+                                                           max - 1, minUnit.name().toLowerCase()));
+    }
+
+    // get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is
+    // imporant to be explicit about get/set as this changes how parsing is done; this class is a data-type, so is
+    // not nested, having get/set can confuse parsing thinking this is a nested type
+    public long quantity()
+    {
+        return quantity;
+    }
+
+    public TimeUnit unit()
+    {
+        return unit;
+    }
+
+    /**
+     * @param symbol the time unit symbol
+     * @return the time unit associated to the specified symbol
+     */
+    static TimeUnit fromSymbol(String symbol)
+    {
+        switch (symbol.toLowerCase())
+        {
+            case "d": return DAYS;
+            case "h": return HOURS;
+            case "m": return MINUTES;
+            case "s": return SECONDS;
+            case "ms": return MILLISECONDS;
+            case "us":
+            case "µs": return MICROSECONDS;
+            case "ns": return TimeUnit.NANOSECONDS;
+        }
+        throw new IllegalArgumentException(String.format("Unsupported time unit: %s. Supported units are: %s",
+                                                       symbol, Arrays.stream(TimeUnit.values())
+                                                                     .map(DurationSpec::symbol)
+                                                                     .collect(Collectors.joining(", "))));
+    }
+
+    /**
+     * @param targetUnit the time unit
+     * @return this duration in the specified time unit
+     */
+    public long to(TimeUnit targetUnit)
+    {
+        return targetUnit.convert(quantity, unit);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        // Milliseconds seems to be a reasonable tradeoff
+        return Objects.hash(unit.toMillis(quantity));
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+            return true;
+
+        if (!(obj instanceof DurationSpec))
+            return false;
+
+        DurationSpec other = (DurationSpec) obj;
+        if (unit == other.unit)
+            return quantity == other.quantity;
+
+        // Due to overflows we can only guarantee that the 2 durations are equal if we get the same results
+        // doing the conversion in both directions.
+        return unit.convert(other.quantity, other.unit) == quantity && other.unit.convert(quantity, unit) == other.quantity;
+    }
+
+    @Override
+    public String toString()
+    {
+        return quantity + symbol(unit);
+    }
+
+    /**
+     * Returns the symbol associated to the specified unit
+     *
+     * @param unit the time unit
+     * @return the time unit symbol
+     */
+    // get vs no-get prefix is not consistent in the code base, but for classes involved with config parsing, it is
+    // imporant to be explicit about get/set as this changes how parsing is done; this class is a data-type, so is
+    // not nested, having get/set can confuse parsing thinking this is a nested type
+    static String symbol(TimeUnit unit)
+    {
+        switch (unit)
+        {
+            case DAYS: return "d";
+            case HOURS: return "h";
+            case MINUTES: return "m";
+            case SECONDS: return "s";
+            case MILLISECONDS: return "ms";
+            case MICROSECONDS: return "us";
+            case NANOSECONDS: return "ns";
+        }
+        throw new AssertionError();
+    }
+
+    /**
+     * Represents a duration used for Cassandra configuration. The bound is [0, Long.MAX_VALUE) in nanoseconds.
+     * If the user sets a different unit - we still validate that converted to nanoseconds the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class LongNanosecondsBound extends DurationSpec
+    {
+        /**
+         * Creates a {@code DurationSpec.LongNanosecondsBound} of the specified amount.
+         * The bound is [0, Long.MAX_VALUE) in nanoseconds.
+         *
+         * @param value the duration
+         */
+        public LongNanosecondsBound(String value)
+        {
+            super(value, NANOSECONDS, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.LongNanosecondsBound} of the specified amount in the specified unit.
+         * The bound is [0, Long.MAX_VALUE) in nanoseconds.
+         *
+         * @param quantity where quantity shouldn't be bigger than Long.MAX_VALUE - 1 in nanoseconds
+         * @param unit in which the provided quantity is
+         */
+        public LongNanosecondsBound(long quantity, TimeUnit unit)
+        {
+            super(quantity, unit, NANOSECONDS, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.LongNanosecondsBound} of the specified amount in nanoseconds.
+         * The bound is [0, Long.MAX_VALUE) in nanoseconds.
+         *
+         * @param nanoseconds where nanoseconds shouldn't be bigger than Long.MAX_VALUE-1
+         */
+        public LongNanosecondsBound(long nanoseconds)
+        {
+            this(nanoseconds, NANOSECONDS);
+        }
+
+        /**
+         * @return this duration in number of nanoseconds
+         */
+        public long toNanoseconds()
+        {
+            return unit().toNanos(quantity());
+        }
+    }
+
+    /**
+     * Represents a duration used for Cassandra configuration. The bound is [0, Long.MAX_VALUE) in milliseconds.
+     * If the user sets a different unit - we still validate that converted to milliseconds the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class LongMillisecondsBound extends DurationSpec
+    {
+        /**
+         * Creates a {@code DurationSpec.LongMillisecondsBound} of the specified amount.
+         * The bound is [0, Long.MAX_VALUE) in milliseconds.
+         *
+         * @param value the duration
+         */
+        public LongMillisecondsBound(String value)
+        {
+            super(value, MILLISECONDS, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.LongMillisecondsBound} of the specified amount in the specified unit.
+         * The bound is [0, Long.MAX_VALUE) in milliseconds.
+         *
+         * @param quantity where quantity shouldn't be bigger than Long.MAX_VALUE - 1 in milliseconds
+         * @param unit in which the provided quantity is
+         */
+        public LongMillisecondsBound(long quantity, TimeUnit unit)
+        {
+            super(quantity, unit, MILLISECONDS, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.LongMillisecondsBound} of the specified amount in milliseconds.
+         * The bound is [0, Long.MAX_VALUE) in milliseconds.
+         *
+         * @param milliseconds where milliseconds shouldn't be bigger than Long.MAX_VALUE-1
+         */
+        public LongMillisecondsBound(long milliseconds)
+        {
+            this(milliseconds, MILLISECONDS);
+        }
+
+        /**
+         * @return this duration in number of milliseconds
+         */
+        public long toMilliseconds()
+        {
+            return unit().toMillis(quantity());
+        }
+    }
+
+    /**
+     * Represents a duration used for Cassandra configuration. The bound is [0, Long.MAX_VALUE) in seconds.
+     * If the user sets a different unit - we still validate that converted to seconds the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class LongSecondsBound extends DurationSpec
+    {
+        /**
+         * Creates a {@code DurationSpec.LongSecondsBound} of the specified amount.
+         * The bound is [0, Long.MAX_VALUE) in seconds.
+         *
+         * @param value the duration
+         */
+        public LongSecondsBound(String value)
+        {
+            super(value, SECONDS, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.LongSecondsBound} of the specified amount in the specified unit.
+         * The bound is [0, Long.MAX_VALUE) in seconds.
+         *
+         * @param quantity where quantity shouldn't be bigger than Long.MAX_VALUE - 1 in seconds
+         * @param unit in which the provided quantity is
+         */
+        public LongSecondsBound(long quantity, TimeUnit unit)
+        {
+            super(quantity, unit, SECONDS, Long.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.LongSecondsBound} of the specified amount in seconds.
+         * The bound is [0, Long.MAX_VALUE) in seconds.
+         *
+         * @param seconds where seconds shouldn't be bigger than Long.MAX_VALUE-1
+         */
+        public LongSecondsBound(long seconds)
+        {
+            this(seconds, SECONDS);
+        }
+
+        /**
+         * @return this duration in number of milliseconds
+         */
+        public long toMilliseconds()
+        {
+            return unit().toMillis(quantity());
+        }
+
+        /**
+         * @return this duration in number of seconds
+         */
+        public long toSeconds()
+        {
+            return unit().toSeconds(quantity());
+        }
+    }
+
+    /**
+     * Represents a duration used for Cassandra configuration. The bound is [0, Integer.MAX_VALUE) in minutes.
+     * If the user sets a different unit - we still validate that converted to minutes the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class IntMinutesBound extends DurationSpec
+    {
+        /**
+         * Creates a {@code DurationSpec.IntMinutesBound} of the specified amount. The bound is [0, Integer.MAX_VALUE) in minutes.
+         * The bound is [0, Integer.MAX_VALUE) in minutes.
+         *
+         * @param value the duration
+         */
+        public IntMinutesBound(String value)
+        {
+            super(value, MINUTES, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.IntMinutesBound} of the specified amount in the specified unit.
+         * The bound is [0, Integer.MAX_VALUE) in minutes.
+         *
+         * @param quantity where quantity shouldn't be bigger than Integer.MAX_VALUE - 1 in minutes
+         * @param unit in which the provided quantity is
+         */
+        public IntMinutesBound(long quantity, TimeUnit unit)
+        {
+            super(quantity, unit, MINUTES, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.IntMinutesBound} of the specified amount in minutes.
+         * The bound is [0, Integer.MAX_VALUE) in minutes.
+         *
+         * @param minutes where minutes shouldn't be bigger than Integer.MAX_VALUE-1
+         */
+        public IntMinutesBound(long minutes)
+        {
+            this(minutes, MINUTES);
+        }
+
+        /**
+         * Returns this duration in number of milliseconds as an {@code int}
+         *
+         * @return this duration in number of milliseconds or {@code Integer.MAX_VALUE} if the number of milliseconds is too large.
+         */
+        public int toMilliseconds()
+        {
+            return Ints.saturatedCast(unit().toMillis(quantity()));
+        }
+
+        /**
+         * Returns this duration in number of seconds as an {@code int}
+         *
+         * @return this duration in number of seconds or {@code Integer.MAX_VALUE} if the number of seconds is too large.
+         */
+        public int toSeconds()
+        {
+            return Ints.saturatedCast(unit().toSeconds(quantity()));
+        }
+
+        /**
+         * Returns this duration in number of minutes as an {@code int}
+         *
+         * @return this duration in number of minutes or {@code Integer.MAX_VALUE} if the number of minutes is too large.
+         */
+        public int toMinutes()
+        {
+            return Ints.saturatedCast(unit().toMinutes(quantity()));
+        }
+    }
+
+    /**
+     * Represents a duration used for Cassandra configuration. The bound is [0, Integer.MAX_VALUE) in seconds.
+     * If the user sets a different unit - we still validate that converted to seconds the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class IntSecondsBound extends DurationSpec
+    {
+        private static final Pattern VALUES_PATTERN = Pattern.compile(("\\d+"));
+
+        /**
+         * Creates a {@code DurationSpec.IntSecondsBound} of the specified amount. The bound is [0, Integer.MAX_VALUE) in seconds.
+         * The bound is [0, Integer.MAX_VALUE) in seconds.
+         *
+         * @param value the duration
+         */
+        public IntSecondsBound(String value)
+        {
+            super(value, SECONDS, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.IntSecondsBound} of the specified amount in the specified unit.
+         * The bound is [0, Integer.MAX_VALUE) in seconds.
+         *
+         * @param quantity where quantity shouldn't be bigger than Integer.MAX_VALUE - 1 in seconds
+         * @param unit in which the provided quantity is
+         */
+        public IntSecondsBound(long quantity, TimeUnit unit)
+        {
+            super(quantity, unit, SECONDS, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.IntSecondsBound} of the specified amount in seconds.
+         * The bound is [0, Integer.MAX_VALUE) in seconds.
+         *
+         * @param seconds where seconds shouldn't be bigger than Integer.MAX_VALUE-1
+         */
+        public IntSecondsBound(long seconds)
+        {
+            this(seconds, SECONDS);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.IntSecondsBound} of the specified amount in seconds, expressed either as the
+         * number of seconds without unit, or as a regular quantity with unit.
+         * Used in the Converters for a few parameters which changed only type, but not names
+         * The bound is [0, Integer.MAX_VALUE) in seconds.
+         *
+         * @param value where value shouldn't be bigger than Integer.MAX_VALUE-1 in seconds
+         */
+        public static IntSecondsBound inSecondsString(String value)
+        {
+            //parse the string field value
+            Matcher matcher = VALUES_PATTERN.matcher(value);
+
+            long seconds;
+            //if the provided string value is just a number, then we create a IntSecondsBound value in seconds
+            if (matcher.matches())
+            {
+                seconds = Integer.parseInt(value);
+                return new IntSecondsBound(seconds, TimeUnit.SECONDS);
+            }
+
+            //otherwise we just use the standard constructors
+            return new IntSecondsBound(value);
+        }
+
+        /**
+         * Returns this duration in the number of nanoseconds as an {@code int}
+         *
+         * @return this duration in number of nanoseconds or {@code Integer.MAX_VALUE} if the number of nanoseconds is too large.
+         */
+        public int toNanoseconds()
+        {
+            return Ints.saturatedCast(unit().toNanos(quantity()));
+        }
+
+        /**
+         * Returns this duration in number of milliseconds as an {@code int}
+         *
+         * @return this duration in number of milliseconds or {@code Integer.MAX_VALUE} if the number of milliseconds is too large.
+         */
+        public int toMilliseconds()
+        {
+            return Ints.saturatedCast(unit().toMillis(quantity()));
+        }
+
+        /**
+         * Returns this duration in number of seconds as an {@code int}
+         *
+         * @return this duration in number of seconds or {@code Integer.MAX_VALUE} if the number of seconds is too large.
+         */
+        public int toSeconds()
+        {
+            return Ints.saturatedCast(unit().toSeconds(quantity()));
+        }
+    }
+
+    /**
+     * Represents a duration used for Cassandra configuration. The bound is [0, Integer.MAX_VALUE) in milliseconds.
+     * If the user sets a different unit - we still validate that converted to milliseconds the quantity will not exceed
+     * that upper bound. (CASSANDRA-17571)
+     */
+    public final static class IntMillisecondsBound extends DurationSpec
+    {
+        /**
+         * Creates a {@code DurationSpec.IntMillisecondsBound} of the specified amount. The bound is [0, Integer.MAX_VALUE) in milliseconds.
+         * The bound is [0, Integer.MAX_VALUE) in milliseconds.
+         *
+         * @param value the duration
+         */
+        public IntMillisecondsBound(String value)
+        {
+            super(value, MILLISECONDS, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.IntMillisecondsBound} of the specified amount in the specified unit.
+         * The bound is [0, Integer.MAX_VALUE) in milliseconds.
+         *
+         * @param quantity where quantity shouldn't be bigger than Integer.MAX_VALUE - 1 in milliseconds
+         * @param unit in which the provided quantity is
+         */
+        public IntMillisecondsBound(long quantity, TimeUnit unit)
+        {
+            super(quantity, unit, MILLISECONDS, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Creates a {@code DurationSpec.IntMillisecondsBound} of the specified amount in milliseconds.
+         * The bound is [0, Integer.MAX_VALUE) in milliseconds.
+         *
+         * @param milliseconds where milliseconds shouldn't be bigger than Integer.MAX_VALUE-1
+         */
+        public IntMillisecondsBound(long milliseconds)
+        {
+            this(milliseconds, MILLISECONDS);
+        }
+
+        /**
+         * Below constructor is used only for backward compatibility for the old commitlog_sync_group_window_in_ms before 4.1
+         * Creates a {@code DurationSpec.IntMillisecondsBound} of the specified amount in the specified unit.
+         *
+         * @param quantity where quantity shouldn't be bigger than Intetger.MAX_VALUE - 1 in milliseconds
+         * @param unit in which the provided quantity is
+         */
+        public IntMillisecondsBound(double quantity, TimeUnit unit)
+        {
+            super(quantity, unit, MILLISECONDS, Integer.MAX_VALUE);
+        }
+
+        /**
+         * Returns this duration in number of milliseconds as an {@code int}
+         *
+         * @return this duration in number of milliseconds or {@code Integer.MAX_VALUE} if the number of milliseconds is too large.
+         */
+        public int toMilliseconds()
+        {
+            return Ints.saturatedCast(unit().toMillis(quantity()));
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/EncryptionOptions.java b/src/java/org/apache/cassandra/config/EncryptionOptions.java
index 93668d9..2610ff6 100644
--- a/src/java/org/apache/cassandra/config/EncryptionOptions.java
+++ b/src/java/org/apache/cassandra/config/EncryptionOptions.java
@@ -17,9 +17,15 @@
  */
 package org.apache.cassandra.config;
 
-import java.io.File;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
 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;
 import com.google.common.collect.ImmutableList;
@@ -27,17 +33,27 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.fasterxml.jackson.annotation.JsonIgnore;
 import org.apache.cassandra.locator.IEndpointSnitch;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.security.SSLFactory;
+import org.apache.cassandra.security.DisableSslContextFactory;
+import org.apache.cassandra.security.ISslContextFactory;
+import org.apache.cassandra.utils.FBUtilities;
 
+/**
+ * This holds various options used for enabling SSL/TLS encryption.
+ * Examples of such options are: supported cipher-suites, ssl protocol with version, accepted protocols, end-point
+ * verification, require client-auth/cert etc.
+ */
 public class EncryptionOptions
 {
     Logger logger = LoggerFactory.getLogger(EncryptionOptions.class);
 
     public enum TlsEncryptionPolicy
     {
-        UNENCRYPTED("unencrypted"), OPTIONAL("optionally encrypted"), ENCRYPTED("encrypted");
+        UNENCRYPTED("unencrypted"),
+        OPTIONAL("optionally encrypted"),
+        ENCRYPTED("encrypted");
 
         private final String description;
 
@@ -52,9 +68,17 @@
         }
     }
 
+    /*
+     * If the ssl_context_factory is configured, most likely it won't use file based keystores and truststores and
+     * can choose to completely customize SSL context's creation. Most likely it won't also use keystore_password and
+     * truststore_passwords configurations as they are in plaintext format.
+     */
+    public final ParameterizedClass ssl_context_factory;
     public final String keystore;
+    @Nullable
     public final String keystore_password;
     public final String truststore;
+    @Nullable
     public final String truststore_password;
     public final List<String> cipher_suites;
     protected String protocol;
@@ -73,15 +97,62 @@
     protected Boolean optional;
 
     // Calculated by calling applyConfig() after populating/parsing
-    protected Boolean isEnabled = null;
-    protected Boolean isOptional = null;
+    protected Boolean isEnabled;
+    protected Boolean isOptional;
+
+    /*
+     * We will wait to initialize this until applyConfig() call to make sure we do it only when the caller is ready
+     * to use this option instance.
+     */
+    public transient ISslContextFactory sslContextFactoryInstance;
+
+    public enum ConfigKey
+    {
+        KEYSTORE("keystore"),
+        KEYSTORE_PASSWORD("keystore_password"),
+        TRUSTSTORE("truststore"),
+        TRUSTSTORE_PASSWORD("truststore_password"),
+        CIPHER_SUITES("cipher_suites"),
+        PROTOCOL("protocol"),
+        ACCEPTED_PROTOCOLS("accepted_protocols"),
+        ALGORITHM("algorithm"),
+        STORE_TYPE("store_type"),
+        REQUIRE_CLIENT_AUTH("require_client_auth"),
+        REQUIRE_ENDPOINT_VERIFICATION("require_endpoint_verification"),
+        ENABLED("enabled"),
+        OPTIONAL("optional");
+
+        final String keyName;
+
+        ConfigKey(String keyName)
+        {
+            this.keyName=keyName;
+        }
+
+        String getKeyName()
+        {
+            return keyName;
+        }
+
+        static Set<String> asSet()
+        {
+            Set<String> valueSet = new HashSet<>();
+            ConfigKey[] values = values();
+            for(ConfigKey key: values) {
+                valueSet.add(key.getKeyName().toLowerCase());
+            }
+            return valueSet;
+        }
+    }
 
     public EncryptionOptions()
     {
+        ssl_context_factory = new ParameterizedClass("org.apache.cassandra.security.DefaultSslContextFactory",
+                                                     new HashMap<>());
         keystore = "conf/.keystore";
-        keystore_password = "cassandra";
+        keystore_password = null;
         truststore = "conf/.truststore";
-        truststore_password = "cassandra";
+        truststore_password = null;
         cipher_suites = null;
         protocol = null;
         accepted_protocols = null;
@@ -93,8 +164,13 @@
         optional = null;
     }
 
-    public EncryptionOptions(String keystore, String keystore_password, String truststore, String truststore_password, List<String> cipher_suites, String protocol, List<String> accepted_protocols, String algorithm, String store_type, boolean require_client_auth, boolean require_endpoint_verification, Boolean enabled, Boolean optional)
+    public EncryptionOptions(ParameterizedClass ssl_context_factory, String keystore, String keystore_password,
+                             String truststore, String truststore_password, List<String> cipher_suites,
+                             String protocol, List<String> accepted_protocols, String algorithm, String store_type,
+                             boolean require_client_auth, boolean require_endpoint_verification, Boolean enabled,
+                             Boolean optional)
     {
+        this.ssl_context_factory = ssl_context_factory;
         this.keystore = keystore;
         this.keystore_password = keystore_password;
         this.truststore = truststore;
@@ -112,6 +188,7 @@
 
     public EncryptionOptions(EncryptionOptions options)
     {
+        ssl_context_factory = options.ssl_context_factory;
         keystore = options.keystore;
         keystore_password = options.keystore_password;
         truststore = options.truststore;
@@ -130,11 +207,15 @@
     /* Computes enabled and optional before use. Because the configuration can be loaded
      * through pluggable mechanisms this is the only safe way to make sure that
      * enabled and optional are set correctly.
+     *
+     * It also initializes the ISslContextFactory's instance
      */
     public EncryptionOptions applyConfig()
     {
         ensureConfigNotApplied();
 
+        initializeSslContextFactory();
+
         isEnabled = this.enabled != null && enabled;
 
         if (optional != null)
@@ -144,7 +225,7 @@
         // If someone is asking for an _insecure_ connection and not explicitly telling us to refuse
         // encrypted connections AND they have a keystore file, we assume they would like to be able
         // to transition to encrypted connections in the future.
-        else if (new File(keystore).exists())
+        else if (sslContextFactoryInstance.hasKeystore())
         {
             isOptional = !isEnabled;
         }
@@ -156,6 +237,72 @@
         return this;
     }
 
+    /**
+     * Prepares the parameterized keys provided in the configuration for {@link ISslContextFactory} to be passed in
+     * as the constructor for its implementation.
+     *
+     * @throws IllegalArgumentException in case any pre-defined key, as per {@link ConfigKey}, for the encryption
+     * options is duplicated in the parameterized keys.
+     */
+    private void prepareSslContextFactoryParameterizedKeys(Map<String,Object> sslContextFactoryParameters)
+    {
+        if (ssl_context_factory.parameters != null)
+        {
+            Set<String> configKeys = ConfigKey.asSet();
+            for (Map.Entry<String, String> entry : ssl_context_factory.parameters.entrySet())
+            {
+                if(configKeys.contains(entry.getKey().toLowerCase()))
+                {
+                    throw new IllegalArgumentException("SslContextFactory "+ssl_context_factory.class_name+" should " +
+                                                       "configure '"+entry.getKey()+"' as encryption_options instead of" +
+                                                       " parameterized keys");
+                }
+                sslContextFactoryParameters.put(entry.getKey(),entry.getValue());
+            }
+        }
+    }
+
+    private void initializeSslContextFactory()
+    {
+        Map<String,Object> sslContextFactoryParameters = new HashMap<>();
+        prepareSslContextFactoryParameterizedKeys(sslContextFactoryParameters);
+
+        /*
+         * Copy all configs to the Map to pass it on to the ISslContextFactory's implementation
+         */
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.KEYSTORE, this.keystore);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.KEYSTORE_PASSWORD, this.keystore_password);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.TRUSTSTORE, this.truststore);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.TRUSTSTORE_PASSWORD, this.truststore_password);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.CIPHER_SUITES, this.cipher_suites);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.PROTOCOL, this.protocol);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.ACCEPTED_PROTOCOLS, this.accepted_protocols);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.ALGORITHM, this.algorithm);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.STORE_TYPE, this.store_type);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.REQUIRE_CLIENT_AUTH, this.require_client_auth);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.REQUIRE_ENDPOINT_VERIFICATION, this.require_endpoint_verification);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.ENABLED, this.enabled);
+        putSslContextFactoryParameter(sslContextFactoryParameters, ConfigKey.OPTIONAL, this.optional);
+
+        if (CassandraRelevantProperties.TEST_JVM_DTEST_DISABLE_SSL.getBoolean())
+        {
+            sslContextFactoryInstance = new DisableSslContextFactory();
+        }
+        else
+        {
+            sslContextFactoryInstance = FBUtilities.newSslContextFactory(ssl_context_factory.class_name,
+                                                                         sslContextFactoryParameters);
+        }
+    }
+
+    private void putSslContextFactoryParameter(Map<String,Object> existingParameters, ConfigKey configKey,
+                                               Object value)
+    {
+        if (value != null) {
+            existingParameters.put(configKey.getKeyName(), value);
+        }
+    }
+
     private void ensureConfigApplied()
     {
         if (isEnabled == null || isOptional == null)
@@ -173,7 +320,8 @@
      *
      * @return if the channel should be encrypted
      */
-    public Boolean isEnabled() {
+    public Boolean getEnabled()
+    {
         ensureConfigApplied();
         return isEnabled;
     }
@@ -184,7 +332,8 @@
      * is probably a bad idea.
      * @param enabled value to set
      */
-    public void setEnabled(Boolean enabled) {
+    public void setEnabled(Boolean enabled)
+    {
         ensureConfigNotApplied();
         this.enabled = enabled;
     }
@@ -198,7 +347,7 @@
      * Return type is Boolean even though it can never be null so that snakeyaml can find it
      * @return if the channel may be encrypted
      */
-    public Boolean isOptional()
+    public Boolean getOptional()
     {
         ensureConfigApplied();
         return isOptional;
@@ -210,7 +359,8 @@
      * is probably a bad idea.
      * @param optional value to set
      */
-    public void setOptional(boolean optional) {
+    public void setOptional(Boolean optional)
+    {
         ensureConfigNotApplied();
         this.optional = optional;
     }
@@ -222,82 +372,45 @@
      * @param protocol value to set
      */
     @VisibleForTesting
-    public void setProtocol(String protocol) {
+    public void setProtocol(String protocol)
+    {
         this.protocol = protocol;
     }
 
+    public String getProtocol()
+    {
+        return protocol;
+    }
+
     /**
      * Sets accepted TLS protocols for this channel. Note that this should only be called by
      * the configuration parser or tests. It is public only for that purpose, mutating protocol state
      * is probably a bad idea. The function casing is required for snakeyaml to find this setter for the protected field.
      * @param accepted_protocols value to set
      */
-    public void setaccepted_protocols(List<String> accepted_protocols) {
+    public void setAcceptedProtocols(List<String> accepted_protocols)
+    {
         this.accepted_protocols = accepted_protocols == null ? null : ImmutableList.copyOf(accepted_protocols);
     }
 
-    /* This list is substituted in configurations that have explicitly specified the original "TLS" default,
-     * by extracting it from the default "TLS" SSL Context instance
-     */
-    static private final List<String> TLS_PROTOCOL_SUBSTITUTION = SSLFactory.tlsInstanceProtocolSubstitution();
-
-    /**
-     * Combine the pre-4.0 protocol field with the accepted_protocols list, substituting a list of
-     * explicit protocols for the previous catchall default of "TLS"
-     * @return array of protocol names suitable for passing to SslContextBuilder.protocols, or null if the default
-     */
-    public List<String> acceptedProtocols()
+    public List<String> getAcceptedProtocols()
     {
-        if (accepted_protocols == null)
-        {
-            if (protocol == null)
-            {
-                return null;
-            }
-            // TLS is accepted by SSLContext.getInstance as a shorthand for give me an engine that
-            // can speak some of the TLS protocols.  It is not supported by SSLEngine.setAcceptedProtocols
-            // so substitute if the user hasn't provided an accepted protocol configuration
-            else if (protocol.equalsIgnoreCase("TLS"))
-            {
-                return TLS_PROTOCOL_SUBSTITUTION;
-            }
-            else // the user was trying to limit to a single specific protocol, so try that
-            {
-                return ImmutableList.of(protocol);
-            }
-        }
-
-        if (protocol != null && !protocol.equalsIgnoreCase("TLS") &&
-            accepted_protocols.stream().noneMatch(ap -> ap.equalsIgnoreCase(protocol)))
-        {
-            // If the user provided a non-generic default protocol, append it to accepted_protocols - they wanted
-            // it after all.
-            return ImmutableList.<String>builder().addAll(accepted_protocols).add(protocol).build();
-        }
-        else
-        {
-            return accepted_protocols;
-        }
+        return sslContextFactoryInstance == null ? null : sslContextFactoryInstance.getAcceptedProtocols();
     }
 
     public String[] acceptedProtocolsArray()
     {
-        List<String> ap = acceptedProtocols();
+        List<String> ap = getAcceptedProtocols();
         return ap == null ?  new String[0] : ap.toArray(new String[0]);
     }
 
-    public String[] cipherSuitesArray()
-    {
-        return cipher_suites == null ? new String[0] : cipher_suites.toArray(new String[0]);
-    }
-
     public TlsEncryptionPolicy tlsEncryptionPolicy()
     {
-        if (isOptional())
+        if (getOptional())
         {
             return TlsEncryptionPolicy.OPTIONAL;
         }
-        else if (isEnabled())
+        else if (getEnabled())
         {
             return TlsEncryptionPolicy.ENCRYPTED;
         }
@@ -307,104 +420,127 @@
         }
     }
 
+    public EncryptionOptions withSslContextFactory(ParameterizedClass sslContextFactoryClass)
+    {
+        return new EncryptionOptions(sslContextFactoryClass, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites,protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification,enabled,
+                                     optional).applyConfig();
+    }
+
     public EncryptionOptions withKeyStore(String keystore)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites,protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withKeyStorePassword(String keystore_password)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites,protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withTrustStore(String truststore)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withTrustStorePassword(String truststore_password)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withCipherSuites(List<String> cipher_suites)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withCipherSuites(String ... cipher_suites)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, ImmutableList.copyOf(cipher_suites),
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, ImmutableList.copyOf(cipher_suites), protocol,
+                                     accepted_protocols, algorithm, store_type, require_client_auth,
+                                     require_endpoint_verification, enabled, optional).applyConfig();
     }
 
     public EncryptionOptions withProtocol(String protocol)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
 
     public EncryptionOptions withAcceptedProtocols(List<String> accepted_protocols)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites, protocol,
-                                     accepted_protocols == null ? null : ImmutableList.copyOf(accepted_protocols),
-                                     algorithm, store_type, require_client_auth, require_endpoint_verification, enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites,protocol, accepted_protocols == null ? null :
+                                                                                  ImmutableList.copyOf(accepted_protocols),
+                                     algorithm, store_type, require_client_auth, require_endpoint_verification,
+                                     enabled, optional).applyConfig();
     }
 
 
     public EncryptionOptions withAlgorithm(String algorithm)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withStoreType(String store_type)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withRequireClientAuth(boolean require_client_auth)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withRequireEndpointVerification(boolean require_endpoint_verification)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withEnabled(boolean enabled)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     public EncryptionOptions withOptional(Boolean optional)
     {
-        return new EncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                           protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                           enabled, optional).applyConfig();
+        return new EncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                     truststore_password, cipher_suites, protocol, accepted_protocols, algorithm,
+                                     store_type, require_client_auth, require_endpoint_verification, enabled,
+                                     optional).applyConfig();
     }
 
     /**
@@ -432,7 +568,8 @@
                Objects.equals(accepted_protocols, opt.accepted_protocols) &&
                Objects.equals(algorithm, opt.algorithm) &&
                Objects.equals(store_type, opt.store_type) &&
-               Objects.equals(cipher_suites, opt.cipher_suites);
+               Objects.equals(cipher_suites, opt.cipher_suites) &&
+               Objects.equals(ssl_context_factory, opt.ssl_context_factory);
     }
 
     /**
@@ -456,6 +593,7 @@
         result += 31 * (cipher_suites == null ? 0 : cipher_suites.hashCode());
         result += 31 * Boolean.hashCode(require_client_auth);
         result += 31 * Boolean.hashCode(require_endpoint_verification);
+        result += 31 * (ssl_context_factory == null ? 0 : ssl_context_factory.hashCode());
         return result;
     }
 
@@ -467,33 +605,34 @@
         }
 
         public final InternodeEncryption internode_encryption;
-        public final boolean enable_legacy_ssl_storage_port;
+        @Replaces(oldName = "enable_legacy_ssl_storage_port", deprecated = true)
+        public final boolean legacy_ssl_storage_port_enabled;
 
         public ServerEncryptionOptions()
         {
             this.internode_encryption = InternodeEncryption.none;
-            this.enable_legacy_ssl_storage_port = false;
+            this.legacy_ssl_storage_port_enabled = false;
         }
 
-        public ServerEncryptionOptions(String keystore, String keystore_password, String truststore,
-                                       String truststore_password, List<String> cipher_suites, String protocol,
-                                       List<String> accepted_protocols, String algorithm, String store_type,
-                                       boolean require_client_auth, boolean require_endpoint_verification,
-                                       Boolean optional, InternodeEncryption internode_encryption,
-                                       boolean enable_legacy_ssl_storage_port)
+        public ServerEncryptionOptions(ParameterizedClass sslContextFactoryClass, String keystore,
+                                       String keystore_password, String truststore, String truststore_password,
+                                       List<String> cipher_suites, String protocol, List<String> accepted_protocols,
+                                       String algorithm, String store_type, boolean require_client_auth,
+                                       boolean require_endpoint_verification, Boolean optional,
+                                       InternodeEncryption internode_encryption, boolean legacy_ssl_storage_port_enabled)
         {
-            super(keystore, keystore_password, truststore, truststore_password, cipher_suites, protocol,
-                  accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                  null, optional);
+            super(sslContextFactoryClass, keystore, keystore_password, truststore, truststore_password, cipher_suites,
+            protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
+            null, optional);
             this.internode_encryption = internode_encryption;
-            this.enable_legacy_ssl_storage_port = enable_legacy_ssl_storage_port;
+            this.legacy_ssl_storage_port_enabled = legacy_ssl_storage_port_enabled;
         }
 
         public ServerEncryptionOptions(ServerEncryptionOptions options)
         {
             super(options);
             this.internode_encryption = options.internode_encryption;
-            this.enable_legacy_ssl_storage_port = options.enable_legacy_ssl_storage_port;
+            this.legacy_ssl_storage_port_enabled = options.legacy_ssl_storage_port_enabled;
         }
 
         @Override
@@ -557,115 +696,154 @@
          * values of "dc" and "all". This method returns the explicit, raw value of {@link #optional}
          * as set by the user (if set at all).
          */
+        @JsonIgnore
         public boolean isExplicitlyOptional()
         {
             return optional != null && optional;
         }
 
+        public ServerEncryptionOptions withSslContextFactory(ParameterizedClass sslContextFactoryClass)
+        {
+            return new ServerEncryptionOptions(sslContextFactoryClass, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
+        }
+
         public ServerEncryptionOptions withKeyStore(String keystore)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withKeyStorePassword(String keystore_password)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withTrustStore(String truststore)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withTrustStorePassword(String truststore_password)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withCipherSuites(List<String> cipher_suites)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withCipherSuites(String ... cipher_suites)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, ImmutableList.copyOf(cipher_suites),
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, Arrays.asList(cipher_suites), protocol,
+                                               accepted_protocols, algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withProtocol(String protocol)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withAcceptedProtocols(List<String> accepted_protocols)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols == null ? null : ImmutableList.copyOf(accepted_protocols),
-                                               algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withAlgorithm(String algorithm)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withStoreType(String store_type)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withRequireClientAuth(boolean require_client_auth)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withRequireEndpointVerification(boolean require_endpoint_verification)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withOptional(boolean optional)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withInternodeEncryption(InternodeEncryption internode_encryption)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               legacy_ssl_storage_port_enabled).applyConfigInternal();
         }
 
         public ServerEncryptionOptions withLegacySslStoragePort(boolean enable_legacy_ssl_storage_port)
         {
-            return new ServerEncryptionOptions(keystore, keystore_password, truststore, truststore_password, cipher_suites,
-                                               protocol, accepted_protocols, algorithm, store_type, require_client_auth, require_endpoint_verification,
-                                               optional, internode_encryption, enable_legacy_ssl_storage_port).applyConfigInternal();
+            return new ServerEncryptionOptions(ssl_context_factory, keystore, keystore_password, truststore,
+                                               truststore_password, cipher_suites, protocol, accepted_protocols,
+                                               algorithm, store_type, require_client_auth,
+                                               require_endpoint_verification, optional, internode_encryption,
+                                               enable_legacy_ssl_storage_port).applyConfigInternal();
         }
 
     }
diff --git a/src/java/org/apache/cassandra/config/ForwardingProperty.java b/src/java/org/apache/cassandra/config/ForwardingProperty.java
new file mode 100644
index 0000000..5e7840e
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/ForwardingProperty.java
@@ -0,0 +1,92 @@
+/*
+ * 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.config;
+
+import java.lang.annotation.Annotation;
+import java.util.List;
+
+import org.yaml.snakeyaml.introspector.Property;
+
+/**
+ * This class delegates all calls of {@link Property} to a {@link #delegate()}, used for cases where a small number of
+ * methods want to be overriden from the delegate.
+ *
+ * This class acts as a decorator to a {@link Property} and allows decorating any method.
+ */
+public class ForwardingProperty extends Property
+{
+    private final Property delegate;
+
+    public ForwardingProperty(String name, Property property)
+    {
+        this(name, property.getType(), property);
+    }
+
+    public ForwardingProperty(String name, Class<?> type, Property property)
+    {
+        super(name, type);
+        this.delegate = property;
+    }
+
+    protected Property delegate()
+    {
+        return delegate;
+    }
+
+    @Override
+    public boolean isWritable()
+    {
+        return delegate().isWritable();
+    }
+
+    @Override
+    public boolean isReadable()
+    {
+        return delegate().isReadable();
+    }
+
+    @Override
+    public Class<?>[] getActualTypeArguments()
+    {
+        return delegate().getActualTypeArguments();
+    }
+
+    @Override
+    public void set(Object o, Object o1) throws Exception
+    {
+        delegate().set(o, o1);
+    }
+
+    @Override
+    public Object get(Object o)
+    {
+        return delegate().get(o);
+    }
+
+    @Override
+    public List<Annotation> getAnnotations()
+    {
+        return delegate().getAnnotations();
+    }
+
+    @Override
+    public <A extends Annotation> A getAnnotation(Class<A> aClass)
+    {
+        return delegate().getAnnotation(aClass);
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/GuardrailsOptions.java b/src/java/org/apache/cassandra/config/GuardrailsOptions.java
new file mode 100644
index 0000000..e4694b9
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/GuardrailsOptions.java
@@ -0,0 +1,793 @@
+/*
+ * 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.config;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+import javax.annotation.Nullable;
+
+import com.google.common.collect.Sets;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.cql3.statements.schema.TableAttributes;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.guardrails.Guardrails;
+import org.apache.cassandra.db.guardrails.GuardrailsConfig;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.service.disk.usage.DiskUsageMonitor;
+
+import static java.lang.String.format;
+import static java.util.stream.Collectors.toSet;
+
+/**
+ * Configuration settings for guardrails populated from the Yaml file.
+ *
+ * <p>Note that the settings here must only be used to build the {@link GuardrailsConfig} class and not directly by the
+ * code checking each guarded constraint. That code should use the higher level abstractions defined in
+ * {@link Guardrails}).
+ *
+ * <p>We have 2 variants of guardrails, soft (warn) and hard (fail) limits, each guardrail having either one of the
+ * variants or both. Note in particular that hard limits only make sense for guardrails triggering during query
+ * execution. For other guardrails, say one triggering during compaction, aborting that compaction does not make sense.
+ *
+ * <p>Additionally, each individual setting should have a specific value (typically -1 for numeric settings),
+ * that allows to disable the corresponding guardrail.
+ */
+public class GuardrailsOptions implements GuardrailsConfig
+{
+    private static final Logger logger = LoggerFactory.getLogger(GuardrailsOptions.class);
+
+    private final Config config;
+
+    public GuardrailsOptions(Config config)
+    {
+        this.config = config;
+        validateMaxIntThreshold(config.keyspaces_warn_threshold, config.keyspaces_fail_threshold, "keyspaces");
+        validateMaxIntThreshold(config.tables_warn_threshold, config.tables_fail_threshold, "tables");
+        validateMaxIntThreshold(config.columns_per_table_warn_threshold, config.columns_per_table_fail_threshold, "columns_per_table");
+        validateMaxIntThreshold(config.secondary_indexes_per_table_warn_threshold, config.secondary_indexes_per_table_fail_threshold, "secondary_indexes_per_table");
+        validateMaxIntThreshold(config.materialized_views_per_table_warn_threshold, config.materialized_views_per_table_fail_threshold, "materialized_views_per_table");
+        config.table_properties_warned = validateTableProperties(config.table_properties_warned, "table_properties_warned");
+        config.table_properties_ignored = validateTableProperties(config.table_properties_ignored, "table_properties_ignored");
+        config.table_properties_disallowed = validateTableProperties(config.table_properties_disallowed, "table_properties_disallowed");
+        validateMaxIntThreshold(config.page_size_warn_threshold, config.page_size_fail_threshold, "page_size");
+        validateMaxIntThreshold(config.partition_keys_in_select_warn_threshold, config.partition_keys_in_select_fail_threshold, "partition_keys_in_select");
+        validateMaxIntThreshold(config.in_select_cartesian_product_warn_threshold, config.in_select_cartesian_product_fail_threshold, "in_select_cartesian_product");
+        config.read_consistency_levels_warned = validateConsistencyLevels(config.read_consistency_levels_warned, "read_consistency_levels_warned");
+        config.read_consistency_levels_disallowed = validateConsistencyLevels(config.read_consistency_levels_disallowed, "read_consistency_levels_disallowed");
+        config.write_consistency_levels_warned = validateConsistencyLevels(config.write_consistency_levels_warned, "write_consistency_levels_warned");
+        config.write_consistency_levels_disallowed = validateConsistencyLevels(config.write_consistency_levels_disallowed, "write_consistency_levels_disallowed");
+        validateSizeThreshold(config.collection_size_warn_threshold, config.collection_size_fail_threshold, false, "collection_size");
+        validateMaxIntThreshold(config.items_per_collection_warn_threshold, config.items_per_collection_fail_threshold, "items_per_collection");
+        validateMaxIntThreshold(config.fields_per_udt_warn_threshold, config.fields_per_udt_fail_threshold, "fields_per_udt");
+        validatePercentageThreshold(config.data_disk_usage_percentage_warn_threshold, config.data_disk_usage_percentage_fail_threshold, "data_disk_usage_percentage");
+        validateDataDiskUsageMaxDiskSize(config.data_disk_usage_max_disk_size);
+        validateMinRFThreshold(config.minimum_replication_factor_warn_threshold, config.minimum_replication_factor_fail_threshold, "minimum_replication_factor");
+    }
+
+    @Override
+    public int getKeyspacesWarnThreshold()
+    {
+        return config.keyspaces_warn_threshold;
+    }
+
+    @Override
+    public int getKeyspacesFailThreshold()
+    {
+        return config.keyspaces_fail_threshold;
+    }
+
+    public void setKeyspacesThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "keyspaces");
+        updatePropertyWithLogging("keyspaces_warn_threshold",
+                                  warn,
+                                  () -> config.keyspaces_warn_threshold,
+                                  x -> config.keyspaces_warn_threshold = x);
+        updatePropertyWithLogging("keyspaces_fail_threshold",
+                                  fail,
+                                  () -> config.keyspaces_fail_threshold,
+                                  x -> config.keyspaces_fail_threshold = x);
+    }
+
+    @Override
+    public int getTablesWarnThreshold()
+    {
+        return config.tables_warn_threshold;
+    }
+
+    @Override
+    public int getTablesFailThreshold()
+    {
+        return config.tables_fail_threshold;
+    }
+
+    public void setTablesThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "tables");
+        updatePropertyWithLogging("tables_warn_threshold",
+                                  warn,
+                                  () -> config.tables_warn_threshold,
+                                  x -> config.tables_warn_threshold = x);
+        updatePropertyWithLogging("tables_fail_threshold",
+                                  fail,
+                                  () -> config.tables_fail_threshold,
+                                  x -> config.tables_fail_threshold = x);
+    }
+
+    @Override
+    public int getColumnsPerTableWarnThreshold()
+    {
+        return config.columns_per_table_warn_threshold;
+    }
+
+    @Override
+    public int getColumnsPerTableFailThreshold()
+    {
+        return config.columns_per_table_fail_threshold;
+    }
+
+    public void setColumnsPerTableThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "columns_per_table");
+        updatePropertyWithLogging("columns_per_table_warn_threshold",
+                                  warn,
+                                  () -> config.columns_per_table_warn_threshold,
+                                  x -> config.columns_per_table_warn_threshold = x);
+        updatePropertyWithLogging("columns_per_table_fail_threshold",
+                                  fail,
+                                  () -> config.columns_per_table_fail_threshold,
+                                  x -> config.columns_per_table_fail_threshold = x);
+    }
+
+    @Override
+    public int getSecondaryIndexesPerTableWarnThreshold()
+    {
+        return config.secondary_indexes_per_table_warn_threshold;
+    }
+
+    @Override
+    public int getSecondaryIndexesPerTableFailThreshold()
+    {
+        return config.secondary_indexes_per_table_fail_threshold;
+    }
+
+    public void setSecondaryIndexesPerTableThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "secondary_indexes_per_table");
+        updatePropertyWithLogging("secondary_indexes_per_table_warn_threshold",
+                                  warn,
+                                  () -> config.secondary_indexes_per_table_warn_threshold,
+                                  x -> config.secondary_indexes_per_table_warn_threshold = x);
+        updatePropertyWithLogging("secondary_indexes_per_table_fail_threshold",
+                                  fail,
+                                  () -> config.secondary_indexes_per_table_fail_threshold,
+                                  x -> config.secondary_indexes_per_table_fail_threshold = x);
+    }
+
+    @Override
+    public int getMaterializedViewsPerTableWarnThreshold()
+    {
+        return config.materialized_views_per_table_warn_threshold;
+    }
+
+    @Override
+    public int getPartitionKeysInSelectWarnThreshold()
+    {
+        return config.partition_keys_in_select_warn_threshold;
+    }
+
+    @Override
+    public int getPartitionKeysInSelectFailThreshold()
+    {
+        return config.partition_keys_in_select_fail_threshold;
+    }
+
+    public void setPartitionKeysInSelectThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "partition_keys_in_select");
+        updatePropertyWithLogging("partition_keys_in_select_warn_threshold",
+                                  warn,
+                                  () -> config.partition_keys_in_select_warn_threshold,
+                                  x -> config.partition_keys_in_select_warn_threshold = x);
+        updatePropertyWithLogging("partition_keys_in_select_fail_threshold",
+                                  fail,
+                                  () -> config.partition_keys_in_select_fail_threshold,
+                                  x -> config.partition_keys_in_select_fail_threshold = x);
+    }
+
+    @Override
+    public int getMaterializedViewsPerTableFailThreshold()
+    {
+        return config.materialized_views_per_table_fail_threshold;
+    }
+
+    public void setMaterializedViewsPerTableThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "materialized_views_per_table");
+        updatePropertyWithLogging("materialized_views_per_table_warn_threshold",
+                                  warn,
+                                  () -> config.materialized_views_per_table_warn_threshold,
+                                  x -> config.materialized_views_per_table_warn_threshold = x);
+        updatePropertyWithLogging("materialized_views_per_table_fail_threshold",
+                                  fail,
+                                  () -> config.materialized_views_per_table_fail_threshold,
+                                  x -> config.materialized_views_per_table_fail_threshold = x);
+    }
+
+    @Override
+    public int getPageSizeWarnThreshold()
+    {
+        return config.page_size_warn_threshold;
+    }
+
+    @Override
+    public int getPageSizeFailThreshold()
+    {
+        return config.page_size_fail_threshold;
+    }
+
+    public void setPageSizeThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "page_size");
+        updatePropertyWithLogging("page_size_warn_threshold",
+                                  warn,
+                                  () -> config.page_size_warn_threshold,
+                                  x -> config.page_size_warn_threshold = x);
+        updatePropertyWithLogging("page_size_fail_threshold",
+                                  fail,
+                                  () -> config.page_size_fail_threshold,
+                                  x -> config.page_size_fail_threshold = x);
+    }
+
+    @Override
+    public Set<String> getTablePropertiesWarned()
+    {
+        return config.table_properties_warned;
+    }
+
+    public void setTablePropertiesWarned(Set<String> properties)
+    {
+        updatePropertyWithLogging("table_properties_warned",
+                                  validateTableProperties(properties, "table_properties_warned"),
+                                  () -> config.table_properties_warned,
+                                  x -> config.table_properties_warned = x);
+    }
+
+    @Override
+    public Set<String> getTablePropertiesIgnored()
+    {
+        return config.table_properties_ignored;
+    }
+
+    public void setTablePropertiesIgnored(Set<String> properties)
+    {
+        updatePropertyWithLogging("table_properties_ignored",
+                                  validateTableProperties(properties, "table_properties_ignored"),
+                                  () -> config.table_properties_ignored,
+                                  x -> config.table_properties_ignored = x);
+    }
+
+    @Override
+    public Set<String> getTablePropertiesDisallowed()
+    {
+        return config.table_properties_disallowed;
+    }
+
+    public void setTablePropertiesDisallowed(Set<String> properties)
+    {
+        updatePropertyWithLogging("table_properties_disallowed",
+                                  validateTableProperties(properties, "table_properties_disallowed"),
+                                  () -> config.table_properties_disallowed,
+                                  x -> config.table_properties_disallowed = x);
+    }
+
+    @Override
+    public boolean getUserTimestampsEnabled()
+    {
+        return config.user_timestamps_enabled;
+    }
+
+    public void setUserTimestampsEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("user_timestamps_enabled",
+                                  enabled,
+                                  () -> config.user_timestamps_enabled,
+                                  x -> config.user_timestamps_enabled = x);
+    }
+
+    @Override
+    public boolean getGroupByEnabled()
+    {
+        return config.group_by_enabled;
+    }
+
+    public void setGroupByEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("group_by_enabled",
+                                  enabled,
+                                  () -> config.group_by_enabled,
+                                  x -> config.group_by_enabled = x);
+    }
+
+    @Override
+    public boolean getDropTruncateTableEnabled()
+    {
+        return config.drop_truncate_table_enabled;
+    }
+
+    public void setDropTruncateTableEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("drop_truncate_table_enabled",
+                                  enabled,
+                                  () -> config.drop_truncate_table_enabled,
+                                  x -> config.drop_truncate_table_enabled = x);
+    }
+
+    @Override
+    public boolean getSecondaryIndexesEnabled()
+    {
+        return config.secondary_indexes_enabled;
+    }
+
+    public void setSecondaryIndexesEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("secondary_indexes_enabled",
+                                  enabled,
+                                  () -> config.secondary_indexes_enabled,
+                                  x -> config.secondary_indexes_enabled = x);
+    }
+
+    @Override
+    public boolean getUncompressedTablesEnabled()
+    {
+        return config.uncompressed_tables_enabled;
+    }
+
+    public void setUncompressedTablesEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("uncompressed_tables_enabled",
+                                  enabled,
+                                  () -> config.uncompressed_tables_enabled,
+                                  x -> config.uncompressed_tables_enabled = x);
+    }
+
+    @Override
+    public boolean getCompactTablesEnabled()
+    {
+        return config.compact_tables_enabled;
+    }
+
+    public void setCompactTablesEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("compact_tables_enabled",
+                                  enabled,
+                                  () -> config.compact_tables_enabled,
+                                  x -> config.compact_tables_enabled = x);
+    }
+
+    @Override
+    public boolean getReadBeforeWriteListOperationsEnabled()
+    {
+        return config.read_before_write_list_operations_enabled;
+    }
+
+    public void setReadBeforeWriteListOperationsEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("read_before_write_list_operations_enabled",
+                                  enabled,
+                                  () -> config.read_before_write_list_operations_enabled,
+                                  x -> config.read_before_write_list_operations_enabled = x);
+    }
+
+    @Override
+    public boolean getAllowFilteringEnabled()
+    {
+        return config.allow_filtering_enabled;
+    }
+
+    public void setAllowFilteringEnabled(boolean enabled)
+    {
+        updatePropertyWithLogging("allow_filtering_enabled",
+                                  enabled,
+                                  () -> config.allow_filtering_enabled,
+                                  x -> config.allow_filtering_enabled = x);
+    }
+
+    @Override
+    public int getInSelectCartesianProductWarnThreshold()
+    {
+        return config.in_select_cartesian_product_warn_threshold;
+    }
+
+    @Override
+    public int getInSelectCartesianProductFailThreshold()
+    {
+        return config.in_select_cartesian_product_fail_threshold;
+    }
+
+    public void setInSelectCartesianProductThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "in_select_cartesian_product");
+        updatePropertyWithLogging("in_select_cartesian_product_warn_threshold",
+                                  warn,
+                                  () -> config.in_select_cartesian_product_warn_threshold,
+                                  x -> config.in_select_cartesian_product_warn_threshold = x);
+        updatePropertyWithLogging("in_select_cartesian_product_fail_threshold",
+                                  fail,
+                                  () -> config.in_select_cartesian_product_fail_threshold,
+                                  x -> config.in_select_cartesian_product_fail_threshold = x);
+    }
+
+    public Set<ConsistencyLevel> getReadConsistencyLevelsWarned()
+    {
+        return config.read_consistency_levels_warned;
+    }
+
+    public void setReadConsistencyLevelsWarned(Set<ConsistencyLevel> consistencyLevels)
+    {
+        updatePropertyWithLogging("read_consistency_levels_warned",
+                                  validateConsistencyLevels(consistencyLevels, "read_consistency_levels_warned"),
+                                  () -> config.read_consistency_levels_warned,
+                                  x -> config.read_consistency_levels_warned = x);
+    }
+
+    @Override
+    public Set<ConsistencyLevel> getReadConsistencyLevelsDisallowed()
+    {
+        return config.read_consistency_levels_disallowed;
+    }
+
+    public void setReadConsistencyLevelsDisallowed(Set<ConsistencyLevel> consistencyLevels)
+    {
+        updatePropertyWithLogging("read_consistency_levels_disallowed",
+                                  validateConsistencyLevels(consistencyLevels, "read_consistency_levels_disallowed"),
+                                  () -> config.read_consistency_levels_disallowed,
+                                  x -> config.read_consistency_levels_disallowed = x);
+    }
+
+    @Override
+    public Set<ConsistencyLevel> getWriteConsistencyLevelsWarned()
+    {
+        return config.write_consistency_levels_warned;
+    }
+
+    public void setWriteConsistencyLevelsWarned(Set<ConsistencyLevel> consistencyLevels)
+    {
+        updatePropertyWithLogging("write_consistency_levels_warned",
+                                  validateConsistencyLevels(consistencyLevels, "write_consistency_levels_warned"),
+                                  () -> config.write_consistency_levels_warned,
+                                  x -> config.write_consistency_levels_warned = x);
+    }
+
+    @Override
+    public Set<ConsistencyLevel> getWriteConsistencyLevelsDisallowed()
+    {
+        return config.write_consistency_levels_disallowed;
+    }
+
+    public void setWriteConsistencyLevelsDisallowed(Set<ConsistencyLevel> consistencyLevels)
+    {
+        updatePropertyWithLogging("write_consistency_levels_disallowed",
+                                  validateConsistencyLevels(consistencyLevels, "write_consistency_levels_disallowed"),
+                                  () -> config.write_consistency_levels_disallowed,
+                                  x -> config.write_consistency_levels_disallowed = x);
+    }
+
+    @Override
+    @Nullable
+    public DataStorageSpec.LongBytesBound getCollectionSizeWarnThreshold()
+    {
+        return config.collection_size_warn_threshold;
+    }
+
+    @Override
+    @Nullable
+    public DataStorageSpec.LongBytesBound getCollectionSizeFailThreshold()
+    {
+        return config.collection_size_fail_threshold;
+    }
+
+    public void setCollectionSizeThreshold(@Nullable DataStorageSpec.LongBytesBound warn, @Nullable DataStorageSpec.LongBytesBound fail)
+    {
+        validateSizeThreshold(warn, fail, false, "collection_size");
+        updatePropertyWithLogging("collection_size_warn_threshold",
+                                  warn,
+                                  () -> config.collection_size_warn_threshold,
+                                  x -> config.collection_size_warn_threshold = x);
+        updatePropertyWithLogging("collection_size_fail_threshold",
+                                  fail,
+                                  () -> config.collection_size_fail_threshold,
+                                  x -> config.collection_size_fail_threshold = x);
+    }
+
+    @Override
+    public int getItemsPerCollectionWarnThreshold()
+    {
+        return config.items_per_collection_warn_threshold;
+    }
+
+    @Override
+    public int getItemsPerCollectionFailThreshold()
+    {
+        return config.items_per_collection_fail_threshold;
+    }
+
+    public void setItemsPerCollectionThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "items_per_collection");
+        updatePropertyWithLogging("items_per_collection_warn_threshold",
+                                  warn,
+                                  () -> config.items_per_collection_warn_threshold,
+                                  x -> config.items_per_collection_warn_threshold = x);
+        updatePropertyWithLogging("items_per_collection_fail_threshold",
+                                  fail,
+                                  () -> config.items_per_collection_fail_threshold,
+                                  x -> config.items_per_collection_fail_threshold = x);
+    }
+
+    @Override
+    public int getFieldsPerUDTWarnThreshold()
+    {
+        return config.fields_per_udt_warn_threshold;
+    }
+
+    @Override
+    public int getFieldsPerUDTFailThreshold()
+    {
+        return config.fields_per_udt_fail_threshold;
+    }
+
+    public void setFieldsPerUDTThreshold(int warn, int fail)
+    {
+        validateMaxIntThreshold(warn, fail, "fields_per_udt");
+        updatePropertyWithLogging("fields_per_udt_warn_threshold",
+                                  warn,
+                                  () -> config.fields_per_udt_warn_threshold,
+                                  x -> config.fields_per_udt_warn_threshold = x);
+        updatePropertyWithLogging("fields_per_udt_fail_threshold",
+                                  fail,
+                                  () -> config.fields_per_udt_fail_threshold,
+                                  x -> config.fields_per_udt_fail_threshold = x);
+    }
+
+    public int getDataDiskUsagePercentageWarnThreshold()
+    {
+        return config.data_disk_usage_percentage_warn_threshold;
+    }
+
+    @Override
+    public int getDataDiskUsagePercentageFailThreshold()
+    {
+        return config.data_disk_usage_percentage_fail_threshold;
+    }
+
+    public void setDataDiskUsagePercentageThreshold(int warn, int fail)
+    {
+        validatePercentageThreshold(warn, fail, "data_disk_usage_percentage");
+        updatePropertyWithLogging("data_disk_usage_percentage_warn_threshold",
+                                  warn,
+                                  () -> config.data_disk_usage_percentage_warn_threshold,
+                                  x -> config.data_disk_usage_percentage_warn_threshold = x);
+        updatePropertyWithLogging("data_disk_usage_percentage_fail_threshold",
+                                  fail,
+                                  () -> config.data_disk_usage_percentage_fail_threshold,
+                                  x -> config.data_disk_usage_percentage_fail_threshold = x);
+    }
+
+    @Override
+    public DataStorageSpec.LongBytesBound getDataDiskUsageMaxDiskSize()
+    {
+        return config.data_disk_usage_max_disk_size;
+    }
+
+    public void setDataDiskUsageMaxDiskSize(@Nullable DataStorageSpec.LongBytesBound diskSize)
+    {
+        validateDataDiskUsageMaxDiskSize(diskSize);
+        updatePropertyWithLogging("data_disk_usage_max_disk_size",
+                                  diskSize,
+                                  () -> config.data_disk_usage_max_disk_size,
+                                  x -> config.data_disk_usage_max_disk_size = x);
+    }
+
+    @Override
+    public int getMinimumReplicationFactorWarnThreshold()
+    {
+        return config.minimum_replication_factor_warn_threshold;
+    }
+
+    @Override
+    public int getMinimumReplicationFactorFailThreshold()
+    {
+        return config.minimum_replication_factor_fail_threshold;
+    }
+
+    public void setMinimumReplicationFactorThreshold(int warn, int fail)
+    {
+        validateMinRFThreshold(warn, fail, "minimum_replication_factor");
+        updatePropertyWithLogging("minimum_replication_factor_warn_threshold",
+                                  warn,
+                                  () -> config.minimum_replication_factor_warn_threshold,
+                                  x -> config.minimum_replication_factor_warn_threshold = x);
+        updatePropertyWithLogging("minimum_replication_factor_fail_threshold",
+                                  fail,
+                                  () -> config.minimum_replication_factor_fail_threshold,
+                                  x -> config.minimum_replication_factor_fail_threshold = x);
+    }
+
+    private static <T> void updatePropertyWithLogging(String propertyName, T newValue, Supplier<T> getter, Consumer<T> setter)
+    {
+        T oldValue = getter.get();
+        if (newValue == null || !newValue.equals(oldValue))
+        {
+            setter.accept(newValue);
+            logger.info("Updated {} from {} to {}", propertyName, oldValue, newValue);
+        }
+    }
+
+    private static void validatePositiveNumeric(long value, long maxValue, String name)
+    {
+        if (value == -1)
+            return;
+
+        if (value > maxValue)
+            throw new IllegalArgumentException(format("Invalid value %d for %s: maximum allowed value is %d",
+                                                      value, name, maxValue));
+
+        if (value == 0)
+            throw new IllegalArgumentException(format("Invalid value for %s: 0 is not allowed; " +
+                                                      "if attempting to disable use -1", name));
+
+        // We allow -1 as a general "disabling" flag. But reject anything lower to avoid mistakes.
+        if (value <= 0)
+            throw new IllegalArgumentException(format("Invalid value %d for %s: negative values are not allowed, " +
+                                                      "outside of -1 which disables the guardrail", value, name));
+    }
+
+    private static void validatePercentage(long value, String name)
+    {
+        validatePositiveNumeric(value, 100, name);
+    }
+
+    private static void validatePercentageThreshold(int warn, int fail, String name)
+    {
+        validatePercentage(warn, name + "_warn_threshold");
+        validatePercentage(fail, name + "_fail_threshold");
+        validateWarnLowerThanFail(warn, fail, name);
+    }
+
+    private static void validateMaxIntThreshold(int warn, int fail, String name)
+    {
+        validatePositiveNumeric(warn, Integer.MAX_VALUE, name + "_warn_threshold");
+        validatePositiveNumeric(fail, Integer.MAX_VALUE, name + "_fail_threshold");
+        validateWarnLowerThanFail(warn, fail, name);
+    }
+
+    private static void validateMinIntThreshold(int warn, int fail, String name)
+    {
+        validatePositiveNumeric(warn, Integer.MAX_VALUE, name + "_warn_threshold");
+        validatePositiveNumeric(fail, Integer.MAX_VALUE, name + "_fail_threshold");
+        validateWarnGreaterThanFail(warn, fail, name);
+    }
+
+    private static void validateMinRFThreshold(int warn, int fail, String name)
+    {
+        validateMinIntThreshold(warn, fail, name);
+        validateMinRFVersusDefaultRF(fail, name);
+    }
+
+    private static void validateWarnLowerThanFail(long warn, long fail, String name)
+    {
+        if (warn == -1 || fail == -1)
+            return;
+
+        if (fail < warn)
+            throw new IllegalArgumentException(format("The warn threshold %d for %s_warn_threshold should be lower " +
+                                                      "than the fail threshold %d", warn, name, fail));
+    }
+
+    private static void validateWarnGreaterThanFail(long warn, long fail, String name)
+    {
+        if (warn == -1 || fail == -1)
+            return;
+
+        if (fail > warn)
+            throw new IllegalArgumentException(format("The warn threshold %d for %s_warn_threshold should be greater " +
+                                                      "than the fail threshold %d", warn, name, fail));
+    }
+
+    private static void validateMinRFVersusDefaultRF(int fail, String name) throws IllegalArgumentException
+    {
+        if (fail > DatabaseDescriptor.getDefaultKeyspaceRF())
+        {
+            throw new IllegalArgumentException(String.format("%s_fail_threshold to be set (%d) cannot be greater than default_keyspace_rf (%d)",
+                                                           name, fail, DatabaseDescriptor.getDefaultKeyspaceRF()));
+        }
+    }
+
+    private static void validateSize(DataStorageSpec.LongBytesBound size, boolean allowZero, String name)
+    {
+        if (size == null)
+            return;
+
+        if (!allowZero && size.toBytes() == 0)
+            throw new IllegalArgumentException(format("Invalid value for %s: 0 is not allowed; " +
+                                                      "if attempting to disable use an empty value",
+                                                      name));
+    }
+
+    private static void validateSizeThreshold(DataStorageSpec.LongBytesBound warn, DataStorageSpec.LongBytesBound fail, boolean allowZero, String name)
+    {
+        validateSize(warn, allowZero, name + "_warn_threshold");
+        validateSize(fail, allowZero, name + "_fail_threshold");
+        validateWarnLowerThanFail(warn, fail, name);
+    }
+
+    private static void validateWarnLowerThanFail(DataStorageSpec.LongBytesBound warn, DataStorageSpec.LongBytesBound fail, String name)
+    {
+        if (warn == null || fail == null)
+            return;
+
+        if (fail.toBytes() < warn.toBytes())
+            throw new IllegalArgumentException(format("The warn threshold %s for %s_warn_threshold should be lower " +
+                                                      "than the fail threshold %s", warn, name, fail));
+    }
+
+    private static Set<String> validateTableProperties(Set<String> properties, String name)
+    {
+        if (properties == null)
+            throw new IllegalArgumentException(format("Invalid value for %s: null is not allowed", name));
+
+        Set<String> lowerCaseProperties = properties.stream().map(String::toLowerCase).collect(toSet());
+
+        Set<String> diff = Sets.difference(lowerCaseProperties, TableAttributes.allKeywords());
+
+        if (!diff.isEmpty())
+            throw new IllegalArgumentException(format("Invalid value for %s: '%s' do not parse as valid table properties",
+                                                      name, diff));
+
+        return lowerCaseProperties;
+    }
+
+    private static Set<ConsistencyLevel> validateConsistencyLevels(Set<ConsistencyLevel> consistencyLevels, String name)
+    {
+        if (consistencyLevels == null)
+            throw new IllegalArgumentException(format("Invalid value for %s: null is not allowed", name));
+
+        return consistencyLevels.isEmpty() ? Collections.emptySet() : Sets.immutableEnumSet(consistencyLevels);
+    }
+
+    private static void validateDataDiskUsageMaxDiskSize(DataStorageSpec.LongBytesBound maxDiskSize)
+    {
+        if (maxDiskSize == null)
+            return;
+
+        validateSize(maxDiskSize, false, "data_disk_usage_max_disk_size");
+
+        long diskSize = DiskUsageMonitor.totalDiskSpace();
+
+        if (diskSize < maxDiskSize.toBytes())
+            throw new IllegalArgumentException(format("Invalid value for data_disk_usage_max_disk_size: " +
+                                                      "%s specified, but only %s are actually available on disk",
+                                                      maxDiskSize, FileUtils.stringifyFileSize(diskSize)));
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/InheritingClass.java b/src/java/org/apache/cassandra/config/InheritingClass.java
new file mode 100644
index 0000000..c0bc41f
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/InheritingClass.java
@@ -0,0 +1,78 @@
+/*
+ * 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.config;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+public class InheritingClass extends ParameterizedClass
+{
+    public String inherits = null;
+
+    @SuppressWarnings("unused") // for snakeyaml
+    public InheritingClass()
+    {
+    }
+
+    public InheritingClass(String inherits, String class_name, Map<String, String> parameters)
+    {
+        super(class_name, parameters);
+        this.inherits = inherits;
+    }
+
+    @SuppressWarnings("unused")
+    public InheritingClass(Map<String, ?> p)
+    {
+        super(p);
+        this.inherits = p.get("inherits").toString();
+    }
+
+    public ParameterizedClass resolve(Map<String, ParameterizedClass> map)
+    {
+        if (inherits == null)
+            return this;
+        ParameterizedClass parent = map.get(inherits);
+        if (parent == null)
+            throw new ConfigurationException("Configuration definition inherits unknown " + inherits
+                                             + ". A configuration can only extend one defined earlier or \"default\".");
+        Map<String, String> resolvedParameters;
+        if (parameters == null || parameters.isEmpty())
+            resolvedParameters = parent.parameters;
+        else if (parent.parameters == null || parent.parameters.isEmpty())
+            resolvedParameters = this.parameters;
+        else
+        {
+            resolvedParameters = new LinkedHashMap<>(parent.parameters);
+            resolvedParameters.putAll(this.parameters);
+        }
+
+        String resolvedClass = this.class_name == null ? parent.class_name : this.class_name;
+        return new ParameterizedClass(resolvedClass, resolvedParameters);
+    }
+
+    @Override
+    public String toString()
+    {
+        return (inherits != null ? (inherits + "+") : "") +
+               (class_name != null ? class_name : "") +
+               (parameters != null ? parameters.toString() : "");
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/Loader.java b/src/java/org/apache/cassandra/config/Loader.java
new file mode 100644
index 0000000..3167645
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/Loader.java
@@ -0,0 +1,37 @@
+/*
+ * 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.config;
+
+import java.util.Map;
+
+import org.yaml.snakeyaml.introspector.Property;
+
+public interface Loader
+{
+    Map<String, Property> getProperties(Class<?> root);
+
+    default Map<String, Property> flatten(Class<?> root)
+    {
+        return Properties.flatten(this, getProperties(root));
+    }
+
+    default Map<String, Property> flatten(Class<?> root, String delimiter)
+    {
+        return Properties.flatten(this, getProperties(root), delimiter);
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/ParameterizedClass.java b/src/java/org/apache/cassandra/config/ParameterizedClass.java
index d0542f5..9b00178 100644
--- a/src/java/org/apache/cassandra/config/ParameterizedClass.java
+++ b/src/java/org/apache/cassandra/config/ParameterizedClass.java
@@ -22,6 +22,11 @@
 
 import com.google.common.base.Objects;
 
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
 public class ParameterizedClass
 {
     public static final String CLASS_NAME = "class_name";
@@ -60,6 +65,12 @@
     }
 
     @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(class_name, parameters);
+    }
+
+    @Override
     public String toString()
     {
         return class_name + (parameters == null ? "" : parameters.toString());
diff --git a/src/java/org/apache/cassandra/config/Properties.java b/src/java/org/apache/cassandra/config/Properties.java
new file mode 100644
index 0000000..79852d4
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/Properties.java
@@ -0,0 +1,196 @@
+/*
+ * 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.config;
+
+import java.lang.reflect.Constructor;
+import java.util.ArrayDeque;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Queue;
+
+import com.google.common.collect.Maps;
+
+import org.yaml.snakeyaml.introspector.Property;
+
+/**
+ * Utility class for working with {@link Property} types.
+ */
+public final class Properties
+{
+    public static final String DELIMITER = ".";
+
+    private Properties()
+    {
+    }
+
+    /**
+     * Given two properties (root, leaf), calls first go through root and passed to leaf.
+     *
+     * <pre>{@code leaf.get(root.get(o))}</pre>
+     *
+     * @param root first property in the chain
+     * @param leaf last property in the chain
+     * @param delimiter for joining names
+     * @return new Property which combines root -> leaf
+     */
+    public static Property andThen(Property root, Property leaf, String delimiter)
+    {
+        return new AndThen(root, leaf, delimiter);
+    }
+
+    /**
+     * Given two properties (root, leaf), calls first go through root and passed to leaf.
+     *
+     * <pre>{@code leaf.get(root.get(o))}</pre>
+     *
+     * @param root first property in the chain
+     * @param leaf last property in the chain
+     * @return new Property which combines root -> leaf
+     */
+    public static Property andThen(Property root, Property leaf)
+    {
+        return andThen(root, leaf, DELIMITER);
+    }
+
+    /**
+     * Given a map of Properties, takes any "nested" property (non primitive, value-type, or collection), and
+     * expands them, producing 1 or more Properties.
+     *
+     * @param loader for mapping type to map of properties
+     * @param input map to flatten
+     * @return map of all flattened properties
+     */
+    public static Map<String, Property> flatten(Loader loader, Map<String, Property> input)
+    {
+        return flatten(loader, input, DELIMITER);
+    }
+
+    /**
+     * Given a map of Properties, takes any "nested" property (non primitive, value-type, or collection), and
+     * expands them, producing 1 or more Properties.
+     *
+     * @param loader for mapping type to map of properties
+     * @param input map to flatten
+     * @param delimiter for joining names
+     * @return map of all flattened properties
+     */
+    public static Map<String, Property> flatten(Loader loader, Map<String, Property> input, String delimiter)
+    {
+        Queue<Property> queue = new ArrayDeque<>(input.values());
+
+        Map<String, Property> output = Maps.newHashMapWithExpectedSize(input.size());
+        while (!queue.isEmpty())
+        {
+            Property prop = queue.poll();
+            Map<String, Property> children = isPrimitive(prop) || isCollection(prop) ? Collections.emptyMap() : loader.getProperties(prop.getType());
+            if (children.isEmpty())
+            {
+                // not nested, so assume properties can be handled
+                output.put(prop.getName(), prop);
+            }
+            else
+            {
+                children.values().stream().map(p -> andThen(prop, p, delimiter)).forEach(queue::add);
+            }
+        }
+        return output;
+    }
+
+    /**
+     * @return true if proeprty type is a collection
+     */
+    public static boolean isCollection(Property prop)
+    {
+        return Collection.class.isAssignableFrom(prop.getType()) || Map.class.isAssignableFrom(prop.getType());
+    }
+
+    /**
+     * @return true if property type is a primitive, or well known value type (may return false for user defined value types)
+     */
+    public static boolean isPrimitive(Property prop)
+    {
+        Class<?> type = prop.getType();
+        return type.isPrimitive() || type.isEnum() || type.equals(String.class) || Number.class.isAssignableFrom(type) || Boolean.class.equals(type);
+    }
+
+    /**
+     * @return default implementation of {@link Loader}
+     */
+    public static Loader defaultLoader()
+    {
+        return new DefaultLoader();
+    }
+
+    /**
+     * @return a new property with an updated name
+     */
+    public static Property rename(String newName, Property prop)
+    {
+        return new ForwardingProperty(newName, prop);
+    }
+
+    private static final class AndThen extends ForwardingProperty
+    {
+        private final Property root;
+        private final Property leaf;
+
+        AndThen(Property root, Property leaf, String delimiter)
+        {
+            super(root.getName() + delimiter + leaf.getName(), leaf);
+            this.root = root;
+            this.leaf = leaf;
+        }
+
+        @Override
+        public void set(Object object, Object value) throws Exception
+        {
+            Object parent = root.get(object);
+            if (parent == null)
+            {
+                // see: org.yaml.snakeyaml.constructor.BaseConstructor.newInstance(java.lang.Class<?>, org.yaml.snakeyaml.nodes.Node, boolean)
+                // That method is what creates the types, and it boils down to this call.  There is a TypeDescription
+                // class that we don't use, so boils down to "null" in our existing logic... if we start using TypeDescription
+                // to build the object, then we will need to rewrite this logic to work with BaseConstructor.
+                Constructor<?> c = root.getType().getDeclaredConstructor();
+                c.setAccessible(true);
+                parent = c.newInstance();
+                root.set(object, parent);
+            }
+            leaf.set(parent, value);
+        }
+
+        @Override
+        public Object get(Object object)
+        {
+            try
+            {
+                Object parent = root.get(object);
+                if (parent == null)
+                    return null;
+                return leaf.get(parent);
+            }
+            catch (Exception e)
+            {
+                if (!(root instanceof AndThen))
+                    e.addSuppressed(new RuntimeException("Error calling get() on " + this));
+                throw e;
+            }
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/Replacement.java b/src/java/org/apache/cassandra/config/Replacement.java
new file mode 100644
index 0000000..a201b63
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/Replacement.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.config;
+
+import java.util.Objects;
+
+import org.yaml.snakeyaml.introspector.Property;
+
+/**
+ * Holder for replacements to support backward compatibility between old and new names and types
+ * of configuration parameters (CASSANDRA-15234)
+ */
+public final class Replacement
+{
+    /**
+     * Currently we use Config class
+     */
+    public final Class<?> parent;
+    /**
+     * Old name of the configuration parameter
+     */
+    public final String oldName;
+    /**
+     * Old type of the configuration parameter
+     */
+    public final Class<?> oldType;
+    /**
+     * New name used for the configuration parameter
+     */
+    public final String newName;
+    /**
+     * Converter to be used according to the old default unit which was provided as a suffix of the configuration
+     * parameter
+     */
+    public final Converters converter;
+    public final boolean deprecated;
+
+    public Replacement(Class<?> parent,
+                       String oldName,
+                       Class<?> oldType,
+                       String newName,
+                       Converters converter,
+                       boolean deprecated)
+    {
+        this.parent = Objects.requireNonNull(parent);
+        this.oldName = Objects.requireNonNull(oldName);
+        this.oldType = Objects.requireNonNull(oldType);
+        this.newName = Objects.requireNonNull(newName);
+        this.converter = Objects.requireNonNull(converter);
+        // by default deprecated is false
+        this.deprecated = deprecated;
+    }
+
+    public Property toProperty(Property newProperty)
+    {
+        return new ForwardingProperty(oldName, oldType, newProperty)
+        {
+            @Override
+            public void set(Object o, Object o1) throws Exception
+            {
+                newProperty.set(o, converter.convert(o1));
+            }
+
+            @Override
+            public Object get(Object o)
+            {
+                return converter.unconvert(newProperty.get(o));
+            }
+        };
+    }
+
+    public boolean isValueFormatReplacement()
+    {
+        return oldName.equals(newName);
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/Replacements.java b/src/java/org/apache/cassandra/config/Replacements.java
new file mode 100644
index 0000000..f6577cb
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/Replacements.java
@@ -0,0 +1,128 @@
+/*
+ * 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.config;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+public final class Replacements
+{
+    private Replacements()
+    {
+    }
+
+    /**
+     * @param klass to get replacements for
+     * @return map of old names and replacements needed.
+     */
+    public static Map<Class<? extends Object>, Map<String, Replacement>> getNameReplacements(Class<? extends Object> klass)
+    {
+        List<Replacement> replacements = getReplacementsRecursive(klass);
+        Map<Class<?>, Map<String, Replacement>> objectOldNames = new HashMap<>();
+        for (Replacement r : replacements)
+        {
+            Map<String, Replacement> oldNames = objectOldNames.computeIfAbsent(r.parent, ignore -> new HashMap<>());
+            if (!oldNames.containsKey(r.oldName))
+                oldNames.put(r.oldName, r);
+            else
+            {
+                throw new ConfigurationException("Invalid annotations, you have more than one @Replaces annotation in " +
+                                                 "Config class with same old name(" + r.oldName + ") defined.");
+            }
+        }
+        return objectOldNames;
+    }
+
+    /**
+     * @param klass to get replacements for
+     * @return map of old names and replacements needed.
+     */
+    private static List<Replacement> getReplacementsRecursive(Class<?> klass)
+    {
+        Set<Class<?>> seen = new HashSet<>(); // to make sure not to process the same type twice
+        List<Replacement> accum = new ArrayList<>();
+        getReplacementsRecursive(seen, accum, klass);
+        return accum.isEmpty() ? Collections.emptyList() : accum;
+    }
+
+    private static void getReplacementsRecursive(Set<Class<?>> seen,
+                                                 List<Replacement> accum,
+                                                 Class<?> klass)
+    {
+        accum.addAll(getReplacements(klass));
+        for (Field field : klass.getDeclaredFields())
+        {
+            if (seen.add(field.getType()))
+            {
+                // first time looking at this type, walk it
+                getReplacementsRecursive(seen, accum, field.getType());
+            }
+        }
+    }
+
+    private static List<Replacement> getReplacements(Class<?> klass)
+    {
+        List<Replacement> replacements = new ArrayList<>();
+        for (Field field : klass.getDeclaredFields())
+        {
+            String newName = field.getName();
+            Class<?> newType = field.getType();
+            final ReplacesList[] byType = field.getAnnotationsByType(ReplacesList.class);
+            if (byType == null || byType.length == 0)
+            {
+                Replaces r = field.getAnnotation(Replaces.class);
+                if (r != null)
+                    addReplacement(klass, replacements, newName, newType, r);
+            }
+            else
+            {
+                for (ReplacesList replacesList : byType)
+                    for (Replaces r : replacesList.value())
+                        addReplacement(klass, replacements, newName, newType, r);
+            }
+        }
+        return replacements.isEmpty() ? Collections.emptyList() : replacements;
+    }
+
+    private static void addReplacement(Class<?> klass,
+                                       List<Replacement> replacements,
+                                       String newName, Class<?> newType,
+                                       Replaces r)
+    {
+        String oldName = r.oldName();
+
+        boolean deprecated = r.deprecated();
+
+        Class<?> oldType = r.converter().getOldType();
+        if (oldType == null)
+            oldType = newType;
+        Class<?> expectedNewType = r.converter().getNewType();
+        if (expectedNewType != null)
+            assert expectedNewType.equals(newType) : String.format("Converter is expected to return %s but %s#%s expects %s", expectedNewType, klass, newName, newType);
+
+        replacements.add(new Replacement(klass, oldName, oldType, newName, r.converter(), deprecated));
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/Replaces.java b/src/java/org/apache/cassandra/config/Replaces.java
index 93bdcb5..e1354b9 100644
--- a/src/java/org/apache/cassandra/config/Replaces.java
+++ b/src/java/org/apache/cassandra/config/Replaces.java
@@ -25,8 +25,8 @@
 import java.lang.annotation.Target;
 
 /**
- * Repeatable annotation for providing old name and whether the
- * config parameters we annotate are deprecated and we need to warn the users. (CASSANDRA-17141)
+ * Repeatable annotation for providing old name, converter from old to new type and whether the
+ * config parameters we annotate are deprecated and we need to warn the users. (CASSANDRA-17141, CASSANDRA-15234)
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ ElementType.FIELD})
@@ -39,6 +39,11 @@
     String oldName();
 
     /**
+     * @return which converter we need depending on the old default unit that was used
+     */
+    Converters converter() default Converters.IDENTITY;
+
+    /**
      * @return whether the parameter should be marked as deprecated or not and warning sent to the user
      */
     boolean deprecated() default false;
diff --git a/src/java/org/apache/cassandra/config/ReplacesList.java b/src/java/org/apache/cassandra/config/ReplacesList.java
index a2b0c96..eec4e4c 100644
--- a/src/java/org/apache/cassandra/config/ReplacesList.java
+++ b/src/java/org/apache/cassandra/config/ReplacesList.java
@@ -24,7 +24,7 @@
 import java.lang.annotation.Target;
 
 /**
- * Contatining annotation type for the repeatable annotation {@link Replaces}
+ * Concatenating annotation type for the repeatable annotation {@link Replaces}
  */
 @Retention(RetentionPolicy.RUNTIME)
 @Target({ ElementType.FIELD})
diff --git a/src/java/org/apache/cassandra/config/StartupChecksOptions.java b/src/java/org/apache/cassandra/config/StartupChecksOptions.java
new file mode 100644
index 0000000..6eb3189
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/StartupChecksOptions.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.config;
+
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.cassandra.service.StartupChecks.StartupCheckType;
+
+import static java.lang.Boolean.FALSE;
+import static java.lang.Boolean.TRUE;
+import static org.apache.cassandra.service.StartupChecks.StartupCheckType.non_configurable_check;
+
+public class StartupChecksOptions
+{
+    public static final String ENABLED_PROPERTY = "enabled";
+
+    private final Map<StartupCheckType, Map<String, Object>> options = new EnumMap<>(StartupCheckType.class);
+
+    public StartupChecksOptions()
+    {
+        this(Collections.emptyMap());
+    }
+
+    public StartupChecksOptions(final Map<StartupCheckType, Map<String, Object>> options)
+    {
+        this.options.putAll(options);
+        apply();
+    }
+
+    public void set(final StartupCheckType startupCheckType, final String key, final Object value)
+    {
+        if (startupCheckType != non_configurable_check)
+            options.get(startupCheckType).put(key, value);
+    }
+
+    public void enable(final StartupCheckType startupCheckType)
+    {
+        set(startupCheckType, ENABLED_PROPERTY, TRUE);
+    }
+
+    public void disable(final StartupCheckType startupCheckType)
+    {
+        if (startupCheckType != non_configurable_check)
+            set(startupCheckType, ENABLED_PROPERTY, FALSE);
+    }
+
+    public boolean isEnabled(final StartupCheckType startupCheckType)
+    {
+        return Boolean.parseBoolean(options.get(startupCheckType).get(ENABLED_PROPERTY).toString());
+    }
+
+    public boolean isDisabled(final StartupCheckType startupCheckType)
+    {
+        return !isEnabled(startupCheckType);
+    }
+
+    public Map<String, Object> getConfig(final StartupCheckType startupCheckType)
+    {
+        return options.get(startupCheckType);
+    }
+
+    private void apply()
+    {
+        for (final StartupCheckType startupCheckType : StartupCheckType.values())
+        {
+            final Map<String, Object> configMap = options.computeIfAbsent(startupCheckType, k -> new HashMap<>());
+            if (configMap.containsKey(ENABLED_PROPERTY))
+                configMap.putIfAbsent(ENABLED_PROPERTY, FALSE);
+            else if (startupCheckType.disabledByDefault)
+                configMap.put(ENABLED_PROPERTY, FALSE);
+            else
+                configMap.put(ENABLED_PROPERTY, TRUE);
+        }
+        // clear if we put anything into it by accident & enable this check every time no matter what
+        options.get(non_configurable_check).clear();
+        options.get(non_configurable_check).put(ENABLED_PROPERTY, TRUE);
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/SubnetGroups.java b/src/java/org/apache/cassandra/config/SubnetGroups.java
new file mode 100644
index 0000000..4f460fa
--- /dev/null
+++ b/src/java/org/apache/cassandra/config/SubnetGroups.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.config;
+
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.SocketAddress;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
+
+import inet.ipaddr.IPAddressNetwork;
+import inet.ipaddr.IPAddressString;
+
+/**
+ * When a group of subnets are needed, this class can be used to represent the group as if it was a single subnet.
+ *
+ * This class supports IPV4 and IPV6 subnets
+ */
+public class SubnetGroups
+{
+    public Set<Group> subnets = Collections.emptySet();
+
+    public SubnetGroups()
+    {
+    }
+
+    /** Used by SnakeYaml */
+    @SuppressWarnings("unused")
+    public SubnetGroups(List<String> values)
+    {
+        this.subnets = ImmutableSet.copyOf(values.stream().map(Group::new).collect(Collectors.toSet()));
+    }
+
+    public boolean contains(SocketAddress address)
+    {
+        Preconditions.checkNotNull(address);
+        Preconditions.checkArgument(address instanceof InetSocketAddress, "Unsupported socket address type: " + address.getClass());
+        return contains(((InetSocketAddress) address).getAddress());
+    }
+
+    public boolean contains(InetAddress address)
+    {
+        for (Group group : subnets)
+        {
+            if (group.contains(address))
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    public boolean isEmpty()
+    {
+        return subnets.isEmpty();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SubnetGroups that = (SubnetGroups) o;
+        return subnets.equals(that.subnets);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(subnets);
+    }
+
+    @Override
+    public String toString()
+    {
+        return "SubnetGroups{" +
+               "subnets=" + subnets +
+               '}';
+    }
+
+    private static class Group
+    {
+        private static final IPAddressNetwork.IPAddressGenerator IP_ADDRESS_GENERATOR = new IPAddressNetwork.IPAddressGenerator();
+
+        private final IPAddressString subnet;
+
+        Group(String range)
+        {
+            subnet = new IPAddressString(range);
+        }
+
+        boolean contains(InetAddress address)
+        {
+            return subnet.contains(IP_ADDRESS_GENERATOR.from(address).toAddressString());
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Group group = (Group) o;
+            return subnet.equals(group.subnet);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hash(subnet);
+        }
+
+        @Override
+        public String toString()
+        {
+            return subnet.toString();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java
index 48af78b..528accd 100644
--- a/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java
+++ b/src/java/org/apache/cassandra/config/YamlConfigurationLoader.java
@@ -18,11 +18,8 @@
 package org.apache.cassandra.config;
 
 import java.io.ByteArrayInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
-import java.lang.annotation.Annotation;
-import java.lang.reflect.Field;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -33,18 +30,19 @@
 import java.util.Objects;
 import java.util.Set;
 
+import javax.annotation.Nullable;
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.io.ByteStreams;
-
-import org.apache.commons.lang3.SystemUtils;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.io.util.File;
+import org.yaml.snakeyaml.LoaderOptions;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.composer.Composer;
@@ -56,11 +54,20 @@
 import org.yaml.snakeyaml.introspector.PropertyUtils;
 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.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.
+     */
+    static final String SYSTEM_PROPERTY_PREFIX = "cassandra.settings.";
 
     /**
      * Inspect the classpath to find storage configuration file
@@ -83,14 +90,14 @@
             url = loader.getResource(configUrl);
             if (url == null)
             {
-                String required = "file:" + File.separator + File.separator;
+                String required = "file:" + File.pathSeparator() + File.pathSeparator();
                 if (!configUrl.startsWith(required))
                     throw new ConfigurationException(String.format(
                         "Expecting URI in variable: [cassandra.config]. Found[%s]. Please prefix the file with [%s%s] for local " +
                         "files and [%s<server>%s] for remote files. If you are executing this from an external tool, it needs " +
                         "to set Config.setClientMode(true) to avoid loading configuration.",
-                        configUrl, required, File.separator, required, File.separator));
-                throw new ConfigurationException("Cannot locate " + configUrl + ".  If this is a local file, please confirm you've provided " + required + File.separator + " as a URI prefix.");
+                        configUrl, required, File.pathSeparator(), required, File.pathSeparator()));
+                throw new ConfigurationException("Cannot locate " + configUrl + ".  If this is a local file, please confirm you've provided " + required + File.pathSeparator() + " as a URI prefix.");
             }
         }
 
@@ -106,6 +113,7 @@
     {
         if (storageConfigURL == null)
             storageConfigURL = getStorageConfigURL();
+
         return loadConfig(storageConfigURL);
     }
 
@@ -125,23 +133,80 @@
                 throw new AssertionError(e);
             }
 
-
             SafeConstructor constructor = new CustomConstructor(Config.class, Yaml.class.getClassLoader());
             Map<Class<?>, Map<String, Replacement>> replacements = getNameReplacements(Config.class);
+            verifyReplacements(replacements, configBytes);
             PropertiesChecker propertiesChecker = new PropertiesChecker(replacements);
             constructor.setPropertyUtils(propertiesChecker);
             Yaml yaml = new Yaml(constructor);
             Config result = loadConfig(yaml, configBytes);
             propertiesChecker.check();
+            maybeAddSystemProperties(result);
             return result;
         }
         catch (YAMLException e)
         {
-            throw new ConfigurationException("Invalid yaml: " + url + SystemUtils.LINE_SEPARATOR
-                                             +  " Error: " + e.getMessage(), false);
+            throw new ConfigurationException("Invalid yaml: " + url, e);
         }
     }
 
+    private static void maybeAddSystemProperties(Object obj)
+    {
+        if (CassandraRelevantProperties.CONFIG_ALLOW_SYSTEM_PROPERTIES.getBoolean())
+        {
+            java.util.Properties props = System.getProperties();
+            Map<String, String> map = new HashMap<>();
+            for (String name : props.stringPropertyNames())
+            {
+                if (name.startsWith(SYSTEM_PROPERTY_PREFIX))
+                {
+                    String value = props.getProperty(name);
+                    if (value != null)
+                        map.put(name.replace(SYSTEM_PROPERTY_PREFIX, ""), value);
+                }
+            }
+            if (!map.isEmpty())
+                updateFromMap(map, false, obj);
+        }
+    }
+
+    private static void verifyReplacements(Map<Class<?>, Map<String, Replacement>> replacements, Map<String, ?> rawConfig)
+    {
+        List<String> duplicates = new ArrayList<>();
+        for (Map.Entry<Class<?>, Map<String, Replacement>> outerEntry : replacements.entrySet())
+        {
+            for (Map.Entry<String, Replacement> entry : outerEntry.getValue().entrySet())
+            {
+                Replacement r = entry.getValue();
+                if (!r.isValueFormatReplacement() && rawConfig.containsKey(r.oldName) && rawConfig.containsKey(r.newName))
+                {
+                    String msg = String.format("[%s -> %s]", r.oldName, r.newName);
+                    duplicates.add(msg);
+                }
+            }
+        }
+
+        if (!duplicates.isEmpty())
+        {
+            String msg = String.format("Config contains both old and new keys for the same configuration parameters, migrate old -> new: %s", String.join(", ", duplicates));
+            if (!ALLOW_NEW_OLD_CONFIG_KEYS.getBoolean())
+                throw new ConfigurationException(msg);
+            else
+                logger.warn(msg);
+        }
+    }
+
+    private static void verifyReplacements(Map<Class<?>, Map<String, Replacement>> replacements, byte[] configBytes)
+    {
+        LoaderOptions loaderOptions = new LoaderOptions();
+        loaderOptions.setAllowDuplicateKeys(ALLOW_DUPLICATE_CONFIG_KEYS.getBoolean());
+        Yaml rawYaml = new Yaml(loaderOptions);
+
+        Map<String, Object> rawConfig = rawYaml.load(new ByteArrayInputStream(configBytes));
+        verifyReplacements(replacements, rawConfig);
+
+    }
+
     @VisibleForTesting
     public static <T> T fromMap(Map<String,Object> map, Class<T> klass)
     {
@@ -153,6 +218,41 @@
     {
         SafeConstructor constructor = new YamlConfigurationLoader.CustomConstructor(klass, klass.getClassLoader());
         Map<Class<?>, Map<String, Replacement>> replacements = getNameReplacements(Config.class);
+        verifyReplacements(replacements, map);
+        YamlConfigurationLoader.PropertiesChecker propertiesChecker = new YamlConfigurationLoader.PropertiesChecker(replacements);
+        constructor.setPropertyUtils(propertiesChecker);
+        Yaml yaml = new Yaml(constructor);
+        Node node = yaml.represent(map);
+        constructor.setComposer(new Composer(null, null)
+        {
+            @Override
+            public Node getSingleNode()
+            {
+                return node;
+            }
+        });
+        T value = (T) constructor.getSingleData(klass);
+        if (shouldCheck)
+            propertiesChecker.check();
+        maybeAddSystemProperties(value);
+        return value;
+    }
+
+    public static <T> T updateFromMap(Map<String, ?> map, boolean shouldCheck, T obj)
+    {
+        Class<T> klass = (Class<T>) obj.getClass();
+        SafeConstructor constructor = new YamlConfigurationLoader.CustomConstructor(klass, klass.getClassLoader())
+        {
+            @Override
+            protected Object newInstance(Node node)
+            {
+                if (node.getType() == obj.getClass())
+                    return obj;
+                return super.newInstance(node);
+            }
+        };
+        Map<Class<?>, Map<String, Replacement>> replacements = getNameReplacements(Config.class);
+        verifyReplacements(replacements, map);
         YamlConfigurationLoader.PropertiesChecker propertiesChecker = new YamlConfigurationLoader.PropertiesChecker(replacements);
         constructor.setPropertyUtils(propertiesChecker);
         Yaml yaml = new Yaml(constructor);
@@ -171,6 +271,7 @@
         return value;
     }
 
+    @VisibleForTesting
     static class CustomConstructor extends CustomClassLoaderConstructor
     {
         CustomConstructor(Class<?> theRoot, ClassLoader classLoader)
@@ -180,6 +281,10 @@
             TypeDescription seedDesc = new TypeDescription(ParameterizedClass.class);
             seedDesc.putMapPropertyType("parameters", String.class, String.class);
             addTypeDescription(seedDesc);
+
+            TypeDescription memtableDesc = new TypeDescription(Config.MemtableOptions.class);
+            memtableDesc.addPropertyParameters("configurations", String.class, InheritingClass.class);
+            addTypeDescription(memtableDesc);
         }
 
         @Override
@@ -213,8 +318,10 @@
      * Utility class to check that there are no extra properties and that properties that are not null by default
      * are not set to null.
      */
+    @VisibleForTesting
     private static class PropertiesChecker extends PropertyUtils
     {
+        private final Loader loader = Properties.defaultLoader();
         private final Set<String> missingProperties = new HashSet<>();
 
         private final Set<String> nullProperties = new HashSet<>();
@@ -223,83 +330,51 @@
 
         private final Map<Class<?>, Map<String, Replacement>> replacements;
 
-        public PropertiesChecker(Map<Class<?>, Map<String, Replacement>> replacements)
+        PropertiesChecker(Map<Class<?>, Map<String, Replacement>> replacements)
         {
             this.replacements = Objects.requireNonNull(replacements, "Replacements should not be null");
             setSkipMissingProperties(true);
         }
 
         @Override
-        public Property getProperty(Class<? extends Object> type, String name)
+        public Property getProperty(Class<?> type, String name)
         {
             final Property result;
             Map<String, Replacement> typeReplacements = replacements.getOrDefault(type, Collections.emptyMap());
             if (typeReplacements.containsKey(name))
             {
                 Replacement replacement = typeReplacements.get(name);
-                final Property newProperty = super.getProperty(type, replacement.newName);
-                result = new Property(replacement.oldName, newProperty.getType())
-                {
-                    @Override
-                    public Class<?>[] getActualTypeArguments()
-                    {
-                        return newProperty.getActualTypeArguments();
-                    }
-
-                    @Override
-                    public void set(Object o, Object o1) throws Exception
-                    {
-                        newProperty.set(o, o1);
-                    }
-
-                    @Override
-                    public Object get(Object o)
-                    {
-                        return newProperty.get(o);
-                    }
-
-                    @Override
-                    public List<Annotation> getAnnotations()
-                    {
-                        return null;
-                    }
-
-                    @Override
-                    public <A extends Annotation> A getAnnotation(Class<A> aClass)
-                    {
-                        return null;
-                    }
-                };
-
+                result = replacement.toProperty(getProperty0(type, replacement.newName));
+                
                 if (replacement.deprecated)
                     deprecationWarnings.add(replacement.oldName);
             }
             else
             {
-                result = super.getProperty(type, name);
+                result = getProperty0(type, name);
             }
 
             if (result instanceof MissingProperty)
             {
                 missingProperties.add(result.getName());
             }
-
-            return new Property(result.getName(), result.getType())
+            else if (result.getAnnotation(Deprecated.class) != null)
             {
+                deprecationWarnings.add(result.getName());
+            }
+
+            return new ForwardingProperty(result.getName(), result)
+            {
+                boolean allowsNull = result.getAnnotation(Nullable.class) != null;
+
                 @Override
                 public void set(Object object, Object value) throws Exception
                 {
-                    if (value == null && get(object) != null)
-                    {
+                    // TODO: CASSANDRA-17785, add @Nullable to all nullable Config properties and remove value == null
+                    if (value == null && get(object) != null && !allowsNull)
                         nullProperties.add(getName());
-                    }
-                    result.set(object, value);
-                }
 
-                @Override
-                public Class<?>[] getActualTypeArguments()
-                {
-                    return result.getActualTypeArguments();
+                    result.set(object, value);
                 }
 
                 @Override
@@ -307,21 +382,39 @@
                 {
                     return result.get(object);
                 }
-
-                @Override
-                public List<Annotation> getAnnotations()
-                {
-                    return Collections.EMPTY_LIST;
-                }
-
-                @Override
-                public <A extends Annotation> A getAnnotation(Class<A> aClass)
-                {
-                    return null;
-                }
             };
         }
 
+        private Property getProperty0(Class<? extends Object> type, String name)
+        {
+            if (name.contains("."))
+                return getNestedProperty(type, name);
+            return getFlatProperty(type, name);
+        }
+
+        private Property getFlatProperty(Class<?> type, String name)
+        {
+            Property prop = loader.getProperties(type).get(name);
+            return prop == null ? new MissingProperty(name) : prop;
+        }
+
+        private Property getNestedProperty(Class<?> type, String name)
+        {
+            Property root = null;
+            for (String s : name.split("\\."))
+            {
+                Property prop = getFlatProperty(type, s);
+                if (prop instanceof MissingProperty)
+                {
+                    root = null;
+                    break;
+                }
+                root = root == null ? prop : Properties.andThen(root, prop);
+                type = root.getType();
+            }
+            return root != null ? root : new MissingProperty(name);
+        }
+
         public void check() throws ConfigurationException
         {
             if (!nullProperties.isEmpty())
@@ -331,100 +424,8 @@
                 throw new ConfigurationException("Invalid yaml. Please remove properties " + missingProperties + " from your cassandra.yaml", false);
 
             if (!deprecationWarnings.isEmpty())
-                logger.warn("{} parameters have been deprecated. They have new names; For more information, please refer to NEWS.txt", deprecationWarnings);
-        }
-    }
-
-    /**
-     * @param klass to get replacements for
-     * @return map of old names and replacements needed.
-     */
-    private static Map<Class<?>, Map<String, Replacement>> getNameReplacements(Class<?> klass)
-    {
-        List<Replacement> replacements = getReplacements(klass);
-        Map<Class<?>, Map<String, Replacement>> objectOldNames = new HashMap<>();
-        for (Replacement r : replacements)
-        {
-            Map<String, Replacement> oldNames = objectOldNames.computeIfAbsent(r.parent, ignore -> new HashMap<>());
-            if (!oldNames.containsKey(r.oldName))
-                oldNames.put(r.oldName, r);
-            else
-            {
-                throw new ConfigurationException("Invalid annotations, you have more than one @Replaces annotation in " +
-                                                 "Config class with same old name(" + r.oldName + ") defined.");
-            }
-        }
-        return objectOldNames;
-    }
-
-    private static List<Replacement> getReplacements(Class<?> klass)
-    {
-        List<Replacement> replacements = new ArrayList<>();
-        for (Field field : klass.getDeclaredFields())
-        {
-            String newName = field.getName();
-            final ReplacesList[] byType = field.getAnnotationsByType(ReplacesList.class);
-            if (byType == null || byType.length == 0)
-            {
-                Replaces r = field.getAnnotation(Replaces.class);
-                if (r != null)
-                    addReplacement(klass, replacements, newName, r);
-            }
-            else
-            {
-                for (ReplacesList replacesList : byType)
-                    for (Replaces r : replacesList.value())
-                        addReplacement(klass, replacements, newName, r);
-            }
-        }
-        return replacements.isEmpty() ? Collections.emptyList() : replacements;
-    }
-
-    private static void addReplacement(Class<?> klass,
-                                       List<Replacement> replacements,
-                                       String newName,
-                                       Replaces r)
-    {
-        String oldName = r.oldName();
-        boolean deprecated = r.deprecated();
-
-        replacements.add(new Replacement(klass, oldName, newName, deprecated));
-    }
-
-    /**
-     * Holder for replacements to support backward compatibility between old and new names for configuration parameters
-     * backported partially from trunk(CASSANDRA-15234) to support a bug fix/improvement in Cassadra 4.0
-     * (CASSANDRA-17141)
-     */
-    static final class Replacement
-    {
-        /**
-         * Currently we use for Config class
-         */
-        final Class<?> parent;
-        /**
-         * Old name of the configuration parameter
-         */
-        final String oldName;
-        /**
-         * New name used for the configuration parameter
-         */
-        final String newName;
-        /**
-         * A flag to mark whether the old name is deprecated and fire a warning to the user. By default we set it to false.
-         */
-        final boolean deprecated;
-
-        Replacement(Class<?> parent,
-                    String oldName,
-                    String newName,
-                    boolean deprecated)
-        {
-            this.parent = Objects.requireNonNull(parent);
-            this.oldName = Objects.requireNonNull(oldName);
-            this.newName = Objects.requireNonNull(newName);
-            // by default deprecated is false
-            this.deprecated = deprecated;
+                logger.warn("{} parameters have been deprecated. They have new names and/or value format; For more information, please refer to NEWS.txt", deprecationWarnings);
         }
     }
 }
+
diff --git a/src/java/org/apache/cassandra/cql3/CQL3Type.java b/src/java/org/apache/cassandra/cql3/CQL3Type.java
index 5059104..1d792b2 100644
--- a/src/java/org/apache/cassandra/cql3/CQL3Type.java
+++ b/src/java/org/apache/cassandra/cql3/CQL3Type.java
@@ -24,7 +24,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.db.marshal.CollectionType.Kind;
@@ -55,6 +54,7 @@
     }
 
     public AbstractType<?> getType();
+    default public AbstractType<?> getUDFType() { return getType(); }
 
     /**
      * Generates CQL literal from a binary value of this type.
@@ -101,6 +101,11 @@
             return type;
         }
 
+        public AbstractType<?> getUDFType()
+        {
+            return this == TIMEUUID ? UUID.type : type;
+        }
+
         /**
          * Delegate to
          * {@link org.apache.cassandra.serializers.TypeSerializer#toCQLLiteral(ByteBuffer)}
diff --git a/src/java/org/apache/cassandra/cql3/Constants.java b/src/java/org/apache/cassandra/cql3/Constants.java
index 6dce3a3..64d9d69 100644
--- a/src/java/org/apache/cassandra/cql3/Constants.java
+++ b/src/java/org/apache/cassandra/cql3/Constants.java
@@ -20,9 +20,13 @@
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.*;
@@ -30,6 +34,7 @@
 import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FastByteOperations;
 
 /**
  * Static helper methods and classes for constants.
@@ -40,7 +45,18 @@
 
     public enum Type
     {
-        STRING,
+        STRING
+        {
+            public AbstractType<?> getPreferedTypeFor(String text)
+            {
+                 if(Charset.forName("US-ASCII").newEncoder().canEncode(text))
+                 {
+                     return AsciiType.instance;
+                 }
+
+                 return UTF8Type.instance;
+            }
+        },
         INTEGER
         {
             public AbstractType<?> getPreferedTypeFor(String text)
@@ -446,16 +462,53 @@
             super(column, t);
         }
 
+        public boolean requiresRead()
+        {
+            return !(column.type instanceof CounterColumnType);
+        }
+
         public void execute(DecoratedKey partitionKey, UpdateParameters params) throws InvalidRequestException
         {
-            ByteBuffer bytes = t.bindAndGet(params.options);
-            if (bytes == null)
-                throw new InvalidRequestException("Invalid null value for counter increment");
-            if (bytes == ByteBufferUtil.UNSET_BYTE_BUFFER)
-                return;
+            if (column.type instanceof CounterColumnType)
+            {
+                ByteBuffer bytes = t.bindAndGet(params.options);
+                if (bytes == null)
+                    throw new InvalidRequestException("Invalid null value for counter increment");
+                if (bytes == ByteBufferUtil.UNSET_BYTE_BUFFER)
+                    return;
 
-            long increment = ByteBufferUtil.toLong(bytes);
-            params.addCounter(column, increment);
+                long increment = ByteBufferUtil.toLong(bytes);
+                params.addCounter(column, increment);
+            }
+            else if (column.type instanceof NumberType<?>)
+            {
+                @SuppressWarnings("unchecked") NumberType<Number> type = (NumberType<Number>) column.type;
+                ByteBuffer increment = t.bindAndGet(params.options);
+                ByteBuffer current = getCurrentCellBuffer(partitionKey, params);
+                if (current == null)
+                    return;
+                ByteBuffer newValue = type.add(type, current, type, increment);
+                params.addCell(column, newValue);
+            }
+            else if (column.type instanceof StringType)
+            {
+                ByteBuffer append = t.bindAndGet(params.options);
+                ByteBuffer current = getCurrentCellBuffer(partitionKey, params);
+                ByteBuffer newValue;
+                if (current == null)
+                    return;
+                newValue = ByteBuffer.allocate(current.remaining() + append.remaining());
+                FastByteOperations.copy(current, current.position(), newValue, newValue.position(), current.remaining());
+                FastByteOperations.copy(append, append.position(), newValue, newValue.position() + current.remaining(), append.remaining());
+                params.addCell(column, newValue);
+            }
+        }
+
+        private ByteBuffer getCurrentCellBuffer(DecoratedKey key, UpdateParameters params)
+        {
+            Row currentRow = params.getPrefetchedRow(key, column.isStatic() ? Clustering.STATIC_CLUSTERING : params.currentClustering());
+            Cell<?> currentCell = currentRow == null ? null : currentRow.getCell(column);
+            return currentCell == null ? null : currentCell.buffer();
         }
     }
 
diff --git a/src/java/org/apache/cassandra/cql3/Duration.java b/src/java/org/apache/cassandra/cql3/Duration.java
index 520d195..1d6b9f7 100644
--- a/src/java/org/apache/cassandra/cql3/Duration.java
+++ b/src/java/org/apache/cassandra/cql3/Duration.java
@@ -27,10 +27,13 @@
 
 import org.apache.cassandra.serializers.MarshalException;
 
+import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue;
 import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
 import static org.apache.commons.lang3.time.DateUtils.MILLIS_PER_DAY;
 
+import io.netty.util.concurrent.FastThreadLocal;
+
 /**
  * Represents a duration. A durations store separately months, days, and seconds due to the fact that
  * the number of days in a month varies, and a day can have 23 or 25 hours if a daylight saving is involved.
@@ -45,6 +48,17 @@
     public static final int DAYS_PER_WEEK = 7;
     public static final int MONTHS_PER_YEAR = 12;
 
+    // For some operations, like floor, a Calendar is needed if months or years are involved. Unfortunatly, creating a
+    // Calendar is a costly operation so instead of creating one with every call we reuse them.
+    private static final FastThreadLocal<Calendar> CALENDAR_PROVIDER = new FastThreadLocal<Calendar>()
+    {
+        @Override
+        public Calendar initialValue()
+        {
+            return Calendar.getInstance(TimeZone.getTimeZone("UTC"), Locale.US);
+        }
+    };
+
     /**
      * The Regexp used to parse the duration provided as String.
      */
@@ -339,7 +353,7 @@
     {
         StringBuilder builder = new StringBuilder();
 
-        if (months < 0 || days < 0 || nanoseconds < 0)
+        if (isNegative())
             builder.append('-');
 
         long remainder = append(builder, Math.abs(months), MONTHS_PER_YEAR, "y");
@@ -395,6 +409,124 @@
         return dividend % divisor;
     }
 
+    /**
+     * Rounds a timestamp down to the closest multiple of a duration.
+     *
+     * @param timeInMillis the time to round in millisecond
+     * @param duration the duration
+     * @param startingTimeInMillis the time offset in milliseconds
+     * @return the timestamp rounded down to the closest multiple of the duration
+     */
+    public static long floorTimestamp(long timeInMillis, Duration duration, long startingTimeInMillis)
+    {
+        checkFalse(startingTimeInMillis > timeInMillis, "The floor function starting time is greater than the provided time");
+        checkFalse(duration.isNegative(), "Negative durations are not supported by the floor function");
+
+        // If the duration does not contain any months we can ignore daylight saving,
+        // as time zones are not supported, and simply look at the milliseconds
+        if (duration.months == 0)
+        {
+            long durationInMillis = getDurationMilliseconds(duration);
+
+            // If the duration is smaller than millisecond
+            if (durationInMillis == 0)
+                return timeInMillis;
+
+            long delta = (timeInMillis - startingTimeInMillis) % durationInMillis;
+            return timeInMillis - delta;
+        }
+
+        /*
+         * Otherwise, we resort to Calendar for the computation.
+         * What we're trying to compute is the largest integer 'multiplier' value such that
+         *   startingTimeMillis + (multiplier * duration) <= timeInMillis
+         * at which point we want to return 'startingTimeMillis + (multiplier * duration)'.
+         *
+         * One option would be to add 'duration' to 'statingTimeMillis' in a loop until we
+         * cross 'timeInMillis' and return how many iterator we did. But this might be slow if there is very many
+         * steps.
+         *
+         * So instead we first estimate 'multiplier' using the number of months between 'startingTimeMillis'
+         * and 'timeInMillis' ('durationInMonths' below) and the duration months. As the real computation
+         * should also take the 'days' and 'nanoseconds' parts of the duration, this multiplier may overshoot,
+         * so we detect it and work back from that, decreasing the multiplier until we find the proper one.
+         */
+
+        Calendar calendar = CALENDAR_PROVIDER.get();
+
+        calendar.setTimeInMillis(timeInMillis);
+        int year = calendar.get(Calendar.YEAR);
+        int month = calendar.get(Calendar.MONTH);
+
+        calendar.setTimeInMillis(startingTimeInMillis);
+        int startingYear = calendar.get(Calendar.YEAR);
+        int startingMonth = calendar.get(Calendar.MONTH);
+
+        int durationInMonths = (year - startingYear) * MONTHS_PER_YEAR + (month - startingMonth);
+        int multiplier = durationInMonths / duration.months;
+
+        calendar.add(Calendar.MONTH, multiplier * duration.months);
+
+        // If the duration was only containing months, we are done.
+        if (duration.days == 0 && duration.nanoseconds == 0)
+            return calendar.getTimeInMillis();
+
+        long durationInMillis = getDurationMilliseconds(duration);
+        long floor = calendar.getTimeInMillis() + (multiplier * durationInMillis);
+
+        // Once the milliseconds have been added we might have gone too far. If it is the case we will reduce the
+        // multiplier until the floor value is smaller than time in millis.
+        while (floor > timeInMillis)
+        {
+            multiplier--;
+            calendar.add(Calendar.MONTH, -duration.months);
+            floor = calendar.getTimeInMillis() + (multiplier * durationInMillis);
+        }
+
+        return Math.max(startingTimeInMillis, floor);
+    }
+
+    /**
+     * Returns the milliseconds part of the duration ignoring the month part
+     *
+     * @param duration the duration
+     * @return the milliseconds corresponding to the duration days and nanoseconds
+     */
+    private static long getDurationMilliseconds(Duration duration)
+    {
+        // We can ignore daylight saving as time zones are not supported
+        return (duration.days * MILLIS_PER_DAY) + (duration.nanoseconds / NANOS_PER_MILLI);
+    }
+
+    /**
+     * Rounds a time down to the closest multiple of a duration.
+     *
+     * @param timeInNanos the time of day in nanoseconds
+     * @param duration the duration
+     * @return the time rounded down to the closest multiple of the duration
+     */
+    public static long floorTime(long timeInNanos, Duration duration)
+    {
+        checkFalse(duration.isNegative(), "Negative durations are not supported by the floor function");
+        checkFalse(duration.getMonths() != 0 || duration.getDays() != 0 || duration.getNanoseconds() > (NANOS_PER_HOUR * 24),
+                   "For time values, the floor can only be computed for durations smaller that a day");
+
+        if (duration.nanoseconds == 0)
+            return timeInNanos;
+
+        long delta = timeInNanos % duration.nanoseconds;
+        return timeInNanos - delta;
+    }
+
+    /**
+     * Checks if the duration is negative.
+     * @return {@code true} if the duration is negative, {@code false} otherwise
+     */
+    public boolean isNegative()
+    {
+        return nanoseconds < 0 || days < 0 || months < 0;
+    }
+
     private static class Builder
     {
         /**
diff --git a/src/java/org/apache/cassandra/cql3/Lists.java b/src/java/org/apache/cassandra/cql3/Lists.java
index 1d94d69..bdac046 100644
--- a/src/java/org/apache/cassandra/cql3/Lists.java
+++ b/src/java/org/apache/cassandra/cql3/Lists.java
@@ -18,6 +18,8 @@
 package org.apache.cassandra.cql3;
 
 import static org.apache.cassandra.cql3.Constants.UNSET_VALUE;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.TimeUUID.Generator.atUnixMillisAsBytes;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -28,6 +30,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.ByteBufferAccessor;
 import org.apache.cassandra.schema.ColumnMetadata;
 import com.google.common.annotations.VisibleForTesting;
@@ -43,7 +46,6 @@
 import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
 
 /**
  * Static helper methods and classes for lists.
@@ -359,7 +361,7 @@
                 else
                 {
                     // in addition to being at the same millisecond, we handle the unexpected case of the millis parameter
-                    // being in the past. That could happen if the System.currentTimeMillis() not operating montonically
+                    // being in the past. That could happen if the Global.currentTimeMillis() not operating montonically
                     // or if one thread is just a really big loser in the compareAndSet game of life.
                     long millisToUse = millis <= current.millis ? millis : current.millis;
 
@@ -447,6 +449,9 @@
             // we should not get here for frozen lists
             assert column.type.isMultiCell() : "Attempted to set an individual element on a frozen list";
 
+            Guardrails.readBeforeWriteListOperationsEnabled
+            .ensureEnabled("Setting of list items by index requiring read before write", params.clientState);
+
             ByteBuffer index = idx.bindAndGet(params.options);
             ByteBuffer value = t.bindAndGet(params.options);
 
@@ -487,26 +492,43 @@
 
         static void doAppend(Term.Terminal value, ColumnMetadata column, UpdateParameters params) throws InvalidRequestException
         {
-            if (column.type.isMultiCell())
+            if (value == null)
             {
+                // for frozen lists, we're overwriting the whole cell value
+                if (!column.type.isMultiCell())
+                    params.addTombstone(column);
+
                 // If we append null, do nothing. Note that for Setter, we've
                 // already removed the previous value so we're good here too
-                if (value == null)
+                return;
+            }
+
+            List<ByteBuffer> elements = ((Value) value).elements;
+
+            if (column.type.isMultiCell())
+            {
+                if (elements.size() == 0)
                     return;
 
-                for (ByteBuffer buffer : ((Value) value).elements)
+                // Guardrails about collection size are only checked for the added elements without considering
+                // already existent elements. This is done so to avoid read-before-write, having additional checks
+                // during SSTable write.
+                Guardrails.itemsPerCollection.guard(elements.size(), column.name.toString(), false, params.clientState);
+
+                int dataSize = 0;
+                for (ByteBuffer buffer : elements)
                 {
-                    ByteBuffer uuid = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes());
-                    params.addCell(column, CellPath.create(uuid), buffer);
+                    ByteBuffer uuid = ByteBuffer.wrap(params.nextTimeUUIDAsBytes());
+                    Cell<?> cell = params.addCell(column, CellPath.create(uuid), buffer);
+                    dataSize += cell.dataSize();
                 }
+                Guardrails.collectionSize.guard(dataSize, column.name.toString(), false, params.clientState);
             }
             else
             {
-                // for frozen lists, we're overwriting the whole cell value
-                if (value == null)
-                    params.addTombstone(column);
-                else
-                    params.addCell(column, value.get(ProtocolVersion.CURRENT));
+                Guardrails.itemsPerCollection.guard(elements.size(), column.name.toString(), false, params.clientState);
+                Cell<?> cell = params.addCell(column, value.get(ProtocolVersion.CURRENT));
+                Guardrails.collectionSize.guard(cell.dataSize(), column.name.toString(), false, params.clientState);
             }
         }
     }
@@ -536,12 +558,13 @@
             {
                 if (remainingInBatch == 0)
                 {
-                    long time = PrecisionTime.REFERENCE_TIME - (System.currentTimeMillis() - PrecisionTime.REFERENCE_TIME);
+                    long time = PrecisionTime.REFERENCE_TIME - (currentTimeMillis() - PrecisionTime.REFERENCE_TIME);
                     remainingInBatch = Math.min(PrecisionTime.MAX_NANOS, i) + 1;
                     pt = PrecisionTime.getNext(time, remainingInBatch);
                 }
 
-                ByteBuffer uuid = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(pt.millis, (pt.nanos + remainingInBatch--)));
+                // TODO: is this safe as part of LWTs?
+                ByteBuffer uuid = ByteBuffer.wrap(atUnixMillisAsBytes(pt.millis, (pt.nanos + remainingInBatch--)));
                 params.addCell(column, CellPath.create(uuid), toAdd.get(i));
             }
         }
@@ -564,6 +587,9 @@
         {
             assert column.type.isMultiCell() : "Attempted to delete from a frozen list";
 
+            Guardrails.readBeforeWriteListOperationsEnabled
+            .ensureEnabled("Removal of list items requiring read before write", params.clientState);
+
             // We want to call bind before possibly returning to reject queries where the value provided is not a list.
             Term.Terminal value = t.bind(params.options);
 
@@ -601,6 +627,10 @@
         public void execute(DecoratedKey partitionKey, UpdateParameters params) throws InvalidRequestException
         {
             assert column.type.isMultiCell() : "Attempted to delete an item by index from a frozen list";
+
+            Guardrails.readBeforeWriteListOperationsEnabled
+            .ensureEnabled("Removal of list items by index requiring read before write", params.clientState);
+
             Term.Terminal index = t.bind(params.options);
             if (index == null)
                 throw new InvalidRequestException("Invalid null value for list index");
diff --git a/src/java/org/apache/cassandra/cql3/Maps.java b/src/java/org/apache/cassandra/cql3/Maps.java
index 3a9575c..a2d23a6 100644
--- a/src/java/org/apache/cassandra/cql3/Maps.java
+++ b/src/java/org/apache/cassandra/cql3/Maps.java
@@ -23,6 +23,7 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.DecoratedKey;
@@ -422,22 +423,40 @@
 
         static void doPut(Term.Terminal value, ColumnMetadata column, UpdateParameters params) throws InvalidRequestException
         {
+            if (value == null)
+            {
+                // for frozen maps, we're overwriting the whole cell
+                if (!column.type.isMultiCell())
+                    params.addTombstone(column);
+
+                return;
+            }
+
+            SortedMap<ByteBuffer, ByteBuffer> elements = ((Value) value).map;
+
             if (column.type.isMultiCell())
             {
-                if (value == null)
+                if (elements.size() == 0)
                     return;
 
-                SortedMap<ByteBuffer, ByteBuffer> elements = ((Value) value).map;
+                // Guardrails about collection size are only checked for the added elements without considering
+                // already existent elements. This is done so to avoid read-before-write, having additional checks
+                // during SSTable write.
+                Guardrails.itemsPerCollection.guard(elements.size(), column.name.toString(), false, params.clientState);
+
+                int dataSize = 0;
                 for (Map.Entry<ByteBuffer, ByteBuffer> entry : elements.entrySet())
-                    params.addCell(column, CellPath.create(entry.getKey()), entry.getValue());
+                {
+                    Cell<?> cell = params.addCell(column, CellPath.create(entry.getKey()), entry.getValue());
+                    dataSize += cell.dataSize();
+                }
+                Guardrails.collectionSize.guard(dataSize, column.name.toString(), false, params.clientState);
             }
             else
             {
-                // for frozen maps, we're overwriting the whole cell
-                if (value == null)
-                    params.addTombstone(column);
-                else
-                    params.addCell(column, value.get(ProtocolVersion.CURRENT));
+                Guardrails.itemsPerCollection.guard(elements.size(), column.name.toString(), false, params.clientState);
+                Cell<?> cell = params.addCell(column, value.get(ProtocolVersion.CURRENT));
+                Guardrails.collectionSize.guard(cell.dataSize(), column.name.toString(), false, params.clientState);
             }
         }
     }
diff --git a/src/java/org/apache/cassandra/cql3/Operation.java b/src/java/org/apache/cassandra/cql3/Operation.java
index d52d10e..51f5d13 100644
--- a/src/java/org/apache/cassandra/cql3/Operation.java
+++ b/src/java/org/apache/cassandra/cql3/Operation.java
@@ -97,7 +97,7 @@
      * This can be one of:
      *   - Setting a value: c = v
      *   - Setting an element of a collection: c[x] = v
-     *   - An addition/subtraction to a variable: c = c +/- v (where v can be a collection literal)
+     *   - An addition/subtraction to a variable: c = c +/- v (where v can be a collection literal, scalar, or string)
      *   - An prepend operation: c = v + c
      */
     public interface RawUpdate
@@ -112,9 +112,11 @@
          *
          * @param metadata
          * @param receiver the column this operation applies to.
+         * @param canReadExistingState whether the update depends on existing state
+         *                 
          * @return the prepared update operation.
          */
-        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver) throws InvalidRequestException;
+        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException;
 
         /**
          * @return whether this operation can be applied alongside the {@code
@@ -161,7 +163,7 @@
             this.value = value;
         }
 
-        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver) throws InvalidRequestException
+        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException
         {
             Term v = value.prepare(metadata.keyspace, receiver);
 
@@ -213,7 +215,7 @@
             this.value = value;
         }
 
-        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver) throws InvalidRequestException
+        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException
         {
             if (!(receiver.type instanceof CollectionType))
                 throw new InvalidRequestException(String.format("Invalid operation (%s) for non collection column %s", toString(receiver), receiver.name));
@@ -260,7 +262,7 @@
             this.value = value;
         }
 
-        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver) throws InvalidRequestException
+        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException
         {
             if (!receiver.type.isUDT())
                 throw new InvalidRequestException(String.format("Invalid operation (%s) for non-UDT column %s", toString(receiver), receiver.name));
@@ -298,15 +300,23 @@
             this.value = value;
         }
 
-        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver) throws InvalidRequestException
+        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException
         {
             if (!(receiver.type instanceof CollectionType))
             {
                 if (receiver.type instanceof TupleType)
                     throw new InvalidRequestException(String.format("Invalid operation (%s) for tuple column %s", toString(receiver), receiver.name));
 
-                if (!(receiver.type instanceof CounterColumnType))
-                    throw new InvalidRequestException(String.format("Invalid operation (%s) for non counter column %s", toString(receiver), receiver.name));
+                if (canReadExistingState)
+                {
+                    if (!(receiver.type instanceof NumberType<?>) && !(receiver.type instanceof StringType))
+                        throw new InvalidRequestException(String.format("Invalid operation (%s) for non-numeric and non-text type %s", toString(receiver), receiver.name));
+                }
+                else
+                {
+                    if (!(receiver.type instanceof CounterColumnType))
+                        throw new InvalidRequestException(String.format("Invalid operation (%s) for non counter column %s", toString(receiver), receiver.name));
+                }
                 return new Constants.Adder(receiver, value.prepare(metadata.keyspace, receiver));
             }
             else if (!(receiver.type.isMultiCell()))
@@ -354,7 +364,7 @@
             this.value = value;
         }
 
-        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver) throws InvalidRequestException
+        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException
         {
             if (!(receiver.type instanceof CollectionType))
             {
@@ -411,7 +421,7 @@
             this.value = value;
         }
 
-        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver) throws InvalidRequestException
+        public Operation prepare(TableMetadata metadata, ColumnMetadata receiver, boolean canReadExistingState) throws InvalidRequestException
         {
             Term v = value.prepare(metadata.keyspace, receiver);
 
diff --git a/src/java/org/apache/cassandra/cql3/Operator.java b/src/java/org/apache/cassandra/cql3/Operator.java
index 1acedee..bcb5f63 100644
--- a/src/java/org/apache/cassandra/cql3/Operator.java
+++ b/src/java/org/apache/cassandra/cql3/Operator.java
@@ -26,6 +26,7 @@
 import java.util.Set;
 
 import org.apache.cassandra.db.marshal.*;
+import org.apache.cassandra.serializers.ListSerializer;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 public enum Operator
@@ -110,8 +111,8 @@
 
         public boolean isSatisfiedBy(AbstractType<?> type, ByteBuffer leftOperand, ByteBuffer rightOperand)
         {
-            List<?> inValues = ListType.getInstance(type, false).getSerializer().deserialize(rightOperand);
-            return inValues.contains(type.getSerializer().deserialize(leftOperand));
+            ListSerializer<?> serializer = ListType.getInstance(type, false).getSerializer();
+            return serializer.anyMatch(rightOperand, r -> type.compareForCQL(leftOperand, r) == 0);
         }
     },
     CONTAINS(5)
@@ -339,4 +340,22 @@
     {
         return this == IN;
     }
+
+    /**
+     * Checks if this operator is CONTAINS operator.
+     * @return {@code true} if this operator is a CONTAINS operator, {@code false} otherwise.
+     */
+    public boolean isContains()
+    {
+        return this == CONTAINS;
+    }
+
+    /**
+     * Checks if this operator is CONTAINS KEY operator.
+     * @return {@code true} if this operator is a CONTAINS operator, {@code false} otherwise.
+     */
+    public boolean isContainsKey()
+    {
+        return this == CONTAINS_KEY;
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/PasswordObfuscator.java b/src/java/org/apache/cassandra/cql3/PasswordObfuscator.java
index 89962f9..8e18f34 100644
--- a/src/java/org/apache/cassandra/cql3/PasswordObfuscator.java
+++ b/src/java/org/apache/cassandra/cql3/PasswordObfuscator.java
@@ -18,7 +18,7 @@
 
 package org.apache.cassandra.cql3;
 
-import com.google.common.base.Optional;
+import java.util.Optional;
 
 import org.apache.cassandra.auth.PasswordAuthenticator;
 import org.apache.cassandra.auth.RoleOptions;
@@ -63,9 +63,15 @@
 
         Optional<String> pass = opts.getPassword();
         if (!pass.isPresent() || pass.get().isEmpty())
+            pass = opts.getHashedPassword();
+        if (!pass.isPresent() || pass.get().isEmpty())
             return query;
 
-        // match new line, case insensitive (?si), and PASSWORD_TOKEN up to the actual password greedy. Group that and replace the password
-        return query.replaceAll("((?si)"+ PASSWORD_TOKEN + ".+?)" + pass.get(), "$1" + PasswordObfuscator.OBFUSCATION_TOKEN);
+        // Regular expression:
+        //  - Match new line and case insensitive (?si), and PASSWORD_TOKEN with greedy mode up to the start of the actual password and group it.
+        //  - Quote the password between \Q and \E so any potential special characters are ignored
+        //  - Replace the match with the grouped data + the obfuscated token
+        return query.replaceAll("((?si)"+ PASSWORD_TOKEN + ".+?)\\Q" + pass.get() + "\\E",
+                                "$1" + PasswordObfuscator.OBFUSCATION_TOKEN);
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/QueryOptions.java b/src/java/org/apache/cassandra/cql3/QueryOptions.java
index d3b1a03..a286aed 100644
--- a/src/java/org/apache/cassandra/cql3/QueryOptions.java
+++ b/src/java/org/apache/cassandra/cql3/QueryOptions.java
@@ -24,6 +24,8 @@
 
 import io.netty.buffer.ByteBuf;
 
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.marshal.UTF8Type;
@@ -59,6 +61,11 @@
         return new DefaultQueryOptions(consistency, values, false, SpecificOptions.DEFAULT, ProtocolVersion.V3);
     }
 
+    public static QueryOptions forInternalCallsWithNowInSec(int nowInSec, ConsistencyLevel consistency, List<ByteBuffer> values)
+    {
+        return new DefaultQueryOptions(consistency, values, false, SpecificOptions.DEFAULT.withNowInSec(nowInSec), ProtocolVersion.CURRENT);
+    }
+
     public static QueryOptions forInternalCalls(List<ByteBuffer> values)
     {
         return new DefaultQueryOptions(ConsistencyLevel.ONE, values, false, SpecificOptions.DEFAULT, ProtocolVersion.V3);
@@ -208,6 +215,12 @@
     /** The keyspace that this query is bound to, or null if not relevant. */
     public String getKeyspace() { return getSpecificOptions().keyspace; }
 
+    public int getNowInSec(int ifNotSet)
+    {
+        int nowInSec = getSpecificOptions().nowInSeconds;
+        return nowInSec != Integer.MIN_VALUE ? nowInSec : ifNotSet;
+    }
+
     /**
      * The protocol version for the query.
      */
@@ -216,11 +229,98 @@
     // Mainly for the sake of BatchQueryOptions
     abstract SpecificOptions getSpecificOptions();
 
+    abstract ReadThresholds getReadThresholds();
+
+    public boolean isReadThresholdsEnabled()
+    {
+        return getReadThresholds().isEnabled();
+    }
+
+    public long getCoordinatorReadSizeWarnThresholdBytes()
+    {
+        return getReadThresholds().getCoordinatorReadSizeWarnThresholdBytes();
+    }
+
+    public long getCoordinatorReadSizeAbortThresholdBytes()
+    {
+        return getReadThresholds().getCoordinatorReadSizeFailThresholdBytes();
+    }
+
     public QueryOptions prepare(List<ColumnSpecification> specs)
     {
         return this;
     }
 
+    interface ReadThresholds
+    {
+        boolean isEnabled();
+
+        long getCoordinatorReadSizeWarnThresholdBytes();
+
+        long getCoordinatorReadSizeFailThresholdBytes();
+
+        static ReadThresholds create()
+        {
+            // if daemon initialization hasn't happened yet (very common in tests) then ignore
+            if (!DatabaseDescriptor.isDaemonInitialized() || !DatabaseDescriptor.getReadThresholdsEnabled())
+                return DisabledReadThresholds.INSTANCE;
+            return new DefaultReadThresholds(DatabaseDescriptor.getCoordinatorReadSizeWarnThreshold(), DatabaseDescriptor.getCoordinatorReadSizeFailThreshold());
+        }
+    }
+
+    private enum DisabledReadThresholds implements ReadThresholds
+    {
+        INSTANCE;
+
+        @Override
+        public boolean isEnabled()
+        {
+            return false;
+        }
+
+        @Override
+        public long getCoordinatorReadSizeWarnThresholdBytes()
+        {
+            return -1;
+        }
+
+        @Override
+        public long getCoordinatorReadSizeFailThresholdBytes()
+        {
+            return -1;
+        }
+    }
+
+    private static class DefaultReadThresholds implements ReadThresholds
+    {
+        private final long warnThresholdBytes;
+        private final long abortThresholdBytes;
+
+        public DefaultReadThresholds(DataStorageSpec.LongBytesBound warnThreshold, DataStorageSpec.LongBytesBound abortThreshold)
+        {
+            this.warnThresholdBytes = warnThreshold == null ? -1 : warnThreshold.toBytes();
+            this.abortThresholdBytes = abortThreshold == null ? -1 : abortThreshold.toBytes();
+        }
+
+        @Override
+        public boolean isEnabled()
+        {
+            return true;
+        }
+
+        @Override
+        public long getCoordinatorReadSizeWarnThresholdBytes()
+        {
+            return warnThresholdBytes;
+        }
+
+        @Override
+        public long getCoordinatorReadSizeFailThresholdBytes()
+        {
+            return abortThresholdBytes;
+        }
+    }
+
     static class DefaultQueryOptions extends QueryOptions
     {
         private final ConsistencyLevel consistency;
@@ -230,6 +330,7 @@
         private final SpecificOptions options;
 
         private final transient ProtocolVersion protocolVersion;
+        private final transient ReadThresholds readThresholds = ReadThresholds.create();
 
         DefaultQueryOptions(ConsistencyLevel consistency, List<ByteBuffer> values, boolean skipMetadata, SpecificOptions options, ProtocolVersion protocolVersion)
         {
@@ -264,6 +365,12 @@
         {
             return options;
         }
+
+        @Override
+        ReadThresholds getReadThresholds()
+        {
+            return readThresholds;
+        }
     }
 
     static class QueryOptionsWrapper extends QueryOptions
@@ -301,6 +408,12 @@
         }
 
         @Override
+        ReadThresholds getReadThresholds()
+        {
+            return wrapped.getReadThresholds();
+        }
+
+        @Override
         public QueryOptions prepare(List<ColumnSpecification> specs)
         {
             wrapped.prepare(specs);
@@ -400,6 +513,11 @@
             this.keyspace = keyspace;
             this.nowInSeconds = nowInSeconds;
         }
+
+        public SpecificOptions withNowInSec(int nowInSec)
+        {
+            return new SpecificOptions(pageSize, state, serialConsistency, timestamp, keyspace, nowInSec);
+        }
     }
 
     private static class Codec implements CBCodec<QueryOptions>
diff --git a/src/java/org/apache/cassandra/cql3/QueryProcessor.java b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
index 66ce2ef..1e2d0db 100644
--- a/src/java/org/apache/cassandra/cql3/QueryProcessor.java
+++ b/src/java/org/apache/cassandra/cql3/QueryProcessor.java
@@ -23,6 +23,7 @@
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import com.github.benmanes.caffeine.cache.Cache;
 import com.github.benmanes.caffeine.cache.Caffeine;
@@ -30,22 +31,32 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.*;
 import com.google.common.primitives.Ints;
-import com.google.common.util.concurrent.MoreExecutors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.antlr.runtime.*;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterators;
+import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.metrics.ClientRequestMetrics;
 import org.apache.cassandra.metrics.ClientRequestsMetricsHolder;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaChangeListener;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.cql3.functions.UDAggregate;
+import org.apache.cassandra.cql3.functions.UDFunction;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.cql3.functions.FunctionName;
+import org.apache.cassandra.cql3.selection.ResultSetBuilder;
 import org.apache.cassandra.cql3.statements.*;
 import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.db.rows.RowIterator;
 import org.apache.cassandra.db.partitions.PartitionIterator;
 import org.apache.cassandra.db.partitions.PartitionIterators;
@@ -59,13 +70,16 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.*;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.ENABLE_NODELOCAL_QUERIES;
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class QueryProcessor implements QueryHandler
 {
-    public static final CassandraVersion CQL_VERSION = new CassandraVersion("3.4.5");
+    public static final CassandraVersion CQL_VERSION = new CassandraVersion("3.4.6");
 
     // See comments on QueryProcessor #prepare
     public static final CassandraVersion NEW_PREPARED_STATEMENT_BEHAVIOUR_SINCE_30 = new CassandraVersion("3.0.26");
@@ -91,8 +105,8 @@
     static
     {
         preparedStatements = Caffeine.newBuilder()
-                             .executor(MoreExecutors.directExecutor())
-                             .maximumWeight(capacityToBytes(DatabaseDescriptor.getPreparedStatementsCacheSizeMB()))
+                             .executor(ImmediateExecutor.INSTANCE)
+                             .maximumWeight(capacityToBytes(DatabaseDescriptor.getPreparedStatementsCacheSizeMiB()))
                              .weigher(QueryProcessor::measure)
                              .removalListener((key, prepared, cause) -> {
                                  MD5Digest md5Digest = (MD5Digest) key;
@@ -107,13 +121,13 @@
         ScheduledExecutors.scheduledTasks.scheduleAtFixedRate(() -> {
             long count = lastMinuteEvictionsCount.getAndSet(0);
             if (count > 0)
-                logger.warn("{} prepared statements discarded in the last minute because cache limit reached ({} MB)",
+                logger.warn("{} prepared statements discarded in the last minute because cache limit reached ({} MiB)",
                             count,
-                            DatabaseDescriptor.getPreparedStatementsCacheSizeMB());
+                            DatabaseDescriptor.getPreparedStatementsCacheSizeMiB());
         }, 1, 1, TimeUnit.MINUTES);
 
-        logger.info("Initialized prepared statement caches with {} MB",
-                    DatabaseDescriptor.getPreparedStatementsCacheSizeMB());
+        logger.info("Initialized prepared statement caches with {} MiB",
+                    DatabaseDescriptor.getPreparedStatementsCacheSizeMiB());
     }
 
     private static long capacityToBytes(long cacheSizeMB)
@@ -264,14 +278,14 @@
         ClientRequestMetrics  levelMetrics = ClientRequestsMetricsHolder.writeMetricsForLevel(ConsistencyLevel.NODE_LOCAL);
         ClientRequestMetrics globalMetrics = ClientRequestsMetricsHolder.writeMetrics;
 
-        long startTime = System.nanoTime();
+        long startTime = nanoTime();
         try
         {
             return statement.executeLocally(queryState, options);
         }
         finally
         {
-            long latency = System.nanoTime() - startTime;
+            long latency = nanoTime() - startTime;
              levelMetrics.addNano(latency);
             globalMetrics.addNano(latency);
         }
@@ -289,14 +303,14 @@
             throw new IsBootstrappingException();
         }
 
-        long startTime = System.nanoTime();
+        long startTime = nanoTime();
         try
         {
             return statement.executeLocally(queryState, options);
         }
         finally
         {
-            long latency = System.nanoTime() - startTime;
+            long latency = nanoTime() - startTime;
              levelMetrics.addNano(latency);
             globalMetrics.addNano(latency);
         }
@@ -352,7 +366,7 @@
         QueryState queryState = QueryState.forInternalCalls();
         QueryOptions options = QueryOptions.forInternalCalls(cl, values);
         CQLStatement statement = instance.parse(query, queryState, options);
-        ResultMessage result = instance.process(statement, queryState, options, System.nanoTime());
+        ResultMessage result = instance.process(statement, queryState, options, nanoTime());
         if (result instanceof ResultMessage.Rows)
             return UntypedResultSet.create(((ResultMessage.Rows)result).result);
         else
@@ -367,6 +381,16 @@
 
     private static QueryOptions makeInternalOptions(CQLStatement prepared, Object[] values, ConsistencyLevel cl)
     {
+        return makeInternalOptionsWithNowInSec(prepared, FBUtilities.nowInSeconds(), values, cl);
+    }
+
+    public static QueryOptions makeInternalOptionsWithNowInSec(CQLStatement prepared, int nowInSec, Object[] values)
+    {
+        return makeInternalOptionsWithNowInSec(prepared, nowInSec, values, ConsistencyLevel.ONE);
+    }
+
+    private static QueryOptions makeInternalOptionsWithNowInSec(CQLStatement prepared, int nowInSec, Object[] values, ConsistencyLevel cl)
+    {
         if (prepared.getBindVariables().size() != values.length)
             throw new IllegalArgumentException(String.format("Invalid number of values. Expecting %d but got %d", prepared.getBindVariables().size(), values.length));
 
@@ -374,10 +398,10 @@
         for (int i = 0; i < values.length; i++)
         {
             Object value = values[i];
-            AbstractType type = prepared.getBindVariables().get(i).type;
-            boundValues.add(value instanceof ByteBuffer || value == null ? (ByteBuffer)value : type.decompose(value));
+            AbstractType<?> type = prepared.getBindVariables().get(i).type;
+            boundValues.add(value instanceof ByteBuffer || value == null ? (ByteBuffer)value : type.decomposeUntyped(value));
         }
-        return QueryOptions.forInternalCalls(cl, boundValues);
+        return QueryOptions.forInternalCallsWithNowInSec(nowInSec, cl, boundValues);
     }
 
     public static Prepared prepareInternal(String query) throws RequestValidationException
@@ -427,19 +451,84 @@
             return null;
     }
 
+    public static Future<UntypedResultSet> executeAsync(InetAddressAndPort address, String query, Object... values)
+    {
+        Prepared prepared = prepareInternal(query);
+        int nowInSec = FBUtilities.nowInSeconds();
+        QueryOptions options = makeInternalOptionsWithNowInSec(prepared.statement, nowInSec, values);
+        if (prepared.statement instanceof SelectStatement)
+        {
+            SelectStatement select = (SelectStatement) prepared.statement;
+            ReadQuery readQuery = select.getQuery(options, nowInSec);
+            List<ReadCommand> commands;
+            if (readQuery instanceof ReadCommand)
+            {
+                commands = Collections.singletonList((ReadCommand) readQuery);
+            }
+            else if (readQuery instanceof SinglePartitionReadQuery.Group)
+            {
+                List<? extends SinglePartitionReadQuery> queries = ((SinglePartitionReadQuery.Group<? extends SinglePartitionReadQuery>) readQuery).queries;
+                queries.forEach(a -> {
+                    if (!(a instanceof ReadCommand))
+                        throw new IllegalArgumentException("Queries found which are not ReadCommand: " + a.getClass());
+                });
+                commands = (List<ReadCommand>) (List<?>) queries;
+            }
+            else
+            {
+                throw new IllegalArgumentException("Unable to handle; only expected ReadCommands but given " + readQuery.getClass());
+            }
+            Future<List<Message<ReadResponse>>> future = FutureCombiner.allOf(commands.stream()
+                                                                                      .map(rc -> Message.out(rc.verb(), rc))
+                                                                                      .map(m -> MessagingService.instance().<ReadResponse>sendWithResult(m, address))
+                                                                                      .collect(Collectors.toList()));
+
+            ResultSetBuilder result = new ResultSetBuilder(select.getResultMetadata(), select.getSelection().newSelectors(options), null);
+            return future.map(list -> {
+                int i = 0;
+                for (Message<ReadResponse> m : list)
+                {
+                    ReadResponse rsp = m.payload;
+                    try (PartitionIterator it = UnfilteredPartitionIterators.filter(rsp.makeIterator(commands.get(i++)), nowInSec))
+                    {
+                        while (it.hasNext())
+                        {
+                            try (RowIterator partition = it.next())
+                            {
+                                select.processPartition(partition, options, result, nowInSec);
+                            }
+                        }
+                    }
+                }
+                return result.build();
+            }).map(UntypedResultSet::create);
+        }
+        throw new IllegalArgumentException("Unable to execute query; only SELECT supported but given: " + query);
+    }
+
     public static UntypedResultSet execute(String query, ConsistencyLevel cl, Object... values)
     throws RequestExecutionException
     {
         return execute(query, cl, internalQueryState(), values);
     }
 
+    public static UntypedResultSet executeInternalWithNowInSec(String query, int nowInSec, Object... values)
+    {
+        Prepared prepared = prepareInternal(query);
+        ResultMessage result = prepared.statement.executeLocally(internalQueryState(), makeInternalOptionsWithNowInSec(prepared.statement, nowInSec, values));
+        if (result instanceof ResultMessage.Rows)
+            return UntypedResultSet.create(((ResultMessage.Rows)result).result);
+        else
+            return null;
+    }
+
     public static UntypedResultSet execute(String query, ConsistencyLevel cl, QueryState state, Object... values)
     throws RequestExecutionException
     {
         try
         {
             Prepared prepared = prepareInternal(query);
-            ResultMessage result = prepared.statement.execute(state, makeInternalOptions(prepared.statement, values, cl), System.nanoTime());
+            ResultMessage result = prepared.statement.execute(state, makeInternalOptionsWithNowInSec(prepared.statement, state.getNowInSeconds(), values, cl), nanoTime());
             if (result instanceof ResultMessage.Rows)
                 return UntypedResultSet.create(((ResultMessage.Rows)result).result);
             else
@@ -458,7 +547,8 @@
             throw new IllegalArgumentException("Only SELECTs can be paged");
 
         SelectStatement select = (SelectStatement)prepared.statement;
-        QueryPager pager = select.getQuery(makeInternalOptions(prepared.statement, values), FBUtilities.nowInSeconds()).getPager(null, ProtocolVersion.CURRENT);
+        int nowInSec = FBUtilities.nowInSeconds();
+        QueryPager pager = select.getQuery(makeInternalOptionsWithNowInSec(prepared.statement, nowInSec, values), nowInSec).getPager(null, ProtocolVersion.CURRENT);
         return UntypedResultSet.create(select, pager, pageSize);
     }
 
@@ -486,7 +576,7 @@
     {
         CQLStatement statement = parseStatement(query, queryState.getClientState());
         statement.validate(queryState.getClientState());
-        ResultMessage result = statement.executeLocally(queryState, makeInternalOptions(statement, values));
+        ResultMessage result = statement.executeLocally(queryState, makeInternalOptionsWithNowInSec(statement, queryState.getNowInSeconds(), values));
         if (result instanceof ResultMessage.Rows)
             return UntypedResultSet.create(((ResultMessage.Rows)result).result);
         else
@@ -503,11 +593,24 @@
         Prepared prepared = prepareInternal(query);
         assert prepared.statement instanceof SelectStatement;
         SelectStatement select = (SelectStatement)prepared.statement;
-        ResultMessage result = select.executeInternal(internalQueryState(), makeInternalOptions(prepared.statement, values), nowInSec, queryStartNanoTime);
+        ResultMessage result = select.executeInternal(internalQueryState(), makeInternalOptionsWithNowInSec(prepared.statement, nowInSec, values), nowInSec, queryStartNanoTime);
         assert result instanceof ResultMessage.Rows;
         return UntypedResultSet.create(((ResultMessage.Rows)result).result);
     }
 
+    /**
+     * A special version of executeInternal that takes the time used as "now" for the query in argument.
+     * Note that this only make sense for Selects so this only accept SELECT statements and is only useful in rare
+     * cases.
+     */
+    public static Map<DecoratedKey, List<Row>> executeInternalRawWithNow(int nowInSec, String query, Object... values)
+    {
+        Prepared prepared = prepareInternal(query);
+        assert prepared.statement instanceof SelectStatement;
+        SelectStatement select = (SelectStatement) prepared.statement;
+        return select.executeRawInternal(makeInternalOptionsWithNowInSec(prepared.statement, nowInSec, values), internalQueryState().getClientState(), nowInSec);
+    }
+
     public static UntypedResultSet resultify(String query, RowIterator partition)
     {
         return resultify(query, PartitionIterators.singletonIterator(partition));
@@ -565,7 +668,7 @@
      *
      * The correct combination to return is 2/3 - the problem is during upgrades (assuming upgrading from < 3.0.26)
      * - Existing clients have hash 1 or 3
-     * - Query prepared on a 3.0.25/3.11.12/4.0.2 instance needs to return hash 1/3 to be able to execute it on a 3.0.25 instance
+     * - Query prepared on a 3.0.26/3.11.12/4.0.2 instance needs to return hash 1/3 to be able to execute it on a 3.0.25 instance
      * - This is handled by the useNewPreparedStatementBehaviour flag - while there still are 3.0.25 instances in
      *   the cluster we always return hash 1/3
      * - Once fully upgraded we start returning hash 2/3, this will cause a prepared statement id mismatch for existing
@@ -676,10 +779,10 @@
         // (if the keyspace is null, queryString has to have a fully-qualified keyspace so it's fine.
         long statementSize = ObjectSizes.measureDeep(prepared.statement);
         // don't execute the statement if it's bigger than the allowed threshold
-        if (statementSize > capacityToBytes(DatabaseDescriptor.getPreparedStatementsCacheSizeMB()))
+        if (statementSize > capacityToBytes(DatabaseDescriptor.getPreparedStatementsCacheSizeMiB()))
             throw new InvalidRequestException(String.format("Prepared statement of size %d bytes is larger than allowed maximum of %d MB: %s...",
                                                             statementSize,
-                                                            DatabaseDescriptor.getPreparedStatementsCacheSizeMB(),
+                                                            DatabaseDescriptor.getPreparedStatementsCacheSizeMiB(),
                                                             queryString.substring(0, 200)));
         MD5Digest statementId = computeId(queryString, keyspace);
         Prepared previous = preparedStatements.get(statementId, (ignored_) -> prepared);
@@ -817,7 +920,7 @@
         preparedStatements.asMap().clear();
     }
 
-    private static class StatementInvalidatingListener extends SchemaChangeListener
+    private static class StatementInvalidatingListener implements SchemaChangeListener
     {
         private static void removeInvalidPreparedStatements(String ksName, String cfName)
         {
@@ -877,13 +980,13 @@
             {
                 ModificationStatement modificationStatement = ((ModificationStatement) statement);
                 statementKsName = modificationStatement.keyspace();
-                statementCfName = modificationStatement.columnFamily();
+                statementCfName = modificationStatement.table();
             }
             else if (statement instanceof SelectStatement)
             {
                 SelectStatement selectStatement = ((SelectStatement) statement);
                 statementKsName = selectStatement.keyspace();
-                statementCfName = selectStatement.columnFamily();
+                statementCfName = selectStatement.table();
             }
             else if (statement instanceof BatchStatement)
             {
@@ -903,14 +1006,16 @@
             return ksName.equals(statementKsName) && (cfName == null || cfName.equals(statementCfName));
         }
 
-        public void onCreateFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onCreateFunction(UDFunction function)
         {
-            onCreateFunctionInternal(ksName, functionName, argTypes);
+            onCreateFunctionInternal(function.name().keyspace, function.name().name, function.argTypes());
         }
 
-        public void onCreateAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onCreateAggregate(UDAggregate aggregate)
         {
-            onCreateFunctionInternal(ksName, aggregateName, argTypes);
+            onCreateFunctionInternal(aggregate.name().keyspace, aggregate.name().name, aggregate.argTypes());
         }
 
         private static void onCreateFunctionInternal(String ksName, String functionName, List<AbstractType<?>> argTypes)
@@ -921,51 +1026,58 @@
                 removeInvalidPreparedStatementsForFunction(ksName, functionName);
         }
 
-        public void onAlterTable(String ksName, String cfName, boolean affectsStatements)
+        @Override
+        public void onAlterTable(TableMetadata before, TableMetadata after, boolean affectsStatements)
         {
-            logger.trace("Column definitions for {}.{} changed, invalidating related prepared statements", ksName, cfName);
+            logger.trace("Column definitions for {}.{} changed, invalidating related prepared statements", before.keyspace, before.name);
             if (affectsStatements)
-                removeInvalidPreparedStatements(ksName, cfName);
+                removeInvalidPreparedStatements(before.keyspace, before.name);
         }
 
-        public void onAlterFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onAlterFunction(UDFunction before, UDFunction after)
         {
             // Updating a function may imply we've changed the body of the function, so we need to invalid statements so that
             // the new definition is picked (the function is resolved at preparation time).
             // TODO: if the function has multiple overload, we could invalidate only the statement refering to the overload
             // that was updated. This requires a few changes however and probably doesn't matter much in practice.
-            removeInvalidPreparedStatementsForFunction(ksName, functionName);
+            removeInvalidPreparedStatementsForFunction(before.name().keyspace, before.name().name);
         }
 
-        public void onAlterAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onAlterAggregate(UDAggregate before, UDAggregate after)
         {
             // Updating a function may imply we've changed the body of the function, so we need to invalid statements so that
             // the new definition is picked (the function is resolved at preparation time).
             // TODO: if the function has multiple overload, we could invalidate only the statement refering to the overload
             // that was updated. This requires a few changes however and probably doesn't matter much in practice.
-            removeInvalidPreparedStatementsForFunction(ksName, aggregateName);
+            removeInvalidPreparedStatementsForFunction(before.name().keyspace, before.name().name);
         }
 
-        public void onDropKeyspace(String ksName)
+        @Override
+        public void onDropKeyspace(KeyspaceMetadata keyspace, boolean dropData)
         {
-            logger.trace("Keyspace {} was dropped, invalidating related prepared statements", ksName);
-            removeInvalidPreparedStatements(ksName, null);
+            logger.trace("Keyspace {} was dropped, invalidating related prepared statements", keyspace.name);
+            removeInvalidPreparedStatements(keyspace.name, null);
         }
 
-        public void onDropTable(String ksName, String cfName)
+        @Override
+        public void onDropTable(TableMetadata table, boolean dropData)
         {
-            logger.trace("Table {}.{} was dropped, invalidating related prepared statements", ksName, cfName);
-            removeInvalidPreparedStatements(ksName, cfName);
+            logger.trace("Table {}.{} was dropped, invalidating related prepared statements", table.keyspace, table.name);
+            removeInvalidPreparedStatements(table.keyspace, table.name);
         }
 
-        public void onDropFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onDropFunction(UDFunction function)
         {
-            removeInvalidPreparedStatementsForFunction(ksName, functionName);
+            removeInvalidPreparedStatementsForFunction(function.name().keyspace, function.name().name);
         }
 
-        public void onDropAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onDropAggregate(UDAggregate aggregate)
         {
-            removeInvalidPreparedStatementsForFunction(ksName, aggregateName);
+            removeInvalidPreparedStatementsForFunction(aggregate.name().keyspace, aggregate.name().name);
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/Sets.java b/src/java/org/apache/cassandra/cql3/Sets.java
index 2baa060..104a857 100644
--- a/src/java/org/apache/cassandra/cql3/Sets.java
+++ b/src/java/org/apache/cassandra/cql3/Sets.java
@@ -24,6 +24,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
 
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.db.DecoratedKey;
@@ -217,7 +218,7 @@
                 Set<?> s = type.getSerializer().deserializeForNativeProtocol(value, ByteBufferAccessor.instance, version);
                 SortedSet<ByteBuffer> elements = new TreeSet<>(type.getElementsType());
                 for (Object element : s)
-                    elements.add(type.getElementsType().decompose(element));
+                    elements.add(type.getElementsType().decomposeUntyped(element));
                 return new Value(elements);
             }
             catch (MarshalException e)
@@ -348,26 +349,43 @@
 
         static void doAdd(Term.Terminal value, ColumnMetadata column, UpdateParameters params) throws InvalidRequestException
         {
+            if (value == null)
+            {
+                // for frozen sets, we're overwriting the whole cell
+                if (!column.type.isMultiCell())
+                    params.addTombstone(column);
+
+                return;
+            }
+
+            SortedSet<ByteBuffer> elements = ((Value) value).elements;
+
             if (column.type.isMultiCell())
             {
-                if (value == null)
+                if (elements.size() == 0)
                     return;
 
-                for (ByteBuffer bb : ((Value) value).elements)
+                // Guardrails about collection size are only checked for the added elements without considering
+                // already existent elements. This is done so to avoid read-before-write, having additional checks
+                // during SSTable write.
+                Guardrails.itemsPerCollection.guard(elements.size(), column.name.toString(), false, params.clientState);
+
+                int dataSize = 0;
+                for (ByteBuffer bb : elements)
                 {
                     if (bb == ByteBufferUtil.UNSET_BYTE_BUFFER)
                         continue;
 
-                    params.addCell(column, CellPath.create(bb), ByteBufferUtil.EMPTY_BYTE_BUFFER);
+                    Cell<?> cell = params.addCell(column, CellPath.create(bb), ByteBufferUtil.EMPTY_BYTE_BUFFER);
+                    dataSize += cell.dataSize();
                 }
+                Guardrails.collectionSize.guard(dataSize, column.name.toString(), false, params.clientState);
             }
             else
             {
-                // for frozen sets, we're overwriting the whole cell
-                if (value == null)
-                    params.addTombstone(column);
-                else
-                    params.addCell(column, value.get(ProtocolVersion.CURRENT));
+                Guardrails.itemsPerCollection.guard(elements.size(), column.name.toString(), false, params.clientState);
+                Cell<?> cell = params.addCell(column, value.get(ProtocolVersion.CURRENT));
+                Guardrails.collectionSize.guard(cell.dataSize(), column.name.toString(), false, params.clientState);
             }
         }
     }
diff --git a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
index 9ff3f07..cf1cb69 100644
--- a/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
+++ b/src/java/org/apache/cassandra/cql3/SingleColumnRelation.java
@@ -274,16 +274,6 @@
     {
         ColumnSpecification receiver = columnDef;
 
-        if (isIN())
-        {
-            // We only allow IN on the row key and the clustering key so far, never on non-PK columns, and this even if
-            // there's an index
-            // Note: for backward compatibility reason, we conside a IN of 1 value the same as a EQ, so we let that
-            // slide.
-            checkFalse(!columnDef.isPrimaryKeyColumn() && !canHaveOnlyOneValue(),
-                       "IN predicates on non-primary-key columns (%s) is not yet supported", columnDef.name);
-        }
-
         checkFalse(isContainsKey() && !(receiver.type instanceof MapType), "Cannot use CONTAINS KEY on non-map column %s", receiver.name);
         checkFalse(isContains() && !(receiver.type.isCollection()), "Cannot use CONTAINS on non-collection column %s", receiver.name);
 
diff --git a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
index 4411c48..f00c137 100644
--- a/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
+++ b/src/java/org/apache/cassandra/cql3/UntypedResultSet.java
@@ -38,6 +38,9 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.AbstractIterator;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /** a utility for doing internal cql-based queries */
 public abstract class UntypedResultSet implements Iterable<UntypedResultSet.Row>
@@ -271,7 +274,7 @@
                         if (pager.isExhausted())
                             return endOfData();
 
-                        try (PartitionIterator iter = pager.fetchPage(pageSize, cl, clientState, System.nanoTime()))
+                        try (PartitionIterator iter = pager.fetchPage(pageSize, cl, clientState, nanoTime()))
                         {
                             currentPage = select.process(iter, nowInSec).rows.iterator();
                         }
@@ -371,6 +374,12 @@
             return Int32Type.instance.compose(data.get(column));
         }
 
+        public int getInt(String column, int ifNull)
+        {
+            ByteBuffer bytes = data.get(column);
+            return bytes == null ? ifNull : Int32Type.instance.compose(bytes);
+        }
+
         public double getDouble(String column)
         {
             return DoubleType.instance.compose(data.get(column));
@@ -401,6 +410,17 @@
             return UUIDType.instance.compose(data.get(column));
         }
 
+        public UUID getUUID(String column, UUID ifNull)
+        {
+            ByteBuffer bytes = data.get(column);
+            return bytes == null ? ifNull : UUIDType.instance.compose(bytes);
+        }
+
+        public TimeUUID getTimeUUID(String column)
+        {
+            return TimeUUID.deserialize(data.get(column));
+        }
+
         public Date getTimestamp(String column)
         {
             return TimestampType.instance.compose(data.get(column));
diff --git a/src/java/org/apache/cassandra/cql3/UpdateParameters.java b/src/java/org/apache/cassandra/cql3/UpdateParameters.java
index 4272307..2d59366 100644
--- a/src/java/org/apache/cassandra/cql3/UpdateParameters.java
+++ b/src/java/org/apache/cassandra/cql3/UpdateParameters.java
@@ -27,6 +27,8 @@
 import org.apache.cassandra.db.partitions.Partition;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Groups the parameters of an update query, and make building updates easier.
@@ -35,6 +37,7 @@
 {
     public final TableMetadata metadata;
     public final RegularAndStaticColumns updatedColumns;
+    public final ClientState clientState;
     public final QueryOptions options;
 
     private final int nowInSec;
@@ -54,6 +57,7 @@
 
     public UpdateParameters(TableMetadata metadata,
                             RegularAndStaticColumns updatedColumns,
+                            ClientState clientState,
                             QueryOptions options,
                             long timestamp,
                             int nowInSec,
@@ -63,6 +67,7 @@
     {
         this.metadata = metadata;
         this.updatedColumns = updatedColumns;
+        this.clientState = clientState;
         this.options = options;
 
         this.nowInSec = nowInSec;
@@ -141,17 +146,18 @@
         builder.addCell(BufferCell.tombstone(column, timestamp, nowInSec, path));
     }
 
-    public void addCell(ColumnMetadata column, ByteBuffer value) throws InvalidRequestException
+    public Cell<?> addCell(ColumnMetadata column, ByteBuffer value) throws InvalidRequestException
     {
-        addCell(column, null, value);
+        return addCell(column, null, value);
     }
 
-    public void addCell(ColumnMetadata column, CellPath path, ByteBuffer value) throws InvalidRequestException
+    public Cell<?> addCell(ColumnMetadata column, CellPath path, ByteBuffer value) throws InvalidRequestException
     {
         Cell<?> cell = ttl == LivenessInfo.NO_TTL
                        ? BufferCell.live(column, timestamp, value, path)
                        : BufferCell.expiring(column, timestamp, ttl, nowInSec, value, path);
         builder.addCell(cell);
+        return cell;
     }
 
     public void addCounter(ColumnMetadata column, long increment) throws InvalidRequestException
@@ -205,6 +211,11 @@
         return new RangeTombstone(slice, deletionTime);
     }
 
+    public byte[] nextTimeUUIDAsBytes()
+    {
+        return TimeUUID.Generator.nextTimeUUIDAsBytes();
+    }
+
     /**
      * Returns the prefetched row with the already performed modifications.
      * <p>If no modification have yet been performed this method will return the fetched row or {@code null} if
diff --git a/src/java/org/apache/cassandra/cql3/WhereClause.java b/src/java/org/apache/cassandra/cql3/WhereClause.java
index 9f59c5ef..dc1a7cf 100644
--- a/src/java/org/apache/cassandra/cql3/WhereClause.java
+++ b/src/java/org/apache/cassandra/cql3/WhereClause.java
@@ -24,7 +24,6 @@
 
 import org.antlr.runtime.RecognitionException;
 import org.apache.cassandra.cql3.restrictions.CustomIndexExpression;
-import org.apache.cassandra.exceptions.InvalidRequestException;
 
 import static java.lang.String.join;
 
diff --git a/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java b/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java
index 93ed6ae..e3f463a 100644
--- a/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java
+++ b/src/java/org/apache/cassandra/cql3/conditions/ColumnCondition.java
@@ -495,6 +495,9 @@
             if (value == null)
                 return !iter.hasNext();
 
+            if(operator.isContains() || operator.isContainsKey())
+                return containsAppliesTo(type, iter, value.get(ProtocolVersion.CURRENT), operator);
+
             switch (type.kind)
             {
                 case LIST:
@@ -573,6 +576,39 @@
         }
     }
 
+    private static boolean containsAppliesTo(CollectionType<?> type, Iterator<Cell<?>> iter, ByteBuffer value, Operator operator)
+    {
+        AbstractType<?> compareType;
+        switch (type.kind)
+        {
+            case LIST:
+                compareType = ((ListType<?>)type).getElementsType();
+                break;
+            case SET:
+                compareType = ((SetType<?>)type).getElementsType();
+                break;
+            case MAP:
+                compareType = operator.isContainsKey() ? ((MapType<?, ?>)type).getKeysType() : ((MapType<?, ?>)type).getValuesType();
+                break;
+            default:
+                throw new AssertionError();
+        }
+        boolean appliesToSetOrMapKeys = (type.kind == CollectionType.Kind.SET || type.kind == CollectionType.Kind.MAP && operator.isContainsKey());
+        return containsAppliesTo(compareType, iter, value, appliesToSetOrMapKeys);
+    }
+
+    private static boolean containsAppliesTo(AbstractType<?> type, Iterator<Cell<?>> iter, ByteBuffer value, Boolean appliesToSetOrMapKeys)
+    {
+        while(iter.hasNext())
+        {
+            // for lists and map values we use the cell value; for sets and map keys we use the cell name
+            ByteBuffer cellValue = appliesToSetOrMapKeys ? iter.next().path().get(0) : iter.next().buffer();
+            if(type.compare(cellValue, value) == 0)
+                return true;
+        }
+        return false;
+    }
+
     /**
      * A condition on a UDT field
      */
@@ -819,12 +855,18 @@
 
         private Terms prepareTerms(String keyspace, ColumnSpecification receiver)
         {
+            checkFalse(operator.isContainsKey() && !(receiver.type instanceof MapType), "Cannot use CONTAINS KEY on non-map column %s", receiver.name);
+            checkFalse(operator.isContains() && !(receiver.type.isCollection()), "Cannot use CONTAINS on non-collection column %s", receiver.name);
+
             if (operator.isIN())
             {
                 return inValues == null ? Terms.ofListMarker(inMarker.prepare(keyspace, receiver), receiver.type)
                                         : Terms.of(prepareTerms(keyspace, receiver, inValues));
             }
 
+            if (operator.isContains() || operator.isContainsKey())
+                receiver = ((CollectionType<?>) receiver.type).makeCollectionReceiver(receiver, operator.isContainsKey());
+
             return Terms.of(value.prepare(keyspace, receiver));
         }
 
@@ -861,4 +903,4 @@
             return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java b/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java
index 940f0a4..aab2046 100644
--- a/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/AbstractFunction.java
@@ -27,7 +27,6 @@
 import org.apache.cassandra.cql3.CQL3Type.Tuple;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.CqlBuilder;
-import org.apache.cassandra.cql3.CqlBuilder.Appender;
 import org.apache.cassandra.db.marshal.AbstractType;
 
 import org.apache.commons.lang3.text.StrBuilder;
diff --git a/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java
index 85d3763..5797de4 100644
--- a/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/AggregateFcts.java
@@ -23,7 +23,9 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.db.marshal.*;
@@ -64,21 +66,23 @@
         functions.add(avgFunctionForCounter);
 
         // count, max, and min for all standard types
+        Set<AbstractType<?>> types = new HashSet<>();
         for (CQL3Type type : CQL3Type.Native.values())
         {
-            if (type != CQL3Type.Native.VARCHAR) // varchar and text both mapping to UTF8Type
+            AbstractType<?> udfType = type.getType().udfType();
+            if (!types.add(udfType))
+                continue;
+
+            functions.add(AggregateFcts.makeCountFunction(udfType));
+            if (type != CQL3Type.Native.COUNTER)
             {
-                functions.add(AggregateFcts.makeCountFunction(type.getType()));
-                if (type != CQL3Type.Native.COUNTER)
-                {
-                    functions.add(AggregateFcts.makeMaxFunction(type.getType()));
-                    functions.add(AggregateFcts.makeMinFunction(type.getType()));
-                }
-                else
-                {
-                    functions.add(AggregateFcts.maxFunctionForCounter);
-                    functions.add(AggregateFcts.minFunctionForCounter);
-                }
+                functions.add(AggregateFcts.makeMaxFunction(udfType));
+                functions.add(AggregateFcts.makeMinFunction(udfType));
+            }
+            else
+            {
+                functions.add(AggregateFcts.maxFunctionForCounter);
+                functions.add(AggregateFcts.minFunctionForCounter);
             }
         }
 
diff --git a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java
index 33771b7..7e9708a 100644
--- a/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/BytesConversionFcts.java
@@ -20,7 +20,9 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -39,13 +41,17 @@
 
         // because text and varchar ends up being synonymous, our automatic makeToBlobFunction doesn't work
         // for varchar, so we special case it below. We also skip blob for obvious reasons.
+        Set<AbstractType<?>> types = new HashSet<>();
         for (CQL3Type type : CQL3Type.Native.values())
         {
-            if (type != CQL3Type.Native.VARCHAR && type != CQL3Type.Native.BLOB)
-            {
-                functions.add(makeToBlobFunction(type.getType()));
-                functions.add(makeFromBlobFunction(type.getType()));
-            }
+            if (type == CQL3Type.Native.BLOB)
+                continue;
+            AbstractType<?> udfType = type.getType().udfType();
+            if (!types.add(udfType))
+                continue;
+
+            functions.add(makeToBlobFunction(type.getType().udfType()));
+            functions.add(makeFromBlobFunction(type.getType().udfType()));
         }
 
         functions.add(VarcharAsBlobFct);
diff --git a/src/java/org/apache/cassandra/cql3/functions/Function.java b/src/java/org/apache/cassandra/cql3/functions/Function.java
index e13e906..0a8d331 100644
--- a/src/java/org/apache/cassandra/cql3/functions/Function.java
+++ b/src/java/org/apache/cassandra/cql3/functions/Function.java
@@ -29,6 +29,12 @@
 @Unmetered
 public interface Function extends AssignmentTestable
 {
+    /**
+     * A marker buffer used to represent function parameters that cannot be resolved at some stage of CQL processing.
+     * This is used for partial function application in particular.
+     */
+    public static final ByteBuffer UNRESOLVED = ByteBuffer.allocate(0);
+
     public FunctionName name();
     public List<AbstractType<?>> argTypes();
     public AbstractType<?> returnType();
@@ -36,14 +42,21 @@
     /**
      * Checks whether the function is a native/hard coded one or not.
      *
-     * @return <code>true</code> if the function is a native/hard coded one, <code>false</code> otherwise.
+     * @return {@code true} if the function is a native/hard coded one, {@code false} otherwise.
      */
     public boolean isNative();
 
     /**
+     * Checks whether the function is a pure function (as in doesn't depend on, nor produces side effects) or not.
+     *
+     * @return {@code true} if the function is a pure function, {@code false} otherwise.
+     */
+    public boolean isPure();
+
+    /**
      * Checks whether the function is an aggregate function or not.
      *
-     * @return <code>true</code> if the function is an aggregate function, <code>false</code> otherwise.
+     * @return {@code true} if the function is an aggregate function, {@code false} otherwise.
      */
     public boolean isAggregate();
 
diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
index 0083a31..4fb1ba3 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FunctionCall.java
@@ -148,6 +148,12 @@
             return new Raw(name, Collections.singletonList(raw));
         }
 
+        public static Raw newCast(Term.Raw raw, CQL3Type type)
+        {
+            FunctionName name = FunctionName.nativeFunction(CastFcts.getFunctionName(type));
+            return new Raw(name, Collections.singletonList(raw));
+        }
+
         public Term prepare(String keyspace, ColumnSpecification receiver) throws InvalidRequestException
         {
             Function fun = FunctionResolver.get(keyspace, name, terms, receiver.ksName, receiver.cfName, receiver.type);
@@ -202,9 +208,9 @@
                 if (fun != null && fun.name().equals(FromJsonFct.NAME))
                     return TestResult.WEAKLY_ASSIGNABLE;
 
-                if (fun != null && receiver.type.equals(fun.returnType()))
+                if (fun != null && receiver.type.udfType().equals(fun.returnType()))
                     return AssignmentTestable.TestResult.EXACT_MATCH;
-                else if (fun == null || receiver.type.isValueCompatibleWith(fun.returnType()))
+                else if (fun == null || receiver.type.udfType().isValueCompatibleWith(fun.returnType()))
                     return AssignmentTestable.TestResult.WEAKLY_ASSIGNABLE;
                 else
                     return AssignmentTestable.TestResult.NOT_ASSIGNABLE;
diff --git a/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java b/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java
index 40d68f2..7717bdb 100644
--- a/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java
+++ b/src/java/org/apache/cassandra/cql3/functions/FunctionResolver.java
@@ -131,7 +131,8 @@
                                           FunctionName name,
                                           List<? extends AssignmentTestable> providedArgs,
                                           String receiverKs,
-                                          String receiverCf, AbstractType<?> receiverType,
+                                          String receiverCf,
+                                          AbstractType<?> receiverType,
                                           Collection<Function> candidates)
     {
         List<Function> compatibles = null;
@@ -212,7 +213,7 @@
      */
     private static boolean matchReturnType(Function fun, AbstractType<?> receiverType)
     {
-        return receiverType == null || fun.returnType().testAssignment(receiverType).isAssignable();
+        return receiverType == null || fun.returnType().testAssignment(receiverType.udfType()).isAssignable();
     }
 
     // This method and matchArguments are somewhat duplicate, but this method allows us to provide more precise errors in the common
diff --git a/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java b/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
index d2bac5f..10be467 100644
--- a/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/JavaBasedUDFunction.java
@@ -74,7 +74,7 @@
 
     private static final AtomicInteger classSequence = new AtomicInteger();
 
-    // use a JVM standard ExecutorService as DebuggableThreadPoolExecutor references internal
+    // use a JVM standard ExecutorService as ExecutorPlus references internal
     // classes, which triggers AccessControlException from the UDF sandbox
     private static final UDFExecutorService executor =
         new UDFExecutorService(new NamedThreadFactory("UserDefinedFunctions",
@@ -350,6 +350,7 @@
         catch (InvocationTargetException e)
         {
             // in case of an ITE, use the cause
+            logger.error(String.format("Could not compile function '%s' from Java source:%n%s", name, javaSource), e);
             throw new InvalidRequestException(String.format("Could not compile function '%s' from Java source: %s", name, e.getCause()));
         }
         catch (InvalidRequestException | VirtualMachineError e)
diff --git a/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java b/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java
index df66ea0..cafeca1 100644
--- a/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/NativeFunction.java
@@ -31,8 +31,16 @@
         super(FunctionName.nativeFunction(name), Arrays.asList(argTypes), returnType);
     }
 
+    @Override
     public boolean isNative()
     {
         return true;
     }
+
+    @Override
+    public boolean isPure()
+    {
+        // Most of our functions are pure, the other ones should override this
+        return true;
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java
index 3ae0607..e492f75 100644
--- a/src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/NativeScalarFunction.java
@@ -17,6 +17,9 @@
  */
 package org.apache.cassandra.cql3.functions;
 
+import java.nio.ByteBuffer;
+import java.util.List;
+
 import org.apache.cassandra.db.marshal.AbstractType;
 
 /**
@@ -38,4 +41,17 @@
     {
         return false;
     }
+
+    /**
+     * Checks if a partial application of the function is monotonic.
+     *
+     * <p>A function is monotonic if it is either entirely nonincreasing or nondecreasing.</p>
+     *
+     * @param partialParameters the input parameters used to create the partial application of the function
+     * @return {@code true} if the partial application of the function is monotonic {@code false} otherwise.
+     */
+    protected boolean isPartialApplicationMonotonic(List<ByteBuffer> partialParameters)
+    {
+        return isMonotonic();
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java b/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java
index 4994660..b00ced7 100644
--- a/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/OperationFcts.java
@@ -53,14 +53,24 @@
             {
                 return type.addDuration(temporal, duration);
             }
+
+            @Override
+            protected ByteBuffer excuteOnStrings(StringType resultType,
+                                                 StringType leftType,
+                                                 ByteBuffer left,
+                                                 StringType rightType,
+                                                 ByteBuffer right)
+            {
+                return resultType.concat(leftType, left, rightType, right);
+            }
         },
         SUBSTRACTION('-', "_substract")
         {
             protected ByteBuffer executeOnNumerics(NumberType<?> resultType,
-                                         NumberType<?> leftType,
-                                         ByteBuffer left,
-                                         NumberType<?> rightType,
-                                         ByteBuffer right)
+                                                   NumberType<?> leftType,
+                                                   ByteBuffer left,
+                                                   NumberType<?> rightType,
+                                                   ByteBuffer right)
             {
                 return resultType.substract(leftType, left, rightType, right);
             }
@@ -76,10 +86,10 @@
         MULTIPLICATION('*', "_multiply")
         {
             protected ByteBuffer executeOnNumerics(NumberType<?> resultType,
-                                         NumberType<?> leftType,
-                                         ByteBuffer left,
-                                         NumberType<?> rightType,
-                                         ByteBuffer right)
+                                                   NumberType<?> leftType,
+                                                   ByteBuffer left,
+                                                   NumberType<?> rightType,
+                                                   ByteBuffer right)
             {
                 return resultType.multiply(leftType, left, rightType, right);
             }
@@ -87,10 +97,10 @@
         DIVISION('/', "_divide")
         {
             protected ByteBuffer executeOnNumerics(NumberType<?> resultType,
-                                         NumberType<?> leftType,
-                                         ByteBuffer left,
-                                         NumberType<?> rightType,
-                                         ByteBuffer right)
+                                                   NumberType<?> leftType,
+                                                   ByteBuffer left,
+                                                   NumberType<?> rightType,
+                                                   ByteBuffer right)
             {
                 return resultType.divide(leftType, left, rightType, right);
             }
@@ -98,10 +108,10 @@
         MODULO('%', "_modulo")
         {
             protected ByteBuffer executeOnNumerics(NumberType<?> resultType,
-                                         NumberType<?> leftType,
-                                         ByteBuffer left,
-                                         NumberType<?> rightType,
-                                         ByteBuffer right)
+                                                   NumberType<?> leftType,
+                                                   ByteBuffer left,
+                                                   NumberType<?> rightType,
+                                                   ByteBuffer right)
             {
                 return resultType.mod(leftType, left, rightType, right);
             }
@@ -155,6 +165,25 @@
         }
 
         /**
+         * Executes the operation between the specified string operand.
+         *
+         * @param resultType the result type of the operation
+         * @param leftType the type of the left operand
+         * @param left the left operand
+         * @param rightType  the type of the right operand
+         * @param right the right operand
+         * @return the operation result
+         */
+        protected ByteBuffer excuteOnStrings(StringType resultType,
+                                             StringType leftType,
+                                             ByteBuffer left,
+                                             StringType rightType,
+                                             ByteBuffer right)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        /**
          * Returns the {@code OPERATOR} associated to the specified function.
          * @param functionName the function name
          * @return the {@code OPERATOR} associated to the specified function
@@ -221,9 +250,19 @@
             functions.add(new TemporalOperationFunction(SimpleDateType.instance, operation));
         }
 
+        addStringConcatenations(functions);
+
         return functions;
     }
 
+    private static void addStringConcatenations(List<Function> functions)
+    {
+        functions.add(new StringOperationFunction(UTF8Type.instance, UTF8Type.instance, OPERATION.ADDITION, UTF8Type.instance));
+        functions.add(new StringOperationFunction(AsciiType.instance, AsciiType.instance, OPERATION.ADDITION, AsciiType.instance));
+        functions.add(new StringOperationFunction(UTF8Type.instance, AsciiType.instance, OPERATION.ADDITION, UTF8Type.instance));
+        functions.add(new StringOperationFunction(UTF8Type.instance, UTF8Type.instance, OPERATION.ADDITION, AsciiType.instance));
+    }
+
     /**
      * Checks if the function with the specified name is an operation.
      *
@@ -415,6 +454,27 @@
         }
     }
 
+    private static class StringOperationFunction extends OperationFunction
+    {
+        public StringOperationFunction(StringType returnType,
+                                       StringType left,
+                                       OPERATION operation,
+                                       StringType right)
+        {
+            super(returnType, left, operation, right);
+        }
+
+        @Override
+        protected ByteBuffer doExecute(ByteBuffer left, OPERATION operation, ByteBuffer right)
+        {
+            StringType leftType = (StringType) argTypes().get(0);
+            StringType rightType = (StringType) argTypes().get(1);
+            StringType resultType = (StringType) returnType();
+
+            return operation.excuteOnStrings(resultType, leftType, left, rightType, right);
+        }
+    }
+
     /**
      * Function that execute operations on temporals (timestamp, date, ...).
      */
diff --git a/src/java/org/apache/cassandra/cql3/functions/PartialScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/PartialScalarFunction.java
new file mode 100644
index 0000000..6970768
--- /dev/null
+++ b/src/java/org/apache/cassandra/cql3/functions/PartialScalarFunction.java
@@ -0,0 +1,45 @@
+/*
+ * 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.cql3.functions;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import org.apache.cassandra.transport.ProtocolVersion;
+
+/**
+ * A partial application of a function.
+ *
+ * @see ScalarFunction#partialApplication(ProtocolVersion, List)
+ */
+public interface PartialScalarFunction extends ScalarFunction
+{
+    /**
+     * Returns the original function.
+     *
+     * @return the original function
+     */
+    public Function getFunction();
+
+    /**
+     * Returns the list of input parameters for the function where some parameters can be {@link #UNRESOLVED}.
+     *
+     * @return the list of input parameters for the function
+     */
+    public List<ByteBuffer> getPartialParameters();
+}
diff --git a/src/java/org/apache/cassandra/cql3/functions/PartiallyAppliedScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/PartiallyAppliedScalarFunction.java
new file mode 100644
index 0000000..301160b
--- /dev/null
+++ b/src/java/org/apache/cassandra/cql3/functions/PartiallyAppliedScalarFunction.java
@@ -0,0 +1,113 @@
+/*
+ * 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.cql3.functions;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cassandra.cql3.CqlBuilder;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
+
+/**
+ * An internal function used to hold the partial application of another function to only some of its parameters.
+ *
+ * @see ScalarFunction#partialApplication(ProtocolVersion, List)
+ */
+final class PartiallyAppliedScalarFunction extends NativeScalarFunction implements PartialScalarFunction
+{
+    private final ScalarFunction function;
+    private final List<ByteBuffer> partialParameters;
+
+    PartiallyAppliedScalarFunction(ScalarFunction function, List<ByteBuffer> partialParameters, int unresolvedCount)
+    {
+        // Note that we never register those function, there are just used internally, so the name doesn't matter much
+        super("__partial_application__", function.returnType(), computeArgTypes(function, partialParameters, unresolvedCount));
+        this.function = function;
+        this.partialParameters = partialParameters;
+    }
+
+    @Override
+    public boolean isMonotonic()
+    {
+        return function.isNative() ? ((NativeScalarFunction) function).isPartialApplicationMonotonic(partialParameters)
+                                   : function.isMonotonic();
+    }
+
+    @Override
+    public boolean isPure()
+    {
+        return function.isPure();
+    }
+
+    @Override
+    public Function getFunction()
+    {
+        return function;
+    }
+
+    @Override
+    public List<ByteBuffer> getPartialParameters()
+    {
+        return partialParameters;
+    }
+
+    private static AbstractType<?>[] computeArgTypes(ScalarFunction function, List<ByteBuffer> partialParameters, int unresolvedCount)
+    {
+        AbstractType<?>[] argTypes = new AbstractType<?>[unresolvedCount];
+        int arg = 0;
+        for (int i = 0; i < partialParameters.size(); i++)
+        {
+            if (partialParameters.get(i) == UNRESOLVED)
+                argTypes[arg++] = function.argTypes().get(i);
+        }
+        return argTypes;
+    }
+
+    public ByteBuffer execute(ProtocolVersion protocolVersion, List<ByteBuffer> parameters) throws InvalidRequestException
+    {
+        List<ByteBuffer> fullParameters = new ArrayList<>(partialParameters);
+        int arg = 0;
+        for (int i = 0; i < fullParameters.size(); i++)
+        {
+            if (fullParameters.get(i) == UNRESOLVED)
+                fullParameters.set(i, parameters.get(arg++));
+        }
+        return function.execute(protocolVersion, fullParameters);
+    }
+
+    @Override
+    public String toString()
+    {
+        CqlBuilder b = new CqlBuilder().append(function.name()).append(" : (");
+
+        List<AbstractType<?>> types = function.argTypes();
+        for (int i = 0, m = types.size(); i < m; i++)
+        {
+            if (i > 0)
+                b.append(", ");
+            b.append(toCqlString(types.get(i)));
+            if (partialParameters.get(i) != Function.UNRESOLVED)
+                b.append("(constant)");
+        }
+        b.append(") -> ").append(returnType);
+        return b.toString();
+    }
+}
diff --git a/src/java/org/apache/cassandra/cql3/functions/PreComputedScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/PreComputedScalarFunction.java
new file mode 100644
index 0000000..9670132
--- /dev/null
+++ b/src/java/org/apache/cassandra/cql3/functions/PreComputedScalarFunction.java
@@ -0,0 +1,83 @@
+/*
+ * 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.cql3.functions;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.transport.ProtocolVersion;
+
+/**
+ * Function used internally to hold the pre-computed result of another function.
+ * <p>
+ * See {@link ScalarFunction#partialApplication(ProtocolVersion, List)} for why this is used.
+ * <p>
+ * Note : the function is cautious in keeping the protocol version used for the pre-computed value and to
+ * fallback to recomputation if the version we get when {@link #execute} is called. I don't think it's truly necessary
+ * though as I don't think we actually depend on the protocol version for values anymore (it's remnant of previous
+ * transitions). It's not a lot of code to be on safe side though until this is cleaned (assuming we do clean it).
+ */
+class PreComputedScalarFunction extends NativeScalarFunction implements PartialScalarFunction
+{
+    private final ByteBuffer value;
+    private final ProtocolVersion valueVersion;
+
+    private final ScalarFunction function;
+    private final List<ByteBuffer> parameters;
+
+    PreComputedScalarFunction(AbstractType<?> returnType,
+                              ByteBuffer value,
+                              ProtocolVersion valueVersion,
+                              ScalarFunction function,
+                              List<ByteBuffer> parameters)
+    {
+        // Note that we never register those function, there are just used internally, so the name doesn't matter much
+        super("__constant__", returnType);
+        this.value = value;
+        this.valueVersion = valueVersion;
+        this.function = function;
+        this.parameters = parameters;
+    }
+
+    @Override
+    public Function getFunction()
+    {
+        return function;
+    }
+
+    @Override
+    public List<ByteBuffer> getPartialParameters()
+    {
+        return parameters;
+    }
+
+    public ByteBuffer execute(ProtocolVersion protocolVersion, List<ByteBuffer> nothing) throws InvalidRequestException
+    {
+        if (protocolVersion == valueVersion)
+            return value;
+
+        return function.execute(protocolVersion, parameters);
+    }
+
+    public ScalarFunction partialApplication(ProtocolVersion protocolVersion, List<ByteBuffer> nothing) throws InvalidRequestException
+    {
+        return this;
+    }
+}
diff --git a/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
index 1f98372..fc18aae 100644
--- a/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/ScalarFunction.java
@@ -24,13 +24,25 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
- * Determines a single output value based on a single input value.
+ * Determines a single output value based on any number of input values.
  */
 public interface ScalarFunction extends Function
 {
     public boolean isCalledOnNullInput();
 
     /**
+     * Checks if the function is monotonic.
+     *
+     *<p>A function is monotonic if it is either entirely nonincreasing or nondecreasing given an ordered set of inputs.</p>
+     *
+     * @return {@code true} if the function is monotonic {@code false} otherwise.
+     */
+    public default boolean isMonotonic()
+    {
+        return false;
+    }
+
+    /**
      * Applies this function to the specified parameter.
      *
      * @param protocolVersion protocol version used for parameters and return value
@@ -39,4 +51,49 @@
      * @throws InvalidRequestException if this function cannot not be applied to the parameter
      */
     public ByteBuffer execute(ProtocolVersion protocolVersion, List<ByteBuffer> parameters) throws InvalidRequestException;
+
+    /**
+     * Does a partial application of the function. That is, given only some of the parameters of the function provided,
+     * return a new function that only expect the parameters not provided.
+     * <p>
+     * To take an example, if you consider the function
+     * <pre>
+     *     text foo(int a, text b, text c, int d)
+     * </pre>
+     * then {@code foo.partialApplication([3, <ommitted>, 'bar', <omitted>])} will return a function {@code bar} of signature:
+     * <pre>
+     *     text bar(text b, int d)
+     * </pre>
+     * and such that for any value of {@code b} and {@code d}, {@code bar(b, d) == foo(3, b, 'bar', d)}.
+     *
+     * @param protocolVersion protocol version used for parameters
+     * @param partialParameters a list of input parameters for the function where some parameters can be {@link #UNRESOLVED}.
+     *                          The input <b>must</b> be of size {@code this.argsType().size()}. For convenience, it is
+     *                          allowed both to pass a list with all parameters being {@link #UNRESOLVED} (the function is
+     *                          then returned directly) and with none of them unresolved (in which case, if the function is pure,
+     *                          it is computed and a dummy no-arg function returning the result is returned).
+     * @return a function corresponding to the partial application of this function to the parameters of
+     * {@code partialParameters} that are not {@link #UNRESOLVED}.
+     */
+    public default ScalarFunction partialApplication(ProtocolVersion protocolVersion, List<ByteBuffer> partialParameters)
+    {
+        int unresolvedCount = 0;
+        for (ByteBuffer parameter : partialParameters)
+        {
+            if (parameter == UNRESOLVED)
+                ++unresolvedCount;
+        }
+
+        if (unresolvedCount == argTypes().size())
+            return this;
+
+        if (isPure() && unresolvedCount == 0)
+            return new PreComputedScalarFunction(returnType(),
+                                           execute(protocolVersion, partialParameters),
+                                           protocolVersion,
+                                           this,
+                                           partialParameters);
+
+        return new PartiallyAppliedScalarFunction(this, partialParameters, unresolvedCount);
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
index d7e5eb8..e42fbe9 100644
--- a/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/ScriptBasedUDFunction.java
@@ -94,7 +94,7 @@
     "org.apache.cassandra.cql3.functions.types.utils"
     };
 
-    // use a JVM standard ExecutorService as DebuggableThreadPoolExecutor references internal
+    // use a JVM standard ExecutorService as ExecutorPlus references internal
     // classes, which triggers AccessControlException from the UDF sandbox
     private static final UDFExecutorService executor =
         new UDFExecutorService(new NamedThreadFactory("UserDefinedScriptFunctions",
diff --git a/src/java/org/apache/cassandra/cql3/functions/TimeFcts.java b/src/java/org/apache/cassandra/cql3/functions/TimeFcts.java
index f029e59..2759210 100644
--- a/src/java/org/apache/cassandra/cql3/functions/TimeFcts.java
+++ b/src/java/org/apache/cassandra/cql3/functions/TimeFcts.java
@@ -25,11 +25,17 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.cql3.Duration;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.UUIDGen;
 
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
+
 public abstract class TimeFcts
 {
     public static Logger logger = LoggerFactory.getLogger(TimeFcts.class);
@@ -51,7 +57,14 @@
                                 toUnixTimestamp(TimestampType.instance),
                                 toDate(TimestampType.instance),
                                 toUnixTimestamp(SimpleDateType.instance),
-                                toTimestamp(SimpleDateType.instance));
+                                toTimestamp(SimpleDateType.instance),
+                                FloorTimestampFunction.newInstance(),
+                                FloorTimestampFunction.newInstanceWithStartTimeArgument(),
+                                FloorTimeUuidFunction.newInstance(),
+                                FloorTimeUuidFunction.newInstanceWithStartTimeArgument(),
+                                FloorDateFunction.newInstance(),
+                                FloorDateFunction.newInstanceWithStartTimeArgument(),
+                                floorTime);
     }
 
     public static final Function now(final String name, final TemporalType<?> type)
@@ -63,6 +76,12 @@
             {
                 return type.now();
             }
+
+            @Override
+            public boolean isPure()
+            {
+                return false; // as it returns non-identical results for identical arguments
+            }
         };
     };
 
@@ -74,7 +93,7 @@
             if (bb == null)
                 return null;
 
-            return UUIDGen.toByteBuffer(UUIDGen.minTimeUUID(TimestampType.instance.compose(bb).getTime()));
+            return TimeUUID.minAtUnixMillis(TimestampType.instance.compose(bb).getTime()).toBytes();
         }
     };
 
@@ -86,13 +105,13 @@
             if (bb == null)
                 return null;
 
-            return UUIDGen.toByteBuffer(UUIDGen.maxTimeUUID(TimestampType.instance.compose(bb).getTime()));
+            return TimeUUID.maxAtUnixMillis(TimestampType.instance.compose(bb).getTime()).toBytes();
         }
     };
 
     /**
      * Function that convert a value of <code>TIMEUUID</code> into a value of type <code>TIMESTAMP</code>.
-     * @deprecated Replaced by the {@link #timeUuidToTimestamp} function
+     * @deprecated Replaced by the {@link #toTimestamp} function
      */
     public static final NativeScalarFunction dateOfFct = new NativeScalarFunction("dateof", TimestampType.instance, TimeUUIDType.instance)
     {
@@ -111,14 +130,14 @@
             if (bb == null)
                 return null;
 
-            long timeInMillis = UUIDGen.unixTimestamp(UUIDGen.getUUID(bb));
+            long timeInMillis = TimeUUID.deserialize(bb).unix(MILLISECONDS);
             return ByteBufferUtil.bytes(timeInMillis);
         }
     };
 
     /**
      * Function that convert a value of type <code>TIMEUUID</code> into an UNIX timestamp.
-     * @deprecated Replaced by the {@link #timeUuidToUnixTimestamp} function
+     * @deprecated Replaced by the {@link #toUnixTimestamp} function
      */
     public static final NativeScalarFunction unixTimestampOfFct = new NativeScalarFunction("unixtimestampof", LongType.instance, TimeUUIDType.instance)
     {
@@ -137,7 +156,7 @@
             if (bb == null)
                 return null;
 
-            return ByteBufferUtil.bytes(UUIDGen.unixTimestamp(UUIDGen.getUUID(bb)));
+            return ByteBufferUtil.bytes(TimeUUID.deserialize(bb).unix(MILLISECONDS));
         }
     };
 
@@ -159,6 +178,12 @@
                long millis = type.toTimeInMillis(bb);
                return SimpleDateType.instance.fromTimeInMillis(millis);
            }
+
+           @Override
+           public boolean isMonotonic()
+           {
+               return true;
+           }
        };
    }
 
@@ -180,6 +205,12 @@
                long millis = type.toTimeInMillis(bb);
                return TimestampType.instance.fromTimeInMillis(millis);
            }
+
+           @Override
+           public boolean isMonotonic()
+           {
+               return true;
+           }
        };
    }
 
@@ -200,7 +231,282 @@
 
                 return ByteBufferUtil.bytes(type.toTimeInMillis(bb));
             }
+
+            @Override
+            public boolean isMonotonic()
+            {
+                return true;
+            }
         };
     }
-}
+
+    /**
+     * Function that rounds a timestamp down to the closest multiple of a duration.
+     */
+     private static abstract class FloorFunction extends NativeScalarFunction
+     {
+         private static final Long ZERO = Long.valueOf(0);
+
+         protected FloorFunction(AbstractType<?> returnType,
+                                 AbstractType<?>... argsType)
+         {
+             super("floor", returnType, argsType);
+             // The function can accept either 2 parameters (time and duration) or 3 parameters (time, duration and startTime)r
+             assert argsType.length == 2 || argsType.length == 3; 
+         }
+
+         @Override
+         protected boolean isPartialApplicationMonotonic(List<ByteBuffer> partialParameters)
+         {
+             return partialParameters.get(0) == UNRESOLVED
+                     && partialParameters.get(1) != UNRESOLVED
+                     && (partialParameters.size() == 2 || partialParameters.get(2) != UNRESOLVED);
+         }
+
+         public final ByteBuffer execute(ProtocolVersion protocolVersion, List<ByteBuffer> parameters)
+         {
+             ByteBuffer timeBuffer = parameters.get(0);
+             ByteBuffer durationBuffer = parameters.get(1);
+             Long startingTime = getStartingTime(parameters);
+
+             if (timeBuffer == null || durationBuffer == null || startingTime == null)
+                 return null;
+
+             Long time = toTimeInMillis(timeBuffer);
+             Duration duration = DurationType.instance.compose(durationBuffer);
+
+             if (time == null || duration == null)
+                 return null;
+
+
+             validateDuration(duration);
+
+
+             long floor = Duration.floorTimestamp(time, duration, startingTime);
+
+             return fromTimeInMillis(floor);
+         }
+
+         /**
+          * Returns the time to use as the starting time.
+          *
+          * @param parameters the function parameters
+          * @return the time to use as the starting time
+          */
+         private Long getStartingTime(List<ByteBuffer> parameters)
+         {
+             if (parameters.size() == 3)
+             {
+                 ByteBuffer startingTimeBuffer = parameters.get(2);
+
+                 if (startingTimeBuffer == null)
+                     return null;
+
+                 return toStartingTimeInMillis(startingTimeBuffer);
+             }
+
+             return ZERO;
+         }
+
+         /**
+          * Validates that the duration has the correct precision.
+          * @param duration the duration to validate.
+          */
+         protected void validateDuration(Duration duration)
+         {
+             if (!duration.hasMillisecondPrecision())
+                 throw invalidRequest("The floor cannot be computed for the %s duration as precision is below 1 millisecond", duration);
+         }
+
+         /**
+          * Serializes the specified time.
+          *
+          * @param timeInMillis the time in milliseconds
+          * @return the serialized time
+          */
+         protected abstract ByteBuffer fromTimeInMillis(long timeInMillis);
+
+         /**
+          * Deserializes the specified input time.
+          *
+          * @param bytes the serialized time
+          * @return the time in milliseconds
+          */
+         protected abstract Long toTimeInMillis(ByteBuffer bytes);
+
+         /**
+          * Deserializes the specified starting time.
+          *
+          * @param bytes the serialized starting time
+          * @return the starting time in milliseconds
+          */
+         protected abstract Long toStartingTimeInMillis(ByteBuffer bytes);
+     }
+
+    /**
+     * Function that rounds a timestamp down to the closest multiple of a duration.
+     */
+     public static final class FloorTimestampFunction extends FloorFunction
+     {
+         public static FloorTimestampFunction newInstance()
+         {
+             return new FloorTimestampFunction(TimestampType.instance,
+                                               TimestampType.instance,
+                                               DurationType.instance);
+         }
+
+         public static FloorTimestampFunction newInstanceWithStartTimeArgument()
+         {
+             return new FloorTimestampFunction(TimestampType.instance,
+                                               TimestampType.instance,
+                                               DurationType.instance,
+                                               TimestampType.instance);
+         }
+
+         private FloorTimestampFunction(AbstractType<?> returnType,
+                                        AbstractType<?>... argTypes)
+         {
+             super(returnType, argTypes);
+         }
+
+         protected ByteBuffer fromTimeInMillis(long timeInMillis)
+         {
+             return TimestampType.instance.fromTimeInMillis(timeInMillis);
+         }
+
+         protected Long toStartingTimeInMillis(ByteBuffer bytes)
+         {
+             return TimestampType.instance.toTimeInMillis(bytes);
+         }
+
+         protected Long toTimeInMillis(ByteBuffer bytes)
+         {
+             return TimestampType.instance.toTimeInMillis(bytes);
+         }
+     }
+
+     /**
+      * Function that rounds a timeUUID down to the closest multiple of a duration.
+      */
+     public static final class FloorTimeUuidFunction extends FloorFunction
+     {
+         public static FloorTimeUuidFunction newInstance()
+         {
+             return new FloorTimeUuidFunction(TimestampType.instance,
+                                              TimeUUIDType.instance,
+                                              DurationType.instance);
+         }
+
+         public static FloorTimeUuidFunction newInstanceWithStartTimeArgument()
+         {
+             return new FloorTimeUuidFunction(TimestampType.instance,
+                                              TimeUUIDType.instance,
+                                              DurationType.instance,
+                                              TimestampType.instance);
+         }
+
+         private FloorTimeUuidFunction(AbstractType<?> returnType,
+                                       AbstractType<?>... argTypes)
+         {
+             super(returnType, argTypes);
+         }
+
+         protected ByteBuffer fromTimeInMillis(long timeInMillis)
+         {
+             return TimestampType.instance.fromTimeInMillis(timeInMillis);
+         }
+
+         protected Long toStartingTimeInMillis(ByteBuffer bytes)
+         {
+             return TimestampType.instance.toTimeInMillis(bytes);
+         }
+
+         protected Long toTimeInMillis(ByteBuffer bytes)
+         {
+             return UUIDGen.getAdjustedTimestamp(UUIDGen.getUUID(bytes));
+         }
+     }
+
+     /**
+      * Function that rounds a date down to the closest multiple of a duration.
+      */
+     public static final class FloorDateFunction extends FloorFunction
+     {
+         public static FloorDateFunction newInstance()
+         {
+             return new FloorDateFunction(SimpleDateType.instance,
+                                          SimpleDateType.instance,
+                                          DurationType.instance);
+         }
+
+         public static FloorDateFunction newInstanceWithStartTimeArgument()
+         {
+             return new FloorDateFunction(SimpleDateType.instance,
+                                          SimpleDateType.instance,
+                                          DurationType.instance,
+                                          SimpleDateType.instance);
+         }
+
+         private FloorDateFunction(AbstractType<?> returnType,
+                                   AbstractType<?>... argTypes)
+         {
+             super(returnType, argTypes);
+         }
+
+         protected ByteBuffer fromTimeInMillis(long timeInMillis)
+         {
+             return SimpleDateType.instance.fromTimeInMillis(timeInMillis);
+         }
+
+         protected Long toStartingTimeInMillis(ByteBuffer bytes)
+         {
+             return SimpleDateType.instance.toTimeInMillis(bytes);
+         }
+
+         protected Long toTimeInMillis(ByteBuffer bytes)
+         {
+             return SimpleDateType.instance.toTimeInMillis(bytes);
+         }
+
+         @Override
+         protected void validateDuration(Duration duration)
+         {
+             // Checks that the duration has no data below days.
+             if (duration.getNanoseconds() != 0)
+                 throw invalidRequest("The floor on %s values cannot be computed for the %s duration as precision is below 1 day",
+                                      SimpleDateType.instance.asCQL3Type(), duration);
+         }
+     }
+
+     /**
+      * Function that rounds a time down to the closest multiple of a duration.
+      */
+     public static final NativeScalarFunction floorTime = new NativeScalarFunction("floor", TimeType.instance, TimeType.instance, DurationType.instance)
+     {
+         @Override
+         protected boolean isPartialApplicationMonotonic(List<ByteBuffer> partialParameters)
+         {
+             return partialParameters.get(0) == UNRESOLVED && partialParameters.get(1) != UNRESOLVED;
+         }
+
+         public ByteBuffer execute(ProtocolVersion protocolVersion, List<ByteBuffer> parameters)
+         {
+             ByteBuffer timeBuffer = parameters.get(0);
+             ByteBuffer durationBuffer = parameters.get(1);
+
+             if (timeBuffer == null || durationBuffer == null)
+                 return null;
+
+             Long time = TimeType.instance.compose(timeBuffer);
+             Duration duration = DurationType.instance.compose(durationBuffer);
+
+             if (time == null || duration == null)
+                 return null;
+
+             long floor = Duration.floorTime(time, duration);
+
+             return TimeType.instance.decompose(floor);
+         }
+     };
+ }
 
diff --git a/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java
index b764835..b686328 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDAggregate.java
@@ -39,6 +39,7 @@
 
 import static com.google.common.collect.Iterables.any;
 import static com.google.common.collect.Iterables.transform;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * Base class for user-defined-aggregates.
@@ -99,6 +100,12 @@
                         .orElseThrow(() -> new ConfigurationException(String.format("Unable to find function %s referenced by UDA %s", name, udaName)));
     }
 
+    public boolean isPure()
+    {
+        // Right now, we have no way to check if an UDA is pure. Due to that we consider them as non pure to avoid any risk.
+        return false;
+    }
+
     public boolean hasReferenceTo(Function function)
     {
         return stateFunction == function || finalFunction == function;
@@ -182,7 +189,7 @@
             {
                 maybeInit(protocolVersion);
 
-                long startTime = System.nanoTime();
+                long startTime = nanoTime();
                 stateFunctionCount++;
                 if (stateFunction instanceof UDFunction)
                 {
@@ -194,7 +201,7 @@
                 {
                     throw new UnsupportedOperationException("UDAs only support UDFs");
                 }
-                stateFunctionDuration += (System.nanoTime() - startTime) / 1000;
+                stateFunctionDuration += (nanoTime() - startTime) / 1000;
             }
 
             private void maybeInit(ProtocolVersion protocolVersion)
diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java b/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java
index 5e08ad8..3b7631f 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDFExecutorService.java
@@ -17,37 +17,47 @@
  */
 package org.apache.cassandra.cql3.functions;
 
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
-
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
+import org.apache.cassandra.concurrent.ThreadPoolExecutorJMXAdapter;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.concurrent.ThreadPoolExecutorBase;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.utils.FBUtilities.getAvailableProcessors;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 /**
- * Executor service which exposes stats via JMX, but which doesn't reference
- * internal classes in its beforeExecute & afterExecute methods as these are
- * forbidden by the UDF execution sandbox
+ * Executor service which exposes stats via JMX, but which doesn't reference internal classes
+ * as these are forbidden by the UDF execution sandbox.
+ *
+ * TODO: see if we can port to ExecutorPlus to avoid duplication
  */
-final class UDFExecutorService extends JMXEnabledThreadPoolExecutor
+final class UDFExecutorService extends ThreadPoolExecutorBase
 {
-    private static int KEEPALIVE = Integer.getInteger("cassandra.udf_executor_thread_keepalive_ms", 30000);
+    private static final int KEEPALIVE = Integer.getInteger("cassandra.udf_executor_thread_keepalive_ms", 30000);
 
-    UDFExecutorService(NamedThreadFactory threadFactory, String jmxPath)
+    public UDFExecutorService(NamedThreadFactory threadFactory, String jmxPath)
     {
-        super(FBUtilities.getAvailableProcessors(),
-              KEEPALIVE,
-              TimeUnit.MILLISECONDS,
-              new LinkedBlockingQueue<>(),
-              threadFactory,
-              jmxPath);
+        super(getAvailableProcessors(), KEEPALIVE, MILLISECONDS, newBlockingQueue(), threadFactory);
+        ThreadPoolExecutorJMXAdapter.register(jmxPath, this);
     }
 
-    protected void afterExecute(Runnable r, Throwable t)
+    public int getCoreThreads()
     {
+        return getCorePoolSize();
     }
 
-    protected void beforeExecute(Thread t, Runnable r)
+    public void setCoreThreads(int newCorePoolSize)
     {
+        setCorePoolSize(newCorePoolSize);
+    }
+
+    public int getMaximumThreads()
+    {
+        return getMaximumPoolSize();
+    }
+
+    public void setMaximumThreads(int maxPoolSize)
+    {
+        setMaximumPoolSize(maxPoolSize);
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
index 3863f89..5ef065b 100644
--- a/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
+++ b/src/java/org/apache/cassandra/cql3/functions/UDFunction.java
@@ -28,11 +28,10 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Optional;
-import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletableFuture; // checkstyle: permit this import
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -42,6 +41,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.ColumnIdentifier;
@@ -58,9 +58,11 @@
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static com.google.common.collect.Iterables.any;
 import static com.google.common.collect.Iterables.transform;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * Base class for User Defined Functions.
@@ -296,7 +298,7 @@
         {
             protected ExecutorService executor()
             {
-                return Executors.newSingleThreadExecutor();
+                return ImmediateExecutor.INSTANCE;
             }
 
             protected Object executeAggregateUserDefined(ProtocolVersion protocolVersion, Object firstParam, List<ByteBuffer> parameters)
@@ -366,6 +368,12 @@
         return builder.toString();
     }
 
+    public boolean isPure()
+    {
+        // Right now, we have no way to check if an UDF is pure. Due to that we consider them as non pure to avoid any risk.
+        return false;
+    }
+
     public final ByteBuffer execute(ProtocolVersion protocolVersion, List<ByteBuffer> parameters)
     {
         assertUdfsEnabled(language);
@@ -373,7 +381,7 @@
         if (!isCallableWrtNullable(parameters))
             return null;
 
-        long tStart = System.nanoTime();
+        long tStart = nanoTime();
         parameters = makeEmptyParametersNull(parameters);
 
         try
@@ -383,7 +391,7 @@
                                 ? executeAsync(protocolVersion, parameters)
                                 : executeUserDefined(protocolVersion, parameters);
 
-            Tracing.trace("Executed UDF {} in {}\u03bcs", name(), (System.nanoTime() - tStart) / 1000);
+            Tracing.trace("Executed UDF {} in {}\u03bcs", name(), (nanoTime() - tStart) / 1000);
             return result;
         }
         catch (InvalidRequestException e)
@@ -412,7 +420,7 @@
         if (!calledOnNullInput && firstParam == null || !isCallableWrtNullable(parameters))
             return null;
 
-        long tStart = System.nanoTime();
+        long tStart = nanoTime();
         parameters = makeEmptyParametersNull(parameters);
 
         try
@@ -421,7 +429,7 @@
             Object result = DatabaseDescriptor.enableUserDefinedFunctionsThreads()
                                 ? executeAggregateAsync(protocolVersion, firstParam, parameters)
                                 : executeAggregateUserDefined(protocolVersion, firstParam, parameters);
-            Tracing.trace("Executed UDF {} in {}\u03bcs", name(), (System.nanoTime() - tStart) / 1000);
+            Tracing.trace("Executed UDF {} in {}\u03bcs", name(), (nanoTime() - tStart) / 1000);
             return result;
         }
         catch (InvalidRequestException e)
@@ -440,9 +448,9 @@
     public static void assertUdfsEnabled(String language)
     {
         if (!DatabaseDescriptor.enableUserDefinedFunctions())
-            throw new InvalidRequestException("User-defined functions are disabled in cassandra.yaml - set enable_user_defined_functions=true to enable");
+            throw new InvalidRequestException("User-defined functions are disabled in cassandra.yaml - set user_defined_functions_enabled=true to enable");
         if (!"java".equalsIgnoreCase(language) && !DatabaseDescriptor.enableScriptedUserDefinedFunctions())
-            throw new InvalidRequestException("Scripted user-defined functions are disabled in cassandra.yaml - set enable_scripted_user_defined_functions=true to enable if you are aware of the security risks");
+            throw new InvalidRequestException("Scripted user-defined functions are disabled in cassandra.yaml - set scripted_user_defined_functions_enabled=true to enable if you are aware of the security risks");
     }
 
     static void initializeThread()
@@ -528,7 +536,7 @@
         catch (InterruptedException e)
         {
             Thread.currentThread().interrupt();
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
         catch (ExecutionException e)
         {
@@ -554,7 +562,7 @@
             catch (InterruptedException e1)
             {
                 Thread.currentThread().interrupt();
-                throw new RuntimeException(e);
+                throw new UncheckedInterruptedException(e1);
             }
             catch (ExecutionException e1)
             {
@@ -758,7 +766,7 @@
     private static class UDFClassLoader extends ClassLoader
     {
         // insecureClassLoader is the C* class loader
-        static final ClassLoader insecureClassLoader = Thread.currentThread().getContextClassLoader();
+        static final ClassLoader insecureClassLoader = UDFClassLoader.class.getClassLoader();
 
         private UDFClassLoader()
         {
diff --git a/src/java/org/apache/cassandra/cql3/functions/types/TypeCodec.java b/src/java/org/apache/cassandra/cql3/functions/types/TypeCodec.java
index a728a1c..dc34bca 100644
--- a/src/java/org/apache/cassandra/cql3/functions/types/TypeCodec.java
+++ b/src/java/org/apache/cassandra/cql3/functions/types/TypeCodec.java
@@ -31,13 +31,10 @@
 import java.util.*;
 import java.util.regex.Pattern;
 
-import com.google.common.io.ByteArrayDataOutput;
 import com.google.common.io.ByteStreams;
 import com.google.common.reflect.TypeToken;
 
 import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.cql3.functions.types.DataType.CollectionType;
-import org.apache.cassandra.cql3.functions.types.DataType.Name;
 import org.apache.cassandra.cql3.functions.types.exceptions.InvalidTypeException;
 import org.apache.cassandra.cql3.functions.types.utils.Bytes;
 import org.apache.cassandra.utils.vint.VIntCoding;
@@ -3045,19 +3042,20 @@
             VIntCoding.computeVIntSize(months)
             + VIntCoding.computeVIntSize(days)
             + VIntCoding.computeVIntSize(nanoseconds);
-            ByteArrayDataOutput out = ByteStreams.newDataOutput(size);
+            ByteBuffer bb = ByteBuffer.allocate(size);
             try
             {
-                VIntCoding.writeVInt(months, out);
-                VIntCoding.writeVInt(days, out);
-                VIntCoding.writeVInt(nanoseconds, out);
+                VIntCoding.writeVInt(months, bb);
+                VIntCoding.writeVInt(days, bb);
+                VIntCoding.writeVInt(nanoseconds, bb);
             }
             catch (IOException e)
             {
                 // cannot happen
                 throw new AssertionError();
             }
-            return ByteBuffer.wrap(out.toByteArray());
+            bb.flip();
+            return bb;
         }
 
         @Override
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java
index 0a252ff..c1d0c52 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/ClusteringColumnRestrictions.java
@@ -19,6 +19,7 @@
 
 import java.util.*;
 
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.QueryOptions;
@@ -27,6 +28,7 @@
 import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.IndexRegistry;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.utils.btree.BTreeSet;
 
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
@@ -101,12 +103,16 @@
         return false;
     }
 
-    public NavigableSet<Clustering<?>> valuesAsClustering(QueryOptions options) throws InvalidRequestException
+    public NavigableSet<Clustering<?>> valuesAsClustering(QueryOptions options, ClientState state) throws InvalidRequestException
     {
         MultiCBuilder builder = MultiCBuilder.create(comparator, hasIN());
         for (SingleRestriction r : restrictions)
         {
             r.appendTo(builder, options);
+
+            if (hasIN() && Guardrails.inSelectCartesianProduct.enabled(state))
+                Guardrails.inSelectCartesianProduct.guard(builder.buildSize(), "clustering key", false, state);
+
             if (builder.hasMissingElements())
                 break;
         }
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java
index 4c6ce2f..acbb48e 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/MultiColumnRestriction.java
@@ -21,6 +21,8 @@
 import java.util.*;
 
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.serializers.ListSerializer;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.Term.Terminal;
 import org.apache.cassandra.cql3.functions.Function;
@@ -247,7 +249,22 @@
                                          IndexRegistry indexRegistry,
                                          QueryOptions options)
         {
-            throw  invalidRequest("IN restrictions are not supported on indexed columns");
+            // If the relation is of the type (c) IN ((x),(y),(z)) then it is equivalent to
+            // c IN (x, y, z) and we can perform filtering
+            if (getColumnDefs().size() == 1)
+            {
+                List<List<ByteBuffer>> splitValues = splitValues(options);
+                List<ByteBuffer> values = new ArrayList<>(splitValues.size());
+                for (List<ByteBuffer> splitValue : splitValues)
+                    values.add(splitValue.get(0));
+
+                ByteBuffer buffer = ListSerializer.pack(values, values.size(), ProtocolVersion.V3);
+                filter.add(getFirstColumn(), Operator.IN, buffer);
+            }
+            else
+            {
+                throw invalidRequest("Multicolumn IN filters are not supported");
+            }
         }
 
         protected abstract List<List<ByteBuffer>> splitValues(QueryOptions options);
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeyRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeyRestrictions.java
index b1edf94..8224529 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeyRestrictions.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeyRestrictions.java
@@ -23,6 +23,7 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.statements.Bound;
+import org.apache.cassandra.service.ClientState;
 
 /**
  * A set of restrictions on the partition key.
@@ -32,7 +33,7 @@
 {
     public PartitionKeyRestrictions mergeWith(Restriction restriction);
 
-    public List<ByteBuffer> values(QueryOptions options);
+    public List<ByteBuffer> values(QueryOptions options, ClientState state);
 
     public List<ByteBuffer> bounds(Bound b, QueryOptions options);
 
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeySingleRestrictionSet.java b/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeySingleRestrictionSet.java
index fbe5673..a6f227a 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeySingleRestrictionSet.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/PartitionKeySingleRestrictionSet.java
@@ -20,6 +20,7 @@
 import java.nio.ByteBuffer;
 import java.util.*;
 
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.statements.Bound;
@@ -28,6 +29,7 @@
 import org.apache.cassandra.db.MultiCBuilder;
 import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.index.IndexRegistry;
+import org.apache.cassandra.service.ClientState;
 
 /**
  * A set of single restrictions on the partition key.
@@ -78,12 +80,16 @@
     }
 
     @Override
-    public List<ByteBuffer> values(QueryOptions options)
+    public List<ByteBuffer> values(QueryOptions options, ClientState state)
     {
         MultiCBuilder builder = MultiCBuilder.create(comparator, hasIN());
         for (SingleRestriction r : restrictions)
         {
             r.appendTo(builder, options);
+
+            if (hasIN() && Guardrails.inSelectCartesianProduct.enabled(state))
+                Guardrails.inSelectCartesianProduct.guard(builder.buildSize(), "partition key", false, state);
+
             if (builder.hasMissingElements())
                 break;
         }
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java
index 1b3482b..e5b2465 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/SingleColumnRestriction.java
@@ -23,6 +23,8 @@
 import java.util.List;
 
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.serializers.ListSerializer;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.Term.Terminal;
 import org.apache.cassandra.cql3.functions.Function;
@@ -218,7 +220,9 @@
                                    IndexRegistry indexRegistry,
                                    QueryOptions options)
         {
-            throw invalidRequest("IN restrictions are not supported on indexed columns");
+            List<ByteBuffer> values = getValues(options);
+            ByteBuffer buffer = ListSerializer.pack(values, values.size(), ProtocolVersion.V3);
+            filter.add(columnDef, Operator.IN, buffer);
         }
 
         @Override
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
index 5d924f5..8f8be94 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/StatementRestrictions.java
@@ -35,6 +35,7 @@
 import org.apache.cassandra.index.IndexRegistry;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.utils.btree.BTreeSet;
 
 import org.apache.commons.lang3.builder.ToStringBuilder;
@@ -446,9 +447,6 @@
                 if (!allowFiltering && !forView && !hasQueriableIndex)
                     throw new InvalidRequestException(REQUIRES_ALLOW_FILTERING_MESSAGE);
 
-                if (partitionKeyRestrictions.hasIN())
-                    throw new InvalidRequestException("IN restrictions are not supported when the query involves filtering");
-
                 isKeyRange = true;
                 usesSecondaryIndexing = hasQueriableIndex;
             }
@@ -628,11 +626,12 @@
      * Returns the partition keys for which the data is requested.
      *
      * @param options the query options
+     * @param state the client state
      * @return the partition keys for which the data is requested.
      */
-    public List<ByteBuffer> getPartitionKeys(final QueryOptions options)
+    public List<ByteBuffer> getPartitionKeys(final QueryOptions options, ClientState state)
     {
-        return partitionKeyRestrictions.values(options);
+        return partitionKeyRestrictions.values(options, state);
     }
 
     /**
@@ -750,9 +749,10 @@
      * Returns the requested clustering columns.
      *
      * @param options the query options
+     * @param state the client state
      * @return the requested clustering columns
      */
-    public NavigableSet<Clustering<?>> getClusteringColumns(QueryOptions options)
+    public NavigableSet<Clustering<?>> getClusteringColumns(QueryOptions options, ClientState state)
     {
         // If this is a names command and the table is a static compact one, then as far as CQL is concerned we have
         // only a single row which internally correspond to the static parts. In which case we want to return an empty
@@ -760,7 +760,7 @@
         if (table.isStaticCompactTable())
             return BTreeSet.empty(table.comparator);
 
-        return clusteringColumnsRestrictions.valuesAsClustering(options);
+        return clusteringColumnsRestrictions.valuesAsClustering(options, state);
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java b/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java
index 437b17c..9f67cc0 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/TokenFilter.java
@@ -35,6 +35,7 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.IndexRegistry;
+import org.apache.cassandra.service.ClientState;
 
 import static org.apache.cassandra.cql3.statements.Bound.END;
 import static org.apache.cassandra.cql3.statements.Bound.START;
@@ -102,9 +103,9 @@
     }
 
     @Override
-    public List<ByteBuffer> values(QueryOptions options) throws InvalidRequestException
+    public List<ByteBuffer> values(QueryOptions options, ClientState state) throws InvalidRequestException
     {
-        return filter(restrictions.values(options), options);
+        return filter(restrictions.values(options, state), options, state);
     }
 
     @Override
@@ -139,13 +140,14 @@
      *
      * @param values the values returned by the decorated restriction
      * @param options the query options
+     * @param state the client state
      * @return the values matching the token restriction
      * @throws InvalidRequestException if the request is invalid
      */
-    private List<ByteBuffer> filter(List<ByteBuffer> values, QueryOptions options) throws InvalidRequestException
+    private List<ByteBuffer> filter(List<ByteBuffer> values, QueryOptions options, ClientState state) throws InvalidRequestException
     {
         RangeSet<Token> rangeSet = tokenRestriction.hasSlice() ? toRangeSet(tokenRestriction, options)
-                                                               : toRangeSet(tokenRestriction.values(options));
+                                                               : toRangeSet(tokenRestriction.values(options, state));
 
         return filterWithRangeSet(rangeSet, values);
     }
diff --git a/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java b/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java
index e71b177..d7477fb 100644
--- a/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java
+++ b/src/java/org/apache/cassandra/cql3/restrictions/TokenRestriction.java
@@ -31,6 +31,7 @@
 import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.IndexRegistry;
+import org.apache.cassandra.service.ClientState;
 
 import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
 
@@ -205,7 +206,10 @@
         @Override
         public List<ByteBuffer> bounds(Bound b, QueryOptions options) throws InvalidRequestException
         {
-            return values(options);
+            // ClientState is used by inSelectCartesianProduct guardrail to skip non-ordinary users.
+            // Passing null here to avoid polluting too many methods, because in case of EQ token restriction,
+            // it won't generate high cartesian product.
+            return values(options, null);
         }
 
         @Override
@@ -221,7 +225,7 @@
         }
 
         @Override
-        public List<ByteBuffer> values(QueryOptions options) throws InvalidRequestException
+        public List<ByteBuffer> values(QueryOptions options, ClientState state) throws InvalidRequestException
         {
             return Collections.singletonList(value.bindAndGet(options));
         }
@@ -254,7 +258,7 @@
         }
 
         @Override
-        public List<ByteBuffer> values(QueryOptions options) throws InvalidRequestException
+        public List<ByteBuffer> values(QueryOptions options, ClientState state) throws InvalidRequestException
         {
             throw new UnsupportedOperationException();
         }
diff --git a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java
index d420857..bf2564e 100644
--- a/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/AbstractFunctionSelector.java
@@ -17,24 +17,93 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 
+import com.google.common.base.Objects;
 import com.google.common.collect.Iterables;
 
 import org.apache.commons.lang3.text.StrBuilder;
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.functions.Function;
+import org.apache.cassandra.cql3.functions.FunctionName;
+import org.apache.cassandra.cql3.functions.PartialScalarFunction;
+import org.apache.cassandra.cql3.functions.ScalarFunction;
 import org.apache.cassandra.cql3.statements.RequestValidations;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+import static java.util.stream.Collectors.joining;
 
 abstract class AbstractFunctionSelector<T extends Function> extends Selector
 {
+    protected static abstract class AbstractFunctionSelectorDeserializer extends SelectorDeserializer
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            FunctionName name = new FunctionName(in.readUTF(), in.readUTF());
+
+            int numberOfArguments = (int) in.readUnsignedVInt();
+            List<AbstractType<?>> argTypes = new ArrayList<>(numberOfArguments);
+            for (int i = 0; i < numberOfArguments; i++)
+            {
+                argTypes.add(readType(metadata, in));
+            }
+
+            Optional<Function> optional = Schema.instance.findFunction(name, argTypes);
+
+            if (!optional.isPresent())
+                throw new IOException(String.format("Unknown serialized function %s(%s)",
+                                                    name,
+                                                    argTypes.stream()
+                                                            .map(p -> p.asCQL3Type().toString())
+                                                            .collect(joining(", "))));
+
+            Function function = optional.get();
+
+            boolean isPartial = in.readBoolean();
+            if (isPartial)
+            {
+                int bitset = (int) in.readUnsignedVInt();
+                List<ByteBuffer> partialParameters = new ArrayList<>(numberOfArguments);
+                for (int i = 0; i < numberOfArguments; i++)
+                {
+                    ByteBuffer parameter = ((bitset & 1) == 1) ? ByteBufferUtil.readWithVIntLength(in)
+                                                               : Function.UNRESOLVED;
+                    partialParameters.add(parameter);
+                    bitset >>= 1;
+                }
+
+                function = ((ScalarFunction) function).partialApplication(ProtocolVersion.CURRENT, partialParameters);
+            }
+
+            int numberOfRemainingArguments = (int) in.readUnsignedVInt();
+            List<Selector> argSelectors = new ArrayList<>(numberOfRemainingArguments);
+            for (int i = 0; i < numberOfRemainingArguments; i++)
+            {
+                argSelectors.add(Selector.serializer.deserialize(in, version, metadata));
+            }
+
+            return newFunctionSelector(function, argSelectors);
+        }
+
+        protected abstract Selector newFunctionSelector(Function function, List<Selector> argSelectors);
+    };
+    
     protected final T fun;
 
     /**
@@ -88,7 +157,45 @@
             public Selector newInstance(QueryOptions options) throws InvalidRequestException
             {
                 return fun.isAggregate() ? new AggregateFunctionSelector(fun, factories.newInstances(options))
-                                         : new ScalarFunctionSelector(fun, factories.newInstances(options));
+                                         : createScalarSelector(options, (ScalarFunction) fun, factories.newInstances(options));
+            }
+
+            private Selector createScalarSelector(QueryOptions options, ScalarFunction function, List<Selector> argSelectors)
+            {
+                ProtocolVersion version = options.getProtocolVersion();
+                int terminalCount = 0;
+                List<ByteBuffer> terminalArgs = new ArrayList<>(argSelectors.size());
+                for (Selector selector : argSelectors)
+                {
+                    if (selector.isTerminal())
+                    {
+                        ++terminalCount;
+                        ByteBuffer output = selector.getOutput(version);
+                        RequestValidations.checkBindValueSet(output, "Invalid unset value for argument in call to function %s", fun.name().name);
+                        terminalArgs.add(output);
+                    }
+                    else
+                    {
+                        terminalArgs.add(Function.UNRESOLVED);
+                    }
+                }
+
+                if (terminalCount == 0)
+                    return new ScalarFunctionSelector(fun, argSelectors);
+
+                // All terminal, reduce to a simple value if the function is pure
+                if (terminalCount == argSelectors.size() && function.isPure())
+                    return new TermSelector(function.execute(version, terminalArgs), function.returnType());
+
+                // We have some terminal arguments but not all, do a partial application
+                ScalarFunction partialFunction = function.partialApplication(version, terminalArgs);
+                List<Selector> remainingSelectors = new ArrayList<>(argSelectors.size() - terminalCount);
+                for (Selector selector : argSelectors)
+                {
+                    if (!selector.isTerminal())
+                        remainingSelectors.add(selector);
+                }
+                return new ScalarFunctionSelector(partialFunction, remainingSelectors);
             }
 
             public boolean isWritetimeSelectorFactory()
@@ -121,8 +228,9 @@
         };
     }
 
-    protected AbstractFunctionSelector(T fun, List<Selector> argSelectors)
+    protected AbstractFunctionSelector(Kind kind, T fun, List<Selector> argSelectors)
     {
+        super(kind);
         this.fun = fun;
         this.argSelectors = argSelectors;
         this.args = Arrays.asList(new ByteBuffer[argSelectors.size()]);
@@ -154,6 +262,28 @@
     }
 
     @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof AbstractFunctionSelector))
+            return false;
+
+        AbstractFunctionSelector<?> s = (AbstractFunctionSelector<?>) o;
+
+        return Objects.equal(fun.name(), s.fun.name())
+            && Objects.equal(fun.argTypes(), s.fun.argTypes())
+            && Objects.equal(argSelectors, s.argSelectors);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(fun.name(), fun.argTypes(), argSelectors);
+    }
+
+    @Override
     public String toString()
     {
         return new StrBuilder().append(fun.name())
@@ -162,4 +292,97 @@
                                .append(")")
                                .toString();
     }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        boolean isPartial = fun instanceof PartialScalarFunction;
+        Function function = isPartial ? ((PartialScalarFunction) fun).getFunction() : fun;
+
+        FunctionName name = function.name();
+        int size =  TypeSizes.sizeof(name.keyspace) + TypeSizes.sizeof(name.name);
+
+        List<AbstractType<?>> argTypes = function.argTypes();
+        size += TypeSizes.sizeofUnsignedVInt(argTypes.size());
+        for (int i = 0, m = argTypes.size(); i < m; i++)
+        {
+            size += sizeOf(argTypes.get(i));
+        }
+
+        size += TypeSizes.sizeof(isPartial);
+
+        if (isPartial)
+        {
+            List<ByteBuffer> partialParameters = ((PartialScalarFunction) fun).getPartialParameters();
+
+            // We use a bitset to track the position of the unresolved arguments
+            size += TypeSizes.sizeofUnsignedVInt(computeBitSet(partialParameters));
+
+            for (int i = 0, m = partialParameters.size(); i < m; i++)
+            {
+                ByteBuffer buffer = partialParameters.get(i);
+                if (buffer != Function.UNRESOLVED)
+                    size += ByteBufferUtil.serializedSizeWithVIntLength(buffer);
+            }
+        }
+
+        int numberOfRemainingArguments = argSelectors.size();
+        size += TypeSizes.sizeofUnsignedVInt(numberOfRemainingArguments);
+        for (int i = 0; i < numberOfRemainingArguments; i++)
+            size += serializer.serializedSize(argSelectors.get(i), version);
+
+        return size;
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        boolean isPartial = fun instanceof PartialScalarFunction;
+        Function function = isPartial ? ((PartialScalarFunction) fun).getFunction() : fun;
+
+        FunctionName name = function.name();
+        out.writeUTF(name.keyspace);
+        out.writeUTF(name.name);
+
+        List<AbstractType<?>> argTypes = function.argTypes();
+        int numberOfArguments = argTypes.size();
+        out.writeUnsignedVInt(numberOfArguments);
+
+        for (int i = 0; i < numberOfArguments; i++)
+            writeType(out, argTypes.get(i));
+
+        out.writeBoolean(isPartial);
+
+        if (isPartial)
+        {
+            List<ByteBuffer> partialParameters = ((PartialScalarFunction) fun).getPartialParameters();
+
+            // We use a bitset to track the position of the unresolved arguments
+            out.writeUnsignedVInt(computeBitSet(partialParameters));
+
+            for (int i = 0, m = partialParameters.size(); i < m; i++)
+            {
+                ByteBuffer buffer = partialParameters.get(i);
+                if (buffer != Function.UNRESOLVED)
+                    ByteBufferUtil.writeWithVIntLength(buffer, out);
+            }
+        }
+
+        int numberOfRemainingArguments = argSelectors.size();
+        out.writeUnsignedVInt(numberOfRemainingArguments);
+        for (int i = 0; i < numberOfRemainingArguments; i++)
+            serializer.serialize(argSelectors.get(i), out, version);
+    }
+
+    private int computeBitSet(List<ByteBuffer> partialParameters)
+    {
+        assert partialParameters.size() <= 32 : "cannot serialize partial function with more than 32 parameters";
+        int bitset = 0;
+        for (int i = 0, m = partialParameters.size(); i < m; i++)
+        {
+            if (partialParameters.get(i) != Function.UNRESOLVED)
+                bitset |= 1 << i;
+        }
+        return bitset;
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java
index a9df220..8c4f745 100644
--- a/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/AggregateFunctionSelector.java
@@ -27,6 +27,15 @@
 
 final class AggregateFunctionSelector extends AbstractFunctionSelector<AggregateFunction>
 {
+    protected static final SelectorDeserializer deserializer = new AbstractFunctionSelectorDeserializer()
+    {
+        @Override
+        protected Selector newFunctionSelector(Function function, List<Selector> argSelectors)
+        {
+            return new AggregateFunctionSelector(function, argSelectors);
+        }
+    };
+
     private final AggregateFunction.Aggregate aggregate;
 
     public boolean isAggregate()
@@ -34,13 +43,13 @@
         return true;
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         // Aggregation of aggregation is not supported
         for (int i = 0, m = argSelectors.size(); i < m; i++)
         {
             Selector s = argSelectors.get(i);
-            s.addInput(protocolVersion, rs);
+            s.addInput(protocolVersion, input);
             setArg(i, s.getOutput(protocolVersion));
             s.reset();
         }
@@ -59,7 +68,7 @@
 
     AggregateFunctionSelector(Function fun, List<Selector> argSelectors) throws InvalidRequestException
     {
-        super((AggregateFunction) fun, argSelectors);
+        super(Kind.AGGREGATE_FUNCTION_SELECTOR, (AggregateFunction) fun, argSelectors);
 
         this.aggregate = this.fun.newAggregate();
     }
diff --git a/src/java/org/apache/cassandra/cql3/selection/ElementsSelector.java b/src/java/org/apache/cassandra/cql3/selection/ElementsSelector.java
index 5eace66..e520d0f 100644
--- a/src/java/org/apache/cassandra/cql3/selection/ElementsSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/ElementsSelector.java
@@ -17,17 +17,24 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.Term;
 import org.apache.cassandra.cql3.selection.SimpleSelector.SimpleSelectorFactory;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.db.rows.CellPath;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
@@ -38,8 +45,9 @@
 {
     protected final Selector selected;
 
-    protected ElementsSelector(Selector selected)
+    protected ElementsSelector(Kind kind,Selector selected)
     {
+        super(kind);
         this.selected = selected;
     }
 
@@ -221,7 +229,7 @@
         };
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         ByteBuffer value = selected.getOutput(protocolVersion);
         return value == null ? null : extractSelection(value);
@@ -229,9 +237,9 @@
 
     protected abstract ByteBuffer extractSelection(ByteBuffer collection);
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
-        selected.addInput(protocolVersion, rs);
+        selected.addInput(protocolVersion, input);
     }
 
     public void reset()
@@ -239,14 +247,31 @@
         selected.reset();
     }
 
-    private static class ElementSelector extends ElementsSelector
+    @Override
+    public boolean isTerminal()
     {
+        return selected.isTerminal();
+    }
+
+    static class ElementSelector extends ElementsSelector
+    {
+        protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+        {
+            protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+            {
+                Selector selected = Selector.serializer.deserialize(in, version, metadata);
+                ByteBuffer key = ByteBufferUtil.readWithVIntLength(in);
+
+                return new ElementSelector(selected, key);
+            }
+        };
+
         private final CollectionType<?> type;
         private final ByteBuffer key;
 
         private ElementSelector(Selector selected, ByteBuffer key)
         {
-            super(selected);
+            super(Kind.ELEMENT_SELECTOR, selected);
             this.type = getCollectionType(selected);
             this.key = key;
         }
@@ -279,10 +304,60 @@
         {
             return String.format("%s[%s]", selected, keyType(type).getString(key));
         }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o)
+                return true;
+
+            if (!(o instanceof ElementSelector))
+                return false;
+
+            ElementSelector s = (ElementSelector) o;
+
+            return Objects.equal(selected, s.selected)
+                && Objects.equal(key, s.key);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hashCode(selected, key);
+        }
+
+        @Override
+        protected int serializedSize(int version)
+        {
+            return TypeSizes.sizeofWithVIntLength(key) + serializer.serializedSize(selected, version);
+        }
+
+        @Override
+        protected void serialize(DataOutputPlus out, int version) throws IOException
+        {
+            serializer.serialize(selected, out, version);
+            ByteBufferUtil.serializedSizeWithVIntLength(key);
+        }
     }
 
-    private static class SliceSelector extends ElementsSelector
+    static class SliceSelector extends ElementsSelector
     {
+        protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+        {
+            protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+            {
+                Selector selected = Selector.serializer.deserialize(in, version, metadata);
+
+                boolean isFromUnset = in.readBoolean();
+                ByteBuffer from = isFromUnset ? ByteBufferUtil.UNSET_BYTE_BUFFER : ByteBufferUtil.readWithVIntLength(in);
+
+                boolean isToUnset = in.readBoolean();
+                ByteBuffer to = isToUnset ? ByteBufferUtil.UNSET_BYTE_BUFFER : ByteBufferUtil.readWithVIntLength(in);
+
+                return new SliceSelector(selected, from, to);
+            }
+        };
+
         private final CollectionType<?> type;
 
         // Note that neither from nor to can be null, but they can both be ByteBufferUtil.UNSET_BYTE_BUFFER to represent no particular bound
@@ -291,7 +366,7 @@
 
         private SliceSelector(Selector selected, ByteBuffer from, ByteBuffer to)
         {
-            super(selected);
+            super(Kind.SLICE_SELECTOR, selected);
             assert from != null && to != null : "We can have unset buffers, but not nulls";
             this.type = getCollectionType(selected);
             this.from = from;
@@ -330,5 +405,57 @@
                  ? selected.toString()
                  : String.format("%s[%s..%s]", selected, fromUnset ? "" : keyType(type).getString(from), toUnset ? "" : keyType(type).getString(to));
         }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o)
+                return true;
+
+            if (!(o instanceof SliceSelector))
+                return false;
+
+            SliceSelector s = (SliceSelector) o;
+
+            return Objects.equal(selected, s.selected)
+                && Objects.equal(from, s.from)
+                && Objects.equal(to, s.to);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hashCode(selected, from, to);
+        }
+
+        @Override
+        protected int serializedSize(int version)
+        {
+            int size = serializer.serializedSize(selected, version) + 2;
+
+            if (!isUnset(from))
+                size += TypeSizes.sizeofWithVIntLength(from);
+
+            if (!isUnset(to))
+                size += TypeSizes.sizeofWithVIntLength(to);
+
+            return size;
+        }
+
+        @Override
+        protected void serialize(DataOutputPlus out, int version) throws IOException
+        {
+            serializer.serialize(selected, out, version);
+
+            boolean isFromUnset = isUnset(from);
+            out.writeBoolean(isFromUnset);
+            if (!isFromUnset)
+                ByteBufferUtil.serializedSizeWithVIntLength(from);
+
+            boolean isToUnset = isUnset(to);
+            out.writeBoolean(isToUnset);
+            if (!isToUnset)
+                ByteBufferUtil.serializedSizeWithVIntLength(to);
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java
index c67fc03..0c62397 100644
--- a/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/FieldSelector.java
@@ -17,18 +17,37 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.UserType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.transport.ProtocolVersion;
 
 final class FieldSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            UserType type = (UserType) readType(metadata, in);
+            int field = (int) in.readUnsignedVInt();
+            Selector selected = Selector.serializer.deserialize(in, version, metadata);
+
+            return new FieldSelector(type, field, selected);
+        }
+    };
+
     private final UserType type;
     private final int field;
     private final Selector selected;
@@ -79,12 +98,12 @@
         selected.addFetchedColumns(builder);
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
-        selected.addInput(protocolVersion, rs);
+        selected.addInput(protocolVersion, input);
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         ByteBuffer value = selected.getOutput(protocolVersion);
         if (value == null)
@@ -104,6 +123,12 @@
     }
 
     @Override
+    public boolean isTerminal()
+    {
+        return selected.isTerminal();
+    }
+
+    @Override
     public String toString()
     {
         return String.format("%s.%s", selected, type.fieldName(field));
@@ -111,8 +136,45 @@
 
     private FieldSelector(UserType type, int field, Selector selected)
     {
+        super(Kind.FIELD_SELECTOR);
         this.type = type;
         this.field = field;
         this.selected = selected;
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof FieldSelector))
+            return false;
+
+        FieldSelector s = (FieldSelector) o;
+
+        return Objects.equal(type, s.type)
+            && Objects.equal(field, s.field)
+            && Objects.equal(selected, s.selected);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(type, field, selected);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        return sizeOf(type) + TypeSizes.sizeofUnsignedVInt(field) + serializer.serializedSize(selected, version);
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        writeType(out, type);
+        out.writeUnsignedVInt(field);
+        serializer.serialize(selected, out, version);
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/ListSelector.java b/src/java/org/apache/cassandra/cql3/selection/ListSelector.java
index a8c5d5c..9136ab2 100644
--- a/src/java/org/apache/cassandra/cql3/selection/ListSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/ListSelector.java
@@ -17,15 +17,22 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.Lists;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter.Builder;
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.db.marshal.ListType;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.transport.ProtocolVersion;
 
@@ -35,6 +42,20 @@
  */
 final class ListSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            ListType<?> type = (ListType<?>) readType(metadata, in);
+            int size = (int) in.readUnsignedVInt();
+            List<Selector> elements = new ArrayList<>(size);
+            for (int i = 0; i < size; i++)
+                elements.add(serializer.deserialize(in, version, metadata));
+
+            return new ListSelector(type, elements);
+        }
+    };
+
     /**
      * The list type.
      */
@@ -68,13 +89,13 @@
             elements.get(i).addFetchedColumns(builder);
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         for (int i = 0, m = elements.size(); i < m; i++)
-            elements.get(i).addInput(protocolVersion, rs);
+            elements.get(i).addInput(protocolVersion, input);
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         List<ByteBuffer> buffers = new ArrayList<>(elements.size());
         for (int i = 0, m = elements.size(); i < m; i++)
@@ -90,6 +111,17 @@
             elements.get(i).reset();
     }
 
+    @Override
+    public boolean isTerminal()
+    {
+        for (int i = 0, m = elements.size(); i < m; i++)
+        {
+            if (!elements.get(i).isTerminal())
+                return false;
+        }
+        return true;
+    }
+
     public AbstractType<?> getType()
     {
         return type;
@@ -103,7 +135,48 @@
 
     private ListSelector(AbstractType<?> type, List<Selector> elements)
     {
+        super(Kind.LIST_SELECTOR);
         this.type = type;
         this.elements = elements;
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof ListSelector))
+            return false;
+
+        ListSelector s = (ListSelector) o;
+
+        return Objects.equal(type, s.type)
+            && Objects.equal(elements, s.elements);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(type, elements);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        int size = sizeOf(type) + TypeSizes.sizeofUnsignedVInt(elements.size());
+        for (int i = 0, m = elements.size(); i < m; i++)
+            size += serializer.serializedSize(elements.get(i), version);
+
+        return size;
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        writeType(out, type);
+        out.writeUnsignedVInt(elements.size());
+        for (int i = 0, m = elements.size(); i < m; i++)
+            serializer.serialize(elements.get(i), out, version);
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/MapSelector.java b/src/java/org/apache/cassandra/cql3/selection/MapSelector.java
index 09424bd..dc811c0 100644
--- a/src/java/org/apache/cassandra/cql3/selection/MapSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/MapSelector.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -24,15 +25,20 @@
 import java.util.TreeMap;
 import java.util.stream.Collectors;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.Maps;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.functions.Function;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter.Builder;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.MapType;
-import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.Pair;
@@ -43,6 +49,23 @@
  */
 final class MapSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            MapType<?, ?> type = (MapType<?, ?>) readType(metadata, in);
+            int size = (int) in.readUnsignedVInt();
+            List<Pair<Selector, Selector>> entries = new ArrayList<>(size);
+            for (int i = 0; i < size; i++)
+            {
+                Pair<Selector, Selector> entry = Pair.create(serializer.deserialize(in, version, metadata),
+                                                             serializer.deserialize(in, version, metadata));
+                entries.add(entry);
+            }
+            return new MapSelector(type, entries);
+        }
+    };
+
     /**
      * The map type.
      */
@@ -170,17 +193,17 @@
         }
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         for (int i = 0, m = elements.size(); i < m; i++)
         {
             Pair<Selector, Selector> pair = elements.get(i);
-            pair.left.addInput(protocolVersion, rs);
-            pair.right.addInput(protocolVersion, rs);
+            pair.left.addInput(protocolVersion, input);
+            pair.right.addInput(protocolVersion, input);
         }
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         Map<ByteBuffer, ByteBuffer> map = new TreeMap<>(type.getKeysType());
         for (int i = 0, m = elements.size(); i < m; i++)
@@ -208,6 +231,18 @@
         }
     }
 
+    @Override
+    public boolean isTerminal()
+    {
+        for (int i = 0, m = elements.size(); i < m; i++)
+        {
+            Pair<Selector, Selector> pair = elements.get(i);
+            if (!pair.left.isTerminal() || !pair.right.isTerminal())
+                return false;
+        }
+        return true;
+    }
+
     public AbstractType<?> getType()
     {
         return type;
@@ -221,7 +256,58 @@
 
     private MapSelector(AbstractType<?> type, List<Pair<Selector, Selector>> elements)
     {
+        super(Kind.MAP_SELECTOR);
         this.type = (MapType<?, ?>) type;
         this.elements = elements;
     }
+    
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof MapSelector))
+            return false;
+
+        MapSelector s = (MapSelector) o;
+
+        return Objects.equal(type, s.type)
+            && Objects.equal(elements, s.elements);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(type, elements);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        int size = sizeOf(type) + TypeSizes.sizeofUnsignedVInt(elements.size());
+
+        for (int i = 0, m = elements.size(); i < m; i++)
+        {
+            Pair<Selector, Selector> entry = elements.get(i);
+            size += serializer.serializedSize(entry.left, version) + serializer.serializedSize(entry.right, version);
+        }
+
+        return size;
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        writeType(out, type);
+        out.writeUnsignedVInt(elements.size());
+
+        for (int i = 0, m = elements.size(); i < m; i++)
+        {
+            Pair<Selector, Selector> entry = elements.get(i);
+            serializer.serialize(entry.left, out, version);
+            serializer.serialize(entry.right, out, version);
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/ResultSetBuilder.java b/src/java/org/apache/cassandra/cql3/selection/ResultSetBuilder.java
index 84e1e84..22566b2 100644
--- a/src/java/org/apache/cassandra/cql3/selection/ResultSetBuilder.java
+++ b/src/java/org/apache/cassandra/cql3/selection/ResultSetBuilder.java
@@ -19,7 +19,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
 
 import org.apache.cassandra.cql3.ResultSet;
@@ -28,9 +27,7 @@
 import org.apache.cassandra.db.Clustering;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.aggregation.GroupMaker;
-import org.apache.cassandra.db.context.CounterContext;
 import org.apache.cassandra.db.rows.Cell;
-import org.apache.cassandra.utils.ByteBufferUtil;
 
 public final class ResultSetBuilder
 {
@@ -49,15 +46,11 @@
 
     /*
      * We'll build CQL3 row one by one.
-     * The currentRow is the values for the (CQL3) columns we've fetched.
-     * We also collect timestamps and ttls for the case where the writetime and
-     * ttl functions are used. Note that we might collect timestamp and/or ttls
-     * we don't care about, but since the array below are allocated just once,
-     * it doesn't matter performance wise.
      */
-    List<ByteBuffer> current;
-    final long[] timestamps;
-    final int[] ttls;
+    private Selector.InputRow inputRow;
+
+    private long size = 0;
+    private boolean sizeWarningEmitted = false;
 
     public ResultSetBuilder(ResultMetadata metadata, Selectors selectors)
     {
@@ -69,52 +62,45 @@
         this.resultSet = new ResultSet(metadata.copy(), new ArrayList<List<ByteBuffer>>());
         this.selectors = selectors;
         this.groupMaker = groupMaker;
-        this.timestamps = selectors.collectTimestamps() ? new long[selectors.numberOfFetchedColumns()] : null;
-        this.ttls = selectors.collectTTLs() ? new int[selectors.numberOfFetchedColumns()] : null;
+    }
 
-        // We use MIN_VALUE to indicate no timestamp and -1 for no ttl
-        if (timestamps != null)
-            Arrays.fill(timestamps, Long.MIN_VALUE);
-        if (ttls != null)
-            Arrays.fill(ttls, -1);
+    private void addSize(List<ByteBuffer> row)
+    {
+        for (int i=0, isize=row.size(); i<isize; i++)
+        {
+            ByteBuffer value = row.get(i);
+            size += value != null ? value.remaining() : 0;
+        }
+    }
+
+    public boolean shouldWarn(long thresholdBytes)
+    {
+        if (thresholdBytes != -1 &&!sizeWarningEmitted && size > thresholdBytes)
+        {
+            sizeWarningEmitted = true;
+            return true;
+        }
+        return false;
+    }
+
+    public boolean shouldReject(long thresholdBytes)
+    {
+        return thresholdBytes != -1 && size > thresholdBytes;
+    }
+
+    public long getSize()
+    {
+        return size;
     }
 
     public void add(ByteBuffer v)
     {
-        current.add(v);
+        inputRow.add(v);
     }
 
     public void add(Cell<?> c, int nowInSec)
     {
-        if (c == null)
-        {
-            current.add(null);
-            return;
-        }
-
-        current.add(value(c));
-
-        if (timestamps != null)
-            timestamps[current.size() - 1] = c.timestamp();
-
-        if (ttls != null)
-            ttls[current.size() - 1] = remainingTTL(c, nowInSec);
-    }
-
-    private int remainingTTL(Cell<?> c, int nowInSec)
-    {
-        if (!c.isExpiring())
-            return -1;
-
-        int remaining = c.localDeletionTime() - nowInSec;
-        return remaining >= 0 ? remaining : -1;
-    }
-
-    private <V> ByteBuffer value(Cell<V> c)
-    {
-        return c.isCounterCell()
-             ? ByteBufferUtil.bytes(CounterContext.instance().total(c.value(), c.accessor()))
-             : c.buffer();
+        inputRow.add(c, nowInSec);
     }
 
     /**
@@ -127,22 +113,24 @@
     {
         // The groupMaker needs to be called for each row
         boolean isNewAggregate = groupMaker == null || groupMaker.isNewGroup(partitionKey, clustering);
-        if (current != null)
+        if (inputRow != null)
         {
-            selectors.addInputRow(this);
+            selectors.addInputRow(inputRow);
             if (isNewAggregate)
             {
                 resultSet.addRow(getOutputRow());
+                inputRow.reset(!selectors.hasProcessing());
                 selectors.reset();
             }
+            else
+            {
+                inputRow.reset(!selectors.hasProcessing());
+            }
         }
-        current = new ArrayList<>(selectors.numberOfFetchedColumns());
-
-        // Timestamps and TTLs are arrays per row, we must null them out between rows
-        if (timestamps != null)
-            Arrays.fill(timestamps, Long.MIN_VALUE);
-        if (ttls != null)
-            Arrays.fill(ttls, -1);
+        else
+        {
+            inputRow = new Selector.InputRow(selectors.numberOfFetchedColumns(), selectors.collectTimestamps(), selectors.collectTTLs());
+        }
     }
 
     /**
@@ -150,12 +138,12 @@
      */
     public ResultSet build()
     {
-        if (current != null)
+        if (inputRow  != null)
         {
-            selectors.addInputRow(this);
+            selectors.addInputRow(inputRow);
             resultSet.addRow(getOutputRow());
+            inputRow.reset(!selectors.hasProcessing());
             selectors.reset();
-            current = null;
         }
 
         // For aggregates we need to return a row even it no records have been found
@@ -166,6 +154,8 @@
 
     private List<ByteBuffer> getOutputRow()
     {
-        return selectors.getOutputRow();
+        List<ByteBuffer> row = selectors.getOutputRow();
+        addSize(row);
+        return row;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java b/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java
index de74678..ed2a140 100644
--- a/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/ScalarFunctionSelector.java
@@ -22,17 +22,27 @@
 
 import org.apache.cassandra.cql3.functions.Function;
 import org.apache.cassandra.cql3.functions.ScalarFunction;
-import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.transport.ProtocolVersion;
 
+import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue;
+
 final class ScalarFunctionSelector extends AbstractFunctionSelector<ScalarFunction>
 {
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    protected static final SelectorDeserializer deserializer = new AbstractFunctionSelectorDeserializer()
+    {
+        @Override
+        protected Selector newFunctionSelector(Function function, List<Selector> argSelectors)
+        {
+            return new ScalarFunctionSelector(function, argSelectors);
+        }
+    };
+
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         for (int i = 0, m = argSelectors.size(); i < m; i++)
         {
             Selector s = argSelectors.get(i);
-            s.addInput(protocolVersion, rs);
+            s.addInput(protocolVersion, input);
         }
     }
 
@@ -40,7 +50,7 @@
     {
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         for (int i = 0, m = argSelectors.size(); i < m; i++)
         {
@@ -51,8 +61,16 @@
         return fun.execute(protocolVersion, args());
     }
 
+    @Override
+    public void validateForGroupBy()
+    {
+        checkTrue(fun.isMonotonic(), "Only monotonic functions are supported in the GROUP BY clause. Got: %s ", fun);
+        for (int i = 0, m = argSelectors.size(); i < m; i++)
+            argSelectors.get(i).validateForGroupBy();
+    }
+
     ScalarFunctionSelector(Function fun, List<Selector> argSelectors)
     {
-        super((ScalarFunction) fun, argSelectors);
+        super(Kind.SCALAR_FUNCTION_SELECTOR, (ScalarFunction) fun, argSelectors);
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/Selection.java b/src/java/org/apache/cassandra/cql3/selection/Selection.java
index 77e4cc8..f07184a 100644
--- a/src/java/org/apache/cassandra/cql3/selection/Selection.java
+++ b/src/java/org/apache/cassandra/cql3/selection/Selection.java
@@ -28,6 +28,7 @@
 
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.cql3.functions.Function;
+import org.apache.cassandra.cql3.selection.Selector.InputRow;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -346,6 +347,12 @@
         public ColumnFilter getColumnFilter();
 
         /**
+         * Checks if this Selectors perform some processing
+         * @return {@code true} if this Selectors perform some processing, {@code false} otherwise.
+         */
+        public boolean hasProcessing();
+
+        /**
          * Checks if one of the selectors perform some aggregations.
          * @return {@code true} if one of the selectors perform some aggregations, {@code false} otherwise.
          */
@@ -372,10 +379,9 @@
         /**
          * Adds the current row of the specified <code>ResultSetBuilder</code>.
          *
-         * @param rs the <code>ResultSetBuilder</code>
-         * @throws InvalidRequestException
+         * @param input the input row
          */
-        public void addInputRow(ResultSetBuilder rs);
+        public void addInputRow(InputRow input);
 
         public List<ByteBuffer> getOutputRow();
 
@@ -467,9 +473,9 @@
                     return current;
                 }
 
-                public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException
+                public void addInputRow(InputRow input)
                 {
-                    current = rs.current;
+                    current = input.getValues();
                 }
 
                 public boolean isAggregate()
@@ -477,6 +483,11 @@
                     return false;
                 }
 
+                public boolean hasProcessing()
+                {
+                    return false;
+                }
+
                 @Override
                 public int numberOfFetchedColumns()
                 {
@@ -572,6 +583,11 @@
                     return factories.doesAggregation();
                 }
 
+                public boolean hasProcessing()
+                {
+                    return true;
+                }
+
                 public List<ByteBuffer> getOutputRow()
                 {
                     List<ByteBuffer> outputRow = new ArrayList<>(selectors.size());
@@ -582,10 +598,10 @@
                     return isJson ? rowToJson(outputRow, options.getProtocolVersion(), metadata, orderingColumns) : outputRow;
                 }
 
-                public void addInputRow(ResultSetBuilder rs) throws InvalidRequestException
+                public void addInputRow(InputRow input)
                 {
                     for (Selector selector : selectors)
-                        selector.addInput(options.getProtocolVersion(), rs);
+                        selector.addInput(options.getProtocolVersion(), input);
                 }
 
                 @Override
diff --git a/src/java/org/apache/cassandra/cql3/selection/Selector.java b/src/java/org/apache/cassandra/cql3/selection/Selector.java
index 3262b9c..463382d 100644
--- a/src/java/org/apache/cassandra/cql3/selection/Selector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/Selector.java
@@ -17,18 +17,31 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.Arrays;
 import java.util.List;
 
+import org.apache.cassandra.schema.CQLTypeParser;
+import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.functions.Function;
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.db.context.CounterContext;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.rows.Cell;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
 
 /**
  * A <code>Selector</code> is used to convert the data returned by the storage engine into the data requested by the
@@ -38,6 +51,50 @@
  */
 public abstract class Selector
 {
+    protected static abstract class SelectorDeserializer
+    {
+        protected abstract Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException;
+
+        protected final AbstractType<?> readType(TableMetadata metadata, DataInputPlus in) throws IOException
+        {
+            KeyspaceMetadata keyspace = Schema.instance.getKeyspaceMetadata(metadata.keyspace);
+            return readType(keyspace, in);
+        }
+
+        protected final AbstractType<?> readType(KeyspaceMetadata keyspace, DataInputPlus in) throws IOException
+        {
+            String cqlType = in.readUTF();
+            return CQLTypeParser.parse(keyspace.name, cqlType, keyspace.types);
+        }
+    }
+
+    /**
+     * The <code>Selector</code> kinds.
+     */
+    public static enum Kind
+    {
+        SIMPLE_SELECTOR(SimpleSelector.deserializer),
+        TERM_SELECTOR(TermSelector.deserializer),
+        WRITETIME_OR_TTL_SELECTOR(WritetimeOrTTLSelector.deserializer),
+        LIST_SELECTOR(ListSelector.deserializer),
+        SET_SELECTOR(SetSelector.deserializer),
+        MAP_SELECTOR(MapSelector.deserializer),
+        TUPLE_SELECTOR(TupleSelector.deserializer),
+        USER_TYPE_SELECTOR(UserTypeSelector.deserializer),
+        FIELD_SELECTOR(FieldSelector.deserializer),
+        SCALAR_FUNCTION_SELECTOR(ScalarFunctionSelector.deserializer),
+        AGGREGATE_FUNCTION_SELECTOR(AggregateFunctionSelector.deserializer),
+        ELEMENT_SELECTOR(ElementsSelector.ElementSelector.deserializer),
+        SLICE_SELECTOR(ElementsSelector.SliceSelector.deserializer);
+
+        private final SelectorDeserializer deserializer;
+
+        Kind(SelectorDeserializer deserializer)
+        {
+            this.deserializer = deserializer;
+        }
+    }
+
     /**
      * A factory for <code>Selector</code> instances.
      */
@@ -70,7 +127,7 @@
          * depends on the bound values in particular).
          * @return a new <code>Selector</code> instance
          */
-        public abstract Selector newInstance(QueryOptions options) throws InvalidRequestException;
+        public abstract Selector newInstance(QueryOptions options);
 
         /**
          * Checks if this factory creates selectors instances that creates aggregates.
@@ -174,6 +231,50 @@
         abstract void addFetchedColumns(ColumnFilter.Builder builder);
     }
 
+    public static class Serializer
+    {
+        public void serialize(Selector selector, DataOutputPlus out, int version) throws IOException
+        {
+            out.writeByte(selector.kind().ordinal());
+            selector.serialize(out, version);
+        }
+
+        public Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            Kind kind = Kind.values()[in.readUnsignedByte()];
+            return kind.deserializer.deserialize(in, version, metadata);
+        }
+
+        public int serializedSize(Selector selector, int version)
+        {
+            return TypeSizes.sizeof((byte) selector.kind().ordinal()) + selector.serializedSize(version);
+        }
+    }
+
+    /**
+     * The {@code Selector} serializer.
+     */
+    public static final Serializer serializer = new Serializer();
+
+    /**
+     * The {@code Selector} kind.
+     */
+    private final Kind kind;
+
+    /**
+     * Returns the {@code Selector} kind.
+     * @return the {@code Selector} kind
+     */
+    public final Kind kind()
+    {
+        return kind;
+    }
+
+    protected Selector(Kind kind)
+    {
+        this.kind = kind;
+    }
+
     /**
      * Add to the provided builder the column (and potential subselections) to fetch for this
      * selection.
@@ -183,13 +284,157 @@
     public abstract void addFetchedColumns(ColumnFilter.Builder builder);
 
     /**
+     * A row of data that need to be processed by a {@code Selector}
+     */
+    public static final class InputRow
+    {
+        private ByteBuffer[] values;
+        private final long[] timestamps;
+        private final int[] ttls;
+        private int index;
+
+        public InputRow(int size, boolean collectTimestamps, boolean collectTTLs)
+        {
+            this.values = new ByteBuffer[size];
+
+            if (collectTimestamps)
+            {
+                this.timestamps = new long[size];
+                // We use MIN_VALUE to indicate no timestamp
+                Arrays.fill(timestamps, Long.MIN_VALUE);
+            }
+            else
+            {
+                timestamps = null;
+            }
+
+            if (collectTTLs)
+            {
+                this.ttls = new int[size];
+                // We use -1 to indicate no ttl
+                Arrays.fill(ttls, -1);
+            }
+            else
+            {
+                ttls = null;
+            }
+        }
+
+        public void add(ByteBuffer v)
+        {
+            values[index] = v;
+
+            if (timestamps != null)
+                timestamps[index] = Long.MIN_VALUE;
+
+            if (ttls != null)
+                ttls[index] = -1;
+
+            index++;
+        }
+
+        public void add(Cell<?> c, int nowInSec)
+        {
+            if (c == null)
+            {
+                add(null);
+                return;
+            }
+
+            values[index] = value(c);
+
+            if (timestamps != null)
+                timestamps[index] = c.timestamp();
+
+            if (ttls != null)
+                ttls[index] = remainingTTL(c, nowInSec);
+
+            index++;
+        }
+
+        private int remainingTTL(Cell<?> c, int nowInSec)
+        {
+            if (!c.isExpiring())
+                return -1;
+
+            int remaining = c.localDeletionTime() - nowInSec;
+            return remaining >= 0 ? remaining : -1;
+        }
+
+        private <V> ByteBuffer value(Cell<V> c)
+        {
+            return c.isCounterCell()
+                 ? ByteBufferUtil.bytes(CounterContext.instance().total(c.value(), c.accessor()))
+                 : c.buffer();
+        }
+
+        /**
+         * Return the value of the column with the specified index.
+         *
+         * @param index the column index
+         * @return the value of the column with the specified index
+         */
+        public ByteBuffer getValue(int index)
+        {
+            return values[index];
+        }
+
+        /**
+         * Reset the row internal state.
+         * <p>If the reset is not a deep one only the index will be reset. If the reset is a deep one a new
+         * array will be created to store the column values. This allow to reduce object creation when it is not
+         * necessary.</p>
+         *
+         * @param deep {@code true} if the reset must be a deep one.
+         */
+        public void reset(boolean deep)
+        {
+            index = 0;
+            if (deep)
+                values = new ByteBuffer[values.length];
+        }
+
+        /**
+         * Return the timestamp of the column with the specified index.
+         *
+         * @param index the column index
+         * @return the timestamp of the column with the specified index
+         */
+        public long getTimestamp(int index)
+        {
+            return timestamps[index];
+        }
+
+        /**
+         * Return the ttl of the column with the specified index.
+         *
+         * @param index the column index
+         * @return the ttl of the column with the specified index
+         */
+        public int getTtl(int index)
+        {
+            return ttls[index];
+        }
+
+        /**
+         * Returns the column values as list.
+         * <p>This content of the list will be shared with the {@code InputRow} unless a deep reset has been done.</p>
+         * @return the column values as list.
+         */
+        public List<ByteBuffer> getValues()
+        {
+            return Arrays.asList(values);
+        }
+    }
+
+    /**
      * Add the current value from the specified <code>ResultSetBuilder</code>.
      *
      * @param protocolVersion protocol version used for serialization
-     * @param rs the <code>ResultSetBuilder</code>
-     * @throws InvalidRequestException if a problem occurs while add the input value
+     * @param input the input row
+     * @throws InvalidRequestException if a problem occurs while adding the input row
      */
-    public abstract void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException;
+    public abstract void addInput(ProtocolVersion protocolVersion, InputRow input);
 
     /**
      * Returns the selector output.
@@ -211,4 +456,36 @@
      * Reset the internal state of this <code>Selector</code>.
      */
     public abstract void reset();
+
+    /**
+     * A selector is terminal if it doesn't require any input for it's output to be computed, i.e. if {@link #getOutput}
+     * result doesn't depend of {@link #addInput}. This is typically the case of a constant value or functions on constant
+     * values.
+     */
+    public boolean isTerminal()
+    {
+        return false;
+    }
+
+    /**
+     * Checks that this selector is valid for GROUP BY clause.
+     */
+    public void validateForGroupBy()
+    {
+        throw invalidRequest("Only column names and monotonic scalar functions are supported in the GROUP BY clause.");
+    }
+
+    protected abstract int serializedSize(int version);
+
+    protected abstract void serialize(DataOutputPlus out, int version) throws IOException;
+
+    protected static void writeType(DataOutputPlus out, AbstractType<?> type) throws IOException
+    {
+        out.writeUTF(type.asCQL3Type().toString());
+    }
+
+    protected static int sizeOf(AbstractType<?> type)
+    {
+        return TypeSizes.sizeof(type.asCQL3Type().toString());
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/SetSelector.java b/src/java/org/apache/cassandra/cql3/selection/SetSelector.java
index 6693121..b54b2d4 100644
--- a/src/java/org/apache/cassandra/cql3/selection/SetSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/SetSelector.java
@@ -17,17 +17,24 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.Sets;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter.Builder;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.SetType;
-import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.transport.ProtocolVersion;
 
@@ -37,6 +44,20 @@
  */
 final class SetSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            SetType<?> type = (SetType<?>) readType(metadata, in);
+            int size = (int) in.readUnsignedVInt();
+            List<Selector> elements = new ArrayList<>(size);
+            for (int i = 0; i < size; i++)
+                elements.add(serializer.deserialize(in, version, metadata));
+
+            return new SetSelector(type, elements);
+        }
+    };
+
     /**
      * The set type.
      */
@@ -70,13 +91,13 @@
             elements.get(i).addFetchedColumns(builder);
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         for (int i = 0, m = elements.size(); i < m; i++)
-            elements.get(i).addInput(protocolVersion, rs);
+            elements.get(i).addInput(protocolVersion, input);
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         Set<ByteBuffer> buffers = new TreeSet<>(type.getElementsType());
         for (int i = 0, m = elements.size(); i < m; i++)
@@ -92,6 +113,17 @@
             elements.get(i).reset();
     }
 
+    @Override
+    public boolean isTerminal()
+    {
+        for (int i = 0, m = elements.size(); i < m; i++)
+        {
+            if (!elements.get(i).isTerminal())
+                return false;
+        }
+        return true;
+    }
+
     public AbstractType<?> getType()
     {
         return type;
@@ -105,7 +137,49 @@
 
     private SetSelector(AbstractType<?> type, List<Selector> elements)
     {
+        super(Kind.SET_SELECTOR);
         this.type = (SetType<?>) type;
         this.elements = elements;
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof SetSelector))
+            return false;
+
+        SetSelector s = (SetSelector) o;
+
+        return Objects.equal(type, s.type)
+            && Objects.equal(elements, s.elements);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(type, elements);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        int size = sizeOf(type) + TypeSizes.sizeofUnsignedVInt(elements.size());
+
+        for (int i = 0, m = elements.size(); i < m; i++)
+            size += serializer.serializedSize(elements.get(i), version);
+
+        return size;
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        writeType(out, type);
+        out.writeUnsignedVInt(elements.size());
+        for (int i = 0, m = elements.size(); i < m; i++)
+            serializer.serialize(elements.get(i), out, version);
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java
index 31b1911..a6ae446 100644
--- a/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/SimpleSelector.java
@@ -17,19 +17,38 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.filter.ColumnFilter.Builder;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.utils.ByteBufferUtil;
 
 public final class SimpleSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            ByteBuffer columnName = ByteBufferUtil.readWithVIntLength(in);
+            ColumnMetadata column = metadata.getColumn(columnName);
+            int idx = in.readInt();
+            return new SimpleSelector(column, idx);
+        }
+    };
+
     /**
      * The Factory for {@code SimpleSelector}.
      */
@@ -113,17 +132,17 @@
     }
 
     @Override
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input) throws InvalidRequestException
     {
         if (!isSet)
         {
             isSet = true;
-            current = rs.current.get(idx);
+            current = input.getValue(idx);
         }
     }
 
     @Override
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         return current;
     }
@@ -149,7 +168,48 @@
 
     private SimpleSelector(ColumnMetadata column, int idx)
     {
+        super(Kind.SIMPLE_SELECTOR);
         this.column = column;
         this.idx = idx;
     }
+
+    @Override
+    public void validateForGroupBy()
+    {
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof SimpleSelector))
+            return false;
+
+        SimpleSelector s = (SimpleSelector) o;
+
+        return Objects.equal(column, s.column)
+            && Objects.equal(idx, s.idx);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(column, idx);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        return ByteBufferUtil.serializedSizeWithVIntLength(column.name.bytes)
+                + TypeSizes.sizeof(idx);
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        ByteBufferUtil.writeWithVIntLength(column.name.bytes, out);
+        out.writeInt(idx);;
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/TermSelector.java b/src/java/org/apache/cassandra/cql3/selection/TermSelector.java
index 321cd27..6f0c844 100644
--- a/src/java/org/apache/cassandra/cql3/selection/TermSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/TermSelector.java
@@ -17,16 +17,22 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.Term;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
  * Selector representing a simple term (literals or bound variables).
@@ -36,6 +42,16 @@
  */
 public class TermSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            AbstractType<?> type = readType(metadata, in);
+            ByteBuffer value = ByteBufferUtil.readWithVIntLength(in);
+            return new TermSelector(value, type);
+        }
+    };
+
     private final ByteBuffer value;
     private final AbstractType<?> type;
 
@@ -74,8 +90,9 @@
         };
     }
 
-    private TermSelector(ByteBuffer value, AbstractType<?> type)
+    TermSelector(ByteBuffer value, AbstractType<?> type)
     {
+        super(Kind.TERM_SELECTOR);
         this.value = value;
         this.type = type;
     }
@@ -84,11 +101,11 @@
     {
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         return value;
     }
@@ -101,4 +118,44 @@
     public void reset()
     {
     }
+
+    @Override
+    public boolean isTerminal()
+    {
+        return true;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof TermSelector))
+            return false;
+
+        TermSelector s = (TermSelector) o;
+
+        return Objects.equal(value, s.value)
+            && Objects.equal(type, s.type);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(value, type);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        return sizeOf(type) + ByteBufferUtil.serializedSizeWithVIntLength(value);
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        writeType(out, type);
+        ByteBufferUtil.writeWithVIntLength(value, out);
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java b/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java
index 898085b..0c06bc2 100644
--- a/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/TupleSelector.java
@@ -17,15 +17,23 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.List;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.Tuples;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter.Builder;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.TupleType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
@@ -34,6 +42,20 @@
  */
 final class TupleSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            AbstractType<?> type = readType(metadata, in);
+            int size = (int) in.readUnsignedVInt();
+            List<Selector> elements = new ArrayList<>(size);
+            for (int i = 0; i < size; i++)
+                elements.add(serializer.deserialize(in, version, metadata));
+
+            return new TupleSelector(type, elements);
+        }
+    };
+
     /**
      * The tuple type.
      */
@@ -67,10 +89,10 @@
             elements.get(i).addFetchedColumns(builder);
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         for (int i = 0, m = elements.size(); i < m; i++)
-            elements.get(i).addInput(protocolVersion, rs);
+            elements.get(i).addInput(protocolVersion, input);
     }
 
     public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
@@ -89,6 +111,17 @@
             elements.get(i).reset();
     }
 
+    @Override
+    public boolean isTerminal()
+    {
+        for (int i = 0, m = elements.size(); i < m; i++)
+        {
+            if (!elements.get(i).isTerminal())
+                return false;
+        }
+        return true;
+    }
+
     public AbstractType<?> getType()
     {
         return type;
@@ -102,7 +135,50 @@
 
     private TupleSelector(AbstractType<?> type, List<Selector> elements)
     {
+        super(Kind.TUPLE_SELECTOR);
         this.type = type;
         this.elements = elements;
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof TupleSelector))
+            return false;
+
+        TupleSelector s = (TupleSelector) o;
+
+        return Objects.equal(type, s.type)
+            && Objects.equal(elements, s.elements);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(type, elements);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        int size = sizeOf(type) + TypeSizes.sizeofUnsignedVInt(elements.size());
+
+        for (int i = 0, m = elements.size(); i < m; i++)
+            size += serializer.serializedSize(elements.get(i), version);
+
+        return size;
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        writeType(out, type);
+        out.writeUnsignedVInt(elements.size());
+
+        for (int i = 0, m = elements.size(); i < m; i++)
+            serializer.serialize(elements.get(i), out, version);
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java b/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java
index 61faf8d..8007467 100644
--- a/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/UserTypeSelector.java
@@ -17,25 +17,32 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.FieldIdentifier;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.UserTypes;
 import org.apache.cassandra.cql3.functions.Function;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.filter.ColumnFilter.Builder;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.TupleType;
 import org.apache.cassandra.db.marshal.UserType;
-import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
  * <code>Selector</code> for literal map (e.g. {'min' : min(value), 'max' : max(value), 'count' : count(value)}).
@@ -43,6 +50,23 @@
  */
 final class UserTypeSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            UserType type = (UserType) readType(metadata, in);
+            int size = (int) in.readUnsignedVInt();
+            Map<FieldIdentifier, Selector> fields = new HashMap<>(size);
+            for (int i = 0; i < size; i++)
+            {
+                FieldIdentifier identifier = new FieldIdentifier(ByteBufferUtil.readWithVIntLength(in));
+                Selector selector = serializer.deserialize(in, version, metadata);
+                fields.put(identifier, selector);
+            }
+            return new UserTypeSelector(type, fields);
+        }
+    };
+
     /**
      * The map type.
      */
@@ -158,13 +182,13 @@
             field.addFetchedColumns(builder);
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs) throws InvalidRequestException
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         for (Selector field : fields.values())
-            field.addInput(protocolVersion, rs);
+            field.addInput(protocolVersion, input);
     }
 
-    public ByteBuffer getOutput(ProtocolVersion protocolVersion) throws InvalidRequestException
+    public ByteBuffer getOutput(ProtocolVersion protocolVersion)
     {
         UserType userType = (UserType) type;
         ByteBuffer[] buffers = new ByteBuffer[userType.size()];
@@ -183,6 +207,17 @@
             field.reset();
     }
 
+    @Override
+    public boolean isTerminal()
+    {
+        for (Selector field : fields.values())
+        {
+            if(!field.isTerminal())
+                return false;
+        }
+        return true;
+    }
+
     public AbstractType<?> getType()
     {
         return type;
@@ -196,7 +231,53 @@
 
     private UserTypeSelector(AbstractType<?> type, Map<FieldIdentifier, Selector> fields)
     {
+        super(Kind.USER_TYPE_SELECTOR);
         this.type = type;
         this.fields = fields;
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof UserTypeSelector))
+            return false;
+
+        UserTypeSelector s = (UserTypeSelector) o;
+
+        return Objects.equal(type, s.type)
+            && Objects.equal(fields, s.fields);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(type, fields);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        int size = sizeOf(type) + TypeSizes.sizeofUnsignedVInt(fields.size());
+
+        for (Map.Entry<FieldIdentifier, Selector> field : fields.entrySet())
+            size += ByteBufferUtil.serializedSizeWithVIntLength(field.getKey().bytes) + serializer.serializedSize(field.getValue(), version);
+
+        return size;
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        writeType(out, type);
+        out.writeUnsignedVInt(fields.size());
+
+        for (Map.Entry<FieldIdentifier, Selector> field : fields.entrySet())
+        {
+            ByteBufferUtil.writeWithVIntLength(field.getKey().bytes, out);
+            serializer.serialize(field.getValue(), out, version);
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java
index 95586f2..2c56f5c 100644
--- a/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java
+++ b/src/java/org/apache/cassandra/cql3/selection/WritetimeOrTTLSelector.java
@@ -17,20 +17,39 @@
  */
 package org.apache.cassandra.cql3.selection;
 
+import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import com.google.common.base.Objects;
+
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.ColumnSpecification;
+import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.marshal.LongType;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 final class WritetimeOrTTLSelector extends Selector
 {
+    protected static final SelectorDeserializer deserializer = new SelectorDeserializer()
+    {
+        protected Selector deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
+        {
+            ByteBuffer columnName = ByteBufferUtil.readWithVIntLength(in);
+            ColumnMetadata column = metadata.getColumn(columnName);
+            int idx = in.readInt();
+            boolean isWritetime = in.readBoolean();
+            return new WritetimeOrTTLSelector(column, idx, isWritetime);
+        }
+    };
+
     private final ColumnMetadata column;
     private final int idx;
     private final boolean isWritetime;
@@ -88,7 +107,7 @@
         builder.add(column);
     }
 
-    public void addInput(ProtocolVersion protocolVersion, ResultSetBuilder rs)
+    public void addInput(ProtocolVersion protocolVersion, InputRow input)
     {
         if (isSet)
             return;
@@ -97,12 +116,12 @@
 
         if (isWritetime)
         {
-            long ts = rs.timestamps[idx];
+            long ts = input.getTimestamp(idx);
             current = ts != Long.MIN_VALUE ? ByteBufferUtil.bytes(ts) : null;
         }
         else
         {
-            int ttl = rs.ttls[idx];
+            int ttl = input.getTtl(idx);
             current = ttl > 0 ? ByteBufferUtil.bytes(ttl) : null;
         }
     }
@@ -131,8 +150,47 @@
 
     private WritetimeOrTTLSelector(ColumnMetadata column, int idx, boolean isWritetime)
     {
+        super(Kind.WRITETIME_OR_TTL_SELECTOR);
         this.column = column;
         this.idx = idx;
         this.isWritetime = isWritetime;
     }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof WritetimeOrTTLSelector))
+            return false;
+
+        WritetimeOrTTLSelector s = (WritetimeOrTTLSelector) o;
+
+        return Objects.equal(column, s.column)
+            && Objects.equal(idx, s.idx)
+            && Objects.equal(isWritetime, s.isWritetime);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hashCode(column, idx, isWritetime);
+    }
+
+    @Override
+    protected int serializedSize(int version)
+    {
+        return ByteBufferUtil.serializedSizeWithVIntLength(column.name.bytes)
+                + TypeSizes.sizeof(idx)
+                + TypeSizes.sizeof(isWritetime);
+    }
+
+    @Override
+    protected void serialize(DataOutputPlus out, int version) throws IOException
+    {
+        ByteBufferUtil.writeWithVIntLength(column.name.bytes, out);
+        out.writeInt(idx);
+        out.writeBoolean(isWritetime);
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/statements/AlterRoleStatement.java b/src/java/org/apache/cassandra/cql3/statements/AlterRoleStatement.java
index 2ffd050..eb0e3e0 100644
--- a/src/java/org/apache/cassandra/cql3/statements/AlterRoleStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/AlterRoleStatement.java
@@ -29,23 +29,26 @@
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
+import static org.apache.cassandra.cql3.statements.RequestValidations.*;
 
 public class AlterRoleStatement extends AuthenticationStatement
 {
     private final RoleResource role;
     private final RoleOptions opts;
     final DCPermissions dcPermissions;
+    private final boolean ifExists;
 
     public AlterRoleStatement(RoleName name, RoleOptions opts)
     {
-        this(name, opts, null);
+        this(name, opts, null, false);
     }
 
-    public AlterRoleStatement(RoleName name, RoleOptions opts, DCPermissions dcPermissions)
+    public AlterRoleStatement(RoleName name, RoleOptions opts, DCPermissions dcPermissions, boolean ifExists)
     {
         this.role = RoleResource.role(name.getName());
         this.opts = opts;
         this.dcPermissions = dcPermissions;
+        this.ifExists = ifExists;
     }
 
     public void validate(ClientState state) throws RequestValidationException
@@ -63,7 +66,9 @@
         // validate login here before authorize to avoid leaking user existence to anonymous users.
         state.ensureNotAnonymous();
         if (!DatabaseDescriptor.getRoleManager().isExistingRole(role))
-            throw new InvalidRequestException(String.format("%s doesn't exist", role.getRoleName()));
+        {
+            checkTrue(ifExists, "Role %s doesn't exist", role.getRoleName());
+        }
     }
 
     public void authorize(ClientState state) throws UnauthorizedException
@@ -106,7 +111,7 @@
             DatabaseDescriptor.getNetworkAuthorizer().setRoleDatacenters(role, dcPermissions);
         return null;
     }
-    
+
     @Override
     public String toString()
     {
diff --git a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java
index 946f5de..61e4934 100644
--- a/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/BatchStatement.java
@@ -31,6 +31,7 @@
 
 import org.apache.cassandra.audit.AuditLogContext;
 import org.apache.cassandra.audit.AuditLogEntryType;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.ColumnMetadata;
@@ -51,6 +52,7 @@
 import static java.util.function.Predicate.isEqual;
 
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * A <code>BATCH</code> statement parsed from a CQL query.
@@ -232,10 +234,10 @@
             String cfName = null;
             for (ModificationStatement stmt : statements)
             {
-                if (ksName != null && (!stmt.keyspace().equals(ksName) || !stmt.columnFamily().equals(cfName)))
+                if (ksName != null && (!stmt.keyspace().equals(ksName) || !stmt.table().equals(cfName)))
                     throw new InvalidRequestException("Batch with conditions cannot span multiple tables");
                 ksName = stmt.keyspace();
-                cfName = stmt.columnFamily();
+                cfName = stmt.table();
             }
         }
     }
@@ -264,7 +266,8 @@
     }
 
     @VisibleForTesting
-    public List<? extends IMutation> getMutations(BatchQueryOptions options,
+    public List<? extends IMutation> getMutations(ClientState state,
+                                                  BatchQueryOptions options,
                                                   boolean local,
                                                   long batchTimestamp,
                                                   int nowInSeconds,
@@ -280,7 +283,7 @@
             ModificationStatement stmt = statements.get(i);
             if (metadata != null && !stmt.metadata.id.equals(metadata.id))
                 metadata = null;
-            List<ByteBuffer> stmtPartitionKeys = stmt.buildPartitionKeyNames(options.forStatement(i));
+            List<ByteBuffer> stmtPartitionKeys = stmt.buildPartitionKeyNames(options.forStatement(i), state);
             partitionKeys.add(stmtPartitionKeys);
             HashMultiset<ByteBuffer> perKeyCountsForTable = partitionCounts.computeIfAbsent(stmt.metadata.id, k -> HashMultiset.create());
             for (int stmtIdx = 0, stmtSize = stmtPartitionKeys.size(); stmtIdx < stmtSize; stmtIdx++)
@@ -305,7 +308,7 @@
             }
             QueryOptions statementOptions = options.forStatement(i);
             long timestamp = attrs.getTimestamp(batchTimestamp, statementOptions);
-            statement.addUpdates(collector, partitionKeys.get(i), statementOptions, local, timestamp, nowInSeconds, queryStartNanoTime);
+            statement.addUpdates(collector, partitionKeys.get(i), state, statementOptions, local, timestamp, nowInSeconds, queryStartNanoTime);
         }
 
         if (tablesWithZeroGcGs != null)
@@ -348,9 +351,9 @@
             if (size > failThreshold)
             {
                 Tracing.trace(format, tableNames, FBUtilities.prettyPrintMemory(size), FBUtilities.prettyPrintMemory(failThreshold),
-                              FBUtilities.prettyPrintMemory(size - failThreshold), " (see batch_size_fail_threshold_in_kb)");
+                              FBUtilities.prettyPrintMemory(size - failThreshold), " (see batch_size_fail_threshold)");
                 logger.error(format, tableNames, FBUtilities.prettyPrintMemory(size), FBUtilities.prettyPrintMemory(failThreshold),
-                             FBUtilities.prettyPrintMemory(size - failThreshold), " (see batch_size_fail_threshold_in_kb)");
+                             FBUtilities.prettyPrintMemory(size - failThreshold), " (see batch_size_fail_threshold)");
                 throw new InvalidRequestException("Batch too large");
             }
             else if (logger.isWarnEnabled())
@@ -408,13 +411,21 @@
         if (options.getSerialConsistency() == null)
             throw new InvalidRequestException("Invalid empty serial consistency level");
 
+        ClientState clientState = queryState.getClientState();
+        Guardrails.writeConsistencyLevels.guard(EnumSet.of(options.getConsistency(), options.getSerialConsistency()),
+                                                clientState);
+
+        for (int i = 0; i < statements.size(); i++ )
+            statements.get(i).validateDiskUsage(options.forStatement(i), clientState);
+
         if (hasConditions)
             return executeWithConditions(options, queryState, queryStartNanoTime);
 
         if (updatesVirtualTables)
             executeInternalWithoutCondition(queryState, options, queryStartNanoTime);
         else    
-            executeWithoutConditions(getMutations(options, false, timestamp, nowInSeconds, queryStartNanoTime), options.getConsistency(), queryStartNanoTime);
+            executeWithoutConditions(getMutations(clientState, options, false, timestamp, nowInSeconds, queryStartNanoTime),
+                                     options.getConsistency(), queryStartNanoTime);
 
         return new ResultMessage.Void();
     }
@@ -486,7 +497,7 @@
             ModificationStatement statement = statements.get(i);
             QueryOptions statementOptions = options.forStatement(i);
             long timestamp = attrs.getTimestamp(batchTimestamp, statementOptions);
-            List<ByteBuffer> pks = statement.buildPartitionKeyNames(statementOptions);
+            List<ByteBuffer> pks = statement.buildPartitionKeyNames(statementOptions, state.getClientState());
             if (statement.getRestrictions().keyIsInRelation())
                 throw new IllegalArgumentException("Batch with conditions cannot span multiple partitions (you cannot use IN on the partition key)");
             if (key == null)
@@ -521,7 +532,7 @@
             }
             else
             {
-                Clustering<?> clustering = Iterables.getOnlyElement(statement.createClustering(statementOptions));
+                Clustering<?> clustering = Iterables.getOnlyElement(statement.createClustering(statementOptions, state.getClientState()));
                 if (statement.hasConditions())
                 {
                     statement.addConditions(clustering, casRequest, statementOptions);
@@ -550,7 +561,7 @@
         if (hasConditions)
             return executeInternalWithConditions(batchOptions, queryState);
 
-        executeInternalWithoutCondition(queryState, batchOptions, System.nanoTime());
+        executeInternalWithoutCondition(queryState, batchOptions, nanoTime());
         return new ResultMessage.Void();
     }
 
@@ -559,7 +570,7 @@
         long timestamp = batchOptions.getTimestamp(queryState);
         int nowInSeconds = batchOptions.getNowInSeconds(queryState);
 
-        for (IMutation mutation : getMutations(batchOptions, true, timestamp, nowInSeconds, queryStartNanoTime))
+        for (IMutation mutation : getMutations(queryState.getClientState(), batchOptions, true, timestamp, nowInSeconds, queryStartNanoTime))
             mutation.apply();
         return null;
     }
@@ -576,7 +587,7 @@
         long timestamp = options.getTimestamp(state);
         int nowInSeconds = options.getNowInSeconds(state);
 
-        try (RowIterator result = ModificationStatement.casInternal(request, timestamp, nowInSeconds))
+        try (RowIterator result = ModificationStatement.casInternal(state.getClientState(), request, timestamp, nowInSeconds))
         {
             ResultSet resultSet =
                 ModificationStatement.buildCasResultSet(ksName,
diff --git a/src/java/org/apache/cassandra/cql3/statements/BatchUpdatesCollector.java b/src/java/org/apache/cassandra/cql3/statements/BatchUpdatesCollector.java
index cb88bdd..c346eb9 100644
--- a/src/java/org/apache/cassandra/cql3/statements/BatchUpdatesCollector.java
+++ b/src/java/org/apache/cassandra/cql3/statements/BatchUpdatesCollector.java
@@ -24,13 +24,15 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 
+import org.apache.cassandra.db.commitlog.CommitLogSegment;
 import org.apache.cassandra.db.virtual.VirtualMutation;
+import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 /**
  * Utility class to collect updates.
@@ -131,6 +133,7 @@
             {
                 IMutation mutation = builder.build();
                 mutation.validateIndexedColumns();
+                mutation.validateSize(MessagingService.current_version, CommitLogSegment.ENTRY_OVERHEAD_SIZE);
                 ms.add(mutation);
             }
         }
diff --git a/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java b/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java
index 563a639..3db4793 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CQL3CasRequest.java
@@ -22,6 +22,7 @@
 
 import com.google.common.collect.*;
 
+import org.apache.cassandra.db.marshal.TimeUUIDType;
 import org.apache.cassandra.index.IndexRegistry;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.cql3.*;
@@ -34,7 +35,11 @@
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.service.CASRequest;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.paxos.Ballot;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.TimeUUID;
+
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -176,7 +181,7 @@
         return new RegularAndStaticColumns(statics, regulars);
     }
 
-    public SinglePartitionReadQuery readCommand(int nowInSec)
+    public SinglePartitionReadCommand readCommand(int nowInSec)
     {
         assert staticConditions != null || !conditions.isEmpty();
 
@@ -186,7 +191,7 @@
         // With only a static condition, we still want to make the distinction between a non-existing partition and one
         // that exists (has some live data) but has not static content. So we query the first live row of the partition.
         if (conditions.isEmpty())
-            return SinglePartitionReadQuery.create(metadata,
+            return SinglePartitionReadCommand.create(metadata,
                                                    nowInSec,
                                                    columnFilter,
                                                    RowFilter.NONE,
@@ -195,7 +200,7 @@
                                                    new ClusteringIndexSliceFilter(Slices.ALL, false));
 
         ClusteringIndexNamesFilter filter = new ClusteringIndexNamesFilter(conditions.navigableKeySet(), false);
-        return SinglePartitionReadQuery.create(metadata, nowInSec, key, columnFilter, filter);
+        return SinglePartitionReadCommand.create(metadata, nowInSec, key, columnFilter, filter);
     }
 
     /**
@@ -228,13 +233,14 @@
         return builder.build();
     }
 
-    public PartitionUpdate makeUpdates(FilteredPartition current) throws InvalidRequestException
+    public PartitionUpdate makeUpdates(FilteredPartition current, ClientState clientState, Ballot ballot) throws InvalidRequestException
     {
         PartitionUpdate.Builder updateBuilder = new PartitionUpdate.Builder(metadata, key, updatedColumns(), conditions.size());
+        long timeUuidNanos = 0;
         for (RowUpdate upd : updates)
-            upd.applyUpdates(current, updateBuilder);
+            timeUuidNanos = upd.applyUpdates(current, updateBuilder, clientState, ballot.msb(), timeUuidNanos);
         for (RangeDeletion upd : rangeDeletions)
-            upd.applyUpdates(current, updateBuilder);
+            upd.applyUpdates(current, updateBuilder, clientState);
 
         PartitionUpdate partitionUpdate = updateBuilder.build();
         IndexRegistry.obtain(metadata).validate(partitionUpdate);
@@ -242,6 +248,24 @@
         return partitionUpdate;
     }
 
+    private static class CASUpdateParameters extends UpdateParameters
+    {
+        final long timeUuidMsb;
+        long timeUuidNanos;
+
+        public CASUpdateParameters(TableMetadata metadata, RegularAndStaticColumns updatedColumns, ClientState state, QueryOptions options, long timestamp, int nowInSec, int ttl, Map<DecoratedKey, Partition> prefetchedRows, long timeUuidMsb, long timeUuidNanos) throws InvalidRequestException
+        {
+            super(metadata, updatedColumns, state, options, timestamp, nowInSec, ttl, prefetchedRows);
+            this.timeUuidMsb = timeUuidMsb;
+            this.timeUuidNanos = timeUuidNanos;
+        }
+
+        public byte[] nextTimeUUIDAsBytes()
+        {
+            return TimeUUID.toBytes(timeUuidMsb, TimeUUIDType.signedBytesToNativeLong(timeUuidNanos++));
+        }
+    }
+
     /**
      * Due to some operation on lists, we can't generate the update that a given Modification statement does before
      * we get the values read by the initial read of Paxos. A RowUpdate thus just store the relevant information
@@ -265,18 +289,14 @@
             this.nowInSeconds = nowInSeconds;
         }
 
-        void applyUpdates(FilteredPartition current, PartitionUpdate.Builder updateBuilder)
+        long applyUpdates(FilteredPartition current, PartitionUpdate.Builder updateBuilder, ClientState state, long timeUuidMsb, long timeUuidNanos)
         {
             Map<DecoratedKey, Partition> map = stmt.requiresRead() ? Collections.singletonMap(key, current) : null;
-            UpdateParameters params =
-                new UpdateParameters(metadata,
-                                     updateBuilder.columns(),
-                                     options,
-                                     timestamp,
-                                     nowInSeconds,
-                                     stmt.getTimeToLive(options),
-                                     map);
+            CASUpdateParameters params =
+                new CASUpdateParameters(metadata, updateBuilder.columns(), state, options, timestamp, nowInSeconds,
+                                     stmt.getTimeToLive(options), map, timeUuidMsb, timeUuidNanos);
             stmt.addUpdateForKey(updateBuilder, clustering, params);
+            return params.timeUuidNanos;
         }
     }
 
@@ -297,13 +317,14 @@
             this.nowInSeconds = nowInSeconds;
         }
 
-        void applyUpdates(FilteredPartition current, PartitionUpdate.Builder updateBuilder)
+        void applyUpdates(FilteredPartition current, PartitionUpdate.Builder updateBuilder, ClientState state)
         {
             // No slice statements currently require a read, but this maintains consistency with RowUpdate, and future proofs us
             Map<DecoratedKey, Partition> map = stmt.requiresRead() ? Collections.singletonMap(key, current) : null;
             UpdateParameters params =
                 new UpdateParameters(metadata,
                                      updateBuilder.columns(),
+                                     state,
                                      options,
                                      timestamp,
                                      nowInSeconds,
diff --git a/src/java/org/apache/cassandra/cql3/statements/CreateRoleStatement.java b/src/java/org/apache/cassandra/cql3/statements/CreateRoleStatement.java
index b3333fc..04f183d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/CreateRoleStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/CreateRoleStatement.java
@@ -85,6 +85,7 @@
             DatabaseDescriptor.getNetworkAuthorizer().setRoleDatacenters(role, dcPermissions);
         }
         grantPermissionsToCreator(state);
+
         return null;
     }
 
diff --git a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
index 1a92196..be01481 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DeleteStatement.java
@@ -145,8 +145,6 @@
                                                         Conditions conditions,
                                                         Attributes attrs)
         {
-            checkFalse(metadata.isVirtual(), "Virtual tables don't support DELETE statements");
-
             Operations operations = new Operations(type);
 
             for (Operation.RawDeletion deletion : deletions)
@@ -177,6 +175,8 @@
 
             if (stmt.hasConditions() && !restrictions.hasAllPKColumnsRestrictedByEqualities())
             {
+                checkFalse(stmt.isVirtual(), "DELETE statements must restrict all PRIMARY KEY columns with equality relations");
+
                 checkFalse(operations.appliesToRegularColumns(),
                            "DELETE statements must restrict all PRIMARY KEY columns with equality relations in order to delete non static columns");
 
@@ -198,6 +198,6 @@
     @Override
     public AuditLogContext getAuditLogContext()
     {
-        return new AuditLogContext(AuditLogEntryType.DELETE, keyspace(), columnFamily());
+        return new AuditLogContext(AuditLogEntryType.DELETE, keyspace(), table());
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/statements/DescribeStatement.java b/src/java/org/apache/cassandra/cql3/statements/DescribeStatement.java
index 16671dd..b1f576e 100644
--- a/src/java/org/apache/cassandra/cql3/statements/DescribeStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/DescribeStatement.java
@@ -132,7 +132,7 @@
     @Override
     public ResultMessage executeLocally(QueryState state, QueryOptions options)
     {
-        Keyspaces keyspaces = Schema.instance.snapshot();
+        Keyspaces keyspaces = Schema.instance.distributedAndLocalKeyspaces();
         UUID schemaVersion = Schema.instance.getVersion();
 
         keyspaces = Keyspaces.builder()
diff --git a/src/java/org/apache/cassandra/cql3/statements/GrantPermissionsStatement.java b/src/java/org/apache/cassandra/cql3/statements/GrantPermissionsStatement.java
index 3db20e3..824c485 100644
--- a/src/java/org/apache/cassandra/cql3/statements/GrantPermissionsStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/GrantPermissionsStatement.java
@@ -18,9 +18,11 @@
 package org.apache.cassandra.cql3.statements;
 
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.cassandra.audit.AuditLogContext;
 import org.apache.cassandra.audit.AuditLogEntryType;
+import org.apache.cassandra.auth.IAuthorizer;
 import org.apache.cassandra.auth.IResource;
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -28,6 +30,7 @@
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.transport.messages.ResultMessage;
 
 public class GrantPermissionsStatement extends PermissionsManagementStatement
@@ -39,7 +42,25 @@
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException
     {
-        DatabaseDescriptor.getAuthorizer().grant(state.getUser(), permissions, resource, grantee);
+        IAuthorizer authorizer = DatabaseDescriptor.getAuthorizer();
+        Set<Permission> granted = authorizer.grant(state.getUser(), permissions, resource, grantee);
+
+        // We want to warn the client if all the specified permissions have not been granted and the client did
+        // not specify ALL in the query.
+        if (!granted.equals(permissions) && !permissions.equals(Permission.ALL))
+        {
+            String permissionsStr = permissions.stream()
+                                               .filter(permission -> !granted.contains(permission))
+                                               .sorted(Permission::compareTo) // guarantee the order for testing
+                                               .map(Permission::name)
+                                               .collect(Collectors.joining(", "));
+
+            ClientWarn.instance.warn(String.format("Role '%s' was already granted %s on %s",
+                                                   grantee.getRoleName(),
+                                                   permissionsStr,
+                                                   resource));
+        }
+
         return null;
     }
 
diff --git a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
index a072da5..ab36ec9 100644
--- a/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/ModificationStatement.java
@@ -21,14 +21,16 @@
 import java.util.*;
 
 import com.google.common.collect.HashMultiset;
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Maps;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.ValueAccessor;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.ReplicaLayout;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
@@ -52,16 +54,20 @@
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.service.StorageProxy;
-import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.disk.usage.DiskUsageBroadcaster;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.BallotGenerator;
+import org.apache.cassandra.service.paxos.Commit.Proposal;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.triggers.TriggerExecutor;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MD5Digest;
 import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.utils.UUIDGen;
 
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkNull;
+import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /*
  * Abstract parent class of individual modifications, i.e. INSERT, UPDATE and DELETE.
@@ -202,7 +208,7 @@
         return metadata.keyspace;
     }
 
-    public String columnFamily()
+    public String table()
     {
         return metadata.name;
     }
@@ -247,7 +253,7 @@
 
         // MV updates need to get the current state from the table, and might update the views
         // Require Permission.SELECT on the base table, and Permission.MODIFY on the views
-        Iterator<ViewMetadata> views = View.findAll(keyspace(), columnFamily()).iterator();
+        Iterator<ViewMetadata> views = View.findAll(keyspace(), table()).iterator();
         if (views.hasNext())
         {
             state.ensureTablePermission(metadata, Permission.SELECT);
@@ -267,8 +273,31 @@
         checkFalse(isCounter() && attrs.isTimestampSet(), "Cannot provide custom timestamp for counter updates");
         checkFalse(isCounter() && attrs.isTimeToLiveSet(), "Cannot provide custom TTL for counter updates");
         checkFalse(isView(), "Cannot directly modify a materialized view");
+        checkFalse(isVirtual() && attrs.isTimestampSet(), "Custom timestamp is not supported by virtual tables");
         checkFalse(isVirtual() && attrs.isTimeToLiveSet(), "Expiring columns are not supported by virtual tables");
         checkFalse(isVirtual() && hasConditions(), "Conditional updates are not supported by virtual tables");
+
+        if (attrs.isTimestampSet())
+            Guardrails.userTimestampsEnabled.ensureEnabled(state);
+    }
+
+    public void validateDiskUsage(QueryOptions options, ClientState state)
+    {
+        // reject writes if any replica exceeds disk usage failure limit or warn if it exceeds warn limit
+        if (Guardrails.replicaDiskUsage.enabled(state) && DiskUsageBroadcaster.instance.hasStuffedOrFullNode())
+        {
+            Keyspace keyspace = Keyspace.open(keyspace());
+
+            for (ByteBuffer key : buildPartitionKeyNames(options, state))
+            {
+                Token token = metadata().partitioner.getToken(key);
+
+                for (Replica replica : ReplicaLayout.forTokenWriteLiveAndDown(keyspace, token).all())
+                {
+                    Guardrails.replicaDiskUsage.guard(replica.endpoint(), state);
+                }
+            }
+        }
     }
 
     public RegularAndStaticColumns updatedColumns()
@@ -326,23 +355,23 @@
         return conditions.isIfExists();
     }
 
-    public List<ByteBuffer> buildPartitionKeyNames(QueryOptions options)
+    public List<ByteBuffer> buildPartitionKeyNames(QueryOptions options, ClientState state)
     throws InvalidRequestException
     {
-        List<ByteBuffer> partitionKeys = restrictions.getPartitionKeys(options);
+        List<ByteBuffer> partitionKeys = restrictions.getPartitionKeys(options, state);
         for (ByteBuffer key : partitionKeys)
             QueryProcessor.validateKey(key);
 
         return partitionKeys;
     }
 
-    public NavigableSet<Clustering<?>> createClustering(QueryOptions options)
+    public NavigableSet<Clustering<?>> createClustering(QueryOptions options, ClientState state)
     throws InvalidRequestException
     {
         if (appliesOnlyToStaticColumns() && !restrictions.hasClusteringColumnsRestrictions())
             return FBUtilities.singleton(CBuilder.STATIC_BUILDER.build(), metadata().comparator);
 
-        return restrictions.getClusteringColumns(options);
+        return restrictions.getClusteringColumns(options, state);
     }
 
     /**
@@ -367,7 +396,12 @@
 
     public boolean requiresRead()
     {
-        // Lists SET operation incurs a read.
+        // A subset of operations require a read before write:
+        // * Setting list element by index
+        // * Deleting list element by index
+        // * Deleting list element by value
+        // * Performing addition on a StringType (i.e. concatenation, only supported for CAS operations)
+        // * Performing addition on a NumberType, again only supported for CAS operations.
         return !requiresRead.isEmpty();
     }
 
@@ -401,7 +435,7 @@
                                                            metadata().partitioner.decorateKey(key),
                                                            filter));
 
-        SinglePartitionReadCommand.Group group = new SinglePartitionReadCommand.Group(commands, DataLimits.NONE);
+        SinglePartitionReadCommand.Group group = SinglePartitionReadCommand.Group.create(commands, DataLimits.NONE);
 
         if (local)
         {
@@ -449,6 +483,9 @@
         if (options.getConsistency() == null)
             throw new InvalidRequestException("Invalid empty consistency level");
 
+        Guardrails.writeConsistencyLevels.guard(EnumSet.of(options.getConsistency(), options.getSerialConsistency()),
+                                                queryState.getClientState());
+
         return hasConditions()
              ? executeWithCondition(queryState, options, queryStartNanoTime)
              : executeWithoutCondition(queryState, options, queryStartNanoTime);
@@ -466,8 +503,11 @@
         else
             cl.validateForWrite();
 
+        validateDiskUsage(options, queryState.getClientState());
+
         List<? extends IMutation> mutations =
-            getMutations(options,
+            getMutations(queryState.getClientState(),
+                         options,
                          false,
                          options.getTimestamp(queryState),
                          options.getNowInSeconds(queryState),
@@ -483,7 +523,7 @@
         CQL3CasRequest request = makeCasRequest(queryState, options);
 
         try (RowIterator result = StorageProxy.cas(keyspace(),
-                                                   columnFamily(),
+                                                   table(),
                                                    request.key,
                                                    request,
                                                    options.getSerialConsistency(),
@@ -498,7 +538,8 @@
 
     private CQL3CasRequest makeCasRequest(QueryState queryState, QueryOptions options)
     {
-        List<ByteBuffer> keys = buildPartitionKeyNames(options);
+        ClientState clientState = queryState.getClientState();
+        List<ByteBuffer> keys = buildPartitionKeyNames(options, clientState);
         // We don't support IN for CAS operation so far
         checkFalse(restrictions.keyIsInRelation(),
                    "IN on the partition key is not supported with conditional %s",
@@ -512,7 +553,7 @@
                    "IN on the clustering key columns is not supported with conditional %s",
                     type.isUpdate()? "updates" : "deletions");
 
-        Clustering<?> clustering = Iterables.getOnlyElement(createClustering(options));
+        Clustering<?> clustering = Iterables.getOnlyElement(createClustering(options, clientState));
         CQL3CasRequest request = new CQL3CasRequest(metadata(), key, conditionColumns(), updatesRegularRows(), updatesStaticRow());
 
         addConditions(clustering, request, options);
@@ -541,7 +582,7 @@
 
     private ResultSet buildCasResultSet(RowIterator partition, QueryState state, QueryOptions options)
     {
-        return buildCasResultSet(keyspace(), columnFamily(), partition, getColumnsWithConditions(), false, state, options);
+        return buildCasResultSet(keyspace(), table(), partition, getColumnsWithConditions(), false, state, options);
     }
 
     static ResultSet buildCasResultSet(String ksName,
@@ -622,7 +663,7 @@
     {
         return hasConditions()
                ? executeInternalWithCondition(queryState, options)
-               : executeInternalWithoutCondition(queryState, options, System.nanoTime());
+               : executeInternalWithoutCondition(queryState, options, nanoTime());
     }
 
     public ResultMessage executeInternalWithoutCondition(QueryState queryState, QueryOptions options, long queryStartNanoTime)
@@ -630,7 +671,7 @@
     {
         long timestamp = options.getTimestamp(queryState);
         int nowInSeconds = options.getNowInSeconds(queryState);
-        for (IMutation mutation : getMutations(options, true, timestamp, nowInSeconds, queryStartNanoTime))
+        for (IMutation mutation : getMutations(queryState.getClientState(), options, true, timestamp, nowInSeconds, queryStartNanoTime))
             mutation.apply();
         return null;
     }
@@ -639,15 +680,15 @@
     {
         CQL3CasRequest request = makeCasRequest(state, options);
 
-        try (RowIterator result = casInternal(request, options.getTimestamp(state), options.getNowInSeconds(state)))
+        try (RowIterator result = casInternal(state.getClientState(), request, options.getTimestamp(state), options.getNowInSeconds(state)))
         {
             return new ResultMessage.Rows(buildCasResultSet(result, state, options));
         }
     }
 
-    static RowIterator casInternal(CQL3CasRequest request, long timestamp, int nowInSeconds)
+    static RowIterator casInternal(ClientState state, CQL3CasRequest request, long timestamp, int nowInSeconds)
     {
-        UUID ballot = UUIDGen.getTimeUUIDFromMicros(timestamp);
+        Ballot ballot = BallotGenerator.Global.atUnixMicros(timestamp, NONE);
 
         SinglePartitionReadQuery readCommand = request.readCommand(nowInSeconds);
         FilteredPartition current;
@@ -660,10 +701,10 @@
         if (!request.appliesTo(current))
             return current.rowIterator();
 
-        PartitionUpdate updates = request.makeUpdates(current);
+        PartitionUpdate updates = request.makeUpdates(current, state, ballot);
         updates = TriggerExecutor.instance.execute(updates);
 
-        Commit proposal = Commit.newProposal(ballot, updates);
+        Proposal proposal = Proposal.of(ballot, updates);
         proposal.makeMutation().apply();
         return null;
     }
@@ -671,27 +712,30 @@
     /**
      * Convert statement into a list of mutations to apply on the server
      *
+     * @param state the client state
      * @param options value for prepared statement markers
      * @param local if true, any requests (for collections) performed by getMutation should be done locally only.
      * @param timestamp the current timestamp in microseconds to use if no timestamp is user provided.
      *
      * @return list of the mutations
      */
-    private List<? extends IMutation> getMutations(QueryOptions options,
-                                                         boolean local,
-                                                         long timestamp,
-                                                         int nowInSeconds,
-                                                         long queryStartNanoTime)
+    private List<? extends IMutation> getMutations(ClientState state,
+                                                   QueryOptions options,
+                                                   boolean local,
+                                                   long timestamp,
+                                                   int nowInSeconds,
+                                                   long queryStartNanoTime)
     {
-        List<ByteBuffer> keys = buildPartitionKeyNames(options);
+        List<ByteBuffer> keys = buildPartitionKeyNames(options, state);
         HashMultiset<ByteBuffer> perPartitionKeyCounts = HashMultiset.create(keys);
         SingleTableUpdatesCollector collector = new SingleTableUpdatesCollector(metadata, updatedColumns, perPartitionKeyCounts);
-        addUpdates(collector, keys, options, local, timestamp, nowInSeconds, queryStartNanoTime);
+        addUpdates(collector, keys, state, options, local, timestamp, nowInSeconds, queryStartNanoTime);
         return collector.toMutations();
     }
 
     final void addUpdates(UpdatesCollector collector,
                           List<ByteBuffer> keys,
+                          ClientState state,
                           QueryOptions options,
                           boolean local,
                           long timestamp,
@@ -708,6 +752,7 @@
 
             UpdateParameters params = makeUpdateParameters(keys,
                                                            new ClusteringIndexSliceFilter(slices, false),
+                                                           state,
                                                            options,
                                                            DataLimits.NONE,
                                                            local,
@@ -727,13 +772,13 @@
         }
         else
         {
-            NavigableSet<Clustering<?>> clusterings = createClustering(options);
+            NavigableSet<Clustering<?>> clusterings = createClustering(options, state);
 
             // If some of the restrictions were unspecified (e.g. empty IN restrictions) we do not need to do anything.
             if (restrictions.hasClusteringColumnsRestrictions() && clusterings.isEmpty())
                 return;
 
-            UpdateParameters params = makeUpdateParameters(keys, clusterings, options, local, timestamp, nowInSeconds, queryStartNanoTime);
+            UpdateParameters params = makeUpdateParameters(keys, clusterings, state, options, local, timestamp, nowInSeconds, queryStartNanoTime);
 
             for (ByteBuffer key : keys)
             {
@@ -770,7 +815,7 @@
         }
     }
 
-    Slices createSlices(QueryOptions options)
+    public Slices createSlices(QueryOptions options)
     {
         SortedSet<ClusteringBound<?>> startBounds = restrictions.getClusteringColumnsBounds(Bound.START, options);
         SortedSet<ClusteringBound<?>> endBounds = restrictions.getClusteringColumnsBounds(Bound.END, options);
@@ -780,6 +825,7 @@
 
     private UpdateParameters makeUpdateParameters(Collection<ByteBuffer> keys,
                                                   NavigableSet<Clustering<?>> clusterings,
+                                                  ClientState state,
                                                   QueryOptions options,
                                                   boolean local,
                                                   long timestamp,
@@ -789,6 +835,7 @@
         if (clusterings.contains(Clustering.STATIC_CLUSTERING))
             return makeUpdateParameters(keys,
                                         new ClusteringIndexSliceFilter(Slices.ALL, false),
+                                        state,
                                         options,
                                         DataLimits.cqlLimits(1),
                                         local,
@@ -798,6 +845,7 @@
 
         return makeUpdateParameters(keys,
                                     new ClusteringIndexNamesFilter(clusterings, false),
+                                    state,
                                     options,
                                     DataLimits.NONE,
                                     local,
@@ -808,6 +856,7 @@
 
     private UpdateParameters makeUpdateParameters(Collection<ByteBuffer> keys,
                                                   ClusteringIndexFilter filter,
+                                                  ClientState state,
                                                   QueryOptions options,
                                                   DataLimits limits,
                                                   boolean local,
@@ -827,6 +876,7 @@
 
         return new UpdateParameters(metadata(),
                                     updatedColumns(),
+                                    state,
                                     options,
                                     getTimestamp(timestamp, options),
                                     nowInSeconds,
@@ -836,9 +886,19 @@
 
     private Slices toSlices(SortedSet<ClusteringBound<?>> startBounds, SortedSet<ClusteringBound<?>> endBounds)
     {
+        return toSlices(metadata, startBounds, endBounds);
+    }
+
+    public static Slices toSlices(TableMetadata metadata, SortedSet<ClusteringBound<?>> startBounds, SortedSet<ClusteringBound<?>> endBounds)
+    {
+        return toSlices(metadata.comparator, startBounds, endBounds);
+    }
+
+    public static Slices toSlices(ClusteringComparator comparator, SortedSet<ClusteringBound<?>> startBounds, SortedSet<ClusteringBound<?>> endBounds)
+    {
         assert startBounds.size() == endBounds.size();
 
-        Slices.Builder builder = new Slices.Builder(metadata().comparator);
+        Slices.Builder builder = new Slices.Builder(comparator);
 
         Iterator<ClusteringBound<?>> starts = startBounds.iterator();
         Iterator<ClusteringBound<?>> ends = endBounds.iterator();
@@ -846,7 +906,7 @@
         while (starts.hasNext())
         {
             Slice slice = Slice.make(starts.next(), ends.next());
-            if (!slice.isEmpty(metadata().comparator))
+            if (!slice.isEmpty(comparator))
             {
                 builder.add(slice);
             }
diff --git a/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java b/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java
index 0c63c2e..b6112fa 100644
--- a/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java
+++ b/src/java/org/apache/cassandra/cql3/statements/PropertyDefinitions.java
@@ -60,6 +60,19 @@
         }
     }
 
+    /**
+     * Returns the name of all the properties that are updated by this object.
+     */
+    public Set<String> updatedProperties()
+    {
+        return properties.keySet();
+    }
+
+    public void removeProperty(String name)
+    {
+        properties.remove(name);
+    }
+
     protected String getSimple(String name) throws SyntaxException
     {
         Object val = properties.get(name);
diff --git a/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java b/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java
index f351788..cdaac98 100644
--- a/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java
+++ b/src/java/org/apache/cassandra/cql3/statements/RequestValidations.java
@@ -26,42 +26,136 @@
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
-import static org.apache.commons.lang3.ArrayUtils.EMPTY_OBJECT_ARRAY;
-
 /**
  * Utility methods use to perform request validation.
+ *
+ * <p>This class use overloaded methods to allow to specify different numbers of message arguments. While
+ * this introduces some clutter in the API, it avoids array allocation, initialization, and garbage collection
+ * overhead that is incurred by varargs calls. </p>
+ *
+ * <b>Warning about performance</b>
+ *
+ * <p>The goal of this class is to improve readability of code, but in some circumstances this may come at a
+ * significant performance cost. Remember that argument values for message construction must all be computed eagerly,
+ * and autoboxing may happen as well, even when the check succeeds. If the message arguments are expensive to create
+ * you should use the customary form:
+ *  <pre>
+ *      if (value < 0.0)
+ *          throw RequestValidations.invalidRequest("negative value: %s", toReadableText(value));
+ *  </pre>
+ * </p>
  */
 public final class RequestValidations
 {
     /**
-     * Checks that the specified expression is <code>true</code>. If not an <code>InvalidRequestException</code> will
+     * Checks that the specified expression is {@code true}. If not an {@code InvalidRequestException} will
      * be thrown.
      *
      * @param expression the expression to test
      * @param message the error message
-     * @throws InvalidRequestException if the specified expression is <code>false</code>.
+     * @throws InvalidRequestException if the specified expression is {@code false}.
      */
     public static void checkTrue(boolean expression, String message) throws InvalidRequestException
     {
-        checkTrue(expression, message, EMPTY_OBJECT_ARRAY);
+        if (!expression)
+            throw invalidRequest(message);
     }
 
     /**
-     * Checks that the specified expression is <code>true</code>. If not an <code>InvalidRequestException</code> will
+     * Checks that the specified expression is <code>true</code>. If not an {@code InvalidRequestException} will
      * be thrown.
      *
      * @param expression the expression to test
      * @param messageTemplate the template used to build the error message
-     * @param messageArgs the message arguments
-     * @throws InvalidRequestException if the specified expression is <code>false</code>.
+     * @param messageArg the message argument
+     * @throws InvalidRequestException if the specified expression is {@code false}.
      */
     public static void checkTrue(boolean expression,
                                  String messageTemplate,
-                                 Object... messageArgs)
-                                 throws InvalidRequestException
+                                 Object messageArg) throws InvalidRequestException
     {
         if (!expression)
-            throw invalidRequest(messageTemplate, messageArgs);
+            throw invalidRequest(messageTemplate, messageArg);
+    }
+
+    /**
+     * Checks that the specified expression is <code>true</code>. If not an {@code InvalidRequestException} will
+     * be thrown.
+     *
+     * @param expression the expression to test
+     * @param messageTemplate the template used to build the error message
+     * @param arg1 the first message argument
+     * @param arg2 the second message argument
+     * @throws InvalidRequestException if the specified expression is {@code false}.
+     */
+    public static void checkTrue(boolean expression,
+                                 String messageTemplate,
+                                 Object arg1,
+                                 Object arg2) throws InvalidRequestException
+    {
+        if (!expression)
+            throw invalidRequest(messageTemplate, arg1, arg2);
+    }
+
+    /**
+     * Checks that the specified expression is <code>true</code>. If not an {@code InvalidRequestException} will
+     * be thrown.
+     *
+     * @param expression the expression to test
+     * @param messageTemplate the template used to build the error message
+     * @param arg1 the first message argument
+     * @param arg2 the second message argument
+     * @param arg3 the third message argument
+     * @throws InvalidRequestException if the specified expression is {@code false}.
+     */
+    public static void checkTrue(boolean expression,
+                                 String messageTemplate,
+                                 Object arg1,
+                                 Object arg2,
+                                 Object arg3) throws InvalidRequestException
+    {
+        if (!expression)
+            throw invalidRequest(messageTemplate, arg1, arg2, arg3);
+    }
+
+    /**
+     * Checks that the specified collections is NOT <code>empty</code>.
+     * If it is an {@code InvalidRequestException} will be thrown.
+     *
+     * @param collection the collection to test
+     * @param messageTemplate the template used to build the error message
+     * @param messageArg the message argument
+     * @return the collection
+     * @throws InvalidRequestException if the specified collection is <code>empty</code>.
+     */
+    public static <T extends Collection<E>, E> T checkNotEmpty(T collection,
+                                                               String messageTemplate,
+                                                               Object messageArg)
+                                                               throws InvalidRequestException
+    {
+        checkTrue(!collection.isEmpty(), messageTemplate, messageArg);
+        return collection;
+    }
+
+    /**
+     * Checks that the specified collections is NOT <code>empty</code>.
+     * If it is an {@code InvalidRequestException} will be thrown.
+     *
+     * @param collection the collection to test
+     * @param messageTemplate the template used to build the error message
+     * @param arg1 the first message argument
+     * @param arg2 the second message argument
+     * @return the collection
+     * @throws InvalidRequestException if the specified collection is <code>empty</code>.
+     */
+    public static <T extends Collection<E>, E> T checkNotEmpty(T collection,
+                                                               String messageTemplate,
+                                                               Object arg1,
+                                                               Object arg2)
+                                                               throws InvalidRequestException
+    {
+        checkTrue(!collection.isEmpty(), messageTemplate, arg1, arg2);
+        return collection;
     }
 
     /**
@@ -96,24 +190,60 @@
     }
 
     /**
-     * Checks that the specified expression is <code>false</code>. If not an <code>InvalidRequestException</code> will
+     * Checks that the specified expression is {@code false}. If not an {@code InvalidRequestException} will
      * be thrown.
      *
      * @param expression the expression to test
      * @param messageTemplate the template used to build the error message
-     * @param messageArgs the message arguments
+     * @param messageArg the message argument
      * @throws InvalidRequestException if the specified expression is <code>true</code>.
      */
     public static void checkFalse(boolean expression,
                                   String messageTemplate,
-                                  Object... messageArgs)
-                                  throws InvalidRequestException
+                                  Object messageArg) throws InvalidRequestException
     {
-        checkTrue(!expression, messageTemplate, messageArgs);
+        checkTrue(!expression, messageTemplate, messageArg);
     }
 
     /**
-     * Checks that the specified expression is <code>false</code>. If not an <code>InvalidRequestException</code> will
+     * Checks that the specified expression is {@code false}. If not an {@code InvalidRequestException} will
+     * be thrown.
+     *
+     * @param expression the expression to test
+     * @param messageTemplate the template used to build the error message
+     * @param arg1 the first message argument
+     * @param arg2 the second message argument
+     * @throws InvalidRequestException if the specified expression is <code>true</code>.
+     */
+    public static void checkFalse(boolean expression,
+                                  String messageTemplate,
+                                  Object arg1,
+                                  Object arg2) throws InvalidRequestException
+    {
+        checkTrue(!expression, messageTemplate, arg1, arg2);
+    }
+
+    /**
+     * Checks that the specified expression is {@code false}. If not an {@code InvalidRequestException} will
+     * be thrown.
+     *
+     * @param expression the expression to test
+     * @param messageTemplate the template used to build the error message
+     * @param arg1 the first message argument
+     * @param arg2 the second message argument
+     * @param arg3 the third message argument
+     * @throws InvalidRequestException if the specified expression is <code>true</code>.
+     */
+    public static void checkFalse(boolean expression,
+                                  String messageTemplate,
+                                  Object arg1,
+                                  Object arg2,
+                                  Object arg3) throws InvalidRequestException
+    {
+        checkTrue(!expression, messageTemplate, arg1, arg2, arg3);
+    }
+    /**
+     * Checks that the specified expression is {@code false}. If not an {@code InvalidRequestException} will
      * be thrown.
      *
      * @param expression the expression to test
@@ -126,91 +256,114 @@
     }
 
     /**
-     * Checks that the specified object is NOT <code>null</code>.
-     * If it is an <code>InvalidRequestException</code> will be throws.
-     *
-     * @param object the object to test
-     * @param messageTemplate the template used to build the error message
-     * @param messageArgs the message arguments
-     * @return the object
-     * @throws InvalidRequestException if the specified object is <code>null</code>.
-     */
-    public static <T> T checkNotNull(T object, String messageTemplate, Object... messageArgs)
-            throws InvalidRequestException
-    {
-        checkTrue(object != null, messageTemplate, messageArgs);
-        return object;
-    }
-
-    /**
-     * Checks that the specified collections is NOT <code>empty</code>.
-     * If it is an <code>InvalidRequestException</code> will be throws.
-     *
-     * @param collection the collection to test
-     * @param messageTemplate the template used to build the error message
-     * @param messageArgs the message arguments
-     * @return the collection
-     * @throws InvalidRequestException if the specified collection is <code>empty</code>.
-     */
-    public static <T extends Collection<E>, E> T checkNotEmpty(T collection, String messageTemplate, Object... messageArgs)
-            throws InvalidRequestException
-    {
-        checkTrue(!collection.isEmpty(), messageTemplate, messageArgs);
-        return collection;
-    }
-
-    /**
-     * Checks that the specified bind marker value is set to a meaningful value.
-     * If it is not a <code>InvalidRequestException</code> will be thrown.
-     *
-     * @param b the <code>ByteBuffer</code> to test
-     * @param messageTemplate the template used to build the error message
-     * @param messageArgs the message arguments
-     * @throws InvalidRequestException if the specified bind marker value is not set to a meaningful value.
-     */
-    public static void checkBindValueSet(ByteBuffer b, String messageTemplate, Object... messageArgs)
-            throws InvalidRequestException
-    {
-        checkTrue(b != ByteBufferUtil.UNSET_BYTE_BUFFER, messageTemplate, messageArgs);
-    }
-
-    /**
-     * Checks that the specified object is <code>null</code>.
-     * If it is not an <code>InvalidRequestException</code> will be throws.
-     *
-     * @param object the object to test
-     * @param messageTemplate the template used to build the error message
-     * @param messageArgs the message arguments
-     * @return the object
-     * @throws InvalidRequestException if the specified object is not <code>null</code>.
-     */
-    public static <T> T checkNull(T object, String messageTemplate, Object... messageArgs)
-            throws InvalidRequestException
-    {
-        checkTrue(object == null, messageTemplate, messageArgs);
-        return object;
-    }
-
-    /**
-     * Checks that the specified object is <code>null</code>.
-     * If it is not an <code>InvalidRequestException</code> will be throws.
+     * Checks that the specified object is NOT {@code null}.
+     * If it is an {@code InvalidRequestException} will be thrown.
      *
      * @param object the object to test
      * @param message the error message
      * @return the object
-     * @throws InvalidRequestException if the specified object is not <code>null</code>.
+     * @throws InvalidRequestException if the specified object is {@code null}.
      */
-    public static <T> T checkNull(T object, String message) throws InvalidRequestException
+    public static <T> T checkNotNull(T object, String message) throws InvalidRequestException
     {
-        return checkNull(object, message, EMPTY_OBJECT_ARRAY);
+        checkTrue(object != null, message);
+        return object;
     }
 
     /**
-     * Returns an <code>InvalidRequestException</code> with the specified message.
+     * Checks that the specified object is NOT {@code null}.
+     * If it is an {@code InvalidRequestException} will be thrown.
+     *
+     * @param object the object to test
+     * @param messageTemplate the template used to build the error message
+     * @param messageArg the message argument
+     * @return the object
+     * @throws InvalidRequestException if the specified object is {@code null}.
+     */
+    public static <T> T checkNotNull(T object, String messageTemplate, Object messageArg) throws InvalidRequestException
+    {
+        checkTrue(object != null, messageTemplate, messageArg);
+        return object;
+    }
+
+    /**
+     * Checks that the specified object is NOT {@code null}.
+     * If it is an {@code InvalidRequestException} will be thrown.
+     *
+     * @param object the object to test
+     * @param messageTemplate the template used to build the error message
+     * @param arg1 the first message argument
+     * @param arg2 the second message argument
+     * @return the object
+     * @throws InvalidRequestException if the specified object is {@code null}.
+     */
+    public static <T> T checkNotNull(T object,
+                                     String messageTemplate,
+                                     Object arg1,
+                                     Object arg2) throws InvalidRequestException
+    {
+        checkTrue(object != null, messageTemplate, arg1, arg2);
+        return object;
+    }
+
+    /**
+     * Checks that the specified bind marker value is set to a meaningful value.
+     * If it is not a {@code InvalidRequestException} will be thrown.
+     *
+     * @param b the <code>ByteBuffer</code> to test
+     * @param messageTemplate the template used to build the error message
+     * @param messageArg the message argument
+     * @throws InvalidRequestException if the specified bind marker value is not set to a meaningful value.
+     */
+    public static void checkBindValueSet(ByteBuffer b, String messageTemplate, Object messageArg) throws InvalidRequestException
+    {
+        checkTrue(b != ByteBufferUtil.UNSET_BYTE_BUFFER, messageTemplate, messageArg);
+    }
+
+    /**
+     * Checks that the specified object is {@code null}.
+     * If it is not an {@code InvalidRequestException} will be thrown.
+     *
+     * @param object the object to test
+     * @param messageTemplate the template used to build the error message
+     * @param messageArg the message argument
+     * @throws InvalidRequestException if the specified object is not {@code null}.
+     */
+    public static void checkNull(Object object, String messageTemplate, Object messageArg) throws InvalidRequestException
+    {
+        checkTrue(object == null, messageTemplate, messageArg);
+    }
+
+    /**
+     * Checks that the specified object is {@code null}.
+     * If it is not an {@code InvalidRequestException} will be thrown.
+     *
+     * @param object the object to test
+     * @param message the error message
+     * @throws InvalidRequestException if the specified object is not {@code null}.
+     */
+    public static void checkNull(Object object, String message) throws InvalidRequestException
+    {
+        checkTrue(object == null, message);
+    }
+
+    /**
+     * Returns an {@code InvalidRequestException} with the specified message.
+     *
+     * @param message the error message
+     * @return an {@code InvalidRequestException} with the specified message.
+     */
+    public static InvalidRequestException invalidRequest(String message)
+    {
+        return new InvalidRequestException(message);
+    }
+
+    /**
+     * Returns an {@code InvalidRequestException} with the specified message.
      *
      * @param messageTemplate the template used to build the error message
      * @param messageArgs the message arguments
-     * @return an <code>InvalidRequestException</code> with the specified message.
+     * @return an {@code InvalidRequestException} with the specified message.
      */
     public static InvalidRequestException invalidRequest(String messageTemplate, Object... messageArgs)
     {
diff --git a/src/java/org/apache/cassandra/cql3/statements/RevokePermissionsStatement.java b/src/java/org/apache/cassandra/cql3/statements/RevokePermissionsStatement.java
index 57d0631..4262285 100644
--- a/src/java/org/apache/cassandra/cql3/statements/RevokePermissionsStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/RevokePermissionsStatement.java
@@ -18,9 +18,11 @@
 package org.apache.cassandra.cql3.statements;
 
 import java.util.Set;
+import java.util.stream.Collectors;
 
 import org.apache.cassandra.audit.AuditLogContext;
 import org.apache.cassandra.audit.AuditLogEntryType;
+import org.apache.cassandra.auth.IAuthorizer;
 import org.apache.cassandra.auth.IResource;
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -28,6 +30,7 @@
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.exceptions.RequestValidationException;
 import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
@@ -41,7 +44,25 @@
 
     public ResultMessage execute(ClientState state) throws RequestValidationException, RequestExecutionException
     {
-        DatabaseDescriptor.getAuthorizer().revoke(state.getUser(), permissions, resource, grantee);
+        IAuthorizer authorizer = DatabaseDescriptor.getAuthorizer();
+        Set<Permission> revoked = authorizer.revoke(state.getUser(), permissions, resource, grantee);
+
+        // We want to warn the client if all the specified permissions have not been revoked and the client did
+        // not specify ALL in the query.
+        if (!revoked.equals(permissions) && !permissions.equals(Permission.ALL))
+        {
+            String permissionsStr = permissions.stream()
+                                               .filter(permission -> !revoked.contains(permission))
+                                               .sorted(Permission::compareTo) // guarantee the order for testing
+                                               .map(Permission::name)
+                                               .collect(Collectors.joining(", "));
+
+            ClientWarn.instance.warn(String.format("Role '%s' was not granted %s on %s",
+                                                   grantee.getRoleName(),
+                                                   permissionsStr,
+                                                   resource));
+        }
+
         return null;
     }
     
diff --git a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
index a5f2eab..8a48935 100644
--- a/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SelectStatement.java
@@ -19,10 +19,13 @@
 
 import java.nio.ByteBuffer;
 import java.util.*;
+import java.util.stream.Collectors;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.MoreObjects;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,8 +33,10 @@
 import org.apache.cassandra.audit.AuditLogContext;
 import org.apache.cassandra.audit.AuditLogEntryType;
 import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.cql3.*;
@@ -40,8 +45,10 @@
 import org.apache.cassandra.cql3.selection.RawSelector;
 import org.apache.cassandra.cql3.selection.ResultSetBuilder;
 import org.apache.cassandra.cql3.selection.Selectable;
+import org.apache.cassandra.cql3.selection.Selectable.WithFunction;
 import org.apache.cassandra.cql3.selection.Selection;
 import org.apache.cassandra.cql3.selection.Selection.Selectors;
+import org.apache.cassandra.cql3.selection.Selector;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.aggregation.AggregationSpecification;
 import org.apache.cassandra.db.aggregation.GroupMaker;
@@ -62,13 +69,16 @@
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.service.pager.AggregationQueryPager;
 import org.apache.cassandra.service.pager.PagingState;
 import org.apache.cassandra.service.pager.QueryPager;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.NoSpamLogger;
+
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
@@ -76,7 +86,9 @@
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkNotNull;
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkNull;
 import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue;
+import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
 import static org.apache.cassandra.utils.ByteBufferUtil.UNSET_BYTE_BUFFER;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * Encapsulates a completely parsed SELECT query, including the target
@@ -106,9 +118,9 @@
     private final boolean isReversed;
 
     /**
-     * The <code>AggregationSpecification</code> used to make the aggregates.
+     * The {@code Factory} used to create the {@code AggregationSpecification}.
      */
-    private final AggregationSpecification aggregationSpec;
+    private final AggregationSpecification.Factory aggregationSpecFactory;
 
     /**
      * The comparator used to orders results when multiple keys are selected (using IN).
@@ -128,7 +140,7 @@
                            Selection selection,
                            StatementRestrictions restrictions,
                            boolean isReversed,
-                           AggregationSpecification aggregationSpec,
+                           AggregationSpecification.Factory aggregationSpecFactory,
                            Comparator<List<ByteBuffer>> orderingComparator,
                            Term limit,
                            Term perPartitionLimit)
@@ -138,7 +150,7 @@
         this.selection = selection;
         this.restrictions = restrictions;
         this.isReversed = isReversed;
-        this.aggregationSpec = aggregationSpec;
+        this.aggregationSpecFactory = aggregationSpecFactory;
         this.orderingComparator = orderingComparator;
         this.parameters = parameters;
         this.limit = limit;
@@ -170,6 +182,9 @@
         selection.addFunctionsTo(functions);
         restrictions.addFunctionsTo(functions);
 
+        if (aggregationSpecFactory != null)
+            aggregationSpecFactory.addFunctionsTo(functions);
+
         if (limit != null)
             limit.addFunctionsTo(functions);
 
@@ -212,7 +227,7 @@
     {
         if (table.isView())
         {
-            TableMetadataRef baseTable = View.findBaseTable(keyspace(), columnFamily());
+            TableMetadataRef baseTable = View.findBaseTable(keyspace(), table());
             if (baseTable != null)
                 state.ensureTablePermission(baseTable, Permission.SELECT);
         }
@@ -227,7 +242,8 @@
 
     public void validate(ClientState state) throws InvalidRequestException
     {
-        // Nothing to do, all validation has been done by RawStatement.prepare()
+        if (parameters.allowFiltering && !SchemaConstants.isSystemKeyspace(table.keyspace))
+            Guardrails.allowFilteringEnabled.ensureEnabled(state);
     }
 
     public ResultMessage.Rows execute(QueryState state, QueryOptions options, long queryStartNanoTime)
@@ -236,6 +252,7 @@
         checkNotNull(cl, "Invalid empty consistency level");
 
         cl.validateForRead();
+        Guardrails.readConsistencyLevels.guard(EnumSet.of(cl), state.getClientState());
 
         int nowInSec = options.getNowInSeconds(state);
         int userLimit = getLimit(options);
@@ -243,60 +260,79 @@
         int pageSize = options.getPageSize();
 
         Selectors selectors = selection.newSelectors(options);
-        ReadQuery query = getQuery(options, selectors.getColumnFilter(), nowInSec, userLimit, userPerPartitionLimit, pageSize);
+        AggregationSpecification aggregationSpec = getAggregationSpec(options);
+        ReadQuery query = getQuery(options, state.getClientState(), selectors.getColumnFilter(),
+                                   nowInSec, userLimit, userPerPartitionLimit, pageSize, aggregationSpec);
+
+        if (options.isReadThresholdsEnabled())
+            query.trackWarnings();
 
         if (aggregationSpec == null && (pageSize <= 0 || (query.limits().count() <= pageSize)))
-            return execute(query, options, state, selectors, nowInSec, userLimit, queryStartNanoTime);
+            return execute(query, options, state.getClientState(), selectors, nowInSec, userLimit, null, queryStartNanoTime);
 
         QueryPager pager = getPager(query, options);
 
-        return execute(Pager.forDistributedQuery(pager, cl, state.getClientState()),
+        return execute(state,
+                       Pager.forDistributedQuery(pager, cl, state.getClientState()),
                        options,
                        selectors,
                        pageSize,
                        nowInSec,
                        userLimit,
+                       aggregationSpec,
                        queryStartNanoTime);
     }
 
+
+    public AggregationSpecification getAggregationSpec(QueryOptions options)
+    {
+        return aggregationSpecFactory == null ? null : aggregationSpecFactory.newInstance(options);
+    }
+
     public ReadQuery getQuery(QueryOptions options, int nowInSec) throws RequestValidationException
     {
         Selectors selectors = selection.newSelectors(options);
         return getQuery(options,
+                        ClientState.forInternalCalls(),
                         selectors.getColumnFilter(),
                         nowInSec,
                         getLimit(options),
                         getPerPartitionLimit(options),
-                        options.getPageSize());
+                        options.getPageSize(),
+                        getAggregationSpec(options));
     }
 
     public ReadQuery getQuery(QueryOptions options,
+                              ClientState state,
                               ColumnFilter columnFilter,
                               int nowInSec,
                               int userLimit,
                               int perPartitionLimit,
-                              int pageSize)
+                              int pageSize,
+                              AggregationSpecification aggregationSpec)
     {
         boolean isPartitionRangeQuery = restrictions.isKeyRange() || restrictions.usesSecondaryIndexing();
 
-        DataLimits limit = getDataLimits(userLimit, perPartitionLimit, pageSize);
+        DataLimits limit = getDataLimits(userLimit, perPartitionLimit, pageSize, aggregationSpec);
 
         if (isPartitionRangeQuery)
-            return getRangeCommand(options, columnFilter, limit, nowInSec);
+            return getRangeCommand(options, state, columnFilter, limit, nowInSec);
 
-        return getSliceCommands(options, columnFilter, limit, nowInSec);
+        return getSliceCommands(options, state, columnFilter, limit, nowInSec);
     }
 
     private ResultMessage.Rows execute(ReadQuery query,
                                        QueryOptions options,
-                                       QueryState state,
+                                       ClientState state,
                                        Selectors selectors,
                                        int nowInSec,
-                                       int userLimit, long queryStartNanoTime) throws RequestValidationException, RequestExecutionException
+                                       int userLimit,
+                                       AggregationSpecification aggregationSpec,
+                                       long queryStartNanoTime)
     {
-        try (PartitionIterator data = query.execute(options.getConsistency(), state.getClientState(), queryStartNanoTime))
+        try (PartitionIterator data = query.execute(options.getConsistency(), state, queryStartNanoTime))
         {
-            return processResults(data, options, selectors, nowInSec, userLimit);
+            return processResults(data, options, selectors, nowInSec, userLimit, aggregationSpec);
         }
     }
 
@@ -373,27 +409,31 @@
         }
     }
 
-    private ResultMessage.Rows execute(Pager pager,
+    private ResultMessage.Rows execute(QueryState state,
+                                       Pager pager,
                                        QueryOptions options,
                                        Selectors selectors,
                                        int pageSize,
                                        int nowInSec,
                                        int userLimit,
-                                       long queryStartNanoTime) throws RequestValidationException, RequestExecutionException
+                                       AggregationSpecification aggregationSpec,
+                                       long queryStartNanoTime)
     {
-        if (aggregationSpec != null)
+        Guardrails.pageSize.guard(pageSize, table(), false, state.getClientState());
+
+        if (aggregationSpecFactory != null)
         {
             if (!restrictions.hasPartitionKeyRestrictions())
             {
                 warn("Aggregation query used without partition key");
                 noSpamLogger.warn(String.format("Aggregation query used without partition key on table %s.%s, aggregation type: %s",
-                                                 keyspace(), columnFamily(), aggregationSpec.kind()));
+                                                 keyspace(), table(), aggregationSpec.kind()));
             }
             else if (restrictions.keyIsInRelation())
             {
                 warn("Aggregation query used on multiple partition keys (IN restriction)");
                 noSpamLogger.warn(String.format("Aggregation query used on multiple partition keys (IN restriction) on table %s.%s, aggregation type: %s",
-                                                 keyspace(), columnFamily(), aggregationSpec.kind()));
+                                                 keyspace(), table(), aggregationSpec.kind()));
             }
         }
 
@@ -406,7 +446,7 @@
         ResultMessage.Rows msg;
         try (PartitionIterator page = pager.fetchPage(pageSize, queryStartNanoTime))
         {
-            msg = processResults(page, options, selectors, nowInSec, userLimit);
+            msg = processResults(page, options, selectors, nowInSec, userLimit, aggregationSpec);
         }
 
         // Please note that the isExhausted state of the pager only gets updated when we've closed the page, so this
@@ -427,25 +467,37 @@
                                               QueryOptions options,
                                               Selectors selectors,
                                               int nowInSec,
-                                              int userLimit) throws RequestValidationException
+                                              int userLimit,
+                                              AggregationSpecification aggregationSpec) throws RequestValidationException
     {
-        ResultSet rset = process(partitions, options, selectors, nowInSec, userLimit);
+        ResultSet rset = process(partitions, options, selectors, nowInSec, userLimit, aggregationSpec);
         return new ResultMessage.Rows(rset);
     }
 
     public ResultMessage.Rows executeLocally(QueryState state, QueryOptions options) throws RequestExecutionException, RequestValidationException
     {
-        return executeInternal(state, options, options.getNowInSeconds(state), System.nanoTime());
+        return executeInternal(state, options, options.getNowInSeconds(state), nanoTime());
     }
 
-    public ResultMessage.Rows executeInternal(QueryState state, QueryOptions options, int nowInSec, long queryStartNanoTime) throws RequestExecutionException, RequestValidationException
+    public ResultMessage.Rows executeInternal(QueryState state,
+                                              QueryOptions options,
+                                              int nowInSec,
+                                              long queryStartNanoTime)
     {
         int userLimit = getLimit(options);
         int userPerPartitionLimit = getPerPartitionLimit(options);
         int pageSize = options.getPageSize();
 
         Selectors selectors = selection.newSelectors(options);
-        ReadQuery query = getQuery(options, selectors.getColumnFilter(), nowInSec, userLimit, userPerPartitionLimit, pageSize);
+        AggregationSpecification aggregationSpec = getAggregationSpec(options);
+        ReadQuery query = getQuery(options,
+                                   state.getClientState(),
+                                   selectors.getColumnFilter(),
+                                   nowInSec,
+                                   userLimit,
+                                   userPerPartitionLimit,
+                                   pageSize,
+                                   aggregationSpec);
 
         try (ReadExecutionController executionController = query.executionController())
         {
@@ -453,18 +505,20 @@
             {
                 try (PartitionIterator data = query.executeInternal(executionController))
                 {
-                    return processResults(data, options, selectors, nowInSec, userLimit);
+                    return processResults(data, options, selectors, nowInSec, userLimit, null);
                 }
             }
 
             QueryPager pager = getPager(query, options);
 
-            return execute(Pager.forInternalQuery(pager, executionController),
+            return execute(state,
+                           Pager.forInternalQuery(pager, executionController),
                            options,
                            selectors,
                            pageSize,
                            nowInSec,
                            userLimit,
+                           aggregationSpec,
                            queryStartNanoTime);
         }
     }
@@ -473,17 +527,61 @@
     {
         QueryPager pager = query.getPager(options.getPagingState(), options.getProtocolVersion());
 
-        if (aggregationSpec == null || query.isEmpty())
+        if (aggregationSpecFactory == null || query.isEmpty())
             return pager;
 
         return new AggregationQueryPager(pager, query.limits());
     }
 
+    public Map<DecoratedKey, List<Row>> executeRawInternal(QueryOptions options, ClientState state, int nowInSec) throws RequestExecutionException, RequestValidationException
+    {
+        int userLimit = getLimit(options);
+        int userPerPartitionLimit = getPerPartitionLimit(options);
+        if (options.getPageSize() > 0)
+            throw new IllegalStateException();
+        if (aggregationSpecFactory != null)
+            throw new IllegalStateException();
+
+        Selectors selectors = selection.newSelectors(options);
+        ReadQuery query = getQuery(options, state, selectors.getColumnFilter(), nowInSec, userLimit, userPerPartitionLimit, Integer.MAX_VALUE, null);
+
+        Map<DecoratedKey, List<Row>> result = Collections.emptyMap();
+        try (ReadExecutionController executionController = query.executionController())
+        {
+            try (PartitionIterator data = query.executeInternal(executionController))
+            {
+                while (data.hasNext())
+                {
+                    try (RowIterator in = data.next())
+                    {
+                        List<Row> out = Collections.emptyList();
+                        while (in.hasNext())
+                        {
+                            switch (out.size())
+                            {
+                                case 0:  out = Collections.singletonList(in.next()); break;
+                                case 1:  out = new ArrayList<>(out);
+                                default: out.add(in.next());
+                            }
+                        }
+                        switch (result.size())
+                        {
+                            case 0:  result = Collections.singletonMap(in.partitionKey(), out); break;
+                            case 1:  result = new TreeMap<>(result);
+                            default: result.put(in.partitionKey(), out);
+                        }
+                    }
+                }
+                return result;
+            }
+        }
+    }
+
     public ResultSet process(PartitionIterator partitions, int nowInSec) throws InvalidRequestException
     {
         QueryOptions options = QueryOptions.DEFAULT;
         Selectors selectors = selection.newSelectors(options);
-        return process(partitions, options, selectors, nowInSec, getLimit(options));
+        return process(partitions, options, selectors, nowInSec, getLimit(options), getAggregationSpec(options));
     }
 
     @Override
@@ -492,7 +590,7 @@
         return table.keyspace;
     }
 
-    public String columnFamily()
+    public String table()
     {
         return table.name;
     }
@@ -513,13 +611,19 @@
         return restrictions;
     }
 
-    private ReadQuery getSliceCommands(QueryOptions options, ColumnFilter columnFilter, DataLimits limit, int nowInSec)
+    private ReadQuery getSliceCommands(QueryOptions options, ClientState state, ColumnFilter columnFilter,
+                                       DataLimits limit, int nowInSec)
     {
-        Collection<ByteBuffer> keys = restrictions.getPartitionKeys(options);
+        Collection<ByteBuffer> keys = restrictions.getPartitionKeys(options, state);
         if (keys.isEmpty())
             return ReadQuery.empty(table);
 
-        ClusteringIndexFilter filter = makeClusteringIndexFilter(options, columnFilter);
+        if (restrictions.keyIsInRelation())
+        {
+            Guardrails.partitionKeysInSelect.guard(keys.size(), table.name, false, state);
+        }
+
+        ClusteringIndexFilter filter = makeClusteringIndexFilter(options, state, columnFilter);
         if (filter == null || filter.isEmpty(table.comparator))
             return ReadQuery.empty(table);
 
@@ -546,8 +650,9 @@
     public Slices clusteringIndexFilterAsSlices()
     {
         QueryOptions options = QueryOptions.forInternalCalls(Collections.emptyList());
+        ClientState state = ClientState.forInternalCalls();
         ColumnFilter columnFilter = selection.newSelectors(options).getColumnFilter();
-        ClusteringIndexFilter filter = makeClusteringIndexFilter(options, columnFilter);
+        ClusteringIndexFilter filter = makeClusteringIndexFilter(options, state, columnFilter);
         if (filter instanceof ClusteringIndexSliceFilter)
             return ((ClusteringIndexSliceFilter)filter).requestedSlices();
 
@@ -564,8 +669,9 @@
     public SinglePartitionReadCommand internalReadForView(DecoratedKey key, int nowInSec)
     {
         QueryOptions options = QueryOptions.forInternalCalls(Collections.emptyList());
+        ClientState state = ClientState.forInternalCalls();
         ColumnFilter columnFilter = selection.newSelectors(options).getColumnFilter();
-        ClusteringIndexFilter filter = makeClusteringIndexFilter(options, columnFilter);
+        ClusteringIndexFilter filter = makeClusteringIndexFilter(options, state, columnFilter);
         RowFilter rowFilter = getRowFilter(options);
         return SinglePartitionReadCommand.create(table, nowInSec, columnFilter, rowFilter, DataLimits.NONE, key, filter);
     }
@@ -578,9 +684,9 @@
         return getRowFilter(QueryOptions.forInternalCalls(Collections.emptyList()));
     }
 
-    private ReadQuery getRangeCommand(QueryOptions options, ColumnFilter columnFilter, DataLimits limit, int nowInSec)
+    private ReadQuery getRangeCommand(QueryOptions options, ClientState state, ColumnFilter columnFilter, DataLimits limit, int nowInSec)
     {
-        ClusteringIndexFilter clusteringIndexFilter = makeClusteringIndexFilter(options, columnFilter);
+        ClusteringIndexFilter clusteringIndexFilter = makeClusteringIndexFilter(options, state, columnFilter);
         if (clusteringIndexFilter == null)
             return ReadQuery.empty(table);
 
@@ -601,7 +707,7 @@
         return command;
     }
 
-    private ClusteringIndexFilter makeClusteringIndexFilter(QueryOptions options, ColumnFilter columnFilter)
+    private ClusteringIndexFilter makeClusteringIndexFilter(QueryOptions options, ClientState state, ColumnFilter columnFilter)
     {
         if (parameters.isDistinct)
         {
@@ -624,7 +730,7 @@
             return new ClusteringIndexSliceFilter(slices, isReversed);
         }
 
-        NavigableSet<Clustering<?>> clusterings = getRequestedRows(options);
+        NavigableSet<Clustering<?>> clusterings = getRequestedRows(options, state);
         // We can have no clusterings if either we're only selecting the static columns, or if we have
         // a 'IN ()' for clusterings. In that case, we still want to query if some static columns are
         // queried. But we're fine otherwise.
@@ -670,7 +776,10 @@
         return builder.build();
     }
 
-    private DataLimits getDataLimits(int userLimit, int perPartitionLimit, int pageSize)
+    private DataLimits getDataLimits(int userLimit,
+                                     int perPartitionLimit,
+                                     int pageSize,
+                                     AggregationSpecification aggregationSpec)
     {
         int cqlRowLimit = DataLimits.NO_LIMIT;
         int cqlPerPartitionLimit = DataLimits.NO_LIMIT;
@@ -756,12 +865,12 @@
         return userLimit;
     }
 
-    private NavigableSet<Clustering<?>> getRequestedRows(QueryOptions options) throws InvalidRequestException
+    private NavigableSet<Clustering<?>> getRequestedRows(QueryOptions options, ClientState state) throws InvalidRequestException
     {
         // Note: getRequestedColumns don't handle static columns, but due to CASSANDRA-5762
         // we always do a slice for CQL3 tables, so it's ok to ignore them here
         assert !restrictions.isColumnRange();
-        return restrictions.getClusteringColumns(options);
+        return restrictions.getClusteringColumns(options, state);
     }
 
     /**
@@ -777,7 +886,8 @@
                               QueryOptions options,
                               Selectors selectors,
                               int nowInSec,
-                              int userLimit) throws InvalidRequestException
+                              int userLimit,
+                              AggregationSpecification aggregationSpec) throws InvalidRequestException
     {
         GroupMaker groupMaker = aggregationSpec == null ? null : aggregationSpec.newGroupMaker();
         ResultSetBuilder result = new ResultSetBuilder(getResultMetadata(), selectors, groupMaker);
@@ -791,6 +901,7 @@
         }
 
         ResultSet cqlRows = result.build();
+        maybeWarn(result, options);
 
         orderResults(cqlRows);
 
@@ -812,10 +923,60 @@
         }
     }
 
+    private void maybeWarn(ResultSetBuilder result, QueryOptions options)
+    {
+        if (!options.isReadThresholdsEnabled())
+            return;
+        ColumnFamilyStore store = cfs();
+        if (store != null)
+            store.metric.coordinatorReadSize.update(result.getSize());
+        if (result.shouldWarn(options.getCoordinatorReadSizeWarnThresholdBytes()))
+        {
+            String msg = String.format("Read on table %s has exceeded the size warning threshold of %,d bytes", table, options.getCoordinatorReadSizeWarnThresholdBytes());
+            ClientState state = ClientState.forInternalCalls();
+            ClientWarn.instance.warn(msg + " with " + loggableTokens(options, state));
+            logger.warn("{} with query {}", msg, asCQL(options, state));
+            if (store != null)
+                store.metric.coordinatorReadSizeWarnings.mark();
+        }
+    }
+
+    private void maybeFail(ResultSetBuilder result, QueryOptions options)
+    {
+        if (!options.isReadThresholdsEnabled())
+            return;
+        if (result.shouldReject(options.getCoordinatorReadSizeAbortThresholdBytes()))
+        {
+            String msg = String.format("Read on table %s has exceeded the size failure threshold of %,d bytes", table, options.getCoordinatorReadSizeAbortThresholdBytes());
+            ClientState state = ClientState.forInternalCalls();
+            String clientMsg = msg + " with " + loggableTokens(options, state);
+            ClientWarn.instance.warn(clientMsg);
+            logger.warn("{} with query {}", msg, asCQL(options, state));
+            ColumnFamilyStore store = cfs();
+            if (store != null)
+            {
+                store.metric.coordinatorReadSizeAborts.mark();
+                store.metric.coordinatorReadSize.update(result.getSize());
+            }
+            // read errors require blockFor and recieved (its in the protocol message), but this isn't known;
+            // to work around this, treat the coordinator as the only response we care about and mark it failed
+            ReadSizeAbortException exception = new ReadSizeAbortException(clientMsg, options.getConsistency(), 0, 1, true,
+                                                                          ImmutableMap.of(FBUtilities.getBroadcastAddressAndPort(), RequestFailureReason.READ_SIZE));
+            StorageProxy.recordReadRegularAbort(options.getConsistency(), exception);
+            throw exception;
+        }
+    }
+
+    private ColumnFamilyStore cfs()
+    {
+        return Schema.instance.getColumnFamilyStoreInstance(table.id);
+    }
+
     // Used by ModificationStatement for CAS operations
-    void processPartition(RowIterator partition, QueryOptions options, ResultSetBuilder result, int nowInSec)
+    public void processPartition(RowIterator partition, QueryOptions options, ResultSetBuilder result, int nowInSec)
     throws InvalidRequestException
     {
+        maybeFail(result, options);
         ProtocolVersion protocolVersion = options.getProtocolVersion();
 
         ByteBuffer[] keyComponents = getComponents(table, partition.partitionKey());
@@ -827,6 +988,7 @@
             if (!staticRow.isEmpty() && restrictions.returnStaticContentOnPartitionWithNoRows())
             {
                 result.newRow(partition.partitionKey(), staticRow.clustering());
+                maybeFail(result, options);
                 for (ColumnMetadata def : selection.getColumns())
                 {
                     switch (def.kind)
@@ -849,6 +1011,13 @@
         {
             Row row = partition.next();
             result.newRow( partition.partitionKey(), row.clustering());
+
+            // reads aren't failed as soon the size exceeds the failure threshold, they're failed once the failure
+            // threshold has been exceeded and we start adding more data. We're slightly more permissive to avoid
+            // cases where a row can never be read. Since we only warn/fail after entire rows are read, this will
+            // still allow the entire dataset to be read with LIMIT 1 queries, even if every row is oversized
+            maybeFail(result, options);
+
             // Respect selection order
             for (ColumnMetadata def : selection.getColumns())
             {
@@ -914,6 +1083,7 @@
         public final WhereClause whereClause;
         public final Term.Raw limit;
         public final Term.Raw perPartitionLimit;
+        private ClientState state;
 
         public RawStatement(QualifiedName cfName,
                             Parameters parameters,
@@ -932,6 +1102,8 @@
 
         public SelectStatement prepare(ClientState state)
         {
+            // Cache locally for use by Guardrails
+            this.state = state;
             return prepare(false);
         }
 
@@ -962,12 +1134,14 @@
                 validateDistinctSelection(table, selection, restrictions);
             }
 
-            AggregationSpecification aggregationSpec = getAggregationSpecification(table,
-                                                                                   selection,
-                                                                                   restrictions,
-                                                                                   parameters.isDistinct);
+            AggregationSpecification.Factory aggregationSpecFactory = getAggregationSpecFactory(table,
+                                                                                                bindVariables,
+                                                                                                selection,
+                                                                                                restrictions,
+                                                                                                parameters.isDistinct);
 
-            checkFalse(aggregationSpec == AggregationSpecification.AGGREGATE_EVERYTHING && perPartitionLimit != null,
+            checkFalse(aggregationSpecFactory == AggregationSpecification.AGGREGATE_EVERYTHING_FACTORY
+                       && perPartitionLimit != null,
                        "PER PARTITION LIMIT is not allowed with aggregate queries.");
 
             Comparator<List<ByteBuffer>> orderingComparator = null;
@@ -991,7 +1165,7 @@
                                        selection,
                                        restrictions,
                                        isReversed,
-                                       aggregationSpec,
+                                       aggregationSpecFactory,
                                        orderingComparator,
                                        prepareLimit(bindVariables, limit, keyspace(), limitReceiver()),
                                        prepareLimit(bindVariables, perPartitionLimit, keyspace(), perPartitionLimitReceiver()));
@@ -1005,6 +1179,9 @@
         {
             boolean hasGroupBy = !parameters.groups.isEmpty();
 
+            if (hasGroupBy)
+                Guardrails.groupByEnabled.ensureEnabled(state);
+
             if (selectables.isEmpty()) // wildcard query
             {
                 return hasGroupBy ? Selection.wildcardWithGroupBy(table, boundNames, parameters.isJson, restrictions.returnStaticContentOnPartitionWithNoRows())
@@ -1125,32 +1302,56 @@
         }
 
         /**
-         * Creates the <code>AggregationSpecification</code>s used to make the aggregates.
+         * Creates the {@code AggregationSpecification.Factory} used to make the aggregates.
          *
          * @param metadata the table metadata
          * @param selection the selection
          * @param restrictions the restrictions
-         * @param isDistinct <code>true</code> if the query is a DISTINCT one.
-         * @return the <code>AggregationSpecification</code>s used to make the aggregates
+         * @param isDistinct <code>true</code> if the query is a DISTINCT one. 
+         * @return the {@code AggregationSpecification.Factory} used to make the aggregates
          */
-        private AggregationSpecification getAggregationSpecification(TableMetadata metadata,
-                                                                     Selection selection,
-                                                                     StatementRestrictions restrictions,
-                                                                     boolean isDistinct)
+        private AggregationSpecification.Factory getAggregationSpecFactory(TableMetadata metadata,
+                                                                           VariableSpecifications boundNames,
+                                                                           Selection selection,
+                                                                           StatementRestrictions restrictions,
+                                                                           boolean isDistinct)
         {
             if (parameters.groups.isEmpty())
-                return selection.isAggregate() ? AggregationSpecification.AGGREGATE_EVERYTHING
+                return selection.isAggregate() ? AggregationSpecification.AGGREGATE_EVERYTHING_FACTORY
                                                : null;
 
             int clusteringPrefixSize = 0;
 
             Iterator<ColumnMetadata> pkColumns = metadata.primaryKeyColumns().iterator();
-            for (ColumnIdentifier id : parameters.groups)
+            Selector.Factory selectorFactory = null;
+            for (Selectable.Raw raw : parameters.groups)
             {
-                ColumnMetadata def = metadata.getExistingColumn(id);
+                Selectable selectable = raw.prepare(metadata);
+                ColumnMetadata def = null;
 
-                checkTrue(def.isPartitionKey() || def.isClusteringColumn(),
-                          "Group by is currently only supported on the columns of the PRIMARY KEY, got %s", def.name);
+                // For GROUP BY we only allow column names or functions at the higher level.
+                if (selectable instanceof WithFunction)
+                {
+                    WithFunction withFunction = (WithFunction) selectable;
+                    validateGroupByFunction(withFunction);
+                    List<ColumnMetadata> columns = new ArrayList<ColumnMetadata>();
+                    selectorFactory = selectable.newSelectorFactory(metadata, null, columns, boundNames);
+                    checkFalse(columns.isEmpty(), "GROUP BY functions must have one clustering column name as parameter");
+                    if (columns.size() > 1)
+                        throw invalidRequest("GROUP BY functions accept only one clustering column as parameter, got: %s",
+                                             columns.stream().map(c -> c.name.toCQLString()).collect(Collectors.joining(",")));
+
+                    def = columns.get(0);
+                    checkTrue(def.isClusteringColumn(),
+                              "Group by functions are only supported on clustering columns, got %s", def.name);
+                }
+                else
+                {
+                    def = (ColumnMetadata) selectable;
+                    checkTrue(def.isPartitionKey() || def.isClusteringColumn(),
+                              "Group by is currently only supported on the columns of the PRIMARY KEY, got %s", def.name);
+                    checkNull(selectorFactory, "Functions are only supported on the last element of the GROUP BY clause");
+                }
 
                 while (true)
                 {
@@ -1178,7 +1379,22 @@
             checkFalse(clusteringPrefixSize > 0 && isDistinct,
                        "Grouping on clustering columns is not allowed for SELECT DISTINCT queries");
 
-            return AggregationSpecification.aggregatePkPrefix(metadata.comparator, clusteringPrefixSize);
+            return selectorFactory == null ? AggregationSpecification.aggregatePkPrefixFactory(metadata.comparator, clusteringPrefixSize)
+                                           : AggregationSpecification.aggregatePkPrefixFactoryWithSelector(metadata.comparator,
+                                                                                                           clusteringPrefixSize,
+                                                                                                           selectorFactory);
+        }
+
+        /**
+         * Checks that the function used is a valid one for the GROUP BY clause.
+         *
+         * @param withFunction the {@code Selectable} from which the function must be retrieved.
+         * @return the monotonic scalar function that must be used for determining the groups.
+         */
+        private void validateGroupByFunction(WithFunction withFunction)
+        {
+            Function f = withFunction.function;
+            checkFalse(f.isAggregate(), "Aggregate functions are not supported within the GROUP BY clause, got: %s", f.name());
         }
 
         private Comparator<List<ByteBuffer>> getOrderingComparator(Selection selection,
@@ -1280,13 +1496,13 @@
     {
         // Public because CASSANDRA-9858
         public final Map<ColumnIdentifier, Boolean> orderings;
-        public final List<ColumnIdentifier> groups;
+        public final List<Selectable.Raw> groups;
         public final boolean isDistinct;
         public final boolean allowFiltering;
         public final boolean isJson;
 
         public Parameters(Map<ColumnIdentifier, Boolean> orderings,
-                          List<ColumnIdentifier> groups,
+                          List<Selectable.Raw> groups,
                           boolean isDistinct,
                           boolean allowFiltering,
                           boolean isJson)
@@ -1366,4 +1582,131 @@
     {
         return ToStringBuilder.reflectionToString(this, ToStringStyle.SHORT_PREFIX_STYLE);
     }
+
+    private String loggableTokens(QueryOptions options, ClientState state)
+    {
+        if (restrictions.isKeyRange() || restrictions.usesSecondaryIndexing())
+        {
+            AbstractBounds<PartitionPosition> bounds = restrictions.getPartitionKeyBounds(options);
+            return "token range: " + (bounds.inclusiveLeft() ? '[' : '(') +
+                   bounds.left.getToken().toString() + ", " +
+                   bounds.right.getToken().toString() +
+                   (bounds.inclusiveRight() ? ']' : ')');
+        }
+        else
+        {
+            Collection<ByteBuffer> keys = restrictions.getPartitionKeys(options, state);
+            if (keys.size() == 1)
+            {
+                return "token: " + table.partitioner.getToken(Iterables.getOnlyElement(keys)).toString();
+            }
+            else
+            {
+                StringBuilder sb = new StringBuilder("tokens: [");
+                boolean isFirst = true;
+                for (ByteBuffer key : keys)
+                {
+                    if (!isFirst) sb.append(", ");
+                    sb.append(table.partitioner.getToken(key).toString());
+                    isFirst = false;
+                }
+                return sb.append(']').toString();
+            }
+        }
+    }
+
+    private String asCQL(QueryOptions options, ClientState state)
+    {
+        ColumnFilter columnFilter = selection.newSelectors(options).getColumnFilter();
+        StringBuilder sb = new StringBuilder();
+
+        sb.append("SELECT ").append(queriedColumns().toCQLString());
+        sb.append(" FROM ").append(table.keyspace).append('.').append(table.name);
+        if (restrictions.isKeyRange() || restrictions.usesSecondaryIndexing())
+        {
+            // partition range
+            ClusteringIndexFilter clusteringIndexFilter = makeClusteringIndexFilter(options, state, columnFilter);
+            if (clusteringIndexFilter == null)
+                return "EMPTY";
+
+            RowFilter rowFilter = getRowFilter(options);
+
+            // The LIMIT provided by the user is the number of CQL row he wants returned.
+            // We want to have getRangeSlice to count the number of columns, not the number of keys.
+            AbstractBounds<PartitionPosition> keyBounds = restrictions.getPartitionKeyBounds(options);
+            if (keyBounds == null)
+                return "EMPTY";
+
+            DataRange dataRange = new DataRange(keyBounds, clusteringIndexFilter);
+
+            if (!dataRange.isUnrestricted(table) || !rowFilter.isEmpty())
+            {
+                sb.append(" WHERE ");
+                // We put the row filter first because the data range can end by "ORDER BY"
+                if (!rowFilter.isEmpty())
+                {
+                    sb.append(rowFilter);
+                    if (!dataRange.isUnrestricted(table))
+                        sb.append(" AND ");
+                }
+                if (!dataRange.isUnrestricted(table))
+                    sb.append(dataRange.toCQLString(table, rowFilter));
+            }
+        }
+        else
+        {
+            // single partition
+            Collection<ByteBuffer> keys = restrictions.getPartitionKeys(options, state);
+            if (keys.isEmpty())
+                return "EMPTY";
+            ClusteringIndexFilter filter = makeClusteringIndexFilter(options, state, columnFilter);
+            if (filter == null)
+                return "EMPTY";
+
+            sb.append(" WHERE ");
+
+
+            boolean compoundPk = table.partitionKeyColumns().size() > 1;
+            if (compoundPk) sb.append('(');
+            sb.append(ColumnMetadata.toCQLString(table.partitionKeyColumns()));
+            if (compoundPk) sb.append(')');
+            if (keys.size() == 1)
+            {
+                sb.append(" = ");
+                if (compoundPk) sb.append('(');
+                DataRange.appendKeyString(sb, table.partitionKeyType, Iterables.getOnlyElement(keys));
+                if (compoundPk) sb.append(')');
+            }
+            else
+            {
+                sb.append(" IN (");
+                boolean first = true;
+                for (ByteBuffer key : keys)
+                {
+                    if (!first)
+                        sb.append(", ");
+
+                    if (compoundPk) sb.append('(');
+                    DataRange.appendKeyString(sb, table.partitionKeyType, key);
+                    if (compoundPk) sb.append(')');
+                    first = false;
+                }
+
+                sb.append(')');
+            }
+
+            RowFilter rowFilter = getRowFilter(options);
+            if (!rowFilter.isEmpty())
+                sb.append(" AND ").append(rowFilter);
+
+            String filterString = filter.toCQLString(table, rowFilter);
+            if (!filterString.isEmpty())
+                sb.append(" AND ").append(filterString);
+        }
+
+        DataLimits limits = getDataLimits(getLimit(options), getPerPartitionLimit(options), options.getPageSize(), getAggregationSpec(options));
+        if (limits != DataLimits.NONE)
+            sb.append(' ').append(limits);
+        return sb.toString();
+    }
 }
diff --git a/src/java/org/apache/cassandra/cql3/statements/SingleTableUpdatesCollector.java b/src/java/org/apache/cassandra/cql3/statements/SingleTableUpdatesCollector.java
index 6dc2d41..14b1660 100644
--- a/src/java/org/apache/cassandra/cql3/statements/SingleTableUpdatesCollector.java
+++ b/src/java/org/apache/cassandra/cql3/statements/SingleTableUpdatesCollector.java
@@ -31,8 +31,10 @@
 import org.apache.cassandra.db.IMutation;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.RegularAndStaticColumns;
+import org.apache.cassandra.db.commitlog.CommitLogSegment;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.virtual.VirtualMutation;
+import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.TableMetadata;
 
 /**
@@ -105,6 +107,7 @@
                 mutation = new Mutation(builder.build());
 
             mutation.validateIndexedColumns();
+            mutation.validateSize(MessagingService.current_version, CommitLogSegment.ENTRY_OVERHEAD_SIZE);
             ms.add(mutation);
         }
 
diff --git a/src/java/org/apache/cassandra/cql3/statements/StatementType.java b/src/java/org/apache/cassandra/cql3/statements/StatementType.java
index d399931..f9c0d3d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/StatementType.java
+++ b/src/java/org/apache/cassandra/cql3/statements/StatementType.java
@@ -135,4 +135,4 @@
     {
         return false;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java b/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java
index 206d116..1d01eaa 100644
--- a/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/TruncateStatement.java
@@ -25,8 +25,11 @@
 import org.apache.cassandra.cql3.*;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.guardrails.Guardrails;
+import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.QueryState;
@@ -55,6 +58,7 @@
     public void validate(ClientState state) throws InvalidRequestException
     {
         Schema.instance.validateTable(keyspace(), name());
+        Guardrails.dropTruncateTableEnabled.ensureEnabled(state);
     }
 
     public ResultMessage execute(QueryState state, QueryOptions options, long queryStartNanoTime) throws InvalidRequestException, TruncateException
@@ -66,9 +70,13 @@
                 throw new InvalidRequestException("Cannot TRUNCATE materialized view directly; must truncate base table instead");
 
             if (metaData.isVirtual())
-                throw new InvalidRequestException("Cannot truncate virtual tables");
-
-            StorageProxy.truncateBlocking(keyspace(), name());
+            {
+                executeForVirtualTable(metaData.id);
+            }
+            else
+            {
+                StorageProxy.truncateBlocking(keyspace(), name());
+            }
         }
         catch (UnavailableException | TimeoutException e)
         {
@@ -86,10 +94,14 @@
                 throw new InvalidRequestException("Cannot TRUNCATE materialized view directly; must truncate base table instead");
 
             if (metaData.isVirtual())
-                throw new InvalidRequestException("Cannot truncate virtual tables");
-
-            ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(name());
-            cfs.truncateBlocking();
+            {
+                executeForVirtualTable(metaData.id);
+            }
+            else
+            {
+                ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(name());
+                cfs.truncateBlocking();
+            }
         }
         catch (Exception e)
         {
@@ -97,7 +109,12 @@
         }
         return null;
     }
-    
+
+    private void executeForVirtualTable(TableId id)
+    {
+        VirtualKeyspaceRegistry.instance.getTableNullable(id).truncate();
+    }
+
     @Override
     public String toString()
     {
diff --git a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java
index f67db14..20df151 100644
--- a/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/UpdateStatement.java
@@ -168,7 +168,7 @@
                 }
                 else
                 {
-                    Operation operation = new Operation.SetValue(value).prepare(metadata, def);
+                    Operation operation = new Operation.SetValue(value).prepare(metadata, def, !conditions.isEmpty());
                     operation.collectMarkerSpecification(bindVariables);
                     operations.add(operation);
                 }
@@ -236,7 +236,7 @@
                 }
                 else
                 {
-                    Operation operation = new Operation.SetValue(raw).prepare(metadata, def);
+                    Operation operation = new Operation.SetValue(raw).prepare(metadata, def, !conditions.isEmpty());
                     operation.collectMarkerSpecification(bindVariables);
                     operations.add(operation);
                 }
@@ -304,7 +304,7 @@
 
                 checkFalse(def.isPrimaryKeyColumn(), "PRIMARY KEY part %s found in SET part", def.name);
 
-                Operation operation = entry.right.prepare(metadata, def);
+                Operation operation = entry.right.prepare(metadata, def, !conditions.isEmpty());
                 operation.collectMarkerSpecification(bindVariables);
                 operations.add(operation);
             }
@@ -334,6 +334,6 @@
     @Override
     public AuditLogContext getAuditLogContext()
     {
-        return new AuditLogContext(AuditLogEntryType.UPDATE, keyspace(), columnFamily());
+        return new AuditLogContext(AuditLogEntryType.UPDATE, keyspace(), table());
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/statements/UseStatement.java b/src/java/org/apache/cassandra/cql3/statements/UseStatement.java
index 0504f43..c7f0c24 100644
--- a/src/java/org/apache/cassandra/cql3/statements/UseStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/UseStatement.java
@@ -19,8 +19,10 @@
 
 import org.apache.cassandra.audit.AuditLogContext;
 import org.apache.cassandra.audit.AuditLogEntryType;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.UnauthorizedException;
 import org.apache.cassandra.transport.messages.ResultMessage;
@@ -29,6 +31,9 @@
 import org.apache.commons.lang3.builder.ToStringBuilder;
 import org.apache.commons.lang3.builder.ToStringStyle;
 
+import static org.apache.cassandra.cql3.statements.RequestValidations.checkTrue;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class UseStatement extends CQLStatement.Raw implements CQLStatement
 {
     private final String keyspace;
@@ -48,12 +53,15 @@
         state.validateLogin();
     }
 
+    @Override
     public void validate(ClientState state) throws InvalidRequestException
     {
+        checkTrue(DatabaseDescriptor.getUseStatementsEnabled(), "USE statements prohibited. (see use_statements_enabled in cassandra.yaml)");
     }
 
     public ResultMessage execute(QueryState state, QueryOptions options, long queryStartNanoTime) throws InvalidRequestException
     {
+        QueryProcessor.metrics.useStatementsExecuted.inc();
         state.getClientState().setKeyspace(keyspace);
         return new ResultMessage.SetKeyspace(keyspace);
     }
@@ -62,7 +70,7 @@
     {
         // In production, internal queries are exclusively on the system keyspace and 'use' is thus useless
         // but for some unit tests we need to set the keyspace (e.g. for tests with DROP INDEX)
-        return execute(state, options, System.nanoTime());
+        return execute(state, options, nanoTime());
     }
     
     @Override
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 f208e4a..87377d7 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/AlterKeyspaceStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/AlterKeyspaceStatement.java
@@ -53,11 +53,13 @@
     private final HashSet<String> clientWarnings = new HashSet<>();
 
     private final KeyspaceAttributes attrs;
+    private final boolean ifExists;
 
-    public AlterKeyspaceStatement(String keyspaceName, KeyspaceAttributes attrs)
+    public AlterKeyspaceStatement(String keyspaceName, KeyspaceAttributes attrs, boolean ifExists)
     {
         super(keyspaceName);
         this.attrs = attrs;
+        this.ifExists = ifExists;
     }
 
     public Keyspaces apply(Keyspaces schema)
@@ -66,14 +68,18 @@
 
         KeyspaceMetadata keyspace = schema.getNullable(keyspaceName);
         if (null == keyspace)
-            throw ire("Keyspace '%s' doesn't exist", keyspaceName);
+        {
+            if (!ifExists)
+                throw ire("Keyspace '%s' doesn't exist", keyspaceName);
+            return schema;
+        }
 
         KeyspaceMetadata newKeyspace = keyspace.withSwapped(attrs.asAlteredKeyspaceParams(keyspace.params));
 
         if (newKeyspace.params.replication.klass.equals(LocalStrategy.class))
             throw ire("Unable to use given strategy class: LocalStrategy is reserved for internal use.");
 
-        newKeyspace.params.validate(keyspaceName);
+        newKeyspace.params.validate(keyspaceName, state);
 
         validateNoRangeMovements();
         validateTransientReplication(keyspace.createReplicationStrategy(), newKeyspace.createReplicationStrategy());
@@ -195,16 +201,18 @@
     {
         private final String keyspaceName;
         private final KeyspaceAttributes attrs;
+        private final boolean ifExists;
 
-        public Raw(String keyspaceName, KeyspaceAttributes attrs)
+        public Raw(String keyspaceName, KeyspaceAttributes attrs, boolean ifExists)
         {
             this.keyspaceName = keyspaceName;
             this.attrs = attrs;
+            this.ifExists = ifExists;
         }
 
         public AlterKeyspaceStatement prepare(ClientState state)
         {
-            return new AlterKeyspaceStatement(keyspaceName, attrs);
+            return new AlterKeyspaceStatement(keyspaceName, attrs, ifExists);
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java
index 124d04c..fdc4921 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/AlterSchemaStatement.java
@@ -38,15 +38,19 @@
 abstract public class AlterSchemaStatement implements CQLStatement.SingleKeyspaceCqlStatement, SchemaTransformation
 {
     protected final String keyspaceName; // name of the keyspace affected by the statement
+    protected ClientState state;
 
     protected AlterSchemaStatement(String keyspaceName)
     {
         this.keyspaceName = keyspaceName;
     }
 
-    public final void validate(ClientState state)
+    public void validate(ClientState state)
     {
-        // no-op; validation is performed while executing the statement, in apply()
+        // validation is performed while executing the statement, in apply()
+
+        // Cache our ClientState for use by guardrails
+        this.state = state;
     }
 
     public ResultMessage execute(QueryState state, QueryOptions options, long queryStartNanoTime)
@@ -105,11 +109,11 @@
 
         validateKeyspaceName();
 
-        KeyspacesDiff diff = MigrationManager.announce(this, locally);
+        SchemaTransformationResult result = Schema.instance.transform(this, locally);
 
-        clientWarnings(diff).forEach(ClientWarn.instance::warn);
+        clientWarnings(result.diff).forEach(ClientWarn.instance::warn);
 
-        if (diff.isEmpty())
+        if (result.diff.isEmpty())
             return new ResultMessage.Void();
 
         /*
@@ -121,9 +125,9 @@
          */
         AuthenticatedUser user = state.getClientState().getUser();
         if (null != user && !user.isAnonymous())
-            createdResources(diff).forEach(r -> grantPermissionsOnResource(r, user));
+            createdResources(result.diff).forEach(r -> grantPermissionsOnResource(r, user));
 
-        return new ResultMessage.SchemaChange(schemaChangeEvent(diff));
+        return new ResultMessage.SchemaChange(schemaChangeEvent(result.diff));
     }
 
     private void validateKeyspaceName()
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java
index f361b64..08c5f04 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/AlterTableStatement.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.cql3.statements.schema;
 
-import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -42,6 +41,7 @@
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.QualifiedName;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.AbstractType;
 
 import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -77,14 +77,16 @@
 public abstract class AlterTableStatement extends AlterSchemaStatement
 {
     protected final String tableName;
+    private final boolean ifExists;
 
-    public AlterTableStatement(String keyspaceName, String tableName)
+    public AlterTableStatement(String keyspaceName, String tableName, boolean ifExists)
     {
         super(keyspaceName);
         this.tableName = tableName;
+        this.ifExists = ifExists;
     }
 
-    public Keyspaces apply(Keyspaces schema) throws UnknownHostException
+    public Keyspaces apply(Keyspaces schema)
     {
         KeyspaceMetadata keyspace = schema.getNullable(keyspaceName);
 
@@ -93,7 +95,11 @@
                             : keyspace.getTableOrViewNullable(tableName);
 
         if (null == table)
-            throw ire("Table '%s.%s' doesn't exist", keyspaceName, tableName);
+        {
+            if (!ifExists)
+                throw ire("Table '%s.%s' doesn't exist", keyspaceName, tableName);
+            return schema;
+        }
 
         if (table.isView())
             throw ire("Cannot use ALTER TABLE on a materialized view; use ALTER MATERIALIZED VIEW instead");
@@ -122,18 +128,18 @@
         return format("%s (%s, %s)", getClass().getSimpleName(), keyspaceName, tableName);
     }
 
-    abstract KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table) throws UnknownHostException;
+    abstract KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table);
 
     /**
-     * ALTER TABLE <table> ALTER <column> TYPE <newtype>;
+     * ALTER TABLE [IF EXISTS] <table> ALTER <column> TYPE <newtype>;
      *
      * No longer supported.
      */
     public static class AlterColumn extends AlterTableStatement
     {
-        AlterColumn(String keyspaceName, String tableName)
+        AlterColumn(String keyspaceName, String tableName, boolean ifTableExists)
         {
-            super(keyspaceName, tableName);
+            super(keyspaceName, tableName, ifTableExists);
         }
 
         public KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table)
@@ -143,8 +149,8 @@
     }
 
     /**
-     * ALTER TABLE <table> ADD <column> <newtype>
-     * ALTER TABLE <table> ADD (<column> <newtype>, <column1> <newtype1>, ... <columnn> <newtypen>)
+     * ALTER TABLE [IF EXISTS] <table> ADD [IF NOT EXISTS] <column> <newtype>
+     * ALTER TABLE [IF EXISTS] <table> ADD [IF NOT EXISTS] (<column> <newtype>, <column1> <newtype1>, ... <columnn> <newtypen>)
      */
     private static class AddColumns extends AlterTableStatement
     {
@@ -163,18 +169,29 @@
         }
 
         private final Collection<Column> newColumns;
+        private final boolean ifColumnNotExists;
 
-        private AddColumns(String keyspaceName, String tableName, Collection<Column> newColumns)
+        private AddColumns(String keyspaceName, String tableName, Collection<Column> newColumns, boolean ifTableExists, boolean ifColumnNotExists)
         {
-            super(keyspaceName, tableName);
+            super(keyspaceName, tableName, ifTableExists);
             this.newColumns = newColumns;
+            this.ifColumnNotExists = ifColumnNotExists;
+        }
+
+        @Override
+        public void validate(ClientState state)
+        {
+            super.validate(state);
         }
 
         public KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table)
         {
             TableMetadata.Builder tableBuilder = table.unbuild();
             Views.Builder viewsBuilder = keyspace.views.unbuild();
-            newColumns.forEach(c -> addColumn(keyspace, table, c, tableBuilder, viewsBuilder));
+            newColumns.forEach(c -> addColumn(keyspace, table, c, ifColumnNotExists, tableBuilder, viewsBuilder));
+
+            Guardrails.columnsPerTable.guard(tableBuilder.numColumns(), tableName, false, state);
+
             TableMetadata tableMetadata = tableBuilder.build();
             tableMetadata.validate();
 
@@ -185,6 +202,7 @@
         private void addColumn(KeyspaceMetadata keyspace,
                                TableMetadata table,
                                Column column,
+                               boolean ifColumnNotExists,
                                TableMetadata.Builder tableBuilder,
                                Views.Builder viewsBuilder)
         {
@@ -192,8 +210,11 @@
             AbstractType<?> type = column.type.prepare(keyspaceName, keyspace.types).getType();
             boolean isStatic = column.isStatic;
 
-            if (null != tableBuilder.getColumn(name))
-                throw ire("Column with name '%s' already exists", name);
+            if (null != tableBuilder.getColumn(name)) {
+                if (!ifColumnNotExists)
+                    throw ire("Column with name '%s' already exists", name);
+                return;
+            }
 
             if (table.isCompactTable())
                 throw ire("Cannot add new column to a COMPACT STORAGE table");
@@ -206,7 +227,7 @@
             {
                 // After #8099, not safe to re-add columns of incompatible types - until *maybe* deser logic with dropped
                 // columns is pushed deeper down the line. The latter would still be problematic in cases of schema races.
-                if (!type.isValueCompatibleWith(droppedColumn.type))
+                if (!type.isSerializationCompatibleWith(droppedColumn.type))
                 {
                     throw ire("Cannot re-add previously dropped column '%s' of type %s, incompatible with previous type %s",
                               name,
@@ -247,34 +268,39 @@
     }
 
     /**
-     * ALTER TABLE <table> DROP <column>
-     * ALTER TABLE <table> DROP ( <column>, <column1>, ... <columnn>)
+     * ALTER TABLE [IF EXISTS] <table> DROP [IF EXISTS] <column>
+     * ALTER TABLE [IF EXISTS] <table> DROP [IF EXISTS] ( <column>, <column1>, ... <columnn>)
      */
     // TODO: swap UDT refs with expanded tuples on drop
     private static class DropColumns extends AlterTableStatement
     {
         private final Set<ColumnIdentifier> removedColumns;
+        private final boolean ifColumnExists;
         private final Long timestamp;
 
-        private DropColumns(String keyspaceName, String tableName, Set<ColumnIdentifier> removedColumns, Long timestamp)
+        private DropColumns(String keyspaceName, String tableName, Set<ColumnIdentifier> removedColumns, boolean ifTableExists, boolean ifColumnExists, Long timestamp)
         {
-            super(keyspaceName, tableName);
+            super(keyspaceName, tableName, ifTableExists);
             this.removedColumns = removedColumns;
+            this.ifColumnExists = ifColumnExists;
             this.timestamp = timestamp;
         }
 
         public KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table)
         {
             TableMetadata.Builder builder = table.unbuild();
-            removedColumns.forEach(c -> dropColumn(keyspace, table, c, builder));
+            removedColumns.forEach(c -> dropColumn(keyspace, table, c, ifColumnExists, builder));
             return keyspace.withSwapped(keyspace.tables.withSwapped(builder.build()));
         }
 
-        private void dropColumn(KeyspaceMetadata keyspace, TableMetadata table, ColumnIdentifier column, TableMetadata.Builder builder)
+        private void dropColumn(KeyspaceMetadata keyspace, TableMetadata table, ColumnIdentifier column, boolean ifExists, TableMetadata.Builder builder)
         {
             ColumnMetadata currentColumn = table.getColumn(column);
-            if (null == currentColumn)
-                throw ire("Column %s was not found in table '%s'", column, table);
+            if (null == currentColumn) {
+                if (!ifExists)
+                    throw ire("Column %s was not found in table '%s'", column, table);
+                return;
+            }
 
             if (currentColumn.isPrimaryKeyColumn())
                 throw ire("Cannot drop PRIMARY KEY column %s", column);
@@ -313,23 +339,25 @@
     }
 
     /**
-     * ALTER TABLE <table> RENAME <column> TO <column>;
+     * ALTER TABLE [IF EXISTS] <table> RENAME [IF EXISTS] <column> TO <column>;
      */
     private static class RenameColumns extends AlterTableStatement
     {
         private final Map<ColumnIdentifier, ColumnIdentifier> renamedColumns;
+        private final boolean ifColumnsExists;
 
-        private RenameColumns(String keyspaceName, String tableName, Map<ColumnIdentifier, ColumnIdentifier> renamedColumns)
+        private RenameColumns(String keyspaceName, String tableName, Map<ColumnIdentifier, ColumnIdentifier> renamedColumns, boolean ifTableExists, boolean ifColumnsExists)
         {
-            super(keyspaceName, tableName);
+            super(keyspaceName, tableName, ifTableExists);
             this.renamedColumns = renamedColumns;
+            this.ifColumnsExists = ifColumnsExists;
         }
 
         public KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table)
         {
             TableMetadata.Builder tableBuilder = table.unbuild();
             Views.Builder viewsBuilder = keyspace.views.unbuild();
-            renamedColumns.forEach((o, n) -> renameColumn(keyspace, table, o, n, tableBuilder, viewsBuilder));
+            renamedColumns.forEach((o, n) -> renameColumn(keyspace, table, o, n, ifColumnsExists, tableBuilder, viewsBuilder));
 
             return keyspace.withSwapped(keyspace.tables.withSwapped(tableBuilder.build()))
                            .withSwapped(viewsBuilder.build());
@@ -339,12 +367,17 @@
                                   TableMetadata table,
                                   ColumnIdentifier oldName,
                                   ColumnIdentifier newName,
+                                  boolean ifColumnsExists,
                                   TableMetadata.Builder tableBuilder,
                                   Views.Builder viewsBuilder)
         {
             ColumnMetadata column = table.getExistingColumn(oldName);
             if (null == column)
-                throw ire("Column %s was not found in table %s", oldName, table);
+            {
+                if (!ifColumnsExists)
+                    throw ire("Column %s was not found in table %s", oldName, table);
+                return;
+            }
 
             if (!column.isPrimaryKeyColumn())
                 throw ire("Cannot rename non PRIMARY KEY column %s", oldName);
@@ -379,18 +412,26 @@
     }
 
     /**
-     * ALTER TABLE <table> WITH <property> = <value>
+     * ALTER TABLE [IF EXISTS] <table> WITH <property> = <value>
      */
     private static class AlterOptions extends AlterTableStatement
     {
         private final TableAttributes attrs;
 
-        private AlterOptions(String keyspaceName, String tableName, TableAttributes attrs)
+        private AlterOptions(String keyspaceName, String tableName, TableAttributes attrs, boolean ifTableExists)
         {
-            super(keyspaceName, tableName);
+            super(keyspaceName, tableName, ifTableExists);
             this.attrs = attrs;
         }
 
+        @Override
+        public void validate(ClientState state)
+        {
+            super.validate(state);
+
+            Guardrails.tableProperties.guard(attrs.updatedProperties(), attrs::removeProperty, state);
+        }
+
         public KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table)
         {
             attrs.validate();
@@ -415,21 +456,24 @@
                 throw ire("read_repair must be set to 'NONE' for transiently replicated keyspaces");
             }
 
+            if (!params.compression.isEnabled())
+                Guardrails.uncompressedTablesEnabled.ensureEnabled(state);
+
             return keyspace.withSwapped(keyspace.tables.withSwapped(table.withSwapped(params)));
         }
     }
 
 
     /**
-     * ALTER TABLE <table> DROP COMPACT STORAGE
+     * ALTER TABLE [IF EXISTS] <table> DROP COMPACT STORAGE
      */
     private static class DropCompactStorage extends AlterTableStatement
     {
         private static final Logger logger = LoggerFactory.getLogger(AlterTableStatement.class);
         private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(logger, 5L, TimeUnit.MINUTES);
-        private DropCompactStorage(String keyspaceName, String tableName)
+        private DropCompactStorage(String keyspaceName, String tableName, boolean ifTableExists)
         {
-            super(keyspaceName, tableName);
+            super(keyspaceName, tableName, ifTableExists);
         }
 
         public KeyspaceMetadata apply(KeyspaceMetadata keyspace, TableMetadata table)
@@ -527,6 +571,9 @@
         }
 
         private final QualifiedName name;
+        private final boolean ifTableExists;
+        private boolean ifColumnExists;
+        private boolean ifColumnNotExists;
 
         private Kind kind;
 
@@ -543,9 +590,10 @@
         // OPTIONS
         public final TableAttributes attrs = new TableAttributes();
 
-        public Raw(QualifiedName name)
+        public Raw(QualifiedName name, boolean ifTableExists)
         {
             this.name = name;
+            this.ifTableExists = ifTableExists;
         }
 
         public AlterTableStatement prepare(ClientState state)
@@ -555,12 +603,12 @@
 
             switch (kind)
             {
-                case          ALTER_COLUMN: return new AlterColumn(keyspaceName, tableName);
-                case           ADD_COLUMNS: return new AddColumns(keyspaceName, tableName, addedColumns);
-                case          DROP_COLUMNS: return new DropColumns(keyspaceName, tableName, droppedColumns, timestamp);
-                case        RENAME_COLUMNS: return new RenameColumns(keyspaceName, tableName, renamedColumns);
-                case         ALTER_OPTIONS: return new AlterOptions(keyspaceName, tableName, attrs);
-                case  DROP_COMPACT_STORAGE: return new DropCompactStorage(keyspaceName, tableName);
+                case          ALTER_COLUMN: return new AlterColumn(keyspaceName, tableName, ifTableExists);
+                case           ADD_COLUMNS: return new AddColumns(keyspaceName, tableName, addedColumns, ifTableExists, ifColumnNotExists);
+                case          DROP_COLUMNS: return new DropColumns(keyspaceName, tableName, droppedColumns, ifTableExists, ifColumnExists, timestamp);
+                case        RENAME_COLUMNS: return new RenameColumns(keyspaceName, tableName, renamedColumns, ifTableExists, ifColumnExists);
+                case         ALTER_OPTIONS: return new AlterOptions(keyspaceName, tableName, attrs, ifTableExists);
+                case  DROP_COMPACT_STORAGE: return new DropCompactStorage(keyspaceName, tableName, ifTableExists);
             }
 
             throw new AssertionError();
@@ -583,6 +631,16 @@
             droppedColumns.add(name);
         }
 
+        public void ifColumnNotExists(boolean ifNotExists)
+        {
+            ifColumnNotExists = ifNotExists;
+        }
+
+        public void ifColumnExists(boolean ifExists)
+        {
+            ifColumnExists = ifExists;
+        }
+
         public void dropCompactStorage()
         {
             kind = Kind.DROP_COMPACT_STORAGE;
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/AlterTypeStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/AlterTypeStatement.java
index a9887c4..9c3be11 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/AlterTypeStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/AlterTypeStatement.java
@@ -27,6 +27,7 @@
 import org.apache.cassandra.audit.AuditLogEntryType;
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.cql3.*;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.UserType;
 import org.apache.cassandra.schema.KeyspaceMetadata;
@@ -49,16 +50,18 @@
 public abstract class AlterTypeStatement extends AlterSchemaStatement
 {
     protected final String typeName;
+    protected final boolean ifExists;
 
-    public AlterTypeStatement(String keyspaceName, String typeName)
+    public AlterTypeStatement(String keyspaceName, String typeName, boolean ifExists)
     {
         super(keyspaceName);
+        this.ifExists = ifExists;
         this.typeName = typeName;
     }
 
     public void authorize(ClientState client)
     {
-        client.ensureKeyspacePermission(keyspaceName, Permission.ALTER);
+        client.ensureAllTablesPermission(keyspaceName, Permission.ALTER);
     }
 
     SchemaChange schemaChangeEvent(Keyspaces.KeyspacesDiff diff)
@@ -75,7 +78,11 @@
                       : keyspace.types.getNullable(bytes(typeName));
 
         if (null == type)
-            throw ire("Type %s.%s doesn't exist", keyspaceName, typeName);
+        {
+            if (!ifExists)
+                throw ire("Type %s.%s doesn't exist", keyspaceName, typeName);
+            return schema;
+        }
 
         return schema.withAddedOrUpdated(keyspace.withUpdatedUserType(apply(keyspace, type)));
     }
@@ -97,18 +104,35 @@
     {
         private final FieldIdentifier fieldName;
         private final CQL3Type.Raw type;
+        private final boolean ifFieldNotExists;
 
-        private AddField(String keyspaceName, String typeName, FieldIdentifier fieldName, CQL3Type.Raw type)
+        private ClientState state;
+
+        private AddField(String keyspaceName, String typeName, FieldIdentifier fieldName, CQL3Type.Raw type, boolean ifExists, boolean ifFieldNotExists)
         {
-            super(keyspaceName, typeName);
+            super(keyspaceName, typeName, ifExists);
             this.fieldName = fieldName;
+            this.ifFieldNotExists = ifFieldNotExists;
             this.type = type;
         }
 
+        @Override
+        public void validate(ClientState state)
+        {
+            super.validate(state);
+
+            // save the query state to use it for guardrails validation in #apply
+            this.state = state;
+        }
+
         UserType apply(KeyspaceMetadata keyspace, UserType userType)
         {
             if (userType.fieldPosition(fieldName) >= 0)
-                throw ire("Cannot add field %s to type %s: a field with name %s already exists", fieldName, userType.getCqlTypeName(), fieldName);
+            {
+                if (!ifFieldNotExists)
+                    throw ire("Cannot add field %s to type %s: a field with name %s already exists", fieldName, userType.getCqlTypeName(), fieldName);
+                return userType;
+            }
 
             AbstractType<?> fieldType = type.prepare(keyspaceName, keyspace.types).getType();
             if (fieldType.referencesUserType(userType.name))
@@ -122,6 +146,8 @@
                           String.join(", ", transform(tablesWithTypeInPartitionKey, TableMetadata::toString)));
             }
 
+            Guardrails.fieldsPerUDT.guard(userType.size() + 1, userType.getNameAsString(), false, state);
+
             List<FieldIdentifier> fieldNames = new ArrayList<>(userType.fieldNames()); fieldNames.add(fieldName);
             List<AbstractType<?>> fieldTypes = new ArrayList<>(userType.fieldTypes()); fieldTypes.add(fieldType);
 
@@ -141,10 +167,12 @@
     private static final class RenameFields extends AlterTypeStatement
     {
         private final Map<FieldIdentifier, FieldIdentifier> renamedFields;
+        private final boolean ifFieldExists;
 
-        private RenameFields(String keyspaceName, String typeName, Map<FieldIdentifier, FieldIdentifier> renamedFields)
+        private RenameFields(String keyspaceName, String typeName, Map<FieldIdentifier, FieldIdentifier> renamedFields, boolean ifExists, boolean ifFieldExists)
         {
-            super(keyspaceName, typeName);
+            super(keyspaceName, typeName, ifExists);
+            this.ifFieldExists = ifFieldExists;
             this.renamedFields = renamedFields;
         }
 
@@ -170,7 +198,11 @@
             {
                 int idx = userType.fieldPosition(oldName);
                 if (idx < 0)
-                    throw ire("Unkown field %s in user type %s", oldName, keyspaceName, userType.getCqlTypeName());
+                {
+                    if (!ifFieldExists)
+                        throw ire("Unkown field %s in user type %s", oldName, userType.getCqlTypeName());
+                    return;
+                }
                 fieldNames.set(idx, newName);
             });
 
@@ -186,9 +218,9 @@
 
     private static final class AlterField extends AlterTypeStatement
     {
-        private AlterField(String keyspaceName, String typeName)
+        private AlterField(String keyspaceName, String typeName, boolean ifExists)
         {
-            super(keyspaceName, typeName);
+            super(keyspaceName, typeName, ifExists);
         }
 
         UserType apply(KeyspaceMetadata keyspace, UserType userType)
@@ -205,6 +237,9 @@
         }
 
         private final UTName name;
+        private final boolean ifExists;
+        private boolean ifFieldExists;
+        private boolean ifFieldNotExists;
 
         private Kind kind;
 
@@ -215,8 +250,9 @@
         // RENAME
         private final Map<FieldIdentifier, FieldIdentifier> renamedFields = new HashMap<>();
 
-        public Raw(UTName name)
+        public Raw(UTName name, boolean ifExists)
         {
+            this.ifExists = ifExists;
             this.name = name;
         }
 
@@ -227,9 +263,9 @@
 
             switch (kind)
             {
-                case     ADD_FIELD: return new AddField(keyspaceName, typeName, newFieldName, newFieldType);
-                case RENAME_FIELDS: return new RenameFields(keyspaceName, typeName, renamedFields);
-                case   ALTER_FIELD: return new AlterField(keyspaceName, typeName);
+                case     ADD_FIELD: return new AddField(keyspaceName, typeName, newFieldName, newFieldType, ifExists, ifFieldNotExists);
+                case RENAME_FIELDS: return new RenameFields(keyspaceName, typeName, renamedFields, ifExists, ifFieldExists);
+                case   ALTER_FIELD: return new AlterField(keyspaceName, typeName, ifExists);
             }
 
             throw new AssertionError();
@@ -242,12 +278,22 @@
             newFieldType = type;
         }
 
+        public void ifFieldNotExists(boolean ifNotExists)
+        {
+            this.ifFieldNotExists = ifNotExists;
+        }
+
         public void rename(FieldIdentifier from, FieldIdentifier to)
         {
             kind = Kind.RENAME_FIELDS;
             renamedFields.put(from, to);
         }
 
+        public void ifFieldExists(boolean ifExists)
+        {
+            this.ifFieldExists = ifExists;
+        }
+
         public void alter(FieldIdentifier name, CQL3Type.Raw type)
         {
             kind = Kind.ALTER_FIELD;
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/AlterViewStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/AlterViewStatement.java
index 3493eb0..7e707f4 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/AlterViewStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/AlterViewStatement.java
@@ -22,6 +22,7 @@
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QualifiedName;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.*;
 import org.apache.cassandra.schema.Keyspaces.KeyspacesDiff;
 import org.apache.cassandra.service.ClientState;
@@ -33,12 +34,24 @@
 {
     private final String viewName;
     private final TableAttributes attrs;
+    private ClientState state;
+    private final boolean ifExists;
 
-    public AlterViewStatement(String keyspaceName, String viewName, TableAttributes attrs)
+    public AlterViewStatement(String keyspaceName, String viewName, TableAttributes attrs, boolean ifExists)
     {
         super(keyspaceName);
         this.viewName = viewName;
         this.attrs = attrs;
+        this.ifExists = ifExists;
+    }
+
+    @Override
+    public void validate(ClientState state)
+    {
+        super.validate(state);
+
+        // save the query state to use it for guardrails validation in #apply
+        this.state = state;
     }
 
     public Keyspaces apply(Keyspaces schema)
@@ -50,10 +63,16 @@
                           : keyspace.views.getNullable(viewName);
 
         if (null == view)
+        {
+            if (ifExists) return schema;
             throw ire("Materialized view '%s.%s' doesn't exist", keyspaceName, viewName);
+        }
 
         attrs.validate();
 
+        // Guardrails on table properties
+        Guardrails.tableProperties.guard(attrs.updatedProperties(), attrs::removeProperty, state);
+
         TableParams params = attrs.asAlteredTableParams(view.metadata.params);
 
         if (params.gcGraceSeconds == 0)
@@ -102,17 +121,19 @@
     {
         private final QualifiedName name;
         private final TableAttributes attrs;
+        private final boolean ifExists;
 
-        public Raw(QualifiedName name, TableAttributes attrs)
+        public Raw(QualifiedName name, TableAttributes attrs, boolean ifExists)
         {
             this.name = name;
             this.attrs = attrs;
+            this.ifExists = ifExists;
         }
 
         public AlterViewStatement prepare(ClientState state)
         {
             String keyspaceName = name.hasKeyspace() ? name.getKeyspace() : state.getKeyspace();
-            return new AlterViewStatement(keyspaceName, name.getName(), attrs);
+            return new AlterViewStatement(keyspaceName, name.getName(), attrs, ifExists);
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/CreateAggregateStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/CreateAggregateStatement.java
index e567021..0550515 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateAggregateStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateAggregateStatement.java
@@ -112,9 +112,9 @@
 
         List<AbstractType<?>> argumentTypes =
             rawArgumentTypes.stream()
-                            .map(t -> t.prepare(keyspaceName, keyspace.types).getType())
+                            .map(t -> t.prepare(keyspaceName, keyspace.types).getType().udfType())
                             .collect(toList());
-        AbstractType<?> stateType = rawStateType.prepare(keyspaceName, keyspace.types).getType();
+        AbstractType<?> stateType = rawStateType.prepare(keyspaceName, keyspace.types).getType().udfType();
         List<AbstractType<?>> stateFunctionArguments = Lists.newArrayList(concat(singleton(stateType), argumentTypes));
 
         Function stateFunction =
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/CreateFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/CreateFunctionStatement.java
index 3a1eb9f..adb8f40 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateFunctionStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateFunctionStatement.java
@@ -26,8 +26,6 @@
 
 import org.apache.cassandra.audit.AuditLogContext;
 import org.apache.cassandra.audit.AuditLogEntryType;
-import org.apache.cassandra.auth.FunctionResource;
-import org.apache.cassandra.auth.IResource;
 import org.apache.cassandra.auth.*;
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.cql3.CQLStatement;
@@ -111,9 +109,9 @@
 
         List<AbstractType<?>> argumentTypes =
             rawArgumentTypes.stream()
-                            .map(t -> t.prepare(keyspaceName, keyspace.types).getType())
+                            .map(t -> t.prepare(keyspaceName, keyspace.types).getType().udfType())
                             .collect(toList());
-        AbstractType<?> returnType = rawReturnType.prepare(keyspaceName, keyspace.types).getType();
+        AbstractType<?> returnType = rawReturnType.prepare(keyspaceName, keyspace.types).getType().udfType();
 
         UDFunction function =
             UDFunction.create(new FunctionName(keyspaceName, functionName),
@@ -176,7 +174,7 @@
     {
         FunctionName name = new FunctionName(keyspaceName, functionName);
 
-        if (Schema.instance.findFunction(name, Lists.transform(rawArgumentTypes, t -> t.prepare(keyspaceName).getType())).isPresent() && orReplace)
+        if (Schema.instance.findFunction(name, Lists.transform(rawArgumentTypes, t -> t.prepare(keyspaceName).getType().udfType())).isPresent() && orReplace)
             client.ensurePermission(Permission.ALTER, FunctionResource.functionFromCql(keyspaceName, functionName, rawArgumentTypes));
         else
             client.ensurePermission(Permission.CREATE, FunctionResource.keyspace(keyspaceName));
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java
index d501423..7a3a41e 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateIndexStatement.java
@@ -19,6 +19,7 @@
 
 import java.util.*;
 
+import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 
@@ -31,6 +32,7 @@
 import org.apache.cassandra.cql3.QualifiedName;
 import org.apache.cassandra.cql3.statements.schema.IndexTarget.Type;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.MapType;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.sasi.SASIIndex;
@@ -52,6 +54,8 @@
     private final IndexAttributes attrs;
     private final boolean ifNotExists;
 
+    private ClientState state;
+
     public CreateIndexStatement(String keyspaceName,
                                 String tableName,
                                 String indexName,
@@ -67,11 +71,22 @@
         this.ifNotExists = ifNotExists;
     }
 
+    @Override
+    public void validate(ClientState state)
+    {
+        super.validate(state);
+
+        // save the query state to use it for guardrails validation in #apply
+        this.state = state;
+    }
+
     public Keyspaces apply(Keyspaces schema)
     {
         attrs.validate();
 
-        if (attrs.isCustom && attrs.customClass.equals(SASIIndex.class.getName()) && !DatabaseDescriptor.getEnableSASIIndexes())
+        Guardrails.createSecondaryIndexesEnabled.ensureEnabled("Creating secondary indexes", state);
+
+        if (attrs.isCustom && attrs.customClass.equals(SASIIndex.class.getName()) && !DatabaseDescriptor.getSASIIndexesEnabled())
             throw new InvalidRequestException("SASI indexes are disabled. Enable in cassandra.yaml to use.");
 
         KeyspaceMetadata keyspace = schema.getNullable(keyspaceName);
@@ -99,6 +114,14 @@
         if (Keyspace.open(table.keyspace).getReplicationStrategy().hasTransientReplicas())
             throw new InvalidRequestException("Secondary indexes are not supported on transiently replicated keyspaces");
 
+        // guardrails to limit number of secondary indexes per table.
+        Guardrails.secondaryIndexesPerTable.guard(table.indexes.size() + 1,
+                                                  Strings.isNullOrEmpty(indexName)
+                                                  ? String.format("on table %s", table.name)
+                                                  : String.format("%s on table %s", indexName, table.name),
+                                                  false,
+                                                  state);
+
         List<IndexTarget> indexTargets = Lists.newArrayList(transform(rawIndexTargets, t -> t.prepare(table)));
 
         if (indexTargets.isEmpty() && !attrs.isCustom)
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/CreateKeyspaceStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/CreateKeyspaceStatement.java
index 9aa27ce..dc82f93 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateKeyspaceStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateKeyspaceStatement.java
@@ -33,6 +33,7 @@
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLStatement;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.exceptions.AlreadyExistsException;
 import org.apache.cassandra.locator.LocalStrategy;
 import org.apache.cassandra.schema.KeyspaceMetadata;
@@ -79,7 +80,7 @@
         if (keyspace.params.replication.klass.equals(LocalStrategy.class))
             throw ire("Unable to use given strategy class: LocalStrategy is reserved for internal use.");
 
-        keyspace.params.validate(keyspaceName);
+        keyspace.params.validate(keyspaceName, state);
         return schema.withAddedOrUpdated(keyspace);
     }
 
@@ -111,8 +112,18 @@
     }
 
     @Override
+    public void validate(ClientState state)
+    {
+        super.validate(state);
+
+        // Guardrail on number of keyspaces
+        Guardrails.keyspaces.guard(Schema.instance.getUserKeyspaces().size() + 1, keyspaceName, false, state);
+    }
+
+    @Override
     Set<String> clientWarnings(KeyspacesDiff diff)
     {
+        // this threshold is deprecated, it will be replaced by the guardrail used in #validate(ClientState)
         int keyspaceCount = Schema.instance.getKeyspaces().size();
         if (keyspaceCount > DatabaseDescriptor.keyspaceCountWarnThreshold())
         {
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/CreateTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/CreateTableStatement.java
index 1339ba3..1a62538 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateTableStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateTableStatement.java
@@ -33,6 +33,8 @@
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.*;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.AlreadyExistsException;
 import org.apache.cassandra.schema.*;
@@ -115,9 +117,40 @@
             throw ire("read_repair must be set to 'NONE' for transiently replicated keyspaces");
         }
 
+        if (!table.params.compression.isEnabled())
+            Guardrails.uncompressedTablesEnabled.ensureEnabled(state);
+
         return schema.withAddedOrUpdated(keyspace.withSwapped(keyspace.tables.with(table)));
     }
 
+    @Override
+    public void validate(ClientState state)
+    {
+        super.validate(state);
+
+        // Guardrail on table properties
+        Guardrails.tableProperties.guard(attrs.updatedProperties(), attrs::removeProperty, state);
+
+        // Guardrail on columns per table
+        Guardrails.columnsPerTable.guard(rawColumns.size(), tableName, false, state);
+
+        // Guardrail on number of tables
+        if (Guardrails.tables.enabled(state))
+        {
+            int totalUserTables = Schema.instance.getUserKeyspaces()
+                                                 .stream()
+                                                 .map(ksm -> ksm.name)
+                                                 .map(Keyspace::open)
+                                                 .mapToInt(keyspace -> keyspace.getColumnFamilyStores().size())
+                                                 .sum();
+            Guardrails.tables.guard(totalUserTables + 1, tableName, false, state);
+        }
+
+        // Guardrail to check whether creation of new COMPACT STORAGE tables is allowed
+        if (useCompactStorage)
+            Guardrails.compactTablesEnabled.ensureEnabled(state);
+    }
+
     SchemaChange schemaChangeEvent(KeyspacesDiff diff)
     {
         return new SchemaChange(Change.CREATED, Target.TABLE, keyspaceName, tableName);
@@ -125,7 +158,7 @@
 
     public void authorize(ClientState client)
     {
-        client.ensureKeyspacePermission(keyspaceName, Permission.CREATE);
+        client.ensureAllTablesPermission(keyspaceName, Permission.CREATE);
     }
 
     @Override
@@ -372,6 +405,7 @@
     @Override
     public Set<String> clientWarnings(KeyspacesDiff diff)
     {
+        // this threshold is deprecated, it will be replaced by the guardrail used in #validate(ClientState)
         int tableCount = Schema.instance.getNumberOfTables();
         if (tableCount > DatabaseDescriptor.tableCountWarnThreshold())
         {
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/CreateTypeStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/CreateTypeStatement.java
index 7c1717e..e015c34 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateTypeStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateTypeStatement.java
@@ -26,6 +26,7 @@
 import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.FieldIdentifier;
 import org.apache.cassandra.cql3.UTName;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.UserType;
 import org.apache.cassandra.schema.KeyspaceMetadata;
@@ -61,6 +62,14 @@
         this.ifNotExists = ifNotExists;
     }
 
+    @Override
+    public void validate(ClientState state)
+    {
+        super.validate(state);
+
+        Guardrails.fieldsPerUDT.guard(fieldNames.size(), typeName, false, state);
+    }
+
     public Keyspaces apply(Keyspaces schema)
     {
         KeyspaceMetadata keyspace = schema.getNullable(keyspaceName);
@@ -106,7 +115,7 @@
 
     public void authorize(ClientState client)
     {
-        client.ensureKeyspacePermission(keyspaceName, Permission.CREATE);
+        client.ensureAllTablesPermission(keyspaceName, Permission.CREATE);
     }
 
     @Override
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 39a4c20..145c8fc 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/CreateViewStatement.java
@@ -20,6 +20,7 @@
 import java.util.*;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
 import org.apache.cassandra.audit.AuditLogContext;
@@ -31,6 +32,7 @@
 import org.apache.cassandra.cql3.selection.RawSelector;
 import org.apache.cassandra.cql3.selection.Selectable;
 import org.apache.cassandra.cql3.statements.StatementType;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.ReversedType;
 import org.apache.cassandra.db.view.View;
@@ -65,6 +67,8 @@
 
     private final boolean ifNotExists;
 
+    private ClientState state;
+
     public CreateViewStatement(String keyspaceName,
                                String tableName,
                                String viewName,
@@ -96,9 +100,18 @@
         this.ifNotExists = ifNotExists;
     }
 
+    @Override
+    public void validate(ClientState state)
+    {
+        super.validate(state);
+
+        // save the query state to use it for guardrails validation in #apply
+        this.state = state;
+    }
+
     public Keyspaces apply(Keyspaces schema)
     {
-        if (!DatabaseDescriptor.getEnableMaterializedViews())
+        if (!DatabaseDescriptor.getMaterializedViewsEnabled())
             throw ire("Materialized views are disabled. Enable in cassandra.yaml to use.");
 
         /*
@@ -137,6 +150,16 @@
         if (table.isView())
             throw ire("Materialized views cannot be created against other materialized views");
 
+        // Guardrails on table properties
+        Guardrails.tableProperties.guard(attrs.updatedProperties(), attrs::removeProperty, state);
+
+        // Guardrail to limit number of mvs per table
+        Iterable<ViewMetadata> tableViews = keyspace.views.forTable(table.id);
+        Guardrails.materializedViewsPerTable.guard(Iterables.size(tableViews) + 1,
+                                                   String.format("%s on table %s", viewName, table.name),
+                                                   false,
+                                                   state);
+
         if (table.params.gcGraceSeconds == 0)
         {
             throw ire("Cannot create materialized view '%s' for base table " +
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/DropAggregateStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/DropAggregateStatement.java
index 7302158..0cb1cbe 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/DropAggregateStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/DropAggregateStatement.java
@@ -148,7 +148,7 @@
     {
         return arguments.stream()
                         .map(t -> t.prepare(keyspaceName, types))
-                        .map(CQL3Type::getType)
+                        .map(t -> t.getType().udfType())
                         .collect(toList());
     }
 
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/DropFunctionStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/DropFunctionStatement.java
index 99bfd64..d9d637d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/DropFunctionStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/DropFunctionStatement.java
@@ -156,7 +156,7 @@
     {
         return arguments.stream()
                         .map(t -> t.prepare(keyspaceName, types))
-                        .map(CQL3Type::getType)
+                        .map(t -> t.getType().udfType())
                         .collect(toList());
     }
 
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/DropIndexStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/DropIndexStatement.java
index 2186470..24b372d 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/DropIndexStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/DropIndexStatement.java
@@ -22,7 +22,6 @@
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QualifiedName;
-import org.apache.cassandra.schema.Diff;
 import org.apache.cassandra.schema.*;
 import org.apache.cassandra.schema.KeyspaceMetadata.KeyspaceDiff;
 import org.apache.cassandra.schema.Keyspaces.KeyspacesDiff;
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/DropTableStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/DropTableStatement.java
index 15c2a03..78c98be 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/DropTableStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/DropTableStatement.java
@@ -22,6 +22,7 @@
 import org.apache.cassandra.auth.Permission;
 import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QualifiedName;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.schema.*;
 import org.apache.cassandra.schema.Keyspaces.KeyspacesDiff;
 import org.apache.cassandra.service.ClientState;
@@ -48,6 +49,8 @@
 
     public Keyspaces apply(Keyspaces schema)
     {
+        Guardrails.dropTruncateTableEnabled.ensureEnabled(state);
+
         KeyspaceMetadata keyspace = schema.getNullable(keyspaceName);
 
         TableMetadata table = null == keyspace
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/DropTypeStatement.java b/src/java/org/apache/cassandra/cql3/statements/schema/DropTypeStatement.java
index 6cda7ba..d188bdb 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/DropTypeStatement.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/DropTypeStatement.java
@@ -120,7 +120,7 @@
 
     public void authorize(ClientState client)
     {
-        client.ensureKeyspacePermission(keyspaceName, Permission.DROP);
+        client.ensureAllTablesPermission(keyspaceName, Permission.DROP);
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/cql3/statements/schema/TableAttributes.java b/src/java/org/apache/cassandra/cql3/statements/schema/TableAttributes.java
index 126e6d7..829a53a 100644
--- a/src/java/org/apache/cassandra/cql3/statements/schema/TableAttributes.java
+++ b/src/java/org/apache/cassandra/cql3/statements/schema/TableAttributes.java
@@ -21,6 +21,7 @@
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 
 import org.apache.cassandra.cql3.statements.PropertyDefinitions;
 import org.apache.cassandra.exceptions.ConfigurationException;
@@ -28,6 +29,7 @@
 import org.apache.cassandra.schema.CachingParams;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.CompressionParams;
+import org.apache.cassandra.schema.MemtableParams;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableParams;
 import org.apache.cassandra.schema.TableParams.Option;
@@ -83,6 +85,16 @@
         }
     }
 
+    public static Set<String> validKeywords()
+    {
+        return ImmutableSet.copyOf(validKeywords);
+    }
+
+    public static Set<String> allKeywords()
+    {
+        return Sets.union(validKeywords, obsoleteKeywords);
+    }
+
     private TableParams build(TableParams.Builder builder)
     {
         if (hasOption(Option.BLOOM_FILTER_FP_CHANCE))
@@ -110,6 +122,9 @@
             builder.compression(CompressionParams.fromMap(getMap(Option.COMPRESSION)));
         }
 
+        if (hasOption(Option.MEMTABLE))
+            builder.memtable(MemtableParams.get(getString(Option.MEMTABLE)));
+
         if (hasOption(Option.DEFAULT_TIME_TO_LIVE))
             builder.defaultTimeToLive(getInt(Option.DEFAULT_TIME_TO_LIVE));
 
diff --git a/src/java/org/apache/cassandra/db/AbstractReadQuery.java b/src/java/org/apache/cassandra/db/AbstractReadQuery.java
index ec1a6b1..374d2b2 100644
--- a/src/java/org/apache/cassandra/db/AbstractReadQuery.java
+++ b/src/java/org/apache/cassandra/db/AbstractReadQuery.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.db;
 
+import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.filter.DataLimits;
 import org.apache.cassandra.db.filter.RowFilter;
@@ -102,13 +103,17 @@
         StringBuilder sb = new StringBuilder().append("SELECT ")
                                               .append(columnFilter().toCQLString())
                                               .append(" FROM ")
-                                              .append(metadata().keyspace)
+                                              .append(ColumnIdentifier.maybeQuote(metadata().keyspace))
                                               .append('.')
-                                              .append(metadata().name);
+                                              .append(ColumnIdentifier.maybeQuote(metadata().name));
         appendCQLWhereClause(sb);
 
         if (limits() != DataLimits.NONE)
             sb.append(' ').append(limits());
+
+        // ALLOW FILTERING might not be strictly necessary
+        sb.append(" ALLOW FILTERING");
+
         return sb.toString();
     }
 
diff --git a/src/java/org/apache/cassandra/db/ArrayClustering.java b/src/java/org/apache/cassandra/db/ArrayClustering.java
index a6ee991..53d45e7 100644
--- a/src/java/org/apache/cassandra/db/ArrayClustering.java
+++ b/src/java/org/apache/cassandra/db/ArrayClustering.java
@@ -22,7 +22,7 @@
 
 public class ArrayClustering extends AbstractArrayClusteringPrefix implements Clustering<byte[]>
 {
-    private static final long EMPTY_SIZE = ObjectSizes.measure(new ArrayClustering(EMPTY_VALUES_ARRAY));
+    public static final long EMPTY_SIZE = ObjectSizes.measure(new ArrayClustering(EMPTY_VALUES_ARRAY));
 
     public ArrayClustering(byte[]... values)
     {
diff --git a/src/java/org/apache/cassandra/db/BufferClustering.java b/src/java/org/apache/cassandra/db/BufferClustering.java
index a6dcd1b..e3592e1 100644
--- a/src/java/org/apache/cassandra/db/BufferClustering.java
+++ b/src/java/org/apache/cassandra/db/BufferClustering.java
@@ -19,7 +19,6 @@
 
 import java.nio.ByteBuffer;
 
-import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.ObjectSizes;
 
 /**
diff --git a/src/java/org/apache/cassandra/db/CassandraKeyspaceWriteHandler.java b/src/java/org/apache/cassandra/db/CassandraKeyspaceWriteHandler.java
index efba11f..f2cf93c 100644
--- a/src/java/org/apache/cassandra/db/CassandraKeyspaceWriteHandler.java
+++ b/src/java/org/apache/cassandra/db/CassandraKeyspaceWriteHandler.java
@@ -18,9 +18,14 @@
 
 package org.apache.cassandra.db;
 
+import java.util.HashSet;
+import java.util.Set;
+
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.exceptions.RequestExecutionException;
+import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 
@@ -46,8 +51,7 @@
             CommitLogPosition position = null;
             if (makeDurable)
             {
-                Tracing.trace("Appending to commitlog");
-                position = CommitLog.instance.add(mutation);
+                position = addToCommitLog(mutation);
             }
             return new CassandraWriteContext(group, position);
         }
@@ -61,6 +65,41 @@
         }
     }
 
+    private CommitLogPosition addToCommitLog(Mutation mutation)
+    {
+        // Usually one of these will be true, so first check if that's the case.
+        boolean allSkipCommitlog = true;
+        boolean noneSkipCommitlog = true;
+        for (PartitionUpdate update : mutation.getPartitionUpdates())
+        {
+            if (update.metadata().params.memtable.factory().writesShouldSkipCommitLog())
+                noneSkipCommitlog = false;
+            else
+                allSkipCommitlog = false;
+        }
+
+        if (!noneSkipCommitlog)
+        {
+            if (allSkipCommitlog)
+                return null;
+            else
+            {
+                Set<TableId> ids = new HashSet<>();
+                for (PartitionUpdate update : mutation.getPartitionUpdates())
+                {
+                    if (update.metadata().params.memtable.factory().writesShouldSkipCommitLog())
+                        ids.add(update.metadata().id);
+                }
+                mutation = mutation.without(ids);
+            }
+        }
+        // Note: It may be a good idea to precalculate none/all for the set of all tables in the keyspace,
+        // or memoize the mutation.getTableIds()->ids map (needs invalidation on schema version change).
+
+        Tracing.trace("Appending to commitlog");
+        return CommitLog.instance.add(mutation);
+    }
+
     @SuppressWarnings("resource") // group is closed when CassandraWriteContext is closed
     private WriteContext createEmptyContext()
     {
diff --git a/src/java/org/apache/cassandra/db/Clustering.java b/src/java/org/apache/cassandra/db/Clustering.java
index 24a5000..dd91fea 100644
--- a/src/java/org/apache/cassandra/db/Clustering.java
+++ b/src/java/org/apache/cassandra/db/Clustering.java
@@ -22,6 +22,7 @@
 import java.nio.ByteBuffer;
 import java.util.List;
 
+import org.apache.cassandra.cache.IMeasurableMemory;
 import org.apache.cassandra.db.marshal.ByteArrayAccessor;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
@@ -34,7 +35,7 @@
 
 import static org.apache.cassandra.db.AbstractBufferClusteringPrefix.EMPTY_VALUES_ARRAY;
 
-public interface Clustering<V> extends ClusteringPrefix<V>
+public interface Clustering<V> extends ClusteringPrefix<V>, IMeasurableMemory
 {
     public static final Serializer serializer = new Serializer();
 
@@ -72,7 +73,7 @@
         for (int i = 0; i < size(); i++)
         {
             ColumnMetadata c = metadata.clusteringColumns().get(i);
-            sb.append(i == 0 ? "" : ", ").append(c.type.getString(get(i), accessor()));
+            sb.append(i == 0 ? "" : ", ").append(c.type.toCQLString(bufferAt(i)));
         }
         return sb.toString();
     }
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
index 571b86e..3619520 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStore.java
@@ -17,47 +17,99 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
-import java.util.*;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+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.Objects;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
 import java.util.regex.Pattern;
-import javax.management.*;
-import javax.management.openmbean.*;
+import java.util.stream.Collectors;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+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 com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.*;
+import com.google.common.base.Function;
+import com.google.common.base.Joiner;
+import com.google.common.base.Predicate;
+import com.google.common.base.Predicates;
+import com.google.common.base.Strings;
 import com.google.common.base.Throwables;
-import com.google.common.collect.*;
-import com.google.common.util.concurrent.*;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.RateLimiter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.cache.*;
-import org.apache.cassandra.concurrent.*;
-import org.apache.cassandra.config.*;
+import org.apache.cassandra.cache.CounterCacheKey;
+import org.apache.cassandra.cache.IRowCacheEntry;
+import org.apache.cassandra.cache.RowCacheKey;
+import org.apache.cassandra.cache.RowCacheSentinel;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.FutureTask;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.commitlog.CommitLogPosition;
-import org.apache.cassandra.db.compaction.*;
+import org.apache.cassandra.db.compaction.AbstractCompactionStrategy;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.compaction.CompactionStrategyManager;
+import org.apache.cassandra.db.compaction.OperationType;
+import org.apache.cassandra.db.compaction.Verifier;
 import org.apache.cassandra.db.filter.ClusteringIndexFilter;
 import org.apache.cassandra.db.filter.DataLimits;
-import org.apache.cassandra.db.streaming.CassandraStreamManager;
-import org.apache.cassandra.db.repair.CassandraTableRepairManager;
-import org.apache.cassandra.db.view.TableViews;
-import org.apache.cassandra.db.lifecycle.*;
+import org.apache.cassandra.db.memtable.Flushing;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.memtable.ShardBoundaries;
+import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
+import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
+import org.apache.cassandra.db.lifecycle.SSTableSet;
+import org.apache.cassandra.db.lifecycle.Tracker;
+import org.apache.cassandra.db.lifecycle.View;
 import org.apache.cassandra.db.partitions.CachedPartition;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.repair.CassandraTableRepairManager;
 import org.apache.cassandra.db.rows.CellPath;
-import org.apache.cassandra.dht.*;
+import org.apache.cassandra.db.streaming.CassandraStreamManager;
+import org.apache.cassandra.db.view.TableViews;
+import org.apache.cassandra.dht.AbstractBounds;
+import org.apache.cassandra.dht.Bounds;
+import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Splitter;
+import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.StartupException;
 import org.apache.cassandra.index.SecondaryIndexManager;
@@ -67,36 +119,72 @@
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SSTable;
+import org.apache.cassandra.io.sstable.SSTableId;
+import org.apache.cassandra.io.sstable.SSTableIdFactory;
 import org.apache.cassandra.io.sstable.SSTableMultiWriter;
-import org.apache.cassandra.io.sstable.format.*;
+import org.apache.cassandra.io.sstable.format.SSTableFormat;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.metrics.Sampler;
 import org.apache.cassandra.metrics.Sampler.Sample;
 import org.apache.cassandra.metrics.Sampler.SamplerType;
 import org.apache.cassandra.metrics.TableMetrics;
+import org.apache.cassandra.metrics.TopPartitionTracker;
 import org.apache.cassandra.repair.TableRepairManager;
 import org.apache.cassandra.repair.consistent.admin.CleanupSummary;
 import org.apache.cassandra.repair.consistent.admin.PendingStat;
-import org.apache.cassandra.schema.*;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
+import org.apache.cassandra.schema.CompressionParams;
+import org.apache.cassandra.schema.IndexMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.schema.TableParams;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
+import org.apache.cassandra.service.paxos.TablePaxosRepairHistory;
+import org.apache.cassandra.service.snapshot.SnapshotManifest;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 import org.apache.cassandra.streaming.TableStreamManager;
-import org.apache.cassandra.utils.*;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.DefaultValue;
+import org.apache.cassandra.utils.ExecutorUtils;
+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.TimeUUID;
+import org.apache.cassandra.utils.WrappedRunnable;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.concurrent.Refs;
-import org.apache.cassandra.utils.memory.MemtableAllocator;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
+import static com.google.common.base.Throwables.propagate;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.config.DatabaseDescriptor.getFlushWriters;
+import static org.apache.cassandra.db.commitlog.CommitLogPosition.NONE;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.FBUtilities.now;
 import static org.apache.cassandra.utils.Throwables.maybeFail;
 import static org.apache.cassandra.utils.Throwables.merge;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
 
-public class ColumnFamilyStore implements ColumnFamilyStoreMBean
+public class ColumnFamilyStore implements ColumnFamilyStoreMBean, Memtable.Owner
 {
     private static final Logger logger = LoggerFactory.getLogger(ColumnFamilyStore.class);
 
@@ -108,31 +196,51 @@
     are finished. By having flushExecutor size the same size as each of the perDiskflushExecutors we make sure we can
     have that many flushes going at the same time.
     */
-    private static final ThreadPoolExecutor flushExecutor = new JMXEnabledThreadPoolExecutor(DatabaseDescriptor.getFlushWriters(),
-                                                                                             Stage.KEEP_ALIVE_SECONDS,
-                                                                                             TimeUnit.SECONDS,
-                                                                                             new LinkedBlockingQueue<>(),
-                                                                                             new NamedThreadFactory("MemtableFlushWriter"),
-                                                                                             "internal");
+    private static final ExecutorPlus flushExecutor = executorFactory()
+            .withJmxInternal()
+            .pooled("MemtableFlushWriter", getFlushWriters());
+
+    // post-flush executor is single threaded to provide guarantee that any flush Future on a CF will never return until prior flushes have completed
+    private static final ExecutorPlus postFlushExecutor = executorFactory()
+            .withJmxInternal()
+            .sequential("MemtablePostFlush");
+
+    private static final ExecutorPlus reclaimExecutor = executorFactory()
+            .withJmxInternal()
+            .sequential("MemtableReclaimMemory");
 
     private static final PerDiskFlushExecutors perDiskflushExecutors = new PerDiskFlushExecutors(DatabaseDescriptor.getFlushWriters(),
                                                                                                  DatabaseDescriptor.getNonLocalSystemKeyspacesDataFileLocations(),
                                                                                                  DatabaseDescriptor.useSpecificLocationForLocalSystemData());
 
-    // post-flush executor is single threaded to provide guarantee that any flush Future on a CF will never return until prior flushes have completed
-    private static final ThreadPoolExecutor postFlushExecutor = new JMXEnabledThreadPoolExecutor(1,
-                                                                                                 Stage.KEEP_ALIVE_SECONDS,
-                                                                                                 TimeUnit.SECONDS,
-                                                                                                 new LinkedBlockingQueue<>(),
-                                                                                                 new NamedThreadFactory("MemtablePostFlush"),
-                                                                                                 "internal");
-
-    private static final ThreadPoolExecutor reclaimExecutor = new JMXEnabledThreadPoolExecutor(1,
-                                                                                               Stage.KEEP_ALIVE_SECONDS,
-                                                                                               TimeUnit.SECONDS,
-                                                                                               new LinkedBlockingQueue<>(),
-                                                                                               new NamedThreadFactory("MemtableReclaimMemory"),
-                                                                                               "internal");
+    /**
+     * Reason for initiating a memtable flush.
+     */
+    public enum FlushReason
+    {
+        COMMITLOG_DIRTY,
+        MEMTABLE_LIMIT,
+        MEMTABLE_PERIOD_EXPIRED,
+        INDEX_BUILD_STARTED,
+        INDEX_BUILD_COMPLETED,
+        INDEX_REMOVED,
+        INDEX_TABLE_FLUSH,
+        VIEW_BUILD_STARTED,
+        INTERNALLY_FORCED,  // explicitly requested flush, necessary for the operation of an internal table
+        USER_FORCED, // flush explicitly requested by the user (e.g. nodetool flush)
+        STARTUP,
+        DRAIN,
+        SNAPSHOT,
+        TRUNCATE,
+        DROP,
+        STREAMING,
+        STREAMS_RECEIVED,
+        VALIDATION,
+        ANTICOMPACTION,
+        SCHEMA_CHANGE,
+        OWNED_RANGES_CHANGE,
+        UNIT_TESTS // explicitly requested flush needed for a test
+    }
 
     private static final String[] COUNTER_NAMES = new String[]{"table", "count", "error", "value"};
     private static final String[] COUNTER_DESCS = new String[]
@@ -146,6 +254,7 @@
 
     public static final String SNAPSHOT_TRUNCATE_PREFIX = "truncated";
     public static final String SNAPSHOT_DROP_PREFIX = "dropped";
+    static final String TOKEN_DELIMITER = ":";
 
     static
     {
@@ -167,6 +276,8 @@
     private final String oldMBeanName;
     private volatile boolean valid = true;
 
+    private volatile Memtable.Factory memtableFactory;
+
     /**
      * Memtables and SSTables on disk for this column family.
      *
@@ -181,7 +292,7 @@
     public final OpOrder readOrdering = new OpOrder();
 
     /* This is used to generate the next index for a SSTable */
-    private final AtomicInteger fileIndexGenerator = new AtomicInteger(0);
+    private final Supplier<? extends SSTableId> sstableIdGenerator;
 
     public final SecondaryIndexManager indexManager;
     public final TableViews viewManager;
@@ -196,13 +307,14 @@
     private final Directories directories;
 
     public final TableMetrics metric;
-    public volatile long sampleReadLatencyNanos;
-    public volatile long additionalWriteLatencyNanos;
+    public volatile long sampleReadLatencyMicros;
+    public volatile long additionalWriteLatencyMicros;
 
     private final CassandraTableWriteHandler writeHandler;
     private final CassandraStreamManager streamManager;
 
     private final TableRepairManager repairManager;
+    public final TopPartitionTracker topPartitions;
 
     private final SSTableImporter sstableImporter;
 
@@ -210,9 +322,33 @@
 
     @VisibleForTesting
     final DiskBoundaryManager diskBoundaryManager = new DiskBoundaryManager();
+    private volatile ShardBoundaries cachedShardBoundaries = null;
 
     private volatile boolean neverPurgeTombstones = false;
 
+    private class PaxosRepairHistoryLoader
+    {
+        private TablePaxosRepairHistory history;
+
+        TablePaxosRepairHistory get()
+        {
+            if (history != null)
+                return history;
+
+            synchronized (this)
+            {
+                if (history != null)
+                    return history;
+
+                history = TablePaxosRepairHistory.load(keyspace.getName(), name);
+                return history;
+            }
+        }
+
+    }
+
+    private final PaxosRepairHistoryLoader paxosRepairHistory = new PaxosRepairHistoryLoader();
+
     public static void shutdownPostFlushExecutor() throws InterruptedException
     {
         postFlushExecutor.shutdown();
@@ -244,48 +380,10 @@
 
         compactionStrategyManager.maybeReload(metadata());
 
-        scheduleFlush();
-
         indexManager.reload();
 
-        // If the CF comparator has changed, we need to change the memtable,
-        // because the old one still aliases the previous comparator.
-        if (data.getView().getCurrentMemtable().initialComparator != metadata().comparator)
-            switchMemtable();
-    }
-
-    void scheduleFlush()
-    {
-        int period = metadata().params.memtableFlushPeriodInMs;
-        if (period > 0)
-        {
-            logger.trace("scheduling flush in {} ms", period);
-            WrappedRunnable runnable = new WrappedRunnable()
-            {
-                protected void runMayThrow()
-                {
-                    synchronized (data)
-                    {
-                        Memtable current = data.getView().getCurrentMemtable();
-                        // if we're not expired, we've been hit by a scheduled flush for an already flushed memtable, so ignore
-                        if (current.isExpired())
-                        {
-                            if (current.isClean())
-                            {
-                                // if we're still clean, instead of swapping just reschedule a flush for later
-                                scheduleFlush();
-                            }
-                            else
-                            {
-                                // we'll be rescheduled by the constructor of the Memtable.
-                                forceFlush();
-                            }
-                        }
-                    }
-                }
-            };
-            ScheduledExecutors.scheduledTasks.schedule(runnable, period, TimeUnit.MILLISECONDS);
-        }
+        memtableFactory = metadata().params.memtable.factory();
+        switchMemtableOrNotify(FlushReason.SCHEMA_CHANGE, Memtable::metadataUpdated);
     }
 
     public static Runnable getBackgroundCompactionTaskSubmitter()
@@ -360,7 +458,7 @@
     @VisibleForTesting
     public ColumnFamilyStore(Keyspace keyspace,
                              String columnFamilyName,
-                             int generation,
+                             Supplier<? extends SSTableId> sstableIdGenerator,
                              TableMetadataRef metadata,
                              Directories directories,
                              boolean loadSSTables,
@@ -378,17 +476,22 @@
         maxCompactionThreshold = new DefaultValue<>(metadata.get().params.compaction.maxCompactionThreshold());
         crcCheckChance = new DefaultValue<>(metadata.get().params.crcCheckChance);
         viewManager = keyspace.viewManager.forTable(metadata.id);
-        fileIndexGenerator.set(generation);
-        sampleReadLatencyNanos = DatabaseDescriptor.getReadRpcTimeout(NANOSECONDS) / 2;
-        additionalWriteLatencyNanos = DatabaseDescriptor.getWriteRpcTimeout(NANOSECONDS) / 2;
+        this.sstableIdGenerator = sstableIdGenerator;
+        sampleReadLatencyMicros = DatabaseDescriptor.getReadRpcTimeout(TimeUnit.MICROSECONDS) / 2;
+        additionalWriteLatencyMicros = DatabaseDescriptor.getWriteRpcTimeout(TimeUnit.MICROSECONDS) / 2;
+        memtableFactory = metadata.get().params.memtable.factory();
 
         logger.info("Initializing {}.{}", keyspace.getName(), name);
 
-        // Create Memtable only on online
+        // Create Memtable and its metrics object only on online
         Memtable initialMemtable = null;
+        TableMetrics.ReleasableMetric memtableMetrics = null;
         if (DatabaseDescriptor.isDaemonInitialized())
-            initialMemtable = new Memtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition()), this);
-        data = new Tracker(initialMemtable, loadSSTables);
+        {
+            initialMemtable = createMemtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition()));
+            memtableMetrics = memtableFactory.createMemtableMetrics(metadata);
+        }
+        data = new Tracker(this, initialMemtable, loadSSTables);
 
         // Note that this needs to happen before we load the first sstables, or the global sstable tracker will not
         // be notified on the initial loading.
@@ -419,7 +522,7 @@
             indexManager.addIndex(info, true);
         }
 
-        metric = new TableMetrics(this);
+        metric = new TableMetrics(this, memtableMetrics);
 
         if (data.loadsstables)
         {
@@ -445,6 +548,11 @@
         streamManager = new CassandraStreamManager(this);
         repairManager = new CassandraTableRepairManager(this);
         sstableImporter = new SSTableImporter(this);
+
+        if (SchemaConstants.isSystemKeyspace(keyspace.getName()))
+            topPartitions = null;
+        else
+            topPartitions = new TopPartitionTracker(metadata());
     }
 
     public static String getTableMBeanName(String ks, String name, boolean isIndex)
@@ -465,8 +573,8 @@
     {
         try
         {
-            sampleReadLatencyNanos = metadata().params.speculativeRetry.calculateThreshold(metric.coordinatorReadLatency.getSnapshot(), sampleReadLatencyNanos);
-            additionalWriteLatencyNanos = metadata().params.additionalWritePolicy.calculateThreshold(metric.coordinatorWriteLatency.getSnapshot(), additionalWriteLatencyNanos);
+            sampleReadLatencyMicros = metadata().params.speculativeRetry.calculateThreshold(metric.coordinatorReadLatency, sampleReadLatencyMicros);
+            additionalWriteLatencyMicros = metadata().params.additionalWritePolicy.calculateThreshold(metric.coordinatorWriteLatency, additionalWriteLatencyMicros);
         }
         catch (Throwable e)
         {
@@ -504,19 +612,39 @@
         List<String> dataPaths = new ArrayList<>();
         for (File dataPath : directories.getCFDirectories())
         {
-            dataPaths.add(dataPath.getCanonicalPath());
+            dataPaths.add(dataPath.canonicalPath());
         }
 
         return dataPaths;
     }
 
-    public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor, long keyCount, long repairedAt, UUID pendingRepair, boolean isTransient, int sstableLevel, SerializationHeader header, LifecycleNewTracker lifecycleNewTracker)
+    public boolean writesShouldSkipCommitLog()
+    {
+        return memtableFactory.writesShouldSkipCommitLog();
+    }
+
+    public boolean memtableWritesAreDurable()
+    {
+        return memtableFactory.writesAreDurable();
+    }
+
+    public boolean streamToMemtable()
+    {
+        return memtableFactory.streamToMemtable();
+    }
+
+    public boolean streamFromMemtable()
+    {
+        return memtableFactory.streamFromMemtable();
+    }
+
+    public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor, long keyCount, long repairedAt, TimeUUID pendingRepair, boolean isTransient, int sstableLevel, SerializationHeader header, LifecycleNewTracker lifecycleNewTracker)
     {
         MetadataCollector collector = new MetadataCollector(metadata().comparator).sstableLevel(sstableLevel);
         return createSSTableMultiWriter(descriptor, keyCount, repairedAt, pendingRepair, isTransient, collector, header, lifecycleNewTracker);
     }
 
-    public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor, long keyCount, long repairedAt, UUID pendingRepair, boolean isTransient, MetadataCollector metadataCollector, SerializationHeader header, LifecycleNewTracker lifecycleNewTracker)
+    public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor, long keyCount, long repairedAt, TimeUUID pendingRepair, boolean isTransient, MetadataCollector metadataCollector, SerializationHeader header, LifecycleNewTracker lifecycleNewTracker)
     {
         return getCompactionStrategyManager().createSSTableMultiWriter(descriptor, keyCount, repairedAt, pendingRepair, isTransient, metadataCollector, header, indexManager.listIndexes(), lifecycleNewTracker);
     }
@@ -529,11 +657,16 @@
     /** call when dropping or renaming a CF. Performs mbean housekeeping and invalidates CFS to other operations */
     public void invalidate()
     {
-        invalidate(true);
+        invalidate(true, true);
     }
 
     public void invalidate(boolean expectMBean)
     {
+        invalidate(expectMBean, true);
+    }
+
+    public void invalidate(boolean expectMBean, boolean dropData)
+    {
         // disable and cancel in-progress compactions before invalidating
         valid = false;
 
@@ -557,11 +690,16 @@
         if (!metadata.get().isIndex())
             SystemKeyspace.removeTruncationRecord(metadata.id);
 
-        data.dropSSTables();
-        LifecycleTransaction.waitForDeletions();
-        indexManager.dropAllIndexes();
+        if (dropData)
+        {
+            data.dropSSTables();
+            LifecycleTransaction.waitForDeletions();
+        }
+        indexManager.dropAllIndexes(dropData);
 
         invalidateCaches();
+        if (topPartitions != null)
+            topPartitions.close();
     }
 
     /**
@@ -592,7 +730,7 @@
         return createColumnFamilyStore(keyspace, metadata.name, metadata, loadSSTables);
     }
 
-    public static synchronized ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace,
+    public static ColumnFamilyStore createColumnFamilyStore(Keyspace keyspace,
                                                                          String columnFamily,
                                                                          TableMetadataRef metadata,
                                                                          boolean loadSSTables)
@@ -610,21 +748,9 @@
                                                                          boolean registerBookkeeping,
                                                                          boolean offline)
     {
-        // get the max generation number, to prevent generation conflicts
-        Directories.SSTableLister lister = directories.sstableLister(Directories.OnTxnErr.IGNORE).includeBackups(true);
-        List<Integer> generations = new ArrayList<>();
-        for (Map.Entry<Descriptor, Set<Component>> entry : lister.list().entrySet())
-        {
-            Descriptor desc = entry.getKey();
-            generations.add(desc.generation);
-            if (!desc.isCompatible())
-                throw new RuntimeException(String.format("Incompatible SSTable found. Current version %s is unable to read file: %s. Please run upgradesstables.",
-                                                         desc.getFormat().getLatestVersion(), desc));
-        }
-        Collections.sort(generations);
-        int value = (generations.size() > 0) ? (generations.get(generations.size() - 1)) : 0;
-
-        return new ColumnFamilyStore(keyspace, columnFamily, value, metadata, directories, loadSSTables, registerBookkeeping, offline);
+        return new ColumnFamilyStore(keyspace, columnFamily,
+                                     directories.getUIDGenerator(SSTableIdFactory.instance.defaultBuilder()),
+                                     metadata, directories, loadSSTables, registerBookkeeping, offline);
     }
 
     /**
@@ -662,7 +788,7 @@
                 for (File tmpFile : desc.getTemporaryFiles())
                 {
                     logger.info("Removing unfinished temporary file {}", tmpFile);
-                    tmpFile.delete();
+                    tmpFile.tryDelete();
                 }
             }
 
@@ -688,10 +814,10 @@
         if (dir.exists())
         {
             assert dir.isDirectory();
-            for (File file : Objects.requireNonNull(dir.listFiles()))
-                if (tmpCacheFilePattern.matcher(file.getName()).matches())
-                    if (!file.delete())
-                        logger.warn("could not delete {}", file.getAbsolutePath());
+            for (File file : dir.tryList())
+                if (tmpCacheFilePattern.matcher(file.name()).matches())
+                    if (!file.tryDelete())
+                        logger.warn("could not delete {}", file.absolutePath());
         }
 
         // also clean out any index leftovers.
@@ -757,10 +883,10 @@
                                            descriptor.cfname,
                                            // Increment the generation until we find a filename that doesn't exist. This is needed because the new
                                            // SSTables that are being loaded might already use these generation numbers.
-                                           fileIndexGenerator.incrementAndGet(),
+                                           sstableIdGenerator.get(),
                                            descriptor.formatType);
         }
-        while (new File(newDescriptor.filenameFor(Component.DATA)).exists());
+        while (newDescriptor.fileFor(Component.DATA).exists());
         return newDescriptor;
     }
 
@@ -814,12 +940,27 @@
 
     public Descriptor newSSTableDescriptor(File directory, Version version, SSTableFormat.Type format)
     {
-        return new Descriptor(version,
-                              directory,
-                              keyspace.getName(),
-                              name,
-                              fileIndexGenerator.incrementAndGet(),
-                              format);
+        Descriptor newDescriptor = new Descriptor(version,
+                                                  directory,
+                                                  keyspace.getName(),
+                                                  name,
+                                                  sstableIdGenerator.get(),
+                                                  format);
+        assert !newDescriptor.fileFor(Component.DATA).exists();
+        return newDescriptor;
+    }
+
+    /**
+     * Checks with the memtable if it should be switched for the given reason, and if not, calls the specified
+     * notification method.
+     */
+    private void switchMemtableOrNotify(FlushReason reason, Consumer<Memtable> elseNotify)
+    {
+        Memtable currentMemtable = data.getView().getCurrentMemtable();
+        if (currentMemtable.shouldSwitch(reason))
+            switchMemtableIfCurrent(currentMemtable, reason);
+        else
+            elseNotify.accept(currentMemtable);
     }
 
     /**
@@ -827,12 +968,12 @@
      *
      * @param memtable
      */
-    public ListenableFuture<CommitLogPosition> switchMemtableIfCurrent(Memtable memtable)
+    public Future<CommitLogPosition> switchMemtableIfCurrent(Memtable memtable, FlushReason reason)
     {
         synchronized (data)
         {
             if (data.getView().getCurrentMemtable() == memtable)
-                return switchMemtable();
+                return switchMemtable(reason);
         }
         logger.debug("Memtable is no longer current, returning future that completes when current flushing operation completes");
         return waitForFlushes();
@@ -845,11 +986,12 @@
      * not complete until the Memtable (and all prior Memtables) have been successfully flushed, and the CL
      * marked clean up to the position owned by the Memtable.
      */
-    public ListenableFuture<CommitLogPosition> switchMemtable()
+    @VisibleForTesting
+    public Future<CommitLogPosition> switchMemtable(FlushReason reason)
     {
         synchronized (data)
         {
-            logFlush();
+            logFlush(reason);
             Flush flush = new Flush(false);
             flushExecutor.execute(flush);
             postFlushExecutor.execute(flush.postFlushTask);
@@ -858,33 +1000,16 @@
     }
 
     // print out size of all memtables we're enqueuing
-    private void logFlush()
+    private void logFlush(FlushReason reason)
     {
         // reclaiming includes that which we are GC-ing;
-        float onHeapRatio = 0, offHeapRatio = 0;
-        long onHeapTotal = 0, offHeapTotal = 0;
-        Memtable memtable = getTracker().getView().getCurrentMemtable();
-        onHeapRatio +=  memtable.getAllocator().onHeap().ownershipRatio();
-        offHeapRatio += memtable.getAllocator().offHeap().ownershipRatio();
-        onHeapTotal += memtable.getAllocator().onHeap().owns();
-        offHeapTotal += memtable.getAllocator().offHeap().owns();
+        Memtable.MemoryUsage usage = Memtable.newMemoryUsage();
+        getTracker().getView().getCurrentMemtable().addMemoryUsageTo(usage);
 
         for (ColumnFamilyStore indexCfs : indexManager.getAllIndexColumnFamilyStores())
-        {
-            MemtableAllocator allocator = indexCfs.getTracker().getView().getCurrentMemtable().getAllocator();
-            onHeapRatio += allocator.onHeap().ownershipRatio();
-            offHeapRatio += allocator.offHeap().ownershipRatio();
-            onHeapTotal += allocator.onHeap().owns();
-            offHeapTotal += allocator.offHeap().owns();
-        }
+            indexCfs.getTracker().getView().getCurrentMemtable().addMemoryUsageTo(usage);
 
-        logger.info("Enqueuing flush of {}: {}",
-                     name,
-                     String.format("%s (%.0f%%) on-heap, %s (%.0f%%) off-heap",
-                                   FBUtilities.prettyPrintMemory(onHeapTotal),
-                                   onHeapRatio * 100,
-                                   FBUtilities.prettyPrintMemory(offHeapTotal),
-                                   offHeapRatio * 100));
+        logger.info("Enqueuing flush of {}.{}, Reason: {}, Usage: {}", keyspace.getName(), name, reason, usage);
     }
 
 
@@ -894,14 +1019,14 @@
      * @return a Future yielding the commit log position that can be guaranteed to have been successfully written
      *         to sstables for this table once the future completes
      */
-    public ListenableFuture<CommitLogPosition> forceFlush()
+    public Future<CommitLogPosition> forceFlush(FlushReason reason)
     {
         synchronized (data)
         {
             Memtable current = data.getView().getCurrentMemtable();
             for (ColumnFamilyStore cfs : concatWithIndexes())
                 if (!cfs.data.getView().getCurrentMemtable().isClean())
-                    return switchMemtableIfCurrent(current);
+                    return flushMemtable(current, reason);
             return waitForFlushes();
         }
     }
@@ -913,36 +1038,39 @@
      * @return a Future yielding the commit log position that can be guaranteed to have been successfully written
      *         to sstables for this table once the future completes
      */
-    public ListenableFuture<?> forceFlush(CommitLogPosition flushIfDirtyBefore)
+    public Future<?> forceFlush(CommitLogPosition flushIfDirtyBefore)
     {
         // we don't loop through the remaining memtables since here we only care about commit log dirtiness
         // and this does not vary between a table and its table-backed indexes
         Memtable current = data.getView().getCurrentMemtable();
         if (current.mayContainDataBefore(flushIfDirtyBefore))
-            return switchMemtableIfCurrent(current);
+            return flushMemtable(current, FlushReason.COMMITLOG_DIRTY);
         return waitForFlushes();
     }
 
+    private Future<CommitLogPosition> flushMemtable(Memtable current, FlushReason reason)
+    {
+        if (current.shouldSwitch(reason))
+            return switchMemtableIfCurrent(current, reason);
+        else
+            return waitForFlushes();
+    }
+
     /**
      * @return a Future yielding the commit log position that can be guaranteed to have been successfully written
      *         to sstables for this table once the future completes
      */
-    private ListenableFuture<CommitLogPosition> waitForFlushes()
+    private Future<CommitLogPosition> waitForFlushes()
     {
         // we grab the current memtable; once any preceding memtables have flushed, we know its
         // commitLogLowerBound has been set (as this it is set with the upper bound of the preceding memtable)
         final Memtable current = data.getView().getCurrentMemtable();
-        ListenableFutureTask<CommitLogPosition> task = ListenableFutureTask.create(() -> {
-            logger.debug("forceFlush requested but everything is clean in {}", name);
-            return current.getCommitLogLowerBound();
-        });
-        postFlushExecutor.execute(task);
-        return task;
+        return postFlushExecutor.submit(current::getCommitLogLowerBound);
     }
 
-    public CommitLogPosition forceBlockingFlush()
+    public CommitLogPosition forceBlockingFlush(FlushReason reason)
     {
-        return FBUtilities.waitOnFuture(forceFlush());
+        return FBUtilities.waitOnFuture(forceFlush(reason));
     }
 
     /**
@@ -951,13 +1079,13 @@
      */
     private final class PostFlush implements Callable<CommitLogPosition>
     {
-        final CountDownLatch latch = new CountDownLatch(1);
-        final List<Memtable> memtables;
+        final CountDownLatch latch = newCountDownLatch(1);
+        final Memtable mainMemtable;
         volatile Throwable flushFailure = null;
 
-        private PostFlush(List<Memtable> memtables)
+        private PostFlush(Memtable mainMemtable)
         {
-            this.memtables = memtables;
+            this.mainMemtable = mainMemtable;
         }
 
         public CommitLogPosition call()
@@ -970,22 +1098,21 @@
             }
             catch (InterruptedException e)
             {
-                throw new IllegalStateException();
+                throw new UncheckedInterruptedException(e);
             }
 
-            CommitLogPosition commitLogUpperBound = CommitLogPosition.NONE;
+            CommitLogPosition commitLogUpperBound = NONE;
             // If a flush errored out but the error was ignored, make sure we don't discard the commit log.
-            if (flushFailure == null && !memtables.isEmpty())
+            if (flushFailure == null && mainMemtable != null)
             {
-                Memtable memtable = memtables.get(0);
-                commitLogUpperBound = memtable.getCommitLogUpperBound();
-                CommitLog.instance.discardCompletedSegments(metadata.id, memtable.getCommitLogLowerBound(), commitLogUpperBound);
+                commitLogUpperBound = mainMemtable.getFinalCommitLogUpperBound();
+                CommitLog.instance.discardCompletedSegments(metadata.id, mainMemtable.getCommitLogLowerBound(), commitLogUpperBound);
             }
 
             metric.pendingFlushes.dec();
 
             if (flushFailure != null)
-                throw Throwables.propagate(flushFailure);
+                throw propagate(flushFailure);
 
             return commitLogUpperBound;
         }
@@ -1002,8 +1129,8 @@
     private final class Flush implements Runnable
     {
         final OpOrder.Barrier writeBarrier;
-        final List<Memtable> memtables = new ArrayList<>();
-        final ListenableFutureTask<CommitLogPosition> postFlushTask;
+        final Map<ColumnFamilyStore, Memtable> memtables;
+        final FutureTask<CommitLogPosition> postFlushTask;
         final PostFlush postFlush;
         final boolean truncate;
 
@@ -1026,6 +1153,8 @@
              */
             writeBarrier = Keyspace.writeOrder.newBarrier();
 
+            memtables = new LinkedHashMap<>();
+
             // submit flushes for the memtable for any indexed sub-cfses, and our own
             AtomicReference<CommitLogPosition> commitLogUpperBound = new AtomicReference<>();
             for (ColumnFamilyStore cfs : concatWithIndexes())
@@ -1033,10 +1162,10 @@
                 // switch all memtables, regardless of their dirty status, setting the barrier
                 // so that we can reach a coordinated decision about cleanliness once they
                 // are no longer possible to be modified
-                Memtable newMemtable = new Memtable(commitLogUpperBound, cfs);
+                Memtable newMemtable = cfs.createMemtable(commitLogUpperBound);
                 Memtable oldMemtable = cfs.data.switchMemtable(truncate, newMemtable);
-                oldMemtable.setDiscarding(writeBarrier, commitLogUpperBound);
-                memtables.add(oldMemtable);
+                oldMemtable.switchOut(writeBarrier, commitLogUpperBound);
+                memtables.put(cfs, oldMemtable);
             }
 
             // we then ensure an atomic decision is made about the upper bound of the continuous range of commit log
@@ -1047,8 +1176,8 @@
             // since this happens after wiring up the commitLogUpperBound, we also know all operations with earlier
             // commit log segment position have also completed, i.e. the memtables are done and ready to flush
             writeBarrier.issue();
-            postFlush = new PostFlush(memtables);
-            postFlushTask = ListenableFutureTask.create(postFlush);
+            postFlush = new PostFlush(Iterables.get(memtables.values(), 0, null));
+            postFlushTask = new FutureTask<>(postFlush);
         }
 
         public void run()
@@ -1056,7 +1185,7 @@
             if (logger.isTraceEnabled())
                 logger.trace("Flush task {}@{} starts executing, waiting on barrier", hashCode(), name);
 
-            long start = System.nanoTime();
+            long start = nanoTime();
 
             // mark writes older than the barrier as blocking progress, permitting them to exceed our memory limit
             // if they are stuck waiting on it, then wait for them all to complete
@@ -1064,20 +1193,23 @@
             writeBarrier.await();
 
             if (logger.isTraceEnabled())
-                logger.trace("Flush task for task {}@{} waited {} ms at the barrier", hashCode(), name, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
+                logger.trace("Flush task for task {}@{} waited {} ms at the barrier", hashCode(), name, TimeUnit.NANOSECONDS.toMillis(nanoTime() - start));
 
             // mark all memtables as flushing, removing them from the live memtable list
-            for (Memtable memtable : memtables)
-                memtable.cfs.data.markFlushing(memtable);
+            for (Map.Entry<ColumnFamilyStore, Memtable> entry : memtables.entrySet())
+                entry.getKey().data.markFlushing(entry.getValue());
 
             metric.memtableSwitchCount.inc();
 
             try
             {
+                boolean first = true;
                 // Flush "data" memtable with non-cf 2i first;
-                flushMemtable(memtables.get(0), true);
-                for (int i = 1; i < memtables.size(); i++)
-                    flushMemtable(memtables.get(i), false);
+                for (Map.Entry<ColumnFamilyStore, Memtable> entry : memtables.entrySet())
+                {
+                    flushMemtable(entry.getKey(), entry.getValue(), first);
+                    first = false;
+                }
             }
             catch (Throwable t)
             {
@@ -1089,20 +1221,20 @@
                 logger.trace("Flush task {}@{} signaling post flush task", hashCode(), name);
 
             // signal the post-flush we've done our work
-            postFlush.latch.countDown();
+            postFlush.latch.decrement();
 
             if (logger.isTraceEnabled())
                 logger.trace("Flush task task {}@{} finished", hashCode(), name);
         }
 
-        public Collection<SSTableReader> flushMemtable(Memtable memtable, boolean flushNonCf2i)
+        public Collection<SSTableReader> flushMemtable(ColumnFamilyStore cfs, Memtable memtable, boolean flushNonCf2i)
         {
             if (logger.isTraceEnabled())
                 logger.trace("Flush task task {}@{} flushing memtable {}", hashCode(), name, memtable);
 
             if (memtable.isClean() || truncate)
             {
-                memtable.cfs.replaceFlushed(memtable, Collections.emptyList());
+                cfs.replaceFlushed(memtable, Collections.emptyList());
                 reclaim(memtable);
                 return Collections.emptyList();
             }
@@ -1114,14 +1246,14 @@
             List<SSTableReader> sstables = new ArrayList<>();
             try (LifecycleTransaction txn = LifecycleTransaction.offline(OperationType.FLUSH))
             {
-                List<Memtable.FlushRunnable> flushRunnables = null;
+                List<Flushing.FlushRunnable> flushRunnables = null;
                 List<SSTableMultiWriter> flushResults = null;
 
                 try
                 {
                     // flush the memtable
-                    flushRunnables = memtable.flushRunnables(txn);
-                    ExecutorService[] executors = perDiskflushExecutors.getExecutorsFor(keyspace.getName(), name);
+                    flushRunnables = Flushing.flushRunnables(cfs, memtable, txn);
+                    ExecutorPlus[] executors = perDiskflushExecutors.getExecutorsFor(keyspace.getName(), name);
 
                     for (int i = 0; i < flushRunnables.size(); i++)
                         futures.add(executors[i].submit(flushRunnables.get(i)));
@@ -1133,13 +1265,13 @@
                      * with CL as we do with memtables/CFS-backed SecondaryIndexes.
                      */
                     if (flushNonCf2i)
-                        indexManager.flushAllNonCFSBackedIndexesBlocking();
+                        indexManager.flushAllNonCFSBackedIndexesBlocking(memtable);
 
                     flushResults = Lists.newArrayList(FBUtilities.waitOnFutures(futures));
                 }
                 catch (Throwable t)
                 {
-                    t = memtable.abortRunnables(flushRunnables, t);
+                    t = Flushing.abortRunnables(flushRunnables, t);
                     t = txn.abort(t);
                     throw Throwables.propagate(t);
                 }
@@ -1194,9 +1326,9 @@
                     }
                 }
             }
-            memtable.cfs.replaceFlushed(memtable, sstables);
+            cfs.replaceFlushed(memtable, sstables);
             reclaim(memtable);
-            memtable.cfs.compactionStrategyManager.compactionLogger.flush(sstables);
+            cfs.compactionStrategyManager.compactionLogger.flush(sstables);
             logger.debug("Flushed to {} ({} sstables, {}), biggest {}, smallest {}",
                          sstables,
                          sstables.size(),
@@ -1216,10 +1348,21 @@
                 public void runMayThrow()
                 {
                     readBarrier.await();
-                    memtable.setDiscarded();
+                    memtable.discard();
                 }
             }, reclaimExecutor);
         }
+
+        @Override
+        public String toString()
+        {
+            return "Flush " + keyspace + '.' + name;
+        }
+    }
+
+    public Memtable createMemtable(AtomicReference<CommitLogPosition> commitLogUpperBound)
+    {
+        return memtableFactory.create(commitLogUpperBound, metadata, this);
     }
 
     // atomically set the upper bound for the commit log
@@ -1239,86 +1382,29 @@
         }
     }
 
-    /**
-     * Finds the largest memtable, as a percentage of *either* on- or off-heap memory limits, and immediately
-     * queues it for flushing. If the memtable selected is flushed before this completes, no work is done.
-     */
-    public static CompletableFuture<Boolean> flushLargestMemtable()
+    @Override
+    public Future<CommitLogPosition> signalFlushRequired(Memtable memtable, FlushReason reason)
     {
-        float largestRatio = 0f;
-        Memtable largest = null;
-        float liveOnHeap = 0, liveOffHeap = 0;
-        for (ColumnFamilyStore cfs : ColumnFamilyStore.all())
-        {
-            // we take a reference to the current main memtable for the CF prior to snapping its ownership ratios
-            // to ensure we have some ordering guarantee for performing the switchMemtableIf(), i.e. we will only
-            // swap if the memtables we are measuring here haven't already been swapped by the time we try to swap them
-            Memtable current = cfs.getTracker().getView().getCurrentMemtable();
-
-            // find the total ownership ratio for the memtable and all SecondaryIndexes owned by this CF,
-            // both on- and off-heap, and select the largest of the two ratios to weight this CF
-            float onHeap = 0f, offHeap = 0f;
-            onHeap += current.getAllocator().onHeap().ownershipRatio();
-            offHeap += current.getAllocator().offHeap().ownershipRatio();
-
-            for (ColumnFamilyStore indexCfs : cfs.indexManager.getAllIndexColumnFamilyStores())
-            {
-                MemtableAllocator allocator = indexCfs.getTracker().getView().getCurrentMemtable().getAllocator();
-                onHeap += allocator.onHeap().ownershipRatio();
-                offHeap += allocator.offHeap().ownershipRatio();
-            }
-
-            float ratio = Math.max(onHeap, offHeap);
-            if (ratio > largestRatio)
-            {
-                largest = current;
-                largestRatio = ratio;
-            }
-
-            liveOnHeap += onHeap;
-            liveOffHeap += offHeap;
-        }
-
-        CompletableFuture<Boolean> returnFuture = new CompletableFuture<>();
-
-        if (largest != null)
-        {
-            float usedOnHeap = Memtable.MEMORY_POOL.onHeap.usedRatio();
-            float usedOffHeap = Memtable.MEMORY_POOL.offHeap.usedRatio();
-            float flushingOnHeap = Memtable.MEMORY_POOL.onHeap.reclaimingRatio();
-            float flushingOffHeap = Memtable.MEMORY_POOL.offHeap.reclaimingRatio();
-            float thisOnHeap = largest.getAllocator().onHeap().ownershipRatio();
-            float thisOffHeap = largest.getAllocator().offHeap().ownershipRatio();
-            logger.debug("Flushing largest {} to free up room. Used total: {}, live: {}, flushing: {}, this: {}",
-                         largest.cfs, ratio(usedOnHeap, usedOffHeap), ratio(liveOnHeap, liveOffHeap),
-                         ratio(flushingOnHeap, flushingOffHeap), ratio(thisOnHeap, thisOffHeap));
-
-            ListenableFuture<CommitLogPosition> flushFuture = largest.cfs.switchMemtableIfCurrent(largest);
-            flushFuture.addListener(() -> {
-                try
-                {
-                    flushFuture.get();
-                    returnFuture.complete(true);
-                }
-                catch (Throwable t)
-                {
-                    returnFuture.completeExceptionally(t);
-                }
-            }, MoreExecutors.directExecutor());
-        }
-        else
-        {
-            logger.debug("Flushing of largest memtable, not done, no memtable found");
-
-            returnFuture.complete(false);
-        }
-
-        return returnFuture;
+        return switchMemtableIfCurrent(memtable, reason);
     }
 
-    private static String ratio(float onHeap, float offHeap)
+    @Override
+    public Memtable getCurrentMemtable()
     {
-        return String.format("%.2f/%.2f", onHeap, offHeap);
+        return data.getView().getCurrentMemtable();
+    }
+
+    public static Iterable<Memtable> activeMemtables()
+    {
+        return Iterables.transform(ColumnFamilyStore.all(),
+                                   cfs -> cfs.getTracker().getView().getCurrentMemtable());
+    }
+
+    @Override
+    public Iterable<Memtable> getIndexMemtables()
+    {
+        return Iterables.transform(indexManager.getAllIndexColumnFamilyStores(),
+                                   cfs -> cfs.getTracker().getView().getCurrentMemtable());
     }
 
     /**
@@ -1331,7 +1417,7 @@
     public void apply(PartitionUpdate update, UpdateTransaction indexer, OpOrder.Group opGroup, CommitLogPosition commitLogPosition)
 
     {
-        long start = System.nanoTime();
+        long start = nanoTime();
         try
         {
             Memtable mt = data.getMemtableFor(opGroup, commitLogPosition);
@@ -1342,7 +1428,7 @@
             if (metric.topWritePartitionSize.isEnabled()) // dont compute datasize if not needed
                 metric.topWritePartitionSize.addSample(key.getKey(), update.dataSize());
             StorageHook.instance.reportWrite(metadata.id, update);
-            metric.writeLatency.addNano(System.nanoTime() - start);
+            metric.writeLatency.addNano(nanoTime() - start);
             // CASSANDRA-11117 - certain resolution paths on memtable put can result in very
             // large time deltas, either through a variety of sentinel timestamps (used for empty values, ensuring
             // a minimal write, etc). This limits the time delta to the max value the histogram
@@ -1359,6 +1445,44 @@
         }
     }
 
+    @Override
+    public ShardBoundaries localRangeSplits(int shardCount)
+    {
+        if (shardCount == 1 || !getPartitioner().splitter().isPresent() || SchemaConstants.isLocalSystemKeyspace(keyspace.getName()))
+            return ShardBoundaries.NONE;
+
+        ShardBoundaries shardBoundaries = cachedShardBoundaries;
+        if (shardBoundaries == null ||
+            shardBoundaries.shardCount() != shardCount ||
+            shardBoundaries.ringVersion != StorageService.instance.getTokenMetadata().getRingVersion())
+        {
+            DiskBoundaryManager.VersionedRangesAtEndpoint versionedLocalRanges = DiskBoundaryManager.getVersionedLocalRanges(this);
+            Set<Range<Token>> localRanges = versionedLocalRanges.rangesAtEndpoint.ranges();
+            List<Splitter.WeightedRange> weightedRanges;
+            if (localRanges.isEmpty())
+                weightedRanges = ImmutableList.of(new Splitter.WeightedRange(1.0, new Range<>(getPartitioner().getMinimumToken(), getPartitioner().getMaximumToken())));
+            else
+            {
+                weightedRanges = new ArrayList<>(localRanges.size());
+                for (Range<Token> r : localRanges)
+                {
+                    // WeightedRange supports only unwrapped ranges as it relies
+                    // on right - left == num tokens equality
+                    for (Range<Token> u: r.unwrap())
+                        weightedRanges.add(new Splitter.WeightedRange(1.0, u));
+                }
+                weightedRanges.sort(Comparator.comparing(Splitter.WeightedRange::left));
+            }
+
+            List<Token> boundaries = getPartitioner().splitter().get().splitOwnedRanges(shardCount, weightedRanges, false);
+            shardBoundaries = new ShardBoundaries(boundaries.subList(0, boundaries.size() - 1),
+                                                  versionedLocalRanges.ringVersion);
+            cachedShardBoundaries = shardBoundaries;
+            logger.debug("Memtable shard boundaries for {}.{}: {}", keyspace.getName(), getTableName(), boundaries);
+        }
+        return shardBoundaries;
+    }
+
     /**
      * @param sstables
      * @return sstables whose key range overlaps with that of the given sstables, not including itself.
@@ -1525,7 +1649,11 @@
     {
         // skip snapshot creation during scrub, SEE JIRA 5891
         if(!disableSnapshot)
-            snapshotWithoutFlush("pre-scrub-" + System.currentTimeMillis());
+        {
+            Instant creationTime = now();
+            String snapshotName = "pre-scrub-" + creationTime.toEpochMilli();
+            snapshotWithoutMemtable(snapshotName, creationTime);
+        }
 
         try
         {
@@ -1569,9 +1697,20 @@
         return CompactionManager.instance.performVerify(ColumnFamilyStore.this, options);
     }
 
-    public CompactionManager.AllSSTableOpStatus sstablesRewrite(boolean excludeCurrentVersion, int jobs) throws ExecutionException, InterruptedException
+    /**
+     * Rewrites all SSTables according to specified parameters
+     *
+     * @param skipIfCurrentVersion - if {@link true}, will rewrite only SSTables that have version older than the current one ({@link BigFormat#latestVersion})
+     * @param skipIfNewerThanTimestamp - max timestamp (local creation time) for SSTable; SSTables created _after_ this timestamp will be excluded from compaction
+     * @param skipIfCompressionMatches - if {@link true}, will rewrite only SSTables whose compression parameters are different from {@link CFMetaData#compressionParams()}
+     * @param jobs number of jobs for parallel execution
+     */
+    public CompactionManager.AllSSTableOpStatus sstablesRewrite(final boolean skipIfCurrentVersion,
+                                                                final long skipIfNewerThanTimestamp,
+                                                                final boolean skipIfCompressionMatches,
+                                                                final int jobs) throws ExecutionException, InterruptedException
     {
-        return CompactionManager.instance.performSSTableRewrite(ColumnFamilyStore.this, excludeCurrentVersion, jobs);
+        return CompactionManager.instance.performSSTableRewrite(ColumnFamilyStore.this, skipIfCurrentVersion, skipIfNewerThanTimestamp, skipIfCompressionMatches, jobs);
     }
 
     public CompactionManager.AllSSTableOpStatus relocateSSTables(int jobs) throws ExecutionException, InterruptedException
@@ -1625,12 +1764,12 @@
         return data.getUncompacting();
     }
 
-    public Map<UUID, PendingStat> getPendingRepairStats()
+    public Map<TimeUUID, PendingStat> getPendingRepairStats()
     {
-        Map<UUID, PendingStat.Builder> builders = new HashMap<>();
+        Map<TimeUUID, PendingStat.Builder> builders = new HashMap<>();
         for (SSTableReader sstable : getLiveSSTables())
         {
-            UUID session = sstable.getPendingRepair();
+            TimeUUID session = sstable.getPendingRepair();
             if (session == null)
                 continue;
 
@@ -1640,8 +1779,8 @@
             builders.get(session).addSSTable(sstable);
         }
 
-        Map<UUID, PendingStat> stats = new HashMap<>();
-        for (Map.Entry<UUID, PendingStat.Builder> entry : builders.entrySet())
+        Map<TimeUUID, PendingStat> stats = new HashMap<>();
+        for (Map.Entry<TimeUUID, PendingStat.Builder> entry : builders.entrySet())
         {
             stats.put(entry.getKey(), entry.getValue().build());
         }
@@ -1654,12 +1793,12 @@
      *
      * @return session ids whose data could not be released
      */
-    public CleanupSummary releaseRepairData(Collection<UUID> sessions, boolean force)
+    public CleanupSummary releaseRepairData(Collection<TimeUUID> sessions, boolean force)
     {
         if (force)
         {
             Predicate<SSTableReader> predicate = sst -> {
-                UUID session = sst.getPendingRepair();
+                TimeUUID session = sst.getPendingRepair();
                 return session != null && sessions.contains(session);
             };
             return runWithCompactionsDisabled(() -> compactionStrategyManager.releaseRepairData(sessions),
@@ -1700,6 +1839,31 @@
                || filter.isFullyCoveredBy(cached);
     }
 
+    public PaxosRepairHistory getPaxosRepairHistory()
+    {
+        return paxosRepairHistory.get().getHistory();
+    }
+
+    public PaxosRepairHistory getPaxosRepairHistoryForRanges(Collection<Range<Token>> ranges)
+    {
+        return paxosRepairHistory.get().getHistoryForRanges(ranges);
+    }
+
+    public void syncPaxosRepairHistory(PaxosRepairHistory sync, boolean flush)
+    {
+        paxosRepairHistory.get().merge(sync, flush);
+    }
+
+    public void onPaxosRepairComplete(Collection<Range<Token>> ranges, Ballot highBallot)
+    {
+        paxosRepairHistory.get().add(ranges, highBallot, true);
+    }
+
+    public Ballot getPaxosRepairLowBound(DecoratedKey key)
+    {
+        return paxosRepairHistory.get().getBallotForToken(key.getToken());
+    }
+
     public int gcBefore(int nowInSec)
     {
         return nowInSec - metadata().params.gcGraceSeconds;
@@ -1717,9 +1881,9 @@
                 return new RefViewFragment(view.sstables, view.memtables, refs);
             if (failingSince <= 0)
             {
-                failingSince = System.nanoTime();
+                failingSince = nanoTime();
             }
-            else if (System.nanoTime() - failingSince > TimeUnit.MILLISECONDS.toNanos(100))
+            else if (nanoTime() - failingSince > TimeUnit.MILLISECONDS.toNanos(100))
             {
                 List<SSTableReader> released = new ArrayList<>();
                 for (SSTableReader reader : view.sstables)
@@ -1727,7 +1891,7 @@
                         released.add(reader);
                 NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.SECONDS,
                                  "Spinning trying to capture readers {}, released: {}, ", view.sstables, released);
-                failingSince = System.nanoTime();
+                failingSince = nanoTime();
             }
         }
     }
@@ -1827,21 +1991,30 @@
         return metadata().comparator;
     }
 
-    public void snapshotWithoutFlush(String snapshotName)
+    public TableSnapshot snapshotWithoutMemtable(String snapshotName)
     {
-        snapshotWithoutFlush(snapshotName, null, false, null);
+        return snapshotWithoutMemtable(snapshotName, now());
+    }
+
+    public TableSnapshot snapshotWithoutMemtable(String snapshotName, Instant creationTime)
+    {
+        return snapshotWithoutMemtable(snapshotName, null, false, null, null, creationTime);
     }
 
     /**
      * @param ephemeral If this flag is set to true, the snapshot will be cleaned during next startup
      */
-    public Set<SSTableReader> snapshotWithoutFlush(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, RateLimiter rateLimiter)
+    public TableSnapshot snapshotWithoutMemtable(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, DurationSpec.IntSecondsBound ttl, RateLimiter rateLimiter, Instant creationTime)
     {
+        if (ephemeral && ttl != null)
+        {
+            throw new IllegalStateException(String.format("can not take ephemeral snapshot (%s) while ttl is specified too", snapshotName));
+        }
+
         if (rateLimiter == null)
             rateLimiter = DatabaseDescriptor.getSnapshotRateLimiter();
 
-        Set<SSTableReader> snapshottedSSTables = new HashSet<>();
-        final JSONArray filesJSONArr = new JSONArray();
+        Set<SSTableReader> snapshottedSSTables = new LinkedHashSet<>();
         for (ColumnFamilyStore cfs : concatWithIndexes())
         {
             try (RefViewFragment currentView = cfs.selectAndReference(View.select(SSTableSet.CANONICAL, (x) -> predicate == null || predicate.apply(x))))
@@ -1849,8 +2022,7 @@
                 for (SSTableReader ssTable : currentView.sstables)
                 {
                     File snapshotDirectory = Directories.getSnapshotDirectory(ssTable.descriptor, snapshotName);
-                    ssTable.createLinks(snapshotDirectory.getPath(), rateLimiter); // hard links
-                    filesJSONArr.add(ssTable.descriptor.relativeFilenameFor(Component.DATA));
+                    ssTable.createLinks(snapshotDirectory.path(), rateLimiter); // hard links
 
                     if (logger.isTraceEnabled())
                         logger.trace("Snapshot for {} keyspace data file {} created in {}", keyspace, ssTable.getFilename(), snapshotDirectory);
@@ -1859,30 +2031,51 @@
             }
         }
 
-        writeSnapshotManifest(filesJSONArr, snapshotName);
-        if (!SchemaConstants.isLocalSystemKeyspace(metadata.keyspace) && !SchemaConstants.isReplicatedSystemKeyspace(metadata.keyspace))
-            writeSnapshotSchema(snapshotName);
-
-        if (ephemeral)
-            createEphemeralSnapshotMarkerFile(snapshotName);
-        return snapshottedSSTables;
+        return createSnapshot(snapshotName, ephemeral, ttl, snapshottedSSTables, creationTime);
     }
 
-    private void writeSnapshotManifest(final JSONArray filesJSONArr, final String snapshotName)
-    {
-        final File manifestFile = getDirectories().getSnapshotManifestFile(snapshotName);
+    protected TableSnapshot createSnapshot(String tag, boolean ephemeral, DurationSpec.IntSecondsBound ttl, Set<SSTableReader> sstables, Instant creationTime) {
+        Set<File> snapshotDirs = sstables.stream()
+                                         .map(s -> Directories.getSnapshotDirectory(s.descriptor, tag).toAbsolute())
+                                         .filter(dir -> !Directories.isSecondaryIndexFolder(dir)) // Remove secondary index subdirectory
+                                         .collect(Collectors.toCollection(HashSet::new));
 
+        // Create and write snapshot manifest
+        SnapshotManifest manifest = new SnapshotManifest(mapToDataFilenames(sstables), ttl, creationTime);
+        File manifestFile = getDirectories().getSnapshotManifestFile(tag);
+        writeSnapshotManifest(manifest, manifestFile);
+        snapshotDirs.add(manifestFile.parent().toAbsolute()); // manifest may create empty snapshot dir
+
+        // Write snapshot schema
+        if (!SchemaConstants.isLocalSystemKeyspace(metadata.keyspace) && !SchemaConstants.isReplicatedSystemKeyspace(metadata.keyspace))
+        {
+            File schemaFile = getDirectories().getSnapshotSchemaFile(tag);
+            writeSnapshotSchema(schemaFile);
+            snapshotDirs.add(schemaFile.parent().toAbsolute()); // schema may create empty snapshot dir
+        }
+
+        // Maybe create ephemeral marker
+        if (ephemeral)
+        {
+            File ephemeralSnapshotMarker = getDirectories().getNewEphemeralSnapshotMarkerFile(tag);
+            createEphemeralSnapshotMarkerFile(tag, ephemeralSnapshotMarker);
+            snapshotDirs.add(ephemeralSnapshotMarker.parent().toAbsolute()); // marker may create empty snapshot dir
+        }
+
+        TableSnapshot snapshot = new TableSnapshot(metadata.keyspace, metadata.name, metadata.id.asUUID(), tag,
+                                                   manifest.createdAt, manifest.expiresAt, snapshotDirs);
+
+        StorageService.instance.addSnapshot(snapshot);
+        return snapshot;
+    }
+
+    private SnapshotManifest writeSnapshotManifest(SnapshotManifest manifest, File manifestFile)
+    {
         try
         {
-            if (!manifestFile.getParentFile().exists())
-                manifestFile.getParentFile().mkdirs();
-
-            try (PrintStream out = new PrintStream(manifestFile))
-            {
-                final JSONObject manifestJSON = new JSONObject();
-                manifestJSON.put("files", filesJSONArr);
-                out.println(manifestJSON.toJSONString());
-            }
+            manifestFile.parent().tryCreateDirectories();
+            manifest.serializeToJsonFile(manifestFile);
+            return manifest;
         }
         catch (IOException e)
         {
@@ -1890,19 +2083,22 @@
         }
     }
 
-    private void writeSnapshotSchema(final String snapshotName)
+    private List<String> mapToDataFilenames(Collection<SSTableReader> sstables)
     {
-        final File schemaFile = getDirectories().getSnapshotSchemaFile(snapshotName);
+        return sstables.stream().map(s -> s.descriptor.relativeFilenameFor(Component.DATA)).collect(Collectors.toList());
+    }
 
+    private void writeSnapshotSchema(File schemaFile)
+    {
         try
         {
-            if (!schemaFile.getParentFile().exists())
-                schemaFile.getParentFile().mkdirs();
+            if (!schemaFile.parent().exists())
+                schemaFile.parent().tryCreateDirectories();
 
-            try (PrintStream out = new PrintStream(schemaFile))
+            try (PrintStream out = new PrintStream(new FileOutputStreamPlus(schemaFile)))
             {
                 SchemaCQLHelper.reCreateStatementsForSchemaCql(metadata(),
-                                                               keyspace.getMetadata().types)
+                                                               keyspace.getMetadata())
                                .forEach(out::println);
             }
         }
@@ -1912,25 +2108,23 @@
         }
     }
 
-    private void createEphemeralSnapshotMarkerFile(final String snapshot)
+    private void createEphemeralSnapshotMarkerFile(final String snapshot, File ephemeralSnapshotMarker)
     {
-        final File ephemeralSnapshotMarker = getDirectories().getNewEphemeralSnapshotMarkerFile(snapshot);
-
         try
         {
-            if (!ephemeralSnapshotMarker.getParentFile().exists())
-                ephemeralSnapshotMarker.getParentFile().mkdirs();
+            if (!ephemeralSnapshotMarker.parent().exists())
+                ephemeralSnapshotMarker.parent().tryCreateDirectories();
 
             Files.createFile(ephemeralSnapshotMarker.toPath());
             if (logger.isTraceEnabled())
-                logger.trace("Created ephemeral snapshot marker file on {}.", ephemeralSnapshotMarker.getAbsolutePath());
+                logger.trace("Created ephemeral snapshot marker file on {}.", ephemeralSnapshotMarker.absolutePath());
         }
         catch (IOException e)
         {
             logger.warn(String.format("Could not create marker file %s for ephemeral snapshot %s. " +
                                       "In case there is a failure in the operation that created " +
                                       "this snapshot, you may need to clean it manually afterwards.",
-                                      ephemeralSnapshotMarker.getAbsolutePath(), snapshot), e);
+                                      ephemeralSnapshotMarker.absolutePath(), snapshot), e);
         }
     }
 
@@ -1947,9 +2141,9 @@
 
     public Refs<SSTableReader> getSnapshotSSTableReaders(String tag) throws IOException
     {
-        Map<Integer, SSTableReader> active = new HashMap<>();
+        Map<SSTableId, SSTableReader> active = new HashMap<>();
         for (SSTableReader sstable : getSSTables(SSTableSet.CANONICAL))
-            active.put(sstable.descriptor.generation, sstable);
+            active.put(sstable.descriptor.id, sstable);
         Map<Descriptor, Set<Component>> snapshots = getDirectories().sstableLister(Directories.OnTxnErr.IGNORE).snapshots(tag).list();
         Refs<SSTableReader> refs = new Refs<>();
         try
@@ -1958,7 +2152,7 @@
             {
                 // Try acquire reference to an active sstable instead of snapshot if it exists,
                 // to avoid opening new sstables. If it fails, use the snapshot reference instead.
-                SSTableReader sstable = active.get(entries.getKey().generation);
+                SSTableReader sstable = active.get(entries.getKey().id);
                 if (sstable == null || !refs.tryRef(sstable))
                 {
                     if (logger.isTraceEnabled())
@@ -1990,45 +2184,61 @@
      *
      * @param snapshotName the name of the associated with the snapshot
      */
-    public Set<SSTableReader> snapshot(String snapshotName)
+    public TableSnapshot snapshot(String snapshotName)
     {
-        return snapshot(snapshotName, false, null);
+        return snapshot(snapshotName, null);
+    }
+
+    public TableSnapshot snapshot(String snapshotName, DurationSpec.IntSecondsBound ttl)
+    {
+        return snapshot(snapshotName, false, ttl, null, now());
     }
 
     /**
      * Take a snap shot of this columnfamily store.
      *
      * @param snapshotName the name of the associated with the snapshot
-     * @param skipFlush Skip blocking flush of memtable
+     * @param skipMemtable Skip flushing the memtable
+     * @param ttl duration after which the taken snapshot is removed automatically, if supplied with null, it will never be automatically removed
      * @param rateLimiter Rate limiter for hardlinks-per-second
+     * @param creationTime time when this snapshot was taken
      */
-    public Set<SSTableReader> snapshot(String snapshotName, boolean skipFlush, RateLimiter rateLimiter)
+    public TableSnapshot snapshot(String snapshotName, boolean skipMemtable, DurationSpec.IntSecondsBound ttl, RateLimiter rateLimiter, Instant creationTime)
     {
-        return snapshot(snapshotName, null, false, skipFlush, rateLimiter);
+        return snapshot(snapshotName, null, false, skipMemtable, ttl, rateLimiter, creationTime);
     }
 
 
     /**
      * @param ephemeral If this flag is set to true, the snapshot will be cleaned up during next startup
-     * @param skipFlush Skip blocking flush of memtable
+     * @param skipMemtable Skip flushing the memtable
      */
-    public Set<SSTableReader> snapshot(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, boolean skipFlush)
+    public TableSnapshot snapshot(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, boolean skipMemtable)
     {
-        return snapshot(snapshotName, predicate, ephemeral, skipFlush, null);
+        return snapshot(snapshotName, predicate, ephemeral, skipMemtable, null, null, now());
     }
 
     /**
      * @param ephemeral If this flag is set to true, the snapshot will be cleaned up during next startup
-     * @param skipFlush Skip blocking flush of memtable
+     * @param skipMemtable Skip flushing the memtable
+     * @param ttl duration after which the taken snapshot is removed automatically, if supplied with null, it will never be automatically removed
      * @param rateLimiter Rate limiter for hardlinks-per-second
+     * @param creationTime time when this snapshot was taken
      */
-    public Set<SSTableReader> snapshot(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, boolean skipFlush, RateLimiter rateLimiter)
+    public TableSnapshot snapshot(String snapshotName, Predicate<SSTableReader> predicate, boolean ephemeral, boolean skipMemtable, DurationSpec.IntSecondsBound ttl, RateLimiter rateLimiter, Instant creationTime)
     {
-        if (!skipFlush)
+        if (!skipMemtable)
         {
-            forceBlockingFlush();
+            Memtable current = getTracker().getView().getCurrentMemtable();
+            if (!current.isClean())
+            {
+                if (current.shouldSwitch(FlushReason.SNAPSHOT))
+                    FBUtilities.waitOnFuture(switchMemtableIfCurrent(current, FlushReason.SNAPSHOT));
+                else
+                    current.performSnapshot(snapshotName);
+            }
         }
-        return snapshotWithoutFlush(snapshotName, predicate, ephemeral, rateLimiter);
+        return snapshotWithoutMemtable(snapshotName, predicate, ephemeral, ttl, rateLimiter, creationTime);
     }
 
     public boolean snapshotExists(String snapshotName)
@@ -2036,10 +2246,6 @@
         return getDirectories().snapshotExists(snapshotName);
     }
 
-    public long getSnapshotCreationTime(String snapshotName)
-    {
-        return getDirectories().snapshotCreationTime(snapshotName);
-    }
 
     /**
      * Clear all the snapshots for a given column family.
@@ -2059,9 +2265,9 @@
      * @return  Return a map of all snapshots to space being used
      * The pair for a snapshot has true size and size on disk.
      */
-    public Map<String, Directories.SnapshotSizeDetails> getSnapshotDetails()
+    public Map<String, TableSnapshot> listSnapshots()
     {
-        return getDirectories().getSnapshotDetails();
+        return getDirectories().listSnapshots();
     }
 
     /**
@@ -2163,15 +2369,46 @@
     }
 
     public void forceMajorCompaction(boolean splitOutput)
-   {
+    {
         CompactionManager.instance.performMaximal(this, splitOutput);
     }
 
+    @Override
     public void forceCompactionForTokenRange(Collection<Range<Token>> tokenRanges) throws ExecutionException, InterruptedException
     {
         CompactionManager.instance.forceCompactionForTokenRange(this, tokenRanges);
     }
 
+    @Override
+    public void forceCompactionForTokenRanges(String... strings)
+    {
+        CompactionManager.instance.forceCompactionForTokenRange(this, toTokenRanges(DatabaseDescriptor.getPartitioner(), strings));
+    }
+
+    static Set<Range<Token>> toTokenRanges(IPartitioner partitioner, String... strings)
+    {
+        Token.TokenFactory tokenFactory = partitioner.getTokenFactory();
+        Set<Range<Token>> tokenRanges = new HashSet<>();
+        for (String str : strings)
+        {
+            String[] splits = str.split(TOKEN_DELIMITER);
+            assert splits.length == 2 : String.format("Unable to parse token range %s; needs to have two tokens separated by %s", str, TOKEN_DELIMITER);
+            String lhsStr = splits[0];
+            assert !Strings.isNullOrEmpty(lhsStr) : String.format("Unable to parse token range %s; left hand side of the token separater is empty", str);
+            String rhsStr = splits[1];
+            assert !Strings.isNullOrEmpty(rhsStr) : String.format("Unable to parse token range %s; right hand side of the token separater is empty", str);
+            Token lhs = tokenFactory.fromString(lhsStr);
+            Token rhs = tokenFactory.fromString(rhsStr);
+            tokenRanges.add(new Range<>(lhs, rhs));
+        }
+        return tokenRanges;
+    }
+
+    public void forceCompactionForKey(DecoratedKey key)
+    {
+        CompactionManager.instance.forceCompactionForKey(this, key);
+    }
+
     public static Iterable<ColumnFamilyStore> all()
     {
         List<Iterable<ColumnFamilyStore>> stores = new ArrayList<>(Schema.instance.getKeyspaces().size());
@@ -2207,6 +2444,108 @@
         }
     }
 
+    public void writeAndAddMemtableRanges(TimeUUID repairSessionID,
+                                          Supplier<Collection<Range<PartitionPosition>>> rangesSupplier,
+                                          Refs<SSTableReader> placeIntoRefs)
+    {
+        @SuppressWarnings("resource") // closed by finish or on exception
+        SSTableMultiWriter memtableContent = writeMemtableRanges(rangesSupplier, repairSessionID);
+        if (memtableContent != null)
+        {
+            try
+            {
+                Collection<SSTableReader> sstables = memtableContent.finish(true);
+                try (Refs sstableReferences = Refs.ref(sstables))
+                {
+                    // This moves all references to placeIntoRefs, clearing sstableReferences
+                    placeIntoRefs.addAll(sstableReferences);
+                }
+
+                // Release the reference any written sstables start with.
+                for (SSTableReader rdr : sstables)
+                {
+                    rdr.selfRef().release();
+                    logger.info("Memtable ranges (keys {} size {}) written in {}",
+                                rdr.estimatedKeys(),
+                                rdr.getDataChannel().size(),
+                                rdr);
+                }
+            }
+            catch (Throwable t)
+            {
+                memtableContent.close();
+                Throwables.propagate(t);
+            }
+        }
+    }
+
+    private SSTableMultiWriter writeMemtableRanges(Supplier<Collection<Range<PartitionPosition>>> rangesSupplier,
+                                                   TimeUUID repairSessionID)
+    {
+        if (!streamFromMemtable())
+            return null;
+
+        Collection<Range<PartitionPosition>> ranges = rangesSupplier.get();
+        Memtable current = getTracker().getView().getCurrentMemtable();
+        if (current.isClean())
+            return null;
+
+        List<Memtable.FlushablePartitionSet<?>> dataSets = new ArrayList<>(ranges.size());
+        long keys = 0;
+        for (Range<PartitionPosition> range : ranges)
+        {
+            Memtable.FlushablePartitionSet<?> dataSet = current.getFlushSet(range.left, range.right);
+            dataSets.add(dataSet);
+            keys += dataSet.partitionCount();
+        }
+        if (keys == 0)
+            return null;
+
+        // TODO: Can we write directly to stream, skipping disk?
+        Memtable.FlushablePartitionSet<?> firstDataSet = dataSets.get(0);
+        SSTableMultiWriter writer = createSSTableMultiWriter(newSSTableDescriptor(directories.getDirectoryForNewSSTables()),
+                                                             keys,
+                                                             0,
+                                                             repairSessionID,
+                                                             false,
+                                                             0,
+                                                             new SerializationHeader(true,
+                                                                                     firstDataSet.metadata(),
+                                                                                     firstDataSet.columns(),
+                                                                                     firstDataSet.encodingStats()),
+                                                             DO_NOT_TRACK);
+        try
+        {
+            for (Memtable.FlushablePartitionSet<?> dataSet : dataSets)
+                new Flushing.FlushRunnable(dataSet, writer, metric, false).call();  // executes on this thread
+
+            return writer;
+        }
+        catch (Error | RuntimeException t)
+        {
+            writer.abort(t);
+            throw t;
+        }
+    }
+
+    private static final LifecycleNewTracker DO_NOT_TRACK = new LifecycleNewTracker()
+    {
+        public void trackNew(SSTable table)
+        {
+            // not tracking
+        }
+
+        public void untrackNew(SSTable table)
+        {
+            // not tracking
+        }
+
+        public OperationType opType()
+        {
+            return OperationType.FLUSH;
+        }
+    };
+
     /**
      * For testing.  No effort is made to clear historical or even the current memtables, nor for
      * thread safety.  All we do is wipe the sstable containers clean, while leaving the actual
@@ -2218,7 +2557,7 @@
         for (final ColumnFamilyStore cfs : concatWithIndexes())
         {
             cfs.runWithCompactionsDisabled((Callable<Void>) () -> {
-                cfs.data.reset(new Memtable(new AtomicReference<>(CommitLogPosition.NONE), cfs));
+                cfs.data.reset(memtableFactory.create(new AtomicReference<>(CommitLogPosition.NONE), cfs.metadata, cfs));
                 return null;
             }, true, false);
         }
@@ -2259,26 +2598,23 @@
         final long truncatedAt;
         final CommitLogPosition replayAfter;
 
-        if (!noSnapshot && (keyspace.getMetadata().params.durableWrites || DatabaseDescriptor.isAutoSnapshot()))
+        if (!noSnapshot &&
+               ((keyspace.getMetadata().params.durableWrites && !memtableWritesAreDurable())  // need to clear dirty regions
+               || DatabaseDescriptor.isAutoSnapshot())) // need sstable for snapshot
         {
-            replayAfter = forceBlockingFlush();
-            viewManager.forceBlockingFlush();
+            replayAfter = forceBlockingFlush(FlushReason.TRUNCATE);
+            viewManager.forceBlockingFlush(FlushReason.TRUNCATE);
         }
         else
         {
             // just nuke the memtable data w/o writing to disk first
+            // note: this does not wait for the switch to complete, but because the post-flush processing is serial,
+            // the call below does.
             viewManager.dumpMemtables();
-            try
-            {
-                replayAfter = dumpMemtable().get();
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e);
-            }
+            replayAfter = FBUtilities.waitOnFuture(dumpMemtable());
         }
 
-        long now = System.currentTimeMillis();
+        long now = currentTimeMillis();
         // make sure none of our sstables are somehow in the future (clock drift, perhaps)
         for (ColumnFamilyStore cfs : concatWithIndexes())
             for (SSTableReader sstable : cfs.getLiveSSTables())
@@ -2298,7 +2634,7 @@
                 data.notifyTruncated(truncatedAt);
 
             if (!noSnapshot && DatabaseDescriptor.isAutoSnapshot())
-                snapshot(Keyspace.getTimestampedSnapshotNameWithPrefix(name, SNAPSHOT_TRUNCATE_PREFIX));
+                snapshot(Keyspace.getTimestampedSnapshotNameWithPrefix(name, SNAPSHOT_TRUNCATE_PREFIX), DatabaseDescriptor.getAutoSnapshotTtl());
 
             discardSSTables(truncatedAt);
 
@@ -2312,7 +2648,7 @@
             }
         };
 
-        runWithCompactionsDisabled(Executors.callable(truncateRunnable), true, true);
+        runWithCompactionsDisabled(FutureTask.callable(truncateRunnable), true, true);
 
         viewManager.build();
 
@@ -2320,7 +2656,9 @@
     }
 
     /**
-     * Drops current memtable without flushing to disk. This should only be called when truncating a column family which is not durable.
+     * Drops current memtable without flushing to disk. This should only be called when truncating a column family
+     * that cannot have dirty intervals in the commit log (i.e. one which is not durable, or where the memtable itself
+     * performs durable writes).
      */
     public Future<CommitLogPosition> dumpMemtable()
     {
@@ -2333,6 +2671,14 @@
         }
     }
 
+    public void unloadCf()
+    {
+        if (keyspace.getMetadata().params.durableWrites && !memtableWritesAreDurable())  // need to clear dirty regions
+            forceBlockingFlush(ColumnFamilyStore.FlushReason.DROP);
+        else
+            FBUtilities.waitOnFuture(dumpMemtable());
+    }
+
     public <V> V runWithCompactionsDisabled(Callable<V> callable, boolean interruptValidation, boolean interruptViews)
     {
         return runWithCompactionsDisabled(callable, (sstable) -> true, interruptValidation, interruptViews, true);
@@ -2651,6 +2997,11 @@
         return compactionStrategyManager.getSSTableCountPerLevel();
     }
 
+    public long[] getPerLevelSizeBytes()
+    {
+        return compactionStrategyManager.getPerLevelSizeBytes();
+    }
+
     public int getLevelFanoutSize()
     {
         return compactionStrategyManager.getLevelFanoutSize();
@@ -2750,7 +3101,7 @@
     {
         double allDroppable = 0;
         long allColumns = 0;
-        int localTime = (int)(System.currentTimeMillis()/1000);
+        int localTime = (int)(currentTimeMillis() / 1000);
 
         for (SSTableReader sstable : getSSTables(SSTableSet.LIVE))
         {
@@ -2814,9 +3165,11 @@
         return diskBoundaryManager.getDiskBoundaries(this);
     }
 
-    public void invalidateDiskBoundaries()
+    public void invalidateLocalRanges()
     {
         diskBoundaryManager.invalidate();
+
+        switchMemtableOrNotify(FlushReason.OWNED_RANGES_CHANGE, Memtable::localRangesUpdated);
     }
 
     @Override
@@ -2836,6 +3189,24 @@
         return neverPurgeTombstones;
     }
 
+    void onTableDropped()
+    {
+        indexManager.markAllIndexesRemoved();
+
+        CompactionManager.instance.interruptCompactionForCFs(concatWithIndexes(), (sstable) -> true, true);
+
+        if (DatabaseDescriptor.isAutoSnapshot())
+            snapshot(Keyspace.getTimestampedSnapshotNameWithPrefix(name, ColumnFamilyStore.SNAPSHOT_DROP_PREFIX), DatabaseDescriptor.getAutoSnapshotTtl());
+
+        CommitLog.instance.forceRecycleAllSegments(Collections.singleton(metadata.id));
+
+        compactionStrategyManager.shutdown();
+
+        // wait for any outstanding reads/writes that might affect the CFS
+        Keyspace.writeOrder.awaitNewBarrier();
+        readOrdering.awaitNewBarrier();
+    }
+
     /**
      * The thread pools used to flush memtables.
      *
@@ -2849,12 +3220,12 @@
         /**
          * The flush executors for non local system keyspaces.
          */
-        private final ExecutorService[] nonLocalSystemflushExecutors;
+        private final ExecutorPlus[] nonLocalSystemflushExecutors;
 
         /**
          * The flush executors for the local system keyspaces.
          */
-        private final ExecutorService[] localSystemDiskFlushExecutors;
+        private final ExecutorPlus[] localSystemDiskFlushExecutors;
 
         /**
          * {@code true} if local system keyspaces are stored in their own directory and use an extra flush executor,
@@ -2866,32 +3237,26 @@
                                      String[] locationsForNonSystemKeyspaces,
                                      boolean useSpecificLocationForSystemKeyspaces)
         {
-            ExecutorService[] flushExecutors = createPerDiskFlushWriters(locationsForNonSystemKeyspaces.length, flushWriters);
+            ExecutorPlus[] flushExecutors = createPerDiskFlushWriters(locationsForNonSystemKeyspaces.length, flushWriters);
             nonLocalSystemflushExecutors = flushExecutors;
             useSpecificExecutorForSystemKeyspaces = useSpecificLocationForSystemKeyspaces;
-            localSystemDiskFlushExecutors = useSpecificLocationForSystemKeyspaces ? new ExecutorService[] {newThreadPool("LocalSystemKeyspacesDiskMemtableFlushWriter", flushWriters)}
-                                                                                  : new ExecutorService[] {flushExecutors[0]};
+            localSystemDiskFlushExecutors = useSpecificLocationForSystemKeyspaces ? new ExecutorPlus[] {newThreadPool("LocalSystemKeyspacesDiskMemtableFlushWriter", flushWriters)}
+                                                                                  : new ExecutorPlus[] {flushExecutors[0]};
         }
 
-        private static ExecutorService[] createPerDiskFlushWriters(int numberOfExecutors, int flushWriters)
+        private static ExecutorPlus[] createPerDiskFlushWriters(int numberOfExecutors, int flushWriters)
         {
-            ExecutorService[] flushExecutors = new ExecutorService[numberOfExecutors];
-
+            ExecutorPlus[] flushExecutors = new ExecutorPlus[numberOfExecutors];
             for (int i = 0; i < numberOfExecutors; i++)
             {
-                flushExecutors[i] = newThreadPool("PerDiskMemtableFlushWriter_" + i, flushWriters);
+                flushExecutors[i] = newThreadPool("PerDiskMemtableFlushWriter_"+i, flushWriters);
             }
             return flushExecutors;
         }
 
-        private static JMXEnabledThreadPoolExecutor newThreadPool(String poolName, int size)
+        private static ExecutorPlus newThreadPool(String poolName, int size)
         {
-            return new JMXEnabledThreadPoolExecutor(size,
-                                                    Stage.KEEP_ALIVE_SECONDS,
-                                                    TimeUnit.SECONDS,
-                                                    new LinkedBlockingQueue<>(),
-                                                    new NamedThreadFactory(poolName),
-                                                    "internal");
+            return executorFactory().withJmxInternal().pooled(poolName, size);
         }
 
         /**
@@ -2901,7 +3266,7 @@
          * @param tableName the table name
          * @return the flush executors that should be used for flushing the memtables of the specified keyspace.
          */
-        public ExecutorService[] getExecutorsFor(String keyspaceName, String tableName)
+        public ExecutorPlus[] getExecutorsFor(String keyspaceName, String tableName)
         {
             return Directories.isStoredInLocalSystemKeyspacesDataLocation(keyspaceName, tableName) ? localSystemDiskFlushExecutors
                                                                                                    : nonLocalSystemflushExecutors;
@@ -2940,4 +3305,36 @@
         }
         return false;
     }
+
+    @Override
+    public Map<String, Long> getTopSizePartitions()
+    {
+        if (topPartitions == null)
+            return Collections.emptyMap();
+        return topPartitions.getTopSizePartitionMap();
+    }
+
+    @Override
+    public Long getTopSizePartitionsLastUpdate()
+    {
+        if (topPartitions == null)
+            return null;
+        return topPartitions.topSizes().lastUpdate;
+    }
+
+    @Override
+    public Map<String, Long> getTopTombstonePartitions()
+    {
+        if (topPartitions == null)
+            return Collections.emptyMap();
+        return topPartitions.getTopTombstonePartitionMap();
+    }
+
+    @Override
+    public Long getTopTombstonePartitionsLastUpdate()
+    {
+        if (topPartitions == null)
+            return null;
+        return topPartitions.topTombstones().lastUpdate;
+    }
 }
diff --git a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
index 59d1d5d..de7c933 100644
--- a/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
+++ b/src/java/org/apache/cassandra/db/ColumnFamilyStoreMBean.java
@@ -29,6 +29,7 @@
 
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.utils.BreaksJMX;
 
 /**
  * The MBean interface for ColumnFamilyStore
@@ -58,7 +59,18 @@
      *
      * @param tokenRanges The token ranges to be compacted, interpreted as closed intervals.
      */
+    @BreaksJMX("This API was released in 3.10 using a parameter that takes Range of Token, which can only be done IFF client has Cassandra binaries in the classpath")
+    @Deprecated
     public void forceCompactionForTokenRange(Collection<Range<Token>> tokenRanges) throws ExecutionException, InterruptedException;
+
+    /**
+     * Forces a major compaction of specified token ranges in this column family.
+     * <p>
+     * The token ranges will be interpreted as closed intervals to match the closed interval defined by the first and
+     * last keys of a sstable, even though the {@link Range} class is suppossed to be half-open by definition.
+     */
+    public void forceCompactionForTokenRanges(String... tokenRanges);
+
     /**
      * Gets the minimum number of sstables in queue before compaction kicks off
      */
@@ -208,6 +220,12 @@
     public int[] getSSTableCountPerLevel();
 
     /**
+     * @return total size on disk for each level. null unless leveled compaction is used.
+     *         array index corresponds to level(int[0] is for level 0, ...).
+     */
+    public long[] getPerLevelSizeBytes();
+
+    /**
      * @return sstable fanout size for level compaction strategy.
      */
     public int getLevelFanoutSize();
@@ -256,4 +274,9 @@
     public boolean hasMisplacedSSTables();
 
     public List<String> getDataPaths() throws IOException;
+
+    public Map<String, Long> getTopSizePartitions();
+    public Long getTopSizePartitionsLastUpdate();
+    public Map<String, Long> getTopTombstonePartitions();
+    public Long getTopTombstonePartitionsLastUpdate();
 }
diff --git a/src/java/org/apache/cassandra/db/ColumnIndex.java b/src/java/org/apache/cassandra/db/ColumnIndex.java
index b872300..f7860df 100644
--- a/src/java/org/apache/cassandra/db/ColumnIndex.java
+++ b/src/java/org/apache/cassandra/db/ColumnIndex.java
@@ -29,6 +29,7 @@
 import org.apache.cassandra.io.ISerializer;
 import org.apache.cassandra.io.sstable.IndexInfo;
 import org.apache.cassandra.io.sstable.format.SSTableFlushObserver;
+import org.apache.cassandra.io.sstable.format.SSTableWriter;
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.io.util.SequentialWriter;
@@ -36,16 +37,16 @@
 
 /**
  * Column index builder used by {@link org.apache.cassandra.io.sstable.format.big.BigTableWriter}.
- * For index entries that exceed {@link org.apache.cassandra.config.Config#column_index_cache_size_in_kb},
+ * For index entries that exceed {@link org.apache.cassandra.config.Config#column_index_cache_size},
  * this uses the serialization logic as in {@link RowIndexEntry}.
  */
 public class ColumnIndex
 {
-    // used, if the row-index-entry reaches config column_index_cache_size_in_kb
+    // used, if the row-index-entry reaches config column_index_cache_size
     private DataOutputBuffer buffer;
     // used to track the size of the serialized size of row-index-entry (unused for buffer)
     private int indexSamplesSerializedSize;
-    // used, until the row-index-entry reaches config column_index_cache_size_in_kb
+    // used, until the row-index-entry reaches config column_index_cache_size
     private final List<IndexInfo> indexSamples = new ArrayList<>();
 
     private DataOutputBuffer reusableBuffer;
@@ -115,7 +116,11 @@
         this.headerLength = writer.position() - initialPosition;
 
         while (iterator.hasNext())
-            add(iterator.next());
+        {
+            Unfiltered unfiltered = iterator.next();
+            SSTableWriter.guardCollectionSize(iterator.metadata(), iterator.partitionKey(), unfiltered);
+            add(unfiltered);
+        }
 
         finish();
     }
@@ -199,8 +204,8 @@
         }
         columnIndexCount++;
 
-        // First, we collect the IndexInfo objects until we reach Config.column_index_cache_size_in_kb in an ArrayList.
-        // When column_index_cache_size_in_kb is reached, we switch to byte-buffer mode.
+        // First, we collect the IndexInfo objects until we reach Config.column_index_cache_size in an ArrayList.
+        // When column_index_cache_size is reached, we switch to byte-buffer mode.
         if (buffer == null)
         {
             indexSamplesSerializedSize += idxSerializer.serializedSize(cIndexInfo);
@@ -285,7 +290,7 @@
 
         // If we serialize the IndexInfo objects directly in the code above into 'buffer',
         // we have to write the offsts to these here. The offsets have already been are collected
-        // in indexOffsets[]. buffer is != null, if it exceeds Config.column_index_cache_size_in_kb.
+        // in indexOffsets[]. buffer is != null, if it exceeds Config.column_index_cache_size.
         // In the other case, when buffer==null, the offsets are serialized in RowIndexEntry.IndexedEntry.serialize().
         if (buffer != null)
             RowIndexEntry.Serializer.serializeOffsets(buffer, indexOffsets, columnIndexCount);
diff --git a/src/java/org/apache/cassandra/db/ConsistencyLevel.java b/src/java/org/apache/cassandra/db/ConsistencyLevel.java
index fbaf3fd..843ccb9 100644
--- a/src/java/org/apache/cassandra/db/ConsistencyLevel.java
+++ b/src/java/org/apache/cassandra/db/ConsistencyLevel.java
@@ -18,8 +18,11 @@
 package org.apache.cassandra.db;
 
 
+import java.util.Locale;
+
 import com.carrotsearch.hppc.ObjectIntHashMap;
 import org.apache.cassandra.locator.Endpoints;
+import org.apache.cassandra.locator.InOurDc;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -28,7 +31,6 @@
 import org.apache.cassandra.transport.ProtocolException;
 
 import static org.apache.cassandra.locator.Replicas.addToCountPerDc;
-import static org.apache.cassandra.locator.Replicas.countInOurDc;
 
 public enum ConsistencyLevel
 {
@@ -41,7 +43,7 @@
     LOCAL_QUORUM(6, true),
     EACH_QUORUM (7),
     SERIAL      (8),
-    LOCAL_SERIAL(9),
+    LOCAL_SERIAL(9, true),
     LOCAL_ONE   (10, true),
     NODE_LOCAL  (11, true);
 
@@ -81,6 +83,11 @@
         return codeIdx[code];
     }
 
+    public static ConsistencyLevel fromString(String str)
+    {
+        return valueOf(str.toUpperCase(Locale.US));
+    }
+
     public static int quorumFor(AbstractReplicationStrategy replicationStrategy)
     {
         return (replicationStrategy.getReplicationFactor().allReplicas / 2) + 1;
@@ -173,7 +180,7 @@
                 break;
             case LOCAL_ONE: case LOCAL_QUORUM: case LOCAL_SERIAL:
                 // we will only count local replicas towards our response count, as these queries only care about local guarantees
-                blockFor += countInOurDc(pending).allReplicas();
+                blockFor += pending.count(InOurDc.replicas());
                 break;
             case ONE: case TWO: case THREE:
             case QUORUM: case EACH_QUORUM:
diff --git a/src/java/org/apache/cassandra/db/CounterMutation.java b/src/java/org/apache/cassandra/db/CounterMutation.java
index fe1e46e..4f91b83 100644
--- a/src/java/org/apache/cassandra/db/CounterMutation.java
+++ b/src/java/org/apache/cassandra/db/CounterMutation.java
@@ -21,6 +21,7 @@
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.Lock;
+import java.util.function.Supplier;
 
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
@@ -50,6 +51,7 @@
 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;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class CounterMutation implements IMutation
 {
@@ -81,6 +83,12 @@
         return mutation.getPartitionUpdates();
     }
 
+    @Override
+    public Supplier<Mutation> hintOnFailure()
+    {
+        return null;
+    }
+
     public void validateSize(int version, int overhead)
     {
         long totalSize = serializedSize(version) + overhead;
@@ -150,12 +158,12 @@
 
     private void grabCounterLocks(Keyspace keyspace, List<Lock> locks) throws WriteTimeoutException
     {
-        long startTime = System.nanoTime();
+        long startTime = nanoTime();
 
         AbstractReplicationStrategy replicationStrategy = keyspace.getReplicationStrategy();
         for (Lock lock : LOCKS.bulkGet(getCounterLockKeys()))
         {
-            long timeout = getTimeout(NANOSECONDS) - (System.nanoTime() - startTime);
+            long timeout = getTimeout(NANOSECONDS) - (nanoTime() - startTime);
             try
             {
                 if (!lock.tryLock(timeout, NANOSECONDS))
diff --git a/src/java/org/apache/cassandra/db/CounterMutationVerbHandler.java b/src/java/org/apache/cassandra/db/CounterMutationVerbHandler.java
index a30ce66..e4c7669 100644
--- a/src/java/org/apache/cassandra/db/CounterMutationVerbHandler.java
+++ b/src/java/org/apache/cassandra/db/CounterMutationVerbHandler.java
@@ -26,6 +26,8 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.service.StorageProxy;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class CounterMutationVerbHandler implements IVerbHandler<CounterMutation>
 {
     public static final CounterMutationVerbHandler instance = new CounterMutationVerbHandler();
@@ -34,7 +36,7 @@
 
     public void doVerb(final Message<CounterMutation> message)
     {
-        long queryStartNanoTime = System.nanoTime();
+        long queryStartNanoTime = nanoTime();
         final CounterMutation cm = message.payload;
         logger.trace("Applying forwarded {}", cm);
 
diff --git a/src/java/org/apache/cassandra/db/DataRange.java b/src/java/org/apache/cassandra/db/DataRange.java
index 91a62b3..52162be 100644
--- a/src/java/org/apache/cassandra/db/DataRange.java
+++ b/src/java/org/apache/cassandra/db/DataRange.java
@@ -19,7 +19,6 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
-import org.apache.cassandra.db.marshal.ByteArrayAccessor;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.filter.*;
@@ -186,9 +185,10 @@
      *
      * @return Whether this {@code DataRange} queries everything.
      */
-    public boolean isUnrestricted()
+    public boolean isUnrestricted(TableMetadata metadata)
     {
-        return startKey().isMinimum() && stopKey().isMinimum() && clusteringIndexFilter.selectsAllPartition();
+        return startKey().isMinimum() && stopKey().isMinimum() &&
+               (clusteringIndexFilter.selectsAllPartition() || metadata.clusteringColumns().isEmpty());
     }
 
     public boolean selectsAllPartition()
@@ -257,10 +257,10 @@
         return String.format("range=%s pfilter=%s", keyRange.getString(metadata.partitionKeyType), clusteringIndexFilter.toString(metadata));
     }
 
-    public String toCQLString(TableMetadata metadata)
+    public String toCQLString(TableMetadata metadata, RowFilter rowFilter)
     {
-        if (isUnrestricted())
-            return "UNRESTRICTED";
+        if (isUnrestricted(metadata))
+            return rowFilter.toCQLString();
 
         StringBuilder sb = new StringBuilder();
 
@@ -278,7 +278,7 @@
             needAnd = true;
         }
 
-        String filterString = clusteringIndexFilter.toCQLString(metadata);
+        String filterString = clusteringIndexFilter.toCQLString(metadata, rowFilter);
         if (!filterString.isEmpty())
             sb.append(needAnd ? " AND " : "").append(filterString);
 
@@ -312,8 +312,6 @@
              : (isInclusive ? "<=" : "<");
     }
 
-    // TODO: this is reused in SinglePartitionReadCommand but this should not really be here. Ideally
-    // we need a more "native" handling of composite partition keys.
     public static void appendKeyString(StringBuilder sb, AbstractType<?> type, ByteBuffer key)
     {
         if (type instanceof CompositeType)
@@ -321,11 +319,11 @@
             CompositeType ct = (CompositeType)type;
             ByteBuffer[] values = ct.split(key);
             for (int i = 0; i < ct.types.size(); i++)
-                sb.append(i == 0 ? "" : ", ").append(ct.types.get(i).getString(values[i]));
+                sb.append(i == 0 ? "" : ", ").append(ct.types.get(i).toCQLString(values[i]));
         }
         else
         {
-            sb.append(type.getString(key));
+            sb.append(type.toCQLString(key));
         }
     }
 
@@ -393,7 +391,7 @@
         }
 
         @Override
-        public boolean isUnrestricted()
+        public boolean isUnrestricted(TableMetadata metadata)
         {
             return false;
         }
diff --git a/src/java/org/apache/cassandra/db/DecoratedKey.java b/src/java/org/apache/cassandra/db/DecoratedKey.java
index 92d6414..4dd87d0 100644
--- a/src/java/org/apache/cassandra/db/DecoratedKey.java
+++ b/src/java/org/apache/cassandra/db/DecoratedKey.java
@@ -19,10 +19,15 @@
 
 import java.nio.ByteBuffer;
 import java.util.Comparator;
+import java.util.List;
+import java.util.StringJoiner;
 
+import org.apache.cassandra.db.marshal.CompositeType;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.dht.Token.KeyBound;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.MurmurHash;
 import org.apache.cassandra.utils.IFilter.FilterKey;
@@ -125,6 +130,33 @@
         return "DecoratedKey(" + getToken() + ", " + keystring + ")";
     }
 
+    /**
+     * Returns a CQL representation of this key.
+     *
+     * @param metadata the metadata of the table that this key belogs to
+     * @return a CQL representation of this key
+     */
+    public String toCQLString(TableMetadata metadata)
+    {
+        List<ColumnMetadata> columns = metadata.partitionKeyColumns();
+
+        if (columns.size() == 1)
+            return toCQLString(columns.get(0), getKey());
+
+        ByteBuffer[] values = ((CompositeType) metadata.partitionKeyType).split(getKey());
+        StringJoiner joiner = new StringJoiner(" AND ");
+
+        for (int i = 0; i < columns.size(); i++)
+            joiner.add(toCQLString(columns.get(i), values[i]));
+
+        return joiner.toString();
+    }
+
+    private static String toCQLString(ColumnMetadata metadata, ByteBuffer key)
+    {
+        return String.format("%s = %s", metadata.name.toCQLString(), metadata.type.toCQLString(key));
+    }
+
     public Token getToken()
     {
         return token;
diff --git a/src/java/org/apache/cassandra/db/DeletionTime.java b/src/java/org/apache/cassandra/db/DeletionTime.java
index d8ac91d..105e10d 100644
--- a/src/java/org/apache/cassandra/db/DeletionTime.java
+++ b/src/java/org/apache/cassandra/db/DeletionTime.java
@@ -33,7 +33,7 @@
  */
 public class DeletionTime implements Comparable<DeletionTime>, IMeasurableMemory
 {
-    private static final long EMPTY_SIZE = ObjectSizes.measure(new DeletionTime(0, 0));
+    public static final long EMPTY_SIZE = ObjectSizes.measure(new DeletionTime(0, 0));
 
     /**
      * A special DeletionTime that signifies that there is no top-level (row) tombstone.
diff --git a/src/java/org/apache/cassandra/db/Directories.java b/src/java/org/apache/cassandra/db/Directories.java
index cecc60d..b16dd97 100644
--- a/src/java/org/apache/cassandra/db/Directories.java
+++ b/src/java/org/apache/cassandra/db/Directories.java
@@ -17,18 +17,29 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.*;
-import java.nio.file.*;
+import java.time.Instant;
 import java.util.*;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.function.BiPredicate;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import com.google.common.annotations.VisibleForTesting;
+
+import java.io.IOError;
+import java.io.IOException;
+import java.nio.file.FileStore;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import com.google.common.util.concurrent.RateLimiter;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -42,9 +53,11 @@
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.sstable.*;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.io.util.PathUtils;
 import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.snapshot.SnapshotManifest;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 import org.apache.cassandra.utils.DirectorySizeCalculator;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Pair;
 
@@ -145,25 +158,25 @@
             switch (action)
             {
                 case X:
-                    privilege = file.canExecute();
+                    privilege = file.isExecutable();
                     break;
                 case W:
-                    privilege = file.canWrite();
+                    privilege = file.isWritable();
                     break;
                 case XW:
-                    privilege = file.canExecute() && file.canWrite();
+                    privilege = file.isExecutable() && file.isWritable();
                     break;
                 case R:
-                    privilege = file.canRead();
+                    privilege = file.isReadable();
                     break;
                 case XR:
-                    privilege = file.canExecute() && file.canRead();
+                    privilege = file.isExecutable() && file.isReadable();
                     break;
                 case RW:
-                    privilege = file.canRead() && file.canWrite();
+                    privilege = file.isReadable() && file.isWritable();
                     break;
                 case XRW:
-                    privilege = file.canExecute() && file.canRead() && file.canWrite();
+                    privilege = file.isExecutable() && file.isReadable() && file.isWritable();
                     break;
             }
             return privilege;
@@ -209,7 +222,7 @@
             // check if old SSTable directory exists
             File dataPath = new File(paths[i].location, oldSSTableRelativePath);
             dataPaths[i] = dataPath;
-            canonicalPathsBuilder.put(Paths.get(FileUtils.getCanonicalPath(dataPath)), paths[i]);
+            canonicalPathsBuilder.put(dataPath.toCanonical().toPath(), paths[i]);
         }
         boolean olderDirectoryExists = Iterables.any(Arrays.asList(dataPaths), File::exists);
         if (!olderDirectoryExists)
@@ -221,7 +234,7 @@
             {
                 File dataPath = new File(paths[i].location, newSSTableRelativePath);
                 dataPaths[i] = dataPath;
-                canonicalPathsBuilder.put(Paths.get(FileUtils.getCanonicalPath(dataPath)), paths[i]);
+                canonicalPathsBuilder.put(dataPath.toCanonical().toPath(), paths[i]);
             }
         }
         // if index, then move to its own directory
@@ -232,7 +245,7 @@
             {
                 File dataPath = new File(dataPaths[i], indexNameWithDot);
                 dataPaths[i] = dataPath;
-                canonicalPathsBuilder.put(Paths.get(FileUtils.getCanonicalPath(dataPath)), paths[i]);
+                canonicalPathsBuilder.put(dataPath.toCanonical().toPath(), paths[i]);
             }
         }
 
@@ -255,22 +268,16 @@
         {
             for (File dataPath : dataPaths)
             {
-                File[] indexFiles = dataPath.getParentFile().listFiles(new FileFilter()
-                {
-                    @Override
-                    public boolean accept(File file)
-                    {
-                        if (file.isDirectory())
-                            return false;
+                File[] indexFiles = dataPath.parent().tryList(file -> {
+                    if (file.isDirectory())
+                        return false;
 
-                        Descriptor desc = SSTable.tryDescriptorFromFilename(file);
-                        return desc != null && desc.ksname.equals(metadata.keyspace) && desc.cfname.equals(metadata.name);
-
-                    }
+                    Descriptor desc = SSTable.tryDescriptorFromFilename(file);
+                    return desc != null && desc.ksname.equals(metadata.keyspace) && desc.cfname.equals(metadata.name);
                 });
                 for (File indexFile : indexFiles)
                 {
-                    File destFile = new File(dataPath, indexFile.getName());
+                    File destFile = new File(dataPath, indexFile.name());
                     logger.trace("Moving index file {} to {}", indexFile, destFile);
                     FileUtils.renameWithConfirm(indexFile, destFile);
                 }
@@ -291,8 +298,8 @@
             for (File dir : dataPaths)
             {
                 // Note that we must compare absolute paths (not canonical) here since keyspace directories might be symlinks
-                Path dirPath = Paths.get(dir.getAbsolutePath());
-                Path locationPath = Paths.get(dataDirectory.location.getAbsolutePath());
+                Path dirPath = dir.toAbsolute().toPath();
+                Path locationPath = dataDirectory.location.toAbsolute().toPath();
                 if (dirPath.startsWith(locationPath))
                     return dir;
             }
@@ -509,7 +516,7 @@
             StringJoiner pathString = new StringJoiner(",", "[", "]");
             for (DataDirectory p: paths)
             {
-                pathString.add(p.location.getAbsolutePath());
+                pathString.add(p.location.toJavaIOFile().getAbsolutePath());
             }
             logger.warn("Insufficient disk space for compaction. Across {} there's only {} available, but {} is needed.",
                         pathString.toString(),
@@ -556,7 +563,7 @@
     {
         if (isSecondaryIndexFolder(location))
         {
-            return getOrCreate(location.getParentFile(), SNAPSHOT_SUBDIR, snapshotName, location.getName());
+            return getOrCreate(location.parent(), SNAPSHOT_SUBDIR, snapshotName, location.name());
         }
         else
         {
@@ -567,12 +574,22 @@
     public File getSnapshotManifestFile(String snapshotName)
     {
         File snapshotDir = getSnapshotDirectory(getDirectoryForNewSSTables(), snapshotName);
+        return getSnapshotManifestFile(snapshotDir);
+    }
+
+    public static File getSnapshotManifestFile(File snapshotDir)
+    {
         return new File(snapshotDir, "manifest.json");
     }
 
     public File getSnapshotSchemaFile(String snapshotName)
     {
         File snapshotDir = getSnapshotDirectory(getDirectoryForNewSSTables(), snapshotName);
+        return getSnapshotSchemaFile(snapshotDir);
+    }
+
+    public static File getSnapshotSchemaFile(File snapshotDir)
+    {
         return new File(snapshotDir, "schema.cql");
     }
 
@@ -596,7 +613,7 @@
     {
         if (isSecondaryIndexFolder(location))
         {
-            return getOrCreate(location.getParentFile(), BACKUPS_SUBDIR, location.getName());
+            return getOrCreate(location.parent(), BACKUPS_SUBDIR, location.name());
         }
         else
         {
@@ -638,12 +655,22 @@
             this.location = location;
         }
 
+        public DataDirectory(Path location)
+        {
+            this.location = new File(location);
+        }
+
         public long getAvailableSpace()
         {
-            long availableSpace = FileUtils.getUsableSpace(location) - DatabaseDescriptor.getMinFreeSpacePerDriveInBytes();
+            long availableSpace = PathUtils.tryGetSpace(location.toPath(), FileStore::getUsableSpace) - DatabaseDescriptor.getMinFreeSpacePerDriveInBytes();
             return availableSpace > 0 ? availableSpace : 0;
         }
 
+        public long getRawSize()
+        {
+            return FileUtils.folderSize(location);
+        }
+
         @Override
         public boolean equals(Object o)
         {
@@ -889,7 +916,7 @@
         public List<Map.Entry<Descriptor, Set<Component>>> sortedList()
         {
             List<Map.Entry<Descriptor, Set<Component>>> sortedEntries = new ArrayList<>(list().entrySet());
-            sortedEntries.sort(Comparator.comparingInt(e -> e.getKey().generation));
+            sortedEntries.sort((o1, o2) -> SSTableIdFactory.COMPARATOR.compare(o1.getKey().id, o2.getKey().id));
             return sortedEntries;
         }
 
@@ -972,51 +999,80 @@
         }
     }
 
-    /**
-     *
-     * @return  Return a map of all snapshots to space being used
-     * The pair for a snapshot has size on disk and true size.
-     */
-    public Map<String, SnapshotSizeDetails> getSnapshotDetails()
+    public Map<String, TableSnapshot> listSnapshots()
     {
-        List<File> snapshots = listSnapshots();
-        final Map<String, SnapshotSizeDetails> snapshotSpaceMap = Maps.newHashMapWithExpectedSize(snapshots.size());
-        for (File snapshot : snapshots)
+        Map<String, Set<File>> snapshotDirsByTag = listSnapshotDirsByTag();
+
+        Map<String, TableSnapshot> snapshots = Maps.newHashMapWithExpectedSize(snapshotDirsByTag.size());
+
+        for (Map.Entry<String, Set<File>> entry : snapshotDirsByTag.entrySet())
         {
-            final long sizeOnDisk = FileUtils.folderSize(snapshot);
-            final long trueSize = getTrueAllocatedSizeIn(snapshot);
-            SnapshotSizeDetails spaceUsed = snapshotSpaceMap.get(snapshot.getName());
-            if (spaceUsed == null)
-                spaceUsed =  new SnapshotSizeDetails(sizeOnDisk,trueSize);
-            else
-                spaceUsed = new SnapshotSizeDetails(spaceUsed.sizeOnDiskBytes + sizeOnDisk, spaceUsed.dataSizeBytes + trueSize);
-            snapshotSpaceMap.put(snapshot.getName(), spaceUsed);
+            String tag = entry.getKey();
+            Set<File> snapshotDirs = entry.getValue();
+            SnapshotManifest manifest = maybeLoadManifest(metadata.keyspace, metadata.name, tag, snapshotDirs);
+            snapshots.put(tag, buildSnapshot(tag, manifest, snapshotDirs));
         }
-        return snapshotSpaceMap;
+
+        return snapshots;
+    }
+
+    protected TableSnapshot buildSnapshot(String tag, SnapshotManifest manifest, Set<File> snapshotDirs) {
+        Instant createdAt = manifest == null ? null : manifest.createdAt;
+        Instant expiresAt = manifest == null ? null : manifest.expiresAt;
+        return new TableSnapshot(metadata.keyspace, metadata.name, metadata.id.asUUID(), tag, createdAt, expiresAt,
+                                 snapshotDirs);
+    }
+
+    @VisibleForTesting
+    protected static SnapshotManifest maybeLoadManifest(String keyspace, String table, String tag, Set<File> snapshotDirs)
+    {
+        List<File> manifests = snapshotDirs.stream().map(d -> new File(d, "manifest.json"))
+                                           .filter(d -> d.exists()).collect(Collectors.toList());
+
+        if (manifests.isEmpty())
+        {
+            logger.warn("No manifest found for snapshot {} of table {}.{}.", tag, keyspace, table);
+            return null;
+        }
+
+        if (manifests.size() > 1) {
+            logger.warn("Found multiple manifests for snapshot {} of table {}.{}", tag, keyspace, table);
+        }
+
+        try
+        {
+            return SnapshotManifest.deserializeFromJsonFile(manifests.get(0));
+        }
+        catch (IOException e)
+        {
+            logger.warn("Cannot read manifest file {} of snapshot {}.", manifests, tag, e);
+        }
+
+        return null;
     }
 
     public List<String> listEphemeralSnapshots()
     {
         final List<String> ephemeralSnapshots = new LinkedList<>();
-        for (File snapshot : listSnapshots())
+        for (File snapshot : listAllSnapshots())
         {
             if (getEphemeralSnapshotMarkerFile(snapshot).exists())
-                ephemeralSnapshots.add(snapshot.getName());
+                ephemeralSnapshots.add(snapshot.name());
         }
         return ephemeralSnapshots;
     }
 
-    private List<File> listSnapshots()
+    private List<File> listAllSnapshots()
     {
         final List<File> snapshots = new LinkedList<>();
         for (final File dir : dataPaths)
         {
             File snapshotDir = isSecondaryIndexFolder(dir)
-                               ? new File(dir.getParent(), SNAPSHOT_SUBDIR)
+                               ? new File(dir.parentPath(), SNAPSHOT_SUBDIR)
                                : new File(dir, SNAPSHOT_SUBDIR);
             if (snapshotDir.exists() && snapshotDir.isDirectory())
             {
-                final File[] snapshotDirs  = snapshotDir.listFiles();
+                final File[] snapshotDirs  = snapshotDir.tryList();
                 if (snapshotDirs != null)
                 {
                     for (final File snapshot : snapshotDirs)
@@ -1031,6 +1087,32 @@
         return snapshots;
     }
 
+    @VisibleForTesting
+    protected Map<String, Set<File>> listSnapshotDirsByTag()
+    {
+        Map<String, Set<File>> snapshotDirsByTag = new HashMap<>();
+        for (final File dir : dataPaths)
+        {
+            File snapshotDir = isSecondaryIndexFolder(dir)
+                               ? new File(dir.parentPath(), SNAPSHOT_SUBDIR)
+                               : new File(dir, SNAPSHOT_SUBDIR);
+            if (snapshotDir.exists() && snapshotDir.isDirectory())
+            {
+                final File[] snapshotDirs  = snapshotDir.tryList();
+                if (snapshotDirs != null)
+                {
+                    for (final File snapshot : snapshotDirs)
+                    {
+                        if (snapshot.isDirectory()) {
+                            snapshotDirsByTag.computeIfAbsent(snapshot.name(), k -> new LinkedHashSet<>()).add(snapshot.toAbsolute());
+                        }
+                    }
+                }
+            }
+        }
+        return snapshotDirsByTag;
+    }
+
     public boolean snapshotExists(String snapshotName)
     {
         for (File dir : dataPaths)
@@ -1038,7 +1120,7 @@
             File snapshotDir;
             if (isSecondaryIndexFolder(dir))
             {
-                snapshotDir = new File(dir.getParentFile(), join(SNAPSHOT_SUBDIR, snapshotName, dir.getName()));
+                snapshotDir = new File(dir.parent(), join(SNAPSHOT_SUBDIR, snapshotName, dir.name()));
             }
             else
             {
@@ -1050,41 +1132,33 @@
         return false;
     }
 
-    public static void clearSnapshot(String snapshotName, List<File> snapshotDirectories, RateLimiter snapshotRateLimiter)
+    public static void clearSnapshot(String snapshotName, List<File> tableDirectories, RateLimiter snapshotRateLimiter)
     {
         // If snapshotName is empty or null, we will delete the entire snapshot directory
         String tag = snapshotName == null ? "" : snapshotName;
-        for (File dir : snapshotDirectories)
+        for (File tableDir : tableDirectories)
         {
-            File snapshotDir = new File(dir, join(SNAPSHOT_SUBDIR, tag));
-            if (snapshotDir.exists())
-            {
-                logger.trace("Removing snapshot directory {}", snapshotDir);
-                try
-                {
-                    FileUtils.deleteRecursiveWithThrottle(snapshotDir, snapshotRateLimiter);
-                }
-                catch (FSWriteError e)
-                {
-                    if (FBUtilities.isWindows)
-                        SnapshotDeletingTask.addFailedSnapshot(snapshotDir);
-                    else
-                        throw e;
-                }
-            }
+            File snapshotDir = new File(tableDir, join(SNAPSHOT_SUBDIR, tag));
+            removeSnapshotDirectory(snapshotRateLimiter, snapshotDir);
         }
     }
 
-    // The snapshot must exist
-    public long snapshotCreationTime(String snapshotName)
+    public static void removeSnapshotDirectory(RateLimiter snapshotRateLimiter, File snapshotDir)
     {
-        for (File dir : dataPaths)
+        if (snapshotDir.exists())
         {
-            File snapshotDir = getSnapshotDirectory(dir, snapshotName);
-            if (snapshotDir.exists())
-                return snapshotDir.lastModified();
+            logger.trace("Removing snapshot directory {}", snapshotDir);
+            try
+            {
+                FileUtils.deleteRecursiveWithThrottle(snapshotDir, snapshotRateLimiter);
+            }
+            catch (RuntimeException ex)
+            {
+                if (!snapshotDir.exists())
+                    return; // ignore
+                throw ex;
+            }
         }
-        throw new RuntimeException("Snapshot " + snapshotName + " doesn't exist");
     }
 
     /**
@@ -1096,7 +1170,7 @@
         for (File dir : dataPaths)
         {
             File snapshotDir = isSecondaryIndexFolder(dir)
-                               ? new File(dir.getParent(), SNAPSHOT_SUBDIR)
+                               ? new File(dir.parentPath(), SNAPSHOT_SUBDIR)
                                : new File(dir, SNAPSHOT_SUBDIR);
             result += getTrueAllocatedSizeIn(snapshotDir);
         }
@@ -1116,19 +1190,19 @@
         return totalAllocatedSize;
     }
 
-    public long getTrueAllocatedSizeIn(File input)
+    public long getTrueAllocatedSizeIn(File snapshotDir)
     {
-        if (!input.isDirectory())
+        if (!snapshotDir.isDirectory())
             return 0;
 
-        SSTableSizeSummer visitor = new SSTableSizeSummer(input, sstableLister(Directories.OnTxnErr.THROW).listFiles());
+        SSTableSizeSummer visitor = new SSTableSizeSummer(sstableLister(OnTxnErr.THROW).listFiles());
         try
         {
-            Files.walkFileTree(input.toPath(), visitor);
+            Files.walkFileTree(snapshotDir.toPath(), visitor);
         }
         catch (IOException e)
         {
-            logger.error("Could not calculate the size of {}. {}", input, e.getMessage());
+            logger.error("Could not calculate the size of {}. {}", snapshotDir, e.getMessage());
         }
 
         return visitor.getAllocatedSize();
@@ -1141,7 +1215,7 @@
         for (DataDirectory dataDirectory : dataDirectories.getAllDirectories())
         {
             File ksDir = new File(dataDirectory.location, ksName);
-            File[] cfDirs = ksDir.listFiles();
+            File[] cfDirs = ksDir.tryList();
             if (cfDirs == null)
                 continue;
             for (File cfDir : cfDirs)
@@ -1155,7 +1229,12 @@
 
     public static boolean isSecondaryIndexFolder(File dir)
     {
-        return dir.getName().startsWith(SECONDARY_INDEX_NAME_SEPARATOR);
+        return dir.name().startsWith(SECONDARY_INDEX_NAME_SEPARATOR);
+    }
+
+    public static boolean isSecondaryIndexFolder(Path dir)
+    {
+        return PathUtils.filename(dir).startsWith(SECONDARY_INDEX_NAME_SEPARATOR);
     }
 
     public List<File> getCFDirectories()
@@ -1169,6 +1248,24 @@
         return result;
     }
 
+    /**
+     * Initializes the sstable unique identifier generator using a provided builder for this instance of directories.
+     * If the id builder needs that, sstables in these directories are listed to provide the existing identifiers to
+     * the builder. The listing is done lazily so if the builder does not require that, listing is skipped.
+     */
+    public <T extends SSTableId> Supplier<T> getUIDGenerator(SSTableId.Builder<T> builder)
+    {
+        // this stream is evaluated lazily - if the generator does not need the existing ids, we do not even call #sstableLister
+        Stream<SSTableId> curIds = StreamSupport.stream(() -> sstableLister(Directories.OnTxnErr.IGNORE)
+                                                              .includeBackups(true)
+                                                              .list()
+                                                              .keySet()
+                                                              .spliterator(), Spliterator.DISTINCT, false)
+                                                .map(d -> d.id);
+
+        return builder.generator(curIds);
+    }
+
     private static File getOrCreate(File base, String... subdirs)
     {
         File dir = subdirs == null || subdirs.length == 0 ? base : new File(base, join(subdirs));
@@ -1177,7 +1274,7 @@
             if (!dir.isDirectory())
                 throw new AssertionError(String.format("Invalid directory path %s: path exists but is not a directory", dir));
         }
-        else if (!dir.mkdirs() && !(dir.exists() && dir.isDirectory()))
+        else if (!dir.tryCreateDirectories() && !(dir.exists() && dir.isDirectory()))
         {
             throw new FSWriteError(new IOException("Unable to create directory " + dir), dir);
         }
@@ -1186,55 +1283,27 @@
 
     private static String join(String... s)
     {
-        return StringUtils.join(s, File.separator);
+        return StringUtils.join(s, File.pathSeparator());
     }
 
     private class SSTableSizeSummer extends DirectorySizeCalculator
     {
         private final Set<String> toSkip;
-        SSTableSizeSummer(File path, List<File> files)
+        SSTableSizeSummer(List<File> files)
         {
-            super(path);
-            toSkip = files.stream().map(f -> f.getName()).collect(Collectors.toSet());
+            toSkip = files.stream().map(File::name).collect(Collectors.toSet());
         }
 
         @Override
         public boolean isAcceptable(Path path)
         {
-            File file = path.toFile();
+            File file = new File(path);
             Descriptor desc = SSTable.tryDescriptorFromFilename(file);
             return desc != null
                 && desc.ksname.equals(metadata.keyspace)
                 && desc.cfname.equals(metadata.name)
-                && !toSkip.contains(file.getName());
+                && !toSkip.contains(file.name());
         }
     }
 
-    public static class SnapshotSizeDetails
-    {
-        public final long sizeOnDiskBytes;
-        public final long dataSizeBytes;
-
-        private SnapshotSizeDetails(long sizeOnDiskBytes, long dataSizeBytes)
-        {
-            this.sizeOnDiskBytes = sizeOnDiskBytes;
-            this.dataSizeBytes = dataSizeBytes;
-        }
-
-        @Override
-        public final int hashCode()
-        {
-            int hashCode = (int) sizeOnDiskBytes ^ (int) (sizeOnDiskBytes >>> 32);
-            return 31 * (hashCode ^ (int) ((int) dataSizeBytes ^ (dataSizeBytes >>> 32)));
-        }
-
-        @Override
-        public final boolean equals(Object o)
-        {
-            if(!(o instanceof SnapshotSizeDetails))
-                return false;
-            SnapshotSizeDetails that = (SnapshotSizeDetails)o;
-            return sizeOnDiskBytes == that.sizeOnDiskBytes && dataSizeBytes == that.dataSizeBytes;
-        }
-    }
 }
diff --git a/src/java/org/apache/cassandra/db/DisallowedDirectories.java b/src/java/org/apache/cassandra/db/DisallowedDirectories.java
index f030253..e666bad 100644
--- a/src/java/org/apache/cassandra/db/DisallowedDirectories.java
+++ b/src/java/org/apache/cassandra/db/DisallowedDirectories.java
@@ -20,14 +20,14 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.File;
-import java.util.Collections;
 import java.util.Set;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.MBeanWrapper;
 
 public class DisallowedDirectories implements DisallowedDirectoriesMBean
@@ -49,14 +49,21 @@
         MBeanWrapper.instance.registerMBean(this, MBEAN_NAME, MBeanWrapper.OnException.LOG);
     }
 
-    public Set<File> getUnreadableDirectories()
+    @Override
+    public Set<java.io.File> getUnreadableDirectories()
     {
-        return Collections.unmodifiableSet(unreadableDirectories);
+        return toJmx(unreadableDirectories);
     }
 
-    public Set<File> getUnwritableDirectories()
+    @Override
+    public Set<java.io.File> getUnwritableDirectories()
     {
-        return Collections.unmodifiableSet(unwritableDirectories);
+        return toJmx(unwritableDirectories);
+    }
+
+    private static Set<java.io.File> toJmx(Set<File> set)
+    {
+        return set.stream().map(f -> f.toPath().toFile()).collect(Collectors.toSet()); // checkstyle: permit this invocation
     }
 
     public void markUnreadable(String path)
@@ -145,11 +152,11 @@
             return file;
 
         if (file.isFile())
-            return file.getParentFile();
+            return file.parent();
 
         // the file with path cannot be read - try determining the directory manually.
-        if (file.getPath().endsWith(".db"))
-            return file.getParentFile();
+        if (file.path().endsWith(".db"))
+            return file.parent();
 
         // We may not be able to determine if it's a file or a directory if
         // we were called because we couldn't create the file/directory.
diff --git a/src/java/org/apache/cassandra/db/DisallowedDirectoriesMBean.java b/src/java/org/apache/cassandra/db/DisallowedDirectoriesMBean.java
index 64f15e5..e75bebe 100644
--- a/src/java/org/apache/cassandra/db/DisallowedDirectoriesMBean.java
+++ b/src/java/org/apache/cassandra/db/DisallowedDirectoriesMBean.java
@@ -17,7 +17,7 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
+import java.io.File; //checkstyle: permit this import
 import java.util.Set;
 
 public interface DisallowedDirectoriesMBean
diff --git a/src/java/org/apache/cassandra/db/DiskBoundaryManager.java b/src/java/org/apache/cassandra/db/DiskBoundaryManager.java
index cc617da..0de745d 100644
--- a/src/java/org/apache/cassandra/db/DiskBoundaryManager.java
+++ b/src/java/org/apache/cassandra/db/DiskBoundaryManager.java
@@ -21,7 +21,6 @@
 import java.util.ArrayList;
 import java.util.Comparator;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -68,7 +67,19 @@
            diskBoundaries.invalidate();
     }
 
-    private static DiskBoundaries getDiskBoundaryValue(ColumnFamilyStore cfs)
+    static class VersionedRangesAtEndpoint
+    {
+        public final RangesAtEndpoint rangesAtEndpoint;
+        public final long ringVersion;
+
+        VersionedRangesAtEndpoint(RangesAtEndpoint rangesAtEndpoint, long ringVersion)
+        {
+            this.rangesAtEndpoint = rangesAtEndpoint;
+            this.ringVersion = ringVersion;
+        }
+    }
+
+    public static VersionedRangesAtEndpoint getVersionedLocalRanges(ColumnFamilyStore cfs)
     {
         RangesAtEndpoint localRanges;
 
@@ -78,23 +89,20 @@
         {
             tmd = StorageService.instance.getTokenMetadata();
             ringVersion = tmd.getRingVersion();
-            if (StorageService.instance.isBootstrapMode()
-                && !StorageService.isReplacingSameAddress()) // When replacing same address, the node marks itself as UN locally
-            {
-                PendingRangeCalculatorService.instance.blockUntilFinished();
-                localRanges = tmd.getPendingRanges(cfs.keyspace.getName(), FBUtilities.getBroadcastAddressAndPort());
-            }
-            else
-            {
-                // Reason we use use the future settled TMD is that if we decommission a node, we want to stream
-                // from that node to the correct location on disk, if we didn't, we would put new files in the wrong places.
-                // We do this to minimize the amount of data we need to move in rebalancedisks once everything settled
-                localRanges = cfs.keyspace.getReplicationStrategy().getAddressReplicas(tmd.cloneAfterAllSettled(), FBUtilities.getBroadcastAddressAndPort());
-            }
+            localRanges = getLocalRanges(cfs, tmd);
             logger.debug("Got local ranges {} (ringVersion = {})", localRanges, ringVersion);
         }
         while (ringVersion != tmd.getRingVersion()); // if ringVersion is different here it means that
-                                                     // it might have changed before we calculated localRanges - recalculate
+        // it might have changed before we calculated localRanges - recalculate
+
+        return new VersionedRangesAtEndpoint(localRanges, ringVersion);
+    }
+
+    private static DiskBoundaries getDiskBoundaryValue(ColumnFamilyStore cfs)
+    {
+        VersionedRangesAtEndpoint rangesAtEndpoint = getVersionedLocalRanges(cfs);
+        RangesAtEndpoint localRanges = rangesAtEndpoint.rangesAtEndpoint;
+        long ringVersion = rangesAtEndpoint.ringVersion;
 
         int directoriesVersion;
         Directories.DataDirectory[] dirs;
@@ -113,6 +121,25 @@
         return new DiskBoundaries(cfs, dirs, positions, ringVersion, directoriesVersion);
     }
 
+    private static RangesAtEndpoint getLocalRanges(ColumnFamilyStore cfs, TokenMetadata tmd)
+    {
+        RangesAtEndpoint localRanges;
+        if (StorageService.instance.isBootstrapMode()
+        && !StorageService.isReplacingSameAddress()) // When replacing same address, the node marks itself as UN locally
+        {
+            PendingRangeCalculatorService.instance.blockUntilFinished();
+            localRanges = tmd.getPendingRanges(cfs.keyspace.getName(), FBUtilities.getBroadcastAddressAndPort());
+        }
+        else
+        {
+            // Reason we use use the future settled TMD is that if we decommission a node, we want to stream
+            // from that node to the correct location on disk, if we didn't, we would put new files in the wrong places.
+            // We do this to minimize the amount of data we need to move in rebalancedisks once everything settled
+            localRanges = cfs.keyspace.getReplicationStrategy().getAddressReplicas(tmd.cloneAfterAllSettled(), FBUtilities.getBroadcastAddressAndPort());
+        }
+        return localRanges;
+    }
+
     /**
      * Returns a list of disk boundaries, the result will differ depending on whether vnodes are enabled or not.
      *
diff --git a/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java b/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java
index 81e3d1e..7f81b5c 100644
--- a/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java
+++ b/src/java/org/apache/cassandra/db/ExpirationDateOverflowHandling.java
@@ -32,6 +32,8 @@
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.utils.NoSpamLogger;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class ExpirationDateOverflowHandling
 {
     private static final Logger logger = LoggerFactory.getLogger(ExpirationDateOverflowHandling.class);
@@ -75,7 +77,7 @@
             return;
 
         // Check for localExpirationTime overflow (CASSANDRA-14092)
-        int nowInSecs = (int)(System.currentTimeMillis() / 1000);
+        int nowInSecs = (int)(currentTimeMillis() / 1000);
         if (ttl + nowInSecs < 0)
         {
             switch (policy)
diff --git a/src/java/org/apache/cassandra/db/IMutation.java b/src/java/org/apache/cassandra/db/IMutation.java
index 10472c1..831652b 100644
--- a/src/java/org/apache/cassandra/db/IMutation.java
+++ b/src/java/org/apache/cassandra/db/IMutation.java
@@ -19,6 +19,7 @@
 
 import java.util.Collection;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
@@ -35,6 +36,7 @@
     public long getTimeout(TimeUnit unit);
     public String toString(boolean shallow);
     public Collection<PartitionUpdate> getPartitionUpdates();
+    public Supplier<Mutation> hintOnFailure();
 
     public default void validateIndexedColumns()
     {
diff --git a/src/java/org/apache/cassandra/db/Keyspace.java b/src/java/org/apache/cassandra/db/Keyspace.java
index ead01fb..d6db700 100644
--- a/src/java/org/apache/cassandra/db/Keyspace.java
+++ b/src/java/org/apache/cassandra/db/Keyspace.java
@@ -17,8 +17,8 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOException;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -27,10 +27,8 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.locks.Lock;
 import java.util.stream.Stream;
@@ -43,7 +41,7 @@
 
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.db.lifecycle.SSTableSet;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.repair.CassandraKeyspaceRepairManager;
@@ -52,6 +50,7 @@
 import org.apache.cassandra.index.Index;
 import org.apache.cassandra.index.SecondaryIndexManager;
 import org.apache.cassandra.index.transactions.UpdateTransaction;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.locator.AbstractReplicationStrategy;
 import org.apache.cassandra.metrics.KeyspaceMetrics;
@@ -64,15 +63,22 @@
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.apache.cassandra.utils.concurrent.OpOrder;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+import org.apache.cassandra.utils.concurrent.Promise;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.FBUtilities.now;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 /**
  * It represents a Keyspace.
@@ -113,14 +119,36 @@
 
     private static volatile boolean initialized = false;
 
+    public static boolean isInitialized()
+    {
+        return initialized;
+    }
+
     public static void setInitialized()
     {
-        initialized = true;
+        synchronized (Schema.instance)
+        {
+            initialized = true;
+        }
+    }
+
+    /**
+     * Never use it in production code.
+     *
+     * Useful when creating a fake Schema so that it does not manage Keyspace instances (and CFS)
+     */
+    @VisibleForTesting
+    public static void unsetInitialized()
+    {
+        synchronized (Schema.instance)
+        {
+            initialized = false;
+        }
     }
 
     public static Keyspace open(String keyspaceName)
     {
-        assert initialized || SchemaConstants.isLocalSystemKeyspace(keyspaceName);
+        assert initialized || SchemaConstants.isLocalSystemKeyspace(keyspaceName) : "Initialized: " + initialized;
         return open(keyspaceName, Schema.instance, true);
     }
 
@@ -130,47 +158,9 @@
         return open(keyspaceName, Schema.instance, false);
     }
 
-    @VisibleForTesting
-    static Keyspace open(String keyspaceName, SchemaProvider schema, boolean loadSSTables)
+    public static Keyspace open(String keyspaceName, SchemaProvider schema, boolean loadSSTables)
     {
-        Keyspace keyspaceInstance = schema.getKeyspaceInstance(keyspaceName);
-
-        if (keyspaceInstance == null)
-        {
-            // Instantiate the Keyspace while holding the Schema lock. This both ensures we only do it once per
-            // keyspace, and also ensures that Keyspace construction sees a consistent view of the schema.
-            synchronized (schema)
-            {
-                keyspaceInstance = schema.getKeyspaceInstance(keyspaceName);
-                if (keyspaceInstance == null)
-                {
-                    // open and store the keyspace
-                    keyspaceInstance = new Keyspace(keyspaceName, schema, loadSSTables);
-                    schema.storeKeyspaceInstance(keyspaceInstance);
-                }
-            }
-        }
-        return keyspaceInstance;
-    }
-
-    public static Keyspace clear(String keyspaceName)
-    {
-        return clear(keyspaceName, Schema.instance);
-    }
-
-    public static Keyspace clear(String keyspaceName, Schema schema)
-    {
-        synchronized (schema)
-        {
-            Keyspace t = schema.removeKeyspaceInstance(keyspaceName);
-            if (t != null)
-            {
-                for (ColumnFamilyStore cfs : t.getColumnFamilyStores())
-                    t.unloadCf(cfs);
-                t.metric.release();
-            }
-            return t;
-        }
+        return schema.maybeAddKeyspaceInstance(keyspaceName, () -> new Keyspace(keyspaceName, schema, loadSSTables));
     }
 
     public static ColumnFamilyStore openAndGetStore(TableMetadataRef tableRef)
@@ -246,7 +236,7 @@
      * @param rateLimiter Rate limiter for hardlinks-per-second
      * @throws IOException if the column family doesn't exist
      */
-    public void snapshot(String snapshotName, String columnFamilyName, boolean skipFlush, RateLimiter rateLimiter) throws IOException
+    public void snapshot(String snapshotName, String columnFamilyName, boolean skipFlush, DurationSpec.IntSecondsBound ttl, RateLimiter rateLimiter, Instant creationTime) throws IOException
     {
         assert snapshotName != null;
         boolean tookSnapShot = false;
@@ -255,7 +245,7 @@
             if (columnFamilyName == null || cfStore.name.equals(columnFamilyName))
             {
                 tookSnapShot = true;
-                cfStore.snapshot(snapshotName, skipFlush, rateLimiter);
+                cfStore.snapshot(snapshotName, skipFlush, ttl, rateLimiter, creationTime);
             }
         }
 
@@ -273,7 +263,7 @@
      */
     public void snapshot(String snapshotName, String columnFamilyName) throws IOException
     {
-        snapshot(snapshotName, columnFamilyName, false, null);
+        snapshot(snapshotName, columnFamilyName, false, null, null, now());
     }
 
     /**
@@ -282,7 +272,7 @@
      */
     public static String getTimestampedSnapshotName(String clientSuppliedName)
     {
-        String snapshotName = Long.toString(System.currentTimeMillis());
+        String snapshotName = Long.toString(currentTimeMillis());
         if (clientSuppliedName != null && !clientSuppliedName.equals(""))
         {
             snapshotName = snapshotName + "-" + clientSuppliedName;
@@ -322,8 +312,8 @@
     {
         RateLimiter clearSnapshotRateLimiter = DatabaseDescriptor.getSnapshotRateLimiter();
 
-        List<File> snapshotDirs = Directories.getKSChildDirectories(keyspace);
-        Directories.clearSnapshot(snapshotName, snapshotDirs, clearSnapshotRateLimiter);
+        List<File> tableDirectories = Directories.getKSChildDirectories(keyspace);
+        Directories.clearSnapshot(snapshotName, tableDirectories, clearSnapshotRateLimiter);
     }
 
     /**
@@ -337,6 +327,11 @@
         return list;
     }
 
+    public Stream<TableSnapshot> getAllSnapshots()
+    {
+        return getColumnFamilyStores().stream().flatMap(cfs -> cfs.listSnapshots().values().stream());
+    }
+
     private Keyspace(String keyspaceName, SchemaProvider schema, boolean loadSSTables)
     {
         this.schema = schema;
@@ -388,33 +383,37 @@
         if (!ksm.params.replication.equals(replicationParams))
         {
             logger.debug("New replication settings for keyspace {} - invalidating disk boundary caches", ksm.name);
-            columnFamilyStores.values().forEach(ColumnFamilyStore::invalidateDiskBoundaries);
+            columnFamilyStores.values().forEach(ColumnFamilyStore::invalidateLocalRanges);
         }
         replicationParams = ksm.params.replication;
     }
 
-    // best invoked on the compaction mananger.
-    public void dropCf(TableId tableId)
+    // best invoked on the compaction manager.
+    public void dropCf(TableId tableId, boolean dropData)
     {
-        assert columnFamilyStores.containsKey(tableId);
         ColumnFamilyStore cfs = columnFamilyStores.remove(tableId);
         if (cfs == null)
             return;
 
-        cfs.getCompactionStrategyManager().shutdown();
-        CompactionManager.instance.interruptCompactionForCFs(cfs.concatWithIndexes(), (sstable) -> true, true);
-        // wait for any outstanding reads/writes that might affect the CFS
-        cfs.keyspace.writeOrder.awaitNewBarrier();
-        cfs.readOrdering.awaitNewBarrier();
+        cfs.onTableDropped();
+        unloadCf(cfs, dropData);
+    }
 
-        unloadCf(cfs);
+    /**
+     * Unloads all column family stores and releases metrics.
+     */
+    public void unload(boolean dropData)
+    {
+        for (ColumnFamilyStore cfs : getColumnFamilyStores())
+            unloadCf(cfs, dropData);
+        metric.release();
     }
 
     // disassociate a cfs from this keyspace instance.
-    private void unloadCf(ColumnFamilyStore cfs)
+    private void unloadCf(ColumnFamilyStore cfs, boolean dropData)
     {
-        cfs.forceBlockingFlush();
-        cfs.invalidate();
+        cfs.unloadCf();
+        cfs.invalidate(true, dropData);
     }
 
     /**
@@ -472,15 +471,15 @@
         }
     }
 
-    public CompletableFuture<?> applyFuture(Mutation mutation, boolean writeCommitLog, boolean updateIndexes)
+    public Future<?> applyFuture(Mutation mutation, boolean writeCommitLog, boolean updateIndexes)
     {
-        return applyInternal(mutation, writeCommitLog, updateIndexes, true, true, new CompletableFuture<>());
+        return applyInternal(mutation, writeCommitLog, updateIndexes, true, true, new AsyncPromise<>());
     }
 
-    public CompletableFuture<?> applyFuture(Mutation mutation, boolean writeCommitLog, boolean updateIndexes, boolean isDroppable,
+    public Future<?> applyFuture(Mutation mutation, boolean writeCommitLog, boolean updateIndexes, boolean isDroppable,
                                             boolean isDeferrable)
     {
-        return applyInternal(mutation, writeCommitLog, updateIndexes, isDroppable, isDeferrable, new CompletableFuture<>());
+        return applyInternal(mutation, writeCommitLog, updateIndexes, isDroppable, isDeferrable, new AsyncPromise<>());
     }
 
     public void apply(Mutation mutation, boolean writeCommitLog, boolean updateIndexes)
@@ -503,7 +502,7 @@
      *                       may happen concurrently, depending on the CL Executor type.
      * @param makeDurable    if true, don't return unless write has been made durable
      * @param updateIndexes  false to disable index updates (used by CollationController "defragmenting")
-     * @param isDroppable    true if this should throw WriteTimeoutException if it does not acquire lock within write_request_timeout_in_ms
+     * @param isDroppable    true if this should throw WriteTimeoutException if it does not acquire lock within write_request_timeout
      */
     public void apply(final Mutation mutation,
                       final boolean makeDurable,
@@ -520,15 +519,15 @@
      *                       may happen concurrently, depending on the CL Executor type.
      * @param makeDurable    if true, don't return unless write has been made durable
      * @param updateIndexes  false to disable index updates (used by CollationController "defragmenting")
-     * @param isDroppable    true if this should throw WriteTimeoutException if it does not acquire lock within write_request_timeout_in_ms
+     * @param isDroppable    true if this should throw WriteTimeoutException if it does not acquire lock within write_request_timeout
      * @param isDeferrable   true if caller is not waiting for future to complete, so that future may be deferred
      */
-    private CompletableFuture<?> applyInternal(final Mutation mutation,
+    private Future<?> applyInternal(final Mutation mutation,
                                                final boolean makeDurable,
                                                boolean updateIndexes,
                                                boolean isDroppable,
                                                boolean isDeferrable,
-                                               CompletableFuture<?> future)
+                                               Promise<?> future)
     {
         if (TEST_FAIL_WRITES && metadata.name.equals(TEST_FAIL_WRITES_KS))
             throw new RuntimeException("Testing write failures");
@@ -539,7 +538,7 @@
 
         if (requiresViewUpdate)
         {
-            mutation.viewLockAcquireStart.compareAndSet(0L, System.currentTimeMillis());
+            mutation.viewLockAcquireStart.compareAndSet(0L, currentTimeMillis());
 
             // the order of lock acquisition doesn't matter (from a deadlock perspective) because we only use tryLock()
             Collection<TableId> tableIds = mutation.getTableIds();
@@ -572,7 +571,7 @@
                             Tracing.trace("Could not acquire MV lock");
                             if (future != null)
                             {
-                                future.completeExceptionally(new WriteTimeoutException(WriteType.VIEW, ConsistencyLevel.LOCAL_ONE, 0, 1));
+                                future.tryFailure(new WriteTimeoutException(WriteType.VIEW, ConsistencyLevel.LOCAL_ONE, 0, 1));
                                 return future;
                             }
                             else
@@ -585,9 +584,8 @@
 
                             // This view update can't happen right now. so rather than keep this thread busy
                             // we will re-apply ourself to the queue and try again later
-                            final CompletableFuture<?> mark = future;
                             Stage.MUTATION.execute(() ->
-                                                   applyInternal(mutation, makeDurable, true, isDroppable, true, mark)
+                                                   applyInternal(mutation, makeDurable, true, isDroppable, true, future)
                             );
                             return future;
                         }
@@ -604,7 +602,7 @@
                             }
                             catch (InterruptedException e)
                             {
-                                // Just continue
+                                throw new UncheckedInterruptedException(e);
                             }
                             continue;
                         }
@@ -617,7 +615,7 @@
                 }
             }
 
-            long acquireTime = System.currentTimeMillis() - mutation.viewLockAcquireStart.get();
+            long acquireTime = currentTimeMillis() - mutation.viewLockAcquireStart.get();
             // Metrics are only collected for droppable write operations
             // Bulk non-droppable operations (e.g. commitlog replay, hint delivery) are not measured
             if (isDroppable)
@@ -661,11 +659,11 @@
                 cfs.getWriteHandler().write(upd, ctx, indexTransaction);
 
                 if (requiresViewUpdate)
-                    baseComplete.set(System.currentTimeMillis());
+                    baseComplete.set(currentTimeMillis());
             }
 
             if (future != null) {
-                future.complete(null);
+                future.trySuccess(null);
             }
             return future;
         }
@@ -685,11 +683,11 @@
         return replicationStrategy;
     }
 
-    public List<Future<?>> flush()
+    public List<Future<?>> flush(ColumnFamilyStore.FlushReason reason)
     {
         List<Future<?>> futures = new ArrayList<>(columnFamilyStores.size());
         for (ColumnFamilyStore cfs : columnFamilyStores.values())
-            futures.add(cfs.forceFlush());
+            futures.add(cfs.forceFlush(reason));
         return futures;
     }
 
@@ -772,12 +770,12 @@
 
     public static Iterable<Keyspace> nonSystem()
     {
-        return Iterables.transform(Schema.instance.getNonSystemKeyspaces(), Keyspace::open);
+        return Iterables.transform(Schema.instance.getNonSystemKeyspaces().names(), Keyspace::open);
     }
 
     public static Iterable<Keyspace> nonLocalStrategy()
     {
-        return Iterables.transform(Schema.instance.getNonLocalStrategyKeyspaces(), Keyspace::open);
+        return Iterables.transform(Schema.instance.getNonLocalStrategyKeyspaces().names(), Keyspace::open);
     }
 
     public static Iterable<Keyspace> system()
diff --git a/src/java/org/apache/cassandra/db/Memtable.java b/src/java/org/apache/cassandra/db/Memtable.java
deleted file mode 100644
index b74ac5f..0000000
--- a/src/java/org/apache/cassandra/db/Memtable.java
+++ /dev/null
@@ -1,695 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.db;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentNavigableMap;
-import java.util.concurrent.ConcurrentSkipListMap;
-import java.util.concurrent.ConcurrentSkipListSet;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.atomic.AtomicReference;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Throwables;
-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.commitlog.CommitLog;
-import org.apache.cassandra.db.commitlog.CommitLogPosition;
-import org.apache.cassandra.db.commitlog.IntervalSet;
-import org.apache.cassandra.db.filter.ClusteringIndexFilter;
-import org.apache.cassandra.db.filter.ColumnFilter;
-import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
-import org.apache.cassandra.db.partitions.AbstractBTreePartition;
-import org.apache.cassandra.db.partitions.AbstractUnfilteredPartitionIterator;
-import org.apache.cassandra.db.partitions.AtomicBTreePartition;
-import org.apache.cassandra.db.partitions.Partition;
-import org.apache.cassandra.db.partitions.PartitionUpdate;
-import org.apache.cassandra.db.rows.EncodingStats;
-import org.apache.cassandra.db.rows.UnfilteredRowIterator;
-import org.apache.cassandra.dht.AbstractBounds;
-import org.apache.cassandra.dht.Bounds;
-import org.apache.cassandra.dht.IncludingExcludingBounds;
-import org.apache.cassandra.dht.Murmur3Partitioner.LongToken;
-import org.apache.cassandra.dht.Range;
-import org.apache.cassandra.index.transactions.UpdateTransaction;
-import org.apache.cassandra.io.sstable.Descriptor;
-import org.apache.cassandra.io.sstable.SSTableMultiWriter;
-import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
-import org.apache.cassandra.schema.ColumnMetadata;
-import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.ObjectSizes;
-import org.apache.cassandra.utils.concurrent.OpOrder;
-import org.apache.cassandra.utils.memory.Cloner;
-import org.apache.cassandra.utils.memory.HeapPool;
-import org.apache.cassandra.utils.memory.MemtableAllocator;
-import org.apache.cassandra.utils.memory.MemtableCleaner;
-import org.apache.cassandra.utils.memory.MemtablePool;
-import org.apache.cassandra.utils.memory.NativePool;
-import org.apache.cassandra.utils.memory.SlabPool;
-
-public class Memtable implements Comparable<Memtable>
-{
-    private static final Logger logger = LoggerFactory.getLogger(Memtable.class);
-
-    public static final MemtablePool MEMORY_POOL = createMemtableAllocatorPoolInternal();
-    public static final long NO_MIN_TIMESTAMP = -1;
-
-    private static MemtablePool createMemtableAllocatorPoolInternal()
-    {
-        Config.MemtableAllocationType allocationType = DatabaseDescriptor.getMemtableAllocationType();
-        long heapLimit = DatabaseDescriptor.getMemtableHeapSpaceInMb() << 20;
-        long offHeapLimit = DatabaseDescriptor.getMemtableOffheapSpaceInMb() << 20;
-        final float cleaningThreshold = DatabaseDescriptor.getMemtableCleanupThreshold();
-        final MemtableCleaner cleaner = ColumnFamilyStore::flushLargestMemtable;
-        return createMemtableAllocatorPoolInternal(allocationType, heapLimit, offHeapLimit, cleaningThreshold, cleaner);
-    }
-
-    @VisibleForTesting
-    public static MemtablePool createMemtableAllocatorPoolInternal(Config.MemtableAllocationType allocationType,
-                                                                   long heapLimit, long offHeapLimit,
-                                                                   float cleaningThreshold, MemtableCleaner cleaner)
-    {
-        switch (allocationType)
-        {
-            case unslabbed_heap_buffers:
-                return new HeapPool(heapLimit, cleaningThreshold, cleaner);
-            case heap_buffers:
-                return new SlabPool(heapLimit, 0, cleaningThreshold, cleaner);
-            case offheap_buffers:
-                return new SlabPool(heapLimit, offHeapLimit, cleaningThreshold, cleaner);
-            case offheap_objects:
-                return new NativePool(heapLimit, offHeapLimit, cleaningThreshold, cleaner);
-            default:
-                throw new AssertionError();
-        }
-    }
-
-    private static final int ROW_OVERHEAD_HEAP_SIZE = estimateRowOverhead(Integer.parseInt(System.getProperty("cassandra.memtable_row_overhead_computation_step", "100000")));
-
-    private final MemtableAllocator allocator;
-    private final AtomicLong liveDataSize = new AtomicLong(0);
-    private final AtomicLong currentOperations = new AtomicLong(0);
-
-    // the write barrier for directing writes to this memtable or the next during a switch
-    private volatile OpOrder.Barrier writeBarrier;
-    // the precise upper bound of CommitLogPosition owned by this memtable
-    private volatile AtomicReference<CommitLogPosition> commitLogUpperBound;
-    // the precise lower bound of CommitLogPosition owned by this memtable; equal to its predecessor's commitLogUpperBound
-    private AtomicReference<CommitLogPosition> commitLogLowerBound;
-
-    // The approximate lower bound by this memtable; must be <= commitLogLowerBound once our predecessor
-    // has been finalised, and this is enforced in the ColumnFamilyStore.setCommitLogUpperBound
-    private final CommitLogPosition approximateCommitLogLowerBound = CommitLog.instance.getCurrentPosition();
-
-    public int compareTo(Memtable that)
-    {
-        return this.approximateCommitLogLowerBound.compareTo(that.approximateCommitLogLowerBound);
-    }
-
-    public static final class LastCommitLogPosition extends CommitLogPosition
-    {
-        public LastCommitLogPosition(CommitLogPosition copy)
-        {
-            super(copy.segmentId, copy.position);
-        }
-    }
-
-    // We index the memtable by PartitionPosition only for the purpose of being able
-    // to select key range using Token.KeyBound. However put() ensures that we
-    // actually only store DecoratedKey.
-    private final ConcurrentNavigableMap<PartitionPosition, AtomicBTreePartition> partitions = new ConcurrentSkipListMap<>();
-    public final ColumnFamilyStore cfs;
-    private final long creationNano = System.nanoTime();
-
-    // The smallest timestamp for all partitions stored in this memtable
-    private long minTimestamp = Long.MAX_VALUE;
-
-    // Record the comparator of the CFS at the creation of the memtable. This
-    // is only used when a user update the CF comparator, to know if the
-    // memtable was created with the new or old comparator.
-    public final ClusteringComparator initialComparator;
-
-    private final ColumnsCollector columnsCollector;
-    private final StatsCollector statsCollector = new StatsCollector();
-
-    // only to be used by init(), to setup the very first memtable for the cfs
-    public Memtable(AtomicReference<CommitLogPosition> commitLogLowerBound, ColumnFamilyStore cfs)
-    {
-        this.cfs = cfs;
-        this.commitLogLowerBound = commitLogLowerBound;
-        this.allocator = MEMORY_POOL.newAllocator();
-        this.initialComparator = cfs.metadata().comparator;
-        this.cfs.scheduleFlush();
-        this.columnsCollector = new ColumnsCollector(cfs.metadata().regularAndStaticColumns());
-    }
-
-    // ONLY to be used for testing, to create a mock Memtable
-    @VisibleForTesting
-    public Memtable(TableMetadata metadata)
-    {
-        this.initialComparator = metadata.comparator;
-        this.cfs = null;
-        this.allocator = null;
-        this.columnsCollector = new ColumnsCollector(metadata.regularAndStaticColumns());
-    }
-
-    @VisibleForTesting
-    public Memtable(TableMetadata metadata, long minTimestamp)
-    {
-        this.initialComparator = metadata.comparator;
-        this.cfs = null;
-        this.allocator = null;
-        this.columnsCollector = new ColumnsCollector(metadata.regularAndStaticColumns());
-        this.minTimestamp = minTimestamp;
-    }
-
-    public MemtableAllocator getAllocator()
-    {
-        return allocator;
-    }
-
-    public long getLiveDataSize()
-    {
-        return liveDataSize.get();
-    }
-
-    public long getOperations()
-    {
-        return currentOperations.get();
-    }
-
-    @VisibleForTesting
-    public void setDiscarding(OpOrder.Barrier writeBarrier, AtomicReference<CommitLogPosition> commitLogUpperBound)
-    {
-        assert this.writeBarrier == null;
-        this.commitLogUpperBound = commitLogUpperBound;
-        this.writeBarrier = writeBarrier;
-        allocator.setDiscarding();
-    }
-
-    void setDiscarded()
-    {
-        allocator.setDiscarded();
-    }
-
-    // decide if this memtable should take the write, or if it should go to the next memtable
-    public boolean accepts(OpOrder.Group opGroup, CommitLogPosition commitLogPosition)
-    {
-        // if the barrier hasn't been set yet, then this memtable is still taking ALL writes
-        OpOrder.Barrier barrier = this.writeBarrier;
-        if (barrier == null)
-            return true;
-        // if the barrier has been set, but is in the past, we are definitely destined for a future memtable
-        if (!barrier.isAfter(opGroup))
-            return false;
-        // if we aren't durable we are directed only by the barrier
-        if (commitLogPosition == null)
-            return true;
-        while (true)
-        {
-            // otherwise we check if we are in the past/future wrt the CL boundary;
-            // if the boundary hasn't been finalised yet, we simply update it to the max of
-            // its current value and ours; if it HAS been finalised, we simply accept its judgement
-            // this permits us to coordinate a safe boundary, as the boundary choice is made
-            // atomically wrt our max() maintenance, so an operation cannot sneak into the past
-            CommitLogPosition currentLast = commitLogUpperBound.get();
-            if (currentLast instanceof LastCommitLogPosition)
-                return currentLast.compareTo(commitLogPosition) >= 0;
-            if (currentLast != null && currentLast.compareTo(commitLogPosition) >= 0)
-                return true;
-            if (commitLogUpperBound.compareAndSet(currentLast, commitLogPosition))
-                return true;
-        }
-    }
-
-    public CommitLogPosition getCommitLogLowerBound()
-    {
-        return commitLogLowerBound.get();
-    }
-
-    public CommitLogPosition getCommitLogUpperBound()
-    {
-        return commitLogUpperBound.get();
-    }
-
-    public boolean isLive()
-    {
-        return allocator.isLive();
-    }
-
-    public boolean isClean()
-    {
-        return partitions.isEmpty();
-    }
-
-    public boolean mayContainDataBefore(CommitLogPosition position)
-    {
-        return approximateCommitLogLowerBound.compareTo(position) < 0;
-    }
-
-    /**
-     * @return true if this memtable is expired. Expiration time is determined by CF's memtable_flush_period_in_ms.
-     */
-    public boolean isExpired()
-    {
-        int period = cfs.metadata().params.memtableFlushPeriodInMs;
-        return period > 0 && (System.nanoTime() - creationNano >= TimeUnit.MILLISECONDS.toNanos(period));
-    }
-
-    /**
-     * Should only be called by ColumnFamilyStore.apply via Keyspace.apply, which supplies the appropriate
-     * OpOrdering.
-     *
-     * commitLogSegmentPosition should only be null if this is a secondary index, in which case it is *expected* to be null
-     */
-    long put(PartitionUpdate update, UpdateTransaction indexer, OpOrder.Group opGroup)
-    {
-        Cloner cloner = allocator.cloner(opGroup);
-        AtomicBTreePartition previous = partitions.get(update.partitionKey());
-
-        long initialSize = 0;
-        if (previous == null)
-        {
-            final DecoratedKey cloneKey = cloner.clone(update.partitionKey());
-            AtomicBTreePartition empty = new AtomicBTreePartition(cfs.metadata, cloneKey, allocator);
-            // We'll add the columns later. This avoids wasting works if we get beaten in the putIfAbsent
-            previous = partitions.putIfAbsent(cloneKey, empty);
-            if (previous == null)
-            {
-                previous = empty;
-                // allocate the row overhead after the fact; this saves over allocating and having to free after, but
-                // means we can overshoot our declared limit.
-                int overhead = (int) (cloneKey.getToken().getHeapSize() + ROW_OVERHEAD_HEAP_SIZE);
-                allocator.onHeap().allocate(overhead, opGroup);
-                initialSize = 8;
-            }
-        }
-
-        long[] pair = previous.addAllWithSizeDelta(update, cloner, opGroup, indexer);
-        minTimestamp = Math.min(minTimestamp, previous.stats().minTimestamp);
-        liveDataSize.addAndGet(initialSize + pair[0]);
-        columnsCollector.update(update.columns());
-        statsCollector.update(update.stats());
-        currentOperations.addAndGet(update.operationCount());
-        return pair[1];
-    }
-
-    public int partitionCount()
-    {
-        return partitions.size();
-    }
-
-    public List<FlushRunnable> flushRunnables(LifecycleTransaction txn)
-    {
-        return createFlushRunnables(txn);
-    }
-
-    private List<FlushRunnable> createFlushRunnables(LifecycleTransaction txn)
-    {
-        DiskBoundaries diskBoundaries = cfs.getDiskBoundaries();
-        List<PartitionPosition> boundaries = diskBoundaries.positions;
-        List<Directories.DataDirectory> locations = diskBoundaries.directories;
-        if (boundaries == null)
-            return Collections.singletonList(new FlushRunnable(txn));
-
-        List<FlushRunnable> runnables = new ArrayList<>(boundaries.size());
-        PartitionPosition rangeStart = cfs.getPartitioner().getMinimumToken().minKeyBound();
-        try
-        {
-            for (int i = 0; i < boundaries.size(); i++)
-            {
-                PartitionPosition t = boundaries.get(i);
-                runnables.add(new FlushRunnable(rangeStart, t, locations.get(i), txn));
-                rangeStart = t;
-            }
-            return runnables;
-        }
-        catch (Throwable e)
-        {
-            throw Throwables.propagate(abortRunnables(runnables, e));
-        }
-    }
-
-    public Throwable abortRunnables(List<FlushRunnable> runnables, Throwable t)
-    {
-        if (runnables != null)
-            for (FlushRunnable runnable : runnables)
-                t = runnable.writer.abort(t);
-        return t;
-    }
-
-    public String toString()
-    {
-        return String.format("Memtable-%s@%s(%s serialized bytes, %s ops, %.0f%%/%.0f%% of on/off-heap limit)",
-                             cfs.name, hashCode(), FBUtilities.prettyPrintMemory(liveDataSize.get()), currentOperations,
-                             100 * allocator.onHeap().ownershipRatio(), 100 * allocator.offHeap().ownershipRatio());
-    }
-
-    public MemtableUnfilteredPartitionIterator makePartitionIterator(final ColumnFilter columnFilter, final DataRange dataRange)
-    {
-        AbstractBounds<PartitionPosition> keyRange = dataRange.keyRange();
-
-        boolean startIsMin = keyRange.left.isMinimum();
-        boolean stopIsMin = keyRange.right.isMinimum();
-
-        boolean isBound = keyRange instanceof Bounds;
-        boolean includeStart = isBound || keyRange instanceof IncludingExcludingBounds;
-        boolean includeStop = isBound || keyRange instanceof Range;
-        Map<PartitionPosition, AtomicBTreePartition> subMap;
-        if (startIsMin)
-            subMap = stopIsMin ? partitions : partitions.headMap(keyRange.right, includeStop);
-        else
-            subMap = stopIsMin
-                   ? partitions.tailMap(keyRange.left, includeStart)
-                   : partitions.subMap(keyRange.left, includeStart, keyRange.right, includeStop);
-
-        int minLocalDeletionTime = Integer.MAX_VALUE;
-
-        // avoid iterating over the memtable if we purge all tombstones
-        if (cfs.getCompactionStrategyManager().onlyPurgeRepairedTombstones())
-            minLocalDeletionTime = findMinLocalDeletionTime(subMap.entrySet().iterator());
-
-        final Iterator<Map.Entry<PartitionPosition, AtomicBTreePartition>> iter = subMap.entrySet().iterator();
-
-        return new MemtableUnfilteredPartitionIterator(cfs, iter, minLocalDeletionTime, columnFilter, dataRange);
-    }
-
-    private int findMinLocalDeletionTime(Iterator<Map.Entry<PartitionPosition, AtomicBTreePartition>> iterator)
-    {
-        int minLocalDeletionTime = Integer.MAX_VALUE;
-        while (iterator.hasNext())
-        {
-            Map.Entry<PartitionPosition, AtomicBTreePartition> entry = iterator.next();
-            minLocalDeletionTime = Math.min(minLocalDeletionTime, entry.getValue().stats().minLocalDeletionTime);
-        }
-        return minLocalDeletionTime;
-    }
-
-    public Partition getPartition(DecoratedKey key)
-    {
-        return partitions.get(key);
-    }
-
-    /**
-     * Returns the minTS if one available, otherwise NO_MIN_TIMESTAMP.
-     *
-     * EncodingStats uses a synthetic epoch TS at 2015. We don't want to leak that (CASSANDRA-18118) so we return NO_MIN_TIMESTAMP instead.
-     *
-     * @return The minTS or NO_MIN_TIMESTAMP if none available
-     */
-    public long getMinTimestamp()
-    {
-        return minTimestamp != EncodingStats.NO_STATS.minTimestamp ? minTimestamp : NO_MIN_TIMESTAMP;
-    }
-
-    /**
-     * For testing only. Give this memtable too big a size to make it always fail flushing.
-     */
-    @VisibleForTesting
-    public void makeUnflushable()
-    {
-        liveDataSize.addAndGet((long) 1024 * 1024 * 1024 * 1024 * 1024);
-    }
-
-    class FlushRunnable implements Callable<SSTableMultiWriter>
-    {
-        private final long estimatedSize;
-        private final ConcurrentNavigableMap<PartitionPosition, AtomicBTreePartition> toFlush;
-
-        private final boolean isBatchLogTable;
-        private final SSTableMultiWriter writer;
-
-        // keeping these to be able to log what we are actually flushing
-        private final PartitionPosition from;
-        private final PartitionPosition to;
-
-        FlushRunnable(PartitionPosition from, PartitionPosition to, Directories.DataDirectory flushLocation, LifecycleTransaction txn)
-        {
-            this(partitions.subMap(from, to), flushLocation, from, to, txn);
-        }
-
-        FlushRunnable(LifecycleTransaction txn)
-        {
-            this(partitions, null, null, null, txn);
-        }
-
-        FlushRunnable(ConcurrentNavigableMap<PartitionPosition, AtomicBTreePartition> toFlush, Directories.DataDirectory flushLocation, PartitionPosition from, PartitionPosition to, LifecycleTransaction txn)
-        {
-            this.toFlush = toFlush;
-            this.from = from;
-            this.to = to;
-            long keySize = 0;
-            for (PartitionPosition key : toFlush.keySet())
-            {
-                //  make sure we don't write non-sensical keys
-                assert key instanceof DecoratedKey;
-                keySize += ((DecoratedKey) key).getKey().remaining();
-            }
-            estimatedSize = (long) ((keySize // index entries
-                                    + keySize // keys in data file
-                                    + liveDataSize.get()) // data
-                                    * 1.2); // bloom filter and row index overhead
-
-            this.isBatchLogTable = cfs.name.equals(SystemKeyspace.BATCHES) && cfs.keyspace.getName().equals(SchemaConstants.SYSTEM_KEYSPACE_NAME);
-
-            if (flushLocation == null)
-                writer = createFlushWriter(txn, cfs.newSSTableDescriptor(getDirectories().getWriteableLocationAsFile(estimatedSize)), columnsCollector.get(), statsCollector.get());
-            else
-                writer = createFlushWriter(txn, cfs.newSSTableDescriptor(getDirectories().getLocationForDisk(flushLocation)), columnsCollector.get(), statsCollector.get());
-
-        }
-
-        protected Directories getDirectories()
-        {
-            return cfs.getDirectories();
-        }
-
-        private void writeSortedContents()
-        {
-            logger.info("Writing {}, flushed range = ({}, {}]", Memtable.this.toString(), from, to);
-
-            boolean trackContention = logger.isTraceEnabled();
-            int heavilyContendedRowCount = 0;
-            // (we can't clear out the map as-we-go to free up memory,
-            //  since the memtable is being used for queries in the "pending flush" category)
-            for (AtomicBTreePartition partition : toFlush.values())
-            {
-                // Each batchlog partition is a separate entry in the log. And for an entry, we only do 2
-                // operations: 1) we insert the entry and 2) we delete it. Further, BL data is strictly local,
-                // we don't need to preserve tombstones for repair. So if both operation are in this
-                // memtable (which will almost always be the case if there is no ongoing failure), we can
-                // just skip the entry (CASSANDRA-4667).
-                if (isBatchLogTable && !partition.partitionLevelDeletion().isLive() && partition.hasRows())
-                    continue;
-
-                if (trackContention && partition.useLock())
-                    heavilyContendedRowCount++;
-
-                if (!partition.isEmpty())
-                {
-                    try (UnfilteredRowIterator iter = partition.unfilteredIterator())
-                    {
-                        writer.append(iter);
-                    }
-                }
-            }
-
-            long bytesFlushed = writer.getFilePointer();
-            logger.info("Completed flushing {} ({}) for commitlog position {}",
-                         writer.getFilename(),
-                         FBUtilities.prettyPrintMemory(bytesFlushed),
-                         commitLogUpperBound);
-            // Update the metrics
-            cfs.metric.bytesFlushed.inc(bytesFlushed);
-
-            if (heavilyContendedRowCount > 0)
-                logger.trace("High update contention in {}/{} partitions of {} ", heavilyContendedRowCount, toFlush.size(), Memtable.this);
-        }
-
-        public SSTableMultiWriter createFlushWriter(LifecycleTransaction txn,
-                                                    Descriptor descriptor,
-                                                    RegularAndStaticColumns columns,
-                                                    EncodingStats stats)
-        {
-            MetadataCollector sstableMetadataCollector = new MetadataCollector(cfs.metadata().comparator)
-                    .commitLogIntervals(new IntervalSet<>(commitLogLowerBound.get(), commitLogUpperBound.get()));
-
-            return cfs.createSSTableMultiWriter(descriptor,
-                                                toFlush.size(),
-                                                ActiveRepairService.UNREPAIRED_SSTABLE,
-                                                ActiveRepairService.NO_PENDING_REPAIR,
-                                                false,
-                                                sstableMetadataCollector,
-                                                new SerializationHeader(true, cfs.metadata(), columns, stats), txn);
-        }
-
-        @Override
-        public SSTableMultiWriter call()
-        {
-            writeSortedContents();
-            return writer;
-        }
-    }
-
-    private static int estimateRowOverhead(final int count)
-    {
-        // calculate row overhead
-        try (final OpOrder.Group group = new OpOrder().start())
-        {
-            int rowOverhead;
-            MemtableAllocator allocator = MEMORY_POOL.newAllocator();
-            Cloner cloner = allocator.cloner(group);
-            ConcurrentNavigableMap<PartitionPosition, Object> partitions = new ConcurrentSkipListMap<>();
-            final Object val = new Object();
-            for (int i = 0 ; i < count ; i++)
-                partitions.put(cloner.clone(new BufferDecoratedKey(new LongToken(i), ByteBufferUtil.EMPTY_BYTE_BUFFER)), val);
-            double avgSize = ObjectSizes.measureDeep(partitions) / (double) count;
-            rowOverhead = (int) ((avgSize - Math.floor(avgSize)) < 0.05 ? Math.floor(avgSize) : Math.ceil(avgSize));
-            rowOverhead -= ObjectSizes.measureDeep(new LongToken(0));
-            rowOverhead += AtomicBTreePartition.EMPTY_SIZE;
-            rowOverhead += AbstractBTreePartition.HOLDER_UNSHARED_HEAP_SIZE;
-            allocator.setDiscarding();
-            allocator.setDiscarded();
-            return rowOverhead;
-        }
-    }
-
-    public static class MemtableUnfilteredPartitionIterator extends AbstractUnfilteredPartitionIterator
-    {
-        private final ColumnFamilyStore cfs;
-        private final Iterator<Map.Entry<PartitionPosition, AtomicBTreePartition>> iter;
-        private final int minLocalDeletionTime;
-        private final ColumnFilter columnFilter;
-        private final DataRange dataRange;
-
-        public MemtableUnfilteredPartitionIterator(ColumnFamilyStore cfs, Iterator<Map.Entry<PartitionPosition, AtomicBTreePartition>> iter, int minLocalDeletionTime, ColumnFilter columnFilter, DataRange dataRange)
-        {
-            this.cfs = cfs;
-            this.iter = iter;
-            this.minLocalDeletionTime = minLocalDeletionTime;
-            this.columnFilter = columnFilter;
-            this.dataRange = dataRange;
-        }
-
-        public int getMinLocalDeletionTime()
-        {
-            return minLocalDeletionTime;
-        }
-
-        public TableMetadata metadata()
-        {
-            return cfs.metadata();
-        }
-
-        public boolean hasNext()
-        {
-            return iter.hasNext();
-        }
-
-        public UnfilteredRowIterator next()
-        {
-            Map.Entry<PartitionPosition, AtomicBTreePartition> entry = iter.next();
-            // Actual stored key should be true DecoratedKey
-            assert entry.getKey() instanceof DecoratedKey;
-            DecoratedKey key = (DecoratedKey)entry.getKey();
-            ClusteringIndexFilter filter = dataRange.clusteringIndexFilter(key);
-
-            return filter.getUnfilteredRowIterator(columnFilter, entry.getValue());
-        }
-    }
-
-    private static class ColumnsCollector
-    {
-        private final HashMap<ColumnMetadata, AtomicBoolean> predefined = new HashMap<>();
-        private final ConcurrentSkipListSet<ColumnMetadata> extra = new ConcurrentSkipListSet<>();
-        ColumnsCollector(RegularAndStaticColumns columns)
-        {
-            for (ColumnMetadata def : columns.statics)
-                predefined.put(def, new AtomicBoolean());
-            for (ColumnMetadata def : columns.regulars)
-                predefined.put(def, new AtomicBoolean());
-        }
-
-        public void update(RegularAndStaticColumns columns)
-        {
-            for (ColumnMetadata s : columns.statics)
-                update(s);
-            for (ColumnMetadata r : columns.regulars)
-                update(r);
-        }
-
-        private void update(ColumnMetadata definition)
-        {
-            AtomicBoolean present = predefined.get(definition);
-            if (present != null)
-            {
-                if (!present.get())
-                    present.set(true);
-            }
-            else
-            {
-                extra.add(definition);
-            }
-        }
-
-        public RegularAndStaticColumns get()
-        {
-            RegularAndStaticColumns.Builder builder = RegularAndStaticColumns.builder();
-            for (Map.Entry<ColumnMetadata, AtomicBoolean> e : predefined.entrySet())
-                if (e.getValue().get())
-                    builder.add(e.getKey());
-            return builder.addAll(extra).build();
-        }
-    }
-
-    private static class StatsCollector
-    {
-        private final AtomicReference<EncodingStats> stats = new AtomicReference<>(EncodingStats.NO_STATS);
-
-        public void update(EncodingStats newStats)
-        {
-            while (true)
-            {
-                EncodingStats current = stats.get();
-                EncodingStats updated = current.mergeWith(newStats);
-                if (stats.compareAndSet(current, updated))
-                    return;
-            }
-        }
-
-        public EncodingStats get()
-        {
-            return stats.get();
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/db/MessageParams.java b/src/java/org/apache/cassandra/db/MessageParams.java
new file mode 100644
index 0000000..137d3a6
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/MessageParams.java
@@ -0,0 +1,72 @@
+/*
+ * 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;
+
+import java.util.EnumMap;
+import java.util.Map;
+
+import io.netty.util.concurrent.FastThreadLocal;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.ParamType;
+
+public class MessageParams
+{
+    private static final FastThreadLocal<Map<ParamType, Object>> local = new FastThreadLocal<>();
+
+    private MessageParams()
+    {
+    }
+
+    private static Map<ParamType, Object> get()
+    {
+        Map<ParamType, Object> instance = local.get();
+        if (instance == null)
+        {
+            instance = new EnumMap<>(ParamType.class);
+            local.set(instance);
+        }
+
+        return instance;
+    }
+
+    public static void add(ParamType key, Object value)
+    {
+        get().put(key, value);
+    }
+
+    public static <T> T get(ParamType key)
+    {
+        return (T) get().get(key);
+    }
+
+    public static void remove(ParamType key)
+    {
+        get().remove(key);
+    }
+
+    public static void reset()
+    {
+        get().clear();
+    }
+
+    public static <T> Message<T> addToMessage(Message<T> message)
+    {
+        return message.withParams(get());
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/MultiCBuilder.java b/src/java/org/apache/cassandra/db/MultiCBuilder.java
index 0b5625b..435e418 100644
--- a/src/java/org/apache/cassandra/db/MultiCBuilder.java
+++ b/src/java/org/apache/cassandra/db/MultiCBuilder.java
@@ -130,6 +130,13 @@
     }
 
     /**
+     * Returns the current number of results when {@link #build()} is called
+     *
+     * @return the current number of build results
+     */
+    public abstract int buildSize();
+
+    /**
      * Checks if the clusterings contains null elements.
      *
      * @return <code>true</code> if the clusterings contains <code>null</code> elements, <code>false</code> otherwise.
@@ -252,6 +259,12 @@
             return addEachElementToAll(values.get(0));
         }
 
+        @Override
+        public int buildSize()
+        {
+            return hasMissingElements ? 0 : 1;
+        }
+
         public NavigableSet<Clustering<?>> build()
         {
             built = true;
@@ -309,7 +322,7 @@
             checkUpdateable();
 
             if (elementsList.isEmpty())
-                elementsList.add(new ArrayList<ByteBuffer>());
+                elementsList.add(new ArrayList<>());
 
             if (value == null)
                 containsNull = true;
@@ -328,7 +341,7 @@
             checkUpdateable();
 
             if (elementsList.isEmpty())
-                elementsList.add(new ArrayList<ByteBuffer>());
+                elementsList.add(new ArrayList<>());
 
             if (values.isEmpty())
             {
@@ -365,7 +378,7 @@
             checkUpdateable();
 
             if (elementsList.isEmpty())
-                elementsList.add(new ArrayList<ByteBuffer>());
+                elementsList.add(new ArrayList<>());
 
             if (values.isEmpty())
             {
@@ -397,6 +410,12 @@
             return this;
         }
 
+        @Override
+        public int buildSize()
+        {
+            return hasMissingElements ? 0 : elementsList.size();
+        }
+
         public NavigableSet<Clustering<?>> build()
         {
             built = true;
diff --git a/src/java/org/apache/cassandra/db/MutableDeletionInfo.java b/src/java/org/apache/cassandra/db/MutableDeletionInfo.java
index 1c58b92..9cad53e 100644
--- a/src/java/org/apache/cassandra/db/MutableDeletionInfo.java
+++ b/src/java/org/apache/cassandra/db/MutableDeletionInfo.java
@@ -24,7 +24,6 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.rows.*;
-import org.apache.cassandra.db.rows.EncodingStats;
 import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.memory.ByteBufferCloner;
 
diff --git a/src/java/org/apache/cassandra/db/Mutation.java b/src/java/org/apache/cassandra/db/Mutation.java
index 8a1ffc1..7b6a686 100644
--- a/src/java/org/apache/cassandra/db/Mutation.java
+++ b/src/java/org/apache/cassandra/db/Mutation.java
@@ -19,9 +19,9 @@
 
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Supplier;
 
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableMap;
@@ -38,13 +38,14 @@
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.concurrent.Future;
 
 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;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
-public class Mutation implements IMutation
+public class Mutation implements IMutation, Supplier<Mutation>
 {
     public static final MutationSerializer serializer = new MutationSerializer();
 
@@ -132,6 +133,18 @@
         return modifications.values();
     }
 
+    @Override
+    public Supplier<Mutation> hintOnFailure()
+    {
+        return this;
+    }
+
+    @Override
+    public Mutation get()
+    {
+        return this;
+    }
+
     public void validateSize(int version, int overhead)
     {
         long totalSize = serializedSize(version) + overhead;
@@ -204,15 +217,20 @@
         return new Mutation(ks, key, modifications.build(), approxTime.now());
     }
 
-    public CompletableFuture<?> applyFuture()
+    public Future<?> applyFuture()
     {
         Keyspace ks = Keyspace.open(keyspaceName);
         return ks.applyFuture(this, Keyspace.open(keyspaceName).getMetadata().params.durableWrites, true);
     }
 
+    private void apply(Keyspace keyspace, boolean durableWrites, boolean isDroppable)
+    {
+        keyspace.apply(this, durableWrites, true, isDroppable);
+    }
+
     public void apply(boolean durableWrites, boolean isDroppable)
     {
-        Keyspace.open(keyspaceName).apply(this, durableWrites, true, isDroppable);
+        apply(Keyspace.open(keyspaceName), durableWrites, isDroppable);
     }
 
     public void apply(boolean durableWrites)
@@ -226,7 +244,8 @@
      */
     public void apply()
     {
-        apply(Keyspace.open(keyspaceName).getMetadata().params.durableWrites);
+        Keyspace keyspace = Keyspace.open(keyspaceName);
+        apply(keyspace, keyspace.getMetadata().params.durableWrites, true);
     }
 
     public void applyUnsafe()
diff --git a/src/java/org/apache/cassandra/db/MutationExceededMaxSizeException.java b/src/java/org/apache/cassandra/db/MutationExceededMaxSizeException.java
index 084c21e..45d9e43 100644
--- a/src/java/org/apache/cassandra/db/MutationExceededMaxSizeException.java
+++ b/src/java/org/apache/cassandra/db/MutationExceededMaxSizeException.java
@@ -25,10 +25,11 @@
 import com.google.common.annotations.VisibleForTesting;
 
 import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.exceptions.InvalidRequestException;
 
 import static org.apache.cassandra.db.IMutation.MAX_MUTATION_SIZE;
 
-public class MutationExceededMaxSizeException extends RuntimeException
+public class MutationExceededMaxSizeException extends InvalidRequestException
 {
     public static final int PARTITION_MESSAGE_LIMIT = 1024;
 
@@ -52,7 +53,7 @@
                                              .collect(Collectors.toList());
 
         String topKeys = makeTopKeysString(topPartitions, PARTITION_MESSAGE_LIMIT);
-        return String.format("Encountered an oversized mutation (%d/%d) for keyspace: %s. Top keys are: %s",
+        return String.format("Rejected an oversized mutation (%d/%d) for keyspace: %s. Top keys are: %s",
                              totalSize,
                              MAX_MUTATION_SIZE,
                              mutation.getKeyspaceName(),
diff --git a/src/java/org/apache/cassandra/db/MutationVerbHandler.java b/src/java/org/apache/cassandra/db/MutationVerbHandler.java
index 1d4f868..230ca63 100644
--- a/src/java/org/apache/cassandra/db/MutationVerbHandler.java
+++ b/src/java/org/apache/cassandra/db/MutationVerbHandler.java
@@ -22,6 +22,8 @@
 import org.apache.cassandra.net.*;
 import org.apache.cassandra.tracing.Tracing;
 
+import static org.apache.cassandra.db.commitlog.CommitLogSegment.ENTRY_OVERHEAD_SIZE;
+
 public class MutationVerbHandler implements IVerbHandler<Mutation>
 {
     public static final MutationVerbHandler instance = new MutationVerbHandler();
@@ -39,26 +41,17 @@
 
     public void doVerb(Message<Mutation> message)
     {
-        // Check if there were any forwarding headers in this message
-        InetAddressAndPort from = message.respondTo();
-        InetAddressAndPort respondToAddress;
-        if (from == null)
-        {
-            respondToAddress = message.from();
-            ForwardingInfo forwardTo = message.forwardTo();
-            if (forwardTo != null) forwardToLocalNodes(message, forwardTo);
-        }
-        else
-        {
-            respondToAddress = from;
-        }
+        message.payload.validateSize(MessagingService.current_version, ENTRY_OVERHEAD_SIZE);
 
+        // Check if there were any forwarding headers in this message
+        ForwardingInfo forwardTo = message.forwardTo();
+        if (forwardTo != null)
+            forwardToLocalNodes(message, forwardTo);
+
+        InetAddressAndPort respondToAddress = message.respondTo();
         try
         {
-            message.payload.applyFuture().thenAccept(o -> respond(message, respondToAddress)).exceptionally(wto -> {
-                failed();
-                return null;
-            });
+            message.payload.applyFuture().addCallback(o -> respond(message, respondToAddress), wto -> failed());
         }
         catch (WriteTimeoutException wto)
         {
diff --git a/src/java/org/apache/cassandra/db/PartitionRangeReadCommand.java b/src/java/org/apache/cassandra/db/PartitionRangeReadCommand.java
index e55ab63..f000d63 100644
--- a/src/java/org/apache/cassandra/db/PartitionRangeReadCommand.java
+++ b/src/java/org/apache/cassandra/db/PartitionRangeReadCommand.java
@@ -22,12 +22,19 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
-import org.apache.cassandra.net.Verb;
-import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
+import org.apache.cassandra.db.virtual.VirtualTable;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.filter.*;
+import org.apache.cassandra.db.filter.ClusteringIndexFilter;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.filter.DataLimits;
+import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.db.lifecycle.View;
-import org.apache.cassandra.db.partitions.*;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.partitions.CachedPartition;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterators;
 import org.apache.cassandra.db.rows.BaseRowIterator;
 import org.apache.cassandra.db.transform.RTBoundValidator;
 import org.apache.cassandra.db.transform.Transformation;
@@ -40,7 +47,9 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.metrics.TableMetrics;
+import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.schema.IndexMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.tracing.Tracing;
@@ -52,23 +61,63 @@
 {
     protected static final SelectionDeserializer selectionDeserializer = new Deserializer();
 
-    private final DataRange dataRange;
+    protected final DataRange dataRange;
 
     private PartitionRangeReadCommand(boolean isDigest,
-                                     int digestVersion,
-                                     boolean acceptsTransient,
-                                     TableMetadata metadata,
-                                     int nowInSec,
-                                     ColumnFilter columnFilter,
-                                     RowFilter rowFilter,
-                                     DataLimits limits,
-                                     DataRange dataRange,
-                                     IndexMetadata index)
+                                      int digestVersion,
+                                      boolean acceptsTransient,
+                                      TableMetadata metadata,
+                                      int nowInSec,
+                                      ColumnFilter columnFilter,
+                                      RowFilter rowFilter,
+                                      DataLimits limits,
+                                      DataRange dataRange,
+                                      IndexMetadata index,
+                                      boolean trackWarnings)
     {
-        super(Kind.PARTITION_RANGE, isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, index);
+        super(Kind.PARTITION_RANGE, isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, index, trackWarnings);
         this.dataRange = dataRange;
     }
 
+    private static PartitionRangeReadCommand create(boolean isDigest,
+                                                    int digestVersion,
+                                                    boolean acceptsTransient,
+                                                    TableMetadata metadata,
+                                                    int nowInSec,
+                                                    ColumnFilter columnFilter,
+                                                    RowFilter rowFilter,
+                                                    DataLimits limits,
+                                                    DataRange dataRange,
+                                                    IndexMetadata index,
+                                                    boolean trackWarnings)
+    {
+        if (metadata.isVirtual())
+        {
+            return new VirtualTablePartitionRangeReadCommand(isDigest,
+                                                             digestVersion,
+                                                             acceptsTransient,
+                                                             metadata,
+                                                             nowInSec,
+                                                             columnFilter,
+                                                             rowFilter,
+                                                             limits,
+                                                             dataRange,
+                                                             index,
+                                                             trackWarnings);
+        }
+        return new PartitionRangeReadCommand(isDigest,
+                                             digestVersion,
+                                             acceptsTransient,
+                                             metadata,
+                                             nowInSec,
+                                             columnFilter,
+                                             rowFilter,
+                                             limits,
+                                             dataRange,
+                                             index,
+                                             trackWarnings);
+    }
+
     public static PartitionRangeReadCommand create(TableMetadata metadata,
                                                    int nowInSec,
                                                    ColumnFilter columnFilter,
@@ -76,16 +125,17 @@
                                                    DataLimits limits,
                                                    DataRange dataRange)
     {
-        return new PartitionRangeReadCommand(false,
-                                             0,
-                                             false,
-                                             metadata,
-                                             nowInSec,
-                                             columnFilter,
-                                             rowFilter,
-                                             limits,
-                                             dataRange,
-                                             findIndex(metadata, rowFilter));
+        return create(false,
+                      0,
+                      false,
+                      metadata,
+                      nowInSec,
+                      columnFilter,
+                      rowFilter,
+                      limits,
+                      dataRange,
+                      findIndex(metadata, rowFilter),
+                      false);
     }
 
     /**
@@ -98,16 +148,17 @@
      */
     public static PartitionRangeReadCommand allDataRead(TableMetadata metadata, int nowInSec)
     {
-        return new PartitionRangeReadCommand(false,
-                                             0,
-                                             false,
-                                             metadata,
-                                             nowInSec,
-                                             ColumnFilter.all(metadata),
-                                             RowFilter.NONE,
-                                             DataLimits.NONE,
-                                             DataRange.allData(metadata.partitioner),
-                                             null);
+        return create(false,
+                      0,
+                      false,
+                      metadata,
+                      nowInSec,
+                      ColumnFilter.all(metadata),
+                      RowFilter.NONE,
+                      DataLimits.NONE,
+                      DataRange.allData(metadata.partitioner),
+                      null,
+                      false);
     }
 
     public DataRange dataRange()
@@ -147,90 +198,96 @@
         // DataLimits.CQLGroupByLimits.GroupByAwareCounter assumes that if GroupingState.hasClustering(), then we're in
         // the middle of a group, but we can't make that assumption if we query and range "in advance" of where we are
         // on the ring.
-        return new PartitionRangeReadCommand(isDigestQuery(),
-                                             digestVersion(),
-                                             acceptsTransient(),
-                                             metadata(),
-                                             nowInSec(),
-                                             columnFilter(),
-                                             rowFilter(),
-                                             isRangeContinuation ? limits() : limits().withoutState(),
-                                             dataRange().forSubRange(range),
-                                             indexMetadata());
+        return create(isDigestQuery(),
+                      digestVersion(),
+                      acceptsTransient(),
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      isRangeContinuation ? limits() : limits().withoutState(),
+                      dataRange().forSubRange(range),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     public PartitionRangeReadCommand copy()
     {
-        return new PartitionRangeReadCommand(isDigestQuery(),
-                                             digestVersion(),
-                                             acceptsTransient(),
-                                             metadata(),
-                                             nowInSec(),
-                                             columnFilter(),
-                                             rowFilter(),
-                                             limits(),
-                                             dataRange(),
-                                             indexMetadata());
+        return create(isDigestQuery(),
+                      digestVersion(),
+                      acceptsTransient(),
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      limits(),
+                      dataRange(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
     protected PartitionRangeReadCommand copyAsDigestQuery()
     {
-        return new PartitionRangeReadCommand(true,
-                                             digestVersion(),
-                                             false,
-                                             metadata(),
-                                             nowInSec(),
-                                             columnFilter(),
-                                             rowFilter(),
-                                             limits(),
-                                             dataRange(),
-                                             indexMetadata());
+        return create(true,
+                      digestVersion(),
+                      false,
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      limits(),
+                      dataRange(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
     protected PartitionRangeReadCommand copyAsTransientQuery()
     {
-        return new PartitionRangeReadCommand(false,
-                                             0,
-                                             true,
-                                             metadata(),
-                                             nowInSec(),
-                                             columnFilter(),
-                                             rowFilter(),
-                                             limits(),
-                                             dataRange(),
-                                             indexMetadata());
+        return create(false,
+                      0,
+                      true,
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      limits(),
+                      dataRange(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
     public PartitionRangeReadCommand withUpdatedLimit(DataLimits newLimits)
     {
-        return new PartitionRangeReadCommand(isDigestQuery(),
-                                             digestVersion(),
-                                             acceptsTransient(),
-                                             metadata(),
-                                             nowInSec(),
-                                             columnFilter(),
-                                             rowFilter(),
-                                             newLimits,
-                                             dataRange(),
-                                             indexMetadata());
+        return create(isDigestQuery(),
+                      digestVersion(),
+                      acceptsTransient(),
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      newLimits,
+                      dataRange(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
     public PartitionRangeReadCommand withUpdatedLimitsAndDataRange(DataLimits newLimits, DataRange newDataRange)
     {
-        return new PartitionRangeReadCommand(isDigestQuery(),
-                                             digestVersion(),
-                                             acceptsTransient(),
-                                             metadata(),
-                                             nowInSec(),
-                                             columnFilter(),
-                                             rowFilter(),
-                                             newLimits,
-                                             newDataRange,
-                                             indexMetadata());
+        return create(isDigestQuery(),
+                      digestVersion(),
+                      acceptsTransient(),
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      newLimits,
+                      newDataRange,
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     public long getTimeout(TimeUnit unit)
@@ -243,7 +300,7 @@
         return dataRange.isReversed();
     }
 
-    public PartitionIterator execute(ConsistencyLevel consistency, ClientState clientState, long queryStartNanoTime) throws RequestExecutionException
+    public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException
     {
         return StorageProxy.getRangeSlice(this, consistency, queryStartNanoTime);
     }
@@ -263,19 +320,19 @@
         InputCollector<UnfilteredPartitionIterator> inputCollector = iteratorsForRange(view, controller);
         try
         {
+            SSTableReadsListener readCountUpdater = newReadCountUpdater();
             for (Memtable memtable : view.memtables)
             {
                 @SuppressWarnings("resource") // We close on exception and on closing the result returned by this method
-                Memtable.MemtableUnfilteredPartitionIterator iter = memtable.makePartitionIterator(columnFilter(), dataRange());
-                controller.updateMinOldestUnrepairedTombstone(iter.getMinLocalDeletionTime());
+                UnfilteredPartitionIterator iter = memtable.partitionIterator(columnFilter(), dataRange(), readCountUpdater);
+                controller.updateMinOldestUnrepairedTombstone(memtable.getMinLocalDeletionTime());
                 inputCollector.addMemtableIterator(RTBoundValidator.validate(iter, RTBoundValidator.Stage.MEMTABLE, false));
             }
 
-            SSTableReadsListener readCountUpdater = newReadCountUpdater();
             for (SSTableReader sstable : view.sstables)
             {
                 @SuppressWarnings("resource") // We close on exception and on closing the result returned by this method
-                UnfilteredPartitionIterator iter = sstable.getScanner(columnFilter(), dataRange(), readCountUpdater);
+                UnfilteredPartitionIterator iter = sstable.partitionIterator(columnFilter(), dataRange(), readCountUpdater);
                 inputCollector.addSSTableIterator(sstable, RTBoundValidator.validate(iter, RTBoundValidator.Stage.SSTABLE, false));
 
                 if (!sstable.isRepaired())
@@ -358,19 +415,18 @@
 
     protected void appendCQLWhereClause(StringBuilder sb)
     {
-        if (dataRange.isUnrestricted() && rowFilter().isEmpty())
-            return;
+        String filterString = dataRange().toCQLString(metadata(), rowFilter());
+        if (!filterString.isEmpty())
+            sb.append(" WHERE ").append(filterString);
+    }
 
-        sb.append(" WHERE ");
-        // We put the row filter first because the data range can end by "ORDER BY"
-        if (!rowFilter().isEmpty())
-        {
-            sb.append(rowFilter());
-            if (!dataRange.isUnrestricted())
-                sb.append(" AND ");
-        }
-        if (!dataRange.isUnrestricted())
-            sb.append(dataRange.toCQLString(metadata()));
+    @Override
+    public String loggableTokens()
+    {
+        return "token range: " + (dataRange.keyRange.inclusiveLeft() ? '[' : '(') +
+               dataRange.keyRange.left.getToken().toString() + ", " +
+               dataRange.keyRange.right.getToken().toString() +
+               (dataRange.keyRange.inclusiveRight() ? ']' : ')');
     }
 
     /**
@@ -441,7 +497,52 @@
         throws IOException
         {
             DataRange range = DataRange.serializer.deserialize(in, version, metadata);
-            return new PartitionRangeReadCommand(isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, range, index);
+            return PartitionRangeReadCommand.create(isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, range, index, false);
+        }
+    }
+
+    public static class VirtualTablePartitionRangeReadCommand extends PartitionRangeReadCommand
+    {
+        private VirtualTablePartitionRangeReadCommand(boolean isDigest,
+                                                      int digestVersion,
+                                                      boolean acceptsTransient,
+                                                      TableMetadata metadata,
+                                                      int nowInSec,
+                                                      ColumnFilter columnFilter,
+                                                      RowFilter rowFilter,
+                                                      DataLimits limits,
+                                                      DataRange dataRange,
+                                                      IndexMetadata index,
+                                                      boolean trackWarnings)
+        {
+            super(isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, dataRange, index, trackWarnings);
+        }
+
+        @Override
+        public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException
+        {
+            return executeInternal(executionController());
+        }
+
+        @Override
+        @SuppressWarnings("resource")
+        public UnfilteredPartitionIterator executeLocally(ReadExecutionController executionController)
+        {
+            VirtualTable view = VirtualKeyspaceRegistry.instance.getTableNullable(metadata().id);
+            UnfilteredPartitionIterator resultIterator = view.select(dataRange, columnFilter());
+            return limits().filter(rowFilter().filter(resultIterator, nowInSec()), nowInSec(), selectsFullPartition());
+        }
+
+        @Override
+        public ReadExecutionController executionController()
+        {
+            return ReadExecutionController.empty();
+        }
+
+        @Override
+        public ReadExecutionController executionController(boolean trackRepairedStatus)
+        {
+            return executionController();
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/db/PartitionRangeReadQuery.java b/src/java/org/apache/cassandra/db/PartitionRangeReadQuery.java
index 12624e7..5054f32 100644
--- a/src/java/org/apache/cassandra/db/PartitionRangeReadQuery.java
+++ b/src/java/org/apache/cassandra/db/PartitionRangeReadQuery.java
@@ -38,9 +38,6 @@
                             DataLimits limits,
                             DataRange dataRange)
     {
-        if (table.isVirtual())
-            return VirtualTablePartitionRangeReadQuery.create(table, nowInSec, columnFilter, rowFilter, limits, dataRange);
-
         return PartitionRangeReadCommand.create(table, nowInSec, columnFilter, rowFilter, limits, dataRange);
     }
 
diff --git a/src/java/org/apache/cassandra/db/ReadCommand.java b/src/java/org/apache/cassandra/db/ReadCommand.java
index d3aef4c..358d408 100644
--- a/src/java/org/apache/cassandra/db/ReadCommand.java
+++ b/src/java/org/apache/cassandra/db/ReadCommand.java
@@ -33,9 +33,11 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import io.netty.util.concurrent.FastThreadLocal;
 import org.apache.cassandra.config.*;
 import org.apache.cassandra.db.filter.*;
 import org.apache.cassandra.net.MessageFlag;
+import org.apache.cassandra.net.ParamType;
 import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.db.partitions.*;
 import org.apache.cassandra.db.rows.*;
@@ -65,10 +67,13 @@
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.ObjectSizes;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static com.google.common.collect.Iterables.any;
 import static com.google.common.collect.Iterables.filter;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 import static org.apache.cassandra.db.partitions.UnfilteredPartitionIterators.MergeListener.NOOP;
 
 /**
@@ -84,6 +89,10 @@
     protected static final Logger logger = LoggerFactory.getLogger(ReadCommand.class);
     public static final IVersionedSerializer<ReadCommand> serializer = new Serializer();
 
+    // Expose the active command running so transitive calls can lookup this command.
+    // This is useful for a few reasons, but mainly because the CQL query is here.
+    private static final FastThreadLocal<ReadCommand> COMMAND = new FastThreadLocal<>();
+
     private final Kind kind;
 
     private final boolean isDigestQuery;
@@ -91,6 +100,8 @@
     // if a digest query, the version for which the digest is expected. Ignored if not a digest.
     private int digestVersion;
 
+    private boolean trackWarnings;
+
     @Nullable
     private final IndexMetadata index;
 
@@ -131,7 +142,8 @@
                           ColumnFilter columnFilter,
                           RowFilter rowFilter,
                           DataLimits limits,
-                          IndexMetadata index)
+                          IndexMetadata index,
+                          boolean trackWarnings)
     {
         super(metadata, nowInSec, columnFilter, rowFilter, limits);
         if (acceptsTransient && isDigestQuery)
@@ -142,6 +154,12 @@
         this.digestVersion = digestVersion;
         this.acceptsTransient = acceptsTransient;
         this.index = index;
+        this.trackWarnings = trackWarnings;
+    }
+
+    public static ReadCommand getCommand()
+    {
+        return COMMAND.get();
     }
 
     protected abstract void serializeSelection(DataOutputPlus out, int version) throws IOException;
@@ -211,6 +229,17 @@
         return acceptsTransient;
     }
 
+    @Override
+    public void trackWarnings()
+    {
+        trackWarnings = true;
+    }
+
+    public boolean isTrackingWarnings()
+    {
+        return trackWarnings;
+    }
+
     /**
      * Index (metadata) chosen for this query. Can be null.
      *
@@ -308,6 +337,16 @@
                : ReadResponse.createDataResponse(iterator, this, rdi);
     }
 
+    @SuppressWarnings("resource") // We don't need to close an empty iterator.
+    public ReadResponse createEmptyResponse()
+    {
+        UnfilteredPartitionIterator iterator = EmptyIterators.unfilteredPartition(metadata());
+        
+        return isDigestQuery()
+               ? ReadResponse.createDigestResponse(iterator, this)
+               : ReadResponse.createDataResponse(iterator, this, RepairedDataInfo.NO_OP_REPAIRED_DATA_INFO);
+    }
+
     long indexSerializedSize(int version)
     {
         return null != index
@@ -359,68 +398,77 @@
                                   // iterators created inside the try as long as we do close the original resultIterator), or by closing the result.
     public UnfilteredPartitionIterator executeLocally(ReadExecutionController executionController)
     {
-        long startTimeNanos = System.nanoTime();
+        long startTimeNanos = nanoTime();
 
-        ColumnFamilyStore cfs = Keyspace.openAndGetStore(metadata());
-        Index index = getIndex(cfs);
-
-        Index.Searcher searcher = null;
-        if (index != null)
-        {
-            if (!cfs.indexManager.isIndexQueryable(index))
-                throw new IndexNotAvailableException(index);
-
-            searcher = index.searcherFor(this);
-            Tracing.trace("Executing read on {}.{} using index {}", cfs.metadata.keyspace, cfs.metadata.name, index.getIndexMetadata().name);
-        }
-
-        UnfilteredPartitionIterator iterator = (null == searcher) ? queryStorage(cfs, executionController) : searcher.search(executionController);
-        iterator = RTBoundValidator.validate(iterator, Stage.MERGED, false);
-
+        COMMAND.set(this);
         try
         {
-            iterator = withStateTracking(iterator);
-            iterator = RTBoundValidator.validate(withoutPurgeableTombstones(iterator, cfs, executionController), Stage.PURGED, false);
-            iterator = withMetricsRecording(iterator, cfs.metric, startTimeNanos);
+            ColumnFamilyStore cfs = Keyspace.openAndGetStore(metadata());
+            Index index = getIndex(cfs);
 
-            // If we've used a 2ndary index, we know the result already satisfy the primary expression used, so
-            // no point in checking it again.
-            RowFilter filter = (null == searcher) ? rowFilter() : index.getPostIndexQueryFilter(rowFilter());
-
-            /*
-             * TODO: We'll currently do filtering by the rowFilter here because it's convenient. However,
-             * we'll probably want to optimize by pushing it down the layer (like for dropped columns) as it
-             * would be more efficient (the sooner we discard stuff we know we don't care, the less useless
-             * processing we do on it).
-             */
-            iterator = filter.filter(iterator, nowInSec());
-
-            // apply the limits/row counter; this transformation is stopping and would close the iterator as soon
-            // as the count is observed; if that happens in the middle of an open RT, its end bound will not be included.
-            // If tracking repaired data, the counter is needed for overreading repaired data, otherwise we can
-            // optimise the case where this.limit = DataLimits.NONE which skips an unnecessary transform
-            if (executionController.isTrackingRepairedStatus())
+            Index.Searcher searcher = null;
+            if (index != null)
             {
-                DataLimits.Counter limit =
+                if (!cfs.indexManager.isIndexQueryable(index))
+                    throw new IndexNotAvailableException(index);
+
+                searcher = index.searcherFor(this);
+                Tracing.trace("Executing read on {}.{} using index {}", cfs.metadata.keyspace, cfs.metadata.name, index.getIndexMetadata().name);
+            }
+
+            UnfilteredPartitionIterator iterator = (null == searcher) ? queryStorage(cfs, executionController) : searcher.search(executionController);
+            iterator = RTBoundValidator.validate(iterator, Stage.MERGED, false);
+
+            try
+            {
+                iterator = withQuerySizeTracking(iterator);
+                iterator = withStateTracking(iterator);
+                iterator = RTBoundValidator.validate(withoutPurgeableTombstones(iterator, cfs, executionController), Stage.PURGED, false);
+                iterator = withMetricsRecording(iterator, cfs.metric, startTimeNanos);
+
+                // If we've used a 2ndary index, we know the result already satisfy the primary expression used, so
+                // no point in checking it again.
+                RowFilter filter = (null == searcher) ? rowFilter() : index.getPostIndexQueryFilter(rowFilter());
+
+                /*
+                 * TODO: We'll currently do filtering by the rowFilter here because it's convenient. However,
+                 * we'll probably want to optimize by pushing it down the layer (like for dropped columns) as it
+                 * would be more efficient (the sooner we discard stuff we know we don't care, the less useless
+                 * processing we do on it).
+                 */
+                iterator = filter.filter(iterator, nowInSec());
+
+                // apply the limits/row counter; this transformation is stopping and would close the iterator as soon
+                // as the count is observed; if that happens in the middle of an open RT, its end bound will not be included.
+                // If tracking repaired data, the counter is needed for overreading repaired data, otherwise we can
+                // optimise the case where this.limit = DataLimits.NONE which skips an unnecessary transform
+                if (executionController.isTrackingRepairedStatus())
+                {
+                    DataLimits.Counter limit =
                     limits().newCounter(nowInSec(), false, selectsFullPartition(), metadata().enforceStrictLiveness());
-                iterator = limit.applyTo(iterator);
-                // ensure that a consistent amount of repaired data is read on each replica. This causes silent
-                // overreading from the repaired data set, up to limits(). The extra data is not visible to
-                // the caller, only iterated to produce the repaired data digest.
-                iterator = executionController.getRepairedDataInfo().extend(iterator, limit);
-            }
-            else
-            {
-                iterator = limits().filter(iterator, nowInSec(), selectsFullPartition());
-            }
+                    iterator = limit.applyTo(iterator);
+                    // ensure that a consistent amount of repaired data is read on each replica. This causes silent
+                    // overreading from the repaired data set, up to limits(). The extra data is not visible to
+                    // the caller, only iterated to produce the repaired data digest.
+                    iterator = executionController.getRepairedDataInfo().extend(iterator, limit);
+                }
+                else
+                {
+                    iterator = limits().filter(iterator, nowInSec(), selectsFullPartition());
+                }
 
-            // because of the above, we need to append an aritifical end bound if the source iterator was stopped short by a counter.
-            return RTBoundCloser.close(iterator);
+                // because of the above, we need to append an aritifical end bound if the source iterator was stopped short by a counter.
+                return RTBoundCloser.close(iterator);
+            }
+            catch (RuntimeException | Error e)
+            {
+                iterator.close();
+                throw e;
+            }
         }
-        catch (RuntimeException | Error e)
+        finally
         {
-            iterator.close();
-            throw e;
+            COMMAND.set(null);
         }
     }
 
@@ -509,6 +557,11 @@
                     String query = ReadCommand.this.toCQLString();
                     Tracing.trace("Scanned over {} tombstones for query {}; query aborted (see tombstone_failure_threshold)", failureThreshold, query);
                     metric.tombstoneFailures.inc();
+                    if (trackWarnings)
+                    {
+                        MessageParams.remove(ParamType.TOMBSTONE_WARNING);
+                        MessageParams.add(ParamType.TOMBSTONE_FAIL, tombstones);
+                    }
                     throw new TombstoneOverwhelmingException(tombstones, query, ReadCommand.this.metadata(), currentKey, clustering);
                 }
             }
@@ -516,7 +569,7 @@
             @Override
             public void onClose()
             {
-                recordLatency(metric, System.nanoTime() - startTimeNanos);
+                recordLatency(metric, nanoTime() - startTimeNanos);
 
                 metric.tombstoneScannedHistogram.update(tombstones);
                 metric.liveScannedHistogram.update(liveRows);
@@ -527,7 +580,10 @@
                     String msg = String.format(
                             "Read %d live rows and %d tombstone cells for query %1.512s; token %s (see tombstone_warn_threshold)",
                             liveRows, tombstones, ReadCommand.this.toCQLString(), currentKey.getToken());
-                    ClientWarn.instance.warn(msg);
+                    if (trackWarnings)
+                        MessageParams.add(ParamType.TOMBSTONE_WARNING, tombstones);
+                    else
+                        ClientWarn.instance.warn(msg);
                     if (tombstones < failureThreshold)
                     {
                         metric.tombstoneWarnings.inc();
@@ -597,6 +653,90 @@
         }
     }
 
+    private boolean shouldTrackSize(DataStorageSpec.LongBytesBound warnThresholdBytes, DataStorageSpec.LongBytesBound abortThresholdBytes)
+    {
+        return trackWarnings
+               && !SchemaConstants.isSystemKeyspace(metadata().keyspace)
+               && !(warnThresholdBytes == null && abortThresholdBytes == null);
+    }
+
+    private UnfilteredPartitionIterator withQuerySizeTracking(UnfilteredPartitionIterator iterator)
+    {
+        DataStorageSpec.LongBytesBound warnThreshold = DatabaseDescriptor.getLocalReadSizeWarnThreshold();
+        DataStorageSpec.LongBytesBound failThreshold = DatabaseDescriptor.getLocalReadSizeFailThreshold();
+        if (!shouldTrackSize(warnThreshold, failThreshold))
+            return iterator;
+        final long warnBytes = warnThreshold == null ? -1 : warnThreshold.toBytes();
+        final long failBytes = failThreshold == null ? -1 : failThreshold.toBytes();
+        class QuerySizeTracking extends Transformation<UnfilteredRowIterator>
+        {
+            private long sizeInBytes = 0;
+
+            @Override
+            public UnfilteredRowIterator applyToPartition(UnfilteredRowIterator iter)
+            {
+                sizeInBytes += ObjectSizes.sizeOnHeapOf(iter.partitionKey().getKey());
+                return Transformation.apply(iter, this);
+            }
+
+            @Override
+            protected Row applyToStatic(Row row)
+            {
+                return applyToRow(row);
+            }
+
+            @Override
+            protected Row applyToRow(Row row)
+            {
+                addSize(row.unsharedHeapSize());
+                return row;
+            }
+
+            @Override
+            protected RangeTombstoneMarker applyToMarker(RangeTombstoneMarker marker)
+            {
+                addSize(marker.unsharedHeapSize());
+                return marker;
+            }
+
+            @Override
+            protected DeletionTime applyToDeletion(DeletionTime deletionTime)
+            {
+                addSize(deletionTime.unsharedHeapSize());
+                return deletionTime;
+            }
+
+            private void addSize(long size)
+            {
+                this.sizeInBytes += size;
+                if (failBytes != -1 && this.sizeInBytes >= failBytes)
+                {
+                    String msg = String.format("Query %s attempted to read %d bytes but max allowed is %s; query aborted  (see local_read_size_fail_threshold)",
+                                               ReadCommand.this.toCQLString(), this.sizeInBytes, failThreshold);
+                    Tracing.trace(msg);
+                    MessageParams.remove(ParamType.LOCAL_READ_SIZE_WARN);
+                    MessageParams.add(ParamType.LOCAL_READ_SIZE_FAIL, this.sizeInBytes);
+                    throw new LocalReadSizeTooLargeException(msg);
+                }
+                else if (warnBytes != -1 && this.sizeInBytes >= warnBytes)
+                {
+                    MessageParams.add(ParamType.LOCAL_READ_SIZE_WARN, this.sizeInBytes);
+                }
+            }
+
+            @Override
+            protected void onClose()
+            {
+                ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(metadata().id);
+                if (cfs != null)
+                    cfs.metric.localReadSize.update(sizeInBytes);
+            }
+        }
+
+        iterator = Transformation.apply(iterator, new QuerySizeTracking());
+        return iterator;
+    }
+
     protected UnfilteredPartitionIterator withStateTracking(UnfilteredPartitionIterator iter)
     {
         return Transformation.apply(iter, new CheckForAbort());
@@ -607,9 +747,12 @@
      */
     public Message<ReadCommand> createMessage(boolean trackRepairedData)
     {
-        return trackRepairedData
-             ? Message.outWithFlags(verb(), this, MessageFlag.CALL_BACK_ON_FAILURE, MessageFlag.TRACK_REPAIRED_DATA)
-             : Message.outWithFlag (verb(), this, MessageFlag.CALL_BACK_ON_FAILURE);
+        Message<ReadCommand> msg = trackRepairedData
+                                   ? Message.outWithFlags(verb(), this, MessageFlag.CALL_BACK_ON_FAILURE, MessageFlag.TRACK_REPAIRED_DATA)
+                                   : Message.outWithFlag(verb(), this, MessageFlag.CALL_BACK_ON_FAILURE);
+        if (trackWarnings)
+            msg = msg.withFlag(MessageFlag.TRACK_WARNINGS);
+        return msg;
     }
 
     public abstract Verb verb();
@@ -641,25 +784,9 @@
     }
 
     /**
-     * Recreate the CQL string corresponding to this query.
-     * <p>
-     * Note that in general the returned string will not be exactly the original user string, first
-     * because there isn't always a single syntax for a given query,  but also because we don't have
-     * all the information needed (we know the non-PK columns queried but not the PK ones as internally
-     * we query them all). So this shouldn't be relied too strongly, but this should be good enough for
-     * debugging purpose which is what this is for.
+     * Return the queried token(s) for logging
      */
-    public String toCQLString()
-    {
-        StringBuilder sb = new StringBuilder();
-        sb.append("SELECT ").append(columnFilter().toCQLString());
-        sb.append(" FROM ").append(metadata().keyspace).append('.').append(metadata().name);
-        appendCQLWhereClause(sb);
-
-        if (limits() != DataLimits.NONE)
-            sb.append(' ').append(limits());
-        return sb.toString();
-    }
+    public abstract String loggableTokens();
 
     // Monitorable interface
     public String name()
@@ -800,7 +927,7 @@
             if (!isTrackingRepairedStatus)
                 return false;
 
-            UUID pendingRepair = sstable.getPendingRepair();
+            TimeUUID pendingRepair = sstable.getPendingRepair();
             if (pendingRepair != ActiveRepairService.NO_PENDING_REPAIR)
             {
                 if (ActiveRepairService.instance.consistent.local.isSessionFinalized(pendingRepair))
@@ -927,7 +1054,7 @@
             int nowInSec = in.readInt();
             ColumnFilter columnFilter = ColumnFilter.serializer.deserialize(in, version, metadata);
             RowFilter rowFilter = RowFilter.serializer.deserialize(in, version, metadata);
-            DataLimits limits = DataLimits.serializer.deserialize(in, version,  metadata.comparator);
+            DataLimits limits = DataLimits.serializer.deserialize(in, version,  metadata);
             IndexMetadata index = hasIndex ? deserializeIndexMetadata(in, version, metadata) : null;
 
             return kind.selectionDeserializer.deserialize(in, version, isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, index);
diff --git a/src/java/org/apache/cassandra/db/ReadCommandVerbHandler.java b/src/java/org/apache/cassandra/db/ReadCommandVerbHandler.java
index a86852f..9226568 100644
--- a/src/java/org/apache/cassandra/db/ReadCommandVerbHandler.java
+++ b/src/java/org/apache/cassandra/db/ReadCommandVerbHandler.java
@@ -48,16 +48,35 @@
 
         ReadCommand command = message.payload;
         validateTransientStatus(message);
+        MessageParams.reset();
 
         long timeout = message.expiresAtNanos() - message.createdAtNanos();
         command.setMonitoringTime(message.createdAtNanos(), message.isCrossNode(), timeout, DatabaseDescriptor.getSlowQueryTimeout(NANOSECONDS));
 
+        if (message.trackWarnings())
+            command.trackWarnings();
+
         ReadResponse response;
         try (ReadExecutionController controller = command.executionController(message.trackRepairedData());
              UnfilteredPartitionIterator iterator = command.executeLocally(controller))
         {
             response = command.createResponse(iterator, controller.getRepairedDataInfo());
         }
+        catch (RejectException e)
+        {
+            if (!command.isTrackingWarnings())
+                throw e;
+
+            // make sure to log as the exception is swallowed
+            logger.error(e.getMessage());
+
+            response = command.createEmptyResponse();
+            Message<ReadResponse> reply = message.responseWith(response);
+            reply = MessageParams.addToMessage(reply);
+
+            MessagingService.instance().send(reply, message.from());
+            return;
+        }
 
         if (!command.complete())
         {
@@ -68,12 +87,15 @@
 
         Tracing.trace("Enqueuing response to {}", message.from());
         Message<ReadResponse> reply = message.responseWith(response);
+        reply = MessageParams.addToMessage(reply);
         MessagingService.instance().send(reply, message.from());
     }
 
     private void validateTransientStatus(Message<ReadCommand> message)
     {
         ReadCommand command = message.payload;
+        if (command.metadata().isVirtual())
+            return;
         Token token;
 
         if (command instanceof SinglePartitionReadCommand)
diff --git a/src/java/org/apache/cassandra/db/ReadExecutionController.java b/src/java/org/apache/cassandra/db/ReadExecutionController.java
index 5bcd84b..2fbe3ac 100644
--- a/src/java/org/apache/cassandra/db/ReadExecutionController.java
+++ b/src/java/org/apache/cassandra/db/ReadExecutionController.java
@@ -28,7 +28,7 @@
 import org.apache.cassandra.utils.MonotonicClock;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 
-import static org.apache.cassandra.utils.MonotonicClock.preciseTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.preciseTime;
 
 public class ReadExecutionController implements AutoCloseable
 {
diff --git a/src/java/org/apache/cassandra/db/ReadQuery.java b/src/java/org/apache/cassandra/db/ReadQuery.java
index bd20c26..55a2cf6 100644
--- a/src/java/org/apache/cassandra/db/ReadQuery.java
+++ b/src/java/org/apache/cassandra/db/ReadQuery.java
@@ -48,7 +48,7 @@
                 return ReadExecutionController.empty();
             }
 
-            public PartitionIterator execute(ConsistencyLevel consistency, ClientState clientState, long queryStartNanoTime) throws RequestExecutionException
+            public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException
             {
                 return EmptyIterators.partition();
             }
@@ -140,12 +140,10 @@
      * Executes the query at the provided consistency level.
      *
      * @param consistency the consistency level to achieve for the query.
-     * @param clientState the {@code ClientState} for the query. In practice, this can be null unless
-     * {@code consistency} is a serial consistency.
-     *
+     * @param state client state
      * @return the result of the query.
      */
-    public PartitionIterator execute(ConsistencyLevel consistency, ClientState clientState, long queryStartNanoTime) throws RequestExecutionException;
+    public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException;
 
     /**
      * Execute the query for internal queries (that is, it basically executes the query locally).
@@ -254,4 +252,8 @@
     default void maybeValidateIndex()
     {
     }
+
+    default void trackWarnings()
+    {
+    }
 }
diff --git a/src/java/org/apache/cassandra/db/ReadResponse.java b/src/java/org/apache/cassandra/db/ReadResponse.java
index 52e6fd5..9ef9128 100644
--- a/src/java/org/apache/cassandra/db/ReadResponse.java
+++ b/src/java/org/apache/cassandra/db/ReadResponse.java
@@ -48,6 +48,11 @@
         return new LocalDataResponse(data, command, rdi);
     }
 
+    public static ReadResponse createSimpleDataResponse(UnfilteredPartitionIterator data, ColumnFilter selection)
+    {
+        return new LocalDataResponse(data, selection);
+    }
+
     @VisibleForTesting
     public static ReadResponse createRemoteDataResponse(UnfilteredPartitionIterator data,
                                                         ByteBuffer repairedDataDigest,
@@ -184,6 +189,11 @@
                   DeserializationHelper.Flag.LOCAL);
         }
 
+        private LocalDataResponse(UnfilteredPartitionIterator iter, ColumnFilter selection)
+        {
+            super(build(iter, selection), null, false, MessagingService.current_version, DeserializationHelper.Flag.LOCAL);
+        }
+
         private static ByteBuffer build(UnfilteredPartitionIterator iter, ColumnFilter selection)
         {
             try (DataOutputBuffer buffer = new DataOutputBuffer())
diff --git a/src/java/org/apache/cassandra/db/RejectException.java b/src/java/org/apache/cassandra/db/RejectException.java
new file mode 100644
index 0000000..a879b76
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/RejectException.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.db;
+
+/**
+ * Represents a request to reject the current operation
+ */
+public abstract class RejectException extends RuntimeException
+{
+    public RejectException(String message)
+    {
+        super(message);
+    }
+
+    public RejectException(String message, Throwable cause)
+    {
+        super(message, cause);
+    }
+
+    public RejectException(Throwable cause)
+    {
+        super(cause);
+    }
+
+    public RejectException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace)
+    {
+        super(message, cause, enableSuppression, writableStackTrace);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/RepairedDataInfo.java b/src/java/org/apache/cassandra/db/RepairedDataInfo.java
index f80b113..32a4061 100644
--- a/src/java/org/apache/cassandra/db/RepairedDataInfo.java
+++ b/src/java/org/apache/cassandra/db/RepairedDataInfo.java
@@ -36,6 +36,8 @@
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 @NotThreadSafe
 class RepairedDataInfo
 {
@@ -281,7 +283,7 @@
                     return null;
 
                 long countBeforeOverreads = repairedCounter.counted();
-                long overreadStartTime = System.nanoTime();
+                long overreadStartTime = nanoTime();
                 if (currentPartition != null)
                     consumePartition(currentPartition, repairedCounter);
 
@@ -291,7 +293,7 @@
 
                 // we're not actually providing any more rows, just consuming the repaired data
                 long rows = repairedCounter.counted() - countBeforeOverreads;
-                long nanos = System.nanoTime() - overreadStartTime;
+                long nanos = nanoTime() - overreadStartTime;
                 metrics.repairedDataTrackingOverreadRows.update(rows);
                 metrics.repairedDataTrackingOverreadTime.update(nanos, TimeUnit.NANOSECONDS);
                 Tracing.trace("Read {} additional rows of repaired data for tracking in {}ps", rows, TimeUnit.NANOSECONDS.toMicros(nanos));
diff --git a/src/java/org/apache/cassandra/db/RowIndexEntry.java b/src/java/org/apache/cassandra/db/RowIndexEntry.java
index 215768b..80f53a9 100644
--- a/src/java/org/apache/cassandra/db/RowIndexEntry.java
+++ b/src/java/org/apache/cassandra/db/RowIndexEntry.java
@@ -23,7 +23,9 @@
 
 import com.codahale.metrics.Histogram;
 import org.apache.cassandra.cache.IMeasurableMemory;
+import org.apache.cassandra.config.DataStorageSpec;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.filter.RowIndexEntryReadSizeTooLargeException;
 import org.apache.cassandra.io.ISerializer;
 import org.apache.cassandra.io.sstable.IndexInfo;
 import org.apache.cassandra.io.sstable.format.Version;
@@ -36,6 +38,9 @@
 import org.apache.cassandra.io.util.TrackedDataInputPlus;
 import org.apache.cassandra.metrics.DefaultNameFactory;
 import org.apache.cassandra.metrics.MetricNameFactory;
+import org.apache.cassandra.net.ParamType;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.vint.VIntCoding;
 import org.github.jamm.Unmetered;
@@ -72,7 +77,7 @@
  *     samples</i> (list of {@link IndexInfo} objects) and those who don't.
  *     For each <i>portion</i> of data for a single partition in the data file,
  *     an index sample is created. The size of that <i>portion</i> is defined
- *     by {@link org.apache.cassandra.config.Config#column_index_size_in_kb}.
+ *     by {@link org.apache.cassandra.config.Config#column_index_size}.
  * </p>
  * <p>
  *     Index entries with less than 2 index samples, will just store the
@@ -93,9 +98,9 @@
  *     "acceptable" amount of index samples per partition and those
  *     with an "enormous" amount of index samples. The barrier
  *     is controlled by the configuration parameter
- *     {@link org.apache.cassandra.config.Config#column_index_cache_size_in_kb}.
+ *     {@link org.apache.cassandra.config.Config#column_index_cache_size}.
  *     Index entries with a total serialized size of index samples up to
- *     {@code column_index_cache_size_in_kb} will be held in an array.
+ *     {@code column_index_cache_size} will be held in an array.
  *     Index entries exceeding that value will always be accessed from
  *     disk.
  * </p>
@@ -106,9 +111,9 @@
  *     <li>{@link RowIndexEntry} just stores the offset in the data file.</li>
  *     <li>{@link IndexedEntry} is for index entries with index samples
  *     and used for both current and legacy sstables, which do not exceed
- *     {@link org.apache.cassandra.config.Config#column_index_cache_size_in_kb}.</li>
+ *     {@link org.apache.cassandra.config.Config#column_index_cache_size}.</li>
  *     <li>{@link ShallowIndexedEntry} is for index entries with index samples
- *     that exceed {@link org.apache.cassandra.config.Config#column_index_cache_size_in_kb}
+ *     that exceed {@link org.apache.cassandra.config.Config#column_index_cache_size}
  *     for sstables with an offset table to the index samples.</li>
  * </ul>
  * <p>
@@ -189,7 +194,7 @@
      * @param headerLength      deletion time of {@link RowIndexEntry}
      * @param columnIndexCount  number of {@link IndexInfo} entries in the {@link RowIndexEntry}
      * @param indexedPartSize   serialized size of all serialized {@link IndexInfo} objects and their offsets
-     * @param indexSamples      list with IndexInfo offsets (if total serialized size is less than {@link org.apache.cassandra.config.Config#column_index_cache_size_in_kb}
+     * @param indexSamples      list with IndexInfo offsets (if total serialized size is less than {@link org.apache.cassandra.config.Config#column_index_cache_size}
      * @param offsets           offsets of IndexInfo offsets
      * @param idxInfoSerializer the {@link IndexInfo} serializer
      */
@@ -201,14 +206,14 @@
     {
         // If the "partition building code" in BigTableWriter.append() via ColumnIndex returns a list
         // of IndexInfo objects, which is the case if the serialized size is less than
-        // Config.column_index_cache_size_in_kb, AND we have more than one IndexInfo object, we
+        // Config.column_index_cache_size, AND we have more than one IndexInfo object, we
         // construct an IndexedEntry object. (note: indexSamples.size() and columnIndexCount have the same meaning)
         if (indexSamples != null && indexSamples.size() > 1)
             return new IndexedEntry(dataFilePosition, deletionTime, headerLength,
                                     indexSamples.toArray(new IndexInfo[indexSamples.size()]), offsets,
                                     indexedPartSize, idxInfoSerializer);
         // Here we have to decide whether we have serialized IndexInfo objects that exceeds
-        // Config.column_index_cache_size_in_kb (not exceeding case covered above).
+        // Config.column_index_cache_size (not exceeding case covered above).
         // Such a "big" indexed-entry is represented as a shallow one.
         if (columnIndexCount > 1)
             return new ShallowIndexedEntry(dataFilePosition, indexFilePosition,
@@ -324,6 +329,8 @@
                 DeletionTime deletionTime = DeletionTime.serializer.deserialize(in);
                 int columnsIndexCount = (int) in.readUnsignedVInt();
 
+                checkSize(columnsIndexCount, size);
+
                 int indexedPartSize = size - serializedSize(deletionTime, headerLength, columnsIndexCount);
 
                 if (size <= DatabaseDescriptor.getColumnIndexCacheSize())
@@ -343,6 +350,51 @@
             }
         }
 
+        private void checkSize(int entries, int bytes)
+        {
+            ReadCommand command = ReadCommand.getCommand();
+            if (command == null || SchemaConstants.isSystemKeyspace(command.metadata().keyspace) || !DatabaseDescriptor.getReadThresholdsEnabled())
+                return;
+
+            DataStorageSpec.LongBytesBound warnThreshold = DatabaseDescriptor.getRowIndexReadSizeWarnThreshold();
+            DataStorageSpec.LongBytesBound failThreshold = DatabaseDescriptor.getRowIndexReadSizeFailThreshold();
+            if (warnThreshold == null && failThreshold == null)
+                return;
+
+            long estimatedMemory = estimateMaterializedIndexSize(entries, bytes);
+            ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(command.metadata().id);
+            if (cfs != null)
+                cfs.metric.rowIndexSize.update(estimatedMemory);
+
+            if (failThreshold != null && estimatedMemory > failThreshold.toBytes())
+            {
+                String msg = String.format("Query %s attempted to access a large RowIndexEntry estimated to be %d bytes " +
+                                           "in-memory (total entries: %d, total bytes: %d) but the max allowed is %s;" +
+                                           " query aborted  (see row_index_read_size_fail_threshold)",
+                                           command.toCQLString(), estimatedMemory, entries, bytes, failThreshold);
+                MessageParams.remove(ParamType.ROW_INDEX_READ_SIZE_WARN);
+                MessageParams.add(ParamType.ROW_INDEX_READ_SIZE_FAIL, estimatedMemory);
+
+                throw new RowIndexEntryReadSizeTooLargeException(msg);
+            }
+            else if (warnThreshold != null && estimatedMemory > warnThreshold.toBytes())
+            {
+                // use addIfLarger rather than add as a previous partition may be larger than this one
+                Long current = MessageParams.get(ParamType.ROW_INDEX_READ_SIZE_WARN);
+                if (current == null || current.compareTo(estimatedMemory) < 0)
+                    MessageParams.add(ParamType.ROW_INDEX_READ_SIZE_WARN, estimatedMemory);
+            }
+        }
+
+        private static long estimateMaterializedIndexSize(int entries, int bytes)
+        {
+            long overhead = IndexInfo.EMPTY_SIZE
+                            + ArrayClustering.EMPTY_SIZE
+                            + DeletionTime.EMPTY_SIZE;
+
+            return (overhead * entries) + bytes;
+        }
+
         public long deserializePositionAndSkip(DataInputPlus in) throws IOException
         {
             long position = in.readUnsignedVInt();
diff --git a/src/java/org/apache/cassandra/db/SSTableImporter.java b/src/java/org/apache/cassandra/db/SSTableImporter.java
index 989ff12..5949559 100644
--- a/src/java/org/apache/cassandra/db/SSTableImporter.java
+++ b/src/java/org/apache/cassandra/db/SSTableImporter.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -29,6 +28,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/src/java/org/apache/cassandra/db/SchemaCQLHelper.java b/src/java/org/apache/cassandra/db/SchemaCQLHelper.java
index 5d83a2b..b959ebc 100644
--- a/src/java/org/apache/cassandra/db/SchemaCQLHelper.java
+++ b/src/java/org/apache/cassandra/db/SchemaCQLHelper.java
@@ -19,6 +19,7 @@
 package org.apache.cassandra.db;
 
 import java.nio.ByteBuffer;
+import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Stream;
@@ -41,39 +42,15 @@
     /**
      * Generates the DDL statement for a {@code schema.cql} snapshot file.
      */
-    public static Stream<String> reCreateStatementsForSchemaCql(TableMetadata metadata, Types types)
+    public static Stream<String> reCreateStatementsForSchemaCql(TableMetadata metadata, KeyspaceMetadata keyspaceMetadata)
     {
         // Types come first, as table can't be created without them
-        Stream<String> udts = SchemaCQLHelper.getUserTypesAsCQL(metadata, types, true);
+        Stream<String> udts = SchemaCQLHelper.getUserTypesAsCQL(metadata, keyspaceMetadata.types, true);
 
-        return Stream.concat(udts,
-                             reCreateStatements(metadata,
-                                                true,
-                                                true,
-                                                true,
-                                                true));
-    }
+        Stream<String> tableMatadata = Stream.of(SchemaCQLHelper.getTableMetadataAsCQL(metadata, keyspaceMetadata));
 
-    public static Stream<String> reCreateStatements(TableMetadata metadata,
-                                                    boolean includeDroppedColumns,
-                                                    boolean internals,
-                                                    boolean ifNotExists,
-                                                    boolean includeIndexes)
-    {
-        // Record re-create schema statements
-        Stream<String> r = Stream.of(metadata)
-                                         .map((tm) -> SchemaCQLHelper.getTableMetadataAsCQL(tm,
-                                                                                            includeDroppedColumns,
-                                                                                            internals,
-                                                                                            ifNotExists));
-
-        if (includeIndexes)
-        {
-            // Indexes applied as last, since otherwise they may interfere with column drops / re-additions
-            r = Stream.concat(r, SchemaCQLHelper.getIndexesAsCQL(metadata, ifNotExists));
-        }
-
-        return r;
+        Stream<String> indexes = SchemaCQLHelper.getIndexesAsCQL(metadata, true);
+        return Stream.of(udts, tableMatadata, indexes).flatMap(Function.identity());
     }
 
     /**
@@ -83,20 +60,24 @@
      * that will not contain everything needed for user types.
      */
     @VisibleForTesting
-    public static String getTableMetadataAsCQL(TableMetadata metadata,
-                                               boolean includeDroppedColumns,
-                                               boolean internals,
-                                               boolean ifNotExists)
+    public static String getTableMetadataAsCQL(TableMetadata metadata, KeyspaceMetadata keyspaceMetadata)
     {
         if (metadata.isView())
         {
-            KeyspaceMetadata keyspaceMetadata = Schema.instance.getKeyspaceMetadata(metadata.keyspace);
             ViewMetadata viewMetadata = keyspaceMetadata.views.get(metadata.name).orElse(null);
             assert viewMetadata != null;
-            return viewMetadata.toCqlString(internals, ifNotExists);
+            /*
+             * first argument(withInternals) indicates to include table metadata id and clustering columns order,
+             * second argument(ifNotExists) instructs to include IF NOT EXISTS statement within creation statements.
+             */
+            return viewMetadata.toCqlString(true, true);
         }
 
-        return metadata.toCqlString(includeDroppedColumns, internals, ifNotExists);
+        /*
+         * With addition to withInternals and ifNotExists arguments, includeDroppedColumns will include dropped
+         * columns as ALTER TABLE statements appended into the snapshot.
+         */
+        return metadata.toCqlString(true, true, true);
     }
 
     /**
@@ -162,7 +143,7 @@
     private static UserType getType(TableMetadata metadata, Types types, ByteBuffer name)
     {
         return types.get(name)
-                    .orElseThrow(() -> new IllegalStateException(String.format("user type %s is part of table %s definition but its definition was missing", 
+                    .orElseThrow(() -> new IllegalStateException(String.format("user type %s is part of table %s definition but its definition was missing",
                                                                               UTF8Type.instance.getString(name),
                                                                               metadata)));
     }
diff --git a/src/java/org/apache/cassandra/db/SerializationHeader.java b/src/java/org/apache/cassandra/db/SerializationHeader.java
index 1c22feb..11239d8 100644
--- a/src/java/org/apache/cassandra/db/SerializationHeader.java
+++ b/src/java/org/apache/cassandra/db/SerializationHeader.java
@@ -105,7 +105,7 @@
             return sstables;
 
         List<SSTableReader> readers = new ArrayList<>(sstables);
-        readers.sort(SSTableReader.generationReverseComparator);
+        readers.sort(SSTableReader.idReverseComparator);
         return readers;
     }
 
diff --git a/src/java/org/apache/cassandra/db/SimpleBuilders.java b/src/java/org/apache/cassandra/db/SimpleBuilders.java
index 6f609ec..def3309 100644
--- a/src/java/org/apache/cassandra/db/SimpleBuilders.java
+++ b/src/java/org/apache/cassandra/db/SimpleBuilders.java
@@ -36,7 +36,8 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.CounterId;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUIDAsBytes;
 
 public abstract class SimpleBuilders
 {
@@ -391,7 +392,7 @@
                     ListType lt = (ListType)column.type;
                     assert value instanceof List;
                     for (Object elt : (List)value)
-                        builder.addCell(cell(column, toByteBuffer(elt, lt.getElementsType()), CellPath.create(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes()))));
+                        builder.addCell(cell(column, toByteBuffer(elt, lt.getElementsType()), CellPath.create(ByteBuffer.wrap(nextTimeUUIDAsBytes()))));
                     break;
                 case SET:
                     SetType st = (SetType)column.type;
@@ -420,6 +421,12 @@
             return this;
         }
 
+        public Row.SimpleBuilder deletePrevious()
+        {
+            builder.addRowDeletion(Row.Deletion.regular(new DeletionTime(timestamp - 1, nowInSec)));
+            return this;
+        }
+
         public Row.SimpleBuilder delete(String columnName)
         {
             return add(columnName, null);
diff --git a/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java b/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
index 8ac26e8..963b9fe 100644
--- a/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
+++ b/src/java/org/apache/cassandra/db/SinglePartitionReadCommand.java
@@ -21,6 +21,7 @@
 import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Sets;
@@ -31,10 +32,13 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.filter.*;
 import org.apache.cassandra.db.lifecycle.*;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.db.partitions.*;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.db.transform.RTBoundValidator;
 import org.apache.cassandra.db.transform.Transformation;
+import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
+import org.apache.cassandra.db.virtual.VirtualTable;
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
@@ -57,8 +61,8 @@
 {
     protected static final SelectionDeserializer selectionDeserializer = new Deserializer();
 
-    private final DecoratedKey partitionKey;
-    private final ClusteringIndexFilter clusteringIndexFilter;
+    protected final DecoratedKey partitionKey;
+    protected final ClusteringIndexFilter clusteringIndexFilter;
 
     @VisibleForTesting
     protected SinglePartitionReadCommand(boolean isDigest,
@@ -71,14 +75,57 @@
                                          DataLimits limits,
                                          DecoratedKey partitionKey,
                                          ClusteringIndexFilter clusteringIndexFilter,
-                                         IndexMetadata index)
+                                         IndexMetadata index,
+                                         boolean trackWarnings)
     {
-        super(Kind.SINGLE_PARTITION, isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, index);
+        super(Kind.SINGLE_PARTITION, isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, index, trackWarnings);
         assert partitionKey.getPartitioner() == metadata.partitioner;
         this.partitionKey = partitionKey;
         this.clusteringIndexFilter = clusteringIndexFilter;
     }
 
+    private static SinglePartitionReadCommand create(boolean isDigest,
+                                                    int digestVersion,
+                                                    boolean acceptsTransient,
+                                                    TableMetadata metadata,
+                                                    int nowInSec,
+                                                    ColumnFilter columnFilter,
+                                                    RowFilter rowFilter,
+                                                    DataLimits limits,
+                                                    DecoratedKey partitionKey,
+                                                    ClusteringIndexFilter clusteringIndexFilter,
+                                                    IndexMetadata index,
+                                                    boolean trackWarnings)
+    {
+        if (metadata.isVirtual())
+        {
+            return new VirtualTableSinglePartitionReadCommand(isDigest,
+                                                              digestVersion,
+                                                              acceptsTransient,
+                                                              metadata,
+                                                              nowInSec,
+                                                              columnFilter,
+                                                              rowFilter,
+                                                              limits,
+                                                              partitionKey,
+                                                              clusteringIndexFilter,
+                                                              index,
+                                                              trackWarnings);
+        }
+        return new SinglePartitionReadCommand(isDigest,
+                                              digestVersion,
+                                              acceptsTransient,
+                                              metadata,
+                                              nowInSec,
+                                              columnFilter,
+                                              rowFilter,
+                                              limits,
+                                              partitionKey,
+                                              clusteringIndexFilter,
+                                              index,
+                                              trackWarnings);
+    }
+
     /**
      * Creates a new read command on a single partition.
      *
@@ -102,17 +149,18 @@
                                                     ClusteringIndexFilter clusteringIndexFilter,
                                                     IndexMetadata indexMetadata)
     {
-        return new SinglePartitionReadCommand(false,
-                                              0,
-                                              false,
-                                              metadata,
-                                              nowInSec,
-                                              columnFilter,
-                                              rowFilter,
-                                              limits,
-                                              partitionKey,
-                                              clusteringIndexFilter,
-                                              indexMetadata);
+        return create(false,
+                      0,
+                      false,
+                      metadata,
+                      nowInSec,
+                      columnFilter,
+                      rowFilter,
+                      limits,
+                      partitionKey,
+                      clusteringIndexFilter,
+                      indexMetadata,
+                      false);
     }
 
     /**
@@ -278,65 +326,69 @@
 
     public SinglePartitionReadCommand copy()
     {
-        return new SinglePartitionReadCommand(isDigestQuery(),
-                                              digestVersion(),
-                                              acceptsTransient(),
-                                              metadata(),
-                                              nowInSec(),
-                                              columnFilter(),
-                                              rowFilter(),
-                                              limits(),
-                                              partitionKey(),
-                                              clusteringIndexFilter(),
-                                              indexMetadata());
+        return create(isDigestQuery(),
+                      digestVersion(),
+                      acceptsTransient(),
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      limits(),
+                      partitionKey(),
+                      clusteringIndexFilter(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
     protected SinglePartitionReadCommand copyAsDigestQuery()
     {
-        return new SinglePartitionReadCommand(true,
-                                              digestVersion(),
-                                              acceptsTransient(),
-                                              metadata(),
-                                              nowInSec(),
-                                              columnFilter(),
-                                              rowFilter(),
-                                              limits(),
-                                              partitionKey(),
-                                              clusteringIndexFilter(),
-                                              indexMetadata());
+        return create(true,
+                      digestVersion(),
+                      acceptsTransient(),
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      limits(),
+                      partitionKey(),
+                      clusteringIndexFilter(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
     protected SinglePartitionReadCommand copyAsTransientQuery()
     {
-        return new SinglePartitionReadCommand(false,
-                                              0,
-                                              true,
-                                              metadata(),
-                                              nowInSec(),
-                                              columnFilter(),
-                                              rowFilter(),
-                                              limits(),
-                                              partitionKey(),
-                                              clusteringIndexFilter(),
-                                              indexMetadata());
+        return create(false,
+                      0,
+                      true,
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      limits(),
+                      partitionKey(),
+                      clusteringIndexFilter(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
     public SinglePartitionReadCommand withUpdatedLimit(DataLimits newLimits)
     {
-        return new SinglePartitionReadCommand(isDigestQuery(),
-                                              digestVersion(),
-                                              acceptsTransient(),
-                                              metadata(),
-                                              nowInSec(),
-                                              columnFilter(),
-                                              rowFilter(),
-                                              newLimits,
-                                              partitionKey(),
-                                              clusteringIndexFilter(),
-                                              indexMetadata());
+        return create(isDigestQuery(),
+                      digestVersion(),
+                      acceptsTransient(),
+                      metadata(),
+                      nowInSec(),
+                      columnFilter(),
+                      rowFilter(),
+                      newLimits,
+                      partitionKey(),
+                      clusteringIndexFilter(),
+                      indexMetadata(),
+                      isTrackingWarnings());
     }
 
     @Override
@@ -371,21 +423,25 @@
     {
         // We shouldn't have set digest yet when reaching that point
         assert !isDigestQuery();
-        return create(metadata(),
-                      nowInSec(),
-                      columnFilter(),
-                      rowFilter(),
-                      limits,
-                      partitionKey(),
-                      lastReturned == null ? clusteringIndexFilter() : clusteringIndexFilter.forPaging(metadata().comparator, lastReturned, false));
+        SinglePartitionReadCommand cmd = create(metadata(),
+                                                nowInSec(),
+                                                columnFilter(),
+                                                rowFilter(),
+                                                limits,
+                                                partitionKey(),
+                                                lastReturned == null ? clusteringIndexFilter() : clusteringIndexFilter.forPaging(metadata().comparator, lastReturned, false));
+        if (isTrackingWarnings())
+            cmd.trackWarnings();
+        return cmd;
     }
 
-    public PartitionIterator execute(ConsistencyLevel consistency, ClientState clientState, long queryStartNanoTime) throws RequestExecutionException
+    @Override
+    public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException
     {
         if (clusteringIndexFilter.isEmpty(metadata().comparator))
             return EmptyIterators.partition();
 
-        return StorageProxy.read(Group.one(this), consistency, clientState, queryStartNanoTime);
+        return StorageProxy.read(Group.one(this), consistency, queryStartNanoTime);
     }
 
     protected void recordLatency(TableMetrics metric, long latencyNanos)
@@ -605,20 +661,20 @@
         InputCollector<UnfilteredRowIterator> inputCollector = iteratorsForPartition(view, controller);
         try
         {
+            SSTableReadMetricsCollector metricsCollector = new SSTableReadMetricsCollector();
+
             for (Memtable memtable : view.memtables)
             {
-                Partition partition = memtable.getPartition(partitionKey());
-                if (partition == null)
+                @SuppressWarnings("resource") // 'iter' is added to iterators which is closed on exception, or through the closing of the final merged iterator
+                UnfilteredRowIterator iter = memtable.rowIterator(partitionKey(), filter.getSlices(metadata()), columnFilter(), filter.isReversed(), metricsCollector);
+                if (iter == null)
                     continue;
 
                 if (memtable.getMinTimestamp() != Memtable.NO_MIN_TIMESTAMP)
                     minTimestamp = Math.min(minTimestamp, memtable.getMinTimestamp());
 
-                @SuppressWarnings("resource") // 'iter' is added to iterators which is closed on exception, or through the closing of the final merged iterator
-                UnfilteredRowIterator iter = filter.getUnfilteredRowIterator(columnFilter(), partition);
-
                 // Memtable data is always considered unrepaired
-                controller.updateMinOldestUnrepairedTombstone(partition.stats().minLocalDeletionTime);
+                controller.updateMinOldestUnrepairedTombstone(memtable.getMinLocalDeletionTime());
                 inputCollector.addMemtableIterator(RTBoundValidator.validate(iter, RTBoundValidator.Stage.MEMTABLE, false));
 
                 mostRecentPartitionTombstone = Math.max(mostRecentPartitionTombstone,
@@ -641,8 +697,6 @@
             int nonIntersectingSSTables = 0;
             int includedDueToTombstones = 0;
 
-            SSTableReadMetricsCollector metricsCollector = new SSTableReadMetricsCollector();
-
             if (controller.isTrackingRepairedStatus())
                 Tracing.trace("Collecting data from sstables and tracking repaired status");
 
@@ -805,17 +859,14 @@
         ColumnFamilyStore.ViewFragment view = cfs.select(View.select(SSTableSet.LIVE, partitionKey()));
 
         ImmutableBTreePartition result = null;
+        SSTableReadMetricsCollector metricsCollector = new SSTableReadMetricsCollector();
 
         Tracing.trace("Merging memtable contents");
         for (Memtable memtable : view.memtables)
         {
-            Partition partition = memtable.getPartition(partitionKey());
-            if (partition == null)
-                continue;
-
-            try (UnfilteredRowIterator iter = filter.getUnfilteredRowIterator(columnFilter(), partition))
+            try (UnfilteredRowIterator iter = memtable.rowIterator(partitionKey, filter.getSlices(metadata()), columnFilter(), isReversed(), metricsCollector))
             {
-                if (iter.isEmpty())
+                if (iter == null)
                     continue;
 
                 result = add(RTBoundValidator.validate(iter, RTBoundValidator.Stage.MEMTABLE, false),
@@ -829,7 +880,6 @@
         /* add the SSTables on disk */
         view.sstables.sort(SSTableReader.maxTimestampDescending);
         // read sorted sstables
-        SSTableReadMetricsCollector metricsCollector = new SSTableReadMetricsCollector();
         for (SSTableReader sstable : view.sstables)
         {
             // if we've already seen a partition tombstone with a timestamp greater
@@ -1081,20 +1131,24 @@
         return Verb.READ_REQ;
     }
 
+    @Override
     protected void appendCQLWhereClause(StringBuilder sb)
     {
-        sb.append(" WHERE ");
+        sb.append(" WHERE ").append(partitionKey().toCQLString(metadata()));
 
-        sb.append(ColumnMetadata.toCQLString(metadata().partitionKeyColumns())).append(" = ");
-        DataRange.appendKeyString(sb, metadata().partitionKeyType, partitionKey().getKey());
-
-        // We put the row filter first because the clustering index filter can end by "ORDER BY"
-        if (!rowFilter().isEmpty())
-            sb.append(" AND ").append(rowFilter());
-
-        String filterString = clusteringIndexFilter().toCQLString(metadata());
+        String filterString = clusteringIndexFilter().toCQLString(metadata(), rowFilter());
         if (!filterString.isEmpty())
-            sb.append(" AND ").append(filterString);
+        {
+            if (!clusteringIndexFilter().selectsAllPartition() || !rowFilter().isEmpty())
+                sb.append(" AND ");
+            sb.append(filterString);
+        }
+    }
+
+    @Override
+    public String loggableTokens()
+    {
+        return "token=" + partitionKey.getToken().toString();
     }
 
     protected void serializeSelection(DataOutputPlus out, int version) throws IOException
@@ -1144,22 +1198,48 @@
                                                                clusteringIndexFilter));
             }
 
-            return new Group(commands, limits);
+            return create(commands, limits);
         }
 
-        public Group(List<SinglePartitionReadCommand> commands, DataLimits limits)
+        private Group(List<SinglePartitionReadCommand> commands, DataLimits limits)
         {
             super(commands, limits);
         }
 
         public static Group one(SinglePartitionReadCommand command)
         {
-            return new Group(Collections.singletonList(command), command.limits());
+            return create(Collections.singletonList(command), command.limits());
         }
 
-        public PartitionIterator execute(ConsistencyLevel consistency, ClientState clientState, long queryStartNanoTime) throws RequestExecutionException
+        public static Group create(List<SinglePartitionReadCommand> commands, DataLimits limits)
         {
-            return StorageProxy.read(this, consistency, clientState, queryStartNanoTime);
+            return commands.get(0).metadata().isVirtual() ?
+                   new VirtualTableGroup(commands, limits) :
+                   new Group(commands, limits);
+        }
+
+        public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException
+        {
+            return StorageProxy.read(this, consistency, queryStartNanoTime);
+        }
+    }
+
+    public static class VirtualTableGroup extends Group
+    {
+        public VirtualTableGroup(List<SinglePartitionReadCommand> commands, DataLimits limits)
+        {
+            super(commands, limits);
+        }
+
+        @Override
+        public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException
+        {
+            if (queries.size() == 1)
+                return queries.get(0).execute(consistency, state, queryStartNanoTime);
+
+            return PartitionIterators.concat(queries.stream()
+                                                    .map(q -> q.execute(consistency, state, queryStartNanoTime))
+                                                    .collect(Collectors.toList()));
         }
     }
 
@@ -1180,7 +1260,7 @@
         {
             DecoratedKey key = metadata.partitioner.decorateKey(metadata.partitionKeyType.readBuffer(in, DatabaseDescriptor.getMaxValueSize()));
             ClusteringIndexFilter filter = ClusteringIndexFilter.serializer.deserialize(in, version, metadata);
-            return new SinglePartitionReadCommand(isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, key, filter, index);
+            return SinglePartitionReadCommand.create(isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, key, filter, index, false);
         }
     }
 
@@ -1211,4 +1291,50 @@
             return mergedSSTables;
         }
     }
+
+    public static class VirtualTableSinglePartitionReadCommand extends SinglePartitionReadCommand
+    {
+        protected VirtualTableSinglePartitionReadCommand(boolean isDigest,
+                                                         int digestVersion,
+                                                         boolean acceptsTransient,
+                                                         TableMetadata metadata,
+                                                         int nowInSec,
+                                                         ColumnFilter columnFilter,
+                                                         RowFilter rowFilter,
+                                                         DataLimits limits,
+                                                         DecoratedKey partitionKey,
+                                                         ClusteringIndexFilter clusteringIndexFilter,
+                                                         IndexMetadata index,
+                                                         boolean trackWarnings)
+        {
+            super(isDigest, digestVersion, acceptsTransient, metadata, nowInSec, columnFilter, rowFilter, limits, partitionKey, clusteringIndexFilter, index, trackWarnings);
+        }
+
+        @Override
+        public PartitionIterator execute(ConsistencyLevel consistency, ClientState state, long queryStartNanoTime) throws RequestExecutionException
+        {
+            return executeInternal(executionController());
+        }
+
+        @Override
+        @SuppressWarnings("resource")
+        public UnfilteredPartitionIterator executeLocally(ReadExecutionController executionController)
+        {
+            VirtualTable view = VirtualKeyspaceRegistry.instance.getTableNullable(metadata().id);
+            UnfilteredPartitionIterator resultIterator = view.select(partitionKey, clusteringIndexFilter, columnFilter());
+            return limits().filter(rowFilter().filter(resultIterator, nowInSec()), nowInSec(), selectsFullPartition());
+        }
+
+        @Override
+        public ReadExecutionController executionController()
+        {
+            return ReadExecutionController.empty();
+        }
+
+        @Override
+        public ReadExecutionController executionController(boolean trackRepairedStatus)
+        {
+            return executionController();
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/db/SinglePartitionReadQuery.java b/src/java/org/apache/cassandra/db/SinglePartitionReadQuery.java
index 755d552..e595fcb 100644
--- a/src/java/org/apache/cassandra/db/SinglePartitionReadQuery.java
+++ b/src/java/org/apache/cassandra/db/SinglePartitionReadQuery.java
@@ -53,9 +53,7 @@
                                                                         List<DecoratedKey> partitionKeys,
                                                                         ClusteringIndexFilter clusteringIndexFilter)
     {
-        return metadata.isVirtual()
-             ? VirtualTableSinglePartitionReadQuery.Group.create(metadata, nowInSec, columnFilter, rowFilter, limits, partitionKeys, clusteringIndexFilter)
-             : SinglePartitionReadCommand.Group.create(metadata, nowInSec, columnFilter, rowFilter, limits, partitionKeys, clusteringIndexFilter);
+        return SinglePartitionReadCommand.Group.create(metadata, nowInSec, columnFilter, rowFilter, limits, partitionKeys, clusteringIndexFilter);
     }
 
 
@@ -100,9 +98,7 @@
                                                   DecoratedKey partitionKey,
                                                   ClusteringIndexFilter clusteringIndexFilter)
     {
-        return metadata.isVirtual()
-             ? VirtualTableSinglePartitionReadQuery.create(metadata, nowInSec, columnFilter, rowFilter, limits, partitionKey, clusteringIndexFilter)
-             : SinglePartitionReadCommand.create(metadata, nowInSec, columnFilter, rowFilter, limits, partitionKey, clusteringIndexFilter);
+        return SinglePartitionReadCommand.create(metadata, nowInSec, columnFilter, rowFilter, limits, partitionKey, clusteringIndexFilter);
     }
 
     /**
@@ -282,6 +278,12 @@
         }
 
         @Override
+        public void trackWarnings()
+        {
+            queries.forEach(ReadQuery::trackWarnings);
+        }
+
+        @Override
         public String toString()
         {
             return queries.toString();
diff --git a/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java b/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java
index fe38d64..dfd52c5 100644
--- a/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java
+++ b/src/java/org/apache/cassandra/db/SizeEstimatesRecorder.java
@@ -32,11 +32,14 @@
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaChangeListener;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.concurrent.Refs;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * A very simplistic/crude partition count/size estimator.
  *
@@ -46,7 +49,7 @@
  *
  * See CASSANDRA-7688.
  */
-public class SizeEstimatesRecorder extends SchemaChangeListener implements Runnable
+public class SizeEstimatesRecorder implements SchemaChangeListener, Runnable
 {
     private static final Logger logger = LoggerFactory.getLogger(SizeEstimatesRecorder.class);
 
@@ -89,7 +92,7 @@
             boolean rangesAreEqual = primaryRanges.equals(localPrimaryRanges);
             for (ColumnFamilyStore table : keyspace.getColumnFamilyStores())
             {
-                long start = System.nanoTime();
+                long start = nanoTime();
 
                 // compute estimates for primary ranges for backwards compatability
                 Map<Range<Token>, Pair<Long, Long>> estimates = computeSizeEstimates(table, primaryRanges);
@@ -103,7 +106,7 @@
                 }
                 SystemKeyspace.updateTableEstimates(table.metadata.keyspace, table.metadata.name, SystemKeyspace.TABLE_ESTIMATES_TYPE_LOCAL_PRIMARY, estimates);
 
-                long passed = System.nanoTime() - start;
+                long passed = nanoTime() - start;
                 if (logger.isTraceEnabled())
                     logger.trace("Spent {} milliseconds on estimating {}.{} size",
                                  TimeUnit.NANOSECONDS.toMillis(passed),
@@ -175,8 +178,8 @@
     }
 
     @Override
-    public void onDropTable(String keyspace, String table)
+    public void onDropTable(TableMetadata table, boolean dropData)
     {
-        SystemKeyspace.clearEstimates(keyspace, table);
+        SystemKeyspace.clearEstimates(table.keyspace, table.name);
     }
 }
diff --git a/src/java/org/apache/cassandra/db/Slice.java b/src/java/org/apache/cassandra/db/Slice.java
index 8956bd1..e2c787d 100644
--- a/src/java/org/apache/cassandra/db/Slice.java
+++ b/src/java/org/apache/cassandra/db/Slice.java
@@ -22,7 +22,6 @@
 import java.util.*;
 
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.ByteArrayAccessor;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 
diff --git a/src/java/org/apache/cassandra/db/Slices.java b/src/java/org/apache/cassandra/db/Slices.java
index 441a5d3..b3f5681 100644
--- a/src/java/org/apache/cassandra/db/Slices.java
+++ b/src/java/org/apache/cassandra/db/Slices.java
@@ -24,6 +24,8 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterators;
 
+import org.apache.cassandra.cql3.Operator;
+import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -141,7 +143,7 @@
      */
     public abstract boolean intersects(List<ByteBuffer> minClusteringValues, List<ByteBuffer> maxClusteringValues);
 
-    public abstract String toCQLString(TableMetadata metadata);
+    public abstract String toCQLString(TableMetadata metadata, RowFilter rowFilter);
 
     /**
      * Checks if this <code>Slices</code> is empty.
@@ -549,7 +551,8 @@
             return sb.append("}").toString();
         }
 
-        public String toCQLString(TableMetadata metadata)
+        @Override
+        public String toCQLString(TableMetadata metadata, RowFilter rowFilter)
         {
             StringBuilder sb = new StringBuilder();
 
@@ -593,7 +596,7 @@
                         sb.append(" AND ");
                     needAnd = true;
 
-                    sb.append(column.name);
+                    sb.append(column.name.toCQLString());
 
                     Set<ByteBuffer> values = new LinkedHashSet<>();
                     for (int j = 0; j < componentInfo.size(); j++)
@@ -601,20 +604,25 @@
 
                     if (values.size() == 1)
                     {
-                        sb.append(" = ").append(column.type.getString(first.startValue));
+                        sb.append(" = ").append(column.type.toCQLString(first.startValue));
+                        rowFilter = rowFilter.without(column, Operator.EQ, first.startValue);
                     }
                     else
                     {
                         sb.append(" IN (");
                         int j = 0;
                         for (ByteBuffer value : values)
-                            sb.append(j++ == 0 ? "" : ", ").append(column.type.getString(value));
+                        {
+                            sb.append(j++ == 0 ? "" : ", ").append(column.type.toCQLString(value));
+                            rowFilter = rowFilter.without(column, Operator.EQ, value);
+                        }
                         sb.append(")");
                     }
                 }
                 else
                 {
                     boolean isReversed = column.isReversedType();
+                    Operator operator;
 
                     // As said above, we assume (without checking) that this means all ComponentOfSlice for this column
                     // are the same, so we only bother about the first.
@@ -623,27 +631,39 @@
                         if (needAnd)
                             sb.append(" AND ");
                         needAnd = true;
-                        sb.append(column.name);
+                        sb.append(column.name.toCQLString());
                         if (isReversed)
-                            sb.append(first.startInclusive ? " <= " : " < ");
+                            operator = first.startInclusive ? Operator.LTE : Operator.LT;
                         else
-                            sb.append(first.startInclusive ? " >= " : " > ");
-                        sb.append(column.type.getString(first.startValue));
+                            operator = first.startInclusive ? Operator.GTE : Operator.GT;
+                        sb.append(' ').append(operator.toString()).append(' ')
+                          .append(column.type.toCQLString(first.startValue));
+                        rowFilter = rowFilter.without(column, operator, first.startValue);
                     }
                     if (first.endValue != null)
                     {
                         if (needAnd)
                             sb.append(" AND ");
                         needAnd = true;
-                        sb.append(column.name);
+                        sb.append(column.name.toCQLString());
                         if (isReversed)
-                            sb.append(first.endInclusive ? " >= " : " > ");
+                            operator = first.endInclusive ? Operator.GTE : Operator.GT;
                         else
-                            sb.append(first.endInclusive ? " <= " : " < ");
-                        sb.append(column.type.getString(first.endValue));
+                            operator = first.endInclusive ? Operator.LTE : Operator.LT;
+                        sb.append(' ').append(operator.toString()).append(' ')
+                          .append(column.type.toCQLString(first.endValue));
+                        rowFilter = rowFilter.without(column, operator, first.endValue);
                     }
                 }
             }
+
+            if (!rowFilter.isEmpty())
+            {
+                if (needAnd)
+                    sb.append(" AND ");
+                sb.append(rowFilter.toCQLString());
+            }
+
             return sb.toString();
         }
 
@@ -764,9 +784,10 @@
             return "ALL";
         }
 
-        public String toCQLString(TableMetadata metadata)
+        @Override
+        public String toCQLString(TableMetadata metadata, RowFilter rowFilter)
         {
-            return "";
+            return rowFilter.toCQLString();
         }
     }
 
@@ -839,7 +860,8 @@
             return "NONE";
         }
 
-        public String toCQLString(TableMetadata metadata)
+        @Override
+        public String toCQLString(TableMetadata metadata, RowFilter rowFilter)
         {
             return "";
         }
diff --git a/src/java/org/apache/cassandra/db/SnapshotCommand.java b/src/java/org/apache/cassandra/db/SnapshotCommand.java
index 484db2f..e909e50 100644
--- a/src/java/org/apache/cassandra/db/SnapshotCommand.java
+++ b/src/java/org/apache/cassandra/db/SnapshotCommand.java
@@ -22,8 +22,6 @@
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.Verb;
 
 public class SnapshotCommand
 {
diff --git a/src/java/org/apache/cassandra/db/SnapshotDetailsTabularData.java b/src/java/org/apache/cassandra/db/SnapshotDetailsTabularData.java
index 5ef729a..4e6ab11 100644
--- a/src/java/org/apache/cassandra/db/SnapshotDetailsTabularData.java
+++ b/src/java/org/apache/cassandra/db/SnapshotDetailsTabularData.java
@@ -17,15 +17,11 @@
  */
 package org.apache.cassandra.db;
 
-import java.util.Map;
 import javax.management.openmbean.*;
 
 import com.google.common.base.Throwables;
 import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.utils.Pair;
-
-
-
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 
 public class SnapshotDetailsTabularData
 {
@@ -34,13 +30,17 @@
             "Keyspace name",
             "Column family name",
             "True size",
-            "Size on disk"};
+            "Size on disk",
+            "Creation time",
+            "Expiration time",};
 
     private static final String[] ITEM_DESCS = new String[]{"snapshot_name",
             "keyspace_name",
             "columnfamily_name",
             "TrueDiskSpaceUsed",
-            "TotalDiskSpaceUsed"};
+            "TotalDiskSpaceUsed",
+            "created_at",
+            "expires_at",};
 
     private static final String TYPE_NAME = "SnapshotDetails";
 
@@ -56,7 +56,7 @@
     {
         try
         {
-            ITEM_TYPES = new OpenType[]{ SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING };
+            ITEM_TYPES = new OpenType[]{ SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING, SimpleType.STRING };
 
             COMPOSITE_TYPE = new CompositeType(TYPE_NAME, ROW_DESC, ITEM_NAMES, ITEM_DESCS, ITEM_TYPES);
 
@@ -69,18 +69,25 @@
     }
 
 
-    public static void from(final String snapshot, final String ks, final String cf, Map.Entry<String, Directories.SnapshotSizeDetails> snapshotDetail, TabularDataSupport result)
+    public static void from(TableSnapshot details, TabularDataSupport result)
     {
         try
         {
-            final String totalSize = FileUtils.stringifyFileSize(snapshotDetail.getValue().sizeOnDiskBytes);
-            final String liveSize =  FileUtils.stringifyFileSize(snapshotDetail.getValue().dataSizeBytes);
+            final String totalSize = FileUtils.stringifyFileSize(details.computeSizeOnDiskBytes());
+            final String liveSize =  FileUtils.stringifyFileSize(details.computeTrueSizeBytes());
+            String createdAt = safeToString(details.getCreatedAt());
+            String expiresAt = safeToString(details.getExpiresAt());
             result.put(new CompositeDataSupport(COMPOSITE_TYPE, ITEM_NAMES,
-                    new Object[]{ snapshot, ks, cf, liveSize, totalSize }));
+                    new Object[]{ details.getTag(), details.getKeyspaceName(), details.getTableName(), liveSize, totalSize, createdAt, expiresAt }));
         }
         catch (OpenDataException e)
         {
             throw new RuntimeException(e);
         }
     }
+
+    private static String safeToString(Object object)
+    {
+        return object == null ? null : object.toString();
+    }
 }
diff --git a/src/java/org/apache/cassandra/db/StorageHook.java b/src/java/org/apache/cassandra/db/StorageHook.java
index be1d0bf..c998338 100644
--- a/src/java/org/apache/cassandra/db/StorageHook.java
+++ b/src/java/org/apache/cassandra/db/StorageHook.java
@@ -84,7 +84,7 @@
                                                          boolean reversed,
                                                          SSTableReadsListener listener)
             {
-                return sstable.iterator(key, slices, selectedColumns, reversed, listener);
+                return sstable.rowIterator(key, slices, selectedColumns, reversed, listener);
             }
         };
     }
diff --git a/src/java/org/apache/cassandra/db/SystemKeyspace.java b/src/java/org/apache/cassandra/db/SystemKeyspace.java
index e3f7fba..fd2145b 100644
--- a/src/java/org/apache/cassandra/db/SystemKeyspace.java
+++ b/src/java/org/apache/cassandra/db/SystemKeyspace.java
@@ -17,15 +17,17 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOError;
 import java.io.IOException;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
+import java.time.Instant;
 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.List;
@@ -45,10 +47,11 @@
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.common.collect.SetMultimap;
 import com.google.common.collect.Sets;
 import com.google.common.io.ByteStreams;
-import com.google.common.util.concurrent.ListenableFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -66,22 +69,29 @@
 import org.apache.cassandra.db.commitlog.CommitLogPosition;
 import org.apache.cassandra.db.compaction.CompactionHistoryTabularData;
 import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.LongType;
 import org.apache.cassandra.db.marshal.TimeUUIDType;
+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.partitions.PartitionUpdate;
+import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.db.rows.Rows;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.LocalPartitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.io.sstable.SSTableId;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
 import org.apache.cassandra.io.util.DataInputBuffer;
 import org.apache.cassandra.io.util.DataOutputBuffer;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.RebufferingInputStream;
 import org.apache.cassandra.locator.IEndpointSnitch;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.metrics.RestorableMeter;
+import org.apache.cassandra.metrics.TopPartitionTracker;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.Functions;
@@ -95,8 +105,15 @@
 import org.apache.cassandra.schema.Types;
 import org.apache.cassandra.schema.Views;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.paxos.Ballot;
 import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.Commit.Accepted;
+import org.apache.cassandra.service.paxos.Commit.AcceptedWithTTL;
+import org.apache.cassandra.service.paxos.Commit.Committed;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
 import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosRows;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedIndex;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -104,13 +121,23 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MD5Digest;
 import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
 
 import static java.lang.String.format;
 import static java.util.Collections.emptyMap;
 import static java.util.Collections.singletonMap;
+import static org.apache.cassandra.config.Config.PaxosStatePurging.legacy;
+import static org.apache.cassandra.config.DatabaseDescriptor.paxosStatePurging;
 import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
+import static org.apache.cassandra.cql3.QueryProcessor.executeInternalWithNowInSec;
 import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal;
+import static org.apache.cassandra.service.paxos.Commit.latest;
+import static org.apache.cassandra.utils.CassandraVersion.NULL_VERSION;
+import static org.apache.cassandra.utils.CassandraVersion.UNREADABLE_VERSION;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.FBUtilities.now;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public final class SystemKeyspace
 {
@@ -120,25 +147,17 @@
 
     private static final Logger logger = LoggerFactory.getLogger(SystemKeyspace.class);
 
-    // Used to indicate that there was a previous version written to the legacy (pre 1.2)
-    // system.Versions table, but that we cannot read it. Suffice to say, any upgrade should
-    // proceed through 1.2.x before upgrading to the current version.
-    public static final CassandraVersion UNREADABLE_VERSION = new CassandraVersion("0.0.0-unknown");
-
-    // Used to indicate that no previous version information was found. When encountered, we assume that
-    // Cassandra was not previously installed and we're in the process of starting a fresh node.
-    public static final CassandraVersion NULL_VERSION = new CassandraVersion("0.0.0-absent");
-
     public static final CassandraVersion CURRENT_VERSION = new CassandraVersion(FBUtilities.getReleaseVersionString());
 
     public static final String BATCHES = "batches";
     public static final String PAXOS = "paxos";
+    public static final String PAXOS_REPAIR_HISTORY = "paxos_repair_history";
     public static final String BUILT_INDEXES = "IndexInfo";
     public static final String LOCAL = "local";
     public static final String PEERS_V2 = "peers_v2";
     public static final String PEER_EVENTS_V2 = "peer_events_v2";
     public static final String COMPACTION_HISTORY = "compaction_history";
-    public static final String SSTABLE_ACTIVITY = "sstable_activity";
+    public static final String SSTABLE_ACTIVITY_V2 = "sstable_activity_v2"; // v2 has modified generation column type (v1 - int, v2 - blob), see CASSANDRA-17048
     public static final String TABLE_ESTIMATES = "table_estimates";
     public static final String TABLE_ESTIMATES_TYPE_PRIMARY = "primary";
     public static final String TABLE_ESTIMATES_TYPE_LOCAL_PRIMARY = "local_primary";
@@ -148,6 +167,7 @@
     public static final String BUILT_VIEWS = "built_views";
     public static final String PREPARED_STATEMENTS = "prepared_statements";
     public static final String REPAIRS = "repairs";
+    public static final String TOP_PARTITIONS = "top_partitions";
 
     /**
      * By default the system keyspace tables should be stored in a single data directory to allow the server
@@ -165,6 +185,7 @@
     @Deprecated public static final String LEGACY_TRANSFERRED_RANGES = "transferred_ranges";
     @Deprecated public static final String LEGACY_AVAILABLE_RANGES = "available_ranges";
     @Deprecated public static final String LEGACY_SIZE_ESTIMATES = "size_estimates";
+    @Deprecated public static final String LEGACY_SSTABLE_ACTIVITY = "sstable_activity";
 
 
     public static final TableMetadata Batches =
@@ -186,6 +207,7 @@
                 + "row_key blob,"
                 + "cf_id UUID,"
                 + "in_progress_ballot timeuuid,"
+                + "in_progress_read_ballot timeuuid,"
                 + "most_recent_commit blob,"
                 + "most_recent_commit_at timeuuid,"
                 + "most_recent_commit_version int,"
@@ -194,6 +216,7 @@
                 + "proposal_version int,"
                 + "PRIMARY KEY ((row_key), cf_id))")
                 .compaction(CompactionParams.lcs(emptyMap()))
+                .indexes(PaxosUncommittedIndex.indexes())
                 .build();
 
     private static final TableMetadata BuiltIndexes =
@@ -206,6 +229,17 @@
               + "PRIMARY KEY ((table_name), index_name)) ")
               .build();
 
+    private static final TableMetadata PaxosRepairHistoryTable =
+        parse(PAXOS_REPAIR_HISTORY,
+                "paxos repair history",
+                "CREATE TABLE %s ("
+                + "keyspace_name text,"
+                + "table_name text,"
+                + "points frozen<list<tuple<blob, timeuuid>>>, "
+                + "PRIMARY KEY (keyspace_name, table_name))"
+                + "WITH COMMENT='Last successful paxos repairs by range'")
+        .build();
+
     private static final TableMetadata Local =
         parse(LOCAL,
                 "information about the local node",
@@ -259,7 +293,7 @@
                 "CREATE TABLE %s ("
                 + "peer inet,"
                 + "peer_port int,"
-                + "hints_dropped map<uuid, int>,"
+                + "hints_dropped map<timeuuid, int>,"
                 + "PRIMARY KEY ((peer), peer_port))")
                 .build();
 
@@ -267,7 +301,7 @@
         parse(COMPACTION_HISTORY,
                 "week-long compaction history",
                 "CREATE TABLE %s ("
-                + "id uuid,"
+                + "id timeuuid,"
                 + "bytes_in bigint,"
                 + "bytes_out bigint,"
                 + "columnfamily_name text,"
@@ -278,8 +312,8 @@
                 .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(7))
                 .build();
 
-    private static final TableMetadata SSTableActivity =
-        parse(SSTABLE_ACTIVITY,
+    private static final TableMetadata LegacySSTableActivity =
+        parse(LEGACY_SSTABLE_ACTIVITY,
                 "historic sstable read rates",
                 "CREATE TABLE %s ("
                 + "keyspace_name text,"
@@ -290,6 +324,18 @@
                 + "PRIMARY KEY ((keyspace_name, columnfamily_name, generation)))")
                 .build();
 
+    private static final TableMetadata SSTableActivity =
+        parse(SSTABLE_ACTIVITY_V2,
+                "historic sstable read rates",
+                "CREATE TABLE %s ("
+                + "keyspace_name text,"
+                + "table_name text,"
+                + "id text,"
+                + "rate_120m double,"
+                + "rate_15m double,"
+                + "PRIMARY KEY ((keyspace_name, table_name, id)))")
+                .build();
+
     @Deprecated
     private static final TableMetadata LegacySizeEstimates =
         parse(LEGACY_SIZE_ESTIMATES,
@@ -363,6 +409,19 @@
                 + "PRIMARY KEY ((keyspace_name), view_name))")
                 .build();
 
+    private static final TableMetadata TopPartitions =
+        parse(TOP_PARTITIONS,
+                "Stores the top partitions",
+                "CREATE TABLE  %s ("
+                + "keyspace_name text,"
+                + "table_name text,"
+                + "top_type text,"
+                + "top frozen<list<tuple<text, bigint>>>,"
+                + "last_update timestamp,"
+                + "PRIMARY KEY (keyspace_name, table_name, top_type))")
+                .build();
+
+
     private static final TableMetadata PreparedStatements =
         parse(PREPARED_STATEMENTS,
                 "prepared statements",
@@ -413,7 +472,7 @@
             "events related to peers",
             "CREATE TABLE %s ("
             + "peer inet,"
-            + "hints_dropped map<uuid, int>,"
+            + "hints_dropped map<timeuuid, int>,"
             + "PRIMARY KEY ((peer)))")
             .build();
 
@@ -458,12 +517,14 @@
         return Tables.of(BuiltIndexes,
                          Batches,
                          Paxos,
+                         PaxosRepairHistoryTable,
                          Local,
                          PeersV2,
                          LegacyPeers,
                          PeerEventsV2,
                          LegacyPeerEvents,
                          CompactionHistory,
+                         LegacySSTableActivity,
                          SSTableActivity,
                          LegacySizeEstimates,
                          TableEstimates,
@@ -474,7 +535,8 @@
                          ViewBuildsInProgress,
                          BuiltViews,
                          PreparedStatements,
-                         Repairs);
+                         Repairs,
+                         TopPartitions);
     }
 
     private static Functions functions()
@@ -499,11 +561,6 @@
         DECOMMISSIONED
     }
 
-    public static void finishStartup()
-    {
-        Schema.instance.saveSystemKeyspace();
-    }
-
     public static void persistLocalMetadata()
     {
         persistLocalMetadata(UUID::randomUUID);
@@ -538,7 +595,7 @@
                             snitch.getLocalDatacenter(),
                             snitch.getLocalRack(),
                             DatabaseDescriptor.getPartitioner().getClass().getName(),
-                            DatabaseDescriptor.getRpcAddress(),
+                            FBUtilities.getJustBroadcastNativeAddress(),
                             DatabaseDescriptor.getNativeTransportPort(),
                             FBUtilities.getJustBroadcastAddress(),
                             DatabaseDescriptor.getStoragePort(),
@@ -565,7 +622,7 @@
             return;
         String req = "INSERT INTO system.%s (id, keyspace_name, columnfamily_name, compacted_at, bytes_in, bytes_out, rows_merged) VALUES (?, ?, ?, ?, ?, ?, ?)";
         executeInternal(format(req, COMPACTION_HISTORY),
-                        UUIDGen.getTimeUUID(),
+                        nextTimeUUID(),
                         ksname,
                         cfname,
                         ByteBufferUtil.bytes(compactedAt),
@@ -765,9 +822,9 @@
             return;
 
         String req = "INSERT INTO system.%s (peer, tokens) VALUES (?, ?)";
-        executeInternal(String.format(req, LEGACY_PEERS), ep.address, tokensAsSet(tokens));
+        executeInternal(String.format(req, LEGACY_PEERS), ep.getAddress(), tokensAsSet(tokens));
         req = "INSERT INTO system.%s (peer, peer_port, tokens) VALUES (?, ?, ?)";
-        executeInternal(String.format(req, PEERS_V2), ep.address, ep.port, tokensAsSet(tokens));
+        executeInternal(String.format(req, PEERS_V2), ep.getAddress(), ep.getPort(), tokensAsSet(tokens));
     }
 
     public static synchronized boolean updatePreferredIP(InetAddressAndPort ep, InetAddressAndPort preferred_ip)
@@ -776,9 +833,9 @@
             return false;
 
         String req = "INSERT INTO system.%s (peer, preferred_ip) VALUES (?, ?)";
-        executeInternal(String.format(req, LEGACY_PEERS), ep.address, preferred_ip.address);
+        executeInternal(String.format(req, LEGACY_PEERS), ep.getAddress(), preferred_ip.getAddress());
         req = "INSERT INTO system.%s (peer, peer_port, preferred_ip, preferred_port) VALUES (?, ?, ?, ?)";
-        executeInternal(String.format(req, PEERS_V2), ep.address, ep.port, preferred_ip.address, preferred_ip.port);
+        executeInternal(String.format(req, PEERS_V2), ep.getAddress(), ep.getPort(), preferred_ip.getAddress(), preferred_ip.getPort());
         forceBlockingFlush(LEGACY_PEERS, PEERS_V2);
         return true;
     }
@@ -789,14 +846,14 @@
             return;
 
         String req = "INSERT INTO system.%s (peer, %s) VALUES (?, ?)";
-        executeInternal(String.format(req, LEGACY_PEERS, columnName), ep.address, value);
+        executeInternal(String.format(req, LEGACY_PEERS, columnName), ep.getAddress(), value);
         //This column doesn't match across the two tables
         if (columnName.equals("rpc_address"))
         {
             columnName = "native_address";
         }
         req = "INSERT INTO system.%s (peer, peer_port, %s) VALUES (?, ?, ?)";
-        executeInternal(String.format(req, PEERS_V2, columnName), ep.address, ep.port, value);
+        executeInternal(String.format(req, PEERS_V2, columnName), ep.getAddress(), ep.getPort(), value);
     }
 
     public static synchronized void updatePeerNativeAddress(InetAddressAndPort ep, InetAddressAndPort address)
@@ -805,19 +862,19 @@
             return;
 
         String req = "INSERT INTO system.%s (peer, rpc_address) VALUES (?, ?)";
-        executeInternal(String.format(req, LEGACY_PEERS), ep.address, address.address);
+        executeInternal(String.format(req, LEGACY_PEERS), ep.getAddress(), address.getAddress());
         req = "INSERT INTO system.%s (peer, peer_port, native_address, native_port) VALUES (?, ?, ?, ?)";
-        executeInternal(String.format(req, PEERS_V2), ep.address, ep.port, address.address, address.port);
+        executeInternal(String.format(req, PEERS_V2), ep.getAddress(), ep.getPort(), address.getAddress(), address.getPort());
     }
 
 
-    public static synchronized void updateHintsDropped(InetAddressAndPort ep, UUID timePeriod, int value)
+    public static synchronized void updateHintsDropped(InetAddressAndPort ep, TimeUUID timePeriod, int value)
     {
         // with 30 day TTL
         String req = "UPDATE system.%s USING TTL 2592000 SET hints_dropped[ ? ] = ? WHERE peer = ?";
-        executeInternal(String.format(req, LEGACY_PEER_EVENTS), timePeriod, value, ep.address);
+        executeInternal(String.format(req, LEGACY_PEER_EVENTS), timePeriod, value, ep.getAddress());
         req = "UPDATE system.%s USING TTL 2592000 SET hints_dropped[ ? ] = ? WHERE peer = ? AND peer_port = ?";
-        executeInternal(String.format(req, PEER_EVENTS_V2), timePeriod, value, ep.address, ep.port);
+        executeInternal(String.format(req, PEER_EVENTS_V2), timePeriod, value, ep.getAddress(), ep.getPort());
     }
 
     public static synchronized void updateSchemaVersion(UUID version)
@@ -849,12 +906,12 @@
     /**
      * Remove stored tokens being used by another node
      */
-    public static synchronized void removeEndpoint(InetAddressAndPort ep)
+    public static synchronized void removeEndpoint(InetSocketAddress ep)
     {
         String req = "DELETE FROM system.%s WHERE peer = ?";
-        executeInternal(String.format(req, LEGACY_PEERS), ep.address);
+        executeInternal(String.format(req, LEGACY_PEERS), ep.getAddress());
         req = String.format("DELETE FROM system.%s WHERE peer = ? AND peer_port = ?", PEERS_V2);
-        executeInternal(req, ep.address, ep.port);
+        executeInternal(req, ep.getAddress(), ep.getPort());
         forceBlockingFlush(LEGACY_PEERS, PEERS_V2);
     }
 
@@ -878,11 +935,13 @@
     {
         if (!DatabaseDescriptor.isUnsafeSystem())
         {
-            List<ListenableFuture<CommitLogPosition>> futures = new ArrayList<>();
+            List<Future<CommitLogPosition>> futures = new ArrayList<>();
 
             for (String cfname : cfnames)
             {
-                futures.add(Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(cfname).forceFlush());
+                futures.add(Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME)
+                                    .getColumnFamilyStore(cfname)
+                                    .forceFlush(ColumnFamilyStore.FlushReason.INTERNALLY_FORCED));
             }
             FBUtilities.waitOnFutures(futures);
         }
@@ -936,9 +995,9 @@
     public static InetAddressAndPort getPreferredIP(InetAddressAndPort ep)
     {
         Preconditions.checkState(DatabaseDescriptor.isDaemonInitialized()); // Make sure being used as a daemon, not a tool
-        
+
         String req = "SELECT preferred_ip, preferred_port FROM system.%s WHERE peer=? AND peer_port = ?";
-        UntypedResultSet result = executeInternal(String.format(req, PEERS_V2), ep.address, ep.port);
+        UntypedResultSet result = executeInternal(String.format(req, PEERS_V2), ep.getAddress(), ep.getPort());
         if (!result.isEmpty() && result.one().has("preferred_ip"))
         {
             UntypedResultSet.Row row = result.one();
@@ -985,7 +1044,7 @@
                 return CURRENT_VERSION;
             }
             String req = "SELECT release_version FROM system.%s WHERE peer=? AND peer_port=?";
-            UntypedResultSet result = executeInternal(String.format(req, PEERS_V2), ep.address, ep.port);
+            UntypedResultSet result = executeInternal(String.format(req, PEERS_V2), ep.getAddress(), ep.getPort());
             if (result != null && result.one().has("release_version"))
             {
                 return new CassandraVersion(result.one().getString("release_version"));
@@ -1061,13 +1120,13 @@
             // seconds-since-epoch isn't a foolproof new generation
             // (where foolproof is "guaranteed to be larger than the last one seen at this ip address"),
             // but it's as close as sanely possible
-            generation = (int) (System.currentTimeMillis() / 1000);
+            generation = (int) (currentTimeMillis() / 1000);
         }
         else
         {
             // Other nodes will ignore gossip messages about a node that have a lower generation than previously seen.
             final int storedGeneration = result.one().getInt("gossip_generation") + 1;
-            final int now = (int) (System.currentTimeMillis() / 1000);
+            final int now = (int) (currentTimeMillis() / 1000);
             if (storedGeneration >= now)
             {
                 logger.warn("Using stored Gossip Generation {} as it is greater than current system time {}.  See CASSANDRA-3654 if you experience problems",
@@ -1202,6 +1261,20 @@
     }
 
     /**
+     * Gets the schema version or null if missing
+     */
+    public static UUID getSchemaVersion()
+    {
+        String req = "SELECT schema_version FROM system.%s WHERE key='%s'";
+        UntypedResultSet result = executeInternal(format(req, LOCAL, LOCAL));
+
+        if (!result.isEmpty() && result.one().has("schema_version"))
+            return result.one().getUUID("schema_version");
+
+        return null;
+    }
+
+    /**
      * Gets the stored rack for the local node, or null if none have been set yet.
      */
     public static String getRack()
@@ -1231,72 +1304,178 @@
         return null;
     }
 
-    public static PaxosState loadPaxosState(DecoratedKey key, TableMetadata metadata, int nowInSec)
+    /**
+     * Load the current paxos state for the table and key
+     */
+    public static PaxosState.Snapshot loadPaxosState(DecoratedKey partitionKey, TableMetadata metadata, int nowInSec)
     {
-        String req = "SELECT * FROM system.%s WHERE row_key = ? AND cf_id = ?";
-        UntypedResultSet results = QueryProcessor.executeInternalWithNow(nowInSec, System.nanoTime(), format(req, PAXOS), key.getKey(), metadata.id.asUUID());
-        if (results.isEmpty())
-            return new PaxosState(key, metadata);
-        UntypedResultSet.Row row = results.one();
+        String cql = "SELECT * FROM system." + PAXOS + " WHERE row_key = ? AND cf_id = ?";
+        List<Row> results = QueryProcessor.executeInternalRawWithNow(nowInSec, cql, partitionKey.getKey(), metadata.id.asUUID()).get(partitionKey);
+        if (results == null || results.isEmpty())
+        {
+            Committed noneCommitted = Committed.none(partitionKey, metadata);
+            return new PaxosState.Snapshot(Ballot.none(), Ballot.none(), null, noneCommitted);
+        }
 
-        Commit promised = row.has("in_progress_ballot")
-                        ? new Commit(row.getUUID("in_progress_ballot"), new PartitionUpdate.Builder(metadata, key, metadata.regularAndStaticColumns(), 1).build())
-                        : Commit.emptyCommit(key, metadata);
+        Row row = results.get(0);
+
+        Ballot promisedWrite = PaxosRows.getWritePromise(row);
+        Ballot promised = latest(promisedWrite, PaxosRows.getPromise(row));
+
         // either we have both a recently accepted ballot and update or we have neither
-        Commit accepted = row.has("proposal_version") && row.has("proposal")
-                        ? new Commit(row.getUUID("proposal_ballot"),
-                                     PartitionUpdate.fromBytes(row.getBytes("proposal"), row.getInt("proposal_version")))
-                        : Commit.emptyCommit(key, metadata);
-        // either most_recent_commit and most_recent_commit_at will both be set, or neither
-        Commit mostRecent = row.has("most_recent_commit_version") && row.has("most_recent_commit")
-                          ? new Commit(row.getUUID("most_recent_commit_at"),
-                                       PartitionUpdate.fromBytes(row.getBytes("most_recent_commit"), row.getInt("most_recent_commit_version")))
-                          : Commit.emptyCommit(key, metadata);
-        return new PaxosState(promised, accepted, mostRecent);
+        Accepted accepted = PaxosRows.getAccepted(row);
+        Committed committed = PaxosRows.getCommitted(metadata, partitionKey, row);
+        // fix a race with TTL/deletion resolution, where TTL expires after equal deletion is inserted; TTL wins the resolution, and is read using an old ballot's nowInSec
+        if (accepted != null && !accepted.isAfter(committed))
+            accepted = null;
+
+        return new PaxosState.Snapshot(promised, promisedWrite, accepted, committed);
     }
 
-    public static void savePaxosPromise(Commit promise)
+    public static int legacyPaxosTtlSec(TableMetadata metadata)
     {
-        String req = "UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET in_progress_ballot = ? WHERE row_key = ? AND cf_id = ?";
-        executeInternal(format(req, PAXOS),
-                        UUIDGen.microsTimestamp(promise.ballot),
-                        paxosTtlSec(promise.update.metadata()),
-                        promise.ballot,
-                        promise.update.partitionKey().getKey(),
-                        promise.update.metadata().id.asUUID());
+        // keep paxos state around for at least 3h
+        return Math.max(3 * 3600, metadata.params.gcGraceSeconds);
+    }
+
+    public static void savePaxosWritePromise(DecoratedKey key, TableMetadata metadata, Ballot ballot)
+    {
+        if (paxosStatePurging() == legacy)
+        {
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? AND TTL ? SET in_progress_ballot = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternal(cql,
+                            ballot.unixMicros(),
+                            legacyPaxosTtlSec(metadata),
+                            ballot,
+                            key.getKey(),
+                            metadata.id.asUUID());
+        }
+        else
+        {
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? SET in_progress_ballot = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternal(cql,
+                            ballot.unixMicros(),
+                            ballot,
+                            key.getKey(),
+                            metadata.id.asUUID());
+        }
+    }
+
+    public static void savePaxosReadPromise(DecoratedKey key, TableMetadata metadata, Ballot ballot)
+    {
+        if (paxosStatePurging() == legacy)
+        {
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? AND TTL ? SET in_progress_read_ballot = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternal(cql,
+                            ballot.unixMicros(),
+                            legacyPaxosTtlSec(metadata),
+                            ballot,
+                            key.getKey(),
+                            metadata.id.asUUID());
+        }
+        else
+        {
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? SET in_progress_read_ballot = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternal(cql,
+                            ballot.unixMicros(),
+                            ballot,
+                            key.getKey(),
+                            metadata.id.asUUID());
+        }
     }
 
     public static void savePaxosProposal(Commit proposal)
     {
-        executeInternal(format("UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = ?, proposal = ?, proposal_version = ? WHERE row_key = ? AND cf_id = ?", PAXOS),
-                        UUIDGen.microsTimestamp(proposal.ballot),
-                        paxosTtlSec(proposal.update.metadata()),
-                        proposal.ballot,
-                        PartitionUpdate.toBytes(proposal.update, MessagingService.current_version),
-                        MessagingService.current_version,
-                        proposal.update.partitionKey().getKey(),
-                        proposal.update.metadata().id.asUUID());
-    }
-
-    public static int paxosTtlSec(TableMetadata metadata)
-    {
-        // keep paxos state around for at least 3h
-        return Math.max(3 * 3600, metadata.params.gcGraceSeconds);
+        if (proposal instanceof AcceptedWithTTL)
+        {
+            int localDeletionTime = ((Commit.AcceptedWithTTL) proposal).localDeletionTime;
+            int ttlInSec = legacyPaxosTtlSec(proposal.update.metadata());
+            int nowInSec = localDeletionTime - ttlInSec;
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? AND TTL ? SET proposal_ballot = ?, proposal = ?, proposal_version = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternalWithNowInSec(cql,
+                                        nowInSec,
+                                        proposal.ballot.unixMicros(),
+                                        ttlInSec,
+                                        proposal.ballot,
+                                        PartitionUpdate.toBytes(proposal.update, MessagingService.current_version),
+                                        MessagingService.current_version,
+                                        proposal.update.partitionKey().getKey(),
+                                        proposal.update.metadata().id.asUUID());
+        }
+        else
+        {
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? SET proposal_ballot = ?, proposal = ?, proposal_version = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternal(cql,
+                            proposal.ballot.unixMicros(),
+                            proposal.ballot,
+                            PartitionUpdate.toBytes(proposal.update, MessagingService.current_version),
+                            MessagingService.current_version,
+                            proposal.update.partitionKey().getKey(),
+                            proposal.update.metadata().id.asUUID());
+        }
     }
 
     public static void savePaxosCommit(Commit commit)
     {
         // We always erase the last proposal (with the commit timestamp to no erase more recent proposal in case the commit is old)
         // even though that's really just an optimization  since SP.beginAndRepairPaxos will exclude accepted proposal older than the mrc.
-        String cql = "UPDATE system.%s USING TIMESTAMP ? AND TTL ? SET proposal_ballot = null, proposal = null, most_recent_commit_at = ?, most_recent_commit = ?, most_recent_commit_version = ? WHERE row_key = ? AND cf_id = ?";
-        executeInternal(format(cql, PAXOS),
-                        UUIDGen.microsTimestamp(commit.ballot),
-                        paxosTtlSec(commit.update.metadata()),
-                        commit.ballot,
-                        PartitionUpdate.toBytes(commit.update, MessagingService.current_version),
-                        MessagingService.current_version,
-                        commit.update.partitionKey().getKey(),
-                        commit.update.metadata().id.asUUID());
+        if (commit instanceof Commit.CommittedWithTTL)
+        {
+            int localDeletionTime = ((Commit.CommittedWithTTL) commit).localDeletionTime;
+            int ttlInSec = legacyPaxosTtlSec(commit.update.metadata());
+            int nowInSec = localDeletionTime - ttlInSec;
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? AND TTL ? SET proposal_ballot = null, proposal = null, proposal_version = null, most_recent_commit_at = ?, most_recent_commit = ?, most_recent_commit_version = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternalWithNowInSec(cql,
+                            nowInSec,
+                            commit.ballot.unixMicros(),
+                            ttlInSec,
+                            commit.ballot,
+                            PartitionUpdate.toBytes(commit.update, MessagingService.current_version),
+                            MessagingService.current_version,
+                            commit.update.partitionKey().getKey(),
+                            commit.update.metadata().id.asUUID());
+        }
+        else
+        {
+            String cql = "UPDATE system." + PAXOS + " USING TIMESTAMP ? SET proposal_ballot = null, proposal = null, proposal_version = null, most_recent_commit_at = ?, most_recent_commit = ?, most_recent_commit_version = ? WHERE row_key = ? AND cf_id = ?";
+            executeInternal(cql,
+                            commit.ballot.unixMicros(),
+                            commit.ballot,
+                            PartitionUpdate.toBytes(commit.update, MessagingService.current_version),
+                            MessagingService.current_version,
+                            commit.update.partitionKey().getKey(),
+                            commit.update.metadata().id.asUUID());
+        }
+    }
+
+    @VisibleForTesting
+    public static void savePaxosRepairHistory(String keyspace, String table, PaxosRepairHistory history, boolean flush)
+    {
+        String cql = "INSERT INTO system.%s (keyspace_name, table_name, points) VALUES (?, ?, ?)";
+        executeInternal(String.format(cql, PAXOS_REPAIR_HISTORY), keyspace, table, history.toTupleBufferList());
+        if (flush)
+            flushPaxosRepairHistory();
+    }
+
+    public static void flushPaxosRepairHistory()
+    {
+        Schema.instance.getColumnFamilyStoreInstance(PaxosRepairHistoryTable.id)
+                       .forceBlockingFlush(ColumnFamilyStore.FlushReason.INTERNALLY_FORCED);
+    }
+
+    public static PaxosRepairHistory loadPaxosRepairHistory(String keyspace, String table)
+    {
+        if (SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES.contains(keyspace))
+            return PaxosRepairHistory.EMPTY;
+
+        UntypedResultSet results = executeInternal(String.format("SELECT * FROM system.%s WHERE keyspace_name=? AND table_name=?", PAXOS_REPAIR_HISTORY), keyspace, table);
+        if (results.isEmpty())
+            return PaxosRepairHistory.EMPTY;
+
+        UntypedResultSet.Row row = Iterables.getOnlyElement(results);
+        List<ByteBuffer> points = row.getList("points", BytesType.instance);
+
+        return PaxosRepairHistory.fromTupleBufferList(points);
     }
 
     /**
@@ -1304,12 +1483,12 @@
      * from values in system.sstable_activity if present.
      * @param keyspace the keyspace the sstable belongs to
      * @param table the table the sstable belongs to
-     * @param generation the generation number for the sstable
+     * @param id the generation id for the sstable
      */
-    public static RestorableMeter getSSTableReadMeter(String keyspace, String table, int generation)
+    public static RestorableMeter getSSTableReadMeter(String keyspace, String table, SSTableId id)
     {
-        String cql = "SELECT * FROM system.%s WHERE keyspace_name=? and columnfamily_name=? and generation=?";
-        UntypedResultSet results = executeInternal(format(cql, SSTABLE_ACTIVITY), keyspace, table, generation);
+        String cql = "SELECT * FROM system.%s WHERE keyspace_name=? and table_name=? and id=?";
+        UntypedResultSet results = executeInternal(format(cql, SSTABLE_ACTIVITY_V2), keyspace, table, id.toString());
 
         if (results.isEmpty())
             return new RestorableMeter();
@@ -1323,25 +1502,45 @@
     /**
      * Writes the current read rates for a given SSTable to system.sstable_activity
      */
-    public static void persistSSTableReadMeter(String keyspace, String table, int generation, RestorableMeter meter)
+    public static void persistSSTableReadMeter(String keyspace, String table, SSTableId id, RestorableMeter meter)
     {
         // Store values with a one-day TTL to handle corner cases where cleanup might not occur
-        String cql = "INSERT INTO system.%s (keyspace_name, columnfamily_name, generation, rate_15m, rate_120m) VALUES (?, ?, ?, ?, ?) USING TTL 864000";
-        executeInternal(format(cql, SSTABLE_ACTIVITY),
+        String cql = "INSERT INTO system.%s (keyspace_name, table_name, id, rate_15m, rate_120m) VALUES (?, ?, ?, ?, ?) USING TTL 864000";
+        executeInternal(format(cql, SSTABLE_ACTIVITY_V2),
                         keyspace,
                         table,
-                        generation,
+                        id.toString(),
                         meter.fifteenMinuteRate(),
                         meter.twoHourRate());
+
+        if (!DatabaseDescriptor.isUUIDSSTableIdentifiersEnabled() && id instanceof SequenceBasedSSTableId)
+        {
+            // we do this in order to make it possible to downgrade until we switch in cassandra.yaml to UUID based ids
+            // see the discussion on CASSANDRA-17048
+            cql = "INSERT INTO system.%s (keyspace_name, columnfamily_name, generation, rate_15m, rate_120m) VALUES (?, ?, ?, ?, ?) USING TTL 864000";
+            executeInternal(format(cql, LEGACY_SSTABLE_ACTIVITY),
+                            keyspace,
+                            table,
+                            ((SequenceBasedSSTableId) id).generation,
+                            meter.fifteenMinuteRate(),
+                            meter.twoHourRate());
+        }
     }
 
     /**
      * Clears persisted read rates from system.sstable_activity for SSTables that have been deleted.
      */
-    public static void clearSSTableReadMeter(String keyspace, String table, int generation)
+    public static void clearSSTableReadMeter(String keyspace, String table, SSTableId id)
     {
-        String cql = "DELETE FROM system.%s WHERE keyspace_name=? AND columnfamily_name=? and generation=?";
-        executeInternal(format(cql, SSTABLE_ACTIVITY), keyspace, table, generation);
+        String cql = "DELETE FROM system.%s WHERE keyspace_name=? AND table_name=? and id=?";
+        executeInternal(format(cql, SSTABLE_ACTIVITY_V2), keyspace, table, id.toString());
+        if (!DatabaseDescriptor.isUUIDSSTableIdentifiersEnabled() && id instanceof SequenceBasedSSTableId)
+        {
+            // we do this in order to make it possible to downgrade until we switch in cassandra.yaml to UUID based ids
+            // see the discussion on CASSANDRA-17048
+            cql = "DELETE FROM system.%s WHERE keyspace_name=? AND columnfamily_name=? and generation=?";
+            executeInternal(format(cql, LEGACY_SSTABLE_ACTIVITY), keyspace, table, ((SequenceBasedSSTableId) id).generation);
+        }
     }
 
     /**
@@ -1483,9 +1682,9 @@
         {
             rangesToUpdate.add(rangeToBytes(range));
         }
-        executeInternal(format(cql, LEGACY_TRANSFERRED_RANGES), rangesToUpdate, streamOperation.getDescription(), peer.address, keyspace);
+        executeInternal(format(cql, LEGACY_TRANSFERRED_RANGES), rangesToUpdate, streamOperation.getDescription(), peer.getAddress(), keyspace);
         cql = "UPDATE system.%s SET ranges = ranges + ? WHERE operation = ? AND peer = ? AND peer_port = ? AND keyspace_name = ?";
-        executeInternal(String.format(cql, TRANSFERRED_RANGES_V2), rangesToUpdate, streamOperation.getDescription(), peer.address, peer.port, keyspace);
+        executeInternal(String.format(cql, TRANSFERRED_RANGES_V2), rangesToUpdate, streamOperation.getDescription(), peer.getAddress(), peer.getPort(), keyspace);
     }
 
     public static synchronized Map<InetAddressAndPort, Set<Range<Token>>> getTransferredRanges(String description, String keyspace, IPartitioner partitioner)
@@ -1531,8 +1730,10 @@
             String snapshotName = Keyspace.getTimestampedSnapshotName(format("upgrade-%s-%s",
                                                                              previous,
                                                                              next));
+
+            Instant creationTime = now();
             for (String keyspace : SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES)
-                Keyspace.open(keyspace).snapshot(snapshotName, null, false, null);
+                Keyspace.open(keyspace).snapshot(snapshotName, null, false, null, null, creationTime);
         }
     }
 
@@ -1559,7 +1760,7 @@
             // from there, but it informs us that this isn't a completely new node.
             for (File dataDirectory : Directories.getKSChildDirectories(SchemaConstants.SYSTEM_KEYSPACE_NAME))
             {
-                if (dataDirectory.getName().equals("Versions") && dataDirectory.listFiles().length > 0)
+                if (dataDirectory.name().equals("Versions") && dataDirectory.tryList().length > 0)
                 {
                     logger.trace("Found unreadable versions info in pre 1.2 system.Versions table");
                     return UNREADABLE_VERSION.toString();
@@ -1667,4 +1868,48 @@
     public static interface TriFunction<A, B, C, D> {
         D accept(A var1, B var2, C var3);
     }
+
+    public static void saveTopPartitions(TableMetadata metadata, String topType, Collection<TopPartitionTracker.TopPartition> topPartitions, long lastUpdate)
+    {
+        String cql = String.format("INSERT INTO %s.%s (keyspace_name, table_name, top_type, top, last_update) values (?, ?, ?, ?, ?)", SchemaConstants.SYSTEM_KEYSPACE_NAME, TOP_PARTITIONS);
+        List<ByteBuffer> tupleList = new ArrayList<>(topPartitions.size());
+        topPartitions.forEach(tp -> {
+            String key = metadata.partitionKeyType.getString(tp.key.getKey());
+            tupleList.add(TupleType.buildValue(new ByteBuffer[] { UTF8Type.instance.decompose(key),
+                                                                  LongType.instance.decompose(tp.value)}));
+        });
+        executeInternal(cql, metadata.keyspace, metadata.name, topType, tupleList, Date.from(Instant.ofEpochMilli(lastUpdate)));
+    }
+
+    public static TopPartitionTracker.StoredTopPartitions getTopPartitions(TableMetadata metadata, String topType)
+    {
+        try
+        {
+            String cql = String.format("SELECT top, last_update FROM %s.%s WHERE keyspace_name = ? and table_name = ? and top_type = ?", SchemaConstants.SYSTEM_KEYSPACE_NAME, TOP_PARTITIONS);
+            UntypedResultSet res = executeInternal(cql, metadata.keyspace, metadata.name, topType);
+            if (res == null || res.isEmpty())
+                return TopPartitionTracker.StoredTopPartitions.EMPTY;
+            UntypedResultSet.Row row = res.one();
+            long lastUpdated = row.getLong("last_update");
+            List<ByteBuffer> top = row.getList("top", BytesType.instance);
+            if (top == null || top.isEmpty())
+                return TopPartitionTracker.StoredTopPartitions.EMPTY;
+
+            List<TopPartitionTracker.TopPartition> topPartitions = new ArrayList<>(top.size());
+            TupleType tupleType = new TupleType(Lists.newArrayList(UTF8Type.instance, LongType.instance));
+            for (ByteBuffer bb : top)
+            {
+                ByteBuffer[] components = tupleType.split(bb);
+                String keyStr = UTF8Type.instance.compose(components[0]);
+                long value = LongType.instance.compose(components[1]);
+                topPartitions.add(new TopPartitionTracker.TopPartition(metadata.partitioner.decorateKey(metadata.partitionKeyType.fromString(keyStr)), value));
+            }
+            return new TopPartitionTracker.StoredTopPartitions(topPartitions, lastUpdated);
+        }
+        catch (Exception e)
+        {
+            logger.warn("Could not load stored top {} partitions for {}.{}", topType, metadata.keyspace, metadata.name, e);
+            return TopPartitionTracker.StoredTopPartitions.EMPTY;
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/db/SystemKeyspaceMigrator40.java b/src/java/org/apache/cassandra/db/SystemKeyspaceMigrator40.java
deleted file mode 100644
index e0a58ba..0000000
--- a/src/java/org/apache/cassandra/db/SystemKeyspaceMigrator40.java
+++ /dev/null
@@ -1,229 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.db;
-
-import java.nio.ByteBuffer;
-import java.util.Collections;
-import java.util.Optional;
-import java.util.Set;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.db.marshal.BytesType;
-import org.apache.cassandra.db.marshal.Int32Type;
-import org.apache.cassandra.db.marshal.UTF8Type;
-import org.apache.cassandra.db.marshal.UUIDType;
-
-/**
- * Migrate 3.0 versions of some tables to 4.0. In this case it's just extra columns and some keys
- * that are changed.
- *
- * Can't just add the additional columns because they are primary key columns and C* doesn't support changing
- * key columns even if it's just clustering columns.
- */
-public class SystemKeyspaceMigrator40
-{
-    static final String legacyPeersName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_PEERS);
-    static final String peersName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.PEERS_V2);
-    static final String legacyPeerEventsName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_PEER_EVENTS);
-    static final String peerEventsName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.PEER_EVENTS_V2);
-    static final String legacyTransferredRangesName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_TRANSFERRED_RANGES);
-    static final String transferredRangesName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.TRANSFERRED_RANGES_V2);
-    static final String legacyAvailableRangesName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_AVAILABLE_RANGES);
-    static final String availableRangesName = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.AVAILABLE_RANGES_V2);
-
-
-    private static final Logger logger = LoggerFactory.getLogger(SystemKeyspaceMigrator40.class);
-
-    private SystemKeyspaceMigrator40() {}
-
-    public static void migrate()
-    {
-        migratePeers();
-        migratePeerEvents();
-        migrateTransferredRanges();
-        migrateAvailableRanges();
-    }
-
-    private static void migratePeers()
-    {
-        ColumnFamilyStore newPeers = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.PEERS_V2);
-
-        if (!newPeers.isEmpty())
-             return;
-
-        logger.info("{} table was empty, migrating legacy {}, if this fails you should fix the issue and then truncate {} to have it try again.",
-                                  peersName, legacyPeersName, peersName);
-
-        String query = String.format("SELECT * FROM %s",
-                                     legacyPeersName);
-
-        String insert = String.format("INSERT INTO %s ( "
-                                      + "peer, "
-                                      + "peer_port, "
-                                      + "data_center, "
-                                      + "host_id, "
-                                      + "preferred_ip, "
-                                      + "preferred_port, "
-                                      + "rack, "
-                                      + "release_version, "
-                                      + "native_address, "
-                                      + "native_port, "
-                                      + "schema_version, "
-                                      + "tokens) "
-                                      + " values ( ?, ?, ? , ? , ?, ?, ?, ?, ?, ?, ?, ?)",
-                                      peersName);
-
-        UntypedResultSet rows = QueryProcessor.executeInternalWithPaging(query, 1000);
-        int transferred = 0;
-        logger.info("Migrating rows from legacy {} to {}", legacyPeersName, peersName);
-        for (UntypedResultSet.Row row : rows)
-        {
-            logger.debug("Transferring row {}", transferred);
-            QueryProcessor.executeInternal(insert,
-                                           row.has("peer") ? row.getInetAddress("peer") : null,
-                                           DatabaseDescriptor.getStoragePort(),
-                                           row.has("data_center") ? row.getString("data_center") : null,
-                                           row.has("host_id") ? row.getUUID("host_id") : null,
-                                           row.has("preferred_ip") ? row.getInetAddress("preferred_ip") : null,
-                                           DatabaseDescriptor.getStoragePort(),
-                                           row.has("rack") ? row.getString("rack") : null,
-                                           row.has("release_version") ? row.getString("release_version") : null,
-                                           row.has("rpc_address") ? row.getInetAddress("rpc_address") : null,
-                                           DatabaseDescriptor.getNativeTransportPort(),
-                                           row.has("schema_version") ? row.getUUID("schema_version") : null,
-                                           row.has("tokens") ? row.getSet("tokens", UTF8Type.instance) : null);
-            transferred++;
-        }
-        logger.info("Migrated {} rows from legacy {} to {}", transferred, legacyPeersName, peersName);
-    }
-
-    private static void migratePeerEvents()
-    {
-        ColumnFamilyStore newPeerEvents = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.PEER_EVENTS_V2);
-
-        if (!newPeerEvents.isEmpty())
-            return;
-
-        logger.info("{} table was empty, migrating legacy {} to {}", peerEventsName, legacyPeerEventsName, peerEventsName);
-
-        String query = String.format("SELECT * FROM %s",
-                                     legacyPeerEventsName);
-
-        String insert = String.format("INSERT INTO %s ( "
-                                      + "peer, "
-                                      + "peer_port, "
-                                      + "hints_dropped) "
-                                      + " values ( ?, ?, ? )",
-                                      peerEventsName);
-
-        UntypedResultSet rows = QueryProcessor.executeInternalWithPaging(query, 1000);
-        int transferred = 0;
-        for (UntypedResultSet.Row row : rows)
-        {
-            logger.debug("Transferring row {}", transferred);
-            QueryProcessor.executeInternal(insert,
-                                           row.has("peer") ? row.getInetAddress("peer") : null,
-                                           DatabaseDescriptor.getStoragePort(),
-                                           row.has("hints_dropped") ? row.getMap("hints_dropped", UUIDType.instance, Int32Type.instance) : null);
-            transferred++;
-        }
-        logger.info("Migrated {} rows from legacy {} to {}", transferred, legacyPeerEventsName, peerEventsName);
-    }
-
-    static void migrateTransferredRanges()
-    {
-        ColumnFamilyStore newTransferredRanges = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.TRANSFERRED_RANGES_V2);
-
-        if (!newTransferredRanges.isEmpty())
-            return;
-
-        logger.info("{} table was empty, migrating legacy {} to {}", transferredRangesName, legacyTransferredRangesName, transferredRangesName);
-
-        String query = String.format("SELECT * FROM %s",
-                                     legacyTransferredRangesName);
-
-        String insert = String.format("INSERT INTO %s ("
-                                      + "operation, "
-                                      + "peer, "
-                                      + "peer_port, "
-                                      + "keyspace_name, "
-                                      + "ranges) "
-                                      + " values ( ?, ?, ? , ?, ?)",
-                                      transferredRangesName);
-
-        UntypedResultSet rows = QueryProcessor.executeInternalWithPaging(query, 1000);
-        int transferred = 0;
-        for (UntypedResultSet.Row row : rows)
-        {
-            logger.debug("Transferring row {}", transferred);
-            QueryProcessor.executeInternal(insert,
-                                           row.has("operation") ? row.getString("operation") : null,
-                                           row.has("peer") ? row.getInetAddress("peer") : null,
-                                           DatabaseDescriptor.getStoragePort(),
-                                           row.has("keyspace_name") ? row.getString("keyspace_name") : null,
-                                           row.has("ranges") ? row.getSet("ranges", BytesType.instance) : null);
-            transferred++;
-        }
-
-        logger.info("Migrated {} rows from legacy {} to {}", transferred, legacyTransferredRangesName, transferredRangesName);
-    }
-
-    static void migrateAvailableRanges()
-    {
-        ColumnFamilyStore newAvailableRanges = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.AVAILABLE_RANGES_V2);
-
-        if (!newAvailableRanges.isEmpty())
-            return;
-
-        logger.info("{} table was empty, migrating legacy {} to {}", availableRangesName, legacyAvailableRangesName, availableRangesName);
-
-        String query = String.format("SELECT * FROM %s",
-                                     legacyAvailableRangesName);
-
-        String insert = String.format("INSERT INTO %s ("
-                                      + "keyspace_name, "
-                                      + "full_ranges, "
-                                      + "transient_ranges) "
-                                      + " values ( ?, ?, ? )",
-                                      availableRangesName);
-
-        UntypedResultSet rows = QueryProcessor.executeInternalWithPaging(query, 1000);
-        int transferred = 0;
-        for (UntypedResultSet.Row row : rows)
-        {
-            logger.debug("Transferring row {}", transferred);
-            String keyspace = row.getString("keyspace_name");
-            Set<ByteBuffer> ranges = Optional.ofNullable(row.getSet("ranges", BytesType.instance)).orElse(Collections.emptySet());
-            QueryProcessor.executeInternal(insert,
-                                           keyspace,
-                                           ranges,
-                                           Collections.emptySet());
-            transferred++;
-        }
-
-        logger.info("Migrated {} rows from legacy {} to {}", transferred, legacyAvailableRangesName, availableRangesName);
-    }
-
-}
diff --git a/src/java/org/apache/cassandra/db/SystemKeyspaceMigrator41.java b/src/java/org/apache/cassandra/db/SystemKeyspaceMigrator41.java
new file mode 100644
index 0000000..bfce780
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/SystemKeyspaceMigrator41.java
@@ -0,0 +1,204 @@
+/*
+ * 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;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Optional;
+import java.util.function.Function;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.FBUtilities;
+
+/**
+ * Migrate 3.0 versions of some tables to 4.1. In this case it's just extra columns and some keys
+ * that are changed.
+ * <p>
+ * Can't just add the additional columns because they are primary key columns and C* doesn't support changing
+ * key columns even if it's just clustering columns.
+ */
+public class SystemKeyspaceMigrator41
+{
+    private static final Logger logger = LoggerFactory.getLogger(SystemKeyspaceMigrator41.class);
+
+    private SystemKeyspaceMigrator41()
+    {
+    }
+
+    public static void migrate()
+    {
+        migratePeers();
+        migratePeerEvents();
+        migrateTransferredRanges();
+        migrateAvailableRanges();
+        migrateSSTableActivity();
+    }
+
+    @VisibleForTesting
+    static void migratePeers()
+    {
+        migrateTable(false,
+                     SystemKeyspace.LEGACY_PEERS,
+                     SystemKeyspace.PEERS_V2,
+                     new String[]{ "peer",
+                                   "peer_port",
+                                   "data_center",
+                                   "host_id",
+                                   "preferred_ip",
+                                   "preferred_port",
+                                   "rack",
+                                   "release_version",
+                                   "native_address",
+                                   "native_port",
+                                   "schema_version",
+                                   "tokens" },
+                     row -> Collections.singletonList(new Object[]{ row.has("peer") ? row.getInetAddress("peer") : null,
+                                                                    DatabaseDescriptor.getStoragePort(),
+                                                                    row.has("data_center") ? row.getString("data_center") : null,
+                                                                    row.has("host_id") ? row.getUUID("host_id") : null,
+                                                                    row.has("preferred_ip") ? row.getInetAddress("preferred_ip") : null,
+                                                                    DatabaseDescriptor.getStoragePort(),
+                                                                    row.has("rack") ? row.getString("rack") : null,
+                                                                    row.has("release_version") ? row.getString("release_version") : null,
+                                                                    row.has("rpc_address") ? row.getInetAddress("rpc_address") : null,
+                                                                    DatabaseDescriptor.getNativeTransportPort(),
+                                                                    row.has("schema_version") ? row.getUUID("schema_version") : null,
+                                                                    row.has("tokens") ? row.getSet("tokens", UTF8Type.instance) : null }));
+    }
+
+    @VisibleForTesting
+    static void migratePeerEvents()
+    {
+        migrateTable(false,
+                     SystemKeyspace.LEGACY_PEER_EVENTS,
+                     SystemKeyspace.PEER_EVENTS_V2,
+                     new String[]{ "peer",
+                                   "peer_port",
+                                   "hints_dropped" },
+                     row -> Collections.singletonList(
+                     new Object[]{ row.has("peer") ? row.getInetAddress("peer") : null,
+                                   DatabaseDescriptor.getStoragePort(),
+                                   row.has("hints_dropped") ? row.getMap("hints_dropped", TimeUUIDType.instance, Int32Type.instance) : null }
+                     ));
+    }
+
+    @VisibleForTesting
+    static void migrateTransferredRanges()
+    {
+        migrateTable(false,
+                     SystemKeyspace.LEGACY_TRANSFERRED_RANGES,
+                     SystemKeyspace.TRANSFERRED_RANGES_V2,
+                     new String[]{ "operation", "peer", "peer_port", "keyspace_name", "ranges" },
+                     row -> Collections.singletonList(new Object[]{ row.has("operation") ? row.getString("operation") : null,
+                                                                    row.has("peer") ? row.getInetAddress("peer") : null,
+                                                                    DatabaseDescriptor.getStoragePort(),
+                                                                    row.has("keyspace_name") ? row.getString("keyspace_name") : null,
+                                                                    row.has("ranges") ? row.getSet("ranges", BytesType.instance) : null }));
+    }
+
+    @VisibleForTesting
+    static void migrateAvailableRanges()
+    {
+        migrateTable(false,
+                     SystemKeyspace.LEGACY_AVAILABLE_RANGES,
+                     SystemKeyspace.AVAILABLE_RANGES_V2,
+                     new String[]{ "keyspace_name", "full_ranges", "transient_ranges" },
+                     row -> Collections.singletonList(new Object[]{ row.getString("keyspace_name"),
+                                                                    Optional.ofNullable(row.getSet("ranges", BytesType.instance)).orElse(Collections.emptySet()),
+                                                                    Collections.emptySet() }));
+    }
+
+    @VisibleForTesting
+    static void migrateSSTableActivity()
+    {
+        String prevVersionString = FBUtilities.getPreviousReleaseVersionString();
+        CassandraVersion prevVersion = prevVersionString != null ? new CassandraVersion(prevVersionString) : CassandraVersion.NULL_VERSION;
+
+        // if we are upgrading from pre 4.1, we want to force repopulate the table; this is for the case when we
+        // upgraded from pre 4.1, then downgraded to pre 4.1 and then upgraded again
+        migrateTable(CassandraVersion.CASSANDRA_4_1.compareTo(prevVersion) > 0,
+                     SystemKeyspace.LEGACY_SSTABLE_ACTIVITY,
+                     SystemKeyspace.SSTABLE_ACTIVITY_V2,
+                     new String[]{ "keyspace_name", "table_name", "id", "rate_120m", "rate_15m" },
+                     row ->
+                     Collections.singletonList(new Object[]{ row.getString("keyspace_name"),
+                                                             row.getString("columnfamily_name"),
+                                                             new SequenceBasedSSTableId(row.getInt("generation")).toString(),
+                                                             row.has("rate_120m") ? row.getDouble("rate_120m") : null,
+                                                             row.has("rate_15m") ? row.getDouble("rate_15m") : null
+                     })
+        );
+    }
+
+    /**
+     * Perform table migration by reading data from the old table, converting it, and adding to the new table.
+     *
+     * @param truncateIfExists truncate the existing table if it exists before migration; if it is disabled
+     *                         and the new table is not empty, no migration is performed
+     * @param oldName          old table name
+     * @param newName          new table name
+     * @param columns          columns to fill in the new table in the same order as returned by the transformation
+     * @param transformation   transformation function which gets the row from the old table and returns a row for the new table
+     */
+    @VisibleForTesting
+    static void migrateTable(boolean truncateIfExists, String oldName, String newName, String[] columns, Function<UntypedResultSet.Row, Collection<Object[]>> transformation)
+    {
+        ColumnFamilyStore newTable = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(newName);
+
+        if (!newTable.isEmpty() && !truncateIfExists)
+            return;
+
+        if (truncateIfExists)
+            newTable.truncateBlockingWithoutSnapshot();
+
+        logger.info("{} table was empty, migrating legacy {}, if this fails you should fix the issue and then truncate {} to have it try again.",
+                    newName, oldName, newName);
+
+        String query = String.format("SELECT * FROM %s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, oldName);
+        String insert = String.format("INSERT INTO %s.%s (%s) VALUES (%s)", SchemaConstants.SYSTEM_KEYSPACE_NAME, newName,
+                                      StringUtils.join(columns, ", "), StringUtils.repeat("?", ", ", columns.length));
+
+        UntypedResultSet rows = QueryProcessor.executeInternal(query);
+        int transferred = 0;
+        logger.info("Migrating rows from legacy {} to {}", oldName, newName);
+        for (UntypedResultSet.Row row : rows)
+        {
+            logger.debug("Transferring row {}", transferred);
+            for (Object[] newRow : transformation.apply(row))
+                QueryProcessor.executeInternal(insert, newRow);
+            transferred++;
+        }
+
+        logger.info("Migrated {} rows from legacy {} to {}", transferred, oldName, newName);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java b/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java
index 8430541..856b27c 100644
--- a/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java
+++ b/src/java/org/apache/cassandra/db/UnfilteredDeserializer.java
@@ -19,7 +19,6 @@
 
 import java.io.IOException;
 
-import org.apache.cassandra.db.marshal.ByteArrayAccessor;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.io.util.DataInputPlus;
diff --git a/src/java/org/apache/cassandra/db/VirtualTablePartitionRangeReadQuery.java b/src/java/org/apache/cassandra/db/VirtualTablePartitionRangeReadQuery.java
deleted file mode 100644
index 48cafa1..0000000
--- a/src/java/org/apache/cassandra/db/VirtualTablePartitionRangeReadQuery.java
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.db;
-
-import org.apache.cassandra.db.filter.ColumnFilter;
-import org.apache.cassandra.db.filter.DataLimits;
-import org.apache.cassandra.db.filter.RowFilter;
-import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
-import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
-import org.apache.cassandra.db.virtual.VirtualTable;
-import org.apache.cassandra.schema.TableMetadata;
-
-/**
- * A read query that selects a (part of a) range of partitions of a virtual table.
- */
-public class VirtualTablePartitionRangeReadQuery extends VirtualTableReadQuery implements PartitionRangeReadQuery
-{
-    private final DataRange dataRange;
-
-    public static VirtualTablePartitionRangeReadQuery create(TableMetadata metadata,
-                                                             int nowInSec,
-                                                             ColumnFilter columnFilter,
-                                                             RowFilter rowFilter,
-                                                             DataLimits limits,
-                                                             DataRange dataRange)
-    {
-        return new VirtualTablePartitionRangeReadQuery(metadata,
-                                                       nowInSec,
-                                                       columnFilter,
-                                                       rowFilter,
-                                                       limits,
-                                                       dataRange);
-    }
-
-    private VirtualTablePartitionRangeReadQuery(TableMetadata metadata,
-                                                int nowInSec,
-                                                ColumnFilter columnFilter,
-                                                RowFilter rowFilter,
-                                                DataLimits limits,
-                                                DataRange dataRange)
-    {
-        super(metadata, nowInSec, columnFilter, rowFilter, limits);
-        this.dataRange = dataRange;
-    }
-
-    @Override
-    public DataRange dataRange()
-    {
-        return dataRange;
-    }
-
-    @Override
-    public PartitionRangeReadQuery withUpdatedLimit(DataLimits newLimits)
-    {
-        return new VirtualTablePartitionRangeReadQuery(metadata(),
-                                                       nowInSec(),
-                                                       columnFilter(),
-                                                       rowFilter(),
-                                                       newLimits,
-                                                       dataRange());
-    }
-
-    @Override
-    public PartitionRangeReadQuery withUpdatedLimitsAndDataRange(DataLimits newLimits, DataRange newDataRange)
-    {
-        return new VirtualTablePartitionRangeReadQuery(metadata(),
-                                                       nowInSec(),
-                                                       columnFilter(),
-                                                       rowFilter(),
-                                                       newLimits,
-                                                       newDataRange);
-    }
-
-    @Override
-    protected UnfilteredPartitionIterator queryVirtualTable()
-    {
-        VirtualTable view = VirtualKeyspaceRegistry.instance.getTableNullable(metadata().id);
-        return view.select(dataRange, columnFilter());
-    }
-
-    @Override
-    protected void appendCQLWhereClause(StringBuilder sb)
-    {
-        if (dataRange.isUnrestricted() && rowFilter().isEmpty())
-            return;
-
-        sb.append(" WHERE ");
-        // We put the row filter first because the data range can end by "ORDER BY"
-        if (!rowFilter().isEmpty())
-        {
-            sb.append(rowFilter());
-            if (!dataRange.isUnrestricted())
-                sb.append(" AND ");
-        }
-        if (!dataRange.isUnrestricted())
-            sb.append(dataRange.toCQLString(metadata()));
-    }
-}
diff --git a/src/java/org/apache/cassandra/db/VirtualTableReadQuery.java b/src/java/org/apache/cassandra/db/VirtualTableReadQuery.java
deleted file mode 100644
index ad22a58..0000000
--- a/src/java/org/apache/cassandra/db/VirtualTableReadQuery.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.db;
-
-import org.apache.cassandra.db.filter.ColumnFilter;
-import org.apache.cassandra.db.filter.DataLimits;
-import org.apache.cassandra.db.filter.RowFilter;
-import org.apache.cassandra.db.partitions.PartitionIterator;
-import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
-import org.apache.cassandra.exceptions.RequestExecutionException;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.service.ClientState;
-
-/**
- * Base class for the {@code ReadQuery} implementations use to query virtual tables.
- */
-public abstract class VirtualTableReadQuery extends AbstractReadQuery
-{
-    protected VirtualTableReadQuery(TableMetadata metadata,
-                                    int nowInSec,
-                                    ColumnFilter columnFilter,
-                                    RowFilter rowFilter,
-                                    DataLimits limits)
-    {
-        super(metadata, nowInSec, columnFilter, rowFilter, limits);
-    }
-
-    @Override
-    public ReadExecutionController executionController()
-    {
-        return ReadExecutionController.empty();
-    }
-
-    @Override
-    public PartitionIterator execute(ConsistencyLevel consistency,
-                                     ClientState clientState,
-                                     long queryStartNanoTime) throws RequestExecutionException
-    {
-        return executeInternal(executionController());
-    }
-
-    @Override
-    @SuppressWarnings("resource")
-    public UnfilteredPartitionIterator executeLocally(ReadExecutionController executionController)
-    {
-        UnfilteredPartitionIterator resultIterator = queryVirtualTable();
-        return limits().filter(rowFilter().filter(resultIterator, nowInSec()), nowInSec(), selectsFullPartition());
-    }
-
-    protected abstract UnfilteredPartitionIterator queryVirtualTable();
-}
diff --git a/src/java/org/apache/cassandra/db/VirtualTableSinglePartitionReadQuery.java b/src/java/org/apache/cassandra/db/VirtualTableSinglePartitionReadQuery.java
deleted file mode 100644
index ba9441a..0000000
--- a/src/java/org/apache/cassandra/db/VirtualTableSinglePartitionReadQuery.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.db;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.apache.cassandra.db.filter.ClusteringIndexFilter;
-import org.apache.cassandra.db.filter.ColumnFilter;
-import org.apache.cassandra.db.filter.DataLimits;
-import org.apache.cassandra.db.filter.RowFilter;
-import org.apache.cassandra.db.partitions.PartitionIterator;
-import org.apache.cassandra.db.partitions.PartitionIterators;
-import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
-import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
-import org.apache.cassandra.db.virtual.VirtualTable;
-import org.apache.cassandra.exceptions.RequestExecutionException;
-import org.apache.cassandra.schema.ColumnMetadata;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.service.ClientState;
-
-/**
- * A read query that selects a (part of a) single partition of a virtual table.
- */
-public class VirtualTableSinglePartitionReadQuery extends VirtualTableReadQuery implements SinglePartitionReadQuery
-{
-    private final DecoratedKey partitionKey;
-    private final ClusteringIndexFilter clusteringIndexFilter;
-
-    public static VirtualTableSinglePartitionReadQuery create(TableMetadata metadata,
-                                                              int nowInSec,
-                                                              ColumnFilter columnFilter,
-                                                              RowFilter rowFilter,
-                                                              DataLimits limits,
-                                                              DecoratedKey partitionKey,
-                                                              ClusteringIndexFilter clusteringIndexFilter)
-    {
-        return new VirtualTableSinglePartitionReadQuery(metadata,
-                                                        nowInSec,
-                                                        columnFilter,
-                                                        rowFilter,
-                                                        limits,
-                                                        partitionKey,
-                                                        clusteringIndexFilter);
-    }
-
-    private VirtualTableSinglePartitionReadQuery(TableMetadata metadata,
-                                                 int nowInSec,
-                                                 ColumnFilter columnFilter,
-                                                 RowFilter rowFilter,
-                                                 DataLimits limits,
-                                                 DecoratedKey partitionKey,
-                                                 ClusteringIndexFilter clusteringIndexFilter)
-    {
-        super(metadata, nowInSec, columnFilter, rowFilter, limits);
-        this.partitionKey = partitionKey;
-        this.clusteringIndexFilter = clusteringIndexFilter;
-    }
-
-    @Override
-    protected void appendCQLWhereClause(StringBuilder sb)
-    {
-        sb.append(" WHERE ");
-
-        sb.append(ColumnMetadata.toCQLString(metadata().partitionKeyColumns())).append(" = ");
-        DataRange.appendKeyString(sb, metadata().partitionKeyType, partitionKey().getKey());
-
-        // We put the row filter first because the clustering index filter can end by "ORDER BY"
-        if (!rowFilter().isEmpty())
-            sb.append(" AND ").append(rowFilter());
-
-        String filterString = clusteringIndexFilter().toCQLString(metadata());
-        if (!filterString.isEmpty())
-            sb.append(" AND ").append(filterString);
-    }
-
-    @Override
-    public ClusteringIndexFilter clusteringIndexFilter()
-    {
-        return clusteringIndexFilter;
-    }
-
-    @Override
-    public boolean selectsFullPartition()
-    {
-        return clusteringIndexFilter.selectsAllPartition() && !rowFilter().hasExpressionOnClusteringOrRegularColumns();
-    }
-
-    @Override
-    public DecoratedKey partitionKey()
-    {
-        return partitionKey;
-    }
-
-    @Override
-    public SinglePartitionReadQuery withUpdatedLimit(DataLimits newLimits)
-    {
-        return new VirtualTableSinglePartitionReadQuery(metadata(),
-                                                        nowInSec(),
-                                                        columnFilter(),
-                                                        rowFilter(),
-                                                        newLimits,
-                                                        partitionKey(),
-                                                        clusteringIndexFilter);
-    }
-
-    @Override
-    public SinglePartitionReadQuery forPaging(Clustering<?> lastReturned, DataLimits limits)
-    {
-        return new VirtualTableSinglePartitionReadQuery(metadata(),
-                                                        nowInSec(),
-                                                        columnFilter(),
-                                                        rowFilter(),
-                                                        limits,
-                                                        partitionKey(),
-                                                      lastReturned == null ? clusteringIndexFilter
-                                                              : clusteringIndexFilter.forPaging(metadata().comparator,
-                                                                                                lastReturned,
-                                                                                                false));
-    }
-
-    @Override
-    protected UnfilteredPartitionIterator queryVirtualTable()
-    {
-        VirtualTable view = VirtualKeyspaceRegistry.instance.getTableNullable(metadata().id);
-        return view.select(partitionKey, clusteringIndexFilter, columnFilter());
-    }
-
-    /**
-     * Groups multiple single partition read queries.
-     */
-    public static class Group extends SinglePartitionReadQuery.Group<VirtualTableSinglePartitionReadQuery>
-    {
-        public static Group create(TableMetadata metadata,
-                                   int nowInSec,
-                                   ColumnFilter columnFilter,
-                                   RowFilter rowFilter,
-                                   DataLimits limits,
-                                   List<DecoratedKey> partitionKeys,
-                                   ClusteringIndexFilter clusteringIndexFilter)
-        {
-            List<VirtualTableSinglePartitionReadQuery> queries = new ArrayList<>(partitionKeys.size());
-            for (DecoratedKey partitionKey : partitionKeys)
-            {
-                queries.add(VirtualTableSinglePartitionReadQuery.create(metadata,
-                                                                        nowInSec,
-                                                                        columnFilter,
-                                                                        rowFilter,
-                                                                        limits,
-                                                                        partitionKey,
-                                                                        clusteringIndexFilter));
-            }
-
-            return new Group(queries, limits);
-        }
-
-        public Group(List<VirtualTableSinglePartitionReadQuery> queries, DataLimits limits)
-        {
-            super(queries, limits);
-        }
-
-        public static Group one(VirtualTableSinglePartitionReadQuery query)
-        {
-            return new Group(Collections.singletonList(query), query.limits());
-        }
-
-        public PartitionIterator execute(ConsistencyLevel consistency, ClientState clientState, long queryStartNanoTime) throws RequestExecutionException
-        {
-            if (queries.size() == 1)
-                return queries.get(0).execute(consistency, clientState, queryStartNanoTime);
-
-            return PartitionIterators.concat(queries.stream()
-                                                    .map(q -> q.execute(consistency, clientState, queryStartNanoTime))
-                                                    .collect(Collectors.toList()));
-        }
-    }
-}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/db/WindowsFailedSnapshotTracker.java b/src/java/org/apache/cassandra/db/WindowsFailedSnapshotTracker.java
deleted file mode 100644
index 134fb11..0000000
--- a/src/java/org/apache/cassandra/db/WindowsFailedSnapshotTracker.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.db;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.io.util.FileUtils;
-
-
-public class WindowsFailedSnapshotTracker
-{
-    private static final Logger logger = LoggerFactory.getLogger(WindowsFailedSnapshotTracker.class);
-    private static PrintWriter _failedSnapshotFile;
-
-    @VisibleForTesting
-    // Need to handle null for unit tests
-    public static final String TODELETEFILE = System.getenv("CASSANDRA_HOME") == null
-                 ? ".toDelete"
-                 : System.getenv("CASSANDRA_HOME") + File.separator + ".toDelete";
-
-    public static void deleteOldSnapshots()
-    {
-        if (new File(TODELETEFILE).exists())
-        {
-            try
-            {
-                try (BufferedReader reader = new BufferedReader(new FileReader(TODELETEFILE)))
-                {
-                    String snapshotDirectory;
-                    while ((snapshotDirectory = reader.readLine()) != null)
-                    {
-                        File f = new File(snapshotDirectory);
-
-                        // Skip folders that aren't a subset of temp or a data folder. We don't want people to accidentally
-                        // delete something important by virtue of adding something invalid to the .toDelete file.
-                        boolean validFolder = FileUtils.isSubDirectory(new File(System.getenv("TEMP")), f);
-                        for (String s : DatabaseDescriptor.getAllDataFileLocations())
-                            validFolder |= FileUtils.isSubDirectory(new File(s), f);
-
-                        if (!validFolder)
-                        {
-                            logger.warn("Skipping invalid directory found in .toDelete: {}. Only %TEMP% or data file subdirectories are valid.", f);
-                            continue;
-                        }
-
-                        // Could be a non-existent directory if deletion worked on previous JVM shutdown.
-                        if (f.exists())
-                        {
-                            logger.warn("Discovered obsolete snapshot. Deleting directory [{}]", snapshotDirectory);
-                            FileUtils.deleteRecursive(new File(snapshotDirectory));
-                        }
-                    }
-                }
-
-                // Only delete the old .toDelete file if we succeed in deleting all our known bad snapshots.
-                Files.delete(Paths.get(TODELETEFILE));
-            }
-            catch (IOException e)
-            {
-                logger.warn("Failed to open {}. Obsolete snapshots from previous runs will not be deleted.", TODELETEFILE, e);
-            }
-        }
-
-        try
-        {
-            _failedSnapshotFile = new PrintWriter(new FileWriter(TODELETEFILE, true));
-        }
-        catch (IOException e)
-        {
-            throw new RuntimeException(String.format("Failed to create failed snapshot tracking file [%s]. Aborting", TODELETEFILE));
-        }
-    }
-
-    public static synchronized void handleFailedSnapshot(File dir)
-    {
-        assert _failedSnapshotFile != null : "_failedSnapshotFile not initialized within WindowsFailedSnapshotTracker";
-        FileUtils.deleteRecursiveOnExit(dir);
-        _failedSnapshotFile.println(dir.toString());
-        _failedSnapshotFile.flush();
-    }
-
-    @VisibleForTesting
-    public static void resetForTests()
-    {
-        _failedSnapshotFile.close();
-    }
-}
diff --git a/src/java/org/apache/cassandra/db/aggregation/AggregationSpecification.java b/src/java/org/apache/cassandra/db/aggregation/AggregationSpecification.java
index 7324dfd..0d6c0ee 100644
--- a/src/java/org/apache/cassandra/db/aggregation/AggregationSpecification.java
+++ b/src/java/org/apache/cassandra/db/aggregation/AggregationSpecification.java
@@ -18,11 +18,16 @@
 package org.apache.cassandra.db.aggregation;
 
 import java.io.IOException;
+import java.util.List;
 
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.functions.Function;
+import org.apache.cassandra.cql3.selection.Selector;
 import org.apache.cassandra.db.ClusteringComparator;
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.TableMetadata;
 
 /**
  * Defines how rows should be grouped for creating aggregates.
@@ -44,6 +49,11 @@
     };
 
     /**
+     * Factory for <code>AggregationSpecification</code> that group all the row together.
+     */
+    public static final AggregationSpecification.Factory AGGREGATE_EVERYTHING_FACTORY = options -> AGGREGATE_EVERYTHING;
+
+    /**
      * The <code>AggregationSpecification</code> kind.
      */
     private final Kind kind;
@@ -53,7 +63,7 @@
      */
     public static enum Kind
     {
-        AGGREGATE_EVERYTHING, AGGREGATE_BY_PK_PREFIX
+        AGGREGATE_EVERYTHING, AGGREGATE_BY_PK_PREFIX, AGGREGATE_BY_PK_PREFIX_WITH_SELECTOR
     }
 
     /**
@@ -89,37 +99,86 @@
     public abstract GroupMaker newGroupMaker(GroupingState state);
 
     /**
-     * Creates a new <code>AggregationSpecification</code> instance that will build aggregates based on primary key
-     * columns.
+     * Creates a new {@code Factory} instance to create {@code AggregationSpecification} that will build aggregates
+     * based on primary key columns.
      *
      * @param comparator the comparator used to compare the clustering prefixes
      * @param clusteringPrefixSize the number of clustering columns used to create the aggregates
-     * @return a new <code>AggregationSpecification</code> instance that will build aggregates based on primary key
-     * columns
+     * @return a  new {@code Factory} instance to create {@code AggregationSpecification} that will build aggregates
+     * based on primary key columns.
      */
-    public static AggregationSpecification aggregatePkPrefix(ClusteringComparator comparator, int clusteringPrefixSize)
+    public static AggregationSpecification.Factory aggregatePkPrefixFactory(ClusteringComparator comparator,
+                                                                            int clusteringPrefixSize)
     {
-        return new AggregateByPkPrefix(comparator, clusteringPrefixSize);
+        return options -> new  AggregateByPkPrefix(comparator, clusteringPrefixSize);
+    }
+
+    public static AggregationSpecification.Factory aggregatePkPrefixFactoryWithSelector(final ClusteringComparator comparator,
+                                                                                        final int clusteringPrefixSize,
+                                                                                        final Selector.Factory factory)
+    {
+        return new Factory()
+        {
+            @Override
+            public void addFunctionsTo(List<Function> functions)
+            {
+                factory.addFunctionsTo(functions);
+            }
+
+            @Override
+            public AggregationSpecification newInstance(QueryOptions options)
+            {
+                Selector selector = factory.newInstance(options);
+                selector.validateForGroupBy();
+                return new  AggregateByPkPrefixWithSelector(comparator,
+                        clusteringPrefixSize,
+                        selector);
+            }
+        };
+    }
+    
+    /**
+     * Factory for {@code AggregationSpecification}.
+     *
+     */
+    public static interface Factory
+    {
+        /**
+         * Creates a new {@code AggregationSpecification} instance after having binded the parameters.
+         *
+         * @param options the query options
+         * @return a new {@code AggregationSpecification} instance.
+         */
+        public AggregationSpecification newInstance(QueryOptions options);
+
+        public default void addFunctionsTo(List<Function> functions)
+        {
+        }
     }
 
     /**
      * <code>AggregationSpecification</code> that build aggregates based on primary key columns
      */
-    private static final class AggregateByPkPrefix extends AggregationSpecification
+    private static class AggregateByPkPrefix extends AggregationSpecification
     {
         /**
          * The number of clustering component to compare.
          */
-        private final int clusteringPrefixSize;
+        protected final int clusteringPrefixSize;
 
         /**
          * The comparator used to compare the clustering prefixes.
          */
-        private final ClusteringComparator comparator;
+        protected final ClusteringComparator comparator;
 
         public AggregateByPkPrefix(ClusteringComparator comparator, int clusteringPrefixSize)
         {
-            super(Kind.AGGREGATE_BY_PK_PREFIX);
+            this(Kind.AGGREGATE_BY_PK_PREFIX, comparator, clusteringPrefixSize);
+        }
+
+        protected AggregateByPkPrefix(Kind kind, ClusteringComparator comparator, int clusteringPrefixSize)
+        {
+            super(kind);
             this.comparator = comparator;
             this.clusteringPrefixSize = clusteringPrefixSize;
         }
@@ -127,7 +186,32 @@
         @Override
         public GroupMaker newGroupMaker(GroupingState state)
         {
-            return GroupMaker.newInstance(comparator, clusteringPrefixSize, state);
+            return GroupMaker.newPkPrefixGroupMaker(comparator, clusteringPrefixSize, state);
+        }
+    }
+
+    /**
+     * <code>AggregationSpecification</code> that build aggregates based on primary key columns using a selector.
+     */
+    private static final class AggregateByPkPrefixWithSelector extends AggregateByPkPrefix
+    {
+        /**
+         * The selector.
+         */
+        private final Selector selector;
+
+        public AggregateByPkPrefixWithSelector(ClusteringComparator comparator,
+                                               int clusteringPrefixSize,
+                                               Selector selector)
+        {
+            super(Kind.AGGREGATE_BY_PK_PREFIX_WITH_SELECTOR, comparator, clusteringPrefixSize);
+            this.selector = selector;
+        }
+
+        @Override
+        public GroupMaker newGroupMaker(GroupingState state)
+        {
+            return GroupMaker.newSelectorGroupMaker(comparator, clusteringPrefixSize, selector, state);
         }
     }
 
@@ -143,12 +227,17 @@
                 case AGGREGATE_BY_PK_PREFIX:
                     out.writeUnsignedVInt(((AggregateByPkPrefix) aggregationSpec).clusteringPrefixSize);
                     break;
+                case AGGREGATE_BY_PK_PREFIX_WITH_SELECTOR:
+                    AggregateByPkPrefixWithSelector spec = (AggregateByPkPrefixWithSelector) aggregationSpec;
+                    out.writeUnsignedVInt(spec.clusteringPrefixSize);
+                    Selector.serializer.serialize(spec.selector, out, version);
+                    break;
                 default:
-                    throw new AssertionError();
+                    throw new AssertionError("Unknow aggregation kind: " + aggregationSpec.kind());
             }
         }
 
-        public AggregationSpecification deserialize(DataInputPlus in, int version, ClusteringComparator comparator) throws IOException
+        public AggregationSpecification deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
         {
             Kind kind = Kind.values()[in.readUnsignedByte()];
             switch (kind)
@@ -156,10 +245,15 @@
                 case AGGREGATE_EVERYTHING:
                     return AggregationSpecification.AGGREGATE_EVERYTHING;
                 case AGGREGATE_BY_PK_PREFIX:
+                    return new AggregateByPkPrefix(metadata.comparator, (int) in.readUnsignedVInt());
+                case AGGREGATE_BY_PK_PREFIX_WITH_SELECTOR:
                     int clusteringPrefixSize = (int) in.readUnsignedVInt();
-                    return AggregationSpecification.aggregatePkPrefix(comparator, clusteringPrefixSize);
+                    Selector selector = Selector.serializer.deserialize(in, version, metadata);
+                    return new AggregateByPkPrefixWithSelector(metadata.comparator,
+                                                               clusteringPrefixSize,
+                                                               selector);
                 default:
-                    throw new AssertionError();
+                    throw new AssertionError("Unknow aggregation kind: " + kind);
             }
         }
 
@@ -173,8 +267,15 @@
                 case AGGREGATE_BY_PK_PREFIX:
                     size += TypeSizes.sizeofUnsignedVInt(((AggregateByPkPrefix) aggregationSpec).clusteringPrefixSize);
                     break;
+                case AGGREGATE_BY_PK_PREFIX_WITH_SELECTOR:
+                    AggregateByPkPrefixWithSelector spec = (AggregateByPkPrefixWithSelector) aggregationSpec;
+                    size += TypeSizes.sizeofUnsignedVInt(spec.clusteringPrefixSize);
+                    size += Selector.serializer.serializedSize(spec.selector, version
+                            
+                            );
+                    break;
                 default:
-                    throw new AssertionError();
+                    throw new AssertionError("Unknow aggregation kind: " + aggregationSpec.kind());
             }
             return size;
         }
diff --git a/src/java/org/apache/cassandra/db/aggregation/GroupMaker.java b/src/java/org/apache/cassandra/db/aggregation/GroupMaker.java
index 90cdab2..968219f 100644
--- a/src/java/org/apache/cassandra/db/aggregation/GroupMaker.java
+++ b/src/java/org/apache/cassandra/db/aggregation/GroupMaker.java
@@ -19,9 +19,11 @@
 
 import java.nio.ByteBuffer;
 
+import org.apache.cassandra.cql3.selection.Selector;
 import org.apache.cassandra.db.Clustering;
 import org.apache.cassandra.db.ClusteringComparator;
 import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 /**
  * A <code>GroupMaker</code> can be used to determine if some sorted rows belongs to the same group or not.
@@ -44,16 +46,33 @@
         }
     };
 
-    public static GroupMaker newInstance(ClusteringComparator comparator, int clusteringPrefixSize, GroupingState state)
+    public static GroupMaker newPkPrefixGroupMaker(ClusteringComparator comparator,
+                                                   int clusteringPrefixSize,
+                                                   GroupingState state)
     {
         return new PkPrefixGroupMaker(comparator, clusteringPrefixSize, state);
     }
 
-    public static GroupMaker newInstance(ClusteringComparator comparator, int clusteringPrefixSize)
+    public static GroupMaker newPkPrefixGroupMaker(ClusteringComparator comparator, int clusteringPrefixSize)
     {
         return new PkPrefixGroupMaker(comparator, clusteringPrefixSize);
     }
 
+    public static GroupMaker newSelectorGroupMaker(ClusteringComparator comparator,
+                                                   int clusteringPrefixSize,
+                                                   Selector selector,
+                                                   GroupingState state)
+    {
+        return new SelectorGroupMaker(comparator, clusteringPrefixSize, selector, state);
+    }
+
+    public static GroupMaker newSelectorGroupMaker(ClusteringComparator comparator,
+                                                   int clusteringPrefixSize,
+                                                   Selector selector)
+    {
+        return new SelectorGroupMaker(comparator, clusteringPrefixSize, selector);
+    }
+
     /**
      * Checks if a given row belongs to the same group that the previous row or not.
      *
@@ -75,27 +94,27 @@
         return false;
     }
 
-    private static final class PkPrefixGroupMaker extends GroupMaker
+    private static class PkPrefixGroupMaker extends GroupMaker
     {
         /**
          * The size of the clustering prefix used to make the groups
          */
-        private final int clusteringPrefixSize;
+        protected final int clusteringPrefixSize;
 
         /**
          * The comparator used to compare the clustering prefixes.
          */
-        private final ClusteringComparator comparator;
+        protected final ClusteringComparator comparator;
 
         /**
          * The last partition key seen
          */
-        private ByteBuffer lastPartitionKey;
+        protected ByteBuffer lastPartitionKey;
 
         /**
          * The last clustering seen
          */
-        private Clustering<?> lastClustering;
+        protected Clustering<?> lastClustering;
 
         public PkPrefixGroupMaker(ClusteringComparator comparator, int clusteringPrefixSize, GroupingState state)
         {
@@ -113,28 +132,97 @@
         @Override
         public boolean isNewGroup(DecoratedKey partitionKey, Clustering<?> clustering)
         {
-            boolean isNew = false;
+            ByteBuffer key = partitionKey.getKey();
+            // We are entering a new group if:
+            // - the partition key is a new one
+            // - the last clustering was not null and does not have the same prefix as the new clustering one
+            boolean isNew = !key.equals(lastPartitionKey)
+                            || lastClustering == null
+                            || comparator.compare(lastClustering, clustering, clusteringPrefixSize) != 0;
+
+            lastPartitionKey = key;
+            lastClustering =  Clustering.STATIC_CLUSTERING == clustering ? null : clustering;
+            return isNew;
+        }
+    }
+
+    private static class SelectorGroupMaker extends PkPrefixGroupMaker
+    {
+        /**
+         * The selector used to build the groups.
+         */
+        private final Selector selector;
+
+        /**
+         * The output of the selector call on the last clustering
+         */
+        private ByteBuffer lastOutput;
+
+        private final Selector.InputRow input = new Selector.InputRow(1, false, false);
+
+        public SelectorGroupMaker(ClusteringComparator comparator,
+                                  int clusteringPrefixSize,
+                                  Selector selector,
+                                  GroupingState state)
+        {
+            super(comparator, clusteringPrefixSize, state);
+            this.selector = selector;
+            this.lastOutput = lastClustering == null ? null :
+                                                       executeSelector(lastClustering.bufferAt(clusteringPrefixSize - 1));
+        }
+
+        public SelectorGroupMaker(ClusteringComparator comparator,
+                                  int clusteringPrefixSize,
+                                  Selector selector)
+        {
+            super(comparator, clusteringPrefixSize);
+            this.selector = selector;
+        }
+
+        @Override
+        public boolean isNewGroup(DecoratedKey partitionKey, Clustering<?> clustering)
+        {
+            ByteBuffer output =
+                    Clustering.STATIC_CLUSTERING == clustering ? null
+                                                               : executeSelector(clustering.bufferAt(clusteringPrefixSize - 1));
+
+            ByteBuffer key = partitionKey.getKey();
 
             // We are entering a new group if:
             // - the partition key is a new one
             // - the last clustering was not null and does not have the same prefix as the new clustering one
-            if (!partitionKey.getKey().equals(lastPartitionKey))
-            {
-                lastPartitionKey = partitionKey.getKey();
-                isNew = true;
-                if (Clustering.STATIC_CLUSTERING == clustering)
-                {
-                    lastClustering = null;
-                    return true;
-                }
-            }
-            else if (lastClustering != null && comparator.compare(lastClustering, clustering, clusteringPrefixSize) != 0)
-            {
-                isNew = true;
-            }
+            boolean isNew = !key.equals(lastPartitionKey)
+                            || lastClustering == null
+                            || comparator.compare(lastClustering, clustering, clusteringPrefixSize - 1) != 0
+                            || compareOutput(output) != 0;
 
-            lastClustering = clustering;
+            lastPartitionKey = key;
+            lastClustering = Clustering.STATIC_CLUSTERING == clustering ? null : clustering;
+            lastOutput = output;
             return isNew;
         }
+
+        private int compareOutput(ByteBuffer output)
+        {
+            if (output == null)
+                return lastOutput == null ? 0 : -1;
+            if (lastOutput == null)
+                return 1;
+
+            return selector.getType().compare(output, lastOutput);
+        }
+
+        private ByteBuffer executeSelector(ByteBuffer argument)
+        {
+            input.add(argument);
+
+            // For computing groups we do not need to use the client protocol version.
+            selector.addInput(ProtocolVersion.CURRENT, input);
+            ByteBuffer output = selector.getOutput(ProtocolVersion.CURRENT);
+            selector.reset();
+            input.reset(false);
+
+            return output;
+        }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/db/aggregation/GroupingState.java b/src/java/org/apache/cassandra/db/aggregation/GroupingState.java
index 2e522c4..b77802c 100644
--- a/src/java/org/apache/cassandra/db/aggregation/GroupingState.java
+++ b/src/java/org/apache/cassandra/db/aggregation/GroupingState.java
@@ -23,7 +23,6 @@
 import org.apache.cassandra.db.Clustering;
 import org.apache.cassandra.db.ClusteringComparator;
 import org.apache.cassandra.db.TypeSizes;
-import org.apache.cassandra.db.marshal.ByteArrayAccessor;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.utils.ByteBufferUtil;
diff --git a/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogSegmentManager.java b/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogSegmentManager.java
old mode 100755
new mode 100644
index cdf96cd..d8eb0e7
--- a/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogSegmentManager.java
+++ b/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogSegmentManager.java
@@ -17,32 +17,41 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.BooleanSupplier;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.codahale.metrics.Timer.Context;
 import net.nicoulaj.compilecommand.annotations.DontInline;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.Interruptible;
+import org.apache.cassandra.concurrent.Interruptible.TerminateException;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.io.compress.BufferType;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.SimpleCachedBufferPool;
 import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.db.*;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.utils.*;
-import org.apache.cassandra.utils.concurrent.WaitQueue;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.*;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Daemon.NON_DAEMON;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Interrupts.SYNCHRONIZED;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe.SAFE;
 import static org.apache.cassandra.db.commitlog.CommitLogSegment.Allocation;
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
 
 /**
  * Performs eager-creation of commit log segments in a background thread. All the
@@ -62,7 +71,7 @@
      */
     private volatile CommitLogSegment availableSegment = null;
 
-    private final WaitQueue segmentPrepared = new WaitQueue();
+    private final WaitQueue segmentPrepared = newWaitQueue();
 
     /** Active segments, containing unflushed data. The tail of this queue is the one we allocate writes to */
     private final ConcurrentLinkedQueue<CommitLogSegment> activeSegments = new ConcurrentLinkedQueue<>();
@@ -85,11 +94,10 @@
     private final AtomicLong size = new AtomicLong();
 
     @VisibleForTesting
-    Thread managerThread;
+    Interruptible executor;
     protected final CommitLog commitLog;
-    private volatile boolean shutdown;
-    private final BooleanSupplier managerThreadWaitCondition = () -> (availableSegment == null && !atSegmentBufferLimit()) || shutdown;
-    private final WaitQueue managerThreadWaitQueue = new WaitQueue();
+    private final BooleanSupplier managerThreadWaitCondition = () -> (availableSegment == null && !atSegmentBufferLimit());
+    private final WaitQueue managerThreadWaitQueue = newWaitQueue();
 
     private volatile SimpleCachedBufferPool bufferPool;
 
@@ -101,73 +109,101 @@
 
     void start()
     {
-        // The run loop for the manager thread
-        Runnable runnable = new WrappedRunnable()
-        {
-            public void runMayThrow() throws Exception
-            {
-                while (!shutdown)
-                {
-                    try
-                    {
-                        assert availableSegment == null;
-                        logger.trace("No segments in reserve; creating a fresh one");
-                        availableSegment = createSegment();
-                        if (shutdown)
-                        {
-                            // If shutdown() started and finished during segment creation, we are now left with a
-                            // segment that no one will consume. Discard it.
-                            discardAvailableSegment();
-                            return;
-                        }
-
-                        segmentPrepared.signalAll();
-                        Thread.yield();
-
-                        if (availableSegment == null && !atSegmentBufferLimit())
-                            // Writing threads need another segment now.
-                            continue;
-
-                        // Writing threads are not waiting for new segments, we can spend time on other tasks.
-                        // flush old Cfs if we're full
-                        maybeFlushToReclaim();
-                    }
-                    catch (Throwable t)
-                    {
-                        if (!CommitLog.handleCommitError("Failed managing commit log segments", t))
-                            return;
-                        // sleep some arbitrary period to avoid spamming CL
-                        Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
-
-                        // If we offered a segment, wait for it to be taken before reentering the loop.
-                        // There could be a new segment in next not offered, but only on failure to discard it while
-                        // shutting down-- nothing more can or needs to be done in that case.
-                    }
-
-                    WaitQueue.waitOnCondition(managerThreadWaitCondition, managerThreadWaitQueue);
-                }
-            }
-        };
-
         // For encrypted segments we want to keep the compression buffers on-heap as we need those bytes for encryption,
         // and we want to avoid copying from off-heap (compression buffer) to on-heap encryption APIs
         BufferType bufferType = commitLog.configuration.useEncryption() || !commitLog.configuration.useCompression()
-                              ? BufferType.ON_HEAP
-                              : commitLog.configuration.getCompressor().preferredBufferType();
+                                ? BufferType.ON_HEAP
+                                : commitLog.configuration.getCompressor().preferredBufferType();
 
         this.bufferPool = new SimpleCachedBufferPool(DatabaseDescriptor.getCommitLogMaxCompressionBuffersInPool(),
                                                      DatabaseDescriptor.getCommitLogSegmentSize(),
                                                      bufferType);
 
-        shutdown = false;
 
-        managerThread = NamedThreadFactory.createThread(runnable, "COMMIT-LOG-ALLOCATOR");
-        managerThread.start();
-
+        AllocatorRunnable allocator = new AllocatorRunnable();
+        executor = executorFactory().infiniteLoop("COMMIT-LOG-ALLOCATOR", allocator, SAFE, NON_DAEMON, SYNCHRONIZED);
         // for simplicity, ensure the first segment is allocated before continuing
         advanceAllocatingFrom(null);
     }
 
+    class AllocatorRunnable implements Interruptible.Task
+    {
+        // The run loop for the manager thread
+        @Override
+        public void run(Interruptible.State state) throws InterruptedException
+        {
+            boolean interrupted = false;
+            try
+            {
+                switch (state)
+                {
+                    case SHUTTING_DOWN:
+                        // If shutdown() started and finished during segment creation, we are now left with a
+                        // segment that no one will consume. Discard it.
+                        discardAvailableSegment();
+                        return;
+
+                    case NORMAL:
+                        assert availableSegment == null;
+                        // synchronized to prevent thread interrupts while performing IO operations and also
+                        // clear interrupted status to prevent ClosedByInterruptException in createSegment
+
+                        synchronized (this)
+                        {
+                            interrupted = Thread.interrupted();
+                            logger.trace("No segments in reserve; creating a fresh one");
+                            availableSegment = createSegment();
+
+                            segmentPrepared.signalAll();
+                            Thread.yield();
+
+                            if (availableSegment == null && !atSegmentBufferLimit())
+                                // Writing threads need another segment now.
+                                return;
+
+                            // Writing threads are not waiting for new segments, we can spend time on other tasks.
+                            // flush old Cfs if we're full
+                            maybeFlushToReclaim();
+                        }
+                }
+            }
+            catch (Throwable t)
+            {
+                if (!CommitLog.handleCommitError("Failed managing commit log segments", t))
+                {
+                    discardAvailableSegment();
+                    throw new TerminateException();
+                }
+
+                // sleep some arbitrary period to avoid spamming CL
+                Thread.sleep(TimeUnit.SECONDS.toMillis(1L));
+
+                // If we offered a segment, wait for it to be taken before reentering the loop.
+                // There could be a new segment in next not offered, but only on failure to discard it while
+                // shutting down-- nothing more can or needs to be done in that case.
+            }
+
+            interrupted = interrupted || Thread.interrupted();
+            if (!interrupted)
+            {
+                try
+                {
+                    WaitQueue.waitOnCondition(managerThreadWaitCondition, managerThreadWaitQueue);
+                }
+                catch(InterruptedException e)
+                {
+                    interrupted = true;
+                }
+            }
+            
+            if (interrupted)
+            {
+                discardAvailableSegment();
+                throw new InterruptedException();
+            }
+        }
+    }
+
     private boolean atSegmentBufferLimit()
     {
         return CommitLogSegment.usesBufferPool(commitLog) && bufferPool.atLimit();
@@ -189,7 +225,7 @@
                 if (flushingSize + unused >= 0)
                     break;
             }
-            flushDataFrom(segmentsToRecycle, false);
+            flushDataFrom(segmentsToRecycle, Collections.emptyList(), false);
         }
     }
 
@@ -265,7 +301,7 @@
     {
         do
         {
-            WaitQueue.Signal prepared = segmentPrepared.register(commitLog.metrics.waitingOnSegmentAllocation.time());
+            WaitQueue.Signal prepared = segmentPrepared.register(commitLog.metrics.waitingOnSegmentAllocation.time(), Context::stop);
             if (availableSegment == null && allocatingFrom == currentAllocatingFrom)
                 prepared.awaitUninterruptibly();
             else
@@ -281,7 +317,7 @@
      * This is necessary to avoid resurrecting data during replay if a user creates a new table with
      * the same name and ID. See CASSANDRA-16986 for more details.
      */
-    void forceRecycleAll(Iterable<TableId> droppedTables)
+    void forceRecycleAll(Collection<TableId> droppedTables)
     {
         List<CommitLogSegment> segmentsToRecycle = new ArrayList<>(activeSegments);
         CommitLogSegment last = segmentsToRecycle.get(segmentsToRecycle.size() - 1);
@@ -295,7 +331,7 @@
         Keyspace.writeOrder.awaitNewBarrier();
 
         // flush and wait for all CFs that are dirty in segments up-to and including 'last'
-        Future<?> future = flushDataFrom(segmentsToRecycle, true);
+        Future<?> future = flushDataFrom(segmentsToRecycle, droppedTables, true);
         try
         {
             future.get();
@@ -370,7 +406,7 @@
 
     private long unusedCapacity()
     {
-        long total = DatabaseDescriptor.getTotalCommitlogSpaceInMB() * 1024 * 1024;
+        long total = DatabaseDescriptor.getTotalCommitlogSpaceInMiB() * 1024 * 1024;
         long currentSize = size.get();
         logger.trace("Total active commitlog segment space used is {} out of {}", currentSize, total);
         return total - currentSize;
@@ -381,20 +417,22 @@
      *
      * @return a Future that will finish when all the flushes are complete.
      */
-    private Future<?> flushDataFrom(List<CommitLogSegment> segments, boolean force)
+    private Future<?> flushDataFrom(List<CommitLogSegment> segments, Collection<TableId> droppedTables, boolean force)
     {
         if (segments.isEmpty())
-            return Futures.immediateFuture(null);
+            return ImmediateFuture.success(null);
         final CommitLogPosition maxCommitLogPosition = segments.get(segments.size() - 1).getCurrentCommitLogPosition();
 
         // a map of CfId -> forceFlush() to ensure we only queue one flush per cf
-        final Map<TableId, ListenableFuture<?>> flushes = new LinkedHashMap<>();
+        final Map<TableId, Future<?>> flushes = new LinkedHashMap<>();
 
         for (CommitLogSegment segment : segments)
         {
             for (TableId dirtyTableId : segment.getDirtyTableIds())
             {
-                TableMetadata metadata = Schema.instance.getTableMetadata(dirtyTableId);
+                TableMetadata metadata = droppedTables.contains(dirtyTableId)
+                                         ? null
+                                         : Schema.instance.getTableMetadata(dirtyTableId);
                 if (metadata == null)
                 {
                     // even though we remove the schema entry before a final flush when dropping a CF,
@@ -405,20 +443,32 @@
                 else if (!flushes.containsKey(dirtyTableId))
                 {
                     final ColumnFamilyStore cfs = Keyspace.open(metadata.keyspace).getColumnFamilyStore(dirtyTableId);
-                    // can safely call forceFlush here as we will only ever block (briefly) for other attempts to flush,
-                    // no deadlock possibility since switchLock removal
-                    flushes.put(dirtyTableId, force ? cfs.forceFlush() : cfs.forceFlush(maxCommitLogPosition));
+
+                    if (cfs.memtableWritesAreDurable())
+                    {
+                        // The memtable does not need this data to be preserved (we only wrote it for PITR and CDC)
+                        segment.markClean(dirtyTableId, CommitLogPosition.NONE, segment.getCurrentCommitLogPosition());
+                    }
+                    else
+                    {
+                        // can safely call forceFlush here as we will only ever block (briefly) for other attempts to flush,
+                        // no deadlock possibility since switchLock removal
+                        flushes.put(dirtyTableId, force
+                                                  ? cfs.forceFlush(ColumnFamilyStore.FlushReason.COMMITLOG_DIRTY)
+                                                  : cfs.forceFlush(maxCommitLogPosition));
+                    }
                 }
             }
         }
 
-        return Futures.allAsList(flushes.values());
+        return FutureCombiner.allOf(flushes.values());
     }
 
     /**
      * Stops CL, for testing purposes. DO NOT USE THIS OUTSIDE OF TESTS.
      * Only call this after the AbstractCommitLogService is shut down.
      */
+    @VisibleForTesting
     public void stopUnsafe(boolean deleteSegments)
     {
         logger.debug("CLSM closing and clearing existing commit log segments...");
@@ -426,11 +476,12 @@
         shutdown();
         try
         {
-            awaitTermination();
+            // On heavily loaded test envs we need a longer wait
+            assert awaitTermination(5L, TimeUnit.MINUTES) : "Assert waiting for termination failed on " + FBUtilities.now().toString();
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
 
         for (CommitLogSegment segment : activeSegments)
@@ -474,9 +525,7 @@
      */
     public void shutdown()
     {
-        assert !shutdown;
-        shutdown = true;
-
+        executor.shutdownNow();
         // Release the management thread and delete prepared segment.
         // Do not block as another thread may claim the segment (this can happen during unit test initialization).
         discardAvailableSegment();
@@ -485,7 +534,7 @@
 
     private void discardAvailableSegment()
     {
-        CommitLogSegment next = null;
+        CommitLogSegment next;
         synchronized (this)
         {
             next = availableSegment;
@@ -498,19 +547,16 @@
     /**
      * Returns when the management thread terminates.
      */
-    public void awaitTermination() throws InterruptedException
+    public boolean awaitTermination(long timeout, TimeUnit units) throws InterruptedException
     {
-        if (managerThread != null)
-        {
-            managerThread.join();
-            managerThread = null;
-        }
-
+        boolean res = executor.awaitTermination(timeout, units);
         for (CommitLogSegment segment : activeSegments)
             segment.close();
 
         if (bufferPool != null)
             bufferPool.emptyBufferPool();
+
+        return res;
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogService.java b/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogService.java
index a65ef00..6b5378f 100644
--- a/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogService.java
+++ b/src/java/org/apache/cassandra/db/commitlog/AbstractCommitLogService.java
@@ -17,22 +17,38 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.LockSupport;
 
 import com.google.common.annotations.VisibleForTesting;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.codahale.metrics.Timer.Context;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.Interruptible;
+import org.apache.cassandra.concurrent.Interruptible.TerminateException;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.db.commitlog.CommitLogSegment.Allocation;
 import org.apache.cassandra.utils.MonotonicClock;
 import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.concurrent.Semaphore;
 import org.apache.cassandra.utils.concurrent.WaitQueue;
 
+import static com.codahale.metrics.Timer.Context;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Daemon.NON_DAEMON;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Interrupts.SYNCHRONIZED;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe.SAFE;
+import static org.apache.cassandra.concurrent.Interruptible.State.NORMAL;
+import static org.apache.cassandra.concurrent.Interruptible.State.SHUTTING_DOWN;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.preciseTime;
+import static org.apache.cassandra.utils.concurrent.Semaphore.newSemaphore;
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
+
 public abstract class AbstractCommitLogService
 {
     /**
@@ -41,18 +57,18 @@
      */
     static final long DEFAULT_MARKER_INTERVAL_MILLIS = 100;
 
-    private volatile Thread thread;
-    private volatile boolean shutdown = false;
+    private volatile Interruptible executor;
 
     // all Allocations written before this time will be synced
-    protected volatile long lastSyncedAt = System.currentTimeMillis();
+    protected volatile long lastSyncedAt = currentTimeMillis();
 
     // counts of total written, and pending, log messages
     private final AtomicLong written = new AtomicLong(0);
     protected final AtomicLong pending = new AtomicLong(0);
 
     // signal that writers can wait on to be notified of a completed sync
-    protected final WaitQueue syncComplete = new WaitQueue();
+    protected final WaitQueue syncComplete = newWaitQueue();
+    protected final Semaphore haveWork = newSemaphore(1);
 
     final CommitLog commitLog;
     private final String name;
@@ -102,7 +118,11 @@
         this.name = name;
 
         final long markerIntervalMillis;
-        if (markHeadersFaster && syncIntervalMillis > DEFAULT_MARKER_INTERVAL_MILLIS)
+        if (syncIntervalMillis < 0)
+        {
+            markerIntervalMillis = -1;
+        }
+        else if (markHeadersFaster && syncIntervalMillis > DEFAULT_MARKER_INTERVAL_MILLIS)
         {
             markerIntervalMillis = DEFAULT_MARKER_INTERVAL_MILLIS;
             long modulo = syncIntervalMillis % markerIntervalMillis;
@@ -114,29 +134,29 @@
                 if (modulo >= markerIntervalMillis / 2)
                     syncIntervalMillis += markerIntervalMillis;
             }
+            assert syncIntervalMillis % markerIntervalMillis == 0;
             logger.debug("Will update the commitlog markers every {}ms and flush every {}ms", markerIntervalMillis, syncIntervalMillis);
         }
         else
         {
             markerIntervalMillis = syncIntervalMillis;
         }
-        assert syncIntervalMillis % markerIntervalMillis == 0;
-        this.markerIntervalNanos = TimeUnit.NANOSECONDS.convert(markerIntervalMillis, TimeUnit.MILLISECONDS);
-        this.syncIntervalNanos = TimeUnit.NANOSECONDS.convert(syncIntervalMillis, TimeUnit.MILLISECONDS);
+        this.markerIntervalNanos = NANOSECONDS.convert(markerIntervalMillis, MILLISECONDS);
+        this.syncIntervalNanos = NANOSECONDS.convert(syncIntervalMillis, MILLISECONDS);
     }
 
     // Separated into individual method to ensure relevant objects are constructed before this is started.
     void start()
     {
-        if (syncIntervalNanos < 1)
+        if (syncIntervalNanos < 1 && !(this instanceof BatchCommitLogService)) // permit indefinite waiting with batch, as perfectly sensible
             throw new IllegalArgumentException(String.format("Commit log flush interval must be positive: %fms",
                                                              syncIntervalNanos * 1e-6));
-        shutdown = false;
-        thread = NamedThreadFactory.createThread(new SyncRunnable(MonotonicClock.preciseTime), name);
-        thread.start();
+
+        SyncRunnable sync = new SyncRunnable(preciseTime);
+        executor = executorFactory().infiniteLoop(name, sync, SAFE, NON_DAEMON, SYNCHRONIZED);
     }
 
-    class SyncRunnable implements Runnable
+    class SyncRunnable implements Interruptible.Task
     {
         private final MonotonicClock clock;
         private long firstLagAt = 0;
@@ -150,61 +170,59 @@
             this.clock = clock;
         }
 
-        public void run()
+        public void run(Interruptible.State state) throws InterruptedException
         {
-            while (true)
-            {
-                if (!sync())
-                    break;
-            }
-        }
-
-        boolean sync()
-        {
-            // always run once after shutdown signalled
-            boolean shutdownRequested = shutdown;
-
             try
             {
                 // sync and signal
                 long pollStarted = clock.now();
-                boolean flushToDisk = lastSyncedAt + syncIntervalNanos <= pollStarted || shutdownRequested || syncRequested;
-                if (flushToDisk)
+                boolean flushToDisk = lastSyncedAt + syncIntervalNanos <= pollStarted || state != NORMAL || syncRequested;
+                // synchronized to prevent thread interrupts while performing IO operations and also
+                // clear interrupted status to prevent ClosedByInterruptException in CommitLog::sync
+                synchronized (this)
                 {
-                    // in this branch, we want to flush the commit log to disk
-                    syncRequested = false;
-                    commitLog.sync(true);
-                    lastSyncedAt = pollStarted;
-                    syncComplete.signalAll();
-                    syncCount++;
+                    Thread.interrupted();
+                    if (flushToDisk)
+                    {
+                        // in this branch, we want to flush the commit log to disk
+                        syncRequested = false;
+                        commitLog.sync(true);
+                        lastSyncedAt = pollStarted;
+                        syncComplete.signalAll();
+                        syncCount++;
+                    }
+                    else
+                    {
+                        // in this branch, just update the commit log sync headers
+                        commitLog.sync(false);
+                    }
+                }
+
+                if (state == SHUTTING_DOWN)
+                    return;
+
+                if (markerIntervalNanos <= 0)
+                {
+                    haveWork.acquire(1);
                 }
                 else
                 {
-                    // in this branch, just update the commit log sync headers
-                    commitLog.sync(false);
+                    long now = clock.now();
+                    if (flushToDisk)
+                        maybeLogFlushLag(pollStarted, now);
+
+                    long wakeUpAt = pollStarted + markerIntervalNanos;
+                    if (wakeUpAt > now)
+                        haveWork.tryAcquireUntil(1, wakeUpAt);
                 }
-
-                long now = clock.now();
-                if (flushToDisk)
-                    maybeLogFlushLag(pollStarted, now);
-
-                if (shutdownRequested)
-                    return false;
-
-                long wakeUpAt = pollStarted + markerIntervalNanos;
-                if (wakeUpAt > now)
-                    LockSupport.parkNanos(wakeUpAt - now);
             }
             catch (Throwable t)
             {
                 if (!CommitLog.handleCommitError("Failed to persist commits to disk", t))
-                    return false;
-
-                // sleep for full poll-interval after an error, so we don't spam the log file
-                LockSupport.parkNanos(markerIntervalNanos);
+                    throw new TerminateException();
+                else // sleep for full poll-interval after an error, so we don't spam the log file
+                    haveWork.tryAcquire(1, markerIntervalNanos, NANOSECONDS);
             }
-
-            return true;
         }
 
         /**
@@ -238,7 +256,7 @@
                 boolean logged = NoSpamLogger.log(logger,
                                                   NoSpamLogger.Level.WARN,
                                                   5,
-                                                  TimeUnit.MINUTES,
+                                                  MINUTES,
                                                   "Out of {} commit log syncs over the past {}s with average duration of {}ms, {} have exceeded the configured commit interval by an average of {}ms",
                                                   syncCount,
                                                   String.format("%.2f", (now - firstLagAt) * 1e-9d),
@@ -274,14 +292,14 @@
      */
     void requestExtraSync()
     {
+        // note: cannot simply invoke executor.interrupt() as some filesystems don't like it (jimfs, at least)
         syncRequested = true;
-        LockSupport.unpark(thread);
+        haveWork.release(1);
     }
 
     public void shutdown()
     {
-        shutdown = true;
-        requestExtraSync();
+        executor.shutdown();
     }
 
     /**
@@ -292,7 +310,7 @@
      */
     public void syncBlocking()
     {
-        long requestTime = System.nanoTime();
+        long requestTime = nanoTime();
         requestExtraSync();
         awaitSyncAt(requestTime, null);
     }
@@ -301,7 +319,7 @@
     {
         do
         {
-            WaitQueue.Signal signal = context != null ? syncComplete.register(context) : syncComplete.register();
+            WaitQueue.Signal signal = context != null ? syncComplete.register(context, Context::stop) : syncComplete.register();
             if (lastSyncedAt < syncTime)
                 signal.awaitUninterruptibly();
             else
@@ -312,8 +330,7 @@
 
     public void awaitTermination() throws InterruptedException
     {
-        if (thread != null)
-            thread.join();
+        executor.awaitTermination(5L, MINUTES);
     }
 
     public long getCompletedTasks()
diff --git a/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogService.java b/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogService.java
index 78bf30c..e913e67 100644
--- a/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogService.java
+++ b/src/java/org/apache/cassandra/db/commitlog/BatchCommitLogService.java
@@ -17,6 +17,8 @@
  */
 package org.apache.cassandra.db.commitlog;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.BATCH_COMMIT_LOG_SYNC_INTERVAL;
+
 class BatchCommitLogService extends AbstractCommitLogService
 {
     /**
@@ -24,7 +26,7 @@
      * the disk sync. Instead we trigger it explicitly in {@link #maybeWaitForSync(CommitLogSegment.Allocation)}.
      * This value here is largely irrelevant, but should high enough so the sync thread is not continually waking up.
      */
-    private static final int POLL_TIME_MILLIS = 1000;
+    private static final int POLL_TIME_MILLIS = BATCH_COMMIT_LOG_SYNC_INTERVAL.getInt();
 
     public BatchCommitLogService(CommitLog commitLog)
     {
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java
index 49eb67b..6195b1b 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLog.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLog.java
@@ -17,10 +17,9 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
-import java.io.FilenameFilter;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.file.FileStore;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -30,10 +29,13 @@
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiPredicate;
 import java.util.function.Function;
 import java.util.zip.CRC32;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -47,7 +49,8 @@
 import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.io.util.DataOutputBufferFixed;
-import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.PathUtils;
 import org.apache.cassandra.metrics.CommitLogMetrics;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.CompressionParams;
@@ -56,9 +59,9 @@
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MBeanWrapper;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static org.apache.cassandra.db.commitlog.CommitLogSegment.Allocation;
-import static org.apache.cassandra.db.commitlog.CommitLogSegment.CommitLogSegmentFileComparator;
 import static org.apache.cassandra.db.commitlog.CommitLogSegment.ENTRY_OVERHEAD_SIZE;
 import static org.apache.cassandra.utils.FBUtilities.updateChecksum;
 import static org.apache.cassandra.utils.FBUtilities.updateChecksumInt;
@@ -73,7 +76,7 @@
 
     public static final CommitLog instance = CommitLog.construct();
 
-    private static final FilenameFilter unmanagedFilesFilter = (dir, name) -> CommitLogDescriptor.isValid(name) && CommitLogSegment.shouldReplay(name);
+    private static final BiPredicate<File, String> unmanagedFilesFilter = (dir, name) -> CommitLogDescriptor.isValid(name) && CommitLogSegment.shouldReplay(name);
 
     final public AbstractCommitLogSegmentManager segmentManager;
 
@@ -87,7 +90,6 @@
     private static CommitLog construct()
     {
         CommitLog log = new CommitLog(CommitLogArchiver.construct(), DatabaseDescriptor.getCommitLogSegmentMgrProvider());
-
         MBeanWrapper.instance.registerMBean(log, "org.apache.cassandra.db:type=Commitlog");
         return log;
     }
@@ -162,7 +164,7 @@
 
     private File[] getUnmanagedFiles()
     {
-        File[] files = new File(segmentManager.storageDirectory).listFiles(unmanagedFilesFilter);
+        File[] files = new File(segmentManager.storageDirectory).tryList(unmanagedFilesFilter);
         if (files == null)
             return new File[0];
         return files;
@@ -181,8 +183,8 @@
         // archiving pass, which we should not treat as serious.
         for (File file : getUnmanagedFiles())
         {
-            archiver.maybeArchive(file.getPath(), file.getName());
-            archiver.maybeWaitForArchiving(file.getName());
+            archiver.maybeArchive(file.path(), file.name());
+            archiver.maybeWaitForArchiving(file.name());
         }
 
         assert archiver.archivePending.isEmpty() : "Not all commit log archive tasks were completed before restore";
@@ -197,7 +199,7 @@
         }
         else
         {
-            Arrays.sort(files, new CommitLogSegmentFileComparator());
+            Arrays.sort(files, new CommitLogSegment.CommitLogSegmentFileComparator());
             logger.info("Replaying {}", StringUtils.join(files, ", "));
             replayed = recoverFiles(files);
             logger.info("Log replay complete, {} replayed mutations", replayed);
@@ -254,7 +256,7 @@
     /**
      * Flushes all dirty CFs, waiting for them to free and recycle any segments they were retaining
      */
-    public void forceRecycleAllSegments(Iterable<TableId> droppedTables)
+    public void forceRecycleAllSegments(Collection<TableId> droppedTables)
     {
         segmentManager.forceRecycleAll(droppedTables);
     }
@@ -442,6 +444,29 @@
         return segmentRatios;
     }
 
+    @Override
+    public boolean getCDCBlockWrites()
+    {
+        return DatabaseDescriptor.getCDCBlockWrites();
+    }
+
+    @Override
+    public void setCDCBlockWrites(boolean val)
+    {
+        Preconditions.checkState(DatabaseDescriptor.isCDCEnabled(),
+                                 "Unable to set block_writes (%s): CDC is not enabled.", val);
+        Preconditions.checkState(segmentManager instanceof CommitLogSegmentManagerCDC,
+                                 "CDC is enabled but we have the wrong CommitLogSegmentManager type: %s. " +
+                                 "Please report this as bug.", segmentManager.getClass().getName());
+        boolean oldVal = DatabaseDescriptor.getCDCBlockWrites();
+        CommitLogSegment currentSegment = segmentManager.allocatingFrom();
+        // Update the current segment CDC state to PERMITTED if block_writes is disabled now, and it was in FORBIDDEN state
+        if (!val && currentSegment.getCDCState() == CommitLogSegment.CDCState.FORBIDDEN)
+            currentSegment.setCDCState(CommitLogSegment.CDCState.PERMITTED);
+        DatabaseDescriptor.setCDCBlockWrites(val);
+        logger.info("Updated CDC block_writes from {} to {}", oldVal, val);
+    }
+
     /**
      * Shuts down the threads used by the commit log, blocking until completion.
      * TODO this should accept a timeout, and throw TimeoutException
@@ -455,7 +480,7 @@
         executor.shutdown();
         executor.awaitTermination();
         segmentManager.shutdown();
-        segmentManager.awaitTermination();
+        segmentManager.awaitTermination(1L, TimeUnit.MINUTES);
     }
 
     /**
@@ -497,13 +522,13 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
         segmentManager.stopUnsafe(deleteSegments);
         CommitLogSegment.resetReplayLimit();
         if (DatabaseDescriptor.isCDCEnabled() && deleteSegments)
-            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).listFiles())
-                FileUtils.deleteWithConfirm(f);
+            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).tryList())
+                f.delete();
     }
 
     /**
@@ -518,7 +543,7 @@
 
     public static long freeDiskSpace()
     {
-        return FileUtils.getFreeSpace(new File(DatabaseDescriptor.getCommitLogLocation()));
+        return PathUtils.tryGetSpace(new File(DatabaseDescriptor.getCommitLogLocation()).toPath(), FileStore::getTotalSpace);
     }
 
     @VisibleForTesting
@@ -602,7 +627,7 @@
          */
         public boolean useEncryption()
         {
-            return encryptionContext.isEnabled();
+            return encryptionContext != null && encryptionContext.isEnabled();
         }
 
         /**
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java
index b58a316..2e1b580 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogArchiver.java
@@ -20,7 +20,6 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.text.ParseException;
@@ -32,17 +31,21 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.CompressionParams;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.WrappedRunnable;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.base.Strings;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
 public class CommitLogArchiver
 {
     private static final Logger logger = LoggerFactory.getLogger(CommitLogArchiver.class);
@@ -63,22 +66,28 @@
     final String restoreCommand;
     final String restoreDirectories;
     public long restorePointInTime;
+    public CommitLogPosition snapshotCommitLogPosition;
     public final TimeUnit precision;
 
     public CommitLogArchiver(String archiveCommand, String restoreCommand, String restoreDirectories,
-            long restorePointInTime, TimeUnit precision)
+            long restorePointInTime, CommitLogPosition snapshotCommitLogPosition, TimeUnit precision)
     {
         this.archiveCommand = archiveCommand;
         this.restoreCommand = restoreCommand;
         this.restoreDirectories = restoreDirectories;
         this.restorePointInTime = restorePointInTime;
+        this.snapshotCommitLogPosition = snapshotCommitLogPosition;
         this.precision = precision;
-        executor = !Strings.isNullOrEmpty(archiveCommand) ? new JMXEnabledThreadPoolExecutor("CommitLogArchiver") : null;
+        executor = !Strings.isNullOrEmpty(archiveCommand)
+                ? executorFactory()
+                    .withJmxInternal()
+                    .sequential("CommitLogArchiver")
+                : null;
     }
 
     public static CommitLogArchiver disabled()
     {
-        return new CommitLogArchiver(null, null, null, Long.MAX_VALUE, TimeUnit.MICROSECONDS);
+        return new CommitLogArchiver(null, null, null, Long.MAX_VALUE, CommitLogPosition.NONE, TimeUnit.MICROSECONDS);
     }
 
     public static CommitLogArchiver construct()
@@ -104,7 +113,7 @@
                         File directory = new File(dir);
                         if (!directory.exists())
                         {
-                            if (!directory.mkdir())
+                            if (!directory.tryCreateDirectory())
                             {
                                 throw new RuntimeException("Unable to create directory: " + dir);
                             }
@@ -122,7 +131,27 @@
                 {
                     throw new RuntimeException("Unable to parse restore target time", e);
                 }
-                return new CommitLogArchiver(archiveCommand, restoreCommand, restoreDirectories, restorePointInTime, precision);
+
+                String snapshotPosition = commitlog_commands.getProperty("snapshot_commitlog_position");
+                CommitLogPosition snapshotCommitLogPosition;
+                try
+                {
+
+                    snapshotCommitLogPosition = Strings.isNullOrEmpty(snapshotPosition)
+                                                ? CommitLogPosition.NONE
+                                                : CommitLogPosition.serializer.fromString(snapshotPosition);
+                }
+                catch (ParseException | NumberFormatException e)
+                {
+                    throw new RuntimeException("Unable to parse snapshot commit log position", e);
+                }
+
+                return new CommitLogArchiver(archiveCommand,
+                                             restoreCommand,
+                                             restoreDirectories,
+                                             restorePointInTime,
+                                             snapshotCommitLogPosition,
+                                             precision);
             }
         }
         catch (IOException e)
@@ -193,7 +222,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new AssertionError(e);
+            throw new UncheckedInterruptedException(e);
         }
         catch (ExecutionException e)
         {
@@ -218,7 +247,7 @@
 
         for (String dir : restoreDirectories.split(DELIMITER))
         {
-            File[] files = new File(dir).listFiles();
+            File[] files = new File(dir).tryList();
             if (files == null)
             {
                 throw new RuntimeException("Unable to list directory " + dir);
@@ -226,14 +255,14 @@
             for (File fromFile : files)
             {
                 CommitLogDescriptor fromHeader = CommitLogDescriptor.fromHeader(fromFile, DatabaseDescriptor.getEncryptionContext());
-                CommitLogDescriptor fromName = CommitLogDescriptor.isValid(fromFile.getName()) ? CommitLogDescriptor.fromFileName(fromFile.getName()) : null;
+                CommitLogDescriptor fromName = CommitLogDescriptor.isValid(fromFile.name()) ? CommitLogDescriptor.fromFileName(fromFile.name()) : null;
                 CommitLogDescriptor descriptor;
                 if (fromHeader == null && fromName == null)
-                    throw new IllegalStateException("Cannot safely construct descriptor for segment, either from its name or its header: " + fromFile.getPath());
+                    throw new IllegalStateException("Cannot safely construct descriptor for segment, either from its name or its header: " + fromFile.path());
                 else if (fromHeader != null && fromName != null && !fromHeader.equalsIgnoringCompression(fromName))
-                    throw new IllegalStateException(String.format("Cannot safely construct descriptor for segment, as name and header descriptors do not match (%s vs %s): %s", fromHeader, fromName, fromFile.getPath()));
+                    throw new IllegalStateException(String.format("Cannot safely construct descriptor for segment, as name and header descriptors do not match (%s vs %s): %s", fromHeader, fromName, fromFile.path()));
                 else if (fromName != null && fromHeader == null)
-                    throw new IllegalStateException("Cannot safely construct descriptor for segment, as name descriptor implies a version that should contain a header descriptor, but that descriptor could not be read: " + fromFile.getPath());
+                    throw new IllegalStateException("Cannot safely construct descriptor for segment, as name descriptor implies a version that should contain a header descriptor, but that descriptor could not be read: " + fromFile.path());
                 else if (fromHeader != null)
                     descriptor = fromHeader;
                 else descriptor = fromName;
@@ -257,12 +286,12 @@
                 if (toFile.exists())
                 {
                     logger.trace("Skipping restore of archive {} as the segment already exists in the restore location {}",
-                                 fromFile.getPath(), toFile.getPath());
+                                 fromFile.path(), toFile.path());
                     continue;
                 }
 
-                String command = FROM.matcher(restoreCommand).replaceAll(Matcher.quoteReplacement(fromFile.getPath()));
-                command = TO.matcher(command).replaceAll(Matcher.quoteReplacement(toFile.getPath()));
+                String command = FROM.matcher(restoreCommand).replaceAll(Matcher.quoteReplacement(fromFile.path()));
+                command = TO.matcher(command).replaceAll(Matcher.quoteReplacement(toFile.path()));
                 try
                 {
                     exec(command);
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java
index 700f12a..ed2af1b 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogDescriptor.java
@@ -22,9 +22,7 @@
 
 import java.io.DataInput;
 import java.io.EOFException;
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.Collections;
@@ -37,9 +35,12 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Objects;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.ParameterizedClass;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.FSReadError;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.security.EncryptionContext;
 import org.json.simple.JSONValue;
@@ -51,6 +52,7 @@
     private static final String SEPARATOR = "-";
     private static final String FILENAME_PREFIX = "CommitLog" + SEPARATOR;
     private static final String FILENAME_EXTENSION = ".log";
+    private static final String INDEX_FILENAME_SUFFIX = "_cdc.idx";
     // match both legacy and new version of commitlogs Ex: CommitLog-12345.log and CommitLog-4-12345.log.
     private static final Pattern COMMIT_LOG_FILE_PATTERN = Pattern.compile(FILENAME_PREFIX + "((\\d+)(" + SEPARATOR + "\\d+)?)" + FILENAME_EXTENSION);
 
@@ -131,9 +133,8 @@
 
     public static CommitLogDescriptor fromHeader(File file, EncryptionContext encryptionContext)
     {
-        try (RandomAccessFile raf = new RandomAccessFile(file, "r"))
+        try (FileInputStreamPlus raf = new FileInputStreamPlus(file))
         {
-            assert raf.getFilePointer() == 0;
             return readHeader(raf, encryptionContext);
         }
         catch (EOFException e)
@@ -190,15 +191,27 @@
 
     public static CommitLogDescriptor fromFileName(String name)
     {
-        Matcher matcher;
-        if (!(matcher = COMMIT_LOG_FILE_PATTERN.matcher(name)).matches())
+        Matcher matcher = extactFromFileName(name);
+        long id = Long.parseLong(matcher.group(3).split(SEPARATOR)[1]);
+        return new CommitLogDescriptor(Integer.parseInt(matcher.group(2)), id, null, new EncryptionContext());
+    }
+
+    public static long idFromFileName(String name)
+    {
+        Matcher matcher = extactFromFileName(name);
+        return Long.parseLong(matcher.group(3).split(SEPARATOR)[1]);
+    }
+
+    private static Matcher extactFromFileName(String name)
+    {
+        Matcher matcher = COMMIT_LOG_FILE_PATTERN.matcher(name);
+        if (!matcher.matches())
             throw new RuntimeException("Cannot parse the version of the file: " + name);
 
         if (matcher.group(3) == null)
             throw new UnsupportedOperationException("Commitlog segment is too old to open; upgrade to 1.2.5+ first");
 
-        long id = Long.parseLong(matcher.group(3).split(SEPARATOR)[1]);
-        return new CommitLogDescriptor(Integer.parseInt(matcher.group(2)), id, null, new EncryptionContext());
+        return matcher;
     }
 
     public int getMessagingVersion()
@@ -221,7 +234,21 @@
 
     public String cdcIndexFileName()
     {
-        return FILENAME_PREFIX + version + SEPARATOR + id + "_cdc.idx";
+        return FILENAME_PREFIX + version + SEPARATOR + id + INDEX_FILENAME_SUFFIX;
+    }
+
+    /**
+     * Infer the corresponding cdc index file using its cdc commitlog file
+     * @param cdcCommitLogSegment
+     * @return cdc index file or null if the cdc index file cannot be inferred.
+     */
+    public static File inferCdcIndexFile(File cdcCommitLogSegment)
+    {
+        if (!isValid(cdcCommitLogSegment.name()))
+            return null;
+        String cdcFileName = cdcCommitLogSegment.name();
+        String indexFileName = cdcFileName.substring(0, cdcFileName.length() - FILENAME_EXTENSION.length()) + INDEX_FILENAME_SUFFIX;
+        return new File(DatabaseDescriptor.getCDCLogLocation(), indexFileName);
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java
index 3b20bbc..7e8deca 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogMBean.java
@@ -84,4 +84,8 @@
      * @return A map between active log segments and the compression ratio achieved for each.
      */
     public Map<String, Double> getActiveSegmentCompressionRatios();
+
+    public boolean getCDCBlockWrites();
+
+    public void setCDCBlockWrites(boolean val);
 }
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogPosition.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogPosition.java
index 3ffb04c..3b3a21a 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogPosition.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogPosition.java
@@ -18,8 +18,11 @@
 package org.apache.cassandra.db.commitlog;
 
 import java.io.IOException;
+import java.text.ParseException;
 import java.util.Comparator;
 
+import com.google.common.base.Strings;
+
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.ISerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
@@ -118,5 +121,20 @@
         {
             return TypeSizes.sizeof(clsp.segmentId) + TypeSizes.sizeof(clsp.position);
         }
+
+        public CommitLogPosition fromString(String position) throws ParseException
+        {
+            if (Strings.isNullOrEmpty(position))
+                return NONE;
+            String[] parts = position.split(",");
+            if (parts.length != 2)
+                throw new ParseException("Commit log position must be given as <segment>,<position>", 0);
+            return new CommitLogPosition(Long.parseLong(parts[0].trim()), Integer.parseInt(parts[1].trim()));
+        }
+
+        public String toString(CommitLogPosition position)
+        {
+            return position == NONE ? "" : String.format("%d, %d", position.segmentId, position.position);
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java
index 5123580..451ee37 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogReader.java
@@ -25,6 +25,7 @@
 import java.util.zip.CRC32;
 
 import com.google.common.annotations.VisibleForTesting;
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -99,7 +100,7 @@
             {
                 if (shouldSkip(file))
                 {
-                    logger.info("Skipping playback of empty log: {}", file.getName());
+                    logger.info("Skipping playback of empty log: {}", file.name());
                 }
                 else
                 {
@@ -172,7 +173,7 @@
                                      boolean tolerateTruncation) throws IOException
     {
         // just transform from the file name (no reading of headers) to determine version
-        CommitLogDescriptor desc = CommitLogDescriptor.fromFileName(file.getName());
+        CommitLogDescriptor desc = CommitLogDescriptor.fromFileName(file.name());
 
         try(RandomAccessReader reader = RandomAccessReader.open(file))
         {
@@ -263,7 +264,7 @@
     private boolean shouldSkipSegmentId(File file, CommitLogDescriptor desc, CommitLogPosition minPosition)
     {
         logger.debug("Reading {} (CL version {}, messaging version {}, compression {})",
-            file.getPath(),
+            file.path(),
             desc.version,
             desc.getMessagingVersion(),
             desc.compression);
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java
index 39777ec..74aa67d 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogReplayer.java
@@ -18,10 +18,8 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -31,7 +29,10 @@
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Ordering;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.StringUtils;
+
+import org.apache.cassandra.utils.concurrent.Future;
 import org.cliffc.high_scale_lib.NonBlockingHashSet;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,7 +52,6 @@
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadataRef;
-import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.WrappedRunnable;
 
@@ -130,7 +130,41 @@
                 }
             }
 
-            IntervalSet<CommitLogPosition> filter = persistedIntervals(cfs.getLiveSSTables(), truncatedAt, localHostId);
+            IntervalSet<CommitLogPosition> filter;
+            final CommitLogPosition snapshotPosition = commitLog.archiver.snapshotCommitLogPosition;
+            if (snapshotPosition == CommitLogPosition.NONE)
+            {
+                // normal path: snapshot position is not explicitly specified, find it from sstables
+                if (!cfs.memtableWritesAreDurable())
+                {
+                    filter = persistedIntervals(cfs.getLiveSSTables(), truncatedAt, localHostId);
+                }
+                else
+                {
+                    if (commitLog.archiver.restorePointInTime == Long.MAX_VALUE)
+                    {
+                        // Normal restart, everything is persisted and restored by the memtable itself.
+                        filter = new IntervalSet<>(CommitLogPosition.NONE, CommitLog.instance.getCurrentPosition());
+                    }
+                    else
+                    {
+                        // Point-in-time restore with a persistent memtable. In this case user should have restored
+                        // the memtable from a snapshot and specified that snapshot's commit log position, reaching
+                        // the "else" path below.
+                        // If they haven't, do not filter any commit log data -- this supports a mode of operation where
+                        // the user deletes old archived commit log segments when a snapshot completes -- but issue a
+                        // message as this may be inefficient / not what the user wants.
+                        logger.info("Point-in-time restore on a persistent memtable started without a snapshot time. " +
+                                    "All commit log data will be replayed.");
+                        filter = IntervalSet.empty();
+                    }
+                }
+            }
+            else
+            {
+                // If the positions is specified, it must override whatever we calculate.
+                filter = new IntervalSet<>(CommitLogPosition.NONE, snapshotPosition);
+            }
             cfPersisted.put(cfs.metadata.id, filter);
         }
         CommitLogPosition globalPosition = firstNotCovered(cfPersisted.values());
@@ -170,7 +204,7 @@
         // Can only reach this point if CDC is enabled, thus we have a CDCSegmentManager
         ((CommitLogSegmentManagerCDC)CommitLog.instance.segmentManager).addCDCSize(f.length());
 
-        File dest = new File(DatabaseDescriptor.getCDCLogLocation(), f.getName());
+        File dest = new File(DatabaseDescriptor.getCDCLogLocation(), f.name());
 
         // If hard link already exists, assume it's from a previous node run. If people are mucking around in the cdc_raw
         // directory that's on them.
@@ -212,12 +246,14 @@
             if (keyspace.getName().equals(SchemaConstants.SYSTEM_KEYSPACE_NAME))
                 flushingSystem = true;
 
-            futures.addAll(keyspace.flush());
+            futures.addAll(keyspace.flush(ColumnFamilyStore.FlushReason.STARTUP));
         }
 
         // also flush batchlog incase of any MV updates
         if (!flushingSystem)
-            futures.add(Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).forceFlush());
+            futures.add(Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME)
+                                .getColumnFamilyStore(SystemKeyspace.BATCHES)
+                                .forceFlush(ColumnFamilyStore.FlushReason.INTERNALLY_FORCED));
 
         FBUtilities.waitOnFutures(futures);
 
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java
index 64b815e..97a032a 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegment.java
@@ -17,8 +17,6 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
@@ -31,6 +29,8 @@
 import java.util.zip.CRC32;
 
 import com.google.common.annotations.VisibleForTesting;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileWriter;
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 
 import com.codahale.metrics.Timer;
@@ -48,7 +48,9 @@
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.concurrent.WaitQueue;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.apache.cassandra.utils.FBUtilities.updateChecksumInt;
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
 
 /*
  * A single commit log file on disk. Manages creation of the file and writing mutations to disk,
@@ -66,19 +68,19 @@
         FORBIDDEN,
         CONTAINS
     }
-    Object cdcStateLock = new Object();
+    final Object cdcStateLock = new Object();
 
     private final static AtomicInteger nextId = new AtomicInteger(1);
     private static long replayLimitId;
     static
     {
         long maxId = Long.MIN_VALUE;
-        for (File file : new File(DatabaseDescriptor.getCommitLogLocation()).listFiles())
+        for (File file : new File(DatabaseDescriptor.getCommitLogLocation()).tryList())
         {
-            if (CommitLogDescriptor.isValid(file.getName()))
-                maxId = Math.max(CommitLogDescriptor.fromFileName(file.getName()).id, maxId);
+            if (CommitLogDescriptor.isValid(file.name()))
+                maxId = Math.max(CommitLogDescriptor.fromFileName(file.name()).id, maxId);
         }
-        replayLimitId = idBase = Math.max(System.currentTimeMillis(), maxId + 1);
+        replayLimitId = idBase = Math.max(currentTimeMillis(), maxId + 1);
     }
 
     // The commit log entry overhead in bytes (int: length + int: head checksum + int: tail checksum)
@@ -110,7 +112,7 @@
     private int endOfBuffer;
 
     // a signal for writers to wait on to confirm the log message they provided has been written to disk
-    private final WaitQueue syncComplete = new WaitQueue();
+    private final WaitQueue syncComplete = newWaitQueue();
 
     // a map of Cf->dirty interval in this segment; if interval is not covered by the clean set, the log contains unflushed data
     private final NonBlockingHashMap<TableId, IntegerInterval> tableDirty = new NonBlockingHashMap<>(1024);
@@ -368,7 +370,11 @@
 
         if (flush || close)
         {
-            flush(startMarker, sectionEnd);
+            try (Timer.Context ignored = CommitLog.instance.metrics.waitingOnFlush.time())
+            {
+                flush(startMarker, sectionEnd);
+            }
+            
             if (cdcState == CDCState.CONTAINS)
                 writeCDCIndexFile(descriptor, sectionEnd, close);
             lastSyncedOffset = lastMarkerOffset = nextMarker;
@@ -457,7 +463,7 @@
      */
     public String getPath()
     {
-        return logFile.getPath();
+        return logFile.path();
     }
 
     /**
@@ -465,7 +471,7 @@
      */
     public String getName()
     {
-        return logFile.getName();
+        return logFile.name();
     }
 
     /**
@@ -473,7 +479,7 @@
      */
     public File getCDCFile()
     {
-        return new File(DatabaseDescriptor.getCDCLogLocation(), logFile.getName());
+        return new File(DatabaseDescriptor.getCDCLogLocation(), logFile.name());
     }
 
     /**
@@ -501,15 +507,13 @@
         }
     }
 
-    void waitForSync(int position, Timer waitingOnCommit)
+    void waitForSync(int position)
     {
         while (lastSyncedOffset < position)
         {
-            WaitQueue.Signal signal = waitingOnCommit != null ?
-                                      syncComplete.register(waitingOnCommit.time()) :
-                                      syncComplete.register();
+            WaitQueue.Signal signal = syncComplete.register();
             if (lastSyncedOffset < position)
-                signal.awaitUninterruptibly();
+                signal.awaitThrowUncheckedOnInterrupt();
             else
                 signal.cancel();
         }
@@ -673,9 +677,8 @@
     {
         public int compare(File f, File f2)
         {
-            CommitLogDescriptor desc = CommitLogDescriptor.fromFileName(f.getName());
-            CommitLogDescriptor desc2 = CommitLogDescriptor.fromFileName(f2.getName());
-            return Long.compare(desc.id, desc2.id);
+            return Long.compare(CommitLogDescriptor.idFromFileName(f.name()),
+                                CommitLogDescriptor.idFromFileName(f2.name()));
         }
     }
 
@@ -748,7 +751,10 @@
 
         void awaitDiskSync(Timer waitingOnCommit)
         {
-            segment.waitForSync(position, waitingOnCommit);
+            try (Timer.Context ignored = waitingOnCommit.time())
+            {
+                segment.waitForSync(position);
+            }
         }
 
         /**
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDC.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDC.java
index b254b9b..b2e3d06 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDC.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDC.java
@@ -18,17 +18,20 @@
 
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.io.IOException;
-import java.nio.file.FileAlreadyExistsException;
-import java.nio.file.FileVisitResult;
 import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.List;
 import java.util.concurrent.*;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.RateLimiter;
+import com.google.common.util.concurrent.Uninterruptibles;
+
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,11 +39,12 @@
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.commitlog.CommitLogSegment.CDCState;
 import org.apache.cassandra.exceptions.CDCWriteException;
-import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.DirectorySizeCalculator;
 import org.apache.cassandra.utils.NoSpamLogger;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
 public class CommitLogSegmentManagerCDC extends AbstractCommitLogSegmentManager
 {
     static final Logger logger = LoggerFactory.getLogger(CommitLogSegmentManagerCDC.class);
@@ -49,7 +53,7 @@
     public CommitLogSegmentManagerCDC(final CommitLog commitLog, String storageDirectory)
     {
         super(commitLog, storageDirectory);
-        cdcSizeTracker = new CDCSizeTracker(new File(DatabaseDescriptor.getCDCLogLocation()));
+        cdcSizeTracker = new CDCSizeTracker(this, new File(DatabaseDescriptor.getCDCLogLocation()));
     }
 
     @Override
@@ -67,23 +71,83 @@
         cdcSizeTracker.processDiscardedSegment(segment);
 
         if (delete)
-            FileUtils.deleteWithConfirm(segment.logFile);
+            segment.logFile.delete();
 
         if (segment.getCDCState() != CDCState.CONTAINS)
         {
             // Always delete hard-link from cdc folder if this segment didn't contain CDC data. Note: File may not exist
             // if processing discard during startup.
             File cdcLink = segment.getCDCFile();
-            if (cdcLink.exists())
-                FileUtils.deleteWithConfirm(cdcLink);
-
             File cdcIndexFile = segment.getCDCIndexFile();
-            if (cdcIndexFile.exists())
-                FileUtils.deleteWithConfirm(cdcIndexFile);
+            deleteCDCFiles(cdcLink, cdcIndexFile);
         }
     }
 
     /**
+     * Delete the oldest hard-linked CDC commit log segment to free up space.
+     * @param bytesToFree, the minimum space to free up
+     * @return total size under the CDC folder in bytes after deletion
+     */
+    public long deleteOldLinkedCDCCommitLogSegment(long bytesToFree)
+    {
+        if (bytesToFree <= 0)
+            return 0;
+
+        File cdcDir = new File(DatabaseDescriptor.getCDCLogLocation());
+        Preconditions.checkState(cdcDir.isDirectory(), "The CDC directory does not exist.");
+        File[] files = cdcDir.tryList(f -> CommitLogDescriptor.isValid(f.name()));
+        if (files == null || files.length == 0)
+        {
+            logger.warn("Skip deleting due to no CDC commit log segments found.");
+            return 0;
+        }
+        List<File> sorted = Arrays.stream(files)
+                                  // sort by the commmit log segment id
+                                  .sorted(new CommitLogSegment.CommitLogSegmentFileComparator())
+                                  .collect(Collectors.toList());
+        long bytesDeleted = 0;
+        long bytesRemaining = 0;
+        boolean deletionCompleted = false;
+        // keep deleting from old to new until it reaches to the goal or the current writing segment
+        for (File linkedCdcFile : sorted)
+        {
+            // only evaluate/update when deletionCompleted is false
+            if (!deletionCompleted)
+            {
+                deletionCompleted = bytesDeleted >= bytesToFree || linkedCdcFile.equals(allocatingFrom().getCDCFile());
+            }
+
+            if (deletionCompleted)
+            {
+                bytesRemaining += linkedCdcFile.length();
+            }
+            else
+            {
+                File cdcIndexFile = CommitLogDescriptor.inferCdcIndexFile(linkedCdcFile);
+                bytesDeleted += deleteCDCFiles(linkedCdcFile, cdcIndexFile);
+            }
+        }
+        return bytesRemaining;
+    }
+
+    private long deleteCDCFiles(File cdcLink, File cdcIndexFile)
+    {
+        long total = 0;
+        if (cdcLink != null && cdcLink.exists())
+        {
+            total += cdcLink.length();
+            cdcLink.delete();
+        }
+
+        if (cdcIndexFile != null && cdcIndexFile.exists())
+        {
+            total += cdcIndexFile.length();
+            cdcIndexFile.delete();
+        }
+        return total;
+    }
+
+    /**
      * Initiates the shutdown process for the management thread. Also stops the cdc on-disk size calculator executor.
      */
     public void shutdown()
@@ -133,10 +197,10 @@
         if (segment.getCDCState() != CDCState.FORBIDDEN)
             return;
 
-        if (cdcSizeTracker.hasSpaceForNewSegment())
+        if (!DatabaseDescriptor.getCDCBlockWrites()
+            || cdcSizeTracker.sizeInProgress.get() + DatabaseDescriptor.getCommitLogSegmentSize() < DatabaseDescriptor.getCDCTotalSpace())
         {
             CDCState oldState = segment.setCDCState(CDCState.PERMITTED);
-
             if (oldState == CDCState.FORBIDDEN)
             {
                 FileUtils.createHardLink(segment.logFile, segment.getCDCFile());
@@ -149,11 +213,11 @@
     {
         if (mutation.trackedByCDC() && segment.getCDCState() == CDCState.FORBIDDEN)
         {
+            cdcSizeTracker.submitOverflowSizeRecalculation();
             String logMsg = String.format("Rejecting mutation to keyspace %s. Free up space in %s by processing CDC logs. " +
                                           "Total CDC bytes on disk is %s.",
                                           mutation.getKeyspaceName(), DatabaseDescriptor.getCDCLogLocation(),
-                                          cdcSizeTracker.totalCDCSizeOnDisk());
-            cdcSizeTracker.submitOverflowSizeRecalculation();
+                                          cdcSizeTracker.sizeInProgress.get());
             NoSpamLogger.log(logger,
                              NoSpamLogger.Level.WARN,
                              10,
@@ -173,7 +237,6 @@
     public CommitLogSegment createSegment()
     {
         CommitLogSegment segment = CommitLogSegment.createSegment(commitLog, this);
-
         cdcSizeTracker.processNewSegment(segment);
         // After processing, the state of the segment can either be PERMITTED or FORBIDDEN
         if (segment.getCDCState() == CDCState.PERMITTED)
@@ -195,12 +258,12 @@
         super.handleReplayedSegment(file);
 
         // delete untracked cdc segment hard link files if their index files do not exist
-        File cdcFile = new File(DatabaseDescriptor.getCDCLogLocation(), file.getName());
-        File cdcIndexFile = new File(DatabaseDescriptor.getCDCLogLocation(), CommitLogDescriptor.fromFileName(file.getName()).cdcIndexFileName());
+        File cdcFile = new File(DatabaseDescriptor.getCDCLogLocation(), file.name());
+        File cdcIndexFile = new File(DatabaseDescriptor.getCDCLogLocation(), CommitLogDescriptor.fromFileName(file.name()).cdcIndexFileName());
         if (cdcFile.exists() && !cdcIndexFile.exists())
         {
             logger.trace("(Unopened) CDC segment {} is no longer needed and will be deleted now", cdcFile);
-            FileUtils.deleteWithConfirm(cdcFile);
+            cdcFile.delete();
         }
     }
 
@@ -223,13 +286,17 @@
     {
         private final RateLimiter rateLimiter = RateLimiter.create(1000.0 / DatabaseDescriptor.getCDCDiskCheckInterval());
         private ExecutorService cdcSizeCalculationExecutor;
+        private final CommitLogSegmentManagerCDC segmentManager;
+        // track the total size between two dictionary size calculations
+        private final AtomicLong sizeInProgress;
 
-        // Used instead of size during walk to remove chance of over-allocation
-        private volatile long sizeInProgress = 0;
+        private final File path;
 
-        CDCSizeTracker(File path)
+        CDCSizeTracker(CommitLogSegmentManagerCDC segmentManager, File path)
         {
-            super(path);
+            this.path = path;
+            this.segmentManager = segmentManager;
+            this.sizeInProgress = new AtomicLong(0);
         }
 
         /**
@@ -237,15 +304,19 @@
          */
         public void start()
         {
-            size = 0;
-            cdcSizeCalculationExecutor = new ThreadPoolExecutor(1, 1, 1000, TimeUnit.SECONDS, new SynchronousQueue<>(), new ThreadPoolExecutor.DiscardPolicy());
+            sizeInProgress.getAndSet(0);
+            cdcSizeCalculationExecutor = executorFactory().configureSequential("CDCSizeCalculationExecutor")
+                                                          .withRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy())
+                                                          .withQueueLimit(0)
+                                                          .withKeepAlive(1000, TimeUnit.SECONDS)
+                                                          .build();
         }
 
         /**
          * Synchronous size recalculation on each segment creation/deletion call could lead to very long delays in new
          * segment allocation, thus long delays in thread signaling to wake waiting allocation / writer threads.
          *
-         * This can be reached either from the segment management thread in ABstractCommitLogSegmentManager or from the
+         * This can be reached either from the segment management thread in AbstractCommitLogSegmentManager or from the
          * size recalculation executor, so we synchronize on this object to reduce the race overlap window available for
          * size to get off.
          *
@@ -253,14 +324,32 @@
          */
         void processNewSegment(CommitLogSegment segment)
         {
+            int segmentSize = defaultSegmentSize();
+            long allowance = DatabaseDescriptor.getCDCTotalSpace();
+            boolean blocking = DatabaseDescriptor.getCDCBlockWrites();
+
             // See synchronization in CommitLogSegment.setCDCState
-            synchronized(segment.cdcStateLock)
+            synchronized (segment.cdcStateLock)
             {
-                segment.setCDCState(hasSpaceForNewSegment()
-                                    ? CDCState.PERMITTED
-                                    : CDCState.FORBIDDEN);
+                segment.setCDCState(blocking && segmentSize + sizeInProgress.get() > allowance
+                                    ? CDCState.FORBIDDEN
+                                    : CDCState.PERMITTED);
+
+                // Aggressively count in the (estimated) size of new segments.
                 if (segment.getCDCState() == CDCState.PERMITTED)
-                    size += defaultSegmentSize();
+                    addSize(segmentSize);
+            }
+
+            // Remove the oldest cdc segment file when exceeding the CDC storage allowance
+            if (!blocking && sizeInProgress.get() > allowance)
+            {
+                long bytesToFree = sizeInProgress.get() - allowance;
+                long remainingSize = segmentManager.deleteOldLinkedCDCCommitLogSegment(bytesToFree);
+                long releasedSize = sizeInProgress.get() - remainingSize;
+                sizeInProgress.getAndSet(remainingSize);
+                logger.debug("Freed up {} ({}) bytes after deleting the oldest CDC commit log segments in non-blocking mode. " +
+                             "Total on-disk CDC size: {}; allowed CDC size: {}",
+                             releasedSize, bytesToFree, remainingSize, allowance);
             }
 
             // Take this opportunity to kick off a recalc to pick up any consumer file deletion.
@@ -269,25 +358,29 @@
 
         void processDiscardedSegment(CommitLogSegment segment)
         {
-            // See synchronization in CommitLogSegment.setCDCState
-            synchronized(segment.cdcStateLock)
+            if (!segment.getCDCFile().exists())
             {
-                // Add to flushed size before decrementing unflushed so we don't have a window of false generosity
+                logger.debug("Not processing discarded CommitLogSegment {}; this segment appears to have been deleted already.", segment);
+                return;
+            }
+
+            synchronized (segment.cdcStateLock)
+            {
+                // Add to flushed size before decrementing unflushed, so we don't have a window of false generosity
                 if (segment.getCDCState() == CDCState.CONTAINS)
-                    size += segment.onDiskSize();
+                    addSize(segment.onDiskSize());
+
+                // Subtract the (estimated) size of the segment from processNewSegment.
+                // For the segement that CONTAINS, we update with adding the actual onDiskSize and removing the estimated size.
+                // For the segment that remains in PERMITTED, the file is to be deleted and the estimate should be returned.
                 if (segment.getCDCState() != CDCState.FORBIDDEN)
-                    size -= defaultSegmentSize();
+                    addSize(-defaultSegmentSize());
             }
 
             // Take this opportunity to kick off a recalc to pick up any consumer file deletion.
             submitOverflowSizeRecalculation();
         }
 
-        long allowableCDCBytes()
-        {
-            return (long)DatabaseDescriptor.getCDCSpaceInMB() * 1024 * 1024;
-        }
-
         public void submitOverflowSizeRecalculation()
         {
             try
@@ -305,6 +398,8 @@
 
         private int defaultSegmentSize()
         {
+            // CommitLogSegmentSize is only loaded from yaml.
+            // There is a setter but is used only for testing.
             return DatabaseDescriptor.getCommitLogSegmentSize();
         }
 
@@ -312,25 +407,16 @@
         {
             try
             {
-                // The Arrays.stream approach is considerably slower on Windows than linux
-                sizeInProgress = 0;
+                resetSize();
                 Files.walkFileTree(path.toPath(), this);
-                size = sizeInProgress;
+                sizeInProgress.getAndSet(getAllocatedSize());
             }
             catch (IOException ie)
             {
-                CommitLog.instance.handleCommitError("Failed CDC Size Calculation", ie);
+                CommitLog.handleCommitError("Failed CDC Size Calculation", ie);
             }
         }
 
-        @Override
-        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
-        {
-            sizeInProgress += attrs.size();
-            return FileVisitResult.CONTINUE;
-        }
-
-
         public void shutdown()
         {
             if (cdcSizeCalculationExecutor != null && !cdcSizeCalculationExecutor.isShutdown())
@@ -341,17 +427,7 @@
 
         private void addSize(long toAdd)
         {
-            size += toAdd;
-        }
-
-        private long totalCDCSizeOnDisk()
-        {
-            return size;
-        }
-
-        private boolean hasSpaceForNewSegment()
-        {
-            return defaultSegmentSize() + totalCDCSizeOnDisk() <= allowableCDCBytes();
+            sizeInProgress.getAndAdd(toAdd);
         }
     }
 
@@ -361,19 +437,15 @@
     @VisibleForTesting
     public long updateCDCTotalSize()
     {
+        long sleepTime = DatabaseDescriptor.getCDCDiskCheckInterval() + 50L;
+        // Give the update time to finish the last run if any. Therefore, avoid modifying production code only for testing purpose.
+        Uninterruptibles.sleepUninterruptibly(sleepTime, TimeUnit.MILLISECONDS);
         cdcSizeTracker.submitOverflowSizeRecalculation();
-
         // Give the update time to run
-        try
-        {
-            Thread.sleep(DatabaseDescriptor.getCDCDiskCheckInterval() + 10);
-        }
-        catch (InterruptedException e) {}
-
+        Uninterruptibles.sleepUninterruptibly(sleepTime, TimeUnit.MILLISECONDS);
         // then update the state of the segment it is allocating from. In produciton, the state is updated during "allocate"
         if (allocatingFrom().getCDCState() == CDCState.FORBIDDEN)
             cdcSizeTracker.processNewSegment(allocatingFrom());
-
-        return cdcSizeTracker.totalCDCSizeOnDisk();
+        return cdcSizeTracker.getAllocatedSize();
     }
 }
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerStandard.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerStandard.java
index 2682114..1ae2f13 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerStandard.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerStandard.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
-
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.io.util.FileUtils;
 
diff --git a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java
index e23a915..33e70c1 100644
--- a/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java
+++ b/src/java/org/apache/cassandra/db/commitlog/CommitLogSegmentReader.java
@@ -26,6 +26,10 @@
 import com.google.common.annotations.VisibleForTesting;
 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;
@@ -46,6 +50,11 @@
  */
 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 final Logger logger = LoggerFactory.getLogger(CommitLogSegmentReader.class);
+    
     private final CommitLogReadHandler handler;
     private final CommitLogDescriptor descriptor;
     private final RandomAccessReader reader;
@@ -75,6 +84,11 @@
         else
             segmenter = new NoOpSegmenter(reader);
     }
+    
+    public static void setAllowSkipSyncMarkerCrc(boolean allow)
+    {
+        allowSkipSyncMarkerCrc = allow;
+    }
 
     public Iterator<SyncSegment> iterator()
     {
@@ -151,8 +165,23 @@
         updateChecksumInt(crc, (int) reader.getPosition());
         final int end = reader.readInt();
         long filecrc = reader.readInt() & 0xffffffffL;
+
         if (crc.getValue() != filecrc)
         {
+            // The next marker position and CRC value are not written atomically, so it is possible for the latter to 
+            // still be zero after the former has been finalized, even though the mutations that follow it are valid.
+            // When there is no compression or encryption enabled, we can ignore a sync marker CRC mismatch and defer 
+            // to the per-mutation CRCs, which may be preferable to preventing startup altogether.
+            if (allowSkipSyncMarkerCrc
+                && descriptor.compression == null && !descriptor.getEncryptionContext().isEnabled()
+                && filecrc == 0 && end != 0)
+            {
+                logger.warn("Skipping sync marker CRC check at position {} (end={}, calculated crc={}) of commit log {}." +
+                            "Using per-mutation CRC checks to ensure correctness...",
+                            offset, end, crc.getValue(), reader.getPath());
+                return end;
+            }
+
             if (end != 0 || filecrc != 0)
             {
                 String msg = String.format("Encountered bad header at position %d of commit log %s, with invalid CRC. " +
diff --git a/src/java/org/apache/cassandra/db/commitlog/EncryptedSegment.java b/src/java/org/apache/cassandra/db/commitlog/EncryptedSegment.java
index a13f615..f503658 100644
--- a/src/java/org/apache/cassandra/db/commitlog/EncryptedSegment.java
+++ b/src/java/org/apache/cassandra/db/commitlog/EncryptedSegment.java
@@ -27,7 +27,6 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.FSWriteError;
-import org.apache.cassandra.io.compress.BufferType;
 import org.apache.cassandra.io.compress.ICompressor;
 import org.apache.cassandra.security.EncryptionUtils;
 import org.apache.cassandra.security.EncryptionContext;
diff --git a/src/java/org/apache/cassandra/db/commitlog/GroupCommitLogService.java b/src/java/org/apache/cassandra/db/commitlog/GroupCommitLogService.java
index a76923e..ad4448a 100644
--- a/src/java/org/apache/cassandra/db/commitlog/GroupCommitLogService.java
+++ b/src/java/org/apache/cassandra/db/commitlog/GroupCommitLogService.java
@@ -35,7 +35,7 @@
     {
         // wait until record has been safely persisted to disk
         pending.incrementAndGet();
-        // wait for commitlog_sync_group_window_in_ms
+        // wait for commitlog_sync_group_window
         alloc.awaitDiskSync(commitLog.metrics.waitingOnCommit);
         pending.decrementAndGet();
     }
diff --git a/src/java/org/apache/cassandra/db/commitlog/IntervalSet.java b/src/java/org/apache/cassandra/db/commitlog/IntervalSet.java
index 45db2f6..1108739 100644
--- a/src/java/org/apache/cassandra/db/commitlog/IntervalSet.java
+++ b/src/java/org/apache/cassandra/db/commitlog/IntervalSet.java
@@ -207,4 +207,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java b/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java
index 6ecdbd3..d564117 100644
--- a/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java
+++ b/src/java/org/apache/cassandra/db/commitlog/MemoryMappedSegment.java
@@ -90,7 +90,7 @@
         {
             throw new FSWriteError(e, getPath());
         }
-        NativeLibrary.trySkipCache(fd, startMarker, nextMarker, logFile.getAbsolutePath());
+        NativeLibrary.trySkipCache(fd, startMarker, nextMarker, logFile.absolutePath());
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogService.java b/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogService.java
index e94c616..ae170a8 100644
--- a/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogService.java
+++ b/src/java/org/apache/cassandra/db/commitlog/PeriodicCommitLogService.java
@@ -21,6 +21,8 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 class PeriodicCommitLogService extends AbstractCommitLogService
 {
     private static final long blockWhenSyncLagsNanos = TimeUnit.MILLISECONDS.toNanos(DatabaseDescriptor.getPeriodicCommitLogSyncBlock());
@@ -33,7 +35,7 @@
 
     protected void maybeWaitForSync(CommitLogSegment.Allocation alloc)
     {
-        long expectedSyncTime = System.nanoTime() - blockWhenSyncLagsNanos;
+        long expectedSyncTime = nanoTime() - blockWhenSyncLagsNanos;
         if (lastSyncedAt < expectedSyncTime)
         {
             pending.incrementAndGet();
@@ -41,4 +43,4 @@
             pending.decrementAndGet();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
index 0b37c22..5fe1df7 100644
--- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionStrategy.java
@@ -38,11 +38,14 @@
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.schema.CompactionParams;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.io.sstable.Component.DATA;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * Pluggable compaction strategy determines how SSTables get merged.
@@ -388,7 +391,7 @@
         // 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
         // elapsed since SSTable created.
-        if (System.currentTimeMillis() < sstable.getCreationTimeFor(Component.DATA) + tombstoneCompactionInterval * 1000)
+        if (currentTimeMillis() < sstable.getCreationTimeFor(DATA) + tombstoneCompactionInterval * 1000)
            return false;
 
         double droppableRatio = sstable.getEstimatedDroppableTombstoneRatio(gcBefore);
@@ -542,7 +545,7 @@
     public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor,
                                                        long keyCount,
                                                        long repairedAt,
-                                                       UUID pendingRepair,
+                                                       TimeUUID pendingRepair,
                                                        boolean isTransient,
                                                        MetadataCollector meta,
                                                        SerializationHeader header,
diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java
index 989c21c..40c4cb4 100644
--- a/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java
+++ b/src/java/org/apache/cassandra/db/compaction/AbstractCompactionTask.java
@@ -19,7 +19,6 @@
 
 import java.util.Iterator;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.base.Preconditions;
 
@@ -28,6 +27,7 @@
 import org.apache.cassandra.db.compaction.writers.CompactionAwareWriter;
 import org.apache.cassandra.io.FSDiskFullWriteError;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.WrappedRunnable;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 
@@ -67,7 +67,7 @@
             Iterator<SSTableReader> iter = sstables.iterator();
             SSTableReader first = iter.next();
             boolean isRepaired = first.isRepaired();
-            UUID pendingRepair = first.getPendingRepair();
+            TimeUUID pendingRepair = first.getPendingRepair();
             while (iter.hasNext())
             {
                 SSTableReader next = iter.next();
diff --git a/src/java/org/apache/cassandra/db/compaction/AbstractStrategyHolder.java b/src/java/org/apache/cassandra/db/compaction/AbstractStrategyHolder.java
index 95fc7b8..de6ff71 100644
--- a/src/java/org/apache/cassandra/db/compaction/AbstractStrategyHolder.java
+++ b/src/java/org/apache/cassandra/db/compaction/AbstractStrategyHolder.java
@@ -23,7 +23,6 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.function.Supplier;
 
 import com.google.common.base.Preconditions;
@@ -31,7 +30,6 @@
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
-import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.index.Index;
@@ -41,6 +39,7 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.schema.CompactionParams;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Wrapper that's aware of how sstables are divided between separate strategies,
@@ -193,7 +192,7 @@
     public abstract SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor,
                                                                 long keyCount,
                                                                 long repairedAt,
-                                                                UUID pendingRepair,
+                                                                TimeUUID pendingRepair,
                                                                 boolean isTransient,
                                                                 MetadataCollector collector,
                                                                 SerializationHeader header,
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionController.java b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
index cee2b58..6480631 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionController.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionController.java
@@ -28,13 +28,12 @@
 
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.partitions.Partition;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.FileDataInput;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
-import org.apache.cassandra.utils.AlwaysPresentFilter;
 import org.apache.cassandra.utils.OverlapIterator;
 import org.apache.cassandra.utils.concurrent.Refs;
 
@@ -258,10 +257,7 @@
 
         for (SSTableReader sstable: filteredSSTables)
         {
-            // if we don't have bloom filter(bf_fp_chance=1.0 or filter file is missing),
-            // we check index file instead.
-            if (sstable.getBloomFilter() instanceof AlwaysPresentFilter && sstable.getPosition(key, SSTableReader.Operator.EQ, false) != null
-                || sstable.getBloomFilter().isPresent(key))
+            if (sstable.maybePresent(key))
             {
                 minTimestampSeen = Math.min(minTimestampSeen, sstable.getMinTimestamp());
                 hasTimestamp = true;
@@ -272,10 +268,9 @@
         {
             if (memtable.getMinTimestamp() != Memtable.NO_MIN_TIMESTAMP)
             {
-                Partition partition = memtable.getPartition(key);
-                if (partition != null)
+                if (memtable.rowIterator(key) != null)
                 {
-                    minTimestampSeen = Math.min(minTimestampSeen, partition.stats().minTimestamp);
+                    minTimestampSeen = Math.min(minTimestampSeen, memtable.getMinTimestamp());
                     hasTimestamp = true;
                 }
             }
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java b/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java
index bdddaab..513adfa 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionInfo.java
@@ -22,7 +22,6 @@
 import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
-import java.util.UUID;
 import java.util.function.Predicate;
 
 import com.google.common.base.Joiner;
@@ -30,6 +29,7 @@
 
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.TimeUUID;
 
 public final class CompactionInfo
 {
@@ -48,15 +48,15 @@
     private final long completed;
     private final long total;
     private final Unit unit;
-    private final UUID compactionId;
+    private final TimeUUID compactionId;
     private final ImmutableSet<SSTableReader> sstables;
 
-    public CompactionInfo(TableMetadata metadata, OperationType tasktype, long bytesComplete, long totalBytes, UUID compactionId, Collection<SSTableReader> sstables)
+    public CompactionInfo(TableMetadata metadata, OperationType tasktype, long bytesComplete, long totalBytes, TimeUUID compactionId, Collection<SSTableReader> sstables)
     {
         this(metadata, tasktype, bytesComplete, totalBytes, Unit.BYTES, compactionId, sstables);
     }
 
-    private CompactionInfo(TableMetadata metadata, OperationType tasktype, long completed, long total, Unit unit, UUID compactionId, Collection<SSTableReader> sstables)
+    private CompactionInfo(TableMetadata metadata, OperationType tasktype, long completed, long total, Unit unit, TimeUUID compactionId, Collection<SSTableReader> sstables)
     {
         this.tasktype = tasktype;
         this.completed = completed;
@@ -71,7 +71,7 @@
      * Special compaction info where we always need to cancel the compaction - for example ViewBuilderTask and AutoSavingCache where we don't know
      * the sstables at construction
      */
-    public static CompactionInfo withoutSSTables(TableMetadata metadata, OperationType tasktype, long completed, long total, Unit unit, UUID compactionId)
+    public static CompactionInfo withoutSSTables(TableMetadata metadata, OperationType tasktype, long completed, long total, Unit unit, TimeUUID compactionId)
     {
         return new CompactionInfo(metadata, tasktype, completed, total, unit, compactionId, ImmutableSet.of());
     }
@@ -112,7 +112,7 @@
         return tasktype;
     }
 
-    public UUID getTaskId()
+    public TimeUUID getTaskId()
     {
         return compactionId;
     }
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionInterruptedException.java b/src/java/org/apache/cassandra/db/compaction/CompactionInterruptedException.java
index 129d9fc..b9174ec 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionInterruptedException.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionInterruptedException.java
@@ -17,11 +17,14 @@
  */
 package org.apache.cassandra.db.compaction;
 
+import org.apache.cassandra.utils.Shared;
+
+@Shared
 public class CompactionInterruptedException extends RuntimeException
 {
     private static final long serialVersionUID = -8651427062512310398L;
 
-    public CompactionInterruptedException(CompactionInfo info)
+    public CompactionInterruptedException(Object info)
     {
         super("Compaction interrupted: " + info);
     }
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java b/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java
index ec6a4d4..a0dc087 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionIterator.java
@@ -19,11 +19,17 @@
 
 import java.util.*;
 import java.util.function.LongPredicate;
+import java.util.concurrent.TimeUnit;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Ordering;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 
 import org.apache.cassandra.db.transform.DuplicateRowChecker;
@@ -36,7 +42,15 @@
 import org.apache.cassandra.db.transform.Transformation;
 import org.apache.cassandra.index.transactions.CompactionTransaction;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
+import org.apache.cassandra.metrics.TopPartitionTracker;
 import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosRows;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
+import static org.apache.cassandra.config.Config.PaxosStatePurging.legacy;
+import static org.apache.cassandra.config.DatabaseDescriptor.paxosStatePurging;
 
 /**
  * Merge multiple iterators over the content of sstable into a "compacted" iterator.
@@ -63,7 +77,7 @@
     private final List<ISSTableScanner> scanners;
     private final ImmutableSet<SSTableReader> sstables;
     private final int nowInSec;
-    private final UUID compactionId;
+    private final TimeUUID compactionId;
 
     private final long totalBytes;
     private long bytesRead;
@@ -79,13 +93,19 @@
     private final UnfilteredPartitionIterator compacted;
     private final ActiveCompactionsTracker activeCompactions;
 
-    public CompactionIterator(OperationType type, List<ISSTableScanner> scanners, AbstractCompactionController controller, int nowInSec, UUID compactionId)
+    public CompactionIterator(OperationType type, List<ISSTableScanner> scanners, AbstractCompactionController controller, int nowInSec, TimeUUID compactionId)
     {
-        this(type, scanners, controller, nowInSec, compactionId, ActiveCompactionsTracker.NOOP);
+        this(type, scanners, controller, nowInSec, compactionId, ActiveCompactionsTracker.NOOP, null);
     }
 
     @SuppressWarnings("resource") // We make sure to close mergedIterator in close() and CompactionIterator is itself an AutoCloseable
-    public CompactionIterator(OperationType type, List<ISSTableScanner> scanners, AbstractCompactionController controller, int nowInSec, UUID compactionId, ActiveCompactionsTracker activeCompactions)
+    public CompactionIterator(OperationType type,
+                              List<ISSTableScanner> scanners,
+                              AbstractCompactionController controller,
+                              int nowInSec,
+                              TimeUUID compactionId,
+                              ActiveCompactionsTracker activeCompactions,
+                              TopPartitionTracker.Collector topPartitionCollector)
     {
         this.controller = controller;
         this.type = type;
@@ -108,8 +128,13 @@
         UnfilteredPartitionIterator merged = scanners.isEmpty()
                                            ? EmptyIterators.unfilteredPartition(controller.cfs.metadata())
                                            : UnfilteredPartitionIterators.merge(scanners, listener());
+        if (topPartitionCollector != null) // need to count tombstones before they are purged
+            merged = Transformation.apply(merged, new TopPartitionTracker.TombstoneCounter(topPartitionCollector, nowInSec));
         merged = Transformation.apply(merged, new GarbageSkipper(controller));
-        merged = Transformation.apply(merged, new Purger(controller, nowInSec));
+        Transformation<UnfilteredRowIterator> purger = isPaxos(controller.cfs) && paxosStatePurging() != legacy
+                                                       ? new PaxosPurger(nowInSec)
+                                                       : new Purger(controller, nowInSec);
+        merged = Transformation.apply(merged, purger);
         merged = DuplicateRowChecker.duringCompaction(merged, type);
         compacted = Transformation.apply(merged, new AbortableUnfilteredPartitionTransformation(this));
     }
@@ -240,6 +265,11 @@
         bytesRead = n;
     }
 
+    public long getBytesRead()
+    {
+        return bytesRead;
+    }
+
     public boolean hasNext()
     {
         return compacted.hasNext();
@@ -555,6 +585,78 @@
         }
     }
 
+    private class PaxosPurger extends Transformation<UnfilteredRowIterator>
+    {
+        private final long nowInSec;
+        private final long paxosPurgeGraceMicros = DatabaseDescriptor.getPaxosPurgeGrace(MICROSECONDS);
+        private final Map<TableId, PaxosRepairHistory.Searcher> tableIdToHistory = new HashMap<>();
+        private Token currentToken;
+        private int compactedUnfiltered;
+
+        private PaxosPurger(long nowInSec)
+        {
+            this.nowInSec = nowInSec;
+        }
+
+        protected void onEmptyPartitionPostPurge(DecoratedKey key)
+        {
+            if (type == OperationType.COMPACTION)
+                controller.cfs.invalidateCachedPartition(key);
+        }
+
+        protected void updateProgress()
+        {
+            if ((++compactedUnfiltered) % UNFILTERED_TO_UPDATE_PROGRESS == 0)
+                updateBytesRead();
+        }
+
+        @Override
+        @SuppressWarnings("resource")
+        protected UnfilteredRowIterator applyToPartition(UnfilteredRowIterator partition)
+        {
+            currentToken = partition.partitionKey().getToken();
+            UnfilteredRowIterator purged = Transformation.apply(partition, this);
+            if (purged.isEmpty())
+            {
+                onEmptyPartitionPostPurge(purged.partitionKey());
+                purged.close();
+                return null;
+            }
+
+            return purged;
+        }
+
+        @Override
+        protected Row applyToRow(Row row)
+        {
+            updateProgress();
+            TableId tableId = PaxosRows.getTableId(row);
+
+            switch (paxosStatePurging())
+            {
+                default: throw new AssertionError();
+                case legacy:
+                case gc_grace:
+                {
+                    TableMetadata metadata = Schema.instance.getTableMetadata(tableId);
+                    return row.purgeDataOlderThan(TimeUnit.SECONDS.toMicros(nowInSec - (metadata == null ? (3 * 3600) : metadata.params.gcGraceSeconds)), false);
+                }
+                case repaired:
+                {
+                    PaxosRepairHistory.Searcher history = tableIdToHistory.computeIfAbsent(tableId, find -> {
+                        TableMetadata metadata = Schema.instance.getTableMetadata(find);
+                        if (metadata == null)
+                            return null;
+                        return Keyspace.openAndGetStore(metadata).getPaxosRepairHistory().searcher();
+                    });
+
+                    return history == null ? row :
+                           row.purgeDataOlderThan(history.ballotForToken(currentToken).unixMicros() - paxosPurgeGraceMicros, false);
+                }
+            }
+        }
+    }
+
     private static class AbortableUnfilteredPartitionTransformation extends Transformation<UnfilteredRowIterator>
     {
         private final AbortableUnfilteredRowTransformation abortableIter;
@@ -573,7 +675,7 @@
         }
     }
 
-    private static class AbortableUnfilteredRowTransformation extends Transformation
+    private static class AbortableUnfilteredRowTransformation extends Transformation<UnfilteredRowIterator>
     {
         private final CompactionIterator iter;
 
@@ -589,4 +691,9 @@
             return row;
         }
     }
+
+    private static boolean isPaxos(ColumnFamilyStore cfs)
+    {
+        return cfs.name.equals(SystemKeyspace.PAXOS) && cfs.keyspace.getName().equals(SchemaConstants.SYSTEM_KEYSPACE_NAME);
+    }
 }
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java b/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java
index f473be7..9bf063b 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionLogger.java
@@ -41,10 +41,16 @@
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.JsonNodeFactory;
 import com.fasterxml.jackson.databind.node.ObjectNode;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
+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.utils.Clock.Global.currentTimeMillis;
+
 public class CompactionLogger
 {
     public interface Strategy
@@ -103,7 +109,7 @@
 
     private static final JsonNodeFactory json = JsonNodeFactory.instance;
     private static final Logger logger = LoggerFactory.getLogger(CompactionLogger.class);
-    private static final Writer serializer = new CompactionLogSerializer();
+    private static final CompactionLogSerializer serializer = new CompactionLogSerializer();
     private final WeakReference<ColumnFamilyStore> cfsRef;
     private final WeakReference<CompactionStrategyManager> csmRef;
     private final AtomicInteger identifier = new AtomicInteger(0);
@@ -165,7 +171,7 @@
     private JsonNode formatSSTable(AbstractCompactionStrategy strategy, SSTableReader sstable)
     {
         ObjectNode node = json.objectNode();
-        node.put("generation", sstable.descriptor.generation);
+        node.put("generation", sstable.descriptor.id.toString());
         node.put("version", sstable.descriptor.version.getVersion());
         node.put("size", sstable.onDiskLength());
         JsonNode logResult = strategy.strategyLogger().sstable(sstable);
@@ -220,7 +226,7 @@
             return;
         node.put("keyspace", cfs.keyspace.getName());
         node.put("table", cfs.getTableName());
-        node.put("time", System.currentTimeMillis());
+        node.put("time", currentTimeMillis());
     }
 
     private JsonNode startStrategies()
@@ -295,7 +301,7 @@
     private static class CompactionLogSerializer implements Writer
     {
         private static final String logDirectory = System.getProperty("cassandra.logdir", ".");
-        private final ExecutorService loggerService = Executors.newFixedThreadPool(1);
+        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<>();
         private OutputStreamWriter stream;
@@ -303,13 +309,13 @@
         private static OutputStreamWriter createStream() throws IOException
         {
             int count = 0;
-            Path compactionLog = Paths.get(logDirectory, "compaction.log");
+            Path compactionLog = new File(logDirectory, "compaction.log").toPath();
             if (Files.exists(compactionLog))
             {
                 Path tryPath = compactionLog;
                 while (Files.exists(tryPath))
                 {
-                    tryPath = Paths.get(logDirectory, String.format("compaction-%d.log", count++));
+                    tryPath = new File(logDirectory, String.format("compaction-%d.log", count++)).toPath();
                 }
                 Files.move(compactionLog, tryPath);
             }
@@ -357,4 +363,10 @@
             });
         }
     }
+
+    public static void shutdownNowAndWait(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
+    {
+        ExecutorUtils.shutdownNowAndWait(timeout, unit, serializer.loggerService);
+    }
+
 }
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
index b53f331..347f9b3 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.db.compaction;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -29,19 +28,15 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BooleanSupplier;
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import javax.management.openmbean.OpenDataException;
 import javax.management.openmbean.TabularData;
@@ -57,19 +52,14 @@
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multiset;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListenableFutureTask;
 import com.google.common.util.concurrent.RateLimiter;
 import com.google.common.util.concurrent.Uninterruptibles;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.netty.util.concurrent.FastThreadLocal;
 import org.apache.cassandra.cache.AutoSavingCache;
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.concurrent.WrappedExecutorPlus;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -93,19 +83,21 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.index.SecondaryIndexBuilder;
+import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.io.sstable.IndexSummaryRedistribution;
 import org.apache.cassandra.io.sstable.SSTableRewriter;
-import org.apache.cassandra.io.sstable.SnapshotDeletingTask;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableWriter;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.metrics.CompactionMetrics;
 import org.apache.cassandra.metrics.TableMetrics;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
 import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
@@ -116,13 +108,21 @@
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MBeanWrapper;
 import org.apache.cassandra.utils.Throwables;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.WrappedRunnable;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.Refs;
 
 import static java.util.Collections.singleton;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.concurrent.FutureTask.callable;
+import static org.apache.cassandra.config.DatabaseDescriptor.getConcurrentCompactors;
+import static org.apache.cassandra.db.compaction.CompactionManager.CompactionExecutor.compactionThreadGroup;
 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.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * <p>
@@ -144,17 +144,6 @@
     public static final int NO_GC = Integer.MIN_VALUE;
     public static final int GC_ALL = Integer.MAX_VALUE;
 
-    // A thread local that tells us if the current thread is owned by the compaction manager. Used
-    // by CounterContext to figure out if it should log a warning for invalid counter shards.
-    public static final FastThreadLocal<Boolean> isCompactionManager = new FastThreadLocal<Boolean>()
-    {
-        @Override
-        protected Boolean initialValue()
-        {
-            return false;
-        }
-    };
-
     static
     {
         instance = new CompactionManager();
@@ -191,18 +180,30 @@
      */
     public RateLimiter getRateLimiter()
     {
-        setRate(DatabaseDescriptor.getCompactionThroughputMbPerSec());
+        setRateInBytes(DatabaseDescriptor.getCompactionThroughputBytesPerSec());
         return compactionRateLimiter;
     }
 
     /**
-     * Sets the rate for the rate limiter. When compaction_throughput_mb_per_sec is 0 or node is bootstrapping,
+     * Sets the rate for the rate limiter. When compaction_throughput is 0 or node is bootstrapping,
      * this sets the rate to Double.MAX_VALUE bytes per second.
-     * @param throughPutMbPerSec throughput to set in mb per second
+     * @param throughputMbPerSec throughput to set in MiB/s
+     * @deprecated Use setRateInBytes instead
      */
-    public void setRate(final double throughPutMbPerSec)
+    @Deprecated
+    public void setRate(final double throughputMbPerSec)
     {
-        double throughput = throughPutMbPerSec * 1024.0 * 1024.0;
+        setRateInBytes(throughputMbPerSec * 1024.0 * 1024);
+    }
+
+    /**
+     * Sets the rate for the rate limiter. When compaction_throughput is 0 or node is bootstrapping,
+     * this sets the rate to Double.MAX_VALUE bytes per second.
+     * @param throughputBytesPerSec throughput to set in B/s
+     */
+    public void setRateInBytes(final double throughputBytesPerSec)
+    {
+        double throughput = throughputBytesPerSec;
         // if throughput is set to 0, throttling is disabled
         if (throughput == 0 || StorageService.instance.isBootstrapMode())
             throughput = Double.MAX_VALUE;
@@ -230,7 +231,7 @@
          * are idle threads stil. (CASSANDRA-4310)
          */
         int count = compactingCF.count(cfs);
-        if (count > 0 && executor.getActiveCount() >= executor.getMaximumPoolSize())
+        if (count > 0 && executor.getActiveTaskCount() >= executor.getMaximumPoolSize())
         {
             logger.trace("Background compaction is still running for {}.{} ({} remaining). Skipping",
                          cfs.keyspace.getName(), cfs.name, count);
@@ -279,6 +280,7 @@
 
         return activeTasks > 0;
     }
+
     /**
      * Shutdowns both compaction and validation executors, cancels running compaction / validation,
      * and waits for tasks to complete if tasks were not cancelable.
@@ -537,7 +539,38 @@
         }, 0, OperationType.VERIFY);
     }
 
-    public AllSSTableOpStatus performSSTableRewrite(final ColumnFamilyStore cfs, final boolean excludeCurrentVersion, int jobs) throws InterruptedException, ExecutionException
+    public AllSSTableOpStatus performSSTableRewrite(final ColumnFamilyStore cfs,
+                                                    final boolean skipIfCurrentVersion,
+                                                    final long skipIfOlderThanTimestamp,
+                                                    final boolean skipIfCompressionMatches,
+                                                    int jobs) throws InterruptedException, ExecutionException
+    {
+        return performSSTableRewrite(cfs, (sstable) -> {
+            // Skip if descriptor version matches current version
+            if (skipIfCurrentVersion && sstable.descriptor.version.equals(sstable.descriptor.getFormat().getLatestVersion()))
+                return false;
+
+            // Skip if SSTable creation time is past given timestamp
+            if (sstable.getCreationTimeFor(Component.DATA) > skipIfOlderThanTimestamp)
+                return false;
+
+            TableMetadata metadata = cfs.metadata.get();
+            // Skip if SSTable compression parameters match current ones
+            if (skipIfCompressionMatches &&
+                ((!sstable.compression && !metadata.params.compression.isEnabled()) ||
+                 (sstable.compression && metadata.params.compression.equals(sstable.getCompressionMetadata().parameters))))
+                return false;
+
+            return true;
+        }, jobs);
+    }
+
+    /**
+     * Perform SSTable rewrite
+
+     * @param sstableFilter sstables for which predicate returns {@link false} will be excluded
+     */
+    public AllSSTableOpStatus performSSTableRewrite(final ColumnFamilyStore cfs, Predicate<SSTableReader> sstableFilter, int jobs) throws InterruptedException, ExecutionException
     {
         return parallelAllSSTableOperation(cfs, new OneSSTableOperation()
         {
@@ -550,7 +583,7 @@
                 while (iter.hasNext())
                 {
                     SSTableReader sstable = iter.next();
-                    if (excludeCurrentVersion && sstable.descriptor.version.equals(sstable.descriptor.getFormat().getLatestVersion()))
+                    if (!sstableFilter.test(sstable))
                     {
                         transaction.cancel(sstable);
                         iter.remove();
@@ -741,12 +774,12 @@
     /**
      * Splits the given token ranges of the given sstables into a pending repair silo
      */
-    public ListenableFuture<?> submitPendingAntiCompaction(ColumnFamilyStore cfs,
-                                                           RangesAtEndpoint tokenRanges,
-                                                           Refs<SSTableReader> sstables,
-                                                           LifecycleTransaction txn,
-                                                           UUID sessionId,
-                                                           BooleanSupplier isCancelled)
+    public Future<Void> submitPendingAntiCompaction(ColumnFamilyStore cfs,
+                                                    RangesAtEndpoint tokenRanges,
+                                                    Refs<SSTableReader> sstables,
+                                                    LifecycleTransaction txn,
+                                                    TimeUUID sessionId,
+                                                    BooleanSupplier isCancelled)
     {
         Runnable runnable = new WrappedRunnable()
         {
@@ -759,7 +792,7 @@
             }
         };
 
-        ListenableFuture<?> task = null;
+        Future<Void> task = null;
         try
         {
             task = executor.submitIfRunning(runnable, "pending anticompaction");
@@ -784,7 +817,7 @@
                                                      Iterator<SSTableReader> sstableIterator,
                                                      Collection<Range<Token>> ranges,
                                                      LifecycleTransaction txn,
-                                                     UUID sessionID,
+                                                     TimeUUID sessionID,
                                                      boolean isTransient) throws IOException
     {
         if (ranges.isEmpty())
@@ -819,12 +852,20 @@
                                       RangesAtEndpoint replicas,
                                       Refs<SSTableReader> validatedForRepair,
                                       LifecycleTransaction txn,
-                                      UUID sessionID,
+                                      TimeUUID sessionID,
                                       BooleanSupplier isCancelled) throws IOException
     {
         try
         {
-            ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
+            ActiveRepairService.ParentRepairSession prs;
+            try
+            {
+                prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
+            }
+            catch (NoSuchRepairSessionException e)
+            {
+                throw new CompactionInterruptedException(e.getMessage());
+            }
             Preconditions.checkArgument(!prs.isPreview(), "Cannot anticompact for previews");
             Preconditions.checkArgument(!replicas.isEmpty(), "No ranges to anti-compact");
 
@@ -852,7 +893,7 @@
         logger.info("{} Completed anticompaction successfully", PreviewKind.NONE.logPrefix(sessionID));
     }
 
-    static void validateSSTableBoundsForAnticompaction(UUID sessionID,
+    static void validateSSTableBoundsForAnticompaction(TimeUUID sessionID,
                                                        Collection<SSTableReader> sstables,
                                                        RangesAtEndpoint ranges)
     {
@@ -874,7 +915,7 @@
     }
 
     @VisibleForTesting
-    static Set<SSTableReader> findSSTablesToAnticompact(Iterator<SSTableReader> sstableIterator, List<Range<Token>> normalizedRanges, UUID parentRepairSession)
+    static Set<SSTableReader> findSSTablesToAnticompact(Iterator<SSTableReader> sstableIterator, List<Range<Token>> normalizedRanges, TimeUUID parentRepairSession)
     {
         Set<SSTableReader> fullyContainedSSTables = new HashSet<>();
         while (sstableIterator.hasNext())
@@ -944,19 +985,10 @@
         return futures;
     }
 
-    /**
-     * Forces a major compaction of specified token ranges of the specified column family.
-     * <p>
-     * The token ranges will be interpreted as closed intervals to match the closed interval defined by the first and
-     * last keys of a sstable, even though the {@link Range} class is suppossed to be half-open by definition.
-     *
-     * @param cfStore The column family store to be compacted.
-     * @param ranges The token ranges to be compacted, interpreted as closed intervals.
-     */
-    public void forceCompactionForTokenRange(ColumnFamilyStore cfStore, Collection<Range<Token>> ranges)
+    public void forceCompaction(ColumnFamilyStore cfStore, Supplier<Collection<SSTableReader>> sstablesFn, com.google.common.base.Predicate<SSTableReader> sstablesPredicate)
     {
         Callable<CompactionTasks> taskCreator = () -> {
-            Collection<SSTableReader> sstables = sstablesInBounds(cfStore, ranges);
+            Collection<SSTableReader> sstables = sstablesFn.get();
             if (sstables == null || sstables.isEmpty())
             {
                 logger.debug("No sstables found for the provided token range");
@@ -966,7 +998,7 @@
         };
 
         try (CompactionTasks tasks = cfStore.runWithCompactionsDisabled(taskCreator,
-                                                                        (sstable) -> new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(ranges),
+                                                                        sstablesPredicate,
                                                                         false,
                                                                         false,
                                                                         false))
@@ -989,6 +1021,22 @@
     }
 
     /**
+     * Forces a major compaction of specified token ranges of the specified column family.
+     * <p>
+     * The token ranges will be interpreted as closed intervals to match the closed interval defined by the first and
+     * last keys of a sstable, even though the {@link Range} class is suppossed to be half-open by definition.
+     *
+     * @param cfStore The column family store to be compacted.
+     * @param ranges The token ranges to be compacted, interpreted as closed intervals.
+     */
+    public void forceCompactionForTokenRange(ColumnFamilyStore cfStore, Collection<Range<Token>> ranges)
+    {
+        forceCompaction(cfStore,
+                        () -> sstablesInBounds(cfStore, ranges),
+                        sstable -> new Bounds<>(sstable.first.getToken(), sstable.last.getToken()).intersects(ranges));
+    }
+
+    /**
      * Returns the sstables of the specified column family store that intersect with the specified token ranges.
      * <p>
      * The token ranges will be interpreted as closed intervals to match the closed interval defined by the first and
@@ -1021,6 +1069,24 @@
         return sstables;
     }
 
+    public void forceCompactionForKey(ColumnFamilyStore cfStore, DecoratedKey key)
+    {
+        forceCompaction(cfStore, () -> sstablesWithKey(cfStore, key), sstable -> sstable.maybePresent(key));
+    }
+
+    private static Collection<SSTableReader> sstablesWithKey(ColumnFamilyStore cfs, DecoratedKey key)
+    {
+        final Set<SSTableReader> sstables = new HashSet<>();
+        Iterable<SSTableReader> liveTables = cfs.getTracker().getView().liveSSTablesInBounds(key.getToken().minKeyBound(),
+                                                                                             key.getToken().maxKeyBound());
+        for (SSTableReader sstable : liveTables)
+        {
+            if (sstable.maybePresent(key))
+                sstables.add(sstable);
+        }
+        return sstables.isEmpty() ? Collections.emptyList() : sstables;
+    }
+
     public void forceUserDefinedCompaction(String dataFiles)
     {
         String[] filenames = dataFiles.split(",");
@@ -1037,7 +1103,7 @@
             }
             // group by keyspace/columnfamily
             ColumnFamilyStore cfs = Keyspace.open(desc.ksname).getColumnFamilyStore(desc.cfname);
-            descriptors.put(cfs, cfs.getDirectories().find(new File(filename.trim()).getName()));
+            descriptors.put(cfs, cfs.getDirectories().find(new File(filename.trim()).name()));
         }
 
         List<Future<?>> futures = new ArrayList<>(descriptors.size());
@@ -1063,7 +1129,7 @@
             }
             // group by keyspace/columnfamily
             ColumnFamilyStore cfs = Keyspace.open(desc.ksname).getColumnFamilyStore(desc.cfname);
-            desc = cfs.getDirectories().find(new File(filename.trim()).getName());
+            desc = cfs.getDirectories().find(new File(filename.trim()).name());
             if (desc != null)
                 descriptors.put(cfs, desc);
         }
@@ -1168,7 +1234,7 @@
     /* Used in tests. */
     public void disableAutoCompaction()
     {
-        for (String ksname : Schema.instance.getNonSystemKeyspaces())
+        for (String ksname : Schema.instance.getNonSystemKeyspaces().names())
         {
             for (ColumnFamilyStore cfs : Keyspace.open(ksname).getColumnFamilyStores())
                 cfs.disableAutoCompaction();
@@ -1293,7 +1359,7 @@
             return;
         }
 
-        long start = System.nanoTime();
+        long start = nanoTime();
 
         long totalkeysWritten = 0;
 
@@ -1317,7 +1383,7 @@
              ISSTableScanner scanner = cleanupStrategy.getScanner(sstable);
              CompactionController controller = new CompactionController(cfs, txn.originals(), getDefaultGcBefore(cfs, nowInSec));
              Refs<SSTableReader> refs = Refs.ref(Collections.singleton(sstable));
-             CompactionIterator ci = new CompactionIterator(OperationType.CLEANUP, Collections.singletonList(scanner), controller, nowInSec, UUIDGen.getTimeUUID(), active))
+             CompactionIterator ci = new CompactionIterator(OperationType.CLEANUP, Collections.singletonList(scanner), controller, nowInSec, nextTimeUUID(), active, null))
         {
             StatsMetadata metadata = sstable.getSSTableMetadata();
             writer.switchWriter(createWriter(cfs, compactionFileLocation, expectedBloomFilterSize, metadata.repairedAt, metadata.pendingRepair, metadata.isTransient, sstable, txn));
@@ -1351,7 +1417,7 @@
         if (!finished.isEmpty())
         {
             String format = "Cleaned up to %s.  %s to %s (~%d%% of original) for %,d keys.  Time: %,dms.";
-            long dTime = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
+            long dTime = TimeUnit.NANOSECONDS.toMillis(nanoTime() - start);
             long startsize = sstable.onDiskLength();
             long endsize = 0;
             for (SSTableReader newSstable : finished)
@@ -1481,7 +1547,7 @@
                                              File compactionFileLocation,
                                              long expectedBloomFilterSize,
                                              long repairedAt,
-                                             UUID pendingRepair,
+                                             TimeUUID pendingRepair,
                                              boolean isTransient,
                                              SSTableReader sstable,
                                              LifecycleTransaction txn)
@@ -1504,7 +1570,7 @@
                                                               File compactionFileLocation,
                                                               int expectedBloomFilterSize,
                                                               long repairedAt,
-                                                              UUID pendingRepair,
+                                                              TimeUUID pendingRepair,
                                                               boolean isTransient,
                                                               Collection<SSTableReader> sstables,
                                                               ILifecycleTransaction txn)
@@ -1551,7 +1617,7 @@
     private void doAntiCompaction(ColumnFamilyStore cfs,
                                   RangesAtEndpoint ranges,
                                   LifecycleTransaction txn,
-                                  UUID pendingRepair,
+                                  TimeUUID pendingRepair,
                                   BooleanSupplier isCancelled)
     {
         int originalCount = txn.originals().size();
@@ -1586,7 +1652,7 @@
     int antiCompactGroup(ColumnFamilyStore cfs,
                          RangesAtEndpoint ranges,
                          LifecycleTransaction txn,
-                         UUID pendingRepair,
+                         TimeUUID pendingRepair,
                          BooleanSupplier isCancelled)
     {
         Preconditions.checkArgument(!ranges.isEmpty(), "need at least one full or transient range");
@@ -1654,7 +1720,7 @@
 
              AbstractCompactionStrategy.ScannerList scanners = strategy.getScanners(txn.originals());
              CompactionController controller = new CompactionController(cfs, sstableAsSet, getDefaultGcBefore(cfs, nowInSec));
-             CompactionIterator ci = getAntiCompactionIterator(scanners.scanners, controller, nowInSec, UUIDGen.getTimeUUID(), active, isCancelled))
+             CompactionIterator ci = getAntiCompactionIterator(scanners.scanners, controller, nowInSec, nextTimeUUID(), active, isCancelled))
         {
             int expectedBloomFilterSize = Math.max(cfs.metadata().params.minIndexInterval, (int)(SSTableReader.getApproximateKeyCount(sstableAsSet)));
 
@@ -1737,10 +1803,10 @@
     }
 
     @VisibleForTesting
-    public static CompactionIterator getAntiCompactionIterator(List<ISSTableScanner> scanners, CompactionController controller, int nowInSec, UUID timeUUID, ActiveCompactionsTracker activeCompactions, BooleanSupplier isCancelled)
+    public static CompactionIterator getAntiCompactionIterator(List<ISSTableScanner> scanners, CompactionController controller, int nowInSec, TimeUUID timeUUID, ActiveCompactionsTracker activeCompactions, BooleanSupplier isCancelled)
     {
-        return new CompactionIterator(OperationType.ANTICOMPACTION, scanners, controller, nowInSec, timeUUID, activeCompactions) {
-
+        return new CompactionIterator(OperationType.ANTICOMPACTION, scanners, controller, nowInSec, timeUUID, activeCompactions, null)
+        {
             public boolean isStopRequested()
             {
                 return super.isStopRequested() || isCancelled.getAsBoolean();
@@ -1749,7 +1815,7 @@
     }
 
     @VisibleForTesting
-    ListenableFuture<?> submitIndexBuild(final SecondaryIndexBuilder builder, ActiveCompactionsTracker activeCompactions)
+    Future<?> submitIndexBuild(final SecondaryIndexBuilder builder, ActiveCompactionsTracker activeCompactions)
     {
         Runnable runnable = new Runnable()
         {
@@ -1773,7 +1839,7 @@
     /**
      * Is not scheduled, because it is performing disjoint work from sstable compaction.
      */
-    public ListenableFuture<?> submitIndexBuild(final SecondaryIndexBuilder builder)
+    public Future<?> submitIndexBuild(final SecondaryIndexBuilder builder)
     {
         return submitIndexBuild(builder, active);
     }
@@ -1842,13 +1908,13 @@
         return cfs.isIndex() ? nowInSec : cfs.gcBefore(nowInSec);
     }
 
-    public ListenableFuture<Long> submitViewBuilder(final ViewBuilderTask task)
+    public Future<Long> submitViewBuilder(final ViewBuilderTask task)
     {
         return submitViewBuilder(task, active);
     }
 
     @VisibleForTesting
-    ListenableFuture<Long> submitViewBuilder(final ViewBuilderTask task, ActiveCompactionsTracker activeCompactions)
+    Future<Long> submitViewBuilder(final ViewBuilderTask task, ActiveCompactionsTracker activeCompactions)
     {
         return viewBuildExecutor.submitIfRunning(() -> {
             activeCompactions.beginCompaction(task);
@@ -1868,63 +1934,38 @@
         return active.getCompactions().size();
     }
 
-    static class CompactionExecutor extends JMXEnabledThreadPoolExecutor
+    public static boolean isCompactor(Thread thread)
     {
-        protected CompactionExecutor(int minThreads, int maxThreads, String name, BlockingQueue<Runnable> queue)
-        {
-            super(minThreads, maxThreads, 60, TimeUnit.SECONDS, queue, new NamedThreadFactory(name, Thread.MIN_PRIORITY), "internal");
-        }
+        return thread.getThreadGroup().getParent() == compactionThreadGroup;
+    }
 
-        private CompactionExecutor(int threadCount, String name)
-        {
-            this(threadCount, threadCount, name, new LinkedBlockingQueue<Runnable>());
-        }
+    // TODO: this is a bit ugly, but no uglier than it was
+    static class CompactionExecutor extends WrappedExecutorPlus
+    {
+        static final ThreadGroup compactionThreadGroup = executorFactory().newThreadGroup("compaction");
 
         public CompactionExecutor()
         {
-            this(Math.max(1, DatabaseDescriptor.getConcurrentCompactors()), "CompactionExecutor");
+            this(executorFactory(), getConcurrentCompactors(), "CompactionExecutor", Integer.MAX_VALUE);
         }
 
-        protected void beforeExecute(Thread t, Runnable r)
+        public CompactionExecutor(int threads, String name, int queueSize)
         {
-            // can't set this in Thread factory, so we do it redundantly here
-            isCompactionManager.set(true);
-            super.beforeExecute(t, r);
+            this(executorFactory(), threads, name, queueSize);
         }
 
-        // modified from DebuggableThreadPoolExecutor so that CompactionInterruptedExceptions are not logged
-        @Override
-        public void afterExecute(Runnable r, Throwable t)
+        protected CompactionExecutor(ExecutorFactory executorFactory, int threads, String name, int queueSize)
         {
-            DebuggableThreadPoolExecutor.maybeResetLocalSessionWrapper(r);
-
-            if (t == null)
-                t = DebuggableThreadPoolExecutor.extractThrowable(r);
-
-            if (t != null)
-            {
-                if (t instanceof CompactionInterruptedException)
-                {
-                    logger.info(t.getMessage());
-                    if (t.getSuppressed() != null && t.getSuppressed().length > 0)
-                        logger.warn("Interruption of compaction encountered exceptions:", t);
-                    else
-                        logger.trace("Full interruption stack trace:", t);
-                }
-                else
-                {
-                    DebuggableThreadPoolExecutor.handleOrLog(t);
-                }
-            }
-
-            // Snapshots cannot be deleted on Windows while segments of the root element are mapped in NTFS. Compactions
-            // unmap those segments which could free up a snapshot for successful deletion.
-            SnapshotDeletingTask.rescheduleFailedTasks();
+            super(executorFactory
+                    .withJmxInternal()
+                    .configurePooled(name, threads)
+                    .withThreadGroup(compactionThreadGroup)
+                    .withQueueLimit(queueSize).build());
         }
 
-        public ListenableFuture<?> submitIfRunning(Runnable task, String name)
+        public Future<Void> submitIfRunning(Runnable task, String name)
         {
-            return submitIfRunning(Executors.callable(task, null), name);
+            return submitIfRunning(callable(name, task), name);
         }
 
         /**
@@ -1937,19 +1978,11 @@
          * @return the future that will deliver the task result, or a future that has already been
          *         cancelled if the task could not be submitted.
          */
-        public <T> ListenableFuture<T> submitIfRunning(Callable<T> task, String name)
+        public <T> Future<T> submitIfRunning(Callable<T> task, String name)
         {
-            if (isShutdown())
-            {
-                logger.info("Executor has been shut down, not submitting {}", name);
-                return Futures.immediateCancelledFuture();
-            }
-
             try
             {
-                ListenableFutureTask<T> ret = ListenableFutureTask.create(task);
-                execute(ret);
-                return ret;
+                return submit(task);
             }
             catch (RejectedExecutionException ex)
             {
@@ -1958,15 +1991,35 @@
                 else
                     logger.error("Failed to submit {}", name, ex);
 
-                return Futures.immediateCancelledFuture();
+                return ImmediateFuture.cancelled();
             }
         }
+
+        public void execute(Runnable command)
+        {
+            executor.execute(command);
+        }
+
+        public <T> Future<T> submit(Callable<T> task)
+        {
+            return executor.submit(task);
+        }
+
+        public <T> Future<T> submit(Runnable task, T result)
+        {
+            return submit(callable(task, result));
+        }
+
+        public Future<?> submit(Runnable task)
+        {
+            return submit(task, null);
+        }
     }
 
     // TODO: pull out relevant parts of CompactionExecutor and move to ValidationManager
     public static class ValidationExecutor extends CompactionExecutor
     {
-        // CompactionExecutor, and by extension ValidationExecutor, use DebuggableThreadPoolExecutor's
+        // CompactionExecutor, and by extension ValidationExecutor, use ExecutorPlus's
         // default RejectedExecutionHandler which blocks the submitting thread when the work queue is
         // full. The calling thread in this case is AntiEntropyStage, so in most cases we don't actually
         // want to block when the ValidationExecutor is saturated as this prevents progress on all
@@ -1981,11 +2034,8 @@
         public ValidationExecutor()
         {
             super(DatabaseDescriptor.getConcurrentValidations(),
-                  DatabaseDescriptor.getConcurrentValidations(),
                   "ValidationExecutor",
-                  new LinkedBlockingQueue());
-
-            allowCoreThreadTimeOut(true);
+                  Integer.MAX_VALUE);
         }
 
         public void adjustPoolSize()
@@ -1999,7 +2049,7 @@
     {
         public ViewBuildExecutor()
         {
-            super(DatabaseDescriptor.getConcurrentViewBuilders(), "ViewBuildExecutor");
+            super(DatabaseDescriptor.getConcurrentViewBuilders(), "ViewBuildExecutor", Integer.MAX_VALUE);
         }
     }
 
@@ -2007,7 +2057,7 @@
     {
         public CacheCleanupExecutor()
         {
-            super(1, "CacheCleanupExecutor");
+            super(1, "CacheCleanupExecutor", Integer.MAX_VALUE);
         }
     }
 
@@ -2091,8 +2141,8 @@
     {
         for (Holder holder : active.getCompactions())
         {
-            UUID holderId = holder.getCompactionInfo().getTaskId();
-            if (holderId != null && holderId.equals(UUID.fromString(compactionId)))
+            TimeUUID holderId = holder.getCompactionInfo().getTaskId();
+            if (holderId != null && holderId.equals(TimeUUID.fromString(compactionId)))
                 holder.stop();
         }
     }
@@ -2273,10 +2323,10 @@
 
     public void waitForCessation(Iterable<ColumnFamilyStore> cfss, Predicate<SSTableReader> sstablePredicate)
     {
-        long start = System.nanoTime();
+        long start = nanoTime();
         long delay = TimeUnit.MINUTES.toNanos(1);
 
-        while (System.nanoTime() - start < delay)
+        while (nanoTime() - start < delay)
         {
             if (CompactionManager.instance.isCompacting(cfss, sstablePredicate))
                 Uninterruptibles.sleepUninterruptibly(1, TimeUnit.MILLISECONDS);
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionStrategyHolder.java b/src/java/org/apache/cassandra/db/compaction/CompactionStrategyHolder.java
index 129ee79..cab0af0 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionStrategyHolder.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionStrategyHolder.java
@@ -21,7 +21,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.UUID;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
@@ -29,7 +28,6 @@
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
-import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.index.Index;
@@ -40,6 +38,7 @@
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class CompactionStrategyHolder extends AbstractStrategyHolder
 {
@@ -219,7 +218,7 @@
     public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor,
                                                        long keyCount,
                                                        long repairedAt,
-                                                       UUID pendingRepair,
+                                                       TimeUUID pendingRepair,
                                                        boolean isTransient,
                                                        MetadataCollector collector,
                                                        SerializationHeader header,
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionStrategyManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionStrategyManager.java
index 99e2ce9..5e1d561 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionStrategyManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionStrategyManager.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.db.compaction;
 
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -29,7 +28,6 @@
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -39,6 +37,7 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.primitives.Longs;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,6 +73,7 @@
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.db.compaction.AbstractStrategyHolder.GroupedSSTableContainer;
 
@@ -421,7 +421,7 @@
         return transientRepairs;
     }
 
-    public boolean hasDataForPendingRepair(UUID sessionID)
+    public boolean hasDataForPendingRepair(TimeUUID sessionID)
     {
         readLock.lock();
         try
@@ -587,6 +587,29 @@
         return null;
     }
 
+    public long[] getPerLevelSizeBytes()
+    {
+        readLock.lock();
+        try
+        {
+            if (repaired.first() instanceof LeveledCompactionStrategy)
+            {
+                long [] res = new long[LeveledGenerations.MAX_LEVEL_COUNT];
+                for (AbstractCompactionStrategy strategy : getAllStrategies())
+                {
+                    long[] repairedCountPerLevel = ((LeveledCompactionStrategy) strategy).getAllLevelSizeBytes();
+                    res = sumArrays(res, repairedCountPerLevel);
+                }
+                return res;
+            }
+            return null;
+        }
+        finally
+        {
+            readLock.unlock();
+        }
+    }
+
     static int[] sumArrays(int[] a, int[] b)
     {
         int[] res = new int[Math.max(a.length, b.length)];
@@ -602,6 +625,21 @@
         return res;
     }
 
+    static long[] sumArrays(long[] a, long[] b)
+    {
+        long[] res = new long[Math.max(a.length, b.length)];
+        for (int i = 0; i < res.length; i++)
+        {
+            if (i < a.length && i < b.length)
+                res[i] = a[i] + b[i];
+            else if (i < a.length)
+                res[i] = a[i];
+            else
+                res[i] = b[i];
+        }
+        return res;
+    }
+
     /**
      * Should only be called holding the readLock
      */
@@ -633,7 +671,7 @@
         throw new IllegalStateException("No holder claimed " + sstable);
     }
 
-    private AbstractStrategyHolder getHolder(long repairedAt, UUID pendingRepair, boolean isTransient)
+    private AbstractStrategyHolder getHolder(long repairedAt, TimeUUID pendingRepair, boolean isTransient)
     {
         return getHolder(repairedAt != ActiveRepairService.UNREPAIRED_SSTABLE,
                          pendingRepair != ActiveRepairService.NO_PENDING_REPAIR,
@@ -902,7 +940,7 @@
             boolean repaired = firstSSTable.isRepaired();
             int firstIndex = compactionStrategyIndexFor(firstSSTable);
             boolean isPending = firstSSTable.isPendingRepair();
-            UUID pendingRepair = firstSSTable.getSSTableMetadata().pendingRepair;
+            TimeUUID pendingRepair = firstSSTable.getSSTableMetadata().pendingRepair;
             for (SSTableReader sstable : input)
             {
                 if (sstable.isRepaired() != repaired)
@@ -1060,7 +1098,7 @@
     public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor,
                                                        long keyCount,
                                                        long repairedAt,
-                                                       UUID pendingRepair,
+                                                       TimeUUID pendingRepair,
                                                        boolean isTransient,
                                                        MetadataCollector collector,
                                                        SerializationHeader header,
@@ -1105,13 +1143,13 @@
                 {
                     int idx = holder.getStrategyIndex(strategy);
                     if (idx >= 0)
-                        return Collections.singletonList(locations[idx].location.getAbsolutePath());
+                        return Collections.singletonList(locations[idx].location.absolutePath());
                 }
             }
             List<String> folders = new ArrayList<>(locations.length);
             for (Directories.DataDirectory location : locations)
             {
-                folders.add(location.location.getAbsolutePath());
+                folders.add(location.location.absolutePath());
             }
             return folders;
         }
@@ -1145,7 +1183,7 @@
      * Mutates sstable repairedAt times and notifies listeners of the change with the writeLock held. Prevents races
      * with other processes between when the metadata is changed and when sstables are moved between strategies.
       */
-    public void mutateRepaired(Collection<SSTableReader> sstables, long repairedAt, UUID pendingRepair, boolean isTransient) throws IOException
+    public void mutateRepaired(Collection<SSTableReader> sstables, long repairedAt, TimeUUID pendingRepair, boolean isTransient) throws IOException
     {
         Set<SSTableReader> changed = new HashSet<>();
 
@@ -1174,7 +1212,7 @@
         }
     }
 
-    private static void verifyMetadata(SSTableReader sstable, long repairedAt, UUID pendingRepair, boolean isTransient)
+    private static void verifyMetadata(SSTableReader sstable, long repairedAt, TimeUUID pendingRepair, boolean isTransient)
     {
         if (!Objects.equals(pendingRepair, sstable.getPendingRepair()))
             throw new IllegalStateException(String.format("Failed setting pending repair to %s on %s (pending repair is %s)", pendingRepair, sstable, sstable.getPendingRepair()));
@@ -1184,7 +1222,7 @@
             throw new IllegalStateException(String.format("Failed setting isTransient to %b on %s (isTransient is %b)", isTransient, sstable, sstable.isTransient()));
     }
 
-    public CleanupSummary releaseRepairData(Collection<UUID> sessions)
+    public CleanupSummary releaseRepairData(Collection<TimeUUID> sessions)
     {
         List<CleanupTask> cleanupTasks = new ArrayList<>();
         readLock.lock();
diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
index 90abac3..5fc8031 100644
--- a/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
+++ b/src/java/org/apache/cassandra/db/compaction/CompactionTask.java
@@ -17,12 +17,12 @@
  */
 package org.apache.cassandra.db.compaction;
 
+import java.time.Instant;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.base.Predicate;
@@ -44,8 +44,13 @@
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Refs;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.FBUtilities.now;
+
 public class CompactionTask extends AbstractCompactionTask
 {
     protected static final Logger logger = LoggerFactory.getLogger(CompactionTask.class);
@@ -84,7 +89,7 @@
         {
             // Try again w/o the largest one.
             SSTableReader removedSSTable = cfs.getMaxSizeFile(nonExpiredSSTables);
-            logger.warn("insufficient space to compact all requested files. {}MB required, {} for compaction {} - removing largest SSTable: {}",
+            logger.warn("insufficient space to compact all requested files. {}MiB required, {} for compaction {} - removing largest SSTable: {}",
                         (float) expectedSize / 1024 / 1024,
                         StringUtils.join(transaction.originals(), ", "),
                         transaction.opId(),
@@ -116,7 +121,10 @@
         CompactionStrategyManager strategy = cfs.getCompactionStrategyManager();
 
         if (DatabaseDescriptor.isSnapshotBeforeCompaction())
-            cfs.snapshotWithoutFlush(System.currentTimeMillis() + "-compact-" + cfs.name);
+        {
+            Instant creationTime = now();
+            cfs.snapshotWithoutMemtable(creationTime.toEpochMilli() + "-compact-" + cfs.name, creationTime);
+        }
 
         try (CompactionController controller = getCompactionController(transaction.originals()))
         {
@@ -141,7 +149,7 @@
                 }
             });
 
-            UUID taskId = transaction.opId();
+            TimeUUID taskId = transaction.opId();
 
             // new sstables from flush can be added during a compaction, but only the compaction can remove them,
             // so in our single-threaded compaction world this is a valid way of determining if we're compacting
@@ -156,11 +164,12 @@
             logger.info("Compacting ({}) {}", taskId, ssTableLoggerMsg);
 
             RateLimiter limiter = CompactionManager.instance.getRateLimiter();
-            long start = System.nanoTime();
-            long startTime = System.currentTimeMillis();
+            long start = nanoTime();
+            long startTime = currentTimeMillis();
             long totalKeysWritten = 0;
             long estimatedKeys = 0;
             long inputSizeBytes;
+            long timeSpentWritingKeys;
 
             Set<SSTableReader> actuallyCompact = Sets.difference(transaction.originals(), fullyExpiredSSTables);
             Collection<SSTableReader> newSStables;
@@ -168,9 +177,6 @@
             long[] mergedRowCounts;
             long totalSourceCQLRows;
 
-            // SSTableScanners need to be closed before markCompactedSSTablesReplaced call as scanners contain references
-            // to both ifile and dfile and SSTR will throw deletion errors on Windows if it tries to delete before scanner is closed.
-            // See CASSANDRA-8019 and CASSANDRA-8399
             int nowInSec = FBUtilities.nowInSeconds();
             try (Refs<SSTableReader> refs = Refs.ref(actuallyCompact);
                  AbstractCompactionStrategy.ScannerList scanners = strategy.getScanners(actuallyCompact);
@@ -199,20 +205,20 @@
                         if (writer.append(ci.next()))
                             totalKeysWritten++;
 
-
                         long bytesScanned = scanners.getTotalBytesScanned();
 
-                        //Rate limit the scanners, and account for compression
+                        // Rate limit the scanners, and account for compression
                         CompactionManager.compactionRateLimiterAcquire(limiter, bytesScanned, lastBytesScanned, compressionRatio);
 
                         lastBytesScanned = bytesScanned;
 
-                        if (System.nanoTime() - lastCheckObsoletion > TimeUnit.MINUTES.toNanos(1L))
+                        if (nanoTime() - lastCheckObsoletion > TimeUnit.MINUTES.toNanos(1L))
                         {
                             controller.maybeRefreshOverlaps();
-                            lastCheckObsoletion = System.nanoTime();
+                            lastCheckObsoletion = nanoTime();
                         }
                     }
+                    timeSpentWritingKeys = TimeUnit.NANOSECONDS.toMillis(nanoTime() - start);
 
                     // point of no return
                     newSStables = writer.finish();
@@ -229,7 +235,7 @@
                 return;
 
             // log a bunch of statistics about the result and save to system table compaction_history
-            long durationInNano = System.nanoTime() - start;
+            long durationInNano = nanoTime() - start;
             long dTime = TimeUnit.NANOSECONDS.toMillis(durationInNano);
             long startsize = inputSizeBytes;
             long endsize = SSTableReader.getTotalBytes(newSStables);
@@ -244,7 +250,7 @@
 
             String mergeSummary = updateCompactionHistory(cfs.keyspace.getName(), cfs.getTableName(), mergedRowCounts, startsize, endsize);
 
-            logger.info(String.format("Compacted (%s) %d sstables to [%s] to level=%d.  %s to %s (~%d%% of original) in %,dms.  Read Throughput = %s, Write Throughput = %s, Row Throughput = ~%,d/s.  %,d total partitions merged to %,d.  Partition merge counts were {%s}",
+            logger.info(String.format("Compacted (%s) %d sstables to [%s] to level=%d.  %s to %s (~%d%% of original) in %,dms.  Read Throughput = %s, Write Throughput = %s, Row Throughput = ~%,d/s.  %,d total partitions merged to %,d.  Partition merge counts were {%s}. Time spent writing keys = %,dms",
                                        taskId,
                                        transaction.originals().size(),
                                        newSSTableNames.toString(),
@@ -258,13 +264,14 @@
                                        (int) totalSourceCQLRows / (TimeUnit.NANOSECONDS.toSeconds(durationInNano) + 1),
                                        totalSourceRows,
                                        totalKeysWritten,
-                                       mergeSummary));
+                                       mergeSummary,
+                                       timeSpentWritingKeys));
             if (logger.isTraceEnabled())
             {
                 logger.trace("CF Total Bytes Compacted: {}", FBUtilities.prettyPrintMemory(CompactionTask.addToTotalBytesCompacted(endsize)));
                 logger.trace("Actual #keys: {}, Estimated #keys:{}, Err%: {}", totalKeysWritten, estimatedKeys, ((double)(totalKeysWritten - estimatedKeys)/totalKeysWritten));
             }
-            cfs.getCompactionStrategyManager().compactionLogger.compaction(startTime, transaction.originals(), System.currentTimeMillis(), newSStables);
+            cfs.getCompactionStrategyManager().compactionLogger.compaction(startTime, transaction.originals(), currentTimeMillis(), newSStables);
 
             // update the metrics
             cfs.metric.compactionBytesWritten.inc(endsize);
@@ -294,7 +301,7 @@
             mergeSummary.append(String.format("%d:%d, ", rows, count));
             mergedRows.put(rows, count);
         }
-        SystemKeyspace.updateCompactionHistory(keyspaceName, columnFamilyName, System.currentTimeMillis(), startSize, endSize, mergedRows);
+        SystemKeyspace.updateCompactionHistory(keyspaceName, columnFamilyName, currentTimeMillis(), startSize, endSize, mergedRows);
         return mergeSummary.toString();
     }
 
@@ -313,13 +320,13 @@
         return minRepairedAt;
     }
 
-    public static UUID getPendingRepair(Set<SSTableReader> sstables)
+    public static TimeUUID getPendingRepair(Set<SSTableReader> sstables)
     {
         if (sstables.isEmpty())
         {
             return ActiveRepairService.NO_PENDING_REPAIR;
         }
-        Set<UUID> ids = new HashSet<>();
+        Set<TimeUUID> ids = new HashSet<>();
         for (SSTableReader sstable: sstables)
             ids.add(sstable.getSSTableMetadata().pendingRepair);
 
@@ -395,7 +402,7 @@
             }
 
             sstablesRemoved++;
-            logger.warn("Not enough space for compaction, {}MB estimated.  Reducing scope.",
+            logger.warn("Not enough space for compaction, {}MiB estimated.  Reducing scope.",
                         (float) expectedWriteSize / 1024 / 1024);
         }
 
diff --git a/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java
index a94bcfa..1e18bf9 100644
--- a/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/DateTieredCompactionStrategy.java
@@ -38,6 +38,7 @@
 import org.apache.cassandra.utils.Pair;
 
 import static com.google.common.collect.Iterables.filter;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * @deprecated in favour of {@link TimeWindowCompactionStrategy}
@@ -116,11 +117,11 @@
 
         Set<SSTableReader> expired = Collections.emptySet();
         // we only check for expired sstables every 10 minutes (by default) due to it being an expensive operation
-        if (System.currentTimeMillis() - lastExpiredCheck > options.expiredSSTableCheckFrequency)
+        if (currentTimeMillis() - lastExpiredCheck > options.expiredSSTableCheckFrequency)
         {
             // Find fully expired SSTables. Those will be included no matter what.
             expired = CompactionController.getFullyExpiredSSTables(cfs, uncompacting, cfs.getOverlappingLiveSSTables(uncompacting), gcBefore);
-            lastExpiredCheck = System.currentTimeMillis();
+            lastExpiredCheck = currentTimeMillis();
         }
         Set<SSTableReader> candidates = Sets.newHashSet(filterSuspectSSTables(uncompacting));
 
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
index dd7c9df..54953e4 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledCompactionStrategy.java
@@ -54,7 +54,7 @@
 
     @VisibleForTesting
     final LeveledManifest manifest;
-    private final int maxSSTableSizeInMB;
+    private final int maxSSTableSizeInMiB;
     private final int levelFanoutSize;
     private final boolean singleSSTableUplevel;
 
@@ -91,11 +91,11 @@
                 configuredSingleSSTableUplevel = Boolean.parseBoolean(options.get(SINGLE_SSTABLE_UPLEVEL_OPTION));
             }
         }
-        maxSSTableSizeInMB = configuredMaxSSTableSize;
+        maxSSTableSizeInMiB = configuredMaxSSTableSize;
         levelFanoutSize = configuredLevelFanoutSize;
         singleSSTableUplevel = configuredSingleSSTableUplevel;
 
-        manifest = new LeveledManifest(cfs, this.maxSSTableSizeInMB, this.levelFanoutSize, localOptions);
+        manifest = new LeveledManifest(cfs, this.maxSSTableSizeInMiB, this.levelFanoutSize, localOptions);
         logger.trace("Created {}", manifest);
     }
 
@@ -109,6 +109,11 @@
         return manifest.getAllLevelSize();
     }
 
+    public long[] getAllLevelSizeBytes()
+    {
+        return manifest.getAllLevelSizeBytes();
+    }
+
     @Override
     public void startup()
     {
@@ -277,7 +282,7 @@
 
     public long getMaxSSTableBytes()
     {
-        return maxSSTableSizeInMB * 1024L * 1024L;
+        return maxSSTableSizeInMiB * 1024L * 1024L;
     }
 
     public int getLevelFanoutSize()
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java b/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java
index 64027f2..36b5600 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledGenerations.java
@@ -33,15 +33,17 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.PeekingIterator;
-import com.google.common.primitives.Ints;
 
 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.utils.Clock.Global.nanoTime;
+
 /**
  * Handles the leveled manifest generations
  *
@@ -68,14 +70,14 @@
      */
     private final Map<SSTableReader, SSTableReader> allSSTables = new HashMap<>();
     private final Set<SSTableReader> l0 = new HashSet<>();
-    private static long lastOverlapCheck = System.nanoTime();
+    private static long lastOverlapCheck = nanoTime();
     // note that since l0 is broken out, levels[0] represents L1:
     private final TreeSet<SSTableReader> [] levels = new TreeSet[MAX_LEVEL_COUNT - 1];
 
     private static final Comparator<SSTableReader> nonL0Comparator = (o1, o2) -> {
         int cmp = SSTableReader.sstableComparator.compare(o1, o2);
         if (cmp == 0)
-            cmp = Ints.compare(o1.descriptor.generation, o2.descriptor.generation);
+            cmp = SSTableIdFactory.COMPARATOR.compare(o1.descriptor.id, o2.descriptor.id);
         return cmp;
     };
 
@@ -226,6 +228,14 @@
         return counts;
     }
 
+    long[] getAllLevelSizeBytes()
+    {
+        long[] sums = new long[levelCount()];
+        for (int i = 0; i < sums.length; i++)
+            sums[i] = get(i).stream().map(SSTableReader::onDiskLength).reduce(0L, Long::sum);
+        return sums;
+    }
+
     Set<SSTableReader> allSSTables()
     {
         ImmutableSet.Builder<SSTableReader> builder = ImmutableSet.builder();
@@ -302,10 +312,10 @@
      */
     private void maybeVerifyLevels()
     {
-        if (!strictLCSChecksTest || System.nanoTime() - lastOverlapCheck <= TimeUnit.NANOSECONDS.convert(5, TimeUnit.SECONDS))
+        if (!strictLCSChecksTest || nanoTime() - lastOverlapCheck <= TimeUnit.NANOSECONDS.convert(5, TimeUnit.SECONDS))
             return;
         logger.info("LCS verifying levels");
-        lastOverlapCheck = System.nanoTime();
+        lastOverlapCheck = nanoTime();
         for (int i = 1; i < levelCount(); i++)
         {
             SSTableReader prev = null;
diff --git a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
index 7c865c7..2972d7d 100644
--- a/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
+++ b/src/java/org/apache/cassandra/db/compaction/LeveledManifest.java
@@ -161,7 +161,7 @@
         {
             builder.append(sstable.descriptor.cfname)
                    .append('-')
-                   .append(sstable.descriptor.generation)
+                   .append(sstable.descriptor.id)
                    .append("(L")
                    .append(sstable.getSSTableLevel())
                    .append("), ");
@@ -395,6 +395,11 @@
         return generations.getAllLevelSize();
     }
 
+    public synchronized long[] getAllLevelSizeBytes()
+    {
+        return generations.getAllLevelSizeBytes();
+    }
+
     @VisibleForTesting
     public synchronized int remove(SSTableReader reader)
     {
diff --git a/src/java/org/apache/cassandra/db/compaction/PendingRepairHolder.java b/src/java/org/apache/cassandra/db/compaction/PendingRepairHolder.java
index 03d4111..314df9e 100644
--- a/src/java/org/apache/cassandra/db/compaction/PendingRepairHolder.java
+++ b/src/java/org/apache/cassandra/db/compaction/PendingRepairHolder.java
@@ -22,7 +22,6 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.UUID;
 
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
@@ -30,7 +29,6 @@
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
-import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.index.Index;
@@ -41,6 +39,7 @@
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class PendingRepairHolder extends AbstractStrategyHolder
 {
@@ -94,7 +93,7 @@
         return Iterables.concat(Iterables.transform(managers, PendingRepairManager::getStrategies));
     }
 
-    Iterable<AbstractCompactionStrategy> getStrategiesFor(UUID session)
+    Iterable<AbstractCompactionStrategy> getStrategiesFor(TimeUUID session)
     {
         List<AbstractCompactionStrategy> strategies = new ArrayList<>(managers.size());
         for (PendingRepairManager manager : managers)
@@ -237,7 +236,7 @@
     public SSTableMultiWriter createSSTableMultiWriter(Descriptor descriptor,
                                                        long keyCount,
                                                        long repairedAt,
-                                                       UUID pendingRepair,
+                                                       TimeUUID pendingRepair,
                                                        boolean isTransient,
                                                        MetadataCollector collector,
                                                        SerializationHeader header,
@@ -272,7 +271,7 @@
         return -1;
     }
 
-    public boolean hasDataForSession(UUID sessionID)
+    public boolean hasDataForSession(TimeUUID sessionID)
     {
         return Iterables.any(managers, prm -> prm.hasDataForSession(sessionID));
     }
diff --git a/src/java/org/apache/cassandra/db/compaction/PendingRepairManager.java b/src/java/org/apache/cassandra/db/compaction/PendingRepairManager.java
index aefa40b..11d6fe8 100644
--- a/src/java/org/apache/cassandra/db/compaction/PendingRepairManager.java
+++ b/src/java/org/apache/cassandra/db/compaction/PendingRepairManager.java
@@ -26,7 +26,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -50,6 +49,7 @@
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Companion to CompactionStrategyManager which manages the sstables marked pending repair.
@@ -66,7 +66,7 @@
     private final ColumnFamilyStore cfs;
     private final CompactionParams params;
     private final boolean isTransient;
-    private volatile ImmutableMap<UUID, AbstractCompactionStrategy> strategies = ImmutableMap.of();
+    private volatile ImmutableMap<TimeUUID, AbstractCompactionStrategy> strategies = ImmutableMap.of();
 
     /**
      * Indicates we're being asked to do something with an sstable that isn't marked pending repair
@@ -86,12 +86,12 @@
         this.isTransient = isTransient;
     }
 
-    private ImmutableMap.Builder<UUID, AbstractCompactionStrategy> mapBuilder()
+    private ImmutableMap.Builder<TimeUUID, AbstractCompactionStrategy> mapBuilder()
     {
         return ImmutableMap.builder();
     }
 
-    AbstractCompactionStrategy get(UUID id)
+    AbstractCompactionStrategy get(TimeUUID id)
     {
         return strategies.get(id);
     }
@@ -102,7 +102,7 @@
         return get(sstable.getSSTableMetadata().pendingRepair);
     }
 
-    AbstractCompactionStrategy getOrCreate(UUID id)
+    AbstractCompactionStrategy getOrCreate(TimeUUID id)
     {
         checkPendingID(id);
         assert id != null;
@@ -124,7 +124,7 @@
         return strategy;
     }
 
-    private static void checkPendingID(UUID pendingID)
+    private static void checkPendingID(TimeUUID pendingID)
     {
         if (pendingID == null)
         {
@@ -137,7 +137,7 @@
         return getOrCreate(sstable.getSSTableMetadata().pendingRepair);
     }
 
-    private synchronized void removeSessionIfEmpty(UUID sessionID)
+    private synchronized void removeSessionIfEmpty(TimeUUID sessionID)
     {
         if (!strategies.containsKey(sessionID) || !strategies.get(sessionID).getSSTables().isEmpty())
             return;
@@ -148,7 +148,7 @@
 
     synchronized void removeSSTable(SSTableReader sstable)
     {
-        for (Map.Entry<UUID, AbstractCompactionStrategy> entry : strategies.entrySet())
+        for (Map.Entry<TimeUUID, AbstractCompactionStrategy> entry : strategies.entrySet())
         {
             entry.getValue().removeSSTable(sstable);
             removeSessionIfEmpty(entry.getKey());
@@ -180,10 +180,10 @@
             return;
 
         // left=removed, right=added
-        Map<UUID, Pair<Set<SSTableReader>, Set<SSTableReader>>> groups = new HashMap<>();
+        Map<TimeUUID, Pair<Set<SSTableReader>, Set<SSTableReader>>> groups = new HashMap<>();
         for (SSTableReader sstable : removed)
         {
-            UUID sessionID = sstable.getSSTableMetadata().pendingRepair;
+            TimeUUID sessionID = sstable.getSSTableMetadata().pendingRepair;
             if (!groups.containsKey(sessionID))
             {
                 groups.put(sessionID, Pair.create(new HashSet<>(), new HashSet<>()));
@@ -193,7 +193,7 @@
 
         for (SSTableReader sstable : added)
         {
-            UUID sessionID = sstable.getSSTableMetadata().pendingRepair;
+            TimeUUID sessionID = sstable.getSSTableMetadata().pendingRepair;
             if (!groups.containsKey(sessionID))
             {
                 groups.put(sessionID, Pair.create(new HashSet<>(), new HashSet<>()));
@@ -201,7 +201,7 @@
             groups.get(sessionID).right.add(sstable);
         }
 
-        for (Map.Entry<UUID, Pair<Set<SSTableReader>, Set<SSTableReader>>> entry : groups.entrySet())
+        for (Map.Entry<TimeUUID, Pair<Set<SSTableReader>, Set<SSTableReader>>> entry : groups.entrySet())
         {
             AbstractCompactionStrategy strategy = getOrCreate(entry.getKey());
             Set<SSTableReader> groupRemoved = entry.getValue().left;
@@ -226,7 +226,7 @@
         strategies.values().forEach(AbstractCompactionStrategy::shutdown);
     }
 
-    private int getEstimatedRemainingTasks(UUID sessionID, AbstractCompactionStrategy strategy)
+    private int getEstimatedRemainingTasks(TimeUUID sessionID, AbstractCompactionStrategy strategy)
     {
         if (canCleanup(sessionID))
         {
@@ -241,7 +241,7 @@
     int getEstimatedRemainingTasks()
     {
         int tasks = 0;
-        for (Map.Entry<UUID, AbstractCompactionStrategy> entry : strategies.entrySet())
+        for (Map.Entry<TimeUUID, AbstractCompactionStrategy> entry : strategies.entrySet())
         {
             tasks += getEstimatedRemainingTasks(entry.getKey(), entry.getValue());
         }
@@ -254,7 +254,7 @@
     int getMaxEstimatedRemainingTasks()
     {
         int tasks = 0;
-        for (Map.Entry<UUID, AbstractCompactionStrategy> entry : strategies.entrySet())
+        for (Map.Entry<TimeUUID, AbstractCompactionStrategy> entry : strategies.entrySet())
         {
             tasks = Math.max(tasks, getEstimatedRemainingTasks(entry.getKey(), entry.getValue()));
         }
@@ -262,7 +262,7 @@
     }
 
     @SuppressWarnings("resource")
-    private RepairFinishedCompactionTask getRepairFinishedCompactionTask(UUID sessionID)
+    private RepairFinishedCompactionTask getRepairFinishedCompactionTask(TimeUUID sessionID)
     {
         Preconditions.checkState(canCleanup(sessionID));
         AbstractCompactionStrategy compactionStrategy = get(sessionID);
@@ -277,9 +277,9 @@
     public static class CleanupTask
     {
         private final ColumnFamilyStore cfs;
-        private final List<Pair<UUID, RepairFinishedCompactionTask>> tasks;
+        private final List<Pair<TimeUUID, RepairFinishedCompactionTask>> tasks;
 
-        public CleanupTask(ColumnFamilyStore cfs, List<Pair<UUID, RepairFinishedCompactionTask>> tasks)
+        public CleanupTask(ColumnFamilyStore cfs, List<Pair<TimeUUID, RepairFinishedCompactionTask>> tasks)
         {
             this.cfs = cfs;
             this.tasks = tasks;
@@ -287,11 +287,11 @@
 
         public CleanupSummary cleanup()
         {
-            Set<UUID> successful = new HashSet<>();
-            Set<UUID> unsuccessful = new HashSet<>();
-            for (Pair<UUID, RepairFinishedCompactionTask> pair : tasks)
+            Set<TimeUUID> successful = new HashSet<>();
+            Set<TimeUUID> unsuccessful = new HashSet<>();
+            for (Pair<TimeUUID, RepairFinishedCompactionTask> pair : tasks)
             {
-                UUID session = pair.left;
+                TimeUUID session = pair.left;
                 RepairFinishedCompactionTask task = pair.right;
 
                 if (task != null)
@@ -318,16 +318,16 @@
 
         public Throwable abort(Throwable accumulate)
         {
-            for (Pair<UUID, RepairFinishedCompactionTask> pair : tasks)
+            for (Pair<TimeUUID, RepairFinishedCompactionTask> pair : tasks)
                 accumulate = pair.right.transaction.abort(accumulate);
             return accumulate;
         }
     }
 
-    public CleanupTask releaseSessionData(Collection<UUID> sessionIDs)
+    public CleanupTask releaseSessionData(Collection<TimeUUID> sessionIDs)
     {
-        List<Pair<UUID, RepairFinishedCompactionTask>> tasks = new ArrayList<>(sessionIDs.size());
-        for (UUID session : sessionIDs)
+        List<Pair<TimeUUID, RepairFinishedCompactionTask>> tasks = new ArrayList<>(sessionIDs.size());
+        for (TimeUUID session : sessionIDs)
         {
             if (hasDataForSession(session))
             {
@@ -340,7 +340,7 @@
     synchronized int getNumPendingRepairFinishedTasks()
     {
         int count = 0;
-        for (UUID sessionID : strategies.keySet())
+        for (TimeUUID sessionID : strategies.keySet())
         {
             if (canCleanup(sessionID))
             {
@@ -352,7 +352,7 @@
 
     synchronized AbstractCompactionTask getNextRepairFinishedTask()
     {
-        for (UUID sessionID : strategies.keySet())
+        for (TimeUUID sessionID : strategies.keySet())
         {
             if (canCleanup(sessionID))
             {
@@ -367,9 +367,9 @@
         if (strategies.isEmpty())
             return null;
 
-        Map<UUID, Integer> numTasks = new HashMap<>(strategies.size());
-        ArrayList<UUID> sessions = new ArrayList<>(strategies.size());
-        for (Map.Entry<UUID, AbstractCompactionStrategy> entry : strategies.entrySet())
+        Map<TimeUUID, Integer> numTasks = new HashMap<>(strategies.size());
+        ArrayList<TimeUUID> sessions = new ArrayList<>(strategies.size());
+        for (Map.Entry<TimeUUID, AbstractCompactionStrategy> entry : strategies.entrySet())
         {
             if (canCleanup(entry.getKey()))
             {
@@ -385,7 +385,7 @@
         // we want the session with the most compactions at the head of the list
         sessions.sort((o1, o2) -> numTasks.get(o2) - numTasks.get(o1));
 
-        UUID sessionID = sessions.get(0);
+        TimeUUID sessionID = sessions.get(0);
         return get(sessionID).getNextBackgroundTask(gcBefore);
     }
 
@@ -395,7 +395,7 @@
             return null;
 
         List<AbstractCompactionTask> maximalTasks = new ArrayList<>(strategies.size());
-        for (Map.Entry<UUID, AbstractCompactionStrategy> entry : strategies.entrySet())
+        for (Map.Entry<TimeUUID, AbstractCompactionStrategy> entry : strategies.entrySet())
         {
             if (canCleanup(entry.getKey()))
             {
@@ -416,12 +416,12 @@
         return strategies.values();
     }
 
-    Set<UUID> getSessions()
+    Set<TimeUUID> getSessions()
     {
         return strategies.keySet();
     }
 
-    boolean canCleanup(UUID sessionID)
+    boolean canCleanup(TimeUUID sessionID)
     {
         return !ActiveRepairService.instance.consistent.local.isSessionInProgress(sessionID);
     }
@@ -434,10 +434,10 @@
             return Collections.emptySet();
         }
 
-        Map<UUID, Set<SSTableReader>> sessionSSTables = new HashMap<>();
+        Map<TimeUUID, Set<SSTableReader>> sessionSSTables = new HashMap<>();
         for (SSTableReader sstable : sstables)
         {
-            UUID sessionID = sstable.getSSTableMetadata().pendingRepair;
+            TimeUUID sessionID = sstable.getSSTableMetadata().pendingRepair;
             checkPendingID(sessionID);
             sessionSSTables.computeIfAbsent(sessionID, k -> new HashSet<>()).add(sstable);
         }
@@ -445,7 +445,7 @@
         Set<ISSTableScanner> scanners = new HashSet<>(sessionSSTables.size());
         try
         {
-            for (Map.Entry<UUID, Set<SSTableReader>> entry : sessionSSTables.entrySet())
+            for (Map.Entry<TimeUUID, Set<SSTableReader>> entry : sessionSSTables.entrySet())
             {
                 scanners.addAll(getOrCreate(entry.getKey()).getScanners(entry.getValue(), ranges).scanners);
             }
@@ -462,7 +462,7 @@
         return strategies.values().contains(strategy);
     }
 
-    public synchronized boolean hasDataForSession(UUID sessionID)
+    public synchronized boolean hasDataForSession(TimeUUID sessionID)
     {
         return strategies.keySet().contains(sessionID);
     }
@@ -478,7 +478,7 @@
 
     public Collection<AbstractCompactionTask> createUserDefinedTasks(Collection<SSTableReader> sstables, int gcBefore)
     {
-        Map<UUID, List<SSTableReader>> group = sstables.stream().collect(Collectors.groupingBy(s -> s.getSSTableMetadata().pendingRepair));
+        Map<TimeUUID, List<SSTableReader>> group = sstables.stream().collect(Collectors.groupingBy(s -> s.getSSTableMetadata().pendingRepair));
         return group.entrySet().stream().map(g -> strategies.get(g.getKey()).getUserDefinedTask(g.getValue(), gcBefore)).collect(Collectors.toList());
     }
 
@@ -487,10 +487,10 @@
      */
     class RepairFinishedCompactionTask extends AbstractCompactionTask
     {
-        private final UUID sessionID;
+        private final TimeUUID sessionID;
         private final long repairedAt;
 
-        RepairFinishedCompactionTask(ColumnFamilyStore cfs, LifecycleTransaction transaction, UUID sessionID, long repairedAt)
+        RepairFinishedCompactionTask(ColumnFamilyStore cfs, LifecycleTransaction transaction, TimeUUID sessionID, long repairedAt)
         {
             super(cfs, transaction);
             this.sessionID = sessionID;
@@ -498,7 +498,7 @@
         }
 
         @VisibleForTesting
-        UUID getSessionID()
+        TimeUUID getSessionID()
         {
             return sessionID;
         }
diff --git a/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java b/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java
index 1746d7c..6f68c34 100644
--- a/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java
+++ b/src/java/org/apache/cassandra/db/compaction/SSTableSplitter.java
@@ -19,7 +19,6 @@
 
 import java.util.*;
 import java.util.function.LongPredicate;
-import java.util.function.Predicate;
 
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.compaction.writers.CompactionAwareWriter;
@@ -43,12 +42,12 @@
 
     public static class SplittingCompactionTask extends CompactionTask
     {
-        private final int sstableSizeInMB;
+        private final int sstableSizeInMiB;
 
         public SplittingCompactionTask(ColumnFamilyStore cfs, LifecycleTransaction transaction, int sstableSizeInMB)
         {
             super(cfs, transaction, CompactionManager.NO_GC, false);
-            this.sstableSizeInMB = sstableSizeInMB;
+            this.sstableSizeInMiB = sstableSizeInMB;
 
             if (sstableSizeInMB <= 0)
                 throw new IllegalArgumentException("Invalid target size for SSTables, must be > 0 (got: " + sstableSizeInMB + ")");
@@ -66,7 +65,7 @@
                                                               LifecycleTransaction txn,
                                                               Set<SSTableReader> nonExpiredSSTables)
         {
-            return new MaxSSTableSizeWriter(cfs, directories, txn, nonExpiredSSTables, sstableSizeInMB * 1024L * 1024L, 0, false);
+            return new MaxSSTableSizeWriter(cfs, directories, txn, nonExpiredSSTables, sstableSizeInMiB * 1024L * 1024L, 0, false);
         }
 
         @Override
diff --git a/src/java/org/apache/cassandra/db/compaction/Scrubber.java b/src/java/org/apache/cassandra/db/compaction/Scrubber.java
index 4ca2d85..56825d0 100644
--- a/src/java/org/apache/cassandra/db/compaction/Scrubber.java
+++ b/src/java/org/apache/cassandra/db/compaction/Scrubber.java
@@ -17,8 +17,10 @@
  */
 package org.apache.cassandra.db.compaction;
 
+import java.io.IOError;
+import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.io.*;
+
 import java.util.*;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -28,6 +30,7 @@
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableSet;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
@@ -44,6 +47,8 @@
 import org.apache.cassandra.utils.concurrent.Refs;
 import org.apache.cassandra.utils.memory.HeapCloner;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class Scrubber implements Closeable
 {
     private final ColumnFamilyStore cfs;
@@ -490,7 +495,7 @@
     {
         private final RandomAccessReader dataFile;
         private final SSTableReader sstable;
-        private final UUID scrubCompactionId;
+        private final TimeUUID scrubCompactionId;
         private final Lock fileReadLock;
 
         public ScrubInfo(RandomAccessReader dataFile, SSTableReader sstable, Lock fileReadLock)
@@ -498,7 +503,7 @@
             this.dataFile = dataFile;
             this.sstable = sstable;
             this.fileReadLock = fileReadLock;
-            scrubCompactionId = UUIDGen.getTimeUUID();
+            scrubCompactionId = nextTimeUUID();
         }
 
         public CompactionInfo getCompactionInfo()
diff --git a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java
index 288af2b..eb1d8f9 100644
--- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java
+++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyOptions.java
@@ -101,4 +101,4 @@
         return String.format("Min sstable size: %d, bucket low: %f, bucket high: %f", minSSTableSize, bucketLow, bucketHigh);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategy.java
index 4b499ce..555d86a 100644
--- a/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategy.java
+++ b/src/java/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategy.java
@@ -45,6 +45,7 @@
 import org.apache.cassandra.utils.Pair;
 
 import static com.google.common.collect.Iterables.filter;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class TimeWindowCompactionStrategy extends AbstractCompactionStrategy
 {
@@ -117,12 +118,12 @@
         // Find fully expired SSTables. Those will be included no matter what.
         Set<SSTableReader> expired = Collections.emptySet();
 
-        if (System.currentTimeMillis() - lastExpiredCheck > options.expiredSSTableCheckFrequency)
+        if (currentTimeMillis() - lastExpiredCheck > options.expiredSSTableCheckFrequency)
         {
             logger.debug("TWCS expired check sufficiently far in the past, checking for fully expired SSTables");
             expired = CompactionController.getFullyExpiredSSTables(cfs, uncompacting, options.ignoreOverlaps ? Collections.emptySet() : cfs.getOverlappingLiveSSTables(uncompacting),
                                                                    gcBefore, options.ignoreOverlaps);
-            lastExpiredCheck = System.currentTimeMillis();
+            lastExpiredCheck = currentTimeMillis();
         }
         else
         {
diff --git a/src/java/org/apache/cassandra/db/compaction/Upgrader.java b/src/java/org/apache/cassandra/db/compaction/Upgrader.java
index e1406aa..87bf5b8 100644
--- a/src/java/org/apache/cassandra/db/compaction/Upgrader.java
+++ b/src/java/org/apache/cassandra/db/compaction/Upgrader.java
@@ -17,10 +17,8 @@
  */
 package org.apache.cassandra.db.compaction;
 
-import java.io.File;
 import java.util.*;
 import java.util.function.LongPredicate;
-import java.util.function.Predicate;
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.Sets;
@@ -34,9 +32,11 @@
 import org.apache.cassandra.io.sstable.format.SSTableWriter;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.OutputHandler;
-import org.apache.cassandra.utils.UUIDGen;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class Upgrader
 {
@@ -58,7 +58,7 @@
         this.sstable = txn.onlyOne();
         this.outputHandler = outputHandler;
 
-        this.directory = new File(sstable.getFilename()).getParentFile();
+        this.directory = new File(sstable.getFilename()).parent();
 
         this.controller = new UpgradeController(cfs);
 
@@ -90,7 +90,7 @@
         int nowInSec = FBUtilities.nowInSeconds();
         try (SSTableRewriter writer = SSTableRewriter.construct(cfs, transaction, keepOriginals, CompactionTask.getMaxDataAge(transaction.originals()));
              AbstractCompactionStrategy.ScannerList scanners = strategyManager.getScanners(transaction.originals());
-             CompactionIterator iter = new CompactionIterator(transaction.opType(), scanners.scanners, controller, nowInSec, UUIDGen.getTimeUUID()))
+             CompactionIterator iter = new CompactionIterator(transaction.opType(), scanners.scanners, controller, nowInSec, nextTimeUUID()))
         {
             writer.switchWriter(createCompactionWriter(sstable.getSSTableMetadata()));
             while (iter.hasNext())
diff --git a/src/java/org/apache/cassandra/db/compaction/Verifier.java b/src/java/org/apache/cassandra/db/compaction/Verifier.java
index 30e74ad..29eb299 100644
--- a/src/java/org/apache/cassandra/db/compaction/Verifier.java
+++ b/src/java/org/apache/cassandra/db/compaction/Verifier.java
@@ -38,6 +38,7 @@
 import org.apache.cassandra.io.sstable.metadata.ValidationMetadata;
 import org.apache.cassandra.io.util.DataIntegrityMetadata;
 import org.apache.cassandra.io.util.DataIntegrityMetadata.FileDigestValidator;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.schema.TableMetadata;
@@ -48,18 +49,14 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.IFilter;
 import org.apache.cassandra.utils.OutputHandler;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
-import java.io.BufferedInputStream;
 import java.io.Closeable;
 import java.io.DataInputStream;
-import java.io.File;
 import java.io.IOError;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.*;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
@@ -67,6 +64,10 @@
 import java.util.function.Function;
 import java.util.function.LongPredicate;
 
+import org.apache.cassandra.io.util.File;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class Verifier implements Closeable
 {
     private final ColumnFamilyStore cfs;
@@ -444,10 +445,10 @@
 
     private void deserializeBloomFilter(SSTableReader sstable) throws IOException
     {
-        Path bfPath = Paths.get(sstable.descriptor.filenameFor(Component.FILTER));
-        if (Files.exists(bfPath))
+        File bfPath = new File(sstable.descriptor.filenameFor(Component.FILTER));
+        if (bfPath.exists())
         {
-            try (DataInputStream stream = new DataInputStream(new BufferedInputStream(Files.newInputStream(bfPath)));
+            try (FileInputStreamPlus stream = bfPath.newInputStream();
                  IFilter bf = BloomFilterSerializer.deserialize(stream, sstable.descriptor.version.hasOldBfFormat()))
             {
             }
@@ -509,7 +510,7 @@
     {
         private final RandomAccessReader dataFile;
         private final SSTableReader sstable;
-        private final UUID verificationCompactionId;
+        private final TimeUUID verificationCompactionId;
         private final Lock fileReadLock;
 
         public VerifyInfo(RandomAccessReader dataFile, SSTableReader sstable, Lock fileReadLock)
@@ -517,7 +518,7 @@
             this.dataFile = dataFile;
             this.sstable = sstable;
             this.fileReadLock = fileReadLock;
-            verificationCompactionId = UUIDGen.getTimeUUID();
+            verificationCompactionId = nextTimeUUID();
         }
 
         public CompactionInfo getCompactionInfo()
diff --git a/src/java/org/apache/cassandra/db/compaction/writers/CompactionAwareWriter.java b/src/java/org/apache/cassandra/db/compaction/writers/CompactionAwareWriter.java
index 3760ab1..0f4fe2d 100644
--- a/src/java/org/apache/cassandra/db/compaction/writers/CompactionAwareWriter.java
+++ b/src/java/org/apache/cassandra/db/compaction/writers/CompactionAwareWriter.java
@@ -18,11 +18,9 @@
 
 package org.apache.cassandra.db.compaction.writers;
 
-import java.io.File;
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -39,9 +37,8 @@
 import org.apache.cassandra.io.sstable.SSTableRewriter;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Transactional;
-import org.apache.cassandra.db.compaction.OperationType;
-
 
 /**
  * Class that abstracts away the actual writing of files to make it possible to use CompactionTask for more
@@ -57,7 +54,7 @@
     protected final long estimatedTotalKeys;
     protected final long maxAge;
     protected final long minRepairedAt;
-    protected final UUID pendingRepair;
+    protected final TimeUUID pendingRepair;
     protected final boolean isTransient;
 
     protected final SSTableRewriter sstableWriter;
diff --git a/src/java/org/apache/cassandra/db/compaction/writers/SplittingSizeTieredCompactionWriter.java b/src/java/org/apache/cassandra/db/compaction/writers/SplittingSizeTieredCompactionWriter.java
index 6508fa9..264e19c 100644
--- a/src/java/org/apache/cassandra/db/compaction/writers/SplittingSizeTieredCompactionWriter.java
+++ b/src/java/org/apache/cassandra/db/compaction/writers/SplittingSizeTieredCompactionWriter.java
@@ -37,7 +37,7 @@
  * CompactionAwareWriter that splits input in differently sized sstables
  *
  * Biggest sstable will be total_compaction_size / 2, second biggest total_compaction_size / 4 etc until
- * the result would be sub 50MB, all those are put in the same
+ * the result would be sub 50MiB, all those are put in the same
  */
 public class SplittingSizeTieredCompactionWriter extends CompactionAwareWriter
 {
@@ -70,7 +70,7 @@
         }
 
         int noPointIndex = 0;
-        // find how many sstables we should create - 50MB min sstable size
+        // find how many sstables we should create - 50MiB min sstable size
         for (double ratio : potentialRatios)
         {
             noPointIndex++;
diff --git a/src/java/org/apache/cassandra/db/context/CounterContext.java b/src/java/org/apache/cassandra/db/context/CounterContext.java
index 7db8192..37bd3ca 100644
--- a/src/java/org/apache/cassandra/db/context/CounterContext.java
+++ b/src/java/org/apache/cassandra/db/context/CounterContext.java
@@ -465,7 +465,7 @@
                 if (leftClock == rightClock)
                 {
                     // Can happen if an sstable gets lost and disk failure policy is set to 'best effort'
-                    if (leftCount != rightCount && CompactionManager.isCompactionManager.get())
+                    if (leftCount != rightCount && CompactionManager.isCompactor(Thread.currentThread()))
                     {
                         logger.warn("invalid global counter shard detected; ({}, {}, {}) and ({}, {}, {}) differ only in "
                                     + "count; will pick highest to self-heal on compaction",
@@ -506,7 +506,7 @@
             // We should never see non-local shards w/ same id+clock but different counts. However, if we do
             // we should "heal" the problem by being deterministic in our selection of shard - and
             // log the occurrence so that the operator will know something is wrong.
-            if (leftCount != rightCount && CompactionManager.isCompactionManager.get())
+            if (leftCount != rightCount && CompactionManager.isCompactor(Thread.currentThread()))
             {
                 logger.warn("invalid remote counter shard detected; ({}, {}, {}) and ({}, {}, {}) differ only in "
                             + "count; will pick highest to self-heal on compaction",
diff --git a/src/java/org/apache/cassandra/db/filter/AbstractClusteringIndexFilter.java b/src/java/org/apache/cassandra/db/filter/AbstractClusteringIndexFilter.java
index 63c2783..ddcaaed 100644
--- a/src/java/org/apache/cassandra/db/filter/AbstractClusteringIndexFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/AbstractClusteringIndexFilter.java
@@ -54,11 +54,14 @@
     {
         if (reversed)
         {
-            sb.append(" ORDER BY (");
+            sb.append(" ORDER BY ");
             int i = 0;
             for (ColumnMetadata column : metadata.clusteringColumns())
-                sb.append(i++ == 0 ? "" : ", ").append(column.name).append(column.type instanceof ReversedType ? " ASC" : " DESC");
-            sb.append(')');
+            {
+                sb.append(i++ == 0 ? "" : ", ")
+                  .append(column.name.toCQLString())
+                  .append(column.type instanceof ReversedType ? " ASC" : " DESC");
+            }
         }
     }
 
diff --git a/src/java/org/apache/cassandra/db/filter/ClusteringIndexFilter.java b/src/java/org/apache/cassandra/db/filter/ClusteringIndexFilter.java
index 6ea0435..924ff21 100644
--- a/src/java/org/apache/cassandra/db/filter/ClusteringIndexFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/ClusteringIndexFilter.java
@@ -153,7 +153,7 @@
     public Kind kind();
 
     public String toString(TableMetadata metadata);
-    public String toCQLString(TableMetadata metadata);
+    public String toCQLString(TableMetadata metadata, RowFilter rowFilter);
 
     public interface Serializer
     {
diff --git a/src/java/org/apache/cassandra/db/filter/ClusteringIndexNamesFilter.java b/src/java/org/apache/cassandra/db/filter/ClusteringIndexNamesFilter.java
index 3ff5234..18dc471 100644
--- a/src/java/org/apache/cassandra/db/filter/ClusteringIndexNamesFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/ClusteringIndexNamesFilter.java
@@ -21,6 +21,7 @@
 import java.nio.ByteBuffer;
 import java.util.*;
 
+import org.apache.cassandra.cql3.Operator;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.partitions.*;
 import org.apache.cassandra.db.rows.*;
@@ -168,18 +169,36 @@
         return sb.append(')').toString();
     }
 
-    public String toCQLString(TableMetadata metadata)
+    @Override
+    public String toCQLString(TableMetadata metadata, RowFilter rowFilter)
     {
         if (metadata.clusteringColumns().isEmpty() || clusterings.isEmpty())
-            return "";
+            return rowFilter.toCQLString();
+
+        boolean isSingleColumn = metadata.clusteringColumns().size() == 1;
+        boolean isSingleClustering = clusterings.size() == 1;
 
         StringBuilder sb = new StringBuilder();
-        sb.append('(').append(ColumnMetadata.toCQLString(metadata.clusteringColumns())).append(')');
-        sb.append(clusterings.size() == 1 ? " = " : " IN (");
+        sb.append(isSingleColumn ? "" : '(')
+          .append(ColumnMetadata.toCQLString(metadata.clusteringColumns()))
+          .append(isSingleColumn ? "" : ')');
+
+        sb.append(isSingleClustering ? " = " : " IN (");
         int i = 0;
         for (Clustering<?> clustering : clusterings)
-            sb.append(i++ == 0 ? "" : ", ").append('(').append(clustering.toCQLString(metadata)).append(')');
-        sb.append(clusterings.size() == 1 ? "" : ")");
+        {
+            sb.append(i++ == 0 ? "" : ", ")
+              .append(isSingleColumn ? "" : '(')
+              .append(clustering.toCQLString(metadata))
+              .append(isSingleColumn ? "" : ')');
+
+            for (int j = 0; j < clustering.size(); j++)
+                rowFilter = rowFilter.without(metadata.clusteringColumns().get(j), Operator.EQ, clustering.bufferAt(j));
+        }
+        sb.append(isSingleClustering ? "" : ")");
+
+        if (!rowFilter.isEmpty())
+            sb.append(" AND ").append(rowFilter.toCQLString());
 
         appendOrderByToCQLString(metadata, sb);
         return sb.toString();
diff --git a/src/java/org/apache/cassandra/db/filter/ClusteringIndexSliceFilter.java b/src/java/org/apache/cassandra/db/filter/ClusteringIndexSliceFilter.java
index 5df98c3..178c96b 100644
--- a/src/java/org/apache/cassandra/db/filter/ClusteringIndexSliceFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/ClusteringIndexSliceFilter.java
@@ -142,13 +142,12 @@
         return String.format("slice(slices=%s, reversed=%b)", slices, reversed);
     }
 
-    public String toCQLString(TableMetadata metadata)
+    @Override
+    public String toCQLString(TableMetadata metadata, RowFilter rowFilter)
     {
         StringBuilder sb = new StringBuilder();
 
-        if (!selectsAllPartition())
-            sb.append(slices.toCQLString(metadata));
-
+        sb.append(slices.toCQLString(metadata, rowFilter));
         appendOrderByToCQLString(metadata, sb);
 
         return sb.toString();
diff --git a/src/java/org/apache/cassandra/db/filter/ColumnFilter.java b/src/java/org/apache/cassandra/db/filter/ColumnFilter.java
index d9a1b9d4..0ed6237 100644
--- a/src/java/org/apache/cassandra/db/filter/ColumnFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/ColumnFilter.java
@@ -940,7 +940,7 @@
                 if (s.isEmpty())
                     joiner.add(columnName);
                 else
-                    s.forEach(subSel -> joiner.add(String.format("%s%s", columnName, subSel)));
+                    s.forEach(subSel -> joiner.add(String.format("%s%s", columnName, subSel.toString(cql))));
             }
             return joiner.toString();
         }
diff --git a/src/java/org/apache/cassandra/db/filter/ColumnSubselection.java b/src/java/org/apache/cassandra/db/filter/ColumnSubselection.java
index dbb415a..c53c43a 100644
--- a/src/java/org/apache/cassandra/db/filter/ColumnSubselection.java
+++ b/src/java/org/apache/cassandra/db/filter/ColumnSubselection.java
@@ -88,6 +88,14 @@
      */
     public abstract int compareInclusionOf(CellPath path);
 
+    @Override
+    public String toString()
+    {
+        return toString(false);
+    }
+
+    protected abstract String toString(boolean cql);
+
     private static class Slice extends ColumnSubselection
     {
         private final CellPath from;
@@ -122,11 +130,13 @@
         }
 
         @Override
-        public String toString()
+        protected String toString(boolean cql)
         {
             // This assert we're dealing with a collection since that's the only thing it's used for so far.
             AbstractType<?> type = ((CollectionType<?>)column().type).nameComparator();
-            return String.format("[%s:%s]", from == CellPath.BOTTOM ? "" : type.getString(from.get(0)), to == CellPath.TOP ? "" : type.getString(to.get(0)));
+            return String.format("[%s:%s]",
+                                 from == CellPath.BOTTOM ? "" : (cql ? type.toCQLString(from.get(0)) : type.getString(from.get(0))),
+                                 to == CellPath.TOP ? "" : (cql ? type.toCQLString(to.get(0)) : type.getString(to.get(0))));
         }
     }
 
@@ -156,11 +166,11 @@
         }
 
         @Override
-        public String toString()
+        protected String toString(boolean cql)
         {
             // This assert we're dealing with a collection since that's the only thing it's used for so far.
             AbstractType<?> type = ((CollectionType<?>)column().type).nameComparator();
-            return String.format("[%s]", type.getString(element.get(0)));
+            return String.format("[%s]", cql ? type.toCQLString(element.get(0)) : type.getString(element.get(0)));
         }
     }
 
diff --git a/src/java/org/apache/cassandra/db/filter/DataLimits.java b/src/java/org/apache/cassandra/db/filter/DataLimits.java
index 845cffd..f988cb3 100644
--- a/src/java/org/apache/cassandra/db/filter/DataLimits.java
+++ b/src/java/org/apache/cassandra/db/filter/DataLimits.java
@@ -32,6 +32,7 @@
 import org.apache.cassandra.db.transform.Transformation;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
@@ -1175,7 +1176,7 @@
             }
         }
 
-        public DataLimits deserialize(DataInputPlus in, int version, ClusteringComparator comparator) throws IOException
+        public DataLimits deserialize(DataInputPlus in, int version, TableMetadata metadata) throws IOException
         {
             Kind kind = Kind.values()[in.readUnsignedByte()];
             switch (kind)
@@ -1199,9 +1200,9 @@
                     int groupPerPartitionLimit = (int) in.readUnsignedVInt();
                     int rowLimit = (int) in.readUnsignedVInt();
 
-                    AggregationSpecification groupBySpec = AggregationSpecification.serializer.deserialize(in, version, comparator);
+                    AggregationSpecification groupBySpec = AggregationSpecification.serializer.deserialize(in, version, metadata);
 
-                    GroupingState state = GroupingState.serializer.deserialize(in, version, comparator);
+                    GroupingState state = GroupingState.serializer.deserialize(in, version, metadata.comparator);
 
                     if (kind == Kind.CQL_GROUP_BY_LIMIT)
                         return new CQLGroupByLimits(groupLimit,
diff --git a/src/java/org/apache/cassandra/db/filter/LocalReadSizeTooLargeException.java b/src/java/org/apache/cassandra/db/filter/LocalReadSizeTooLargeException.java
new file mode 100644
index 0000000..9d872df
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/filter/LocalReadSizeTooLargeException.java
@@ -0,0 +1,29 @@
+/*
+ * 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.filter;
+
+import org.apache.cassandra.db.RejectException;
+
+public class LocalReadSizeTooLargeException extends RejectException
+{
+    public LocalReadSizeTooLargeException(String message)
+    {
+        super(message);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/filter/RowFilter.java b/src/java/org/apache/cassandra/db/filter/RowFilter.java
index 68a1d57..5e0fb51 100644
--- a/src/java/org/apache/cassandra/db/filter/RowFilter.java
+++ b/src/java/org/apache/cassandra/db/filter/RowFilter.java
@@ -28,6 +28,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.Operator;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.context.*;
@@ -238,6 +239,23 @@
         return withNewExpressions(newExpressions);
     }
 
+    /**
+     * Returns a copy of this filter but without the provided expression. If this filter doesn't contain the specified
+     * expression this method will just return an identical copy of this filter.
+     */
+    public RowFilter without(ColumnMetadata column, Operator op, ByteBuffer value)
+    {
+        if (isEmpty())
+            return this;
+
+        List<Expression> newExpressions = new ArrayList<>(expressions.size() - 1);
+        for (Expression e : expressions)
+            if (!e.column().equals(column) || e.operator() != op || !e.value.equals(value))
+                newExpressions.add(e);
+
+        return withNewExpressions(newExpressions);
+    }
+
     public RowFilter withoutExpressions()
     {
         return withNewExpressions(Collections.emptyList());
@@ -258,12 +276,27 @@
     @Override
     public String toString()
     {
+        return toString(false);
+    }
+
+    /**
+     * Returns a CQL representation of this row filter.
+     *
+     * @return a CQL representation of this row filter
+     */
+    public String toCQLString()
+    {
+        return toString(true);
+    }
+
+    private String toString(boolean cql)
+    {
         StringBuilder sb = new StringBuilder();
         for (int i = 0; i < expressions.size(); i++)
         {
             if (i > 0)
                 sb.append(" AND ");
-            sb.append(expressions.get(i));
+            sb.append(expressions.get(i).toString(cql));
         }
         return sb.toString();
     }
@@ -478,6 +511,24 @@
             return Objects.hashCode(column.name, operator, value);
         }
 
+        @Override
+        public String toString()
+        {
+            return toString(false);
+        }
+
+        /**
+         * Returns a CQL representation of this expression.
+         *
+         * @return a CQL representation of this expression
+         */
+        public String toCQLString()
+        {
+            return toString(true);
+        }
+
+        protected abstract String toString(boolean cql);
+
         private static class Serializer
         {
             public void serialize(Expression expression, DataOutputPlus out, int version) throws IOException
@@ -603,6 +654,7 @@
             switch (operator)
             {
                 case EQ:
+                case IN:
                 case LT:
                 case LTE:
                 case GTE:
@@ -695,17 +747,12 @@
                         ByteBuffer foundValue = getValue(metadata, partitionKey, row);
                         return foundValue != null && mapType.getSerializer().getSerializedValue(foundValue, value, mapType.getKeysType()) != null;
                     }
-
-                case IN:
-                    // It wouldn't be terribly hard to support this (though doing so would imply supporting
-                    // IN for 2ndary index) but currently we don't.
-                    throw new AssertionError();
             }
             throw new AssertionError();
         }
 
         @Override
-        public String toString()
+        protected String toString(boolean cql)
         {
             AbstractType<?> type = column.type;
             switch (operator)
@@ -725,7 +772,9 @@
                 default:
                     break;
             }
-            return String.format("%s %s %s", column.name, operator, type.getString(value));
+            return cql
+                 ? String.format("%s %s %s", column.name.toCQLString(), operator, type.toCQLString(value) )
+                 : String.format("%s %s %s", column.name.toString(), operator, type.getString(value));
         }
 
         @Override
@@ -793,10 +842,14 @@
         }
 
         @Override
-        public String toString()
+        protected String toString(boolean cql)
         {
-            MapType<?, ?> mt = (MapType<?, ?>)column.type;
-            return String.format("%s[%s] = %s", column.name, mt.nameComparator().getString(key), mt.valueComparator().getString(value));
+            MapType<?, ?> mt = (MapType<?, ?>) column.type;
+            AbstractType<?> nt = mt.nameComparator();
+            AbstractType<?> vt = mt.valueComparator();
+            return cql
+                 ? String.format("%s[%s] = %s", column.name.toCQLString(), nt.toCQLString(key), vt.toCQLString(value))
+                 : String.format("%s[%s] = %s", column.name.toString(), nt.getString(key), vt.getString(value));
         }
 
         @Override
@@ -863,10 +916,11 @@
             return value;
         }
 
-        public String toString()
+        @Override
+        protected String toString(boolean cql)
         {
             return String.format("expr(%s, %s)",
-                                 targetIndex.name,
+                                 cql ? ColumnIdentifier.maybeQuote(targetIndex.name) : targetIndex.name,
                                  Keyspace.openAndGetStore(table)
                                          .indexManager
                                          .getIndex(targetIndex)
diff --git a/src/java/org/apache/cassandra/db/filter/RowIndexEntryReadSizeTooLargeException.java b/src/java/org/apache/cassandra/db/filter/RowIndexEntryReadSizeTooLargeException.java
new file mode 100644
index 0000000..20f3f8f
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/filter/RowIndexEntryReadSizeTooLargeException.java
@@ -0,0 +1,29 @@
+/*
+ * 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.filter;
+
+import org.apache.cassandra.db.RejectException;
+
+public class RowIndexEntryReadSizeTooLargeException extends RejectException
+{
+    public RowIndexEntryReadSizeTooLargeException(String message)
+    {
+        super(message);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java b/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java
index 28d49ae..efca3ac 100644
--- a/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java
+++ b/src/java/org/apache/cassandra/db/filter/TombstoneOverwhelmingException.java
@@ -24,7 +24,7 @@
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.*;
 
-public class TombstoneOverwhelmingException extends RuntimeException
+public class TombstoneOverwhelmingException extends RejectException
 {
     public TombstoneOverwhelmingException(int numTombstones, String query, TableMetadata metadata, DecoratedKey lastPartitionKey, ClusteringPrefix<?> lastClustering)
     {
diff --git a/src/java/org/apache/cassandra/db/guardrails/DisableFlag.java b/src/java/org/apache/cassandra/db/guardrails/DisableFlag.java
new file mode 100644
index 0000000..9ec1951
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/DisableFlag.java
@@ -0,0 +1,86 @@
+/*
+ * 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.guardrails;
+
+import java.util.function.Predicate;
+import javax.annotation.Nullable;
+
+import org.apache.cassandra.service.ClientState;
+
+/**
+ * A guardrail that completely disables the use of a particular feature.
+ *
+ * <p>Note that this guardrail only aborts operations (if the feature is disabled) so is only meant for
+ * query-based guardrails (we're happy to reject queries deemed dangerous, but we don't want to create a guardrail
+ * that breaks compaction for instance).
+ */
+public class DisableFlag extends Guardrail
+{
+    private final Predicate<ClientState> disabled;
+    private final String what;
+
+    /**
+     * Creates a new {@link DisableFlag} guardrail.
+     *
+     * @param name     the identifying name of the guardrail
+     * @param disabled a {@link ClientState}-based supplier of boolean indicating whether the feature guarded by this
+     *                 guardrail must be disabled.
+     * @param what     The feature that is guarded by this guardrail (for reporting in error messages),
+     *                 {@link DisableFlag#ensureEnabled(String, ClientState)} can specify a different {@code what}.
+     */
+    public DisableFlag(String name, Predicate<ClientState> disabled, String what)
+    {
+        super(name);
+        this.disabled = disabled;
+        this.what = what;
+    }
+
+    /**
+     * Aborts the operation if this guardrail is disabled.
+     *
+     * <p>This must be called when the feature guarded by this guardrail is used to ensure such use is in fact
+     * allowed.
+     *
+     * @param state The client state, used to skip the check if the query is internal or is done by a superuser.
+     *              A {@code null} value means that the check should be done regardless of the query.
+     */
+    public void ensureEnabled(@Nullable ClientState state)
+    {
+        ensureEnabled(what, state);
+    }
+
+    /**
+     * Aborts the operation if this guardrail is disabled.
+     *
+     * <p>This must be called when the feature guarded by this guardrail is used to ensure such use is in fact
+     * allowed.
+     *
+     * @param what  The feature that is guarded by this guardrail (for reporting in error messages).
+     * @param state The client state, used to skip the check if the query is internal or is done by a superuser.
+     *              A {@code null} value means that the check should be done regardless of the query, although it won't
+     *              throw any exception if the failure threshold is exceeded. This is so because checks without an
+     *              associated client come from asynchronous processes such as compaction, and we don't want to
+     *              interrupt such processes.
+     */
+    public void ensureEnabled(String what, @Nullable ClientState state)
+    {
+        if (enabled(state) && disabled.test(state))
+            fail(what + " is not allowed", state);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/Guardrail.java b/src/java/org/apache/cassandra/db/guardrails/Guardrail.java
new file mode 100644
index 0000000..c058f10
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/Guardrail.java
@@ -0,0 +1,194 @@
+/*
+ * 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.guardrails;
+
+import java.util.concurrent.TimeUnit;
+import javax.annotation.Nullable;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.NoSpamLogger;
+
+/**
+ * General class defining a given guardrail that guards against some particular usage/condition.
+ * <p>
+ * Some guardrails only emit warnings when triggered, while others abort the query that triggers them. Some may do one
+ * or the other based on specific threshold. The queries are aborted with an {@link InvalidRequestException}.
+ * <p>
+ * Note that all the defined classes support live updates, which is why each guardrail class constructor takes
+ * suppliers of the condition the guardrail acts on rather than the condition itself. This implies that said suppliers
+ * should be fast and non-blocking to avoid surprises.
+ */
+public abstract class Guardrail
+{
+    protected static final NoSpamLogger logger = NoSpamLogger.getLogger(LoggerFactory.getLogger(Guardrail.class),
+                                                                        10, TimeUnit.MINUTES);
+    protected static final String REDACTED = "<redacted>";
+
+    /** A name identifying the guardrail (mainly for shipping with diagnostic events). */
+    public final String name;
+
+    /** Minimum logging and triggering interval to avoid spamming downstream. */
+    private long minNotifyIntervalInMs = 0;
+
+    /** Time of last warning in milliseconds. */
+    private volatile long lastWarnInMs = 0;
+
+    /** Time of last failure in milliseconds. */
+    private volatile long lastFailInMs = 0;
+
+    Guardrail(String name)
+    {
+        this.name = name;
+    }
+
+    /**
+     * Checks whether this guardrail is enabled or not when the check is done for a background opperation that is not
+     * associated to a specific {@link ClientState}, such as compaction or other background processes. Operations that
+     * are associated to a {@link ClientState}, such as CQL queries, should use {@link Guardrail#enabled(ClientState)}.
+     *
+     * @return {@code true} if this guardrail is enabled, {@code false} otherwise.
+     */
+    public boolean enabled()
+    {
+        return enabled(null);
+    }
+
+    /**
+     * Checks whether this guardrail is enabled or not. This will be enabled if the database is initialized and the
+     * authenticated user (if specified) is not system nor superuser.
+     *
+     * @param state the client state, used to skip the check if the query is internal or is done by a superuser.
+     *              A {@code null} value means that the check should be done regardless of the query.
+     * @return {@code true} if this guardrail is enabled, {@code false} otherwise.
+     */
+    public boolean enabled(@Nullable ClientState state)
+    {
+        return DatabaseDescriptor.isDaemonInitialized() && (state == null || state.isOrdinaryUser());
+    }
+
+    protected void warn(String message)
+    {
+        warn(message, message);
+    }
+
+    protected void warn(String message, String redactedMessage)
+    {
+        if (skipNotifying(true))
+            return;
+
+        message = decorateMessage(message);
+
+        logger.warn(message);
+        // Note that ClientWarn will simply ignore the message if we're not running this as part of a user query
+        // (the internal "state" will be null)
+        ClientWarn.instance.warn(message);
+        // Similarly, tracing will also ignore the message if we're not running tracing on the current thread.
+        Tracing.trace(message);
+        GuardrailsDiagnostics.warned(name, decorateMessage(redactedMessage));
+    }
+
+    protected void fail(String message, @Nullable ClientState state)
+    {
+        fail(message, message, state);
+    }
+
+    protected void fail(String message, String redactedMessage, @Nullable ClientState state)
+    {
+        message = decorateMessage(message);
+
+        if (!skipNotifying(false))
+        {
+            logger.error(message);
+            // Note that ClientWarn will simply ignore the message if we're not running this as part of a user query
+            // (the internal "state" will be null)
+            ClientWarn.instance.warn(message);
+            // Similarly, tracing will also ignore the message if we're not running tracing on the current thread.
+            Tracing.trace(message);
+            GuardrailsDiagnostics.failed(name, decorateMessage(redactedMessage));
+        }
+
+        if (state != null)
+            throw new GuardrailViolatedException(message);
+    }
+
+    @VisibleForTesting
+    String decorateMessage(String message)
+    {
+        // Add a prefix to error message so user knows what threw the warning or cause the failure
+        return String.format("Guardrail %s violated: %s", name, message);
+    }
+
+    /**
+     * Note: this method is not thread safe and should only be used during guardrail initialization
+     *
+     * @param minNotifyIntervalInMs frequency of logging and triggering listener to avoid spamming,
+     *                              default 0 means always log and trigger listeners.
+     * @return current guardrail
+     */
+    Guardrail minNotifyIntervalInMs(long minNotifyIntervalInMs)
+    {
+        assert minNotifyIntervalInMs >= 0;
+        this.minNotifyIntervalInMs = minNotifyIntervalInMs;
+        return this;
+    }
+
+    /**
+     * reset last notify time to make sure it will notify downstream when {@link this#warn(String, String)}
+     * or {@link this#fail(String, ClientState)} is called next time.
+     */
+    @VisibleForTesting
+    void resetLastNotifyTime()
+    {
+        lastFailInMs = 0;
+        lastWarnInMs = 0;
+    }
+
+    /**
+     * @return true if guardrail should not log message and trigger listeners; otherwise, update lastWarnInMs or
+     * lastFailInMs respectively.
+     */
+    private boolean skipNotifying(boolean isWarn)
+    {
+        if (minNotifyIntervalInMs == 0)
+            return false;
+
+        long nowInMs = Clock.Global.currentTimeMillis();
+        long timeElapsedInMs = nowInMs - (isWarn ? lastWarnInMs : lastFailInMs);
+
+        boolean skip = timeElapsedInMs < minNotifyIntervalInMs;
+
+        if (!skip)
+        {
+            if (isWarn)
+                lastWarnInMs = nowInMs;
+            else
+                lastFailInMs = nowInMs;
+        }
+
+        return skip;
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/GuardrailEvent.java b/src/java/org/apache/cassandra/db/guardrails/GuardrailEvent.java
new file mode 100644
index 0000000..30eaafa
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/GuardrailEvent.java
@@ -0,0 +1,73 @@
+/*
+ * 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.guardrails;
+
+import java.io.Serializable;
+import java.util.HashMap;
+
+import org.apache.cassandra.diag.DiagnosticEvent;
+
+/**
+ * {@link DiagnosticEvent} implementation for guardrail activation events.
+ */
+final class GuardrailEvent extends DiagnosticEvent
+{
+    enum GuardrailEventType
+    {
+        WARNED, FAILED
+    }
+
+    /** The type of activation, which is a warning or a failure. */
+    private final GuardrailEventType type;
+
+    /** The name that identifies the activated guardrail. */
+    private final String name;
+
+    /** The warn/fail message emitted by the activated guardrail. */
+    private final String message;
+
+    /**
+     * Creates new guardrail activation event.
+     *
+     * @param type    The type of activation, which is warning or a failure.
+     * @param name    The name that identifies the activated guardrail.
+     * @param message The warn/fail message emitted by the activated guardrail.
+     */
+    GuardrailEvent(GuardrailEventType type, String name, String message)
+    {
+        this.type = type;
+        this.name = name;
+        this.message = message;
+    }
+
+    @Override
+    public Enum<GuardrailEventType> getType()
+    {
+        return type;
+    }
+
+    @Override
+    public HashMap<String, Serializable> toMap()
+    {
+        HashMap<String, Serializable> ret = new HashMap<>();
+        ret.put("name", name);
+        ret.put("message", message);
+        return ret;
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/GuardrailViolatedException.java b/src/java/org/apache/cassandra/db/guardrails/GuardrailViolatedException.java
new file mode 100644
index 0000000..e8a4795
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/GuardrailViolatedException.java
@@ -0,0 +1,29 @@
+/*
+ * 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.guardrails;
+
+import org.apache.cassandra.exceptions.InvalidRequestException;
+
+public class GuardrailViolatedException extends InvalidRequestException
+{
+    GuardrailViolatedException(String message)
+    {
+        super(message);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/Guardrails.java b/src/java/org/apache/cassandra/db/guardrails/Guardrails.java
new file mode 100644
index 0000000..9d08ab0
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/Guardrails.java
@@ -0,0 +1,917 @@
+/*
+ * 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.guardrails;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.lang3.StringUtils;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.GuardrailsOptions;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.service.disk.usage.DiskUsageBroadcaster;
+import org.apache.cassandra.utils.MBeanWrapper;
+
+import static java.lang.String.format;
+
+/**
+ * Entry point for Guardrails, storing the defined guardrails and providing a few global methods over them.
+ */
+public final class Guardrails implements GuardrailsMBean
+{
+    public static final String MBEAN_NAME = "org.apache.cassandra.db:type=Guardrails";
+
+    public static final GuardrailsConfigProvider CONFIG_PROVIDER = GuardrailsConfigProvider.instance;
+    private static final GuardrailsOptions DEFAULT_CONFIG = DatabaseDescriptor.getGuardrailsConfig();
+
+    @VisibleForTesting
+    static final Guardrails instance = new Guardrails();
+
+    /**
+     * Guardrail on the total number of user keyspaces.
+     */
+    public static final MaxThreshold keyspaces =
+    new MaxThreshold("keyspaces",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getKeyspacesWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getKeyspacesFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Creating keyspace %s, current number of keyspaces %s exceeds warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Cannot have more than %s keyspaces, aborting the creation of keyspace %s",
+                                        threshold, what));
+
+    /**
+     * Guardrail on the total number of tables on user keyspaces.
+     */
+    public static final MaxThreshold tables =
+    new MaxThreshold("tables",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getTablesWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getTablesFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Creating table %s, current number of tables %s exceeds warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Cannot have more than %s tables, aborting the creation of table %s",
+                                        threshold, what));
+
+    /**
+     * Guardrail on the number of columns per table.
+     */
+    public static final MaxThreshold columnsPerTable =
+    new MaxThreshold("columns_per_table",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getColumnsPerTableWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getColumnsPerTableFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("The table %s has %s columns, this exceeds the warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Tables cannot have more than %s columns, but %s provided for table %s",
+                                        threshold, value, what));
+
+    public static final MaxThreshold secondaryIndexesPerTable =
+    new MaxThreshold("secondary_indexes_per_table",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getSecondaryIndexesPerTableWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getSecondaryIndexesPerTableFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Creating secondary index %s, current number of indexes %s exceeds warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Tables cannot have more than %s secondary indexes, aborting the creation of secondary index %s",
+                                        threshold, what));
+
+    /**
+     * Guardrail disabling user's ability to create secondary indexes
+     */
+    public static final DisableFlag createSecondaryIndexesEnabled =
+    new DisableFlag("secondary_indexes",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getSecondaryIndexesEnabled(),
+                    "User creation of secondary indexes");
+
+    /**
+     * Guardrail on the number of materialized views per table.
+     */
+    public static final MaxThreshold materializedViewsPerTable =
+    new MaxThreshold("materialized_views_per_table",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getMaterializedViewsPerTableWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getMaterializedViewsPerTableFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Creating materialized view %s, current number of views %s exceeds warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Tables cannot have more than %s materialized views, aborting the creation of materialized view %s",
+                                        threshold, what));
+
+    /**
+     * Guardrail warning about, ignoring or rejecting the usage of certain table properties.
+     */
+    public static final Values<String> tableProperties =
+    new Values<>("table_properties",
+                 state -> CONFIG_PROVIDER.getOrCreate(state).getTablePropertiesWarned(),
+                 state -> CONFIG_PROVIDER.getOrCreate(state).getTablePropertiesIgnored(),
+                 state -> CONFIG_PROVIDER.getOrCreate(state).getTablePropertiesDisallowed(),
+                 "Table Properties");
+
+    /**
+     * Guardrail disabling user-provided timestamps.
+     */
+    public static final DisableFlag userTimestampsEnabled =
+    new DisableFlag("user_timestamps",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getUserTimestampsEnabled(),
+                    "User provided timestamps (USING TIMESTAMP)");
+
+    public static final DisableFlag groupByEnabled =
+    new DisableFlag("group_by",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getGroupByEnabled(),
+                    "GROUP BY functionality");
+
+    public static final DisableFlag dropTruncateTableEnabled =
+    new DisableFlag("drop_truncate_table_enabled",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getDropTruncateTableEnabled(),
+                    "DROP and TRUNCATE TABLE functionality");
+
+    /**
+     * Guardrail disabling user's ability to turn off compression
+     */
+    public static final DisableFlag uncompressedTablesEnabled =
+    new DisableFlag("uncompressed_tables_enabled",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getUncompressedTablesEnabled(),
+                    "Uncompressed table");
+
+    /**
+     * Guardrail disabling the creation of new COMPACT STORAGE tables
+     */
+    public static final DisableFlag compactTablesEnabled =
+    new DisableFlag("compact_tables",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getCompactTablesEnabled(),
+                    "Creation of new COMPACT STORAGE tables");
+
+    /**
+     * Guardrail on the number of elements returned within page.
+     */
+    public static final MaxThreshold pageSize =
+    new MaxThreshold("page_size",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getPageSizeWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getPageSizeFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Query for table %s with page size %s exceeds warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Aborting query for table %s, page size %s exceeds fail threshold of %s.",
+                                        what, value, threshold));
+
+    /**
+     * Guardrail on the number of partition keys in the IN clause.
+     */
+    public static final MaxThreshold partitionKeysInSelect =
+    new MaxThreshold("partition_keys_in_select",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getPartitionKeysInSelectWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getPartitionKeysInSelectFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Query with partition keys in IN clause on table %s, with number of " +
+                                        "partition keys %s exceeds warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Aborting query with partition keys in IN clause on table %s, " +
+                                        "number of partition keys %s exceeds fail threshold of %s.",
+                                        what, value, threshold));
+
+    /**
+     * Guardrail disabling operations on lists that require read before write.
+     */
+    public static final DisableFlag readBeforeWriteListOperationsEnabled =
+    new DisableFlag("read_before_write_list_operations",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getReadBeforeWriteListOperationsEnabled(),
+                    "List operation requiring read before write");
+
+    /**
+     * Guardrail disabling ALLOW FILTERING statement within a query
+     */
+    public static final DisableFlag allowFilteringEnabled =
+    new DisableFlag("allow_filtering",
+                    state -> !CONFIG_PROVIDER.getOrCreate(state).getAllowFilteringEnabled(),
+                    "Querying with ALLOW FILTERING");
+
+    /**
+     * Guardrail on the number of restrictions created by a cartesian product of a CQL's {@code IN} query.
+     */
+    public static final MaxThreshold inSelectCartesianProduct =
+    new MaxThreshold("in_select_cartesian_product",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getInSelectCartesianProductWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getInSelectCartesianProductFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("The cartesian product of the IN restrictions on %s produces %s values, " +
+                                        "this exceeds warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Aborting query because the cartesian product of the IN restrictions on %s " +
+                                        "produces %s values, this exceeds fail threshold of %s.",
+                                        what, value, threshold));
+
+    /**
+     * Guardrail on read consistency levels.
+     */
+    public static final Values<ConsistencyLevel> readConsistencyLevels =
+    new Values<>("read_consistency_levels",
+                 state -> CONFIG_PROVIDER.getOrCreate(state).getReadConsistencyLevelsWarned(),
+                 state -> Collections.emptySet(),
+                 state -> CONFIG_PROVIDER.getOrCreate(state).getReadConsistencyLevelsDisallowed(),
+                 "read consistency levels");
+
+    /**
+     * Guardrail on write consistency levels.
+     */
+    public static final Values<ConsistencyLevel> writeConsistencyLevels =
+    new Values<>("write_consistency_levels",
+                 state -> CONFIG_PROVIDER.getOrCreate(state).getWriteConsistencyLevelsWarned(),
+                 state -> Collections.emptySet(),
+                 state -> CONFIG_PROVIDER.getOrCreate(state).getWriteConsistencyLevelsDisallowed(),
+                 "write consistency levels");
+
+    /**
+     * Guardrail on the size of a collection.
+     */
+    public static final MaxThreshold collectionSize =
+    new MaxThreshold("collection_size",
+                     state -> sizeToBytes(CONFIG_PROVIDER.getOrCreate(state).getCollectionSizeWarnThreshold()),
+                     state -> sizeToBytes(CONFIG_PROVIDER.getOrCreate(state).getCollectionSizeFailThreshold()),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Detected collection %s of size %s, this exceeds the warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Detected collection %s of size %s, this exceeds the failure threshold of %s.",
+                                        what, value, threshold));
+
+    /**
+     * Guardrail on the number of items of a collection.
+     */
+    public static final MaxThreshold itemsPerCollection =
+    new MaxThreshold("items_per_collection",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getItemsPerCollectionWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getItemsPerCollectionFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("Detected collection %s with %s items, this exceeds the warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("Detected collection %s with %s items, this exceeds the failure threshold of %s.",
+                                        what, value, threshold));
+
+    /**
+     * Guardrail on the number of fields on each UDT.
+     */
+    public static final MaxThreshold fieldsPerUDT =
+    new MaxThreshold("fields_per_udt",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getFieldsPerUDTWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getFieldsPerUDTFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("The user type %s has %s columns, this exceeds the warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("User types cannot have more than %s columns, but %s provided for user type %s.",
+                                        threshold, value, what));
+
+    /**
+     * Guardrail on the data disk usage on the local node, used by a periodic task to calculate and propagate that status.
+     * See {@link org.apache.cassandra.service.disk.usage.DiskUsageMonitor} and {@link DiskUsageBroadcaster}.
+     */
+    public static final PercentageThreshold localDataDiskUsage =
+    new PercentageThreshold("local_data_disk_usage",
+                            state -> CONFIG_PROVIDER.getOrCreate(state).getDataDiskUsagePercentageWarnThreshold(),
+                            state -> CONFIG_PROVIDER.getOrCreate(state).getDataDiskUsagePercentageFailThreshold(),
+                            (isWarning, what, value, threshold) ->
+                            isWarning ? format("Local data disk usage %s(%s) exceeds warning threshold of %s",
+                                               value, what, threshold)
+                                      : format("Local data disk usage %s(%s) exceeds failure threshold of %s, " +
+                                               "will stop accepting writes",
+                                               value, what, threshold));
+
+    /**
+     * Guardrail on the data disk usage on replicas, used at write time to verify the status of the involved replicas.
+     * See {@link org.apache.cassandra.service.disk.usage.DiskUsageMonitor} and {@link DiskUsageBroadcaster}.
+     */
+    public static final Predicates<InetAddressAndPort> replicaDiskUsage =
+    new Predicates<>("replica_disk_usage",
+                     state -> DiskUsageBroadcaster.instance::isStuffed,
+                     state -> DiskUsageBroadcaster.instance::isFull,
+                     // not using `value` because it represents replica address which should be hidden from client.
+                     (isWarning, value) ->
+                     isWarning ? "Replica disk usage exceeds warning threshold"
+                               : "Write request failed because disk usage exceeds failure threshold");
+
+    static
+    {
+        // Avoid spamming with notifications about stuffed/full disks
+        long minNotifyInterval = CassandraRelevantProperties.DISK_USAGE_NOTIFY_INTERVAL_MS.getLong();
+        localDataDiskUsage.minNotifyIntervalInMs(minNotifyInterval);
+        replicaDiskUsage.minNotifyIntervalInMs(minNotifyInterval);
+    }
+
+    /**
+     * Guardrail on the minimum replication factor.
+     */
+    public static final MinThreshold minimumReplicationFactor =
+    new MinThreshold("minimum_replication_factor",
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getMinimumReplicationFactorWarnThreshold(),
+                     state -> CONFIG_PROVIDER.getOrCreate(state).getMinimumReplicationFactorFailThreshold(),
+                     (isWarning, what, value, threshold) ->
+                     isWarning ? format("The keyspace %s has a replication factor of %s, below the warning threshold of %s.",
+                                        what, value, threshold)
+                               : format("The keyspace %s has a replication factor of %s, below the failure threshold of %s.",
+                                        what, value, threshold));
+
+    private Guardrails()
+    {
+        MBeanWrapper.instance.registerMBean(this, MBEAN_NAME);
+    }
+
+    @Override
+    public int getKeyspacesWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getKeyspacesWarnThreshold();
+    }
+
+    @Override
+    public int getKeyspacesFailThreshold()
+    {
+        return DEFAULT_CONFIG.getKeyspacesFailThreshold();
+    }
+
+    @Override
+    public void setKeyspacesThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setKeyspacesThreshold(warn, fail);
+    }
+
+    @Override
+    public int getTablesWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getTablesWarnThreshold();
+    }
+
+    @Override
+    public int getTablesFailThreshold()
+    {
+        return DEFAULT_CONFIG.getTablesFailThreshold();
+    }
+
+    @Override
+    public void setTablesThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setTablesThreshold(warn, fail);
+    }
+
+    @Override
+    public int getColumnsPerTableWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getColumnsPerTableWarnThreshold();
+    }
+
+    @Override
+    public int getColumnsPerTableFailThreshold()
+    {
+        return DEFAULT_CONFIG.getColumnsPerTableFailThreshold();
+    }
+
+    @Override
+    public void setColumnsPerTableThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setColumnsPerTableThreshold(warn, fail);
+    }
+
+    @Override
+    public int getSecondaryIndexesPerTableWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getSecondaryIndexesPerTableWarnThreshold();
+    }
+
+    @Override
+    public int getSecondaryIndexesPerTableFailThreshold()
+    {
+        return DEFAULT_CONFIG.getSecondaryIndexesPerTableFailThreshold();
+    }
+
+    @Override
+    public void setSecondaryIndexesPerTableThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setSecondaryIndexesPerTableThreshold(warn, fail);
+    }
+
+    @Override
+    public boolean getSecondaryIndexesEnabled()
+    {
+        return DEFAULT_CONFIG.getSecondaryIndexesEnabled();
+    }
+
+    @Override
+    public void setSecondaryIndexesEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setSecondaryIndexesEnabled(enabled);
+    }
+
+    @Override
+    public int getMaterializedViewsPerTableWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getMaterializedViewsPerTableWarnThreshold();
+    }
+
+    @Override
+    public int getMaterializedViewsPerTableFailThreshold()
+    {
+        return DEFAULT_CONFIG.getMaterializedViewsPerTableFailThreshold();
+    }
+
+    @Override
+    public void setMaterializedViewsPerTableThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setMaterializedViewsPerTableThreshold(warn, fail);
+    }
+
+    @Override
+    public Set<String> getTablePropertiesWarned()
+    {
+        return DEFAULT_CONFIG.getTablePropertiesWarned();
+    }
+
+    @Override
+    public String getTablePropertiesWarnedCSV()
+    {
+        return toCSV(DEFAULT_CONFIG.getTablePropertiesWarned());
+    }
+
+    public void setTablePropertiesWarned(String... properties)
+    {
+        setTablePropertiesWarned(ImmutableSet.copyOf(properties));
+    }
+
+    @Override
+    public void setTablePropertiesWarned(Set<String> properties)
+    {
+        DEFAULT_CONFIG.setTablePropertiesWarned(properties);
+    }
+
+    @Override
+    public void setTablePropertiesWarnedCSV(String properties)
+    {
+        setTablePropertiesWarned(fromCSV(properties));
+    }
+
+    @Override
+    public Set<String> getTablePropertiesDisallowed()
+    {
+        return DEFAULT_CONFIG.getTablePropertiesDisallowed();
+    }
+
+    @Override
+    public String getTablePropertiesDisallowedCSV()
+    {
+        return toCSV(DEFAULT_CONFIG.getTablePropertiesDisallowed());
+    }
+
+    public void setTablePropertiesDisallowed(String... properties)
+    {
+        setTablePropertiesDisallowed(ImmutableSet.copyOf(properties));
+    }
+
+    @Override
+    public void setTablePropertiesDisallowed(Set<String> properties)
+    {
+        DEFAULT_CONFIG.setTablePropertiesDisallowed(properties);
+    }
+
+    @Override
+    public void setTablePropertiesDisallowedCSV(String properties)
+    {
+        setTablePropertiesDisallowed(fromCSV(properties));
+    }
+
+    @Override
+    public Set<String> getTablePropertiesIgnored()
+    {
+        return DEFAULT_CONFIG.getTablePropertiesIgnored();
+    }
+
+    @Override
+    public String getTablePropertiesIgnoredCSV()
+    {
+        return toCSV(DEFAULT_CONFIG.getTablePropertiesIgnored());
+    }
+
+    public void setTablePropertiesIgnored(String... properties)
+    {
+        setTablePropertiesIgnored(ImmutableSet.copyOf(properties));
+    }
+
+    @Override
+    public void setTablePropertiesIgnored(Set<String> properties)
+    {
+        DEFAULT_CONFIG.setTablePropertiesIgnored(properties);
+    }
+
+    @Override
+    public void setTablePropertiesIgnoredCSV(String properties)
+    {
+        setTablePropertiesIgnored(fromCSV(properties));
+    }
+
+    @Override
+    public boolean getUserTimestampsEnabled()
+    {
+        return DEFAULT_CONFIG.getUserTimestampsEnabled();
+    }
+
+    @Override
+    public void setUserTimestampsEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setUserTimestampsEnabled(enabled);
+    }
+
+    @Override
+    public boolean getAllowFilteringEnabled()
+    {
+        return DEFAULT_CONFIG.getAllowFilteringEnabled();
+    }
+
+    @Override
+    public void setAllowFilteringEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setAllowFilteringEnabled(enabled);
+    }
+
+    @Override
+    public boolean getUncompressedTablesEnabled()
+    {
+        return DEFAULT_CONFIG.getUncompressedTablesEnabled();
+    }
+
+    @Override
+    public void setUncompressedTablesEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setUncompressedTablesEnabled(enabled);
+    }
+
+    @Override
+    public boolean getCompactTablesEnabled()
+    {
+        return DEFAULT_CONFIG.getCompactTablesEnabled();
+    }
+
+    @Override
+    public void setCompactTablesEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setCompactTablesEnabled(enabled);
+    }
+
+    @Override
+    public boolean getGroupByEnabled()
+    {
+        return DEFAULT_CONFIG.getGroupByEnabled();
+    }
+
+    @Override
+    public void setGroupByEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setGroupByEnabled(enabled);
+    }
+
+    @Override
+    public boolean getDropTruncateTableEnabled()
+    {
+        return DEFAULT_CONFIG.getDropTruncateTableEnabled();
+    }
+
+    @Override
+    public void setDropTruncateTableEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setDropTruncateTableEnabled(enabled);
+    }
+
+    @Override
+    public int getPageSizeWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getPageSizeWarnThreshold();
+    }
+
+    @Override
+    public int getPageSizeFailThreshold()
+    {
+        return DEFAULT_CONFIG.getPageSizeFailThreshold();
+    }
+
+    @Override
+    public void setPageSizeThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setPageSizeThreshold(warn, fail);
+    }
+
+    @Override
+    public boolean getReadBeforeWriteListOperationsEnabled()
+    {
+        return DEFAULT_CONFIG.getReadBeforeWriteListOperationsEnabled();
+    }
+
+    @Override
+    public void setReadBeforeWriteListOperationsEnabled(boolean enabled)
+    {
+        DEFAULT_CONFIG.setReadBeforeWriteListOperationsEnabled(enabled);
+    }
+
+    @Override
+    public int getPartitionKeysInSelectWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getPartitionKeysInSelectWarnThreshold();
+    }
+
+    @Override
+    public int getPartitionKeysInSelectFailThreshold()
+    {
+        return DEFAULT_CONFIG.getPartitionKeysInSelectFailThreshold();
+    }
+
+    @Override
+    public void setPartitionKeysInSelectThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setPartitionKeysInSelectThreshold(warn, fail);
+    }
+
+    @Override
+    @Nullable
+    public String getCollectionSizeWarnThreshold()
+    {
+        return sizeToString(DEFAULT_CONFIG.getCollectionSizeWarnThreshold());
+    }
+
+    @Override
+    @Nullable
+    public String getCollectionSizeFailThreshold()
+    {
+        return sizeToString(DEFAULT_CONFIG.getCollectionSizeFailThreshold());
+    }
+
+    @Override
+    public void setCollectionSizeThreshold(@Nullable String warnSize, @Nullable String failSize)
+    {
+        DEFAULT_CONFIG.setCollectionSizeThreshold(sizeFromString(warnSize), sizeFromString(failSize));
+    }
+
+    @Override
+    public int getItemsPerCollectionWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getItemsPerCollectionWarnThreshold();
+    }
+
+    @Override
+    public int getItemsPerCollectionFailThreshold()
+    {
+        return DEFAULT_CONFIG.getItemsPerCollectionFailThreshold();
+    }
+
+    @Override
+    public void setItemsPerCollectionThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setItemsPerCollectionThreshold(warn, fail);
+    }
+
+    @Override
+    public int getInSelectCartesianProductWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getInSelectCartesianProductWarnThreshold();
+    }
+
+    @Override
+    public int getInSelectCartesianProductFailThreshold()
+    {
+        return DEFAULT_CONFIG.getInSelectCartesianProductFailThreshold();
+    }
+
+    @Override
+    public void setInSelectCartesianProductThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setInSelectCartesianProductThreshold(warn, fail);
+    }
+
+    @Override
+    public Set<String> getReadConsistencyLevelsWarned()
+    {
+        return toJmx(DEFAULT_CONFIG.getReadConsistencyLevelsWarned());
+    }
+
+    @Override
+    public String getReadConsistencyLevelsWarnedCSV()
+    {
+        return toCSV(DEFAULT_CONFIG.getReadConsistencyLevelsWarned(), ConsistencyLevel::toString);
+    }
+
+    @Override
+    public void setReadConsistencyLevelsWarned(Set<String> consistencyLevels)
+    {
+        DEFAULT_CONFIG.setReadConsistencyLevelsWarned(fromJmx(consistencyLevels));
+    }
+
+    @Override
+    public void setReadConsistencyLevelsWarnedCSV(String consistencyLevels)
+    {
+        DEFAULT_CONFIG.setReadConsistencyLevelsWarned(fromCSV(consistencyLevels, ConsistencyLevel::fromString));
+    }
+
+    @Override
+    public Set<String> getReadConsistencyLevelsDisallowed()
+    {
+        return toJmx(DEFAULT_CONFIG.getReadConsistencyLevelsDisallowed());
+    }
+
+    @Override
+    public String getReadConsistencyLevelsDisallowedCSV()
+    {
+        return toCSV(DEFAULT_CONFIG.getReadConsistencyLevelsDisallowed(), ConsistencyLevel::toString);
+    }
+
+    @Override
+    public void setReadConsistencyLevelsDisallowed(Set<String> consistencyLevels)
+    {
+        DEFAULT_CONFIG.setReadConsistencyLevelsDisallowed(fromJmx(consistencyLevels));
+    }
+
+    @Override
+    public void setReadConsistencyLevelsDisallowedCSV(String consistencyLevels)
+    {
+        DEFAULT_CONFIG.setReadConsistencyLevelsDisallowed(fromCSV(consistencyLevels, ConsistencyLevel::fromString));
+    }
+
+    @Override
+    public Set<String> getWriteConsistencyLevelsWarned()
+    {
+        return toJmx(DEFAULT_CONFIG.getWriteConsistencyLevelsWarned());
+    }
+
+    @Override
+    public String getWriteConsistencyLevelsWarnedCSV()
+    {
+        return toCSV(DEFAULT_CONFIG.getWriteConsistencyLevelsWarned(), ConsistencyLevel::toString);
+    }
+
+    @Override
+    public void setWriteConsistencyLevelsWarned(Set<String> consistencyLevels)
+    {
+        DEFAULT_CONFIG.setWriteConsistencyLevelsWarned(fromJmx(consistencyLevels));
+    }
+
+    @Override
+    public void setWriteConsistencyLevelsWarnedCSV(String consistencyLevels)
+    {
+        DEFAULT_CONFIG.setWriteConsistencyLevelsWarned(fromCSV(consistencyLevels, ConsistencyLevel::fromString));
+    }
+
+    @Override
+    public Set<String> getWriteConsistencyLevelsDisallowed()
+    {
+        return toJmx(DEFAULT_CONFIG.getWriteConsistencyLevelsDisallowed());
+    }
+
+    @Override
+    public String getWriteConsistencyLevelsDisallowedCSV()
+    {
+        return toCSV(DEFAULT_CONFIG.getWriteConsistencyLevelsDisallowed(), ConsistencyLevel::toString);
+    }
+
+    @Override
+    public void setWriteConsistencyLevelsDisallowed(Set<String> consistencyLevels)
+    {
+        DEFAULT_CONFIG.setWriteConsistencyLevelsDisallowed(fromJmx(consistencyLevels));
+    }
+
+    @Override
+    public void setWriteConsistencyLevelsDisallowedCSV(String consistencyLevels)
+    {
+        DEFAULT_CONFIG.setWriteConsistencyLevelsDisallowed(fromCSV(consistencyLevels, ConsistencyLevel::fromString));
+    }
+
+    @Override
+    public int getFieldsPerUDTWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getFieldsPerUDTWarnThreshold();
+    }
+
+    @Override
+    public int getFieldsPerUDTFailThreshold()
+    {
+        return DEFAULT_CONFIG.getFieldsPerUDTFailThreshold();
+    }
+
+    @Override
+    public void setFieldsPerUDTThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setFieldsPerUDTThreshold(warn, fail);
+    }
+
+    @Override
+    public int getDataDiskUsagePercentageWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getDataDiskUsagePercentageWarnThreshold();
+    }
+
+    @Override
+    public int getDataDiskUsagePercentageFailThreshold()
+    {
+        return DEFAULT_CONFIG.getDataDiskUsagePercentageFailThreshold();
+    }
+
+    @Override
+    public void setDataDiskUsagePercentageThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setDataDiskUsagePercentageThreshold(warn, fail);
+    }
+
+    @Override
+    @Nullable
+    public String getDataDiskUsageMaxDiskSize()
+    {
+        return sizeToString(DEFAULT_CONFIG.getDataDiskUsageMaxDiskSize());
+    }
+
+    @Override
+    public void setDataDiskUsageMaxDiskSize(@Nullable String size)
+    {
+        DEFAULT_CONFIG.setDataDiskUsageMaxDiskSize(sizeFromString(size));
+    }
+
+    @Override
+    public int getMinimumReplicationFactorWarnThreshold()
+    {
+        return DEFAULT_CONFIG.getMinimumReplicationFactorWarnThreshold();
+    }
+
+    @Override
+    public int getMinimumReplicationFactorFailThreshold()
+    {
+        return DEFAULT_CONFIG.getMinimumReplicationFactorFailThreshold();
+    }
+
+    @Override
+    public void setMinimumReplicationFactorThreshold(int warn, int fail)
+    {
+        DEFAULT_CONFIG.setMinimumReplicationFactorThreshold(warn, fail);
+    }
+
+    private static String toCSV(Set<String> values)
+    {
+        return values == null || values.isEmpty() ? "" : String.join(",", values);
+    }
+
+    private static <T> String toCSV(Set<T> values, Function<T, String> formatter)
+    {
+        return values == null || values.isEmpty() ? "" : values.stream().map(formatter).collect(Collectors.joining(","));
+    }
+
+    private static Set<String> fromCSV(String csv)
+    {
+        return StringUtils.isEmpty(csv) ? Collections.emptySet() : ImmutableSet.copyOf(csv.split(","));
+    }
+
+    private static <T> Set<T> fromCSV(String csv, Function<String, T> parser)
+    {
+        return StringUtils.isEmpty(csv) ? Collections.emptySet() : fromCSV(csv).stream().map(parser).collect(Collectors.toSet());
+    }
+
+    private static Set<String> toJmx(Set<ConsistencyLevel> set)
+    {
+        if (set == null)
+            return null;
+        return set.stream().map(ConsistencyLevel::name).collect(Collectors.toSet());
+    }
+
+    private static Set<ConsistencyLevel> fromJmx(Set<String> set)
+    {
+        if (set == null)
+            return null;
+        return set.stream().map(ConsistencyLevel::valueOf).collect(Collectors.toSet());
+    }
+
+    private static Long sizeToBytes(@Nullable DataStorageSpec.LongBytesBound size)
+    {
+        return size == null ? -1 : size.toBytes();
+    }
+
+    private static String sizeToString(@Nullable DataStorageSpec size)
+    {
+        return size == null ? null : size.toString();
+    }
+
+    private static DataStorageSpec.LongBytesBound sizeFromString(@Nullable String size)
+    {
+        return StringUtils.isEmpty(size) ? null : new DataStorageSpec.LongBytesBound(size);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfig.java b/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfig.java
new file mode 100644
index 0000000..a52eeb0
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfig.java
@@ -0,0 +1,280 @@
+/*
+ * 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.guardrails;
+
+import java.util.Set;
+
+import javax.annotation.Nullable;
+
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.db.ConsistencyLevel;
+
+/**
+ * Configuration settings for guardrails.
+ *
+ * <p>Note that the settings here must only be used by the {@link Guardrails} class and not directly by the code
+ * checking each guarded constraint (which, again, should use the higher level abstractions defined in
+ * {@link Guardrails}).
+ *
+ * <p>We have 2 variants of guardrails, soft (warn) and hard (fail) limits, each guardrail having either one of the
+ * variants or both. Note in particular that hard limits only make sense for guardrails triggering during query
+ * execution. For other guardrails, say one triggering during compaction, aborting that compaction does not make sense.
+ *
+ * <p>Additionally, each individual setting should have a specific value (typically -1 for numeric settings),
+ * that allows to disable the corresponding guardrail.
+ * <p>
+ * This configuration is offered as an interface so different implementations of {@link GuardrailsConfigProvider} can
+ * provide different implementations of this config. However, this mechanism for guardrails config pluggability is not
+ * officially supported and this interface may change in a minor release.
+ */
+public interface GuardrailsConfig
+{
+    /**
+     * @return The threshold to warn when creating more user keyspaces than threshold.
+     */
+    int getKeyspacesWarnThreshold();
+
+    /**
+     * @return The threshold to fail when creating more user keyspaces than threshold.
+     */
+    int getKeyspacesFailThreshold();
+
+    /**
+     * @return The threshold to warn when creating more user tables than threshold.
+     */
+    int getTablesWarnThreshold();
+
+    /**
+     * @return The threshold to fail when creating more user tables than threshold.
+     */
+    int getTablesFailThreshold();
+
+    /**
+     * @return The threshold to warn when creating more columns per table than threshold.
+     */
+    int getColumnsPerTableWarnThreshold();
+
+    /**
+     * @return The threshold to fail when creating more columns per table than threshold.
+     */
+    int getColumnsPerTableFailThreshold();
+
+    /**
+     * @return The threshold to warn when creating more secondary indexes per table than threshold.
+     */
+    int getSecondaryIndexesPerTableWarnThreshold();
+
+    /**
+     * @return The threshold to fail when creating more secondary indexes per table than threshold.
+     */
+    int getSecondaryIndexesPerTableFailThreshold();
+
+    /**
+     * @return Whether creation of secondary indexes is allowed.
+     */
+    boolean getSecondaryIndexesEnabled();
+
+    /**
+     * @return The threshold to warn when creating more materialized views per table than threshold.
+     */
+    int getMaterializedViewsPerTableWarnThreshold();
+
+    /**
+     * @return The threshold to warn when partition keys in select more than threshold.
+     */
+    int getPartitionKeysInSelectWarnThreshold();
+
+    /**
+     * @return The threshold to fail when partition keys in select more than threshold.
+     */
+    int getPartitionKeysInSelectFailThreshold();
+
+    /**
+     * @return The threshold to fail when creating more materialized views per table than threshold.
+     */
+    int getMaterializedViewsPerTableFailThreshold();
+
+    /**
+     * @return The table properties that are warned about when creating or altering a table.
+     */
+    Set<String> getTablePropertiesWarned();
+
+    /**
+     * @return The table properties that are ignored when creating or altering a table.
+     */
+    Set<String> getTablePropertiesIgnored();
+
+    /**
+     * @return The table properties that are disallowed when creating or altering a table.
+     */
+    Set<String> getTablePropertiesDisallowed();
+
+    /**
+     * Returns whether user-provided timestamps are allowed.
+     *
+     * @return {@code true} if user-provided timestamps are allowed, {@code false} otherwise.
+     */
+    boolean getUserTimestampsEnabled();
+
+    /**
+     * Returns whether tables can be uncompressed
+     *
+     * @return {@code true} if user's can disable compression, {@code false} otherwise.
+     */
+    boolean getUncompressedTablesEnabled();
+
+    /**
+     * Returns whether users can create new COMPACT STORAGE tables
+     *
+     * @return {@code true} if allowed, {@code false} otherwise.
+     */
+    boolean getCompactTablesEnabled();
+
+    /**
+     * Returns whether GROUP BY functionality is allowed
+     *
+     * @return {@code true} if allowed, {@code false} otherwise.
+     */
+    boolean getGroupByEnabled();
+
+    /**
+     * Returns whether TRUNCATE or DROP table are allowed
+     *
+     * @return {@code true} if allowed, {@code false} otherwise.
+     */
+    boolean getDropTruncateTableEnabled();
+
+    /**
+     * @return The threshold to warn when page size exceeds given size.
+     */
+    int getPageSizeWarnThreshold();
+
+    /**
+     * @return The threshold to fail when page size exceeds given size.
+     */
+    int getPageSizeFailThreshold();
+
+    /**
+     * Returns whether list operations that require read before write are allowed.
+     *
+     * @return {@code true} if list operations that require read before write are allowed, {@code false} otherwise.
+     */
+    boolean getReadBeforeWriteListOperationsEnabled();
+
+    /**
+     * Returns whether ALLOW FILTERING property is allowed.
+     *
+     * @return {@code true} if ALLOW FILTERING is allowed, {@code false} otherwise.
+     */
+    boolean getAllowFilteringEnabled();
+
+    /**
+     * @return The threshold to warn when an IN query creates a cartesian product with a size exceeding threshold.
+     * -1 means disabled.
+     */
+    public int getInSelectCartesianProductWarnThreshold();
+
+    /**
+     * @return The threshold to prevent IN queries creating a cartesian product with a size exceeding threshold.
+     * -1 means disabled.
+     */
+    public int getInSelectCartesianProductFailThreshold();
+
+    /**
+     * @return The consistency levels that are warned about when reading.
+     */
+    Set<ConsistencyLevel> getReadConsistencyLevelsWarned();
+
+    /**
+     * @return The consistency levels that are disallowed when reading.
+     */
+    Set<ConsistencyLevel> getReadConsistencyLevelsDisallowed();
+
+    /**
+     * @return The consistency levels that are warned about when writing.
+     */
+    Set<ConsistencyLevel> getWriteConsistencyLevelsWarned();
+
+    /**
+     * @return The consistency levels that are disallowed when writing.
+     */
+    Set<ConsistencyLevel> getWriteConsistencyLevelsDisallowed();
+
+    /**
+     * @return The threshold to warn when encountering a collection with larger data size than threshold.
+     */
+    @Nullable
+    DataStorageSpec.LongBytesBound getCollectionSizeWarnThreshold();
+
+    /**
+     * @return The threshold to prevent collections with larger data size than threshold.
+     */
+    @Nullable
+    DataStorageSpec.LongBytesBound getCollectionSizeFailThreshold();
+
+    /**
+     * @return The threshold to warn when encountering more elements in a collection than threshold.
+     */
+    int getItemsPerCollectionWarnThreshold();
+
+    /**
+     * @return The threshold to prevent collections with more elements than threshold.
+     */
+    int getItemsPerCollectionFailThreshold();
+
+    /**
+     * @return The threshold to warn when creating a UDT with more fields than threshold.
+     */
+    int getFieldsPerUDTWarnThreshold();
+
+    /**
+     * @return The threshold to fail when creating a UDT with more fields than threshold.
+     */
+    int getFieldsPerUDTFailThreshold();
+
+    /**
+     * @return The threshold to warn when local disk usage percentage exceeds that threshold.
+     * Allowed values are in the range {@code [1, 100]}, and -1 means disabled.
+     */
+    int getDataDiskUsagePercentageWarnThreshold();
+
+    /**
+     * @return The threshold to fail when local disk usage percentage exceeds that threshold.
+     * Allowed values are in the range {@code [1, 100]}, and -1 means disabled.
+     */
+    int getDataDiskUsagePercentageFailThreshold();
+
+    /**
+     * @return The max disk size of the data directories when calculating disk usage thresholds, {@code null} means
+     * disabled.
+     */
+    @Nullable
+    DataStorageSpec.LongBytesBound getDataDiskUsageMaxDiskSize();
+
+    /**
+     * @return The threshold to warn when replication factor is lesser than threshold.
+     */
+    int getMinimumReplicationFactorWarnThreshold();
+
+    /**
+     * @return The threshold to fail when replication factor is lesser than threshold.
+     */
+    int getMinimumReplicationFactorFailThreshold();
+
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfigProvider.java b/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfigProvider.java
new file mode 100644
index 0000000..6128764
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/GuardrailsConfigProvider.java
@@ -0,0 +1,78 @@
+/*
+ * 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.guardrails;
+
+import javax.annotation.Nullable;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.utils.FBUtilities;
+
+/**
+ * Provider of {@link GuardrailsConfig}s for a {@link ClientState}.
+ * <p>
+ * The {@link Default} implementation always retuns the {@link GuardrailsConfig} parsed from {@code cassandra.yaml},
+ * but different implementations can return different configurations based on the specified {@link ClientState}.
+ * <p>
+ * Custom implementations can be specified at runtime with the system property {@link #CUSTOM_IMPLEMENTATION_PROPERTY}.
+ * These configurations can be used to read the guardrails configuration from some other source, and provide different
+ * configurations depending on the {@link ClientState} or some other factors. However, this mechanism for pluggability
+ * and the related {@link GuardrailsConfig} interface are not officially supported and may change in a minor release.
+ */
+public interface GuardrailsConfigProvider
+{
+    public static final String CUSTOM_IMPLEMENTATION_PROPERTY = "cassandra.custom_guardrails_config_provider_class";
+
+    static final GuardrailsConfigProvider instance = System.getProperty(CUSTOM_IMPLEMENTATION_PROPERTY) == null
+                                                     ? new Default()
+                                                     : build(System.getProperty(CUSTOM_IMPLEMENTATION_PROPERTY));
+
+    /**
+     * Returns the {@link GuardrailsConfig} to be used for the specified {@link ClientState}.
+     *
+     * @param state a client state, maybe {@code null} if the guardrails check for which we are getting the config is
+     *              for a background process that is not associated to a user query.
+     * @return the configuration to be used for {@code state}
+     */
+    GuardrailsConfig getOrCreate(@Nullable ClientState state);
+
+    /**
+     * Creates an instance of the custom guardrails config provider of the given class.
+     *
+     * @param customImpl the fully qualified classname of the guardrails config provider to be instantiated
+     * @return a new instance of the specified custom guardrails config provider of the given class.
+     */
+    static GuardrailsConfigProvider build(String customImpl)
+    {
+        return FBUtilities.construct(customImpl, "custom guardrails config provider");
+    }
+
+    /**
+     * Default implementation of {@link GuardrailsConfigProvider} that always returns the {@link GuardrailsConfig}
+     * parsed from {@code cassandra.yaml}, independently of the {@link ClientState}.
+     */
+    class Default implements GuardrailsConfigProvider
+    {
+        @Override
+        public GuardrailsConfig getOrCreate(@Nullable ClientState state)
+        {
+            return DatabaseDescriptor.getGuardrailsConfig();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/GuardrailsDiagnostics.java b/src/java/org/apache/cassandra/db/guardrails/GuardrailsDiagnostics.java
new file mode 100644
index 0000000..2905afa
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/GuardrailsDiagnostics.java
@@ -0,0 +1,63 @@
+/*
+ * 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.guardrails;
+
+import org.apache.cassandra.db.guardrails.GuardrailEvent.GuardrailEventType;
+import org.apache.cassandra.diag.DiagnosticEventService;
+
+/**
+ * Utility methods for {@link GuardrailEvent} activities.
+ */
+final class GuardrailsDiagnostics
+{
+    private static final DiagnosticEventService service = DiagnosticEventService.instance();
+
+    private GuardrailsDiagnostics()
+    {
+    }
+
+    /**
+     * Creates a new diagnostic event for the activation of the soft/warn limit of a guardrail.
+     *
+     * @param name    The name that identifies the activated guardrail.
+     * @param message The warning message emitted by the activated guardrail.
+     */
+    static void warned(String name, String message)
+    {
+        if (isEnabled(GuardrailEventType.WARNED))
+            service.publish(new GuardrailEvent(GuardrailEventType.WARNED, name, message));
+    }
+
+    /**
+     * Creates a new diagnostic event for the activation of the hard/fail limit of a guardrail.
+     *
+     * @param name    The name that identifies the activated guardrail.
+     * @param message The failure message emitted by the activated guardrail.
+     */
+    static void failed(String name, String message)
+    {
+        if (isEnabled(GuardrailEventType.FAILED))
+            service.publish(new GuardrailEvent(GuardrailEventType.FAILED, name, message));
+    }
+
+    private static boolean isEnabled(GuardrailEventType type)
+    {
+        return service.isEnabled(GuardrailEvent.class, type);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/GuardrailsMBean.java b/src/java/org/apache/cassandra/db/guardrails/GuardrailsMBean.java
new file mode 100644
index 0000000..ad2edda
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/GuardrailsMBean.java
@@ -0,0 +1,542 @@
+/*
+ * 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.guardrails;
+
+import java.util.Set;
+import javax.annotation.Nullable;
+
+/**
+ * JMX entrypoint for updating the default guardrails configuration parsed from {@code cassandra.yaml}.
+ * <p>
+ * This is different to just exposing {@link GuardrailsConfig} in that the methods here should be JMX-friendly.
+ *
+ * <p>For consistency, guardrails based on a simple numeric threshold should use the naming scheme
+ * {@code <whatIsGuarded>WarnThreshold} for soft limits and {@code <whatIsGuarded>FailThreshold} for hard
+ * ones, and if the value has a unit, that unit should be added at the end (for instance,
+ * {@code <whatIsGuarded>FailThresholdInKb}). For "boolean" guardrails that disable a feature, use
+ * {@code <whatIsGuardedEnabled}. Other type of guardrails can use appropriate suffixes but should start with
+ * {@code <whatIsGuarded>}.
+ */
+public interface GuardrailsMBean
+{
+    /**
+     * @return The threshold to warn when creating more user keyspaces than threshold.
+     * -1 means disabled.
+     */
+    int getKeyspacesWarnThreshold();
+
+    /**
+     * @return The threshold to prevent creating more user keyspaces than threshold.
+     * -1 means disabled.
+     */
+    int getKeyspacesFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when creating more user keyspaces than threshold. -1 means disabled.
+     * @param fail The threshold to prevent creating more user keyspaces than threshold. -1 means disabled.
+     */
+    void setKeyspacesThreshold(int warn, int fail);
+
+    /**
+     * @return The threshold to warn when creating more tables than threshold.
+     * -1 means disabled.
+     */
+    int getTablesWarnThreshold();
+
+    /**
+     * @return The threshold to prevent creating more tables than threshold.
+     * -1 means disabled.
+     */
+    int getTablesFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when creating more tables than threshold. -1 means disabled.
+     * @param fail The threshold to prevent creating more tables than threshold. -1 means disabled.
+     */
+    void setTablesThreshold(int warn, int fail);
+
+    /**
+     * @return The threshold to warn when having more columns per table than threshold.
+     * -1 means disabled.
+     */
+    int getColumnsPerTableWarnThreshold();
+
+    /**
+     * @return The threshold to prevent having more columns per table than threshold. -1 means disabled.
+     */
+    int getColumnsPerTableFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when having more columns per table than threshold. -1 means disabled.
+     * @param fail The threshold to prevent having more columns per table than threshold. -1 means disabled.
+     */
+    void setColumnsPerTableThreshold(int warn, int fail);
+
+    /**
+     * @return The threshold to warn when creating more secondary indexes per table than threshold. -1 means disabled.
+     */
+    int getSecondaryIndexesPerTableWarnThreshold();
+
+    /**
+     * @return The threshold to prevent creating more secondary indexes per table than threshold. -1 means disabled.
+     */
+    int getSecondaryIndexesPerTableFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when creating more secondary indexes per table than threshold. -1 means disabled.
+     * @param fail The threshold to prevent creating more secondary indexes per table than threshold. -1 means disabled.
+     */
+    void setSecondaryIndexesPerTableThreshold(int warn, int fail);
+
+    /**
+     * @return Whether secondary index creation is active or not on the node
+     */
+    boolean getSecondaryIndexesEnabled();
+
+    /**
+     * Enables or disables the ability to create secondary indexes
+     *
+     * @param enabled
+     */
+    void setSecondaryIndexesEnabled(boolean enabled);
+
+    /**
+     * @return The threshold to warn when creating more materialized views per table than threshold.
+     * -1 means disabled.
+     */
+    int getMaterializedViewsPerTableWarnThreshold();
+
+    /**
+     * @return The threshold to prevent creating more materialized views per table than threshold.
+     * -1 means disabled.
+     */
+    int getMaterializedViewsPerTableFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when creating more materialized views per table than threshold. -1 means disabled.
+     * @param fail The threshold to prevent creating more materialized views per table than threshold. -1 means disabled.
+     */
+    void setMaterializedViewsPerTableThreshold(int warn, int fail);
+
+    /**
+     * @return properties that are warned about when creating or altering a table.
+     */
+    Set<String> getTablePropertiesWarned();
+
+    /**
+     * @return Comma-separated list of properties that are warned about when creating or altering a table.
+     */
+    String getTablePropertiesWarnedCSV();
+
+    /**
+     * @param properties properties that are warned about when creating or altering a table.
+     */
+    void setTablePropertiesWarned(Set<String> properties);
+
+    /**
+     * @param properties Comma-separated list of properties that are warned about when creating or altering a table.
+     */
+    void setTablePropertiesWarnedCSV(String properties);
+
+    /**
+     * @return properties that are not allowed when creating or altering a table.
+     */
+    Set<String> getTablePropertiesDisallowed();
+
+    /**
+     * @return Comma-separated list of properties that are not allowed when creating or altering a table.
+     */
+    String getTablePropertiesDisallowedCSV();
+
+    /**
+     * @param properties properties that are not allowed when creating or altering a table.
+     */
+    void setTablePropertiesDisallowed(Set<String> properties);
+
+    /**
+     * @param properties Comma-separated list of properties that are not allowed when creating or altering a table.
+     */
+    void setTablePropertiesDisallowedCSV(String properties);
+
+    /**
+     * @return properties that are ignored when creating or altering a table.
+     */
+    Set<String> getTablePropertiesIgnored();
+
+    /**
+     * @return Comma-separated list of properties that are ignored when creating or altering a table.
+     */
+    String getTablePropertiesIgnoredCSV();
+
+    /**
+     * @param properties properties that are ignored when creating or altering a table.
+     */
+    void setTablePropertiesIgnored(Set<String> properties);
+
+    /**
+     * @param properties Comma-separated list of properties that are ignored when creating or altering a table.
+     */
+    void setTablePropertiesIgnoredCSV(String properties);
+
+    /**
+     * Returns whether user-provided timestamps are allowed.
+     *
+     * @return {@code true} if user-provided timestamps are allowed, {@code false} otherwise.
+     */
+    boolean getUserTimestampsEnabled();
+
+    /**
+     * Sets whether user-provided timestamps are allowed.
+     *
+     * @param enabled {@code true} if user-provided timestamps are allowed, {@code false} otherwise.
+     */
+    void setUserTimestampsEnabled(boolean enabled);
+
+    /**
+     * Returns whether ALLOW FILTERING property is allowed.
+     *
+     * @return {@code true} if ALLOW FILTERING is allowed, {@code false} otherwise.
+     */
+    boolean getAllowFilteringEnabled();
+
+    /**
+     * Sets whether ALLOW FILTERING is allowed.
+     *
+     * @param enabled {@code true} if ALLOW FILTERING is allowed, {@code false} otherwise.
+     */
+    void setAllowFilteringEnabled(boolean enabled);
+
+    /**
+     * Returns whether users can disable compression on tables
+     *
+     * @return {@code true} if users can disable compression on a table, {@code false} otherwise.
+     */
+    boolean getUncompressedTablesEnabled();
+
+    /**
+     * Sets whether users can disable compression on tables
+     *
+     * @param enabled {@code true} if users can disable compression on a table, {@code false} otherwise.
+     */
+    void setUncompressedTablesEnabled(boolean enabled);
+
+    /**
+     * Returns whether users can create new COMPACT STORAGE tables
+     *
+     * @return {@code true} if allowed, {@code false} otherwise.
+     */
+    boolean getCompactTablesEnabled();
+
+    /**
+     * Sets whether users can create new COMPACT STORAGE tables
+     *
+     * @param enabled {@code true} if allowed, {@code false} otherwise.
+     */
+    void setCompactTablesEnabled(boolean enabled);
+
+    /**
+     * Returns whether GROUP BY queries are allowed.
+     *
+     * @return {@code true} if allowed, {@code false} otherwise.
+     */
+    boolean getGroupByEnabled();
+
+    /**
+     * Sets whether GROUP BY queries are allowed.
+     *
+     * @param enabled {@code true} if allowed, {@code false} otherwise.
+     */
+    void setGroupByEnabled(boolean enabled);
+
+    /**
+     * Returns whether users can TRUNCATE or DROP TABLE
+     *
+     * @return {@code true} if allowed, {@code false} otherwise.
+     */
+    boolean getDropTruncateTableEnabled();
+
+    /**
+     * Sets whether users can TRUNCATE or DROP TABLE
+     */
+    void setDropTruncateTableEnabled(boolean enabled);
+
+    /**
+     * @return The threshold to warn when requested page size greater than threshold.
+     * -1 means disabled.
+     */
+    int getPageSizeWarnThreshold();
+
+    /**
+     * @return The threshold to prevent requesting page with more elements than threshold.
+     * -1 means disabled.
+     */
+    int getPageSizeFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when the requested page size is greater than threshold. -1 means disabled.
+     * @param fail The threshold to prevent requesting pages with more elements than threshold. -1 means disabled.
+     */
+    void setPageSizeThreshold(int warn, int fail);
+
+    /**
+     * Returns whether list operations that require read before write are allowed.
+     *
+     * @return {@code true} if list operations that require read before write are allowed, {@code false} otherwise.
+     */
+    boolean getReadBeforeWriteListOperationsEnabled();
+
+    /**
+     * Sets whether list operations that require read before write are allowed.
+     *
+     * @param enabled {@code true} if list operations that require read before write are allowed, {@code false} otherwise.
+     */
+    void setReadBeforeWriteListOperationsEnabled(boolean enabled);
+
+    /**
+     * @return The threshold to warn when the number of partition keys in a select statement greater than threshold.
+     * -1 means disabled.
+     */
+    int getPartitionKeysInSelectWarnThreshold();
+
+    /**
+     * @return The threshold to fail when the number of partition keys in a select statement greater than threshold.
+     * -1 means disabled.
+     */
+    int getPartitionKeysInSelectFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when the number of partition keys in a select statement is greater than
+     *             threshold -1 means disabled.
+     * @param fail The threshold to prevent when the number of partition keys in a select statement is more than
+     *             threshold -1 means disabled.
+     */
+    void setPartitionKeysInSelectThreshold(int warn, int fail);
+
+    /**
+     * @return The threshold to warn when an IN query creates a cartesian product with a size exceeding threshold.
+     * -1 means disabled.
+     */
+    public int getInSelectCartesianProductWarnThreshold();
+
+    /**
+     * @return The threshold to prevent IN queries creating a cartesian product with a size exceeding threshold.
+     * -1 means disabled.
+     */
+    public int getInSelectCartesianProductFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when an IN query creates a cartesian product with a size exceeding threshold.
+     *             -1 means disabled.
+     * @param fail The threshold to prevent IN queries creating a cartesian product with a size exceeding threshold.
+     *             -1 means disabled.
+     */
+    public void setInSelectCartesianProductThreshold(int warn, int fail);
+
+    /**
+     * @return consistency levels that are warned about when reading.
+     */
+    Set<String> getReadConsistencyLevelsWarned();
+
+    /**
+     * @return Comma-separated list of consistency levels that are warned about when reading.
+     */
+    String getReadConsistencyLevelsWarnedCSV();
+
+    /**
+     * @param consistencyLevels consistency levels that are warned about when reading.
+     */
+    void setReadConsistencyLevelsWarned(Set<String> consistencyLevels);
+
+    /**
+     * @param consistencyLevels Comma-separated list of consistency levels that are warned about when reading.
+     */
+    void setReadConsistencyLevelsWarnedCSV(String consistencyLevels);
+
+    /**
+     * @return consistency levels that are not allowed when reading.
+     */
+    Set<String> getReadConsistencyLevelsDisallowed();
+
+    /**
+     * @return Comma-separated list of consistency levels that are not allowed when reading.
+     */
+    String getReadConsistencyLevelsDisallowedCSV();
+
+    /**
+     * @param consistencyLevels consistency levels that are not allowed when reading.
+     */
+    void setReadConsistencyLevelsDisallowed(Set<String> consistencyLevels);
+
+    /**
+     * @param consistencyLevels Comma-separated list of consistency levels that are not allowed when reading.
+     */
+    void setReadConsistencyLevelsDisallowedCSV(String consistencyLevels);
+
+    /**
+     * @return consistency levels that are warned about when writing.
+     */
+    Set<String> getWriteConsistencyLevelsWarned();
+
+    /**
+     * @return Comma-separated list of consistency levels that are warned about when writing.
+     */
+    String getWriteConsistencyLevelsWarnedCSV();
+
+    /**
+     * @param consistencyLevels consistency levels that are warned about when writing.
+     */
+    void setWriteConsistencyLevelsWarned(Set<String> consistencyLevels);
+
+    /**
+     * @param consistencyLevels Comma-separated list of consistency levels that are warned about when writing.
+     */
+    void setWriteConsistencyLevelsWarnedCSV(String consistencyLevels);
+
+    /**
+     * @return consistency levels that are not allowed when writing.
+     */
+    Set<String> getWriteConsistencyLevelsDisallowed();
+
+    /**
+     * @return Comma-separated list of consistency levels that are not allowed when writing.
+     */
+    String getWriteConsistencyLevelsDisallowedCSV();
+
+    /**
+     * @param consistencyLevels consistency levels that are not allowed when writing.
+     */
+    void setWriteConsistencyLevelsDisallowed(Set<String> consistencyLevels);
+
+    /**
+     * @param consistencyLevels Comma-separated list of consistency levels that are not allowed when writing.
+     */
+    void setWriteConsistencyLevelsDisallowedCSV(String consistencyLevels);
+
+    /**
+     * @return The threshold to warn when encountering larger size of collection data than threshold, as a string
+     * formatted as in, for example, {@code 10GiB}, {@code 20MiB}, {@code 30KiB} or {@code 40B}.  A {@code null} value
+     * means that the threshold is disabled.
+     */
+    @Nullable
+    String getCollectionSizeWarnThreshold();
+
+    /**
+     * @return The threshold to prevent collections with larger data size than threshold, as a string formatted as in,
+     * for example, {@code 10GiB}, {@code 20MiB}, {@code 30KiB} or {@code 40B}. A {@code null} value means that the
+     * threshold is disabled.
+     */
+    @Nullable
+    String getCollectionSizeFailThreshold();
+
+    /**
+     * @param warnSize The threshold to warn when encountering larger size of collection data than threshold, as a
+     *                 string formatted as in, for example, {@code 10GiB}, {@code 20MiB}, {@code 30KiB} or {@code 40B}.
+     *                 A {@code null} value means disabled.
+     * @param failSize The threshold to prevent collections with larger data size than threshold, as a string formatted
+     *                 as in, for example, {@code 10GiB}, {@code 20MiB}, {@code 30KiB} or {@code 40B}. A {@code null}
+     *                 value means disabled.
+     */
+    void setCollectionSizeThreshold(@Nullable String warnSize, @Nullable String failSize);
+
+    /**
+     * @return The threshold to warn when encountering more elements in a collection than threshold.
+     */
+    int getItemsPerCollectionWarnThreshold();
+
+    /**
+     * @return The threshold to prevent collections with more elements than threshold.
+     */
+    int getItemsPerCollectionFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when encountering more elements in a collection than threshold.
+     * @param fail The threshold to prevent collectiosn with more elements than threshold.
+     */
+    void setItemsPerCollectionThreshold(int warn, int fail);
+
+    /**
+     * @return The threshold to warn when creating a UDT with more fields than threshold. -1 means disabled.
+     */
+    int getFieldsPerUDTWarnThreshold();
+
+    /**
+     * @return The threshold to fail when creating a UDT with more fields than threshold. -1 means disabled.
+     */
+    int getFieldsPerUDTFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when creating a UDT with more fields than threshold. -1 means disabled.
+     * @param fail The threshold to prevent creating a UDT with more fields than threshold. -1 means disabled.
+     */
+    void setFieldsPerUDTThreshold(int warn, int fail);
+
+    /**
+     * @return The threshold to warn when local data disk usage percentage exceeds that threshold.
+     * Allowed values are in the range {@code [1, 100]}, and -1 means disabled.
+     */
+    int getDataDiskUsagePercentageWarnThreshold();
+
+    /**
+     * @return The threshold to fail when local data disk usage percentage exceeds that threshold.
+     * Allowed values are in the range {@code [1, 100]}, and -1 means disabled.
+     */
+    int getDataDiskUsagePercentageFailThreshold();
+
+    /**
+     * @param warn The threshold to warn when local disk usage percentage exceeds that threshold.
+     *             Allowed values are in the range {@code [1, 100]}, and -1 means disabled.
+     * @param fail The threshold to fail when local disk usage percentage exceeds that threshold.
+     *             Allowed values are in the range {@code [1, 100]}, and -1 means disabled.
+     */
+    public void setDataDiskUsagePercentageThreshold(int warn, int fail);
+
+    /**
+     * @return The max disk size of the data directories when calculating disk usage thresholds, as a string formatted
+     * as in, for example, {@code 10GiB}, {@code 20MiB}, {@code 30KiB} or {@code 40B}. A {@code null} value means
+     * disabled.
+     */
+    @Nullable
+    String getDataDiskUsageMaxDiskSize();
+
+    /**
+     * @param size The max disk size of the data directories when calculating disk usage thresholds, as a string
+     *             formatted as in, for example, {@code 10GiB}, {@code 20MiB}, {@code 30KiB} or {@code 40B}.
+     *             A {@code null} value means disabled.
+     */
+    void setDataDiskUsageMaxDiskSize(@Nullable String size);
+
+    /**
+     * @return The threshold to warn when replication factor is lesser threshold.
+     */
+    int getMinimumReplicationFactorWarnThreshold();
+
+    /**
+     * @return The threshold to fail when replication factor is lesser threshold.
+     */
+    int getMinimumReplicationFactorFailThreshold();
+
+    /**
+     * @param warn the threshold to warn when the minimum replication factor is lesser than
+     *             threshold -1 means disabled.
+     * @param fail the threshold to fail when the minimum replication factor is lesser than
+     *             threshold -1 means disabled.
+     */
+    void setMinimumReplicationFactorThreshold (int warn, int fail);
+
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/MaxThreshold.java b/src/java/org/apache/cassandra/db/guardrails/MaxThreshold.java
new file mode 100644
index 0000000..badaff7
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/MaxThreshold.java
@@ -0,0 +1,65 @@
+/*
+ * 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.guardrails;
+
+import java.util.function.ToLongFunction;
+import org.apache.cassandra.service.ClientState;
+
+/**
+ * {@link MaxThreshold} for maximum guardrails, the value is checked to see if it is greater than the warn and fail thresholds.
+ */
+public class MaxThreshold extends Threshold
+{
+    /**
+     * Creates a new threshold guardrail.
+     *
+     * @param name            the identifying name of the guardrail
+     * @param warnThreshold   a {@link ClientState}-based provider of the value above which a warning should be triggered.
+     * @param failThreshold   a {@link ClientState}-based provider of the value above which the operation should be aborted.
+     * @param messageProvider a function to generate the warning or error message if the guardrail is triggered
+     */
+    public MaxThreshold(String name,
+                        ToLongFunction<ClientState> warnThreshold,
+                        ToLongFunction<ClientState> failThreshold,
+                        Threshold.ErrorMessageProvider messageProvider)
+    {
+        super(name, warnThreshold, failThreshold, messageProvider);
+    }
+
+    @Override
+    protected boolean compare(long value, long threshold)
+    {
+        return value > threshold;
+    }
+
+    @Override
+    protected long failValue(ClientState state)
+    {
+        long failValue = failThreshold.applyAsLong(state);
+        return failValue <= 0 ? Long.MAX_VALUE : failValue;
+    }
+
+    @Override
+    protected long warnValue(ClientState state)
+    {
+        long warnValue = warnThreshold.applyAsLong(state);
+        return warnValue <= 0 ? Long.MAX_VALUE : warnValue;
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/MinThreshold.java b/src/java/org/apache/cassandra/db/guardrails/MinThreshold.java
new file mode 100644
index 0000000..427f277
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/MinThreshold.java
@@ -0,0 +1,65 @@
+/*
+ * 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.guardrails;
+
+import java.util.function.ToLongFunction;
+import org.apache.cassandra.service.ClientState;
+
+/**
+ * {@link MinThreshold} for minimum guardrails, the value is checked to see if it is lesser than the warn and fail thresholds.
+ */
+public class MinThreshold extends Threshold
+{
+    /**
+     * Creates a new minimum threshold guardrail.
+     *
+     * @param name            the identifying name of the guardrail
+     * @param warnThreshold   a {@link ClientState}-based provider of the value above which a warning should be triggered.
+     * @param failThreshold   a {@link ClientState}-based provider of the value above which the operation should be aborted.
+     * @param messageProvider a function to generate the warning or error message if the guardrail is triggered
+     */
+    public MinThreshold(String name,
+                        ToLongFunction<ClientState> warnThreshold,
+                        ToLongFunction<ClientState> failThreshold,
+                        Threshold.ErrorMessageProvider messageProvider)
+    {
+        super(name, warnThreshold, failThreshold, messageProvider);
+    }
+
+    @Override
+    protected boolean compare(long value, long threshold)
+    {
+        return value < threshold;
+    }
+
+    @Override
+    protected long failValue(ClientState state)
+    {
+        long failValue = failThreshold.applyAsLong(state);
+        return failValue <= 0 ? Long.MIN_VALUE : failValue;
+    }
+
+    @Override
+    protected long warnValue(ClientState state)
+    {
+        long warnValue = warnThreshold.applyAsLong(state);
+        return warnValue <= 0 ? Long.MIN_VALUE : warnValue;
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/PercentageThreshold.java b/src/java/org/apache/cassandra/db/guardrails/PercentageThreshold.java
new file mode 100644
index 0000000..6f866c6
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/PercentageThreshold.java
@@ -0,0 +1,56 @@
+/*
+ * 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.guardrails;
+
+import java.util.function.ToLongFunction;
+
+import org.apache.cassandra.service.ClientState;
+
+/**
+ * A {@link Threshold} guardrail whose values represent a percentage
+ * <p>
+ * This works exactly as a {@link Threshold}, but provides slightly more convenient error messages for percentage
+ */
+public class PercentageThreshold extends MaxThreshold
+{
+    /**
+     * Creates a new threshold guardrail.
+     *
+     * @param name            the identifying name of the guardrail
+     * @param warnThreshold   a {@link ClientState}-based provider of the value above which a warning should be triggered.
+     * @param failThreshold   a {@link ClientState}-based provider of the value above which the operation should be aborted.
+     * @param messageProvider a function to generate the warning or error message if the guardrail is triggered
+     */
+    public PercentageThreshold(String name,
+                               ToLongFunction<ClientState> warnThreshold,
+                               ToLongFunction<ClientState> failThreshold,
+                               ErrorMessageProvider messageProvider)
+    {
+        super(name, warnThreshold, failThreshold, messageProvider);
+    }
+
+    @Override
+    protected String errMsg(boolean isWarning, String what, long value, long thresholdValue)
+    {
+        return messageProvider.createMessage(isWarning,
+                                             what,
+                                             String.format("%d%%", value),
+                                             String.format("%d%%", thresholdValue));
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/Predicates.java b/src/java/org/apache/cassandra/db/guardrails/Predicates.java
new file mode 100644
index 0000000..13be9e9
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/Predicates.java
@@ -0,0 +1,93 @@
+/*
+ * 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.guardrails;
+
+import java.util.function.Function;
+import java.util.function.Predicate;
+import javax.annotation.Nullable;
+
+import org.apache.cassandra.service.ClientState;
+
+/**
+ * A guardrail based on two predicates.
+ *
+ * <p>A {@link Predicates} guardrail defines (up to) 2 predicates, one at which a warning is issued, and another one
+ * at which a failure is triggered. If failure is triggered, warning is skipped.
+ *
+ * @param <T> the type of the values to be tested against predicates.
+ */
+public class Predicates<T> extends Guardrail
+{
+    private final Function<ClientState, Predicate<T>> warnPredicate;
+    private final Function<ClientState, Predicate<T>> failurePredicate;
+    private final MessageProvider<T> messageProvider;
+
+    /**
+     * A function used to build the warning or error message of a triggered {@link Predicates} guardrail.
+     */
+    public interface MessageProvider<T>
+    {
+        /**
+         * Called when the guardrail is triggered to build the corresponding message.
+         *
+         * @param isWarning whether the trigger is a warning one; otherwise it is failure one.
+         * @param value     the value that triggers guardrail.
+         */
+        String createMessage(boolean isWarning, T value);
+    }
+
+    /**
+     * Creates a new {@link Predicates} guardrail.
+     *
+     * @param name             the identifying name of the guardrail
+     * @param warnPredicate    a {@link ClientState}-based predicate provider that is used to check if given value should trigger a warning.
+     * @param failurePredicate a {@link ClientState}-based predicate provider that is used to check if given value should trigger a failure.
+     * @param messageProvider  a function to generate the warning or error message if the guardrail is triggered
+     */
+    Predicates(String name,
+               Function<ClientState, Predicate<T>> warnPredicate,
+               Function<ClientState, Predicate<T>> failurePredicate,
+               MessageProvider<T> messageProvider)
+    {
+        super(name);
+        this.warnPredicate = warnPredicate;
+        this.failurePredicate = failurePredicate;
+        this.messageProvider = messageProvider;
+    }
+
+    /**
+     * Apply the guardrail to the provided value, triggering a warning or failure if appropriate.
+     *
+     * @param value the value to check.
+     */
+    public void guard(T value, @Nullable ClientState state)
+    {
+        if (!enabled(state))
+            return;
+
+        if (failurePredicate.apply(state).test(value))
+        {
+            fail(messageProvider.createMessage(false, value), state);
+        }
+        else if (warnPredicate.apply(state).test(value))
+        {
+            warn(messageProvider.createMessage(true, value));
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/guardrails/Threshold.java b/src/java/org/apache/cassandra/db/guardrails/Threshold.java
new file mode 100644
index 0000000..b671907
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/Threshold.java
@@ -0,0 +1,171 @@
+/*
+ * 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.guardrails;
+
+import java.util.function.ToLongFunction;
+import javax.annotation.Nullable;
+
+import org.apache.cassandra.service.ClientState;
+
+/**
+ * A guardrail based on numeric threshold(s).
+ *
+ * <p>A {@link Threshold} guardrail defines (up to) 2 thresholds, one at which a warning is issued, and a lower one
+ * at which the operation is aborted with an exception. Only one of those thresholds can be activated if desired.
+ *
+ * <p>This guardrail only handles guarding positive values.
+ */
+public abstract class Threshold extends Guardrail
+{
+    protected ToLongFunction<ClientState> warnThreshold;
+    protected ToLongFunction<ClientState> failThreshold;
+    protected final ErrorMessageProvider messageProvider;
+
+    /**
+     * Creates a new threshold guardrail.
+     *
+     * @param name            the identifying name of the guardrail
+     * @param warnThreshold   a {@link ClientState}-based provider of the value above which a warning should be triggered.
+     * @param failThreshold   a {@link ClientState}-based provider of the value above which the operation should be aborted.
+     * @param messageProvider a function to generate the warning or error message if the guardrail is triggered
+     */
+    public Threshold(String name,
+                     ToLongFunction<ClientState> warnThreshold,
+                     ToLongFunction<ClientState> failThreshold,
+                     ErrorMessageProvider messageProvider)
+    {
+        super(name);
+        this.warnThreshold = warnThreshold;
+        this.failThreshold = failThreshold;
+        this.messageProvider = messageProvider;
+    }
+
+    protected abstract boolean compare(long value, long threshold);
+
+    protected String errMsg(boolean isWarning, String what, long value, long thresholdValue)
+    {
+        return messageProvider.createMessage(isWarning,
+                                             what,
+                                             Long.toString(value),
+                                             Long.toString(thresholdValue));
+    }
+
+    private String redactedErrMsg(boolean isWarning, long value, long thresholdValue)
+    {
+        return errMsg(isWarning, REDACTED, value, thresholdValue);
+    }
+
+    protected abstract long failValue(ClientState state);
+
+    protected abstract long warnValue(ClientState state);
+
+    public boolean enabled(@Nullable ClientState state)
+    {
+        if (!super.enabled(state))
+            return false;
+
+        return failThreshold.applyAsLong(state) > 0 || warnThreshold.applyAsLong(state) > 0;
+    }
+
+    /**
+     * Checks whether the provided value would trigger a warning or failure if passed to {@link #guard}.
+     *
+     * <p>This method is optional (does not have to be called) but can be used in the case where the "what"
+     * argument to {@link #guard} is expensive to build to save doing so in the common case (of the guardrail
+     * not being triggered).
+     *
+     * @param value the value to test.
+     * @param state The client state, used to skip the check if the query is internal or is done by a superuser.
+     *              A {@code null} value means that the check should be done regardless of the query.
+     * @return {@code true} if {@code value} is above the warning or failure thresholds of this guardrail,
+     * {@code false otherwise}.
+     */
+    public boolean triggersOn(long value, @Nullable ClientState state)
+    {
+        return enabled(state) && (compare(value, warnValue(state)) || compare(value, failValue(state)));
+    }
+
+    public boolean warnsOn(long value, @Nullable ClientState state)
+    {
+        return enabled(state) && compare(value, warnValue(state));
+    }
+
+    public boolean failsOn(long value, @Nullable ClientState state)
+    {
+        return enabled(state) && compare(value, failValue(state));
+    }
+
+    /**
+     * Apply the guardrail to the provided value, warning or failing if appropriate.
+     *
+     * @param value            The value to check.
+     * @param what             A string describing what {@code value} is a value of. This is used in the error message
+     *                         if the guardrail is triggered. For instance, say the guardrail guards the size of column
+     *                         values, then this argument must describe which column of which row is triggering the
+     *                         guardrail for convenience.
+     * @param containsUserData whether the {@code what} contains user data that should be redacted on external systems.
+     * @param state            The client state, used to skip the check if the query is internal or is done by a superuser.
+     *                         A {@code null} value means that the check should be done regardless of the query.
+     */
+    public void guard(long value, String what, boolean containsUserData, @Nullable ClientState state)
+    {
+        if (!enabled(state))
+            return;
+
+        long failValue = failValue(state);
+        if (compare(value, failValue))
+        {
+            triggerFail(value, failValue, what, containsUserData, state);
+            return;
+        }
+
+        long warnValue = warnValue(state);
+        if (compare(value, warnValue))
+            triggerWarn(value, warnValue, what, containsUserData);
+    }
+
+    private void triggerFail(long value, long failValue, String what, boolean containsUserData, ClientState state)
+    {
+        String fullMessage = errMsg(false, what, value, failValue);
+        fail(fullMessage, containsUserData ? redactedErrMsg(false, value, failValue) : fullMessage, state);
+    }
+
+    private void triggerWarn(long value, long warnValue, String what, boolean containsUserData)
+    {
+        String fullMessage = errMsg(true, what, value, warnValue);
+        warn(fullMessage, containsUserData ? redactedErrMsg(true, value, warnValue) : fullMessage);
+    }
+
+    /**
+     * A function used to build the error message of a triggered {@link Threshold} guardrail.
+     */
+    interface ErrorMessageProvider
+    {
+        /**
+         * Called when the guardrail is triggered to build the corresponding error message.
+         *
+         * @param isWarning Whether the trigger is a warning one; otherwise it is a failure one.
+         * @param what      A string, provided by the call to the {@link #guard} method, describing what the guardrail
+         *                  has been applied to (and that has triggered it).
+         * @param value     The value that triggered the guardrail (as a string).
+         * @param threshold The threshold that was passed to trigger the guardrail (as a string).
+         */
+        String createMessage(boolean isWarning, String what, String value, String threshold);
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/db/guardrails/Values.java b/src/java/org/apache/cassandra/db/guardrails/Values.java
new file mode 100644
index 0000000..f46e3af
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/guardrails/Values.java
@@ -0,0 +1,127 @@
+/*
+ * 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.guardrails;
+
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+import com.google.common.collect.Sets;
+
+import org.apache.cassandra.service.ClientState;
+
+import static java.lang.String.format;
+
+/**
+ * A guardrail that warns about some specific values, warns about but ignores some other values, and/or rejects the use
+ * of some other values.
+ *
+ * @param <T> The type of the values of which certain are warned, ignored and/or disallowed.
+ */
+public class Values<T> extends Guardrail
+{
+    private final Function<ClientState, Set<T>> warnedValues;
+    private final Function<ClientState, Set<T>> ignoredValues;
+    private final Function<ClientState, Set<T>> disallowedValues;
+    private final String what;
+
+    /**
+     * Creates a new values guardrail.
+     *
+     * @param name             the identifying name of the guardrail
+     * @param warnedValues     a {@link ClientState}-based provider of the values for which a warning is triggered.
+     * @param ignoredValues    a {@link ClientState}-based provider of the values that are ignored.
+     * @param disallowedValues a {@link ClientState}-based provider of the values that are disallowed.
+     * @param what             The feature that is guarded by this guardrail (for reporting in error messages).
+     */
+    public Values(String name,
+                  Function<ClientState, Set<T>> warnedValues,
+                  Function<ClientState, Set<T>> ignoredValues,
+                  Function<ClientState, Set<T>> disallowedValues,
+                  String what)
+    {
+        super(name);
+        this.warnedValues = warnedValues;
+        this.ignoredValues = ignoredValues;
+        this.disallowedValues = disallowedValues;
+        this.what = what;
+    }
+
+    /**
+     * Triggers a warning for each of the provided values that is discouraged by this guardrail. If any of the values
+     * is disallowed it will abort the operation.
+     * <p>
+     * This assumes that there aren't any values to be ignored, thus it doesn't require an ignore action. If this is
+     * not the case and the provided value is set up to be ignored this will throw an assertion error.
+     *
+     * @param values The values to check.
+     * @param state  The client state, used to skip the check if the query is internal or is done by a superuser.
+     *               A {@code null} value means that the check should be done regardless of the query.
+     */
+    public void guard(Set<T> values, @Nullable ClientState state)
+    {
+        guard(values, x -> {
+            throw new AssertionError(format("There isn't an ignore action for %s, but value %s is setup to be ignored",
+                                            what, x));
+        }, state);
+    }
+
+    /**
+     * Triggers a warning for each of the provided values that is discouraged by this guardrail. Also triggers a warning
+     * for each of the provided values that is ignored by this guardrail and triggers the provided action to ignore it.
+     * If any of the values is disallowed it will abort the operation.
+     *
+     * @param values       The values to check.
+     * @param ignoreAction An action called on the subset of {@code values} that should be ignored. This action
+     *                     should do whatever is necessary to make sure the value is ignored.
+     * @param state        The client state, used to skip the check if the query is internal or is done by a superuser.
+     *                     A {@code null} value means that the check should be done regardless of the query, although it
+     *                     won't throw any exception if the failure threshold is exceeded. This is so because checks
+     *                     without an associated client come from asynchronous processes such as compaction, and we
+     *                     don't want to interrupt such processes.
+     */
+    public void guard(Set<T> values, Consumer<T> ignoreAction, @Nullable ClientState state)
+    {
+        if (!enabled(state))
+            return;
+
+        Set<T> disallowed = disallowedValues.apply(state);
+        Set<T> toDisallow = Sets.intersection(values, disallowed);
+        if (!toDisallow.isEmpty())
+            fail(format("Provided values %s are not allowed for %s (disallowed values are: %s)",
+                        toDisallow.stream().sorted().collect(Collectors.toList()), what, disallowed), state);
+
+        Set<T> ignored = ignoredValues.apply(state);
+        Set<T> toIgnore = Sets.intersection(values, ignored);
+        if (!toIgnore.isEmpty())
+        {
+            warn(format("Ignoring provided values %s as they are not supported for %s (ignored values are: %s)",
+                        toIgnore.stream().sorted().collect(Collectors.toList()), what, ignored));
+            toIgnore.forEach(ignoreAction);
+        }
+
+        Set<T> warned = warnedValues.apply(state);
+        Set<T> toWarn = Sets.intersection(values, warned);
+        if (!toWarn.isEmpty())
+            warn(format("Provided values %s are not recommended for %s (warned values are: %s)",
+                        toWarn.stream().sorted().collect(Collectors.toList()), what, warned));
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/lifecycle/ILifecycleTransaction.java b/src/java/org/apache/cassandra/db/lifecycle/ILifecycleTransaction.java
index 3de0a35..c014e38 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/ILifecycleTransaction.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/ILifecycleTransaction.java
@@ -21,7 +21,6 @@
 import java.util.Collection;
 import java.util.Set;
 
-import org.apache.cassandra.io.sstable.SSTable;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LifecycleTransaction.java b/src/java/org/apache/cassandra/db/lifecycle/LifecycleTransaction.java
index 574c6a4..d3f3a1e 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LifecycleTransaction.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LifecycleTransaction.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
 import java.nio.file.Path;
 import java.util.*;
 import java.util.function.BiPredicate;
@@ -25,6 +24,7 @@
 import com.google.common.base.Predicate;
 import com.google.common.collect.*;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,6 +36,7 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableReader.UniqueIdentifier;
 import org.apache.cassandra.utils.Throwables;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
 import static com.google.common.base.Functions.compose;
@@ -142,7 +143,7 @@
     public static LifecycleTransaction offline(OperationType operationType, Iterable<SSTableReader> readers)
     {
         // if offline, for simplicity we just use a dummy tracker
-        Tracker dummy = new Tracker(null, false);
+        Tracker dummy = Tracker.newDummyTracker();
         dummy.addInitialSSTables(readers);
         dummy.apply(updateCompacting(emptySet(), readers));
         return new LifecycleTransaction(dummy, operationType, readers);
@@ -154,7 +155,7 @@
     @SuppressWarnings("resource") // log closed during postCleanup
     public static LifecycleTransaction offline(OperationType operationType)
     {
-        Tracker dummy = new Tracker(null, false);
+        Tracker dummy = Tracker.newDummyTracker();
         return new LifecycleTransaction(dummy, new LogTransaction(operationType, dummy), Collections.emptyList());
     }
 
@@ -187,7 +188,7 @@
         return log.type();
     }
 
-    public UUID opId()
+    public TimeUUID opId()
     {
         return log.id();
     }
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java b/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
index 254966e..120f9bc 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogAwareFileLister.java
@@ -20,7 +20,6 @@
  */
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
@@ -32,6 +31,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -106,7 +106,7 @@
         try
         {
             return StreamSupport.stream(stream.spliterator(), false)
-                                .map(Path::toFile)
+                                .map(File::new)
                                 .filter((f) -> !f.isDirectory())
                                 .collect(Collectors.toList());
         }
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogFile.java b/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
index 9053034..11e3ffb 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogFile.java
@@ -20,7 +20,6 @@
  */
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
 import java.nio.file.Path;
 import java.util.*;
 import java.util.regex.Matcher;
@@ -30,6 +29,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Iterables;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,7 +40,9 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.big.BigFormat;
 import org.apache.cassandra.utils.Throwables;
+import org.apache.cassandra.utils.TimeUUID;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.apache.cassandra.utils.Throwables.merge;
 
 /**
@@ -73,11 +75,11 @@
     private final OperationType type;
 
     // The unique id of the transaction
-    private final UUID id;
+    private final TimeUUID id;
 
     static LogFile make(File logReplica)
     {
-        return make(logReplica.getName(), Collections.singletonList(logReplica));
+        return make(logReplica.name(), Collections.singletonList(logReplica));
     }
 
     static LogFile make(String fileName, List<File> logReplicas)
@@ -91,7 +93,7 @@
         //String version = matcher.group(1);
 
         OperationType operationType = OperationType.fromFileName(matcher.group(2));
-        UUID id = UUID.fromString(matcher.group(3));
+        TimeUUID id = TimeUUID.fromString(matcher.group(3));
 
         return new LogFile(operationType, id, logReplicas);
     }
@@ -106,7 +108,7 @@
         return type;
     }
 
-    UUID id()
+    TimeUUID id()
     {
         return id;
     }
@@ -139,16 +141,16 @@
 
     static boolean isLogFile(File file)
     {
-        return LogFile.FILE_REGEX.matcher(file.getName()).matches();
+        return LogFile.FILE_REGEX.matcher(file.name()).matches();
     }
 
-    LogFile(OperationType type, UUID id, List<File> replicas)
+    LogFile(OperationType type, TimeUUID id, List<File> replicas)
     {
         this(type, id);
         this.replicas.addReplicas(replicas);
     }
 
-    LogFile(OperationType type, UUID id)
+    LogFile(OperationType type, TimeUUID id)
     {
         this.type = type;
         this.id = id;
@@ -275,12 +277,12 @@
 
     void commit()
     {
-        addRecord(LogRecord.makeCommit(System.currentTimeMillis()));
+        addRecord(LogRecord.makeCommit(currentTimeMillis()));
     }
 
     void abort()
     {
-        addRecord(LogRecord.makeAbort(System.currentTimeMillis()));
+        addRecord(LogRecord.makeAbort(currentTimeMillis()));
     }
 
     private boolean isLastRecordValidWithType(Type type)
@@ -347,7 +349,7 @@
     private void maybeCreateReplica(SSTable sstable)
     {
         File directory = sstable.descriptor.directory;
-        String fileName = StringUtils.join(directory, File.separator, getFileName());
+        String fileName = StringUtils.join(directory, File.pathSeparator(), getFileName());
         replicas.maybeCreateReplica(directory, fileName, onDiskRecords);
     }
 
@@ -443,7 +445,7 @@
     private static Set<File> getRecordFiles(NavigableSet<File> files, LogRecord record)
     {
         String fileName = record.fileName();
-        return files.stream().filter(f -> f.getName().startsWith(fileName)).collect(Collectors.toSet());
+        return files.stream().filter(f -> f.name().startsWith(fileName)).collect(Collectors.toSet());
     }
 
     boolean exists()
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogRecord.java b/src/java/org/apache/cassandra/db/lifecycle/LogRecord.java
index 513ad87..45653c4 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogRecord.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogRecord.java
@@ -20,11 +20,10 @@
  */
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
-import java.io.FilenameFilter;
+
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.*;
+import java.util.function.BiPredicate;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -33,7 +32,9 @@
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.SSTable;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.PathUtils;
 import org.apache.cassandra.utils.FBUtilities;
 
 /**
@@ -283,8 +284,8 @@
 
     public static List<File> getExistingFiles(String absoluteFilePath)
     {
-        Path path = Paths.get(absoluteFilePath);
-        File[] files = path.getParent().toFile().listFiles((dir, name) -> name.startsWith(path.getFileName().toString()));
+        File file = new File(absoluteFilePath);
+        File[] files = file.parent().tryList((dir, name) -> name.startsWith(file.name()));
         // files may be null if the directory does not exist yet, e.g. when tracking new files
         return files == null ? Collections.emptyList() : Arrays.asList(files);
     }
@@ -302,13 +303,13 @@
         Map<File, TreeSet<String>> dirToFileNamePrefix = new HashMap<>();
         for (String absolutePath : absoluteFilePaths)
         {
-            Path fullPath = Paths.get(absolutePath);
+            Path fullPath = new File(absolutePath).toPath();
             Path path = fullPath.getParent();
             if (path != null)
-                dirToFileNamePrefix.computeIfAbsent(path.toFile(), (k) -> new TreeSet<>()).add(fullPath.getFileName().toString());
+                dirToFileNamePrefix.computeIfAbsent(new File(path), (k) -> new TreeSet<>()).add(fullPath.getFileName().toString());
         }
 
-        FilenameFilter ff = (dir, name) -> {
+        BiPredicate<File, String> ff = (dir, name) -> {
             TreeSet<String> dirSet = dirToFileNamePrefix.get(dir);
             // if the set contains a prefix of the current file name, the file name we have here should sort directly
             // after the prefix in the tree set, which means we can use 'floor' to get the prefix (returns the largest
@@ -317,7 +318,7 @@
             String baseName = dirSet.floor(name);
             if (baseName != null && name.startsWith(baseName))
             {
-                String absolutePath = new File(dir, baseName).getPath();
+                String absolutePath = new File(dir, baseName).path();
                 fileMap.computeIfAbsent(absolutePath, k -> new ArrayList<>()).add(new File(dir, name));
             }
             return false;
@@ -325,7 +326,7 @@
 
         // populate the file map:
         for (File f : dirToFileNamePrefix.keySet())
-            f.listFiles(ff);
+            f.tryList(ff);
 
         return fileMap;
     }
@@ -338,14 +339,12 @@
 
     String fileName()
     {
-        return absolutePath.isPresent() ? Paths.get(absolutePath.get()).getFileName().toString() : "";
+        return absolutePath.isPresent() ? new File(absolutePath.get()).name() : "";
     }
 
     boolean isInFolder(Path folder)
     {
-        return absolutePath.isPresent()
-               ? FileUtils.isContained(folder.toFile(), Paths.get(absolutePath.get()).toFile())
-               : false;
+        return absolutePath.isPresent() && PathUtils.isContained(folder, new File(absolutePath.get()).toPath());
     }
 
     String absolutePath()
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java b/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
index cdc4c35..1ea8b83 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplica.java
@@ -18,21 +18,22 @@
 
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.io.IOException;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.io.FSError;
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.NativeLibrary;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_MISSING_NATIVE_FILE_HINTS;
+
 /**
  * Because a column family may have sstables on different disks and disks can
  * be removed, we duplicate log files into many replicas so as to have a file
@@ -47,6 +48,7 @@
 final class LogReplica implements AutoCloseable
 {
     private static final Logger logger = LoggerFactory.getLogger(LogReplica.class);
+    private static final boolean REQUIRE_FD = !IGNORE_MISSING_NATIVE_FILE_HINTS.getBoolean();
 
     private final File file;
     private int directoryDescriptor;
@@ -54,18 +56,18 @@
 
     static LogReplica create(File directory, String fileName)
     {
-        int folderFD = NativeLibrary.tryOpenDirectory(directory.getPath());
-        if (folderFD == -1 && !FBUtilities.isWindows)
-            throw new FSReadError(new IOException(String.format("Invalid folder descriptor trying to create log replica %s", directory.getPath())), directory.getPath());
+        int folderFD = NativeLibrary.tryOpenDirectory(directory.path());
+        if (folderFD == -1  && REQUIRE_FD)
+            throw new FSReadError(new IOException(String.format("Invalid folder descriptor trying to create log replica %s", directory.path())), directory.path());
 
         return new LogReplica(new File(fileName), folderFD);
     }
 
     static LogReplica open(File file)
     {
-        int folderFD = NativeLibrary.tryOpenDirectory(file.getParentFile().getPath());
-        if (folderFD == -1 && !FBUtilities.isWindows)
-            throw new FSReadError(new IOException(String.format("Invalid folder descriptor trying to create log replica %s", file.getParentFile().getPath())), file.getParentFile().getPath());
+        int folderFD = NativeLibrary.tryOpenDirectory(file.parent().path());
+        if (folderFD == -1)
+            throw new FSReadError(new IOException(String.format("Invalid folder descriptor trying to create log replica %s", file.parent().path())), file.parent().path());
 
         return new LogReplica(file, folderFD);
     }
@@ -88,12 +90,12 @@
 
     String getFileName()
     {
-        return file.getName();
+        return file.name();
     }
 
     String getDirectory()
     {
-        return file.getParent();
+        return file.parentPath();
     }
 
     void append(LogRecord record)
@@ -162,7 +164,7 @@
 
     void printContentsWithAnyErrors(StringBuilder str)
     {
-        str.append(file.getPath());
+        str.append(file.path());
         str.append(System.lineSeparator());
         FileUtils.readLines(file).forEach(line -> printLineWithAnyError(str, line));
     }
@@ -181,4 +183,9 @@
             str.append(System.lineSeparator());
         }
     }
+
+    public int hashCode()
+    {
+        return file.hashCode();
+    }
 }
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java b/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
index 0295357..316e4b6 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogReplicaSet.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedHashMap;
@@ -29,6 +28,7 @@
 import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +61,7 @@
 
     void addReplica(File file)
     {
-        File directory = file.getParentFile();
+        File directory = file.parent();
         assert !replicasByFile.containsKey(directory);
         try
         {
@@ -268,6 +268,6 @@
     @VisibleForTesting
     List<String> getFilePaths()
     {
-        return replicas().stream().map(LogReplica::file).map(File::getPath).collect(Collectors.toList());
+        return replicas().stream().map(LogReplica::file).map(File::path).collect(Collectors.toList());
     }
 }
diff --git a/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java b/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
index a3c3837..f203bd8 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/LogTransaction.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.db.lifecycle;
 
 import java.io.ByteArrayOutputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.nio.file.Files;
@@ -37,7 +36,6 @@
 
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.compaction.OperationType;
@@ -46,15 +44,18 @@
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.SSTable;
-import org.apache.cassandra.io.sstable.SnapshotDeletingTask;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.*;
 import org.apache.cassandra.utils.concurrent.Ref;
 import org.apache.cassandra.utils.concurrent.RefCounted;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 /**
  * IMPORTANT: When this object is involved in a transactional graph, and is not encapsulated in a LifecycleTransaction,
  * for correct behaviour its commit MUST occur before any others, since it may legitimately fail. This is consistent
@@ -114,8 +115,7 @@
     // We need an explicit lock because the transaction tidier cannot store a reference to the transaction
     private final Object lock;
     private final Ref<LogTransaction> selfRef;
-    // Deleting sstables is tricky because the mmapping might not have been finalized yet,
-    // and delete will fail (on Windows) until it is (we only force the unmapping on SUN VMs).
+    // Deleting sstables is tricky because the mmapping might not have been finalized yet.
     // Additionally, we need to make sure to delete the data file first, so on restart the others
     // will be recognized as GCable.
     private static final Queue<Runnable> failedDeletions = new ConcurrentLinkedQueue<>();
@@ -128,7 +128,7 @@
     LogTransaction(OperationType opType, Tracker tracker)
     {
         this.tracker = tracker;
-        this.txnFile = new LogFile(opType, UUIDGen.getTimeUUID());
+        this.txnFile = new LogFile(opType, nextTimeUUID());
         this.lock = new Object();
         this.selfRef = new Ref<>(this, new TransactionTidier(txnFile, lock));
 
@@ -211,7 +211,7 @@
         return txnFile.type();
     }
 
-    UUID id()
+    TimeUUID id()
     {
         return txnFile.id();
     }
@@ -380,7 +380,7 @@
             // While this may be a dummy tracker w/out information in the metrics table, we attempt to delete regardless
             // and allow the delete to silently fail if this is an invalid ks + cf combination at time of tidy run.
             if (DatabaseDescriptor.isDaemonInitialized())
-                SystemKeyspace.clearSSTableReadMeter(desc.ksname, desc.cfname, desc.generation);
+                SystemKeyspace.clearSSTableReadMeter(desc.ksname, desc.cfname, desc.id);
 
             synchronized (lock)
             {
@@ -433,9 +433,6 @@
         Runnable task;
         while ( null != (task = failedDeletions.poll()))
             ScheduledExecutors.nonPeriodicTasks.submit(task);
-
-        // On Windows, snapshots cannot be deleted so long as a segment of the root element is memory-mapped in NTFS.
-        SnapshotDeletingTask.rescheduleFailedTasks();
     }
 
     static void waitForDeletions()
@@ -517,16 +514,16 @@
 
         void list(File directory)
         {
-            Arrays.stream(directory.listFiles(LogFile::isLogFile)).forEach(this::add);
+            Arrays.stream(directory.tryList(LogFile::isLogFile)).forEach(this::add);
         }
 
         void add(File file)
         {
-            List<File> filesByName = files.get(file.getName());
+            List<File> filesByName = files.get(file.name());
             if (filesByName == null)
             {
                 filesByName = new ArrayList<>();
-                files.put(file.getName(), filesByName);
+                files.put(file.name(), filesByName);
             }
 
             filesByName.add(file);
diff --git a/src/java/org/apache/cassandra/db/lifecycle/Tracker.java b/src/java/org/apache/cassandra/db/lifecycle/Tracker.java
index 3d72a11..ab8a74b 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/Tracker.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/Tracker.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
 import java.util.*;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.atomic.AtomicReference;
@@ -30,8 +29,9 @@
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Directories;
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -74,17 +74,23 @@
     public final boolean loadsstables;
 
     /**
+     * @param columnFamilyStore
      * @param memtable Initial Memtable. Can be null.
      * @param loadsstables true to indicate to load SSTables (TODO: remove as this is only accessed from 2i)
      */
-    public Tracker(Memtable memtable, boolean loadsstables)
+    public Tracker(ColumnFamilyStore columnFamilyStore, Memtable memtable, boolean loadsstables)
     {
-        this.cfstore = memtable != null ? memtable.cfs : null;
+        this.cfstore = columnFamilyStore;
         this.view = new AtomicReference<>();
         this.loadsstables = loadsstables;
         this.reset(memtable);
     }
 
+    public static Tracker newDummyTracker()
+    {
+        return new Tracker(null, null, false);
+    }
+
     public LifecycleTransaction tryModify(SSTableReader sstable, OperationType operationType)
     {
         return tryModify(singleton(sstable), operationType);
diff --git a/src/java/org/apache/cassandra/db/lifecycle/View.java b/src/java/org/apache/cassandra/db/lifecycle/View.java
index 203f2fa..958bc0d 100644
--- a/src/java/org/apache/cassandra/db/lifecycle/View.java
+++ b/src/java/org/apache/cassandra/db/lifecycle/View.java
@@ -26,7 +26,7 @@
 import com.google.common.collect.*;
 
 import org.apache.cassandra.db.DecoratedKey;
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.db.PartitionPosition;
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
@@ -169,7 +169,7 @@
         return sstables.isEmpty()
                && liveMemtables.size() <= 1
                && flushingMemtables.size() == 0
-               && (liveMemtables.size() == 0 || liveMemtables.get(0).getOperations() == 0);
+               && (liveMemtables.size() == 0 || liveMemtables.get(0).operationCount() == 0);
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractTimeUUIDType.java b/src/java/org/apache/cassandra/db/marshal/AbstractTimeUUIDType.java
new file mode 100644
index 0000000..91a5b27
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/marshal/AbstractTimeUUIDType.java
@@ -0,0 +1,171 @@
+/*
+ * 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.marshal;
+
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.apache.cassandra.cql3.CQL3Type;
+import org.apache.cassandra.cql3.Constants;
+import org.apache.cassandra.cql3.Term;
+import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.serializers.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUIDAsBytes;
+
+// Fully compatible with UUID, and indeed is interpreted as UUID for UDF
+public abstract class AbstractTimeUUIDType<T> extends TemporalType<T>
+{
+    AbstractTimeUUIDType()
+    {
+        super(ComparisonType.CUSTOM);
+    } // singleton
+
+    public boolean isEmptyValueMeaningless()
+    {
+        return true;
+    }
+
+    public <VL, VR> int compareCustom(VL left, ValueAccessor<VL> accessorL, VR right, ValueAccessor<VR> accessorR)
+    {
+        // Compare for length
+        boolean p1 = accessorL.size(left) == 16, p2 = accessorR.size(right) == 16;
+        if (!(p1 & p2))
+        {
+            // should we assert exactly 16 bytes (or 0)? seems prudent
+            assert p1 || accessorL.isEmpty(left);
+            assert p2 || accessorR.isEmpty(right);
+            return p1 ? 1 : p2 ? -1 : 0;
+        }
+
+        long msb1 = accessorL.getLong(left, 0);
+        long msb2 = accessorR.getLong(right, 0);
+        msb1 = reorderTimestampBytes(msb1);
+        msb2 = reorderTimestampBytes(msb2);
+
+        assert (msb1 & topbyte(0xf0L)) == topbyte(0x10L);
+        assert (msb2 & topbyte(0xf0L)) == topbyte(0x10L);
+
+        int c = Long.compare(msb1, msb2);
+        if (c != 0)
+            return c;
+
+        // this has to be a signed per-byte comparison for compatibility
+        // so we transform the bytes so that a simple long comparison is equivalent
+        long lsb1 = signedBytesToNativeLong(accessorL.getLong(left, 8));
+        long lsb2 = signedBytesToNativeLong(accessorR.getLong(right, 8));
+        return Long.compare(lsb1, lsb2);
+    }
+
+    // takes as input 8 signed bytes in native machine order
+    // returns the first byte unchanged, and the following 7 bytes converted to an unsigned representation
+    // which is the same as a 2's complement long in native format
+    public static long signedBytesToNativeLong(long signedBytes)
+    {
+        return signedBytes ^ 0x0080808080808080L;
+    }
+
+    private static long topbyte(long topbyte)
+    {
+        return topbyte << 56;
+    }
+
+    protected static long reorderTimestampBytes(long input)
+    {
+        return    (input <<  48)
+                  | ((input <<  16) & 0xFFFF00000000L)
+                  |  (input >>> 32);
+    }
+
+    public ByteBuffer fromString(String source) throws MarshalException
+    {
+        ByteBuffer parsed = UUIDType.parse(source);
+        if (parsed == null)
+            throw new MarshalException(String.format("Unknown timeuuid representation: %s", source));
+        if (parsed.remaining() == 16 && UUIDType.version(parsed) != 1)
+            throw new MarshalException("TimeUUID supports only version 1 UUIDs");
+        return parsed;
+    }
+
+    @Override
+    public Term fromJSONObject(Object parsed) throws MarshalException
+    {
+        try
+        {
+            return new Constants.Value(fromString((String) parsed));
+        }
+        catch (ClassCastException exc)
+        {
+            throw new MarshalException(
+                    String.format("Expected a string representation of a timeuuid, but got a %s: %s", parsed.getClass().getSimpleName(), parsed));
+        }
+    }
+
+    public CQL3Type asCQL3Type()
+    {
+        return CQL3Type.Native.TIMEUUID;
+    }
+
+    @Override
+    public ByteBuffer decomposeUntyped(Object value)
+    {
+        if (value instanceof UUID)
+            return UUIDSerializer.instance.serialize((UUID) value);
+        if (value instanceof TimeUUID)
+            return TimeUUID.Serializer.instance.serialize((TimeUUID) value);
+        return super.decomposeUntyped(value);
+    }
+
+    @Override
+    public int valueLengthIfFixed()
+    {
+        return 16;
+    }
+
+    @Override
+    public long toTimeInMillis(ByteBuffer value)
+    {
+        return TimeUUID.deserialize(value).unix(MILLISECONDS);
+    }
+
+    @Override
+    public ByteBuffer addDuration(ByteBuffer temporal, ByteBuffer duration)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ByteBuffer substractDuration(ByteBuffer temporal, ByteBuffer duration)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public ByteBuffer now()
+    {
+        return ByteBuffer.wrap(nextTimeUUIDAsBytes());
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        return obj instanceof AbstractTimeUUIDType<?>;
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/marshal/AbstractType.java b/src/java/org/apache/cassandra/db/marshal/AbstractType.java
index 19cf849..74d4006 100644
--- a/src/java/org/apache/cassandra/db/marshal/AbstractType.java
+++ b/src/java/org/apache/cassandra/db/marshal/AbstractType.java
@@ -32,6 +32,7 @@
 import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.Term;
+import org.apache.cassandra.db.rows.Cell;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
@@ -126,6 +127,11 @@
         return getSerializer().deserialize(value, accessor);
     }
 
+    public ByteBuffer decomposeUntyped(Object value)
+    {
+        return decompose((T) value);
+    }
+
     public ByteBuffer decompose(T value)
     {
         return getSerializer().serialize(value);
@@ -148,6 +154,11 @@
         return getString(bytes, ByteBufferAccessor.instance);
     }
 
+    public String toCQLString(ByteBuffer bytes)
+    {
+        return asCQL3Type().toCQLLiteral(bytes, ProtocolVersion.CURRENT);
+    }
+
     /** get a byte representation of the given string. */
     public abstract ByteBuffer fromString(String source) throws MarshalException;
 
@@ -234,6 +245,11 @@
         return new CQL3Type.Custom(this);
     }
 
+    public AbstractType<?> udfType()
+    {
+        return this;
+    }
+
     /**
      * Same as compare except that this ignore ReversedType. This is to be use when
      * comparing 2 values to decide for a CQL condition (see Operator.isSatisfiedBy) as
@@ -313,9 +329,11 @@
      *
      * Note that a type should be compatible with at least itself.
      */
-    public boolean isValueCompatibleWith(AbstractType<?> otherType)
+    public boolean isValueCompatibleWith(AbstractType<?> previous)
     {
-        return isValueCompatibleWithInternal((otherType instanceof ReversedType) ? ((ReversedType) otherType).baseType : otherType);
+        AbstractType<?> thisType =          isReversed() ? ((ReversedType<?>)     this).baseType : this;
+        AbstractType<?> thatType = previous.isReversed() ? ((ReversedType<?>) previous).baseType : previous;
+        return thisType.isValueCompatibleWithInternal(thatType);
     }
 
     /**
@@ -328,6 +346,18 @@
     }
 
     /**
+     * Similar to {@link #isValueCompatibleWith(AbstractType)}, but takes into account {@link Cell} encoding.
+     * In particular, this method doesn't consider two types serialization compatible if one of them has fixed
+     * length (overrides {@link #valueLengthIfFixed()}, and the other one doesn't.
+     */
+    public boolean isSerializationCompatibleWith(AbstractType<?> previous)
+    {
+        return isValueCompatibleWith(previous)
+               && valueLengthIfFixed() == previous.valueLengthIfFixed()
+               && isMultiCell() == previous.isMultiCell();
+    }
+
+    /**
      * An alternative comparison function used by CollectionsType in conjunction with CompositeType.
      *
      * This comparator is only called to compare components of a CompositeType. It gets the value of the
@@ -494,7 +524,7 @@
 
             if (l > maxValueSize)
                 throw new IOException(String.format("Corrupt value length %d encountered, as it exceeds the maximum of %d, " +
-                                                    "which is set via max_value_size_in_mb in cassandra.yaml",
+                                                    "which is set via max_value_size in cassandra.yaml",
                                                     l, maxValueSize));
 
             return accessor.read(in, l);
diff --git a/src/java/org/apache/cassandra/db/marshal/AsciiType.java b/src/java/org/apache/cassandra/db/marshal/AsciiType.java
index 05077ee..2d78c1a 100644
--- a/src/java/org/apache/cassandra/db/marshal/AsciiType.java
+++ b/src/java/org/apache/cassandra/db/marshal/AsciiType.java
@@ -35,7 +35,7 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
-public class AsciiType extends AbstractType<String>
+public class AsciiType extends StringType
 {
     public static final AsciiType instance = new AsciiType();
 
diff --git a/src/java/org/apache/cassandra/db/marshal/ByteArrayAccessor.java b/src/java/org/apache/cassandra/db/marshal/ByteArrayAccessor.java
index 7d13844..df24a62 100644
--- a/src/java/org/apache/cassandra/db/marshal/ByteArrayAccessor.java
+++ b/src/java/org/apache/cassandra/db/marshal/ByteArrayAccessor.java
@@ -29,6 +29,8 @@
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.ByteArrayUtil;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FastByteOperations;
@@ -235,6 +237,18 @@
     }
 
     @Override
+    public TimeUUID toTimeUUID(byte[] value)
+    {
+        return TimeUUID.fromBytes(getLong(value, 0), getLong(value, 8));
+    }
+
+    @Override
+    public Ballot toBallot(byte[] value)
+    {
+        return Ballot.deserialize(value);
+    }
+
+    @Override
     public int putShort(byte[] dst, int offset, short value)
     {
         ByteArrayUtil.putShort(dst, offset, value);
diff --git a/src/java/org/apache/cassandra/db/marshal/ByteBufferAccessor.java b/src/java/org/apache/cassandra/db/marshal/ByteBufferAccessor.java
index a0f9c1d..40a3bf4 100644
--- a/src/java/org/apache/cassandra/db/marshal/ByteBufferAccessor.java
+++ b/src/java/org/apache/cassandra/db/marshal/ByteBufferAccessor.java
@@ -28,6 +28,8 @@
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FastByteOperations;
 import org.apache.cassandra.utils.UUIDGen;
@@ -239,6 +241,18 @@
     }
 
     @Override
+    public TimeUUID toTimeUUID(ByteBuffer value)
+    {
+        return TimeUUID.fromBytes(value.getLong(value.position()), value.getLong(value.position() + 8));
+    }
+
+    @Override
+    public Ballot toBallot(ByteBuffer value)
+    {
+        return Ballot.deserialize(value);
+    }
+
+    @Override
     public int putShort(ByteBuffer dst, int offset, short value)
     {
         dst.putShort(dst.position() + offset, value);
diff --git a/src/java/org/apache/cassandra/db/marshal/CollectionType.java b/src/java/org/apache/cassandra/db/marshal/CollectionType.java
index 0d627a5..c52cddc 100644
--- a/src/java/org/apache/cassandra/db/marshal/CollectionType.java
+++ b/src/java/org/apache/cassandra/db/marshal/CollectionType.java
@@ -175,7 +175,7 @@
             return false;
 
         // the value comparator is only used for Cell values, so sorting doesn't matter
-        return this.valueComparator().isValueCompatibleWith(tprev.valueComparator());
+        return this.valueComparator().isSerializationCompatibleWith(tprev.valueComparator());
     }
 
     @Override
@@ -199,6 +199,15 @@
         return isValueCompatibleWithFrozen(tprev);
     }
 
+    @Override
+    public boolean isSerializationCompatibleWith(AbstractType<?> previous)
+    {
+        if (!isValueCompatibleWith(previous))
+            return false;
+
+        return valueComparator().isSerializationCompatibleWith(((CollectionType<?>)previous).valueComparator());
+    }
+
     /** A version of isCompatibleWith() to deal with non-multicell (frozen) collections */
     protected abstract boolean isCompatibleWithFrozen(CollectionType<?> previous);
 
diff --git a/src/java/org/apache/cassandra/db/marshal/DurationType.java b/src/java/org/apache/cassandra/db/marshal/DurationType.java
index 134a6f8..2afbfc1 100644
--- a/src/java/org/apache/cassandra/db/marshal/DurationType.java
+++ b/src/java/org/apache/cassandra/db/marshal/DurationType.java
@@ -26,7 +26,6 @@
 import org.apache.cassandra.serializers.DurationSerializer;
 import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.serializers.TypeSerializer;
-import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 /**
diff --git a/src/java/org/apache/cassandra/db/marshal/LegacyTimeUUIDType.java b/src/java/org/apache/cassandra/db/marshal/LegacyTimeUUIDType.java
new file mode 100644
index 0000000..528a3e8
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/marshal/LegacyTimeUUIDType.java
@@ -0,0 +1,34 @@
+/*
+ * 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.marshal;
+
+import java.util.UUID;
+
+import org.apache.cassandra.serializers.TypeSerializer;
+import org.apache.cassandra.serializers.UUIDSerializer;
+
+// Fully compatible with UUID, and indeed is interpreted as UUID for UDF
+public class LegacyTimeUUIDType extends AbstractTimeUUIDType<UUID>
+{
+    public static final LegacyTimeUUIDType instance = new LegacyTimeUUIDType();
+
+    public TypeSerializer<UUID> getSerializer()
+    {
+        return UUIDSerializer.instance;
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/marshal/ListType.java b/src/java/org/apache/cassandra/db/marshal/ListType.java
index cc63937..281f7ee 100644
--- a/src/java/org/apache/cassandra/db/marshal/ListType.java
+++ b/src/java/org/apache/cassandra/db/marshal/ListType.java
@@ -31,6 +31,7 @@
 import org.apache.cassandra.serializers.CollectionSerializer;
 import org.apache.cassandra.serializers.ListSerializer;
 import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.transport.ProtocolVersion;
 
 public class ListType<T> extends CollectionType<List<T>>
@@ -103,7 +104,7 @@
         return elements;
     }
 
-    public AbstractType<UUID> nameComparator()
+    public AbstractType<TimeUUID> nameComparator()
     {
         return TimeUUIDType.instance;
     }
diff --git a/src/java/org/apache/cassandra/db/marshal/ReversedType.java b/src/java/org/apache/cassandra/db/marshal/ReversedType.java
index 8a4b58d..ceea84a 100644
--- a/src/java/org/apache/cassandra/db/marshal/ReversedType.java
+++ b/src/java/org/apache/cassandra/db/marshal/ReversedType.java
@@ -106,12 +106,6 @@
     }
 
     @Override
-    public boolean isValueCompatibleWith(AbstractType<?> otherType)
-    {
-        return this.baseType.isValueCompatibleWith(otherType);
-    }
-
-    @Override
     public CQL3Type asCQL3Type()
     {
         return baseType.asCQL3Type();
diff --git a/src/java/org/apache/cassandra/db/marshal/SimpleDateType.java b/src/java/org/apache/cassandra/db/marshal/SimpleDateType.java
index f883ccd..8f1d677 100644
--- a/src/java/org/apache/cassandra/db/marshal/SimpleDateType.java
+++ b/src/java/org/apache/cassandra/db/marshal/SimpleDateType.java
@@ -23,7 +23,6 @@
 import org.apache.cassandra.cql3.Constants;
 import org.apache.cassandra.cql3.Duration;
 import org.apache.cassandra.cql3.Term;
-import org.apache.cassandra.cql3.statements.RequestValidations;
 import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.serializers.SimpleDateSerializer;
 import org.apache.cassandra.serializers.TypeSerializer;
diff --git a/src/java/org/apache/cassandra/db/marshal/StringType.java b/src/java/org/apache/cassandra/db/marshal/StringType.java
new file mode 100644
index 0000000..29aff58
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/marshal/StringType.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.marshal;
+
+import java.nio.ByteBuffer;
+
+public abstract class StringType extends AbstractType<String>
+{
+    protected StringType(ComparisonType comparisonType)
+    {
+        super(comparisonType);
+    }
+
+    public ByteBuffer concat(StringType leftType,
+                             ByteBuffer left,
+                             StringType rightType,
+                             ByteBuffer right)
+    {
+        String leftS = leftType.compose(left);
+        String rightS = rightType.compose(right);
+
+        return decompose(leftS + rightS);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/marshal/TemporalType.java b/src/java/org/apache/cassandra/db/marshal/TemporalType.java
index 4e2ac5a..945dae0 100644
--- a/src/java/org/apache/cassandra/db/marshal/TemporalType.java
+++ b/src/java/org/apache/cassandra/db/marshal/TemporalType.java
@@ -21,6 +21,8 @@
 
 import org.apache.cassandra.cql3.Duration;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * Base type for temporal types (timestamp, date ...).
  *
@@ -38,7 +40,7 @@
      */
     public ByteBuffer now()
     {
-        return fromTimeInMillis(System.currentTimeMillis());
+        return fromTimeInMillis(currentTimeMillis());
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/db/marshal/TimeType.java b/src/java/org/apache/cassandra/db/marshal/TimeType.java
index be20ba7..fd8fac4 100644
--- a/src/java/org/apache/cassandra/db/marshal/TimeType.java
+++ b/src/java/org/apache/cassandra/db/marshal/TimeType.java
@@ -19,7 +19,6 @@
 
 import java.nio.ByteBuffer;
 import java.time.LocalTime;
-import java.time.ZoneId;
 import java.time.ZoneOffset;
 
 import org.apache.cassandra.cql3.Constants;
diff --git a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
index 6cf1375..d3b0dec 100644
--- a/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
+++ b/src/java/org/apache/cassandra/db/marshal/TimeUUIDType.java
@@ -17,144 +17,22 @@
  */
 package org.apache.cassandra.db.marshal;
 
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-import org.apache.cassandra.cql3.CQL3Type;
-import org.apache.cassandra.cql3.ColumnSpecification;
-import org.apache.cassandra.cql3.Constants;
-import org.apache.cassandra.cql3.Term;
 import org.apache.cassandra.serializers.TypeSerializer;
-import org.apache.cassandra.utils.UUIDGen;
-import org.apache.cassandra.serializers.MarshalException;
-import org.apache.cassandra.serializers.TimeUUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
-public class TimeUUIDType extends TemporalType<UUID>
+// Fully compatible with UUID, and indeed is interpreted as UUID for UDF
+public class TimeUUIDType extends AbstractTimeUUIDType<TimeUUID>
 {
     public static final TimeUUIDType instance = new TimeUUIDType();
 
-    TimeUUIDType()
+    public TypeSerializer<TimeUUID> getSerializer()
     {
-        super(ComparisonType.CUSTOM);
-    } // singleton
-
-    public boolean isEmptyValueMeaningless()
-    {
-        return true;
-    }
-
-    public <VL, VR> int compareCustom(VL left, ValueAccessor<VL> accessorL, VR right, ValueAccessor<VR> accessorR)
-    {
-        // Compare for length
-        boolean p1 = accessorL.size(left) == 16, p2 = accessorR.size(right) == 16;
-        if (!(p1 & p2))
-        {
-            // should we assert exactly 16 bytes (or 0)? seems prudent
-            assert p1 || accessorL.isEmpty(left);
-            assert p2 || accessorR.isEmpty(right);
-            return p1 ? 1 : p2 ? -1 : 0;
-        }
-
-        long msb1 = accessorL.getLong(left, 0);
-        long msb2 = accessorR.getLong(right, 0);
-        msb1 = reorderTimestampBytes(msb1);
-        msb2 = reorderTimestampBytes(msb2);
-
-        assert (msb1 & topbyte(0xf0L)) == topbyte(0x10L);
-        assert (msb2 & topbyte(0xf0L)) == topbyte(0x10L);
-
-        int c = Long.compare(msb1, msb2);
-        if (c != 0)
-            return c;
-
-        // this has to be a signed per-byte comparison for compatibility
-        // so we transform the bytes so that a simple long comparison is equivalent
-        long lsb1 = signedBytesToNativeLong(accessorL.getLong(left, 8));
-        long lsb2 = signedBytesToNativeLong(accessorR.getLong(right, 8));
-        return Long.compare(lsb1, lsb2);
-    }
-
-    // takes as input 8 signed bytes in native machine order
-    // returns the first byte unchanged, and the following 7 bytes converted to an unsigned representation
-    // which is the same as a 2's complement long in native format
-    private static long signedBytesToNativeLong(long signedBytes)
-    {
-        return signedBytes ^ 0x0080808080808080L;
-    }
-
-    private static long topbyte(long topbyte)
-    {
-        return topbyte << 56;
-    }
-
-    protected static long reorderTimestampBytes(long input)
-    {
-        return    (input <<  48)
-                  | ((input <<  16) & 0xFFFF00000000L)
-                  |  (input >>> 32);
-    }
-
-    public ByteBuffer fromString(String source) throws MarshalException
-    {
-        ByteBuffer parsed = UUIDType.parse(source);
-        if (parsed == null)
-            throw new MarshalException(String.format("Unknown timeuuid representation: %s", source));
-        if (parsed.remaining() == 16 && UUIDType.version(parsed) != 1)
-            throw new MarshalException("TimeUUID supports only version 1 UUIDs");
-        return parsed;
+        return TimeUUID.Serializer.instance;
     }
 
     @Override
-    public Term fromJSONObject(Object parsed) throws MarshalException
+    public AbstractType<?> udfType()
     {
-        try
-        {
-            return new Constants.Value(fromString((String) parsed));
-        }
-        catch (ClassCastException exc)
-        {
-            throw new MarshalException(
-                    String.format("Expected a string representation of a timeuuid, but got a %s: %s", parsed.getClass().getSimpleName(), parsed));
-        }
-    }
-
-    public CQL3Type asCQL3Type()
-    {
-        return CQL3Type.Native.TIMEUUID;
-    }
-
-    public TypeSerializer<UUID> getSerializer()
-    {
-        return TimeUUIDSerializer.instance;
-    }
-
-    @Override
-    public int valueLengthIfFixed()
-    {
-        return 16;
-    }
-
-    @Override
-    public long toTimeInMillis(ByteBuffer value)
-    {
-        return UUIDGen.unixTimestamp(UUIDGen.getUUID(value));
-    }
-
-    @Override
-    public ByteBuffer addDuration(ByteBuffer temporal, ByteBuffer duration)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ByteBuffer substractDuration(ByteBuffer temporal, ByteBuffer duration)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public ByteBuffer now()
-    {
-        return ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes());
+        return LegacyTimeUUIDType.instance;
     }
 }
diff --git a/src/java/org/apache/cassandra/db/marshal/TimestampType.java b/src/java/org/apache/cassandra/db/marshal/TimestampType.java
index 0dac6b0..ccf1da3 100644
--- a/src/java/org/apache/cassandra/db/marshal/TimestampType.java
+++ b/src/java/org/apache/cassandra/db/marshal/TimestampType.java
@@ -23,7 +23,6 @@
 import org.apache.cassandra.cql3.Constants;
 import org.apache.cassandra.cql3.Duration;
 import org.apache.cassandra.cql3.Term;
-import org.apache.cassandra.cql3.statements.RequestValidations;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/src/java/org/apache/cassandra/db/marshal/TupleType.java b/src/java/org/apache/cassandra/db/marshal/TupleType.java
index 83fbb25..cc08487 100644
--- a/src/java/org/apache/cassandra/db/marshal/TupleType.java
+++ b/src/java/org/apache/cassandra/db/marshal/TupleType.java
@@ -205,9 +205,17 @@
      */
     public ByteBuffer[] split(ByteBuffer value)
     {
-        ByteBuffer[] components = new ByteBuffer[size()];
+        return split(value, size(), this);
+    }
+
+    /**
+     * Split a tuple value into its component values.
+     */
+    public static ByteBuffer[] split(ByteBuffer value, int numberOfElements, TupleType type)
+    {
+        ByteBuffer[] components = new ByteBuffer[numberOfElements];
         ByteBuffer input = value.duplicate();
-        for (int i = 0; i < size(); i++)
+        for (int i = 0; i < numberOfElements; i++)
         {
             if (!input.hasRemaining())
                 return Arrays.copyOfRange(components, 0, i);
@@ -226,7 +234,7 @@
         {
             throw new InvalidRequestException(String.format(
             "Expected %s %s for %s column, but got more",
-            size(), size() == 1 ? "value" : "values", this.asCQL3Type()));
+            numberOfElements, numberOfElements == 1 ? "value" : "values", type.asCQL3Type()));
         }
 
         return components;
diff --git a/src/java/org/apache/cassandra/db/marshal/UTF8Type.java b/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
index db62b57..e256070 100644
--- a/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
+++ b/src/java/org/apache/cassandra/db/marshal/UTF8Type.java
@@ -32,7 +32,7 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
-public class UTF8Type extends AbstractType<String>
+public class UTF8Type extends StringType
 {
     public static final UTF8Type instance = new UTF8Type();
 
diff --git a/src/java/org/apache/cassandra/db/marshal/ValueAccessor.java b/src/java/org/apache/cassandra/db/marshal/ValueAccessor.java
index 10532ff..a51836e 100644
--- a/src/java/org/apache/cassandra/db/marshal/ValueAccessor.java
+++ b/src/java/org/apache/cassandra/db/marshal/ValueAccessor.java
@@ -37,6 +37,8 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.db.ClusteringPrefix.Kind.*;
 
@@ -322,6 +324,12 @@
     /** returns a UUID from offset 0 */
     UUID toUUID(V value);
 
+    /** returns a TimeUUID from offset 0 */
+    TimeUUID toTimeUUID(V value);
+
+    /** returns a TimeUUID from offset 0 */
+    Ballot toBallot(V value);
+
     /**
      * writes the short value {@param value} to {@param dst} at offset {@param offset}
      * @return the number of bytes written to {@param value}
diff --git a/src/java/org/apache/cassandra/db/memtable/AbstractAllocatorMemtable.java b/src/java/org/apache/cassandra/db/memtable/AbstractAllocatorMemtable.java
new file mode 100644
index 0000000..ae12516
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/AbstractAllocatorMemtable.java
@@ -0,0 +1,317 @@
+/*
+ * 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.memtable;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ImmediateExecutor;
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ClusteringComparator;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.WrappedRunnable;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.OpOrder;
+import org.apache.cassandra.utils.concurrent.Promise;
+import org.apache.cassandra.utils.memory.HeapPool;
+import org.apache.cassandra.utils.memory.MemtableAllocator;
+import org.apache.cassandra.utils.memory.MemtableCleaner;
+import org.apache.cassandra.utils.memory.MemtablePool;
+import org.apache.cassandra.utils.memory.NativePool;
+import org.apache.cassandra.utils.memory.SlabPool;
+
+/**
+ * A memtable that uses memory tracked and maybe allocated via a MemtableAllocator from a MemtablePool.
+ * Provides methods of memory tracking and triggering flushes when the relevant limits are reached.
+ */
+public abstract class AbstractAllocatorMemtable extends AbstractMemtableWithCommitlog
+{
+    private static final Logger logger = LoggerFactory.getLogger(AbstractAllocatorMemtable.class);
+
+    public static final MemtablePool MEMORY_POOL = AbstractAllocatorMemtable.createMemtableAllocatorPool();
+
+    protected final Owner owner;
+    protected final MemtableAllocator allocator;
+
+    // Record the comparator of the CFS at the creation of the memtable. This
+    // is only used when a user update the CF comparator, to know if the
+    // memtable was created with the new or old comparator.
+    protected final ClusteringComparator initialComparator;
+
+    private final long creationNano = Clock.Global.nanoTime();
+
+    private static MemtablePool createMemtableAllocatorPool()
+    {
+        Config.MemtableAllocationType allocationType = DatabaseDescriptor.getMemtableAllocationType();
+        long heapLimit = DatabaseDescriptor.getMemtableHeapSpaceInMiB() << 20;
+        long offHeapLimit = DatabaseDescriptor.getMemtableOffheapSpaceInMiB() << 20;
+        float memtableCleanupThreshold = DatabaseDescriptor.getMemtableCleanupThreshold();
+        MemtableCleaner cleaner = AbstractAllocatorMemtable::flushLargestMemtable;
+        return createMemtableAllocatorPoolInternal(allocationType, heapLimit, offHeapLimit, memtableCleanupThreshold, cleaner);
+    }
+
+    @VisibleForTesting
+    public static MemtablePool createMemtableAllocatorPoolInternal(Config.MemtableAllocationType allocationType,
+                                                                   long heapLimit, long offHeapLimit,
+                                                                   float memtableCleanupThreshold, MemtableCleaner cleaner)
+    {
+        switch (allocationType)
+        {
+        case unslabbed_heap_buffers_logged:
+            return new HeapPool.Logged(heapLimit, memtableCleanupThreshold, cleaner);
+        case unslabbed_heap_buffers:
+            logger.debug("Memtables allocating with on-heap buffers");
+            return new HeapPool(heapLimit, memtableCleanupThreshold, cleaner);
+        case heap_buffers:
+            logger.debug("Memtables allocating with on-heap slabs");
+            return new SlabPool(heapLimit, 0, memtableCleanupThreshold, cleaner);
+        case offheap_buffers:
+            logger.debug("Memtables allocating with off-heap buffers");
+            return new SlabPool(heapLimit, offHeapLimit, memtableCleanupThreshold, cleaner);
+        case offheap_objects:
+            logger.debug("Memtables allocating with off-heap objects");
+            return new NativePool(heapLimit, offHeapLimit, memtableCleanupThreshold, cleaner);
+        default:
+            throw new AssertionError();
+        }
+    }
+
+    // only to be used by init(), to setup the very first memtable for the cfs
+    public AbstractAllocatorMemtable(AtomicReference<CommitLogPosition> commitLogLowerBound, TableMetadataRef metadataRef, Owner owner)
+    {
+        super(metadataRef, commitLogLowerBound);
+        this.allocator = MEMORY_POOL.newAllocator(metadataRef.toString());
+        this.initialComparator = metadata.get().comparator;
+        this.owner = owner;
+        scheduleFlush();
+    }
+
+    public MemtableAllocator getAllocator()
+    {
+        return allocator;
+    }
+
+    @Override
+    public boolean shouldSwitch(ColumnFamilyStore.FlushReason reason)
+    {
+        switch (reason)
+        {
+        case SCHEMA_CHANGE:
+            return initialComparator != metadata().comparator // If the CF comparator has changed, because our partitions reference the old one
+                   || metadata().params.memtable.factory() != factory(); // If a different type of memtable is requested
+        case OWNED_RANGES_CHANGE:
+            return false; // by default we don't use the local ranges, thus this has no effect
+        default:
+            return true;
+        }
+    }
+
+    public void metadataUpdated()
+    {
+        // We decided not to swap out this memtable, but if the flush period has changed we must schedule it for the
+        // new expiration time.
+        scheduleFlush();
+    }
+
+    public void localRangesUpdated()
+    {
+        // nothing to be done by default
+    }
+
+    public void performSnapshot(String snapshotName)
+    {
+        throw new AssertionError("performSnapshot must be implemented if shouldSwitch(SNAPSHOT) can return false.");
+    }
+
+    protected abstract Factory factory();
+
+    public void switchOut(OpOrder.Barrier writeBarrier, AtomicReference<CommitLogPosition> commitLogUpperBound)
+    {
+        super.switchOut(writeBarrier, commitLogUpperBound);
+        allocator.setDiscarding();
+    }
+
+    public void discard()
+    {
+        super.discard();
+        allocator.setDiscarded();
+    }
+
+    public String toString()
+    {
+        MemoryUsage usage = Memtable.getMemoryUsage(this);
+        return String.format("Memtable-%s@%s(%s serialized bytes, %s ops, %s)",
+                             metadata.get().name,
+                             hashCode(),
+                             FBUtilities.prettyPrintMemory(getLiveDataSize()),
+                             operationCount(),
+                             usage);
+    }
+
+    @Override
+    public void addMemoryUsageTo(MemoryUsage stats)
+    {
+        stats.ownershipRatioOnHeap += getAllocator().onHeap().ownershipRatio();
+        stats.ownershipRatioOffHeap += getAllocator().offHeap().ownershipRatio();
+        stats.ownsOnHeap += getAllocator().onHeap().owns();
+        stats.ownsOffHeap += getAllocator().offHeap().owns();
+    }
+
+    public void markExtraOnHeapUsed(long additionalSpace, OpOrder.Group opGroup)
+    {
+        getAllocator().onHeap().allocate(additionalSpace, opGroup);
+    }
+
+    public void markExtraOffHeapUsed(long additionalSpace, OpOrder.Group opGroup)
+    {
+        getAllocator().offHeap().allocate(additionalSpace, opGroup);
+    }
+
+    void scheduleFlush()
+    {
+        int period = metadata().params.memtableFlushPeriodInMs;
+        if (period > 0)
+            scheduleFlush(owner, period);
+    }
+
+    private static void scheduleFlush(Owner owner, int period)
+    {
+        logger.trace("scheduling flush in {} ms", period);
+        WrappedRunnable runnable = new WrappedRunnable()
+        {
+            protected void runMayThrow()
+            {
+                Memtable current = owner.getCurrentMemtable();
+                if (current instanceof AbstractAllocatorMemtable)
+                    ((AbstractAllocatorMemtable) current).flushIfPeriodExpired();
+            }
+        };
+        ScheduledExecutors.scheduledTasks.scheduleSelfRecurring(runnable, period, TimeUnit.MILLISECONDS);
+    }
+
+    private void flushIfPeriodExpired()
+    {
+        int period = metadata().params.memtableFlushPeriodInMs;
+        if (period > 0 && (Clock.Global.nanoTime() - creationNano >= TimeUnit.MILLISECONDS.toNanos(period)))
+        {
+            if (isClean())
+            {
+                // if we're still clean, instead of swapping just reschedule a flush for later
+                scheduleFlush(owner, period);
+            }
+            else
+            {
+                // we'll be rescheduled by the constructor of the Memtable.
+                owner.signalFlushRequired(AbstractAllocatorMemtable.this,
+                                          ColumnFamilyStore.FlushReason.MEMTABLE_PERIOD_EXPIRED);
+            }
+        }
+    }
+
+    /**
+     * Finds the largest memtable, as a percentage of *either* on- or off-heap memory limits, and immediately
+     * queues it for flushing. If the memtable selected is flushed before this completes, no work is done.
+     */
+    public static Future<Boolean> flushLargestMemtable()
+    {
+        float largestRatio = 0f;
+        AbstractAllocatorMemtable largestMemtable = null;
+        Memtable.MemoryUsage largestUsage = null;
+        float liveOnHeap = 0, liveOffHeap = 0;
+        // we take a reference to the current main memtable for the CF prior to snapping its ownership ratios
+        // to ensure we have some ordering guarantee for performing the switchMemtableIf(), i.e. we will only
+        // swap if the memtables we are measuring here haven't already been swapped by the time we try to swap them
+        for (Memtable currentMemtable : ColumnFamilyStore.activeMemtables())
+        {
+            if (!(currentMemtable instanceof AbstractAllocatorMemtable))
+                continue;
+            AbstractAllocatorMemtable current = (AbstractAllocatorMemtable) currentMemtable;
+
+            // find the total ownership ratio for the memtable and all SecondaryIndexes owned by this CF,
+            // both on- and off-heap, and select the largest of the two ratios to weight this CF
+            MemoryUsage usage = Memtable.newMemoryUsage();
+            current.addMemoryUsageTo(usage);
+
+            for (Memtable indexMemtable : current.owner.getIndexMemtables())
+                if (indexMemtable instanceof AbstractAllocatorMemtable)
+                    indexMemtable.addMemoryUsageTo(usage);
+
+            float ratio = Math.max(usage.ownershipRatioOnHeap, usage.ownershipRatioOffHeap);
+            if (ratio > largestRatio)
+            {
+                largestMemtable = current;
+                largestUsage = usage;
+                largestRatio = ratio;
+            }
+
+            liveOnHeap += usage.ownershipRatioOnHeap;
+            liveOffHeap += usage.ownershipRatioOffHeap;
+        }
+
+        Promise<Boolean> returnFuture = new AsyncPromise<>();
+
+        if (largestMemtable != null)
+        {
+            float usedOnHeap = MEMORY_POOL.onHeap.usedRatio();
+            float usedOffHeap = MEMORY_POOL.offHeap.usedRatio();
+            float flushingOnHeap = MEMORY_POOL.onHeap.reclaimingRatio();
+            float flushingOffHeap = MEMORY_POOL.offHeap.reclaimingRatio();
+            logger.info("Flushing largest {} to free up room. Used total: {}, live: {}, flushing: {}, this: {}",
+                        largestMemtable.owner, ratio(usedOnHeap, usedOffHeap), ratio(liveOnHeap, liveOffHeap),
+                        ratio(flushingOnHeap, flushingOffHeap), ratio(largestUsage.ownershipRatioOnHeap, largestUsage.ownershipRatioOffHeap));
+
+            Future<CommitLogPosition> flushFuture = largestMemtable.owner.signalFlushRequired(largestMemtable, ColumnFamilyStore.FlushReason.MEMTABLE_LIMIT);
+            flushFuture.addListener(() -> {
+                try
+                {
+                    flushFuture.get();
+                    returnFuture.trySuccess(true);
+                }
+                catch (Throwable t)
+                {
+                    returnFuture.tryFailure(t);
+                }
+            }, ImmediateExecutor.INSTANCE);
+        }
+        else
+        {
+            logger.debug("Flushing of largest memtable, not done, no memtable found");
+
+            returnFuture.trySuccess(false);
+        }
+
+        return returnFuture;
+    }
+
+    private static String ratio(float onHeap, float offHeap)
+    {
+        return String.format("%.2f/%.2f", onHeap, offHeap);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/AbstractMemtable.java b/src/java/org/apache/cassandra/db/memtable/AbstractMemtable.java
new file mode 100644
index 0000000..ca6dbf6
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/AbstractMemtable.java
@@ -0,0 +1,238 @@
+/*
+ * 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.memtable;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.db.RegularAndStaticColumns;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.db.partitions.Partition;
+import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.TableMetadataRef;
+
+public abstract class AbstractMemtable implements Memtable
+{
+    protected final AtomicLong currentOperations = new AtomicLong(0);
+    protected final ColumnsCollector columnsCollector;
+    protected final StatsCollector statsCollector = new StatsCollector();
+    // The smallest timestamp for all partitions stored in this memtable
+    protected AtomicLong minTimestamp = new AtomicLong(Long.MAX_VALUE);
+    // The smallest local deletion time for all partitions in this memtable
+    protected AtomicInteger minLocalDeletionTime = new AtomicInteger(Integer.MAX_VALUE);
+    // Note: statsCollector has corresponding statistics to the two above, but starts with an epoch value which is not
+    // correct for their usage.
+
+    protected TableMetadataRef metadata;
+
+    public AbstractMemtable(TableMetadataRef metadataRef)
+    {
+        this.metadata = metadataRef;
+        this.columnsCollector = new ColumnsCollector(metadata.get().regularAndStaticColumns());
+    }
+
+    @VisibleForTesting
+    public AbstractMemtable(TableMetadataRef metadataRef, long minTimestamp)
+    {
+        this.metadata = metadataRef;
+        this.columnsCollector = new ColumnsCollector(metadata.get().regularAndStaticColumns());
+        this.minTimestamp = new AtomicLong(minTimestamp);
+    }
+
+    public TableMetadata metadata()
+    {
+        return metadata.get();
+    }
+
+    public long operationCount()
+    {
+        return currentOperations.get();
+    }
+
+    /**
+     * Returns the minTS if one available, otherwise NO_MIN_TIMESTAMP.
+     *
+     * EncodingStats uses a synthetic epoch TS at 2015. We don't want to leak that (CASSANDRA-18118) so we return NO_MIN_TIMESTAMP instead.
+     *
+     * @return The minTS or NO_MIN_TIMESTAMP if none available
+     */
+    public long getMinTimestamp()
+    {
+        return minTimestamp.get() != EncodingStats.NO_STATS.minTimestamp ? minTimestamp.get() : NO_MIN_TIMESTAMP;
+    }
+
+    public int getMinLocalDeletionTime()
+    {
+        return minLocalDeletionTime.get();
+    }
+
+    protected static void updateMin(AtomicLong minTracker, long newValue)
+    {
+        while (true)
+        {
+            long existing = minTracker.get();
+            if (existing <= newValue)
+                break;
+            if (minTracker.compareAndSet(existing, newValue))
+                break;
+        }
+    }
+
+    protected static void updateMin(AtomicInteger minTracker, int newValue)
+    {
+        while (true)
+        {
+            int existing = minTracker.get();
+            if (existing <= newValue)
+                break;
+            if (minTracker.compareAndSet(existing, newValue))
+                break;
+        }
+    }
+
+    RegularAndStaticColumns columns()
+    {
+        return columnsCollector.get();
+    }
+
+    EncodingStats encodingStats()
+    {
+        return statsCollector.get();
+    }
+
+    protected static class ColumnsCollector
+    {
+        private final HashMap<ColumnMetadata, AtomicBoolean> predefined = new HashMap<>();
+        private final ConcurrentSkipListSet<ColumnMetadata> extra = new ConcurrentSkipListSet<>();
+
+        ColumnsCollector(RegularAndStaticColumns columns)
+        {
+            for (ColumnMetadata def : columns.statics)
+                predefined.put(def, new AtomicBoolean());
+            for (ColumnMetadata def : columns.regulars)
+                predefined.put(def, new AtomicBoolean());
+        }
+
+        public void update(RegularAndStaticColumns columns)
+        {
+            for (ColumnMetadata s : columns.statics)
+                update(s);
+            for (ColumnMetadata r : columns.regulars)
+                update(r);
+        }
+
+        public void update(ColumnsCollector other)
+        {
+            for (Map.Entry<ColumnMetadata, AtomicBoolean> v : other.predefined.entrySet())
+                if (v.getValue().get())
+                    update(v.getKey());
+
+            extra.addAll(other.extra);
+        }
+
+        private void update(ColumnMetadata definition)
+        {
+            AtomicBoolean present = predefined.get(definition);
+            if (present != null)
+            {
+                if (!present.get())
+                    present.set(true);
+            }
+            else
+            {
+                extra.add(definition);
+            }
+        }
+
+        /**
+         * Get the current state of the columns set.
+         *
+         * Note: If this is executed while mutations are still being performed on the table (e.g. to prepare
+         * an sstable for streaming when Memtable.Factory.streamFromMemtable() is true), the resulting view may be
+         * in a somewhat inconsistent state (it may include partial updates, as well as miss updates older than
+         * ones it does include).
+         */
+        public RegularAndStaticColumns get()
+        {
+            RegularAndStaticColumns.Builder builder = RegularAndStaticColumns.builder();
+            for (Map.Entry<ColumnMetadata, AtomicBoolean> e : predefined.entrySet())
+                if (e.getValue().get())
+                    builder.add(e.getKey());
+            return builder.addAll(extra).build();
+        }
+    }
+
+    protected static class StatsCollector
+    {
+        private final AtomicReference<EncodingStats> stats = new AtomicReference<>(EncodingStats.NO_STATS);
+
+        public void update(EncodingStats newStats)
+        {
+            while (true)
+            {
+                EncodingStats current = stats.get();
+                EncodingStats updated = current.mergeWith(newStats);
+                if (stats.compareAndSet(current, updated))
+                    return;
+            }
+        }
+
+        public EncodingStats get()
+        {
+            return stats.get();
+        }
+    }
+
+    protected abstract class AbstractFlushablePartitionSet<P extends Partition> implements FlushablePartitionSet<P>
+    {
+        public long dataSize()
+        {
+            return getLiveDataSize();
+        }
+
+        public CommitLogPosition commitLogLowerBound()
+        {
+            return AbstractMemtable.this.getCommitLogLowerBound();
+        }
+
+        public LastCommitLogPosition commitLogUpperBound()
+        {
+            return AbstractMemtable.this.getFinalCommitLogUpperBound();
+        }
+
+        public EncodingStats encodingStats()
+        {
+            return AbstractMemtable.this.encodingStats();
+        }
+
+        public RegularAndStaticColumns columns()
+        {
+            return AbstractMemtable.this.columns();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/AbstractMemtableWithCommitlog.java b/src/java/org/apache/cassandra/db/memtable/AbstractMemtableWithCommitlog.java
new file mode 100644
index 0000000..4fe39a1
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/AbstractMemtableWithCommitlog.java
@@ -0,0 +1,127 @@
+/*
+ * 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.memtable;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.concurrent.OpOrder;
+
+/**
+ * Memtable that uses a commit log for persistence. Provides methods of tracking the commit log positions covered by
+ * it and safely switching between memtables.
+ */
+public abstract class AbstractMemtableWithCommitlog extends AbstractMemtable
+{
+    // The approximate lower bound by this memtable; must be <= commitLogLowerBound once our predecessor
+    // has been finalised, and this is enforced in the ColumnFamilyStore.setCommitLogUpperBound
+    private final CommitLogPosition approximateCommitLogLowerBound = CommitLog.instance.getCurrentPosition();
+    // the precise lower bound of CommitLogPosition owned by this memtable; equal to its predecessor's commitLogUpperBound
+    private final AtomicReference<CommitLogPosition> commitLogLowerBound;
+    // the write barrier for directing writes to this memtable or the next during a switch
+    private volatile OpOrder.Barrier writeBarrier;
+    // the precise upper bound of CommitLogPosition owned by this memtable
+    private volatile AtomicReference<CommitLogPosition> commitLogUpperBound;
+
+    public AbstractMemtableWithCommitlog(TableMetadataRef metadataRef, AtomicReference<CommitLogPosition> commitLogLowerBound)
+    {
+        super(metadataRef);
+        this.commitLogLowerBound = commitLogLowerBound;
+    }
+
+    public CommitLogPosition getApproximateCommitLogLowerBound()
+    {
+        return approximateCommitLogLowerBound;
+    }
+
+    public void switchOut(OpOrder.Barrier writeBarrier, AtomicReference<CommitLogPosition> commitLogUpperBound)
+    {
+        // This can prepare the memtable data for deletion; it will still be used while the flush is proceeding.
+        // A setDiscarded call will follow.
+        assert this.writeBarrier == null;
+        this.commitLogUpperBound = commitLogUpperBound;
+        this.writeBarrier = writeBarrier;
+    }
+
+    public void discard()
+    {
+        assert writeBarrier != null : "Memtable must be switched out before being discarded.";
+    }
+
+    // decide if this memtable should take the write, or if it should go to the next memtable
+    @Override
+    public boolean accepts(OpOrder.Group opGroup, CommitLogPosition commitLogPosition)
+    {
+        // if the barrier hasn't been set yet, then this memtable is still the newest and is taking ALL writes.
+        OpOrder.Barrier barrier = this.writeBarrier;
+        if (barrier == null)
+            return true;
+        // Note that if this races with taking the barrier the opGroup and commit log position we were given must
+        // necessarily be before the barrier and any LastCommitLogPosition is set, thus this function will return true
+        // and no update to commitLogUpperBound is necessary.
+
+        // If the barrier has been set and issued, but is in the past, we are definitely destined for a future memtable.
+        // Because we issue the barrier after taking LastCommitLogPosition and mutations take their position after
+        // taking the opGroup, this condition also ensures the given commit log position is greater than the chosen
+        // upper bound.
+        if (!barrier.isAfter(opGroup))
+            return false;
+        // We are in the segment of time between the barrier is constructed (and the memtable is switched out)
+        // and the barrier is issued.
+        // if we aren't durable we are directed only by the barrier
+        if (commitLogPosition == null)
+            return true;
+        while (true)
+        {
+            // If the CL boundary has been set, the mutation can be accepted depending on whether it falls before it.
+            // However, if it has not been set, the old sstable must still accept writes but we must also ensure that
+            // their positions are accounted for in the boundary (as there may be a delay between taking the log
+            // position for the boundary and setting it where a mutation sneaks in).
+            // Thus, if the boundary hasn't been finalised yet, we simply update it to the max of its current value and
+            // ours; this permits us to coordinate a safe boundary, as the boundary choice is made atomically wrt our
+            // max() maintenance, so an operation cannot sneak into the past.
+            CommitLogPosition currentLast = commitLogUpperBound.get();
+            if (currentLast instanceof LastCommitLogPosition)
+                return currentLast.compareTo(commitLogPosition) >= 0;
+            if (currentLast != null && currentLast.compareTo(commitLogPosition) >= 0)
+                return true;
+            if (commitLogUpperBound.compareAndSet(currentLast, commitLogPosition))
+                return true;
+        }
+    }
+
+    public CommitLogPosition getCommitLogLowerBound()
+    {
+        return commitLogLowerBound.get();
+    }
+
+    public LastCommitLogPosition getFinalCommitLogUpperBound()
+    {
+        assert commitLogUpperBound != null : "Commit log upper bound should be set before flushing";
+        assert commitLogUpperBound.get() instanceof LastCommitLogPosition : "Commit log upper bound has not been sealed yet? " + commitLogUpperBound.get();
+        return (LastCommitLogPosition) commitLogUpperBound.get();
+    }
+
+    public boolean mayContainDataBefore(CommitLogPosition position)
+    {
+        return approximateCommitLogLowerBound.compareTo(position) < 0;
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/Flushing.java b/src/java/org/apache/cassandra/db/memtable/Flushing.java
new file mode 100644
index 0000000..1a31374
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/Flushing.java
@@ -0,0 +1,217 @@
+/*
+ * 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.memtable;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import com.google.common.base.Throwables;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.DiskBoundaries;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.db.SerializationHeader;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.commitlog.IntervalSet;
+import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
+import org.apache.cassandra.db.partitions.Partition;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SSTableMultiWriter;
+import org.apache.cassandra.io.sstable.format.SSTableFormat;
+import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
+import org.apache.cassandra.metrics.TableMetrics;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.FBUtilities;
+
+public class Flushing
+{
+    private static final Logger logger = LoggerFactory.getLogger(Flushing.class);
+
+    private Flushing() // prevent instantiation
+    {
+    }
+
+    public static List<FlushRunnable> flushRunnables(ColumnFamilyStore cfs,
+                                                     Memtable memtable,
+                                                     LifecycleTransaction txn)
+    {
+        DiskBoundaries diskBoundaries = cfs.getDiskBoundaries();
+        List<PartitionPosition> boundaries = diskBoundaries.positions;
+        List<Directories.DataDirectory> locations = diskBoundaries.directories;
+        if (boundaries == null)
+        {
+            FlushRunnable runnable = flushRunnable(cfs, memtable, null, null, txn, null);
+            return Collections.singletonList(runnable);
+        }
+
+        List<FlushRunnable> runnables = new ArrayList<>(boundaries.size());
+        PartitionPosition rangeStart = boundaries.get(0).getPartitioner().getMinimumToken().minKeyBound();
+        try
+        {
+            for (int i = 0; i < boundaries.size(); i++)
+            {
+                PartitionPosition t = boundaries.get(i);
+                FlushRunnable runnable = flushRunnable(cfs, memtable, rangeStart, t, txn, locations.get(i));
+
+                runnables.add(runnable);
+                rangeStart = t;
+            }
+            return runnables;
+        }
+        catch (Throwable e)
+        {
+            throw Throwables.propagate(abortRunnables(runnables, e));
+        }
+    }
+
+    @SuppressWarnings("resource")   // writer owned by runnable, to be closed or aborted by its caller
+    static FlushRunnable flushRunnable(ColumnFamilyStore cfs,
+                                       Memtable memtable,
+                                       PartitionPosition from,
+                                       PartitionPosition to,
+                                       LifecycleTransaction txn,
+                                       Directories.DataDirectory flushLocation)
+    {
+        Memtable.FlushablePartitionSet<?> flushSet = memtable.getFlushSet(from, to);
+        SSTableFormat.Type formatType = SSTableFormat.Type.current();
+        long estimatedSize = formatType.info.getWriterFactory().estimateSize(flushSet);
+
+        Descriptor descriptor = flushLocation == null
+                                ? cfs.newSSTableDescriptor(cfs.getDirectories().getWriteableLocationAsFile(estimatedSize), formatType)
+                                : cfs.newSSTableDescriptor(cfs.getDirectories().getLocationForDisk(flushLocation), formatType);
+
+        SSTableMultiWriter writer = createFlushWriter(cfs,
+                                                      flushSet,
+                                                      txn,
+                                                      descriptor,
+                                                      flushSet.partitionCount());
+
+        return new FlushRunnable(flushSet, writer, cfs.metric, true);
+    }
+
+    public static Throwable abortRunnables(List<FlushRunnable> runnables, Throwable t)
+    {
+        if (runnables != null)
+            for (FlushRunnable runnable : runnables)
+                t = runnable.writer.abort(t);
+        return t;
+    }
+
+    public static class FlushRunnable implements Callable<SSTableMultiWriter>
+    {
+        private final Memtable.FlushablePartitionSet<?> toFlush;
+
+        private final SSTableMultiWriter writer;
+        private final TableMetrics metrics;
+        private final boolean isBatchLogTable;
+        private final boolean logCompletion;
+
+        public FlushRunnable(Memtable.FlushablePartitionSet<?> flushSet,
+                             SSTableMultiWriter writer,
+                             TableMetrics metrics,
+                             boolean logCompletion)
+        {
+            this.toFlush = flushSet;
+            this.writer = writer;
+            this.metrics = metrics;
+            this.isBatchLogTable = toFlush.metadata() == SystemKeyspace.Batches;
+            this.logCompletion = logCompletion;
+        }
+
+        private void writeSortedContents()
+        {
+            logger.info("Writing {}, flushed range = [{}, {})", toFlush.memtable(), toFlush.from(), toFlush.to());
+
+            // (we can't clear out the map as-we-go to free up memory,
+            //  since the memtable is being used for queries in the "pending flush" category)
+            for (Partition partition : toFlush)
+            {
+                // Each batchlog partition is a separate entry in the log. And for an entry, we only do 2
+                // operations: 1) we insert the entry and 2) we delete it. Further, BL data is strictly local,
+                // we don't need to preserve tombstones for repair. So if both operation are in this
+                // memtable (which will almost always be the case if there is no ongoing failure), we can
+                // just skip the entry (CASSANDRA-4667).
+                if (isBatchLogTable && !partition.partitionLevelDeletion().isLive() && partition.hasRows())
+                    continue;
+
+                if (!partition.isEmpty())
+                {
+                    try (UnfilteredRowIterator iter = partition.unfilteredIterator())
+                    {
+                        writer.append(iter);
+                    }
+                }
+            }
+
+            if (logCompletion)
+            {
+                long bytesFlushed = writer.getFilePointer();
+                logger.info("Completed flushing {} ({}) for commitlog position {}",
+                            writer.getFilename(),
+                            FBUtilities.prettyPrintMemory(bytesFlushed),
+                            toFlush.memtable().getFinalCommitLogUpperBound());
+                // Update the metrics
+                metrics.bytesFlushed.inc(bytesFlushed);
+            }
+        }
+
+        @Override
+        public SSTableMultiWriter call()
+        {
+            writeSortedContents();
+            return writer;
+            // We don't close the writer on error as the caller aborts all runnables if one happens.
+        }
+
+        @Override
+        public String toString()
+        {
+            return "Flush " + toFlush.metadata().keyspace + '.' + toFlush.metadata().name;
+        }
+    }
+
+    public static SSTableMultiWriter createFlushWriter(ColumnFamilyStore cfs,
+                                                       Memtable.FlushablePartitionSet<?> flushSet,
+                                                       LifecycleTransaction txn,
+                                                       Descriptor descriptor,
+                                                       long partitionCount)
+    {
+        MetadataCollector sstableMetadataCollector = new MetadataCollector(flushSet.metadata().comparator)
+                                                     .commitLogIntervals(new IntervalSet<>(flushSet.commitLogLowerBound(),
+                                                                                           flushSet.commitLogUpperBound()));
+
+        return cfs.createSSTableMultiWriter(descriptor,
+                                            partitionCount,
+                                            ActiveRepairService.UNREPAIRED_SSTABLE,
+                                            ActiveRepairService.NO_PENDING_REPAIR,
+                                            false,
+                                            sstableMetadataCollector,
+                                            new SerializationHeader(true,
+                                                                    flushSet.metadata(),
+                                                                    flushSet.columns(),
+                                                                    flushSet.encodingStats()),
+                                            txn);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/Memtable.java b/src/java/org/apache/cassandra/db/memtable/Memtable.java
new file mode 100644
index 0000000..3a18a8c
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/Memtable.java
@@ -0,0 +1,433 @@
+/*
+ * 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.memtable;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.annotation.concurrent.NotThreadSafe;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.db.RegularAndStaticColumns;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.db.partitions.Partition;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.db.rows.UnfilteredSource;
+import org.apache.cassandra.index.transactions.UpdateTransaction;
+import org.apache.cassandra.io.sstable.format.SSTableWriter;
+import org.apache.cassandra.metrics.TableMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.OpOrder;
+
+/**
+ * Memtable interface. This defines the operations the ColumnFamilyStore can perform with memtables.
+ * They are of several types:
+ * - construction factory interface
+ * - write and read operations: put, rowIterator and partitionIterator
+ * - statistics and features, including partition counts, data size, encoding stats, written columns
+ * - memory usage tracking, including methods of retrieval and of adding extra allocated space (used non-CFS secondary
+ *   indexes)
+ * - flush functionality, preparing the set of partitions to flush for given ranges
+ * - lifecycle management, i.e. operations that prepare and execute switch to a different memtable, together
+ *   with ways of tracking the affected commit log spans
+ *
+ * See Memtable_API.md for details on implementing and using alternative memtable implementations.
+ */
+public interface Memtable extends Comparable<Memtable>, UnfilteredSource
+{
+    public static final long NO_MIN_TIMESTAMP = -1;
+
+    // Construction
+
+    /**
+     * Factory interface for constructing memtables, and querying write durability features.
+     *
+     * The factory is chosen using the MemtableParams class (passed as argument to
+     * {@code CREATE TABLE ... WITH memtable = '<configuration_name>'} where the configuration definition is a map given
+     * under {@code memtable_configurations} in cassandra.yaml). To make that possible, implementations must provide
+     * either a static {@code FACTORY} field (if they accept no further option) or a static
+     * {@code factory(Map<String, String>)} method. In the latter case, the method should avoid creating
+     * multiple instances of the factory for the same parameters, or factories should at least implement hashCode and
+     * equals.
+     */
+    interface Factory
+    {
+        /**
+         * Create a memtable.
+         *
+         * @param commitLogLowerBound A commit log lower bound for the new memtable. This will be equal to the previous
+         *                            memtable's upper bound and defines the span of positions that any flushed sstable
+         *                            will cover.
+         * @param metadaRef Pointer to the up-to-date table metadata.
+         * @param owner Owning objects that will receive flush requests triggered by the memtable (e.g. on expiration).
+         */
+        Memtable create(AtomicReference<CommitLogPosition> commitLogLowerBound, TableMetadataRef metadaRef, Owner owner);
+
+        /**
+         * If the memtable can achieve write durability directly (i.e. using some feature other than the commitlog, e.g.
+         * persistent memory), it can return true here, in which case the commit log will not store mutations in this
+         * table.
+         * Note that doing so will prevent point-in-time restores and changed data capture, thus a durable memtable must
+         * allow the option of turning commit log writing on even if it does not need it.
+         */
+        default boolean writesShouldSkipCommitLog()
+        {
+            return false;
+        }
+
+        /**
+         * This should be true if the memtable can achieve write durability for crash recovery directly (i.e. using some
+         * feature other than the commitlog, e.g. persistent memory).
+         * Setting this flag to true means that the commitlog should not replay mutations for this table on restart,
+         * and that it should not try to preserve segments that contain relevant data.
+         * Unless writesShouldSkipCommitLog() is also true, writes will be recorded in the commit log as they may be
+         * needed for changed data capture or point-in-time restore.
+         */
+        default boolean writesAreDurable()
+        {
+            return false;
+        }
+
+        /**
+         * Normally we can receive streamed sstables directly, skipping the memtable stage (zero-copy-streaming). When
+         * the memtable is the primary data store (e.g. persistent memtables), it will usually prefer to receive the
+         * data instead.
+         *
+         * If this returns true, all streamed sstables's content will be read and replayed as mutations, disabling
+         * zero-copy streaming.
+         */
+        default boolean streamToMemtable()
+        {
+            return false;
+        }
+
+        /**
+         * When we need to stream data, we usually flush and stream the resulting sstables. This will not work correctly
+         * if the memtable does not want to flush for streaming (e.g. persistent memtables acting as primary data
+         * store), because data (not just recent) will be missing from the streamed view. Such memtables must present
+         * their data separately for streaming.
+         * In other words if the memtable returns false on shouldSwitch(STREAMING/REPAIR), its factory must return true
+         * here.
+         *
+         * If this flag returns true, streaming will write the relevant content that resides in the memtable to
+         * temporary sstables, stream these sstables and then delete them.
+         */
+        default boolean streamFromMemtable()
+        {
+            return false;
+        }
+
+        /**
+         * Override this method to include implementation-specific memtable metrics in the table metrics.
+         *
+         * Memtable metrics lifecycle matches table lifecycle. It is the table that owns the metrics and
+         * decides when to release them.
+         */
+        default TableMetrics.ReleasableMetric createMemtableMetrics(TableMetadataRef metadataRef)
+        {
+            return null;
+        }
+    }
+
+    /**
+     * Interface for providing signals back and requesting information from the owner, i.e. the object that controls the
+     * memtable. This is usually the ColumnFamilyStore; the interface is used to limit the dependency of memtables on
+     * the details of its implementation.
+     */
+    interface Owner
+    {
+        /** Signal to the owner that a flush is required (e.g. in response to hitting space limits) */
+        Future<CommitLogPosition> signalFlushRequired(Memtable memtable, ColumnFamilyStore.FlushReason reason);
+
+        /** Get the current memtable for this owner. Used to avoid capturing memtable in scheduled flush tasks. */
+        Memtable getCurrentMemtable();
+
+        /**
+         * Collect the index memtables flushed together with this. Used to accurately calculate memory that would be
+         * freed by a flush.
+         */
+        Iterable<Memtable> getIndexMemtables();
+
+        /**
+         * Construct a list of boundaries that split the locally-owned ranges into the given number of shards,
+         * splitting the owned space evenly. It is up to the memtable to use this information.
+         * Any changes in the ring structure (e.g. added or removed nodes) will invalidate the splits; in such a case
+         * the memtable will be sent a {@link #shouldSwitch}(OWNED_RANGES_CHANGE) and, should that return false, a
+         * {@link #localRangesUpdated()} call.
+         */
+        ShardBoundaries localRangeSplits(int shardCount);
+    }
+
+    // Main write and read operations
+
+    /**
+     * Put new data in the memtable. This operation may block until enough memory is available in the memory pool.
+     *
+     * @param update the partition update, may be a new partition or an update to an existing one
+     * @param indexer receives information about the update's effect
+     * @param opGroup write operation group, used to permit the operation to complete if it is needed to complete a
+     *                flush to free space.
+     *
+     * @return the smallest timestamp delta between corresponding rows from existing and update. A
+     * timestamp delta being computed as the difference between the cells and DeletionTimes from any existing partition
+     * and those in {@code update}. See CASSANDRA-7979.
+     */
+    long put(PartitionUpdate update, UpdateTransaction indexer, OpOrder.Group opGroup);
+
+    // Read operations are provided by the UnfilteredSource interface.
+
+    // Statistics
+
+    /** Number of partitions stored in the memtable */
+    long partitionCount();
+
+    /** Size of the data not accounting for any metadata / mapping overheads */
+    long getLiveDataSize();
+
+    /**
+     * Number of "operations" (in the sense defined in {@link PartitionUpdate#operationCount()}) the memtable has
+     * executed.
+     */
+    long operationCount();
+
+    /**
+     * The table's definition metadata.
+     *
+     * Note that this tracks the current state of the table and is not necessarily the same as what was used to create
+     * the memtable.
+     */
+    TableMetadata metadata();
+
+
+    // Memory usage tracking
+
+    /**
+     * Add this memtable's used memory to the given usage object. This can be used to retrieve a single memtable's usage
+     * as well as to combine the ones of related sstables (e.g. a table and its table-based secondary indexes).
+     */
+    void addMemoryUsageTo(MemoryUsage usage);
+
+
+    /**
+     * Creates a holder for memory usage collection.
+     *
+     * This is used to track on- and off-heap memory, as well as the ratio to the total permitted memtable memory.
+     */
+    static MemoryUsage newMemoryUsage()
+    {
+        return new MemoryUsage();
+    }
+
+    /**
+     * Shorthand for the getting a given table's memory usage.
+     * Implemented as a static to prevent implementations altering expectations by e.g. returning a cached object.
+     */
+    static MemoryUsage getMemoryUsage(Memtable memtable)
+    {
+        MemoryUsage usage = newMemoryUsage();
+        memtable.addMemoryUsageTo(usage);
+        return usage;
+    }
+
+    @NotThreadSafe
+    class MemoryUsage
+    {
+        /** On-heap memory used in bytes */
+        public long ownsOnHeap = 0;
+        /** Off-heap memory used in bytes */
+        public long ownsOffHeap = 0;
+        /** On-heap memory as ratio to permitted memtable space */
+        public float ownershipRatioOnHeap = 0.0f;
+        /** Off-heap memory as ratio to permitted memtable space */
+        public float ownershipRatioOffHeap = 0.0f;
+
+        @Override
+        public String toString()
+        {
+            return String.format("%s (%.0f%%) on-heap, %s (%.0f%%) off-heap",
+                                 FBUtilities.prettyPrintMemory(ownsOnHeap),
+                                 ownershipRatioOnHeap * 100,
+                                 FBUtilities.prettyPrintMemory(ownsOffHeap),
+                                 ownershipRatioOffHeap * 100);
+        }
+    }
+
+    /**
+     * Adjust the used on-heap space by the given size (e.g. to reflect memory used by a non-table-based index).
+     * This operation may block until enough memory is available in the memory pool.
+     *
+     * @param additionalSpace the number of allocated bytes
+     * @param opGroup write operation group, used to permit the operation to complete if it is needed to complete a
+     *                flush to free space.
+     */
+    void markExtraOnHeapUsed(long additionalSpace, OpOrder.Group opGroup);
+
+    /**
+     * Adjust the used off-heap space by the given size (e.g. to reflect memory used by a non-table-based index).
+     * This operation may block until enough memory is available in the memory pool.
+     *
+     * @param additionalSpace the number of allocated bytes
+     * @param opGroup write operation group, used to permit the operation to complete if it is needed to complete a
+     *                flush to free space.
+     */
+    void markExtraOffHeapUsed(long additionalSpace, OpOrder.Group opGroup);
+
+
+    // Flushing
+
+    /**
+     * Get the collection of data between the given partition boundaries in a form suitable for flushing.
+     */
+    FlushablePartitionSet<?> getFlushSet(PartitionPosition from, PartitionPosition to);
+
+    /**
+     * A collection of partitions for flushing plus some information required for writing an sstable.
+     *
+     * Note that the listed entries must conform with the specified metadata. In particular, if the memtable is still
+     * being written to, care must be taken to not list newer items as they may violate the bounds collected by the
+     * encoding stats or refer to columns that don't exist in the collected columns set.
+     */
+    interface FlushablePartitionSet<P extends Partition> extends Iterable<P>, SSTableWriter.SSTableSizeParameters
+    {
+        Memtable memtable();
+
+        PartitionPosition from();
+        PartitionPosition to();
+
+        /** The commit log position at the time that this memtable was created */
+        CommitLogPosition commitLogLowerBound();
+        /** The commit log position at the time that this memtable was switched out */
+        CommitLogPosition commitLogUpperBound();
+
+        /** The set of all columns that have been written */
+        RegularAndStaticColumns columns();
+        /** Statistics required for writing an sstable efficiently */
+        EncodingStats encodingStats();
+
+        default TableMetadata metadata()
+        {
+            return memtable().metadata();
+        }
+
+        default boolean isEmpty()
+        {
+            return partitionCount() > 0;
+        }
+    }
+
+
+    // Lifecycle management
+
+    /**
+     * Called to tell the memtable that it is being switched out and will be flushed (or dropped) and discarded.
+     * Will be followed by a {@link #getFlushSet} call (if the table is not truncated or dropped), and a
+     * {@link #discard}.
+     *
+     * @param writeBarrier The barrier that will signal that all writes to this memtable have completed. That is, the
+     *                     point after which writes cannot be accepted by this memtable (it is permitted for writes
+     *                     before this barrier to go into the next; see {@link #accepts}).
+     * @param commitLogUpperBound The upper commit log position for this memtable. The value may be modified after this
+     *                            call and will match the next memtable's lower commit log bound.
+     */
+    void switchOut(OpOrder.Barrier writeBarrier, AtomicReference<CommitLogPosition> commitLogUpperBound);
+
+    /**
+     * This memtable is no longer in use or required for outstanding flushes or operations.
+     * All held memory must be released.
+     */
+    void discard();
+
+    /**
+     * Decide if this memtable should take a write with the given parameters, or if the write should go to the next
+     * memtable. This enforces that no writes after the barrier set by {@link #switchOut} can be accepted, and
+     * is also used to define a shared commit log bound as the upper for this memtable and lower for the next.
+     */
+    boolean accepts(OpOrder.Group opGroup, CommitLogPosition commitLogPosition);
+
+    /** Approximate commit log lower bound, <= getCommitLogLowerBound, used as a time stamp for ordering */
+    CommitLogPosition getApproximateCommitLogLowerBound();
+
+    /** The commit log position at the time that this memtable was created */
+    CommitLogPosition getCommitLogLowerBound();
+
+    /** The commit log position at the time that this memtable was switched out */
+    LastCommitLogPosition getFinalCommitLogUpperBound();
+
+    /** True if the memtable can contain any data that was written before the given commit log position */
+    boolean mayContainDataBefore(CommitLogPosition position);
+
+    /** True if the memtable contains no data */
+    boolean isClean();
+
+    /** Order memtables by time as reflected in the commit log position at time of construction */
+    default int compareTo(Memtable that)
+    {
+        return this.getApproximateCommitLogLowerBound().compareTo(that.getApproximateCommitLogLowerBound());
+    }
+
+    /**
+     * Decides whether the memtable should be switched/flushed for the passed reason.
+     * Normally this will return true, but e.g. persistent memtables may choose not to flush. Returning false will
+     * trigger further action for some reasons:
+     * - SCHEMA_CHANGE will be followed by metadataUpdated().
+     * - OWNED_RANGES_CHANGE will be followed by localRangesUpdated().
+     * - SNAPSHOT will be followed by performSnapshot().
+     * - STREAMING/REPAIR will be followed by creating a FlushSet for the streamed/repaired ranges. This data will be
+     *   used to create sstables, which will be streamed and then deleted.
+     * This will not be called to perform truncation or drop (in that case the memtable is unconditionally dropped),
+     * but a flush may nevertheless be requested in that case to prepare a snapshot.
+     */
+    boolean shouldSwitch(ColumnFamilyStore.FlushReason reason);
+
+    /**
+     * Called when the table's metadata is updated. The memtable's metadata reference now points to the new version.
+     * This will not be called if {@link #shouldSwitch)(SCHEMA_CHANGE) returns true, as the memtable will be swapped out
+     * instead.
+     */
+    void metadataUpdated();
+
+    /**
+     * Called when the known ranges have been updated and owner.localRangeSplits() may return different values.
+     * This will not be called if {@link #shouldSwitch)(OWNED_RANGES_CHANGE) returns true, as the memtable will be
+     * swapped out instead.
+     */
+    void localRangesUpdated();
+
+    /**
+     * If the memtable needs to do some special action for snapshots (e.g. because it is persistent and does not want
+     * to flush), it should return false on the above with reason SNAPSHOT and implement this method.
+     */
+    void performSnapshot(String snapshotName);
+
+    /**
+     * Special commit log position marker used in the upper bound marker setting process
+     * (see {@link org.apache.cassandra.db.ColumnFamilyStore#setCommitLogUpperBound} and {@link AbstractMemtable#accepts})
+     */
+    public static final class LastCommitLogPosition extends CommitLogPosition
+    {
+        public LastCommitLogPosition(CommitLogPosition copy)
+        {
+            super(copy.segmentId, copy.position);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/Memtable_API.md b/src/java/org/apache/cassandra/db/memtable/Memtable_API.md
new file mode 100644
index 0000000..8a582e3
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/Memtable_API.md
@@ -0,0 +1,178 @@
+# Memtable API
+
+[CEP-11](https://cwiki.apache.org/confluence/display/CASSANDRA/CEP-11%3A+Pluggable+memtable+implementations) 
+/ [CASSANDRA-17034](https://issues.apache.org/jira/browse/CASSANDRA-17034)
+
+## Configuration specification
+
+Memtable types and options are specified using memtable "configurations", which specify an implementation class
+and its parameters. 
+
+The memtable configurations are defined in `cassandra.yaml`, using the following format:
+
+```yaml
+memtable:
+    configurations:
+        〈configuration name〉:
+          class_name: 〈class〉
+          inherits: 〈configuration name〉
+          parameters:
+            〈parameters〉
+```
+
+Configurations can copy the properties from others, including being full copies of another, which can be useful for
+easily remapping one name to another configuration.
+
+The default memtable configuration is named `default`. It can be overridden if the yaml specifies it (including
+using inheritance to copy another configuration), and it can be inherited, even if it is not explicitly defined in
+the yaml (e.g. to change some parameter but not the memtable class).
+
+Examples:
+
+```yaml
+memtable:
+    configurations:
+        more_shards:
+          inherits: default
+          parameters:
+             shards: 32
+```
+
+```yaml
+memtable:
+    configurations:
+        skiplist:
+          class_name: SkipListMemtable
+        sharded:
+          class_name: ShardedSkipListMemtable
+        default:
+          inherits: sharded
+```
+
+Note that the database will only validate the memtable class and its parameters when a configuration needs to be
+instantiated for a table.
+
+## Memtable selection
+
+Once a configuration has been defined, it can be used by specifying it in the `memtable` parameter of a `CREATE TABLE`
+or `ALTER TABLE` statement, for example:
+
+```
+CREATE TABLE ... WITH ... AND memtable = 'trie';
+```
+or
+```
+ALTER TABLE ... WITH memtable = 'skiplist';
+```
+
+If a memtable is not specified, the configuration `default` will be used. To reset a table to the default memtable,
+use
+```
+ALTER TABLE ... WITH memtable = 'default';
+```
+
+The memtable configuration selection is per table, i.e. it will be propagated to all nodes in the cluster. If some nodes
+do not have a definition for that configuration or cannot instantiate the class, they will log an error and fall 
+back to the default memtable configuration to avoid schema disagreements. However, if some nodes are still on a version 
+of Cassandra before 4.1, they will reject the schema change. We therefore recommend using a separate `ALTER` statement 
+to change a table's memtable implementation; upgrading all nodes to 4.1 or later is required to use the API.
+
+As additional safety when first deploying an alternative implementation to a production cluster, one may consider
+first deploying a remapped `default` configuration to all nodes in the cluster, switching the schema to reference
+it, and then changing the implementation by modifying the configuration one node at a time.
+
+For example, a remapped default can be specified with this:
+```yaml
+memtable:
+    configurations:
+        better_memtable:
+            inherits: default
+```
+selected via
+```
+ALTER TABLE production_table WITH memtable = 'better_memtable';
+```
+and later switched one node at a time to
+```yaml
+memtable:
+    configurations:
+        our_memtable:
+            class_name: ...
+        better_memtable:
+            inherits: our_memtable
+```
+
+## Memtable implementation
+
+A memtable implementation is an implementation of the `Memtable` interface. The main work of the class will be
+performed by the `put`, `rowIterator` and `partitionIterator` methods, used to write and read information to/from the
+memtable. In addition to this, the implementation must support retrieval of the content in a form suitable for flushing 
+(via `getFlushSet`), memory use and statistics tracking, mechanics for triggering a flush for reasons
+controlled by the memtable (e.g. exhaustion of the given memory allocation), and finally mechanisms for tracking the
+commit log spans covered by a memtable.
+
+Abstract classes that provide the latter parts of the functionality (expected to be shared by most
+implementations) are provided as the `AbstractMemtable` (statistics tracking), `AbstractMemtableWithCommitlog` (adds
+commit log span tracking) and `AbstractAllocatorMemtable` (adds memory management via the `Allocator` class, together
+with flush triggering on memory use and time interval expiration).
+
+The memtable API also gives the memtable some control over flushing and the functioning of the commit log. The former
+is there to permit memtables that operate long-term and/or can handle some events internally, without a need to flush.
+The latter enables memtables that have an internal durability mechanism, such as ones using persistent memory or a
+tightly integrated commit log (e.g. using the commit log buffers for memtable data storage).
+
+The memtable implementation must also provide a mechanism for memtable construction called a memtable "factory" 
+(the `Memtable.Factory` interface). Some features of the implementation may be needed before an instance is created or
+where the memtable instance is not accessible. To make working with them more straightforward, the following 
+memtable-controlled options are implemented on the factory:
+
+- `boolean writesAreDurable()` should return true if the memtable has its own persistence mechanism and does not want
+  the commitlog to provide persistence. In this case the commit log can still store the writes for changed-data-capture (CDC)
+  or point-in-time restore (PITR), but it need not keep them for replay until the memtable is flushed.
+- `boolean writesShouldSkipCommitLog()` should return true if the memtable does not want the commit log to store any of
+  its data. The expectation for this flag is that a persistent memtable will take a configuration parameter to turn this
+  option on to improve performance. Enabling this flag is not compatible with CDC or PITR.
+- `boolean streamToMemtable()` and `boolean streamFromMemtable()` should return true if the memtable is long-lived and 
+  cannot flush to facilitate streaming. In this case the streaming code will implement the process in a way that 
+  retrieves data in the memtable before sending, and applies received data in the memtable instead of directly creating 
+  an sstable.
+
+### Instantiation and configuration
+
+The memtables are instantiated by the factory, which is constructed via reflection on creating a `ColumnFamilyStore` or
+altering the table's configuration.
+
+Memtable classes must either contain a static `FACTORY` field (if they take no arguments other than class), or implement 
+a `factory(Map<String, String>)` method, which is called using the configuration `parameters`. For validation, the
+latter should consume any further options (using `map.remove`).
+
+The `MemtableParams` class will look for the specified class name (prefixed with `org.apache.cassandra.db.memtable.`
+if only a short name was given), then look for a `factory` method. If it finds one, it will call it with a copy of the 
+supplied parameters; if it does not, it will look for the `FACTORY` field and use its value if found. It will error out
+if the class was not found, if neither the method or field was found, or if the user supplied parameters that did not 
+get consumed.
+
+Because multiple configurations and tables may use the same parameters, it is expected that the factory method will
+store and reuse constructed factories to avoid wasting space for duplicate objects (this is typical for configuration 
+objects in Cassandra).
+
+At this time many of the configuration parameters for memtables are still configured using top-level parameters like
+`memtable_allocation_type` in `cassandra.yaml` and `memtable_flush_period_in_ms` in the table schema.
+
+
+### Sample implementation
+
+The API comes with a proof-of-concept implementation, a sharded skip-list memtable implemented by the 
+`ShardedSkipListMemtable` class. The difference between this and the default memtable is that the sharded version breaks 
+the token space served by the node into roughly equal regions and uses a separate skip-list for each shard. Sharding
+spreads the write concurrency among these independent skip lists, reducing congestion and can lead to significantly
+improved write throughput.
+
+This implementation takes two parameters, `shards` which specifies the number of shards to split into (by default, the
+number of CPU threads available to the process) and `serialize_writes`, which, if set to `true` causes writes to the
+memtable to be synchronized. The latter can be useful to minimize space and time wasted for unsuccesful lockless 
+partition modification where a new copy of the partition would be prepared but not used due to concurrent modification.
+Regardless of the setting, reads can always execute in parallel, including concurrently with writes.
+
+Please note that sharding cannot be used with non-hashing partitioners (i.e. `ByteOrderPartitioner` or 
+`OrderPreservingPartitioner`).
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/db/memtable/ShardBoundaries.java b/src/java/org/apache/cassandra/db/memtable/ShardBoundaries.java
new file mode 100644
index 0000000..fb9cc98
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/ShardBoundaries.java
@@ -0,0 +1,129 @@
+/*
+ * 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.memtable;
+
+import java.util.Arrays;
+import java.util.List;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.dht.Token;
+
+/**
+ * Holds boundaries (tokens) used to map a particular token (so partition key) to a shard id.
+ * In practice, each keyspace has its associated boundaries, see {@link Keyspace}.
+ * <p>
+ * Technically, if we use {@code n} shards, this is a list of {@code n-1} tokens and each token {@code tk} gets assigned
+ * to the shard ID corresponding to the slot of the smallest token in the list that is greater to {@code tk}, or {@code n}
+ * if {@code tk} is bigger than any token in the list.
+ */
+public class ShardBoundaries
+{
+    private static final Token[] EMPTY_TOKEN_ARRAY = new Token[0];
+
+    // Special boundaries that map all tokens to one shard.
+    // These boundaries will be used in either of these cases:
+    // - there is only 1 shard configured
+    // - the default partitioner doesn't support splitting
+    // - the keyspace is local system keyspace
+    public static final ShardBoundaries NONE = new ShardBoundaries(EMPTY_TOKEN_ARRAY, -1);
+
+    private final Token[] boundaries;
+    public final long ringVersion;
+
+    @VisibleForTesting
+    public ShardBoundaries(Token[] boundaries, long ringVersion)
+    {
+        this.boundaries = boundaries;
+        this.ringVersion = ringVersion;
+    }
+
+    public ShardBoundaries(List<Token> boundaries, long ringVersion)
+    {
+        this(boundaries.toArray(EMPTY_TOKEN_ARRAY), ringVersion);
+    }
+
+    /**
+     * Computes the shard to use for the provided token.
+     */
+    public int getShardForToken(Token tk)
+    {
+        for (int i = 0; i < boundaries.length; i++)
+        {
+            if (tk.compareTo(boundaries[i]) < 0)
+                return i;
+        }
+        return boundaries.length;
+    }
+
+    /**
+     * Computes the shard to use for the provided key.
+     */
+    public int getShardForKey(PartitionPosition key)
+    {
+        // Boundaries are missing if the node is not sufficiently initialized yet
+        if (boundaries.length == 0)
+            return 0;
+
+        assert (key.getPartitioner() == DatabaseDescriptor.getPartitioner());
+        return getShardForToken(key.getToken());
+    }
+
+    /**
+     * The number of shards that this boundaries support, that is how many different shard ids {@link #getShardForToken} might
+     * possibly return.
+     *
+     * @return the number of shards supported by theses boundaries.
+     */
+    public int shardCount()
+    {
+        return boundaries.length + 1;
+    }
+
+    @Override
+    public String toString()
+    {
+        if (boundaries.length == 0)
+            return "shard 0: (min, max)";
+
+        StringBuilder sb = new StringBuilder();
+        sb.append("shard 0: (min, ").append(boundaries[0]).append(") ");
+        for (int i = 0; i < boundaries.length - 1; i++)
+            sb.append("shard ").append(i+1).append(": (").append(boundaries[i]).append(", ").append(boundaries[i+1]).append("] ");
+        sb.append("shard ").append(boundaries.length).append(": (").append(boundaries[boundaries.length-1]).append(", max)");
+        return sb.toString();
+    }
+
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        ShardBoundaries that = (ShardBoundaries) o;
+
+        return Arrays.equals(boundaries, that.boundaries);
+    }
+
+    public int hashCode()
+    {
+        return Arrays.hashCode(boundaries);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/ShardedSkipListMemtable.java b/src/java/org/apache/cassandra/db/memtable/ShardedSkipListMemtable.java
new file mode 100644
index 0000000..51cd5f2
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/ShardedSkipListMemtable.java
@@ -0,0 +1,569 @@
+/*
+ * 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.memtable;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Iterators;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.DataRange;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.db.RegularAndStaticColumns;
+import org.apache.cassandra.db.Slices;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.db.filter.ClusteringIndexFilter;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.partitions.AbstractUnfilteredPartitionIterator;
+import org.apache.cassandra.db.partitions.AtomicBTreePartition;
+import org.apache.cassandra.db.partitions.Partition;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.dht.AbstractBounds;
+import org.apache.cassandra.dht.Bounds;
+import org.apache.cassandra.dht.IncludingExcludingBounds;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.index.transactions.UpdateTransaction;
+import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.OpOrder;
+import org.apache.cassandra.utils.memory.Cloner;
+import org.apache.cassandra.utils.memory.MemtableAllocator;
+import org.github.jamm.Unmetered;
+
+/**
+ * A proof-of-concept sharded memtable implementation. This implementation splits the partition skip-list into several
+ * independent skip-lists each covering a roughly equal part of the token space served by this node. This reduces
+ * congestion of the skip-list from concurrent writes and can lead to improved write throughput.
+ *
+ * The implementation takes two parameters:
+ * - shards: the number of shards to split into.
+ * - serialize_writes: if false, each shard may serve multiple writes in parallel; if true, writes to each shard are
+ *   synchronized.
+ *
+ * Also see Memtable_API.md.
+ */
+public class ShardedSkipListMemtable extends AbstractAllocatorMemtable
+{
+    private static final Logger logger = LoggerFactory.getLogger(ShardedSkipListMemtable.class);
+
+    public static final String SHARDS_OPTION = "shards";
+    public static final String LOCKING_OPTION = "serialize_writes";
+
+    // 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.
+    // The fact this is fixed for the duration of the memtable lifetime, guarantees we'll always pick the same shard
+    // for a given key, even if we race with the StorageService initialization or with topology changes.
+    @Unmetered
+    final ShardBoundaries boundaries;
+
+    /**
+     * Core-specific memtable regions. All writes must go through the specific core. The data structures used
+     * are concurrent-read safe, thus reads can be carried out from any thread.
+     */
+    final MemtableShard[] shards;
+
+    @VisibleForTesting
+    public static final String SHARD_COUNT_PROPERTY = "cassandra.memtable.shard.count";
+
+    // default shard count, used when a specific number of shards is not specified in the parameters
+    private static final int SHARD_COUNT = Integer.getInteger(SHARD_COUNT_PROPERTY, FBUtilities.getAvailableProcessors());
+
+    private final Factory factory;
+
+    // only to be used by init(), to setup the very first memtable for the cfs
+    ShardedSkipListMemtable(AtomicReference<CommitLogPosition> commitLogLowerBound,
+                            TableMetadataRef metadataRef,
+                            Owner owner,
+                            Integer shardCountOption,
+                            Factory factory)
+    {
+        super(commitLogLowerBound, metadataRef, owner);
+        int shardCount = shardCountOption != null ? shardCountOption : SHARD_COUNT;
+        this.boundaries = owner.localRangeSplits(shardCount);
+        this.shards = generatePartitionShards(boundaries.shardCount(), allocator, metadataRef);
+        this.factory = factory;
+    }
+
+    private static MemtableShard[] generatePartitionShards(int splits,
+                                                           MemtableAllocator allocator,
+                                                           TableMetadataRef metadata)
+    {
+        MemtableShard[] partitionMapContainer = new MemtableShard[splits];
+        for (int i = 0; i < splits; i++)
+            partitionMapContainer[i] = new MemtableShard(metadata, allocator);
+
+        return partitionMapContainer;
+    }
+
+    public boolean isClean()
+    {
+        for (MemtableShard shard : shards)
+            if (!shard.isEmpty())
+                return false;
+        return true;
+    }
+
+    @Override
+    protected Memtable.Factory factory()
+    {
+        return factory;
+    }
+
+    /**
+     * Should only be called by ColumnFamilyStore.apply via Keyspace.apply, which supplies the appropriate
+     * OpOrdering.
+     *
+     * commitLogSegmentPosition should only be null if this is a secondary index, in which case it is *expected* to be null
+     */
+    public long put(PartitionUpdate update, UpdateTransaction indexer, OpOrder.Group opGroup)
+    {
+        DecoratedKey key = update.partitionKey();
+        MemtableShard shard = shards[boundaries.getShardForKey(key)];
+        return shard.put(key, update, indexer, opGroup);
+    }
+
+    /**
+     * Technically we should scatter gather on all the core threads because the size in following calls are not
+     * using volatile variables, but for metrics purpose this should be good enough.
+     */
+    @Override
+    public long getLiveDataSize()
+    {
+        long total = 0L;
+        for (MemtableShard shard : shards)
+            total += shard.liveDataSize();
+        return total;
+    }
+
+    @Override
+    public long operationCount()
+    {
+        long total = 0L;
+        for (MemtableShard shard : shards)
+            total += shard.currentOperations();
+        return total;
+    }
+
+    @Override
+    public long partitionCount()
+    {
+        int total = 0;
+        for (MemtableShard shard : shards)
+            total += shard.size();
+        return total;
+    }
+
+    /**
+     * Returns the minTS if one available, otherwise NO_MIN_TIMESTAMP.
+     *
+     * EncodingStats uses a synthetic epoch TS at 2015. We don't want to leak that (CASSANDRA-18118) so we return NO_MIN_TIMESTAMP instead.
+     *
+     * @return The minTS or NO_MIN_TIMESTAMP if none available
+     */
+    @Override
+    public long getMinTimestamp()
+    {
+        long min = Long.MAX_VALUE;
+        for (MemtableShard shard : shards)
+            min =  Long.min(min, shard.minTimestamp());
+        return min != EncodingStats.NO_STATS.minTimestamp ? min : NO_MIN_TIMESTAMP;
+    }
+
+    @Override
+    public int getMinLocalDeletionTime()
+    {
+        int min = Integer.MAX_VALUE;
+        for (MemtableShard shard : shards)
+            min = Integer.min(min, shard.minLocalDeletionTime());
+        return min;
+    }
+
+    @Override
+    RegularAndStaticColumns columns()
+    {
+        for (MemtableShard shard : shards)
+            columnsCollector.update(shard.columnsCollector);
+        return columnsCollector.get();
+    }
+
+    @Override
+    EncodingStats encodingStats()
+    {
+        for (MemtableShard shard : shards)
+            statsCollector.update(shard.statsCollector.get());
+        return statsCollector.get();
+    }
+
+    @Override
+    public MemtableUnfilteredPartitionIterator partitionIterator(final ColumnFilter columnFilter,
+                                                                 final DataRange dataRange,
+                                                                 SSTableReadsListener readsListener)
+    {
+        AbstractBounds<PartitionPosition> keyRange = dataRange.keyRange();
+
+        PartitionPosition left = keyRange.left;
+        PartitionPosition right = keyRange.right;
+
+        boolean isBound = keyRange instanceof Bounds;
+        boolean includeStart = isBound || keyRange instanceof IncludingExcludingBounds;
+        boolean includeStop = isBound || keyRange instanceof Range;
+
+        Iterator<AtomicBTreePartition> iterator = getPartitionIterator(left, includeStart, right, includeStop);
+
+        return new MemtableUnfilteredPartitionIterator(metadata(), iterator, columnFilter, dataRange);
+        // readsListener is ignored as it only accepts sstable signals
+    }
+
+    private Iterator<AtomicBTreePartition> getPartitionIterator(PartitionPosition left, boolean includeStart, PartitionPosition right, boolean includeStop)
+    {
+        int leftShard = left != null && !left.isMinimum() ? boundaries.getShardForKey(left) : 0;
+        int rightShard = right != null && !right.isMinimum() ? boundaries.getShardForKey(right) : boundaries.shardCount() - 1;
+        Iterator<AtomicBTreePartition> iterator;
+        if (leftShard == rightShard)
+            iterator = shards[leftShard].getPartitionsSubMap(left, includeStart, right, includeStop).values().iterator();
+        else
+        {
+            Iterator<AtomicBTreePartition>[] iters = new Iterator[rightShard - leftShard + 1];
+            int i = leftShard;
+            iters[0] = shards[leftShard].getPartitionsSubMap(left, includeStart, null, true).values().iterator();
+            for (++i; i < rightShard; ++i)
+                iters[i - leftShard] = shards[i].partitions.values().iterator();
+            iters[i - leftShard] = shards[i].getPartitionsSubMap(null, true, right, includeStop).values().iterator();
+            iterator = Iterators.concat(iters);
+        }
+        return iterator;
+    }
+
+    private Partition getPartition(DecoratedKey key)
+    {
+        int shardIndex = boundaries.getShardForKey(key);
+        return shards[shardIndex].partitions.get(key);
+    }
+
+    @Override
+    public UnfilteredRowIterator rowIterator(DecoratedKey key, Slices slices, ColumnFilter selectedColumns, boolean reversed, SSTableReadsListener listener)
+    {
+        Partition p = getPartition(key);
+        if (p == null)
+            return null;
+        else
+            return p.unfilteredIterator(selectedColumns, slices, reversed);
+    }
+
+    @Override
+    public UnfilteredRowIterator rowIterator(DecoratedKey key)
+    {
+        Partition p = getPartition(key);
+        return p != null ? p.unfilteredIterator() : null;
+    }
+
+    public FlushablePartitionSet<AtomicBTreePartition> getFlushSet(PartitionPosition from, PartitionPosition to)
+    {
+        long keySize = 0;
+        int keyCount = 0;
+
+        for (Iterator<AtomicBTreePartition> it = getPartitionIterator(from, true, to,false); it.hasNext();)
+        {
+            AtomicBTreePartition en = it.next();
+            keySize += en.partitionKey().getKey().remaining();
+            keyCount++;
+        }
+        long partitionKeySize = keySize;
+        int partitionCount = keyCount;
+        Iterator<AtomicBTreePartition> toFlush = getPartitionIterator(from, true, to,false);
+
+        return new AbstractFlushablePartitionSet<AtomicBTreePartition>()
+        {
+            public Memtable memtable()
+            {
+                return ShardedSkipListMemtable.this;
+            }
+
+            public PartitionPosition from()
+            {
+                return from;
+            }
+
+            public PartitionPosition to()
+            {
+                return to;
+            }
+
+            public long partitionCount()
+            {
+                return partitionCount;
+            }
+
+            public Iterator<AtomicBTreePartition> iterator()
+            {
+                return toFlush;
+            }
+
+            public long partitionKeysSize()
+            {
+                return partitionKeySize;
+            }
+        };
+    }
+
+    static class MemtableShard
+    {
+        // The following fields are volatile as we have to make sure that when we
+        // collect results from all sub-ranges, the thread accessing the value
+        // is guaranteed to see the changes to the values.
+
+        // The smallest timestamp for all partitions stored in this shard
+        private final AtomicLong minTimestamp = new AtomicLong(Long.MAX_VALUE);
+        private final AtomicInteger minLocalDeletionTime = new AtomicInteger(Integer.MAX_VALUE);
+
+        private final AtomicLong liveDataSize = new AtomicLong(0);
+
+        private final AtomicLong currentOperations = new AtomicLong(0);
+
+        // We index the memtable by PartitionPosition only for the purpose of being able
+        // to select key range using Token.KeyBound. However put() ensures that we
+        // actually only store DecoratedKey.
+        private final ConcurrentNavigableMap<PartitionPosition, AtomicBTreePartition> partitions = new ConcurrentSkipListMap<>();
+
+        private final ColumnsCollector columnsCollector;
+
+        private final StatsCollector statsCollector;
+
+        @Unmetered  // total pool size should not be included in memtable's deep size
+        private final MemtableAllocator allocator;
+
+        private final TableMetadataRef metadata;
+
+        @VisibleForTesting
+        MemtableShard(TableMetadataRef metadata, MemtableAllocator allocator)
+        {
+            this.columnsCollector = new ColumnsCollector(metadata.get().regularAndStaticColumns());
+            this.statsCollector = new StatsCollector();
+            this.allocator = allocator;
+            this.metadata = metadata;
+        }
+
+        public long put(DecoratedKey key, PartitionUpdate update, UpdateTransaction indexer, OpOrder.Group opGroup)
+        {
+            Cloner cloner = allocator.cloner(opGroup);
+            AtomicBTreePartition previous = partitions.get(key);
+
+            long initialSize = 0;
+            if (previous == null)
+            {
+                final DecoratedKey cloneKey = cloner.clone(key);
+                AtomicBTreePartition empty = new AtomicBTreePartition(metadata, cloneKey, allocator);
+                // We'll add the columns later. This avoids wasting works if we get beaten in the putIfAbsent
+                previous = partitions.putIfAbsent(cloneKey, empty);
+                if (previous == null)
+                {
+                    previous = empty;
+                    // allocate the row overhead after the fact; this saves over allocating and having to free after, but
+                    // means we can overshoot our declared limit.
+                    int overhead = (int) (cloneKey.getToken().getHeapSize() + SkipListMemtable.ROW_OVERHEAD_HEAP_SIZE);
+                    allocator.onHeap().allocate(overhead, opGroup);
+                    initialSize = 8;
+                }
+            }
+
+            long[] pair = previous.addAllWithSizeDelta(update, cloner, opGroup, indexer);
+            updateMin(minTimestamp, update.stats().minTimestamp);
+            updateMin(minLocalDeletionTime, update.stats().minLocalDeletionTime);
+            liveDataSize.addAndGet(initialSize + pair[0]);
+            columnsCollector.update(update.columns());
+            statsCollector.update(update.stats());
+            currentOperations.addAndGet(update.operationCount());
+            return pair[1];
+        }
+
+        private Map<PartitionPosition, AtomicBTreePartition> getPartitionsSubMap(PartitionPosition left,
+                                                                                 boolean includeLeft,
+                                                                                 PartitionPosition right,
+                                                                                 boolean includeRight)
+        {
+            if (left != null && left.isMinimum())
+                left = null;
+            if (right != null && right.isMinimum())
+                right = null;
+
+            try
+            {
+                if (left == null)
+                    return right == null ? partitions : partitions.headMap(right, includeRight);
+                else
+                    return right == null
+                           ? partitions.tailMap(left, includeLeft)
+                           : partitions.subMap(left, includeLeft, right, includeRight);
+            }
+            catch (IllegalArgumentException e)
+            {
+                logger.error("Invalid range requested {} - {}", left, right);
+                throw e;
+            }
+        }
+
+        public boolean isEmpty()
+        {
+            return partitions.isEmpty();
+        }
+
+        public int size()
+        {
+            return partitions.size();
+        }
+
+        long minTimestamp()
+        {
+            return minTimestamp.get();
+        }
+
+        long liveDataSize()
+        {
+            return liveDataSize.get();
+        }
+
+        long currentOperations()
+        {
+            return currentOperations.get();
+        }
+
+        public int minLocalDeletionTime()
+        {
+            return minLocalDeletionTime.get();
+        }
+    }
+
+    public static class MemtableUnfilteredPartitionIterator extends AbstractUnfilteredPartitionIterator implements UnfilteredPartitionIterator
+    {
+        private final TableMetadata metadata;
+        private final Iterator<AtomicBTreePartition> iter;
+        private final ColumnFilter columnFilter;
+        private final DataRange dataRange;
+
+        public MemtableUnfilteredPartitionIterator(TableMetadata metadata, Iterator<AtomicBTreePartition> iterator, ColumnFilter columnFilter, DataRange dataRange)
+        {
+            this.metadata = metadata;
+            this.iter = iterator;
+            this.columnFilter = columnFilter;
+            this.dataRange = dataRange;
+        }
+
+        public TableMetadata metadata()
+        {
+            return metadata;
+        }
+
+        public boolean hasNext()
+        {
+            return iter.hasNext();
+        }
+
+        public UnfilteredRowIterator next()
+        {
+            AtomicBTreePartition entry = iter.next();
+            DecoratedKey key = entry.partitionKey();
+            ClusteringIndexFilter filter = dataRange.clusteringIndexFilter(key);
+
+            return filter.getUnfilteredRowIterator(columnFilter, entry);
+        }
+    }
+
+    static class Locking extends ShardedSkipListMemtable
+    {
+        Locking(AtomicReference<CommitLogPosition> commitLogLowerBound, TableMetadataRef metadataRef, Owner owner, Integer shardCountOption, Factory factory)
+        {
+            super(commitLogLowerBound, metadataRef, owner, shardCountOption, factory);
+        }
+
+        /**
+         * Should only be called by ColumnFamilyStore.apply via Keyspace.apply, which supplies the appropriate
+         * OpOrdering.
+         *
+         * commitLogSegmentPosition should only be null if this is a secondary index, in which case it is *expected* to be null
+         */
+        public long put(PartitionUpdate update, UpdateTransaction indexer, OpOrder.Group opGroup)
+        {
+            DecoratedKey key = update.partitionKey();
+            MemtableShard shard = shards[boundaries.getShardForKey(key)];
+            synchronized (shard)
+            {
+                return shard.put(key, update, indexer, opGroup);
+            }
+        }
+
+    }
+
+    public static Factory factory(Map<String, String> optionsCopy)
+    {
+        String shardsString = optionsCopy.remove(SHARDS_OPTION);
+        Integer shardCount = shardsString != null ? Integer.parseInt(shardsString) : null;
+        boolean isLocking = Boolean.parseBoolean(optionsCopy.remove(LOCKING_OPTION));
+        return new Factory(shardCount, isLocking);
+    }
+
+    static class Factory implements Memtable.Factory
+    {
+        final Integer shardCount;
+        final boolean isLocking;
+
+        Factory(Integer shardCount, boolean isLocking)
+        {
+            this.shardCount = shardCount;
+            this.isLocking = isLocking;
+        }
+
+        public Memtable create(AtomicReference<CommitLogPosition> commitLogLowerBound,
+                               TableMetadataRef metadataRef,
+                               Owner owner)
+        {
+            return isLocking
+                   ? new Locking(commitLogLowerBound, metadataRef, owner, shardCount, this)
+                   : new ShardedSkipListMemtable(commitLogLowerBound, metadataRef, owner, shardCount, this);
+        }
+
+        public boolean equals(Object o)
+        {
+            if (this == o)
+                return true;
+            if (o == null || getClass() != o.getClass())
+                return false;
+            Factory factory = (Factory) o;
+            return Objects.equals(shardCount, factory.shardCount);
+        }
+
+        public int hashCode()
+        {
+            return Objects.hash(shardCount);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/SkipListMemtable.java b/src/java/org/apache/cassandra/db/memtable/SkipListMemtable.java
new file mode 100644
index 0000000..17c0cce
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/SkipListMemtable.java
@@ -0,0 +1,374 @@
+/*
+ * 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.memtable;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.concurrent.ConcurrentNavigableMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.BufferDecoratedKey;
+import org.apache.cassandra.db.DataRange;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.db.Slices;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.db.filter.ClusteringIndexFilter;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.partitions.AbstractBTreePartition;
+import org.apache.cassandra.db.partitions.AbstractUnfilteredPartitionIterator;
+import org.apache.cassandra.db.partitions.AtomicBTreePartition;
+import org.apache.cassandra.db.partitions.Partition;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.dht.AbstractBounds;
+import org.apache.cassandra.dht.Bounds;
+import org.apache.cassandra.dht.IncludingExcludingBounds;
+import org.apache.cassandra.dht.Murmur3Partitioner.LongToken;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.index.transactions.UpdateTransaction;
+import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.ObjectSizes;
+import org.apache.cassandra.utils.concurrent.OpOrder;
+import org.apache.cassandra.utils.memory.Cloner;
+import org.apache.cassandra.utils.memory.MemtableAllocator;
+
+import static org.apache.cassandra.config.CassandraRelevantProperties.MEMTABLE_OVERHEAD_COMPUTE_STEPS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.MEMTABLE_OVERHEAD_SIZE;
+
+public class SkipListMemtable extends AbstractAllocatorMemtable
+{
+    private static final Logger logger = LoggerFactory.getLogger(SkipListMemtable.class);
+
+    public static final Factory FACTORY = SkipListMemtableFactory.INSTANCE;
+
+    protected static final int ROW_OVERHEAD_HEAP_SIZE;
+    static
+    {
+        int userDefinedOverhead = MEMTABLE_OVERHEAD_SIZE.getInt(-1);
+        if (userDefinedOverhead > 0)
+            ROW_OVERHEAD_HEAP_SIZE = userDefinedOverhead;
+        else
+            ROW_OVERHEAD_HEAP_SIZE = estimateRowOverhead(MEMTABLE_OVERHEAD_COMPUTE_STEPS.getInt());
+    }
+
+    // We index the memtable by PartitionPosition only for the purpose of being able
+    // to select key range using Token.KeyBound. However put() ensures that we
+    // actually only store DecoratedKey.
+    private final ConcurrentNavigableMap<PartitionPosition, AtomicBTreePartition> partitions = new ConcurrentSkipListMap<>();
+
+    private final AtomicLong liveDataSize = new AtomicLong(0);
+
+    protected SkipListMemtable(AtomicReference<CommitLogPosition> commitLogLowerBound, TableMetadataRef metadataRef, Owner owner)
+    {
+        super(commitLogLowerBound, metadataRef, owner);
+    }
+
+    @Override
+    protected Factory factory()
+    {
+        return FACTORY;
+    }
+
+    @Override
+    public boolean isClean()
+    {
+        return partitions.isEmpty();
+    }
+
+    /**
+     * Should only be called by ColumnFamilyStore.apply via Keyspace.apply, which supplies the appropriate
+     * OpOrdering.
+     *
+     * commitLogSegmentPosition should only be null if this is a secondary index, in which case it is *expected* to be null
+     */
+    @Override
+    public long put(PartitionUpdate update, UpdateTransaction indexer, OpOrder.Group opGroup)
+    {
+        Cloner cloner = allocator.cloner(opGroup);
+        AtomicBTreePartition previous = partitions.get(update.partitionKey());
+
+        long initialSize = 0;
+        if (previous == null)
+        {
+            final DecoratedKey cloneKey = cloner.clone(update.partitionKey());
+            AtomicBTreePartition empty = new AtomicBTreePartition(metadata, cloneKey, allocator);
+            // We'll add the columns later. This avoids wasting works if we get beaten in the putIfAbsent
+            previous = partitions.putIfAbsent(cloneKey, empty);
+            if (previous == null)
+            {
+                previous = empty;
+                // allocate the row overhead after the fact; this saves over allocating and having to free after, but
+                // means we can overshoot our declared limit.
+                int overhead = (int) (cloneKey.getToken().getHeapSize() + ROW_OVERHEAD_HEAP_SIZE);
+                allocator.onHeap().allocate(overhead, opGroup);
+                initialSize = 8;
+            }
+        }
+
+        long[] pair = previous.addAllWithSizeDelta(update, cloner, opGroup, indexer);
+        updateMin(minTimestamp, update.stats().minTimestamp);
+        updateMin(minLocalDeletionTime, update.stats().minLocalDeletionTime);
+        liveDataSize.addAndGet(initialSize + pair[0]);
+        columnsCollector.update(update.columns());
+        statsCollector.update(update.stats());
+        currentOperations.addAndGet(update.operationCount());
+        return pair[1];
+    }
+
+    @Override
+    public long partitionCount()
+    {
+        return partitions.size();
+    }
+
+    @Override
+    public MemtableUnfilteredPartitionIterator partitionIterator(final ColumnFilter columnFilter,
+                                                                 final DataRange dataRange,
+                                                                 SSTableReadsListener readsListener)
+    {
+        AbstractBounds<PartitionPosition> keyRange = dataRange.keyRange();
+
+        PartitionPosition left = keyRange.left;
+        PartitionPosition right = keyRange.right;
+
+        boolean isBound = keyRange instanceof Bounds;
+        boolean includeLeft = isBound || keyRange instanceof IncludingExcludingBounds;
+        boolean includeRight = isBound || keyRange instanceof Range;
+        Map<PartitionPosition, AtomicBTreePartition> subMap = getPartitionsSubMap(left,
+                                                                                  includeLeft,
+                                                                                  right,
+                                                                                  includeRight);
+
+        return new MemtableUnfilteredPartitionIterator(metadata.get(), subMap, columnFilter, dataRange);
+        // readsListener is ignored as it only accepts sstable signals
+    }
+
+    private Map<PartitionPosition, AtomicBTreePartition> getPartitionsSubMap(PartitionPosition left,
+                                                                             boolean includeLeft,
+                                                                             PartitionPosition right,
+                                                                             boolean includeRight)
+    {
+        if (left != null && left.isMinimum())
+            left = null;
+        if (right != null && right.isMinimum())
+            right = null;
+
+        try
+        {
+            if (left == null)
+                return right == null ? partitions : partitions.headMap(right, includeRight);
+            else
+                return right == null
+                       ? partitions.tailMap(left, includeLeft)
+                       : partitions.subMap(left, includeLeft, right, includeRight);
+        }
+        catch (IllegalArgumentException e)
+        {
+            logger.error("Invalid range requested {} - {}", left, right);
+            throw e;
+        }
+    }
+
+    Partition getPartition(DecoratedKey key)
+    {
+        return partitions.get(key);
+    }
+
+    @Override
+    public UnfilteredRowIterator rowIterator(DecoratedKey key, Slices slices, ColumnFilter selectedColumns, boolean reversed, SSTableReadsListener listener)
+    {
+        Partition p = getPartition(key);
+        if (p == null)
+            return null;
+        else
+            return p.unfilteredIterator(selectedColumns, slices, reversed);
+    }
+
+    @Override
+    public UnfilteredRowIterator rowIterator(DecoratedKey key)
+    {
+        Partition p = getPartition(key);
+        return p != null ? p.unfilteredIterator() : null;
+    }
+
+    private static int estimateRowOverhead(final int count)
+    {
+        // calculate row overhead
+        try (final OpOrder.Group group = new OpOrder().start())
+        {
+            int rowOverhead;
+            MemtableAllocator allocator = MEMORY_POOL.newAllocator("");
+            Cloner cloner = allocator.cloner(group);
+            ConcurrentNavigableMap<PartitionPosition, Object> partitions = new ConcurrentSkipListMap<>();
+            final Object val = new Object();
+            for (int i = 0 ; i < count ; i++)
+                partitions.put(cloner.clone(new BufferDecoratedKey(new LongToken(i), ByteBufferUtil.EMPTY_BYTE_BUFFER)), val);
+            double avgSize = ObjectSizes.measureDeep(partitions) / (double) count;
+            rowOverhead = (int) ((avgSize - Math.floor(avgSize)) < 0.05 ? Math.floor(avgSize) : Math.ceil(avgSize));
+            rowOverhead -= ObjectSizes.measureDeep(new LongToken(0));
+            rowOverhead += AtomicBTreePartition.EMPTY_SIZE;
+            rowOverhead += AbstractBTreePartition.HOLDER_UNSHARED_HEAP_SIZE;
+            allocator.setDiscarding();
+            allocator.setDiscarded();
+            return rowOverhead;
+        }
+    }
+
+    @Override
+    public FlushablePartitionSet<?> getFlushSet(PartitionPosition from, PartitionPosition to)
+    {
+        Map<PartitionPosition, AtomicBTreePartition> toFlush = getPartitionsSubMap(from, true, to, false);
+        long keysSize = 0;
+        long keyCount = 0;
+
+        boolean trackContention = logger.isTraceEnabled();
+        if (trackContention)
+        {
+            int heavilyContendedRowCount = 0;
+
+            for (AtomicBTreePartition partition : toFlush.values())
+            {
+                keysSize += partition.partitionKey().getKey().remaining();
+                ++keyCount;
+                if (partition.useLock())
+                    heavilyContendedRowCount++;
+            }
+
+            if (heavilyContendedRowCount > 0)
+                logger.trace("High update contention in {}/{} partitions of {} ", heavilyContendedRowCount, toFlush.size(), SkipListMemtable.this);
+        }
+        else
+        {
+            for (PartitionPosition key : toFlush.keySet())
+            {
+                //  make sure we don't write non-sensical keys
+                assert key instanceof DecoratedKey;
+                keysSize += ((DecoratedKey) key).getKey().remaining();
+                ++keyCount;
+            }
+        }
+        final long partitionKeysSize = keysSize;
+        final long partitionCount = keyCount;
+
+        return new AbstractFlushablePartitionSet<AtomicBTreePartition>()
+        {
+            @Override
+            public Memtable memtable()
+            {
+                return SkipListMemtable.this;
+            }
+
+            @Override
+            public PartitionPosition from()
+            {
+                return from;
+            }
+
+            @Override
+            public PartitionPosition to()
+            {
+                return to;
+            }
+
+            @Override
+            public long partitionCount()
+            {
+                return partitionCount;
+            }
+
+            @Override
+            public Iterator<AtomicBTreePartition> iterator()
+            {
+                return toFlush.values().iterator();
+            }
+
+            @Override
+            public long partitionKeysSize()
+            {
+                return partitionKeysSize;
+            }
+        };
+    }
+
+
+    private static class MemtableUnfilteredPartitionIterator extends AbstractUnfilteredPartitionIterator implements UnfilteredPartitionIterator
+    {
+        private final TableMetadata metadata;
+        private final Iterator<Map.Entry<PartitionPosition, AtomicBTreePartition>> iter;
+        private final ColumnFilter columnFilter;
+        private final DataRange dataRange;
+
+        MemtableUnfilteredPartitionIterator(TableMetadata metadata, Map<PartitionPosition, AtomicBTreePartition> map, ColumnFilter columnFilter, DataRange dataRange)
+        {
+            this.metadata = metadata;
+            this.iter = map.entrySet().iterator();
+            this.columnFilter = columnFilter;
+            this.dataRange = dataRange;
+        }
+
+        @Override
+        public TableMetadata metadata()
+        {
+            return metadata;
+        }
+
+        @Override
+        public boolean hasNext()
+        {
+            return iter.hasNext();
+        }
+
+        @Override
+        public UnfilteredRowIterator next()
+        {
+            Map.Entry<PartitionPosition, AtomicBTreePartition> entry = iter.next();
+            // Actual stored key should be true DecoratedKey
+            assert entry.getKey() instanceof DecoratedKey;
+            DecoratedKey key = (DecoratedKey)entry.getKey();
+            ClusteringIndexFilter filter = dataRange.clusteringIndexFilter(key);
+
+            return filter.getUnfilteredRowIterator(columnFilter, entry.getValue());
+        }
+    }
+
+    @Override
+    public long getLiveDataSize()
+    {
+        return liveDataSize.get();
+    }
+
+    /**
+     * For testing only. Give this memtable too big a size to make it always fail flushing.
+     */
+    @VisibleForTesting
+    public void makeUnflushable()
+    {
+        liveDataSize.addAndGet(1024L * 1024 * 1024 * 1024 * 1024);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/memtable/SkipListMemtableFactory.java b/src/java/org/apache/cassandra/db/memtable/SkipListMemtableFactory.java
new file mode 100644
index 0000000..76dee02
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/memtable/SkipListMemtableFactory.java
@@ -0,0 +1,47 @@
+/*
+ * 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.memtable;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.collect.ImmutableMap;
+
+import org.apache.cassandra.config.InheritingClass;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.schema.TableMetadataRef;
+
+/**
+ * This class makes better sense as an inner class to SkipListMemtable (which could be as simple as
+ * FACTORY = SkipListMemtable::new), but having it there causes the SkipListMemtable class to be initialized the first
+ * time it is referenced (e.g. during default memtable factory construction).
+ *
+ * Some tests want to setup table parameters before initializing DatabaseDescriptor -- this allows them to do so, and
+ * also makes sure the memtable memory pools are not created for offline tools.
+ */
+public class SkipListMemtableFactory implements Memtable.Factory
+{
+    @Override
+    public Memtable create(AtomicReference<CommitLogPosition> commitLogLowerBound, TableMetadataRef metadaRef, Memtable.Owner owner)
+    {
+        return new SkipListMemtable(commitLogLowerBound, metadaRef, owner);
+    }
+
+    public static final SkipListMemtableFactory INSTANCE = new SkipListMemtableFactory();
+    public static InheritingClass CONFIGURATION = new InheritingClass(null, SkipListMemtable.class.getName(), ImmutableMap.of());
+}
diff --git a/src/java/org/apache/cassandra/db/monitoring/MonitorableImpl.java b/src/java/org/apache/cassandra/db/monitoring/MonitorableImpl.java
index a6e7947..31b5404 100644
--- a/src/java/org/apache/cassandra/db/monitoring/MonitorableImpl.java
+++ b/src/java/org/apache/cassandra/db/monitoring/MonitorableImpl.java
@@ -18,7 +18,7 @@
 
 package org.apache.cassandra.db.monitoring;
 
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 public abstract class MonitorableImpl implements Monitorable
 {
diff --git a/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java b/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java
index 0f8555f..d681e4b 100644
--- a/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java
+++ b/src/java/org/apache/cassandra/db/monitoring/MonitoringTask.java
@@ -23,9 +23,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
@@ -40,7 +38,8 @@
 
 import static java.lang.System.getProperty;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 /**
  * A task for monitoring in progress operations, currently only read queries, and aborting them if they time out.
@@ -207,7 +206,7 @@
         OperationsQueue(int maxOperations)
         {
             this.maxOperations = maxOperations;
-            this.queue = maxOperations > 0 ? new ArrayBlockingQueue<>(maxOperations) : new LinkedBlockingQueue<>();
+            this.queue = maxOperations > 0 ? newBlockingQueue(maxOperations) : newBlockingQueue();
             this.numDroppedOperations = new AtomicLong();
         }
 
diff --git a/src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java b/src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java
index fe9934e..5926ced 100644
--- a/src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java
+++ b/src/java/org/apache/cassandra/db/partitions/AbstractBTreePartition.java
@@ -68,6 +68,11 @@
             this.staticRow = staticRow == null ? Rows.EMPTY_STATIC_ROW : staticRow;
             this.stats = stats;
         }
+
+        protected Holder withColumns(RegularAndStaticColumns columns)
+        {
+            return new Holder(columns, this.tree, this.deletionInfo, this.staticRow, this.stats);
+        }
     }
 
     public DeletionInfo deletionInfo()
@@ -377,26 +382,52 @@
     @Override
     public String toString()
     {
-        StringBuilder sb = new StringBuilder();
+        return toString(true);
+    }
 
-        sb.append(String.format("[%s] key=%s partition_deletion=%s columns=%s",
-                                metadata(),
-                                metadata().partitionKeyType.getString(partitionKey().getKey()),
-                                partitionLevelDeletion(),
-                                columns()));
+    public String toString(boolean includeFullDetails)
+    {
+        StringBuilder sb = new StringBuilder();
+        if (includeFullDetails)
+        {
+            sb.append(String.format("[%s.%s] key=%s partition_deletion=%s columns=%s",
+                                    metadata().keyspace,
+                                    metadata().name,
+                                    metadata().partitionKeyType.getString(partitionKey().getKey()),
+                                    partitionLevelDeletion(),
+                                    columns()));
+        }
+        else
+        {
+            sb.append("key=").append(metadata().partitionKeyType.getString(partitionKey().getKey()));
+        }
 
         if (staticRow() != Rows.EMPTY_STATIC_ROW)
-            sb.append("\n    ").append(staticRow().toString(metadata(), true));
+            sb.append("\n    ").append(staticRow().toString(metadata(), includeFullDetails));
 
         try (UnfilteredRowIterator iter = unfilteredIterator())
         {
             while (iter.hasNext())
-                sb.append("\n    ").append(iter.next().toString(metadata(), true));
+                sb.append("\n    ").append(iter.next().toString(metadata(), includeFullDetails));
         }
-
         return sb.toString();
     }
 
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (!(obj instanceof PartitionUpdate))
+            return false;
+
+        PartitionUpdate that = (PartitionUpdate) obj;
+        Holder a = this.holder(), b = that.holder();
+        return partitionKey.equals(that.partitionKey)
+               && metadata().id.equals(that.metadata().id)
+               && a.deletionInfo.equals(b.deletionInfo)
+               && a.staticRow.equals(b.staticRow)
+               && Iterators.elementsEqual(iterator(), that.iterator());
+    }
+
     public int rowCount()
     {
         return BTree.size(holder().tree);
diff --git a/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java b/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java
index 7b275d0..986e707 100644
--- a/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java
+++ b/src/java/org/apache/cassandra/db/partitions/AtomicBTreePartition.java
@@ -39,9 +39,10 @@
 import org.apache.cassandra.utils.memory.Cloner;
 import org.apache.cassandra.utils.memory.HeapCloner;
 import org.apache.cassandra.utils.memory.MemtableAllocator;
-
 import com.google.common.annotations.VisibleForTesting;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * A thread-safe and atomic Partition implementation.
  *
@@ -74,7 +75,7 @@
 
     /**
      * (clock + allocation) granularity are combined to give us an acceptable (waste) allocation rate that is defined by
-     * the passage of real time of ALLOCATION_GRANULARITY_BYTES/CLOCK_GRANULARITY, or in this case 7.63Kb/ms, or 7.45Mb/s
+     * the passage of real time of ALLOCATION_GRANULARITY_BYTES/CLOCK_GRANULARITY, or in this case 7.63KiB/ms, or 7.45Mb/s
      *
      * in wasteTracker we maintain within EXCESS_WASTE_OFFSET before the current time; whenever we waste bytes
      * we increment the current value if it is within this window, and set it to the min of the window plus our waste
@@ -310,7 +311,7 @@
             while (TRACKER_PESSIMISTIC_LOCKING != (oldTrackerValue = wasteTracker))
             {
                 // Note this time value has an arbitrary offset, but is a constant rate 32 bit counter (that may wrap)
-                int time = (int) (System.nanoTime() >>> CLOCK_SHIFT);
+                int time = (int) (nanoTime() >>> CLOCK_SHIFT);
                 int delta = oldTrackerValue - time;
                 if (oldTrackerValue == TRACKER_NEVER_WASTED || delta >= 0 || delta < -EXCESS_WASTE_OFFSET)
                     delta = -EXCESS_WASTE_OFFSET;
diff --git a/src/java/org/apache/cassandra/db/partitions/Partition.java b/src/java/org/apache/cassandra/db/partitions/Partition.java
index b6297a1..8888104 100644
--- a/src/java/org/apache/cassandra/db/partitions/Partition.java
+++ b/src/java/org/apache/cassandra/db/partitions/Partition.java
@@ -22,7 +22,6 @@
 import javax.annotation.Nullable;
 
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.db.Slices;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.db.filter.ColumnFilter;
@@ -51,6 +50,11 @@
     public boolean isEmpty();
 
     /**
+     * Whether the partition object has rows. This may be false but partition still be non-empty if it has a deletion.
+     */
+    boolean hasRows();
+
+    /**
      * Returns the row corresponding to the provided clustering, or null if there is not such row.
      *
      * @param clustering clustering key to search
diff --git a/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java b/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java
index 5390666..6019d56 100644
--- a/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java
+++ b/src/java/org/apache/cassandra/db/partitions/PartitionUpdate.java
@@ -17,14 +17,18 @@
  */
 package org.apache.cassandra.db.partitions;
 
+import java.io.EOFException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
+import com.google.common.primitives.Ints;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,6 +43,9 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.btree.BTree;
 import org.apache.cassandra.utils.btree.UpdateFunction;
+import org.apache.cassandra.utils.vint.VIntCoding;
+
+import static org.apache.cassandra.db.rows.UnfilteredRowIteratorSerializer.IS_EMPTY;
 
 /**
  * Stores updates made on a partition.
@@ -205,6 +212,20 @@
         return new PartitionUpdate(iterator.metadata(), iterator.partitionKey(), holder, deletionInfo, false);
     }
 
+
+    public PartitionUpdate withOnlyPresentColumns()
+    {
+        Set<ColumnMetadata> columnSet = new HashSet<>();
+
+        for (Row row : this)
+            for (ColumnData column : row)
+                columnSet.add(column.column());
+
+        RegularAndStaticColumns columns = RegularAndStaticColumns.builder().addAll(columnSet).build();
+        return new PartitionUpdate(this.metadata, this.partitionKey, this.holder.withColumns(columns), this.deletionInfo.mutableCopy(), false);
+    }
+
+
     protected boolean canHaveShadowedData()
     {
         return canHaveShadowedData;
@@ -323,23 +344,19 @@
      */
     public int dataSize()
     {
-        int size = 0;
+        return Ints.saturatedCast(BTree.<Row>accumulate(holder.tree, (row, value) -> row.dataSize() + value, 0L)
+                + holder.staticRow.dataSize() + holder.deletionInfo.dataSize());
+    }
 
-        if (holder.staticRow != null)
-        {
-            for (ColumnData cd : holder.staticRow.columnData())
-            {
-                size += cd.dataSize();
-            }
-        }
-
-        for (Row row : this)
-        {
-            size += row.clustering().dataSize();
-            for (ColumnData cd : row)
-                size += cd.dataSize();
-        }
-        return size;
+    /**
+     * The size of the data contained in this update.
+     *
+     * @return the size of the data contained in this update.
+     */
+    public long unsharedHeapSize()
+    {
+        return BTree.<Row>accumulate(holder.tree, (row, value) -> row.unsharedHeapSize() + value, 0L)
+                + holder.staticRow.unsharedHeapSize() + holder.deletionInfo.unsharedHeapSize();
     }
 
     public TableMetadata metadata()
@@ -678,6 +695,21 @@
                                        false);
         }
 
+        public static boolean isEmpty(ByteBuffer in, DeserializationHelper.Flag flag, DecoratedKey key) throws IOException
+        {
+            int position = in.position();
+            position += 16; // CFMetaData.serializer.deserialize(in, version);
+            if (position >= in.limit())
+                throw new EOFException();
+            // DecoratedKey key = metadata.decorateKey(ByteBufferUtil.readWithVIntLength(in));
+            int keyLength = (int) VIntCoding.getUnsignedVInt(in, position);
+            position += keyLength + VIntCoding.computeUnsignedVIntSize(keyLength);
+            if (position >= in.limit())
+                throw new EOFException();
+            int flags = in.get(position) & 0xff;
+            return (flags & IS_EMPTY) != 0;
+        }
+
         public long serializedSize(PartitionUpdate update, int version)
         {
             try (UnfilteredRowIterator iter = update.unfilteredIterator())
diff --git a/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java b/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java
index d9e9036..09f3ae3 100644
--- a/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java
+++ b/src/java/org/apache/cassandra/db/partitions/PurgeFunction.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.db.partitions;
 
 import java.util.function.LongPredicate;
-import java.util.function.Predicate;
 
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.rows.*;
diff --git a/src/java/org/apache/cassandra/db/repair/CassandraKeyspaceRepairManager.java b/src/java/org/apache/cassandra/db/repair/CassandraKeyspaceRepairManager.java
index 4fa8650..6e70666 100644
--- a/src/java/org/apache/cassandra/db/repair/CassandraKeyspaceRepairManager.java
+++ b/src/java/org/apache/cassandra/db/repair/CassandraKeyspaceRepairManager.java
@@ -19,16 +19,16 @@
 package org.apache.cassandra.db.repair;
 
 import java.util.Collection;
-import java.util.UUID;
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.function.BooleanSupplier;
 
-import com.google.common.util.concurrent.ListenableFuture;
-
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.repair.KeyspaceRepairManager;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
 
 public class CassandraKeyspaceRepairManager implements KeyspaceRepairManager
 {
@@ -40,11 +40,11 @@
     }
 
     @Override
-    public ListenableFuture prepareIncrementalRepair(UUID sessionID,
-                                                     Collection<ColumnFamilyStore> tables,
-                                                     RangesAtEndpoint tokenRanges,
-                                                     ExecutorService executor,
-                                                     BooleanSupplier isCancelled)
+    public Future<List<Void>> prepareIncrementalRepair(TimeUUID sessionID,
+                                                       Collection<ColumnFamilyStore> tables,
+                                                       RangesAtEndpoint tokenRanges,
+                                                       ExecutorService executor,
+                                                       BooleanSupplier isCancelled)
     {
         PendingAntiCompaction pac = new PendingAntiCompaction(sessionID, tables, tokenRanges, executor, isCancelled);
         return pac.run();
diff --git a/src/java/org/apache/cassandra/db/repair/CassandraTableRepairManager.java b/src/java/org/apache/cassandra/db/repair/CassandraTableRepairManager.java
index aab9f0b..62c1c33 100644
--- a/src/java/org/apache/cassandra/db/repair/CassandraTableRepairManager.java
+++ b/src/java/org/apache/cassandra/db/repair/CassandraTableRepairManager.java
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 import java.util.Collection;
-import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 
@@ -32,8 +31,11 @@
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.metrics.TopPartitionTracker;
 import org.apache.cassandra.repair.TableRepairManager;
 import org.apache.cassandra.repair.ValidationPartitionIterator;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.service.ActiveRepairService;
 
 public class CassandraTableRepairManager implements TableRepairManager
@@ -46,9 +48,9 @@
     }
 
     @Override
-    public ValidationPartitionIterator getValidationIterator(Collection<Range<Token>> ranges, UUID parentId, UUID sessionID, boolean isIncremental, int nowInSec) throws IOException
+    public ValidationPartitionIterator getValidationIterator(Collection<Range<Token>> ranges, TimeUUID parentId, TimeUUID sessionID, boolean isIncremental, int nowInSec, TopPartitionTracker.Collector topPartitionCollector) throws IOException, NoSuchRepairSessionException
     {
-        return new CassandraValidationIterator(cfs, ranges, parentId, sessionID, isIncremental, nowInSec);
+        return new CassandraValidationIterator(cfs, ranges, parentId, sessionID, isIncremental, nowInSec, topPartitionCollector);
     }
 
     @Override
@@ -58,7 +60,7 @@
     }
 
     @Override
-    public void incrementalSessionCompleted(UUID sessionID)
+    public void incrementalSessionCompleted(TimeUUID sessionID)
     {
         CompactionManager.instance.submitBackground(cfs);
     }
diff --git a/src/java/org/apache/cassandra/db/repair/CassandraValidationIterator.java b/src/java/org/apache/cassandra/db/repair/CassandraValidationIterator.java
index 6f2256f..53ef657 100644
--- a/src/java/org/apache/cassandra/db/repair/CassandraValidationIterator.java
+++ b/src/java/org/apache/cassandra/db/repair/CassandraValidationIterator.java
@@ -25,11 +25,11 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import java.util.function.LongPredicate;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import com.google.common.collect.Collections2;
 import com.google.common.collect.Maps;
 
 import org.slf4j.Logger;
@@ -51,13 +51,16 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.metrics.TopPartitionTracker;
 import org.apache.cassandra.repair.ValidationPartitionIterator;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Refs;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class CassandraValidationIterator extends ValidationPartitionIterator
 {
     private static final Logger logger = LoggerFactory.getLogger(CassandraValidationIterator.class);
@@ -102,23 +105,18 @@
 
     private static class ValidationCompactionIterator extends CompactionIterator
     {
-        public ValidationCompactionIterator(List<ISSTableScanner> scanners, ValidationCompactionController controller, int nowInSec, ActiveCompactionsTracker activeCompactions)
+        public ValidationCompactionIterator(List<ISSTableScanner> scanners, ValidationCompactionController controller, int nowInSec, ActiveCompactionsTracker activeCompactions, TopPartitionTracker.Collector topPartitionCollector)
         {
-            super(OperationType.VALIDATION, scanners, controller, nowInSec, UUIDGen.getTimeUUID(), activeCompactions);
+            super(OperationType.VALIDATION, scanners, controller, nowInSec, nextTimeUUID(), activeCompactions, topPartitionCollector);
         }
     }
 
     @VisibleForTesting
-    static synchronized Refs<SSTableReader> getSSTablesToValidate(ColumnFamilyStore cfs, Collection<Range<Token>> ranges, UUID parentId, boolean isIncremental)
+    public static synchronized Refs<SSTableReader> getSSTablesToValidate(ColumnFamilyStore cfs, Collection<Range<Token>> ranges, TimeUUID parentId, boolean isIncremental) throws NoSuchRepairSessionException
     {
         Refs<SSTableReader> sstables;
 
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(parentId);
-        if (prs == null)
-        {
-            // this means the parent repair session was removed - the repair session failed on another node and we removed it
-            return new Refs<>();
-        }
 
         Set<SSTableReader> sstablesToValidate = new HashSet<>();
 
@@ -126,7 +124,6 @@
         if (prs.isPreview())
         {
             predicate = prs.previewKind.predicate();
-
         }
         else if (isIncremental)
         {
@@ -175,7 +172,7 @@
     private final long estimatedPartitions;
     private final Map<Range<Token>, Long> rangePartitionCounts;
 
-    public CassandraValidationIterator(ColumnFamilyStore cfs, Collection<Range<Token>> ranges, UUID parentId, UUID sessionID, boolean isIncremental, int nowInSec) throws IOException
+    public CassandraValidationIterator(ColumnFamilyStore cfs, Collection<Range<Token>> ranges, TimeUUID parentId, TimeUUID sessionID, boolean isIncremental, int nowInSec, TopPartitionTracker.Collector topPartitionCollector) throws IOException, NoSuchRepairSessionException
     {
         this.cfs = cfs;
 
@@ -198,26 +195,30 @@
             if (!isIncremental)
             {
                 // flush first so everyone is validating data that is as similar as possible
-                StorageService.instance.forceKeyspaceFlush(cfs.keyspace.getName(), cfs.name);
+                cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.VALIDATION);
+                // Note: we also flush for incremental repair during the anti-compaction process.
             }
             sstables = getSSTablesToValidate(cfs, ranges, parentId, isIncremental);
         }
 
+        // Persistent memtables will not flush or snapshot to sstables, make an sstable with their data.
+        cfs.writeAndAddMemtableRanges(parentId,
+                                      () -> Collections2.transform(Range.normalize(ranges), Range::makeRowRange),
+                                      sstables);
+
         Preconditions.checkArgument(sstables != null);
+
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(parentId);
-        if (prs != null)
-        {
-            logger.info("{}, parentSessionId={}: Performing validation compaction on {} sstables in {}.{}",
-                        prs.previewKind.logPrefix(sessionID),
-                        parentId,
-                        sstables.size(),
-                        cfs.keyspace.getName(),
-                        cfs.getTableName());
-        }
+        logger.info("{}, parentSessionId={}: Performing validation compaction on {} sstables in {}.{}",
+                    prs.previewKind.logPrefix(sessionID),
+                    parentId,
+                    sstables.size(),
+                    cfs.keyspace.getName(),
+                    cfs.getTableName());
 
         controller = new ValidationCompactionController(cfs, getDefaultGcBefore(cfs, nowInSec));
         scanners = cfs.getCompactionStrategyManager().getScanners(sstables, ranges);
-        ci = new ValidationCompactionIterator(scanners.scanners, controller, nowInSec, CompactionManager.instance.active);
+        ci = new ValidationCompactionIterator(scanners.scanners, controller, nowInSec, CompactionManager.instance.active, topPartitionCollector);
 
         long allPartitions = 0;
         rangePartitionCounts = Maps.newHashMapWithExpectedSize(ranges.size());
@@ -241,6 +242,12 @@
     }
 
     @Override
+    public long getBytesRead()
+    {
+        return ci.getBytesRead();
+    }
+
+    @Override
     public void close()
     {
         // TODO: can any of this fail and leave stuff unreleased?
diff --git a/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java b/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
index e0ee68d..af9888a 100644
--- a/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
+++ b/src/java/org/apache/cassandra/db/repair/PendingAntiCompaction.java
@@ -22,23 +22,23 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BooleanSupplier;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Predicate;
 import com.google.common.collect.Iterables;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListenableFutureTask;
-import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.Uninterruptibles;
 
+import org.apache.cassandra.concurrent.FutureTask;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -57,6 +57,7 @@
 
 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.Clock.Global.currentTimeMillis;
 
 /**
  * Performs an anti compaction on a set of tables and token ranges, isolating the unrepaired sstables
@@ -104,9 +105,9 @@
     static class AntiCompactionPredicate implements Predicate<SSTableReader>
     {
         private final Collection<Range<Token>> ranges;
-        private final UUID prsid;
+        private final TimeUUID prsid;
 
-        public AntiCompactionPredicate(Collection<Range<Token>> ranges, UUID prsid)
+        public AntiCompactionPredicate(Collection<Range<Token>> ranges, TimeUUID prsid)
         {
             this.ranges = ranges;
             this.prsid = prsid;
@@ -166,19 +167,19 @@
     public static class AcquisitionCallable implements Callable<AcquireResult>
     {
         private final ColumnFamilyStore cfs;
-        private final UUID sessionID;
+        private final TimeUUID sessionID;
         private final AntiCompactionPredicate predicate;
         private final int acquireRetrySeconds;
         private final int acquireSleepMillis;
 
         @VisibleForTesting
-        public AcquisitionCallable(ColumnFamilyStore cfs, Collection<Range<Token>> ranges, UUID sessionID, int acquireRetrySeconds, int acquireSleepMillis)
+        public AcquisitionCallable(ColumnFamilyStore cfs, Collection<Range<Token>> ranges, TimeUUID sessionID, int acquireRetrySeconds, int acquireSleepMillis)
         {
             this(cfs, sessionID, acquireRetrySeconds, acquireSleepMillis, new AntiCompactionPredicate(ranges, sessionID));
         }
 
         @VisibleForTesting
-        AcquisitionCallable(ColumnFamilyStore cfs, UUID sessionID, int acquireRetrySeconds, int acquireSleepMillis, AntiCompactionPredicate predicate)
+        AcquisitionCallable(ColumnFamilyStore cfs, TimeUUID sessionID, int acquireRetrySeconds, int acquireSleepMillis, AntiCompactionPredicate predicate)
         {
             this.cfs = cfs;
             this.sessionID = sessionID;
@@ -218,7 +219,7 @@
             logger.debug("acquiring sstables for pending anti compaction on session {}", sessionID);
             // try to modify after cancelling running compactions. This will attempt to cancel in flight compactions including the given sstables for
             // up to a minute, after which point, null will be returned
-            long start = System.currentTimeMillis();
+            long start = currentTimeMillis();
             long delay = TimeUnit.SECONDS.toMillis(acquireRetrySeconds);
             // Note that it is `predicate` throwing SSTableAcquisitionException if it finds a conflicting sstable
             // and we only retry when runWithCompactionsDisabled throws when uses the predicate, not when acquireTuple is.
@@ -238,10 +239,10 @@
                                 sessionID,
                                 e.getMessage(),
                                 acquireSleepMillis,
-                                TimeUnit.SECONDS.convert(delay + start - System.currentTimeMillis(), TimeUnit.MILLISECONDS));
+                                TimeUnit.SECONDS.convert(delay + start - currentTimeMillis(), TimeUnit.MILLISECONDS));
                     Uninterruptibles.sleepUninterruptibly(acquireSleepMillis, TimeUnit.MILLISECONDS);
 
-                    if (System.currentTimeMillis() - start > delay)
+                    if (currentTimeMillis() - start > delay)
                         logger.warn("{} Timed out waiting to acquire sstables", sessionID, e);
 
                 }
@@ -250,25 +251,25 @@
                     logger.error("Got exception disabling compactions for session {}", sessionID, t);
                     throw t;
                 }
-            } while (System.currentTimeMillis() - start < delay);
+            } while (currentTimeMillis() - start < delay);
             return null;
         }
     }
 
-    static class AcquisitionCallback implements AsyncFunction<List<AcquireResult>, Object>
+    static class AcquisitionCallback implements Function<List<AcquireResult>, Future<List<Void>>>
     {
-        private final UUID parentRepairSession;
+        private final TimeUUID parentRepairSession;
         private final RangesAtEndpoint tokenRanges;
         private final BooleanSupplier isCancelled;
 
-        public AcquisitionCallback(UUID parentRepairSession, RangesAtEndpoint tokenRanges, BooleanSupplier isCancelled)
+        public AcquisitionCallback(TimeUUID parentRepairSession, RangesAtEndpoint tokenRanges, BooleanSupplier isCancelled)
         {
             this.parentRepairSession = parentRepairSession;
             this.tokenRanges = tokenRanges;
             this.isCancelled = isCancelled;
         }
 
-        ListenableFuture<?> submitPendingAntiCompaction(AcquireResult result)
+        Future<Void> submitPendingAntiCompaction(AcquireResult result)
         {
             return CompactionManager.instance.submitPendingAntiCompaction(result.cfs, tokenRanges, result.refs, result.txn, parentRepairSession, isCancelled);
         }
@@ -287,7 +288,7 @@
             });
         }
 
-        public ListenableFuture apply(List<AcquireResult> results) throws Exception
+        public Future<List<Void>> apply(List<AcquireResult> results)
         {
             if (Iterables.any(results, AcquisitionCallback::shouldAbort))
             {
@@ -305,26 +306,26 @@
                                                "This is usually caused by running multiple incremental repairs on nodes that share token ranges",
                                                parentRepairSession);
                 logger.warn(message);
-                return Futures.immediateFailedFuture(new SSTableAcquisitionException(message));
+                return ImmediateFuture.failure(new SSTableAcquisitionException(message));
             }
             else
             {
-                List<ListenableFuture<?>> pendingAntiCompactions = new ArrayList<>(results.size());
+                List<Future<Void>> pendingAntiCompactions = new ArrayList<>(results.size());
                 for (AcquireResult result : results)
                 {
                     if (result.txn != null)
                     {
-                        ListenableFuture<?> future = submitPendingAntiCompaction(result);
+                        Future<Void> future = submitPendingAntiCompaction(result);
                         pendingAntiCompactions.add(future);
                     }
                 }
 
-                return Futures.allAsList(pendingAntiCompactions);
+                return FutureCombiner.allOf(pendingAntiCompactions);
             }
         }
     }
 
-    private final UUID prsId;
+    private final TimeUUID prsId;
     private final Collection<ColumnFamilyStore> tables;
     private final RangesAtEndpoint tokenRanges;
     private final ExecutorService executor;
@@ -332,7 +333,7 @@
     private final int acquireSleepMillis;
     private final BooleanSupplier isCancelled;
 
-    public PendingAntiCompaction(UUID prsId,
+    public PendingAntiCompaction(TimeUUID prsId,
                                  Collection<ColumnFamilyStore> tables,
                                  RangesAtEndpoint tokenRanges,
                                  ExecutorService executor,
@@ -342,7 +343,7 @@
     }
 
     @VisibleForTesting
-    PendingAntiCompaction(UUID prsId,
+    PendingAntiCompaction(TimeUUID prsId,
                           Collection<ColumnFamilyStore> tables,
                           RangesAtEndpoint tokenRanges,
                           int acquireRetrySeconds,
@@ -359,29 +360,29 @@
         this.isCancelled = isCancelled;
     }
 
-    public ListenableFuture run()
+    public Future<List<Void>> run()
     {
-        List<ListenableFutureTask<AcquireResult>> tasks = new ArrayList<>(tables.size());
+        List<FutureTask<AcquireResult>> tasks = new ArrayList<>(tables.size());
         for (ColumnFamilyStore cfs : tables)
         {
-            cfs.forceBlockingFlush();
-            ListenableFutureTask<AcquireResult> task = ListenableFutureTask.create(getAcquisitionCallable(cfs, tokenRanges.ranges(), prsId, acquireRetrySeconds, acquireSleepMillis));
+            cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.ANTICOMPACTION);
+            FutureTask<AcquireResult> task = new FutureTask<>(getAcquisitionCallable(cfs, tokenRanges.ranges(), prsId, acquireRetrySeconds, acquireSleepMillis));
             executor.submit(task);
             tasks.add(task);
         }
-        ListenableFuture<List<AcquireResult>> acquisitionResults = Futures.successfulAsList(tasks);
-        ListenableFuture compactionResult = Futures.transformAsync(acquisitionResults, getAcquisitionCallback(prsId, tokenRanges), MoreExecutors.directExecutor());
-        return compactionResult;
+
+        Future<List<AcquireResult>> acquisitionResults = FutureCombiner.successfulOf(tasks);
+        return acquisitionResults.flatMap(getAcquisitionCallback(prsId, tokenRanges));
     }
 
     @VisibleForTesting
-    protected AcquisitionCallable getAcquisitionCallable(ColumnFamilyStore cfs, Set<Range<Token>> ranges, UUID prsId, int acquireRetrySeconds, int acquireSleepMillis)
+    protected AcquisitionCallable getAcquisitionCallable(ColumnFamilyStore cfs, Set<Range<Token>> ranges, TimeUUID prsId, int acquireRetrySeconds, int acquireSleepMillis)
     {
         return new AcquisitionCallable(cfs, ranges, prsId, acquireRetrySeconds, acquireSleepMillis);
     }
 
     @VisibleForTesting
-    protected AcquisitionCallback getAcquisitionCallback(UUID prsId, RangesAtEndpoint tokenRanges)
+    protected AcquisitionCallback getAcquisitionCallback(TimeUUID prsId, RangesAtEndpoint tokenRanges)
     {
         return new AcquisitionCallback(prsId, tokenRanges, isCancelled);
     }
diff --git a/src/java/org/apache/cassandra/db/rows/AbstractCell.java b/src/java/org/apache/cassandra/db/rows/AbstractCell.java
index d538ee7..b9b5d60 100644
--- a/src/java/org/apache/cassandra/db/rows/AbstractCell.java
+++ b/src/java/org/apache/cassandra/db/rows/AbstractCell.java
@@ -98,6 +98,12 @@
         return this;
     }
 
+
+    public Cell<?> purgeDataOlderThan(long timestamp)
+    {
+        return this.timestamp() < timestamp ? null : this;
+    }
+
     @Override
     public Cell<?> clone(ByteBufferCloner cloner)
     {
@@ -201,11 +207,11 @@
         AbstractType<?> type = column().type;
         if (type instanceof CollectionType && type.isMultiCell())
         {
-            CollectionType ct = (CollectionType)type;
+            CollectionType<?> ct = (CollectionType<?>) type;
             return String.format("[%s[%s]=%s %s]",
                                  column().name,
                                  ct.nameComparator().getString(path().get(0)),
-                                 ct.valueComparator().getString(value(), accessor()),
+                                 isTombstone() ? "<tombstone>" : ct.valueComparator().getString(value(), accessor()),
                                  livenessInfoString());
         }
         if (isTombstone())
diff --git a/src/java/org/apache/cassandra/db/rows/AbstractRangeTombstoneMarker.java b/src/java/org/apache/cassandra/db/rows/AbstractRangeTombstoneMarker.java
index 7dac1fa..a2c3a4d 100644
--- a/src/java/org/apache/cassandra/db/rows/AbstractRangeTombstoneMarker.java
+++ b/src/java/org/apache/cassandra/db/rows/AbstractRangeTombstoneMarker.java
@@ -17,8 +17,6 @@
  */
 package org.apache.cassandra.db.rows;
 
-import java.nio.ByteBuffer;
-
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.ClusteringBoundOrBoundary;
 
diff --git a/src/java/org/apache/cassandra/db/rows/ArrayCell.java b/src/java/org/apache/cassandra/db/rows/ArrayCell.java
index 48a97a7..65fd729 100644
--- a/src/java/org/apache/cassandra/db/rows/ArrayCell.java
+++ b/src/java/org/apache/cassandra/db/rows/ArrayCell.java
@@ -111,6 +111,13 @@
         return super.clone(cloner);
     }
 
+    @Override
+    public long unsharedHeapSize()
+    {
+        return EMPTY_SIZE + ObjectSizes.sizeOfArray(value) + (path == null ? 0 : path.unsharedHeapSize());
+    }
+
+    @Override
     public long unsharedHeapSizeExcludingData()
     {
         return EMPTY_SIZE + ObjectSizes.sizeOfArray(value) - value.length + (path == null ? 0 : path.unsharedHeapSizeExcludingData());
diff --git a/src/java/org/apache/cassandra/db/rows/BTreeRow.java b/src/java/org/apache/cassandra/db/rows/BTreeRow.java
index 5a10f37..125932b 100644
--- a/src/java/org/apache/cassandra/db/rows/BTreeRow.java
+++ b/src/java/org/apache/cassandra/db/rows/BTreeRow.java
@@ -469,6 +469,18 @@
         return transformAndFilter(newInfo, newDeletion, (cd) -> cd.purge(purger, nowInSec));
     }
 
+    public Row purgeDataOlderThan(long timestamp, boolean enforceStrictLiveness)
+    {
+        LivenessInfo newInfo = primaryKeyLivenessInfo.timestamp() < timestamp ? LivenessInfo.EMPTY : primaryKeyLivenessInfo;
+        Deletion newDeletion = deletion.time().markedForDeleteAt() < timestamp ? Deletion.LIVE : deletion;
+
+        // when enforceStrictLiveness is set, a row is considered dead when it's PK liveness info is not present
+        if (enforceStrictLiveness && newDeletion.isLive() && newInfo.isEmpty())
+            return null;
+
+        return transformAndFilter(newInfo, newDeletion, cd -> cd.purgeDataOlderThan(timestamp));
+    }
+
     @Override
     public Row transformAndFilter(LivenessInfo info, Deletion deletion, Function<ColumnData, ColumnData> function)
     {
@@ -514,6 +526,19 @@
         return Ints.checkedCast(accumulate((cd, v) -> v + cd.dataSize(), dataSize));
     }
 
+    @Override
+    public long unsharedHeapSize()
+    {
+        long heapSize = EMPTY_SIZE
+                        + clustering.unsharedHeapSize()
+                        + primaryKeyLivenessInfo.unsharedHeapSize()
+                        + deletion.unsharedHeapSize()
+                        + BTree.sizeOfStructureOnHeap(btree);
+
+        return accumulate((cd, v) -> v + cd.unsharedHeapSize(), heapSize);
+    }
+
+    @Override
     public long unsharedHeapSizeExcludingData()
     {
         long heapSize = EMPTY_SIZE
diff --git a/src/java/org/apache/cassandra/db/rows/BufferCell.java b/src/java/org/apache/cassandra/db/rows/BufferCell.java
index fc85b39..c18fd3e 100644
--- a/src/java/org/apache/cassandra/db/rows/BufferCell.java
+++ b/src/java/org/apache/cassandra/db/rows/BufferCell.java
@@ -135,6 +135,12 @@
     }
 
     @Override
+    public long unsharedHeapSize()
+    {
+        return EMPTY_SIZE + ObjectSizes.sizeOnHeapOf(value) + (path == null ? 0 : path.unsharedHeapSize());
+    }
+
+    @Override
     public Cell<?> clone(ByteBufferCloner cloner)
     {
         if (!value.hasRemaining() && path == null)
@@ -143,6 +149,7 @@
         return super.clone(cloner);
     }
 
+    @Override
     public long unsharedHeapSizeExcludingData()
     {
         return EMPTY_SIZE + ObjectSizes.sizeOnHeapExcludingData(value) + (path == null ? 0 : path.unsharedHeapSizeExcludingData());
diff --git a/src/java/org/apache/cassandra/db/rows/Cell.java b/src/java/org/apache/cassandra/db/rows/Cell.java
index 1a7cd71..eafdc37 100644
--- a/src/java/org/apache/cassandra/db/rows/Cell.java
+++ b/src/java/org/apache/cassandra/db/rows/Cell.java
@@ -174,6 +174,10 @@
     // Overrides super type to provide a more precise return type.
     public abstract Cell<?> purge(DeletionPurger purger, int nowInSec);
 
+    @Override
+    // Overrides super type to provide a more precise return type.
+    public abstract Cell<?> purgeDataOlderThan(long timestamp);
+
     /**
      * The serialization format for cell is:
      *     [ flags ][ timestamp ][ deletion time ][    ttl    ][ path size ][ path ][ value size ][ value ]
diff --git a/src/java/org/apache/cassandra/db/rows/CellPath.java b/src/java/org/apache/cassandra/db/rows/CellPath.java
index aacccf3..8e018a7 100644
--- a/src/java/org/apache/cassandra/db/rows/CellPath.java
+++ b/src/java/org/apache/cassandra/db/rows/CellPath.java
@@ -21,6 +21,7 @@
 import java.nio.ByteBuffer;
 import java.util.Objects;
 
+import org.apache.cassandra.cache.IMeasurableMemory;
 import org.apache.cassandra.db.Digest;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.io.util.DataInputPlus;
@@ -31,7 +32,7 @@
 /**
  * A path for a cell belonging to a complex column type (non-frozen collection or UDT).
  */
-public abstract class CellPath
+public abstract class CellPath implements IMeasurableMemory
 {
     public static final CellPath BOTTOM = new EmptyCellPath();
     public static final CellPath TOP = new EmptyCellPath();
@@ -64,6 +65,8 @@
 
     public abstract long unsharedHeapSizeExcludingData();
 
+    public abstract long unsharedHeapSize();
+
     @Override
     public final int hashCode()
     {
@@ -126,6 +129,13 @@
             return new SingleItemCellPath(cloner.clone(value));
         }
 
+        @Override
+        public long unsharedHeapSize()
+        {
+            return EMPTY_SIZE + ObjectSizes.sizeOnHeapOf(value);
+        }
+
+        @Override
         public long unsharedHeapSizeExcludingData()
         {
             return EMPTY_SIZE + ObjectSizes.sizeOnHeapExcludingData(value);
@@ -150,6 +160,14 @@
             return this;
         }
 
+        @Override
+        public long unsharedHeapSize()
+        {
+            // empty only happens with a cached reference, so 0 unshared space
+            return 0;
+        }
+
+        @Override
         public long unsharedHeapSizeExcludingData()
         {
             return 0;
diff --git a/src/java/org/apache/cassandra/db/rows/ColumnData.java b/src/java/org/apache/cassandra/db/rows/ColumnData.java
index e4fa83c..e0bc552 100644
--- a/src/java/org/apache/cassandra/db/rows/ColumnData.java
+++ b/src/java/org/apache/cassandra/db/rows/ColumnData.java
@@ -19,6 +19,7 @@
 
 import java.util.Comparator;
 
+import org.apache.cassandra.cache.IMeasurableMemory;
 import org.apache.cassandra.db.Digest;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.db.DeletionPurger;
@@ -36,7 +37,7 @@
  * In practice, there is only 2 implementations of this: either {@link Cell} for simple columns
  * or {@code ComplexColumnData} for complex columns.
  */
-public abstract class ColumnData
+public abstract class ColumnData implements IMeasurableMemory
 {
     public static final Comparator<ColumnData> comparator = (cd1, cd2) -> cd1.column().compareTo(cd2.column());
 
@@ -193,7 +194,7 @@
         {
             if (!(existing instanceof ComplexColumnData))
             {
-                if (activeDeletion.deletes((Cell) existing))
+                if (activeDeletion.deletes((Cell<?>) existing))
                 {
                     recordDeletion.delete(existing);
                     return null;
@@ -246,6 +247,8 @@
 
     public abstract long unsharedHeapSizeExcludingData();
 
+    public abstract long unsharedHeapSize();
+
     /**
      * Validate the column data.
      *
@@ -285,6 +288,7 @@
     public abstract ColumnData markCounterLocalToBeCleared();
 
     public abstract ColumnData purge(DeletionPurger purger, int nowInSec);
+    public abstract ColumnData purgeDataOlderThan(long timestamp);
 
     public abstract long maxTimestamp();
 }
diff --git a/src/java/org/apache/cassandra/db/rows/ComplexColumnData.java b/src/java/org/apache/cassandra/db/rows/ComplexColumnData.java
index ee86e5d..12880b7 100644
--- a/src/java/org/apache/cassandra/db/rows/ComplexColumnData.java
+++ b/src/java/org/apache/cassandra/db/rows/ComplexColumnData.java
@@ -28,11 +28,8 @@
 import org.apache.cassandra.db.DeletionTime;
 import org.apache.cassandra.db.Digest;
 import org.apache.cassandra.db.LivenessInfo;
-import org.apache.cassandra.db.context.CounterContext;
 import org.apache.cassandra.db.filter.ColumnFilter;
-import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.ByteType;
-import org.apache.cassandra.db.marshal.CollectionType;
 import org.apache.cassandra.db.marshal.SetType;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.DroppedColumn;
@@ -136,6 +133,13 @@
         return size;
     }
 
+    public long unsharedHeapSize()
+    {
+        long heapSize = EMPTY_SIZE + BTree.sizeOnHeapOf(cells) + complexDeletion.unsharedHeapSize();
+        return BTree.<Cell>accumulate(cells, (cell, value) -> value + cell.unsharedHeapSize(), heapSize);
+    }
+
+    @Override
     public long unsharedHeapSizeExcludingData()
     {
         long heapSize = EMPTY_SIZE + BTree.sizeOnHeapOf(cells);
@@ -210,6 +214,12 @@
         return transformAndFilter(complexDeletion, (cell) -> filter.fetchedCellIsQueried(column, cell.path()) ? null : cell);
     }
 
+    public ComplexColumnData purgeDataOlderThan(long timestamp)
+    {
+        DeletionTime newDeletion = complexDeletion.markedForDeleteAt() < timestamp ? DeletionTime.LIVE : complexDeletion;
+        return transformAndFilter(newDeletion, (cell) -> cell.purgeDataOlderThan(timestamp));
+    }
+
     private ComplexColumnData update(DeletionTime newDeletion, Object[] newCells)
     {
         if (cells == newCells && newDeletion == complexDeletion)
diff --git a/src/java/org/apache/cassandra/db/rows/NativeCell.java b/src/java/org/apache/cassandra/db/rows/NativeCell.java
index d538504..e7941cf 100644
--- a/src/java/org/apache/cassandra/db/rows/NativeCell.java
+++ b/src/java/org/apache/cassandra/db/rows/NativeCell.java
@@ -166,6 +166,13 @@
         return new BufferCell(column, timestamp(), ttl(), localDeletionTime(), ByteBufferUtil.EMPTY_BYTE_BUFFER, path());
     }
 
+    @Override
+    public long unsharedHeapSize()
+    {
+        return EMPTY_SIZE;
+    }
+
+    @Override
     public long unsharedHeapSizeExcludingData()
     {
         return EMPTY_SIZE;
diff --git a/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundMarker.java b/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundMarker.java
index d030997..67f43c9 100644
--- a/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundMarker.java
+++ b/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundMarker.java
@@ -22,6 +22,7 @@
 import org.apache.cassandra.db.marshal.ValueAccessor;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
+import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.memory.ByteBufferCloner;
 
 /**
@@ -29,6 +30,8 @@
  */
 public class RangeTombstoneBoundMarker extends AbstractRangeTombstoneMarker<ClusteringBound<?>>
 {
+    private static final long EMPTY_SIZE = ObjectSizes.measure(new RangeTombstoneBoundMarker(new ArrayClusteringBound(ClusteringPrefix.Kind.INCL_START_BOUND, AbstractArrayClusteringPrefix.EMPTY_VALUES_ARRAY), null));
+
     private final DeletionTime deletion;
 
     public RangeTombstoneBoundMarker(ClusteringBound<?> bound, DeletionTime deletion)
@@ -157,6 +160,12 @@
         deletion.digest(digest);
     }
 
+    @Override
+    public long unsharedHeapSize()
+    {
+        return EMPTY_SIZE + deletion.unsharedHeapSize();
+    }
+
     public String toString(TableMetadata metadata)
     {
         return String.format("Marker %s@%d/%d", bound.toString(metadata), deletion.markedForDeleteAt(), deletion.localDeletionTime());
diff --git a/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundaryMarker.java b/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundaryMarker.java
index a1be85d..c36dcfd 100644
--- a/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundaryMarker.java
+++ b/src/java/org/apache/cassandra/db/rows/RangeTombstoneBoundaryMarker.java
@@ -23,13 +23,18 @@
 import org.apache.cassandra.db.marshal.ValueAccessor;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
+
+import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.memory.ByteBufferCloner;
 
+
 /**
  * A range tombstone marker that represents a boundary between 2 range tombstones (i.e. it closes one range and open another).
  */
 public class RangeTombstoneBoundaryMarker extends AbstractRangeTombstoneMarker<ClusteringBoundary<?>>
 {
+    private static final long EMPTY_SIZE = ObjectSizes.measure(new RangeTombstoneBoundaryMarker(new ArrayClusteringBoundary(ClusteringPrefix.Kind.INCL_END_EXCL_START_BOUNDARY, new byte[][] { new byte[0]}), null, null));
+
     private final DeletionTime endDeletion;
     private final DeletionTime startDeletion;
 
@@ -188,6 +193,12 @@
         startDeletion.digest(digest);
     }
 
+    @Override
+    public long unsharedHeapSize()
+    {
+        return EMPTY_SIZE + startDeletion.unsharedHeapSize() + endDeletion.unsharedHeapSize();
+    }
+
     public String toString(TableMetadata metadata)
     {
         return String.format("Marker %s@%d/%d-%d/%d",
diff --git a/src/java/org/apache/cassandra/db/rows/RangeTombstoneMarker.java b/src/java/org/apache/cassandra/db/rows/RangeTombstoneMarker.java
index 3b64545..2db6204 100644
--- a/src/java/org/apache/cassandra/db/rows/RangeTombstoneMarker.java
+++ b/src/java/org/apache/cassandra/db/rows/RangeTombstoneMarker.java
@@ -19,6 +19,7 @@
 
 import java.util.*;
 
+import org.apache.cassandra.cache.IMeasurableMemory;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.utils.memory.ByteBufferCloner;
 
@@ -27,7 +28,7 @@
  * <p>
  * There is 2 types of markers: bounds (see {@link RangeTombstoneBoundMarker}) and boundaries (see {@link RangeTombstoneBoundaryMarker}).
  */
-public interface RangeTombstoneMarker extends Unfiltered
+public interface RangeTombstoneMarker extends Unfiltered, IMeasurableMemory
 {
     @Override
     public ClusteringBoundOrBoundary<?> clustering();
diff --git a/src/java/org/apache/cassandra/db/rows/Row.java b/src/java/org/apache/cassandra/db/rows/Row.java
index 40d1467..bf8c051 100644
--- a/src/java/org/apache/cassandra/db/rows/Row.java
+++ b/src/java/org/apache/cassandra/db/rows/Row.java
@@ -22,6 +22,7 @@
 import java.util.function.Consumer;
 import java.util.function.Function;
 
+import org.apache.cassandra.cache.IMeasurableMemory;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.schema.ColumnMetadata;
@@ -49,7 +50,7 @@
  * it's own data. For instance, a {@code Row} cannot contains a cell that is deleted by its own
  * row deletion.
  */
-public interface Row extends Unfiltered, Iterable<ColumnData>
+public interface Row extends Unfiltered, Iterable<ColumnData>, IMeasurableMemory
 {
     /**
      * The clustering values for this row.
@@ -116,7 +117,7 @@
      * 
      * @param nowInSec the current time to decide what is deleted and what isn't
      * @param enforceStrictLiveness whether the row should be purged if there is no PK liveness info,
-     *                              normally retrieved from {@link CFMetaData#enforceStrictLiveness()}
+     *                              normally retrieved from {@link TableMetadata#enforceStrictLiveness()}
      * @return true if there is some live information
      */
     public boolean hasLiveData(int nowInSec, boolean enforceStrictLiveness);
@@ -278,6 +279,11 @@
      */
     public Row withOnlyQueriedData(ColumnFilter filter);
 
+    /*
+     * Returns a copy of this row without any data with a timestamp older than the one provided
+     */
+    public Row purgeDataOlderThan(long timestamp, boolean enforceStrictLiveness);
+
     /**
      * Returns a copy of this row where all counter cells have they "local" shard marked for clearing.
      */
@@ -310,6 +316,7 @@
     public long unsharedHeapSizeExcludingData();
 
     public String toString(TableMetadata metadata, boolean fullDetails);
+    public long unsharedHeapSize();
 
     /**
      * Apply a function to every column in a row
@@ -650,6 +657,14 @@
         public SimpleBuilder delete();
 
         /**
+         * Deletes the whole row with a timestamp that is just before the new data's timestamp, to make sure no expired
+         * data remains on the row.
+         *
+         * @return this builder.
+         */
+        public SimpleBuilder deletePrevious();
+
+        /**
          * Removes the value for a given column (creating a tombstone).
          *
          * @param columnName the name of the column to delete.
diff --git a/src/java/org/apache/cassandra/db/rows/Rows.java b/src/java/org/apache/cassandra/db/rows/Rows.java
index c44e0a2..8a8de61 100644
--- a/src/java/org/apache/cassandra/db/rows/Rows.java
+++ b/src/java/org/apache/cassandra/db/rows/Rows.java
@@ -237,8 +237,8 @@
     }
 
     /**
-     * Merges two rows into the given builder, mainly for merging memtable rows. In addition to reconciling the cells
-     * in each row, the liveness info, and deletion times for the row and complex columns are also merged.
+     * Merges two rows. In addition to reconciling the cells in each row, the liveness info, and deletion times for
+     * the row and complex columns are also merged.
      * <p>
      * Note that this method assumes that the provided rows can meaningfully be reconciled together. That is,
      * that the rows share the same clustering value, and belong to the same partition.
diff --git a/src/java/org/apache/cassandra/db/rows/ThrottledUnfilteredIterator.java b/src/java/org/apache/cassandra/db/rows/ThrottledUnfilteredIterator.java
index 40be716..cbbac64 100644
--- a/src/java/org/apache/cassandra/db/rows/ThrottledUnfilteredIterator.java
+++ b/src/java/org/apache/cassandra/db/rows/ThrottledUnfilteredIterator.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.db.rows;
 
-import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.Iterator;
diff --git a/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorSerializer.java b/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorSerializer.java
index 938a3ee..11541ee 100644
--- a/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorSerializer.java
+++ b/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorSerializer.java
@@ -66,7 +66,7 @@
 {
     protected static final Logger logger = LoggerFactory.getLogger(UnfilteredRowIteratorSerializer.class);
 
-    private static final int IS_EMPTY               = 0x01;
+    public  static final int IS_EMPTY               = 0x01;
     private static final int IS_REVERSED            = 0x02;
     private static final int HAS_PARTITION_DELETION = 0x04;
     private static final int HAS_STATIC_ROW         = 0x08;
diff --git a/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorWithLowerBound.java b/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorWithLowerBound.java
index b6f4254..4d1d71b 100644
--- a/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorWithLowerBound.java
+++ b/src/java/org/apache/cassandra/db/rows/UnfilteredRowIteratorWithLowerBound.java
@@ -97,7 +97,7 @@
     {
         @SuppressWarnings("resource") // 'iter' is added to iterators which is closed on exception, or through the closing of the final merged iterator
         UnfilteredRowIterator iter = RTBoundValidator.validate(
-            sstable.iterator(partitionKey(), filter.getSlices(metadata()), selectedColumns, filter.isReversed(), listener),
+            sstable.rowIterator(partitionKey(), filter.getSlices(metadata()), selectedColumns, filter.isReversed(), listener),
             RTBoundValidator.Stage.SSTABLE,
             false
         );
@@ -185,7 +185,7 @@
         // CASSANDRA-11369 is there to fix this afterwards.
 
         // Creating the iterator ensures that rowIndexEntry is loaded if available (partitions bigger than
-        // DatabaseDescriptor.column_index_size_in_kb)
+        // DatabaseDescriptor.column_index_size)
         if (!canUseMetadataLowerBound())
             maybeInit();
 
diff --git a/src/java/org/apache/cassandra/db/rows/UnfilteredSource.java b/src/java/org/apache/cassandra/db/rows/UnfilteredSource.java
new file mode 100644
index 0000000..b984522
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/rows/UnfilteredSource.java
@@ -0,0 +1,69 @@
+/*
+ * 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.rows;
+
+import org.apache.cassandra.db.DataRange;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Slices;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
+
+/**
+ * Common data access interface for sstables and memtables.
+ */
+public interface UnfilteredSource
+{
+    /**
+     * Returns a row iterator for the given partition, applying the specified row and column filters.
+     *
+     * @param key the partition key
+     * @param slices the row ranges to return
+     * @param columnFilter filter to apply to all returned partitions
+     * @param reversed true if the content should be returned in reverse order
+     * @param listener a listener used to handle internal read events
+     */
+    UnfilteredRowIterator rowIterator(DecoratedKey key,
+                                      Slices slices,
+                                      ColumnFilter columnFilter,
+                                      boolean reversed,
+                                      SSTableReadsListener listener);
+
+    default UnfilteredRowIterator rowIterator(DecoratedKey key)
+    {
+        return rowIterator(key, Slices.ALL, ColumnFilter.NONE, false, SSTableReadsListener.NOOP_LISTENER);
+    }
+
+    /**
+     * Returns a partition iterator for the given data range.
+     *
+     * @param columnFilter filter to apply to all returned partitions
+     * @param dataRange the partition and clustering range queried
+     * @param listener a listener used to handle internal read events
+     */
+    UnfilteredPartitionIterator partitionIterator(ColumnFilter columnFilter,
+                                                  DataRange dataRange,
+                                                  SSTableReadsListener listener);
+
+    /** Minimum timestamp of all stored data */
+    long getMinTimestamp();
+
+    /** Minimum local deletion time in the memtable */
+    int getMinLocalDeletionTime();
+}
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamReader.java b/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamReader.java
index ff9e6f7..005a9aa 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamReader.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamReader.java
@@ -19,12 +19,10 @@
 
 import java.io.IOException;
 
-import com.google.common.base.Throwables;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.io.compress.CompressionMetadata;
 import org.apache.cassandra.io.sstable.SSTableMultiWriter;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.DataInputPlus;
@@ -35,8 +33,6 @@
 import org.apache.cassandra.utils.ChecksumType;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static org.apache.cassandra.utils.Throwables.extractIOExceptionCause;
-
 /**
  * CassandraStreamReader that reads from streamed compressed SSTable
  */
@@ -58,7 +54,7 @@
      */
     @Override
     @SuppressWarnings("resource") // input needs to remain open, streams on top of it can't be closed
-    public SSTableMultiWriter read(DataInputPlus inputPlus) throws IOException
+    public SSTableMultiWriter read(DataInputPlus inputPlus) throws Throwable
     {
         long totalSize = totalSize();
 
@@ -82,6 +78,7 @@
             deserializer = new StreamDeserializer(cfs.metadata(), in, inputVersion, getHeader(cfs.metadata()));
             writer = createWriter(cfs, totalSize, repairedAt, pendingRepair, format);
             String filename = writer.getFilename();
+            String sectionName = filename + '-' + fileSeqNum;
             int sectionIdx = 0;
             for (SSTableReader.PartitionPositionBounds section : sections)
             {
@@ -93,15 +90,19 @@
                 cis.position(section.lowerPosition);
                 in.reset(0);
 
+                long lastBytesRead = 0;
                 while (in.getBytesRead() < sectionLength)
                 {
                     writePartition(deserializer, writer);
                     // when compressed, report total bytes of compressed chunks read since remoteFile.size is the sum of chunks transferred
-                    session.progress(filename + '-' + fileSeqNum, ProgressInfo.Direction.IN, cis.chunkBytesRead(), totalSize);
+                    long bytesRead = cis.chunkBytesRead();
+                    long bytesDelta = bytesRead - lastBytesRead;
+                    lastBytesRead = bytesRead;
+                    session.progress(sectionName, ProgressInfo.Direction.IN, bytesRead, bytesDelta, totalSize);
                 }
                 assert in.getBytesRead() == sectionLength;
             }
-            logger.trace("[Stream #{}] Finished receiving file #{} from {} readBytes = {}, totalSize = {}", session.planId(), fileSeqNum,
+            logger.info("[Stream #{}] Finished receiving file #{} from {} readBytes = {}, totalSize = {}", session.planId(), fileSeqNum,
                          session.peer, FBUtilities.prettyPrintMemory(cis.chunkBytesRead()), FBUtilities.prettyPrintMemory(totalSize));
             return writer;
         }
@@ -111,12 +112,8 @@
             logger.warn("[Stream {}] Error while reading partition {} from stream on ks='{}' and table='{}'.",
                         session.planId(), partitionKey, cfs.keyspace.getName(), cfs.getTableName());
             if (writer != null)
-            {
-                writer.abort(e);
-            }
-            if (extractIOExceptionCause(e).isPresent())
-                throw e;
-            throw Throwables.propagate(e);
+                e = writer.abort(e);
+            throw e;
         }
     }
 
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamWriter.java b/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamWriter.java
index 8d0b67f..41fd9b1 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamWriter.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraCompressedStreamWriter.java
@@ -30,9 +30,8 @@
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.ChannelProxy;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.net.AsyncStreamingOutputPlus;
 import org.apache.cassandra.streaming.ProgressInfo;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -57,9 +56,8 @@
     }
 
     @Override
-    public void write(DataOutputStreamPlus output) throws IOException
+    public void write(StreamingDataOutputPlus out) throws IOException
     {
-        AsyncStreamingOutputPlus out = (AsyncStreamingOutputPlus) output;
         long totalSize = totalSize();
         logger.debug("[Stream #{}] Start streaming file {} to {}, repairedAt = {}, totalSize = {}", session.planId(),
                      sstable.getFilename(), session.peer, sstable.getSSTableMetadata().repairedAt, totalSize);
@@ -73,6 +71,7 @@
             int sectionIdx = 0;
 
             // stream each of the required sections of the file
+            String filename = sstable.descriptor.filenameFor(Component.DATA);
             for (Section section : sections)
             {
                 // length of the section to stream
@@ -96,7 +95,7 @@
 
                     bytesTransferred += toTransfer;
                     progress += toTransfer;
-                    session.progress(sstable.descriptor.filenameFor(Component.DATA), ProgressInfo.Direction.OUT, progress, totalSize);
+                    session.progress(filename, ProgressInfo.Direction.OUT, progress, toTransfer, totalSize);
                 }
             }
             logger.debug("[Stream #{}] Finished streaming file {} to {}, bytesTransferred = {}, totalSize = {}",
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamReader.java b/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamReader.java
index 0bfe993..515c85d 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamReader.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamReader.java
@@ -18,18 +18,16 @@
 
 package org.apache.cassandra.db.streaming;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Collection;
 import java.util.function.UnaryOperator;
 
-import com.google.common.base.Throwables;
-import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.SSTableMultiWriter;
@@ -37,6 +35,7 @@
 import org.apache.cassandra.io.sstable.format.big.BigTableZeroCopyWriter;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.ProgressInfo;
 import org.apache.cassandra.streaming.StreamReceiver;
@@ -85,7 +84,7 @@
      */
     @SuppressWarnings("resource") // input needs to remain open, streams on top of it can't be closed
     @Override
-    public SSTableMultiWriter read(DataInputPlus in) throws IOException
+    public SSTableMultiWriter read(DataInputPlus in) throws Throwable
     {
         ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(tableId);
         if (cfs == null)
@@ -123,7 +122,7 @@
                              prettyPrintMemory(totalSize));
 
                 writer.writeComponent(component.type, in, length);
-                session.progress(writer.descriptor.filenameFor(component), ProgressInfo.Direction.IN, length, length);
+                session.progress(writer.descriptor.filenameFor(component), ProgressInfo.Direction.IN, length, length, length);
                 bytesRead += length;
 
                 logger.debug("[Stream #{}] Finished receiving {} component from {}, componentSize = {}, readBytes = {}, totalSize = {}",
@@ -147,8 +146,7 @@
             logger.error("[Stream {}] Error while reading sstable from stream for table = {}", session.planId(), cfs.metadata(), e);
             if (writer != null)
                 e = writer.abort(e);
-            Throwables.throwIfUnchecked(e);
-            throw new RuntimeException(e);
+            throw e;
         }
     }
 
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriter.java b/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriter.java
index ef82eb2..3d679a5 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriter.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriter.java
@@ -26,8 +26,8 @@
 
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
-import org.apache.cassandra.net.AsyncStreamingOutputPlus;
 import org.apache.cassandra.streaming.ProgressInfo;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamManager;
 import org.apache.cassandra.streaming.StreamSession;
 
@@ -53,7 +53,7 @@
         this.sstable = sstable;
         this.context = context;
         this.manifest = context.manifest();
-        this.limiter = StreamManager.getRateLimiter(session.peer);
+        this.limiter = StreamManager.getEntireSSTableRateLimiter(session.peer);
     }
 
     /**
@@ -63,7 +63,7 @@
      * @param out where this writes data to
      * @throws IOException on any I/O error
      */
-    public void write(AsyncStreamingOutputPlus out) throws IOException
+    public void write(StreamingDataOutputPlus out) throws IOException
     {
         long totalSize = manifest.totalSize();
         logger.debug("[Stream #{}] Start streaming sstable {} to {}, repairedAt = {}, totalSize = {}",
@@ -84,7 +84,7 @@
             logger.debug("[Stream #{}] Streaming {}.{} gen {} component {} size {}", session.planId(),
                          sstable.getKeyspaceName(),
                          sstable.getColumnFamilyName(),
-                         sstable.descriptor.generation,
+                         sstable.descriptor.id,
                          component,
                          prettyPrintMemory(length));
 
@@ -93,13 +93,13 @@
             long bytesWritten = out.writeFileToChannel(channel, limiter);
             progress += bytesWritten;
 
-            session.progress(sstable.descriptor.filenameFor(component), ProgressInfo.Direction.OUT, bytesWritten, length);
+            session.progress(sstable.descriptor.filenameFor(component), ProgressInfo.Direction.OUT, bytesWritten, bytesWritten, length);
 
             logger.debug("[Stream #{}] Finished streaming {}.{} gen {} component {} to {}, xfered = {}, length = {}, totalSize = {}",
                          session.planId(),
                          sstable.getKeyspaceName(),
                          sstable.getColumnFamilyName(),
-                         sstable.descriptor.generation,
+                         sstable.descriptor.id,
                          component,
                          session.peer,
                          prettyPrintMemory(bytesWritten),
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraIncomingFile.java b/src/java/org/apache/cassandra/db/streaming/CassandraIncomingFile.java
index 2d6a4fd..3e87d67 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraIncomingFile.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraIncomingFile.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.db.streaming;
 
-import java.io.IOException;
 import java.util.Objects;
 
 import com.google.common.base.Preconditions;
@@ -64,10 +63,11 @@
     }
 
     @Override
-    public synchronized void read(DataInputPlus in, int version) throws IOException
+    public synchronized void read(DataInputPlus in, int version) throws Throwable
     {
         CassandraStreamHeader streamHeader = CassandraStreamHeader.serializer.deserialize(in, version);
         logger.debug("Incoming stream entireSSTable={} components={}", streamHeader.isEntireSSTable, streamHeader.componentManifest);
+        session.countStreamedIn(streamHeader.isEntireSSTable);
 
         IStreamReader reader;
         if (streamHeader.isEntireSSTable)
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraOutgoingFile.java b/src/java/org/apache/cassandra/db/streaming/CassandraOutgoingFile.java
index 0904720..367c304 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraOutgoingFile.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraOutgoingFile.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.util.List;
 import java.util.Objects;
-import java.util.UUID;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
@@ -30,12 +29,12 @@
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.net.AsyncStreamingOutputPlus;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.OutgoingStream;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.streaming.StreamSession;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Ref;
 
 /**
@@ -142,25 +141,21 @@
     }
 
     @Override
-    public UUID getPendingRepair()
+    public TimeUUID getPendingRepair()
     {
         return ref.get().getPendingRepair();
     }
 
     @Override
-    public void write(StreamSession session, DataOutputStreamPlus out, int version) throws IOException
+    public void write(StreamSession session, StreamingDataOutputPlus out, int version) throws IOException
     {
-        // FileStreamTask uses AsyncStreamingOutputPlus for streaming.
-        assert out instanceof AsyncStreamingOutputPlus : "Unexpected DataOutputStreamPlus " + out.getClass();
-
         SSTableReader sstable = ref.get();
 
         if (shouldStreamEntireSSTable)
         {
             // Acquire lock to avoid concurrent sstable component mutation because of stats update or index summary
             // redistribution, otherwise file sizes recorded in component manifest will be different from actual
-            // file sizes. (Note: Windows doesn't support atomic replace and index summary redistribution deletes
-            // existing file first)
+            // file sizes.
             // Recreate the latest manifest and hard links for mutatable components in case they are modified.
             try (ComponentContext context = sstable.runWithLock(ignored -> ComponentContext.create(sstable.descriptor)))
             {
@@ -169,7 +164,7 @@
                 out.flush();
 
                 CassandraEntireSSTableStreamWriter writer = new CassandraEntireSSTableStreamWriter(sstable, session, context);
-                writer.write((AsyncStreamingOutputPlus) out);
+                writer.write(out);
             }
         }
         else
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraStreamManager.java b/src/java/org/apache/cassandra/db/streaming/CassandraStreamManager.java
index a84fd27..46cf253 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraStreamManager.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraStreamManager.java
@@ -40,6 +40,7 @@
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.streaming.TableStreamManager;
 import org.apache.cassandra.streaming.messages.StreamMessageHeader;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Ref;
 import org.apache.cassandra.utils.concurrent.Refs;
 import org.slf4j.Logger;
@@ -49,7 +50,6 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 
 /**
  * Implements the streaming interface for the native cassandra storage engine.
@@ -81,8 +81,9 @@
         return new CassandraStreamReceiver(cfs, session, totalStreams);
     }
 
+    @SuppressWarnings("resource")   // references placed onto returned collection or closed on error
     @Override
-    public Collection<OutgoingStream> createOutgoingStreams(StreamSession session, RangesAtEndpoint replicas, UUID pendingRepair, PreviewKind previewKind)
+    public Collection<OutgoingStream> createOutgoingStreams(StreamSession session, RangesAtEndpoint replicas, TimeUUID pendingRepair, PreviewKind previewKind)
     {
         Refs<SSTableReader> refs = new Refs<>();
         try
@@ -126,6 +127,9 @@
                 return sstables;
             }).refs);
 
+            // This call is normally preceded by a memtable flush in StreamSession.addTransferRanges.
+            // Persistent memtables will not flush, make an sstable with their data.
+            cfs.writeAndAddMemtableRanges(session.getPendingRepair(), () -> Range.normalize(keyRanges), refs);
 
             List<Range<Token>> normalizedFullRanges = Range.normalize(replicas.onlyFull().ranges());
             List<Range<Token>> normalizedAllRanges = Range.normalize(replicas.ranges());
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraStreamReader.java b/src/java/org/apache/cassandra/db/streaming/CassandraStreamReader.java
index 6835fad..04268f0 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraStreamReader.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraStreamReader.java
@@ -17,31 +17,38 @@
  */
 package org.apache.cassandra.db.streaming;
 
-import java.io.*;
+import java.io.IOError;
+import java.io.IOException;
 import java.util.Collection;
-import java.util.UUID;
 
 import com.google.common.base.Preconditions;
-import com.google.common.base.Throwables;
 import com.google.common.collect.UnmodifiableIterator;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.exceptions.UnknownColumnException;
-import org.apache.cassandra.io.sstable.format.SSTableReader;
-import org.apache.cassandra.io.util.TrackedDataInputPlus;
-import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.DeletionTime;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.RegularAndStaticColumns;
+import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
-import org.apache.cassandra.db.rows.*;
+import org.apache.cassandra.db.rows.DeserializationHelper;
+import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.Unfiltered;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.exceptions.UnknownColumnException;
 import org.apache.cassandra.io.sstable.SSTableMultiWriter;
 import org.apache.cassandra.io.sstable.SSTableSimpleIterator;
 import org.apache.cassandra.io.sstable.format.RangeAwareSSTableWriter;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.TrackedDataInputPlus;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.streaming.ProgressInfo;
 import org.apache.cassandra.streaming.StreamReceiver;
 import org.apache.cassandra.streaming.StreamSession;
@@ -49,6 +56,7 @@
 import org.apache.cassandra.streaming.messages.StreamMessageHeader;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.net.MessagingService.current_version;
 
@@ -64,7 +72,7 @@
     protected final StreamSession session;
     protected final Version inputVersion;
     protected final long repairedAt;
-    protected final UUID pendingRepair;
+    protected final TimeUUID pendingRepair;
     protected final SSTableFormat.Type format;
     protected final int sstableLevel;
     protected final SerializationHeader.Component header;
@@ -98,16 +106,14 @@
      */
     @SuppressWarnings("resource") // input needs to remain open, streams on top of it can't be closed
     @Override
-    public SSTableMultiWriter read(DataInputPlus inputPlus) throws IOException
+    public SSTableMultiWriter read(DataInputPlus inputPlus) throws Throwable
     {
         long totalSize = totalSize();
 
         ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(tableId);
         if (cfs == null)
-        {
             // schema was dropped during streaming
-            throw new IOException("CF " + tableId + " was dropped during streaming");
-        }
+            throw new IllegalStateException("Table " + tableId + " was dropped during streaming");
 
         logger.debug("[Stream #{}] Start receiving file #{} from {}, repairedAt = {}, size = {}, ks = '{}', table = '{}', pendingRepair = '{}'.",
                      session.planId(), fileSeqNum, session.peer, repairedAt, totalSize, cfs.keyspace.getName(),
@@ -120,11 +126,16 @@
             TrackedDataInputPlus in = new TrackedDataInputPlus(streamCompressionInputStream);
             deserializer = new StreamDeserializer(cfs.metadata(), in, inputVersion, getHeader(cfs.metadata()));
             writer = createWriter(cfs, totalSize, repairedAt, pendingRepair, format);
+            String sequenceName = writer.getFilename() + '-' + fileSeqNum;
+            long lastBytesRead = 0;
             while (in.getBytesRead() < totalSize)
             {
                 writePartition(deserializer, writer);
                 // TODO move this to BytesReadTracker
-                session.progress(writer.getFilename() + '-' + fileSeqNum, ProgressInfo.Direction.IN, in.getBytesRead(), totalSize);
+                long bytesRead = in.getBytesRead();
+                long bytesDelta = bytesRead - lastBytesRead;
+                lastBytesRead = bytesRead;
+                session.progress(sequenceName, ProgressInfo.Direction.IN, bytesRead, bytesDelta, totalSize);
             }
             logger.debug("[Stream #{}] Finished receiving file #{} from {} readBytes = {}, totalSize = {}",
                          session.planId(), fileSeqNum, session.peer, FBUtilities.prettyPrintMemory(in.getBytesRead()), FBUtilities.prettyPrintMemory(totalSize));
@@ -136,10 +147,8 @@
             logger.warn("[Stream {}] Error while reading partition {} from stream on ks='{}' and table='{}'.",
                         session.planId(), partitionKey, cfs.keyspace.getName(), cfs.getTableName(), e);
             if (writer != null)
-            {
-                writer.abort(e);
-            }
-            throw Throwables.propagate(e);
+                e = writer.abort(e);
+            throw e;
         }
     }
 
@@ -148,7 +157,7 @@
         return header != null? header.toHeader(metadata) : null; //pre-3.0 sstable have no SerializationHeader
     }
     @SuppressWarnings("resource")
-    protected SSTableMultiWriter createWriter(ColumnFamilyStore cfs, long totalSize, long repairedAt, UUID pendingRepair, SSTableFormat.Type format) throws IOException
+    protected SSTableMultiWriter createWriter(ColumnFamilyStore cfs, long totalSize, long repairedAt, TimeUUID pendingRepair, SSTableFormat.Type format) throws IOException
     {
         Directories.DataDirectory localDir = cfs.getDirectories().getWriteableLocation(totalSize);
         if (localDir == null)
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java b/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java
index b2b2ce5..48de8b5 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraStreamReceiver.java
@@ -28,7 +28,7 @@
 
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
 import org.apache.cassandra.io.sstable.SSTable;
-import org.apache.cassandra.streaming.StreamReceiveTask;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -181,11 +181,13 @@
      * For CDC-enabled tables, we want to ensure that the mutations are run through the CommitLog so they
      * can be archived by the CDC process on discard.
      */
-    private boolean requiresWritePath(ColumnFamilyStore cfs) {
-        return hasCDC(cfs) || (session.streamOperation().requiresViewBuild() && hasViews(cfs));
+    private boolean requiresWritePath(ColumnFamilyStore cfs)
+    {
+        return hasCDC(cfs) || cfs.streamToMemtable() || (session.streamOperation().requiresViewBuild() && hasViews(cfs));
     }
 
-    private void sendThroughWritePath(ColumnFamilyStore cfs, Collection<SSTableReader> readers) {
+    private void sendThroughWritePath(ColumnFamilyStore cfs, Collection<SSTableReader> readers)
+    {
         boolean hasCdc = hasCDC(cfs);
         ColumnFilter filter = ColumnFilter.all(cfs.metadata());
         for (SSTableReader reader : readers)
@@ -273,7 +275,7 @@
         // the streamed sstables.
         if (requiresWritePath)
         {
-            cfs.forceBlockingFlush();
+            cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.STREAMS_RECEIVED);
             abort();
         }
     }
diff --git a/src/java/org/apache/cassandra/db/streaming/CassandraStreamWriter.java b/src/java/org/apache/cassandra/db/streaming/CassandraStreamWriter.java
index 6481f4b..9d9ea3c 100644
--- a/src/java/org/apache/cassandra/db/streaming/CassandraStreamWriter.java
+++ b/src/java/org/apache/cassandra/db/streaming/CassandraStreamWriter.java
@@ -17,11 +17,11 @@
  */
 package org.apache.cassandra.db.streaming;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Collection;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -33,9 +33,8 @@
 import org.apache.cassandra.io.util.ChannelProxy;
 import org.apache.cassandra.io.util.DataIntegrityMetadata;
 import org.apache.cassandra.io.util.DataIntegrityMetadata.ChecksumValidator;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.net.AsyncStreamingOutputPlus;
 import org.apache.cassandra.streaming.ProgressInfo;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamManager;
 import org.apache.cassandra.streaming.StreamManager.StreamRateLimiter;
 import org.apache.cassandra.streaming.StreamSession;
@@ -75,16 +74,15 @@
      *
      * CassandraStreamWriter uses LZF compression on wire to decrease size to transfer.
      *
-     * @param output where this writes data to
+     * @param out where this writes data to
      * @throws IOException on any I/O error
      */
-    public void write(DataOutputStreamPlus output) throws IOException
+    public void write(StreamingDataOutputPlus out) throws IOException
     {
         long totalSize = totalSize();
         logger.debug("[Stream #{}] Start streaming file {} to {}, repairedAt = {}, totalSize = {}", session.planId(),
                      sstable.getFilename(), session.peer, sstable.getSSTableMetadata().repairedAt, totalSize);
 
-        AsyncStreamingOutputPlus out = (AsyncStreamingOutputPlus) output;
         try(ChannelProxy proxy = sstable.getDataChannel().newChannel();
             ChecksumValidator validator = new File(sstable.descriptor.filenameFor(Component.CRC)).exists()
                                           ? DataIntegrityMetadata.checksumValidator(sstable.descriptor)
@@ -96,6 +94,7 @@
             long progress = 0L;
 
             // stream each of the required sections of the file
+            String filename = sstable.descriptor.filenameFor(Component.DATA);
             for (SSTableReader.PartitionPositionBounds section : sections)
             {
                 long start = validator == null ? section.lowerPosition : validator.chunkStart(section.lowerPosition);
@@ -114,8 +113,9 @@
                     long lastBytesRead = write(proxy, validator, out, start, transferOffset, toTransfer, bufferSize);
                     start += lastBytesRead;
                     bytesRead += lastBytesRead;
-                    progress += (lastBytesRead - transferOffset);
-                    session.progress(sstable.descriptor.filenameFor(Component.DATA), ProgressInfo.Direction.OUT, progress, totalSize);
+                    long delta = lastBytesRead - transferOffset;
+                    progress += delta;
+                    session.progress(filename, ProgressInfo.Direction.OUT, progress, delta, totalSize);
                     transferOffset = 0;
                 }
 
@@ -145,7 +145,7 @@
      *
      * @throws java.io.IOException on any I/O error
      */
-    protected long write(ChannelProxy proxy, ChecksumValidator validator, AsyncStreamingOutputPlus output, long start, int transferOffset, int toTransfer, int bufferSize) throws IOException
+    protected long write(ChannelProxy proxy, ChecksumValidator validator, StreamingDataOutputPlus output, long start, int transferOffset, int toTransfer, int bufferSize) throws IOException
     {
         // the count of bytes to read off disk
         int minReadable = (int) Math.min(bufferSize, proxy.size() - start);
diff --git a/src/java/org/apache/cassandra/db/streaming/ComponentContext.java b/src/java/org/apache/cassandra/db/streaming/ComponentContext.java
index b9c60b9..c8c08aa 100644
--- a/src/java/org/apache/cassandra/db/streaming/ComponentContext.java
+++ b/src/java/org/apache/cassandra/db/streaming/ComponentContext.java
@@ -26,9 +26,7 @@
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.util.FileUtils;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.channels.FileChannel;
 import java.util.HashMap;
 import java.util.Map;
@@ -38,6 +36,8 @@
  * Mutable SSTable components and their hardlinks to avoid concurrent sstable component modification
  * during entire-sstable-streaming.
  */
+import org.apache.cassandra.io.util.File;
+
 public class ComponentContext implements AutoCloseable
 {
     private static final Logger logger = LoggerFactory.getLogger(ComponentContext.class);
@@ -81,9 +81,9 @@
      */
     public FileChannel channel(Descriptor descriptor, Component component, long size) throws IOException
     {
-        String toTransfer = hardLinks.containsKey(component) ? hardLinks.get(component).getPath() : descriptor.filenameFor(component);
+        String toTransfer = hardLinks.containsKey(component) ? hardLinks.get(component).path() : descriptor.filenameFor(component);
         @SuppressWarnings("resource") // file channel will be closed by Caller
-        FileChannel channel = new RandomAccessFile(toTransfer, "r").getChannel();
+        FileChannel channel = new File(toTransfer).newReadChannel();
 
         assert size == channel.size() : String.format("Entire sstable streaming expects %s file size to be %s but got %s.",
                                                       component, size, channel.size());
diff --git a/src/java/org/apache/cassandra/db/streaming/ComponentManifest.java b/src/java/org/apache/cassandra/db/streaming/ComponentManifest.java
index bb896ca..b77b594 100644
--- a/src/java/org/apache/cassandra/db/streaming/ComponentManifest.java
+++ b/src/java/org/apache/cassandra/db/streaming/ComponentManifest.java
@@ -28,13 +28,14 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.*;
 
 /**
  * SSTable components and their sizes to be tranfered via entire-sstable-streaming
  */
+import org.apache.cassandra.io.util.File;
+
 public final class ComponentManifest implements Iterable<Component>
 {
     private static final List<Component> STREAM_COMPONENTS = ImmutableList.of(Component.DATA, Component.PRIMARY_INDEX, Component.STATS,
@@ -105,6 +106,14 @@
         return components.hashCode();
     }
 
+    @Override
+    public String toString()
+    {
+        return "ComponentManifest{" +
+               "components=" + components +
+               '}';
+    }
+
     public static final IVersionedSerializer<ComponentManifest> serializer = new IVersionedSerializer<ComponentManifest>()
     {
         public void serialize(ComponentManifest manifest, DataOutputPlus out, int version) throws IOException
diff --git a/src/java/org/apache/cassandra/db/streaming/IStreamReader.java b/src/java/org/apache/cassandra/db/streaming/IStreamReader.java
index cf93bc2..e7cb2a2 100644
--- a/src/java/org/apache/cassandra/db/streaming/IStreamReader.java
+++ b/src/java/org/apache/cassandra/db/streaming/IStreamReader.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.db.streaming;
 
-import java.io.IOException;
-
 import org.apache.cassandra.io.sstable.SSTableMultiWriter;
 import org.apache.cassandra.io.util.DataInputPlus;
 
@@ -28,5 +26,5 @@
  */
 public interface IStreamReader
 {
-    public SSTableMultiWriter read(DataInputPlus inputPlus) throws IOException;
+    SSTableMultiWriter read(DataInputPlus inputPlus) throws Throwable;
 }
diff --git a/src/java/org/apache/cassandra/db/view/TableViews.java b/src/java/org/apache/cassandra/db/view/TableViews.java
index 8e64ef3..619e9f8 100644
--- a/src/java/org/apache/cassandra/db/view/TableViews.java
+++ b/src/java/org/apache/cassandra/db/view/TableViews.java
@@ -42,6 +42,8 @@
 import org.apache.cassandra.utils.btree.BTree;
 import org.apache.cassandra.utils.btree.BTreeSet;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 
 /**
  * Groups all the views for a given table.
@@ -103,10 +105,10 @@
         views.forEach(View::stopBuild);
     }
 
-    public void forceBlockingFlush()
+    public void forceBlockingFlush(ColumnFamilyStore.FlushReason reason)
     {
         for (ColumnFamilyStore viewCfs : allViewsCfs())
-            viewCfs.forceBlockingFlush();
+            viewCfs.forceBlockingFlush(reason);
     }
 
     public void dumpMemtables()
@@ -147,13 +149,13 @@
 
         // Read modified rows
         int nowInSec = FBUtilities.nowInSeconds();
-        long queryStartNanoTime = System.nanoTime();
+        long queryStartNanoTime = nanoTime();
         SinglePartitionReadCommand command = readExistingRowsCommand(update, views, nowInSec);
         if (command == null)
             return;
 
         ColumnFamilyStore cfs = Keyspace.openAndGetStore(update.metadata());
-        long start = System.nanoTime();
+        long start = nanoTime();
         Collection<Mutation> mutations;
         try (ReadExecutionController orderGroup = command.executionController();
              UnfilteredRowIterator existings = UnfilteredPartitionIterators.getOnlyElement(command.executeLocally(orderGroup), command);
@@ -161,7 +163,7 @@
         {
             mutations = Iterators.getOnlyElement(generateViewUpdates(views, updates, existings, nowInSec, false));
         }
-        Keyspace.openAndGetStore(update.metadata()).metric.viewReadTime.update(System.nanoTime() - start, TimeUnit.NANOSECONDS);
+        Keyspace.openAndGetStore(update.metadata()).metric.viewReadTime.update(nanoTime() - start, TimeUnit.NANOSECONDS);
 
         if (!mutations.isEmpty())
             StorageProxy.mutateMV(update.partitionKey().getKey(), mutations, writeCommitLog, baseComplete, queryStartNanoTime);
diff --git a/src/java/org/apache/cassandra/db/view/ViewBuilder.java b/src/java/org/apache/cassandra/db/view/ViewBuilder.java
index a88ffbe..daedf48 100644
--- a/src/java/org/apache/cassandra/db/view/ViewBuilder.java
+++ b/src/java/org/apache/cassandra/db/view/ViewBuilder.java
@@ -22,16 +22,12 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,10 +41,13 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.locator.Replicas;
-import org.apache.cassandra.repair.SystemDistributedKeyspace;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 
 import static java.util.stream.Collectors.toList;
 
@@ -73,7 +72,7 @@
     private final Set<ViewBuilderTask> tasks = Sets.newConcurrentHashSet();
     private volatile long keysBuilt = 0;
     private volatile boolean isStopped = false;
-    private volatile Future<?> future = Futures.immediateFuture(null);
+    private volatile Future<?> future = ImmediateFuture.success(null);
 
     ViewBuilder(ColumnFamilyStore baseCfs, View view)
     {
@@ -96,7 +95,7 @@
 
             logger.debug("Starting build of view({}.{}). Flushing base table {}.{}",
                          ksName, view.name, ksName, baseCfs.name);
-            baseCfs.forceBlockingFlush();
+            baseCfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.VIEW_BUILD_STARTED);
 
             loadStatusAndBuild();
         }
@@ -162,21 +161,21 @@
 
         // Submit a new view build task for each building range.
         // We keep record of all the submitted tasks to be able of stopping them.
-        List<ListenableFuture<Long>> futures = pendingRanges.entrySet()
-                                                            .stream()
-                                                            .map(e -> new ViewBuilderTask(baseCfs,
-                                                                                          view,
-                                                                                          e.getKey(),
-                                                                                          e.getValue().left,
-                                                                                          e.getValue().right))
-                                                            .peek(tasks::add)
-                                                            .map(CompactionManager.instance::submitViewBuilder)
-                                                            .collect(toList());
+        List<Future<Long>> futures = pendingRanges.entrySet()
+                                                  .stream()
+                                                  .map(e -> new ViewBuilderTask(baseCfs,
+                                                                                view,
+                                                                                e.getKey(),
+                                                                                e.getValue().left,
+                                                                                e.getValue().right))
+                                                  .peek(tasks::add)
+                                                  .map(CompactionManager.instance::submitViewBuilder)
+                                                  .collect(toList());
 
         // Add a callback to process any eventual new local range and mark the view as built, doing a delayed retry if
         // the tasks don't succeed
-        ListenableFuture<List<Long>> future = Futures.allAsList(futures);
-        Futures.addCallback(future, new FutureCallback<List<Long>>()
+        Future<List<Long>> future = FutureCombiner.allOf(futures);
+        future.addCallback(new FutureCallback<List<Long>>()
         {
             public void onSuccess(List<Long> result)
             {
@@ -200,7 +199,7 @@
                     logger.warn("Materialized View failed to complete, sleeping 5 minutes before restarting", t);
                 }
             }
-        }, MoreExecutors.directExecutor());
+        });
         this.future = future;
     }
 
@@ -228,10 +227,16 @@
     /**
      * Stops the view building.
      */
-    synchronized void stop()
+    void stop()
     {
-        boolean wasStopped = isStopped;
-        internalStop(false);
+        boolean wasStopped;
+        synchronized (this)
+        {
+            wasStopped = isStopped;
+            internalStop(false);
+        }
+        // TODO: very unclear what the goal is here. why do we wait only if we were the first to invoke stop?
+        // but we wait outside the synchronized block to avoid a deadlock with `build` in the future callback
         if (!wasStopped)
             FBUtilities.waitOnFuture(future);
     }
diff --git a/src/java/org/apache/cassandra/db/view/ViewBuilderTask.java b/src/java/org/apache/cassandra/db/view/ViewBuilderTask.java
index c84c697..dac96f6 100644
--- a/src/java/org/apache/cassandra/db/view/ViewBuilderTask.java
+++ b/src/java/org/apache/cassandra/db/view/ViewBuilderTask.java
@@ -21,7 +21,6 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Iterator;
-import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
@@ -29,10 +28,8 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
-import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.PeekingIterator;
-import com.google.common.util.concurrent.Futures;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -60,9 +57,12 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Refs;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class ViewBuilderTask extends CompactionInfo.Holder implements Callable<Long>
 {
     private static final Logger logger = LoggerFactory.getLogger(ViewBuilderTask.class);
@@ -72,7 +72,7 @@
     private final ColumnFamilyStore baseCfs;
     private final View view;
     private final Range<Token> range;
-    private final UUID compactionId;
+    private final TimeUUID compactionId;
     private volatile Token prevToken;
     private volatile long keysBuilt = 0;
     private volatile boolean isStopped = false;
@@ -84,7 +84,7 @@
         this.baseCfs = baseCfs;
         this.view = view;
         this.range = range;
-        this.compactionId = UUIDGen.getTimeUUID();
+        this.compactionId = nextTimeUUID();
         this.prevToken = lastToken;
         this.keysBuilt = keysBuilt;
     }
@@ -115,7 +115,7 @@
                                                        .generateViewUpdates(Collections.singleton(view), data, empty, nowInSec, true);
 
             AtomicLong noBase = new AtomicLong(Long.MAX_VALUE);
-            mutations.forEachRemaining(m -> StorageProxy.mutateMV(key.getKey(), m, true, noBase, System.nanoTime()));
+            mutations.forEachRemaining(m -> StorageProxy.mutateMV(key.getKey(), m, true, noBase, nanoTime()));
         }
     }
 
diff --git a/src/java/org/apache/cassandra/db/view/ViewManager.java b/src/java/org/apache/cassandra/db/view/ViewManager.java
index 7e3ea1b..111f96a 100644
--- a/src/java/org/apache/cassandra/db/view/ViewManager.java
+++ b/src/java/org/apache/cassandra/db/view/ViewManager.java
@@ -32,7 +32,7 @@
 import org.apache.cassandra.schema.ViewMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.partitions.*;
-import org.apache.cassandra.repair.SystemDistributedKeyspace;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.schema.Views;
 import org.apache.cassandra.service.StorageService;
 
diff --git a/src/java/org/apache/cassandra/db/view/ViewUtils.java b/src/java/org/apache/cassandra/db/view/ViewUtils.java
index b5aa063..55a462c 100644
--- a/src/java/org/apache/cassandra/db/view/ViewUtils.java
+++ b/src/java/org/apache/cassandra/db/view/ViewUtils.java
@@ -23,13 +23,11 @@
 
 import com.google.common.collect.Iterables;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.AbstractReplicationStrategy;
 import org.apache.cassandra.locator.EndpointsForToken;
 import org.apache.cassandra.locator.NetworkTopologyStrategy;
 import org.apache.cassandra.locator.Replica;
-import org.apache.cassandra.utils.FBUtilities;
 
 public final class ViewUtils
 {
diff --git a/src/java/org/apache/cassandra/db/virtual/AbstractMutableVirtualTable.java b/src/java/org/apache/cassandra/db/virtual/AbstractMutableVirtualTable.java
new file mode 100644
index 0000000..7044312
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/AbstractMutableVirtualTable.java
@@ -0,0 +1,398 @@
+/*
+ * 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.virtual;
+
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.Optional;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.BoundType;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Range;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.db.ClusteringBound;
+import org.apache.cassandra.db.ClusteringPrefix;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Slice;
+import org.apache.cassandra.db.marshal.CompositeType;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
+
+import static org.apache.cassandra.cql3.statements.RequestValidations.checkFalse;
+import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
+
+/**
+ * An abstract virtual table implementation that builds the resultset on demand and allows fine-grained source
+ * modification via INSERT/UPDATE, DELETE and TRUNCATE operations.
+ * 
+ * Virtual table implementation need to be thread-safe has they can be called from different threads.
+ */
+public abstract class AbstractMutableVirtualTable extends AbstractVirtualTable
+{
+
+    protected AbstractMutableVirtualTable(TableMetadata metadata)
+    {
+        super(metadata);
+    }
+
+    @Override
+    public final void apply(PartitionUpdate update)
+    {
+        ColumnValues partitionKey = ColumnValues.from(metadata(), update.partitionKey());
+
+        if (update.deletionInfo().isLive())
+            update.forEach(row ->
+            {
+                ColumnValues clusteringColumns = ColumnValues.from(metadata(), row.clustering());
+
+                if (row.deletion().isLive())
+                {
+                    if (row.columnCount() == 0)
+                    {
+                        applyColumnUpdate(partitionKey, clusteringColumns, Optional.empty());
+                    }
+                    else
+                    {
+                        row.forEach(columnData ->
+                        {
+                            checkFalse(columnData.column().isComplex(), "Complex type columns are not supported by table %s", metadata);
+
+                            Cell<?> cell = (Cell<?>) columnData;
+
+                            if (cell.isTombstone())
+                                applyColumnDeletion(partitionKey, clusteringColumns, columnName(cell));
+                            else
+                                applyColumnUpdate(partitionKey,
+                                        clusteringColumns,
+                                        Optional.of(ColumnValue.from(cell)));
+                        });
+                    }
+                }
+                else
+                    applyRowDeletion(partitionKey, clusteringColumns);
+            });
+        else
+        {
+            // MutableDeletionInfo may have partition delete or range tombstone list or both
+            if (update.deletionInfo().hasRanges())
+                update.deletionInfo()
+                        .rangeIterator(false)
+                        .forEachRemaining(rt -> applyRangeTombstone(partitionKey, toRange(rt.deletedSlice())));
+
+            if (!update.deletionInfo().getPartitionDeletion().isLive())
+                applyPartitionDeletion(partitionKey);
+        }
+    }
+
+    protected void applyPartitionDeletion(ColumnValues partitionKey)
+    {
+        throw invalidRequest("Partition deletion is not supported by table %s", metadata);
+    }
+
+    private Range<ColumnValues> toRange(Slice slice)
+    {
+        ClusteringBound<?> startBound = slice.start();
+        ClusteringBound<?> endBound = slice.end();
+
+        if (startBound.isBottom())
+        {
+            if (endBound.isTop())
+                return Range.all();
+
+            return Range.upTo(ColumnValues.from(metadata(), endBound), boundType(endBound));
+        }
+
+        if (endBound.isTop())
+            return Range.downTo(ColumnValues.from(metadata(), startBound), boundType(startBound));
+
+        ColumnValues start = ColumnValues.from(metadata(), startBound);
+        BoundType startType = boundType(startBound);
+
+        ColumnValues end = ColumnValues.from(metadata(), endBound);
+        BoundType endType = boundType(endBound);
+
+        return Range.range(start, startType, end, endType);
+    }
+
+    private static BoundType boundType(ClusteringBound<?> bound)
+    {
+        return bound.isInclusive() ? BoundType.CLOSED : BoundType.OPEN;
+    }
+
+    protected void applyRangeTombstone(ColumnValues partitionKey, Range<ColumnValues> range)
+    {
+        throw invalidRequest("Range deletion is not supported by table %s", metadata);
+    }
+
+    protected void applyRowDeletion(ColumnValues partitionKey, ColumnValues clusteringColumns)
+    {
+        throw invalidRequest("Row deletion is not supported by table %s", metadata);
+    }
+
+    protected void applyColumnDeletion(ColumnValues partitionKey, ColumnValues clusteringColumns, String columnName)
+    {
+        throw invalidRequest("Column deletion is not supported by table %s", metadata);
+    }
+
+    protected void applyColumnUpdate(ColumnValues partitionKey,
+                                     ColumnValues clusteringColumns,
+                                     Optional<ColumnValue> columnValue)
+    {
+        throw invalidRequest("Column modification is not supported by table %s", metadata);
+    }
+
+    private static String columnName(Cell<?> cell)
+    {
+        return cell.column().name.toCQLString();
+    }
+
+    /**
+     * A set of partition key or clustering column values.
+     */
+    public static final class ColumnValues implements Comparable<ColumnValues>
+    {
+        /**
+         * An empty set of column values.
+         */
+        private static final ColumnValues EMPTY = new ColumnValues(ImmutableList.of(), ArrayUtils.EMPTY_OBJECT_ARRAY);
+
+        /**
+         * The column metadata for the set of columns.
+         */
+        private final ImmutableList<ColumnMetadata> metadata;
+
+        /**
+         * The column values. The number of values can be smaller than the number of values if only
+         * a sub-set of the column values is specified (e.g. clustering prefix).
+         */
+        private final Object[] values;
+
+        /**
+         * Returns the set of column values corresponding to the specified partition key.
+         *
+         * @param metadata the table metadata
+         * @param partitionKey the partition key
+         * @return the set of columns values corresponding to the specified partition key
+         */
+        public static ColumnValues from(TableMetadata metadata, DecoratedKey partitionKey)
+        {
+            if (metadata.partitionKeyType instanceof CompositeType)
+            {
+                ByteBuffer[] buffers = ((CompositeType) metadata.partitionKeyType).split(partitionKey.getKey());
+                return ColumnValues.from(metadata.partitionKeyColumns(), buffers);
+            }
+
+            return ColumnValues.from(metadata.partitionKeyColumns(), partitionKey.getKey());
+        }
+
+        /**
+         * Returns the set of column values corresponding to the specified clustering prefix.
+         *
+         * @param metadata the table metadata
+         * @param prefix the clustering prefix
+         * @return the set of columns values corresponding to the specified clustering prefix
+         */
+        public static ColumnValues from(TableMetadata metadata, ClusteringPrefix<?> prefix)
+        {
+            if (prefix == Clustering.EMPTY)
+                return EMPTY;
+
+            return ColumnValues.from(metadata.clusteringColumns(), prefix.getBufferArray());
+        }
+
+        private static ColumnValues from(ImmutableList<ColumnMetadata> metadata, ByteBuffer... buffers)
+        {
+            return new ColumnValues(metadata, convert(metadata, buffers));
+        }
+
+        /**
+         * Create a {@code ColumnValues} for the specified set of columns.
+         *
+         * @param metadata the partition or clustering columns metadata
+         * @param values the partition or clustering column values
+         */
+        public ColumnValues(List<ColumnMetadata> metadata, Object... values)
+        {
+            this.metadata = ImmutableList.copyOf(metadata);
+            this.values = values;
+        }
+
+        /**
+         * Deserializes the column values.
+         *
+         * @param metadata the column metadata
+         * @param buffers the serialized column values
+         * @return the deserialized column values
+         */
+        private static Object[] convert(ImmutableList<ColumnMetadata> metadata, ByteBuffer[] buffers)
+        {
+            Object[] values = new Object[buffers.length];
+            for (int i = 0; i < buffers.length; i++)
+            {
+                values[i] = metadata.get(i).type.compose(buffers[i]);
+            }
+            return values;
+        }
+
+        /**
+         * Returns the name of the specified column
+         *
+         * @param i the column index
+         * @return the column name
+         */
+        public String name(int i)
+        {
+            Preconditions.checkPositionIndex(i, values.length);
+            return metadata.get(i).name.toCQLString();
+        }
+
+        /**
+         * Returns the value for the specified column
+         *
+         * @param i the column index
+         * @return the column value
+         */
+        @SuppressWarnings("unchecked")
+        public <V> V value(int i)
+        {
+            Preconditions.checkPositionIndex(i, values.length);
+            return (V) values[i];
+        }
+
+        /**
+         * Returns the number of column values.
+         *
+         * @return the number of column values.
+         */
+        public int size()
+        {
+            return values.length;
+        }
+
+        @Override
+        public String toString()
+        {
+            StringBuilder builder = new StringBuilder();
+            builder.append('[');
+            for (int i = 0, m = metadata.size(); i <m; i++)
+            {
+                if (i != 0)
+                    builder.append(", ");
+
+                builder.append(metadata.get(i).name.toCQLString())
+                       .append(" : ");
+
+                if (i < values.length)
+                       builder.append(i < values.length ? values[i].toString() : "unspecified");
+            }
+            return builder.append(']').toString();
+        }
+
+        @Override
+        public int compareTo(ColumnValues o)
+        {
+            assert metadata.equals(o.metadata);
+
+            int s1 = size();
+            int s2 = o.size();
+            int minSize = Math.min(s1, s2);
+
+            for (int i = 0; i < minSize; i++)
+            {
+                int cmp = compare(values[i], o.values[i]);
+                if (cmp != 0)
+                    return cmp;
+            }
+
+            return 0;
+        }
+
+        @SuppressWarnings("unchecked")
+        private <T extends Comparable<T>> int compare(Object c1, Object c2)
+        {
+            return ((T) c1).compareTo((T) c2);
+        }
+    }
+
+    /**
+     * A regular column value.
+     */
+    public static final class ColumnValue
+    {
+        /**
+         * The column metadata
+         */
+        private final ColumnMetadata metadata;
+
+        /**
+         * The column value
+         */
+        private final Object value;
+
+        /**
+         * Returns the column value corresponding to the specified cell.
+         *
+         * @param cell the column cell metadata
+         * @return the column value corresponding to the specified cell
+         */
+        public static ColumnValue from(Cell<?> cell)
+        {
+            ColumnMetadata metadata = cell.column();
+            return new ColumnValue(metadata, metadata.type.compose(cell.buffer()));
+        }
+
+        private ColumnValue(ColumnMetadata metadata, Object value)
+        {
+            this.metadata = metadata;
+            this.value = value;
+        }
+
+        /**
+         * Returns the column name.
+         *
+         * @return the column name
+         */
+        public String name()
+        {
+            return metadata.name.toCQLString();
+        }
+
+        /**
+         * Returns the column value.
+         *
+         * @return the column value
+         */
+        @SuppressWarnings("unchecked")
+        public <V> V value()
+        {
+            return (V) value;
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("%s : %s", name(), value());
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/AbstractVirtualTable.java b/src/java/org/apache/cassandra/db/virtual/AbstractVirtualTable.java
index c2de1db..cf90c42 100644
--- a/src/java/org/apache/cassandra/db/virtual/AbstractVirtualTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/AbstractVirtualTable.java
@@ -38,6 +38,8 @@
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.schema.TableMetadata;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * An abstract virtual table implementation that builds the resultset on demand.
  */
@@ -48,7 +50,7 @@
     protected AbstractVirtualTable(TableMetadata metadata)
     {
         if (!metadata.isVirtual())
-            throw new IllegalArgumentException();
+            throw new IllegalArgumentException("Cannot instantiate a non-virtual table");
 
         this.metadata = metadata;
     }
@@ -81,7 +83,7 @@
         if (null == partition)
             return EmptyIterators.unfilteredPartition(metadata);
 
-        long now = System.currentTimeMillis();
+        long now = currentTimeMillis();
         UnfilteredRowIterator rowIterator = partition.toRowIterator(metadata(), clusteringIndexFilter, columnFilter, now);
         return new SingletonUnfilteredPartitionIterator(rowIterator);
     }
@@ -96,7 +98,7 @@
 
         Iterator<Partition> iterator = data.getPartitions(dataRange);
 
-        long now = System.currentTimeMillis();
+        long now = currentTimeMillis();
 
         return new AbstractUnfilteredPartitionIterator()
         {
@@ -127,6 +129,18 @@
         throw new InvalidRequestException("Modification is not supported by table " + metadata);
     }
 
+    @Override
+    public void truncate()
+    {
+        throw new InvalidRequestException("Truncation is not supported by table " + metadata);
+    }
+
+    @Override
+    public String toString()
+    {
+        return metadata().toString();
+    }
+
     public interface DataSet
     {
         boolean isEmpty();
diff --git a/src/java/org/apache/cassandra/db/virtual/BatchMetricsTable.java b/src/java/org/apache/cassandra/db/virtual/BatchMetricsTable.java
new file mode 100644
index 0000000..948f2a1
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/BatchMetricsTable.java
@@ -0,0 +1,75 @@
+/*
+ * 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.virtual;
+
+import com.codahale.metrics.Snapshot;
+import org.apache.cassandra.cql3.statements.BatchStatement;
+import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.LongType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.metrics.BatchMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+
+public class BatchMetricsTable extends AbstractVirtualTable
+{
+
+    private static final String PARTITIONS_PER_LOGGED_BATCH = "partitions_per_logged_batch";
+    private static final String PARTITIONS_PER_UNLOGGED_BATCH = "partitions_per_unlogged_batch";
+    private static final String PARTITIONS_PER_COUNTER_BATCH = "partitions_per_counter_batch";
+    private final static String P50 = "p50th";
+    private final static String P99 = "p99th";
+    private final static String P999 = "p999th";
+    private final static String MAX = "max";
+
+    BatchMetricsTable(String keyspace)
+    {
+        super(TableMetadata.builder(keyspace, "batch_metrics")
+                           .comment("Metrics specific to batch statements")
+                           .kind(TableMetadata.Kind.VIRTUAL)
+                           .partitioner(new LocalPartitioner(UTF8Type.instance))
+                           .addPartitionKeyColumn("name", UTF8Type.instance)
+                           .addRegularColumn(P50, DoubleType.instance)
+                           .addRegularColumn(P99, DoubleType.instance)
+                           .addRegularColumn(P999, DoubleType.instance)
+                           .addRegularColumn(MAX, LongType.instance)
+                           .build());
+    }
+
+    @Override
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+        BatchMetrics metrics = BatchStatement.metrics;
+        addRow(result, PARTITIONS_PER_LOGGED_BATCH, metrics.partitionsPerLoggedBatch.getSnapshot());
+        addRow(result, PARTITIONS_PER_UNLOGGED_BATCH, metrics.partitionsPerUnloggedBatch.getSnapshot());
+        addRow(result, PARTITIONS_PER_COUNTER_BATCH, metrics.partitionsPerCounterBatch.getSnapshot());
+
+        return result;
+    }
+
+    private void addRow(SimpleDataSet dataSet, String name, Snapshot snapshot)
+    {
+        dataSet.row(name)
+               .column(P50, snapshot.getMedian())
+               .column(P99, snapshot.get99thPercentile())
+               .column(P999, snapshot.get999thPercentile())
+               .column(MAX, snapshot.getMax());
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/CQLMetricsTable.java b/src/java/org/apache/cassandra/db/virtual/CQLMetricsTable.java
new file mode 100644
index 0000000..acd8947
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/CQLMetricsTable.java
@@ -0,0 +1,81 @@
+/*
+ * 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.virtual;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.metrics.CQLMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.cql3.QueryProcessor;
+
+
+final class CQLMetricsTable extends AbstractVirtualTable
+{
+    public static final String TABLE_NAME = "cql_metrics";
+    public static final String PREPARED_STATEMENTS_COUNT = "prepared_statements_count";
+    public static final String PREPARED_STATEMENTS_EVICTED = "prepared_statements_evicted";
+    public static final String PREPARED_STATEMENTS_EXECUTED = "prepared_statements_executed";
+    public static final String PREPARED_STATEMENTS_RATIO = "prepared_statements_ratio";
+    public static final String REGULAR_STATEMENTS_EXECUTED = "regular_statements_executed";
+    public static final String NAME_COL = "name";
+    public static final String VALUE_COL = "value";
+
+    private final CQLMetrics cqlMetrics;
+
+    CQLMetricsTable(String keyspace)
+    {
+        this(keyspace, QueryProcessor.metrics);
+    }
+
+    // For dependency injection
+    @VisibleForTesting
+    CQLMetricsTable(String keyspace, CQLMetrics cqlMetrics)
+    {
+        super(TableMetadata.builder(keyspace, TABLE_NAME)
+                           .comment("Metrics specific to CQL prepared statement caching")
+                           .kind(TableMetadata.Kind.VIRTUAL)
+                           .partitioner(new LocalPartitioner(UTF8Type.instance))
+                           .addPartitionKeyColumn(NAME_COL, UTF8Type.instance)
+                           .addRegularColumn(VALUE_COL, DoubleType.instance)
+                           .build());
+        this.cqlMetrics = cqlMetrics;
+    }
+
+    @Override
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+        addRow(result, PREPARED_STATEMENTS_COUNT, cqlMetrics.preparedStatementsCount.getValue());
+        addRow(result, PREPARED_STATEMENTS_EVICTED, cqlMetrics.preparedStatementsEvicted.getCount());
+        addRow(result, PREPARED_STATEMENTS_EXECUTED, cqlMetrics.preparedStatementsExecuted.getCount());
+        addRow(result, PREPARED_STATEMENTS_RATIO, cqlMetrics.preparedStatementsRatio.getValue());
+        addRow(result, REGULAR_STATEMENTS_EXECUTED, cqlMetrics.regularStatementsExecuted.getCount());
+
+        return result;
+    }
+
+    private void addRow(SimpleDataSet dataSet, String name, double value)
+    {
+        dataSet.row(name)
+               .column(VALUE_COL, value);
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/ClientsTable.java b/src/java/org/apache/cassandra/db/virtual/ClientsTable.java
index 40e175b..d39c269 100644
--- a/src/java/org/apache/cassandra/db/virtual/ClientsTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/ClientsTable.java
@@ -33,6 +33,7 @@
     private static final String USERNAME = "username";
     private static final String CONNECTION_STAGE = "connection_stage";
     private static final String PROTOCOL_VERSION = "protocol_version";
+    private static final String CLIENT_OPTIONS = "client_options";
     private static final String DRIVER_NAME = "driver_name";
     private static final String DRIVER_VERSION = "driver_version";
     private static final String REQUEST_COUNT = "request_count";
@@ -52,6 +53,7 @@
                            .addRegularColumn(USERNAME, UTF8Type.instance)
                            .addRegularColumn(CONNECTION_STAGE, UTF8Type.instance)
                            .addRegularColumn(PROTOCOL_VERSION, Int32Type.instance)
+                           .addRegularColumn(CLIENT_OPTIONS, MapType.getInstance(UTF8Type.instance, UTF8Type.instance, false))
                            .addRegularColumn(DRIVER_NAME, UTF8Type.instance)
                            .addRegularColumn(DRIVER_VERSION, UTF8Type.instance)
                            .addRegularColumn(REQUEST_COUNT, LongType.instance)
@@ -75,6 +77,7 @@
                   .column(USERNAME, client.username().orElse(null))
                   .column(CONNECTION_STAGE, client.stage().toString().toLowerCase())
                   .column(PROTOCOL_VERSION, client.protocolVersion())
+                  .column(CLIENT_OPTIONS, client.clientOptions().orElse(null))
                   .column(DRIVER_NAME, client.driverName().orElse(null))
                   .column(DRIVER_VERSION, client.driverVersion().orElse(null))
                   .column(REQUEST_COUNT, client.requestCount())
diff --git a/src/java/org/apache/cassandra/db/virtual/CredentialsCacheKeysTable.java b/src/java/org/apache/cassandra/db/virtual/CredentialsCacheKeysTable.java
new file mode 100644
index 0000000..f5bc62c
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/CredentialsCacheKeysTable.java
@@ -0,0 +1,78 @@
+/*
+ * 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.virtual;
+
+import java.util.Optional;
+
+import org.apache.cassandra.auth.IAuthenticator;
+import org.apache.cassandra.auth.PasswordAuthenticator;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.schema.TableMetadata;
+
+final class CredentialsCacheKeysTable extends AbstractMutableVirtualTable
+{
+    private static final String ROLE = "role";
+
+    @SuppressWarnings("OptionalUsedAsFieldOrParameterType")
+    private final Optional<PasswordAuthenticator> passwordAuthenticatorOptional;
+
+    CredentialsCacheKeysTable(String keyspace)
+    {
+        super(TableMetadata.builder(keyspace, "credentials_cache_keys")
+                .comment("keys in the credentials cache")
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .partitioner(new LocalPartitioner(UTF8Type.instance))
+                .addPartitionKeyColumn(ROLE, UTF8Type.instance)
+                .build());
+
+        IAuthenticator authenticator = DatabaseDescriptor.getAuthenticator();
+        if (authenticator instanceof PasswordAuthenticator)
+            this.passwordAuthenticatorOptional = Optional.of((PasswordAuthenticator) authenticator);
+        else
+            this.passwordAuthenticatorOptional = Optional.empty();
+    }
+
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+
+        passwordAuthenticatorOptional
+                .ifPresent(passwordAuthenticator -> passwordAuthenticator.getCredentialsCache().getAll()
+                        .forEach((roleName, ignored) -> result.row(roleName)));
+
+        return result;
+    }
+
+    @Override
+    protected void applyPartitionDeletion(ColumnValues partitionKey)
+    {
+        String roleName = partitionKey.value(0);
+
+        passwordAuthenticatorOptional
+                .ifPresent(passwordAuthenticator -> passwordAuthenticator.getCredentialsCache().invalidate(roleName));
+    }
+
+    @Override
+    public void truncate()
+    {
+        passwordAuthenticatorOptional
+                .ifPresent(passwordAuthenticator -> passwordAuthenticator.getCredentialsCache().invalidate());
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/GossipInfoTable.java b/src/java/org/apache/cassandra/db/virtual/GossipInfoTable.java
new file mode 100644
index 0000000..bd612c6
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/GossipInfoTable.java
@@ -0,0 +1,188 @@
+/*
+ * 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.virtual;
+
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.function.Supplier;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.apache.cassandra.db.marshal.InetAddressType;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.TableMetadata;
+
+import static org.apache.cassandra.gms.ApplicationState.TOKENS;
+
+/**
+ * A {@link VirtualTable} that return the Gossip information in tabular format.
+ */
+final class GossipInfoTable extends AbstractVirtualTable
+{
+    static final String TABLE_NAME = "gossip_info";
+    static final String TABLE_COMMENT = "lists the gossip information for the cluster";
+
+    static final String ADDRESS = "address";
+    static final String PORT = "port";
+    static final String HOSTNAME = "hostname";
+    static final String GENERATION = "generation";
+    static final String HEARTBEAT = "heartbeat";
+
+    static final ApplicationState[] STATES_FOR_VERSIONS = ApplicationState.values();
+    static final ApplicationState[] STATES_FOR_VALUES;
+
+    static
+    {
+        EnumSet<ApplicationState> applicationStates = EnumSet.allOf(ApplicationState.class);
+        // do not add a column for the ApplicationState.TOKENS value
+        applicationStates.remove(TOKENS);
+        STATES_FOR_VALUES = applicationStates.toArray(new ApplicationState[0]);
+    }
+
+    private final Supplier<Map<InetAddressAndPort, EndpointState>> endpointStateMapSupplier;
+
+    /**
+     * Construct a new {@link GossipInfoTable} for the given {@code keyspace}.
+     *
+     * @param keyspace the name of the keyspace
+     */
+    GossipInfoTable(String keyspace)
+    {
+        this(keyspace, () -> Gossiper.instance.endpointStateMap);
+    }
+
+    @VisibleForTesting
+    GossipInfoTable(String keyspace, Supplier<Map<InetAddressAndPort, EndpointState>> endpointStateMapSupplier)
+    {
+        super(buildTableMetadata(keyspace));
+        this.endpointStateMapSupplier = endpointStateMapSupplier;
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+        for (Map.Entry<InetAddressAndPort, EndpointState> entry : endpointStateMapSupplier.get().entrySet())
+        {
+            InetAddressAndPort endpoint = entry.getKey();
+            // we are making a copy of endpoint state as a value of an entry of the returned map
+            // might be updated on the fly by LoadBroadcaster, and we want to be sure that
+            // the returned data are capturing a particular point in time
+            EndpointState localState = new EndpointState(entry.getValue());
+
+            SimpleDataSet dataSet = result.row(endpoint.getAddress(), endpoint.getPort())
+                                          .column(HOSTNAME, endpoint.getHostName())
+                                          .column(GENERATION, getGeneration(localState))
+                                          .column(HEARTBEAT, getHeartBeat(localState));
+
+            for (ApplicationState state : STATES_FOR_VALUES)
+                dataSet.column(state.name().toLowerCase(), getValue(localState, state));
+
+            for (ApplicationState state : STATES_FOR_VERSIONS)
+                dataSet.column(state.name().toLowerCase() + "_version", getVersion(localState, state));
+        }
+        return result;
+    }
+
+    /**
+     * Return the heartbeat generation of a given {@link EndpointState} or null if {@code localState} is null.
+     *
+     * @param localState a nullable endpoint state
+     * @return the heartbeat generation if available, null otherwise
+     */
+    private Integer getGeneration(EndpointState localState)
+    {
+        return localState == null ? null : localState.getHeartBeatState().getGeneration();
+    }
+
+    /**
+     * Return the heartbeat version of a given {@link EndpointState} or null if {@code localState} is null.
+     *
+     * @param localState a nullable endpoint state
+     * @return the heartbeat version if available, null otherwise
+     */
+    private Integer getHeartBeat(EndpointState localState)
+    {
+        return localState == null ? null : localState.getHeartBeatState().getHeartBeatVersion();
+    }
+
+    /**
+     * Returns the value from the {@link VersionedValue} of a given {@link ApplicationState key}, or null
+     * if {@code localState} is null or the {@link VersionedValue} does not exist in the {@link ApplicationState}.
+     *
+     * @param localState a nullable endpoint state
+     * @param key        the key to the application state
+     * @return the value, or null if not available
+     */
+    private String getValue(EndpointState localState, ApplicationState key)
+    {
+        VersionedValue value;
+        return localState == null || (value = localState.getApplicationState(key)) == null ? null : value.value;
+    }
+
+    /**
+     * Returns the version from the {@link VersionedValue} of a given {@link ApplicationState key}, or null
+     * if {@code localState} is null or the {@link VersionedValue} does not exist in the {@link ApplicationState}.
+     *
+     * @param localState a nullable endpoint state
+     * @param key        the key to the application state
+     * @return the version, or null if not available
+     */
+    private Integer getVersion(EndpointState localState, ApplicationState key)
+    {
+        VersionedValue value;
+        return localState == null || (value = localState.getApplicationState(key)) == null ? null : value.version;
+    }
+
+    /**
+     * Builds the {@link TableMetadata} to be provided to the superclass
+     *
+     * @param keyspace the name of the keyspace
+     * @return the TableMetadata class
+     */
+    private static TableMetadata buildTableMetadata(String keyspace)
+    {
+        TableMetadata.Builder builder = TableMetadata.builder(keyspace, TABLE_NAME)
+                                                     .comment(TABLE_COMMENT)
+                                                     .kind(TableMetadata.Kind.VIRTUAL)
+                                                     .partitioner(new LocalPartitioner(InetAddressType.instance))
+                                                     .addPartitionKeyColumn(ADDRESS, InetAddressType.instance)
+                                                     .addClusteringColumn(PORT, Int32Type.instance)
+                                                     .addRegularColumn(HOSTNAME, UTF8Type.instance)
+                                                     .addRegularColumn(GENERATION, Int32Type.instance)
+                                                     .addRegularColumn(HEARTBEAT, Int32Type.instance);
+
+        for (ApplicationState state : STATES_FOR_VALUES)
+            builder.addRegularColumn(state.name().toLowerCase(), UTF8Type.instance);
+
+        for (ApplicationState state : STATES_FOR_VERSIONS)
+            builder.addRegularColumn(state.name().toLowerCase() + "_version", Int32Type.instance);
+
+        return builder.build();
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/InternodeInboundTable.java b/src/java/org/apache/cassandra/db/virtual/InternodeInboundTable.java
index b0afe8f..0da5870 100644
--- a/src/java/org/apache/cassandra/db/virtual/InternodeInboundTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/InternodeInboundTable.java
@@ -114,7 +114,7 @@
     {
         String dc = DatabaseDescriptor.getEndpointSnitch().getDatacenter(addressAndPort);
         String rack = DatabaseDescriptor.getEndpointSnitch().getRack(addressAndPort);
-        dataSet.row(addressAndPort.address, addressAndPort.port, dc, rack)
+        dataSet.row(addressAndPort.getAddress(), addressAndPort.getPort(), dc, rack)
                .column(USING_BYTES, handlers.usingCapacity())
                .column(USING_RESERVE_BYTES, handlers.usingEndpointReserveCapacity())
                .column(CORRUPT_FRAMES_RECOVERED, handlers.corruptFramesRecovered())
diff --git a/src/java/org/apache/cassandra/db/virtual/InternodeOutboundTable.java b/src/java/org/apache/cassandra/db/virtual/InternodeOutboundTable.java
index 87b3823..687f845 100644
--- a/src/java/org/apache/cassandra/db/virtual/InternodeOutboundTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/InternodeOutboundTable.java
@@ -115,7 +115,7 @@
         String dc = DatabaseDescriptor.getEndpointSnitch().getDatacenter(addressAndPort);
         String rack = DatabaseDescriptor.getEndpointSnitch().getRack(addressAndPort);
         long pendingBytes = sum(connections, OutboundConnection::pendingBytes);
-        dataSet.row(addressAndPort.address, addressAndPort.port, dc, rack)
+        dataSet.row(addressAndPort.getAddress(), addressAndPort.getPort(), dc, rack)
                .column(USING_BYTES, pendingBytes)
                .column(USING_RESERVE_BYTES, connections.usingReserveBytes())
                .column(PENDING_COUNT, sum(connections, OutboundConnection::pendingCount))
diff --git a/src/java/org/apache/cassandra/db/virtual/JmxPermissionsCacheKeysTable.java b/src/java/org/apache/cassandra/db/virtual/JmxPermissionsCacheKeysTable.java
new file mode 100644
index 0000000..b048b92
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/JmxPermissionsCacheKeysTable.java
@@ -0,0 +1,63 @@
+/*
+ * 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.virtual;
+
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.auth.jmx.AuthorizationProxy;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.schema.TableMetadata;
+
+final class JmxPermissionsCacheKeysTable extends AbstractMutableVirtualTable
+{
+    private static final String ROLE = "role";
+
+    JmxPermissionsCacheKeysTable(String keyspace)
+    {
+        super(TableMetadata.builder(keyspace, "jmx_permissions_cache_keys")
+                .comment("keys in the JMX permissions cache")
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .partitioner(new LocalPartitioner(UTF8Type.instance))
+                .addPartitionKeyColumn(ROLE, UTF8Type.instance)
+                .build());
+    }
+
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+
+        AuthorizationProxy.jmxPermissionsCache.getAll()
+                .forEach((roleResource, ignored) -> result.row(roleResource.getRoleName()));
+
+        return result;
+    }
+
+    @Override
+    protected void applyPartitionDeletion(ColumnValues partitionKey)
+    {
+        RoleResource roleResource = RoleResource.role(partitionKey.value(0));
+
+        AuthorizationProxy.jmxPermissionsCache.invalidate(roleResource);
+    }
+
+    @Override
+    public void truncate()
+    {
+        AuthorizationProxy.jmxPermissionsCache.invalidate();
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/LocalRepairTables.java b/src/java/org/apache/cassandra/db/virtual/LocalRepairTables.java
new file mode 100644
index 0000000..1f440ab
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/LocalRepairTables.java
@@ -0,0 +1,496 @@
+/*
+ * 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.virtual;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.db.marshal.UUIDType;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.CommonRange;
+import org.apache.cassandra.repair.RepairJobDesc;
+import org.apache.cassandra.repair.state.Completable;
+import org.apache.cassandra.repair.state.CoordinatorState;
+import org.apache.cassandra.repair.state.JobState;
+import org.apache.cassandra.repair.state.ParticipateState;
+import org.apache.cassandra.repair.state.SessionState;
+import org.apache.cassandra.repair.state.State;
+import org.apache.cassandra.repair.state.ValidationState;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
+
+public class LocalRepairTables
+{
+    private LocalRepairTables()
+    {
+    }
+
+    public static Collection<VirtualTable> getAll(String keyspace)
+    {
+        return Arrays.asList(
+        new RepairTable(keyspace),
+        new SessionTable(keyspace),
+        new JobTable(keyspace),
+        new ParticipateTable(keyspace),
+        new ValidationTable(keyspace)
+        );
+    }
+
+    private static final String JOB_DESC_COLUMNS = "  repair_id timeuuid,\n" +
+                                                   "  session_id timeuuid,\n" +
+                                                   "  keyspace_name text,\n" +
+                                                   "  table_name text,\n" +
+                                                   "  ranges frozen<list<text>>,\n";
+
+    static final class RepairTable extends AbstractVirtualTable
+    {
+        protected RepairTable(String keyspace)
+        {
+            super(parse(keyspace, "Repair summary",
+                        "CREATE TABLE repairs (\n" +
+                        stdColumnsWithStatus(true) +
+                        "  command_id int,\n" +
+                        "  keyspace_name text,\n" +
+                        // human readable definition of what the repair is doing
+                        "  type text,\n" +
+                        // list of all sessions; this is lazy so only once the session is created will it be present, so this dynamically changes within the life of a repair
+                        "  sessions frozen<set<timeuuid>>,\n" +
+
+                        // options_ maps to RepairOption
+                        "  options_parallelism text,\n" +
+                        "  options_primary_range boolean,\n" +
+                        "  options_incremental boolean,\n" +
+                        "  options_trace boolean,\n" +
+                        "  options_job_threads int,\n" +
+                        "  options_subrange_repair boolean,\n" +
+                        "  options_pull_repair boolean,\n" +
+                        "  options_force_repair boolean,\n" +
+                        "  options_preview_kind text,\n" +
+                        "  options_optimise_streams boolean,\n" +
+                        "  options_ignore_unreplicated_keyspaces boolean,\n" +
+                        "  options_column_families frozen<set<text>>,\n" +
+                        "  options_data_centers frozen<set<text>>,\n" +
+                        "  options_hosts frozen<set<text>>,\n" +
+                        "  options_ranges frozen<set<text>>,\n" +
+
+                        "  table_names frozen<list<text>>,\n" +
+                        "  ranges frozen<list<list<text>>>,\n" +
+                        "  unfiltered_ranges frozen<list<list<text>>>,\n" +
+                        "  participants frozen<list<text>>,\n" +
+                        stateColumns(CoordinatorState.State.class) +
+                        "\n" +
+                        "  PRIMARY KEY ( (id) )\n" +
+                        ")"));
+        }
+
+        public DataSet data()
+        {
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            ActiveRepairService.instance.coordinators().forEach(s -> updateDataset(result, s));
+            return result;
+        }
+
+        public DataSet data(DecoratedKey partitionKey)
+        {
+            TimeUUID id = TimeUUIDType.instance.compose(partitionKey.getKey());
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            CoordinatorState state = ActiveRepairService.instance.coordinator(id);
+            if (state != null)
+                updateDataset(result, state);
+            return result;
+        }
+
+        private void updateDataset(SimpleDataSet result, CoordinatorState state)
+        {
+            result.row(state.id);
+            addState(result, state);
+            result.column("type", getType(state));
+            result.column("keyspace_name", state.keyspace);
+            result.column("command_id", state.cmd);
+
+            result.column("options_parallelism", state.options.getParallelism().name());
+            result.column("options_primary_range", state.options.isPrimaryRange());
+            result.column("options_trace", state.options.isTraced());
+            result.column("options_job_threads", state.options.getJobThreads());
+            result.column("options_subrange_repair", state.options.isSubrangeRepair());
+            result.column("options_pull_repair", state.options.isPullRepair());
+            result.column("options_force_repair", state.options.isForcedRepair());
+            result.column("options_preview_kind", state.options.getPreviewKind().name());
+            result.column("options_optimise_streams", state.options.optimiseStreams());
+            result.column("options_ignore_unreplicated_keyspaces", state.options.ignoreUnreplicatedKeyspaces());
+            result.column("options_column_families", state.options.getColumnFamilies());
+            result.column("options_data_centers", state.options.getDataCenters());
+            result.column("options_hosts", state.options.getHosts());
+            result.column("options_ranges", toStringSet(state.options.getRanges()));
+
+            result.column("sessions", state.getSessionIds());
+
+            String[] columnFamilyNames = state.getColumnFamilyNames();
+            result.column("table_names", columnFamilyNames == null ? null : Arrays.asList(columnFamilyNames));
+
+            Set<InetAddressAndPort> participants = state.getParticipants();
+            result.column("participants", participants == null ? null : toStringList(participants));
+
+            List<CommonRange> ranges = state.getFilteredCommonRanges();
+            result.column("ranges", ranges == null ? null : ranges.stream().map(c -> c.ranges).map(LocalRepairTables::toStringList).collect(Collectors.toList()));
+
+            ranges = state.getCommonRanges();
+            result.column("unfiltered_ranges", ranges == null ? null : ranges.stream().map(c -> c.ranges).map(LocalRepairTables::toStringList).collect(Collectors.toList()));
+        }
+
+        private String getType(CoordinatorState state)
+        {
+            if (state.options.isPreview())
+            {
+                switch (state.options.getPreviewKind())
+                {
+                    case ALL: return "preview full";
+                    case REPAIRED: return "preview repaired";
+                    case UNREPAIRED: return "preview unrepaired";
+                    case NONE: throw new AssertionError("NONE preview kind not expected when preview repair is set");
+                    default: throw new AssertionError("Unknown preview kind: " + state.options.getPreviewKind());
+                }
+            }
+            else if (state.options.isIncremental())
+            {
+                return "incremental";
+            }
+            return "full";
+        }
+    }
+
+    private static final class SessionTable extends AbstractVirtualTable
+    {
+        SessionTable(String keyspace)
+        {
+            super(parse(keyspace, "Repair session",
+                        "CREATE TABLE repair_sessions (\n" +
+                        stdColumnsWithStatus(true) +
+                        "  repair_id timeuuid,\n" +
+                        "  keyspace_name text,\n" +
+                        "  table_names frozen<list<text>>,\n" +
+                        "  ranges frozen<list<text>>,\n" +
+                        "  participants frozen<list<text>>,\n" +
+                        "  jobs frozen<set<uuid>>,\n" +
+                        "\n" +
+                        stateColumns(SessionState.State.class) +
+                        "\n" +
+                        "  PRIMARY KEY ( (id) )\n" +
+                        ")"));
+        }
+
+        @Override
+        public DataSet data()
+        {
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            ActiveRepairService.instance.coordinators().stream()
+                                                .flatMap(s -> s.getSessions().stream())
+                                                .forEach(s -> updateDataset(result, s));
+            return result;
+        }
+
+        private void updateDataset(SimpleDataSet result, SessionState state)
+        {
+            result.row(state.id);
+            addState(result, state);
+            result.column("repair_id", state.parentRepairSession);
+            result.column("keyspace_name", state.keyspace);
+            result.column("table_names", Arrays.asList(state.cfnames));
+            result.column("ranges", toStringList(state.commonRange.ranges));
+            result.column("jobs", state.getJobIds());
+            result.column("participants", toStringList(state.getParticipants()));
+        }
+    }
+
+    private static final class JobTable extends AbstractVirtualTable
+    {
+        JobTable(String keyspace)
+        {
+            super(parse(keyspace, "Repair job",
+                        "CREATE TABLE repair_jobs (\n" +
+                        stdColumnsWithStatus(false) +
+                        "  participants frozen<list<text>>,\n" +
+                        JOB_DESC_COLUMNS +
+                        "\n" +
+                        stateColumns(JobState.State.class) +
+                        "\n" +
+                        "  PRIMARY KEY ( (id) )\n" +
+                        ")"));
+        }
+
+        @Override
+        public DataSet data()
+        {
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            ActiveRepairService.instance.coordinators().stream()
+                                                .flatMap(s -> s.getSessions().stream())
+                                                .flatMap(s -> s.getJobs().stream())
+                                                .forEach(s -> updateDataset(result, s));
+            return result;
+        }
+
+        private void updateDataset(SimpleDataSet result, JobState state)
+        {
+            result.row(state.id);
+            addState(result, state);
+            addState(result, state.desc);
+            result.column("participants", toStringList(state.getParticipants()));
+        }
+    }
+
+    static final class ParticipateTable extends AbstractVirtualTable
+    {
+        protected ParticipateTable(String keyspace)
+        {
+            super(parse(keyspace, "Repair participate summary",
+                        "CREATE TABLE repair_participates (" +
+                        stdColumns(true) +
+                        "  initiator  text,\n" +
+                        "  tables frozen<set<text>>, \n" +
+                        "  ranges frozen<list<text>>,\n" +
+                        "  incremental boolean,\n" +
+                        "  global boolean,\n" +
+                        "  preview_kind text,\n" +
+                        "  repaired_at timestamp,\n" +
+                        "  validations frozen<set<uuid>>,\n" +
+                        "\n" +
+                        "  PRIMARY KEY ( (id) )\n" +
+                        ")"));
+        }
+
+        @Override
+        public DataSet data()
+        {
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            ActiveRepairService.instance.participates().stream()
+                                        .forEach(s -> updateDataset(result, s));
+            return result;
+        }
+
+        @Override
+        public DataSet data(DecoratedKey partitionKey)
+        {
+            TimeUUID id = TimeUUIDType.instance.compose(partitionKey.getKey());
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            ParticipateState state = ActiveRepairService.instance.participate(id);
+            if (state != null)
+                updateDataset(result, state);
+            return result;
+        }
+
+        private void updateDataset(SimpleDataSet result, ParticipateState state)
+        {
+            result.row(state.id);
+            addCompletableState(result, state);
+            result.column("initiator", state.initiator.toString());
+            result.column("tables", state.tableIds.stream()
+                                                  .map(Schema.instance::getTableMetadata)
+                                                  .filter(a -> a != null) // getTableMetadata returns null if id isn't know, most likely dropped
+                                                  .map(Object::toString)
+                                                  .collect(Collectors.toSet()));
+            result.column("incremental", state.incremental);
+            result.column("global", state.global);
+            result.column("preview_kind", state.previewKind.name());
+            if (state.repairedAt != 0)
+                result.column("repaired_at", new Date(state.repairedAt));
+            result.column("validations", state.validationIds());
+            result.column("ranges", toStringList(state.ranges));
+        }
+    }
+
+    private static final class ValidationTable extends AbstractVirtualTable
+    {
+        ValidationTable(String keyspace)
+        {
+            super(parse(keyspace, "Repair validation",
+                        "CREATE TABLE repair_validations (\n" +
+                        stdColumnsWithStatus(false) +
+                        JOB_DESC_COLUMNS +
+                        "  initiator  text,\n" +
+                        "  estimated_partitions  bigint,\n" +
+                        "  estimated_total_bytes  bigint,\n" +
+                        "  partitions_processed  bigint,\n" +
+                        "  bytes_read  bigint,\n" +
+                        "  progress_percentage float,\n" +
+                        "\n" +
+                        stateColumns(ValidationState.State.class) +
+                        "\n" +
+                        "  PRIMARY KEY ( (id) )\n" +
+                        ")"));
+        }
+
+        @Override
+        public DataSet data()
+        {
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            ActiveRepairService.instance.validations().stream()
+                                                     .forEach(s -> updateDataset(result, s));
+            return result;
+        }
+
+        @Override
+        public DataSet data(DecoratedKey partitionKey)
+        {
+            UUID id = UUIDType.instance.compose(partitionKey.getKey());
+            SimpleDataSet result = new SimpleDataSet(metadata());
+            ValidationState state = ActiveRepairService.instance.validation(id);
+            if (state != null)
+                updateDataset(result, state);
+            return result;
+        }
+
+        private void updateDataset(SimpleDataSet result, ValidationState state)
+        {
+            result.row(state.id);
+            addState(result, state);
+            addState(result, state.desc);
+            result.column("initiator", state.initiator.toString());
+            result.column("estimated_partitions", state.estimatedPartitions == 0 ? null : state.estimatedPartitions);
+            result.column("estimated_total_bytes", state.estimatedTotalBytes == 0 ? null : state.estimatedTotalBytes);
+            result.column("partitions_processed", state.partitionsProcessed == 0 ? null : state.partitionsProcessed);
+            result.column("progress_percentage", round(state.getProgress() * 100));
+            result.column("bytes_read", state.bytesRead);
+        }
+    }
+
+    private static String timestampColumnName(Enum<?> e)
+    {
+        return timestampColumnName(e.name().toLowerCase());
+    }
+
+    private static String timestampColumnName(String e)
+    {
+        return "state_" + e + "_timestamp";
+    }
+
+    private static String stateColumns(Class<? extends Enum<?>> klass)
+    {
+        StringBuilder sb = new StringBuilder();
+        for (Enum<?> e : klass.getEnumConstants())
+            sb.append("  ").append(timestampColumnName(e)).append(" timestamp, \n");
+        return sb.toString();
+    }
+
+    private static String stdStateColumns()
+    {
+        StringBuilder sb = new StringBuilder();
+        sb.append("  ").append(timestampColumnName("init")).append(" timestamp, \n");
+        for (State.Result.Kind kind : State.Result.Kind.values())
+            sb.append("  ").append(timestampColumnName(kind)).append(" timestamp, \n");
+        return sb.toString();
+    }
+
+    private static void addCompletableState(SimpleDataSet ds, Completable<?> state)
+    {
+        // read timestamp early to see latest data
+        ds.column("last_updated_at", new Date(state.getLastUpdatedAtMillis()));
+        ds.column("duration_millis", state.getDurationMillis());
+        State.Result result = state.getResult();
+        ds.column("failure_cause", state.getFailureCause());
+        ds.column("success_message", state.getSuccessMessage());
+        ds.column(timestampColumnName("init"), new Date(state.getInitializedAtMillis()));
+        ds.column("completed", result != null);
+
+        if (result != null)
+            ds.column(timestampColumnName(result.kind), new Date(state.getLastUpdatedAtMillis()));
+    }
+
+    private static <T extends Enum<T>> void addState(SimpleDataSet ds, State<T, ?> state)
+    {
+        addCompletableState(ds, state);
+
+        T currentState = state.getStatus();
+        State.Result result = state.getResult();
+        ds.column("status", result != null ? result.kind.name().toLowerCase() : currentState == null ? "init" : currentState.name().toLowerCase());
+        for (Map.Entry<T, Long> e : state.getStateTimesMillis().entrySet())
+        {
+            if (e.getValue().longValue() != 0)
+                ds.column(timestampColumnName(e.getKey()), new Date(e.getValue()));
+        }
+    }
+
+    @VisibleForTesting
+    static float round(float value)
+    {
+        return Math.round(value * 100.0F) / 100.0F;
+    }
+
+    private static void addState(SimpleDataSet result, RepairJobDesc desc)
+    {
+        result.column("repair_id", desc.parentSessionId);
+        result.column("session_id", desc.sessionId);
+        result.column("keyspace_name", desc.keyspace);
+        result.column("table_name", desc.columnFamily);
+        result.column("ranges", toStringList(desc.ranges));
+    }
+
+    private static <T> List<String> toStringList(Collection<T> list)
+    {
+        if (list == null)
+            return null;
+        return list.stream().map(Object::toString).collect(Collectors.toList());
+    }
+
+    private static <T> Set<String> toStringSet(Collection<T> list)
+    {
+        if (list == null)
+            return null;
+        return list.stream().map(Object::toString).collect(Collectors.toSet());
+    }
+
+    private static TableMetadata parse(String keyspace, String comment, String query)
+    {
+        return CreateTableStatement.parse(query, keyspace)
+                                   .comment(comment)
+                                   .kind(TableMetadata.Kind.VIRTUAL)
+                                   .partitioner(new LocalPartitioner(UUIDType.instance))
+                                   .build();
+    }
+
+    private static String stdColumns(boolean time)
+    {
+        String str = "  id timeuuid,\n" +
+                     "  last_updated_at timestamp,\n" +
+                     "  completed boolean,\n" +
+                     "  duration_millis bigint,\n" +
+                     "  failure_cause text,\n" +
+                     "  success_message text,\n";
+        if (!time)
+            str = str.replace("id timeuuid", "id uuid");
+        return str + stdStateColumns();
+    }
+
+    private static String stdColumnsWithStatus(boolean time)
+    {
+        return stdColumns(time) + "  status text,\n";
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/NetworkPermissionsCacheKeysTable.java b/src/java/org/apache/cassandra/db/virtual/NetworkPermissionsCacheKeysTable.java
new file mode 100644
index 0000000..0c0c625
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/NetworkPermissionsCacheKeysTable.java
@@ -0,0 +1,63 @@
+/*
+ * 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.virtual;
+
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.schema.TableMetadata;
+
+final class NetworkPermissionsCacheKeysTable extends AbstractMutableVirtualTable
+{
+    private static final String ROLE = "role";
+
+    NetworkPermissionsCacheKeysTable(String keyspace)
+    {
+        super(TableMetadata.builder(keyspace, "network_permissions_cache_keys")
+                .comment("keys in the network permissions cache")
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .partitioner(new LocalPartitioner(UTF8Type.instance))
+                .addPartitionKeyColumn(ROLE, UTF8Type.instance)
+                .build());
+    }
+
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+
+        AuthenticatedUser.networkPermissionsCache.getAll()
+                .forEach((roleResource, ignored) -> result.row(roleResource.getRoleName()));
+
+        return result;
+    }
+
+    @Override
+    protected void applyPartitionDeletion(ColumnValues partitionKey)
+    {
+        RoleResource roleResource = RoleResource.role(partitionKey.value(0));
+
+        AuthenticatedUser.networkPermissionsCache.invalidate(roleResource);
+    }
+
+    @Override
+    public void truncate()
+    {
+        AuthenticatedUser.networkPermissionsCache.invalidate();
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/PendingHintsTable.java b/src/java/org/apache/cassandra/db/virtual/PendingHintsTable.java
new file mode 100644
index 0000000..55d648c
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/PendingHintsTable.java
@@ -0,0 +1,115 @@
+/*
+ * 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.virtual;
+
+import java.net.InetAddress;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.marshal.InetAddressType;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.TimestampType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.marshal.UUIDType;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.gms.FailureDetectorMBean;
+import org.apache.cassandra.hints.HintsService;
+import org.apache.cassandra.hints.PendingHintsInfo;
+import org.apache.cassandra.locator.IEndpointSnitch;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
+
+final class PendingHintsTable extends AbstractVirtualTable
+{
+    private static final String HOST_ID = "host_id";
+    private static final String ADDRESS = "address";
+    private static final String PORT = "port";
+    private static final String RACK = "rack";
+    private static final String DC = "dc";
+    private static final String STATUS = "status";
+    private static final String FILES = "files";
+    private static final String NEWEST = "newest";
+    private static final String OLDEST = "oldest";
+
+    PendingHintsTable(String keyspace)
+    {
+        super(TableMetadata.builder(keyspace, "pending_hints")
+                           .comment("Pending hints that this node has for other nodes")
+                           .kind(TableMetadata.Kind.VIRTUAL)
+                           .partitioner(new LocalPartitioner(UUIDType.instance))
+                           .addPartitionKeyColumn(HOST_ID, UUIDType.instance)
+                           .addRegularColumn(ADDRESS, InetAddressType.instance)
+                           .addRegularColumn(PORT, Int32Type.instance)
+                           .addRegularColumn(RACK, UTF8Type.instance)
+                           .addRegularColumn(DC, UTF8Type.instance)
+                           .addRegularColumn(STATUS, UTF8Type.instance)
+                           .addRegularColumn(FILES, Int32Type.instance)
+                           .addRegularColumn(NEWEST, TimestampType.instance)
+                           .addRegularColumn(OLDEST, TimestampType.instance)
+                           .build());
+    }
+
+    @Override
+    public DataSet data()
+    {
+        List<PendingHintsInfo> pendingHints = HintsService.instance.getPendingHintsInfo();
+        IEndpointSnitch snitch = DatabaseDescriptor.getEndpointSnitch();
+
+        SimpleDataSet result = new SimpleDataSet(metadata());
+
+        Map<String, String> simpleStates;
+        if (FailureDetector.instance instanceof FailureDetectorMBean)
+            simpleStates = ((FailureDetectorMBean) FailureDetector.instance).getSimpleStatesWithPort();
+        else
+            simpleStates = Collections.emptyMap();
+
+        for (PendingHintsInfo info : pendingHints)
+        {
+            InetAddressAndPort addressAndPort = StorageService.instance.getEndpointForHostId(info.hostId);
+            InetAddress address = null;
+            Integer port = null;
+            String rack = "Unknown";
+            String dc = "Unknown";
+            String status = "Unknown";
+            if (addressAndPort != null)
+            {
+                address = addressAndPort.getAddress();
+                port = addressAndPort.getPort();
+                rack = snitch.getRack(addressAndPort);
+                dc = snitch.getDatacenter(addressAndPort);
+                status = simpleStates.getOrDefault(addressAndPort.toString(), status);
+            }
+            result.row(info.hostId)
+                  .column(ADDRESS, address)
+                  .column(PORT, port)
+                  .column(RACK, rack)
+                  .column(DC, dc)
+                  .column(STATUS, status)
+                  .column(FILES, info.totalFiles)
+                  .column(NEWEST, new Date(info.newestTimestamp))
+                  .column(OLDEST, new Date(info.oldestTimestamp));
+        }
+        return result;
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/PermissionsCacheKeysTable.java b/src/java/org/apache/cassandra/db/virtual/PermissionsCacheKeysTable.java
new file mode 100644
index 0000000..e2b4fd1
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/PermissionsCacheKeysTable.java
@@ -0,0 +1,84 @@
+/*
+ * 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.virtual;
+
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.IResource;
+import org.apache.cassandra.auth.Resources;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.Pair;
+
+final class PermissionsCacheKeysTable extends AbstractMutableVirtualTable
+{
+    private static final String ROLE = "role";
+    private static final String RESOURCE = "resource";
+
+    PermissionsCacheKeysTable(String keyspace)
+    {
+        super(TableMetadata.builder(keyspace, "permissions_cache_keys")
+                .comment("keys in the permissions cache")
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .partitioner(new LocalPartitioner(UTF8Type.instance))
+                .addPartitionKeyColumn(ROLE, UTF8Type.instance)
+                .addPartitionKeyColumn(RESOURCE, UTF8Type.instance)
+                .build());
+    }
+
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+
+        AuthenticatedUser.permissionsCache.getAll()
+                .forEach((userResoursePair, ignored) ->
+                        result.row(userResoursePair.left.getName(), userResoursePair.right.getName()));
+
+        return result;
+    }
+
+    @Override
+    protected void applyPartitionDeletion(ColumnValues partitionKey)
+    {
+        AuthenticatedUser user = new AuthenticatedUser(partitionKey.value(0));
+        IResource resource = resourceFromNameIfExists(partitionKey.value(1));
+        // no need to delete invalid resource
+        if (resource == null)
+            return;
+
+        AuthenticatedUser.permissionsCache.invalidate(Pair.create(user, resource));
+    }
+
+    @Override
+    public void truncate()
+    {
+        AuthenticatedUser.permissionsCache.invalidate();
+    }
+
+    private IResource resourceFromNameIfExists(String name)
+    {
+        try
+        {
+            return Resources.fromName(name);
+        }
+        catch (IllegalArgumentException e)
+        {
+            return null;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/RolesCacheKeysTable.java b/src/java/org/apache/cassandra/db/virtual/RolesCacheKeysTable.java
new file mode 100644
index 0000000..58e0949
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/RolesCacheKeysTable.java
@@ -0,0 +1,63 @@
+/*
+ * 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.virtual;
+
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.auth.Roles;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.LocalPartitioner;
+import org.apache.cassandra.schema.TableMetadata;
+
+final class RolesCacheKeysTable extends AbstractMutableVirtualTable
+{
+    private static final String ROLE = "role";
+
+    RolesCacheKeysTable(String keyspace)
+    {
+        super(TableMetadata.builder(keyspace, "roles_cache_keys")
+                .comment("keys in the roles cache")
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .partitioner(new LocalPartitioner(UTF8Type.instance))
+                .addPartitionKeyColumn(ROLE, UTF8Type.instance)
+                .build());
+    }
+
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+
+        Roles.cache.getAll()
+                .forEach((roleResource, ignored) -> result.row(roleResource.getRoleName()));
+
+        return result;
+    }
+
+    @Override
+    protected void applyPartitionDeletion(ColumnValues partitionKey)
+    {
+        RoleResource roleResource = RoleResource.role(partitionKey.value(0));
+
+        Roles.cache.invalidate(roleResource);
+    }
+
+    @Override
+    public void truncate()
+    {
+        Roles.cache.invalidate();
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java b/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java
index 20033df..488b580 100644
--- a/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/SSTableTasksTable.java
@@ -20,9 +20,10 @@
 import org.apache.cassandra.db.compaction.CompactionInfo;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.marshal.DoubleType;
+import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.marshal.LongType;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
 import org.apache.cassandra.db.marshal.UTF8Type;
-import org.apache.cassandra.db.marshal.UUIDType;
 import org.apache.cassandra.dht.LocalPartitioner;
 import org.apache.cassandra.schema.TableMetadata;
 
@@ -34,6 +35,7 @@
     private final static String COMPLETION_RATIO = "completion_ratio";
     private final static String KIND = "kind";
     private final static String PROGRESS = "progress";
+    private final static String SSTABLES = "sstables";
     private final static String TOTAL = "total";
     private final static String UNIT = "unit";
 
@@ -45,10 +47,11 @@
                            .partitioner(new LocalPartitioner(UTF8Type.instance))
                            .addPartitionKeyColumn(KEYSPACE_NAME, UTF8Type.instance)
                            .addClusteringColumn(TABLE_NAME, UTF8Type.instance)
-                           .addClusteringColumn(TASK_ID, UUIDType.instance)
+                           .addClusteringColumn(TASK_ID, TimeUUIDType.instance)
                            .addRegularColumn(COMPLETION_RATIO, DoubleType.instance)
                            .addRegularColumn(KIND, UTF8Type.instance)
                            .addRegularColumn(PROGRESS, LongType.instance)
+                           .addRegularColumn(SSTABLES, Int32Type.instance)
                            .addRegularColumn(TOTAL, LongType.instance)
                            .addRegularColumn(UNIT, UTF8Type.instance)
                            .build());
@@ -71,6 +74,7 @@
                   .column(COMPLETION_RATIO, completionRatio)
                   .column(KIND, task.getTaskType().toString().toLowerCase())
                   .column(PROGRESS, completed)
+                  .column(SSTABLES, task.getSSTables().size())
                   .column(TOTAL, total)
                   .column(UNIT, task.getUnit().toString().toLowerCase());
         }
diff --git a/src/java/org/apache/cassandra/db/virtual/SettingsTable.java b/src/java/org/apache/cassandra/db/virtual/SettingsTable.java
index b0ae018..7a4c39e 100644
--- a/src/java/org/apache/cassandra/db/virtual/SettingsTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/SettingsTable.java
@@ -17,46 +17,31 @@
  */
 package org.apache.cassandra.db.virtual;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
+import java.util.HashMap;
 import java.util.Map;
 import java.util.Objects;
-import java.util.function.BiConsumer;
-import java.util.stream.Collectors;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Functions;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 
-import org.apache.cassandra.audit.AuditLogOptions;
-import org.apache.cassandra.config.*;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.Loader;
+import org.apache.cassandra.config.Properties;
+import org.apache.cassandra.config.Replacement;
+import org.apache.cassandra.config.Replacements;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.dht.LocalPartitioner;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.transport.ServerError;
+import org.apache.cassandra.service.ClientWarn;
+import org.yaml.snakeyaml.introspector.Property;
 
 final class SettingsTable extends AbstractVirtualTable
 {
     private static final String NAME = "name";
     private static final String VALUE = "value";
 
-    @VisibleForTesting
-    static final Map<String, Field> FIELDS =
-        Arrays.stream(Config.class.getFields())
-              .filter(f -> !Modifier.isStatic(f.getModifiers()))
-              .collect(Collectors.toMap(Field::getName, Functions.identity()));
-
-    @VisibleForTesting
-    final Map<String, BiConsumer<SimpleDataSet, Field>> overrides =
-        ImmutableMap.<String, BiConsumer<SimpleDataSet, Field>>builder()
-                    .put("audit_logging_options", this::addAuditLoggingOptions)
-                    .put("client_encryption_options", this::addEncryptionOptions)
-                    .put("server_encryption_options", this::addEncryptionOptions)
-                    .put("transparent_data_encryption_options", this::addTransparentEncryptionOptions)
-                    .build();
+    private static final Map<String, String> BACKWARDS_COMPATABLE_NAMES = ImmutableMap.copyOf(getBackwardsCompatableNames());
+    protected static final Map<String, Property> PROPERTIES = ImmutableMap.copyOf(getProperties());
 
     private final Config config;
 
@@ -77,57 +62,15 @@
         this.config = config;
     }
 
-    @VisibleForTesting
-    Object getValue(Field f)
-    {
-        Object value;
-        try
-        {
-            value = f.get(config);
-        }
-        catch (IllegalAccessException | IllegalArgumentException e)
-        {
-            throw new ServerError(e);
-        }
-        return value;
-    }
-
-    private void addValue(SimpleDataSet result, Field f)
-    {
-        Object value = getValue(f);
-        if (value == null)
-        {
-            result.row(f.getName());
-        }
-        else if (overrides.containsKey(f.getName()))
-        {
-            overrides.get(f.getName()).accept(result, f);
-        }
-        else
-        {
-            if (value.getClass().isArray())
-                value = Arrays.toString((Object[]) value);
-            result.row(f.getName()).column(VALUE, value.toString());
-        }
-    }
-
     @Override
     public DataSet data(DecoratedKey partitionKey)
     {
         SimpleDataSet result = new SimpleDataSet(metadata());
         String name = UTF8Type.instance.compose(partitionKey.getKey());
-        Field field = FIELDS.get(name);
-        if (field != null)
-        {
-            addValue(result, field);
-        }
-        else
-        {
-            // rows created by overrides might be directly queried so include them in result to be possibly filtered
-            for (String override : overrides.keySet())
-                if (name.startsWith(override))
-                    addValue(result, FIELDS.get(override));
-        }
+        if (BACKWARDS_COMPATABLE_NAMES.containsKey(name))
+            ClientWarn.instance.warn("key '" + name + "' is deprecated; should switch to '" + BACKWARDS_COMPATABLE_NAMES.get(name) + "'");
+        if (PROPERTIES.containsKey(name))
+            result.row(name).column(VALUE, getValue(PROPERTIES.get(name)));
         return result;
     }
 
@@ -135,56 +78,83 @@
     public DataSet data()
     {
         SimpleDataSet result = new SimpleDataSet(metadata());
-        for (Field setting : FIELDS.values())
-            addValue(result, setting);
+        for (Map.Entry<String, Property> e : PROPERTIES.entrySet())
+            result.row(e.getKey()).column(VALUE, getValue(e.getValue()));
         return result;
     }
 
-    private void addAuditLoggingOptions(SimpleDataSet result, Field f)
+    private String getValue(Property prop)
     {
-        Preconditions.checkArgument(AuditLogOptions.class.isAssignableFrom(f.getType()));
-
-        AuditLogOptions value = (AuditLogOptions) getValue(f);
-        result.row(f.getName() + "_enabled").column(VALUE, Boolean.toString(value.enabled));
-        result.row(f.getName() + "_logger").column(VALUE, value.logger.class_name);
-        result.row(f.getName() + "_audit_logs_dir").column(VALUE, value.audit_logs_dir);
-        result.row(f.getName() + "_included_keyspaces").column(VALUE, value.included_keyspaces);
-        result.row(f.getName() + "_excluded_keyspaces").column(VALUE, value.excluded_keyspaces);
-        result.row(f.getName() + "_included_categories").column(VALUE, value.included_categories);
-        result.row(f.getName() + "_excluded_categories").column(VALUE, value.excluded_categories);
-        result.row(f.getName() + "_included_users").column(VALUE, value.included_users);
-        result.row(f.getName() + "_excluded_users").column(VALUE, value.excluded_users);
+        Object value = prop.get(config);
+        return value == null ? null : value.toString();
     }
 
-    private void addEncryptionOptions(SimpleDataSet result, Field f)
+    private static Map<String, Property> getProperties()
     {
-        Preconditions.checkArgument(EncryptionOptions.class.isAssignableFrom(f.getType()));
-
-        EncryptionOptions value = (EncryptionOptions) getValue(f);
-        result.row(f.getName() + "_enabled").column(VALUE, Boolean.toString(value.isEnabled()));
-        result.row(f.getName() + "_algorithm").column(VALUE, value.algorithm);
-        result.row(f.getName() + "_protocol").column(VALUE, Objects.toString(value.acceptedProtocols(), null));
-        result.row(f.getName() + "_cipher_suites").column(VALUE, Objects.toString(value.cipher_suites, null));
-        result.row(f.getName() + "_client_auth").column(VALUE, Boolean.toString(value.require_client_auth));
-        result.row(f.getName() + "_endpoint_verification").column(VALUE, Boolean.toString(value.require_endpoint_verification));
-        result.row(f.getName() + "_optional").column(VALUE, Boolean.toString(value.isOptional()));
-
-        if (value instanceof EncryptionOptions.ServerEncryptionOptions)
+        Loader loader = Properties.defaultLoader();
+        Map<String, Property> properties = loader.flatten(Config.class);
+        // only handling top-level replacements for now, previous logic was only top level so not a regression
+        Map<String, Replacement> replacements = Replacements.getNameReplacements(Config.class).get(Config.class);
+        if (replacements != null)
         {
-            EncryptionOptions.ServerEncryptionOptions server = (EncryptionOptions.ServerEncryptionOptions) value;
-            result.row(f.getName() + "_internode_encryption").column(VALUE, server.internode_encryption.toString());
-            result.row(f.getName() + "_legacy_ssl_storage_port").column(VALUE, Boolean.toString(server.enable_legacy_ssl_storage_port));
+            for (Replacement r : replacements.values())
+            {
+                Property latest = properties.get(r.newName);
+                assert latest != null : "Unable to find replacement new name: " + r.newName;
+                Property conflict = properties.put(r.oldName, r.toProperty(latest));
+                // some configs kept the same name, but changed the type, if this is detected then rely on the replaced property
+                assert conflict == null || r.oldName.equals(r.newName) : String.format("New property %s attempted to replace %s, but this property already exists", latest.getName(), conflict.getName());
+            }
         }
+        for (Map.Entry<String, String> e : BACKWARDS_COMPATABLE_NAMES.entrySet())
+        {
+            String oldName = e.getKey();
+            if (properties.containsKey(oldName))
+                throw new AssertionError("Name " + oldName + " is present in Config, this adds a conflict as this name had a different meaning in " + SettingsTable.class.getSimpleName());
+            String newName = e.getValue();
+            Property prop = Objects.requireNonNull(properties.get(newName), newName + " cant be found for " + oldName);
+            properties.put(oldName, Properties.rename(oldName, prop));
+        }
+        return properties;
     }
 
-    private void addTransparentEncryptionOptions(SimpleDataSet result, Field f)
+    /**
+     * settings table was released in 4.0 and attempted to support nested properties for a few hand selected properties.
+     * The issue is that 4.0 used '_' to seperate the names, which makes it hard to map back to the yaml names; to solve
+     * this 4.1+ uses '.' to avoid possible conflicts, this class provides mappings from old names to the '.' names.
+     *
+     * There were a handle full of properties which had custom names, names not present in the yaml, this map also
+     * fixes this and returns the proper (what is accessable via yaml) names.
+     */
+    private static Map<String, String> getBackwardsCompatableNames()
     {
-        Preconditions.checkArgument(TransparentDataEncryptionOptions.class.isAssignableFrom(f.getType()));
+        Map<String, String> names = new HashMap<>();
+        // Names that dont match yaml
+        names.put("audit_logging_options_logger", "audit_logging_options.logger.class_name");
+        names.put("server_encryption_options_client_auth", "server_encryption_options.require_client_auth");
+        names.put("server_encryption_options_endpoint_verification", "server_encryption_options.require_endpoint_verification");
+        names.put("server_encryption_options_legacy_ssl_storage_port", "server_encryption_options.legacy_ssl_storage_port_enabled");
+        names.put("server_encryption_options_protocol", "server_encryption_options.accepted_protocols");
 
-        TransparentDataEncryptionOptions value = (TransparentDataEncryptionOptions) getValue(f);
-        result.row(f.getName() + "_enabled").column(VALUE, Boolean.toString(value.enabled));
-        result.row(f.getName() + "_cipher").column(VALUE, value.cipher);
-        result.row(f.getName() + "_chunk_length_kb").column(VALUE, Integer.toString(value.chunk_length_kb));
-        result.row(f.getName() + "_iv_length").column(VALUE, Integer.toString(value.iv_length));
+        // matching names
+        names.put("audit_logging_options_audit_logs_dir", "audit_logging_options.audit_logs_dir");
+        names.put("audit_logging_options_enabled", "audit_logging_options.enabled");
+        names.put("audit_logging_options_excluded_categories", "audit_logging_options.excluded_categories");
+        names.put("audit_logging_options_excluded_keyspaces", "audit_logging_options.excluded_keyspaces");
+        names.put("audit_logging_options_excluded_users", "audit_logging_options.excluded_users");
+        names.put("audit_logging_options_included_categories", "audit_logging_options.included_categories");
+        names.put("audit_logging_options_included_keyspaces", "audit_logging_options.included_keyspaces");
+        names.put("audit_logging_options_included_users", "audit_logging_options.included_users");
+        names.put("server_encryption_options_algorithm", "server_encryption_options.algorithm");
+        names.put("server_encryption_options_cipher_suites", "server_encryption_options.cipher_suites");
+        names.put("server_encryption_options_enabled", "server_encryption_options.enabled");
+        names.put("server_encryption_options_internode_encryption", "server_encryption_options.internode_encryption");
+        names.put("server_encryption_options_optional", "server_encryption_options.optional");
+        names.put("transparent_data_encryption_options_chunk_length_kb", "transparent_data_encryption_options.chunk_length_kb");
+        names.put("transparent_data_encryption_options_cipher", "transparent_data_encryption_options.cipher");
+        names.put("transparent_data_encryption_options_enabled", "transparent_data_encryption_options.enabled");
+        names.put("transparent_data_encryption_options_iv_length", "transparent_data_encryption_options.iv_length");
+
+        return names;
     }
 }
diff --git a/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java b/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java
index b8cb9f5..715f4f8 100644
--- a/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java
+++ b/src/java/org/apache/cassandra/db/virtual/SimpleDataSet.java
@@ -176,8 +176,10 @@
         private void add(String columnName, Object value)
         {
             ColumnMetadata column = metadata.getColumn(ByteBufferUtil.bytes(columnName));
-            if (null == column || !column.isRegular())
-                throw new IllegalArgumentException();
+            if (column == null)
+                throw new IllegalArgumentException("Unknown column: " + columnName);
+            if (!column.isRegular())
+                throw new IllegalArgumentException(String.format("Expect a regular column %s, but got %s", columnName, column.kind));
             values.put(column, value);
         }
 
@@ -188,9 +190,16 @@
 
             columns.forEach(c ->
             {
-                Object value = values.get(c);
-                if (null != value)
-                    builder.addCell(BufferCell.live(c, now, decompose(c.type, value)));
+                try
+                {
+                    Object value = values.get(c);
+                    if (null != value)
+                        builder.addCell(BufferCell.live(c, now, decompose(c.type, value)));
+                }
+                catch (Exception e)
+                {
+                    throw new SerializationException(c, e);
+                }
             });
 
             return builder.build();
@@ -202,9 +211,16 @@
         }
     }
 
-    @SuppressWarnings("unchecked")
-    private static <T> ByteBuffer decompose(AbstractType<?> type, T value)
+    private static ByteBuffer decompose(AbstractType<?> type, Object value)
     {
-        return ((AbstractType<T>) type).decompose(value);
+        return type.decomposeUntyped(value);
+    }
+
+    public static class SerializationException extends RuntimeException
+    {
+        public SerializationException(ColumnMetadata c, Throwable t)
+        {
+            super("Unable to serialize column " + c.name + " " + c.type.asCQL3Type(), t, true, false);
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/db/virtual/StreamingVirtualTable.java b/src/java/org/apache/cassandra/db/virtual/StreamingVirtualTable.java
new file mode 100644
index 0000000..f01e799
--- /dev/null
+++ b/src/java/org/apache/cassandra/db/virtual/StreamingVirtualTable.java
@@ -0,0 +1,109 @@
+/*
+ * 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.virtual;
+
+import java.util.Date;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.streaming.StreamManager;
+import org.apache.cassandra.streaming.StreamingState;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.cql3.statements.schema.CreateTableStatement.parse;
+
+public class StreamingVirtualTable extends AbstractVirtualTable
+{
+    public StreamingVirtualTable(String keyspace)
+    {
+        super(parse("CREATE TABLE streaming (" +
+                    "  id timeuuid,\n" +
+                    "  follower boolean,\n" +
+                    "  operation text, \n" +
+                    "  peers frozen<list<text>>,\n" +
+                    "  status text,\n" +
+                    "  progress_percentage float,\n" +
+                    "  last_updated_at timestamp,\n" +
+                    "  duration_millis bigint,\n" +
+                    "  failure_cause text,\n" +
+                    "  success_message text,\n" +
+                    "\n" +
+                    StreamingState.Sessions.columns() +
+                    "\n" +
+                    stateColumns() +
+                    "\n" +
+                    "PRIMARY KEY ((id))" +
+                    ")", keyspace)
+              .kind(TableMetadata.Kind.VIRTUAL)
+              .build());
+    }
+
+    private static String stateColumns()
+    {
+        StringBuilder sb = new StringBuilder();
+        for (StreamingState.Status state : StreamingState.Status.values())
+            sb.append("  status_").append(state.name().toLowerCase()).append("_timestamp timestamp,\n");
+        return sb.toString();
+    }
+
+    @Override
+    public DataSet data()
+    {
+        SimpleDataSet result = new SimpleDataSet(metadata());
+        StreamManager.instance.getStreamingStates()
+                              .forEach(s -> updateDataSet(result, s));
+        return result;
+    }
+
+    @Override
+    public DataSet data(DecoratedKey partitionKey)
+    {
+        TimeUUID id = TimeUUIDType.instance.compose(partitionKey.getKey());
+        SimpleDataSet result = new SimpleDataSet(metadata());
+        StreamingState state = StreamManager.instance.getStreamingState(id);
+        if (state != null)
+            updateDataSet(result, state);
+        return result;
+    }
+
+    private void updateDataSet(SimpleDataSet ds, StreamingState state)
+    {
+        ds.row(state.id());
+        ds.column("last_updated_at", new Date(state.lastUpdatedAtMillis())); // read early to see latest state
+        ds.column("follower", state.follower());
+        ds.column("operation", state.operation().getDescription());
+        ds.column("peers", state.peers().stream().map(Object::toString).collect(Collectors.toList()));
+        ds.column("status", state.status().name().toLowerCase());
+        ds.column("progress_percentage", round(state.progress() * 100));
+        ds.column("duration_millis", state.durationMillis());
+        ds.column("failure_cause", state.failureCause());
+        ds.column("success_message", state.successMessage());
+        for (Map.Entry<StreamingState.Status, Long> e : state.stateTimesMillis().entrySet())
+            ds.column("status_" + e.getKey().name().toLowerCase() + "_timestamp", new Date(e.getValue()));
+
+        state.sessions().update(ds);
+    }
+
+    static float round(float value)
+    {
+        return Math.round(value * 100) / 100;
+    }
+}
diff --git a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
index 92da4af..f13e61c 100644
--- a/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
+++ b/src/java/org/apache/cassandra/db/virtual/SystemViewsKeyspace.java
@@ -36,7 +36,18 @@
                     .add(new ThreadPoolsTable(VIRTUAL_VIEWS))
                     .add(new InternodeOutboundTable(VIRTUAL_VIEWS))
                     .add(new InternodeInboundTable(VIRTUAL_VIEWS))
+                    .add(new PendingHintsTable(VIRTUAL_VIEWS))
                     .addAll(TableMetricTables.getAll(VIRTUAL_VIEWS))
+                    .add(new CredentialsCacheKeysTable(VIRTUAL_VIEWS))
+                    .add(new JmxPermissionsCacheKeysTable(VIRTUAL_VIEWS))
+                    .add(new NetworkPermissionsCacheKeysTable(VIRTUAL_VIEWS))
+                    .add(new PermissionsCacheKeysTable(VIRTUAL_VIEWS))
+                    .add(new RolesCacheKeysTable(VIRTUAL_VIEWS))
+                    .add(new CQLMetricsTable(VIRTUAL_VIEWS))
+                    .add(new BatchMetricsTable(VIRTUAL_VIEWS))
+                    .add(new StreamingVirtualTable(VIRTUAL_VIEWS))
+                    .add(new GossipInfoTable(VIRTUAL_VIEWS))
+                    .addAll(LocalRepairTables.getAll(VIRTUAL_VIEWS))
                     .build());
     }
 }
diff --git a/src/java/org/apache/cassandra/db/virtual/VirtualKeyspaceRegistry.java b/src/java/org/apache/cassandra/db/virtual/VirtualKeyspaceRegistry.java
index 5e0f90c..23814cd 100644
--- a/src/java/org/apache/cassandra/db/virtual/VirtualKeyspaceRegistry.java
+++ b/src/java/org/apache/cassandra/db/virtual/VirtualKeyspaceRegistry.java
@@ -40,7 +40,10 @@
 
     public void register(VirtualKeyspace keyspace)
     {
-        virtualKeyspaces.put(keyspace.name(), keyspace);
+        VirtualKeyspace previous = virtualKeyspaces.put(keyspace.name(), keyspace);
+        // some tests choose to replace the keyspace, if so make sure to cleanup tables as well
+        if (previous != null)
+            previous.tables().forEach(t -> virtualTables.remove(t));
         keyspace.tables().forEach(t -> virtualTables.put(t.metadata().id, t));
     }
 
diff --git a/src/java/org/apache/cassandra/db/virtual/VirtualMutation.java b/src/java/org/apache/cassandra/db/virtual/VirtualMutation.java
index 09ac4a6..3e26032 100644
--- a/src/java/org/apache/cassandra/db/virtual/VirtualMutation.java
+++ b/src/java/org/apache/cassandra/db/virtual/VirtualMutation.java
@@ -19,6 +19,7 @@
 
 import java.util.Collection;
 import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableMap;
@@ -26,6 +27,7 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.IMutation;
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.schema.TableId;
 
@@ -105,6 +107,12 @@
     }
 
     @Override
+    public Supplier<Mutation> hintOnFailure()
+    {
+        return null;
+    }
+
+    @Override
     public void validateIndexedColumns()
     {
         // no-op
diff --git a/src/java/org/apache/cassandra/db/virtual/VirtualTable.java b/src/java/org/apache/cassandra/db/virtual/VirtualTable.java
index ea196ca..5373f4c 100644
--- a/src/java/org/apache/cassandra/db/virtual/VirtualTable.java
+++ b/src/java/org/apache/cassandra/db/virtual/VirtualTable.java
@@ -48,7 +48,7 @@
     TableMetadata metadata();
 
     /**
-     * Applies the specified update.
+     * Applies the specified update, if supported.
      * @param update the update to apply
      */
     void apply(PartitionUpdate update);
@@ -71,4 +71,9 @@
      * @return the rows corresponding to the requested data.
      */
     UnfilteredPartitionIterator select(DataRange dataRange, ColumnFilter columnFilter);
+
+    /**
+     * Truncates data from the underlying source, if supported.
+     */
+    void truncate();
 }
diff --git a/src/java/org/apache/cassandra/dht/BootStrapper.java b/src/java/org/apache/cassandra/dht/BootStrapper.java
index 39ebf78..9b017c6 100644
--- a/src/java/org/apache/cassandra/dht/BootStrapper.java
+++ b/src/java/org/apache/cassandra/dht/BootStrapper.java
@@ -20,8 +20,7 @@
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import com.google.common.util.concurrent.ListenableFuture;
-
+import org.apache.cassandra.utils.concurrent.Future;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -61,7 +60,7 @@
         this.tokenMetadata = tmd;
     }
 
-    public ListenableFuture<StreamState> bootstrap(StreamStateStore stateStore, boolean useStrictConsistency)
+    public Future<StreamState> bootstrap(StreamStateStore stateStore, boolean useStrictConsistency)
     {
         logger.trace("Beginning bootstrap process");
 
@@ -74,7 +73,7 @@
                                                    stateStore,
                                                    true,
                                                    DatabaseDescriptor.getStreamingConnectionsPerHost());
-        final List<String> nonLocalStrategyKeyspaces = Schema.instance.getNonLocalStrategyKeyspaces();
+        final Collection<String> nonLocalStrategyKeyspaces = Schema.instance.getNonLocalStrategyKeyspaces().names();
         if (nonLocalStrategyKeyspaces.isEmpty())
             logger.debug("Schema does not contain any non-local keyspaces to stream on bootstrap");
         for (String keyspaceName : nonLocalStrategyKeyspaces)
@@ -154,7 +153,7 @@
      * otherwise, if allocationKeyspace is specified use the token allocation algorithm to generate suitable tokens
      * else choose num_tokens tokens at random
      */
-    public static Collection<Token> getBootstrapTokens(final TokenMetadata metadata, InetAddressAndPort address, long schemaWaitDelay) throws ConfigurationException
+    public static Collection<Token> getBootstrapTokens(final TokenMetadata metadata, InetAddressAndPort address, long schemaTimeoutMillis, long ringTimeoutMillis) throws ConfigurationException
     {
         String allocationKeyspace = DatabaseDescriptor.getAllocateTokensForKeyspace();
         Integer allocationLocalRf = DatabaseDescriptor.getAllocateTokensForLocalRf();
@@ -175,10 +174,10 @@
             throw new ConfigurationException("num_tokens must be >= 1");
 
         if (allocationKeyspace != null)
-            return allocateTokens(metadata, address, allocationKeyspace, numTokens, schemaWaitDelay);
+            return allocateTokens(metadata, address, allocationKeyspace, numTokens, schemaTimeoutMillis, ringTimeoutMillis);
 
         if (allocationLocalRf != null)
-            return allocateTokens(metadata, address, allocationLocalRf, numTokens, schemaWaitDelay);
+            return allocateTokens(metadata, address, allocationLocalRf, numTokens, schemaTimeoutMillis, ringTimeoutMillis);
 
         if (numTokens == 1)
             logger.warn("Picking random token for a single vnode.  You should probably add more vnodes and/or use the automatic token allocation mechanism.");
@@ -207,9 +206,10 @@
                                             InetAddressAndPort address,
                                             String allocationKeyspace,
                                             int numTokens,
-                                            long schemaWaitDelay)
+                                            long schemaTimeoutMillis,
+                                            long ringTimeoutMillis)
     {
-        StorageService.instance.waitForSchema(schemaWaitDelay);
+        StorageService.instance.waitForSchema(schemaTimeoutMillis, ringTimeoutMillis);
         if (!FBUtilities.getBroadcastAddressAndPort().equals(InetAddressAndPort.getLoopbackAddress()))
             Gossiper.waitToSettle();
 
@@ -228,9 +228,10 @@
                                             InetAddressAndPort address,
                                             int rf,
                                             int numTokens,
-                                            long schemaWaitDelay)
+                                            long schemaTimeoutMillis,
+                                            long ringTimeoutMillis)
     {
-        StorageService.instance.waitForSchema(schemaWaitDelay);
+        StorageService.instance.waitForSchema(schemaTimeoutMillis, ringTimeoutMillis);
         if (!FBUtilities.getBroadcastAddressAndPort().equals(InetAddressAndPort.getLoopbackAddress()))
             Gossiper.waitToSettle();
 
diff --git a/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java b/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java
index a6314dc..3a5db52 100644
--- a/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java
+++ b/src/java/org/apache/cassandra/dht/ByteOrderedPartitioner.java
@@ -37,7 +37,6 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
diff --git a/src/java/org/apache/cassandra/dht/Datacenters.java b/src/java/org/apache/cassandra/dht/Datacenters.java
index 9695a09..b1d96eb 100644
--- a/src/java/org/apache/cassandra/dht/Datacenters.java
+++ b/src/java/org/apache/cassandra/dht/Datacenters.java
@@ -25,7 +25,6 @@
 import org.apache.cassandra.locator.IEndpointSnitch;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.FBUtilities;
 
 public class Datacenters
 {
diff --git a/src/java/org/apache/cassandra/dht/LocalPartitioner.java b/src/java/org/apache/cassandra/dht/LocalPartitioner.java
index ca48ed1..09cd2b7 100644
--- a/src/java/org/apache/cassandra/dht/LocalPartitioner.java
+++ b/src/java/org/apache/cassandra/dht/LocalPartitioner.java
@@ -152,7 +152,7 @@
         @Override
         public int compareTo(Token o)
         {
-            assert getPartitioner() == o.getPartitioner();
+            assert getPartitioner() == o.getPartitioner() : String.format("partitioners do not match; %s != %s", getPartitioner(), o.getPartitioner());
             return comparator.compare(token, ((LocalToken) o).token);
         }
 
diff --git a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java
index 2856f13..e2daac4 100644
--- a/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java
+++ b/src/java/org/apache/cassandra/dht/Murmur3Partitioner.java
@@ -144,7 +144,7 @@
     {
         static final long serialVersionUID = -5833580143318243006L;
 
-        final long token;
+        public final long token;
 
         public LongToken(long token)
         {
@@ -204,11 +204,21 @@
         }
 
         @Override
-        public Token increaseSlightly()
+        public LongToken increaseSlightly()
         {
             return new LongToken(token + 1);
         }
 
+        public LongToken decreaseSlightly()
+        {
+            return new LongToken(token - 1);
+        }
+
+        public static ByteBuffer keyForToken(long token)
+        {
+            return keyForToken(new LongToken(token));
+        }
+
         /**
          * Reverses murmur3 to find a possible 16 byte key that generates a given token
          */
@@ -216,7 +226,7 @@
         public static ByteBuffer keyForToken(LongToken token)
         {
             ByteBuffer result = ByteBuffer.allocate(16);
-            long[] inv = MurmurHash.inv_hash3_x64_128(new long[] {token.token, 0L});
+            long[] inv = MurmurHash.inv_hash3_x64_128(new long[]{ token.token, 0L });
             result.putLong(inv[0]).putLong(inv[1]).position(0);
             return result;
         }
diff --git a/src/java/org/apache/cassandra/dht/Range.java b/src/java/org/apache/cassandra/dht/Range.java
index 5b2f3d9..2c46899 100644
--- a/src/java/org/apache/cassandra/dht/Range.java
+++ b/src/java/org/apache/cassandra/dht/Range.java
@@ -483,7 +483,7 @@
      * Given a list of unwrapped ranges sorted by left position, return an
      * equivalent list of ranges but with no overlapping ranges.
      */
-    private static <T extends RingPosition<T>> List<Range<T>> deoverlap(List<Range<T>> ranges)
+    public static <T extends RingPosition<T>> List<Range<T>> deoverlap(List<Range<T>> ranges)
     {
         if (ranges.isEmpty())
             return ranges;
diff --git a/src/java/org/apache/cassandra/dht/StreamStateStore.java b/src/java/org/apache/cassandra/dht/StreamStateStore.java
index e62bc04..6d79e9a 100644
--- a/src/java/org/apache/cassandra/dht/StreamStateStore.java
+++ b/src/java/org/apache/cassandra/dht/StreamStateStore.java
@@ -30,7 +30,6 @@
 import org.apache.cassandra.streaming.StreamEventHandler;
 import org.apache.cassandra.streaming.StreamRequest;
 import org.apache.cassandra.streaming.StreamState;
-import org.apache.cassandra.utils.Pair;
 
 /**
  * Store and update available ranges (data already received) to system keyspace.
diff --git a/src/java/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocator.java b/src/java/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocator.java
index f8c13df..6a382c0 100644
--- a/src/java/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocator.java
+++ b/src/java/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocator.java
@@ -98,7 +98,7 @@
 
         public int nodeId()
         {
-            return fakeAddressAndPort.port;
+            return fakeAddressAndPort.getPort();
         }
 
         public int rackId()
@@ -187,4 +187,4 @@
             throw new IllegalStateException("Unexpected UnknownHostException", e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/dht/tokenallocator/ReplicationStrategy.java b/src/java/org/apache/cassandra/dht/tokenallocator/ReplicationStrategy.java
index 6dbd37c..8cb5fe1 100644
--- a/src/java/org/apache/cassandra/dht/tokenallocator/ReplicationStrategy.java
+++ b/src/java/org/apache/cassandra/dht/tokenallocator/ReplicationStrategy.java
@@ -26,4 +26,4 @@
      * @return Some hashable object.
      */
     Object getGroup(Unit unit);
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocator.java b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocator.java
index 2eb9a4c..7645317 100644
--- a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocator.java
+++ b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocator.java
@@ -24,4 +24,4 @@
 public interface TokenAllocator<Unit>
 {
     Collection<Token> addUnit(Unit newUnit, int numTokens);
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorDiagnostics.java b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorDiagnostics.java
index 04d7455..c29980c 100644
--- a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorDiagnostics.java
+++ b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorDiagnostics.java
@@ -193,4 +193,4 @@
         return service.isEnabled(TokenAllocatorEvent.class, type);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorEvent.java b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorEvent.java
index ca59938..acb5ed2 100644
--- a/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorEvent.java
+++ b/src/java/org/apache/cassandra/dht/tokenallocator/TokenAllocatorEvent.java
@@ -110,4 +110,4 @@
         ret.put("tokenInfo", String.valueOf(tokenInfo));
         return ret;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/diag/DiagnosticEvent.java b/src/java/org/apache/cassandra/diag/DiagnosticEvent.java
index 5de703b..229710c 100644
--- a/src/java/org/apache/cassandra/diag/DiagnosticEvent.java
+++ b/src/java/org/apache/cassandra/diag/DiagnosticEvent.java
@@ -20,6 +20,8 @@
 import java.io.Serializable;
 import java.util.Map;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * Base class for internally emitted events used for diagnostics and testing.
  */
@@ -28,7 +30,7 @@
     /**
      * Event creation time.
      */
-    public final long timestamp = System.currentTimeMillis();
+    public final long timestamp = currentTimeMillis();
 
     /**
      * Name of allocating thread.
diff --git a/src/java/org/apache/cassandra/diag/DiagnosticEventService.java b/src/java/org/apache/cassandra/diag/DiagnosticEventService.java
index 34a4de7..8a8391c 100644
--- a/src/java/org/apache/cassandra/diag/DiagnosticEventService.java
+++ b/src/java/org/apache/cassandra/diag/DiagnosticEventService.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.diag;
 
 import java.io.Serializable;
-import java.lang.management.ManagementFactory;
 import java.util.Collection;
 import java.util.Map;
 import java.util.Objects;
@@ -27,8 +26,6 @@
 import java.util.function.Consumer;
 
 import javax.annotation.Nullable;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
 
 import com.google.common.collect.ImmutableCollection;
 import com.google.common.collect.ImmutableMap;
@@ -338,4 +335,4 @@
             return Objects.hash(wrapped);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/diag/LastEventIdBroadcaster.java b/src/java/org/apache/cassandra/diag/LastEventIdBroadcaster.java
index 8e991e6..e82b40c 100644
--- a/src/java/org/apache/cassandra/diag/LastEventIdBroadcaster.java
+++ b/src/java/org/apache/cassandra/diag/LastEventIdBroadcaster.java
@@ -33,6 +33,8 @@
 import org.apache.cassandra.utils.MBeanWrapper;
 import org.apache.cassandra.utils.progress.jmx.JMXBroadcastExecutor;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * Broadcaster for notifying JMX clients on newly available data. Periodically sends {@link Notification}s
  * containing a list of event types and greatest event IDs. Consumers may use this information to
@@ -100,7 +102,7 @@
     {
         // ensure monotonic properties of ids
         if (summary.compute(key, (k, v) -> v == null ? id : id.compareTo(v) > 0 ? id : v) == id) {
-            summary.put("last_updated_at", System.currentTimeMillis());
+            summary.put("last_updated_at", currentTimeMillis());
             scheduleBroadcast();
         }
     }
@@ -132,7 +134,7 @@
         Notification notification = new Notification("event_last_id_summary",
                                                      "LastEventIdBroadcaster",
                                                      notificationSerialNumber.incrementAndGet(),
-                                                     System.currentTimeMillis(),
+                                                     currentTimeMillis(),
                                                      "Event last IDs summary");
         notification.setUserData(summary);
         sendNotification(notification);
diff --git a/src/java/org/apache/cassandra/exceptions/CasWriteTimeoutException.java b/src/java/org/apache/cassandra/exceptions/CasWriteTimeoutException.java
index b134764..32cc014 100644
--- a/src/java/org/apache/cassandra/exceptions/CasWriteTimeoutException.java
+++ b/src/java/org/apache/cassandra/exceptions/CasWriteTimeoutException.java
@@ -20,13 +20,14 @@
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.WriteType;
 
+
 public class CasWriteTimeoutException extends WriteTimeoutException
 {
     public final int contentions;
 
     public CasWriteTimeoutException(WriteType writeType, ConsistencyLevel consistency, int received, int blockFor, int contentions)
     {
-        super(writeType, consistency, received, blockFor, String.format("CAS operation timed out - encountered contentions: %d", contentions));
+        super(writeType, consistency, received, blockFor, String.format("CAS operation timed out: received %d of %d required responses after %d contention retries", received, blockFor, contentions));
         this.contentions = contentions;
     }
 }
diff --git a/src/java/org/apache/cassandra/exceptions/CassandraException.java b/src/java/org/apache/cassandra/exceptions/CassandraException.java
index 58521df..119daac 100644
--- a/src/java/org/apache/cassandra/exceptions/CassandraException.java
+++ b/src/java/org/apache/cassandra/exceptions/CassandraException.java
@@ -17,6 +17,11 @@
  */
 package org.apache.cassandra.exceptions;
 
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
 public abstract class CassandraException extends RuntimeException implements TransportException
 {
     private final ExceptionCode code;
diff --git a/src/java/org/apache/cassandra/exceptions/ExceptionCode.java b/src/java/org/apache/cassandra/exceptions/ExceptionCode.java
index 1766951..8bb0cfd 100644
--- a/src/java/org/apache/cassandra/exceptions/ExceptionCode.java
+++ b/src/java/org/apache/cassandra/exceptions/ExceptionCode.java
@@ -21,10 +21,14 @@
 import java.util.Map;
 
 import org.apache.cassandra.transport.ProtocolException;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
 
 /**
  * Exceptions code, as defined by the binary protocol.
  */
+@Shared(scope = SIMULATION)
 public enum ExceptionCode
 {
     SERVER_ERROR    (0x0000),
diff --git a/src/java/org/apache/cassandra/exceptions/ReadAbortException.java b/src/java/org/apache/cassandra/exceptions/ReadAbortException.java
new file mode 100644
index 0000000..0075858
--- /dev/null
+++ b/src/java/org/apache/cassandra/exceptions/ReadAbortException.java
@@ -0,0 +1,35 @@
+/*
+ * 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.exceptions;
+
+import java.util.Map;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+/**
+ * Special Read Failure which is caused by user query; implies a user request is not allowed and not that Cassandra had an issue.
+ */
+public abstract class ReadAbortException extends ReadFailureException
+{
+    protected ReadAbortException(String msg, ConsistencyLevel consistency, int received, int blockFor, boolean dataPresent, Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint)
+    {
+        super(msg, consistency, received, blockFor, dataPresent, failureReasonByEndpoint);
+    }
+}
diff --git a/src/java/org/apache/cassandra/exceptions/ReadFailureException.java b/src/java/org/apache/cassandra/exceptions/ReadFailureException.java
index 744cad4..698c8ae 100644
--- a/src/java/org/apache/cassandra/exceptions/ReadFailureException.java
+++ b/src/java/org/apache/cassandra/exceptions/ReadFailureException.java
@@ -33,4 +33,10 @@
         super(ExceptionCode.READ_FAILURE, consistency, received, blockFor, ImmutableMap.copyOf(failureReasonByEndpoint));
         this.dataPresent = dataPresent;
     }
+
+    protected ReadFailureException(String msg, ConsistencyLevel consistency, int received, int blockFor, boolean dataPresent, Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint)
+    {
+        super(ExceptionCode.READ_FAILURE, msg, consistency, received, blockFor, failureReasonByEndpoint);
+        this.dataPresent = dataPresent;
+    }
 }
diff --git a/src/java/org/apache/cassandra/exceptions/ReadSizeAbortException.java b/src/java/org/apache/cassandra/exceptions/ReadSizeAbortException.java
new file mode 100644
index 0000000..ed81008
--- /dev/null
+++ b/src/java/org/apache/cassandra/exceptions/ReadSizeAbortException.java
@@ -0,0 +1,32 @@
+/*
+ * 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.exceptions;
+
+import java.util.Map;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+public class ReadSizeAbortException extends ReadAbortException
+{
+    public ReadSizeAbortException(String msg, ConsistencyLevel consistency, int received, int blockFor, boolean dataPresent, Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint)
+    {
+        super(msg, consistency, received, blockFor, dataPresent, failureReasonByEndpoint);
+    }
+}
diff --git a/src/java/org/apache/cassandra/exceptions/RepairException.java b/src/java/org/apache/cassandra/exceptions/RepairException.java
index db219a2..eb93c37 100644
--- a/src/java/org/apache/cassandra/exceptions/RepairException.java
+++ b/src/java/org/apache/cassandra/exceptions/RepairException.java
@@ -25,24 +25,36 @@
  */
 public class RepairException extends Exception
 {
-    public final RepairJobDesc desc;
-    public final PreviewKind previewKind;
+    private final boolean shouldLogWarn;
 
-    public RepairException(RepairJobDesc desc, String message)
+    private RepairException(RepairJobDesc desc, PreviewKind previewKind, String message, boolean shouldLogWarn)
     {
-        this(desc, null, message);
+        this(desc.toString(previewKind != null ? previewKind : PreviewKind.NONE) + ' ' + message, shouldLogWarn);
     }
 
-    public RepairException(RepairJobDesc desc, PreviewKind previewKind, String message)
+    private RepairException(String msg, boolean shouldLogWarn)
     {
-        super(message);
-        this.desc = desc;
-        this.previewKind = previewKind != null ? previewKind : PreviewKind.NONE;
+        super(msg);
+        this.shouldLogWarn = shouldLogWarn;
     }
 
-    @Override
-    public String getMessage()
+    public static RepairException error(RepairJobDesc desc, PreviewKind previewKind, String message)
     {
-        return desc.toString(previewKind) + ' ' + super.getMessage();
+        return new RepairException(desc, previewKind, message, false);
+    }
+
+    public static RepairException warn(RepairJobDesc desc, PreviewKind previewKind, String message)
+    {
+        return new RepairException(desc, previewKind, message, true);
+    }
+
+    public static RepairException warn(String message)
+    {
+        return new RepairException(message, true);
+    }
+
+    public static boolean shouldWarn(Throwable throwable)
+    {
+        return throwable instanceof RepairException && ((RepairException)throwable).shouldLogWarn;
     }
 }
diff --git a/src/java/org/apache/cassandra/exceptions/RequestExecutionException.java b/src/java/org/apache/cassandra/exceptions/RequestExecutionException.java
index 4db108a..d80559a 100644
--- a/src/java/org/apache/cassandra/exceptions/RequestExecutionException.java
+++ b/src/java/org/apache/cassandra/exceptions/RequestExecutionException.java
@@ -17,6 +17,11 @@
  */
 package org.apache.cassandra.exceptions;
 
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
 public abstract class RequestExecutionException extends CassandraException
 {
     protected RequestExecutionException(ExceptionCode code, String msg)
diff --git a/src/java/org/apache/cassandra/exceptions/RequestFailureException.java b/src/java/org/apache/cassandra/exceptions/RequestFailureException.java
index 56cee1a..a715347 100644
--- a/src/java/org/apache/cassandra/exceptions/RequestFailureException.java
+++ b/src/java/org/apache/cassandra/exceptions/RequestFailureException.java
@@ -32,7 +32,12 @@
 
     protected RequestFailureException(ExceptionCode code, ConsistencyLevel consistency, int received, int blockFor, Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint)
     {
-        super(code, buildErrorMessage(received, failureReasonByEndpoint));
+        this(code, buildErrorMessage(received, failureReasonByEndpoint), consistency, received, blockFor, failureReasonByEndpoint);
+    }
+
+    public RequestFailureException(ExceptionCode code, String msg, ConsistencyLevel consistency, int received, int blockFor, Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint)
+    {
+        super(code, buildErrorMessage(msg, failureReasonByEndpoint));
         this.consistency = consistency;
         this.received = received;
         this.blockFor = blockFor;
@@ -41,10 +46,7 @@
 
     private static String buildErrorMessage(int received, Map<InetAddressAndPort, RequestFailureReason> failures)
     {
-        return String.format("Operation failed - received %d responses and %d failures: %s",
-                             received,
-                             failures.size(),
-                             buildFailureString(failures));
+        return String.format("received %d responses and %d failures", received, failures.size());
     }
 
     private static String buildFailureString(Map<InetAddressAndPort, RequestFailureReason> failures)
@@ -53,4 +55,13 @@
                        .map(e -> String.format("%s from %s", e.getValue(), e.getKey()))
                        .collect(Collectors.joining(", "));
     }
+
+    private static String buildErrorMessage(CharSequence msg, Map<InetAddressAndPort, RequestFailureReason> failures)
+    {
+        StringBuilder sb = new StringBuilder("Operation failed - ");
+        sb.append(msg);
+        if (failures != null && !failures.isEmpty())
+            sb.append(": ").append(buildFailureString(failures));
+        return sb.toString();
+    }
 }
diff --git a/src/java/org/apache/cassandra/exceptions/RequestFailureReason.java b/src/java/org/apache/cassandra/exceptions/RequestFailureReason.java
index 1cdbdb5..3d3476a 100644
--- a/src/java/org/apache/cassandra/exceptions/RequestFailureReason.java
+++ b/src/java/org/apache/cassandra/exceptions/RequestFailureReason.java
@@ -35,7 +35,9 @@
     UNKNOWN                  (0),
     READ_TOO_MANY_TOMBSTONES (1),
     TIMEOUT                  (2),
-    INCOMPATIBLE_SCHEMA      (3);
+    INCOMPATIBLE_SCHEMA      (3),
+    READ_SIZE                (4),
+    NODE_DOWN                (5);
 
     public static final Serializer serializer = new Serializer();
 
diff --git a/src/java/org/apache/cassandra/exceptions/TombstoneAbortException.java b/src/java/org/apache/cassandra/exceptions/TombstoneAbortException.java
new file mode 100644
index 0000000..833a093
--- /dev/null
+++ b/src/java/org/apache/cassandra/exceptions/TombstoneAbortException.java
@@ -0,0 +1,39 @@
+/*
+ * 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.exceptions;
+
+import java.util.Map;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+import static org.apache.cassandra.service.reads.thresholds.WarningsSnapshot.tombstoneAbortMessage;
+
+public class TombstoneAbortException extends ReadAbortException
+{
+    public final int nodes;
+    public final long tombstones;
+
+    public TombstoneAbortException(int nodes, long tombstones, String cql, boolean dataPresent, ConsistencyLevel consistency, int received, int blockFor, Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint)
+    {
+        super(tombstoneAbortMessage(nodes, tombstones, cql), consistency, received, blockFor, dataPresent, failureReasonByEndpoint);
+        this.nodes = nodes;
+        this.tombstones = tombstones;
+    }
+}
diff --git a/src/java/org/apache/cassandra/exceptions/TransportException.java b/src/java/org/apache/cassandra/exceptions/TransportException.java
index 70d1da5..9807749 100644
--- a/src/java/org/apache/cassandra/exceptions/TransportException.java
+++ b/src/java/org/apache/cassandra/exceptions/TransportException.java
@@ -17,6 +17,11 @@
  */
 package org.apache.cassandra.exceptions;
 
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
 public interface TransportException
 {
     /**
diff --git a/src/java/org/apache/cassandra/fql/FullQueryLogger.java b/src/java/org/apache/cassandra/fql/FullQueryLogger.java
index 0604df6..415b894 100644
--- a/src/java/org/apache/cassandra/fql/FullQueryLogger.java
+++ b/src/java/org/apache/cassandra/fql/FullQueryLogger.java
@@ -17,10 +17,8 @@
  */
 package org.apache.cassandra.fql;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Set;
@@ -31,6 +29,7 @@
 import com.google.common.collect.Sets;
 import com.google.common.primitives.Ints;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,6 +48,7 @@
 import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.binlog.BinLog;
 import org.apache.cassandra.utils.binlog.BinLogOptions;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 import org.apache.cassandra.utils.concurrent.WeightedQueue;
 import org.github.jamm.MemoryLayoutSpecification;
 
@@ -177,7 +177,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
         finally
         {
@@ -210,7 +210,7 @@
             //Then decide whether to clean the last used path, possibly configured by JMX
             if (binLog != null && binLog.path != null)
             {
-                File pathFile = binLog.path.toFile();
+                File pathFile = new File(binLog.path);
                 if (pathFile.exists())
                 {
                     pathsToClean.add(pathFile);
diff --git a/src/java/org/apache/cassandra/gms/ApplicationState.java b/src/java/org/apache/cassandra/gms/ApplicationState.java
index 4e20d62..c45d3c2 100644
--- a/src/java/org/apache/cassandra/gms/ApplicationState.java
+++ b/src/java/org/apache/cassandra/gms/ApplicationState.java
@@ -56,6 +56,7 @@
      * a comma-separated list.
      **/
     SSTABLE_VERSIONS,
+    DISK_USAGE,
     // DO NOT EDIT OR REMOVE PADDING STATES BELOW - only add new states above.  See CASSANDRA-16484
     X1,
     X2,
diff --git a/src/java/org/apache/cassandra/gms/EndpointState.java b/src/java/org/apache/cassandra/gms/EndpointState.java
index fe29c4b..e756744 100644
--- a/src/java/org/apache/cassandra/gms/EndpointState.java
+++ b/src/java/org/apache/cassandra/gms/EndpointState.java
@@ -24,6 +24,8 @@
 
 import javax.annotation.Nullable;
 
+import com.google.common.annotations.VisibleForTesting;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,18 +34,20 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.NullableSerializer;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * This abstraction represents both the HeartBeatState and the ApplicationState in an EndpointState
  * instance. Any state for a given endpoint can be retrieved from this instance.
  */
-
-
 public class EndpointState
 {
     protected static final Logger logger = LoggerFactory.getLogger(EndpointState.class);
 
     public final static IVersionedSerializer<EndpointState> serializer = new EndpointStateSerializer();
+    public final static IVersionedSerializer<EndpointState> nullableSerializer = NullableSerializer.wrap(serializer);
 
     private volatile HeartBeatState hbState;
     private final AtomicReference<Map<ApplicationState, VersionedValue>> applicationState;
@@ -66,11 +70,12 @@
     {
         hbState = initialHbState;
         applicationState = new AtomicReference<Map<ApplicationState, VersionedValue>>(new EnumMap<>(states));
-        updateTimestamp = System.nanoTime();
+        updateTimestamp = nanoTime();
         isAlive = true;
     }
 
-    HeartBeatState getHeartBeatState()
+    @VisibleForTesting
+    public HeartBeatState getHeartBeatState()
     {
         return hbState;
     }
@@ -178,7 +183,7 @@
 
     void updateTimestamp()
     {
-        updateTimestamp = System.nanoTime();
+        updateTimestamp = nanoTime();
     }
 
     public boolean isAlive()
@@ -255,6 +260,20 @@
     {
         return "EndpointState: HeartBeatState = " + hbState + ", AppStateMap = " + applicationState.get();
     }
+
+    public boolean isSupersededBy(EndpointState that)
+    {
+        int thisGeneration = this.getHeartBeatState().getGeneration();
+        int thatGeneration = that.getHeartBeatState().getGeneration();
+
+        if (thatGeneration > thisGeneration)
+            return true;
+
+        if (thisGeneration > thatGeneration)
+            return false;
+
+        return Gossiper.getMaxEndpointStateVersion(that) > Gossiper.getMaxEndpointStateVersion(this);
+    }
 }
 
 class EndpointStateSerializer implements IVersionedSerializer<EndpointState>
diff --git a/src/java/org/apache/cassandra/gms/FailureDetector.java b/src/java/org/apache/cassandra/gms/FailureDetector.java
index 7cd14a3..5177154 100644
--- a/src/java/org/apache/cassandra/gms/FailureDetector.java
+++ b/src/java/org/apache/cassandra/gms/FailureDetector.java
@@ -27,8 +27,8 @@
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
-import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.*;
+
 import org.apache.cassandra.locator.Replica;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -40,7 +40,8 @@
 import org.apache.cassandra.utils.MBeanWrapper;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.LINE_SEPARATOR;
-import static org.apache.cassandra.utils.MonotonicClock.preciseTime;
+import static org.apache.cassandra.config.DatabaseDescriptor.newFailureDetector;
+import static org.apache.cassandra.utils.MonotonicClock.Global.preciseTime;
 
 /**
  * This FailureDetector is an implementation of the paper titled
@@ -71,7 +72,7 @@
             return DEFAULT_MAX_PAUSE;
     }
 
-    public static final IFailureDetector instance = new FailureDetector();
+    public static final IFailureDetector instance = newFailureDetector();
     public static final Predicate<InetAddressAndPort> isEndpointAlive = instance::isAlive;
     public static final Predicate<Replica> isReplicaAlive = r -> isEndpointAlive.test(r.endpoint());
 
@@ -106,20 +107,35 @@
 
     public String getAllEndpointStates()
     {
-        return getAllEndpointStates(false);
+        return getAllEndpointStates(false, false);
+    }
+
+    public String getAllEndpointStatesWithResolveIp()
+    {
+        return getAllEndpointStates(false, true);
     }
 
     public String getAllEndpointStatesWithPort()
     {
-        return getAllEndpointStates(true);
+        return getAllEndpointStates(true, false);
+    }
+
+    public String getAllEndpointStatesWithPortAndResolveIp()
+    {
+        return getAllEndpointStates(true, true);
     }
 
     public String getAllEndpointStates(boolean withPort)
     {
+        return getAllEndpointStates(withPort, false);
+    }
+
+    public String getAllEndpointStates(boolean withPort, boolean resolveIp)
+    {
         StringBuilder sb = new StringBuilder();
         for (Map.Entry<InetAddressAndPort, EndpointState> entry : Gossiper.instance.endpointStateMap.entrySet())
         {
-            sb.append(entry.getKey().toString(withPort)).append("\n");
+            sb.append(resolveIp ? entry.getKey().getHostName(withPort) : entry.getKey().toString(withPort)).append("\n");
             appendEndpointState(sb, entry.getValue());
         }
         return sb.toString();
@@ -254,7 +270,7 @@
         }
         catch (IOException e)
         {
-            throw new FSWriteError(e, (path == null) ? null : path.toFile());
+            throw new FSWriteError(e, path);
         }
     }
 
diff --git a/src/java/org/apache/cassandra/gms/FailureDetectorMBean.java b/src/java/org/apache/cassandra/gms/FailureDetectorMBean.java
index 6be31b0..c7673d9 100644
--- a/src/java/org/apache/cassandra/gms/FailureDetectorMBean.java
+++ b/src/java/org/apache/cassandra/gms/FailureDetectorMBean.java
@@ -32,7 +32,9 @@
     public double getPhiConvictThreshold();
 
     @Deprecated public String getAllEndpointStates();
+    @Deprecated public String getAllEndpointStatesWithResolveIp();
     public String getAllEndpointStatesWithPort();
+    public String getAllEndpointStatesWithPortAndResolveIp();
 
     public String getEndpointState(String address) throws UnknownHostException;
 
diff --git a/src/java/org/apache/cassandra/gms/GossipDigestAck2.java b/src/java/org/apache/cassandra/gms/GossipDigestAck2.java
index 0e4062b..ed959a5 100644
--- a/src/java/org/apache/cassandra/gms/GossipDigestAck2.java
+++ b/src/java/org/apache/cassandra/gms/GossipDigestAck2.java
@@ -43,11 +43,6 @@
     {
         this.epStateMap = epStateMap;
     }
-
-    Map<InetAddressAndPort, EndpointState> getEndpointStateMap()
-    {
-        return epStateMap;
-    }
 }
 
 class GossipDigestAck2Serializer implements IVersionedSerializer<GossipDigestAck2>
diff --git a/src/java/org/apache/cassandra/gms/GossipDigestAck2VerbHandler.java b/src/java/org/apache/cassandra/gms/GossipDigestAck2VerbHandler.java
index 58c1589..0f01999 100644
--- a/src/java/org/apache/cassandra/gms/GossipDigestAck2VerbHandler.java
+++ b/src/java/org/apache/cassandra/gms/GossipDigestAck2VerbHandler.java
@@ -44,7 +44,7 @@
                 logger.trace("Ignoring GossipDigestAck2Message because gossip is disabled");
             return;
         }
-        Map<InetAddressAndPort, EndpointState> remoteEpStateMap = message.payload.getEndpointStateMap();
+        Map<InetAddressAndPort, EndpointState> remoteEpStateMap = message.payload.epStateMap;
         /* Notify the Failure Detector */
         Gossiper.instance.notifyFailureDetector(remoteEpStateMap);
         Gossiper.instance.applyStateLocally(remoteEpStateMap);
diff --git a/src/java/org/apache/cassandra/gms/GossipDigestAckVerbHandler.java b/src/java/org/apache/cassandra/gms/GossipDigestAckVerbHandler.java
index 0242d83..5fbe7ce 100644
--- a/src/java/org/apache/cassandra/gms/GossipDigestAckVerbHandler.java
+++ b/src/java/org/apache/cassandra/gms/GossipDigestAckVerbHandler.java
@@ -29,6 +29,7 @@
 import org.apache.cassandra.net.MessagingService;
 
 import static org.apache.cassandra.net.Verb.GOSSIP_DIGEST_ACK2;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class GossipDigestAckVerbHandler extends GossipVerbHandler<GossipDigestAck>
 {
@@ -68,7 +69,7 @@
             // Ignore any GossipDigestAck messages that we handle before a regular GossipDigestSyn has been send.
             // This will prevent Acks from leaking over from the shadow round that are not actual part of
             // the regular gossip conversation.
-            if ((System.nanoTime() - Gossiper.instance.firstSynSendAt) < 0 || Gossiper.instance.firstSynSendAt == 0)
+            if ((nanoTime() - Gossiper.instance.firstSynSendAt) < 0 || Gossiper.instance.firstSynSendAt == 0)
             {
                 if (logger.isTraceEnabled())
                     logger.trace("Ignoring unrequested GossipDigestAck from {}", from);
diff --git a/src/java/org/apache/cassandra/gms/GossipDigestSyn.java b/src/java/org/apache/cassandra/gms/GossipDigestSyn.java
index 17c8da3..7c2ae94 100644
--- a/src/java/org/apache/cassandra/gms/GossipDigestSyn.java
+++ b/src/java/org/apache/cassandra/gms/GossipDigestSyn.java
@@ -30,6 +30,7 @@
  * This is the first message that gets sent out as a start of the Gossip protocol in a
  * round.
  */
+
 public class GossipDigestSyn
 {
     public static final IVersionedSerializer<GossipDigestSyn> serializer = new GossipDigestSynSerializer();
diff --git a/src/java/org/apache/cassandra/gms/GossipShutdownVerbHandler.java b/src/java/org/apache/cassandra/gms/GossipShutdownVerbHandler.java
index 83c8568..f2622ef 100644
--- a/src/java/org/apache/cassandra/gms/GossipShutdownVerbHandler.java
+++ b/src/java/org/apache/cassandra/gms/GossipShutdownVerbHandler.java
@@ -39,4 +39,4 @@
         Gossiper.instance.markAsShutdown(message.from());
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java b/src/java/org/apache/cassandra/gms/Gossiper.java
index 17e315a..ae213c0 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -20,7 +20,14 @@
 import java.net.UnknownHostException;
 import java.util.*;
 import java.util.Map.Entry;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.function.BooleanSupplier;
 import java.util.function.Supplier;
@@ -35,10 +42,10 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.ListenableFutureTask;
 import com.google.common.util.concurrent.Uninterruptibles;
 
-import org.apache.cassandra.concurrent.JMXEnabledSingleThreadExecutor;
+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;
@@ -51,8 +58,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.SystemKeyspace;
@@ -64,11 +69,22 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.RecomputingSupplier;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+import org.apache.cassandra.utils.concurrent.NotScheduledFuture;
 
+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.SHUTDOWN_ANNOUNCE_DELAY_IN_MS;
+import static org.apache.cassandra.config.DatabaseDescriptor.getClusterName;
+import static org.apache.cassandra.config.DatabaseDescriptor.getPartitionerName;
 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;
 
 /**
  * This module is responsible for Gossiping information for the local endpoint. This abstraction
@@ -94,7 +110,7 @@
         public static final String DISABLE_THREAD_VALIDATION = "cassandra.gossip.disable_thread_validation";
     }
 
-    private static final DebuggableScheduledThreadPoolExecutor executor = new DebuggableScheduledThreadPoolExecutor("GossipTasks");
+    private static final ScheduledExecutorPlus executor = executorFactory().scheduled("GossipTasks");
 
     static final ApplicationState[] STATES = ApplicationState.values();
     static final List<String> DEAD_STATES = Arrays.asList(VersionedValue.REMOVING_TOKEN, VersionedValue.REMOVED_TOKEN,
@@ -112,7 +128,7 @@
     private volatile ScheduledFuture<?> scheduledGossipTask;
     private static final ReentrantLock taskLock = new ReentrantLock();
     public final static int intervalInMillis = 1000;
-    public final static int QUARANTINE_DELAY = GOSSIPER_QUARANTINE_DELAY.getInt(StorageService.RING_DELAY * 2);
+    public final static int QUARANTINE_DELAY = GOSSIPER_QUARANTINE_DELAY.getInt(StorageService.RING_DELAY_MILLIS * 2);
     private static final Logger logger = LoggerFactory.getLogger(Gossiper.class);
     private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(logger, 15L, TimeUnit.MINUTES);
 
@@ -142,8 +158,9 @@
     @VisibleForTesting
     final Set<InetAddressAndPort> seeds = new ConcurrentSkipListSet<>();
 
-    /* map where key is the endpoint and value is the state associated with the endpoint */
-    final ConcurrentMap<InetAddressAndPort, EndpointState> endpointStateMap = new ConcurrentHashMap<>();
+    /* map where key is the endpoint and value is the state associated with the endpoint.
+     * This is made public to be consumed by the GossipInfoTable virtual table */
+    public final ConcurrentMap<InetAddressAndPort, EndpointState> endpointStateMap = new ConcurrentHashMap<>();
 
     /* map where key is endpoint and value is timestamp when this endpoint was removed from
      * gossip. We will ignore any gossip regarding these endpoints for QUARANTINE_DELAY time
@@ -159,7 +176,7 @@
     // endpoint states as gathered during shadow round
     private final Map<InetAddressAndPort, EndpointState> endpointShadowStateMap = new ConcurrentHashMap<>();
 
-    private volatile long lastProcessedMessageAt = System.currentTimeMillis();
+    private volatile long lastProcessedMessageAt = currentTimeMillis();
 
     /**
      * This property is initially set to {@code true} which means that we have no information about the other nodes.
@@ -237,6 +254,7 @@
     }
 
     private static final boolean disableThreadValidation = Boolean.getBoolean(Props.DISABLE_THREAD_VALIDATION);
+    private static volatile boolean disableEndpointRemoval = DISABLE_GOSSIP_ENDPOINT_REMOVAL.getBoolean();
 
     private static long getVeryLongTime()
     {
@@ -251,7 +269,7 @@
 
     private static boolean isInGossipStage()
     {
-        return ((JMXEnabledSingleThreadExecutor) Stage.GOSSIP.executor()).isExecutedBy(Thread.currentThread());
+        return Stage.GOSSIP.executor().inExecutor();
     }
 
     private static void checkProperThreadForStateMutation()
@@ -282,16 +300,17 @@
                 taskLock.lock();
 
                 /* Update the local heartbeat counter. */
-                endpointStateMap.get(FBUtilities.getBroadcastAddressAndPort()).getHeartBeatState().updateHeartBeat();
+                endpointStateMap.get(getBroadcastAddressAndPort()).getHeartBeatState().updateHeartBeat();
                 if (logger.isTraceEnabled())
                     logger.trace("My heartbeat is now {}", endpointStateMap.get(FBUtilities.getBroadcastAddressAndPort()).getHeartBeatState().getHeartBeatVersion());
                 final List<GossipDigest> gDigests = new ArrayList<>();
+
                 Gossiper.instance.makeGossipDigest(gDigests);
 
                 if (gDigests.size() > 0)
                 {
-                    GossipDigestSyn digestSynMessage = new GossipDigestSyn(DatabaseDescriptor.getClusterName(),
-                                                                           DatabaseDescriptor.getPartitionerName(),
+                    GossipDigestSyn digestSynMessage = new GossipDigestSyn(getClusterName(),
+                                                                           getPartitionerName(),
                                                                            gDigests);
                     Message<GossipDigestSyn> message = Message.out(GOSSIP_DIGEST_SYN, digestSynMessage);
                     /* Gossip to some random live member */
@@ -437,8 +456,8 @@
     public Set<InetAddressAndPort> getLiveMembers()
     {
         Set<InetAddressAndPort> liveMembers = new HashSet<>(liveEndpoints);
-        if (!liveMembers.contains(FBUtilities.getBroadcastAddressAndPort()))
-            liveMembers.add(FBUtilities.getBroadcastAddressAndPort());
+        if (!liveMembers.contains(getBroadcastAddressAndPort()))
+            liveMembers.add(getBroadcastAddressAndPort());
         return liveMembers;
     }
 
@@ -477,7 +496,7 @@
     {
         Long downtime = unreachableEndpoints.get(ep);
         if (downtime != null)
-            return TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - downtime);
+            return TimeUnit.NANOSECONDS.toMillis(nanoTime() - downtime);
         else
             return 0L;
     }
@@ -516,13 +535,17 @@
             return;
         }
 
-        ListenableFutureTask task = ListenableFutureTask.create(runnable, null);
+        FutureTask<?> task = new FutureTask<>(runnable);
         Stage.GOSSIP.execute(task);
         try
         {
             task.get();
         }
-        catch (InterruptedException | ExecutionException e)
+        catch (InterruptedException e)
+        {
+            throw new UncheckedInterruptedException(e);
+        }
+        catch (ExecutionException e)
         {
             throw new AssertionError(e);
         }
@@ -587,7 +610,7 @@
      * @param epState
      * @return
      */
-    int getMaxEndpointStateVersion(EndpointState epState)
+    static int getMaxEndpointStateVersion(EndpointState epState)
     {
         int maxVersion = epState.getHeartBeatState().getHeartBeatVersion();
         for (Map.Entry<ApplicationState, VersionedValue> state : epState.states())
@@ -632,6 +655,9 @@
                 logger.warn("Seeds list is now empty!");
         }
 
+        if (disableEndpointRemoval)
+            return;
+
         liveEndpoints.remove(endpoint);
         unreachableEndpoints.remove(endpoint);
         MessagingService.instance().versions.reset(endpoint);
@@ -642,6 +668,16 @@
         GossiperDiagnostics.removedEndpoint(this, endpoint);
     }
 
+    @VisibleForTesting
+    public void unsafeAnnulEndpoint(InetAddressAndPort endpoint)
+    {
+        removeEndpoint(endpoint);
+        justRemovedEndpoints.remove(endpoint);
+        endpointStateMap.remove(endpoint);
+        expireTimeEndpointMap.remove(endpoint);
+        unreachableEndpoints.remove(endpoint);
+    }
+
     /**
      * Quarantines the endpoint for QUARANTINE_DELAY
      *
@@ -649,7 +685,7 @@
      */
     private void quarantineEndpoint(InetAddressAndPort endpoint)
     {
-        quarantineEndpoint(endpoint, System.currentTimeMillis());
+        quarantineEndpoint(endpoint, currentTimeMillis());
     }
 
     /**
@@ -660,6 +696,8 @@
      */
     private void quarantineEndpoint(InetAddressAndPort endpoint, long quarantineExpiration)
     {
+        if (disableEndpointRemoval)
+            return;
         justRemovedEndpoints.put(endpoint, quarantineExpiration);
         GossiperDiagnostics.quarantinedEndpoint(this, endpoint, quarantineExpiration);
     }
@@ -671,8 +709,7 @@
     public void replacementQuarantine(InetAddressAndPort endpoint)
     {
         // remember, quarantineEndpoint will effectively already add QUARANTINE_DELAY, so this is 2x
-        logger.debug("");
-        quarantineEndpoint(endpoint, System.currentTimeMillis() + QUARANTINE_DELAY);
+        quarantineEndpoint(endpoint, currentTimeMillis() + QUARANTINE_DELAY);
         GossiperDiagnostics.replacementQuarantine(this, endpoint);
     }
 
@@ -743,8 +780,8 @@
         // remember this node's generation
         int generation = epState.getHeartBeatState().getGeneration();
         logger.info("Removing host: {}", hostId);
-        logger.info("Sleeping for {}ms to ensure {} does not change", StorageService.RING_DELAY, endpoint);
-        Uninterruptibles.sleepUninterruptibly(StorageService.RING_DELAY, TimeUnit.MILLISECONDS);
+        logger.info("Sleeping for {}ms to ensure {} does not change", StorageService.RING_DELAY_MILLIS, endpoint);
+        Uninterruptibles.sleepUninterruptibly(StorageService.RING_DELAY_MILLIS, TimeUnit.MILLISECONDS);
         // make sure it did not change
         epState = endpointStateMap.get(endpoint);
         if (epState.getHeartBeatState().getGeneration() != generation)
@@ -806,14 +843,14 @@
 
             if (epState == null)
             {
-                epState = new EndpointState(new HeartBeatState((int) ((System.currentTimeMillis() + 60000) / 1000), 9999));
+                epState = new EndpointState(new HeartBeatState((int) ((currentTimeMillis() + 60000) / 1000), 9999));
             }
             else
             {
                 int generation = epState.getHeartBeatState().getGeneration();
                 int heartbeat = epState.getHeartBeatState().getHeartBeatVersion();
-                logger.info("Sleeping for {}ms to ensure {} does not change", StorageService.RING_DELAY, endpoint);
-                Uninterruptibles.sleepUninterruptibly(StorageService.RING_DELAY, TimeUnit.MILLISECONDS);
+                logger.info("Sleeping for {}ms to ensure {} does not change", StorageService.RING_DELAY_MILLIS, endpoint);
+                Uninterruptibles.sleepUninterruptibly(StorageService.RING_DELAY_MILLIS, TimeUnit.MILLISECONDS);
                 // make sure it did not change
                 EndpointState newState = endpointStateMap.get(endpoint);
                 if (newState == null)
@@ -880,7 +917,7 @@
         if (logger.isTraceEnabled())
             logger.trace("Sending a GossipDigestSyn to {} ...", to);
         if (firstSynSendAt == 0)
-            firstSynSendAt = System.nanoTime();
+            firstSynSendAt = nanoTime();
         MessagingService.instance().send(message, to);
 
         boolean isSeed = seeds.contains(to);
@@ -921,7 +958,7 @@
         int size = seeds.size();
         if (size > 0)
         {
-            if (size == 1 && seeds.contains(FBUtilities.getBroadcastAddressAndPort()))
+            if (size == 1 && seeds.contains(getBroadcastAddressAndPort()))
             {
                 return;
             }
@@ -1014,10 +1051,10 @@
         if (logger.isTraceEnabled())
             logger.trace("Performing status check ...");
 
-        long now = System.currentTimeMillis();
-        long nowNano = System.nanoTime();
+        long now = currentTimeMillis();
+        long nowNano = nanoTime();
 
-        long pending = ((JMXEnabledThreadPoolExecutor) Stage.GOSSIP.executor()).metrics.pendingTasks.getValue();
+        long pending = Stage.GOSSIP.executor().getPendingTaskCount();
         if (pending > 0 && lastProcessedMessageAt < now - 1000)
         {
             // if some new messages just arrived, give the executor some time to work on them
@@ -1034,7 +1071,7 @@
         Set<InetAddressAndPort> eps = endpointStateMap.keySet();
         for (InetAddressAndPort endpoint : eps)
         {
-            if (endpoint.equals(FBUtilities.getBroadcastAddressAndPort()))
+            if (endpoint.equals(getBroadcastAddressAndPort()))
                 continue;
 
             FailureDetector.instance.interpret(endpoint);
@@ -1102,11 +1139,28 @@
         return endpointStateMap.get(ep);
     }
 
+    public EndpointState copyEndpointStateForEndpoint(InetAddressAndPort ep)
+    {
+        EndpointState epState = endpointStateMap.get(ep);
+        if (epState == null)
+            return null;
+        return new EndpointState(epState);
+    }
+
     public ImmutableSet<InetAddressAndPort> getEndpoints()
     {
         return ImmutableSet.copyOf(endpointStateMap.keySet());
     }
 
+    public String getForEndpoint(InetAddressAndPort ep, ApplicationState state)
+    {
+        EndpointState epState = endpointStateMap.get(ep);
+        if (epState == null)
+            return null;
+        VersionedValue value = epState.getApplicationState(state);
+        return value == null ? null : value.value;
+    }
+
     public int getEndpointCount()
     {
         return endpointStateMap.size();
@@ -1241,7 +1295,7 @@
         return ep1.getHeartBeatState().getGeneration() - ep2.getHeartBeatState().getGeneration();
     }
 
-    void notifyFailureDetector(Map<InetAddressAndPort, EndpointState> remoteEpStateMap)
+    public void notifyFailureDetector(Map<InetAddressAndPort, EndpointState> remoteEpStateMap)
     {
         for (Entry<InetAddressAndPort, EndpointState> entry : remoteEpStateMap.entrySet())
         {
@@ -1251,6 +1305,9 @@
 
     void notifyFailureDetector(InetAddressAndPort endpoint, EndpointState remoteEndpointState)
     {
+        if (remoteEndpointState == null)
+            return;
+
         EndpointState localEndpointState = endpointStateMap.get(endpoint);
         /*
          * If the local endpoint state exists then report to the FD only
@@ -1352,8 +1409,11 @@
     private void silentlyMarkDead(InetAddressAndPort addr, EndpointState localState)
     {
         localState.markDead();
-        liveEndpoints.remove(addr);
-        unreachableEndpoints.put(addr, System.nanoTime());
+        if (!disableEndpointRemoval)
+        {
+            liveEndpoints.remove(addr);
+            unreachableEndpoints.put(addr, nanoTime());
+        }
     }
 
     /**
@@ -1472,7 +1532,7 @@
         for (Entry<InetAddressAndPort, EndpointState> entry : epStateMap.entrySet())
         {
             InetAddressAndPort ep = entry.getKey();
-            if ( ep.equals(FBUtilities.getBroadcastAddressAndPort()) && !isInShadowRound())
+            if (ep.equals(getBroadcastAddressAndPort()) && !isInShadowRound())
                 continue;
             if (justRemovedEndpoints.containsKey(ep))
             {
@@ -1494,7 +1554,7 @@
             {
                 int localGeneration = localEpStatePtr.getHeartBeatState().getGeneration();
                 int remoteGeneration = remoteState.getHeartBeatState().getGeneration();
-                long localTime = System.currentTimeMillis()/1000;
+                long localTime = currentTimeMillis() / 1000;
                 if (logger.isTraceEnabled())
                     logger.trace("{} local generation {}, remote generation {}", ep, localGeneration, remoteGeneration);
 
@@ -1574,12 +1634,33 @@
         if (!hasMajorVersion3Nodes())
             localState.removeMajorVersion3LegacyApplicationStates();
 
+        // need to run STATUS or STATUS_WITH_PORT first to handle BOOT_REPLACE correctly (else won't be a member, so TOKENS won't be processed)
         for (Entry<ApplicationState, VersionedValue> updatedEntry : updatedStates)
         {
+            switch (updatedEntry.getKey())
+            {
+                default:
+                    continue;
+                case STATUS:
+                    if (localState.containsApplicationState(ApplicationState.STATUS_WITH_PORT))
+                        continue;
+                case STATUS_WITH_PORT:
+            }
+            doOnChangeNotifications(addr, updatedEntry.getKey(), updatedEntry.getValue());
+        }
+
+        for (Entry<ApplicationState, VersionedValue> updatedEntry : updatedStates)
+        {
+            switch (updatedEntry.getKey())
+            {
+                // We should have alredy handled these two states above:
+                case STATUS_WITH_PORT:
+                case STATUS:
+                    continue;
+            }
             // filters out legacy change notifications
             // only if local state already indicates that the peer has the new fields
             if ((ApplicationState.INTERNAL_IP == updatedEntry.getKey() && localState.containsApplicationState(ApplicationState.INTERNAL_ADDRESS_AND_PORT))
-                ||(ApplicationState.STATUS == updatedEntry.getKey() && localState.containsApplicationState(ApplicationState.STATUS_WITH_PORT))
                 || (ApplicationState.RPC_ADDRESS == updatedEntry.getKey() && localState.containsApplicationState(ApplicationState.NATIVE_ADDRESS_AND_PORT)))
                 continue;
             doOnChangeNotifications(addr, updatedEntry.getKey(), updatedEntry.getValue());
@@ -1596,7 +1677,7 @@
     }
 
     // notify that an application state has changed
-    private void doOnChangeNotifications(InetAddressAndPort addr, ApplicationState state, VersionedValue value)
+    public void doOnChangeNotifications(InetAddressAndPort addr, ApplicationState state, VersionedValue value)
     {
         for (IEndpointStateChangeSubscriber subscriber : subscribers)
         {
@@ -1758,7 +1839,7 @@
         buildSeedsList();
         /* initialize the heartbeat state for this localEndpoint */
         maybeInitializeLocalState(generationNbr);
-        EndpointState localState = endpointStateMap.get(FBUtilities.getBroadcastAddressAndPort());
+        EndpointState localState = endpointStateMap.get(getBroadcastAddressAndPort());
         localState.addApplicationStates(preloadLocalStates);
         minVersionSupplier.recompute();
 
@@ -1805,17 +1886,15 @@
         if (seeds.isEmpty() && peers.isEmpty())
             return endpointShadowStateMap;
 
-        boolean isSeed = DatabaseDescriptor.getSeeds().contains(FBUtilities.getBroadcastAddressAndPort());
+        boolean isSeed = DatabaseDescriptor.getSeeds().contains(getBroadcastAddressAndPort());
         // We double RING_DELAY if we're not a seed to increase chance of successful startup during a full cluster bounce,
         // giving the seeds a chance to startup before we fail the shadow round
-        int shadowRoundDelay =  isSeed ? StorageService.RING_DELAY : StorageService.RING_DELAY * 2;
+        int shadowRoundDelay = isSeed ? StorageService.RING_DELAY_MILLIS : StorageService.RING_DELAY_MILLIS * 2;
         seedsInShadowRound.clear();
         endpointShadowStateMap.clear();
         // send a completely empty syn
         List<GossipDigest> gDigests = new ArrayList<>();
-        GossipDigestSyn digestSynMessage = new GossipDigestSyn(DatabaseDescriptor.getClusterName(),
-                DatabaseDescriptor.getPartitionerName(),
-                gDigests);
+        GossipDigestSyn digestSynMessage = new GossipDigestSyn(getClusterName(), getPartitionerName(), gDigests);
         Message<GossipDigestSyn> message = Message.out(GOSSIP_DIGEST_SYN, digestSynMessage);
 
         inShadowRound = true;
@@ -1858,9 +1937,9 @@
                 }
             }
         }
-        catch (InterruptedException wtf)
+        catch (InterruptedException e)
         {
-            throw new RuntimeException(wtf);
+            throw new UncheckedInterruptedException(e);
         }
 
         return ImmutableMap.copyOf(endpointShadowStateMap);
@@ -1871,7 +1950,7 @@
     {
         for (InetAddressAndPort seed : DatabaseDescriptor.getSeeds())
         {
-            if (seed.equals(FBUtilities.getBroadcastAddressAndPort()))
+            if (seed.equals(getBroadcastAddressAndPort()))
                 continue;
             seeds.add(seed);
         }
@@ -1890,7 +1969,7 @@
         {
             for (InetAddressAndPort seed : DatabaseDescriptor.getSeeds())
             {
-                if (seed.equals(FBUtilities.getBroadcastAddressAndPort()))
+                if (seed.equals(getBroadcastAddressAndPort()))
                     continue;
                 tmp.add(seed);
             }
@@ -1944,12 +2023,12 @@
         HeartBeatState hbState = new HeartBeatState(generationNbr);
         EndpointState localState = new EndpointState(hbState);
         localState.markAlive();
-        endpointStateMap.putIfAbsent(FBUtilities.getBroadcastAddressAndPort(), localState);
+        endpointStateMap.putIfAbsent(getBroadcastAddressAndPort(), localState);
     }
 
     public void forceNewerGeneration()
     {
-        EndpointState epstate = endpointStateMap.get(FBUtilities.getBroadcastAddressAndPort());
+        EndpointState epstate = endpointStateMap.get(getBroadcastAddressAndPort());
         epstate.getHeartBeatState().forceNewerGenerationUnsafe();
     }
 
@@ -1960,7 +2039,7 @@
     public void addSavedEndpoint(InetAddressAndPort ep)
     {
         checkProperThreadForStateMutation();
-        if (ep.equals(FBUtilities.getBroadcastAddressAndPort()))
+        if (ep.equals(getBroadcastAddressAndPort()))
         {
             logger.debug("Attempt to add self as saved endpoint");
             return;
@@ -1989,7 +2068,7 @@
     private void addLocalApplicationStateInternal(ApplicationState state, VersionedValue value)
     {
         assert taskLock.isHeldByCurrentThread();
-        InetAddressAndPort epAddr = FBUtilities.getBroadcastAddressAndPort();
+        InetAddressAndPort epAddr = getBroadcastAddressAndPort();
         EndpointState epState = endpointStateMap.get(epAddr);
         assert epState != null : "Can't find endpoint state for " + epAddr;
         // Fire "before change" notifications:
@@ -2027,7 +2106,7 @@
 
     public void stop()
     {
-        EndpointState mystate = endpointStateMap.get(FBUtilities.getBroadcastAddressAndPort());
+        EndpointState mystate = endpointStateMap.get(getBroadcastAddressAndPort());
         if (mystate != null && !isSilentShutdownState(mystate) && StorageService.instance.isJoined())
         {
             logger.info("Announcing shutdown");
@@ -2036,7 +2115,7 @@
             Message message = Message.out(Verb.GOSSIP_SHUTDOWN, noPayload);
             for (InetAddressAndPort ep : liveEndpoints)
                 MessagingService.instance().send(message, ep);
-            Uninterruptibles.sleepUninterruptibly(Integer.getInteger("cassandra.shutdown_announce_in_ms", 2000), TimeUnit.MILLISECONDS);
+            Uninterruptibles.sleepUninterruptibly(SHUTDOWN_ANNOUNCE_DELAY_IN_MS.getInt(), TimeUnit.MILLISECONDS);
         }
         else
             logger.warn("No local state, state is in silent shutdown, or node hasn't joined, not announcing shutdown");
@@ -2098,7 +2177,7 @@
         }
     }
 
-    protected boolean isInShadowRound()
+    public boolean isInShadowRound()
     {
         return inShadowRound;
     }
@@ -2141,6 +2220,9 @@
         Map<ApplicationState, VersionedValue> states = new EnumMap<>(ApplicationState.class);
         states.put(ApplicationState.NET_VERSION, StorageService.instance.valueFactory.networkVersion(netVersion));
         states.put(ApplicationState.HOST_ID, StorageService.instance.valueFactory.hostId(uuid));
+        states.put(ApplicationState.RPC_ADDRESS, StorageService.instance.valueFactory.rpcaddress(addr.getAddress()));
+        states.put(ApplicationState.INTERNAL_ADDRESS_AND_PORT, StorageService.instance.valueFactory.internalAddressAndPort(addr));
+        states.put(ApplicationState.RELEASE_VERSION, StorageService.instance.valueFactory.releaseVersion());
         localState.addApplicationStates(states);
     }
 
@@ -2172,7 +2254,7 @@
 
     public static long computeExpireTime()
     {
-        return System.currentTimeMillis() + Gossiper.aVeryLongTime;
+        return currentTimeMillis() + aVeryLongTime;
     }
 
     @Nullable
@@ -2212,7 +2294,7 @@
 
     public static void waitToSettle()
     {
-        int forceAfter = Integer.getInteger("cassandra.skip_wait_for_gossip_to_settle", -1);
+        int forceAfter = GOSSIPER_SKIP_WAITING_TO_SETTLE.getInt();
         if (forceAfter == 0)
         {
             return;
@@ -2300,11 +2382,20 @@
      */
     public boolean isUpgradingFromVersionLowerThan(CassandraVersion referenceVersion)
     {
-        CassandraVersion v = upgradeFromVersionMemoized.get();
-        if (SystemKeyspace.NULL_VERSION.equals(v) && scheduledGossipTask == null)
-            return false;
+        return isUpgradingFromVersionLowerThanC17653(referenceVersion).left;
+    }
 
-        return v != null && v.compareTo(referenceVersion) < 0;
+    /* TODO: Aux method for debug purposes on fixing C17653. To be removed*/
+    @VisibleForTesting
+    public Pair<Boolean, CassandraVersion> isUpgradingFromVersionLowerThanC17653(CassandraVersion referenceVersion)
+    {
+        CassandraVersion v = upgradeFromVersionMemoized.get();
+        if (CassandraVersion.NULL_VERSION.equals(v) && scheduledGossipTask == null)
+            return Pair.create(false, v);
+
+        boolean res = v != null && v.compareTo(referenceVersion) < 0;
+
+        return Pair.create(res, v);
     }
 
     private boolean nodesAgreeOnSchema(Collection<InetAddressAndPort> nodes)
@@ -2369,7 +2460,7 @@
         CassandraVersion minVersion = null;
 
         for (InetAddressAndPort addr : Iterables.concat(Gossiper.instance.getLiveMembers(),
-                                                 Gossiper.instance.getUnreachableMembers()))
+                                                        Gossiper.instance.getUnreachableMembers()))
         {
             String versionString = getReleaseVersionString(addr);
             // Raced with changes to gossip state, wait until next iteration
@@ -2398,4 +2489,71 @@
 
         return minVersion;
     }
+
+    public void unsafeSetEnabled()
+    {
+        scheduledGossipTask = new NotScheduledFuture<>();
+        firstSynSendAt = 1;
+    }
+
+    public Collection<InetAddressAndPort> unsafeClearRemoteState()
+    {
+        List<InetAddressAndPort> removed = new ArrayList<>();
+        for (InetAddressAndPort ep : endpointStateMap.keySet())
+        {
+            if (ep.equals(getBroadcastAddressAndPort()))
+                continue;
+
+            for (IEndpointStateChangeSubscriber subscriber : subscribers)
+                subscriber.onRemove(ep);
+
+            removed.add(ep);
+        }
+        this.endpointStateMap.keySet().retainAll(Collections.singleton(getBroadcastAddressAndPort()));
+        this.endpointShadowStateMap.keySet().retainAll(Collections.singleton(getBroadcastAddressAndPort()));
+        this.expireTimeEndpointMap.keySet().retainAll(Collections.singleton(getBroadcastAddressAndPort()));
+        this.justRemovedEndpoints.keySet().retainAll(Collections.singleton(getBroadcastAddressAndPort()));
+        this.unreachableEndpoints.keySet().retainAll(Collections.singleton(getBroadcastAddressAndPort()));
+        return removed;
+    }
+
+    public void unsafeGossipWith(InetAddressAndPort ep)
+    {
+        /* Update the local heartbeat counter. */
+        EndpointState epState = endpointStateMap.get(getBroadcastAddressAndPort());
+        if (epState != null)
+        {
+            epState.getHeartBeatState().updateHeartBeat();
+            if (logger.isTraceEnabled())
+                logger.trace("My heartbeat is now {}", epState.getHeartBeatState().getHeartBeatVersion());
+        }
+
+        final List<GossipDigest> gDigests = new ArrayList<GossipDigest>();
+        Gossiper.instance.makeGossipDigest(gDigests);
+
+        GossipDigestSyn digestSynMessage = new GossipDigestSyn(getClusterName(),
+                getPartitionerName(),
+                gDigests);
+        Message<GossipDigestSyn> message = Message.out(GOSSIP_DIGEST_SYN, digestSynMessage);
+
+        MessagingService.instance().send(message, ep);
+    }
+
+    public void unsafeSendShutdown(InetAddressAndPort to)
+    {
+        Message<?> message = Message.out(Verb.GOSSIP_SHUTDOWN, noPayload);
+        MessagingService.instance().send(message, to);
+    }
+
+    public void unsafeSendLocalEndpointStateTo(InetAddressAndPort ep)
+    {
+        /* Update the local heartbeat counter. */
+        EndpointState epState = endpointStateMap.get(getBroadcastAddressAndPort());
+        if (epState == null)
+            throw new IllegalStateException();
+
+        GossipDigestAck2 digestAck2Message = new GossipDigestAck2(Collections.singletonMap(getBroadcastAddressAndPort(), epState));
+        Message<GossipDigestAck2> message = Message.out(Verb.GOSSIP_DIGEST_ACK2, digestAck2Message);
+        MessagingService.instance().send(message, ep);
+    }
 }
diff --git a/src/java/org/apache/cassandra/gms/GossiperDiagnostics.java b/src/java/org/apache/cassandra/gms/GossiperDiagnostics.java
index 57552cc..13f8647 100644
--- a/src/java/org/apache/cassandra/gms/GossiperDiagnostics.java
+++ b/src/java/org/apache/cassandra/gms/GossiperDiagnostics.java
@@ -110,4 +110,4 @@
     {
         return service.isEnabled(GossiperEvent.class, type);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/gms/GossiperEvent.java b/src/java/org/apache/cassandra/gms/GossiperEvent.java
index 4ec0cf4..71fee7c 100644
--- a/src/java/org/apache/cassandra/gms/GossiperEvent.java
+++ b/src/java/org/apache/cassandra/gms/GossiperEvent.java
@@ -108,4 +108,4 @@
         ret.put("unreachableEndpoints", String.valueOf(unreachableEndpoints));
         return ret;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/gms/GossiperMBean.java b/src/java/org/apache/cassandra/gms/GossiperMBean.java
index 92df2cd..47d7207 100644
--- a/src/java/org/apache/cassandra/gms/GossiperMBean.java
+++ b/src/java/org/apache/cassandra/gms/GossiperMBean.java
@@ -38,4 +38,4 @@
     /** Returns each node's database release version */
     public Map<String, List<String>> getReleaseVersionsWithPort();
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/gms/HeartBeatState.java b/src/java/org/apache/cassandra/gms/HeartBeatState.java
index 75f4f56..3f633cb 100644
--- a/src/java/org/apache/cassandra/gms/HeartBeatState.java
+++ b/src/java/org/apache/cassandra/gms/HeartBeatState.java
@@ -19,6 +19,8 @@
 
 import java.io.*;
 
+import com.google.common.annotations.VisibleForTesting;
+
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
@@ -27,6 +29,7 @@
 /**
  * HeartBeat State associated with any given endpoint.
  */
+
 public class HeartBeatState
 {
     public static final int EMPTY_VERSION = -1;
@@ -67,7 +70,7 @@
         return version == EMPTY_VERSION;
     }
 
-    int getGeneration()
+    public int getGeneration()
     {
         return generation;
     }
@@ -77,7 +80,7 @@
         version = VersionGenerator.getNextVersion();
     }
 
-    int getHeartBeatVersion()
+    public int getHeartBeatVersion()
     {
         return version;
     }
@@ -87,7 +90,8 @@
         generation += 1;
     }
 
-    void forceHighestPossibleVersionUnsafe()
+    @VisibleForTesting
+    public void forceHighestPossibleVersionUnsafe()
     {
         version = Integer.MAX_VALUE;
     }
diff --git a/src/java/org/apache/cassandra/gms/TokenSerializer.java b/src/java/org/apache/cassandra/gms/TokenSerializer.java
index 40d14f8..0048e7c 100644
--- a/src/java/org/apache/cassandra/gms/TokenSerializer.java
+++ b/src/java/org/apache/cassandra/gms/TokenSerializer.java
@@ -30,7 +30,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 
-
 public class TokenSerializer
 {
     private static final Logger logger = LoggerFactory.getLogger(TokenSerializer.class);
@@ -62,4 +61,4 @@
         }
         return tokens;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/gms/VersionedValue.java b/src/java/org/apache/cassandra/gms/VersionedValue.java
index 880cb98..26644e1 100644
--- a/src/java/org/apache/cassandra/gms/VersionedValue.java
+++ b/src/java/org/apache/cassandra/gms/VersionedValue.java
@@ -172,6 +172,11 @@
             return new VersionedValue(String.valueOf(load));
         }
 
+        public VersionedValue diskUsage(String state)
+        {
+            return new VersionedValue(state);
+        }
+
         public VersionedValue schema(UUID newVersion)
         {
             return new VersionedValue(newVersion.toString());
@@ -190,6 +195,14 @@
                                                     Long.toString(expireTime)));
         }
 
+        @VisibleForTesting
+        public VersionedValue left(Collection<Token> tokens, long expireTime, int generation)
+        {
+            return new VersionedValue(versionString(VersionedValue.STATUS_LEFT,
+                                                    makeTokenString(tokens),
+                                                    Long.toString(expireTime)), generation);
+        }
+
         public VersionedValue moving(Token token)
         {
             return new VersionedValue(VersionedValue.STATUS_MOVING + VersionedValue.DELIMITER + partitioner.getTokenFactory().toString(token));
diff --git a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java
index f01197d..cc539b1 100644
--- a/src/java/org/apache/cassandra/hadoop/ConfigHelper.java
+++ b/src/java/org/apache/cassandra/hadoop/ConfigHelper.java
@@ -45,7 +45,7 @@
     private static final String INPUT_PREDICATE_CONFIG = "cassandra.input.predicate";
     private static final String INPUT_KEYRANGE_CONFIG = "cassandra.input.keyRange";
     private static final String INPUT_SPLIT_SIZE_CONFIG = "cassandra.input.split.size";
-    private static final String INPUT_SPLIT_SIZE_IN_MB_CONFIG = "cassandra.input.split.size_mb";
+    private static final String INPUT_SPLIT_SIZE_IN_MIB_CONFIG = "cassandra.input.split.size_mb";
     private static final String INPUT_WIDEROWS_CONFIG = "cassandra.input.widerows";
     private static final int DEFAULT_SPLIT_SIZE = 64 * 1024;
     private static final String RANGE_BATCH_SIZE_CONFIG = "cassandra.range.batch.size";
@@ -185,21 +185,21 @@
      * the overhead of each map will take up the bulk of the job time.
      *
      * @param conf          Job configuration you are about to run
-     * @param splitSizeMb   Input split size in MB
+     * @param splitSizeMb   Input split size in MiB
      */
     public static void setInputSplitSizeInMb(Configuration conf, int splitSizeMb)
     {
-        conf.setInt(INPUT_SPLIT_SIZE_IN_MB_CONFIG, splitSizeMb);
+        conf.setInt(INPUT_SPLIT_SIZE_IN_MIB_CONFIG, splitSizeMb);
     }
 
     /**
      * cassandra.input.split.size will be used if the value is undefined or negative.
      * @param conf  Job configuration you are about to run
-     * @return      split size in MB or -1 if it is undefined.
+     * @return      split size in MiB or -1 if it is undefined.
      */
     public static int getInputSplitSizeInMb(Configuration conf)
     {
-        return conf.getInt(INPUT_SPLIT_SIZE_IN_MB_CONFIG, -1);
+        return conf.getInt(INPUT_SPLIT_SIZE_IN_MIB_CONFIG, -1);
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java
index 45ffa4e..82d5e8a 100644
--- a/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java
+++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlBulkRecordWriter.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.hadoop.cql3;
 
 import java.io.Closeable;
-import java.io.File;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
@@ -28,6 +27,7 @@
 import java.util.concurrent.*;
 
 import com.google.common.net.HostAndPort;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -169,7 +169,7 @@
                                      .using(insertStatement)
                                      .withPartitioner(ConfigHelper.getOutputPartitioner(conf))
                                      .inDirectory(outputDir)
-                                     .withBufferSizeInMB(Integer.parseInt(conf.get(BUFFER_SIZE_IN_MB, "64")))
+                                     .withBufferSizeInMiB(Integer.parseInt(conf.get(BUFFER_SIZE_IN_MB, "64")))
                                      .withPartitioner(partitioner)
                                      .build();
         }
@@ -226,9 +226,9 @@
     
     private File getTableDirectory() throws IOException
     {
-        File dir = new File(String.format("%s%s%s%s%s-%s", getOutputLocation(), File.separator, keyspace, File.separator, table, UUID.randomUUID().toString()));
+        File dir = new File(String.format("%s%s%s%s%s-%s", getOutputLocation(), File.pathSeparator(), keyspace, File.pathSeparator(), table, UUID.randomUUID().toString()));
         
-        if (!dir.exists() && !dir.mkdirs())
+        if (!dir.exists() && !dir.tryCreateDirectories())
         {
             throw new IOException("Failed to created output directory: " + dir);
         }
diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java
index f9a6f3a..998a754 100644
--- a/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java
+++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlConfigHelper.java
@@ -20,7 +20,6 @@
 *
 */
 import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.io.InputStream;
 import java.io.IOException;
 import java.security.KeyManagementException;
@@ -52,6 +51,7 @@
 import com.datastax.driver.core.SSLOptions;
 import com.datastax.driver.core.SocketOptions;
 import org.apache.cassandra.hadoop.ConfigHelper;
+import org.apache.cassandra.io.util.File;
 import org.apache.hadoop.conf.Configuration;
 
 
@@ -625,7 +625,7 @@
         TrustManagerFactory tmf = null;
         if (truststorePath.isPresent())
         {
-            try (InputStream tsf = Files.newInputStream(Paths.get(truststorePath.get())))
+            try (InputStream tsf = Files.newInputStream(File.getPath(truststorePath.get())))
             {
                 KeyStore ts = KeyStore.getInstance("JKS");
                 ts.load(tsf, truststorePassword.isPresent() ? truststorePassword.get().toCharArray() : null);
@@ -637,7 +637,7 @@
         KeyManagerFactory kmf = null;
         if (keystorePath.isPresent())
         {
-            try (InputStream ksf = Files.newInputStream(Paths.get(keystorePath.get())))
+            try (InputStream ksf = Files.newInputStream(File.getPath(keystorePath.get())))
             {
                 KeyStore ks = KeyStore.getInstance("JKS");
                 ks.load(ksf, keystorePassword.isPresent() ? keystorePassword.get().toCharArray() : null);
diff --git a/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java b/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java
index 1ea8eda..0755684 100644
--- a/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java
+++ b/src/java/org/apache/cassandra/hadoop/cql3/CqlInputFormat.java
@@ -54,7 +54,8 @@
 import org.apache.cassandra.hadoop.*;
 import org.apache.cassandra.utils.*;
 
-import static java.util.stream.Collectors.toMap;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * Hadoop InputFormat allowing map/reduce against Cassandra rows within one ColumnFamily.
@@ -135,7 +136,7 @@
         logger.trace("partitioner is {}", partitioner);
 
         // canonical ranges, split into pieces, fetching the splits in parallel
-        ExecutorService executor = new ThreadPoolExecutor(0, 128, 60L, TimeUnit.SECONDS, new LinkedBlockingQueue<Runnable>());
+        ExecutorService executor = executorFactory().pooled("HadoopInput", 128);
         List<org.apache.hadoop.mapreduce.InputSplit> splits = new ArrayList<>();
 
         String[] inputInitialAddress = ConfigHelper.getInputInitialAddress(conf).split(",");
@@ -242,7 +243,7 @@
         }
 
         assert splits.size() > 0;
-        Collections.shuffle(splits, new Random(System.nanoTime()));
+        Collections.shuffle(splits, new Random(nanoTime()));
         return splits;
     }
 
@@ -329,8 +330,8 @@
     private Map<TokenRange, Long> getSubSplits(String keyspace, String cfName, TokenRange range, Host host, Configuration conf, Session session)
     {
         int splitSize = ConfigHelper.getInputSplitSize(conf);
-        int splitSizeMb = ConfigHelper.getInputSplitSizeInMb(conf);
-        return describeSplits(keyspace, cfName, range, host, splitSize, splitSizeMb, session);
+        int splitSizeMiB = ConfigHelper.getInputSplitSizeInMb(conf);
+        return describeSplits(keyspace, cfName, range, host, splitSize, splitSizeMiB, session);
     }
 
     private static Map<TokenRange, List<Host>> getRangeMap(String keyspace, Metadata metadata, String targetDC)
diff --git a/src/java/org/apache/cassandra/hadoop/package-info.java b/src/java/org/apache/cassandra/hadoop/package-info.java
new file mode 100644
index 0000000..835165b
--- /dev/null
+++ b/src/java/org/apache/cassandra/hadoop/package-info.java
@@ -0,0 +1,23 @@
+/*
+ * 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.
+ */
+
+/**
+ * This package was deprecated. See CASSANDRA-16984.
+ */
+@Deprecated
+package org.apache.cassandra.hadoop;
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java b/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java
index e6e8b38..339e45e 100644
--- a/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java
+++ b/src/java/org/apache/cassandra/hints/ChecksummedDataInput.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.zip.CRC32;
@@ -26,7 +25,6 @@
 
 import org.apache.cassandra.io.compress.BufferType;
 import org.apache.cassandra.io.util.*;
-import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Throwables;
 import org.apache.cassandra.utils.NativeLibrary;
 
diff --git a/src/java/org/apache/cassandra/hints/CompressedHintsWriter.java b/src/java/org/apache/cassandra/hints/CompressedHintsWriter.java
index 8792e32..63a59cd 100644
--- a/src/java/org/apache/cassandra/hints/CompressedHintsWriter.java
+++ b/src/java/org/apache/cassandra/hints/CompressedHintsWriter.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
@@ -28,6 +27,8 @@
 
 import org.apache.cassandra.io.compress.ICompressor;
 
+import org.apache.cassandra.io.util.File;
+
 public class CompressedHintsWriter extends HintsWriter
 {
     // compressed and uncompressed size is stored at the beginning of each compressed block
diff --git a/src/java/org/apache/cassandra/hints/EncryptedHintsWriter.java b/src/java/org/apache/cassandra/hints/EncryptedHintsWriter.java
index 4786d9c..f9822d9 100644
--- a/src/java/org/apache/cassandra/hints/EncryptedHintsWriter.java
+++ b/src/java/org/apache/cassandra/hints/EncryptedHintsWriter.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
@@ -26,6 +25,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.security.EncryptionUtils;
 import org.apache.cassandra.io.compress.ICompressor;
 
diff --git a/src/java/org/apache/cassandra/hints/Hint.java b/src/java/org/apache/cassandra/hints/Hint.java
index 6c7c5d4..3089894 100644
--- a/src/java/org/apache/cassandra/hints/Hint.java
+++ b/src/java/org/apache/cassandra/hints/Hint.java
@@ -19,7 +19,6 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.base.Throwables;
@@ -34,10 +33,14 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.utils.concurrent.Future;
+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.db.TypeSizes.sizeof;
 import static org.apache.cassandra.db.TypeSizes.sizeofUnsignedVInt;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * Encapsulates the hinted mutation, its creation time, and the gc grace seconds param for each table involved.
@@ -92,7 +95,7 @@
     /**
      * Applies the contained mutation unless it's expired, filtering out any updates for truncated tables
      */
-    CompletableFuture<?> applyFuture()
+    Future<?> applyFuture()
     {
         if (isLive())
         {
@@ -106,7 +109,7 @@
                 return filtered.applyFuture();
         }
 
-        return CompletableFuture.completedFuture(null);
+        return ImmediateFuture.success(null);
     }
 
     void apply()
@@ -134,13 +137,24 @@
      */
     public boolean isLive()
     {
-        return isLive(creationTime, System.currentTimeMillis(), ttl());
+        return isLive(creationTime, currentTimeMillis(), ttl());
     }
 
     static boolean isLive(long creationTime, long now, int hintTTL)
     {
-        long expirationTime = creationTime + TimeUnit.SECONDS.toMillis(Math.min(hintTTL, maxHintTTL));
-        return expirationTime > now;
+        return expirationInMillis(creationTime, hintTTL) > now;
+    }
+
+    @VisibleForTesting
+    long expirationInMillis()
+    {
+        int smallestGCGS = Math.min(gcgs, mutation.smallestGCGS());
+        return expirationInMillis(creationTime, smallestGCGS);
+    }
+
+    private static long expirationInMillis(long creationTime, int hintTTL)
+    {
+        return creationTime + TimeUnit.SECONDS.toMillis(Math.min(hintTTL, maxHintTTL));
     }
 
     static final class Serializer implements IVersionedSerializer<Hint>
diff --git a/src/java/org/apache/cassandra/hints/HintDiagnostics.java b/src/java/org/apache/cassandra/hints/HintDiagnostics.java
index 3ff0834..285193b 100644
--- a/src/java/org/apache/cassandra/hints/HintDiagnostics.java
+++ b/src/java/org/apache/cassandra/hints/HintDiagnostics.java
@@ -82,4 +82,4 @@
         return service.isEnabled(HintEvent.class, type);
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/hints/HintEvent.java b/src/java/org/apache/cassandra/hints/HintEvent.java
index d8b6943..695357e 100644
--- a/src/java/org/apache/cassandra/hints/HintEvent.java
+++ b/src/java/org/apache/cassandra/hints/HintEvent.java
@@ -99,4 +99,4 @@
         }
         return ret;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/hints/HintVerbHandler.java b/src/java/org/apache/cassandra/hints/HintVerbHandler.java
index 2fbe475..e6758d0 100644
--- a/src/java/org/apache/cassandra/hints/HintVerbHandler.java
+++ b/src/java/org/apache/cassandra/hints/HintVerbHandler.java
@@ -94,7 +94,7 @@
         else
         {
             // the common path - the node is both the destination and a valid replica for the hint.
-            hint.applyFuture().thenAccept(o -> respond(message)).exceptionally(e -> {logger.debug("Failed to apply hint", e); return null;});
+            hint.applyFuture().addCallback(o -> respond(message), e -> logger.debug("Failed to apply hint", e));
         }
     }
 
diff --git a/src/java/org/apache/cassandra/hints/HintsBuffer.java b/src/java/org/apache/cassandra/hints/HintsBuffer.java
index d944b4d..d6dcfb3 100644
--- a/src/java/org/apache/cassandra/hints/HintsBuffer.java
+++ b/src/java/org/apache/cassandra/hints/HintsBuffer.java
@@ -26,11 +26,13 @@
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.zip.CRC32;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.io.util.DataOutputBufferFixed;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.utils.AbstractIterator;
+import org.apache.cassandra.utils.Clock;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 
 import static org.apache.cassandra.utils.FBUtilities.updateChecksum;
@@ -58,6 +60,7 @@
 
     private final ConcurrentMap<UUID, Queue<Integer>> offsets;
     private final OpOrder appendOrder;
+    private final ConcurrentMap<UUID, Long> earliestHintByHost; // Stores time of the earliest hint in the buffer for each host
 
     private HintsBuffer(ByteBuffer slab)
     {
@@ -66,6 +69,7 @@
         position = new AtomicLong();
         offsets = new ConcurrentHashMap<>();
         appendOrder = new OpOrder();
+        earliestHintByHost = new ConcurrentHashMap<>();
     }
 
     static HintsBuffer create(int slabSize)
@@ -141,6 +145,21 @@
         };
     }
 
+    /**
+     * Retrieve the time of the earliest hint in the buffer for a specific node
+     * @param hostId UUID of the node
+     * @return timestamp for the earliest hint in the buffer, or {@link Global#currentTimeMillis()}
+     */
+    long getEarliestHintTime(UUID hostId)
+    {
+        return earliestHintByHost.getOrDefault(hostId, Clock.Global.currentTimeMillis());
+    }
+
+    void clearEarliestHintForHostId(UUID hostId)
+    {
+        earliestHintByHost.remove(hostId);
+    }
+
     @SuppressWarnings("resource")
     Allocation allocate(int hintSize)
     {
@@ -222,8 +241,15 @@
         void write(Iterable<UUID> hostIds, Hint hint)
         {
             write(hint);
+            long ts = Clock.Global.currentTimeMillis();
             for (UUID hostId : hostIds)
+            {
+                // We only need the time of the first hint in the buffer
+                if (DatabaseDescriptor.hintWindowPersistentEnabled())
+                    earliestHintByHost.putIfAbsent(hostId, ts);
+
                 put(hostId, offset);
+            }
         }
 
         public void close()
diff --git a/src/java/org/apache/cassandra/hints/HintsBufferPool.java b/src/java/org/apache/cassandra/hints/HintsBufferPool.java
index 7f66efd..78f07dd 100644
--- a/src/java/org/apache/cassandra/hints/HintsBufferPool.java
+++ b/src/java/org/apache/cassandra/hints/HintsBufferPool.java
@@ -18,12 +18,15 @@
 package org.apache.cassandra.hints;
 
 import java.io.Closeable;
+import java.util.Iterator;
 import java.util.UUID;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
 
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 /**
  * A primitive pool of {@link HintsBuffer} buffers. Under normal conditions should only hold two buffers - the currently
@@ -45,7 +48,7 @@
 
     HintsBufferPool(int bufferSize, FlushCallback flushCallback)
     {
-        reserveBuffers = new LinkedBlockingQueue<>();
+        reserveBuffers = newBlockingQueue();
         this.bufferSize = bufferSize;
         this.flushCallback = flushCallback;
     }
@@ -63,6 +66,22 @@
         }
     }
 
+    /**
+     * Get the earliest hint for a specific node from all buffers
+     * @param hostId UUID of the node
+     * @return timestamp for the earliest hint
+     */
+    long getEarliestHintForHost(UUID hostId)
+    {
+        long min = currentBuffer().getEarliestHintTime(hostId);
+        Iterator<HintsBuffer> it = reserveBuffers.iterator();
+
+        while (it.hasNext())
+            min = Math.min(min, it.next().getEarliestHintTime(hostId));
+
+        return min;
+    }
+
     private HintsBuffer.Allocation allocate(int hintSize)
     {
         HintsBuffer current = currentBuffer();
@@ -117,7 +136,7 @@
             }
             catch (InterruptedException e)
             {
-                throw new RuntimeException(e);
+                throw new UncheckedInterruptedException(e);
             }
         }
         currentBuffer = buffer == null ? createBuffer() : buffer;
diff --git a/src/java/org/apache/cassandra/hints/HintsCatalog.java b/src/java/org/apache/cassandra/hints/HintsCatalog.java
index 81ec98e..859252f 100644
--- a/src/java/org/apache/cassandra/hints/HintsCatalog.java
+++ b/src/java/org/apache/cassandra/hints/HintsCatalog.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -27,6 +26,7 @@
 import javax.annotation.Nullable;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -34,7 +34,6 @@
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.NativeLibrary;
 import org.apache.cassandra.utils.SyncUtil;
 
@@ -148,7 +147,7 @@
 
     void fsyncDirectory()
     {
-        int fd = NativeLibrary.tryOpenDirectory(hintsDirectory.getAbsolutePath());
+        int fd = NativeLibrary.tryOpenDirectory(hintsDirectory.absolutePath());
         if (fd != -1)
         {
             try
@@ -158,14 +157,14 @@
             }
             catch (FSError e) // trySync failed
             {
-                logger.error("Unable to sync directory {}", hintsDirectory.getAbsolutePath(), e);
+                logger.error("Unable to sync directory {}", hintsDirectory.absolutePath(), e);
                 FileUtils.handleFSErrorAndPropagate(e);
             }
         }
-        else if (!FBUtilities.isWindows)
+        else
         {
-            logger.error("Unable to open directory {}", hintsDirectory.getAbsolutePath());
-            FileUtils.handleFSErrorAndPropagate(new FSWriteError(new IOException(String.format("Unable to open hint directory %s", hintsDirectory.getAbsolutePath())), hintsDirectory.getAbsolutePath()));
+            logger.error("Unable to open directory {}", hintsDirectory.absolutePath());
+            FileUtils.handleFSErrorAndPropagate(new FSWriteError(new IOException(String.format("Unable to open hint directory %s", hintsDirectory.absolutePath())), hintsDirectory.absolutePath()));
         }
     }
 
diff --git a/src/java/org/apache/cassandra/hints/HintsCleanupTrigger.java b/src/java/org/apache/cassandra/hints/HintsCleanupTrigger.java
new file mode 100644
index 0000000..4d10711
--- /dev/null
+++ b/src/java/org/apache/cassandra/hints/HintsCleanupTrigger.java
@@ -0,0 +1,70 @@
+/*
+ * 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.hints;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.service.StorageService;
+
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
+/**
+ * Delete the expired orphaned hints files.
+ * An orphaned file is considered as no associating endpoint with its host ID.
+ * An expired file is one that has lived longer than the largest gcgs of all tables.
+ */
+final class HintsCleanupTrigger implements Runnable
+{
+    private static final Logger logger = LoggerFactory.getLogger(HintsCleanupTrigger.class);
+    private final HintsCatalog hintsCatalog;
+    private final HintsDispatchExecutor dispatchExecutor;
+
+    HintsCleanupTrigger(HintsCatalog catalog, HintsDispatchExecutor dispatchExecutor)
+    {
+        this.hintsCatalog = catalog;
+        this.dispatchExecutor = dispatchExecutor;
+    }
+
+    public void run()
+    {
+        if (!DatabaseDescriptor.isAutoHintsCleanupEnabled())
+            return;
+
+        hintsCatalog.stores()
+                    .filter(store -> StorageService.instance.getEndpointForHostId(store.hostId) == null)
+                    .forEach(this::cleanup);
+    }
+
+    private void cleanup(HintsStore hintsStore)
+    {
+        logger.info("Found orphaned hints files for host: {}. Try to delete.", hintsStore.hostId);
+
+        // The host ID has been replaced and the store is still writing hint for the old host
+        if (hintsStore.isWriting())
+            hintsStore.closeWriter();
+
+        // Interrupt the dispatch if any. At this step, it is certain that the hintsStore is orphaned.
+        dispatchExecutor.interruptDispatch(hintsStore.hostId);
+        Runnable cleanup = () -> hintsStore.deleteExpiredHints(currentTimeMillis());
+        ScheduledExecutors.optionalTasks.execute(cleanup);
+    }
+}
diff --git a/src/java/org/apache/cassandra/hints/HintsDescriptor.java b/src/java/org/apache/cassandra/hints/HintsDescriptor.java
index 1979637..8e1f782 100644
--- a/src/java/org/apache/cassandra/hints/HintsDescriptor.java
+++ b/src/java/org/apache/cassandra/hints/HintsDescriptor.java
@@ -19,7 +19,6 @@
 
 import java.io.DataInput;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -35,6 +34,9 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 import com.google.common.collect.ImmutableMap;
+
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -207,6 +209,16 @@
         return String.format("%s-%s-%s.crc32", hostId, timestamp, version);
     }
 
+    File file(File hintsDirectory)
+    {
+        return new File(hintsDirectory, fileName());
+    }
+
+    File checksumFile(File hintsDirectory)
+    {
+        return new File(hintsDirectory, checksumFileName());
+    }
+
     int messagingVersion()
     {
         return messagingVersion(version);
@@ -232,13 +244,13 @@
 
     static Optional<HintsDescriptor> readFromFileQuietly(Path path)
     {
-        try (RandomAccessFile raf = new RandomAccessFile(path.toFile(), "r"))
+        try (FileInputStreamPlus raf = new FileInputStreamPlus(path))
         {
             return Optional.of(deserialize(raf));
         }
         catch (ChecksumMismatchException e)
         {
-            throw new FSReadError(e, path.toFile());
+            throw new FSReadError(e, path);
         }
         catch (IOException e)
         {
@@ -271,15 +283,15 @@
         }
     }
 
-    static HintsDescriptor readFromFile(Path path)
+    static HintsDescriptor readFromFile(File path)
     {
-        try (RandomAccessFile raf = new RandomAccessFile(path.toFile(), "r"))
+        try (FileInputStreamPlus raf = new FileInputStreamPlus(path))
         {
             return deserialize(raf);
         }
         catch (IOException e)
         {
-            throw new FSReadError(e, path.toFile());
+            throw new FSReadError(e, path);
         }
     }
 
diff --git a/src/java/org/apache/cassandra/hints/HintsDispatchExecutor.java b/src/java/org/apache/cassandra/hints/HintsDispatchExecutor.java
index b5eb0b1..0f34db6 100644
--- a/src/java/org/apache/cassandra/hints/HintsDispatchExecutor.java
+++ b/src/java/org/apache/cassandra/hints/HintsDispatchExecutor.java
@@ -17,10 +17,11 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.BooleanSupplier;
 import java.util.function.Predicate;
@@ -31,12 +32,16 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.FSReadError;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+import org.apache.cassandra.utils.concurrent.Future;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 
 /**
  * A multi-threaded (by default) executor for dispatching hints.
@@ -48,7 +53,7 @@
     private static final Logger logger = LoggerFactory.getLogger(HintsDispatchExecutor.class);
 
     private final File hintsDirectory;
-    private final ExecutorService executor;
+    private final ExecutorPlus executor;
     private final AtomicBoolean isPaused;
     private final Predicate<InetAddressAndPort> isAlive;
     private final Map<UUID, Future> scheduledDispatches;
@@ -60,10 +65,11 @@
         this.isAlive = isAlive;
 
         scheduledDispatches = new ConcurrentHashMap<>();
-        executor = new JMXEnabledThreadPoolExecutor(maxThreads, 1, TimeUnit.MINUTES,
-                                                    new LinkedBlockingQueue<>(),
-                                                    new NamedThreadFactory("HintsDispatcher", Thread.MIN_PRIORITY),
-                                                    "internal");
+        executor = executorFactory()
+                .withJmxInternal()
+                .configurePooled("HintsDispatcher", maxThreads)
+                .withThreadPriority(Thread.MIN_PRIORITY)
+                .build();
     }
 
     /*
@@ -79,7 +85,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new AssertionError(e);
+            throw new UncheckedInterruptedException(e);
         }
     }
 
@@ -120,7 +126,11 @@
             if (future != null)
                 future.get();
         }
-        catch (ExecutionException | InterruptedException e)
+        catch (InterruptedException e)
+        {
+            throw new UncheckedInterruptedException(e);
+        }
+        catch (ExecutionException e)
         {
             throw new RuntimeException(e);
         }
@@ -167,7 +177,7 @@
             }
             catch (InterruptedException e)
             {
-                throw new RuntimeException(e);
+                throw new UncheckedInterruptedException(e);
             }
 
             hostId = hostIdSupplier.get();
@@ -206,7 +216,7 @@
             // not total outgoing hints traffic from this node - this is why the rate limiter is not shared between
             // all the dispatch tasks (as there will be at most one dispatch task for a particular host id at a time).
             int nodesCount = Math.max(1, StorageService.instance.getTokenMetadata().getAllEndpoints().size() - 1);
-            double throttleInBytes = DatabaseDescriptor.getHintedHandoffThrottleInKB() * 1024.0 / nodesCount;
+            double throttleInBytes = DatabaseDescriptor.getHintedHandoffThrottleInKiB() * 1024.0 / nodesCount;
             this.rateLimiter = RateLimiter.create(throttleInBytes == 0 ? Double.MAX_VALUE : throttleInBytes);
         }
 
@@ -266,7 +276,7 @@
 
         private boolean deliver(HintsDescriptor descriptor, InetAddressAndPort address)
         {
-            File file = new File(hintsDirectory, descriptor.fileName());
+            File file = descriptor.file(hintsDirectory);
             InputPosition offset = store.getDispatchOffset(descriptor);
 
             BooleanSupplier shouldAbort = () -> !isAlive.test(address) || isPaused.get();
@@ -275,27 +285,43 @@
                 if (offset != null)
                     dispatcher.seek(offset);
 
-                if (dispatcher.dispatch())
+                try
                 {
-                    store.delete(descriptor);
-                    store.cleanUp(descriptor);
-                    logger.info("Finished hinted handoff of file {} to endpoint {}: {}", descriptor.fileName(), address, hostId);
-                    return true;
+                    if (dispatcher.dispatch())
+                    {
+                        store.delete(descriptor);
+                        store.cleanUp(descriptor);
+                        logger.info("Finished hinted handoff of file {} to endpoint {}: {}", descriptor.fileName(), address, hostId);
+                        return true;
+                    }
+                    else
+                    {
+                        handleDispatchFailure(dispatcher, descriptor, address);
+                        return false;
+                    }
                 }
-                else
+                // we wrap InterruptedException in UncheckedInterruptedException
+                // without that catch, undispatched HintsDescriptor won't be added back to the store and cleaned
+                // up by HintsStore.delete in tests
+                catch (UncheckedInterruptedException e)
                 {
-                    store.markDispatchOffset(descriptor, dispatcher.dispatchPosition());
-                    store.offerFirst(descriptor);
-                    logger.info("Finished hinted handoff of file {} to endpoint {}: {}, partially", descriptor.fileName(), address, hostId);
-                    return false;
+                    handleDispatchFailure(dispatcher, descriptor, address);
+                    throw e;
                 }
             }
         }
 
+        private void handleDispatchFailure(HintsDispatcher dispatcher, HintsDescriptor descriptor, InetAddressAndPort address)
+        {
+            store.markDispatchOffset(descriptor, dispatcher.dispatchPosition());
+            store.offerFirst(descriptor);
+            logger.info("Finished hinted handoff of file {} to endpoint {}: {}, partially", descriptor.fileName(), address, hostId);
+        }
+
         // for each hint in the hints file for a node that isn't part of the ring anymore, write RF hints for each replica
         private void convert(HintsDescriptor descriptor)
         {
-            File file = new File(hintsDirectory, descriptor.fileName());
+            File file = descriptor.file(hintsDirectory);
 
             try (HintsReader reader = HintsReader.open(file, rateLimiter))
             {
diff --git a/src/java/org/apache/cassandra/hints/HintsDispatchTrigger.java b/src/java/org/apache/cassandra/hints/HintsDispatchTrigger.java
index ca38c0c..0dfc6e1 100644
--- a/src/java/org/apache/cassandra/hints/HintsDispatchTrigger.java
+++ b/src/java/org/apache/cassandra/hints/HintsDispatchTrigger.java
@@ -19,12 +19,9 @@
 
 import java.util.concurrent.atomic.AtomicBoolean;
 
-import org.apache.cassandra.gms.ApplicationState;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.schema.Schema;
 
-import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
-
 /**
  * A simple dispatch trigger that's being run every 10 seconds.
  *
diff --git a/src/java/org/apache/cassandra/hints/HintsDispatcher.java b/src/java/org/apache/cassandra/hints/HintsDispatcher.java
index 743b275..b627338 100644
--- a/src/java/org/apache/cassandra/hints/HintsDispatcher.java
+++ b/src/java/org/apache/cassandra/hints/HintsDispatcher.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.function.BooleanSupplier;
@@ -29,14 +28,19 @@
 
 import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.metrics.HintsServiceMetrics;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.concurrent.Condition;
 
+
+import static org.apache.cassandra.hints.HintsDispatcher.Callback.Outcome.*;
+import static org.apache.cassandra.metrics.HintsServiceMetrics.updateDelayMetrics;
 import static org.apache.cassandra.net.Verb.HINT_REQ;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
 /**
  * Dispatches a single hints file to a specified node in a batched manner.
@@ -205,12 +209,12 @@
         return callback;
     }
 
-    private static final class Callback implements RequestCallback
+    static final class Callback implements RequestCallback
     {
         enum Outcome { SUCCESS, TIMEOUT, FAILURE, INTERRUPTED }
 
         private final long start = approxTime.now();
-        private final SimpleCondition condition = new SimpleCondition();
+        private final Condition condition = newOneTimeCondition();
         private volatile Outcome outcome;
         private final long hintCreationNanoTime;
 
@@ -229,10 +233,10 @@
             catch (InterruptedException e)
             {
                 logger.warn("Hint dispatch was interrupted", e);
-                return Outcome.INTERRUPTED;
+                return INTERRUPTED;
             }
 
-            return timedOut ? Outcome.TIMEOUT : outcome;
+            return timedOut ? TIMEOUT : outcome;
         }
 
         @Override
@@ -244,15 +248,15 @@
         @Override
         public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason)
         {
-            outcome = Outcome.FAILURE;
+            outcome = FAILURE;
             condition.signalAll();
         }
 
         @Override
         public void onResponse(Message msg)
         {
-            HintsServiceMetrics.updateDelayMetrics(msg.from(), approxTime.now() - this.hintCreationNanoTime);
-            outcome = Outcome.SUCCESS;
+            updateDelayMetrics(msg.from(), approxTime.now() - this.hintCreationNanoTime);
+            outcome = SUCCESS;
             condition.signalAll();
         }
     }
diff --git a/src/java/org/apache/cassandra/hints/HintsReader.java b/src/java/org/apache/cassandra/hints/HintsReader.java
index 9a5f75a..708a916 100644
--- a/src/java/org/apache/cassandra/hints/HintsReader.java
+++ b/src/java/org/apache/cassandra/hints/HintsReader.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.hints;
 
 import java.io.EOFException;
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Iterator;
@@ -28,6 +27,7 @@
 import com.google.common.primitives.Ints;
 import com.google.common.util.concurrent.RateLimiter;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,6 +36,8 @@
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.AbstractIterator;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * A paged non-compressed hints reader that provides two iterators:
  * - a 'raw' ByteBuffer iterator that doesn't deserialize the hints, but returns the pre-encoded hints verbatim
@@ -51,7 +53,7 @@
 {
     private static final Logger logger = LoggerFactory.getLogger(HintsReader.class);
 
-    // don't read more than 512 KB of hints at a time.
+    // don't read more than 512 KiB of hints at a time.
     private static final int PAGE_SIZE = 512 << 10;
 
     private final HintsDescriptor descriptor;
@@ -164,7 +166,7 @@
     final class HintsIterator extends AbstractIterator<Hint>
     {
         private final InputPosition offset;
-        private final long now = System.currentTimeMillis();
+        private final long now = currentTimeMillis();
 
         HintsIterator(InputPosition offset)
         {
@@ -270,7 +272,7 @@
     final class BuffersIterator extends AbstractIterator<ByteBuffer>
     {
         private final InputPosition offset;
-        private final long now = System.currentTimeMillis();
+        private final long now = currentTimeMillis();
 
         BuffersIterator(InputPosition offset)
         {
diff --git a/src/java/org/apache/cassandra/hints/HintsService.java b/src/java/org/apache/cassandra/hints/HintsService.java
index a02367f..8fbfab8 100644
--- a/src/java/org/apache/cassandra/hints/HintsService.java
+++ b/src/java/org/apache/cassandra/hints/HintsService.java
@@ -17,14 +17,16 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.net.UnknownHostException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
 import java.util.UUID;
-import java.util.concurrent.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -32,7 +34,10 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.ReplicaLayout;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,6 +54,7 @@
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.MBeanWrapper;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static com.google.common.collect.Iterables.filter;
 import static com.google.common.collect.Iterables.transform;
@@ -59,6 +65,7 @@
  * - a single-threaded write executor
  * - a multi-threaded dispatch executor
  * - the buffer pool for writing hints into
+ * - an optional scheduled task to clean up the applicable hints files
  *
  * The front-end for everything hints related.
  */
@@ -83,6 +90,7 @@
 
     private final ScheduledFuture triggerFlushingFuture;
     private volatile ScheduledFuture triggerDispatchFuture;
+    private final ScheduledFuture triggerCleanupFuture;
 
     public final HintedHandoffMetrics metrics;
 
@@ -112,6 +120,11 @@
                                                                                         flushPeriod,
                                                                                         flushPeriod,
                                                                                         TimeUnit.MILLISECONDS);
+
+        // periodically cleanup the expired hints
+        HintsCleanupTrigger cleanupTrigger = new HintsCleanupTrigger(catalog, dispatchExecutor);
+        triggerCleanupFuture = ScheduledExecutors.optionalTasks.scheduleWithFixedDelay(cleanupTrigger, 1, 1, TimeUnit.HOURS);
+
         metrics = new HintedHandoffMetrics();
     }
 
@@ -183,7 +196,7 @@
         // judicious use of streams: eagerly materializing probably cheaper
         // than performing filters / translations 2x extra via Iterables.filter/transform
         List<UUID> hostIds = replicas.stream()
-                .filter(StorageProxy::shouldHint)
+                .filter(replica -> StorageProxy.shouldHint(replica, false))
                 .map(replica -> StorageService.instance.getHostIdForEndpoint(replica.endpoint()))
                 .collect(Collectors.toList());
 
@@ -234,6 +247,19 @@
     }
 
     /**
+     * Get the total size in bytes of all the hints files associating with the host on disk.
+     * @param hostId, belonging host
+     * @return total file size, in bytes
+     */
+    public long getTotalHintsSize(UUID hostId)
+    {
+        HintsStore store = catalog.getNullable(hostId);
+        if (store == null)
+            return 0;
+        return store.getTotalFileSize();
+    }
+
+    /**
      * Gracefully and blockingly shut down the service.
      *
      * Will abort dispatch sessions that are currently in progress (which is okay, it's idempotent),
@@ -251,6 +277,8 @@
 
         triggerFlushingFuture.cancel(false);
 
+        triggerCleanupFuture.cancel(false);
+
         writeExecutor.flushBufferPool(bufferPool).get();
         writeExecutor.closeAllWriters().get();
 
@@ -262,6 +290,31 @@
     }
 
     /**
+     * Returns all pending hints that this node has.
+     *
+     * @return a list of {@link PendingHintsInfo}
+     */
+    public List<PendingHintsInfo> getPendingHintsInfo()
+    {
+        return catalog.stores()
+                      .filter(HintsStore::hasFiles)
+                      .map(HintsStore::getPendingHintsInfo)
+                      .collect(Collectors.toList());
+    }
+
+    /**
+     * Returns all pending hints that this node has.
+     *
+     * @return a list of maps with endpoints' ids, total number of hint files, their oldest and newest timestamps.
+     */
+    public List<Map<String, String>> getPendingHints()
+    {
+        return getPendingHintsInfo().stream()
+                                    .map(PendingHintsInfo::asMap)
+                                    .collect(Collectors.toList());
+    }
+
+    /**
      * Deletes all hints for all destinations. Doesn't make snapshots - should be used with care.
      */
     public void deleteAllHints()
@@ -332,7 +385,11 @@
             flushFuture.get();
             closeFuture.get();
         }
-        catch (InterruptedException | ExecutionException e)
+        catch (InterruptedException e)
+        {
+            throw new UncheckedInterruptedException(e);
+        }
+        catch (ExecutionException e)
         {
             throw new RuntimeException(e);
         }
@@ -369,7 +426,11 @@
             flushFuture.get();
             closeFuture.get();
         }
-        catch (InterruptedException | ExecutionException e)
+        catch (InterruptedException e)
+        {
+            throw new UncheckedInterruptedException(e);
+        }
+        catch (ExecutionException e)
         {
             throw new RuntimeException(e);
         }
@@ -383,6 +444,20 @@
         return dispatchExecutor.transfer(catalog, hostIdSupplier);
     }
 
+    /**
+     * Get the earliest hint written for a particular node,
+     * @param hostId UUID of the node to check it's hints.
+     * @return earliest hint as per unix time or Long.MIN_VALUE if hostID is null
+     */
+    public long getEarliestHintForHost(UUID hostId)
+    {
+        // Need to check only the first descriptor + all buffers.
+        HintsStore store = catalog.get(hostId);
+        HintsDescriptor desc = store.getFirstDescriptor();
+        long timestamp = desc == null ? Clock.Global.currentTimeMillis() : desc.timestamp;
+        return Math.min(timestamp, bufferPool.getEarliestHintForHost(hostId));
+    }
+
     HintsCatalog getCatalog()
     {
         return catalog;
diff --git a/src/java/org/apache/cassandra/hints/HintsServiceMBean.java b/src/java/org/apache/cassandra/hints/HintsServiceMBean.java
index fe0abcc..7fd7695 100644
--- a/src/java/org/apache/cassandra/hints/HintsServiceMBean.java
+++ b/src/java/org/apache/cassandra/hints/HintsServiceMBean.java
@@ -17,6 +17,9 @@
  */
 package org.apache.cassandra.hints;
 
+import java.util.List;
+import java.util.Map;
+
 public interface HintsServiceMBean
 {
     /**
@@ -40,4 +43,11 @@
      * being dispatched right now, or being written to).
      */
     void deleteAllHintsForEndpoint(String address);
+
+    /**
+     * Returns all pending hints that this node has.
+     *
+     * @return a list of endpoints with relevant hint information - total number of files, newest and oldest timestamps.
+     */
+    List<Map<String, String>> getPendingHints();
 }
diff --git a/src/java/org/apache/cassandra/hints/HintsStore.java b/src/java/org/apache/cassandra/hints/HintsStore.java
index aeefbd7..b7850ee 100644
--- a/src/java/org/apache/cassandra/hints/HintsStore.java
+++ b/src/java/org/apache/cassandra/hints/HintsStore.java
@@ -17,24 +17,31 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentLinkedDeque;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.function.Predicate;
+
+import javax.annotation.Nullable;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.gms.FailureDetector;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.SyncUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * Encapsulates the state of a peer's hints: the queue of hints files for dispatch, and the current writer (if any).
  *
@@ -53,6 +60,7 @@
     private final Map<HintsDescriptor, InputPosition> dispatchPositions;
     private final Deque<HintsDescriptor> dispatchDequeue;
     private final Queue<HintsDescriptor> corruptedFiles;
+    private final Map<HintsDescriptor, Long> hintsExpirations;
 
     // last timestamp used in a descriptor; make sure to not reuse the same timestamp for new descriptors.
     private volatile long lastUsedTimestamp;
@@ -67,6 +75,7 @@
         dispatchPositions = new ConcurrentHashMap<>();
         dispatchDequeue = new ConcurrentLinkedDeque<>(descriptors);
         corruptedFiles = new ConcurrentLinkedQueue<>();
+        hintsExpirations = new ConcurrentHashMap<>();
 
         //noinspection resource
         lastUsedTimestamp = descriptors.stream().mapToLong(d -> d.timestamp).max().orElse(0L);
@@ -84,11 +93,37 @@
         return dispatchDequeue.size();
     }
 
+    @VisibleForTesting
+    int getHintsExpirationsMapSize()
+    {
+        return hintsExpirations.size();
+    }
+
     InetAddressAndPort address()
     {
         return StorageService.instance.getEndpointForHostId(hostId);
     }
 
+    @Nullable
+    PendingHintsInfo getPendingHintsInfo()
+    {
+        Iterator<HintsDescriptor> descriptors = dispatchDequeue.iterator();
+        int queueSize = 0;
+        long minTimestamp = Long.MAX_VALUE;
+        long maxTimestamp = Long.MIN_VALUE;
+        while (descriptors.hasNext())
+        {
+            HintsDescriptor descriptor = descriptors.next();
+            minTimestamp = Math.min(minTimestamp, descriptor.timestamp);
+            maxTimestamp = Math.max(maxTimestamp, descriptor.timestamp);
+            queueSize++;
+        }
+
+        if (queueSize == 0)
+            return null;
+        return new PendingHintsInfo(hostId, queueSize, minTimestamp, maxTimestamp);
+    }
+
     boolean isLive()
     {
         InetAddressAndPort address = address();
@@ -126,16 +161,63 @@
         }
     }
 
+    void deleteExpiredHints(long now)
+    {
+        deleteHints(it -> hasExpired(it, now));
+    }
+
+    private boolean hasExpired(HintsDescriptor descriptor, long now)
+    {
+        Long cachedExpiresAt = hintsExpirations.get(descriptor);
+        if (null != cachedExpiresAt)
+            return cachedExpiresAt <= now;
+
+        File hintFile = new File(hintsDirectory, descriptor.fileName());
+        // the file does not exist or if an I/O error occurs
+        if (!hintFile.exists() || hintFile.lastModified() == 0)
+            return false;
+
+        // 'lastModified' can be considered as the upper bound of the hint creation time.
+        // So the TTL upper bound of all hints in the file can be estimated by lastModified + maxGcgs of all tables
+        long ttl = hintFile.lastModified() + Schema.instance.largestGcgs();
+        hintsExpirations.put(descriptor, ttl);
+        return ttl <= now;
+    }
+
+    private void deleteHints(Predicate<HintsDescriptor> predicate)
+    {
+        Set<HintsDescriptor> removeSet = new HashSet<>();
+        try
+        {
+            for (HintsDescriptor descriptor : Iterables.concat(dispatchDequeue, corruptedFiles))
+            {
+                if (predicate.test(descriptor))
+                {
+                    cleanUp(descriptor);
+                    delete(descriptor);
+                    removeSet.add(descriptor);
+                }
+            }
+        }
+        finally // remove the already deleted hints from internal queues in case of exception
+        {
+            dispatchDequeue.removeAll(removeSet);
+            corruptedFiles.removeAll(removeSet);
+        }
+    }
+
     void delete(HintsDescriptor descriptor)
     {
-        File hintsFile = new File(hintsDirectory, descriptor.fileName());
-        if (hintsFile.delete())
+        File hintsFile = descriptor.file(hintsDirectory);
+        if (hintsFile.tryDelete())
             logger.info("Deleted hint file {}", descriptor.fileName());
-        else
+        else if (hintsFile.exists())
             logger.error("Failed to delete hint file {}", descriptor.fileName());
+        else
+            logger.info("Already deleted hint file {}", descriptor.fileName());
 
         //noinspection ResultOfMethodCallIgnored
-        new File(hintsDirectory, descriptor.checksumFileName()).delete();
+        descriptor.checksumFile(hintsDirectory).tryDelete();
     }
 
     boolean hasFiles()
@@ -153,9 +235,24 @@
         dispatchPositions.put(descriptor, inputPosition);
     }
 
+
+    /**
+     * @return the total size of all files belonging to the hints store, in bytes.
+     */
+    long getTotalFileSize()
+    {
+        long total = 0;
+        for (HintsDescriptor descriptor : Iterables.concat(dispatchDequeue, corruptedFiles))
+        {
+            total += descriptor.file(hintsDirectory).length();
+        }
+        return total;
+    }
+
     void cleanUp(HintsDescriptor descriptor)
     {
         dispatchPositions.remove(descriptor);
+        hintsExpirations.remove(descriptor);
     }
 
     void markCorrupted(HintsDescriptor descriptor)
@@ -163,6 +260,14 @@
         corruptedFiles.add(descriptor);
     }
 
+    /**
+     * @return a copy of the first {@link HintsDescriptor} in the queue for dispatch or {@code null} if queue is empty.
+     */
+    HintsDescriptor getFirstDescriptor()
+    {
+        return dispatchDequeue.peekFirst();
+    }
+
     /*
      * Methods dealing with HintsWriter.
      *
@@ -188,7 +293,7 @@
 
     private HintsWriter openWriter()
     {
-        lastUsedTimestamp = Math.max(System.currentTimeMillis(), lastUsedTimestamp + 1);
+        lastUsedTimestamp = Math.max(currentTimeMillis(), lastUsedTimestamp + 1);
         HintsDescriptor descriptor = new HintsDescriptor(hostId, lastUsedTimestamp, writerParams);
 
         try
diff --git a/src/java/org/apache/cassandra/hints/HintsWriteExecutor.java b/src/java/org/apache/cassandra/hints/HintsWriteExecutor.java
index 51a5362..9d64e4a 100644
--- a/src/java/org/apache/cassandra/hints/HintsWriteExecutor.java
+++ b/src/java/org/apache/cassandra/hints/HintsWriteExecutor.java
@@ -20,16 +20,21 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Iterator;
-import java.util.concurrent.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.FSError;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 
 /**
  * A single threaded executor that exclusively writes all the hints and otherwise manipulate the writers.
@@ -46,18 +51,18 @@
 
     private final HintsCatalog catalog;
     private final ByteBuffer writeBuffer;
-    private final ExecutorService executor;
+    private final ExecutorPlus executor;
 
     HintsWriteExecutor(HintsCatalog catalog)
     {
         this.catalog = catalog;
 
         writeBuffer = ByteBuffer.allocateDirect(WRITE_BUFFER_SIZE);
-        executor = DebuggableThreadPoolExecutor.createWithFixedPoolSize("HintsWriteExecutor", 1);
+        executor = executorFactory().sequential("HintsWriteExecutor");
     }
 
     /*
-     * Should be very fast (worst case scenario - write a few 10s of megabytes to disk).
+     * Should be very fast (worst case scenario - write a few 10s of mebibytes to disk).
      */
     void shutdownBlocking()
     {
@@ -102,7 +107,11 @@
         {
             executor.submit(new FsyncWritersTask(stores)).get();
         }
-        catch (InterruptedException | ExecutionException e)
+        catch (InterruptedException e)
+        {
+            throw new UncheckedInterruptedException(e);
+        }
+        catch (ExecutionException e)
         {
             throw new RuntimeException(e);
         }
@@ -185,7 +194,7 @@
         {
             HintsBuffer buffer = bufferPool.currentBuffer();
             buffer.waitForModifications();
-            stores.forEach(store -> flush(buffer.consumingHintsIterator(store.hostId), store));
+            stores.forEach(store -> flush(buffer.consumingHintsIterator(store.hostId), store, buffer));
         }
     }
 
@@ -207,10 +216,10 @@
 
     private void flush(HintsBuffer buffer)
     {
-        buffer.hostIds().forEach(hostId -> flush(buffer.consumingHintsIterator(hostId), catalog.get(hostId)));
+        buffer.hostIds().forEach(hostId -> flush(buffer.consumingHintsIterator(hostId), catalog.get(hostId), buffer));
     }
 
-    private void flush(Iterator<ByteBuffer> iterator, HintsStore store)
+    private void flush(Iterator<ByteBuffer> iterator, HintsStore store, HintsBuffer buffer)
     {
         while (true)
         {
@@ -222,7 +231,27 @@
 
             // exceeded the size limit for an individual file, but still have more to write
             // close the current writer and continue flushing to a new one in the next iteration
-            store.closeWriter();
+            try
+            {
+                store.closeWriter();
+            }
+            finally
+            {
+                /*
+                We remove the earliest hint for a respective hostId of the store from the buffer,
+                we are removing it specifically after we closed the store above in try block
+                so hints are persisted on disk before.
+
+                There is a periodic flushing of a buffer driven by hints_flush_period and clearing
+                this entry upon every flush would remove the information what is the earliest hint in the buffer
+                for a respective node prematurely.
+
+                Since this flushing method is called for every host id a buffer holds, we will eventually
+                remove all hostIds of the earliest hints of the buffer, and it will be added again as soon as there
+                is a new hint for that node to be delivered.
+                */
+                buffer.clearEarliestHintForHostId(store.hostId);
+            }
         }
     }
 
diff --git a/src/java/org/apache/cassandra/hints/HintsWriter.java b/src/java/org/apache/cassandra/hints/HintsWriter.java
index 589802b..663427a 100644
--- a/src/java/org/apache/cassandra/hints/HintsWriter.java
+++ b/src/java/org/apache/cassandra/hints/HintsWriter.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.nio.ByteBuffer;
@@ -33,6 +32,7 @@
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.io.util.DataOutputBufferFixed;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.NativeLibrary;
 import org.apache.cassandra.utils.SyncUtil;
 import org.apache.cassandra.utils.Throwables;
@@ -67,7 +67,7 @@
     @SuppressWarnings("resource") // HintsWriter owns channel
     static HintsWriter create(File directory, HintsDescriptor descriptor) throws IOException
     {
-        File file = new File(directory, descriptor.fileName());
+        File file = descriptor.file(directory);
 
         FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW);
         int fd = NativeLibrary.getfd(channel);
@@ -102,7 +102,7 @@
 
     private void writeChecksum()
     {
-        File checksumFile = new File(directory, descriptor.checksumFileName());
+        File checksumFile = descriptor.checksumFile(directory);
         try (OutputStream out = Files.newOutputStream(checksumFile.toPath()))
         {
             out.write(Integer.toHexString((int) globalCRC.getValue()).getBytes(StandardCharsets.UTF_8));
@@ -284,7 +284,7 @@
 
         private void maybeFsync()
         {
-            if (position() >= lastSyncPosition + DatabaseDescriptor.getTrickleFsyncIntervalInKb() * 1024L)
+            if (position() >= lastSyncPosition + DatabaseDescriptor.getTrickleFsyncIntervalInKiB() * 1024L)
                 fsync();
         }
 
@@ -294,8 +294,8 @@
 
             // don't skip page cache for tiny files, on the assumption that if they are tiny, the target node is probably
             // alive, and if so, the file will be closed and dispatched shortly (within a minute), and the file will be dropped.
-            if (position >= DatabaseDescriptor.getTrickleFsyncIntervalInKb() * 1024L)
-                NativeLibrary.trySkipCache(fd, 0, position - (position % PAGE_SIZE), file.getPath());
+            if (position >= DatabaseDescriptor.getTrickleFsyncIntervalInKiB() * 1024L)
+                NativeLibrary.trySkipCache(fd, 0, position - (position % PAGE_SIZE), file.path());
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/hints/PendingHintsInfo.java b/src/java/org/apache/cassandra/hints/PendingHintsInfo.java
new file mode 100644
index 0000000..b4f21cd
--- /dev/null
+++ b/src/java/org/apache/cassandra/hints/PendingHintsInfo.java
@@ -0,0 +1,86 @@
+/*
+ * 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.hints;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Objects;
+import java.util.UUID;
+
+import com.google.common.base.MoreObjects;
+
+public class PendingHintsInfo
+{
+    public static final String HOST_ID = "host_id";
+    public static final String TOTAL_FILES = "total_files";
+    public static final String OLDEST_TIMESTAMP = "oldest_timestamp";
+    public static final String NEWEST_TIMESTAMP = "newest_timestamp";
+
+    public final UUID hostId;
+    public final int totalFiles;
+    public final long oldestTimestamp;
+    public final long newestTimestamp;
+
+    public PendingHintsInfo(UUID hostId, int totalFiles, long oldestTimestamp, long newestTimestamp)
+    {
+        this.hostId = hostId;
+        this.totalFiles = totalFiles;
+        this.oldestTimestamp = oldestTimestamp;
+        this.newestTimestamp = newestTimestamp;
+    }
+
+    public Map<String, String> asMap()
+    {
+        Map<String, String> ret = new HashMap<>();
+        ret.put(HOST_ID, hostId.toString());
+        ret.put(TOTAL_FILES, String.valueOf(totalFiles));
+        ret.put(OLDEST_TIMESTAMP, String.valueOf(oldestTimestamp));
+        ret.put(NEWEST_TIMESTAMP, String.valueOf(newestTimestamp));
+        return ret;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PendingHintsInfo that = (PendingHintsInfo) o;
+        return totalFiles == that.totalFiles &&
+               oldestTimestamp == that.oldestTimestamp &&
+               newestTimestamp == that.newestTimestamp &&
+               Objects.equals(hostId, that.hostId);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(hostId, totalFiles, oldestTimestamp, newestTimestamp);
+    }
+
+    @Override
+    public String toString()
+    {
+        return MoreObjects.toStringHelper(this)
+                          .add("hostId", hostId)
+                          .add("totalFiles", totalFiles)
+                          .add("oldestTimestamp", oldestTimestamp)
+                          .add("newestTimestamp", newestTimestamp)
+                          .toString();
+    }
+}
diff --git a/src/java/org/apache/cassandra/hints/package-info.java b/src/java/org/apache/cassandra/hints/package-info.java
index faa7b9f..b853f31 100644
--- a/src/java/org/apache/cassandra/hints/package-info.java
+++ b/src/java/org/apache/cassandra/hints/package-info.java
@@ -41,4 +41,4 @@
  * {@link org.apache.cassandra.hints.HintsService} wraps the catalog, the pool, and the two executors, acting as a front-end
  * for hints.
  */
-package org.apache.cassandra.hints;
\ No newline at end of file
+package org.apache.cassandra.hints;
diff --git a/src/java/org/apache/cassandra/index/Index.java b/src/java/org/apache/cassandra/index/Index.java
index e9d3d3c..9f51b16 100644
--- a/src/java/org/apache/cassandra/index/Index.java
+++ b/src/java/org/apache/cassandra/index/Index.java
@@ -26,6 +26,7 @@
 import java.util.concurrent.Callable;
 import java.util.function.BiFunction;
 
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.Operator;
 import org.apache.cassandra.db.*;
@@ -267,7 +268,27 @@
     public Optional<ColumnFamilyStore> getBackingTable();
 
     /**
-     * Return a task which performs a blocking flush of the index's data to persistent storage.
+     * Return a task which performs a blocking flush of the index's data corresponding to the provided
+     * base table's Memtable. This may extract any necessary data from the base table's Memtable as part of the flush.
+     *
+     * This version of the method is invoked whenever we flush the base table. If the index stores no in-memory data
+     * of its own, it is safe to only implement this method.
+     *
+     * @return task to be executed by the index manager to perform the flush.
+     */
+    public default Callable<?> getBlockingFlushTask(Memtable baseCfs)
+    {
+        return getBlockingFlushTask();
+    }
+
+    /**
+     * Return a task which performs a blocking flush of any in-memory index data to persistent storage,
+     * independent of any flush of the base table.
+     *
+     * Note that this method is only invoked outside of normal flushes: if there is no in-memory storage
+     * for this index, and it only extracts data on flush from the base table's Memtable, then it is safe to
+     * perform no work.
+     *
      * @return task to be executed by the index manager to perform the flush.
      */
     public Callable<?> getBlockingFlushTask();
diff --git a/src/java/org/apache/cassandra/index/SecondaryIndexManager.java b/src/java/org/apache/cassandra/index/SecondaryIndexManager.java
index e9b22ef..93ecd59 100644
--- a/src/java/org/apache/cassandra/index/SecondaryIndexManager.java
+++ b/src/java/org/apache/cassandra/index/SecondaryIndexManager.java
@@ -19,7 +19,9 @@
 
 import java.lang.reflect.Constructor;
 import java.util.*;
-import java.util.concurrent.*;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
 import java.util.stream.Collectors;
@@ -28,36 +30,29 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
 import com.google.common.base.Strings;
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
-import com.google.common.collect.Maps;
-import com.google.common.collect.Sets;
+import com.google.common.collect.*;
 import com.google.common.primitives.Longs;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.SettableFuture;
-
 import org.apache.commons.lang3.StringUtils;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.FutureTask;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.statements.schema.IndexTarget;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.filter.ClusteringIndexSliceFilter;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.filter.DataLimits;
 import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.db.lifecycle.SSTableSet;
 import org.apache.cassandra.db.lifecycle.View;
-import org.apache.cassandra.db.marshal.ValueAccessor;
-import org.apache.cassandra.db.partitions.*;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.Index.IndexBuildingSupport;
@@ -75,8 +70,9 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
-import org.apache.cassandra.utils.concurrent.Refs;
+import org.apache.cassandra.utils.concurrent.*;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.utils.ExecutorUtils.awaitTermination;
 import static org.apache.cassandra.utils.ExecutorUtils.shutdown;
 
@@ -158,16 +154,12 @@
     private final Map<String, AtomicInteger> inProgressBuilds = Maps.newConcurrentMap();
 
     // executes tasks returned by Indexer#addIndexColumn which may require index(es) to be (re)built
-    private static final ListeningExecutorService asyncExecutor = MoreExecutors.listeningDecorator(
-    new JMXEnabledThreadPoolExecutor(1,
-                                     Stage.KEEP_ALIVE_SECONDS,
-                                     TimeUnit.SECONDS,
-                                     new LinkedBlockingQueue<>(),
-                                     new NamedThreadFactory("SecondaryIndexManagement"),
-                                     "internal"));
+    private static final ExecutorPlus asyncExecutor = executorFactory()
+            .withJmxInternal()
+            .sequential("SecondaryIndexManagement");
 
     // executes all blocking tasks produced by Indexers e.g. getFlushTask, getMetadataReloadTask etc
-    private static final ListeningExecutorService blockingExecutor = MoreExecutors.newDirectExecutorService();
+    private static final ExecutorPlus blockingExecutor = ImmediateExecutor.INSTANCE;
 
     /**
      * The underlying column family containing the source data for these indexes
@@ -205,12 +197,12 @@
         Index index = indexes.get(indexDef.name);
         Callable<?> reloadTask = index.getMetadataReloadTask(indexDef);
         return reloadTask == null
-               ? Futures.immediateFuture(null)
+               ? ImmediateFuture.success(null)
                : blockingExecutor.submit(reloadTask);
     }
 
     @SuppressWarnings("unchecked")
-    private synchronized Future<?> createIndex(IndexMetadata indexDef, boolean isNewCF)
+    private synchronized Future<Void> createIndex(IndexMetadata indexDef, boolean isNewCF)
     {
         final Index index = createInstance(indexDef);
         index.register(this);
@@ -219,13 +211,15 @@
 
         markIndexesBuilding(ImmutableSet.of(index), true, isNewCF);
 
-        Callable<?> initialBuildTask = null;
+        FutureTask<?> initialBuildTask = null;
         // if the index didn't register itself, we can probably assume that no initialization needs to happen
         if (indexes.containsKey(indexDef.name))
         {
             try
             {
-                initialBuildTask = index.getInitializationTask();
+                Callable<?> call = index.getInitializationTask();
+                if (call != null)
+                    initialBuildTask = new FutureTask<>(call);
             }
             catch (Throwable t)
             {
@@ -238,27 +232,25 @@
         if (initialBuildTask == null)
         {
             markIndexBuilt(index, true);
-            return Futures.immediateFuture(null);
+            return ImmediateFuture.success(null);
         }
 
         // otherwise run the initialization task asynchronously with a callback to mark it built or failed
-        final SettableFuture initialization = SettableFuture.create();
-        Futures.addCallback(asyncExecutor.submit(initialBuildTask), new FutureCallback()
-        {
-            @Override
-            public void onFailure(Throwable t)
-            {
-                logAndMarkIndexesFailed(Collections.singleton(index), t, true);
-                initialization.setException(t);
-            }
-
-            @Override
-            public void onSuccess(Object o)
-            {
+        final Promise<Void> initialization = new AsyncPromise<>();
+        // we want to ensure we invoke this task asynchronously, so we want to add our callback before submission
+        // to ensure the work is not completed before we register the callback and so it gets performed by us.
+        // This is because Keyspace.open("system") can transitively attempt to open Keyspace.open("system")
+        initialBuildTask.addCallback(
+            success -> {
                 markIndexBuilt(index, true);
-                initialization.set(o);
+                initialization.trySuccess(null);
+            },
+            failure -> {
+                logAndMarkIndexesFailed(Collections.singleton(index), failure, true);
+                initialization.tryFailure(failure);
             }
-        }, MoreExecutors.directExecutor());
+        );
+        asyncExecutor.execute(initialBuildTask);
 
         return initialization;
     }
@@ -267,7 +259,7 @@
      * Adds and builds a index
      *
      * @param indexDef the IndexMetadata describing the index
-     * @param isNewCF true if the index is added as part of a new table/columnfamily (i.e. loading a CF at startup), 
+     * @param isNewCF true if the index is added as part of a new table/columnfamily (i.e. loading a CF at startup),
      * false for all other cases (i.e. newly added index)
      */
     public synchronized Future<?> addIndex(IndexMetadata indexDef, boolean isNewCF)
@@ -384,7 +376,7 @@
 
         // Once we are tracking new writes, flush any memtable contents to not miss them from the sstable-based rebuild
         if (needsFlush)
-            baseCfs.forceBlockingFlush();
+            baseCfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.INDEX_BUILD_STARTED);
 
         // Now that we are tracking new writes and we haven't left untracked contents on the memtables, we are ready to
         // index the sstables
@@ -516,15 +508,15 @@
             byType.forEach((buildingSupport, groupedIndexes) ->
                            {
                                SecondaryIndexBuilder builder = buildingSupport.getIndexBuildTask(baseCfs, groupedIndexes, sstables);
-                               final SettableFuture build = SettableFuture.create();
-                               Futures.addCallback(CompactionManager.instance.submitIndexBuild(builder), new FutureCallback()
+                               final AsyncPromise<Object> build = new AsyncPromise<>();
+                               CompactionManager.instance.submitIndexBuild(builder).addCallback(new FutureCallback()
                                {
                                    @Override
                                    public void onFailure(Throwable t)
                                    {
                                        logAndMarkIndexesFailed(groupedIndexes, t, false);
                                        unbuiltIndexes.addAll(groupedIndexes);
-                                       build.setException(t);
+                                       build.tryFailure(t);
                                    }
 
                                    @Override
@@ -533,9 +525,9 @@
                                        groupedIndexes.forEach(i -> markIndexBuilt(i, isFullRebuild));
                                        logger.info("Index build of {} completed", getIndexNames(groupedIndexes));
                                        builtIndexes.addAll(groupedIndexes);
-                                       build.set(o);
+                                       build.trySuccess(o);
                                    }
-                               }, MoreExecutors.directExecutor());
+                               });
                                futures.add(build);
                            });
 
@@ -624,7 +616,7 @@
      *
      * @param indexes the index to be marked as building
      * @param isFullRebuild {@code true} if this method is invoked as a full index rebuild, {@code false} otherwise
-     * @param isNewCF {@code true} if this method is invoked when initializing a new table/columnfamily (i.e. loading a CF at startup), 
+     * @param isNewCF {@code true} if this method is invoked when initializing a new table/columnfamily (i.e. loading a CF at startup),
      * {@code false} for all other cases (i.e. newly added index)
      */
     private synchronized void markIndexesBuilding(Set<Index> indexes, boolean isFullRebuild, boolean isNewCF)
@@ -675,7 +667,7 @@
             if (writableIndexes.put(indexName, index) == null)
                 logger.info("Index [{}] became writable after successful build.", indexName);
         }
-        
+
         AtomicInteger counter = inProgressBuilds.get(indexName);
         if (counter != null)
         {
@@ -683,7 +675,7 @@
             if (counter.decrementAndGet() == 0)
             {
                 inProgressBuilds.remove(indexName);
-                if (!needsFullRebuild.contains(indexName) && DatabaseDescriptor.isDaemonInitialized())
+                if (!needsFullRebuild.contains(indexName) && DatabaseDescriptor.isDaemonInitialized() && Keyspace.isInitialized())
                     SystemKeyspace.setIndexBuilt(baseCfs.keyspace.getName(), indexName);
             }
         }
@@ -786,10 +778,11 @@
     /**
      * Remove all indexes
      */
-    public void dropAllIndexes()
+    public void dropAllIndexes(boolean dropData)
     {
         markAllIndexesRemoved();
-        invalidateAllIndexesBlocking();
+        if (dropData)
+            invalidateAllIndexesBlocking();
     }
 
     @VisibleForTesting
@@ -815,17 +808,6 @@
     }
 
     /**
-     * Performs a blocking flush of all custom indexes
-     */
-    public void flushAllNonCFSBackedIndexesBlocking()
-    {
-        executeAllBlocking(indexes.values()
-                                  .stream()
-                                  .filter(index -> !index.getBackingTable().isPresent()),
-                           Index::getBlockingFlushTask, null);
-    }
-
-    /**
      * Performs a blocking execution of pre-join tasks of all indexes
      */
     public void executePreJoinTasksBlocking(boolean hadBootstrap)
@@ -851,7 +833,7 @@
         {
             indexes.forEach(index ->
                             index.getBackingTable()
-                                 .map(cfs -> wait.add(cfs.forceFlush()))
+                                 .map(cfs -> wait.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.INDEX_BUILD_COMPLETED)))
                                  .orElseGet(() -> nonCfsIndexes.add(index)));
         }
 
@@ -860,6 +842,18 @@
     }
 
     /**
+     * Performs a blocking flush of all custom indexes
+     */
+    public void flushAllNonCFSBackedIndexesBlocking(Memtable baseCfsMemtable)
+    {
+        executeAllBlocking(indexes.values()
+                                  .stream()
+                                  .filter(index -> !index.getBackingTable().isPresent()),
+                           index -> index.getBlockingFlushTask(baseCfsMemtable),
+                           null);
+    }
+
+    /**
      * @return all indexes which are marked as built and ready to use
      */
     public List<String> getBuiltIndexNames()
@@ -889,19 +883,34 @@
         return !indexes.isEmpty();
     }
 
+    public void indexPartition(DecoratedKey key, Set<Index> indexes, int pageSize)
+    {
+        indexPartition(key, indexes, pageSize, baseCfs.metadata().regularAndStaticColumns());
+    }
+
     /**
      * When building an index against existing data in sstables, add the given partition to the index
+     *
+     * @param key the key for the partition being indexed
+     * @param indexes the indexes that must be updated
+     * @param pageSize the number of {@link Unfiltered} objects to process in a single page
+     * @param columns the columns indexed by at least one of the supplied indexes
      */
-    public void indexPartition(DecoratedKey key, Set<Index> indexes, int pageSize)
+    public void indexPartition(DecoratedKey key, Set<Index> indexes, int pageSize, RegularAndStaticColumns columns)
     {
         if (logger.isTraceEnabled())
             logger.trace("Indexing partition {}", baseCfs.metadata().partitionKeyType.getString(key.getKey()));
 
         if (!indexes.isEmpty())
         {
-            SinglePartitionReadCommand cmd = SinglePartitionReadCommand.fullPartitionRead(baseCfs.metadata(),
-                                                                                          FBUtilities.nowInSeconds(),
-                                                                                          key);
+            SinglePartitionReadCommand cmd = SinglePartitionReadCommand.create(baseCfs.metadata(),
+                                                                               FBUtilities.nowInSeconds(),
+                                                                               ColumnFilter.selection(columns),
+                                                                               RowFilter.NONE,
+                                                                               DataLimits.NONE,
+                                                                               key,
+                                                                               new ClusteringIndexSliceFilter(Slices.ALL, false));
+
             int nowInSec = cmd.nowInSec();
             boolean readStatic = false;
 
@@ -1190,7 +1199,7 @@
     {
         if (!hasIndexes())
             return UpdateTransaction.NO_OP;
-        
+
         ArrayList<Index.Indexer> idxrs = new ArrayList<>();
         for (Index i : writableIndexes.values())
         {
@@ -1198,7 +1207,7 @@
             if (idxr != null)
                 idxrs.add(idxr);
         }
-        
+
         if (idxrs.size() == 0)
             return UpdateTransaction.NO_OP;
         else
@@ -1507,17 +1516,17 @@
         }
     }
 
-    private void executeBlocking(Callable<?> task, FutureCallback<Object> callback)
+    private void executeBlocking(Callable<?> task, FutureCallback callback)
     {
         if (null != task)
         {
-            ListenableFuture<?> f = blockingExecutor.submit(task);
-            if (callback != null) Futures.addCallback(f, callback, MoreExecutors.directExecutor());
+            Future<?> f = blockingExecutor.submit(task);
+            if (callback != null) f.addCallback(callback);
             FBUtilities.waitOnFuture(f);
         }
     }
 
-    private void executeAllBlocking(Stream<Index> indexers, Function<Index, Callable<?>> function, FutureCallback<Object> callback)
+    private void executeAllBlocking(Stream<Index> indexers, Function<Index, Callable<?>> function, FutureCallback callback)
     {
         if (function == null)
         {
@@ -1531,8 +1540,8 @@
                              Callable<?> task = function.apply(indexer);
                              if (null != task)
                              {
-                                 ListenableFuture<?> f = blockingExecutor.submit(task);
-                                 if (callback != null) Futures.addCallback(f, callback, MoreExecutors.directExecutor());
+                                 Future<?> f = blockingExecutor.submit(task);
+                                 if (callback != null) f.addCallback(callback);
                                  waitFor.add(f);
                              }
                          });
diff --git a/src/java/org/apache/cassandra/index/internal/CassandraIndex.java b/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
index 2561040..0aac15d 100644
--- a/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
+++ b/src/java/org/apache/cassandra/index/internal/CassandraIndex.java
@@ -184,7 +184,7 @@
     public Callable<Void> getBlockingFlushTask()
     {
         return () -> {
-            indexCfs.forceBlockingFlush();
+            indexCfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.INDEX_TABLE_FLUSH);
             return null;
         };
     }
@@ -659,7 +659,7 @@
         CompactionManager.instance.interruptCompactionForCFs(cfss, (sstable) -> true, true);
         CompactionManager.instance.waitForCessation(cfss, (sstable) -> true);
         Keyspace.writeOrder.awaitNewBarrier();
-        indexCfs.forceBlockingFlush();
+        indexCfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.INDEX_REMOVED);
         indexCfs.readOrdering.awaitNewBarrier();
         indexCfs.invalidate();
     }
@@ -685,7 +685,7 @@
     @SuppressWarnings("resource")
     private void buildBlocking()
     {
-        baseCfs.forceBlockingFlush();
+        baseCfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.INDEX_BUILD_STARTED);
 
         try (ColumnFamilyStore.RefViewFragment viewFragment = baseCfs.selectAndReference(View.selectFunction(SSTableSet.CANONICAL));
              Refs<SSTableReader> sstables = viewFragment.refs)
@@ -709,7 +709,7 @@
                                                                          ImmutableSet.copyOf(sstables));
             Future<?> future = CompactionManager.instance.submitIndexBuild(builder);
             FBUtilities.waitOnFuture(future);
-            indexCfs.forceBlockingFlush();
+            indexCfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.INDEX_BUILD_COMPLETED);
         }
         logger.info("Index build of {} complete", metadata.name);
     }
diff --git a/src/java/org/apache/cassandra/index/internal/CollatedViewIndexBuilder.java b/src/java/org/apache/cassandra/index/internal/CollatedViewIndexBuilder.java
index 3c005c4..07bdc42 100644
--- a/src/java/org/apache/cassandra/index/internal/CollatedViewIndexBuilder.java
+++ b/src/java/org/apache/cassandra/index/internal/CollatedViewIndexBuilder.java
@@ -19,10 +19,10 @@
 
 import java.util.Collection;
 import java.util.Set;
-import java.util.UUID;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.RegularAndStaticColumns;
 import org.apache.cassandra.db.compaction.CompactionInfo;
 import org.apache.cassandra.db.compaction.CompactionInterruptedException;
 import org.apache.cassandra.db.compaction.OperationType;
@@ -30,7 +30,10 @@
 import org.apache.cassandra.index.SecondaryIndexBuilder;
 import org.apache.cassandra.io.sstable.ReducingKeyIterator;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * Manages building an entire index from column family data. Runs on to compaction manager.
@@ -40,7 +43,7 @@
     private final ColumnFamilyStore cfs;
     private final Set<Index> indexers;
     private final ReducingKeyIterator iter;
-    private final UUID compactionId;
+    private final TimeUUID compactionId;
     private final Collection<SSTableReader> sstables;
 
     public CollatedViewIndexBuilder(ColumnFamilyStore cfs, Set<Index> indexers, ReducingKeyIterator iter, Collection<SSTableReader> sstables)
@@ -48,18 +51,18 @@
         this.cfs = cfs;
         this.indexers = indexers;
         this.iter = iter;
-        this.compactionId = UUIDGen.getTimeUUID();
+        this.compactionId = nextTimeUUID();
         this.sstables = sstables;
     }
 
     public CompactionInfo getCompactionInfo()
     {
         return new CompactionInfo(cfs.metadata(),
-                OperationType.INDEX_BUILD,
-                iter.getBytesRead(),
-                iter.getTotalBytes(),
-                compactionId,
-                sstables);
+                                  OperationType.INDEX_BUILD,
+                                  iter.getBytesRead(),
+                                  iter.getTotalBytes(),
+                                  compactionId,
+                                  sstables);
     }
 
     public void build()
@@ -67,12 +70,14 @@
         try
         {
             int pageSize = cfs.indexManager.calculateIndexingPageSize();
+            RegularAndStaticColumns targetPartitionColumns = extractIndexedColumns();
+            
             while (iter.hasNext())
             {
                 if (isStopRequested())
                     throw new CompactionInterruptedException(getCompactionInfo());
                 DecoratedKey key = iter.next();
-                cfs.indexManager.indexPartition(key, indexers, pageSize);
+                cfs.indexManager.indexPartition(key, indexers, pageSize, targetPartitionColumns);
             }
         }
         finally
@@ -80,4 +85,30 @@
             iter.close();
         }
     }
+
+    private RegularAndStaticColumns extractIndexedColumns()
+    {
+        RegularAndStaticColumns.Builder builder = RegularAndStaticColumns.builder();
+        
+        for (Index index : indexers)
+        {
+            boolean isPartitionIndex = true;
+            
+            for (ColumnMetadata column : cfs.metadata().regularAndStaticColumns())
+            {
+                if (index.dependsOn(column))
+                {
+                    builder.add(column);
+                    isPartitionIndex = false;
+                }
+            }
+
+            // if any index declares no dependency on any column, it is a full partition index
+            // so we can use the base partition columns as the input source
+            if (isPartitionIndex)
+                return cfs.metadata().regularAndStaticColumns();
+        }
+        
+        return builder.build();
+    }
 }
diff --git a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
index 815b881..457dee13 100644
--- a/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
+++ b/src/java/org/apache/cassandra/index/internal/composites/CompositesSearcher.java
@@ -24,7 +24,6 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.ClusteringIndexNamesFilter;
-import org.apache.cassandra.db.filter.ClusteringIndexSliceFilter;
 import org.apache.cassandra.db.filter.DataLimits;
 import org.apache.cassandra.db.filter.RowFilter;
 import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
@@ -34,7 +33,6 @@
 import org.apache.cassandra.index.internal.CassandraIndexSearcher;
 import org.apache.cassandra.index.internal.IndexEntry;
 import org.apache.cassandra.utils.btree.BTreeSet;
-import org.apache.cassandra.utils.concurrent.OpOrder;
 
 
 public class CompositesSearcher extends CassandraIndexSearcher
diff --git a/src/java/org/apache/cassandra/index/internal/keys/KeysIndex.java b/src/java/org/apache/cassandra/index/internal/keys/KeysIndex.java
index b044bbe..4c8e75d 100644
--- a/src/java/org/apache/cassandra/index/internal/keys/KeysIndex.java
+++ b/src/java/org/apache/cassandra/index/internal/keys/KeysIndex.java
@@ -86,4 +86,4 @@
                 || !cell.isLive(nowInSec)
                 || compare(indexValue, cell) != 0);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java b/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java
index 2114d42..9e865d9 100644
--- a/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java
+++ b/src/java/org/apache/cassandra/index/internal/keys/KeysSearcher.java
@@ -160,4 +160,4 @@
             return iterator;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/sasi/SASIIndex.java b/src/java/org/apache/cassandra/index/sasi/SASIIndex.java
index b1998bc..1e86bc6 100644
--- a/src/java/org/apache/cassandra/index/sasi/SASIIndex.java
+++ b/src/java/org/apache/cassandra/index/sasi/SASIIndex.java
@@ -72,9 +72,7 @@
                                                        Set<Index> indexes,
                                                        Collection<SSTableReader> sstablesToRebuild)
         {
-            NavigableMap<SSTableReader, Map<ColumnMetadata, ColumnIndex>> sstables = new TreeMap<>((a, b) -> {
-                return Integer.compare(a.descriptor.generation, b.descriptor.generation);
-            });
+            NavigableMap<SSTableReader, Map<ColumnMetadata, ColumnIndex>> sstables = new TreeMap<>(SSTableReader.idComparator);
 
             indexes.stream()
                    .filter((i) -> i instanceof SASIIndex)
@@ -113,8 +111,7 @@
         Tracker tracker = baseCfs.getTracker();
         tracker.subscribe(this);
 
-        SortedMap<SSTableReader, Map<ColumnMetadata, ColumnIndex>> toRebuild = new TreeMap<>((a, b)
-                                                -> Integer.compare(a.descriptor.generation, b.descriptor.generation));
+        SortedMap<SSTableReader, Map<ColumnMetadata, ColumnIndex>> toRebuild = new TreeMap<>(SSTableReader.idComparator);
 
         for (SSTableReader sstable : index.init(tracker.getView().liveSSTables()))
         {
@@ -294,7 +291,7 @@
 
             public void adjustMemtableSize(long additionalSpace, OpOrder.Group opGroup)
             {
-                baseCfs.getTracker().getView().getCurrentMemtable().getAllocator().onHeap().allocate(additionalSpace, opGroup);
+                baseCfs.getTracker().getView().getCurrentMemtable().markExtraOnHeapUsed(additionalSpace, opGroup);
             }
         };
     }
diff --git a/src/java/org/apache/cassandra/index/sasi/SASIIndexBuilder.java b/src/java/org/apache/cassandra/index/sasi/SASIIndexBuilder.java
index bb42dc2..57a3f51 100644
--- a/src/java/org/apache/cassandra/index/sasi/SASIIndexBuilder.java
+++ b/src/java/org/apache/cassandra/index/sasi/SASIIndexBuilder.java
@@ -20,10 +20,10 @@
  */
 package org.apache.cassandra.index.sasi;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.*;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -42,12 +42,14 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 class SASIIndexBuilder extends SecondaryIndexBuilder
 {
     private final ColumnFamilyStore cfs;
-    private final UUID compactionId = UUIDGen.getTimeUUID();
+    private final TimeUUID compactionId = nextTimeUUID();
 
     private final SortedMap<SSTableReader, Map<ColumnMetadata, ColumnIndex>> sstables;
 
diff --git a/src/java/org/apache/cassandra/index/sasi/SSTableIndex.java b/src/java/org/apache/cassandra/index/sasi/SSTableIndex.java
index c67c39c..d756737 100644
--- a/src/java/org/apache/cassandra/index/sasi/SSTableIndex.java
+++ b/src/java/org/apache/cassandra/index/sasi/SSTableIndex.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.index.sasi;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -33,6 +32,7 @@
 import org.apache.cassandra.index.sasi.utils.RangeIterator;
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.concurrent.Ref;
 
diff --git a/src/java/org/apache/cassandra/index/sasi/TermIterator.java b/src/java/org/apache/cassandra/index/sasi/TermIterator.java
index 85f81b0..d65b386 100644
--- a/src/java/org/apache/cassandra/index/sasi/TermIterator.java
+++ b/src/java/org/apache/cassandra/index/sasi/TermIterator.java
@@ -20,25 +20,27 @@
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 
 import io.netty.util.concurrent.FastThreadLocal;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder;
 import org.apache.cassandra.index.sasi.disk.Token;
 import org.apache.cassandra.index.sasi.plan.Expression;
 import org.apache.cassandra.index.sasi.utils.RangeUnionIterator;
 import org.apache.cassandra.index.sasi.utils.RangeIterator;
 import org.apache.cassandra.io.util.FileUtils;
 
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.Uninterruptibles;
-
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static java.lang.String.format;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder.Mode.CONTAINS;
+import static org.apache.cassandra.index.sasi.plan.Expression.Op.PREFIX;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
+
 public class TermIterator extends RangeIterator<Long, Token>
 {
     private static final Logger logger = LoggerFactory.getLogger(TermIterator.class);
@@ -53,16 +55,8 @@
             logger.info("Search Concurrency Factor is set to {} for {}", concurrencyFactor, currentThread);
 
             return (concurrencyFactor <= 1)
-                    ? MoreExecutors.newDirectExecutorService()
-                    : Executors.newFixedThreadPool(concurrencyFactor, new ThreadFactory()
-            {
-                public final AtomicInteger count = new AtomicInteger();
-
-                public Thread newThread(Runnable task)
-                {
-                    return NamedThreadFactory.createThread(task, currentThread + "-SEARCH-" + count.incrementAndGet(), true);
-                }
-            });
+                    ? ImmediateExecutor.INSTANCE
+                    : executorFactory().pooled(currentThread + "-SEARCH-", concurrencyFactor);
         }
     };
 
@@ -99,14 +93,14 @@
 
         try
         {
-            final CountDownLatch latch = new CountDownLatch(perSSTableIndexes.size());
+            final CountDownLatch latch = newCountDownLatch(perSSTableIndexes.size());
             final ExecutorService searchExecutor = SEARCH_EXECUTOR.get();
 
             for (final SSTableIndex index : perSSTableIndexes)
             {
-                if (e.getOp() == Expression.Op.PREFIX &&
-                    index.mode() == OnDiskIndexBuilder.Mode.CONTAINS && !index.hasMarkedPartials())
-                    throw new UnsupportedOperationException(String.format("The index %s has not yet been upgraded " +
+                if (e.getOp() == PREFIX &&
+                    index.mode() == CONTAINS && !index.hasMarkedPartials())
+                    throw new UnsupportedOperationException(format("The index %s has not yet been upgraded " +
                                                                           "to support prefix queries in CONTAINS mode. " +
                                                                           "Wait for compaction or rebuild the index.",
                                                                           index.getPath()));
@@ -114,7 +108,7 @@
 
                 if (!index.reference())
                 {
-                    latch.countDown();
+                    latch.decrement();
                     continue;
                 }
 
@@ -142,16 +136,16 @@
                         releaseIndex(referencedIndexes, index);
 
                         if (logger.isDebugEnabled())
-                            logger.debug(String.format("Failed search an index %s, skipping.", index.getPath()), e1);
+                            logger.debug(format("Failed search an index %s, skipping.", index.getPath()), e1);
                     }
                     finally
                     {
-                        latch.countDown();
+                        latch.decrement();
                     }
                 });
             }
 
-            Uninterruptibles.awaitUninterruptibly(latch);
+            latch.awaitUninterruptibly();
 
             // checkpoint right away after all indexes complete search because we might have crossed the quota
             e.checkpoint();
diff --git a/src/java/org/apache/cassandra/index/sasi/analyzer/DelimiterAnalyzer.java b/src/java/org/apache/cassandra/index/sasi/analyzer/DelimiterAnalyzer.java
index 05dfedc..b7f297b 100644
--- a/src/java/org/apache/cassandra/index/sasi/analyzer/DelimiterAnalyzer.java
+++ b/src/java/org/apache/cassandra/index/sasi/analyzer/DelimiterAnalyzer.java
@@ -108,4 +108,4 @@
     {
         return VALID_ANALYZABLE_TYPES.containsKey(validator);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StemmerFactory.java b/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StemmerFactory.java
index d278c28..457876a 100644
--- a/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StemmerFactory.java
+++ b/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StemmerFactory.java
@@ -22,8 +22,7 @@
 import java.util.Locale;
 import java.util.Map;
 
-import com.google.common.util.concurrent.MoreExecutors;
-
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.tartarus.snowball.SnowballStemmer;
 import org.tartarus.snowball.ext.*;
 
@@ -42,7 +41,7 @@
 {
     private static final Logger logger = LoggerFactory.getLogger(StemmerFactory.class);
     private static final LoadingCache<Class, Constructor<?>> STEMMER_CONSTRUCTOR_CACHE = Caffeine.newBuilder()
-            .executor(MoreExecutors.directExecutor())
+            .executor(ImmediateExecutor.INSTANCE)
             .build(new CacheLoader<Class, Constructor<?>>()
             {
                 public Constructor<?> load(Class aClass) throws Exception
diff --git a/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StopWordFactory.java b/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StopWordFactory.java
index 1548a6a..b85a36f 100644
--- a/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StopWordFactory.java
+++ b/src/java/org/apache/cassandra/index/sasi/analyzer/filter/StopWordFactory.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.index.sasi.analyzer.filter;
 
 import java.io.BufferedReader;
-import java.io.File;
 import java.io.InputStream;
 import java.io.InputStreamReader;
 import java.nio.charset.StandardCharsets;
@@ -28,11 +27,11 @@
 import java.util.Set;
 import java.util.concurrent.CompletionException;
 
-import com.google.common.util.concurrent.MoreExecutors;
-
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
 
+import org.apache.cassandra.concurrent.ImmediateExecutor;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,13 +44,13 @@
 
     private static final String DEFAULT_RESOURCE_EXT = "_ST.txt";
     private static final String DEFAULT_RESOURCE_PREFIX = StopWordFactory.class.getPackage()
-            .getName().replace(".", File.separator);
+            .getName().replace(".", File.pathSeparator());
     private static final Set<String> SUPPORTED_LANGUAGES = new HashSet<>(
             Arrays.asList("ar","bg","cs","de","en","es","fi","fr","hi","hu","it",
             "pl","pt","ro","ru","sv"));
 
     private static final LoadingCache<String, Set<String>> STOP_WORDS_CACHE = Caffeine.newBuilder()
-            .executor(MoreExecutors.directExecutor())
+            .executor(ImmediateExecutor.INSTANCE)
             .build(StopWordFactory::getStopWordsFromResource);
 
     public static Set<String> getStopWordsForLanguage(Locale locale)
@@ -74,7 +73,7 @@
     private static Set<String> getStopWordsFromResource(String language)
     {
         Set<String> stopWords = new HashSet<>();
-        String resourceName = DEFAULT_RESOURCE_PREFIX + File.separator + language + DEFAULT_RESOURCE_EXT;
+        String resourceName = DEFAULT_RESOURCE_PREFIX + File.pathSeparator() + language + DEFAULT_RESOURCE_EXT;
         try (InputStream is = StopWordFactory.class.getClassLoader().getResourceAsStream(resourceName);
              BufferedReader r = new BufferedReader(new InputStreamReader(is, StandardCharsets.UTF_8)))
         {
diff --git a/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java b/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java
index 4c9c59e..81b776d 100644
--- a/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java
+++ b/src/java/org/apache/cassandra/index/sasi/conf/ColumnIndex.java
@@ -31,7 +31,7 @@
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.cql3.Operator;
 import org.apache.cassandra.db.DecoratedKey;
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.AsciiType;
 import org.apache.cassandra.db.marshal.UTF8Type;
@@ -223,10 +223,10 @@
 
         Op operator = Op.valueOf(op);
         return !(isTokenized && operator == Op.EQ) // EQ is only applicable to non-tokenized indexes
+               && operator != Op.IN // IN operator is not supported
                && !(isTokenized && mode.mode == OnDiskIndexBuilder.Mode.CONTAINS && operator == Op.PREFIX) // PREFIX not supported on tokenized CONTAINS mode indexes
                && !(isLiteral() && operator == Op.RANGE) // RANGE only applicable to indexes non-literal indexes
                && mode.supports(operator); // for all other cases let's refer to index itself
-
     }
 
     public static ByteBuffer getValueOf(ColumnMetadata column, Row row, int nowInSecs)
diff --git a/src/java/org/apache/cassandra/index/sasi/conf/DataTracker.java b/src/java/org/apache/cassandra/index/sasi/conf/DataTracker.java
index 99516b8..bf2293f 100644
--- a/src/java/org/apache/cassandra/index/sasi/conf/DataTracker.java
+++ b/src/java/org/apache/cassandra/index/sasi/conf/DataTracker.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.index.sasi.conf;
 
-import java.io.File;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -29,6 +28,7 @@
 import org.apache.cassandra.index.sasi.SSTableIndex;
 import org.apache.cassandra.index.sasi.conf.view.View;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.Pair;
 
 import org.slf4j.Logger;
@@ -181,7 +181,7 @@
             }
             catch (Throwable t)
             {
-                logger.error("Can't open index file at " + indexFile.getAbsolutePath() + ", skipping.", t);
+                logger.error("Can't open index file at " + indexFile.absolutePath() + ", skipping.", t);
                 if (index != null)
                     index.release();
             }
diff --git a/src/java/org/apache/cassandra/index/sasi/conf/IndexMode.java b/src/java/org/apache/cassandra/index/sasi/conf/IndexMode.java
index 875d2f7..7d4f5c9 100644
--- a/src/java/org/apache/cassandra/index/sasi/conf/IndexMode.java
+++ b/src/java/org/apache/cassandra/index/sasi/conf/IndexMode.java
@@ -190,7 +190,7 @@
 
         if (maxMemBytes > 100L * 1073741824)
         {
-            logger.error("{} configured as {} is above 100GB, reverting to default 1GB", INDEX_MAX_FLUSH_MEMORY_OPTION, maxMemBytes);
+            logger.error("{} configured as {} is above 100GiB, reverting to default 1GB", INDEX_MAX_FLUSH_MEMORY_OPTION, maxMemBytes);
             maxMemBytes = DEFAULT_MAX_MEM_BYTES;
         }
         return new IndexMode(mode, isLiteral, isAnalyzed, analyzerClass, maxMemBytes);
diff --git a/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java b/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java
index 4d43cd9..e438079 100644
--- a/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java
+++ b/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndex.java
@@ -19,6 +19,7 @@
 
 import java.io.*;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
 import java.util.*;
 import java.util.stream.Collectors;
 
@@ -33,6 +34,8 @@
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.util.ChannelProxy;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
@@ -121,13 +124,11 @@
         keyFetcher = keyReader;
 
         comparator = cmp;
-        indexPath = index.getAbsolutePath();
+        indexPath = index.absolutePath();
 
-        RandomAccessFile backingFile = null;
-        try
+
+        try (FileInputStreamPlus backingFile = new FileInputStreamPlus(index))
         {
-            backingFile = new RandomAccessFile(index, "r");
-
             descriptor = new Descriptor(backingFile.readUTF());
 
             termSize = OnDiskIndexBuilder.TermSize.of(backingFile.readShort());
@@ -141,32 +142,29 @@
             mode = OnDiskIndexBuilder.Mode.mode(backingFile.readUTF());
             hasMarkedPartials = backingFile.readBoolean();
 
-            indexSize = backingFile.length();
-            indexFile = new MappedBuffer(new ChannelProxy(indexPath, backingFile.getChannel()));
-
-            // start of the levels
-            indexFile.position(indexFile.getLong(indexSize - 8));
-
-            int numLevels = indexFile.getInt();
-            levels = new PointerLevel[numLevels];
-            for (int i = 0; i < levels.length; i++)
-            {
-                int blockCount = indexFile.getInt();
-                levels[i] = new PointerLevel(indexFile.position(), blockCount);
-                indexFile.position(indexFile.position() + blockCount * 8);
-            }
-
-            int blockCount = indexFile.getInt();
-            dataLevel = new DataLevel(indexFile.position(), blockCount);
+            FileChannel channel = index.newReadChannel();
+            indexSize = channel.size();
+            indexFile = new MappedBuffer(new ChannelProxy(indexPath, channel));
         }
         catch (IOException e)
         {
             throw new FSReadError(e, index);
         }
-        finally
+
+        // start of the levels
+        indexFile.position(indexFile.getLong(indexSize - 8));
+
+        int numLevels = indexFile.getInt();
+        levels = new PointerLevel[numLevels];
+        for (int i = 0; i < levels.length; i++)
         {
-            FileUtils.closeQuietly(backingFile);
+            int blockCount = indexFile.getInt();
+            levels[i] = new PointerLevel(indexFile.position(), blockCount);
+            indexFile.position(indexFile.position() + blockCount * 8);
         }
+
+        int blockCount = indexFile.getInt();
+        dataLevel = new DataLevel(indexFile.position(), blockCount);
     }
 
     public boolean hasMarkedPartials()
diff --git a/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndexBuilder.java b/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndexBuilder.java
index 0298539..a6faa04 100644
--- a/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndexBuilder.java
+++ b/src/java/org/apache/cassandra/index/sasi/disk/OnDiskIndexBuilder.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.index.sasi.disk;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
@@ -247,15 +246,7 @@
         // no terms means there is nothing to build
         if (terms.isEmpty())
         {
-            try
-            {
-                file.createNewFile();
-            }
-            catch (IOException e)
-            {
-                throw new FSWriteError(e, file);
-            }
-
+            file.createFileIfNotExists();
             return false;
         }
 
diff --git a/src/java/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriter.java b/src/java/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriter.java
index 0af4ba2..fb5e9b9 100644
--- a/src/java/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriter.java
+++ b/src/java/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriter.java
@@ -17,16 +17,14 @@
  */
 package org.apache.cassandra.index.sasi.disk;
 
-import java.io.File;
 import java.nio.ByteBuffer;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.*;
 
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.compaction.OperationType;
@@ -43,36 +41,34 @@
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Maps;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.Uninterruptibles;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
+
 public class PerSSTableIndexWriter implements SSTableFlushObserver
 {
     private static final Logger logger = LoggerFactory.getLogger(PerSSTableIndexWriter.class);
 
     private static final int POOL_SIZE = 8;
-    private static final ThreadPoolExecutor INDEX_FLUSHER_MEMTABLE;
-    private static final ThreadPoolExecutor INDEX_FLUSHER_GENERAL;
+    private static final ExecutorPlus INDEX_FLUSHER_MEMTABLE;
+    private static final ExecutorPlus INDEX_FLUSHER_GENERAL;
 
     static
     {
-        INDEX_FLUSHER_GENERAL = new JMXEnabledThreadPoolExecutor(POOL_SIZE, POOL_SIZE, 1, TimeUnit.MINUTES,
-                                                                 new LinkedBlockingQueue<>(),
-                                                                 new NamedThreadFactory("SASI-General"),
-                                                                 "internal");
-        INDEX_FLUSHER_GENERAL.allowCoreThreadTimeOut(true);
+        INDEX_FLUSHER_GENERAL = executorFactory().withJmxInternal()
+                                                 .pooled("SASI-General", POOL_SIZE);
 
-        INDEX_FLUSHER_MEMTABLE = new JMXEnabledThreadPoolExecutor(POOL_SIZE, POOL_SIZE, 1, TimeUnit.MINUTES,
-                                                                  new LinkedBlockingQueue<>(),
-                                                                  new NamedThreadFactory("SASI-Memtable"),
-                                                                  "internal");
-        INDEX_FLUSHER_MEMTABLE.allowCoreThreadTimeOut(true);
+        INDEX_FLUSHER_MEMTABLE = executorFactory().withJmxInternal()
+                                                  .pooled("SASI-Memtable", POOL_SIZE);
     }
 
     private final int nowInSec = FBUtilities.nowInSeconds();
@@ -139,11 +135,11 @@
 
         try
         {
-            CountDownLatch latch = new CountDownLatch(indexes.size());
+            CountDownLatch latch = newCountDownLatch(indexes.size());
             for (Index index : indexes.values())
                 index.complete(latch);
 
-            Uninterruptibles.awaitUninterruptibly(latch);
+            latch.awaitUninterruptibly();
         }
         finally
         {
@@ -251,7 +247,7 @@
             final String segmentFile = filename(isFinal);
 
             return () -> {
-                long start = System.nanoTime();
+                long start = nanoTime();
 
                 try
                 {
@@ -266,7 +262,7 @@
                 finally
                 {
                     if (!isFinal)
-                        logger.info("Flushed index segment {}, took {} ms.", segmentFile, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
+                        logger.info("Flushed index segment {}, took {} ms.", segmentFile, TimeUnit.NANOSECONDS.toMillis(nanoTime() - start));
                 }
             };
         }
@@ -276,7 +272,7 @@
             logger.info("Scheduling index flush to {}", outputFile);
 
             getExecutor().submit((Runnable) () -> {
-                long start1 = System.nanoTime();
+                long start1 = nanoTime();
 
                 OnDiskIndex[] parts = new OnDiskIndex[segments.size() + 1];
 
@@ -294,7 +290,7 @@
                     {
                         @SuppressWarnings("resource")
                         OnDiskIndex last = scheduleSegmentFlush(false).call();
-                        segments.add(Futures.immediateFuture(last));
+                        segments.add(ImmediateFuture.success(last));
                     }
 
                     int index = 0;
@@ -324,7 +320,7 @@
                 }
                 finally
                 {
-                    logger.info("Index flush to {} took {} ms.", outputFile, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start1));
+                    logger.info("Index flush to {} took {} ms.", outputFile, TimeUnit.NANOSECONDS.toMillis(nanoTime() - start1));
 
                     for (int segment = 0; segment < segmentNumber; segment++)
                     {
@@ -337,7 +333,7 @@
                         FileUtils.delete(outputFile + "_" + segment);
                     }
 
-                    latch.countDown();
+                    latch.decrement();
                 }
             });
         }
diff --git a/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java b/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java
index e510cdd..3a401ca 100644
--- a/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java
+++ b/src/java/org/apache/cassandra/index/sasi/disk/TokenTree.java
@@ -520,4 +520,4 @@
             return index < offsets.length ? keyFetcher.apply(offsets[index++]) : endOfData();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/sasi/disk/TokenTreeBuilder.java b/src/java/org/apache/cassandra/index/sasi/disk/TokenTreeBuilder.java
index 29cecc8..01a536c 100644
--- a/src/java/org/apache/cassandra/index/sasi/disk/TokenTreeBuilder.java
+++ b/src/java/org/apache/cassandra/index/sasi/disk/TokenTreeBuilder.java
@@ -75,4 +75,4 @@
 
     int serializedSize();
     void write(DataOutputPlus out) throws IOException;
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java b/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java
index 0f681b7..d60914d 100644
--- a/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java
+++ b/src/java/org/apache/cassandra/index/sasi/memory/KeyRangeIterator.java
@@ -126,4 +126,4 @@
             return keys.iterator();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/sasi/plan/Expression.java b/src/java/org/apache/cassandra/index/sasi/plan/Expression.java
index 8de45e8..6c3b9b8 100644
--- a/src/java/org/apache/cassandra/index/sasi/plan/Expression.java
+++ b/src/java/org/apache/cassandra/index/sasi/plan/Expression.java
@@ -47,7 +47,7 @@
 
     public enum Op
     {
-        EQ, MATCH, PREFIX, SUFFIX, CONTAINS, NOT_EQ, RANGE;
+        EQ, MATCH, PREFIX, SUFFIX, CONTAINS, NOT_EQ, RANGE, IN;
 
         public static Op valueOf(Operator operator)
         {
@@ -56,6 +56,9 @@
                 case EQ:
                     return EQ;
 
+                case IN:
+                    return IN;
+
                 case NEQ:
                     return NOT_EQ;
 
diff --git a/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java b/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java
index db16c52..60538e1 100644
--- a/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java
+++ b/src/java/org/apache/cassandra/index/sasi/plan/QueryController.java
@@ -49,6 +49,8 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.Pair;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class QueryController
 {
     private final long executionQuota;
@@ -65,7 +67,7 @@
         this.command = command;
         this.range = command.dataRange();
         this.executionQuota = TimeUnit.MILLISECONDS.toNanos(timeQuotaMs);
-        this.executionStart = System.nanoTime();
+        this.executionStart = nanoTime();
     }
 
     public TableMetadata metadata()
@@ -154,7 +156,7 @@
 
     public void checkpoint()
     {
-	long executionTime = (System.nanoTime() - executionStart);
+	long executionTime = (nanoTime() - executionStart);
 
         if (executionTime >= executionQuota)
             throw new TimeQuotaExceededException(
diff --git a/src/java/org/apache/cassandra/index/sasi/utils/CombinedTerm.java b/src/java/org/apache/cassandra/index/sasi/utils/CombinedTerm.java
index 81e535d..cc327bc 100644
--- a/src/java/org/apache/cassandra/index/sasi/utils/CombinedTerm.java
+++ b/src/java/org/apache/cassandra/index/sasi/utils/CombinedTerm.java
@@ -81,4 +81,4 @@
     {
         return term.compareTo(comparator, o.get().getTerm());
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/sasi/utils/trie/Cursor.java b/src/java/org/apache/cassandra/index/sasi/utils/trie/Cursor.java
index dde3c8a..7c86b97 100644
--- a/src/java/org/apache/cassandra/index/sasi/utils/trie/Cursor.java
+++ b/src/java/org/apache/cassandra/index/sasi/utils/trie/Cursor.java
@@ -80,4 +80,4 @@
      * Note: Not all operations support {@link Decision#REMOVE}.
      */
     Decision select(Map.Entry<? extends K, ? extends V> entry);
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/index/sasi/utils/trie/PatriciaTrie.java b/src/java/org/apache/cassandra/index/sasi/utils/trie/PatriciaTrie.java
index 9187894..a36af98 100644
--- a/src/java/org/apache/cassandra/index/sasi/utils/trie/PatriciaTrie.java
+++ b/src/java/org/apache/cassandra/index/sasi/utils/trie/PatriciaTrie.java
@@ -1258,4 +1258,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/FSDiskFullWriteError.java b/src/java/org/apache/cassandra/io/FSDiskFullWriteError.java
index ebb07e2..abf0b6c 100644
--- a/src/java/org/apache/cassandra/io/FSDiskFullWriteError.java
+++ b/src/java/org/apache/cassandra/io/FSDiskFullWriteError.java
@@ -28,10 +28,4 @@
                                             mutationSize,
                                             keyspace)));
     }
-
-    @Override
-    public String toString()
-    {
-        return "FSDiskFullWriteError";
-    }
 }
diff --git a/src/java/org/apache/cassandra/io/FSError.java b/src/java/org/apache/cassandra/io/FSError.java
index e09bac7..4c06d9c 100644
--- a/src/java/org/apache/cassandra/io/FSError.java
+++ b/src/java/org/apache/cassandra/io/FSError.java
@@ -17,17 +17,38 @@
  */
 package org.apache.cassandra.io;
 
-import java.io.File;
 import java.io.IOError;
+import java.nio.file.Path;
+
+import org.apache.cassandra.io.util.File;
 
 public abstract class FSError extends IOError
 {
-    public final File path;
+    final String message;
+    public final String path;
 
     public FSError(Throwable cause, File path)
     {
+        this(null, cause, path);
+    }
+
+    public FSError(Throwable cause, Path path)
+    {
+        this(null, cause, path);
+    }
+
+    public FSError(String message, Throwable cause, File path)
+    {
         super(cause);
-        this.path = path;
+        this.message = message;
+        this.path = path.toString();
+    }
+
+    public FSError(String message, Throwable cause, Path path)
+    {
+        super(cause);
+        this.message = message;
+        this.path = path.toString();
     }
 
     /**
@@ -45,4 +66,10 @@
 
         return null;
     }
+
+    @Override
+    public String toString()
+    {
+        return getClass().getSimpleName() + (message != null ? ' ' + message : "") + (path != null ? " in " + path : "");
+    }
 }
diff --git a/src/java/org/apache/cassandra/io/FSErrorHandler.java b/src/java/org/apache/cassandra/io/FSErrorHandler.java
index 081ec0b..b7d2836 100644
--- a/src/java/org/apache/cassandra/io/FSErrorHandler.java
+++ b/src/java/org/apache/cassandra/io/FSErrorHandler.java
@@ -27,4 +27,5 @@
 {
     void handleCorruptSSTable(CorruptSSTableException e);
     void handleFSError(FSError e);
+    default void handleStartupFSError(Throwable t) {}
 }
diff --git a/src/java/org/apache/cassandra/io/FSNoDiskAvailableForWriteError.java b/src/java/org/apache/cassandra/io/FSNoDiskAvailableForWriteError.java
index 14dcd38..415f204 100644
--- a/src/java/org/apache/cassandra/io/FSNoDiskAvailableForWriteError.java
+++ b/src/java/org/apache/cassandra/io/FSNoDiskAvailableForWriteError.java
@@ -30,10 +30,4 @@
         super(new IOException(String.format("The data directories for the %s keyspace have been marked as unwritable",
                                             keyspace)));
     }
-
-    @Override
-    public String toString()
-    {
-        return "FSNoDiskAvailableForWriteError";
-    }
 }
diff --git a/src/java/org/apache/cassandra/io/FSReadError.java b/src/java/org/apache/cassandra/io/FSReadError.java
index c557fc5..ac15534 100644
--- a/src/java/org/apache/cassandra/io/FSReadError.java
+++ b/src/java/org/apache/cassandra/io/FSReadError.java
@@ -17,10 +17,18 @@
  */
 package org.apache.cassandra.io;
 
-import java.io.File;
+
+import java.nio.file.Path;
+
+import org.apache.cassandra.io.util.File;
 
 public class FSReadError extends FSError
 {
+    public FSReadError(Throwable cause, Path path)
+    {
+        super(cause, path);
+    }
+
     public FSReadError(Throwable cause, File path)
     {
         super(cause, path);
@@ -31,9 +39,23 @@
         this(cause, new File(path));
     }
 
-    @Override
-    public String toString()
+    public FSReadError(String message, Throwable cause, Path path)
     {
-        return "FSReadError in " + path;
+        super(message, cause, path);
+    }
+
+    public FSReadError(String message, Throwable cause, File path)
+    {
+        super(message, cause, path);
+    }
+
+    public FSReadError(String message, Throwable cause, String path)
+    {
+        this(message, cause, new File(path));
+    }
+
+    public FSReadError(String message, Throwable cause)
+    {
+        this(message, cause, new File(""));
     }
 }
diff --git a/src/java/org/apache/cassandra/io/FSWriteError.java b/src/java/org/apache/cassandra/io/FSWriteError.java
index b419086..81f00bd 100644
--- a/src/java/org/apache/cassandra/io/FSWriteError.java
+++ b/src/java/org/apache/cassandra/io/FSWriteError.java
@@ -17,10 +17,18 @@
  */
 package org.apache.cassandra.io;
 
-import java.io.File;
+
+import java.nio.file.Path;
+
+import org.apache.cassandra.io.util.File;
 
 public class FSWriteError extends FSError
 {
+    public FSWriteError(Throwable cause, Path path)
+    {
+        super(cause, path);
+    }
+
     public FSWriteError(Throwable cause, File path)
     {
         super(cause, path);
@@ -36,9 +44,23 @@
         this(cause, new File(""));
     }
 
-    @Override
-    public String toString()
+    public FSWriteError(String message, Throwable cause, Path path)
     {
-        return "FSWriteError in " + path;
+        super(message, cause, path);
+    }
+
+    public FSWriteError(String message, Throwable cause, File path)
+    {
+        super(message, cause, path);
+    }
+
+    public FSWriteError(String message, Throwable cause, String path)
+    {
+        this(message, cause, new File(path));
+    }
+
+    public FSWriteError(String message, Throwable cause)
+    {
+        this(message, cause, new File(""));
     }
 }
diff --git a/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java b/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
index 2190824..024e4ef 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressedSequentialWriter.java
@@ -19,7 +19,6 @@
 
 import java.io.DataOutputStream;
 import java.io.EOFException;
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
diff --git a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
index 45cf7af..5af9c92 100644
--- a/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
+++ b/src/java/org/apache/cassandra/io/compress/CompressionMetadata.java
@@ -17,21 +17,15 @@
  */
 package org.apache.cassandra.io.compress;
 
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.io.BufferedOutputStream;
+import java.nio.file.NoSuchFileException;
 import java.io.DataInput;
-import java.io.DataInputStream;
 import java.io.DataOutput;
-import java.io.DataOutputStream;
 import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
+
+import org.apache.cassandra.io.util.*;
 import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.SortedSet;
@@ -50,12 +44,7 @@
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
-import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.io.util.Memory;
-import org.apache.cassandra.io.util.SafeMemory;
 import org.apache.cassandra.schema.CompressionParams;
-import org.apache.cassandra.utils.SyncUtil;
 import org.apache.cassandra.utils.concurrent.Transactional;
 import org.apache.cassandra.utils.concurrent.Ref;
 
@@ -106,7 +95,7 @@
     {
         this.indexFilePath = indexFilePath;
 
-        try (DataInputStream stream = new DataInputStream(Files.newInputStream(Paths.get(indexFilePath))))
+        try (FileInputStreamPlus stream = new File(indexFilePath).newInputStream())
         {
             String compressorName = stream.readUTF();
             int optionCount = stream.readInt();
@@ -134,7 +123,7 @@
             compressedFileLength = compressedLength;
             chunkOffsets = readChunkOffsets(stream);
         }
-        catch (FileNotFoundException e)
+        catch (FileNotFoundException | NoSuchFileException e)
         {
             throw new RuntimeException(e);
         }
@@ -412,17 +401,16 @@
             }
 
             // flush the data to disk
-            try (FileOutputStream fos = new FileOutputStream(filePath);
-                 DataOutputStream out = new DataOutputStream(new BufferedOutputStream(fos)))
+            try (FileOutputStreamPlus out = new FileOutputStreamPlus(filePath))
             {
                 writeHeader(out, dataLength, count);
                 for (int i = 0; i < count; i++)
                     out.writeLong(offsets.getLong(i * 8L));
 
                 out.flush();
-                SyncUtil.sync(fos);
+                out.sync();
             }
-            catch (FileNotFoundException fnfe)
+            catch (FileNotFoundException | NoSuchFileException fnfe)
             {
                 throw Throwables.propagate(fnfe);
             }
diff --git a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java
index 4eaf1fe..49ceb76 100644
--- a/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/AbstractSSTableSimpleWriter.java
@@ -17,20 +17,21 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
-import java.io.FileFilter;
+
 import java.io.IOException;
 import java.io.Closeable;
 import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.Collections;
-import java.util.HashSet;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Stream;
 
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.rows.EncodingStats;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.service.ActiveRepairService;
 
@@ -43,7 +44,7 @@
     protected final TableMetadataRef metadata;
     protected final RegularAndStaticColumns columns;
     protected SSTableFormat.Type formatType = SSTableFormat.Type.current();
-    protected static AtomicInteger generation = new AtomicInteger(0);
+    protected static final AtomicReference<SSTableId> id = new AtomicReference<>(SSTableIdFactory.instance.defaultBuilder().generator(Stream.empty()).get());
     protected boolean makeRangeAware = false;
 
     protected AbstractSSTableSimpleWriter(File directory, TableMetadataRef metadata, RegularAndStaticColumns columns)
@@ -63,8 +64,7 @@
         this.makeRangeAware = makeRangeAware;
     }
 
-
-    protected SSTableTxnWriter createWriter()
+    protected SSTableTxnWriter createWriter() throws IOException
     {
         SerializationHeader header = new SerializationHeader(true, metadata.get(), columns, EncodingStats.NO_STATS);
 
@@ -82,38 +82,29 @@
                                        Collections.emptySet());
     }
 
-    private static Descriptor createDescriptor(File directory, final String keyspace, final String columnFamily, final SSTableFormat.Type fmt)
+    private static Descriptor createDescriptor(File directory, final String keyspace, final String columnFamily, final SSTableFormat.Type fmt) throws IOException
     {
-        int maxGen = getNextGeneration(directory, columnFamily);
-        return new Descriptor(directory, keyspace, columnFamily, maxGen + 1, fmt);
+        SSTableId nextGen = getNextId(directory, columnFamily);
+        return new Descriptor(directory, keyspace, columnFamily, nextGen, fmt);
     }
 
-    private static int getNextGeneration(File directory, final String columnFamily)
+    private static SSTableId getNextId(File directory, final String columnFamily) throws IOException
     {
-        final Set<Descriptor> existing = new HashSet<>();
-        directory.listFiles(new FileFilter()
+        while (true)
         {
-            public boolean accept(File file)
+            try (Stream<Path> existingPaths = Files.list(directory.toPath()))
             {
-                Descriptor desc = SSTable.tryDescriptorFromFilename(file);
-                if (desc == null)
-                    return false;
+                Stream<SSTableId> existingIds = existingPaths.map(File::new)
+                                                             .map(SSTable::tryDescriptorFromFilename)
+                                                             .filter(d -> d != null && d.cfname.equals(columnFamily))
+                                                             .map(d -> d.id);
 
-                if (desc.cfname.equals(columnFamily))
-                    existing.add(desc);
-
-                return false;
-            }
-        });
-        int maxGen = generation.getAndIncrement();
-        for (Descriptor desc : existing)
-        {
-            while (desc.generation > maxGen)
-            {
-                maxGen = generation.getAndIncrement();
+                SSTableId lastId = id.get();
+                SSTableId newId = SSTableIdFactory.instance.defaultBuilder().generator(Stream.concat(existingIds, Stream.of(lastId))).get();
+                if (id.compareAndSet(lastId, newId))
+                    return newId;
             }
         }
-        return maxGen;
     }
 
     PartitionUpdate.Builder getUpdateFor(ByteBuffer key) throws IOException
diff --git a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
index 0b8dbae..6d54561 100644
--- a/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/CQLSSTableWriter.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.io.sstable;
 
 import java.io.Closeable;
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -26,10 +25,14 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.SortedSet;
+import java.util.NavigableSet;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Sets;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.cql3.statements.schema.CreateTypeStatement;
@@ -41,20 +44,23 @@
 import org.apache.cassandra.cql3.functions.types.TypeCodec;
 import org.apache.cassandra.cql3.functions.types.UserType;
 import org.apache.cassandra.cql3.statements.ModificationStatement;
-import org.apache.cassandra.cql3.statements.UpdateStatement;
 import org.apache.cassandra.db.Clustering;
-import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.Slice;
+import org.apache.cassandra.db.Slices;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.*;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * Utility to write SSTables.
  * <p>
@@ -70,7 +76,7 @@
  *   String insert = "INSERT INTO myKs.myTable (k, v1, v2, v3) VALUES (?, ?, ?, ?)";
  *
  *   // Creates a new writer. You need to provide at least the directory where to write the created sstable,
- *   // the schema for the sstable to write and a (prepared) insert statement to use. If you do not use the
+ *   // the schema for the sstable to write and a (prepared) modification statement to use. If you do not use the
  *   // default partitioner (Murmur3Partitioner), you will also need to provide the partitioner in use, see
  *   // CQLSSTableWriter.Builder for more details on the available options.
  *   CQLSSTableWriter writer = CQLSSTableWriter.builder()
@@ -99,6 +105,7 @@
 
     static
     {
+        CassandraRelevantProperties.FORCE_LOAD_LOCAL_KEYSPACES.setBoolean(true);
         DatabaseDescriptor.clientInitialization(false);
         // Partitioner is not set in client mode.
         if (DatabaseDescriptor.getPartitioner() == null)
@@ -106,14 +113,14 @@
     }
 
     private final AbstractSSTableSimpleWriter writer;
-    private final UpdateStatement insert;
+    private final ModificationStatement modificationStatement;
     private final List<ColumnSpecification> boundNames;
     private final List<TypeCodec> typeCodecs;
 
-    private CQLSSTableWriter(AbstractSSTableSimpleWriter writer, UpdateStatement insert, List<ColumnSpecification> boundNames)
+    private CQLSSTableWriter(AbstractSSTableSimpleWriter writer, ModificationStatement modificationStatement, List<ColumnSpecification> boundNames)
     {
         this.writer = writer;
-        this.insert = insert;
+        this.modificationStatement = modificationStatement;
         this.boundNames = boundNames;
         this.typeCodecs = boundNames.stream().map(bn ->  UDHelper.codecFor(UDHelper.driverType(bn.type)))
                                              .collect(Collectors.toList());
@@ -135,7 +142,7 @@
      * This is a shortcut for {@code addRow(Arrays.asList(values))}.
      *
      * @param values the row values (corresponding to the bind variables of the
-     * insertion statement used when creating by this writer).
+     * modification statement used when creating by this writer).
      * @return this writer.
      */
     public CQLSSTableWriter addRow(Object... values)
@@ -156,7 +163,7 @@
      * {@link #rawAddRow} instead.
      *
      * @param values the row values (corresponding to the bind variables of the
-     * insertion statement used when creating by this writer).
+     * modification statement used when creating by this writer).
      * @return this writer.
      */
     public CQLSSTableWriter addRow(List<Object> values)
@@ -179,7 +186,7 @@
      * <p>
      * This is equivalent to the other addRow methods, but takes a map whose
      * keys are the names of the columns to add instead of taking a list of the
-     * values in the order of the insert statement used during construction of
+     * values in the order of the modification statement used during construction of
      * this write.
      * <p>
      * Please note that the column names in the map keys must be in lowercase unless
@@ -190,7 +197,7 @@
      * @param values a map of colum name to column values representing the new
      * row to add. Note that if a column is not part of the map, it's value will
      * be {@code null}. If the map contains keys that does not correspond to one
-     * of the column of the insert statement used when creating this writer, the
+     * of the column of the modification statement used when creating this writer, the
      * the corresponding value is ignored.
      * @return this writer.
      */
@@ -212,7 +219,7 @@
      * Adds a new row to the writer given already serialized values.
      *
      * @param values the row values (corresponding to the bind variables of the
-     * insertion statement used when creating by this writer) as binary.
+     * modification statement used when creating by this writer) as binary.
      * @return this writer.
      */
     public CQLSSTableWriter rawAddRow(ByteBuffer... values)
@@ -227,7 +234,7 @@
      * This is a shortcut for {@code rawAddRow(Arrays.asList(values))}.
      *
      * @param values the row values (corresponding to the bind variables of the
-     * insertion statement used when creating by this writer) as binary.
+     * modification statement used when creating by this writer) as binary.
      * @return this writer.
      */
     public CQLSSTableWriter rawAddRow(List<ByteBuffer> values)
@@ -237,26 +244,41 @@
             throw new InvalidRequestException(String.format("Invalid number of arguments, expecting %d values but got %d", boundNames.size(), values.size()));
 
         QueryOptions options = QueryOptions.forInternalCalls(null, values);
-        List<ByteBuffer> keys = insert.buildPartitionKeyNames(options);
-        SortedSet<Clustering<?>> clusterings = insert.createClustering(options);
+        ClientState state = ClientState.forInternalCalls();
+        List<ByteBuffer> keys = modificationStatement.buildPartitionKeyNames(options, state);
 
-        long now = System.currentTimeMillis();
+        long now = currentTimeMillis();
         // Note that we asks indexes to not validate values (the last 'false' arg below) because that triggers a 'Keyspace.open'
         // and that forces a lot of initialization that we don't want.
-        UpdateParameters params = new UpdateParameters(insert.metadata,
-                                                       insert.updatedColumns(),
+        UpdateParameters params = new UpdateParameters(modificationStatement.metadata,
+                                                       modificationStatement.updatedColumns(),
+                                                       ClientState.forInternalCalls(),
                                                        options,
-                                                       insert.getTimestamp(TimeUnit.MILLISECONDS.toMicros(now), options),
-                                                       (int) TimeUnit.MILLISECONDS.toSeconds(now),
-                                                       insert.getTimeToLive(options),
+                                                       modificationStatement.getTimestamp(TimeUnit.MILLISECONDS.toMicros(now), options),
+                                                       options.getNowInSec((int) TimeUnit.MILLISECONDS.toSeconds(now)),
+                                                       modificationStatement.getTimeToLive(options),
                                                        Collections.emptyMap());
 
         try
         {
-            for (ByteBuffer key : keys)
+            if (modificationStatement.hasSlices()) {
+                Slices slices = modificationStatement.createSlices(options);
+
+                for (ByteBuffer key : keys)
+                {
+                    for (Slice slice : slices)
+                        modificationStatement.addUpdateForKey(writer.getUpdateFor(key), slice, params);
+                }
+            }
+            else
             {
-                for (Clustering<?> clustering : clusterings)
-                    insert.addUpdateForKey(writer.getUpdateFor(key), clustering, params);
+                NavigableSet<Clustering<?>> clusterings = modificationStatement.createClustering(options, state);
+
+                for (ByteBuffer key : keys)
+                {
+                    for (Clustering clustering : clusterings)
+                        modificationStatement.addUpdateForKey(writer.getUpdateFor(key), clustering, params);
+                }
             }
             return this;
         }
@@ -273,13 +295,13 @@
      * <p>
      * This is equivalent to the other rawAddRow methods, but takes a map whose
      * keys are the names of the columns to add instead of taking a list of the
-     * values in the order of the insert statement used during construction of
+     * values in the order of the modification statement used during construction of
      * this write.
      *
      * @param values a map of colum name to column values representing the new
      * row to add. Note that if a column is not part of the map, it's value will
      * be {@code null}. If the map contains keys that does not correspond to one
-     * of the column of the insert statement used when creating this writer, the
+     * of the column of the modification statement used when creating this writer, the
      * the corresponding value is ignored.
      * @return this writer.
      */
@@ -305,7 +327,7 @@
      */
     public UserType getUDType(String dataType)
     {
-        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(insert.keyspace());
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(modificationStatement.keyspace());
         org.apache.cassandra.db.marshal.UserType userType = ksm.types.getNullable(ByteBufferUtil.bytes(dataType));
         return (UserType) UDHelper.driverType(userType);
     }
@@ -348,11 +370,11 @@
 
         private CreateTableStatement.Raw schemaStatement;
         private final List<CreateTypeStatement.Raw> typeStatements;
-        private ModificationStatement.Parsed insertStatement;
+        private ModificationStatement.Parsed modificationStatement;
         private IPartitioner partitioner;
 
         private boolean sorted = false;
-        private long bufferSizeInMB = 128;
+        private long bufferSizeInMiB = 128;
 
         protected Builder() {
             this.typeStatements = new ArrayList<>();
@@ -387,7 +409,7 @@
         {
             if (!directory.exists())
                 throw new IllegalArgumentException(directory + " doesn't exists");
-            if (!directory.canWrite())
+            if (!directory.isWritable())
                 throw new IllegalArgumentException(directory + " exists but is not writable");
 
             this.directory = directory;
@@ -437,24 +459,26 @@
         }
 
         /**
-         * The INSERT or UPDATE statement defining the order of the values to add for a given CQL row.
+         * The INSERT, UPDATE, or DELETE statement defining the order of the values to add for a given CQL row.
          * <p>
-         * Please note that the provided INSERT statement <b>must</b> use a fully-qualified
+         * Please note that the provided statement <b>must</b> use a fully-qualified
          * table name, one that include the keyspace name. Moreover, said statement must use
          * bind variables since these variables will be bound to values by the resulting writer.
          * <p>
          * This is a mandatory option.
          *
-         * @param insert an insertion statement that defines the order
+         * @param modificationStatement an insert, update, or delete statement that defines the order
          * of column values to use.
          * @return this builder.
          *
-         * @throws IllegalArgumentException if {@code insertStatement} is not a valid insertion
+         * @throws IllegalArgumentException if {@code modificationStatement} is not a valid insert, update, or delete
          * statement, does not have a fully-qualified table name or have no bind variables.
          */
-        public Builder using(String insert)
+        public Builder using(String modificationStatement)
         {
-            this.insertStatement = QueryProcessor.parseStatement(insert, ModificationStatement.Parsed.class, "INSERT/UPDATE");
+            this.modificationStatement = QueryProcessor.parseStatement(modificationStatement,
+                                                                       ModificationStatement.Parsed.class,
+                                                                       "INSERT/UPDATE/DELETE");
             return this;
         }
 
@@ -465,16 +489,36 @@
          * a new SSTable. This correspond roughly to the data size that will have the created
          * sstable.
          * <p>
-         * The default is 128MB, which should be reasonable for a 1GB heap. If you experience
+         * The default is 128MiB, which should be reasonable for a 1GiB heap. If you experience
          * OOM while using the writer, you should lower this value.
          *
-         * @param size the size to use in MB.
+         * @param size the size to use in MiB.
          * @return this builder.
          */
+        public Builder withBufferSizeInMiB(int size)
+        {
+            this.bufferSizeInMiB = size;
+            return this;
+        }
+
+        /**
+         * This method is deprecated in favor of the new withBufferSizeInMiB(int size)
+         * The size of the buffer to use.
+         * <p>
+         * This defines how much data will be buffered before being written as
+         * a new SSTable. This correspond roughly to the data size that will have the created
+         * sstable.
+         * <p>
+         * The default is 128MiB, which should be reasonable for a 1GiB heap. If you experience
+         * OOM while using the writer, you should lower this value.
+         *
+         * @param size the size to use in MiB.
+         * @return this builder.
+         */
+        @Deprecated
         public Builder withBufferSizeInMB(int size)
         {
-            this.bufferSizeInMB = size;
-            return this;
+            return withBufferSizeInMiB(size);
         }
 
         /**
@@ -482,7 +526,7 @@
          * <p>
          * If this option is used, the resulting writer will expect rows to be
          * added in SSTable sorted order (and an exception will be thrown if that
-         * is not the case during insertion). The SSTable sorted order means that
+         * is not the case during modification). The SSTable sorted order means that
          * rows are added such that their partition key respect the partitioner
          * order.
          * <p>
@@ -490,7 +534,7 @@
          * the rows in order, which is rarely the case. If you can provide the
          * rows in order however, using this sorted might be more efficient.
          * <p>
-         * Note that if used, some option like withBufferSizeInMB will be ignored.
+         * Note that if used, some option like withBufferSizeInMiB will be ignored.
          *
          * @return this builder.
          */
@@ -507,27 +551,23 @@
                 throw new IllegalStateException("No ouptut directory specified, you should provide a directory with inDirectory()");
             if (schemaStatement == null)
                 throw new IllegalStateException("Missing schema, you should provide the schema for the SSTable to create with forTable()");
-            if (insertStatement == null)
-                throw new IllegalStateException("No insert statement specified, you should provide an insert statement through using()");
+            if (modificationStatement == null)
+                throw new IllegalStateException("No modification (INSERT/UPDATE/DELETE) statement specified, you should provide a modification statement through using()");
 
+            Preconditions.checkState(Sets.difference(SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES, Schema.instance.getKeyspaces()).isEmpty(),
+                                     "Local keyspaces were not loaded. If this is running as a client, please make sure to add %s=true system property.",
+                                     CassandraRelevantProperties.FORCE_LOAD_LOCAL_KEYSPACES.getKey());
             synchronized (CQLSSTableWriter.class)
             {
-                if (Schema.instance.getKeyspaceMetadata(SchemaConstants.SCHEMA_KEYSPACE_NAME) == null)
-                    Schema.instance.load(Schema.getSystemKeyspaceMetadata());
-                if (Schema.instance.getKeyspaceMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME) == null)
-                    Schema.instance.load(SystemKeyspace.metadata());
 
                 String keyspaceName = schemaStatement.keyspace();
 
-                if (Schema.instance.getKeyspaceMetadata(keyspaceName) == null)
-                {
-                    Schema.instance.load(KeyspaceMetadata.create(keyspaceName,
-                                                                 KeyspaceParams.simple(1),
-                                                                 Tables.none(),
-                                                                 Views.none(),
-                                                                 Types.none(),
-                                                                 Functions.none()));
-                }
+                Schema.instance.transform(SchemaTransformations.addKeyspace(KeyspaceMetadata.create(keyspaceName,
+                                                                                                           KeyspaceParams.simple(1),
+                                                                                                           Tables.none(),
+                                                                                                           Views.none(),
+                                                                                                           Types.none(),
+                                                                                                           Functions.none()), true));
 
                 KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspaceName);
 
@@ -535,21 +575,22 @@
                 if (tableMetadata == null)
                 {
                     Types types = createTypes(keyspaceName);
+                    Schema.instance.transform(SchemaTransformations.addTypes(types, true));
                     tableMetadata = createTable(types);
-                    Schema.instance.load(ksm.withSwapped(ksm.tables.with(tableMetadata)).withSwapped(types));
+                    Schema.instance.transform(SchemaTransformations.addTable(tableMetadata, true));
                 }
 
-                UpdateStatement preparedInsert = prepareInsert();
+                ModificationStatement preparedModificationStatement = prepareModificationStatement();
 
                 TableMetadataRef ref = TableMetadataRef.forOfflineTools(tableMetadata);
                 AbstractSSTableSimpleWriter writer = sorted
-                                                   ? new SSTableSimpleWriter(directory, ref, preparedInsert.updatedColumns())
-                                                   : new SSTableSimpleUnsortedWriter(directory, ref, preparedInsert.updatedColumns(), bufferSizeInMB);
+                                                     ? new SSTableSimpleWriter(directory, ref, preparedModificationStatement.updatedColumns())
+                                                     : new SSTableSimpleUnsortedWriter(directory, ref, preparedModificationStatement.updatedColumns(), bufferSizeInMiB);
 
                 if (formatType != null)
                     writer.setSSTableFormatType(formatType);
 
-                return new CQLSSTableWriter(writer, preparedInsert, preparedInsert.getBindVariables());
+                return new CQLSSTableWriter(writer, preparedModificationStatement, preparedModificationStatement.getBindVariables());
             }
         }
 
@@ -580,24 +621,24 @@
         }
 
         /**
-         * Prepares insert statement for writing data to SSTable
+         * Prepares modification statement for writing data to SSTable
          *
-         * @return prepared Insert statement and it's bound names
+         * @return prepared modification statement and it's bound names
          */
-        private UpdateStatement prepareInsert()
+        private ModificationStatement prepareModificationStatement()
         {
             ClientState state = ClientState.forInternalCalls();
-            UpdateStatement insert = (UpdateStatement) insertStatement.prepare(state);
-            insert.validate(state);
+            ModificationStatement preparedModificationStatement = modificationStatement.prepare(state);
+            preparedModificationStatement.validate(state);
 
-            if (insert.hasConditions())
+            if (preparedModificationStatement.hasConditions())
                 throw new IllegalArgumentException("Conditional statements are not supported");
-            if (insert.isCounter())
-                throw new IllegalArgumentException("Counter update statements are not supported");
-            if (insert.getBindVariables().isEmpty())
-                throw new IllegalArgumentException("Provided insert statement has no bind variables");
+            if (preparedModificationStatement.isCounter())
+                throw new IllegalArgumentException("Counter modification statements are not supported");
+            if (preparedModificationStatement.getBindVariables().isEmpty())
+                throw new IllegalArgumentException("Provided preparedModificationStatement statement has no bind variables");
 
-            return insert;
+            return preparedModificationStatement;
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/io/sstable/CorruptSSTableException.java b/src/java/org/apache/cassandra/io/sstable/CorruptSSTableException.java
index 93be2ee..991a91d 100644
--- a/src/java/org/apache/cassandra/io/sstable/CorruptSSTableException.java
+++ b/src/java/org/apache/cassandra/io/sstable/CorruptSSTableException.java
@@ -17,7 +17,8 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
+
+import org.apache.cassandra.io.util.File;
 
 public class CorruptSSTableException extends RuntimeException
 {
diff --git a/src/java/org/apache/cassandra/io/sstable/Descriptor.java b/src/java/org/apache/cassandra/io/sstable/Descriptor.java
index 85f7ef6..75d5185 100644
--- a/src/java/org/apache/cassandra/io/sstable/Descriptor.java
+++ b/src/java/org/apache/cassandra/io/sstable/Descriptor.java
@@ -17,9 +17,6 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
-import java.io.IOError;
-import java.io.IOException;
 import java.util.*;
 import java.util.regex.Pattern;
 
@@ -32,14 +29,15 @@
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.sstable.metadata.IMetadataSerializer;
 import org.apache.cassandra.io.sstable.metadata.MetadataSerializer;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.utils.UUIDGen;
 
 import static org.apache.cassandra.io.sstable.Component.separator;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * A SSTable is described by the keyspace and column family it contains data
- * for, a generation (where higher generations contain more recent data) and
+ * for, an id (generation - where higher generations contain more recent data) and
  * an alphabetic version string.
  *
  * A descriptor can be marked as temporary, which influences generated filenames.
@@ -51,7 +49,9 @@
 
     public static String TMP_EXT = ".tmp";
 
-    private static final Splitter filenameSplitter = Splitter.on('-');
+    public static final char FILENAME_SEPARATOR = '-';
+
+    private static final Splitter filenameSplitter = Splitter.on(FILENAME_SEPARATOR);
 
     /** canonicalized path to the directory where SSTable resides */
     public final File directory;
@@ -59,7 +59,7 @@
     public final Version version;
     public final String ksname;
     public final String cfname;
-    public final int generation;
+    public final SSTableId id;
     public final SSTableFormat.Type formatType;
     private final int hashCode;
 
@@ -67,53 +67,37 @@
      * A descriptor that assumes CURRENT_VERSION.
      */
     @VisibleForTesting
-    public Descriptor(File directory, String ksname, String cfname, int generation)
+    public Descriptor(File directory, String ksname, String cfname, SSTableId id)
     {
-        this(SSTableFormat.Type.current().info.getLatestVersion(), directory, ksname, cfname, generation, SSTableFormat.Type.current());
+        this(SSTableFormat.Type.current().info.getLatestVersion(), directory, ksname, cfname, id, SSTableFormat.Type.current());
     }
 
     /**
      * Constructor for sstable writers only.
      */
-    public Descriptor(File directory, String ksname, String cfname, int generation, SSTableFormat.Type formatType)
+    public Descriptor(File directory, String ksname, String cfname, SSTableId id, SSTableFormat.Type formatType)
     {
-        this(formatType.info.getLatestVersion(), directory, ksname, cfname, generation, formatType);
+        this(formatType.info.getLatestVersion(), directory, ksname, cfname, id, formatType);
     }
 
     @VisibleForTesting
-    public Descriptor(String version, File directory, String ksname, String cfname, int generation, SSTableFormat.Type formatType)
+    public Descriptor(String version, File directory, String ksname, String cfname, SSTableId id, SSTableFormat.Type formatType)
     {
-        this(formatType.info.getVersion(version), directory, ksname, cfname, generation, formatType);
+        this(formatType.info.getVersion(version), directory, ksname, cfname, id, formatType);
     }
 
-    public Descriptor(Version version, File directory, String ksname, String cfname, int generation, SSTableFormat.Type formatType)
+    public Descriptor(Version version, File directory, String ksname, String cfname, SSTableId id, SSTableFormat.Type formatType)
     {
         assert version != null && directory != null && ksname != null && cfname != null && formatType.info.getLatestVersion().getClass().equals(version.getClass());
         this.version = version;
-        try
-        {
-            this.directory = directory.getCanonicalFile();
-        }
-        catch (IOException e)
-        {
-            throw new IOError(e);
-        }
+        this.directory = directory.toCanonical();
         this.ksname = ksname;
         this.cfname = cfname;
-        this.generation = generation;
+        this.id = id;
         this.formatType = formatType;
 
-        hashCode = Objects.hashCode(version, this.directory, generation, ksname, cfname, formatType);
-    }
-
-    public Descriptor withGeneration(int newGeneration)
-    {
-        return new Descriptor(version, directory, ksname, cfname, newGeneration, formatType);
-    }
-
-    public Descriptor withFormatType(SSTableFormat.Type newType)
-    {
-        return new Descriptor(newType.info.getLatestVersion(), directory, ksname, cfname, generation, newType);
+        // directory is unnecessary for hashCode, and for simulator consistency we do not include it
+        hashCode = Objects.hashCode(version, id, ksname, cfname, formatType);
     }
 
     public String tmpFilenameFor(Component component)
@@ -128,7 +112,7 @@
     {
         // Use UUID to handle concurrent streamings on the same sstable.
         // TMP_EXT allows temp file to be removed by {@link ColumnFamilyStore#scrubDataDirectories}
-        return String.format("%s.%s%s", filenameFor(component), UUIDGen.getTimeUUID(), TMP_EXT);
+        return String.format("%s.%s%s", filenameFor(component), nextTimeUUID(), TMP_EXT);
     }
 
     public String filenameFor(Component component)
@@ -136,10 +120,15 @@
         return baseFilename() + separator + component.name();
     }
 
+    public File fileFor(Component component)
+    {
+        return new File(filenameFor(component));
+    }
+
     public String baseFilename()
     {
         StringBuilder buff = new StringBuilder();
-        buff.append(directory).append(File.separatorChar);
+        buff.append(directory).append(File.pathSeparator());
         appendFileName(buff);
         return buff.toString();
     }
@@ -147,7 +136,7 @@
     private void appendFileName(StringBuilder buff)
     {
         buff.append(version).append(separator);
-        buff.append(generation);
+        buff.append(id.toString());
         buff.append(separator).append(formatType.name);
     }
 
@@ -156,7 +145,7 @@
         final StringBuilder buff = new StringBuilder();
         if (Directories.isSecondaryIndexFolder(directory))
         {
-            buff.append(directory.getName()).append(File.separator);
+            buff.append(directory.name()).append(File.pathSeparator());
         }
 
         appendFileName(buff);
@@ -172,7 +161,7 @@
     /** Return any temporary files found in the directory */
     public List<File> getTemporaryFiles()
     {
-        File[] tmpFiles = directory.listFiles((dir, name) ->
+        File[] tmpFiles = directory.tryList((dir, name) ->
                                               name.endsWith(Descriptor.TMP_EXT));
 
         List<File> ret = new ArrayList<>(tmpFiles.length);
@@ -184,7 +173,7 @@
 
     public static boolean isValidFile(File file)
     {
-        String filename = file.getName();
+        String filename = file.name();
         return filename.endsWith(".db") && !LEGACY_TMP_REGEX.matcher(filename).matches();
     }
 
@@ -242,9 +231,9 @@
         // We need to extract the keyspace and table names from the parent directories, so make sure we deal with the
         // absolute path.
         if (!file.isAbsolute())
-            file = file.getAbsoluteFile();
+            file = file.toAbsolute();
 
-        String name = file.getName();
+        String name = file.name();
         List<String> tokens = filenameSplitter.splitToList(name);
         int size = tokens.size();
 
@@ -266,14 +255,14 @@
         if (!Version.validate(versionString))
             throw invalidSSTable(name, "invalid version %s", versionString);
 
-        int generation;
+        SSTableId id;
         try
         {
-            generation = Integer.parseInt(tokens.get(1));
+            id = SSTableIdFactory.instance.fromString(tokens.get(1));
         }
-        catch (NumberFormatException e)
+        catch (RuntimeException e)
         {
-            throw invalidSSTable(name, "the 'generation' part of the name doesn't parse as a number");
+            throw invalidSSTable(name, "the 'id' part (%s) of the name doesn't parse as a valid unique identifier", tokens.get(1));
         }
 
         String formatString = tokens.get(2);
@@ -282,7 +271,7 @@
         {
             format = SSTableFormat.Type.validate(formatString);
         }
-        catch (IllegalArgumentException e)
+        catch (RuntimeException e)
         {
             throw invalidSSTable(name, "unknown 'format' part (%s)", formatString);
         }
@@ -300,30 +289,30 @@
         String indexName = "";
         if (Directories.isSecondaryIndexFolder(tableDir))
         {
-            indexName = tableDir.getName();
+            indexName = tableDir.name();
             tableDir = parentOf(name, tableDir);
         }
 
         // Then it can be a backup or a snapshot
-        if (tableDir.getName().equals(Directories.BACKUPS_SUBDIR) && tableDir.getParentFile().getName().contains("-"))
-            tableDir = tableDir.getParentFile();
+        if (tableDir.name().equals(Directories.BACKUPS_SUBDIR) && tableDir.parent().name().contains("-"))
+            tableDir = tableDir.parent();
         else
         {
             File keyspaceOrSnapshotDir = parentOf(name, tableDir);
-            if (keyspaceOrSnapshotDir.getName().equals(Directories.SNAPSHOT_SUBDIR)
-                && parentOf(name, keyspaceOrSnapshotDir).getName().contains("-"))
+            if (keyspaceOrSnapshotDir.name().equals(Directories.SNAPSHOT_SUBDIR)
+                && parentOf(name, keyspaceOrSnapshotDir).name().contains("-"))
                 tableDir = parentOf(name, keyspaceOrSnapshotDir);
         }
 
-        String table = tableDir.getName().split("-")[0] + indexName;
-        String keyspace = parentOf(name, tableDir).getName();
+        String table = tableDir.name().split("-")[0] + indexName;
+        String keyspace = parentOf(name, tableDir).name();
 
-        return Pair.create(new Descriptor(version, directory, keyspace, table, generation, format), component);
+        return Pair.create(new Descriptor(version, directory, keyspace, table, id, format), component);
     }
 
     private static File parentOf(String name, File file)
     {
-        File parent = file.getParentFile();
+        File parent = file.parent();
         if (parent == null)
             throw invalidSSTable(name, "cannot extract keyspace and table name; make sure the sstable is in the proper sub-directories");
         return parent;
@@ -362,7 +351,7 @@
             return false;
         Descriptor that = (Descriptor)o;
         return that.directory.equals(this.directory)
-                       && that.generation == this.generation
+                       && that.id.equals(this.id)
                        && that.ksname.equals(this.ksname)
                        && that.cfname.equals(this.cfname)
                        && that.version.equals(this.version)
diff --git a/src/java/org/apache/cassandra/io/sstable/IndexInfo.java b/src/java/org/apache/cassandra/io/sstable/IndexInfo.java
index e24436d..fa0fb2c 100644
--- a/src/java/org/apache/cassandra/io/sstable/IndexInfo.java
+++ b/src/java/org/apache/cassandra/io/sstable/IndexInfo.java
@@ -27,7 +27,6 @@
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.ByteArrayAccessor;
 import org.apache.cassandra.io.ISerializer;
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.util.DataInputPlus;
@@ -36,7 +35,7 @@
 
 /**
  * {@code IndexInfo} is embedded in the indexed version of {@link RowIndexEntry}.
- * Each instance roughly covers a range of {@link org.apache.cassandra.config.Config#column_index_size_in_kb column_index_size_in_kb} kB
+ * Each instance roughly covers a range of {@link org.apache.cassandra.config.Config#column_index_size column_index_size} KiB
  * and contains the first and last clustering value (or slice bound), its offset in the data file and width in the data file.
  * <p>
  * Each {@code IndexInfo} object is serialized as follows.
@@ -59,7 +58,7 @@
  */
 public class IndexInfo
 {
-    private static final long EMPTY_SIZE = ObjectSizes.measure(new IndexInfo(null, null, 0, 0, null));
+    public static final long EMPTY_SIZE = ObjectSizes.measure(new IndexInfo(null, null, 0, 0, null));
 
     public final long offset;
     public final long width;
diff --git a/src/java/org/apache/cassandra/io/sstable/IndexSummaryBuilder.java b/src/java/org/apache/cassandra/io/sstable/IndexSummaryBuilder.java
index cb6fcc0..75cca84 100644
--- a/src/java/org/apache/cassandra/io/sstable/IndexSummaryBuilder.java
+++ b/src/java/org/apache/cassandra/io/sstable/IndexSummaryBuilder.java
@@ -211,7 +211,7 @@
             else
             {
                 // we cannot fully sample this sstable due to too much memory in the index summary, so let's tell the user
-                logger.error("Memory capacity of index summary exceeded (2GB), index summary will not cover full sstable, " +
+                logger.error("Memory capacity of index summary exceeded (2GiB), index summary will not cover full sstable, " +
                              "you should increase min_sampling_level");
             }
         }
diff --git a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java
index 396801a..b11ad2b 100644
--- a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java
+++ b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java
@@ -30,10 +30,12 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
+
+import com.codahale.metrics.Timer;
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
@@ -51,6 +53,7 @@
 import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.WrappedRunnable;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 /**
  * Manages the fixed-size memory pool for index summaries, periodically resizing them
  * in order to give more memory to hot sstables and less memory to cold sstables.
@@ -63,7 +66,7 @@
 
     private long memoryPoolBytes;
 
-    private final DebuggableScheduledThreadPoolExecutor executor;
+    private final ScheduledExecutorPlus executor;
 
     // our next scheduled resizing run
     private ScheduledFuture future;
@@ -76,14 +79,14 @@
 
     private IndexSummaryManager()
     {
-        executor = new DebuggableScheduledThreadPoolExecutor(1, "IndexSummaryManager", Thread.MIN_PRIORITY);
+        executor = executorFactory().scheduled(false, "IndexSummaryManager", Thread.MIN_PRIORITY);
 
-        long indexSummarySizeInMB = DatabaseDescriptor.getIndexSummaryCapacityInMB();
+        long indexSummarySizeInMB = DatabaseDescriptor.getIndexSummaryCapacityInMiB();
         int interval = DatabaseDescriptor.getIndexSummaryResizeIntervalInMinutes();
         logger.info("Initializing index summary manager with a memory pool size of {} MB and a resize interval of {} minutes",
                     indexSummarySizeInMB, interval);
 
-        setMemoryPoolCapacityInMB(DatabaseDescriptor.getIndexSummaryCapacityInMB());
+        setMemoryPoolCapacityInMB(DatabaseDescriptor.getIndexSummaryCapacityInMiB());
         setResizeIntervalInMinutes(DatabaseDescriptor.getIndexSummaryResizeIntervalInMinutes());
     }
 
@@ -229,7 +232,7 @@
         Pair<Long, Map<TableId, LifecycleTransaction>> redistributionTransactionInfo = getRestributionTransactions();
         Map<TableId, LifecycleTransaction> transactions = redistributionTransactionInfo.right;
         long nonRedistributingOffHeapSize = redistributionTransactionInfo.left;
-        try
+        try (Timer.Context ctx = CompactionManager.instance.getMetrics().indexSummaryRedistributionTime.time())
         {
             redistributeSummaries(new IndexSummaryRedistribution(transactions,
                                                                  nonRedistributingOffHeapSize,
@@ -277,6 +280,11 @@
     @VisibleForTesting
     public void shutdownAndWait(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
     {
+        if (future != null)
+        {
+            future.cancel(false);
+            future = null;
+        }
         ExecutorUtils.shutdownAndWait(timeout, unit, executor);
     }
 }
diff --git a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManagerMBean.java b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManagerMBean.java
index 3382350..9ba3d40 100644
--- a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManagerMBean.java
+++ b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManagerMBean.java
@@ -27,7 +27,7 @@
 
     /**
      * Returns the current actual off-heap memory usage of the index summaries for all non-compacting sstables.
-     * @return The amount of memory used in MB.
+     * @return The amount of memory used in MiB.
      */
     public double getMemoryPoolSizeInMB();
 
@@ -41,5 +41,10 @@
     public void redistributeSummaries() throws IOException;
 
     public int getResizeIntervalInMinutes();
+
+    /**
+     * Set resizeIntervalInMinutes = -1 for disabled; This is the equivalent of index_summary_resize_interval being
+     * set to null in cassandra.yaml
+     */
     public void setResizeIntervalInMinutes(int resizeIntervalInMinutes);
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/sstable/IndexSummaryRedistribution.java b/src/java/org/apache/cassandra/io/sstable/IndexSummaryRedistribution.java
index 90a8621..8bbe709 100644
--- a/src/java/org/apache/cassandra/io/sstable/IndexSummaryRedistribution.java
+++ b/src/java/org/apache/cassandra/io/sstable/IndexSummaryRedistribution.java
@@ -25,7 +25,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 import com.google.common.annotations.VisibleForTesting;
 
@@ -43,9 +43,12 @@
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Refs;
 
 import static org.apache.cassandra.io.sstable.Downsampling.BASE_SAMPLING_LEVEL;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class IndexSummaryRedistribution extends CompactionInfo.Holder
 {
@@ -61,7 +64,7 @@
     private final Map<TableId, LifecycleTransaction> transactions;
     private final long nonRedistributingOffHeapSize;
     private final long memoryPoolBytes;
-    private final UUID compactionId;
+    private final TimeUUID compactionId;
     private volatile long remainingSpace;
 
     /**
@@ -75,11 +78,12 @@
         this.transactions = transactions;
         this.nonRedistributingOffHeapSize = nonRedistributingOffHeapSize;
         this.memoryPoolBytes = memoryPoolBytes;
-        this.compactionId = UUID.randomUUID();
+        this.compactionId = nextTimeUUID();
     }
 
     public List<SSTableReader> redistributeSummaries() throws IOException
     {
+        long start = nanoTime();
         logger.info("Redistributing index summaries");
         List<SSTableReader> redistribute = new ArrayList<>();
         for (LifecycleTransaction txn : transactions.values())
@@ -91,7 +95,7 @@
         for (SSTableReader sstable : redistribute)
             total += sstable.getIndexSummaryOffHeapSize();
 
-        logger.trace("Beginning redistribution of index summaries for {} sstables with memory pool size {} MB; current spaced used is {} MB",
+        logger.info("Beginning redistribution of index summaries for {} sstables with memory pool size {} MiB; current spaced used is {} MiB",
                      redistribute.size(), memoryPoolBytes / 1024L / 1024L, total / 1024.0 / 1024.0);
 
         final Map<SSTableReader, Double> readRates = new HashMap<>(redistribute.size());
@@ -116,7 +120,7 @@
 
         long remainingBytes = memoryPoolBytes - nonRedistributingOffHeapSize;
 
-        logger.trace("Index summaries for compacting SSTables are using {} MB of space",
+        logger.trace("Index summaries for compacting SSTables are using {} MiB of space",
                      (memoryPoolBytes - remainingBytes) / 1024.0 / 1024.0);
         List<SSTableReader> newSSTables;
         try (Refs<SSTableReader> refs = Refs.ref(sstablesByHotness))
@@ -129,9 +133,9 @@
         total = nonRedistributingOffHeapSize;
         for (SSTableReader sstable : newSSTables)
             total += sstable.getIndexSummaryOffHeapSize();
-        if (logger.isTraceEnabled())
-            logger.trace("Completed resizing of index summaries; current approximate memory used: {}",
-                     FBUtilities.prettyPrintMemory(total));
+
+        logger.info("Completed resizing of index summaries; current approximate memory used: {} MiB, time spent: {}ms",
+                    total / 1024.0 / 1024.0, TimeUnit.NANOSECONDS.toMillis(nanoTime() - start));
 
         return newSSTables;
     }
@@ -243,6 +247,7 @@
         }
 
         // downsample first, then upsample
+        logger.info("index summaries: downsample: {}, force resample: {}, upsample: {}, force upsample: {}", toDownsample.size(), forceResample.size(), toUpsample.size(), forceUpsample.size());
         toDownsample.addAll(forceResample);
         toDownsample.addAll(toUpsample);
         toDownsample.addAll(forceUpsample);
diff --git a/src/java/org/apache/cassandra/io/sstable/KeyIterator.java b/src/java/org/apache/cassandra/io/sstable/KeyIterator.java
index 1a5792c..ceacf87 100644
--- a/src/java/org/apache/cassandra/io/sstable/KeyIterator.java
+++ b/src/java/org/apache/cassandra/io/sstable/KeyIterator.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
@@ -26,6 +25,7 @@
 import org.apache.cassandra.db.RowIndexEntry;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.AbstractIterator;
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTable.java b/src/java/org/apache/cassandra/io/sstable/SSTable.java
index 2a0d3f7..81030c2 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTable.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTable.java
@@ -17,17 +17,24 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.*;
+
+import java.io.FileNotFoundException;
+import java.io.IOError;
+import java.io.IOException;
+import java.io.PrintWriter;
 import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
 import java.util.*;
 import java.util.concurrent.CopyOnWriteArraySet;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicates;
 import com.google.common.collect.Collections2;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import com.google.common.io.Files;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,14 +46,17 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.DiskOptimizationStrategy;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.memory.HeapCloner;
 
+import static org.apache.cassandra.io.util.File.WriteMode.APPEND;
 import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
 import static org.apache.cassandra.service.ActiveRepairService.UNREPAIRED_SSTABLE;
 
@@ -95,6 +105,12 @@
         this.optimizationStrategy = Objects.requireNonNull(optimizationStrategy);
     }
 
+    @VisibleForTesting
+    public Set<Component> getComponents()
+    {
+        return ImmutableSet.copyOf(components);
+    }
+
     /**
      * We use a ReferenceQueue to manage deleting files that have been compacted
      * and for which no more SSTable references exist.  But this is not guaranteed
@@ -233,7 +249,7 @@
             {
                 return readTOC(desc);
             }
-            catch (FileNotFoundException e)
+            catch (FileNotFoundException | NoSuchFileException e)
             {
                 Set<Component> components = discoverComponentsFor(desc);
                 if (components.isEmpty())
@@ -267,7 +283,7 @@
     /** @return An estimate of the number of keys contained in the given index file. */
     public static long estimateRowsFromIndex(RandomAccessReader ifile, Descriptor descriptor) throws IOException
     {
-        // collect sizes for the first 10000 keys, or first 10 megabytes of data
+        // collect sizes for the first 10000 keys, or first 10 mebibytes of data
         final int SAMPLES_CAP = 10000, BYTES_CAP = (int)Math.min(10000000, ifile.length());
         int keys = 0;
         while (ifile.getFilePointer() < BYTES_CAP && keys < SAMPLES_CAP)
@@ -317,7 +333,7 @@
     protected static Set<Component> readTOC(Descriptor descriptor, boolean skipMissing) throws IOException
     {
         File tocFile = new File(descriptor.filenameFor(Component.TOC));
-        List<String> componentNames = Files.readLines(tocFile, Charset.defaultCharset());
+        List<String> componentNames = Files.readAllLines(tocFile.toPath());
         Set<Component> components = Sets.newHashSetWithExpectedSize(componentNames.size());
         for (String componentName : componentNames)
         {
@@ -336,13 +352,13 @@
     protected static void appendTOC(Descriptor descriptor, Collection<Component> components)
     {
         File tocFile = new File(descriptor.filenameFor(Component.TOC));
-        try (FileOutputStream fos = new FileOutputStream(tocFile);
-             PrintWriter w = new PrintWriter(fos))
+        try (FileOutputStreamPlus out = tocFile.newOutputStream(APPEND);
+             PrintWriter w = new PrintWriter(out))
         {
             for (Component component : components)
                 w.println(component.name);
             w.flush();
-            fos.getFD().sync();
+            out.sync();
         }
         catch (IOException e)
         {
@@ -368,7 +384,7 @@
         return AbstractBounds.bounds(first.getToken(), true, last.getToken(), true);
     }
 
-    public static void validateRepairedMetadata(long repairedAt, UUID pendingRepair, boolean isTransient)
+    public static void validateRepairedMetadata(long repairedAt, TimeUUID pendingRepair, boolean isTransient)
     {
         Preconditions.checkArgument((pendingRepair == NO_PENDING_REPAIR) || (repairedAt == UNREPAIRED_SSTABLE),
                                     "pendingRepair cannot be set on a repaired sstable");
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java b/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java
index 3577259..f78200a 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableHeaderFix.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
@@ -36,6 +35,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -298,7 +298,17 @@
     {
         Stream.of(path)
               .flatMap(SSTableHeaderFix::maybeExpandDirectory)
-              .filter(p -> Descriptor.fromFilenameWithComponent(p.toFile()).right.type == Component.Type.DATA)
+              .filter(p -> {
+                  try
+                  {
+                      return Descriptor.fromFilenameWithComponent(new File(p)).right.type == Component.Type.DATA;
+                  }
+                  catch (IllegalArgumentException t)
+                  {
+                      logger.info("Couldn't parse filename {}, ignoring", p);
+                      return false;
+                  }
+              })
               .map(Path::toString)
               .map(Descriptor::fromFilename)
               .forEach(descriptors::add);
@@ -888,26 +898,26 @@
         private void scanDataDirectory(Directories.DataDirectory dataDirectory)
         {
             info.accept(String.format("Scanning data directory %s", dataDirectory.location));
-            File[] ksDirs = dataDirectory.location.listFiles();
+            File[] ksDirs = dataDirectory.location.tryList();
             if (ksDirs == null)
                 return;
             for (File ksDir : ksDirs)
             {
-                if (!ksDir.isDirectory() || !ksDir.canRead())
+                if (!ksDir.isDirectory() || !ksDir.isReadable())
                     continue;
 
-                String name = ksDir.getName();
+                String name = ksDir.name();
 
                 // silently ignore all system keyspaces
                 if (SchemaConstants.isLocalSystemKeyspace(name) || SchemaConstants.isReplicatedSystemKeyspace(name))
                     continue;
 
-                File[] tabDirs = ksDir.listFiles();
+                File[] tabDirs = ksDir.tryList();
                 if (tabDirs == null)
                     continue;
                 for (File tabDir : tabDirs)
                 {
-                    if (!tabDir.isDirectory() || !tabDir.canRead())
+                    if (!tabDir.isDirectory() || !tabDir.isReadable())
                         continue;
 
                     processFileOrDirectory(tabDir.toPath());
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableId.java b/src/java/org/apache/cassandra/io/sstable/SSTableId.java
new file mode 100644
index 0000000..a3d95dd
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableId.java
@@ -0,0 +1,92 @@
+/*
+ * 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.io.sstable;
+
+import java.nio.ByteBuffer;
+import java.util.function.Supplier;
+import java.util.stream.Stream;
+
+import org.apache.cassandra.io.util.File;
+
+/**
+ * Represents a unique identifier in the sstable descriptor filename.
+ * This ensures each sstable file uniqueness for the certain table on a single node. However, new implementations
+ * should ensure the uniqueness across the entire cluster. The legacy implementation which does not satisfy cluster-wide
+ * uniqueness will be deprecated and eventually removed.
+ * <p>
+ * A new implementation must adhere to the following invariants:
+ * - Must be locally sortable - that is, the comparison must reflect the comparison of generation times of identifiers
+ * generated on the same node
+ * - String representation must *not* include the {@link Descriptor#FILENAME_SEPARATOR} character, see {@link Descriptor#fromFilenameWithComponent(File)}
+ * - must be case-insensitive because the sstables can be stored on case-insensitive file system
+ * <p>
+ */
+public interface SSTableId
+{
+    /**
+     * Creates a byte format of the identifier that can be parsed by
+     * {@link Builder#fromBytes(ByteBuffer)}
+     */
+    ByteBuffer asBytes();
+
+    /**
+     * Creates a String format of the identifier that can be parsed by
+     * {@link Builder#fromString(String)}
+     * <p>
+     * Must not contain any {@link Descriptor#FILENAME_SEPARATOR} character as it is used in the Descriptor
+     * see {@link Descriptor#fromFilenameWithComponent(File)}
+     */
+    @Override
+    String toString();
+
+    /**
+     * Builder that can create instances of certain implementation of {@link SSTableId}.
+     */
+    interface Builder<T extends SSTableId>
+    {
+        /**
+         * Creates a new generator of identifiers. Each supplied value must be different to all the previously generated
+         * values and different to all the provided existing identifiers.
+         */
+        Supplier<T> generator(Stream<SSTableId> existingIdentifiers);
+
+        boolean isUniqueIdentifier(String str);
+
+        boolean isUniqueIdentifier(ByteBuffer bytes);
+
+        /**
+         * Creates an identifier instance from its string representation
+         *
+         * @param str string representation as returned by {@link SSTableId#toString()}
+         * @throws IllegalArgumentException when the provided string is not a valid string representation of the identifier
+         */
+        T fromString(String str) throws IllegalArgumentException;
+
+        /**
+         * Creates an identifier instance from its binary representation
+         * <p>
+         * The method expects the identifier is encoded in all remaining bytes of the buffer. The method does not move the
+         * pointer of the buffer.
+         *
+         * @param bytes binary representation as returned by {@link #asBytes()}
+         * @throws IllegalArgumentException when the provided bytes are not a valid binary representation of the identifier
+         */
+        T fromBytes(ByteBuffer bytes) throws IllegalArgumentException;
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableIdFactory.java b/src/java/org/apache/cassandra/io/sstable/SSTableIdFactory.java
new file mode 100644
index 0000000..d5b3276
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableIdFactory.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.io.sstable;
+
+import java.nio.ByteBuffer;
+import java.util.Comparator;
+import java.util.stream.Stream;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+public class SSTableIdFactory
+{
+    public static final SSTableIdFactory instance = new SSTableIdFactory();
+
+    /**
+     * Constructs the instance of {@link SSTableId} from the given string representation.
+     * It finds the right builder by verifying whether the given string is the representation of the related identifier
+     * type using {@link SSTableId.Builder#isUniqueIdentifier(String)} method.
+     *
+     * @throws IllegalArgumentException when the provided string representation does not represent id of any type
+     */
+    public SSTableId fromString(String str) throws IllegalArgumentException
+    {
+        return Stream.of(UUIDBasedSSTableId.Builder.instance, SequenceBasedSSTableId.Builder.instance)
+                     .filter(b -> b.isUniqueIdentifier(str))
+                     .findFirst()
+                     .map(b -> b.fromString(str))
+                     .orElseThrow(() -> new IllegalArgumentException("String '" + str + "' does not match any SSTable identifier format"));
+    }
+
+    /**
+     * Constructs the instance of {@link SSTableId} from the given bytes.
+     * It finds the right builder by verifying whether the given buffer is the representation of the related identifier
+     * type using {@link SSTableId.Builder#isUniqueIdentifier(ByteBuffer)} method.
+     *
+     * The method expects the identifier is encoded in all remaining bytes of the buffer. The method does not move the
+     * pointer of the buffer.
+     *
+     * @throws IllegalArgumentException when the provided binary representation does not represent id of any type
+     */
+    public SSTableId fromBytes(ByteBuffer bytes)
+    {
+        return Stream.of(UUIDBasedSSTableId.Builder.instance, SequenceBasedSSTableId.Builder.instance)
+                     .filter(b -> b.isUniqueIdentifier(bytes))
+                     .findFirst()
+                     .map(b -> b.fromBytes(bytes))
+                     .orElseThrow(() -> new IllegalArgumentException("Byte buffer of length " + bytes.remaining() + " does not match any SSTable identifier format"));
+    }
+
+    /**
+     * Returns default identifiers builder.
+     */
+    @SuppressWarnings("unchecked")
+    public SSTableId.Builder<SSTableId> defaultBuilder()
+    {
+        SSTableId.Builder<? extends SSTableId> builder = DatabaseDescriptor.isUUIDSSTableIdentifiersEnabled()
+                                                         ? UUIDBasedSSTableId.Builder.instance
+                                                         : SequenceBasedSSTableId.Builder.instance;
+        return (SSTableId.Builder<SSTableId>) builder;
+    }
+
+    /**
+     * Compare sstable identifiers so that UUID based identifier is always greater than sequence based identifier
+     */
+    public final static Comparator<SSTableId> COMPARATOR = Comparator.nullsFirst((id1, id2) -> {
+        if (id1 instanceof UUIDBasedSSTableId)
+        {
+            UUIDBasedSSTableId uuidId1 = (UUIDBasedSSTableId) id1;
+            return (id2 instanceof UUIDBasedSSTableId) ? uuidId1.compareTo((UUIDBasedSSTableId) id2) : 1;
+        }
+        else if (id1 instanceof SequenceBasedSSTableId)
+        {
+            SequenceBasedSSTableId seqId1 = (SequenceBasedSSTableId) id1;
+            return (id2 instanceof SequenceBasedSSTableId) ? seqId1.compareTo((SequenceBasedSSTableId) id2) : -1;
+        }
+        else
+        {
+            throw new AssertionError("Unsupported comparison between " + id1.getClass().getName() + " and  " + id2.getClass().getName());
+        }
+    });
+}
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java
index 1e980fe..7ddbe72 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableLoader.java
@@ -17,13 +17,13 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.util.*;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 
 import org.apache.cassandra.db.streaming.CassandraOutgoingFile;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.io.FSError;
 import org.apache.cassandra.schema.TableMetadataRef;
@@ -38,6 +38,8 @@
 
 import org.apache.cassandra.utils.concurrent.Ref;
 
+import static org.apache.cassandra.streaming.StreamingChannel.Factory.Global.streamingFactory;
+
 /**
  * Cassandra SSTable bulk loader.
  * Load an externally created sstable into a cluster.
@@ -62,7 +64,7 @@
     public SSTableLoader(File directory, Client client, OutputHandler outputHandler, int connectionsPerHost, String targetKeyspace)
     {
         this.directory = directory;
-        this.keyspace = targetKeyspace != null ? targetKeyspace : directory.getParentFile().getName();
+        this.keyspace = targetKeyspace != null ? targetKeyspace : directory.parent().name();
         this.client = client;
         this.outputHandler = outputHandler;
         this.connectionsPerHost = connectionsPerHost;
@@ -76,8 +78,8 @@
         LifecycleTransaction.getFiles(directory.toPath(),
                                       (file, type) ->
                                       {
-                                          File dir = file.getParentFile();
-                                          String name = file.getName();
+                                          File dir = file.parent();
+                                          String name = file.name();
 
                                           if (type != Directories.FileType.FINAL)
                                           {
@@ -97,7 +99,6 @@
                                           }
 
                                           TableMetadataRef metadata = client.getTableMetadata(desc.cfname);
-
                                           if (metadata == null)
                                           {
                                               outputHandler.output(String.format("Skipping file %s: table %s.%s doesn't exist", name, keyspace, desc.cfname));
@@ -270,9 +271,9 @@
          *
          * @return StreamConnectionFactory to use
          */
-        public StreamConnectionFactory getConnectionFactory()
+        public StreamingChannel.Factory getConnectionFactory()
         {
-            return new DefaultConnectionFactory();
+            return streamingFactory();
         }
 
         /**
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
index a3d5ae9..e394bbd 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableRewriter.java
@@ -36,7 +36,7 @@
 import org.apache.cassandra.utils.concurrent.Transactional;
 
 /**
- * Wraps one or more writers as output for rewriting one or more readers: every sstable_preemptive_open_interval_in_mb
+ * Wraps one or more writers as output for rewriting one or more readers: every sstable_preemptive_open_interval
  * we look in the summary we're collecting for the latest writer for the penultimate key that we know to have been fully
  * flushed to the index file, and then double check that the key is fully present in the flushed data file.
  * Then we move the starts of each reader forwards to that point, replace them in the Tracker, and attach a runnable
@@ -62,7 +62,7 @@
     private final ILifecycleTransaction transaction; // the readers we are rewriting (updated as they are replaced)
     private final List<SSTableReader> preparedForCommit = new ArrayList<>();
 
-    private long currentlyOpenedEarlyAt; // the position (in MB) in the target file we last (re)opened at
+    private long currentlyOpenedEarlyAt; // the position (in MiB) in the target file we last (re)opened at
 
     private final List<SSTableWriter> writers = new ArrayList<>();
     private final boolean keepOriginals; // true if we do not want to obsolete the originals
@@ -106,7 +106,7 @@
 
     private static long calculateOpenInterval(boolean shouldOpenEarly)
     {
-        long interval = DatabaseDescriptor.getSSTablePreemptiveOpenIntervalInMB() * (1L << 20);
+        long interval = DatabaseDescriptor.getSSTablePreemptiveOpenIntervalInMiB() * (1L << 20);
         if (disableEarlyOpeningForTests || !shouldOpenEarly || interval < 0)
             interval = Long.MAX_VALUE;
         return interval;
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
index 7ac2ebc..3b1ed1b 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleUnsortedWriter.java
@@ -17,25 +17,29 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.SynchronousQueue;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.base.Throwables;
 
 import io.netty.util.concurrent.FastThreadLocalThread;
-import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.RegularAndStaticColumns;
+import org.apache.cassandra.db.SerializationHeader;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.db.rows.SerializationHelper;
 import org.apache.cassandra.db.rows.UnfilteredSerializer;
-import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 /**
  * A SSTable writer that doesn't assume rows are in sorted order.
@@ -59,7 +63,7 @@
     private final SerializationHeader header;
     private final SerializationHelper helper;
 
-    private final BlockingQueue<Buffer> writeQueue = new SynchronousQueue<Buffer>();
+    private final BlockingQueue<Buffer> writeQueue = newBlockingQueue(0);
     private final DiskWriter diskWriter = new DiskWriter();
 
     SSTableSimpleUnsortedWriter(File directory, TableMetadataRef metadata, RegularAndStaticColumns columns, long bufferSizeInMB)
@@ -165,7 +169,7 @@
             }
             catch (InterruptedException e)
             {
-                throw new RuntimeException(e);
+                throw new UncheckedInterruptedException(e);
             }
         }
     }
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
index 530a03b..c9356a3 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableSimpleWriter.java
@@ -17,13 +17,13 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.io.IOException;
 
 import com.google.common.base.Throwables;
 
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableMetadataRef;
 
 /**
@@ -48,7 +48,7 @@
         super(directory, metadata, columns);
     }
 
-    private SSTableTxnWriter getOrCreateWriter()
+    private SSTableTxnWriter getOrCreateWriter() throws IOException
     {
         if (writer == null)
             writer = createWriter();
diff --git a/src/java/org/apache/cassandra/io/sstable/SSTableTxnWriter.java b/src/java/org/apache/cassandra/io/sstable/SSTableTxnWriter.java
index cfb1365..83c5542 100644
--- a/src/java/org/apache/cassandra/io/sstable/SSTableTxnWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SSTableTxnWriter.java
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 import java.util.Collection;
-import java.util.UUID;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
@@ -34,6 +33,7 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
 /**
@@ -99,7 +99,7 @@
     }
 
     @SuppressWarnings("resource") // log and writer closed during doPostCleanup
-    public static SSTableTxnWriter create(ColumnFamilyStore cfs, Descriptor descriptor, long keyCount, long repairedAt, UUID pendingRepair, boolean isTransient, int sstableLevel, SerializationHeader header)
+    public static SSTableTxnWriter create(ColumnFamilyStore cfs, Descriptor descriptor, long keyCount, long repairedAt, TimeUUID pendingRepair, boolean isTransient, int sstableLevel, SerializationHeader header)
     {
         LifecycleTransaction txn = LifecycleTransaction.offline(OperationType.WRITE);
         SSTableMultiWriter writer = cfs.createSSTableMultiWriter(descriptor, keyCount, repairedAt, pendingRepair, isTransient, sstableLevel, header, txn);
@@ -111,7 +111,7 @@
     public static SSTableTxnWriter createRangeAware(TableMetadataRef metadata,
                                                     long keyCount,
                                                     long repairedAt,
-                                                    UUID pendingRepair,
+                                                    TimeUUID pendingRepair,
                                                     boolean isTransient,
                                                     SSTableFormat.Type type,
                                                     int sstableLevel,
@@ -140,7 +140,7 @@
                                           Descriptor descriptor,
                                           long keyCount,
                                           long repairedAt,
-                                          UUID pendingRepair,
+                                          TimeUUID pendingRepair,
                                           boolean isTransient,
                                           int sstableLevel,
                                           SerializationHeader header,
@@ -153,7 +153,7 @@
         return new SSTableTxnWriter(txn, writer);
     }
 
-    public static SSTableTxnWriter create(ColumnFamilyStore cfs, Descriptor desc, long keyCount, long repairedAt, UUID pendingRepair, boolean isTransient, SerializationHeader header)
+    public static SSTableTxnWriter create(ColumnFamilyStore cfs, Descriptor desc, long keyCount, long repairedAt, TimeUUID pendingRepair, boolean isTransient, SerializationHeader header)
     {
         return create(cfs, desc, keyCount, repairedAt, pendingRepair, isTransient, 0, header);
     }
diff --git a/src/java/org/apache/cassandra/io/sstable/SequenceBasedSSTableId.java b/src/java/org/apache/cassandra/io/sstable/SequenceBasedSSTableId.java
new file mode 100644
index 0000000..acb91f8
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/sstable/SequenceBasedSSTableId.java
@@ -0,0 +1,134 @@
+/*
+ * 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.io.sstable;
+
+import java.nio.ByteBuffer;
+import java.util.Objects;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Generation identifier based on sequence of integers.
+ * This has been the standard implementation in C* since inception.
+ */
+public class SequenceBasedSSTableId implements SSTableId, Comparable<SequenceBasedSSTableId>
+{
+    public final int generation;
+
+    public SequenceBasedSSTableId(final int generation)
+    {
+        assert generation >= 0;
+
+        this.generation = generation;
+    }
+
+    @Override
+    public int compareTo(SequenceBasedSSTableId o)
+    {
+        if (o == null)
+            return 1;
+        else if (o == this)
+            return 0;
+
+        return Integer.compare(this.generation, o.generation);
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        SequenceBasedSSTableId that = (SequenceBasedSSTableId) o;
+        return generation == that.generation;
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(generation);
+    }
+
+    @Override
+    public ByteBuffer asBytes()
+    {
+        ByteBuffer bytes = ByteBuffer.allocate(Integer.BYTES);
+        bytes.putInt(0, generation);
+        return bytes;
+    }
+
+    @Override
+    public String toString()
+    {
+        return String.valueOf(generation);
+    }
+
+    public static class Builder implements SSTableId.Builder<SequenceBasedSSTableId>
+    {
+        public final static Builder instance = new Builder();
+
+        private final static Pattern PATTERN = Pattern.compile("\\d+");
+
+        /**
+         * Generates a sequential number to represent an sstables identifier. The first generated identifier will be
+         * greater by one than the largest generation number found across the provided existing identifiers.
+         */
+        @Override
+        public Supplier<SequenceBasedSSTableId> generator(Stream<SSTableId> existingIdentifiers)
+        {
+            int value = existingIdentifiers.filter(SequenceBasedSSTableId.class::isInstance)
+                                           .map(SequenceBasedSSTableId.class::cast)
+                                           .mapToInt(id -> id.generation)
+                                           .max()
+                                           .orElse(0);
+
+            AtomicInteger fileIndexGenerator = new AtomicInteger(value);
+            return () -> new SequenceBasedSSTableId(fileIndexGenerator.incrementAndGet());
+        }
+
+        @Override
+        public boolean isUniqueIdentifier(String str)
+        {
+            return str != null && !str.isEmpty() && str.length() <= 10 && PATTERN.matcher(str).matches();
+        }
+
+        @Override
+        public boolean isUniqueIdentifier(ByteBuffer bytes)
+        {
+            return bytes != null && bytes.remaining() == Integer.BYTES && bytes.getInt(0) >= 0;
+        }
+
+        @Override
+        public SequenceBasedSSTableId fromString(String token) throws IllegalArgumentException
+        {
+            return new SequenceBasedSSTableId(Integer.parseInt(token));
+        }
+
+        @Override
+        public SequenceBasedSSTableId fromBytes(ByteBuffer bytes) throws IllegalArgumentException
+        {
+            Preconditions.checkArgument(bytes.remaining() == Integer.BYTES, "Buffer does not have a valid number of bytes remaining. Expecting: %s but was: %s", Integer.BYTES, bytes.remaining());
+            return new SequenceBasedSSTableId(bytes.getInt(0));
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/sstable/SimpleSSTableMultiWriter.java b/src/java/org/apache/cassandra/io/sstable/SimpleSSTableMultiWriter.java
index a84f07e..ec28528 100644
--- a/src/java/org/apache/cassandra/io/sstable/SimpleSSTableMultiWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/SimpleSSTableMultiWriter.java
@@ -19,7 +19,6 @@
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.UUID;
 
 import org.apache.cassandra.db.RowIndexEntry;
 import org.apache.cassandra.db.SerializationHeader;
@@ -31,6 +30,7 @@
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class SimpleSSTableMultiWriter implements SSTableMultiWriter
 {
@@ -110,7 +110,7 @@
     public static SSTableMultiWriter create(Descriptor descriptor,
                                             long keyCount,
                                             long repairedAt,
-                                            UUID pendingRepair,
+                                            TimeUUID pendingRepair,
                                             boolean isTransient,
                                             TableMetadataRef metadata,
                                             MetadataCollector metadataCollector,
diff --git a/src/java/org/apache/cassandra/io/sstable/SnapshotDeletingTask.java b/src/java/org/apache/cassandra/io/sstable/SnapshotDeletingTask.java
deleted file mode 100644
index d23c488..0000000
--- a/src/java/org/apache/cassandra/io/sstable/SnapshotDeletingTask.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.io.sstable;
-
-import java.io.File;
-import java.util.Queue;
-import java.util.concurrent.ConcurrentLinkedQueue;
-
-import com.google.common.annotations.VisibleForTesting;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.db.WindowsFailedSnapshotTracker;
-import org.apache.cassandra.io.FSWriteError;
-import org.apache.cassandra.io.util.FileUtils;
-
-public class SnapshotDeletingTask implements Runnable
-{
-    private static final Logger logger = LoggerFactory.getLogger(SnapshotDeletingTask.class);
-
-    public final File path;
-    private static final Queue<Runnable> failedTasks = new ConcurrentLinkedQueue<>();
-
-    public static void addFailedSnapshot(File path)
-    {
-        logger.warn("Failed to delete snapshot [{}]. Will retry after further sstable deletions. Folder will be deleted on JVM shutdown or next node restart on crash.", path);
-        WindowsFailedSnapshotTracker.handleFailedSnapshot(path);
-        failedTasks.add(new SnapshotDeletingTask(path));
-    }
-
-    private SnapshotDeletingTask(File path)
-    {
-        this.path = path;
-    }
-
-    public void run()
-    {
-        try
-        {
-            FileUtils.deleteRecursive(path);
-            logger.info("Successfully deleted snapshot {}.", path);
-        }
-        catch (FSWriteError e)
-        {
-            failedTasks.add(this);
-        }
-    }
-
-    /**
-     * Retry all failed deletions.
-     */
-    public static void rescheduleFailedTasks()
-    {
-        Runnable task;
-        while ( null != (task = failedTasks.poll()))
-            ScheduledExecutors.nonPeriodicTasks.submit(task);
-    }
-
-    @VisibleForTesting
-    public static int pendingDeletionCount()
-    {
-        return failedTasks.size();
-    }
-}
diff --git a/src/java/org/apache/cassandra/io/sstable/UUIDBasedSSTableId.java b/src/java/org/apache/cassandra/io/sstable/UUIDBasedSSTableId.java
new file mode 100644
index 0000000..9cec587
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/sstable/UUIDBasedSSTableId.java
@@ -0,0 +1,165 @@
+/*
+ * 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.io.sstable;
+
+import java.nio.ByteBuffer;
+import java.nio.ByteOrder;
+import java.util.Objects;
+import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import javax.annotation.Nonnull;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.utils.TimeUUID;
+
+/**
+ * SSTable generation identifiers that can be stored across nodes in one directory/bucket
+ * <p>
+ * Uses the UUID v1 identifiers
+ */
+public final class UUIDBasedSSTableId implements SSTableId, Comparable<UUIDBasedSSTableId>
+{
+    public final static int STRING_LEN = 28;
+    public final static int BYTES_LEN = 16;
+
+    private final TimeUUID uuid;
+    private final String repr;
+
+    public UUIDBasedSSTableId(TimeUUID uuid)
+    {
+        this.uuid = uuid;
+        this.repr = asString();
+    }
+
+    @Override
+    public ByteBuffer asBytes()
+    {
+        return ByteBuffer.allocate(16)
+                         .order(ByteOrder.BIG_ENDIAN)
+                         .putLong(0, uuid.uuidTimestamp())
+                         .putLong(Long.BYTES, uuid.lsb());
+    }
+
+    private String asString()
+    {
+        long ts = uuid.uuidTimestamp();
+        long nanoPart = ts % 10_000_000;
+        ts = ts / 10_000_000;
+        long seconds = ts % 86_400;
+        ts = ts / 86_400;
+
+        return String.format("%4s_%4s_%5s%13s",
+                             Long.toString(ts, 36),
+                             Long.toString(seconds, 36),
+                             Long.toString(nanoPart, 36),
+                             Long.toUnsignedString(uuid.lsb(), 36)).replace(' ', '0');
+    }
+
+    @Override
+    public String toString()
+    {
+        return repr;
+    }
+
+    @Override
+    public int compareTo(UUIDBasedSSTableId o)
+    {
+        if (o == null)
+            return 1;
+        else if (o == this)
+            return 0;
+
+        return uuid.compareTo(o.uuid);
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass())
+            return false;
+        UUIDBasedSSTableId that = (UUIDBasedSSTableId) o;
+        return uuid.equals(that.uuid);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(uuid);
+    }
+
+    public static class Builder implements SSTableId.Builder<UUIDBasedSSTableId>
+    {
+        public static final Builder instance = new Builder();
+        private final static Pattern PATTERN = Pattern.compile("([0-9a-z]{4})_([0-9a-z]{4})_([0-9a-z]{5})([0-9a-z]{13})", Pattern.CASE_INSENSITIVE);
+
+        /**
+         * Creates a new UUID based identifiers generator.
+         *
+         * @param existingIdentifiers not used by UUID based generator
+         */
+        @Override
+        public Supplier<UUIDBasedSSTableId> generator(Stream<SSTableId> existingIdentifiers)
+        {
+            return () -> new UUIDBasedSSTableId(TimeUUID.Generator.nextTimeUUID());
+        }
+
+        @Override
+        public boolean isUniqueIdentifier(String str)
+        {
+            return str != null && str.length() == STRING_LEN && PATTERN.matcher(str).matches();
+        }
+
+        @Override
+        public boolean isUniqueIdentifier(ByteBuffer bytes)
+        {
+            return bytes != null && bytes.remaining() == BYTES_LEN;
+        }
+
+        @Override
+        public UUIDBasedSSTableId fromString(@Nonnull String s) throws IllegalArgumentException
+        {
+            Matcher m = PATTERN.matcher(s);
+            if (!m.matches())
+                throw new IllegalArgumentException("String '" + s + "' is not a valid UUID based sstable identifier");
+
+            long dayPart = Long.parseLong(m.group(1), 36);
+            long secondPart = Long.parseLong(m.group(2), 36);
+            long nanoPart = Long.parseLong(m.group(3), 36);
+            long ts = (dayPart * 86_400 + secondPart) * 10_000_000 + nanoPart;
+            long randomPart = Long.parseUnsignedLong(m.group(4), 36);
+
+            TimeUUID uuid = new TimeUUID(ts, randomPart);
+            return new UUIDBasedSSTableId(uuid);
+        }
+
+        @Override
+        public UUIDBasedSSTableId fromBytes(@Nonnull ByteBuffer bytes) throws IllegalArgumentException
+        {
+            Preconditions.checkArgument(bytes.remaining() == UUIDBasedSSTableId.BYTES_LEN, "Buffer does not have a valid number of bytes remaining. Expecting: %s but was: %s", UUIDBasedSSTableId.BYTES_LEN, bytes.remaining());
+            bytes = bytes.order() == ByteOrder.BIG_ENDIAN ? bytes : bytes.duplicate().order(ByteOrder.BIG_ENDIAN);
+            TimeUUID uuid = new TimeUUID(bytes.getLong(0), bytes.getLong(Long.BYTES));
+            return new UUIDBasedSSTableId(uuid);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriter.java
index 43b1957..e9b15b1 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriter.java
@@ -21,7 +21,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.UUID;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -35,6 +34,7 @@
 import org.apache.cassandra.io.sstable.SSTableMultiWriter;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class RangeAwareSSTableWriter implements SSTableMultiWriter
 {
@@ -43,7 +43,7 @@
     private final int sstableLevel;
     private final long estimatedKeys;
     private final long repairedAt;
-    private final UUID pendingRepair;
+    private final TimeUUID pendingRepair;
     private final boolean isTransient;
     private final SSTableFormat.Type format;
     private final SerializationHeader header;
@@ -54,7 +54,7 @@
     private final List<SSTableReader> finishedReaders = new ArrayList<>();
     private SSTableMultiWriter currentWriter = null;
 
-    public RangeAwareSSTableWriter(ColumnFamilyStore cfs, long estimatedKeys, long repairedAt, UUID pendingRepair, boolean isTransient, SSTableFormat.Type format, int sstableLevel, long totalSize, LifecycleNewTracker lifecycleNewTracker, SerializationHeader header) throws IOException
+    public RangeAwareSSTableWriter(ColumnFamilyStore cfs, long estimatedKeys, long repairedAt, TimeUUID pendingRepair, boolean isTransient, SSTableFormat.Type format, int sstableLevel, long totalSize, LifecycleNewTracker lifecycleNewTracker, SerializationHeader header) throws IOException
     {
         DiskBoundaries db = cfs.getDiskBoundaries();
         directories = db.directories;
diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableFlushObserver.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableFlushObserver.java
index f0b6bac..569925e 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/SSTableFlushObserver.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableFlushObserver.java
@@ -52,4 +52,4 @@
      * Called when all data is written to the file and it's ready to be finished up.
      */
     void complete();
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java
index 45297ef..f26cf65 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReader.java
@@ -17,9 +17,11 @@
  */
 package org.apache.cassandra.io.sstable.format;
 
-import java.io.*;
+
+import java.io.IOException;
 import java.lang.ref.WeakReference;
 import java.nio.ByteBuffer;
+import java.nio.file.NoSuchFileException;
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -30,6 +32,10 @@
 import com.google.common.collect.Ordering;
 import com.google.common.primitives.Longs;
 import com.google.common.util.concurrent.RateLimiter;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.db.rows.UnfilteredSource;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,8 +45,7 @@
 
 import org.apache.cassandra.cache.InstrumentingCache;
 import org.apache.cassandra.cache.KeyCacheKey;
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.*;
@@ -69,12 +74,11 @@
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.utils.*;
-import org.apache.cassandra.utils.concurrent.OpOrder;
-import org.apache.cassandra.utils.concurrent.Ref;
-import org.apache.cassandra.utils.concurrent.SelfRefCounted;
-import org.apache.cassandra.utils.BloomFilterSerializer;
+import org.apache.cassandra.utils.concurrent.*;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.db.Directories.SECONDARY_INDEX_NAME_SEPARATOR;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 /**
  * An SSTableReader can be constructed in a number of places, but typically is either
@@ -135,21 +139,25 @@
  *
  * TODO: fill in details about Tracker and lifecycle interactions for tools, and for compaction strategies
  */
-public abstract class SSTableReader extends SSTable implements SelfRefCounted<SSTableReader>
+public abstract class SSTableReader extends SSTable implements UnfilteredSource, SelfRefCounted<SSTableReader>
 {
     private static final Logger logger = LoggerFactory.getLogger(SSTableReader.class);
 
-    private static final ScheduledThreadPoolExecutor syncExecutor = initSyncExecutor();
-    private static ScheduledThreadPoolExecutor initSyncExecutor()
+    private static final boolean TRACK_ACTIVITY = CassandraRelevantProperties.DISABLE_SSTABLE_ACTIVITY_TRACKING.getBoolean();
+
+    private static final ScheduledExecutorPlus syncExecutor = initSyncExecutor();
+    private static ScheduledExecutorPlus initSyncExecutor()
     {
         if (DatabaseDescriptor.isClientOrToolInitialized())
             return null;
 
         // Do NOT start this thread pool in client mode
 
-        ScheduledThreadPoolExecutor syncExecutor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("read-hotness-tracker"));
+        ScheduledExecutorPlus syncExecutor = executorFactory().scheduled("read-hotness-tracker");
         // Immediately remove readMeter sync task when cancelled.
-        syncExecutor.setRemoveOnCancelPolicy(true);
+        // TODO: should we set this by default on all scheduled executors?
+        if (syncExecutor instanceof ScheduledThreadPoolExecutor)
+            ((ScheduledThreadPoolExecutor)syncExecutor).setRemoveOnCancelPolicy(true);
         return syncExecutor;
     }
     private static final RateLimiter meterSyncThrottle = RateLimiter.create(100.0);
@@ -162,7 +170,8 @@
 
     public static final Comparator<SSTableReader> sstableComparator = (o1, o2) -> o1.first.compareTo(o2.first);
 
-    public static final Comparator<SSTableReader> generationReverseComparator = (o1, o2) -> -Integer.compare(o1.descriptor.generation, o2.descriptor.generation);
+    public static final Comparator<SSTableReader> idComparator = Comparator.comparing(t -> t.descriptor.id, SSTableIdFactory.COMPARATOR);
+    public static final Comparator<SSTableReader> idReverseComparator = idComparator.reversed();
 
     public static final Ordering<SSTableReader> sstableOrdering = Ordering.from(sstableComparator);
 
@@ -175,7 +184,7 @@
     };
 
     /**
-     * maxDataAge is a timestamp in local server time (e.g. System.currentTimeMilli) which represents an upper bound
+     * maxDataAge is a timestamp in local server time (e.g. Global.currentTimeMilli) which represents an upper bound
      * to the newest piece of data stored in the sstable. In other words, this sstable does not contain items created
      * later than maxDataAge.
      *
@@ -525,46 +534,52 @@
     public static Collection<SSTableReader> openAll(Set<Map.Entry<Descriptor, Set<Component>>> entries,
                                                     final TableMetadataRef metadata)
     {
-        final Collection<SSTableReader> sstables = new LinkedBlockingQueue<>();
+        final Collection<SSTableReader> sstables = newBlockingQueue();
 
-        ExecutorService executor = DebuggableThreadPoolExecutor.createWithFixedPoolSize("SSTableBatchOpen", FBUtilities.getAvailableProcessors());
-        for (final Map.Entry<Descriptor, Set<Component>> entry : entries)
+        ExecutorPlus executor = executorFactory().pooled("SSTableBatchOpen", FBUtilities.getAvailableProcessors());
+        try
         {
-            Runnable runnable = new Runnable()
+            for (final Map.Entry<Descriptor, Set<Component>> entry : entries)
             {
-                public void run()
+                Runnable runnable = new Runnable()
                 {
-                    SSTableReader sstable;
-                    try
+                    public void run()
                     {
-                        sstable = open(entry.getKey(), entry.getValue(), metadata);
+                        SSTableReader sstable;
+                        try
+                        {
+                            sstable = open(entry.getKey(), entry.getValue(), metadata);
+                        }
+                        catch (CorruptSSTableException ex)
+                        {
+                            JVMStabilityInspector.inspectThrowable(ex);
+                            logger.error("Corrupt sstable {}; skipping table", entry, ex);
+                            return;
+                        }
+                        catch (FSError ex)
+                        {
+                            JVMStabilityInspector.inspectThrowable(ex);
+                            logger.error("Cannot read sstable {}; file system error, skipping table", entry, ex);
+                            return;
+                        }
+                        sstables.add(sstable);
                     }
-                    catch (CorruptSSTableException ex)
-                    {
-                        JVMStabilityInspector.inspectThrowable(ex);
-                        logger.error("Corrupt sstable {}; skipping table", entry, ex);
-                        return;
-                    }
-                    catch (FSError ex)
-                    {
-                        JVMStabilityInspector.inspectThrowable(ex);
-                        logger.error("Cannot read sstable {}; file system error, skipping table", entry, ex);
-                        return;
-                    }
-                    sstables.add(sstable);
-                }
-            };
-            executor.submit(runnable);
+                };
+                executor.submit(runnable);
+            }
+        }
+        finally
+        {
+            executor.shutdown();
         }
 
-        executor.shutdown();
         try
         {
             executor.awaitTermination(7, TimeUnit.DAYS);
         }
         catch (InterruptedException e)
         {
-            throw new AssertionError(e);
+            throw new UncheckedInterruptedException(e);
         }
 
         return sstables;
@@ -613,7 +628,7 @@
                 if (expectedComponents.contains(Component.COMPRESSION_INFO) && !actualComponents.contains(Component.COMPRESSION_INFO))
                 {
                     String compressionInfoFileName = descriptor.filenameFor(Component.COMPRESSION_INFO);
-                    throw new CorruptSSTableException(new FileNotFoundException(compressionInfoFileName), compressionInfoFileName);
+                    throw new CorruptSSTableException(new NoSuchFileException(compressionInfoFileName), compressionInfoFileName);
                 }
             }
             catch (IOException e)
@@ -719,7 +734,7 @@
         if (summariesFile.exists())
             FileUtils.deleteWithConfirm(summariesFile);
 
-        try (DataOutputStreamPlus oStream = new BufferedDataOutputStreamPlus(new FileOutputStream(summariesFile)))
+        try (DataOutputStreamPlus oStream = new FileOutputStreamPlus(summariesFile))
         {
             IndexSummary.serializer.serialize(summary, oStream);
             ByteBufferUtil.writeWithLength(first.getKey(), oStream);
@@ -727,7 +742,7 @@
         }
         catch (IOException e)
         {
-            logger.trace("Cannot save SSTable Summary: ", e);
+            logger.error("Cannot save SSTable Summary: ", e);
 
             // corrupted hence delete it and let it load it now.
             if (summariesFile.exists())
@@ -738,7 +753,7 @@
     public static void saveBloomFilter(Descriptor descriptor, IFilter filter)
     {
         File filterFile = new File(descriptor.filenameFor(Component.FILTER));
-        try (DataOutputStreamPlus stream = new BufferedDataOutputStreamPlus(new FileOutputStream(filterFile)))
+        try (DataOutputStreamPlus stream = new FileOutputStreamPlus(filterFile))
         {
             BloomFilterSerializer.serialize((BloomFilter) filter, stream);
             stream.flush();
@@ -1405,13 +1420,7 @@
                                                  boolean permitMatchPastLast,
                                                  SSTableReadsListener listener);
 
-    public abstract UnfilteredRowIterator iterator(DecoratedKey key,
-                                                   Slices slices,
-                                                   ColumnFilter selectedColumns,
-                                                   boolean reversed,
-                                                   SSTableReadsListener listener);
-
-    public abstract UnfilteredRowIterator iterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed);
+    public abstract UnfilteredRowIterator rowIterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed);
 
     public abstract UnfilteredRowIterator simpleIterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, boolean tombstoneOnly);
 
@@ -1572,14 +1581,6 @@
      */
     public abstract ISSTableScanner getScanner(Iterator<AbstractBounds<PartitionPosition>> rangeIterator);
 
-    /**
-     * @param columns the columns to return.
-     * @param dataRange filter to use when reading the columns
-     * @param listener a listener used to handle internal read events
-     * @return A Scanner for seeking over the rows of the SSTable.
-     */
-    public abstract ISSTableScanner getScanner(ColumnFilter columns, DataRange dataRange, SSTableReadsListener listener);
-
     public FileDataInput getFileDataInput(long position)
     {
         return dfile.createReader(position);
@@ -1620,7 +1621,7 @@
                 continue;
             if (null != limiter)
                 limiter.acquire();
-            File targetLink = new File(snapshotDirectoryPath, sourceFile.getName());
+            File targetLink = new File(snapshotDirectoryPath, sourceFile.name());
             FileUtils.createHardLink(sourceFile, targetLink);
         }
     }
@@ -1655,7 +1656,7 @@
         return sstableMetadata.pendingRepair != ActiveRepairService.NO_PENDING_REPAIR;
     }
 
-    public UUID getPendingRepair()
+    public TimeUUID getPendingRepair()
     {
         return sstableMetadata.pendingRepair;
     }
@@ -1848,7 +1849,7 @@
     /**
      * Mutate sstable repair metadata with a lock to avoid racing with entire-sstable-streaming and then reload sstable metadata
      */
-    public void mutateRepairedAndReload(long newRepairedAt, UUID newPendingRepair, boolean isTransient) throws IOException
+    public void mutateRepairedAndReload(long newRepairedAt, TimeUUID newPendingRepair, boolean isTransient) throws IOException
     {
         synchronized (tidy.global)
         {
@@ -1968,7 +1969,7 @@
 
     void setup(boolean trackHotness)
     {
-        tidy.setup(this, trackHotness);
+        tidy.setup(this, TRACK_ACTIVITY && trackHotness);
         this.readMeter = tidy.global.readMeter;
     }
 
@@ -1989,6 +1990,13 @@
 
     }
 
+    public boolean maybePresent(DecoratedKey key)
+    {
+        // if we don't have bloom filter(bf_fp_chance=1.0 or filter file is missing),
+        // we check index file instead.
+        return bf instanceof AlwaysPresentFilter && getPosition(key, Operator.EQ, false) != null || bf.isPresent(key);
+    }
+
     /**
      * One instance per SSTableReader we create.
      *
@@ -2084,6 +2092,12 @@
                     if (logger.isTraceEnabled())
                         logger.trace("Async instance tidier for {}, completed", descriptor);
                 }
+
+                @Override
+                public String toString()
+                {
+                    return "Tidy " + descriptor.ksname + '.' + descriptor.cfname + '-' + descriptor.id;
+                }
             });
         }
 
@@ -2137,14 +2151,14 @@
             // Don't track read rates for tables in the system keyspace and don't bother trying to load or persist
             // the read meter when in client mode.
             // Also, do not track read rates when running in client or tools mode (syncExecuter isn't available in these modes)
-            if (SchemaConstants.isLocalSystemKeyspace(desc.ksname) || DatabaseDescriptor.isClientOrToolInitialized())
+            if (!TRACK_ACTIVITY || SchemaConstants.isLocalSystemKeyspace(desc.ksname) || DatabaseDescriptor.isClientOrToolInitialized())
             {
                 readMeter = null;
                 readMeterSyncFuture = NULL;
                 return;
             }
 
-            readMeter = SystemKeyspace.getSSTableReadMeter(desc.ksname, desc.cfname, desc.generation);
+            readMeter = SystemKeyspace.getSSTableReadMeter(desc.ksname, desc.cfname, desc.id);
             // sync the average read rate to system.sstable_activity every five minutes, starting one minute from now
             readMeterSyncFuture = new WeakReference<>(syncExecutor.scheduleAtFixedRate(new Runnable()
             {
@@ -2153,7 +2167,7 @@
                     if (obsoletion == null)
                     {
                         meterSyncThrottle.acquire();
-                        SystemKeyspace.persistSSTableReadMeter(desc.ksname, desc.cfname, desc.generation, readMeter);
+                        SystemKeyspace.persistSSTableReadMeter(desc.ksname, desc.cfname, desc.id, readMeter);
                     }
                 }
             }, 1, 5, TimeUnit.MINUTES));
@@ -2191,18 +2205,27 @@
         public static Ref<GlobalTidy> get(SSTableReader sstable)
         {
             Descriptor descriptor = sstable.descriptor;
-            Ref<GlobalTidy> refc = lookup.get(descriptor);
-            if (refc != null)
-                return refc.ref();
-            final GlobalTidy tidy = new GlobalTidy(sstable);
-            refc = new Ref<>(tidy, tidy);
-            Ref<?> ex = lookup.putIfAbsent(descriptor, refc);
-            if (ex != null)
+
+            while (true)
             {
-                refc.close();
-                throw new AssertionError();
+                Ref<GlobalTidy> ref = lookup.get(descriptor);
+                if (ref == null)
+                {
+                    final GlobalTidy tidy = new GlobalTidy(sstable);
+                    ref = new Ref<>(tidy, tidy);
+                    Ref<GlobalTidy> ex = lookup.putIfAbsent(descriptor, ref);
+                    if (ex == null)
+                        return ref;
+                    ref = ex;
+                }
+
+                Ref<GlobalTidy> newRef = ref.tryRef();
+                if (newRef != null)
+                    return newRef;
+
+                // raced with tidy
+                lookup.remove(descriptor, ref);
             }
-            return refc;
         }
     }
 
diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableReaderBuilder.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableReaderBuilder.java
index 8fe1def..6ca74f0 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/SSTableReaderBuilder.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableReaderBuilder.java
@@ -28,7 +28,9 @@
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.io.sstable.metadata.ValidationMetadata;
 import org.apache.cassandra.io.util.DiskOptimizationStrategy;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileHandle;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.schema.TableMetadata;
@@ -37,16 +39,17 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.BufferedInputStream;
 import java.io.DataInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import static org.apache.cassandra.io.sstable.format.SSTableReader.OpenReason.NORMAL;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public abstract class SSTableReaderBuilder
 {
     private static final Logger logger = LoggerFactory.getLogger(SSTableReaderBuilder.class);
@@ -125,7 +128,7 @@
         if (!summariesFile.exists())
         {
             if (logger.isDebugEnabled())
-                logger.debug("SSTable Summary File {} does not exist", summariesFile.getAbsolutePath());
+                logger.debug("SSTable Summary File {} does not exist", summariesFile.absolutePath());
             return;
         }
 
@@ -144,7 +147,7 @@
         {
             if (summary != null)
                 summary.close();
-            logger.trace("Cannot deserialize SSTable Summary File {}: {}", summariesFile.getPath(), e.getMessage());
+            logger.trace("Cannot deserialize SSTable Summary File {}: {}", summariesFile.path(), e.getMessage());
             // corrupted; delete it and fall back to creating a new summary
             FileUtils.closeQuietly(iStream);
             // delete it and fall back to creating a new summary
@@ -233,7 +236,7 @@
      */
     IFilter loadBloomFilter() throws IOException
     {
-        try (DataInputStream stream = new DataInputStream(new BufferedInputStream(Files.newInputStream(Paths.get(descriptor.filenameFor(Component.FILTER))))))
+        try (FileInputStreamPlus stream = new File(descriptor.filenameFor(Component.FILTER)).newInputStream())
         {
             return BloomFilterSerializer.deserialize(stream, descriptor.version.hasOldBfFormat());
         }
@@ -270,7 +273,7 @@
                         StatsMetadata statsMetadata,
                         SerializationHeader header)
         {
-            super(descriptor, metadataRef, System.currentTimeMillis(), components, statsMetadata, SSTableReader.OpenReason.NORMAL, header);
+            super(descriptor, metadataRef, currentTimeMillis(), components, statsMetadata, NORMAL, header);
         }
 
         @Override
@@ -338,7 +341,7 @@
                        StatsMetadata statsMetadata,
                        SerializationHeader header)
         {
-            super(descriptor, metadataRef, System.currentTimeMillis(), components, statsMetadata, SSTableReader.OpenReason.NORMAL, header);
+            super(descriptor, metadataRef, currentTimeMillis(), components, statsMetadata, NORMAL, header);
             this.validationMetadata = validationMetadata;
             this.isOffline = isOffline;
         }
@@ -353,9 +356,9 @@
             try
             {
                 // load index and filter
-                long start = System.nanoTime();
+                long start = nanoTime();
                 load(validationMetadata, isOffline, components, DatabaseDescriptor.getDiskOptimizationStrategy(), statsMetadata);
-                logger.trace("INDEX LOAD TIME for {}: {} ms.", descriptor, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
+                logger.trace("INDEX LOAD TIME for {}: {} ms.", descriptor, TimeUnit.NANOSECONDS.toMillis(nanoTime() - start));
             }
             catch (IOException t)
             {
diff --git a/src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java b/src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java
index 43c50c5..f82a7c2 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/SSTableWriter.java
@@ -25,10 +25,16 @@
 import com.google.common.collect.Sets;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.DeletionPurger;
 import org.apache.cassandra.db.RowIndexEntry;
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.compaction.OperationType;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
+import org.apache.cassandra.db.rows.ComplexColumnData;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.Unfiltered;
 import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.index.Index;
 import org.apache.cassandra.io.FSWriteError;
@@ -40,9 +46,13 @@
 import org.apache.cassandra.io.sstable.metadata.MetadataType;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableMetadataRef;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
 /**
@@ -54,7 +64,7 @@
 public abstract class SSTableWriter extends SSTable implements Transactional
 {
     protected long repairedAt;
-    protected UUID pendingRepair;
+    protected TimeUUID pendingRepair;
     protected boolean isTransient;
     protected long maxDataAge = -1;
     protected final long keyCount;
@@ -77,7 +87,7 @@
     protected SSTableWriter(Descriptor descriptor,
                             long keyCount,
                             long repairedAt,
-                            UUID pendingRepair,
+                            TimeUUID pendingRepair,
                             boolean isTransient,
                             TableMetadataRef metadata,
                             MetadataCollector metadataCollector,
@@ -98,7 +108,7 @@
     public static SSTableWriter create(Descriptor descriptor,
                                        Long keyCount,
                                        Long repairedAt,
-                                       UUID pendingRepair,
+                                       TimeUUID pendingRepair,
                                        boolean isTransient,
                                        TableMetadataRef metadata,
                                        MetadataCollector metadataCollector,
@@ -113,7 +123,7 @@
     public static SSTableWriter create(Descriptor descriptor,
                                        long keyCount,
                                        long repairedAt,
-                                       UUID pendingRepair,
+                                       TimeUUID pendingRepair,
                                        boolean isTransient,
                                        int sstableLevel,
                                        SerializationHeader header,
@@ -128,7 +138,7 @@
                                        Descriptor descriptor,
                                        long keyCount,
                                        long repairedAt,
-                                       UUID pendingRepair,
+                                       TimeUUID pendingRepair,
                                        boolean isTransient,
                                        int sstableLevel,
                                        SerializationHeader header,
@@ -143,7 +153,7 @@
     public static SSTableWriter create(Descriptor descriptor,
                                        long keyCount,
                                        long repairedAt,
-                                       UUID pendingRepair,
+                                       TimeUUID pendingRepair,
                                        boolean isTransient,
                                        SerializationHeader header,
                                        Collection<Index> indexes,
@@ -372,12 +382,25 @@
         FileUtils.createHardLinkWithoutConfirm(tmpdesc.filenameFor(Component.SUMMARY), newdesc.filenameFor(Component.SUMMARY));
     }
 
+    /**
+     * Parameters for calculating the expected size of an sstable. Exposed on memtable flush sets (i.e. collected
+     * subsets of a memtable that will be written to sstables).
+     */
+    public interface SSTableSizeParameters
+    {
+        long partitionCount();
+        long partitionKeysSize();
+        long dataSize();
+    }
+
     public static abstract class Factory
     {
+        public abstract long estimateSize(SSTableSizeParameters parameters);
+
         public abstract SSTableWriter open(Descriptor descriptor,
                                            long keyCount,
                                            long repairedAt,
-                                           UUID pendingRepair,
+                                           TimeUUID pendingRepair,
                                            boolean isTransient,
                                            TableMetadataRef metadata,
                                            MetadataCollector metadataCollector,
@@ -385,4 +408,43 @@
                                            Collection<SSTableFlushObserver> observers,
                                            LifecycleNewTracker lifecycleNewTracker);
     }
+
+    public static void guardCollectionSize(TableMetadata metadata, DecoratedKey partitionKey, Unfiltered unfiltered)
+    {
+        if (!Guardrails.collectionSize.enabled() && !Guardrails.itemsPerCollection.enabled())
+            return;
+
+        if (!unfiltered.isRow() || SchemaConstants.isSystemKeyspace(metadata.keyspace))
+            return;
+
+        Row row = (Row) unfiltered;
+        for (ColumnMetadata column : row.columns())
+        {
+            if (!column.type.isCollection() || !column.type.isMultiCell())
+                continue;
+
+            ComplexColumnData cells = row.getComplexColumnData(column);
+            if (cells == null)
+                continue;
+
+            ComplexColumnData liveCells = cells.purge(DeletionPurger.PURGE_ALL, FBUtilities.nowInSeconds());
+            if (liveCells == null)
+                continue;
+
+            int cellsSize = liveCells.dataSize();
+            int cellsCount = liveCells.cellsCount();
+
+            if (!Guardrails.collectionSize.triggersOn(cellsSize, null) &&
+                !Guardrails.itemsPerCollection.triggersOn(cellsCount, null))
+                continue;
+
+            String keyString = metadata.primaryKeyAsCQLLiteral(partitionKey.getKey(), row.clustering());
+            String msg = String.format("%s in row %s in table %s",
+                                       column.name.toString(),
+                                       keyString,
+                                       metadata);
+            Guardrails.collectionSize.guard(cellsSize, msg, true, null);
+            Guardrails.itemsPerCollection.guard(cellsCount, msg, true, null);
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java
index ff0d791..c84782f 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigFormat.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.io.sstable.format.big;
 
 import java.util.Collection;
-import java.util.UUID;
 
 import org.apache.cassandra.io.sstable.SSTable;
 import org.apache.cassandra.schema.TableMetadata;
@@ -30,6 +29,7 @@
 import org.apache.cassandra.io.sstable.format.*;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Legacy bigtable format
@@ -79,10 +79,19 @@
     static class WriterFactory extends SSTableWriter.Factory
     {
         @Override
+        public long estimateSize(SSTableWriter.SSTableSizeParameters parameters)
+        {
+            return (long) ((parameters.partitionKeysSize() // index entries
+                            + parameters.partitionKeysSize() // keys in data file
+                            + parameters.dataSize()) // data
+                           * 1.2); // bloom filter and row index overhead
+        }
+
+        @Override
         public SSTableWriter open(Descriptor descriptor,
                                   long keyCount,
                                   long repairedAt,
-                                  UUID pendingRepair,
+                                  TimeUUID pendingRepair,
                                   boolean isTransient,
                                   TableMetadataRef metadata,
                                   MetadataCollector metadataCollector,
diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java
index dc13031..e0edd7a 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableReader.java
@@ -57,18 +57,18 @@
         super(builder);
     }
 
-    public UnfilteredRowIterator iterator(DecoratedKey key,
-                                          Slices slices,
-                                          ColumnFilter selectedColumns,
-                                          boolean reversed,
-                                          SSTableReadsListener listener)
+    public UnfilteredRowIterator rowIterator(DecoratedKey key,
+                                             Slices slices,
+                                             ColumnFilter selectedColumns,
+                                             boolean reversed,
+                                             SSTableReadsListener listener)
     {
         RowIndexEntry rie = getPosition(key, SSTableReader.Operator.EQ, listener);
-        return iterator(null, key, rie, slices, selectedColumns, reversed);
+        return rowIterator(null, key, rie, slices, selectedColumns, reversed);
     }
 
     @SuppressWarnings("resource")
-    public UnfilteredRowIterator iterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed)
+    public UnfilteredRowIterator rowIterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed)
     {
         if (indexEntry == null)
             return UnfilteredRowIterators.noRowsIterator(metadata(), key, Rows.EMPTY_STATIC_ROW, DeletionTime.LIVE, reversed);
@@ -78,7 +78,7 @@
     }
 
     @Override
-    public ISSTableScanner getScanner(ColumnFilter columns, DataRange dataRange, SSTableReadsListener listener)
+    public ISSTableScanner partitionIterator(ColumnFilter columns, DataRange dataRange, SSTableReadsListener listener)
     {
         return BigTableScanner.getScanner(this, columns, dataRange, listener);
     }
@@ -152,7 +152,7 @@
             if (!bf.isPresent((DecoratedKey)key))
             {
                 listener.onSSTableSkipped(this, SkippingReason.BLOOM_FILTER);
-                Tracing.trace("Bloom filter allows skipping sstable {}", descriptor.generation);
+                Tracing.trace("Bloom filter allows skipping sstable {}", descriptor.id);
                 bloomFilterTracker.addTrueNegative();
                 return null;
             }
@@ -168,7 +168,7 @@
                 // we do not need to track "true positive" for Bloom Filter here because it has been already tracked
                 // inside getCachedPosition method
                 listener.onSSTableSelected(this, cachedPosition, SelectionReason.KEY_CACHE_HIT);
-                Tracing.trace("Key cache hit for sstable {}", descriptor.generation);
+                Tracing.trace("Key cache hit for sstable {}", descriptor.id);
                 return cachedPosition;
             }
         }
@@ -197,7 +197,7 @@
             if (op == Operator.EQ && updateCacheAndStats)
                 bloomFilterTracker.addFalsePositive();
             listener.onSSTableSkipped(this, SkippingReason.MIN_MAX_KEYS);
-            Tracing.trace("Check against min and max keys allows skipping sstable {}", descriptor.generation);
+            Tracing.trace("Check against min and max keys allows skipping sstable {}", descriptor.id);
             return null;
         }
 
@@ -244,7 +244,7 @@
                         if (op == SSTableReader.Operator.EQ && updateCacheAndStats)
                             bloomFilterTracker.addFalsePositive();
                         listener.onSSTableSkipped(this, SkippingReason.PARTITION_INDEX_LOOKUP);
-                        Tracing.trace("Partition index lookup allows skipping sstable {}", descriptor.generation);
+                        Tracing.trace("Partition index lookup allows skipping sstable {}", descriptor.id);
                         return null;
                     }
                 }
@@ -275,7 +275,7 @@
                     if (op == Operator.EQ && updateCacheAndStats)
                         bloomFilterTracker.addTruePositive();
                     listener.onSSTableSelected(this, indexEntry, SelectionReason.INDEX_ENTRY_FOUND);
-                    Tracing.trace("Partition index with {} entries found for sstable {}", indexEntry.columnsIndexCount(), descriptor.generation);
+                    Tracing.trace("Partition index with {} entries found for sstable {}", indexEntry.columnsIndexCount(), descriptor.id);
                     return indexEntry;
                 }
 
@@ -291,7 +291,7 @@
         if (op == SSTableReader.Operator.EQ && updateCacheAndStats)
             bloomFilterTracker.addFalsePositive();
         listener.onSSTableSkipped(this, SkippingReason.INDEX_ENTRY_NOT_FOUND);
-        Tracing.trace("Partition index lookup complete (bloom filter false positive) for sstable {}", descriptor.generation);
+        Tracing.trace("Partition index lookup complete (bloom filter false positive) for sstable {}", descriptor.id);
         return null;
     }
 
diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java
index 20105cd..235b9b1 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableScanner.java
@@ -365,7 +365,7 @@
                             }
 
                             ClusteringIndexFilter filter = dataRange.clusteringIndexFilter(partitionKey());
-                            return sstable.iterator(dfile, partitionKey(), currentEntry, filter.getSlices(BigTableScanner.this.metadata()), columns, filter.isReversed());
+                            return sstable.rowIterator(dfile, partitionKey(), currentEntry, filter.getSlices(BigTableScanner.this.metadata()), columns, filter.isReversed());
                         }
                         catch (CorruptSSTableException | IOException e)
                         {
@@ -441,5 +441,10 @@
         {
             return null;
         }
+
+        public int getMinLocalDeletionTime()
+        {
+            return DeletionTime.LIVE.localDeletionTime();
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java
index eeb9153..e8dff32 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableWriter.java
@@ -17,13 +17,16 @@
  */
 package org.apache.cassandra.io.sstable.format.big;
 
-import java.io.*;
+
+import java.io.IOException;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.util.*;
+import java.util.stream.Stream;
 
 import org.apache.cassandra.db.compaction.OperationType;
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,8 +51,11 @@
 import org.apache.cassandra.schema.CompressionParams;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.utils.*;
+import org.apache.cassandra.utils.concurrent.SharedCloseableImpl;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class BigTableWriter extends SSTableWriter
 {
     private static final Logger logger = LoggerFactory.getLogger(BigTableWriter.class);
@@ -65,13 +71,13 @@
 
     private final SequentialWriterOption writerOption = SequentialWriterOption.newBuilder()
                                                         .trickleFsync(DatabaseDescriptor.getTrickleFsync())
-                                                        .trickleFsyncByteInterval(DatabaseDescriptor.getTrickleFsyncIntervalInKb() * 1024)
+                                                        .trickleFsyncByteInterval(DatabaseDescriptor.getTrickleFsyncIntervalInKiB() * 1024)
                                                         .build();
 
     public BigTableWriter(Descriptor descriptor,
                           long keyCount,
                           long repairedAt,
-                          UUID pendingRepair,
+                          TimeUUID pendingRepair,
                           boolean isTransient,
                           TableMetadataRef metadata,
                           MetadataCollector metadataCollector, 
@@ -231,6 +237,7 @@
             long endPosition = dataFile.position();
             long rowSize = endPosition - startPosition;
             maybeLogLargePartitionWarning(key, rowSize);
+            maybeLogManyTombstonesWarning(key, metadataCollector.totalTombstones);
             metadataCollector.addPartitionSizeInBytes(rowSize);
             afterAppend(key, endPosition, entry, columnIndexWriter.buffer());
             return entry;
@@ -259,6 +266,15 @@
         }
     }
 
+    private void maybeLogManyTombstonesWarning(DecoratedKey key, int tombstoneCount)
+    {
+        if (tombstoneCount > DatabaseDescriptor.getCompactionTombstoneWarningThreshold())
+        {
+            String keyString = metadata().partitionKeyType.getString(key.getKey());
+            logger.warn("Writing {} tombstones to {}/{}:{} in sstable {}", tombstoneCount, metadata.keyspace, metadata.name, keyString, getFilename());
+        }
+    }
+
     private static class StatsCollector extends Transformation
     {
         private final MetadataCollector collector;
@@ -324,32 +340,50 @@
         if (boundary == null)
             return null;
 
-        StatsMetadata stats = statsMetadata();
-        assert boundary.indexLength > 0 && boundary.dataLength > 0;
-        // open the reader early
-        IndexSummary indexSummary = iwriter.summary.build(metadata().partitioner, boundary);
-        long indexFileLength = new File(descriptor.filenameFor(Component.PRIMARY_INDEX)).length();
-        int indexBufferSize = optimizationStrategy.bufferSize(indexFileLength / indexSummary.size());
-        FileHandle ifile = iwriter.builder.bufferSize(indexBufferSize).complete(boundary.indexLength);
-        if (compression)
-            dbuilder.withCompressionMetadata(((CompressedSequentialWriter) dataFile).open(boundary.dataLength));
-        int dataBufferSize = optimizationStrategy.bufferSize(stats.estimatedPartitionSize.percentile(DatabaseDescriptor.getDiskOptimizationEstimatePercentile()));
-        FileHandle dfile = dbuilder.bufferSize(dataBufferSize).complete(boundary.dataLength);
-        invalidateCacheAtBoundary(dfile);
-        SSTableReader sstable = SSTableReader.internalOpen(descriptor,
-                                                           components, metadata,
-                                                           ifile, dfile,
-                                                           indexSummary,
-                                                           iwriter.bf.sharedCopy(), 
-                                                           maxDataAge, 
-                                                           stats, 
-                                                           SSTableReader.OpenReason.EARLY, 
-                                                           header);
+        IndexSummary indexSummary = null;
+        FileHandle ifile = null;
+        FileHandle dfile = null;
+        SSTableReader sstable = null;
 
-        // now it's open, find the ACTUAL last readable key (i.e. for which the data file has also been flushed)
-        sstable.first = getMinimalKey(first);
-        sstable.last = getMinimalKey(boundary.lastKey);
-        return sstable;
+        try
+        {
+            StatsMetadata stats = statsMetadata();
+            assert boundary.indexLength > 0 && boundary.dataLength > 0;
+            // open the reader early
+            indexSummary = iwriter.summary.build(metadata().partitioner, boundary);
+            long indexFileLength = new File(descriptor.filenameFor(Component.PRIMARY_INDEX)).length();
+            int indexBufferSize = optimizationStrategy.bufferSize(indexFileLength / indexSummary.size());
+            ifile = iwriter.builder.bufferSize(indexBufferSize).complete(boundary.indexLength);
+            if (compression)
+                dbuilder.withCompressionMetadata(((CompressedSequentialWriter) dataFile).open(boundary.dataLength));
+            int dataBufferSize = optimizationStrategy.bufferSize(stats.estimatedPartitionSize.percentile(DatabaseDescriptor.getDiskOptimizationEstimatePercentile()));
+            dfile = dbuilder.bufferSize(dataBufferSize).complete(boundary.dataLength);
+            invalidateCacheAtBoundary(dfile);
+            sstable = SSTableReader.internalOpen(descriptor,
+                                                 components, metadata,
+                                                 ifile, dfile,
+                                                 indexSummary,
+                                                 iwriter.bf.sharedCopy(),
+                                                 maxDataAge,
+                                                 stats,
+                                                 SSTableReader.OpenReason.EARLY,
+                                                 header);
+
+            // now it's open, find the ACTUAL last readable key (i.e. for which the data file has also been flushed)
+            sstable.first = getMinimalKey(first);
+            sstable.last = getMinimalKey(boundary.lastKey);
+            return sstable;
+        }
+        catch (Throwable t)
+        {
+            JVMStabilityInspector.inspectThrowable(t);
+            // If we successfully created our sstable, we can rely on its InstanceTidier to clean things up for us
+            if (sstable != null)
+                sstable.selfRef().release();
+            else
+                Stream.of(indexSummary, ifile, dfile).filter(Objects::nonNull).forEach(SharedCloseableImpl::close);
+            throw t;
+        }
     }
 
     void invalidateCacheAtBoundary(FileHandle dfile)
@@ -374,33 +408,51 @@
     private SSTableReader openFinal(SSTableReader.OpenReason openReason)
     {
         if (maxDataAge < 0)
-            maxDataAge = System.currentTimeMillis();
+            maxDataAge = currentTimeMillis();
 
-        StatsMetadata stats = statsMetadata();
-        // finalize in-memory state for the reader
-        IndexSummary indexSummary = iwriter.summary.build(metadata().partitioner);
-        long indexFileLength = new File(descriptor.filenameFor(Component.PRIMARY_INDEX)).length();
-        int dataBufferSize = optimizationStrategy.bufferSize(stats.estimatedPartitionSize.percentile(DatabaseDescriptor.getDiskOptimizationEstimatePercentile()));
-        int indexBufferSize = optimizationStrategy.bufferSize(indexFileLength / indexSummary.size());
-        FileHandle ifile = iwriter.builder.bufferSize(indexBufferSize).complete();
-        if (compression)
-            dbuilder.withCompressionMetadata(((CompressedSequentialWriter) dataFile).open(0));
-        FileHandle dfile = dbuilder.bufferSize(dataBufferSize).complete();
-        invalidateCacheAtBoundary(dfile);
-        SSTableReader sstable = SSTableReader.internalOpen(descriptor,
-                                                           components,
-                                                           metadata,
-                                                           ifile,
-                                                           dfile,
-                                                           indexSummary,
-                                                           iwriter.bf.sharedCopy(),
-                                                           maxDataAge,
-                                                           stats,
-                                                           openReason,
-                                                           header);
-        sstable.first = getMinimalKey(first);
-        sstable.last = getMinimalKey(last);
-        return sstable;
+        IndexSummary indexSummary = null;
+        FileHandle ifile = null;
+        FileHandle dfile = null;
+        SSTableReader sstable = null;
+
+        try
+        {
+            StatsMetadata stats = statsMetadata();
+            // finalize in-memory state for the reader
+            indexSummary = iwriter.summary.build(metadata().partitioner);
+            long indexFileLength = new File(descriptor.filenameFor(Component.PRIMARY_INDEX)).length();
+            int dataBufferSize = optimizationStrategy.bufferSize(stats.estimatedPartitionSize.percentile(DatabaseDescriptor.getDiskOptimizationEstimatePercentile()));
+            int indexBufferSize = optimizationStrategy.bufferSize(indexFileLength / indexSummary.size());
+            ifile = iwriter.builder.bufferSize(indexBufferSize).complete();
+            if (compression)
+                dbuilder.withCompressionMetadata(((CompressedSequentialWriter) dataFile).open(0));
+            dfile = dbuilder.bufferSize(dataBufferSize).complete();
+            invalidateCacheAtBoundary(dfile);
+            sstable = SSTableReader.internalOpen(descriptor,
+                                                 components,
+                                                 metadata,
+                                                 ifile,
+                                                 dfile,
+                                                 indexSummary,
+                                                 iwriter.bf.sharedCopy(),
+                                                 maxDataAge,
+                                                 stats,
+                                                 openReason,
+                                                 header);
+            sstable.first = getMinimalKey(first);
+            sstable.last = getMinimalKey(last);
+            return sstable;
+        }
+        catch (Throwable t)
+        {
+            JVMStabilityInspector.inspectThrowable(t);
+            // If we successfully created our sstable, we can rely on its InstanceTidier to clean things up for us
+            if (sstable != null)
+                sstable.selfRef().release();
+            else
+                Stream.of(indexSummary, ifile, dfile).filter(Objects::nonNull).forEach(SharedCloseableImpl::close);
+            throw t;
+        }
     }
 
     protected SSTableWriter.TransactionalProxy txnProxy()
@@ -458,7 +510,7 @@
         }
         catch (IOException e)
         {
-            throw new FSWriteError(e, file.getPath());
+            throw new FSWriteError(e, file.path());
         }
     }
 
@@ -535,13 +587,12 @@
             if (components.contains(Component.FILTER))
             {
                 String path = descriptor.filenameFor(Component.FILTER);
-                try (FileOutputStream fos = new FileOutputStream(path);
-                     DataOutputStreamPlus stream = new BufferedDataOutputStreamPlus(fos))
+                try (FileOutputStreamPlus stream = new FileOutputStreamPlus(path))
                 {
                     // bloom filter
                     BloomFilterSerializer.serialize((BloomFilter) bf, stream);
                     stream.flush();
-                    SyncUtil.sync(fos);
+                    stream.sync();
                 }
                 catch (IOException e)
                 {
@@ -587,7 +638,7 @@
 
         protected Throwable doAbort(Throwable accumulate)
         {
-            return indexFile.abort(accumulate);
+            return summary.close(indexFile.abort(accumulate));
         }
 
         @Override
diff --git a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriter.java b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriter.java
index 2564e96..f640349 100644
--- a/src/java/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriter.java
+++ b/src/java/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriter.java
@@ -18,8 +18,8 @@
 package org.apache.cassandra.io.sstable.format.big;
 
 import java.io.EOFException;
-import java.io.File;
 import java.io.IOException;
+import java.nio.channels.ClosedChannelException;
 import java.util.Collection;
 import java.util.EnumMap;
 import java.util.Map;
@@ -28,6 +28,7 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import org.apache.cassandra.db.lifecycle.LifecycleNewTracker;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -202,7 +203,7 @@
             writer.close();
     }
 
-    public void writeComponent(Component.Type type, DataInputPlus in, long size)
+    public void writeComponent(Component.Type type, DataInputPlus in, long size) throws ClosedChannelException
     {
         logger.info("Writing component {} to {} length {}", type, componentWriters.get(type).getPath(), prettyPrintMemory(size));
 
@@ -212,7 +213,7 @@
             write(in, size, componentWriters.get(type));
     }
 
-    private void write(AsyncStreamingInputPlus in, long size, SequentialWriter writer)
+    private void write(AsyncStreamingInputPlus in, long size, SequentialWriter writer) throws ClosedChannelException
     {
         logger.info("Block Writing component to {} length {}", writer.getPath(), prettyPrintMemory(size));
 
@@ -221,14 +222,20 @@
             in.consume(writer::writeDirectlyToChannel, size);
             writer.sync();
         }
-        // FIXME: handle ACIP exceptions properly
-        catch (EOFException | AsyncStreamingInputPlus.InputTimeoutException e)
+        catch (EOFException e)
         {
             in.close();
         }
+        catch (ClosedChannelException e)
+        {
+            // FSWriteError triggers disk failure policy, but if we get a connection issue we do not want to do that
+            // so rethrow so the error handling logic higher up is able to deal with this
+            // see CASSANDRA-17116
+            throw e;
+        }
         catch (IOException e)
         {
             throw new FSWriteError(e, writer.getPath());
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataSerializer.java b/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataSerializer.java
index fc1ce42..ff1e604 100644
--- a/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataSerializer.java
+++ b/src/java/org/apache/cassandra/io/sstable/metadata/IMetadataSerializer.java
@@ -20,13 +20,13 @@
 import java.io.IOException;
 import java.util.EnumSet;
 import java.util.Map;
-import java.util.UUID;
 import java.util.function.UnaryOperator;
 
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Interface for SSTable metadata serializer
@@ -94,7 +94,7 @@
      * NOTE: mutating stats metadata of a live sstable will race with entire-sstable-streaming, please use
      * {@link SSTableReader#mutateLevelAndReload} instead on live sstable.
      */
-    public void mutateRepairMetadata(Descriptor descriptor, long newRepairedAt, UUID newPendingRepair, boolean isTransient) throws IOException;
+    public void mutateRepairMetadata(Descriptor descriptor, long newRepairedAt, TimeUUID newPendingRepair, boolean isTransient) throws IOException;
 
     /**
      * Replace the sstable metadata file ({@code -Statistics.db}) with the given components.
diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java
old mode 100755
new mode 100644
index be824ef..1375331
--- a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java
+++ b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataCollector.java
@@ -39,7 +39,9 @@
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.EstimatedHistogram;
+import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MurmurHash;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.streamhist.TombstoneHistogram;
 import org.apache.cassandra.utils.streamhist.StreamingTombstoneHistogramBuilder;
 
@@ -105,6 +107,7 @@
     protected boolean hasLegacyCounterShards = false;
     protected long totalColumnsSet;
     protected long totalRows;
+    public int totalTombstones;
 
     /**
      * Default cardinality estimation method is to use HyperLogLog++.
@@ -114,6 +117,7 @@
      */
     protected ICardinality cardinality = new HyperLogLogPlus(13, 25);
     private final ClusteringComparator comparator;
+    private final int nowInSec = FBUtilities.nowInSeconds();
 
     private final UUID originatingHostId;
 
@@ -149,6 +153,7 @@
     {
         long hashed = MurmurHash.hash2_64(key, key.position(), key.remaining(), 0);
         cardinality.offerHashed(hashed);
+        totalTombstones = 0;
         return this;
     }
 
@@ -182,6 +187,8 @@
         updateTimestamp(newInfo.timestamp());
         updateTTL(newInfo.ttl());
         updateLocalDeletionTime(newInfo.localExpirationTime());
+        if (!newInfo.isLive(nowInSec))
+            updateTombstoneCount();
     }
 
     public void update(Cell<?> cell)
@@ -189,6 +196,8 @@
         updateTimestamp(cell.timestamp());
         updateTTL(cell.ttl());
         updateLocalDeletionTime(cell.localDeletionTime());
+        if (!cell.isLive(nowInSec))
+            updateTombstoneCount();
     }
 
     public void update(DeletionTime dt)
@@ -197,6 +206,7 @@
         {
             updateTimestamp(dt.markedForDeleteAt());
             updateLocalDeletionTime(dt.localDeletionTime());
+            updateTombstoneCount();
         }
     }
 
@@ -218,6 +228,11 @@
             estimatedTombstoneDropTime.update(newLocalDeletionTime);
     }
 
+    private void updateTombstoneCount()
+    {
+        ++totalTombstones;
+    }
+
     private void updateTTL(int newTTL)
     {
         ttlTracker.update(newTTL);
@@ -247,7 +262,7 @@
         this.hasLegacyCounterShards = this.hasLegacyCounterShards || hasLegacyCounterShards;
     }
 
-    public Map<MetadataType, MetadataComponent> finalizeMetadata(String partitioner, double bloomFilterFPChance, long repairedAt, UUID pendingRepair, boolean isTransient, SerializationHeader header)
+    public Map<MetadataType, MetadataComponent> finalizeMetadata(String partitioner, double bloomFilterFPChance, long repairedAt, TimeUUID pendingRepair, boolean isTransient, SerializationHeader header)
     {
         Preconditions.checkState((minClustering == null && maxClustering == null)
                                  || comparator.compare(maxClustering, minClustering) >= 0);
diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
index 042103e..f13daa4 100644
--- a/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
+++ b/src/java/org/apache/cassandra/io/sstable/metadata/MetadataSerializer.java
@@ -17,7 +17,10 @@
  */
 package org.apache.cassandra.io.sstable.metadata;
 
-import java.io.*;
+import org.apache.cassandra.io.util.*;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
 import java.util.*;
 import java.util.function.UnaryOperator;
 import java.util.zip.CRC32;
@@ -33,15 +36,7 @@
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.format.Version;
-import org.apache.cassandra.io.util.DataInputBuffer;
-import org.apache.cassandra.io.util.DataOutputBuffer;
-import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.io.util.FileDataInput;
-import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
-import org.apache.cassandra.io.util.RandomAccessReader;
-import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.utils.FBUtilities.updateChecksumInt;
 
@@ -242,7 +237,7 @@
     }
 
     @Override
-    public void mutateRepairMetadata(Descriptor descriptor, long newRepairedAt, UUID newPendingRepair, boolean isTransient) throws IOException
+    public void mutateRepairMetadata(Descriptor descriptor, long newRepairedAt, TimeUUID newPendingRepair, boolean isTransient) throws IOException
     {
         if (logger.isTraceEnabled())
             logger.trace("Mutating {} to repairedAt time {} and pendingRepair {}",
@@ -263,7 +258,7 @@
     public void rewriteSSTableMetadata(Descriptor descriptor, Map<MetadataType, MetadataComponent> currentComponents) throws IOException
     {
         String filePath = descriptor.tmpFilenameFor(Component.STATS);
-        try (DataOutputStreamPlus out = new BufferedDataOutputStreamPlus(new FileOutputStream(filePath)))
+        try (DataOutputStreamPlus out = new FileOutputStreamPlus(filePath))
         {
             serialize(currentComponents, out, descriptor.version);
             out.flush();
@@ -273,10 +268,6 @@
             Throwables.throwIfInstanceOf(e, FileNotFoundException.class);
             throw new FSWriteError(e, filePath);
         }
-        // we cant move a file on top of another file in windows:
-        if (FBUtilities.isWindows)
-            FileUtils.delete(descriptor.filenameFor(Component.STATS));
         FileUtils.renameWithConfirm(filePath, descriptor.filenameFor(Component.STATS));
-
     }
 }
diff --git a/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java b/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java
old mode 100755
new mode 100644
index 69ca455..ee5505f
--- a/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java
+++ b/src/java/org/apache/cassandra/io/sstable/metadata/StatsMetadata.java
@@ -36,12 +36,11 @@
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.EstimatedHistogram;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.streamhist.TombstoneHistogram;
 import org.apache.cassandra.utils.UUIDSerializer;
-import org.apache.cassandra.utils.UUIDSerializer;
 
 /**
  * SSTable metadata that always stay on heap.
@@ -70,7 +69,7 @@
     public final long totalColumnsSet;
     public final long totalRows;
     public final UUID originatingHostId;
-    public final UUID pendingRepair;
+    public final TimeUUID pendingRepair;
     public final boolean isTransient;
     // just holds the current encoding stats to avoid allocating - it is not serialized
     public final EncodingStats encodingStats;
@@ -94,7 +93,7 @@
                          long totalColumnsSet,
                          long totalRows,
                          UUID originatingHostId,
-                         UUID pendingRepair,
+                         TimeUUID pendingRepair,
                          boolean isTransient)
     {
         this.estimatedPartitionSize = estimatedPartitionSize;
@@ -175,7 +174,7 @@
                                  isTransient);
     }
 
-    public StatsMetadata mutateRepairedMetadata(long newRepairedAt, UUID newPendingRepair, boolean newIsTransient)
+    public StatsMetadata mutateRepairedMetadata(long newRepairedAt, TimeUUID newPendingRepair, boolean newIsTransient)
     {
         return new StatsMetadata(estimatedPartitionSize,
                                  estimatedCellPerPartitionCount,
@@ -290,7 +289,7 @@
             {
                 size += 1;
                 if (component.pendingRepair != null)
-                    size += UUIDSerializer.serializer.serializedSize(component.pendingRepair, 0);
+                    size += TimeUUID.sizeInBytes();
             }
 
             if (version.hasIsTransient())
@@ -344,7 +343,7 @@
                 if (component.pendingRepair != null)
                 {
                     out.writeByte(1);
-                    UUIDSerializer.serializer.serialize(component.pendingRepair, out, 0);
+                    component.pendingRepair.serialize(out);
                 }
                 else
                 {
@@ -441,10 +440,10 @@
             else
                 commitLogIntervals = new IntervalSet<CommitLogPosition>(commitLogLowerBound, commitLogUpperBound);
 
-            UUID pendingRepair = null;
+            TimeUUID pendingRepair = null;
             if (version.hasPendingRepair() && in.readByte() != 0)
             {
-                pendingRepair = UUIDSerializer.serializer.deserialize(in, 0);
+                pendingRepair = TimeUUID.deserialize(in);
             }
 
             boolean isTransient = version.hasIsTransient() && in.readBoolean();
diff --git a/src/java/org/apache/cassandra/io/util/AbstractReaderFileProxy.java b/src/java/org/apache/cassandra/io/util/AbstractReaderFileProxy.java
index 7962c0f..a8b61dd 100644
--- a/src/java/org/apache/cassandra/io/util/AbstractReaderFileProxy.java
+++ b/src/java/org/apache/cassandra/io/util/AbstractReaderFileProxy.java
@@ -58,4 +58,4 @@
     {
         return 0; // Only valid for compressed files.
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java b/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java
index 7d1e91d..4e9bbb5 100644
--- a/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java
+++ b/src/java/org/apache/cassandra/io/util/BufferedDataOutputStreamPlus.java
@@ -17,19 +17,17 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
 import java.nio.channels.WritableByteChannel;
 
+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 org.apache.cassandra.utils.memory.MemoryUtil;
 
 /**
  * An implementation of the DataOutputStreamPlus interface using a ByteBuffer to stage writes
@@ -43,26 +41,6 @@
 
     protected ByteBuffer buffer;
 
-    public BufferedDataOutputStreamPlus(RandomAccessFile ras)
-    {
-        this(ras.getChannel());
-    }
-
-    public BufferedDataOutputStreamPlus(RandomAccessFile ras, int bufferSize)
-    {
-        this(ras.getChannel(), bufferSize);
-    }
-
-    public BufferedDataOutputStreamPlus(FileOutputStream fos)
-    {
-        this(fos.getChannel());
-    }
-
-    public BufferedDataOutputStreamPlus(FileOutputStream fos, int bufferSize)
-    {
-        this(fos.getChannel(), bufferSize);
-    }
-
     public BufferedDataOutputStreamPlus(WritableByteChannel wbc)
     {
         this(wbc, DEFAULT_BUFFER_SIZE);
@@ -75,7 +53,8 @@
         Preconditions.checkArgument(bufferSize >= 8, "Buffer size must be large enough to accommodate a long/double");
     }
 
-    protected BufferedDataOutputStreamPlus(WritableByteChannel channel, ByteBuffer buffer)
+    @VisibleForTesting
+    public BufferedDataOutputStreamPlus(WritableByteChannel channel, ByteBuffer buffer)
     {
         super(channel);
         this.buffer = buffer;
@@ -169,6 +148,21 @@
     }
 
     @Override
+    public void writeBytes(long register, int bytes) throws IOException
+    {
+        if (buffer.remaining() < Long.BYTES)
+        {
+            super.writeBytes(register, bytes);
+        }
+        else
+        {
+            int pos = buffer.position();
+            buffer.putLong(pos, register);
+            buffer.position(pos + bytes);
+        }
+    }
+
+    @Override
     public void writeShort(int v) throws IOException
     {
         writeChar(v);
@@ -266,6 +260,9 @@
     @Override
     public void close() throws IOException
     {
+        if (buffer == null)
+            return;
+
         doFlush(0);
         channel.close();
         FileUtils.clean(buffer);
diff --git a/src/java/org/apache/cassandra/io/util/ChannelProxy.java b/src/java/org/apache/cassandra/io/util/ChannelProxy.java
index 9ff46b7..717def7 100644
--- a/src/java/org/apache/cassandra/io/util/ChannelProxy.java
+++ b/src/java/org/apache/cassandra/io/util/ChannelProxy.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.MappedByteBuffer;
@@ -63,7 +62,7 @@
 
     public ChannelProxy(File file)
     {
-        this(file.getPath(), openChannel(file));
+        this(file.path(), openChannel(file));
     }
 
     public ChannelProxy(String filePath, FileChannel channel)
diff --git a/src/java/org/apache/cassandra/io/util/ChecksumWriter.java b/src/java/org/apache/cassandra/io/util/ChecksumWriter.java
index 50aaccb..194602c 100644
--- a/src/java/org/apache/cassandra/io/util/ChecksumWriter.java
+++ b/src/java/org/apache/cassandra/io/util/ChecksumWriter.java
@@ -18,7 +18,9 @@
 
 package org.apache.cassandra.io.util;
 
-import java.io.*;
+import java.io.DataOutput;
+import java.io.IOError;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.zip.CRC32;
@@ -88,12 +90,11 @@
 
     public void writeFullChecksum(@Nonnull File digestFile)
     {
-        try (FileOutputStream fos = new FileOutputStream(digestFile);
-             DataOutputStream out = new DataOutputStream(new BufferedOutputStream(fos)))
+        try (FileOutputStreamPlus fos = new FileOutputStreamPlus(digestFile))
         {
-            out.write(String.valueOf(fullChecksum.getValue()).getBytes(StandardCharsets.UTF_8));
-            out.flush();
-            fos.getFD().sync();
+            fos.write(String.valueOf(fullChecksum.getValue()).getBytes(StandardCharsets.UTF_8));
+            fos.flush();
+            fos.getChannel().force(true);
         }
         catch (IOException e)
         {
diff --git a/src/java/org/apache/cassandra/io/util/ChecksummedRandomAccessReader.java b/src/java/org/apache/cassandra/io/util/ChecksummedRandomAccessReader.java
index 2e59e3b..62927f5 100644
--- a/src/java/org/apache/cassandra/io/util/ChecksummedRandomAccessReader.java
+++ b/src/java/org/apache/cassandra/io/util/ChecksummedRandomAccessReader.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
 
 import org.apache.cassandra.utils.ChecksumType;
@@ -32,7 +31,7 @@
         {
             DataIntegrityMetadata.ChecksumValidator validator = new DataIntegrityMetadata.ChecksumValidator(ChecksumType.CRC32,
                                                                                                             RandomAccessReader.open(crcFile),
-                                                                                                            file.getPath());
+                                                                                                            file.path());
             Rebufferer rebufferer = new ChecksummedRebufferer(channel, validator);
             return new RandomAccessReader.RandomAccessReaderWithOwnChannel(rebufferer);
         }
diff --git a/src/java/org/apache/cassandra/io/util/ChecksummedSequentialWriter.java b/src/java/org/apache/cassandra/io/util/ChecksummedSequentialWriter.java
index f89e7cc..fa8fad7 100644
--- a/src/java/org/apache/cassandra/io/util/ChecksummedSequentialWriter.java
+++ b/src/java/org/apache/cassandra/io/util/ChecksummedSequentialWriter.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.Optional;
 
diff --git a/src/java/org/apache/cassandra/io/util/ChunkReader.java b/src/java/org/apache/cassandra/io/util/ChunkReader.java
index 1d3439e..33bf792 100644
--- a/src/java/org/apache/cassandra/io/util/ChunkReader.java
+++ b/src/java/org/apache/cassandra/io/util/ChunkReader.java
@@ -48,4 +48,4 @@
      * This is not guaranteed to be fulfilled.
      */
     BufferType preferredBufferType();
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/util/DataInputPlus.java b/src/java/org/apache/cassandra/io/util/DataInputPlus.java
index 7c29ee1..bda8461 100644
--- a/src/java/org/apache/cassandra/io/util/DataInputPlus.java
+++ b/src/java/org/apache/cassandra/io/util/DataInputPlus.java
@@ -19,11 +19,15 @@
 
 import java.io.*;
 
+import org.apache.cassandra.utils.Shared;
 import org.apache.cassandra.utils.vint.VIntCoding;
 
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
 /**
  * Extension to DataInput that provides support for reading varints
  */
+@Shared(scope = SIMULATION)
 public interface DataInputPlus extends DataInput
 {
     default long readVInt() throws IOException
@@ -60,6 +64,8 @@
 
     /**
      * Wrapper around an InputStream that provides no buffering but can decode varints
+     *
+     * TODO: probably shouldn't use DataInputStream as a parent
      */
     public class DataInputStreamPlus extends DataInputStream implements DataInputPlus
     {
diff --git a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java
index 277b359..65d4e58 100644
--- a/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java
+++ b/src/java/org/apache/cassandra/io/util/DataIntegrityMetadata.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.io.util;
 
 import java.io.Closeable;
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.zip.CheckedInputStream;
diff --git a/src/java/org/apache/cassandra/io/util/DataOutputPlus.java b/src/java/org/apache/cassandra/io/util/DataOutputPlus.java
index b94d097..205dab7 100644
--- a/src/java/org/apache/cassandra/io/util/DataOutputPlus.java
+++ b/src/java/org/apache/cassandra/io/util/DataOutputPlus.java
@@ -21,18 +21,22 @@
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
+import org.apache.cassandra.utils.Shared;
 import org.apache.cassandra.utils.vint.VIntCoding;
 
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
 /**
  * Extension to DataOutput that provides for writing ByteBuffer and Memory, potentially with an efficient
  * implementation that is zero copy or at least has reduced bounds checking overhead.
  */
+@Shared(scope = SIMULATION)
 public interface DataOutputPlus extends DataOutput
 {
     // write the buffer without modifying its position
     void write(ByteBuffer buffer) throws IOException;
 
-    default void write(Memory memory, long offset, long length) throws IOException
+    default void write(ReadableMemory memory, long offset, long length) throws IOException
     {
         for (ByteBuffer buffer : memory.asByteBuffers(offset, length))
             write(buffer);
@@ -56,6 +60,54 @@
     }
 
     /**
+     * An efficient way to write the type {@code bytes} of a long
+     *
+     * @param register - the long value to be written
+     * @param bytes - the number of bytes the register occupies. Valid values are between 1 and 8 inclusive.
+     * @throws IOException
+     */
+    default void writeBytes(long register, int bytes) throws IOException
+    {
+        switch (bytes)
+        {
+            case 0:
+                break;
+            case 1:
+                writeByte((int)(register >>> 56));
+                break;
+            case 2:
+                writeShort((int)(register >> 48));
+                break;
+            case 3:
+                writeShort((int)(register >> 48));
+                writeByte((int)(register >> 40));
+                break;
+            case 4:
+                writeInt((int)(register >> 32));
+                break;
+            case 5:
+                writeInt((int)(register >> 32));
+                writeByte((int)(register >> 24));
+                break;
+            case 6:
+                writeInt((int)(register >> 32));
+                writeShort((int)(register >> 16));
+                break;
+            case 7:
+                writeInt((int)(register >> 32));
+                writeShort((int)(register >> 16));
+                writeByte((int)(register >> 8));
+                break;
+            case 8:
+                writeLong(register);
+                break;
+            default:
+                throw new IllegalArgumentException();
+        }
+
+    }
+
+    /**
      * Returns the current position of the underlying target like a file-pointer
      * or the position withing a buffer. Not every implementation may support this
      * functionality. Whether or not this functionality is supported can be checked
diff --git a/src/java/org/apache/cassandra/io/util/File.java b/src/java/org/apache/cassandra/io/util/File.java
new file mode 100644
index 0000000..1f48707
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/util/File.java
@@ -0,0 +1,775 @@
+/*
+ * 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.io.util;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.net.URI;
+import java.nio.channels.FileChannel;
+import java.nio.file.*; // checkstyle: permit this import
+import java.util.Objects;
+import java.util.function.BiPredicate;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.IntFunction;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+
+import com.google.common.util.concurrent.RateLimiter;
+
+import net.openhft.chronicle.core.util.ThrowingFunction;
+import org.apache.cassandra.io.FSWriteError;
+
+import static org.apache.cassandra.io.util.PathUtils.filename;
+import static org.apache.cassandra.utils.Throwables.maybeFail;
+
+/**
+ * A thin wrapper around java.nio.file.Path to provide more ergonomic functionality.
+ *
+ * TODO codebase probably should not use tryList, as unexpected exceptions are hidden;
+ *      probably want to introduce e.g. listIfExists
+ */
+public class File implements Comparable<File>
+{
+    private static FileSystem filesystem = FileSystems.getDefault();
+
+    public enum WriteMode { OVERWRITE, APPEND }
+
+    public static String pathSeparator()
+    {
+        return filesystem.getSeparator();
+    }
+
+    @Nullable final Path path; // nullable to support concept of empty path, that resolves to the working directory if converted to an absolute path
+
+    /**
+     * Construct a File representing the child {@code child} of {@code parent}
+     */
+    public File(String parent, String child)
+    {
+        this(parent.isEmpty() ? null : filesystem.getPath(parent), child);
+    }
+
+    /**
+     * Construct a File representing the child {@code child} of {@code parent}
+     */
+    public File(File parent, String child)
+    {
+        this(parent.path, child);
+    }
+
+    /**
+     * Construct a File representing the child {@code child} of {@code parent}
+     */
+    public File(Path parent, String child)
+    {
+        // if "empty abstract path" (a la java.io.File) is provided, we should behave as though resolving relative path
+        if (child.startsWith(pathSeparator()))
+            child = child.substring(pathSeparator().length());
+        this.path = parent == null ? filesystem.getPath(child) : parent.resolve(child);
+    }
+
+    /**
+     * Construct a File representing the provided {@code path}
+     */
+    public File(String path)
+    {
+        this(path.isEmpty() ? null : filesystem.getPath(path));
+    }
+
+    /**
+     * Create a File equivalent to the java.io.File provided
+     */
+    public File(java.io.File file)
+    {
+        this(file.getPath().isEmpty() ? null : file.toPath());
+    }
+
+    /**
+     * Construct a File representing the child {@code child} of {@code parent}
+     */
+    public File(java.io.File parent, String child)
+    {
+        this(new File(parent), child);
+    }
+
+    /**
+     * Convenience constructor equivalent to {@code new File(Paths.get(path))}
+     */
+    public File(URI path)
+    {
+        this(Paths.get(path)); //TODO unsafe if uri is file:// as it uses default file system and not File.filesystem
+        if (!path.isAbsolute() || path.isOpaque()) throw new IllegalArgumentException();
+    }
+
+    /**
+     * @param path the path to wrap
+     */
+    public File(Path path)
+    {
+        if (path != null && path.getFileSystem() != filesystem)
+            throw new IllegalArgumentException("Incompatible file system");
+
+        this.path = path;
+    }
+
+
+    public static Path getPath(String first, String... more)
+    {
+        return filesystem.getPath(first, more);
+    }
+
+    /**
+     * Try to delete the file, returning true iff it was deleted by us. Does not ordinarily throw exceptions.
+     */
+    public boolean tryDelete()
+    {
+        return path != null && PathUtils.tryDelete(path);
+    }
+
+    /**
+     * This file will be deleted, and any exceptions encountered merged with {@code accumulate} to the return value
+     */
+    public Throwable delete(Throwable accumulate)
+    {
+        return delete(accumulate, null);
+    }
+
+    /**
+     * This file will be deleted, obeying the provided rate limiter.
+     * Any exceptions encountered will be merged with {@code accumulate} to the return value
+     */
+    public Throwable delete(Throwable accumulate, RateLimiter rateLimiter)
+    {
+        return PathUtils.delete(toPathForWrite(), accumulate, rateLimiter);
+    }
+
+    /**
+     * This file will be deleted, with any failures being reported with an FSError
+     * @throws FSWriteError if cannot be deleted
+     */
+    public void delete()
+    {
+        maybeFail(delete(null, null));
+    }
+
+    /**
+     * This file will be deleted, with any failures being reported with an FSError
+     * @throws FSWriteError if cannot be deleted
+     */
+    public void deleteIfExists()
+    {
+        if (path != null)
+            PathUtils.deleteIfExists(path);
+    }
+
+    /**
+     * This file will be deleted, obeying the provided rate limiter.
+     * @throws FSWriteError if cannot be deleted
+     */
+    public void delete(RateLimiter rateLimiter)
+    {
+        maybeFail(delete(null, rateLimiter));
+    }
+
+    /**
+     * Deletes all files and subdirectories under "dir".
+     * @throws FSWriteError if any part of the tree cannot be deleted
+     */
+    public void deleteRecursive(RateLimiter rateLimiter)
+    {
+        PathUtils.deleteRecursive(toPathForWrite(), rateLimiter);
+    }
+
+    /**
+     * Deletes all files and subdirectories under "dir".
+     * @throws FSWriteError if any part of the tree cannot be deleted
+     */
+    public void deleteRecursive()
+    {
+        PathUtils.deleteRecursive(toPathForWrite());
+    }
+
+    /**
+     * Try to delete the file on process exit.
+     */
+    public void deleteOnExit()
+    {
+        if (path != null) PathUtils.deleteOnExit(path);
+    }
+
+    /**
+     * This file will be deleted on clean shutdown; if it is a directory, its entire contents
+     * <i>at the time of shutdown</i> will be deleted
+     */
+    public void deleteRecursiveOnExit()
+    {
+        if (path != null)
+            PathUtils.deleteRecursiveOnExit(path);
+    }
+
+    /**
+     * Try to rename the file atomically, if the system supports it.
+     * @return true iff successful, false if it fails for any reason.
+     */
+    public boolean tryMove(File to)
+    {
+        return path != null && PathUtils.tryRename(path, to.path);
+    }
+
+    /**
+     * Atomically (if supported) rename/move this file to {@code to}
+     * @throws FSWriteError if any part of the tree cannot be deleted
+     */
+    public void move(File to)
+    {
+        PathUtils.rename(toPathForRead(), to.toPathForWrite());
+    }
+
+    /**
+     * @return the length of the file if it exists and if we can read it; 0 otherwise.
+     */
+    public long length()
+    {
+        return path == null ? 0L : PathUtils.tryGetLength(path);
+    }
+
+    /**
+     * @return the last modified time in millis of the path if it exists and we can read it; 0 otherwise.
+     */
+    public long lastModified()
+    {
+        return path == null ? 0L : PathUtils.tryGetLastModified(path);
+    }
+
+    /**
+     * Try to set the last modified time in millis of the path
+     * @return true if it exists and we can write it; return false otherwise.
+     */
+    public boolean trySetLastModified(long value)
+    {
+        return path != null && PathUtils.trySetLastModified(path, value);
+    }
+
+    /**
+     * Try to set if the path is readable by its owner
+     * @return true if it exists and we can write it; return false otherwise.
+     */
+    public boolean trySetReadable(boolean value)
+    {
+        return path != null && PathUtils.trySetReadable(path, value);
+    }
+
+    /**
+     * Try to set if the path is writable by its owner
+     * @return true if it exists and we can write it; return false otherwise.
+     */
+    public boolean trySetWritable(boolean value)
+    {
+        return path != null && PathUtils.trySetWritable(path, value);
+    }
+
+    /**
+     * Try to set if the path is executable by its owner
+     * @return true if it exists and we can write it; return false otherwise.
+     */
+    public boolean trySetExecutable(boolean value)
+    {
+        return path != null && PathUtils.trySetExecutable(path, value);
+    }
+
+    /**
+     * @return true if the path exists, false if it does not, or we cannot determine due to some exception
+     */
+    public boolean exists()
+    {
+        return path != null && PathUtils.exists(path);
+    }
+
+    /**
+     * @return true if the path refers to a directory
+     */
+    public boolean isDirectory()
+    {
+        return path != null && PathUtils.isDirectory(path);
+    }
+
+    /**
+     * @return true if the path refers to a regular file
+     */
+    public boolean isFile()
+    {
+        return path != null && PathUtils.isFile(path);
+    }
+
+    /**
+     * @return true if the path can be read by us
+     */
+    public boolean isReadable()
+    {
+        return path != null && Files.isReadable(path);
+    }
+
+    /**
+     * @return true if the path can be written by us
+     */
+    public boolean isWritable()
+    {
+        return path != null && Files.isWritable(path);
+    }
+
+    /**
+     * @return true if the path can be executed by us
+     */
+    public boolean isExecutable()
+    {
+        return path != null && Files.isExecutable(path);
+    }
+
+    /**
+     * Try to create a new regular file at this path.
+     * @return true if successful, false if it already exists
+     */
+    public boolean createFileIfNotExists()
+    {
+        return PathUtils.createFileIfNotExists(toPathForWrite());
+    }
+
+    public boolean createDirectoriesIfNotExists()
+    {
+        return PathUtils.createDirectoriesIfNotExists(toPathForWrite());
+    }
+
+    /**
+     * Try to create a directory at this path.
+     * Return true if a new directory was created at this path, and false otherwise.
+     */
+    public boolean tryCreateDirectory()
+    {
+        return path != null && PathUtils.tryCreateDirectory(path);
+    }
+
+    /**
+     * Try to create a directory at this path, creating any parent directories as necessary.
+     * @return true if a new directory was created at this path, and false otherwise.
+     */
+    public boolean tryCreateDirectories()
+    {
+        return path != null && PathUtils.tryCreateDirectories(path);
+    }
+
+    /**
+     * @return the parent file, or null if none
+     */
+    public File parent()
+    {
+        if (path == null) return null;
+        Path parent = path.getParent();
+        if (parent == null) return null;
+        return new File(parent);
+    }
+
+    /**
+     * @return the parent file's path, or null if none
+     */
+    public String parentPath()
+    {
+        File parent = parent();
+        return parent == null ? null : parent.toString();
+    }
+
+    /**
+     * @return true if the path has no relative path elements
+     */
+    public boolean isAbsolute()
+    {
+        return path != null && path.isAbsolute();
+    }
+
+    public boolean isAncestorOf(File child)
+    {
+        return PathUtils.isContained(toPath(), child.toPath());
+    }
+
+    /**
+     * @return a File that represents the same path as this File with any relative path elements resolved.
+     *         If this is the empty File, returns the working directory.
+     */
+    public File toAbsolute()
+    {
+        return new File(toPath().toAbsolutePath());
+    }
+
+    /** {@link #toAbsolute} */
+    public String absolutePath()
+    {
+        return toPath().toAbsolutePath().toString();
+    }
+
+    /**
+     * @return a File that represents the same path as this File with any relative path elements and links resolved.
+     *         If this is the empty File, returns the working directory.
+     */
+    public File toCanonical()
+    {
+        Path canonical = PathUtils.toCanonicalPath(toPath());
+        return canonical == path ? this : new File(canonical);
+    }
+
+    /** {@link #toCanonical} */
+    public String canonicalPath()
+    {
+        return toCanonical().toString();
+    }
+
+    /**
+     * @return the last path element for this file
+     */
+    public String name()
+    {
+        return path == null ? "" : filename(path);
+    }
+
+    public void forEach(Consumer<File> forEach)
+    {
+        PathUtils.forEach(path, path -> forEach.accept(new File(path)));
+    }
+
+    public void forEachRecursive(Consumer<File> forEach)
+    {
+        PathUtils.forEachRecursive(path, path -> forEach.accept(new File(path)));
+    }
+
+    private static <V> ThrowingFunction<IOException, V, RuntimeException> nulls() { return ignore -> null; }
+    private static <V> ThrowingFunction<IOException, V, IOException> rethrow()
+    {
+        return fail -> {
+            if (fail == null) throw new FileNotFoundException();
+            throw fail;
+        };
+    }
+    private static <V> ThrowingFunction<IOException, V, UncheckedIOException> unchecked()
+    {
+        return fail -> {
+            if (fail == null) fail = new FileNotFoundException();
+            throw new UncheckedIOException(fail);
+        };
+    }
+
+
+    /**
+     * @return if a directory, the names of the files within; null otherwise
+     */
+    public String[] tryListNames()
+    {
+        return tryListNames(nulls());
+    }
+
+    /**
+     * @return if a directory, the names of the files within, filtered by the provided predicate; null otherwise
+     */
+    public String[] tryListNames(BiPredicate<File, String> filter)
+    {
+        return tryListNames(filter, nulls());
+    }
+
+    /**
+     * @return if a directory, the files within; null otherwise
+     */
+    public File[] tryList()
+    {
+        return tryList(nulls());
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; null otherwise
+     */
+    public File[] tryList(Predicate<File> filter)
+    {
+        return tryList(filter, nulls());
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; null otherwise
+     */
+    public File[] tryList(BiPredicate<File, String> filter)
+    {
+        return tryList(filter, nulls());
+    }
+
+    /**
+     * @return if a directory, the names of the files within; null otherwise
+     */
+    public String[] listNames() throws IOException
+    {
+        return tryListNames(rethrow());
+    }
+
+    /**
+     * @return if a directory, the names of the files within, filtered by the provided predicate; null otherwise
+     */
+    public String[] listNames(BiPredicate<File, String> filter) throws IOException
+    {
+        return tryListNames(filter, rethrow());
+    }
+
+    /**
+     * @return if a directory, the files within; null otherwise
+     */
+    public File[] list() throws IOException
+    {
+        return tryList(rethrow());
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; null otherwise
+     */
+    public File[] list(Predicate<File> filter) throws IOException
+    {
+        return tryList(filter, rethrow());
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; null otherwise
+     */
+    public File[] list(BiPredicate<File, String> filter) throws IOException
+    {
+        return tryList(filter, rethrow());
+    }
+
+    /**
+     * @return if a directory, the names of the files within; null otherwise
+     */
+    public String[] listNamesUnchecked() throws UncheckedIOException
+    {
+        return tryListNames(unchecked());
+    }
+
+    /**
+     * @return if a directory, the names of the files within, filtered by the provided predicate; null otherwise
+     */
+    public String[] listNamesUnchecked(BiPredicate<File, String> filter) throws UncheckedIOException
+    {
+        return tryListNames(filter, unchecked());
+    }
+
+    /**
+     * @return if a directory, the files within; null otherwise
+     */
+    public File[] listUnchecked() throws UncheckedIOException
+    {
+        return tryList(unchecked());
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; null otherwise
+     */
+    public File[] listUnchecked(Predicate<File> filter) throws UncheckedIOException
+    {
+        return tryList(filter, unchecked());
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; throw an UncheckedIO exception otherwise
+     */
+    public File[] listUnchecked(BiPredicate<File, String> filter) throws UncheckedIOException
+    {
+        return tryList(filter, unchecked());
+    }
+
+    /**
+     * @return if a directory, the names of the files within; null otherwise
+     */
+    public <T extends Throwable> String[] tryListNames(ThrowingFunction<IOException, String[], T> orElse) throws T
+    {
+        return tryListNames(path, Function.identity(), orElse);
+    }
+
+    /**
+     * @return if a directory, the names of the files within, filtered by the provided predicate; null otherwise
+     */
+    public <T extends Throwable> String[] tryListNames(BiPredicate<File, String> filter, ThrowingFunction<IOException, String[], T> orElse) throws T
+    {
+        return tryList(path, stream -> stream.map(PathUtils::filename).filter(filename -> filter.test(this, filename)), String[]::new, orElse);
+    }
+
+    /**
+     * @return if a directory, the files within; null otherwise
+     */
+    private <T extends Throwable> File[] tryList(ThrowingFunction<IOException, File[], T> orElse) throws T
+    {
+        return tryList(path, Function.identity(), orElse);
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; null otherwise
+     */
+    private <T extends Throwable> File[] tryList(Predicate<File> filter, ThrowingFunction<IOException, File[], T> orElse) throws T
+    {
+        return tryList(path, stream -> stream.filter(filter), orElse);
+    }
+
+    /**
+     * @return if a directory, the files within, filtered by the provided predicate; null otherwise
+     */
+    private <T extends Throwable> File[] tryList(BiPredicate<File, String> filter, ThrowingFunction<IOException, File[], T> orElse) throws T
+    {
+        return tryList(path, stream -> stream.filter(file -> filter.test(this, file.name())), orElse);
+    }
+
+    private static <T extends Throwable> String[] tryListNames(Path path, Function<Stream<File>, Stream<File>> toFiles, ThrowingFunction<IOException, String[], T> orElse) throws T
+    {
+        if (path == null)
+            return orElse.apply(null);
+        return PathUtils.tryList(path, stream -> toFiles.apply(stream.map(File::new)).map(File::name), String[]::new, orElse);
+    }
+
+    private static <T extends Throwable, V> V[] tryList(Path path, Function<Stream<Path>, Stream<V>> transformation, IntFunction<V[]> constructor, ThrowingFunction<IOException, V[], T> orElse) throws T
+    {
+        if (path == null)
+            return orElse.apply(null);
+        return PathUtils.tryList(path, transformation, constructor, orElse);
+    }
+
+    private static <T extends Throwable> File[] tryList(Path path, Function<Stream<File>, Stream<File>> toFiles, ThrowingFunction<IOException, File[], T> orElse) throws T
+    {
+        if (path == null)
+            return orElse.apply(null);
+        return PathUtils.tryList(path, stream -> toFiles.apply(stream.map(File::new)), File[]::new, orElse);
+    }
+
+    /**
+     * @return the path of this file
+     */
+    public String path()
+    {
+        return toString();
+    }
+
+    /**
+     * @return the {@link Path} of this file
+     */
+    public Path toPath()
+    {
+        return path == null ? filesystem.getPath("") : path;
+    }
+
+    /**
+     * @return the path of this file
+     */
+    @Override
+    public String toString()
+    {
+        return path == null ? "" : path.toString();
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return path == null ? 0 : path.hashCode();
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        return obj instanceof File && Objects.equals(path, ((File) obj).path);
+    }
+
+    @Override
+    public int compareTo(File that)
+    {
+        if (this.path == null || that.path == null)
+            return this.path == null && that.path == null ? 0 : this.path == null ? -1 : 1;
+        return this.path.compareTo(that.path);
+    }
+
+    public java.io.File toJavaIOFile()
+    {
+        return path == null ? new java.io.File("") // checkstyle: permit this instantiation
+                            : path.toFile(); // checkstyle: permit this invocation
+    }
+
+    /**
+     * @return a new {@link FileChannel} for reading
+     */
+    public FileChannel newReadChannel() throws NoSuchFileException
+    {
+        return PathUtils.newReadChannel(toPathForRead());
+    }
+
+    /**
+     * @return a new {@link FileChannel} for reading or writing; file will be created if it doesn't exist
+     */
+    public FileChannel newReadWriteChannel() throws NoSuchFileException
+    {
+        return PathUtils.newReadWriteChannel(toPathForRead());
+    }
+
+    /**
+     * @param mode whether or not the channel appends to the underlying file
+     * @return a new {@link FileChannel} for writing; file will be created if it doesn't exist
+     */
+    public FileChannel newWriteChannel(WriteMode mode) throws NoSuchFileException
+    {
+        switch (mode)
+        {
+            default: throw new AssertionError();
+            case APPEND: return PathUtils.newWriteAppendChannel(toPathForWrite());
+            case OVERWRITE: return PathUtils.newWriteOverwriteChannel(toPathForWrite());
+        }
+    }
+
+    public FileWriter newWriter(WriteMode mode) throws IOException
+    {
+        return new FileWriter(this, mode);
+    }
+
+    public FileOutputStreamPlus newOutputStream(WriteMode mode) throws NoSuchFileException
+    {
+        return new FileOutputStreamPlus(this, mode);
+    }
+
+    public FileInputStreamPlus newInputStream() throws NoSuchFileException
+    {
+        return new FileInputStreamPlus(this);
+    }
+
+    private Path toPathForWrite()
+    {
+        if (path == null)
+            throw new IllegalStateException("Cannot write to an empty path");
+        return path;
+    }
+
+    private Path toPathForRead()
+    {
+        if (path == null)
+            throw new IllegalStateException("Cannot read from an empty path");
+        return path;
+    }
+
+    public static void unsafeSetFilesystem(FileSystem fs)
+    {
+        filesystem = fs;
+    }
+}
+
diff --git a/src/java/org/apache/cassandra/io/util/FileHandle.java b/src/java/org/apache/cassandra/io/util/FileHandle.java
index 6d3ae7c..6bab460 100644
--- a/src/java/org/apache/cassandra/io/util/FileHandle.java
+++ b/src/java/org/apache/cassandra/io/util/FileHandle.java
@@ -148,8 +148,16 @@
     public FileDataInput createReader(long position)
     {
         RandomAccessReader reader = createReader();
-        reader.seek(position);
-        return reader;
+        try
+        {
+            reader.seek(position);
+            return reader;
+        }
+        catch (Throwable t)
+        {
+            try { reader.close(); } catch (Throwable t2) { t.addSuppressed(t2); }
+            throw t;
+        }
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/io/util/FileInputStreamPlus.java b/src/java/org/apache/cassandra/io/util/FileInputStreamPlus.java
new file mode 100644
index 0000000..79e8438
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/util/FileInputStreamPlus.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.io.util;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+
+public class FileInputStreamPlus extends RebufferingInputStream
+{
+    final FileChannel channel;
+
+    public FileInputStreamPlus(String file) throws NoSuchFileException
+    {
+        this(new File(file));
+    }
+
+    public FileInputStreamPlus(File file) throws NoSuchFileException
+    {
+        this(file.newReadChannel());
+    }
+
+    public FileInputStreamPlus(Path path) throws NoSuchFileException
+    {
+        this(PathUtils.newReadChannel(path));
+    }
+
+    public FileInputStreamPlus(Path path, int bufferSize) throws NoSuchFileException
+    {
+        this(PathUtils.newReadChannel(path), bufferSize);
+    }
+
+    private FileInputStreamPlus(FileChannel channel)
+    {
+        this(channel, 1 << 14);
+    }
+
+    private FileInputStreamPlus(FileChannel channel, int bufferSize)
+    {
+        super(ByteBuffer.allocateDirect(bufferSize));
+        this.channel = channel;
+        this.buffer.limit(0);
+    }
+
+    @Override
+    protected void reBuffer() throws IOException
+    {
+        buffer.clear();
+        channel.read(buffer);
+        buffer.flip();
+    }
+
+    public FileChannel getChannel()
+    {
+        return channel;
+    }
+
+    @Override
+    public void close() throws IOException
+    {
+        try
+        {
+            super.close();
+        }
+        finally
+        {
+            try
+            {
+                FileUtils.clean(buffer);
+            }
+            finally
+            {
+                channel.close();
+            }
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/util/FileOutputStreamPlus.java b/src/java/org/apache/cassandra/io/util/FileOutputStreamPlus.java
new file mode 100644
index 0000000..0cfd3e3
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/util/FileOutputStreamPlus.java
@@ -0,0 +1,69 @@
+/*
+ * 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.io.util;
+
+import java.io.IOException;
+import java.nio.channels.FileChannel;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+
+import static org.apache.cassandra.io.util.File.WriteMode.OVERWRITE;
+
+public class FileOutputStreamPlus extends BufferedDataOutputStreamPlus
+{
+    public FileOutputStreamPlus(String path) throws NoSuchFileException
+    {
+        this(path, OVERWRITE);
+    }
+
+    public FileOutputStreamPlus(String path, File.WriteMode mode) throws NoSuchFileException
+    {
+        this(new File(path), mode);
+    }
+
+    public FileOutputStreamPlus(File file) throws NoSuchFileException
+    {
+        this(file, OVERWRITE);
+    }
+
+    public FileOutputStreamPlus(File file, File.WriteMode mode) throws NoSuchFileException
+    {
+        super(file.newWriteChannel(mode));
+    }
+
+    public FileOutputStreamPlus(Path path) throws NoSuchFileException
+    {
+        this(path, OVERWRITE);
+    }
+
+    public FileOutputStreamPlus(Path path, File.WriteMode mode) throws NoSuchFileException
+    {
+        this(new File(path), mode);
+    }
+
+    public void sync() throws IOException
+    {
+        ((FileChannel)channel).force(true);
+    }
+
+    public FileChannel getChannel()
+    {
+        return (FileChannel) channel;
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/util/FileReader.java b/src/java/org/apache/cassandra/io/util/FileReader.java
new file mode 100644
index 0000000..86d0388
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/util/FileReader.java
@@ -0,0 +1,37 @@
+/*
+ * 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.io.util;
+
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+public class FileReader extends InputStreamReader
+{
+    @SuppressWarnings("resource") // FISP is closed by ISR::close
+    public FileReader(String file) throws IOException
+    {
+        super(new FileInputStreamPlus(file));
+    }
+
+    @SuppressWarnings("resource") // FISP is closed by ISR::close
+    public FileReader(File file) throws IOException
+    {
+        super(new FileInputStreamPlus(file));
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/util/FileUtils.java b/src/java/org/apache/cassandra/io/util/FileUtils.java
index 2aba2f7..01f1f18 100644
--- a/src/java/org/apache/cassandra/io/util/FileUtils.java
+++ b/src/java/org/apache/cassandra/io/util/FileUtils.java
@@ -17,7 +17,10 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.*;
+import java.io.BufferedWriter;
+import java.io.Closeable;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
 import java.lang.invoke.MethodHandle;
 import java.lang.invoke.MethodHandles;
 import java.lang.reflect.Method;
@@ -27,18 +30,22 @@
 import java.nio.channels.FileChannel;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
-import java.nio.file.*;
+import java.nio.file.DirectoryNotEmptyException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.StandardCopyOption;
+import java.nio.file.StandardOpenOption;
 import java.nio.file.attribute.BasicFileAttributes;
-import java.nio.file.attribute.FileAttributeView;
-import java.nio.file.attribute.FileStoreAttributeView;
 import java.text.DecimalFormat;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.HashSet;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
@@ -50,43 +57,34 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.io.FSError;
 import org.apache.cassandra.io.FSErrorHandler;
-import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
-import org.apache.cassandra.utils.NoSpamLogger;
 import org.apache.cassandra.utils.SyncUtil;
 
 import static com.google.common.base.Throwables.propagate;
 import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_IO_TMPDIR;
-import static org.apache.cassandra.config.CassandraRelevantProperties.USE_NIX_RECURSIVE_DELETE;
 import static org.apache.cassandra.utils.Throwables.maybeFail;
-import static org.apache.cassandra.utils.Throwables.merge;
 
 public final class FileUtils
 {
     public static final Charset CHARSET = StandardCharsets.UTF_8;
 
     private static final Logger logger = LoggerFactory.getLogger(FileUtils.class);
-    private static final NoSpamLogger nospam1m = NoSpamLogger.getLogger(logger, 1, TimeUnit.MINUTES);
 
-    public static final long ONE_KB = 1024;
-    public static final long ONE_MB = 1024 * ONE_KB;
-    public static final long ONE_GB = 1024 * ONE_MB;
-    public static final long ONE_TB = 1024 * ONE_GB;
+    public static final long ONE_KIB = 1024;
+    public static final long ONE_MIB = 1024 * ONE_KIB;
+    public static final long ONE_GIB = 1024 * ONE_MIB;
+    public static final long ONE_TIB = 1024 * ONE_GIB;
 
     private static final DecimalFormat df = new DecimalFormat("#.##");
     private static final AtomicReference<Optional<FSErrorHandler>> fsErrorHandler = new AtomicReference<>(Optional.empty());
 
-    private static Class clsDirectBuffer;
-    private static MethodHandle mhDirectBufferCleaner;
-    private static MethodHandle mhCleanerClean;
+    private static final Class clsDirectBuffer;
+    private static final MethodHandle mhDirectBufferCleaner;
+    private static final MethodHandle mhCleanerClean;
 
     static
     {
@@ -126,39 +124,32 @@
     }
 
     /**
-     * Pretty much like {@link File#createTempFile(String, String, File)}, but with
+     * Pretty much like {@link java.io.File#createTempFile(String, String, java.io.File)}, but with
      * the guarantee that the "random" part of the generated file name between
      * {@code prefix} and {@code suffix} is a positive, increasing {@code long} value.
      */
     public static File createTempFile(String prefix, String suffix, File directory)
     {
-        try
-        {
-            // Do not use java.io.File.createTempFile(), because some tests rely on the
-            // behavior that the "random" part in the temp file name is a positive 'long'.
-            // However, at least since Java 9 the code to generate the "random" part
-            // uses an _unsigned_ random long generated like this:
-            // Long.toUnsignedString(new java.util.Random.nextLong())
+        // Do not use java.io.File.createTempFile(), because some tests rely on the
+        // behavior that the "random" part in the temp file name is a positive 'long'.
+        // However, at least since Java 9 the code to generate the "random" part
+        // uses an _unsigned_ random long generated like this:
+        // Long.toUnsignedString(new java.util.Random.nextLong())
 
-            while (true)
-            {
-                // The contract of File.createTempFile() says, that it must not return
-                // the same file name again. We do that here in a very simple way,
-                // that probably doesn't cover all edge cases. Just rely on system
-                // wall clock and return strictly increasing values from that.
-                long num = tempFileNum.getAndIncrement();
-
-                // We have a positive long here, which is safe to use for example
-                // for CommitLogTest.
-                String fileName = prefix + Long.toString(num) + suffix;
-                File candidate = new File(directory, fileName);
-                if (candidate.createNewFile())
-                    return candidate;
-            }
-        }
-        catch (IOException e)
+        while (true)
         {
-            throw new FSWriteError(e, directory);
+            // The contract of File.createTempFile() says, that it must not return
+            // the same file name again. We do that here in a very simple way,
+            // that probably doesn't cover all edge cases. Just rely on system
+            // wall clock and return strictly increasing values from that.
+            long num = tempFileNum.getAndIncrement();
+
+            // We have a positive long here, which is safe to use for example
+            // for CommitLogTest.
+            String fileName = prefix + num + suffix;
+            File candidate = new File(directory, fileName);
+            if (candidate.createFileIfNotExists())
+                return candidate;
         }
     }
 
@@ -196,6 +187,11 @@
         }
     }
 
+    public static void createHardLinkWithConfirm(String from, String to)
+    {
+        createHardLinkWithConfirm(new File(from), new File(to));
+    }
+
     public static void createHardLinkWithConfirm(File from, File to)
     {
         try
@@ -212,11 +208,6 @@
         }
     }
 
-    public static void createHardLinkWithConfirm(String from, String to)
-    {
-        createHardLinkWithConfirm(new File(from), new File(to));
-    }
-
     public static void createHardLinkWithoutConfirm(String from, String to)
     {
         try
@@ -230,62 +221,11 @@
         }
     }
 
-    public static Throwable deleteWithConfirm(String filePath, Throwable accumulate)
-    {
-        return deleteWithConfirm(new File(filePath), accumulate, null);
-    }
-
-    public static Throwable deleteWithConfirm(File file, Throwable accumulate)
-    {
-        return deleteWithConfirm(file, accumulate, null);
-    }
-    
-    public static Throwable deleteWithConfirm(File file, Throwable accumulate, RateLimiter rateLimiter)
-    {
-        try
-        {
-            if (rateLimiter != null)
-            {
-                double throttled = rateLimiter.acquire();
-                if (throttled > 0.0)
-                    nospam1m.warn("Throttling file deletion: waited {} seconds to delete {}", throttled, file);
-            }
-            Files.delete(file.toPath());
-        }
-        catch (Throwable t)
-        {
-            try
-            {
-                throw new FSWriteError(t, file);
-            }
-            catch (Throwable t2)
-            {
-                accumulate = merge(accumulate, t2);
-            }
-        }
-        return accumulate;
-    }
-
-    public static void deleteWithConfirm(String file)
-    {
-        deleteWithConfirm(new File(file));
-    }
-
-    public static void deleteWithConfirm(File file)
-    {
-        maybeFail(deleteWithConfirm(file, null, null));
-    }
-
-    public static void deleteWithConfirmWithThrottle(File file, RateLimiter rateLimiter)
-    {
-        maybeFail(deleteWithConfirm(file, null, rateLimiter));
-    }
-
     public static void copyWithOutConfirm(String from, String to)
     {
         try
         {
-            Files.copy(Paths.get(from), Paths.get(to));
+            Files.copy(File.getPath(from), File.getPath(to));
         }
         catch (IOException e)
         {
@@ -303,7 +243,7 @@
     {
         assert from.exists();
         if (logger.isTraceEnabled())
-            logger.trace("Copying {} to {}", from.getPath(), to.getPath());
+            logger.trace("Copying {} to {}", from.path(), to.path());
 
         try
         {
@@ -315,74 +255,16 @@
         }
     }
 
-    public static void renameWithOutConfirm(String from, String to)
-    {
-        try
-        {
-            atomicMoveWithFallback(new File(from).toPath(), new File(to).toPath());
-        }
-        catch (IOException e)
-        {
-            if (logger.isTraceEnabled())
-                logger.trace("Could not move file "+from+" to "+to, e);
-        }
-    }
-
-    public static void renameWithConfirm(String from, String to)
-    {
-        renameWithConfirm(new File(from), new File(to));
-    }
-
-    public static void renameWithConfirm(File from, File to)
-    {
-        assert from.exists();
-        if (logger.isTraceEnabled())
-            logger.trace("Renaming {} to {}", from.getPath(), to.getPath());
-        // this is not FSWE because usually when we see it it's because we didn't close the file before renaming it,
-        // and Windows is picky about that.
-        try
-        {
-            atomicMoveWithFallback(from.toPath(), to.toPath());
-        }
-        catch (IOException e)
-        {
-            throw new RuntimeException(String.format("Failed to rename %s to %s", from.getPath(), to.getPath()), e);
-        }
-    }
-
-    /**
-     * Move a file atomically, if it fails, it falls back to a non-atomic operation
-     * @param from
-     * @param to
-     * @throws IOException
-     */
-    private static void atomicMoveWithFallback(Path from, Path to) throws IOException
-    {
-        try
-        {
-            Files.move(from, to, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
-        }
-        catch (AtomicMoveNotSupportedException e)
-        {
-            logger.trace("Could not do an atomic move", e);
-            Files.move(from, to, StandardCopyOption.REPLACE_EXISTING);
-        }
-
-    }
-
     public static void truncate(String path, long size)
     {
-        try(FileChannel channel = FileChannel.open(Paths.get(path), StandardOpenOption.READ, StandardOpenOption.WRITE))
+        File file = new File(path);
+        try (FileChannel channel = file.newReadWriteChannel())
         {
             channel.truncate(size);
         }
-        catch (NoSuchFileException | FileNotFoundException nfe)
-        {
-            throw new RuntimeException(nfe);
-        }
         catch (IOException e)
         {
-            throw new FSWriteError(e, path);
+            throw PathUtils.propagateUnchecked(e, file.toPath(), true);
         }
     }
 
@@ -455,49 +337,18 @@
 
     public static String getCanonicalPath(String filename)
     {
-        try
-        {
-            return new File(filename).getCanonicalPath();
-        }
-        catch (IOException e)
-        {
-            throw new FSReadError(e, filename);
-        }
+        return new File(filename).canonicalPath();
     }
 
     public static String getCanonicalPath(File file)
     {
-        try
-        {
-            return file.getCanonicalPath();
-        }
-        catch (IOException e)
-        {
-            throw new FSReadError(e, file);
-        }
+        return file.canonicalPath();
     }
 
     /** Return true if file is contained in folder */
     public static boolean isContained(File folder, File file)
     {
-        Path folderPath = Paths.get(getCanonicalPath(folder));
-        Path filePath = Paths.get(getCanonicalPath(file));
-
-        return filePath.startsWith(folderPath);
-    }
-
-    /** Convert absolute path into a path relative to the base path */
-    public static String getRelativePath(String basePath, String path)
-    {
-        try
-        {
-            return Paths.get(basePath).relativize(Paths.get(path)).toString();
-        }
-        catch(Exception ex)
-        {
-            String absDataPath = FileUtils.getCanonicalPath(basePath);
-            return Paths.get(absDataPath).relativize(Paths.get(path)).toString();
-        }
+        return folder.isAncestorOf(file);
     }
 
     public static void clean(ByteBuffer buffer)
@@ -528,52 +379,6 @@
         }
     }
 
-    public static void createDirectory(String directory)
-    {
-        createDirectory(new File(directory));
-    }
-
-    public static void createDirectory(File directory)
-    {
-        if (!directory.exists())
-        {
-            if (!directory.mkdirs())
-                throw new FSWriteError(new IOException("Failed to mkdirs " + directory), directory);
-        }
-    }
-
-    public static boolean delete(String file)
-    {
-        if (!StorageService.instance.isDaemonSetupCompleted())
-            logger.info("Deleting file during startup: {}", file);
-
-        File f = new File(file);
-        return f.delete();
-    }
-
-    public static void delete(File... files)
-    {
-        for ( File file : files )
-        {
-            if (!StorageService.instance.isDaemonSetupCompleted())
-                logger.info("Deleting file during startup: {}", file);
-
-            file.delete();
-        }
-    }
-
-    public static void deleteAsync(final String file)
-    {
-        Runnable runnable = new Runnable()
-        {
-            public void run()
-            {
-                deleteWithConfirm(new File(file));
-            }
-        };
-        ScheduledExecutors.nonPeriodicTasks.execute(runnable);
-    }
-
     public static long parseFileSize(String value)
     {
         long result;
@@ -584,22 +389,22 @@
         }
         if (value.endsWith(" TiB"))
         {
-            result = Math.round(Double.valueOf(value.replace(" TiB", "")) * ONE_TB);
+            result = Math.round(Double.valueOf(value.replace(" TiB", "")) * ONE_TIB);
             return result;
         }
         else if (value.endsWith(" GiB"))
         {
-            result = Math.round(Double.valueOf(value.replace(" GiB", "")) * ONE_GB);
+            result = Math.round(Double.valueOf(value.replace(" GiB", "")) * ONE_GIB);
             return result;
         }
         else if (value.endsWith(" KiB"))
         {
-            result = Math.round(Double.valueOf(value.replace(" KiB", "")) * ONE_KB);
+            result = Math.round(Double.valueOf(value.replace(" KiB", "")) * ONE_KIB);
             return result;
         }
         else if (value.endsWith(" MiB"))
         {
-            result = Math.round(Double.valueOf(value.replace(" MiB", "")) * ONE_MB);
+            result = Math.round(Double.valueOf(value.replace(" MiB", "")) * ONE_MIB);
             return result;
         }
         else if (value.endsWith(" bytes"))
@@ -616,27 +421,27 @@
     public static String stringifyFileSize(double value)
     {
         double d;
-        if ( value >= ONE_TB )
+        if (value >= ONE_TIB)
         {
-            d = value / ONE_TB;
+            d = value / ONE_TIB;
             String val = df.format(d);
             return val + " TiB";
         }
-        else if ( value >= ONE_GB )
+        else if (value >= ONE_GIB)
         {
-            d = value / ONE_GB;
+            d = value / ONE_GIB;
             String val = df.format(d);
             return val + " GiB";
         }
-        else if ( value >= ONE_MB )
+        else if (value >= ONE_MIB)
         {
-            d = value / ONE_MB;
+            d = value / ONE_MIB;
             String val = df.format(d);
             return val + " MiB";
         }
-        else if ( value >= ONE_KB )
+        else if (value >= ONE_KIB)
         {
-            d = value / ONE_KB;
+            d = value / ONE_KIB;
             String val = df.format(d);
             return val + " KiB";
         }
@@ -647,134 +452,6 @@
         }
     }
 
-    /**
-     * Deletes all files and subdirectories under "dir".
-     * @param dir Directory to be deleted
-     * @throws FSWriteError if any part of the tree cannot be deleted
-     */
-    public static void deleteRecursiveWithThrottle(File dir, RateLimiter rateLimiter)
-    {
-        if (dir.isDirectory())
-        {
-            String[] children = dir.list();
-            for (String child : children)
-                deleteRecursiveWithThrottle(new File(dir, child), rateLimiter);
-        }
-
-        // The directory is now empty so now it can be smoked
-        deleteWithConfirmWithThrottle(dir, rateLimiter);
-    }
-
-
-    /**
-     * Deletes the specified directory after having deleted its content.
-     *
-     * @param dir Directory to be deleted
-     * @throws FSWriteError if any part of the tree cannot be deleted
-     */
-    public static void deleteRecursive(File dir)
-    {
-        if (USE_NIX_RECURSIVE_DELETE.getBoolean() && dir.toPath().getFileSystem() == FileSystems.getDefault())
-        {
-            deleteRecursiveUsingNixCommand(dir.toPath(), false);
-            return;
-        }
-
-        deleteChildrenRecursive(dir);
-
-        // The directory is now empty, so now it can be smoked
-        deleteWithConfirm(dir);
-    }
-
-    /**
-     * Deletes all files and subdirectories under "dir".
-     *
-     * @param dir Directory to be deleted
-     * @throws FSWriteError if any part of the tree cannot be deleted
-     */
-    public static void deleteChildrenRecursive(File dir)
-    {
-        if (dir.isDirectory())
-        {
-            String[] children = dir.list();
-            if (children.length == 0)
-                return;
-
-            if (USE_NIX_RECURSIVE_DELETE.getBoolean() && dir.toPath().getFileSystem() == FileSystems.getDefault())
-            {
-                for (String child : children)
-                    deleteRecursiveUsingNixCommand(dir.toPath().resolve(child), false);
-            }
-            else
-            {
-                for (String child : children)
-                    deleteRecursive(new File(dir, child));
-            }
-        }
-    }
-
-    /**
-     * Uses unix `rm -r` to delete a directory recursively.
-     * This method can be much faster than deleting files and directories recursively by traversing them with Java.
-     * Though, we use it only for tests because it provides less information about the problem when something goes wrong.
-     *
-     * @param path        path to be deleted
-     * @param quietly     if quietly, additional `-f` flag is added to the `rm` command so that it will not complain in case
-     *                    the provided path is missing
-     */
-    private static void deleteRecursiveUsingNixCommand(Path path, boolean quietly)
-    {
-        String[] cmd = new String[]{ "rm",
-                                     quietly ? "-drf" : "-dr",
-                                     path.toAbsolutePath().toString() };
-
-        try
-        {
-            Process p = Runtime.getRuntime().exec(cmd);
-            int result = p.waitFor();
-
-            String out, err;
-            try (BufferedReader outReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
-                 BufferedReader errReader = new BufferedReader(new InputStreamReader(p.getErrorStream())))
-            {
-                out = outReader.lines().collect(Collectors.joining("\n"));
-                err = errReader.lines().collect(Collectors.joining("\n"));
-            }
-
-            if (result != 0 && Files.exists(path))
-            {
-                logger.error("{} returned:\nstdout:\n{}\n\nstderr:\n{}", Arrays.toString(cmd), out, err);
-                throw new IOException(String.format("%s returned non-zero exit code: %d%nstdout:%n%s%n%nstderr:%n%s", Arrays.toString(cmd), result, out, err));
-            }
-        }
-        catch (IOException e)
-        {
-            throw new FSWriteError(e, path.toString());
-        }
-        catch (InterruptedException e)
-        {
-            Thread.currentThread().interrupt();
-            throw new FSWriteError(e, path.toString());
-        }
-    }
-
-    /**
-     * Schedules deletion of all file and subdirectories under "dir" on JVM shutdown.
-     * @param dir Directory to be deleted
-     */
-    public static void deleteRecursiveOnExit(File dir)
-    {
-        if (dir.isDirectory())
-        {
-            String[] children = dir.list();
-            for (String child : children)
-                deleteRecursiveOnExit(new File(dir, child));
-        }
-
-        logger.trace("Scheduling deferred deletion of file: {}", dir);
-        dir.deleteOnExit();
-    }
-
     public static void handleCorruptSSTable(CorruptSSTableException e)
     {
         fsErrorHandler.get().ifPresent(handler -> handler.handleCorruptSSTable(e));
@@ -785,6 +462,11 @@
         fsErrorHandler.get().ifPresent(handler -> handler.handleFSError(e));
     }
 
+    public static void handleStartupFSError(Throwable t)
+    {
+        fsErrorHandler.get().ifPresent(handler -> handler.handleStartupFSError(t));
+    }
+
     /**
      * handleFSErrorAndPropagate will invoke the disk failure policy error handler,
      * which may or may not stop the daemon or transports. However, if we don't exit,
@@ -806,6 +488,9 @@
      */
     public static long folderSize(File folder)
     {
+        if (!folder.exists())
+            return 0;
+
         final long [] sizeArr = {0L};
         try
         {
@@ -817,6 +502,15 @@
                     sizeArr[0] += attrs.size();
                     return FileVisitResult.CONTINUE;
                 }
+
+                @Override
+                public FileVisitResult visitFileFailed(Path path, IOException e) throws IOException
+                {
+                    if (e instanceof NoSuchFileException)
+                        return FileVisitResult.CONTINUE;
+                    else
+                        throw e;
+                }
             });
         }
         catch (IOException e)
@@ -826,41 +520,6 @@
         return sizeArr[0];
     }
 
-    public static void copyTo(DataInput in, OutputStream out, int length) throws IOException
-    {
-        byte[] buffer = new byte[64 * 1024];
-        int copiedBytes = 0;
-
-        while (copiedBytes + buffer.length < length)
-        {
-            in.readFully(buffer);
-            out.write(buffer);
-            copiedBytes += buffer.length;
-        }
-
-        if (copiedBytes < length)
-        {
-            int left = length - copiedBytes;
-            in.readFully(buffer, 0, left);
-            out.write(buffer, 0, left);
-        }
-    }
-
-    public static boolean isSubDirectory(File parent, File child) throws IOException
-    {
-        parent = parent.getCanonicalFile();
-        child = child.getCanonicalFile();
-
-        File toCheck = child;
-        while (toCheck != null)
-        {
-            if (parent.equals(toCheck))
-                return true;
-            toCheck = toCheck.getParentFile();
-        }
-        return false;
-    }
-
     public static void append(File file, String ... lines)
     {
         if (file.exists())
@@ -894,7 +553,10 @@
      */
     public static void write(File file, List<String> lines, StandardOpenOption ... options)
     {
-        Set<StandardOpenOption> optionsSet = new HashSet<>(Arrays.asList(options));
+        Set<StandardOpenOption> optionsSet = EnumSet.noneOf(StandardOpenOption.class);
+        for (StandardOpenOption option : options)
+            optionsSet.add(option);
+
         //Emulate the old FileSystemProvider.newOutputStream behavior for open options.
         if (optionsSet.isEmpty())
         {
@@ -953,70 +615,109 @@
         fsErrorHandler.getAndSet(Optional.ofNullable(handler));
     }
 
-    /**
-     * Returns the size of the specified partition.
-     * <p>This method handles large file system by returning {@code Long.MAX_VALUE} if the  size overflow.
-     * See <a href='https://bugs.openjdk.java.net/browse/JDK-8179320'>JDK-8179320</a> for more information.</p>
-     *
-     * @param file the partition
-     * @return the size, in bytes, of the partition or {@code 0L} if the abstract pathname does not name a partition
-     */
-    public static long getTotalSpace(File file)
+    @Deprecated
+    public static void createDirectory(String directory)
     {
-        return handleLargeFileSystem(file.getTotalSpace());
+        createDirectory(new File(directory));
+    }
+
+    @Deprecated
+    public static void createDirectory(File directory)
+    {
+        PathUtils.createDirectoriesIfNotExists(directory.toPath());
+    }
+
+    @Deprecated
+    public static boolean delete(String file)
+    {
+        return new File(file).tryDelete();
+    }
+
+    @Deprecated
+    public static void delete(File... files)
+    {
+        for (File file : files)
+            file.tryDelete();
     }
 
     /**
-     * Returns the number of unallocated bytes on the specified partition.
-     * <p>This method handles large file system by returning {@code Long.MAX_VALUE} if the  number of unallocated bytes
-     * overflow. See <a href='https://bugs.openjdk.java.net/browse/JDK-8179320'>JDK-8179320</a> for more information</p>
-     *
-     * @param file the partition
-     * @return the number of unallocated bytes on the partition or {@code 0L}
-     * if the abstract pathname does not name a partition.
+     * Deletes all files and subdirectories under "dir".
+     * @param dir Directory to be deleted
+     * @throws FSWriteError if any part of the tree cannot be deleted
      */
-    public static long getFreeSpace(File file)
+    @Deprecated
+    public static void deleteRecursiveWithThrottle(File dir, RateLimiter rateLimiter)
     {
-        return handleLargeFileSystem(file.getFreeSpace());
+        dir.deleteRecursive(rateLimiter);
     }
 
     /**
-     * Returns the number of available bytes on the specified partition.
-     * <p>This method handles large file system by returning {@code Long.MAX_VALUE} if the  number of available bytes
-     * overflow. See <a href='https://bugs.openjdk.java.net/browse/JDK-8179320'>JDK-8179320</a> for more information</p>
-     *
-     * @param file the partition
-     * @return the number of available bytes on the partition or {@code 0L}
-     * if the abstract pathname does not name a partition.
+     * Deletes all files and subdirectories under "dir".
+     * @param dir Directory to be deleted
+     * @throws FSWriteError if any part of the tree cannot be deleted
      */
-    public static long getUsableSpace(File file)
+    @Deprecated
+    public static void deleteRecursive(File dir)
     {
-        return handleLargeFileSystem(file.getUsableSpace());
+        dir.deleteRecursive();
     }
 
     /**
-     * Returns the {@link FileStore} representing the file store where a file
-     * is located. This {@link FileStore} handles large file system by returning {@code Long.MAX_VALUE}
-     * from {@code FileStore#getTotalSpace()}, {@code FileStore#getUnallocatedSpace()} and {@code FileStore#getUsableSpace()}
-     * it the value is bigger than {@code Long.MAX_VALUE}. See <a href='https://bugs.openjdk.java.net/browse/JDK-8162520'>JDK-8162520</a>
-     * for more information.
-     *
-     * @param path the path to the file
-     * @return the file store where the file is stored
+     * Schedules deletion of all file and subdirectories under "dir" on JVM shutdown.
+     * @param dir Directory to be deleted
      */
-    public static FileStore getFileStore(Path path) throws IOException
+    @Deprecated
+    public static void deleteRecursiveOnExit(File dir)
     {
-        return new SafeFileStore(Files.getFileStore(path));
+        dir.deleteRecursiveOnExit();
     }
 
-    /**
-     * Handle large file system by returning {@code Long.MAX_VALUE} when the size overflows.
-     * @param size returned by the Java's FileStore methods
-     * @return the size or {@code Long.MAX_VALUE} if the size was bigger than {@code Long.MAX_VALUE}
-     */
-    private static long handleLargeFileSystem(long size)
+    @Deprecated
+    public static boolean isSubDirectory(File parent, File child)
     {
-        return size < 0 ? Long.MAX_VALUE : size;
+        return parent.isAncestorOf(child);
+    }
+
+    @Deprecated
+    public static Throwable deleteWithConfirm(File file, Throwable accumulate)
+    {
+        return file.delete(accumulate, null);
+    }
+
+    @Deprecated
+    public static Throwable deleteWithConfirm(File file, Throwable accumulate, RateLimiter rateLimiter)
+    {
+        return file.delete(accumulate, rateLimiter);
+    }
+
+    @Deprecated
+    public static void deleteWithConfirm(String file)
+    {
+        deleteWithConfirm(new File(file));
+    }
+
+    @Deprecated
+    public static void deleteWithConfirm(File file)
+    {
+        file.delete();
+    }
+
+    @Deprecated
+    public static void renameWithOutConfirm(String from, String to)
+    {
+        new File(from).tryMove(new File(to));
+    }
+
+    @Deprecated
+    public static void renameWithConfirm(String from, String to)
+    {
+        renameWithConfirm(new File(from), new File(to));
+    }
+
+    @Deprecated
+    public static void renameWithConfirm(File from, File to)
+    {
+        from.move(to);
     }
 
     /**
@@ -1027,88 +728,6 @@
     }
 
     /**
-     * FileStore decorator used to safely handle large file system.
-     *
-     * <p>Java's FileStore methods (getTotalSpace/getUnallocatedSpace/getUsableSpace) are limited to reporting bytes as
-     * signed long (2^63-1), if the filesystem is any bigger, then the size overflows. {@code SafeFileStore} will
-     * return {@code Long.MAX_VALUE} if the size overflow.</p>
-     *
-     * @see <a href="https://bugs.openjdk.java.net/browse/JDK-8162520">JDK-8162520</a>.
-     */
-    private static final class SafeFileStore extends FileStore
-    {
-        /**
-         * The decorated {@code FileStore}
-         */
-        private final FileStore fileStore;
-
-        public SafeFileStore(FileStore fileStore)
-        {
-            this.fileStore = fileStore;
-        }
-
-        @Override
-        public String name()
-        {
-            return fileStore.name();
-        }
-
-        @Override
-        public String type()
-        {
-            return fileStore.type();
-        }
-
-        @Override
-        public boolean isReadOnly()
-        {
-            return fileStore.isReadOnly();
-        }
-
-        @Override
-        public long getTotalSpace() throws IOException
-        {
-            return handleLargeFileSystem(fileStore.getTotalSpace());
-        }
-
-        @Override
-        public long getUsableSpace() throws IOException
-        {
-            return handleLargeFileSystem(fileStore.getUsableSpace());
-        }
-
-        @Override
-        public long getUnallocatedSpace() throws IOException
-        {
-            return handleLargeFileSystem(fileStore.getUnallocatedSpace());
-        }
-
-        @Override
-        public boolean supportsFileAttributeView(Class<? extends FileAttributeView> type)
-        {
-            return fileStore.supportsFileAttributeView(type);
-        }
-
-        @Override
-        public boolean supportsFileAttributeView(String name)
-        {
-            return fileStore.supportsFileAttributeView(name);
-        }
-
-        @Override
-        public <V extends FileStoreAttributeView> V getFileStoreAttributeView(Class<V> type)
-        {
-            return fileStore.getFileStoreAttributeView(type);
-        }
-
-        @Override
-        public Object getAttribute(String attribute) throws IOException
-        {
-            return fileStore.getAttribute(attribute);
-        }
-    }
-
-    /**
      * Moves the contents of a directory to another directory.
      * <p>Once a file has been copied to the target directory it will be deleted from the source directory.
      * If a file already exists in the target directory a warning will be logged and the file will not
@@ -1125,9 +744,9 @@
         {
             Files.createDirectories(target);
 
-            for (File f : source.toFile().listFiles())
+            for (File f : new File(source).tryList())
             {
-                String fileName = f.getName();
+                String fileName = f.name();
                 moveRecursively(source.resolve(fileName), target.resolve(fileName));
             }
 
diff --git a/src/java/org/apache/cassandra/io/util/FileWriter.java b/src/java/org/apache/cassandra/io/util/FileWriter.java
new file mode 100644
index 0000000..bbfb595
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/util/FileWriter.java
@@ -0,0 +1,39 @@
+/*
+ * 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.io.util;
+
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+
+import org.apache.cassandra.io.util.File.WriteMode;
+
+public class FileWriter extends OutputStreamWriter
+{
+    @SuppressWarnings("resource") // FOSP is closed by OSW::close
+    public FileWriter(File file) throws IOException
+    {
+        super(new FileOutputStreamPlus(file));
+    }
+
+    @SuppressWarnings("resource") // FOSP is closed by OSW::close
+    public FileWriter(File file, WriteMode mode) throws IOException
+    {
+        super(new FileOutputStreamPlus(file, mode));
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/util/Memory.java b/src/java/org/apache/cassandra/io/util/Memory.java
index eaa6e91..7fd4225 100644
--- a/src/java/org/apache/cassandra/io/util/Memory.java
+++ b/src/java/org/apache/cassandra/io/util/Memory.java
@@ -32,7 +32,7 @@
 /**
  * An off-heap region of memory that must be manually free'd when no longer needed.
  */
-public class Memory implements AutoCloseable
+public class Memory implements AutoCloseable, ReadableMemory
 {
     private static final Unsafe unsafe;
     static
@@ -68,7 +68,7 @@
         // we permit a 0 peer iff size is zero, since such an allocation makes no sense, and an allocator would be
         // justified in returning a null pointer (and permitted to do so: http://www.cplusplus.com/reference/cstdlib/malloc)
         if (peer == 0)
-            throw new OutOfMemoryError();
+            throw new OutOfMemoryError(); // checkstyle: permit this instantiation
     }
 
     // create a memory object that references the exacy same memory location as the one provided.
diff --git a/src/java/org/apache/cassandra/io/util/PathUtils.java b/src/java/org/apache/cassandra/io/util/PathUtils.java
new file mode 100644
index 0000000..4b3efdb
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/util/PathUtils.java
@@ -0,0 +1,865 @@
+/*
+ * 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.io.util;
+
+import java.io.*;
+import java.nio.channels.FileChannel;
+import java.nio.file.*;
+import java.nio.file.attribute.*;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.function.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.annotation.Nullable;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.RateLimiter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.openhft.chronicle.core.util.ThrowingFunction;
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.io.FSError;
+import org.apache.cassandra.io.FSReadError;
+import org.apache.cassandra.io.FSWriteError;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.NoSpamLogger;
+
+import static java.nio.file.StandardOpenOption.*;
+import static java.util.Collections.unmodifiableSet;
+import static org.apache.cassandra.config.CassandraRelevantProperties.USE_NIX_RECURSIVE_DELETE;
+import static org.apache.cassandra.utils.Throwables.merge;
+
+/**
+ * Vernacular: tryX means return false or 0L on any failure; XIfNotY means propagate any exceptions besides those caused by Y
+ *
+ * This class tries to apply uniform IOException handling, and does not propagate IOException except for NoSuchFileException.
+ * Any harmless/application error exceptions are propagated as UncheckedIOException, and anything else as an FSReadError or FSWriteError.
+ * Semantically this is a little incoherent throughout the codebase, as we intercept IOException haphazardly and treaat
+ * it inconsistently - we should ideally migrate to using {@link #propagate(IOException, Path, boolean)} et al globally.
+ */
+public final class PathUtils
+{
+    private static final boolean consistentDirectoryListings = CassandraRelevantProperties.DETERMINISM_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));
+    private static final Set<StandardOpenOption> WRITE_APPEND_OPTIONS = unmodifiableSet(EnumSet.of(WRITE, CREATE, APPEND));
+    private static final Set<StandardOpenOption> READ_WRITE_OPTIONS = unmodifiableSet(EnumSet.of(READ, WRITE, CREATE));
+    private static final FileAttribute<?>[] NO_ATTRIBUTES = new FileAttribute[0];
+
+    private static final Logger logger = LoggerFactory.getLogger(PathUtils.class);
+    private static final NoSpamLogger nospam1m = NoSpamLogger.getLogger(logger, 1, TimeUnit.MINUTES);
+
+    private static Consumer<Path> onDeletion = path -> {
+        if (StorageService.instance.isDaemonSetupCompleted())
+            setDeletionListener(ignore -> {});
+        else
+            logger.trace("Deleting file during startup: {}", path);
+    };
+
+    public static FileChannel newReadChannel(Path path) throws NoSuchFileException
+    {
+        return newFileChannel(path, READ_OPTIONS);
+    }
+
+    public static FileChannel newReadWriteChannel(Path path) throws NoSuchFileException
+    {
+        return newFileChannel(path, READ_WRITE_OPTIONS);
+    }
+
+    public static FileChannel newWriteOverwriteChannel(Path path) throws NoSuchFileException
+    {
+        return newFileChannel(path, WRITE_OPTIONS);
+    }
+
+    public static FileChannel newWriteAppendChannel(Path path) throws NoSuchFileException
+    {
+        return newFileChannel(path, WRITE_APPEND_OPTIONS);
+    }
+
+    private static FileChannel newFileChannel(Path path, Set<StandardOpenOption> options) throws NoSuchFileException
+    {
+        try
+        {
+            return FileChannel.open(path, options, PathUtils.NO_ATTRIBUTES);
+        }
+        catch (IOException e)
+        {
+            throw propagateUncheckedOrNoSuchFileException(e, path, options.contains(WRITE));
+        }
+    }
+
+    public static void setDeletionListener(Consumer<Path> newOnDeletion)
+    {
+        onDeletion = newOnDeletion;
+    }
+
+    public static String filename(Path path)
+    {
+        return path.getFileName().toString();
+    }
+
+    public static <T> T[] list(Path path, Function<Stream<Path>, Stream<T>> transform, IntFunction<T[]> arrayFactory)
+    {
+        try (Stream<Path> stream = Files.list(path))
+        {
+            return transform.apply(consistentDirectoryListings ? stream.sorted() : stream)
+                    .toArray(arrayFactory);
+        }
+        catch (NoSuchFileException e)
+        {
+            return null;
+        }
+        catch (IOException e)
+        {
+            throw propagateUnchecked(e, path, false);
+        }
+    }
+
+    public static <T extends Throwable, V> V[] tryList(Path path, Function<Stream<Path>, Stream<V>> transform, IntFunction<V[]> arrayFactory, ThrowingFunction<IOException, V[], T> orElse) throws T
+    {
+        try (Stream<Path> stream = Files.list(path))
+        {
+            return transform.apply(consistentDirectoryListings ? stream.sorted() : stream)
+                    .toArray(arrayFactory);
+        }
+        catch (IOException e)
+        {
+            return orElse.apply(e);
+        }
+    }
+
+    public static void forEach(Path path, Consumer<Path> forEach)
+    {
+        try (Stream<Path> stream = Files.list(path))
+        {
+            (consistentDirectoryListings ? stream.sorted() : stream).forEach(forEach);
+        }
+        catch (IOException e)
+        {
+            throw propagateUnchecked(e, path, false);
+        }
+    }
+
+    public static void forEachRecursive(Path path, Consumer<Path> forEach)
+    {
+        Consumer<Path> forEachRecursive = new Consumer<Path>()
+        {
+            @Override
+            public void accept(Path child)
+            {
+                forEach.accept(child);
+                forEach(child, this);
+            }
+        };
+        forEach(path, forEachRecursive);
+    }
+
+    public static long tryGetLength(Path path)
+    {
+        return tryOnPath(path, Files::size);
+    }
+
+    public static long tryGetLastModified(Path path)
+    {
+        return tryOnPath(path, p -> Files.getLastModifiedTime(p).toMillis());
+    }
+
+    public static boolean trySetLastModified(Path path, long lastModified)
+    {
+        try
+        {
+            Files.setLastModifiedTime(path, FileTime.fromMillis(lastModified));
+            return true;
+        }
+        catch (IOException e)
+        {
+            return false;
+        }
+    }
+
+    public static boolean trySetReadable(Path path, boolean readable)
+    {
+        return trySet(path, PosixFilePermission.OWNER_READ, readable);
+    }
+
+    public static boolean trySetWritable(Path path, boolean writeable)
+    {
+        return trySet(path, PosixFilePermission.OWNER_WRITE, writeable);
+    }
+
+    public static boolean trySetExecutable(Path path, boolean executable)
+    {
+        return trySet(path, PosixFilePermission.OWNER_EXECUTE, executable);
+    }
+
+    public static boolean trySet(Path path, PosixFilePermission permission, boolean set)
+    {
+        try
+        {
+            PosixFileAttributeView view = path.getFileSystem().provider().getFileAttributeView(path, PosixFileAttributeView.class);
+            PosixFileAttributes attributes = view.readAttributes();
+            Set<PosixFilePermission> permissions = attributes.permissions();
+            if (set == permissions.contains(permission))
+                return true;
+            if (set) permissions.add(permission);
+            else permissions.remove(permission);
+            view.setPermissions(permissions);
+            return true;
+        }
+        catch (IOException e)
+        {
+            return false;
+        }
+    }
+
+    public static Throwable delete(Path file, Throwable accumulate)
+    {
+        try
+        {
+            delete(file);
+        }
+        catch (FSError t)
+        {
+            accumulate = merge(accumulate, t);
+        }
+        return accumulate;
+    }
+
+    public static void delete(Path file)
+    {
+        try
+        {
+            Files.delete(file);
+            onDeletion.accept(file);
+        }
+        catch (IOException e)
+        {
+            throw propagateUnchecked(e, file, true);
+        }
+    }
+
+    public static void deleteIfExists(Path file)
+    {
+        try
+        {
+            Files.delete(file);
+            onDeletion.accept(file);
+        }
+        catch (IOException e)
+        {
+            if (e instanceof FileNotFoundException | e instanceof NoSuchFileException)
+                return;
+
+            throw propagateUnchecked(e, file, true);
+        }
+    }
+
+    public static boolean tryDelete(Path file)
+    {
+        try
+        {
+            Files.delete(file);
+            onDeletion.accept(file);
+            return true;
+        }
+        catch (IOException e)
+        {
+            return false;
+        }
+    }
+
+    public static void delete(Path file, @Nullable RateLimiter rateLimiter)
+    {
+        if (rateLimiter != null)
+        {
+            double throttled = rateLimiter.acquire();
+            if (throttled > 0.0)
+                nospam1m.warn("Throttling file deletion: waited {} seconds to delete {}", throttled, file);
+        }
+        delete(file);
+    }
+
+    public static Throwable delete(Path file, Throwable accumulate, @Nullable RateLimiter rateLimiter)
+    {
+        try
+        {
+            delete(file, rateLimiter);
+        }
+        catch (Throwable t)
+        {
+            accumulate = merge(accumulate, t);
+        }
+        return accumulate;
+    }
+
+    /**
+     * Uses unix `rm -r` to delete a directory recursively.
+     * Note that, it will trigger {@link #onDeletion} listener only for the provided path and will not call it for any
+     * nested path. This method can be much faster than deleting files and directories recursively by traversing them
+     * with Java. Though, we use it only for tests because it provides less information about the problem when something
+     * goes wrong.
+     *
+     * @param path    path to be deleted
+     * @param quietly if quietly, additional `-f` flag is added to the `rm` command so that it will not complain in case
+     *                the provided path is missing
+     */
+    private static void deleteRecursiveUsingNixCommand(Path path, boolean quietly)
+    {
+        String [] cmd = new String[]{ "rm", quietly ? "-rdf" : "-rd", path.toAbsolutePath().toString() };
+        try
+        {
+            if (!quietly && !Files.exists(path))
+                throw new NoSuchFileException(path.toString());
+
+            Process p = Runtime.getRuntime().exec(cmd);
+            int result = p.waitFor();
+
+            String out, err;
+            try (BufferedReader outReader = new BufferedReader(new InputStreamReader(p.getInputStream()));
+                 BufferedReader errReader = new BufferedReader(new InputStreamReader(p.getErrorStream())))
+            {
+                out = outReader.lines().collect(Collectors.joining("\n"));
+                err = errReader.lines().collect(Collectors.joining("\n"));
+            }
+
+            if (result != 0 && Files.exists(path))
+            {
+                logger.error("{} returned:\nstdout:\n{}\n\nstderr:\n{}", Arrays.toString(cmd), out, err);
+                throw new IOException(String.format("%s returned non-zero exit code: %d%nstdout:%n%s%n%nstderr:%n%s", Arrays.toString(cmd), result, out, err));
+            }
+
+            onDeletion.accept(path);
+        }
+        catch (IOException e)
+        {
+            throw propagateUnchecked(e, path, true);
+        }
+        catch (InterruptedException e)
+        {
+            Thread.currentThread().interrupt();
+            throw new FSWriteError(e, path);
+        }
+    }
+
+    /**
+     * Deletes all files and subdirectories under "path".
+     * @param path file to be deleted
+     * @throws FSWriteError if any part of the tree cannot be deleted
+     */
+    public static void deleteRecursive(Path path)
+    {
+        if (USE_NIX_RECURSIVE_DELETE.getBoolean() && path.getFileSystem() == FileSystems.getDefault())
+        {
+            deleteRecursiveUsingNixCommand(path, false);
+            return;
+        }
+
+        if (isDirectory(path))
+            forEach(path, PathUtils::deleteRecursive);
+
+        // The directory is now empty, so now it can be smoked
+        delete(path);
+    }
+
+    /**
+     * Deletes all files and subdirectories under "path".
+     * @param path file to be deleted
+     * @throws FSWriteError if any part of the tree cannot be deleted
+     */
+    public static void deleteRecursive(Path path, RateLimiter rateLimiter)
+    {
+        if (USE_NIX_RECURSIVE_DELETE.getBoolean() && path.getFileSystem() == FileSystems.getDefault())
+        {
+            deleteRecursiveUsingNixCommand(path, false);
+            return;
+        }
+
+        deleteRecursive(path, rateLimiter, p -> deleteRecursive(p, rateLimiter));
+    }
+
+    /**
+     * Deletes all files and subdirectories under "path".
+     * @param path file to be deleted
+     * @throws FSWriteError if any part of the tree cannot be deleted
+     */
+    private static void deleteRecursive(Path path, RateLimiter rateLimiter, Consumer<Path> deleteRecursive)
+    {
+        if (isDirectory(path))
+            forEach(path, deleteRecursive);
+
+        // The directory is now empty so now it can be smoked
+        delete(path, rateLimiter);
+    }
+
+    /**
+     * Schedules deletion of all file and subdirectories under "dir" on JVM shutdown.
+     * @param dir Directory to be deleted
+     */
+    public synchronized static void deleteRecursiveOnExit(Path dir)
+    {
+        ON_EXIT.add(dir, true);
+    }
+
+    /**
+     * Schedules deletion of the file only on JVM shutdown.
+     * @param file File to be deleted
+     */
+    public synchronized static void deleteOnExit(Path file)
+    {
+        ON_EXIT.add(file, false);
+    }
+
+    public static boolean tryRename(Path from, Path to)
+    {
+        logger.trace("Renaming {} to {}", from, to);
+        try
+        {
+            atomicMoveWithFallback(from, to);
+            return true;
+        }
+        catch (IOException e)
+        {
+            logger.trace("Could not move file {} to {}", from, to, e);
+            return false;
+        }
+    }
+
+    public static void rename(Path from, Path to)
+    {
+        logger.trace("Renaming {} to {}", from, to);
+        try
+        {
+            atomicMoveWithFallback(from, to);
+        }
+        catch (IOException e)
+        {
+            logger.trace("Could not move file {} to {}", from, to, e);
+
+            // TODO: try to decide if is read or write? for now, have assumed write
+            throw propagateUnchecked(String.format("Failed to rename %s to %s", from, to), e, to, true);
+        }
+    }
+
+    /**
+     * Move a file atomically, if it fails, it falls back to a non-atomic operation
+     */
+    private static void atomicMoveWithFallback(Path from, Path to) throws IOException
+    {
+        try
+        {
+            Files.move(from, to, StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE);
+        }
+        catch (AtomicMoveNotSupportedException e)
+        {
+            logger.trace("Could not do an atomic move", e);
+            Files.move(from, to, StandardCopyOption.REPLACE_EXISTING);
+        }
+    }
+
+    // true if can determine exists, false if any exception occurs
+    public static boolean exists(Path path)
+    {
+        return Files.exists(path);
+    }
+
+    // true if can determine is a directory, false if any exception occurs
+    public static boolean isDirectory(Path path)
+    {
+        return Files.isDirectory(path);
+    }
+
+    // true if can determine is a regular file, false if any exception occurs
+    public static boolean isFile(Path path)
+    {
+        return Files.isRegularFile(path);
+    }
+
+    /**
+     * @param path create file if not exists
+     * @throws IOError if cannot perform the operation
+     * @return true if a new file was created
+     */
+    public static boolean createFileIfNotExists(Path path)
+    {
+        return ifNotExists(path, Files::createFile);
+    }
+
+    /**
+     * @param path create directory if not exists
+     * @throws IOError if cannot perform the operation
+     * @return true if a new directory was created
+     */
+    public static boolean createDirectoryIfNotExists(Path path)
+    {
+        return ifNotExists(path, Files::createDirectory);
+    }
+
+    /**
+     * @param path create directory (and parents) if not exists
+     * @throws IOError if cannot perform the operation
+     * @return true if a new directory was created
+     */
+    public static boolean createDirectoriesIfNotExists(Path path)
+    {
+        return ifNotExists(path, Files::createDirectories);
+    }
+
+    /**
+     * @param path create directory if not exists and action can be performed
+     * @return true if a new directory was created, false otherwise (for any reason)
+     */
+    public static boolean tryCreateDirectory(Path path)
+    {
+        return tryConsume(path, Files::createDirectory);
+    }
+
+    /**
+     * @param path create directory (and parents) if not exists and action can be performed
+     * @return true if the new directory was created, false otherwise (for any reason)
+     */
+    public static boolean tryCreateDirectories(Path path)
+    {
+        if (exists(path))
+            return false;
+
+        tryCreateDirectories(path.toAbsolutePath().getParent());
+        return tryCreateDirectory(path);
+    }
+
+    /**
+     * @return file if exists, otherwise nearest parent that exists; null if nothing in path exists
+     */
+    public static Path findExistingAncestor(Path file)
+    {
+        if (!file.equals(file.normalize()))
+            throw new IllegalArgumentException("Must be invoked on a path without redundant elements");
+
+        Path parent = file;
+        while (parent != null && !Files.exists(parent))
+            parent = parent.getParent();
+        return parent;
+    }
+
+    /**
+     * 1) Convert to an absolute path without redundant path elements;
+     * 2) If the file exists, resolve any links to the underlying fille;
+     * 3) If the file does not exist, find the first ancestor that does and resolve the path from there
+     */
+    public static Path toCanonicalPath(Path file)
+    {
+        Preconditions.checkNotNull(file);
+
+        file = file.toAbsolutePath().normalize();
+        Path parent = findExistingAncestor(file);
+
+        if (parent == null)
+            return file;
+        if (parent == file)
+            return toRealPath(file);
+        return toRealPath(parent).resolve(parent.relativize(file));
+    }
+
+    private static Path toRealPath(Path path)
+    {
+        try
+        {
+            return path.toRealPath();
+        }
+        catch (IOException e)
+        {
+            throw propagateUnchecked(e, path, false);
+        }
+    }
+
+    /**
+     * Return true if file's canonical path is contained in folder's canonical path.
+     *
+     * Propagates any exceptions encountered finding canonical paths.
+     */
+    public static boolean isContained(Path folder, Path file)
+    {
+        Path realFolder = toCanonicalPath(folder), realFile = toCanonicalPath(file);
+        return realFile.startsWith(realFolder);
+    }
+
+    @VisibleForTesting
+    static public void runOnExitThreadsAndClear()
+    {
+        DeleteOnExit.runOnExitThreadsAndClear();
+    }
+
+    static public void clearOnExitThreads()
+    {
+        DeleteOnExit.clearOnExitThreads();
+    }
+
+
+    private static final class DeleteOnExit implements Runnable
+    {
+        private boolean isRegistered;
+        private final Set<Path> deleteRecursivelyOnExit = new HashSet<>();
+        private final Set<Path> deleteOnExit = new HashSet<>();
+
+        private static List<Thread> onExitThreads = new ArrayList<>();
+
+        private static void runOnExitThreadsAndClear()
+        {
+            List<Thread> toRun;
+            synchronized (onExitThreads)
+            {
+                toRun = new ArrayList<>(onExitThreads);
+                onExitThreads.clear();
+            }
+            Runtime runtime = Runtime.getRuntime();
+            toRun.forEach(onExitThread -> {
+                try
+                {
+                    runtime.removeShutdownHook(onExitThread);
+                    //noinspection CallToThreadRun
+                    onExitThread.run();
+                }
+                catch (Exception ex)
+                {
+                    logger.warn("Exception thrown when cleaning up files to delete on exit, continuing.", ex);
+                }
+            });
+        }
+
+        private static void clearOnExitThreads()
+        {
+            synchronized (onExitThreads)
+            {
+                Runtime runtime = Runtime.getRuntime();
+                onExitThreads.forEach(runtime::removeShutdownHook);
+                onExitThreads.clear();
+            }
+        }
+
+        DeleteOnExit()
+        {
+            final Thread onExitThread = new Thread(this); // checkstyle: permit this instantiation
+            synchronized (onExitThreads)
+            {
+                onExitThreads.add(onExitThread);
+            }
+            Runtime.getRuntime().addShutdownHook(onExitThread);
+        }
+
+        synchronized void add(Path path, boolean recursive)
+        {
+            if (!isRegistered)
+            {
+                isRegistered = true;
+            }
+            logger.trace("Scheduling deferred {}deletion of file: {}", recursive ? "recursive " : "", path);
+            (recursive ? deleteRecursivelyOnExit : deleteOnExit).add(path);
+        }
+
+        public void run()
+        {
+            for (Path path : deleteOnExit)
+            {
+                try
+                {
+                    if (exists(path))
+                        delete(path);
+                }
+                catch (Throwable t)
+                {
+                    logger.warn("Failed to delete {} on exit", path, t);
+                }
+            }
+            for (Path path : deleteRecursivelyOnExit)
+            {
+                try
+                {
+                    if (exists(path))
+                        deleteRecursive(path);
+                }
+                catch (Throwable t)
+                {
+                    logger.warn("Failed to delete {} on exit", path, t);
+                }
+            }
+        }
+    }
+    private static final DeleteOnExit ON_EXIT = new DeleteOnExit();
+
+    public interface IOConsumer { void accept(Path path) throws IOException; }
+    public interface IOToLongFunction<V> { long apply(V path) throws IOException; }
+
+    private static boolean ifNotExists(Path path, IOConsumer consumer)
+    {
+        try
+        {
+            consumer.accept(path);
+            return true;
+        }
+        catch (FileAlreadyExistsException fae)
+        {
+            return false;
+        }
+        catch (IOException e)
+        {
+            throw propagateUnchecked(e, path, true);
+        }
+    }
+
+    private static boolean tryConsume(Path path, IOConsumer function)
+    {
+        try
+        {
+            function.accept(path);
+            return true;
+        }
+        catch (IOException e)
+        {
+            return false;
+        }
+    }
+
+    private static long tryOnPath(Path path, IOToLongFunction<Path> function)
+    {
+        try
+        {
+            return function.apply(path);
+        }
+        catch (IOException e)
+        {
+            return 0L;
+        }
+    }
+
+    private static long tryOnFileStore(Path path, IOToLongFunction<FileStore> function)
+    {
+        return tryOnFileStore(path, function, ignore -> {});
+    }
+
+    private static long tryOnFileStore(Path path, IOToLongFunction<FileStore> function, Consumer<IOException> orElse)
+    {
+        try
+        {
+            Path ancestor = findExistingAncestor(path.toAbsolutePath().normalize());
+            if (ancestor == null)
+            {
+                orElse.accept(new NoSuchFileException(path.toString()));
+                return 0L;
+            }
+            return function.apply(Files.getFileStore(ancestor));
+        }
+        catch (IOException e)
+        {
+            orElse.accept(e);
+            return 0L;
+        }
+    }
+
+    /**
+     * Returns the number of bytes (determined by the provided MethodHandle) on the specified partition.
+     * <p>This method handles large file system by returning {@code Long.MAX_VALUE} if the  number of available bytes
+     * overflow. See <a href='https://bugs.openjdk.java.net/browse/JDK-8179320'>JDK-8179320</a> for more information</p>
+     *
+     * @param path the partition (or a file within it)
+     */
+    public static long tryGetSpace(Path path, IOToLongFunction<FileStore> getSpace)
+    {
+        return handleLargeFileSystem(tryOnFileStore(path, getSpace));
+    }
+
+    public static long tryGetSpace(Path path, IOToLongFunction<FileStore> getSpace, Consumer<IOException> orElse)
+    {
+        return handleLargeFileSystem(tryOnFileStore(path, getSpace, orElse));
+    }
+
+    /**
+     * Handle large file system by returning {@code Long.MAX_VALUE} when the size overflows.
+     * @param size returned by the Java's FileStore methods
+     * @return the size or {@code Long.MAX_VALUE} if the size was bigger than {@code Long.MAX_VALUE}
+     */
+    private static long handleLargeFileSystem(long size)
+    {
+        return size < 0 ? Long.MAX_VALUE : size;
+    }
+
+    /**
+     * Private constructor as the class contains only static methods.
+     */
+    private PathUtils()
+    {
+    }
+
+    /**
+     * propagate an IOException as an FSWriteError, FSReadError or UncheckedIOException
+     */
+    public static RuntimeException propagateUnchecked(IOException ioe, Path path, boolean write)
+    {
+        return propagateUnchecked(null, ioe, path, write);
+    }
+
+    /**
+     * propagate an IOException as an FSWriteError, FSReadError or UncheckedIOException
+     */
+    public static RuntimeException propagateUnchecked(String message, IOException ioe, Path path, boolean write)
+    {
+        if (ioe instanceof FileAlreadyExistsException
+            || ioe instanceof NoSuchFileException
+            || ioe instanceof AtomicMoveNotSupportedException
+            || ioe instanceof java.nio.file.DirectoryNotEmptyException
+            || ioe instanceof java.nio.file.FileSystemLoopException
+            || ioe instanceof java.nio.file.NotDirectoryException
+            || ioe instanceof java.nio.file.NotLinkException)
+            throw new UncheckedIOException(message, ioe);
+
+        if (write) throw new FSWriteError(message, ioe, path);
+        else throw new FSReadError(message, ioe, path);
+    }
+
+    /**
+     * propagate an IOException as an FSWriteError, FSReadError or UncheckedIOException - except for NoSuchFileException
+     */
+    public static NoSuchFileException propagateUncheckedOrNoSuchFileException(IOException ioe, Path path, boolean write) throws NoSuchFileException
+    {
+        if (ioe instanceof NoSuchFileException)
+            throw (NoSuchFileException) ioe;
+
+        throw propagateUnchecked(ioe, path, write);
+    }
+
+    /**
+     * propagate an IOException either as itself or an FSWriteError or FSReadError
+     */
+    public static <E extends IOException> E propagate(E ioe, Path path, boolean write) throws E
+    {
+        if (ioe instanceof FileAlreadyExistsException
+            || ioe instanceof NoSuchFileException
+            || ioe instanceof AtomicMoveNotSupportedException
+            || ioe instanceof java.nio.file.DirectoryNotEmptyException
+            || ioe instanceof java.nio.file.FileSystemLoopException
+            || ioe instanceof java.nio.file.NotDirectoryException
+            || ioe instanceof java.nio.file.NotLinkException)
+            throw ioe;
+
+        if (write) throw new FSWriteError(ioe, path);
+        else throw new FSReadError(ioe, path);
+    }
+}
diff --git a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java
index 33d0127..1a18813 100644
--- a/src/java/org/apache/cassandra/io/util/RandomAccessReader.java
+++ b/src/java/org/apache/cassandra/io/util/RandomAccessReader.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteOrder;
 
diff --git a/src/java/org/apache/cassandra/io/util/ReadableMemory.java b/src/java/org/apache/cassandra/io/util/ReadableMemory.java
new file mode 100644
index 0000000..ccb717d
--- /dev/null
+++ b/src/java/org/apache/cassandra/io/util/ReadableMemory.java
@@ -0,0 +1,31 @@
+/*
+ * 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.io.util;
+
+import java.nio.ByteBuffer;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface ReadableMemory
+{
+    ByteBuffer[] asByteBuffers(long offset, long length);
+}
diff --git a/src/java/org/apache/cassandra/io/util/ReaderFileProxy.java b/src/java/org/apache/cassandra/io/util/ReaderFileProxy.java
index 3ddb143..5d38e80 100644
--- a/src/java/org/apache/cassandra/io/util/ReaderFileProxy.java
+++ b/src/java/org/apache/cassandra/io/util/ReaderFileProxy.java
@@ -33,4 +33,4 @@
      * Needed for tests. Returns the table's CRC check chance, which is only set for compressed tables.
      */
     double getCrcCheckChance();
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/util/Rebufferer.java b/src/java/org/apache/cassandra/io/util/Rebufferer.java
index 2fc7ffa..9920de9 100644
--- a/src/java/org/apache/cassandra/io/util/Rebufferer.java
+++ b/src/java/org/apache/cassandra/io/util/Rebufferer.java
@@ -81,4 +81,4 @@
             // nothing to do
         }
     };
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/util/RewindableDataInput.java b/src/java/org/apache/cassandra/io/util/RewindableDataInput.java
index c202f60..0a0eee4 100644
--- a/src/java/org/apache/cassandra/io/util/RewindableDataInput.java
+++ b/src/java/org/apache/cassandra/io/util/RewindableDataInput.java
@@ -27,4 +27,4 @@
     void reset(DataPosition mark) throws IOException;
 
     long bytesPastMark(DataPosition mark);
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/util/RewindableDataInputStreamPlus.java b/src/java/org/apache/cassandra/io/util/RewindableDataInputStreamPlus.java
deleted file mode 100644
index a1842bc..0000000
--- a/src/java/org/apache/cassandra/io/util/RewindableDataInputStreamPlus.java
+++ /dev/null
@@ -1,571 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.io.util;
-
-import java.io.Closeable;
-import java.io.File;
-import java.io.FilterInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.RandomAccessFile;
-import java.util.concurrent.atomic.AtomicBoolean;
-
-import static org.apache.cassandra.utils.Throwables.maybeFail;
-import static org.apache.cassandra.utils.Throwables.merge;
-
-/**
- * Adds mark/reset functionality to another input stream by caching read bytes to a memory buffer and
- * spilling to disk if necessary.
- *
- * When the stream is marked via {@link #mark()} or {@link #mark(int)}, up to
- * <code>maxMemBufferSize</code> will be cached in memory (heap). If more than
- * <code>maxMemBufferSize</code> bytes are read while the stream is marked, the
- * following bytes are cached on the <code>spillFile</code> for up to <code>maxDiskBufferSize</code>.
- *
- * Please note that successive calls to {@link #mark()} and {@link #reset()} will write
- * sequentially to the same <code>spillFile</code> until <code>maxDiskBufferSize</code> is reached.
- * At this point, if less than <code>maxDiskBufferSize</code> bytes are currently cached on the
- * <code>spillFile</code>, the remaining bytes are written to the beginning of the file,
- * treating the <code>spillFile</code> as a circular buffer.
- *
- * If more than <code>maxMemBufferSize + maxDiskBufferSize</code> are cached while the stream is marked,
- * the following {@link #reset()} invocation will throw a {@link IllegalStateException}.
- *
- */
-public class RewindableDataInputStreamPlus extends FilterInputStream implements RewindableDataInput, Closeable
-{
-    private boolean marked = false;
-    private boolean exhausted = false;
-    private AtomicBoolean closed = new AtomicBoolean(false);
-
-    protected int memAvailable = 0;
-    protected int diskTailAvailable = 0;
-    protected int diskHeadAvailable = 0;
-
-    private final File spillFile;
-    private final int initialMemBufferSize;
-    private final int maxMemBufferSize;
-    private final int maxDiskBufferSize;
-
-    private volatile byte memBuffer[];
-    private int memBufferSize;
-    private RandomAccessFile spillBuffer;
-
-    private final DataInputPlus dataReader;
-
-    public RewindableDataInputStreamPlus(InputStream in, int initialMemBufferSize, int maxMemBufferSize,
-                                         File spillFile, int maxDiskBufferSize)
-    {
-        super(in);
-        dataReader = new DataInputStreamPlus(this);
-        this.initialMemBufferSize = initialMemBufferSize;
-        this.maxMemBufferSize = maxMemBufferSize;
-        this.spillFile = spillFile;
-        this.maxDiskBufferSize = maxDiskBufferSize;
-    }
-
-    /* RewindableDataInput methods */
-
-    /**
-     * Marks the current position of a stream to return to this position later via the {@link #reset(DataPosition)} method.
-     * @return An empty @link{DataPosition} object
-     */
-    public DataPosition mark()
-    {
-        mark(0);
-        return new RewindableDataInputPlusMark();
-    }
-
-    /**
-     * Rewinds to the previously marked position via the {@link #mark()} method.
-     * @param mark it's not possible to return to a custom position, so this parameter is ignored.
-     * @throws IOException if an error ocurs while resetting
-     */
-    public void reset(DataPosition mark) throws IOException
-    {
-        reset();
-    }
-
-    public long bytesPastMark(DataPosition mark)
-    {
-        return maxMemBufferSize - memAvailable + (diskTailAvailable == -1? 0 : maxDiskBufferSize - diskHeadAvailable - diskTailAvailable);
-    }
-
-
-    protected static class RewindableDataInputPlusMark implements DataPosition
-    {
-    }
-
-    /* InputStream methods */
-
-    public boolean markSupported()
-    {
-        return true;
-    }
-
-    /**
-     * Marks the current position of a stream to return to this position
-     * later via the {@link #reset()} method.
-     * @param readlimit the maximum amount of bytes to cache
-     */
-    public synchronized void mark(int readlimit)
-    {
-        if (marked)
-            throw new IllegalStateException("Cannot mark already marked stream.");
-
-        if (memAvailable > 0 || diskHeadAvailable > 0 || diskTailAvailable > 0)
-            throw new IllegalStateException("Can only mark stream after reading previously marked data.");
-
-        marked = true;
-        memAvailable = maxMemBufferSize;
-        diskHeadAvailable = -1;
-        diskTailAvailable = -1;
-    }
-
-    public synchronized void reset() throws IOException
-    {
-        if (!marked)
-            throw new IOException("Must call mark() before calling reset().");
-
-        if (exhausted)
-            throw new IOException(String.format("Read more than capacity: %d bytes.", maxMemBufferSize + maxDiskBufferSize));
-
-        memAvailable = maxMemBufferSize - memAvailable;
-        memBufferSize = memAvailable;
-
-        if (diskTailAvailable == -1)
-        {
-            diskHeadAvailable = 0;
-            diskTailAvailable = 0;
-        }
-        else
-        {
-            int initialPos = diskTailAvailable > 0 ? 0 : (int)getIfNotClosed(spillBuffer).getFilePointer();
-            int diskMarkpos = initialPos + diskHeadAvailable;
-            getIfNotClosed(spillBuffer).seek(diskMarkpos);
-
-            diskHeadAvailable = diskMarkpos - diskHeadAvailable;
-            diskTailAvailable = (maxDiskBufferSize - diskTailAvailable) - diskMarkpos;
-        }
-
-        marked = false;
-    }
-
-    public int available() throws IOException
-    {
-
-        return super.available() + (marked? 0 : memAvailable + diskHeadAvailable + diskTailAvailable);
-    }
-
-    public int read() throws IOException
-    {
-        int read = readOne();
-        if (read == -1)
-            return read;
-
-        if (marked)
-        {
-            //mark exhausted
-            if (isExhausted(1))
-            {
-                exhausted = true;
-                return read;
-            }
-
-            writeOne(read);
-        }
-
-        return read;
-    }
-
-    public int read(byte[] b, int off, int len) throws IOException
-    {
-        int readBytes = readMulti(b, off, len);
-        if (readBytes == -1)
-            return readBytes;
-
-        if (marked)
-        {
-            //check we have space on buffer
-            if (isExhausted(readBytes))
-            {
-                exhausted = true;
-                return readBytes;
-            }
-
-            writeMulti(b, off, readBytes);
-        }
-
-        return readBytes;
-    }
-
-    private void maybeCreateDiskBuffer() throws IOException
-    {
-        if (spillBuffer == null)
-        {
-            if (!spillFile.getParentFile().exists())
-                spillFile.getParentFile().mkdirs();
-            spillFile.createNewFile();
-
-            this.spillBuffer = new RandomAccessFile(spillFile, "rw");
-        }
-    }
-
-
-    private int readOne() throws IOException
-    {
-        if (!marked)
-        {
-            if (memAvailable > 0)
-            {
-                int pos = memBufferSize - memAvailable;
-                memAvailable--;
-                return getIfNotClosed(memBuffer)[pos] & 0xff;
-            }
-
-            if (diskTailAvailable > 0 || diskHeadAvailable > 0)
-            {
-                int read = getIfNotClosed(spillBuffer).read();
-                if (diskTailAvailable > 0)
-                    diskTailAvailable--;
-                else if (diskHeadAvailable > 0)
-                    diskHeadAvailable++;
-                if (diskTailAvailable == 0)
-                    spillBuffer.seek(0);
-                return read;
-            }
-        }
-
-        return getIfNotClosed(in).read();
-    }
-
-    private boolean isExhausted(int readBytes)
-    {
-        return exhausted || readBytes > memAvailable + (long)(diskTailAvailable == -1? maxDiskBufferSize : diskTailAvailable + diskHeadAvailable);
-    }
-
-    private int readMulti(byte[] b, int off, int len) throws IOException
-    {
-        int readBytes = 0;
-        if (!marked)
-        {
-            if (memAvailable > 0)
-            {
-                readBytes += memAvailable < len ? memAvailable : len;
-                int pos = memBufferSize - memAvailable;
-                System.arraycopy(memBuffer, pos, b, off, readBytes);
-                memAvailable -= readBytes;
-                off += readBytes;
-                len -= readBytes;
-            }
-            if (len > 0 && diskTailAvailable > 0)
-            {
-                int readFromTail = diskTailAvailable < len? diskTailAvailable : len;
-                readFromTail = getIfNotClosed(spillBuffer).read(b, off, readFromTail);
-                readBytes += readFromTail;
-                diskTailAvailable -= readFromTail;
-                off += readFromTail;
-                len -= readFromTail;
-                if (diskTailAvailable == 0)
-                    spillBuffer.seek(0);
-            }
-            if (len > 0 && diskHeadAvailable > 0)
-            {
-                int readFromHead = diskHeadAvailable < len? diskHeadAvailable : len;
-                readFromHead = getIfNotClosed(spillBuffer).read(b, off, readFromHead);
-                readBytes += readFromHead;
-                diskHeadAvailable -= readFromHead;
-                off += readFromHead;
-                len -= readFromHead;
-            }
-        }
-
-        if (len > 0)
-            readBytes += getIfNotClosed(in).read(b, off, len);
-
-        return readBytes;
-    }
-
-    private void writeMulti(byte[] b, int off, int len) throws IOException
-    {
-        if (memAvailable > 0)
-        {
-            if (memBuffer == null)
-                memBuffer = new byte[initialMemBufferSize];
-            int pos = maxMemBufferSize - memAvailable;
-            int memWritten = memAvailable < len? memAvailable : len;
-            if (pos + memWritten >= getIfNotClosed(memBuffer).length)
-                growMemBuffer(pos, memWritten);
-            System.arraycopy(b, off, memBuffer, pos, memWritten);
-            off += memWritten;
-            len -= memWritten;
-            memAvailable -= memWritten;
-        }
-
-        if (len > 0)
-        {
-            if (diskTailAvailable == -1)
-            {
-                maybeCreateDiskBuffer();
-                diskHeadAvailable = (int)spillBuffer.getFilePointer();
-                diskTailAvailable = maxDiskBufferSize - diskHeadAvailable;
-            }
-
-            if (len > 0 && diskTailAvailable > 0)
-            {
-                int diskTailWritten = diskTailAvailable < len? diskTailAvailable : len;
-                getIfNotClosed(spillBuffer).write(b, off, diskTailWritten);
-                off += diskTailWritten;
-                len -= diskTailWritten;
-                diskTailAvailable -= diskTailWritten;
-                if (diskTailAvailable == 0)
-                    spillBuffer.seek(0);
-            }
-
-            if (len > 0 && diskTailAvailable > 0)
-            {
-                int diskHeadWritten = diskHeadAvailable < len? diskHeadAvailable : len;
-                getIfNotClosed(spillBuffer).write(b, off, diskHeadWritten);
-            }
-        }
-    }
-
-    private void writeOne(int value) throws IOException
-    {
-        if (memAvailable > 0)
-        {
-            if (memBuffer == null)
-                memBuffer = new byte[initialMemBufferSize];
-            int pos = maxMemBufferSize - memAvailable;
-            if (pos == getIfNotClosed(memBuffer).length)
-                growMemBuffer(pos, 1);
-            getIfNotClosed(memBuffer)[pos] = (byte)value;
-            memAvailable--;
-            return;
-        }
-
-        if (diskTailAvailable == -1)
-        {
-            maybeCreateDiskBuffer();
-            diskHeadAvailable = (int)spillBuffer.getFilePointer();
-            diskTailAvailable = maxDiskBufferSize - diskHeadAvailable;
-        }
-
-        if (diskTailAvailable > 0 || diskHeadAvailable > 0)
-        {
-            getIfNotClosed(spillBuffer).write(value);
-            if (diskTailAvailable > 0)
-                diskTailAvailable--;
-            else if (diskHeadAvailable > 0)
-                diskHeadAvailable--;
-            if (diskTailAvailable == 0)
-                spillBuffer.seek(0);
-            return;
-        }
-    }
-
-    public int read(byte[] b) throws IOException
-    {
-        return read(b, 0, b.length);
-    }
-
-    private void growMemBuffer(int pos, int writeSize)
-    {
-        int newSize = Math.min(2 * (pos + writeSize), maxMemBufferSize);
-        byte newBuffer[] = new byte[newSize];
-        System.arraycopy(memBuffer, 0, newBuffer, 0, pos);
-        memBuffer = newBuffer;
-    }
-
-    public long skip(long n) throws IOException
-    {
-        long skipped = 0;
-
-        if (marked)
-        {
-            //if marked, we need to cache skipped bytes
-            while (n-- > 0 && read() != -1)
-            {
-                skipped++;
-            }
-            return skipped;
-        }
-
-        if (memAvailable > 0)
-        {
-            skipped += memAvailable < n ? memAvailable : n;
-            memAvailable -= skipped;
-            n -= skipped;
-        }
-        if (n > 0 && diskTailAvailable > 0)
-        {
-            int skipFromTail = diskTailAvailable < n? diskTailAvailable : (int)n;
-            getIfNotClosed(spillBuffer).skipBytes(skipFromTail);
-            diskTailAvailable -= skipFromTail;
-            skipped += skipFromTail;
-            n -= skipFromTail;
-            if (diskTailAvailable == 0)
-                spillBuffer.seek(0);
-        }
-        if (n > 0 && diskHeadAvailable > 0)
-        {
-            int skipFromHead = diskHeadAvailable < n? diskHeadAvailable : (int)n;
-            getIfNotClosed(spillBuffer).skipBytes(skipFromHead);
-            diskHeadAvailable -= skipFromHead;
-            skipped += skipFromHead;
-            n -= skipFromHead;
-        }
-
-        if (n > 0)
-            skipped += getIfNotClosed(in).skip(n);
-
-        return skipped;
-    }
-
-    private <T> T getIfNotClosed(T in) throws IOException
-    {
-        if (closed.get())
-            throw new IOException("Stream closed");
-        return in;
-    }
-
-    public void close() throws IOException
-    {
-        close(true);
-    }
-
-    public void close(boolean closeUnderlying) throws IOException
-    {
-        if (closed.compareAndSet(false, true))
-        {
-            Throwable fail = null;
-            if (closeUnderlying)
-            {
-                try
-                {
-                    super.close();
-                }
-                catch (IOException e)
-                {
-                    fail = merge(fail, e);
-                }
-            }
-            try
-            {
-                if (spillBuffer != null)
-                {
-                    this.spillBuffer.close();
-                    this.spillBuffer = null;
-                }
-            } catch (IOException e)
-            {
-                fail = merge(fail, e);
-            }
-            try
-            {
-                if (spillFile.exists())
-                {
-                    spillFile.delete();
-                }
-            }
-            catch (Throwable e)
-            {
-                fail = merge(fail, e);
-            }
-            maybeFail(fail, IOException.class);
-        }
-    }
-
-    /* DataInputPlus methods */
-
-    public void readFully(byte[] b) throws IOException
-    {
-        dataReader.readFully(b);
-    }
-
-    public void readFully(byte[] b, int off, int len) throws IOException
-    {
-        dataReader.readFully(b, off, len);
-    }
-
-    public int skipBytes(int n) throws IOException
-    {
-        return dataReader.skipBytes(n);
-    }
-
-    public boolean readBoolean() throws IOException
-    {
-        return dataReader.readBoolean();
-    }
-
-    public byte readByte() throws IOException
-    {
-        return dataReader.readByte();
-    }
-
-    public int readUnsignedByte() throws IOException
-    {
-        return dataReader.readUnsignedByte();
-    }
-
-    public short readShort() throws IOException
-    {
-        return dataReader.readShort();
-    }
-
-    public int readUnsignedShort() throws IOException
-    {
-        return dataReader.readUnsignedShort();
-    }
-
-    public char readChar() throws IOException
-    {
-        return dataReader.readChar();
-    }
-
-    public int readInt() throws IOException
-    {
-        return dataReader.readInt();
-    }
-
-    public long readLong() throws IOException
-    {
-        return dataReader.readLong();
-    }
-
-    public float readFloat() throws IOException
-    {
-        return dataReader.readFloat();
-    }
-
-    public double readDouble() throws IOException
-    {
-        return dataReader.readDouble();
-    }
-
-    public String readLine() throws IOException
-    {
-        return dataReader.readLine();
-    }
-
-    public String readUTF() throws IOException
-    {
-        return dataReader.readUTF();
-    }
-}
diff --git a/src/java/org/apache/cassandra/io/util/SequentialWriter.java b/src/java/org/apache/cassandra/io/util/SequentialWriter.java
index 9ad944b..431ece3 100644
--- a/src/java/org/apache/cassandra/io/util/SequentialWriter.java
+++ b/src/java/org/apache/cassandra/io/util/SequentialWriter.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
@@ -114,7 +113,7 @@
                 FileChannel channel = FileChannel.open(file.toPath(), StandardOpenOption.READ, StandardOpenOption.WRITE, StandardOpenOption.CREATE_NEW);
                 try
                 {
-                    SyncUtil.trySyncDir(file.getParentFile());
+                    SyncUtil.trySyncDir(file.parent());
                 }
                 catch (Throwable t)
                 {
@@ -163,7 +162,7 @@
         this.strictFlushing = strictFlushing;
         this.fchannel = (FileChannel)channel;
 
-        this.filePath = file.getAbsolutePath();
+        this.filePath = file.absolutePath();
 
         this.option = option;
     }
diff --git a/src/java/org/apache/cassandra/io/util/SequentialWriterOption.java b/src/java/org/apache/cassandra/io/util/SequentialWriterOption.java
index 61f375b..49093c1 100644
--- a/src/java/org/apache/cassandra/io/util/SequentialWriterOption.java
+++ b/src/java/org/apache/cassandra/io/util/SequentialWriterOption.java
@@ -32,14 +32,15 @@
      * Default write option.
      *
      * <ul>
-     *   <li>buffer size: 64 KB
+     *   <li>buffer size: 64 KiB
      *   <li>buffer type: on heap
      *   <li>trickle fsync: false
-     *   <li>trickle fsync byte interval: 10 MB
+     *   <li>trickle fsync byte interval: 10 MiB
      *   <li>finish on close: false
      * </ul>
      */
     public static final SequentialWriterOption DEFAULT = SequentialWriterOption.newBuilder().build();
+    public static final SequentialWriterOption FINISH_ON_CLOSE = SequentialWriterOption.newBuilder().finishOnClose(true).build();
 
     private final int bufferSize;
     private final BufferType bufferType;
@@ -108,7 +109,7 @@
         private BufferType bufferType = BufferType.ON_HEAP;
         /* default: no trickle fsync */
         private boolean trickleFsync = false;
-        /* default tricle fsync byte interval: 10MB */
+        /* default tricle fsync byte interval: 10MiB */
         private int trickleFsyncByteInterval = 10 * 1024 * 1024;
         private boolean finishOnClose = false;
 
diff --git a/src/java/org/apache/cassandra/io/util/SimpleChunkReader.java b/src/java/org/apache/cassandra/io/util/SimpleChunkReader.java
index bc1a529..05fdb6b 100644
--- a/src/java/org/apache/cassandra/io/util/SimpleChunkReader.java
+++ b/src/java/org/apache/cassandra/io/util/SimpleChunkReader.java
@@ -69,4 +69,4 @@
                              bufferSize,
                              fileLength());
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java b/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java
index 3d83212..a90477f 100644
--- a/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java
+++ b/src/java/org/apache/cassandra/io/util/UnbufferedDataOutputStreamPlus.java
@@ -25,8 +25,6 @@
 
 import org.apache.cassandra.utils.memory.MemoryUtil;
 
-import com.google.common.base.Function;
-
 /**
  * Base class for DataOutput implementations that does not have an optimized implementations of Plus methods
  * and does no buffering.
diff --git a/src/java/org/apache/cassandra/locator/AbstractReplicaCollection.java b/src/java/org/apache/cassandra/locator/AbstractReplicaCollection.java
index 2ec555c..cc21062 100644
--- a/src/java/org/apache/cassandra/locator/AbstractReplicaCollection.java
+++ b/src/java/org/apache/cassandra/locator/AbstractReplicaCollection.java
@@ -23,16 +23,21 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
 
+import java.util.AbstractList;
 import java.util.AbstractMap;
 import java.util.AbstractSet;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Comparator;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Objects;
+import java.util.RandomAccess;
 import java.util.Set;
+import java.util.Spliterator;
 import java.util.function.BiConsumer;
 import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -43,6 +48,9 @@
  * A collection like class for Replica objects. Since the Replica class contains inetaddress, range, and
  * transient replication status, basic contains and remove methods can be ambiguous. Replicas forces you
  * to be explicit about what you're checking the container for, or removing from it.
+ *
+ * TODO: there's nothing about this collection that's unique to Replicas, and the implementation
+ *       could make a useful general purpose immutable list<->set
  */
 public abstract class AbstractReplicaCollection<C extends AbstractReplicaCollection<C>> implements ReplicaCollection<C>
 {
@@ -67,8 +75,10 @@
      * A simple list with no comodification checks and immutability by default (only append permitted, and only one initial copy)
      * this permits us to reduce the amount of garbage generated, by not wrapping iterators or unnecessarily copying
      * and reduces the amount of indirection necessary, as well as ensuring monomorphic callsites
+     *
+     * TODO flatten into AbstractReplicaCollection?
      */
-    protected static class ReplicaList implements Iterable<Replica>
+    protected final static class ReplicaList implements Iterable<Replica>
     {
         private static final Replica[] EMPTY = new Replica[0];
         Replica[] contents;
@@ -123,7 +133,7 @@
             return new ReplicaList(contents, this.begin + begin, end - begin);
         }
 
-        public ReplicaList sorted(Comparator<Replica> comparator)
+        public ReplicaList sorted(Comparator<? super Replica> comparator)
         {
             Replica[] copy = Arrays.copyOfRange(contents, begin, begin + size);
             Arrays.sort(copy, comparator);
@@ -135,6 +145,37 @@
             return Arrays.stream(contents, begin, begin + size);
         }
 
+        @Override
+        public void forEach(Consumer<? super Replica> forEach)
+        {
+            for (int i = begin, end = begin + size ; i < end ; ++i)
+                forEach.accept(contents[i]);
+        }
+
+        /** see {@link ReplicaCollection#count(Predicate)}*/
+        public int count(Predicate<? super Replica> test)
+        {
+            int count = 0;
+            for (int i = begin, end = i + size ; i < end ; ++i)
+                if (test.test(contents[i]))
+                    ++count;
+            return count;
+        }
+
+        public final boolean anyMatch(Predicate<? super Replica> predicate)
+        {
+            for (int i = begin, end = i + size ; i < end ; ++i)
+                if (predicate.test(contents[i]))
+                    return true;
+            return false;
+        }
+
+        @Override
+        public Spliterator<Replica> spliterator()
+        {
+            return Arrays.spliterator(contents, begin, begin + size);
+        }
+
         // we implement our own iterator, because it is trivial to do so, and in monomorphic call sites
         // will compile down to almost optimal indexed for loop
         @Override
@@ -161,7 +202,7 @@
 
         // we implement our own iterator, because it is trivial to do so, and in monomorphic call sites
         // will compile down to almost optimal indexed for loop
-        public <K> Iterator<K> transformIterator(Function<Replica, K> function)
+        public <K> Iterator<K> transformIterator(Function<? super Replica, ? extends K> function)
         {
             return new Iterator<K>()
             {
@@ -184,7 +225,7 @@
         // we implement our own iterator, because it is trivial to do so, and in monomorphic call sites
         // will compile down to almost optimal indexed for loop
         // in this case, especially, it is impactful versus Iterables.limit(Iterables.filter())
-        private Iterator<Replica> filterIterator(Predicate<Replica> predicate, int limit)
+        private Iterator<Replica> filterIterator(Predicate<? super Replica> predicate, int limit)
         {
             return new Iterator<Replica>()
             {
@@ -216,6 +257,12 @@
             };
         }
 
+        protected <T> void forEach(Function<? super Replica, T> function, Consumer<? super T> action)
+        {
+            for (int i = begin, end = begin + size ; i < end ; ++i)
+                action.accept(function.apply(contents[i]));
+        }
+
         @VisibleForTesting
         public boolean equals(Object to)
         {
@@ -261,6 +308,12 @@
             public boolean contains(Object o) { return containsKey(o); }
             @Override
             public Iterator<K> iterator() { return list.transformIterator(toKey); }
+
+            @Override
+            public void forEach(Consumer<? super K> action)
+            {
+                list.forEach(toKey, action);
+            }
         }
 
         class EntrySet extends AbstractImmutableSet<Entry<K, Replica>>
@@ -316,7 +369,7 @@
         public boolean containsKey(Object key)
         {
             Preconditions.checkNotNull(key);
-            return get((K)key) != null;
+            return get(key) != null;
         }
 
         public Replica get(Object key)
@@ -366,6 +419,35 @@
         }
     }
 
+    static class AsList<T> extends AbstractList<T> implements RandomAccess
+    {
+        final Function<Replica, T> view;
+        final ReplicaList list;
+
+        AsList(Function<Replica, T> view, ReplicaList list)
+        {
+            this.view = view;
+            this.list = list;
+        }
+
+        public final T get(int index)
+        {
+            return view.apply(list.get(index));
+        }
+
+        public final int size()
+        {
+            return list.size;
+        }
+
+        @Override
+        public final void forEach(Consumer<? super T> forEach)
+        {
+            list.forEach(view, forEach);
+        }
+    }
+
+
     protected final ReplicaList list;
     AbstractReplicaCollection(ReplicaList list)
     {
@@ -396,24 +478,30 @@
         return snapshot(subList);
     }
 
-    /** see {@link ReplicaCollection#count(Predicate)}*/
-    public int count(Predicate<Replica> predicate)
+    public final <T> List<T> asList(Function<Replica, T> view)
     {
-        int count = 0;
-        for (int i = 0 ; i < list.size() ; ++i)
-            if (predicate.test(list.get(i)))
-                ++count;
-        return count;
+        return new AsList<>(view, list);
+    }
+
+    /** see {@link ReplicaCollection#count(Predicate)}*/
+    public final int count(Predicate<? super Replica> test)
+    {
+        return list.count(test);
+    }
+
+    public final boolean anyMatch(Predicate<? super Replica> test)
+    {
+        return list.anyMatch(test);
     }
 
     /** see {@link ReplicaCollection#filter(Predicate)}*/
-    public final C filter(Predicate<Replica> predicate)
+    public final C filter(Predicate<? super Replica> predicate)
     {
         return filter(predicate, Integer.MAX_VALUE);
     }
 
     /** see {@link ReplicaCollection#filter(Predicate, int)}*/
-    public final C filter(Predicate<Replica> predicate, int limit)
+    public final C filter(Predicate<? super Replica> predicate, int limit)
     {
         if (isEmpty())
             return snapshot();
@@ -457,19 +545,19 @@
     }
 
     /** see {@link ReplicaCollection#filterLazily(Predicate)}*/
-    public final Iterable<Replica> filterLazily(Predicate<Replica> predicate)
+    public final Iterable<Replica> filterLazily(Predicate<? super Replica> predicate)
     {
         return filterLazily(predicate, Integer.MAX_VALUE);
     }
 
     /** see {@link ReplicaCollection#filterLazily(Predicate,int)}*/
-    public final Iterable<Replica> filterLazily(Predicate<Replica> predicate, int limit)
+    public final Iterable<Replica> filterLazily(Predicate<? super Replica> predicate, int limit)
     {
         return () -> list.filterIterator(predicate, limit);
     }
 
     /** see {@link ReplicaCollection#sorted(Comparator)}*/
-    public final C sorted(Comparator<Replica> comparator)
+    public final C sorted(Comparator<? super Replica> comparator)
     {
         return snapshot(list.sorted(comparator));
     }
@@ -494,6 +582,11 @@
         return list.iterator();
     }
 
+    public final void forEach(Consumer<? super Replica> forEach)
+    {
+        list.forEach(forEach);
+    }
+
     public final Stream<Replica> stream() { return list.stream(); }
 
     /**
diff --git a/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java b/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
index 909a7f6..c233fc0 100644
--- a/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
+++ b/src/java/org/apache/cassandra/locator/AbstractReplicationStrategy.java
@@ -24,6 +24,7 @@
 import java.util.Collections;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
 
 import com.google.common.base.Preconditions;
 
@@ -32,6 +33,7 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.WriteType;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.RingPosition;
@@ -39,6 +41,7 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict;
 import org.apache.cassandra.service.AbstractWriteResponseHandler;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.DatacenterSyncWriteResponseHandler;
 import org.apache.cassandra.service.DatacenterWriteResponseHandler;
 import org.apache.cassandra.service.WriteResponseHandler;
@@ -128,17 +131,20 @@
      */
     public abstract EndpointsForRange calculateNaturalReplicas(Token searchToken, TokenMetadata tokenMetadata);
 
-    public <T> AbstractWriteResponseHandler<T> getWriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan,
+    public <T> AbstractWriteResponseHandler<T> getWriteResponseHandler(ReplicaPlan.ForWrite replicaPlan,
                                                                        Runnable callback,
                                                                        WriteType writeType,
+                                                                       Supplier<Mutation> hintOnFailure,
                                                                        long queryStartNanoTime)
     {
-        return getWriteResponseHandler(replicaPlan, callback, writeType, queryStartNanoTime, DatabaseDescriptor.getIdealConsistencyLevel());
+        return getWriteResponseHandler(replicaPlan, callback, writeType, hintOnFailure,
+                                       queryStartNanoTime, DatabaseDescriptor.getIdealConsistencyLevel());
     }
 
-    public <T> AbstractWriteResponseHandler<T> getWriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan,
+    public <T> AbstractWriteResponseHandler<T> getWriteResponseHandler(ReplicaPlan.ForWrite replicaPlan,
                                                                        Runnable callback,
                                                                        WriteType writeType,
+                                                                       Supplier<Mutation> hintOnFailure,
                                                                        long queryStartNanoTime,
                                                                        ConsistencyLevel idealConsistencyLevel)
     {
@@ -146,15 +152,15 @@
         if (replicaPlan.consistencyLevel().isDatacenterLocal())
         {
             // block for in this context will be localnodes block.
-            resultResponseHandler = new DatacenterWriteResponseHandler<T>(replicaPlan, callback, writeType, queryStartNanoTime);
+            resultResponseHandler = new DatacenterWriteResponseHandler<T>(replicaPlan, callback, writeType, hintOnFailure, queryStartNanoTime);
         }
         else if (replicaPlan.consistencyLevel() == ConsistencyLevel.EACH_QUORUM && (this instanceof NetworkTopologyStrategy))
         {
-            resultResponseHandler = new DatacenterSyncWriteResponseHandler<T>(replicaPlan, callback, writeType, queryStartNanoTime);
+            resultResponseHandler = new DatacenterSyncWriteResponseHandler<T>(replicaPlan, callback, writeType, hintOnFailure, queryStartNanoTime);
         }
         else
         {
-            resultResponseHandler = new WriteResponseHandler<T>(replicaPlan, callback, writeType, queryStartNanoTime);
+            resultResponseHandler = new WriteResponseHandler<T>(replicaPlan, callback, writeType, hintOnFailure, queryStartNanoTime);
         }
 
         //Check if tracking the ideal consistency level is configured
@@ -173,6 +179,7 @@
                 AbstractWriteResponseHandler<T> idealHandler = getWriteResponseHandler(replicaPlan.withConsistencyLevel(idealConsistencyLevel),
                                                                                        callback,
                                                                                        writeType,
+                                                                                       hintOnFailure,
                                                                                        queryStartNanoTime,
                                                                                        idealConsistencyLevel);
                 resultResponseHandler.setIdealCLResponseHandler(idealHandler);
@@ -280,7 +287,17 @@
 
     public abstract void validateOptions() throws ConfigurationException;
 
-    public abstract void maybeWarnOnOptions();
+    @Deprecated // use #maybeWarnOnOptions(ClientState) instead
+    public void maybeWarnOnOptions()
+    {
+        // nothing to do here
+    }
+
+    public void maybeWarnOnOptions(ClientState state)
+    {
+        maybeWarnOnOptions();
+    }
+
 
     /*
      * The options recognized by the strategy.
@@ -378,12 +395,13 @@
                                                    Class<? extends AbstractReplicationStrategy> strategyClass,
                                                    TokenMetadata tokenMetadata,
                                                    IEndpointSnitch snitch,
-                                                   Map<String, String> strategyOptions) throws ConfigurationException
+                                                   Map<String, String> strategyOptions,
+                                                   ClientState state) throws ConfigurationException
     {
         AbstractReplicationStrategy strategy = createInternal(keyspaceName, strategyClass, tokenMetadata, snitch, strategyOptions);
         strategy.validateExpectedOptions();
         strategy.validateOptions();
-        strategy.maybeWarnOnOptions();
+        strategy.maybeWarnOnOptions(state);
         if (strategy.hasTransientReplicas() && !DatabaseDescriptor.isTransientReplicationEnabled())
         {
             throw new ConfigurationException("Transient replication is disabled. Enable in cassandra.yaml to use.");
@@ -415,6 +433,7 @@
         try
         {
             ReplicationFactor rf = ReplicationFactor.fromString(s);
+            
             if (rf.hasTransientReplicas())
             {
                 if (DatabaseDescriptor.getNumTokens() > 1)
diff --git a/src/java/org/apache/cassandra/locator/CloudstackSnitch.java b/src/java/org/apache/cassandra/locator/CloudstackSnitch.java
index be6d3c4..d857953 100644
--- a/src/java/org/apache/cassandra/locator/CloudstackSnitch.java
+++ b/src/java/org/apache/cassandra/locator/CloudstackSnitch.java
@@ -20,9 +20,7 @@
 import java.io.DataInputStream;
 import java.io.BufferedInputStream;
 import java.io.BufferedReader;
-import java.io.FileReader;
 import java.io.IOException;
-import java.io.File;
 import java.net.HttpURLConnection;
 import java.net.URL;
 import java.net.URI;
@@ -31,6 +29,8 @@
 import java.util.regex.Pattern;
 import java.util.regex.Matcher;
 
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileReader;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.cassandra.db.SystemKeyspace;
diff --git a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
index 976e1da..2248248 100644
--- a/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
+++ b/src/java/org/apache/cassandra/locator/DynamicEndpointSnitch.java
@@ -271,7 +271,7 @@
 
     private void updateScores() // this is expensive
     {
-        if (!StorageService.instance.isGossipActive())
+        if (!StorageService.instance.isInitialized())
             return;
         if (!registered)
         {
@@ -320,7 +320,7 @@
 
     public Map<InetAddress, Double> getScores()
     {
-        return scores.entrySet().stream().collect(Collectors.toMap(address -> address.getKey().address, Map.Entry::getValue));
+        return scores.entrySet().stream().collect(Collectors.toMap(address -> address.getKey().getAddress(), Map.Entry::getValue));
     }
 
     public Map<String, Double> getScoresWithPort()
diff --git a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java
index f9de755..45c387d 100644
--- a/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java
+++ b/src/java/org/apache/cassandra/locator/Ec2MultiRegionSnitch.java
@@ -73,7 +73,7 @@
             throw new RuntimeException(e);
         }
         Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_ADDRESS_AND_PORT, StorageService.instance.valueFactory.internalAddressAndPort(address));
-        Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_IP, StorageService.instance.valueFactory.internalIP(address.address));
+        Gossiper.instance.addLocalApplicationState(ApplicationState.INTERNAL_IP, StorageService.instance.valueFactory.internalIP(address.getAddress()));
         Gossiper.instance.register(new ReconnectableSnitchHelper(this, ec2region, true));
     }
 }
diff --git a/src/java/org/apache/cassandra/locator/Endpoints.java b/src/java/org/apache/cassandra/locator/Endpoints.java
index c1a9282..1561db2 100644
--- a/src/java/org/apache/cassandra/locator/Endpoints.java
+++ b/src/java/org/apache/cassandra/locator/Endpoints.java
@@ -21,15 +21,12 @@
 import org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict;
 import org.apache.cassandra.utils.FBUtilities;
 
-import java.util.AbstractList;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Set;
 
-import com.google.common.collect.Lists;
-
 /**
  * A collection of Endpoints for a given ring position.  This will typically reside in a ReplicaLayout,
  * representing some subset of the endpoints for the Token or Range
@@ -56,20 +53,14 @@
         return byEndpoint().keySet();
     }
 
+    public InetAddressAndPort endpoint(int i)
+    {
+        return get(i).endpoint();
+    }
+
     public List<InetAddressAndPort> endpointList()
     {
-        return new AbstractList<InetAddressAndPort>()
-        {
-            public InetAddressAndPort get(int index)
-            {
-                return list.get(index).endpoint();
-            }
-
-            public int size()
-            {
-                return list.size;
-            }
-        };
+        return asList(Replica::endpoint);
     }
 
     public Map<InetAddressAndPort, Replica> byEndpoint()
@@ -89,6 +80,11 @@
                         replica);
     }
 
+    public boolean contains(InetAddressAndPort endpoint)
+    {
+        return endpoint != null && byEndpoint().containsKey(endpoint);
+    }
+
     public E withoutSelf()
     {
         InetAddressAndPort self = FBUtilities.getBroadcastAddressAndPort();
diff --git a/src/java/org/apache/cassandra/locator/EndpointsByReplica.java b/src/java/org/apache/cassandra/locator/EndpointsByReplica.java
index 72d8751..9590842 100644
--- a/src/java/org/apache/cassandra/locator/EndpointsByReplica.java
+++ b/src/java/org/apache/cassandra/locator/EndpointsByReplica.java
@@ -23,8 +23,6 @@
 import com.google.common.collect.Maps;
 import org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict;
 
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 
 public class EndpointsByReplica extends ReplicaMultimap<Replica, EndpointsForRange>
diff --git a/src/java/org/apache/cassandra/locator/EndpointsForToken.java b/src/java/org/apache/cassandra/locator/EndpointsForToken.java
index c709988..70cd763 100644
--- a/src/java/org/apache/cassandra/locator/EndpointsForToken.java
+++ b/src/java/org/apache/cassandra/locator/EndpointsForToken.java
@@ -19,7 +19,11 @@
 package org.apache.cassandra.locator;
 
 import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
 
 import java.util.Arrays;
 import java.util.Collection;
@@ -67,6 +71,11 @@
         return new EndpointsForToken(token, newList, byEndpoint);
     }
 
+    public Replica lookup(InetAddressAndPort endpoint)
+    {
+        return byEndpoint().get(endpoint);
+    }
+
     public static class Builder extends EndpointsForToken implements ReplicaCollection.Builder<EndpointsForToken>
     {
         boolean built;
@@ -146,4 +155,34 @@
         if (replicas.isEmpty()) return empty(token);
         return builder(token, replicas.size()).addAll(replicas).build();
     }
+
+    public static EndpointsForToken natural(Keyspace keyspace, Token token)
+    {
+        return keyspace.getReplicationStrategy().getNaturalReplicasForToken(token);
+    }
+
+    public static EndpointsForToken natural(AbstractReplicationStrategy replicationStrategy, Token token)
+    {
+        return replicationStrategy.getNaturalReplicasForToken(token);
+    }
+
+    public static EndpointsForToken natural(TableMetadata table, Token token)
+    {
+        return natural(Keyspace.open(table.keyspace), token);
+    }
+
+    public static EndpointsForToken pending(TableMetadata table, Token token)
+    {
+        return pending(table.keyspace, token);
+    }
+
+    public static EndpointsForToken pending(Keyspace keyspace, Token token)
+    {
+        return pending(keyspace.getName(), token);
+    }
+
+    public static EndpointsForToken pending(String keyspace, Token token)
+    {
+        return StorageService.instance.getTokenMetadata().pendingEndpointsForToken(token, keyspace);
+    }
 }
diff --git a/src/java/org/apache/cassandra/locator/IEndpointSnitch.java b/src/java/org/apache/cassandra/locator/IEndpointSnitch.java
index 381a642..0120391 100644
--- a/src/java/org/apache/cassandra/locator/IEndpointSnitch.java
+++ b/src/java/org/apache/cassandra/locator/IEndpointSnitch.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.locator;
 
+import java.net.InetSocketAddress;
 import java.util.Set;
 
 import org.apache.cassandra.utils.FBUtilities;
@@ -55,6 +56,11 @@
         return getDatacenter(FBUtilities.getBroadcastAddressAndPort());
     }
 
+    default String getDatacenter(InetSocketAddress endpoint)
+    {
+        return getDatacenter(InetAddressAndPort.getByAddress(endpoint));
+    }
+
     default public String getDatacenter(Replica replica)
     {
         return getDatacenter(replica.endpoint());
diff --git a/src/java/org/apache/cassandra/locator/InOurDc.java b/src/java/org/apache/cassandra/locator/InOurDc.java
new file mode 100644
index 0000000..34e8ef8
--- /dev/null
+++ b/src/java/org/apache/cassandra/locator/InOurDc.java
@@ -0,0 +1,104 @@
+/*
+ * 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.locator;
+
+import java.util.function.Predicate;
+
+import static org.apache.cassandra.config.DatabaseDescriptor.getEndpointSnitch;
+import static org.apache.cassandra.config.DatabaseDescriptor.getLocalDataCenter;
+
+public class InOurDc
+{
+    private static ReplicaTester replicas;
+    private static EndpointTester endpoints;
+
+    final String dc;
+    final IEndpointSnitch snitch;
+
+    private InOurDc(String dc, IEndpointSnitch snitch)
+    {
+        this.dc = dc;
+        this.snitch = snitch;
+    }
+
+    boolean stale()
+    {
+        return dc != getLocalDataCenter()
+                || snitch != getEndpointSnitch()
+                // this final clause checks if somehow the snitch/localDc have got out of whack;
+                // presently, this is possible but very unlikely, but this check will also help
+                // resolve races on these global fields as well
+                || !dc.equals(snitch.getLocalDatacenter());
+    }
+
+    private static final class ReplicaTester extends InOurDc implements Predicate<Replica>
+    {
+        private ReplicaTester(String dc, IEndpointSnitch snitch)
+        {
+            super(dc, snitch);
+        }
+
+        @Override
+        public boolean test(Replica replica)
+        {
+            return dc.equals(snitch.getDatacenter(replica.endpoint()));
+        }
+    }
+
+    private static final class EndpointTester extends InOurDc implements Predicate<InetAddressAndPort>
+    {
+        private EndpointTester(String dc, IEndpointSnitch snitch)
+        {
+            super(dc, snitch);
+        }
+
+        @Override
+        public boolean test(InetAddressAndPort endpoint)
+        {
+            return dc.equals(snitch.getDatacenter(endpoint));
+        }
+    }
+
+    public static Predicate<Replica> replicas()
+    {
+        ReplicaTester cur = replicas;
+        if (cur == null || cur.stale())
+            replicas = cur = new ReplicaTester(getLocalDataCenter(), getEndpointSnitch());
+        return cur;
+    }
+
+    public static Predicate<InetAddressAndPort> endpoints()
+    {
+        EndpointTester cur = endpoints;
+        if (cur == null || cur.stale())
+            endpoints = cur = new EndpointTester(getLocalDataCenter(), getEndpointSnitch());
+        return cur;
+    }
+
+    public static boolean isInOurDc(Replica replica)
+    {
+        return replicas().test(replica);
+    }
+
+    public static boolean isInOurDc(InetAddressAndPort endpoint)
+    {
+        return endpoints().test(endpoint);
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/locator/InOurDcTester.java b/src/java/org/apache/cassandra/locator/InOurDcTester.java
deleted file mode 100644
index 514c7ef..0000000
--- a/src/java/org/apache/cassandra/locator/InOurDcTester.java
+++ /dev/null
@@ -1,93 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.locator;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.utils.FBUtilities;
-import java.util.function.Predicate;
-
-public class InOurDcTester
-{
-    private static ReplicaTester replicas;
-    private static EndpointTester endpoints;
-
-    final String dc;
-    final IEndpointSnitch snitch;
-
-    private InOurDcTester(String dc, IEndpointSnitch snitch)
-    {
-        this.dc = dc;
-        this.snitch = snitch;
-    }
-
-    boolean stale()
-    {
-        return dc != DatabaseDescriptor.getLocalDataCenter()
-                || snitch != DatabaseDescriptor.getEndpointSnitch()
-                // this final clause checks if somehow the snitch/localDc have got out of whack;
-                // presently, this is possible but very unlikely, but this check will also help
-                // resolve races on these global fields as well
-                || !dc.equals(snitch.getLocalDatacenter());
-    }
-
-    private static final class ReplicaTester extends InOurDcTester implements Predicate<Replica>
-    {
-        private ReplicaTester(String dc, IEndpointSnitch snitch)
-        {
-            super(dc, snitch);
-        }
-
-        @Override
-        public boolean test(Replica replica)
-        {
-            return dc.equals(snitch.getDatacenter(replica.endpoint()));
-        }
-    }
-
-    private static final class EndpointTester extends InOurDcTester implements Predicate<InetAddressAndPort>
-    {
-        private EndpointTester(String dc, IEndpointSnitch snitch)
-        {
-            super(dc, snitch);
-        }
-
-        @Override
-        public boolean test(InetAddressAndPort endpoint)
-        {
-            return dc.equals(snitch.getDatacenter(endpoint));
-        }
-    }
-
-    public static Predicate<Replica> replicas()
-    {
-        ReplicaTester cur = replicas;
-        if (cur == null || cur.stale())
-            replicas = cur = new ReplicaTester(DatabaseDescriptor.getLocalDataCenter(), DatabaseDescriptor.getEndpointSnitch());
-        return cur;
-    }
-
-    public static Predicate<InetAddressAndPort> endpoints()
-    {
-        EndpointTester cur = endpoints;
-        if (cur == null || cur.stale())
-            endpoints = cur = new EndpointTester(DatabaseDescriptor.getLocalDataCenter(), DatabaseDescriptor.getEndpointSnitch());
-        return cur;
-    }
-
-}
diff --git a/src/java/org/apache/cassandra/locator/InetAddressAndPort.java b/src/java/org/apache/cassandra/locator/InetAddressAndPort.java
index 6e67a23..e6a920b 100644
--- a/src/java/org/apache/cassandra/locator/InetAddressAndPort.java
+++ b/src/java/org/apache/cassandra/locator/InetAddressAndPort.java
@@ -22,6 +22,7 @@
 import java.net.Inet4Address;
 import java.net.Inet6Address;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
 import java.util.regex.Pattern;
@@ -51,7 +52,7 @@
  *
  */
 @SuppressWarnings("UnstableApiUsage")
-public final class InetAddressAndPort implements Comparable<InetAddressAndPort>, Serializable
+public final class InetAddressAndPort extends InetSocketAddress implements Comparable<InetAddressAndPort>, Serializable
 {
     private static final long serialVersionUID = 0;
 
@@ -61,23 +62,20 @@
     //to always override the defaults.
     static volatile int defaultPort = 7000;
 
-    public final InetAddress address;
     public final byte[] addressBytes;
-    public final int port;
 
     private InetAddressAndPort(InetAddress address, byte[] addressBytes, int port)
     {
+        super(address, port);
         Preconditions.checkNotNull(address);
         Preconditions.checkNotNull(addressBytes);
         validatePortRange(port);
-        this.address = address;
-        this.port = port;
         this.addressBytes = addressBytes;
     }
 
     public InetAddressAndPort withPort(int port)
     {
-        return new InetAddressAndPort(address, addressBytes, port);
+        return new InetAddressAndPort(getAddress(), addressBytes, port);
     }
 
     private static void validatePortRange(int port)
@@ -89,26 +87,6 @@
     }
 
     @Override
-    public boolean equals(Object o)
-    {
-        if (this == o) return true;
-        if (o == null || getClass() != o.getClass()) return false;
-
-        InetAddressAndPort that = (InetAddressAndPort) o;
-
-        if (port != that.port) return false;
-        return address.equals(that.address);
-    }
-
-    @Override
-    public int hashCode()
-    {
-        int result = address.hashCode();
-        result = 31 * result + port;
-        return result;
-    }
-
-    @Override
     public int compareTo(InetAddressAndPort o)
     {
         int retval = FastByteOperations.compareUnsigned(addressBytes, 0, addressBytes.length, o.addressBytes, 0, o.addressBytes.length);
@@ -117,7 +95,7 @@
             return retval;
         }
 
-        return Integer.compare(port, o.port);
+        return Integer.compare(getPort(), o.getPort());
     }
 
     public String getHostAddressAndPort()
@@ -141,31 +119,56 @@
 
     public String getHostAddress(boolean withPort)
     {
+        return hostAddress(this, withPort);
+    }
+
+    public String getHostName(boolean withPort)
+    {
+        return withPort ? String.format("%s:%s", getHostName(), getPort()) : getHostName();
+    }
+
+    public static String hostAddressAndPort(InetSocketAddress address)
+    {
+        return hostAddress(address, true);
+    }
+
+    public static String hostAddress(InetSocketAddress address, boolean withPort)
+    {
         if (withPort)
         {
-            return HostAndPort.fromParts(address.getHostAddress(), port).toString();
+            return HostAndPort.fromParts(address.getAddress().getHostAddress(), address.getPort()).toString();
         }
         else
         {
-            return address.getHostAddress();
+            return address.getAddress().getHostAddress();
         }
     }
 
     @Override
     public String toString()
     {
-        return toString(true);
+        return toString(this);
     }
 
     public String toString(boolean withPort)
     {
+        return toString(this, withPort);
+    }
+
+    public static String toString(InetSocketAddress address)
+    {
+        return toString(address, true);
+    }
+
+    public static String toString(InetSocketAddress address, boolean withPort)
+    {
         if (withPort)
         {
-            return toString(address, port);
+            return toString(address.getAddress(), address.getPort());
         }
         else
         {
-            return address.toString();
+            return address.getAddress().toString();
         }
     }
 
@@ -237,6 +240,13 @@
         return getByAddressOverrideDefaults(address, null);
     }
 
+    public static InetAddressAndPort getByAddress(InetSocketAddress address)
+    {
+        if (address instanceof InetAddressAndPort)
+            return (InetAddressAndPort) address;
+        return new InetAddressAndPort(address.getAddress(), address.getAddress().getAddress(), address.getPort());
+    }
+
     public static InetAddressAndPort getByAddressOverrideDefaults(InetAddress address, Integer port)
     {
         if (port == null)
@@ -296,18 +306,27 @@
 
         public void serialize(InetAddressAndPort endpoint, DataOutputPlus out, int version) throws IOException
         {
-            byte[] buf = endpoint.addressBytes;
+            serialize(endpoint.addressBytes, endpoint.getPort(), out, version);
+        }
 
+        public void serialize(InetSocketAddress endpoint, DataOutputPlus out, int version) throws IOException
+        {
+            byte[] address = endpoint instanceof InetAddressAndPort ? ((InetAddressAndPort) endpoint).addressBytes : endpoint.getAddress().getAddress();
+            serialize(address, endpoint.getPort(), out, version);
+        }
+
+        void serialize(byte[] address, int port, DataOutputPlus out, int version) throws IOException
+        {
             if (version >= MessagingService.VERSION_40)
             {
-                out.writeByte(buf.length + 2);
-                out.write(buf);
-                out.writeShort(endpoint.port);
+                out.writeByte(address.length + 2);
+                out.write(address);
+                out.writeShort(port);
             }
             else
             {
-                out.writeByte(buf.length);
-                out.write(buf);
+                out.writeByte(address.length);
+                out.write(address);
             }
         }
 
@@ -366,19 +385,24 @@
 
         public long serializedSize(InetAddressAndPort from, int version)
         {
+            return serializedSize((InetSocketAddress) from, version);
+        }
+
+        public long serializedSize(InetSocketAddress from, int version)
+        {
             //4.0 includes a port number
             if (version >= MessagingService.VERSION_40)
             {
-                if (from.address instanceof Inet4Address)
+                if (from.getAddress() instanceof Inet4Address)
                     return 1 + 4 + 2;
-                assert from.address instanceof Inet6Address;
+                assert from.getAddress() instanceof Inet6Address;
                 return 1 + 16 + 2;
             }
             else
             {
-                if (from.address instanceof Inet4Address)
+                if (from.getAddress() instanceof Inet4Address)
                     return 1 + 4;
-                assert from.address instanceof Inet6Address;
+                assert from.getAddress() instanceof Inet6Address;
                 return 1 + 16;
             }
         }
@@ -400,7 +424,7 @@
             {
                 out.writeByte(buf.length + 2);
                 out.write(buf);
-                out.writeShort(endpoint.port);
+                out.writeShort(endpoint.getPort());
             }
             else
             {
@@ -413,16 +437,16 @@
             //4.0 includes a port number
             if (version >= MessagingService.VERSION_40)
             {
-                if (from.address instanceof Inet4Address)
+                if (from.getAddress() instanceof Inet4Address)
                     return 1 + 4 + 2;
-                assert from.address instanceof Inet6Address;
+                assert from.getAddress() instanceof Inet6Address;
                 return 1 + 16 + 2;
             }
             else
             {
-                if (from.address instanceof Inet4Address)
+                if (from.getAddress() instanceof Inet4Address)
                     return 4;
-                assert from.address instanceof Inet6Address;
+                assert from.getAddress() instanceof Inet6Address;
                 return 16;
             }
         }
diff --git a/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java b/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
index 2b4a0ea..1d39bbe 100644
--- a/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
+++ b/src/java/org/apache/cassandra/locator/NetworkTopologyStrategy.java
@@ -20,6 +20,8 @@
 import java.util.*;
 import java.util.Map.Entry;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,6 +32,7 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.TokenMetadata.Topology;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
@@ -38,6 +41,7 @@
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Multimap;
 import com.google.common.collect.Multimaps;
+import com.google.common.collect.Sets;
 
 /**
  * <p>
@@ -261,11 +265,20 @@
      * the "replication_factor" options out into the known datacenters. It is called via reflection from
      * {@link AbstractReplicationStrategy#prepareReplicationStrategyOptions(Class, Map, Map)}.
      *
-     * @param options The proposed strategy options that will be potentially mutated
+     * @param options The proposed strategy options that will be potentially mutated. If empty, replication_factor will
+     *                be added either from previousOptions if one exists, or from default_keyspace_rf configuration.
      * @param previousOptions Any previous strategy options in the case of an ALTER statement
      */
     protected static void prepareOptions(Map<String, String> options, Map<String, String> previousOptions)
     {
+        // add replication_factor only if there is no explicit mention of DCs. Otherwise, non-mentioned DCs will be added with default RF
+        if (options.isEmpty())
+        {
+            String rf = previousOptions.containsKey(REPLICATION_FACTOR) ? previousOptions.get(REPLICATION_FACTOR)
+                                                                        : Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF());
+            options.putIfAbsent(REPLICATION_FACTOR, rf);
+        }
+
         String replication = options.remove(REPLICATION_FACTOR);
 
         if (replication == null && options.size() == 0)
@@ -302,6 +315,15 @@
 
         // Validate the data center names
         super.validateExpectedOptions();
+
+        if (keyspaceName.equalsIgnoreCase(SchemaConstants.AUTH_KEYSPACE_NAME))
+        {
+            Set<String> differenceSet = Sets.difference((Set<String>) recognizedOptions(), configOptions.keySet());
+            if (!differenceSet.isEmpty())
+            {
+                throw new ConfigurationException("Following datacenters have active nodes and must be present in replication options for keyspace " + SchemaConstants.AUTH_KEYSPACE_NAME + ": " + differenceSet.toString());
+            }
+        }
     }
 
     @Override
@@ -317,7 +339,7 @@
     }
 
     @Override
-    public void maybeWarnOnOptions()
+    public void maybeWarnOnOptions(ClientState state)
     {
         if (!SchemaConstants.isSystemKeyspace(keyspaceName))
         {
@@ -327,6 +349,7 @@
 
                 String dc = e.getKey();
                 ReplicationFactor rf = getReplicationFactor(dc);
+                Guardrails.minimumReplicationFactor.guard(rf.fullReplicas, keyspaceName, false, state);
                 int nodeCount = dcsNodes.get(dc).size();
                 // nodeCount==0 on many tests
                 if (rf.fullReplicas > nodeCount && nodeCount != 0)
diff --git a/src/java/org/apache/cassandra/locator/RackInferringSnitch.java b/src/java/org/apache/cassandra/locator/RackInferringSnitch.java
index 6ae10cc..3429ad1 100644
--- a/src/java/org/apache/cassandra/locator/RackInferringSnitch.java
+++ b/src/java/org/apache/cassandra/locator/RackInferringSnitch.java
@@ -25,11 +25,11 @@
 {
     public String getRack(InetAddressAndPort endpoint)
     {
-        return Integer.toString(endpoint.address.getAddress()[2] & 0xFF, 10);
+        return Integer.toString(endpoint.getAddress().getAddress()[2] & 0xFF, 10);
     }
 
     public String getDatacenter(InetAddressAndPort endpoint)
     {
-        return Integer.toString(endpoint.address.getAddress()[1] & 0xFF, 10);
+        return Integer.toString(endpoint.getAddress().getAddress()[1] & 0xFF, 10);
     }
 }
diff --git a/src/java/org/apache/cassandra/locator/RangesByEndpoint.java b/src/java/org/apache/cassandra/locator/RangesByEndpoint.java
index 1a71141..023d7ee 100644
--- a/src/java/org/apache/cassandra/locator/RangesByEndpoint.java
+++ b/src/java/org/apache/cassandra/locator/RangesByEndpoint.java
@@ -22,8 +22,6 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Maps;
 
-import java.util.Collections;
-import java.util.HashMap;
 import java.util.Map;
 
 public class RangesByEndpoint extends ReplicaMultimap<InetAddressAndPort, RangesAtEndpoint>
@@ -55,4 +53,4 @@
         }
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java b/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java
index 7bb38cb..d8ca9e4 100644
--- a/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java
+++ b/src/java/org/apache/cassandra/locator/ReconnectableSnitchHelper.java
@@ -30,8 +30,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import static org.apache.cassandra.net.ConnectionType.SMALL_MESSAGES;
-
 /**
  * Sidekick helper for snitches that want to reconnect from one IP addr for a node to another.
  * Typically, this is for situations like EC2 where a node will have a public address and a private address,
diff --git a/src/java/org/apache/cassandra/locator/ReplicaCollection.java b/src/java/org/apache/cassandra/locator/ReplicaCollection.java
index ec671d5..b679b50 100644
--- a/src/java/org/apache/cassandra/locator/ReplicaCollection.java
+++ b/src/java/org/apache/cassandra/locator/ReplicaCollection.java
@@ -62,14 +62,14 @@
     /**
      * @return the number of replicas that match the predicate
      */
-    public abstract int count(Predicate<Replica> predicate);
+    public abstract int count(Predicate<? super Replica> predicate);
 
     /**
      * @return a *eagerly constructed* copy of this collection containing the Replica that match the provided predicate.
      * An effort will be made to either return ourself, or a subList, where possible.
      * It is guaranteed that no changes to any upstream Builder will affect the state of the result.
      */
-    public abstract C filter(Predicate<Replica> predicate);
+    public abstract C filter(Predicate<? super Replica> predicate);
 
     /**
      * @return a *eagerly constructed* copy of this collection containing the Replica that match the provided predicate.
@@ -77,18 +77,18 @@
      * It is guaranteed that no changes to any upstream Builder will affect the state of the result.
      * Only the first maxSize items will be returned.
      */
-    public abstract C filter(Predicate<Replica> predicate, int maxSize);
+    public abstract C filter(Predicate<? super Replica> predicate, int maxSize);
 
     /**
      * @return a *lazily constructed* Iterable over this collection, containing the Replica that match the provided predicate.
      */
-    public abstract Iterable<Replica> filterLazily(Predicate<Replica> predicate);
+    public abstract Iterable<Replica> filterLazily(Predicate<? super Replica> predicate);
 
     /**
      * @return a *lazily constructed* Iterable over this collection, containing the Replica that match the provided predicate.
      * Only the first maxSize matching items will be returned.
      */
-    public abstract Iterable<Replica> filterLazily(Predicate<Replica> predicate, int maxSize);
+    public abstract Iterable<Replica> filterLazily(Predicate<? super Replica> predicate, int maxSize);
 
     /**
      * @return an *eagerly constructed* copy of this collection containing the Replica at positions [start..end);
@@ -101,7 +101,7 @@
      * @return an *eagerly constructed* copy of this collection containing the Replica re-ordered according to this comparator
      * It is guaranteed that no changes to any upstream Builder will affect the state of the result.
      */
-    public abstract C sorted(Comparator<Replica> comparator);
+    public abstract C sorted(Comparator<? super Replica> comparator);
 
     public abstract Iterator<Replica> iterator();
     public abstract Stream<Replica> stream();
diff --git a/src/java/org/apache/cassandra/locator/ReplicaLayout.java b/src/java/org/apache/cassandra/locator/ReplicaLayout.java
index ff81732..351e837 100644
--- a/src/java/org/apache/cassandra/locator/ReplicaLayout.java
+++ b/src/java/org/apache/cassandra/locator/ReplicaLayout.java
@@ -25,7 +25,6 @@
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.gms.FailureDetector;
-import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
 import java.util.Set;
@@ -169,13 +168,14 @@
         @Override
         public Token token() { return natural().token(); }
 
-        public ReplicaLayout.ForTokenWrite filter(Predicate<Replica> filter)
+        public ForTokenWrite filter(Predicate<Replica> filter)
         {
             EndpointsForToken filtered = all().filter(filter);
             // AbstractReplicaCollection.filter returns itself if all elements match the filter
             if (filtered == all()) return this;
+            if (pending().isEmpty()) return new ForTokenWrite(replicationStrategy(), filtered, pending(), filtered);
             // unique by endpoint, so can for efficiency filter only on endpoint
-            return new ReplicaLayout.ForTokenWrite(
+            return new ForTokenWrite(
                     replicationStrategy(),
                     natural().keep(filtered.endpoints()),
                     pending().keep(filtered.endpoints()),
@@ -206,8 +206,8 @@
         // TODO: these should be cached, not the natural replicas
         // TODO: race condition to fetch these. implications??
         AbstractReplicationStrategy replicationStrategy = keyspace.getReplicationStrategy();
-        EndpointsForToken natural = replicationStrategy.getNaturalReplicasForToken(token);
-        EndpointsForToken pending = StorageService.instance.getTokenMetadata().pendingEndpointsForToken(token, keyspace.getName());
+        EndpointsForToken natural = EndpointsForToken.natural(replicationStrategy, token);
+        EndpointsForToken pending = EndpointsForToken.pending(keyspace, token);
         return forTokenWrite(replicationStrategy, natural, pending);
     }
 
@@ -325,7 +325,7 @@
      * @return the read layout for a token - this includes only live natural replicas, i.e. those that are not pending
      * and not marked down by the failure detector. these are reverse sorted by the badness score of the configured snitch
      */
-    static ReplicaLayout.ForTokenRead forTokenReadLiveSorted(AbstractReplicationStrategy replicationStrategy, Token token)
+    public static ReplicaLayout.ForTokenRead forTokenReadLiveSorted(AbstractReplicationStrategy replicationStrategy, Token token)
     {
         EndpointsForToken replicas = replicationStrategy.getNaturalReplicasForToken(token);
         replicas = DatabaseDescriptor.getEndpointSnitch().sortedByProximity(FBUtilities.getBroadcastAddressAndPort(), replicas);
diff --git a/src/java/org/apache/cassandra/locator/ReplicaPlan.java b/src/java/org/apache/cassandra/locator/ReplicaPlan.java
index 51cab13..3bb3ec0 100644
--- a/src/java/org/apache/cassandra/locator/ReplicaPlan.java
+++ b/src/java/org/apache/cassandra/locator/ReplicaPlan.java
@@ -25,69 +25,89 @@
 import org.apache.cassandra.dht.AbstractBounds;
 
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 
-public abstract class ReplicaPlan<E extends Endpoints<E>>
+public interface ReplicaPlan<E extends Endpoints<E>, P extends ReplicaPlan<E, P>>
 {
-    protected final Keyspace keyspace;
-    protected final ConsistencyLevel consistencyLevel;
-    // The snapshot of the replication strategy when instantiating.
-    // It could be different than the one fetched from Keyspace later, e.g. RS altered during the query.
-    // Use the snapshot to calculate {@code blockFor} in order to have a consistent view of RS for the query.
-    protected final AbstractReplicationStrategy replicationStrategy;
+    Keyspace keyspace();
+    AbstractReplicationStrategy replicationStrategy();
+    ConsistencyLevel consistencyLevel();
 
-    // all nodes we will contact via any mechanism, including hints
-    // i.e., for:
-    //  - reads, only live natural replicas
-    //      ==> live.natural().subList(0, blockFor + initial speculate)
-    //  - writes, includes all full, and any pending replicas, (and only any necessary transient ones to make up the difference)
-    //      ==> liveAndDown.natural().filter(isFull) ++ liveAndDown.pending() ++ live.natural.filter(isTransient, req)
-    //  - paxos, includes all live replicas (natural+pending), for this DC if SERIAL_LOCAL
-    //      ==> live.all()  (if consistencyLevel.isDCLocal(), then .filter(consistencyLevel.isLocal))
-    private final E contacts;
+    E contacts();
 
-    ReplicaPlan(Keyspace keyspace, AbstractReplicationStrategy replicationStrategy, ConsistencyLevel consistencyLevel, E contacts)
+    Replica lookup(InetAddressAndPort endpoint);
+    P withContacts(E contacts);
+
+    interface ForRead<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>> extends ReplicaPlan<E, P>
     {
-        assert contacts != null;
-        this.keyspace = keyspace;
-        this.replicationStrategy = replicationStrategy;
-        this.consistencyLevel = consistencyLevel;
-        this.contacts = contacts;
+        int readQuorum();
+        E readCandidates();
+
+        default Replica firstUncontactedCandidate(Predicate<Replica> extraPredicate)
+        {
+            return Iterables.tryFind(readCandidates(), r -> extraPredicate.test(r) && !contacts().contains(r)).orNull();
+        }
     }
 
-    public abstract int blockFor();
+    abstract class AbstractReplicaPlan<E extends Endpoints<E>, P extends ReplicaPlan<E, P>> implements ReplicaPlan<E, P>
+    {
+        protected final Keyspace keyspace;
+        protected final ConsistencyLevel consistencyLevel;
+        // The snapshot of the replication strategy when instantiating.
+        // It could be different than the one fetched from Keyspace later, e.g. RS altered during the query.
+        // Use the snapshot to calculate {@code blockFor} in order to have a consistent view of RS for the query.
+        protected final AbstractReplicationStrategy replicationStrategy;
 
-    public E contacts() { return contacts; }
+        // all nodes we will contact via any mechanism, including hints
+        // i.e., for:
+        //  - reads, only live natural replicas
+        //      ==> live.natural().subList(0, blockFor + initial speculate)
+        //  - writes, includes all full, and any pending replicas, (and only any necessary transient ones to make up the difference)
+        //      ==> liveAndDown.natural().filter(isFull) ++ liveAndDown.pending() ++ live.natural.filter(isTransient, req)
+        //  - paxos, includes all live replicas (natural+pending), for this DC if SERIAL_LOCAL
+        //      ==> live.all()  (if consistencyLevel.isDCLocal(), then .filter(consistencyLevel.isLocal))
+        private final E contacts;
 
-    // TODO: should this semantically return true if we contain the endpoint, not the exact replica?
-    public boolean contacts(Replica replica) { return contacts.contains(replica); }
-    public Keyspace keyspace() { return keyspace; }
-    public AbstractReplicationStrategy replicationStrategy() { return replicationStrategy; }
-    public ConsistencyLevel consistencyLevel() { return consistencyLevel; }
+        AbstractReplicaPlan(Keyspace keyspace, AbstractReplicationStrategy replicationStrategy, ConsistencyLevel consistencyLevel, E contacts)
+        {
+            assert contacts != null;
+            this.keyspace = keyspace;
+            this.replicationStrategy = replicationStrategy;
+            this.consistencyLevel = consistencyLevel;
+            this.contacts = contacts;
+        }
 
-    public static abstract class ForRead<E extends Endpoints<E>> extends ReplicaPlan<E>
+        public E contacts() { return contacts; }
+
+        public Keyspace keyspace() { return keyspace; }
+        public AbstractReplicationStrategy replicationStrategy() { return replicationStrategy; }
+        public ConsistencyLevel consistencyLevel() { return consistencyLevel; }
+    }
+
+    public static abstract class AbstractForRead<E extends Endpoints<E>, P extends ForRead<E, P>> extends AbstractReplicaPlan<E, P> implements ForRead<E, P>
     {
         // all nodes we *could* contacts; typically all natural replicas that are believed to be alive
         // we will consult this collection to find uncontacted nodes we might contact if we doubt we will meet consistency level
-        private final E candidates;
+        final E candidates;
 
-        ForRead(Keyspace keyspace, AbstractReplicationStrategy replicationStrategy, ConsistencyLevel consistencyLevel, E candidates, E contacts)
+        AbstractForRead(Keyspace keyspace, AbstractReplicationStrategy replicationStrategy, ConsistencyLevel consistencyLevel, E candidates, E contacts)
         {
             super(keyspace, replicationStrategy, consistencyLevel, contacts);
             this.candidates = candidates;
         }
 
-        public int blockFor() { return consistencyLevel.blockFor(replicationStrategy); }
+        public int readQuorum() { return consistencyLevel.blockFor(replicationStrategy); }
 
-        public E candidates() { return candidates; }
+        public E readCandidates() { return candidates; }
 
         public Replica firstUncontactedCandidate(Predicate<Replica> extraPredicate)
         {
-            return Iterables.tryFind(candidates(), r -> extraPredicate.test(r) && !contacts(r)).orNull();
+            return Iterables.tryFind(readCandidates(), r -> extraPredicate.test(r) && !contacts().contains(r)).orNull();
         }
 
         public Replica lookup(InetAddressAndPort endpoint)
         {
-            return candidates().byEndpoint().get(endpoint);
+            return readCandidates().byEndpoint().get(endpoint);
         }
 
         public String toString()
@@ -96,7 +116,7 @@
         }
     }
 
-    public static class ForTokenRead extends ForRead<EndpointsForToken>
+    public static class ForTokenRead extends AbstractForRead<EndpointsForToken, ForTokenRead>
     {
         public ForTokenRead(Keyspace keyspace,
                             AbstractReplicationStrategy replicationStrategy,
@@ -107,13 +127,13 @@
             super(keyspace, replicationStrategy, consistencyLevel, candidates, contacts);
         }
 
-        ForTokenRead withContact(EndpointsForToken newContact)
+        public ForTokenRead withContacts(EndpointsForToken newContact)
         {
-            return new ForTokenRead(keyspace, replicationStrategy, consistencyLevel, candidates(), newContact);
+            return new ForTokenRead(keyspace, replicationStrategy, consistencyLevel, candidates, newContact);
         }
     }
 
-    public static class ForRangeRead extends ForRead<EndpointsForRange>
+    public static class ForRangeRead extends AbstractForRead<EndpointsForRange, ForRangeRead>
     {
         final AbstractBounds<PartitionPosition> range;
         final int vnodeCount;
@@ -138,20 +158,20 @@
          */
         public int vnodeCount() { return vnodeCount; }
 
-        ForRangeRead withContact(EndpointsForRange newContact)
+        public ForRangeRead withContacts(EndpointsForRange newContact)
         {
-            return new ForRangeRead(keyspace, replicationStrategy, consistencyLevel, range, candidates(), newContact, vnodeCount);
+            return new ForRangeRead(keyspace, replicationStrategy, consistencyLevel, range, readCandidates(), newContact, vnodeCount);
         }
     }
 
-    public static abstract class ForWrite<E extends Endpoints<E>> extends ReplicaPlan<E>
+    public static class ForWrite extends AbstractReplicaPlan<EndpointsForToken, ForWrite>
     {
         // TODO: this is only needed because of poor isolation of concerns elsewhere - we can remove it soon, and will do so in a follow-up patch
-        final E pending;
-        final E liveAndDown;
-        final E live;
+        final EndpointsForToken pending;
+        final EndpointsForToken liveAndDown;
+        final EndpointsForToken live;
 
-        ForWrite(Keyspace keyspace, AbstractReplicationStrategy replicationStrategy, ConsistencyLevel consistencyLevel, E pending, E liveAndDown, E live, E contact)
+        public ForWrite(Keyspace keyspace, AbstractReplicationStrategy replicationStrategy, ConsistencyLevel consistencyLevel, EndpointsForToken pending, EndpointsForToken liveAndDown, EndpointsForToken live, EndpointsForToken contact)
         {
             super(keyspace, replicationStrategy, consistencyLevel, contact);
             this.pending = pending;
@@ -159,46 +179,43 @@
             this.live = live;
         }
 
-        public int blockFor() { return consistencyLevel.blockForWrite(replicationStrategy, pending()); }
+        public int writeQuorum() { return consistencyLevel.blockForWrite(replicationStrategy, pending()); }
 
         /** Replicas that a region of the ring is moving to; not yet ready to serve reads, but should receive writes */
-        public E pending() { return pending; }
+        public EndpointsForToken pending() { return pending; }
+
         /** Replicas that can participate in the write - this always includes all nodes (pending and natural) in all DCs, except for paxos LOCAL_QUORUM (which is local DC only) */
-        public E liveAndDown() { return liveAndDown; }
+        public EndpointsForToken liveAndDown() { return liveAndDown; }
+
         /** The live replicas present in liveAndDown, usually derived from FailureDetector.isReplicaAlive */
-        public E live() { return live; }
+        public EndpointsForToken live() { return live; }
+
         /** Calculate which live endpoints we could have contacted, but chose not to */
-        public E liveUncontacted() { return live().filter(r -> !contacts(r)); }
+        public EndpointsForToken liveUncontacted() { return live().filter(r -> !contacts().contains(r)); }
+
         /** Test liveness, consistent with the upfront analysis done for this operation (i.e. test membership of live()) */
         public boolean isAlive(Replica replica) { return live.endpoints().contains(replica.endpoint()); }
+
         public Replica lookup(InetAddressAndPort endpoint)
         {
             return liveAndDown().byEndpoint().get(endpoint);
         }
 
+        private ForWrite copy(ConsistencyLevel newConsistencyLevel, EndpointsForToken newContact)
+        {
+            return new ForWrite(keyspace, replicationStrategy, newConsistencyLevel, pending(), liveAndDown(), live(), newContact);
+        }
+
+        ForWrite withConsistencyLevel(ConsistencyLevel newConsistencylevel) { return copy(newConsistencylevel, contacts()); }
+        public ForWrite withContacts(EndpointsForToken newContact) { return copy(consistencyLevel, newContact); }
+
         public String toString()
         {
             return "ReplicaPlan.ForWrite [ CL: " + consistencyLevel + " keyspace: " + keyspace + " liveAndDown: " + liveAndDown + " live: " + live + " contacts: " + contacts() +  " ]";
         }
     }
 
-    public static class ForTokenWrite extends ForWrite<EndpointsForToken>
-    {
-        public ForTokenWrite(Keyspace keyspace, AbstractReplicationStrategy replicationStrategy, ConsistencyLevel consistencyLevel, EndpointsForToken pending, EndpointsForToken liveAndDown, EndpointsForToken live, EndpointsForToken contact)
-        {
-            super(keyspace, replicationStrategy, consistencyLevel, pending, liveAndDown, live, contact);
-        }
-
-        private ReplicaPlan.ForTokenWrite copy(ConsistencyLevel newConsistencyLevel, EndpointsForToken newContact)
-        {
-            return new ReplicaPlan.ForTokenWrite(keyspace, replicationStrategy, newConsistencyLevel, pending(), liveAndDown(), live(), newContact);
-        }
-
-        ForTokenWrite withConsistencyLevel(ConsistencyLevel newConsistencylevel) { return copy(newConsistencylevel, contacts()); }
-        public ForTokenWrite withContact(EndpointsForToken newContact) { return copy(consistencyLevel, newContact); }
-    }
-
-    public static class ForPaxosWrite extends ForWrite<EndpointsForToken>
+    public static class ForPaxosWrite extends ForWrite
     {
         final int requiredParticipants;
 
@@ -219,8 +236,11 @@
      * the constructor should be visible by the normal process of sharing data between threads (i.e. executors, etc)
      * and any updates will either be seen or not seen, perhaps not promptly, but certainly not incompletely.
      * The contained ReplicaPlan has only final member properties, so it cannot be seen partially initialised.
+     *
+     * TODO: there's no reason this couldn't be achieved instead by a ReplicaPlan with mutable contacts,
+     *       simplifying the hierarchy
      */
-    public interface Shared<E extends Endpoints<E>, P extends ReplicaPlan<E>>
+    public interface Shared<E extends Endpoints<E>, P extends ReplicaPlan<E, P>> extends Supplier<P>
     {
         /**
          * add the provided replica to this shared plan, by updating the internal reference
@@ -230,29 +250,22 @@
          * get the shared replica plan, non-volatile (so maybe stale) but no risk of partially initialised
          */
         public P get();
-        /**
-         * get the shared replica plan, non-volatile (so maybe stale) but no risk of partially initialised,
-         * but replace its 'contacts' with those provided
-         */
-        public abstract P getWithContacts(E endpoints);
     }
 
     public static class SharedForTokenRead implements Shared<EndpointsForToken, ForTokenRead>
     {
         private ForTokenRead replicaPlan;
         SharedForTokenRead(ForTokenRead replicaPlan) { this.replicaPlan = replicaPlan; }
-        public void addToContacts(Replica replica) { replicaPlan = replicaPlan.withContact(Endpoints.append(replicaPlan.contacts(), replica)); }
+        public void addToContacts(Replica replica) { replicaPlan = replicaPlan.withContacts(Endpoints.append(replicaPlan.contacts(), replica)); }
         public ForTokenRead get() { return replicaPlan; }
-        public ForTokenRead getWithContacts(EndpointsForToken newContact) { return replicaPlan.withContact(newContact); }
     }
 
     public static class SharedForRangeRead implements Shared<EndpointsForRange, ForRangeRead>
     {
         private ForRangeRead replicaPlan;
         SharedForRangeRead(ForRangeRead replicaPlan) { this.replicaPlan = replicaPlan; }
-        public void addToContacts(Replica replica) { replicaPlan = replicaPlan.withContact(Endpoints.append(replicaPlan.contacts(), replica)); }
+        public void addToContacts(Replica replica) { replicaPlan = replicaPlan.withContacts(Endpoints.append(replicaPlan.contacts(), replica)); }
         public ForRangeRead get() { return replicaPlan; }
-        public ForRangeRead getWithContacts(EndpointsForRange newContact) { return replicaPlan.withContact(newContact); }
     }
 
     public static SharedForTokenRead shared(ForTokenRead replicaPlan) { return new SharedForTokenRead(replicaPlan); }
diff --git a/src/java/org/apache/cassandra/locator/ReplicaPlans.java b/src/java/org/apache/cassandra/locator/ReplicaPlans.java
index 67b89e5..c39862a 100644
--- a/src/java/org/apache/cassandra/locator/ReplicaPlans.java
+++ b/src/java/org/apache/cassandra/locator/ReplicaPlans.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.locator;
 
 import com.carrotsearch.hppc.ObjectIntHashMap;
-import com.carrotsearch.hppc.cursors.ObjectIntCursor;
 import com.carrotsearch.hppc.cursors.ObjectObjectCursor;
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ArrayListMultimap;
@@ -134,7 +133,7 @@
                     if (logger.isTraceEnabled())
                     {
                         logger.trace(String.format("Local replicas %s are insufficient to satisfy LOCAL_QUORUM requirement of %d live replicas and %d full replicas in '%s'",
-                                allLive.filter(InOurDcTester.replicas()), blockFor, blockForFullReplicas, DatabaseDescriptor.getLocalDataCenter()));
+                                                   allLive.filter(InOurDc.replicas()), blockFor, blockForFullReplicas, DatabaseDescriptor.getLocalDataCenter()));
                     }
                     throw UnavailableException.create(consistencyLevel, blockFor, blockForFullReplicas, localLive.allReplicas(), localLive.fullReplicas());
                 }
@@ -176,23 +175,23 @@
     /**
      * Construct a ReplicaPlan for writing to exactly one node, with CL.ONE. This node is *assumed* to be alive.
      */
-    public static ReplicaPlan.ForTokenWrite forSingleReplicaWrite(Keyspace keyspace, Token token, Replica replica)
+    public static ReplicaPlan.ForWrite forSingleReplicaWrite(Keyspace keyspace, Token token, Replica replica)
     {
         EndpointsForToken one = EndpointsForToken.of(token, replica);
         EndpointsForToken empty = EndpointsForToken.empty(token);
-        return new ReplicaPlan.ForTokenWrite(keyspace, keyspace.getReplicationStrategy(), ConsistencyLevel.ONE, empty, one, one, one);
+        return new ReplicaPlan.ForWrite(keyspace, keyspace.getReplicationStrategy(), ConsistencyLevel.ONE, empty, one, one, one);
     }
 
     /**
      * A forwarding counter write is always sent to a single owning coordinator for the range, by the original coordinator
      * (if it is not itself an owner)
      */
-    public static ReplicaPlan.ForTokenWrite forForwardingCounterWrite(Keyspace keyspace, Token token, Replica replica)
+    public static ReplicaPlan.ForWrite forForwardingCounterWrite(Keyspace keyspace, Token token, Replica replica)
     {
         return forSingleReplicaWrite(keyspace, token, replica);
     }
 
-    public static ReplicaPlan.ForTokenWrite forLocalBatchlogWrite()
+    public static ReplicaPlan.ForWrite forLocalBatchlogWrite()
     {
         Token token = DatabaseDescriptor.getPartitioner().getMinimumToken();
         Keyspace systemKeypsace = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME);
@@ -212,7 +211,7 @@
      *
      * @param isAny if batch consistency level is ANY, in which case a local node will be picked
      */
-    public static ReplicaPlan.ForTokenWrite forBatchlogWrite(boolean isAny) throws UnavailableException
+    public static ReplicaPlan.ForWrite forBatchlogWrite(boolean isAny) throws UnavailableException
     {
         // A single case we write not for range or token, but multiple mutations to many tokens
         Token token = DatabaseDescriptor.getPartitioner().getMinimumToken();
@@ -318,41 +317,41 @@
         return result;
     }
 
-    public static ReplicaPlan.ForTokenWrite forReadRepair(Token token, ReplicaPlan.ForRead<?> readPlan) throws UnavailableException
+    public static ReplicaPlan.ForWrite forReadRepair(Token token, ReplicaPlan<?, ?> readPlan) throws UnavailableException
     {
-        return forWrite(readPlan.keyspace, readPlan.consistencyLevel, token, writeReadRepair(readPlan));
+        return forWrite(readPlan.keyspace(), readPlan.consistencyLevel(), token, writeReadRepair(readPlan));
     }
 
-    public static ReplicaPlan.ForTokenWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, Token token, Selector selector) throws UnavailableException
+    public static ReplicaPlan.ForWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, Token token, Selector selector) throws UnavailableException
     {
         return forWrite(keyspace, consistencyLevel, ReplicaLayout.forTokenWriteLiveAndDown(keyspace, token), selector);
     }
 
     @VisibleForTesting
-    public static ReplicaPlan.ForTokenWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, EndpointsForToken natural, EndpointsForToken pending, Predicate<Replica> isAlive, Selector selector) throws UnavailableException
+    public static ReplicaPlan.ForWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, EndpointsForToken natural, EndpointsForToken pending, Predicate<Replica> isAlive, Selector selector) throws UnavailableException
     {
         return forWrite(keyspace, consistencyLevel, ReplicaLayout.forTokenWrite(keyspace.getReplicationStrategy(), natural, pending), isAlive, selector);
     }
 
-    public static ReplicaPlan.ForTokenWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, ReplicaLayout.ForTokenWrite liveAndDown, Selector selector) throws UnavailableException
+    public static ReplicaPlan.ForWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, ReplicaLayout.ForTokenWrite liveAndDown, Selector selector) throws UnavailableException
     {
         return forWrite(keyspace, consistencyLevel, liveAndDown, FailureDetector.isReplicaAlive, selector);
     }
 
-    private static ReplicaPlan.ForTokenWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, ReplicaLayout.ForTokenWrite liveAndDown, Predicate<Replica> isAlive, Selector selector) throws UnavailableException
+    private static ReplicaPlan.ForWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, ReplicaLayout.ForTokenWrite liveAndDown, Predicate<Replica> isAlive, Selector selector) throws UnavailableException
     {
         ReplicaLayout.ForTokenWrite live = liveAndDown.filter(isAlive);
         return forWrite(keyspace, consistencyLevel, liveAndDown, live, selector);
     }
 
-    public static ReplicaPlan.ForTokenWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, ReplicaLayout.ForTokenWrite liveAndDown, ReplicaLayout.ForTokenWrite live, Selector selector) throws UnavailableException
+    public static ReplicaPlan.ForWrite forWrite(Keyspace keyspace, ConsistencyLevel consistencyLevel, ReplicaLayout.ForTokenWrite liveAndDown, ReplicaLayout.ForTokenWrite live, Selector selector) throws UnavailableException
     {
         assert liveAndDown.replicationStrategy() == live.replicationStrategy()
                : "ReplicaLayout liveAndDown and live should be derived from the same replication strategy.";
         AbstractReplicationStrategy replicationStrategy = liveAndDown.replicationStrategy();
         EndpointsForToken contacts = selector.select(consistencyLevel, liveAndDown, live);
         assureSufficientLiveReplicasForWrite(replicationStrategy, consistencyLevel, live.all(), liveAndDown.pending());
-        return new ReplicaPlan.ForTokenWrite(keyspace, replicationStrategy, consistencyLevel, liveAndDown.pending(), liveAndDown.all(), live.all(), contacts);
+        return new ReplicaPlan.ForWrite(keyspace, replicationStrategy, consistencyLevel, liveAndDown.pending(), liveAndDown.all(), live.all(), contacts);
     }
 
     public interface Selector
@@ -435,7 +434,7 @@
      * the minimal number of nodes to meet the consistency level, and prefer nodes we contacted on read to minimise
      * data transfer.
      */
-    public static Selector writeReadRepair(ReplicaPlan.ForRead<?> readPlan)
+    public static Selector writeReadRepair(ReplicaPlan<?, ?> readPlan)
     {
         return new Selector()
         {
@@ -498,7 +497,7 @@
         {
             // TODO: we should cleanup our semantics here, as we're filtering ALL nodes to localDC which is unexpected for ReplicaPlan
             // Restrict natural and pending to node in the local DC only
-            liveAndDown = liveAndDown.filter(InOurDcTester.replicas());
+            liveAndDown = liveAndDown.filter(InOurDc.replicas());
         }
 
         ReplicaLayout.ForTokenWrite live = liveAndDown.filter(FailureDetector.isReplicaAlive);
@@ -527,7 +526,7 @@
     private static <E extends Endpoints<E>> E candidatesForRead(ConsistencyLevel consistencyLevel, E liveNaturalReplicas)
     {
         return consistencyLevel.isDatacenterLocal()
-                ? liveNaturalReplicas.filter(InOurDcTester.replicas())
+                ? liveNaturalReplicas.filter(InOurDc.replicas())
                 : liveNaturalReplicas;
     }
 
@@ -622,7 +621,7 @@
     {
         // TODO: should we be asserting that the ranges are adjacent?
         AbstractBounds<PartitionPosition> newRange = left.range().withNewRight(right.range().right);
-        EndpointsForRange mergedCandidates = left.candidates().keep(right.candidates().endpoints());
+        EndpointsForRange mergedCandidates = left.readCandidates().keep(right.readCandidates().endpoints());
         AbstractReplicationStrategy replicationStrategy = keyspace.getReplicationStrategy();
 
         // Check if there are enough shared endpoints for the merge to be possible.
diff --git a/src/java/org/apache/cassandra/locator/Replicas.java b/src/java/org/apache/cassandra/locator/Replicas.java
index 1b299cf..c53815c 100644
--- a/src/java/org/apache/cassandra/locator/Replicas.java
+++ b/src/java/org/apache/cassandra/locator/Replicas.java
@@ -78,7 +78,7 @@
     public static ReplicaCount countInOurDc(ReplicaCollection<?> replicas)
     {
         ReplicaCount count = new ReplicaCount();
-        Predicate<Replica> inOurDc = InOurDcTester.replicas();
+        Predicate<Replica> inOurDc = InOurDc.replicas();
         for (Replica replica : replicas)
             if (inOurDc.test(replica))
                 count.increment(replica);
diff --git a/src/java/org/apache/cassandra/locator/SimpleStrategy.java b/src/java/org/apache/cassandra/locator/SimpleStrategy.java
index 928ac97..e5b9210 100644
--- a/src/java/org/apache/cassandra/locator/SimpleStrategy.java
+++ b/src/java/org/apache/cassandra/locator/SimpleStrategy.java
@@ -26,10 +26,13 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.guardrails.Guardrails;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.service.StorageService;
 
@@ -99,12 +102,13 @@
     }
 
     @Override
-    public void maybeWarnOnOptions()
+    public void maybeWarnOnOptions(ClientState state)
     {
         if (!SchemaConstants.isSystemKeyspace(keyspaceName))
         {
             int nodeCount = StorageService.instance.getHostIdToEndpoint().size();
             // nodeCount==0 on many tests
+            Guardrails.minimumReplicationFactor.guard(rf.fullReplicas, keyspaceName, false, state);
             if (rf.fullReplicas > nodeCount && nodeCount != 0)
             {
                 String msg = "Your replication factor " + rf.fullReplicas
@@ -123,4 +127,13 @@
     {
         return Collections.singleton(REPLICATION_FACTOR);
     }
+
+    protected static void prepareOptions(Map<String, String> options, Map<String, String> previousOptions)
+    {
+        // When altering from NTS to SS, previousOptions could have multiple different RFs for different data centers - so we
+        // will instead default to DefaultRF configuration if RF is not mentioned with the alter statement
+        String rf = previousOptions.containsKey(REPLICATION_FACTOR) ? previousOptions.get(REPLICATION_FACTOR)
+                                                                    : Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF());
+        options.putIfAbsent(REPLICATION_FACTOR, rf);
+    }
 }
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index 92551ac..6b0ea7d 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -31,6 +31,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.*;
+
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -49,6 +50,7 @@
 import org.apache.cassandra.utils.SortedBiMultiValMap;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.LINE_SEPARATOR;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class TokenMetadata
 {
@@ -189,8 +191,7 @@
     public void updateNormalTokens(Collection<Token> tokens, InetAddressAndPort endpoint)
     {
         Multimap<InetAddressAndPort, Token> endpointTokens = HashMultimap.create();
-        for (Token token : tokens)
-            endpointTokens.put(endpoint, token);
+        endpointTokens.putAll(endpoint, tokens);
         updateNormalTokens(endpointTokens);
     }
 
@@ -257,23 +258,7 @@
         lock.writeLock().lock();
         try
         {
-            InetAddressAndPort storedEp = endpointToHostIdMap.inverse().get(hostId);
-            if (storedEp != null)
-            {
-                if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
-                {
-                    throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
-                                                             storedEp,
-                                                             endpoint,
-                                                             hostId));
-                }
-            }
-
-            UUID storedId = endpointToHostIdMap.get(endpoint);
-            if ((storedId != null) && (!storedId.equals(hostId)))
-                logger.warn("Changing {}'s host ID from {} to {}", endpoint, storedId, hostId);
-
-            endpointToHostIdMap.forcePut(endpoint, hostId);
+            updateEndpointToHostIdMap(hostId, endpoint);
         }
         finally
         {
@@ -282,6 +267,44 @@
 
     }
 
+    public void updateHostIds(Map<UUID, InetAddressAndPort> hostIdToEndpointMap)
+    {
+        lock.writeLock().lock();
+        try
+        {
+            for (Map.Entry<UUID, InetAddressAndPort> entry : hostIdToEndpointMap.entrySet())
+            {
+                updateEndpointToHostIdMap(entry.getKey(), entry.getValue());
+            }
+        }
+        finally
+        {
+            lock.writeLock().unlock();
+        }
+
+    }
+    
+    private void updateEndpointToHostIdMap(UUID hostId, InetAddressAndPort endpoint)
+    {
+        InetAddressAndPort storedEp = endpointToHostIdMap.inverse().get(hostId);
+        if (storedEp != null)
+        {
+            if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
+            {
+                throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
+                                                         storedEp,
+                                                         endpoint,
+                                                         hostId));
+            }
+        }
+
+        UUID storedId = endpointToHostIdMap.get(endpoint);
+        if ((storedId != null) && (!storedId.equals(hostId)))
+            logger.warn("Changing {}'s host ID from {} to {}", endpoint, storedId, hostId);
+
+        endpointToHostIdMap.forcePut(endpoint, hostId);
+    }
+
     /** Return the unique host ID for an end-point. */
     public UUID getHostId(InetAddressAndPort endpoint)
     {
@@ -482,7 +505,7 @@
         try
         {
             bootstrapTokens.removeValue(endpoint);
-            tokenToEndpointMap.removeValue(endpoint);
+
             topology = topology.unbuild().removeEndpoint(endpoint).build();
             leavingEndpoints.remove(endpoint);
             if (replacementToOriginal.remove(endpoint) != null)
@@ -490,8 +513,12 @@
                 logger.debug("Node {} failed during replace.", endpoint);
             }
             endpointToHostIdMap.remove(endpoint);
-            sortedTokens = sortTokens();
-            invalidateCachedRingsUnsafe();
+            Collection<Token> removedTokens = tokenToEndpointMap.removeValue(endpoint);
+            if (removedTokens != null && !removedTokens.isEmpty())
+            {
+                sortedTokens = sortTokens();
+                invalidateCachedRingsUnsafe();
+            }
         }
         finally
         {
@@ -575,7 +602,7 @@
         lock.readLock().lock();
         try
         {
-            assert isMember(endpoint); // don't want to return nulls
+            assert isMember(endpoint): String.format("Unable to get tokens for %s; it is not a member", endpoint); // don't want to return nulls
             return new ArrayList<>(tokenToEndpointMap.inverse().get(endpoint));
         }
         finally
@@ -838,51 +865,17 @@
     public void calculatePendingRanges(AbstractReplicationStrategy strategy, String keyspaceName)
     {
         // avoid race between both branches - do not use a lock here as this will block any other unrelated operations!
-        long startedAt = System.currentTimeMillis();
+        long startedAt = currentTimeMillis();
         synchronized (pendingRanges)
         {
             TokenMetadataDiagnostics.pendingRangeCalculationStarted(this, keyspaceName);
 
-            // create clone of current state
-            BiMultiValMap<Token, InetAddressAndPort> bootstrapTokensClone;
-            Set<InetAddressAndPort> leavingEndpointsClone;
-            Set<Pair<Token, InetAddressAndPort>> movingEndpointsClone;
-            TokenMetadata metadata;
+            unsafeCalculatePendingRanges(strategy, keyspaceName);
 
-            lock.readLock().lock();
-            try
-            {
-
-                if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty() && movingEndpoints.isEmpty())
-                {
-                    if (logger.isTraceEnabled())
-                        logger.trace("No bootstrapping, leaving or moving nodes -> empty pending ranges for {}", keyspaceName);
-                    if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty() && movingEndpoints.isEmpty())
-                    {
-                        if (logger.isTraceEnabled())
-                            logger.trace("No bootstrapping, leaving or moving nodes -> empty pending ranges for {}", keyspaceName);
-                        pendingRanges.put(keyspaceName, new PendingRangeMaps());
-
-                        return;
-                    }
-                }
-
-                bootstrapTokensClone  = new BiMultiValMap<>(this.bootstrapTokens);
-                leavingEndpointsClone = new HashSet<>(this.leavingEndpoints);
-                movingEndpointsClone = new HashSet<>(this.movingEndpoints);
-                metadata = this.cloneOnlyTokenMap();
-            }
-            finally
-            {
-                lock.readLock().unlock();
-            }
-
-            pendingRanges.put(keyspaceName, calculatePendingRanges(strategy, metadata, bootstrapTokensClone,
-                                                                   leavingEndpointsClone, movingEndpointsClone));
             if (logger.isDebugEnabled())
                 logger.debug("Starting pending range calculation for {}", keyspaceName);
 
-            long took = System.currentTimeMillis() - startedAt;
+            long took = currentTimeMillis() - startedAt;
 
             if (logger.isDebugEnabled())
                 logger.debug("Pending range calculation for {} completed (took: {}ms)", keyspaceName, took);
@@ -891,6 +884,46 @@
         }
     }
 
+    public void unsafeCalculatePendingRanges(AbstractReplicationStrategy strategy, String keyspaceName)
+    {
+        // create clone of current state
+        BiMultiValMap<Token, InetAddressAndPort> bootstrapTokensClone;
+        Set<InetAddressAndPort> leavingEndpointsClone;
+        Set<Pair<Token, InetAddressAndPort>> movingEndpointsClone;
+        TokenMetadata metadata;
+
+        lock.readLock().lock();
+        try
+        {
+
+            if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty() && movingEndpoints.isEmpty())
+            {
+                if (logger.isTraceEnabled())
+                    logger.trace("No bootstrapping, leaving or moving nodes -> empty pending ranges for {}", keyspaceName);
+                if (bootstrapTokens.isEmpty() && leavingEndpoints.isEmpty() && movingEndpoints.isEmpty())
+                {
+                    if (logger.isTraceEnabled())
+                        logger.trace("No bootstrapping, leaving or moving nodes -> empty pending ranges for {}", keyspaceName);
+                    pendingRanges.put(keyspaceName, new PendingRangeMaps());
+
+                    return;
+                }
+            }
+
+            bootstrapTokensClone  = new BiMultiValMap<>(this.bootstrapTokens);
+            leavingEndpointsClone = new HashSet<>(this.leavingEndpoints);
+            movingEndpointsClone = new HashSet<>(this.movingEndpoints);
+            metadata = this.cloneOnlyTokenMap();
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
+
+        pendingRanges.put(keyspaceName, calculatePendingRanges(strategy, metadata, bootstrapTokensClone,
+                                                               leavingEndpointsClone, movingEndpointsClone));
+    }
+
     /**
      * @see TokenMetadata#calculatePendingRanges(AbstractReplicationStrategy, String)
      */
@@ -1366,7 +1399,7 @@
      */
     public Topology getTopology()
     {
-        assert this != StorageService.instance.getTokenMetadata();
+        assert !DatabaseDescriptor.isDaemonInitialized() || this != StorageService.instance.getTokenMetadata();
         return topology;
     }
 
diff --git a/src/java/org/apache/cassandra/metrics/CQLMetrics.java b/src/java/org/apache/cassandra/metrics/CQLMetrics.java
index 1020e92..ce91333 100644
--- a/src/java/org/apache/cassandra/metrics/CQLMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CQLMetrics.java
@@ -32,6 +32,8 @@
     public final Counter preparedStatementsExecuted;
     public final Counter preparedStatementsEvicted;
 
+    public final Counter useStatementsExecuted;
+
     public final Gauge<Integer> preparedStatementsCount;
     public final Gauge<Double> preparedStatementsRatio;
 
@@ -41,13 +43,9 @@
         preparedStatementsExecuted = Metrics.counter(factory.createMetricName("PreparedStatementsExecuted"));
         preparedStatementsEvicted = Metrics.counter(factory.createMetricName("PreparedStatementsEvicted"));
 
-        preparedStatementsCount = Metrics.register(factory.createMetricName("PreparedStatementsCount"), new Gauge<Integer>()
-        {
-            public Integer getValue()
-            {
-                return QueryProcessor.preparedStatementsCount();
-            }
-        });
+        useStatementsExecuted = Metrics.counter(factory.createMetricName("UseStatementsExecuted"));
+
+        preparedStatementsCount = Metrics.register(factory.createMetricName("PreparedStatementsCount"), QueryProcessor::preparedStatementsCount);
         preparedStatementsRatio = Metrics.register(factory.createMetricName("PreparedStatementsRatio"), new RatioGauge()
         {
             public Ratio getRatio()
diff --git a/src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java b/src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java
index 1ae2455..37c37e3 100644
--- a/src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java
+++ b/src/java/org/apache/cassandra/metrics/CassandraMetricsRegistry.java
@@ -45,6 +45,7 @@
     private final Map<String, ThreadPoolMetrics> threadPoolMetrics = new ConcurrentHashMap<>();
 
     private final MBeanWrapper mBeanServer = MBeanWrapper.instance;
+    public final static TimeUnit DEFAULT_TIMER_UNIT = TimeUnit.MICROSECONDS;
 
     private CassandraMetricsRegistry()
     {
@@ -98,19 +99,49 @@
 
     public Timer timer(MetricName name)
     {
-        Timer timer = register(name, new Timer(new DecayingEstimatedHistogramReservoir()));
-        registerMBean(timer, name.getMBeanName());
+        return timer(name, DEFAULT_TIMER_UNIT);
+    }
 
+    public SnapshottingTimer timer(MetricName name, MetricName alias)
+    {
+        return timer(name, alias, DEFAULT_TIMER_UNIT);
+    }
+
+    public SnapshottingTimer timer(MetricName name, TimeUnit durationUnit)
+    {
+        SnapshottingTimer timer = register(name, new SnapshottingTimer(CassandraMetricsRegistry.createReservoir(durationUnit)));
+        registerMBean(timer, name.getMBeanName());
         return timer;
     }
 
-    public Timer timer(MetricName name, MetricName alias)
+    public SnapshottingTimer timer(MetricName name, MetricName alias, TimeUnit durationUnit)
     {
-        Timer timer = timer(name);
+        SnapshottingTimer timer = timer(name, durationUnit);
         registerAlias(name, alias);
         return timer;
     }
 
+    public static SnapshottingReservoir createReservoir(TimeUnit durationUnit)
+    {
+        SnapshottingReservoir reservoir;
+        if (durationUnit != TimeUnit.NANOSECONDS)
+        {
+            SnapshottingReservoir underlying = new DecayingEstimatedHistogramReservoir(DecayingEstimatedHistogramReservoir.DEFAULT_ZERO_CONSIDERATION,
+                                                                           DecayingEstimatedHistogramReservoir.LOW_BUCKET_COUNT,
+                                                                           DecayingEstimatedHistogramReservoir.DEFAULT_STRIPE_COUNT);
+            // fewer buckets should suffice if timer is not based on nanos
+            reservoir = new ScalingReservoir(underlying,
+                                             // timer update values in nanos.
+                                             v -> durationUnit.convert(v, TimeUnit.NANOSECONDS));
+        }
+        else
+        {
+            // Use more buckets if timer is created with nanos resolution.
+            reservoir = new DecayingEstimatedHistogramReservoir();
+        }
+        return reservoir;
+    }
+
     public <T extends Metric> T register(MetricName name, T metric)
     {
         try
@@ -196,7 +227,7 @@
         else if (metric instanceof Histogram)
             mbean = new JmxHistogram((Histogram) metric, name);
         else if (metric instanceof Timer)
-            mbean = new JmxTimer((Timer) metric, name, TimeUnit.SECONDS, TimeUnit.MICROSECONDS);
+            mbean = new JmxTimer((Timer) metric, name, TimeUnit.SECONDS, DEFAULT_TIMER_UNIT);
         else if (metric instanceof Metered)
             mbean = new JmxMeter((Metered) metric, name, TimeUnit.SECONDS);
         else
@@ -532,7 +563,6 @@
     static class JmxTimer extends JmxMeter implements JmxTimerMBean
     {
         private final Timer metric;
-        private final double durationFactor;
         private final String durationUnit;
         private long[] last = null;
 
@@ -543,68 +573,67 @@
         {
             super(metric, objectName, rateUnit);
             this.metric = metric;
-            this.durationFactor = 1.0 / durationUnit.toNanos(1);
             this.durationUnit = durationUnit.toString().toLowerCase(Locale.US);
         }
 
         @Override
         public double get50thPercentile()
         {
-            return metric.getSnapshot().getMedian() * durationFactor;
+            return metric.getSnapshot().getMedian();
         }
 
         @Override
         public double getMin()
         {
-            return metric.getSnapshot().getMin() * durationFactor;
+            return metric.getSnapshot().getMin();
         }
 
         @Override
         public double getMax()
         {
-            return metric.getSnapshot().getMax() * durationFactor;
+            return metric.getSnapshot().getMax();
         }
 
         @Override
         public double getMean()
         {
-            return metric.getSnapshot().getMean() * durationFactor;
+            return metric.getSnapshot().getMean();
         }
 
         @Override
         public double getStdDev()
         {
-            return metric.getSnapshot().getStdDev() * durationFactor;
+            return metric.getSnapshot().getStdDev();
         }
 
         @Override
         public double get75thPercentile()
         {
-            return metric.getSnapshot().get75thPercentile() * durationFactor;
+            return metric.getSnapshot().get75thPercentile();
         }
 
         @Override
         public double get95thPercentile()
         {
-            return metric.getSnapshot().get95thPercentile() * durationFactor;
+            return metric.getSnapshot().get95thPercentile();
         }
 
         @Override
         public double get98thPercentile()
         {
-            return metric.getSnapshot().get98thPercentile() * durationFactor;
+            return metric.getSnapshot().get98thPercentile();
         }
 
         @Override
         public double get99thPercentile()
         {
-            return metric.getSnapshot().get99thPercentile() * durationFactor;
+            return metric.getSnapshot().get99thPercentile();
         }
 
         @Override
         public double get999thPercentile()
         {
-            return metric.getSnapshot().get999thPercentile() * durationFactor;
+            return metric.getSnapshot().get999thPercentile();
         }
 
         @Override
diff --git a/src/java/org/apache/cassandra/metrics/ClientMetrics.java b/src/java/org/apache/cassandra/metrics/ClientMetrics.java
index 29ae693..4e3eb4f 100644
--- a/src/java/org/apache/cassandra/metrics/ClientMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ClientMetrics.java
@@ -46,6 +46,7 @@
     private Gauge<Integer> pausedConnectionsGauge;
     
     private Meter requestDiscarded;
+    private Meter requestDispatched;
 
     private Meter protocolException;
     private Meter unknownException;
@@ -68,6 +69,7 @@
     public void unpauseConnection() { pausedConnections.decrementAndGet(); }
 
     public void markRequestDiscarded() { requestDiscarded.mark(); }
+    public void markRequestDispatched() { requestDispatched.mark(); }
 
     public List<ConnectedClient> allConnectedClients()
     {
@@ -119,6 +121,7 @@
         pausedConnections = new AtomicInteger();
         pausedConnectionsGauge = registerGauge("PausedConnections", pausedConnections::get);
         requestDiscarded = registerMeter("RequestDiscarded");
+        requestDispatched = registerMeter("RequestDispatched");
 
         protocolException = registerMeter("ProtocolException");
         unknownException = registerMeter("UnknownException");
diff --git a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java
index e3a6970..4080870 100644
--- a/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ClientRequestMetrics.java
@@ -22,6 +22,9 @@
 
 
 import com.codahale.metrics.Meter;
+import org.apache.cassandra.exceptions.ReadAbortException;
+import org.apache.cassandra.exceptions.ReadSizeAbortException;
+import org.apache.cassandra.exceptions.TombstoneAbortException;
 
 import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
 
@@ -31,6 +34,11 @@
     public final Meter timeouts;
     public final Meter unavailables;
     public final Meter failures;
+    public final Meter aborts;
+    public final Meter tombstoneAborts;
+    public final Meter readSizeAborts;
+    public final Meter localRequests;
+    public final Meter remoteRequests;
 
     public ClientRequestMetrics(String scope)
     {
@@ -39,6 +47,26 @@
         timeouts = Metrics.meter(factory.createMetricName("Timeouts"));
         unavailables = Metrics.meter(factory.createMetricName("Unavailables"));
         failures = Metrics.meter(factory.createMetricName("Failures"));
+        aborts = Metrics.meter(factory.createMetricName("Aborts"));
+        tombstoneAborts = Metrics.meter(factory.createMetricName("TombstoneAborts"));
+        readSizeAborts = Metrics.meter(factory.createMetricName("ReadSizeAborts"));
+        localRequests = Metrics.meter(factory.createMetricName("LocalRequests"));
+        remoteRequests = Metrics.meter(factory.createMetricName("RemoteRequests"));
+    }
+
+    public void markAbort(Throwable cause)
+    {
+        aborts.mark();
+        if (!(cause instanceof ReadAbortException))
+            return;
+        if (cause instanceof TombstoneAbortException)
+        {
+            tombstoneAborts.mark();
+        }
+        else if (cause instanceof ReadSizeAbortException)
+        {
+            readSizeAborts.mark();
+        }
     }
 
     public void release()
@@ -47,5 +75,10 @@
         Metrics.remove(factory.createMetricName("Timeouts"));
         Metrics.remove(factory.createMetricName("Unavailables"));
         Metrics.remove(factory.createMetricName("Failures"));
+        Metrics.remove(factory.createMetricName("Aborts"));
+        Metrics.remove(factory.createMetricName("TombstoneAborts"));
+        Metrics.remove(factory.createMetricName("ReadSizeAborts"));
+        Metrics.remove(factory.createMetricName("LocalRequests"));
+        Metrics.remove(factory.createMetricName("RemoteRequests"));
     }
 }
diff --git a/src/java/org/apache/cassandra/metrics/ClientRequestsMetricsHolder.java b/src/java/org/apache/cassandra/metrics/ClientRequestsMetricsHolder.java
index 05ab338..26f2913 100644
--- a/src/java/org/apache/cassandra/metrics/ClientRequestsMetricsHolder.java
+++ b/src/java/org/apache/cassandra/metrics/ClientRequestsMetricsHolder.java
@@ -30,8 +30,8 @@
     public static final CASClientRequestMetrics casReadMetrics = new CASClientRequestMetrics("CASRead");
     public static final ViewWriteMetrics viewWriteMetrics = new ViewWriteMetrics("ViewWrite");
 
-    private static final Map<ConsistencyLevel, ClientRequestMetrics> readMetricsMap = new EnumMap<>(ConsistencyLevel.class);
-    private static final Map<ConsistencyLevel, ClientWriteRequestMetrics> writeMetricsMap = new EnumMap<>(ConsistencyLevel.class);
+    public static final Map<ConsistencyLevel, ClientRequestMetrics> readMetricsMap = new EnumMap<>(ConsistencyLevel.class);
+    public static final Map<ConsistencyLevel, ClientWriteRequestMetrics> writeMetricsMap = new EnumMap<>(ConsistencyLevel.class);
 
     static
     {
diff --git a/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java b/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java
index a3302bc..cb53575 100644
--- a/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CommitLogMetrics.java
@@ -42,6 +42,8 @@
     public final Timer waitingOnSegmentAllocation;
     /** The time spent waiting on CL sync; for Periodic this is only occurs when the sync is lagging its sync interval */
     public final Timer waitingOnCommit;
+    /** Time spent actually flushing the contents of a buffer to disk */
+    public final Timer waitingOnFlush;
     /** Number and rate of oversized mutations */
     public final Meter oversizedMutations;
 
@@ -49,6 +51,7 @@
     {
         waitingOnSegmentAllocation = Metrics.timer(factory.createMetricName("WaitingOnSegmentAllocation"));
         waitingOnCommit = Metrics.timer(factory.createMetricName("WaitingOnCommit"));
+        waitingOnFlush = Metrics.timer(factory.createMetricName("WaitingOnFlush"));
         oversizedMutations = Metrics.meter(factory.createMetricName("OverSizedMutations"));
     }
 
diff --git a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
index 46e5940..0fe1ec7 100644
--- a/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/CompactionMetrics.java
@@ -18,18 +18,17 @@
 package org.apache.cassandra.metrics;
 
 import java.util.*;
-import java.util.concurrent.ThreadPoolExecutor;
 
 import com.codahale.metrics.Counter;
 import com.codahale.metrics.Gauge;
 import com.codahale.metrics.Meter;
 
+import com.codahale.metrics.Timer;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.compaction.ActiveCompactions;
 import org.apache.cassandra.db.compaction.CompactionInfo;
 import org.apache.cassandra.db.compaction.CompactionManager;
-import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
 
@@ -53,7 +52,8 @@
     public final Meter totalCompactionsCompleted;
     /** Total number of bytes compacted since server [re]start */
     public final Counter bytesCompacted;
-
+    /** Time spent redistributing index summaries */
+    public final Timer indexSummaryRedistributionTime;
 
     /** Total number of compactions that have had sstables drop out of them */
     public final Counter compactionsReduced;
@@ -64,7 +64,7 @@
     /** Total number of compactions which have outright failed due to lack of disk space */
     public final Counter compactionsAborted;
 
-    public CompactionMetrics(final ThreadPoolExecutor... collectors)
+    public CompactionMetrics(final ExecutorPlus... collectors)
     {
         pendingTasks = Metrics.register(factory.createMetricName("PendingTasks"), new Gauge<Integer>()
         {
@@ -139,7 +139,7 @@
             public Long getValue()
             {
                 long completedTasks = 0;
-                for (ThreadPoolExecutor collector : collectors)
+                for (ExecutorPlus collector : collectors)
                     completedTasks += collector.getCompletedTaskCount();
                 return completedTasks;
             }
@@ -151,5 +151,6 @@
         compactionsReduced = Metrics.counter(factory.createMetricName("CompactionsReduced"));
         sstablesDropppedFromCompactions = Metrics.counter(factory.createMetricName("SSTablesDroppedFromCompaction"));
         compactionsAborted = Metrics.counter(factory.createMetricName("CompactionsAborted"));
+        indexSummaryRedistributionTime = Metrics.timer(factory.createMetricName("IndexSummaryRedistributionTime"));
     }
 }
diff --git a/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java b/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java
index 6dd1687..308023e 100644
--- a/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java
+++ b/src/java/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoir.java
@@ -22,17 +22,23 @@
 import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 import java.util.Objects;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLongArray;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
 
-import com.codahale.metrics.Clock;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import com.codahale.metrics.Reservoir;
 import com.codahale.metrics.Snapshot;
 import org.apache.cassandra.utils.EstimatedHistogram;
+import org.apache.cassandra.utils.MonotonicClock;
+import org.apache.cassandra.utils.NoSpamLogger;
 
 import static java.lang.Math.max;
 import static java.lang.Math.min;
@@ -76,13 +82,15 @@
  *   <li>[3]: https://github.com/dropwizard/metrics/blob/v3.1.2/metrics-core/src/main/java/com/codahale/metrics/ExponentiallyDecayingReservoir.java</li>
  * </ul>
  */
-public class DecayingEstimatedHistogramReservoir implements Reservoir
+public class DecayingEstimatedHistogramReservoir implements SnapshottingReservoir
 {
-
+    private static final Logger logger = LoggerFactory.getLogger(DecayingEstimatedHistogramReservoir.class);
+    private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(logger, 5L, TimeUnit.MINUTES);
     /**
      * The default number of decayingBuckets. Use this bucket count to reduce memory allocation for bucket offsets.
      */
     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 MAX_BUCKET_COUNT = 237;
     public static final boolean DEFAULT_ZERO_CONSIDERATION = false;
@@ -146,21 +154,20 @@
 
     public static final long HALF_TIME_IN_S = 60L;
     public static final double MEAN_LIFETIME_IN_S = HALF_TIME_IN_S / Math.log(2.0);
-    public static final long LANDMARK_RESET_INTERVAL_IN_MS = 30L * 60L * 1000L;
+    public static final long LANDMARK_RESET_INTERVAL_IN_NS = TimeUnit.MINUTES.toNanos(30L);
 
     private final AtomicBoolean rescaling = new AtomicBoolean(false);
     private volatile long decayLandmark;
 
     // Wrapper around System.nanoTime() to simplify unit testing.
-    private final Clock clock;
-
+    private final MonotonicClock clock;
 
     /**
      * Construct a decaying histogram with default number of buckets and without considering zeroes.
      */
     public DecayingEstimatedHistogramReservoir()
     {
-        this(DEFAULT_ZERO_CONSIDERATION, DEFAULT_BUCKET_COUNT, DEFAULT_STRIPE_COUNT, Clock.defaultClock());
+        this(DEFAULT_ZERO_CONSIDERATION, DEFAULT_BUCKET_COUNT, DEFAULT_STRIPE_COUNT, MonotonicClock.Global.approxTime);
     }
 
     /**
@@ -171,7 +178,7 @@
      */
     public DecayingEstimatedHistogramReservoir(boolean considerZeroes)
     {
-        this(considerZeroes, DEFAULT_BUCKET_COUNT, DEFAULT_STRIPE_COUNT, Clock.defaultClock());
+        this(considerZeroes, DEFAULT_BUCKET_COUNT, DEFAULT_STRIPE_COUNT, MonotonicClock.Global.approxTime);
     }
 
     /**
@@ -183,17 +190,17 @@
      */
     public DecayingEstimatedHistogramReservoir(boolean considerZeroes, int bucketCount, int stripes)
     {
-        this(considerZeroes, bucketCount, stripes, Clock.defaultClock());
+        this(considerZeroes, bucketCount, stripes, MonotonicClock.Global.approxTime);
     }
 
     @VisibleForTesting
-    public DecayingEstimatedHistogramReservoir(Clock clock)
+    public DecayingEstimatedHistogramReservoir(MonotonicClock clock)
     {
         this(DEFAULT_ZERO_CONSIDERATION, DEFAULT_BUCKET_COUNT, DEFAULT_STRIPE_COUNT, clock);
     }
 
     @VisibleForTesting
-    DecayingEstimatedHistogramReservoir(boolean considerZeroes, int bucketCount, int stripes, Clock clock)
+    DecayingEstimatedHistogramReservoir(boolean considerZeroes, int bucketCount, int stripes, MonotonicClock clock)
     {
         assert bucketCount <= MAX_BUCKET_COUNT : "bucket count cannot exceed: " + MAX_BUCKET_COUNT;
 
@@ -217,7 +224,7 @@
         decayingBuckets = new AtomicLongArray((bucketOffsets.length + 1) * nStripes);
         buckets = new AtomicLongArray((bucketOffsets.length + 1) * nStripes);
         this.clock = clock;
-        decayLandmark = clock.getTime();
+        decayLandmark = clock.now();
         int distributionPrime = 1;
         for (int prime : DISTRIBUTION_PRIMES)
         {
@@ -237,7 +244,7 @@
      */
     public void update(long value)
     {
-        long now = clock.getTime();
+        long now = clock.now();
         rescaleIfNeeded(now);
 
         int index = findIndex(bucketOffsets, value);
@@ -282,7 +289,7 @@
 
     private double forwardDecayWeight(long now)
     {
-        return Math.exp(((now - decayLandmark) / 1000.0) / MEAN_LIFETIME_IN_S);
+        return Math.exp(TimeUnit.NANOSECONDS.toSeconds(now - decayLandmark) / MEAN_LIFETIME_IN_S);
     }
 
     /**
@@ -311,12 +318,20 @@
      *
      * @return the snapshot
      */
+    @Override
     public Snapshot getSnapshot()
     {
         rescaleIfNeeded();
         return new EstimatedHistogramReservoirSnapshot(this);
     }
 
+    @Override
+    public Snapshot getPercentileSnapshot()
+    {
+        rescaleIfNeeded();
+        return new DecayingBucketsOnlySnapshot(this);
+    }
+
     /**
      * @return true if this histogram has overflowed -- that is, a value larger than our largest bucket could bound was added
      */
@@ -344,7 +359,7 @@
 
     private void rescaleIfNeeded()
     {
-        rescaleIfNeeded(clock.getTime());
+        rescaleIfNeeded(clock.now());
     }
 
     private void rescaleIfNeeded(long now)
@@ -379,7 +394,7 @@
 
     private boolean needRescale(long now)
     {
-        return (now - decayLandmark) > LANDMARK_RESET_INTERVAL_IN_MS;
+        return (now - decayLandmark) > LANDMARK_RESET_INTERVAL_IN_NS;
     }
 
     @VisibleForTesting
@@ -429,42 +444,16 @@
 
     }
 
-    /**
-     * Represents a snapshot of the decaying histogram.
-     *
-     * The decaying buckets are copied into a snapshot array to give a consistent view for all getters. However, the
-     * copy is made without a write-lock and so other threads may change the buckets while the array is copied,
-     * probably causign a slight skew up in the quantiles and mean values.
-     *
-     * The decaying buckets will be used for quantile calculations and mean values, but the non decaying buckets will be
-     * exposed for calls to {@link Snapshot#getValues()}.
-     */
-    static class EstimatedHistogramReservoirSnapshot extends Snapshot
+    private static abstract class AbstractSnapshot extends Snapshot
     {
-        private final long[] decayingBuckets;
-        private final long[] values;
-        private long count;
-        private long snapshotLandmark;
-        private long[] bucketOffsets;
-        private DecayingEstimatedHistogramReservoir reservoir;
+        protected final long[] decayingBuckets;
+        protected final long[] bucketOffsets;
 
-        public EstimatedHistogramReservoirSnapshot(DecayingEstimatedHistogramReservoir reservoir)
+        AbstractSnapshot(DecayingEstimatedHistogramReservoir reservoir)
         {
-            final int length = reservoir.size();
-            final double rescaleFactor = reservoir.forwardDecayWeight(reservoir.clock.getTime());
-
+            int length = reservoir.size();
             this.decayingBuckets = new long[length];
-            this.values = new long[length];
-            this.snapshotLandmark = reservoir.decayLandmark;
             this.bucketOffsets = reservoir.bucketOffsets; // No need to copy, these are immutable
-
-            for (int i = 0; i < length; i++)
-            {
-                this.decayingBuckets[i] = Math.round(reservoir.bucketValue(i, true) / rescaleFactor);
-                this.values[i] = reservoir.bucketValue(i, false);
-            }
-            this.count = count();
-            this.reservoir = reservoir;
         }
 
         /**
@@ -474,6 +463,7 @@
          * @return estimated value at given quantile
          * @throws IllegalStateException in case the histogram overflowed
          */
+        @Override
         public double getValue(double quantile)
         {
             assert quantile >= 0 && quantile <= 1.0;
@@ -481,7 +471,10 @@
             final int lastBucket = decayingBuckets.length - 1;
 
             if (decayingBuckets[lastBucket] > 0)
-                throw new IllegalStateException("Unable to compute when histogram overflowed");
+            {
+                try { throw new IllegalStateException("EstimatedHistogram overflow: " + Arrays.toString(decayingBuckets)); }
+                catch (IllegalStateException e) { noSpamLogger.warn("", e); }
+            }
 
             final long qcount = (long) Math.ceil(count() * quantile);
             if (qcount == 0)
@@ -498,48 +491,11 @@
         }
 
         /**
-         * Will return a snapshot of the non-decaying buckets.
-         *
-         * The values returned will not be consistent with the quantile and mean values. The caller must be aware of the
-         * offsets created by {@link EstimatedHistogram#getBucketOffsets()} to make use of the values returned.
-         *
-         * @return a snapshot of the non-decaying buckets.
-         */
-        public long[] getValues()
-        {
-            return values;
-        }
-
-        /**
-         * @see {@link Snapshot#size()}
-         * @return
-         */
-        public int size()
-        {
-            return Ints.saturatedCast(count);
-        }
-
-        @VisibleForTesting
-        public long getSnapshotLandmark()
-        {
-            return snapshotLandmark;
-        }
-
-        @VisibleForTesting
-        public Range getBucketingRangeForValue(long value)
-        {
-            int index = findIndex(bucketOffsets, value);
-            long max = bucketOffsets[index];
-            long min = index == 0 ? 0 : 1 + bucketOffsets[index - 1];
-            return new Range(min, max);
-        }
-
-        /**
          * Return the number of registered values taking forward decay into account.
          *
          * @return the sum of all bucket values
          */
-        private long count()
+        protected long count()
         {
             long sum = 0L;
             for (int i = 0; i < decayingBuckets.length; i++)
@@ -556,6 +512,7 @@
          * @return the largest value that could have been added to this reservoir, or Long.MAX_VALUE if the reservoir
          * overflowed
          */
+        @Override
         public long getMax()
         {
             final int lastBucket = decayingBuckets.length - 1;
@@ -577,6 +534,7 @@
          * @return the mean histogram value (average of bucket offsets, weighted by count)
          * @throws IllegalStateException if any values were greater than the largest bucket threshold
          */
+        @Override
         public double getMean()
         {
             final int lastBucket = decayingBuckets.length - 1;
@@ -604,6 +562,7 @@
          *
          * @return the smallest value that could have been added to this reservoir
          */
+        @Override
         public long getMin()
         {
             for (int i = 0; i < decayingBuckets.length; i++)
@@ -622,6 +581,7 @@
          *
          * @return an estimate of the standard deviation
          */
+        @Override
         public double getStdDev()
         {
             final int lastBucket = decayingBuckets.length - 1;
@@ -651,6 +611,7 @@
             }
         }
 
+        @Override
         public void dump(OutputStream output)
         {
             try (PrintWriter out = new PrintWriter(new OutputStreamWriter(output, StandardCharsets.UTF_8)))
@@ -663,6 +624,77 @@
                 }
             }
         }
+    }
+
+    /**
+     * Represents a snapshot of the decaying histogram.
+     *
+     * The decaying buckets are copied into a snapshot array to give a consistent view for all getters. However, the
+     * copy is made without a write-lock and so other threads may change the buckets while the array is copied,
+     * probably causing a slight skew up in the quantiles and mean values.
+     *
+     * The decaying buckets will be used for quantile calculations and mean values, but the non decaying buckets will be
+     * exposed for calls to {@link Snapshot#getValues()}.
+     */
+    static class EstimatedHistogramReservoirSnapshot extends AbstractSnapshot
+    {
+        private final long[] values;
+        private long count;
+        private long snapshotLandmark;
+        private final DecayingEstimatedHistogramReservoir reservoir;
+
+        public EstimatedHistogramReservoirSnapshot(DecayingEstimatedHistogramReservoir reservoir)
+        {
+            super(reservoir);
+            
+            int length = reservoir.size();
+            double rescaleFactor = reservoir.forwardDecayWeight(reservoir.clock.now());
+
+            this.values = new long[length];
+            this.snapshotLandmark = reservoir.decayLandmark;
+
+            for (int i = 0; i < length; i++)
+            {
+                this.decayingBuckets[i] = Math.round(reservoir.bucketValue(i, true) / rescaleFactor);
+                this.values[i] = reservoir.bucketValue(i, false);
+            }
+            this.count = count();
+            this.reservoir = reservoir;
+        }
+
+        /**
+         * Will return a snapshot of the non-decaying buckets.
+         *
+         * The values returned will not be consistent with the quantile and mean values. The caller must be aware of the
+         * offsets created by {@link EstimatedHistogram#getBucketOffsets()} to make use of the values returned.
+         *
+         * @return a snapshot of the non-decaying buckets.
+         */
+        public long[] getValues()
+        {
+            return values;
+        }
+
+        @Override
+        public int size()
+        {
+            return Ints.saturatedCast(count);
+        }
+
+        @VisibleForTesting
+        public long getSnapshotLandmark()
+        {
+            return snapshotLandmark;
+        }
+
+        @VisibleForTesting
+        public Range getBucketingRangeForValue(long value)
+        {
+            int index = findIndex(bucketOffsets, value);
+            long max = bucketOffsets[index];
+            long min = index == 0 ? 0 : 1 + bucketOffsets[index - 1];
+            return new Range(min, max);
+        }
 
         /**
          * Adds another DecayingEstimatedHistogramReservoir's Snapshot to this one. Both reservoirs must have same bucket definitions. This will rescale both snapshots if needed.
@@ -722,12 +754,51 @@
             }
         }
 
-        public void rebaseReservoir() 
+        public void rebaseReservoir()
         {
             this.reservoir.rebase(this);
         }
     }
 
+    /**
+     * Like {@link EstimatedHistogramReservoirSnapshot}, represents a snapshot of a given histogram reservoir.
+     * 
+     * Unlike {@link EstimatedHistogramReservoirSnapshot}, this only copies and supports operations based on the
+     * decaying buckets from the source reservoir. (ex. percentiles, min, max) It also does not support snapshot 
+     * merging or rebasing on the source reservoir.
+     */
+    private static class DecayingBucketsOnlySnapshot extends AbstractSnapshot
+    {
+        private final long count;
+
+        public DecayingBucketsOnlySnapshot(DecayingEstimatedHistogramReservoir reservoir)
+        {
+            super(reservoir);
+
+            int length = reservoir.size();
+            double rescaleFactor = reservoir.forwardDecayWeight(reservoir.clock.now());
+
+            for (int i = 0; i < length; i++)
+            {
+                this.decayingBuckets[i] = Math.round(reservoir.bucketValue(i, true) / rescaleFactor);
+            }
+
+            this.count = count();
+        }
+
+        @Override
+        public long[] getValues()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int size()
+        {
+            return Ints.saturatedCast(count);
+        }
+    }
+
     static class Range
     {
         public final long min;
@@ -752,5 +823,11 @@
         {
             return Objects.hash(min, max);
         }
+
+        @Override
+        public String toString()
+        {
+            return "[" + min + ',' + max + ']';
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/metrics/DenylistMetrics.java b/src/java/org/apache/cassandra/metrics/DenylistMetrics.java
new file mode 100644
index 0000000..0372787
--- /dev/null
+++ b/src/java/org/apache/cassandra/metrics/DenylistMetrics.java
@@ -0,0 +1,58 @@
+/*
+ * 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.metrics;
+
+import com.codahale.metrics.Meter;
+
+import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
+
+public class DenylistMetrics
+{
+    private final Meter writesRejected;
+    private final Meter readsRejected;
+    private final Meter rangeReadsRejected;
+    private final Meter totalRequestsRejected;
+
+    public DenylistMetrics()
+    {
+        final MetricNameFactory factory = new DefaultNameFactory("StorageProxy", "PartitionDenylist");
+        writesRejected = Metrics.meter(factory.createMetricName("WriteRejected"));
+        readsRejected = Metrics.meter(factory.createMetricName("ReadRejected"));
+        rangeReadsRejected = Metrics.meter(factory.createMetricName("RangeReadRejected"));
+        totalRequestsRejected = Metrics.meter(factory.createMetricName("TotalRejected"));
+    }
+
+    public void incrementWritesRejected()
+    {
+        writesRejected.mark();
+        totalRequestsRejected.mark();
+    }
+
+    public void incrementReadsRejected()
+    {
+        readsRejected.mark();
+        totalRequestsRejected.mark();
+    }
+
+    public void incrementRangeReadsRejected()
+    {
+        rangeReadsRejected.mark();
+        totalRequestsRejected.mark();
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java b/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java
index 0261e8e..bc87218 100644
--- a/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/HintedHandoffMetrics.java
@@ -19,19 +19,19 @@
 
 import java.util.Map.Entry;
 
-import com.google.common.util.concurrent.MoreExecutors;
-
 import com.codahale.metrics.Counter;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
 
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.utils.UUIDGen;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * Metrics for {@link org.apache.cassandra.hints.HintsService}.
@@ -44,12 +44,12 @@
 
     /** Total number of hints which are not stored, This is not a cache. */
     private final LoadingCache<InetAddressAndPort, DifferencingCounter> notStored = Caffeine.newBuilder()
-                                                                                            .executor(MoreExecutors.directExecutor())
+                                                                                            .executor(ImmediateExecutor.INSTANCE)
                                                                                             .build(DifferencingCounter::new);
 
     /** Total number of hints that have been created, This is not a cache. */
     private final LoadingCache<InetAddressAndPort, Counter> createdHintCounts = Caffeine.newBuilder()
-                                                                                        .executor(MoreExecutors.directExecutor())
+                                                                                        .executor(ImmediateExecutor.INSTANCE)
                                                                                         .build(address -> Metrics.counter(factory.createMetricName("Hints_created-" + address.toString().replace(':', '.'))));
 
     public void incrCreatedHints(InetAddressAndPort address)
@@ -70,7 +70,7 @@
             if (difference == 0)
                 continue;
             logger.warn("{} has {} dropped hints, because node is down past configured hint window.", entry.getKey(), difference);
-            SystemKeyspace.updateHintsDropped(entry.getKey(), UUIDGen.getTimeUUID(), (int) difference);
+            SystemKeyspace.updateHintsDropped(entry.getKey(), nextTimeUUID(), (int) difference);
         }
     }
 
diff --git a/src/java/org/apache/cassandra/metrics/HintsServiceMetrics.java b/src/java/org/apache/cassandra/metrics/HintsServiceMetrics.java
index 424f502..bcff389 100644
--- a/src/java/org/apache/cassandra/metrics/HintsServiceMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/HintsServiceMetrics.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.metrics;
 
-import com.google.common.util.concurrent.MoreExecutors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -25,6 +24,7 @@
 import com.codahale.metrics.Meter;
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.locator.InetAddressAndPort;
 
 import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
@@ -47,7 +47,7 @@
 
     /** Histograms per-endpoint of hint delivery delays, This is not a cache. */
     private static final LoadingCache<InetAddressAndPort, Histogram> delayByEndpoint = Caffeine.newBuilder()
-                                                                                               .executor(MoreExecutors.directExecutor())
+                                                                                               .executor(ImmediateExecutor.INSTANCE)
                                                                                                .build(address -> Metrics.histogram(factory.createMetricName("Hint_delays-"+address.toString().replace(':', '.')), false));
 
     public static void updateDelayMetrics(InetAddressAndPort endpoint, long delay)
diff --git a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java
index dadbe47..776027e 100644
--- a/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/KeyspaceMetrics.java
@@ -153,6 +153,21 @@
     public final Histogram repairedDataTrackingOverreadRows;
     public final Timer repairedDataTrackingOverreadTime;
 
+    public final Meter clientTombstoneWarnings;
+    public final Meter clientTombstoneAborts;
+
+    public final Meter coordinatorReadSizeWarnings;
+    public final Meter coordinatorReadSizeAborts;
+    public final Histogram coordinatorReadSize;
+
+    public final Meter localReadSizeWarnings;
+    public final Meter localReadSizeAborts;
+    public final Histogram localReadSize;
+
+    public final Meter rowIndexSizeWarnings;
+    public final Meter rowIndexSizeAborts;
+    public final Histogram rowIndexSize;
+
     public final MetricNameFactory factory;
     private Keyspace keyspace;
 
@@ -235,6 +250,21 @@
 
         repairedDataTrackingOverreadRows = createKeyspaceHistogram("RepairedDataTrackingOverreadRows", false);
         repairedDataTrackingOverreadTime = createKeyspaceTimer("RepairedDataTrackingOverreadTime");
+
+        clientTombstoneWarnings = createKeyspaceMeter("ClientTombstoneWarnings");
+        clientTombstoneAborts = createKeyspaceMeter("ClientTombstoneAborts");
+
+        coordinatorReadSizeWarnings = createKeyspaceMeter("CoordinatorReadSizeWarnings");
+        coordinatorReadSizeAborts = createKeyspaceMeter("CoordinatorReadSizeAborts");
+        coordinatorReadSize = createKeyspaceHistogram("CoordinatorReadSize", false);
+
+        localReadSizeWarnings = createKeyspaceMeter("LocalReadSizeWarnings");
+        localReadSizeAborts = createKeyspaceMeter("LocalReadSizeAborts");
+        localReadSize = createKeyspaceHistogram("LocalReadSize", false);
+
+        rowIndexSizeWarnings = createKeyspaceMeter("RowIndexSizeWarnings");
+        rowIndexSizeAborts = createKeyspaceMeter("RowIndexSizeAborts");
+        rowIndexSize = createKeyspaceHistogram("RowIndexSize", false);
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
index bf0bc1f..af8ad71 100644
--- a/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/LatencyMetrics.java
@@ -89,7 +89,7 @@
         this.aliasFactory = aliasFactory;
         this.namePrefix = namePrefix;
 
-        LatencyMetricsTimer timer = new LatencyMetrics.LatencyMetricsTimer(new DecayingEstimatedHistogramReservoir());
+        LatencyMetricsTimer timer = new LatencyMetrics.LatencyMetricsTimer(CassandraMetricsRegistry.createReservoir(TimeUnit.MICROSECONDS));
         Counter counter = new LatencyMetricsCounter();
 
         if (aliasFactory == null)
diff --git a/src/java/org/apache/cassandra/metrics/MessagingMetrics.java b/src/java/org/apache/cassandra/metrics/MessagingMetrics.java
index 4948af6..bef6d08 100644
--- a/src/java/org/apache/cassandra/metrics/MessagingMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/MessagingMetrics.java
@@ -41,6 +41,7 @@
 import org.apache.cassandra.utils.StatusLogger;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.metrics.CassandraMetricsRegistry.DEFAULT_TIMER_UNIT;
 import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
 
 /**
@@ -209,8 +210,8 @@
                                       LOG_DROPPED_INTERVAL_IN_MS,
                                       droppedInternal,
                                       droppedCrossNode,
-                                      TimeUnit.NANOSECONDS.toMillis((long) droppedForVerb.metrics.internalDroppedLatency.getSnapshot().getMean()),
-                                      TimeUnit.NANOSECONDS.toMillis((long) droppedForVerb.metrics.crossNodeDroppedLatency.getSnapshot().getMean())));
+                                      DEFAULT_TIMER_UNIT.toMillis((long) droppedForVerb.metrics.internalDroppedLatency.getSnapshot().getMean()),
+                                      DEFAULT_TIMER_UNIT.toMillis((long) droppedForVerb.metrics.crossNodeDroppedLatency.getSnapshot().getMean())));
                 ++count;
             }
         }
diff --git a/src/java/org/apache/cassandra/metrics/PaxosMetrics.java b/src/java/org/apache/cassandra/metrics/PaxosMetrics.java
new file mode 100644
index 0000000..62c62d8
--- /dev/null
+++ b/src/java/org/apache/cassandra/metrics/PaxosMetrics.java
@@ -0,0 +1,30 @@
+/*
+ * 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.metrics;
+
+import com.codahale.metrics.Counter;
+
+import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
+
+public class PaxosMetrics
+{
+    private static final MetricNameFactory factory = new DefaultNameFactory("Paxos");
+    public static final Counter linearizabilityViolations = Metrics.counter(factory.createMetricName("LinearizabilityViolations"));
+    public static void initialize() {}
+}
diff --git a/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java b/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java
index 989e09f..0319e26 100644
--- a/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ReadRepairMetrics.java
@@ -35,6 +35,7 @@
     public static final Meter repairedBackground = Metrics.meter(factory.createMetricName("RepairedBackground"));
     @Deprecated
     public static final Meter attempted = Metrics.meter(factory.createMetricName("Attempted"));
+    public static final Meter timedOut = Metrics.meter(factory.createMetricName("RepairTimedOut"));
 
     // Incremented when additional requests were sent during blocking read repair due to unavailable or slow nodes
     public static final Meter speculatedRead = Metrics.meter(factory.createMetricName("SpeculatedRead"));
diff --git a/src/java/org/apache/cassandra/metrics/Sampler.java b/src/java/org/apache/cassandra/metrics/Sampler.java
index cfe3f3b..b3d0f21 100644
--- a/src/java/org/apache/cassandra/metrics/Sampler.java
+++ b/src/java/org/apache/cassandra/metrics/Sampler.java
@@ -19,18 +19,19 @@
 
 import java.io.Serializable;
 import java.util.List;
-import java.util.concurrent.ArrayBlockingQueue;
-import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.MonotonicClock;
 
 import com.google.common.annotations.VisibleForTesting;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
 public abstract class Sampler<T>
 {
     public enum SamplerType
@@ -39,22 +40,15 @@
     }
 
     @VisibleForTesting
-    MonotonicClock clock = MonotonicClock.approxTime;
+    MonotonicClock clock = MonotonicClock.Global.approxTime;
 
     @VisibleForTesting
-    static final ThreadPoolExecutor samplerExecutor = new JMXEnabledThreadPoolExecutor(1, 1,
-            TimeUnit.SECONDS,
-            new ArrayBlockingQueue<Runnable>(1000),
-            new NamedThreadFactory("Sampler"),
-            "internal");
-
-    static
-    {
-        samplerExecutor.setRejectedExecutionHandler((runnable, executor) ->
-        {
-            MessagingService.instance().metrics.recordSelfDroppedMessage(Verb._SAMPLE);
-        });
-    }
+    static final ExecutorPlus samplerExecutor = executorFactory()
+            .withJmxInternal()
+            .configureSequential("Sampler")
+            .withQueueLimit(1000)
+            .withRejectedExecutionHandler((runnable, executor) -> MessagingService.instance().metrics.recordSelfDroppedMessage(Verb._SAMPLE))
+            .build();
 
     public void addSample(final T item, final int value)
     {
@@ -94,4 +88,9 @@
             return "Sample [value=" + value + ", count=" + count + ", error=" + error + "]";
         }
     }
+
+    public static void shutdownNowAndWait(long time, TimeUnit units) throws InterruptedException, TimeoutException
+    {
+        ExecutorUtils.shutdownNowAndWait(time, units, samplerExecutor);
+    }
 }
diff --git a/src/java/org/apache/cassandra/metrics/ScalingReservoir.java b/src/java/org/apache/cassandra/metrics/ScalingReservoir.java
new file mode 100644
index 0000000..7d81ffd
--- /dev/null
+++ b/src/java/org/apache/cassandra/metrics/ScalingReservoir.java
@@ -0,0 +1,70 @@
+/*
+ * 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.metrics;
+
+import com.codahale.metrics.Snapshot;
+
+/**
+ * A reservoir that scales the values before updating.
+ */
+public class ScalingReservoir implements SnapshottingReservoir
+{
+    private final SnapshottingReservoir delegate;
+    private final ScaleFunction scaleFunc;
+
+    public ScalingReservoir(SnapshottingReservoir reservoir, ScaleFunction scaleFunc)
+    {
+        this.delegate = reservoir;
+        this.scaleFunc = scaleFunc;
+    }
+
+    @Override
+    public int size()
+    {
+        return delegate.size();
+    }
+
+    @Override
+    public void update(long value)
+    {
+        delegate.update(scaleFunc.apply(value));
+    }
+
+    @Override
+    public Snapshot getSnapshot()
+    {
+        return delegate.getSnapshot();
+    }
+
+    @Override
+    public Snapshot getPercentileSnapshot()
+    {
+        return delegate.getPercentileSnapshot();
+    }
+
+    /**
+     * Scale the input value.
+     *
+     * Not using {@linkplain java.util.function.Function<Long, Long>} to avoid auto-boxing.
+     */
+    @FunctionalInterface
+    public static interface ScaleFunction
+    {
+        long apply(long value);
+    }
+}
diff --git a/src/java/org/apache/cassandra/metrics/SnapshottingReservoir.java b/src/java/org/apache/cassandra/metrics/SnapshottingReservoir.java
new file mode 100644
index 0000000..1b6c968
--- /dev/null
+++ b/src/java/org/apache/cassandra/metrics/SnapshottingReservoir.java
@@ -0,0 +1,27 @@
+/*
+ * 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.metrics;
+
+import com.codahale.metrics.Reservoir;
+import com.codahale.metrics.Snapshot;
+
+public interface SnapshottingReservoir extends Reservoir
+{
+    Snapshot getPercentileSnapshot();
+}
diff --git a/src/java/org/apache/cassandra/metrics/SnapshottingTimer.java b/src/java/org/apache/cassandra/metrics/SnapshottingTimer.java
new file mode 100644
index 0000000..3536492
--- /dev/null
+++ b/src/java/org/apache/cassandra/metrics/SnapshottingTimer.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.metrics;
+
+import com.codahale.metrics.Clock;
+import com.codahale.metrics.Snapshot;
+import com.codahale.metrics.Timer;
+
+public class SnapshottingTimer extends Timer
+{
+    private final SnapshottingReservoir reservoir;
+    
+    public SnapshottingTimer(SnapshottingReservoir reservoir)
+    {
+        this(reservoir, Clock.defaultClock());
+    }
+
+    public SnapshottingTimer(SnapshottingReservoir reservoir, Clock clock)
+    {
+        super(reservoir, clock);
+        this.reservoir = reservoir;
+    }
+
+    public Snapshot getPercentileSnapshot()
+    {
+        return reservoir.getPercentileSnapshot();
+    }
+}
diff --git a/src/java/org/apache/cassandra/metrics/StreamingMetrics.java b/src/java/org/apache/cassandra/metrics/StreamingMetrics.java
index 54df233..e38b605 100644
--- a/src/java/org/apache/cassandra/metrics/StreamingMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/StreamingMetrics.java
@@ -47,6 +47,8 @@
     public final Counter outgoingBytes;
     /* Measures the time taken for processing the incoming stream message after being deserialized, including the time to flush to disk. */
     public final Timer incomingProcessTime;
+    private final Counter entireSSTablesStreamedIn;
+    private final Counter partialSSTablesStreamedIn;
 
     public static StreamingMetrics get(InetAddressAndPort ip)
     {
@@ -79,5 +81,13 @@
         incomingBytes = Metrics.counter(factory.createMetricName("IncomingBytes"));
         outgoingBytes= Metrics.counter(factory.createMetricName("OutgoingBytes"));
         incomingProcessTime = Metrics.timer(factory.createMetricName("IncomingProcessTime"));
+
+        entireSSTablesStreamedIn = Metrics.counter(factory.createMetricName("EntireSSTablesStreamedIn"));
+        partialSSTablesStreamedIn = Metrics.counter(factory.createMetricName("PartialSSTablesStreamedIn"));
+    }
+
+    public void countStreamedIn(boolean isEntireSSTable)
+    {
+        (isEntireSSTable ? entireSSTablesStreamedIn : partialSSTablesStreamedIn).inc();
     }
 }
diff --git a/src/java/org/apache/cassandra/metrics/TableMetrics.java b/src/java/org/apache/cassandra/metrics/TableMetrics.java
index 09f41a1..5e7ab78 100644
--- a/src/java/org/apache/cassandra/metrics/TableMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/TableMetrics.java
@@ -17,7 +17,9 @@
  */
 package org.apache.cassandra.metrics;
 
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
 import static org.apache.cassandra.metrics.CassandraMetricsRegistry.Metrics;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 import java.nio.ByteBuffer;
 import java.util.*;
@@ -37,7 +39,7 @@
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.db.lifecycle.SSTableSet;
 import org.apache.cassandra.db.lifecycle.View;
 import org.apache.cassandra.index.SecondaryIndexManager;
@@ -205,9 +207,9 @@
     /** ratio of how much we anticompact vs how much we could mutate the repair status*/
     public final Gauge<Double> mutatedAnticompactionGauge;
 
-    public final Timer coordinatorReadLatency;
+    public final SnapshottingTimer coordinatorReadLatency;
     public final Timer coordinatorScanLatency;
-    public final Timer coordinatorWriteLatency;
+    public final SnapshottingTimer coordinatorWriteLatency;
 
     /** Time spent waiting for free memtable space, either on- or off-heap */
     public final Histogram waitingOnFreeMemtableSpace;
@@ -259,11 +261,26 @@
     /** When sampler activated, will track the slowest local reads **/
     public final Sampler<String> topLocalReadQueryTime;
 
+    public final TableMeter clientTombstoneWarnings;
+    public final TableMeter clientTombstoneAborts;
+
+    public final TableMeter coordinatorReadSizeWarnings;
+    public final TableMeter coordinatorReadSizeAborts;
+    public final TableHistogram coordinatorReadSize;
+
+    public final TableMeter localReadSizeWarnings;
+    public final TableMeter localReadSizeAborts;
+    public final TableHistogram localReadSize;
+
+    public final TableMeter rowIndexSizeWarnings;
+    public final TableMeter rowIndexSizeAborts;
+    public final TableHistogram rowIndexSize;
+
     private static Pair<Long, Long> totalNonSystemTablesSize(Predicate<SSTableReader> predicate)
     {
         long total = 0;
         long filtered = 0;
-        for (String keyspace : Schema.instance.getNonSystemKeyspaces())
+        for (String keyspace : Schema.instance.getNonSystemKeyspaces().names())
         {
 
             Keyspace k = Schema.instance.getKeyspaceInstance(keyspace);
@@ -376,11 +393,16 @@
      *
      * @param cfs ColumnFamilyStore to measure metrics
      */
-    public TableMetrics(final ColumnFamilyStore cfs)
+    public TableMetrics(final ColumnFamilyStore cfs, ReleasableMetric memtableMetrics)
     {
         factory = new TableMetricNameFactory(cfs, "Table");
         aliasFactory = new TableMetricNameFactory(cfs, "ColumnFamily");
 
+        if (memtableMetrics != null)
+        {
+            all.add(memtableMetrics);
+        }
+
         samplers = new EnumMap<>(SamplerType.class);
         topReadPartitionFrequency = new FrequencySampler<ByteBuffer>()
         {
@@ -425,16 +447,16 @@
         samplers.put(SamplerType.LOCAL_READ_TIME, topLocalReadQueryTime);
 
         memtableColumnsCount = createTableGauge("MemtableColumnsCount", 
-                                                () -> cfs.getTracker().getView().getCurrentMemtable().getOperations());
+                                                () -> cfs.getTracker().getView().getCurrentMemtable().operationCount());
 
         // MemtableOnHeapSize naming deprecated in 4.0
         memtableOnHeapDataSize = createTableGaugeWithDeprecation("MemtableOnHeapDataSize", "MemtableOnHeapSize", 
-                                                                 () -> cfs.getTracker().getView().getCurrentMemtable().getAllocator().onHeap().owns(), 
+                                                                 () -> Memtable.getMemoryUsage(cfs.getTracker().getView().getCurrentMemtable()).ownsOnHeap,
                                                                  new GlobalTableGauge("MemtableOnHeapDataSize"));
 
         // MemtableOffHeapSize naming deprecated in 4.0
         memtableOffHeapDataSize = createTableGaugeWithDeprecation("MemtableOffHeapDataSize", "MemtableOffHeapSize", 
-                                                                  () -> cfs.getTracker().getView().getCurrentMemtable().getAllocator().offHeap().owns(), 
+                                                                  () -> Memtable.getMemoryUsage(cfs.getTracker().getView().getCurrentMemtable()).ownsOffHeap,
                                                                   new GlobalTableGauge("MemtableOnHeapDataSize"));
         
         memtableLiveDataSize = createTableGauge("MemtableLiveDataSize", 
@@ -445,10 +467,7 @@
         {
             public Long getValue()
             {
-                long size = 0;
-                for (ColumnFamilyStore cfs2 : cfs.concatWithIndexes())
-                    size += cfs2.getTracker().getView().getCurrentMemtable().getAllocator().onHeap().owns();
-                return size;
+                return getMemoryUsageWithIndexes(cfs).ownsOnHeap;
             }
         }, new GlobalTableGauge("AllMemtablesOnHeapDataSize"));
 
@@ -457,10 +476,7 @@
         {
             public Long getValue()
             {
-                long size = 0;
-                for (ColumnFamilyStore cfs2 : cfs.concatWithIndexes())
-                    size += cfs2.getTracker().getView().getCurrentMemtable().getAllocator().offHeap().owns();
-                return size;
+                return getMemoryUsageWithIndexes(cfs).ownsOffHeap;
             }
         }, new GlobalTableGauge("AllMemtablesOffHeapDataSize"));
         allMemtablesLiveDataSize = createTableGauge("AllMemtablesLiveDataSize", new Gauge<Long>()
@@ -809,10 +825,10 @@
         speculativeRetries = createTableCounter("SpeculativeRetries");
         speculativeFailedRetries = createTableCounter("SpeculativeFailedRetries");
         speculativeInsufficientReplicas = createTableCounter("SpeculativeInsufficientReplicas");
-        speculativeSampleLatencyNanos = createTableGauge("SpeculativeSampleLatencyNanos", () -> cfs.sampleReadLatencyNanos);
+        speculativeSampleLatencyNanos = createTableGauge("SpeculativeSampleLatencyNanos", () -> MICROSECONDS.toNanos(cfs.sampleReadLatencyMicros));
 
         additionalWrites = createTableCounter("AdditionalWrites");
-        additionalWriteLatencyNanos = createTableGauge("AdditionalWriteLatencyNanos", () -> cfs.additionalWriteLatencyNanos);
+        additionalWriteLatencyNanos = createTableGauge("AdditionalWriteLatencyNanos", () -> MICROSECONDS.toNanos(cfs.additionalWriteLatencyMicros));
 
         keyCacheHitRate = createTableGauge("KeyCacheHitRate", "KeyCacheHitRate", new RatioGauge()
         {
@@ -913,6 +929,30 @@
             }
             return cnt;
         });
+
+        clientTombstoneWarnings = createTableMeter("ClientTombstoneWarnings", cfs.keyspace.metric.clientTombstoneWarnings);
+        clientTombstoneAborts = createTableMeter("ClientTombstoneAborts", cfs.keyspace.metric.clientTombstoneAborts);
+
+        coordinatorReadSizeWarnings = createTableMeter("CoordinatorReadSizeWarnings", cfs.keyspace.metric.coordinatorReadSizeWarnings);
+        coordinatorReadSizeAborts = createTableMeter("CoordinatorReadSizeAborts", cfs.keyspace.metric.coordinatorReadSizeAborts);
+        coordinatorReadSize = createTableHistogram("CoordinatorReadSize", cfs.keyspace.metric.coordinatorReadSize, false);
+
+        localReadSizeWarnings = createTableMeter("LocalReadSizeWarnings", cfs.keyspace.metric.localReadSizeWarnings);
+        localReadSizeAborts = createTableMeter("LocalReadSizeAborts", cfs.keyspace.metric.localReadSizeAborts);
+        localReadSize = createTableHistogram("LocalReadSize", cfs.keyspace.metric.localReadSize, false);
+
+        rowIndexSizeWarnings = createTableMeter("RowIndexSizeWarnings", cfs.keyspace.metric.rowIndexSizeWarnings);
+        rowIndexSizeAborts = createTableMeter("RowIndexSizeAborts", cfs.keyspace.metric.rowIndexSizeAborts);
+        rowIndexSize = createTableHistogram("RowIndexSize", cfs.keyspace.metric.rowIndexSize, false);
+    }
+
+    private Memtable.MemoryUsage getMemoryUsageWithIndexes(ColumnFamilyStore cfs)
+    {
+        Memtable.MemoryUsage usage = Memtable.newMemoryUsage();
+        cfs.getTracker().getView().getCurrentMemtable().addMemoryUsageTo(usage);
+        for (ColumnFamilyStore indexCfs : cfs.indexManager.getAllIndexColumnFamilyStores())
+            indexCfs.getTracker().getView().getCurrentMemtable().addMemoryUsageTo(usage);
+        return usage;
     }
 
     public void updateSSTableIterated(int count)
@@ -1106,9 +1146,9 @@
         return new TableTimer(cfTimer, keyspaceTimer, global);
     }
 
-    protected Timer createTableTimer(String name)
+    protected SnapshottingTimer createTableTimer(String name)
     {
-        Timer tableTimer = Metrics.timer(factory.createMetricName(name), aliasFactory.createMetricName(name));
+        SnapshottingTimer tableTimer = Metrics.timer(factory.createMetricName(name), aliasFactory.createMetricName(name));
         register(name, name, tableTimer);
         return tableTimer;
     }
@@ -1261,12 +1301,12 @@
             private Context(Timer [] all)
             {
                 this.all = all;
-                start = System.nanoTime();
+                start = nanoTime();
             }
 
             public void close()
             {
-                long duration = System.nanoTime() - start;
+                long duration = nanoTime() - start;
                 for (Timer t : all)
                     t.update(duration, TimeUnit.NANOSECONDS);
             }
diff --git a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java
index 3ba984a..62ef177 100644
--- a/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java
+++ b/src/java/org/apache/cassandra/metrics/ThreadPoolMetrics.java
@@ -21,7 +21,7 @@
 
 import com.codahale.metrics.Counter;
 import com.codahale.metrics.Gauge;
-import org.apache.cassandra.concurrent.LocalAwareExecutorService;
+import org.apache.cassandra.concurrent.ResizableThreadPool;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry.MetricName;
 
 import static java.lang.String.format;
@@ -75,7 +75,7 @@
      * @param path Type of thread pool
      * @param poolName Name of thread pool to identify metrics
      */
-    public ThreadPoolMetrics(LocalAwareExecutorService executor, String path, String poolName)
+    public ThreadPoolMetrics(ResizableThreadPool executor, String path, String poolName)
     {
         this.path = path;
         this.poolName = poolName;
diff --git a/src/java/org/apache/cassandra/metrics/TopPartitionTracker.java b/src/java/org/apache/cassandra/metrics/TopPartitionTracker.java
new file mode 100644
index 0000000..56a860a
--- /dev/null
+++ b/src/java/org/apache/cassandra/metrics/TopPartitionTracker.java
@@ -0,0 +1,407 @@
+/*
+ * 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.metrics;
+
+import java.io.Closeable;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.NavigableSet;
+import java.util.TreeSet;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.RangeTombstoneMarker;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.db.transform.Transformation;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.sstable.SSTable;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
+
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
+/**
+ * Tracks top partitions, currently by size and by tombstone count
+ *
+ * Collects during full and preview (-vd) repair since then we read the full partition
+ *
+ * Note that since we can run sub range repair there might be windows where the top partitions are not correct -
+ * for example, assume we track the top 2 partitions for this node:
+ *
+ * tokens with size:
+ * (a, 100); (b, 40); (c, 10); (d, 100); (e, 50); (f, 10)
+ * - top2: a, d
+ * now a is deleted and we run a repair for keys [a, c]
+ * - top2: b, d
+ * and when we repair [d, f]
+ * - top2: d, e
+ *
+ */
+public class TopPartitionTracker implements Closeable
+{
+    private final static String SIZES = "SIZES";
+    private final static String TOMBSTONES = "TOMBSTONES";
+
+    private final AtomicReference<TopHolder> topSizes = new AtomicReference<>();
+    private final AtomicReference<TopHolder> topTombstones = new AtomicReference<>();
+    private final TableMetadata metadata;
+    private final Future<?> scheduledSave;
+    private long lastTombstoneSave = 0;
+    private long lastSizeSave = 0;
+
+    public TopPartitionTracker(TableMetadata metadata)
+    {
+        this.metadata = metadata;
+        topSizes.set(new TopHolder(SystemKeyspace.getTopPartitions(metadata, SIZES),
+                                   DatabaseDescriptor.getMaxTopSizePartitionCount(),
+                                   DatabaseDescriptor.getMinTrackedPartitionSizeInBytes().toBytes()));
+        topTombstones.set(new TopHolder(SystemKeyspace.getTopPartitions(metadata, TOMBSTONES),
+                                        DatabaseDescriptor.getMaxTopTombstonePartitionCount(),
+                                        DatabaseDescriptor.getMinTrackedPartitionTombstoneCount()));
+        scheduledSave = ScheduledExecutors.optionalTasks.scheduleAtFixedRate(this::save, 60, 60, TimeUnit.MINUTES);
+    }
+
+    public void close()
+    {
+        scheduledSave.cancel(true);
+    }
+
+    @VisibleForTesting
+    public void save()
+    {
+        TopHolder sizes = topSizes.get();
+        if (!sizes.top.isEmpty() && sizes.lastUpdate > lastSizeSave)
+        {
+            SystemKeyspace.saveTopPartitions(metadata, SIZES, sizes.top, sizes.lastUpdate);
+            lastSizeSave = sizes.lastUpdate;
+        }
+
+        TopHolder tombstones = topTombstones.get();
+        if (!tombstones.top.isEmpty() && tombstones.lastUpdate > lastTombstoneSave)
+        {
+            SystemKeyspace.saveTopPartitions(metadata, TOMBSTONES, tombstones.top, tombstones.lastUpdate);
+            lastTombstoneSave = tombstones.lastUpdate;
+        }
+    }
+
+    public void merge(Collector collector)
+    {
+        while (true)
+        {
+            TopHolder cur = topSizes.get();
+            TopHolder newSizes = cur.merge(collector.sizes, StorageService.instance.getLocalReplicas(metadata.keyspace).ranges());
+            if (topSizes.compareAndSet(cur, newSizes))
+                break;
+        }
+
+        while (true)
+        {
+            TopHolder cur = topTombstones.get();
+            TopHolder newTombstones = cur.merge(collector.tombstones, StorageService.instance.getLocalReplicas(metadata.keyspace).ranges());
+            if (topTombstones.compareAndSet(cur, newTombstones))
+                break;
+        }
+    }
+
+    @Override
+    public String toString()
+    {
+        return "TopPartitionTracker:\n" +
+               "topSizes:\n" + topSizes.get() + '\n' +
+               "topTombstones:\n" + topTombstones.get() + '\n';
+    }
+
+    public Map<String, Long> getTopTombstonePartitionMap()
+    {
+        return topTombstones.get().toMap(metadata);
+    }
+
+    public Map<String, Long> getTopSizePartitionMap()
+    {
+        return topSizes.get().toMap(metadata);
+    }
+
+    @VisibleForTesting
+    public TopHolder topSizes()
+    {
+        return topSizes.get();
+    }
+
+    @VisibleForTesting
+    public TopHolder topTombstones()
+    {
+        return topTombstones.get();
+    }
+
+    public static class Collector
+    {
+        private final TopHolder tombstones;
+        private final TopHolder sizes;
+
+        public Collector(Collection<Range<Token>> ranges)
+        {
+            this.tombstones = new TopHolder(DatabaseDescriptor.getMaxTopTombstonePartitionCount(),
+                                            DatabaseDescriptor.getMinTrackedPartitionTombstoneCount(),
+                                            ranges);
+            this.sizes = new TopHolder(DatabaseDescriptor.getMaxTopSizePartitionCount(),
+                                       DatabaseDescriptor.getMinTrackedPartitionSizeInBytes().toBytes(),
+                                       ranges);
+        }
+
+        public void trackTombstoneCount(DecoratedKey key, long count)
+        {
+            tombstones.track(key, count);
+        }
+
+        public void trackPartitionSize(DecoratedKey key, long size)
+        {
+            sizes.track(key, size);
+        }
+
+        public String toString()
+        {
+            return "tombstones:\n"+tombstones+"\nsizes:\n"+sizes;
+        }
+    }
+
+    public static class TopHolder
+    {
+        public final NavigableSet<TopPartition> top;
+        private final int maxTopPartitionCount;
+        private final long minTrackedValue;
+        private final Collection<Range<Token>> ranges;
+        private long currentMinValue = Long.MAX_VALUE;
+        public final long lastUpdate;
+
+        private TopHolder(int maxTopPartitionCount, long minTrackedValue, Collection<Range<Token>> ranges)
+        {
+            this(maxTopPartitionCount, minTrackedValue, new TreeSet<>(), ranges, 0);
+        }
+
+        private TopHolder(int maxTopPartitionCount, long minTrackedValue, NavigableSet<TopPartition> top, Collection<Range<Token>> ranges, long lastUpdate)
+        {
+            this.maxTopPartitionCount = maxTopPartitionCount;
+            this.minTrackedValue = minTrackedValue;
+            this.top = top;
+            this.ranges = ranges;
+            this.lastUpdate = lastUpdate;
+        }
+
+        private TopHolder(StoredTopPartitions storedTopPartitions,
+                          int maxTopPartitionCount,
+                          long minTrackedValue)
+        {
+            this.maxTopPartitionCount = maxTopPartitionCount;
+            this.minTrackedValue = minTrackedValue;
+            top = new TreeSet<>();
+            this.ranges = null;
+            this.lastUpdate = storedTopPartitions.lastUpdated;
+
+            for (TopPartition topPartition : storedTopPartitions.topPartitions)
+                track(topPartition);
+        }
+
+        public void track(DecoratedKey key, long value)
+        {
+            if (value < minTrackedValue)
+                return;
+
+            if (top.size() < maxTopPartitionCount || value > currentMinValue)
+                track(new TopPartition(SSTable.getMinimalKey(key), value));
+        }
+
+        private void track(TopPartition tp)
+        {
+            top.add(tp);
+            while (top.size() > maxTopPartitionCount)
+            {
+                top.pollLast();
+                currentMinValue = top.last().value;
+            }
+            currentMinValue = Math.min(tp.value, currentMinValue);
+        }
+
+        /**
+         * we merge any pre-existing top partitions on to the ones we just collected if they are outside of the
+         * range collected.
+         *
+         * This means that if a large partition is deleted it will disappear from the top partitions
+         *
+         * @param holder the newly collected holder - this will get copied and any existing token outside of the collected ranges will get added to the copy
+         * @param ownedRanges the ranges this node owns - any existing token outside of these ranges will get dropped
+         */
+        public TopHolder merge(TopHolder holder, Collection<Range<Token>> ownedRanges)
+        {
+            TopHolder mergedHolder = holder.cloneForMerging(currentTimeMillis());
+            for (TopPartition existingTop : top)
+            {
+                if (!Range.isInRanges(existingTop.key.getToken(), mergedHolder.ranges) &&
+                    (ownedRanges.isEmpty() || Range.isInRanges(existingTop.key.getToken(), ownedRanges))) // make sure we drop any tokens that we don't own anymore
+                    mergedHolder.track(existingTop);
+            }
+            return mergedHolder;
+        }
+
+        private TopHolder cloneForMerging(long lastUpdate)
+        {
+            return new TopHolder(maxTopPartitionCount, minTrackedValue, new TreeSet<>(top), ranges, lastUpdate);
+        }
+
+        public String toString()
+        {
+            int i = 0;
+            Iterator<TopPartition> it = top.iterator();
+            StringBuilder sb = new StringBuilder();
+            while (it.hasNext())
+            {
+                i++;
+                sb.append(i).append(':').append(it.next()).append(System.lineSeparator());
+            }
+            return sb.toString();
+        }
+
+        public Map<String, Long> toMap(TableMetadata metadata)
+        {
+            Map<String, Long> topPartitionsMap = new LinkedHashMap<>();
+            for (TopPartitionTracker.TopPartition topPartition : top)
+            {
+                String key = metadata.partitionKeyType.getString(topPartition.key.getKey());
+                topPartitionsMap.put(key, topPartition.value);
+            }
+            return topPartitionsMap;
+        }
+    }
+
+    private static final Comparator<TopPartition> comparator = (o1, o2) -> {
+        int cmp = -Long.compare(o1.value, o2.value);
+        if (cmp != 0) return cmp;
+        return o1.key.compareTo(o2.key);
+    };
+
+    public static class TopPartition implements Comparable<TopPartition>
+    {
+        public final DecoratedKey key;
+        public final long value;
+
+        public TopPartition(DecoratedKey key, long value)
+        {
+            this.key = key;
+            this.value = value;
+        }
+
+        @Override
+        public int compareTo(TopPartition o)
+        {
+            return comparator.compare(this, o);
+        }
+
+        @Override
+        public String toString()
+        {
+            return "TopPartition{" +
+                   "key=" + key +
+                   ", value=" + value +
+                   '}';
+        }
+    }
+
+    public static class TombstoneCounter extends Transformation<UnfilteredRowIterator>
+    {
+        private final TopPartitionTracker.Collector collector;
+        private final int nowInSec;
+        private long tombstoneCount = 0;
+        private DecoratedKey key = null;
+
+        public TombstoneCounter(TopPartitionTracker.Collector collector, int nowInSec)
+        {
+            this.collector = collector;
+            this.nowInSec = nowInSec;
+        }
+
+        @Override
+        public Row applyToRow(Row row)
+        {
+            if (!row.deletion().isLive())
+                tombstoneCount++;
+            if (row.hasDeletion(nowInSec))
+            {
+                for (Cell<?> c : row.cells())
+                    if (c.isTombstone())
+                        tombstoneCount++;
+            }
+            return row;
+        }
+
+        @Override
+        public RangeTombstoneMarker applyToMarker(RangeTombstoneMarker marker)
+        {
+            tombstoneCount++;
+            return marker;
+        }
+
+        @Override
+        protected UnfilteredRowIterator applyToPartition(UnfilteredRowIterator partition)
+        {
+            reset(partition.partitionKey());
+            if (!partition.partitionLevelDeletion().isLive())
+                tombstoneCount++;
+            return Transformation.apply(partition, this);
+        }
+
+        private void reset(DecoratedKey key)
+        {
+            tombstoneCount = 0;
+            this.key = key;
+        }
+
+        @Override
+        public void onPartitionClose()
+        {
+            collector.trackTombstoneCount(key, tombstoneCount);
+        }
+    }
+
+    public static class StoredTopPartitions
+    {
+        public static StoredTopPartitions EMPTY = new StoredTopPartitions(Collections.emptyList(), 0);
+        public final List<TopPartition> topPartitions;
+        public final long lastUpdated;
+
+        public StoredTopPartitions(List<TopPartition> topPartitions, long lastUpdated)
+        {
+            this.topPartitions = topPartitions;
+            this.lastUpdated = lastUpdated;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/net/AbstractMessageHandler.java b/src/java/org/apache/cassandra/net/AbstractMessageHandler.java
index d709729..e2cf68d 100644
--- a/src/java/org/apache/cassandra/net/AbstractMessageHandler.java
+++ b/src/java/org/apache/cassandra/net/AbstractMessageHandler.java
@@ -22,7 +22,6 @@
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
 import java.util.concurrent.atomic.AtomicLongFieldUpdater;
 
@@ -34,18 +33,18 @@
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.EventLoop;
+import org.apache.cassandra.metrics.ClientMetrics;
 import org.apache.cassandra.net.FrameDecoder.CorruptFrame;
 import org.apache.cassandra.net.FrameDecoder.Frame;
 import org.apache.cassandra.net.FrameDecoder.FrameProcessor;
 import org.apache.cassandra.net.FrameDecoder.IntactFrame;
 import org.apache.cassandra.net.Message.Header;
 import org.apache.cassandra.net.ResourceLimits.Limit;
-import org.apache.cassandra.utils.NoSpamLogger;
 
 import static java.lang.Math.max;
 import static java.lang.Math.min;
 import static org.apache.cassandra.net.Crc.InvalidCrc;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 /**
  * Core logic for handling inbound message deserialization and execution (in tandem with {@link FrameDecoder}).
@@ -98,8 +97,8 @@
  * the untouched frames to the correct thread pool for the verb to be deserialized there and immediately processed.
  *
  * See {@link LargeMessage} and subclasses for concrete {@link AbstractMessageHandler} implementations for details
- * of the large-message accumulating state-machine, and {@link ProcessMessage} and its inheritors for the differences
- *in execution.
+ * of the large-message accumulating state-machine, and {@link InboundMessageHandler.ProcessMessage} and its inheritors 
+ * for the differences in execution.
  *
  * # Flow control (backpressure)
  *
@@ -135,8 +134,7 @@
 public abstract class AbstractMessageHandler extends ChannelInboundHandlerAdapter implements FrameProcessor
 {
     private static final Logger logger = LoggerFactory.getLogger(AbstractMessageHandler.class);
-    private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(logger, 1L, TimeUnit.SECONDS);
-
+    
     protected final FrameDecoder decoder;
 
     protected final Channel channel;
@@ -304,12 +302,17 @@
         try
         {
             /*
-             * Process up to one message using supplied overriden reserves - one of them pre-allocated,
-             * and guaranteed to be enough for one message - then, if no obstacles enountered, reactivate
+             * Process up to one message using supplied overridden reserves - one of them pre-allocated,
+             * and guaranteed to be enough for one message - then, if no obstacles encountered, reactivate
              * the frame decoder using normal reserve capacities.
              */
             if (processUpToOneMessage(endpointReserve, globalReserve))
+            {
                 decoder.reactivate();
+
+                if (decoder.isActive())
+                    ClientMetrics.instance.unpauseConnection();
+            }
         }
         catch (Throwable t)
         {
@@ -321,7 +324,7 @@
 
     // return true if the handler should be reactivated - if no new hurdles were encountered,
     // like running out of the other kind of reserve capacity
-    private boolean processUpToOneMessage(Limit endpointReserve, Limit globalReserve) throws IOException
+    protected boolean processUpToOneMessage(Limit endpointReserve, Limit globalReserve) throws IOException
     {
         UpToOneMessageFrameProcessor processor = new UpToOneMessageFrameProcessor(endpointReserve, globalReserve);
         decoder.processBacklog(processor);
diff --git a/src/java/org/apache/cassandra/net/AsyncChannelOutputPlus.java b/src/java/org/apache/cassandra/net/AsyncChannelOutputPlus.java
index 163981c..983db3e 100644
--- a/src/java/org/apache/cassandra/net/AsyncChannelOutputPlus.java
+++ b/src/java/org/apache/cassandra/net/AsyncChannelOutputPlus.java
@@ -92,7 +92,7 @@
      * <p>
      * If this method returns normally, the ChannelPromise MUST be writtenAndFlushed, or else completed exceptionally.
      */
-    protected ChannelPromise beginFlush(int byteCount, int lowWaterMark, int highWaterMark) throws IOException
+    protected ChannelPromise beginFlush(long byteCount, long lowWaterMark, long highWaterMark) throws IOException
     {
         waitForSpace(byteCount, lowWaterMark, highWaterMark);
 
@@ -125,18 +125,18 @@
      *
      * If we currently have lowWaterMark or fewer bytes flushing, we are good to go.
      * If our new write will not take us over our highWaterMark, we are good to go.
-     * Otherwise we wait until either of these conditions are met.
+     * Otherwise, we wait until either of these conditions are met.
      *
      * This may only be invoked by the writer thread, never by the eventLoop.
      *
      * @throws IOException if a prior asynchronous flush failed
      */
-    private void waitForSpace(int bytesToWrite, int lowWaterMark, int highWaterMark) throws IOException
+    private void waitForSpace(long bytesToWrite, long lowWaterMark, long highWaterMark) throws IOException
     {
         // decide when we would be willing to carry on writing
         // we are always writable if we have lowWaterMark or fewer bytes, no matter how many bytes we are flushing
         // our callers should not be supplying more than (highWaterMark - lowWaterMark) bytes, but we must work correctly if they do
-        int wakeUpWhenFlushing = highWaterMark - bytesToWrite;
+        long wakeUpWhenFlushing = highWaterMark - bytesToWrite;
         waitUntilFlushed(max(lowWaterMark, wakeUpWhenFlushing), lowWaterMark);
         flushing += bytesToWrite;
     }
@@ -147,7 +147,7 @@
      *
      * This may only be invoked by the writer thread, never by the eventLoop.
      */
-    void waitUntilFlushed(int wakeUpWhenExcessBytesWritten, int signalWhenExcessBytesWritten) throws IOException
+    void waitUntilFlushed(long wakeUpWhenExcessBytesWritten, long signalWhenExcessBytesWritten) throws IOException
     {
         // we assume that we are happy to wake up at least as early as we will be signalled; otherwise we will never exit
         assert signalWhenExcessBytesWritten <= wakeUpWhenExcessBytesWritten;
@@ -265,4 +265,4 @@
         throw new UnsupportedOperationException();
     }
 
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/net/AsyncChannelPromise.java b/src/java/org/apache/cassandra/net/AsyncChannelPromise.java
index d2c9d0b..00253fa 100644
--- a/src/java/org/apache/cassandra/net/AsyncChannelPromise.java
+++ b/src/java/org/apache/cassandra/net/AsyncChannelPromise.java
@@ -22,15 +22,16 @@
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandlerContext;
 import io.netty.channel.ChannelPromise;
-import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.Future; // checkstyle: permit this import
 import io.netty.util.concurrent.GenericFutureListener;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
 
 /**
  * See {@link AsyncPromise} and {@link io.netty.channel.ChannelPromise}
  *
  * This class is all boiler plate, just ensuring we return ourselves and invoke the correct Promise method.
  */
-public class AsyncChannelPromise extends AsyncPromise<Void> implements ChannelPromise
+public class AsyncChannelPromise extends AsyncPromise.WithExecutor<Void> implements ChannelPromise
 {
     private final Channel channel;
 
@@ -92,7 +93,7 @@
         return setSuccess(null);
     }
 
-    public ChannelPromise setSuccess(Void v)
+    public AsyncChannelPromise setSuccess(Void v)
     {
         super.setSuccess(v);
         return this;
@@ -103,58 +104,56 @@
         return trySuccess(null);
     }
 
-    public ChannelPromise setFailure(Throwable throwable)
+    public AsyncChannelPromise setFailure(Throwable throwable)
     {
         super.setFailure(throwable);
         return this;
     }
 
-    public ChannelPromise sync() throws InterruptedException
+    public AsyncChannelPromise sync() throws InterruptedException
     {
         super.sync();
         return this;
     }
 
-    public ChannelPromise syncUninterruptibly()
+    public AsyncChannelPromise syncUninterruptibly()
     {
         super.syncUninterruptibly();
         return this;
     }
 
-    public ChannelPromise await() throws InterruptedException
+    public AsyncChannelPromise await() throws InterruptedException
     {
         super.await();
         return this;
     }
 
-    public ChannelPromise awaitUninterruptibly()
+    public AsyncChannelPromise awaitUninterruptibly()
     {
         super.awaitUninterruptibly();
         return this;
     }
 
-    public ChannelPromise addListener(GenericFutureListener<? extends Future<? super Void>> listener)
+    public AsyncChannelPromise addListener(GenericFutureListener<? extends Future<? super Void>> listener)
     {
         super.addListener(listener);
         return this;
     }
 
-    public ChannelPromise addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
+    public AsyncChannelPromise addListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
     {
         super.addListeners(listeners);
         return this;
     }
 
-    public ChannelPromise removeListener(GenericFutureListener<? extends Future<? super Void>> listener)
+    public AsyncChannelPromise removeListener(GenericFutureListener<? extends Future<? super Void>> listener)
     {
-        super.removeListener(listener);
-        return this;
+        throw new UnsupportedOperationException();
     }
 
-    public ChannelPromise removeListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
+    public AsyncChannelPromise removeListeners(GenericFutureListener<? extends Future<? super Void>>... listeners)
     {
-        super.removeListeners(listeners);
-        return this;
+        throw new UnsupportedOperationException();
     }
 
     public ChannelPromise unvoid()
diff --git a/src/java/org/apache/cassandra/net/AsyncMessageOutputPlus.java b/src/java/org/apache/cassandra/net/AsyncMessageOutputPlus.java
index 8ef0a8f..e1bcfed 100644
--- a/src/java/org/apache/cassandra/net/AsyncMessageOutputPlus.java
+++ b/src/java/org/apache/cassandra/net/AsyncMessageOutputPlus.java
@@ -128,4 +128,4 @@
             buffer = null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/net/AsyncOneResponse.java b/src/java/org/apache/cassandra/net/AsyncOneResponse.java
index ba83c84..f3c42cd 100644
--- a/src/java/org/apache/cassandra/net/AsyncOneResponse.java
+++ b/src/java/org/apache/cassandra/net/AsyncOneResponse.java
@@ -19,7 +19,7 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
-import io.netty.util.concurrent.ImmediateEventExecutor;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
 
 /**
  * A callback specialized for returning a value from a single target; that is, this is for messages
@@ -27,11 +27,6 @@
  */
 public class AsyncOneResponse<T> extends AsyncPromise<T> implements RequestCallback<T>
 {
-    public AsyncOneResponse()
-    {
-        super(ImmediateEventExecutor.INSTANCE);
-    }
-
     public void onResponse(Message<T> response)
     {
         setSuccess(response.payload);
diff --git a/src/java/org/apache/cassandra/net/AsyncPromise.java b/src/java/org/apache/cassandra/net/AsyncPromise.java
deleted file mode 100644
index 36bc304..0000000
--- a/src/java/org/apache/cassandra/net/AsyncPromise.java
+++ /dev/null
@@ -1,488 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.net;
-
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.netty.util.concurrent.EventExecutor;
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.GenericFutureListener;
-import io.netty.util.concurrent.Promise;
-import io.netty.util.internal.PlatformDependent;
-import io.netty.util.internal.ThrowableUtil;
-import org.apache.cassandra.utils.concurrent.WaitQueue;
-
-import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.*;
-
-/**
- * Netty's DefaultPromise uses a mutex to coordinate notifiers AND waiters between the eventLoop and the other threads.
- * Since we register cross-thread listeners, this has the potential to block internode messaging for an unknown
- * number of threads for an unknown period of time, if we are unlucky with the scheduler (which will certainly
- * happen, just with some unknown but low periodicity)
- *
- * At the same time, we manage some other efficiencies:
- *  - We save some space when registering listeners, especially if there is only one listener, as we perform no
- *    extra allocations in this case.
- *  - We permit efficient initial state declaration, avoiding unnecessary CAS or lock acquisitions when mutating
- *    a Promise we are ourselves constructing (and can easily add more; only those we use have been added)
- *
- * We can also make some guarantees about our behaviour here, although we primarily mirror Netty.
- * Specifically, we can guarantee that notifiers are always invoked in the order they are added (which may be true
- * for netty, but was unclear and is not declared).  This is useful for ensuring the correctness of some of our
- * behaviours in OutboundConnection without having to jump through extra hoops.
- *
- * The implementation loosely follows that of Netty's DefaultPromise, with some slight changes; notably that we have
- * no synchronisation on our listeners, instead using a CoW list that is cleared each time we notify listeners.
- *
- * We handle special values slightly differently.  We do not use a special value for null, instead using
- * a special value to indicate the result has not been set yet.  This means that once isSuccess() holds,
- * the result must be a correctly typed object (modulo generics pitfalls).
- * All special values are also instances of FailureHolder, which simplifies a number of the logical conditions.
- *
- * @param <V>
- */
-public class AsyncPromise<V> implements Promise<V>
-{
-    private static final Logger logger = LoggerFactory.getLogger(AsyncPromise.class);
-
-    private final EventExecutor executor;
-    private volatile Object result;
-    private volatile GenericFutureListener<? extends Future<? super V>> listeners;
-    private volatile WaitQueue waiting;
-    private static final AtomicReferenceFieldUpdater<AsyncPromise, Object> resultUpdater = newUpdater(AsyncPromise.class, Object.class, "result");
-    private static final AtomicReferenceFieldUpdater<AsyncPromise, GenericFutureListener> listenersUpdater = newUpdater(AsyncPromise.class, GenericFutureListener.class, "listeners");
-    private static final AtomicReferenceFieldUpdater<AsyncPromise, WaitQueue> waitingUpdater = newUpdater(AsyncPromise.class, WaitQueue.class, "waiting");
-
-    private static final FailureHolder UNSET = new FailureHolder(null);
-    private static final FailureHolder UNCANCELLABLE = new FailureHolder(null);
-    private static final FailureHolder CANCELLED = new FailureHolder(ThrowableUtil.unknownStackTrace(new CancellationException(), AsyncPromise.class, "cancel(...)"));
-
-    private static final DeferredGenericFutureListener NOTIFYING = future -> {};
-    private static interface DeferredGenericFutureListener<F extends Future<?>> extends GenericFutureListener<F> {}
-
-    private static final class FailureHolder
-    {
-        final Throwable cause;
-        private FailureHolder(Throwable cause)
-        {
-            this.cause = cause;
-        }
-    }
-
-    public AsyncPromise(EventExecutor executor)
-    {
-        this(executor, UNSET);
-    }
-
-    private AsyncPromise(EventExecutor executor, FailureHolder initialState)
-    {
-        this.executor = executor;
-        this.result = initialState;
-    }
-
-    public AsyncPromise(EventExecutor executor, GenericFutureListener<? extends Future<? super V>> listener)
-    {
-        this(executor);
-        this.listeners = listener;
-    }
-
-    AsyncPromise(EventExecutor executor, FailureHolder initialState, GenericFutureListener<? extends Future<? super V>> listener)
-    {
-        this(executor, initialState);
-        this.listeners = listener;
-    }
-
-    public static <V> AsyncPromise<V> uncancellable(EventExecutor executor)
-    {
-        return new AsyncPromise<>(executor, UNCANCELLABLE);
-    }
-
-    public static <V> AsyncPromise<V> uncancellable(EventExecutor executor, GenericFutureListener<? extends Future<? super V>> listener)
-    {
-        return new AsyncPromise<>(executor, UNCANCELLABLE);
-    }
-
-    public Promise<V> setSuccess(V v)
-    {
-        if (!trySuccess(v))
-            throw new IllegalStateException("complete already: " + this);
-        return this;
-    }
-
-    public Promise<V> setFailure(Throwable throwable)
-    {
-        if (!tryFailure(throwable))
-            throw new IllegalStateException("complete already: " + this);
-        return this;
-    }
-
-    public boolean trySuccess(V v)
-    {
-        return trySet(v);
-    }
-
-    public boolean tryFailure(Throwable throwable)
-    {
-        return trySet(new FailureHolder(throwable));
-    }
-
-    public boolean setUncancellable()
-    {
-        if (trySet(UNCANCELLABLE))
-            return true;
-        return result == UNCANCELLABLE;
-    }
-
-    public boolean cancel(boolean b)
-    {
-        return trySet(CANCELLED);
-    }
-
-    /**
-     * Shared implementation of various promise completion methods.
-     * Updates the result if it is possible to do so, returning success/failure.
-     *
-     * If the promise is UNSET the new value will succeed;
-     *          if it is UNCANCELLABLE it will succeed only if the new value is not CANCELLED
-     *          otherwise it will fail, as isDone() is implied
-     *
-     * If the update succeeds, and the new state implies isDone(), any listeners and waiters will be notified
-     */
-    private boolean trySet(Object v)
-    {
-        while (true)
-        {
-            Object current = result;
-            if (isDone(current) || (current == UNCANCELLABLE && v == CANCELLED))
-                return false;
-            if (resultUpdater.compareAndSet(this, current, v))
-            {
-                if (v != UNCANCELLABLE)
-                {
-                    notifyListeners();
-                    notifyWaiters();
-                }
-                return true;
-            }
-        }
-    }
-
-    public boolean isSuccess()
-    {
-        return isSuccess(result);
-    }
-
-    private static boolean isSuccess(Object result)
-    {
-        return !(result instanceof FailureHolder);
-    }
-
-    public boolean isCancelled()
-    {
-        return isCancelled(result);
-    }
-
-    private static boolean isCancelled(Object result)
-    {
-        return result == CANCELLED;
-    }
-
-    public boolean isDone()
-    {
-        return isDone(result);
-    }
-
-    private static boolean isDone(Object result)
-    {
-        return result != UNSET && result != UNCANCELLABLE;
-    }
-
-    public boolean isCancellable()
-    {
-        Object result = this.result;
-        return result == UNSET;
-    }
-
-    public Throwable cause()
-    {
-        Object result = this.result;
-        if (result instanceof FailureHolder)
-            return ((FailureHolder) result).cause;
-        return null;
-    }
-
-    /**
-     * if isSuccess(), returns the value, otherwise returns null
-     */
-    @SuppressWarnings("unchecked")
-    public V getNow()
-    {
-        Object result = this.result;
-        if (isSuccess(result))
-            return (V) result;
-        return null;
-    }
-
-    public V get() throws InterruptedException, ExecutionException
-    {
-        await();
-        return getWhenDone();
-    }
-
-    public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
-    {
-        if (!await(timeout, unit))
-            throw new TimeoutException();
-        return getWhenDone();
-    }
-
-    /**
-     * Shared implementation of get() after suitable await(); assumes isDone(), and returns
-     * either the success result or throws the suitable exception under failure
-     */
-    @SuppressWarnings("unchecked")
-    private V getWhenDone() throws ExecutionException
-    {
-        Object result = this.result;
-        if (isSuccess(result))
-            return (V) result;
-        if (result == CANCELLED)
-            throw new CancellationException();
-        throw new ExecutionException(((FailureHolder) result).cause);
-    }
-
-    /**
-     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
-     * so may cause problems for reporting stack traces
-     */
-    public Promise<V> sync() throws InterruptedException
-    {
-        await();
-        rethrowIfFailed();
-        return this;
-    }
-
-    /**
-     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
-     * so may cause problems for reporting stack traces
-     */
-    public Promise<V> syncUninterruptibly()
-    {
-        awaitUninterruptibly();
-        rethrowIfFailed();
-        return this;
-    }
-
-    private void rethrowIfFailed()
-    {
-        Throwable cause = this.cause();
-        if (cause != null)
-        {
-            PlatformDependent.throwException(cause);
-        }
-    }
-
-    public Promise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener)
-    {
-        listenersUpdater.accumulateAndGet(this, listener, AsyncPromise::appendListener);
-        if (isDone())
-            notifyListeners();
-        return this;
-    }
-
-    public Promise<V> addListeners(GenericFutureListener<? extends Future<? super V>> ... listeners)
-    {
-        // this could be more efficient if we cared, but we do not
-        return addListener(future -> {
-            for (GenericFutureListener<? extends Future<? super V>> listener : listeners)
-                AsyncPromise.invokeListener((GenericFutureListener<Future<? super V>>)listener, future);
-        });
-    }
-
-    public Promise<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    public Promise<V> removeListeners(GenericFutureListener<? extends Future<? super V>> ... listeners)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @SuppressWarnings("unchecked")
-    private void notifyListeners()
-    {
-        if (!executor.inEventLoop())
-        {
-            // submit this method, to guarantee we invoke in the submitted order
-            executor.execute(this::notifyListeners);
-            return;
-        }
-
-        if (listeners == null || listeners instanceof DeferredGenericFutureListener<?>)
-            return; // either no listeners, or we are already notifying listeners, so we'll get to the new one when ready
-
-        // first run our notifiers
-        while (true)
-        {
-            GenericFutureListener listeners = listenersUpdater.getAndSet(this, NOTIFYING);
-            if (listeners != null)
-                invokeListener(listeners, this);
-
-            if (listenersUpdater.compareAndSet(this, NOTIFYING, null))
-                return;
-        }
-    }
-
-    private static <F extends Future<?>> void invokeListener(GenericFutureListener<F> listener, F future)
-    {
-        try
-        {
-            listener.operationComplete(future);
-        }
-        catch (Throwable t)
-        {
-            logger.error("Failed to invoke listener {} to {}", listener, future, t);
-        }
-    }
-
-    private static <F extends Future<?>> GenericFutureListener<F> appendListener(GenericFutureListener<F> prevListener, GenericFutureListener<F> newListener)
-    {
-        GenericFutureListener<F> result = newListener;
-
-        if (prevListener != null && prevListener != NOTIFYING)
-        {
-            result = future -> {
-                invokeListener(prevListener, future);
-                // we will wrap the outer invocation with invokeListener, so no need to do it here too
-                newListener.operationComplete(future);
-            };
-        }
-
-        if (prevListener instanceof DeferredGenericFutureListener<?>)
-        {
-            GenericFutureListener<F> wrap = result;
-            result = (DeferredGenericFutureListener<F>) wrap::operationComplete;
-        }
-
-        return result;
-    }
-
-    public Promise<V> await() throws InterruptedException
-    {
-        await(0L, (signal, nanos) -> { signal.await(); return true; } );
-        return this;
-    }
-
-    public Promise<V> awaitUninterruptibly()
-    {
-        await(0L, (signal, nanos) -> { signal.awaitUninterruptibly(); return true; } );
-        return this;
-    }
-
-    public boolean await(long timeout, TimeUnit unit) throws InterruptedException
-    {
-        return await(unit.toNanos(timeout),
-                     (signal, nanos) -> signal.awaitUntil(nanos + System.nanoTime()));
-    }
-
-    public boolean await(long timeoutMillis) throws InterruptedException
-    {
-        return await(timeoutMillis, TimeUnit.MILLISECONDS);
-    }
-
-    public boolean awaitUninterruptibly(long timeout, TimeUnit unit)
-    {
-        return await(unit.toNanos(timeout),
-                     (signal, nanos) -> signal.awaitUntilUninterruptibly(nanos + System.nanoTime()));
-    }
-
-    public boolean awaitUninterruptibly(long timeoutMillis)
-    {
-        return awaitUninterruptibly(timeoutMillis, TimeUnit.MILLISECONDS);
-    }
-
-    interface Awaiter<T extends Throwable>
-    {
-        boolean await(WaitQueue.Signal value, long nanos) throws T;
-    }
-
-    /**
-     * A clean way to implement each variant of await using lambdas; we permit a nanos parameter
-     * so that we can implement this without any unnecessary lambda allocations, although not
-     * all implementations need the nanos parameter (i.e. those that wait indefinitely)
-     */
-    private <T extends Throwable> boolean await(long nanos, Awaiter<T> awaiter) throws T
-    {
-        if (isDone())
-            return true;
-
-        WaitQueue.Signal await = registerToWait();
-        if (null != await)
-            return awaiter.await(await, nanos);
-
-        return true;
-    }
-
-    /**
-     * Register a signal that will be notified when the promise is completed;
-     * if the promise becomes completed before this signal is registered, null is returned
-     */
-    private WaitQueue.Signal registerToWait()
-    {
-        WaitQueue waiting = this.waiting;
-        if (waiting == null && !waitingUpdater.compareAndSet(this, null, waiting = new WaitQueue()))
-            waiting = this.waiting;
-        assert waiting != null;
-
-        WaitQueue.Signal signal = waiting.register();
-        if (!isDone())
-            return signal;
-        signal.cancel();
-        return null;
-    }
-
-    private void notifyWaiters()
-    {
-        WaitQueue waiting = this.waiting;
-        if (waiting != null)
-            waiting.signalAll();
-    }
-
-    public String toString()
-    {
-        Object result = this.result;
-        if (isSuccess(result))
-            return "(success: " + result + ')';
-        if (result == UNCANCELLABLE)
-            return "(uncancellable)";
-        if (result == CANCELLED)
-            return "(cancelled)";
-        if (isDone(result))
-            return "(failure: " + ((FailureHolder) result).cause + ')';
-        return "(incomplete)";
-    }
-}
diff --git a/src/java/org/apache/cassandra/net/AsyncStreamingInputPlus.java b/src/java/org/apache/cassandra/net/AsyncStreamingInputPlus.java
index 84fb8ac..ee18a87 100644
--- a/src/java/org/apache/cassandra/net/AsyncStreamingInputPlus.java
+++ b/src/java/org/apache/cassandra/net/AsyncStreamingInputPlus.java
@@ -17,12 +17,10 @@
  */
 package org.apache.cassandra.net;
 
-import java.io.EOFException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.TimeUnit;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
@@ -32,16 +30,15 @@
 import io.netty.buffer.Unpooled;
 import io.netty.channel.Channel;
 import org.apache.cassandra.io.util.RebufferingInputStream;
+import org.apache.cassandra.streaming.StreamingDataInputPlus;
 
-// TODO: rewrite
-public class AsyncStreamingInputPlus extends RebufferingInputStream
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
+
+/*
+ * This class expects a single producer (Netty event loop) and single consumer thread (StreamingDeserializerTask).
+ */
+public class AsyncStreamingInputPlus extends RebufferingInputStream implements StreamingDataInputPlus
 {
-    public static class InputTimeoutException extends IOException
-    {
-    }
-
-    private static final long DEFAULT_REBUFFER_BLOCK_IN_MILLIS = TimeUnit.MINUTES.toMillis(3);
-
     private final Channel channel;
 
     /**
@@ -51,22 +48,15 @@
 
     private final BlockingQueue<ByteBuf> queue;
 
-    private final long rebufferTimeoutNanos;
-
-    private volatile boolean isClosed;
+    private boolean isProducerClosed = false;
+    private boolean isConsumerClosed = false;
 
     public AsyncStreamingInputPlus(Channel channel)
     {
-        this(channel, DEFAULT_REBUFFER_BLOCK_IN_MILLIS, TimeUnit.MILLISECONDS);
-    }
-
-    AsyncStreamingInputPlus(Channel channel, long rebufferTimeout, TimeUnit rebufferTimeoutUnit)
-    {
         super(Unpooled.EMPTY_BUFFER.nioBuffer());
         currentBuf = Unpooled.EMPTY_BUFFER;
 
-        queue = new LinkedBlockingQueue<>();
-        rebufferTimeoutNanos = rebufferTimeoutUnit.toNanos(rebufferTimeout);
+        queue = newBlockingQueue();
 
         this.channel = channel;
         channel.config().setAutoRead(false);
@@ -79,18 +69,11 @@
      */
     public boolean append(ByteBuf buf) throws IllegalStateException
     {
-        if (isClosed) return false;
+        if (isProducerClosed)
+            return false; // buf should be released in NettyStreamingChannel.channelRead
 
         queue.add(buf);
 
-        /*
-         * it's possible for append() to race with close(), so we need to ensure
-         * that the bytebuf gets released in that scenario
-         */
-        if (isClosed)
-            while ((buf = queue.poll()) != null)
-                buf.release();
-
         return true;
     }
 
@@ -99,16 +82,17 @@
      *
      * Release open buffers and poll the {@link #queue} for more data.
      * <p>
-     * This is best, and more or less expected, to be invoked on a consuming thread (not the event loop)
-     * becasue if we block on the queue we can't fill it on the event loop (as that's where the buffers are coming from).
+     * This is invoked on a consuming thread (not the event loop)
+     * because if we block on the queue we can't fill it on the event loop (as that's where the buffers are coming from).
      *
-     * @throws EOFException when no further reading from this instance should occur. Implies this instance is closed.
-     * @throws InputTimeoutException when no new buffers arrive for reading before
-     * the {@link #rebufferTimeoutNanos} elapses while blocking. It's then not safe to reuse this instance again.
+     * @throws ClosedChannelException when no further reading from this instance should occur. Implies this instance is closed.
      */
     @Override
-    protected void reBuffer() throws EOFException, InputTimeoutException
+    protected void reBuffer() throws ClosedChannelException
     {
+        if (isConsumerClosed)
+            throw new ClosedChannelException();
+
         if (queue.isEmpty())
             channel.read();
 
@@ -117,21 +101,24 @@
         buffer = null;
 
         ByteBuf next = null;
-        try
+        do
         {
-            next = queue.poll(rebufferTimeoutNanos, TimeUnit.NANOSECONDS);
-        }
-        catch (InterruptedException ie)
+            try
+            {
+                next = queue.take(); // rely on sentinel being sent to terminate this loop
+            }
+            catch (InterruptedException ie)
+            {
+                // ignore interruptions, retry and rely on being shut down by requestClosure
+            }
+        } while (next == null);
+
+        if (next == Unpooled.EMPTY_BUFFER) // the indicator that the input is closed
         {
-            // nop
+            isConsumerClosed = true;
+            throw new ClosedChannelException();
         }
 
-        if (null == next)
-            throw new InputTimeoutException();
-
-        if (next == Unpooled.EMPTY_BUFFER) // Unpooled.EMPTY_BUFFER is the indicator that the input is closed
-            throw new EOFException();
-
         currentBuf = next;
         buffer = next.nioBuffer();
     }
@@ -183,17 +170,9 @@
         return Ints.checkedCast(count);
     }
 
-    // TODO:JEB add docs
-    // TL;DR if there's no Bufs open anywhere here, issue a channle read to try and grab data.
-    public void maybeIssueRead()
-    {
-        if (isEmpty())
-            channel.read();
-    }
-
     public boolean isEmpty()
     {
-        return queue.isEmpty() && (buffer == null || !buffer.hasRemaining());
+        return isConsumerClosed || (queue.isEmpty() && (buffer == null || !buffer.hasRemaining()));
     }
 
     /**
@@ -204,9 +183,11 @@
     @Override
     public void close()
     {
-        if (isClosed)
+        if (isConsumerClosed)
             return;
 
+        isConsumerClosed = true;
+
         if (currentBuf != null)
         {
             currentBuf.release();
@@ -218,19 +199,16 @@
         {
             try
             {
-                ByteBuf buf = queue.poll(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
+                ByteBuf buf = queue.take();
                 if (buf == Unpooled.EMPTY_BUFFER)
                     break;
-                else
-                    buf.release();
+                buf.release();
             }
             catch (InterruptedException e)
             {
-                //
+                // ignore and rely on requestClose having been called
             }
         }
-
-        isClosed = true;
     }
 
     /**
@@ -240,7 +218,11 @@
      */
     public void requestClosure()
     {
-        queue.add(Unpooled.EMPTY_BUFFER);
+        if (!isProducerClosed)
+        {
+            queue.add(Unpooled.EMPTY_BUFFER);
+            isProducerClosed = true;
+        }
     }
 
     // TODO: let's remove this like we did for AsyncChannelOutputPlus
diff --git a/src/java/org/apache/cassandra/net/AsyncStreamingOutputPlus.java b/src/java/org/apache/cassandra/net/AsyncStreamingOutputPlus.java
index 3a9c075..915e8a3 100644
--- a/src/java/org/apache/cassandra/net/AsyncStreamingOutputPlus.java
+++ b/src/java/org/apache/cassandra/net/AsyncStreamingOutputPlus.java
@@ -29,13 +29,14 @@
 
 import io.netty.channel.Channel;
 import io.netty.channel.ChannelPromise;
+import io.netty.channel.DefaultFileRegion;
 import io.netty.channel.FileRegion;
 import io.netty.channel.WriteBufferWaterMark;
 import io.netty.handler.ssl.SslHandler;
 import org.apache.cassandra.io.compress.BufferType;
 import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.net.SharedDefaultFileRegion.SharedFileChannel;
-import org.apache.cassandra.streaming.StreamManager.StreamRateLimiter;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.utils.memory.BufferPool;
 import org.apache.cassandra.utils.memory.BufferPools;
 
@@ -50,7 +51,7 @@
  * The correctness of this class depends on the ChannelPromise we create against a Channel always being completed,
  * which appears to be a guarantee provided by Netty so long as the event loop is running.
  */
-public class AsyncStreamingOutputPlus extends AsyncChannelOutputPlus
+public class AsyncStreamingOutputPlus extends AsyncChannelOutputPlus implements StreamingDataOutputPlus
 {
     private static final Logger logger = LoggerFactory.getLogger(AsyncStreamingOutputPlus.class);
 
@@ -97,28 +98,6 @@
         return flushed() + buffer.position();
     }
 
-    public interface BufferSupplier
-    {
-        /**
-         * Request a buffer with at least the given capacity.
-         * This method may only be invoked once, and the lifetime of buffer it returns will be managed
-         * by the AsyncChannelOutputPlus it was created for.
-         */
-        ByteBuffer get(int capacity) throws IOException;
-    }
-
-    public interface Write
-    {
-        /**
-         * Write to a buffer, and flush its contents to the channel.
-         * <p>
-         * The lifetime of the buffer will be managed by the AsyncChannelOutputPlus you issue this Write to.
-         * If the method exits successfully, the contents of the buffer will be written to the channel, otherwise
-         * the buffer will be cleaned and the exception propagated to the caller.
-         */
-        void write(BufferSupplier supplier) throws IOException;
-    }
-
     /**
      * Provide a lambda that can request a buffer of suitable size, then fill the buffer and have
      * that buffer written and flushed to the underlying channel, without having to handle buffer
@@ -126,7 +105,7 @@
      * <p>
      * Any exception thrown by the Write will be propagated to the caller, after any buffer is cleaned up.
      */
-    public int writeToChannel(Write write, StreamRateLimiter limiter) throws IOException
+    public int writeToChannel(Write write, RateLimiter limiter) throws IOException
     {
         doFlush(0);
         class Holder
@@ -168,17 +147,17 @@
     /**
      * Writes all data in file channel to stream: <br>
      * * For zero-copy-streaming, 1MiB at a time, with at most 2MiB in flight at once. <br>
-     * * For streaming with SSL, 64kb at a time, with at most 32+64kb (default low water mark + batch size) in flight. <br>
+     * * For streaming with SSL, 64KiB at a time, with at most 32+64KiB (default low water mark + batch size) in flight. <br>
      * <p>
      * This method takes ownership of the provided {@link FileChannel}.
      * <p>
      * WARNING: this method blocks only for permission to write to the netty channel; it exits before
      * the {@link FileRegion}(zero-copy) or {@link ByteBuffer}(ssl) is flushed to the network.
      */
-    public long writeFileToChannel(FileChannel file, StreamRateLimiter limiter) throws IOException
+    public long writeFileToChannel(FileChannel file, RateLimiter limiter) throws IOException
     {
         if (channel.pipeline().get(SslHandler.class) != null)
-            // each batch is loaded into ByteBuffer, 64kb is more BufferPool friendly.
+            // each batch is loaded into ByteBuffer, 64KiB is more BufferPool friendly.
             return writeFileToChannel(file, limiter, 1 << 16);
         else
             // write files in 1MiB chunks, since there may be blocking work performed to fetch it from disk,
@@ -187,7 +166,7 @@
     }
 
     @VisibleForTesting
-    long writeFileToChannel(FileChannel fc, StreamRateLimiter limiter, int batchSize) throws IOException
+    long writeFileToChannel(FileChannel fc, RateLimiter limiter, int batchSize) throws IOException
     {
         final long length = fc.size();
         long bytesTransferred = 0;
@@ -224,7 +203,29 @@
     }
 
     @VisibleForTesting
-    long writeFileToChannelZeroCopy(FileChannel file, StreamRateLimiter limiter, int batchSize, int lowWaterMark, int highWaterMark) throws IOException
+    long writeFileToChannelZeroCopy(FileChannel file, RateLimiter limiter, int batchSize, int lowWaterMark, int highWaterMark) throws IOException
+    {
+        if (!limiter.isRateLimited())
+            return writeFileToChannelZeroCopyUnthrottled(file);
+        else
+            return writeFileToChannelZeroCopyThrottled(file, limiter, batchSize, lowWaterMark, highWaterMark);
+    }
+
+    private long writeFileToChannelZeroCopyUnthrottled(FileChannel file) throws IOException
+    {
+        final long length = file.size();
+
+        if (logger.isTraceEnabled())
+            logger.trace("Writing {} bytes", length);
+
+        ChannelPromise promise = beginFlush(length, 0, length);
+        final DefaultFileRegion defaultFileRegion = new DefaultFileRegion(file, 0, length);
+        channel.writeAndFlush(defaultFileRegion, promise);
+
+        return length;
+    }
+
+    private long writeFileToChannelZeroCopyThrottled(FileChannel file, RateLimiter limiter, int batchSize, int lowWaterMark, int highWaterMark) throws IOException
     {
         final long length = file.size();
         long bytesTransferred = 0;
@@ -232,9 +233,10 @@
         final SharedFileChannel sharedFile = SharedDefaultFileRegion.share(file);
         try
         {
+            int toWrite;
             while (bytesTransferred < length)
             {
-                int toWrite = (int) min(batchSize, length - bytesTransferred);
+                toWrite = (int) min(batchSize, length - bytesTransferred);
 
                 limiter.acquire(toWrite);
                 ChannelPromise promise = beginFlush(toWrite, lowWaterMark, highWaterMark);
@@ -267,4 +269,4 @@
             buffer = null;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/net/Crc.java b/src/java/org/apache/cassandra/net/Crc.java
index 9cd6edd..8f63e51 100644
--- a/src/java/org/apache/cassandra/net/Crc.java
+++ b/src/java/org/apache/cassandra/net/Crc.java
@@ -45,7 +45,7 @@
         }
     }
 
-    static CRC32 crc32()
+    public static CRC32 crc32()
     {
         CRC32 crc = crc32.get();
         crc.reset();
diff --git a/src/java/org/apache/cassandra/net/FrameDecoder.java b/src/java/org/apache/cassandra/net/FrameDecoder.java
index 64e30ef..4cfbf6d 100644
--- a/src/java/org/apache/cassandra/net/FrameDecoder.java
+++ b/src/java/org/apache/cassandra/net/FrameDecoder.java
@@ -191,6 +191,14 @@
     abstract void addLastTo(ChannelPipeline pipeline);
 
     /**
+     * @return true if we are actively decoding and processing frames
+     */
+    public boolean isActive()
+    {
+        return isActive;
+    }
+    
+    /**
      * For use by InboundMessageHandler (or other upstream handlers) that want to start receiving frames.
      */
     public void activate(FrameProcessor processor)
@@ -208,7 +216,7 @@
      * For use by InboundMessageHandler (or other upstream handlers) that want to resume
      * receiving frames after previously indicating that processing should be paused.
      */
-    void reactivate() throws IOException
+    public void reactivate() throws IOException
     {
         if (isActive)
             throw new IllegalStateException("Tried to reactivate an already active FrameDecoder");
@@ -282,7 +290,8 @@
     {
         decode(frames, bytes);
 
-        if (isActive) isActive = deliver(processor);
+        if (isActive)
+            isActive = deliver(processor);
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/net/FrameDecoderCrc.java b/src/java/org/apache/cassandra/net/FrameDecoderCrc.java
index 238a890..2a54f5f 100644
--- a/src/java/org/apache/cassandra/net/FrameDecoderCrc.java
+++ b/src/java/org/apache/cassandra/net/FrameDecoderCrc.java
@@ -25,7 +25,6 @@
 import io.netty.channel.ChannelPipeline;
 
 import static org.apache.cassandra.net.Crc.*;
-import static org.apache.cassandra.net.Crc.updateCrc32;
 
 /**
  * Framing format that protects integrity of data in movement with CRCs (of both header and payload).
diff --git a/src/java/org/apache/cassandra/net/FrameEncoderCrc.java b/src/java/org/apache/cassandra/net/FrameEncoderCrc.java
index 1d16868..3646248 100644
--- a/src/java/org/apache/cassandra/net/FrameEncoderCrc.java
+++ b/src/java/org/apache/cassandra/net/FrameEncoderCrc.java
@@ -23,7 +23,6 @@
 
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandler;
-import org.apache.cassandra.utils.memory.BufferPool;
 
 import static org.apache.cassandra.net.Crc.*;
 
diff --git a/src/java/org/apache/cassandra/net/FrameEncoderLegacyLZ4.java b/src/java/org/apache/cassandra/net/FrameEncoderLegacyLZ4.java
index 000fab7..fd8b36b 100644
--- a/src/java/org/apache/cassandra/net/FrameEncoderLegacyLZ4.java
+++ b/src/java/org/apache/cassandra/net/FrameEncoderLegacyLZ4.java
@@ -27,7 +27,6 @@
 import net.jpountz.xxhash.XXHashFactory;
 import org.apache.cassandra.io.compress.BufferType;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.memory.BufferPool;
 
 import static java.lang.Integer.reverseBytes;
 import static java.lang.Math.min;
diff --git a/src/java/org/apache/cassandra/net/FrameEncoderUnprotected.java b/src/java/org/apache/cassandra/net/FrameEncoderUnprotected.java
index 3d10acf..8ea36c6 100644
--- a/src/java/org/apache/cassandra/net/FrameEncoderUnprotected.java
+++ b/src/java/org/apache/cassandra/net/FrameEncoderUnprotected.java
@@ -21,7 +21,6 @@
 
 import io.netty.buffer.ByteBuf;
 import io.netty.channel.ChannelHandler;
-import org.apache.cassandra.utils.memory.BufferPool;
 
 import static org.apache.cassandra.net.FrameEncoderCrc.HEADER_LENGTH;
 import static org.apache.cassandra.net.FrameEncoderCrc.writeHeader;
diff --git a/src/java/org/apache/cassandra/net/FutureCombiner.java b/src/java/org/apache/cassandra/net/FutureCombiner.java
deleted file mode 100644
index dd094bd..0000000
--- a/src/java/org/apache/cassandra/net/FutureCombiner.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.net;
-
-import java.util.Collection;
-import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.GenericFutureListener;
-import io.netty.util.concurrent.GlobalEventExecutor;
-import io.netty.util.concurrent.Promise;
-
-/**
- * Netty's PromiseCombiner is not threadsafe, and we combine futures from multiple event executors.
- *
- * This class groups a number of Future into a single logical Future, by registering a listener to each that
- * decrements a shared counter; if any of them fail, the FutureCombiner is completed with the first cause,
- * but in all scenario only completes when all underlying future have completed (exceptionally or otherwise)
- *
- * This Future is always uncancellable.
- *
- * We extend FutureDelegate, and simply provide it an uncancellable Promise that will be completed by the listeners
- * registered to the input futures.
- */
-class FutureCombiner extends FutureDelegate<Void>
-{
-    private volatile boolean failed;
-
-    private volatile Throwable firstCause;
-    private static final AtomicReferenceFieldUpdater<FutureCombiner, Throwable> firstCauseUpdater =
-        AtomicReferenceFieldUpdater.newUpdater(FutureCombiner.class, Throwable.class, "firstCause");
-
-    private volatile int waitingOn;
-    private static final AtomicIntegerFieldUpdater<FutureCombiner> waitingOnUpdater =
-        AtomicIntegerFieldUpdater.newUpdater(FutureCombiner.class, "waitingOn");
-
-    FutureCombiner(Collection<? extends Future<?>> combine)
-    {
-        this(AsyncPromise.uncancellable(GlobalEventExecutor.INSTANCE), combine);
-    }
-
-    private FutureCombiner(Promise<Void> combined, Collection<? extends Future<?>> combine)
-    {
-        super(combined);
-
-        if (0 == (waitingOn = combine.size()))
-            combined.trySuccess(null);
-
-        GenericFutureListener<? extends Future<Object>> listener = result ->
-        {
-            if (!result.isSuccess())
-            {
-                firstCauseUpdater.compareAndSet(this, null, result.cause());
-                failed = true;
-            }
-
-            if (0 == waitingOnUpdater.decrementAndGet(this))
-            {
-                if (failed)
-                    combined.tryFailure(firstCause);
-                else
-                    combined.trySuccess(null);
-            }
-        };
-
-        for (Future<?> future : combine)
-            future.addListener(listener);
-    }
-}
diff --git a/src/java/org/apache/cassandra/net/FutureDelegate.java b/src/java/org/apache/cassandra/net/FutureDelegate.java
index f04a432..b46fa7c 100644
--- a/src/java/org/apache/cassandra/net/FutureDelegate.java
+++ b/src/java/org/apache/cassandra/net/FutureDelegate.java
@@ -21,7 +21,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.Future; // checkstyle: permit this import
 import io.netty.util.concurrent.GenericFutureListener;
 
 /**
@@ -29,7 +29,7 @@
  *
  * See {@link FutureCombiner} and {@link FutureResult}
  */
-class FutureDelegate<V> implements Future<V>
+public class FutureDelegate<V> implements Future<V>
 {
     final Future<V> delegate;
 
@@ -53,26 +53,6 @@
         return delegate.cause();
     }
 
-    public Future<V> addListener(GenericFutureListener<? extends Future<? super V>> genericFutureListener)
-    {
-        return delegate.addListener(genericFutureListener);
-    }
-
-    public Future<V> addListeners(GenericFutureListener<? extends Future<? super V>>... genericFutureListeners)
-    {
-        return delegate.addListeners(genericFutureListeners);
-    }
-
-    public Future<V> removeListener(GenericFutureListener<? extends Future<? super V>> genericFutureListener)
-    {
-        return delegate.removeListener(genericFutureListener);
-    }
-
-    public Future<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... genericFutureListeners)
-    {
-        return delegate.removeListeners(genericFutureListeners);
-    }
-
     public Future<V> sync() throws InterruptedException
     {
         return delegate.sync();
@@ -142,4 +122,28 @@
     {
         return delegate.get(timeout, unit);
     }
+
+    @Override
+    public io.netty.util.concurrent.Future<V> addListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> genericFutureListener)
+    {
+        return delegate.addListener(genericFutureListener);
+    }
+
+    @Override
+    public io.netty.util.concurrent.Future<V> addListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... genericFutureListeners)
+    {
+        return delegate.addListeners(genericFutureListeners);
+    }
+
+    @Override
+    public io.netty.util.concurrent.Future<V> removeListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> genericFutureListener)
+    {
+        return delegate.removeListener(genericFutureListener);
+    }
+
+    @Override
+    public io.netty.util.concurrent.Future<V> removeListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... genericFutureListeners)
+    {
+        return delegate.removeListeners(genericFutureListeners);
+    }
 }
diff --git a/src/java/org/apache/cassandra/net/FutureResult.java b/src/java/org/apache/cassandra/net/FutureResult.java
index 8d43dbe..e2648c5 100644
--- a/src/java/org/apache/cassandra/net/FutureResult.java
+++ b/src/java/org/apache/cassandra/net/FutureResult.java
@@ -17,14 +17,13 @@
  */
 package org.apache.cassandra.net;
 
-import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
 
 /**
  * An abstraction for yielding a result performed by an asynchronous task,
- * for whom we may wish to offer cancellation,
- * but no other access to the underlying task
+ * for whom we may wish to offer cancellation, but no other access to the underlying task
  */
-class FutureResult<V> extends FutureDelegate<V>
+public class FutureResult<V> extends FutureDelegate<V>
 {
     private final Future<?> tryCancel;
 
@@ -32,7 +31,7 @@
      * @param result the Future that will be completed by {@link #cancel}
      * @param cancel the Future that is performing the work, and to whom any cancellation attempts will be proxied
      */
-    FutureResult(Future<V> result, Future<?> cancel)
+    public FutureResult(Future<V> result, Future<?> cancel)
     {
         super(result);
         this.tryCancel = cancel;
diff --git a/src/java/org/apache/cassandra/net/GlobalBufferPoolAllocator.java b/src/java/org/apache/cassandra/net/GlobalBufferPoolAllocator.java
index 16fd5c6..f559a63 100644
--- a/src/java/org/apache/cassandra/net/GlobalBufferPoolAllocator.java
+++ b/src/java/org/apache/cassandra/net/GlobalBufferPoolAllocator.java
@@ -34,7 +34,7 @@
         super();
     }
 
-    static ByteBuf wrap(ByteBuffer buffer)
+    public static ByteBuf wrap(ByteBuffer buffer)
     {
         return new Wrapped(instance, buffer, buffer.capacity());
     }
diff --git a/src/java/org/apache/cassandra/net/HandshakeProtocol.java b/src/java/org/apache/cassandra/net/HandshakeProtocol.java
index bfdcc2c..a82c115 100644
--- a/src/java/org/apache/cassandra/net/HandshakeProtocol.java
+++ b/src/java/org/apache/cassandra/net/HandshakeProtocol.java
@@ -40,7 +40,6 @@
 import static org.apache.cassandra.net.MessagingService.VERSION_40;
 import static org.apache.cassandra.net.Message.validateLegacyProtocolMagic;
 import static org.apache.cassandra.net.Crc.*;
-import static org.apache.cassandra.net.Crc.computeCrc32;
 import static org.apache.cassandra.net.OutboundConnectionSettings.*;
 
 /**
@@ -53,7 +52,8 @@
  * it will simply disconnect and reconnect with a more appropriate version. But if the version is acceptable, the connection
  * initiator sends the third message of the protocol, after which it considers the connection ready.
  */
-class HandshakeProtocol
+@VisibleForTesting
+public class HandshakeProtocol
 {
     static final long TIMEOUT_MILLIS = 3 * DatabaseDescriptor.getRpcTimeout(MILLISECONDS);
 
diff --git a/src/java/org/apache/cassandra/net/InboundConnectionInitiator.java b/src/java/org/apache/cassandra/net/InboundConnectionInitiator.java
index 4c31adf..807d026 100644
--- a/src/java/org/apache/cassandra/net/InboundConnectionInitiator.java
+++ b/src/java/org/apache/cassandra/net/InboundConnectionInitiator.java
@@ -21,6 +21,7 @@
 import java.net.InetSocketAddress;
 import java.net.SocketAddress;
 import java.util.List;
+import java.util.NoSuchElementException;
 import java.util.concurrent.Future;
 import java.util.function.Consumer;
 
@@ -34,6 +35,7 @@
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelFutureListener;
 import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.ChannelInitializer;
 import io.netty.channel.ChannelOption;
 import io.netty.channel.ChannelPipeline;
@@ -44,20 +46,22 @@
 import io.netty.handler.logging.LoggingHandler;
 import io.netty.handler.ssl.SslContext;
 import io.netty.handler.ssl.SslHandler;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.OutboundConnectionSettings.Framing;
+import org.apache.cassandra.security.ISslContextFactory;
 import org.apache.cassandra.security.SSLFactory;
-import org.apache.cassandra.streaming.async.StreamingInboundHandler;
+import org.apache.cassandra.streaming.StreamDeserializingTask;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.async.NettyStreamingChannel;
 import org.apache.cassandra.utils.memory.BufferPools;
 
 import static java.lang.Math.*;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.net.MessagingService.*;
-import static org.apache.cassandra.net.MessagingService.VERSION_40;
-import static org.apache.cassandra.net.MessagingService.current_version;
-import static org.apache.cassandra.net.MessagingService.minimum_version;
 import static org.apache.cassandra.net.SocketFactory.WIRETRACE;
 import static org.apache.cassandra.net.SocketFactory.newSslHandler;
 
@@ -67,6 +71,8 @@
 
     private static class Initializer extends ChannelInitializer<SocketChannel>
     {
+        private static final String PIPELINE_INTERNODE_ERROR_EXCLUSIONS = "Internode Error Exclusions";
+
         private final InboundConnectionSettings settings;
         private final ChannelGroup channelGroup;
         private final Consumer<ChannelPipeline> pipelineInjector;
@@ -82,6 +88,9 @@
         @Override
         public void initChannel(SocketChannel channel) throws Exception
         {
+            // if any of the handlers added fail they will send the error to the "head", so this needs to be first
+            channel.pipeline().addFirst(PIPELINE_INTERNODE_ERROR_EXCLUSIONS, new InternodeErrorExclusionsHandler());
+
             channelGroup.add(channel);
 
             channel.config().setOption(ChannelOption.ALLOCATOR, GlobalBufferPoolAllocator.instance);
@@ -99,14 +108,14 @@
             {
                 case UNENCRYPTED:
                     // Handler checks for SSL connection attempts and cleanly rejects them if encryption is disabled
-                    pipeline.addFirst("rejectssl", new RejectSslHandler());
+                    pipeline.addAfter(PIPELINE_INTERNODE_ERROR_EXCLUSIONS, "rejectssl", new RejectSslHandler());
                     break;
                 case OPTIONAL:
-                    pipeline.addFirst("ssl", new OptionalSslHandler(settings.encryption));
+                    pipeline.addAfter(PIPELINE_INTERNODE_ERROR_EXCLUSIONS, "ssl", new OptionalSslHandler(settings.encryption));
                     break;
                 case ENCRYPTED:
                     SslHandler sslHandler = getSslHandler("creating", channel, settings.encryption);
-                    pipeline.addFirst("ssl", sslHandler);
+                    pipeline.addAfter(PIPELINE_INTERNODE_ERROR_EXCLUSIONS, "ssl", sslHandler);
                     break;
             }
 
@@ -114,7 +123,20 @@
                 pipeline.addLast("logger", new LoggingHandler(LogLevel.INFO));
 
             channel.pipeline().addLast("handshake", new Handler(settings));
+        }
+    }
 
+    private static class InternodeErrorExclusionsHandler extends ChannelInboundHandlerAdapter
+    {
+        @Override
+        public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception
+        {
+            if (DatabaseDescriptor.getInternodeErrorReportingExclusions().contains(ctx.channel().remoteAddress()))
+            {
+                logger.debug("Excluding internode exception for {}; address contained in internode_error_reporting_exclusions", ctx.channel().remoteAddress(), cause);
+                return;
+            }
+            super.exceptionCaught(ctx, cause);
         }
     }
 
@@ -138,7 +160,7 @@
             bootstrap.childOption(ChannelOption.SO_RCVBUF, socketReceiveBufferSizeInBytes);
 
         InetAddressAndPort bind = initializer.settings.bindAddress;
-        ChannelFuture channelFuture = bootstrap.bind(new InetSocketAddress(bind.address, bind.port));
+        ChannelFuture channelFuture = bootstrap.bind(new InetSocketAddress(bind.getAddress(), bind.getPort()));
 
         if (!channelFuture.awaitUninterruptibly().isSuccess())
         {
@@ -156,9 +178,7 @@
                 throw new ConfigurationException(bind + " is in use by another process.  Change listen_address:storage_port " +
                                                  "in cassandra.yaml to values that do not conflict with other services");
             }
-            // looking at the jdk source, solaris/windows bind failue messages both use the phrase "cannot assign requested address".
-            // windows message uses "Cannot" (with a capital 'C'), and solaris (a/k/a *nux) doe not. hence we search for "annot" <sigh>
-            else if (causeString.contains("annot assign requested address"))
+            else if (causeString.contains("cannot assign requested address"))
             {
                 throw new ConfigurationException("Unable to bind to address " + bind
                                                  + ". Set listen_address in cassandra.yaml to an interface you can bind to, e.g., your private IP address on EC2");
@@ -213,20 +233,30 @@
                 failHandshake(ctx);
             }, HandshakeProtocol.TIMEOUT_MILLIS, MILLISECONDS);
 
-            authenticate(ctx.channel().remoteAddress());
+            if (!authenticate(ctx.channel().remoteAddress()))
+            {
+                failHandshake(ctx);
+            }
         }
 
-        private void authenticate(SocketAddress socketAddress) throws IOException
+        private boolean authenticate(SocketAddress socketAddress) throws IOException
         {
             if (socketAddress.getClass().getSimpleName().equals("EmbeddedSocketAddress"))
-                return;
+                return true;
 
             if (!(socketAddress instanceof InetSocketAddress))
                 throw new IOException(String.format("Unexpected SocketAddress type: %s, %s", socketAddress.getClass(), socketAddress));
 
             InetSocketAddress addr = (InetSocketAddress)socketAddress;
             if (!settings.authenticate(addr.getAddress(), addr.getPort()))
-                throw new IOException("Authentication failure for inbound connection from peer " + addr);
+            {
+                // Log at info level as anything that can reach the inbound port could hit this
+                // and trigger a log of noise.  Failed outbound connections to known cluster endpoints
+                // still fail with an ERROR message and exception to alert operators that aren't watching logs closely.
+                logger.info("Authenticate rejected inbound internode connection from {}", addr);
+                return false;
+            }
+            return true;
         }
 
         @Override
@@ -250,6 +280,7 @@
                 logger.warn("peer {} attempted to establish an unencrypted connection (broadcast address {})",
                             ctx.channel().remoteAddress(), initiate.from);
                 failHandshake(ctx);
+                return;
             }
 
             if (initiate.acceptVersions != null)
@@ -275,11 +306,13 @@
                 {
                     logger.info("peer {} only supports messaging versions higher ({}) than this node supports ({})", ctx.channel().remoteAddress(), initiate.acceptVersions.min, current_version);
                     failHandshake(ctx);
+                    return;
                 }
                 else if (initiate.acceptVersions.max < accept.min)
                 {
                     logger.info("peer {} only supports messaging versions lower ({}) than this node supports ({})", ctx.channel().remoteAddress(), initiate.acceptVersions.max, minimum_version);
                     failHandshake(ctx);
+                    return;
                 }
                 else
                 {
@@ -302,6 +335,7 @@
                     {
                         logger.warn("Received stream using protocol version {} (my version {}). Terminating connection", version, settings.acceptStreaming.max);
                         failHandshake(ctx);
+                        return;
                     }
                     setupStreamingPipeline(initiate.from, ctx);
                 }
@@ -357,14 +391,22 @@
 
         private void exceptionCaught(Channel channel, Throwable cause)
         {
-            logger.error("Failed to properly handshake with peer {}. Closing the channel.", channel.remoteAddress(), cause);
+            final SocketAddress remoteAddress = channel.remoteAddress();
+            boolean reportingExclusion = DatabaseDescriptor.getInternodeErrorReportingExclusions().contains(remoteAddress);
+
+            if (reportingExclusion)
+                logger.debug("Excluding internode exception for {}; address contained in internode_error_reporting_exclusions", remoteAddress, cause);
+            else
+                logger.error("Failed to properly handshake with peer {}. Closing the channel.", remoteAddress, cause);
+
             try
             {
                 failHandshake(channel);
             }
             catch (Throwable t)
             {
-                logger.error("Unexpected exception in {}.exceptionCaught", this.getClass().getSimpleName(), t);
+                if (!reportingExclusion)
+                    logger.error("Unexpected exception in {}.exceptionCaught", this.getClass().getSimpleName(), t);
             }
         }
 
@@ -375,9 +417,24 @@
 
         private void failHandshake(Channel channel)
         {
-            channel.close();
+            // Cancel the handshake timeout as early as possible as it calls this method
             if (handshakeTimeout != null)
                 handshakeTimeout.cancel(true);
+
+            // prevent further decoding of buffered data by removing this handler before closing
+            // otherwise the pending bytes will be decoded again on close, throwing further exceptions.
+            try
+            {
+                channel.pipeline().remove(this);
+            }
+            catch (NoSuchElementException ex)
+            {
+                // possible race with the handshake timeout firing and removing this handler already
+            }
+            finally
+            {
+                channel.close();
+            }
         }
 
         private void setupStreamingPipeline(InetAddressAndPort from, ChannelHandlerContext ctx)
@@ -395,7 +452,15 @@
             }
 
             BufferPools.forNetworking().setRecycleWhenFreeForCurrentThread(false);
-            pipeline.replace(this, "streamInbound", new StreamingInboundHandler(from, current_version, null));
+
+            // we can't infer the type of streaming connection at this point,
+            // so we use CONTROL unconditionally; it's ugly but does what we want
+            // (establishes an AsyncStreamingInputPlus)
+            NettyStreamingChannel streamingChannel =
+                new NettyStreamingChannel(current_version, channel, StreamingChannel.Kind.CONTROL);
+            pipeline.replace(this, "streamInbound", streamingChannel);
+            executorFactory().startThread(String.format("Stream-Deserializer-%s-%s", from, channel.id()),
+                                          new StreamDeserializingTask(null, streamingChannel, current_version));
 
             logger.info("{} streaming connection established, version = {}, framing = {}, encryption = {}",
                         SocketFactory.channelId(from,
@@ -469,14 +534,22 @@
 
             pipeline.addLast("deserialize", handler);
 
-            pipeline.remove(this);
+            try
+            {
+                pipeline.remove(this);
+            }
+            catch (NoSuchElementException ex)
+            {
+                // possible race with the handshake timeout firing and removing this handler already
+            }
         }
     }
 
     private static SslHandler getSslHandler(String description, Channel channel, EncryptionOptions.ServerEncryptionOptions encryptionOptions) throws IOException
     {
-        final boolean buildTrustStore = true;
-        SslContext sslContext = SSLFactory.getOrCreateSslContext(encryptionOptions, buildTrustStore, SSLFactory.SocketType.SERVER);
+        final boolean verifyPeerCertificate = true;
+        SslContext sslContext = SSLFactory.getOrCreateSslContext(encryptionOptions, verifyPeerCertificate,
+                                                                 ISslContextFactory.SocketType.SERVER);
         InetSocketAddress peer = encryptionOptions.require_endpoint_verification ? (InetSocketAddress) channel.remoteAddress() : null;
         SslHandler sslHandler = newSslHandler(channel, sslContext, peer);
         logger.trace("{} inbound netty SslContext: context={}, engine={}", description, sslContext.getClass().getName(), sslHandler.engine().getClass().getName());
diff --git a/src/java/org/apache/cassandra/net/InboundConnectionSettings.java b/src/java/org/apache/cassandra/net/InboundConnectionSettings.java
index 00def4f..2eab9bc 100644
--- a/src/java/org/apache/cassandra/net/InboundConnectionSettings.java
+++ b/src/java/org/apache/cassandra/net/InboundConnectionSettings.java
@@ -73,7 +73,7 @@
 
     public boolean authenticate(InetAddressAndPort endpoint)
     {
-        return authenticator.authenticate(endpoint.address, endpoint.port);
+        return authenticator.authenticate(endpoint.getAddress(), endpoint.getPort());
     }
 
     public boolean authenticate(InetAddress address, int port)
@@ -84,7 +84,7 @@
     public String toString()
     {
         return format("address: (%s), nic: %s, encryption: %s",
-                      bindAddress, FBUtilities.getNetworkInterface(bindAddress.address), SocketFactory.encryptionOptionsSummary(encryption));
+                      bindAddress, FBUtilities.getNetworkInterface(bindAddress.getAddress()), SocketFactory.encryptionOptionsSummary(encryption));
     }
 
     public InboundConnectionSettings withAuthenticator(IInternodeAuthenticator authenticator)
@@ -168,9 +168,9 @@
     public InboundConnectionSettings withDefaults()
     {
         // this is for the socket that can be plain, only ssl, or optional plain/ssl
-        if (bindAddress.port != DatabaseDescriptor.getStoragePort() && bindAddress.port != DatabaseDescriptor.getSSLStoragePort())
+        if (bindAddress.getPort() != DatabaseDescriptor.getStoragePort() && bindAddress.getPort() != DatabaseDescriptor.getSSLStoragePort())
             throw new ConfigurationException(format("Local endpoint port %d doesn't match YAML configured port %d or legacy SSL port %d",
-                                                    bindAddress.port, DatabaseDescriptor.getStoragePort(), DatabaseDescriptor.getSSLStoragePort()));
+                                                    bindAddress.getPort(), DatabaseDescriptor.getStoragePort(), DatabaseDescriptor.getSSLStoragePort()));
 
         IInternodeAuthenticator authenticator = this.authenticator;
         ServerEncryptionOptions encryption = this.encryption;
diff --git a/src/java/org/apache/cassandra/net/InboundMessageHandler.java b/src/java/org/apache/cassandra/net/InboundMessageHandler.java
index 64d0a8c..e12fcec 100644
--- a/src/java/org/apache/cassandra/net/InboundMessageHandler.java
+++ b/src/java/org/apache/cassandra/net/InboundMessageHandler.java
@@ -34,8 +34,6 @@
 import org.apache.cassandra.io.util.DataInputBuffer;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.Message.Header;
-import org.apache.cassandra.net.FrameDecoder.Frame;
-import org.apache.cassandra.net.FrameDecoder.FrameProcessor;
 import org.apache.cassandra.net.FrameDecoder.IntactFrame;
 import org.apache.cassandra.net.FrameDecoder.CorruptFrame;
 import org.apache.cassandra.net.ResourceLimits.Limit;
@@ -45,7 +43,7 @@
 import org.apache.cassandra.utils.NoSpamLogger;
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 /**
  * Implementation of {@link AbstractMessageHandler} for processing internode messages from peers.
@@ -398,7 +396,7 @@
         if (state != null) state.trace("{} message received from {}", header.verb, header.from);
 
         callbacks.onDispatched(task.size(), header);
-        header.verb.stage.execute(task, ExecutorLocals.create(state));
+        header.verb.stage.execute(ExecutorLocals.create(state), task);
     }
 
     private abstract class ProcessMessage implements Runnable
diff --git a/src/java/org/apache/cassandra/net/InboundMessageHandlers.java b/src/java/org/apache/cassandra/net/InboundMessageHandlers.java
index a706557..c7b9463 100644
--- a/src/java/org/apache/cassandra/net/InboundMessageHandlers.java
+++ b/src/java/org/apache/cassandra/net/InboundMessageHandlers.java
@@ -32,7 +32,7 @@
 import org.apache.cassandra.net.Message.Header;
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 /**
  * An aggregation of {@link InboundMessageHandler}s for all connections from a peer.
diff --git a/src/java/org/apache/cassandra/net/InboundSockets.java b/src/java/org/apache/cassandra/net/InboundSockets.java
index fc57224..58cd88e 100644
--- a/src/java/org/apache/cassandra/net/InboundSockets.java
+++ b/src/java/org/apache/cassandra/net/InboundSockets.java
@@ -31,13 +31,15 @@
 import io.netty.channel.group.ChannelGroup;
 import io.netty.channel.group.DefaultChannelGroup;
 import io.netty.util.concurrent.DefaultEventExecutor;
-import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
 import io.netty.util.concurrent.GlobalEventExecutor;
 import io.netty.util.concurrent.PromiseNotifier;
 import io.netty.util.concurrent.SucceededFuture;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
 
 class InboundSockets
 {
@@ -97,15 +99,28 @@
                     throw new IllegalStateException();
                 binding = InboundConnectionInitiator.bind(settings, connections, pipelineInjector);
             }
-
-            return binding.addListener(ignore -> {
+            // isOpen is defined as "listen.isOpen", but this is set AFTER the binding future is set
+            // to make sure the future returned does not complete until listen is set, need a new
+            // future to replicate "Future.map" behavior.
+            AsyncChannelPromise promise = new AsyncChannelPromise(binding.channel());
+            binding.addListener(f -> {
+                if (!f.isSuccess())
+                {
+                    synchronized (this)
+                    {
+                        binding = null;
+                    }
+                    promise.setFailure(f.cause());
+                    return;
+                }
                 synchronized (this)
                 {
-                    if (binding.isSuccess())
-                        listen = binding.channel();
+                    listen = binding.channel();
                     binding = null;
                 }
+                promise.setSuccess(null);
             });
+            return promise;
         }
 
         /**
@@ -125,7 +140,7 @@
                 if (listen != null)
                     closing.add(listen.close());
                 closing.add(connections.close());
-                new FutureCombiner(closing)
+                FutureCombiner.nettySuccessListener(closing)
                        .addListener(future -> {
                            executor.shutdownGracefully();
                            shutdownExecutors.accept(executor);
@@ -202,7 +217,7 @@
         InboundConnectionSettings       settings = template.withDefaults();
         InboundConnectionSettings legacySettings = template.withLegacySslStoragePortDefaults();
 
-        if (settings.encryption.enable_legacy_ssl_storage_port)
+        if (settings.encryption.legacy_ssl_storage_port_enabled)
         {
             out.add(new InboundSocket(legacySettings));
 
@@ -224,7 +239,7 @@
         for (InboundSocket socket : sockets)
             opening.add(socket.open(pipelineInjector));
 
-        return new FutureCombiner(opening);
+        return FutureCombiner.nettySuccessListener(opening);
     }
 
     public Future<Void> open()
@@ -232,7 +247,7 @@
         List<Future<Void>> opening = new ArrayList<>();
         for (InboundSocket socket : sockets)
             opening.add(socket.open());
-        return new FutureCombiner(opening);
+        return FutureCombiner.nettySuccessListener(opening);
     }
 
     public boolean isListening()
@@ -248,7 +263,7 @@
         List<Future<Void>> closing = new ArrayList<>();
         for (InboundSocket address : sockets)
             closing.add(address.close(shutdownExecutors));
-        return new FutureCombiner(closing);
+        return FutureCombiner.nettySuccessListener(closing);
     }
     public Future<Void> close()
     {
diff --git a/src/java/org/apache/cassandra/net/Message.java b/src/java/org/apache/cassandra/net/Message.java
index bc176bd..09e4ba3 100644
--- a/src/java/org/apache/cassandra/net/Message.java
+++ b/src/java/org/apache/cassandra/net/Message.java
@@ -23,7 +23,6 @@
 import java.util.EnumMap;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -45,9 +44,9 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.tracing.Tracing.TraceType;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MonotonicClockTranslation;
 import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
@@ -59,7 +58,8 @@
 import static org.apache.cassandra.net.MessagingService.VERSION_30;
 import static org.apache.cassandra.net.MessagingService.VERSION_40;
 import static org.apache.cassandra.net.MessagingService.instance;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 import static org.apache.cassandra.utils.vint.VIntCoding.computeUnsignedVIntSize;
 import static org.apache.cassandra.utils.vint.VIntCoding.getUnsignedVInt;
 import static org.apache.cassandra.utils.vint.VIntCoding.skipUnsignedVInt;
@@ -78,7 +78,7 @@
     public final Header header;
     public final T payload;
 
-    private Message(Header header, T payload)
+    Message(Header header, T payload)
     {
         this.header = header;
         this.payload = payload;
@@ -93,7 +93,7 @@
     /** Whether the message has crossed the node boundary, that is whether it originated from another node. */
     public boolean isCrossNode()
     {
-        return !from().equals(FBUtilities.getBroadcastAddressAndPort());
+        return !from().equals(getBroadcastAddressAndPort());
     }
 
     /**
@@ -146,6 +146,11 @@
         return header.callBackOnFailure();
     }
 
+    public boolean trackWarnings()
+    {
+        return header.trackWarnings();
+    }
+
     /** See CASSANDRA-14145 */
     public boolean trackRepairedData()
     {
@@ -167,7 +172,7 @@
     }
 
     @Nullable
-    public UUID traceSession()
+    public TimeUUID traceSession()
     {
         return header.traceSession();
     }
@@ -198,6 +203,11 @@
         return outWithParam(nextId(), verb, payload, null, null);
     }
 
+    public static <T> Message<T> synthetic(InetAddressAndPort from, Verb verb, T payload)
+    {
+        return new Message<>(new Header(-1, verb, from, -1, -1, 0, NO_PARAMS), payload);
+    }
+
     public static <T> Message<T> out(Verb verb, T payload, long expiresAtNanos)
     {
         return outWithParam(nextId(), verb, expiresAtNanos, payload, 0, null, null);
@@ -215,6 +225,7 @@
         return outWithParam(nextId(), verb, 0, payload, flag2.addTo(flag1.addTo(0)), null, null);
     }
 
+    @VisibleForTesting
     static <T> Message<T> outWithParam(long id, Verb verb, T payload, ParamType paramType, Object paramValue)
     {
         return outWithParam(id, verb, 0, payload, paramType, paramValue);
@@ -227,10 +238,14 @@
 
     private static <T> Message<T> outWithParam(long id, Verb verb, long expiresAtNanos, T payload, int flags, ParamType paramType, Object paramValue)
     {
+        return withParam(getBroadcastAddressAndPort(), id, verb, expiresAtNanos, payload, flags, paramType, paramValue);
+    }
+
+    private static <T> Message<T> withParam(InetAddressAndPort from, long id, Verb verb, long expiresAtNanos, T payload, int flags, ParamType paramType, Object paramValue)
+    {
         if (payload == null)
             throw new IllegalArgumentException();
 
-        InetAddressAndPort from = FBUtilities.getBroadcastAddressAndPort();
         long createdAtNanos = approxTime.now();
         if (expiresAtNanos == 0)
             expiresAtNanos = verb.expiresAtNanos(createdAtNanos);
@@ -244,6 +259,18 @@
         return outWithParam(0, verb, payload, null, null);
     }
 
+    /**
+     * Used by the {@code MultiRangeReadCommand} to split multi-range responses from a replica
+     * into single-range responses.
+     */
+    public static <T> Message<T> remoteResponse(InetAddressAndPort from, Verb verb, T payload)
+    {
+        assert verb.isResponse();
+        long createdAtNanos = approxTime.now();
+        long expiresAtNanos = verb.expiresAtNanos(createdAtNanos);
+        return new Message<>(new Header(0, verb, from, createdAtNanos, expiresAtNanos, 0, NO_PARAMS), payload);
+    }
+
     /** Builds a response Message with provided payload, and all the right fields inferred from request Message */
     public <T> Message<T> responseWith(T payload)
     {
@@ -267,6 +294,11 @@
         return outWithParam(id, Verb.FAILURE_RSP, expiresAtNanos, reason, null, null);
     }
 
+    public <V> Message<V> withPayload(V newPayload)
+    {
+        return new Message<>(header, newPayload);
+    }
+
     Message<T> withCallBackOnFailure()
     {
         return new Message<>(header.withFlag(MessageFlag.CALL_BACK_ON_FAILURE), payload);
@@ -277,6 +309,23 @@
         return new Message<>(header.withParam(ParamType.FORWARD_TO, peers), payload);
     }
 
+    public Message<T> withFlag(MessageFlag flag)
+    {
+        return new Message<>(header.withFlag(flag), payload);
+    }
+
+    public Message<T> withParam(ParamType type, Object value)
+    {
+        return new Message<>(header.withParam(type, value), payload);
+    }
+
+    public Message<T> withParams(Map<ParamType, Object> values)
+    {
+        if (values == null || values.isEmpty())
+            return this;
+        return new Message<>(header.withParams(values), payload);
+    }
+
     private static final EnumMap<ParamType, Object> NO_PARAMS = new EnumMap<>(ParamType.class);
 
     private static Map<ParamType, Object> buildParams(ParamType type, Object value)
@@ -305,6 +354,16 @@
         return params;
     }
 
+    private static Map<ParamType, Object> addParams(Map<ParamType, Object> params, Map<ParamType, Object> values)
+    {
+        if (values == null || values.isEmpty())
+            return params;
+
+        params = new EnumMap<>(params);
+        params.putAll(values);
+        return params;
+    }
+
     /*
      * id generation
      */
@@ -393,6 +452,11 @@
             return new Header(id, verb, from, createdAtNanos, expiresAtNanos, flags, addParam(params, type, value));
         }
 
+        Header withParams(Map<ParamType, Object> values)
+        {
+            return new Header(id, verb, from, createdAtNanos, expiresAtNanos, flags, addParams(params, values));
+        }
+
         boolean callBackOnFailure()
         {
             return MessageFlag.CALL_BACK_ON_FAILURE.isIn(flags);
@@ -403,6 +467,11 @@
             return MessageFlag.TRACK_REPAIRED_DATA.isIn(flags);
         }
 
+        boolean trackWarnings()
+        {
+            return MessageFlag.TRACK_WARNINGS.isIn(flags);
+        }
+
         @Nullable
         ForwardingInfo forwardTo()
         {
@@ -412,13 +481,15 @@
         @Nullable
         InetAddressAndPort respondTo()
         {
-            return (InetAddressAndPort) params.get(ParamType.RESPOND_TO);
+            InetAddressAndPort respondTo = (InetAddressAndPort) params.get(ParamType.RESPOND_TO);
+            if (respondTo == null) respondTo = from;
+            return respondTo;
         }
 
         @Nullable
-        public UUID traceSession()
+        public TimeUUID traceSession()
         {
-            return (UUID) params.get(ParamType.TRACE_SESSION);
+            return (TimeUUID) params.get(ParamType.TRACE_SESSION);
         }
 
         @Nullable
@@ -427,6 +498,11 @@
             return (TraceType) params.getOrDefault(ParamType.TRACE_TYPE, TraceType.QUERY);
         }
 
+        public Map<ParamType, Object> params()
+        {
+            return Collections.unmodifiableMap(params);
+        }
+
         @Nullable
         public Map<String,byte[]> customParams()
         {
@@ -521,7 +597,7 @@
             if (expiresAtNanos == 0 && verb != null && createdAtNanos != 0)
                 expiresAtNanos = verb.expiresAtNanos(createdAtNanos);
             if (!this.verb.isResponse() && from == null) // default to sending from self if we're a request verb
-                from = FBUtilities.getBroadcastAddressAndPort();
+                from = getBroadcastAddressAndPort();
             return this;
         }
 
@@ -782,7 +858,7 @@
         {
             serializeHeaderPost40(message.header, out, version);
             out.writeUnsignedVInt(message.payloadSize(version));
-            message.getPayloadSerializer().serialize(message.payload, out, version);
+            message.verb().serializer().serialize(message.payload, out, version);
         }
 
         private <T> Message<T> deserializePost40(DataInputPlus in, InetAddressAndPort peer, int version) throws IOException
diff --git a/src/java/org/apache/cassandra/net/MessageFlag.java b/src/java/org/apache/cassandra/net/MessageFlag.java
index c74784d..441b06b 100644
--- a/src/java/org/apache/cassandra/net/MessageFlag.java
+++ b/src/java/org/apache/cassandra/net/MessageFlag.java
@@ -27,7 +27,9 @@
     /** a failure response should be sent back in case of failure */
     CALL_BACK_ON_FAILURE (0),
     /** track repaired data - see CASSANDRA-14145 */
-    TRACK_REPAIRED_DATA  (1);
+    TRACK_REPAIRED_DATA  (1),
+    /** allow creating warnings or aborting queries based off query - see CASSANDRA-16850 */
+    TRACK_WARNINGS(2);
 
     private final int id;
 
diff --git a/src/java/org/apache/cassandra/net/MessagingService.java b/src/java/org/apache/cassandra/net/MessagingService.java
index cd124ad..bc39056 100644
--- a/src/java/org/apache/cassandra/net/MessagingService.java
+++ b/src/java/org/apache/cassandra/net/MessagingService.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.net;
 
+import java.io.IOException;
 import java.nio.channels.ClosedChannelException;
 import java.util.ArrayList;
 import java.util.List;
@@ -26,10 +27,12 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -37,6 +40,7 @@
 import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.metrics.MessagingMetrics;
 import org.apache.cassandra.service.AbstractWriteResponseHandler;
 import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.FBUtilities;
@@ -45,6 +49,7 @@
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.concurrent.Stage.MUTATION;
 import static org.apache.cassandra.config.CassandraRelevantProperties.NON_GRACEFUL_SHUTDOWN;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.apache.cassandra.utils.Throwables.maybeFail;
 
 /**
@@ -195,7 +200,7 @@
  * implemented in {@link org.apache.cassandra.db.virtual.InternodeInboundTable} and
  * {@link org.apache.cassandra.db.virtual.InternodeOutboundTable} respectively.
  */
-public final class MessagingService extends MessagingServiceMBeanImpl
+public class MessagingService extends MessagingServiceMBeanImpl
 {
     private static final Logger logger = LoggerFactory.getLogger(MessagingService.class);
 
@@ -203,6 +208,7 @@
     public static final int VERSION_30 = 10;
     public static final int VERSION_3014 = 11;
     public static final int VERSION_40 = 12;
+    public static final int VERSION_41 = 13;
     public static final int minimum_version = VERSION_30;
     public static final int current_version = VERSION_40;
     static AcceptVersions accept_messaging = new AcceptVersions(minimum_version, current_version);
@@ -259,10 +265,65 @@
     @VisibleForTesting
     MessagingService(boolean testOnly)
     {
-        super(testOnly);
+        this(testOnly, new EndpointMessagingVersions(), new MessagingMetrics());
+    }
+
+    @VisibleForTesting
+    MessagingService(boolean testOnly, EndpointMessagingVersions versions, MessagingMetrics metrics)
+    {
+        super(testOnly, versions, metrics);
         OutboundConnections.scheduleUnusedConnectionMonitoring(this, ScheduledExecutors.scheduledTasks, 1L, TimeUnit.HOURS);
     }
 
+    public <T> org.apache.cassandra.utils.concurrent.Future<Message<T>> sendWithResult(Message message, InetAddressAndPort to)
+    {
+        AsyncPromise<Message<T>> promise = new AsyncPromise<>();
+        MessagingService.instance().sendWithCallback(message, to, new RequestCallback<T>()
+        {
+            @Override
+            public void onResponse(Message<T> msg)
+            {
+                promise.trySuccess(msg);
+            }
+
+            @Override
+            public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason)
+            {
+                promise.tryFailure(new FailureResponseException(from, failureReason));
+            }
+
+            @Override
+            public boolean invokeOnFailure()
+            {
+                return true;
+            }
+        });
+        return promise;
+    }
+
+    public static class FailureResponseException extends IOException
+    {
+        private final InetAddressAndPort from;
+        private final RequestFailureReason failureReason;
+
+        public FailureResponseException(InetAddressAndPort from, RequestFailureReason failureReason)
+        {
+            super(String.format("Failure from %s: %s", from, failureReason.name()));
+            this.from = from;
+            this.failureReason = failureReason;
+        }
+
+        public InetAddressAndPort from()
+        {
+            return from;
+        }
+
+        public RequestFailureReason failureReason()
+        {
+            return failureReason;
+        }
+    }
+
     /**
      * Send a non-mutation message to a given endpoint. This method specifies a callback
      * which is invoked with the actual response.
@@ -296,10 +357,10 @@
      * @param handler callback interface which is used to pass the responses or
      *                suggest that a timeout occurred to the invoker of the send().
      */
-    public void sendWriteWithCallback(Message message, Replica to, AbstractWriteResponseHandler<?> handler, boolean allowHints)
+    public void sendWriteWithCallback(Message message, Replica to, AbstractWriteResponseHandler<?> handler)
     {
         assert message.callBackOnFailure();
-        callbacks.addWithExpiration(handler, message, to, handler.consistencyLevel(), allowHints);
+        callbacks.addWithExpiration(handler, message, to);
         send(message, to.endpoint(), null);
     }
 
@@ -315,6 +376,23 @@
         send(message, to, null);
     }
 
+    /**
+     * Send a message to a given endpoint. This method adheres to the fire and forget
+     * style messaging.
+     *
+     * @param message messages to be sent.
+     * @param response
+     */
+    public <V> void respond(V response, Message<?> message)
+    {
+        send(message.responseWith(response), message.respondTo());
+    }
+
+    public <V> void respondWithFailure(RequestFailureReason reason, Message<?> message)
+    {
+        send(Message.failureResponse(message.id(), message.expiresAtNanos(), reason), message.respondTo());
+    }
+
     public void send(Message message, InetAddressAndPort to, ConnectionType specifyConnection)
     {
         if (logger.isTraceEnabled())
@@ -462,8 +540,8 @@
             for (OutboundConnections pool : channelManagers.values())
                 closing.add(pool.close(true));
 
-            long deadline = System.nanoTime() + units.toNanos(timeout);
-            maybeFail(() -> new FutureCombiner(closing).get(timeout, units),
+            long deadline = nanoTime() + units.toNanos(timeout);
+            maybeFail(() -> FutureCombiner.nettySuccessListener(closing).get(timeout, units),
                       () -> {
                           List<ExecutorService> inboundExecutors = new ArrayList<>();
                           inboundSockets.close(synchronizedList(inboundExecutors)::add).get();
@@ -486,8 +564,8 @@
             for (OutboundConnections pool : channelManagers.values())
                 closing.add(pool.close(false));
 
-            long deadline = System.nanoTime() + units.toNanos(timeout);
-            maybeFail(() -> new FutureCombiner(closing).get(timeout, units),
+            long deadline = nanoTime() + units.toNanos(timeout);
+            maybeFail(() -> FutureCombiner.nettySuccessListener(closing).get(timeout, units),
                       () -> {
                           if (shutdownExecutors)
                               shutdownExecutors(deadline);
diff --git a/src/java/org/apache/cassandra/net/MessagingServiceMBeanImpl.java b/src/java/org/apache/cassandra/net/MessagingServiceMBeanImpl.java
index bea2b8c..b77fa83 100644
--- a/src/java/org/apache/cassandra/net/MessagingServiceMBeanImpl.java
+++ b/src/java/org/apache/cassandra/net/MessagingServiceMBeanImpl.java
@@ -19,7 +19,6 @@
 
 import java.io.IOException;
 import java.net.UnknownHostException;
-import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -42,11 +41,13 @@
     public final ConcurrentMap<InetAddressAndPort, OutboundConnections> channelManagers = new ConcurrentHashMap<>();
     public final ConcurrentMap<InetAddressAndPort, InboundMessageHandlers> messageHandlers = new ConcurrentHashMap<>();
 
-    public final EndpointMessagingVersions versions = new EndpointMessagingVersions();
-    public final MessagingMetrics metrics = new MessagingMetrics();
+    public final EndpointMessagingVersions versions;
+    public final MessagingMetrics metrics;
 
-    MessagingServiceMBeanImpl(boolean testOnly)
+    public MessagingServiceMBeanImpl(boolean testOnly, EndpointMessagingVersions versions, MessagingMetrics metrics)
     {
+        this.versions = versions;
+        this.metrics = metrics;
         if (!testOnly)
         {
             MBeanWrapper.instance.registerMBean(this, MBEAN_NAME);
diff --git a/src/java/org/apache/cassandra/net/OutboundConnection.java b/src/java/org/apache/cassandra/net/OutboundConnection.java
index 82eb6ce..821521b 100644
--- a/src/java/org/apache/cassandra/net/OutboundConnection.java
+++ b/src/java/org/apache/cassandra/net/OutboundConnection.java
@@ -23,7 +23,6 @@
 import java.net.InetSocketAddress;
 import java.nio.channels.ClosedChannelException;
 import java.util.Objects;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -34,7 +33,9 @@
 import javax.annotation.Nullable;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.Uninterruptibles;
+
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,8 +45,8 @@
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.EventLoop;
 import io.netty.channel.unix.Errors;
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.Promise;
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
+import io.netty.util.concurrent.Promise; //checkstyle: permit this import
 import io.netty.util.concurrent.PromiseNotifier;
 import io.netty.util.concurrent.SucceededFuture;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -55,6 +56,7 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static java.lang.Math.max;
 import static java.lang.Math.min;
@@ -66,8 +68,9 @@
 import static org.apache.cassandra.net.ResourceLimits.Outcome.*;
 import static org.apache.cassandra.net.SocketFactory.*;
 import static org.apache.cassandra.utils.FBUtilities.prettyPrintMemory;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 import static org.apache.cassandra.utils.Throwables.isCausedBy;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
 
 /**
  * Represents a connection type to a peer, and handles the state transistions on the connection and the netty {@link Channel}.
@@ -1031,7 +1034,7 @@
                 }
                 catch (InterruptedException e)
                 {
-                    throw new RuntimeException(e);
+                    throw new UncheckedInterruptedException(e);
                 }
             });
         }
@@ -1097,7 +1100,7 @@
 
                 if (hasPending())
                 {
-                    Promise<Result<MessagingSuccess>> result = new AsyncPromise<>(eventLoop);
+                    Promise<Result<MessagingSuccess>> result = AsyncPromise.withExecutor(eventLoop);
                     state = new Connecting(state.disconnected(), result, eventLoop.schedule(() -> attempt(result), max(100, retryRateMillis), MILLISECONDS));
                     retryRateMillis = min(1000, retryRateMillis * 2);
                 }
@@ -1196,7 +1199,7 @@
                  * is made before the endpointToVersion table is initially constructed or out
                  * of date (e.g. if outbound connections are established for gossip
                  * as a result of an inbound connection) and can result in the wrong outbound
-                 * port being selected if configured with enable_legacy_ssl_storage_port=true.
+                 * port being selected if configured with legacy_ssl_storage_port_enabled=true.
                  */
                 int knownMessagingVersion = messagingVersion();
                 if (knownMessagingVersion != messagingVersion)
@@ -1226,7 +1229,7 @@
 
             Future<Result<MessagingSuccess>> initiate()
             {
-                Promise<Result<MessagingSuccess>> result = new AsyncPromise<>(eventLoop);
+                Promise<Result<MessagingSuccess>> result = AsyncPromise.withExecutor(eventLoop);
                 state = new Connecting(state.disconnected(), result);
                 attempt(result);
                 return result;
@@ -1514,13 +1517,12 @@
 
         Runnable clearQueue = () ->
         {
-            CountDownLatch done = new CountDownLatch(1);
+            CountDownLatch done = newCountDownLatch(1);
             queue.runEventually(withLock -> {
                 withLock.consume(this::onClosed);
-                done.countDown();
+                done.decrement();
             });
-            //noinspection UnstableApiUsage
-            Uninterruptibles.awaitUninterruptibly(done);
+            done.awaitUninterruptibly();
         };
 
         if (flushQueue)
diff --git a/src/java/org/apache/cassandra/net/OutboundConnectionInitiator.java b/src/java/org/apache/cassandra/net/OutboundConnectionInitiator.java
index f1fa6b7..a187068 100644
--- a/src/java/org/apache/cassandra/net/OutboundConnectionInitiator.java
+++ b/src/java/org/apache/cassandra/net/OutboundConnectionInitiator.java
@@ -24,6 +24,10 @@
 import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
+import io.netty.util.concurrent.Promise; //checkstyle: permit this import
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,14 +49,11 @@
 import io.netty.handler.ssl.SslClosedEngineException;
 import io.netty.handler.ssl.SslContext;
 import io.netty.handler.ssl.SslHandler;
-import io.netty.util.concurrent.FailedFuture;
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.Promise;
 import io.netty.util.concurrent.ScheduledFuture;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.HandshakeProtocol.Initiate;
 import org.apache.cassandra.net.OutboundConnectionInitiator.Result.MessagingSuccess;
 import org.apache.cassandra.net.OutboundConnectionInitiator.Result.StreamingSuccess;
+import org.apache.cassandra.security.ISslContextFactory;
 import org.apache.cassandra.security.SSLFactory;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.memory.BufferPools;
@@ -107,7 +108,7 @@
      */
     public static Future<Result<StreamingSuccess>> initiateStreaming(EventLoop eventLoop, OutboundConnectionSettings settings, int requestMessagingVersion)
     {
-        return new OutboundConnectionInitiator<StreamingSuccess>(STREAMING, settings, requestMessagingVersion, new AsyncPromise<>(eventLoop))
+        return new OutboundConnectionInitiator<StreamingSuccess>(STREAMING, settings, requestMessagingVersion, AsyncPromise.withExecutor(eventLoop))
                .initiate(eventLoop);
     }
 
@@ -133,13 +134,13 @@
         {
             // interrupt other connections, so they must attempt to re-authenticate
             MessagingService.instance().interruptOutbound(settings.to);
-            return new FailedFuture<>(eventLoop, new IOException("authentication failed to " + settings.connectToId()));
+            return ImmediateFuture.failure(new IOException("authentication failed to " + settings.connectToId()));
         }
 
         // this is a bit ugly, but is the easiest way to ensure that if we timeout we can propagate a suitable error message
         // and still guarantee that, if on timing out we raced with success, the successfully created channel is handled
         AtomicBoolean timedout = new AtomicBoolean();
-        Future<Void> bootstrap = createBootstrap(eventLoop)
+        io.netty.util.concurrent.Future<Void> bootstrap = createBootstrap(eventLoop)
                                  .connect()
                                  .addListener(future -> {
                                      eventLoop.execute(() -> {
@@ -187,7 +188,7 @@
             bootstrap.option(ChannelOption.SO_SNDBUF, settings.socketSendBufferSizeInBytes);
 
         InetAddressAndPort remoteAddress = settings.connectTo;
-        bootstrap.remoteAddress(new InetSocketAddress(remoteAddress.address, remoteAddress.port));
+        bootstrap.remoteAddress(new InetSocketAddress(remoteAddress.getAddress(), remoteAddress.getPort()));
         return bootstrap;
     }
 
@@ -201,10 +202,11 @@
             if (settings.withEncryption())
             {
                 // check if we should actually encrypt this connection
-                SslContext sslContext = SSLFactory.getOrCreateSslContext(settings.encryption, true, SSLFactory.SocketType.CLIENT);
+                SslContext sslContext = SSLFactory.getOrCreateSslContext(settings.encryption, true,
+                                                                         ISslContextFactory.SocketType.CLIENT);
                 // for some reason channel.remoteAddress() will return null
                 InetAddressAndPort address = settings.to;
-                InetSocketAddress peer = settings.encryption.require_endpoint_verification ? new InetSocketAddress(address.address, address.port) : null;
+                InetSocketAddress peer = settings.encryption.require_endpoint_verification ? new InetSocketAddress(address.getAddress(), address.getPort()) : null;
                 SslHandler sslHandler = newSslHandler(channel, sslContext, peer);
                 logger.trace("creating outbound netty SslContext: context={}, engine={}", sslContext.getClass().getName(), sslHandler.engine().getClass().getName());
                 pipeline.addFirst("ssl", sslHandler);
diff --git a/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java b/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java
index d9038ee..5b246e3 100644
--- a/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java
+++ b/src/java/org/apache/cassandra/net/OutboundConnectionSettings.java
@@ -159,7 +159,7 @@
 
     public boolean authenticate()
     {
-        return authenticator.authenticate(to.address, to.port);
+        return authenticator.authenticate(to.getAddress(), to.getPort());
     }
 
     public boolean withEncryption()
diff --git a/src/java/org/apache/cassandra/net/OutboundConnections.java b/src/java/org/apache/cassandra/net/OutboundConnections.java
index 3f607d1..ad87ec5 100644
--- a/src/java/org/apache/cassandra/net/OutboundConnections.java
+++ b/src/java/org/apache/cassandra/net/OutboundConnections.java
@@ -27,22 +27,30 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.ImmutableList;
 
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.carrotsearch.hppc.ObjectObjectHashMap;
-import io.netty.util.concurrent.Future;
-import org.apache.cassandra.config.Config;
-import org.apache.cassandra.gms.Gossiper;
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.metrics.InternodeOutboundMetrics;
 import org.apache.cassandra.utils.NoSpamLogger;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+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.gms.Gossiper.instance;
+import static org.apache.cassandra.net.FrameEncoderCrc.HEADER_AND_TRAILER_LENGTH;
+import static org.apache.cassandra.net.LegacyLZ4Constants.HEADER_LENGTH;
 import static org.apache.cassandra.net.MessagingService.current_version;
 import static org.apache.cassandra.net.ConnectionType.URGENT_MESSAGES;
 import static org.apache.cassandra.net.ConnectionType.LARGE_MESSAGES;
 import static org.apache.cassandra.net.ConnectionType.SMALL_MESSAGES;
+import static org.apache.cassandra.net.ResourceLimits.*;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
 /**
  * Groups a set of outbound connections to a given peer, and routes outgoing messages to the appropriate connection
@@ -54,12 +62,12 @@
     private static final Logger logger = LoggerFactory.getLogger(OutboundConnections.class);
 
     @VisibleForTesting
-    public static final int LARGE_MESSAGE_THRESHOLD = Integer.getInteger(Config.PROPERTY_PREFIX + "otcp_large_message_threshold", 1024 * 64)
-    - Math.max(Math.max(LegacyLZ4Constants.HEADER_LENGTH, FrameEncoderCrc.HEADER_AND_TRAILER_LENGTH), FrameEncoderLZ4.HEADER_AND_TRAILER_LENGTH);
+    public static final int LARGE_MESSAGE_THRESHOLD = getInteger(PROPERTY_PREFIX + "otcp_large_message_threshold", 1024 * 64)
+    - max(max(HEADER_LENGTH, HEADER_AND_TRAILER_LENGTH), FrameEncoderLZ4.HEADER_AND_TRAILER_LENGTH);
 
-    private final SimpleCondition metricsReady = new SimpleCondition();
+    private final Condition metricsReady = newOneTimeCondition();
     private volatile InternodeOutboundMetrics metrics;
-    private final ResourceLimits.Limit reserveCapacity;
+    private final Limit reserveCapacity;
 
     private OutboundConnectionSettings template;
     public final OutboundConnection small;
@@ -69,8 +77,8 @@
     private OutboundConnections(OutboundConnectionSettings template)
     {
         this.template = template = template.withDefaultReserveLimits();
-        reserveCapacity = new ResourceLimits.Concurrent(template.applicationSendQueueReserveEndpointCapacityInBytes);
-        ResourceLimits.EndpointAndGlobal reserveCapacityInBytes = new ResourceLimits.EndpointAndGlobal(reserveCapacity, template.applicationSendQueueReserveGlobalCapacityInBytes);
+        reserveCapacity = new Concurrent(template.applicationSendQueueReserveEndpointCapacityInBytes);
+        EndpointAndGlobal reserveCapacityInBytes = new EndpointAndGlobal(reserveCapacity, template.applicationSendQueueReserveGlobalCapacityInBytes);
         this.small = new OutboundConnection(SMALL_MESSAGES, template, reserveCapacityInBytes);
         this.large = new OutboundConnection(LARGE_MESSAGES, template, reserveCapacityInBytes);
         this.urgent = new OutboundConnection(URGENT_MESSAGES, template, reserveCapacityInBytes);
@@ -117,7 +125,7 @@
     synchronized Future<Void> reconnectWithNewIp(InetAddressAndPort addr)
     {
         template = template.withConnectTo(addr);
-        return new FutureCombiner(
+        return FutureCombiner.nettySuccessListener(
             apply(c -> c.reconnectWith(template))
         );
     }
@@ -131,7 +139,7 @@
     {
         // immediately release our metrics, so that if we need to re-open immediately we can safely register a new one
         releaseMetrics();
-        return new FutureCombiner(
+        return FutureCombiner.nettySuccessListener(
             apply(c -> c.scheduleClose(time, unit, flushQueues))
         );
     }
@@ -145,7 +153,7 @@
     {
         // immediately release our metrics, so that if we need to re-open immediately we can safely register a new one
         releaseMetrics();
-        return new FutureCombiner(
+        return FutureCombiner.nettySuccessListener(
             apply(c -> c.close(flushQueues))
         );
     }
@@ -158,7 +166,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
 
         if (metrics != null)
@@ -299,7 +307,7 @@
                     continue;
 
                 if (cur.small == prev.small && cur.large == prev.large && cur.urgent == prev.urgent
-                    && !Gossiper.instance.isKnownEndpoint(connections.template.to))
+                    && !instance.isKnownEndpoint(connections.template.to))
                 {
                     logger.info("Closing outbound connections to {}, as inactive and not known by Gossiper",
                                 connections.template.to);
diff --git a/src/java/org/apache/cassandra/net/OutboundMessageQueue.java b/src/java/org/apache/cassandra/net/OutboundMessageQueue.java
index d7360a0..8280055 100644
--- a/src/java/org/apache/cassandra/net/OutboundMessageQueue.java
+++ b/src/java/org/apache/cassandra/net/OutboundMessageQueue.java
@@ -17,10 +17,8 @@
  */
 package org.apache.cassandra.net;
 
-import java.util.Collections;
 import java.util.IdentityHashMap;
 import java.util.Set;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLongFieldUpdater;
 import java.util.concurrent.atomic.AtomicReference;
@@ -28,13 +26,17 @@
 import java.util.function.Consumer;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.Uninterruptibles;
+
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.utils.MonotonicClock;
 
+import static java.lang.Long.MAX_VALUE;
 import static java.lang.Math.min;
+import static java.util.Collections.newSetFromMap;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
 
 /**
  * A composite queue holding messages to be delivered by an {@link OutboundConnection}.
@@ -437,8 +439,8 @@
 
     private class RemoveRunner extends AtomicReference<Remove> implements Runnable
     {
-        final CountDownLatch done = new CountDownLatch(1);
-        final Set<Message<?>> removed = Collections.newSetFromMap(new IdentityHashMap<>());
+        final CountDownLatch done = newCountDownLatch(1);
+        final Set<Message<?>> removed = newSetFromMap(new IdentityHashMap<>());
 
         RemoveRunner() { super(new Remove(null, null)); }
 
@@ -449,7 +451,7 @@
 
         public void run()
         {
-            Set<Message<?>> remove = Collections.newSetFromMap(new IdentityHashMap<>());
+            Set<Message<?>> remove = newSetFromMap(new IdentityHashMap<>());
             removeRunner = null;
             Remove undo = getAndSet(null);
             while (undo.message != null)
@@ -460,7 +462,7 @@
 
             class Remover implements PrunableArrayQueue.Pruner<Message<?>>
             {
-                private long earliestExpiresAt = Long.MAX_VALUE;
+                private long earliestExpiresAt = MAX_VALUE;
 
                 @Override
                 public boolean shouldPrune(Message<?> message)
@@ -488,7 +490,7 @@
             long nowNanos = clock.now();
             maybeUpdateNextExpirationDeadline(nowNanos, maybeUpdateEarliestExpiresAt(nowNanos, remover.earliestExpiresAt));
 
-            done.countDown();
+            done.decrement();
         }
     }
 
@@ -517,8 +519,7 @@
             }
         }
 
-        //noinspection UnstableApiUsage
-        Uninterruptibles.awaitUninterruptibly(runner.done);
+        runner.done.awaitUninterruptibly();
         return runner.removed.contains(remove);
     }
 
diff --git a/src/java/org/apache/cassandra/net/ParamType.java b/src/java/org/apache/cassandra/net/ParamType.java
index 007605b..37f4bf8 100644
--- a/src/java/org/apache/cassandra/net/ParamType.java
+++ b/src/java/org/apache/cassandra/net/ParamType.java
@@ -19,13 +19,14 @@
 
 import java.util.HashMap;
 import java.util.Map;
-
 import javax.annotation.Nullable;
 
 import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.tracing.Tracing;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.Int32Serializer;
+import org.apache.cassandra.utils.Int64Serializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static java.lang.Math.max;
 
@@ -51,12 +52,19 @@
     @Deprecated
     FAILURE_CALLBACK    (4, "CAL_BAC",       LegacyFlag.serializer),
 
-    TRACE_SESSION       (5, "TraceSession",  UUIDSerializer.serializer),
+    TRACE_SESSION       (5, "TraceSession",  TimeUUID.Serializer.instance),
     TRACE_TYPE          (6, "TraceType",     Tracing.traceTypeSerializer),
 
     @Deprecated
     TRACK_REPAIRED_DATA (7, "TrackRepaired", LegacyFlag.serializer),
 
+    TOMBSTONE_FAIL(8, "TSF", Int32Serializer.serializer),
+    TOMBSTONE_WARNING(9, "TSW", Int32Serializer.serializer),
+    LOCAL_READ_SIZE_FAIL(10, "LRSF", Int64Serializer.serializer),
+    LOCAL_READ_SIZE_WARN(11, "LRSW", Int64Serializer.serializer),
+    ROW_INDEX_READ_SIZE_FAIL(12, "RIRSF", Int64Serializer.serializer),
+    ROW_INDEX_READ_SIZE_WARN(13, "RIRSW", Int64Serializer.serializer),
+
     CUSTOM_MAP          (14, "CUSTOM",       CustomParamsSerializer.serializer);
 
     final int id;
diff --git a/src/java/org/apache/cassandra/net/RequestCallback.java b/src/java/org/apache/cassandra/net/RequestCallback.java
index 5bbe011..bd14cae 100644
--- a/src/java/org/apache/cassandra/net/RequestCallback.java
+++ b/src/java/org/apache/cassandra/net/RequestCallback.java
@@ -41,6 +41,12 @@
     }
 
     /**
+     * Returns true if the callback handles failure reporting - in which case the remove host will be asked to
+     * report failures to us in the event of a problem processing the request.
+     *
+     * TODO: this is an error prone method, and we should be handling failures everywhere
+     *       so we should probably just start doing that, and remove this method
+     *
      * @return true if the callback should be invoked on failure
      */
     default boolean invokeOnFailure()
@@ -56,4 +62,5 @@
     {
         return false;
     }
+
 }
diff --git a/src/java/org/apache/cassandra/net/RequestCallbackWithFailure.java b/src/java/org/apache/cassandra/net/RequestCallbackWithFailure.java
new file mode 100644
index 0000000..685797a
--- /dev/null
+++ b/src/java/org/apache/cassandra/net/RequestCallbackWithFailure.java
@@ -0,0 +1,38 @@
+/*
+ * 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.net;
+
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+public interface RequestCallbackWithFailure<T> extends RequestCallback<T>
+{
+    /**
+     * Called when there is an exception on the remote node or timeout happens
+     */
+    void onFailure(InetAddressAndPort from, RequestFailureReason failureReason);
+
+    /**
+     * @return true if the callback should be invoked on failure
+     */
+    default boolean invokeOnFailure()
+    {
+        return true;
+    }
+}
diff --git a/src/java/org/apache/cassandra/net/RequestCallbacks.java b/src/java/org/apache/cassandra/net/RequestCallbacks.java
index c102ee1..663126f 100644
--- a/src/java/org/apache/cassandra/net/RequestCallbacks.java
+++ b/src/java/org/apache/cassandra/net/RequestCallbacks.java
@@ -20,35 +20,32 @@
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.ScheduledExecutorService;
 import java.util.concurrent.TimeoutException;
 
 import javax.annotation.Nullable;
 
 import com.google.common.annotations.VisibleForTesting;
 
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.DebuggableScheduledThreadPoolExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.io.IVersionedAsymmetricSerializer;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.metrics.InternodeOutboundMetrics;
 import org.apache.cassandra.service.AbstractWriteResponseHandler;
-import org.apache.cassandra.service.StorageProxy;
-import org.apache.cassandra.service.paxos.Commit;
-import org.apache.cassandra.utils.FBUtilities;
 
 import static java.lang.String.format;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.concurrent.ExecutorFactory.SimulatorSemantics.DISCARD;
 import static org.apache.cassandra.concurrent.Stage.INTERNAL_RESPONSE;
-import static org.apache.cassandra.utils.MonotonicClock.preciseTime;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.preciseTime;
 
 /**
  * An expiring map of request callbacks.
@@ -64,14 +61,14 @@
     private static final Logger logger = LoggerFactory.getLogger(RequestCallbacks.class);
 
     private final MessagingService messagingService;
-    private final ScheduledExecutorService executor = new DebuggableScheduledThreadPoolExecutor("Callback-Map-Reaper");
+    private final ScheduledExecutorPlus executor = executorFactory().scheduled("Callback-Map-Reaper", DISCARD);
     private final ConcurrentMap<CallbackKey, CallbackInfo> callbacks = new ConcurrentHashMap<>();
 
     RequestCallbacks(MessagingService messagingService)
     {
         this.messagingService = messagingService;
 
-        long expirationInterval = DatabaseDescriptor.getMinRpcTimeout(NANOSECONDS) / 2;
+        long expirationInterval = defaultExpirationInterval();
         executor.scheduleWithFixedDelay(this::expire, expirationInterval, expirationInterval, NANOSECONDS);
     }
 
@@ -88,7 +85,8 @@
      * Remove and return the {@link CallbackInfo} associated with given id and peer, if known.
      */
     @Nullable
-    CallbackInfo remove(long id, InetAddressAndPort peer)
+    @VisibleForTesting
+    public CallbackInfo remove(long id, InetAddressAndPort peer)
     {
         return callbacks.remove(key(id, peer));
     }
@@ -96,23 +94,18 @@
     /**
      * Register the provided {@link RequestCallback}, inferring expiry and id from the provided {@link Message}.
      */
-    void addWithExpiration(RequestCallback cb, Message message, InetAddressAndPort to)
+    public void addWithExpiration(RequestCallback<?> cb, Message<?> message, InetAddressAndPort to)
     {
-        // mutations need to call the overload with a ConsistencyLevel
-        assert message.verb() != Verb.MUTATION_REQ && message.verb() != Verb.COUNTER_MUTATION_REQ && message.verb() != Verb.PAXOS_COMMIT_REQ;
+        // mutations need to call the overload
+        assert message.verb() != Verb.MUTATION_REQ && message.verb() != Verb.COUNTER_MUTATION_REQ;
         CallbackInfo previous = callbacks.put(key(message.id(), to), new CallbackInfo(message, to, cb));
         assert previous == null : format("Callback already exists for id %d/%s! (%s)", message.id(), to, previous);
     }
 
-    // FIXME: shouldn't need a special overload for writes; hinting should be part of AbstractWriteResponseHandler
-    public void addWithExpiration(AbstractWriteResponseHandler<?> cb,
-                                  Message<?> message,
-                                  Replica to,
-                                  ConsistencyLevel consistencyLevel,
-                                  boolean allowHints)
+    public void addWithExpiration(AbstractWriteResponseHandler<?> cb, Message<?> message, Replica to)
     {
         assert message.verb() == Verb.MUTATION_REQ || message.verb() == Verb.COUNTER_MUTATION_REQ || message.verb() == Verb.PAXOS_COMMIT_REQ;
-        CallbackInfo previous = callbacks.put(key(message.id(), to.endpoint()), new WriteCallbackInfo(message, to, cb, consistencyLevel, allowHints));
+        CallbackInfo previous = callbacks.put(key(message.id(), to.endpoint()), new CallbackInfo(message, to.endpoint(), cb));
         assert previous == null : format("Callback already exists for id %d/%s! (%s)", message.id(), to.endpoint(), previous);
     }
 
@@ -169,14 +162,6 @@
 
         if (info.invokeOnFailure())
             INTERNAL_RESPONSE.submit(() -> info.callback.onFailure(info.peer, RequestFailureReason.TIMEOUT));
-
-        // FIXME: this has never belonged here, should be part of onFailure() in AbstractWriteResponseHandler
-        if (info.shouldHint())
-        {
-            WriteCallbackInfo writeCallbackInfo = ((WriteCallbackInfo) info);
-            Mutation mutation = writeCallbackInfo.mutation();
-            StorageProxy.submitHint(mutation, writeCallbackInfo.getReplica(), null);
-        }
     }
 
     void shutdownNow(boolean expireCallbacks)
@@ -199,7 +184,7 @@
     {
         if (!executor.isTerminated())
         {
-            long wait = deadlineNanos - System.nanoTime();
+            long wait = deadlineNanos - nanoTime();
             if (wait <= 0 || !executor.awaitTermination(wait, NANOSECONDS))
                 throw new TimeoutException();
         }
@@ -249,13 +234,14 @@
         }
     }
 
-    static class CallbackInfo
+    @VisibleForTesting
+    public static class CallbackInfo
     {
         final long createdAtNanos;
         final long expiresAtNanos;
 
         final InetAddressAndPort peer;
-        final RequestCallback callback;
+        public final RequestCallback callback;
 
         @Deprecated // for 3.0 compatibility purposes only
         public final Verb responseVerb;
@@ -279,11 +265,6 @@
             return atNano > expiresAtNanos;
         }
 
-        boolean shouldHint()
-        {
-            return false;
-        }
-
         boolean invokeOnFailure()
         {
             return callback.invokeOnFailure();
@@ -295,53 +276,6 @@
         }
     }
 
-    // FIXME: shouldn't need a specialized container for write callbacks; hinting should be part of
-    //        AbstractWriteResponseHandler implementation.
-    static class WriteCallbackInfo extends CallbackInfo
-    {
-        // either a Mutation, or a Paxos Commit (MessageOut)
-        private final Object mutation;
-        private final Replica replica;
-
-        @VisibleForTesting
-        WriteCallbackInfo(Message message, Replica replica, RequestCallback<?> callback, ConsistencyLevel consistencyLevel, boolean allowHints)
-        {
-            super(message, replica.endpoint(), callback);
-            this.mutation = shouldHint(allowHints, message, consistencyLevel) ? message.payload : null;
-            //Local writes shouldn't go through messaging service (https://issues.apache.org/jira/browse/CASSANDRA-10477)
-            //noinspection AssertWithSideEffects
-            assert !peer.equals(FBUtilities.getBroadcastAddressAndPort());
-            this.replica = replica;
-        }
-
-        public boolean shouldHint()
-        {
-            return mutation != null && StorageProxy.shouldHint(replica);
-        }
-
-        public Replica getReplica()
-        {
-            return replica;
-        }
-
-        public Mutation mutation()
-        {
-            return getMutation(mutation);
-        }
-
-        private static Mutation getMutation(Object object)
-        {
-            assert object instanceof Commit || object instanceof Mutation : object;
-            return object instanceof Commit ? ((Commit) object).makeMutation()
-                                            : (Mutation) object;
-        }
-
-        private static boolean shouldHint(boolean allowHints, Message sentMessage, ConsistencyLevel consistencyLevel)
-        {
-            return allowHints && sentMessage.verb() != Verb.COUNTER_MUTATION_REQ && consistencyLevel != ConsistencyLevel.ANY;
-        }
-    }
-
     @Override
     public void onOverloaded(Message<?> message, InetAddressAndPort peer)
     {
@@ -375,4 +309,9 @@
         if (null != forwardTo)
             forwardTo.forEach(this::removeAndExpire);
     }
+
+    public static long defaultExpirationInterval()
+    {
+        return DatabaseDescriptor.getMinRpcTimeout(NANOSECONDS) / 2;
+    }
 }
diff --git a/src/java/org/apache/cassandra/net/ResourceLimits.java b/src/java/org/apache/cassandra/net/ResourceLimits.java
index 8899040..cfddfc3 100644
--- a/src/java/org/apache/cassandra/net/ResourceLimits.java
+++ b/src/java/org/apache/cassandra/net/ResourceLimits.java
@@ -41,7 +41,7 @@
          * Sets the total amount of permits represented by this {@link Limit} - the capacity
          *
          * If the old limit has been reached and the new limit is large enough to allow for more
-         * permits to be aqcuired, subsequent calls to {@link #allocate(long)} or {@link #tryAllocate(long)}
+         * permits to be acquired, subsequent calls to {@link #allocate(long)} or {@link #tryAllocate(long)}
          * will succeed.
          *
          * If the new limit is lower than the current amount of allocated permits then subsequent calls
@@ -163,7 +163,7 @@
                 // possible it would require synchronizing the closing of all outbound connections
                 // and reinitializing the Concurrent limit before reopening.  For such an unlikely path
                 // (previously this was an assert), it is safer to terminate the JVM and have something external
-                // restart and get back to a known good state rather than intermittendly crashing on any of
+                // restart and get back to a known good state rather than intermittently crashing on any of
                 // the connections sharing this limit.
                 throw new UnrecoverableIllegalStateException(
                     "Internode messaging byte limits that are shared between connections is invalid (using="+using+")");
diff --git a/src/java/org/apache/cassandra/net/ResponseVerbHandler.java b/src/java/org/apache/cassandra/net/ResponseVerbHandler.java
index 369e5f4..1cee468 100644
--- a/src/java/org/apache/cassandra/net/ResponseVerbHandler.java
+++ b/src/java/org/apache/cassandra/net/ResponseVerbHandler.java
@@ -24,7 +24,7 @@
 import org.apache.cassandra.tracing.Tracing;
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 class ResponseVerbHandler implements IVerbHandler
 {
diff --git a/src/java/org/apache/cassandra/net/SocketFactory.java b/src/java/org/apache/cassandra/net/SocketFactory.java
index 9d2f6ad..33fff6b 100644
--- a/src/java/org/apache/cassandra/net/SocketFactory.java
+++ b/src/java/org/apache/cassandra/net/SocketFactory.java
@@ -24,7 +24,6 @@
 import java.nio.channels.spi.SelectorProvider;
 import java.util.List;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeoutException;
 import javax.annotation.Nullable;
@@ -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.utils.Throwables.isCausedBy;
 
 /**
@@ -178,7 +178,7 @@
     private final EventLoopGroup defaultGroup;
     // we need a separate EventLoopGroup for outbound streaming because sendFile is blocking
     private final EventLoopGroup outboundStreamingGroup;
-    final ExecutorService synchronousWorkExecutor = Executors.newCachedThreadPool(new NamedThreadFactory("Messaging-SynchronousWork"));
+    final ExecutorService synchronousWorkExecutor = executorFactory().pooled("Messaging-SynchronousWork", Integer.MAX_VALUE);
 
     SocketFactory()
     {
@@ -319,7 +319,7 @@
     static String addressId(InetAddressAndPort address, InetSocketAddress realAddress)
     {
         String str = address.toString();
-        if (!address.address.equals(realAddress.getAddress()) || address.port != realAddress.getPort())
+        if (!address.getAddress().equals(realAddress.getAddress()) || address.getPort() != realAddress.getPort())
             str += '(' + InetAddressAndPort.toString(realAddress.getAddress(), realAddress.getPort()) + ')';
         return str;
     }
diff --git a/src/java/org/apache/cassandra/net/StartupClusterConnectivityChecker.java b/src/java/org/apache/cassandra/net/StartupClusterConnectivityChecker.java
index 8bc1e5d..0197a6b 100644
--- a/src/java/org/apache/cassandra/net/StartupClusterConnectivityChecker.java
+++ b/src/java/org/apache/cassandra/net/StartupClusterConnectivityChecker.java
@@ -17,36 +17,40 @@
  */
 package org.apache.cassandra.net;
 
+import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
-import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.SetMultimap;
-import com.google.common.util.concurrent.Uninterruptibles;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.gms.ApplicationState;
 import org.apache.cassandra.gms.EndpointState;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.gms.IEndpointStateChangeSubscriber;
-import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static java.util.stream.Collectors.groupingBy;
+import static java.util.stream.Collectors.mapping;
+import static java.util.stream.Collectors.toList;
 import static org.apache.cassandra.net.Verb.PING_REQ;
 import static org.apache.cassandra.net.ConnectionType.LARGE_MESSAGES;
 import static org.apache.cassandra.net.ConnectionType.SMALL_MESSAGES;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
 
 public class StartupClusterConnectivityChecker
 {
@@ -117,15 +121,17 @@
                         TimeUnit.NANOSECONDS.toSeconds(timeoutNanos));
         }
 
-        AckMap acks = new AckMap(3);
+        // The threshold is 3 because for each peer we want to have 3 acks,
+        // one for small message connection, one for large message connnection and one for alive event from gossip.
+        AckMap acks = new AckMap(3, peers);
         Map<String, CountDownLatch> dcToRemainingPeers = new HashMap<>(datacenterToPeers.size());
         for (String datacenter: datacenterToPeers.keys())
         {
             dcToRemainingPeers.put(datacenter,
-                                   new CountDownLatch(Math.max(datacenterToPeers.get(datacenter).size() - 1, 0)));
+                                   newCountDownLatch(Math.max(datacenterToPeers.get(datacenter).size() - 1, 0)));
         }
 
-        long startNanos = System.nanoTime();
+        long startNanos = nanoTime();
 
         // set up a listener to react to new nodes becoming alive (in gossip), and account for all the nodes that are already alive
         Set<InetAddressAndPort> alivePeers = Collections.newSetFromMap(new ConcurrentHashMap<>());
@@ -143,33 +149,40 @@
                 String datacenter = peerToDatacenter.get(peer);
                 // We have to check because we might only have the local DC in the map
                 if (dcToRemainingPeers.containsKey(datacenter))
-                    dcToRemainingPeers.get(datacenter).countDown();
+                    dcToRemainingPeers.get(datacenter).decrement();
             }
         }
 
         boolean succeeded = true;
         for (CountDownLatch countDownLatch : dcToRemainingPeers.values())
         {
-            long remainingNanos = Math.max(1, timeoutNanos - (System.nanoTime() - startNanos));
+            long remainingNanos = Math.max(1, timeoutNanos - (nanoTime() - startNanos));
             //noinspection UnstableApiUsage
-            succeeded &= Uninterruptibles.awaitUninterruptibly(countDownLatch, remainingNanos, TimeUnit.NANOSECONDS);
+            succeeded &= countDownLatch.awaitUninterruptibly(remainingNanos, TimeUnit.NANOSECONDS);
         }
 
         Gossiper.instance.unregister(listener);
 
-        Map<String, Long> numDown = dcToRemainingPeers.entrySet().stream()
-                                                      .collect(Collectors.toMap(Map.Entry::getKey,
-                                                                                e -> e.getValue().getCount()));
-
         if (succeeded)
         {
             logger.info("Ensured sufficient healthy connections with {} after {} milliseconds",
-                        numDown.keySet(), TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos));
+                        dcToRemainingPeers.keySet(), TimeUnit.NANOSECONDS.toMillis(nanoTime() - startNanos));
         }
         else
         {
+            // dc -> missing peer host addresses
+            Map<String, List<String>> peersDown = acks.getMissingPeers().stream()
+                                                      .collect(groupingBy(peer -> {
+                                                                              String dc = peerToDatacenter.get(peer);
+                                                                              if (dc != null)
+                                                                                  return dc;
+                                                                              return StringUtils.defaultString(getDatacenterSource.apply(peer), "unknown");
+                                                                          },
+                                                                          mapping(InetAddressAndPort::getHostAddressAndPort,
+                                                                                  toList())));
             logger.warn("Timed out after {} milliseconds, was waiting for remaining peers to connect: {}",
-                        TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos), numDown);
+                        TimeUnit.NANOSECONDS.toMillis(nanoTime() - startNanos),
+                        peersDown);
         }
 
         return succeeded;
@@ -188,7 +201,7 @@
                 String datacenter = getDatacenter.apply(msg.from());
                 // We have to check because we might only have the local DC in the map
                 if (dcToRemainingPeers.containsKey(datacenter))
-                    dcToRemainingPeers.get(datacenter).countDown();
+                    dcToRemainingPeers.get(datacenter).decrement();
             }
         };
 
@@ -227,7 +240,7 @@
             {
                 String datacenter = getDatacenter.apply(endpoint);
                 if (dcToRemainingPeers.containsKey(datacenter))
-                    dcToRemainingPeers.get(datacenter).countDown();
+                    dcToRemainingPeers.get(datacenter).decrement();
             }
         }
     }
@@ -237,15 +250,37 @@
         private final int threshold;
         private final Map<InetAddressAndPort, AtomicInteger> acks;
 
-        AckMap(int threshold)
+        AckMap(int threshold, Iterable<InetAddressAndPort> initialPeers)
         {
             this.threshold = threshold;
             acks = new ConcurrentHashMap<>();
+            for (InetAddressAndPort peer : initialPeers)
+                initOrGetCounter(peer);
         }
 
         boolean incrementAndCheck(InetAddressAndPort address)
         {
-            return acks.computeIfAbsent(address, addr -> new AtomicInteger(0)).incrementAndGet() == threshold;
+            return initOrGetCounter(address).incrementAndGet() == threshold;
+        }
+
+        /**
+         * Get a list of peers that has not fully ack'd, i.e. not reaching threshold acks
+         */
+        List<InetAddressAndPort> getMissingPeers()
+        {
+            List<InetAddressAndPort> missingPeers = new ArrayList<>();
+            for (Map.Entry<InetAddressAndPort, AtomicInteger> entry : acks.entrySet())
+            {
+                if (entry.getValue().get() < threshold)
+                    missingPeers.add(entry.getKey());
+            }
+            return missingPeers;
+        }
+
+        // init the counter for the peer just in case
+        private AtomicInteger initOrGetCounter(InetAddressAndPort address)
+        {
+            return acks.computeIfAbsent(address, addr -> new AtomicInteger(0));
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/net/Verb.java b/src/java/org/apache/cassandra/net/Verb.java
index 9d8b76d..d50a187 100644
--- a/src/java/org/apache/cassandra/net/Verb.java
+++ b/src/java/org/apache/cassandra/net/Verb.java
@@ -71,28 +71,39 @@
 import org.apache.cassandra.repair.messages.SyncRequest;
 import org.apache.cassandra.repair.messages.ValidationResponse;
 import org.apache.cassandra.repair.messages.ValidationRequest;
+import org.apache.cassandra.schema.SchemaMutationsSerializer;
 import org.apache.cassandra.schema.SchemaPullVerbHandler;
 import org.apache.cassandra.schema.SchemaPushVerbHandler;
 import org.apache.cassandra.schema.SchemaVersionVerbHandler;
+import org.apache.cassandra.service.paxos.PaxosCommit;
+import org.apache.cassandra.service.paxos.PaxosCommitAndPrepare;
+import org.apache.cassandra.service.paxos.PaxosPrepare;
+import org.apache.cassandra.service.paxos.PaxosPrepareRefresh;
+import org.apache.cassandra.service.paxos.PaxosPropose;
+import org.apache.cassandra.service.paxos.PaxosRepair;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupHistory;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupRequest;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupResponse;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupComplete;
+import org.apache.cassandra.service.paxos.cleanup.PaxosStartPrepareCleanup;
+import org.apache.cassandra.service.paxos.cleanup.PaxosFinishPrepareCleanup;
 import org.apache.cassandra.utils.BooleanSerializer;
 import org.apache.cassandra.service.EchoVerbHandler;
 import org.apache.cassandra.service.SnapshotVerbHandler;
 import org.apache.cassandra.service.paxos.Commit;
-import org.apache.cassandra.service.paxos.CommitVerbHandler;
+import org.apache.cassandra.service.paxos.Commit.Agreed;
 import org.apache.cassandra.service.paxos.PrepareResponse;
-import org.apache.cassandra.service.paxos.PrepareVerbHandler;
-import org.apache.cassandra.service.paxos.ProposeVerbHandler;
+import org.apache.cassandra.service.paxos.v1.PrepareVerbHandler;
+import org.apache.cassandra.service.paxos.v1.ProposeVerbHandler;
 import org.apache.cassandra.streaming.ReplicationDoneVerbHandler;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.UUIDSerializer;
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.cassandra.concurrent.Stage.*;
-import static org.apache.cassandra.concurrent.Stage.INTERNAL_RESPONSE;
-import static org.apache.cassandra.concurrent.Stage.MISC;
 import static org.apache.cassandra.net.VerbTimeouts.*;
 import static org.apache.cassandra.net.Verb.Kind.*;
 import static org.apache.cassandra.net.Verb.Priority.*;
-import static org.apache.cassandra.schema.MigrationManager.MigrationsSerializer;
 
 /**
  * Note that priorities except P0 are presently unused.  P0 corresponds to urgent, i.e. what used to be the "Gossip" connection.
@@ -108,14 +119,14 @@
     BATCH_STORE_RSP        (65,  P1, writeTimeout,    REQUEST_RESPONSE,  () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
     BATCH_STORE_REQ        (5,   P3, writeTimeout,    MUTATION,          () -> Batch.serializer,                     () -> BatchStoreVerbHandler.instance,      BATCH_STORE_RSP     ),
     BATCH_REMOVE_RSP       (66,  P1, writeTimeout,    REQUEST_RESPONSE,  () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
-    BATCH_REMOVE_REQ       (6,   P3, writeTimeout,    MUTATION,          () -> UUIDSerializer.serializer,            () -> BatchRemoveVerbHandler.instance,     BATCH_REMOVE_RSP    ),
+    BATCH_REMOVE_REQ       (6,   P3, writeTimeout,    MUTATION,          () -> TimeUUID.Serializer.instance,         () -> BatchRemoveVerbHandler.instance,     BATCH_REMOVE_RSP    ),
 
     PAXOS_PREPARE_RSP      (93,  P2, writeTimeout,    REQUEST_RESPONSE,  () -> PrepareResponse.serializer,           () -> ResponseVerbHandler.instance                             ),
     PAXOS_PREPARE_REQ      (33,  P2, writeTimeout,    MUTATION,          () -> Commit.serializer,                    () -> PrepareVerbHandler.instance,         PAXOS_PREPARE_RSP   ),
     PAXOS_PROPOSE_RSP      (94,  P2, writeTimeout,    REQUEST_RESPONSE,  () -> BooleanSerializer.serializer,         () -> ResponseVerbHandler.instance                             ),
     PAXOS_PROPOSE_REQ      (34,  P2, writeTimeout,    MUTATION,          () -> Commit.serializer,                    () -> ProposeVerbHandler.instance,         PAXOS_PROPOSE_RSP   ),
     PAXOS_COMMIT_RSP       (95,  P2, writeTimeout,    REQUEST_RESPONSE,  () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
-    PAXOS_COMMIT_REQ       (35,  P2, writeTimeout,    MUTATION,          () -> Commit.serializer,                    () -> CommitVerbHandler.instance,          PAXOS_COMMIT_RSP    ),
+    PAXOS_COMMIT_REQ       (35,  P2, writeTimeout,    MUTATION,          () -> Agreed.serializer,                    () -> PaxosCommit.requestHandler,          PAXOS_COMMIT_RSP    ),
 
     TRUNCATE_RSP           (79,  P0, truncateTimeout, REQUEST_RESPONSE,  () -> TruncateResponse.serializer,          () -> ResponseVerbHandler.instance                             ),
     TRUNCATE_REQ           (19,  P0, truncateTimeout, MUTATION,          () -> TruncateRequest.serializer,           () -> TruncateVerbHandler.instance,        TRUNCATE_RSP        ),
@@ -140,41 +151,63 @@
 
     // P1 because messages can be arbitrarily large or aren't crucial
     SCHEMA_PUSH_RSP        (98,  P1, rpcTimeout,      MIGRATION,         () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
-    SCHEMA_PUSH_REQ        (18,  P1, rpcTimeout,      MIGRATION,         () -> MigrationsSerializer.instance,        () -> SchemaPushVerbHandler.instance,      SCHEMA_PUSH_RSP     ),
-    SCHEMA_PULL_RSP        (88,  P1, rpcTimeout,      MIGRATION,         () -> MigrationsSerializer.instance,        () -> ResponseVerbHandler.instance                             ),
+    SCHEMA_PUSH_REQ        (18,  P1, rpcTimeout,      MIGRATION,         () -> SchemaMutationsSerializer.instance,   () -> SchemaPushVerbHandler.instance,      SCHEMA_PUSH_RSP     ),
+    SCHEMA_PULL_RSP        (88,  P1, rpcTimeout,      MIGRATION,         () -> SchemaMutationsSerializer.instance,   () -> ResponseVerbHandler.instance                             ),
     SCHEMA_PULL_REQ        (28,  P1, rpcTimeout,      MIGRATION,         () -> NoPayload.serializer,                 () -> SchemaPullVerbHandler.instance,      SCHEMA_PULL_RSP     ),
     SCHEMA_VERSION_RSP     (80,  P1, rpcTimeout,      MIGRATION,         () -> UUIDSerializer.serializer,            () -> ResponseVerbHandler.instance                             ),
     SCHEMA_VERSION_REQ     (20,  P1, rpcTimeout,      MIGRATION,         () -> NoPayload.serializer,                 () -> SchemaVersionVerbHandler.instance,   SCHEMA_VERSION_RSP  ),
 
     // repair; mostly doesn't use callbacks and sends responses as their own request messages, with matching sessions by uuid; should eventually harmonize and make idiomatic
-    REPAIR_RSP             (100, P1, repairMsgTimeout,REQUEST_RESPONSE,  () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
-    VALIDATION_RSP         (102, P1, longTimeout     ,ANTI_ENTROPY,      () -> ValidationResponse.serializer,        () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    VALIDATION_REQ         (101, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> ValidationRequest.serializer,         () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    SYNC_RSP               (104, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> SyncResponse.serializer,              () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    SYNC_REQ               (103, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> SyncRequest.serializer,               () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    PREPARE_MSG            (105, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> PrepareMessage.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    SNAPSHOT_MSG           (106, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> SnapshotMessage.serializer,           () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    CLEANUP_MSG            (107, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> CleanupMessage.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    PREPARE_CONSISTENT_RSP (109, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> PrepareConsistentResponse.serializer, () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    PREPARE_CONSISTENT_REQ (108, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> PrepareConsistentRequest.serializer,  () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    FINALIZE_PROPOSE_MSG   (110, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> FinalizePropose.serializer,           () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    FINALIZE_PROMISE_MSG   (111, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> FinalizePromise.serializer,           () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    FINALIZE_COMMIT_MSG    (112, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> FinalizeCommit.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    FAILED_SESSION_MSG     (113, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> FailSession.serializer,               () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    STATUS_RSP             (115, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> StatusResponse.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
-    STATUS_REQ             (114, P1, repairMsgTimeout,ANTI_ENTROPY,      () -> StatusRequest.serializer,             () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    REPAIR_RSP             (100, P1, repairTimeout,   REQUEST_RESPONSE,  () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
+    VALIDATION_RSP         (102, P1, longTimeout,     ANTI_ENTROPY,      () -> ValidationResponse.serializer,        () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    VALIDATION_REQ         (101, P1, repairTimeout,   ANTI_ENTROPY,      () -> ValidationRequest.serializer,         () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    SYNC_RSP               (104, P1, repairTimeout,   ANTI_ENTROPY,      () -> SyncResponse.serializer,              () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    SYNC_REQ               (103, P1, repairTimeout,   ANTI_ENTROPY,      () -> SyncRequest.serializer,               () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    PREPARE_MSG            (105, P1, repairTimeout,   ANTI_ENTROPY,      () -> PrepareMessage.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    SNAPSHOT_MSG           (106, P1, repairTimeout,   ANTI_ENTROPY,      () -> SnapshotMessage.serializer,           () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    CLEANUP_MSG            (107, P1, repairTimeout,   ANTI_ENTROPY,      () -> CleanupMessage.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    PREPARE_CONSISTENT_RSP (109, P1, repairTimeout,   ANTI_ENTROPY,      () -> PrepareConsistentResponse.serializer, () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    PREPARE_CONSISTENT_REQ (108, P1, repairTimeout,   ANTI_ENTROPY,      () -> PrepareConsistentRequest.serializer,  () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    FINALIZE_PROPOSE_MSG   (110, P1, repairTimeout,   ANTI_ENTROPY,      () -> FinalizePropose.serializer,           () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    FINALIZE_PROMISE_MSG   (111, P1, repairTimeout,   ANTI_ENTROPY,      () -> FinalizePromise.serializer,           () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    FINALIZE_COMMIT_MSG    (112, P1, repairTimeout,   ANTI_ENTROPY,      () -> FinalizeCommit.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    FAILED_SESSION_MSG     (113, P1, repairTimeout,   ANTI_ENTROPY,      () -> FailSession.serializer,               () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    STATUS_RSP             (115, P1, repairTimeout,   ANTI_ENTROPY,      () -> StatusResponse.serializer,            () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
+    STATUS_REQ             (114, P1, repairTimeout,   ANTI_ENTROPY,      () -> StatusRequest.serializer,             () -> RepairMessageVerbHandler.instance,   REPAIR_RSP          ),
 
     REPLICATION_DONE_RSP   (82,  P0, rpcTimeout,      MISC,              () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
     REPLICATION_DONE_REQ   (22,  P0, rpcTimeout,      MISC,              () -> NoPayload.serializer,                 () -> ReplicationDoneVerbHandler.instance, REPLICATION_DONE_RSP),
     SNAPSHOT_RSP           (87,  P0, rpcTimeout,      MISC,              () -> NoPayload.serializer,                 () -> ResponseVerbHandler.instance                             ),
     SNAPSHOT_REQ           (27,  P0, rpcTimeout,      MISC,              () -> SnapshotCommand.serializer,           () -> SnapshotVerbHandler.instance,        SNAPSHOT_RSP        ),
 
+    PAXOS2_COMMIT_REMOTE_REQ         (38, P2, writeTimeout,  MUTATION,          () -> Mutation.serializer,                     () -> MutationVerbHandler.instance,                          MUTATION_RSP                     ),
+    PAXOS2_COMMIT_REMOTE_RSP         (39, P2, writeTimeout,  REQUEST_RESPONSE,  () -> NoPayload.serializer,                    () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_PREPARE_RSP               (50, P2, writeTimeout,  REQUEST_RESPONSE,  () -> PaxosPrepare.responseSerializer,         () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_PREPARE_REQ               (40, P2, writeTimeout,  MUTATION,          () -> PaxosPrepare.requestSerializer,          () -> PaxosPrepare.requestHandler,                           PAXOS2_PREPARE_RSP               ),
+    PAXOS2_PREPARE_REFRESH_RSP       (51, P2, writeTimeout,  REQUEST_RESPONSE,  () -> PaxosPrepareRefresh.responseSerializer,  () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_PREPARE_REFRESH_REQ       (41, P2, writeTimeout,  MUTATION,          () -> PaxosPrepareRefresh.requestSerializer,   () -> PaxosPrepareRefresh.requestHandler,                    PAXOS2_PREPARE_REFRESH_RSP       ),
+    PAXOS2_PROPOSE_RSP               (52, P2, writeTimeout,  REQUEST_RESPONSE,  () -> PaxosPropose.responseSerializer,         () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_PROPOSE_REQ               (42, P2, writeTimeout,  MUTATION,          () -> PaxosPropose.requestSerializer,          () -> PaxosPropose.requestHandler,                           PAXOS2_PROPOSE_RSP               ),
+    PAXOS2_COMMIT_AND_PREPARE_RSP    (53, P2, writeTimeout,  REQUEST_RESPONSE,  () -> PaxosPrepare.responseSerializer,         () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_COMMIT_AND_PREPARE_REQ    (43, P2, writeTimeout,  MUTATION,          () -> PaxosCommitAndPrepare.requestSerializer, () -> PaxosCommitAndPrepare.requestHandler,                  PAXOS2_COMMIT_AND_PREPARE_RSP    ),
+    PAXOS2_REPAIR_RSP                (54, P2, writeTimeout,  PAXOS_REPAIR,      () -> PaxosRepair.responseSerializer,          () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_REPAIR_REQ                (44, P2, writeTimeout,  PAXOS_REPAIR,      () -> PaxosRepair.requestSerializer,           () -> PaxosRepair.requestHandler,                            PAXOS2_REPAIR_RSP                ),
+    PAXOS2_CLEANUP_START_PREPARE_RSP (55, P2, repairTimeout, PAXOS_REPAIR,      () -> PaxosCleanupHistory.serializer,          () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_CLEANUP_START_PREPARE_REQ (45, P2, repairTimeout, PAXOS_REPAIR,      () -> PaxosStartPrepareCleanup.serializer,     () -> PaxosStartPrepareCleanup.verbHandler,                  PAXOS2_CLEANUP_START_PREPARE_RSP ),
+    PAXOS2_CLEANUP_RSP               (56, P2, repairTimeout, PAXOS_REPAIR,      () -> NoPayload.serializer,                    () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_CLEANUP_REQ               (46, P2, repairTimeout, PAXOS_REPAIR,      () -> PaxosCleanupRequest.serializer,          () -> PaxosCleanupRequest.verbHandler,                       PAXOS2_CLEANUP_RSP               ),
+    PAXOS2_CLEANUP_RSP2              (57, P2, repairTimeout, PAXOS_REPAIR,      () -> PaxosCleanupResponse.serializer,         () -> PaxosCleanupResponse.verbHandler                                                        ),
+    PAXOS2_CLEANUP_FINISH_PREPARE_RSP(58, P2, repairTimeout, PAXOS_REPAIR,      () -> NoPayload.serializer,                    () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_CLEANUP_FINISH_PREPARE_REQ(47, P2, repairTimeout, IMMEDIATE,         () -> PaxosCleanupHistory.serializer,          () -> PaxosFinishPrepareCleanup.verbHandler,                 PAXOS2_CLEANUP_FINISH_PREPARE_RSP),
+    PAXOS2_CLEANUP_COMPLETE_RSP      (59, P2, repairTimeout, PAXOS_REPAIR,      () -> NoPayload.serializer,                    () -> ResponseVerbHandler.instance                                                            ),
+    PAXOS2_CLEANUP_COMPLETE_REQ      (48, P2, repairTimeout, PAXOS_REPAIR,      () -> PaxosCleanupComplete.serializer,         () -> PaxosCleanupComplete.verbHandler,                      PAXOS2_CLEANUP_COMPLETE_RSP      ),
+
     // generic failure response
     FAILURE_RSP            (99,  P0, noTimeout,       REQUEST_RESPONSE,  () -> RequestFailureReason.serializer,      () -> ResponseVerbHandler.instance                             ),
 
     // dummy verbs
     _TRACE                 (30,  P1, rpcTimeout,      TRACING,           () -> NoPayload.serializer,                 () -> null                                                     ),
-    _SAMPLE                (42,  P1, rpcTimeout,      INTERNAL_RESPONSE, () -> NoPayload.serializer,                 () -> null                                                     ),
+    _SAMPLE                (49,  P1, rpcTimeout,      INTERNAL_RESPONSE, () -> NoPayload.serializer,                 () -> null                                                     ),
     _TEST_1                (10,  P0, writeTimeout,    IMMEDIATE,         () -> NoPayload.serializer,                 () -> null                                                     ),
     _TEST_2                (11,  P1, rpcTimeout,      IMMEDIATE,         () -> NoPayload.serializer,                 () -> null                                                     ),
 
@@ -188,7 +221,6 @@
     // CUSTOM VERBS
     UNUSED_CUSTOM_VERB     (CUSTOM,
                             0,   P1, rpcTimeout,      INTERNAL_RESPONSE, () -> null,                                 () -> null                                                     ),
-
     ;
 
     public static final List<Verb> VERBS = ImmutableList.copyOf(Verb.values());
@@ -227,7 +259,7 @@
     private final Supplier<? extends IVersionedAsymmetricSerializer<?, ?>> serializer;
     private final Supplier<? extends IVerbHandler<?>> handler;
 
-    final Verb responseVerb;
+    public final Verb responseVerb;
 
     private final ToLongFunction<TimeUnit> expiration;
 
@@ -447,8 +479,8 @@
     static final ToLongFunction<TimeUnit> rangeTimeout    = DatabaseDescriptor::getRangeRpcTimeout;
     static final ToLongFunction<TimeUnit> counterTimeout  = DatabaseDescriptor::getCounterWriteRpcTimeout;
     static final ToLongFunction<TimeUnit> truncateTimeout = DatabaseDescriptor::getTruncateRpcTimeout;
+    static final ToLongFunction<TimeUnit> repairTimeout   = DatabaseDescriptor::getRepairRpcTimeout;
     static final ToLongFunction<TimeUnit> pingTimeout     = DatabaseDescriptor::getPingTimeout;
     static final ToLongFunction<TimeUnit> longTimeout     = units -> Math.max(DatabaseDescriptor.getRpcTimeout(units), units.convert(5L, TimeUnit.MINUTES));
-    static final ToLongFunction<TimeUnit> noTimeout       = units -> { throw new IllegalStateException(); };
-    static final ToLongFunction<TimeUnit> repairMsgTimeout= DatabaseDescriptor::getRepairRpcTimeout;
-}
\ No newline at end of file
+    static final ToLongFunction<TimeUnit> noTimeout       = units -> {  throw new IllegalStateException(); };
+}
diff --git a/src/java/org/apache/cassandra/notifications/MemtableDiscardedNotification.java b/src/java/org/apache/cassandra/notifications/MemtableDiscardedNotification.java
index 778cad0..849b2f6 100644
--- a/src/java/org/apache/cassandra/notifications/MemtableDiscardedNotification.java
+++ b/src/java/org/apache/cassandra/notifications/MemtableDiscardedNotification.java
@@ -17,7 +17,7 @@
  */
 package org.apache.cassandra.notifications;
 
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 
 public class MemtableDiscardedNotification implements INotification
 {
diff --git a/src/java/org/apache/cassandra/notifications/MemtableRenewedNotification.java b/src/java/org/apache/cassandra/notifications/MemtableRenewedNotification.java
index 4c7e6c5..776c9da 100644
--- a/src/java/org/apache/cassandra/notifications/MemtableRenewedNotification.java
+++ b/src/java/org/apache/cassandra/notifications/MemtableRenewedNotification.java
@@ -17,7 +17,7 @@
  */
 package org.apache.cassandra.notifications;
 
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 
 public class MemtableRenewedNotification implements INotification
 {
diff --git a/src/java/org/apache/cassandra/notifications/MemtableSwitchedNotification.java b/src/java/org/apache/cassandra/notifications/MemtableSwitchedNotification.java
index 946de4e..b1737be 100644
--- a/src/java/org/apache/cassandra/notifications/MemtableSwitchedNotification.java
+++ b/src/java/org/apache/cassandra/notifications/MemtableSwitchedNotification.java
@@ -17,7 +17,7 @@
  */
 package org.apache.cassandra.notifications;
 
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 
 public class MemtableSwitchedNotification implements INotification
 {
diff --git a/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java b/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java
index 9c95a18..857af69 100644
--- a/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java
+++ b/src/java/org/apache/cassandra/notifications/SSTableAddedNotification.java
@@ -21,7 +21,7 @@
 
 import javax.annotation.Nullable;
 
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 
 /**
diff --git a/src/java/org/apache/cassandra/repair/AbstractRepairTask.java b/src/java/org/apache/cassandra/repair/AbstractRepairTask.java
new file mode 100644
index 0000000..d2a6f1a
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/AbstractRepairTask.java
@@ -0,0 +1,124 @@
+/*
+ * 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.repair;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+
+import com.google.common.collect.Lists;
+import com.google.common.util.concurrent.FutureCallback;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+
+public abstract class AbstractRepairTask implements RepairTask
+{
+    protected static final Logger logger = LoggerFactory.getLogger(AbstractRepairTask.class);
+
+    protected final RepairOption options;
+    protected final String keyspace;
+    protected final RepairNotifier notifier;
+
+    protected AbstractRepairTask(RepairOption options, String keyspace, RepairNotifier notifier)
+    {
+        this.options = Objects.requireNonNull(options);
+        this.keyspace = Objects.requireNonNull(keyspace);
+        this.notifier = Objects.requireNonNull(notifier);
+    }
+
+    private List<RepairSession> submitRepairSessions(TimeUUID parentSession,
+                                                     boolean isIncremental,
+                                                     ExecutorPlus executor,
+                                                     List<CommonRange> commonRanges,
+                                                     String... cfnames)
+    {
+        List<RepairSession> futures = new ArrayList<>(options.getRanges().size());
+
+        for (CommonRange commonRange : commonRanges)
+        {
+            logger.info("Starting RepairSession for {}", commonRange);
+            RepairSession session = ActiveRepairService.instance.submitRepairSession(parentSession,
+                                                                                     commonRange,
+                                                                                     keyspace,
+                                                                                     options.getParallelism(),
+                                                                                     isIncremental,
+                                                                                     options.isPullRepair(),
+                                                                                     options.getPreviewKind(),
+                                                                                     options.optimiseStreams(),
+                                                                                     options.repairPaxos(),
+                                                                                     options.paxosOnly(),
+                                                                                     executor,
+                                                                                     cfnames);
+            if (session == null)
+                continue;
+            session.addCallback(new RepairSessionCallback(session));
+            futures.add(session);
+        }
+        return futures;
+    }
+
+    protected Future<CoordinatedRepairResult> runRepair(TimeUUID parentSession,
+                                                        boolean isIncremental,
+                                                        ExecutorPlus executor,
+                                                        List<CommonRange> commonRanges,
+                                                        String... cfnames)
+    {
+        List<RepairSession> allSessions = submitRepairSessions(parentSession, isIncremental, executor, commonRanges, cfnames);
+        List<Collection<Range<Token>>> ranges = Lists.transform(allSessions, RepairSession::ranges);
+        Future<List<RepairSessionResult>> f = FutureCombiner.successfulOf(allSessions);
+        return f.map(results -> {
+            logger.debug("Repair result: {}", results);
+            return CoordinatedRepairResult.create(ranges, results);
+        });
+    }
+
+    private class RepairSessionCallback implements FutureCallback<RepairSessionResult>
+    {
+        private final RepairSession session;
+
+        public RepairSessionCallback(RepairSession session)
+        {
+            this.session = session;
+        }
+
+        public void onSuccess(RepairSessionResult result)
+        {
+            String message = String.format("Repair session %s for range %s finished", session.getId(),
+                                           session.ranges().toString());
+            notifier.notifyProgress(message);
+        }
+
+        public void onFailure(Throwable t)
+        {
+            String message = String.format("Repair session %s for range %s failed with error %s",
+                                           session.getId(), session.ranges().toString(), t.getMessage());
+            notifier.notifyError(new RuntimeException(message, t));
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/AsymmetricRemoteSyncTask.java b/src/java/org/apache/cassandra/repair/AsymmetricRemoteSyncTask.java
index 9762c9f..c050f2c 100644
--- a/src/java/org/apache/cassandra/repair/AsymmetricRemoteSyncTask.java
+++ b/src/java/org/apache/cassandra/repair/AsymmetricRemoteSyncTask.java
@@ -57,11 +57,11 @@
     {
         if (success)
         {
-            set(stat.withSummaries(summaries));
+            trySuccess(stat.withSummaries(summaries));
         }
         else
         {
-            setException(new RepairException(desc, previewKind, String.format("Sync failed between %s and %s", nodePair.coordinator, nodePair.peer)));
+            tryFailure(RepairException.warn(desc, previewKind, String.format("Sync failed between %s and %s", nodePair.coordinator, nodePair.peer)));
         }
     }
 
diff --git a/src/java/org/apache/cassandra/repair/CoordinatedRepairResult.java b/src/java/org/apache/cassandra/repair/CoordinatedRepairResult.java
new file mode 100644
index 0000000..9593acc
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/CoordinatedRepairResult.java
@@ -0,0 +1,108 @@
+/*
+ * 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.repair;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+
+import javax.annotation.Nullable;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Lists;
+
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+
+public class CoordinatedRepairResult
+{
+    public final Collection<Range<Token>> successfulRanges;
+    public final Collection<Range<Token>> failedRanges;
+    public final Collection<Range<Token>> skippedRanges;
+    public final Optional<List<RepairSessionResult>> results;
+
+    public CoordinatedRepairResult(Collection<Range<Token>> successfulRanges,
+                                   Collection<Range<Token>> failedRanges,
+                                   Collection<Range<Token>> skippedRanges,
+                                   List<RepairSessionResult> results)
+    {
+        this.successfulRanges = successfulRanges != null ? ImmutableList.copyOf(successfulRanges) : Collections.emptyList();
+        this.failedRanges = failedRanges != null ? ImmutableList.copyOf(failedRanges) : Collections.emptyList();
+        this.skippedRanges = skippedRanges != null ? ImmutableList.copyOf(skippedRanges) : Collections.emptyList();
+        this.results = Optional.ofNullable(results);
+    }
+
+    public static CoordinatedRepairResult create(List<Collection<Range<Token>>> ranges, List<RepairSessionResult> results)
+    {
+        if (results == null || results.isEmpty())
+            // something went wrong; assume all sessions failed
+            return failed(ranges);
+
+        assert ranges.size() == results.size() : String.format("range size %d != results size %d;ranges: %s, results: %s", ranges.size(), results.size(), ranges, results);
+        Collection<Range<Token>> successfulRanges = new ArrayList<>();
+        Collection<Range<Token>> failedRanges = new ArrayList<>();
+        Collection<Range<Token>> skippedRanges = new ArrayList<>();
+        int index = 0;
+        for (RepairSessionResult sessionResult : results)
+        {
+            if (sessionResult != null)
+            {
+                // don't record successful repair if we had to skip ranges
+                Collection<Range<Token>> replicas = sessionResult.skippedReplicas ? skippedRanges : successfulRanges;
+                replicas.addAll(sessionResult.ranges);
+            }
+            else
+            {
+                // FutureCombiner.successfulOf doesn't keep track of the original, but maintains order, so
+                // can fetch the original session
+                failedRanges.addAll(Objects.requireNonNull(ranges.get(index)));
+            }
+            index++;
+        }
+        return new CoordinatedRepairResult(successfulRanges, failedRanges, skippedRanges, results);
+    }
+
+    private static CoordinatedRepairResult failed(@Nullable List<Collection<Range<Token>>> ranges)
+    {
+        Collection<Range<Token>> failedRanges = new ArrayList<>(ranges == null ? 0 : ranges.size());
+        if (ranges != null)
+            ranges.forEach(failedRanges::addAll);
+        return new CoordinatedRepairResult(null, failedRanges, null, null);
+    }
+
+    /**
+     * Utility method for tests to produce a success result; should only be used by tests as syntaxtic sugar as all
+     * results must be present else an error is thrown.
+     */
+    @VisibleForTesting
+    public static CoordinatedRepairResult success(List<RepairSessionResult> results)
+    {
+        assert results != null && results.stream().allMatch(a -> a != null) : String.format("results was null or had a null (failed) result: %s", results);
+        List<Collection<Range<Token>>> ranges = Lists.transform(results, a -> a.ranges);
+        return create(ranges, results);
+    }
+
+    public boolean hasFailed()
+    {
+        return !failedRanges.isEmpty();
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/IncrementalRepairTask.java b/src/java/org/apache/cassandra/repair/IncrementalRepairTask.java
new file mode 100644
index 0000000..af1a234
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/IncrementalRepairTask.java
@@ -0,0 +1,75 @@
+/*
+ * 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.repair;
+
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.consistent.CoordinatorSession;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
+
+public class IncrementalRepairTask extends AbstractRepairTask
+{
+    private final TimeUUID parentSession;
+    private final RepairRunnable.NeighborsAndRanges neighborsAndRanges;
+    private final String[] cfnames;
+
+    protected IncrementalRepairTask(RepairOption options,
+                                    String keyspace,
+                                    RepairNotifier notifier,
+                                    TimeUUID parentSession,
+                                    RepairRunnable.NeighborsAndRanges neighborsAndRanges,
+                                    String[] cfnames)
+    {
+        super(options, keyspace, notifier);
+        this.parentSession = parentSession;
+        this.neighborsAndRanges = neighborsAndRanges;
+        this.cfnames = cfnames;
+    }
+
+    @Override
+    public String name()
+    {
+        return "Repair";
+    }
+
+    @Override
+    public Future<CoordinatedRepairResult> performUnsafe(ExecutorPlus executor) throws Exception
+    {
+        // the local node also needs to be included in the set of participants, since coordinator sessions aren't persisted
+        Set<InetAddressAndPort> allParticipants = ImmutableSet.<InetAddressAndPort>builder()
+                                                  .addAll(neighborsAndRanges.participants)
+                                                  .add(FBUtilities.getBroadcastAddressAndPort())
+                                                  .build();
+        // Not necessary to include self for filtering. The common ranges only contains neighbhor node endpoints.
+        List<CommonRange> allRanges = neighborsAndRanges.filterCommonRanges(keyspace, cfnames);
+
+        CoordinatorSession coordinatorSession = ActiveRepairService.instance.consistent.coordinated.registerSession(parentSession, allParticipants, neighborsAndRanges.shouldExcludeDeadParticipants);
+
+        return coordinatorSession.execute(() -> runRepair(parentSession, true, executor, allRanges, cfnames));
+
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/KeyspaceRepairManager.java b/src/java/org/apache/cassandra/repair/KeyspaceRepairManager.java
index 0739f10..9042ebe 100644
--- a/src/java/org/apache/cassandra/repair/KeyspaceRepairManager.java
+++ b/src/java/org/apache/cassandra/repair/KeyspaceRepairManager.java
@@ -19,14 +19,14 @@
 package org.apache.cassandra.repair;
 
 import java.util.Collection;
-import java.util.UUID;
+import java.util.List;
 import java.util.concurrent.ExecutorService;
 import java.util.function.BooleanSupplier;
 
-import com.google.common.util.concurrent.ListenableFuture;
-
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.locator.RangesAtEndpoint;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
 
 /**
  * Keyspace level hook for repair.
@@ -38,9 +38,9 @@
      * been notified that the repair session has been completed, the data associated with the given session id must
      * not be combined with repaired or unrepaired data, or data from other repair sessions.
      */
-    ListenableFuture prepareIncrementalRepair(UUID sessionID,
-                                              Collection<ColumnFamilyStore> tables,
-                                              RangesAtEndpoint tokenRanges,
-                                              ExecutorService executor,
-                                              BooleanSupplier isCancelled);
+    Future<List<Void>> prepareIncrementalRepair(TimeUUID sessionID,
+                                                Collection<ColumnFamilyStore> tables,
+                                                RangesAtEndpoint tokenRanges,
+                                                ExecutorService executor,
+                                                BooleanSupplier isCancelled);
 }
diff --git a/src/java/org/apache/cassandra/repair/LocalSyncTask.java b/src/java/org/apache/cassandra/repair/LocalSyncTask.java
index 9931575..28a6acc 100644
--- a/src/java/org/apache/cassandra/repair/LocalSyncTask.java
+++ b/src/java/org/apache/cassandra/repair/LocalSyncTask.java
@@ -19,8 +19,6 @@
 
 import java.util.Collections;
 import java.util.List;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -43,6 +41,9 @@
 import org.apache.cassandra.tracing.TraceState;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Promise;
 
 /**
  * LocalSyncTask performs streaming between local(coordinator) node and remote replica.
@@ -53,7 +54,7 @@
 
     private static final Logger logger = LoggerFactory.getLogger(LocalSyncTask.class);
 
-    private final UUID pendingRepair;
+    private final TimeUUID pendingRepair;
 
     @VisibleForTesting
     public final boolean requestRanges;
@@ -61,10 +62,10 @@
     public final boolean transferRanges;
 
     private final AtomicBoolean active = new AtomicBoolean(true);
-    private final CompletableFuture<StreamPlan> planFuture = new CompletableFuture<>();
+    private final Promise<StreamPlan> planPromise = new AsyncPromise<>();
 
     public LocalSyncTask(RepairJobDesc desc, InetAddressAndPort local, InetAddressAndPort remote,
-                         List<Range<Token>> diff, UUID pendingRepair,
+                         List<Range<Token>> diff, TimeUUID pendingRepair,
                          boolean requestRanges, boolean transferRanges, PreviewKind previewKind)
     {
         super(desc, local, remote, diff, previewKind);
@@ -119,7 +120,7 @@
 
             StreamPlan plan = createStreamPlan();
             plan.execute();
-            planFuture.complete(plan);
+            planPromise.setSuccess(plan);
         }
     }
 
@@ -165,7 +166,7 @@
                                            status, desc.sessionId, nodePair.coordinator, nodePair.peer, desc.columnFamily);
             logger.info("{} {}", previewKind.logPrefix(desc.sessionId), message);
             Tracing.traceRepair(message);
-            set(result.hasAbortedSession() ? stat : stat.withSummaries(result.createSummaries()));
+            trySuccess(result.hasAbortedSession() ? stat : stat.withSummaries(result.createSummaries()));
             finished();
         }
     }
@@ -175,7 +176,7 @@
     {
         if (active.compareAndSet(true, false))
         {
-            setException(t);
+            tryFailure(t);
             finished();
         }
     }
@@ -194,7 +195,7 @@
     @Override
     public void abort()
     {
-        planFuture.whenComplete((plan, cause) ->
+        planPromise.addCallback((plan, cause) ->
         {
             assert plan != null : "StreamPlan future should never be completed exceptionally";
             plan.getCoordinator().getAllStreamSessions().forEach(StreamSession::abort);
diff --git a/src/java/org/apache/cassandra/repair/NoSuchRepairSessionException.java b/src/java/org/apache/cassandra/repair/NoSuchRepairSessionException.java
new file mode 100644
index 0000000..8a86f1a
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/NoSuchRepairSessionException.java
@@ -0,0 +1,29 @@
+/*
+ * 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.repair;
+
+import org.apache.cassandra.utils.TimeUUID;
+
+public class NoSuchRepairSessionException extends Exception
+{
+    public NoSuchRepairSessionException(TimeUUID parentSessionId)
+    {
+        super(String.format("Parent repair session with id = %s does not exist.", parentSessionId));
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/NormalRepairTask.java b/src/java/org/apache/cassandra/repair/NormalRepairTask.java
new file mode 100644
index 0000000..56a03f8
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/NormalRepairTask.java
@@ -0,0 +1,57 @@
+/*
+ * 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.repair;
+
+import java.util.List;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
+
+public class NormalRepairTask extends AbstractRepairTask
+{
+    private final TimeUUID parentSession;
+    private final List<CommonRange> commonRanges;
+    private final String[] cfnames;
+
+    protected NormalRepairTask(RepairOption options,
+                               String keyspace,
+                               RepairNotifier notifier,
+                               TimeUUID parentSession,
+                               List<CommonRange> commonRanges,
+                               String[] cfnames)
+    {
+        super(options, keyspace, notifier);
+        this.parentSession = parentSession;
+        this.commonRanges = commonRanges;
+        this.cfnames = cfnames;
+    }
+
+    @Override
+    public String name()
+    {
+        return "Repair";
+    }
+
+    @Override
+    public Future<CoordinatedRepairResult> performUnsafe(ExecutorPlus executor)
+    {
+        return runRepair(parentSession, false, executor, commonRanges, cfnames);
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/PreviewRepairTask.java b/src/java/org/apache/cassandra/repair/PreviewRepairTask.java
new file mode 100644
index 0000000..7ce7d1f
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/PreviewRepairTask.java
@@ -0,0 +1,153 @@
+/*
+ * 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.repair;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.metrics.RepairMetrics;
+import org.apache.cassandra.repair.consistent.SyncStatSummary;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.DiagnosticSnapshotService;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
+
+public class PreviewRepairTask extends AbstractRepairTask
+{
+    private final TimeUUID parentSession;
+    private final List<CommonRange> commonRanges;
+    private final String[] cfnames;
+    private volatile String successMessage = name() + " completed successfully";
+
+    protected PreviewRepairTask(RepairOption options, String keyspace, RepairNotifier notifier, TimeUUID parentSession, List<CommonRange> commonRanges, String[] cfnames)
+    {
+        super(options, keyspace, notifier);
+        this.parentSession = parentSession;
+        this.commonRanges = commonRanges;
+        this.cfnames = cfnames;
+    }
+
+    @Override
+    public String name()
+    {
+        return "Repair preview";
+    }
+
+    @Override
+    public String successMessage()
+    {
+        return successMessage;
+    }
+
+    @Override
+    public Future<CoordinatedRepairResult> performUnsafe(ExecutorPlus executor)
+    {
+        Future<CoordinatedRepairResult> f = runRepair(parentSession, false, executor, commonRanges, cfnames);
+        return f.map(result -> {
+            if (result.hasFailed())
+                return result;
+
+            PreviewKind previewKind = options.getPreviewKind();
+            Preconditions.checkState(previewKind != PreviewKind.NONE, "Preview is NONE");
+            SyncStatSummary summary = new SyncStatSummary(true);
+            summary.consumeSessionResults(result.results);
+
+            final String message;
+            if (summary.isEmpty())
+            {
+                message = previewKind == PreviewKind.REPAIRED ? "Repaired data is in sync" : "Previewed data was in sync";
+            }
+            else
+            {
+                message = (previewKind == PreviewKind.REPAIRED ? "Repaired data is inconsistent\n" : "Preview complete\n") + summary;
+                RepairMetrics.previewFailures.inc();
+                if (previewKind == PreviewKind.REPAIRED)
+                    maybeSnapshotReplicas(parentSession, keyspace, result.results.get()); // we know its present as summary used it
+            }
+            successMessage += "; " + message;
+            notifier.notification(message);
+
+            return result;
+        });
+    }
+
+    private void maybeSnapshotReplicas(TimeUUID parentSession, String keyspace, List<RepairSessionResult> results)
+    {
+        if (!DatabaseDescriptor.snapshotOnRepairedDataMismatch())
+            return;
+
+        try
+        {
+            Set<String> mismatchingTables = new HashSet<>();
+            Set<InetAddressAndPort> nodes = new HashSet<>();
+            for (RepairSessionResult sessionResult : results)
+            {
+                for (RepairResult repairResult : emptyIfNull(sessionResult.repairJobResults))
+                {
+                    for (SyncStat stat : emptyIfNull(repairResult.stats))
+                    {
+                        if (stat.numberOfDifferences > 0)
+                            mismatchingTables.add(repairResult.desc.columnFamily);
+                        // snapshot all replicas, even if they don't have any differences
+                        nodes.add(stat.nodes.coordinator);
+                        nodes.add(stat.nodes.peer);
+                    }
+                }
+            }
+
+            String snapshotName = DiagnosticSnapshotService.getSnapshotName(DiagnosticSnapshotService.REPAIRED_DATA_MISMATCH_SNAPSHOT_PREFIX);
+            for (String table : mismatchingTables)
+            {
+                // we can just check snapshot existence locally since the repair coordinator is always a replica (unlike in the read case)
+                if (!Keyspace.open(keyspace).getColumnFamilyStore(table).snapshotExists(snapshotName))
+                {
+                    logger.info("{} Snapshotting {}.{} for preview repair mismatch with tag {} on instances {}",
+                                options.getPreviewKind().logPrefix(parentSession),
+                                keyspace, table, snapshotName, nodes);
+                    DiagnosticSnapshotService.repairedDataMismatch(Keyspace.open(keyspace).getColumnFamilyStore(table).metadata(), nodes);
+                }
+                else
+                {
+                    logger.info("{} Not snapshotting {}.{} - snapshot {} exists",
+                                options.getPreviewKind().logPrefix(parentSession),
+                                keyspace, table, snapshotName);
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            logger.error("{} Failed snapshotting replicas", options.getPreviewKind().logPrefix(parentSession), e);
+        }
+    }
+
+    private static <T> Iterable<T> emptyIfNull(Iterable<T> iter)
+    {
+        if (iter == null)
+            return Collections.emptyList();
+        return iter;
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/RepairJob.java b/src/java/org/apache/cassandra/repair/RepairJob.java
index a9ac6af..aba8bd8 100644
--- a/src/java/org/apache/cassandra/repair/RepairJob.java
+++ b/src/java/org/apache/cassandra/repair/RepairJob.java
@@ -23,10 +23,16 @@
 import java.util.function.Function;
 import java.util.stream.Collectors;
 
+
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.*;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.repair.state.JobState;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -38,41 +44,55 @@
 import org.apache.cassandra.repair.asymmetric.PreferedNodeFilter;
 import org.apache.cassandra.repair.asymmetric.ReduceHelper;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanup;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MerkleTrees;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+
+import static org.apache.cassandra.config.DatabaseDescriptor.paxosRepairEnabled;
+import static org.apache.cassandra.service.paxos.Paxos.useV2;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * RepairJob runs repair on given ColumnFamily.
  */
-public class RepairJob extends AbstractFuture<RepairResult> implements Runnable
+public class RepairJob extends AsyncFuture<RepairResult> implements Runnable
 {
     private static final Logger logger = LoggerFactory.getLogger(RepairJob.class);
 
-    private final RepairSession session;
+    public final JobState state;
     private final RepairJobDesc desc;
+    private final RepairSession session;
     private final RepairParallelism parallelismDegree;
-    private final ListeningExecutorService taskExecutor;
-    
-    private final List<SyncTask> syncTasks = new CopyOnWriteArrayList<>();
+    private final ExecutorPlus taskExecutor;
+
+    @VisibleForTesting
+    final List<ValidationTask> validationTasks = new CopyOnWriteArrayList<>();
+
+    @VisibleForTesting
+    final List<SyncTask> syncTasks = new CopyOnWriteArrayList<>();
 
     /**
      * Create repair job to run on specific columnfamily
-     *
-     * @param session RepairSession that this RepairJob belongs
+     *  @param session RepairSession that this RepairJob belongs
      * @param columnFamily name of the ColumnFamily to repair
      */
     public RepairJob(RepairSession session, String columnFamily)
     {
         this.session = session;
-        this.desc = new RepairJobDesc(session.parentRepairSession, session.getId(), session.keyspace, columnFamily, session.commonRange.ranges);
         this.taskExecutor = session.taskExecutor;
         this.parallelismDegree = session.parallelismDegree;
+        this.desc = new RepairJobDesc(session.state.parentRepairSession, session.getId(), session.state.keyspace, columnFamily, session.state.commonRange.ranges);
+        this.state = new JobState(desc, session.state.commonRange.endpoints);
     }
 
     public int getNowInSeconds()
@@ -94,74 +114,114 @@
      * This sets up necessary task and runs them on given {@code taskExecutor}.
      * After submitting all tasks, waits until validation with replica completes.
      */
-    @SuppressWarnings("UnstableApiUsage")
     public void run()
     {
+        state.phase.start();
         Keyspace ks = Keyspace.open(desc.keyspace);
         ColumnFamilyStore cfs = ks.getColumnFamilyStore(desc.columnFamily);
         cfs.metric.repairsStarted.inc();
-        List<InetAddressAndPort> allEndpoints = new ArrayList<>(session.commonRange.endpoints);
+        List<InetAddressAndPort> allEndpoints = new ArrayList<>(session.state.commonRange.endpoints);
         allEndpoints.add(FBUtilities.getBroadcastAddressAndPort());
 
-        ListenableFuture<List<TreeResponse>> validations;
+        Future<List<TreeResponse>> treeResponses;
+        Future<Void> paxosRepair;
+        if (paxosRepairEnabled() && ((useV2() && session.repairPaxos) || session.paxosOnly))
+        {
+            logger.info("{} {}.{} starting paxos repair", session.previewKind.logPrefix(session.getId()), desc.keyspace, desc.columnFamily);
+            TableMetadata metadata = Schema.instance.getTableMetadata(desc.keyspace, desc.columnFamily);
+            paxosRepair = PaxosCleanup.cleanup(allEndpoints, metadata, desc.ranges, session.state.commonRange.hasSkippedReplicas, taskExecutor);
+        }
+        else
+        {
+            logger.info("{} {}.{} not running paxos repair", session.previewKind.logPrefix(session.getId()), desc.keyspace, desc.columnFamily);
+            paxosRepair = ImmediateFuture.success(null);
+        }
+
+        if (session.paxosOnly)
+        {
+            paxosRepair.addCallback(new FutureCallback<Void>()
+            {
+                public void onSuccess(Void v)
+                {
+                    logger.info("{} {}.{} paxos repair completed", session.previewKind.logPrefix(session.getId()), desc.keyspace, desc.columnFamily);
+                    trySuccess(new RepairResult(desc, Collections.emptyList()));
+                }
+
+                /**
+                 * Snapshot, validation and sync failures are all handled here
+                 */
+                public void onFailure(Throwable t)
+                {
+                    logger.warn("{} {}.{} paxos repair failed", session.previewKind.logPrefix(session.getId()), desc.keyspace, desc.columnFamily);
+                    tryFailure(t);
+                }
+            }, taskExecutor);
+            return;
+        }
+
         // Create a snapshot at all nodes unless we're using pure parallel repairs
         if (parallelismDegree != RepairParallelism.PARALLEL)
         {
-            ListenableFuture<List<InetAddressAndPort>> allSnapshotTasks;
+            Future<?> allSnapshotTasks;
             if (session.isIncremental)
             {
                 // consistent repair does it's own "snapshotting"
-                allSnapshotTasks = Futures.immediateFuture(allEndpoints);
+                allSnapshotTasks = paxosRepair.map(input -> allEndpoints);
             }
             else
             {
                 // Request snapshot to all replica
-                List<ListenableFuture<InetAddressAndPort>> snapshotTasks = new ArrayList<>(allEndpoints.size());
-                for (InetAddressAndPort endpoint : allEndpoints)
-                {
-                    SnapshotTask snapshotTask = new SnapshotTask(desc, endpoint);
-                    snapshotTasks.add(snapshotTask);
-                    taskExecutor.execute(snapshotTask);
-                }
-                allSnapshotTasks = Futures.allAsList(snapshotTasks);
+                allSnapshotTasks = paxosRepair.flatMap(input -> {
+                    List<Future<InetAddressAndPort>> snapshotTasks = new ArrayList<>(allEndpoints.size());
+                    state.phase.snapshotsSubmitted();
+                    for (InetAddressAndPort endpoint : allEndpoints)
+                    {
+                        SnapshotTask snapshotTask = new SnapshotTask(desc, endpoint);
+                        snapshotTasks.add(snapshotTask);
+                        taskExecutor.execute(snapshotTask);
+                    }
+                    return FutureCombiner.allOf(snapshotTasks).map(a -> {
+                        state.phase.snapshotsCompleted();
+                        return a;
+                    });
+                });
             }
 
             // When all snapshot complete, send validation requests
-            validations = Futures.transformAsync(allSnapshotTasks, new AsyncFunction<List<InetAddressAndPort>, List<TreeResponse>>()
-            {
-                public ListenableFuture<List<TreeResponse>> apply(List<InetAddressAndPort> endpoints)
-                {
-                    if (parallelismDegree == RepairParallelism.SEQUENTIAL)
-                        return sendSequentialValidationRequest(endpoints);
-                    else
-                        return sendDCAwareValidationRequest(endpoints);
-                }
-            }, taskExecutor);
+            treeResponses = allSnapshotTasks.flatMap(endpoints -> {
+                if (parallelismDegree == RepairParallelism.SEQUENTIAL)
+                    return sendSequentialValidationRequest(allEndpoints);
+                else
+                    return sendDCAwareValidationRequest(allEndpoints);
+                }, taskExecutor);
         }
         else
         {
             // If not sequential, just send validation request to all replica
-            validations = sendValidationRequest(allEndpoints);
+            treeResponses = paxosRepair.flatMap(input -> sendValidationRequest(allEndpoints));
         }
+        treeResponses = treeResponses.map(a -> {
+            state.phase.validationCompleted();
+            return a;
+        });
 
         // When all validations complete, submit sync tasks
-        ListenableFuture<List<SyncStat>> syncResults = Futures.transformAsync(validations,
-                                                                              session.optimiseStreams && !session.pullRepair ? this::optimisedSyncing : this::standardSyncing,
-                                                                              taskExecutor);
+        Future<List<SyncStat>> syncResults = treeResponses.flatMap(session.optimiseStreams && !session.pullRepair ? this::optimisedSyncing : this::standardSyncing, taskExecutor);
 
         // When all sync complete, set the final result
-        Futures.addCallback(syncResults, new FutureCallback<List<SyncStat>>()
+        syncResults.addCallback(new FutureCallback<List<SyncStat>>()
         {
             @Override
             public void onSuccess(List<SyncStat> stats)
             {
+                state.phase.success();
                 if (!session.previewKind.isPreview())
                 {
                     logger.info("{} {}.{} is fully synced", session.previewKind.logPrefix(session.getId()), desc.keyspace, desc.columnFamily);
                     SystemDistributedKeyspace.successfulRepairJob(session.getId(), desc.keyspace, desc.columnFamily);
                 }
                 cfs.metric.repairsCompleted.inc();
-                set(new RepairResult(desc, stats));
+                trySuccess(new RepairResult(desc, stats));
             }
 
             /**
@@ -170,6 +230,9 @@
             @Override
             public void onFailure(Throwable t)
             {
+                state.phase.fail(t);
+                // Make sure all validation tasks have cleaned up the off-heap Merkle trees they might contain.
+                validationTasks.forEach(ValidationTask::abort);
                 syncTasks.forEach(SyncTask::abort);
 
                 if (!session.previewKind.isPreview())
@@ -178,18 +241,21 @@
                     SystemDistributedKeyspace.failedRepairJob(session.getId(), desc.keyspace, desc.columnFamily, t);
                 }
                 cfs.metric.repairsCompleted.inc();
-                setException(t);
+                tryFailure(t instanceof NoSuchRepairSessionExceptionWrapper
+                           ? ((NoSuchRepairSessionExceptionWrapper) t).wrapped
+                           : t);
             }
         }, taskExecutor);
     }
 
     private boolean isTransient(InetAddressAndPort ep)
     {
-        return session.commonRange.transEndpoints.contains(ep);
+        return session.state.commonRange.transEndpoints.contains(ep);
     }
 
-    private ListenableFuture<List<SyncStat>> standardSyncing(List<TreeResponse> trees)
+    private Future<List<SyncStat>> standardSyncing(List<TreeResponse> trees)
     {
+        state.phase.streamSubmitted();
         List<SyncTask> syncTasks = createStandardSyncTasks(desc,
                                                            trees,
                                                            FBUtilities.getLocalAddressAndPort(),
@@ -208,7 +274,7 @@
                                                   boolean pullRepair,
                                                   PreviewKind previewKind)
     {
-        long startedAt = System.currentTimeMillis();
+        long startedAt = currentTimeMillis();
         List<SyncTask> syncTasks = new ArrayList<>();
         // We need to difference all trees one against another
         for (int i = 0; i < trees.size() - 1; ++i)
@@ -263,12 +329,13 @@
         }
         trees.get(trees.size() - 1).trees.release();
         logger.info("Created {} sync tasks based on {} merkle tree responses for {} (took: {}ms)",
-                    syncTasks.size(), trees.size(), desc.parentSessionId, System.currentTimeMillis() - startedAt);
+                    syncTasks.size(), trees.size(), desc.parentSessionId, currentTimeMillis() - startedAt);
         return syncTasks;
     }
 
-    private ListenableFuture<List<SyncStat>> optimisedSyncing(List<TreeResponse> trees)
+    private Future<List<SyncStat>> optimisedSyncing(List<TreeResponse> trees)
     {
+        state.phase.streamSubmitted();
         List<SyncTask> syncTasks = createOptimisedSyncingSyncTasks(desc,
                                                                    trees,
                                                                    FBUtilities.getLocalAddressAndPort(),
@@ -280,22 +347,42 @@
         return executeTasks(syncTasks);
     }
 
-    @SuppressWarnings("UnstableApiUsage")
     @VisibleForTesting
-    ListenableFuture<List<SyncStat>> executeTasks(List<SyncTask> tasks)
+    Future<List<SyncStat>> executeTasks(List<SyncTask> tasks)
     {
-        // this throws if the parent session has failed
-        ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId);
-        syncTasks.addAll(tasks);
-
-        for (SyncTask task : tasks)
+        try
         {
-            if (!task.isLocal())
-                session.trackSyncCompletion(Pair.create(desc, task.nodePair()), (CompletableRemoteSyncTask) task);
-            taskExecutor.submit(task);
-        }
+            ActiveRepairService.instance.getParentRepairSession(desc.parentSessionId);
+            syncTasks.addAll(tasks);
 
-        return Futures.allAsList(tasks);
+            for (SyncTask task : tasks)
+            {
+                if (!task.isLocal())
+                    session.trackSyncCompletion(Pair.create(desc, task.nodePair()), (CompletableRemoteSyncTask) task);
+                taskExecutor.execute(task);
+            }
+
+            return FutureCombiner.allOf(tasks);
+        }
+        catch (NoSuchRepairSessionException e)
+        {
+            return ImmediateFuture.failure(new NoSuchRepairSessionExceptionWrapper(e));
+        }
+    }
+
+    // provided so we can throw NoSuchRepairSessionException from executeTasks without
+    // having to make it unchecked. Required as this is called as from standardSyncing/
+    // optimisedSyncing passed as a Function to transform merkle tree responses and so
+    // can't throw checked exceptions. These are unwrapped in the onFailure callback of
+    // that transformation so as to not pollute the checked usage of
+    // NoSuchRepairSessionException in the rest of the codebase.
+    private static class NoSuchRepairSessionExceptionWrapper extends RuntimeException
+    {
+        private final NoSuchRepairSessionException wrapped;
+        private NoSuchRepairSessionExceptionWrapper(NoSuchRepairSessionException wrapped)
+        {
+            this.wrapped = wrapped;
+        }
     }
 
     static List<SyncTask> createOptimisedSyncingSyncTasks(RepairJobDesc desc,
@@ -306,7 +393,7 @@
                                                           boolean isIncremental,
                                                           PreviewKind previewKind)
     {
-        long startedAt = System.currentTimeMillis();
+        long startedAt = currentTimeMillis();
         List<SyncTask> syncTasks = new ArrayList<>();
         // We need to difference all trees one against another
         DifferenceHolder diffHolder = new DifferenceHolder(trees);
@@ -357,7 +444,7 @@
             }
         }
         logger.info("Created {} optimised sync tasks based on {} merkle tree responses for {} (took: {}ms)",
-                    syncTasks.size(), trees.size(), desc.parentSessionId, System.currentTimeMillis() - startedAt);
+                    syncTasks.size(), trees.size(), desc.parentSessionId, currentTimeMillis() - startedAt);
         logger.trace("Optimised sync tasks for {}: {}", desc.parentSessionId, syncTasks);
         return syncTasks;
     }
@@ -373,38 +460,39 @@
      * @param endpoints Endpoint addresses to send validation request
      * @return Future that can get all {@link TreeResponse} from replica, if all validation succeed.
      */
-    @SuppressWarnings("UnstableApiUsage")
-    private ListenableFuture<List<TreeResponse>> sendValidationRequest(Collection<InetAddressAndPort> endpoints)
+    private Future<List<TreeResponse>> sendValidationRequest(Collection<InetAddressAndPort> endpoints)
     {
+        state.phase.validationSubmitted();
         String message = String.format("Requesting merkle trees for %s (to %s)", desc.columnFamily, endpoints);
         logger.info("{} {}", session.previewKind.logPrefix(desc.sessionId), message);
         Tracing.traceRepair(message);
         int nowInSec = getNowInSeconds();
-        List<ListenableFuture<TreeResponse>> tasks = new ArrayList<>(endpoints.size());
+        List<Future<TreeResponse>> tasks = new ArrayList<>(endpoints.size());
         for (InetAddressAndPort endpoint : endpoints)
         {
-            ValidationTask task = new ValidationTask(desc, endpoint, nowInSec, session.previewKind);
+            ValidationTask task = newValidationTask(endpoint, nowInSec);
             tasks.add(task);
             session.trackValidationCompletion(Pair.create(desc, endpoint), task);
             taskExecutor.execute(task);
         }
-        return Futures.allAsList(tasks);
+        return FutureCombiner.allOf(tasks);
     }
 
     /**
      * Creates {@link ValidationTask} and submit them to task executor so that tasks run sequentially.
      */
-    private ListenableFuture<List<TreeResponse>> sendSequentialValidationRequest(Collection<InetAddressAndPort> endpoints)
+    private Future<List<TreeResponse>> sendSequentialValidationRequest(Collection<InetAddressAndPort> endpoints)
     {
+        state.phase.validationSubmitted();
         String message = String.format("Requesting merkle trees for %s (to %s)", desc.columnFamily, endpoints);
         logger.info("{} {}", session.previewKind.logPrefix(desc.sessionId), message);
         Tracing.traceRepair(message);
         int nowInSec = getNowInSeconds();
-        List<ListenableFuture<TreeResponse>> tasks = new ArrayList<>(endpoints.size());
+        List<Future<TreeResponse>> tasks = new ArrayList<>(endpoints.size());
 
         Queue<InetAddressAndPort> requests = new LinkedList<>(endpoints);
         InetAddressAndPort address = requests.poll();
-        ValidationTask firstTask = new ValidationTask(desc, address, nowInSec, session.previewKind);
+        ValidationTask firstTask = newValidationTask(address, nowInSec);
         logger.info("{} Validating {}", session.previewKind.logPrefix(desc.sessionId), address);
         session.trackValidationCompletion(Pair.create(desc, address), firstTask);
         tasks.add(firstTask);
@@ -412,9 +500,9 @@
         while (requests.size() > 0)
         {
             final InetAddressAndPort nextAddress = requests.poll();
-            final ValidationTask nextTask = new ValidationTask(desc, nextAddress, nowInSec, session.previewKind);
+            final ValidationTask nextTask = newValidationTask(nextAddress, nowInSec);
             tasks.add(nextTask);
-            Futures.addCallback(currentTask, new FutureCallback<TreeResponse>()
+            currentTask.addCallback(new FutureCallback<TreeResponse>()
             {
                 public void onSuccess(TreeResponse result)
                 {
@@ -425,24 +513,25 @@
 
                 // failure is handled at root of job chain
                 public void onFailure(Throwable t) {}
-            }, MoreExecutors.directExecutor());
+            });
             currentTask = nextTask;
         }
         // start running tasks
         taskExecutor.execute(firstTask);
-        return Futures.allAsList(tasks);
+        return FutureCombiner.allOf(tasks);
     }
 
     /**
      * Creates {@link ValidationTask} and submit them to task executor so that tasks run sequentially within each dc.
      */
-    private ListenableFuture<List<TreeResponse>> sendDCAwareValidationRequest(Collection<InetAddressAndPort> endpoints)
+    private Future<List<TreeResponse>> sendDCAwareValidationRequest(Collection<InetAddressAndPort> endpoints)
     {
+        state.phase.validationSubmitted();
         String message = String.format("Requesting merkle trees for %s (to %s)", desc.columnFamily, endpoints);
         logger.info("{} {}", session.previewKind.logPrefix(desc.sessionId), message);
         Tracing.traceRepair(message);
         int nowInSec = getNowInSeconds();
-        List<ListenableFuture<TreeResponse>> tasks = new ArrayList<>(endpoints.size());
+        List<Future<TreeResponse>> tasks = new ArrayList<>(endpoints.size());
 
         Map<String, Queue<InetAddressAndPort>> requestsByDatacenter = new HashMap<>();
         for (InetAddressAndPort endpoint : endpoints)
@@ -461,7 +550,7 @@
         {
             Queue<InetAddressAndPort> requests = entry.getValue();
             InetAddressAndPort address = requests.poll();
-            ValidationTask firstTask = new ValidationTask(desc, address, nowInSec, session.previewKind);
+            ValidationTask firstTask = newValidationTask(address, nowInSec);
             logger.info("{} Validating {}", session.previewKind.logPrefix(session.getId()), address);
             session.trackValidationCompletion(Pair.create(desc, address), firstTask);
             tasks.add(firstTask);
@@ -469,9 +558,9 @@
             while (requests.size() > 0)
             {
                 final InetAddressAndPort nextAddress = requests.poll();
-                final ValidationTask nextTask = new ValidationTask(desc, nextAddress, nowInSec, session.previewKind);
+                final ValidationTask nextTask = newValidationTask(nextAddress, nowInSec);
                 tasks.add(nextTask);
-                Futures.addCallback(currentTask, new FutureCallback<TreeResponse>()
+                currentTask.addCallback(new FutureCallback<TreeResponse>()
                 {
                     public void onSuccess(TreeResponse result)
                     {
@@ -482,12 +571,19 @@
 
                     // failure is handled at root of job chain
                     public void onFailure(Throwable t) {}
-                }, MoreExecutors.directExecutor());
+                });
                 currentTask = nextTask;
             }
             // start running tasks
             taskExecutor.execute(firstTask);
         }
-        return Futures.allAsList(tasks);
+        return FutureCombiner.allOf(tasks);
     }
-}
\ No newline at end of file
+
+    private ValidationTask newValidationTask(InetAddressAndPort endpoint, int nowInSec)
+    {
+        ValidationTask task = new ValidationTask(desc, endpoint, nowInSec, session.previewKind);
+        validationTasks.add(task);
+        return task;
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/RepairJobDesc.java b/src/java/org/apache/cassandra/repair/RepairJobDesc.java
index 4aaf655..c6b1898 100644
--- a/src/java/org/apache/cassandra/repair/RepairJobDesc.java
+++ b/src/java/org/apache/cassandra/repair/RepairJobDesc.java
@@ -18,12 +18,15 @@
 package org.apache.cassandra.repair;
 
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.UUID;
 
 import com.google.common.base.Objects;
 
+import org.apache.commons.lang3.ArrayUtils;
+
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.IPartitioner;
@@ -32,9 +35,11 @@
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.streaming.PreviewKind;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+import static org.apache.cassandra.utils.ByteBufferUtil.getArray;
 
 /**
  * RepairJobDesc is used from various repair processes to distinguish one RepairJob to another.
@@ -45,15 +50,15 @@
 {
     public static final IVersionedSerializer<RepairJobDesc> serializer = new RepairJobDescSerializer();
 
-    public final UUID parentSessionId;
+    public final TimeUUID parentSessionId;
     /** RepairSession id */
-    public final UUID sessionId;
+    public final TimeUUID sessionId;
     public final String keyspace;
     public final String columnFamily;
     /** repairing range  */
     public final Collection<Range<Token>> ranges;
 
-    public RepairJobDesc(UUID parentSessionId, UUID sessionId, String keyspace, String columnFamily, Collection<Range<Token>> ranges)
+    public RepairJobDesc(TimeUUID parentSessionId, TimeUUID sessionId, String keyspace, String columnFamily, Collection<Range<Token>> ranges)
     {
         this.parentSessionId = parentSessionId;
         this.sessionId = sessionId;
@@ -62,6 +67,16 @@
         this.ranges = ranges;
     }
 
+    public UUID determanisticId()
+    {
+        byte[] bytes = getArray(bytes(parentSessionId));
+        bytes = ArrayUtils.addAll(bytes, getArray(bytes(sessionId)));
+        bytes = ArrayUtils.addAll(bytes, keyspace.getBytes(StandardCharsets.UTF_8));
+        bytes = ArrayUtils.addAll(bytes, columnFamily.getBytes(StandardCharsets.UTF_8));
+        bytes = ArrayUtils.addAll(bytes, ranges.toString().getBytes(StandardCharsets.UTF_8));
+        return UUID.nameUUIDFromBytes(bytes);
+    }
+
     @Override
     public String toString()
     {
@@ -102,9 +117,9 @@
         {
             out.writeBoolean(desc.parentSessionId != null);
             if (desc.parentSessionId != null)
-                UUIDSerializer.serializer.serialize(desc.parentSessionId, out, version);
+                desc.parentSessionId.serialize(out);
 
-            UUIDSerializer.serializer.serialize(desc.sessionId, out, version);
+            desc.sessionId.serialize(out);
             out.writeUTF(desc.keyspace);
             out.writeUTF(desc.columnFamily);
             IPartitioner.validate(desc.ranges);
@@ -115,10 +130,10 @@
 
         public RepairJobDesc deserialize(DataInputPlus in, int version) throws IOException
         {
-            UUID parentSessionId = null;
+            TimeUUID parentSessionId = null;
             if (in.readBoolean())
-                parentSessionId = UUIDSerializer.serializer.deserialize(in, version);
-            UUID sessionId = UUIDSerializer.serializer.deserialize(in, version);
+                parentSessionId = TimeUUID.deserialize(in);
+            TimeUUID sessionId = TimeUUID.deserialize(in);
             String keyspace = in.readUTF();
             String columnFamily = in.readUTF();
 
@@ -140,8 +155,8 @@
         {
             int size = TypeSizes.sizeof(desc.parentSessionId != null);
             if (desc.parentSessionId != null)
-                size += UUIDSerializer.serializer.serializedSize(desc.parentSessionId, version);
-            size += UUIDSerializer.serializer.serializedSize(desc.sessionId, version);
+                size += TimeUUID.sizeInBytes();
+            size += TimeUUID.sizeInBytes();
             size += TypeSizes.sizeof(desc.keyspace);
             size += TypeSizes.sizeof(desc.columnFamily);
             size += TypeSizes.sizeof(desc.ranges.size());
diff --git a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java
index 7488f2e..58612f7 100644
--- a/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java
+++ b/src/java/org/apache/cassandra/repair/RepairMessageVerbHandler.java
@@ -28,9 +28,12 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.repair.messages.*;
+import org.apache.cassandra.repair.state.ParticipateState;
+import org.apache.cassandra.repair.state.ValidationState;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.net.Verb.VALIDATION_RSP;
 
@@ -45,12 +48,12 @@
 
     private static final Logger logger = LoggerFactory.getLogger(RepairMessageVerbHandler.class);
 
-    private boolean isIncremental(UUID sessionID)
+    private boolean isIncremental(TimeUUID sessionID)
     {
         return ActiveRepairService.instance.consistent.local.isSessionInProgress(sessionID);
     }
 
-    private PreviewKind previewKind(UUID sessionID)
+    private PreviewKind previewKind(TimeUUID sessionID) throws NoSuchRepairSessionException
     {
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
         return prs != null ? prs.previewKind : PreviewKind.NONE;
@@ -65,12 +68,19 @@
             switch (message.verb())
             {
                 case PREPARE_MSG:
+                {
                     PrepareMessage prepareMessage = (PrepareMessage) message.payload;
                     logger.debug("Preparing, {}", prepareMessage);
-
+                    ParticipateState state = new ParticipateState(message.from(), prepareMessage);
+                    if (!ActiveRepairService.instance.register(state))
+                    {
+                        logger.debug("Duplicate prepare message found for {}", state.id);
+                        return;
+                    }
                     if (!ActiveRepairService.verifyCompactionsPendingThreshold(prepareMessage.parentRepairSession, prepareMessage.previewKind))
                     {
                         // error is logged in verifyCompactionsPendingThreshold
+                        state.phase.fail("Too many pending compactions");
                         sendFailureResponse(message);
                         return;
                     }
@@ -81,8 +91,10 @@
                         ColumnFamilyStore columnFamilyStore = ColumnFamilyStore.getIfExists(tableId);
                         if (columnFamilyStore == null)
                         {
-                            logErrorAndSendFailureResponse(String.format("Table with id %s was dropped during prepare phase of repair",
-                                                                         tableId), message);
+                            String reason = String.format("Table with id %s was dropped during prepare phase of repair",
+                                                          tableId);
+                            state.phase.fail(reason);
+                            logErrorAndSendFailureResponse(reason, message);
                             return;
                         }
                         columnFamilyStores.add(columnFamilyStore);
@@ -92,19 +104,29 @@
                                                                              columnFamilyStores,
                                                                              prepareMessage.ranges,
                                                                              prepareMessage.isIncremental,
-                                                                             prepareMessage.timestamp,
+                                                                             prepareMessage.repairedAt,
                                                                              prepareMessage.isGlobal,
                                                                              prepareMessage.previewKind);
                     MessagingService.instance().send(message.emptyResponse(), message.from());
+                }
                     break;
 
                 case SNAPSHOT_MSG:
+                {
                     logger.debug("Snapshotting {}", desc);
+                    ParticipateState state = ActiveRepairService.instance.participate(desc.parentSessionId);
+                    if (state == null)
+                    {
+                        logErrorAndSendFailureResponse("Unknown repair " + desc.parentSessionId, message);
+                        return;
+                    }
                     final ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(desc.keyspace, desc.columnFamily);
                     if (cfs == null)
                     {
-                        logErrorAndSendFailureResponse(String.format("Table %s.%s was dropped during snapshot phase of repair %s",
-                                                                     desc.keyspace, desc.columnFamily, desc.parentSessionId), message);
+                        String reason = String.format("Table %s.%s was dropped during snapshot phase of repair %s",
+                                                      desc.keyspace, desc.columnFamily, desc.parentSessionId);
+                        state.phase.fail(reason);
+                        logErrorAndSendFailureResponse(reason, message);
                         return;
                     }
 
@@ -121,30 +143,70 @@
                     }
                     logger.debug("Enqueuing response to snapshot request {} to {}", desc.sessionId, message.from());
                     MessagingService.instance().send(message.emptyResponse(), message.from());
+                }
                     break;
 
                 case VALIDATION_REQ:
+                {
                     // notify initiator that the message has been received, allowing this method to take as long as it needs to
                     MessagingService.instance().send(message.emptyResponse(), message.from());
                     ValidationRequest validationRequest = (ValidationRequest) message.payload;
                     logger.debug("Validating {}", validationRequest);
-                    // trigger read-only compaction
-                    ColumnFamilyStore store = ColumnFamilyStore.getIfExists(desc.keyspace, desc.columnFamily);
-                    if (store == null)
+
+                    ParticipateState participate = ActiveRepairService.instance.participate(desc.parentSessionId);
+                    if (participate == null)
                     {
-                        logger.error("Table {}.{} was dropped during snapshot phase of repair {}",
-                                     desc.keyspace, desc.columnFamily, desc.parentSessionId);
-                        MessagingService.instance().send(Message.out(VALIDATION_RSP, new ValidationResponse(desc)), message.from());
+                        logErrorAndSendFailureResponse("Unknown repair " + desc.parentSessionId, message);
                         return;
                     }
 
-                    ActiveRepairService.instance.consistent.local.maybeSetRepairing(desc.parentSessionId);
-                    Validator validator = new Validator(desc, message.from(), validationRequest.nowInSec,
-                                                        isIncremental(desc.parentSessionId), previewKind(desc.parentSessionId));
-                    ValidationManager.instance.submitValidation(store, validator);
+                    ValidationState vState = new ValidationState(desc, message.from());
+                    if (!participate.register(vState))
+                    {
+                        logger.debug("Duplicate validation message found for parent={}, validation={}", participate.id, vState.id);
+                        return;
+                    }
+                    try
+                    {
+                        // trigger read-only compaction
+                        ColumnFamilyStore store = ColumnFamilyStore.getIfExists(desc.keyspace, desc.columnFamily);
+                        if (store == null)
+                        {
+                            logger.error("Table {}.{} was dropped during validation phase of repair {}",
+                                         desc.keyspace, desc.columnFamily, desc.parentSessionId);
+                            vState.phase.fail(String.format("Table %s.%s was dropped", desc.keyspace, desc.columnFamily));
+                            MessagingService.instance().send(Message.out(VALIDATION_RSP, new ValidationResponse(desc)), message.from());
+                            return;
+                        }
+
+                        ActiveRepairService.instance.consistent.local.maybeSetRepairing(desc.parentSessionId);
+                        PreviewKind previewKind;
+                        try
+                        {
+                            previewKind = previewKind(desc.parentSessionId);
+                        }
+                        catch (NoSuchRepairSessionException e)
+                        {
+                            logger.warn("Parent repair session {} has been removed, failing repair", desc.parentSessionId);
+                            vState.phase.fail(e);
+                            MessagingService.instance().send(Message.out(VALIDATION_RSP, new ValidationResponse(desc)), message.from());
+                            return;
+                        }
+
+                        Validator validator = new Validator(vState, validationRequest.nowInSec,
+                                                            isIncremental(desc.parentSessionId), previewKind);
+                        ValidationManager.instance.submitValidation(store, validator);
+                    }
+                    catch (Throwable t)
+                    {
+                        vState.phase.fail(t);
+                        throw t;
+                    }
+                }
                     break;
 
                 case SYNC_REQ:
+                {
                     // notify initiator that the message has been received, allowing this method to take as long as it needs to
                     MessagingService.instance().send(message.emptyResponse(), message.from());
                     // forwarded sync request
@@ -159,13 +221,19 @@
                                                                        request.previewKind,
                                                                        request.asymmetric);
                     task.run();
+                }
                     break;
 
                 case CLEANUP_MSG:
+                {
                     logger.debug("cleaning up repair");
                     CleanupMessage cleanup = (CleanupMessage) message.payload;
+                    ParticipateState state = ActiveRepairService.instance.participate(cleanup.parentRepairSession);
+                    if (state != null)
+                        state.phase.success("Cleanup message recieved");
                     ActiveRepairService.instance.removeParentRepairSession(cleanup.parentRepairSession);
                     MessagingService.instance().send(message.emptyResponse(), message.from());
+                }
                     break;
 
                 case PREPARE_CONSISTENT_REQ:
@@ -211,7 +279,12 @@
         {
             logger.error("Got error, removing parent repair session");
             if (desc != null && desc.parentSessionId != null)
+            {
+                ParticipateState parcipate = ActiveRepairService.instance.participate(desc.parentSessionId);
+                if (parcipate != null)
+                    parcipate.phase.fail(e);
                 ActiveRepairService.instance.removeParentRepairSession(desc.parentSessionId);
+            }
             throw new RuntimeException(e);
         }
     }
diff --git a/src/java/org/apache/cassandra/repair/RepairNotifier.java b/src/java/org/apache/cassandra/repair/RepairNotifier.java
new file mode 100644
index 0000000..977bc4e
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/RepairNotifier.java
@@ -0,0 +1,25 @@
+/*
+ * 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.repair;
+
+public interface RepairNotifier
+{
+    void notification(String message);
+    void notifyError(Throwable error);
+    void notifyProgress(String message);
+}
diff --git a/src/java/org/apache/cassandra/repair/RepairRunnable.java b/src/java/org/apache/cassandra/repair/RepairRunnable.java
index 48a7e36..7607b04 100644
--- a/src/java/org/apache/cassandra/repair/RepairRunnable.java
+++ b/src/java/org/apache/cassandra/repair/RepairRunnable.java
@@ -22,15 +22,11 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -41,92 +37,81 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
+
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.apache.commons.lang3.time.DurationFormatUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.codahale.metrics.Timer;
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.metrics.RepairMetrics;
-import org.apache.cassandra.gms.FailureDetector;
-import org.apache.cassandra.repair.consistent.SyncStatSummary;
-import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RepairException;
+import org.apache.cassandra.gms.FailureDetector;
 import org.apache.cassandra.locator.EndpointsForRange;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.metrics.StorageMetrics;
-import org.apache.cassandra.repair.consistent.CoordinatorSession;
 import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.repair.state.CoordinatorState;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.tracing.TraceKeyspace;
 import org.apache.cassandra.tracing.TraceState;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.messages.ResultMessage;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.DiagnosticSnapshotService;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.Throwables;
 import org.apache.cassandra.utils.WrappedRunnable;
 import org.apache.cassandra.utils.progress.ProgressEvent;
 import org.apache.cassandra.utils.progress.ProgressEventNotifier;
 import org.apache.cassandra.utils.progress.ProgressEventType;
 import org.apache.cassandra.utils.progress.ProgressListener;
 
-public class RepairRunnable implements Runnable, ProgressEventNotifier
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.repair.state.AbstractState.COMPLETE;
+import static org.apache.cassandra.repair.state.AbstractState.INIT;
+import static org.apache.cassandra.service.QueryState.forInternalCalls;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public class RepairRunnable implements Runnable, ProgressEventNotifier, RepairNotifier
 {
     private static final Logger logger = LoggerFactory.getLogger(RepairRunnable.class);
 
+    private static final AtomicInteger THREAD_COUNTER = new AtomicInteger(1);
+
+    public final CoordinatorState state;
     private final StorageService storageService;
-    private final int cmd;
-    private final RepairOption options;
-    private final String keyspace;
 
     private final String tag;
-    private final AtomicInteger progressCounter = new AtomicInteger();
-    private final int totalProgress;
-
-    private final long creationTimeMillis = System.currentTimeMillis();
-    private final UUID parentSession = UUIDGen.getTimeUUID();
 
     private final List<ProgressListener> listeners = new ArrayList<>();
-
-    private static final AtomicInteger threadCounter = new AtomicInteger(1);
     private final AtomicReference<Throwable> firstError = new AtomicReference<>(null);
 
     private TraceState traceState;
 
     public RepairRunnable(StorageService storageService, int cmd, RepairOption options, String keyspace)
     {
+        this.state = new CoordinatorState(cmd, keyspace, options);
         this.storageService = storageService;
-        this.cmd = cmd;
-        this.options = options;
-        this.keyspace = keyspace;
 
         this.tag = "repair:" + cmd;
-        // get valid column families, calculate neighbors, validation, prepare for repair + number of ranges to repair
-        this.totalProgress = 4 + options.getRanges().size();
+        ActiveRepairService.instance.register(state);
     }
 
     @Override
@@ -150,42 +135,63 @@
         }
     }
 
+    @Override
     public void notification(String msg)
     {
         logger.info(msg);
-        fireProgressEvent(new ProgressEvent(ProgressEventType.NOTIFICATION, progressCounter.get(), totalProgress, msg));
+        fireProgressEvent(jmxEvent(ProgressEventType.NOTIFICATION, msg));
     }
 
-    private void skip(String msg)
-    {
-        notification("Repair " + parentSession + " skipped: " + msg);
-        success(msg);
-    }
-
-    private void success(String msg)
-    {
-        fireProgressEvent(new ProgressEvent(ProgressEventType.SUCCESS, progressCounter.get(), totalProgress, msg));
-        ActiveRepairService.instance.recordRepairStatus(cmd, ActiveRepairService.ParentRepairStatus.COMPLETED,
-                                                        ImmutableList.of(msg));
-        complete(null);
-    }
-
+    @Override
     public void notifyError(Throwable error)
     {
         // exception should be ignored
         if (error instanceof SomeRepairFailedException)
             return;
-        logger.error("Repair {} failed:", parentSession, error);
+
+        if (Throwables.anyCauseMatches(error, RepairException::shouldWarn))
+        {
+            logger.warn("Repair {} aborted: {}", state.id, error.getMessage());
+            if (logger.isDebugEnabled())
+                logger.debug("Repair {} aborted: ", state.id, error);
+        }
+        else
+        {
+            logger.error("Repair {} failed:", state.id, error);
+        }
 
         StorageMetrics.repairExceptions.inc();
-        String errorMessage = String.format("Repair command #%d failed with error %s", cmd, error.getMessage());
-        fireProgressEvent(new ProgressEvent(ProgressEventType.ERROR, progressCounter.get(), totalProgress, errorMessage));
+        String errorMessage = String.format("Repair command #%d failed with error %s", state.cmd, error.getMessage());
+        fireProgressEvent(jmxEvent(ProgressEventType.ERROR, errorMessage));
         firstError.compareAndSet(null, error);
 
         // since this can fail, update table only after updating in-memory and notification state
         maybeStoreParentRepairFailure(error);
     }
 
+    @Override
+    public void notifyProgress(String message)
+    {
+        logger.info(message);
+        fireProgressEvent(jmxEvent(ProgressEventType.PROGRESS, message));
+    }
+
+    private void skip(String msg)
+    {
+        state.phase.skip(msg);
+        notification("Repair " + state.id + " skipped: " + msg);
+        success(msg);
+    }
+
+    private void success(String msg)
+    {
+        state.phase.success(msg);
+        fireProgressEvent(jmxEvent(ProgressEventType.SUCCESS, msg));
+        ActiveRepairService.instance.recordRepairStatus(state.cmd, ActiveRepairService.ParentRepairStatus.COMPLETED,
+                                                        ImmutableList.of(msg));
+        complete(null);
+    }
+
     private void fail(String reason)
     {
         if (reason == null)
@@ -193,11 +199,12 @@
             Throwable error = firstError.get();
             reason = error != null ? error.getMessage() : "Some repair failed";
         }
-        String completionMessage = String.format("Repair command #%d finished with error", cmd);
+        state.phase.fail(reason);
+        String completionMessage = String.format("Repair command #%d finished with error", state.cmd);
 
         // Note we rely on the first message being the reason for the failure
         // when inspecting this state from RepairRunner.queryForCompletedRepair
-        ActiveRepairService.instance.recordRepairStatus(cmd, ParentRepairStatus.FAILED,
+        ActiveRepairService.instance.recordRepairStatus(state.cmd, ParentRepairStatus.FAILED,
                                                         ImmutableList.of(reason, completionMessage));
 
         complete(completionMessage);
@@ -205,23 +212,23 @@
 
     private void complete(String msg)
     {
-        long durationMillis = System.currentTimeMillis() - creationTimeMillis;
+        long durationMillis = state.getDurationMillis();
         if (msg == null)
         {
             String duration = DurationFormatUtils.formatDurationWords(durationMillis, true, true);
-            msg = String.format("Repair command #%d finished in %s", cmd, duration);
+            msg = String.format("Repair command #%d finished in %s", state.cmd, duration);
         }
 
-        fireProgressEvent(new ProgressEvent(ProgressEventType.COMPLETE, progressCounter.get(), totalProgress, msg));
-        logger.info(options.getPreviewKind().logPrefix(parentSession) + msg);
+        fireProgressEvent(jmxEvent(ProgressEventType.COMPLETE, msg));
+        logger.info(state.options.getPreviewKind().logPrefix(state.id) + msg);
 
-        ActiveRepairService.instance.removeParentRepairSession(parentSession);
+        ActiveRepairService.instance.removeParentRepairSession(state.id);
         TraceState localState = traceState;
-        if (options.isTraced() && localState != null)
+        if (state.options.isTraced() && localState != null)
         {
             for (ProgressListener listener : listeners)
                 localState.removeProgressListener(listener);
-            // Because DebuggableThreadPoolExecutor#afterExecute and this callback
+            // Because ExecutorPlus#afterExecute and this callback
             // run in a nondeterministic order (within the same thread), the
             // TraceState may have been nulled out at this point. The TraceState
             // should be traceState, so just set it without bothering to check if it
@@ -231,7 +238,7 @@
             Tracing.instance.stopSession();
         }
 
-        Keyspace.open(keyspace).metric.repairTime.update(durationMillis, TimeUnit.MILLISECONDS);
+        Keyspace.open(state.keyspace).metric.repairTime.update(durationMillis, TimeUnit.MILLISECONDS);
     }
 
     public void run()
@@ -253,16 +260,19 @@
 
     private void runMayThrow() throws Exception
     {
-        ActiveRepairService.instance.recordRepairStatus(cmd, ParentRepairStatus.IN_PROGRESS, ImmutableList.of());
+        state.phase.setup();
+        ActiveRepairService.instance.recordRepairStatus(state.cmd, ParentRepairStatus.IN_PROGRESS, ImmutableList.of());
 
         List<ColumnFamilyStore> columnFamilies = getColumnFamilies();
         String[] cfnames = columnFamilies.stream().map(cfs -> cfs.name).toArray(String[]::new);
 
         this.traceState = maybeCreateTraceState(columnFamilies);
-
         notifyStarting();
-
         NeighborsAndRanges neighborsAndRanges = getNeighborsAndRanges();
+        // We test to validate the start JMX notification is seen before we compute neighbors and ranges
+        // but in state (vtable) tracking, we rely on getNeighborsAndRanges to know where we are running repair...
+        // JMX start != state start, its possible we fail in getNeighborsAndRanges and state start is never reached
+        state.phase.start(columnFamilies, neighborsAndRanges);
 
         maybeStoreParentRepairStart(cfnames);
 
@@ -273,85 +283,81 @@
 
     private List<ColumnFamilyStore> getColumnFamilies() throws IOException
     {
-        String[] columnFamilies = options.getColumnFamilies().toArray(new String[options.getColumnFamilies().size()]);
-        Iterable<ColumnFamilyStore> validColumnFamilies = storageService.getValidColumnFamilies(false, false, keyspace, columnFamilies);
-        progressCounter.incrementAndGet();
+        String[] columnFamilies = state.options.getColumnFamilies().toArray(new String[state.options.getColumnFamilies().size()]);
+        Iterable<ColumnFamilyStore> validColumnFamilies = storageService.getValidColumnFamilies(false, false, state.keyspace, columnFamilies);
 
         if (Iterables.isEmpty(validColumnFamilies))
-            throw new SkipRepairException(String.format("%s Empty keyspace, skipping repair: %s", parentSession, keyspace));
+            throw new SkipRepairException(String.format("%s Empty keyspace, skipping repair: %s", state.id, state.keyspace));
         return Lists.newArrayList(validColumnFamilies);
     }
 
     private TraceState maybeCreateTraceState(Iterable<ColumnFamilyStore> columnFamilyStores)
     {
-        if (!options.isTraced())
+        if (!state.options.isTraced())
             return null;
 
         StringBuilder cfsb = new StringBuilder();
         for (ColumnFamilyStore cfs : columnFamilyStores)
             cfsb.append(", ").append(cfs.keyspace.getName()).append(".").append(cfs.name);
 
-        UUID sessionId = Tracing.instance.newSession(Tracing.TraceType.REPAIR);
-        TraceState traceState = Tracing.instance.begin("repair", ImmutableMap.of("keyspace", keyspace, "columnFamilies",
+        TimeUUID sessionId = Tracing.instance.newSession(Tracing.TraceType.REPAIR);
+        TraceState traceState = Tracing.instance.begin("repair", ImmutableMap.of("keyspace", state.keyspace, "columnFamilies",
                                                                                  cfsb.substring(2)));
         traceState.enableActivityNotification(tag);
         for (ProgressListener listener : listeners)
             traceState.addProgressListener(listener);
-        Thread queryThread = createQueryThread(cmd, sessionId);
+        Thread queryThread = createQueryThread(sessionId);
         queryThread.setName("RepairTracePolling");
-        queryThread.start();
         return traceState;
     }
 
     private void notifyStarting()
     {
-        String message = String.format("Starting repair command #%d (%s), repairing keyspace %s with %s", cmd, parentSession, keyspace,
-                                       options);
+        String message = String.format("Starting repair command #%d (%s), repairing keyspace %s with %s", state.cmd, state.id, state.keyspace,
+                                       state.options);
         logger.info(message);
         Tracing.traceRepair(message);
-        fireProgressEvent(new ProgressEvent(ProgressEventType.START, 0, 100, message));
+        fireProgressEvent(jmxEvent(ProgressEventType.START, message));
     }
 
-    private NeighborsAndRanges getNeighborsAndRanges()
+    private NeighborsAndRanges getNeighborsAndRanges() throws RepairException
     {
         Set<InetAddressAndPort> allNeighbors = new HashSet<>();
         List<CommonRange> commonRanges = new ArrayList<>();
 
         //pre-calculate output of getLocalReplicas and pass it to getNeighbors to increase performance and prevent
         //calculation multiple times
-        Iterable<Range<Token>> keyspaceLocalRanges = storageService.getLocalReplicas(keyspace).ranges();
+        Iterable<Range<Token>> keyspaceLocalRanges = storageService.getLocalReplicas(state.keyspace).ranges();
 
-        for (Range<Token> range : options.getRanges())
+        for (Range<Token> range : state.options.getRanges())
         {
-            EndpointsForRange neighbors = ActiveRepairService.getNeighbors(keyspace, keyspaceLocalRanges, range,
-                                                                           options.getDataCenters(),
-                                                                           options.getHosts());
+            EndpointsForRange neighbors = ActiveRepairService.getNeighbors(state.keyspace, keyspaceLocalRanges, range,
+                                                                           state.options.getDataCenters(),
+                                                                           state.options.getHosts());
             if (neighbors.isEmpty())
             {
-                if (options.ignoreUnreplicatedKeyspaces())
+                if (state.options.ignoreUnreplicatedKeyspaces())
                 {
-                    logger.info("{} Found no neighbors for range {} for {} - ignoring since repairing with --ignore-unreplicated-keyspaces", parentSession, range, keyspace);
+                    logger.info("{} Found no neighbors for range {} for {} - ignoring since repairing with --ignore-unreplicated-keyspaces", state.id, range, state.keyspace);
                     continue;
                 }
                 else
                 {
-                    throw new RuntimeException(String.format("Nothing to repair for %s in %s - aborting", range, keyspace));
+                    throw RepairException.warn(String.format("Nothing to repair for %s in %s - aborting", range, state.keyspace));
                 }
             }
             addRangeToNeighbors(commonRanges, range, neighbors);
             allNeighbors.addAll(neighbors.endpoints());
         }
 
-        if (options.ignoreUnreplicatedKeyspaces() && allNeighbors.isEmpty())
+        if (state.options.ignoreUnreplicatedKeyspaces() && allNeighbors.isEmpty())
         {
             throw new SkipRepairException(String.format("Nothing to repair for %s in %s - unreplicated keyspace is ignored since repair was called with --ignore-unreplicated-keyspaces",
-                                                        options.getRanges(),
-                                                        keyspace));
+                                                        state.options.getRanges(),
+                                                        state.keyspace));
         }
 
-        progressCounter.incrementAndGet();
-
-        boolean shouldExcludeDeadParticipants = options.isForcedRepair();
+        boolean shouldExcludeDeadParticipants = state.options.isForcedRepair();
 
         if (shouldExcludeDeadParticipants)
         {
@@ -364,389 +370,93 @@
 
     private void maybeStoreParentRepairStart(String[] cfnames)
     {
-        if (!options.isPreview())
+        if (!state.options.isPreview())
         {
-            SystemDistributedKeyspace.startParentRepair(parentSession, keyspace, cfnames, options);
+            SystemDistributedKeyspace.startParentRepair(state.id, state.keyspace, cfnames, state.options);
         }
     }
 
     private void maybeStoreParentRepairSuccess(Collection<Range<Token>> successfulRanges)
     {
-        if (!options.isPreview())
+        if (!state.options.isPreview())
         {
-            SystemDistributedKeyspace.successfulParentRepair(parentSession, successfulRanges);
+            SystemDistributedKeyspace.successfulParentRepair(state.id, successfulRanges);
         }
     }
 
     private void maybeStoreParentRepairFailure(Throwable error)
     {
-        if (!options.isPreview())
+        if (!state.options.isPreview())
         {
-            SystemDistributedKeyspace.failParentRepair(parentSession, error);
+            SystemDistributedKeyspace.failParentRepair(state.id, error);
         }
     }
 
     private void prepare(List<ColumnFamilyStore> columnFamilies, Set<InetAddressAndPort> allNeighbors, boolean force)
     {
-        try (Timer.Context ignore = Keyspace.open(keyspace).metric.repairPrepareTime.time())
+        state.phase.prepareStart();
+        try (Timer.Context ignore = Keyspace.open(state.keyspace).metric.repairPrepareTime.time())
         {
-            ActiveRepairService.instance.prepareForRepair(parentSession, FBUtilities.getBroadcastAddressAndPort(), allNeighbors, options, force, columnFamilies);
-            progressCounter.incrementAndGet();
+            ActiveRepairService.instance.prepareForRepair(state.id, FBUtilities.getBroadcastAddressAndPort(), allNeighbors, state.options, force, columnFamilies);
         }
+        state.phase.prepareComplete();
     }
 
     private void repair(String[] cfnames, NeighborsAndRanges neighborsAndRanges)
     {
-        if (options.isPreview())
+        RepairTask task;
+        if (state.options.isPreview())
         {
-            previewRepair(parentSession,
-                          creationTimeMillis,
-                          neighborsAndRanges.filterCommonRanges(keyspace, cfnames),
-                          neighborsAndRanges.participants,
-                          cfnames);
+            task = new PreviewRepairTask(state.options, state.keyspace, this, state.id, neighborsAndRanges.filterCommonRanges(state.keyspace, cfnames), cfnames);
         }
-        else if (options.isIncremental())
+        else if (state.options.isIncremental())
         {
-            incrementalRepair(parentSession,
-                              creationTimeMillis,
-                              traceState,
-                              neighborsAndRanges,
-                              neighborsAndRanges.participants,
-                              cfnames);
+            task = new IncrementalRepairTask(state.options, state.keyspace, this, state.id, neighborsAndRanges, cfnames);
         }
         else
         {
-            normalRepair(parentSession,
-                         creationTimeMillis,
-                         traceState,
-                         neighborsAndRanges.filterCommonRanges(keyspace, cfnames),
-                         neighborsAndRanges.participants,
-                         cfnames);
+            task = new NormalRepairTask(state.options, state.keyspace, this, state.id, neighborsAndRanges.filterCommonRanges(state.keyspace, cfnames), cfnames);
         }
-    }
 
-    private void normalRepair(UUID parentSession,
-                              long startTime,
-                              TraceState traceState,
-                              List<CommonRange> commonRanges,
-                              Set<InetAddressAndPort> preparedEndpoints,
-                              String... cfnames)
-    {
-
-        // Set up RepairJob executor for this repair command.
-        ListeningExecutorService executor = createExecutor();
-
-        // Setting the repairedAt time to UNREPAIRED_SSTABLE causes the repairedAt times to be preserved across streamed sstables
-        final ListenableFuture<List<RepairSessionResult>> allSessions = submitRepairSessions(parentSession, false, executor, commonRanges, cfnames);
-
-        // After all repair sessions completes(successful or not),
-        // run anticompaction if necessary and send finish notice back to client
-        final Collection<Range<Token>> successfulRanges = new ArrayList<>();
-        final AtomicBoolean hasFailure = new AtomicBoolean();
-        ListenableFuture repairResult = Futures.transformAsync(allSessions, new AsyncFunction<List<RepairSessionResult>, Object>()
-        {
-            @SuppressWarnings("unchecked")
-            public ListenableFuture apply(List<RepairSessionResult> results)
+        ExecutorPlus executor = createExecutor();
+        state.phase.repairSubmitted();
+        Future<CoordinatedRepairResult> f = task.perform(executor);
+        f.addCallback((result, failure) -> {
+            state.phase.repairCompleted();
+            try
             {
-                logger.debug("Repair result: {}", results);
-                // filter out null(=failed) results and get successful ranges
-                for (RepairSessionResult sessionResult : results)
+                if (failure != null)
                 {
-                    if (sessionResult != null)
-                    {
-                        // don't record successful repair if we had to skip ranges
-                        if (!sessionResult.skippedReplicas)
-                        {
-                            successfulRanges.addAll(sessionResult.ranges);
-                        }
-                    }
-                    else
-                    {
-                        hasFailure.compareAndSet(false, true);
-                    }
-                }
-                return Futures.immediateFuture(null);
-            }
-        }, MoreExecutors.directExecutor());
-        Futures.addCallback(repairResult,
-                            new RepairCompleteCallback(parentSession,
-                                                       successfulRanges,
-                                                       preparedEndpoints,
-                                                       startTime,
-                                                       traceState,
-                                                       hasFailure,
-                                                       executor),
-                            MoreExecutors.directExecutor());
-    }
-
-    private void incrementalRepair(UUID parentSession,
-                                   long startTime,
-                                   TraceState traceState,
-                                   NeighborsAndRanges neighborsAndRanges,
-                                   Set<InetAddressAndPort> preparedEndpoints,
-                                   String... cfnames)
-    {
-        // the local node also needs to be included in the set of participants, since coordinator sessions aren't persisted
-        Set<InetAddressAndPort> allParticipants = ImmutableSet.<InetAddressAndPort>builder()
-                                                  .addAll(neighborsAndRanges.participants)
-                                                  .add(FBUtilities.getBroadcastAddressAndPort())
-                                                  .build();
-        // Not necessary to include self for filtering. The common ranges only contains neighbhor node endpoints.
-        List<CommonRange> allRanges = neighborsAndRanges.filterCommonRanges(keyspace, cfnames);
-
-        CoordinatorSession coordinatorSession = ActiveRepairService.instance.consistent.coordinated.registerSession(parentSession, allParticipants, neighborsAndRanges.shouldExcludeDeadParticipants);
-        ListeningExecutorService executor = createExecutor();
-        AtomicBoolean hasFailure = new AtomicBoolean(false);
-        ListenableFuture repairResult = coordinatorSession.execute(() -> submitRepairSessions(parentSession, true, executor, allRanges, cfnames),
-                                                                   hasFailure);
-        Collection<Range<Token>> ranges = new HashSet<>();
-        for (Collection<Range<Token>> range : Iterables.transform(allRanges, cr -> cr.ranges))
-        {
-            ranges.addAll(range);
-        }
-        Futures.addCallback(repairResult,
-                            new RepairCompleteCallback(parentSession, ranges, preparedEndpoints, startTime, traceState, hasFailure, executor),
-                            MoreExecutors.directExecutor());
-    }
-
-    private void previewRepair(UUID parentSession,
-                               long startTime,
-                               List<CommonRange> commonRanges,
-                               Set<InetAddressAndPort> preparedEndpoints,
-                               String... cfnames)
-    {
-
-        logger.debug("Starting preview repair for {}", parentSession);
-        // Set up RepairJob executor for this repair command.
-        ListeningExecutorService executor = createExecutor();
-
-        final ListenableFuture<List<RepairSessionResult>> allSessions = submitRepairSessions(parentSession, false, executor, commonRanges, cfnames);
-
-        Futures.addCallback(allSessions, new FutureCallback<List<RepairSessionResult>>()
-        {
-            public void onSuccess(List<RepairSessionResult> results)
-            {
-                try
-                {
-                    if (results == null || results.stream().anyMatch(s -> s == null))
-                    {
-                        // something failed
-                        fail(null);
-                        return;
-                    }
-                    PreviewKind previewKind = options.getPreviewKind();
-                    Preconditions.checkState(previewKind != PreviewKind.NONE, "Preview is NONE");
-                    SyncStatSummary summary = new SyncStatSummary(true);
-                    summary.consumeSessionResults(results);
-
-                    final String message;
-                    if (summary.isEmpty())
-                    {
-                        message = previewKind == PreviewKind.REPAIRED ? "Repaired data is in sync" : "Previewed data was in sync";
-                    }
-                    else
-                    {
-                        message = (previewKind == PreviewKind.REPAIRED ? "Repaired data is inconsistent\n" : "Preview complete\n") + summary.toString();
-                        RepairMetrics.previewFailures.inc();
-                        if (previewKind == PreviewKind.REPAIRED)
-                            maybeSnapshotReplicas(parentSession, keyspace, results);
-                    }
-                    notification(message);
-
-                    success("Repair preview completed successfully");
-                    ActiveRepairService.instance.cleanUp(parentSession, preparedEndpoints);
-                }
-                catch (Throwable t)
-                {
-                    logger.error("Error completing preview repair", t);
-                    onFailure(t);
-                }
-                finally
-                {
-                    executor.shutdown();
-                }
-            }
-
-            public void onFailure(Throwable t)
-            {
-                notifyError(t);
-                fail("Error completing preview repair: " + t.getMessage());
-                executor.shutdown();
-            }
-        }, MoreExecutors.directExecutor());
-    }
-
-    private void maybeSnapshotReplicas(UUID parentSession, String keyspace, List<RepairSessionResult> results)
-    {
-        if (!DatabaseDescriptor.snapshotOnRepairedDataMismatch())
-            return;
-
-        try
-        {
-            Set<String> mismatchingTables = new HashSet<>();
-            Set<InetAddressAndPort> nodes = new HashSet<>();
-            for (RepairSessionResult sessionResult : results)
-            {
-                for (RepairResult repairResult : emptyIfNull(sessionResult.repairJobResults))
-                {
-                    for (SyncStat stat : emptyIfNull(repairResult.stats))
-                    {
-                        if (stat.numberOfDifferences > 0)
-                            mismatchingTables.add(repairResult.desc.columnFamily);
-                        // snapshot all replicas, even if they don't have any differences
-                        nodes.add(stat.nodes.coordinator);
-                        nodes.add(stat.nodes.peer);
-                    }
-                }
-            }
-
-            String snapshotName = DiagnosticSnapshotService.getSnapshotName(DiagnosticSnapshotService.REPAIRED_DATA_MISMATCH_SNAPSHOT_PREFIX);
-            for (String table : mismatchingTables)
-            {
-                // we can just check snapshot existence locally since the repair coordinator is always a replica (unlike in the read case)
-                if (!Keyspace.open(keyspace).getColumnFamilyStore(table).snapshotExists(snapshotName))
-                {
-                    logger.info("{} Snapshotting {}.{} for preview repair mismatch with tag {} on instances {}",
-                                options.getPreviewKind().logPrefix(parentSession),
-                                keyspace, table, snapshotName, nodes);
-                    DiagnosticSnapshotService.repairedDataMismatch(Keyspace.open(keyspace).getColumnFamilyStore(table).metadata(), nodes);
+                    notifyError(failure);
+                    fail(failure.getMessage());
                 }
                 else
                 {
-                    logger.info("{} Not snapshotting {}.{} - snapshot {} exists",
-                                options.getPreviewKind().logPrefix(parentSession),
-                                keyspace, table, snapshotName);
+                    maybeStoreParentRepairSuccess(result.successfulRanges);
+                    if (result.hasFailed())
+                    {
+                        fail(null);
+                    }
+                    else
+                    {
+                        success(task.successMessage());
+                        ActiveRepairService.instance.cleanUp(state.id, neighborsAndRanges.participants);
+                    }
                 }
             }
-        }
-        catch (Exception e)
-        {
-            logger.error("{} Failed snapshotting replicas", options.getPreviewKind().logPrefix(parentSession), e);
-        }
-    }
-
-    private static <T> Iterable<T> emptyIfNull(Iterable<T> iter)
-    {
-        if (iter == null)
-            return Collections.emptyList();
-        return iter;
-    }
-
-    private ListenableFuture<List<RepairSessionResult>> submitRepairSessions(UUID parentSession,
-                                                                             boolean isIncremental,
-                                                                             ListeningExecutorService executor,
-                                                                             List<CommonRange> commonRanges,
-                                                                             String... cfnames)
-    {
-        List<ListenableFuture<RepairSessionResult>> futures = new ArrayList<>(options.getRanges().size());
-
-        for (CommonRange commonRange : commonRanges)
-        {
-            logger.info("Starting RepairSession for {}", commonRange);
-            RepairSession session = ActiveRepairService.instance.submitRepairSession(parentSession,
-                                                                                     commonRange,
-                                                                                     keyspace,
-                                                                                     options.getParallelism(),
-                                                                                     isIncremental,
-                                                                                     options.isPullRepair(),
-                                                                                     options.getPreviewKind(),
-                                                                                     options.optimiseStreams(),
-                                                                                     executor,
-                                                                                     cfnames);
-            if (session == null)
-                continue;
-            Futures.addCallback(session, new RepairSessionCallback(session), MoreExecutors.directExecutor());
-            futures.add(session);
-        }
-        return Futures.successfulAsList(futures);
-    }
-
-    private ListeningExecutorService createExecutor()
-    {
-        return MoreExecutors.listeningDecorator(new JMXEnabledThreadPoolExecutor(options.getJobThreads(),
-                                                                                 Integer.MAX_VALUE,
-                                                                                 TimeUnit.SECONDS,
-                                                                                 new LinkedBlockingQueue<>(),
-                                                                                 new NamedThreadFactory("Repair#" + cmd),
-                                                                                 "internal"));
-    }
-
-    private class RepairSessionCallback implements FutureCallback<RepairSessionResult>
-    {
-        private final RepairSession session;
-
-        public RepairSessionCallback(RepairSession session)
-        {
-            this.session = session;
-        }
-
-        public void onSuccess(RepairSessionResult result)
-        {
-            String message = String.format("Repair session %s for range %s finished", session.getId(),
-                                           session.ranges().toString());
-            logger.info(message);
-            fireProgressEvent(new ProgressEvent(ProgressEventType.PROGRESS,
-                                                progressCounter.incrementAndGet(),
-                                                totalProgress,
-                                                message));
-        }
-
-        public void onFailure(Throwable t)
-        {
-            String message = String.format("Repair session %s for range %s failed with error %s",
-                                           session.getId(), session.ranges().toString(), t.getMessage());
-            notifyError(new RuntimeException(message, t));
-        }
-    }
-
-    private class RepairCompleteCallback implements FutureCallback<Object>
-    {
-        final UUID parentSession;
-        final Collection<Range<Token>> successfulRanges;
-        final Set<InetAddressAndPort> preparedEndpoints;
-        final long startTime;
-        final TraceState traceState;
-        final AtomicBoolean hasFailure;
-        final ExecutorService executor;
-
-        public RepairCompleteCallback(UUID parentSession,
-                                      Collection<Range<Token>> successfulRanges,
-                                      Set<InetAddressAndPort> preparedEndpoints,
-                                      long startTime,
-                                      TraceState traceState,
-                                      AtomicBoolean hasFailure,
-                                      ExecutorService executor)
-        {
-            this.parentSession = parentSession;
-            this.successfulRanges = successfulRanges;
-            this.preparedEndpoints = preparedEndpoints;
-            this.startTime = startTime;
-            this.traceState = traceState;
-            this.hasFailure = hasFailure;
-            this.executor = executor;
-        }
-
-        public void onSuccess(Object result)
-        {
-            maybeStoreParentRepairSuccess(successfulRanges);
-            if (hasFailure.get())
+            finally
             {
-                fail(null);
+                executor.shutdown();
             }
-            else
-            {
-                success("Repair completed successfully");
-                ActiveRepairService.instance.cleanUp(parentSession, preparedEndpoints);
-            }
-            executor.shutdown();
-        }
+        });
+    }
 
-        public void onFailure(Throwable t)
-        {
-            notifyError(t);
-            fail(t.getMessage());
-            executor.shutdown();
-        }
+    private ExecutorPlus createExecutor()
+    {
+        return executorFactory()
+                .localAware()
+                .withJmxInternal()
+                .pooled("Repair#" + state.cmd, state.options.getJobThreads());
     }
 
     private static void addRangeToNeighbors(List<CommonRange> neighborRangeList, Range<Token> range, EndpointsForRange neighbors)
@@ -768,9 +478,9 @@
         neighborRangeList.add(new CommonRange(endpoints, transEndpoints, ranges));
     }
 
-    private Thread createQueryThread(final int cmd, final UUID sessionId)
+    private Thread createQueryThread(final TimeUUID sessionId)
     {
-        return NamedThreadFactory.createThread(new WrappedRunnable()
+        return executorFactory().startThread("Repair-Runnable-" + THREAD_COUNTER.incrementAndGet(), new WrappedRunnable()
         {
             // Query events within a time interval that overlaps the last by one second. Ignore duplicates. Ignore local traces.
             // Wake up upon local trace activity. Query when notified of trace activity with a timeout that doubles every two timeouts.
@@ -784,14 +494,14 @@
                 String query = String.format(format, SchemaConstants.TRACE_KEYSPACE_NAME, TraceKeyspace.EVENTS);
                 SelectStatement statement = (SelectStatement) QueryProcessor.parseStatement(query).prepare(ClientState.forInternalCalls());
 
-                ByteBuffer sessionIdBytes = ByteBufferUtil.bytes(sessionId);
+                ByteBuffer sessionIdBytes = sessionId.toBytes();
                 InetAddressAndPort source = FBUtilities.getBroadcastAddressAndPort();
 
                 HashSet<UUID>[] seen = new HashSet[]{ new HashSet<>(), new HashSet<>() };
                 int si = 0;
                 UUID uuid;
 
-                long tlast = System.currentTimeMillis(), tcur;
+                long tlast = currentTimeMillis(), tcur;
 
                 TraceState.Status status;
                 long minWaitMillis = 125;
@@ -811,12 +521,12 @@
                         timeout = minWaitMillis;
                         shouldDouble = false;
                     }
-                    ByteBuffer tminBytes = ByteBufferUtil.bytes(UUIDGen.minTimeUUID(tlast - 1000));
-                    ByteBuffer tmaxBytes = ByteBufferUtil.bytes(UUIDGen.maxTimeUUID(tcur = System.currentTimeMillis()));
+                    ByteBuffer tminBytes = TimeUUID.minAtUnixMillis(tlast - 1000).toBytes();
+                    ByteBuffer tmaxBytes = TimeUUID.maxAtUnixMillis(tcur = currentTimeMillis()).toBytes();
                     QueryOptions options = QueryOptions.forInternalCalls(ConsistencyLevel.ONE, Lists.newArrayList(sessionIdBytes,
                                                                                                                   tminBytes,
                                                                                                                   tmaxBytes));
-                    ResultMessage.Rows rows = statement.execute(QueryState.forInternalCalls(), options, System.nanoTime());
+                    ResultMessage.Rows rows = statement.execute(forInternalCalls(), options, nanoTime());
                     UntypedResultSet result = UntypedResultSet.create(rows.result);
 
                     for (UntypedResultSet.Row r : result)
@@ -840,7 +550,14 @@
                     seen[si].clear();
                 }
             }
-        }, "Repair-Runnable-" + threadCounter.incrementAndGet());
+        });
+    }
+
+    private ProgressEvent jmxEvent(ProgressEventType type, String msg)
+    {
+        int length = CoordinatorState.State.values().length + 1; // +1 to include completed state
+        int currentState = state.getCurrentState();
+        return new ProgressEvent(type, currentState == INIT ? 0 : currentState == COMPLETE ? length : currentState, length, msg);
     }
 
     private static final class SkipRepairException extends RuntimeException
@@ -851,13 +568,13 @@
         }
     }
 
-    static final class NeighborsAndRanges
+    public static final class NeighborsAndRanges
     {
-        private final boolean shouldExcludeDeadParticipants;
-        private final Set<InetAddressAndPort> participants;
-        private final List<CommonRange> commonRanges;
+        final boolean shouldExcludeDeadParticipants;
+        public final Set<InetAddressAndPort> participants;
+        public final List<CommonRange> commonRanges;
 
-        NeighborsAndRanges(boolean shouldExcludeDeadParticipants, Set<InetAddressAndPort> participants, List<CommonRange> commonRanges)
+        public NeighborsAndRanges(boolean shouldExcludeDeadParticipants, Set<InetAddressAndPort> participants, List<CommonRange> commonRanges)
         {
             this.shouldExcludeDeadParticipants = shouldExcludeDeadParticipants;
             this.participants = participants;
@@ -869,7 +586,7 @@
          * and exludes ranges left without any participants
          * When not in the force mode, no-op.
          */
-        List<CommonRange> filterCommonRanges(String keyspace, String[] tableNames)
+        public List<CommonRange> filterCommonRanges(String keyspace, String[] tableNames)
         {
             if (!shouldExcludeDeadParticipants)
             {
diff --git a/src/java/org/apache/cassandra/repair/RepairSession.java b/src/java/org/apache/cassandra/repair/RepairSession.java
index 692cdcf..6fb455b 100644
--- a/src/java/org/apache/cassandra/repair/RepairSession.java
+++ b/src/java/org/apache/cassandra/repair/RepairSession.java
@@ -18,7 +18,13 @@
 package org.apache.cassandra.repair;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.TimeUnit;
@@ -27,20 +33,26 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.collect.Lists;
 import com.google.common.util.concurrent.*;
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.repair.state.SessionState;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RepairException;
 import org.apache.cassandra.gms.*;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.repair.consistent.ConsistentSession;
 import org.apache.cassandra.repair.consistent.LocalSession;
 import org.apache.cassandra.repair.consistent.LocalSessions;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.SessionSummary;
@@ -48,6 +60,8 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MerkleTrees;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.Throwables;
+import org.apache.cassandra.utils.concurrent.Future;
 
 /**
  * Coordinates the (active) repair of a list of non overlapping token ranges.
@@ -56,8 +70,11 @@
  * of column families. For each of the column family to repair, RepairSession
  * creates a {@link RepairJob} that handles the repair of that CF.
  *
- * A given RepairJob has the 2 main phases:
+ * A given RepairJob has the 3 main phases:
  * <ol>
+ *   <li>
+ *     Paxos repair: unfinished paxos operations in the range/keyspace/table are first completed
+ *   </li>
  *   <li>Validation phase: the job requests merkle trees from each of the replica involves
  *      ({@link org.apache.cassandra.repair.ValidationTask}) and waits until all trees are received (in
  *      validationComplete()).
@@ -84,24 +101,21 @@
  * Similarly, if a job is sequential, it will handle one SymmetricSyncTask at a time, but will handle
  * all of them in parallel otherwise.
  */
-public class RepairSession extends AbstractFuture<RepairSessionResult> implements IEndpointStateChangeSubscriber,
+public class RepairSession extends AsyncFuture<RepairSessionResult> implements IEndpointStateChangeSubscriber,
                                                                                   IFailureDetectionEventListener,
                                                                                   LocalSessions.Listener
 {
     private static final Logger logger = LoggerFactory.getLogger(RepairSession.class);
 
-    public final UUID parentRepairSession;
-    /** Repair session ID */
-    private final UUID id;
-    public final String keyspace;
-    private final String[] cfnames;
+    public final SessionState state;
     public final RepairParallelism parallelismDegree;
     public final boolean pullRepair;
 
     /** Range to repair */
-    public final CommonRange commonRange;
     public final boolean isIncremental;
     public final PreviewKind previewKind;
+    public final boolean repairPaxos;
+    public final boolean paxosOnly;
 
     private final AtomicBoolean isFailed = new AtomicBoolean(false);
 
@@ -111,7 +125,7 @@
     private final ConcurrentMap<Pair<RepairJobDesc, SyncNodePair>, CompletableRemoteSyncTask> syncingTasks = new ConcurrentHashMap<>();
 
     // Tasks(snapshot, validate request, differencing, ...) are run on taskExecutor
-    public final ListeningExecutorService taskExecutor;
+    public final ExecutorPlus taskExecutor;
     public final boolean optimiseStreams;
 
     private volatile boolean terminated = false;
@@ -119,15 +133,15 @@
     /**
      * Create new repair session.
      * @param parentRepairSession the parent sessions id
-     * @param id this sessions id
      * @param commonRange ranges to repair
      * @param keyspace name of keyspace
      * @param parallelismDegree specifies the degree of parallelism when calculating the merkle trees
      * @param pullRepair true if the repair should be one way (from remote host to this host and only applicable between two hosts--see RepairOption)
+     * @param repairPaxos true if incomplete paxos operations should be completed as part of repair
+     * @param paxosOnly true if we should only complete paxos operations, not run a normal repair
      * @param cfnames names of columnfamilies
      */
-    public RepairSession(UUID parentRepairSession,
-                         UUID id,
+    public RepairSession(TimeUUID parentRepairSession,
                          CommonRange commonRange,
                          String keyspace,
                          RepairParallelism parallelismDegree,
@@ -135,41 +149,40 @@
                          boolean pullRepair,
                          PreviewKind previewKind,
                          boolean optimiseStreams,
+                         boolean repairPaxos,
+                         boolean paxosOnly,
                          String... cfnames)
     {
+        this.repairPaxos = repairPaxos;
+        this.paxosOnly = paxosOnly;
         assert cfnames.length > 0 : "Repairing no column families seems pointless, doesn't it";
-
-        this.parentRepairSession = parentRepairSession;
-        this.id = id;
+        this.state = new SessionState(parentRepairSession, keyspace, cfnames, commonRange);
         this.parallelismDegree = parallelismDegree;
-        this.keyspace = keyspace;
-        this.cfnames = cfnames;
-        this.commonRange = commonRange;
         this.isIncremental = isIncremental;
         this.previewKind = previewKind;
         this.pullRepair = pullRepair;
         this.optimiseStreams = optimiseStreams;
-        this.taskExecutor = MoreExecutors.listeningDecorator(createExecutor());
+        this.taskExecutor = createExecutor();
     }
 
-    protected DebuggableThreadPoolExecutor createExecutor()
+    protected ExecutorPlus createExecutor()
     {
-        return DebuggableThreadPoolExecutor.createCachedThreadpoolWithMaxSize("RepairJobTask");
+        return ExecutorFactory.Global.executorFactory().pooled("RepairJobTask", Integer.MAX_VALUE);
     }
 
-    public UUID getId()
+    public TimeUUID getId()
     {
-        return id;
+        return state.id;
     }
 
     public Collection<Range<Token>> ranges()
     {
-        return commonRange.ranges;
+        return state.commonRange.ranges;
     }
 
     public Collection<InetAddressAndPort> endpoints()
     {
-        return commonRange.endpoints;
+        return state.commonRange.endpoints;
     }
 
     public void trackValidationCompletion(Pair<RepairJobDesc, InetAddressAndPort> key, ValidationTask task)
@@ -194,7 +207,12 @@
         ValidationTask task = validating.remove(Pair.create(desc, endpoint));
         if (task == null)
         {
-            assert terminated;
+            assert terminated : "The repair session should be terminated if the validation we're completing no longer exists.";
+            
+            // The trees may be off-heap, and will therefore need to be released.
+            if (trees != null)
+                trees.release();
+            
             return;
         }
 
@@ -235,7 +253,7 @@
     {
         StringBuilder sb = new StringBuilder();
         sb.append(FBUtilities.getBroadcastAddressAndPort());
-        for (InetAddressAndPort ep : commonRange.endpoints)
+        for (InetAddressAndPort ep : state.commonRange.endpoints)
             sb.append(", ").append(ep);
         return sb.toString();
     }
@@ -248,68 +266,74 @@
      *
      * @param executor Executor to run validation
      */
-    @SuppressWarnings("UnstableApiUsage")
-    public void start(ListeningExecutorService executor)
+    public void start(ExecutorPlus executor)
     {
+        state.phase.start();
         String message;
         if (terminated)
             return;
 
         logger.info("{} parentSessionId = {}: new session: will sync {} on range {} for {}.{}",
-                    previewKind.logPrefix(getId()), parentRepairSession, repairedNodes(), commonRange, keyspace, Arrays.toString(cfnames));
-        Tracing.traceRepair("Syncing range {}", commonRange);
-        if (!previewKind.isPreview())
+                    previewKind.logPrefix(getId()), state.parentRepairSession, repairedNodes(), state.commonRange, state.keyspace, Arrays.toString(state.cfnames));
+        Tracing.traceRepair("Syncing range {}", state.commonRange);
+        if (!previewKind.isPreview() && !paxosOnly)
         {
-            SystemDistributedKeyspace.startRepairs(getId(), parentRepairSession, keyspace, cfnames, commonRange);
+            SystemDistributedKeyspace.startRepairs(getId(), state.parentRepairSession, state.keyspace, state.cfnames, state.commonRange);
         }
 
-        if (commonRange.endpoints.isEmpty())
+        if (state.commonRange.endpoints.isEmpty())
         {
-            logger.info("{} {}", previewKind.logPrefix(getId()), message = String.format("No neighbors to repair with on range %s: session completed", commonRange));
+            logger.info("{} {}", previewKind.logPrefix(getId()), message = String.format("No neighbors to repair with on range %s: session completed", state.commonRange));
+            state.phase.skip(message);
             Tracing.traceRepair(message);
-            set(new RepairSessionResult(id, keyspace, commonRange.ranges, Lists.<RepairResult>newArrayList(), commonRange.hasSkippedReplicas));
+            trySuccess(new RepairSessionResult(state.id, state.keyspace, state.commonRange.ranges, Lists.<RepairResult>newArrayList(), state.commonRange.hasSkippedReplicas));
             if (!previewKind.isPreview())
             {
-                SystemDistributedKeyspace.failRepairs(getId(), keyspace, cfnames, new RuntimeException(message));
+                SystemDistributedKeyspace.failRepairs(getId(), state.keyspace, state.cfnames, new RuntimeException(message));
             }
             return;
         }
 
         // Checking all nodes are live
-        for (InetAddressAndPort endpoint : commonRange.endpoints)
+        for (InetAddressAndPort endpoint : state.commonRange.endpoints)
         {
-            if (!FailureDetector.instance.isAlive(endpoint) && !commonRange.hasSkippedReplicas)
+            if (!FailureDetector.instance.isAlive(endpoint) && !state.commonRange.hasSkippedReplicas)
             {
                 message = String.format("Cannot proceed on repair because a neighbor (%s) is dead: session failed", endpoint);
+                state.phase.fail(message);
                 logger.error("{} {}", previewKind.logPrefix(getId()), message);
                 Exception e = new IOException(message);
-                setException(e);
+                tryFailure(e);
                 if (!previewKind.isPreview())
                 {
-                    SystemDistributedKeyspace.failRepairs(getId(), keyspace, cfnames, e);
+                    SystemDistributedKeyspace.failRepairs(getId(), state.keyspace, state.cfnames, e);
                 }
                 return;
             }
         }
 
         // Create and submit RepairJob for each ColumnFamily
-        List<ListenableFuture<RepairResult>> jobs = new ArrayList<>(cfnames.length);
-        for (String cfname : cfnames)
+        state.phase.jobsSubmitted();
+        List<Future<RepairResult>> jobs = new ArrayList<>(state.cfnames.length);
+        for (String cfname : state.cfnames)
         {
             RepairJob job = new RepairJob(this, cfname);
+            state.register(job.state);
             executor.execute(job);
             jobs.add(job);
         }
 
         // When all RepairJobs are done without error, cleanup and set the final result
-        Futures.addCallback(Futures.allAsList(jobs), new FutureCallback<List<RepairResult>>()
+        FBUtilities.allOf(jobs).addCallback(new FutureCallback<List<RepairResult>>()
         {
             public void onSuccess(List<RepairResult> results)
             {
+                state.phase.success();
                 // this repair session is completed
                 logger.info("{} {}", previewKind.logPrefix(getId()), "Session completed successfully");
-                Tracing.traceRepair("Completed sync of range {}", commonRange);
-                set(new RepairSessionResult(id, keyspace, commonRange.ranges, results, commonRange.hasSkippedReplicas));
+                Tracing.traceRepair("Completed sync of range {}", state.commonRange);
+                trySuccess(new RepairSessionResult(state.id, state.keyspace, state.commonRange.ranges, results, state.commonRange.hasSkippedReplicas));
+
                 taskExecutor.shutdown();
                 // mark this session as terminated
                 terminate();
@@ -318,7 +342,12 @@
 
             public void onFailure(Throwable t)
             {
-                logger.error("{} Session completed with the following error", previewKind.logPrefix(getId()), t);
+                state.phase.fail(t);
+                String msg = "{} Session completed with the following error";
+                if (Throwables.anyCauseMatches(t, RepairException::shouldWarn))
+                    logger.warn(msg+ ": {}", previewKind.logPrefix(getId()), t.getMessage());
+                else
+                    logger.error(msg, previewKind.logPrefix(getId()), t);
                 Tracing.traceRepair("Session completed with the following error: {}", t);
                 forceShutdown(t);
             }
@@ -339,7 +368,7 @@
      */
     public void forceShutdown(Throwable reason)
     {
-        setException(reason);
+        tryFailure(reason);
         taskExecutor.shutdown();
         terminate();
         awaitTaskExecutorTermination();
@@ -372,7 +401,7 @@
 
     public void convict(InetAddressAndPort endpoint, double phi)
     {
-        if (!commonRange.endpoints.contains(endpoint))
+        if (!state.commonRange.endpoints.contains(endpoint))
             return;
 
         // We want a higher confidence in the failure detection than usual because failing a repair wrongly has a high cost.
@@ -401,8 +430,8 @@
             {
                 if (range.intersects(ranges()))
                 {
-                    logger.error("{} An intersecting incremental repair with session id = {} finished, preview repair might not be accurate", previewKind.logPrefix(getId()), session.sessionID);
-                    forceShutdown(new Exception("An incremental repair with session id "+session.sessionID+" finished during this preview repair runtime"));
+                    logger.warn("{} An intersecting incremental repair with session id = {} finished, preview repair might not be accurate", previewKind.logPrefix(getId()), session.sessionID);
+                    forceShutdown(RepairException.warn("An incremental repair with session id "+session.sessionID+" finished during this preview repair runtime"));
                     return;
                 }
             }
@@ -411,10 +440,10 @@
 
     private boolean includesTables(Set<TableId> tableIds)
     {
-        Keyspace ks = Keyspace.open(keyspace);
+        Keyspace ks = Keyspace.open(state.keyspace);
         if (ks != null)
         {
-            for (String table : cfnames)
+            for (String table : state.cfnames)
             {
                 ColumnFamilyStore cfs = ks.getColumnFamilyStore(table);
                 if (tableIds.contains(cfs.metadata.id))
diff --git a/src/java/org/apache/cassandra/repair/RepairSessionResult.java b/src/java/org/apache/cassandra/repair/RepairSessionResult.java
index 491ab2f..6217ef4 100644
--- a/src/java/org/apache/cassandra/repair/RepairSessionResult.java
+++ b/src/java/org/apache/cassandra/repair/RepairSessionResult.java
@@ -18,23 +18,23 @@
 package org.apache.cassandra.repair;
 
 import java.util.Collection;
-import java.util.UUID;
 
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Repair session result
  */
 public class RepairSessionResult
 {
-    public final UUID sessionId;
+    public final TimeUUID sessionId;
     public final String keyspace;
     public final Collection<Range<Token>> ranges;
     public final Collection<RepairResult> repairJobResults;
     public final boolean skippedReplicas;
 
-    public RepairSessionResult(UUID sessionId, String keyspace, Collection<Range<Token>> ranges, Collection<RepairResult> repairJobResults, boolean skippedReplicas)
+    public RepairSessionResult(TimeUUID sessionId, String keyspace, Collection<Range<Token>> ranges, Collection<RepairResult> repairJobResults, boolean skippedReplicas)
     {
         this.sessionId = sessionId;
         this.keyspace = keyspace;
diff --git a/src/java/org/apache/cassandra/repair/RepairTask.java b/src/java/org/apache/cassandra/repair/RepairTask.java
new file mode 100644
index 0000000..dc71d6e
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/RepairTask.java
@@ -0,0 +1,48 @@
+/*
+ * 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.repair;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+
+public interface RepairTask
+{
+    String name();
+
+    default String successMessage()
+    {
+        return name() + " completed successfully";
+    }
+
+    Future<CoordinatedRepairResult> performUnsafe(ExecutorPlus executor) throws Exception;
+
+    default Future<CoordinatedRepairResult> perform(ExecutorPlus executor)
+    {
+        try
+        {
+            return performUnsafe(executor);
+        }
+        catch (Exception | Error e)
+        {
+            JVMStabilityInspector.inspectThrowable(e);
+            return ImmediateFuture.failure(e);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/SnapshotTask.java b/src/java/org/apache/cassandra/repair/SnapshotTask.java
index 46532fb5..7f5dcd7 100644
--- a/src/java/org/apache/cassandra/repair/SnapshotTask.java
+++ b/src/java/org/apache/cassandra/repair/SnapshotTask.java
@@ -19,21 +19,20 @@
 
 import java.util.concurrent.RunnableFuture;
 
-import com.google.common.util.concurrent.AbstractFuture;
-
 import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.repair.messages.SnapshotMessage;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
 
 import static org.apache.cassandra.net.Verb.SNAPSHOT_MSG;
 
 /**
  * SnapshotTask is a task that sends snapshot request.
  */
-public class SnapshotTask extends AbstractFuture<InetAddressAndPort> implements RunnableFuture<InetAddressAndPort>
+public class SnapshotTask extends AsyncFuture<InetAddressAndPort> implements RunnableFuture<InetAddressAndPort>
 {
     private final RepairJobDesc desc;
     private final InetAddressAndPort endpoint;
@@ -54,7 +53,7 @@
     /**
      * Callback for snapshot request. Run on INTERNAL_RESPONSE stage.
      */
-    static class SnapshotCallback implements RequestCallback
+    static class SnapshotCallback implements RequestCallback<InetAddressAndPort>
     {
         final SnapshotTask task;
 
@@ -71,7 +70,7 @@
         @Override
         public void onResponse(Message msg)
         {
-            task.set(task.endpoint);
+            task.trySuccess(task.endpoint);
         }
 
         @Override
@@ -83,7 +82,7 @@
         @Override
         public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason)
         {
-            task.setException(new RuntimeException("Could not create snapshot at " + from));
+            task.tryFailure(new RuntimeException("Could not create snapshot at " + from + "; " + failureReason));
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/repair/SomeRepairFailedException.java b/src/java/org/apache/cassandra/repair/SomeRepairFailedException.java
index 4b077b8..13ee0ae 100644
--- a/src/java/org/apache/cassandra/repair/SomeRepairFailedException.java
+++ b/src/java/org/apache/cassandra/repair/SomeRepairFailedException.java
@@ -28,4 +28,9 @@
 public class SomeRepairFailedException extends RuntimeException
 {
     public static final SomeRepairFailedException INSTANCE = new SomeRepairFailedException();
+
+    private SomeRepairFailedException()
+    {
+        super(null, null, false, false);
+    }
 }
diff --git a/src/java/org/apache/cassandra/repair/StreamingRepairTask.java b/src/java/org/apache/cassandra/repair/StreamingRepairTask.java
index 9c6caf4..ea50a50 100644
--- a/src/java/org/apache/cassandra/repair/StreamingRepairTask.java
+++ b/src/java/org/apache/cassandra/repair/StreamingRepairTask.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.repair;
 
-import java.util.UUID;
 import java.util.Collections;
 import java.util.Collection;
 
@@ -38,11 +37,12 @@
 import org.apache.cassandra.streaming.StreamPlan;
 import org.apache.cassandra.streaming.StreamState;
 import org.apache.cassandra.streaming.StreamOperation;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.cassandra.net.Verb.SYNC_RSP;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 
 /**
@@ -59,10 +59,10 @@
     private final InetAddressAndPort src;
     private final InetAddressAndPort dst;
     private final Collection<Range<Token>> ranges;
-    private final UUID pendingRepair;
+    private final TimeUUID pendingRepair;
     private final PreviewKind previewKind;
 
-    public StreamingRepairTask(RepairJobDesc desc, InetAddressAndPort initiator, InetAddressAndPort src, InetAddressAndPort dst, Collection<Range<Token>> ranges,  UUID pendingRepair, PreviewKind previewKind, boolean asymmetric)
+    public StreamingRepairTask(RepairJobDesc desc, InetAddressAndPort initiator, InetAddressAndPort src, InetAddressAndPort dst, Collection<Range<Token>> ranges, TimeUUID pendingRepair, PreviewKind previewKind, boolean asymmetric)
     {
         this.desc = desc;
         this.initiator = initiator;
diff --git a/src/java/org/apache/cassandra/repair/SymmetricRemoteSyncTask.java b/src/java/org/apache/cassandra/repair/SymmetricRemoteSyncTask.java
index 629f4bb..96f07f3 100644
--- a/src/java/org/apache/cassandra/repair/SymmetricRemoteSyncTask.java
+++ b/src/java/org/apache/cassandra/repair/SymmetricRemoteSyncTask.java
@@ -64,11 +64,11 @@
     {
         if (success)
         {
-            set(stat.withSummaries(summaries));
+            trySuccess(stat.withSummaries(summaries));
         }
         else
         {
-            setException(new RepairException(desc, previewKind, String.format("Sync failed between %s and %s", nodePair.coordinator, nodePair.peer)));
+            tryFailure(RepairException.warn(desc, previewKind, String.format("Sync failed between %s and %s", nodePair.coordinator, nodePair.peer)));
         }
         finished();
     }
diff --git a/src/java/org/apache/cassandra/repair/SyncTask.java b/src/java/org/apache/cassandra/repair/SyncTask.java
index 24e2068..b325eb4 100644
--- a/src/java/org/apache/cassandra/repair/SyncTask.java
+++ b/src/java/org/apache/cassandra/repair/SyncTask.java
@@ -23,8 +23,8 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
-import com.google.common.util.concurrent.AbstractFuture;
 
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -37,9 +37,10 @@
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.tracing.Tracing;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.apache.cassandra.net.Verb.SYNC_REQ;
 
-public abstract class SyncTask extends AbstractFuture<SyncStat> implements Runnable
+public abstract class SyncTask extends AsyncFuture<SyncStat> implements Runnable
 {
     private static final Logger logger = LoggerFactory.getLogger(SyncTask.class);
 
@@ -74,7 +75,7 @@
      */
     public final void run()
     {
-        startTime = System.currentTimeMillis();
+        startTime = currentTimeMillis();
 
 
         // choose a repair method based on the significance of the difference
@@ -83,7 +84,7 @@
         {
             logger.info(String.format(format, "are consistent"));
             Tracing.traceRepair("Endpoint {} is consistent with {} for {}", nodePair.coordinator, nodePair.peer, desc.columnFamily);
-            set(stat);
+            trySuccess(stat);
             return;
         }
 
@@ -101,7 +102,7 @@
     protected void finished()
     {
         if (startTime != Long.MIN_VALUE)
-            Keyspace.open(desc.keyspace).getColumnFamilyStore(desc.columnFamily).metric.repairSyncTime.update(System.currentTimeMillis() - startTime, TimeUnit.MILLISECONDS);
+            Keyspace.open(desc.keyspace).getColumnFamilyStore(desc.columnFamily).metric.repairSyncTime.update(currentTimeMillis() - startTime, TimeUnit.MILLISECONDS);
     }
 
     public void abort() {}
@@ -111,6 +112,6 @@
         RepairMessage.sendMessageWithFailureCB(request,
                                                SYNC_REQ,
                                                to,
-                                               this::setException);
+                                               this::tryFailure);
     }
 }
diff --git a/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java b/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java
deleted file mode 100644
index a3f8774..0000000
--- a/src/java/org/apache/cassandra/repair/SystemDistributedKeyspace.java
+++ /dev/null
@@ -1,391 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.repair;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Sets;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.dht.Range;
-import org.apache.cassandra.dht.Token;
-import org.apache.cassandra.gms.Gossiper;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.repair.messages.RepairOption;
-import org.apache.cassandra.schema.CompactionParams;
-import org.apache.cassandra.schema.KeyspaceMetadata;
-import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.schema.Tables;
-import org.apache.cassandra.utils.FBUtilities;
-
-import static java.lang.String.format;
-
-import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
-
-public final class SystemDistributedKeyspace
-{
-    private SystemDistributedKeyspace()
-    {
-    }
-
-    private static final Logger logger = LoggerFactory.getLogger(SystemDistributedKeyspace.class);
-
-    /**
-     * Generation is used as a timestamp for automatic table creation on startup.
-     * If you make any changes to the tables below, make sure to increment the
-     * generation and document your change here.
-     *
-     * gen 0: original definition in 2.2
-     * gen 1: (pre-)add options column to parent_repair_history in 3.0, 3.11
-     * gen 2: (pre-)add coordinator_port and participants_v2 columns to repair_history in 3.0, 3.11, 4.0
-     * gen 3: gc_grace_seconds raised from 0 to 10 days in CASSANDRA-12954 in 3.11.0
-     * gen 4: compression chunk length reduced to 16KiB, memtable_flush_period_in_ms now unset on all tables in 4.0
-     * gen 5: add ttl and TWCS to repair_history tables
-     */
-    public static final long GENERATION = 5;
-
-    public static final String REPAIR_HISTORY = "repair_history";
-
-    public static final String PARENT_REPAIR_HISTORY = "parent_repair_history";
-
-    public static final String VIEW_BUILD_STATUS = "view_build_status";
-
-    private static final TableMetadata RepairHistory =
-        parse(REPAIR_HISTORY,
-                "Repair history",
-                "CREATE TABLE %s ("
-                     + "keyspace_name text,"
-                     + "columnfamily_name text,"
-                     + "id timeuuid,"
-                     + "parent_id timeuuid,"
-                     + "range_begin text,"
-                     + "range_end text,"
-                     + "coordinator inet,"
-                     + "coordinator_port int,"
-                     + "participants set<inet>,"
-                     + "participants_v2 set<text>,"
-                     + "exception_message text,"
-                     + "exception_stacktrace text,"
-                     + "status text,"
-                     + "started_at timestamp,"
-                     + "finished_at timestamp,"
-                     + "PRIMARY KEY ((keyspace_name, columnfamily_name), id))")
-        .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(30))
-        .compaction(CompactionParams.twcs(ImmutableMap.of("compaction_window_unit","DAYS",
-                                                          "compaction_window_size","1")))
-        .build();
-
-    private static final TableMetadata ParentRepairHistory =
-        parse(PARENT_REPAIR_HISTORY,
-                "Repair history",
-                "CREATE TABLE %s ("
-                     + "parent_id timeuuid,"
-                     + "keyspace_name text,"
-                     + "columnfamily_names set<text>,"
-                     + "started_at timestamp,"
-                     + "finished_at timestamp,"
-                     + "exception_message text,"
-                     + "exception_stacktrace text,"
-                     + "requested_ranges set<text>,"
-                     + "successful_ranges set<text>,"
-                     + "options map<text, text>,"
-                     + "PRIMARY KEY (parent_id))")
-        .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(30))
-        .compaction(CompactionParams.twcs(ImmutableMap.of("compaction_window_unit","DAYS",
-                                                          "compaction_window_size","1")))
-        .build();
-
-    private static final TableMetadata ViewBuildStatus =
-        parse(VIEW_BUILD_STATUS,
-            "Materialized View build status",
-            "CREATE TABLE %s ("
-                     + "keyspace_name text,"
-                     + "view_name text,"
-                     + "host_id uuid,"
-                     + "status text,"
-                     + "PRIMARY KEY ((keyspace_name, view_name), host_id))").build();
-
-    private static TableMetadata.Builder parse(String table, String description, String cql)
-    {
-        return CreateTableStatement.parse(format(cql, table), SchemaConstants.DISTRIBUTED_KEYSPACE_NAME)
-                                   .id(TableId.forSystemTable(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, table))
-                                   .comment(description);
-    }
-
-    public static KeyspaceMetadata metadata()
-    {
-        return KeyspaceMetadata.create(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, KeyspaceParams.simple(3), Tables.of(RepairHistory, ParentRepairHistory, ViewBuildStatus));
-    }
-
-    public static void startParentRepair(UUID parent_id, String keyspaceName, String[] cfnames, RepairOption options)
-    {
-        Collection<Range<Token>> ranges = options.getRanges();
-        String query = "INSERT INTO %s.%s (parent_id, keyspace_name, columnfamily_names, requested_ranges, started_at,          options)"+
-                                 " VALUES (%s,        '%s',          { '%s' },           { '%s' },          toTimestamp(now()), { %s })";
-        String fmtQry = format(query,
-                                      SchemaConstants.DISTRIBUTED_KEYSPACE_NAME,
-                                      PARENT_REPAIR_HISTORY,
-                                      parent_id.toString(),
-                                      keyspaceName,
-                                      Joiner.on("','").join(cfnames),
-                                      Joiner.on("','").join(ranges),
-                                      toCQLMap(options.asMap(), RepairOption.RANGES_KEY, RepairOption.COLUMNFAMILIES_KEY));
-        processSilent(fmtQry);
-    }
-
-    private static String toCQLMap(Map<String, String> options, String ... ignore)
-    {
-        Set<String> toIgnore = Sets.newHashSet(ignore);
-        StringBuilder map = new StringBuilder();
-        boolean first = true;
-        for (Map.Entry<String, String> entry : options.entrySet())
-        {
-            if (!toIgnore.contains(entry.getKey()))
-            {
-                if (!first)
-                    map.append(',');
-                first = false;
-                map.append(format("'%s': '%s'", entry.getKey(), entry.getValue()));
-            }
-        }
-        return map.toString();
-    }
-
-    public static void failParentRepair(UUID parent_id, Throwable t)
-    {
-        String query = "UPDATE %s.%s SET finished_at = toTimestamp(now()), exception_message=?, exception_stacktrace=? WHERE parent_id=%s";
-
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        t.printStackTrace(pw);
-        String fmtQuery = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, PARENT_REPAIR_HISTORY, parent_id.toString());
-        String message = t.getMessage();
-        processSilent(fmtQuery, message != null ? message : "", sw.toString());
-    }
-
-    public static void successfulParentRepair(UUID parent_id, Collection<Range<Token>> successfulRanges)
-    {
-        String query = "UPDATE %s.%s SET finished_at = toTimestamp(now()), successful_ranges = {'%s'} WHERE parent_id=%s";
-        String fmtQuery = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, PARENT_REPAIR_HISTORY, Joiner.on("','").join(successfulRanges), parent_id.toString());
-        processSilent(fmtQuery);
-    }
-
-    public static void startRepairs(UUID id, UUID parent_id, String keyspaceName, String[] cfnames, CommonRange commonRange)
-    {
-        //Don't record repair history if an upgrade is in progress as version 3 nodes generates errors
-        //due to schema differences
-        boolean includeNewColumns = !Gossiper.instance.hasMajorVersion3Nodes();
-
-        InetAddressAndPort coordinator = FBUtilities.getBroadcastAddressAndPort();
-        Set<String> participants = Sets.newHashSet();
-        Set<String> participants_v2 = Sets.newHashSet();
-
-        for (InetAddressAndPort endpoint : commonRange.endpoints)
-        {
-            participants.add(endpoint.getHostAddress(false));
-            participants_v2.add(endpoint.getHostAddressAndPort());
-        }
-
-        String query =
-                "INSERT INTO %s.%s (keyspace_name, columnfamily_name, id, parent_id, range_begin, range_end, coordinator, coordinator_port, participants, participants_v2, status, started_at) " +
-                        "VALUES (   '%s',          '%s',              %s, %s,        '%s',        '%s',      '%s',        %d,               { '%s' },     { '%s' },        '%s',   toTimestamp(now()))";
-        String queryWithoutNewColumns =
-                "INSERT INTO %s.%s (keyspace_name, columnfamily_name, id, parent_id, range_begin, range_end, coordinator, participants, status, started_at) " +
-                        "VALUES (   '%s',          '%s',              %s, %s,        '%s',        '%s',      '%s',               { '%s' },        '%s',   toTimestamp(now()))";
-
-        for (String cfname : cfnames)
-        {
-            for (Range<Token> range : commonRange.ranges)
-            {
-                String fmtQry;
-                if (includeNewColumns)
-                {
-                    fmtQry = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
-                                    keyspaceName,
-                                    cfname,
-                                    id.toString(),
-                                    parent_id.toString(),
-                                    range.left.toString(),
-                                    range.right.toString(),
-                                    coordinator.getHostAddress(false),
-                                    coordinator.port,
-                                    Joiner.on("', '").join(participants),
-                                    Joiner.on("', '").join(participants_v2),
-                                    RepairState.STARTED.toString());
-                }
-                else
-                {
-                    fmtQry = format(queryWithoutNewColumns, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
-                                    keyspaceName,
-                                    cfname,
-                                    id.toString(),
-                                    parent_id.toString(),
-                                    range.left.toString(),
-                                    range.right.toString(),
-                                    coordinator.getHostAddress(false),
-                                    Joiner.on("', '").join(participants),
-                                    RepairState.STARTED.toString());
-                }
-                processSilent(fmtQry);
-            }
-        }
-    }
-
-    public static void failRepairs(UUID id, String keyspaceName, String[] cfnames, Throwable t)
-    {
-        for (String cfname : cfnames)
-            failedRepairJob(id, keyspaceName, cfname, t);
-    }
-
-    public static void successfulRepairJob(UUID id, String keyspaceName, String cfname)
-    {
-        String query = "UPDATE %s.%s SET status = '%s', finished_at = toTimestamp(now()) WHERE keyspace_name = '%s' AND columnfamily_name = '%s' AND id = %s";
-        String fmtQuery = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
-                                        RepairState.SUCCESS.toString(),
-                                        keyspaceName,
-                                        cfname,
-                                        id.toString());
-        processSilent(fmtQuery);
-    }
-
-    public static void failedRepairJob(UUID id, String keyspaceName, String cfname, Throwable t)
-    {
-        String query = "UPDATE %s.%s SET status = '%s', finished_at = toTimestamp(now()), exception_message=?, exception_stacktrace=? WHERE keyspace_name = '%s' AND columnfamily_name = '%s' AND id = %s";
-        StringWriter sw = new StringWriter();
-        PrintWriter pw = new PrintWriter(sw);
-        t.printStackTrace(pw);
-        String fmtQry = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
-                                      RepairState.FAILED.toString(),
-                                      keyspaceName,
-                                      cfname,
-                                      id.toString());
-        processSilent(fmtQry, t.getMessage(), sw.toString());
-    }
-
-    public static void startViewBuild(String keyspace, String view, UUID hostId)
-    {
-        String query = "INSERT INTO %s.%s (keyspace_name, view_name, host_id, status) VALUES (?, ?, ?, ?)";
-        QueryProcessor.process(format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS),
-                               ConsistencyLevel.ONE,
-                               Lists.newArrayList(bytes(keyspace),
-                                                  bytes(view),
-                                                  bytes(hostId),
-                                                  bytes(BuildStatus.STARTED.toString())));
-    }
-
-    public static void successfulViewBuild(String keyspace, String view, UUID hostId)
-    {
-        String query = "UPDATE %s.%s SET status = ? WHERE keyspace_name = ? AND view_name = ? AND host_id = ?";
-        QueryProcessor.process(format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS),
-                               ConsistencyLevel.ONE,
-                               Lists.newArrayList(bytes(BuildStatus.SUCCESS.toString()),
-                                                  bytes(keyspace),
-                                                  bytes(view),
-                                                  bytes(hostId)));
-    }
-
-    public static Map<UUID, String> viewStatus(String keyspace, String view)
-    {
-        String query = "SELECT host_id, status FROM %s.%s WHERE keyspace_name = ? AND view_name = ?";
-        UntypedResultSet results;
-        try
-        {
-            results = QueryProcessor.execute(format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS),
-                                             ConsistencyLevel.ONE,
-                                             keyspace,
-                                             view);
-        }
-        catch (Exception e)
-        {
-            return Collections.emptyMap();
-        }
-
-
-        Map<UUID, String> status = new HashMap<>();
-        for (UntypedResultSet.Row row : results)
-        {
-            status.put(row.getUUID("host_id"), row.getString("status"));
-        }
-        return status;
-    }
-
-    public static void setViewRemoved(String keyspaceName, String viewName)
-    {
-        String buildReq = "DELETE FROM %s.%s WHERE keyspace_name = ? AND view_name = ?";
-        QueryProcessor.executeInternal(format(buildReq, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS), keyspaceName, viewName);
-        forceBlockingFlush(VIEW_BUILD_STATUS);
-    }
-
-    private static void processSilent(String fmtQry, String... values)
-    {
-        try
-        {
-            List<ByteBuffer> valueList = new ArrayList<>(values.length);
-            for (String v : values)
-            {
-                valueList.add(bytes(v));
-            }
-            QueryProcessor.process(fmtQry, ConsistencyLevel.ANY, valueList);
-        }
-        catch (Throwable t)
-        {
-            logger.error("Error executing query "+fmtQry, t);
-        }
-    }
-
-    public static void forceBlockingFlush(String table)
-    {
-        if (!DatabaseDescriptor.isUnsafeSystem())
-            FBUtilities.waitOnFuture(Keyspace.open(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME).getColumnFamilyStore(table).forceFlush());
-    }
-
-    private enum RepairState
-    {
-        STARTED, SUCCESS, FAILED
-    }
-
-    private enum BuildStatus
-    {
-        UNKNOWN, STARTED, SUCCESS
-    }
-}
diff --git a/src/java/org/apache/cassandra/repair/TableRepairManager.java b/src/java/org/apache/cassandra/repair/TableRepairManager.java
index b72af1d..622374a 100644
--- a/src/java/org/apache/cassandra/repair/TableRepairManager.java
+++ b/src/java/org/apache/cassandra/repair/TableRepairManager.java
@@ -20,12 +20,13 @@
 
 import java.io.IOException;
 import java.util.Collection;
-import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.metrics.TopPartitionTracker;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Table level hook for repair
@@ -34,10 +35,10 @@
 {
     /**
      * Return a validation iterator for the given parameters. If isIncremental is true, the iterator must only include
-     * data previously isolated for repair with the given parentId. nowInSec should determine whether tombstones shouldn
+     * data previously isolated for repair with the given parentId. nowInSec should determine whether tombstones should
      * be purged or not.
      */
-    ValidationPartitionIterator getValidationIterator(Collection<Range<Token>> ranges, UUID parentId, UUID sessionID, boolean isIncremental, int nowInSec) throws IOException;
+    ValidationPartitionIterator getValidationIterator(Collection<Range<Token>> ranges, TimeUUID parentId, TimeUUID sessionID, boolean isIncremental, int nowInSec, TopPartitionTracker.Collector topPartitionCollector) throws IOException, NoSuchRepairSessionException;
 
     /**
      * Begin execution of the given validation callable. Which thread pool a validation should run in is an implementation detail.
@@ -54,7 +55,7 @@
      * time. If the repairedAt time is zero, the data for the given session should be demoted back to unrepaired. Otherwise,
      * it should be promoted to repaired with the given repaired time.
      */
-    void incrementalSessionCompleted(UUID sessionID);
+    void incrementalSessionCompleted(TimeUUID sessionID);
 
     /**
      * For snapshot repairs. A snapshot of the current data for the given ranges should be taken with the given name.
diff --git a/src/java/org/apache/cassandra/repair/ValidationManager.java b/src/java/org/apache/cassandra/repair/ValidationManager.java
index eb6ec96..a6c9fa9 100644
--- a/src/java/org/apache/cassandra/repair/ValidationManager.java
+++ b/src/java/org/apache/cassandra/repair/ValidationManager.java
@@ -30,14 +30,19 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.compaction.CompactionInterruptedException;
 import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.metrics.TableMetrics;
+import org.apache.cassandra.metrics.TopPartitionTracker;
+import org.apache.cassandra.repair.state.ValidationState;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MerkleTree;
 import org.apache.cassandra.utils.MerkleTrees;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class ValidationManager
 {
     private static final Logger logger = LoggerFactory.getLogger(ValidationManager.class);
@@ -48,13 +53,13 @@
 
     private static MerkleTrees createMerkleTrees(ValidationPartitionIterator validationIterator, Collection<Range<Token>> ranges, ColumnFamilyStore cfs)
     {
-        MerkleTrees tree = new MerkleTrees(cfs.getPartitioner());
+        MerkleTrees trees = new MerkleTrees(cfs.getPartitioner());
         long allPartitions = validationIterator.estimatedPartitions();
         Map<Range<Token>, Long> rangePartitionCounts = validationIterator.getRangePartitionCounts();
 
         // The repair coordinator must hold RF trees in memory at once, so a given validation compaction can only
         // use 1 / RF of the allowed space.
-        long availableBytes = (DatabaseDescriptor.getRepairSessionSpaceInMegabytes() * 1048576) /
+        long availableBytes = (DatabaseDescriptor.getRepairSessionSpaceInMiB() * 1048576) /
                               cfs.keyspace.getReplicationStrategy().getReplicationFactor().allReplicas;
 
         for (Range<Token> range : ranges)
@@ -72,21 +77,21 @@
                            : 0;
             // determine tree depth from number of partitions, capping at max tree depth (CASSANDRA-5263)
             int depth = numPartitions > 0 ? (int) Math.min(Math.ceil(Math.log(numPartitions) / Math.log(2)), maxDepth) : 0;
-            tree.addMerkleTree((int) Math.pow(2, depth), range);
+            trees.addMerkleTree((int) Math.pow(2, depth), range);
         }
         if (logger.isDebugEnabled())
         {
             // MT serialize may take time
-            logger.debug("Created {} merkle trees with merkle trees size {}, {} partitions, {} bytes", tree.ranges().size(), tree.size(), allPartitions, MerkleTrees.serializer.serializedSize(tree, 0));
+            logger.debug("Created {} merkle trees with merkle trees size {}, {} partitions, {} bytes", trees.ranges().size(), trees.size(), allPartitions, MerkleTrees.serializer.serializedSize(trees, 0));
         }
 
-        return tree;
+        return trees;
     }
 
-    private static ValidationPartitionIterator getValidationIterator(TableRepairManager repairManager, Validator validator) throws IOException
+    private static ValidationPartitionIterator getValidationIterator(TableRepairManager repairManager, Validator validator, TopPartitionTracker.Collector topPartitionCollector) throws IOException, NoSuchRepairSessionException
     {
         RepairJobDesc desc = validator.desc;
-        return repairManager.getValidationIterator(desc.ranges, desc.parentSessionId, desc.sessionId, validator.isIncremental, validator.nowInSec);
+        return repairManager.getValidationIterator(desc.ranges, desc.parentSessionId, desc.sessionId, validator.isIncremental, validator.nowInSec, topPartitionCollector);
     }
 
     /**
@@ -94,60 +99,81 @@
      * but without writing the merge result
      */
     @SuppressWarnings("resource")
-    private void doValidation(ColumnFamilyStore cfs, Validator validator) throws IOException
+    private void doValidation(ColumnFamilyStore cfs, Validator validator) throws IOException, NoSuchRepairSessionException
     {
         // this isn't meant to be race-proof, because it's not -- it won't cause bugs for a CFS to be dropped
         // mid-validation, or to attempt to validate a droped CFS.  this is just a best effort to avoid useless work,
         // particularly in the scenario where a validation is submitted before the drop, and there are compactions
         // started prior to the drop keeping some sstables alive.  Since validationCompaction can run
         // concurrently with other compactions, it would otherwise go ahead and scan those again.
+        ValidationState state = validator.state;
         if (!cfs.isValid())
+        {
+            state.phase.skip(String.format("Table %s is not valid", cfs));
             return;
+        }
+
+        TopPartitionTracker.Collector topPartitionCollector = null;
+        if (cfs.topPartitions != null && DatabaseDescriptor.topPartitionsEnabled() && isTopPartitionSupported(validator))
+            topPartitionCollector = new TopPartitionTracker.Collector(validator.desc.ranges);
 
         // Create Merkle trees suitable to hold estimated partitions for the given ranges.
         // We blindly assume that a partition is evenly distributed on all sstables for now.
-        long start = System.nanoTime();
-        long partitionCount = 0;
-        long estimatedTotalBytes = 0;
-        try (ValidationPartitionIterator vi = getValidationIterator(cfs.getRepairManager(), validator))
+        long start = nanoTime();
+        try (ValidationPartitionIterator vi = getValidationIterator(cfs.getRepairManager(), validator, topPartitionCollector))
         {
-            MerkleTrees tree = createMerkleTrees(vi, validator.desc.ranges, cfs);
-            try
+            state.phase.start(vi.estimatedPartitions(), vi.getEstimatedBytes());
+            MerkleTrees trees = createMerkleTrees(vi, validator.desc.ranges, cfs);
+            // validate the CF as we iterate over it
+            validator.prepare(cfs, trees, topPartitionCollector);
+            while (vi.hasNext())
             {
-                // validate the CF as we iterate over it
-                validator.prepare(cfs, tree);
-                while (vi.hasNext())
+                try (UnfilteredRowIterator partition = vi.next())
                 {
-                    try (UnfilteredRowIterator partition = vi.next())
-                    {
-                        validator.add(partition);
-                        partitionCount++;
-                    }
+                    validator.add(partition);
+                    state.partitionsProcessed++;
+                    state.bytesRead = vi.getBytesRead();
+                    if (state.partitionsProcessed % 1024 == 0) // update every so often
+                        state.updated();
                 }
-                validator.complete();
             }
-            finally
-            {
-                estimatedTotalBytes = vi.getEstimatedBytes();
-                partitionCount = vi.estimatedPartitions();
-            }
+            validator.complete();
         }
         finally
         {
-            cfs.metric.bytesValidated.update(estimatedTotalBytes);
-            cfs.metric.partitionsValidated.update(partitionCount);
+            cfs.metric.bytesValidated.update(state.estimatedTotalBytes);
+            cfs.metric.partitionsValidated.update(state.partitionsProcessed);
+            if (topPartitionCollector != null)
+                cfs.topPartitions.merge(topPartitionCollector);
         }
         if (logger.isDebugEnabled())
         {
-            long duration = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
+            long duration = TimeUnit.NANOSECONDS.toMillis(nanoTime() - start);
             logger.debug("Validation of {} partitions (~{}) finished in {} msec, for {}",
-                         partitionCount,
-                         FBUtilities.prettyPrintMemory(estimatedTotalBytes),
+                         state.partitionsProcessed,
+                         FBUtilities.prettyPrintMemory(state.estimatedTotalBytes),
                          duration,
                          validator.desc);
         }
     }
 
+    private static boolean isTopPartitionSupported(Validator validator)
+    {
+        // supported: --validate, --full, --full --preview
+        switch (validator.getPreviewKind())
+        {
+            case NONE:
+                return !validator.isIncremental;
+            case ALL:
+            case REPAIRED:
+                return true;
+            case UNREPAIRED:
+                return false;
+            default:
+                throw new AssertionError("Unknown preview kind: " + validator.getPreviewKind());
+        }
+    }
+
     /**
      * Does not mutate data, so is not scheduled.
      */
@@ -161,15 +187,15 @@
                 {
                     doValidation(cfs, validator);
                 }
-                catch (PreviewRepairConflictWithIncrementalRepairException e)
+                catch (PreviewRepairConflictWithIncrementalRepairException | NoSuchRepairSessionException | CompactionInterruptedException e)
                 {
-                    validator.fail();
+                    validator.fail(e);
                     logger.warn(e.getMessage());
                 }
                 catch (Throwable e)
                 {
                     // we need to inform the remote end of our failure, otherwise it will hang on repair forever
-                    validator.fail();
+                    validator.fail(e);
                     logger.error("Validation failed.", e);
                     throw e;
                 }
diff --git a/src/java/org/apache/cassandra/repair/ValidationPartitionIterator.java b/src/java/org/apache/cassandra/repair/ValidationPartitionIterator.java
index ccfae41..a8f457d 100644
--- a/src/java/org/apache/cassandra/repair/ValidationPartitionIterator.java
+++ b/src/java/org/apache/cassandra/repair/ValidationPartitionIterator.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.repair;
 
-import java.io.IOException;
 import java.util.Map;
 
 import org.apache.cassandra.db.partitions.AbstractUnfilteredPartitionIterator;
@@ -29,5 +28,6 @@
 {
     public abstract long getEstimatedBytes();
     public abstract long estimatedPartitions();
+    public abstract long getBytesRead();
     public abstract Map<Range<Token>, Long> getRangePartitionCounts();
 }
diff --git a/src/java/org/apache/cassandra/repair/ValidationTask.java b/src/java/org/apache/cassandra/repair/ValidationTask.java
index b4aef24..2ad1761 100644
--- a/src/java/org/apache/cassandra/repair/ValidationTask.java
+++ b/src/java/org/apache/cassandra/repair/ValidationTask.java
@@ -17,7 +17,7 @@
  */
 package org.apache.cassandra.repair;
 
-import com.google.common.util.concurrent.AbstractFuture;
+import java.util.concurrent.ExecutionException;
 
 import org.apache.cassandra.exceptions.RepairException;
 import org.apache.cassandra.locator.InetAddressAndPort;
@@ -25,6 +25,7 @@
 import org.apache.cassandra.repair.messages.ValidationRequest;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.MerkleTrees;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
 
 import static org.apache.cassandra.net.Verb.VALIDATION_REQ;
 
@@ -32,12 +33,14 @@
  * ValidationTask sends {@link ValidationRequest} to a replica.
  * When a replica sends back message, task completes.
  */
-public class ValidationTask extends AbstractFuture<TreeResponse> implements Runnable
+public class ValidationTask extends AsyncFuture<TreeResponse> implements Runnable
 {
     private final RepairJobDesc desc;
     private final InetAddressAndPort endpoint;
     private final int nowInSec;
     private final PreviewKind previewKind;
+    
+    private boolean active = true;
 
     public ValidationTask(RepairJobDesc desc, InetAddressAndPort endpoint, int nowInSec, PreviewKind previewKind)
     {
@@ -55,7 +58,7 @@
         RepairMessage.sendMessageWithFailureCB(new ValidationRequest(desc, nowInSec),
                                                VALIDATION_REQ,
                                                endpoint,
-                                               this::setException);
+                                               this::tryFailure);
     }
 
     /**
@@ -63,15 +66,60 @@
      *
      * @param trees MerkleTrees that is sent from replica. Null if validation failed on replica node.
      */
-    public void treesReceived(MerkleTrees trees)
+    public synchronized void treesReceived(MerkleTrees trees)
     {
         if (trees == null)
         {
-            setException(new RepairException(desc, previewKind, "Validation failed in " + endpoint));
+            active = false;
+            tryFailure(RepairException.warn(desc, previewKind, "Validation failed in " + endpoint));
+        }
+        else if (active)
+        {
+            trySuccess(new TreeResponse(endpoint, trees));
         }
         else
         {
-            set(new TreeResponse(endpoint, trees));
+            // If the task has already been aborted, just release the possibly off-heap trees and move along.
+            trees.release();
+            trySuccess(null);
         }
     }
+
+    /**
+     * Release any trees already received by this task, and place it a state where any trees 
+     * received subsequently will be properly discarded.
+     */
+    public synchronized void abort()
+    {
+        if (active) 
+        {
+            if (isDone())
+            {
+                try 
+                {
+                    // If we're done, this should return immediately.
+                    TreeResponse response = get();
+                    
+                    if (response.trees != null)
+                        response.trees.release();
+                } 
+                catch (InterruptedException e) 
+                {
+                    // Restore the interrupt.
+                    Thread.currentThread().interrupt();
+                } 
+                catch (ExecutionException e) 
+                {
+                    // Do nothing here. If an exception was set, there were no trees to release.
+                }
+            }
+            
+            active = false;
+        }
+    }
+    
+    public synchronized boolean isActive()
+    {
+        return active;
+    }
 }
diff --git a/src/java/org/apache/cassandra/repair/Validator.java b/src/java/org/apache/cassandra/repair/Validator.java
index 2f71729..abbfb4f 100644
--- a/src/java/org/apache/cassandra/repair/Validator.java
+++ b/src/java/org/apache/cassandra/repair/Validator.java
@@ -17,19 +17,11 @@
  */
 package org.apache.cassandra.repair;
 
-import java.nio.ByteBuffer;
-import java.nio.charset.Charset;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.hash.Funnel;
-import com.google.common.hash.HashCode;
-import com.google.common.hash.HashFunction;
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,9 +34,11 @@
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.metrics.TopPartitionTracker;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.repair.messages.ValidationResponse;
+import org.apache.cassandra.repair.state.ValidationState;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.tracing.Tracing;
@@ -84,21 +78,24 @@
     private DecoratedKey lastKey;
 
     private final PreviewKind previewKind;
+    public final ValidationState state;
+    public TopPartitionTracker.Collector topPartitionCollector;
 
-    public Validator(RepairJobDesc desc, InetAddressAndPort initiator, int nowInSec, PreviewKind previewKind)
+    public Validator(ValidationState state, int nowInSec, PreviewKind previewKind)
     {
-        this(desc, initiator, nowInSec, false, false, previewKind);
+        this(state, nowInSec, false, false, previewKind);
     }
 
-    public Validator(RepairJobDesc desc, InetAddressAndPort initiator, int nowInSec, boolean isIncremental, PreviewKind previewKind)
+    public Validator(ValidationState state, int nowInSec, boolean isIncremental, PreviewKind previewKind)
     {
-        this(desc, initiator, nowInSec, false, isIncremental, previewKind);
+        this(state, nowInSec, false, isIncremental, previewKind);
     }
 
-    public Validator(RepairJobDesc desc, InetAddressAndPort initiator, int nowInSec, boolean evenTreeDistribution, boolean isIncremental, PreviewKind previewKind)
+    public Validator(ValidationState state, int nowInSec, boolean evenTreeDistribution, boolean isIncremental, PreviewKind previewKind)
     {
-        this.desc = desc;
-        this.initiator = initiator;
+        this.state = state;
+        this.desc = state.desc;
+        this.initiator = state.initiator;
         this.nowInSec = nowInSec;
         this.isIncremental = isIncremental;
         this.previewKind = previewKind;
@@ -108,21 +105,22 @@
         this.evenTreeDistribution = evenTreeDistribution;
     }
 
-    public void prepare(ColumnFamilyStore cfs, MerkleTrees tree)
+    public void prepare(ColumnFamilyStore cfs, MerkleTrees trees, TopPartitionTracker.Collector topPartitionCollector)
     {
-        this.trees = tree;
+        this.trees = trees;
+        this.topPartitionCollector = topPartitionCollector;
 
-        if (!tree.partitioner().preservesOrder() || evenTreeDistribution)
+        if (!trees.partitioner().preservesOrder() || evenTreeDistribution)
         {
-            // You can't beat an even tree distribution for md5
-            tree.init();
+            // You can't beat even trees distribution for md5
+            trees.init();
         }
         else
         {
             List<DecoratedKey> keys = new ArrayList<>();
             Random random = new Random();
 
-            for (Range<Token> range : tree.ranges())
+            for (Range<Token> range : trees.ranges())
             {
                 for (DecoratedKey sample : cfs.keySamples(range))
                 {
@@ -132,8 +130,8 @@
 
                 if (keys.isEmpty())
                 {
-                    // use an even tree distribution
-                    tree.init(range);
+                    // use even trees distribution
+                    trees.init(range);
                 }
                 else
                 {
@@ -142,15 +140,15 @@
                     while (true)
                     {
                         DecoratedKey dk = keys.get(random.nextInt(numKeys));
-                        if (!tree.split(dk.getToken()))
+                        if (!trees.split(dk.getToken()))
                             break;
                     }
                     keys.clear();
                 }
             }
         }
-        logger.debug("Prepared AEService trees of size {} for {}", trees.size(), desc);
-        ranges = tree.rangeIterator();
+        logger.debug("Prepared AEService trees of size {} for {}", this.trees.size(), desc);
+        ranges = trees.rangeIterator();
     }
 
     /**
@@ -182,6 +180,8 @@
         RowHash rowHash = rowHash(partition);
         if (rowHash != null)
         {
+            if(topPartitionCollector != null)
+                topPartitionCollector.trackPartitionSize(partition.partitionKey(), rowHash.size);
             range.addHash(rowHash);
         }
     }
@@ -224,6 +224,7 @@
             trees.logRowSizePerLeaf(logger);
         }
 
+        state.phase.sendingTrees();
         Stage.ANTI_ENTROPY.execute(this);
     }
 
@@ -232,9 +233,9 @@
      * This sends RepairStatus to inform the initiator that the validation has failed.
      * The actual reason for failure should be looked up in the log of the host calling this function.
      */
-    public void fail()
+    public void fail(Throwable e)
     {
-        logger.error("Failed creating a merkle tree for {}, {} (see log for details)", desc, initiator);
+        state.phase.fail(e);
         respond(new ValidationResponse(desc));
     }
 
@@ -254,9 +255,15 @@
             Tracing.traceRepair("Local completed merkle tree for {} for {}.{}", initiator, desc.keyspace, desc.columnFamily);
 
         }
+        state.phase.success();
         respond(new ValidationResponse(desc, trees));
     }
 
+    public PreviewKind getPreviewKind()
+    {
+        return previewKind;
+    }
+
     private boolean initiatorIsRemote()
     {
         return !FBUtilities.getBroadcastAddressAndPort().equals(initiator);
@@ -273,7 +280,7 @@
         /*
          * For local initiators, DO NOT send the message to self over loopback. This is a wasted ser/de loop
          * and a ton of garbage. Instead, move the trees off heap and invoke message handler. We could do it
-         * directly, since this method will only be called from {@code Stage.ENTI_ENTROPY}, but we do instead
+         * directly, since this method will only be called from {@code Stage.ANTI_ENTROPY}, but we do instead
          * execute a {@code Runnable} on the stage - in case that assumption ever changes by accident.
          */
         Stage.ANTI_ENTROPY.execute(() ->
diff --git a/src/java/org/apache/cassandra/repair/asymmetric/HostDifferences.java b/src/java/org/apache/cassandra/repair/asymmetric/HostDifferences.java
index 8b123a7..76ff5aa 100644
--- a/src/java/org/apache/cassandra/repair/asymmetric/HostDifferences.java
+++ b/src/java/org/apache/cassandra/repair/asymmetric/HostDifferences.java
@@ -99,4 +99,4 @@
                "perHostDifferences=" + perHostDifferences +
                '}';
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/repair/asymmetric/PreferedNodeFilter.java b/src/java/org/apache/cassandra/repair/asymmetric/PreferedNodeFilter.java
index e8ca85d..b2622ef 100644
--- a/src/java/org/apache/cassandra/repair/asymmetric/PreferedNodeFilter.java
+++ b/src/java/org/apache/cassandra/repair/asymmetric/PreferedNodeFilter.java
@@ -25,4 +25,4 @@
 public interface PreferedNodeFilter
 {
     public Set<InetAddressAndPort> apply(InetAddressAndPort streamingNode, Set<InetAddressAndPort> toStream);
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/repair/asymmetric/RangeDenormalizer.java b/src/java/org/apache/cassandra/repair/asymmetric/RangeDenormalizer.java
index 2a29871..ee69f51 100644
--- a/src/java/org/apache/cassandra/repair/asymmetric/RangeDenormalizer.java
+++ b/src/java/org/apache/cassandra/repair/asymmetric/RangeDenormalizer.java
@@ -20,7 +20,6 @@
 
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
diff --git a/src/java/org/apache/cassandra/repair/consistent/ConsistentSession.java b/src/java/org/apache/cassandra/repair/consistent/ConsistentSession.java
index e4d8ff0..86ecfb7 100644
--- a/src/java/org/apache/cassandra/repair/consistent/ConsistentSession.java
+++ b/src/java/org/apache/cassandra/repair/consistent/ConsistentSession.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.repair.consistent;
 
-import java.net.InetAddress;
 import java.util.Collection;
 import java.util.EnumMap;
 import java.util.List;
@@ -48,6 +47,7 @@
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.tools.nodetool.RepairAdmin;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Base class for consistent Local and Coordinator sessions
@@ -56,7 +56,7 @@
  * There are 4 stages to a consistent incremental repair.
  *
  * <h1>Repair prepare</h1>
- *  First, the normal {@link ActiveRepairService#prepareForRepair(UUID, InetAddressAndPort, Set, RepairOption, boolean, List)} stuff
+ *  First, the normal {@link ActiveRepairService#prepareForRepair(TimeUUID, InetAddressAndPort, Set, RepairOption, boolean, List)} stuff
  *  happens, which sends out {@link PrepareMessage} and creates a {@link ActiveRepairService.ParentRepairSession}
  *  on the coordinator and each of the neighbors.
  *
@@ -187,7 +187,7 @@
     }
 
     private volatile State state;
-    public final UUID sessionID;
+    public final TimeUUID sessionID;
     public final InetAddressAndPort coordinator;
     public final ImmutableSet<TableId> tableIds;
     public final long repairedAt;
@@ -265,7 +265,7 @@
     abstract static class AbstractBuilder
     {
         private State state;
-        private UUID sessionID;
+        private TimeUUID sessionID;
         private InetAddressAndPort coordinator;
         private Set<TableId> ids;
         private long repairedAt;
@@ -277,7 +277,7 @@
             this.state = state;
         }
 
-        void withSessionID(UUID sessionID)
+        void withSessionID(TimeUUID sessionID)
         {
             this.sessionID = sessionID;
         }
diff --git a/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java b/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java
index 5ddac3f..88f3002 100644
--- a/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java
+++ b/src/java/org/apache/cassandra/repair/consistent/CoordinatorSession.java
@@ -19,33 +19,29 @@
 package org.apache.cassandra.repair.consistent;
 
 import java.util.HashMap;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.atomic.AtomicBoolean;
 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.Preconditions;
 import com.google.common.collect.Iterables;
-import com.google.common.util.concurrent.AsyncFunction;
-import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
-import com.google.common.util.concurrent.SettableFuture;
+
+import org.apache.cassandra.concurrent.ImmediateExecutor;
+import org.apache.cassandra.repair.CoordinatedRepairResult;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Future;
+
 import org.apache.commons.lang3.time.DurationFormatUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.exceptions.RepairException;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.Verb;
-import org.apache.cassandra.repair.RepairSessionResult;
 import org.apache.cassandra.repair.SomeRepairFailedException;
 import org.apache.cassandra.repair.messages.FailSession;
 import org.apache.cassandra.repair.messages.FinalizeCommit;
@@ -53,6 +49,9 @@
 import org.apache.cassandra.repair.messages.PrepareConsistentRequest;
 import org.apache.cassandra.repair.messages.RepairMessage;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * Coordinator side logic and state of a consistent repair session. Like {@link ActiveRepairService.ParentRepairSession},
@@ -64,8 +63,8 @@
     private static final Logger logger = LoggerFactory.getLogger(CoordinatorSession.class);
 
     private final Map<InetAddressAndPort, State> participantStates = new HashMap<>();
-    private final SettableFuture<Boolean> prepareFuture = SettableFuture.create();
-    private final SettableFuture<Boolean> finalizeProposeFuture = SettableFuture.create();
+    private final AsyncPromise<Void> prepareFuture = AsyncPromise.uncancellable();
+    private final AsyncPromise<Void> finalizeProposeFuture = AsyncPromise.uncancellable();
 
     private volatile long sessionStart = Long.MIN_VALUE;
     private volatile long repairStart = Long.MIN_VALUE;
@@ -148,7 +147,7 @@
         MessagingService.instance().send(message, destination);
     }
 
-    public ListenableFuture<Boolean> prepare()
+    public Future<Void> prepare()
     {
         Preconditions.checkArgument(allStates(State.PREPARING));
 
@@ -188,12 +187,11 @@
         if (getState() == State.PREPARED)
         {
             logger.info("Incremental repair session {} successfully prepared.", sessionID);
-            prepareFuture.set(true);
+            prepareFuture.trySuccess(null);
         }
         else
         {
             fail();
-            prepareFuture.set(false);
         }
     }
 
@@ -202,7 +200,7 @@
         setAll(State.REPAIRING);
     }
 
-    public synchronized ListenableFuture<Boolean> finalizePropose()
+    public synchronized Future<Void> finalizePropose()
     {
         Preconditions.checkArgument(allStates(State.REPAIRING));
         logger.info("Proposing finalization of repair session {}", sessionID);
@@ -224,7 +222,6 @@
         {
             logger.warn("Finalization proposal of session {} rejected by {}. Aborting session", sessionID, participant);
             fail();
-            finalizeProposeFuture.set(false);
         }
         else
         {
@@ -233,7 +230,7 @@
             if (getState() == State.FINALIZE_PROMISED)
             {
                 logger.info("Finalization proposal for repair session {} accepted by all participants.", sessionID);
-                finalizeProposeFuture.set(true);
+                finalizeProposeFuture.trySuccess(null);
             }
         }
     }
@@ -279,8 +276,8 @@
         setAll(State.FAILED);
 
         String exceptionMsg = String.format("Incremental repair session %s has failed", sessionID);
-        finalizeProposeFuture.setException(new RuntimeException(exceptionMsg));
-        prepareFuture.setException(new RuntimeException(exceptionMsg));
+        finalizeProposeFuture.tryFailure(RepairException.warn(exceptionMsg));
+        prepareFuture.tryFailure(RepairException.warn(exceptionMsg));
     }
 
     private static String formatDuration(long then, long now)
@@ -296,111 +293,51 @@
     /**
      * Runs the asynchronous consistent repair session. Actual repair sessions are scheduled via a submitter to make unit testing easier
      */
-    public ListenableFuture execute(Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSubmitter, AtomicBoolean hasFailure)
+    public Future<CoordinatedRepairResult> execute(Supplier<Future<CoordinatedRepairResult>> sessionSubmitter)
     {
         logger.info("Beginning coordination of incremental repair session {}", sessionID);
 
-        sessionStart = System.currentTimeMillis();
-        ListenableFuture<Boolean> prepareResult = prepare();
+        sessionStart = currentTimeMillis();
+        Future<Void> prepareResult = prepare();
 
         // run repair sessions normally
-        ListenableFuture<List<RepairSessionResult>> repairSessionResults = Futures.transformAsync(prepareResult, new AsyncFunction<Boolean, List<RepairSessionResult>>()
-        {
-            public ListenableFuture<List<RepairSessionResult>> apply(Boolean success) throws Exception
+        Future<CoordinatedRepairResult> repairSessionResults = prepareResult.flatMap(ignore -> {
+            repairStart = currentTimeMillis();
+            if (logger.isDebugEnabled())
+                logger.debug("Incremental repair {} prepare phase completed in {}", sessionID, formatDuration(sessionStart, repairStart));
+            setRepairing();
+            return sessionSubmitter.get();
+        });
+
+        // if any session failed, then fail the future
+        Future<CoordinatedRepairResult> onlySuccessSessionResults = repairSessionResults.flatMap(result -> {
+            finalizeStart = currentTimeMillis();
+            if (result.hasFailed())
             {
-                if (success)
-                {
-                    repairStart = System.currentTimeMillis();
-                    if (logger.isDebugEnabled())
-                    {
-                        logger.debug("Incremental repair {} prepare phase completed in {}", sessionID, formatDuration(sessionStart, repairStart));
-                    }
-                    setRepairing();
-                    return sessionSubmitter.get();
-                }
-                else
-                {
-                    return Futures.immediateFuture(null);
-                }
-
+                if (logger.isDebugEnabled())
+                    logger.debug("Incremental repair {} validation/stream phase completed in {}", sessionID, formatDuration(repairStart, finalizeStart));
+                return ImmediateFuture.failure(SomeRepairFailedException.INSTANCE);
             }
-        }, MoreExecutors.directExecutor());
+            return ImmediateFuture.success(result);
+        });
 
-        // mark propose finalization
-        ListenableFuture<Boolean> proposeFuture = Futures.transformAsync(repairSessionResults, new AsyncFunction<List<RepairSessionResult>, Boolean>()
-        {
-            public ListenableFuture<Boolean> apply(List<RepairSessionResult> results) throws Exception
+        // mark propose finalization and commit
+        Future<CoordinatedRepairResult> proposeFuture = onlySuccessSessionResults.flatMap(results -> finalizePropose().map(ignore -> {
+            if (logger.isDebugEnabled())
+                logger.debug("Incremental repair {} finalization phase completed in {}", sessionID, formatDuration(finalizeStart, currentTimeMillis()));
+            finalizeCommit();
+            if (logger.isDebugEnabled())
+                logger.debug("Incremental repair {} phase completed in {}", sessionID, formatDuration(sessionStart, currentTimeMillis()));
+            return results;
+        }));
+
+        return proposeFuture.addCallback((ignore, failure) -> {
+            if (failure != null)
             {
-                if (results == null || results.isEmpty() || Iterables.any(results, r -> r == null))
-                {
-                    finalizeStart = System.currentTimeMillis();
-                    if (logger.isDebugEnabled())
-                    {
-                        logger.debug("Incremental repair {} validation/stream phase completed in {}", sessionID, formatDuration(repairStart, finalizeStart));
-
-                    }
-                    return Futures.immediateFailedFuture(SomeRepairFailedException.INSTANCE);
-                }
-                else
-                {
-                    return finalizePropose();
-                }
+                if (logger.isDebugEnabled())
+                    logger.debug("Incremental repair {} phase failed in {}", sessionID, formatDuration(sessionStart, currentTimeMillis()));
+                fail();
             }
-        }, MoreExecutors.directExecutor());
-
-        // return execution result as set by following callback
-        SettableFuture<Boolean> resultFuture = SettableFuture.create();
-
-        // commit repaired data
-        Futures.addCallback(proposeFuture, new FutureCallback<Boolean>()
-        {
-            public void onSuccess(@Nullable Boolean result)
-            {
-                try
-                {
-                    if (result != null && result)
-                    {
-                        if (logger.isDebugEnabled())
-                        {
-                            logger.debug("Incremental repair {} finalization phase completed in {}", sessionID, formatDuration(finalizeStart, System.currentTimeMillis()));
-                        }
-                        finalizeCommit();
-                        if (logger.isDebugEnabled())
-                        {
-                            logger.debug("Incremental repair {} phase completed in {}", sessionID, formatDuration(sessionStart, System.currentTimeMillis()));
-                        }
-                    }
-                    else
-                    {
-                        hasFailure.set(true);
-                        fail();
-                    }
-                    resultFuture.set(result);
-                }
-                catch (Exception e)
-                {
-                    resultFuture.setException(e);
-                }
-            }
-
-            public void onFailure(Throwable t)
-            {
-                try
-                {
-                    if (logger.isDebugEnabled())
-                    {
-                        logger.debug("Incremental repair {} phase failed in {}", sessionID, formatDuration(sessionStart, System.currentTimeMillis()));
-                    }
-                    hasFailure.set(true);
-                    fail();
-                }
-                finally
-                {
-                    resultFuture.setException(t);
-                }
-            }
-        }, MoreExecutors.directExecutor());
-
-        return resultFuture;
+        }, ImmediateExecutor.INSTANCE);
     }
 }
diff --git a/src/java/org/apache/cassandra/repair/consistent/CoordinatorSessions.java b/src/java/org/apache/cassandra/repair/consistent/CoordinatorSessions.java
index b87a2c0..328c16e 100644
--- a/src/java/org/apache/cassandra/repair/consistent/CoordinatorSessions.java
+++ b/src/java/org/apache/cassandra/repair/consistent/CoordinatorSessions.java
@@ -21,7 +21,6 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.base.Preconditions;
 
@@ -30,20 +29,22 @@
 import org.apache.cassandra.repair.messages.FinalizePromise;
 import org.apache.cassandra.repair.messages.PrepareConsistentResponse;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Container for all consistent repair sessions a node is coordinating
  */
 public class CoordinatorSessions
 {
-    private final Map<UUID, CoordinatorSession> sessions = new HashMap<>();
+    private final Map<TimeUUID, CoordinatorSession> sessions = new HashMap<>();
 
     protected CoordinatorSession buildSession(CoordinatorSession.Builder builder)
     {
         return new CoordinatorSession(builder);
     }
 
-    public synchronized CoordinatorSession registerSession(UUID sessionId, Set<InetAddressAndPort> participants, boolean isForced)
+    public synchronized CoordinatorSession registerSession(TimeUUID sessionId, Set<InetAddressAndPort> participants, boolean isForced) throws NoSuchRepairSessionException
     {
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionId);
 
@@ -66,7 +67,7 @@
         return session;
     }
 
-    public synchronized CoordinatorSession getSession(UUID sessionId)
+    public synchronized CoordinatorSession getSession(TimeUUID sessionId)
     {
         return sessions.get(sessionId);
     }
diff --git a/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java b/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java
index f1f927b..fa2835e 100644
--- a/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java
+++ b/src/java/org/apache/cassandra/repair/consistent/LocalSessionInfo.java
@@ -62,7 +62,7 @@
         m.put(STARTED, Integer.toString(session.getStartedAt()));
         m.put(LAST_UPDATE, Integer.toString(session.getLastUpdate()));
         m.put(COORDINATOR, session.coordinator.toString());
-        m.put(PARTICIPANTS, Joiner.on(',').join(Iterables.transform(session.participants.stream().map(peer -> peer.address).collect(Collectors.toList()), InetAddress::getHostAddress)));
+        m.put(PARTICIPANTS, Joiner.on(',').join(Iterables.transform(session.participants.stream().map(peer -> peer.getAddress()).collect(Collectors.toList()), InetAddress::getHostAddress)));
         m.put(PARTICIPANTS_WP, Joiner.on(',').join(Iterables.transform(session.participants, InetAddressAndPort::getHostAddressAndPort)));
         m.put(TABLES, Joiner.on(',').join(Iterables.transform(session.tableIds, LocalSessionInfo::tableString)));
 
diff --git a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
index cfb90ef..ed2bf0b 100644
--- a/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
+++ b/src/java/org/apache/cassandra/repair/consistent/LocalSessions.java
@@ -33,7 +33,6 @@
 import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.function.BooleanSupplier;
 import java.util.function.Predicate;
@@ -50,10 +49,8 @@
 import com.google.common.collect.Sets;
 import com.google.common.primitives.Ints;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
 
+import org.apache.cassandra.db.compaction.CompactionInterruptedException;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -93,9 +90,14 @@
 import org.apache.cassandra.repair.messages.StatusResponse;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Throwables;
+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.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;
@@ -153,7 +155,7 @@
     private final String keyspace = SchemaConstants.SYSTEM_KEYSPACE_NAME;
     private final String table = SystemKeyspace.REPAIRS;
     private boolean started = false;
-    private volatile ImmutableMap<UUID, LocalSession> sessions = ImmutableMap.of();
+    private volatile ImmutableMap<TimeUUID, LocalSession> sessions = ImmutableMap.of();
     private volatile ImmutableMap<TableId, RepairedState> repairedStates = ImmutableMap.of();
 
     @VisibleForTesting
@@ -273,10 +275,10 @@
         PendingStat.Builder finalized = new PendingStat.Builder();
         PendingStat.Builder failed = new PendingStat.Builder();
 
-        Map<UUID, PendingStat> stats = cfs.getPendingRepairStats();
-        for (Map.Entry<UUID, PendingStat> entry : stats.entrySet())
+        Map<TimeUUID, PendingStat> stats = cfs.getPendingRepairStats();
+        for (Map.Entry<TimeUUID, PendingStat> entry : stats.entrySet())
         {
-            UUID sessionID = entry.getKey();
+            TimeUUID sessionID = entry.getKey();
             PendingStat stat = entry.getValue();
             Verify.verify(sessionID.equals(Iterables.getOnlyElement(stat.sessions)));
 
@@ -310,7 +312,7 @@
                                                                    && Range.intersects(ls.ranges, ranges));
 
         ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(tid);
-        Set<UUID> sessionIds = Sets.newHashSet(Iterables.transform(candidates, s -> s.sessionID));
+        Set<TimeUUID> sessionIds = Sets.newHashSet(Iterables.transform(candidates, s -> s.sessionID));
 
 
         return cfs.releaseRepairData(sessionIds, force);
@@ -320,7 +322,7 @@
      * hook for operators to cancel sessions, cancelling from a non-coordinator is an error, unless
      * force is set to true. Messages are sent out to other participants, but we don't wait for a response
      */
-    public void cancelSession(UUID sessionID, boolean force)
+    public void cancelSession(TimeUUID sessionID, boolean force)
     {
         logger.info("Cancelling local repair session {}", sessionID);
         LocalSession session = getSession(sessionID);
@@ -346,7 +348,7 @@
         Preconditions.checkArgument(!started, "LocalSessions.start can only be called once");
         Preconditions.checkArgument(sessions.isEmpty(), "No sessions should be added before start");
         UntypedResultSet rows = QueryProcessor.executeInternalWithPaging(String.format("SELECT * FROM %s.%s", keyspace, table), 1000);
-        Map<UUID, LocalSession> loadedSessions = new HashMap<>();
+        Map<TimeUUID, LocalSession> loadedSessions = new HashMap<>();
         Map<TableId, List<RepairedState.Level>> initialLevels = new HashMap<>();
         for (UntypedResultSet.Row row : rows)
         {
@@ -363,9 +365,9 @@
             }
             catch (IllegalArgumentException | NullPointerException e)
             {
-                logger.warn("Unable to load malformed repair session {}, removing", row.has("parent_id") ? row.getUUID("parent_id") : null);
+                logger.warn("Unable to load malformed repair session {}, removing", row.has("parent_id") ? row.getTimeUUID("parent_id") : null);
                 if (row.has("parent_id"))
-                    deleteRow(row.getUUID("parent_id"));
+                    deleteRow(row.getTimeUUID("parent_id"));
             }
         }
         for (Map.Entry<TableId, List<RepairedState.Level>> entry : initialLevels.entrySet())
@@ -545,9 +547,9 @@
                                        Date.from(Instant.ofEpochSecond(session.getLastUpdate())),
                                        Date.from(Instant.ofEpochMilli(session.repairedAt)),
                                        session.getState().ordinal(),
-                                       session.coordinator.address,
-                                       session.coordinator.port,
-                                       session.participants.stream().map(participant -> participant.address).collect(Collectors.toSet()),
+                                       session.coordinator.getAddress(),
+                                       session.coordinator.getPort(),
+                                       session.participants.stream().map(participant -> participant.getAddress()).collect(Collectors.toSet()),
                                        session.participants.stream().map(participant -> participant.getHostAddressAndPort()).collect(Collectors.toSet()),
                                        serializeRanges(session.ranges),
                                        tableIdToUuid(session.tableIds));
@@ -564,7 +566,7 @@
     {
         LocalSession.Builder builder = LocalSession.builder();
         builder.withState(ConsistentSession.State.valueOf(row.getInt("state")));
-        builder.withSessionID(row.getUUID("parent_id"));
+        builder.withSessionID(row.getTimeUUID("parent_id"));
         InetAddressAndPort coordinator = InetAddressAndPort.getByAddressOverrideDefaults(
             row.getInetAddress("coordinator"),
             row.getInt("coordinator_port"));
@@ -592,7 +594,7 @@
         return buildSession(builder);
     }
 
-    private void deleteRow(UUID sessionID)
+    private void deleteRow(TimeUUID sessionID)
     {
         String query = "DELETE FROM %s.%s WHERE parent_id=?";
         QueryProcessor.executeInternal(String.format(query, keyspace, table), sessionID);
@@ -602,14 +604,14 @@
     {
         TableId tid = Schema.instance.getTableMetadata(keyspace, table).id;
         ColumnFamilyStore cfm = Schema.instance.getColumnFamilyStoreInstance(tid);
-        cfm.forceBlockingFlush();
+        cfm.forceBlockingFlush(ColumnFamilyStore.FlushReason.INTERNALLY_FORCED);
     }
 
     /**
      * Loads a session directly from the table. Should be used for testing only
      */
     @VisibleForTesting
-    LocalSession loadUnsafe(UUID sessionId)
+    LocalSession loadUnsafe(TimeUUID sessionId)
     {
         String query = "SELECT * FROM %s.%s WHERE parent_id=?";
         UntypedResultSet result = QueryProcessor.executeInternal(String.format(query, keyspace, table), sessionId);
@@ -626,7 +628,7 @@
         return new LocalSession(builder);
     }
 
-    public LocalSession getSession(UUID sessionID)
+    public LocalSession getSession(TimeUUID sessionID)
     {
         return sessions.get(sessionID);
     }
@@ -643,22 +645,22 @@
         Preconditions.checkArgument(!sessions.containsKey(session.sessionID),
                                     "LocalSession %s already exists", session.sessionID);
         Preconditions.checkArgument(started, "sessions cannot be added before LocalSessions is started");
-        sessions = ImmutableMap.<UUID, LocalSession>builder()
+        sessions = ImmutableMap.<TimeUUID, LocalSession>builder()
                                .putAll(sessions)
                                .put(session.sessionID, session)
                                .build();
     }
 
-    private synchronized void removeSession(UUID sessionID)
+    private synchronized void removeSession(TimeUUID sessionID)
     {
         Preconditions.checkArgument(sessionID != null);
-        Map<UUID, LocalSession> temp = new HashMap<>(sessions);
+        Map<TimeUUID, LocalSession> temp = new HashMap<>(sessions);
         temp.remove(sessionID);
         sessions = ImmutableMap.copyOf(temp);
     }
 
     @VisibleForTesting
-    LocalSession createSessionUnsafe(UUID sessionId, ActiveRepairService.ParentRepairSession prs, Set<InetAddressAndPort> peers)
+    LocalSession createSessionUnsafe(TimeUUID sessionId, ActiveRepairService.ParentRepairSession prs, Set<InetAddressAndPort> peers)
     {
         LocalSession.Builder builder = LocalSession.builder();
         builder.withState(ConsistentSession.State.PREPARING);
@@ -677,7 +679,7 @@
         return buildSession(builder);
     }
 
-    protected ActiveRepairService.ParentRepairSession getParentRepairSession(UUID sessionID)
+    protected ActiveRepairService.ParentRepairSession getParentRepairSession(TimeUUID sessionID) throws NoSuchRepairSessionException
     {
         return ActiveRepairService.instance.getParentRepairSession(sessionID);
     }
@@ -711,12 +713,12 @@
         }
     }
 
-    public void failSession(UUID sessionID)
+    public void failSession(TimeUUID sessionID)
     {
         failSession(sessionID, true);
     }
 
-    public void failSession(UUID sessionID, boolean sendMessage)
+    public void failSession(TimeUUID sessionID, boolean sendMessage)
     {
         failSession(getSession(sessionID), sendMessage);
     }
@@ -745,7 +747,7 @@
         }
     }
 
-    public synchronized void deleteSession(UUID sessionID)
+    public synchronized void deleteSession(TimeUUID sessionID)
     {
         logger.info("Deleting local repair session {}", sessionID);
         LocalSession session = getSession(sessionID);
@@ -756,12 +758,12 @@
     }
 
     @VisibleForTesting
-    ListenableFuture prepareSession(KeyspaceRepairManager repairManager,
-                                    UUID sessionID,
-                                    Collection<ColumnFamilyStore> tables,
-                                    RangesAtEndpoint tokenRanges,
-                                    ExecutorService executor,
-                                    BooleanSupplier isCancelled)
+    Future<List<Void>> prepareSession(KeyspaceRepairManager repairManager,
+                                      TimeUUID sessionID,
+                                      Collection<ColumnFamilyStore> tables,
+                                      RangesAtEndpoint tokenRanges,
+                                      ExecutorService executor,
+                                      BooleanSupplier isCancelled)
     {
         return repairManager.prepareIncrementalRepair(sessionID, tables, tokenRanges, executor, isCancelled);
     }
@@ -799,7 +801,7 @@
     public void handlePrepareMessage(InetAddressAndPort from, PrepareConsistentRequest request)
     {
         logger.trace("received {} from {}", request, from);
-        UUID sessionID = request.parentSession;
+        TimeUUID sessionID = request.parentSession;
         InetAddressAndPort coordinator = request.coordinator;
         Set<InetAddressAndPort> peers = request.participants;
 
@@ -819,23 +821,22 @@
         putSessionUnsafe(session);
         logger.info("Beginning local incremental repair session {}", session);
 
-        ExecutorService executor = Executors.newFixedThreadPool(parentSession.getColumnFamilyStores().size());
+        ExecutorService executor = executorFactory().pooled("Repair-" + sessionID, parentSession.getColumnFamilyStores().size());
 
         KeyspaceRepairManager repairManager = parentSession.getKeyspace().getRepairManager();
         RangesAtEndpoint tokenRanges = filterLocalRanges(parentSession.getKeyspace().getName(), parentSession.getRanges());
-        ListenableFuture repairPreparation = prepareSession(repairManager, sessionID, parentSession.getColumnFamilyStores(),
-                                                            tokenRanges, executor, () -> session.getState() != PREPARING);
+        Future<List<Void>> repairPreparation = prepareSession(repairManager, sessionID, parentSession.getColumnFamilyStores(),
+                                                          tokenRanges, executor, () -> session.getState() != PREPARING);
 
-        Futures.addCallback(repairPreparation, new FutureCallback<Object>()
+        repairPreparation.addCallback(new FutureCallback<List<Void>>()
         {
-            public void onSuccess(@Nullable Object result)
+            public void onSuccess(@Nullable List<Void> result)
             {
                 try
                 {
                     logger.info("Prepare phase for incremental repair session {} completed", sessionID);
                     if (!prepareSessionExceptFailed(session))
                         logger.info("Session {} failed before anticompaction completed", sessionID);
-
                     Message<PrepareConsistentResponse> message =
                         Message.out(PREPARE_CONSISTENT_RSP,
                                     new PrepareConsistentResponse(sessionID, getBroadcastAddressAndPort(), session.getState() != FAILED));
@@ -851,7 +852,12 @@
             {
                 try
                 {
-                    logger.error("Prepare phase for incremental repair session {} failed", sessionID, t);
+                    if (Throwables.anyCauseMatches(t, (throwable) -> throwable instanceof CompactionInterruptedException))
+                        logger.info("Anticompaction interrupted for session {}: {}", sessionID, t.getMessage());
+                    else if (Throwables.anyCauseMatches(t, (throwable) -> throwable instanceof NoSuchRepairSessionException))
+                        logger.warn("No such repair session: {}", sessionID);
+                    else
+                        logger.error("Prepare phase for incremental repair session {} failed", sessionID, t);
                     sendMessage(coordinator,
                                 Message.out(PREPARE_CONSISTENT_RSP,
                                             new PrepareConsistentResponse(sessionID, getBroadcastAddressAndPort(), false)));
@@ -862,7 +868,7 @@
                     executor.shutdown();
                 }
             }
-        }, MoreExecutors.directExecutor());
+        });
     }
 
     /**
@@ -884,7 +890,7 @@
         }
     }
 
-    public void maybeSetRepairing(UUID sessionID)
+    public void maybeSetRepairing(TimeUUID sessionID)
     {
         LocalSession session = getSession(sessionID);
         if (session != null && session.getState() != REPAIRING)
@@ -897,7 +903,7 @@
     public void handleFinalizeProposeMessage(InetAddressAndPort from, FinalizePropose propose)
     {
         logger.trace("received {} from {}", propose, from);
-        UUID sessionID = propose.sessionID;
+        TimeUUID sessionID = propose.sessionID;
         LocalSession session = getSession(sessionID);
         if (session == null)
         {
@@ -952,7 +958,7 @@
     public void handleFinalizeCommitMessage(InetAddressAndPort from, FinalizeCommit commit)
     {
         logger.trace("received {} from {}", commit, from);
-        UUID sessionID = commit.sessionID;
+        TimeUUID sessionID = commit.sessionID;
         LocalSession session = getSession(sessionID);
         if (session == null)
         {
@@ -987,7 +993,7 @@
     public void handleStatusRequest(InetAddressAndPort from, StatusRequest request)
     {
         logger.trace("received {} from {}", request, from);
-        UUID sessionID = request.sessionID;
+        TimeUUID sessionID = request.sessionID;
         LocalSession session = getSession(sessionID);
         if (session == null)
         {
@@ -1004,7 +1010,7 @@
     public void handleStatusResponse(InetAddressAndPort from, StatusResponse response)
     {
         logger.trace("received {} from {}", response, from);
-        UUID sessionID = response.sessionID;
+        TimeUUID sessionID = response.sessionID;
         LocalSession session = getSession(sessionID);
         if (session == null)
         {
@@ -1028,7 +1034,7 @@
     /**
      * determines if a local session exists, and if it's not finalized or failed
      */
-    public boolean isSessionInProgress(UUID sessionID)
+    public boolean isSessionInProgress(TimeUUID sessionID)
     {
         LocalSession session = getSession(sessionID);
         return session != null && session.getState() != FINALIZED && session.getState() != FAILED;
@@ -1037,7 +1043,7 @@
     /**
      * determines if a local session exists, and if it's in the finalized state
      */
-    public boolean isSessionFinalized(UUID sessionID)
+    public boolean isSessionFinalized(TimeUUID sessionID)
     {
         LocalSession session = getSession(sessionID);
         return session != null && session.getState() == FINALIZED;
@@ -1046,7 +1052,7 @@
     /**
      * determines if a local session exists
      */
-    public boolean sessionExists(UUID sessionID)
+    public boolean sessionExists(TimeUUID sessionID)
     {
         return getSession(sessionID) != null;
     }
@@ -1066,7 +1072,7 @@
      * Returns the repairedAt time for a sessions which is unknown, failed, or finalized
      * calling this for a session which is in progress throws an exception
      */
-    public long getFinalSessionRepairedAt(UUID sessionID)
+    public long getFinalSessionRepairedAt(TimeUUID sessionID)
     {
         LocalSession session = getSession(sessionID);
         if (session == null || session.getState() == FAILED)
diff --git a/src/java/org/apache/cassandra/repair/consistent/SyncStatSummary.java b/src/java/org/apache/cassandra/repair/consistent/SyncStatSummary.java
index f8e1bfb..3d21702 100644
--- a/src/java/org/apache/cassandra/repair/consistent/SyncStatSummary.java
+++ b/src/java/org/apache/cassandra/repair/consistent/SyncStatSummary.java
@@ -18,15 +18,16 @@
 
 package org.apache.cassandra.repair.consistent;
 
+import java.net.InetSocketAddress;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Optional;
 
 import com.google.common.collect.Lists;
 
-import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.repair.RepairResult;
 import org.apache.cassandra.repair.RepairSessionResult;
 import org.apache.cassandra.repair.SyncStat;
@@ -44,14 +45,14 @@
 
     private static class Session
     {
-        final InetAddressAndPort src;
-        final InetAddressAndPort dst;
+        final InetSocketAddress src;
+        final InetSocketAddress dst;
 
         int files = 0;
         long bytes = 0;
         long ranges = 0;
 
-        Session(InetAddressAndPort src, InetAddressAndPort dst)
+        Session(InetSocketAddress src, InetSocketAddress dst)
         {
             this.src = src;
             this.dst = dst;
@@ -86,7 +87,7 @@
         int ranges = -1;
         boolean totalsCalculated = false;
 
-        final Map<Pair<InetAddressAndPort, InetAddressAndPort>, Session> sessions = new HashMap<>();
+        final Map<Pair<InetSocketAddress, InetSocketAddress>, Session> sessions = new HashMap<>();
 
         Table(String keyspace, String table)
         {
@@ -94,9 +95,9 @@
             this.table = table;
         }
 
-        Session getOrCreate(InetAddressAndPort from, InetAddressAndPort to)
+        Session getOrCreate(InetSocketAddress from, InetSocketAddress to)
         {
-            Pair<InetAddressAndPort, InetAddressAndPort> k = Pair.create(from, to);
+            Pair<InetSocketAddress, InetSocketAddress> k = Pair.create(from, to);
             if (!sessions.containsKey(k))
             {
                 sessions.put(k, new Session(from, to));
@@ -178,11 +179,11 @@
         summaries.get(cf).consumeStats(result.stats);
     }
 
-    public void consumeSessionResults(List<RepairSessionResult> results)
+    public void consumeSessionResults(Optional<List<RepairSessionResult>> results)
     {
-        if (results != null)
+        if (results.isPresent())
         {
-            filter(results, Objects::nonNull).forEach(r -> filter(r.repairJobResults, Objects::nonNull).forEach(this::consumeRepairResult));
+            filter(results.get(), Objects::nonNull).forEach(r -> filter(r.repairJobResults, Objects::nonNull).forEach(this::consumeRepairResult));
         }
     }
 
diff --git a/src/java/org/apache/cassandra/repair/consistent/admin/CleanupSummary.java b/src/java/org/apache/cassandra/repair/consistent/admin/CleanupSummary.java
index f984411..2d21deb 100644
--- a/src/java/org/apache/cassandra/repair/consistent/admin/CleanupSummary.java
+++ b/src/java/org/apache/cassandra/repair/consistent/admin/CleanupSummary.java
@@ -22,7 +22,6 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 
 import javax.management.openmbean.ArrayType;
 import javax.management.openmbean.CompositeData;
@@ -37,6 +36,7 @@
 import com.google.common.collect.Sets;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class CleanupSummary
 {
@@ -64,10 +64,10 @@
     public final String keyspace;
     public final String table;
 
-    public final Set<UUID> successful;
-    public final Set<UUID> unsuccessful;
+    public final Set<TimeUUID> successful;
+    public final Set<TimeUUID> unsuccessful;
 
-    public CleanupSummary(String keyspace, String table, Set<UUID> successful, Set<UUID> unsuccessful)
+    public CleanupSummary(String keyspace, String table, Set<TimeUUID> successful, Set<TimeUUID> unsuccessful)
     {
         this.keyspace = keyspace;
         this.table = table;
@@ -75,7 +75,7 @@
         this.unsuccessful = unsuccessful;
     }
 
-    public CleanupSummary(ColumnFamilyStore cfs, Set<UUID> successful, Set<UUID> unsuccessful)
+    public CleanupSummary(ColumnFamilyStore cfs, Set<TimeUUID> successful, Set<TimeUUID> unsuccessful)
     {
         this(cfs.keyspace.getName(), cfs.name, successful, unsuccessful);
     }
@@ -85,30 +85,30 @@
         Preconditions.checkArgument(l.keyspace.equals(r.keyspace));
         Preconditions.checkArgument(l.table.equals(r.table));
 
-        Set<UUID> unsuccessful = new HashSet<>(l.unsuccessful);
+        Set<TimeUUID> unsuccessful = new HashSet<>(l.unsuccessful);
         unsuccessful.addAll(r.unsuccessful);
 
-        Set<UUID> successful = new HashSet<>(l.successful);
+        Set<TimeUUID> successful = new HashSet<>(l.successful);
         successful.addAll(r.successful);
         successful.removeAll(unsuccessful);
 
         return new CleanupSummary(l.keyspace, l.table, successful, unsuccessful);
     }
 
-    private static String[] uuids2Strings(Set<UUID> uuids)
+    private static String[] uuids2Strings(Set<TimeUUID> uuids)
     {
         String[] strings = new String[uuids.size()];
         int idx = 0;
-        for (UUID uuid : uuids)
+        for (TimeUUID uuid : uuids)
             strings[idx++] = uuid.toString();
         return strings;
     }
 
-    private static Set<UUID> strings2Uuids(String[] strings)
+    private static Set<TimeUUID> strings2Uuids(String[] strings)
     {
-        Set<UUID> uuids = Sets.newHashSetWithExpectedSize(strings.length);
+        Set<TimeUUID> uuids = Sets.newHashSetWithExpectedSize(strings.length);
         for (String string : strings)
-            uuids.add(UUID.fromString(string));
+            uuids.add(TimeUUID.fromString(string));
 
         return uuids;
     }
diff --git a/src/java/org/apache/cassandra/repair/consistent/admin/PendingStat.java b/src/java/org/apache/cassandra/repair/consistent/admin/PendingStat.java
index 0c4424e..b7d4fea 100644
--- a/src/java/org/apache/cassandra/repair/consistent/admin/PendingStat.java
+++ b/src/java/org/apache/cassandra/repair/consistent/admin/PendingStat.java
@@ -23,7 +23,6 @@
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import javax.management.openmbean.ArrayType;
 import javax.management.openmbean.CompositeData;
 import javax.management.openmbean.CompositeDataSupport;
@@ -32,13 +31,12 @@
 import javax.management.openmbean.OpenType;
 import javax.management.openmbean.SimpleType;
 
-import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Throwables;
-import com.google.common.collect.Iterables;
 
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class PendingStat
 {
@@ -65,9 +63,9 @@
 
     public final long dataSize;
     public final int numSSTables;
-    public final Set<UUID> sessions;
+    public final Set<TimeUUID> sessions;
 
-    public PendingStat(long dataSize, int numSSTables, Set<UUID> sessions)
+    public PendingStat(long dataSize, int numSSTables, Set<TimeUUID> sessions)
     {
         this.dataSize = dataSize;
         this.numSSTables = numSSTables;
@@ -86,7 +84,7 @@
         values.put(COMPOSITE_NAMES[1], numSSTables);
         String[] sessionIds = new String[sessions.size()];
         int idx = 0;
-        for (UUID session : sessions)
+        for (TimeUUID session : sessions)
             sessionIds[idx++] = session.toString();
         values.put(COMPOSITE_NAMES[2], sessionIds);
 
@@ -104,9 +102,9 @@
     {
         Preconditions.checkArgument(cd.getCompositeType().equals(COMPOSITE_TYPE));
         Object[] values = cd.getAll(COMPOSITE_NAMES);
-        Set<UUID> sessions = new HashSet<>();
+        Set<TimeUUID> sessions = new HashSet<>();
         for (String session : (String[]) values[2])
-            sessions.add(UUID.fromString(session));
+            sessions.add(TimeUUID.fromString(session));
         return new PendingStat((long) values[0], (int) values[1], sessions);
     }
 
@@ -114,11 +112,11 @@
     {
         public long dataSize = 0;
         public int numSSTables = 0;
-        public Set<UUID> sessions = new HashSet<>();
+        public Set<TimeUUID> sessions = new HashSet<>();
 
         public Builder addSSTable(SSTableReader sstable)
         {
-            UUID sessionID = sstable.getPendingRepair();
+            TimeUUID sessionID = sstable.getPendingRepair();
             if (sessionID == null)
                 return this;
             dataSize += sstable.onDiskLength();
diff --git a/src/java/org/apache/cassandra/repair/consistent/admin/SchemaArgsParser.java b/src/java/org/apache/cassandra/repair/consistent/admin/SchemaArgsParser.java
index 67c0244..bfcc8cd 100644
--- a/src/java/org/apache/cassandra/repair/consistent/admin/SchemaArgsParser.java
+++ b/src/java/org/apache/cassandra/repair/consistent/admin/SchemaArgsParser.java
@@ -73,7 +73,7 @@
         if (schemaArgs.isEmpty())
         {
             // iterate over everything
-            Iterator<String> ksNames = Schema.instance.getNonLocalStrategyKeyspaces().iterator();
+            Iterator<String> ksNames = Schema.instance.getNonLocalStrategyKeyspaces().names().iterator();
 
             return new AbstractIterator<ColumnFamilyStore>()
             {
diff --git a/src/java/org/apache/cassandra/repair/messages/CleanupMessage.java b/src/java/org/apache/cassandra/repair/messages/CleanupMessage.java
index 5ec7fc6..0e1a74f 100644
--- a/src/java/org/apache/cassandra/repair/messages/CleanupMessage.java
+++ b/src/java/org/apache/cassandra/repair/messages/CleanupMessage.java
@@ -19,12 +19,11 @@
 
 import java.io.IOException;
 import java.util.Objects;
-import java.util.UUID;
 
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Message to cleanup repair resources on replica nodes.
@@ -33,9 +32,9 @@
  */
 public class CleanupMessage extends RepairMessage
 {
-    public final UUID parentRepairSession;
+    public final TimeUUID parentRepairSession;
 
-    public CleanupMessage(UUID parentRepairSession)
+    public CleanupMessage(TimeUUID parentRepairSession)
     {
         super(null);
         this.parentRepairSession = parentRepairSession;
@@ -60,18 +59,18 @@
     {
         public void serialize(CleanupMessage message, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(message.parentRepairSession, out, version);
+            message.parentRepairSession.serialize(out);
         }
 
         public CleanupMessage deserialize(DataInputPlus in, int version) throws IOException
         {
-            UUID parentRepairSession = UUIDSerializer.serializer.deserialize(in, version);
+            TimeUUID parentRepairSession = TimeUUID.deserialize(in);
             return new CleanupMessage(parentRepairSession);
         }
 
         public long serializedSize(CleanupMessage message, int version)
         {
-            return UUIDSerializer.serializer.serializedSize(message.parentRepairSession, version);
+            return TimeUUID.sizeInBytes();
         }
     };
 }
diff --git a/src/java/org/apache/cassandra/repair/messages/FailSession.java b/src/java/org/apache/cassandra/repair/messages/FailSession.java
index b8c7ad3..f6826ee 100644
--- a/src/java/org/apache/cassandra/repair/messages/FailSession.java
+++ b/src/java/org/apache/cassandra/repair/messages/FailSession.java
@@ -19,18 +19,17 @@
 package org.apache.cassandra.repair.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class FailSession extends RepairMessage
 {
-    public final UUID sessionID;
+    public final TimeUUID sessionID;
 
-    public FailSession(UUID sessionID)
+    public FailSession(TimeUUID sessionID)
     {
         super(null);
         assert sessionID != null;
@@ -56,17 +55,17 @@
     {
         public void serialize(FailSession msg, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(msg.sessionID, out, version);
+            msg.sessionID.serialize(out);
         }
 
         public FailSession deserialize(DataInputPlus in, int version) throws IOException
         {
-            return new FailSession(UUIDSerializer.serializer.deserialize(in, version));
+            return new FailSession(TimeUUID.deserialize(in));
         }
 
         public long serializedSize(FailSession msg, int version)
         {
-            return UUIDSerializer.serializer.serializedSize(msg.sessionID, version);
+            return TimeUUID.sizeInBytes();
         }
     };
 }
diff --git a/src/java/org/apache/cassandra/repair/messages/FinalizeCommit.java b/src/java/org/apache/cassandra/repair/messages/FinalizeCommit.java
index bb5cca7..ca4e6d8 100644
--- a/src/java/org/apache/cassandra/repair/messages/FinalizeCommit.java
+++ b/src/java/org/apache/cassandra/repair/messages/FinalizeCommit.java
@@ -19,18 +19,17 @@
 package org.apache.cassandra.repair.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class FinalizeCommit extends RepairMessage
 {
-    public final UUID sessionID;
+    public final TimeUUID sessionID;
 
-    public FinalizeCommit(UUID sessionID)
+    public FinalizeCommit(TimeUUID sessionID)
     {
         super(null);
         assert sessionID != null;
@@ -63,17 +62,17 @@
     {
         public void serialize(FinalizeCommit msg, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(msg.sessionID, out, version);
+            msg.sessionID.serialize(out);
         }
 
         public FinalizeCommit deserialize(DataInputPlus in, int version) throws IOException
         {
-            return new FinalizeCommit(UUIDSerializer.serializer.deserialize(in, version));
+            return new FinalizeCommit(TimeUUID.deserialize(in));
         }
 
         public long serializedSize(FinalizeCommit msg, int version)
         {
-            return UUIDSerializer.serializer.serializedSize(msg.sessionID, version);
+            return TimeUUID.sizeInBytes();
         }
     };
 }
diff --git a/src/java/org/apache/cassandra/repair/messages/FinalizePromise.java b/src/java/org/apache/cassandra/repair/messages/FinalizePromise.java
index cfdc07c..c45f46d 100644
--- a/src/java/org/apache/cassandra/repair/messages/FinalizePromise.java
+++ b/src/java/org/apache/cassandra/repair/messages/FinalizePromise.java
@@ -19,24 +19,23 @@
 package org.apache.cassandra.repair.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
 
 public class FinalizePromise extends RepairMessage
 {
-    public final UUID sessionID;
+    public final TimeUUID sessionID;
     public final InetAddressAndPort participant;
     public final boolean promised;
 
-    public FinalizePromise(UUID sessionID, InetAddressAndPort participant, boolean promised)
+    public FinalizePromise(TimeUUID sessionID, InetAddressAndPort participant, boolean promised)
     {
         super(null);
         assert sessionID != null;
@@ -70,21 +69,21 @@
     {
         public void serialize(FinalizePromise msg, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(msg.sessionID, out, version);
+            msg.sessionID.serialize(out);
             inetAddressAndPortSerializer.serialize(msg.participant, out, version);
             out.writeBoolean(msg.promised);
         }
 
         public FinalizePromise deserialize(DataInputPlus in, int version) throws IOException
         {
-            return new FinalizePromise(UUIDSerializer.serializer.deserialize(in, version),
+            return new FinalizePromise(TimeUUID.deserialize(in),
                                        inetAddressAndPortSerializer.deserialize(in, version),
                                        in.readBoolean());
         }
 
         public long serializedSize(FinalizePromise msg, int version)
         {
-            long size = UUIDSerializer.serializer.serializedSize(msg.sessionID, version);
+            long size = TimeUUID.sizeInBytes();
             size += inetAddressAndPortSerializer.serializedSize(msg.participant, version);
             size += TypeSizes.sizeof(msg.promised);
             return size;
diff --git a/src/java/org/apache/cassandra/repair/messages/FinalizePropose.java b/src/java/org/apache/cassandra/repair/messages/FinalizePropose.java
index c21dd78..b3c4bfd 100644
--- a/src/java/org/apache/cassandra/repair/messages/FinalizePropose.java
+++ b/src/java/org/apache/cassandra/repair/messages/FinalizePropose.java
@@ -19,18 +19,17 @@
 package org.apache.cassandra.repair.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class FinalizePropose extends RepairMessage
 {
-    public final UUID sessionID;
+    public final TimeUUID sessionID;
 
-    public FinalizePropose(UUID sessionID)
+    public FinalizePropose(TimeUUID sessionID)
     {
         super(null);
         assert sessionID != null;
@@ -63,17 +62,17 @@
     {
         public void serialize(FinalizePropose msg, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(msg.sessionID, out, version);
+            msg.sessionID.serialize(out);
         }
 
         public FinalizePropose deserialize(DataInputPlus in, int version) throws IOException
         {
-            return new FinalizePropose(UUIDSerializer.serializer.deserialize(in, version));
+            return new FinalizePropose(TimeUUID.deserialize(in));
         }
 
         public long serializedSize(FinalizePropose msg, int version)
         {
-            return UUIDSerializer.serializer.serializedSize(msg.sessionID, version);
+            return TimeUUID.sizeInBytes();
         }
     };
 }
diff --git a/src/java/org/apache/cassandra/repair/messages/PrepareConsistentRequest.java b/src/java/org/apache/cassandra/repair/messages/PrepareConsistentRequest.java
index c1be082..9ac1461 100644
--- a/src/java/org/apache/cassandra/repair/messages/PrepareConsistentRequest.java
+++ b/src/java/org/apache/cassandra/repair/messages/PrepareConsistentRequest.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.ImmutableSet;
 
@@ -30,17 +29,17 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
 
 public class PrepareConsistentRequest extends RepairMessage
 {
-    public final UUID parentSession;
+    public final TimeUUID parentSession;
     public final InetAddressAndPort coordinator;
     public final Set<InetAddressAndPort> participants;
 
-    public PrepareConsistentRequest(UUID parentSession, InetAddressAndPort coordinator, Set<InetAddressAndPort> participants)
+    public PrepareConsistentRequest(TimeUUID parentSession, InetAddressAndPort coordinator, Set<InetAddressAndPort> participants)
     {
         super(null);
         assert parentSession != null;
@@ -84,7 +83,7 @@
     {
         public void serialize(PrepareConsistentRequest request, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(request.parentSession, out, version);
+            request.parentSession.serialize(out);
             inetAddressAndPortSerializer.serialize(request.coordinator, out, version);
             out.writeInt(request.participants.size());
             for (InetAddressAndPort peer : request.participants)
@@ -95,7 +94,7 @@
 
         public PrepareConsistentRequest deserialize(DataInputPlus in, int version) throws IOException
         {
-            UUID sessionId = UUIDSerializer.serializer.deserialize(in, version);
+            TimeUUID sessionId = TimeUUID.deserialize(in);
             InetAddressAndPort coordinator = inetAddressAndPortSerializer.deserialize(in, version);
             int numPeers = in.readInt();
             Set<InetAddressAndPort> peers = new HashSet<>(numPeers);
@@ -109,7 +108,7 @@
 
         public long serializedSize(PrepareConsistentRequest request, int version)
         {
-            long size = UUIDSerializer.serializer.serializedSize(request.parentSession, version);
+            long size = TimeUUID.sizeInBytes();
             size += inetAddressAndPortSerializer.serializedSize(request.coordinator, version);
             size += TypeSizes.sizeof(request.participants.size());
             for (InetAddressAndPort peer : request.participants)
diff --git a/src/java/org/apache/cassandra/repair/messages/PrepareConsistentResponse.java b/src/java/org/apache/cassandra/repair/messages/PrepareConsistentResponse.java
index 00de77d..a422d7f 100644
--- a/src/java/org/apache/cassandra/repair/messages/PrepareConsistentResponse.java
+++ b/src/java/org/apache/cassandra/repair/messages/PrepareConsistentResponse.java
@@ -19,24 +19,23 @@
 package org.apache.cassandra.repair.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
 
 public class PrepareConsistentResponse extends RepairMessage
 {
-    public final UUID parentSession;
+    public final TimeUUID parentSession;
     public final InetAddressAndPort participant;
     public final boolean success;
 
-    public PrepareConsistentResponse(UUID parentSession, InetAddressAndPort participant, boolean success)
+    public PrepareConsistentResponse(TimeUUID parentSession, InetAddressAndPort participant, boolean success)
     {
         super(null);
         assert parentSession != null;
@@ -70,21 +69,21 @@
     {
         public void serialize(PrepareConsistentResponse response, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(response.parentSession, out, version);
+            response.parentSession.serialize(out);
             inetAddressAndPortSerializer.serialize(response.participant, out, version);
             out.writeBoolean(response.success);
         }
 
         public PrepareConsistentResponse deserialize(DataInputPlus in, int version) throws IOException
         {
-            return new PrepareConsistentResponse(UUIDSerializer.serializer.deserialize(in, version),
+            return new PrepareConsistentResponse(TimeUUID.deserialize(in),
                                                  inetAddressAndPortSerializer.deserialize(in, version),
                                                  in.readBoolean());
         }
 
         public long serializedSize(PrepareConsistentResponse response, int version)
         {
-            long size = UUIDSerializer.serializer.serializedSize(response.parentSession, version);
+            long size = TimeUUID.sizeInBytes();
             size += inetAddressAndPortSerializer.serializedSize(response.participant, version);
             size += TypeSizes.sizeof(response.success);
             return size;
diff --git a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java
index 7c8db93..7064227 100644
--- a/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java
+++ b/src/java/org/apache/cassandra/repair/messages/PrepareMessage.java
@@ -22,7 +22,6 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Objects;
-import java.util.UUID;
 
 import com.google.common.base.Preconditions;
 
@@ -36,7 +35,7 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.PreviewKind;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 
 public class PrepareMessage extends RepairMessage
@@ -44,20 +43,20 @@
     public final List<TableId> tableIds;
     public final Collection<Range<Token>> ranges;
 
-    public final UUID parentRepairSession;
+    public final TimeUUID parentRepairSession;
     public final boolean isIncremental;
-    public final long timestamp;
+    public final long repairedAt;
     public final boolean isGlobal;
     public final PreviewKind previewKind;
 
-    public PrepareMessage(UUID parentRepairSession, List<TableId> tableIds, Collection<Range<Token>> ranges, boolean isIncremental, long timestamp, boolean isGlobal, PreviewKind previewKind)
+    public PrepareMessage(TimeUUID parentRepairSession, List<TableId> tableIds, Collection<Range<Token>> ranges, boolean isIncremental, long repairedAt, boolean isGlobal, PreviewKind previewKind)
     {
         super(null);
         this.parentRepairSession = parentRepairSession;
         this.tableIds = tableIds;
         this.ranges = ranges;
         this.isIncremental = isIncremental;
-        this.timestamp = timestamp;
+        this.repairedAt = repairedAt;
         this.isGlobal = isGlobal;
         this.previewKind = previewKind;
     }
@@ -72,7 +71,7 @@
                isIncremental == other.isIncremental &&
                isGlobal == other.isGlobal &&
                previewKind == other.previewKind &&
-               timestamp == other.timestamp &&
+               repairedAt == other.repairedAt &&
                tableIds.equals(other.tableIds) &&
                ranges.equals(other.ranges);
     }
@@ -80,7 +79,7 @@
     @Override
     public int hashCode()
     {
-        return Objects.hash(parentRepairSession, isGlobal, previewKind, isIncremental, timestamp, tableIds, ranges);
+        return Objects.hash(parentRepairSession, isGlobal, previewKind, isIncremental, repairedAt, tableIds, ranges);
     }
 
     private static final String MIXED_MODE_ERROR = "Some nodes involved in repair are on an incompatible major version. " +
@@ -95,7 +94,7 @@
             out.writeInt(message.tableIds.size());
             for (TableId tableId : message.tableIds)
                 tableId.serialize(out);
-            UUIDSerializer.serializer.serialize(message.parentRepairSession, out, version);
+            message.parentRepairSession.serialize(out);
             out.writeInt(message.ranges.size());
             for (Range<Token> r : message.ranges)
             {
@@ -103,7 +102,7 @@
                 Range.tokenSerializer.serialize(r, out, version);
             }
             out.writeBoolean(message.isIncremental);
-            out.writeLong(message.timestamp);
+            out.writeLong(message.repairedAt);
             out.writeBoolean(message.isGlobal);
             out.writeInt(message.previewKind.getSerializationVal());
         }
@@ -116,7 +115,7 @@
             List<TableId> tableIds = new ArrayList<>(tableIdCount);
             for (int i = 0; i < tableIdCount; i++)
                 tableIds.add(TableId.deserialize(in));
-            UUID parentRepairSession = UUIDSerializer.serializer.deserialize(in, version);
+            TimeUUID parentRepairSession = TimeUUID.deserialize(in);
             int rangeCount = in.readInt();
             List<Range<Token>> ranges = new ArrayList<>(rangeCount);
             for (int i = 0; i < rangeCount; i++)
@@ -134,12 +133,12 @@
             size = TypeSizes.sizeof(message.tableIds.size());
             for (TableId tableId : message.tableIds)
                 size += tableId.serializedSize();
-            size += UUIDSerializer.serializer.serializedSize(message.parentRepairSession, version);
+            size += TimeUUID.sizeInBytes();
             size += TypeSizes.sizeof(message.ranges.size());
             for (Range<Token> r : message.ranges)
                 size += Range.tokenSerializer.serializedSize(r, version);
             size += TypeSizes.sizeof(message.isIncremental);
-            size += TypeSizes.sizeof(message.timestamp);
+            size += TypeSizes.sizeof(message.repairedAt);
             size += TypeSizes.sizeof(message.isGlobal);
             size += TypeSizes.sizeof(message.previewKind.getSerializationVal());
             return size;
@@ -154,7 +153,7 @@
                ", ranges=" + ranges +
                ", parentRepairSession=" + parentRepairSession +
                ", isIncremental=" + isIncremental +
-               ", timestamp=" + timestamp +
+               ", timestamp=" + repairedAt +
                ", isGlobal=" + isGlobal +
                '}';
     }
diff --git a/src/java/org/apache/cassandra/repair/messages/RepairMessage.java b/src/java/org/apache/cassandra/repair/messages/RepairMessage.java
index 165911d..00ce888 100644
--- a/src/java/org/apache/cassandra/repair/messages/RepairMessage.java
+++ b/src/java/org/apache/cassandra/repair/messages/RepairMessage.java
@@ -17,8 +17,6 @@
  */
 package org.apache.cassandra.repair.messages;
 
-import java.util.UUID;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -31,7 +29,9 @@
 import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.repair.RepairJobDesc;
+import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.net.MessageFlag.CALL_BACK_ON_FAILURE;
 
@@ -78,7 +78,7 @@
                 logger.error("[#{}] {} failed on {}: {}", request.desc.parentSessionId, verb, from, failureReason);
 
                 if (supportsTimeouts(from, request.desc.parentSessionId))
-                    failureCallback.onFailure(new RepairException(request.desc, String.format("Got %s failure from %s: %s", verb, from, failureReason)));
+                    failureCallback.onFailure(RepairException.error(request.desc, PreviewKind.NONE, String.format("Got %s failure from %s: %s", verb, from, failureReason)));
             }
         };
 
@@ -87,7 +87,7 @@
                                                      callback);
     }
 
-    private static boolean supportsTimeouts(InetAddressAndPort from, UUID parentSessionId)
+    private static boolean supportsTimeouts(InetAddressAndPort from, TimeUUID parentSessionId)
     {
         CassandraVersion remoteVersion = Gossiper.instance.getReleaseVersion(from);
         if (remoteVersion != null && remoteVersion.compareTo(SUPPORTS_TIMEOUTS) >= 0)
diff --git a/src/java/org/apache/cassandra/repair/messages/RepairOption.java b/src/java/org/apache/cassandra/repair/messages/RepairOption.java
index c2e2c18..6bb7fdb 100644
--- a/src/java/org/apache/cassandra/repair/messages/RepairOption.java
+++ b/src/java/org/apache/cassandra/repair/messages/RepairOption.java
@@ -20,17 +20,16 @@
 import java.util.*;
 
 import com.google.common.base.Joiner;
+import com.google.common.base.Preconditions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.repair.RepairParallelism;
-import org.apache.cassandra.utils.FBUtilities;
 
 /**
  * Repair options.
@@ -52,6 +51,8 @@
     public static final String PREVIEW = "previewKind";
     public static final String OPTIMISE_STREAMS_KEY = "optimiseStreams";
     public static final String IGNORE_UNREPLICATED_KS = "ignoreUnreplicatedKeyspaces";
+    public static final String REPAIR_PAXOS_KEY = "repairPaxos";
+    public static final String PAXOS_ONLY_KEY = "paxosOnly";
 
     // we don't want to push nodes too much for repair
     public static final int MAX_JOB_THREADS = 4;
@@ -181,6 +182,14 @@
         boolean force = Boolean.parseBoolean(options.get(FORCE_REPAIR_KEY));
         boolean pullRepair = Boolean.parseBoolean(options.get(PULL_REPAIR_KEY));
         boolean ignoreUnreplicatedKeyspaces = Boolean.parseBoolean(options.get(IGNORE_UNREPLICATED_KS));
+        boolean repairPaxos = Boolean.parseBoolean(options.get(REPAIR_PAXOS_KEY));
+        boolean paxosOnly = Boolean.parseBoolean(options.get(PAXOS_ONLY_KEY));
+
+        if (previewKind != PreviewKind.NONE)
+        {
+            Preconditions.checkArgument(!repairPaxos, "repairPaxos must be set to false for preview repairs");
+            Preconditions.checkArgument(!paxosOnly, "paxosOnly must be set to false for preview repairs");
+        }
 
         int jobThreads = 1;
         if (options.containsKey(JOB_THREADS_KEY))
@@ -197,7 +206,7 @@
 
         boolean asymmetricSyncing = Boolean.parseBoolean(options.get(OPTIMISE_STREAMS_KEY));
 
-        RepairOption option = new RepairOption(parallelism, primaryRange, incremental, trace, jobThreads, ranges, !ranges.isEmpty(), pullRepair, force, previewKind, asymmetricSyncing, ignoreUnreplicatedKeyspaces);
+        RepairOption option = new RepairOption(parallelism, primaryRange, incremental, trace, jobThreads, ranges, !ranges.isEmpty(), pullRepair, force, previewKind, asymmetricSyncing, ignoreUnreplicatedKeyspaces, repairPaxos, paxosOnly);
 
         // data centers
         String dataCentersStr = options.get(DATACENTERS_KEY);
@@ -277,24 +286,18 @@
     private final PreviewKind previewKind;
     private final boolean optimiseStreams;
     private final boolean ignoreUnreplicatedKeyspaces;
+    private final boolean repairPaxos;
+    private final boolean paxosOnly;
 
     private final Collection<String> columnFamilies = new HashSet<>();
     private final Collection<String> dataCenters = new HashSet<>();
     private final Collection<String> hosts = new HashSet<>();
     private final Collection<Range<Token>> ranges = new HashSet<>();
 
-    public RepairOption(RepairParallelism parallelism, boolean primaryRange, boolean incremental, boolean trace, int jobThreads, Collection<Range<Token>> ranges, boolean isSubrangeRepair, boolean pullRepair, boolean forceRepair, PreviewKind previewKind, boolean optimiseStreams, boolean ignoreUnreplicatedKeyspaces)
+    public RepairOption(RepairParallelism parallelism, boolean primaryRange, boolean incremental, boolean trace, int jobThreads, Collection<Range<Token>> ranges, boolean isSubrangeRepair, boolean pullRepair, boolean forceRepair, PreviewKind previewKind, boolean optimiseStreams, boolean ignoreUnreplicatedKeyspaces, boolean repairPaxos, boolean paxosOnly)
     {
-        if (FBUtilities.isWindows &&
-            (DatabaseDescriptor.getDiskAccessMode() != Config.DiskAccessMode.standard || DatabaseDescriptor.getIndexAccessMode() != Config.DiskAccessMode.standard) &&
-            parallelism == RepairParallelism.SEQUENTIAL)
-        {
-            logger.warn("Sequential repair disabled when memory-mapped I/O is configured on Windows. Reverting to parallel.");
-            this.parallelism = RepairParallelism.PARALLEL;
-        }
-        else
-            this.parallelism = parallelism;
 
+        this.parallelism = parallelism;
         this.primaryRange = primaryRange;
         this.incremental = incremental;
         this.trace = trace;
@@ -306,6 +309,8 @@
         this.previewKind = previewKind;
         this.optimiseStreams = optimiseStreams;
         this.ignoreUnreplicatedKeyspaces = ignoreUnreplicatedKeyspaces;
+        this.repairPaxos = repairPaxos;
+        this.paxosOnly = paxosOnly;
     }
 
     public RepairParallelism getParallelism()
@@ -413,6 +418,16 @@
         return ignoreUnreplicatedKeyspaces;
     }
 
+    public boolean repairPaxos()
+    {
+        return repairPaxos;
+    }
+
+    public boolean paxosOnly()
+    {
+        return paxosOnly;
+    }
+
     @Override
     public String toString()
     {
@@ -430,6 +445,8 @@
                ", force repair: " + forceRepair +
                ", optimise streams: "+ optimiseStreams() +
                ", ignore unreplicated keyspaces: "+ ignoreUnreplicatedKeyspaces +
+               ", repairPaxos: " + repairPaxos +
+               ", paxosOnly: " + paxosOnly +
                ')';
     }
 
@@ -450,6 +467,8 @@
         options.put(FORCE_REPAIR_KEY, Boolean.toString(forceRepair));
         options.put(PREVIEW, previewKind.toString());
         options.put(OPTIMISE_STREAMS_KEY, Boolean.toString(optimiseStreams));
+        options.put(REPAIR_PAXOS_KEY, Boolean.toString(repairPaxos));
+        options.put(PAXOS_ONLY_KEY, Boolean.toString(paxosOnly));
         return options;
     }
 }
diff --git a/src/java/org/apache/cassandra/repair/messages/StatusRequest.java b/src/java/org/apache/cassandra/repair/messages/StatusRequest.java
index 09354e6..ec325ad 100644
--- a/src/java/org/apache/cassandra/repair/messages/StatusRequest.java
+++ b/src/java/org/apache/cassandra/repair/messages/StatusRequest.java
@@ -19,18 +19,17 @@
 package org.apache.cassandra.repair.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class StatusRequest extends RepairMessage
 {
-    public final UUID sessionID;
+    public final TimeUUID sessionID;
 
-    public StatusRequest(UUID sessionID)
+    public StatusRequest(TimeUUID sessionID)
     {
         super(null);
         this.sessionID = sessionID;
@@ -62,17 +61,17 @@
     {
         public void serialize(StatusRequest msg, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(msg.sessionID, out, version);
+            msg.sessionID.serialize(out);
         }
 
         public StatusRequest deserialize(DataInputPlus in, int version) throws IOException
         {
-            return new StatusRequest(UUIDSerializer.serializer.deserialize(in, version));
+            return new StatusRequest(TimeUUID.deserialize(in));
         }
 
         public long serializedSize(StatusRequest msg, int version)
         {
-            return UUIDSerializer.serializer.serializedSize(msg.sessionID, version);
+            return TimeUUID.sizeInBytes();
         }
     };
 }
diff --git a/src/java/org/apache/cassandra/repair/messages/StatusResponse.java b/src/java/org/apache/cassandra/repair/messages/StatusResponse.java
index e62d337..7e7d6e0 100644
--- a/src/java/org/apache/cassandra/repair/messages/StatusResponse.java
+++ b/src/java/org/apache/cassandra/repair/messages/StatusResponse.java
@@ -19,21 +19,20 @@
 package org.apache.cassandra.repair.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.repair.consistent.ConsistentSession;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class StatusResponse extends RepairMessage
 {
-    public final UUID sessionID;
+    public final TimeUUID sessionID;
     public final ConsistentSession.State state;
 
-    public StatusResponse(UUID sessionID, ConsistentSession.State state)
+    public StatusResponse(TimeUUID sessionID, ConsistentSession.State state)
     {
         super(null);
         assert sessionID != null;
@@ -72,19 +71,19 @@
     {
         public void serialize(StatusResponse msg, DataOutputPlus out, int version) throws IOException
         {
-            UUIDSerializer.serializer.serialize(msg.sessionID, out, version);
+            msg.sessionID.serialize(out);
             out.writeInt(msg.state.ordinal());
         }
 
         public StatusResponse deserialize(DataInputPlus in, int version) throws IOException
         {
-            return new StatusResponse(UUIDSerializer.serializer.deserialize(in, version),
+            return new StatusResponse(TimeUUID.deserialize(in),
                                       ConsistentSession.State.valueOf(in.readInt()));
         }
 
         public long serializedSize(StatusResponse msg, int version)
         {
-            return UUIDSerializer.serializer.serializedSize(msg.sessionID, version)
+            return TimeUUID.sizeInBytes()
                    + TypeSizes.sizeof(msg.state.ordinal());
         }
     };
diff --git a/src/java/org/apache/cassandra/repair/state/AbstractCompletable.java b/src/java/org/apache/cassandra/repair/state/AbstractCompletable.java
new file mode 100644
index 0000000..20e59d6
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/AbstractCompletable.java
@@ -0,0 +1,128 @@
+/*
+ * 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.repair.state;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.base.Throwables;
+
+import org.apache.cassandra.utils.Clock;
+
+public class AbstractCompletable<I> implements Completable<I>
+{
+    private final long creationTimeMillis = Clock.Global.currentTimeMillis(); // used to convert from nanos to millis
+    private final long creationTimeNanos = Clock.Global.nanoTime();
+    private final AtomicReference<Result> result = new AtomicReference<>(null);
+    public final I id;
+    protected volatile long lastUpdatedAtNs;
+
+    public AbstractCompletable(I id)
+    {
+        this.id = id;
+    }
+
+    @Override
+    public I getId()
+    {
+        return id;
+    }
+
+    @Override
+    public long getInitializedAtMillis()
+    {
+        return nanosToMillis(creationTimeNanos);
+    }
+
+    @Override
+    public long getInitializedAtNanos()
+    {
+        return creationTimeNanos;
+    }
+
+    @Override
+    public long getLastUpdatedAtMillis()
+    {
+        return nanosToMillis(lastUpdatedAtNs);
+    }
+
+    @Override
+    public long getLastUpdatedAtNanos()
+    {
+        return lastUpdatedAtNs;
+    }
+
+    @Override
+    public Result getResult()
+    {
+        return result.get();
+    }
+
+    public void updated()
+    {
+        lastUpdatedAtNs = Clock.Global.nanoTime();
+    }
+
+    protected boolean tryResult(Result result)
+    {
+        if (!this.result.compareAndSet(null, result))
+            return false;
+        onComplete();
+        lastUpdatedAtNs = Clock.Global.nanoTime();
+        return true;
+    }
+
+    protected void onComplete() {}
+
+    protected long nanosToMillis(long nanos)
+    {
+        // nanos - creationTimeNanos = delta since init
+        return creationTimeMillis + TimeUnit.NANOSECONDS.toMillis(nanos - creationTimeNanos);
+    }
+
+    protected class BaseSkipPhase extends BasePhase
+    {
+        public void skip(String msg)
+        {
+            tryResult(Result.skip(msg));
+        }
+    }
+
+    protected class BasePhase
+    {
+        public void success()
+        {
+            tryResult(Result.success());
+        }
+
+        public void success(String msg)
+        {
+            tryResult(Result.success(msg));
+        }
+
+        public void fail(Throwable e)
+        {
+            fail(e == null ? null : Throwables.getStackTraceAsString(e));
+        }
+
+        public void fail(String failureCause)
+        {
+            tryResult(Result.fail(failureCause));
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/state/AbstractState.java b/src/java/org/apache/cassandra/repair/state/AbstractState.java
new file mode 100644
index 0000000..f9b0a93
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/AbstractState.java
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.repair.state;
+
+import java.util.EnumMap;
+
+import org.apache.cassandra.utils.Clock;
+
+public abstract class AbstractState<T extends Enum<T>, I> extends AbstractCompletable<I> implements State<T, I>
+{
+    public static final int INIT = -1;
+    public static final int COMPLETE = -2;
+
+    private final Class<T> klass;
+    protected final long[] stateTimesNanos;
+    protected int currentState = INIT;
+
+    public AbstractState(I id, Class<T> klass)
+    {
+        super(id);
+        this.klass = klass;
+        this.stateTimesNanos = new long[klass.getEnumConstants().length];
+    }
+
+    @Override
+    public T getStatus()
+    {
+        int current = currentState;
+        if (current < 0) // init or complete
+            return null;
+        return klass.getEnumConstants()[current];
+    }
+
+    public int getCurrentState()
+    {
+        return currentState;
+    }
+
+    @Override
+    public EnumMap<T, Long> getStateTimesMillis()
+    {
+        long[] millis = getStateTimesMillisArray();
+        EnumMap<T, Long> map = new EnumMap<>(klass);
+        for (int i = 0; i < millis.length; i++)
+        {
+            long ms = millis[i];
+            if (ms != 0)
+                map.put(klass.getEnumConstants()[i], ms);
+        }
+        return map;
+    }
+
+    @Override
+    protected void onComplete()
+    {
+        currentState = COMPLETE;
+    }
+
+    private long[] getStateTimesMillisArray()
+    {
+        long[] millis = new long[stateTimesNanos.length];
+        for (int i = 0; i < millis.length; i++)
+        {
+            long value = stateTimesNanos[i];
+            if (value != 0)
+                millis[i] = nanosToMillis(value);
+        }
+        return millis;
+    }
+
+    protected void updateState(T state)
+    {
+        int currentState = this.currentState;
+        if (currentState >= state.ordinal())
+            throw new IllegalStateException("State went backwards; current=" + klass.getEnumConstants()[currentState] + ", desired=" + state);
+        long now = Clock.Global.nanoTime();
+        stateTimesNanos[this.currentState = state.ordinal()] = now;
+        lastUpdatedAtNs = now;
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/state/Completable.java b/src/java/org/apache/cassandra/repair/state/Completable.java
new file mode 100644
index 0000000..61813c6
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/Completable.java
@@ -0,0 +1,101 @@
+/*
+ * 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.repair.state;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.utils.Clock;
+
+public interface Completable<I>
+{
+    I getId();
+
+    long getInitializedAtMillis();
+
+    long getInitializedAtNanos();
+
+    long getLastUpdatedAtMillis();
+
+    long getLastUpdatedAtNanos();
+
+    default long getDurationMillis()
+    {
+        long endNanos = getLastUpdatedAtNanos();
+        if (!isComplete())
+            endNanos = Clock.Global.nanoTime();
+        return TimeUnit.NANOSECONDS.toMillis(endNanos - getInitializedAtNanos());
+    }
+
+    Result getResult();
+
+    default boolean isComplete()
+    {
+        return getResult() != null;
+    }
+
+    default String getFailureCause()
+    {
+        Result r = getResult();
+        if (r == null || r.kind == Result.Kind.SUCCESS)
+            return null;
+        return r.message;
+    }
+
+    default String getSuccessMessage()
+    {
+        Result r = getResult();
+        if (r == null || r.kind != Result.Kind.SUCCESS)
+            return null;
+        return r.message;
+    }
+
+    class Result
+    {
+        public enum Kind
+        {SUCCESS, SKIPPED, FAILURE}
+
+        public final Result.Kind kind;
+        public final String message;
+
+        private Result(Result.Kind kind, String message)
+        {
+            this.kind = kind;
+            this.message = message;
+        }
+
+        protected static Result success()
+        {
+            return new Result(Result.Kind.SUCCESS, null);
+        }
+
+        protected static Result success(String msg)
+        {
+            return new Result(Result.Kind.SUCCESS, msg);
+        }
+
+        protected static Result skip(String msg)
+        {
+            return new Result(Result.Kind.SKIPPED, msg);
+        }
+
+        protected static Result fail(String msg)
+        {
+            return new Result(Result.Kind.FAILURE, msg);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/state/CoordinatorState.java b/src/java/org/apache/cassandra/repair/state/CoordinatorState.java
new file mode 100644
index 0000000..74ca3e3
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/CoordinatorState.java
@@ -0,0 +1,151 @@
+/*
+ * 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.repair.state;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.CommonRange;
+import org.apache.cassandra.repair.RepairRunnable;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+public class CoordinatorState extends AbstractState<CoordinatorState.State, TimeUUID>
+{
+    public enum State
+    {
+        SETUP, START,
+        PREPARE_START, PREPARE_COMPLETE,
+        REPAIR_START, REPAIR_COMPLETE
+    }
+
+    public final int cmd;
+    public final String keyspace;
+    public final RepairOption options;
+    private final ConcurrentMap<TimeUUID, SessionState> sessions = new ConcurrentHashMap<>();
+
+    private List<ColumnFamilyStore> columnFamilies = null;
+    private RepairRunnable.NeighborsAndRanges neighborsAndRanges = null;
+
+    // API to split function calls for phase changes from getting the state
+    public final Phase phase = new Phase();
+
+    public CoordinatorState(int cmd, String keyspace, RepairOption options)
+    {
+        super(nextTimeUUID(), State.class);
+        this.cmd = cmd;
+        this.keyspace = Objects.requireNonNull(keyspace);
+        this.options = Objects.requireNonNull(options);
+    }
+
+    public Collection<SessionState> getSessions()
+    {
+        return sessions.values();
+    }
+
+    public Set<TimeUUID> getSessionIds()
+    {
+        return sessions.keySet();
+    }
+
+    public void register(SessionState state)
+    {
+        sessions.put(state.id, state);
+    }
+
+    public List<ColumnFamilyStore> getColumnFamilies()
+    {
+        return columnFamilies;
+    }
+
+    public String[] getColumnFamilyNames()
+    {
+        if (columnFamilies == null)
+            return null;
+        return columnFamilies.stream().map(ColumnFamilyStore::getTableName).toArray(String[]::new);
+    }
+
+    public RepairRunnable.NeighborsAndRanges getNeighborsAndRanges()
+    {
+        return neighborsAndRanges;
+    }
+
+    public Set<InetAddressAndPort> getParticipants()
+    {
+        if (neighborsAndRanges == null)
+            return null;
+        return neighborsAndRanges.participants;
+    }
+
+    public List<CommonRange> getCommonRanges()
+    {
+        if (neighborsAndRanges == null)
+            return null;
+        return neighborsAndRanges.commonRanges;
+    }
+
+    public List<CommonRange> getFilteredCommonRanges()
+    {
+        if (neighborsAndRanges == null)
+            return null;
+        return neighborsAndRanges.filterCommonRanges(keyspace, getColumnFamilyNames());
+    }
+
+    public final class Phase extends BaseSkipPhase
+    {
+        public void setup()
+        {
+            updateState(State.SETUP);
+        }
+
+        public void start(List<ColumnFamilyStore> columnFamilies, RepairRunnable.NeighborsAndRanges neighborsAndRanges)
+        {
+            CoordinatorState.this.columnFamilies = Objects.requireNonNull(columnFamilies);
+            CoordinatorState.this.neighborsAndRanges = Objects.requireNonNull(neighborsAndRanges);
+            updateState(State.START);
+        }
+
+        public void prepareStart()
+        {
+            updateState(State.PREPARE_START);
+        }
+
+        public void prepareComplete()
+        {
+            updateState(State.PREPARE_COMPLETE);
+        }
+
+        public void repairSubmitted()
+        {
+            updateState(State.REPAIR_START);
+        }
+
+        public void repairCompleted()
+        {
+            updateState(State.REPAIR_COMPLETE);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/state/JobState.java b/src/java/org/apache/cassandra/repair/state/JobState.java
new file mode 100644
index 0000000..f8d42c3
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/JobState.java
@@ -0,0 +1,87 @@
+/*
+ * 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.repair.state;
+
+import java.util.Set;
+import java.util.UUID;
+
+import com.google.common.collect.ImmutableSet;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.RepairJobDesc;
+
+public class JobState extends AbstractState<JobState.State, UUID>
+{
+    public enum State
+    {
+        START,
+        SNAPSHOT_START, SNAPSHOT_COMPLETE,
+        VALIDATION_START, VALIDATION_COMPLETE,
+        STREAM_START
+    }
+
+    public final RepairJobDesc desc;
+    private final ImmutableSet<InetAddressAndPort> endpoints;
+
+    public final Phase phase = new Phase();
+
+    public JobState(RepairJobDesc desc, ImmutableSet<InetAddressAndPort> endpoints)
+    {
+        super(desc.determanisticId(), State.class);
+        this.desc = desc;
+        this.endpoints = endpoints;
+    }
+
+    public Set<InetAddressAndPort> getParticipants()
+    {
+        return endpoints;
+    }
+
+    public final class Phase extends BasePhase
+    {
+        public void start()
+        {
+            updateState(State.START);
+        }
+
+        public void snapshotsSubmitted()
+        {
+            updateState(State.SNAPSHOT_START);
+        }
+
+        public void snapshotsCompleted()
+        {
+            updateState(State.SNAPSHOT_COMPLETE);
+        }
+
+        public void validationSubmitted()
+        {
+            updateState(State.VALIDATION_START);
+        }
+
+        public void validationCompleted()
+        {
+            updateState(State.VALIDATION_COMPLETE);
+        }
+
+        public void streamSubmitted()
+        {
+            updateState(State.STREAM_START);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/state/ParticipateState.java b/src/java/org/apache/cassandra/repair/state/ParticipateState.java
new file mode 100644
index 0000000..c1faa4e
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/ParticipateState.java
@@ -0,0 +1,80 @@
+/*
+ * 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.repair.state;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.messages.PrepareMessage;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.TimeUUID;
+
+public class ParticipateState extends AbstractCompletable<TimeUUID>
+{
+    public final InetAddressAndPort initiator;
+    public final List<TableId> tableIds;
+    public final Collection<Range<Token>> ranges;
+    public final boolean incremental;
+    public final long repairedAt;
+    public final boolean global;
+    public final PreviewKind previewKind;
+
+    private final ConcurrentMap<UUID, ValidationState> validations = new ConcurrentHashMap<>();
+
+    public final Phase phase = new Phase();
+
+    public ParticipateState(InetAddressAndPort initiator, PrepareMessage msg)
+    {
+        super(msg.parentRepairSession);
+        this.initiator = initiator;
+        this.tableIds = msg.tableIds;
+        this.ranges = msg.ranges;
+        this.incremental = msg.isIncremental;
+        this.repairedAt = msg.repairedAt;
+        this.global = msg.isGlobal;
+        this.previewKind = msg.previewKind;
+    }
+
+    public boolean register(ValidationState state)
+    {
+        ValidationState current = validations.putIfAbsent(state.id, state);
+        return current == null;
+    }
+
+    public Collection<ValidationState> validations()
+    {
+        return validations.values();
+    }
+
+    public Collection<UUID> validationIds()
+    {
+        return validations.keySet();
+    }
+
+    public class Phase extends BasePhase
+    {
+
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/state/SessionState.java b/src/java/org/apache/cassandra/repair/state/SessionState.java
new file mode 100644
index 0000000..8e8e648
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/SessionState.java
@@ -0,0 +1,93 @@
+/*
+ * 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.repair.state;
+
+import java.util.Collection;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.CommonRange;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+public class SessionState extends AbstractState<SessionState.State, TimeUUID>
+{
+    public enum State
+    {
+        START, JOBS_START
+    }
+
+    public final TimeUUID parentRepairSession;
+    public final String keyspace;
+    public final String[] cfnames;
+    public final CommonRange commonRange;
+    private final ConcurrentMap<UUID, JobState> jobs = new ConcurrentHashMap<>();
+
+    public final Phase phase = new Phase();
+
+    public SessionState(TimeUUID parentRepairSession, String keyspace, String[] cfnames, CommonRange commonRange)
+    {
+        super(nextTimeUUID(), State.class);
+        this.parentRepairSession = parentRepairSession;
+        this.keyspace = keyspace;
+        this.cfnames = cfnames;
+        this.commonRange = commonRange;
+    }
+
+    public Collection<JobState> getJobs()
+    {
+        return jobs.values();
+    }
+
+    public JobState getJob(UUID id)
+    {
+        return jobs.get(id);
+    }
+
+    public Set<UUID> getJobIds()
+    {
+        return jobs.keySet();
+    }
+
+    public Set<InetAddressAndPort> getParticipants()
+    {
+        return commonRange.endpoints;
+    }
+
+    public void register(JobState state)
+    {
+        jobs.put(state.id, state);
+    }
+
+    public final class Phase extends BaseSkipPhase
+    {
+        public void start()
+        {
+            updateState(State.START);
+        }
+
+        public void jobsSubmitted()
+        {
+            updateState(State.JOBS_START);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/repair/state/State.java b/src/java/org/apache/cassandra/repair/state/State.java
new file mode 100644
index 0000000..bfb9a13
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/State.java
@@ -0,0 +1,27 @@
+/*
+ * 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.repair.state;
+
+import java.util.EnumMap;
+
+public interface State<T extends Enum<T>, I> extends Completable<I>
+{
+    T getStatus();
+
+    EnumMap<T, Long> getStateTimesMillis();
+}
diff --git a/src/java/org/apache/cassandra/repair/state/ValidationState.java b/src/java/org/apache/cassandra/repair/state/ValidationState.java
new file mode 100644
index 0000000..ff2ca53
--- /dev/null
+++ b/src/java/org/apache/cassandra/repair/state/ValidationState.java
@@ -0,0 +1,71 @@
+/*
+ * 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.repair.state;
+
+import java.util.UUID;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.RepairJobDesc;
+
+public class ValidationState extends AbstractState<ValidationState.State, UUID>
+{
+    public enum State
+    { START, SENDING_TREES }
+
+    public final Phase phase = new Phase();
+    public final RepairJobDesc desc;
+    public final InetAddressAndPort initiator;
+    public long estimatedPartitions;
+    public long estimatedTotalBytes;
+    public long partitionsProcessed;
+    public long bytesRead;
+
+    public ValidationState(RepairJobDesc desc, InetAddressAndPort initiator)
+    {
+        super(desc.determanisticId(), State.class);
+        this.desc = desc;
+        this.initiator = initiator;
+    }
+
+    public float getProgress()
+    {
+        int currentState = this.currentState;
+        if (currentState == INIT)
+            return 0.0F;
+        if (currentState == COMPLETE)
+            return 1.0F;
+        if (estimatedPartitions == 0) // mostly to avoid / 0
+            return 0.0f;
+        return Math.min(0.99F, partitionsProcessed / (float) estimatedPartitions);
+    }
+
+    public final class Phase extends BaseSkipPhase
+    {
+        public void start(long estimatedPartitions, long estimatedTotalBytes)
+        {
+            updateState(State.START);
+            ValidationState.this.estimatedPartitions = estimatedPartitions;
+            ValidationState.this.estimatedTotalBytes = estimatedTotalBytes;
+        }
+
+        public void sendingTrees()
+        {
+            updateState(State.SENDING_TREES);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/ColumnMetadata.java b/src/java/org/apache/cassandra/schema/ColumnMetadata.java
index d48ca06..fdbd166 100644
--- a/src/java/org/apache/cassandra/schema/ColumnMetadata.java
+++ b/src/java/org/apache/cassandra/schema/ColumnMetadata.java
@@ -33,7 +33,6 @@
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.serializers.MarshalException;
-import org.apache.cassandra.utils.ByteBufferUtil;
 import org.github.jamm.Unmetered;
 
 @Unmetered
@@ -447,9 +446,9 @@
             return "";
 
         StringBuilder sb = new StringBuilder();
-        sb.append(defs.next().name);
+        sb.append(defs.next().name.toCQLString());
         while (defs.hasNext())
-            sb.append(", ").append(defs.next().name);
+            sb.append(", ").append(defs.next().name.toCQLString());
         return sb.toString();
     }
 
diff --git a/src/java/org/apache/cassandra/schema/CompressionParams.java b/src/java/org/apache/cassandra/schema/CompressionParams.java
index 53760a9..be79ec6 100644
--- a/src/java/org/apache/cassandra/schema/CompressionParams.java
+++ b/src/java/org/apache/cassandra/schema/CompressionParams.java
@@ -20,7 +20,6 @@
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
@@ -35,6 +34,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.ParameterizedClass;
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.exceptions.ConfigurationException;
@@ -66,11 +66,13 @@
     public static final String ENABLED = "enabled";
     public static final String MIN_COMPRESS_RATIO = "min_compress_ratio";
 
-    public static final CompressionParams DEFAULT = new CompressionParams(LZ4Compressor.create(Collections.<String, String>emptyMap()),
-                                                                          DEFAULT_CHUNK_LENGTH,
-                                                                          calcMaxCompressedLength(DEFAULT_CHUNK_LENGTH, DEFAULT_MIN_COMPRESS_RATIO),
-                                                                          DEFAULT_MIN_COMPRESS_RATIO,
-                                                                          Collections.emptyMap());
+    public static final CompressionParams DEFAULT = !CassandraRelevantProperties.DETERMINISM_SSTABLE_COMPRESSION_DEFAULT.getBoolean()
+                                                    ? noCompression()
+                                                    : new CompressionParams(LZ4Compressor.create(Collections.emptyMap()),
+                                                                            DEFAULT_CHUNK_LENGTH,
+                                                                            calcMaxCompressedLength(DEFAULT_CHUNK_LENGTH, DEFAULT_MIN_COMPRESS_RATIO),
+                                                                            DEFAULT_MIN_COMPRESS_RATIO,
+                                                                            Collections.emptyMap());
 
     public static final CompressionParams NOOP = new CompressionParams(NoopCompressor.create(Collections.emptyMap()),
                                                                        // 4 KiB is often the underlying disk block size
@@ -368,7 +370,7 @@
     }
 
     /**
-     * Parse the chunk length (in KB) and returns it as bytes.
+     * Parse the chunk length (in KiB) and returns it as bytes.
      *
      * @param chLengthKB the length of the chunk to parse
      * @return the chunk length in bytes
diff --git a/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
new file mode 100644
index 0000000..0f0c3e9
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandler.java
@@ -0,0 +1,356 @@
+/*
+ * 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.schema;
+
+import java.time.Duration;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.IEndpointStateChangeSubscriber;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Awaitable;
+
+import static org.apache.cassandra.schema.MigrationCoordinator.MAX_OUTSTANDING_VERSION_REQUESTS;
+
+public class DefaultSchemaUpdateHandler implements SchemaUpdateHandler, IEndpointStateChangeSubscriber
+{
+    private static final Logger logger = LoggerFactory.getLogger(DefaultSchemaUpdateHandler.class);
+
+    @VisibleForTesting
+    final MigrationCoordinator migrationCoordinator;
+
+    private final boolean requireSchemas;
+    private final BiConsumer<SchemaTransformationResult, Boolean> updateCallback;
+    private volatile DistributedSchema schema = DistributedSchema.EMPTY;
+
+    private volatile AsyncPromise<Void> requestedReset;
+
+    private MigrationCoordinator createMigrationCoordinator(MessagingService messagingService)
+    {
+        return new MigrationCoordinator(messagingService,
+                                        Stage.MIGRATION.executor(),
+                                        ScheduledExecutors.scheduledTasks,
+                                        MAX_OUTSTANDING_VERSION_REQUESTS,
+                                        Gossiper.instance,
+                                        this::getSchemaVersionForCoordinator,
+                                        this::applyMutationsFromCoordinator);
+    }
+
+    public DefaultSchemaUpdateHandler(BiConsumer<SchemaTransformationResult, Boolean> updateCallback)
+    {
+        this(null, MessagingService.instance(), !CassandraRelevantProperties.BOOTSTRAP_SKIP_SCHEMA_CHECK.getBoolean(), updateCallback);
+    }
+
+    public DefaultSchemaUpdateHandler(MigrationCoordinator migrationCoordinator,
+                                      MessagingService messagingService,
+                                      boolean requireSchemas,
+                                      BiConsumer<SchemaTransformationResult, Boolean> updateCallback)
+    {
+        this.requireSchemas = requireSchemas;
+        this.updateCallback = updateCallback;
+        this.migrationCoordinator = migrationCoordinator == null ? createMigrationCoordinator(messagingService) : migrationCoordinator;
+        Gossiper.instance.register(this);
+        SchemaPushVerbHandler.instance.register(msg -> {
+            synchronized (this)
+            {
+                if (requestedReset == null)
+                    applyMutations(msg.payload);
+            }
+        });
+        SchemaPullVerbHandler.instance.register(msg -> {
+            try
+            {
+                messagingService.send(msg.responseWith(getSchemaMutations()), msg.from());
+            }
+            catch (RuntimeException ex)
+            {
+                logger.error("Failed to send schema mutations to " + msg.from(), ex);
+            }
+        });
+    }
+
+    public synchronized void start()
+    {
+        if (StorageService.instance.isReplacing())
+            onRemove(DatabaseDescriptor.getReplaceAddress());
+
+        SchemaKeyspace.saveSystemKeyspacesSchema();
+
+        migrationCoordinator.start();
+    }
+
+    @Override
+    public boolean waitUntilReady(Duration timeout)
+    {
+        logger.debug("Waiting for schema to be ready (max {})", timeout);
+        boolean schemasReceived = migrationCoordinator.awaitSchemaRequests(timeout.toMillis());
+
+        if (schemasReceived)
+            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, " +
+                    "-D{}=<ep1[,epN]> to skip specific endpoints, or -D{}=<ver1[,verN]> to skip specific schema versions",
+                    Schema.instance.getVersion(),
+                    migrationCoordinator.outstandingVersions(),
+                    CassandraRelevantProperties.BOOTSTRAP_SKIP_SCHEMA_CHECK.getKey(),
+                    CassandraRelevantProperties.IGNORED_SCHEMA_CHECK_ENDPOINTS.getKey(),
+                    CassandraRelevantProperties.IGNORED_SCHEMA_CHECK_VERSIONS.getKey());
+
+        if (requireSchemas)
+        {
+            logger.error("Didn't receive schemas for all known versions within the {}. Use -D{}=true to skip this check.",
+                         timeout, CassandraRelevantProperties.BOOTSTRAP_SKIP_SCHEMA_CHECK.getKey());
+
+            return false;
+        }
+
+        return true;
+    }
+
+    @Override
+    public void onRemove(InetAddressAndPort endpoint)
+    {
+        migrationCoordinator.removeAndIgnoreEndpoint(endpoint);
+    }
+
+    @Override
+    public void onChange(InetAddressAndPort endpoint, ApplicationState state, VersionedValue value)
+    {
+        if (state == ApplicationState.SCHEMA)
+        {
+            EndpointState epState = Gossiper.instance.getEndpointStateForEndpoint(endpoint);
+            if (epState != null && !Gossiper.instance.isDeadState(epState) && StorageService.instance.getTokenMetadata().isMember(endpoint))
+            {
+                migrationCoordinator.reportEndpointVersion(endpoint, UUID.fromString(value.value));
+            }
+        }
+    }
+
+    @Override
+    public void onJoin(InetAddressAndPort endpoint, EndpointState epState)
+    {
+        // no-op
+    }
+
+    @Override
+    public void beforeChange(InetAddressAndPort endpoint, EndpointState currentState, ApplicationState newStateKey, VersionedValue newValue)
+    {
+        // no-op
+    }
+
+    @Override
+    public void onAlive(InetAddressAndPort endpoint, EndpointState state)
+    {
+        // no-op
+    }
+
+    @Override
+    public void onDead(InetAddressAndPort endpoint, EndpointState state)
+    {
+        // no-op
+    }
+
+    @Override
+    public void onRestart(InetAddressAndPort endpoint, EndpointState state)
+    {
+        // no-op
+    }
+
+    private synchronized SchemaTransformationResult applyMutations(Collection<Mutation> schemaMutations)
+    {
+        // fetch the current state of schema for the affected keyspaces only
+        DistributedSchema before = schema;
+
+        // apply the schema mutations
+        SchemaKeyspace.applyChanges(schemaMutations);
+
+        // only compare the keyspaces affected by this set of schema mutations
+        Set<String> affectedKeyspaces = SchemaKeyspace.affectedKeyspaces(schemaMutations);
+
+        // apply the schema mutations and fetch the new versions of the altered keyspaces
+        Keyspaces updatedKeyspaces = SchemaKeyspace.fetchKeyspaces(affectedKeyspaces);
+        Set<String> removedKeyspaces = affectedKeyspaces.stream().filter(ks -> !updatedKeyspaces.containsKeyspace(ks)).collect(Collectors.toSet());
+        Keyspaces afterKeyspaces = before.getKeyspaces().withAddedOrReplaced(updatedKeyspaces).without(removedKeyspaces);
+
+        Keyspaces.KeyspacesDiff diff = Keyspaces.diff(before.getKeyspaces(), afterKeyspaces);
+        UUID version = SchemaKeyspace.calculateSchemaDigest();
+        DistributedSchema after = new DistributedSchema(afterKeyspaces, version);
+        SchemaTransformationResult update = new SchemaTransformationResult(before, after, diff);
+
+        logger.info("Applying schema change due to received mutations: {}", update);
+        updateSchema(update, false);
+        return update;
+    }
+
+    @Override
+    public synchronized SchemaTransformationResult apply(SchemaTransformation transformation, boolean local)
+    {
+        DistributedSchema before = schema;
+        Keyspaces afterKeyspaces = transformation.apply(before.getKeyspaces());
+        Keyspaces.KeyspacesDiff diff = Keyspaces.diff(before.getKeyspaces(), afterKeyspaces);
+
+        if (diff.isEmpty())
+            return new SchemaTransformationResult(before, before, diff);
+
+        Collection<Mutation> mutations = SchemaKeyspace.convertSchemaDiffToMutations(diff, transformation.fixedTimestampMicros().orElse(FBUtilities.timestampMicros()));
+        SchemaKeyspace.applyChanges(mutations);
+
+        DistributedSchema after = new DistributedSchema(afterKeyspaces, SchemaKeyspace.calculateSchemaDigest());
+        SchemaTransformationResult update = new SchemaTransformationResult(before, after, diff);
+
+        updateSchema(update, local);
+        if (!local)
+        {
+            migrationCoordinator.executor.submit(() -> {
+                Pair<Set<InetAddressAndPort>, Set<InetAddressAndPort>> endpoints = migrationCoordinator.pushSchemaMutations(mutations);
+                SchemaAnnouncementDiagnostics.schemaTransformationAnnounced(endpoints.left(), endpoints.right(), transformation);
+            });
+        }
+
+        return update;
+    }
+
+    private void updateSchema(SchemaTransformationResult update, boolean local)
+    {
+        if (!update.diff.isEmpty())
+        {
+            this.schema = update.after;
+            logger.debug("Schema updated: {}", update);
+            updateCallback.accept(update, true);
+            if (!local)
+            {
+                migrationCoordinator.announce(update.after.getVersion());
+            }
+        }
+        else
+        {
+            logger.debug("Schema update is empty - skipping");
+        }
+    }
+
+    private synchronized void reload()
+    {
+        DistributedSchema before = this.schema;
+        DistributedSchema after = new DistributedSchema(SchemaKeyspace.fetchNonSystemKeyspaces(), SchemaKeyspace.calculateSchemaDigest());
+        Keyspaces.KeyspacesDiff diff = Keyspaces.diff(before.getKeyspaces(), after.getKeyspaces());
+        SchemaTransformationResult update = new SchemaTransformationResult(before, after, diff);
+
+        updateSchema(update, false);
+    }
+
+    @Override
+    public void reset(boolean local)
+    {
+        if (local)
+        {
+            reload();
+        }
+        else
+        {
+            migrationCoordinator.reset();
+            if (!migrationCoordinator.awaitSchemaRequests(CassandraRelevantProperties.MIGRATION_DELAY.getLong()))
+            {
+                logger.error("Timeout exceeded when waiting for schema from other nodes");
+            }
+        }
+    }
+
+    /**
+     * When clear is called the update handler will flag that the clear was requested. It means that migration
+     * coordinator will think that we have empty schema version and will apply whatever it receives from other nodes.
+     * When a first attempt to apply mutations from other node is called, it will first clear the schema and apply
+     * the mutations on a truncated table. The flag is then reset.
+     * <p>
+     * This way the clear is postponed until we really fetch any schema we can use as a replacement. Otherwise, nothing
+     * will happen. We will simply reset the flag after the timeout and throw exceptions to the caller.
+     *
+     * @return
+     */
+    @Override
+    public Awaitable clear()
+    {
+        synchronized (this)
+        {
+            if (requestedReset == null)
+            {
+                requestedReset = new AsyncPromise<>();
+                migrationCoordinator.reset();
+            }
+            return requestedReset;
+        }
+    }
+
+    private UUID getSchemaVersionForCoordinator()
+    {
+        if (requestedReset != null)
+            return SchemaConstants.emptyVersion;
+        else
+            return schema.getVersion();
+    }
+
+    private synchronized void applyMutationsFromCoordinator(InetAddressAndPort from, Collection<Mutation> mutations)
+    {
+        if (requestedReset != null && !mutations.isEmpty())
+        {
+            schema = DistributedSchema.EMPTY;
+            SchemaKeyspace.truncate();
+            requestedReset.setSuccess(null);
+            requestedReset = null;
+        }
+        applyMutations(mutations);
+    }
+
+    private synchronized Collection<Mutation> getSchemaMutations()
+    {
+        if (requestedReset != null)
+            return Collections.emptyList();
+        else
+            return SchemaKeyspace.convertSchemaToMutations();
+    }
+
+    public Map<UUID, Set<InetAddressAndPort>> getOutstandingSchemaVersions()
+    {
+        return migrationCoordinator.outstandingVersions();
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandlerFactory.java b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandlerFactory.java
new file mode 100644
index 0000000..2303663
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/DefaultSchemaUpdateHandlerFactory.java
@@ -0,0 +1,36 @@
+/*
+ * 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.schema;
+
+import java.util.function.BiConsumer;
+
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
+
+public class DefaultSchemaUpdateHandlerFactory implements SchemaUpdateHandlerFactory
+{
+    public static final SchemaUpdateHandlerFactory instance = new DefaultSchemaUpdateHandlerFactory();
+
+    @Override
+    public SchemaUpdateHandler getSchemaUpdateHandler(boolean online, BiConsumer<SchemaTransformationResult, Boolean> updateSchemaCallback)
+    {
+        return online
+               ? new DefaultSchemaUpdateHandler(updateSchemaCallback)
+               : new OfflineSchemaUpdateHandler(updateSchemaCallback);
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/Diff.java b/src/java/org/apache/cassandra/schema/Diff.java
index 7112c85..dd26c7b 100644
--- a/src/java/org/apache/cassandra/schema/Diff.java
+++ b/src/java/org/apache/cassandra/schema/Diff.java
@@ -61,4 +61,15 @@
             return String.format("%s -> %s (%s)", before, after, kind);
         }
     }
+
+    @Override
+    public String toString()
+    {
+        return "Diff{" +
+               "created=" + created +
+               ", dropped=" + dropped +
+               ", altered=" + altered +
+               '}';
+    }
+
 }
diff --git a/src/java/org/apache/cassandra/schema/DistributedSchema.java b/src/java/org/apache/cassandra/schema/DistributedSchema.java
new file mode 100644
index 0000000..4fed9bb
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/DistributedSchema.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.schema;
+
+import java.util.Objects;
+import java.util.UUID;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Immutable snapshot of the current schema along with its version.
+ */
+public class DistributedSchema
+{
+    public static final DistributedSchema EMPTY = new DistributedSchema(Keyspaces.none(), SchemaConstants.emptyVersion);
+
+    private final Keyspaces keyspaces;
+    private final UUID version;
+
+    public DistributedSchema(Keyspaces keyspaces, UUID version)
+    {
+        Objects.requireNonNull(keyspaces);
+        Objects.requireNonNull(version);
+        this.keyspaces = keyspaces;
+        this.version = version;
+        validate();
+    }
+
+    public Keyspaces getKeyspaces()
+    {
+        return keyspaces;
+    }
+
+    public boolean isEmpty()
+    {
+        return SchemaConstants.emptyVersion.equals(version);
+    }
+
+    public UUID getVersion()
+    {
+        return version;
+    }
+
+    /**
+     * Converts the given schema version to a string. Returns {@code unknown}, if {@code version} is {@code null}
+     * or {@code "(empty)"}, if {@code version} refers to an {@link SchemaConstants#emptyVersion empty) schema.
+     */
+    public static String schemaVersionToString(UUID version)
+    {
+        return version == null
+               ? "unknown"
+               : SchemaConstants.emptyVersion.equals(version)
+                 ? "(empty)"
+                 : version.toString();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        DistributedSchema schema = (DistributedSchema) o;
+        return keyspaces.equals(schema.keyspaces) && version.equals(schema.version);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(keyspaces, version);
+    }
+
+    private void validate()
+    {
+        keyspaces.forEach(ksm -> {
+            ksm.tables.forEach(tm -> Preconditions.checkArgument(tm.keyspace.equals(ksm.name), "Table %s metadata points to keyspace %s while defined in keyspace %s", tm.name, tm.keyspace, ksm.name));
+            ksm.views.forEach(vm -> Preconditions.checkArgument(vm.keyspace().equals(ksm.name), "View %s metadata points to keyspace %s while defined in keyspace %s", vm.name(), vm.keyspace(), ksm.name));
+            ksm.types.forEach(ut -> Preconditions.checkArgument(ut.keyspace.equals(ksm.name), "Type %s points to keyspace %s while defined in keyspace %s", ut.name, ut.keyspace, ksm.name));
+            ksm.functions.forEach(f -> Preconditions.checkArgument(f.name().keyspace.equals(ksm.name), "Function %s points to keyspace %s while defined in keyspace %s", f.name().name, f.name().keyspace, ksm.name));
+        });
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/Indexes.java b/src/java/org/apache/cassandra/schema/Indexes.java
index a83be4b..2e95779 100644
--- a/src/java/org/apache/cassandra/schema/Indexes.java
+++ b/src/java/org/apache/cassandra/schema/Indexes.java
@@ -21,7 +21,6 @@
 import java.util.stream.Stream;
 
 import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Sets;
 
 import static java.lang.String.format;
 
diff --git a/src/java/org/apache/cassandra/schema/KeyspaceMetadata.java b/src/java/org/apache/cassandra/schema/KeyspaceMetadata.java
index a029168..6d85391 100644
--- a/src/java/org/apache/cassandra/schema/KeyspaceMetadata.java
+++ b/src/java/org/apache/cassandra/schema/KeyspaceMetadata.java
@@ -119,6 +119,11 @@
         return new KeyspaceMetadata(name, kind, params, tables, views, types, functions);
     }
 
+    public KeyspaceMetadata empty()
+    {
+        return new KeyspaceMetadata(this.name, this.kind, this.params, Tables.none(), Views.none(), Types.none(), Functions.none());
+    }
+
     public boolean isVirtual()
     {
         return kind == Kind.VIRTUAL;
@@ -303,7 +308,7 @@
                                                     name));
         }
 
-        params.validate(name);
+        params.validate(name, null);
 
         tablesAndViews().forEach(TableMetadata::validate);
 
@@ -391,5 +396,19 @@
 
             return Optional.of(new KeyspaceDiff(before, after, tables, views, types, udfs, udas));
         }
+
+        @Override
+        public String toString()
+        {
+            return "KeyspaceDiff{" +
+                   "before=" + before +
+                   ", after=" + after +
+                   ", tables=" + tables +
+                   ", views=" + views +
+                   ", types=" + types +
+                   ", udfs=" + udfs +
+                   ", udas=" + udas +
+                   '}';
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/schema/KeyspaceParams.java b/src/java/org/apache/cassandra/schema/KeyspaceParams.java
index cc46474..539993e 100644
--- a/src/java/org/apache/cassandra/schema/KeyspaceParams.java
+++ b/src/java/org/apache/cassandra/schema/KeyspaceParams.java
@@ -23,6 +23,8 @@
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Objects;
 
+import org.apache.cassandra.service.ClientState;
+
 /**
  * An immutable class representing keyspace parameters (durability and replication).
  */
@@ -89,9 +91,9 @@
         return new KeyspaceParams(true, ReplicationParams.nts(args));
     }
 
-    public void validate(String name)
+    public void validate(String name, ClientState state)
     {
-        replication.validate(name);
+        replication.validate(name, state);
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/schema/Keyspaces.java b/src/java/org/apache/cassandra/schema/Keyspaces.java
index 1938d93..e9bd92c 100644
--- a/src/java/org/apache/cassandra/schema/Keyspaces.java
+++ b/src/java/org/apache/cassandra/schema/Keyspaces.java
@@ -17,9 +17,9 @@
  */
 package org.apache.cassandra.schema;
 
+import java.util.Collection;
 import java.util.Iterator;
 import java.util.Optional;
-import java.util.Set;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
@@ -67,7 +67,7 @@
         return keyspaces.values().stream();
     }
 
-    public Set<String> names()
+    public ImmutableSet<String> names()
     {
         return keyspaces.keySet();
     }
@@ -124,6 +124,11 @@
         return filter(k -> k != keyspace);
     }
 
+    public Keyspaces without(Collection<String> names)
+    {
+        return filter(k -> !names.contains(k.name));
+    }
+
     public Keyspaces withAddedOrUpdated(KeyspaceMetadata keyspace)
     {
         return builder().add(Iterables.filter(this, k -> !k.name.equals(keyspace.name)))
@@ -131,6 +136,37 @@
                         .build();
     }
 
+    /**
+     * Returns a new {@link Keyspaces} equivalent to this one, but with the provided keyspace metadata either added (if
+     * this {@link Keyspaces} does not have that keyspace), or replaced by the provided definition.
+     *
+     * <p>Note that if this contains the provided keyspace, its pre-existing definition is discarded and completely
+     * replaced with the newly provided one. See {@link #withAddedOrUpdated(KeyspaceMetadata)} if you wish the provided
+     * definition to be "merged" with the existing one instead.
+     *
+     * @param keyspace the keyspace metadata to add, or replace the existing definition with.
+     * @return the newly created object.
+     */
+    public Keyspaces withAddedOrReplaced(KeyspaceMetadata keyspace)
+    {
+        return builder().add(Iterables.filter(this, k -> !k.name.equals(keyspace.name)))
+                        .add(keyspace)
+                        .build();
+    }
+
+    /**
+     * Calls {@link #withAddedOrReplaced(KeyspaceMetadata)} on all the keyspaces of the provided {@link Keyspaces}.
+     *
+     * @param keyspaces the keyspaces to add, or replace if existing.
+     * @return the newly created object.
+     */
+    public Keyspaces withAddedOrReplaced(Keyspaces keyspaces)
+    {
+        return builder().add(Iterables.filter(this, k -> !keyspaces.containsKeyspace(k.name)))
+                        .add(keyspaces)
+                        .build();
+    }
+
     public void validate()
     {
         keyspaces.values().forEach(KeyspaceMetadata::validate);
@@ -154,6 +190,11 @@
         return keyspaces.values().toString();
     }
 
+    public int size()
+    {
+        return keyspaces.size();
+    }
+
     public static final class Builder
     {
         private final ImmutableMap.Builder<String, KeyspaceMetadata> keyspaces = new ImmutableMap.Builder<>();
@@ -192,14 +233,14 @@
         }
     }
 
-    static KeyspacesDiff diff(Keyspaces before, Keyspaces after)
+    public static KeyspacesDiff diff(Keyspaces before, Keyspaces after)
     {
         return KeyspacesDiff.diff(before, after);
     }
 
     public static final class KeyspacesDiff
     {
-        static final KeyspacesDiff NONE = new KeyspacesDiff(Keyspaces.none(), Keyspaces.none(), ImmutableList.of());
+        public static final KeyspacesDiff NONE = new KeyspacesDiff(Keyspaces.none(), Keyspaces.none(), ImmutableList.of());
 
         public final Keyspaces created;
         public final Keyspaces dropped;
@@ -235,5 +276,15 @@
         {
             return created.isEmpty() && dropped.isEmpty() && altered.isEmpty();
         }
+
+        @Override
+        public String toString()
+        {
+            return "KeyspacesDiff{" +
+                   "created=" + created +
+                   ", dropped=" + dropped +
+                   ", altered=" + altered +
+                   '}';
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/schema/MemtableParams.java b/src/java/org/apache/cassandra/schema/MemtableParams.java
new file mode 100644
index 0000000..3470b7a
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/MemtableParams.java
@@ -0,0 +1,201 @@
+/*
+ * 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.schema;
+
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
+import com.google.common.collect.ImmutableMap;
+
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.InheritingClass;
+import org.apache.cassandra.config.ParameterizedClass;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.memtable.SkipListMemtableFactory;
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+/**
+ * Memtable types and options are specified with these parameters. Memtable classes must either contain a static
+ * {@code FACTORY} field (if they take no arguments other than class), or implement a
+ * {@code factory(Map<String, String>)} method.
+ *
+ * The latter should consume any further options (using {@code map.remove}).
+ *
+ * See Memtable_API.md for further details on the configuration and usage of memtable implementations.
+  */
+public final class MemtableParams
+{
+    private final Memtable.Factory factory;
+    private final String configurationKey;
+
+    private MemtableParams(Memtable.Factory factory, String configurationKey)
+    {
+        this.configurationKey = configurationKey;
+        this.factory = factory;
+    }
+
+    public String configurationKey()
+    {
+        return configurationKey;
+    }
+
+    public Memtable.Factory factory()
+    {
+        return factory;
+    }
+
+    @Override
+    public String toString()
+    {
+        return configurationKey;
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o)
+            return true;
+
+        if (!(o instanceof MemtableParams))
+            return false;
+
+        MemtableParams c = (MemtableParams) o;
+
+        return Objects.equal(configurationKey, c.configurationKey);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return configurationKey.hashCode();
+    }
+
+    private static final String DEFAULT_CONFIGURATION_KEY = "default";
+    private static final Memtable.Factory DEFAULT_MEMTABLE_FACTORY = SkipListMemtableFactory.INSTANCE;
+    private static final ParameterizedClass DEFAULT_CONFIGURATION = SkipListMemtableFactory.CONFIGURATION;
+    private static final Map<String, ParameterizedClass>
+        CONFIGURATION_DEFINITIONS = expandDefinitions(DatabaseDescriptor.getMemtableConfigurations());
+    private static final Map<String, MemtableParams> CONFIGURATIONS = new HashMap<>();
+    public static final MemtableParams DEFAULT = get(null);
+
+    public static MemtableParams get(String key)
+    {
+        if (key == null)
+            key = DEFAULT_CONFIGURATION_KEY;
+
+        synchronized (CONFIGURATIONS)
+        {
+            return CONFIGURATIONS.computeIfAbsent(key, MemtableParams::parseConfiguration);
+        }
+    }
+
+    public static MemtableParams getWithFallback(String key)
+    {
+        try
+        {
+            return get(key);
+        }
+        catch (ConfigurationException e)
+        {
+            LoggerFactory.getLogger(MemtableParams.class).error("Invalid memtable configuration \"" + key + "\" in schema. " +
+                                                                "Falling back to default to avoid schema mismatch.\n" +
+                                                                "Please ensure the correct definition is given in cassandra.yaml.",
+                                                                e);
+            return new MemtableParams(DEFAULT.factory(), key);
+        }
+    }
+
+    @VisibleForTesting
+    static Map<String, ParameterizedClass> expandDefinitions(Map<String, InheritingClass> memtableConfigurations)
+    {
+        if (memtableConfigurations == null)
+            return ImmutableMap.of(DEFAULT_CONFIGURATION_KEY, DEFAULT_CONFIGURATION);
+
+        LinkedHashMap<String, ParameterizedClass> configs = new LinkedHashMap<>(memtableConfigurations.size() + 1);
+
+        // If default is not overridden, add an entry first so that other configurations can inherit from it.
+        // If it is, process it in its point of definition, so that the default can inherit from another configuration.
+        if (!memtableConfigurations.containsKey(DEFAULT_CONFIGURATION_KEY))
+            configs.put(DEFAULT_CONFIGURATION_KEY, DEFAULT_CONFIGURATION);
+
+        for (Map.Entry<String, InheritingClass> en : memtableConfigurations.entrySet())
+            configs.put(en.getKey(), en.getValue().resolve(configs));
+
+        return ImmutableMap.copyOf(configs);
+    }
+
+    private static MemtableParams parseConfiguration(String configurationKey)
+    {
+        ParameterizedClass definition = CONFIGURATION_DEFINITIONS.get(configurationKey);
+
+        if (definition == null)
+            throw new ConfigurationException("Memtable configuration \"" + configurationKey + "\" not found.");
+        return new MemtableParams(getMemtableFactory(definition), configurationKey);
+    }
+
+
+    private static Memtable.Factory getMemtableFactory(ParameterizedClass options)
+    {
+        // Special-case this so that we don't initialize memtable class for tests that need to delay that.
+        if (options == DEFAULT_CONFIGURATION)
+            return DEFAULT_MEMTABLE_FACTORY;
+
+        String className = options.class_name;
+        if (className == null || className.isEmpty())
+            throw new ConfigurationException("The 'class_name' option must be specified.");
+
+        className = className.contains(".") ? className : "org.apache.cassandra.db.memtable." + className;
+        try
+        {
+            Memtable.Factory factory;
+            Class<?> clazz = Class.forName(className);
+            final Map<String, String> parametersCopy = options.parameters != null
+                                                       ? new HashMap<>(options.parameters)
+                                                       : new HashMap<>();
+            try
+            {
+                Method factoryMethod = clazz.getDeclaredMethod("factory", Map.class);
+                factory = (Memtable.Factory) factoryMethod.invoke(null, parametersCopy);
+            }
+            catch (NoSuchMethodException e)
+            {
+                // continue with FACTORY field
+                Field factoryField = clazz.getDeclaredField("FACTORY");
+                factory = (Memtable.Factory) factoryField.get(null);
+            }
+            if (!parametersCopy.isEmpty())
+                throw new ConfigurationException("Memtable class " + className + " does not accept any futher parameters, but " +
+                                                 parametersCopy + " were given.");
+            return factory;
+        }
+        catch (NoSuchFieldException | ClassNotFoundException | IllegalAccessException | InvocationTargetException | ClassCastException e)
+        {
+            if (e.getCause() instanceof ConfigurationException)
+                throw (ConfigurationException) e.getCause();
+            throw new ConfigurationException("Could not create memtable factory for class " + options, e);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/MigrationCoordinator.java b/src/java/org/apache/cassandra/schema/MigrationCoordinator.java
index 04e6625..61ef4c8 100644
--- a/src/java/org/apache/cassandra/schema/MigrationCoordinator.java
+++ b/src/java/org/apache/cassandra/schema/MigrationCoordinator.java
@@ -20,6 +20,7 @@
 
 import java.lang.management.ManagementFactory;
 import java.net.UnknownHostException;
+import java.time.Duration;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -29,32 +30,34 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.UUID;
-import java.util.WeakHashMap;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
 import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiConsumer;
 import java.util.function.LongSupplier;
+import java.util.function.Supplier;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Futures;
+import org.apache.cassandra.utils.NoSpamLogger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.FutureTask;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.gms.ApplicationState;
 import org.apache.cassandra.gms.EndpointState;
-import org.apache.cassandra.gms.FailureDetector;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.locator.InetAddressAndPort;
@@ -63,12 +66,21 @@
 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.FBUtilities;
-import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.Simulate;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.WaitQueue;
 
 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.SCHEMA_PULL_INTERVAL_MS;
+import static org.apache.cassandra.net.Verb.SCHEMA_PUSH_REQ;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.Simulate.With.MONITORS;
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
 
 /**
  * Migration coordinator is responsible for tracking schema versions on various nodes and, if needed, synchronize the
@@ -78,12 +90,16 @@
  * In particular the Migration Coordinator keeps track of all schema versions reported from each node in the cluster.
  * As long as a certain version is advertised by some node, it is being tracked. As long as a version is tracked,
  * the migration coordinator tries to fetch it by its periodic job.
+ *
+ * It works in close cooperation with {@link DefaultSchemaUpdateHandler} which is responsible for maintaining local
+ * schema metadata stored in {@link SchemaKeyspace}.
  */
+@Simulate(with = MONITORS)
 public class MigrationCoordinator
 {
     private static final Logger logger = LoggerFactory.getLogger(MigrationCoordinator.class);
     private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(MigrationCoordinator.logger, 1, TimeUnit.MINUTES);
-    private static final Future<Void> FINISHED_FUTURE = Futures.immediateFuture(null);
+    private static final Future<Void> FINISHED_FUTURE = ImmediateFuture.success(null);
 
     private static LongSupplier getUptimeFn = () -> ManagementFactory.getRuntimeMXBean().getUptime();
 
@@ -93,21 +109,8 @@
         getUptimeFn = supplier;
     }
 
-
     private static final int MIGRATION_DELAY_IN_MS = CassandraRelevantProperties.MIGRATION_DELAY.getInt();
-    private static final int MAX_OUTSTANDING_VERSION_REQUESTS = 3;
-
-    public static final MigrationCoordinator instance = new MigrationCoordinator();
-
-    /**
-     * @see CassandraRelevantProperties#SCHEMA_PULL_BACKOFF_DELAY_MS
-     */
-    private static final long BACKOFF_DELAY_MS = CassandraRelevantProperties.SCHEMA_PULL_BACKOFF_DELAY_MS.getInt();
-
-    /**
-     * Holds the timestamps in ms for last pull request attempts.
-     */
-    private final WeakHashMap<InetAddressAndPort, Long> lastPullAttemptTimestamps = new WeakHashMap<>();
+    public static final int MAX_OUTSTANDING_VERSION_REQUESTS = 3;
 
     private static ImmutableSet<UUID> getIgnoredVersions()
     {
@@ -169,7 +172,7 @@
         /**
          * Threads waiting for schema synchronization are waiting until this object is signalled
          */
-        private final WaitQueue waitQueue = new WaitQueue();
+        private final WaitQueue waitQueue = newWaitQueue();
 
         /**
          * Whether this schema version have been received
@@ -215,30 +218,52 @@
 
     private final Map<UUID, VersionInfo> versionInfo = new HashMap<>();
     private final Map<InetAddressAndPort, UUID> endpointVersions = new HashMap<>();
-    private final AtomicInteger inflightTasks = new AtomicInteger();
     private final Set<InetAddressAndPort> ignoredEndpoints = getIgnoredEndpoints();
+    private final ScheduledExecutorService periodicCheckExecutor;
+    private final MessagingService messagingService;
+    private final AtomicReference<ScheduledFuture<?>> periodicPullTask = new AtomicReference<>();
+    private final int maxOutstandingVersionRequests;
+    private final Gossiper gossiper;
+    private final Supplier<UUID> schemaVersion;
+    private final BiConsumer<InetAddressAndPort, Collection<Mutation>> schemaUpdateCallback;
 
-    public void start()
-    {
-        int interval = CassandraRelevantProperties.SCHEMA_PULL_INTERVAL_MS.getInt();
-        ScheduledExecutors.scheduledTasks.scheduleWithFixedDelay(this::pullUnreceivedSchemaVersions, interval, interval, TimeUnit.MILLISECONDS);
-    }
+    final ExecutorPlus executor;
 
     /**
-     * Resets the migration coordinator by notifying all waiting threads and removing all the existing version info.
+     * Creates but does not start migration coordinator instance.
+     * @param messagingService      messaging service instance used to communicate with other nodes for pulling schema
+     *                              and pushing changes
+     * @param periodicCheckExecutor executor on which the periodic checks are scheduled
      */
-    public synchronized void reset()
+    MigrationCoordinator(MessagingService messagingService,
+                         ExecutorPlus executor,
+                         ScheduledExecutorService periodicCheckExecutor,
+                         int maxOutstandingVersionRequests,
+                         Gossiper gossiper,
+                         Supplier<UUID> schemaVersionSupplier,
+                         BiConsumer<InetAddressAndPort, Collection<Mutation>> schemaUpdateCallback)
     {
-        logger.info("Resetting migration coordinator...");
-
-        // clear all the managed information
-        this.endpointVersions.clear();
-        clearVersionsInfo();
+        this.messagingService = messagingService;
+        this.executor = executor;
+        this.periodicCheckExecutor = periodicCheckExecutor;
+        this.maxOutstandingVersionRequests = maxOutstandingVersionRequests;
+        this.gossiper = gossiper;
+        this.schemaVersion = schemaVersionSupplier;
+        this.schemaUpdateCallback = schemaUpdateCallback;
     }
 
-    synchronized List<Future<Void>> pullUnreceivedSchemaVersions()
+    void start()
     {
-        List<Future<Void>> futures = new ArrayList<>();
+        logger.info("Starting migration coordinator and scheduling pulling schema versions every {}", Duration.ofMillis(SCHEMA_PULL_INTERVAL_MS.getLong()));
+        announce(schemaVersion.get());
+        periodicPullTask.updateAndGet(curTask -> curTask == null
+                                                 ? periodicCheckExecutor.scheduleWithFixedDelay(this::pullUnreceivedSchemaVersions, SCHEMA_PULL_INTERVAL_MS.getLong(), SCHEMA_PULL_INTERVAL_MS.getLong(), TimeUnit.MILLISECONDS)
+                                                 : curTask);
+    }
+
+    private synchronized void pullUnreceivedSchemaVersions()
+    {
+        logger.debug("Pulling unreceived schema versions...");
         for (VersionInfo info : versionInfo.values())
         {
             if (info.wasReceived() || info.outstandingRequests.size() > 0)
@@ -247,15 +272,11 @@
                 continue;
             }
 
-            Future<Void> future = maybePullSchema(info);
-            if (future != null && future != FINISHED_FUTURE)
-                futures.add(future);
+            maybePullSchema(info);
         }
-
-        return futures;
     }
 
-    synchronized Future<Void> maybePullSchema(VersionInfo info)
+    private synchronized Future<Void> maybePullSchema(VersionInfo info)
     {
         if (info.endpoints.isEmpty() || info.wasReceived() || !shouldPullSchema(info.version))
         {
@@ -263,13 +284,13 @@
             return FINISHED_FUTURE;
         }
 
-        if (info.outstandingRequests.size() >= getMaxOutstandingVersionRequests())
+        if (info.outstandingRequests.size() >= maxOutstandingVersionRequests)
         {
-            logger.trace("Not pulling schema {} because the number of outstanding requests has been exceeded ({} >= {})", info.version, info.outstandingRequests.size(), getMaxOutstandingVersionRequests());
+            logger.trace("Not pulling schema {} because the number of outstanding requests has been exceeded ({} >= {})", info.version, info.outstandingRequests.size(), maxOutstandingVersionRequests);
             return FINISHED_FUTURE;
         }
 
-        for (int i=0, isize=info.requestQueue.size(); i<isize; i++)
+        for (int i = 0, isize = info.requestQueue.size(); i < isize; i++)
         {
             InetAddressAndPort endpoint = info.requestQueue.remove();
             if (!info.endpoints.contains(endpoint))
@@ -291,10 +312,10 @@
         }
 
         // no suitable endpoints were found, check again in a minute, the periodic task will pick it up
-        return null;
+        return FINISHED_FUTURE;
     }
 
-    public synchronized Map<UUID, Set<InetAddressAndPort>> outstandingVersions()
+    synchronized Map<UUID, Set<InetAddressAndPort>> outstandingVersions()
     {
         HashMap<UUID, Set<InetAddressAndPort>> map = new HashMap<>();
         for (VersionInfo info : versionInfo.values())
@@ -304,33 +325,21 @@
     }
 
     @VisibleForTesting
-    protected VersionInfo getVersionInfoUnsafe(UUID version)
+    VersionInfo getVersionInfoUnsafe(UUID version)
     {
         return versionInfo.get(version);
     }
 
-    @VisibleForTesting
-    protected int getMaxOutstandingVersionRequests()
+    private boolean shouldPullSchema(UUID version)
     {
-        return MAX_OUTSTANDING_VERSION_REQUESTS;
-    }
-
-    @VisibleForTesting
-    protected boolean isAlive(InetAddressAndPort endpoint)
-    {
-        return FailureDetector.instance.isAlive(endpoint);
-    }
-
-    @VisibleForTesting
-    protected boolean shouldPullSchema(UUID version)
-    {
-        if (Schema.instance.getVersion() == null)
+        UUID localSchemaVersion = schemaVersion.get();
+        if (localSchemaVersion == null)
         {
             logger.debug("Not pulling schema {} because the local schama version is not known yet", version);
             return false;
         }
 
-        if (Schema.instance.isSameVersion(version))
+        if (localSchemaVersion.equals(version))
         {
             logger.debug("Not pulling schema {} because it is the same as the local schema", version);
             return false;
@@ -339,15 +348,7 @@
         return true;
     }
 
-    // Since 3.0.14 protocol contains only a CASSANDRA-13004 bugfix, it is safe to accept schema changes
-    // from both 3.0 and 3.0.14.
-    private static boolean is30Compatible(int version)
-    {
-        return version == MessagingService.current_version || version == MessagingService.VERSION_3014;
-    }
-
-    @VisibleForTesting
-    protected boolean shouldPullFromEndpoint(InetAddressAndPort endpoint)
+    private boolean shouldPullFromEndpoint(InetAddressAndPort endpoint)
     {
         if (endpoint.equals(FBUtilities.getBroadcastAddressAndPort()))
         {
@@ -355,7 +356,7 @@
             return false;
         }
 
-        EndpointState state = Gossiper.instance.getEndpointStateForEndpoint(endpoint);
+        EndpointState state = gossiper.getEndpointStateForEndpoint(endpoint);
         if (state == null)
         {
             logger.trace("Not pulling schema from endpoint {} because its state is unknown", endpoint);
@@ -375,19 +376,19 @@
             return false;
         }
 
-        if (!MessagingService.instance().versions.knows(endpoint))
+        if (!messagingService.versions.knows(endpoint))
         {
             logger.debug("Not pulling schema from {} because their messaging version is unknown", endpoint);
             return false;
         }
 
-        if (MessagingService.instance().versions.getRaw(endpoint) != MessagingService.current_version)
+        if (messagingService.versions.getRaw(endpoint) != MessagingService.current_version)
         {
             logger.debug("Not pulling schema from {} because their schema format is incompatible", endpoint);
             return false;
         }
 
-        if (Gossiper.instance.isGossipOnlyMember(endpoint))
+        if (gossiper.isGossipOnlyMember(endpoint))
         {
             logger.debug("Not pulling schema from {} because it's a gossip only member", endpoint);
             return false;
@@ -395,39 +396,33 @@
         return true;
     }
 
-    @VisibleForTesting
-    protected boolean shouldPullImmediately(InetAddressAndPort endpoint, UUID version)
+    private boolean shouldPullImmediately(InetAddressAndPort endpoint, UUID version)
     {
-        if (Schema.instance.isEmpty() || getUptimeFn.getAsLong() < MIGRATION_DELAY_IN_MS)
+        UUID localSchemaVersion = schemaVersion.get();
+        if (SchemaConstants.emptyVersion.equals(localSchemaVersion) || getUptimeFn.getAsLong() < MIGRATION_DELAY_IN_MS)
         {
             // If we think we may be bootstrapping or have recently started, submit MigrationTask immediately
             logger.debug("Immediately submitting migration task for {}, " +
                          "schema versions: local={}, remote={}",
                          endpoint,
-                         Schema.schemaVersionToString(Schema.instance.getVersion()),
-                         Schema.schemaVersionToString(version));
+                         DistributedSchema.schemaVersionToString(localSchemaVersion),
+                         DistributedSchema.schemaVersionToString(version));
             return true;
         }
         return false;
     }
 
-    @VisibleForTesting
-    protected boolean isLocalVersion(UUID version)
-    {
-        return Schema.instance.isSameVersion(version);
-    }
-
     /**
      * If a previous schema update brought our version the same as the incoming schema, don't apply it
      */
-    synchronized boolean shouldApplySchemaFor(VersionInfo info)
+    private synchronized boolean shouldApplySchemaFor(VersionInfo info)
     {
         if (info.wasReceived())
             return false;
-        return !isLocalVersion(info.version);
+        return !Objects.equals(schemaVersion.get(), info.version);
     }
 
-    public synchronized Future<Void> reportEndpointVersion(InetAddressAndPort endpoint, UUID version)
+    synchronized Future<Void> reportEndpointVersion(InetAddressAndPort endpoint, UUID version)
     {
         logger.debug("Reported schema {} at endpoint {}", version, endpoint);
         if (ignoredEndpoints.contains(endpoint) || IGNORED_VERSIONS.contains(version))
@@ -446,7 +441,7 @@
         }
 
         VersionInfo info = versionInfo.computeIfAbsent(version, VersionInfo::new);
-        if (isLocalVersion(version))
+        if (Objects.equals(schemaVersion.get(), version))
         {
             info.markReceived();
             logger.trace("Schema {} from {} has been marked as recevied because it is equal the local schema", version, endpoint);
@@ -464,19 +459,6 @@
         return maybePullSchema(info);
     }
 
-    public Future<Void> reportEndpointVersion(InetAddressAndPort endpoint, EndpointState state)
-    {
-        if (state == null)
-            return FINISHED_FUTURE;
-
-        UUID version = state.getSchemaVersion();
-
-        if (version == null)
-            return FINISHED_FUTURE;
-
-        return reportEndpointVersion(endpoint, version);
-    }
-
     private synchronized void removeEndpointFromVersion(InetAddressAndPort endpoint, UUID version)
     {
         if (version == null)
@@ -497,21 +479,55 @@
         }
     }
 
-    /**
-     * Remove all version info and signal all the waiting entities.
-     */
-    private synchronized void clearVersionsInfo()
+    private void clearVersionsInfo()
     {
         Iterator<Map.Entry<UUID, VersionInfo>> it = versionInfo.entrySet().iterator();
         while (it.hasNext())
         {
             Map.Entry<UUID, VersionInfo> entry = it.next();
             it.remove();
-            entry.getValue().waitQueue.signalAll();
+            entry.getValue().waitQueue.signal();
         }
     }
 
-    public synchronized void removeAndIgnoreEndpoint(InetAddressAndPort endpoint)
+    private void reportCurrentSchemaVersionOnEndpoint(InetAddressAndPort endpoint)
+    {
+        if (FBUtilities.getBroadcastAddressAndPort().equals(endpoint))
+        {
+            reportEndpointVersion(endpoint, schemaVersion.get());
+        }
+        else
+        {
+            EndpointState state = gossiper.getEndpointStateForEndpoint(endpoint);
+            if (state != null)
+            {
+                UUID v = state.getSchemaVersion();
+                if (v != null)
+                {
+                    reportEndpointVersion(endpoint, v);
+                }
+            }
+        }
+    }
+
+    /**
+     * Resets the migration coordinator by notifying all waiting threads and removing all the existing version info.
+     * Then, it is populated with the information about schema versions on different endpoints provided by Gossiper.
+     * Each version is marked as unreceived so the migration coordinator will start pulling schemas from other nodes.
+     */
+    synchronized void reset()
+    {
+        logger.info("Resetting migration coordinator...");
+
+        // clear all the managed information
+        this.endpointVersions.clear();
+        clearVersionsInfo();
+
+        // now report again the versions we are aware of
+        gossiper.getLiveMembers().forEach(this::reportCurrentSchemaVersionOnEndpoint);
+    }
+
+    synchronized void removeAndIgnoreEndpoint(InetAddressAndPort endpoint)
     {
         logger.debug("Removing and ignoring endpoint {}", endpoint);
         Preconditions.checkArgument(endpoint != null);
@@ -526,24 +542,14 @@
         }
     }
 
-    Future<Void> scheduleSchemaPull(InetAddressAndPort endpoint, VersionInfo info)
+    private Future<Void> scheduleSchemaPull(InetAddressAndPort endpoint, VersionInfo info)
     {
-        FutureTask<Void> task = new FutureTask<>(() -> pullSchema(new Callback(endpoint, info)), null);
+        FutureTask<Void> task = new FutureTask<>(() -> pullSchema(endpoint, new Callback(endpoint, info)));
+
         if (shouldPullImmediately(endpoint, info.version))
         {
-            long nextAttempt = lastPullAttemptTimestamps.getOrDefault(endpoint, 0L) + BACKOFF_DELAY_MS;
-            long now = System.currentTimeMillis();
-            if (nextAttempt <= now)
-            {
-                logger.debug("Pulling {} immediately from {}", info, endpoint);
-                submitToMigrationIfNotShutdown(task);
-            }
-            else
-            {
-                long delay = nextAttempt - now;
-                logger.debug("Previous pull of {} from {} failed. Postponing next attempt for {}ms", info, endpoint, delay);
-                ScheduledExecutors.nonPeriodicTasks.schedule(() -> submitToMigrationIfNotShutdown(task), delay, TimeUnit.MILLISECONDS);
-            }
+            logger.debug("Pulling {} immediately from {}", info, endpoint);
+            submitToMigrationIfNotShutdown(task);
         }
         else
         {
@@ -554,22 +560,29 @@
         return task;
     }
 
-    private static Future<?> submitToMigrationIfNotShutdown(Runnable task)
+    void announce(UUID schemaVersion)
+    {
+        if (gossiper.isEnabled())
+            gossiper.addLocalApplicationState(ApplicationState.SCHEMA, StorageService.instance.valueFactory.schema(schemaVersion));
+        SchemaDiagnostics.versionAnnounced(Schema.instance);
+    }
+
+    private Future<?> submitToMigrationIfNotShutdown(Runnable task)
     {
         boolean skipped = false;
         try
         {
-            if (Stage.MIGRATION.executor().isShutdown() || Stage.MIGRATION.executor().isTerminated())
+            if (executor.isShutdown() || executor.isTerminated())
             {
                 skipped = true;
-                return null;
+                return ImmediateFuture.success(null);
             }
-            return Stage.MIGRATION.submit(task);
+            return executor.submit(task);
         }
         catch (RejectedExecutionException ex)
         {
             skipped = true;
-            return null;
+            return ImmediateFuture.success(null);
         }
         finally
         {
@@ -580,13 +593,7 @@
         }
     }
 
-    @VisibleForTesting
-    protected void mergeSchemaFrom(InetAddressAndPort endpoint, Collection<Mutation> mutations)
-    {
-        Schema.instance.mergeAndAnnounceVersion(mutations);
-    }
-
-    class Callback implements RequestCallback<Collection<Mutation>>
+    private class Callback implements RequestCallback<Collection<Mutation>>
     {
         final InetAddressAndPort endpoint;
         final VersionInfo info;
@@ -620,7 +627,7 @@
                 {
                     try
                     {
-                        mergeSchemaFrom(endpoint, mutations);
+                        schemaUpdateCallback.accept(endpoint, mutations);
                     }
                     catch (Exception e)
                     {
@@ -638,79 +645,65 @@
         }
     }
 
-    private void pullSchema(Callback callback)
+    private void pullSchema(InetAddressAndPort endpoint, RequestCallback<Collection<Mutation>> callback)
     {
-        lastPullAttemptTimestamps.put(callback.endpoint, System.currentTimeMillis());
-
-        if (!isAlive(callback.endpoint))
+        if (!gossiper.isAlive(endpoint))
         {
-            noSpamLogger.warn("Can't send schema pull request: node {} is down.", callback.endpoint);
-            callback.fail();
+            noSpamLogger.warn("Can't send schema pull request: node {} is down.", endpoint);
+            callback.onFailure(endpoint, RequestFailureReason.UNKNOWN);
             return;
         }
 
         // There is a chance that quite some time could have passed between now and the MM#maybeScheduleSchemaPull(),
         // potentially enough for the endpoint node to restart - which is an issue if it does restart upgraded, with
         // a higher major.
-        if (!shouldPullFromEndpoint(callback.endpoint))
+        if (!shouldPullFromEndpoint(endpoint))
         {
-            logger.info("Skipped sending a migration request: node {} has a higher major version now.", callback.endpoint);
-            callback.fail();
+            logger.info("Skipped sending a migration request: node {} has a higher major version now.", endpoint);
+            callback.onFailure(endpoint, RequestFailureReason.UNKNOWN);
             return;
         }
 
-        logger.debug("Requesting schema from {}", callback.endpoint);
-        sendMigrationMessage(callback);
+        logger.debug("Requesting schema from {}", endpoint);
+        sendMigrationMessage(endpoint, callback);
     }
 
-    protected void sendMigrationMessage(Callback callback)
+    private void sendMigrationMessage(InetAddressAndPort endpoint, RequestCallback<Collection<Mutation>> callback)
     {
-        inflightTasks.getAndIncrement();
-        Message message = Message.out(Verb.SCHEMA_PULL_REQ, NoPayload.noPayload);
-        logger.info("Sending schema pull request to {}", callback.endpoint);
-        MessagingService.instance().sendWithCallback(message, callback.endpoint, callback);
+        Message<NoPayload> message = Message.out(Verb.SCHEMA_PULL_REQ, NoPayload.noPayload);
+        logger.info("Sending schema pull request to {}", endpoint);
+        messagingService.sendWithCallback(message, endpoint, callback);
     }
 
     private synchronized Future<Void> pullComplete(InetAddressAndPort endpoint, VersionInfo info, boolean wasSuccessful)
     {
-        inflightTasks.decrementAndGet();
         if (wasSuccessful)
-        {
             info.markReceived();
-            lastPullAttemptTimestamps.remove(endpoint);
-        }
 
         info.outstandingRequests.remove(endpoint);
         info.requestQueue.add(endpoint);
         return maybePullSchema(info);
     }
 
-    public int getInflightTasks()
-    {
-        return inflightTasks.get();
-    }
-
     /**
      * Wait until we've received schema responses for all versions we're aware of
      * @param waitMillis
      * @return true if response for all schemas were received, false if we timed out waiting
      */
-    public boolean awaitSchemaRequests(long waitMillis)
+    boolean awaitSchemaRequests(long waitMillis)
     {
         if (!FBUtilities.getBroadcastAddressAndPort().equals(InetAddressAndPort.getLoopbackAddress()))
             Gossiper.waitToSettle();
 
         if (versionInfo.isEmpty())
-        {
             logger.debug("Nothing in versionInfo - so no schemas to wait for");
-        }
 
-        WaitQueue.Signal signal = null;
+        List<WaitQueue.Signal> signalList = null;
         try
         {
             synchronized (this)
             {
-                List<WaitQueue.Signal> signalList = new ArrayList<>(versionInfo.size());
+                signalList = new ArrayList<>(versionInfo.size());
                 for (VersionInfo version : versionInfo.values())
                 {
                     if (version.wasReceived())
@@ -721,22 +714,47 @@
 
                 if (signalList.isEmpty())
                     return true;
-
-                WaitQueue.Signal[] signals = new WaitQueue.Signal[signalList.size()];
-                signalList.toArray(signals);
-                signal = WaitQueue.all(signals);
             }
 
-            return signal.awaitUntil(System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(waitMillis));
-        }
-        catch (InterruptedException e)
-        {
-            throw new RuntimeException(e);
+            long deadline = nanoTime() + TimeUnit.MILLISECONDS.toNanos(waitMillis);
+            return signalList.stream().allMatch(signal -> signal.awaitUntilUninterruptibly(deadline));
         }
         finally
         {
-            if (signal != null)
-                signal.cancel();
+            if (signalList != null)
+                signalList.forEach(WaitQueue.Signal::cancel);
         }
     }
+
+    Pair<Set<InetAddressAndPort>, Set<InetAddressAndPort>> pushSchemaMutations(Collection<Mutation> schemaMutations)
+    {
+        logger.debug("Pushing schema mutations: {}", schemaMutations);
+        Set<InetAddressAndPort> schemaDestinationEndpoints = new HashSet<>();
+        Set<InetAddressAndPort> schemaEndpointsIgnored = new HashSet<>();
+        Message<Collection<Mutation>> message = Message.out(SCHEMA_PUSH_REQ, schemaMutations);
+        for (InetAddressAndPort endpoint : gossiper.getLiveMembers())
+        {
+            if (shouldPushSchemaTo(endpoint))
+            {
+                logger.debug("Pushing schema mutations to {}: {}", endpoint, schemaMutations);
+                messagingService.send(message, endpoint);
+                schemaDestinationEndpoints.add(endpoint);
+            }
+            else
+            {
+                schemaEndpointsIgnored.add(endpoint);
+            }
+        }
+
+        return Pair.create(schemaDestinationEndpoints, schemaEndpointsIgnored);
+    }
+
+    private boolean shouldPushSchemaTo(InetAddressAndPort endpoint)
+    {
+        // only push schema to nodes with known and equal versions
+        return !endpoint.equals(FBUtilities.getBroadcastAddressAndPort())
+               && messagingService.versions.knows(endpoint)
+               && messagingService.versions.getRaw(endpoint) == MessagingService.current_version;
+    }
+
 }
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/schema/MigrationManager.java b/src/java/org/apache/cassandra/schema/MigrationManager.java
deleted file mode 100644
index 600de9a..0000000
--- a/src/java/org/apache/cassandra/schema/MigrationManager.java
+++ /dev/null
@@ -1,357 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.schema;
-
-import java.io.IOException;
-import java.util.*;
-import java.util.concurrent.*;
-import java.lang.management.ManagementFactory;
-import java.util.function.LongSupplier;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.Futures;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.db.*;
-import org.apache.cassandra.exceptions.AlreadyExistsException;
-import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.gms.*;
-import org.apache.cassandra.io.IVersionedSerializer;
-import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.schema.Keyspaces.KeyspacesDiff;
-import org.apache.cassandra.utils.FBUtilities;
-
-import static org.apache.cassandra.concurrent.Stage.MIGRATION;
-import static org.apache.cassandra.net.Verb.SCHEMA_PUSH_REQ;
-
-public class MigrationManager
-{
-    private static final Logger logger = LoggerFactory.getLogger(MigrationManager.class);
-
-    public static final MigrationManager instance = new MigrationManager();
-
-    private MigrationManager() {}
-
-    private static boolean shouldPushSchemaTo(InetAddressAndPort endpoint)
-    {
-        // only push schema to nodes with known and equal versions
-        return !endpoint.equals(FBUtilities.getBroadcastAddressAndPort())
-               && MessagingService.instance().versions.knows(endpoint)
-               && MessagingService.instance().versions.getRaw(endpoint) == MessagingService.current_version;
-    }
-
-    public static void announceNewKeyspace(KeyspaceMetadata ksm) throws ConfigurationException
-    {
-        announceNewKeyspace(ksm, false);
-    }
-
-    public static void announceNewKeyspace(KeyspaceMetadata ksm, boolean announceLocally) throws ConfigurationException
-    {
-        announceNewKeyspace(ksm, FBUtilities.timestampMicros(), announceLocally);
-    }
-
-    public static void announceNewKeyspace(KeyspaceMetadata ksm, long timestamp, boolean announceLocally) throws ConfigurationException
-    {
-        ksm.validate();
-
-        if (Schema.instance.getKeyspaceMetadata(ksm.name) != null)
-            throw new AlreadyExistsException(ksm.name);
-
-        logger.info("Create new Keyspace: {}", ksm);
-        announce(SchemaKeyspace.makeCreateKeyspaceMutation(ksm, timestamp), announceLocally);
-    }
-
-    public static void announceNewTable(TableMetadata cfm)
-    {
-        announceNewTable(cfm, true, FBUtilities.timestampMicros());
-    }
-
-    private static void announceNewTable(TableMetadata cfm, boolean throwOnDuplicate, long timestamp)
-    {
-        cfm.validate();
-
-        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(cfm.keyspace);
-        if (ksm == null)
-            throw new ConfigurationException(String.format("Cannot add table '%s' to non existing keyspace '%s'.", cfm.name, cfm.keyspace));
-        // If we have a table or a view which has the same name, we can't add a new one
-        else if (throwOnDuplicate && ksm.getTableOrViewNullable(cfm.name) != null)
-            throw new AlreadyExistsException(cfm.keyspace, cfm.name);
-
-        logger.info("Create new table: {}", cfm);
-        announce(SchemaKeyspace.makeCreateTableMutation(ksm, cfm, timestamp), false);
-    }
-
-    static void announceKeyspaceUpdate(KeyspaceMetadata ksm)
-    {
-        ksm.validate();
-
-        KeyspaceMetadata oldKsm = Schema.instance.getKeyspaceMetadata(ksm.name);
-        if (oldKsm == null)
-            throw new ConfigurationException(String.format("Cannot update non existing keyspace '%s'.", ksm.name));
-
-        logger.info("Update Keyspace '{}' From {} To {}", ksm.name, oldKsm, ksm);
-        announce(SchemaKeyspace.makeCreateKeyspaceMutation(ksm.name, ksm.params, FBUtilities.timestampMicros()), false);
-    }
-
-    public static void announceTableUpdate(TableMetadata tm)
-    {
-        announceTableUpdate(tm, false);
-    }
-
-    public static void announceTableUpdate(TableMetadata updated, boolean announceLocally)
-    {
-        updated.validate();
-
-        TableMetadata current = Schema.instance.getTableMetadata(updated.keyspace, updated.name);
-        if (current == null)
-            throw new ConfigurationException(String.format("Cannot update non existing table '%s' in keyspace '%s'.", updated.name, updated.keyspace));
-        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(current.keyspace);
-
-        updated.validateCompatibility(current);
-
-        long timestamp = FBUtilities.timestampMicros();
-
-        logger.info("Update table '{}/{}' From {} To {}", current.keyspace, current.name, current, updated);
-        Mutation.SimpleBuilder builder = SchemaKeyspace.makeUpdateTableMutation(ksm, current, updated, timestamp);
-
-        announce(builder, announceLocally);
-    }
-
-    static void announceKeyspaceDrop(String ksName)
-    {
-        KeyspaceMetadata oldKsm = Schema.instance.getKeyspaceMetadata(ksName);
-        if (oldKsm == null)
-            throw new ConfigurationException(String.format("Cannot drop non existing keyspace '%s'.", ksName));
-
-        logger.info("Drop Keyspace '{}'", oldKsm.name);
-        announce(SchemaKeyspace.makeDropKeyspaceMutation(oldKsm, FBUtilities.timestampMicros()), false);
-    }
-
-    public static void announceTableDrop(String ksName, String cfName, boolean announceLocally)
-    {
-        TableMetadata tm = Schema.instance.getTableMetadata(ksName, cfName);
-        if (tm == null)
-            throw new ConfigurationException(String.format("Cannot drop non existing table '%s' in keyspace '%s'.", cfName, ksName));
-        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(ksName);
-
-        logger.info("Drop table '{}/{}'", tm.keyspace, tm.name);
-        announce(SchemaKeyspace.makeDropTableMutation(ksm, tm, FBUtilities.timestampMicros()), announceLocally);
-    }
-
-    /**
-     * actively announce a new version to active hosts via rpc
-     * @param schema The schema mutation to be applied
-     */
-    private static void announce(Mutation.SimpleBuilder schema, boolean announceLocally)
-    {
-        List<Mutation> mutations = Collections.singletonList(schema.build());
-
-        if (announceLocally)
-            Schema.instance.merge(mutations);
-        else
-            announce(mutations);
-    }
-
-    public static void announce(Mutation change)
-    {
-        announce(Collections.singleton(change));
-    }
-
-    public static void announce(Collection<Mutation> schema)
-    {
-        Future<?> f = announceWithoutPush(schema);
-
-        Set<InetAddressAndPort> schemaDestinationEndpoints = new HashSet<>();
-        Set<InetAddressAndPort> schemaEndpointsIgnored = new HashSet<>();
-        Message<Collection<Mutation>> message = Message.out(SCHEMA_PUSH_REQ, schema);
-        for (InetAddressAndPort endpoint : Gossiper.instance.getLiveMembers())
-        {
-            if (shouldPushSchemaTo(endpoint))
-            {
-                MessagingService.instance().send(message, endpoint);
-                schemaDestinationEndpoints.add(endpoint);
-            }
-            else
-            {
-                schemaEndpointsIgnored.add(endpoint);
-            }
-        }
-
-        SchemaAnnouncementDiagnostics.schemaMutationsAnnounced(schemaDestinationEndpoints, schemaEndpointsIgnored);
-        FBUtilities.waitOnFuture(f);
-    }
-
-    public static Future<?> announceWithoutPush(Collection<Mutation> schema)
-    {
-        return MIGRATION.submit(() -> Schema.instance.mergeAndAnnounceVersion(schema));
-    }
-
-    public static KeyspacesDiff announce(SchemaTransformation transformation, boolean locally)
-    {
-        long now = FBUtilities.timestampMicros();
-
-        Future<Schema.TransformationResult> future =
-            MIGRATION.submit(() -> Schema.instance.transform(transformation, locally, now));
-
-        Schema.TransformationResult result = Futures.getUnchecked(future);
-        if (!result.success)
-            throw result.exception;
-
-        if (locally || result.diff.isEmpty())
-            return result.diff;
-
-        Set<InetAddressAndPort> schemaDestinationEndpoints = new HashSet<>();
-        Set<InetAddressAndPort> schemaEndpointsIgnored = new HashSet<>();
-        Message<Collection<Mutation>> message = Message.out(SCHEMA_PUSH_REQ, result.mutations);
-        for (InetAddressAndPort endpoint : Gossiper.instance.getLiveMembers())
-        {
-            if (shouldPushSchemaTo(endpoint))
-            {
-                MessagingService.instance().send(message, endpoint);
-                schemaDestinationEndpoints.add(endpoint);
-            }
-            else
-            {
-                schemaEndpointsIgnored.add(endpoint);
-            }
-        }
-
-        SchemaAnnouncementDiagnostics.schemaTransformationAnnounced(schemaDestinationEndpoints, schemaEndpointsIgnored,
-                                                                    transformation);
-
-        return result.diff;
-    }
-
-    /**
-     * Clear all locally stored schema information and reset schema to initial state.
-     * Called by user (via JMX) who wants to get rid of schema disagreement.
-     */
-    public static void resetLocalSchema()
-    {
-        logger.info("Starting local schema reset...");
-
-        logger.debug("Truncating schema tables...");
-
-        SchemaMigrationDiagnostics.resetLocalSchema();
-
-        Schema.instance.truncateSchemaKeyspace();
-
-        logger.debug("Clearing local schema keyspace definitions...");
-
-        Schema.instance.clear();
-
-        // clean the all version information from the MigrationCoordinator
-        MigrationCoordinator.instance.reset();
-
-        // now report again the versions we are aware of
-        Set<InetAddressAndPort> liveEndpoints = Gossiper.instance.getLiveMembers();
-        liveEndpoints.remove(FBUtilities.getBroadcastAddressAndPort());
-
-        // force migration if there are nodes around
-        for (InetAddressAndPort node : liveEndpoints)
-        {
-            EndpointState state = Gossiper.instance.getEndpointStateForEndpoint(node);
-            Future<Void> pull = MigrationCoordinator.instance.reportEndpointVersion(node, state);
-            if (pull != null)
-                FBUtilities.waitOnFuture(pull);
-        }
-
-        logger.info("Local schema reset is complete.");
-    }
-
-    /**
-     * We have a set of non-local, distributed system keyspaces, e.g. system_traces, system_auth, etc.
-     * (see {@link SchemaConstants#REPLICATED_SYSTEM_KEYSPACE_NAMES}), that need to be created on cluster initialisation,
-     * and later evolved on major upgrades (sometimes minor too). This method compares the current known definitions
-     * of the tables (if the keyspace exists) to the expected, most modern ones expected by the running version of C*;
-     * if any changes have been detected, a schema Mutation will be created which, when applied, should make
-     * cluster's view of that keyspace aligned with the expected modern definition.
-     *
-     * @param keyspace   the expected modern definition of the keyspace
-     * @param generation timestamp to use for the table changes in the schema mutation
-     *
-     * @return empty Optional if the current definition is up to date, or an Optional with the Mutation that would
-     *         bring the schema in line with the expected definition.
-     */
-    public static Optional<Mutation> evolveSystemKeyspace(KeyspaceMetadata keyspace, long generation)
-    {
-        Mutation.SimpleBuilder builder = null;
-
-        KeyspaceMetadata definedKeyspace = Schema.instance.getKeyspaceMetadata(keyspace.name);
-        Tables definedTables = null == definedKeyspace ? Tables.none() : definedKeyspace.tables;
-
-        for (TableMetadata table : keyspace.tables)
-        {
-            if (table.equals(definedTables.getNullable(table.name)))
-                continue;
-
-            if (null == builder)
-            {
-                // for the keyspace definition itself (name, replication, durability) always use generation 0;
-                // this ensures that any changes made to replication by the user will never be overwritten.
-                builder = SchemaKeyspace.makeCreateKeyspaceMutation(keyspace.name, keyspace.params, 0);
-
-                // now set the timestamp to generation, so the tables have the expected timestamp
-                builder.timestamp(generation);
-            }
-
-            // for table definitions always use the provided generation; these tables, unlike their containing
-            // keyspaces, are *NOT* meant to be altered by the user; if their definitions need to change,
-            // the schema must be updated in code, and the appropriate generation must be bumped.
-            SchemaKeyspace.addTableToSchemaMutation(table, true, builder);
-        }
-
-        return builder == null ? Optional.empty() : Optional.of(builder.build());
-    }
-
-    public static class MigrationsSerializer implements IVersionedSerializer<Collection<Mutation>>
-    {
-        public static MigrationsSerializer instance = new MigrationsSerializer();
-
-        public void serialize(Collection<Mutation> schema, DataOutputPlus out, int version) throws IOException
-        {
-            out.writeInt(schema.size());
-            for (Mutation mutation : schema)
-                Mutation.serializer.serialize(mutation, out, version);
-        }
-
-        public Collection<Mutation> deserialize(DataInputPlus in, int version) throws IOException
-        {
-            int count = in.readInt();
-            Collection<Mutation> schema = new ArrayList<>(count);
-
-            for (int i = 0; i < count; i++)
-                schema.add(Mutation.serializer.deserialize(in, version));
-
-            return schema;
-        }
-
-        public long serializedSize(Collection<Mutation> schema, int version)
-        {
-            int size = TypeSizes.sizeof(schema.size());
-            for (Mutation mutation : schema)
-                size += mutation.serializedSize(version);
-            return size;
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/schema/OfflineSchemaUpdateHandler.java b/src/java/org/apache/cassandra/schema/OfflineSchemaUpdateHandler.java
new file mode 100644
index 0000000..16694b1
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/OfflineSchemaUpdateHandler.java
@@ -0,0 +1,96 @@
+/*
+ * 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.schema;
+
+import java.time.Duration;
+import java.util.UUID;
+import java.util.function.BiConsumer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
+import org.apache.cassandra.utils.ByteArrayUtil;
+import org.apache.cassandra.utils.concurrent.Awaitable;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+
+/**
+ * Update handler which works only in memory. It does not load or save the schema anywhere. It is used in client mode
+ * applications.
+ */
+public class OfflineSchemaUpdateHandler implements SchemaUpdateHandler
+{
+    private static final Logger logger = LoggerFactory.getLogger(OfflineSchemaUpdateHandler.class);
+
+    private final BiConsumer<SchemaTransformationResult, Boolean> updateCallback;
+
+    private volatile DistributedSchema schema = DistributedSchema.EMPTY;
+
+    public OfflineSchemaUpdateHandler(BiConsumer<SchemaTransformationResult, Boolean> updateCallback)
+    {
+        this.updateCallback = updateCallback;
+    }
+
+    @Override
+    public void start()
+    {
+        // no-op
+    }
+
+    @Override
+    public boolean waitUntilReady(Duration timeout)
+    {
+        return true;
+    }
+
+    @Override
+    public synchronized SchemaTransformationResult apply(SchemaTransformation transformation, boolean local)
+    {
+        DistributedSchema before = schema;
+        Keyspaces afterKeyspaces = transformation.apply(before.getKeyspaces());
+        Keyspaces.KeyspacesDiff diff = Keyspaces.diff(before.getKeyspaces(), afterKeyspaces);
+
+        if (diff.isEmpty())
+            return new SchemaTransformationResult(before, before, diff);
+
+        DistributedSchema after = new DistributedSchema(afterKeyspaces, UUID.nameUUIDFromBytes(ByteArrayUtil.bytes(afterKeyspaces.hashCode())));
+        SchemaTransformationResult update = new SchemaTransformationResult(before, after, diff);
+        this.schema = after;
+        logger.debug("Schema updated: {}", update);
+        updateCallback.accept(update, true);
+
+        return update;
+    }
+
+    @Override
+    public void reset(boolean local)
+    {
+        if (!local)
+            throw new UnsupportedOperationException();
+
+        apply(ignored -> SchemaKeyspace.fetchNonSystemKeyspaces(), local);
+    }
+
+    @Override
+    public synchronized Awaitable clear()
+    {
+        this.schema = DistributedSchema.EMPTY;
+        return ImmediateFuture.success(true);
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/PartitionDenylist.java b/src/java/org/apache/cassandra/schema/PartitionDenylist.java
new file mode 100644
index 0000000..53fcb5e
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/PartitionDenylist.java
@@ -0,0 +1,535 @@
+/*
+ * 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.schema;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.NavigableSet;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSortedSet;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.github.benmanes.caffeine.cache.CacheLoader;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.dht.AbstractBounds;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RequestExecutionException;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.reads.range.RangeCommands;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.NoSpamLogger;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.cql3.QueryProcessor.process;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
+/**
+ * PartitionDenylist uses the system_distributed.partition_denylist table to maintain a list of denylisted partition keys
+ * for each keyspace/table.
+ *
+ * Keys can be entered manually into the partition_denylist table or via the JMX operation StorageProxyMBean.denylistKey
+ *
+ * The denylist is stored as one CQL partition per table, and the denylisted keys are column names in that partition. The denylisted
+ * keys for each table are cached in memory, and reloaded from the partition_denylist table every 10 minutes (default) or when the
+ * StorageProxyMBean.loadPartitionDenylist is called via JMX.
+ *
+ * Concurrency of the cache is provided by the concurrency semantics of the guava LoadingCache. All values (DenylistEntry) are
+ * immutable collections of keys/tokens which are replaced in whole when the cache refreshes from disk.
+ *
+ * The CL for the denylist is used on initial node load as well as on timer instigated cache refreshes. A JMX call by the
+ * operator to load the denylist cache will warn on CL unavailability but go through with the denylist load. This is to
+ * allow operators flexibility in the face of degraded cluster state and still grant them the ability to mutate the denylist
+ * cache and bring it up if there are things they need to block on startup.
+ *
+ * Notably, in the current design it's possible for a table *cache expiration instigated* reload to end up violating the
+ * contract on total denylisted keys allowed in the case where it initially loads with a value less than the DBD
+ * allowable max per table limit due to global constraint enforcement on initial load. Our load and reload function
+ * simply enforce the *per table* limit without consideration to what that entails at the global key level. While we
+ * could track the constrained state and count in DenylistEntry, for now the complexity doesn't seem to justify the
+ * protection against that edge case. The enforcement should take place on a user-instigated full reload as well as
+ * error messaging about count violations, so this only applies to situations in which someone adds a key and doesn't
+ * actively tell the cache to fully reload to take that key into consideration, which one could reasonably expect to be
+ * an antipattern.
+ */
+public class PartitionDenylist
+{
+    private static final Logger logger = LoggerFactory.getLogger(PartitionDenylist.class);
+    private static final NoSpamLogger AVAILABILITY_LOGGER = NoSpamLogger.getLogger(logger, 1, TimeUnit.MINUTES);
+
+    private final ExecutorService executor = executorFactory().pooled("DenylistCache", 2);
+
+    /** We effectively don't use our initial empty cache to denylist until the {@link #load()} call which will replace it */
+    private volatile LoadingCache<TableId, DenylistEntry> denylist = buildEmptyCache();
+
+    /** Denylist entry is never mutated once constructed, only replaced with a new entry when the cache is refreshed */
+    private static class DenylistEntry
+    {
+        public final ImmutableSet<ByteBuffer> keys;
+        public final ImmutableSortedSet<Token> tokens;
+
+        public DenylistEntry()
+        {
+            keys = ImmutableSet.of();
+            tokens = ImmutableSortedSet.of();
+        }
+
+        public DenylistEntry(final ImmutableSet<ByteBuffer> keys, final ImmutableSortedSet<Token> tokens)
+        {
+            this.keys = keys;
+            this.tokens = tokens;
+        }
+    }
+
+    /** synchronized on this */
+    private int loadAttempts = 0;
+
+    /** synchronized on this */
+    private int loadSuccesses = 0;
+
+    public synchronized int getLoadAttempts()
+    {
+        return loadAttempts;
+    }
+    public synchronized int getLoadSuccesses()
+    {
+        return loadSuccesses;
+    }
+
+    /**
+     * Performs initial load of the partition denylist. Should be called at startup and only loads if the operation
+     * is expected to succeed.  If it is not possible to load at call time, a timer is set to retry.
+     */
+    public void initialLoad()
+    {
+        if (!DatabaseDescriptor.getPartitionDenylistEnabled())
+            return;
+
+        synchronized (this)
+        {
+            loadAttempts++;
+        }
+
+        // Check if there are sufficient nodes to attempt reading all the denylist partitions before issuing the query.
+        // The pre-check prevents definite range-slice unavailables being marked and triggering an alert.  Nodes may still change
+        // state between the check and the query, but it should significantly reduce the alert volume.
+        String retryReason = "Insufficient nodes";
+        try
+        {
+            if (checkDenylistNodeAvailability())
+            {
+                load();
+                return;
+            }
+        }
+        catch (Throwable tr)
+        {
+            logger.error("Failed to load partition denylist", tr);
+            retryReason = "Exception";
+        }
+
+        // This path will also be taken on other failures other than UnavailableException,
+        // but seems like a good idea to retry anyway.
+        int retryInSeconds = DatabaseDescriptor.getDenylistInitialLoadRetrySeconds();
+        logger.info("{} while loading partition denylist cache. Scheduled retry in {} seconds.", retryReason, retryInSeconds);
+        ScheduledExecutors.optionalTasks.schedule(this::initialLoad, retryInSeconds, TimeUnit.SECONDS);
+    }
+
+    private boolean checkDenylistNodeAvailability()
+    {
+        boolean sufficientNodes = RangeCommands.sufficientLiveNodesForSelectStar(SystemDistributedKeyspace.PartitionDenylistTable,
+                                                                                 DatabaseDescriptor.getDenylistConsistencyLevel());
+        if (!sufficientNodes)
+        {
+            AVAILABILITY_LOGGER.warn("Attempting to load denylist and not enough nodes are available for a {} refresh. Reload the denylist when unavailable nodes are recovered to ensure your denylist remains in sync.",
+                                     DatabaseDescriptor.getDenylistConsistencyLevel());
+        }
+        return sufficientNodes;
+    }
+
+    /** Helper method as we need to both build cache on initial init but also on reload of cache contents and params */
+    private LoadingCache<TableId, DenylistEntry> buildEmptyCache()
+    {
+        // We rely on details of .refreshAfterWrite to reload this async in the background when it's hit:
+        // https://github.com/ben-manes/caffeine/wiki/Refresh
+        return Caffeine.newBuilder()
+                       .refreshAfterWrite(DatabaseDescriptor.getDenylistRefreshSeconds(), TimeUnit.SECONDS)
+                       .executor(executor)
+                       .build(new CacheLoader<TableId, DenylistEntry>()
+                       {
+                           @Override
+                           public DenylistEntry load(final TableId tid)
+                           {
+                               // We load whether or not the CL required count are available as the alternative is an
+                               // empty denylist. This allows operators to intervene in the event they need to deny or
+                               // undeny a specific partition key around a node recovery.
+                               checkDenylistNodeAvailability();
+                               return getDenylistForTableFromCQL(tid);
+                           }
+
+                           // The synchronous reload method defaults to being wrapped with a supplyAsync in CacheLoader.asyncReload
+                           @Override
+                           public DenylistEntry reload(final TableId tid, final DenylistEntry oldValue)
+                           {
+                               // Only process when we can hit the user specified CL for the denylist consistency on a timer prompted reload
+                               if (checkDenylistNodeAvailability())
+                               {
+                                   final DenylistEntry newEntry = getDenylistForTableFromCQL(tid);
+                                   if (newEntry != null)
+                                       return newEntry;
+                               }
+                               if (oldValue != null)
+                                   return oldValue;
+                               return new DenylistEntry();
+                           }
+                       });
+    }
+
+    /**
+     * We need to fully rebuild a new cache to accommodate deleting items from the denylist and potentially shrinking
+     * the max allowable size in the list. We do not serve queries out of this denylist until it is populated
+     * so as not to introduce a window of having a partially filled cache allow denylisted entries.
+     */
+    public void load()
+    {
+        final long start = currentTimeMillis();
+
+        final Map<TableId, DenylistEntry> allDenylists = getDenylistForAllTablesFromCQL();
+
+        // On initial load we have the slight overhead of GC'ing our initial empty cache
+        LoadingCache<TableId, DenylistEntry> newDenylist = buildEmptyCache();
+        newDenylist.putAll(allDenylists);
+
+        synchronized (this)
+        {
+            loadSuccesses++;
+        }
+        denylist = newDenylist;
+        logger.info("Loaded partition denylist cache in {}ms", currentTimeMillis() - start);
+    }
+
+    /**
+     * We expect the caller to confirm that we are working with a valid keyspace and table. Further, we expect the usage
+     * pattern of this to be one-off key by key, not in a bulk process, so we reload the entire table's deny list entry
+     * on an addition or removal.
+     */
+    public boolean addKeyToDenylist(final String keyspace, final String table, final ByteBuffer key)
+    {
+        if (!canDenylistKeyspace(keyspace))
+            return false;
+
+        final String insert = String.format("INSERT INTO system_distributed.partition_denylist (ks_name, table_name, key) VALUES ('%s', '%s', 0x%s)",
+                                            keyspace, table, ByteBufferUtil.bytesToHex(key));
+
+        try
+        {
+            process(insert, DatabaseDescriptor.getDenylistConsistencyLevel());
+            return refreshTableDenylist(keyspace, table);
+        }
+        catch (final RequestExecutionException e)
+        {
+            logger.error("Failed to denylist key [{}] in {}/{}", ByteBufferUtil.bytesToHex(key), keyspace, table, e);
+        }
+        return false;
+    }
+
+    /**
+     * We expect the caller to confirm that we are working with a valid keyspace and table.
+     */
+    public boolean removeKeyFromDenylist(final String keyspace, final String table, final ByteBuffer key)
+    {
+        final String delete = String.format("DELETE FROM system_distributed.partition_denylist " +
+                                            "WHERE ks_name = '%s' " +
+                                            "AND table_name = '%s' " +
+                                            "AND key = 0x%s",
+                                            keyspace, table, ByteBufferUtil.bytesToHex(key));
+
+        try
+        {
+            process(delete, DatabaseDescriptor.getDenylistConsistencyLevel());
+            return refreshTableDenylist(keyspace, table);
+        }
+        catch (final RequestExecutionException e)
+        {
+            logger.error("Failed to remove key from denylist: [{}] in {}/{}", ByteBufferUtil.bytesToHex(key), keyspace, table, e);
+        }
+        return false;
+    }
+
+    /**
+     * We disallow denylisting partitions in certain critical keyspaces to prevent users from making their clusters
+     * inoperable.
+     */
+    private boolean canDenylistKeyspace(final String keyspace)
+    {
+        return !SchemaConstants.DISTRIBUTED_KEYSPACE_NAME.equals(keyspace) &&
+               !SchemaConstants.SYSTEM_KEYSPACE_NAME.equals(keyspace) &&
+               !SchemaConstants.TRACE_KEYSPACE_NAME.equals(keyspace) &&
+               !SchemaConstants.VIRTUAL_SCHEMA.equals(keyspace) &&
+               !SchemaConstants.VIRTUAL_VIEWS.equals(keyspace) &&
+               !SchemaConstants.AUTH_KEYSPACE_NAME.equals(keyspace);
+    }
+
+    public boolean isKeyPermitted(final String keyspace, final String table, final ByteBuffer key)
+    {
+        return isKeyPermitted(getTableId(keyspace, table), key);
+    }
+
+    public boolean isKeyPermitted(final TableId tid, final ByteBuffer key)
+    {
+        final TableMetadata tmd = Schema.instance.getTableMetadata(tid);
+
+        // We have a few quick state checks to get out of the way first; this is hot path so we want to do these first if possible.
+        if (!DatabaseDescriptor.getPartitionDenylistEnabled() || tid == null || tmd == null || !canDenylistKeyspace(tmd.keyspace))
+            return true;
+
+        try
+        {
+            // If we don't have an entry for this table id, nothing in it is denylisted.
+            DenylistEntry entry = denylist.get(tid);
+            if (entry == null)
+                return true;
+            return !entry.keys.contains(key);
+        }
+        catch (final Exception e)
+        {
+            // In the event of an error accessing or populating the cache, assume it's not denylisted
+            logAccessFailure(tid, e);
+            return true;
+        }
+    }
+
+    private void logAccessFailure(final TableId tid, Throwable e)
+    {
+        final TableMetadata tmd = Schema.instance.getTableMetadata(tid);
+        if (tmd == null)
+            logger.debug("Failed to access partition denylist cache for unknown table id {}", tid.toString(), e);
+        else
+            logger.debug("Failed to access partition denylist cache for {}/{}", tmd.keyspace, tmd.name, e);
+    }
+
+    /**
+     * @return number of denylisted keys in range
+     */
+    public int getDeniedKeysInRangeCount(final String keyspace, final String table, final AbstractBounds<PartitionPosition> range)
+    {
+        return getDeniedKeysInRangeCount(getTableId(keyspace, table), range);
+    }
+
+    /**
+     * @return number of denylisted keys in range
+     */
+    public int getDeniedKeysInRangeCount(final TableId tid, final AbstractBounds<PartitionPosition> range)
+    {
+        final TableMetadata tmd = Schema.instance.getTableMetadata(tid);
+        if (!DatabaseDescriptor.getPartitionDenylistEnabled() || tid == null || tmd == null || !canDenylistKeyspace(tmd.keyspace))
+            return 0;
+
+        try
+        {
+            final DenylistEntry denylistEntry = denylist.get(tid);
+            if (denylistEntry == null || denylistEntry.tokens.size() == 0)
+                return 0;
+            final Token startToken = range.left.getToken();
+            final Token endToken = range.right.getToken();
+
+            // Normal case
+            if (startToken.compareTo(endToken) <= 0 || endToken.isMinimum())
+            {
+                NavigableSet<Token> subSet = denylistEntry.tokens.tailSet(startToken, PartitionPosition.Kind.MIN_BOUND == range.left.kind());
+                if (!endToken.isMinimum())
+                    subSet = subSet.headSet(endToken, PartitionPosition.Kind.MAX_BOUND == range.right.kind());
+                return subSet.size();
+            }
+
+            // Wrap around case
+            return denylistEntry.tokens.tailSet(startToken, PartitionPosition.Kind.MIN_BOUND == range.left.kind()).size()
+                   + denylistEntry.tokens.headSet(endToken, PartitionPosition.Kind.MAX_BOUND == range.right.kind()).size();
+        }
+        catch (final Exception e)
+        {
+            logAccessFailure(tid, e);
+            return 0;
+        }
+    }
+
+    /**
+     * Get up to the configured allowable limit per table of denylisted keys
+     */
+    private DenylistEntry getDenylistForTableFromCQL(final TableId tid)
+    {
+        return getDenylistForTableFromCQL(tid, DatabaseDescriptor.getDenylistMaxKeysPerTable());
+    }
+
+    /**
+     * Attempts to reload the DenylistEntry data from CQL for the given TableId and key count.
+     * @return empty denylist if we do not or cannot find the data, preserving the old value, otherwise the new value
+     */
+    private DenylistEntry getDenylistForTableFromCQL(final TableId tid, int limit)
+    {
+        final TableMetadata tmd = Schema.instance.getTableMetadata(tid);
+        if (tmd == null)
+            return null;
+
+        // We attempt to query just over our allowable max keys in order to check whether we have configured data beyond that limit and alert the user if so
+        final String readDenylist = String.format("SELECT * FROM %s.%s WHERE ks_name='%s' AND table_name='%s' LIMIT %d",
+                                                  SchemaConstants.DISTRIBUTED_KEYSPACE_NAME,
+                                                  SystemDistributedKeyspace.PARTITION_DENYLIST_TABLE,
+                                                  tmd.keyspace,
+                                                  tmd.name,
+                                                  limit + 1);
+
+        try
+        {
+            final UntypedResultSet results = process(readDenylist, DatabaseDescriptor.getDenylistConsistencyLevel());
+
+            // If there's no data in CQL we want to return an empty DenylistEntry so we don't continue using the old value in the cache
+            if (results == null || results.isEmpty())
+                return new DenylistEntry();
+
+            if (results.size() > limit)
+            {
+                // If our limit is < the standard per table we know we're at a global violation because we've constrained that request limit already.
+                boolean globalLimit = limit != DatabaseDescriptor.getDenylistMaxKeysPerTable();
+                String violationType = globalLimit ? "global" : "per-table";
+                int errorLimit = globalLimit ? DatabaseDescriptor.getDenylistMaxKeysTotal() : limit;
+                logger.error("Partition denylist for {}/{} has exceeded the {} allowance of ({}). Remaining keys were ignored; " +
+                             "please reduce the total number of keys denied or increase the denylist_max_keys_per_table param in " +
+                             "cassandra.yaml to avoid inconsistency in denied partitions across nodes.",
+                             tmd.keyspace,
+                             tmd.name,
+                             violationType,
+                             errorLimit);
+            }
+
+            final Set<ByteBuffer> keys = new HashSet<>();
+            final NavigableSet<Token> tokens = new TreeSet<>();
+
+            int processed = 0;
+            for (final UntypedResultSet.Row row : results)
+            {
+                final ByteBuffer key = row.getBlob("key");
+                keys.add(key);
+                tokens.add(StorageService.instance.getTokenMetadata().partitioner.getToken(key));
+
+                processed++;
+                if (processed >= limit)
+                    break;
+            }
+            return new DenylistEntry(ImmutableSet.copyOf(keys), ImmutableSortedSet.copyOf(tokens));
+        }
+        catch (final RequestExecutionException e)
+        {
+            logger.error("Error reading partition_denylist table for {}/{}. Returning empty denylist.", tmd.keyspace, tmd.name, e);
+            return new DenylistEntry();
+        }
+    }
+
+    /**
+     * This method relies on {@link #getDenylistForTableFromCQL(TableId, int)} to pull a limited amount of keys
+     * on a per-table basis from CQL to load into the cache. We need to navigate both respecting the max cache size limit
+     * as well as respecting the per-table limit.
+     * @return non-null mapping of TableId to DenylistEntry
+     */
+    private Map<TableId, DenylistEntry> getDenylistForAllTablesFromCQL()
+    {
+        // While we warn the user in this case, we continue with the reload anyway.
+        checkDenylistNodeAvailability();
+
+        final String allDeniedTables = String.format("SELECT DISTINCT ks_name, table_name FROM %s.%s",
+                                                     SchemaConstants.DISTRIBUTED_KEYSPACE_NAME,
+                                                     SystemDistributedKeyspace.PARTITION_DENYLIST_TABLE);
+        try
+        {
+            final UntypedResultSet deniedTableResults = process(allDeniedTables, DatabaseDescriptor.getDenylistConsistencyLevel());
+            if (deniedTableResults == null || deniedTableResults.isEmpty())
+                return Collections.emptyMap();
+
+            int totalProcessed = 0 ;
+            final Map<TableId, DenylistEntry> results = new HashMap<>();
+            for (final UntypedResultSet.Row row : deniedTableResults)
+            {
+                final String ks = row.getString("ks_name");
+                final String table = row.getString("table_name");
+                final TableId tid = getTableId(ks, table);
+                if (DatabaseDescriptor.getDenylistMaxKeysTotal() - totalProcessed <= 0)
+                {
+                    logger.error("Hit limit on allowable denylisted keys in total. Processed {} total entries. Not adding all entries to denylist for {}/{}." +
+                                 " Remove denylist entries in system_distributed.{} or increase your denylist_max_keys_total param in cassandra.yaml.",
+                                 totalProcessed,
+                                 ks,
+                                 table,
+                                 SystemDistributedKeyspace.PARTITION_DENYLIST_TABLE);
+                    results.put(tid, new DenylistEntry());
+                }
+                else
+                {
+                    // Determine whether we can get up to table max or we need a subset at edge condition of max overflow.
+                    int allowedTableRecords = Math.min(DatabaseDescriptor.getDenylistMaxKeysPerTable(), DatabaseDescriptor.getDenylistMaxKeysTotal() - totalProcessed);
+                    DenylistEntry tableDenylist = getDenylistForTableFromCQL(tid, allowedTableRecords);
+                    if (tableDenylist != null)
+                        totalProcessed += tableDenylist.keys.size();
+                    results.put(tid, tableDenylist);
+                }
+            }
+            return results;
+        }
+        catch (final RequestExecutionException e)
+        {
+            logger.error("Error reading full partition denylist from "
+                         + SchemaConstants.DISTRIBUTED_KEYSPACE_NAME + "." + SystemDistributedKeyspace.PARTITION_DENYLIST_TABLE +
+                         ". Partition Denylisting will be compromised. Exception: " + e);
+            return Collections.emptyMap();
+        }
+    }
+
+    private boolean refreshTableDenylist(String keyspace, String table)
+    {
+        checkDenylistNodeAvailability();
+        final TableId tid = getTableId(keyspace, table);
+        if (tid == null)
+        {
+            logger.warn("Got denylist mutation for unknown ks/cf: {}/{}. Skipping refresh.", keyspace, table);
+            return false;
+        }
+
+        DenylistEntry newEntry = getDenylistForTableFromCQL(tid);
+        denylist.put(tid, newEntry);
+        return true;
+    }
+
+    private TableId getTableId(final String keyspace, final String table)
+    {
+        TableMetadata tmd = Schema.instance.getTableMetadata(keyspace, table);
+        return tmd == null ? null : tmd.id;
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/ReplicationParams.java b/src/java/org/apache/cassandra/schema/ReplicationParams.java
index 048b4ed..2998aa5 100644
--- a/src/java/org/apache/cassandra/schema/ReplicationParams.java
+++ b/src/java/org/apache/cassandra/schema/ReplicationParams.java
@@ -27,6 +27,7 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CqlBuilder;
 import org.apache.cassandra.locator.*;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.StorageService;
 
 public final class ReplicationParams
@@ -70,25 +71,25 @@
         return new ReplicationParams(NetworkTopologyStrategy.class, options);
     }
 
-    public void validate(String name)
+    public void validate(String name, ClientState state)
     {
         // Attempt to instantiate the ARS, which will throw a ConfigurationException if the options aren't valid.
         TokenMetadata tmd = StorageService.instance.getTokenMetadata();
         IEndpointSnitch eps = DatabaseDescriptor.getEndpointSnitch();
-        AbstractReplicationStrategy.validateReplicationStrategy(name, klass, tmd, eps, options);
+        AbstractReplicationStrategy.validateReplicationStrategy(name, klass, tmd, eps, options, state);
     }
 
     public static ReplicationParams fromMap(Map<String, String> map) {
         return fromMapWithDefaults(map, new HashMap<>());
     }
 
-    public static ReplicationParams fromMapWithDefaults(Map<String, String> map, Map<String, String> defaults)
+    public static ReplicationParams fromMapWithDefaults(Map<String, String> map, Map<String, String> previousOptions)
     {
         Map<String, String> options = new HashMap<>(map);
         String className = options.remove(CLASS);
 
         Class<? extends AbstractReplicationStrategy> klass = AbstractReplicationStrategy.getClass(className);
-        AbstractReplicationStrategy.prepareReplicationStrategyOptions(klass, options, defaults);
+        AbstractReplicationStrategy.prepareReplicationStrategyOptions(klass, options, previousOptions);
 
         return new ReplicationParams(klass, options);
     }
diff --git a/src/java/org/apache/cassandra/schema/Schema.java b/src/java/org/apache/cassandra/schema/Schema.java
index 20687ae..0dba167 100644
--- a/src/java/org/apache/cassandra/schema/Schema.java
+++ b/src/java/org/apache/cassandra/schema/Schema.java
@@ -17,122 +17,134 @@
  */
 package org.apache.cassandra.schema;
 
-import java.net.UnknownHostException;
+import java.time.Duration;
 import java.util.*;
-import java.util.concurrent.CopyOnWriteArrayList;
-import java.util.stream.Collectors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
 
-import com.google.common.collect.ImmutableList;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.MapDifference;
-import com.google.common.collect.Sets;
+import org.apache.commons.lang3.ObjectUtils;
 
-import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.cql3.functions.*;
 import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.commitlog.CommitLog;
-import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.UserType;
 import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
-import org.apache.cassandra.gms.ApplicationState;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.LocalStrategy;
 import org.apache.cassandra.schema.KeyspaceMetadata.KeyspaceDiff;
 import org.apache.cassandra.schema.Keyspaces.KeyspacesDiff;
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
 import org.apache.cassandra.service.PendingRangeCalculatorService;
 import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.Pair;
-import org.cliffc.high_scale_lib.NonBlockingHashMap;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.Awaitable;
+import org.apache.cassandra.utils.concurrent.LoadingMap;
 
-import static java.lang.String.format;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import static com.google.common.collect.Iterables.size;
+import static java.lang.String.format;
+import static org.apache.cassandra.config.DatabaseDescriptor.isDaemonInitialized;
+import static org.apache.cassandra.config.DatabaseDescriptor.isToolInitialized;
 
-public final class Schema implements SchemaProvider
+/**
+ * Manages shared schema, keyspace instances and table metadata refs. Provides methods to initialize, modify and query
+ * both the shared and local schema, as well as to register listeners.
+ * <p>
+ * This class should be the only entity used to query and manage schema. Internal details should not be access in
+ * production code (would be great if they were not accessed in the test code as well).
+ * <p>
+ * TL;DR: All modifications are made using the implementation of {@link SchemaUpdateHandler} obtained from the provided
+ * factory. After each modification, the internally managed table metadata refs and keyspaces instances are updated and
+ * notifications are sent to the registered listeners.
+ * When the schema change is applied by the update handler (regardless it is initiated locally or received from outside),
+ * the registered callback is executed which performs the remaining updates for tables metadata refs and keyspace
+ * instances (see {@link #mergeAndUpdateVersion(SchemaTransformationResult, boolean)}).
+ */
+public class Schema implements SchemaProvider
 {
+    private static final Logger logger = LoggerFactory.getLogger(Schema.class);
+
     public static final Schema instance = new Schema();
 
-    private volatile Keyspaces keyspaces = Keyspaces.none();
+    private volatile Keyspaces distributedKeyspaces = Keyspaces.none();
+    private volatile Keyspaces distributedAndLocalKeyspaces;
 
-    // UUID -> mutable metadata ref map. We have to update these in place every time a table changes.
-    private final Map<TableId, TableMetadataRef> metadataRefs = new NonBlockingHashMap<>();
+    private final Keyspaces localKeyspaces;
 
-    // (keyspace name, index name) -> mutable metadata ref map. We have to update these in place every time an index changes.
-    private final Map<Pair<String, String>, TableMetadataRef> indexMetadataRefs = new NonBlockingHashMap<>();
+    private volatile TableMetadataRefCache tableMetadataRefCache = TableMetadataRefCache.EMPTY;
 
     // Keyspace objects, one per keyspace. Only one instance should ever exist for any given keyspace.
-    private final Map<String, Keyspace> keyspaceInstances = new NonBlockingHashMap<>();
+    // We operate on loading map because we need to achieve atomic initialization with at-most-once semantics for
+    // loadFunction. Although it seems that this is a valid case for using ConcurrentHashMap.computeIfAbsent,
+    // we should not use it because we have no knowledge about the loadFunction and in fact that load function may
+    // do some nested calls to maybeAddKeyspaceInstance, also using different threads, and in a blocking manner.
+    // This may lead to a deadlock. The documentation of ConcurrentHashMap says that manipulating other keys inside
+    // the lambda passed to the computeIfAbsent method is prohibited.
+    private final LoadingMap<String, Keyspace> keyspaceInstances = new LoadingMap<>();
 
-    private volatile UUID version;
+    private volatile UUID version = SchemaConstants.emptyVersion;
 
-    private final List<SchemaChangeListener> changeListeners = new CopyOnWriteArrayList<>();
+    private final SchemaChangeNotifier schemaChangeNotifier = new SchemaChangeNotifier();
+
+    public final SchemaUpdateHandler updateHandler;
+
+    private final boolean online;
 
     /**
      * Initialize empty schema object and load the hardcoded system tables
      */
     private Schema()
     {
-        if (DatabaseDescriptor.isDaemonInitialized() || DatabaseDescriptor.isToolInitialized())
-        {
-            load(SchemaKeyspace.metadata());
-            load(SystemKeyspace.metadata());
-        }
+        this.online = isDaemonInitialized();
+        this.localKeyspaces = (CassandraRelevantProperties.FORCE_LOAD_LOCAL_KEYSPACES.getBoolean() || isDaemonInitialized() || isToolInitialized())
+                              ? Keyspaces.of(SchemaKeyspace.metadata(), SystemKeyspace.metadata())
+                              : Keyspaces.none();
+        this.distributedAndLocalKeyspaces = this.localKeyspaces;
+
+        this.localKeyspaces.forEach(this::loadNew);
+        this.updateHandler = SchemaUpdateHandlerFactoryProvider.instance.get().getSchemaUpdateHandler(online, this::mergeAndUpdateVersion);
+    }
+
+    @VisibleForTesting
+    public Schema(boolean online, Keyspaces localKeyspaces, SchemaUpdateHandler updateHandler)
+    {
+        this.online = online;
+        this.localKeyspaces = localKeyspaces;
+        this.distributedAndLocalKeyspaces = this.localKeyspaces;
+        this.updateHandler = updateHandler;
+    }
+
+    public void startSync()
+    {
+        logger.debug("Starting update handler");
+        updateHandler.start();
+    }
+
+    public boolean waitUntilReady(Duration timeout)
+    {
+        logger.debug("Waiting for update handler to be ready...");
+        return updateHandler.waitUntilReady(timeout);
     }
 
     /**
-     * Add entries to system_schema.* for the hardcoded system keyspaces
-     * 
-     * See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes
-     */
-    public synchronized void saveSystemKeyspace()
-    {
-        SchemaKeyspace.saveSystemKeyspacesSchema();
-    }
-
-    /**
-     * See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes
-     */
-    public synchronized void truncateSchemaKeyspace()
-    {
-        SchemaKeyspace.truncate();
-    }
-
-    /**
-     * See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes
-     */
-    public synchronized Collection<Mutation> schemaKeyspaceAsMutations()
-    {
-        return SchemaKeyspace.convertSchemaToMutations();
-    }
-
-    public static KeyspaceMetadata getSystemKeyspaceMetadata()
-    {
-        return SchemaKeyspace.metadata();
-    }
-
-    /**
-     * load keyspace (keyspace) definitions, but do not initialize the keyspace instances.
-     * Schema version may be updated as the result.
+     * Load keyspaces definitions from local storage, see {@link SchemaUpdateHandler#reset(boolean)}.
      */
     public void loadFromDisk()
     {
-        loadFromDisk(true);
-    }
-
-    /**
-     * Load schema definitions from disk.
-     *
-     * @param updateVersion true if schema version needs to be updated
-     */
-    public void loadFromDisk(boolean updateVersion)
-    {
-        SchemaDiagnostics.schemataLoading(this);
-        SchemaKeyspace.fetchNonSystemKeyspaces().forEach(this::load);
-        if (updateVersion)
-            updateVersion();
-        SchemaDiagnostics.schemataLoaded(this);
+        SchemaDiagnostics.schemaLoading(this);
+        updateHandler.reset(true);
+        SchemaDiagnostics.schemaLoaded(this);
     }
 
     /**
@@ -140,31 +152,28 @@
      *
      * @param ksm The metadata about keyspace
      */
-    synchronized public void load(KeyspaceMetadata ksm)
+    private synchronized void load(KeyspaceMetadata ksm)
     {
-        KeyspaceMetadata previous = keyspaces.getNullable(ksm.name);
+        Preconditions.checkArgument(!SchemaConstants.isLocalSystemKeyspace(ksm.name));
+        KeyspaceMetadata previous = distributedKeyspaces.getNullable(ksm.name);
 
         if (previous == null)
             loadNew(ksm);
         else
             reload(previous, ksm);
 
-        keyspaces = keyspaces.withAddedOrUpdated(ksm);
+        distributedKeyspaces = distributedKeyspaces.withAddedOrUpdated(ksm);
+        distributedAndLocalKeyspaces = distributedAndLocalKeyspaces.withAddedOrUpdated(ksm);
     }
 
-    private void loadNew(KeyspaceMetadata ksm)
+    private synchronized void loadNew(KeyspaceMetadata ksm)
     {
-        ksm.tablesAndViews()
-           .forEach(metadata -> metadataRefs.put(metadata.id, new TableMetadataRef(metadata)));
-
-        ksm.tables
-           .indexTables()
-           .forEach((name, metadata) -> indexMetadataRefs.put(Pair.create(ksm.name, name), new TableMetadataRef(metadata)));
+        this.tableMetadataRefCache = tableMetadataRefCache.withNewRefs(ksm);
 
         SchemaDiagnostics.metadataInitialized(this, ksm);
     }
 
-    private void reload(KeyspaceMetadata previous, KeyspaceMetadata updated)
+    private synchronized void reload(KeyspaceMetadata previous, KeyspaceMetadata updated)
     {
         Keyspace keyspace = getKeyspaceInstance(updated.name);
         if (null != keyspace)
@@ -175,44 +184,20 @@
 
         MapDifference<String, TableMetadata> indexesDiff = previous.tables.indexesDiff(updated.tables);
 
-        // clean up after removed entries
-        tablesDiff.dropped.forEach(table -> metadataRefs.remove(table.id));
-        viewsDiff.dropped.forEach(view -> metadataRefs.remove(view.metadata.id));
-
-        indexesDiff.entriesOnlyOnLeft()
-                   .values()
-                   .forEach(indexTable -> indexMetadataRefs.remove(Pair.create(indexTable.keyspace, indexTable.indexName().get())));
-
-        // load up new entries
-        tablesDiff.created.forEach(table -> metadataRefs.put(table.id, new TableMetadataRef(table)));
-        viewsDiff.created.forEach(view -> metadataRefs.put(view.metadata.id, new TableMetadataRef(view.metadata)));
-
-        indexesDiff.entriesOnlyOnRight()
-                   .values()
-                   .forEach(indexTable -> indexMetadataRefs.put(Pair.create(indexTable.keyspace, indexTable.indexName().get()), new TableMetadataRef(indexTable)));
-
-        // refresh refs to updated ones
-        tablesDiff.altered.forEach(diff -> metadataRefs.get(diff.after.id).set(diff.after));
-        viewsDiff.altered.forEach(diff -> metadataRefs.get(diff.after.metadata.id).set(diff.after.metadata));
-
-        indexesDiff.entriesDiffering()
-                   .values()
-                   .stream()
-                   .map(MapDifference.ValueDifference::rightValue)
-                   .forEach(indexTable -> indexMetadataRefs.get(Pair.create(indexTable.keyspace, indexTable.indexName().get())).set(indexTable));
+        this.tableMetadataRefCache = tableMetadataRefCache.withUpdatedRefs(previous, updated);
 
         SchemaDiagnostics.metadataReloaded(this, previous, updated, tablesDiff, viewsDiff, indexesDiff);
     }
 
     public void registerListener(SchemaChangeListener listener)
     {
-        changeListeners.add(listener);
+        schemaChangeNotifier.registerListener(listener);
     }
 
     @SuppressWarnings("unused")
     public void unregisterListener(SchemaChangeListener listener)
     {
-        changeListeners.remove(listener);
+        schemaChangeNotifier.unregisterListener(listener);
     }
 
     /**
@@ -225,7 +210,7 @@
     @Override
     public Keyspace getKeyspaceInstance(String keyspaceName)
     {
-        return keyspaceInstances.get(keyspaceName);
+        return keyspaceInstances.getIfReady(keyspaceName);
     }
 
     public ColumnFamilyStore getColumnFamilyStoreInstance(TableId id)
@@ -239,39 +224,49 @@
             return null;
 
         return instance.hasColumnFamilyStore(metadata.id)
-             ? instance.getColumnFamilyStore(metadata.id)
-             : null;
+               ? instance.getColumnFamilyStore(metadata.id)
+               : null;
     }
 
-    /**
-     * Store given Keyspace instance to the schema
-     *
-     * @param keyspace The Keyspace instance to store
-     *
-     * @throws IllegalArgumentException if Keyspace is already stored
-     */
     @Override
-    public void storeKeyspaceInstance(Keyspace keyspace)
+    public Keyspace maybeAddKeyspaceInstance(String keyspaceName, Supplier<Keyspace> loadFunction)
     {
-        if (keyspaceInstances.putIfAbsent(keyspace.getName(), keyspace) != null)
-            throw new IllegalArgumentException(String.format("Keyspace %s was already initialized.", keyspace.getName()));
+        return keyspaceInstances.blockingLoadIfAbsent(keyspaceName, loadFunction);
+    }
+
+    private Keyspace maybeRemoveKeyspaceInstance(String keyspaceName, Consumer<Keyspace> unloadFunction)
+    {
+        try
+        {
+            return keyspaceInstances.blockingUnloadIfPresent(keyspaceName, unloadFunction);
+        }
+        catch (LoadingMap.UnloadExecutionException e)
+        {
+            throw new AssertionError("Failed to unload the keyspace " + keyspaceName, e);
+        }
+    }
+
+    public Keyspaces distributedAndLocalKeyspaces()
+    {
+        return distributedAndLocalKeyspaces;
+    }
+
+    public Keyspaces distributedKeyspaces()
+    {
+        return distributedKeyspaces;
     }
 
     /**
-     * Remove keyspace from schema
-     *
-     * @param keyspaceName The name of the keyspace to remove
-     *
-     * @return removed keyspace instance or null if it wasn't found
+     * Compute the largest gc grace seconds amongst all the tables
+     * @return the largest gcgs.
      */
-    public Keyspace removeKeyspaceInstance(String keyspaceName)
+    public int largestGcgs()
     {
-        return keyspaceInstances.remove(keyspaceName);
-    }
-
-    public Keyspaces snapshot()
-    {
-        return keyspaces;
+        return distributedAndLocalKeyspaces().stream()
+                                             .flatMap(ksm -> ksm.tables.stream())
+                                             .mapToInt(tm -> tm.params.gcGraceSeconds)
+                                             .max()
+                                             .orElse(Integer.MIN_VALUE);
     }
 
     /**
@@ -279,30 +274,25 @@
      *
      * @param ksm The keyspace definition to remove
      */
-    synchronized void unload(KeyspaceMetadata ksm)
+    private synchronized void unload(KeyspaceMetadata ksm)
     {
-        keyspaces = keyspaces.without(ksm.name);
+        distributedKeyspaces = distributedKeyspaces.without(ksm.name);
+        distributedAndLocalKeyspaces = distributedAndLocalKeyspaces.without(ksm.name);
 
-        ksm.tablesAndViews()
-           .forEach(t -> metadataRefs.remove(t.id));
-
-        ksm.tables
-           .indexTables()
-           .keySet()
-           .forEach(name -> indexMetadataRefs.remove(Pair.create(ksm.name, name)));
+        this.tableMetadataRefCache = tableMetadataRefCache.withRemovedRefs(ksm);
 
         SchemaDiagnostics.metadataRemoved(this, ksm);
     }
 
     public int getNumberOfTables()
     {
-        return keyspaces.stream().mapToInt(k -> size(k.tablesAndViews())).sum();
+        return distributedAndLocalKeyspaces().stream().mapToInt(k -> size(k.tablesAndViews())).sum();
     }
 
     public ViewMetadata getView(String keyspaceName, String viewName)
     {
         assert keyspaceName != null;
-        KeyspaceMetadata ksm = keyspaces.getNullable(keyspaceName);
+        KeyspaceMetadata ksm = distributedAndLocalKeyspaces().getNullable(keyspaceName);
         return (ksm == null) ? null : ksm.views.getNullable(viewName);
     }
 
@@ -317,65 +307,64 @@
     public KeyspaceMetadata getKeyspaceMetadata(String keyspaceName)
     {
         assert keyspaceName != null;
-        KeyspaceMetadata keyspace = keyspaces.getNullable(keyspaceName);
+        KeyspaceMetadata keyspace = distributedAndLocalKeyspaces().getNullable(keyspaceName);
         return null != keyspace ? keyspace : VirtualKeyspaceRegistry.instance.getKeyspaceMetadataNullable(keyspaceName);
     }
 
-    private Set<String> getNonSystemKeyspacesSet()
+    /**
+     * Returns all non-local keyspaces, that is, all but {@link SchemaConstants#LOCAL_SYSTEM_KEYSPACE_NAMES}
+     * or virtual keyspaces.
+     * @deprecated use {@link #distributedKeyspaces()}
+     */
+    @Deprecated
+    public Keyspaces getNonSystemKeyspaces()
     {
-        return Sets.difference(keyspaces.names(), SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES);
+        return distributedKeyspaces;
     }
 
     /**
-     * @return collection of the non-system keyspaces (note that this count as system only the
-     * non replicated keyspaces, so keyspace like system_traces which are replicated are actually
-     * returned. See getUserKeyspace() below if you don't want those)
+     * Returns all non-local keyspaces whose replication strategy is not {@link LocalStrategy}.
      */
-    public ImmutableList<String> getNonSystemKeyspaces()
+    public Keyspaces getNonLocalStrategyKeyspaces()
     {
-        return ImmutableList.copyOf(getNonSystemKeyspacesSet());
+        return distributedKeyspaces.filter(keyspace -> keyspace.params.replication.klass != LocalStrategy.class);
     }
 
     /**
-     * @return a collection of keyspaces that do not use LocalStrategy for replication
+     * Returns user keyspaces, that is all but {@link SchemaConstants#LOCAL_SYSTEM_KEYSPACE_NAMES},
+     * {@link SchemaConstants#REPLICATED_SYSTEM_KEYSPACE_NAMES} or virtual keyspaces.
      */
-    public List<String> getNonLocalStrategyKeyspaces()
+    public Keyspaces getUserKeyspaces()
     {
-        return keyspaces.stream()
-                        .filter(keyspace -> keyspace.params.replication.klass != LocalStrategy.class)
-                        .map(keyspace -> keyspace.name)
-                        .collect(Collectors.toList());
-    }
-
-    /**
-     * @return collection of the user defined keyspaces
-     */
-    public List<String> getUserKeyspaces()
-    {
-        return ImmutableList.copyOf(Sets.difference(getNonSystemKeyspacesSet(), SchemaConstants.REPLICATED_SYSTEM_KEYSPACE_NAMES));
+        return distributedKeyspaces.without(SchemaConstants.REPLICATED_SYSTEM_KEYSPACE_NAMES);
     }
 
     /**
      * Get metadata about keyspace inner ColumnFamilies
      *
      * @param keyspaceName The name of the keyspace
-     *
      * @return metadata about ColumnFamilies the belong to the given keyspace
      */
     public Iterable<TableMetadata> getTablesAndViews(String keyspaceName)
     {
-        assert keyspaceName != null;
-        KeyspaceMetadata ksm = keyspaces.getNullable(keyspaceName);
-        assert ksm != null;
+        Preconditions.checkNotNull(keyspaceName);
+        KeyspaceMetadata ksm = ObjectUtils.getFirstNonNull(() -> distributedKeyspaces.getNullable(keyspaceName),
+                                                           () -> localKeyspaces.getNullable(keyspaceName));
+        Preconditions.checkNotNull(ksm, "Keyspace %s not found", keyspaceName);
         return ksm.tablesAndViews();
     }
 
     /**
      * @return collection of the all keyspace names registered in the system (system and non-system)
      */
-    public Set<String> getKeyspaces()
+    public ImmutableSet<String> getKeyspaces()
     {
-        return keyspaces.names();
+        return distributedAndLocalKeyspaces().names();
+    }
+
+    public Keyspaces getLocalKeyspaces()
+    {
+        return localKeyspaces;
     }
 
     /* TableMetadata/Ref query/control methods */
@@ -390,33 +379,24 @@
     @Override
     public TableMetadataRef getTableMetadataRef(String keyspace, String table)
     {
-        TableMetadata tm = getTableMetadata(keyspace, table);
-        return tm == null
-             ? null
-             : metadataRefs.get(tm.id);
+        return tableMetadataRefCache.getTableMetadataRef(keyspace, table);
     }
 
     public TableMetadataRef getIndexTableMetadataRef(String keyspace, String index)
     {
-        return indexMetadataRefs.get(Pair.create(keyspace, index));
-    }
-
-    Map<Pair<String, String>, TableMetadataRef> getIndexTableMetadataRefs()
-    {
-        return indexMetadataRefs;
+        return tableMetadataRefCache.getIndexTableMetadataRef(keyspace, index);
     }
 
     /**
      * Get Table metadata by its identifier
      *
      * @param id table or view identifier
-     *
      * @return metadata about Table or View
      */
     @Override
     public TableMetadataRef getTableMetadataRef(TableId id)
     {
-        return metadataRefs.get(id);
+        return tableMetadataRefCache.getTableMetadataRef(id);
     }
 
     @Override
@@ -425,19 +405,13 @@
         return getTableMetadataRef(descriptor.ksname, descriptor.cfname);
     }
 
-    Map<TableId, TableMetadataRef> getTableMetadataRefs()
-    {
-        return metadataRefs;
-    }
-
     /**
      * Given a keyspace name and table name, get the table
      * meta data. If the keyspace name or table name is not valid
      * this function returns null.
      *
      * @param keyspace The keyspace name
-     * @param table The table name
-     *
+     * @param table    The table name
      * @return TableMetadata object or null if it wasn't found
      */
     public TableMetadata getTableMetadata(String keyspace, String table)
@@ -447,15 +421,16 @@
 
         KeyspaceMetadata ksm = getKeyspaceMetadata(keyspace);
         return ksm == null
-             ? null
-             : ksm.getTableOrViewNullable(table);
+               ? null
+               : ksm.getTableOrViewNullable(table);
     }
 
     @Override
     public TableMetadata getTableMetadata(TableId id)
     {
-        TableMetadata table = keyspaces.getTableOrViewNullable(id);
-        return null != table ? table : VirtualKeyspaceRegistry.instance.getTableMetadataNullable(id);
+        return ObjectUtils.getFirstNonNull(() -> distributedKeyspaces.getTableOrViewNullable(id),
+                                           () -> localKeyspaces.getTableOrViewNullable(id),
+                                           () -> VirtualKeyspaceRegistry.instance.getTableMetadataNullable(id));
     }
 
     public TableMetadata validateTable(String keyspaceName, String tableName)
@@ -495,14 +470,14 @@
 
         KeyspaceMetadata ksm = getKeyspaceMetadata(name.keyspace);
         return ksm == null
-             ? Collections.emptyList()
-             : ksm.functions.get(name);
+               ? Collections.emptyList()
+               : ksm.functions.get(name);
     }
 
     /**
      * Find the function with the specified name
      *
-     * @param name fully qualified function name
+     * @param name     fully qualified function name
      * @param argTypes function argument types
      * @return an empty {@link Optional} if the keyspace or the function name are not found;
      *         a non-empty optional of {@link Function} otherwise
@@ -514,8 +489,8 @@
 
         KeyspaceMetadata ksm = getKeyspaceMetadata(name.keyspace);
         return ksm == null
-             ? Optional.empty()
-             : ksm.functions.find(name, argTypes);
+               ? Optional.empty()
+               : ksm.functions.find(name, argTypes);
     }
 
     /* Version control */
@@ -547,198 +522,158 @@
     /**
      * Read schema from system keyspace and calculate MD5 digest of every row, resulting digest
      * will be converted into UUID which would act as content-based version of the schema.
-     * 
+     *
      * See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes
      */
-    public synchronized void updateVersion()
+    private synchronized void updateVersion(UUID version)
     {
-        version = SchemaKeyspace.calculateSchemaDigest();
-        SystemKeyspace.updateSchemaVersion(version);
+        this.version = version;
         SchemaDiagnostics.versionUpdated(this);
     }
 
-    /*
-     * Like updateVersion, but also announces via gossip
-     */
-    public void updateVersionAndAnnounce()
-    {
-        updateVersion();
-        passiveAnnounceVersion();
-    }
-
     /**
-     * Announce my version passively over gossip.
-     * Used to notify nodes as they arrive in the cluster.
+     * When we receive {@link SchemaTransformationResult} in a callback invocation, the transformation result includes
+     * pre-transformation and post-transformation schema metadata and versions, and a diff between them. Basically
+     * we expect that the local image of the schema metadata ({@link #distributedKeyspaces}) and version ({@link #version})
+     * are the same as pre-transformation. However, it might not always be true because some changes might not be
+     * applied completely due to some errors. This methods is to emit warning in such case and recalculate diff so that
+     * it contains the changes between the local schema image ({@link #distributedKeyspaces} and the post-transformation
+     * schema. That recalculation allows the following updates in the callback to recover the schema.
+     *
+     * @param result the incoming transformation result
+     * @return recalculated transformation result if needed, otherwise the provided incoming result
      */
-    private void passiveAnnounceVersion()
+    private synchronized SchemaTransformationResult localDiff(SchemaTransformationResult result)
     {
-        Gossiper.instance.addLocalApplicationState(ApplicationState.SCHEMA, StorageService.instance.valueFactory.schema(version));
-        SchemaDiagnostics.versionAnnounced(this);
-    }
+        Keyspaces localBefore = distributedKeyspaces;
+        UUID localVersion = version;
+        boolean needNewDiff = false;
 
-    /**
-     * Clear all KS/CF metadata and reset version.
-     */
-    public synchronized void clear()
-    {
-        getNonSystemKeyspaces().forEach(k -> unload(getKeyspaceMetadata(k)));
-        updateVersionAndAnnounce();
-        SchemaDiagnostics.schemataCleared(this);
+        if (!Objects.equals(localBefore, result.before.getKeyspaces()))
+        {
+            logger.info("Schema was different to what we expected: {}", Keyspaces.diff(result.before.getKeyspaces(), localBefore));
+            needNewDiff = true;
+        }
+
+        if (!Objects.equals(localVersion, result.before.getVersion()))
+        {
+            logger.info("Schema version was different to what we expected: {} != {}", result.before.getVersion(), localVersion);
+            needNewDiff = true;
+        }
+
+        if (needNewDiff)
+            return new SchemaTransformationResult(new DistributedSchema(localBefore, localVersion),
+                                                  result.after,
+                                                  Keyspaces.diff(localBefore, result.after.getKeyspaces()));
+
+        return result;
     }
 
     /*
      * Reload schema from local disk. Useful if a user made changes to schema tables by hand, or has suspicion that
      * in-memory representation got out of sync somehow with what's on disk.
      */
-    public synchronized void reloadSchemaAndAnnounceVersion()
+    public void reloadSchemaAndAnnounceVersion()
     {
-        Keyspaces before = keyspaces.filter(k -> !SchemaConstants.isLocalSystemKeyspace(k.name));
-        Keyspaces after = SchemaKeyspace.fetchNonSystemKeyspaces();
-        merge(Keyspaces.diff(before, after));
-        updateVersionAndAnnounce();
+        updateHandler.reset(true);
     }
 
     /**
      * Merge remote schema in form of mutations with local and mutate ks/cf metadata objects
      * (which also involves fs operations on add/drop ks/cf)
      *
-     * @param mutations the schema changes to apply
-     *
      * @throws ConfigurationException If one of metadata attributes has invalid value
      */
-    public synchronized void mergeAndAnnounceVersion(Collection<Mutation> mutations)
+    @VisibleForTesting
+    public synchronized void mergeAndUpdateVersion(SchemaTransformationResult result, boolean dropData)
     {
-        merge(mutations);
-        updateVersionAndAnnounce();
+        result = localDiff(result);
+        schemaChangeNotifier.notifyPreChanges(result);
+        merge(result.diff, dropData);
+        updateVersion(result.after.getVersion());
+        if (online)
+            SystemKeyspace.updateSchemaVersion(result.after.getVersion());
+    }
+
+    public SchemaTransformationResult transform(SchemaTransformation transformation)
+    {
+        return transform(transformation, false);
+    }
+
+    public SchemaTransformationResult transform(SchemaTransformation transformation, boolean local)
+    {
+        return updateHandler.apply(transformation, local);
     }
 
     /**
-     * See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes
+     * Clear all locally stored schema information and fetch schema from another node.
+     * Called by user (via JMX) who wants to get rid of schema disagreement.
      */
-    public synchronized TransformationResult transform(SchemaTransformation transformation, boolean locally, long now) throws UnknownHostException
+    public void resetLocalSchema()
     {
-        KeyspacesDiff diff;
+        logger.debug("Clearing local schema...");
+
+        if (Gossiper.instance.getLiveMembers().stream().allMatch(ep -> FBUtilities.getBroadcastAddressAndPort().equals(ep)))
+            throw new InvalidRequestException("Cannot reset local schema when there are no other live nodes");
+
+        Awaitable clearCompletion = updateHandler.clear();
         try
         {
-            Keyspaces before = keyspaces;
-            Keyspaces after = transformation.apply(before);
-            diff = Keyspaces.diff(before, after);
+            if (!clearCompletion.await(StorageService.SCHEMA_DELAY_MILLIS, TimeUnit.MILLISECONDS))
+            {
+                throw new RuntimeException("Schema reset failed - no schema received from other nodes");
+            }
         }
-        catch (RuntimeException e)
+        catch (InterruptedException e)
         {
-            return new TransformationResult(e);
+            Thread.currentThread().interrupt();
+            throw new RuntimeException("Failed to reset schema - the thread has been interrupted");
         }
-
-        if (diff.isEmpty())
-            return new TransformationResult(diff, Collections.emptyList());
-
-        Collection<Mutation> mutations = SchemaKeyspace.convertSchemaDiffToMutations(diff, now);
-        SchemaKeyspace.applyChanges(mutations);
-
-        merge(diff);
-        updateVersion();
-        if (!locally)
-            passiveAnnounceVersion();
-
-        return new TransformationResult(diff, mutations);
+        SchemaDiagnostics.schemaCleared(this);
+        logger.info("Local schema reset completed");
     }
 
-    public static final class TransformationResult
+    private void merge(KeyspacesDiff diff, boolean removeData)
     {
-        public final boolean success;
-        public final RuntimeException exception;
-        public final KeyspacesDiff diff;
-        public final Collection<Mutation> mutations;
-
-        private TransformationResult(boolean success, RuntimeException exception, KeyspacesDiff diff, Collection<Mutation> mutations)
-        {
-            this.success = success;
-            this.exception = exception;
-            this.diff = diff;
-            this.mutations = mutations;
-        }
-
-        TransformationResult(RuntimeException exception)
-        {
-            this(false, exception, null, null);
-        }
-
-        TransformationResult(KeyspacesDiff diff, Collection<Mutation> mutations)
-        {
-            this(true, null, diff, mutations);
-        }
-    }
-
-    /**
-     * See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes
-     */
-    synchronized void merge(Collection<Mutation> mutations)
-    {
-        // only compare the keyspaces affected by this set of schema mutations
-        Set<String> affectedKeyspaces = SchemaKeyspace.affectedKeyspaces(mutations);
-
-        // fetch the current state of schema for the affected keyspaces only
-        Keyspaces before = keyspaces.filter(k -> affectedKeyspaces.contains(k.name));
-
-        // apply the schema mutations
-        SchemaKeyspace.applyChanges(mutations);
-
-        // apply the schema mutations and fetch the new versions of the altered keyspaces
-        Keyspaces after = SchemaKeyspace.fetchKeyspaces(affectedKeyspaces);
-
-        merge(Keyspaces.diff(before, after));
-    }
-
-    private void merge(KeyspacesDiff diff)
-    {
-        diff.dropped.forEach(this::dropKeyspace);
+        diff.dropped.forEach(keyspace -> dropKeyspace(keyspace, removeData));
         diff.created.forEach(this::createKeyspace);
-        diff.altered.forEach(this::alterKeyspace);
+        diff.altered.forEach(delta -> alterKeyspace(delta, removeData));
     }
 
-    private void alterKeyspace(KeyspaceDiff delta)
+    private void alterKeyspace(KeyspaceDiff delta, boolean dropData)
     {
         SchemaDiagnostics.keyspaceAltering(this, delta);
 
-        // drop tables and views
-        delta.views.dropped.forEach(this::dropView);
-        delta.tables.dropped.forEach(this::dropTable);
+        boolean initialized = Keyspace.isInitialized();
+
+        Keyspace keyspace = initialized ? getKeyspaceInstance(delta.before.name) : null;
+        if (initialized)
+        {
+            assert keyspace != null;
+            assert delta.before.name.equals(delta.after.name);
+
+            // drop tables and views
+            delta.views.dropped.forEach(v -> dropView(keyspace, v, dropData));
+            delta.tables.dropped.forEach(t -> dropTable(keyspace, t, dropData));
+        }
 
         load(delta.after);
 
-        // add tables and views
-        delta.tables.created.forEach(this::createTable);
-        delta.views.created.forEach(this::createView);
+        if (initialized)
+        {
+            // add tables and views
+            delta.tables.created.forEach(t -> createTable(keyspace, t));
+            delta.views.created.forEach(v -> createView(keyspace, v));
 
-        // update tables and views
-        delta.tables.altered.forEach(diff -> alterTable(diff.after));
-        delta.views.altered.forEach(diff -> alterView(diff.after));
+            // update tables and views
+            delta.tables.altered.forEach(diff -> alterTable(keyspace, diff.after));
+            delta.views.altered.forEach(diff -> alterView(keyspace, diff.after));
 
-        // deal with all added, and altered views
-        Keyspace.open(delta.after.name).viewManager.reload(true);
+            // deal with all added, and altered views
+            Keyspace.open(delta.after.name, this, true).viewManager.reload(true);
+        }
 
-        // notify on everything dropped
-        delta.udas.dropped.forEach(uda -> notifyDropAggregate((UDAggregate) uda));
-        delta.udfs.dropped.forEach(udf -> notifyDropFunction((UDFunction) udf));
-        delta.views.dropped.forEach(this::notifyDropView);
-        delta.tables.dropped.forEach(this::notifyDropTable);
-        delta.types.dropped.forEach(this::notifyDropType);
-
-        // notify on everything created
-        delta.types.created.forEach(this::notifyCreateType);
-        delta.tables.created.forEach(this::notifyCreateTable);
-        delta.views.created.forEach(this::notifyCreateView);
-        delta.udfs.created.forEach(udf -> notifyCreateFunction((UDFunction) udf));
-        delta.udas.created.forEach(uda -> notifyCreateAggregate((UDAggregate) uda));
-
-        // notify on everything altered
-        if (!delta.before.params.equals(delta.after.params))
-            notifyAlterKeyspace(delta.before, delta.after);
-        delta.types.altered.forEach(diff -> notifyAlterType(diff.before, diff.after));
-        delta.tables.altered.forEach(diff -> notifyAlterTable(diff.before, diff.after));
-        delta.views.altered.forEach(diff -> notifyAlterView(diff.before, diff.after));
-        delta.udfs.altered.forEach(diff -> notifyAlterFunction(diff.before, diff.after));
-        delta.udas.altered.forEach(diff -> notifyAlterAggregate(diff.before, diff.after));
+        schemaChangeNotifier.notifyKeyspaceAltered(delta, dropData);
         SchemaDiagnostics.keyspaceAltered(this, delta);
     }
 
@@ -746,192 +681,100 @@
     {
         SchemaDiagnostics.keyspaceCreating(this, keyspace);
         load(keyspace);
-        Keyspace.open(keyspace.name);
+        if (Keyspace.isInitialized())
+        {
+            Keyspace.open(keyspace.name, this, true);
+        }
 
-        notifyCreateKeyspace(keyspace);
-        keyspace.types.forEach(this::notifyCreateType);
-        keyspace.tables.forEach(this::notifyCreateTable);
-        keyspace.views.forEach(this::notifyCreateView);
-        keyspace.functions.udfs().forEach(this::notifyCreateFunction);
-        keyspace.functions.udas().forEach(this::notifyCreateAggregate);
+        schemaChangeNotifier.notifyKeyspaceCreated(keyspace);
         SchemaDiagnostics.keyspaceCreated(this, keyspace);
 
         // If keyspace has been added, we need to recalculate pending ranges to make sure
         // we send mutations to the correct set of bootstrapping nodes. Refer CASSANDRA-15433.
-        if (keyspace.params.replication.klass != LocalStrategy.class)
+        if (keyspace.params.replication.klass != LocalStrategy.class && Keyspace.isInitialized())
         {
-            PendingRangeCalculatorService.calculatePendingRanges(Keyspace.open(keyspace.name).getReplicationStrategy(), keyspace.name);
+            PendingRangeCalculatorService.calculatePendingRanges(Keyspace.open(keyspace.name, this, true).getReplicationStrategy(), keyspace.name);
         }
     }
 
-    private void dropKeyspace(KeyspaceMetadata keyspace)
+    private void dropKeyspace(KeyspaceMetadata keyspaceMetadata, boolean dropData)
     {
-        SchemaDiagnostics.keyspaceDroping(this, keyspace);
-        keyspace.views.forEach(this::dropView);
-        keyspace.tables.forEach(this::dropTable);
+        SchemaDiagnostics.keyspaceDropping(this, keyspaceMetadata);
 
-        // remove the keyspace from the static instances.
-        Keyspace.clear(keyspace.name);
-        unload(keyspace);
-        Keyspace.writeOrder.awaitNewBarrier();
+        boolean initialized = Keyspace.isInitialized();
+        Keyspace keyspace = initialized ? Keyspace.open(keyspaceMetadata.name, this, false) : null;
+        if (initialized)
+        {
+            if (keyspace == null)
+                return;
 
-        keyspace.functions.udas().forEach(this::notifyDropAggregate);
-        keyspace.functions.udfs().forEach(this::notifyDropFunction);
-        keyspace.views.forEach(this::notifyDropView);
-        keyspace.tables.forEach(this::notifyDropTable);
-        keyspace.types.forEach(this::notifyDropType);
-        notifyDropKeyspace(keyspace);
-        SchemaDiagnostics.keyspaceDroped(this, keyspace);
+            keyspaceMetadata.views.forEach(v -> dropView(keyspace, v, dropData));
+            keyspaceMetadata.tables.forEach(t -> dropTable(keyspace, t, dropData));
+
+            // remove the keyspace from the static instances
+            Keyspace unloadedKeyspace = maybeRemoveKeyspaceInstance(keyspaceMetadata.name, ks -> {
+                ks.unload(dropData);
+                unload(keyspaceMetadata);
+            });
+            assert unloadedKeyspace == keyspace;
+
+            Keyspace.writeOrder.awaitNewBarrier();
+        }
+        else
+        {
+            unload(keyspaceMetadata);
+        }
+
+        schemaChangeNotifier.notifyKeyspaceDropped(keyspaceMetadata, dropData);
+        SchemaDiagnostics.keyspaceDropped(this, keyspaceMetadata);
     }
 
-    private void dropView(ViewMetadata metadata)
+    private void dropView(Keyspace keyspace, ViewMetadata metadata, boolean dropData)
     {
-        Keyspace.open(metadata.keyspace()).viewManager.dropView(metadata.name());
-        dropTable(metadata.metadata);
+        keyspace.viewManager.dropView(metadata.name());
+        dropTable(keyspace, metadata.metadata, dropData);
     }
 
-    private void dropTable(TableMetadata metadata)
+    private void dropTable(Keyspace keyspace, TableMetadata metadata, boolean dropData)
     {
         SchemaDiagnostics.tableDropping(this, metadata);
-        ColumnFamilyStore cfs = Keyspace.open(metadata.keyspace).getColumnFamilyStore(metadata.name);
-        assert cfs != null;
-        // make sure all the indexes are dropped, or else.
-        cfs.indexManager.markAllIndexesRemoved();
-        CompactionManager.instance.interruptCompactionFor(Collections.singleton(metadata), (sstable) -> true, true);
-        if (DatabaseDescriptor.isAutoSnapshot())
-            cfs.snapshot(Keyspace.getTimestampedSnapshotNameWithPrefix(cfs.name, ColumnFamilyStore.SNAPSHOT_DROP_PREFIX));
-        CommitLog.instance.forceRecycleAllSegments(Collections.singleton(metadata.id));
-        Keyspace.open(metadata.keyspace).dropCf(metadata.id);
+        keyspace.dropCf(metadata.id, dropData);
         SchemaDiagnostics.tableDropped(this, metadata);
     }
 
-    private void createTable(TableMetadata table)
+    private void createTable(Keyspace keyspace, TableMetadata table)
     {
         SchemaDiagnostics.tableCreating(this, table);
-        Keyspace.open(table.keyspace).initCf(metadataRefs.get(table.id), true);
+        keyspace.initCf(tableMetadataRefCache.getTableMetadataRef(table.id), true);
         SchemaDiagnostics.tableCreated(this, table);
     }
 
-    private void createView(ViewMetadata view)
+    private void createView(Keyspace keyspace, ViewMetadata view)
     {
-        Keyspace.open(view.keyspace()).initCf(metadataRefs.get(view.metadata.id), true);
+        SchemaDiagnostics.tableCreating(this, view.metadata);
+        keyspace.initCf(tableMetadataRefCache.getTableMetadataRef(view.metadata.id), true);
+        SchemaDiagnostics.tableCreated(this, view.metadata);
     }
 
-    private void alterTable(TableMetadata updated)
+    private void alterTable(Keyspace keyspace, TableMetadata updated)
     {
         SchemaDiagnostics.tableAltering(this, updated);
-        Keyspace.open(updated.keyspace).getColumnFamilyStore(updated.name).reload();
+        keyspace.getColumnFamilyStore(updated.name).reload();
         SchemaDiagnostics.tableAltered(this, updated);
     }
 
-    private void alterView(ViewMetadata updated)
+    private void alterView(Keyspace keyspace, ViewMetadata updated)
     {
-        Keyspace.open(updated.keyspace()).getColumnFamilyStore(updated.name()).reload();
+        SchemaDiagnostics.tableAltering(this, updated.metadata);
+        keyspace.getColumnFamilyStore(updated.name()).reload();
+        SchemaDiagnostics.tableAltered(this, updated.metadata);
     }
 
-    private void notifyCreateKeyspace(KeyspaceMetadata ksm)
+    public Map<UUID, Set<InetAddressAndPort>> getOutstandingSchemaVersions()
     {
-        changeListeners.forEach(l -> l.onCreateKeyspace(ksm.name));
+        return updateHandler instanceof DefaultSchemaUpdateHandler
+               ? ((DefaultSchemaUpdateHandler) updateHandler).getOutstandingSchemaVersions()
+               : Collections.emptyMap();
     }
 
-    private void notifyCreateTable(TableMetadata metadata)
-    {
-        changeListeners.forEach(l -> l.onCreateTable(metadata.keyspace, metadata.name));
-    }
-
-    private void notifyCreateView(ViewMetadata view)
-    {
-        changeListeners.forEach(l -> l.onCreateView(view.keyspace(), view.name()));
-    }
-
-    private void notifyCreateType(UserType ut)
-    {
-        changeListeners.forEach(l -> l.onCreateType(ut.keyspace, ut.getNameAsString()));
-    }
-
-    private void notifyCreateFunction(UDFunction udf)
-    {
-        changeListeners.forEach(l -> l.onCreateFunction(udf.name().keyspace, udf.name().name, udf.argTypes()));
-    }
-
-    private void notifyCreateAggregate(UDAggregate udf)
-    {
-        changeListeners.forEach(l -> l.onCreateAggregate(udf.name().keyspace, udf.name().name, udf.argTypes()));
-    }
-
-    private void notifyAlterKeyspace(KeyspaceMetadata before, KeyspaceMetadata after)
-    {
-        changeListeners.forEach(l -> l.onAlterKeyspace(after.name));
-    }
-
-    private void notifyAlterTable(TableMetadata before, TableMetadata after)
-    {
-        boolean changeAffectedPreparedStatements = before.changeAffectsPreparedStatements(after);
-        changeListeners.forEach(l -> l.onAlterTable(after.keyspace, after.name, changeAffectedPreparedStatements));
-    }
-
-    private void notifyAlterView(ViewMetadata before, ViewMetadata after)
-    {
-        boolean changeAffectedPreparedStatements = before.metadata.changeAffectsPreparedStatements(after.metadata);
-        changeListeners.forEach(l ->l.onAlterView(after.keyspace(), after.name(), changeAffectedPreparedStatements));
-    }
-
-    private void notifyAlterType(UserType before, UserType after)
-    {
-        changeListeners.forEach(l -> l.onAlterType(after.keyspace, after.getNameAsString()));
-    }
-
-    private void notifyAlterFunction(UDFunction before, UDFunction after)
-    {
-        changeListeners.forEach(l -> l.onAlterFunction(after.name().keyspace, after.name().name, after.argTypes()));
-    }
-
-    private void notifyAlterAggregate(UDAggregate before, UDAggregate after)
-    {
-        changeListeners.forEach(l -> l.onAlterAggregate(after.name().keyspace, after.name().name, after.argTypes()));
-    }
-
-    private void notifyDropKeyspace(KeyspaceMetadata ksm)
-    {
-        changeListeners.forEach(l -> l.onDropKeyspace(ksm.name));
-    }
-
-    private void notifyDropTable(TableMetadata metadata)
-    {
-        changeListeners.forEach(l -> l.onDropTable(metadata.keyspace, metadata.name));
-    }
-
-    private void notifyDropView(ViewMetadata view)
-    {
-        changeListeners.forEach(l -> l.onDropView(view.keyspace(), view.name()));
-    }
-
-    private void notifyDropType(UserType ut)
-    {
-        changeListeners.forEach(l -> l.onDropType(ut.keyspace, ut.getNameAsString()));
-    }
-
-    private void notifyDropFunction(UDFunction udf)
-    {
-        changeListeners.forEach(l -> l.onDropFunction(udf.name().keyspace, udf.name().name, udf.argTypes()));
-    }
-
-    private void notifyDropAggregate(UDAggregate udf)
-    {
-        changeListeners.forEach(l -> l.onDropAggregate(udf.name().keyspace, udf.name().name, udf.argTypes()));
-    }
-
-
-    /**
-     * Converts the given schema version to a string. Returns {@code unknown}, if {@code version} is {@code null}
-     * or {@code "(empty)"}, if {@code version} refers to an {@link SchemaConstants#emptyVersion empty) schema.
-     */
-    public static String schemaVersionToString(UUID version)
-    {
-        return version == null
-               ? "unknown"
-               : SchemaConstants.emptyVersion.equals(version)
-                 ? "(empty)"
-                 : version.toString();
-    }
 }
diff --git a/src/java/org/apache/cassandra/schema/SchemaAnnouncementEvent.java b/src/java/org/apache/cassandra/schema/SchemaAnnouncementEvent.java
index 4e0bd68..ea6b9b6 100644
--- a/src/java/org/apache/cassandra/schema/SchemaAnnouncementEvent.java
+++ b/src/java/org/apache/cassandra/schema/SchemaAnnouncementEvent.java
@@ -78,12 +78,12 @@
         HashMap<String, Serializable> ret = new HashMap<>();
         if (schemaDestinationEndpoints != null)
         {
-            Set<String> eps = schemaDestinationEndpoints.stream().map(InetAddressAndPort::toString).collect(Collectors.toSet());
+            Set<String> eps = schemaDestinationEndpoints.stream().map(Object::toString).collect(Collectors.toSet());
             ret.put("endpointDestinations", new HashSet<>(eps));
         }
         if (schemaEndpointsIgnored != null)
         {
-            Set<String> eps = schemaEndpointsIgnored.stream().map(InetAddressAndPort::toString).collect(Collectors.toSet());
+            Set<String> eps = schemaEndpointsIgnored.stream().map(Object::toString).collect(Collectors.toSet());
             ret.put("endpointIgnored", new HashSet<>(eps));
         }
         if (statement != null)
diff --git a/src/java/org/apache/cassandra/schema/SchemaChangeListener.java b/src/java/org/apache/cassandra/schema/SchemaChangeListener.java
index 4390309..55fa25f 100644
--- a/src/java/org/apache/cassandra/schema/SchemaChangeListener.java
+++ b/src/java/org/apache/cassandra/schema/SchemaChangeListener.java
@@ -17,86 +17,94 @@
  */
 package org.apache.cassandra.schema;
 
-import java.util.List;
+import org.apache.cassandra.cql3.functions.UDAggregate;
+import org.apache.cassandra.cql3.functions.UDFunction;
+import org.apache.cassandra.db.marshal.UserType;
 
-import org.apache.cassandra.db.marshal.AbstractType;
-
-public abstract class SchemaChangeListener
+public interface SchemaChangeListener
 {
-    public void onCreateKeyspace(String keyspace)
+    default void onCreateKeyspace(KeyspaceMetadata keyspace)
     {
     }
 
-    public void onCreateTable(String keyspace, String table)
+    default void onCreateTable(TableMetadata table)
     {
     }
 
-    public void onCreateView(String keyspace, String view)
+    default void onCreateView(ViewMetadata view)
     {
-        onCreateTable(keyspace, view);
+        onCreateTable(view.metadata);
     }
 
-    public void onCreateType(String keyspace, String type)
+    default void onCreateType(UserType type)
     {
     }
 
-    public void onCreateFunction(String keyspace, String function, List<AbstractType<?>> argumentTypes)
+    default void onCreateFunction(UDFunction function)
     {
     }
 
-    public void onCreateAggregate(String keyspace, String aggregate, List<AbstractType<?>> argumentTypes)
+    default void onCreateAggregate(UDAggregate aggregate)
     {
     }
 
-    public void onAlterKeyspace(String keyspace)
+    default void onAlterKeyspace(KeyspaceMetadata before, KeyspaceMetadata after)
+    {
+    }
+
+    default void onPreAlterTable(TableMetadata before, TableMetadata after)
     {
     }
 
     // the boolean flag indicates whether the change that triggered this event may have a substantive
     // impact on statements using the column family.
-    public void onAlterTable(String keyspace, String table, boolean affectsStatements)
+    default void onAlterTable(TableMetadata before, TableMetadata after, boolean affectStatements)
     {
     }
 
-    public void onAlterView(String keyspace, String view, boolean affectsStataments)
-    {
-        onAlterTable(keyspace, view, affectsStataments);
-    }
-
-    public void onAlterType(String keyspace, String type)
+    default void onPreAlterView(ViewMetadata before, ViewMetadata after)
     {
     }
 
-    public void onAlterFunction(String keyspace, String function, List<AbstractType<?>> argumentTypes)
+    default void onAlterView(ViewMetadata before, ViewMetadata after, boolean affectStatements)
+    {
+        onAlterTable(before.metadata, after.metadata, affectStatements);
+    }
+
+    default void onAlterType(UserType before, UserType after)
     {
     }
 
-    public void onAlterAggregate(String keyspace, String aggregate, List<AbstractType<?>> argumentTypes)
+    default void onAlterFunction(UDFunction before, UDFunction after)
     {
     }
 
-    public void onDropKeyspace(String keyspace)
+    default void onAlterAggregate(UDAggregate before, UDAggregate after)
     {
     }
 
-    public void onDropTable(String keyspace, String table)
+    default void onDropKeyspace(KeyspaceMetadata keyspace, boolean dropData)
     {
     }
 
-    public void onDropView(String keyspace, String view)
-    {
-        onDropTable(keyspace, view);
-    }
-
-    public void onDropType(String keyspace, String type)
+    default void onDropTable(TableMetadata table, boolean dropData)
     {
     }
 
-    public void onDropFunction(String keyspace, String function, List<AbstractType<?>> argumentTypes)
+    default void onDropView(ViewMetadata view, boolean dropData)
+    {
+        onDropTable(view.metadata, dropData);
+    }
+
+    default void onDropType(UserType type)
     {
     }
 
-    public void onDropAggregate(String keyspace, String aggregate, List<AbstractType<?>> argumentTypes)
+    default void onDropFunction(UDFunction function)
+    {
+    }
+
+    default void onDropAggregate(UDAggregate aggregate)
     {
     }
 }
diff --git a/src/java/org/apache/cassandra/schema/SchemaChangeNotifier.java b/src/java/org/apache/cassandra/schema/SchemaChangeNotifier.java
new file mode 100644
index 0000000..c4537e1
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/SchemaChangeNotifier.java
@@ -0,0 +1,207 @@
+/*
+ * 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.schema;
+
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.cassandra.cql3.functions.UDAggregate;
+import org.apache.cassandra.cql3.functions.UDFunction;
+import org.apache.cassandra.db.marshal.UserType;
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
+
+/**
+ * Registers schema change listeners and sends the notifications. The interface of this class just takes the high level
+ * keyspace metadata changes. It iterates over all keyspaces elements and distributes appropriate notifications about
+ * changes around those elements (tables, views, types, functions).
+ */
+public class SchemaChangeNotifier
+{
+    private final List<SchemaChangeListener> changeListeners = new CopyOnWriteArrayList<>();
+
+    public void registerListener(SchemaChangeListener listener)
+    {
+        changeListeners.add(listener);
+    }
+
+    @SuppressWarnings("unused")
+    public void unregisterListener(SchemaChangeListener listener)
+    {
+        changeListeners.remove(listener);
+    }
+
+    public void notifyKeyspaceCreated(KeyspaceMetadata keyspace)
+    {
+        notifyCreateKeyspace(keyspace);
+        keyspace.types.forEach(this::notifyCreateType);
+        keyspace.tables.forEach(this::notifyCreateTable);
+        keyspace.views.forEach(this::notifyCreateView);
+        keyspace.functions.udfs().forEach(this::notifyCreateFunction);
+        keyspace.functions.udas().forEach(this::notifyCreateAggregate);
+    }
+
+    public void notifyKeyspaceAltered(KeyspaceMetadata.KeyspaceDiff delta, boolean dropData)
+    {
+        // notify on everything dropped
+        delta.udas.dropped.forEach(uda -> notifyDropAggregate((UDAggregate) uda));
+        delta.udfs.dropped.forEach(udf -> notifyDropFunction((UDFunction) udf));
+        delta.views.dropped.forEach(view -> notifyDropView(view, dropData));
+        delta.tables.dropped.forEach(metadata -> notifyDropTable(metadata, dropData));
+        delta.types.dropped.forEach(this::notifyDropType);
+
+        // notify on everything created
+        delta.types.created.forEach(this::notifyCreateType);
+        delta.tables.created.forEach(this::notifyCreateTable);
+        delta.views.created.forEach(this::notifyCreateView);
+        delta.udfs.created.forEach(udf -> notifyCreateFunction((UDFunction) udf));
+        delta.udas.created.forEach(uda -> notifyCreateAggregate((UDAggregate) uda));
+
+        // notify on everything altered
+        if (!delta.before.params.equals(delta.after.params))
+            notifyAlterKeyspace(delta.before, delta.after);
+        delta.types.altered.forEach(diff -> notifyAlterType(diff.before, diff.after));
+        delta.tables.altered.forEach(diff -> notifyAlterTable(diff.before, diff.after));
+        delta.views.altered.forEach(diff -> notifyAlterView(diff.before, diff.after));
+        delta.udfs.altered.forEach(diff -> notifyAlterFunction(diff.before, diff.after));
+        delta.udas.altered.forEach(diff -> notifyAlterAggregate(diff.before, diff.after));
+    }
+
+    public void notifyKeyspaceDropped(KeyspaceMetadata keyspace, boolean dropData)
+    {
+        keyspace.functions.udas().forEach(this::notifyDropAggregate);
+        keyspace.functions.udfs().forEach(this::notifyDropFunction);
+        keyspace.views.forEach(view -> notifyDropView(view, dropData));
+        keyspace.tables.forEach(metadata -> notifyDropTable(metadata, dropData));
+        keyspace.types.forEach(this::notifyDropType);
+        notifyDropKeyspace(keyspace, dropData);
+    }
+
+    public void notifyPreChanges(SchemaTransformationResult transformationResult)
+    {
+        transformationResult.diff.altered.forEach(this::notifyPreAlterKeyspace);
+    }
+
+    private void notifyPreAlterKeyspace(KeyspaceMetadata.KeyspaceDiff keyspaceDiff)
+    {
+        keyspaceDiff.tables.altered.forEach(this::notifyPreAlterTable);
+        keyspaceDiff.views.altered.forEach(this::notifyPreAlterView);
+    }
+
+    private void notifyPreAlterTable(Diff.Altered<TableMetadata> altered)
+    {
+        changeListeners.forEach(l -> l.onPreAlterTable(altered.before, altered.after));
+    }
+
+    private void notifyPreAlterView(Diff.Altered<ViewMetadata> altered)
+    {
+        changeListeners.forEach(l -> l.onPreAlterView(altered.before, altered.after));
+    }
+
+    private void notifyCreateKeyspace(KeyspaceMetadata ksm)
+    {
+        changeListeners.forEach(l -> l.onCreateKeyspace(ksm));
+    }
+
+    private void notifyCreateTable(TableMetadata metadata)
+    {
+        changeListeners.forEach(l -> l.onCreateTable(metadata));
+    }
+
+    private void notifyCreateView(ViewMetadata view)
+    {
+        changeListeners.forEach(l -> l.onCreateView(view));
+    }
+
+    private void notifyCreateType(UserType ut)
+    {
+        changeListeners.forEach(l -> l.onCreateType(ut));
+    }
+
+    private void notifyCreateFunction(UDFunction udf)
+    {
+        changeListeners.forEach(l -> l.onCreateFunction(udf));
+    }
+
+    private void notifyCreateAggregate(UDAggregate udf)
+    {
+        changeListeners.forEach(l -> l.onCreateAggregate(udf));
+    }
+
+    private void notifyAlterKeyspace(KeyspaceMetadata before, KeyspaceMetadata after)
+    {
+        changeListeners.forEach(l -> l.onAlterKeyspace(before, after));
+    }
+
+    private void notifyAlterTable(TableMetadata before, TableMetadata after)
+    {
+        boolean changeAffectedPreparedStatements = before.changeAffectsPreparedStatements(after);
+        changeListeners.forEach(l -> l.onAlterTable(before, after, changeAffectedPreparedStatements));
+    }
+
+    private void notifyAlterView(ViewMetadata before, ViewMetadata after)
+    {
+        boolean changeAffectedPreparedStatements = before.metadata.changeAffectsPreparedStatements(after.metadata);
+        changeListeners.forEach(l -> l.onAlterView(before, after, changeAffectedPreparedStatements));
+    }
+
+    private void notifyAlterType(UserType before, UserType after)
+    {
+        changeListeners.forEach(l -> l.onAlterType(before, after));
+    }
+
+    private void notifyAlterFunction(UDFunction before, UDFunction after)
+    {
+        changeListeners.forEach(l -> l.onAlterFunction(before, after));
+    }
+
+    private void notifyAlterAggregate(UDAggregate before, UDAggregate after)
+    {
+        changeListeners.forEach(l -> l.onAlterAggregate(before, after));
+    }
+
+    private void notifyDropKeyspace(KeyspaceMetadata ksm, boolean dropData)
+    {
+        changeListeners.forEach(l -> l.onDropKeyspace(ksm, dropData));
+    }
+
+    private void notifyDropTable(TableMetadata metadata, boolean dropData)
+    {
+        changeListeners.forEach(l -> l.onDropTable(metadata, dropData));
+    }
+
+    private void notifyDropView(ViewMetadata view, boolean dropData)
+    {
+        changeListeners.forEach(l -> l.onDropView(view, dropData));
+    }
+
+    private void notifyDropType(UserType ut)
+    {
+        changeListeners.forEach(l -> l.onDropType(ut));
+    }
+
+    private void notifyDropFunction(UDFunction udf)
+    {
+        changeListeners.forEach(l -> l.onDropFunction(udf));
+    }
+
+    private void notifyDropAggregate(UDAggregate udf)
+    {
+        changeListeners.forEach(l -> l.onDropAggregate(udf));
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/SchemaConstants.java b/src/java/org/apache/cassandra/schema/SchemaConstants.java
index 7b6b7de..888ea4a 100644
--- a/src/java/org/apache/cassandra/schema/SchemaConstants.java
+++ b/src/java/org/apache/cassandra/schema/SchemaConstants.java
@@ -25,9 +25,13 @@
 import java.util.regex.Pattern;
 
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
 
 import org.apache.cassandra.db.Digest;
 
+/**
+ * When adding new String keyspace names here, double check if it needs to be added to PartitionDenylist.canDenylistKeyspace
+ */
 public final class SchemaConstants
 {
     public static final Pattern PATTERN_WORD_CHARS = Pattern.compile("\\w+");
@@ -47,14 +51,18 @@
     public static final Set<String> LOCAL_SYSTEM_KEYSPACE_NAMES =
         ImmutableSet.of(SYSTEM_KEYSPACE_NAME, SCHEMA_KEYSPACE_NAME);
 
+    /* virtual table system keyspace names */
+    public static final Set<String> VIRTUAL_SYSTEM_KEYSPACE_NAMES =
+        ImmutableSet.of(VIRTUAL_VIEWS, VIRTUAL_SCHEMA);
+
     /* replicate system keyspace names (the ones with a "true" replication strategy) */
     public static final Set<String> REPLICATED_SYSTEM_KEYSPACE_NAMES =
         ImmutableSet.of(TRACE_KEYSPACE_NAME, AUTH_KEYSPACE_NAME, DISTRIBUTED_KEYSPACE_NAME);
     /**
-     * longest permissible KS or CF name.  Our main concern is that filename not be more than 255 characters;
-     * the filename will contain both the KS and CF names. Since non-schema-name components only take up
-     * ~64 characters, we could allow longer names than this, but on Windows, the entire path should be not greater than
-     * 255 characters, so a lower limit here helps avoid problems.  See CASSANDRA-4110.
+     * The longest permissible KS or CF name.
+     *
+     * Before CASSANDRA-16956, we used to care about not having the entire path longer than 255 characters because of
+     * Windows support but this limit is by implementing CASSANDRA-16956 not in effect anymore.
      */
     public static final int NAME_LENGTH = 48;
 
@@ -78,7 +86,7 @@
      */
     public static boolean isLocalSystemKeyspace(String keyspaceName)
     {
-        return LOCAL_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName.toLowerCase());
+        return LOCAL_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName.toLowerCase()) || isVirtualSystemKeyspace(keyspaceName);
     }
 
     /**
@@ -95,7 +103,7 @@
      */
     public static boolean isVirtualSystemKeyspace(String keyspaceName)
     {
-        return VIRTUAL_SCHEMA.equals(keyspaceName.toLowerCase()) || VIRTUAL_VIEWS.equals(keyspaceName.toLowerCase());
+        return VIRTUAL_SYSTEM_KEYSPACE_NAMES.contains(keyspaceName.toLowerCase());
     }
 
     /**
@@ -104,8 +112,16 @@
      */
     public static boolean isSystemKeyspace(String keyspaceName)
     {
-        return isLocalSystemKeyspace(keyspaceName)
-                || isReplicatedSystemKeyspace(keyspaceName)
-                || isVirtualSystemKeyspace(keyspaceName);
+        return isLocalSystemKeyspace(keyspaceName) // this includes vtables
+                || isReplicatedSystemKeyspace(keyspaceName);
+    }
+
+    /**
+     * Returns the set of all system keyspaces
+     * @return all system keyspaces
+     */
+    public static Set<String> getSystemKeyspaces()
+    {
+        return Sets.union(Sets.union(LOCAL_SYSTEM_KEYSPACE_NAMES, REPLICATED_SYSTEM_KEYSPACE_NAMES), VIRTUAL_SYSTEM_KEYSPACE_NAMES);
     }
 }
diff --git a/src/java/org/apache/cassandra/schema/SchemaDiagnostics.java b/src/java/org/apache/cassandra/schema/SchemaDiagnostics.java
index 12b8409..2924303 100644
--- a/src/java/org/apache/cassandra/schema/SchemaDiagnostics.java
+++ b/src/java/org/apache/cassandra/schema/SchemaDiagnostics.java
@@ -86,28 +86,28 @@
                                             delta.before, delta, null, null, null, null));
     }
 
-    static void keyspaceDroping(Schema schema, KeyspaceMetadata keyspace)
+    static void keyspaceDropping(Schema schema, KeyspaceMetadata keyspace)
     {
         if (isEnabled(SchemaEventType.KS_DROPPING))
             service.publish(new SchemaEvent(SchemaEventType.KS_DROPPING, schema, keyspace,
                                             null, null, null, null, null, null));
     }
 
-    static void keyspaceDroped(Schema schema, KeyspaceMetadata keyspace)
+    static void keyspaceDropped(Schema schema, KeyspaceMetadata keyspace)
     {
         if (isEnabled(SchemaEventType.KS_DROPPED))
             service.publish(new SchemaEvent(SchemaEventType.KS_DROPPED, schema, keyspace,
                                             null, null, null, null, null, null));
     }
 
-    static void schemataLoading(Schema schema)
+    static void schemaLoading(Schema schema)
     {
         if (isEnabled(SchemaEventType.SCHEMATA_LOADING))
             service.publish(new SchemaEvent(SchemaEventType.SCHEMATA_LOADING, schema, null,
                                             null, null, null, null, null, null));
     }
 
-    static void schemataLoaded(Schema schema)
+    static void schemaLoaded(Schema schema)
     {
         if (isEnabled(SchemaEventType.SCHEMATA_LOADED))
             service.publish(new SchemaEvent(SchemaEventType.SCHEMATA_LOADED, schema, null,
@@ -121,7 +121,7 @@
                                             null, null, null, null, null, null));
     }
 
-    static void schemataCleared(Schema schema)
+    static void schemaCleared(Schema schema)
     {
         if (isEnabled(SchemaEventType.SCHEMATA_CLEARED))
             service.publish(new SchemaEvent(SchemaEventType.SCHEMATA_CLEARED, schema, null,
diff --git a/src/java/org/apache/cassandra/schema/SchemaEvent.java b/src/java/org/apache/cassandra/schema/SchemaEvent.java
index d163a11..5703fe2 100644
--- a/src/java/org/apache/cassandra/schema/SchemaEvent.java
+++ b/src/java/org/apache/cassandra/schema/SchemaEvent.java
@@ -21,30 +21,30 @@
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import java.util.stream.Collectors;
+import java.util.stream.StreamSupport;
 import javax.annotation.Nullable;
 
-import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableCollection;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Lists;
 import com.google.common.collect.MapDifference;
 
 import org.apache.cassandra.diag.DiagnosticEvent;
-import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.Collectors3;
 
 public final class SchemaEvent extends DiagnosticEvent
 {
     private final SchemaEventType type;
 
-    private final HashSet<String> keyspaces;
-    private final HashMap<String, String> indexTables;
-    private final HashMap<String, String> tables;
-    private final ArrayList<String> nonSystemKeyspaces;
-    private final ArrayList<String> userKeyspaces;
+    private final ImmutableCollection<String> keyspaces;
+    private final ImmutableMap<String, String> indexTables;
+    private final ImmutableCollection<String> tables;
+    private final ImmutableCollection<String> nonSystemKeyspaces;
+    private final ImmutableCollection<String> userKeyspaces;
     private final int numberOfTables;
     private final UUID version;
 
@@ -61,7 +61,7 @@
     @Nullable
     private final Views.ViewsDiff viewsDiff;
     @Nullable
-    private final MapDifference<String,TableMetadata> indexesDiff;
+    private final MapDifference<String, TableMetadata> indexesDiff;
 
     public enum SchemaEventType
     {
@@ -90,7 +90,7 @@
     SchemaEvent(SchemaEventType type, Schema schema, @Nullable KeyspaceMetadata ksUpdate,
                 @Nullable KeyspaceMetadata previous, @Nullable KeyspaceMetadata.KeyspaceDiff ksDiff,
                 @Nullable TableMetadata tableUpdate, @Nullable Tables.TablesDiff tablesDiff,
-                @Nullable Views.ViewsDiff viewsDiff, @Nullable MapDifference<String,TableMetadata> indexesDiff)
+                @Nullable Views.ViewsDiff viewsDiff, @Nullable MapDifference<String, TableMetadata> indexesDiff)
     {
         this.type = type;
         this.ksUpdate = ksUpdate;
@@ -101,27 +101,21 @@
         this.viewsDiff = viewsDiff;
         this.indexesDiff = indexesDiff;
 
-        this.keyspaces = new HashSet<>(schema.getKeyspaces());
-        this.nonSystemKeyspaces = new ArrayList<>(schema.getNonSystemKeyspaces());
-        this.userKeyspaces = new ArrayList<>(schema.getUserKeyspaces());
+        this.keyspaces = schema.distributedAndLocalKeyspaces().names();
+        this.nonSystemKeyspaces = schema.distributedKeyspaces().names();
+        this.userKeyspaces = schema.getUserKeyspaces().names();
         this.numberOfTables = schema.getNumberOfTables();
         this.version = schema.getVersion();
 
-        Map<Pair<String, String>, TableMetadataRef> indexTableMetadataRefs = schema.getIndexTableMetadataRefs();
-        Map<String, String> indexTables = indexTableMetadataRefs.entrySet().stream()
-                                                                .collect(Collectors.toMap(e -> e.getKey().left + ',' +
-                                                                                               e.getKey().right,
-                                                                                          e -> e.getValue().id.toHexString() + ',' +
-                                                                                               e.getValue().keyspace + ',' +
-                                                                                               e.getValue().name));
-        this.indexTables = new HashMap<>(indexTables);
-        Map<TableId, TableMetadataRef> tableMetadataRefs = schema.getTableMetadataRefs();
-        Map<String, String> tables = tableMetadataRefs.entrySet().stream()
-                                                      .collect(Collectors.toMap(e -> e.getKey().toHexString(),
-                                                                                e -> e.getValue().id.toHexString() + ',' +
-                                                                                     e.getValue().keyspace + ',' +
-                                                                                     e.getValue().name));
-        this.tables = new HashMap<>(tables);
+        this.indexTables = schema.distributedKeyspaces().stream()
+                                 .flatMap(ks -> ks.tables.indexTables().entrySet().stream())
+                                 .collect(Collectors3.toImmutableMap(e -> String.format("%s,%s", e.getValue().keyspace, e.getKey()),
+                                                                     e -> String.format("%s,%s,%s", e.getValue().id.toHexString(), e.getValue().keyspace, e.getValue().name)));
+
+        this.tables = schema.distributedKeyspaces().stream()
+                            .flatMap(ks -> StreamSupport.stream(ks.tablesAndViews().spliterator(), false))
+                            .map(e -> String.format("%s,%s,%s", e.id.toHexString(), e.keyspace, e.name))
+                            .collect(Collectors3.toImmutableList());
     }
 
     public SchemaEventType getType()
@@ -225,6 +219,7 @@
         ret.put("caching", repr(params.caching));
         ret.put("compaction", repr(params.compaction));
         ret.put("compression", repr(params.compression));
+        ret.put("memtable", repr(params.memtable));
         if (params.speculativeRetry != null) ret.put("speculativeRetry", params.speculativeRetry.kind().name());
         return ret;
     }
@@ -253,6 +248,11 @@
         return ret;
     }
 
+    private String repr(MemtableParams params)
+    {
+        return params.configurationKey();
+    }
+
     private HashMap<String, Serializable> repr(IndexMetadata index)
     {
         HashMap<String, Serializable> ret = new HashMap<>();
diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
index a6fd028..3f223dd 100644
--- a/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
+++ b/src/java/org/apache/cassandra/schema/SchemaKeyspace.java
@@ -49,6 +49,7 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Simulate;
 
 import static java.lang.String.format;
 
@@ -58,14 +59,16 @@
 import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
 import static org.apache.cassandra.cql3.QueryProcessor.executeOnceInternal;
 import static org.apache.cassandra.schema.SchemaKeyspaceTables.*;
+import static org.apache.cassandra.utils.Simulate.With.GLOBAL_CLOCK;
 
 /**
  * system_schema.* tables and methods for manipulating them.
  * 
- * Please notice this class is _not_ thread safe. It should be accessed through {@link org.apache.cassandra.schema.Schema}. See CASSANDRA-16856/16996
+ * Please notice this class is _not_ thread safe and all methods which reads or updates the data in schema keyspace
+ * should be accessed only from the implementation of {@link SchemaUpdateHandler} in synchronized blocks.
  */
 @NotThreadSafe
-final class SchemaKeyspace
+public final class SchemaKeyspace
 {
     private SchemaKeyspace()
     {
@@ -80,7 +83,7 @@
      * The tables to which we added the cdc column. This is used in {@link #makeUpdateForSchema} below to make sure we skip that
      * column is cdc is disabled as the columns breaks pre-cdc to post-cdc upgrades (typically, 3.0 -> 3.X).
      */
-    private static final Set<String> TABLES_WITH_CDC_ADDED = ImmutableSet.of(TABLES, VIEWS);
+    private static final Set<String> TABLES_WITH_CDC_ADDED = ImmutableSet.of(SchemaKeyspaceTables.TABLES, SchemaKeyspaceTables.VIEWS);
 
     private static final TableMetadata Keyspaces =
         parse(KEYSPACES,
@@ -102,6 +105,7 @@
               + "comment text,"
               + "compaction frozen<map<text, text>>,"
               + "compression frozen<map<text, text>>,"
+              + "memtable text,"
               + "crc_check_chance double,"
               + "dclocal_read_repair_chance double," // no longer used, left for drivers' sake
               + "default_time_to_live int,"
@@ -169,6 +173,7 @@
               + "comment text,"
               + "compaction frozen<map<text, text>>,"
               + "compression frozen<map<text, text>>,"
+              + "memtable text,"
               + "crc_check_chance double,"
               + "dclocal_read_repair_chance double," // no longer used, left for drivers' sake
               + "default_time_to_live int,"
@@ -248,7 +253,7 @@
                                    .build();
     }
 
-    static KeyspaceMetadata metadata()
+    public static KeyspaceMetadata metadata()
     {
         return KeyspaceMetadata.create(SchemaConstants.SCHEMA_KEYSPACE_NAME, KeyspaceParams.local(), org.apache.cassandra.schema.Tables.of(ALL_TABLE_METADATA));
     }
@@ -257,32 +262,32 @@
     {
         Map<String, Mutation> mutations = new HashMap<>();
 
-        diff.created.forEach(k -> mutations.put(k.name, makeCreateKeyspaceMutation(k, timestamp).build()));
         diff.dropped.forEach(k -> mutations.put(k.name, makeDropKeyspaceMutation(k, timestamp).build()));
+        diff.created.forEach(k -> mutations.put(k.name, makeCreateKeyspaceMutation(k, timestamp).build()));
         diff.altered.forEach(kd ->
         {
             KeyspaceMetadata ks = kd.after;
 
             Mutation.SimpleBuilder builder = makeCreateKeyspaceMutation(ks.name, ks.params, timestamp);
 
-            kd.types.created.forEach(t -> addTypeToSchemaMutation(t, builder));
             kd.types.dropped.forEach(t -> addDropTypeToSchemaMutation(t, builder));
+            kd.types.created.forEach(t -> addTypeToSchemaMutation(t, builder));
             kd.types.altered(Difference.SHALLOW).forEach(td -> addTypeToSchemaMutation(td.after, builder));
 
-            kd.tables.created.forEach(t -> addTableToSchemaMutation(t, true, builder));
             kd.tables.dropped.forEach(t -> addDropTableToSchemaMutation(t, builder));
+            kd.tables.created.forEach(t -> addTableToSchemaMutation(t, true, builder));
             kd.tables.altered(Difference.SHALLOW).forEach(td -> addAlterTableToSchemaMutation(td.before, td.after, builder));
 
-            kd.views.created.forEach(v -> addViewToSchemaMutation(v, true, builder));
             kd.views.dropped.forEach(v -> addDropViewToSchemaMutation(v, builder));
+            kd.views.created.forEach(v -> addViewToSchemaMutation(v, true, builder));
             kd.views.altered(Difference.SHALLOW).forEach(vd -> addAlterViewToSchemaMutation(vd.before, vd.after, builder));
 
-            kd.udfs.created.forEach(f -> addFunctionToSchemaMutation((UDFunction) f, builder));
             kd.udfs.dropped.forEach(f -> addDropFunctionToSchemaMutation((UDFunction) f, builder));
+            kd.udfs.created.forEach(f -> addFunctionToSchemaMutation((UDFunction) f, builder));
             kd.udfs.altered(Difference.SHALLOW).forEach(fd -> addFunctionToSchemaMutation(fd.after, builder));
 
-            kd.udas.created.forEach(a -> addAggregateToSchemaMutation((UDAggregate) a, builder));
             kd.udas.dropped.forEach(a -> addDropAggregateToSchemaMutation((UDAggregate) a, builder));
+            kd.udas.created.forEach(a -> addAggregateToSchemaMutation((UDAggregate) a, builder));
             kd.udas.altered(Difference.SHALLOW).forEach(ad -> addAggregateToSchemaMutation(ad.after, builder));
 
             mutations.put(ks.name, builder.build());
@@ -294,6 +299,7 @@
     /**
      * Add entries to system_schema.* for the hardcoded system keyspaces
      */
+    @Simulate(with = GLOBAL_CLOCK)
     static void saveSystemKeyspacesSchema()
     {
         KeyspaceMetadata system = Schema.instance.getKeyspaceMetadata(SchemaConstants.SYSTEM_KEYSPACE_NAME);
@@ -316,20 +322,21 @@
 
     static void truncate()
     {
+        logger.debug("Truncating schema tables...");
         ALL.reverse().forEach(table -> getSchemaCFS(table).truncateBlocking());
     }
 
     private static void flush()
     {
         if (!DatabaseDescriptor.isUnsafeSystem())
-            ALL.forEach(table -> FBUtilities.waitOnFuture(getSchemaCFS(table).forceFlush()));
+            ALL.forEach(table -> FBUtilities.waitOnFuture(getSchemaCFS(table).forceFlush(ColumnFamilyStore.FlushReason.INTERNALLY_FORCED)));
     }
 
     /**
      * Read schema from system keyspace and calculate MD5 digest of every row, resulting digest
      * will be converted into UUID which would act as content-based version of the schema.
      */
-    static UUID calculateSchemaDigest()
+    public static UUID calculateSchemaDigest()
     {
         Digest digest = Digest.forSchema();
         for (String table : ALL)
@@ -395,7 +402,7 @@
 
                     DecoratedKey key = partition.partitionKey();
                     Mutation.PartitionUpdateCollector puCollector = mutationMap.computeIfAbsent(key, k -> new Mutation.PartitionUpdateCollector(SchemaConstants.SCHEMA_KEYSPACE_NAME, key));
-                    puCollector.add(makeUpdateForSchema(partition, cmd.columnFilter()));
+                    puCollector.add(makeUpdateForSchema(partition, cmd.columnFilter()).withOnlyPresentColumns());
                 }
             }
         }
@@ -438,10 +445,10 @@
     @SuppressWarnings("unchecked")
     private static DecoratedKey decorate(TableMetadata metadata, Object value)
     {
-        return metadata.partitioner.decorateKey(((AbstractType) metadata.partitionKeyType).decompose(value));
+        return metadata.partitioner.decorateKey(metadata.partitionKeyType.decomposeUntyped(value));
     }
 
-    static Mutation.SimpleBuilder makeCreateKeyspaceMutation(String name, KeyspaceParams params, long timestamp)
+    private static Mutation.SimpleBuilder makeCreateKeyspaceMutation(String name, KeyspaceParams params, long timestamp)
     {
         Mutation.SimpleBuilder builder = Mutation.simpleBuilder(Keyspaces.keyspace, decorate(Keyspaces, name))
                                                  .timestamp(timestamp);
@@ -454,6 +461,7 @@
         return builder;
     }
 
+    @VisibleForTesting
     static Mutation.SimpleBuilder makeCreateKeyspaceMutation(KeyspaceMetadata keyspace, long timestamp)
     {
         Mutation.SimpleBuilder builder = makeCreateKeyspaceMutation(keyspace.name, keyspace.params, timestamp);
@@ -467,7 +475,7 @@
         return builder;
     }
 
-    static Mutation.SimpleBuilder makeDropKeyspaceMutation(KeyspaceMetadata keyspace, long timestamp)
+    private static Mutation.SimpleBuilder makeDropKeyspaceMutation(KeyspaceMetadata keyspace, long timestamp)
     {
         Mutation.SimpleBuilder builder = Mutation.simpleBuilder(SchemaConstants.SCHEMA_KEYSPACE_NAME, decorate(Keyspaces, keyspace.name))
                                                  .timestamp(timestamp);
@@ -491,6 +499,7 @@
         builder.update(Types).row(type.name).delete();
     }
 
+    @VisibleForTesting
     static Mutation.SimpleBuilder makeCreateTableMutation(KeyspaceMetadata keyspace, TableMetadata table, long timestamp)
     {
         // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631).
@@ -499,10 +508,11 @@
         return builder;
     }
 
-    static void addTableToSchemaMutation(TableMetadata table, boolean withColumnsAndTriggers, Mutation.SimpleBuilder builder)
+    private static void addTableToSchemaMutation(TableMetadata table, boolean withColumnsAndTriggers, Mutation.SimpleBuilder builder)
     {
         Row.SimpleBuilder rowBuilder = builder.update(Tables)
                                               .row(table.name)
+                                              .deletePrevious()
                                               .add("id", table.id.asUUID())
                                               .add("flags", TableMetadata.Flag.toStringSet(table.flags));
 
@@ -548,6 +558,11 @@
         // node sends table schema to a < 3.8 versioned node with an unknown column.
         if (DatabaseDescriptor.isCDCEnabled())
             builder.add("cdc", params.cdc);
+
+        // As above, only add the memtable column if the table uses a non-default memtable configuration to avoid RTE
+        // in mixed operation with pre-4.1 versioned node during upgrades.
+        if (params.memtable != MemtableParams.DEFAULT)
+            builder.add("memtable", params.memtable.configurationKey());
     }
 
     private static void addAlterTableToSchemaMutation(TableMetadata oldTable, TableMetadata newTable, Mutation.SimpleBuilder builder)
@@ -605,6 +620,7 @@
             addUpdatedIndexToSchemaMutation(newTable, diff.rightValue(), builder);
     }
 
+    @VisibleForTesting
     static Mutation.SimpleBuilder makeUpdateTableMutation(KeyspaceMetadata keyspace,
                                                           TableMetadata oldTable,
                                                           TableMetadata newTable,
@@ -637,14 +653,6 @@
         return Maps.difference(beforeMap, afterMap);
     }
 
-    static Mutation.SimpleBuilder makeDropTableMutation(KeyspaceMetadata keyspace, TableMetadata table, long timestamp)
-    {
-        // Include the serialized keyspace in case the target node missed a CREATE KEYSPACE migration (see CASSANDRA-5631).
-        Mutation.SimpleBuilder builder = makeCreateKeyspaceMutation(keyspace.name, keyspace.params, timestamp);
-        addDropTableToSchemaMutation(table, builder);
-        return builder;
-    }
-
     private static void addDropTableToSchemaMutation(TableMetadata table, Mutation.SimpleBuilder builder)
     {
         builder.update(Tables).row(table.name).delete();
@@ -714,6 +722,7 @@
         TableMetadata table = view.metadata;
         Row.SimpleBuilder rowBuilder = builder.update(Views)
                                               .row(view.name())
+                                              .deletePrevious()
                                               .add("include_all_columns", view.includeAllColumns)
                                               .add("base_table_id", view.baseTableId.asUUID())
                                               .add("base_table_name", view.baseTableName)
@@ -830,8 +839,7 @@
     /*
      * Fetching schema
      */
-
-    static Keyspaces fetchNonSystemKeyspaces()
+    public static Keyspaces fetchNonSystemKeyspaces()
     {
         return fetchKeyspacesWithout(SchemaConstants.LOCAL_SYSTEM_KEYSPACE_NAMES);
     }
@@ -943,6 +951,7 @@
                             .build();
     }
 
+    @VisibleForTesting
     static TableParams createTableParamsFromRow(UntypedResultSet.Row row)
     {
         return TableParams.builder()
@@ -951,6 +960,9 @@
                           .comment(row.getString("comment"))
                           .compaction(CompactionParams.fromMap(row.getFrozenTextMap("compaction")))
                           .compression(CompressionParams.fromMap(row.getFrozenTextMap("compression")))
+                          .memtable(MemtableParams.getWithFallback(row.has("memtable")
+                                                                   ? row.getString("memtable")
+                                                                   : null)) // memtable column was introduced in 4.1
                           .defaultTimeToLive(row.getInt("default_time_to_live"))
                           .extensions(row.getFrozenMap("extensions", UTF8Type.instance, BytesType.instance))
                           .gcGraceSeconds(row.getInt("gc_grace_seconds"))
@@ -983,6 +995,7 @@
         return columns;
     }
 
+    @VisibleForTesting
     static ColumnMetadata createColumnFromRow(UntypedResultSet.Row row, Types types)
     {
         String keyspace = row.getString("keyspace_name");
@@ -1029,7 +1042,7 @@
                                  ? ColumnMetadata.Kind.valueOf(row.getString("kind").toUpperCase())
                                  : ColumnMetadata.Kind.REGULAR;
         assert kind == ColumnMetadata.Kind.REGULAR || kind == ColumnMetadata.Kind.STATIC
-            : "Unexpected dropped column kind: " + kind.toString();
+            : "Unexpected dropped column kind: " + kind;
 
         ColumnMetadata column = new ColumnMetadata(keyspace, table, ColumnIdentifier.getInterned(name, true), type, ColumnMetadata.NO_POSITION, kind);
         long droppedTime = TimeUnit.MILLISECONDS.toMicros(row.getLong("dropped_time"));
@@ -1144,9 +1157,9 @@
 
         List<AbstractType<?>> argTypes = new ArrayList<>();
         for (String type : row.getFrozenList("argument_types", UTF8Type.instance))
-            argTypes.add(CQLTypeParser.parse(ksName, type, types));
+            argTypes.add(CQLTypeParser.parse(ksName, type, types).udfType());
 
-        AbstractType<?> returnType = CQLTypeParser.parse(ksName, row.getString("return_type"), types);
+        AbstractType<?> returnType = CQLTypeParser.parse(ksName, row.getString("return_type"), types).udfType();
 
         String language = row.getString("language");
         String body = row.getString("body");
@@ -1206,10 +1219,10 @@
         List<AbstractType<?>> argTypes =
             row.getFrozenList("argument_types", UTF8Type.instance)
                .stream()
-               .map(t -> CQLTypeParser.parse(ksName, t, types))
+               .map(t -> CQLTypeParser.parse(ksName, t, types).udfType())
                .collect(toList());
 
-        AbstractType<?> returnType = CQLTypeParser.parse(ksName, row.getString("return_type"), types);
+        AbstractType<?> returnType = CQLTypeParser.parse(ksName, row.getString("return_type"), types).udfType();
 
         FunctionName stateFunc = new FunctionName(ksName, (row.getString("state_func")));
 
diff --git a/src/java/org/apache/cassandra/schema/SchemaKeyspaceTables.java b/src/java/org/apache/cassandra/schema/SchemaKeyspaceTables.java
index b6e825d..c00a4f7 100644
--- a/src/java/org/apache/cassandra/schema/SchemaKeyspaceTables.java
+++ b/src/java/org/apache/cassandra/schema/SchemaKeyspaceTables.java
@@ -19,19 +19,19 @@
 
 import com.google.common.collect.ImmutableList;
 
-public final class SchemaKeyspaceTables
+public class SchemaKeyspaceTables
 {
-    public static final String INDEXES = "indexes";
-    public static final String AGGREGATES = "aggregates";
-    public static final String FUNCTIONS = "functions";
-    public static final String TYPES = "types";
-    public static final String VIEWS = "views";
-    public static final String TRIGGERS = "triggers";
-    public static final String DROPPED_COLUMNS = "dropped_columns";
-    public static final String COLUMNS = "columns";
-    public static final String TABLES = "tables";
     public static final String KEYSPACES = "keyspaces";
-
+    public static final String TABLES = "tables";
+    public static final String COLUMNS = "columns";
+    public static final String DROPPED_COLUMNS = "dropped_columns";
+    public static final String TRIGGERS = "triggers";
+    public static final String VIEWS = "views";
+    public static final String TYPES = "types";
+    public static final String FUNCTIONS = "functions";
+    public static final String AGGREGATES = "aggregates";
+    public static final String INDEXES = "indexes";
+ 
     /**
      * The order in this list matters.
      *
@@ -56,7 +56,4 @@
                                                                      VIEWS,
                                                                      KEYSPACES);
 
-    private SchemaKeyspaceTables()
-    {
-    }
 }
diff --git a/src/java/org/apache/cassandra/schema/SchemaMigrationDiagnostics.java b/src/java/org/apache/cassandra/schema/SchemaMigrationDiagnostics.java
deleted file mode 100644
index 62f1768..0000000
--- a/src/java/org/apache/cassandra/schema/SchemaMigrationDiagnostics.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.schema;
-
-import java.util.UUID;
-
-import org.apache.cassandra.diag.DiagnosticEventService;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.schema.SchemaMigrationEvent.MigrationManagerEventType;
-
-final class SchemaMigrationDiagnostics
-{
-    private static final DiagnosticEventService service = DiagnosticEventService.instance();
-
-    private SchemaMigrationDiagnostics()
-    {
-    }
-
-    static void unknownLocalSchemaVersion(InetAddressAndPort endpoint, UUID theirVersion)
-    {
-        if (isEnabled(MigrationManagerEventType.UNKNOWN_LOCAL_SCHEMA_VERSION))
-            service.publish(new SchemaMigrationEvent(MigrationManagerEventType.UNKNOWN_LOCAL_SCHEMA_VERSION, endpoint,
-                                                     theirVersion));
-    }
-
-    static void versionMatch(InetAddressAndPort endpoint, UUID theirVersion)
-    {
-        if (isEnabled(MigrationManagerEventType.VERSION_MATCH))
-            service.publish(new SchemaMigrationEvent(MigrationManagerEventType.VERSION_MATCH, endpoint, theirVersion));
-    }
-
-    static void skipPull(InetAddressAndPort endpoint, UUID theirVersion)
-    {
-        if (isEnabled(MigrationManagerEventType.SKIP_PULL))
-            service.publish(new SchemaMigrationEvent(MigrationManagerEventType.SKIP_PULL, endpoint, theirVersion));
-    }
-
-    static void resetLocalSchema()
-    {
-        if (isEnabled(MigrationManagerEventType.RESET_LOCAL_SCHEMA))
-            service.publish(new SchemaMigrationEvent(MigrationManagerEventType.RESET_LOCAL_SCHEMA, null, null));
-    }
-
-    static void taskCreated(InetAddressAndPort endpoint)
-    {
-        if (isEnabled(MigrationManagerEventType.TASK_CREATED))
-            service.publish(new SchemaMigrationEvent(MigrationManagerEventType.TASK_CREATED, endpoint, null));
-    }
-
-    static void taskSendAborted(InetAddressAndPort endpoint)
-    {
-        if (isEnabled(MigrationManagerEventType.TASK_SEND_ABORTED))
-            service.publish(new SchemaMigrationEvent(MigrationManagerEventType.TASK_SEND_ABORTED, endpoint, null));
-    }
-
-    static void taskRequestSend(InetAddressAndPort endpoint)
-    {
-        if (isEnabled(MigrationManagerEventType.TASK_REQUEST_SEND))
-            service.publish(new SchemaMigrationEvent(MigrationManagerEventType.TASK_REQUEST_SEND,
-                                                     endpoint, null));
-    }
-
-    private static boolean isEnabled(MigrationManagerEventType type)
-    {
-        return service.isEnabled(SchemaMigrationEvent.class, type);
-    }
-}
diff --git a/src/java/org/apache/cassandra/schema/SchemaMigrationEvent.java b/src/java/org/apache/cassandra/schema/SchemaMigrationEvent.java
deleted file mode 100644
index a984804..0000000
--- a/src/java/org/apache/cassandra/schema/SchemaMigrationEvent.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.schema;
-
-import java.io.Serializable;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Queue;
-import java.util.UUID;
-import java.util.concurrent.CountDownLatch;
-
-import javax.annotation.Nullable;
-
-import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.diag.DiagnosticEvent;
-import org.apache.cassandra.gms.FailureDetector;
-import org.apache.cassandra.gms.Gossiper;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.MessagingService;
-
-/**
- * Internal events emitted by {@link MigrationManager}.
- */
-final class SchemaMigrationEvent extends DiagnosticEvent
-{
-    private final MigrationManagerEventType type;
-    @Nullable
-    private final InetAddressAndPort endpoint;
-    @Nullable
-    private final UUID endpointSchemaVersion;
-    private final UUID localSchemaVersion;
-    private final Integer localMessagingVersion;
-    private final SystemKeyspace.BootstrapState bootstrapState;
-    private final Integer inflightTaskCount;
-    @Nullable
-    private Integer endpointMessagingVersion;
-    @Nullable
-    private Boolean endpointGossipOnlyMember;
-    @Nullable
-    private Boolean isAlive;
-
-    enum MigrationManagerEventType
-    {
-        UNKNOWN_LOCAL_SCHEMA_VERSION,
-        VERSION_MATCH,
-        SKIP_PULL,
-        RESET_LOCAL_SCHEMA,
-        TASK_CREATED,
-        TASK_SEND_ABORTED,
-        TASK_REQUEST_SEND
-    }
-
-    SchemaMigrationEvent(MigrationManagerEventType type,
-                         @Nullable InetAddressAndPort endpoint, @Nullable UUID endpointSchemaVersion)
-    {
-        this.type = type;
-        this.endpoint = endpoint;
-        this.endpointSchemaVersion = endpointSchemaVersion;
-
-        localSchemaVersion = Schema.instance.getVersion();
-        localMessagingVersion = MessagingService.current_version;
-
-        inflightTaskCount = MigrationCoordinator.instance.getInflightTasks();
-
-        this.bootstrapState = SystemKeyspace.getBootstrapState();
-
-        if (endpoint == null) return;
-
-        if (MessagingService.instance().versions.knows(endpoint))
-            endpointMessagingVersion = MessagingService.instance().versions.getRaw(endpoint);
-
-        endpointGossipOnlyMember = Gossiper.instance.isGossipOnlyMember(endpoint);
-        this.isAlive = FailureDetector.instance.isAlive(endpoint);
-    }
-
-    public Enum<?> getType()
-    {
-        return type;
-    }
-
-    public Map<String, Serializable> toMap()
-    {
-        HashMap<String, Serializable> ret = new HashMap<>();
-        if (endpoint != null) ret.put("endpoint", endpoint.getHostAddressAndPort());
-        ret.put("endpointSchemaVersion", Schema.schemaVersionToString(endpointSchemaVersion));
-        ret.put("localSchemaVersion", Schema.schemaVersionToString(localSchemaVersion));
-        if (endpointMessagingVersion != null) ret.put("endpointMessagingVersion", endpointMessagingVersion);
-        if (localMessagingVersion != null) ret.put("localMessagingVersion", localMessagingVersion);
-        if (endpointGossipOnlyMember != null) ret.put("endpointGossipOnlyMember", endpointGossipOnlyMember);
-        if (isAlive != null) ret.put("endpointIsAlive", isAlive);
-        if (bootstrapState != null) ret.put("bootstrapState", bootstrapState.name());
-        if (inflightTaskCount != null) ret.put("inflightTaskCount", inflightTaskCount);
-        return ret;
-    }
-}
diff --git a/src/java/org/apache/cassandra/schema/SchemaMutationsSerializer.java b/src/java/org/apache/cassandra/schema/SchemaMutationsSerializer.java
new file mode 100644
index 0000000..ba65c0d
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/SchemaMutationsSerializer.java
@@ -0,0 +1,60 @@
+/*
+ * 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.schema;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+public class SchemaMutationsSerializer implements IVersionedSerializer<Collection<Mutation>>
+{
+    public static final SchemaMutationsSerializer instance = new SchemaMutationsSerializer();
+
+    public void serialize(Collection<Mutation> schema, DataOutputPlus out, int version) throws IOException
+    {
+        out.writeInt(schema.size());
+        for (Mutation mutation : schema)
+            Mutation.serializer.serialize(mutation, out, version);
+    }
+
+    public Collection<Mutation> deserialize(DataInputPlus in, int version) throws IOException
+    {
+        int count = in.readInt();
+        Collection<Mutation> schema = new ArrayList<>(count);
+
+        for (int i = 0; i < count; i++)
+            schema.add(Mutation.serializer.deserialize(in, version));
+
+        return schema;
+    }
+
+    public long serializedSize(Collection<Mutation> schema, int version)
+    {
+        int size = TypeSizes.sizeof(schema.size());
+        for (Mutation mutation : schema)
+            size += mutation.serializedSize(version);
+        return size;
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/SchemaProvider.java b/src/java/org/apache/cassandra/schema/SchemaProvider.java
index 07324ed..cbad42e 100644
--- a/src/java/org/apache/cassandra/schema/SchemaProvider.java
+++ b/src/java/org/apache/cassandra/schema/SchemaProvider.java
@@ -18,6 +18,7 @@
 
 package org.apache.cassandra.schema;
 
+import java.util.function.Supplier;
 import javax.annotation.Nullable;
 
 import org.apache.cassandra.db.Keyspace;
@@ -29,7 +30,7 @@
     @Nullable
     Keyspace getKeyspaceInstance(String keyspaceName);
 
-    void storeKeyspaceInstance(Keyspace keyspace);
+    Keyspace maybeAddKeyspaceInstance(String keyspaceName, Supplier<Keyspace> loadFunction);
 
     @Nullable
     KeyspaceMetadata getKeyspaceMetadata(String keyspaceName);
diff --git a/src/java/org/apache/cassandra/schema/SchemaPullVerbHandler.java b/src/java/org/apache/cassandra/schema/SchemaPullVerbHandler.java
index 16ee968..6589075 100644
--- a/src/java/org/apache/cassandra/schema/SchemaPullVerbHandler.java
+++ b/src/java/org/apache/cassandra/schema/SchemaPullVerbHandler.java
@@ -17,15 +17,15 @@
  */
 package org.apache.cassandra.schema;
 
-import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.net.IVerbHandler;
 import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.NoPayload;
 
 /**
@@ -38,10 +38,20 @@
 
     private static final Logger logger = LoggerFactory.getLogger(SchemaPullVerbHandler.class);
 
+    private final List<Consumer<Message<NoPayload>>> handlers = new CopyOnWriteArrayList<>();
+
+    public void register(Consumer<Message<NoPayload>> handler)
+    {
+        handlers.add(handler);
+    }
+
     public void doVerb(Message<NoPayload> message)
     {
         logger.trace("Received schema pull request from {}", message.from());
-        Message<Collection<Mutation>> response = message.responseWith(Schema.instance.schemaKeyspaceAsMutations());
-        MessagingService.instance().send(response, message.from());
+        List<Consumer<Message<NoPayload>>> handlers = this.handlers;
+        if (handlers.isEmpty())
+            throw new UnsupportedOperationException("There is no handler registered for schema pull verb");
+
+        handlers.forEach(h -> h.accept(message));
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/schema/SchemaPushVerbHandler.java b/src/java/org/apache/cassandra/schema/SchemaPushVerbHandler.java
index f2f0faf..4f2325a 100644
--- a/src/java/org/apache/cassandra/schema/SchemaPushVerbHandler.java
+++ b/src/java/org/apache/cassandra/schema/SchemaPushVerbHandler.java
@@ -18,11 +18,13 @@
 package org.apache.cassandra.schema;
 
 import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.net.IVerbHandler;
 import org.apache.cassandra.net.Message;
@@ -39,11 +41,22 @@
 
     private static final Logger logger = LoggerFactory.getLogger(SchemaPushVerbHandler.class);
 
+    private final List<Consumer<Message<Collection<Mutation>>>> handlers = new CopyOnWriteArrayList<>();
+
+    public void register(Consumer<Message<Collection<Mutation>>> handler)
+    {
+        handlers.add(handler);
+    }
+
     public void doVerb(final Message<Collection<Mutation>> message)
     {
         logger.trace("Received schema push request from {}", message.from());
-
         SchemaAnnouncementDiagnostics.schemataMutationsReceived(message.from());
-        Stage.MIGRATION.submit(() -> Schema.instance.mergeAndAnnounceVersion(message.payload));
+
+        List<Consumer<Message<Collection<Mutation>>>> handlers = this.handlers;
+        if (handlers.isEmpty())
+            throw new UnsupportedOperationException("There is no handler registered for schema push verb");
+
+        handlers.forEach(h -> h.accept(message));
     }
 }
diff --git a/src/java/org/apache/cassandra/schema/SchemaTransformation.java b/src/java/org/apache/cassandra/schema/SchemaTransformation.java
index e2290a3..2b020a0 100644
--- a/src/java/org/apache/cassandra/schema/SchemaTransformation.java
+++ b/src/java/org/apache/cassandra/schema/SchemaTransformation.java
@@ -17,17 +17,51 @@
  */
 package org.apache.cassandra.schema;
 
-import java.net.UnknownHostException;
+import java.util.Optional;
 
 public interface SchemaTransformation
 {
     /**
      * Apply a statement transformation to a schema snapshot.
-     *
-     * Implementing methods should be side-effect free.
+     * <p>
+     * Implementing methods should be side-effect free (outside of throwing exceptions if the transformation cannot
+     * be successfully applied to the provided schema).
      *
      * @param schema Keyspaces to base the transformation on
      * @return Keyspaces transformed by the statement
      */
-    Keyspaces apply(Keyspaces schema) throws UnknownHostException;
+    Keyspaces apply(Keyspaces schema);
+
+    /**
+     * If the transformation should be applied with a certain timestamp, this method should be overriden. This is used
+     * by {@link SchemaTransformations#updateSystemKeyspace(KeyspaceMetadata, long)} when we need to set the fixed
+     * timestamp in order to preserve user settings.
+     */
+    default Optional<Long> fixedTimestampMicros()
+    {
+        return Optional.empty();
+    }
+
+    /**
+     * The result of applying (on this node) a given schema transformation.
+     */
+    class SchemaTransformationResult
+    {
+        public final DistributedSchema before;
+        public final DistributedSchema after;
+        public final Keyspaces.KeyspacesDiff diff;
+
+        public SchemaTransformationResult(DistributedSchema before, DistributedSchema after, Keyspaces.KeyspacesDiff diff)
+        {
+            this.before = before;
+            this.after = after;
+            this.diff = diff;
+        }
+
+        @Override
+        public String toString()
+        {
+            return String.format("SchemaTransformationResult{%s --> %s, diff=%s}", before.getVersion(), after.getVersion(), diff);
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/schema/SchemaTransformations.java b/src/java/org/apache/cassandra/schema/SchemaTransformations.java
new file mode 100644
index 0000000..124f9a6
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/SchemaTransformations.java
@@ -0,0 +1,210 @@
+/*
+ * 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.schema;
+
+import java.util.Optional;
+
+import org.apache.cassandra.db.marshal.UserType;
+import org.apache.cassandra.exceptions.AlreadyExistsException;
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+import static org.apache.cassandra.cql3.statements.RequestValidations.invalidRequest;
+
+/**
+ * Factory and utility methods to create simple schema transformation.
+ */
+public class SchemaTransformations
+{
+    /**
+     * Creates a schema transformation that adds the provided keyspace.
+     *
+     * @param keyspace       the keyspace to add.
+     * @param ignoreIfExists if {@code true}, the transformation is a no-op if a keyspace of the same name than
+     *                       {@code keyspace} already exists in the schema the transformation is applied on. Otherwise,
+     *                       the transformation throws an {@link AlreadyExistsException} in that case.
+     * @return the created transformation.
+     */
+    public static SchemaTransformation addKeyspace(KeyspaceMetadata keyspace, boolean ignoreIfExists)
+    {
+        return schema ->
+        {
+            KeyspaceMetadata existing = schema.getNullable(keyspace.name);
+            if (existing != null)
+            {
+                if (ignoreIfExists)
+                    return schema;
+
+                throw new AlreadyExistsException(keyspace.name);
+            }
+
+            return schema.withAddedOrUpdated(keyspace);
+        };
+    }
+
+    /**
+     * Creates a schema transformation that adds the provided table.
+     *
+     * @param table          the table to add.
+     * @param ignoreIfExists if {@code true}, the transformation is a no-op if a table of the same name than
+     *                       {@code table} already exists in the schema the transformation is applied on. Otherwise,
+     *                       the transformation throws an {@link AlreadyExistsException} in that case.
+     * @return the created transformation.
+     */
+    public static SchemaTransformation addTable(TableMetadata table, boolean ignoreIfExists)
+    {
+        return schema ->
+        {
+            KeyspaceMetadata keyspace = schema.getNullable(table.keyspace);
+            if (keyspace == null)
+                throw invalidRequest("Keyspace '%s' doesn't exist", table.keyspace);
+
+            if (keyspace.hasTable(table.name))
+            {
+                if (ignoreIfExists)
+                    return schema;
+
+                throw new AlreadyExistsException(table.keyspace, table.name);
+            }
+
+            table.validate();
+
+            return schema.withAddedOrUpdated(keyspace.withSwapped(keyspace.tables.with(table)));
+        };
+    }
+
+    public static SchemaTransformation addTypes(Types toAdd, boolean ignoreIfExists)
+    {
+        return schema ->
+        {
+            if (toAdd.isEmpty())
+                return schema;
+
+            String keyspaceName = toAdd.iterator().next().keyspace;
+            KeyspaceMetadata keyspace = schema.getNullable(keyspaceName);
+            if (null == keyspace)
+                throw invalidRequest("Keyspace '%s' doesn't exist", keyspaceName);
+
+            Types types = keyspace.types;
+            for (UserType type : toAdd)
+            {
+                if (types.containsType(type.name))
+                {
+                    if (ignoreIfExists)
+                        continue;
+
+                    throw new ConfigurationException("Type " + type + " already exists in " + keyspaceName);
+                }
+
+                types = types.with(type);
+            }
+            return schema.withAddedOrReplaced(keyspace.withSwapped(types));
+        };
+    }
+
+    /**
+     * Creates a schema transformation that adds the provided view.
+     *
+     * @param view           the view to add.
+     * @param ignoreIfExists if {@code true}, the transformation is a no-op if a view of the same name than
+     *                       {@code view} already exists in the schema the transformation is applied on. Otherwise,
+     *                       the transformation throws an {@link AlreadyExistsException} in that case.
+     * @return the created transformation.
+     */
+    public static SchemaTransformation addView(ViewMetadata view, boolean ignoreIfExists)
+    {
+        return schema ->
+        {
+            KeyspaceMetadata keyspace = schema.getNullable(view.keyspace());
+            if (keyspace == null)
+                throw invalidRequest("Cannot add view to non existing keyspace '%s'", view.keyspace());
+
+            if (keyspace.hasView(view.name()))
+            {
+                if (ignoreIfExists)
+                    return schema;
+
+                throw new AlreadyExistsException(view.keyspace(), view.name());
+            }
+
+            return schema.withAddedOrUpdated(keyspace.withSwapped(keyspace.views.with(view)));
+        };
+    }
+
+    /**
+     * We have a set of non-local, distributed system keyspaces, e.g. system_traces, system_auth, etc.
+     * (see {@link SchemaConstants#REPLICATED_SYSTEM_KEYSPACE_NAMES}), that need to be created on cluster initialisation,
+     * and later evolved on major upgrades (sometimes minor too). This method compares the current known definitions
+     * of the tables (if the keyspace exists) to the expected, most modern ones expected by the running version of C*.
+     * If any changes have been detected, a schema transformation returned by this method should make cluster's view of
+     * that keyspace aligned with the expected modern definition.
+     *
+     * @param keyspace   the metadata of the keyspace as it should be after application.
+     * @param generation timestamp to use for the table changes in the schema mutation
+     * @return the transformation.
+     */
+    public static SchemaTransformation updateSystemKeyspace(KeyspaceMetadata keyspace, long generation)
+    {
+        return new SchemaTransformation()
+        {
+            @Override
+            public Optional<Long> fixedTimestampMicros()
+            {
+                return Optional.of(generation);
+            }
+
+            @Override
+            public Keyspaces apply(Keyspaces schema)
+            {
+                KeyspaceMetadata updatedKeyspace = keyspace;
+                KeyspaceMetadata curKeyspace = schema.getNullable(keyspace.name);
+                if (curKeyspace != null)
+                {
+                    // If the keyspace already exists, we preserve whatever parameters it has.
+                    updatedKeyspace = updatedKeyspace.withSwapped(curKeyspace.params);
+
+                    for (TableMetadata curTable : curKeyspace.tables)
+                    {
+                        TableMetadata desiredTable = updatedKeyspace.tables.getNullable(curTable.name);
+                        if (desiredTable == null)
+                        {
+                            // preserve exsiting tables which are missing in the new keyspace definition
+                            updatedKeyspace = updatedKeyspace.withSwapped(updatedKeyspace.tables.with(curTable));
+                        }
+                        else
+                        {
+                            updatedKeyspace = updatedKeyspace.withSwapped(updatedKeyspace.tables.without(desiredTable));
+
+                            TableMetadata.Builder updatedBuilder = desiredTable.unbuild();
+
+                            for (ColumnMetadata column : curTable.regularAndStaticColumns())
+                            {
+                                if (!desiredTable.regularAndStaticColumns().contains(column))
+                                    updatedBuilder.addColumn(column);
+                            }
+
+                            updatedKeyspace = updatedKeyspace.withSwapped(updatedKeyspace.tables.with(updatedBuilder.build()));
+                        }
+                    }
+                }
+                return schema.withAddedOrReplaced(updatedKeyspace);
+            }
+        };
+    }
+
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/schema/SchemaUpdateHandler.java b/src/java/org/apache/cassandra/schema/SchemaUpdateHandler.java
new file mode 100644
index 0000000..f6711f3
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/SchemaUpdateHandler.java
@@ -0,0 +1,78 @@
+/*
+ * 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.schema;
+
+import java.time.Duration;
+
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
+import org.apache.cassandra.utils.concurrent.Awaitable;
+
+/**
+ * Schema update handler is responsible for maintaining the shared schema and synchronizing it with other nodes in
+ * the cluster, which means pushing and pulling changes, as well as tracking the current version in the cluster.
+ * <p/>
+ * The interface has been extracted to abstract out that functionality. It allows for various implementations like
+ * Gossip based (the default), ETCD, offline, etc., and make it easier for mocking in unit tests.
+ */
+public interface SchemaUpdateHandler
+{
+    /**
+     * Starts actively synchronizing schema with the rest of the cluster. It is called in the very beginning of the
+     * node startup. It is not expected to block - to await for the startup completion we have another method
+     * {@link #waitUntilReady(Duration)}.
+     */
+    void start();
+
+    /**
+     * Waits until the schema update handler is ready and returns the result. If the method returns {@code false} it
+     * means that readiness could not be achieved within the specified period of time. The method can be used just to
+     * check if schema is ready by passing {@link Duration#ZERO} as the timeout - in such case it returns immediately.
+     *
+     * @param timeout the maximum time to wait for schema readiness
+     * @return whether readiness is achieved
+     */
+    boolean waitUntilReady(Duration timeout);
+
+    /**
+     * Applies schema transformation in the underlying storage and synchronizes with other nodes.
+     *
+     * @param transformation schema transformation to be performed
+     * @param local          if true, the caller does not require synchronizing schema with other nodes - in practise local is
+     *                       used only in some tests
+     * @return transformation result
+     */
+    SchemaTransformationResult apply(SchemaTransformation transformation, boolean local);
+
+    /**
+     * Resets the schema either by reloading data from the local storage or from the other nodes. Once the schema is
+     * refreshed, the callbacks provided in the factory method are executed, and the updated schema version is announced.
+     *
+     * @param local whether we should reset with locally stored schema or fetch the schema from other nodes
+     */
+    void reset(boolean local);
+
+    /**
+     * Marks the local schema to be cleared and refreshed. Since calling this method, the update handler tries to obtain
+     * a fresh schema definition from a remote source. Once the schema definition is received, the local schema is
+     * replaced (instead of being merged which usually happens when the update is received).
+     * <p/>
+     * The returned awaitable is fulfilled when the schema is received and applied.
+     */
+    Awaitable clear();
+}
diff --git a/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactory.java b/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactory.java
new file mode 100644
index 0000000..f324a5d
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactory.java
@@ -0,0 +1,35 @@
+/*
+ * 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.schema;
+
+import java.util.function.BiConsumer;
+
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
+
+public interface SchemaUpdateHandlerFactory
+{
+    /**
+     * A factory which provides the appropriate schema update handler. The actual implementation may be different for
+     * different run modes (client, tool, daemon).
+     *
+     * @param online               whether schema update handler should work online and be aware of the other nodes (when in daemon mode)
+     * @param updateSchemaCallback callback which will be called right after the shared schema is updated
+     */
+    SchemaUpdateHandler getSchemaUpdateHandler(boolean online, BiConsumer<SchemaTransformationResult, Boolean> updateSchemaCallback);
+}
diff --git a/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactoryProvider.java b/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactoryProvider.java
new file mode 100644
index 0000000..9411a92
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/SchemaUpdateHandlerFactoryProvider.java
@@ -0,0 +1,60 @@
+/*
+ * 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.schema;
+
+import javax.inject.Provider;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.utils.FBUtilities;
+
+/**
+ * Provides the instance of SchemaUpdateHandler factory pointed by {@link #SUH_FACTORY_CLASS_PROPERTY} system property.
+ * If the property is not defined, the default factory {@link DefaultSchemaUpdateHandler} instance is returned.
+ */
+public class SchemaUpdateHandlerFactoryProvider implements Provider<SchemaUpdateHandlerFactory>
+{
+    public static final String SUH_FACTORY_CLASS_PROPERTY = "cassandra.schema.update_handler_factory.class";
+
+    public final static SchemaUpdateHandlerFactoryProvider instance = new SchemaUpdateHandlerFactoryProvider();
+
+    @Override
+    public SchemaUpdateHandlerFactory get()
+    {
+        String suhFactoryClassName = StringUtils.trimToNull(System.getProperty(SUH_FACTORY_CLASS_PROPERTY));
+        if (suhFactoryClassName == null)
+        {
+            return DefaultSchemaUpdateHandlerFactory.instance;
+        }
+        else
+        {
+            Class<SchemaUpdateHandlerFactory> suhFactoryClass = FBUtilities.classForName(suhFactoryClassName, "schema update handler factory");
+            try
+            {
+                return suhFactoryClass.newInstance();
+            }
+            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);
+            }
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/SystemDistributedKeyspace.java b/src/java/org/apache/cassandra/schema/SystemDistributedKeyspace.java
new file mode 100644
index 0000000..dc40093
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/SystemDistributedKeyspace.java
@@ -0,0 +1,409 @@
+/*
+ * 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.schema;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.base.Joiner;
+import com.google.common.collect.Lists;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.CommonRange;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static java.lang.String.format;
+
+import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+
+public final class SystemDistributedKeyspace
+{
+    private SystemDistributedKeyspace()
+    {
+    }
+
+    public static final String NAME = "system_distributed";
+
+    private static final int DEFAULT_RF = CassandraRelevantProperties.SYSTEM_DISTRIBUTED_DEFAULT_RF.getInt();
+    private static final Logger logger = LoggerFactory.getLogger(SystemDistributedKeyspace.class);
+
+    /**
+     * Generation is used as a timestamp for automatic table creation on startup.
+     * If you make any changes to the tables below, make sure to increment the
+     * generation and document your change here.
+     *
+     * gen 0: original definition in 2.2
+     * gen 1: (pre-)add options column to parent_repair_history in 3.0, 3.11
+     * gen 2: (pre-)add coordinator_port and participants_v2 columns to repair_history in 3.0, 3.11, 4.0
+     * gen 3: gc_grace_seconds raised from 0 to 10 days in CASSANDRA-12954 in 3.11.0
+     * gen 4: compression chunk length reduced to 16KiB, memtable_flush_period_in_ms now unset on all tables in 4.0
+     * gen 5: add ttl and TWCS to repair_history tables
+     * gen 6: add denylist table
+     */
+    public static final long GENERATION = 6;
+
+    public static final String REPAIR_HISTORY = "repair_history";
+
+    public static final String PARENT_REPAIR_HISTORY = "parent_repair_history";
+
+    public static final String VIEW_BUILD_STATUS = "view_build_status";
+
+    public static final String PARTITION_DENYLIST_TABLE = "partition_denylist";
+
+    private static final TableMetadata RepairHistory =
+        parse(REPAIR_HISTORY,
+                "Repair history",
+                "CREATE TABLE %s ("
+                     + "keyspace_name text,"
+                     + "columnfamily_name text,"
+                     + "id timeuuid,"
+                     + "parent_id timeuuid,"
+                     + "range_begin text,"
+                     + "range_end text,"
+                     + "coordinator inet,"
+                     + "coordinator_port int,"
+                     + "participants set<inet>,"
+                     + "participants_v2 set<text>,"
+                     + "exception_message text,"
+                     + "exception_stacktrace text,"
+                     + "status text,"
+                     + "started_at timestamp,"
+                     + "finished_at timestamp,"
+                     + "PRIMARY KEY ((keyspace_name, columnfamily_name), id))")
+        .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(30))
+        .compaction(CompactionParams.twcs(ImmutableMap.of("compaction_window_unit","DAYS",
+                                                          "compaction_window_size","1")))
+        .build();
+
+    private static final TableMetadata ParentRepairHistory =
+        parse(PARENT_REPAIR_HISTORY,
+                "Repair history",
+                "CREATE TABLE %s ("
+                     + "parent_id timeuuid,"
+                     + "keyspace_name text,"
+                     + "columnfamily_names set<text>,"
+                     + "started_at timestamp,"
+                     + "finished_at timestamp,"
+                     + "exception_message text,"
+                     + "exception_stacktrace text,"
+                     + "requested_ranges set<text>,"
+                     + "successful_ranges set<text>,"
+                     + "options map<text, text>,"
+                     + "PRIMARY KEY (parent_id))")
+        .defaultTimeToLive((int) TimeUnit.DAYS.toSeconds(30))
+        .compaction(CompactionParams.twcs(ImmutableMap.of("compaction_window_unit","DAYS",
+                                                          "compaction_window_size","1")))
+        .build();
+
+    private static final TableMetadata ViewBuildStatus =
+        parse(VIEW_BUILD_STATUS,
+            "Materialized View build status",
+            "CREATE TABLE %s ("
+                     + "keyspace_name text,"
+                     + "view_name text,"
+                     + "host_id uuid,"
+                     + "status text,"
+                     + "PRIMARY KEY ((keyspace_name, view_name), host_id))").build();
+
+    public static final TableMetadata PartitionDenylistTable =
+    parse(PARTITION_DENYLIST_TABLE,
+          "Partition keys which have been denied access",
+          "CREATE TABLE %s ("
+          + "ks_name text,"
+          + "table_name text,"
+          + "key blob,"
+          + "PRIMARY KEY ((ks_name, table_name), key))")
+    .build();
+
+    private static TableMetadata.Builder parse(String table, String description, String cql)
+    {
+        return CreateTableStatement.parse(format(cql, table), SchemaConstants.DISTRIBUTED_KEYSPACE_NAME)
+                                   .id(TableId.forSystemTable(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, table))
+                                   .comment(description);
+    }
+
+    public static KeyspaceMetadata metadata()
+    {
+        return KeyspaceMetadata.create(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, KeyspaceParams.simple(Math.max(DEFAULT_RF, DatabaseDescriptor.getDefaultKeyspaceRF())), Tables.of(RepairHistory, ParentRepairHistory, ViewBuildStatus, PartitionDenylistTable));
+    }
+
+    public static void startParentRepair(TimeUUID parent_id, String keyspaceName, String[] cfnames, RepairOption options)
+    {
+        Collection<Range<Token>> ranges = options.getRanges();
+        String query = "INSERT INTO %s.%s (parent_id, keyspace_name, columnfamily_names, requested_ranges, started_at,          options)"+
+                                 " VALUES (%s,        '%s',          { '%s' },           { '%s' },          toTimestamp(now()), { %s })";
+        String fmtQry = format(query,
+                                      SchemaConstants.DISTRIBUTED_KEYSPACE_NAME,
+                                      PARENT_REPAIR_HISTORY,
+                                      parent_id.toString(),
+                                      keyspaceName,
+                                      Joiner.on("','").join(cfnames),
+                                      Joiner.on("','").join(ranges),
+                                      toCQLMap(options.asMap(), RepairOption.RANGES_KEY, RepairOption.COLUMNFAMILIES_KEY));
+        processSilent(fmtQry);
+    }
+
+    private static String toCQLMap(Map<String, String> options, String ... ignore)
+    {
+        Set<String> toIgnore = Sets.newHashSet(ignore);
+        StringBuilder map = new StringBuilder();
+        boolean first = true;
+        for (Map.Entry<String, String> entry : options.entrySet())
+        {
+            if (!toIgnore.contains(entry.getKey()))
+            {
+                if (!first)
+                    map.append(',');
+                first = false;
+                map.append(format("'%s': '%s'", entry.getKey(), entry.getValue()));
+            }
+        }
+        return map.toString();
+    }
+
+    public static void failParentRepair(TimeUUID parent_id, Throwable t)
+    {
+        String query = "UPDATE %s.%s SET finished_at = toTimestamp(now()), exception_message=?, exception_stacktrace=? WHERE parent_id=%s";
+
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        t.printStackTrace(pw);
+        String fmtQuery = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, PARENT_REPAIR_HISTORY, parent_id.toString());
+        String message = t.getMessage();
+        processSilent(fmtQuery, message != null ? message : "", sw.toString());
+    }
+
+    public static void successfulParentRepair(TimeUUID parent_id, Collection<Range<Token>> successfulRanges)
+    {
+        String query = "UPDATE %s.%s SET finished_at = toTimestamp(now()), successful_ranges = {'%s'} WHERE parent_id=%s";
+        String fmtQuery = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, PARENT_REPAIR_HISTORY, Joiner.on("','").join(successfulRanges), parent_id.toString());
+        processSilent(fmtQuery);
+    }
+
+    public static void startRepairs(TimeUUID id, TimeUUID parent_id, String keyspaceName, String[] cfnames, CommonRange commonRange)
+    {
+        // Don't record repair history if an upgrade is in progress as version 3 nodes generates errors
+        // due to schema differences
+        boolean includeNewColumns = !Gossiper.instance.hasMajorVersion3Nodes();
+
+        InetAddressAndPort coordinator = FBUtilities.getBroadcastAddressAndPort();
+        Set<String> participants = Sets.newHashSet();
+        Set<String> participants_v2 = Sets.newHashSet();
+
+        for (InetAddressAndPort endpoint : commonRange.endpoints)
+        {
+            participants.add(endpoint.getHostAddress(false));
+            participants_v2.add(endpoint.getHostAddressAndPort());
+        }
+
+        String query =
+                "INSERT INTO %s.%s (keyspace_name, columnfamily_name, id, parent_id, range_begin, range_end, coordinator, coordinator_port, participants, participants_v2, status, started_at) " +
+                        "VALUES (   '%s',          '%s',              %s, %s,        '%s',        '%s',      '%s',        %d,               { '%s' },     { '%s' },        '%s',   toTimestamp(now()))";
+        String queryWithoutNewColumns =
+                "INSERT INTO %s.%s (keyspace_name, columnfamily_name, id, parent_id, range_begin, range_end, coordinator, participants, status, started_at) " +
+                        "VALUES (   '%s',          '%s',              %s, %s,        '%s',        '%s',      '%s',               { '%s' },        '%s',   toTimestamp(now()))";
+
+        for (String cfname : cfnames)
+        {
+            for (Range<Token> range : commonRange.ranges)
+            {
+                String fmtQry;
+                if (includeNewColumns)
+                {
+                    fmtQry = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
+                                    keyspaceName,
+                                    cfname,
+                                    id.toString(),
+                                    parent_id.toString(),
+                                    range.left.toString(),
+                                    range.right.toString(),
+                                    coordinator.getHostAddress(false),
+                                    coordinator.getPort(),
+                                    Joiner.on("', '").join(participants),
+                                    Joiner.on("', '").join(participants_v2),
+                                    RepairState.STARTED.toString());
+                }
+                else
+                {
+                    fmtQry = format(queryWithoutNewColumns, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
+                                    keyspaceName,
+                                    cfname,
+                                    id.toString(),
+                                    parent_id.toString(),
+                                    range.left.toString(),
+                                    range.right.toString(),
+                                    coordinator.getHostAddress(false),
+                                    Joiner.on("', '").join(participants),
+                                    RepairState.STARTED.toString());
+                }
+                processSilent(fmtQry);
+            }
+        }
+    }
+
+    public static void failRepairs(TimeUUID id, String keyspaceName, String[] cfnames, Throwable t)
+    {
+        for (String cfname : cfnames)
+            failedRepairJob(id, keyspaceName, cfname, t);
+    }
+
+    public static void successfulRepairJob(TimeUUID id, String keyspaceName, String cfname)
+    {
+        String query = "UPDATE %s.%s SET status = '%s', finished_at = toTimestamp(now()) WHERE keyspace_name = '%s' AND columnfamily_name = '%s' AND id = %s";
+        String fmtQuery = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
+                                        RepairState.SUCCESS.toString(),
+                                        keyspaceName,
+                                        cfname,
+                                        id.toString());
+        processSilent(fmtQuery);
+    }
+
+    public static void failedRepairJob(TimeUUID id, String keyspaceName, String cfname, Throwable t)
+    {
+        String query = "UPDATE %s.%s SET status = '%s', finished_at = toTimestamp(now()), exception_message=?, exception_stacktrace=? WHERE keyspace_name = '%s' AND columnfamily_name = '%s' AND id = %s";
+        StringWriter sw = new StringWriter();
+        PrintWriter pw = new PrintWriter(sw);
+        t.printStackTrace(pw);
+        String fmtQry = format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, REPAIR_HISTORY,
+                                      RepairState.FAILED.toString(),
+                                      keyspaceName,
+                                      cfname,
+                                      id.toString());
+        String message = t.getMessage();
+        if (message == null)
+            message = t.getClass().getName();
+        processSilent(fmtQry, message, sw.toString());
+    }
+
+    public static void startViewBuild(String keyspace, String view, UUID hostId)
+    {
+        String query = "INSERT INTO %s.%s (keyspace_name, view_name, host_id, status) VALUES (?, ?, ?, ?)";
+        QueryProcessor.process(format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS),
+                               ConsistencyLevel.ONE,
+                               Lists.newArrayList(bytes(keyspace),
+                                                  bytes(view),
+                                                  bytes(hostId),
+                                                  bytes(BuildStatus.STARTED.toString())));
+    }
+
+    public static void successfulViewBuild(String keyspace, String view, UUID hostId)
+    {
+        String query = "UPDATE %s.%s SET status = ? WHERE keyspace_name = ? AND view_name = ? AND host_id = ?";
+        QueryProcessor.process(format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS),
+                               ConsistencyLevel.ONE,
+                               Lists.newArrayList(bytes(BuildStatus.SUCCESS.toString()),
+                                                  bytes(keyspace),
+                                                  bytes(view),
+                                                  bytes(hostId)));
+    }
+
+    public static Map<UUID, String> viewStatus(String keyspace, String view)
+    {
+        String query = "SELECT host_id, status FROM %s.%s WHERE keyspace_name = ? AND view_name = ?";
+        UntypedResultSet results;
+        try
+        {
+            results = QueryProcessor.execute(format(query, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS),
+                                             ConsistencyLevel.ONE,
+                                             keyspace,
+                                             view);
+        }
+        catch (Exception e)
+        {
+            return Collections.emptyMap();
+        }
+
+
+        Map<UUID, String> status = new HashMap<>();
+        for (UntypedResultSet.Row row : results)
+        {
+            status.put(row.getUUID("host_id"), row.getString("status"));
+        }
+        return status;
+    }
+
+    public static void setViewRemoved(String keyspaceName, String viewName)
+    {
+        String buildReq = "DELETE FROM %s.%s WHERE keyspace_name = ? AND view_name = ?";
+        QueryProcessor.executeInternal(format(buildReq, SchemaConstants.DISTRIBUTED_KEYSPACE_NAME, VIEW_BUILD_STATUS), keyspaceName, viewName);
+        forceBlockingFlush(VIEW_BUILD_STATUS, ColumnFamilyStore.FlushReason.INTERNALLY_FORCED);
+    }
+
+    private static void processSilent(String fmtQry, String... values)
+    {
+        try
+        {
+            List<ByteBuffer> valueList = new ArrayList<>(values.length);
+            for (String v : values)
+            {
+                valueList.add(bytes(v));
+            }
+            QueryProcessor.process(fmtQry, ConsistencyLevel.ANY, valueList);
+        }
+        catch (Throwable t)
+        {
+            logger.error("Error executing query "+fmtQry, t);
+        }
+    }
+
+    public static void forceBlockingFlush(String table, ColumnFamilyStore.FlushReason reason)
+    {
+        if (!DatabaseDescriptor.isUnsafeSystem())
+            FBUtilities.waitOnFuture(Keyspace.open(SchemaConstants.DISTRIBUTED_KEYSPACE_NAME)
+                                             .getColumnFamilyStore(table)
+                                             .forceFlush(reason));
+    }
+
+    private enum RepairState
+    {
+        STARTED, SUCCESS, FAILED
+    }
+
+    private enum BuildStatus
+    {
+        UNKNOWN, STARTED, SUCCESS
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/TableId.java b/src/java/org/apache/cassandra/schema/TableId.java
index 695147f..fd47a47 100644
--- a/src/java/org/apache/cassandra/schema/TableId.java
+++ b/src/java/org/apache/cassandra/schema/TableId.java
@@ -25,7 +25,10 @@
 import org.apache.commons.lang3.ArrayUtils;
 
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+import static java.nio.charset.StandardCharsets.UTF_8;
 
 /**
  * The unique identifier of a table.
@@ -35,6 +38,7 @@
  */
 public class TableId
 {
+    // TODO: should this be a TimeUUID?
     private final UUID id;
 
     private TableId(UUID id)
@@ -47,9 +51,10 @@
         return new TableId(id);
     }
 
+    // TODO: should we be using UUID.randomUUID()?
     public static TableId generate()
     {
-        return new TableId(UUIDGen.getTimeUUID());
+        return new TableId(nextTimeUUID().asUUID());
     }
 
     public static TableId fromString(String idString)
@@ -67,8 +72,13 @@
      */
     public static TableId forSystemTable(String keyspace, String table)
     {
-        assert SchemaConstants.isLocalSystemKeyspace(keyspace) || SchemaConstants.isReplicatedSystemKeyspace(keyspace);
-        return new TableId(UUID.nameUUIDFromBytes(ArrayUtils.addAll(keyspace.getBytes(), table.getBytes())));
+        assert SchemaConstants.isSystemKeyspace(keyspace) : String.format("Table %s.%s is not a system table; only keyspaces allowed are %s", keyspace, table, SchemaConstants.getSystemKeyspaces());
+        return unsafeDeterministic(keyspace, table);
+    }
+
+    public static TableId unsafeDeterministic(String keyspace, String table)
+    {
+        return new TableId(UUID.nameUUIDFromBytes(ArrayUtils.addAll(keyspace.getBytes(UTF_8), table.getBytes(UTF_8))));
     }
 
     public String toHexString()
diff --git a/src/java/org/apache/cassandra/schema/TableMetadata.java b/src/java/org/apache/cassandra/schema/TableMetadata.java
index 36f2382..2e9d507 100644
--- a/src/java/org/apache/cassandra/schema/TableMetadata.java
+++ b/src/java/org/apache/cassandra/schema/TableMetadata.java
@@ -40,6 +40,7 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.service.reads.SpeculativeRetryPolicy;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.AbstractIterator;
 import org.github.jamm.Unmetered;
 
@@ -739,7 +740,12 @@
                 partitioner = DatabaseDescriptor.getPartitioner();
 
             if (id == null)
-                id = TableId.generate();
+            {
+                // make sure vtables use determiniestic ids so they can be referenced in calls cross-nodes
+                // see CASSANDRA-17295
+                if (DatabaseDescriptor.useDeterministicTableID() || kind == Kind.VIRTUAL) id = TableId.unsafeDeterministic(keyspace, name);
+                else id = TableId.generate();
+            }
 
             if (Flag.isCQLTable(flags))
                 return new TableMetadata(this);
@@ -861,6 +867,13 @@
             return this;
         }
 
+        public Builder memtable(MemtableParams val)
+        {
+            params.memtable(val);
+            return this;
+        }
+
+
         public Builder isCounter(boolean val)
         {
             return flag(Flag.COUNTER, val);
@@ -984,6 +997,11 @@
             return columns.values();
         }
 
+        public int numColumns()
+        {
+            return columns.size();
+        }
+
         public Set<String> columnNames()
         {
             return columns.values().stream().map(c -> c.name.toString()).collect(toSet());
@@ -1141,17 +1159,17 @@
     }
 
     public String toCqlString(boolean includeDroppedColumns,
-                              boolean internals,
+                              boolean withInternals,
                               boolean ifNotExists)
     {
         CqlBuilder builder = new CqlBuilder(2048);
-        appendCqlTo(builder, includeDroppedColumns, internals, ifNotExists);
+        appendCqlTo(builder, includeDroppedColumns, withInternals, ifNotExists);
         return builder.toString();
     }
 
     public void appendCqlTo(CqlBuilder builder,
                             boolean includeDroppedColumns,
-                            boolean internals,
+                            boolean withInternals,
                             boolean ifNotExists)
     {
         assert !isView();
@@ -1190,7 +1208,7 @@
         builder.append(" WITH ")
                .increaseIndent();
 
-        appendTableOptions(builder, internals);
+        appendTableOptions(builder, withInternals);
 
         builder.decreaseIndent();
 
@@ -1273,9 +1291,9 @@
                .newLine();
     }
 
-    void appendTableOptions(CqlBuilder builder, boolean internals)
+    void appendTableOptions(CqlBuilder builder, boolean withInternals)
     {
-        if (internals)
+        if (withInternals)
             builder.append("ID = ")
                    .append(id.toString())
                    .newLine()
@@ -1332,6 +1350,66 @@
         }
     }
 
+    /**
+     * Returns a string representation of a partition in a CQL-friendly format.
+     *
+     * For non-composite types it returns the result of {@link org.apache.cassandra.cql3.CQL3Type#toCQLLiteral}
+     * applied to the partition key.
+     * For composite types it applies {@link org.apache.cassandra.cql3.CQL3Type#toCQLLiteral} to each subkey and
+     * combines the results into a tuple.
+     *
+     * @param partitionKey a partition key
+     * @return CQL-like string representation of a partition key
+     */
+    public String partitionKeyAsCQLLiteral(ByteBuffer partitionKey)
+    {
+        return primaryKeyAsCQLLiteral(partitionKey, Clustering.EMPTY);
+    }
+
+    /**
+     * Returns a string representation of a primary key in a CQL-friendly format.
+     *
+     * @param partitionKey the partition key part of the primary key
+     * @param clustering the clustering key part of the primary key
+     * @return a CQL-like string representation of the specified primary key
+     */
+    public String primaryKeyAsCQLLiteral(ByteBuffer partitionKey, Clustering<?> clustering)
+    {
+        int clusteringSize = clustering.size();
+
+        String[] literals;
+        int i = 0;
+
+        if (partitionKeyType instanceof CompositeType)
+        {
+            List<AbstractType<?>> components = partitionKeyType.getComponents();
+            int size = components.size();
+            literals = new String[size + clusteringSize];
+            ByteBuffer[] values = ((CompositeType) partitionKeyType).split(partitionKey);
+            for (i = 0; i < size; i++)
+            {
+                literals[i] = asCQLLiteral(components.get(i), values[i]);
+            }
+        }
+        else
+        {
+            literals = new String[1 + clusteringSize];
+            literals[i++] = asCQLLiteral(partitionKeyType, partitionKey);
+        }
+
+        for (int j = 0; j < clusteringSize; j++)
+        {
+            literals[i++] = asCQLLiteral(clusteringColumns().get(j).type, clustering.bufferAt(j));
+        }
+
+        return i == 1 ? literals[0] : "(" + String.join(", ", literals) + ")";
+    }
+
+    private static String asCQLLiteral(AbstractType<?> type, ByteBuffer value)
+    {
+        return type.asCQL3Type().toCQLLiteral(value, ProtocolVersion.CURRENT);
+    }
+
     public static class CompactTableMetadata extends TableMetadata
     {
 
diff --git a/src/java/org/apache/cassandra/schema/TableMetadataRef.java b/src/java/org/apache/cassandra/schema/TableMetadataRef.java
index 3325510..dc4ff1d 100644
--- a/src/java/org/apache/cassandra/schema/TableMetadataRef.java
+++ b/src/java/org/apache/cassandra/schema/TableMetadataRef.java
@@ -96,4 +96,4 @@
     {
         return get().toString();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/schema/TableMetadataRefCache.java b/src/java/org/apache/cassandra/schema/TableMetadataRefCache.java
new file mode 100644
index 0000000..d947d1d
--- /dev/null
+++ b/src/java/org/apache/cassandra/schema/TableMetadataRefCache.java
@@ -0,0 +1,152 @@
+/*
+ * 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.schema;
+
+import java.util.Collections;
+import java.util.Map;
+
+import com.google.common.collect.MapDifference;
+import com.google.common.collect.Maps;
+
+import org.apache.cassandra.utils.Pair;
+
+/**
+ * Manages the cached {@link TableMetadataRef} objects which holds the references to {@link TableMetadata} objects.
+ * <p>
+ * The purpose of {@link TableMetadataRef} is that the reference to {@link TableMetadataRef} remains unchanged when
+ * the metadata of the table changes. {@link TableMetadata} is immutable, so when it changes, we only switch
+ * the reference inside the existing {@link TableMetadataRef} object.
+ */
+class TableMetadataRefCache
+{
+    public final static TableMetadataRefCache EMPTY = new TableMetadataRefCache(Collections.emptyMap(), Collections.emptyMap(), Collections.emptyMap());
+
+    // UUID -> mutable metadata ref map. We have to update these in place every time a table changes.
+    private final Map<TableId, TableMetadataRef> metadataRefs;
+
+    // keyspace and table names -> mutable metadata ref map.
+    private final Map<Pair<String, String>, TableMetadataRef> metadataRefsByName;
+
+    // (keyspace name, index name) -> mutable metadata ref map. We have to update these in place every time an index changes.
+    private final Map<Pair<String, String>, TableMetadataRef> indexMetadataRefs;
+
+    public TableMetadataRefCache(Map<TableId, TableMetadataRef> metadataRefs,
+                                 Map<Pair<String, String>, TableMetadataRef> metadataRefsByName,
+                                 Map<Pair<String, String>, TableMetadataRef> indexMetadataRefs)
+    {
+        this.metadataRefs = Collections.unmodifiableMap(metadataRefs);
+        this.metadataRefsByName = Collections.unmodifiableMap(metadataRefsByName);
+        this.indexMetadataRefs = Collections.unmodifiableMap(indexMetadataRefs);
+    }
+
+    /**
+     * Returns cache copy with added the {@link TableMetadataRef} corresponding to the provided keyspace to {@link #metadataRefs} and
+     * {@link #indexMetadataRefs}, assuming the keyspace is new (in the sense of not being tracked by the manager yet).
+     */
+    TableMetadataRefCache withNewRefs(KeyspaceMetadata ksm)
+    {
+        return withUpdatedRefs(ksm.empty(), ksm);
+    }
+
+    /**
+     * Returns cache copy with updated the {@link TableMetadataRef} in {@link #metadataRefs} and {@link #indexMetadataRefs},
+     * for an existing updated keyspace given it's previous and new definition.
+     * <p>
+     * Note that {@link TableMetadataRef} are not duplicated and table metadata is altered in the existing refs.
+     */
+    TableMetadataRefCache withUpdatedRefs(KeyspaceMetadata previous, KeyspaceMetadata updated)
+    {
+        Tables.TablesDiff tablesDiff = Tables.diff(previous.tables, updated.tables);
+        Views.ViewsDiff viewsDiff = Views.diff(previous.views, updated.views);
+
+        MapDifference<String, TableMetadata> indexesDiff = previous.tables.indexesDiff(updated.tables);
+
+        boolean hasCreatedOrDroppedTablesOrViews = tablesDiff.created.size() > 0 || tablesDiff.dropped.size() > 0 || viewsDiff.created.size() > 0 || viewsDiff.dropped.size() > 0;
+        boolean hasCreatedOrDroppedIndexes = !indexesDiff.entriesOnlyOnRight().isEmpty() || !indexesDiff.entriesOnlyOnLeft().isEmpty();
+
+        Map<TableId, TableMetadataRef> metadataRefs = hasCreatedOrDroppedTablesOrViews ? Maps.newHashMap(this.metadataRefs) : this.metadataRefs;
+        Map<Pair<String, String>, TableMetadataRef> metadataRefsByName = hasCreatedOrDroppedTablesOrViews ? Maps.newHashMap(this.metadataRefsByName) : this.metadataRefsByName;
+        Map<Pair<String, String>, TableMetadataRef> indexMetadataRefs = hasCreatedOrDroppedIndexes ? Maps.newHashMap(this.indexMetadataRefs) : this.indexMetadataRefs;
+
+        // clean up after removed entries
+        tablesDiff.dropped.forEach(ref -> removeRef(metadataRefs, metadataRefsByName, ref));
+        viewsDiff.dropped.forEach(view -> removeRef(metadataRefs, metadataRefsByName, view.metadata));
+        indexesDiff.entriesOnlyOnLeft()
+                   .values()
+                   .forEach(indexTable -> indexMetadataRefs.remove(Pair.create(indexTable.keyspace, indexTable.indexName().get())));
+
+        // load up new entries
+        tablesDiff.created.forEach(table -> putRef(metadataRefs, metadataRefsByName, new TableMetadataRef(table)));
+        viewsDiff.created.forEach(view -> putRef(metadataRefs, metadataRefsByName, new TableMetadataRef(view.metadata)));
+        indexesDiff.entriesOnlyOnRight()
+                   .values()
+                   .forEach(indexTable -> indexMetadataRefs.put(Pair.create(indexTable.keyspace, indexTable.indexName().get()), new TableMetadataRef(indexTable)));
+
+        // refresh refs to updated ones
+        tablesDiff.altered.forEach(diff -> metadataRefs.get(diff.after.id).set(diff.after));
+        viewsDiff.altered.forEach(diff -> metadataRefs.get(diff.after.metadata.id).set(diff.after.metadata));
+        indexesDiff.entriesDiffering()
+                   .values()
+                   .stream()
+                   .map(MapDifference.ValueDifference::rightValue)
+                   .forEach(indexTable -> indexMetadataRefs.get(Pair.create(indexTable.keyspace, indexTable.indexName().get())).set(indexTable));
+
+        return new TableMetadataRefCache(metadataRefs, metadataRefsByName, indexMetadataRefs);
+    }
+
+    private void putRef(Map<TableId, TableMetadataRef> metadataRefs,
+                        Map<Pair<String, String>, TableMetadataRef> metadataRefsByName,
+                        TableMetadataRef ref)
+    {
+        metadataRefs.put(ref.id, ref);
+        metadataRefsByName.put(Pair.create(ref.keyspace, ref.name), ref);
+    }
+
+    private void removeRef(Map<TableId, TableMetadataRef> metadataRefs,
+                           Map<Pair<String, String>, TableMetadataRef> metadataRefsByName,
+                           TableMetadata tm)
+    {
+        metadataRefs.remove(tm.id);
+        metadataRefsByName.remove(Pair.create(tm.keyspace, tm.name));
+    }
+
+    /**
+     * Returns cache copy with removed the {@link TableMetadataRef} from {@link #metadataRefs} and {@link #indexMetadataRefs}
+     * for the provided (dropped) keyspace.
+     */
+    TableMetadataRefCache withRemovedRefs(KeyspaceMetadata ksm)
+    {
+        return withUpdatedRefs(ksm, ksm.empty());
+    }
+
+    public TableMetadataRef getTableMetadataRef(TableId id)
+    {
+        return metadataRefs.get(id);
+    }
+
+    public TableMetadataRef getTableMetadataRef(String keyspace, String table)
+    {
+        return metadataRefsByName.get(Pair.create(keyspace, table));
+    }
+
+    public TableMetadataRef getIndexTableMetadataRef(String keyspace, String index)
+    {
+        return indexMetadataRefs.get(Pair.create(keyspace, index));
+    }
+}
diff --git a/src/java/org/apache/cassandra/schema/TableParams.java b/src/java/org/apache/cassandra/schema/TableParams.java
index 62db8f7..440729c 100644
--- a/src/java/org/apache/cassandra/schema/TableParams.java
+++ b/src/java/org/apache/cassandra/schema/TableParams.java
@@ -46,6 +46,7 @@
         COMMENT,
         COMPACTION,
         COMPRESSION,
+        MEMTABLE,
         DEFAULT_TIME_TO_LIVE,
         EXTENSIONS,
         GC_GRACE_SECONDS,
@@ -78,6 +79,7 @@
     public final CachingParams caching;
     public final CompactionParams compaction;
     public final CompressionParams compression;
+    public final MemtableParams memtable;
     public final ImmutableMap<String, ByteBuffer> extensions;
     public final boolean cdc;
     public final ReadRepairStrategy readRepair;
@@ -99,6 +101,7 @@
         caching = builder.caching;
         compaction = builder.compaction;
         compression = builder.compression;
+        memtable = builder.memtable;
         extensions = builder.extensions;
         cdc = builder.cdc;
         readRepair = builder.readRepair;
@@ -116,6 +119,7 @@
                             .comment(params.comment)
                             .compaction(params.compaction)
                             .compression(params.compression)
+                            .memtable(params.memtable)
                             .crcCheckChance(params.crcCheckChance)
                             .defaultTimeToLive(params.defaultTimeToLive)
                             .gcGraceSeconds(params.gcGraceSeconds)
@@ -178,6 +182,9 @@
 
         if (memtableFlushPeriodInMs < 0)
             fail("%s must be greater than or equal to 0 (got %s)", Option.MEMTABLE_FLUSH_PERIOD_IN_MS, memtableFlushPeriodInMs);
+
+        if (cdc && memtable.factory().writesShouldSkipCommitLog())
+            fail("CDC cannot work if writes skip the commit log. Check your memtable configuration.");
     }
 
     private static void fail(String format, Object... args)
@@ -208,6 +215,7 @@
             && caching.equals(p.caching)
             && compaction.equals(p.compaction)
             && compression.equals(p.compression)
+            && memtable.equals(p.memtable)
             && extensions.equals(p.extensions)
             && cdc == p.cdc
             && readRepair == p.readRepair;
@@ -228,6 +236,7 @@
                                 caching,
                                 compaction,
                                 compression,
+                                memtable,
                                 extensions,
                                 cdc,
                                 readRepair);
@@ -249,6 +258,7 @@
                           .add(Option.CACHING.toString(), caching)
                           .add(Option.COMPACTION.toString(), compaction)
                           .add(Option.COMPRESSION.toString(), compression)
+                          .add(Option.MEMTABLE.toString(), memtable)
                           .add(Option.EXTENSIONS.toString(), extensions)
                           .add(Option.CDC.toString(), cdc)
                           .add(Option.READ_REPAIR.toString(), readRepair)
@@ -272,6 +282,8 @@
                .newLine()
                .append("AND compression = ").append(compression.asMap())
                .newLine()
+               .append("AND memtable = ").appendWithSingleQuotes(memtable.configurationKey())
+               .newLine()
                .append("AND crc_check_chance = ").append(crcCheckChance)
                .newLine();
 
@@ -315,6 +327,7 @@
         private CachingParams caching = CachingParams.DEFAULT;
         private CompactionParams compaction = CompactionParams.DEFAULT;
         private CompressionParams compression = CompressionParams.DEFAULT;
+        private MemtableParams memtable = MemtableParams.DEFAULT;
         private ImmutableMap<String, ByteBuffer> extensions = ImmutableMap.of();
         private boolean cdc;
         private ReadRepairStrategy readRepair = ReadRepairStrategy.BLOCKING;
@@ -400,6 +413,12 @@
             return this;
         }
 
+        public Builder memtable(MemtableParams val)
+        {
+            memtable = val;
+            return this;
+        }
+
         public Builder compression(CompressionParams val)
         {
             compression = val;
diff --git a/src/java/org/apache/cassandra/schema/Types.java b/src/java/org/apache/cassandra/schema/Types.java
index 76694cc..0d264c4 100644
--- a/src/java/org/apache/cassandra/schema/Types.java
+++ b/src/java/org/apache/cassandra/schema/Types.java
@@ -109,6 +109,11 @@
         return Iterables.filter(types.values(), t -> t.referencesUserType(name) && !t.name.equals(name));
     }
 
+    public boolean isEmpty()
+    {
+        return types.isEmpty();
+    }
+
     /**
      * Get the type with the specified name
      *
diff --git a/src/java/org/apache/cassandra/schema/Views.java b/src/java/org/apache/cassandra/schema/Views.java
index f926c07..15d13f3 100644
--- a/src/java/org/apache/cassandra/schema/Views.java
+++ b/src/java/org/apache/cassandra/schema/Views.java
@@ -252,4 +252,4 @@
             return new ViewsDiff(created, dropped, altered.build());
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/security/AbstractSslContextFactory.java b/src/java/org/apache/cassandra/security/AbstractSslContextFactory.java
new file mode 100644
index 0000000..c2ef851
--- /dev/null
+++ b/src/java/org/apache/cassandra/security/AbstractSslContextFactory.java
@@ -0,0 +1,266 @@
+/*
+ * 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.security;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+
+import com.google.common.collect.ImmutableList;
+
+import io.netty.handler.ssl.CipherSuiteFilter;
+import io.netty.handler.ssl.ClientAuth;
+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;
+
+/**
+ * Abstract class implementing {@code ISslContextFacotry} to provide most of the functionality that any
+ * implementation might need. This does not assume any file-based credentials for keys/certs hence provide a good base
+ * for any implementation that only need to customize the loading of keys/certs in a custom way.
+ * <p>
+ * {@code CAUTION:} While this is extremely useful abstraction, please be careful if you need to modify this class
+ * given possible custom implementations out there!
+ *
+ * @see DefaultSslContextFactory
+ */
+abstract public class AbstractSslContextFactory implements ISslContextFactory
+{
+    /*
+    This list is substituted in configurations that have explicitly specified the original "TLS" default,
+    by extracting it from the default "TLS" SSL Context instance
+     */
+    static protected final List<String> TLS_PROTOCOL_SUBSTITUTION = SSLFactory.tlsInstanceProtocolSubstitution();
+
+    protected boolean openSslIsAvailable;
+
+    protected final Map<String, Object> parameters;
+    protected final List<String> cipher_suites;
+    protected final String protocol;
+    protected final List<String> accepted_protocols;
+    protected final String algorithm;
+    protected final String store_type;
+    protected final boolean require_client_auth;
+    protected final boolean require_endpoint_verification;
+    /*
+    ServerEncryptionOptions does not use the enabled flag at all instead using the existing
+    internode_encryption option. So we force this protected and expose through isEnabled
+    so users of ServerEncryptionOptions can't accidentally use this when they should use isEnabled
+    Long term we need to refactor ClientEncryptionOptions and ServerEncryptionOptions to be separate
+    classes so we can choose appropriate configuration for each.
+    See CASSANDRA-15262 and CASSANDRA-15146
+     */
+    protected Boolean enabled;
+    protected Boolean optional;
+
+    /* For test only */
+    protected AbstractSslContextFactory()
+    {
+        parameters = new HashMap<>();
+        cipher_suites = null;
+        protocol = null;
+        accepted_protocols = null;
+        algorithm = null;
+        store_type = "JKS";
+        require_client_auth = false;
+        require_endpoint_verification = false;
+        enabled = null;
+        optional = null;
+        deriveIfOpenSslAvailable();
+    }
+
+    protected AbstractSslContextFactory(Map<String, Object> parameters)
+    {
+        this.parameters = parameters;
+        cipher_suites = getStringList("cipher_suites");
+        protocol = getString("protocol");
+        accepted_protocols = getStringList("accepted_protocols");
+        algorithm = getString("algorithm");
+        store_type = getString("store_type", "JKS");
+        require_client_auth = getBoolean("require_client_auth", false);
+        require_endpoint_verification = getBoolean("require_endpoint_verification", false);
+        enabled = getBoolean("enabled");
+        optional = getBoolean("optional");
+        deriveIfOpenSslAvailable();
+    }
+
+    /**
+     * 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.
+     */
+    protected void deriveIfOpenSslAvailable()
+    {
+        if (Boolean.getBoolean(Config.PROPERTY_PREFIX + "disable_tcactive_openssl"))
+            openSslIsAvailable = false;
+        else
+            openSslIsAvailable = OpenSsl.isAvailable();
+    }
+
+    protected String getString(String key, String defaultValue)
+    {
+        return parameters.get(key) == null ? defaultValue : (String) parameters.get(key);
+    }
+
+    protected String getString(String key)
+    {
+        return (String) parameters.get(key);
+    }
+
+    protected List<String> getStringList(String key)
+    {
+        return (List<String>) parameters.get(key);
+    }
+
+    protected Boolean getBoolean(String key, boolean defaultValue)
+    {
+        return parameters.get(key) == null ? defaultValue : (Boolean) parameters.get(key);
+    }
+
+    protected Boolean getBoolean(String key)
+    {
+        return (Boolean) this.parameters.get(key);
+    }
+
+    @Override
+    public SSLContext createJSSESslContext(boolean verifyPeerCertificate) throws SSLException
+    {
+        TrustManager[] trustManagers = null;
+        if (verifyPeerCertificate)
+            trustManagers = buildTrustManagerFactory().getTrustManagers();
+
+        KeyManagerFactory kmf = buildKeyManagerFactory();
+
+        try
+        {
+            SSLContext ctx = SSLContext.getInstance("TLS");
+            ctx.init(kmf.getKeyManagers(), trustManagers, null);
+            return ctx;
+        }
+        catch (Exception e)
+        {
+            throw new SSLException("Error creating/initializing the SSL Context", e);
+        }
+    }
+
+    @Override
+    public SslContext createNettySslContext(boolean verifyPeerCertificate, SocketType socketType,
+                                            CipherSuiteFilter cipherFilter) throws SSLException
+    {
+        /*
+            There is a case where the netty/openssl combo might not support using KeyManagerFactory. Specifically,
+            I've seen this with the netty-tcnative dynamic openssl implementation. Using the netty-tcnative
+            static-boringssl works fine with KeyManagerFactory. If we want to support all of the netty-tcnative
+            options, we would need to fall back to passing in a file reference for both a x509 and PKCS#8 private
+            key file in PEM format (see {@link SslContextBuilder#forServer(File, File, String)}). However, we are
+            not supporting that now to keep the config/yaml API simple.
+         */
+        KeyManagerFactory kmf = buildKeyManagerFactory();
+        SslContextBuilder builder;
+        if (socketType == SocketType.SERVER)
+        {
+            builder = SslContextBuilder.forServer(kmf).clientAuth(this.require_client_auth ? ClientAuth.REQUIRE :
+                                                                  ClientAuth.NONE);
+        }
+        else
+        {
+            builder = SslContextBuilder.forClient().keyManager(kmf);
+        }
+
+        builder.sslProvider(getSslProvider()).protocols(getAcceptedProtocols());
+
+        // only set the cipher suites if the operator has explicity configured values for it; else, use the default
+        // for each ssl implemention (jdk or openssl)
+        if (cipher_suites != null && !cipher_suites.isEmpty())
+            builder.ciphers(cipher_suites, cipherFilter);
+
+        if (verifyPeerCertificate)
+            builder.trustManager(buildTrustManagerFactory());
+
+        return builder.build();
+    }
+
+    /**
+     * Combine the pre-4.0 protocol field with the accepted_protocols list, substituting a list of
+     * explicit protocols for the previous catchall default of "TLS"
+     *
+     * @return array of protocol names suitable for passing to SslContextBuilder.protocols, or null if the default
+     */
+    @Override
+    public List<String> getAcceptedProtocols()
+    {
+        if (accepted_protocols == null)
+        {
+            if (protocol == null)
+            {
+                return null;
+            }
+            // TLS is accepted by SSLContext.getInstance as a shorthand for give me an engine that
+            // can speak some TLS protocols.  It is not supported by SSLEngine.setAcceptedProtocols
+            // so substitute if the user hasn't provided an accepted protocol configuration
+            else if (protocol.equalsIgnoreCase("TLS"))
+            {
+                return TLS_PROTOCOL_SUBSTITUTION;
+            }
+            else // the user was trying to limit to a single specific protocol, so try that
+            {
+                return ImmutableList.of(protocol);
+            }
+        }
+
+        if (protocol != null && !protocol.equalsIgnoreCase("TLS") &&
+            accepted_protocols.stream().noneMatch(ap -> ap.equalsIgnoreCase(protocol)))
+        {
+            // If the user provided a non-generic default protocol, append it to accepted_protocols - they wanted
+            // it after all.
+            return ImmutableList.<String>builder().addAll(accepted_protocols).add(protocol).build();
+        }
+        else
+        {
+            return accepted_protocols;
+        }
+    }
+
+    @Override
+    public List<String> getCipherSuites()
+    {
+        return cipher_suites;
+    }
+
+    /**
+     * Returns {@link SslProvider} to be used to build Netty's SslContext.
+     *
+     * @return appropriate SslProvider
+     */
+    protected SslProvider getSslProvider()
+    {
+        return openSslIsAvailable ? SslProvider.OPENSSL : SslProvider.JDK;
+    }
+
+    abstract protected KeyManagerFactory buildKeyManagerFactory() throws SSLException;
+
+    abstract protected TrustManagerFactory buildTrustManagerFactory() throws SSLException;
+}
diff --git a/src/java/org/apache/cassandra/security/CipherFactory.java b/src/java/org/apache/cassandra/security/CipherFactory.java
index 3c13629..4674fd1 100644
--- a/src/java/org/apache/cassandra/security/CipherFactory.java
+++ b/src/java/org/apache/cassandra/security/CipherFactory.java
@@ -31,7 +31,6 @@
 import javax.crypto.spec.IvParameterSpec;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.MoreExecutors;
 
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
@@ -40,6 +39,7 @@
 import org.slf4j.LoggerFactory;
 
 import io.netty.util.concurrent.FastThreadLocal;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.config.TransparentDataEncryptionOptions;
 
 /**
@@ -81,7 +81,7 @@
 
         cache = Caffeine.newBuilder() // by default cache is unbounded
                 .maximumSize(64) // a value large enough that we should never even get close (so nothing gets evicted)
-                .executor(MoreExecutors.directExecutor())
+                .executor(ImmediateExecutor.INSTANCE)
                 .removalListener((key, value, cause) ->
                 {
                     // maybe reload the key? (to avoid the reload being on the user's dime)
diff --git a/src/java/org/apache/cassandra/security/DefaultSslContextFactory.java b/src/java/org/apache/cassandra/security/DefaultSslContextFactory.java
new file mode 100644
index 0000000..92c88c5
--- /dev/null
+++ b/src/java/org/apache/cassandra/security/DefaultSslContextFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.security;
+
+import java.util.Map;
+
+/**
+ * Cassandra's default implementation class for the configuration key {@code ssl_context_factory}. It uses
+ * file based keystores.
+ */
+public final class DefaultSslContextFactory extends FileBasedSslContextFactory
+{
+    public DefaultSslContextFactory(Map<String, Object> parameters)
+    {
+        super(parameters);
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/security/DisableSslContextFactory.java b/src/java/org/apache/cassandra/security/DisableSslContextFactory.java
new file mode 100644
index 0000000..9dab062
--- /dev/null
+++ b/src/java/org/apache/cassandra/security/DisableSslContextFactory.java
@@ -0,0 +1,55 @@
+/*
+ * 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.security;
+
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.TrustManagerFactory;
+
+public class DisableSslContextFactory extends AbstractSslContextFactory
+{
+    @Override
+    protected KeyManagerFactory buildKeyManagerFactory() throws SSLException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    protected TrustManagerFactory buildTrustManagerFactory() throws SSLException
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean hasKeystore()
+    {
+        return false;
+    }
+
+    @Override
+    public void initHotReloading() throws SSLException
+    {
+    }
+
+    @Override
+    public boolean shouldReload()
+    {
+        return false;
+    }
+}
diff --git a/src/java/org/apache/cassandra/security/FileBasedSslContextFactory.java b/src/java/org/apache/cassandra/security/FileBasedSslContextFactory.java
new file mode 100644
index 0000000..9876eb4
--- /dev/null
+++ b/src/java/org/apache/cassandra/security/FileBasedSslContextFactory.java
@@ -0,0 +1,250 @@
+/*
+ * 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.security;
+
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Map;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.TrustManagerFactory;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.utils.Clock;
+
+/**
+ * Abstract implementation for {@link ISslContextFactory} using file based, standard keystore format with the ability
+ * to hot-reload the files upon file changes (detected by the {@code last modified timestamp}).
+ * <p>
+ * {@code CAUTION:} While this is a useful abstraction, please be careful if you need to modify this class
+ * given possible custom implementations out there!
+ */
+abstract public class FileBasedSslContextFactory extends AbstractSslContextFactory
+{
+    private static final Logger logger = LoggerFactory.getLogger(FileBasedSslContextFactory.class);
+
+    @VisibleForTesting
+    protected volatile boolean checkedExpiry = false;
+
+    /**
+     * List of files that trigger hot reloading of SSL certificates
+     */
+    protected volatile List<HotReloadableFile> hotReloadableFiles = new ArrayList<>();
+
+    protected String keystore;
+    protected String keystore_password;
+    protected String truststore;
+    protected String truststore_password;
+
+    public FileBasedSslContextFactory()
+    {
+        keystore = "conf/.keystore";
+        keystore_password = "cassandra";
+        truststore = "conf/.truststore";
+        truststore_password = "cassandra";
+    }
+
+    public FileBasedSslContextFactory(Map<String, Object> parameters)
+    {
+        super(parameters);
+        keystore = getString("keystore");
+        keystore_password = getString("keystore_password");
+        truststore = getString("truststore");
+        truststore_password = getString("truststore_password");
+    }
+
+    @Override
+    public boolean shouldReload()
+    {
+        return hotReloadableFiles.stream().anyMatch(HotReloadableFile::shouldReload);
+    }
+
+    @Override
+    public boolean hasKeystore()
+    {
+        return keystore != null && new File(keystore).exists();
+    }
+
+    private boolean hasTruststore()
+    {
+        return truststore != null && new File(truststore).exists();
+    }
+
+    @Override
+    public synchronized void initHotReloading()
+    {
+        boolean hasKeystore = hasKeystore();
+        boolean hasTruststore = hasTruststore();
+
+        if (hasKeystore || hasTruststore)
+        {
+            List<HotReloadableFile> fileList = new ArrayList<>();
+            if (hasKeystore)
+            {
+                fileList.add(new HotReloadableFile(keystore));
+            }
+            if (hasTruststore)
+            {
+                fileList.add(new HotReloadableFile(truststore));
+            }
+            hotReloadableFiles = fileList;
+        }
+    }
+
+    /**
+     * Validates the given keystore password.
+     *
+     * @param password           value
+     * @throws IllegalArgumentException if the {@code password} is empty as per the definition of {@link StringUtils#isEmpty(CharSequence)}
+     */
+    protected void validatePassword(String password)
+    {
+        boolean keystorePasswordEmpty = StringUtils.isEmpty(password);
+        if (keystorePasswordEmpty)
+        {
+            throw new IllegalArgumentException("'keystore_password' must be specified");
+        }
+    }
+
+    /**
+     * Builds required KeyManagerFactory from the file based keystore. It also checks for the PrivateKey's certificate's
+     * expiry and logs {@code warning} for each expired PrivateKey's certitificate.
+     *
+     * @return KeyManagerFactory built from the file based keystore.
+     * @throws SSLException if any issues encountered during the build process
+     */
+    @Override
+    protected KeyManagerFactory buildKeyManagerFactory() throws SSLException
+    {
+        /*
+         * Validation of the password is delayed until this point to allow nullable keystore passwords
+         * for other use-cases (CASSANDRA-18124).
+         */
+        validatePassword(keystore_password);
+
+        try (InputStream ksf = Files.newInputStream(File.getPath(keystore)))
+        {
+            final String algorithm = this.algorithm == null ? KeyManagerFactory.getDefaultAlgorithm() : this.algorithm;
+            KeyManagerFactory kmf = KeyManagerFactory.getInstance(algorithm);
+            KeyStore ks = KeyStore.getInstance(store_type);
+            ks.load(ksf, keystore_password.toCharArray());
+            if (!checkedExpiry)
+            {
+                checkExpiredCerts(ks);
+                checkedExpiry = true;
+            }
+            kmf.init(ks, keystore_password.toCharArray());
+            return kmf;
+        }
+        catch (Exception e)
+        {
+            throw new SSLException("failed to build key manager store for secure connections", e);
+        }
+    }
+
+    /**
+     * Builds TrustManagerFactory from the file based truststore.
+     *
+     * @return TrustManagerFactory from the file based truststore
+     * @throws SSLException if any issues encountered during the build process
+     */
+    @Override
+    protected TrustManagerFactory buildTrustManagerFactory() throws SSLException
+    {
+        try (InputStream tsf = Files.newInputStream(File.getPath(truststore)))
+        {
+            final String algorithm = this.algorithm == null ? TrustManagerFactory.getDefaultAlgorithm() : this.algorithm;
+            TrustManagerFactory tmf = TrustManagerFactory.getInstance(algorithm);
+            KeyStore ts = KeyStore.getInstance(store_type);
+
+            final char[] truststorePassword = StringUtils.isEmpty(truststore_password) ? null : truststore_password.toCharArray();
+            ts.load(tsf, truststorePassword);
+            tmf.init(ts);
+            return tmf;
+        }
+        catch (Exception e)
+        {
+            throw new SSLException("failed to build trust manager store for secure connections", e);
+        }
+    }
+
+    protected boolean checkExpiredCerts(KeyStore ks) throws KeyStoreException
+    {
+        boolean hasExpiredCerts = false;
+        final Date now = new Date(Clock.Global.currentTimeMillis());
+        for (Enumeration<String> aliases = ks.aliases(); aliases.hasMoreElements(); )
+        {
+            String alias = aliases.nextElement();
+            if (ks.getCertificate(alias).getType().equals("X.509"))
+            {
+                Date expires = ((X509Certificate) ks.getCertificate(alias)).getNotAfter();
+                if (expires.before(now))
+                {
+                    hasExpiredCerts = true;
+                    logger.warn("Certificate for {} expired on {}", alias, expires);
+                }
+            }
+        }
+        return hasExpiredCerts;
+    }
+
+    /**
+     * Helper class for hot reloading SSL Contexts
+     */
+    protected static class HotReloadableFile
+    {
+        private final File file;
+        private volatile long lastModTime;
+
+        HotReloadableFile(String path)
+        {
+            file = new File(path);
+            lastModTime = file.lastModified();
+        }
+
+        boolean shouldReload()
+        {
+            long curModTime = file.lastModified();
+            boolean result = curModTime != lastModTime;
+            lastModTime = curModTime;
+            return result;
+        }
+
+        @Override
+        public String toString()
+        {
+            return "HotReloadableFile{" +
+                   "file=" + file +
+                   ", lastModTime=" + lastModTime +
+                   '}';
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/security/ISslContextFactory.java b/src/java/org/apache/cassandra/security/ISslContextFactory.java
new file mode 100644
index 0000000..579c95e
--- /dev/null
+++ b/src/java/org/apache/cassandra/security/ISslContextFactory.java
@@ -0,0 +1,124 @@
+/*
+ * 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.security;
+
+import java.util.List;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLException;
+
+import io.netty.handler.ssl.CipherSuiteFilter;
+import io.netty.handler.ssl.SslContext;
+
+/**
+ * The purpose of this interface is to provide pluggable mechanism for creating custom JSSE and Netty SSLContext
+ * objects. Please use the Cassandra configuration key {@code ssl_context_factory} as part of {@code
+ * client_encryption_options}/{@code server_encryption_options} and provide a custom class-name implementing this
+ * interface with parameters to be used to plugin a your own way to load the SSLContext.
+ * <p>
+ * Implementation of this interface must have a constructor with argument of type {@code Map<String,Object>} to allow
+ * custom parameters, needed by the implementation, to be passed from the yaml configuration. Common SSL
+ * configurations like {@code protocol, algorithm, cipher_suites, accepted_protocols, require_client_auth,
+ * require_endpoint_verification, enabled, optional} will also be passed to that map by Cassanddra.
+ * <p>
+ * Since on top of Netty, Cassandra is internally using JSSE SSLContext also for certain use-cases- this interface
+ * has methods for both.
+ * <p>
+ * Below is an example of how to configure a custom implementation with parameters
+ * <pre>
+ * ssl_context_factory:
+ *       class_name: org.apache.cassandra.security.YourSslContextFactoryImpl
+ *       parameters:
+ *         key1: "value1"
+ *         key2: "value2"
+ *         key3: "value3"
+ * </pre>
+ */
+public interface ISslContextFactory
+{
+    /**
+     * Creates JSSE SSLContext.
+     *
+     * @param verifyPeerCertificate {@code true} if SSL peer's certificate needs to be verified; {@code false} otherwise
+     * @return JSSE's {@link SSLContext}
+     * @throws SSLException in case the Ssl Context creation fails for some reason
+     */
+    SSLContext createJSSESslContext(boolean verifyPeerCertificate) throws SSLException;
+
+    /**
+     * Creates Netty's SslContext object.
+     *
+     * @param verifyPeerCertificate {@code true} if SSL peer's certificate needs to be verified; {@code false} otherwise
+     * @param socketType            {@link SocketType} for Netty's Inbound or Outbound channels
+     * @param cipherFilter          to allow Netty's cipher suite filtering, e.g.
+     *                              {@link io.netty.handler.ssl.SslContextBuilder#ciphers(Iterable, CipherSuiteFilter)}
+     * @return Netty's {@link SslContext}
+     * @throws SSLException in case the Ssl Context creation fails for some reason
+     */
+    SslContext createNettySslContext(boolean verifyPeerCertificate, SocketType socketType,
+                                     CipherSuiteFilter cipherFilter) throws SSLException;
+
+    /**
+     * Initializes hot reloading of the security keys/certs. The implementation must guarantee this to be thread safe.
+     *
+     * @throws SSLException
+     */
+    void initHotReloading() throws SSLException;
+
+    /**
+     * Returns if any changes require the reloading of the SSL context returned by this factory.
+     * This will be called by Cassandra's periodic polling for any potential changes that will reload the SSL context.
+     * However only newer connections established after the reload will use the reloaded SSL context.
+     *
+     * @return {@code true} if SSL Context needs to be reload; {@code false} otherwise
+     */
+    boolean shouldReload();
+
+    /**
+     * Returns if this factory uses private keystore.
+     *
+     * @return {@code true} by default unless the implementation overrides this
+     */
+    default boolean hasKeystore()
+    {
+        return true;
+    }
+
+    /**
+     * Returns the prepared list of accepted protocols.
+     *
+     * @return array of protocol names suitable for passing to Netty's SslContextBuilder.protocols, or null if the
+     * default
+     */
+    List<String> getAcceptedProtocols();
+
+    /**
+     * Returns the list of cipher suites supported by the implementation.
+     *
+     * @return List of supported cipher suites
+     */
+    List<String> getCipherSuites();
+
+    /**
+     * Indicates if the process holds the inbound/listening (Server) end of the socket or the outbound side (Client).
+     */
+    enum SocketType
+    {
+        SERVER, CLIENT;
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/security/JKSKeyProvider.java b/src/java/org/apache/cassandra/security/JKSKeyProvider.java
index cea7b23..2fddf5e 100644
--- a/src/java/org/apache/cassandra/security/JKSKeyProvider.java
+++ b/src/java/org/apache/cassandra/security/JKSKeyProvider.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.security;
 
 import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.io.InputStream;
 import java.io.IOException;
 import java.security.Key;
@@ -28,6 +27,7 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.config.TransparentDataEncryptionOptions;
+import org.apache.cassandra.io.util.File;
 
 /**
  * A {@code KeyProvider} that retrieves keys from a java keystore.
@@ -48,7 +48,7 @@
     {
         this.options = options;
         logger.info("initializing keystore from file {}", options.get(PROP_KEYSTORE));
-        try (InputStream inputStream = Files.newInputStream(Paths.get(options.get(PROP_KEYSTORE))))
+        try (InputStream inputStream = Files.newInputStream(File.getPath(options.get(PROP_KEYSTORE))))
         {
             store = KeyStore.getInstance(options.get(PROP_KEYSTORE_TYPE));
             store.load(inputStream, options.get(PROP_KEYSTORE_PW).toCharArray());
diff --git a/src/java/org/apache/cassandra/security/PEMBasedSslContextFactory.java b/src/java/org/apache/cassandra/security/PEMBasedSslContextFactory.java
new file mode 100644
index 0000000..d62aef5
--- /dev/null
+++ b/src/java/org/apache/cassandra/security/PEMBasedSslContextFactory.java
@@ -0,0 +1,366 @@
+/*
+ * 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.security;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.security.GeneralSecurityException;
+import java.security.KeyStore;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.SSLException;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.io.util.File;
+
+
+/**
+ * SslContextFactory for the <a href="">PEM standard</a> encoded PKCS#8 private keys and X509 certificates/public-keys.
+ * It parses the key material based on the standard defined in the <a href="https://datatracker.ietf.org/doc/html/rfc7468">RFC 7468</a>.
+ * It creates <a href="https://datatracker.ietf.org/doc/html/rfc5208">PKCS# 8</a> based private key and X509 certificate(s)
+ * for the public key to build the required keystore and the truststore managers that are used for the SSL context creation.
+ * Internally it builds Java {@link KeyStore} with <a href="https://datatracker.ietf.org/doc/html/rfc7292">PKCS# 12</a> <a href="https://docs.oracle.com/en/java/javase/11/docs/specs/security/standard-names.html#keystore-types">store type</a>
+ * to be used for keystore and the truststore managers.
+ * <p>
+ * This factory also supports 'hot reloading' of the key material, the same way as defined by {@link FileBasedSslContextFactory},
+ * <b>if it is file based</b>. This factory ignores the existing 'store_type' configuration used for other file based store
+ * types like JKS.
+ * <p>
+ * You can configure this factory with either inline PEM data or with the files having the required PEM data as shown
+ * below,
+ *
+ * <b>Configuration: PEM keys/certs defined inline (mind the spaces in the YAML!)</b>
+ * <pre>
+ *     client/server_encryption_options:
+ *      ssl_context_factory:
+ *         class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+ *         parameters:
+ *             private_key: |
+ *              -----BEGIN ENCRYPTED PRIVATE KEY----- OR -----BEGIN PRIVATE KEY-----
+ *              <your base64 encoded private key>
+ *              -----END ENCRYPTED PRIVATE KEY----- OR -----END PRIVATE KEY-----
+ *              -----BEGIN CERTIFICATE-----
+ *              <your base64 encoded certificate chain>
+ *              -----END CERTIFICATE-----
+ *
+ *             private_key_password: "<your password if the private key is encrypted with a password>"
+ *
+ *             trusted_certificates: |
+ *               -----BEGIN CERTIFICATE-----
+ *               <your base64 encoded certificate>
+ *               -----END CERTIFICATE-----
+ * </pre>
+ *
+ * <b>Configuration: PEM keys/certs defined in files</b>
+ * <pre>
+ *     client/server_encryption_options:
+ *      ssl_context_factory:
+ *         class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+ *      keystore: <file path to the keystore file in the PEM format with the private key and the certificate chain>
+ *      keystore_password: "<your password if the private key is encrypted with a password>"
+ *      truststore: <file path to the truststore file in the PEM format>
+ * </pre>
+ */
+public final class PEMBasedSslContextFactory extends FileBasedSslContextFactory
+{
+    public static final String DEFAULT_TARGET_STORETYPE = "PKCS12";
+    private static final Logger logger = LoggerFactory.getLogger(PEMBasedSslContextFactory.class);
+    private String pemEncodedKey;
+    private String keyPassword;
+    private String pemEncodedCertificates;
+    private boolean maybeFileBasedPrivateKey;
+    private boolean maybeFileBasedTrustedCertificates;
+
+    public PEMBasedSslContextFactory()
+    {
+    }
+
+    public PEMBasedSslContextFactory(Map<String, Object> parameters)
+    {
+        super(parameters);
+        pemEncodedKey = getString(ConfigKey.ENCODED_KEY.getKeyName());
+        keyPassword = getString(ConfigKey.KEY_PASSWORD.getKeyName());
+        if (StringUtils.isEmpty(keyPassword))
+        {
+            keyPassword = keystore_password;
+        }
+        else if (!StringUtils.isEmpty(keystore_password) && !keyPassword.equals(keystore_password))
+        {
+            throw new IllegalArgumentException("'keystore_password' and 'key_password' both configurations are given and the " +
+                                               "values do not match");
+        }
+
+        if (!StringUtils.isEmpty(truststore_password))
+        {
+            logger.warn("PEM based truststore should not be using password. Ignoring the given value in " +
+                        "'truststore_password' configuration.");
+        }
+
+        pemEncodedCertificates = getString(ConfigKey.ENCODED_CERTIFICATES.getKeyName());
+
+        maybeFileBasedPrivateKey = StringUtils.isEmpty(pemEncodedKey);
+        maybeFileBasedTrustedCertificates = StringUtils.isEmpty(pemEncodedCertificates);
+
+        enforceSinglePrivateKeySource();
+        enforceSingleTurstedCertificatesSource();
+    }
+
+    /**
+     * Decides if this factory has a keystore defined - key material specified in files or inline to the configuration.
+     *
+     * @return {@code true} if there is a keystore defined; {@code false} otherwise
+     */
+    @Override
+    public boolean hasKeystore()
+    {
+        return maybeFileBasedPrivateKey ? keystoreFileExists() :
+               !StringUtils.isEmpty(pemEncodedKey);
+    }
+
+    /**
+     * Checks if the keystore file exists.
+     *
+     * @return {@code true} if keystore file exists; {@code false} otherwise
+     */
+    private boolean keystoreFileExists()
+    {
+        return keystore != null && new File(keystore).exists();
+    }
+
+    /**
+     * Decides if this factory has a truststore defined - key material specified in files or inline to the
+     * configuration.
+     *
+     * @return {@code true} if there is a truststore defined; {@code false} otherwise
+     */
+    private boolean hasTruststore()
+    {
+        return maybeFileBasedTrustedCertificates ? truststoreFileExists() :
+               !StringUtils.isEmpty(pemEncodedCertificates);
+    }
+
+    /**
+     * Checks if the truststore file exists.
+     *
+     * @return {@code true} if truststore file exists; {@code false} otherwise
+     */
+    private boolean truststoreFileExists()
+    {
+        return truststore != null && new File(truststore).exists();
+    }
+
+    /**
+     * This enables 'hot' reloading of the key/trust stores based on the last updated timestamps if they are file based.
+     */
+    @Override
+    public synchronized void initHotReloading()
+    {
+        List<HotReloadableFile> fileList = new ArrayList<>();
+        if (maybeFileBasedPrivateKey && hasKeystore())
+        {
+            fileList.add(new HotReloadableFile(keystore));
+        }
+        if (maybeFileBasedTrustedCertificates && hasTruststore())
+        {
+            fileList.add(new HotReloadableFile(truststore));
+        }
+        if (!fileList.isEmpty())
+        {
+            hotReloadableFiles = fileList;
+        }
+    }
+
+    /**
+     * Builds required KeyManagerFactory from the PEM based keystore. It also checks for the PrivateKey's certificate's
+     * expiry and logs {@code warning} for each expired PrivateKey's certitificate.
+     *
+     * @return KeyManagerFactory built from the PEM based keystore.
+     * @throws SSLException if any issues encountered during the build process
+     */
+    @Override
+    protected KeyManagerFactory buildKeyManagerFactory() throws SSLException
+    {
+        try
+        {
+            if (hasKeystore())
+            {
+                if (maybeFileBasedPrivateKey)
+                {
+                    pemEncodedKey = readPEMFile(keystore); // read PEM from the file
+                }
+
+                KeyManagerFactory kmf = KeyManagerFactory.getInstance(
+                algorithm == null ? KeyManagerFactory.getDefaultAlgorithm() : algorithm);
+                KeyStore ks = buildKeyStore();
+                if (!checkedExpiry)
+                {
+                    checkExpiredCerts(ks);
+                    checkedExpiry = true;
+                }
+                kmf.init(ks, keyPassword != null ? keyPassword.toCharArray() : null);
+                return kmf;
+            }
+            else
+            {
+                throw new SSLException("Must provide keystore or private_key in configuration for PEMBasedSSlContextFactory");
+            }
+        }
+        catch (Exception e)
+        {
+            throw new SSLException("Failed to build key manager store for secure connections", e);
+        }
+    }
+
+    /**
+     * Builds TrustManagerFactory from the PEM based truststore.
+     *
+     * @return TrustManagerFactory from the PEM based truststore
+     * @throws SSLException if any issues encountered during the build process
+     */
+    @Override
+    protected TrustManagerFactory buildTrustManagerFactory() throws SSLException
+    {
+        try
+        {
+            if (hasTruststore())
+            {
+                if (maybeFileBasedTrustedCertificates)
+                {
+                    pemEncodedCertificates = readPEMFile(truststore); // read PEM from the file
+                }
+
+                TrustManagerFactory tmf = TrustManagerFactory.getInstance(
+                algorithm == null ? TrustManagerFactory.getDefaultAlgorithm() : algorithm);
+                KeyStore ts = buildTrustStore();
+                tmf.init(ts);
+                return tmf;
+            }
+            else
+            {
+                throw new SSLException("Must provide truststore or trusted_certificates in configuration for " +
+                                       "PEMBasedSSlContextFactory");
+            }
+        }
+        catch (Exception e)
+        {
+            throw new SSLException("Failed to build trust manager store for secure connections", e);
+        }
+    }
+
+    private String readPEMFile(String file) throws IOException
+    {
+        return new String(Files.readAllBytes(File.getPath(file)));
+    }
+
+    /**
+     * Builds KeyStore object given the {@link #DEFAULT_TARGET_STORETYPE} out of the PEM formatted private key material.
+     * It uses {@code cassandra-ssl-keystore} as the alias for the created key-entry.
+     */
+    private KeyStore buildKeyStore() throws GeneralSecurityException, IOException
+    {
+        char[] keyPasswordArray = keyPassword != null ? keyPassword.toCharArray() : null;
+        PrivateKey privateKey = PEMReader.extractPrivateKey(pemEncodedKey, keyPassword);
+        Certificate[] certChainArray = PEMReader.extractCertificates(pemEncodedKey);
+        if (certChainArray == null || certChainArray.length == 0)
+        {
+            throw new SSLException("Could not read any certificates for the certChain for the private key");
+        }
+
+        KeyStore keyStore = KeyStore.getInstance(DEFAULT_TARGET_STORETYPE);
+        keyStore.load(null, null);
+        keyStore.setKeyEntry("cassandra-ssl-keystore", privateKey, keyPasswordArray, certChainArray);
+        return keyStore;
+    }
+
+    /**
+     * Builds KeyStore object given the {@link #DEFAULT_TARGET_STORETYPE} out of the PEM formatted certificates/public-key
+     * material.
+     * <p>
+     * It uses {@code cassandra-ssl-trusted-cert-<numeric-id>} as the alias for the created certificate-entry.
+     */
+    private KeyStore buildTrustStore() throws GeneralSecurityException, IOException
+    {
+        Certificate[] certChainArray = PEMReader.extractCertificates(pemEncodedCertificates);
+        if (certChainArray == null || certChainArray.length == 0)
+        {
+            throw new SSLException("Could not read any certificates from the given PEM");
+        }
+
+        KeyStore keyStore = KeyStore.getInstance(DEFAULT_TARGET_STORETYPE);
+        keyStore.load(null, null);
+        for (int i = 0; i < certChainArray.length; i++)
+        {
+            keyStore.setCertificateEntry("cassandra-ssl-trusted-cert-" + (i + 1), certChainArray[i]);
+        }
+        return keyStore;
+    }
+
+    /**
+     * Enforces that the configuration specified a sole source of loading private keys - either {@code keystore} (the
+     * actual file must exist) or {@code private_key}, not both.
+     */
+    private void enforceSinglePrivateKeySource()
+    {
+        if (keystoreFileExists() && !StringUtils.isEmpty(pemEncodedKey))
+        {
+            throw new IllegalArgumentException("Configuration must specify value for either keystore or private_key, " +
+                                               "not both for PEMBasedSSlContextFactory");
+        }
+    }
+
+    /**
+     * Enforces that the configuration specified a sole source of loading trusted certificates - either {@code
+     * truststore} (actual file must exist) or {@code trusted_certificates}, not both.
+     */
+    private void enforceSingleTurstedCertificatesSource()
+    {
+        if (truststoreFileExists() && !StringUtils.isEmpty(pemEncodedCertificates))
+        {
+            throw new IllegalArgumentException("Configuration must specify value for either truststore or " +
+                                               "trusted_certificates, not both for PEMBasedSSlContextFactory");
+        }
+    }
+
+    public enum ConfigKey
+    {
+        ENCODED_KEY("private_key"),
+        KEY_PASSWORD("private_key_password"),
+        ENCODED_CERTIFICATES("trusted_certificates");
+
+        final String keyName;
+
+        ConfigKey(String keyName)
+        {
+            this.keyName = keyName;
+        }
+
+        String getKeyName()
+        {
+            return keyName;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/security/PEMReader.java b/src/java/org/apache/cassandra/security/PEMReader.java
new file mode 100644
index 0000000..aaeeab8
--- /dev/null
+++ b/src/java/org/apache/cassandra/security/PEMReader.java
@@ -0,0 +1,283 @@
+/*
+ * 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.security;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.security.AlgorithmParameters;
+import java.security.GeneralSecurityException;
+import java.security.Key;
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.security.cert.CertificateFactory;
+import java.security.cert.X509Certificate;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.util.ArrayList;
+import java.util.Base64;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import javax.crypto.BadPaddingException;
+import javax.crypto.Cipher;
+import javax.crypto.EncryptedPrivateKeyInfo;
+import javax.crypto.SecretKeyFactory;
+import javax.crypto.spec.PBEKeySpec;
+
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.util.regex.Pattern.CASE_INSENSITIVE;
+
+/**
+ * This is a helper class to read private keys and X509 certifificates encoded based on <a href="https://datatracker.ietf.org/doc/html/rfc1421">PEM (RFC 1421)</a>
+ * format. It can read Password Based Encrypted (PBE henceforth) private keys as well as non-encrypted private keys
+ * along with the X509 certificates/cert-chain based on the textual encoding defined in the <a href="https://datatracker.ietf.org/doc/html/rfc7468">RFC 7468</a>
+ * <p>
+ * The input private key must be in PKCS#8 format.
+ * <p>
+ * It returns PKCS#8 formatted private key and X509 certificates.
+ */
+public final class PEMReader
+{
+    /**
+     * The private key can be with any of these algorithms in order for this read to successfully parse it.
+     * Currently, supported algorithms are,
+     * <pre>
+     *     RSA, DSA or EC
+     * </pre>
+     * The first one to be evaluated is RSA, being the most common for private keys.
+     */
+    public static final Set<String> SUPPORTED_PRIVATE_KEY_ALGORITHMS = ImmutableSet.of("RSA", "DSA", "EC");
+    private static final Logger logger = LoggerFactory.getLogger(PEMReader.class);
+    private static final Pattern CERT_PATTERN = Pattern.compile("-+BEGIN\\s+.*CERTIFICATE[^-]*-+(?:\\s|\\r|\\n)+([a-z0-9+/=\\r\\n]+)-+END\\s+.*CERTIFICATE[^-]*-+", CASE_INSENSITIVE);
+    private static final Pattern KEY_PATTERN = Pattern.compile("-+BEGIN\\s+.*PRIVATE\\s+KEY[^-]*-+(?:\\s|\\r|\\n)+([a-z0-9+/=\\r\\n]+)-+END\\s+.*PRIVATE\\s+KEY[^-]*-+", CASE_INSENSITIVE);
+
+    /**
+     * Extracts private key from the PEM content for the private key, assuming its not PBE.
+     *
+     * @param unencryptedPEMKey private key stored as PEM content
+     * @return {@link PrivateKey} upon successful reading of the private key
+     * @throws IOException              in case PEM reading fails
+     * @throws GeneralSecurityException in case any issue encountered while reading the private key
+     */
+    public static PrivateKey extractPrivateKey(String unencryptedPEMKey) throws IOException, GeneralSecurityException
+    {
+        return extractPrivateKey(unencryptedPEMKey, null);
+    }
+
+    /**
+     * Extracts private key from the Password Based Encrypted PEM content for the private key.
+     *
+     * @param pemKey      PBE private key stored as PEM content
+     * @param keyPassword password to be used for the private key decryption
+     * @return {@link PrivateKey} upon successful reading of the private key
+     * @throws IOException              in case PEM reading fails
+     * @throws GeneralSecurityException in case any issue encountered while reading the private key
+     */
+    public static PrivateKey extractPrivateKey(String pemKey, String keyPassword) throws IOException,
+                                                                                         GeneralSecurityException
+    {
+        PKCS8EncodedKeySpec keySpec;
+        String base64EncodedKey = extractBase64EncodedKey(pemKey);
+        byte[] derKeyBytes = decodeBase64(base64EncodedKey);
+
+        if (!StringUtils.isEmpty(keyPassword))
+        {
+            logger.debug("Encrypted key's length: {}, key's password length: {}",
+                         derKeyBytes.length, keyPassword.length());
+
+            EncryptedPrivateKeyInfo epki = new EncryptedPrivateKeyInfo(derKeyBytes);
+            logger.debug("Encrypted private key info's algorithm name: {}", epki.getAlgName());
+
+            AlgorithmParameters params = epki.getAlgParameters();
+            PBEKeySpec pbeKeySpec = new PBEKeySpec(keyPassword.toCharArray());
+            Key encryptionKey = SecretKeyFactory.getInstance(epki.getAlgName()).generateSecret(pbeKeySpec);
+            pbeKeySpec.clearPassword();
+            logger.debug("Key algorithm: {}, key format: {}", encryptionKey.getAlgorithm(), encryptionKey.getFormat());
+
+            Cipher cipher = Cipher.getInstance(epki.getAlgName());
+            cipher.init(Cipher.DECRYPT_MODE, encryptionKey, params);
+            byte[] rawKeyBytes;
+            try
+            {
+                rawKeyBytes = cipher.doFinal(epki.getEncryptedData());
+            }
+            catch (BadPaddingException e)
+            {
+                throw new GeneralSecurityException("Failed to decrypt the private key data. Either the password " +
+                                                   "provided for the key is wrong or the private key data is " +
+                                                   "corrupted. msg=" + e.getMessage(), e);
+            }
+            logger.debug("Decrypted private key's length: {}", rawKeyBytes.length);
+
+            keySpec = new PKCS8EncodedKeySpec(rawKeyBytes);
+        }
+        else
+        {
+            logger.debug("Key length: {}", derKeyBytes.length);
+            keySpec = new PKCS8EncodedKeySpec(derKeyBytes);
+        }
+
+        PrivateKey privateKey = null;
+
+        /*
+         * Ideally we can inspect the OID (Object Identifier) from the private key with ASN.1 parser and identify the
+         * actual algorithm of the private key. For doing that, we have to use some special library like BouncyCastle.
+         * However in the absence of that, below brute-force approach can work- that is to try out all the supported
+         * private key algorithms given that there are only three major algorithms to verify against.
+         */
+        for (String privateKeyAlgorithm : SUPPORTED_PRIVATE_KEY_ALGORITHMS)
+        {
+            try
+            {
+                privateKey = KeyFactory.getInstance(privateKeyAlgorithm).generatePrivate(keySpec);
+                logger.info("Parsing for the private key finished with {} algorithm.", privateKeyAlgorithm);
+                return privateKey;
+            }
+            catch (Exception e)
+            {
+                logger.debug("Failed to parse the private key with {} algorithm. Will try the other supported " +
+                             "algorithms.", privateKeyAlgorithm);
+            }
+        }
+        throw new GeneralSecurityException("The given private key could not be parsed with any of the supported " +
+                                           "algorithms. Please see PEMReader#SUPPORTED_PRIVATE_KEY_ALGORITHMS.");
+    }
+
+    /**
+     * Extracts the certificates/cert-chain from the PEM content.
+     *
+     * @param pemCerts certificates/cert-chain stored as PEM content
+     * @return X509 certiificate list
+     * @throws GeneralSecurityException in case any issue encountered while reading the certificates
+     */
+    public static Certificate[] extractCertificates(String pemCerts) throws GeneralSecurityException
+    {
+        List<Certificate> certificateList = new ArrayList<>();
+        List<String> base64EncodedCerts = extractBase64EncodedCerts(pemCerts);
+        for (String base64EncodedCertificate : base64EncodedCerts)
+        {
+            certificateList.add(generateCertificate(base64EncodedCertificate));
+        }
+        Certificate[] certificates = certificateList.toArray(new Certificate[0]);
+        return certificates;
+    }
+
+    /**
+     * Generates the X509 certificate object given the base64 encoded PEM content.
+     *
+     * @param base64Certificate base64 encoded PEM content for the certificate
+     * @return X509 certificate
+     * @throws GeneralSecurityException in case any issue encountered while reading the certificate
+     */
+    private static Certificate generateCertificate(String base64Certificate) throws GeneralSecurityException
+    {
+        byte[] decodedCertificateBytes = decodeBase64(base64Certificate);
+        CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
+        X509Certificate certificate =
+        (X509Certificate) certificateFactory.generateCertificate(new ByteArrayInputStream(decodedCertificateBytes));
+        logCertificateDetails(certificate);
+        return certificate;
+    }
+
+    /**
+     * Logs X509 certificate details for the debugging purpose with {@code INFO} level log.
+     * Namely, it prints - Subject DN, Issuer DN, Certificate serial number and the certificate expiry date which
+     * could be very valuable for debugging any certificate related issues.
+     *
+     * @param certificate certificate to log
+     */
+    private static void logCertificateDetails(X509Certificate certificate)
+    {
+        assert certificate != null;
+        logger.info("*********** Certificate Details *****************");
+        logger.info("Subject DN: {}", certificate.getSubjectDN());
+        logger.info("Issuer DN: {}", certificate.getIssuerDN());
+        logger.info("Serial Number: {}", certificate.getSerialNumber());
+        logger.info("Expiry: {}", certificate.getNotAfter());
+    }
+
+    /**
+     * Parses the PEM formatted private key based on the standard pattern specified by the <a href="https://datatracker.ietf.org/doc/html/rfc7468#section-11">RFC 7468</a>.
+     *
+     * @param pemKey private key stored as PEM content
+     * @return base64 string contained within the defined encapsulation boundaries by the above RFC
+     * @throws GeneralSecurityException in case any issue encountered while parsing the key
+     */
+    private static String extractBase64EncodedKey(String pemKey) throws GeneralSecurityException
+    {
+        Matcher matcher = KEY_PATTERN.matcher(pemKey);
+        if (matcher.find())
+        {
+            return matcher.group(1).replaceAll("\\s", "");
+        }
+        else
+        {
+            throw new GeneralSecurityException("Invalid private key format");
+        }
+    }
+
+    /**
+     * Parses the PEM formatted certificate/public-key based on the standard pattern specified by the
+     * <a href="https://datatracker.ietf.org/doc/html/rfc7468#section-13">RFC 7468</a>.
+     *
+     * @param pemCerts certificate/public-key stored as PEM content
+     * @return list of base64 encoded certificates within the defined encapsulation boundaries by the above RFC
+     * @throws GeneralSecurityException in case any issue encountered parsing the certificate
+     */
+    private static List<String> extractBase64EncodedCerts(String pemCerts) throws GeneralSecurityException
+    {
+        List<String> certificateList = new ArrayList<>();
+        Matcher matcher = CERT_PATTERN.matcher(pemCerts);
+        if (!matcher.find())
+        {
+            throw new GeneralSecurityException("Invalid certificate format");
+        }
+
+        for (int start = 0; matcher.find(start); start = matcher.end())
+        {
+            String certificate = matcher.group(1).replaceAll("\\s", "");
+            certificateList.add(certificate);
+        }
+        return certificateList;
+    }
+
+    /**
+     * Decodes given input in Base64 format.
+     *
+     * @param base64Input input to be decoded
+     * @return byte[] containing decoded bytes
+     * @throws GeneralSecurityException in case it fails to decode the given base64 input
+     */
+    private static byte[] decodeBase64(String base64Input) throws GeneralSecurityException
+    {
+        try
+        {
+            return Base64.getDecoder().decode(base64Input);
+        }
+        catch (IllegalArgumentException e)
+        {
+            throw new GeneralSecurityException("Failed to decode given base64 input. msg=" + e.getMessage(), e);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/security/SSLFactory.java b/src/java/org/apache/cassandra/security/SSLFactory.java
index 22f0a9d..e06da1f 100644
--- a/src/java/org/apache/cassandra/security/SSLFactory.java
+++ b/src/java/org/apache/cassandra/security/SSLFactory.java
@@ -18,48 +18,33 @@
 package org.apache.cassandra.security;
 
 
-import java.io.File;
 import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Paths;
-import java.security.KeyStore;
-import java.security.cert.X509Certificate;
 import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Date;
-import java.util.Enumeration;
 import java.util.List;
 import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
-import javax.net.ssl.KeyManagerFactory;
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 import javax.net.ssl.SSLParameters;
 import javax.net.ssl.SSLSocket;
-import javax.net.ssl.TrustManager;
-import javax.net.ssl.TrustManagerFactory;
 
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.ImmutableList;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import io.netty.buffer.ByteBufAllocator;
 import io.netty.handler.ssl.CipherSuiteFilter;
-import io.netty.handler.ssl.ClientAuth;
 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 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;
 
 /**
  * A Factory for providing and setting up client {@link SSLSocket}s. Also provides
@@ -73,18 +58,6 @@
 {
     private static final Logger logger = LoggerFactory.getLogger(SSLFactory.class);
 
-    /**
-     * Indicates if the process holds the inbound/listening end of the socket ({@link SocketType#SERVER})), or the
-     * outbound side ({@link SocketType#CLIENT}).
-     */
-    public enum SocketType
-    {
-        SERVER, CLIENT
-    }
-
-    @VisibleForTesting
-    static volatile boolean checkedExpiry = false;
-
     // Isolate calls to OpenSsl.isAvailable to allow in-jvm dtests to disable tcnative openssl
     // support.  It creates a circular reference that prevents the instance class loader from being
     // garbage collected.
@@ -111,11 +84,6 @@
     private static final ConcurrentHashMap<CacheKey, SslContext> cachedSslContexts = new ConcurrentHashMap<>();
 
     /**
-     * List of files that trigger hot reloading of SSL certificates
-     */
-    private static volatile List<HotReloadableFile> hotReloadableFiles = ImmutableList.of();
-
-    /**
      * Default initial delay for hot reloading
      */
     public static final int DEFAULT_HOT_RELOAD_INITIAL_DELAY_SEC = 600;
@@ -130,38 +98,6 @@
      */
     private static boolean isHotReloadingInitialized = false;
 
-    /**
-     * Helper class for hot reloading SSL Contexts
-     */
-    private static class HotReloadableFile
-    {
-        private final File file;
-        private volatile long lastModTime;
-
-        HotReloadableFile(String path)
-        {
-            file = new File(path);
-            lastModTime = file.lastModified();
-        }
-
-        boolean shouldReload()
-        {
-            long curModTime = file.lastModified();
-            boolean result = curModTime != lastModTime;
-            lastModTime = curModTime;
-            return result;
-        }
-
-        @Override
-        public String toString()
-        {
-            return "HotReloadableFile{" +
-                       "file=" + file +
-                       ", lastModTime=" + lastModTime +
-                       '}';
-        }
-    }
-
     /** Provides the list of protocols that would have been supported if "TLS" was selected as the
      * protocol before the change for CASSANDRA-13325 that expects explicit protocol versions.
      * @return list of enabled protocol names
@@ -185,100 +121,25 @@
     /**
      * Create a JSSE {@link SSLContext}.
      */
-    public static SSLContext createSSLContext(EncryptionOptions options, boolean buildTruststore) throws IOException
+    public static SSLContext createSSLContext(EncryptionOptions options, boolean verifyPeerCertificate) throws IOException
     {
-        TrustManager[] trustManagers = null;
-        if (buildTruststore)
-            trustManagers = buildTrustManagerFactory(options).getTrustManagers();
-
-        KeyManagerFactory kmf = buildKeyManagerFactory(options);
-
-        try
-        {
-            SSLContext ctx = SSLContext.getInstance("TLS");
-            ctx.init(kmf.getKeyManagers(), trustManagers, null);
-            return ctx;
-        }
-        catch (Exception e)
-        {
-            throw new IOException("Error creating/initializing the SSL Context", e);
-        }
-    }
-
-    static TrustManagerFactory buildTrustManagerFactory(EncryptionOptions options) throws IOException
-    {
-        try (InputStream tsf = Files.newInputStream(Paths.get(options.truststore)))
-        {
-            TrustManagerFactory tmf = TrustManagerFactory.getInstance(
-            options.algorithm == null ? TrustManagerFactory.getDefaultAlgorithm() : options.algorithm);
-            KeyStore ts = KeyStore.getInstance(options.store_type);
-            ts.load(tsf, options.truststore_password.toCharArray());
-            tmf.init(ts);
-            return tmf;
-        }
-        catch (Exception e)
-        {
-            throw new IOException("failed to build trust manager store for secure connections", e);
-        }
-    }
-
-    static KeyManagerFactory buildKeyManagerFactory(EncryptionOptions options) throws IOException
-    {
-        try (InputStream ksf = Files.newInputStream(Paths.get(options.keystore)))
-        {
-            KeyManagerFactory kmf = KeyManagerFactory.getInstance(
-            options.algorithm == null ? KeyManagerFactory.getDefaultAlgorithm() : options.algorithm);
-            KeyStore ks = KeyStore.getInstance(options.store_type);
-            ks.load(ksf, options.keystore_password.toCharArray());
-            if (!checkedExpiry)
-            {
-                for (Enumeration<String> aliases = ks.aliases(); aliases.hasMoreElements(); )
-                {
-                    String alias = aliases.nextElement();
-                    if (ks.getCertificate(alias).getType().equals("X.509"))
-                    {
-                        Date expires = ((X509Certificate) ks.getCertificate(alias)).getNotAfter();
-                        if (expires.before(new Date()))
-                            logger.warn("Certificate for {} expired on {}", alias, expires);
-                    }
-                }
-                checkedExpiry = true;
-            }
-            kmf.init(ks, options.keystore_password.toCharArray());
-            return kmf;
-        }
-        catch (Exception e)
-        {
-            throw new IOException("failed to build key manager store for secure connections", e);
-        }
+        return options.sslContextFactoryInstance.createJSSESslContext(verifyPeerCertificate);
     }
 
     /**
      * get a netty {@link SslContext} instance
      */
-    public static SslContext getOrCreateSslContext(EncryptionOptions options, boolean buildTruststore,
+    public static SslContext getOrCreateSslContext(EncryptionOptions options, boolean verifyPeerCertificate,
                                                    SocketType socketType) throws IOException
     {
-        return getOrCreateSslContext(options, buildTruststore, socketType, openSslIsAvailable());
-    }
-
-    /**
-     * Get a netty {@link SslContext} instance.
-     */
-    @VisibleForTesting
-    static SslContext getOrCreateSslContext(EncryptionOptions options,
-                                            boolean buildTruststore,
-                                            SocketType socketType,
-                                            boolean useOpenSsl) throws IOException
-    {
-        CacheKey key = new CacheKey(options, socketType, useOpenSsl);
+        CacheKey key = new CacheKey(options, socketType);
         SslContext sslContext;
 
         sslContext = cachedSslContexts.get(key);
         if (sslContext != null)
             return sslContext;
 
-        sslContext = createNettySslContext(options, buildTruststore, socketType, useOpenSsl);
+        sslContext = createNettySslContext(options, verifyPeerCertificate, socketType);
 
         SslContext previous = cachedSslContexts.putIfAbsent(key, sslContext);
         if (previous == null)
@@ -291,52 +152,21 @@
     /**
      * Create a Netty {@link SslContext}
      */
-    static SslContext createNettySslContext(EncryptionOptions options, boolean buildTruststore,
-                                            SocketType socketType, boolean useOpenSsl) throws IOException
+    static SslContext createNettySslContext(EncryptionOptions options, boolean verifyPeerCertificate,
+                                            SocketType socketType) throws IOException
     {
-        return createNettySslContext(options, buildTruststore, socketType, useOpenSsl,
+        return createNettySslContext(options, verifyPeerCertificate, socketType,
                                      LoggingCipherSuiteFilter.QUIET_FILTER);
     }
 
     /**
      * Create a Netty {@link SslContext} with a supplied cipherFilter
      */
-    static SslContext createNettySslContext(EncryptionOptions options, boolean buildTruststore,
-                                            SocketType socketType, boolean useOpenSsl, CipherSuiteFilter cipherFilter) throws IOException
+    static SslContext createNettySslContext(EncryptionOptions options, boolean verifyPeerCertificate,
+                                            SocketType socketType, CipherSuiteFilter cipherFilter) throws IOException
     {
-        /*
-            There is a case where the netty/openssl combo might not support using KeyManagerFactory. specifically,
-            I've seen this with the netty-tcnative dynamic openssl implementation. using the netty-tcnative static-boringssl
-            works fine with KeyManagerFactory. If we want to support all of the netty-tcnative options, we would need
-            to fall back to passing in a file reference for both a x509 and PKCS#8 private key file in PEM format (see
-            {@link SslContextBuilder#forServer(File, File, String)}). However, we are not supporting that now to keep
-            the config/yaml API simple.
-         */
-        KeyManagerFactory kmf = buildKeyManagerFactory(options);
-        SslContextBuilder builder;
-        if (socketType == SocketType.SERVER)
-        {
-            builder = SslContextBuilder.forServer(kmf);
-            builder.clientAuth(options.require_client_auth ? ClientAuth.REQUIRE : ClientAuth.NONE);
-        }
-        else
-        {
-            builder = SslContextBuilder.forClient().keyManager(kmf);
-        }
-
-        builder.sslProvider(useOpenSsl ? SslProvider.OPENSSL : SslProvider.JDK);
-
-        builder.protocols(options.acceptedProtocols());
-
-        // only set the cipher suites if the opertor has explicity configured values for it; else, use the default
-        // for each ssl implemention (jdk or openssl)
-        if (options.cipher_suites != null && !options.cipher_suites.isEmpty())
-            builder.ciphers(options.cipher_suites, cipherFilter);
-
-        if (buildTruststore)
-            builder.trustManager(buildTrustManagerFactory(options));
-
-        return builder.build();
+        return options.sslContextFactoryInstance.createNettySslContext(verifyPeerCertificate, socketType,
+                                                                       cipherFilter);
     }
 
     /**
@@ -351,21 +181,58 @@
         if (!isHotReloadingInitialized)
             throw new IllegalStateException("Hot reloading functionality has not been initialized.");
 
-        logger.debug("Checking whether certificates have been updated {}", hotReloadableFiles);
+        logger.debug("Checking whether certificates have been updated for server {} and client {}",
+                     serverOpts.sslContextFactoryInstance.getClass().getName(), clientOpts.sslContextFactoryInstance.getClass().getName());
 
-        if (hotReloadableFiles.stream().anyMatch(HotReloadableFile::shouldReload))
+        if (serverOpts != null)
         {
-            logger.info("SSL certificates have been updated. Reseting the ssl contexts for new connections.");
-            try
+            checkCertFilesForHotReloading(serverOpts, "server_encryption_options", true);
+        }
+        if (clientOpts != null)
+        {
+            checkCertFilesForHotReloading(clientOpts, "client_encryption_options", clientOpts.require_client_auth);
+        }
+    }
+
+    private static void checkCertFilesForHotReloading(EncryptionOptions options, String contextDescription,
+                                                      boolean verifyPeerCertificate)
+    {
+        try
+        {
+            if (options.sslContextFactoryInstance.shouldReload())
             {
-                validateSslCerts(serverOpts, clientOpts);
-                cachedSslContexts.clear();
-            }
-            catch(Exception e)
-            {
-                logger.error("Failed to hot reload the SSL Certificates! Please check the certificate files.", e);
+                logger.info("SSL certificates have been updated for {}. Resetting the ssl contexts for new " +
+                            "connections.", options.getClass().getName());
+                validateSslContext(contextDescription, options, verifyPeerCertificate, false);
+                clearSslContextCache(options);
             }
         }
+        catch(Exception e)
+        {
+            logger.error("Failed to hot reload the SSL Certificates! Please check the certificate files.", e);
+        }
+    }
+
+    /**
+     * This clears the cache of Netty's SslContext objects for Client and Server sockets. This is made publically
+     * available so that any {@link ISslContextFactory}'s implementation can call this to handle any special scenario
+     * to invalidate the SslContext cache.
+     * This should be used with caution since the purpose of this cache is save costly creation of Netty's SslContext
+     * objects and this essentially results in re-creating it.
+     */
+    public static void clearSslContextCache()
+    {
+        cachedSslContexts.clear();
+    }
+
+    private static void clearSslContextCache(EncryptionOptions options)
+    {
+        cachedSslContexts.forEachKey(1, cacheKey -> {
+            if (cacheKey.encryptionOptions.equals(options))
+            {
+                cachedSslContexts.remove(cacheKey);
+            }
+        });
     }
 
     /**
@@ -383,22 +250,14 @@
 
         logger.debug("Initializing hot reloading SSLContext");
 
-        List<HotReloadableFile> fileList = new ArrayList<>();
-
-        if (serverOpts != null && serverOpts.tlsEncryptionPolicy() != EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED)
-        {
-            fileList.add(new HotReloadableFile(serverOpts.keystore));
-            fileList.add(new HotReloadableFile(serverOpts.truststore));
+        if ( serverOpts != null && serverOpts.tlsEncryptionPolicy() != EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED) {
+            serverOpts.sslContextFactoryInstance.initHotReloading();
         }
 
-        if (clientOpts != null && clientOpts.tlsEncryptionPolicy() != EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED)
-        {
-            fileList.add(new HotReloadableFile(clientOpts.keystore));
-            fileList.add(new HotReloadableFile(clientOpts.truststore));
+        if ( clientOpts != null && clientOpts.tlsEncryptionPolicy() != EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED) {
+            clientOpts.sslContextFactoryInstance.initHotReloading();
         }
 
-        hotReloadableFiles = ImmutableList.copyOf(fileList);
-
         if (!isHotReloadingInitialized)
         {
             ScheduledExecutors.scheduledTasks
@@ -485,7 +344,7 @@
         return !string.equals("SSLv2Hello");
     }
 
-    public static void validateSslContext(String contextDescription, EncryptionOptions options, boolean buildTrustStore, boolean logProtocolAndCiphers) throws IOException
+    public static void validateSslContext(String contextDescription, EncryptionOptions options, boolean verifyPeerCertificate, boolean logProtocolAndCiphers) throws IOException
     {
         if (options != null && options.tlsEncryptionPolicy() != EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED)
         {
@@ -493,7 +352,7 @@
             {
                 CipherSuiteFilter loggingCipherSuiteFilter = logProtocolAndCiphers ? new LoggingCipherSuiteFilter(contextDescription)
                                                                                    : LoggingCipherSuiteFilter.QUIET_FILTER;
-                SslContext serverSslContext = createNettySslContext(options, buildTrustStore, SocketType.SERVER, openSslIsAvailable(), loggingCipherSuiteFilter);
+                SslContext serverSslContext = createNettySslContext(options, verifyPeerCertificate, SocketType.SERVER, loggingCipherSuiteFilter);
                 try
                 {
                     SSLEngine engine = serverSslContext.newEngine(ByteBufAllocator.DEFAULT);
@@ -538,7 +397,7 @@
                 }
 
                 // Make sure it is possible to build the client context too
-                SslContext clientSslContext = createNettySslContext(options, buildTrustStore, SocketType.CLIENT, openSslIsAvailable());
+                SslContext clientSslContext = createNettySslContext(options, verifyPeerCertificate, SocketType.CLIENT);
                 ReferenceCountUtil.release(clientSslContext);
             }
             catch (Exception e)
@@ -561,13 +420,11 @@
     {
         private final EncryptionOptions encryptionOptions;
         private final SocketType socketType;
-        private final boolean useOpenSSL;
 
-        public CacheKey(EncryptionOptions encryptionOptions, SocketType socketType, boolean useOpenSSL)
+        public CacheKey(EncryptionOptions encryptionOptions, SocketType socketType)
         {
             this.encryptionOptions = encryptionOptions;
             this.socketType = socketType;
-            this.useOpenSSL = useOpenSSL;
         }
 
         public boolean equals(Object o)
@@ -576,7 +433,6 @@
             if (o == null || getClass() != o.getClass()) return false;
             CacheKey cacheKey = (CacheKey) o;
             return (socketType == cacheKey.socketType &&
-                    useOpenSSL == cacheKey.useOpenSSL &&
                     Objects.equals(encryptionOptions, cacheKey.encryptionOptions));
         }
 
@@ -585,7 +441,6 @@
             int result = 0;
             result += 31 * socketType.hashCode();
             result += 31 * encryptionOptions.hashCode();
-            result += 31 * Boolean.hashCode(useOpenSSL);
             return result;
         }
     }
diff --git a/src/java/org/apache/cassandra/serializers/ListSerializer.java b/src/java/org/apache/cassandra/serializers/ListSerializer.java
index 35c3141..7a2f634 100644
--- a/src/java/org/apache/cassandra/serializers/ListSerializer.java
+++ b/src/java/org/apache/cassandra/serializers/ListSerializer.java
@@ -23,6 +23,7 @@
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.function.Predicate;
 
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.marshal.AbstractType;
@@ -132,6 +133,41 @@
         }
     }
 
+    public boolean anyMatch(ByteBuffer serializedList, Predicate<ByteBuffer> predicate)
+    {
+        return anyMatch(serializedList, ByteBufferAccessor.instance, predicate);
+    }
+
+    public <V> boolean anyMatch(V input, ValueAccessor<V> accessor, Predicate<V> predicate)
+    {
+        try
+        {
+            int s = readCollectionSize(input, accessor, ProtocolVersion.V3);
+            int offset = sizeOfCollectionSize(s, ProtocolVersion.V3);
+
+            for (int i = 0; i < s; i++)
+            {
+                int size = accessor.getInt(input, offset);
+                if (size < 0)
+                    continue;
+
+                offset += TypeSizes.INT_SIZE;
+
+                V value = accessor.slice(input, offset, size);
+
+                if (predicate.test(value))
+                    return true;
+
+                offset += size;
+            }
+            return false;
+        }
+        catch (BufferUnderflowException e)
+        {
+            throw new MarshalException("Not enough bytes to read a list");
+        }
+    }
+
     /**
      * Returns the element at the given index in a list.
      * @param input a serialized list
diff --git a/src/java/org/apache/cassandra/serializers/MapSerializer.java b/src/java/org/apache/cassandra/serializers/MapSerializer.java
index 9c0a001..2e363b4 100644
--- a/src/java/org/apache/cassandra/serializers/MapSerializer.java
+++ b/src/java/org/apache/cassandra/serializers/MapSerializer.java
@@ -24,7 +24,6 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.ByteBufferAccessor;
 import org.apache.cassandra.db.marshal.ValueComparators;
diff --git a/src/java/org/apache/cassandra/serializers/SetSerializer.java b/src/java/org/apache/cassandra/serializers/SetSerializer.java
index bd5e018..bf565be 100644
--- a/src/java/org/apache/cassandra/serializers/SetSerializer.java
+++ b/src/java/org/apache/cassandra/serializers/SetSerializer.java
@@ -24,7 +24,6 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
-import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.db.marshal.ByteBufferAccessor;
 import org.apache.cassandra.db.marshal.ValueComparators;
 import org.apache.cassandra.db.marshal.ValueAccessor;
diff --git a/src/java/org/apache/cassandra/serializers/TimeUUIDSerializer.java b/src/java/org/apache/cassandra/serializers/TimeUUIDSerializer.java
deleted file mode 100644
index 9cde1dd..0000000
--- a/src/java/org/apache/cassandra/serializers/TimeUUIDSerializer.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.serializers;
-
-import org.apache.cassandra.db.marshal.ValueAccessor;
-
-public class TimeUUIDSerializer extends UUIDSerializer
-{
-    public static final TimeUUIDSerializer instance = new TimeUUIDSerializer();
-
-    public <V> void validate(V value, ValueAccessor<V> accessor) throws MarshalException
-    {
-        super.validate(value, accessor);
-        // Super class only validates the Time UUID
-        // version is bits 4-7 of byte 6.
-        if (!accessor.isEmpty(value))
-        {
-            if ((accessor.getByte(value, 6) & 0xf0) != 0x10)
-                throw new MarshalException("Invalid version for TimeUUID type.");
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/serializers/TimestampSerializer.java b/src/java/org/apache/cassandra/serializers/TimestampSerializer.java
index 21cac66..71782e5 100644
--- a/src/java/org/apache/cassandra/serializers/TimestampSerializer.java
+++ b/src/java/org/apache/cassandra/serializers/TimestampSerializer.java
@@ -35,6 +35,8 @@
 import java.util.TimeZone;
 import java.util.regex.Pattern;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 
 public class TimestampSerializer extends TypeSerializer<Date>
 {
@@ -140,7 +142,7 @@
     public static long dateStringToTimestamp(String source) throws MarshalException
     {
         if (source.equalsIgnoreCase("now"))
-            return System.currentTimeMillis();
+            return currentTimeMillis();
 
         // Milliseconds since epoch?
         if (timestampPattern.matcher(source).matches())
diff --git a/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java b/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
index 7128277..ce28266 100644
--- a/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
+++ b/src/java/org/apache/cassandra/service/AbstractWriteResponseHandler.java
@@ -22,16 +22,20 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
-import java.util.stream.Collectors;
+import java.util.function.Supplier;
+
+import javax.annotation.Nullable;
 
 import org.apache.cassandra.db.ConsistencyLevel;
 
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.locator.EndpointsForToken;
 import org.apache.cassandra.locator.ReplicaPlan;
+import org.apache.cassandra.locator.ReplicaPlan.ForWrite;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.IMutation;
 import org.apache.cassandra.db.WriteType;
@@ -41,28 +45,41 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Message;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
+import static java.lang.Long.MAX_VALUE;
+import static java.lang.Math.min;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static java.util.stream.Collectors.toList;
+import static org.apache.cassandra.config.DatabaseDescriptor.getCounterWriteRpcTimeout;
+import static org.apache.cassandra.config.DatabaseDescriptor.getWriteRpcTimeout;
+import static org.apache.cassandra.db.WriteType.COUNTER;
+import static org.apache.cassandra.schema.Schema.instance;
+import static org.apache.cassandra.service.StorageProxy.WritePerformer;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 import static org.apache.cassandra.locator.Replicas.countInOurDc;
 
+
 public abstract class AbstractWriteResponseHandler<T> implements RequestCallback<T>
 {
     protected static final Logger logger = LoggerFactory.getLogger(AbstractWriteResponseHandler.class);
 
     //Count down until all responses and expirations have occured before deciding whether the ideal CL was reached.
     private AtomicInteger responsesAndExpirations;
-    private final SimpleCondition condition = new SimpleCondition();
-    protected final ReplicaPlan.ForTokenWrite replicaPlan;
+    private final Condition condition = newOneTimeCondition();
+    protected final ReplicaPlan.ForWrite replicaPlan;
 
     protected final Runnable callback;
     protected final WriteType writeType;
-    private static final AtomicIntegerFieldUpdater<AbstractWriteResponseHandler> failuresUpdater
-    = AtomicIntegerFieldUpdater.newUpdater(AbstractWriteResponseHandler.class, "failures");
+    private static final AtomicIntegerFieldUpdater<AbstractWriteResponseHandler> failuresUpdater =
+        AtomicIntegerFieldUpdater.newUpdater(AbstractWriteResponseHandler.class, "failures");
     private volatile int failures = 0;
     private final Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint;
     private final long queryStartNanoTime;
+    private @Nullable final Supplier<Mutation> hintOnFailure;
 
     /**
       * Delegate to another WriteResponseHandler or possibly this one to track if the ideal consistency level was reached.
@@ -79,16 +96,16 @@
 
     /**
      * @param callback           A callback to be called when the write is successful.
+     * @param hintOnFailure
      * @param queryStartNanoTime
      */
-    protected AbstractWriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan,
-                                           Runnable callback,
-                                           WriteType writeType,
-                                           long queryStartNanoTime)
+    protected AbstractWriteResponseHandler(ForWrite replicaPlan, Runnable callback, WriteType writeType,
+                                           Supplier<Mutation> hintOnFailure, long queryStartNanoTime)
     {
         this.replicaPlan = replicaPlan;
         this.callback = callback;
         this.writeType = writeType;
+        this.hintOnFailure = hintOnFailure;
         this.failureReasonByEndpoint = new ConcurrentHashMap<>();
         this.queryStartNanoTime = queryStartNanoTime;
     }
@@ -102,9 +119,9 @@
         {
             success = condition.await(timeoutNanos, NANOSECONDS);
         }
-        catch (InterruptedException ex)
+        catch (InterruptedException e)
         {
-            throw new AssertionError(ex);
+            throw new UncheckedInterruptedException(e);
         }
 
         if (!success)
@@ -127,10 +144,10 @@
 
     public final long currentTimeoutNanos()
     {
-        long requestTimeout = writeType == WriteType.COUNTER
-                              ? DatabaseDescriptor.getCounterWriteRpcTimeout(NANOSECONDS)
-                              : DatabaseDescriptor.getWriteRpcTimeout(NANOSECONDS);
-        return requestTimeout - (System.nanoTime() - queryStartNanoTime);
+        long requestTimeout = writeType == COUNTER
+                              ? getCounterWriteRpcTimeout(NANOSECONDS)
+                              : getWriteRpcTimeout(NANOSECONDS);
+        return requestTimeout - (nanoTime() - queryStartNanoTime);
     }
 
     /**
@@ -198,7 +215,7 @@
     {
         // During bootstrap, we have to include the pending endpoints or we may fail the consistency level
         // guarantees (see #833)
-        return replicaPlan.blockFor();
+        return replicaPlan.writeQuorum();
     }
 
     /**
@@ -264,6 +281,9 @@
 
         if (blockFor() + n > candidateReplicaCount())
             signal();
+
+        if (hintOnFailure != null && StorageProxy.shouldHint(replicaPlan.lookup(from)))
+            StorageProxy.submitHint(hintOnFailure.get(), replicaPlan.lookup(from), null);
     }
 
     @Override
@@ -284,13 +304,13 @@
         {
             // The condition being signaled is a valid proxy for the CL being achieved
             // Only mark it as failed if the requested CL was achieved.
-            if (!condition.isSignaled() && requestedCLAchieved)
+            if (!condition.isSignalled() && requestedCLAchieved)
             {
                 replicaPlan.keyspace().metric.writeFailedIdealCL.inc();
             }
             else
             {
-                replicaPlan.keyspace().metric.idealCLWriteLatency.addNano(System.nanoTime() - queryStartNanoTime);
+                replicaPlan.keyspace().metric.idealCLWriteLatency.addNano(nanoTime() - queryStartNanoTime);
             }
         }
     }
@@ -298,38 +318,38 @@
     /**
      * Cheap Quorum backup.  If we failed to reach quorum with our initial (full) nodes, reach out to other nodes.
      */
-    public void maybeTryAdditionalReplicas(IMutation mutation, StorageProxy.WritePerformer writePerformer, String localDC)
+    public void maybeTryAdditionalReplicas(IMutation mutation, WritePerformer writePerformer, String localDC)
     {
         EndpointsForToken uncontacted = replicaPlan.liveUncontacted();
         if (uncontacted.isEmpty())
             return;
 
-        long timeout = Long.MAX_VALUE;
+        long timeout = MAX_VALUE;
         List<ColumnFamilyStore> cfs = mutation.getTableIds().stream()
-                                              .map(Schema.instance::getColumnFamilyStoreInstance)
-                                              .collect(Collectors.toList());
+                                              .map(instance::getColumnFamilyStoreInstance)
+                                              .collect(toList());
         for (ColumnFamilyStore cf : cfs)
-            timeout = Math.min(timeout, cf.additionalWriteLatencyNanos);
+            timeout = min(timeout, cf.additionalWriteLatencyMicros);
 
         // no latency information, or we're overloaded
-        if (timeout > mutation.getTimeout(NANOSECONDS))
+        if (timeout > mutation.getTimeout(MICROSECONDS))
             return;
 
         try
         {
-            if (!condition.await(timeout, NANOSECONDS))
+            if (!condition.await(timeout, MICROSECONDS))
             {
                 for (ColumnFamilyStore cf : cfs)
                     cf.metric.additionalWrites.inc();
 
-                writePerformer.apply(mutation, replicaPlan.withContact(uncontacted),
+                writePerformer.apply(mutation, replicaPlan.withContacts(uncontacted),
                                      (AbstractWriteResponseHandler<IMutation>) this,
                                      localDC);
             }
         }
-        catch (InterruptedException ex)
+        catch (InterruptedException e)
         {
-            throw new AssertionError(ex);
+            throw new UncheckedInterruptedException(e);
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/service/ActiveRepairService.java b/src/java/org/apache/cassandra/service/ActiveRepairService.java
index e3ec218..a0716b1 100644
--- a/src/java/org/apache/cassandra/service/ActiveRepairService.java
+++ b/src/java/org/apache/cassandra/service/ActiveRepairService.java
@@ -20,9 +20,15 @@
 import java.io.IOException;
 import java.net.UnknownHostException;
 import java.util.*;
-import java.util.concurrent.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import javax.management.openmbean.CompositeData;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -32,22 +38,31 @@
 import com.google.common.cache.CacheBuilder;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
-import com.google.common.util.concurrent.AbstractFuture;
-import com.google.common.util.concurrent.ListeningExecutorService;
-import com.google.common.util.concurrent.MoreExecutors;
 
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.locator.AbstractReplicationStrategy;
 import org.apache.cassandra.locator.EndpointsByRange;
 import org.apache.cassandra.locator.EndpointsForRange;
+import org.apache.cassandra.utils.ExecutorUtils;
+import org.apache.cassandra.repair.state.CoordinatorState;
+import org.apache.cassandra.repair.state.ParticipateState;
+import org.apache.cassandra.repair.state.ValidationState;
+import org.apache.cassandra.utils.Simulate;
+import org.apache.cassandra.locator.EndpointsForToken;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
@@ -70,6 +85,9 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.repair.CommonRange;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
+import org.apache.cassandra.service.paxos.PaxosRepair;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanup;
 import org.apache.cassandra.repair.RepairJobDesc;
 import org.apache.cassandra.repair.RepairParallelism;
 import org.apache.cassandra.repair.RepairSession;
@@ -87,15 +105,27 @@
 import org.apache.cassandra.repair.messages.SyncResponse;
 import org.apache.cassandra.repair.messages.ValidationResponse;
 import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MBeanWrapper;
+import org.apache.cassandra.utils.MerkleTrees;
 import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 
 import static com.google.common.collect.Iterables.concat;
 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.Config.RepairCommandPoolFullStrategy.reject;
+import static org.apache.cassandra.config.DatabaseDescriptor.*;
+import static org.apache.cassandra.net.Message.out;
 import static org.apache.cassandra.net.Verb.PREPARE_MSG;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Simulate.With.MONITORS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
 
 /**
  * ActiveRepairService is the starting point for manual "active" repairs.
@@ -111,9 +141,9 @@
  * The creation of a repair session is done through the submitRepairSession that
  * returns a future on the completion of that session.
  */
+@Simulate(with = MONITORS)
 public class ActiveRepairService implements IEndpointStateChangeSubscriber, IFailureDetectionEventListener, ActiveRepairServiceMBean
 {
-
     public enum ParentRepairStatus
     {
         IN_PROGRESS, COMPLETED, FAILED
@@ -134,14 +164,20 @@
     public static final ActiveRepairService instance = new ActiveRepairService(FailureDetector.instance, Gossiper.instance);
 
     public static final long UNREPAIRED_SSTABLE = 0;
-    public static final UUID NO_PENDING_REPAIR = null;
+    public static final TimeUUID NO_PENDING_REPAIR = null;
 
     /**
      * A map of active coordinator session.
      */
-    private final ConcurrentMap<UUID, RepairSession> sessions = new ConcurrentHashMap<>();
+    private final ConcurrentMap<TimeUUID, RepairSession> sessions = new ConcurrentHashMap<>();
 
-    private final ConcurrentMap<UUID, ParentRepairSession> parentRepairSessions = new ConcurrentHashMap<>();
+    private final ConcurrentMap<TimeUUID, ParentRepairSession> parentRepairSessions = new ConcurrentHashMap<>();
+    // map of top level repair id (parent repair id) -> state
+    private final Cache<TimeUUID, CoordinatorState> repairs;
+    // map of top level repair id (parent repair id) -> participate state
+    private final Cache<TimeUUID, ParticipateState> participates;
+
+    private volatile ScheduledFuture<?> irCleanup;
 
     static
     {
@@ -150,46 +186,23 @@
 
     public static class RepairCommandExecutorHandle
     {
-        private static final ThreadPoolExecutor repairCommandExecutor =
-            initializeExecutor(DatabaseDescriptor.getRepairCommandPoolSize(),
-                               DatabaseDescriptor.getRepairCommandPoolFullStrategy());
+        private static final ExecutorPlus repairCommandExecutor = initializeExecutor(getRepairCommandPoolSize(), getRepairCommandPoolFullStrategy());
     }
 
     @VisibleForTesting
-    static ThreadPoolExecutor initializeExecutor(int maxPoolSize, Config.RepairCommandPoolFullStrategy strategy)
+    static ExecutorPlus initializeExecutor(int maxPoolSize, Config.RepairCommandPoolFullStrategy strategy)
     {
-        int corePoolSize = 1;
-        BlockingQueue<Runnable> queue;
-        if (strategy == Config.RepairCommandPoolFullStrategy.reject)
-        {
-            // new threads will be created on demand up to max pool
-            // size so we can leave corePoolSize at 1 to start with
-            queue = new SynchronousQueue<>();
-        }
-        else
-        {
-            // new threads are only created if > corePoolSize threads are running
-            // and the queue is full, so set corePoolSize to the desired max as the
-            // queue will _never_ be full. Idle core threads will eventually time
-            // out and may be re-created if/when subsequent tasks are submitted.
-            corePoolSize = maxPoolSize;
-            queue = new LinkedBlockingQueue<>();
-        }
-
-        ThreadPoolExecutor executor = new JMXEnabledThreadPoolExecutor(corePoolSize,
-                                                                       maxPoolSize,
-                                                                       1,
-                                                                       TimeUnit.HOURS,
-                                                                       queue,
-                                                                       new NamedThreadFactory("Repair-Task"),
-                                                                       "internal",
-                                                                       new ThreadPoolExecutor.AbortPolicy());
-        // allow idle core threads to be terminated
-        executor.allowCoreThreadTimeOut(true);
-        return executor;
+        return executorFactory()
+               .localAware()       // we do trace repair sessions, and seem to rely on local aware propagation (though could do with refactoring)
+               .withJmxInternal()
+               .configurePooled("Repair-Task", maxPoolSize)
+               .withKeepAlive(1, TimeUnit.HOURS)
+               .withQueueLimit(strategy == reject ? 0 : Integer.MAX_VALUE)
+               .withRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy())
+               .build();
     }
 
-    public static ThreadPoolExecutor repairCommandExecutor()
+    public static ExecutorPlus repairCommandExecutor()
     {
         return RepairCommandExecutorHandle.repairCommandExecutor;
     }
@@ -198,10 +211,9 @@
     private final Gossiper gossiper;
     private final Cache<Integer, Pair<ParentRepairStatus, List<String>>> repairStatusByCmd;
 
-    public final DebuggableThreadPoolExecutor snapshotExecutor = DebuggableThreadPoolExecutor.createWithMaximumPoolSize("RepairSnapshotExecutor",
-                                                                                                                        1,
-                                                                                                                        1,
-                                                                                                                        TimeUnit.HOURS);
+    public final ExecutorPlus snapshotExecutor = executorFactory().configurePooled("RepairSnapshotExecutor", 1)
+                                                                  .withKeepAlive(1, TimeUnit.HOURS)
+                                                                  .build();
 
     public ActiveRepairService(IFailureDetector failureDetector, Gossiper gossiper)
     {
@@ -217,19 +229,42 @@
                                              .maximumSize(Long.getLong("cassandra.parent_repair_status_cache_size", 100_000))
                                              .build();
 
+        DurationSpec.LongNanosecondsBound duration = getRepairStateExpires();
+        int numElements = getRepairStateSize();
+        logger.info("Storing repair state for {} or for {} elements", duration, numElements);
+        repairs = CacheBuilder.newBuilder()
+                              .expireAfterWrite(duration.quantity(), duration.unit())
+                              .maximumSize(numElements)
+                              .build();
+        participates = CacheBuilder.newBuilder()
+                                   .expireAfterWrite(duration.quantity(), duration.unit())
+                                   .maximumSize(numElements)
+                                   .build();
+
         MBeanWrapper.instance.registerMBean(this, MBEAN_NAME);
     }
 
     public void start()
     {
         consistent.local.start();
-        ScheduledExecutors.optionalTasks.scheduleAtFixedRate(consistent.local::cleanup, 0,
-                                                             LocalSessions.CLEANUP_INTERVAL,
-                                                             TimeUnit.SECONDS);
+        this.irCleanup = ScheduledExecutors.optionalTasks.scheduleAtFixedRate(consistent.local::cleanup, 0,
+                                                                              LocalSessions.CLEANUP_INTERVAL,
+                                                                              TimeUnit.SECONDS);
+    }
+
+    @VisibleForTesting
+    public void clearLocalRepairState()
+    {
+        // .cleanUp() doesn't clear, it looks to only run gc on things that could be removed... this method should remove all state
+        repairs.asMap().clear();
+        participates.asMap().clear();
     }
 
     public void stop()
     {
+        ScheduledFuture<?> irCleanup = this.irCleanup;
+        if (irCleanup != null)
+            irCleanup.cancel(false);
         consistent.local.stop();
     }
 
@@ -243,20 +278,32 @@
     @Override
     public void failSession(String session, boolean force)
     {
-        UUID sessionID = UUID.fromString(session);
+        TimeUUID sessionID = TimeUUID.fromString(session);
         consistent.local.cancelSession(sessionID, force);
     }
 
-    @Override
+    @Deprecated
     public void setRepairSessionSpaceInMegabytes(int sizeInMegabytes)
     {
-        DatabaseDescriptor.setRepairSessionSpaceInMegabytes(sizeInMegabytes);
+        DatabaseDescriptor.setRepairSessionSpaceInMiB(sizeInMegabytes);
+    }
+
+    @Deprecated
+    public int getRepairSessionSpaceInMegabytes()
+    {
+        return DatabaseDescriptor.getRepairSessionSpaceInMiB();
     }
 
     @Override
-    public int getRepairSessionSpaceInMegabytes()
+    public void setRepairSessionSpaceInMebibytes(int sizeInMebibytes)
     {
-        return DatabaseDescriptor.getRepairSessionSpaceInMegabytes();
+        DatabaseDescriptor.setRepairSessionSpaceInMiB(sizeInMebibytes);
+    }
+
+    @Override
+    public int getRepairSessionSpaceInMebibytes()
+    {
+        return DatabaseDescriptor.getRepairSessionSpaceInMiB();
     }
 
     public List<CompositeData> getRepairStats(List<String> schemaArgs, String rangeString)
@@ -329,7 +376,7 @@
      *
      * @return Future for asynchronous call or null if there is no need to repair
      */
-    public RepairSession submitRepairSession(UUID parentRepairSession,
+    public RepairSession submitRepairSession(TimeUUID parentRepairSession,
                                              CommonRange range,
                                              String keyspace,
                                              RepairParallelism parallelismDegree,
@@ -337,18 +384,24 @@
                                              boolean pullRepair,
                                              PreviewKind previewKind,
                                              boolean optimiseStreams,
-                                             ListeningExecutorService executor,
+                                             boolean repairPaxos,
+                                             boolean paxosOnly,
+                                             ExecutorPlus executor,
                                              String... cfnames)
     {
+        if (repairPaxos && previewKind != PreviewKind.NONE)
+            throw new IllegalArgumentException("cannot repair paxos in a preview repair");
+
         if (range.endpoints.isEmpty())
             return null;
 
         if (cfnames.length == 0)
             return null;
 
-        final RepairSession session = new RepairSession(parentRepairSession, UUIDGen.getTimeUUID(), range, keyspace,
+        final RepairSession session = new RepairSession(parentRepairSession, range, keyspace,
                                                         parallelismDegree, isIncremental, pullRepair,
-                                                        previewKind, optimiseStreams, cfnames);
+                                                        previewKind, optimiseStreams, repairPaxos, paxosOnly, cfnames);
+        repairs.getIfPresent(parentRepairSession).register(session.state);
 
         sessions.put(session.getId(), session);
         // register listeners
@@ -358,17 +411,10 @@
             LocalSessions.registerListener(session);
 
         // remove session at completion
-        session.addListener(new Runnable()
-        {
-            /**
-             * When repair finished, do clean up
-             */
-            public void run()
-            {
-                sessions.remove(session.getId());
-                LocalSessions.unregisterListener(session);
-            }
-        }, MoreExecutors.directExecutor());
+        session.addListener(() -> {
+            sessions.remove(session.getId());
+            LocalSessions.unregisterListener(session);
+        });
         session.start(executor);
         return session;
     }
@@ -383,7 +429,7 @@
         DatabaseDescriptor.useOffheapMerkleTrees(value);
     }
 
-    private <T extends AbstractFuture &
+    private <T extends Future &
                IEndpointStateChangeSubscriber &
                IFailureDetectionEventListener> void registerOnFdAndGossip(final T task)
     {
@@ -401,7 +447,7 @@
                 failureDetector.unregisterFailureDetectionEventListener(task);
                 gossiper.unregister(task);
             }
-        }, MoreExecutors.directExecutor());
+        });
     }
 
     public synchronized void terminateSessions()
@@ -420,7 +466,8 @@
     }
 
 
-    Pair<ParentRepairStatus, List<String>> getRepairStatus(Integer cmd)
+    @VisibleForTesting
+    public Pair<ParentRepairStatus, List<String>> getRepairStatus(Integer cmd)
     {
         return repairStatusByCmd.getIfPresent(cmd);
     }
@@ -428,16 +475,15 @@
     /**
      * Return all of the neighbors with whom we share the provided range.
      *
-     * @param keyspaceName keyspace to repair
+     * @param keyspaceName        keyspace to repair
      * @param keyspaceLocalRanges local-range for given keyspaceName
-     * @param toRepair token to repair
-     * @param dataCenters the data centers to involve in the repair
-     *
+     * @param toRepair            token to repair
+     * @param dataCenters         the data centers to involve in the repair
      * @return neighbors with whom we share the provided range
      */
     public static EndpointsForRange getNeighbors(String keyspaceName, Iterable<Range<Token>> keyspaceLocalRanges,
-                                          Range<Token> toRepair, Collection<String> dataCenters,
-                                          Collection<String> hosts)
+                                                 Range<Token> toRepair, Collection<String> dataCenters,
+                                                 Collection<String> hosts)
     {
         StorageService ss = StorageService.instance;
         EndpointsByRange replicaSets = ss.getRangeToAddressMap(keyspaceName);
@@ -514,17 +560,17 @@
         // we only want to set repairedAt for incremental repairs including all replicas for a token range. For non-global incremental repairs, full repairs, the UNREPAIRED_SSTABLE value will prevent
         // sstables from being promoted to repaired or preserve the repairedAt/pendingRepair values, respectively. For forced repairs, repairedAt time is only set to UNREPAIRED_SSTABLE if we actually
         // end up skipping replicas
-        if (options.isIncremental() && options.isGlobal() && ! force)
+        if (options.isIncremental() && options.isGlobal() && !force)
         {
-            return System.currentTimeMillis();
+            return currentTimeMillis();
         }
         else
         {
-            return  ActiveRepairService.UNREPAIRED_SSTABLE;
+            return ActiveRepairService.UNREPAIRED_SSTABLE;
         }
     }
 
-    public static boolean verifyCompactionsPendingThreshold(UUID parentRepairSession, PreviewKind previewKind)
+    public static boolean verifyCompactionsPendingThreshold(TimeUUID parentRepairSession, PreviewKind previewKind)
     {
         // Snapshot values so failure message is consistent with decision
         int pendingCompactions = CompactionManager.instance.getPendingTasks();
@@ -532,28 +578,29 @@
         if (pendingCompactions > pendingThreshold)
         {
             logger.error("[{}] Rejecting incoming repair, pending compactions ({}) above threshold ({})",
-                          previewKind.logPrefix(parentRepairSession), pendingCompactions, pendingThreshold);
+                         previewKind.logPrefix(parentRepairSession), pendingCompactions, pendingThreshold);
             return false;
         }
         return true;
     }
 
-    public UUID prepareForRepair(UUID parentRepairSession, InetAddressAndPort coordinator, Set<InetAddressAndPort> endpoints, RepairOption options, boolean isForcedRepair, List<ColumnFamilyStore> columnFamilyStores)
+    public TimeUUID prepareForRepair(TimeUUID parentRepairSession, InetAddressAndPort coordinator, Set<InetAddressAndPort> endpoints, RepairOption options, boolean isForcedRepair, List<ColumnFamilyStore> columnFamilyStores)
     {
         if (!verifyCompactionsPendingThreshold(parentRepairSession, options.getPreviewKind()))
             failRepair(parentRepairSession, "Rejecting incoming repair, pending compactions above threshold"); // failRepair throws exception
 
         long repairedAt = getRepairedAt(options, isForcedRepair);
         registerParentRepairSession(parentRepairSession, coordinator, columnFamilyStores, options.getRanges(), options.isIncremental(), repairedAt, options.isGlobal(), options.getPreviewKind());
-        final CountDownLatch prepareLatch = new CountDownLatch(endpoints.size());
+        final CountDownLatch prepareLatch = newCountDownLatch(endpoints.size());
         final AtomicBoolean status = new AtomicBoolean(true);
-        final Set<String> failedNodes = Collections.synchronizedSet(new HashSet<String>());
+        final Set<String> failedNodes = synchronizedSet(new HashSet<String>());
+        final AtomicInteger timeouts = new AtomicInteger(0);
         RequestCallback callback = new RequestCallback()
         {
             @Override
             public void onResponse(Message msg)
             {
-                prepareLatch.countDown();
+                prepareLatch.decrement();
             }
 
             @Override
@@ -561,7 +608,9 @@
             {
                 status.set(false);
                 failedNodes.add(from.toString());
-                prepareLatch.countDown();
+                if (failureReason == RequestFailureReason.TIMEOUT)
+                    timeouts.incrementAndGet();
+                prepareLatch.decrement();
             }
 
             @Override
@@ -575,12 +624,13 @@
         for (ColumnFamilyStore cfs : columnFamilyStores)
             tableIds.add(cfs.metadata.id);
 
+        PrepareMessage message = new PrepareMessage(parentRepairSession, tableIds, options.getRanges(), options.isIncremental(), repairedAt, options.isGlobal(), options.getPreviewKind());
+        register(new ParticipateState(FBUtilities.getBroadcastAddressAndPort(), message));
         for (InetAddressAndPort neighbour : endpoints)
         {
             if (FailureDetector.instance.isAlive(neighbour))
             {
-                PrepareMessage message = new PrepareMessage(parentRepairSession, tableIds, options.getRanges(), options.isIncremental(), repairedAt, options.isGlobal(), options.getPreviewKind());
-                Message<RepairMessage> msg = Message.out(PREPARE_MSG, message);
+                Message<RepairMessage> msg = out(PREPARE_MSG, message);
                 MessagingService.instance().sendWithCallback(msg, neighbour, callback);
             }
             else
@@ -589,19 +639,18 @@
                 // remaining ones go down, we still want to fail so we don't create repair sessions that can't complete
                 if (isForcedRepair && !options.isIncremental())
                 {
-                    prepareLatch.countDown();
+                    prepareLatch.decrement();
                 }
                 else
                 {
                     // bailout early to avoid potentially waiting for a long time.
                     failRepair(parentRepairSession, "Endpoint not alive: " + neighbour);
                 }
-
             }
         }
         try
         {
-            if (!prepareLatch.await(DatabaseDescriptor.getRpcTimeout(TimeUnit.MILLISECONDS), TimeUnit.MILLISECONDS))
+            if (!prepareLatch.await(getRpcTimeout(MILLISECONDS), MILLISECONDS) || timeouts.get() > 0)
                 failRepair(parentRepairSession, "Did not get replies from all endpoints.");
         }
         catch (InterruptedException e)
@@ -622,7 +671,7 @@
      * endpoint's cache.
      * This method does not throw an exception in case of a messaging failure.
      */
-    public void cleanUp(UUID parentRepairSession, Set<InetAddressAndPort> endpoints)
+    public void cleanUp(TimeUUID parentRepairSession, Set<InetAddressAndPort> endpoints)
     {
         for (InetAddressAndPort endpoint : endpoints)
         {
@@ -645,8 +694,8 @@
                         public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason)
                         {
                             logger.debug("Failed to clean up parent repair session {} on {}. The uncleaned sessions will " +
-                                    "be removed on a node restart. This should not be a problem unless you see thousands " +
-                                    "of messages like this.", parentRepairSession, endpoint);
+                                         "be removed on a node restart. This should not be a problem unless you see thousands " +
+                                         "of messages like this.", parentRepairSession, endpoint);
                         }
                     };
 
@@ -658,14 +707,21 @@
                 logger.warn("Failed to send a clean up message to {}", endpoint, exc);
             }
         }
+        ParticipateState state = participate(parentRepairSession);
+        if (state != null)
+            state.phase.success("Cleanup message recieved");
     }
 
-    private void failRepair(UUID parentRepairSession, String errorMsg) {
+    private void failRepair(TimeUUID parentRepairSession, String errorMsg)
+    {
+        ParticipateState state = participate(parentRepairSession);
+        if (state != null)
+            state.phase.fail(errorMsg);
         removeParentRepairSession(parentRepairSession);
         throw new RuntimeException(errorMsg);
     }
 
-    public synchronized void registerParentRepairSession(UUID parentRepairSession, InetAddressAndPort coordinator, List<ColumnFamilyStore> columnFamilyStores, Collection<Range<Token>> ranges, boolean isIncremental, long repairedAt, boolean isGlobal, PreviewKind previewKind)
+    public synchronized void registerParentRepairSession(TimeUUID parentRepairSession, InetAddressAndPort coordinator, List<ColumnFamilyStore> columnFamilyStores, Collection<Range<Token>> ranges, boolean isIncremental, long repairedAt, boolean isGlobal, PreviewKind previewKind)
     {
         assert isIncremental || repairedAt == ActiveRepairService.UNREPAIRED_SSTABLE;
         if (!registeredForEndpointChanges)
@@ -681,27 +737,34 @@
         }
     }
 
-    public ParentRepairSession getParentRepairSession(UUID parentSessionId)
+    /**
+     * We assume when calling this method that a parent session for the provided identifier
+     * exists, and that session is still in progress. When it doesn't, that should mean either
+     * {@link #abort(Predicate, String)} or {@link #failRepair(TimeUUID, String)} have removed it.
+     *
+     * @param parentSessionId an identifier for an active parent repair session
+     * @return the {@link ParentRepairSession} associated with the provided identifier
+     * @throws NoSuchRepairSessionException if the provided identifier does not map to an active parent session
+     */
+    public ParentRepairSession getParentRepairSession(TimeUUID parentSessionId) throws NoSuchRepairSessionException
     {
         ParentRepairSession session = parentRepairSessions.get(parentSessionId);
-        // this can happen if a node thinks that the coordinator was down, but that coordinator got back before noticing
-        // that it was down itself.
         if (session == null)
-            throw new RuntimeException("Parent repair session with id = " + parentSessionId + " has failed.");
+            throw new NoSuchRepairSessionException(parentSessionId);
 
         return session;
     }
 
     /**
      * called when the repair session is done - either failed or anticompaction has completed
-     *
+     * <p>
      * clears out any snapshots created by this repair
      *
-     * @param parentSessionId id of parent session
-     * @return parent session of given id or null if there is not such
-     * @see org.apache.cassandra.db.repair.CassandraTableRepairManager#snapshot(String, Collection, boolean) 
+     * @param parentSessionId an identifier for an active parent repair session
+     * @return the {@link ParentRepairSession} associated with the provided identifier
+     * @see org.apache.cassandra.db.repair.CassandraTableRepairManager#snapshot(String, Collection, boolean)
      */
-    public synchronized ParentRepairSession removeParentRepairSession(UUID parentSessionId)
+    public synchronized ParentRepairSession removeParentRepairSession(TimeUUID parentSessionId)
     {
         String snapshotName = parentSessionId.toString();
         ParentRepairSession session = parentRepairSessions.remove(parentSessionId);
@@ -715,13 +778,13 @@
                             session.columnFamilyStores.values()
                                                       .stream()
                                                       .map(cfs -> cfs.metadata().toString()).collect(Collectors.joining(", ")));
-                long startNanos = System.nanoTime();
+                long startNanos = nanoTime();
                 for (ColumnFamilyStore cfs : session.columnFamilyStores.values())
                 {
                     if (cfs.snapshotExists(snapshotName))
                         cfs.clearSnapshot(snapshotName);
                 }
-                logger.info("[repair #{}] Cleared snapshots in {}ms", parentSessionId, TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNanos));
+                logger.info("[repair #{}] Cleared snapshots in {}ms", parentSessionId, TimeUnit.NANOSECONDS.toMillis(nanoTime() - startNanos));
             });
         }
         return session;
@@ -729,19 +792,35 @@
 
     public void handleMessage(Message<? extends RepairMessage> message)
     {
-        RepairJobDesc desc = message.payload.desc;
+        RepairMessage payload = message.payload;
+        RepairJobDesc desc = payload.desc;
         RepairSession session = sessions.get(desc.sessionId);
+
         if (session == null)
+        {
+            if (payload instanceof ValidationResponse)
+            {
+                // The trees may be off-heap, and will therefore need to be released.
+                ValidationResponse validation = (ValidationResponse) payload;
+                MerkleTrees trees = validation.trees;
+
+                // The response from a failed validation won't have any trees.
+                if (trees != null)
+                    trees.release();
+            }
+
             return;
+        }
+
         switch (message.verb())
         {
             case VALIDATION_RSP:
-                ValidationResponse validation = (ValidationResponse) message.payload;
+                ValidationResponse validation = (ValidationResponse) payload;
                 session.validationComplete(desc, message.from(), validation.trees);
                 break;
             case SYNC_RSP:
                 // one of replica is synced.
-                SyncResponse sync = (SyncResponse) message.payload;
+                SyncResponse sync = (SyncResponse) payload;
                 session.syncComplete(desc, sync.nodes, sync.success, sync.summaries);
                 break;
             default:
@@ -815,10 +894,10 @@
         public String toString()
         {
             return "ParentRepairSession{" +
-                    "columnFamilyStores=" + columnFamilyStores +
-                    ", ranges=" + ranges +
-                    ", repairedAt=" + repairedAt +
-                    '}';
+                   "columnFamilyStores=" + columnFamilyStores +
+                   ", ranges=" + ranges +
+                   ", repairedAt=" + repairedAt +
+                   '}';
         }
 
         public void setHasSnapshots()
@@ -831,11 +910,25 @@
     If the coordinator node dies we should remove the parent repair session from the other nodes.
     This uses the same notifications as we get in RepairSession
      */
-    public void onJoin(InetAddressAndPort endpoint, EndpointState epState) {}
-    public void beforeChange(InetAddressAndPort endpoint, EndpointState currentState, ApplicationState newStateKey, VersionedValue newValue) {}
-    public void onChange(InetAddressAndPort endpoint, ApplicationState state, VersionedValue value) {}
-    public void onAlive(InetAddressAndPort endpoint, EndpointState state) {}
-    public void onDead(InetAddressAndPort endpoint, EndpointState state) {}
+    public void onJoin(InetAddressAndPort endpoint, EndpointState epState)
+    {
+    }
+
+    public void beforeChange(InetAddressAndPort endpoint, EndpointState currentState, ApplicationState newStateKey, VersionedValue newValue)
+    {
+    }
+
+    public void onChange(InetAddressAndPort endpoint, ApplicationState state, VersionedValue value)
+    {
+    }
+
+    public void onAlive(InetAddressAndPort endpoint, EndpointState state)
+    {
+    }
+
+    public void onDead(InetAddressAndPort endpoint, EndpointState state)
+    {
+    }
 
     public void onRemove(InetAddressAndPort endpoint)
     {
@@ -849,7 +942,7 @@
 
     /**
      * Something has happened to a remote node - if that node is a coordinator, we mark the parent repair session id as failed.
-     *
+     * <p>
      * The fail marker is kept in the map for 24h to make sure that if the coordinator does not agree
      * that the repair failed, we need to fail the entire repair session
      *
@@ -880,8 +973,8 @@
      */
     public void abort(Predicate<ParentRepairSession> predicate, String message)
     {
-        Set<UUID> parentSessionsToRemove = new HashSet<>();
-        for (Map.Entry<UUID, ParentRepairSession> repairSessionEntry : parentRepairSessions.entrySet())
+        Set<TimeUUID> parentSessionsToRemove = new HashSet<>();
+        for (Map.Entry<TimeUUID, ParentRepairSession> repairSessionEntry : parentRepairSessions.entrySet())
         {
             if (predicate.test(repairSessionEntry.getValue()))
                 parentSessionsToRemove.add(repairSessionEntry.getKey());
@@ -904,4 +997,126 @@
     {
         return sessions.size();
     }
+
+    public Future<?> repairPaxosForTopologyChange(String ksName, Collection<Range<Token>> ranges, String reason)
+    {
+        if (!paxosRepairEnabled())
+        {
+            logger.warn("Not running paxos repair for topology change because paxos repair has been disabled");
+            return ImmediateFuture.success(null);
+        }
+
+        if (ranges.isEmpty())
+        {
+            logger.warn("Not running paxos repair for topology change because there are no ranges to repair");
+            return ImmediateFuture.success(null);
+        }
+        List<TableMetadata> tables = Lists.newArrayList(Schema.instance.getKeyspaceMetadata(ksName).tables);
+        List<Future<Void>> futures = new ArrayList<>(ranges.size() * tables.size());
+        Keyspace keyspace = Keyspace.open(ksName);
+        AbstractReplicationStrategy replication = keyspace.getReplicationStrategy();
+        for (Range<Token> range: ranges)
+        {
+            for (TableMetadata table : tables)
+            {
+                Set<InetAddressAndPort> endpoints = replication.getNaturalReplicas(range.right).filter(FailureDetector.isReplicaAlive).endpoints();
+                if (!PaxosRepair.hasSufficientLiveNodesForTopologyChange(keyspace, range, endpoints))
+                {
+                    Set<InetAddressAndPort> downEndpoints = replication.getNaturalReplicas(range.right).filter(e -> !endpoints.contains(e)).endpoints();
+                    downEndpoints.removeAll(endpoints);
+
+                    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 " +
+                                                             "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" +
+                                                             "property StorageService.SkipPaxosRepairOnTopologyChangeKeyspaces\n" +
+                                                             "Skipping this check can lead to paxos correctness issues",
+                                                             range, ksName, reason, downEndpoints));
+                }
+                EndpointsForToken pending = StorageService.instance.getTokenMetadata().pendingEndpointsForToken(range.right, ksName);
+                if (pending.size() > 1 && !Boolean.getBoolean("cassandra.paxos_repair_allow_multiple_pending_unsafe"))
+                {
+                    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));
+
+                }
+                Future<Void> future = PaxosCleanup.cleanup(endpoints, table, Collections.singleton(range), false, repairCommandExecutor());
+                futures.add(future);
+            }
+        }
+
+        return FutureCombiner.allOf(futures);
+    }
+
+    public int getPaxosRepairParallelism()
+    {
+        return DatabaseDescriptor.getPaxosRepairParallelism();
+    }
+
+    public void setPaxosRepairParallelism(int v)
+    {
+        DatabaseDescriptor.setPaxosRepairParallelism(v);
+    }
+
+    public void shutdownNowAndWait(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
+    {
+        ExecutorUtils.shutdownNowAndWait(timeout, unit, snapshotExecutor);
+    }
+
+    public Collection<CoordinatorState> coordinators()
+    {
+        return repairs.asMap().values();
+    }
+
+    public CoordinatorState coordinator(TimeUUID id)
+    {
+        return repairs.getIfPresent(id);
+    }
+
+    public void register(CoordinatorState state)
+    {
+        repairs.put(state.id, state);
+    }
+
+    public boolean register(ParticipateState state)
+    {
+        synchronized (participates)
+        {
+            ParticipateState current = participates.getIfPresent(state.id);
+            if (current != null)
+                return false;
+            participates.put(state.id, state);
+        }
+        return true;
+    }
+
+    public Collection<ParticipateState> participates()
+    {
+        return participates.asMap().values();
+    }
+
+    public ParticipateState participate(TimeUUID id)
+    {
+        return participates.getIfPresent(id);
+    }
+
+    public Collection<ValidationState> validations()
+    {
+        return participates.asMap().values().stream().flatMap(p -> p.validations().stream()).collect(Collectors.toList());
+    }
+
+    public ValidationState validation(UUID id)
+    {
+        for (ValidationState state : validations())
+        {
+            if (state.id.equals(id))
+                return state;
+        }
+        return null;
+    }
 }
diff --git a/src/java/org/apache/cassandra/service/ActiveRepairServiceMBean.java b/src/java/org/apache/cassandra/service/ActiveRepairServiceMBean.java
index b68cb6f..009ad56 100644
--- a/src/java/org/apache/cassandra/service/ActiveRepairServiceMBean.java
+++ b/src/java/org/apache/cassandra/service/ActiveRepairServiceMBean.java
@@ -29,9 +29,14 @@
     public List<Map<String, String>> getSessions(boolean all, String rangesStr);
     public void failSession(String session, boolean force);
 
+    @Deprecated
     public void setRepairSessionSpaceInMegabytes(int sizeInMegabytes);
+    @Deprecated
     public int getRepairSessionSpaceInMegabytes();
 
+    public void setRepairSessionSpaceInMebibytes(int sizeInMebibytes);
+    public int getRepairSessionSpaceInMebibytes();
+
     public boolean getUseOffheapMerkleTrees();
     public void setUseOffheapMerkleTrees(boolean value);
 
@@ -50,4 +55,6 @@
      * @return current size of the internal cache holding {@link ActiveRepairService.ParentRepairSession} instances
      */
     int parentRepairSessionsCount();
+    public int getPaxosRepairParallelism();
+    public void setPaxosRepairParallelism(int v);
 }
diff --git a/src/java/org/apache/cassandra/service/BatchlogResponseHandler.java b/src/java/org/apache/cassandra/service/BatchlogResponseHandler.java
index 155f42d..c1c828f 100644
--- a/src/java/org/apache/cassandra/service/BatchlogResponseHandler.java
+++ b/src/java/org/apache/cassandra/service/BatchlogResponseHandler.java
@@ -36,7 +36,7 @@
 
     public BatchlogResponseHandler(AbstractWriteResponseHandler<T> wrapped, int requiredBeforeFinish, BatchlogCleanup cleanup, long queryStartNanoTime)
     {
-        super(wrapped.replicaPlan, wrapped.callback, wrapped.writeType, queryStartNanoTime);
+        super(wrapped.replicaPlan, wrapped.callback, wrapped.writeType, null, queryStartNanoTime);
         this.wrapped = wrapped;
         this.requiredBeforeFinish = requiredBeforeFinish;
         this.cleanup = cleanup;
diff --git a/src/java/org/apache/cassandra/service/CASRequest.java b/src/java/org/apache/cassandra/service/CASRequest.java
index 88fb9bd..19966c8 100644
--- a/src/java/org/apache/cassandra/service/CASRequest.java
+++ b/src/java/org/apache/cassandra/service/CASRequest.java
@@ -17,10 +17,11 @@
  */
 package org.apache.cassandra.service;
 
-import org.apache.cassandra.db.SinglePartitionReadQuery;
+import org.apache.cassandra.db.SinglePartitionReadCommand;
 import org.apache.cassandra.db.partitions.FilteredPartition;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.service.paxos.Ballot;
 
 /**
  * Abstract the conditions and updates for a CAS operation.
@@ -30,7 +31,7 @@
     /**
      * The command to use to fetch the value to compare for the CAS.
      */
-    public SinglePartitionReadQuery readCommand(int nowInSec);
+    public SinglePartitionReadCommand readCommand(int nowInSec);
 
     /**
      * Returns whether the provided CF, that represents the values fetched using the
@@ -42,5 +43,5 @@
      * The updates to perform of a CAS success. The values fetched using the readFilter()
      * are passed as argument.
      */
-    public PartitionUpdate makeUpdates(FilteredPartition current) throws InvalidRequestException;
+    public PartitionUpdate makeUpdates(FilteredPartition current, ClientState clientState, Ballot ballot) throws InvalidRequestException;
 }
diff --git a/src/java/org/apache/cassandra/service/CacheService.java b/src/java/org/apache/cassandra/service/CacheService.java
index 0a281ad..9c23e71 100644
--- a/src/java/org/apache/cassandra/service/CacheService.java
+++ b/src/java/org/apache/cassandra/service/CacheService.java
@@ -19,17 +19,10 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-
-import com.google.common.util.concurrent.Futures;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,6 +38,9 @@
 import org.apache.cassandra.db.partitions.CachedBTreePartition;
 import org.apache.cassandra.db.partitions.CachedPartition;
 import org.apache.cassandra.db.rows.*;
+import org.apache.cassandra.io.sstable.SSTableId;
+import org.apache.cassandra.io.sstable.SSTableIdFactory;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
@@ -54,6 +50,8 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MBeanWrapper;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 
 public class CacheService implements CacheServiceMBean
 {
@@ -100,9 +98,9 @@
      */
     private AutoSavingCache<KeyCacheKey, RowIndexEntry> initKeyCache()
     {
-        logger.info("Initializing key cache with capacity of {} MBs.", DatabaseDescriptor.getKeyCacheSizeInMB());
+        logger.info("Initializing key cache with capacity of {} MiBs.", DatabaseDescriptor.getKeyCacheSizeInMiB());
 
-        long keyCacheInMemoryCapacity = DatabaseDescriptor.getKeyCacheSizeInMB() * 1024 * 1024;
+        long keyCacheInMemoryCapacity = DatabaseDescriptor.getKeyCacheSizeInMiB() * 1024 * 1024;
 
         // as values are constant size we can use singleton weigher
         // where 48 = 40 bytes (average size of the key) + 8 bytes (size of value)
@@ -122,10 +120,10 @@
      */
     private AutoSavingCache<RowCacheKey, IRowCacheEntry> initRowCache()
     {
-        logger.info("Initializing row cache with capacity of {} MBs", DatabaseDescriptor.getRowCacheSizeInMB());
+        logger.info("Initializing row cache with capacity of {} MiBs", DatabaseDescriptor.getRowCacheSizeInMiB());
 
         CacheProvider<RowCacheKey, IRowCacheEntry> cacheProvider;
-        String cacheProviderClassName = DatabaseDescriptor.getRowCacheSizeInMB() > 0
+        String cacheProviderClassName = DatabaseDescriptor.getRowCacheSizeInMiB() > 0
                                         ? DatabaseDescriptor.getRowCacheClassName() : "org.apache.cassandra.cache.NopCacheProvider";
         try
         {
@@ -151,9 +149,9 @@
 
     private AutoSavingCache<CounterCacheKey, ClockAndCount> initCounterCache()
     {
-        logger.info("Initializing counter cache with capacity of {} MBs", DatabaseDescriptor.getCounterCacheSizeInMB());
+        logger.info("Initializing counter cache with capacity of {} MiBs", DatabaseDescriptor.getCounterCacheSizeInMiB());
 
-        long capacity = DatabaseDescriptor.getCounterCacheSizeInMB() * 1024 * 1024;
+        long capacity = DatabaseDescriptor.getCounterCacheSizeInMiB() * 1024 * 1024;
 
         AutoSavingCache<CounterCacheKey, ClockAndCount> cache =
             new AutoSavingCache<>(CaffeineCache.create(capacity),
@@ -419,7 +417,7 @@
         // For column families with many SSTables the linear nature of getSSTables slowed down KeyCache loading
         // by orders of magnitude. So we cache the sstables once and rely on cleanupAfterDeserialize to cleanup any
         // cached state we may have accumulated during the load.
-        Map<Pair<String, String>, Map<Integer, SSTableReader>> cachedSSTableReaders = new ConcurrentHashMap<>();
+        Map<Pair<String, String>, Map<SSTableId, SSTableReader>> cachedSSTableReaders = new ConcurrentHashMap<>();
 
         public void serialize(KeyCacheKey key, DataOutputPlus out, ColumnFamilyStore cfs) throws IOException
         {
@@ -431,7 +429,15 @@
             tableMetadata.id.serialize(out);
             out.writeUTF(tableMetadata.indexName().orElse(""));
             ByteArrayUtil.writeWithLength(key.key, out);
-            out.writeInt(key.desc.generation);
+            if (key.desc.id instanceof SequenceBasedSSTableId)
+            {
+                out.writeInt(((SequenceBasedSSTableId) key.desc.id).generation);
+            }
+            else
+            {
+                out.writeInt(Integer.MIN_VALUE); // backwards compatibility for "int based generation only"
+                ByteBufferUtil.writeWithShortLength(key.desc.id.asBytes(), out);
+            }
             out.writeBoolean(true);
 
             SerializationHeader header = new SerializationHeader(false, cfs.metadata(), cfs.metadata().regularAndStaticColumns(), EncodingStats.NO_STATS);
@@ -452,23 +458,26 @@
             }
             ByteBuffer key = ByteBufferUtil.read(input, keyLength);
             int generation = input.readInt();
+            SSTableId generationId = generation == Integer.MIN_VALUE
+                                                   ? SSTableIdFactory.instance.fromBytes(ByteBufferUtil.readWithShortLength(input))
+                                                   : new SequenceBasedSSTableId(generation); // Backwards compatibility for "int based generation sstables"
             input.readBoolean(); // backwards compatibility for "promoted indexes" boolean
             SSTableReader reader = null;
             if (!skipEntry)
             {
                 Pair<String, String> qualifiedName = Pair.create(cfs.metadata.keyspace, cfs.metadata.name);
-                Map<Integer, SSTableReader> generationToSSTableReader = cachedSSTableReaders.get(qualifiedName);
+                Map<SSTableId, SSTableReader> generationToSSTableReader = cachedSSTableReaders.get(qualifiedName);
                 if (generationToSSTableReader == null)
                 {
                     generationToSSTableReader = new HashMap<>(cfs.getLiveSSTables().size());
                     for (SSTableReader ssTableReader : cfs.getSSTables(SSTableSet.CANONICAL))
                     {
-                        generationToSSTableReader.put(ssTableReader.descriptor.generation, ssTableReader);
+                        generationToSSTableReader.put(ssTableReader.descriptor.id, ssTableReader);
                     }
 
                     cachedSSTableReaders.putIfAbsent(qualifiedName, generationToSSTableReader);
                 }
-                reader = generationToSSTableReader.get(generation);
+                reader = generationToSSTableReader.get(generationId);
             }
 
             if (skipEntry || reader == null)
@@ -485,7 +494,7 @@
                                                                                                                 reader.descriptor.version,
                                                                                                                 reader.header);
             RowIndexEntry<?> entry = indexSerializer.deserializeForCache(input);
-            return Futures.immediateFuture(Pair.create(new KeyCacheKey(cfs.metadata(), reader.descriptor, key), entry));
+            return ImmediateFuture.success(Pair.create(new KeyCacheKey(cfs.metadata(), reader.descriptor, key), entry));
         }
 
         public void cleanupAfterDeserialize()
diff --git a/src/java/org/apache/cassandra/service/CassandraDaemon.java b/src/java/org/apache/cassandra/service/CassandraDaemon.java
index 3e8277c..f1bca66 100644
--- a/src/java/org/apache/cassandra/service/CassandraDaemon.java
+++ b/src/java/org/apache/cassandra/service/CassandraDaemon.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.service;
 
-import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.MemoryPoolMXBean;
@@ -26,7 +25,6 @@
 import java.net.UnknownHostException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
@@ -37,8 +35,8 @@
 import javax.management.remote.JMXConnectorServer;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
+import com.google.common.collect.ImmutableList;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -52,6 +50,7 @@
 import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
 
 import org.apache.cassandra.audit.AuditLogManager;
+import org.apache.cassandra.auth.AuthCacheService;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.QueryProcessor;
@@ -59,8 +58,7 @@
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SizeEstimatesRecorder;
 import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.db.SystemKeyspaceMigrator40;
-import org.apache.cassandra.db.WindowsFailedSnapshotTracker;
+import org.apache.cassandra.db.SystemKeyspaceMigrator41;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.virtual.SystemViewsKeyspace;
 import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
@@ -68,27 +66,27 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.StartupException;
 import org.apache.cassandra.gms.Gossiper;
-import org.apache.cassandra.io.FSError;
-import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.sstable.SSTableHeaderFix;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry;
 import org.apache.cassandra.metrics.DefaultNameFactory;
-import org.apache.cassandra.metrics.StorageMetrics;
 import org.apache.cassandra.net.StartupClusterConnectivityChecker;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.security.ThreadAwareSecurityManager;
-import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.streaming.StreamManager;
+import org.apache.cassandra.service.paxos.PaxosState;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JMXServerUtils;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MBeanWrapper;
 import org.apache.cassandra.utils.Mx4jTool;
 import org.apache.cassandra.utils.NativeLibrary;
-import org.apache.cassandra.utils.WindowsTimer;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.CASSANDRA_FOREGROUND;
@@ -217,7 +215,7 @@
     public CassandraDaemon(boolean runManaged)
     {
         this.runManaged = runManaged;
-        this.startupChecks = new StartupChecks().withDefaultTests();
+        this.startupChecks = new StartupChecks().withDefaultTests().withTest(new FileSystemOwnershipCheck());
         this.setupCompleted = false;
     }
 
@@ -243,10 +241,6 @@
             exitOrFail(StartupException.ERR_WRONG_DISK_STATE, e.getMessage(), e);
         }
 
-        // Delete any failed snapshot deletions on Windows - see CASSANDRA-9658
-        if (FBUtilities.isWindows)
-            WindowsFailedSnapshotTracker.deleteOldSnapshots();
-
         maybeInitJmx();
 
         Mx4jTool.maybeLoad();
@@ -274,9 +268,9 @@
         // This should be the first write to SystemKeyspace (CASSANDRA-11742)
         SystemKeyspace.persistLocalMetadata();
 
-        Thread.setDefaultUncaughtExceptionHandler(CassandraDaemon::uncaughtException);
+        Thread.setDefaultUncaughtExceptionHandler(JVMStabilityInspector::uncaughtException);
 
-        SystemKeyspaceMigrator40.migrate();
+        SystemKeyspaceMigrator41.migrate();
 
         // Populate token metadata before flushing, for token-aware sstable partitioning (#6696)
         StorageService.instance.populateTokenMetadata();
@@ -333,7 +327,6 @@
             }
         }
 
-
         try
         {
             loadRowAndKeyCacheAsync().get();
@@ -355,6 +348,9 @@
         }
 
         // Replay any CommitLogSegments found on disk
+        PaxosState.initializeTrackers();
+
+        // replay the log if necessary
         try
         {
             CommitLog.instance.recoverSegmentsOnDisk();
@@ -367,7 +363,14 @@
         // Re-populate token metadata after commit log recover (new peers might be loaded onto system keyspace #10293)
         StorageService.instance.populateTokenMetadata();
 
-        SystemKeyspace.finishStartup();
+        try
+        {
+            PaxosState.maybeRebuildUncommittedState();
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
 
         // Clean up system.size_estimates entries left lying around from missed keyspace drops (CASSANDRA-14905)
         StorageService.instance.cleanupSizeEstimates();
@@ -379,6 +382,7 @@
             ScheduledExecutors.optionalTasks.scheduleWithFixedDelay(SizeEstimatesRecorder.instance, 30, sizeRecorderInterval, TimeUnit.SECONDS);
 
         ActiveRepairService.instance.start();
+        StreamManager.instance.start();
 
         // Prepared statements
         QueryProcessor.instance.preloadPreparedStatements();
@@ -435,7 +439,7 @@
             logger.debug("Completed submission of build tasks for any materialized views defined at startup");
         };
 
-        ScheduledExecutors.optionalTasks.schedule(viewRebuild, StorageService.RING_DELAY, TimeUnit.MILLISECONDS);
+        ScheduledExecutors.optionalTasks.schedule(viewRebuild, StorageService.RING_DELAY_MILLIS, TimeUnit.MILLISECONDS);
 
         if (!FBUtilities.getBroadcastAddressAndPort().equals(InetAddressAndPort.getLoopbackAddress()))
             Gossiper.waitToSettle();
@@ -479,6 +483,15 @@
 
         initializeClientTransports();
 
+        // Ensure you've registered all caches during startup you want pre-warmed before this call -> be wary of adding
+        // init below this mark before completeSetup().
+        if (DatabaseDescriptor.getAuthCacheWarmingEnabled())
+            AuthCacheService.instance.warmCaches();
+        else
+            logger.info("Prewarming of auth caches is disabled");
+
+        PaxosState.startAutoRepairs();
+
         completeSetup();
     }
 
@@ -486,7 +499,7 @@
     {
         try
         {
-            startupChecks.verify();
+            startupChecks.verify(DatabaseDescriptor.getStartupChecksOptions());
         }
         catch (StartupException e)
         {
@@ -515,7 +528,7 @@
         //     the system keyspace location configured by the user (upgrade to 4.0)
         //  3) The system data are stored in the first data location and need to be moved to
         //     the system keyspace location configured by the user (system_data_file_directory has been configured)
-        Path target = Paths.get(DatabaseDescriptor.getLocalSystemKeyspacesDataFileLocations()[0]);
+        Path target = File.getPath(DatabaseDescriptor.getLocalSystemKeyspacesDataFileLocations()[0]);
 
         String[] nonLocalSystemKeyspacesFileLocations = DatabaseDescriptor.getNonLocalSystemKeyspacesDataFileLocations();
         String[] sources = DatabaseDescriptor.useSpecificLocationForLocalSystemData() ? nonLocalSystemKeyspacesFileLocations
@@ -525,7 +538,7 @@
 
         for (String source : sources)
         {
-            Path dataFileLocation = Paths.get(source);
+            Path dataFileLocation = File.getPath(source);
 
             if (!Files.exists(dataFileLocation))
                 continue;
@@ -574,33 +587,18 @@
             nativeTransportService = new NativeTransportService();
     }
 
-    @VisibleForTesting
-    public static void uncaughtException(Thread t, Throwable e)
-    {
-        StorageMetrics.uncaughtExceptions.inc();
-        logger.error("Exception in thread {}", t, e);
-        Tracing.trace("Exception in thread {}", t, e);
-        for (Throwable e2 = e; e2 != null; e2 = e2.getCause())
-        {
-            // make sure error gets logged exactly once.
-            if (e2 != e && (e2 instanceof FSError || e2 instanceof CorruptSSTableException))
-                logger.error("Exception in thread {}", t, e2);
-        }
-        JVMStabilityInspector.inspectThrowable(e);
-    }
-
     /*
      * Asynchronously load the row and key cache in one off threads and return a compound future of the result.
      * Error handling is pushed into the cache load since cache loads are allowed to fail and are handled by logging.
      */
-    private ListenableFuture<?> loadRowAndKeyCacheAsync()
+    private Future<?> loadRowAndKeyCacheAsync()
     {
-        final ListenableFuture<Integer> keyCacheLoad = CacheService.instance.keyCache.loadSavedAsync();
+        final Future<Integer> keyCacheLoad = CacheService.instance.keyCache.loadSavedAsync();
 
-        final ListenableFuture<Integer> rowCacheLoad = CacheService.instance.rowCache.loadSavedAsync();
+        final Future<Integer> rowCacheLoad = CacheService.instance.rowCache.loadSavedAsync();
 
         @SuppressWarnings("unchecked")
-        ListenableFuture<List<Integer>> retval = Futures.successfulAsList(keyCacheLoad, rowCacheLoad);
+        Future<List<Integer>> retval = FutureCombiner.allOf(ImmutableList.of(keyCacheLoad, rowCacheLoad));
 
         return retval;
     }
@@ -710,11 +708,6 @@
         destroyClientTransports();
         StorageService.instance.setRpcReady(false);
 
-        // On windows, we need to stop the entire system as prunsrv doesn't have the jsvc hooks
-        // We rely on the shutdown hook to drain the node
-        if (FBUtilities.isWindows)
-            System.exit(0);
-
         if (jmxServer != null)
         {
             try
@@ -755,13 +748,6 @@
 
             registerNativeAccess();
 
-            if (FBUtilities.isWindows)
-            {
-                // We need to adjust the system timer on windows from the default 15ms down to the minimum of 1ms as this
-                // impacts timer intervals, thread scheduling, driver interrupts, etc.
-                WindowsTimer.startTimerPeriod(DatabaseDescriptor.getWindowsTimerInterval());
-            }
-
             setup();
 
             String pidFile = CASSANDRA_PID_FILE.getString();
diff --git a/src/java/org/apache/cassandra/service/ClientState.java b/src/java/org/apache/cassandra/service/ClientState.java
index f76e7e3..9e35c7f 100644
--- a/src/java/org/apache/cassandra/service/ClientState.java
+++ b/src/java/org/apache/cassandra/service/ClientState.java
@@ -22,10 +22,17 @@
 import java.net.SocketAddress;
 import java.util.Arrays;
 import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
 import java.util.Optional;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Lists;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -51,6 +58,8 @@
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MD5Digest;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * State related to a client connection.
  */
@@ -119,6 +128,9 @@
     // Driver String for the client
     private volatile String driverName;
     private volatile String driverVersion;
+    
+    // Options provided by the client
+    private volatile Map<String,String> clientOptions;
 
     // The biggest timestamp that was returned by getTimestamp/assigned to a query. This is global to ensure that the
     // timestamp assigned are strictly monotonic on a node, which is likely what user expect intuitively (more likely,
@@ -126,6 +138,14 @@
     // is unrealistic expectation, doing it node-wise is easy).
     private static final AtomicLong lastTimestampMicros = new AtomicLong(0);
 
+    @VisibleForTesting
+    public static void resetLastTimestamp(long nowMillis)
+    {
+        long nowMicros = TimeUnit.MILLISECONDS.toMicros(nowMillis);
+        if (lastTimestampMicros.get() > nowMicros)
+            lastTimestampMicros.set(nowMicros);
+    }
+
     /**
      * Construct a new, empty ClientState for internal calls.
      */
@@ -151,6 +171,7 @@
         this.keyspace = source.keyspace;
         this.driverName = source.driverName;
         this.driverVersion = source.driverVersion;
+        this.clientOptions = source.clientOptions;
     }
 
     /**
@@ -200,7 +221,7 @@
     {
         while (true)
         {
-            long current = System.currentTimeMillis() * 1000;
+            long current = currentTimeMillis() * 1000;
             long last = lastTimestampMicros.get();
             long tstamp = last >= current ? last + 1 : current;
             if (lastTimestampMicros.compareAndSet(last, tstamp))
@@ -241,7 +262,7 @@
      * with a clock in the future compared to the local one), we use the last proposal timestamp plus 1, ensuring
      * progress.
      *
-     * @param minTimestampToUse the max timestamp of the last proposal accepted by replica having responded
+     * @param minUnixMicros the max timestamp of the last proposal accepted by replica having responded
      * to the prepare phase of the paxos round this is for. In practice, that's the minimum timestamp this method
      * may return.
      * @return a timestamp suitable for a Paxos proposal (using the reasoning described above). Note that
@@ -250,22 +271,27 @@
      * it may be returned multiple times). Note that we still ensure Paxos "ballot" are unique (for different
      * proposal) by (securely) randomizing the non-timestamp part of the UUID.
      */
-    public long getTimestampForPaxos(long minTimestampToUse)
+    public static long getTimestampForPaxos(long minUnixMicros)
     {
         while (true)
         {
-            long current = Math.max(System.currentTimeMillis() * 1000, minTimestampToUse);
+            long current = Math.max(currentTimeMillis() * 1000, minUnixMicros);
             long last = lastTimestampMicros.get();
             long tstamp = last >= current ? last + 1 : current;
             // Note that if we ended up picking minTimestampMicrosToUse (it was "in the future"), we don't
             // want to change the local clock, otherwise a single node in the future could corrupt the clock
             // of all nodes and for all inserts (since non-paxos inserts also use lastTimestampMicros).
             // See CASSANDRA-11991
-            if (tstamp == minTimestampToUse || lastTimestampMicros.compareAndSet(last, tstamp))
+            if (tstamp == minUnixMicros || lastTimestampMicros.compareAndSet(last, tstamp))
                 return tstamp;
         }
     }
 
+    public static long getLastTimestampMicros()
+    {
+        return lastTimestampMicros.get();
+    }
+
     public Optional<String> getDriverName()
     {
         return Optional.ofNullable(driverName);
@@ -276,6 +302,11 @@
         return Optional.ofNullable(driverVersion);
     }
 
+    public Optional<Map<String,String>> getClientOptions()
+    {
+        return Optional.ofNullable(clientOptions);
+    }
+
     public void setDriverName(String driverName)
     {
         this.driverName = driverName;
@@ -285,6 +316,11 @@
     {
         this.driverVersion = driverVersion;
     }
+    
+    public void setClientOptions(Map<String,String> clientOptions)
+    {
+        this.clientOptions = ImmutableMap.copyOf(clientOptions);
+    }
 
     public static QueryHandler getCQLQueryHandler()
     {
@@ -358,6 +394,11 @@
         ensurePermission(keyspace, perm, DataResource.keyspace(keyspace));
     }
 
+    public void ensureAllTablesPermission(String keyspace, Permission perm)
+    {
+        ensurePermission(keyspace, perm, DataResource.allTables(keyspace));
+    }
+
     public void ensureTablePermission(String keyspace, String table, Permission perm)
     {
         ensurePermission(keyspace, perm, DataResource.table(keyspace, table));
@@ -425,7 +466,11 @@
 
     private void ensurePermissionOnResourceChain(Permission perm, IResource resource)
     {
-        for (IResource r : Resources.chain(resource))
+        List<? extends IResource> resources = Resources.chain(resource);
+        if (DatabaseDescriptor.getAuthFromRoot())
+            resources = Lists.reverse(resources);
+
+        for (IResource r : resources)
             if (authorize(r).contains(perm))
                 return;
 
@@ -475,9 +520,37 @@
             throw new UnauthorizedException("You have to be logged in and not anonymous to perform this request");
     }
 
+    /**
+     * Checks if this user is an ordinary user (not a super or system user).
+     *
+     * @return {@code true} if this user is an ordinary user, {@code false} otherwise.
+     */
+    public boolean isOrdinaryUser()
+    {
+        return !isSuper() && !isSystem();
+    }
+
+    /**
+     * Checks if this user is a super user.
+     */
+    public boolean isSuper()
+    {
+        return !DatabaseDescriptor.getAuthenticator().requireAuthentication() || (user != null && user.isSuper());
+    }
+
+    /**
+     * Checks if the user is the system user.
+     *
+     * @return {@code true} if this user is the system user, {@code false} otherwise.
+     */
+    public boolean isSystem()
+    {
+        return isInternal;
+    }
+
     public void ensureIsSuperuser(String message)
     {
-        if (DatabaseDescriptor.getAuthenticator().requireAuthentication() && (user == null || !user.isSuper()))
+        if (!isSuper())
             throw new UnauthorizedException(message);
     }
 
diff --git a/src/java/org/apache/cassandra/service/ClientWarn.java b/src/java/org/apache/cassandra/service/ClientWarn.java
index 5a6a878..6e2d3fc 100644
--- a/src/java/org/apache/cassandra/service/ClientWarn.java
+++ b/src/java/org/apache/cassandra/service/ClientWarn.java
@@ -20,14 +20,13 @@
 import java.util.ArrayList;
 import java.util.List;
 
-import io.netty.util.concurrent.FastThreadLocal;
-import org.apache.cassandra.concurrent.ExecutorLocal;
+import org.apache.cassandra.concurrent.ExecutorLocals;
 import org.apache.cassandra.utils.FBUtilities;
 
-public class ClientWarn implements ExecutorLocal<ClientWarn.State>
+@SuppressWarnings("resource")
+public class ClientWarn extends ExecutorLocals.Impl
 {
     private static final String TRUNCATED = " [truncated]";
-    private static final FastThreadLocal<State> warnLocal = new FastThreadLocal<>();
     public static ClientWarn instance = new ClientWarn();
 
     private ClientWarn()
@@ -36,29 +35,30 @@
 
     public State get()
     {
-        return warnLocal.get();
+        return ExecutorLocals.current().clientWarnState;
     }
 
     public void set(State value)
     {
-        warnLocal.set(value);
+        ExecutorLocals current = ExecutorLocals.current();
+        ExecutorLocals.Impl.set(current.traceState, value);
     }
 
     public void warn(String text)
     {
-        State state = warnLocal.get();
+        State state = get();
         if (state != null)
             state.add(text);
     }
 
     public void captureWarnings()
     {
-        warnLocal.set(new State());
+        set(new State());
     }
 
     public List<String> getWarnings()
     {
-        State state = warnLocal.get();
+        State state = get();
         if (state == null || state.warnings.isEmpty())
             return null;
         return state.warnings;
@@ -66,7 +66,7 @@
 
     public void resetWarnings()
     {
-        warnLocal.remove();
+        set(null);
     }
 
     public static class State
@@ -85,6 +85,5 @@
                    ? warning.substring(0, FBUtilities.MAX_UNSIGNED_SHORT - TRUNCATED.length()) + TRUNCATED
                    : warning;
         }
-
     }
 }
diff --git a/src/java/org/apache/cassandra/service/DataResurrectionCheck.java b/src/java/org/apache/cassandra/service/DataResurrectionCheck.java
new file mode 100644
index 0000000..2c3b035
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/DataResurrectionCheck.java
@@ -0,0 +1,308 @@
+/*
+ * 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.service;
+
+import java.io.IOException;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.StartupChecksOptions;
+import org.apache.cassandra.exceptions.StartupException;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.SchemaKeyspace;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Pair;
+
+import static java.lang.String.format;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toList;
+import static java.util.stream.Collectors.toSet;
+import static org.apache.cassandra.exceptions.StartupException.ERR_WRONG_DISK_STATE;
+import static org.apache.cassandra.exceptions.StartupException.ERR_WRONG_MACHINE_STATE;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
+public class DataResurrectionCheck implements StartupCheck
+{
+    private static final Logger LOGGER = LoggerFactory.getLogger(DataResurrectionCheck.class);
+
+    public static final String HEARTBEAT_FILE_CONFIG_PROPERTY = "heartbeat_file";
+    public static final String EXCLUDED_KEYSPACES_CONFIG_PROPERTY = "excluded_keyspaces";
+    public static final String EXCLUDED_TABLES_CONFIG_PROPERTY = "excluded_tables";
+
+    public static final String DEFAULT_HEARTBEAT_FILE = "cassandra-heartbeat";
+
+    @JsonIgnoreProperties(ignoreUnknown = true)
+    public static class Heartbeat
+    {
+        @JsonProperty("last_heartbeat")
+        public final Instant lastHeartbeat;
+
+        /** needed for jackson serialization */
+        @SuppressWarnings("unused")
+        private Heartbeat() {
+            this.lastHeartbeat = null;
+        }
+
+        public Heartbeat(Instant lastHeartbeat)
+        {
+            this.lastHeartbeat = lastHeartbeat;
+        }
+
+        public void serializeToJsonFile(File outputFile) throws IOException
+        {
+            FBUtilities.serializeToJsonFile(this, outputFile);
+        }
+
+        public static Heartbeat deserializeFromJsonFile(File file) throws IOException
+        {
+            return FBUtilities.deserializeFromJsonFile(Heartbeat.class, file);
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Heartbeat manifest = (Heartbeat) o;
+            return Objects.equals(lastHeartbeat, manifest.lastHeartbeat);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hash(lastHeartbeat);
+        }
+    }
+
+    @VisibleForTesting
+    static class TableGCPeriod
+    {
+        String table;
+        int gcPeriod;
+
+        TableGCPeriod(String table, int gcPeriod)
+        {
+            this.table = table;
+            this.gcPeriod = gcPeriod;
+        }
+    }
+
+    static File getHeartbeatFile(Map<String, Object> config)
+    {
+        String heartbeatFileConfigValue = (String) config.get(HEARTBEAT_FILE_CONFIG_PROPERTY);
+        File heartbeatFile;
+
+        if (heartbeatFileConfigValue != null)
+        {
+            heartbeatFile = new File(heartbeatFileConfigValue);
+        }
+        else
+        {
+            String[] dataFileLocations = DatabaseDescriptor.getLocalSystemKeyspacesDataFileLocations();
+            assert dataFileLocations.length != 0;
+            heartbeatFile = new File(dataFileLocations[0], DEFAULT_HEARTBEAT_FILE);
+        }
+
+        LOGGER.trace("Resolved heartbeat file for data resurrection check: " + heartbeatFile);
+
+        return heartbeatFile;
+    }
+
+    @Override
+    public StartupChecks.StartupCheckType getStartupCheckType()
+    {
+        return StartupChecks.StartupCheckType.check_data_resurrection;
+    }
+
+    @Override
+    public void execute(StartupChecksOptions options) throws StartupException
+    {
+        if (options.isDisabled(getStartupCheckType()))
+            return;
+
+        Map<String, Object> config = options.getConfig(StartupChecks.StartupCheckType.check_data_resurrection);
+        File heartbeatFile = getHeartbeatFile(config);
+
+        if (!heartbeatFile.exists())
+        {
+            LOGGER.debug("Heartbeat file {} not found! Skipping heartbeat startup check.", heartbeatFile.absolutePath());
+            return;
+        }
+
+        Heartbeat heartbeat;
+
+        try
+        {
+            heartbeat = Heartbeat.deserializeFromJsonFile(heartbeatFile);
+        }
+        catch (IOException ex)
+        {
+            throw new StartupException(ERR_WRONG_DISK_STATE, "Failed to deserialize heartbeat file " + heartbeatFile);
+        }
+
+        if (heartbeat.lastHeartbeat == null)
+            return;
+
+        long heartbeatMillis = heartbeat.lastHeartbeat.toEpochMilli();
+
+        List<Pair<String, String>> violations = new ArrayList<>();
+
+        Set<String> excludedKeyspaces = getExcludedKeyspaces(config);
+        Set<Pair<String, String>> excludedTables = getExcludedTables(config);
+
+        long currentTimeMillis = currentTimeMillis();
+
+        for (String keyspace : getKeyspaces())
+        {
+            if (excludedKeyspaces.contains(keyspace))
+                continue;
+
+            for (TableGCPeriod userTable : getTablesGcPeriods(keyspace))
+            {
+                if (excludedTables.contains(Pair.create(keyspace, userTable.table)))
+                    continue;
+
+                long gcGraceMillis = ((long) userTable.gcPeriod) * 1000;
+                if (heartbeatMillis + gcGraceMillis < currentTimeMillis)
+                    violations.add(Pair.create(keyspace, userTable.table));
+            }
+        }
+
+        if (!violations.isEmpty())
+        {
+            String invalidTables = violations.stream()
+                                             .map(p -> format("%s.%s", p.left, p.right))
+                                             .collect(joining(","));
+
+            String exceptionMessage = format("There are tables for which gc_grace_seconds is older " +
+                                             "than the lastly known time Cassandra node was up based " +
+                                             "on its heartbeat %s with timestamp %s. Cassandra node will not start " +
+                                             "as it would likely introduce data consistency " +
+                                             "issues (zombies etc). Please resolve these issues manually, " +
+                                             "then remove the heartbeat and start the node again. Invalid tables: %s",
+                                             heartbeatFile, heartbeat.lastHeartbeat, invalidTables);
+
+            throw new StartupException(ERR_WRONG_MACHINE_STATE, exceptionMessage);
+        }
+    }
+
+    @Override
+    public void postAction(StartupChecksOptions options)
+    {
+        // Schedule heartbeating after all checks have passed, not as part of the check,
+        // as it might happen that other checks after it might fail, but we would be heartbeating already.
+        if (options.isEnabled(StartupChecks.StartupCheckType.check_data_resurrection))
+        {
+            Map<String, Object> config = options.getConfig(StartupChecks.StartupCheckType.check_data_resurrection);
+            File heartbeatFile = DataResurrectionCheck.getHeartbeatFile(config);
+
+            ScheduledExecutors.scheduledTasks.scheduleAtFixedRate(() ->
+            {
+                Heartbeat heartbeat = new Heartbeat(Instant.ofEpochMilli(Clock.Global.currentTimeMillis()));
+                try
+                {
+                    heartbeatFile.parent().createDirectoriesIfNotExists();
+                    DataResurrectionCheck.LOGGER.trace("writing heartbeat to file " + heartbeatFile);
+                    heartbeat.serializeToJsonFile(heartbeatFile);
+                }
+                catch (IOException ex)
+                {
+                    DataResurrectionCheck.LOGGER.error("Unable to serialize heartbeat to " + heartbeatFile, ex);
+                }
+            }, 0, CassandraRelevantProperties.CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD.getInt(), MILLISECONDS);
+        }
+    }
+
+    @VisibleForTesting
+    public Set<String> getExcludedKeyspaces(Map<String, Object> config)
+    {
+        String excludedKeyspacesConfigValue = (String) config.get(EXCLUDED_KEYSPACES_CONFIG_PROPERTY);
+
+        if (excludedKeyspacesConfigValue == null)
+            return Collections.emptySet();
+        else
+            return Arrays.stream(excludedKeyspacesConfigValue.trim().split(","))
+                         .map(String::trim)
+                         .collect(toSet());
+    }
+
+    @VisibleForTesting
+    public Set<Pair<String, String>> getExcludedTables(Map<String, Object> config)
+    {
+        String excludedKeyspacesConfigValue = (String) config.get(EXCLUDED_TABLES_CONFIG_PROPERTY);
+
+        if (excludedKeyspacesConfigValue == null)
+            return Collections.emptySet();
+
+        Set<Pair<String, String>> pairs = new HashSet<>();
+
+        for (String keyspaceTable : excludedKeyspacesConfigValue.trim().split(","))
+        {
+            String[] pair = keyspaceTable.trim().split("\\.");
+            if (pair.length != 2)
+                continue;
+
+            pairs.add(Pair.create(pair[0].trim(), pair[1].trim()));
+        }
+
+        return pairs;
+    }
+
+    @VisibleForTesting
+    List<String> getKeyspaces()
+    {
+        return SchemaKeyspace.fetchNonSystemKeyspaces()
+                             .stream()
+                             .map(keyspaceMetadata -> keyspaceMetadata.name)
+                             .collect(toList());
+    }
+
+    @VisibleForTesting
+    List<TableGCPeriod> getTablesGcPeriods(String userKeyspace)
+    {
+        Optional<KeyspaceMetadata> keyspaceMetadata = SchemaKeyspace.fetchNonSystemKeyspaces().get(userKeyspace);
+        if (!keyspaceMetadata.isPresent())
+            return Collections.emptyList();
+
+        KeyspaceMetadata ksmd = keyspaceMetadata.get();
+        return ksmd.tables.stream()
+                          .filter(tmd -> tmd.params.gcGraceSeconds > 0)
+                          .map(tmd -> new TableGCPeriod(tmd.name, tmd.params.gcGraceSeconds)).collect(toList());
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java b/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java
index 65cf3cc..2e26bb9 100644
--- a/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java
+++ b/src/java/org/apache/cassandra/service/DatacenterSyncWriteResponseHandler.java
@@ -20,8 +20,10 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.locator.IEndpointSnitch;
 import org.apache.cassandra.locator.NetworkTopologyStrategy;
 import org.apache.cassandra.locator.Replica;
@@ -40,13 +42,14 @@
     private final Map<String, AtomicInteger> responses = new HashMap<String, AtomicInteger>();
     private final AtomicInteger acks = new AtomicInteger(0);
 
-    public DatacenterSyncWriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan,
+    public DatacenterSyncWriteResponseHandler(ReplicaPlan.ForWrite replicaPlan,
                                               Runnable callback,
                                               WriteType writeType,
+                                              Supplier<Mutation> hintOnFailure,
                                               long queryStartNanoTime)
     {
         // Response is been managed by the map so make it 1 for the superclass.
-        super(replicaPlan, callback, writeType, queryStartNanoTime);
+        super(replicaPlan, callback, writeType, hintOnFailure, queryStartNanoTime);
         assert replicaPlan.consistencyLevel() == ConsistencyLevel.EACH_QUORUM;
 
         if (replicaPlan.replicationStrategy() instanceof NetworkTopologyStrategy)
diff --git a/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java b/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java
index a9583a3..4920a54 100644
--- a/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java
+++ b/src/java/org/apache/cassandra/service/DatacenterWriteResponseHandler.java
@@ -17,27 +17,30 @@
  */
 package org.apache.cassandra.service;
 
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.WriteType;
-import org.apache.cassandra.locator.InOurDcTester;
+import org.apache.cassandra.locator.InOurDc;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.ReplicaPlan;
 import org.apache.cassandra.net.Message;
 
 import java.util.function.Predicate;
+import java.util.function.Supplier;
 
 /**
  * This class blocks for a quorum of responses _in the local datacenter only_ (CL.LOCAL_QUORUM).
  */
 public class DatacenterWriteResponseHandler<T> extends WriteResponseHandler<T>
 {
-    private final Predicate<InetAddressAndPort> waitingFor = InOurDcTester.endpoints();
+    private final Predicate<InetAddressAndPort> waitingFor = InOurDc.endpoints();
 
-    public DatacenterWriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan,
+    public DatacenterWriteResponseHandler(ReplicaPlan.ForWrite replicaPlan,
                                           Runnable callback,
                                           WriteType writeType,
+                                          Supplier<Mutation> hintOnFailure,
                                           long queryStartNanoTime)
     {
-        super(replicaPlan, callback, writeType, queryStartNanoTime);
+        super(replicaPlan, callback, writeType, hintOnFailure, queryStartNanoTime);
         assert replicaPlan.consistencyLevel().isDatacenterLocal();
     }
 
diff --git a/src/java/org/apache/cassandra/service/DefaultFSErrorHandler.java b/src/java/org/apache/cassandra/service/DefaultFSErrorHandler.java
index ec8d8ac..8b18294 100644
--- a/src/java/org/apache/cassandra/service/DefaultFSErrorHandler.java
+++ b/src/java/org/apache/cassandra/service/DefaultFSErrorHandler.java
@@ -18,10 +18,12 @@
 
 package org.apache.cassandra.service;
 
-import java.io.File;
+
 import java.util.Set;
 
 import com.google.common.collect.ImmutableSet;
+
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -84,10 +86,10 @@
                 }
 
                 // for both read and write errors mark the path as unwritable.
-                DisallowedDirectories.maybeMarkUnwritable(e.path);
+                DisallowedDirectories.maybeMarkUnwritable(new File(e.path));
                 if (e instanceof FSReadError && shouldMaybeRemoveData(e))
                 {
-                    File directory = DisallowedDirectories.maybeMarkUnreadable(e.path);
+                    File directory = DisallowedDirectories.maybeMarkUnreadable(new File(e.path));
                     if (directory != null)
                         Keyspace.removeUnreadableSSTables(directory);
                 }
@@ -116,7 +118,8 @@
         return true;
     }
 
-    private static void handleStartupFSError(Throwable t)
+    @Override
+    public void handleStartupFSError(Throwable t)
     {
         switch (DatabaseDescriptor.getDiskFailurePolicy())
         {
diff --git a/src/java/org/apache/cassandra/service/EchoVerbHandler.java b/src/java/org/apache/cassandra/service/EchoVerbHandler.java
index 77fe4ab..228808d 100644
--- a/src/java/org/apache/cassandra/service/EchoVerbHandler.java
+++ b/src/java/org/apache/cassandra/service/EchoVerbHandler.java
@@ -19,7 +19,6 @@
  * under the License.
  *
  */
-import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.net.IVerbHandler;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
diff --git a/src/java/org/apache/cassandra/service/FailureRecordingCallback.java b/src/java/org/apache/cassandra/service/FailureRecordingCallback.java
new file mode 100644
index 0000000..c4ca8e2
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/FailureRecordingCallback.java
@@ -0,0 +1,153 @@
+/*
+ * 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.service;
+
+import java.util.AbstractMap;
+import java.util.AbstractSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.RequestCallbackWithFailure;
+import org.apache.cassandra.utils.concurrent.IntrusiveStack;
+
+import static org.apache.cassandra.exceptions.RequestFailureReason.TIMEOUT;
+
+public abstract class FailureRecordingCallback<T> implements RequestCallbackWithFailure<T>
+{
+    public static class FailureResponses extends IntrusiveStack<FailureResponses> implements Map.Entry<InetAddressAndPort, RequestFailureReason>
+    {
+        final InetAddressAndPort from;
+        final RequestFailureReason reason;
+
+        public FailureResponses(InetAddressAndPort from, RequestFailureReason reason)
+        {
+            this.from = from;
+            this.reason = reason;
+        }
+
+        @Override
+        public InetAddressAndPort getKey()
+        {
+            return from;
+        }
+
+        @Override
+        public RequestFailureReason getValue()
+        {
+            return reason;
+        }
+
+        @Override
+        public RequestFailureReason setValue(RequestFailureReason value)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        public static <O> void push(AtomicReferenceFieldUpdater<O, FailureResponses> headUpdater, O owner, InetAddressAndPort from, RequestFailureReason reason)
+        {
+            push(headUpdater, owner, new FailureResponses(from, reason));
+        }
+
+        public static <O> void pushExclusive(AtomicReferenceFieldUpdater<O, FailureResponses> headUpdater, O owner, InetAddressAndPort from, RequestFailureReason reason)
+        {
+            pushExclusive(headUpdater, owner, new FailureResponses(from, reason));
+        }
+
+        public static FailureResponses pushExclusive(FailureResponses head, InetAddressAndPort from, RequestFailureReason reason)
+        {
+            return IntrusiveStack.pushExclusive(head, new FailureResponses(from, reason));
+        }
+
+        public static int size(FailureResponses head)
+        {
+            return IntrusiveStack.size(head);
+        }
+
+        public static Iterator<FailureResponses> iterator(FailureResponses head)
+        {
+            return IntrusiveStack.iterator(head);
+        }
+
+        public static int failureCount(FailureResponses head)
+        {
+            return (int)IntrusiveStack.accumulate(head, (f, v) -> f.reason == TIMEOUT ? v : v + 1, 0);
+        }
+    }
+
+    public static class AsMap extends AbstractMap<InetAddressAndPort, RequestFailureReason>
+    {
+        final FailureResponses head;
+        int size = -1;
+
+        AsMap(FailureResponses head)
+        {
+            this.head = head;
+        }
+
+        @Override
+        public Set<Map.Entry<InetAddressAndPort, RequestFailureReason>> entrySet()
+        {
+            return new AbstractSet<Map.Entry<InetAddressAndPort, RequestFailureReason>>()
+            {
+                @Override
+                public Iterator<Map.Entry<InetAddressAndPort, RequestFailureReason>> iterator()
+                {
+                    return (Iterator<Map.Entry<InetAddressAndPort, RequestFailureReason>>)
+                            (Iterator<?>) FailureResponses.iterator(head);
+                }
+
+                @Override
+                public int size()
+                {
+                    if (size < 0)
+                        size = FailureResponses.size(head);
+                    return size;
+                }
+            };
+        }
+
+        public int failureCount()
+        {
+            return FailureResponses.failureCount(head);
+        }
+    }
+
+    private volatile FailureResponses failureResponses;
+    private static final AtomicReferenceFieldUpdater<FailureRecordingCallback, FailureResponses> responsesUpdater = AtomicReferenceFieldUpdater.newUpdater(FailureRecordingCallback.class, FailureResponses.class, "failureResponses");
+
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason)
+    {
+        FailureResponses.push(responsesUpdater, this, from, failureReason);
+    }
+
+    protected void onFailureWithMutex(InetAddressAndPort from, RequestFailureReason failureReason)
+    {
+        FailureResponses.pushExclusive(responsesUpdater, this, from, failureReason);
+    }
+
+    protected AsMap failureReasonsAsMap()
+    {
+        return new AsMap(failureResponses);
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/FileSystemOwnershipCheck.java b/src/java/org/apache/cassandra/service/FileSystemOwnershipCheck.java
new file mode 100644
index 0000000..3d69c9e
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/FileSystemOwnershipCheck.java
@@ -0,0 +1,317 @@
+/*
+ * 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.service;
+
+import java.io.BufferedReader;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.*;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Multimap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.StartupChecksOptions;
+import org.apache.cassandra.exceptions.StartupException;
+import org.apache.cassandra.io.util.File;
+
+import static org.apache.cassandra.service.StartupChecks.StartupCheckType.check_filesystem_ownership;
+
+/**
+ * Ownership markers on disk are compatible with the java property file format.
+ * (https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html#load-java.io.Reader-)
+ *
+ * This simple formatting is intended to enable them to be created either
+ * manually or by automated tooling using minimal standard tools (editor/shell
+ * builtins/etc).
+ * The only mandatory property is version, which must be parseable as an int
+ * and upon which the futher set of required properties will depend.
+ *
+ * In version 1, two further property values are required:
+ * - volume_count
+ *   to be parsed as an int representing the number of mounted volumes where
+ *   a marker file is expected.
+ * - ownership_token
+ *   must contain a non-empty token string that can be compared to one
+ *   derived from system properties. For version 1, this is simply the cluster name.
+ *
+ * For this check to succeed as of version 1 then:
+ * - There must be a single properties file found in the fs tree for each
+ *   target directory.
+ * - Every file found must contain the mandatory version property with the
+ *   literal value '1'.
+ * - The value of the ownership_token property in each file must match the
+ *   cluster name
+ * - The value of the volume_count property must be an int which must matches
+ *   the number of distinct marker files found when traversing the filesystem.
+ *
+ * In overridden implementations, you will need to override {@link #constructTokenFromProperties(Map)}
+ * and add the related *_PROPERTY values you will want the system to check on startup to confirm ownership.
+ */
+public class FileSystemOwnershipCheck implements StartupCheck
+{
+    private static final Logger logger = LoggerFactory.getLogger(FileSystemOwnershipCheck.class);
+
+    public static final String FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN = "CassandraOwnershipToken";
+    public static final String DEFAULT_FS_OWNERSHIP_FILENAME = ".cassandra_fs_ownership";
+
+    // Ownership file properties
+    static final String VERSION                                 = "version";
+    static final String VOLUME_COUNT                            = "volume_count";
+    static final String TOKEN                                   = "ownership_token";
+
+    // Error strings
+    static final String ERROR_PREFIX                            = "FS ownership check failed; ";
+    static final String MISSING_PROPERTY                        = "property '%s' required for fs ownership check not supplied";
+    static final String NO_OWNERSHIP_FILE                       = "no file found in tree for %s";
+    static final String MULTIPLE_OWNERSHIP_FILES                = "multiple files found in tree for %s";
+    static final String INCONSISTENT_FILES_FOUND                = "inconsistent ownership files found on disk: %s";
+    static final String INVALID_FILE_COUNT                      = "number of ownership files found doesn't match expected";
+    static final String MISMATCHING_TOKEN                       = "token found on disk does not match supplied";
+    static final String UNSUPPORTED_VERSION                     = "unsupported version '%s' in ownership file";
+    static final String INVALID_PROPERTY_VALUE                  = "invalid or missing value for property '%s'";
+    static final String READ_EXCEPTION                          = "error when checking for fs ownership file";
+
+    private final Supplier<Iterable<String>> dirs;
+
+    FileSystemOwnershipCheck()
+    {
+        this(() -> Iterables.concat(Arrays.asList(DatabaseDescriptor.getAllDataFileLocations()),
+                                    Arrays.asList(DatabaseDescriptor.getCommitLogLocation(),
+                                                  DatabaseDescriptor.getSavedCachesLocation(),
+                                                  DatabaseDescriptor.getHintsDirectory().absolutePath())));
+    }
+
+    @VisibleForTesting
+    FileSystemOwnershipCheck(Supplier<Iterable<String>> dirs)
+    {
+        this.dirs = dirs;
+    }
+
+    @Override
+    public StartupChecks.StartupCheckType getStartupCheckType()
+    {
+        return check_filesystem_ownership;
+    }
+
+    @Override
+    public void execute(StartupChecksOptions options) throws StartupException
+    {
+        if (!isEnabled(options))
+        {
+            logger.info("Filesystem ownership check is not enabled.");
+            return;
+        }
+
+        Map<String, Object> config = options.getConfig(getStartupCheckType());
+
+        String expectedToken = constructTokenFromProperties(config);
+        String tokenFilename = getFsOwnershipFilename(config);
+        Map<String, Integer> foundPerTargetDir = new HashMap<>();
+        Map<Path, Properties> foundProperties = new HashMap<>();
+
+        // Step 1: Traverse the filesystem from each target dir upward, looking for marker files
+        for (String dataDir : dirs.get())
+        {
+            logger.info("Checking for fs ownership details in file hierarchy for {}", dataDir);
+            int foundFiles = 0;
+            Path dir = File.getPath(dataDir).normalize();
+            do
+            {
+                File tokenFile = resolve(dir, tokenFilename);
+                if (tokenFile.exists())
+                {
+                    foundFiles++;
+                    if (!foundProperties.containsKey(tokenFile.toPath().toAbsolutePath()))
+                    {
+                        try (BufferedReader reader = Files.newBufferedReader(tokenFile.toPath()))
+                        {
+                            Properties props = new Properties();
+                            props.load(reader);
+                            foundProperties.put(tokenFile.toPath().toAbsolutePath(), props);
+                        }
+                        catch (Exception e)
+                        {
+                            logger.error("Error reading fs ownership file from disk", e);
+                            throw exception(READ_EXCEPTION);
+                        }
+                    }
+                }
+                dir = dir.getParent();
+            } while (dir != null);
+
+            foundPerTargetDir.put(dataDir, foundFiles);
+        }
+
+        // If a marker file couldn't be found for every target directory, error.
+        if (foundPerTargetDir.containsValue(0))
+        {
+            throw exception(String.format(NO_OWNERSHIP_FILE, foundPerTargetDir.entrySet()
+                                                                              .stream()
+                                                                              .filter(e -> e.getValue() == 0)
+                                                                              .map(Map.Entry::getKey)
+                                                                              .collect(Collectors.joining("', '", "'", "'"))));
+        }
+
+        // If more than one marker file was found in the tree for any target directory, error
+        Set<String> multipleTokens = foundPerTargetDir.entrySet()
+                                                      .stream()
+                                                      .filter(e -> e.getValue() > 1)
+                                                      .map(Map.Entry::getKey)
+                                                      .collect(Collectors.toSet());
+        if (!multipleTokens.isEmpty())
+            throw exception(String.format(MULTIPLE_OWNERSHIP_FILES, String.join(",", multipleTokens)));
+
+        // Step 2: assert that the content of each file is identical
+        assert !foundProperties.isEmpty();
+        Multimap<Integer, Path> byHash = HashMultimap.create();
+        foundProperties.forEach((key, value) -> byHash.put(value.hashCode(), key));
+        if (byHash.keySet().size() > 1)
+        {
+            // Group identical files to highlight where the mismatches are, worst case is
+            // they're all unique, but even then the number of individual files should be low
+            throw exception(String.format(INCONSISTENT_FILES_FOUND,
+                                          byHash.keySet()
+                                                .stream()
+                                                .map(hash -> byHash.get(hash)
+                                                                   .stream()
+                                                                   .map(Path::toString)
+                                                                   .sorted()
+                                                                   .collect(Collectors.joining("', '", "['", "']")))
+                                                .sorted()
+                                                .collect(Collectors.joining(", "))));
+        }
+
+        // Step 3: validate the content of the properties from disk
+        // Currently, only version 1 is supported which requires:
+        //   volume_count       that matches the number of unique files we found
+        //   ownership_token    that matches the one constructed from system props
+        Properties fromDisk = foundProperties.entrySet().iterator().next().getValue();
+        int version = getIntProperty(fromDisk, VERSION);
+        if (version != 1)
+            throw exception(String.format(UNSUPPORTED_VERSION, version));
+
+        int volumeCount = getIntProperty(fromDisk, VOLUME_COUNT);
+        if (volumeCount != foundProperties.size())
+            throw exception(INVALID_FILE_COUNT);
+
+        String token = getRequiredProperty(fromDisk, TOKEN);
+        if (!expectedToken.equals(token))
+            throw exception(MISMATCHING_TOKEN);
+
+        logger.info("Successfully verified fs ownership");
+    }
+
+    /** In version 1, we check and return the ownership token. Extend this for custom ownership hierarchies. */
+    protected String constructTokenFromProperties(Map<String, Object> config) throws StartupException
+    {
+        String cluster = getOwnershipToken(config);
+        if (null == cluster || cluster.isEmpty())
+            throw exception(String.format(MISSING_PROPERTY, FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN));
+        return cluster;
+    }
+
+    private int getIntProperty(Properties props, String key) throws StartupException
+    {
+        String val = getRequiredProperty(props, key);
+        try
+        {
+            return Integer.parseInt(val);
+        }
+        catch (NumberFormatException e)
+        {
+            throw exception(String.format(INVALID_PROPERTY_VALUE, key));
+        }
+    }
+
+    private String getRequiredProperty(Properties props, String key) throws StartupException
+    {
+        String s = props.getProperty(key);
+        if (null == s || s.isEmpty())
+            throw exception(String.format(INVALID_PROPERTY_VALUE, key));
+        return s;
+    }
+
+    private File resolve(Path dir, String filename) throws StartupException
+    {
+        try
+        {
+            return new File(dir.resolve(filename));
+        }
+        catch (Exception e)
+        {
+            logger.error("Encountered error resolving path ownership file {} relative to dir {}", filename, dir);
+            throw exception(READ_EXCEPTION);
+        }
+    }
+
+    private StartupException exception(String message)
+    {
+        return new StartupException(StartupException.ERR_WRONG_DISK_STATE, ERROR_PREFIX + message);
+    }
+
+    public boolean isEnabled(StartupChecksOptions options)
+    {
+        boolean enabledFromYaml = options.isEnabled(getStartupCheckType());
+        return CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.getBoolean(enabledFromYaml);
+    }
+
+    public String getFsOwnershipFilename(Map<String, Object> config)
+    {
+        if (CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME.isPresent())
+        {
+            logger.warn(String.format("Cassandra system property flag %s is deprecated and you should " +
+                                      "use startup check configuration in cassandra.yaml",
+                                      CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME.getKey()));
+            return CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME.getString();
+        }
+        else
+        {
+            Object fsOwnershipFilename = config.get("ownership_filename");
+            return fsOwnershipFilename == null
+                   ? CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME.getDefaultValue()
+                   : (String) fsOwnershipFilename;
+        }
+    }
+
+    public String getOwnershipToken(Map<String, Object> config)
+    {
+        if (CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.isPresent())
+        {
+            logger.warn(String.format("Cassandra system property flag %s is deprecated and you should " +
+                                      "use startup check configuration in cassandra.yaml",
+                                      CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey()));
+            return CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getString();
+        }
+        else
+        {
+            Object ownershipToken = config.get("ownership_token");
+            return ownershipToken == null
+                   ? CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getDefaultValue()
+                   : (String) ownershipToken;
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/service/GCInspector.java b/src/java/org/apache/cassandra/service/GCInspector.java
index 0d42e72..c290d9e 100644
--- a/src/java/org/apache/cassandra/service/GCInspector.java
+++ b/src/java/org/apache/cassandra/service/GCInspector.java
@@ -47,6 +47,8 @@
 import org.apache.cassandra.utils.MBeanWrapper;
 import org.apache.cassandra.utils.StatusLogger;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class GCInspector implements NotificationListener, GCInspectorMXBean
 {
     public static final String MBEAN_NAME = "org.apache.cassandra.service:type=GCInspector";
@@ -108,7 +110,7 @@
         State()
         {
             count = maxRealTimeElapsed = sumSquaresRealTimeElapsed = totalRealTimeElapsed = totalBytesReclaimed = 0;
-            startNanos = System.nanoTime();
+            startNanos = nanoTime();
         }
     }
 
@@ -313,7 +315,7 @@
     {
         State state = getTotalSinceLastCheck();
         double[] r = new double[7];
-        r[0] = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - state.startNanos);
+        r[0] = TimeUnit.NANOSECONDS.toMillis(nanoTime() - state.startNanos);
         r[1] = state.maxRealTimeElapsed;
         r[2] = state.totalRealTimeElapsed;
         r[3] = state.sumSquaresRealTimeElapsed;
diff --git a/src/java/org/apache/cassandra/service/NativeTransportService.java b/src/java/org/apache/cassandra/service/NativeTransportService.java
index 7556f81..f131d74 100644
--- a/src/java/org/apache/cassandra/service/NativeTransportService.java
+++ b/src/java/org/apache/cassandra/service/NativeTransportService.java
@@ -149,7 +149,8 @@
         servers = Collections.emptyList();
 
         // shutdown executors used by netty for native transport server
-        workerGroup.shutdownGracefully(3, 5, TimeUnit.SECONDS).awaitUninterruptibly();
+        if (workerGroup != null)
+            workerGroup.shutdownGracefully(3, 5, TimeUnit.SECONDS).awaitUninterruptibly();
 
         Dispatcher.shutdown();
     }
diff --git a/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java b/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
index 1c6b183..837bdd8 100644
--- a/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
+++ b/src/java/org/apache/cassandra/service/PendingRangeCalculatorService.java
@@ -18,104 +18,71 @@
 
 package org.apache.cassandra.service;
 
-import org.apache.cassandra.concurrent.JMXEnabledThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.locator.AbstractReplicationStrategy;
-import org.apache.cassandra.utils.ExecutorUtils;
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 
+import com.google.common.annotations.VisibleForTesting;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.util.List;
-import java.util.concurrent.*;
-import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.cassandra.concurrent.SequentialExecutorPlus;
+import org.apache.cassandra.concurrent.SequentialExecutorPlus.AtLeastOnceTrigger;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.locator.AbstractReplicationStrategy;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.utils.ExecutorUtils;
 
-import com.google.common.annotations.VisibleForTesting;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class PendingRangeCalculatorService
 {
     public static final PendingRangeCalculatorService instance = new PendingRangeCalculatorService();
 
-    private static Logger logger = LoggerFactory.getLogger(PendingRangeCalculatorService.class);
+    private static final Logger logger = LoggerFactory.getLogger(PendingRangeCalculatorService.class);
 
     // the executor will only run a single range calculation at a time while keeping at most one task queued in order
     // to trigger an update only after the most recent state change and not for each update individually
-    private final JMXEnabledThreadPoolExecutor executor = new JMXEnabledThreadPoolExecutor(1, Integer.MAX_VALUE, TimeUnit.SECONDS,
-            new LinkedBlockingQueue<>(1), new NamedThreadFactory("PendingRangeCalculator"), "internal");
+    private final SequentialExecutorPlus executor = executorFactory()
+            .withJmxInternal()
+            .configureSequential("PendingRangeCalculator")
+            .withRejectedExecutionHandler((r, e) -> {})  // silently handle rejected tasks, this::update takes care of bookkeeping
+            .build();
 
-    private AtomicInteger updateJobs = new AtomicInteger(0);
+    private final AtLeastOnceTrigger update = executor.atLeastOnceTrigger(() -> {
+        PendingRangeCalculatorServiceDiagnostics.taskStarted(1);
+        long start = currentTimeMillis();
+        Collection<String> keyspaces = Schema.instance.getNonLocalStrategyKeyspaces().names();
+        for (String keyspaceName : keyspaces)
+            calculatePendingRanges(Keyspace.open(keyspaceName).getReplicationStrategy(), keyspaceName);
+        if (logger.isTraceEnabled())
+            logger.trace("Finished PendingRangeTask for {} keyspaces in {}ms", keyspaces.size(), currentTimeMillis() - start);
+        PendingRangeCalculatorServiceDiagnostics.taskFinished();
+    });
 
     public PendingRangeCalculatorService()
     {
-        executor.setRejectedExecutionHandler((r, e) ->
-            {
-                PendingRangeCalculatorServiceDiagnostics.taskRejected(instance, updateJobs);
-                PendingRangeCalculatorService.instance.finishUpdate();
-            }
-        );
-    }
-
-    private static class PendingRangeTask implements Runnable
-    {
-        private final AtomicInteger updateJobs;
-
-        PendingRangeTask(AtomicInteger updateJobs)
-        {
-            this.updateJobs = updateJobs;
-        }
-
-        public void run()
-        {
-            try
-            {
-                PendingRangeCalculatorServiceDiagnostics.taskStarted(instance, updateJobs);
-                long start = System.currentTimeMillis();
-                List<String> keyspaces = Schema.instance.getNonLocalStrategyKeyspaces();
-                for (String keyspaceName : keyspaces)
-                    calculatePendingRanges(Keyspace.open(keyspaceName).getReplicationStrategy(), keyspaceName);
-                if (logger.isTraceEnabled())
-                    logger.trace("Finished PendingRangeTask for {} keyspaces in {}ms", keyspaces.size(), System.currentTimeMillis() - start);
-                PendingRangeCalculatorServiceDiagnostics.taskFinished(instance, updateJobs);
-            }
-            finally
-            {
-                PendingRangeCalculatorService.instance.finishUpdate();
-            }
-        }
-    }
-
-    private void finishUpdate()
-    {
-        int jobs = updateJobs.decrementAndGet();
-        PendingRangeCalculatorServiceDiagnostics.taskCountChanged(instance, jobs);
     }
 
     public void update()
     {
-        int jobs = updateJobs.incrementAndGet();
-        PendingRangeCalculatorServiceDiagnostics.taskCountChanged(instance, jobs);
-        executor.execute(new PendingRangeTask(updateJobs));
+        boolean success = update.trigger();
+        if (!success) PendingRangeCalculatorServiceDiagnostics.taskRejected(1);
+        else PendingRangeCalculatorServiceDiagnostics.taskCountChanged(1);
     }
 
     public void blockUntilFinished()
     {
-        // We want to be sure the job we're blocking for is actually finished and we can't trust the TPE's active job count
-        while (updateJobs.get() > 0)
-        {
-            try
-            {
-                Thread.sleep(100);
-            }
-            catch (InterruptedException e)
-            {
-                throw new RuntimeException(e);
-            }
-        }
+        update.sync();
     }
 
 
+    public void executeWhenFinished(Runnable runnable)
+    {
+        update.runAfter(runnable);
+    }
+
     // public & static for testing purposes
     public static void calculatePendingRanges(AbstractReplicationStrategy strategy, String keyspaceName)
     {
@@ -127,4 +94,5 @@
     {
         ExecutorUtils.shutdownNowAndWait(timeout, unit, executor);
     }
+
 }
diff --git a/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceDiagnostics.java b/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceDiagnostics.java
index ec09e3f..2b677d1 100644
--- a/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceDiagnostics.java
+++ b/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceDiagnostics.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.service;
 
-import java.util.concurrent.atomic.AtomicInteger;
-
 import org.apache.cassandra.diag.DiagnosticEventService;
 import org.apache.cassandra.service.PendingRangeCalculatorServiceEvent.PendingRangeCalculatorServiceEventType;
 
@@ -34,35 +32,30 @@
     {
     }
     
-    static void taskStarted(PendingRangeCalculatorService calculatorService, AtomicInteger taskCount)
+    static void taskStarted(int taskCount)
     {
         if (isEnabled(PendingRangeCalculatorServiceEventType.TASK_STARTED))
             service.publish(new PendingRangeCalculatorServiceEvent(PendingRangeCalculatorServiceEventType.TASK_STARTED,
-                                                                   calculatorService,
-                                                                   taskCount.get()));
+                                                                   taskCount));
     }
 
-    static void taskFinished(PendingRangeCalculatorService calculatorService, AtomicInteger taskCount)
+    static void taskFinished()
     {
         if (isEnabled(PendingRangeCalculatorServiceEventType.TASK_FINISHED_SUCCESSFULLY))
-            service.publish(new PendingRangeCalculatorServiceEvent(PendingRangeCalculatorServiceEventType.TASK_FINISHED_SUCCESSFULLY,
-                                                                   calculatorService,
-                                                                   taskCount.get()));
+            service.publish(new PendingRangeCalculatorServiceEvent(PendingRangeCalculatorServiceEventType.TASK_FINISHED_SUCCESSFULLY));
     }
 
-    static void taskRejected(PendingRangeCalculatorService calculatorService, AtomicInteger taskCount)
+    static void taskRejected(int taskCount)
     {
         if (isEnabled(PendingRangeCalculatorServiceEventType.TASK_EXECUTION_REJECTED))
             service.publish(new PendingRangeCalculatorServiceEvent(PendingRangeCalculatorServiceEventType.TASK_EXECUTION_REJECTED,
-                                                                   calculatorService,
-                                                                   taskCount.get()));
+                                                                   taskCount));
     }
 
-    static void taskCountChanged(PendingRangeCalculatorService calculatorService, int taskCount)
+    static void taskCountChanged(int taskCount)
     {
         if (isEnabled(PendingRangeCalculatorServiceEventType.TASK_COUNT_CHANGED))
             service.publish(new PendingRangeCalculatorServiceEvent(PendingRangeCalculatorServiceEventType.TASK_COUNT_CHANGED,
-                                                                   calculatorService,
                                                                    taskCount));
     }
 
diff --git a/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceEvent.java b/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceEvent.java
index 3024149..f255173 100644
--- a/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceEvent.java
+++ b/src/java/org/apache/cassandra/service/PendingRangeCalculatorServiceEvent.java
@@ -19,7 +19,9 @@
 package org.apache.cassandra.service;
 
 import java.io.Serializable;
+import java.util.Collections;
 import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.cassandra.diag.DiagnosticEvent;
 
@@ -29,7 +31,6 @@
 final class PendingRangeCalculatorServiceEvent extends DiagnosticEvent
 {
     private final PendingRangeCalculatorServiceEventType type;
-    private final PendingRangeCalculatorService source;
     private final int taskCount;
 
     public enum PendingRangeCalculatorServiceEventType
@@ -40,12 +41,15 @@
         TASK_COUNT_CHANGED
     }
 
+    PendingRangeCalculatorServiceEvent(PendingRangeCalculatorServiceEventType type)
+    {
+        this(type, -1);
+    }
+
     PendingRangeCalculatorServiceEvent(PendingRangeCalculatorServiceEventType type,
-                                       PendingRangeCalculatorService service,
                                        int taskCount)
     {
         this.type = type;
-        this.source = service;
         this.taskCount = taskCount;
     }
 
@@ -59,9 +63,11 @@
         return type;
     }
 
-    public HashMap<String, Serializable> toMap()
+    public Map<String, Serializable> toMap()
     {
         // be extra defensive against nulls and bugs
+        if (taskCount < 0)
+            return Collections.emptyMap();
         HashMap<String, Serializable> ret = new HashMap<>();
         ret.put("taskCount", taskCount);
         return ret;
diff --git a/src/java/org/apache/cassandra/service/QueryState.java b/src/java/org/apache/cassandra/service/QueryState.java
index adb13b5..b2275f2 100644
--- a/src/java/org/apache/cassandra/service/QueryState.java
+++ b/src/java/org/apache/cassandra/service/QueryState.java
@@ -19,7 +19,6 @@
 
 import java.net.InetAddress;
 
-import org.apache.cassandra.transport.ClientStat;
 import org.apache.cassandra.utils.FBUtilities;
 
 /**
diff --git a/src/java/org/apache/cassandra/service/SnapshotVerbHandler.java b/src/java/org/apache/cassandra/service/SnapshotVerbHandler.java
index 1309d6e..850c982 100644
--- a/src/java/org/apache/cassandra/service/SnapshotVerbHandler.java
+++ b/src/java/org/apache/cassandra/service/SnapshotVerbHandler.java
@@ -17,16 +17,11 @@
  */
 package org.apache.cassandra.service;
 
-import java.util.concurrent.Executor;
-import java.util.concurrent.Executors;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.SnapshotCommand;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.IVerbHandler;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
diff --git a/src/java/org/apache/cassandra/service/StartupCheck.java b/src/java/org/apache/cassandra/service/StartupCheck.java
index 649f13c..331b381 100644
--- a/src/java/org/apache/cassandra/service/StartupCheck.java
+++ b/src/java/org/apache/cassandra/service/StartupCheck.java
@@ -17,14 +17,16 @@
  */
 package org.apache.cassandra.service;
 
+import org.apache.cassandra.config.StartupChecksOptions;
 import org.apache.cassandra.exceptions.StartupException;
+import org.apache.cassandra.service.StartupChecks.StartupCheckType;
 
 /**
  * A test to determine if the system is in a valid state to start up.
  * Some implementations may not actually halt startup, but provide
  * information or advice on tuning and non-fatal environmental issues (e.g. like
  * checking for and warning about suboptimal JVM settings).
- * Other checks may indicate that they system is not in a correct state to be started.
+ * Other checks may indicate that the system is not in a correct state to be started.
  * Examples include missing or unaccessible data directories, unreadable sstables and
  * misconfiguration of cluster_name in cassandra.yaml.
  *
@@ -39,8 +41,27 @@
      * test should log a message regarding the reason for the failure and
      * ideally the steps required to remedy the problem.
      *
+     * @param startupChecksOptions all options from descriptor
      * @throws org.apache.cassandra.exceptions.StartupException if the test determines
      * that the environement or system is not in a safe state to startup
      */
-    void execute() throws StartupException;
+    void execute(StartupChecksOptions startupChecksOptions) throws StartupException;
+
+    /**
+     *
+     * @return type of this startup check for configuration retrieval
+     */
+    default StartupCheckType getStartupCheckType()
+    {
+        return StartupCheckType.non_configurable_check;
+    }
+
+    /**
+     * Post-hook after all startup checks succeeded.
+     *
+     * @param options startup check options from descriptor
+     */
+    default void postAction(StartupChecksOptions options)
+    {
+    }
 }
diff --git a/src/java/org/apache/cassandra/service/StartupChecks.java b/src/java/org/apache/cassandra/service/StartupChecks.java
index dadb0c5..0aacc02 100644
--- a/src/java/org/apache/cassandra/service/StartupChecks.java
+++ b/src/java/org/apache/cassandra/service/StartupChecks.java
@@ -18,13 +18,25 @@
 package org.apache.cassandra.service;
 
 import java.io.BufferedReader;
-import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.RuntimeMXBean;
-import java.nio.file.*;
+import java.nio.file.FileStore;
+import java.nio.file.FileVisitResult;
+import java.nio.file.FileVisitor;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
 import java.nio.file.attribute.BasicFileAttributes;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 import com.google.common.annotations.VisibleForTesting;
@@ -32,34 +44,39 @@
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import net.jpountz.lz4.LZ4Factory;
-import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.config.StartupChecksOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.StartupException;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.UUIDBasedSSTableId;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.utils.NativeLibrary;
+import org.apache.cassandra.io.util.PathUtils;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JavaUtils;
-import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.NativeLibrary;
 import org.apache.cassandra.utils.SigarLibrary;
 
-import static java.lang.String.format;
 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;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * Verifies that the system and environment is in a fit state to be started.
@@ -82,6 +99,28 @@
  */
 public class StartupChecks
 {
+    public enum StartupCheckType
+    {
+        // non-configurable check is always enabled for execution
+        non_configurable_check,
+        check_filesystem_ownership(true),
+        check_dc,
+        check_rack,
+        check_data_resurrection(true);
+
+        public final boolean disabledByDefault;
+
+        StartupCheckType()
+        {
+            this(false);
+        }
+
+        StartupCheckType(boolean disabledByDefault)
+        {
+            this.disabledByDefault = disabledByDefault;
+        }
+    }
+
     private static final Logger logger = LoggerFactory.getLogger(StartupChecks.class);
     // List of checks to run before starting up. If any test reports failure, startup will be halted.
     private final List<StartupCheck> preFlightChecks = new ArrayList<>();
@@ -98,12 +137,14 @@
                                                                       checkNativeLibraryInitialization,
                                                                       initSigarLibrary,
                                                                       checkMaxMapCount,
+                                                                      checkReadAheadKbSetting,
                                                                       checkDataDirs,
                                                                       checkSSTablesFormat,
                                                                       checkSystemKeyspaceState,
                                                                       checkDatacenter,
                                                                       checkRack,
-                                                                      checkLegacyAuthTables);
+                                                                      checkLegacyAuthTables,
+                                                                      new DataResurrectionCheck());
 
     public StartupChecks withDefaultTests()
     {
@@ -125,20 +166,35 @@
      * Run the configured tests and return a report detailing the results.
      * @throws org.apache.cassandra.exceptions.StartupException if any test determines that the
      * system is not in an valid state to startup
+     * @param options options to pass to respective checks for their configration
      */
-    public void verify() throws StartupException
+    public void verify(StartupChecksOptions options) throws StartupException
     {
         for (StartupCheck test : preFlightChecks)
-            test.execute();
+            test.execute(options);
+
+        for (StartupCheck test : preFlightChecks)
+        {
+            try
+            {
+                test.postAction(options);
+            }
+            catch (Throwable t)
+            {
+                logger.warn("Failed to run startup check post-action on " + test.getStartupCheckType());
+            }
+        }
     }
 
     public static final StartupCheck checkJemalloc = new StartupCheck()
     {
-        public void execute()
+        @Override
+        public void execute(StartupChecksOptions options)
         {
-            if (FBUtilities.isWindows)
+            if (options.isDisabled(getStartupCheckType()))
                 return;
-            String jemalloc = System.getProperty("cassandra.libjemalloc");
+
+            String jemalloc = CassandraRelevantProperties.LIBJEMALLOC.getString();
             if (jemalloc == null)
                 logger.warn("jemalloc shared library could not be preloaded to speed up memory allocations");
             else if ("-".equals(jemalloc))
@@ -148,14 +204,21 @@
         }
     };
 
-    public static final StartupCheck checkLz4Native = () -> {
-        try
+    public static final StartupCheck checkLz4Native = new StartupCheck()
+    {
+        @Override
+        public void execute(StartupChecksOptions options)
         {
-            LZ4Factory.nativeInstance(); // make sure native loads
-        }
-        catch (AssertionError | LinkageError e)
-        {
-            logger.warn("lz4-java was unable to load native libraries; this will lower the performance of lz4 (network/sstables/etc.): {}", Throwables.getRootCause(e).getMessage());
+            if (options.isDisabled(getStartupCheckType()))
+                return;
+            try
+            {
+                LZ4Factory.nativeInstance(); // make sure native loads
+            }
+            catch (AssertionError | LinkageError e)
+            {
+                logger.warn("lz4-java was unable to load native libraries; this will lower the performance of lz4 (network/sstables/etc.): {}", Throwables.getRootCause(e).getMessage());
+            }
         }
     };
 
@@ -167,9 +230,13 @@
          * We use this to ensure the system clock is at least somewhat correct at startup.
          */
         private static final long EARLIEST_LAUNCH_DATE = 1215820800000L;
-        public void execute() throws StartupException
+
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
         {
-            long now = System.currentTimeMillis();
+            if (options.isDisabled(getStartupCheckType()))
+                return;
+            long now = currentTimeMillis();
             if (now < EARLIEST_LAUNCH_DATE)
                 throw new StartupException(StartupException.ERR_WRONG_MACHINE_STATE,
                                            String.format("current machine time is %s, but that is seemingly incorrect. exiting now.",
@@ -179,13 +246,16 @@
 
     public static final StartupCheck checkJMXPorts = new StartupCheck()
     {
-        public void execute()
+        @Override
+        public void execute(StartupChecksOptions options)
         {
-            String jmxPort = System.getProperty("cassandra.jmx.remote.port");
+            if (options.isDisabled(getStartupCheckType()))
+                return;
+            String jmxPort = CassandraRelevantProperties.CASSANDRA_JMX_REMOTE_PORT.getString();
             if (jmxPort == null)
             {
                 logger.warn("JMX is not enabled to receive remote connections. Please see cassandra-env.sh for more info.");
-                jmxPort = System.getProperty("cassandra.jmx.local.port");
+                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.");
             }
@@ -198,8 +268,11 @@
 
     public static final StartupCheck checkJMXProperties = new StartupCheck()
     {
-        public void execute()
+        @Override
+        public void execute(StartupChecksOptions options)
         {
+            if (options.isDisabled(getStartupCheckType()))
+                return;
             if (COM_SUN_MANAGEMENT_JMXREMOTE_PORT.isPresent())
             {
                 logger.warn("Use of com.sun.management.jmxremote.port at startup is deprecated. " +
@@ -210,8 +283,11 @@
 
     public static final StartupCheck inspectJvmOptions = new StartupCheck()
     {
-        public void execute()
+        @Override
+        public void execute(StartupChecksOptions options)
         {
+            if (options.isDisabled(getStartupCheckType()))
+                return;
             // log warnings for different kinds of sub-optimal JVMs.  tldr use 64-bit Oracle >= 1.6u32
             if (!DatabaseDescriptor.hasLargeAddressSpace())
                 logger.warn("32bit JVM detected.  It is recommended to run Cassandra on a 64bit JVM for better performance.");
@@ -269,8 +345,11 @@
 
     public static final StartupCheck checkNativeLibraryInitialization = new StartupCheck()
     {
-        public void execute() throws StartupException
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
         {
+            if (options.isDisabled(getStartupCheckType()))
+                return;
             // Fail-fast if the native library could not be linked.
             if (!NativeLibrary.isAvailable())
                 throw new StartupException(StartupException.ERR_WRONG_MACHINE_STATE, "The native library could not be initialized properly. ");
@@ -279,12 +358,95 @@
 
     public static final StartupCheck initSigarLibrary = new StartupCheck()
     {
-        public void execute()
+        @Override
+        public void execute(StartupChecksOptions options)
         {
+            if (options.isDisabled(getStartupCheckType()))
+                return;
             SigarLibrary.instance.warnIfRunningInDegradedMode();
         }
     };
 
+    public static final StartupCheck checkReadAheadKbSetting = new StartupCheck()
+    {
+        // This value is in KB.
+        private static final long MAX_RECOMMENDED_READ_AHEAD_KB_SETTING = 128;
+
+        /**
+         * Function to get the block device system path(Example: /dev/sda) from the
+         * data directories defined in cassandra config.(cassandra.yaml)
+         * @param dataDirectories list of data directories from cassandra.yaml
+         * @return Map of block device path and data directory
+         */
+        private Map<String, String> getBlockDevices(String[] dataDirectories) {
+            Map<String, String> blockDevices = new HashMap<String, String>();
+
+            for (String dataDirectory : dataDirectories)
+            {
+                try
+                {
+                    Path p = File.getPath(dataDirectory);
+                    FileStore fs = Files.getFileStore(p);
+
+                    String blockDirectory = fs.name();
+                    if(StringUtils.isNotEmpty(blockDirectory))
+                    {
+                        blockDevices.put(blockDirectory, dataDirectory);
+                    }
+                }
+                catch (IOException e)
+                {
+                    logger.warn("IO exception while reading file {}.", dataDirectory, e);
+                }
+            }
+            return blockDevices;
+        }
+
+        @Override
+        public void execute(StartupChecksOptions options)
+        {
+            if (options.isDisabled(getStartupCheckType()) || !FBUtilities.isLinux)
+                return;
+
+            String[] dataDirectories = DatabaseDescriptor.getRawConfig().data_file_directories;
+            Map<String, String> blockDevices = getBlockDevices(dataDirectories);
+
+            for (Map.Entry<String, String> entry: blockDevices.entrySet())
+            {
+                String blockDeviceDirectory = entry.getKey();
+                String dataDirectory = entry.getValue();
+                try
+                {
+                    Path readAheadKBPath = StartupChecks.getReadAheadKBPath(blockDeviceDirectory);
+
+                    if (readAheadKBPath == null || Files.notExists(readAheadKBPath))
+                    {
+                        logger.debug("No 'read_ahead_kb' setting found for device {} of data directory {}.", blockDeviceDirectory, dataDirectory);
+                        continue;
+                    }
+
+                    final List<String> data = Files.readAllLines(readAheadKBPath);
+                    if (data.isEmpty())
+                        continue;
+
+                    int readAheadKbSetting = Integer.parseInt(data.get(0));
+
+                    if (readAheadKbSetting > MAX_RECOMMENDED_READ_AHEAD_KB_SETTING)
+                    {
+                        logger.warn("Detected high '{}' setting of {} for device '{}' of data directory '{}'. It is " +
+                                    "recommended to set this value to 8KB (or lower) on SSDs or 64KB (or lower) on HDDs " +
+                                    "to prevent excessive IO usage and page cache churn on read-intensive workloads.",
+                                    readAheadKBPath, readAheadKbSetting, blockDeviceDirectory, dataDirectory);
+                    }
+                }
+                catch (final IOException e)
+                {
+                    logger.warn("IO exception while reading file {}.", blockDeviceDirectory, e);
+                }
+            }
+        }
+    };
+
     public static final StartupCheck checkMaxMapCount = new StartupCheck()
     {
         private final long EXPECTED_MAX_MAP_COUNT = 1048575;
@@ -292,7 +454,7 @@
 
         private long getMaxMapCount()
         {
-            final Path path = Paths.get(MAX_MAP_COUNT_PATH);
+            final Path path = File.getPath(MAX_MAP_COUNT_PATH);
             try (final BufferedReader bufferedReader = Files.newBufferedReader(path))
             {
                 final String data = bufferedReader.readLine();
@@ -315,9 +477,10 @@
             return -1;
         }
 
-        public void execute()
+        @Override
+        public void execute(StartupChecksOptions options)
         {
-            if (!FBUtilities.isLinux)
+            if (options.isDisabled(getStartupCheckType()) || !FBUtilities.isLinux)
                 return;
 
             if (DatabaseDescriptor.getDiskAccessMode() == Config.DiskAccessMode.standard &&
@@ -332,42 +495,51 @@
         }
     };
 
-    public static final StartupCheck checkDataDirs = () ->
+    public static final StartupCheck checkDataDirs = new StartupCheck()
     {
-        // check all directories(data, commitlog, saved cache) for existence and permission
-        Iterable<String> dirs = Iterables.concat(Arrays.asList(DatabaseDescriptor.getAllDataFileLocations()),
-                                                 Arrays.asList(DatabaseDescriptor.getCommitLogLocation(),
-                                                               DatabaseDescriptor.getSavedCachesLocation(),
-                                                               DatabaseDescriptor.getHintsDirectory().getAbsolutePath()));
-
-        for (String dataDir : dirs)
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
         {
-            logger.debug("Checking directory {}", dataDir);
-            File dir = new File(dataDir);
-
-            // check that directories exist.
-            if (!dir.exists())
+            if (options.isDisabled(getStartupCheckType()))
+                return;
+            // check all directories(data, commitlog, saved cache) for existence and permission
+            Iterable<String> dirs = Iterables.concat(Arrays.asList(DatabaseDescriptor.getAllDataFileLocations()),
+                                                     Arrays.asList(DatabaseDescriptor.getCommitLogLocation(),
+                                                                   DatabaseDescriptor.getSavedCachesLocation(),
+                                                                   DatabaseDescriptor.getHintsDirectory().absolutePath()));
+            for (String dataDir : dirs)
             {
-                logger.warn("Directory {} doesn't exist", dataDir);
-                // if they don't, failing their creation, stop cassandra.
-                if (!dir.mkdirs())
-                    throw new StartupException(StartupException.ERR_WRONG_DISK_STATE,
-                                               "Has no permission to create directory "+ dataDir);
-            }
+                logger.debug("Checking directory {}", dataDir);
+                File dir = new File(dataDir);
 
-            // if directories exist verify their permissions
-            if (!Directories.verifyFullPermissions(dir, dataDir))
-                throw new StartupException(StartupException.ERR_WRONG_DISK_STATE,
-                                           "Insufficient permissions on directory " + dataDir);
+                // check that directories exist.
+                if (!dir.exists())
+                {
+                    logger.warn("Directory {} doesn't exist", dataDir);
+                    // if they don't, failing their creation, stop cassandra.
+                    if (!dir.tryCreateDirectories())
+                        throw new StartupException(StartupException.ERR_WRONG_DISK_STATE,
+                                                   "Has no permission to create directory "+ dataDir);
+                }
+
+                // if directories exist verify their permissions
+                if (!Directories.verifyFullPermissions(dir, dataDir))
+                    throw new StartupException(StartupException.ERR_WRONG_DISK_STATE,
+                                               "Insufficient permissions on directory " + dataDir);
+            }
         }
     };
 
     public static final StartupCheck checkSSTablesFormat = new StartupCheck()
     {
-        public void execute() throws StartupException
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
         {
+            if (options.isDisabled(getStartupCheckType()))
+                return;
             final Set<String> invalid = new HashSet<>();
             final Set<String> nonSSTablePaths = new HashSet<>();
+            final List<String> withIllegalGenId = new ArrayList<>();
             nonSSTablePaths.add(FileUtils.getCanonicalPath(DatabaseDescriptor.getCommitLogLocation()));
             nonSSTablePaths.add(FileUtils.getCanonicalPath(DatabaseDescriptor.getSavedCachesLocation()));
             nonSSTablePaths.add(FileUtils.getCanonicalPath(DatabaseDescriptor.getHintsDirectory()));
@@ -376,14 +548,18 @@
             {
                 public FileVisitResult visitFile(Path path, BasicFileAttributes attrs)
                 {
-                    File file = path.toFile();
+                    File file = new File(path);
                     if (!Descriptor.isValidFile(file))
                         return FileVisitResult.CONTINUE;
 
                     try
                     {
-                        if (!Descriptor.fromFilename(file).isCompatible())
+                        Descriptor desc = Descriptor.fromFilename(file);
+                        if (!desc.isCompatible())
                             invalid.add(file.toString());
+
+                        if (!DatabaseDescriptor.isUUIDSSTableIdentifiersEnabled() && desc.id instanceof UUIDBasedSSTableId)
+                            withIllegalGenId.add(file.toString());
                     }
                     catch (Exception e)
                     {
@@ -397,7 +573,7 @@
                     String name = dir.getFileName().toString();
                     return (name.equals(Directories.SNAPSHOT_SUBDIR)
                             || name.equals(Directories.BACKUPS_SUBDIR)
-                            || nonSSTablePaths.contains(dir.toFile().getCanonicalPath()))
+                            || nonSSTablePaths.contains(PathUtils.toCanonicalPath(dir).toString()))
                            ? FileVisitResult.SKIP_SUBTREE
                            : FileVisitResult.CONTINUE;
                 }
@@ -407,7 +583,7 @@
             {
                 try
                 {
-                    Files.walkFileTree(Paths.get(dataDir), sstableVisitor);
+                    Files.walkFileTree(new File(dataDir).toPath(), sstableVisitor);
                 }
                 catch (IOException e)
                 {
@@ -423,13 +599,25 @@
                                                          "upgradesstables",
                                                          Joiner.on(",").join(invalid)));
 
+            if (!withIllegalGenId.isEmpty())
+                throw new StartupException(StartupException.ERR_WRONG_CONFIG,
+                                           "UUID sstable identifiers are disabled but some sstables have been " +
+                                           "created with UUID identifiers. You have to either delete those " +
+                                           "sstables or enable UUID based sstable identifers in cassandra.yaml " +
+                                           "(uuid_sstable_identifiers_enabled). The list of affected sstables is: " +
+                                           Joiner.on(", ").join(withIllegalGenId) + ". If you decide to delete sstables, " +
+                                           "and have that data replicated over other healthy nodes, those will be brought" +
+                                           "back during repair");
         }
     };
 
     public static final StartupCheck checkSystemKeyspaceState = new StartupCheck()
     {
-        public void execute() throws StartupException
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
         {
+            if (options.isDisabled(getStartupCheckType()))
+                return;
             // check the system keyspace to keep user from shooting self in foot by changing partitioner, cluster name, etc.
             // we do a one-off scrub of the system keyspace first; we can't load the list of the rest of the keyspaces,
             // until system keyspace is opened.
@@ -450,9 +638,18 @@
 
     public static final StartupCheck checkDatacenter = new StartupCheck()
     {
-        public void execute() throws StartupException
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
         {
-            if (!Boolean.getBoolean("cassandra.ignore_dc"))
+            boolean enabled = options.isEnabled(getStartupCheckType());
+            if (CassandraRelevantProperties.IGNORE_DC.isPresent())
+            {
+                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());
+            }
+            if (enabled)
             {
                 String storedDc = SystemKeyspace.getDatacenter();
                 if (storedDc != null)
@@ -468,13 +665,28 @@
                 }
             }
         }
+
+        @Override
+        public StartupCheckType getStartupCheckType()
+        {
+            return StartupCheckType.check_dc;
+        }
     };
 
     public static final StartupCheck checkRack = new StartupCheck()
     {
-        public void execute() throws StartupException
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
         {
-            if (!Boolean.getBoolean("cassandra.ignore_rack"))
+            boolean enabled = options.isEnabled(getStartupCheckType());
+            if (CassandraRelevantProperties.IGNORE_RACK.isPresent())
+            {
+                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());
+            }
+            if (enabled)
             {
                 String storedRack = SystemKeyspace.getRack();
                 if (storedRack != null)
@@ -490,16 +702,54 @@
                 }
             }
         }
+
+        @Override
+        public StartupCheckType getStartupCheckType()
+        {
+            return StartupCheckType.check_rack;
+        }
     };
 
-    public static final StartupCheck checkLegacyAuthTables = () ->
+    public static final StartupCheck checkLegacyAuthTables = new StartupCheck()
     {
-        Optional<String> errMsg = checkLegacyAuthTablesMessage();
-        if (errMsg.isPresent())
-            throw new StartupException(StartupException.ERR_WRONG_CONFIG, errMsg.get());
+        @Override
+        public void execute(StartupChecksOptions options) throws StartupException
+        {
+            if (options.isDisabled(getStartupCheckType()))
+                return;
+            Optional<String> errMsg = checkLegacyAuthTablesMessage();
+            if (errMsg.isPresent())
+                throw new StartupException(StartupException.ERR_WRONG_CONFIG, errMsg.get());
+        }
     };
 
     @VisibleForTesting
+    public static Path getReadAheadKBPath(String blockDirectoryPath)
+    {
+        Path readAheadKBPath = null;
+
+        final String READ_AHEAD_KB_SETTING_PATH = "/sys/block/%s/queue/read_ahead_kb";
+        try
+        {
+            String[] blockDirComponents = blockDirectoryPath.split("/");
+            if (blockDirComponents.length >= 2 && blockDirComponents[1].equals("dev"))
+            {
+                String deviceName = blockDirComponents[2].replaceAll("[0-9]*$", "");
+                if (StringUtils.isNotEmpty(deviceName))
+                {
+                    readAheadKBPath = File.getPath(String.format(READ_AHEAD_KB_SETTING_PATH, deviceName));
+                }
+            }
+        }
+        catch (Exception e)
+        {
+            logger.error("Error retrieving device path for {}.", blockDirectoryPath);
+        }
+
+        return readAheadKBPath;
+    }
+
+    @VisibleForTesting
     static Optional<String> checkLegacyAuthTablesMessage()
     {
         List<String> existing = new ArrayList<>(SchemaConstants.LEGACY_AUTH_TABLES).stream().filter((legacyAuthTable) ->
diff --git a/src/java/org/apache/cassandra/service/StorageProxy.java b/src/java/org/apache/cassandra/service/StorageProxy.java
index c783caf..2a0ccab 100644
--- a/src/java/org/apache/cassandra/service/StorageProxy.java
+++ b/src/java/org/apache/cassandra/service/StorageProxy.java
@@ -30,38 +30,47 @@
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Future;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
-import java.util.function.Supplier;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import com.google.common.base.Preconditions;
 import com.google.common.cache.CacheLoader;
 import com.google.common.collect.Iterables;
-import com.google.common.primitives.Ints;
 import com.google.common.util.concurrent.Uninterruptibles;
-import org.apache.commons.lang3.StringUtils;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.service.paxos.*;
+import org.apache.cassandra.service.paxos.Paxos;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.batchlog.Batch;
 import org.apache.cassandra.batchlog.BatchlogManager;
 import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.CounterMutation;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.IMutation;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.MessageParams;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.PartitionRangeReadCommand;
 import org.apache.cassandra.db.ReadCommand;
 import org.apache.cassandra.db.ReadExecutionController;
 import org.apache.cassandra.db.ReadResponse;
+import org.apache.cassandra.db.RejectException;
 import org.apache.cassandra.db.SinglePartitionReadCommand;
 import org.apache.cassandra.db.TruncateRequest;
 import org.apache.cassandra.db.WriteType;
@@ -79,6 +88,7 @@
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.IsBootstrappingException;
 import org.apache.cassandra.exceptions.OverloadedException;
+import org.apache.cassandra.exceptions.ReadAbortException;
 import org.apache.cassandra.exceptions.ReadFailureException;
 import org.apache.cassandra.exceptions.ReadTimeoutException;
 import org.apache.cassandra.exceptions.RequestFailureException;
@@ -101,6 +111,7 @@
 import org.apache.cassandra.locator.ReplicaPlans;
 import org.apache.cassandra.locator.Replicas;
 import org.apache.cassandra.metrics.CASClientRequestMetrics;
+import org.apache.cassandra.metrics.DenylistMetrics;
 import org.apache.cassandra.metrics.ReadRepairMetrics;
 import org.apache.cassandra.metrics.StorageMetrics;
 import org.apache.cassandra.net.ForwardingInfo;
@@ -109,27 +120,32 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.schema.PartitionDenylist;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.service.paxos.Commit;
-import org.apache.cassandra.service.paxos.PaxosState;
-import org.apache.cassandra.service.paxos.PrepareCallback;
-import org.apache.cassandra.service.paxos.ProposeCallback;
+import org.apache.cassandra.service.paxos.v1.PrepareCallback;
+import org.apache.cassandra.service.paxos.v1.ProposeCallback;
 import org.apache.cassandra.service.reads.AbstractReadExecutor;
 import org.apache.cassandra.service.reads.ReadCallback;
 import org.apache.cassandra.service.reads.range.RangeCommands;
 import org.apache.cassandra.service.reads.repair.ReadRepair;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.triggers.TriggerExecutor;
+import org.apache.cassandra.utils.Clock;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MBeanWrapper;
 import org.apache.cassandra.utils.MonotonicClock;
+import org.apache.cassandra.utils.NoSpamLogger;
 import org.apache.cassandra.utils.Pair;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
+import static com.google.common.collect.Iterables.concat;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.db.ConsistencyLevel.SERIAL;
+import static org.apache.cassandra.net.Message.out;
 import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casReadMetrics;
 import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casWriteMetrics;
 import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.readMetrics;
@@ -138,15 +154,18 @@
 import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.writeMetrics;
 import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.writeMetricsForLevel;
 import static org.apache.cassandra.net.NoPayload.noPayload;
-import static org.apache.cassandra.net.Verb.BATCH_STORE_REQ;
-import static org.apache.cassandra.net.Verb.MUTATION_REQ;
-import static org.apache.cassandra.net.Verb.PAXOS_COMMIT_REQ;
-import static org.apache.cassandra.net.Verb.PAXOS_PREPARE_REQ;
-import static org.apache.cassandra.net.Verb.PAXOS_PROPOSE_REQ;
-import static org.apache.cassandra.net.Verb.TRUNCATE_REQ;
+import static org.apache.cassandra.net.Verb.*;
 import static org.apache.cassandra.service.BatchlogResponseHandler.BatchlogCleanup;
-import static org.apache.cassandra.service.paxos.PrepareVerbHandler.doPrepare;
-import static org.apache.cassandra.service.paxos.ProposeVerbHandler.doPropose;
+import static org.apache.cassandra.service.paxos.Ballot.Flag.GLOBAL;
+import static org.apache.cassandra.service.paxos.Ballot.Flag.LOCAL;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.nextBallot;
+import static org.apache.cassandra.service.paxos.v1.PrepareVerbHandler.doPrepare;
+import static org.apache.cassandra.service.paxos.v1.ProposeVerbHandler.doPropose;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
+import static org.apache.commons.lang3.StringUtils.join;
 
 public class StorageProxy implements StorageProxyMBean
 {
@@ -155,6 +174,8 @@
 
     public static final String UNREACHABLE = "UNREACHABLE";
 
+    private static final int FAILURE_LOGGING_INTERVAL_SECONDS = CassandraRelevantProperties.FAILURE_LOGGING_INTERVAL_SECONDS.getInt();
+
     private static final WritePerformer standardWritePerformer;
     private static final WritePerformer counterWritePerformer;
     private static final WritePerformer counterWriteOnCoordinatorPerformer;
@@ -170,9 +191,11 @@
         }
     };
 
-    private static final String DISABLE_SERIAL_READ_LINEARIZABILITY_KEY = "cassandra.unsafe.disable-serial-reads-linearizability";
-    private static final boolean disableSerialReadLinearizability =
-        Boolean.parseBoolean(System.getProperty(DISABLE_SERIAL_READ_LINEARIZABILITY_KEY, "false"));
+    private static final DenylistMetrics denylistMetrics = new DenylistMetrics();
+
+    private static final PartitionDenylist partitionDenylist = new PartitionDenylist();
+
+    private volatile long logBlockingReadRepairAttemptsUntilNanos = Long.MIN_VALUE;
 
     private StorageProxy()
     {
@@ -199,7 +222,7 @@
         {
             EndpointsForToken selected = targets.contacts().withoutSelf();
             Replicas.temporaryAssertFull(selected); // TODO CASSANDRA-14548
-            counterWriteTask(mutation, targets.withContact(selected), responseHandler, localDataCenter).run();
+            counterWriteTask(mutation, targets.withContacts(selected), responseHandler, localDataCenter).run();
         };
 
         counterWriteOnCoordinatorPerformer = (mutation, targets, responseHandler, localDataCenter) ->
@@ -207,20 +230,20 @@
             EndpointsForToken selected = targets.contacts().withoutSelf();
             Replicas.temporaryAssertFull(selected); // TODO CASSANDRA-14548
             Stage.COUNTER_MUTATION.executor()
-                                  .execute(counterWriteTask(mutation, targets.withContact(selected), responseHandler, localDataCenter));
+                                  .execute(counterWriteTask(mutation, targets.withContacts(selected), responseHandler, localDataCenter));
         };
 
 
         ReadRepairMetrics.init();
 
-        if (disableSerialReadLinearizability)
+        if (!Paxos.isLinearizable())
         {
-            logger.warn("This node was started with -D{}. SERIAL (and LOCAL_SERIAL) reads coordinated by this node " +
-                        "will not offer linearizability (see CASSANDRA-12126 for details on what this mean) with " +
-                        "respect to other SERIAL operations. Please note that, with this flag, SERIAL reads will be " +
-                        "slower than QUORUM reads, yet offer no more guarantee. This flag should only be used in " +
+            logger.warn("This node was started with paxos variant {}. SERIAL (and LOCAL_SERIAL) reads coordinated by this node " +
+                        "will not offer linearizability (see CASSANDRA-12126 for details on what this means) with " +
+                        "respect to other SERIAL operations. Please note that with this variant, SERIAL reads will be " +
+                        "slower than QUORUM reads, yet offer no additional guarantees. This flag should only be used in " +
                         "the restricted case of upgrading from a pre-CASSANDRA-12126 version, and only if you " +
-                        "understand the tradeoff.", DISABLE_SERIAL_READ_LINEARIZABILITY_KEY);
+                        "understand the tradeoff.", Paxos.getPaxosVariant());
         }
     }
 
@@ -271,17 +294,40 @@
                                   CASRequest request,
                                   ConsistencyLevel consistencyForPaxos,
                                   ConsistencyLevel consistencyForCommit,
-                                  ClientState state,
+                                  ClientState clientState,
                                   int nowInSeconds,
                                   long queryStartNanoTime)
     throws UnavailableException, IsBootstrappingException, RequestFailureException, RequestTimeoutException, InvalidRequestException, CasWriteUnknownResultException
     {
-        final long startTimeForMetrics = System.nanoTime();
+        if (DatabaseDescriptor.getPartitionDenylistEnabled() && DatabaseDescriptor.getDenylistWritesEnabled() && !partitionDenylist.isKeyPermitted(keyspaceName, cfName, key.getKey()))
+        {
+            denylistMetrics.incrementWritesRejected();
+            throw new InvalidRequestException(String.format("Unable to CAS write to denylisted partition [0x%s] in %s/%s",
+                                                            key.toString(), keyspaceName, cfName));
+        }
+
+        return Paxos.useV2()
+                ? Paxos.cas(key, request, consistencyForPaxos, consistencyForCommit, clientState)
+                : legacyCas(keyspaceName, cfName, key, request, consistencyForPaxos, consistencyForCommit, clientState, nowInSeconds, queryStartNanoTime);
+    }
+
+    public static RowIterator legacyCas(String keyspaceName,
+                                        String cfName,
+                                        DecoratedKey key,
+                                        CASRequest request,
+                                        ConsistencyLevel consistencyForPaxos,
+                                        ConsistencyLevel consistencyForCommit,
+                                        ClientState clientState,
+                                        int nowInSeconds,
+                                        long queryStartNanoTime)
+    throws UnavailableException, IsBootstrappingException, RequestFailureException, RequestTimeoutException, InvalidRequestException
+    {
+        final long startTimeForMetrics = nanoTime();
         try
         {
             TableMetadata metadata = Schema.instance.validateTable(keyspaceName, cfName);
 
-            Supplier<Pair<PartitionUpdate, RowIterator>> updateProposer = () ->
+            Function<Ballot, Pair<PartitionUpdate, RowIterator>> updateProposer = ballot ->
             {
                 // read the current values and check they validate the conditions
                 Tracing.trace("Reading existing values for CAS precondition");
@@ -302,7 +348,7 @@
                 }
 
                 // Create the desired updates
-                PartitionUpdate updates = request.makeUpdates(current);
+                PartitionUpdate updates = request.makeUpdates(current, clientState, ballot);
 
                 long size = updates.dataSize();
                 casWriteMetrics.mutationSize.update(size);
@@ -325,7 +371,6 @@
                            consistencyForPaxos,
                            consistencyForCommit,
                            consistencyForCommit,
-                           state,
                            queryStartNanoTime,
                            casWriteMetrics,
                            updateProposer);
@@ -348,6 +393,12 @@
             writeMetricsForLevel(consistencyForPaxos).timeouts.mark();
             throw e;
         }
+        catch (ReadAbortException e)
+        {
+            casWriteMetrics.markAbort(e);
+            writeMetricsForLevel(consistencyForPaxos).markAbort(e);
+            throw e;
+        }
         catch (WriteFailureException | ReadFailureException e)
         {
             casWriteMetrics.failures.mark();
@@ -362,7 +413,7 @@
         }
         finally
         {
-            final long latency = System.nanoTime() - startTimeForMetrics;
+            final long latency = nanoTime() - startTimeForMetrics;
             casWriteMetrics.addNano(latency);
             writeMetricsForLevel(consistencyForPaxos).addNano(latency);
         }
@@ -398,7 +449,6 @@
      *     {@link ConsistencyLevel#LOCAL_SERIAL}).
      * @param consistencyForReplayCommits the consistency for the commit phase of "replayed" in-progress operations.
      * @param consistencyForCommit the consistency for the commit phase of _this_ operation update.
-     * @param state the client state.
      * @param queryStartNanoTime the nano time for the start of the query this is part of. This is the base time for
      *     timeouts.
      * @param casMetrics the metrics to update for this operation.
@@ -414,10 +464,9 @@
                                        ConsistencyLevel consistencyForPaxos,
                                        ConsistencyLevel consistencyForReplayCommits,
                                        ConsistencyLevel consistencyForCommit,
-                                       ClientState state,
                                        long queryStartNanoTime,
                                        CASClientRequestMetrics casMetrics,
-                                       Supplier<Pair<PartitionUpdate, RowIterator>> createUpdateProposal)
+                                       Function<Ballot, Pair<PartitionUpdate, RowIterator>> createUpdateProposal)
     throws UnavailableException, IsBootstrappingException, RequestFailureException, RequestTimeoutException, InvalidRequestException
     {
         int contentions = 0;
@@ -430,7 +479,7 @@
             consistencyForCommit.validateForCasCommit(latestRs);
 
             long timeoutNanos = DatabaseDescriptor.getCasContentionTimeout(NANOSECONDS);
-            while (System.nanoTime() - queryStartNanoTime < timeoutNanos)
+            while (nanoTime() - queryStartNanoTime < timeoutNanos)
             {
                 // for simplicity, we'll do a single liveness check at the start of each attempt
                 ReplicaPlan.ForPaxosWrite replicaPlan = ReplicaPlans.forPaxos(keyspace, key, consistencyForPaxos);
@@ -441,13 +490,12 @@
                                                                     replicaPlan,
                                                                     consistencyForPaxos,
                                                                     consistencyForReplayCommits,
-                                                                    casMetrics,
-                                                                    state);
+                                                                    casMetrics);
 
-                final UUID ballot = pair.ballot;
+                final Ballot ballot = pair.ballot;
                 contentions += pair.contentions;
 
-                Pair<PartitionUpdate, RowIterator> proposalPair = createUpdateProposal.get();
+                Pair<PartitionUpdate, RowIterator> proposalPair = createUpdateProposal.apply(ballot);
                 // See method javadoc: null here is code for "stop here and return null".
                 if (proposalPair == null)
                     return null;
@@ -472,6 +520,7 @@
 
                 Tracing.trace("Paxos proposal not accepted (pre-empted by a higher ballot)");
                 contentions++;
+
                 Uninterruptibles.sleepUninterruptibly(ThreadLocalRandom.current().nextInt(100), TimeUnit.MILLISECONDS);
                 // continue to retry
             }
@@ -509,25 +558,23 @@
                                                                 ReplicaPlan.ForPaxosWrite paxosPlan,
                                                                 ConsistencyLevel consistencyForPaxos,
                                                                 ConsistencyLevel consistencyForCommit,
-                                                                CASClientRequestMetrics casMetrics,
-                                                                ClientState state)
+                                                                CASClientRequestMetrics casMetrics)
     throws WriteTimeoutException, WriteFailureException
     {
         long timeoutNanos = DatabaseDescriptor.getCasContentionTimeout(NANOSECONDS);
 
         PrepareCallback summary = null;
         int contentions = 0;
-        while (System.nanoTime() - queryStartNanoTime < timeoutNanos)
+        while (nanoTime() - queryStartNanoTime < timeoutNanos)
         {
             // We want a timestamp that is guaranteed to be unique for that node (so that the ballot is globally unique), but if we've got a prepare rejected
             // already we also want to make sure we pick a timestamp that has a chance to be promised, i.e. one that is greater that the most recently known
             // in progress (#5667). Lastly, we don't want to use a timestamp that is older than the last one assigned by ClientState or operations may appear
             // out-of-order (#7801).
-            long minTimestampMicrosToUse = summary == null ? Long.MIN_VALUE : 1 + UUIDGen.microsTimestamp(summary.mostRecentInProgressCommit.ballot);
-            long ballotMicros = state.getTimestampForPaxos(minTimestampMicrosToUse);
+            long minTimestampMicrosToUse = summary == null ? Long.MIN_VALUE : 1 + summary.mostRecentInProgressCommit.ballot.unixMicros();
             // Note that ballotMicros is not guaranteed to be unique if two proposal are being handled concurrently by the same coordinator. But we still
             // need ballots to be unique for each proposal so we have to use getRandomTimeUUIDFromMicros.
-            UUID ballot = UUIDGen.getRandomTimeUUIDFromMicros(ballotMicros);
+            Ballot ballot = nextBallot(minTimestampMicrosToUse, consistencyForPaxos == SERIAL ? GLOBAL : LOCAL);
 
             // prepare
             try
@@ -588,8 +635,7 @@
                 // https://issues.apache.org/jira/browse/CASSANDRA-5062?focusedCommentId=13619810&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-13619810)
                 // Since we waited for quorum nodes, if some of them haven't seen the last commit (which may just be a timing issue, but may also
                 // mean we lost messages), we pro-actively "repair" those nodes, and retry.
-                int nowInSec = Ints.checkedCast(TimeUnit.MICROSECONDS.toSeconds(ballotMicros));
-                Iterable<InetAddressAndPort> missingMRC = summary.replicasMissingMostRecentCommit(metadata, nowInSec);
+                Iterable<InetAddressAndPort> missingMRC = summary.replicasMissingMostRecentCommit();
                 if (Iterables.size(missingMRC) > 0)
                 {
                     Tracing.trace("Repairing replicas that missed the most recent commit");
@@ -628,10 +674,14 @@
     {
         PrepareCallback callback = new PrepareCallback(toPrepare.update.partitionKey(), toPrepare.update.metadata(), replicaPlan.requiredParticipants(), replicaPlan.consistencyLevel(), queryStartNanoTime);
         Message<Commit> message = Message.out(PAXOS_PREPARE_REQ, toPrepare);
+
+        boolean hasLocalRequest = false;
+
         for (Replica replica: replicaPlan.contacts())
         {
             if (replica.isSelf())
             {
+                hasLocalRequest = true;
                 PAXOS_PREPARE_REQ.stage.execute(() -> {
                     try
                     {
@@ -648,6 +698,12 @@
                 MessagingService.instance().sendWithCallback(message, replica.endpoint(), callback);
             }
         }
+
+        if (hasLocalRequest)
+            writeMetrics.localRequests.mark();
+        else
+            writeMetrics.remoteRequests.mark();
+
         callback.await();
         return callback;
     }
@@ -703,11 +759,11 @@
 
         AbstractWriteResponseHandler<Commit> responseHandler = null;
         // NOTE: this ReplicaPlan is a lie, this usage of ReplicaPlan could do with being clarified - the selected() collection is essentially (I think) never used
-        ReplicaPlan.ForTokenWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, tk, ReplicaPlans.writeAll);
+        ReplicaPlan.ForWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, tk, ReplicaPlans.writeAll);
         if (shouldBlock)
         {
             AbstractReplicationStrategy rs = replicaPlan.replicationStrategy();
-            responseHandler = rs.getWriteResponseHandler(replicaPlan, null, WriteType.SIMPLE, queryStartNanoTime);
+            responseHandler = rs.getWriteResponseHandler(replicaPlan, null, WriteType.SIMPLE, proposal::makeMutation, queryStartNanoTime);
         }
 
         Message<Commit> message = Message.outWithFlag(PAXOS_COMMIT_REQ, proposal, MessageFlag.CALL_BACK_ON_FAILURE);
@@ -723,7 +779,7 @@
                     if (replica.isSelf())
                         commitPaxosLocal(replica, message, responseHandler);
                     else
-                        MessagingService.instance().sendWriteWithCallback(message, replica, responseHandler, allowHints && shouldHint(replica));
+                        MessagingService.instance().sendWriteWithCallback(message, replica, responseHandler);
                 }
                 else
                 {
@@ -760,7 +816,7 @@
             {
                 try
                 {
-                    PaxosState.commit(message.payload);
+                    PaxosState.commitDirect(message.payload);
                     if (responseHandler != null)
                         responseHandler.onResponse(null);
                 }
@@ -788,7 +844,7 @@
      *
      * @param mutations the mutations to be applied across the replicas
      * @param consistencyLevel the consistency level for the operation
-     * @param queryStartNanoTime the value of System.nanoTime() when the query started to be processed
+     * @param queryStartNanoTime the value of nanoTime() when the query started to be processed
      */
     public static void mutate(List<? extends IMutation> mutations, ConsistencyLevel consistencyLevel, long queryStartNanoTime)
     throws UnavailableException, OverloadedException, WriteTimeoutException, WriteFailureException
@@ -796,7 +852,7 @@
         Tracing.trace("Determining replicas for mutation");
         final String localDataCenter = DatabaseDescriptor.getEndpointSnitch().getLocalDatacenter();
 
-        long startTime = System.nanoTime();
+        long startTime = nanoTime();
 
         List<AbstractWriteResponseHandler<IMutation>> responseHandlers = new ArrayList<>(mutations.size());
         WriteType plainWriteType = mutations.size() <= 1 ? WriteType.SIMPLE : WriteType.UNLOGGED_BATCH;
@@ -864,7 +920,7 @@
         }
         finally
         {
-            long latency = System.nanoTime() - startTime;
+            long latency = nanoTime() - startTime;
             writeMetrics.addNano(latency);
             writeMetricsForLevel(consistencyLevel).addNano(latency);
             updateCoordinatorWriteLatencyTableMetric(mutations, latency);
@@ -920,7 +976,7 @@
      * @param mutations the mutations to be applied across the replicas
      * @param writeCommitLog if commitlog should be written
      * @param baseComplete time from epoch in ms that the local base mutation was(or will be) completed
-     * @param queryStartNanoTime the value of System.nanoTime() when the query started to be processed
+     * @param queryStartNanoTime the value of nanoTime() when the query started to be processed
      */
     public static void mutateMV(ByteBuffer dataKey, Collection<Mutation> mutations, boolean writeCommitLog, AtomicLong baseComplete, long queryStartNanoTime)
     throws UnavailableException, OverloadedException, WriteTimeoutException
@@ -928,13 +984,13 @@
         Tracing.trace("Determining replicas for mutation");
         final String localDataCenter = DatabaseDescriptor.getEndpointSnitch().getLocalDatacenter();
 
-        long startTime = System.nanoTime();
+        long startTime = nanoTime();
 
 
         try
         {
             // if we haven't joined the ring, write everything to batchlog because paired replicas may be stale
-            final UUID batchUUID = UUIDGen.getTimeUUID();
+            final TimeUUID batchUUID = nextTimeUUID();
 
             if (StorageService.instance.isStarting() || StorageService.instance.isJoining() || StorageService.instance.isMoving())
             {
@@ -951,7 +1007,7 @@
                 ConsistencyLevel consistencyLevel = ConsistencyLevel.ONE;
 
                 //Since the base -> view replication is 1:1 we only need to store the BL locally
-                ReplicaPlan.ForTokenWrite replicaPlan = ReplicaPlans.forLocalBatchlogWrite();
+                ReplicaPlan.ForWrite replicaPlan = ReplicaPlans.forLocalBatchlogWrite();
                 BatchlogCleanup cleanup = new BatchlogCleanup(mutations.size(),
                                                               () -> asyncRemoveFromBatchlog(replicaPlan, batchUUID));
 
@@ -1023,7 +1079,7 @@
         }
         finally
         {
-            viewWriteMetrics.addNano(System.nanoTime() - startTime);
+            viewWriteMetrics.addNano(nanoTime() - startTime);
         }
     }
 
@@ -1034,6 +1090,25 @@
                                           long queryStartNanoTime)
     throws WriteTimeoutException, WriteFailureException, UnavailableException, OverloadedException, InvalidRequestException
     {
+        if (DatabaseDescriptor.getPartitionDenylistEnabled() && DatabaseDescriptor.getDenylistWritesEnabled())
+        {
+            for (final IMutation mutation : mutations)
+            {
+                for (final TableId tid : mutation.getTableIds())
+                {
+                    if (!partitionDenylist.isKeyPermitted(tid, mutation.key().getKey()))
+                    {
+                        denylistMetrics.incrementWritesRejected();
+                        // While Schema.instance.getTableMetadata() can return a null value, in this case the isKeyPermitted
+                        // call above ensures that we cannot have a null associated tid at this point.
+                        final TableMetadata tmd = Schema.instance.getTableMetadata(tid);
+                        throw new InvalidRequestException(String.format("Unable to write to denylisted partition [0x%s] in %s/%s",
+                                                                        mutation.key().toString(), tmd.keyspace, tmd.name));
+                    }
+                }
+            }
+        }
+
         Collection<Mutation> augmented = TriggerExecutor.instance.execute(mutations);
 
         boolean updatesView = Keyspace.open(mutations.iterator().next().getKeyspaceName())
@@ -1064,7 +1139,7 @@
      * @param mutations the Mutations to be applied across the replicas
      * @param consistency_level the consistency level for the operation
      * @param requireQuorumForRemove at least a quorum of nodes will see update before deleting batchlog
-     * @param queryStartNanoTime the value of System.nanoTime() when the query started to be processed
+     * @param queryStartNanoTime the value of nanoTime() when the query started to be processed
      */
     public static void mutateAtomically(Collection<Mutation> mutations,
                                         ConsistencyLevel consistency_level,
@@ -1073,7 +1148,7 @@
     throws UnavailableException, OverloadedException, WriteTimeoutException
     {
         Tracing.trace("Determining replicas for atomic batch");
-        long startTime = System.nanoTime();
+        long startTime = nanoTime();
 
         List<WriteResponseHandlerWrapper> wrappers = new ArrayList<>(mutations.size());
 
@@ -1096,9 +1171,9 @@
                     batchConsistencyLevel = consistency_level;
             }
 
-            ReplicaPlan.ForTokenWrite replicaPlan = ReplicaPlans.forBatchlogWrite(batchConsistencyLevel == ConsistencyLevel.ANY);
+            ReplicaPlan.ForWrite replicaPlan = ReplicaPlans.forBatchlogWrite(batchConsistencyLevel == ConsistencyLevel.ANY);
 
-            final UUID batchUUID = UUIDGen.getTimeUUID();
+            final TimeUUID batchUUID = nextTimeUUID();
             BatchlogCleanup cleanup = new BatchlogCleanup(mutations.size(),
                                                           () -> asyncRemoveFromBatchlog(replicaPlan, batchUUID));
 
@@ -1144,7 +1219,7 @@
         }
         finally
         {
-            long latency = System.nanoTime() - startTime;
+            long latency = nanoTime() - startTime;
             writeMetrics.addNano(latency);
             writeMetricsForLevel(consistency_level).addNano(latency);
             updateCoordinatorWriteLatencyTableMetric(mutations, latency);
@@ -1173,11 +1248,12 @@
         }
     }
 
-    private static void syncWriteToBatchlog(Collection<Mutation> mutations, ReplicaPlan.ForTokenWrite replicaPlan, UUID uuid, long queryStartNanoTime)
+    private static void syncWriteToBatchlog(Collection<Mutation> mutations, ReplicaPlan.ForWrite replicaPlan, TimeUUID uuid, long queryStartNanoTime)
     throws WriteTimeoutException, WriteFailureException
     {
         WriteResponseHandler<?> handler = new WriteResponseHandler(replicaPlan,
                                                                    WriteType.BATCH_LOG,
+                                                                   null,
                                                                    queryStartNanoTime);
 
         Batch batch = Batch.createLocal(uuid, FBUtilities.timestampMicros(), mutations);
@@ -1194,9 +1270,9 @@
         handler.get();
     }
 
-    private static void asyncRemoveFromBatchlog(ReplicaPlan.ForTokenWrite replicaPlan, UUID uuid)
+    private static void asyncRemoveFromBatchlog(ReplicaPlan.ForWrite replicaPlan, TimeUUID uuid)
     {
-        Message<UUID> message = Message.out(Verb.BATCH_REMOVE_REQ, uuid);
+        Message<TimeUUID> message = Message.out(Verb.BATCH_REMOVE_REQ, uuid);
         for (Replica target : replicaPlan.contacts())
         {
             if (logger.isTraceEnabled())
@@ -1214,7 +1290,7 @@
         for (WriteResponseHandlerWrapper wrapper : wrappers)
         {
             Replicas.temporaryAssertFull(wrapper.handler.replicaPlan.liveAndDown());  // TODO: CASSANDRA-14549
-            ReplicaPlan.ForTokenWrite replicas = wrapper.handler.replicaPlan.withContact(wrapper.handler.replicaPlan.liveAndDown());
+            ReplicaPlan.ForWrite replicas = wrapper.handler.replicaPlan.withContacts(wrapper.handler.replicaPlan.liveAndDown());
 
             try
             {
@@ -1236,7 +1312,7 @@
         {
             EndpointsForToken sendTo = wrapper.handler.replicaPlan.liveAndDown();
             Replicas.temporaryAssertFull(sendTo); // TODO: CASSANDRA-14549
-            sendToHintedReplicas(wrapper.mutation, wrapper.handler.replicaPlan.withContact(sendTo), wrapper.handler, localDataCenter, stage);
+            sendToHintedReplicas(wrapper.mutation, wrapper.handler.replicaPlan.withContacts(sendTo), wrapper.handler, localDataCenter, stage);
         }
 
         for (WriteResponseHandlerWrapper wrapper : wrappers)
@@ -1255,7 +1331,7 @@
      * given the list of write endpoints (either standardWritePerformer for
      * standard writes or counterWritePerformer for counter writes).
      * @param callback an optional callback to be run if and when the write is
-     * @param queryStartNanoTime the value of System.nanoTime() when the query started to be processed
+     * @param queryStartNanoTime the value of nanoTime() when the query started to be processed
      */
     public static AbstractWriteResponseHandler<IMutation> performWrite(IMutation mutation,
                                                                        ConsistencyLevel consistencyLevel,
@@ -1269,9 +1345,15 @@
         Keyspace keyspace = Keyspace.open(keyspaceName);
         Token tk = mutation.key().getToken();
 
-        ReplicaPlan.ForTokenWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, tk, ReplicaPlans.writeNormal);
+        ReplicaPlan.ForWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, tk, ReplicaPlans.writeNormal);
+
+        if (replicaPlan.lookup(FBUtilities.getBroadcastAddressAndPort()) != null)
+            writeMetrics.localRequests.mark();
+        else
+            writeMetrics.remoteRequests.mark();
+
         AbstractReplicationStrategy rs = replicaPlan.replicationStrategy();
-        AbstractWriteResponseHandler<IMutation> responseHandler = rs.getWriteResponseHandler(replicaPlan, callback, writeType, queryStartNanoTime);
+        AbstractWriteResponseHandler<IMutation> responseHandler = rs.getWriteResponseHandler(replicaPlan, callback, writeType, mutation.hintOnFailure(), queryStartNanoTime);
 
         performer.apply(mutation, replicaPlan, responseHandler, localDataCenter);
         return responseHandler;
@@ -1288,9 +1370,15 @@
         Keyspace keyspace = Keyspace.open(mutation.getKeyspaceName());
         Token tk = mutation.key().getToken();
 
-        ReplicaPlan.ForTokenWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, tk, ReplicaPlans.writeNormal);
+        ReplicaPlan.ForWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, tk, ReplicaPlans.writeNormal);
+
+        if (replicaPlan.lookup(FBUtilities.getBroadcastAddressAndPort()) != null)
+            writeMetrics.localRequests.mark();
+        else
+            writeMetrics.remoteRequests.mark();
+
         AbstractReplicationStrategy rs = replicaPlan.replicationStrategy();
-        AbstractWriteResponseHandler<IMutation> writeHandler = rs.getWriteResponseHandler(replicaPlan,null, writeType, queryStartNanoTime);
+        AbstractWriteResponseHandler<IMutation> writeHandler = rs.getWriteResponseHandler(replicaPlan, null, writeType, mutation, queryStartNanoTime);
         BatchlogResponseHandler<IMutation> batchHandler = new BatchlogResponseHandler<>(writeHandler, batchConsistencyLevel.blockFor(rs), cleanup, queryStartNanoTime);
         return new WriteResponseHandlerWrapper(batchHandler, mutation);
     }
@@ -1309,12 +1397,12 @@
                                                                             long queryStartNanoTime)
     {
         Keyspace keyspace = Keyspace.open(mutation.getKeyspaceName());
-        ReplicaPlan.ForTokenWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, liveAndDown, ReplicaPlans.writeAll);
+        ReplicaPlan.ForWrite replicaPlan = ReplicaPlans.forWrite(keyspace, consistencyLevel, liveAndDown, ReplicaPlans.writeAll);
         AbstractReplicationStrategy replicationStrategy = replicaPlan.replicationStrategy();
         AbstractWriteResponseHandler<IMutation> writeHandler = replicationStrategy.getWriteResponseHandler(replicaPlan, () -> {
-            long delay = Math.max(0, System.currentTimeMillis() - baseComplete.get());
+            long delay = Math.max(0, currentTimeMillis() - baseComplete.get());
             viewWriteMetrics.viewWriteLatency.update(delay, MILLISECONDS);
-        }, writeType, queryStartNanoTime);
+        }, writeType, mutation, queryStartNanoTime);
         BatchlogResponseHandler<IMutation> batchHandler = new ViewWriteMetricsWrapped(writeHandler, batchConsistencyLevel.blockFor(replicationStrategy), cleanup, queryStartNanoTime);
         return new WriteResponseHandlerWrapper(batchHandler, mutation);
     }
@@ -1350,7 +1438,7 @@
      * @throws OverloadedException if the hints cannot be written/enqueued
      */
     public static void sendToHintedReplicas(final Mutation mutation,
-                                            ReplicaPlan.ForTokenWrite plan,
+                                            ReplicaPlan.ForWrite plan,
                                             AbstractWriteResponseHandler<IMutation> responseHandler,
                                             String localDataCenter,
                                             Stage stage)
@@ -1441,7 +1529,7 @@
         if (localDc != null)
         {
             for (Replica destination : localDc)
-                MessagingService.instance().sendWriteWithCallback(message, destination, responseHandler, true);
+                MessagingService.instance().sendWriteWithCallback(message, destination, responseHandler);
         }
         if (dcGroups != null)
         {
@@ -1483,7 +1571,7 @@
 
             for (Replica replica : forwardToReplicas)
             {
-                MessagingService.instance().callbacks.addWithExpiration(handler, message, replica, handler.replicaPlan.consistencyLevel(), true);
+                MessagingService.instance().callbacks.addWithExpiration(handler, message, replica);
                 logger.trace("Adding FWD message to {}@{}", message.id(), replica);
             }
 
@@ -1498,7 +1586,7 @@
             target = targets.get(0);
         }
 
-        MessagingService.instance().sendWriteWithCallback(message, target, handler, true);
+        MessagingService.instance().sendWriteWithCallback(message, target, handler);
         logger.trace("Sending message to {}@{}", message.id(), target);
     }
 
@@ -1585,13 +1673,18 @@
             // we build this ONLY to perform the sufficiency check that happens on construction
             ReplicaPlans.forWrite(keyspace, cm.consistency(), tk, ReplicaPlans.writeAll);
 
+            // This host isn't a replica, so mark the request as being remote. If this host is a 
+            // replica, applyCounterMutationOnCoordinator() in the branch above will call performWrite(), and 
+            // there we'll mark a local request against the metrics.
+            writeMetrics.remoteRequests.mark();
+
             // Forward the actual update to the chosen leader replica
             AbstractWriteResponseHandler<IMutation> responseHandler = new WriteResponseHandler<>(ReplicaPlans.forForwardingCounterWrite(keyspace, tk, replica),
-                                                                                                 WriteType.COUNTER, queryStartNanoTime);
+                                                                                                 WriteType.COUNTER, null, queryStartNanoTime);
 
             Tracing.trace("Enqueuing counter update to {}", replica);
             Message message = Message.outWithFlag(Verb.COUNTER_MUTATION_REQ, cm, MessageFlag.CALL_BACK_ON_FAILURE);
-            MessagingService.instance().sendWriteWithCallback(message, replica, responseHandler, false);
+            MessagingService.instance().sendWriteWithCallback(message, replica, responseHandler);
             return responseHandler;
         }
     }
@@ -1660,7 +1753,7 @@
     }
 
     private static Runnable counterWriteTask(final IMutation mutation,
-                                             final ReplicaPlan.ForTokenWrite replicaPlan,
+                                             final ReplicaPlan.ForWrite replicaPlan,
                                              final AbstractWriteResponseHandler<IMutation> responseHandler,
                                              final String localDataCenter)
     {
@@ -1689,50 +1782,58 @@
     public static RowIterator readOne(SinglePartitionReadCommand command, ConsistencyLevel consistencyLevel, long queryStartNanoTime)
     throws UnavailableException, IsBootstrappingException, ReadFailureException, ReadTimeoutException, InvalidRequestException
     {
-        return readOne(command, consistencyLevel, null, queryStartNanoTime);
-    }
-
-    public static RowIterator readOne(SinglePartitionReadCommand command, ConsistencyLevel consistencyLevel, ClientState state, long queryStartNanoTime)
-    throws UnavailableException, IsBootstrappingException, ReadFailureException, ReadTimeoutException, InvalidRequestException
-    {
-        return PartitionIterators.getOnlyElement(read(SinglePartitionReadCommand.Group.one(command), consistencyLevel, state, queryStartNanoTime), command);
-    }
-
-    public static PartitionIterator read(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyLevel, long queryStartNanoTime)
-    throws UnavailableException, IsBootstrappingException, ReadFailureException, ReadTimeoutException, InvalidRequestException
-    {
-        // When using serial CL, the ClientState should be provided
-        assert !consistencyLevel.isSerialConsistency();
-        return read(group, consistencyLevel, null, queryStartNanoTime);
+        return PartitionIterators.getOnlyElement(read(SinglePartitionReadCommand.Group.one(command), consistencyLevel, queryStartNanoTime), command);
     }
 
     /**
      * Performs the actual reading of a row out of the StorageService, fetching
      * a specific set of column names from a given column family.
      */
-    public static PartitionIterator read(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyLevel, ClientState state, long queryStartNanoTime)
+    public static PartitionIterator read(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyLevel, long queryStartNanoTime)
     throws UnavailableException, IsBootstrappingException, ReadFailureException, ReadTimeoutException, InvalidRequestException
     {
         if (StorageService.instance.isBootstrapMode() && !systemKeyspaceQuery(group.queries))
         {
             readMetrics.unavailables.mark();
             readMetricsForLevel(consistencyLevel).unavailables.mark();
-            throw new IsBootstrappingException();
+            IsBootstrappingException exception = new IsBootstrappingException();
+            logRequestException(exception, group.queries);
+            throw exception;
+        }
+
+        if (DatabaseDescriptor.getPartitionDenylistEnabled() && DatabaseDescriptor.getDenylistReadsEnabled())
+        {
+            for (SinglePartitionReadCommand command : group.queries)
+            {
+                if (!partitionDenylist.isKeyPermitted(command.metadata().id, command.partitionKey().getKey()))
+                {
+                    denylistMetrics.incrementReadsRejected();
+                    throw new InvalidRequestException(String.format("Unable to read denylisted partition [0x%s] in %s/%s",
+                                                                    command.partitionKey().toString(), command.metadata().keyspace, command.metadata().name));
+                }
+            }
         }
 
         return consistencyLevel.isSerialConsistency()
-             ? readWithPaxos(group, consistencyLevel, state, queryStartNanoTime)
+             ? readWithPaxos(group, consistencyLevel, queryStartNanoTime)
              : readRegular(group, consistencyLevel, queryStartNanoTime);
     }
 
-    private static PartitionIterator readWithPaxos(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyLevel, ClientState state, long queryStartNanoTime)
+    private static PartitionIterator readWithPaxos(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyLevel, long queryStartNanoTime)
     throws InvalidRequestException, UnavailableException, ReadFailureException, ReadTimeoutException
     {
-        assert state != null;
+        return Paxos.useV2()
+                ? Paxos.read(group, consistencyLevel)
+                : legacyReadWithPaxos(group, consistencyLevel, queryStartNanoTime);
+    }
+
+    private static PartitionIterator legacyReadWithPaxos(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyLevel, long queryStartNanoTime)
+    throws InvalidRequestException, UnavailableException, ReadFailureException, ReadTimeoutException
+    {
         if (group.queries.size() > 1)
             throw new InvalidRequestException("SERIAL/LOCAL_SERIAL consistency may only be requested for one partition at a time");
 
-        long start = System.nanoTime();
+        long start = nanoTime();
         SinglePartitionReadCommand command = group.queries.get(0);
         TableMetadata metadata = command.metadata();
         DecoratedKey key = command.partitionKey();
@@ -1750,10 +1851,10 @@
             {
                 // Commit an empty update to make sure all in-progress updates that should be finished first is, _and_
                 // that no other in-progress can get resurrected.
-                Supplier<Pair<PartitionUpdate, RowIterator>> updateProposer =
-                    disableSerialReadLinearizability
-                    ? () -> null
-                    : () -> Pair.create(PartitionUpdate.emptyUpdate(metadata, key), null);
+                Function<Ballot, Pair<PartitionUpdate, RowIterator>> updateProposer =
+                    !Paxos.isLinearizable()
+                    ? ballot -> null
+                    : ballot -> Pair.create(PartitionUpdate.emptyUpdate(metadata, key), null);
                 // When replaying, we commit at quorum/local quorum, as we want to be sure the following read (done at
                 // quorum/local_quorum) sees any replayed updates. Our own update is however empty, and those don't even
                 // get committed due to an optimiation described in doPaxos/beingRepairAndPaxos, so the commit
@@ -1763,7 +1864,6 @@
                         consistencyLevel,
                         consistencyForReplayCommitsOrFetch,
                         ConsistencyLevel.ANY,
-                        state,
                         start,
                         casReadMetrics,
                         updateProposer);
@@ -1784,6 +1884,7 @@
             readMetrics.unavailables.mark();
             casReadMetrics.unavailables.mark();
             readMetricsForLevel(consistencyLevel).unavailables.mark();
+            logRequestException(e, group.queries);
             throw e;
         }
         catch (ReadTimeoutException e)
@@ -1791,6 +1892,14 @@
             readMetrics.timeouts.mark();
             casReadMetrics.timeouts.mark();
             readMetricsForLevel(consistencyLevel).timeouts.mark();
+            logRequestException(e, group.queries);
+            throw e;
+        }
+        catch (ReadAbortException e)
+        {
+            readMetrics.markAbort(e);
+            casReadMetrics.markAbort(e);
+            readMetricsForLevel(consistencyLevel).markAbort(e);
             throw e;
         }
         catch (ReadFailureException e)
@@ -1802,7 +1911,7 @@
         }
         finally
         {
-            long latency = System.nanoTime() - start;
+            long latency = nanoTime() - start;
             readMetrics.addNano(latency);
             casReadMetrics.addNano(latency);
             readMetricsForLevel(consistencyLevel).addNano(latency);
@@ -1816,7 +1925,7 @@
     private static PartitionIterator readRegular(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyLevel, long queryStartNanoTime)
     throws UnavailableException, ReadFailureException, ReadTimeoutException
     {
-        long start = System.nanoTime();
+        long start = nanoTime();
         try
         {
             PartitionIterator result = fetchRows(group.queries, consistencyLevel, queryStartNanoTime);
@@ -1833,12 +1942,19 @@
         {
             readMetrics.unavailables.mark();
             readMetricsForLevel(consistencyLevel).unavailables.mark();
+            logRequestException(e, group.queries);
             throw e;
         }
         catch (ReadTimeoutException e)
         {
             readMetrics.timeouts.mark();
             readMetricsForLevel(consistencyLevel).timeouts.mark();
+            logRequestException(e, group.queries);
+            throw e;
+        }
+        catch (ReadAbortException e)
+        {
+            recordReadRegularAbort(consistencyLevel, e);
             throw e;
         }
         catch (ReadFailureException e)
@@ -1849,7 +1965,7 @@
         }
         finally
         {
-            long latency = System.nanoTime() - start;
+            long latency = nanoTime() - start;
             readMetrics.addNano(latency);
             readMetricsForLevel(consistencyLevel).addNano(latency);
             // TODO avoid giving every command the same latency number.  Can fix this in CASSADRA-5329
@@ -1858,6 +1974,12 @@
         }
     }
 
+    public static void recordReadRegularAbort(ConsistencyLevel consistencyLevel, Throwable cause)
+    {
+        readMetrics.markAbort(cause);
+        readMetricsForLevel(consistencyLevel).markAbort(cause);
+    }
+
     public static PartitionIterator concatAndBlockOnRepair(List<PartitionIterator> iterators, List<ReadRepair<?, ?>> repairs)
     {
         PartitionIterator concatenated = PartitionIterators.concat(iterators);
@@ -1909,6 +2031,11 @@
         for (int i=0; i<cmdCount; i++)
         {
             reads[i] = AbstractReadExecutor.getReadExecutor(commands.get(i), consistencyLevel, queryStartNanoTime);
+
+            if (reads[i].hasLocalRead())
+                readMetrics.localRequests.mark();
+            else
+                readMetrics.remoteRequests.mark();
         }
 
         // sends a data request to the closest replica, and a digest request to the others. If we have a speculating
@@ -1927,9 +2054,10 @@
 
         // wait for enough responses to meet the consistency level. If there's a digest mismatch, begin the read
         // repair process by sending full data reads to all replicas we received responses from.
+        boolean logBlockingRepairAttempts = instance.isLoggingReadRepairs();
         for (int i=0; i<cmdCount; i++)
         {
-            reads[i].awaitResponses();
+            reads[i].awaitResponses(logBlockingRepairAttempts);
         }
 
         // read repair - if it looks like we may not receive enough full data responses to meet CL, send
@@ -1982,6 +2110,9 @@
         {
             try
             {
+                MessageParams.reset();
+
+                boolean readRejected = false;
                 command.setMonitoringTime(approxCreationTimeNanos, false, verb.expiresAfterNanos(), DatabaseDescriptor.getSlowQueryTimeout(NANOSECONDS));
 
                 ReadResponse response;
@@ -1990,6 +2121,14 @@
                 {
                     response = command.createResponse(iterator, controller.getRepairedDataInfo());
                 }
+                catch (RejectException e)
+                {
+                    if (!command.isTrackingWarnings())
+                        throw e;
+                    
+                    response = command.createEmptyResponse();
+                    readRejected = true;
+                }
 
                 if (command.complete())
                 {
@@ -1997,11 +2136,12 @@
                 }
                 else
                 {
-                    MessagingService.instance().metrics.recordSelfDroppedMessage(verb, MonotonicClock.approxTime.now() - approxCreationTimeNanos, NANOSECONDS);
+                    MessagingService.instance().metrics.recordSelfDroppedMessage(verb, MonotonicClock.Global.approxTime.now() - approxCreationTimeNanos, NANOSECONDS);
                     handler.onFailure(FBUtilities.getBroadcastAddressAndPort(), RequestFailureReason.UNKNOWN);
                 }
 
-                MessagingService.instance().latencySubscribers.add(FBUtilities.getBroadcastAddressAndPort(), MonotonicClock.approxTime.now() - approxCreationTimeNanos, NANOSECONDS);
+                if (!readRejected)
+                    MessagingService.instance().latencySubscribers.add(FBUtilities.getBroadcastAddressAndPort(), MonotonicClock.Global.approxTime.now() - approxCreationTimeNanos, NANOSECONDS);
             }
             catch (Throwable t)
             {
@@ -2023,6 +2163,18 @@
                                                   ConsistencyLevel consistencyLevel,
                                                   long queryStartNanoTime)
     {
+        if (DatabaseDescriptor.getPartitionDenylistEnabled() && DatabaseDescriptor.getDenylistRangeReadsEnabled())
+        {
+            final int denylisted = partitionDenylist.getDeniedKeysInRangeCount(command.metadata().id, command.dataRange().keyRange());
+            if (denylisted > 0)
+            {
+                denylistMetrics.incrementRangeReadsRejected();
+                String tokens = command.loggableTokens();
+                throw new InvalidRequestException(String.format("Attempted to read a range containing %d denylisted keys in %s/%s." +
+                                                                " Range read: %s", denylisted, command.metadata().keyspace, command.metadata().name,
+                                                                tokens));
+            }
+        }
         return RangeCommands.partitions(command, consistencyLevel, queryStartNanoTime);
     }
 
@@ -2046,16 +2198,16 @@
         final String myVersion = Schema.instance.getVersion().toString();
         final Map<InetAddressAndPort, UUID> versions = new ConcurrentHashMap<>();
         final Set<InetAddressAndPort> liveHosts = Gossiper.instance.getLiveMembers();
-        final CountDownLatch latch = new CountDownLatch(liveHosts.size());
+        final CountDownLatch latch = newCountDownLatch(liveHosts.size());
 
         RequestCallback<UUID> cb = message ->
         {
             // record the response from the remote node.
             versions.put(message.from(), message.payload);
-            latch.countDown();
+            latch.decrement();
         };
         // an empty message acts as a request to the SchemaVersionVerbHandler.
-        Message message = Message.out(Verb.SCHEMA_VERSION_REQ, noPayload);
+        Message message = out(SCHEMA_VERSION_REQ, noPayload);
         for (InetAddressAndPort endpoint : liveHosts)
             MessagingService.instance().sendWithCallback(message, endpoint, cb);
 
@@ -2064,14 +2216,14 @@
             // wait for as long as possible. timeout-1s if possible.
             latch.await(DatabaseDescriptor.getRpcTimeout(NANOSECONDS), NANOSECONDS);
         }
-        catch (InterruptedException ex)
+        catch (InterruptedException e)
         {
-            throw new AssertionError("This latch shouldn't have been interrupted.");
+            throw new UncheckedInterruptedException(e);
         }
 
         // maps versions to hosts that are on that version.
         Map<String, List<String>> results = new HashMap<String, List<String>>();
-        Iterable<InetAddressAndPort> allHosts = Iterables.concat(Gossiper.instance.getLiveMembers(), Gossiper.instance.getUnreachableMembers());
+        Iterable<InetAddressAndPort> allHosts = concat(Gossiper.instance.getLiveMembers(), Gossiper.instance.getUnreachableMembers());
         for (InetAddressAndPort host : allHosts)
         {
             UUID version = versions.get(host);
@@ -2087,7 +2239,7 @@
 
         // we're done: the results map is ready to return to the client.  the rest is just debug logging:
         if (results.get(UNREACHABLE) != null)
-            logger.debug("Hosts not in agreement. Didn't get a response from everybody: {}", StringUtils.join(results.get(UNREACHABLE), ","));
+            logger.debug("Hosts not in agreement. Didn't get a response from everybody: {}", join(results.get(UNREACHABLE), ","));
         for (Map.Entry<String, List<String>> entry : results.entrySet())
         {
             // check for version disagreement. log the hosts that don't agree.
@@ -2143,11 +2295,40 @@
         DatabaseDescriptor.setMaxHintWindow(ms);
     }
 
+    public int getMaxHintsSizePerHostInMiB()
+    {
+        return DatabaseDescriptor.getMaxHintsSizePerHostInMiB();
+    }
+
+    public void setMaxHintsSizePerHostInMiB(int value)
+    {
+        DatabaseDescriptor.setMaxHintsSizePerHostInMiB(value);
+    }
+
     public static boolean shouldHint(Replica replica)
     {
-        if (!DatabaseDescriptor.hintedHandoffEnabled())
-            return false;
-        if (replica.isTransient() || replica.isSelf())
+        return shouldHint(replica, true);
+    }
+
+    /**
+     * Determines whether a hint should be stored or not.
+     * It rejects early if any of the condition is met:
+     * - Hints disabled entirely or for the belonging datacetner of the replica
+     * - The replica is transient or is the self node
+     * - The replica is no longer part of the ring
+     * - The hint window has expired
+     * - The hints have reached to the size limit for the node
+     * Otherwise, it permits.
+     *
+     * @param replica, the replica for the hint
+     * @param tryEnablePersistentWindow, true to consider hint_window_persistent_enabled; otherwise, ignores
+     * @return true to permit or false to reject hint
+     */
+    public static boolean shouldHint(Replica replica, boolean tryEnablePersistentWindow)
+    {
+        if (!DatabaseDescriptor.hintedHandoffEnabled()
+            || replica.isTransient()
+            || replica.isSelf())
             return false;
 
         Set<String> disabledDCs = DatabaseDescriptor.hintedHandoffDisabledDCs();
@@ -2160,13 +2341,46 @@
                 return false;
             }
         }
-        boolean hintWindowExpired = Gossiper.instance.getEndpointDowntime(replica.endpoint()) > DatabaseDescriptor.getMaxHintWindow();
+
+        InetAddressAndPort endpoint = replica.endpoint();
+        int maxHintWindow = DatabaseDescriptor.getMaxHintWindow();
+        long endpointDowntime = Gossiper.instance.getEndpointDowntime(endpoint);
+        boolean hintWindowExpired = endpointDowntime > maxHintWindow;
+
+        UUID hostIdForEndpoint = StorageService.instance.getHostIdForEndpoint(endpoint);
+        if (hostIdForEndpoint == null)
+        {
+            Tracing.trace("Discarding hint for endpoint not part of ring: {}", endpoint);
+            return false;
+        }
+
+        // if persisting hints window, hintWindowExpired might be updated according to the timestamp of the earliest hint
+        if (tryEnablePersistentWindow && !hintWindowExpired && DatabaseDescriptor.hintWindowPersistentEnabled())
+        {
+            long earliestHint = HintsService.instance.getEarliestHintForHost(hostIdForEndpoint);
+            hintWindowExpired = Clock.Global.currentTimeMillis() - maxHintWindow > earliestHint;
+            if (hintWindowExpired)
+                Tracing.trace("Not hinting {} for which there is the earliest hint stored at {}", replica, earliestHint);
+        }
+
         if (hintWindowExpired)
         {
-            HintsService.instance.metrics.incrPastWindow(replica.endpoint());
-            Tracing.trace("Not hinting {} which has been down {} ms", replica, Gossiper.instance.getEndpointDowntime(replica.endpoint()));
+            HintsService.instance.metrics.incrPastWindow(endpoint);
+            Tracing.trace("Not hinting {} which has been down {} ms", endpoint, endpointDowntime);
+            return false;
         }
-        return !hintWindowExpired;
+
+        long maxHintsSize = DatabaseDescriptor.getMaxHintsSizePerHost();
+        long actualTotalHintsSize = HintsService.instance.getTotalHintsSize(hostIdForEndpoint);
+        boolean hasHintsReachedMaxSize = maxHintsSize > 0 && actualTotalHintsSize > maxHintsSize;
+        if (hasHintsReachedMaxSize)
+        {
+            Tracing.trace("Not hinting {} which has reached to the max hints size {} bytes on disk. The actual hints size on disk: {}",
+                          endpoint, maxHintsSize, actualTotalHintsSize);
+            return false;
+        }
+
+        return true;
     }
 
     /**
@@ -2225,7 +2439,7 @@
     public interface WritePerformer
     {
         public void apply(IMutation mutation,
-                          ReplicaPlan.ForTokenWrite targets,
+                          ReplicaPlan.ForWrite targets,
                           AbstractWriteResponseHandler<IMutation> responseHandler,
                           String localDataCenter) throws OverloadedException;
     }
@@ -2258,13 +2472,13 @@
 
         public DroppableRunnable(Verb verb)
         {
-            this.approxCreationTimeNanos = MonotonicClock.approxTime.now();
+            this.approxCreationTimeNanos = MonotonicClock.Global.approxTime.now();
             this.verb = verb;
         }
 
         public final void run()
         {
-            long approxCurrentTimeNanos = MonotonicClock.approxTime.now();
+            long approxCurrentTimeNanos = MonotonicClock.Global.approxTime.now();
             long expirationTimeNanos = verb.expiresAtNanos(approxCreationTimeNanos);
             if (approxCurrentTimeNanos > expirationTimeNanos)
             {
@@ -2291,7 +2505,7 @@
      */
     private static abstract class LocalMutationRunnable implements Runnable
     {
-        private final long approxCreationTimeNanos = MonotonicClock.approxTime.now();
+        private final long approxCreationTimeNanos = MonotonicClock.Global.approxTime.now();
 
         private final Replica localReplica;
 
@@ -2303,7 +2517,7 @@
         public final void run()
         {
             final Verb verb = verb();
-            long nowNanos = MonotonicClock.approxTime.now();
+            long nowNanos = MonotonicClock.Global.approxTime.now();
             long expirationTimeNanos = verb.expiresAtNanos(approxCreationTimeNanos);
             if (nowNanos > expirationTimeNanos)
             {
@@ -2335,6 +2549,17 @@
         abstract protected void runMayThrow() throws Exception;
     }
 
+    public static void logRequestException(Exception exception, Collection<? extends ReadCommand> commands)
+    {
+        NoSpamLogger.log(logger, NoSpamLogger.Level.INFO, FAILURE_LOGGING_INTERVAL_SECONDS, TimeUnit.SECONDS,
+                         "\"{}\" while executing {}",
+                         () -> new Object[]
+                               {
+                                   exception.getMessage(),
+                                   commands.stream().map(ReadCommand::toCQLString).collect(Collectors.joining("; "))
+                               });
+    }
+
     /**
      * HintRunnable will decrease totalHintsInProgress and targetHints when finished.
      * It is the caller's responsibility to increment them initially.
@@ -2435,7 +2660,7 @@
                         logger.debug("Discarding hint for endpoint not part of ring: {}", target);
                 }
                 logger.trace("Adding hints for {}", validTargets);
-                HintsService.instance.write(hostIds, Hint.create(mutation, System.currentTimeMillis()));
+                HintsService.instance.write(hostIds, Hint.create(mutation, currentTimeMillis()));
                 validTargets.forEach(HintsService.instance.metrics::incrCreatedHints);
                 // Notify the handler only for CL == ANY
                 if (responseHandler != null && responseHandler.replicaPlan.consistencyLevel() == ConsistencyLevel.ANY)
@@ -2498,6 +2723,11 @@
         return ReadRepairMetrics.repairedBackground.getCount();
     }
 
+    public long getReadRepairRepairTimedOut()
+    {
+        return ReadRepairMetrics.timedOut.getCount();
+    }
+
     public int getNumberOfTables()
     {
         return Schema.instance.getNumberOfTables();
@@ -2598,10 +2828,10 @@
 
     static class PaxosBallotAndContention
     {
-        final UUID ballot;
+        final Ballot ballot;
         final int contentions;
 
-        PaxosBallotAndContention(UUID ballot, int contentions)
+        PaxosBallotAndContention(Ballot ballot, int contentions)
         {
             this.ballot = ballot;
             this.contentions = contentions;
@@ -2678,4 +2908,180 @@
     {
         DatabaseDescriptor.setCheckForDuplicateRowsDuringCompaction(false);
     }
+
+    public void initialLoadPartitionDenylist()
+    {
+        partitionDenylist.initialLoad();
+    }
+
+    @Override
+    public void loadPartitionDenylist()
+    {
+        partitionDenylist.load();
+    }
+
+    @Override
+    public int getPartitionDenylistLoadAttempts()
+    {
+        return partitionDenylist.getLoadAttempts();
+    }
+
+    @Override
+    public int getPartitionDenylistLoadSuccesses()
+    {
+        return partitionDenylist.getLoadSuccesses();
+    }
+
+    @Override
+    public void setEnablePartitionDenylist(boolean enabled)
+    {
+        DatabaseDescriptor.setPartitionDenylistEnabled(enabled);
+    }
+
+    @Override
+    public void setEnableDenylistWrites(boolean enabled)
+    {
+        DatabaseDescriptor.setDenylistWritesEnabled(enabled);
+    }
+
+    @Override
+    public void setEnableDenylistReads(boolean enabled)
+    {
+        DatabaseDescriptor.setDenylistReadsEnabled(enabled);
+    }
+
+    @Override
+    public void setEnableDenylistRangeReads(boolean enabled)
+    {
+        DatabaseDescriptor.setDenylistRangeReadsEnabled(enabled);
+    }
+
+    @Override
+    public void setDenylistMaxKeysPerTable(int value)
+    {
+        DatabaseDescriptor.setDenylistMaxKeysPerTable(value);
+    }
+
+    @Override
+    public void setDenylistMaxKeysTotal(int value)
+    {
+        DatabaseDescriptor.setDenylistMaxKeysTotal(value);
+    }
+
+    /**
+     * Actively denies read and write access to the provided Partition Key
+     * @param keyspace Name of keyspace containing the PK you wish to deny access to
+     * @param table Name of table containing the PK you wish to deny access to
+     * @param partitionKeyAsString String representation of the PK you want to deny access to
+     * @return true if successfully added, false if failure
+     */
+    @Override
+    public boolean denylistKey(String keyspace, String table, String partitionKeyAsString)
+    {
+        if (!Schema.instance.getKeyspaces().contains(keyspace))
+            return false;
+
+        final ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(keyspace, table);
+        if (cfs == null)
+            return false;
+
+        final ByteBuffer bytes = cfs.metadata.get().partitionKeyType.fromString(partitionKeyAsString);
+        return partitionDenylist.addKeyToDenylist(keyspace, table, bytes);
+    }
+
+    /**
+     * Attempts to remove the provided pk from the ks + table deny list
+     * @param keyspace Keyspace containing the pk to remove the denylist entry for
+     * @param table Table containing the pk to remove denylist entry for
+     * @param partitionKeyAsString String representation of the PK you want to re-allow access to
+     * @return true if found and removed, false if not
+     */
+    @Override
+    public boolean removeDenylistKey(String keyspace, String table, String partitionKeyAsString)
+    {
+        if (!Schema.instance.getKeyspaces().contains(keyspace))
+            return false;
+
+        final ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(keyspace, table);
+        if (cfs == null)
+            return false;
+
+        final ByteBuffer bytes = cfs.metadata.get().partitionKeyType.fromString(partitionKeyAsString);
+        return partitionDenylist.removeKeyFromDenylist(keyspace, table, bytes);
+    }
+
+    /**
+     * A simple check for operators to determine what the denylisted value for a pk is on a node
+     */
+    public boolean isKeyDenylisted(String keyspace, String table, String partitionKeyAsString)
+    {
+        if (!Schema.instance.getKeyspaces().contains(keyspace))
+            return false;
+
+        final ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(keyspace, table);
+        if (cfs == null)
+            return false;
+
+        final ByteBuffer bytes = cfs.metadata.get().partitionKeyType.fromString(partitionKeyAsString);
+        return !partitionDenylist.isKeyPermitted(keyspace, table, bytes);
+    }
+
+    @Override
+    public void logBlockingReadRepairAttemptsForNSeconds(int seconds)
+    {
+        logBlockingReadRepairAttemptsUntilNanos = nanoTime() + TimeUnit.SECONDS.toNanos(seconds);
+    }
+
+    @Override
+    public boolean isLoggingReadRepairs()
+    {
+        return nanoTime() <= StorageProxy.instance.logBlockingReadRepairAttemptsUntilNanos;
+    }
+
+    @Override
+    public void setPaxosVariant(String variant)
+    {
+        Preconditions.checkNotNull(variant);
+        Paxos.setPaxosVariant(Config.PaxosVariant.valueOf(variant));
+    }
+
+    @Override
+    public String getPaxosVariant()
+    {
+        return Paxos.getPaxosVariant().toString();
+    }
+
+    @Override
+    public boolean getUseStatementsEnabled()
+    {
+        return DatabaseDescriptor.getUseStatementsEnabled();
+    }
+
+    @Override
+    public void setUseStatementsEnabled(boolean enabled)
+    {
+        DatabaseDescriptor.setUseStatementsEnabled(enabled);
+    }
+
+    public void setPaxosContentionStrategy(String spec)
+    {
+        ContentionStrategy.setStrategy(spec);
+    }
+
+    public String getPaxosContentionStrategy()
+    {
+        return ContentionStrategy.getStrategySpec();
+    }
+
+    @Override
+    public void setPaxosCoordinatorLockingDisabled(boolean disabled)
+    {
+        PaxosState.setDisableCoordinatorLocking(disabled);
+    }
+
+    @Override
+    public boolean getPaxosCoordinatorLockingDisabled()
+    {
+        return PaxosState.getDisableCoordinatorLocking();
+    }
 }
diff --git a/src/java/org/apache/cassandra/service/StorageProxyMBean.java b/src/java/org/apache/cassandra/service/StorageProxyMBean.java
index e3cde4b..546143d 100644
--- a/src/java/org/apache/cassandra/service/StorageProxyMBean.java
+++ b/src/java/org/apache/cassandra/service/StorageProxyMBean.java
@@ -32,6 +32,8 @@
     public Set<String> getHintedHandoffDisabledDCs();
     public int getMaxHintWindow();
     public void setMaxHintWindow(int ms);
+    public int getMaxHintsSizePerHostInMiB();
+    public void setMaxHintsSizePerHostInMiB(int value);
     public int getMaxHintsInProgress();
     public void setMaxHintsInProgress(int qs);
     public int getHintsInProgress();
@@ -59,9 +61,24 @@
     public long getReadRepairAttempted();
     public long getReadRepairRepairedBlocking();
     public long getReadRepairRepairedBackground();
+    public long getReadRepairRepairTimedOut();
 
     @Deprecated
     public int getOtcBacklogExpirationInterval();
+
+    public void loadPartitionDenylist();
+    public int getPartitionDenylistLoadAttempts();
+    public int getPartitionDenylistLoadSuccesses();
+    public void setEnablePartitionDenylist(boolean enabled);
+    public void setEnableDenylistWrites(boolean enabled);
+    public void setEnableDenylistReads(boolean enabled);
+    public void setEnableDenylistRangeReads(boolean enabled);
+    public boolean denylistKey(String keyspace, String table, String partitionKeyAsString);
+    public boolean removeDenylistKey(String keyspace, String table, String partitionKeyAsString);
+    public void setDenylistMaxKeysPerTable(int value);
+    public void setDenylistMaxKeysTotal(int value);
+    public boolean isKeyDenylisted(String keyspace, String table, String partitionKeyAsString);
+
     @Deprecated
     public void setOtcBacklogExpirationInterval(int intervalInMillis);
 
@@ -74,6 +91,9 @@
     public String getIdealConsistencyLevel();
     public String setIdealConsistencyLevel(String cl);
 
+    public void logBlockingReadRepairAttemptsForNSeconds(int seconds);
+    public boolean isLoggingReadRepairs();
+
     /**
      * Tracking and reporting of variances in the repaired data set across replicas at read time
      */
@@ -103,4 +123,16 @@
     boolean getCheckForDuplicateRowsDuringCompaction();
     void enableCheckForDuplicateRowsDuringCompaction();
     void disableCheckForDuplicateRowsDuringCompaction();
+
+    void setPaxosVariant(String variant);
+    String getPaxosVariant();
+
+    boolean getUseStatementsEnabled();
+    void setUseStatementsEnabled(boolean enabled);
+
+    void setPaxosContentionStrategy(String variant);
+    String getPaxosContentionStrategy();
+
+    void setPaxosCoordinatorLockingDisabled(boolean disabled);
+    boolean getPaxosCoordinatorLockingDisabled();
 }
diff --git a/src/java/org/apache/cassandra/service/StorageService.java b/src/java/org/apache/cassandra/service/StorageService.java
index b53467e..ed10f04 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -17,15 +17,16 @@
  */
 package org.apache.cassandra.service;
 
+
 import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
-import java.io.File;
 import java.io.IOError;
 import java.io.IOException;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
-import java.nio.file.Paths;
+import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -48,13 +49,12 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
 import java.util.regex.MatchResult;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
@@ -68,11 +68,13 @@
 import javax.management.openmbean.TabularDataSupport;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
@@ -80,9 +82,6 @@
 import com.google.common.collect.Ordering;
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.FutureCallback;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.RateLimiter;
 import com.google.common.util.concurrent.Uninterruptibles;
 import org.apache.commons.lang3.StringUtils;
@@ -91,23 +90,27 @@
 
 import org.apache.cassandra.audit.AuditLogManager;
 import org.apache.cassandra.audit.AuditLogOptions;
+import org.apache.cassandra.auth.AuthCacheService;
 import org.apache.cassandra.auth.AuthKeyspace;
 import org.apache.cassandra.auth.AuthSchemaChangeListener;
 import org.apache.cassandra.batchlog.BatchlogManager;
 import org.apache.cassandra.concurrent.ExecutorLocals;
+import org.apache.cassandra.concurrent.FutureTask;
+import org.apache.cassandra.concurrent.FutureTaskWithResources;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.Config.PaxosStatePurging;
+import org.apache.cassandra.config.DataStorageSpec;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.config.ParameterizedClass;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.cql3.QueryHandler;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
-import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.SizeEstimatesRecorder;
 import org.apache.cassandra.db.SnapshotDetailsTabularData;
 import org.apache.cassandra.db.SystemKeyspace;
@@ -142,7 +145,9 @@
 import org.apache.cassandra.io.sstable.SSTableLoader;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.VersionAndType;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.PathUtils;
 import org.apache.cassandra.locator.AbstractReplicationStrategy;
 import org.apache.cassandra.locator.DynamicEndpointSnitch;
 import org.apache.cassandra.locator.EndpointsByRange;
@@ -165,18 +170,28 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.repair.RepairRunnable;
-import org.apache.cassandra.repair.SystemDistributedKeyspace;
 import org.apache.cassandra.repair.messages.RepairOption;
 import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
 import org.apache.cassandra.schema.KeyspaceMetadata;
-import org.apache.cassandra.schema.MigrationCoordinator;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.Keyspaces;
 import org.apache.cassandra.schema.ReplicationParams;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.SchemaTransformations;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
+import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.schema.ViewMetadata;
+import org.apache.cassandra.service.disk.usage.DiskUsageBroadcaster;
+import org.apache.cassandra.service.paxos.Paxos;
+import org.apache.cassandra.service.paxos.PaxosCommit;
+import org.apache.cassandra.service.paxos.PaxosRepair;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupLocalCoordinator;
+import org.apache.cassandra.service.paxos.cleanup.PaxosTableRepairs;
+import org.apache.cassandra.service.snapshot.SnapshotManager;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 import org.apache.cassandra.streaming.StreamManager;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.streaming.StreamPlan;
@@ -185,6 +200,7 @@
 import org.apache.cassandra.tracing.TraceKeyspace;
 import org.apache.cassandra.transport.ClientResourceLimits;
 import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MBeanWrapper;
@@ -192,8 +208,11 @@
 import org.apache.cassandra.utils.OutputHandler;
 import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.Throwables;
-import org.apache.cassandra.utils.WindowsTimer;
 import org.apache.cassandra.utils.WrappedRunnable;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 import org.apache.cassandra.utils.logging.LoggingSupportFactory;
 import org.apache.cassandra.utils.progress.ProgressEvent;
 import org.apache.cassandra.utils.progress.ProgressEventType;
@@ -208,6 +227,7 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.MINUTES;
 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.BOOTSTRAP_SCHEMA_DELAY_MS;
@@ -218,8 +238,12 @@
 import static org.apache.cassandra.index.SecondaryIndexManager.isIndexColumnFamily;
 import static org.apache.cassandra.net.NoPayload.noPayload;
 import static org.apache.cassandra.net.Verb.REPLICATION_DONE_REQ;
-import static org.apache.cassandra.schema.MigrationManager.evolveSystemKeyspace;
+import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
+import static org.apache.cassandra.service.ActiveRepairService.repairCommandExecutor;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+import static org.apache.cassandra.utils.FBUtilities.now;
 
 /**
  * This abstraction contains the token/identifier of this node
@@ -232,7 +256,7 @@
     private static final Logger logger = LoggerFactory.getLogger(StorageService.class);
 
     public static final int INDEFINITE = -1;
-    public static final int RING_DELAY = getRingDelay(); // delay after which we assume ring has stablized
+    public static final int RING_DELAY_MILLIS = getRingDelay(); // delay after which we assume ring has stablized
     public static final int SCHEMA_DELAY_MILLIS = getSchemaDelay();
 
     private static final boolean REQUIRE_SCHEMAS = !BOOTSTRAP_SKIP_SCHEMA_CHECK.getBoolean();
@@ -241,7 +265,7 @@
 
     private static int getRingDelay()
     {
-        String newdelay = System.getProperty("cassandra.ring_delay_ms");
+        String newdelay = CassandraRelevantProperties.RING_DELAY.getString();
         if (newdelay != null)
         {
             logger.info("Overriding RING_DELAY to {}ms", newdelay);
@@ -277,6 +301,8 @@
     private final List<Runnable> preShutdownHooks = new ArrayList<>();
     private final List<Runnable> postShutdownHooks = new ArrayList<>();
 
+    private final SnapshotManager snapshotManager = new SnapshotManager();
+
     public static final StorageService instance = new StorageService();
 
     @Deprecated
@@ -305,6 +331,16 @@
                 .getAddressReplicas(FBUtilities.getBroadcastAddressAndPort());
     }
 
+    public List<Range<Token>> getLocalRanges(String ks)
+    {
+        InetAddressAndPort broadcastAddress = FBUtilities.getBroadcastAddressAndPort();
+        Keyspace keyspace = Keyspace.open(ks);
+        List<Range<Token>> ranges = new ArrayList<>();
+        for (Replica r : keyspace.getReplicationStrategy().getAddressReplicas(broadcastAddress))
+            ranges.add(r.range());
+        return ranges;
+    }
+
     public List<Range<Token>> getLocalAndPendingRanges(String ks)
     {
         InetAddressAndPort broadcastAddress = FBUtilities.getBroadcastAddressAndPort();
@@ -351,7 +387,7 @@
     /* the probability for tracing any particular request, 0 disables tracing and 1 enables for all */
     private double traceProbability = 0.0;
 
-    private static enum Mode { STARTING, NORMAL, JOINING, LEAVING, DECOMMISSIONED, MOVING, DRAINING, DRAINED }
+    private enum Mode { STARTING, NORMAL, JOINING, LEAVING, DECOMMISSIONED, MOVING, DRAINING, DRAINED }
     private volatile Mode operationMode = Mode.STARTING;
 
     /* Used for tracking drain progress */
@@ -398,6 +434,7 @@
         setGossipTokens(localTokens);
         tokenMetadata.updateNormalTokens(tokens, FBUtilities.getBroadcastAddressAndPort());
         setMode(Mode.NORMAL, false);
+        invalidateLocalRanges();
     }
 
     public void setGossipTokens(Collection<Token> tokens)
@@ -476,7 +513,7 @@
                 setGossipTokens(tokens);
 
             Gossiper.instance.forceNewerGeneration();
-            Gossiper.instance.start((int) (System.currentTimeMillis() / 1000));
+            Gossiper.instance.start((int) (currentTimeMillis() / 1000));
             gossipActive = true;
         }
     }
@@ -588,9 +625,7 @@
 
     public boolean isDaemonSetupCompleted()
     {
-        return daemon == null
-               ? false
-               : daemon.setupCompleted();
+        return daemon != null && daemon.setupCompleted();
     }
 
     public void stopDaemon()
@@ -809,17 +844,22 @@
         initialized = true;
         gossipActive = true;
         Gossiper.instance.register(this);
-        Gossiper.instance.start((int) (System.currentTimeMillis() / 1000)); // needed for node-ring gathering.
+        Gossiper.instance.start((int) (currentTimeMillis() / 1000)); // needed for node-ring gathering.
         Gossiper.instance.addLocalApplicationState(ApplicationState.NET_VERSION, valueFactory.networkVersion());
         MessagingService.instance().listen();
     }
 
     public synchronized void initServer() throws ConfigurationException
     {
-        initServer(RING_DELAY);
+        initServer(SCHEMA_DELAY_MILLIS, RING_DELAY_MILLIS);
     }
 
-    public synchronized void initServer(int delay) throws ConfigurationException
+    public synchronized void initServer(int schemaAndRingDelayMillis) throws ConfigurationException
+    {
+        initServer(schemaAndRingDelayMillis, RING_DELAY_MILLIS);
+    }
+
+    public synchronized void initServer(int schemaTimeoutMillis, int ringTimeoutMillis) throws ConfigurationException
     {
         logger.info("Cassandra version: {}", FBUtilities.getReleaseVersionString());
         logger.info("CQL version: {}", QueryProcessor.CQL_VERSION);
@@ -853,11 +893,18 @@
             public void runMayThrow() throws InterruptedException, ExecutionException, IOException
             {
                 drain(true);
-
-                if (FBUtilities.isWindows)
-                    WindowsTimer.endTimerPeriod(DatabaseDescriptor.getWindowsTimerInterval());
-
-                LoggingSupportFactory.getLoggingSupport().onShutdown();
+                try
+                {
+                    ExecutorUtils.shutdownNowAndWait(1, MINUTES, ScheduledExecutors.scheduledFastTasks);
+                }
+                catch (Throwable t)
+                {
+                    logger.warn("Unable to terminate fast tasks within 1 minute.", t);
+                }
+                finally
+                {
+                    LoggingSupportFactory.getLoggingSupport().onShutdown();
+                }
             }
         }, "StorageServiceShutdownHook");
         Runtime.getRuntime().addShutdownHook(drainOnShutdown);
@@ -886,7 +933,7 @@
 
         if (joinRing)
         {
-            joinTokenRing(delay);
+            joinTokenRing(schemaTimeoutMillis, ringTimeoutMillis);
         }
         else
         {
@@ -931,21 +978,28 @@
             SystemKeyspace.removeEndpoint(FBUtilities.getBroadcastAddressAndPort());
 
         Map<InetAddressAndPort, UUID> loadedHostIds = SystemKeyspace.loadHostIds();
+        Map<UUID, InetAddressAndPort> hostIdToEndpointMap = new HashMap<>();
         for (InetAddressAndPort ep : loadedTokens.keySet())
         {
-            tokenMetadata.updateNormalTokens(loadedTokens.get(ep), ep);
-            if (loadedHostIds.containsKey(ep))
-                tokenMetadata.updateHostId(loadedHostIds.get(ep), ep);
+            UUID hostId = loadedHostIds.get(ep);
+            if (hostId != null)
+                hostIdToEndpointMap.put(hostId, ep);
         }
+        tokenMetadata.updateNormalTokens(loadedTokens);
+        tokenMetadata.updateHostIds(hostIdToEndpointMap);
     }
 
-    private boolean isReplacing()
+    public boolean isReplacing()
     {
+        if (replacing)
+            return true;
+
         if (System.getProperty("cassandra.replace_address_first_boot", null) != null && SystemKeyspace.bootstrapComplete())
         {
             logger.info("Replace address on first boot requested; this node is already bootstrapped");
             return false;
         }
+
         return DatabaseDescriptor.getReplaceAddress() != null;
     }
 
@@ -954,11 +1008,10 @@
      */
     public void removeShutdownHook()
     {
+        PathUtils.clearOnExitThreads();
+
         if (drainOnShutdown != null)
             Runtime.getRuntime().removeShutdownHook(drainOnShutdown);
-
-        if (FBUtilities.isWindows)
-            WindowsTimer.endTimerPeriod(DatabaseDescriptor.getWindowsTimerInterval());
     }
 
     private boolean shouldBootstrap()
@@ -973,7 +1026,6 @@
 
     private void prepareToJoin() throws ConfigurationException
     {
-        MigrationCoordinator.instance.start();
         if (!joined)
         {
             Map<ApplicationState, VersionedValue> appStates = new EnumMap<>(ApplicationState.class);
@@ -1011,13 +1063,12 @@
                 {
                     //only go into hibernate state if replacing the same address (CASSANDRA-8523)
                     logger.warn("Writes will not be forwarded to this node during replacement because it has the same address as " +
-                                "the node to be replaced ({}). If the previous node has been down for longer than max_hint_window_in_ms, " +
+                                "the node to be replaced ({}). If the previous node has been down for longer than max_hint_window, " +
                                 "repair must be run after the replacement process in order to make this node consistent.",
                                 DatabaseDescriptor.getReplaceAddress());
                     appStates.put(ApplicationState.STATUS_WITH_PORT, valueFactory.hibernate(true));
                     appStates.put(ApplicationState.STATUS, valueFactory.hibernate(true));
                 }
-                MigrationCoordinator.instance.removeAndIgnoreEndpoint(DatabaseDescriptor.getReplaceAddress());
             }
             else
             {
@@ -1063,55 +1114,43 @@
 
             // gossip snitch infos (local DC and rack)
             gossipSnitchInfo();
-            // gossip Schema.emptyVersion forcing immediate check for schema updates (see MigrationManager#maybeScheduleSchemaPull)
-            Schema.instance.updateVersionAndAnnounce(); // Ensure we know our own actual Schema UUID in preparation for updates
+            Schema.instance.startSync();
             LoadBroadcaster.instance.startBroadcasting();
+            DiskUsageBroadcaster.instance.startBroadcasting();
             HintsService.instance.startDispatch();
             BatchlogManager.instance.start();
+            startSnapshotManager();
         }
     }
 
-    public void waitForSchema(long delay)
+    @VisibleForTesting
+    public void startSnapshotManager()
     {
-        // first sleep the delay to make sure we see all our peers
-        for (long i = 0; i < delay; i += 1000)
-        {
-            // if we see schema, we can proceed to the next check directly
-            if (!Schema.instance.isEmpty())
-            {
-                logger.debug("current schema version: {}", Schema.instance.getVersion());
-                break;
-            }
+        snapshotManager.start();
+    }
+
+    public void waitForSchema(long schemaTimeoutMillis, long ringTimeoutMillis)
+    {
+        Instant deadline = FBUtilities.now().plus(java.time.Duration.ofMillis(ringTimeoutMillis));
+
+        while (Schema.instance.isEmpty() && FBUtilities.now().isBefore(deadline))
             Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
-        }
 
-        boolean schemasReceived = MigrationCoordinator.instance.awaitSchemaRequests(SCHEMA_DELAY_MILLIS);
-
-        if (schemasReceived)
-            return;
-
-        logger.warn(String.format("There are nodes in the cluster with a different schema version than us we did not merged schemas from, " +
-                                  "our version : (%s), outstanding versions -> endpoints : %s. Use -Dcassandra.skip_schema_check=true " +
-                                  "to ignore this, -Dcassandra.skip_schema_check_for_endpoints=<ep1[,epN]> to skip specific endpoints," +
-                                  "or -Dcassandra.skip_schema_check_for_versions=<ver1[,verN]> to skip specific schema versions",
-                                  Schema.instance.getVersion(),
-                                  MigrationCoordinator.instance.outstandingVersions()));
-
-        if (REQUIRE_SCHEMAS)
-            throw new RuntimeException("Didn't receive schemas for all known versions within the timeout. " +
-                                       "Use -Dcassandra.skip_schema_check=true to skip this check.");
+        if (!Schema.instance.waitUntilReady(java.time.Duration.ofMillis(schemaTimeoutMillis)))
+            throw new IllegalStateException("Could not achieve schema readiness in " + java.time.Duration.ofMillis(schemaTimeoutMillis));
     }
 
-    private void joinTokenRing(long schemaTimeoutMillis) throws ConfigurationException
+    private void joinTokenRing(long schemaTimeoutMillis, long ringTimeoutMillis) throws ConfigurationException
     {
-        joinTokenRing(!isSurveyMode, shouldBootstrap(), schemaTimeoutMillis, INDEFINITE);
+        joinTokenRing(!isSurveyMode, shouldBootstrap(), schemaTimeoutMillis, INDEFINITE, ringTimeoutMillis);
     }
 
     @VisibleForTesting
     public void joinTokenRing(boolean finishJoiningRing,
                               boolean shouldBootstrap,
                               long schemaTimeoutMillis,
-                              long bootstrapTimeoutMillis) throws ConfigurationException
+                              long bootstrapTimeoutMillis,
+                              long ringTimeoutMillis) throws ConfigurationException
     {
         joined = true;
 
@@ -1142,7 +1181,7 @@
 
         if (shouldBootstrap)
         {
-            current.addAll(prepareForBootstrap(schemaTimeoutMillis));
+            current.addAll(prepareForBootstrap(schemaTimeoutMillis, ringTimeoutMillis));
             dataAvailable = bootstrap(bootstrapTokens, bootstrapTimeoutMillis);
         }
         else
@@ -1150,7 +1189,7 @@
             bootstrapTokens = SystemKeyspace.getSavedTokens();
             if (bootstrapTokens.isEmpty())
             {
-                bootstrapTokens = BootStrapper.getBootstrapTokens(tokenMetadata, FBUtilities.getBroadcastAddressAndPort(), schemaTimeoutMillis);
+                bootstrapTokens = BootStrapper.getBootstrapTokens(tokenMetadata, FBUtilities.getBroadcastAddressAndPort(), schemaTimeoutMillis, ringTimeoutMillis);
             }
             else
             {
@@ -1181,6 +1220,8 @@
             {
                 logger.warn("Some data streaming failed. Use nodetool to check bootstrap state and resume. For more, see `nodetool help bootstrap`. {}", SystemKeyspace.getBootstrapState());
             }
+
+            StorageProxy.instance.initialLoadPartitionDenylist();
         }
         else
         {
@@ -1219,7 +1260,7 @@
             logger.info("Joining ring by operator request");
             try
             {
-                joinTokenRing(0);
+                joinTokenRing(SCHEMA_DELAY_MILLIS, 0);
                 doAuthSetup(false);
             }
             catch (ConfigurationException e)
@@ -1254,7 +1295,7 @@
     private void executePreJoinTasks(boolean bootstrap)
     {
         StreamSupport.stream(ColumnFamilyStore.all().spliterator(), false)
-                .filter(cfs -> Schema.instance.getUserKeyspaces().contains(cfs.keyspace.getName()))
+                .filter(cfs -> Schema.instance.getUserKeyspaces().names().contains(cfs.keyspace.getName()))
                 .forEach(cfs -> cfs.indexManager.executePreJoinTasksBlocking(bootstrap));
     }
 
@@ -1277,14 +1318,14 @@
         {
             if (setUpSchema)
             {
-                Optional<Mutation> mutation = evolveSystemKeyspace(AuthKeyspace.metadata(), AuthKeyspace.GENERATION);
-                mutation.ifPresent(value -> FBUtilities.waitOnFuture(MigrationManager.announceWithoutPush(Collections.singleton(value))));
+                Schema.instance.transform(SchemaTransformations.updateSystemKeyspace(AuthKeyspace.metadata(), AuthKeyspace.GENERATION));
             }
 
             DatabaseDescriptor.getRoleManager().setup();
             DatabaseDescriptor.getAuthenticator().setup();
             DatabaseDescriptor.getAuthorizer().setup();
             DatabaseDescriptor.getNetworkAuthorizer().setup();
+            AuthCacheService.initializeAndRegisterCaches();
             Schema.instance.registerListener(new AuthSchemaChangeListener());
             authSetupComplete = true;
         }
@@ -1305,14 +1346,9 @@
     @VisibleForTesting
     public void setUpDistributedSystemKeyspaces()
     {
-        Collection<Mutation> changes = new ArrayList<>(3);
-
-        evolveSystemKeyspace(            TraceKeyspace.metadata(),             TraceKeyspace.GENERATION).ifPresent(changes::add);
-        evolveSystemKeyspace(SystemDistributedKeyspace.metadata(), SystemDistributedKeyspace.GENERATION).ifPresent(changes::add);
-        evolveSystemKeyspace(             AuthKeyspace.metadata(),              AuthKeyspace.GENERATION).ifPresent(changes::add);
-
-        if (!changes.isEmpty())
-            FBUtilities.waitOnFuture(MigrationManager.announceWithoutPush(changes));
+        Schema.instance.transform(SchemaTransformations.updateSystemKeyspace(TraceKeyspace.metadata(), TraceKeyspace.GENERATION));
+        Schema.instance.transform(SchemaTransformations.updateSystemKeyspace(SystemDistributedKeyspace.metadata(), SystemDistributedKeyspace.GENERATION));
+        Schema.instance.transform(SchemaTransformations.updateSystemKeyspace(AuthKeyspace.metadata(), AuthKeyspace.GENERATION));
     }
 
     public boolean isJoined()
@@ -1345,12 +1381,6 @@
                                                                      sourceDc, String.join(",", availableDCs)));
                 }
             }
-
-            // check the arguments
-            if (keyspace == null && tokens != null)
-            {
-                throw new IllegalArgumentException("Cannot specify tokens without keyspace.");
-            }
         }
         catch (Throwable ex)
         {
@@ -1358,12 +1388,20 @@
             throw ex;
         }
 
-        logger.info("rebuild from dc: {}, {}, {}", sourceDc == null ? "(any dc)" : sourceDc,
-                    keyspace == null ? "(All keyspaces)" : keyspace,
-                    tokens == null ? "(All tokens)" : tokens);
-
         try
         {
+            // check the arguments
+            if (keyspace == null && tokens != null)
+            {
+                throw new IllegalArgumentException("Cannot specify tokens without keyspace.");
+            }
+
+            logger.info("rebuild from dc: {}, {}, {}", sourceDc == null ? "(any dc)" : sourceDc,
+                        keyspace == null ? "(All keyspaces)" : keyspace,
+                        tokens == null ? "(All tokens)" : tokens);
+
+            repairPaxosForTopologyChange("rebuild");
+
             RangeStreamer streamer = new RangeStreamer(tokenMetadata,
                                                        null,
                                                        FBUtilities.getBroadcastAddressAndPort(),
@@ -1378,7 +1416,7 @@
 
             if (keyspace == null)
             {
-                for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+                for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
                     streamer.addRanges(keyspaceName, getLocalReplicas(keyspaceName));
             }
             else if (tokens == null)
@@ -1457,7 +1495,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException("Interrupted while waiting on rebuild streaming");
+            throw new UncheckedInterruptedException(e);
         }
         catch (ExecutionException e)
         {
@@ -1583,52 +1621,166 @@
         return DatabaseDescriptor.getTruncateRpcTimeout(MILLISECONDS);
     }
 
+    @Deprecated
     public void setStreamThroughputMbPerSec(int value)
     {
-        int oldValue = DatabaseDescriptor.getStreamThroughputOutboundMegabitsPerSec();
-        DatabaseDescriptor.setStreamThroughputOutboundMegabitsPerSec(value);
-        StreamManager.StreamRateLimiter.updateThroughput();
-        logger.info("setstreamthroughput: throttle set to {} Mb/s (was {} Mb/s)", value, oldValue);
+        setStreamThroughputMbitPerSec(value);
     }
 
+    public void setStreamThroughputMbitPerSec(int value)
+    {
+        double oldValue = DatabaseDescriptor.getStreamThroughputOutboundMegabitsPerSecAsDouble();
+        DatabaseDescriptor.setStreamThroughputOutboundMegabitsPerSec(value);
+        StreamManager.StreamRateLimiter.updateThroughput();
+        logger.info("setstreamthroughput: throttle set to {}{} megabits per second (was approximately {} megabits per second)",
+                    value, value <= 0 ? " (unlimited)" : "", oldValue);
+    }
+
+    public void setStreamThroughputMebibytesPerSec(int value)
+    {
+        double oldValue = DatabaseDescriptor.getStreamThroughputOutboundMebibytesPerSec();
+        DatabaseDescriptor.setStreamThroughputOutboundMebibytesPerSecAsInt(value);
+        StreamManager.StreamRateLimiter.updateThroughput();
+        logger.info("setstreamthroughput: throttle set to {}{} MiB/s (was {} MiB/s)", value, value <= 0 ? " (unlimited)" : "", oldValue);
+    }
+
+    public double getStreamThroughputMebibytesPerSecAsDouble()
+    {
+        return DatabaseDescriptor.getStreamThroughputOutboundMebibytesPerSec();
+    }
+
+    public int getStreamThroughputMebibytesPerSec()
+    {
+        return DatabaseDescriptor.getStreamThroughputOutboundMebibytesPerSecAsInt();
+    }
+
+    @Deprecated
     public int getStreamThroughputMbPerSec()
     {
+        return getStreamThroughputMbitPerSec();
+    }
+
+    @Deprecated
+    public int getStreamThroughputMbitPerSec()
+    {
         return DatabaseDescriptor.getStreamThroughputOutboundMegabitsPerSec();
     }
 
-    public void setInterDCStreamThroughputMbPerSec(int value)
+    public double getStreamThroughputMbitPerSecAsDouble()
     {
-        int oldValue = DatabaseDescriptor.getInterDCStreamThroughputOutboundMegabitsPerSec();
-        DatabaseDescriptor.setInterDCStreamThroughputOutboundMegabitsPerSec(value);
-        StreamManager.StreamRateLimiter.updateInterDCThroughput();
-        logger.info("setinterdcstreamthroughput: throttle set to {} Mb/s (was {} Mb/s)", value, oldValue);
+        return DatabaseDescriptor.getStreamThroughputOutboundMegabitsPerSecAsDouble();
     }
 
+    public void setEntireSSTableStreamThroughputMebibytesPerSec(int value)
+    {
+        double oldValue = DatabaseDescriptor.getEntireSSTableStreamThroughputOutboundMebibytesPerSec();
+        DatabaseDescriptor.setEntireSSTableStreamThroughputOutboundMebibytesPerSec(value);
+        StreamManager.StreamRateLimiter.updateEntireSSTableThroughput();
+        logger.info("setstreamthroughput (entire SSTable): throttle set to {}{} MiB/s (was {} MiB/s)",
+                    value, value <= 0 ? " (unlimited)" : "", oldValue);
+    }
+
+    public double getEntireSSTableStreamThroughputMebibytesPerSecAsDouble()
+    {
+        return DatabaseDescriptor.getEntireSSTableStreamThroughputOutboundMebibytesPerSec();
+    }
+
+    @Deprecated
+    public void setInterDCStreamThroughputMbPerSec(int value)
+    {
+        setInterDCStreamThroughputMbitPerSec(value);
+    }
+
+    public void setInterDCStreamThroughputMbitPerSec(int value)
+    {
+        double oldValue = DatabaseDescriptor.getInterDCStreamThroughputOutboundMegabitsPerSecAsDouble();
+        DatabaseDescriptor.setInterDCStreamThroughputOutboundMegabitsPerSec(value);
+        StreamManager.StreamRateLimiter.updateInterDCThroughput();
+        logger.info("setinterdcstreamthroughput: throttle set to {}{} megabits per second (was {} megabits per second)", value, value <= 0 ? " (unlimited)" : "", oldValue);
+    }
+
+    @Deprecated
     public int getInterDCStreamThroughputMbPerSec()
     {
+        return getInterDCStreamThroughputMbitPerSec();
+    }
+
+    @Deprecated
+    public int getInterDCStreamThroughputMbitPerSec()
+    {
         return DatabaseDescriptor.getInterDCStreamThroughputOutboundMegabitsPerSec();
     }
 
+    public double getInterDCStreamThroughputMbitPerSecAsDouble()
+    {
+        return DatabaseDescriptor.getInterDCStreamThroughputOutboundMegabitsPerSecAsDouble();
+    }
 
+    public void setInterDCStreamThroughputMebibytesPerSec(int value)
+    {
+        double oldValue = DatabaseDescriptor.getInterDCStreamThroughputOutboundMebibytesPerSec();
+        DatabaseDescriptor.setInterDCStreamThroughputOutboundMebibytesPerSecAsInt(value);
+        StreamManager.StreamRateLimiter.updateInterDCThroughput();
+        logger.info("setinterdcstreamthroughput: throttle set to {}{} MiB/s (was {} MiB/s)", value, value <= 0 ? " (unlimited)" : "", oldValue);
+    }
+
+    public int getInterDCStreamThroughputMebibytesPerSec()
+    {
+        return DatabaseDescriptor.getInterDCStreamThroughputOutboundMebibytesPerSecAsInt();
+    }
+
+    public double getInterDCStreamThroughputMebibytesPerSecAsDouble()
+    {
+        return DatabaseDescriptor.getInterDCStreamThroughputOutboundMebibytesPerSec();
+    }
+
+    public void setEntireSSTableInterDCStreamThroughputMebibytesPerSec(int value)
+    {
+        double oldValue = DatabaseDescriptor.getEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec();
+        DatabaseDescriptor.setEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec(value);
+        StreamManager.StreamRateLimiter.updateEntireSSTableInterDCThroughput();
+        logger.info("setinterdcstreamthroughput (entire SSTable): throttle set to {}{} MiB/s (was {} MiB/s)", value, value <= 0 ? " (unlimited)" : "", oldValue);
+    }
+
+    public double getEntireSSTableInterDCStreamThroughputMebibytesPerSecAsDouble()
+    {
+        return DatabaseDescriptor.getEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec();
+    }
+
+    public double getCompactionThroughtputMibPerSecAsDouble()
+    {
+        return DatabaseDescriptor.getCompactionThroughputMebibytesPerSec();
+    }
+
+    public long getCompactionThroughtputBytesPerSec()
+    {
+        return (long)DatabaseDescriptor.getCompactionThroughputBytesPerSec();
+    }
+
+    @Deprecated
     public int getCompactionThroughputMbPerSec()
     {
-        return DatabaseDescriptor.getCompactionThroughputMbPerSec();
+        return DatabaseDescriptor.getCompactionThroughputMebibytesPerSecAsInt();
     }
 
     public void setCompactionThroughputMbPerSec(int value)
     {
-        DatabaseDescriptor.setCompactionThroughputMbPerSec(value);
-        CompactionManager.instance.setRate(value);
+        double oldValue = DatabaseDescriptor.getCompactionThroughputMebibytesPerSec();
+        DatabaseDescriptor.setCompactionThroughputMebibytesPerSec(value);
+        double valueInBytes = value * 1024.0 * 1024.0;
+        CompactionManager.instance.setRateInBytes(valueInBytes);
+        logger.info("compactionthroughput: throttle set to {} mebibytes per second (was {} mebibytes per second)",
+                    value, oldValue);
     }
 
     public int getBatchlogReplayThrottleInKB()
     {
-        return DatabaseDescriptor.getBatchlogReplayThrottleInKB();
+        return DatabaseDescriptor.getBatchlogReplayThrottleInKiB();
     }
 
     public void setBatchlogReplayThrottleInKB(int throttleInKB)
     {
-        DatabaseDescriptor.setBatchlogReplayThrottleInKB(throttleInKB);
+        DatabaseDescriptor.setBatchlogReplayThrottleInKiB(throttleInKB);
         BatchlogManager.instance.setRate(throttleInKB);
     }
 
@@ -1744,7 +1896,7 @@
     }
 
     @VisibleForTesting
-    public Collection<InetAddressAndPort> prepareForBootstrap(long schemaDelay)
+    public Collection<InetAddressAndPort> prepareForBootstrap(long schemaTimeoutMillis, long ringTimeoutMillis)
     {
         Set<InetAddressAndPort> collisions = new HashSet<>();
         if (SystemKeyspace.bootstrapInProgress())
@@ -1752,7 +1904,7 @@
         else
             SystemKeyspace.setBootstrapState(SystemKeyspace.BootstrapState.IN_PROGRESS);
         setMode(Mode.JOINING, "waiting for ring information", true);
-        waitForSchema(schemaDelay);
+        waitForSchema(schemaTimeoutMillis, ringTimeoutMillis);
         setMode(Mode.JOINING, "schema complete, ready to bootstrap", true);
         setMode(Mode.JOINING, "waiting for pending range calculation", true);
         PendingRangeCalculatorService.instance.blockUntilFinished();
@@ -1782,7 +1934,7 @@
                 throw new UnsupportedOperationException(s);
             }
             setMode(Mode.JOINING, "getting bootstrap token", true);
-            bootstrapTokens = BootStrapper.getBootstrapTokens(tokenMetadata, FBUtilities.getBroadcastAddressAndPort(), schemaDelay);
+            bootstrapTokens = BootStrapper.getBootstrapTokens(tokenMetadata, FBUtilities.getBroadcastAddressAndPort(), schemaTimeoutMillis, ringTimeoutMillis);
         }
         else
         {
@@ -1796,7 +1948,7 @@
                 }
                 catch (InterruptedException e)
                 {
-                    throw new AssertionError(e);
+                    throw new UncheckedInterruptedException(e);
                 }
 
                 // check for operator errors...
@@ -1805,8 +1957,8 @@
                     InetAddressAndPort existing = tokenMetadata.getEndpoint(token);
                     if (existing != null)
                     {
-                        long nanoDelay = schemaDelay * 1000000L;
-                        if (Gossiper.instance.getEndpointStateForEndpoint(existing).getUpdateTimestamp() > (System.nanoTime() - nanoDelay))
+                        long nanoDelay = ringTimeoutMillis * 1000000L;
+                        if (Gossiper.instance.getEndpointStateForEndpoint(existing).getUpdateTimestamp() > (nanoTime() - nanoDelay))
                             throw new UnsupportedOperationException("Cannot replace a live node... ");
                         collisions.add(existing);
                     }
@@ -1820,11 +1972,11 @@
             {
                 try
                 {
-                    Thread.sleep(RING_DELAY);
+                    Thread.sleep(RING_DELAY_MILLIS);
                 }
                 catch (InterruptedException e)
                 {
-                    throw new AssertionError(e);
+                    throw new UncheckedInterruptedException(e);
                 }
 
             }
@@ -1856,12 +2008,12 @@
             states.add(Pair.create(ApplicationState.STATUS_WITH_PORT, replacing?
                                                             valueFactory.bootReplacingWithPort(DatabaseDescriptor.getReplaceAddress()) :
                                                             valueFactory.bootstrapping(tokens)));
-            states.add(Pair.create(ApplicationState.STATUS, replacing?
-                                                            valueFactory.bootReplacing(DatabaseDescriptor.getReplaceAddress().address) :
+            states.add(Pair.create(ApplicationState.STATUS, replacing ?
+                                                            valueFactory.bootReplacing(DatabaseDescriptor.getReplaceAddress().getAddress()) :
                                                             valueFactory.bootstrapping(tokens)));
             Gossiper.instance.addLocalApplicationStates(states);
-            setMode(Mode.JOINING, "sleeping " + RING_DELAY + " ms for pending range setup", true);
-            Uninterruptibles.sleepUninterruptibly(RING_DELAY, MILLISECONDS);
+            setMode(Mode.JOINING, "sleeping " + RING_DELAY_MILLIS + " ms for pending range setup", true);
+            Uninterruptibles.sleepUninterruptibly(RING_DELAY_MILLIS, MILLISECONDS);
         }
         else
         {
@@ -1879,7 +2031,8 @@
         }
 
         // Force disk boundary invalidation now that local tokens are set
-        invalidateDiskBoundaries();
+        invalidateLocalRanges();
+        repairPaxosForTopologyChange("bootstrap");
 
         Future<StreamState> bootstrapStream = startBootstrap(tokens);
         try
@@ -1901,13 +2054,18 @@
 
     public Future<StreamState> startBootstrap(Collection<Token> tokens)
     {
+        return startBootstrap(tokens, replacing);
+    }
+
+    public Future<StreamState> startBootstrap(Collection<Token> tokens, boolean replacing)
+    {
         setMode(Mode.JOINING, "Starting to bootstrap...", true);
         BootStrapper bootstrapper = new BootStrapper(FBUtilities.getBroadcastAddressAndPort(), tokens, tokenMetadata);
         bootstrapper.addProgressListener(progressSupport);
         return bootstrapper.bootstrap(streamStateStore, useStrictConsistency && !replacing); // handles token update
     }
 
-    private void invalidateDiskBoundaries()
+    private void invalidateLocalRanges()
     {
         for (Keyspace keyspace : Keyspace.all())
         {
@@ -1915,7 +2073,7 @@
             {
                 for (final ColumnFamilyStore store : cfs.concatWithIndexes())
                 {
-                    store.invalidateDiskBoundaries();
+                    store.invalidateLocalRanges();
                 }
             }
         }
@@ -1925,7 +2083,7 @@
      * All MVs have been created during bootstrap, so mark them as built
      */
     private void markViewsAsBuilt() {
-        for (String keyspace : Schema.instance.getUserKeyspaces())
+        for (String keyspace : Schema.instance.getUserKeyspaces().names())
         {
             for (ViewMetadata view: Schema.instance.getKeyspaceMetadata(keyspace).views)
                 SystemKeyspace.finishViewBuildStatus(view.keyspace(), view.name());
@@ -1951,8 +2109,8 @@
             // already bootstrapped ranges are filtered during bootstrap
             BootStrapper bootstrapper = new BootStrapper(FBUtilities.getBroadcastAddressAndPort(), tokens, tokenMetadata);
             bootstrapper.addProgressListener(progressSupport);
-            ListenableFuture<StreamState> bootstrapStream = bootstrapper.bootstrap(streamStateStore, useStrictConsistency && !replacing); // handles token update
-            Futures.addCallback(bootstrapStream, new FutureCallback<StreamState>()
+            Future<StreamState> bootstrapStream = bootstrapper.bootstrap(streamStateStore, useStrictConsistency && !replacing); // handles token update
+            bootstrapStream.addCallback(new FutureCallback<StreamState>()
             {
                 @Override
                 public void onSuccess(StreamState streamState)
@@ -2000,7 +2158,7 @@
                     progressSupport.progress("bootstrap", new ProgressEvent(ProgressEventType.ERROR, 1, 1, message));
                     progressSupport.progress("bootstrap", new ProgressEvent(ProgressEventType.COMPLETE, 1, 1, "Resume bootstrap complete"));
                 }
-            }, MoreExecutors.directExecutor());
+            });
             return true;
         }
         else
@@ -2155,7 +2313,7 @@
         // some people just want to get a visual representation of things. Allow null and set it to the first
         // non-system keyspace.
         if (keyspace == null)
-            keyspace = Schema.instance.getNonLocalStrategyKeyspaces().get(0);
+            keyspace = Schema.instance.getNonLocalStrategyKeyspaces().iterator().next().name;
 
         Map<List<String>, List<String>> map = new HashMap<>();
         for (Map.Entry<Range<Token>, EndpointsForRange> entry : tokenMetadata.getPendingRangesMM(keyspace).asMap().entrySet())
@@ -2209,7 +2367,7 @@
         // some people just want to get a visual representation of things. Allow null and set it to the first
         // non-system keyspace.
         if (keyspace == null)
-            keyspace = Schema.instance.getNonLocalStrategyKeyspaces().get(0);
+            keyspace = Schema.instance.getNonLocalStrategyKeyspaces().iterator().next().name;
 
         List<Range<Token>> ranges = getAllRanges(sortedTokens);
         return constructRangeToEndpointMap(keyspace, ranges);
@@ -2333,7 +2491,7 @@
             return id;
         // this condition is to prevent accessing the tables when the node is not started yet, and in particular,
         // when it is not going to be started at all (e.g. when running some unit tests or client tools).
-        else if (CommitLog.instance.isStarted())
+        else if ((DatabaseDescriptor.isDaemonInitialized() || DatabaseDescriptor.isToolInitialized()) && CommitLog.instance.isStarted())
             return SystemKeyspace.getLocalHostId();
 
         return null;
@@ -2518,7 +2676,6 @@
                         break;
                     case SCHEMA:
                         SystemKeyspace.updatePeerInfo(endpoint, "schema_version", UUID.fromString(value.value));
-                        MigrationCoordinator.instance.reportEndpointVersion(endpoint, UUID.fromString(value.value));
                         break;
                     case HOST_ID:
                         SystemKeyspace.updatePeerInfo(endpoint, "host_id", UUID.fromString(value.value));
@@ -2602,8 +2759,8 @@
                     try
                     {
                         InetAddressAndPort address = InetAddressAndPort.getByName(entry.getValue().value);
-                        native_address = address.address;
-                        native_port = address.port;
+                        native_address = address.getAddress();
+                        native_port = address.getPort();
                     }
                     catch (UnknownHostException e)
                     {
@@ -2841,7 +2998,9 @@
                 tokensToUpdateInMetadata.add(token);
                 tokensToUpdateInSystemKeyspace.add(token);
             }
-            else if (Gossiper.instance.compareEndpointStartup(endpoint, currentOwner) > 0)
+            // Note: in test scenarios, there may not be any delta between the heartbeat generations of the old
+            // and new nodes, so we first check whether the new endpoint is marked as a replacement for the old.
+            else if (endpoint.equals(tokenMetadata.getReplacementNode(currentOwner).orElse(null)) || Gossiper.instance.compareEndpointStartup(endpoint, currentOwner) > 0)
             {
                 tokensToUpdateInMetadata.add(token);
                 tokensToUpdateInSystemKeyspace.add(token);
@@ -2870,6 +3029,9 @@
         }
         if (!tokensToUpdateInSystemKeyspace.isEmpty())
             SystemKeyspace.updateTokens(endpoint, tokensToUpdateInSystemKeyspace);
+
+        // Tokens changed, the local range ownership probably changed too.
+        invalidateLocalRanges();
     }
 
     @VisibleForTesting
@@ -2990,6 +3152,8 @@
         if (isMoving || operationMode == Mode.MOVING)
         {
             tokenMetadata.removeFromMoving(endpoint);
+            // The above may change the local ownership.
+            invalidateLocalRanges();
             notifyMoved(endpoint);
         }
         else if (!isMember) // prior to this, the node was not a member
@@ -3146,7 +3310,6 @@
     private void removeEndpoint(InetAddressAndPort endpoint)
     {
         Gossiper.runInGossipStageBlocking(() -> Gossiper.instance.removeEndpoint(endpoint));
-        MigrationCoordinator.instance.removeAndIgnoreEndpoint(endpoint);
         SystemKeyspace.removeEndpoint(endpoint);
     }
 
@@ -3308,7 +3471,7 @@
 
         InetAddressAndPort myAddress = FBUtilities.getBroadcastAddressAndPort();
 
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             logger.debug("Restoring replica count for keyspace {}", keyspaceName);
             EndpointsByReplica changedReplicas = getChangedReplicasForLeaving(keyspaceName, endpoint, tokenMetadata, Keyspace.open(keyspaceName).getReplicationStrategy());
@@ -3351,7 +3514,7 @@
             });
         });
         StreamResultFuture future = stream.execute();
-        Futures.addCallback(future, new FutureCallback<StreamState>()
+        future.addCallback(new FutureCallback<StreamState>()
         {
             public void onSuccess(StreamState finalState)
             {
@@ -3364,7 +3527,7 @@
                 // We still want to send the notification
                 sendReplicationNotification(notifyEndpoint);
             }
-        }, MoreExecutors.directExecutor());
+        });
     }
 
     /**
@@ -3460,13 +3623,13 @@
             statusValue = epState.getApplicationState(statusState);
         }
         if (statusValue != null)
-            onChange(endpoint, statusState, statusValue);
+            Gossiper.instance.doOnChangeNotifications(endpoint, statusState, statusValue);
 
         for (Map.Entry<ApplicationState, VersionedValue> entry : epState.states())
         {
             if (entry.getKey() == ApplicationState.STATUS_WITH_PORT || entry.getKey() == ApplicationState.STATUS)
                 continue;
-            onChange(endpoint, entry.getKey(), entry.getValue());
+            Gossiper.instance.doOnChangeNotifications(endpoint, entry.getKey(), entry.getValue());
         }
     }
 
@@ -3614,7 +3777,7 @@
 
         for (Pair<Token, InetAddressAndPort> node : tokenMetadata.getMovingEndpoints())
         {
-            endpoints.add(node.right.address.getHostAddress());
+            endpoints.add(node.right.getAddress().getHostAddress());
         }
 
         return endpoints;
@@ -3820,12 +3983,34 @@
         return upgradeSSTables(keyspaceName, excludeCurrentVersion, 0, tableNames);
     }
 
-    public int upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
+    public int upgradeSSTables(String keyspaceName,
+                               final boolean skipIfCurrentVersion,
+                               final long skipIfNewerThanTimestamp,
+                               int jobs,
+                               String... tableNames) throws IOException, ExecutionException, InterruptedException
+    {
+        return rewriteSSTables(keyspaceName, skipIfCurrentVersion, skipIfNewerThanTimestamp, false, jobs, tableNames);
+    }
+
+    public int recompressSSTables(String keyspaceName,
+                                  int jobs,
+                                  String... tableNames) throws IOException, ExecutionException, InterruptedException
+    {
+        return rewriteSSTables(keyspaceName, false, Long.MAX_VALUE, true, jobs, tableNames);
+    }
+
+
+    public int rewriteSSTables(String keyspaceName,
+                               final boolean skipIfCurrentVersion,
+                               final long skipIfNewerThanTimestamp,
+                               final boolean skipIfCompressionMatches,
+                               int jobs,
+                               String... tableNames) throws IOException, ExecutionException, InterruptedException
     {
         CompactionManager.AllSSTableOpStatus status = CompactionManager.AllSSTableOpStatus.SUCCESSFUL;
         for (ColumnFamilyStore cfStore : getValidColumnFamilies(true, true, keyspaceName, tableNames))
         {
-            CompactionManager.AllSSTableOpStatus oneStatus = cfStore.sstablesRewrite(excludeCurrentVersion, jobs);
+            CompactionManager.AllSSTableOpStatus oneStatus = cfStore.sstablesRewrite(skipIfCurrentVersion, skipIfNewerThanTimestamp, skipIfCompressionMatches, jobs);
             if (oneStatus != CompactionManager.AllSSTableOpStatus.SUCCESSFUL)
                 status = oneStatus;
         }
@@ -3897,15 +4082,22 @@
     @Override
     public void takeSnapshot(String tag, Map<String, String> options, String... entities) throws IOException
     {
-        boolean skipFlush = Boolean.parseBoolean(options.getOrDefault("skipFlush", "false"));
+        DurationSpec.IntSecondsBound ttl = options.containsKey("ttl") ? new DurationSpec.IntSecondsBound(options.get("ttl")) : null;
+        if (ttl != null)
+        {
+            int minAllowedTtlSecs = CassandraRelevantProperties.SNAPSHOT_MIN_ALLOWED_TTL_SECONDS.getInt();
+            if (ttl.toSeconds() < minAllowedTtlSecs)
+                throw new IllegalArgumentException(String.format("ttl for snapshot must be at least %d seconds", minAllowedTtlSecs));
+        }
 
+        boolean skipFlush = Boolean.parseBoolean(options.getOrDefault("skipFlush", "false"));
         if (entities != null && entities.length > 0 && entities[0].contains("."))
         {
-            takeMultipleTableSnapshot(tag, skipFlush, entities);
+            takeMultipleTableSnapshot(tag, skipFlush, ttl, entities);
         }
         else
         {
-            takeSnapshot(tag, skipFlush, entities);
+            takeSnapshot(tag, skipFlush, ttl, entities);
         }
     }
 
@@ -3923,9 +4115,10 @@
     public void takeTableSnapshot(String keyspaceName, String tableName, String tag)
             throws IOException
     {
-        takeMultipleTableSnapshot(tag, false, keyspaceName + "." + tableName);
+        takeMultipleTableSnapshot(tag, false, null, keyspaceName + "." + tableName);
     }
 
+    @Override
     public void forceKeyspaceCompactionForTokenRange(String keyspaceName, String startToken, String endToken, String... tableNames) throws IOException, ExecutionException, InterruptedException
     {
         Collection<Range<Token>> tokenRanges = createRepairRangeFrom(startToken, endToken);
@@ -3936,6 +4129,30 @@
         }
     }
 
+    @Override
+    public void forceKeyspaceCompactionForPartitionKey(String keyspaceName, String partitionKey, String... tableNames) throws IOException, ExecutionException, InterruptedException
+    {
+        // validate that the key parses before attempting compaction
+        for (ColumnFamilyStore cfStore : getValidColumnFamilies(true, false, keyspaceName, tableNames))
+        {
+            try
+            {
+                getKeyFromPartition(keyspaceName, cfStore.name, partitionKey);
+            }
+            catch (Exception e)
+            {
+                // JMX can not handle exceptions defined outside of java.* and javax.*, so safer to rewrite the exception
+                IllegalArgumentException exception = new IllegalArgumentException(String.format("Unable to parse partition key '%s' for table %s; %s", partitionKey, cfStore.metadata, e.getMessage()));
+                exception.setStackTrace(e.getStackTrace());
+                throw exception;
+            }
+        }
+        for (ColumnFamilyStore cfStore : getValidColumnFamilies(true, false, keyspaceName, tableNames))
+        {
+            cfStore.forceCompactionForKey(getKeyFromPartition(keyspaceName, cfStore.name, partitionKey));
+        }
+    }
+
     /**
      * Takes the snapshot for the given keyspaces. A snapshot name must be specified.
      *
@@ -3944,7 +4161,7 @@
      */
     public void takeSnapshot(String tag, String... keyspaceNames) throws IOException
     {
-        takeSnapshot(tag, false, keyspaceNames);
+        takeSnapshot(tag, false, null, keyspaceNames);
     }
 
     /**
@@ -3958,7 +4175,7 @@
     public void takeMultipleTableSnapshot(String tag, String... tableList)
             throws IOException
     {
-        takeMultipleTableSnapshot(tag, false, tableList);
+        takeMultipleTableSnapshot(tag, false, null, tableList);
     }
 
     /**
@@ -3968,7 +4185,7 @@
      * @param skipFlush Skip blocking flush of memtable
      * @param keyspaceNames the names of the keyspaces to snapshot; empty means "all."
      */
-    private void takeSnapshot(String tag, boolean skipFlush, String... keyspaceNames) throws IOException
+    private void takeSnapshot(String tag, boolean skipFlush, DurationSpec.IntSecondsBound ttl, String... keyspaceNames) throws IOException
     {
         if (operationMode == Mode.JOINING)
             throw new IOException("Cannot snapshot until bootstrap completes");
@@ -3995,9 +4212,12 @@
 
 
         RateLimiter snapshotRateLimiter = DatabaseDescriptor.getSnapshotRateLimiter();
+        Instant creationTime = now();
 
         for (Keyspace keyspace : keyspaces)
-            keyspace.snapshot(tag, null, skipFlush, snapshotRateLimiter);
+        {
+            keyspace.snapshot(tag, null, skipFlush, ttl, snapshotRateLimiter, creationTime);
+        }
     }
 
     /**
@@ -4011,7 +4231,7 @@
      * @param tableList
      *            list of tables from different keyspace in the form of ks1.cf1 ks2.cf2
      */
-    private void takeMultipleTableSnapshot(String tag, boolean skipFlush, String... tableList)
+    private void takeMultipleTableSnapshot(String tag, boolean skipFlush, DurationSpec.IntSecondsBound ttl, String... tableList)
             throws IOException
     {
         Map<Keyspace, List<String>> keyspaceColumnfamily = new HashMap<Keyspace, List<String>>();
@@ -4058,13 +4278,13 @@
         }
 
         RateLimiter snapshotRateLimiter = DatabaseDescriptor.getSnapshotRateLimiter();
+        Instant creationTime = now();
 
         for (Entry<Keyspace, List<String>> entry : keyspaceColumnfamily.entrySet())
         {
             for (String table : entry.getValue())
-                entry.getKey().snapshot(tag, table, skipFlush, snapshotRateLimiter);
+                entry.getKey().snapshot(tag, table, skipFlush, ttl, snapshotRateLimiter, creationTime);
         }
-
     }
 
     private void verifyKeyspaceIsValid(String keyspaceName)
@@ -4094,7 +4314,7 @@
         Set<String> keyspaces = new HashSet<>();
         for (String dataDir : DatabaseDescriptor.getAllDataFileLocations())
         {
-            for(String keyspaceDir : new File(dataDir).list())
+            for(String keyspaceDir : new File(dataDir).tryListNames())
             {
                 // Only add a ks if it has been specified as a param, assuming params were actually provided.
                 if (keyspaceNames.length > 0 && !Arrays.asList(keyspaceNames).contains(keyspaceDir))
@@ -4110,27 +4330,34 @@
             logger.debug("Cleared out snapshot directories");
     }
 
+    public Map<String, TabularData> getSnapshotDetails(Map<String, String> options)
+    {
+        boolean skipExpiring = options != null && Boolean.parseBoolean(options.getOrDefault("no_ttl", "false"));
+
+        Map<String, TabularData> snapshotMap = new HashMap<>();
+
+        for (TableSnapshot snapshot : snapshotManager.loadSnapshots())
+        {
+            if (skipExpiring && snapshot.isExpiring())
+                continue;
+
+            TabularDataSupport data = (TabularDataSupport) snapshotMap.get(snapshot.getTag());
+            if (data == null)
+            {
+                data = new TabularDataSupport(SnapshotDetailsTabularData.TABULAR_TYPE);
+                snapshotMap.put(snapshot.getTag(), data);
+            }
+
+            SnapshotDetailsTabularData.from(snapshot, data);
+        }
+
+        return snapshotMap;
+    }
+
+    @Deprecated
     public Map<String, TabularData> getSnapshotDetails()
     {
-        Map<String, TabularData> snapshotMap = new HashMap<>();
-        for (Keyspace keyspace : Keyspace.all())
-        {
-            for (ColumnFamilyStore cfStore : keyspace.getColumnFamilyStores())
-            {
-                for (Map.Entry<String, Directories.SnapshotSizeDetails> snapshotDetail : cfStore.getSnapshotDetails().entrySet())
-                {
-                    TabularDataSupport data = (TabularDataSupport)snapshotMap.get(snapshotDetail.getKey());
-                    if (data == null)
-                    {
-                        data = new TabularDataSupport(SnapshotDetailsTabularData.TABULAR_TYPE);
-                        snapshotMap.put(snapshotDetail.getKey(), data);
-                    }
-
-                    SnapshotDetailsTabularData.from(snapshotDetail.getKey(), keyspace.getName(), cfStore.getTableName(), snapshotDetail, data);
-                }
-            }
-        }
-        return snapshotMap;
+        return getSnapshotDetails(ImmutableMap.of());
     }
 
     public long trueSnapshotsSize()
@@ -4196,7 +4423,21 @@
         for (ColumnFamilyStore cfStore : getValidColumnFamilies(true, false, keyspaceName, tableNames))
         {
             logger.debug("Forcing flush on keyspace {}, CF {}", keyspaceName, cfStore.name);
-            cfStore.forceBlockingFlush();
+            cfStore.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
+        }
+    }
+
+    /**
+     * Flush all memtables for a keyspace and column families.
+     * @param keyspaceName
+     * @throws IOException
+     */
+    public void forceKeyspaceFlush(String keyspaceName, ColumnFamilyStore.FlushReason reason) throws IOException
+    {
+        for (ColumnFamilyStore cfStore : getValidColumnFamilies(true, false, keyspaceName))
+        {
+            logger.debug("Forcing flush on keyspace {}, CF {}", keyspaceName, cfStore.name);
+            cfStore.forceBlockingFlush(reason);
         }
     }
 
@@ -4208,6 +4449,11 @@
     public Pair<Integer, Future<?>> repair(String keyspace, Map<String, String> repairSpec, List<ProgressListener> listeners)
     {
         RepairOption option = RepairOption.parse(repairSpec, tokenMetadata.partitioner);
+        return repair(keyspace, option, listeners);
+    }
+
+    public Pair<Integer, Future<?>> repair(String keyspace, RepairOption option, List<ProgressListener> listeners)
+    {
         // if ranges are not specified
         if (option.getRanges().isEmpty())
         {
@@ -4228,10 +4474,10 @@
             }
         }
         if (option.getRanges().isEmpty() || Keyspace.open(keyspace).getReplicationStrategy().getReplicationFactor().allReplicas < 2)
-            return Pair.create(0, Futures.immediateFuture(null));
+            return Pair.create(0, ImmediateFuture.success(null));
 
         int cmd = nextRepairCommand.incrementAndGet();
-        return Pair.create(cmd, ActiveRepairService.repairCommandExecutor().submit(createRepairTask(cmd, keyspace, option, listeners)));
+        return Pair.create(cmd, repairCommandExecutor().submit(createRepairTask(cmd, keyspace, option, listeners)));
     }
 
     /**
@@ -4297,21 +4543,99 @@
             task.addProgressListener(listener);
 
         if (options.isTraced())
+            return new FutureTaskWithResources<>(() -> ExecutorLocals::clear, task);
+        return new FutureTask<>(task);
+    }
+
+    private void tryRepairPaxosForTopologyChange(String reason)
+    {
+        try
         {
-            Runnable r = () ->
-            {
-                try
-                {
-                    task.run();
-                }
-                finally
-                {
-                    ExecutorLocals.set(null);
-                }
-            };
-            return new FutureTask<>(r, null);
+            startRepairPaxosForTopologyChange(reason).get();
         }
-        return new FutureTask<>(task, null);
+        catch (InterruptedException e)
+        {
+            logger.error("Error during paxos repair", e);
+            throw new AssertionError(e);
+        }
+        catch (ExecutionException e)
+        {
+            logger.error("Error during paxos repair", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    private void repairPaxosForTopologyChange(String reason)
+    {
+        if (getSkipPaxosRepairOnTopologyChange() || !Paxos.useV2())
+        {
+            logger.info("skipping paxos repair for {}. skip_paxos_repair_on_topology_change is set, or v2 paxos variant is not being used", reason);
+            return;
+        }
+
+        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);
+
+        boolean completed = false;
+        while (!completed)
+        {
+            try
+            {
+                tryRepairPaxosForTopologyChange(reason);
+                completed = true;
+            }
+            catch (Exception e)
+            {
+                if (retries >= maxRetries)
+                    throw e;
+
+                retries++;
+                int sleep = delaySec * retries;
+                logger.info("Sleeping {} seconds before retrying paxos repair...", sleep);
+                Uninterruptibles.sleepUninterruptibly(sleep, TimeUnit.SECONDS);
+                logger.info("Retrying paxos repair for {}. Retry {}/{}", reason, retries, maxRetries);
+            }
+        }
+
+        logger.info("paxos repair for {} complete", reason);
+    }
+
+    @VisibleForTesting
+    public Future<?> startRepairPaxosForTopologyChange(String reason)
+    {
+        logger.info("repairing paxos for {}", reason);
+
+        List<Future<?>> futures = new ArrayList<>();
+
+        Keyspaces keyspaces = Schema.instance.getNonLocalStrategyKeyspaces();
+        for (String ksName : keyspaces.names())
+        {
+            if (SchemaConstants.REPLICATED_SYSTEM_KEYSPACE_NAMES.contains(ksName))
+                continue;
+
+            if (DatabaseDescriptor.skipPaxosRepairOnTopologyChangeKeyspaces().contains(ksName))
+                continue;
+
+            List<Range<Token>> ranges = getLocalAndPendingRanges(ksName);
+            futures.add(ActiveRepairService.instance.repairPaxosForTopologyChange(ksName, ranges, reason));
+        }
+
+        return FutureCombiner.allOf(futures);
+    }
+
+    public Future<?> autoRepairPaxos(TableId tableId)
+    {
+        TableMetadata table = Schema.instance.getTableMetadata(tableId);
+        if (table == null)
+            return ImmediateFuture.success(null);
+
+        List<Range<Token>> ranges = getLocalAndPendingRanges(table.keyspace);
+        PaxosCleanupLocalCoordinator coordinator = PaxosCleanupLocalCoordinator.createForAutoRepair(tableId, ranges);
+        ScheduledExecutors.optionalTasks.submit(coordinator::start);
+        return coordinator;
     }
 
     public void forceTerminateAllRepairSessions()
@@ -4322,7 +4646,7 @@
     @Nullable
     public List<String> getParentRepairStatus(int cmd)
     {
-        Pair<ActiveRepairService.ParentRepairStatus, List<String>> pair = ActiveRepairService.instance.getRepairStatus(cmd);
+        Pair<ParentRepairStatus, List<String>> pair = ActiveRepairService.instance.getRepairStatus(cmd);
         return pair == null ? null :
                ImmutableList.<String>builder().add(pair.left.name()).addAll(pair.right).build();
     }
@@ -4469,7 +4793,7 @@
     {
         EndpointsForToken replicas = getNaturalReplicasForToken(keyspaceName, cf, key);
         List<InetAddress> inetList = new ArrayList<>(replicas.size());
-        replicas.forEach(r -> inetList.add(r.endpoint().address));
+        replicas.forEach(r -> inetList.add(r.endpoint().getAddress()));
         return inetList;
     }
 
@@ -4483,7 +4807,7 @@
     {
         EndpointsForToken replicas = getNaturalReplicasForToken(keyspaceName, key);
         List<InetAddress> inetList = new ArrayList<>(replicas.size());
-        replicas.forEach(r -> inetList.add(r.endpoint().address));
+        replicas.forEach(r -> inetList.add(r.endpoint().getAddress()));
         return inetList;
     }
 
@@ -4495,6 +4819,22 @@
 
     public EndpointsForToken getNaturalReplicasForToken(String keyspaceName, String cf, String key)
     {
+        return getNaturalReplicasForToken(keyspaceName, partitionKeyToBytes(keyspaceName, cf, key));
+    }
+
+    public EndpointsForToken getNaturalReplicasForToken(String keyspaceName, ByteBuffer key)
+    {
+        Token token = tokenMetadata.partitioner.getToken(key);
+        return Keyspace.open(keyspaceName).getReplicationStrategy().getNaturalReplicasForToken(token);
+    }
+
+    public DecoratedKey getKeyFromPartition(String keyspaceName, String table, String partitionKey)
+    {
+        return tokenMetadata.partitioner.decorateKey(partitionKeyToBytes(keyspaceName, table, partitionKey));
+    }
+
+    private static ByteBuffer partitionKeyToBytes(String keyspaceName, String cf, String key)
+    {
         KeyspaceMetadata ksMetaData = Schema.instance.getKeyspaceMetadata(keyspaceName);
         if (ksMetaData == null)
             throw new IllegalArgumentException("Unknown keyspace '" + keyspaceName + "'");
@@ -4503,13 +4843,13 @@
         if (metadata == null)
             throw new IllegalArgumentException("Unknown table '" + cf + "' in keyspace '" + keyspaceName + "'");
 
-        return getNaturalReplicasForToken(keyspaceName, metadata.partitionKeyType.fromString(key));
+        return metadata.partitionKeyType.fromString(key);
     }
 
-    public EndpointsForToken getNaturalReplicasForToken(String keyspaceName, ByteBuffer key)
+    @Override
+    public String getToken(String keyspaceName, String table, String key)
     {
-        Token token = tokenMetadata.partitioner.getToken(key);
-        return Keyspace.open(keyspaceName).getReplicationStrategy().getNaturalReplicasForToken(token);
+        return tokenMetadata.partitioner.getToken(partitionKeyToBytes(keyspaceName, table, key)).toString();
     }
 
     public void setLoggingLevel(String classQualifier, String rawLevel) throws Exception
@@ -4621,7 +4961,7 @@
             if (operationMode != Mode.LEAVING) // If we're already decommissioning there is no point checking RF/pending ranges
             {
                 int rf, numNodes;
-                for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+                for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
                 {
                     if (!force)
                     {
@@ -4650,7 +4990,7 @@
             }
 
             startLeaving();
-            long timeout = Math.max(RING_DELAY, BatchlogManager.instance.getBatchlogTimeout());
+            long timeout = Math.max(RING_DELAY_MILLIS, BatchlogManager.instance.getBatchlogTimeout());
             setMode(Mode.LEAVING, "sleeping " + timeout + " ms for batch processing and pending range setup", true);
             Thread.sleep(timeout);
 
@@ -4679,7 +5019,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException("Node interrupted while decommissioning");
+            throw new UncheckedInterruptedException(e);
         }
         catch (ExecutionException e)
         {
@@ -4700,16 +5040,16 @@
 
         Gossiper.instance.addLocalApplicationState(ApplicationState.STATUS_WITH_PORT, valueFactory.left(getLocalTokens(),Gossiper.computeExpireTime()));
         Gossiper.instance.addLocalApplicationState(ApplicationState.STATUS, valueFactory.left(getLocalTokens(),Gossiper.computeExpireTime()));
-        int delay = Math.max(RING_DELAY, Gossiper.intervalInMillis * 2);
+        int delay = Math.max(RING_DELAY_MILLIS, Gossiper.intervalInMillis * 2);
         logger.info("Announcing that I have left the ring for {}ms", delay);
         Uninterruptibles.sleepUninterruptibly(delay, MILLISECONDS);
     }
 
-    private void unbootstrap(Runnable onFinish) throws ExecutionException, InterruptedException
+    public Supplier<Future<StreamState>> prepareUnbootstrapStreaming()
     {
         Map<String, EndpointsByReplica> rangesToStream = new HashMap<>();
 
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             EndpointsByReplica rangesMM = getChangedReplicasForLeaving(keyspaceName, FBUtilities.getBroadcastAddressAndPort(), tokenMetadata, Keyspace.open(keyspaceName).getReplicationStrategy());
 
@@ -4719,11 +5059,19 @@
             rangesToStream.put(keyspaceName, rangesMM);
         }
 
+        return () -> streamRanges(rangesToStream);
+    }
+
+    private void unbootstrap(Runnable onFinish) throws ExecutionException, InterruptedException
+    {
+        Supplier<Future<StreamState>> startStreaming = prepareUnbootstrapStreaming();
+
         setMode(Mode.LEAVING, "replaying batch log and streaming data to other nodes", true);
 
+        repairPaxosForTopologyChange("decommission");
         // Start with BatchLog replay, which may create hints but no writes since this is no longer a valid endpoint.
         Future<?> batchlogReplay = BatchlogManager.instance.startBatchlogReplay();
-        Future<StreamState> streamSuccess = streamRanges(rangesToStream);
+        Future<StreamState> streamSuccess = startStreaming.get();
 
         // Wait for batch log to complete before streaming hints.
         logger.debug("waiting for batch log processing.");
@@ -4815,7 +5163,7 @@
             throw new UnsupportedOperationException("This node has more than one token and cannot be moved thusly.");
         }
 
-        List<String> keyspacesToProcess = Schema.instance.getNonLocalStrategyKeyspaces();
+        List<String> keyspacesToProcess = ImmutableList.copyOf(Schema.instance.getNonLocalStrategyKeyspaces().names());
 
         PendingRangeCalculatorService.instance.blockUntilFinished();
         // checking if data is moving to this node
@@ -4830,12 +5178,13 @@
         Gossiper.instance.addLocalApplicationState(ApplicationState.STATUS, valueFactory.moving(newToken));
         setMode(Mode.MOVING, String.format("Moving %s from %s to %s.", localAddress, getLocalTokens().iterator().next(), newToken), true);
 
-        setMode(Mode.MOVING, String.format("Sleeping %s ms before start streaming/fetching ranges", RING_DELAY), true);
-        Uninterruptibles.sleepUninterruptibly(RING_DELAY, MILLISECONDS);
+        setMode(Mode.MOVING, String.format("Sleeping %s ms before start streaming/fetching ranges", RING_DELAY_MILLIS), true);
+        Uninterruptibles.sleepUninterruptibly(RING_DELAY_MILLIS, MILLISECONDS);
 
         RangeRelocator relocator = new RangeRelocator(Collections.singleton(newToken), keyspacesToProcess, tokenMetadata);
         relocator.calculateToFromStreams();
 
+        repairPaxosForTopologyChange("move");
         if (relocator.streamsNeeded())
         {
             setMode(Mode.MOVING, "fetching new ranges and streaming old ranges", true);
@@ -4843,7 +5192,11 @@
             {
                 relocator.stream().get();
             }
-            catch (ExecutionException | InterruptedException e)
+            catch (InterruptedException e)
+            {
+                throw new UncheckedInterruptedException(e);
+            }
+            catch (ExecutionException e)
             {
                 throw new RuntimeException("Interrupted while waiting for stream/fetch ranges to finish: " + e.getMessage());
             }
@@ -4957,7 +5310,7 @@
         Collection<Token> tokens = tokenMetadata.getTokens(endpoint);
 
         // Find the endpoints that are going to become responsible for data
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             // if the replication factor is 1 the data is lost so we shouldn't wait for confirmation
             if (Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor().allReplicas == 1)
@@ -5052,6 +5405,11 @@
         return operationMode == Mode.NORMAL;
     }
 
+    public boolean isDecommissioned()
+    {
+        return operationMode == Mode.DECOMMISSIONED;
+    }
+
     public String getDrainProgress()
     {
         return String.format("Drained %s/%s ColumnFamilies", remainingCFs, totalCFs);
@@ -5095,6 +5453,7 @@
                 logger.error("Batchlog manager timed out shutting down", t);
             }
 
+            snapshotManager.stop();
             HintsService.instance.pauseDispatch();
 
             if (daemon != null)
@@ -5143,7 +5502,7 @@
             for (Keyspace keyspace : Keyspace.nonSystem())
             {
                 for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores())
-                    flushes.add(cfs.forceFlush());
+                    flushes.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.DRAIN));
             }
             // wait for the flushes.
             // TODO this is a godawful way to track progress, since they flush in parallel.  a long one could
@@ -5175,10 +5534,11 @@
             for (Keyspace keyspace : Keyspace.system())
             {
                 for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores())
-                    flushes.add(cfs.forceFlush());
+                    flushes.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.DRAIN));
             }
             FBUtilities.waitOnFutures(flushes);
 
+            SnapshotManager.shutdownAndWait(1L, MINUTES);
             HintsService.instance.shutdownBlocking();
 
             // Interrupt ongoing compactions and shutdown CM to prevent further compactions.
@@ -5191,12 +5551,21 @@
             CommitLog.instance.shutdownBlocking();
 
             // wait for miscellaneous tasks like sstable and commitlog segment deletion
-            ScheduledExecutors.nonPeriodicTasks.shutdown();
-            if (!ScheduledExecutors.nonPeriodicTasks.awaitTermination(1, MINUTES))
-                logger.warn("Unable to terminate non-periodic tasks within 1 minute.");
-
             ColumnFamilyStore.shutdownPostFlushExecutor();
-            setMode(Mode.DRAINED, !isFinalShutdown);
+
+            try
+            {
+                // we are not shutting down ScheduledExecutors#scheduledFastTasks to be still able to progress time
+                // fast-tasks executor is shut down in StorageService's shutdown hook added to Runtime
+                ExecutorUtils.shutdownNowAndWait(1, MINUTES,
+                                                 ScheduledExecutors.nonPeriodicTasks,
+                                                 ScheduledExecutors.scheduledTasks,
+                                                 ScheduledExecutors.optionalTasks);
+            }
+            finally
+            {
+                setMode(Mode.DRAINED, !isFinalShutdown);
+            }
         }
         catch (Throwable t)
         {
@@ -5324,10 +5693,10 @@
         {
             InetAddressAndPort endpoint = tokenMetadata.getEndpoint(entry.getKey());
             Float tokenOwnership = entry.getValue();
-            if (nodeMap.containsKey(endpoint.address))
-                nodeMap.put(endpoint.address, nodeMap.get(endpoint.address) + tokenOwnership);
+            if (nodeMap.containsKey(endpoint.getAddress()))
+                nodeMap.put(endpoint.getAddress(), nodeMap.get(endpoint.getAddress()) + tokenOwnership);
             else
-                nodeMap.put(endpoint.address, tokenOwnership);
+                nodeMap.put(endpoint.getAddress(), tokenOwnership);
         }
         return nodeMap;
     }
@@ -5374,11 +5743,11 @@
         }
         else
         {
-            List<String> userKeyspaces = Schema.instance.getUserKeyspaces();
+            Collection<String> userKeyspaces = Schema.instance.getUserKeyspaces().names();
 
             if (userKeyspaces.size() > 0)
             {
-                keyspace = userKeyspaces.get(0);
+                keyspace = userKeyspaces.iterator().next();
                 AbstractReplicationStrategy replicationStrategy = Schema.instance.getKeyspaceInstance(keyspace).getReplicationStrategy();
                 for (String keyspaceName : userKeyspaces)
                 {
@@ -5431,7 +5800,7 @@
     {
         LinkedHashMap<InetAddressAndPort, Float> result = getEffectiveOwnership(keyspace);
         LinkedHashMap<InetAddress, Float> asInets = new LinkedHashMap<>();
-        result.entrySet().stream().forEachOrdered(entry -> asInets.put(entry.getKey().address, entry.getValue()));
+        result.entrySet().stream().forEachOrdered(entry -> asInets.put(entry.getKey().getAddress(), entry.getValue()));
         return asInets;
     }
 
@@ -5445,19 +5814,17 @@
 
     public List<String> getKeyspaces()
     {
-        List<String> keyspaceNamesList = new ArrayList<>(Schema.instance.getKeyspaces());
-        return Collections.unmodifiableList(keyspaceNamesList);
+        return Lists.newArrayList(Schema.instance.distributedAndLocalKeyspaces().names());
     }
 
     public List<String> getNonSystemKeyspaces()
     {
-        List<String> nonKeyspaceNamesList = new ArrayList<>(Schema.instance.getNonSystemKeyspaces());
-        return Collections.unmodifiableList(nonKeyspaceNamesList);
+        return Lists.newArrayList(Schema.instance.distributedKeyspaces().names());
     }
 
     public List<String> getNonLocalStrategyKeyspaces()
     {
-        return Collections.unmodifiableList(Schema.instance.getNonLocalStrategyKeyspaces());
+        return Lists.newArrayList(Schema.instance.getNonLocalStrategyKeyspaces().names());
     }
 
     public Map<String, String> getViewBuildStatuses(String keyspace, String view, boolean withPort)
@@ -5776,9 +6143,9 @@
         ColumnFamilyStore.rebuildSecondaryIndex(ksName, cfName, indices);
     }
 
-    public void resetLocalSchema()
+    public void resetLocalSchema() throws IOException
     {
-        MigrationManager.resetLocalSchema();
+        Schema.instance.resetLocalSchema();
     }
 
     public void reloadLocalSchema()
@@ -5839,14 +6206,16 @@
         return DatabaseDescriptor.getPartitionerName();
     }
 
+    /** Negative number for disabled */
     public void setSSTablePreemptiveOpenIntervalInMB(int intervalInMB)
     {
-        DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMB(intervalInMB);
+        DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMiB(intervalInMB);
     }
 
+    /** This method can return negative number for disabled */
     public int getSSTablePreemptiveOpenIntervalInMB()
     {
-        return DatabaseDescriptor.getSSTablePreemptiveOpenIntervalInMB();
+        return DatabaseDescriptor.getSSTablePreemptiveOpenIntervalInMiB();
     }
 
     public boolean getMigrateKeycacheOnCompaction()
@@ -5903,37 +6272,49 @@
         logger.info("updated replica_filtering_protection.cached_rows_fail_threshold to {}", threshold);
     }
 
+    public int getColumnIndexSizeInKiB()
+    {
+        return DatabaseDescriptor.getColumnIndexSizeInKiB();
+    }
+
+    public void setColumnIndexSize(int columnIndexSizeInKB)
+    {
+        int oldValueInKiB = DatabaseDescriptor.getColumnIndexSizeInKiB();
+        DatabaseDescriptor.setColumnIndexSize(columnIndexSizeInKB);
+        logger.info("Updated column_index_size to {} KiB (was {} KiB)", columnIndexSizeInKB, oldValueInKiB);
+    }
+
     public int getColumnIndexCacheSize()
     {
-        return DatabaseDescriptor.getColumnIndexCacheSizeInKB();
+        return DatabaseDescriptor.getColumnIndexCacheSizeInKiB();
     }
 
     public void setColumnIndexCacheSize(int cacheSizeInKB)
     {
         DatabaseDescriptor.setColumnIndexCacheSize(cacheSizeInKB);
-        logger.info("Updated column_index_cache_size_in_kb to {}", cacheSizeInKB);
+        logger.info("Updated column_index_cache_size to {}", cacheSizeInKB);
     }
 
     public int getBatchSizeFailureThreshold()
     {
-        return DatabaseDescriptor.getBatchSizeFailThresholdInKB();
+        return DatabaseDescriptor.getBatchSizeFailThresholdInKiB();
     }
 
     public void setBatchSizeFailureThreshold(int threshold)
     {
-        DatabaseDescriptor.setBatchSizeFailThresholdInKB(threshold);
-        logger.info("updated batch_size_fail_threshold_in_kb to {}", threshold);
+        DatabaseDescriptor.setBatchSizeFailThresholdInKiB(threshold);
+        logger.info("updated batch_size_fail_threshold to {}", threshold);
     }
 
     public int getBatchSizeWarnThreshold()
     {
-        return DatabaseDescriptor.getBatchSizeWarnThresholdInKB();
+        return DatabaseDescriptor.getBatchSizeWarnThresholdInKiB();
     }
 
     public void setBatchSizeWarnThreshold(int threshold)
     {
-        DatabaseDescriptor.setBatchSizeWarnThresholdInKB(threshold);
-        logger.info("Updated batch_size_warn_threshold_in_kb to {}", threshold);
+        DatabaseDescriptor.setBatchSizeWarnThresholdInKiB(threshold);
+        logger.info("Updated batch_size_warn_threshold to {}", threshold);
     }
 
     public int getInitialRangeTombstoneListAllocationSize()
@@ -5973,8 +6354,8 @@
 
     public void setHintedHandoffThrottleInKB(int throttleInKB)
     {
-        DatabaseDescriptor.setHintedHandoffThrottleInKB(throttleInKB);
-        logger.info("updated hinted_handoff_throttle_in_kb to {}", throttleInKB);
+        DatabaseDescriptor.setHintedHandoffThrottleInKiB(throttleInKB);
+        logger.info("updated hinted_handoff_throttle to {} KiB", throttleInKB);
     }
 
     @Override
@@ -5989,38 +6370,57 @@
         logger.info("Auditlog is disabled");
     }
 
+    @Deprecated
     public void enableAuditLog(String loggerName, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
                                String includedUsers, String excludedUsers) throws ConfigurationException, IllegalStateException
     {
-        enableAuditLog(loggerName, Collections.emptyMap(), includedKeyspaces, excludedKeyspaces, includedCategories, excludedCategories, includedUsers, excludedUsers);
+        enableAuditLog(loggerName, Collections.emptyMap(), includedKeyspaces, excludedKeyspaces, includedCategories, excludedCategories, includedUsers, excludedUsers,
+                       Integer.MIN_VALUE, null, null, Long.MIN_VALUE, Integer.MIN_VALUE, null);
     }
 
+    public void enableAuditLog(String loggerName, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
+                               String includedUsers, String excludedUsers, Integer maxArchiveRetries, Boolean block, String rollCycle,
+                               Long maxLogSize, Integer maxQueueWeight, String archiveCommand) throws IllegalStateException
+    {
+        enableAuditLog(loggerName, Collections.emptyMap(), includedKeyspaces, excludedKeyspaces, includedCategories, excludedCategories, includedUsers, excludedUsers,
+                       maxArchiveRetries, block, rollCycle, maxLogSize, maxQueueWeight, archiveCommand);
+    }
+
+    @Deprecated
     public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
                                String includedUsers, String excludedUsers) throws ConfigurationException, IllegalStateException
     {
-        loggerName = loggerName != null ? loggerName : DatabaseDescriptor.getAuditLoggingOptions().logger.class_name;
+        enableAuditLog(loggerName, parameters, includedKeyspaces, excludedKeyspaces, includedCategories, excludedCategories, includedUsers, excludedUsers,
+                       Integer.MIN_VALUE, null, null, Long.MIN_VALUE, Integer.MIN_VALUE, null);
+    }
 
-        Preconditions.checkNotNull(loggerName, "cassandra.yaml did not have logger in audit_logging_option and not set as parameter");
-        Preconditions.checkState(FBUtilities.isAuditLoggerClassExists(loggerName), "Unable to find AuditLogger class: "+loggerName);
+    public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
+                               String includedUsers, String excludedUsers, Integer maxArchiveRetries, Boolean block, String rollCycle,
+                               Long maxLogSize, Integer maxQueueWeight, String archiveCommand) throws IllegalStateException
+    {
+        AuditLogOptions auditOptions = DatabaseDescriptor.getAuditLoggingOptions();
+        if (archiveCommand != null && !auditOptions.allow_nodetool_archive_command)
+            throw new ConfigurationException("Can't enable audit log archiving via nodetool unless audit_logging_options.allow_nodetool_archive_command is set to true");
 
-        AuditLogOptions auditLogOptions = new AuditLogOptions();
-        auditLogOptions.enabled = true;
-        auditLogOptions.logger = new ParameterizedClass(loggerName, parameters);
-        auditLogOptions.included_keyspaces = includedKeyspaces != null ? includedKeyspaces : DatabaseDescriptor.getAuditLoggingOptions().included_keyspaces;
-        auditLogOptions.excluded_keyspaces = excludedKeyspaces != null ? excludedKeyspaces : DatabaseDescriptor.getAuditLoggingOptions().excluded_keyspaces;
-        auditLogOptions.included_categories = includedCategories != null ? includedCategories : DatabaseDescriptor.getAuditLoggingOptions().included_categories;
-        auditLogOptions.excluded_categories = excludedCategories != null ? excludedCategories : DatabaseDescriptor.getAuditLoggingOptions().excluded_categories;
-        auditLogOptions.included_users = includedUsers != null ? includedUsers : DatabaseDescriptor.getAuditLoggingOptions().included_users;
-        auditLogOptions.excluded_users = excludedUsers != null ? excludedUsers : DatabaseDescriptor.getAuditLoggingOptions().excluded_users;
+        final AuditLogOptions options = new AuditLogOptions.Builder(auditOptions)
+                                        .withEnabled(true)
+                                        .withLogger(loggerName, parameters)
+                                        .withIncludedKeyspaces(includedKeyspaces)
+                                        .withExcludedKeyspaces(excludedKeyspaces)
+                                        .withIncludedCategories(includedCategories)
+                                        .withExcludedCategories(excludedCategories)
+                                        .withIncludedUsers(includedUsers)
+                                        .withExcludedUsers(excludedUsers)
+                                        .withMaxArchiveRetries(maxArchiveRetries)
+                                        .withBlock(block)
+                                        .withRollCycle(rollCycle)
+                                        .withMaxLogSize(maxLogSize)
+                                        .withMaxQueueWeight(maxQueueWeight)
+                                        .withArchiveCommand(archiveCommand)
+                                        .build();
 
-        AuditLogManager.instance.enable(auditLogOptions);
-
-        logger.info("AuditLog is enabled with logger: [{}], included_keyspaces: [{}], excluded_keyspaces: [{}], " +
-                    "included_categories: [{}], excluded_categories: [{}], included_users: [{}], "
-                    + "excluded_users: [{}], archive_command: [{}]", auditLogOptions.logger, auditLogOptions.included_keyspaces, auditLogOptions.excluded_keyspaces,
-                    auditLogOptions.included_categories, auditLogOptions.excluded_categories, auditLogOptions.included_users, auditLogOptions.excluded_users,
-                    auditLogOptions.archive_command);
-
+        AuditLogManager.instance.enable(options);
+        logger.info("AuditLog is enabled with configuration: {}", options);
     }
 
     public boolean isAuditLogEnabled()
@@ -6063,6 +6463,30 @@
         ClientResourceLimits.setEndpointLimit(newLimit);
     }
 
+    @Override
+    public int getNativeTransportMaxRequestsPerSecond()
+    {
+        return ClientResourceLimits.getNativeTransportMaxRequestsPerSecond();
+    }
+
+    @Override
+    public void setNativeTransportMaxRequestsPerSecond(int newPerSecond)
+    {
+        ClientResourceLimits.setNativeTransportMaxRequestsPerSecond(newPerSecond);
+    }
+
+    @Override
+    public void setNativeTransportRateLimitingEnabled(boolean enabled)
+    {
+        DatabaseDescriptor.setNativeTransportRateLimitingEnabled(enabled);
+    }
+
+    @Override
+    public boolean getNativeTransportRateLimitingEnabled()
+    {
+        return DatabaseDescriptor.getNativeTransportRateLimitingEnabled();
+    }
+
     @VisibleForTesting
     public void shutdownServer()
     {
@@ -6087,7 +6511,7 @@
         maxArchiveRetries = maxArchiveRetries != Integer.MIN_VALUE ? maxArchiveRetries : fqlOptions.max_archive_retries;
 
         Preconditions.checkNotNull(path, "cassandra.yaml did not set log_dir and not set as parameter");
-        FullQueryLogger.instance.enableWithoutClean(Paths.get(path), rollCycle, blocking, maxQueueWeight, maxLogSize, archiveCommand, maxArchiveRetries);
+        FullQueryLogger.instance.enableWithoutClean(File.getPath(path), rollCycle, blocking, maxQueueWeight, maxLogSize, archiveCommand, maxArchiveRetries);
     }
 
     @Override
@@ -6117,17 +6541,17 @@
     @Override
     public Map<String, Set<InetAddress>> getOutstandingSchemaVersions()
     {
-        Map<UUID, Set<InetAddressAndPort>> outstanding = MigrationCoordinator.instance.outstandingVersions();
+        Map<UUID, Set<InetAddressAndPort>> outstanding = Schema.instance.getOutstandingSchemaVersions();
         return outstanding.entrySet().stream().collect(Collectors.toMap(e -> e.getKey().toString(),
-                                                                        e -> e.getValue().stream().map(i -> i.address).collect(Collectors.toSet())));
+                                                                        e -> e.getValue().stream().map(InetSocketAddress::getAddress).collect(Collectors.toSet())));
     }
 
     @Override
     public Map<String, Set<String>> getOutstandingSchemaVersionsWithPort()
     {
-        Map<UUID, Set<InetAddressAndPort>> outstanding = MigrationCoordinator.instance.outstandingVersions();
+        Map<UUID, Set<InetAddressAndPort>> outstanding = Schema.instance.getOutstandingSchemaVersions();
         return outstanding.entrySet().stream().collect(Collectors.toMap(e -> e.getKey().toString(),
-                                                                        e -> e.getValue().stream().map(InetAddressAndPort::toString).collect(Collectors.toSet())));
+                                                                        e -> e.getValue().stream().map(Object::toString).collect(Collectors.toSet())));
     }
 
     public boolean autoOptimiseIncRepairStreams()
@@ -6160,11 +6584,13 @@
         DatabaseDescriptor.setAutoOptimisePreviewRepairStreams(enabled);
     }
 
+    @Deprecated
     public int getTableCountWarnThreshold()
     {
         return DatabaseDescriptor.tableCountWarnThreshold();
     }
 
+    @Deprecated
     public void setTableCountWarnThreshold(int value)
     {
         if (value < 0)
@@ -6173,11 +6599,13 @@
         DatabaseDescriptor.setTableCountWarnThreshold(value);
     }
 
+    @Deprecated
     public int getKeyspaceCountWarnThreshold()
     {
         return DatabaseDescriptor.keyspaceCountWarnThreshold();
     }
 
+    @Deprecated
     public void setKeyspaceCountWarnThreshold(int value)
     {
         if (value < 0)
@@ -6186,6 +6614,258 @@
         DatabaseDescriptor.setKeyspaceCountWarnThreshold(value);
     }
 
+    public void setCompactionTombstoneWarningThreshold(int count)
+    {
+        if (count < 0)
+            throw new IllegalStateException("compaction tombstone warning threshold needs to be >= 0, not "+count);
+        logger.info("Setting compaction_tombstone_warning_threshold to {}", count);
+        DatabaseDescriptor.setCompactionTombstoneWarningThreshold(count);
+    }
+
+    public int getCompactionTombstoneWarningThreshold()
+    {
+        return DatabaseDescriptor.getCompactionTombstoneWarningThreshold();
+    }
+
+    public void addSnapshot(TableSnapshot snapshot) {
+        snapshotManager.addSnapshot(snapshot);
+    }
+
+    @Override
+    public boolean getReadThresholdsEnabled()
+    {
+        return DatabaseDescriptor.getReadThresholdsEnabled();
+    }
+
+    @Override
+    public void setReadThresholdsEnabled(boolean value)
+    {
+        DatabaseDescriptor.setReadThresholdsEnabled(value);
+    }
+
+    @Override
+    public String getCoordinatorLargeReadWarnThreshold()
+    {
+        return toString(DatabaseDescriptor.getCoordinatorReadSizeWarnThreshold());
+    }
+
+    @Override
+    public void setCoordinatorLargeReadWarnThreshold(String threshold)
+    {
+        DatabaseDescriptor.setCoordinatorReadSizeWarnThreshold(parseDataStorageSpec(threshold));
+    }
+
+    @Override
+    public String getCoordinatorLargeReadAbortThreshold()
+    {
+        return toString(DatabaseDescriptor.getCoordinatorReadSizeFailThreshold());
+    }
+
+    @Override
+    public void setCoordinatorLargeReadAbortThreshold(String threshold)
+    {
+        DatabaseDescriptor.setCoordinatorReadSizeFailThreshold(parseDataStorageSpec(threshold));
+    }
+
+    @Override
+    public String getLocalReadTooLargeWarnThreshold()
+    {
+        return toString(DatabaseDescriptor.getLocalReadSizeWarnThreshold());
+    }
+
+    @Override
+    public void setLocalReadTooLargeWarnThreshold(String threshold)
+    {
+        DatabaseDescriptor.setLocalReadSizeWarnThreshold(parseDataStorageSpec(threshold));
+    }
+
+    @Override
+    public String getLocalReadTooLargeAbortThreshold()
+    {
+        return toString(DatabaseDescriptor.getLocalReadSizeFailThreshold());
+    }
+
+    @Override
+    public void setLocalReadTooLargeAbortThreshold(String threshold)
+    {
+        DatabaseDescriptor.setLocalReadSizeFailThreshold(parseDataStorageSpec(threshold));
+    }
+
+    @Override
+    public String getRowIndexReadSizeWarnThreshold()
+    {
+        return toString(DatabaseDescriptor.getRowIndexReadSizeWarnThreshold());
+    }
+
+    @Override
+    public void setRowIndexReadSizeWarnThreshold(String threshold)
+    {
+        DatabaseDescriptor.setRowIndexReadSizeWarnThreshold(parseDataStorageSpec(threshold));
+    }
+
+    @Override
+    public String getRowIndexReadSizeAbortThreshold()
+    {
+        return toString(DatabaseDescriptor.getRowIndexReadSizeFailThreshold());
+    }
+
+    @Override
+    public void setRowIndexReadSizeAbortThreshold(String threshold)
+    {
+        DatabaseDescriptor.setRowIndexReadSizeFailThreshold(parseDataStorageSpec(threshold));
+    }
+
+    private static String toString(DataStorageSpec value)
+    {
+        return value == null ? null : value.toString();
+    }
+
+    public void setDefaultKeyspaceReplicationFactor(int value)
+    {
+        DatabaseDescriptor.setDefaultKeyspaceRF(value);
+        logger.info("set default keyspace rf to {}", value);
+    }
+
+    private static DataStorageSpec.LongBytesBound parseDataStorageSpec(String threshold)
+    {
+        return threshold == null
+               ? null
+               : new DataStorageSpec.LongBytesBound(threshold);
+    }
+
+    public int getDefaultKeyspaceReplicationFactor()
+    {
+        return DatabaseDescriptor.getDefaultKeyspaceRF();
+    }
+
+    public boolean getSkipPaxosRepairOnTopologyChange()
+    {
+        return DatabaseDescriptor.skipPaxosRepairOnTopologyChange();
+    }
+
+    public void setSkipPaxosRepairOnTopologyChange(boolean v)
+    {
+        DatabaseDescriptor.setSkipPaxosRepairOnTopologyChange(v);
+        logger.info("paxos skip topology change repair {} via jmx", v ? "enabled" : "disabled");
+    }
+
+    public String getSkipPaxosRepairOnTopologyChangeKeyspaces()
+    {
+        return Joiner.on(',').join(DatabaseDescriptor.skipPaxosRepairOnTopologyChangeKeyspaces());
+    }
+
+    public void setSkipPaxosRepairOnTopologyChangeKeyspaces(String v)
+    {
+        DatabaseDescriptor.setSkipPaxosRepairOnTopologyChangeKeyspaces(v);
+        logger.info("paxos skip topology change repair keyspaces set to  {} via jmx", v);
+    }
+
+    public boolean getPaxosAutoRepairsEnabled()
+    {
+        return PaxosState.uncommittedTracker().isAutoRepairsEnabled();
+    }
+
+    public void setPaxosAutoRepairsEnabled(boolean enabled)
+    {
+        PaxosState.uncommittedTracker().setAutoRepairsEnabled(enabled);
+        logger.info("paxos auto repairs {} via jmx", enabled ? "enabled" : "disabled");
+    }
+
+    public boolean getPaxosStateFlushEnabled()
+    {
+        return PaxosState.uncommittedTracker().isStateFlushEnabled();
+    }
+
+    public void setPaxosStateFlushEnabled(boolean enabled)
+    {
+        PaxosState.uncommittedTracker().setStateFlushEnabled(enabled);
+        logger.info("paxos state flush {} via jmx", enabled ? "enabled" : "disabled");
+    }
+
+    public List<String> getPaxosAutoRepairTables()
+    {
+        Set<TableId> tableIds = PaxosState.uncommittedTracker().tableIds();
+        List<String> tables = new ArrayList<>(tableIds.size());
+        for (TableId tableId : tableIds)
+        {
+            TableMetadata table = Schema.instance.getTableMetadata(tableId);
+            if (table == null)
+                continue;
+            tables.add(table.keyspace + '.' + table.name);
+        }
+        return tables;
+    }
+
+    public long getPaxosPurgeGraceSeconds()
+    {
+        return DatabaseDescriptor.getPaxosPurgeGrace(SECONDS);
+    }
+
+    public void setPaxosPurgeGraceSeconds(long v)
+    {
+        DatabaseDescriptor.setPaxosPurgeGrace(v);
+        logger.info("paxos purging grace seconds set to {} via jmx", v);
+    }
+
+    public String getPaxosOnLinearizabilityViolations()
+    {
+        return DatabaseDescriptor.paxosOnLinearizabilityViolations().toString();
+    }
+
+    public void setPaxosOnLinearizabilityViolations(String v)
+    {
+        DatabaseDescriptor.setPaxosOnLinearizabilityViolations(Config.PaxosOnLinearizabilityViolation.valueOf(v));
+        logger.info("paxos on linearizability violations {} via jmx", v);
+    }
+
+    public String getPaxosStatePurging()
+    {
+        return DatabaseDescriptor.paxosStatePurging().name();
+    }
+
+    public void setPaxosStatePurging(String v)
+    {
+        DatabaseDescriptor.setPaxosStatePurging(PaxosStatePurging.valueOf(v));
+        logger.info("paxos state purging {} via jmx", v);
+    }
+
+    public boolean getPaxosRepairEnabled()
+    {
+        return DatabaseDescriptor.paxosRepairEnabled();
+    }
+
+    public void setPaxosRepairEnabled(boolean enabled)
+    {
+        DatabaseDescriptor.setPaxosRepairEnabled(enabled);
+        logger.info("paxos repair {} via jmx", enabled ? "enabled" : "disabled");
+    }
+
+    public boolean getPaxosDcLocalCommitEnabled()
+    {
+        return PaxosCommit.getEnableDcLocalCommit();
+    }
+
+    public void setPaxosDcLocalCommitEnabled(boolean enabled)
+    {
+        PaxosCommit.setEnableDcLocalCommit(enabled);
+        logger.info("paxos dc local commit {} via jmx", enabled ? "enabled" : "disabled");
+    }
+
+    public String getPaxosBallotLowBound(String ksName, String tblName, String key)
+    {
+        Keyspace keyspace = Keyspace.open(ksName);
+        if (keyspace == null)
+            throw new IllegalArgumentException("Unknown keyspace '" + ksName + "'");
+
+        ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(tblName);
+        if (cfs == null)
+            throw new IllegalArgumentException("Unknown table '" + tblName + "' in keyspace '" + ksName + "'");
+
+        TableMetadata table = cfs.metadata.get();
+        DecoratedKey dk = table.partitioner.decorateKey(table.partitionKeyType.fromString(key));
+        return cfs.getPaxosRepairHistory().ballotForToken(dk.getToken()).toString();
+    }
+
     public Long getRepairRpcTimeout()
     {
         return DatabaseDescriptor.getRepairRpcTimeout(MILLISECONDS);
@@ -6194,8 +6874,83 @@
     public void setRepairRpcTimeout(Long timeoutInMillis)
     {
         Preconditions.checkState(timeoutInMillis > 0);
-        DatabaseDescriptor.setRepairRpcTimeout(timeoutInMillis, MILLISECONDS);
+        DatabaseDescriptor.setRepairRpcTimeout(timeoutInMillis);
         logger.info("RepairRpcTimeout set to {}ms via JMX", timeoutInMillis);
     }
+    public void evictHungRepairs()
+    {
+        logger.info("StorageService#clearPaxosRateLimiters called via jmx");
+        Paxos.evictHungRepairs();
+    }
 
+    public void clearPaxosRepairs()
+    {
+        logger.info("StorageService#clearPaxosRepairs called via jmx");
+        PaxosTableRepairs.clearRepairs();
+    }
+
+    public void setSkipPaxosRepairCompatibilityCheck(boolean v)
+    {
+        PaxosRepair.setSkipPaxosRepairCompatibilityCheck(v);
+        logger.info("SkipPaxosRepairCompatibilityCheck set to {} via jmx", v);
+    }
+
+    public boolean getSkipPaxosRepairCompatibilityCheck()
+    {
+        return PaxosRepair.getSkipPaxosRepairCompatibilityCheck();
+    }
+
+    @Override
+    public boolean topPartitionsEnabled()
+    {
+        return DatabaseDescriptor.topPartitionsEnabled();
+    }
+
+    @Override
+    public int getMaxTopSizePartitionCount()
+    {
+        return DatabaseDescriptor.getMaxTopSizePartitionCount();
+    }
+
+    @Override
+    public void setMaxTopSizePartitionCount(int value)
+    {
+        DatabaseDescriptor.setMaxTopSizePartitionCount(value);
+    }
+
+    @Override
+    public int getMaxTopTombstonePartitionCount()
+    {
+        return DatabaseDescriptor.getMaxTopTombstonePartitionCount();
+    }
+
+    @Override
+    public void setMaxTopTombstonePartitionCount(int value)
+    {
+        DatabaseDescriptor.setMaxTopTombstonePartitionCount(value);
+    }
+
+    @Override
+    public String getMinTrackedPartitionSize()
+    {
+        return DatabaseDescriptor.getMinTrackedPartitionSizeInBytes().toString();
+    }
+
+    @Override
+    public void setMinTrackedPartitionSize(String value)
+    {
+        DatabaseDescriptor.setMinTrackedPartitionSizeInBytes(parseDataStorageSpec(value));
+    }
+
+    @Override
+    public long getMinTrackedPartitionTombstoneCount()
+    {
+        return DatabaseDescriptor.getMinTrackedPartitionTombstoneCount();
+    }
+
+    @Override
+    public void setMinTrackedPartitionTombstoneCount(long value)
+    {
+        DatabaseDescriptor.setMinTrackedPartitionTombstoneCount(value);
+    }
 }
diff --git a/src/java/org/apache/cassandra/service/StorageServiceMBean.java b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
index c61e45e..ac2ff68 100644
--- a/src/java/org/apache/cassandra/service/StorageServiceMBean.java
+++ b/src/java/org/apache/cassandra/service/StorageServiceMBean.java
@@ -35,7 +35,7 @@
 
 import org.apache.cassandra.db.ColumnFamilyStoreMBean;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.utils.BreaksJMX;
 
 public interface StorageServiceMBean extends NotificationEmitter
 {
@@ -271,12 +271,21 @@
     public void clearSnapshot(String tag, String... keyspaceNames) throws IOException;
 
     /**
-     *  Get the details of all the snapshot
+     * Get the details of all the snapshot
      * @return A map of snapshotName to all its details in Tabular form.
      */
+    @Deprecated
     public Map<String, TabularData> getSnapshotDetails();
 
     /**
+     * Get the details of all the snapshots
+     *
+     * @param options map of options used for filtering of snapshots
+     * @return A map of snapshotName to all its details in Tabular form.
+     */
+    public Map<String, TabularData> getSnapshotDetails(Map<String, String> options);
+
+    /**
      * Get the true size taken by all snapshots across all keyspaces.
      * @return True size taken by all the snapshots.
      */
@@ -328,6 +337,11 @@
     public void forceKeyspaceCompactionForTokenRange(String keyspaceName, String startToken, String endToken, String... tableNames) throws IOException, ExecutionException, InterruptedException;
 
     /**
+     * Forces major compactions for the range represented by the partition key
+     */
+    public void forceKeyspaceCompactionForPartitionKey(String keyspaceName, String partitionKey, String... tableNames) throws IOException, ExecutionException, InterruptedException;
+
+    /**
      * Trigger a cleanup of keys on a single keyspace
      */
     @Deprecated
@@ -364,7 +378,14 @@
      */
     @Deprecated
     public int upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, String... tableNames) throws IOException, ExecutionException, InterruptedException;
-    public int upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException;
+    @Deprecated
+    default int upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
+    {
+        return upgradeSSTables(keyspaceName, excludeCurrentVersion, Long.MAX_VALUE, jobs, tableNames);
+    }
+
+    public int upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, long maxSSTableTimestamp, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException;
+    public int recompressSSTables(String keyspaceName, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException;
 
     /**
      * Rewrites all sstables from the given tables to remove deleted data.
@@ -527,12 +548,12 @@
     public void updateSnitch(String epSnitchClassName, Boolean dynamic, Integer dynamicUpdateInterval, Integer dynamicResetInterval, Double dynamicBadnessThreshold) throws ClassNotFoundException;
 
     /*
-      Update dynamic_snitch_update_interval_in_ms
+      Update dynamic_snitch_update_interval in ms
      */
     public void setDynamicUpdateInterval(int dynamicUpdateInterval);
 
     /*
-      Get dynamic_snitch_update_interval_in_ms
+      Get dynamic_snitch_update_interval in ms
      */
     public int getDynamicUpdateInterval();
 
@@ -562,7 +583,10 @@
     public void setNativeTransportMaxConcurrentRequestsInBytes(long newLimit);
     public long getNativeTransportMaxConcurrentRequestsInBytesPerIp();
     public void setNativeTransportMaxConcurrentRequestsInBytesPerIp(long newLimit);
-
+    public int getNativeTransportMaxRequestsPerSecond();
+    public void setNativeTransportMaxRequestsPerSecond(int newPerSecond);
+    public void setNativeTransportRateLimitingEnabled(boolean enabled);
+    public boolean getNativeTransportRateLimitingEnabled();
 
     // allows a node that have been started without joining the ring to join it
     public void joinRing() throws IOException;
@@ -606,12 +630,72 @@
     public void setTruncateRpcTimeout(long value);
     public long getTruncateRpcTimeout();
 
+    public void setStreamThroughputMbitPerSec(int value);
+    /**
+     * @return stream_throughput_outbound in megabits
+     * @deprecated Use getStreamThroughputMbitPerSecAsDouble instead as this one will provide a rounded value
+     */
+    @Deprecated
+    public int getStreamThroughputMbitPerSec();
+    public double getStreamThroughputMbitPerSecAsDouble();
+
+    @Deprecated
     public void setStreamThroughputMbPerSec(int value);
+
+    /**
+     * @return stream_throughput_outbound in MiB
+     * @deprecated Use getStreamThroughputMebibytesPerSecAsDouble instead as this one will provide a rounded value
+     */
+    @Deprecated
     public int getStreamThroughputMbPerSec();
+    public void setStreamThroughputMebibytesPerSec(int value);
+    /**
+     * Below method returns stream_throughput_outbound rounded, for precise number, please, use getStreamThroughputMebibytesPerSecAsDouble
+     * @return stream_throughput_outbound in MiB
+     */
+    public int getStreamThroughputMebibytesPerSec();
+    public double getStreamThroughputMebibytesPerSecAsDouble();
 
+    public void setInterDCStreamThroughputMbitPerSec(int value);
+
+    /**
+     * @return inter_dc_stream_throughput_outbound in megabits
+     * @deprecated Use getInterDCStreamThroughputMbitPerSecAsDouble instead as this one will provide a rounded value
+     */
+    @Deprecated
+    public int getInterDCStreamThroughputMbitPerSec();
+    public double getInterDCStreamThroughputMbitPerSecAsDouble();
+
+    @Deprecated
     public void setInterDCStreamThroughputMbPerSec(int value);
-    public int getInterDCStreamThroughputMbPerSec();
 
+    /**
+     * @return inter_dc_stream_throughput_outbound in MiB
+     * @deprecated Use getInterDCStreamThroughputMebibytesPerSecAsDouble instead as this one will provide a rounded value
+     */
+    @Deprecated
+    public int getInterDCStreamThroughputMbPerSec();
+    public void setInterDCStreamThroughputMebibytesPerSec(int value);
+    /**
+     * Below method returns Inter_dc_stream_throughput_outbound rounded, for precise number, please, use getInterDCStreamThroughputMebibytesPerSecAsDouble
+     * @return inter_dc_stream_throughput_outbound in MiB
+     */
+    public int getInterDCStreamThroughputMebibytesPerSec();
+    public double getInterDCStreamThroughputMebibytesPerSecAsDouble();
+
+    public void setEntireSSTableStreamThroughputMebibytesPerSec(int value);
+    public double getEntireSSTableStreamThroughputMebibytesPerSecAsDouble();
+
+    public void setEntireSSTableInterDCStreamThroughputMebibytesPerSec(int value);
+    public double getEntireSSTableInterDCStreamThroughputMebibytesPerSecAsDouble();
+
+    public double getCompactionThroughtputMibPerSecAsDouble();
+    public long getCompactionThroughtputBytesPerSec();
+    /**
+     * @return  compaction_throughgput in MiB
+     * @deprecated Use getCompactionThroughtputMibPerSecAsDouble instead as this one will provide a rounded value
+     */
+    @Deprecated
     public int getCompactionThroughputMbPerSec();
     public void setCompactionThroughputMbPerSec(int value);
 
@@ -749,6 +833,11 @@
     /** Sets the number of rows cached at the coordinator before filtering/index queries fail outright. */
     public void setCachedReplicaRowsFailThreshold(int threshold);
 
+    /** Returns the granularity of the collation index of rows within a partition **/
+    public int getColumnIndexSizeInKiB();
+    /** Sets the granularity of the collation index of rows within a partition **/
+    public void setColumnIndexSize(int columnIndexSizeInKB);
+
     /** Returns the threshold for skipping the column index when caching partition info **/
     public int getColumnIndexCacheSize();
     /** Sets the threshold for skipping the column index when caching partition info **/
@@ -764,7 +853,7 @@
     /** Sets the threshold for warning queries due to a large batch size */
     public void setBatchSizeWarnThreshold(int batchSizeDebugThreshold);
 
-    /** Sets the hinted handoff throttle in kb per second, per delivery thread. */
+    /** Sets the hinted handoff throttle in KiB per second, per delivery thread. */
     public void setHintedHandoffThrottleInKB(int throttleInKB);
 
     /**
@@ -796,8 +885,24 @@
     /** Clears the history of clients that have connected in the past **/
     void clearConnectionHistory();
     public void disableAuditLog();
-    public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories, String includedUsers, String excludedUsers) throws ConfigurationException;
-    public void enableAuditLog(String loggerName, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories, String includedUsers, String excludedUsers) throws ConfigurationException;
+    public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
+                               String includedUsers, String excludedUsers, Integer maxArchiveRetries, Boolean block, String rollCycle,
+                               Long maxLogSize, Integer maxQueueWeight, String archiveCommand) throws IllegalStateException;
+
+    @BreaksJMX("This API was exposed as throwing ConfigurationException, removing is binary compatible but not source; see https://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html")
+    @Deprecated
+    public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
+                               String includedUsers, String excludedUsers) throws ConfigurationException, IllegalStateException;
+
+    @BreaksJMX("This API was exposed as throwing ConfigurationException, removing is binary compatible but not source; see https://docs.oracle.com/javase/specs/jls/se7/html/jls-13.html")
+    @Deprecated
+    public void enableAuditLog(String loggerName, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
+                               String includedUsers, String excludedUsers) throws ConfigurationException, IllegalStateException;
+
+    public void enableAuditLog(String loggerName, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
+                               String includedUsers, String excludedUsers, Integer maxArchiveRetries, Boolean block, String rollCycle,
+                               Long maxLogSize, Integer maxQueueWeight, String archiveCommand) throws IllegalStateException;
+
     public boolean isAuditLogEnabled();
     public String getCorruptedTombstoneStrategy();
     public void setCorruptedTombstoneStrategy(String strategy);
@@ -858,11 +963,87 @@
     public boolean autoOptimisePreviewRepairStreams();
     public void setAutoOptimisePreviewRepairStreams(boolean enabled);
 
+    // warning thresholds will be replaced by equivalent guardrails
+    @Deprecated
     int getTableCountWarnThreshold();
+    @Deprecated
     void setTableCountWarnThreshold(int value);
+    @Deprecated
     int getKeyspaceCountWarnThreshold();
+    @Deprecated
     void setKeyspaceCountWarnThreshold(int value);
 
+    public void setCompactionTombstoneWarningThreshold(int count);
+    public int getCompactionTombstoneWarningThreshold();
+
+    public boolean getReadThresholdsEnabled();
+    public void setReadThresholdsEnabled(boolean value);
+
+    public String getCoordinatorLargeReadWarnThreshold();
+    public void setCoordinatorLargeReadWarnThreshold(String threshold);
+    public String getCoordinatorLargeReadAbortThreshold();
+    public void setCoordinatorLargeReadAbortThreshold(String threshold);
+
+    public String getLocalReadTooLargeWarnThreshold();
+    public void setLocalReadTooLargeWarnThreshold(String value);
+    public String getLocalReadTooLargeAbortThreshold();
+    public void setLocalReadTooLargeAbortThreshold(String value);
+
+    public String getRowIndexReadSizeWarnThreshold();
+    public void setRowIndexReadSizeWarnThreshold(String value);
+    public String getRowIndexReadSizeAbortThreshold();
+    public void setRowIndexReadSizeAbortThreshold(String value);
+
+    public void setDefaultKeyspaceReplicationFactor(int value);
+    public int getDefaultKeyspaceReplicationFactor();
+
+    boolean getSkipPaxosRepairOnTopologyChange();
+    void setSkipPaxosRepairOnTopologyChange(boolean v);
+
+    String getSkipPaxosRepairOnTopologyChangeKeyspaces();
+    void setSkipPaxosRepairOnTopologyChangeKeyspaces(String v);
+
+    boolean getPaxosAutoRepairsEnabled();
+    void setPaxosAutoRepairsEnabled(boolean enabled);
+
+    boolean getPaxosStateFlushEnabled();
+    void setPaxosStateFlushEnabled(boolean enabled);
+
+    List<String> getPaxosAutoRepairTables();
+
+    long getPaxosPurgeGraceSeconds();
+    void setPaxosPurgeGraceSeconds(long v);
+
+    String getPaxosOnLinearizabilityViolations();
+    void setPaxosOnLinearizabilityViolations(String v);
+
+    String getPaxosStatePurging();
+    void setPaxosStatePurging(String v);
+
+    boolean getPaxosRepairEnabled();
+    void setPaxosRepairEnabled(boolean v);
+
+    boolean getPaxosDcLocalCommitEnabled();
+    void setPaxosDcLocalCommitEnabled(boolean v);
+
+    String getPaxosBallotLowBound(String keyspace, String table, String key);
+
     public Long getRepairRpcTimeout();
     public void setRepairRpcTimeout(Long timeoutInMillis);
+
+    public void evictHungRepairs();
+    public void clearPaxosRepairs();
+    public void setSkipPaxosRepairCompatibilityCheck(boolean v);
+    public boolean getSkipPaxosRepairCompatibilityCheck();
+
+    String getToken(String keyspaceName, String table, String partitionKey);
+    public boolean topPartitionsEnabled();
+    public int getMaxTopSizePartitionCount();
+    public void setMaxTopSizePartitionCount(int value);
+    public int getMaxTopTombstonePartitionCount();
+    public void setMaxTopTombstonePartitionCount(int value);
+    public String getMinTrackedPartitionSize();
+    public void setMinTrackedPartitionSize(String value);
+    public long getMinTrackedPartitionTombstoneCount();
+    public void setMinTrackedPartitionTombstoneCount(long value);
 }
diff --git a/src/java/org/apache/cassandra/service/TruncateResponseHandler.java b/src/java/org/apache/cassandra/service/TruncateResponseHandler.java
index 60e8d0b..984ba5a 100644
--- a/src/java/org/apache/cassandra/service/TruncateResponseHandler.java
+++ b/src/java/org/apache/cassandra/service/TruncateResponseHandler.java
@@ -21,24 +21,28 @@
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.TruncateResponse;
 import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.exceptions.TruncateException;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Message;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.config.DatabaseDescriptor.getTruncateRpcTimeout;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
 public class TruncateResponseHandler implements RequestCallback<TruncateResponse>
 {
     protected static final Logger logger = LoggerFactory.getLogger(TruncateResponseHandler.class);
-    protected final SimpleCondition condition = new SimpleCondition();
+    protected final Condition condition = newOneTimeCondition();
     private final int responseCount;
     protected final AtomicInteger responses = new AtomicInteger(0);
     private final long start;
@@ -51,20 +55,20 @@
         assert 1 <= responseCount: "invalid response count " + responseCount;
 
         this.responseCount = responseCount;
-        start = System.nanoTime();
+        start = nanoTime();
     }
 
     public void get() throws TimeoutException
     {
-        long timeoutNanos = DatabaseDescriptor.getTruncateRpcTimeout(NANOSECONDS) - (System.nanoTime() - start);
+        long timeoutNanos = getTruncateRpcTimeout(NANOSECONDS) - (nanoTime() - start);
         boolean completedInTime;
         try
         {
             completedInTime = condition.await(timeoutNanos, NANOSECONDS); // TODO truncate needs a much longer timeout
         }
-        catch (InterruptedException ex)
+        catch (InterruptedException e)
         {
-            throw new AssertionError(ex);
+            throw new UncheckedInterruptedException(e);
         }
 
         if (!completedInTime)
@@ -90,7 +94,7 @@
     public void onFailure(InetAddressAndPort from, RequestFailureReason failureReason)
     {
         // If the truncation hasn't succeeded on some replica, abort and indicate this back to the client.
-        truncateFailingReplica = from.address;
+        truncateFailingReplica = from.getAddress();
         condition.signalAll();
     }
 
diff --git a/src/java/org/apache/cassandra/service/WriteResponseHandler.java b/src/java/org/apache/cassandra/service/WriteResponseHandler.java
index 94f5a80..6fe9e52 100644
--- a/src/java/org/apache/cassandra/service/WriteResponseHandler.java
+++ b/src/java/org/apache/cassandra/service/WriteResponseHandler.java
@@ -18,7 +18,9 @@
 package org.apache.cassandra.service;
 
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.function.Supplier;
 
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.locator.ReplicaPlan;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -37,18 +39,19 @@
     private static final AtomicIntegerFieldUpdater<WriteResponseHandler> responsesUpdater
             = AtomicIntegerFieldUpdater.newUpdater(WriteResponseHandler.class, "responses");
 
-    public WriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan,
+    public WriteResponseHandler(ReplicaPlan.ForWrite replicaPlan,
                                 Runnable callback,
                                 WriteType writeType,
+                                Supplier<Mutation> hintOnFailure,
                                 long queryStartNanoTime)
     {
-        super(replicaPlan, callback, writeType, queryStartNanoTime);
+        super(replicaPlan, callback, writeType, hintOnFailure, queryStartNanoTime);
         responses = blockFor();
     }
 
-    public WriteResponseHandler(ReplicaPlan.ForTokenWrite replicaPlan, WriteType writeType, long queryStartNanoTime)
+    public WriteResponseHandler(ReplicaPlan.ForWrite replicaPlan, WriteType writeType, Supplier<Mutation> hintOnFailure, long queryStartNanoTime)
     {
-        this(replicaPlan, null, writeType, queryStartNanoTime);
+        this(replicaPlan, null, writeType, hintOnFailure, queryStartNanoTime);
     }
 
     public void onResponse(Message<T> m)
diff --git a/src/java/org/apache/cassandra/service/disk/usage/DiskUsageBroadcaster.java b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageBroadcaster.java
new file mode 100644
index 0000000..4504ac7
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageBroadcaster.java
@@ -0,0 +1,181 @@
+/*
+ * 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.service.disk.usage;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.IEndpointStateChangeSubscriber;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.NoSpamLogger;
+
+/**
+ * Starts {@link DiskUsageMonitor} to monitor local disk usage state and broadcast new state via Gossip.
+ * At the same time, it caches cluster's disk usage state received via Gossip.
+ */
+public class DiskUsageBroadcaster implements IEndpointStateChangeSubscriber
+{
+    private static final Logger logger = LoggerFactory.getLogger(DiskUsageBroadcaster.class);
+    private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(logger, 10, TimeUnit.MINUTES);
+
+    public static final DiskUsageBroadcaster instance = new DiskUsageBroadcaster(DiskUsageMonitor.instance);
+
+    private final DiskUsageMonitor monitor;
+    private final ConcurrentMap<InetAddressAndPort, DiskUsageState> usageInfo = new ConcurrentHashMap<>();
+    private volatile boolean hasStuffedOrFullNode = false;
+
+    @VisibleForTesting
+    public DiskUsageBroadcaster(DiskUsageMonitor monitor)
+    {
+        this.monitor = monitor;
+        Gossiper.instance.register(this);
+    }
+
+    /**
+     * @return {@code true} if any node in the cluster is STUFFED OR FULL
+     */
+    public boolean hasStuffedOrFullNode()
+    {
+        return hasStuffedOrFullNode;
+    }
+
+    /**
+     * @return {@code true} if given node's disk usage is FULL
+     */
+    public boolean isFull(InetAddressAndPort endpoint)
+    {
+        return state(endpoint).isFull();
+    }
+
+    /**
+     * @return {@code true} if given node's disk usage is STUFFED
+     */
+    public boolean isStuffed(InetAddressAndPort endpoint)
+    {
+        return state(endpoint).isStuffed();
+    }
+
+    @VisibleForTesting
+    public DiskUsageState state(InetAddressAndPort endpoint)
+    {
+        return usageInfo.getOrDefault(endpoint, DiskUsageState.NOT_AVAILABLE);
+    }
+
+    public void startBroadcasting()
+    {
+        monitor.start(newState -> {
+
+            if (logger.isTraceEnabled())
+                logger.trace("Disseminating disk usage info: {}", newState);
+
+            Gossiper.instance.addLocalApplicationState(ApplicationState.DISK_USAGE,
+                                                       StorageService.instance.valueFactory.diskUsage(newState.name()));
+        });
+    }
+
+    @Override
+    public void onChange(InetAddressAndPort endpoint, ApplicationState state, VersionedValue value)
+    {
+        if (state != ApplicationState.DISK_USAGE)
+            return;
+
+        DiskUsageState usageState = DiskUsageState.NOT_AVAILABLE;
+        try
+        {
+            usageState = DiskUsageState.valueOf(value.value);
+        }
+        catch (IllegalArgumentException e)
+        {
+            noSpamLogger.warn(String.format("Found unknown DiskUsageState: %s. Using default state %s instead.",
+                                            value.value, usageState));
+        }
+        usageInfo.put(endpoint, usageState);
+
+        hasStuffedOrFullNode = usageState.isStuffedOrFull() || computeHasStuffedOrFullNode();
+    }
+
+    private boolean computeHasStuffedOrFullNode()
+    {
+        for (DiskUsageState replicaState : usageInfo.values())
+        {
+            if (replicaState.isStuffedOrFull())
+            {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    @Override
+    public void onJoin(InetAddressAndPort endpoint, EndpointState epState)
+    {
+        updateDiskUsage(endpoint, epState);
+    }
+
+    @Override
+    public void beforeChange(InetAddressAndPort endpoint, EndpointState currentState, ApplicationState newStateKey, VersionedValue newValue)
+    {
+        // nothing to do here
+    }
+
+    @Override
+    public void onAlive(InetAddressAndPort endpoint, EndpointState state)
+    {
+        updateDiskUsage(endpoint, state);
+    }
+
+    @Override
+    public void onDead(InetAddressAndPort endpoint, EndpointState state)
+    {
+        // do nothing, as we don't care about dead nodes
+    }
+
+    @Override
+    public void onRestart(InetAddressAndPort endpoint, EndpointState state)
+    {
+        updateDiskUsage(endpoint, state);
+    }
+
+    @Override
+    public void onRemove(InetAddressAndPort endpoint)
+    {
+        usageInfo.remove(endpoint);
+        hasStuffedOrFullNode = usageInfo.values().stream().anyMatch(DiskUsageState::isStuffedOrFull);
+    }
+
+    private void updateDiskUsage(InetAddressAndPort endpoint, EndpointState state)
+    {
+        VersionedValue localValue = state.getApplicationState(ApplicationState.DISK_USAGE);
+
+        if (localValue != null)
+        {
+            onChange(endpoint, ApplicationState.DISK_USAGE, localValue);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/disk/usage/DiskUsageMonitor.java b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageMonitor.java
new file mode 100644
index 0000000..fc0bb3a
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageMonitor.java
@@ -0,0 +1,246 @@
+/*
+ * 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.service.disk.usage;
+
+import java.io.IOException;
+import java.math.BigDecimal;
+import java.math.BigInteger;
+import java.math.RoundingMode;
+import java.nio.file.FileStore;
+import java.nio.file.Files;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.Multimap;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.guardrails.Guardrails;
+import org.apache.cassandra.db.guardrails.GuardrailsConfig;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.io.util.FileUtils;
+
+/**
+ * Schedule periodic task to monitor local disk usage and notify {@link DiskUsageBroadcaster} if local state changed.
+ */
+public class DiskUsageMonitor
+{
+    private static final Logger logger = LoggerFactory.getLogger(DiskUsageMonitor.class);
+
+    public static DiskUsageMonitor instance = new DiskUsageMonitor();
+
+    private final Supplier<GuardrailsConfig> guardrailsConfigSupplier = () -> Guardrails.CONFIG_PROVIDER.getOrCreate(null);
+    private final Supplier<Multimap<FileStore, Directories.DataDirectory>> dataDirectoriesSupplier;
+
+    private volatile DiskUsageState localState = DiskUsageState.NOT_AVAILABLE;
+
+    @VisibleForTesting
+    public DiskUsageMonitor()
+    {
+        this.dataDirectoriesSupplier = DiskUsageMonitor::dataDirectoriesGroupedByFileStore;
+    }
+
+    @VisibleForTesting
+    public DiskUsageMonitor(Supplier<Multimap<FileStore, Directories.DataDirectory>> dataDirectoriesSupplier)
+    {
+        this.dataDirectoriesSupplier = dataDirectoriesSupplier;
+    }
+
+    /**
+     * Start monitoring local disk usage and call notifier when local disk usage state changed.
+     */
+    public void start(Consumer<DiskUsageState> notifier)
+    {
+        // start the scheduler regardless guardrail is enabled, so we can enable it later without a restart
+        ScheduledExecutors.scheduledTasks.scheduleAtFixedRate(() -> {
+
+            if (!Guardrails.localDataDiskUsage.enabled(null))
+                return;
+
+            updateLocalState(getDiskUsage(), notifier);
+        }, 0, CassandraRelevantProperties.DISK_USAGE_MONITOR_INTERVAL_MS.getLong(), TimeUnit.MILLISECONDS);
+    }
+
+    @VisibleForTesting
+    public void updateLocalState(double usageRatio, Consumer<DiskUsageState> notifier)
+    {
+        double percentage = usageRatio * 100;
+        long percentageCeiling = (long) Math.ceil(percentage);
+
+        DiskUsageState state = getState(percentageCeiling);
+
+        Guardrails.localDataDiskUsage.guard(percentageCeiling, state.toString(), false, null);
+
+        // if state remains unchanged, no need to notify peers
+        if (state == localState)
+            return;
+
+        localState = state;
+        notifier.accept(state);
+    }
+
+    /**
+     * @return local node disk usage state
+     */
+    @VisibleForTesting
+    public DiskUsageState state()
+    {
+        return localState;
+    }
+
+    /**
+     * @return The current disk usage (including all memtable sizes) ratio. This is the ratio between the space taken by
+     * all the data directories and the addition of that same space and the free available space on disk. The space
+     * taken by the data directories is the addition of the actual space on disk plus the size of the memtables.
+     * Memtables are included in that calculation because they are expected to be eventually flushed to disk.
+     */
+    @VisibleForTesting
+    public double getDiskUsage()
+    {
+        // using BigInteger to handle large file system
+        BigInteger used = BigInteger.ZERO; // space used by data directories
+        BigInteger usable = BigInteger.ZERO; // free space on disks
+
+        for (Map.Entry<FileStore, Collection<Directories.DataDirectory>> e : dataDirectoriesSupplier.get().asMap().entrySet())
+        {
+            usable = usable.add(BigInteger.valueOf(usableSpace(e.getKey())));
+
+            for (Directories.DataDirectory dir : e.getValue())
+                used = used.add(BigInteger.valueOf(dir.getRawSize()));
+        }
+
+        // The total disk size for data directories is the space that is actually used by those directories plus the
+        // free space on disk that might be used for storing those directories in the future.
+        BigInteger total = used.add(usable);
+
+        // That total space can be limited by the config property data_disk_usage_max_disk_size.
+        DataStorageSpec.LongBytesBound diskUsageMaxSize = guardrailsConfigSupplier.get().getDataDiskUsageMaxDiskSize();
+        if (diskUsageMaxSize != null)
+            total = total.min(BigInteger.valueOf(diskUsageMaxSize.toBytes()));
+
+        // Add memtables size to the amount of used space because those memtables will be flushed to data directories.
+        used = used.add(BigInteger.valueOf(getAllMemtableSize()));
+
+        if (logger.isTraceEnabled())
+            logger.trace("Disk Usage Guardrail: current disk usage = {}, total disk usage = {}.",
+                         FileUtils.stringifyFileSize(used.doubleValue()),
+                         FileUtils.stringifyFileSize(total.doubleValue()));
+
+        return new BigDecimal(used).divide(new BigDecimal(total), 5, RoundingMode.UP).doubleValue();
+    }
+
+    @VisibleForTesting
+    public long getAllMemtableSize()
+    {
+        long size = 0;
+
+        for (ColumnFamilyStore cfs : ColumnFamilyStore.all())
+        {
+            for (Memtable memtable : cfs.getTracker().getView().getAllMemtables())
+            {
+                size += memtable.getLiveDataSize();
+            }
+        }
+
+        return size;
+    }
+
+    @VisibleForTesting
+    public DiskUsageState getState(long usagePercentage)
+    {
+        if (!Guardrails.localDataDiskUsage.enabled())
+            return DiskUsageState.NOT_AVAILABLE;
+
+        if (Guardrails.localDataDiskUsage.failsOn(usagePercentage, null))
+            return DiskUsageState.FULL;
+
+        if (Guardrails.localDataDiskUsage.warnsOn(usagePercentage, null))
+            return DiskUsageState.STUFFED;
+
+        return DiskUsageState.SPACIOUS;
+    }
+
+    private static Multimap<FileStore, Directories.DataDirectory> dataDirectoriesGroupedByFileStore()
+    {
+        Multimap<FileStore, Directories.DataDirectory> directories = HashMultimap.create();
+        try
+        {
+            for (Directories.DataDirectory dir : Directories.dataDirectories.getAllDirectories())
+            {
+                FileStore store = Files.getFileStore(dir.location.toPath());
+                directories.put(store, dir);
+            }
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException("Cannot get data directories grouped by file store", e);
+        }
+        return directories;
+    }
+
+    public static long totalDiskSpace()
+    {
+        BigInteger size = dataDirectoriesGroupedByFileStore().keys()
+                                                             .stream()
+                                                             .map(DiskUsageMonitor::totalSpace)
+                                                             .map(BigInteger::valueOf)
+                                                             .reduce(BigInteger.ZERO, BigInteger::add);
+
+        return size.compareTo(BigInteger.valueOf(Long.MAX_VALUE)) >= 0
+               ? Long.MAX_VALUE
+               : size.longValue();
+    }
+
+    public static long totalSpace(FileStore store)
+    {
+        try
+        {
+            long size = store.getTotalSpace();
+            return size < 0 ? Long.MAX_VALUE : size;
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException("Cannot get total space of file store", e);
+        }
+    }
+
+    public static long usableSpace(FileStore store)
+    {
+        try
+        {
+            long size = store.getUsableSpace();
+            return size < 0 ? Long.MAX_VALUE : size;
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException("Cannot get usable size of file store", e);
+        }
+    }
+}
+
diff --git a/src/java/org/apache/cassandra/service/disk/usage/DiskUsageState.java b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageState.java
new file mode 100644
index 0000000..9a46251
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/disk/usage/DiskUsageState.java
@@ -0,0 +1,70 @@
+/*
+ * 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.service.disk.usage;
+
+import org.apache.cassandra.db.guardrails.GuardrailsConfig;
+
+public enum DiskUsageState
+{
+    /** Either disk usage guardrail is not enabled or gossip state is not ready. */
+    NOT_AVAILABLE("Not Available"),
+
+    /**
+     * Disk usage is below both {@link GuardrailsConfig#getDataDiskUsagePercentageWarnThreshold()} ()} and
+     * {@link GuardrailsConfig#getDataDiskUsagePercentageFailThreshold()}.
+     */
+    SPACIOUS("Spacious"),
+
+    /**
+     * Disk usage exceeds {@link GuardrailsConfig#getDataDiskUsagePercentageWarnThreshold()} but is below
+     * {@link GuardrailsConfig#getDataDiskUsagePercentageFailThreshold()}.
+     */
+    STUFFED("Stuffed"),
+
+    /** Disk usage exceeds {@link GuardrailsConfig#getDataDiskUsagePercentageFailThreshold()}. */
+    FULL("Full");
+
+    private final String msg;
+
+    DiskUsageState(String msg)
+    {
+        this.msg = msg;
+    }
+
+    public boolean isFull()
+    {
+        return this == FULL;
+    }
+
+    public boolean isStuffed()
+    {
+        return this == STUFFED;
+    }
+
+    public boolean isStuffedOrFull()
+    {
+        return isFull() || isStuffed();
+    }
+
+    @Override
+    public String toString()
+    {
+        return msg;
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/pager/AggregationQueryPager.java b/src/java/org/apache/cassandra/service/pager/AggregationQueryPager.java
index dbc4fc0..bf29ff6 100644
--- a/src/java/org/apache/cassandra/service/pager/AggregationQueryPager.java
+++ b/src/java/org/apache/cassandra/service/pager/AggregationQueryPager.java
@@ -29,6 +29,8 @@
 import org.apache.cassandra.db.rows.RowIterator;
 import org.apache.cassandra.service.ClientState;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * {@code QueryPager} that takes care of fetching the pages for aggregation queries.
  * <p>
@@ -71,9 +73,9 @@
     public PartitionIterator fetchPageInternal(int pageSize, ReadExecutionController executionController)
     {
         if (limits.isGroupByLimit())
-            return new GroupByPartitionIterator(pageSize, executionController, System.nanoTime());
+            return new GroupByPartitionIterator(pageSize, executionController, nanoTime());
 
-        return new AggregationPartitionIterator(pageSize, executionController, System.nanoTime());
+        return new AggregationPartitionIterator(pageSize, executionController, nanoTime());
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java b/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
index ca16967..bc2c79e 100644
--- a/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
+++ b/src/java/org/apache/cassandra/service/pager/MultiPartitionPager.java
@@ -30,6 +30,8 @@
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.service.ClientState;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * Pager over a list of SinglePartitionReadQuery.
  *
@@ -158,7 +160,7 @@
     public PartitionIterator fetchPageInternal(int pageSize, ReadExecutionController executionController) throws RequestValidationException, RequestExecutionException
     {
         int toQuery = Math.min(remaining, pageSize);
-        return new PagersIterator(toQuery, null, null, executionController, System.nanoTime());
+        return new PagersIterator(toQuery, null, null, executionController, nanoTime());
     }
 
     private class PagersIterator extends AbstractIterator<RowIterator> implements PartitionIterator
@@ -230,4 +232,4 @@
     {
         return remaining;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/service/pager/PagingState.java b/src/java/org/apache/cassandra/service/pager/PagingState.java
index 2c2b08b..6e1a52f 100644
--- a/src/java/org/apache/cassandra/service/pager/PagingState.java
+++ b/src/java/org/apache/cassandra/service/pager/PagingState.java
@@ -26,7 +26,6 @@
 
 import org.apache.cassandra.db.Clustering;
 import org.apache.cassandra.db.marshal.AbstractType;
-import org.apache.cassandra.db.marshal.ByteArrayAccessor;
 import org.apache.cassandra.db.marshal.ByteBufferAccessor;
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.db.marshal.CompositeType;
diff --git a/src/java/org/apache/cassandra/service/paxos/AbstractPaxosCallback.java b/src/java/org/apache/cassandra/service/paxos/AbstractPaxosCallback.java
deleted file mode 100644
index ab24f50..0000000
--- a/src/java/org/apache/cassandra/service/paxos/AbstractPaxosCallback.java
+++ /dev/null
@@ -1,66 +0,0 @@
-/*
- * 
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * 
- */
-package org.apache.cassandra.service.paxos;
-
-import java.util.concurrent.CountDownLatch;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.db.WriteType;
-import org.apache.cassandra.exceptions.WriteTimeoutException;
-import org.apache.cassandra.net.RequestCallback;
-
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
-
-public abstract class AbstractPaxosCallback<T> implements RequestCallback<T>
-{
-    protected final CountDownLatch latch;
-    protected final int targets;
-    private final ConsistencyLevel consistency;
-    private final long queryStartNanoTime;
-
-    public AbstractPaxosCallback(int targets, ConsistencyLevel consistency, long queryStartNanoTime)
-    {
-        this.targets = targets;
-        this.consistency = consistency;
-        latch = new CountDownLatch(targets);
-        this.queryStartNanoTime = queryStartNanoTime;
-    }
-
-    public int getResponseCount()
-    {
-        return (int) (targets - latch.getCount());
-    }
-
-    public void await() throws WriteTimeoutException
-    {
-        try
-        {
-            long timeout = DatabaseDescriptor.getWriteRpcTimeout(NANOSECONDS) - (System.nanoTime() - queryStartNanoTime);
-            if (!latch.await(timeout, NANOSECONDS))
-                throw new WriteTimeoutException(WriteType.CAS, consistency, getResponseCount(), targets);
-        }
-        catch (InterruptedException ex)
-        {
-            throw new AssertionError("This latch shouldn't have been interrupted.");
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/service/paxos/AbstractPaxosRepair.java b/src/java/org/apache/cassandra/service/paxos/AbstractPaxosRepair.java
new file mode 100644
index 0000000..05c67da
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/AbstractPaxosRepair.java
@@ -0,0 +1,290 @@
+/*
+ * 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.service.paxos;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.function.Consumer;
+
+import com.google.common.base.Preconditions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.utils.Throwables;
+
+import static org.apache.cassandra.service.paxos.AbstractPaxosRepair.Result.Outcome;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public abstract class AbstractPaxosRepair
+{
+    private static final Logger logger = LoggerFactory.getLogger(AbstractPaxosRepair.class);
+
+    public static class State {}
+
+    public interface StateUpdater<S, I, T extends Throwable>
+    {
+        State apply(S in, I param) throws T;
+    }
+
+    public interface Listener
+    {
+        void onComplete(AbstractPaxosRepair repair, Result result);
+    }
+
+    abstract class ConsumerState<T> extends State implements Consumer<T>
+    {
+        public void accept(T input)
+        {
+            updateState(this, input, ConsumerState::execute);
+        }
+
+        abstract State execute(T input) throws Throwable;
+    }
+
+    public static class Result extends State
+    {
+        enum Outcome { DONE, CANCELLED, FAILURE }
+
+        final Outcome outcome;
+
+        public Result(Outcome outcome)
+        {
+            this.outcome = outcome;
+        }
+
+        public String toString()
+        {
+            return outcome.toString();
+        }
+
+        public boolean wasSuccessful()
+        {
+            return outcome == Outcome.DONE;
+        }
+    }
+
+    static boolean isResult(State state)
+    {
+        return state instanceof Result;
+    }
+
+    public static final Result DONE = new Result(Outcome.DONE);
+
+    public static final Result CANCELLED = new Result(Outcome.CANCELLED);
+
+    public static final class Failure extends Result
+    {
+        public final Throwable failure;
+
+        Failure(Throwable failure)
+        {
+            super(Outcome.FAILURE);
+            this.failure = failure;
+        }
+
+        public String toString()
+        {
+            StringWriter sw = new StringWriter();
+            PrintWriter pw = new PrintWriter(sw);
+            if (failure != null)
+                failure.printStackTrace(pw);
+            return outcome.toString() + ": " + sw;
+        }
+
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Failure failure1 = (Failure) o;
+            return Objects.equals(failure, failure1.failure);
+        }
+
+        public int hashCode()
+        {
+            return Objects.hash(failure);
+        }
+    }
+
+    private final DecoratedKey partitionKey;
+    private final Ballot incompleteBallot;
+    private List<Listener> listeners = null;
+    private volatile State state;
+    private volatile long startedNanos = Long.MIN_VALUE;
+
+    public AbstractPaxosRepair(DecoratedKey partitionKey, Ballot incompleteBallot)
+    {
+        this.partitionKey = partitionKey;
+        this.incompleteBallot = incompleteBallot;
+    }
+
+    public State state()
+    {
+        return state;
+    }
+
+    public long startedNanos()
+    {
+        return startedNanos;
+    }
+
+    public boolean isStarted()
+    {
+        return startedNanos != Long.MIN_VALUE;
+    }
+
+    public boolean isComplete()
+    {
+        return isResult(state);
+    }
+
+    public Ballot incompleteBallot()
+    {
+        return incompleteBallot;
+    }
+
+    /**
+     * add a listener to this repair, or if the repair has already completed, call the listener with the result
+     */
+    public AbstractPaxosRepair addListener(Listener listener)
+    {
+        Result result = null;
+        synchronized (this)
+        {
+            if (isResult(state))
+            {
+                result = (Result) state;
+            }
+            else
+            {
+                if (listeners == null)
+                    listeners = new ArrayList<>();
+
+                listeners.add(listener);
+            }
+        }
+
+        if (result != null)
+            listener.onComplete(this, result);
+
+        return this;
+    }
+
+    public AbstractPaxosRepair addListener(Consumer<Result> listener)
+    {
+        return addListener(((repair, result) -> listener.accept(result)));
+    }
+
+    public final DecoratedKey partitionKey()
+    {
+        return partitionKey;
+    }
+
+    public State restart(State state) { return restart(state, Long.MIN_VALUE); }
+    public abstract State restart(State state, long waitUntil);
+
+    public final synchronized AbstractPaxosRepair start()
+    {
+        updateState(null, null, (state, i2) -> {
+            Preconditions.checkState(!isStarted());
+            startedNanos = Math.max(Long.MIN_VALUE + 1, nanoTime());
+            return restart(state);
+        });
+        return this;
+    }
+
+    public final void cancel()
+    {
+        set(CANCELLED);
+    }
+
+    public final void cancelUnexceptionally()
+    {
+        try
+        {
+            cancel();
+        }
+        catch (Throwable t)
+        {
+            logger.error("Exception cancelling paxos repair", t);
+        }
+    }
+
+    public final synchronized Result await() throws InterruptedException
+    {
+        while (!isResult(state))
+            wait();
+        return (Result) state;
+    }
+
+    protected void set(Result result)
+    {
+        updateState(state(), null, (i1, i2) -> result);
+    }
+
+    protected <S extends State, I, T extends Throwable> void updateState(S expect, I param, StateUpdater<S, I, T> transform)
+    {
+        Result result = null;
+        List<Listener> listeners = null;
+        synchronized (this)
+        {
+            State next;
+            try
+            {
+                if (state != expect)
+                    return;
+
+                state = next = transform.apply(expect, param);
+            }
+            catch (Throwable t)
+            {
+                state = next = new Failure(t);
+            }
+
+            if (isResult(next))
+            {
+                notifyAll();
+                result = (Result) next;
+                listeners = this.listeners;
+                this.listeners = null;
+            }
+        }
+
+        if (result != null && listeners != null)
+        {
+            Throwable t = null;
+            for (int i=0, mi=listeners.size(); i<mi; i++)
+            {
+                try
+                {
+                    listeners.get(i).onComplete(this, result);
+                }
+                catch (Throwable throwable)
+                {
+                    t = Throwables.merge(t, throwable);
+                }
+            }
+            Throwables.maybeFail(t);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/Ballot.java b/src/java/org/apache/cassandra/service/paxos/Ballot.java
new file mode 100644
index 0000000..1787e34
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/Ballot.java
@@ -0,0 +1,151 @@
+/*
+ * 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.service.paxos;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.apache.cassandra.db.marshal.ValueAccessor;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
+import static org.apache.cassandra.utils.ByteArrayUtil.getLong;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public class Ballot extends TimeUUID
+{
+    public static final long serialVersionUID = 1L;
+
+    public enum Flag
+    {
+        NONE, LOCAL, GLOBAL;
+        static final Flag[] FLAGS = values();
+    }
+
+    private static final Ballot epoch = atUnixMicrosWithLsb(0, 0, NONE);
+
+    public static Ballot none()
+    {
+        return epoch;
+    }
+
+    private Ballot(long rawTimestamp, long lsb)
+    {
+        super(rawTimestamp, lsb);
+    }
+
+    public boolean equals(Object that)
+    {
+        if (that == null) return false;
+        if (that == this) return true;
+        if (that.getClass() != Ballot.class) return false;
+        return super.equals((TimeUUID) that);
+    }
+
+    public static Ballot atUnixMicrosWithLsb(long unixMicros, long uniqueLsb, Flag flag)
+    {
+        return new Ballot(unixMicrosToRawTimestamp(unixMicros) + flag.ordinal(), uniqueLsb);
+    }
+
+    public static Ballot fromUuid(UUID uuid)
+    {
+        return fromBytes(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits());
+    }
+
+    public static Ballot fromBytes(long msb, long lsb)
+    {
+        return new Ballot(msbToRawTimestamp(msb), lsb);
+    }
+
+    public static Ballot fromString(String uuidString)
+    {
+        return fromUuid(UUID.fromString(uuidString));
+    }
+
+    public static Ballot deserialize(byte[] bytes)
+    {
+        if (bytes.length == 0)
+            return null;
+        return fromBytes(getLong(bytes, 0), getLong(bytes, 8));
+    }
+
+    public static Ballot deserialize(ByteBuffer buffer)
+    {
+        if (!buffer.hasRemaining())
+            return null;
+        return fromBytes(buffer.getLong(buffer.position()), buffer.getLong(buffer.position() + 8));
+    }
+
+    public static Ballot deserialize(DataInputPlus in) throws IOException
+    {
+        long msb = in.readLong();
+        long lsb = in.readLong();
+        return fromBytes(msb, lsb);
+    }
+
+    public Flag flag()
+    {
+        int i = (int)(uuidTimestamp() % 10);
+        if (i < Flag.FLAGS.length)
+            return Flag.FLAGS[i];
+        return NONE;
+    }
+
+
+    public static class Serializer extends AbstractSerializer<Ballot> implements IVersionedSerializer<Ballot>
+    {
+        public static final Serializer instance = new Serializer();
+
+        public <V> Ballot deserialize(V value, ValueAccessor<V> accessor)
+        {
+            return accessor.isEmpty(value) ? null : accessor.toBallot(value);
+        }
+
+        public Class<Ballot> getType()
+        {
+            return Ballot.class;
+        }
+
+        @Override
+        public void serialize(Ballot t, DataOutputPlus out, int version) throws IOException
+        {
+            t.serialize(out);
+        }
+
+        @Override
+        public Ballot deserialize(DataInputPlus in, int version) throws IOException
+        {
+            return Ballot.deserialize(in);
+        }
+
+        @Override
+        public long serializedSize(Ballot t, int version)
+        {
+            return sizeInBytes();
+        }
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/BallotGenerator.java b/src/java/org/apache/cassandra/service/paxos/BallotGenerator.java
new file mode 100644
index 0000000..f746c4e
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/BallotGenerator.java
@@ -0,0 +1,85 @@
+/*
+ * 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.service.paxos;
+
+import java.security.SecureRandom;
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.paxos.Ballot.Flag;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.service.paxos.Ballot.atUnixMicrosWithLsb;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface BallotGenerator
+{
+    static class Default implements BallotGenerator
+    {
+        private static final SecureRandom secureRandom = new SecureRandom();
+
+        public Ballot atUnixMicros(long unixMicros, Flag flag)
+        {
+            return atUnixMicrosWithLsb(unixMicros, secureRandom.nextLong(), flag);
+        }
+
+        public Ballot next(long minUnixMicros, Flag flag)
+        {
+            long unixMicros = ClientState.getTimestampForPaxos(minUnixMicros);
+            return atUnixMicros(unixMicros, flag);
+        }
+
+        public Ballot stale(long fromInMicros, long toInMicros, Flag flag)
+        {
+            long unixMicros = ThreadLocalRandom.current().nextLong(fromInMicros, toInMicros);
+            return atUnixMicros(unixMicros, flag);
+        }
+
+        public long next(long minTimestamp)
+        {
+            return ClientState.getTimestampForPaxos(minTimestamp);
+        }
+
+        public long prevUnixMicros()
+        {
+            return ClientState.getLastTimestampMicros();
+        }
+    }
+
+    static class Global
+    {
+        private static BallotGenerator instance = new Default();
+        public static Ballot atUnixMicros(long unixMicros, Flag flag) { return instance.atUnixMicros(unixMicros, flag); }
+        public static Ballot nextBallot(Flag flag) { return instance.next(Long.MIN_VALUE, flag); }
+        public static Ballot nextBallot(long minUnixMicros, Flag flag) { return instance.next(minUnixMicros, flag); }
+        public static Ballot staleBallot(long fromUnixMicros, long toUnixMicros, Flag flag) { return instance.stale(fromUnixMicros, toUnixMicros, flag); }
+        public static long prevUnixMicros() { return instance.prevUnixMicros(); }
+
+        public static void unsafeSet(BallotGenerator newInstance)
+        {
+            instance = newInstance;
+        }
+    }
+
+    Ballot atUnixMicros(long unixMicros, Flag flag);
+    Ballot next(long minUnixMicros, Flag flag);
+    Ballot stale(long fromUnixMicros, long toUnixMicros, Flag flag);
+    long prevUnixMicros();
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/service/paxos/Commit.java b/src/java/org/apache/cassandra/service/paxos/Commit.java
index 05fa595..88ab5ea 100644
--- a/src/java/org/apache/cassandra/service/paxos/Commit.java
+++ b/src/java/org/apache/cassandra/service/paxos/Commit.java
@@ -22,28 +22,235 @@
 
 
 import java.io.IOException;
-import java.util.UUID;
+import java.util.function.BiFunction;
+
+import javax.annotation.Nullable;
 
 import com.google.common.base.Objects;
 
-import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.utils.UUIDGen;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.schema.TableMetadata;
+
+import static org.apache.cassandra.db.SystemKeyspace.*;
+import static org.apache.cassandra.service.paxos.Commit.CompareResult.AFTER;
+import static org.apache.cassandra.service.paxos.Commit.CompareResult.BEFORE;
+import static org.apache.cassandra.service.paxos.Commit.CompareResult.IS_REPROPOSAL;
+import static org.apache.cassandra.service.paxos.Commit.CompareResult.WAS_REPROPOSED_BY;
+import static org.apache.cassandra.service.paxos.Commit.CompareResult.SAME;
+import static org.apache.cassandra.utils.FBUtilities.nowInSeconds;
 
 public class Commit
 {
-    public static final CommitSerializer serializer = new CommitSerializer();
+    enum CompareResult { SAME, BEFORE, AFTER, IS_REPROPOSAL, WAS_REPROPOSED_BY}
 
-    public final UUID ballot;
+    public static final CommitSerializer<Commit> serializer = new CommitSerializer<>(Commit::new);
+
+    public static class Proposal extends Commit
+    {
+        public static final CommitSerializer<Proposal> serializer = new CommitSerializer<>(Proposal::new);
+
+        public Proposal(Ballot ballot, PartitionUpdate update)
+        {
+            super(ballot, update);
+        }
+
+        public String toString()
+        {
+            return toString("Proposal");
+        }
+
+        public static Proposal of(Ballot ballot, PartitionUpdate update)
+        {
+            update = withTimestamp(update, ballot.unixMicros());
+            return new Proposal(ballot, update);
+        }
+
+        public static Proposal empty(Ballot ballot, DecoratedKey partitionKey, TableMetadata metadata)
+        {
+            return new Proposal(ballot, PartitionUpdate.emptyUpdate(metadata, partitionKey));
+        }
+
+        public Accepted accepted()
+        {
+            return new Accepted(ballot, update);
+        }
+
+        public Agreed agreed()
+        {
+            return new Agreed(ballot, update);
+        }
+    }
+
+    public static class Accepted extends Proposal
+    {
+        public static final CommitSerializer<Accepted> serializer = new CommitSerializer<>(Accepted::new);
+
+        public static Accepted none(DecoratedKey partitionKey, TableMetadata metadata)
+        {
+            return new Accepted(Ballot.none(), PartitionUpdate.emptyUpdate(metadata, partitionKey));
+        }
+
+        public Accepted(Ballot ballot, PartitionUpdate update)
+        {
+            super(ballot, update);
+        }
+
+        public Accepted(Commit commit)
+        {
+            super(commit.ballot, commit.update);
+        }
+
+        Committed committed()
+        {
+            return new Committed(ballot, update);
+        }
+
+        boolean isExpired(int nowInSec)
+        {
+            return false;
+        }
+
+        public String toString()
+        {
+            return toString("Accepted");
+        }
+
+        /**
+         * Like {@link #latest(Commit, Commit)} but also takes into account deletion time
+         */
+        public static Accepted latestAccepted(Accepted a, Accepted b)
+        {
+            int c = compare(a, b);
+            if (c != 0)
+                return c > 0 ? a : b;
+            return a instanceof AcceptedWithTTL ? ((AcceptedWithTTL)a).lastDeleted(b) : a;
+        }
+    }
+
+    public static class AcceptedWithTTL extends Accepted
+    {
+        public static AcceptedWithTTL withDefaultTTL(Commit copy)
+        {
+            return new AcceptedWithTTL(copy, nowInSeconds() + legacyPaxosTtlSec(copy.update.metadata()));
+        }
+
+        public final int localDeletionTime;
+
+        public AcceptedWithTTL(Commit copy, int localDeletionTime)
+        {
+            super(copy);
+            this.localDeletionTime = localDeletionTime;
+        }
+
+        public AcceptedWithTTL(Ballot ballot, PartitionUpdate update, int localDeletionTime)
+        {
+            super(ballot, update);
+            this.localDeletionTime = localDeletionTime;
+        }
+
+        boolean isExpired(int nowInSec)
+        {
+            return nowInSec >= localDeletionTime;
+        }
+
+        Accepted lastDeleted(Accepted b)
+        {
+            return b instanceof AcceptedWithTTL && localDeletionTime >= ((AcceptedWithTTL) b).localDeletionTime
+                   ? this : b;
+        }
+    }
+
+    // might prefer to call this Commit, but would mean refactoring more legacy code
+    public static class Agreed extends Accepted
+    {
+        public static final CommitSerializer<Agreed> serializer = new CommitSerializer<>(Agreed::new);
+
+        public Agreed(Ballot ballot, PartitionUpdate update)
+        {
+            super(ballot, update);
+        }
+
+        public Agreed(Commit copy)
+        {
+            super(copy);
+        }
+    }
+
+    public static class Committed extends Agreed
+    {
+        public static final CommitSerializer<Committed> serializer = new CommitSerializer<>(Committed::new);
+
+        public static Committed none(DecoratedKey partitionKey, TableMetadata metadata)
+        {
+            return new Committed(Ballot.none(), PartitionUpdate.emptyUpdate(metadata, partitionKey));
+        }
+
+        public Committed(Ballot ballot, PartitionUpdate update)
+        {
+            super(ballot, update);
+        }
+
+        public Committed(Commit copy)
+        {
+            super(copy);
+        }
+
+        public String toString()
+        {
+            return toString("Committed");
+        }
+
+        public static Committed latestCommitted(Committed a, Committed b)
+        {
+            int c = compare(a, b);
+            if (c != 0)
+                return c > 0 ? a : b;
+            return a instanceof CommittedWithTTL ? ((CommittedWithTTL)a).lastDeleted(b) : a;
+        }
+    }
+
+    public static class CommittedWithTTL extends Committed
+    {
+        public static CommittedWithTTL withDefaultTTL(Commit copy)
+        {
+            return new CommittedWithTTL(copy, nowInSeconds() + legacyPaxosTtlSec(copy.update.metadata()));
+        }
+
+        public final int localDeletionTime;
+
+        public CommittedWithTTL(Ballot ballot, PartitionUpdate update, int localDeletionTime)
+        {
+            super(ballot, update);
+            this.localDeletionTime = localDeletionTime;
+        }
+
+        public CommittedWithTTL(Commit copy, int localDeletionTime)
+        {
+            super(copy);
+            this.localDeletionTime = localDeletionTime;
+        }
+
+        boolean isExpired(int nowInSec)
+        {
+            return nowInSec >= localDeletionTime;
+        }
+
+        Committed lastDeleted(Committed b)
+        {
+            return b instanceof CommittedWithTTL && localDeletionTime >= ((CommittedWithTTL) b).localDeletionTime
+                   ? this : b;
+        }
+    }
+
+    public final Ballot ballot;
     public final PartitionUpdate update;
 
-    public Commit(UUID ballot, PartitionUpdate update)
+    public Commit(Ballot ballot, PartitionUpdate update)
     {
         assert ballot != null;
         assert update != null;
@@ -52,36 +259,51 @@
         this.update = update;
     }
 
-    public static Commit newPrepare(DecoratedKey key, TableMetadata metadata, UUID ballot)
+    public static Commit newPrepare(DecoratedKey partitionKey, TableMetadata metadata, Ballot ballot)
     {
-        return new Commit(ballot, PartitionUpdate.emptyUpdate(metadata, key));
+        return new Commit(ballot, PartitionUpdate.emptyUpdate(metadata, partitionKey));
     }
 
-    public static Commit newProposal(UUID ballot, PartitionUpdate update)
+    public static Commit emptyCommit(DecoratedKey partitionKey, TableMetadata metadata)
     {
-        PartitionUpdate withNewTimestamp = new PartitionUpdate.Builder(update, 0).updateAllTimestamp(UUIDGen.microsTimestamp(ballot)).build();
-        return new Commit(ballot, withNewTimestamp);
+        return new Commit(Ballot.none(), PartitionUpdate.emptyUpdate(metadata, partitionKey));
     }
 
-    public static Commit emptyCommit(DecoratedKey key, TableMetadata metadata)
+    @Deprecated
+    public static Commit newProposal(Ballot ballot, PartitionUpdate update)
     {
-        return new Commit(UUIDGen.minTimeUUID(0), PartitionUpdate.emptyUpdate(metadata, key));
+        update = withTimestamp(update, ballot.unixMicros());
+        return new Commit(ballot, update);
     }
 
     public boolean isAfter(Commit other)
     {
-        return ballot.timestamp() > other.ballot.timestamp();
+        return other == null || ballot.uuidTimestamp() > other.ballot.uuidTimestamp();
     }
 
-    public boolean hasBallot(UUID ballot)
+    public boolean isSameOrAfter(@Nullable Ballot otherBallot)
+    {
+        return otherBallot == null || otherBallot.equals(ballot) || ballot.uuidTimestamp() > otherBallot.uuidTimestamp();
+    }
+
+    public boolean isAfter(@Nullable Ballot otherBallot)
+    {
+        return otherBallot == null || ballot.uuidTimestamp() > otherBallot.uuidTimestamp();
+    }
+
+    public boolean isBefore(@Nullable Ballot otherBallot)
+    {
+        return otherBallot != null && ballot.uuidTimestamp() < otherBallot.uuidTimestamp();
+    }
+
+    public boolean hasBallot(Ballot ballot)
     {
         return this.ballot.equals(ballot);
     }
 
-    /** Whether this is an empty commit, that is one with no updates. */
-    public boolean isEmpty()
+    public boolean hasSameBallot(Commit other)
     {
-        return update.isEmpty();
+        return this.ballot.equals(other.ballot);
     }
 
     public Mutation makeMutation()
@@ -109,28 +331,170 @@
     @Override
     public String toString()
     {
-        return String.format("Commit(%s, %s)", ballot, update);
+        return toString("Commit");
     }
 
-    public static class CommitSerializer implements IVersionedSerializer<Commit>
+    public String toString(String kind)
     {
-        public void serialize(Commit commit, DataOutputPlus out, int version) throws IOException
+        return String.format("%s(%d:%s, %d:%s)", kind, ballot.uuidTimestamp(), ballot, update.stats().minTimestamp, update.toString(false));
+    }
+
+    /**
+     * We can witness reproposals of the latest successful commit; we can detect this by comparing the timestamp of
+     * the update with our ballot; if it is the same, we are not a reproposal. If it is the same as either the
+     * ballot timestamp or update timestamp of the latest committed proposal, then we are reproposing it and can
+     * instead simpy commit it.
+     */
+    public boolean isReproposalOf(Commit older)
+    {
+        return isReproposal(older, older.ballot.uuidTimestamp(), this, this.ballot.uuidTimestamp());
+    }
+
+    private boolean isReproposal(Commit older, long ballotOfOlder, Commit newer, long ballotOfNewer)
+    {
+        // NOTE: it would in theory be possible to just check
+        // newer.update.stats().minTimestamp == older.update.stats().minTimestamp
+        // however this could be brittle, if for some reason they don't get updated;
+        // the logic below is fail-safe, in that if minTimestamp is not set we will treat it as not a reproposal
+        // which is the safer way to get it wrong.
+
+        // the timestamp of a mutation stays unchanged as we repropose it, so the timestamp of the mutation
+        // is the timestamp of the ballot that originally proposed it
+        long originalBallotOfNewer = newer.update.stats().minTimestamp;
+
+        // so, if the mutation and ballot timestamps match, this is not a reproposal but a first proposal
+        if (ballotOfNewer == originalBallotOfNewer)
+            return false;
+
+        // otherwise, if the original proposing ballot matches the older proposal's ballot, it is reproposing it
+        if (originalBallotOfNewer == ballotOfOlder)
+            return true;
+
+        // otherwise, it could be that both are reproposals, so just check both for the "original" ballot timestamp
+        return originalBallotOfNewer == older.update.stats().minTimestamp;
+    }
+
+    public CompareResult compareWith(Commit that)
+    {
+        long thisBallot = this.ballot.uuidTimestamp();
+        long thatBallot = that.ballot.uuidTimestamp();
+        // by the time we reach proposal and commit, timestamps are unique so we can assert identity
+        if (thisBallot == thatBallot)
+            return SAME;
+
+        if (thisBallot < thatBallot)
+            return isReproposal(this, thisBallot, that, thatBallot) ? WAS_REPROPOSED_BY : BEFORE;
+        else
+            return isReproposal(that, thatBallot, this, thisBallot) ? IS_REPROPOSAL : AFTER;
+    }
+
+    private static int compare(@Nullable Commit a, @Nullable Commit b)
+    {
+        if (a == null) return 1;
+        if (b == null) return -1;
+        return Long.compare(a.ballot.uuidTimestamp(), b.ballot.uuidTimestamp());
+    }
+
+    /**
+     * @return testIfAfter.isAfter(testIfBefore), with non-null > null
+     */
+    public static boolean isAfter(@Nullable Commit testIsAfter, @Nullable Commit testIsBefore)
+    {
+        return testIsAfter != null && testIsAfter.isAfter(testIsBefore);
+    }
+
+    /**
+     * @return testIfAfter.isAfter(testIfBefore), with non-null > null
+     */
+    public static boolean isAfter(@Nullable Ballot testIsAfter, @Nullable Commit testIsBefore)
+    {
+        return testIsAfter != null && (testIsBefore == null || testIsAfter.uuidTimestamp() > testIsBefore.ballot.uuidTimestamp());
+    }
+
+    /**
+     * @return testIfAfter.isAfter(testIfBefore), with non-null > null
+     */
+    public static boolean isAfter(@Nullable Commit testIsAfter, @Nullable Ballot testIsBefore)
+    {
+        return testIsAfter != null && (testIsBefore == null || testIsAfter.ballot.uuidTimestamp() > testIsBefore.uuidTimestamp());
+    }
+
+    /**
+     * @return testIfAfter.isAfter(testIfBefore), with non-null > null
+     */
+    public static boolean isAfter(@Nullable Ballot testIsAfter, @Nullable Ballot testIsBefore)
+    {
+        return testIsAfter != null && (testIsBefore == null || testIsAfter.uuidTimestamp() > testIsBefore.uuidTimestamp());
+    }
+
+    /**
+     * the latest of two ballots, or the first ballot if equal timestamps
+     */
+    public static <C extends Commit> C latest(@Nullable C a, @Nullable C b)
+    {
+        return (a == null | b == null) ? (a == null ? b : a) : a.ballot.uuidTimestamp() >= b.ballot.uuidTimestamp() ? a : b;
+    }
+
+    /**
+     * the latest of two ballots, or the first ballot if equal timestamps
+     */
+    public static Ballot latest(@Nullable Commit a, @Nullable Ballot b)
+    {
+        return (a == null | b == null) ? (a == null ? b : a.ballot) : a.ballot.uuidTimestamp() >= b.uuidTimestamp() ? a.ballot : b;
+    }
+
+    /**
+     * the latest of two ballots, or the first ballot if equal timestamps
+     */
+    public static Ballot latest(@Nullable Ballot a, @Nullable Ballot b)
+    {
+        return (a == null | b == null) ? (a == null ? b : a) : a.uuidTimestamp() >= b.uuidTimestamp() ? a : b;
+    }
+
+    /**
+     * unequal ballots with same timestamp
+     */
+    public static boolean timestampsClash(@Nullable Commit a, @Nullable Ballot b)
+    {
+        return a != null && b != null && !a.ballot.equals(b) && a.ballot.uuidTimestamp() == b.uuidTimestamp();
+    }
+
+    public static boolean timestampsClash(@Nullable Ballot a, @Nullable Ballot b)
+    {
+        return a != null && b != null && !a.equals(b) && a.uuidTimestamp() == b.uuidTimestamp();
+    }
+
+    private static PartitionUpdate withTimestamp(PartitionUpdate update, long timestamp)
+    {
+        return new PartitionUpdate.Builder(update, 0).updateAllTimestamp(timestamp).build();
+    }
+
+    public static class CommitSerializer<T extends Commit> implements IVersionedSerializer<T>
+    {
+        final BiFunction<Ballot, PartitionUpdate, T> constructor;
+        public CommitSerializer(BiFunction<Ballot, PartitionUpdate, T> constructor)
         {
-            UUIDSerializer.serializer.serialize(commit.ballot, out, version);
+            this.constructor = constructor;
+        }
+
+        public void serialize(T commit, DataOutputPlus out, int version) throws IOException
+        {
+            commit.ballot.serialize(out);
             PartitionUpdate.serializer.serialize(commit.update, out, version);
         }
 
-        public Commit deserialize(DataInputPlus in, int version) throws IOException
+        public T deserialize(DataInputPlus in, int version) throws IOException
         {
-            UUID ballot = UUIDSerializer.serializer.deserialize(in, version);
+            Ballot ballot = Ballot.deserialize(in);
             PartitionUpdate update = PartitionUpdate.serializer.deserialize(in, version, DeserializationHelper.Flag.LOCAL);
-            return new Commit(ballot, update);
+            return constructor.apply(ballot, update);
         }
 
-        public long serializedSize(Commit commit, int version)
+        public long serializedSize(T commit, int version)
         {
-            return UUIDSerializer.serializer.serializedSize(commit.ballot, version)
-                 + PartitionUpdate.serializer.serializedSize(commit.update, version);
+            return Ballot.sizeInBytes()
+                   + PartitionUpdate.serializer.serializedSize(commit.update, version);
         }
     }
+
 }
diff --git a/src/java/org/apache/cassandra/service/paxos/CommitVerbHandler.java b/src/java/org/apache/cassandra/service/paxos/CommitVerbHandler.java
deleted file mode 100644
index 12466dd..0000000
--- a/src/java/org/apache/cassandra/service/paxos/CommitVerbHandler.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * 
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- * 
- */
-package org.apache.cassandra.service.paxos;
-
-import org.apache.cassandra.net.IVerbHandler;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.tracing.Tracing;
-
-public class CommitVerbHandler implements IVerbHandler<Commit>
-{
-    public static final CommitVerbHandler instance = new CommitVerbHandler();
-
-    public void doVerb(Message<Commit> message)
-    {
-        PaxosState.commit(message.payload);
-
-        Tracing.trace("Enqueuing acknowledge to {}", message.from());
-        MessagingService.instance().send(message.emptyResponse(), message.from());
-    }
-}
diff --git a/src/java/org/apache/cassandra/service/paxos/ContentionStrategy.java b/src/java/org/apache/cassandra/service/paxos/ContentionStrategy.java
new file mode 100644
index 0000000..7f38567
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/ContentionStrategy.java
@@ -0,0 +1,651 @@
+/*
+ * 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.service.paxos;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+
+import com.codahale.metrics.Snapshot;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.NoSpamLogger;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.DoubleSupplier;
+import java.util.function.LongBinaryOperator;
+import java.util.function.Supplier;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import static java.lang.Double.parseDouble;
+import static java.lang.Integer.parseInt;
+import static java.lang.Math.*;
+import static java.util.Arrays.stream;
+import static java.util.concurrent.TimeUnit.*;
+import static org.apache.cassandra.config.DatabaseDescriptor.*;
+import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casReadMetrics;
+import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casWriteMetrics;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.Clock.waitUntil;
+
+/**
+ * <p>A strategy for making back-off decisions for Paxos operations that fail to make progress because of other paxos operations.
+ * The strategy is defined by four factors: <ul>
+ * <li> {@link #min}
+ * <li> {@link #max}
+ * <li> {@link #minDelta}
+ * <li> {@link #waitRandomizer}
+ * </ul>
+ *
+ * <p>The first three represent time periods, and may be defined dynamically based on a simple calculation over: <ul>
+ * <li> {@code pX()} recent experienced latency distribution for successful operations,
+ *                 e.g. {@code p50(rw)} the maximum of read and write median latencies,
+ *                      {@code p999(r)} the 99.9th percentile of read latencies
+ * <li> {@code attempts} the number of failed attempts made by the operation so far
+ * <li> {@code constant} a user provided floating point constant
+ * </ul>
+ *
+ * <p>Their calculation may take any of these forms
+ * <li> constant            {@code $constant$[mu]s}
+ * <li> dynamic constant    {@code pX() * constant}
+ * <li> dynamic linear      {@code pX() * constant * attempts}
+ * <li> dynamic exponential {@code pX() * constant ^ attempts}
+ *
+ * <p>Furthermore, the dynamic calculations can be bounded with a min/max, like so:
+ *  {@code min[mu]s <= dynamic expr <= max[mu]s}
+ *
+ * e.g.
+ * <li> {@code 10ms <= p50(rw)*0.66}
+ * <li> {@code 10ms <= p95(rw)*1.8^attempts <= 100ms}
+ * <li> {@code 5ms <= p50(rw)*0.5}
+ *
+ * <p>These calculations are put together to construct a range from which we draw a random number.
+ * The period we wait for {@code X} will be drawn so that {@code min <= X < max}.
+ *
+ * <p>With the constraint that {@code max} must be {@code minDelta} greater than {@code min},
+ * but no greater than its expression-defined maximum. {@code max} will be increased up until
+ * this point, after which {@code min} will be decreased until this gap is imposed.
+ *
+ * <p>The {@link #waitRandomizer} property specifies the manner in which a random value is drawn from the range.
+ * It is defined using one of the following specifiers:
+ * <li> uniform
+ * <li> exp($power$) or exponential($power$)
+ * <li> qexp($power$) or qexponential($power$) or quantizedexponential($power$)
+ *
+ * The uniform specifier is self-explanatory, selecting all values in the range with equal probability.
+ * The exponential specifier draws values towards the end of the range with higher probability, raising
+ * a floating point number in the range [0..1.0) to the power provided, and translating the resulting value
+ * to a uniform value in the range.
+ * The quantized exponential specifier partitions the range into {@code attempts} buckets, then applies the pure
+ * exponential approach to draw values from [0..attempts), before drawing a uniform value from the corresponding bucket
+ *
+ * <p>Finally, there is also a {@link #traceAfterAttempts} property that permits initiating tracing of operations
+ * that experience a certain minimum number of failed paxos rounds due to contention. A setting of 0 or 1 will initiate
+ * a trace session after the first failed ballot.
+ */
+public class ContentionStrategy
+{
+    private static final Logger logger = LoggerFactory.getLogger(ContentionStrategy.class);
+
+    private static final Pattern BOUND = Pattern.compile(
+                "(?<const>0|[0-9]+[mu]s)" +
+                "|((?<min>0|[0-9]+[mu]s) *<= *)?" +
+                    "(p(?<perc>[0-9]+)\\((?<rw>r|w|rw|wr)\\)|(?<constbase>0|[0-9]+[mu]s))" +
+                    "\\s*([*]\\s*(?<mod>[0-9.]+)?\\s*(?<modkind>[*^]\\s*attempts)?)?" +
+                "( *<= *(?<max>0|[0-9]+[mu]s))?");
+    private static final Pattern TIME = Pattern.compile(
+                "0|([0-9]+)ms|([0-9]+)us");
+    private static final Pattern RANDOMIZER = Pattern.compile(
+                "uniform|exp(onential)?[(](?<exp>[0-9.]+)[)]|q(uantized)?exp(onential)?[(](?<qexp>[0-9.]+)[)]");
+    private static final String DEFAULT_WAIT_RANDOMIZER = "qexp(1.5)"; // at least 0ms, and at least 66% of median latency
+    private static final String DEFAULT_MIN = "0 <= p50(rw)*0.66"; // at least 0ms, and at least 66% of median latency
+    private static final String DEFAULT_MAX = "10ms <= p95(rw)*1.8^attempts <= 100ms"; // p95 latency with exponential back-off at rate of 1.8^attempts
+    private static final String DEFAULT_MIN_DELTA = "5ms <= p50(rw)*0.5"; // at least 5ms, and at least 50% of median latency
+
+    private static volatile ContentionStrategy current;
+
+    // Factories can be useful for testing purposes, to supply custom implementations of selectors and modifiers.
+    final static LatencySelectorFactory selectors = new LatencySelectorFactory(){};
+    final static LatencyModifierFactory modifiers = new LatencyModifierFactory(){};
+    final static WaitRandomizerFactory randomizers = new WaitRandomizerFactory(){};
+
+    static
+    {
+        current = new ContentionStrategy(defaultWaitRandomizer(), defaultMinWait(), defaultMaxWait(), defaultMinDelta(), Integer.MAX_VALUE);
+    }
+
+    static interface LatencyModifierFactory
+    {
+        default LatencyModifier identity() { return (l, a) -> l; }
+        default LatencyModifier multiply(double constant) { return (l, a) -> saturatedCast(l * constant); }
+        default LatencyModifier multiplyByAttempts(double multiply) { return (l, a) -> saturatedCast(l * multiply * a); }
+        default LatencyModifier multiplyByAttemptsExp(double base) { return (l, a) -> saturatedCast(l * pow(base, a)); }
+    }
+
+    static interface LatencySupplier
+    {
+        abstract long get(double percentile);
+    }
+
+    static interface LatencySelector
+    {
+        abstract long select(LatencySupplier readLatencyHistogram, LatencySupplier writeLatencyHistogram);
+    }
+
+    static interface LatencySelectorFactory
+    {
+        default LatencySelector constant(long latency) { return (read, write) -> latency; }
+        default LatencySelector read(double percentile) { return (read, write) -> read.get(percentile); }
+        default LatencySelector write(double percentile) { return (read, write) -> write.get(percentile); }
+        default LatencySelector maxReadWrite(double percentile) { return (read, write) -> max(read.get(percentile), write.get(percentile)); }
+    }
+
+    static interface LatencyModifier
+    {
+        long modify(long latency, int attempts);
+    }
+
+    static interface WaitRandomizer
+    {
+        abstract long wait(long min, long max, int attempts);
+    }
+
+    static interface WaitRandomizerFactory
+    {
+        default LongBinaryOperator uniformLongSupplier() { return (min, max) -> ThreadLocalRandom.current().nextLong(min, max); } // DO NOT USE METHOD HANDLES (want to fetch afresh each time)
+        default DoubleSupplier uniformDoubleSupplier() { return () -> ThreadLocalRandom.current().nextDouble(); }
+        
+        default WaitRandomizer uniform() { return new Uniform(uniformLongSupplier()); }
+        default WaitRandomizer exponential(double power) { return new Exponential(uniformLongSupplier(), uniformDoubleSupplier(), power); }
+        default WaitRandomizer quantizedExponential(double power) { return new QuantizedExponential(uniformLongSupplier(), uniformDoubleSupplier(), power); }
+
+        static class Uniform implements WaitRandomizer
+        {
+            final LongBinaryOperator uniformLong;
+
+            public Uniform(LongBinaryOperator uniformLong)
+            {
+                this.uniformLong = uniformLong;
+            }
+
+            @Override
+            public long wait(long min, long max, int attempts)
+            {
+                return uniformLong.applyAsLong(min, max);
+            }
+        }
+
+        static abstract class AbstractExponential implements WaitRandomizer
+        {
+            final LongBinaryOperator uniformLong;
+            final DoubleSupplier uniformDouble;
+            final double power;
+
+            public AbstractExponential(LongBinaryOperator uniformLong, DoubleSupplier uniformDouble, double power)
+            {
+                this.uniformLong = uniformLong;
+                this.uniformDouble = uniformDouble;
+                this.power = power;
+            }
+        }
+
+        static class Exponential extends AbstractExponential
+        {
+            public Exponential(LongBinaryOperator uniformLong, DoubleSupplier uniformDouble, double power)
+            {
+                super(uniformLong, uniformDouble, power);
+            }
+
+            @Override
+            public long wait(long min, long max, int attempts)
+            {
+                if (attempts == 1)
+                    return uniformLong.applyAsLong(min, max);
+
+                double p = uniformDouble.getAsDouble();
+                long delta = max - min;
+                delta *= Math.pow(p, power);
+                return max - delta;
+            }
+        }
+
+        static class QuantizedExponential extends AbstractExponential
+        {
+            public QuantizedExponential(LongBinaryOperator uniformLong, DoubleSupplier uniformDouble, double power)
+            {
+                super(uniformLong, uniformDouble, power);
+            }
+
+            @Override
+            public long wait(long min, long max, int attempts)
+            {
+                long quanta = (max - min) / attempts;
+                if (attempts == 1 || quanta == 0)
+                    return uniformLong.applyAsLong(min, max);
+
+                double p = uniformDouble.getAsDouble();
+                int base = (int) (attempts * Math.pow(p, power));
+                return max - ThreadLocalRandom.current().nextLong(quanta * base, quanta * (base + 1));
+            }
+        }
+    }
+
+    static class SnapshotAndTime
+    {
+        final long validUntil;
+        final Snapshot snapshot;
+
+        SnapshotAndTime(long validUntil, Snapshot snapshot)
+        {
+            this.validUntil = validUntil;
+            this.snapshot = snapshot;
+        }
+    }
+
+    static class TimeLimitedLatencySupplier extends AtomicReference<SnapshotAndTime> implements LatencySupplier
+    {
+        final Supplier<Snapshot> snapshotSupplier;
+        final long validForNanos;
+
+        TimeLimitedLatencySupplier(Supplier<Snapshot> snapshotSupplier, long time, TimeUnit units)
+        {
+            this.snapshotSupplier = snapshotSupplier;
+            this.validForNanos = units.toNanos(time);
+        }
+
+        private Snapshot getSnapshot()
+        {
+            long now = nanoTime();
+
+            SnapshotAndTime cur = get();
+            if (cur != null && cur.validUntil > now)
+                return cur.snapshot;
+
+            Snapshot newSnapshot = snapshotSupplier.get();
+            SnapshotAndTime next = new SnapshotAndTime(now + validForNanos, newSnapshot);
+            if (compareAndSet(cur, next))
+                return next.snapshot;
+
+            return accumulateAndGet(next, (a, b) -> a.validUntil > b.validUntil ? a : b).snapshot;
+        }
+
+        @Override
+        public long get(double percentile)
+        {
+            return (long)getSnapshot().getValue(percentile);
+        }
+    }
+
+    static class Bound
+    {
+        final long min, max, onFailure;
+        final LatencyModifier modifier;
+        final LatencySelector selector;
+        final LatencySupplier reads, writes;
+
+        Bound(long min, long max, long onFailure, LatencyModifier modifier, LatencySelector selector)
+        {
+            Preconditions.checkArgument(min<=max, "min (%s) must be less than or equal to max (%s)", min, max);
+            this.min = min;
+            this.max = max;
+            this.onFailure = onFailure;
+            this.modifier = modifier;
+            this.selector = selector;
+            this.reads = new TimeLimitedLatencySupplier(casReadMetrics.latency::getSnapshot, 10L, SECONDS);
+            this.writes = new TimeLimitedLatencySupplier(casWriteMetrics.latency::getSnapshot, 10L, SECONDS);
+        }
+
+        long get(int attempts)
+        {
+            try
+            {
+                long base = selector.select(reads, writes);
+                return max(min, min(max, modifier.modify(base, attempts)));
+            }
+            catch (Throwable t)
+            {
+                NoSpamLogger.getLogger(logger, 1L, MINUTES).info("", t);
+                return onFailure;
+            }
+        }
+
+        public String toString()
+        {
+            return "Bound{" +
+                   "min=" + min +
+                   ", max=" + max +
+                   ", onFailure=" + onFailure +
+                   ", modifier=" + modifier +
+                   ", selector=" + selector +
+                   '}';
+        }
+    }
+
+    final WaitRandomizer waitRandomizer;
+    final Bound min, max, minDelta;
+    final int traceAfterAttempts;
+
+    public ContentionStrategy(String waitRandomizer, String min, String max, String minDelta, int traceAfterAttempts)
+    {
+        this.waitRandomizer = parseWaitRandomizer(waitRandomizer);
+        this.min = parseBound(min, true);
+        this.max = parseBound(max, false);
+        this.minDelta = parseBound(minDelta, true);
+        this.traceAfterAttempts = traceAfterAttempts;
+    }
+
+    public enum Type
+    {
+        READ("Contended Paxos Read"), WRITE("Contended Paxos Write"), REPAIR("Contended Paxos Repair");
+
+        final String traceTitle;
+        final String lowercase;
+
+        Type(String traceTitle)
+        {
+            this.traceTitle = traceTitle;
+            this.lowercase = name().toLowerCase();
+        }
+    }
+
+    long computeWaitUntilForContention(int attempts, TableMetadata table, DecoratedKey partitionKey, ConsistencyLevel consistency, Type type)
+    {
+        if (attempts >= traceAfterAttempts && !Tracing.isTracing())
+        {
+            Tracing.instance.newSession(Tracing.TraceType.QUERY);
+            Tracing.instance.begin(type.traceTitle,
+                                   ImmutableMap.of(
+                                       "keyspace", table.keyspace,
+                                       "table", table.name,
+                                       "partitionKey", table.partitionKeyType.getString(partitionKey.getKey()),
+                                       "consistency", consistency.name(),
+                                       "kind", type.lowercase
+                                   ));
+
+            logger.info("Tracing contended paxos {} for key {} on {}.{} with trace id {}",
+                        type.lowercase,
+                        ByteBufferUtil.bytesToHex(partitionKey.getKey()),
+                        table.keyspace, table.name,
+                        Tracing.instance.getSessionId());
+        }
+
+        long minWaitMicros = min.get(attempts);
+        long maxWaitMicros = max.get(attempts);
+        long minDeltaMicros = minDelta.get(attempts);
+
+        if (minWaitMicros + minDeltaMicros > maxWaitMicros)
+        {
+            maxWaitMicros = minWaitMicros + minDeltaMicros;
+            if (maxWaitMicros > this.max.max)
+            {
+                maxWaitMicros = this.max.max;
+                minWaitMicros = max(this.min.min, min(this.min.max, maxWaitMicros - minDeltaMicros));
+            }
+        }
+
+        long wait = waitRandomizer.wait(minWaitMicros, maxWaitMicros, attempts);
+        return nanoTime() + MICROSECONDS.toNanos(wait);
+    }
+
+    boolean doWaitForContention(long deadline, int attempts, TableMetadata table, DecoratedKey partitionKey, ConsistencyLevel consistency, Type type)
+    {
+        long until = computeWaitUntilForContention(attempts, table, partitionKey, consistency, type);
+        if (until >= deadline)
+            return false;
+
+        try
+        {
+            waitUntil(until);
+        }
+        catch (InterruptedException e)
+        {
+            Thread.currentThread().interrupt();
+            return false;
+        }
+        return true;
+    }
+
+    static boolean waitForContention(long deadline, int attempts, TableMetadata table, DecoratedKey partitionKey, ConsistencyLevel consistency, Type type)
+    {
+        return current.doWaitForContention(deadline, attempts, table, partitionKey, consistency, type);
+    }
+
+    static long waitUntilForContention(int attempts, TableMetadata table, DecoratedKey partitionKey, ConsistencyLevel consistency, Type type)
+    {
+        return current.computeWaitUntilForContention(attempts, table, partitionKey, consistency, type);
+    }
+
+    static class ParsedStrategy
+    {
+        final String waitRandomizer, min, max, minDelta;
+        final ContentionStrategy strategy;
+
+        ParsedStrategy(String waitRandomizer, String min, String max, String minDelta, ContentionStrategy strategy)
+        {
+            this.waitRandomizer = waitRandomizer;
+            this.min = min;
+            this.max = max;
+            this.minDelta = minDelta;
+            this.strategy = strategy;
+        }
+    }
+
+    @VisibleForTesting
+    static ParsedStrategy parseStrategy(String spec)
+    {
+        String[] args = spec.split(",");
+        String waitRandomizer = find(args, "random");
+        String min = find(args, "min");
+        String max = find(args, "max");
+        String minDelta = find(args, "delta");
+        String trace = find(args, "trace");
+
+        if (waitRandomizer == null) waitRandomizer = defaultWaitRandomizer();
+        if (min == null) min = defaultMinWait();
+        if (max == null) max = defaultMaxWait();
+        if (minDelta == null) minDelta = defaultMinDelta();
+        int traceAfterAttempts = trace == null ? current.traceAfterAttempts: Integer.parseInt(trace);
+
+        ContentionStrategy strategy = new ContentionStrategy(waitRandomizer, min, max, minDelta, traceAfterAttempts);
+        return new ParsedStrategy(waitRandomizer, min, max, minDelta, strategy);
+    }
+
+
+    public static void setStrategy(String spec)
+    {
+        ParsedStrategy parsed = parseStrategy(spec);
+        current = parsed.strategy;
+        setPaxosContentionWaitRandomizer(parsed.waitRandomizer);
+        setPaxosContentionMinWait(parsed.min);
+        setPaxosContentionMaxWait(parsed.max);
+        setPaxosContentionMinDelta(parsed.minDelta);
+    }
+
+    public static String getStrategySpec()
+    {
+        return "min=" + defaultMinWait()
+                + ",max=" + defaultMaxWait()
+                + ",delta=" + defaultMinDelta()
+                + ",random=" + defaultWaitRandomizer()
+                + ",trace=" + current.traceAfterAttempts;
+    }
+
+    private static String find(String[] args, String param)
+    {
+        return stream(args).filter(s -> s.startsWith(param + '='))
+                .map(s -> s.substring(param.length() + 1))
+                .findFirst().orElse(null);
+    }
+
+    private static LatencySelector parseLatencySelector(Matcher m, LatencySelectorFactory selectors)
+    {
+        String perc = m.group("perc");
+        if (perc == null)
+            return selectors.constant(parseInMicros(m.group("constbase")));
+
+        double percentile = parseDouble("0." + perc);
+        String rw = m.group("rw");
+        if (rw.length() == 2)
+            return selectors.maxReadWrite(percentile);
+        else if ("r".equals(rw))
+            return selectors.read(percentile);
+        else
+            return selectors.write(percentile);
+    }
+
+    private static LatencyModifier parseLatencyModifier(Matcher m, LatencyModifierFactory modifiers)
+    {
+        String mod = m.group("mod");
+        if (mod == null)
+            return modifiers.identity();
+
+        double modifier = parseDouble(mod);
+
+        String modkind = m.group("modkind");
+        if (modkind == null)
+            return modifiers.multiply(modifier);
+
+        if (modkind.startsWith("*"))
+            return modifiers.multiplyByAttempts(modifier);
+        else if (modkind.startsWith("^"))
+            return modifiers.multiplyByAttemptsExp(modifier);
+        else
+            throw new IllegalArgumentException("Unrecognised attempt modifier: " + modkind);
+    }
+
+    static long saturatedCast(double v)
+    {
+        if (v > Long.MAX_VALUE)
+            return Long.MAX_VALUE;
+        return (long) v;
+    }
+
+    static WaitRandomizer parseWaitRandomizer(String input)
+    {
+        return parseWaitRandomizer(input, randomizers);
+    }
+
+    static WaitRandomizer parseWaitRandomizer(String input, WaitRandomizerFactory randomizers)
+    {
+        Matcher m = RANDOMIZER.matcher(input);
+        if (!m.matches())
+            throw new IllegalArgumentException(input + " does not match" + RANDOMIZER);
+
+        String exp;
+        exp = m.group("exp");
+        if (exp != null)
+            return randomizers.exponential(Double.parseDouble(exp));
+        exp = m.group("qexp");
+        if (exp != null)
+            return randomizers.quantizedExponential(Double.parseDouble(exp));
+        return randomizers.uniform();
+    }
+
+    static Bound parseBound(String input, boolean isMin)
+    {
+        return parseBound(input, isMin, selectors, modifiers);
+    }
+
+    @VisibleForTesting
+    static Bound parseBound(String input, boolean isMin, LatencySelectorFactory selectors, LatencyModifierFactory modifiers)
+    {
+        Matcher m = BOUND.matcher(input);
+        if (!m.matches())
+            throw new IllegalArgumentException(input + " does not match " + BOUND);
+
+        String maybeConst = m.group("const");
+        if (maybeConst != null)
+        {
+            long v = parseInMicros(maybeConst);
+            return new Bound(v, v, v, modifiers.identity(), selectors.constant(v));
+        }
+
+        long min = parseInMicros(m.group("min"), 0);
+        long max = parseInMicros(m.group("max"), maxQueryTimeoutMicros() / 2);
+        return new Bound(min, max, isMin ? min : max, parseLatencyModifier(m, modifiers), parseLatencySelector(m, selectors));
+    }
+
+    private static long parseInMicros(String input, long orElse)
+    {
+        if (input == null)
+            return orElse;
+
+        return parseInMicros(input);
+    }
+
+    private static long parseInMicros(String input)
+    {
+        Matcher m = TIME.matcher(input);
+        if (!m.matches())
+            throw new IllegalArgumentException(input + " does not match " + TIME);
+
+        String text;
+        if (null != (text = m.group(1)))
+            return parseInt(text) * 1000;
+        else if (null != (text = m.group(2)))
+            return parseInt(text);
+        else
+            return 0;
+    }
+
+    @VisibleForTesting
+    static String defaultWaitRandomizer()
+    {
+        return orElse(DatabaseDescriptor::getPaxosContentionWaitRandomizer, DEFAULT_WAIT_RANDOMIZER);
+    }
+
+    @VisibleForTesting
+    static String defaultMinWait()
+    {
+        return orElse(DatabaseDescriptor::getPaxosContentionMinWait, DEFAULT_MIN);
+    }
+
+    @VisibleForTesting
+    static String defaultMaxWait()
+    {
+        return orElse(DatabaseDescriptor::getPaxosContentionMaxWait, DEFAULT_MAX);
+    }
+
+    @VisibleForTesting
+    static String defaultMinDelta()
+    {
+        return orElse(DatabaseDescriptor::getPaxosContentionMinDelta, DEFAULT_MIN_DELTA);
+    }
+
+    @VisibleForTesting
+    static long maxQueryTimeoutMicros()
+    {
+        return max(max(getCasContentionTimeout(MICROSECONDS), getWriteRpcTimeout(MICROSECONDS)), getReadRpcTimeout(MICROSECONDS));
+    }
+
+    private static String orElse(Supplier<String> get, String orElse)
+    {
+        String result = get.get();
+        return result != null ? result : orElse;
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/Paxos.java b/src/java/org/apache/cassandra/service/paxos/Paxos.java
new file mode 100644
index 0000000..bf5f90e
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/Paxos.java
@@ -0,0 +1,1255 @@
+/*
+ * 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.service.paxos;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import javax.annotation.Nullable;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Maps;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.codahale.metrics.Meter;
+import org.apache.cassandra.exceptions.CasWriteTimeoutException;
+import org.apache.cassandra.exceptions.ExceptionCode;
+import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.locator.AbstractReplicationStrategy;
+import org.apache.cassandra.locator.EndpointsForToken;
+import org.apache.cassandra.locator.InOurDc;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.ReplicaLayout;
+import org.apache.cassandra.locator.ReplicaLayout.ForTokenWrite;
+import org.apache.cassandra.locator.ReplicaPlan.ForRead;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.SinglePartitionReadCommand;
+import org.apache.cassandra.db.WriteType;
+import org.apache.cassandra.db.partitions.FilteredPartition;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.db.partitions.PartitionIterators;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.rows.RowIterator;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.exceptions.IsBootstrappingException;
+import org.apache.cassandra.exceptions.ReadFailureException;
+import org.apache.cassandra.exceptions.ReadTimeoutException;
+import org.apache.cassandra.exceptions.RequestExecutionException;
+import org.apache.cassandra.exceptions.RequestFailureException;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.exceptions.RequestTimeoutException;
+import org.apache.cassandra.exceptions.UnavailableException;
+import org.apache.cassandra.exceptions.WriteFailureException;
+import org.apache.cassandra.exceptions.WriteTimeoutException;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.metrics.ClientRequestMetrics;
+import org.apache.cassandra.service.CASRequest;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.FailureRecordingCallback.AsMap;
+import org.apache.cassandra.service.paxos.Commit.Proposal;
+import org.apache.cassandra.service.reads.DataResolver;
+import org.apache.cassandra.service.reads.repair.NoopReadRepair;
+import org.apache.cassandra.service.paxos.cleanup.PaxosTableRepairs;
+import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.triggers.TriggerExecutor;
+import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.CollectionSerializer;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.service.paxos.PaxosPrepare.FoundIncompleteAccepted;
+import org.apache.cassandra.service.paxos.PaxosPrepare.FoundIncompleteCommitted;
+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.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;
+import static org.apache.cassandra.gms.ApplicationState.RELEASE_VERSION;
+import static org.apache.cassandra.config.DatabaseDescriptor.*;
+import static org.apache.cassandra.db.ConsistencyLevel.*;
+import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
+import static org.apache.cassandra.locator.ReplicaLayout.forTokenWriteLiveAndDown;
+import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casReadMetrics;
+import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.casWriteMetrics;
+import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.readMetrics;
+import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.readMetricsMap;
+import static org.apache.cassandra.metrics.ClientRequestsMetricsHolder.writeMetricsMap;
+import static org.apache.cassandra.service.paxos.Ballot.Flag.GLOBAL;
+import static org.apache.cassandra.service.paxos.Ballot.Flag.LOCAL;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.nextBallot;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.staleBallot;
+import static org.apache.cassandra.service.paxos.ContentionStrategy.*;
+import static org.apache.cassandra.service.paxos.ContentionStrategy.Type.READ;
+import static org.apache.cassandra.service.paxos.ContentionStrategy.Type.WRITE;
+import static org.apache.cassandra.service.paxos.PaxosCommit.commit;
+import static org.apache.cassandra.service.paxos.PaxosCommitAndPrepare.commitAndPrepare;
+import static org.apache.cassandra.service.paxos.PaxosPrepare.prepare;
+import static org.apache.cassandra.service.paxos.PaxosPropose.propose;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.CollectionSerializer.newHashSet;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+import static org.apache.cassandra.utils.NoSpamLogger.Level.WARN;
+
+/**
+ * <p>This class serves as an entry-point to Cassandra's implementation of Paxos Consensus.
+ * Note that Cassandra does not utilise the distinguished proposer (Multi Paxos) optimisation;
+ * each operation executes its own instance of Paxos Consensus. Instead Cassandra employs
+ * various optimisations to reduce the overhead of operations. This may lead to higher throughput
+ * and lower overhead read operations, at the expense of contention during mixed or write-heavy workloads.
+ *
+ * Firstly, note that we do not follow Lamport's formulation, instead following the more common approach in
+ * literature (see e.g. Dr. Heidi Howard's dissertation) of permitting any acceptor to vote on a proposal,
+ * not only those who issued a promise.
+ *
+ * <h2>No Commit of Empty Proposals</h2>
+ * <p>If a proposal is empty, there can be no effect to the state, so once this empty proposal has poisoned any earlier
+ * proposal it is safe to stop processing. An empty proposal effectively scrubs the instance of consensus being
+ * performed once it has reached a quorum, as no earlier incomplete proposal (that may perhaps have reached a minority)
+ * may now be completed.
+ *
+ * <h2>Fast Read / Failed Write</h2>
+ * <p>This optimisation relies on every voter having no incomplete promises, i.e. their commit register must be greater
+ * than or equal to their promise and proposal registers (or there must be such an empty proposal).
+ * Since the operation we are performing must invalidate any nascent operation that has reached a minority, and will
+ * itself be invalidated by any newer write it might race with, we are only concerned about operations that might be
+ * in-flight and incomplete. If we reach a quorum without any incomplete proposal, we prevent any incomplete proposal
+ * that might have come before us from being committed, and so are correctly ordered.
+ *
+ * <p>NOTE: we could likely weaken this further, permitting a fast operation if we witness a stale incomplete operation
+ * on one or more of the replicas, so long as we witness _some_ response that had knowledge of that operation's decision,
+ * however we might waste more time performing optimistic reads (which we skip if we witness any in progress promise)
+ *
+ * <h2>Read Commutativity Optimisation</h2>
+ * <p>We separate read and write promises into distinct registers. Since reads are commutative they do not need to be
+ * ordered with respect to each other, so read promises consult only the write promise register to find competing
+ * operations, whereas writes consult both read and write registers. This permits better utilisation of the Fast Read
+ * optimisation, permitting arbitrarily many fast reads to execute concurrently.
+ *
+ * <p>A read will use its promise to finish any in progress write it encounters, but note that this is safe for multiple
+ * reads to attempt simultaneously. If a write operation has not reached a quorum of promises then it has no effect,
+ * so while some read operations may attempt to complete it and others may not, the operation will only be invalidated
+ * and these actions will be equivalent. If the write had reached a quorum of promises then every reads will attempt
+ * to complete the write. At the accept phase, only the most recent read promise will be accepted so whether the write
+ * proposal had reached a quorum or not, a consistent outcome will result.
+ *
+ * <h2>Reproposal Avoidance</h2>
+ * <p>It can occur that two (or more) commands begin competing to re-propose the same incomplete command even after it
+ * has already committed - this can occur when an in progress command that has reached the commit condition (but not yet
+ * committed) is encountered by a promise, so that it is re-proposed. If the original coordinator does not fail this
+ * original command will be committed normally, but the re-proposal can take on a life of its own, and become contended
+ * and re-proposed indefinitely. By having reproposals use the original proposal ballot's timestamp we spot this situation
+ * and consider re-proposals of a command we have seen committed to be (in effect) empty proposals.
+ *
+ * <h2>Durability of Asynchronous Commit</h2>
+ * To permit asynchronous commit (and also because we should) we ensure commits are durable once a proposal has been
+ * accepted by a majority.
+ *
+ * Replicas track commands that have *locally* been witnessed but not committed. They may clear this log by performing
+ * a round of Paxos Repair for each key in the log (which is simply a round of Paxos that tries not to interfere with
+ * future rounds of Paxos, while aiming to complete any earlier incomplete round).
+ *
+ * By selecting some quorum of replicas for a range to perform this operation on, once successful we guarantee that
+ * any transaction that had previously been accepted by a majority has been committed, and any transaction that had been
+ * previously witnessed by a majority has been either committed or invalidated.
+ *
+ * To ensure durability across range movements, once a joining node becomes pending such a coordinated paxos repair
+ * is performed prior to performing bootstrap, so that commands initiated before joining will either be bootstrapped
+ * or completed by paxos repair to be committed to a majority that includes the new node in its calculations, and
+ * commands initiated after will anyway do so due to being pending.
+ *
+ * Finally, for greater guarantees across range movements despite the uncertainty of gossip, paxos operations validate
+ * ring information with each other while seeking a quorum of promises. Any inconsistency is resolved by synchronising
+ * gossip state between the coordinator and the peers in question.
+ *
+ * <h2>Clearing of Paxos State</h2>
+ * Coordinated paxos repairs as described above are preceded by an preparation step that determines a ballot below
+ * which we agree to reject new promises. By deciding and disseminating this point prior to performing a coordinated
+ * paxos repair, once complete we have ensured that all commands with a lower ballot are either committed or invalidated,
+ * and so we are then able to disseminate this ballot as a bound below which may expunge all data for the range.
+ *
+ * For consistency of execution coordinators seek this latter ballot bound from each replica and, using the maximum of
+ * these, ignore all data received associated with ballots lower than this bound.
+ */
+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"));
+
+    static class Electorate implements Iterable<InetAddressAndPort>
+    {
+        static final Serializer serializer = new Serializer();
+
+        // all replicas, including pending, but without those in a remote DC if consistency is local
+        final Collection<InetAddressAndPort> natural;
+
+        // pending subset of electorate
+        final Collection<InetAddressAndPort> pending;
+
+        public Electorate(Collection<InetAddressAndPort> natural, Collection<InetAddressAndPort> pending)
+        {
+            this.natural = natural;
+            this.pending = pending;
+        }
+
+        public int size()
+        {
+            return natural.size() + pending.size();
+        }
+
+        @Override
+        public Iterator<InetAddressAndPort> iterator()
+        {
+            return Iterators.concat(natural.iterator(), pending.iterator());
+        }
+
+        static Electorate get(TableMetadata table, DecoratedKey key, ConsistencyLevel consistency)
+        {
+            return get(consistency, forTokenWriteLiveAndDown(Keyspace.open(table.keyspace), key.getToken()));
+        }
+
+        static Electorate get(ConsistencyLevel consistency, ForTokenWrite all)
+        {
+            ForTokenWrite electorate = all;
+            if (consistency == LOCAL_SERIAL)
+                electorate = all.filter(InOurDc.replicas());
+
+            return new Electorate(electorate.natural().endpointList(), electorate.pending().endpointList());
+        }
+
+        boolean hasPending()
+        {
+            return !pending.isEmpty();
+        }
+
+        boolean isPending(InetAddressAndPort endpoint)
+        {
+            return hasPending() && pending.contains(endpoint);
+        }
+
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Electorate that = (Electorate) o;
+            return natural.equals(that.natural) && pending.equals(that.pending);
+        }
+
+        public int hashCode()
+        {
+            return Objects.hash(natural, pending);
+        }
+
+        public String toString()
+        {
+            return "{" + natural + ", " + pending + '}';
+        }
+
+        static class Serializer implements IVersionedSerializer<Electorate>
+        {
+            public void serialize(Electorate electorate, DataOutputPlus out, int version) throws IOException
+            {
+                CollectionSerializer.serializeCollection(inetAddressAndPortSerializer, electorate.natural, out, version);
+                CollectionSerializer.serializeCollection(inetAddressAndPortSerializer, electorate.pending, out, version);
+            }
+
+            public Electorate deserialize(DataInputPlus in, int version) throws IOException
+            {
+                Set<InetAddressAndPort> endpoints = CollectionSerializer.deserializeCollection(inetAddressAndPortSerializer, newHashSet(), in, version);
+                Set<InetAddressAndPort> pending = CollectionSerializer.deserializeCollection(inetAddressAndPortSerializer, newHashSet(), in, version);
+                return new Electorate(endpoints, pending);
+            }
+
+            public long serializedSize(Electorate electorate, int version)
+            {
+                return CollectionSerializer.serializedSizeCollection(inetAddressAndPortSerializer, electorate.natural, version) +
+                       CollectionSerializer.serializedSizeCollection(inetAddressAndPortSerializer, electorate.pending, version);
+            }
+        }
+    }
+
+    /**
+     * Encapsulates the peers we will talk to for this operation.
+     */
+    static class Participants implements ForRead<EndpointsForToken, Participants>, Supplier<Participants>
+    {
+        final Keyspace keyspace;
+
+        final AbstractReplicationStrategy replicationStrategy;
+
+        /**
+         * SERIAL or LOCAL_SERIAL
+         */
+        final ConsistencyLevel consistencyForConsensus;
+
+        /**
+         * Those members that vote for {@link #consistencyForConsensus}
+         */
+        final Electorate electorate;
+
+        /**
+         * Those members of {@link #electorate} that we will 'poll' for their vote
+         * i.e. {@link #electorate} with down nodes removed
+         */
+
+        private final EndpointsForToken electorateNatural;
+        final EndpointsForToken electorateLive;
+
+        final EndpointsForToken all;
+        final EndpointsForToken allLive;
+        final EndpointsForToken allDown;
+        final EndpointsForToken pending;
+
+        /**
+         * The number of responses we require to reach desired consistency from members of {@code contact}
+         */
+        final int sizeOfConsensusQuorum;
+
+        /**
+         * The number of read responses we require to reach desired consistency from members of {@code contact}
+         * Note that this should always be met if {@link #sizeOfConsensusQuorum} is met, but we supply it separately
+         * for corroboration.
+         */
+        final int sizeOfReadQuorum;
+
+        Participants(Keyspace keyspace, ConsistencyLevel consistencyForConsensus, ReplicaLayout.ForTokenWrite all, ReplicaLayout.ForTokenWrite electorate, EndpointsForToken live)
+        {
+            this.keyspace = keyspace;
+            this.replicationStrategy = all.replicationStrategy();
+            this.consistencyForConsensus = consistencyForConsensus;
+            this.all = all.all();
+            this.pending = all.pending();
+            this.allDown = all.all() == live ? EndpointsForToken.empty(all.token()) : all.all().without(live.endpoints());
+            this.electorate = new Electorate(electorate.natural().endpointList(), electorate.pending().endpointList());
+            this.electorateNatural = electorate.natural();
+            this.electorateLive = electorate.all() == live ? live : electorate.all().keep(live.endpoints());
+            this.allLive = live;
+            this.sizeOfReadQuorum = electorate.natural().size() / 2 + 1;
+            this.sizeOfConsensusQuorum = sizeOfReadQuorum + electorate.pending().size();
+        }
+
+        @Override
+        public int readQuorum()
+        {
+            return sizeOfReadQuorum;
+        }
+
+        @Override
+        public EndpointsForToken readCandidates()
+        {
+            // Note: we could probably return electorateLive here and save a reference, but it's not strictly correct
+            return electorateNatural;
+        }
+
+        static Participants get(TableMetadata table, Token token, ConsistencyLevel consistencyForConsensus)
+        {
+            Keyspace keyspace = Keyspace.open(table.keyspace);
+            ReplicaLayout.ForTokenWrite all = forTokenWriteLiveAndDown(keyspace, token);
+            ReplicaLayout.ForTokenWrite electorate = consistencyForConsensus.isDatacenterLocal()
+                                                     ? all.filter(InOurDc.replicas()) : all;
+
+            EndpointsForToken live = all.all().filter(FailureDetector.isReplicaAlive);
+
+            return new Participants(keyspace, consistencyForConsensus, all, electorate, live);
+        }
+
+        static Participants get(TableMetadata cfm, DecoratedKey key, ConsistencyLevel consistency)
+        {
+            return get(cfm, key.getToken(), consistency);
+        }
+
+        int sizeOfPoll()
+        {
+            return electorateLive.size();
+        }
+
+        InetAddressAndPort voter(int i)
+        {
+            return electorateLive.endpoint(i);
+        }
+
+        void assureSufficientLiveNodes(boolean isWrite) throws UnavailableException
+        {
+            if (sizeOfConsensusQuorum > sizeOfPoll())
+            {
+                mark(isWrite, m -> m.unavailables, consistencyForConsensus);
+                throw new UnavailableException("Cannot achieve consistency level " + consistencyForConsensus, consistencyForConsensus, sizeOfConsensusQuorum, sizeOfPoll());
+            }
+        }
+
+        void assureSufficientLiveNodesForRepair() throws UnavailableException
+        {
+            if (sizeOfConsensusQuorum > sizeOfPoll())
+            {
+                throw UnavailableException.create(consistencyForConsensus, sizeOfConsensusQuorum, sizeOfPoll());
+            }
+        }
+
+        int requiredFor(ConsistencyLevel consistency)
+        {
+            if (consistency == Paxos.nonSerial(consistencyForConsensus))
+                return sizeOfConsensusQuorum;
+
+            return consistency.blockForWrite(replicationStrategy(), pending);
+        }
+
+        public boolean hasOldParticipants()
+        {
+            return electorateLive.anyMatch(Paxos::isOldParticipant);
+        }
+
+        @Override
+        public Participants get()
+        {
+            return this;
+        }
+
+        @Override
+        public Keyspace keyspace()
+        {
+            return keyspace;
+        }
+
+        @Override
+        public AbstractReplicationStrategy replicationStrategy()
+        {
+            return replicationStrategy;
+        }
+
+        @Override
+        public ConsistencyLevel consistencyLevel()
+        {
+            return nonSerial(consistencyForConsensus);
+        }
+
+        @Override
+        public EndpointsForToken contacts()
+        {
+            return electorateLive;
+        }
+
+        @Override
+        public Replica lookup(InetAddressAndPort endpoint)
+        {
+            return all.lookup(endpoint);
+        }
+
+        @Override
+        public Participants withContacts(EndpointsForToken newContacts)
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    /**
+     * Encapsulates information about a failure to reach Success, either because of explicit failure responses
+     * or insufficient responses (in which case the status is not final)
+     */
+    static class MaybeFailure
+    {
+        final boolean isFailure;
+        final String serverError;
+        final int contacted;
+        final int required;
+        final int successes;
+        final Map<InetAddressAndPort, RequestFailureReason> failures;
+
+        static MaybeFailure noResponses(Participants contacted)
+        {
+            return new MaybeFailure(false, contacted.sizeOfPoll(), contacted.sizeOfConsensusQuorum, 0, emptyMap());
+        }
+
+        MaybeFailure(Participants contacted, int successes, AsMap failures)
+        {
+            this(contacted.sizeOfPoll() - failures.failureCount() < contacted.sizeOfConsensusQuorum, contacted.sizeOfPoll(), contacted.sizeOfConsensusQuorum, successes, failures);
+        }
+
+        MaybeFailure(int contacted, int required, int successes, AsMap failures)
+        {
+            this(contacted - failures.failureCount() < required, contacted, required, successes, failures);
+        }
+
+        MaybeFailure(boolean isFailure, int contacted, int required, int successes, Map<InetAddressAndPort, RequestFailureReason> failures)
+        {
+            this(isFailure, null, contacted, required, successes, failures);
+        }
+
+        MaybeFailure(boolean isFailure, String serverError, int contacted, int required, int successes, Map<InetAddressAndPort, RequestFailureReason> failures)
+        {
+            this.isFailure = isFailure;
+            this.serverError = serverError;
+            this.contacted = contacted;
+            this.required = required;
+            this.successes = successes;
+            this.failures = failures;
+        }
+
+        private static int failureCount(Map<InetAddressAndPort, RequestFailureReason> failures)
+        {
+            int count = 0;
+            for (RequestFailureReason reason : failures.values())
+                count += reason != TIMEOUT ? 1 : 0;
+            return count;
+        }
+
+        /**
+         * update relevant counters and throw the relevant exception
+         */
+        RequestExecutionException markAndThrowAsTimeoutOrFailure(boolean isWrite, ConsistencyLevel consistency, int failedAttemptsDueToContention)
+        {
+            if (isFailure)
+            {
+                mark(isWrite, m -> m.failures, consistency);
+                throw serverError != null ? new RequestFailureException(ExceptionCode.SERVER_ERROR, serverError, consistency, successes, required, failures)
+                                          : isWrite
+                                            ? new WriteFailureException(consistency, successes, required, WriteType.CAS, failures)
+                                            : new ReadFailureException(consistency, successes, required, false, failures);
+            }
+            else
+            {
+                mark(isWrite, m -> m.timeouts, consistency);
+                throw isWrite
+                        ? new CasWriteTimeoutException(WriteType.CAS, consistency, successes, required, failedAttemptsDueToContention)
+                        : new ReadTimeoutException(consistency, successes, required, false);
+            }
+        }
+
+        public String toString()
+        {
+            return (isFailure ? "Failure(" : "Timeout(") + successes + ',' + failures + ')';
+        }
+    }
+
+    public interface Async<Result>
+    {
+        Result awaitUntil(long until);
+    }
+
+    /**
+     * Apply @param updates if and only if the current values in the row for @param key
+     * match the provided @param conditions.  The algorithm is "raw" Paxos: that is, Paxos
+     * minus leader election -- any node in the cluster may propose changes for any partition.
+     *
+     * The Paxos electorate consists only of the replicas for the partition key.
+     * We expect performance to be reasonable, but CAS is still intended to be used
+     * "when you really need it," not for all your updates.
+     *
+     * There are three phases to Paxos:
+     *  1. Prepare: the coordinator generates a ballot (Ballot in our case) and asks replicas to
+     *     - promise not to accept updates from older ballots and
+     *     - tell us about the latest ballots it has already _promised_, _accepted_, or _committed_
+     *     - reads the necessary data to evaluate our CAS condition
+     *
+     *  2. Propose: if a majority of replicas reply, the coordinator asks replicas to accept the value of the
+     *     highest proposal ballot it heard about, or a new value if no in-progress proposals were reported.
+     *  3. Commit (Learn): if a majority of replicas acknowledge the accept request, we can commit the new
+     *     value.
+     *
+     *  Commit procedure is not covered in "Paxos Made Simple," and only briefly mentioned in "Paxos Made Live,"
+     *  so here is our approach:
+     *   3a. The coordinator sends a commit message to all replicas with the ballot and value.
+     *   3b. Because of 1-2, this will be the highest-seen commit ballot.  The replicas will note that,
+     *       and send it with subsequent promise replies.  This allows us to discard acceptance records
+     *       for successfully committed replicas, without allowing incomplete proposals to commit erroneously
+     *       later on.
+     *
+     *  Note that since we are performing a CAS rather than a simple update, when nodes respond positively to
+     *  Prepare, they include read response of commited values that will be reconciled on the coordinator
+     *  and checked against CAS precondition between the prepare and accept phases. This gives us a slightly
+     *  longer window for another coordinator to come along and trump our own promise with a newer one but
+     *  is otherwise safe.
+     *
+     *  Any successful prepare phase yielding a read that rejects the condition must be followed by the proposal of
+     *  an empty update, to ensure the evaluation of the condition is linearized with respect to other reads and writes.
+     *
+     * @param key the row key for the row to CAS
+     * @param request the conditions for the CAS to apply as well as the update to perform if the conditions hold.
+     * @param consistencyForConsensus the consistency for the paxos prepare and propose round. This can only be either SERIAL or LOCAL_SERIAL.
+     * @param consistencyForCommit the consistency for write done during the commit phase. This can be anything, except SERIAL or LOCAL_SERIAL.
+     *
+     * @return null if the operation succeeds in updating the row, or the current values corresponding to conditions.
+     * (since, if the CAS doesn't succeed, it means the current value do not match the conditions).
+     */
+    public static RowIterator cas(DecoratedKey key,
+                                  CASRequest request,
+                                  ConsistencyLevel consistencyForConsensus,
+                                  ConsistencyLevel consistencyForCommit,
+                                  ClientState clientState)
+            throws UnavailableException, IsBootstrappingException, RequestFailureException, RequestTimeoutException, InvalidRequestException
+    {
+        final long start = nanoTime();
+        final long proposeDeadline = start + getCasContentionTimeout(NANOSECONDS);
+        final long commitDeadline = Math.max(proposeDeadline, start + getWriteRpcTimeout(NANOSECONDS));
+        return cas(key, request, consistencyForConsensus, consistencyForCommit, clientState, start, proposeDeadline, commitDeadline);
+    }
+    public static RowIterator cas(DecoratedKey key,
+                                  CASRequest request,
+                                  ConsistencyLevel consistencyForConsensus,
+                                  ConsistencyLevel consistencyForCommit,
+                                  ClientState clientState,
+                                  long proposeDeadline,
+                                  long commitDeadline
+                                  )
+            throws UnavailableException, IsBootstrappingException, RequestFailureException, RequestTimeoutException, InvalidRequestException
+    {
+        return cas(key, request, consistencyForConsensus, consistencyForCommit, clientState, nanoTime(), proposeDeadline, commitDeadline);
+    }
+    private static RowIterator cas(DecoratedKey partitionKey,
+                                  CASRequest request,
+                                  ConsistencyLevel consistencyForConsensus,
+                                  ConsistencyLevel consistencyForCommit,
+                                  ClientState clientState,
+                                  long start,
+                                  long proposeDeadline,
+                                  long commitDeadline
+                                  )
+            throws UnavailableException, IsBootstrappingException, RequestFailureException, RequestTimeoutException, InvalidRequestException
+    {
+        SinglePartitionReadCommand readCommand = request.readCommand(FBUtilities.nowInSeconds());
+        TableMetadata metadata = readCommand.metadata();
+
+        consistencyForConsensus.validateForCas();
+        consistencyForCommit.validateForCasCommit(Keyspace.open(metadata.keyspace).getReplicationStrategy());
+
+        Ballot minimumBallot = null;
+        int failedAttemptsDueToContention = 0;
+        try (PaxosOperationLock lock = PaxosState.lock(partitionKey, metadata, proposeDeadline, consistencyForConsensus, true))
+        {
+            Paxos.Async<PaxosCommit.Status> commit = null;
+            done: while (true)
+            {
+                // read the current values and check they validate the conditions
+                Tracing.trace("Reading existing values for CAS precondition");
+
+                BeginResult begin = begin(proposeDeadline, readCommand, consistencyForConsensus,
+                        true, minimumBallot, failedAttemptsDueToContention);
+                Ballot ballot = begin.ballot;
+                Participants participants = begin.participants;
+                failedAttemptsDueToContention = begin.failedAttemptsDueToContention;
+
+                FilteredPartition current;
+                try (RowIterator iter = PartitionIterators.getOnlyElement(begin.readResponse, readCommand))
+                {
+                    current = FilteredPartition.create(iter);
+                }
+
+                Proposal proposal;
+                boolean conditionMet = request.appliesTo(current);
+                if (!conditionMet)
+                {
+                    if (getPaxosVariant() == v2_without_linearizable_reads_or_rejected_writes)
+                    {
+                        Tracing.trace("CAS precondition rejected", current);
+                        casWriteMetrics.conditionNotMet.inc();
+                        return current.rowIterator();
+                    }
+
+                    // If we failed to meet our condition, it does not mean we can do nothing: if we do not propose
+                    // anything that is accepted by a quorum, it is possible for our !conditionMet state
+                    // to not be serialized wrt other operations.
+                    // If a later read encounters an "in progress" write that did not reach a majority,
+                    // but that would have permitted conditionMet had it done so (and hence we evidently did not witness),
+                    // that operation will complete the in-progress proposal before continuing, so that this and future
+                    // reads will perceive conditionMet without any intervening modification from the time at which we
+                    // assured a conditional write that !conditionMet.
+                    // So our evaluation is only serialized if we invalidate any in progress operations by proposing an empty update
+                    // See also CASSANDRA-12126
+                    if (begin.isLinearizableRead)
+                    {
+                        Tracing.trace("CAS precondition does not match current values {}; read is already linearizable; aborting", current);
+                        return conditionNotMet(current);
+                    }
+
+                    Tracing.trace("CAS precondition does not match current values {}; proposing empty update", current);
+                    proposal = Proposal.empty(ballot, partitionKey, metadata);
+                }
+                else if (begin.isPromised)
+                {
+                    // finish the paxos round w/ the desired updates
+                    // TODO "turn null updates into delete?" - what does this TODO even mean?
+                    PartitionUpdate updates = request.makeUpdates(current, clientState, begin.ballot);
+
+                    // Apply triggers to cas updates. A consideration here is that
+                    // triggers emit Mutations, and so a given trigger implementation
+                    // may generate mutations for partitions other than the one this
+                    // paxos round is scoped for. In this case, TriggerExecutor will
+                    // validate that the generated mutations are targetted at the same
+                    // partition as the initial updates and reject (via an
+                    // InvalidRequestException) any which aren't.
+                    updates = TriggerExecutor.instance.execute(updates);
+
+                    proposal = Proposal.of(ballot, updates);
+                    Tracing.trace("CAS precondition is met; proposing client-requested updates for {}", ballot);
+                }
+                else
+                {
+                    // must retry, as only achieved read success in begin
+                    Tracing.trace("CAS precondition is met, but ballot stale for proposal; retrying", current);
+                    continue;
+                }
+
+                PaxosPropose.Status propose = propose(proposal, participants, conditionMet).awaitUntil(proposeDeadline);
+                switch (propose.outcome)
+                {
+                    default: throw new IllegalStateException();
+
+                    case MAYBE_FAILURE:
+                        throw propose.maybeFailure().markAndThrowAsTimeoutOrFailure(true, consistencyForConsensus, failedAttemptsDueToContention);
+
+                    case SUCCESS:
+                    {
+                        if (!conditionMet)
+                            return conditionNotMet(current);
+
+                        // no need to commit a no-op; either it
+                        //   1) reached a majority, in which case it was agreed, had no effect and we can do nothing; or
+                        //   2) did not reach a majority, was not agreed, and was not user visible as a result so we can ignore it
+                        if (!proposal.update.isEmpty())
+                            commit = commit(proposal.agreed(), participants, consistencyForConsensus, consistencyForCommit, true);
+
+                        break done;
+                    }
+
+                    case SUPERSEDED:
+                    {
+                        switch (propose.superseded().hadSideEffects)
+                        {
+                            default: throw new IllegalStateException();
+
+                            case MAYBE:
+                                // We don't know if our update has been applied, as the competing ballot may have completed
+                                // our proposal.  We yield our uncertainty to the caller via timeout exception.
+                                // TODO: should return more useful result to client, and should also avoid this situation where possible
+                                throw new MaybeFailure(false, participants.sizeOfPoll(), participants.sizeOfConsensusQuorum, 0, emptyMap())
+                                        .markAndThrowAsTimeoutOrFailure(true, consistencyForConsensus, failedAttemptsDueToContention);
+
+                            case NO:
+                                minimumBallot = propose.superseded().by;
+                                // We have been superseded without our proposal being accepted by anyone, so we can safely retry
+                                Tracing.trace("Paxos proposal not accepted (pre-empted by a higher ballot)");
+                                if (!waitForContention(proposeDeadline, ++failedAttemptsDueToContention, metadata, partitionKey, consistencyForConsensus, WRITE))
+                                    throw MaybeFailure.noResponses(participants).markAndThrowAsTimeoutOrFailure(true, consistencyForConsensus, failedAttemptsDueToContention);
+                        }
+                    }
+                }
+                // continue to retry
+            }
+
+            if (commit != null)
+            {
+                PaxosCommit.Status result = commit.awaitUntil(commitDeadline);
+                if (!result.isSuccess())
+                    throw result.maybeFailure().markAndThrowAsTimeoutOrFailure(true, consistencyForCommit, failedAttemptsDueToContention);
+            }
+            Tracing.trace("CAS successful");
+            return null;
+
+        }
+        finally
+        {
+            final long latency = nanoTime() - start;
+
+            if (failedAttemptsDueToContention > 0)
+            {
+                casWriteMetrics.contention.update(failedAttemptsDueToContention);
+                openAndGetStore(metadata).metric.topCasPartitionContention.addSample(partitionKey.getKey(), failedAttemptsDueToContention);
+            }
+
+
+            casWriteMetrics.addNano(latency);
+            writeMetricsMap.get(consistencyForConsensus).addNano(latency);
+        }
+    }
+
+    private static RowIterator conditionNotMet(FilteredPartition read)
+    {
+        Tracing.trace("CAS precondition rejected", read);
+        casWriteMetrics.conditionNotMet.inc();
+        return read.rowIterator();
+    }
+
+    public static PartitionIterator read(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyForConsensus)
+            throws InvalidRequestException, UnavailableException, ReadFailureException, ReadTimeoutException
+    {
+        long start = nanoTime();
+        long deadline = start + DatabaseDescriptor.getReadRpcTimeout(NANOSECONDS);
+        return read(group, consistencyForConsensus, start, deadline);
+    }
+
+    public static PartitionIterator read(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyForConsensus, long deadline)
+            throws InvalidRequestException, UnavailableException, ReadFailureException, ReadTimeoutException
+    {
+        return read(group, consistencyForConsensus, nanoTime(), deadline);
+    }
+
+    private static PartitionIterator read(SinglePartitionReadCommand.Group group, ConsistencyLevel consistencyForConsensus, long start, long deadline)
+            throws InvalidRequestException, UnavailableException, ReadFailureException, ReadTimeoutException
+    {
+        if (group.queries.size() > 1)
+            throw new InvalidRequestException("SERIAL/LOCAL_SERIAL consistency may only be requested for one partition at a time");
+
+        int failedAttemptsDueToContention = 0;
+        Ballot minimumBallot = null;
+        SinglePartitionReadCommand read = group.queries.get(0);
+        try (PaxosOperationLock lock = PaxosState.lock(read.partitionKey(), read.metadata(), deadline, consistencyForConsensus, false))
+        {
+            while (true)
+            {
+                // does the work of applying in-progress writes; throws UAE or timeout if it can't
+                final BeginResult begin = begin(deadline, read, consistencyForConsensus, false, minimumBallot, failedAttemptsDueToContention);
+                failedAttemptsDueToContention = begin.failedAttemptsDueToContention;
+
+                switch (PAXOS_VARIANT)
+                {
+                    default: throw new AssertionError();
+
+                    case v2_without_linearizable_reads_or_rejected_writes:
+                    case v2_without_linearizable_reads:
+                        return begin.readResponse;
+
+                    case v2:
+                        // no need to submit an empty proposal, as the promise will be treated as complete for future optimistic reads
+                        if (begin.isLinearizableRead)
+                            return begin.readResponse;
+                }
+
+                Proposal proposal = Proposal.empty(begin.ballot, read.partitionKey(), read.metadata());
+                PaxosPropose.Status propose = propose(proposal, begin.participants, false).awaitUntil(deadline);
+                switch (propose.outcome)
+                {
+                    default: throw new IllegalStateException();
+
+                    case MAYBE_FAILURE:
+                        throw propose.maybeFailure().markAndThrowAsTimeoutOrFailure(false, consistencyForConsensus, failedAttemptsDueToContention);
+
+                    case SUCCESS:
+                        return begin.readResponse;
+
+                    case SUPERSEDED:
+                        switch (propose.superseded().hadSideEffects)
+                        {
+                            default: throw new IllegalStateException();
+
+                            case MAYBE:
+                                // We don't know if our update has been applied, as the competing ballot may have completed
+                                // our proposal.  We yield our uncertainty to the caller via timeout exception.
+                                // TODO: should return more useful result to client, and should also avoid this situation where possible
+                                throw new MaybeFailure(false, begin.participants.sizeOfPoll(), begin.participants.sizeOfConsensusQuorum, 0, emptyMap())
+                                      .markAndThrowAsTimeoutOrFailure(true, consistencyForConsensus, failedAttemptsDueToContention);
+
+                            case NO:
+                                minimumBallot = propose.superseded().by;
+                                // We have been superseded without our proposal being accepted by anyone, so we can safely retry
+                                Tracing.trace("Paxos proposal not accepted (pre-empted by a higher ballot)");
+                                if (!waitForContention(deadline, ++failedAttemptsDueToContention, group.metadata(), group.queries.get(0).partitionKey(), consistencyForConsensus, READ))
+                                    throw MaybeFailure.noResponses(begin.participants).markAndThrowAsTimeoutOrFailure(true, consistencyForConsensus, failedAttemptsDueToContention);
+                        }
+                }
+            }
+        }
+        finally
+        {
+            long latency = nanoTime() - start;
+            readMetrics.addNano(latency);
+            casReadMetrics.addNano(latency);
+            readMetricsMap.get(consistencyForConsensus).addNano(latency);
+            TableMetadata table = read.metadata();
+            Keyspace.open(table.keyspace).getColumnFamilyStore(table.name).metric.coordinatorReadLatency.update(latency, TimeUnit.NANOSECONDS);
+            if (failedAttemptsDueToContention > 0)
+                casReadMetrics.contention.update(failedAttemptsDueToContention);
+        }
+    }
+
+    static class BeginResult
+    {
+        final Ballot ballot;
+        final Participants participants;
+        final int failedAttemptsDueToContention;
+        final PartitionIterator readResponse;
+        final boolean isLinearizableRead;
+        final boolean isPromised;
+        final Ballot retryWithAtLeast;
+
+        public BeginResult(Ballot ballot, Participants participants, int failedAttemptsDueToContention, PartitionIterator readResponse, boolean isLinearizableRead, boolean isPromised, Ballot retryWithAtLeast)
+        {
+            assert isPromised || isLinearizableRead;
+            this.ballot = ballot;
+            this.participants = participants;
+            this.failedAttemptsDueToContention = failedAttemptsDueToContention;
+            this.readResponse = readResponse;
+            this.isLinearizableRead = isLinearizableRead;
+            this.isPromised = isPromised;
+            this.retryWithAtLeast = retryWithAtLeast;
+        }
+    }
+
+    /**
+     * Begin a Paxos operation by seeking promises from our electorate to be completed with proposals by our caller; and:
+     *
+     *  - Completing any in-progress proposals witnessed, that are not known to have reached the commit phase
+     *  - Completing any in-progress commits witnessed, that are not known to have reached a quorum of the electorate
+     *  - Retrying and backing-off under contention
+     *  - Detecting electorate mismatches with our peers and retrying to avoid non-overlapping
+     *    electorates agreeing operations
+     *  - Returning a resolved read response, and knowledge of if it is linearizable to read without proposing an empty update
+     *
+     * Optimisations:
+     *    - If the promises report an incomplete commit (but have been able to witness it in a read response)
+     *      we will submit the commit to those nodes that have not witnessed while waiting for those that have,
+     *      returning as soon as a quorum is known to have witnessed the commit
+     *    - If we witness an in-progress commit to complete, we batch the commit together with a new prepare
+     *      restarting our operation.
+     *    - If we witness an in-progress proposal to complete, after successfully proposing it we batch its
+     *      commit together with a new prepare restarting our operation.
+     *
+     * @return the Paxos ballot promised by the replicas if no in-progress requests were seen and a quorum of
+     * nodes have seen the mostRecentCommit.  Otherwise, return null.
+     */
+    @SuppressWarnings("resource")
+    private static BeginResult begin(long deadline,
+                                     SinglePartitionReadCommand query,
+                                     ConsistencyLevel consistencyForConsensus,
+                                     final boolean isWrite,
+                                     Ballot minimumBallot,
+                                     int failedAttemptsDueToContention)
+            throws WriteTimeoutException, WriteFailureException, ReadTimeoutException, ReadFailureException
+    {
+        boolean acceptEarlyReadPermission = !isWrite; // if we're reading, begin by assuming a read permission is sufficient
+        Participants initialParticipants = Participants.get(query.metadata(), query.partitionKey(), consistencyForConsensus);
+        initialParticipants.assureSufficientLiveNodes(isWrite);
+        PaxosPrepare preparing = prepare(minimumBallot, initialParticipants, query, isWrite, acceptEarlyReadPermission);
+        while (true)
+        {
+            // prepare
+            PaxosPrepare retry = null;
+            PaxosPrepare.Status prepare = preparing.awaitUntil(deadline);
+            boolean isPromised = false;
+            retry: switch (prepare.outcome)
+            {
+                default: throw new IllegalStateException();
+
+                case FOUND_INCOMPLETE_COMMITTED:
+                {
+                    FoundIncompleteCommitted incomplete = prepare.incompleteCommitted();
+                    Tracing.trace("Repairing replicas that missed the most recent commit");
+                    retry = commitAndPrepare(incomplete.committed, incomplete.participants, query, isWrite, acceptEarlyReadPermission);
+                    break;
+                }
+                case FOUND_INCOMPLETE_ACCEPTED:
+                {
+                    FoundIncompleteAccepted inProgress = prepare.incompleteAccepted();
+                    Tracing.trace("Finishing incomplete paxos round {}", inProgress.accepted);
+                    if (isWrite)
+                        casWriteMetrics.unfinishedCommit.inc();
+                    else
+                        casReadMetrics.unfinishedCommit.inc();
+
+                    // we DO NOT need to change the timestamp of this commit - either we or somebody else will finish it
+                    // and the original timestamp is correctly linearised. By not updatinig the timestamp we leave enough
+                    // information for nodes to avoid competing re-proposing the same proposal; if an in progress accept
+                    // is equal to the latest commit (even if the ballots aren't) we're done and can abort earlier,
+                    // and in fact it's possible for a CAS to sometimes determine if side effects occurred by reading
+                    // the underlying data and not witnessing the timestamp of its ballot (or any newer for the relevant data).
+                    Proposal repropose = new Proposal(inProgress.ballot, inProgress.accepted.update);
+                    PaxosPropose.Status proposeResult = propose(repropose, inProgress.participants, false).awaitUntil(deadline);
+                    switch (proposeResult.outcome)
+                    {
+                        default: throw new IllegalStateException();
+
+                        case MAYBE_FAILURE:
+                            throw proposeResult.maybeFailure().markAndThrowAsTimeoutOrFailure(isWrite, consistencyForConsensus, failedAttemptsDueToContention);
+
+                        case SUCCESS:
+                            retry = commitAndPrepare(repropose.agreed(), inProgress.participants, query, isWrite, acceptEarlyReadPermission);
+                            break retry;
+
+                        case SUPERSEDED:
+                            // since we are proposing a previous value that was maybe superseded by us before completion
+                            // we don't need to test the side effects, as we just want to start again, and fall through
+                            // to the superseded section below
+                            prepare = new PaxosPrepare.Superseded(proposeResult.superseded().by, inProgress.participants);
+
+                    }
+                }
+
+                case SUPERSEDED:
+                {
+                    Tracing.trace("Some replicas have already promised a higher ballot than ours; aborting");
+                    // sleep a random amount to give the other proposer a chance to finish
+                    if (!waitForContention(deadline, ++failedAttemptsDueToContention, query.metadata(), query.partitionKey(), consistencyForConsensus, isWrite ? WRITE : READ))
+                        throw MaybeFailure.noResponses(prepare.participants).markAndThrowAsTimeoutOrFailure(true, consistencyForConsensus, failedAttemptsDueToContention);
+                    retry = prepare(prepare.retryWithAtLeast(), prepare.participants, query, isWrite, acceptEarlyReadPermission);
+                    break;
+                }
+                case PROMISED: isPromised = true;
+                case READ_PERMITTED:
+                {
+                    // We have received a quorum of promises (or read permissions) that have all witnessed the commit of the prior paxos
+                    // round's proposal (if any).
+                    PaxosPrepare.Success success = prepare.success();
+
+                    DataResolver<?, ?> resolver = new DataResolver(query, success.participants, NoopReadRepair.instance, query.creationTimeNanos());
+                    for (int i = 0 ; i < success.responses.size() ; ++i)
+                        resolver.preprocess(success.responses.get(i));
+
+                    class WasRun implements Runnable { boolean v; public void run() { v = true; } }
+                    WasRun hadShortRead = new WasRun();
+                    PartitionIterator result = resolver.resolve(hadShortRead);
+
+                    if (!isPromised && hadShortRead.v)
+                    {
+                        // we need to propose an empty update to linearize our short read, but only had read success
+                        // since we may continue to perform short reads, we ask our prepare not to accept an early
+                        // read permission, when a promise may yet be obtained
+                        // TODO: increase read size each time this happens?
+                        acceptEarlyReadPermission = false;
+                        break;
+                    }
+
+                    return new BeginResult(success.ballot, success.participants, failedAttemptsDueToContention, result, !hadShortRead.v && success.isReadSafe, isPromised, success.supersededBy);
+                }
+
+                case MAYBE_FAILURE:
+                    throw prepare.maybeFailure().markAndThrowAsTimeoutOrFailure(isWrite, consistencyForConsensus, failedAttemptsDueToContention);
+
+                case ELECTORATE_MISMATCH:
+                    Participants participants = Participants.get(query.metadata(), query.partitionKey(), consistencyForConsensus);
+                    participants.assureSufficientLiveNodes(isWrite);
+                    retry = prepare(participants, query, isWrite, acceptEarlyReadPermission);
+                    break;
+
+            }
+
+            if (retry == null)
+            {
+                Tracing.trace("Some replicas have already promised a higher ballot than ours; retrying");
+                // sleep a random amount to give the other proposer a chance to finish
+                if (!waitForContention(deadline, ++failedAttemptsDueToContention, query.metadata(), query.partitionKey(), consistencyForConsensus, isWrite ? WRITE : READ))
+                    throw MaybeFailure.noResponses(prepare.participants).markAndThrowAsTimeoutOrFailure(true, consistencyForConsensus, failedAttemptsDueToContention);
+                retry = prepare(prepare.retryWithAtLeast(), prepare.participants, query, isWrite, acceptEarlyReadPermission);
+            }
+
+            preparing = retry;
+        }
+    }
+
+    public static boolean isInRangeAndShouldProcess(InetAddressAndPort from, DecoratedKey key, TableMetadata table, boolean includesRead)
+    {
+        Keyspace keyspace = Keyspace.open(table.keyspace);
+        return (includesRead ? EndpointsForToken.natural(keyspace, key.getToken())
+                             : ReplicaLayout.forTokenWriteLiveAndDown(keyspace, key.getToken()).all()
+        ).contains(getBroadcastAddressAndPort());
+    }
+
+    static ConsistencyLevel nonSerial(ConsistencyLevel serial)
+    {
+        switch (serial)
+        {
+            default: throw new IllegalStateException();
+            case SERIAL: return QUORUM;
+            case LOCAL_SERIAL: return LOCAL_QUORUM;
+        }
+    }
+
+    private static void mark(boolean isWrite, Function<ClientRequestMetrics, Meter> toMark, ConsistencyLevel consistency)
+    {
+        if (isWrite)
+        {
+            toMark.apply(casWriteMetrics).mark();
+            toMark.apply(writeMetricsMap.get(consistency)).mark();
+        }
+        else
+        {
+            toMark.apply(casReadMetrics).mark();
+            toMark.apply(readMetricsMap.get(consistency)).mark();
+        }
+    }
+
+    public static Ballot newBallot(@Nullable Ballot minimumBallot, ConsistencyLevel consistency)
+    {
+        // We want a timestamp that is guaranteed to be unique for that node (so that the ballot is globally unique), but if we've got a prepare rejected
+        // already we also want to make sure we pick a timestamp that has a chance to be promised, i.e. one that is greater that the most recently known
+        // in progress (#5667). Lastly, we don't want to use a timestamp that is older than the last one assigned by ClientState or operations may appear
+        // out-of-order (#7801).
+        long minTimestampMicros = minimumBallot == null ? Long.MIN_VALUE : 1 + minimumBallot.unixMicros();
+        // Note that ballotMicros is not guaranteed to be unique if two proposal are being handled concurrently by the same coordinator. But we still
+        // need ballots to be unique for each proposal so we have to use getRandomTimeUUIDFromMicros.
+        return nextBallot(minTimestampMicros, flag(consistency));
+    }
+
+    static Ballot staleBallotNewerThan(Ballot than, ConsistencyLevel consistency)
+    {
+        long minTimestampMicros = 1 + than.unixMicros();
+        long maxTimestampMicros = BallotGenerator.Global.prevUnixMicros();
+        maxTimestampMicros -= Math.min((maxTimestampMicros - minTimestampMicros) / 2, SECONDS.toMicros(5L));
+        if (maxTimestampMicros <= minTimestampMicros)
+            return nextBallot(minTimestampMicros, flag(consistency));
+
+        return staleBallot(minTimestampMicros, maxTimestampMicros, flag(consistency));
+    }
+
+    /**
+     * Create a ballot uuid with the consistency level encoded in the timestamp.
+     *
+     * UUIDGen.getRandomTimeUUIDFromMicros timestamps are always a multiple of 10, so we add a 1 or 2 to indicate
+     * the consistency level of the operation. This should have no effect in practice (except preferring a serial
+     * operation over a local serial if there's a timestamp collision), but lets us avoid adding CL to the paxos
+     * table and messages, which should make backcompat easier if a different solution is committed upstream.
+     */
+    public static Ballot ballotForConsistency(long whenInMicros, ConsistencyLevel consistency)
+    {
+        Preconditions.checkArgument(consistency.isSerialConsistency());
+        return nextBallot(whenInMicros, flag(consistency));
+    }
+
+    private static Ballot.Flag flag(ConsistencyLevel consistency)
+    {
+        return consistency == SERIAL ? GLOBAL : LOCAL;
+    }
+
+    public static ConsistencyLevel consistency(Ballot ballot)
+    {
+        switch (ballot.flag())
+        {
+            default: return null;
+            case LOCAL: return LOCAL_SERIAL;
+            case GLOBAL: return SERIAL;
+        }
+    }
+
+    static Map<InetAddressAndPort, EndpointState> verifyElectorate(Electorate remoteElectorate, Electorate localElectorate)
+    {
+        // verify electorates; if they differ, send back gossip info for superset of two participant sets
+        if (remoteElectorate.equals(localElectorate))
+            return emptyMap();
+
+        Map<InetAddressAndPort, EndpointState> endpoints = Maps.newHashMapWithExpectedSize(remoteElectorate.size() + localElectorate.size());
+        for (InetAddressAndPort host : remoteElectorate)
+        {
+            EndpointState endpoint = Gossiper.instance.copyEndpointStateForEndpoint(host);
+            if (endpoint == null)
+            {
+                NoSpamLogger.log(logger, WARN, 1, TimeUnit.MINUTES, "Remote electorate {} could not be found in Gossip", host);
+                continue;
+            }
+            endpoints.put(host, endpoint);
+        }
+        for (InetAddressAndPort host : localElectorate)
+        {
+            EndpointState endpoint = Gossiper.instance.copyEndpointStateForEndpoint(host);
+            if (endpoint == null)
+            {
+                NoSpamLogger.log(logger, WARN, 1, TimeUnit.MINUTES, "Local electorate {} could not be found in Gossip", host);
+                continue;
+            }
+            endpoints.putIfAbsent(host, endpoint);
+        }
+
+        return endpoints;
+    }
+
+    public static boolean useV2()
+    {
+        switch (PAXOS_VARIANT)
+        {
+            case v2_without_linearizable_reads_or_rejected_writes:
+            case v2_without_linearizable_reads:
+            case v2:
+                return true;
+            case v1:
+            case v1_without_linearizable_reads_or_rejected_writes:
+                return false;
+            default:
+                throw new AssertionError();
+        }
+    }
+
+    public static boolean isLinearizable()
+    {
+        switch (PAXOS_VARIANT)
+        {
+            case v2:
+            case v1:
+                return true;
+            case v2_without_linearizable_reads_or_rejected_writes:
+            case v2_without_linearizable_reads:
+            case v1_without_linearizable_reads_or_rejected_writes:
+                return false;
+            default:
+                throw new AssertionError();
+        }
+    }
+
+    public static void setPaxosVariant(Config.PaxosVariant paxosVariant)
+    {
+        Preconditions.checkNotNull(paxosVariant);
+        PAXOS_VARIANT = paxosVariant;
+        DatabaseDescriptor.setPaxosVariant(paxosVariant);
+    }
+
+    public static Config.PaxosVariant getPaxosVariant()
+    {
+        return PAXOS_VARIANT;
+    }
+
+    static boolean isOldParticipant(Replica replica)
+    {
+        String version = Gossiper.instance.getForEndpoint(replica.endpoint(), RELEASE_VERSION);
+        if (version == null)
+            return false;
+
+        try
+        {
+            return new CassandraVersion(version).compareTo(MODERN_PAXOS_RELEASE) < 0;
+        }
+        catch (Throwable t)
+        {
+            return false;
+        }
+    }
+
+    public static void evictHungRepairs()
+    {
+        PaxosTableRepairs.evictHungRepairs();
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/Paxos.md b/src/java/org/apache/cassandra/service/paxos/Paxos.md
new file mode 100644
index 0000000..e8f1991
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/Paxos.md
@@ -0,0 +1,345 @@
+# Light-weight transactions and Paxos algorithm
+
+Our implementation of light-weight transactions (LWT) is loosely based on the classic Paxos single-decision algorithm.
+It contains a range of modifications that make it different from a direct application of a sequence of independent
+decisions.
+
+Below we will describe the basic process (used by both V1 and V2 implementations) with the actions that each participant
+takes and sketch a proof why the approach is safe, and then talk about various later improvements that do not change the
+correctness of the basic scheme.
+
+A key consideration in the design was the fact that we apply LWTs independently to the partitions of a table, and the
+necessary additional infrastructure (such as improved failure detection, client-side routing, etc) to efficiently 
+utilise a stable leader (i.e. Multi-Paxos). Instead of solving this we prefer to better support independent writes by 
+a leaderless scheme, where each coordinator attempts to direct its operations to completion. On congestion this runs 
+the chance of repeated clashes between coordinators attempting to perform writes to the same partition, in which case 
+we use randomized exponential backoff to achieve progress.
+
+The descriptions and proofs below assume no non-LWT modifications to the partition. Any other write (regardless of the
+requested consistency level) may reach a minority of replicas and leave the partition in an inconsistent state where the
+following operations can go different ways depending on which set of replicas respond to a quorum read. In particular,
+if two compare-and-set (CAS) operations with the same condition are executed with no intervening operations, such a
+state would make it possible for the first to fail and the second to succeed.
+
+## Basic scheme
+
+For each partition with LWT modification, we maintain the following registers:
+
+- The current `promised` ballot number.
+- The latest `accepted` proposal together with its ballot number and a `committed` flag.
+
+We define an ordering on the latter by ballot number and committed flag, where `committed` true is interpreted as
+greater on equal ballot numbers. Two proposals are equal when their ballot numbers and committed flag match.
+
+The basic scheme includes the following stages:
+
+1. A coordinator selects a fresh ballot number (based on time and made unique by including a source node identifier).
+2. The coordinator sends a `prepare` message to all replicas responsible for the targeted partition with the given
+   ballot number and a request to read the data required by the operation.
+3. By accepting the message, a replica declares that it will not accept any `prepare` or `propose` message with smaller
+   ballot number:
+    1. If the replica's `promised` register is greater than the number included in the message, the replica rejects it,
+       sending back its current `promised` number in a `rejected` message.
+    2. Otherwise, the replica stores the ballot number from the message in its `promised` register and replies with a
+       `promise` message which includes the contents of the current `accepted` register together with the requested data
+       from the database.
+4. On receipt of `promise`s from a quorum of nodes, the coordinator compiles the "most recently accepted" (`MRA`) value as
+   the greatest among the accepted values in the promises and then:
+    1. If the `MRA` is not null and its committed flag is not true, there is an in-progress Paxos session that needs to be
+       completed and committed. Controller reproposes the value with the new ballot (i.e. follows the steps from (iv)
+       below with a proposed value equal to the `MRA`'s) and then restarts the process.
+    2. If the `MRA` is not null, its committed flag is true and it is not a match for the `accepted` value of a quorum of
+       promises, controller sends a `commit` message to all replicas whose value did not match and awaits responses
+       until they form a quorum of replicas with a matching `accepted` value.
+    3. The coordinator then creates a proposal, a partition update which is the result of applying the operation, using
+       a read result obtained by resolving the quorum of read responses; the partition update has a timestamp that
+       corresponds to the proposal's ballot number, and is empty if the operation was a read or the CAS failed.
+    4. It then sends the proposal as a `propose` message with the value and the current ballot number to all replicas.
+5. A replica accepts the proposal if it has not promised that it will not do so:
+    1. If its `promised` ballot number is not higher than the proposal's, it sets its `accepted` register to the
+       proposal with its ballot number and a false `committed` flag, updates its `promised` register to the proposal's
+       ballot and sends back an `accepted` message.
+    2. Otherwise it rejects the proposal by sending the current `promised` number in a `rejected` message.
+6. On receipt of `accepted` messages from a quorum of nodes, the Paxos session has reached a decision. The coordinator
+   completes it by sending `commit` messages to all replicas, attaching the proposal value with its ballot number.
+    1. It can return completion without waiting for receipt of any commit messages.
+7. A replica accepts a commit unconditionally, by applying the attached partition update. If the commit's ballot number
+   is greater than the replica's `accepted` ballot number, it sets its `accepted` register to the message's value and
+   ballot with true `committed` flag, and the `promised` register to its ballot number.
+8. If at any stage of the process that requires a quorum the quorum is not reached, the coordinator backs off and then
+   restarts the process from the beginning using a fresh ballot that is greater than the ballot contained in any
+   `rejected` message received.
+
+We can't directly map multi-instance classic Paxos onto this, but we can follow its correctness proofs to ensure the
+following propositions:
+
+1. Once a value (possibly empty) has been decided (i.e. accepted by a majority), no earlier proposal can be reproposed.
+2. Once a value has been decided, in any further round (i.e. action taken by any proposer) it will either be accepted
+   and/or committed, or it will have been committed in an earlier round and will be witnessed by at least one member of
+   the quorum.
+
+Suppose the value V was decided in the round with ballot number E0.
+
+Proposition 1 is true because new proposals can only be made after a successful promise round with ballot number E > E0.
+To be successful, it needs a quorum which must intersect in at least one replica with E0's decision quorum. Since that
+replica accepted that proposal, it cannot have made a promise on E before that and must thus return an accepted value
+whose ballot number is at least E0. This is true because both `propose` and `commit` actions can only replace the
+`accepted` value with one with a higher or equal ballot number.
+
+Proposition 2 can be proven true by induction on the following invariant: for any successful ballot number E >= E0,
+either:
+
+1. For all quorums of replicas, commit V with some ballot number G < E, G >= E0 was witnessed by some replica in the
+   quorum.
+2. For all quorums of replicas, the `accepted` value with the highest ballot number among the replicas in the quorum is
+   V with some ballot number G where G <= E, G >= E0.
+
+For round E == E0 the invariant is true because all quorums contain a replica that accepted V with ballot E0, and E0 is
+the newest ballot number.
+
+Suppose the invariant is true for some round E and examine the behaviour of the algorithm on F = succ(E).
+
+- If 1. was true for E, it remains true for F.
+- Otherwise 2. was true for E and:
+    - If the promise pass did not reach a quorum, no accepted values change and hence 2. is still true.
+    - If the promise reached a quorum, the collected `MRA` is V with ballot G.
+        - If the `MRA`'s committed flag is not true, the value V is reproposed with ballot F.
+            - If the proposal reaches no node, no accepted values change and hence 2. is still true.
+            - If the proposal reaches a minority of nodes, any quorum that includes one of these nodes will have V with
+              ballot F as their highest `accepted` value. All other quorums will not have changed and still have V as their
+              highest accepted value with an earlier ballot >= E0. In any case, 2. is still true.
+            - If the proposal reaches a majority of nodes, all quorums have V with ballot F as the highest `accepted` value
+              and thus satisfy 2.
+            - Any `commit` message that is issued after a majority can only change the accepted value's `committed` flag --
+              all quorums will still satisfy 2.
+        - If the `MRA`'s committed flag is true but it is not matched in all responses, a `commit` with this `MRA` is sent to
+          all replicas. By the reasoning above, 2. is still true regardless how many of them (if any) are received and
+          processed.
+        - If the committed `MRA` matches in all responses (initially or because of commits issued in the last step), then 1.
+          is true for G <= E < F regardless of any further action taken by the coordinator.
+
+Proposition 1 ensures that we can only commit one value in any concurrent operation. Proposition 2 means that any
+accepted proposal must have started its promise after the previous value was committed to at least one replica in any
+quorum, and hence must be able to see its effects in its read responses. This is also true for every other value that
+was accepted in any previous ballot.
+
+Note that each commit may modify separate parts of the partition or overwrite previous values. Each of these updates may
+be witnessed by a different replica, but they must all be witnessed in the responses the coordinator receives prior to
+making a proposal or completing a read. By virtue of having their timestamps reflect ballot order, the read resolution
+process can correctly restore the combined state.
+
+As writes are only done in the `commit` stage after a value has been accepted, no undecided writes can be reflected in
+read responses.
+
+## Insubstantial differences with the actual code
+
+Instead of using a unique node identifier as part of the ballot number, we generate a 64-bit random integer. This has an
+extremely low chance of collision that can be assumed to be immaterial.
+
+Instead of storing an `accepted` proposal with a committed flag, for historical reasons the actual implementation
+separately stores the latest `accepted` and `committed` values. The coordinator computes most recent values for both
+after receiving promises, and acts on the higher of the two. In other words, instead of checking the `committed` flag on
+the most recently accepted, it checks if whether the `committed` value has a higher ballot than the `accepted` one.
+
+When accepting a proposal (which is conditional on having no newer promise or accepted/committed proposal), it stores it
+in the `accepted` register. When accepting a commit (which is unconditional), it replaces the `commit` register only if
+the commit has a newer ballot. It will clear the `accepted` value to null if that value does not have a newer ballot.
+
+Additionally, the `promised` value is not adjusted with accepted proposals and commits. Instead, whenever the code
+decides whether to promise or accept, it collects the maximum of the promised, accepted and committed ballots.
+
+Version 2 of the Paxos implementation performs reads as described here, by combining them with the `prepare`/`promise`
+messages. Version 1 runs quorum reads separately after receiving a promise; the read cannot complete if any write
+reaches consensus after that promise and, if successful, it will in turn invalidate and proposals that it may fail to
+see.
+
+These differences do not materially change the logic, but make correctness a little harder to prove directly.
+
+## Skipping commit for empty proposals (Versions 1 and 2)
+
+Since empty proposals make no modifications to the database state, it is not necessary to commit them.
+
+More precisely, in the basic scheme above we can treat the case of an empty partition update as the most-recently
+accepted value in the coordinator's preparation phase like we would treat a null `MRA`, skipping phases i and ii. In other
+words, we can change 4(i) to:
+
+4.
+    1. If the `MRA` is not null or empty, and its committed flag is not true, there is an in-progress Paxos session that
+       needs to be completed and committed. Controller reproposes the value with the new ballot (i.e. follow the steps
+       below with a proposed value equal to the `MRA`'s) and then restart the process.
+
+With this modified step Proposition 1 is still true, as is Proposition 2 restricted to committing and witnessing
+non-empty proposals. Their combination still ensures that no update made concurrently with any operation (including a
+read or a failing CAS) can resurface after that operation is decided, and that any operation will see the results of
+applying any previous.
+
+## Skipping proposal for reads (Version 2 only)
+
+To ensure correct ordering of reads and unsuccessful CAS operations, the algorithm above forces invalidation of any
+concurrent operation by issuing an empty update. It is possible, however, to recognize if a concurrent operation may
+have started at the time a `promise` is given. If no such operation is present, the read may proceed without issuing an
+empty update.
+
+To recognize this, the current `promised` value is returned with `promise` messages. During the proposal generation
+phase, the coordinator compiles the maximum returned `promised` number and compares it against the `MRA`'s. If higher, a
+concurrent operation is in place and all reads must issue an empty update to ensure proper ordering. If not, the empty
+update may be skipped.
+
+In other words, step 3(ii) changes to the following:
+
+3.
+    2. Otherwise, the replica stores the ballot number from the message in its `promised` register and replies with a
+       `promise` message which includes the contents of the current `accepted` and previous `promised` registers together
+       with the requested data from the database.
+
+and a new step is inserted before 4(iv) (which becomes 4(v)):
+
+4.
+    4. If the proposal is empty (i.e. the operation was a read or the CAS failed), the coordinator checks the maximum of
+       the quorum's `promised` values agains the `MRA`'s ballot number. If that maximum isn't higher, the operation
+       completes.
+
+Since we do not change issued proposals or make new ones, Proposition 1 is still in force. For Proposition 2 we must
+consider the possibility of a no-propose read missing an update with an earlier ballot number that was decided on
+concurrently. The difference in the new scheme is that this read will not invalidate an incomplete concurrent write, and
+thus an undecided entry could be decided after the read executes. However, to propose a new entry, a coordinator must
+first obtain a quorum of promises using a ballot number greater than the last committed or empty value's. Given such a
+promise and a read executing with higher ballot, at least one of the reader's quorum replicas must return its ballot
+number or higher in the `promised` field (otherwise the read's promise will have executed before the write's and the
+preparation would have been rejected). As a result, the coordinator will see a concurrent operation (either in a
+non-committed `MRA`, or a `promised` value higher than a committed or empty `MRA`) and will proceed to issue an invalidating
+empty proposal.
+
+## Concurrent reads (Version 2 only)
+
+As stated, the above optimization is only useful once per successful proposal, because a read executed in this way does
+not complete and will be treated as concurrent with any operation started after it. To improve this, we can use the fact
+that reads do not affect other reads, i.e. they are commutative operations and the order of execution of a set of reads
+with no concurrent writes is not significant, and separately store and issue read-only and write promises.
+
+More precisely, `prepare` messages are augmented with an `isWrite` flag, and an additional register called
+`promisedWrite` is maintained. The latter is updated when a promise is given for a `prepare` message with a true
+`isWrite` field, and is returned with all `promise` messages (in addition to `promised` as above). When a promise is
+requested with a ballot number lower than the current `promised` but higher than `promisedWrite`, the replica does not
+reject the request, but issues a "read-only promise" (note that this can be a normal `promise` message, recognized by
+`promised` being greater than the coordinator-issued ballot number), which cannot be used for making any proposal.
+
+The condition for making a no-proposal read is that the maximum returned `promisedWrite` number is not higher than the
+`MRA`'s (i.e. concurrent reads are permitted, but not concurrent writes). Provided that this is the case, the coordinator
+can use a read-only promise to execute no-proposal reads and failing CAS's. If they are not, it must restart the
+process, treating the read-only promises as rejections.
+
+Steps 2, 3, 4 and 8 are changed to accommodate this. The modified algorithm becomes:
+
+1. A coordinator selects a fresh ballot number (based on time and made unique by including a source node identifier).
+2. The coordinator sends a `prepare` message to all replicas responsible for the targeted partition with the given
+   ballot number, `isWrite` set to true if the operation is a CAS and false if it is a read, and a request to read the
+   data required by the operation.
+3. By accepting the message, a replica declares that it will not accept any `propose` message or issue write promises
+   with smaller ballot number:
+    1. If the replica's `promisedWrite` register is greater than the number included in the message, the replica rejects
+       it, sending back its current `promised` number in a `rejected` message.
+    2. A `read-only` flag is initialized to false.
+    3. If the `promised` register contains a lower value than the one supplied by the message, the `promised` register
+       is updated. Otherwise, the `read-only` flag is set to true.
+    4. If the message's `isWrite` flag is true and `read-only` is still false, the `promisedWrite` register is updated
+       to the passed ballot number. Otherwise, `read-only` is set to true.
+    5. The replica replies with a `promise` message which includes the `read-only` flag, the contents of the current
+       `accepted` and previous `promised` and `promisedWrite` registers together with the requested data from the
+       database.
+4. On receipt of `promise`s from a quorum of nodes, the coordinator compiles the "most recently accepted" (`MRA`) value as
+   the greatest among the accepted values in the promises and then:
+    1. If the `MRA` is not null or empty, and its committed flag is not true, there is an in-progress Paxos session that
+       needs to be completed and committed. The coordinator prepares a reproposal of the value with the new ballot,
+       continuing with step (v) below, and then restarts the process.
+    2. If the `MRA` is not null, its committed flag is true and it is not a match for the `accepted` value of a quorum of
+       promises, controller sends a `commit` message to all replicas whose value did not match and awaits responses
+       until they form a quorum of replicas with a matching `accepted` value.
+    3. The coordinator then creates a proposal, a partition update which is the result of applying the operation, using
+       a read result obtained by resolving the quorum of read responses; the partition update is empty if the operation
+       was a read or the CAS failed.
+    4. If the proposal is empty (i.e. the operation was a read or the CAS failed), the coordinator checks the maximum of
+       the quorum's `promisedWrite` values agains the `MRA`'s ballot number. If that maximum isn't higher, the operation
+       completes.
+    5. If there was no quorum of promises with false `read-only` flag, the coordinator restarts the process (step 8).
+    6. Otherwise, it sends the proposal as a `propose` message with the value and the current ballot number to all
+       replicas.
+5. A replica accepts the proposal if it has not promised that it will not do so:
+    1. If its `promised` ballot number is not higher than the proposal's, it sets its `accepted` register to the
+       proposal with its ballot number and a false `committed` flag, updates its `promised` register to the proposal's
+       ballot and sends back an `accepted` message.
+    2. Otherwise, it rejects the proposal by sending the current `promised` number in a `rejected` message.
+6. On receipt of `accepted` messages from a quorum of nodes, the Paxos session has reached a decision. The coordinator
+   completes it by sending `commit` messages to all replicas, attaching the proposal value and its ballot number.
+    1. It can return completion without waiting for receipt of any commit messages.
+7. A replica accepts a commit unconditionally, by applying the attached partition update. If the commit's ballot number
+   is greater than the replica's `accepted` ballot number, it sets its `accepted` register to the message's value and
+   ballot with true `committed` flag, and the `promised` register to its ballot number.
+8. If at any stage of the process that requires a quorum the quorum is not reached, the coordinator backs off and then
+   restarts the process from the beginning using a fresh ballot that is greater than the `promised` ballot contained in
+   any `rejected` and `promise` message received.
+
+With respect to any operation that issues a proposal, this algorithm fully matches the earlier version. For operations
+that do not (including all operations executing with a read-only promise), it allows for multiple to execute
+concurrently as long as no write promise quorum has been reached after the last commit. The reasoning of the previous
+paragraph is still valid and proves that no older proposal can be agreed on after a no-proposal read.
+
+## Paxos system table expiration (Version 1 only)
+
+The Paxos state registers used by the algorithm are persisted in the Paxos system table. For every partition with LWTs,
+this table will contain an entry specifying the current values of all registers (promised, promisedWrite, accepted,
+committed). Because this information is per-partition, there is a high chance that this table will quickly become very
+large if LWTs are used with many independent partitions.
+
+To make sure the overhead of the Paxos system table remains limited, Version 1 of the Cassandra Paxos implementation
+specifies a time-to-live (TTL) for all writes. That is, after a certain period of time with no LWT to a partition, the
+replica will forget the partition's Paxos state.
+
+If this data expires, any in-progress operations may fail to be brought to completion. With the algorithm as described
+above, one of the effects of this is that some writes that are reported complete may fail to ever be committed on a
+majority of replicas, or even on any replica (if e.g. connection with the replicas is lost before commits are sent, and
+the TTL expires before any new LWT operation on the permition is initiated).
+
+To avoid this problem, Version 1 of the implementation only reports success on writes after the commit stage has reached
+a requested consistency level. This solves the problem of reporting success, but only guarantees LWT writes to behave
+like non-LWT ones: a write may still reach a minority of nodes and leave the partition in an inconsistent state, which
+permits linearity guarantees to be violated.
+
+## Paxos repair (Version 2 only)
+
+In the second version of the implementation the Paxos system table does not expire. Instead, clearing up state is
+performed by a "Paxos repair" process which actively processes unfinished Paxos sessions and only deletes state that is
+known to have been brought to completion (i.e. successful majority commit).
+
+The repair process starts with taking a snapshot of the uncommitted operations in the Paxos system table. It then takes
+their ballots' maximum, which is then distributed to all nodes to be used as a lower bound on all promises, i.e.
+replicas stop accepting messages with earlier ballots. The process then proceeds to perform the equivalent of an empty
+read on all partitions in the snapshot. Upon completion, it can guarantee that all proposals with a ballot lower than
+the bound have been completed, i.e. either accepted and committed or superseded in a majority of nodes.
+
+What this means is that no LWT with earlier ballot can be incomplete, and thus no longer need any earlier state in the
+Paxos system table. The actual data deletion happens on compaction, where we drop all data that has lower ballots than
+what we know to have been repaired.
+
+## Correctness in the presence of range movements (Version 2 only)
+
+The crucial requirements for any Paxos-like scheme to work is to only make progress when we are guaranteed that all
+earlier decision points have at least one representative among the replicas that reply to a message (in other words,
+that all quorums intersect). When the node set is fixed this is achieved by requesting that a quorum contains more than
+half the replicas for the given partition.
+
+Range movements (i.e. joining or leaving nodes), however, can change the set of replicas that are responsible for a
+partition. In the exteme case, after multiple range movements it is possible to have a completely different set of
+replicas responsible for the partition (i.e. no quorum can exist that contains a replica for all earlier transactions).
+To deal with this problem, we must ensure that:
+
+- While operations in an incomplete state are ongoing, a quorum is formed in such a way that it contains a majority for
+  the current replica set _as well as_ for the replica set before the operation was started (as well as any intermediate
+  set, if it possible to perform multiple range movements in parallel).
+- By the time we transition fully to a new set of replicas responsible for a partition, we have completed moving all
+  committed mutations from any source replica to its replacement.
+
+The Paxos repair process above gives us a way to complete ongoing operations and a point in time when we can assume that
+all earlier LWT operations are complete. In combination with streaming, which moves all committed data to the new
+replica, this means that from the point when both complete forward we can safely use the new replica in quorums in place
+of the source.
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosCommit.java b/src/java/org/apache/cassandra/service/paxos/PaxosCommit.java
new file mode 100644
index 0000000..4321fc9
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosCommit.java
@@ -0,0 +1,325 @@
+/*
+ * 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.service.paxos;
+
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import java.util.function.Consumer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.locator.EndpointsForToken;
+import org.apache.cassandra.locator.InOurDc;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.NoPayload;
+import org.apache.cassandra.service.paxos.Paxos.Participants;
+import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.utils.concurrent.ConditionAsConsumer;
+
+import static java.util.Collections.emptyMap;
+import static org.apache.cassandra.exceptions.RequestFailureReason.NODE_DOWN;
+import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
+import static org.apache.cassandra.net.Verb.PAXOS2_COMMIT_REMOTE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_COMMIT_REQ;
+import static org.apache.cassandra.service.StorageProxy.shouldHint;
+import static org.apache.cassandra.service.StorageProxy.submitHint;
+import static org.apache.cassandra.service.paxos.Commit.*;
+import static org.apache.cassandra.utils.concurrent.ConditionAsConsumer.newConditionAsConsumer;
+
+// Does not support EACH_QUORUM, as no such thing as EACH_SERIAL
+public class PaxosCommit<OnDone extends Consumer<? super PaxosCommit.Status>> extends PaxosRequestCallback<NoPayload>
+{
+    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"));
+
+    public static boolean getEnableDcLocalCommit()
+    {
+        return ENABLE_DC_LOCAL_COMMIT;
+    }
+
+    public static void setEnableDcLocalCommit(boolean enableDcLocalCommit)
+    {
+        ENABLE_DC_LOCAL_COMMIT = enableDcLocalCommit;
+    }
+
+    /**
+     * Represents the current status of a commit action: it is a status rather than a result,
+     * as the result may be unknown without sufficient responses (though in most cases it is final status).
+     */
+    static class Status
+    {
+        private final Paxos.MaybeFailure maybeFailure;
+
+        Status(Paxos.MaybeFailure maybeFailure)
+        {
+            this.maybeFailure = maybeFailure;
+        }
+
+        boolean isSuccess() { return maybeFailure == null; }
+        Paxos.MaybeFailure maybeFailure() { return maybeFailure; }
+
+        public String toString() { return maybeFailure == null ? "Success" : maybeFailure.toString(); }
+    }
+
+    private static final Status success = new Status(null);
+
+    private static final AtomicLongFieldUpdater<PaxosCommit> responsesUpdater = AtomicLongFieldUpdater.newUpdater(PaxosCommit.class, "responses");
+
+    final Agreed commit;
+    final boolean allowHints;
+    final ConsistencyLevel consistencyForConsensus;
+    final ConsistencyLevel consistencyForCommit;
+
+    final EndpointsForToken replicas;
+    final int required;
+    final OnDone onDone;
+
+    /**
+     * packs two 32-bit integers;
+     * bit 00-31: accepts
+     * bit 32-63: failures/timeouts
+     * 
+     * {@link #accepts} 
+     * {@link #failures}
+     */
+    private volatile long responses;
+
+    public PaxosCommit(Agreed commit, boolean allowHints, ConsistencyLevel consistencyForConsensus, ConsistencyLevel consistencyForCommit, Participants participants, OnDone onDone)
+    {
+        this.commit = commit;
+        this.allowHints = allowHints;
+        this.consistencyForConsensus = consistencyForConsensus;
+        this.consistencyForCommit = consistencyForCommit;
+        this.replicas = participants.all;
+        this.onDone = onDone;
+        this.required = participants.requiredFor(consistencyForCommit);
+        if (required == 0)
+            onDone.accept(status());
+    }
+
+    /**
+     * Submit the proposal for commit with all replicas, and wait synchronously until at most {@code deadline} for the result
+     */
+    static Paxos.Async<Status> commit(Agreed commit, Participants participants, ConsistencyLevel consistencyForConsensus, ConsistencyLevel consistencyForCommit, @Deprecated boolean allowHints)
+    {
+        // to avoid unnecessary object allocations we extend PaxosPropose to implements Paxos.Async
+        class Async extends PaxosCommit<ConditionAsConsumer<Status>> implements Paxos.Async<Status>
+        {
+            private Async(Agreed commit, boolean allowHints, ConsistencyLevel consistencyForConsensus, ConsistencyLevel consistencyForCommit, Participants participants)
+            {
+                super(commit, allowHints, consistencyForConsensus, consistencyForCommit, participants, newConditionAsConsumer());
+            }
+
+            public Status awaitUntil(long deadline)
+            {
+                try
+                {
+                    onDone.awaitUntil(deadline);
+                }
+                catch (InterruptedException e)
+                {
+                    Thread.currentThread().interrupt();
+                    return new Status(new Paxos.MaybeFailure(true, replicas.size(), required, 0, emptyMap()));
+                }
+
+                return status();
+            }
+        }
+
+        Async async = new Async(commit, allowHints, consistencyForConsensus, consistencyForCommit, participants);
+        async.start(participants, false);
+        return async;
+    }
+
+    /**
+     * Submit the proposal for commit with all replicas, and wait synchronously until at most {@code deadline} for the result
+     */
+    static <T extends Consumer<Status>> T commit(Agreed commit, Participants participants, ConsistencyLevel consistencyForConsensus, ConsistencyLevel consistencyForCommit, @Deprecated boolean allowHints, T onDone)
+    {
+        new PaxosCommit<>(commit, allowHints, consistencyForConsensus, consistencyForCommit, participants, onDone)
+                .start(participants, true);
+        return onDone;
+    }
+
+    /**
+     * Send commit messages to peers (or self)
+     */
+    void start(Participants participants, boolean async)
+    {
+        boolean executeOnSelf = false;
+        Message<Agreed> commitMessage = Message.out(PAXOS_COMMIT_REQ, commit);
+        Message<Mutation> mutationMessage = ENABLE_DC_LOCAL_COMMIT && consistencyForConsensus.isDatacenterLocal()
+                                            ? Message.out(PAXOS2_COMMIT_REMOTE_REQ, commit.makeMutation()) : null;
+
+        for (int i = 0, mi = participants.allLive.size(); i < mi ; ++i)
+            executeOnSelf |= isSelfOrSend(commitMessage, mutationMessage, participants.allLive.endpoint(i));
+
+        for (int i = 0, mi = participants.allDown.size(); i < mi ; ++i)
+            onFailure(participants.allDown.endpoint(i), NODE_DOWN);
+
+        if (executeOnSelf)
+        {
+            ExecutorPlus executor = PAXOS_COMMIT_REQ.stage.executor();
+            if (async) executor.execute(this::executeOnSelf);
+            else executor.maybeExecuteImmediately(this::executeOnSelf);
+        }
+    }
+
+    /**
+     * If isLocal return true; otherwise if the destination is alive send our message, and if not mark the callback with failure
+     */
+    private boolean isSelfOrSend(Message<Agreed> commitMessage, Message<Mutation> mutationMessage, InetAddressAndPort destination)
+    {
+        if (shouldExecuteOnSelf(destination))
+            return true;
+
+        // don't send commits to remote dcs for local_serial operations
+        if (mutationMessage != null && !isInLocalDc(destination))
+            MessagingService.instance().sendWithCallback(mutationMessage, destination, this);
+        else
+            MessagingService.instance().sendWithCallback(commitMessage, destination, this);
+
+        return false;
+    }
+
+    private static boolean isInLocalDc(InetAddressAndPort destination)
+    {
+        return DatabaseDescriptor.getLocalDataCenter().equals(DatabaseDescriptor.getEndpointSnitch().getDatacenter(destination));
+    }
+
+    /**
+     * Record a failure or timeout, and maybe submit a hint to {@code from}
+     */
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        if (logger.isTraceEnabled())
+            logger.trace("{} {} from {}", commit, reason, from);
+
+        response(false, from);
+        Replica replica = replicas.lookup(from);
+
+        if (allowHints && shouldHint(replica))
+            submitHint(commit.makeMutation(), replica, null);
+    }
+
+    /**
+     * Record a success response
+     */
+    public void onResponse(Message<NoPayload> response)
+    {
+        logger.trace("{} Success from {}", commit, response.from());
+
+        response(true, response.from());
+    }
+
+    /**
+     * Execute locally and record response
+     */
+    public void executeOnSelf()
+    {
+        executeOnSelf(commit, RequestHandler::execute);
+    }
+
+    @Override
+    public void onResponse(NoPayload response, InetAddressAndPort from)
+    {
+        response(response != null, from);
+    }
+
+    /**
+     * Record a failure or success response if {@code from} contributes to our consistency.
+     * If we have reached a final outcome of the commit, run {@code onDone}.
+     */
+    private void response(boolean success, InetAddressAndPort from)
+    {
+        if (consistencyForCommit.isDatacenterLocal() && !InOurDc.endpoints().test(from))
+            return;
+
+        long responses = responsesUpdater.addAndGet(this, success ? 0x1L : 0x100000000L);
+        // next two clauses mutually exclusive to ensure we only invoke onDone once, when either failed or succeeded
+        if (accepts(responses) == required) // if we have received _precisely_ the required accepts, we have succeeded
+            onDone.accept(status());
+        else if (replicas.size() - failures(responses) == required - 1) // if we are _unable_ to receive the required accepts, we have failed
+            onDone.accept(status());
+    }
+
+    /**
+     * @return the Status as of now, which may be final or may indicate we have not received sufficient responses
+     */
+    Status status()
+    {
+        long responses = this.responses;
+        if (isSuccessful(responses))
+            return success;
+
+        return new Status(new Paxos.MaybeFailure(replicas.size(), required, accepts(responses), failureReasonsAsMap()));
+    }
+
+    private boolean isSuccessful(long responses)
+    {
+        return accepts(responses) >= required;
+    }
+
+    private static int accepts(long responses)
+    {
+        return (int) (responses & 0xffffffffL);
+    }
+
+    private static int failures(long responses)
+    {
+        return (int) (responses >>> 32);
+    }
+
+    public static class RequestHandler implements IVerbHandler<Agreed>
+    {
+        @Override
+        public void doVerb(Message<Agreed> message)
+        {
+            NoPayload response = execute(message.payload, message.from());
+            // NOTE: for correctness, this must be our last action, so that we cannot throw an error and send both a response and a failure response
+            if (response == null)
+                MessagingService.instance().respondWithFailure(UNKNOWN, message);
+            else
+                MessagingService.instance().respond(response, message);
+        }
+
+        private static NoPayload execute(Agreed agreed, InetAddressAndPort from)
+        {
+            if (!Paxos.isInRangeAndShouldProcess(from, agreed.update.partitionKey(), agreed.update.metadata(), false))
+                return null;
+
+            PaxosState.commitDirect(agreed);
+            Tracing.trace("Enqueuing acknowledge to {}", from);
+            return NoPayload.noPayload;
+        }
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosCommitAndPrepare.java b/src/java/org/apache/cassandra/service/paxos/PaxosCommitAndPrepare.java
new file mode 100644
index 0000000..7a9dba7
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosCommitAndPrepare.java
@@ -0,0 +1,144 @@
+/*
+ * 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.service.paxos;
+
+import java.io.IOException;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.SinglePartitionReadCommand;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Commit.Agreed;
+import org.apache.cassandra.tracing.Tracing;
+
+import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
+import static org.apache.cassandra.net.Verb.PAXOS2_COMMIT_AND_PREPARE_REQ;
+import static org.apache.cassandra.service.paxos.Paxos.newBallot;
+import static org.apache.cassandra.service.paxos.PaxosPrepare.start;
+
+public class PaxosCommitAndPrepare
+{
+    public static final RequestSerializer requestSerializer = new RequestSerializer();
+    public static final RequestHandler requestHandler = new RequestHandler();
+
+    static PaxosPrepare commitAndPrepare(Agreed commit, Paxos.Participants participants, SinglePartitionReadCommand readCommand, boolean isWrite, boolean acceptEarlyReadSuccess)
+    {
+        Ballot ballot = newBallot(commit.ballot, participants.consistencyForConsensus);
+        Request request = new Request(commit, ballot, participants.electorate, readCommand, isWrite);
+        PaxosPrepare prepare = new PaxosPrepare(participants, request, acceptEarlyReadSuccess, null);
+
+        Tracing.trace("Committing {}; Preparing {}", commit.ballot, ballot);
+        Message<Request> message = Message.out(PAXOS2_COMMIT_AND_PREPARE_REQ, request);
+//                .permitsArtificialDelay(participants.consistencyForConsensus);
+        start(prepare, participants, message, RequestHandler::execute);
+        return prepare;
+    }
+
+    private static class Request extends PaxosPrepare.AbstractRequest<Request>
+    {
+        final Agreed commit;
+
+        Request(Agreed commit, Ballot ballot, Paxos.Electorate electorate, SinglePartitionReadCommand read, boolean isWrite)
+        {
+            super(ballot, electorate, read, isWrite);
+            this.commit = commit;
+        }
+
+        private Request(Agreed commit, Ballot ballot, Paxos.Electorate electorate, DecoratedKey partitionKey, TableMetadata table, boolean isWrite)
+        {
+            super(ballot, electorate, partitionKey, table, isWrite);
+            this.commit = commit;
+        }
+
+        Request withoutRead()
+        {
+            return new Request(commit, ballot, electorate, partitionKey, table, isForWrite);
+        }
+
+        public String toString()
+        {
+            return commit.toString("CommitAndPrepare(") + ", " + Ballot.toString(ballot) + ')';
+        }
+    }
+
+    public static class RequestSerializer extends PaxosPrepare.AbstractRequestSerializer<Request, Agreed>
+    {
+        Request construct(Agreed param, Ballot ballot, Paxos.Electorate electorate, SinglePartitionReadCommand read, boolean isWrite)
+        {
+            return new Request(param, ballot, electorate, read, isWrite);
+        }
+
+        Request construct(Agreed param, Ballot ballot, Paxos.Electorate electorate, DecoratedKey partitionKey, TableMetadata table, boolean isWrite)
+        {
+            return new Request(param, ballot, electorate, partitionKey, table, isWrite);
+        }
+
+        @Override
+        public void serialize(Request request, DataOutputPlus out, int version) throws IOException
+        {
+            Agreed.serializer.serialize(request.commit, out, version);
+            super.serialize(request, out, version);
+        }
+
+        @Override
+        public Request deserialize(DataInputPlus in, int version) throws IOException
+        {
+            Agreed committed = Agreed.serializer.deserialize(in, version);
+            return deserialize(committed, in, version);
+        }
+
+        @Override
+        public long serializedSize(Request request, int version)
+        {
+            return Agreed.serializer.serializedSize(request.commit, version)
+                    + super.serializedSize(request, version);
+        }
+    }
+
+    public static class RequestHandler implements IVerbHandler<Request>
+    {
+        @Override
+        public void doVerb(Message<Request> message)
+        {
+            PaxosPrepare.Response response = execute(message.payload, message.from());
+            if (response == null)
+                MessagingService.instance().respondWithFailure(UNKNOWN, message);
+            else
+                MessagingService.instance().respond(response, message);
+        }
+
+        private static PaxosPrepare.Response execute(Request request, InetAddressAndPort from)
+        {
+            Agreed commit = request.commit;
+            if (!Paxos.isInRangeAndShouldProcess(from, commit.update.partitionKey(), commit.update.metadata(), request.read != null))
+                return null;
+
+            try (PaxosState state = PaxosState.get(commit))
+            {
+                state.commit(commit);
+                return PaxosPrepare.RequestHandler.execute(request, state);
+            }
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosOperationLock.java b/src/java/org/apache/cassandra/service/paxos/PaxosOperationLock.java
new file mode 100644
index 0000000..b9f01e8
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosOperationLock.java
@@ -0,0 +1,30 @@
+/*
+ * 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.service.paxos;
+
+public interface PaxosOperationLock extends AutoCloseable
+{
+    @Override
+    public void close();
+
+    static PaxosOperationLock noOp()
+    {
+        return () -> {};
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosPrepare.java b/src/java/org/apache/cassandra/service/paxos/PaxosPrepare.java
new file mode 100644
index 0000000..a7f58e1
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosPrepare.java
@@ -0,0 +1,1253 @@
+/*
+ * 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.service.paxos;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.exceptions.UnavailableException;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.metrics.PaxosMetrics;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.PendingRangeCalculatorService;
+import org.apache.cassandra.service.paxos.PaxosPrepare.Status.Outcome;
+import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.utils.vint.VIntCoding;
+
+import static java.util.Collections.emptyMap;
+import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
+import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_RSP;
+import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
+import static org.apache.cassandra.service.paxos.Commit.*;
+import static org.apache.cassandra.service.paxos.Commit.CompareResult.WAS_REPROPOSED_BY;
+import static org.apache.cassandra.service.paxos.Paxos.*;
+import static org.apache.cassandra.service.paxos.PaxosPrepare.Status.Outcome.*;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.service.paxos.PaxosState.*;
+import static org.apache.cassandra.service.paxos.PaxosState.MaybePromise.Outcome.*;
+import static org.apache.cassandra.utils.CollectionSerializer.deserializeMap;
+import static org.apache.cassandra.utils.CollectionSerializer.newHashMap;
+import static org.apache.cassandra.utils.CollectionSerializer.serializeMap;
+import static org.apache.cassandra.utils.CollectionSerializer.serializedSizeMap;
+import static org.apache.cassandra.utils.concurrent.Awaitable.SyncAwaitable.waitUntil;
+
+/**
+ * Perform one paxos "prepare" attempt, with various optimisations.
+ *
+ * The prepare step entails asking for a quorum of nodes to promise to accept our later proposal. It can
+ * yield one of five logical answers:
+ *
+ *   1) Success         - we have received a quorum of promises, and we know that a quorum of nodes
+ *                        witnessed the prior round's commit (if any)
+ *   2) Timeout         - we have not received enough responses at all before our deadline passed
+ *   3) Failure         - we have received too many explicit failures to succeed
+ *   4) Superseded      - we have been informed of a later ballot that has been promised
+ *   5) FoundInProgress - we have been informed of an earlier promise that has been accepted
+ *
+ * Success hinges on two distinct criteria being met, as the quorum of promises may not guarantee a quorum of
+ * witnesses of the prior round's commit.  We track this separately by recording those nodes that have witnessed
+ * the prior round's commit.  On receiving a quorum of promises, we submit the prior round's commit to any promisers
+ * that had not witnessed it, while continuing to wait for responses to our original request: as soon as we hear of
+ * a quorum that have witnessed it, either by our refresh request or by responses to the original request, we yield Success.
+ *
+ * Success is also accompanied by a quorum of read responses, avoiding another round-trip to obtain this result.
+ *
+ * This operation may be started either with a solo Prepare command, or with a prefixed Commit command.
+ * If we are completing an in-progress round we previously discovered, we save another round-trip by committing and
+ * preparing simultaneously.
+ */
+public class PaxosPrepare extends PaxosRequestCallback<PaxosPrepare.Response> implements PaxosPrepareRefresh.Callbacks, Paxos.Async<PaxosPrepare.Status>
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosPrepare.class);
+
+    private static Runnable onLinearizabilityViolation;
+
+    public static final RequestHandler requestHandler = new RequestHandler();
+    public static final RequestSerializer requestSerializer = new RequestSerializer();
+    public static final ResponseSerializer responseSerializer = new ResponseSerializer();
+
+    /**
+     * Represents the current status of a prepare action: it is a status rather than a result,
+     * as the result may be unknown without sufficient responses (though in most cases it is final status).
+     */
+    static class Status
+    {
+        enum Outcome { READ_PERMITTED, PROMISED, SUPERSEDED, FOUND_INCOMPLETE_ACCEPTED, FOUND_INCOMPLETE_COMMITTED, MAYBE_FAILURE, ELECTORATE_MISMATCH }
+
+        final Outcome outcome;
+        final Participants participants;
+
+        Status(Outcome outcome, Participants participants)
+        {
+            this.outcome = outcome;
+            this.participants = participants;
+        }
+        @Nullable
+        Ballot retryWithAtLeast()
+        {
+            switch (outcome)
+            {
+                case READ_PERMITTED: return ((Success) this).supersededBy;
+                case SUPERSEDED: return ((Superseded) this).by;
+                default: return null;
+            }
+        }
+        Success success() { return (Success) this; }
+        FoundIncompleteAccepted incompleteAccepted() { return (FoundIncompleteAccepted) this; }
+        FoundIncompleteCommitted incompleteCommitted() { return (FoundIncompleteCommitted) this; }
+        Paxos.MaybeFailure maybeFailure() { return ((MaybeFailure) this).info; }
+    }
+
+    static class Success extends WithRequestedBallot
+    {
+        final List<Message<ReadResponse>> responses;
+        final boolean isReadSafe; // read responses constitute a linearizable read (though short read protection would invalidate that)
+        final @Nullable
+        Ballot supersededBy; // if known and READ_SUCCESS
+
+        Success(Outcome outcome, Ballot ballot, Participants participants, List<Message<ReadResponse>> responses, boolean isReadSafe, @Nullable Ballot supersededBy)
+        {
+            super(outcome, participants, ballot);
+            this.responses = responses;
+            this.isReadSafe = isReadSafe;
+            this.supersededBy = supersededBy;
+        }
+
+        static Success read(Ballot ballot, Participants participants, List<Message<ReadResponse>> responses, @Nullable Ballot supersededBy)
+        {
+            return new Success(Outcome.READ_PERMITTED, ballot, participants, responses, true, supersededBy);
+        }
+
+        static Success readOrWrite(Ballot ballot, Participants participants, List<Message<ReadResponse>> responses, boolean isReadConsistent)
+        {
+            return new Success(Outcome.PROMISED, ballot, participants, responses, isReadConsistent, null);
+        }
+
+        public String toString() { return "Success(" + ballot + ", " + participants.electorate + ')'; }
+    }
+
+    /**
+     * The ballot we sought promises for has been superseded by another proposer's
+     *
+     * Note: we extend this for Success, so that supersededBy() can be called for ReadSuccess
+     */
+    static class Superseded extends Status
+    {
+        final Ballot by;
+
+        Superseded(Ballot by, Participants participants)
+        {
+            super(SUPERSEDED, participants);
+            this.by = by;
+        }
+
+        public String toString() { return "Superseded(" + by + ')'; }
+    }
+
+    static class WithRequestedBallot extends Status
+    {
+        final Ballot ballot;
+
+        WithRequestedBallot(Outcome outcome, Participants participants, Ballot ballot)
+        {
+            super(outcome, participants);
+            this.ballot = ballot;
+        }
+    }
+
+    static class FoundIncomplete extends WithRequestedBallot
+    {
+        private FoundIncomplete(Outcome outcome, Participants participants, Ballot promisedBallot)
+        {
+            super(outcome, participants, promisedBallot);
+        }
+    }
+
+    /**
+     * We have been informed of a promise made by one of the replicas we contacted, that was not accepted by all replicas
+     * (though may have been accepted by a majority; we don't know).
+     * In this case we cannot readily know if we have prevented this proposal from being completed, so we attempt
+     * to finish it ourselves (unfortunately leaving the proposer to timeout, given the current semantics)
+     * TODO: we should consider waiting for more responses in case we encounter any successful commit, or a majority
+     *       of acceptors?
+     */
+    static class FoundIncompleteAccepted extends FoundIncomplete
+    {
+        final Accepted accepted;
+
+        private FoundIncompleteAccepted(Ballot promisedBallot, Participants participants, Accepted accepted)
+        {
+            super(FOUND_INCOMPLETE_ACCEPTED, participants, promisedBallot);
+            this.accepted = accepted;
+        }
+
+        public String toString()
+        {
+            return "FoundIncomplete" + accepted;
+        }
+    }
+
+    /**
+     * We have been informed of a proposal that was accepted by a majority, but we do not know has been
+     * committed to a majority, and we failed to read from a single natural replica that had witnessed this
+     * commit when we performed the read.
+     * Since this is an edge case, we simply start again, to keep the control flow more easily understood;
+     * the commit shouldld be committed to a majority as part of our re-prepare.
+     */
+    static class FoundIncompleteCommitted extends FoundIncomplete
+    {
+        final Committed committed;
+
+        private FoundIncompleteCommitted(Ballot promisedBallot, Participants participants, Committed committed)
+        {
+            super(FOUND_INCOMPLETE_COMMITTED, participants, promisedBallot);
+            this.committed = committed;
+        }
+
+        public String toString()
+        {
+            return "FoundIncomplete" + committed;
+        }
+    }
+
+    static class MaybeFailure extends Status
+    {
+        final Paxos.MaybeFailure info;
+        private MaybeFailure(Paxos.MaybeFailure info, Participants participants)
+        {
+            super(MAYBE_FAILURE, participants);
+            this.info = info;
+        }
+
+        public String toString() { return info.toString(); }
+    }
+
+    static class ElectorateMismatch extends WithRequestedBallot
+    {
+        private ElectorateMismatch(Participants participants, Ballot ballot)
+        {
+            super(ELECTORATE_MISMATCH, participants, ballot);
+        }
+    }
+
+    private final boolean acceptEarlyReadPermission;
+    private final AbstractRequest<?> request;
+    private Ballot supersededBy; // cannot be promised, as a newer promise has been made
+    private Accepted latestAccepted; // the latest latestAcceptedButNotCommitted response we have received (which may still have been committed elsewhere)
+    private Committed latestCommitted; // latest actually committed proposal
+
+    private final Participants participants;
+
+    private final List<Message<ReadResponse>> readResponses;
+    private boolean haveReadResponseWithLatest;
+    private boolean haveQuorumOfPermissions; // permissions => SUCCESS or READ_SUCCESS
+    private List<InetAddressAndPort> withLatest; // promised and have latest commit
+    private List<InetAddressAndPort> needLatest; // promised without having witnessed latest commit, nor yet been refreshed by us
+    private int failures; // failed either on initial request or on refresh
+    private boolean hasProposalStability = true; // no successful modifying proposal could have raced with us and not been seen
+    private boolean hasOnlyPromises = true;
+    private long maxLowBound;
+
+    private Status outcome;
+    private final Consumer<Status> onDone;
+
+    private PaxosPrepareRefresh refreshStaleParticipants;
+    private boolean linearizabilityViolationDetected = false;
+
+    PaxosPrepare(Participants participants, AbstractRequest<?> request, boolean acceptEarlyReadPermission, Consumer<Status> onDone)
+    {
+        this.acceptEarlyReadPermission = acceptEarlyReadPermission;
+        assert participants.sizeOfConsensusQuorum > 0;
+        this.participants = participants;
+        this.request = request;
+        this.readResponses = new ArrayList<>(participants.sizeOfConsensusQuorum);
+        this.withLatest = new ArrayList<>(participants.sizeOfConsensusQuorum);
+        this.latestAccepted = this.latestCommitted = Committed.none(request.partitionKey, request.table);
+        this.onDone = onDone;
+    }
+
+    private boolean hasInProgressProposal()
+    {
+        // no need to commit a no-op; either it
+        //   1) reached a majority, in which case it was agreed, had no effect and we can do nothing; or
+        //   2) did not reach a majority, was not agreed, and was not user visible as a result so we can ignore it
+        if (latestAccepted.update.isEmpty())
+            return false;
+
+        // If we aren't newer than latestCommitted, then we're done
+        if (!latestAccepted.isAfter(latestCommitted))
+            return false;
+
+        if (latestAccepted.ballot.uuidTimestamp() <= maxLowBound)
+            return false;
+
+        // We can be a re-proposal of latestCommitted, in which case we do not need to re-propose it
+        return !latestAccepted.isReproposalOf(latestCommitted);
+    }
+
+    static PaxosPrepare prepare(Participants participants, SinglePartitionReadCommand readCommand, boolean isWrite, boolean acceptEarlyReadPermission) throws UnavailableException
+    {
+        return prepare(null, participants, readCommand, isWrite, acceptEarlyReadPermission);
+    }
+
+    static PaxosPrepare prepare(Ballot minimumBallot, Participants participants, SinglePartitionReadCommand readCommand, boolean isWrite, boolean acceptEarlyReadPermission) throws UnavailableException
+    {
+        return prepareWithBallot(newBallot(minimumBallot, participants.consistencyForConsensus), participants, readCommand, isWrite, acceptEarlyReadPermission);
+    }
+
+    static PaxosPrepare prepareWithBallot(Ballot ballot, Participants participants, SinglePartitionReadCommand readCommand, boolean isWrite, boolean acceptEarlyReadPermission)
+    {
+        Tracing.trace("Preparing {} with read", ballot);
+        Request request = new Request(ballot, participants.electorate, readCommand, isWrite);
+        return prepareWithBallotInternal(participants, request, acceptEarlyReadPermission, null);
+    }
+
+    @SuppressWarnings("SameParameterValue")
+    static <T extends Consumer<Status>> T prepareWithBallot(Ballot ballot, Participants participants, DecoratedKey partitionKey, TableMetadata table, boolean isWrite, boolean acceptEarlyReadPermission, T onDone)
+    {
+        Tracing.trace("Preparing {}", ballot);
+        prepareWithBallotInternal(participants, new Request(ballot, participants.electorate, partitionKey, table, isWrite), acceptEarlyReadPermission, onDone);
+        return onDone;
+    }
+
+    private static PaxosPrepare prepareWithBallotInternal(Participants participants, Request request, boolean acceptEarlyReadPermission, Consumer<Status> onDone)
+    {
+        PaxosPrepare prepare = new PaxosPrepare(participants, request, acceptEarlyReadPermission, onDone);
+        Message<Request> message = Message.out(PAXOS2_PREPARE_REQ, request);
+        start(prepare, participants, message, RequestHandler::execute);
+        return prepare;
+    }
+
+    /**
+     * Submit the message to our peers, and submit it for local execution if relevant
+     */
+    static <R extends AbstractRequest<R>> void start(PaxosPrepare prepare, Participants participants, Message<R> send, BiFunction<R, InetAddressAndPort, Response> selfHandler)
+    {
+        boolean executeOnSelf = false;
+        for (int i = 0, size = participants.sizeOfPoll() ; i < size ; ++i)
+        {
+            InetAddressAndPort destination = participants.voter(i);
+            boolean isPending = participants.electorate.isPending(destination);
+            logger.trace("{} to {}", send.payload, destination);
+            if (shouldExecuteOnSelf(destination))
+                executeOnSelf = true;
+            else
+                MessagingService.instance().sendWithCallback(isPending ? withoutRead(send) : send, destination, prepare);
+        }
+
+        if (executeOnSelf)
+            send.verb().stage.execute(() -> prepare.executeOnSelf(send.payload, selfHandler));
+    }
+
+    // TODO: extend Sync?
+    public synchronized Status awaitUntil(long deadline)
+    {
+        try
+        {
+            //noinspection StatementWithEmptyBody
+            while (!isDone() && waitUntil(this, deadline)) {}
+
+            if (!isDone())
+                signalDone(MAYBE_FAILURE);
+
+            return outcome;
+        }
+        catch (InterruptedException e)
+        {
+            // can only normally be interrupted if the system is shutting down; should rethrow as a write failure but propagate the interrupt
+            Thread.currentThread().interrupt();
+            return new MaybeFailure(new Paxos.MaybeFailure(true, participants.sizeOfPoll(), participants.sizeOfConsensusQuorum, 0, emptyMap()), participants);
+        }
+    }
+
+    private boolean isDone()
+    {
+        return outcome != null;
+    }
+
+    private int withLatest()
+    {
+        return withLatest.size();
+    }
+
+    private int needLatest()
+    {
+        return needLatest == null ? 0 : needLatest.size();
+    }
+
+    private static boolean needsGossipUpdate(Map<InetAddressAndPort, EndpointState> gossipInfo)
+    {
+        if (gossipInfo.isEmpty())
+            return false;
+
+        for (Map.Entry<InetAddressAndPort, EndpointState> entry : gossipInfo.entrySet())
+        {
+            EndpointState remote = entry.getValue();
+            if (remote == null)
+                continue;
+            EndpointState local = Gossiper.instance.getEndpointStateForEndpoint(entry.getKey());
+            if (local == null || local.isSupersededBy(remote))
+                return true;
+        }
+
+        return false;
+    }
+
+    public synchronized void onResponse(Response response, InetAddressAndPort from)
+    {
+        if (logger.isTraceEnabled())
+            logger.trace("{} for {} from {}", response, request.ballot, from);
+
+        if (isDone())
+        {
+            maybeCheckForLinearizabilityViolation(response, from);
+            return;
+        }
+
+        if (response.isRejected())
+        {
+            Rejected rejected = response.rejected();
+            supersededBy = rejected.supersededBy;
+            signalDone(SUPERSEDED);
+            return;
+        }
+
+        Permitted permitted = response.permitted();
+        if (permitted.gossipInfo.isEmpty())
+            // we agree about the electorate, so can simply accept the promise/permission
+            permitted(permitted, from);
+        else if (!needsGossipUpdate(permitted.gossipInfo))
+            // our gossip is up-to-date, but our original electorate could have been built with stale gossip, so verify it
+            permittedOrTerminateIfElectorateMismatch(permitted, from);
+        else
+            // otherwise our beliefs about the ring potentially diverge, so update gossip with the peer's information
+            Stage.GOSSIP.executor().execute(() -> {
+                Gossiper.instance.notifyFailureDetector(permitted.gossipInfo);
+                Gossiper.instance.applyStateLocally(permitted.gossipInfo);
+
+                // TODO: We should also wait for schema pulls/pushes, however this would be quite an involved change to MigrationManager
+                //       (which currently drops some migration tasks on the floor).
+                //       Note it would be fine for us to fail to complete the migration task and simply treat this response as a failure/timeout.
+
+                // once any pending ranges have been calculated, refresh our Participants list and submit the promise
+                PendingRangeCalculatorService.instance.executeWhenFinished(() -> permittedOrTerminateIfElectorateMismatch(permitted, from));
+            });
+    }
+
+    private synchronized void permittedOrTerminateIfElectorateMismatch(Permitted permitted, InetAddressAndPort from)
+    {
+        if (isDone()) // this execution is asynchronous wrt promise arrival, so must recheck done status
+            return;
+
+        // if the electorate has changed, finish so we can retry with the updated view of the ring
+        if (!Electorate.get(request.table, request.partitionKey, consistency(request.ballot)).equals(participants.electorate))
+        {
+            signalDone(ELECTORATE_MISMATCH);
+            return;
+        }
+
+        // otherwise continue as normal
+        permitted(permitted, from);
+    }
+
+    private void permitted(Permitted permitted, InetAddressAndPort from)
+    {
+        if (permitted.outcome != PROMISE)
+        {
+            hasOnlyPromises = false;
+            if (supersededBy == null)
+                supersededBy = permitted.supersededBy;
+        }
+
+        if (permitted.lowBound > maxLowBound)
+            maxLowBound = permitted.lowBound;
+
+        if (!haveQuorumOfPermissions)
+        {
+            CompareResult compareLatest = permitted.latestCommitted.compareWith(latestCommitted);
+            switch (compareLatest)
+            {
+                default: throw new IllegalStateException();
+                case IS_REPROPOSAL:
+                    latestCommitted = permitted.latestCommitted;
+                case WAS_REPROPOSED_BY:
+                case SAME:
+                    withLatest.add(from);
+                    haveReadResponseWithLatest |= permitted.readResponse != null;
+                    break;
+                case BEFORE:
+                    if (needLatest == null)
+                        needLatest = new ArrayList<>(participants.sizeOfPoll() - withLatest.size());
+                    needLatest.add(from);
+                    break;
+                case AFTER:
+                    // move with->need
+                    if (!withLatest.isEmpty())
+                    {
+                        if (needLatest == null)
+                        {
+                            needLatest = withLatest;
+                            withLatest = new ArrayList<>(Math.min(participants.sizeOfPoll() - needLatest.size(), participants.sizeOfConsensusQuorum));
+                        }
+                        else
+                        {
+                            needLatest.addAll(withLatest);
+                            withLatest.clear();
+                        }
+                    }
+
+                    withLatest.add(from);
+                    haveReadResponseWithLatest = permitted.readResponse != null;
+                    latestCommitted = permitted.latestCommitted;
+            }
+
+            if (isAfter(permitted.latestAcceptedButNotCommitted, latestAccepted))
+                latestAccepted = permitted.latestAcceptedButNotCommitted;
+
+            if (permitted.readResponse != null)
+            {
+                hasProposalStability &= permitted.hadProposalStability;
+                addReadResponse(permitted.readResponse, from);
+            }
+        }
+        else
+        {
+            switch (permitted.latestCommitted.compareWith(latestCommitted))
+            {
+                default: throw new IllegalStateException();
+                case SAME:
+                case IS_REPROPOSAL:
+                case WAS_REPROPOSED_BY:
+                    withLatest.add(from);
+                    break;
+
+                case AFTER:
+                    if (maybeCheckForLinearizabilityViolation(permitted, from))
+                        return;
+                    // witnessing future commit doesn't imply have seen prior, so add to refresh list
+
+                case BEFORE:
+                    if (needLatest == null)
+                        needLatest = new ArrayList<>(participants.sizeOfPoll() - withLatest.size());
+                    needLatest.add(from);
+            }
+        }
+
+        haveQuorumOfPermissions |= withLatest() + needLatest() >= participants.sizeOfConsensusQuorum;
+        if (haveQuorumOfPermissions)
+        {
+            if (request.read != null && readResponses.size() < participants.sizeOfReadQuorum)
+                throw new IllegalStateException("Insufficient read responses: " + readResponses + "; need " + participants.sizeOfReadQuorum);
+
+            if (!hasOnlyPromises && !hasProposalStability)
+                signalDone(SUPERSEDED);
+
+            // We must be certain to have witnessed a quorum of responses before completing any in-progress proposal
+            // else we may complete a stale proposal that did not reach a quorum (and may do so in preference
+            // to a different in progress proposal that did reach a quorum).
+
+            // We should also be sure to return any in progress proposal in preference to any incompletely committed
+            // earlier commits (since, while we should encounter it next round, any commit that is incomplete in the
+            // presence of an incomplete proposal can be ignored, as either the proposal is a re-proposal of the same
+            // commit or the commit has already reached a quorum
+            else if (hasInProgressProposal())
+                signalDone(hasOnlyPromises ? FOUND_INCOMPLETE_ACCEPTED : SUPERSEDED);
+
+            else if (withLatest() >= participants.sizeOfConsensusQuorum)
+                signalDone(hasOnlyPromises ? PROMISED : READ_PERMITTED);
+
+            // otherwise if we have any read response with the latest commit,
+            // try to simply ensure it has been persisted to a consensus group
+            else if (haveReadResponseWithLatest)
+            {
+                refreshStaleParticipants();
+                // if an optimistic read is possible, and we are performing a read,
+                // we can safely answer immediately without waiting for the refresh
+                if (hasProposalStability && acceptEarlyReadPermission)
+                    signalDone(Outcome.READ_PERMITTED);
+            }
+
+            // otherwise we need to run our reads again anyway,
+            // and the chance of receiving another response with latest may be slim.
+            // so we just start again
+            else
+                signalDone(FOUND_INCOMPLETE_COMMITTED);
+        }
+    }
+
+    private boolean maybeCheckForLinearizabilityViolation(Response response, InetAddressAndPort from)
+    {
+        if (!response.isPromised() || !haveQuorumOfPermissions || !hasOnlyPromises)
+            return false;
+
+        Permitted permitted = response.permitted();
+        if (permitted.latestCommitted.compareWith(latestCommitted) == CompareResult.AFTER)
+            return checkForLinearizabilityViolation(permitted, from);
+        return false;
+    }
+
+    private static boolean isRunningLegacyPaxos()
+    {
+        switch (getPaxosVariant())
+        {
+            case v1:
+            case v1_without_linearizable_reads_or_rejected_writes:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    private Ballot getLowBoundForKey()
+    {
+        ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(request.table.id);
+        return cfs != null ? cfs.getPaxosRepairLowBound(request.partitionKey) : Ballot.none();
+    }
+
+    /**
+     * The linearizability check is incompatible with legacy paxos due to at least 2 issues:
+     *  1. The prepare phase doesn't evaluate accepted/committed ballots when promising ballots (excluding legacy_fixed)
+     *  2. Commits made at LOCAL_SERIAL are sent to all DCs
+     * Both issues will trigger linearizability violations, but are fixed by paxos repair. So we shouldn't do
+     * linearizability checks unless we're running v2 paxos and have had at least one paxos repair covering this
+     * operation's key.
+     */
+    private boolean isCompatibleWithLinearizabilityCheck()
+    {
+        if (isRunningLegacyPaxos())
+            return false;
+
+        return getLowBoundForKey() != Ballot.none();
+    }
+
+    private boolean checkForLinearizabilityViolation(Permitted permitted, InetAddressAndPort from)
+    {
+        if (!isCompatibleWithLinearizabilityCheck())
+            return false;
+
+        if (linearizabilityViolationDetected)
+            return false;
+        // if we witness a newer commit AND are accepted something has gone wrong, except:
+
+        // if we have raced with an ongoing commit, having missed all of them initially
+        if (permitted.latestCommitted.hasSameBallot(latestAccepted))
+            return false;
+
+        // or in the case that we have an empty proposal accepted, since that will not be committed
+        // in theory in this case we could now restart refreshStaleParticipants, but this would
+        // unnecessarily complicate the logic so instead we accept that we will unnecessarily re-propose
+        if (latestAccepted != null && latestAccepted.update.isEmpty() && latestAccepted.isAfter(permitted.latestCommitted))
+            return false;
+
+        // or in the case that both are older than the most recent repair low bound), in which case a topology change
+        // could have ocurred that means not all paxos state tables know of the accept/commit, though it is persistent
+        // in theory in this case we could ignore this entirely and call ourselves done
+        // TODO: consider this more; is it possible we cause problems by reproposing an old accept?
+        //  shouldn't be, as any newer accept that reaches a quorum will supersede
+        if (permitted.latestCommitted.ballot.uuidTimestamp() <= maxLowBound)
+            return false;
+
+        // if the lateset commit ballot doesn't have an encoded consistency level, it's from a legacy paxos operation.
+        // Legacy paxos operations would send commits to all replicas for LOCAL_SERIAL operations, which look like
+        // linearizability violations from datacenters the operation wasn't run in, so we ignore them here.
+        if (permitted.latestCommitted.ballot.flag() == NONE)
+            return false;
+
+        // If we discovered an incomplete proposal, it could have since completed successfullly
+        if (latestAccepted != null && outcome.outcome == FOUND_INCOMPLETE_ACCEPTED)
+        {
+            switch (permitted.latestCommitted.compareWith(latestAccepted))
+            {
+                case WAS_REPROPOSED_BY:
+                case SAME:
+                    return false;
+            }
+        }
+
+        long gcGraceMicros = TimeUnit.SECONDS.toMicros(permitted.latestCommitted.update.metadata().params.gcGraceSeconds);
+        // paxos repair uses stale ballots, so comparing against request.ballot time will not completely prevent false
+        // positives, since compaction may have removed paxos metadata on some nodes and not others. It's also possible
+        // clock skew has placed the ballot to repair in the future, so we use now or the ballot, whichever is higher.
+        long maxNowMicros = Math.max(currentTimeMillis() * 1000, request.ballot.unixMicros());
+        long ageMicros = maxNowMicros - permitted.latestCommitted.ballot.unixMicros();
+
+        String modifier = "";
+        boolean isTtlViolation;
+        if (isTtlViolation = (ageMicros >= gcGraceMicros))
+        {
+            if (participants.hasOldParticipants())
+                modifier = " (older than legacy TTL expiry with at least one legacy participant)";
+            else
+                modifier = " (older than legacy TTL expiry)";
+        }
+        String message = String.format("Linearizability violation%s: %s witnessed %s of latest %s (withLatest: %s, readResponses: %s, maxLowBound: %s, status: %s); %s promised with latest %s",
+                                       modifier, request.ballot, consistency(request.ballot), latestCommitted,
+                                       withLatest, readResponses
+                        .stream()
+                        .map(Message::from)
+                        .map(Object::toString)
+                        .collect(Collectors.joining(", ", "[", "]")),
+                                       maxLowBound, outcome, from, permitted.latestCommitted);
+
+        PaxosMetrics.linearizabilityViolations.inc();
+        linearizabilityViolationDetected = true;
+
+        try
+        {
+            switch (DatabaseDescriptor.paxosOnLinearizabilityViolations())
+            {
+                default: throw new AssertionError();
+                case fail:
+                    signalDone(new MaybeFailure(new Paxos.MaybeFailure(true, "A linearizability violation was detected", participants.sizeOfPoll(), participants.sizeOfConsensusQuorum, withLatest() + needLatest(), Collections.emptyMap()), participants));
+                    return true;
+                case log:
+                    if (isTtlViolation && LOG_TTL_LINEARIZABILITY_VIOLATIONS) logger.warn(message);
+                    else logger.error(message);
+                    return false;
+                case ignore:
+                    return false;
+            }
+        }
+        finally
+        {
+            Runnable run = onLinearizabilityViolation;
+            if (run != null)
+                run.run();
+        }
+    }
+
+    /**
+     * Save a read response from a node that we know to have witnessed the most recent commit
+     *
+     * Must be invoked while owning lock
+     */
+    private void addReadResponse(ReadResponse response, InetAddressAndPort from)
+    {
+        readResponses.add(Message.synthetic(from, PAXOS2_PREPARE_RSP, response));
+    }
+
+    @Override
+    public synchronized void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        if (logger.isTraceEnabled())
+            logger.trace("{} {} failure from {}", request, reason, from);
+
+        if (isDone())
+            return;
+
+        super.onFailureWithMutex(from, reason);
+        ++failures;
+
+        if (failures + participants.sizeOfConsensusQuorum == 1 + participants.sizeOfPoll())
+            signalDone(MAYBE_FAILURE);
+    }
+
+    private void signalDone(Outcome kindOfOutcome)
+    {
+        signalDone(toStatus(kindOfOutcome));
+    }
+
+    private void signalDone(Status status)
+    {
+        if (isDone())
+            throw new IllegalStateException();
+
+        this.outcome = status;
+        if (onDone != null)
+            onDone.accept(outcome);
+        notifyAll();
+    }
+
+    private Status toStatus(Outcome outcome)
+    {
+        switch (outcome)
+        {
+            case ELECTORATE_MISMATCH:
+                return new ElectorateMismatch(participants, request.ballot);
+            case SUPERSEDED:
+                return new Superseded(supersededBy, participants);
+            case FOUND_INCOMPLETE_ACCEPTED:
+                return new FoundIncompleteAccepted(request.ballot, participants, latestAccepted);
+            case FOUND_INCOMPLETE_COMMITTED:
+                return new FoundIncompleteCommitted(request.ballot, participants, latestCommitted);
+            case PROMISED:
+                return Success.readOrWrite(request.ballot, participants, readResponses, hasProposalStability);
+            case READ_PERMITTED:
+                if (!hasProposalStability)
+                    throw new IllegalStateException();
+                return Success.read(request.ballot, participants, readResponses, supersededBy);
+            case MAYBE_FAILURE:
+                return new MaybeFailure(new Paxos.MaybeFailure(participants, withLatest(), failureReasonsAsMap()), participants);
+            default:
+                throw new IllegalStateException();
+        }
+    }
+
+    /**
+     * See {@link PaxosPrepareRefresh}
+     *
+     * Must be invoked while owning lock
+     */
+    private void refreshStaleParticipants()
+    {
+        if (refreshStaleParticipants == null)
+            refreshStaleParticipants = new PaxosPrepareRefresh(request.ballot, participants, latestCommitted, this);
+
+        refreshStaleParticipants.refresh(needLatest);
+        needLatest.clear();
+    }
+
+    @Override
+    public void onRefreshFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        onFailure(from, reason);
+    }
+
+    public synchronized void onRefreshSuccess(Ballot isSupersededBy, InetAddressAndPort from)
+    {
+        if (logger.isTraceEnabled())
+            logger.trace("Refresh {} from {}", isSupersededBy == null ? "Success" : "SupersededBy(" + isSupersededBy + ')', from);
+
+        if (isDone())
+            return;
+
+        if (isSupersededBy != null)
+        {
+            supersededBy = isSupersededBy;
+            if (hasProposalStability) signalDone(Outcome.READ_PERMITTED);
+            else signalDone(SUPERSEDED);
+        }
+        else
+        {
+            withLatest.add(from);
+            if (withLatest.size() >= participants.sizeOfConsensusQuorum)
+                signalDone(hasOnlyPromises ? Outcome.PROMISED : Outcome.READ_PERMITTED);
+        }
+    }
+
+    static abstract class AbstractRequest<R extends AbstractRequest<R>>
+    {
+        final Ballot ballot;
+        final Electorate electorate;
+        final SinglePartitionReadCommand read;
+        final boolean isForWrite;
+        final DecoratedKey partitionKey;
+        final TableMetadata table;
+
+        AbstractRequest(Ballot ballot, Electorate electorate, SinglePartitionReadCommand read, boolean isForWrite)
+        {
+            this.ballot = ballot;
+            this.electorate = electorate;
+            this.read = read;
+            this.isForWrite = isForWrite;
+            this.partitionKey = read.partitionKey();
+            this.table = read.metadata();
+        }
+
+        AbstractRequest(Ballot ballot, Electorate electorate, DecoratedKey partitionKey, TableMetadata table, boolean isForWrite)
+        {
+            this.ballot = ballot;
+            this.electorate = electorate;
+            this.partitionKey = partitionKey;
+            this.table = table;
+            this.read = null;
+            this.isForWrite = isForWrite;
+        }
+
+        abstract R withoutRead();
+
+        public String toString()
+        {
+            return "Prepare(" + ballot + ')';
+        }
+    }
+
+    static class Request extends AbstractRequest<Request>
+    {
+        Request(Ballot ballot, Electorate electorate, SinglePartitionReadCommand read, boolean isWrite)
+        {
+            super(ballot, electorate, read, isWrite);
+        }
+
+        private Request(Ballot ballot, Electorate electorate, DecoratedKey partitionKey, TableMetadata table, boolean isWrite)
+        {
+            super(ballot, electorate, partitionKey, table, isWrite);
+        }
+
+        Request withoutRead()
+        {
+            return read == null ? this : new Request(ballot, electorate, partitionKey, table, isForWrite);
+        }
+
+        public String toString()
+        {
+            return "Prepare(" + ballot + ')';
+        }
+    }
+
+    static class Response
+    {
+        final MaybePromise.Outcome outcome;
+
+        Response(MaybePromise.Outcome outcome)
+        {
+            this.outcome = outcome;
+        }
+        Permitted permitted() { return (Permitted) this; }
+        Rejected rejected() { return (Rejected) this; }
+
+        public boolean isRejected()
+        {
+            return outcome == REJECT;
+        }
+
+        public boolean isPromised()
+        {
+            return outcome == PROMISE;
+        }
+    }
+
+    static class Permitted extends Response
+    {
+        final long lowBound;
+        // a proposal that has been accepted but not committed, i.e. must be null or > latestCommit
+        @Nullable final Accepted latestAcceptedButNotCommitted;
+        final Committed latestCommitted;
+        @Nullable final ReadResponse readResponse;
+        // latestAcceptedButNotCommitted and latestCommitted were the same before and after the read occurred, and no incomplete promise was witnessed
+        final boolean hadProposalStability;
+        final Map<InetAddressAndPort, EndpointState> gossipInfo;
+        @Nullable final Ballot supersededBy;
+
+        Permitted(MaybePromise.Outcome outcome, long lowBound, @Nullable Accepted latestAcceptedButNotCommitted, Committed latestCommitted, @Nullable ReadResponse readResponse, boolean hadProposalStability, Map<InetAddressAndPort, EndpointState> gossipInfo, @Nullable Ballot supersededBy)
+        {
+            super(outcome);
+            this.lowBound = lowBound;
+            this.latestAcceptedButNotCommitted = latestAcceptedButNotCommitted;
+            this.latestCommitted = latestCommitted;
+            this.hadProposalStability = hadProposalStability;
+            this.readResponse = readResponse;
+            this.gossipInfo = gossipInfo;
+            this.supersededBy = supersededBy;
+        }
+
+        @Override
+        public String toString()
+        {
+            return "Promise(" + latestAcceptedButNotCommitted + ", " + latestCommitted + ", " + hadProposalStability + ", " + gossipInfo + ')';
+        }
+    }
+
+    static class Rejected extends Response
+    {
+        final Ballot supersededBy;
+
+        Rejected(Ballot supersededBy)
+        {
+            super(REJECT);
+            this.supersededBy = supersededBy;
+        }
+
+        @Override
+        public String toString()
+        {
+            return "RejectPromise(supersededBy=" + supersededBy + ')';
+        }
+    }
+
+    public static class RequestHandler implements IVerbHandler<Request>
+    {
+        @Override
+        public void doVerb(Message<Request> message)
+        {
+            Response response = execute(message.payload, message.from());
+            if (response == null)
+                MessagingService.instance().respondWithFailure(UNKNOWN, message);
+            else
+                MessagingService.instance().respond(response, message);
+        }
+
+        static Response execute(AbstractRequest<?> request, InetAddressAndPort from)
+        {
+            if (!isInRangeAndShouldProcess(from, request.partitionKey, request.table, request.read != null))
+                return null;
+
+            long start = nanoTime();
+            try (PaxosState state = get(request.partitionKey, request.table))
+            {
+                return execute(request, state);
+            }
+            finally
+            {
+                Keyspace.openAndGetStore(request.table).metric.casPrepare.addNano(nanoTime() - start);
+            }
+        }
+
+        static Response execute(AbstractRequest<?> request, PaxosState state)
+        {
+            MaybePromise result = state.promiseIfNewer(request.ballot, request.isForWrite);
+            switch (result.outcome)
+            {
+                case PROMISE:
+                case PERMIT_READ:
+                    // verify electorates; if they differ, send back gossip info for superset of two participant sets
+                    Map<InetAddressAndPort, EndpointState> gossipInfo = verifyElectorate(request.electorate, Electorate.get(request.table, request.partitionKey, consistency(request.ballot)));
+                    ReadResponse readResponse = null;
+
+                    // Check we cannot race with a proposal, i.e. that we have not made a promise that
+                    // could be in the process of making a proposal. If a majority of nodes have made no such promise
+                    // then either we must have witnessed it (since it must have been committed), or the proposal
+                    // will now be rejected by our promises.
+
+                    // This is logicaly complicated a bit by reading from a subset of the consensus group when there are
+                    // pending nodes, however electorate verification we will cause us to retry if the pending status changes
+                    // during execution; otherwise if the most recent commit we witnessed wasn't witnessed by a read response
+                    // we will abort and retry, and we must witness it by the above argument.
+
+                    Ballot mostRecentCommit = result.before.accepted != null
+                                              && result.before.accepted.ballot.compareTo(result.before.committed.ballot) > 0
+                                              && result.before.accepted.update.isEmpty()
+                                              ? result.before.accepted.ballot : result.before.committed.ballot;
+
+                    boolean hasProposalStability = mostRecentCommit.equals(result.before.promisedWrite)
+                                                   || mostRecentCommit.compareTo(result.before.promisedWrite) > 0;
+
+                    if (request.read != null)
+                    {
+                        try (ReadExecutionController executionController = request.read.executionController();
+                             UnfilteredPartitionIterator iterator = request.read.executeLocally(executionController))
+                        {
+                            readResponse = request.read.createResponse(iterator, executionController.getRepairedDataInfo());
+                        }
+
+                        if (hasProposalStability)
+                        {
+                            Snapshot now = state.current(request.ballot);
+                            hasProposalStability = now.promisedWrite == result.after.promisedWrite
+                                    && now.committed == result.after.committed
+                                    && now.accepted == result.after.accepted;
+                        }
+                    }
+
+                    Ballot supersededBy = result.outcome == PROMISE ? null : result.after.latestWitnessedOrLowBound();
+                    Accepted acceptedButNotCommitted = result.after.accepted;
+                    Committed committed = result.after.committed;
+
+                    ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(request.table.id);
+                    long lowBound = cfs.getPaxosRepairLowBound(request.partitionKey).uuidTimestamp();
+                    return new Permitted(result.outcome, lowBound, acceptedButNotCommitted, committed, readResponse, hasProposalStability, gossipInfo, supersededBy);
+
+                case REJECT:
+                    return new Rejected(result.supersededBy());
+
+                default:
+                    throw new IllegalStateException();
+            }
+        }
+    }
+
+    static abstract class AbstractRequestSerializer<R extends AbstractRequest<R>, T> implements IVersionedSerializer<R>
+    {
+        abstract R construct(T param, Ballot ballot, Electorate electorate, SinglePartitionReadCommand read, boolean isWrite);
+        abstract R construct(T param, Ballot ballot, Electorate electorate, DecoratedKey partitionKey, TableMetadata table, boolean isWrite);
+
+        @Override
+        public void serialize(R request, DataOutputPlus out, int version) throws IOException
+        {
+            request.ballot.serialize(out);
+            Electorate.serializer.serialize(request.electorate, out, version);
+            out.writeByte((request.read != null ? 1 : 0) | (request.isForWrite ? 0 : 2));
+            if (request.read != null)
+            {
+
+                ReadCommand.serializer.serialize(request.read, out, version);
+            }
+            else
+            {
+                request.table.id.serialize(out);
+                DecoratedKey.serializer.serialize(request.partitionKey, out, version);
+            }
+        }
+
+        public R deserialize(T param, DataInputPlus in, int version) throws IOException
+        {
+            Ballot ballot = Ballot.deserialize(in);
+            Electorate electorate = Electorate.serializer.deserialize(in, version);
+            byte flag = in.readByte();
+            if ((flag & 1) != 0)
+            {
+                SinglePartitionReadCommand readCommand = (SinglePartitionReadCommand) ReadCommand.serializer.deserialize(in, version);
+                return construct(param, ballot, electorate, readCommand, (flag & 2) == 0);
+            }
+            else
+            {
+                TableMetadata table = Schema.instance.getExistingTableMetadata(TableId.deserialize(in));
+                DecoratedKey partitionKey = (DecoratedKey) DecoratedKey.serializer.deserialize(in, table.partitioner, version);
+                return construct(param, ballot, electorate, partitionKey, table, (flag & 2) != 0);
+            }
+        }
+
+        @Override
+        public long serializedSize(R request, int version)
+        {
+            return Ballot.sizeInBytes()
+                   + Electorate.serializer.serializedSize(request.electorate, version)
+                   + 1 + (request.read != null
+                        ? ReadCommand.serializer.serializedSize(request.read, version)
+                        : request.table.id.serializedSize()
+                            + DecoratedKey.serializer.serializedSize(request.partitionKey, version));
+        }
+    }
+
+    public static class RequestSerializer extends AbstractRequestSerializer<Request, Object>
+    {
+        Request construct(Object ignore, Ballot ballot, Electorate electorate, SinglePartitionReadCommand read, boolean isWrite)
+        {
+            return new Request(ballot, electorate, read, isWrite);
+        }
+
+        Request construct(Object ignore, Ballot ballot, Electorate electorate, DecoratedKey partitionKey, TableMetadata table, boolean isWrite)
+        {
+            return new Request(ballot, electorate, partitionKey, table, isWrite);
+        }
+
+        public Request deserialize(DataInputPlus in, int version) throws IOException
+        {
+            return deserialize(null, in, version);
+        }
+    }
+
+    public static class ResponseSerializer implements IVersionedSerializer<Response>
+    {
+        public void serialize(Response response, DataOutputPlus out, int version) throws IOException
+        {
+            if (response.isRejected())
+            {
+                out.writeByte(0);
+                Rejected rejected = (Rejected) response;
+                rejected.supersededBy.serialize(out);
+            }
+            else
+            {
+                Permitted promised = (Permitted) response;
+                out.writeByte(1
+                        | (promised.latestAcceptedButNotCommitted != null ? 2  : 0)
+                        | (promised.readResponse != null                  ? 4  : 0)
+                        | (promised.hadProposalStability                  ? 8  : 0)
+                        | (promised.outcome == PERMIT_READ ? 16 : 0)
+                );
+                out.writeUnsignedVInt(promised.lowBound);
+                if (promised.latestAcceptedButNotCommitted != null)
+                    Accepted.serializer.serialize(promised.latestAcceptedButNotCommitted, out, version);
+                Committed.serializer.serialize(promised.latestCommitted, out, version);
+                if (promised.readResponse != null)
+                    ReadResponse.serializer.serialize(promised.readResponse, out, version);
+                serializeMap(inetAddressAndPortSerializer, EndpointState.nullableSerializer, promised.gossipInfo, out, version);
+                if (promised.outcome == PERMIT_READ)
+                    promised.supersededBy.serialize(out);
+            }
+        }
+
+        public Response deserialize(DataInputPlus in, int version) throws IOException
+        {
+            byte flags = in.readByte();
+            if (flags == 0)
+            {
+                Ballot supersededBy = Ballot.deserialize(in);
+                return new Rejected(supersededBy);
+            }
+            else
+            {
+                long lowBound = in.readUnsignedVInt();
+                Accepted acceptedNotCommitted = (flags & 2) != 0 ? Accepted.serializer.deserialize(in, version) : null;
+                Committed committed = Committed.serializer.deserialize(in, version);
+                ReadResponse readResponse = (flags & 4) != 0 ? ReadResponse.serializer.deserialize(in, version) : null;
+                Map<InetAddressAndPort, EndpointState> gossipInfo = deserializeMap(inetAddressAndPortSerializer, EndpointState.nullableSerializer, newHashMap(), in, version);
+                MaybePromise.Outcome outcome = (flags & 16) != 0 ? PERMIT_READ : PROMISE;
+                boolean hasProposalStability = (flags & 8) != 0;
+                Ballot supersededBy = null;
+                if (outcome == PERMIT_READ)
+                    supersededBy = Ballot.deserialize(in);
+                return new Permitted(outcome, lowBound, acceptedNotCommitted, committed, readResponse, hasProposalStability, gossipInfo, supersededBy);
+            }
+        }
+
+        public long serializedSize(Response response, int version)
+        {
+            if (response.isRejected())
+            {
+                return 1 + Ballot.sizeInBytes();
+            }
+            else
+            {
+                Permitted permitted = (Permitted) response;
+                return 1
+                        + VIntCoding.computeUnsignedVIntSize(permitted.lowBound)
+                        + (permitted.latestAcceptedButNotCommitted == null ? 0 : Accepted.serializer.serializedSize(permitted.latestAcceptedButNotCommitted, version))
+                        + Committed.serializer.serializedSize(permitted.latestCommitted, version)
+                        + (permitted.readResponse == null ? 0 : ReadResponse.serializer.serializedSize(permitted.readResponse, version))
+                        + serializedSizeMap(inetAddressAndPortSerializer, EndpointState.nullableSerializer, permitted.gossipInfo, version)
+                        + (permitted.outcome == PERMIT_READ ? Ballot.sizeInBytes() : 0);
+            }
+        }
+    }
+
+    static <R extends AbstractRequest<R>> Message<R> withoutRead(Message<R> send)
+    {
+        if (send.payload.read == null)
+            return send;
+
+        return send.withPayload(send.payload.withoutRead());
+    }
+
+    public static void setOnLinearizabilityViolation(Runnable runnable)
+    {
+        assert onLinearizabilityViolation == null || runnable == null;
+        onLinearizabilityViolation = runnable;
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosPrepareRefresh.java b/src/java/org/apache/cassandra/service/paxos/PaxosPrepareRefresh.java
new file mode 100644
index 0000000..19aff74
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosPrepareRefresh.java
@@ -0,0 +1,244 @@
+/*
+ * 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.service.paxos;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.exceptions.WriteTimeoutException;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.RequestCallbackWithFailure;
+import org.apache.cassandra.service.paxos.Commit.Agreed;
+import org.apache.cassandra.service.paxos.Commit.Committed;
+import org.apache.cassandra.tracing.Tracing;
+
+import static org.apache.cassandra.exceptions.RequestFailureReason.TIMEOUT;
+import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REFRESH_REQ;
+import static org.apache.cassandra.service.paxos.Commit.isAfter;
+import static org.apache.cassandra.service.paxos.PaxosRequestCallback.shouldExecuteOnSelf;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+import static org.apache.cassandra.utils.NullableSerializer.deserializeNullable;
+import static org.apache.cassandra.utils.NullableSerializer.serializeNullable;
+import static org.apache.cassandra.utils.NullableSerializer.serializedSizeNullable;
+
+/**
+ * Nodes that have promised in response to our prepare, may be missing the latestCommit, meaning we cannot be sure the
+ * prior round has been committed to the necessary quorum of participants, so that it will be visible to future quorums.
+ *
+ * To resolve this problem, we submit the latest commit we have seen, and wait for confirmation before continuing
+ * (verifying that we are still promised in the process).
+ */
+public class PaxosPrepareRefresh implements RequestCallbackWithFailure<PaxosPrepareRefresh.Response>
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosPrepareRefresh.class);
+
+    public static final RequestHandler requestHandler = new RequestHandler();
+    public static final RequestSerializer requestSerializer = new RequestSerializer();
+    public static final ResponseSerializer responseSerializer = new ResponseSerializer();
+
+    interface Callbacks
+    {
+        void onRefreshFailure(InetAddressAndPort from, RequestFailureReason reason);
+        void onRefreshSuccess(Ballot isSupersededBy, InetAddressAndPort from);
+    }
+
+    private final Message<Request> send;
+    private final Callbacks callbacks;
+
+    public PaxosPrepareRefresh(Ballot prepared, Paxos.Participants participants, Committed latestCommitted, Callbacks callbacks)
+    {
+        this.callbacks = callbacks;
+        this.send = Message.out(PAXOS2_PREPARE_REFRESH_REQ, new Request(prepared, latestCommitted));
+    }
+
+    void refresh(List<InetAddressAndPort> refresh)
+    {
+        boolean executeOnSelf = false;
+        for (int i = 0, size = refresh.size(); i < size ; ++i)
+        {
+            InetAddressAndPort destination = refresh.get(i);
+
+            if (logger.isTraceEnabled())
+                logger.trace("Refresh {} and Confirm {} to {}", send.payload.missingCommit, Ballot.toString(send.payload.promised, "Promise"), destination);
+
+            if (Tracing.isTracing())
+                Tracing.trace("Refresh {} and Confirm {} to {}", send.payload.missingCommit.ballot, send.payload.promised, destination);
+
+            if (shouldExecuteOnSelf(destination))
+                executeOnSelf = true;
+            else
+                MessagingService.instance().sendWithCallback(send, destination, this);
+        }
+
+        if (executeOnSelf)
+            PAXOS2_PREPARE_REFRESH_REQ.stage.execute(this::executeOnSelf);
+    }
+
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        callbacks.onRefreshFailure(from, reason);
+    }
+
+    @Override
+    public void onResponse(Message<Response> message)
+    {
+        onResponse(message.payload, message.from());
+    }
+
+    private void executeOnSelf()
+    {
+        Response response;
+        try
+        {
+            response = RequestHandler.execute(send.payload, getBroadcastAddressAndPort());
+            if (response == null)
+                return;
+        }
+        catch (Exception ex)
+        {
+            RequestFailureReason reason = UNKNOWN;
+            if (ex instanceof WriteTimeoutException) reason = TIMEOUT;
+            else logger.error("Failed to apply paxos refresh-prepare locally", ex);
+
+            onFailure(getBroadcastAddressAndPort(), reason);
+            return;
+        }
+        onResponse(response, getBroadcastAddressAndPort());
+    }
+
+    private void onResponse(Response response, InetAddressAndPort from)
+    {
+        callbacks.onRefreshSuccess(response.isSupersededBy, from);
+    }
+
+    private static class Request
+    {
+        final Ballot promised;
+        final Committed missingCommit;
+
+        Request(Ballot promised, Committed missingCommit)
+        {
+            this.promised = promised;
+            this.missingCommit = missingCommit;
+        }
+    }
+
+    static class Response
+    {
+        final Ballot isSupersededBy;
+        Response(Ballot isSupersededBy)
+        {
+            this.isSupersededBy = isSupersededBy;
+        }
+    }
+
+    public static class RequestHandler implements IVerbHandler<Request>
+    {
+        @Override
+        public void doVerb(Message<Request> message)
+        {
+            Response response = execute(message.payload, message.from());
+            if (response == null)
+                MessagingService.instance().respondWithFailure(UNKNOWN, message);
+            else
+                MessagingService.instance().respond(response, message);
+        }
+
+        public static Response execute(Request request, InetAddressAndPort from)
+        {
+            Agreed commit = request.missingCommit;
+
+            if (!Paxos.isInRangeAndShouldProcess(from, commit.update.partitionKey(), commit.update.metadata(), false))
+                return null;
+
+            try (PaxosState state = PaxosState.get(commit))
+            {
+                state.commit(commit);
+                Ballot latest = state.current(request.promised).latestWitnessedOrLowBound();
+                if (isAfter(latest, request.promised))
+                {
+                    Tracing.trace("Promise {} rescinded; latest is now {}", request.promised, latest);
+                    return new Response(latest);
+                }
+                else
+                {
+                    Tracing.trace("Promise confirmed for ballot {}", request.promised);
+                    return new Response(null);
+                }
+            }
+        }
+    }
+
+    public static class RequestSerializer implements IVersionedSerializer<Request>
+    {
+        @Override
+        public void serialize(Request request, DataOutputPlus out, int version) throws IOException
+        {
+            request.promised.serialize(out);
+            Committed.serializer.serialize(request.missingCommit, out, version);
+        }
+
+        @Override
+        public Request deserialize(DataInputPlus in, int version) throws IOException
+        {
+            Ballot promise = Ballot.deserialize(in);
+            Committed missingCommit = Committed.serializer.deserialize(in, version);
+            return new Request(promise, missingCommit);
+        }
+
+        @Override
+        public long serializedSize(Request request, int version)
+        {
+            return Ballot.sizeInBytes()
+                   + Committed.serializer.serializedSize(request.missingCommit, version);
+        }
+    }
+
+    public static class ResponseSerializer implements IVersionedSerializer<Response>
+    {
+        public void serialize(Response response, DataOutputPlus out, int version) throws IOException
+        {
+            serializeNullable(Ballot.Serializer.instance, response.isSupersededBy, out, version);
+        }
+
+        public Response deserialize(DataInputPlus in, int version) throws IOException
+        {
+            Ballot isSupersededBy = deserializeNullable(Ballot.Serializer.instance, in, version);
+            return new Response(isSupersededBy);
+        }
+
+        public long serializedSize(Response response, int version)
+        {
+            return serializedSizeNullable(Ballot.Serializer.instance, response.isSupersededBy, version);
+        }
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosPropose.java b/src/java/org/apache/cassandra/service/paxos/PaxosPropose.java
new file mode 100644
index 0000000..57d3459
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosPropose.java
@@ -0,0 +1,479 @@
+/*
+ * 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.service.paxos;
+
+import java.io.IOException;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.Consumer;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.service.paxos.Commit.Proposal;
+import org.apache.cassandra.utils.concurrent.ConditionAsConsumer;
+
+import static java.util.Collections.emptyMap;
+import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
+import static org.apache.cassandra.net.Verb.PAXOS2_PROPOSE_REQ;
+import static org.apache.cassandra.service.paxos.PaxosPropose.Superseded.SideEffects.NO;
+import static org.apache.cassandra.service.paxos.PaxosPropose.Superseded.SideEffects.MAYBE;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.ConditionAsConsumer.newConditionAsConsumer;
+
+/**
+ * In waitForNoSideEffect mode, we will not return failure to the caller until
+ * we have received a complete set of refusal responses, or at least one accept,
+ * indicating (respectively) that we have had no side effect, or that we cannot
+ * know if we our proposal produced a side effect.
+ */
+public class PaxosPropose<OnDone extends Consumer<? super PaxosPropose.Status>> extends PaxosRequestCallback<PaxosPropose.Response>
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosPropose.class);
+
+    public static final RequestHandler requestHandler = new RequestHandler();
+    public static final RequestSerializer requestSerializer = new RequestSerializer();
+    public static final ResponseSerializer responseSerializer = new ResponseSerializer();
+
+    /**
+     * Represents the current status of a propose action: it is a status rather than a result,
+     * as the result may be unknown without sufficient responses (though in most cases it is final status).
+     */
+    static class Status
+    {
+        enum Outcome { SUCCESS, SUPERSEDED, MAYBE_FAILURE }
+        final Outcome outcome;
+
+        Status(Outcome outcome)
+        {
+            this.outcome = outcome;
+        }
+        Superseded superseded() { return (Superseded) this; }
+        Paxos.MaybeFailure maybeFailure() { return ((MaybeFailure) this).info; }
+        public String toString() { return "Success"; }
+    }
+
+    static class Superseded extends Status
+    {
+        enum SideEffects { NO, MAYBE }
+        final Ballot by;
+        final SideEffects hadSideEffects;
+        Superseded(Ballot by, SideEffects hadSideEffects)
+        {
+            super(Outcome.SUPERSEDED);
+            this.by = by;
+            this.hadSideEffects = hadSideEffects;
+        }
+
+        public String toString() { return "Superseded(" + by + ',' + hadSideEffects + ')'; }
+    }
+
+    private static class MaybeFailure extends Status
+    {
+        final Paxos.MaybeFailure info;
+        MaybeFailure(Paxos.MaybeFailure info)
+        {
+            super(Outcome.MAYBE_FAILURE);
+            this.info = info;
+        }
+
+        public String toString() { return info.toString(); }
+    }
+
+    private static final Status success = new Status(Status.Outcome.SUCCESS);
+
+    private static final AtomicLongFieldUpdater<PaxosPropose> responsesUpdater = AtomicLongFieldUpdater.newUpdater(PaxosPropose.class, "responses");
+    private static final AtomicReferenceFieldUpdater<PaxosPropose, Ballot> supersededByUpdater = AtomicReferenceFieldUpdater.newUpdater(PaxosPropose.class, Ballot.class, "supersededBy");
+
+    @VisibleForTesting public static final long ACCEPT_INCREMENT = 1;
+    private static final int  REFUSAL_SHIFT = 21;
+    @VisibleForTesting public static final long REFUSAL_INCREMENT = 1L << REFUSAL_SHIFT;
+    private static final int  FAILURE_SHIFT = 42;
+    @VisibleForTesting public static final long FAILURE_INCREMENT = 1L << FAILURE_SHIFT;
+    private static final long MASK = (1L << REFUSAL_SHIFT) - 1L;
+
+    private final Proposal proposal;
+    /** Wait until we know if we may have had side effects */
+    private final boolean waitForNoSideEffect;
+    /** Number of contacted nodes */
+    final int participants;
+    /** Number of accepts required */
+    final int required;
+    /** Invoke on reaching a terminal status */
+    final OnDone onDone;
+
+    /**
+     * bit 0-20:  accepts
+     * bit 21-41: refusals/errors
+     * bit 42-62: timeouts
+     * bit 63:    ambiguous signal bit (i.e. those states that cannot be certain to signal uniquely flip this bit to take signal responsibility)
+     *
+     * {@link #accepts}
+     * {@link #refusals}
+     * {@link #failures}
+     * {@link #notAccepts} (timeouts/errors+refusals)
+     */
+    private volatile long responses;
+
+    /** The newest superseding ballot from a refusal; only returned to the caller if we fail to reach a quorum */
+    private volatile Ballot supersededBy;
+
+    private PaxosPropose(Proposal proposal, int participants, int required, boolean waitForNoSideEffect, OnDone onDone)
+    {
+        this.proposal = proposal;
+        assert required > 0;
+        this.waitForNoSideEffect = waitForNoSideEffect;
+        this.participants = participants;
+        this.required = required;
+        this.onDone = onDone;
+    }
+
+    /**
+     * Submit the proposal for commit with all replicas, and return an object that can be waited on synchronously for the result,
+     * or for the present status if the time elapses without a final result being reached.
+     * @param waitForNoSideEffect if true, on failure we will wait until we can say with certainty there are no side effects
+     *                            or until we know we will never be able to determine this with certainty
+     */
+    static Paxos.Async<Status> propose(Proposal proposal, Paxos.Participants participants, boolean waitForNoSideEffect)
+    {
+        if (waitForNoSideEffect && proposal.update.isEmpty())
+            waitForNoSideEffect = false; // by definition this has no "side effects" (besides linearizing the operation)
+
+        // to avoid unnecessary object allocations we extend PaxosPropose to implements Paxos.Async
+        class Async extends PaxosPropose<ConditionAsConsumer<Status>> implements Paxos.Async<Status>
+        {
+            private Async(Proposal proposal, int participants, int required, boolean waitForNoSideEffect)
+            {
+                super(proposal, participants, required, waitForNoSideEffect, newConditionAsConsumer());
+            }
+
+            public Status awaitUntil(long deadline)
+            {
+                try
+                {
+                    onDone.awaitUntil(deadline);
+                }
+                catch (InterruptedException e)
+                {
+                    Thread.currentThread().interrupt();
+                    return new MaybeFailure(new Paxos.MaybeFailure(true, participants, required, 0, emptyMap()));
+                }
+
+                return status();
+            }
+        }
+
+        Async propose = new Async(proposal, participants.sizeOfPoll(), participants.sizeOfConsensusQuorum, waitForNoSideEffect);
+        propose.start(participants);
+        return propose;
+    }
+
+    static <T extends Consumer<Status>> T propose(Proposal proposal, Paxos.Participants participants, boolean waitForNoSideEffect, T onDone)
+    {
+        if (waitForNoSideEffect && proposal.update.isEmpty())
+            waitForNoSideEffect = false; // by definition this has no "side effects" (besides linearizing the operation)
+
+        PaxosPropose<?> propose = new PaxosPropose<>(proposal, participants.sizeOfPoll(), participants.sizeOfConsensusQuorum, waitForNoSideEffect, onDone);
+        propose.start(participants);
+        return onDone;
+    }
+
+    void start(Paxos.Participants participants)
+    {
+        Message<Request> message = Message.out(PAXOS2_PROPOSE_REQ, new Request(proposal));
+
+        boolean executeOnSelf = false;
+        for (int i = 0, size = participants.sizeOfPoll(); i < size ; ++i)
+        {
+            InetAddressAndPort destination = participants.voter(i);
+            logger.trace("{} to {}", proposal, destination);
+            if (shouldExecuteOnSelf(destination)) executeOnSelf = true;
+            else MessagingService.instance().sendWithCallback(message, destination, this);
+        }
+
+        if (executeOnSelf)
+            PAXOS2_PROPOSE_REQ.stage.execute(() -> executeOnSelf(proposal));
+    }
+
+    /**
+     * @return the result as of now; unless the result is definitive, it is only a snapshot of the present incomplete status
+     */
+    Status status()
+    {
+        long responses = this.responses;
+
+        if (isSuccessful(responses))
+            return success;
+
+        if (!canSucceed(responses) && supersededBy != null)
+        {
+            Superseded.SideEffects sideEffects = hasNoSideEffects(responses) ? NO : MAYBE;
+            return new Superseded(supersededBy, sideEffects);
+        }
+
+        return new MaybeFailure(new Paxos.MaybeFailure(participants, required, accepts(responses), failureReasonsAsMap()));
+    }
+
+    private void executeOnSelf(Proposal proposal)
+    {
+        executeOnSelf(proposal, RequestHandler::execute);
+    }
+
+    public void onResponse(Response response, InetAddressAndPort from)
+    {
+        if (logger.isTraceEnabled())
+            logger.trace("{} for {} from {}", response, proposal, from);
+
+        Ballot supersededBy = response.supersededBy;
+        if (supersededBy != null)
+            supersededByUpdater.accumulateAndGet(this, supersededBy, (a, b) -> a == null ? b : b.uuidTimestamp() > a.uuidTimestamp() ? b : a);
+
+        long increment = supersededBy == null
+                ? ACCEPT_INCREMENT
+                : REFUSAL_INCREMENT;
+
+        update(increment);
+    }
+
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        if (logger.isTraceEnabled())
+            logger.trace("{} {} failure from {}", proposal, reason, from);
+
+        super.onFailure(from, reason);
+        update(FAILURE_INCREMENT);
+    }
+
+    private void update(long increment)
+    {
+        long responses = responsesUpdater.addAndGet(this, increment);
+        if (shouldSignal(responses))
+            signalDone();
+    }
+
+    // returns true at most once for a given PaxosPropose, so we do not propagate a signal more than once
+    private boolean shouldSignal(long responses)
+    {
+        return shouldSignal(responses, required, participants, waitForNoSideEffect, responsesUpdater, this);
+    }
+
+    @VisibleForTesting
+    public static <T> boolean shouldSignal(long responses, int required, int participants, boolean waitForNoSideEffect, AtomicLongFieldUpdater<T> responsesUpdater, T update)
+    {
+        if (responses <= 0L) // already signalled via ambiguous signal bit
+            return false;
+
+        if (!isSuccessful(responses, required))
+        {
+            if (canSucceed(responses, required, participants))
+                return false;
+
+            if (waitForNoSideEffect && !hasPossibleSideEffects(responses))
+                return hasNoSideEffects(responses, participants);
+        }
+
+        return responsesUpdater.getAndUpdate(update, x -> x | Long.MIN_VALUE) >= 0L;
+    }
+
+    private void signalDone()
+    {
+        if (onDone != null)
+            onDone.accept(status());
+    }
+
+    private boolean isSuccessful(long responses)
+    {
+        return isSuccessful(responses, required);
+    }
+
+    private static boolean isSuccessful(long responses, int required)
+    {
+        return accepts(responses) >= required;
+    }
+
+    private boolean canSucceed(long responses)
+    {
+        return canSucceed(responses, required, participants);
+    }
+
+    private static boolean canSucceed(long responses, int required, int participants)
+    {
+        return refusals(responses) == 0 && required <= participants - failures(responses);
+    }
+
+    // Note: this is only reliable if !failFast
+    private boolean hasNoSideEffects(long responses)
+    {
+        return hasNoSideEffects(responses, participants);
+    }
+
+    private static boolean hasNoSideEffects(long responses, int participants)
+    {
+        return refusals(responses) == participants;
+    }
+
+    private static boolean hasPossibleSideEffects(long responses)
+    {
+        return accepts(responses) + failures(responses) > 0;
+    }
+
+    /** {@link #responses} */
+    private static int accepts(long responses)
+    {
+        return (int) (responses & MASK);
+    }
+
+    /** {@link #responses} */
+    private static int notAccepts(long responses)
+    {
+        return failures(responses) + refusals(responses);
+    }
+
+    /** {@link #responses} */
+    private static int refusals(long responses)
+    {
+        return (int) ((responses >>> REFUSAL_SHIFT) & MASK);
+    }
+
+    /** {@link #responses} */
+    private static int failures(long responses)
+    {
+        return (int) ((responses >>> FAILURE_SHIFT) & MASK);
+    }
+
+    /**
+     * A Proposal to submit to another node
+     */
+    static class Request
+    {
+        final Proposal proposal;
+        Request(Proposal proposal)
+        {
+            this.proposal = proposal;
+        }
+
+        public String toString()
+        {
+            return proposal.toString("Propose");
+        }
+    }
+
+    /**
+     * The response to a proposal, indicating success (if {@code supersededBy == null},
+     * or failure, alongside the ballot that beat us
+     */
+    static class Response
+    {
+        final Ballot supersededBy;
+        Response(Ballot supersededBy)
+        {
+            this.supersededBy = supersededBy;
+        }
+        public String toString() { return supersededBy == null ? "Accept" : "RejectProposal(supersededBy=" + supersededBy + ')'; }
+    }
+
+    /**
+     * The proposal request handler, i.e. receives a proposal from a peer and responds with either acccept/reject
+     */
+    public static class RequestHandler implements IVerbHandler<Request>
+    {
+        @Override
+        public void doVerb(Message<Request> message)
+        {
+            Response response = execute(message.payload.proposal, message.from());
+            if (response == null)
+                MessagingService.instance().respondWithFailure(UNKNOWN, message);
+            else
+                MessagingService.instance().respond(response, message);
+        }
+
+        public static Response execute(Proposal proposal, InetAddressAndPort from)
+        {
+            if (!Paxos.isInRangeAndShouldProcess(from, proposal.update.partitionKey(), proposal.update.metadata(), false))
+                return null;
+
+            long start = nanoTime();
+            try (PaxosState state = PaxosState.get(proposal))
+            {
+                return new Response(state.acceptIfLatest(proposal));
+            }
+            finally
+            {
+                Keyspace.openAndGetStore(proposal.update.metadata()).metric.casPropose.addNano(nanoTime() - start);
+            }
+        }
+    }
+
+    public static class RequestSerializer implements IVersionedSerializer<Request>
+    {
+        @Override
+        public void serialize(Request request, DataOutputPlus out, int version) throws IOException
+        {
+            Proposal.serializer.serialize(request.proposal, out, version);
+        }
+
+        @Override
+        public Request deserialize(DataInputPlus in, int version) throws IOException
+        {
+            Proposal propose = Proposal.serializer.deserialize(in, version);
+            return new Request(propose);
+        }
+
+        @Override
+        public long serializedSize(Request request, int version)
+        {
+            return Proposal.serializer.serializedSize(request.proposal, version);
+        }
+    }
+
+    public static class ResponseSerializer implements IVersionedSerializer<Response>
+    {
+        public void serialize(Response response, DataOutputPlus out, int version) throws IOException
+        {
+            out.writeBoolean(response.supersededBy != null);
+            if (response.supersededBy != null)
+                response.supersededBy.serialize(out);
+        }
+
+        public Response deserialize(DataInputPlus in, int version) throws IOException
+        {
+            boolean isSuperseded = in.readBoolean();
+            return isSuperseded ? new Response(Ballot.deserialize(in)) : new Response(null);
+        }
+
+        public long serializedSize(Response response, int version)
+        {
+            return response.supersededBy != null
+                    ? TypeSizes.sizeof(true) + Ballot.sizeInBytes()
+                    : TypeSizes.sizeof(false);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosRepair.java b/src/java/org/apache/cassandra/service/paxos/PaxosRepair.java
new file mode 100644
index 0000000..d88323c
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosRepair.java
@@ -0,0 +1,706 @@
+/*
+ * 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.service.paxos;
+
+
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Function;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.exceptions.UnavailableException;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.RequestCallbackWithFailure;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.ExecutorUtils;
+import org.apache.cassandra.utils.FBUtilities;
+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.exceptions.RequestFailureReason.UNKNOWN;
+import static org.apache.cassandra.net.Verb.PAXOS2_REPAIR_REQ;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.service.paxos.Commit.*;
+import static org.apache.cassandra.service.paxos.ContentionStrategy.Type.REPAIR;
+import static org.apache.cassandra.service.paxos.ContentionStrategy.waitUntilForContention;
+import static org.apache.cassandra.service.paxos.Paxos.*;
+import static org.apache.cassandra.service.paxos.PaxosPrepare.*;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.NullableSerializer.deserializeNullable;
+import static org.apache.cassandra.utils.NullableSerializer.serializeNullable;
+import static org.apache.cassandra.utils.NullableSerializer.serializedSizeNullable;
+
+/**
+ * Facility to finish any in-progress paxos transaction, and ensure that a quorum of nodes agree on the most recent operation.
+ * Semantically, we simply ensure that any side effects that were "decided" before repair was initiated have been committed
+ * to a quorum of nodes.
+ * This means:
+ *   - any prepare that has _possibly_ reached a quorum of nodes will be invalidated
+ *   - any proposal that has been accepted by at least one node, but not known to be committed to any, will be proposed again
+ *   - any proposal that has been committed to at least one node, but not committed to all, will be committed to a quorum
+ *
+ * Note that once started, this continues to try to repair any ongoing operations for the partition up to 4 times.
+ * In a functioning cluster this should always be possible, but during a network partition this might cause the repair
+ * to fail.
+ *
+ * Requirements for correction:
+ * - If performed during a range movement, we depend on a quorum (of the new topology) have been informed of the new
+ *   topology _prior_ to initiating this repair, and this node to have been a member of a quorum of nodes verifying
+ *    - If a quorum of nodes is unaware of the new topology prior to initiating repair, an operation could simply occur
+ *      after repair completes that permits a linearization failure, such as with CASSANDRA-15745.
+ *   their topology is up-to-date.
+ * - Paxos prepare rounds must also verify the topology being used with their peers
+ *    - If prepare rounds do not verify their topology, a node that is not a member of the quorum who have agreed
+ *      the latest topology could still perform an operation without being aware of the topology change, and permit a
+ *      linearization failure, such as with CASSANDRA-15745.
+ *
+ * With these issues addressed elsewhere, our algorithm is fairly simple.
+ * In brief:
+ *   1) Query all replicas for any promises or proposals they have witnessed that have not been committed,
+ *      and their most recent commit. Wait for a quorum of responses.
+ *   2) If this is the first time we have queried other nodes, we take a note of the most recent ballot we see;
+ *      If this is not the first time we have queried other nodes, and we have committed a newer ballot than the one
+ *      we previously recorded, we terminate (somebody else has done the work for us).
+ *   3) If we see an in-progress operation that is very recent, we wait for it to complete and try again
+ *   4) If we see a previously accepted operation, we attempt to complete it, or
+ *      if we see a prepare with no proposal, we propose an empty update to invalidate it;
+ *      otherwise we have nothing to do, as there is no operation that can have produced a side-effect before we began.
+ *   5) We prepare a paxos round to agree the new commit using a higher ballot than the one witnessed,
+ *      but a lower than one we would propose a new operation with. This permits newer operations to "beat" us so
+ *      that we do not interfere with normal paxos operations.
+ *   6) If we are "beaten" we start again (without delay, as (2) manages delays where necessary)
+ */
+public class PaxosRepair extends AbstractPaxosRepair
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosRepair.class);
+
+    public static final RequestSerializer requestSerializer = new RequestSerializer();
+    public static final ResponseSerializer responseSerializer = new ResponseSerializer();
+    public static final RequestHandler requestHandler = new RequestHandler();
+    private static final long RETRY_TIMEOUT_NANOS = getRetryTimeoutNanos();
+
+    private static final ScheduledExecutorPlus RETRIES = executorFactory().scheduled("PaxosRepairRetries");
+
+    private static long getRetryTimeoutNanos()
+    {
+        long retryMillis = PAXOS_REPAIR_RETRY_TIMEOUT_IN_MS.getLong();
+        return TimeUnit.MILLISECONDS.toNanos(retryMillis);
+    }
+
+    private final TableMetadata table;
+    private final ConsistencyLevel paxosConsistency;
+    private Participants participants;
+
+    private Ballot successCriteria;
+    private Ballot prevSupersededBy;
+    private int attempts;
+
+    public String toString()
+    {
+        return "PaxosRepair{" +
+               "key=" + partitionKey() +
+               ", table=" + table.toString() +
+               ", consistency=" + paxosConsistency +
+               ", participants=" + participants.electorate +
+               ", state=" + state() +
+               ", startedMillis=" + MonotonicClock.Global.approxTime.translate().toMillisSinceEpoch(startedNanos()) +
+               ", started=" + isStarted() +
+               '}';
+    }
+
+    /**
+     * Waiting for responses to PAXOS_REPAIR messages.
+     *
+     * This state may be entered multiple times; every time we fail for any reason, we restart from this state
+     */
+    private class Querying extends State implements RequestCallbackWithFailure<Response>, Runnable
+    {
+        private int successes;
+        private int failures;
+
+        private Ballot latestWitnessed;
+        private @Nullable Accepted latestAccepted;
+        private Committed latestCommitted;
+        private Ballot oldestCommitted;
+        private Ballot clashingPromise;
+
+        @Override
+        public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+        {
+            updateState(this, null, (i1, i2) -> i1.onFailure());
+        }
+
+        @Override
+        public void onResponse(Message<Response> msg)
+        {
+            logger.trace("PaxosRepair {} from {}", msg.payload, msg.from());
+            updateState(this, msg, Querying::onResponseInternal);
+        }
+
+        private State onFailure()
+        {
+            if (++failures + participants.sizeOfConsensusQuorum > participants.sizeOfPoll())
+                return retry(this);
+            return this;
+        }
+
+        private State onResponseInternal(Message<Response> msg)
+        {
+            latestWitnessed = latest(latestWitnessed, msg.payload.latestWitnessedOrLowBound);
+            latestAccepted = latest(latestAccepted, msg.payload.acceptedButNotCommitted);
+            latestCommitted = latest(latestCommitted, msg.payload.committed);
+            if (oldestCommitted == null || isAfter(oldestCommitted, msg.payload.committed))
+                oldestCommitted = msg.payload.committed.ballot;
+
+            if (isAfter(latestWitnessed, clashingPromise))
+                clashingPromise = null;
+            if (timestampsClash(latestAccepted, msg.payload.latestWitnessedOrLowBound))
+                clashingPromise = msg.payload.latestWitnessedOrLowBound;
+            if (timestampsClash(latestAccepted, latestWitnessed))
+                clashingPromise = latestWitnessed;
+
+            // once we receive the requisite number, we can simply proceed, and ignore future responses
+            if (++successes == participants.sizeOfConsensusQuorum)
+                return execute();
+
+            return this;
+        }
+
+        private State execute()
+        {
+            // if we have a timestamp clash, always prefer the accepted ballot
+            latestWitnessed = latest(latestAccepted, latestWitnessed);
+            Ballot latestPreviouslyWitnessed = latest(successCriteria, prevSupersededBy);
+
+            // Save as success criteria the latest promise seen by our first round; if we ever see anything
+            // newer committed, we know at least one paxos round has been completed since we started, which is all we need
+            // or newer than this committed we know we're done, so to avoid looping indefinitely in competition
+            // with others, we store this ballot for future retries so we can terminate based on other proposers' work
+            if (successCriteria == null || timestampsClash(successCriteria, latestWitnessed))
+            {
+                if (logger.isTraceEnabled())
+                    logger.trace("PaxosRepair of {} setting success criteria to {}", partitionKey(), Ballot.toString(latestWitnessed));
+
+                successCriteria = latestWitnessed;
+            }
+
+            boolean hasCommittedSuccessCriteria = isAfter(latestCommitted, successCriteria) || latestCommitted.hasBallot(successCriteria);
+            boolean isPromisedButNotAccepted    = isAfter(latestWitnessed, latestAccepted); // not necessarily promised - may be lowBound
+            boolean isAcceptedButNotCommitted   = isAfter(latestAccepted, latestCommitted);
+            boolean reproposalMayBeRejected     = clashingPromise != null || !isAfter(latestWitnessed, latestPreviouslyWitnessed);
+
+            if (hasCommittedSuccessCriteria)
+            {
+                if (logger.isTraceEnabled())
+                    logger.trace("PaxosRepair witnessed {} newer than success criteria {} (oldest: {})", latestCommitted, Ballot.toString(successCriteria), Ballot.toString(oldestCommitted));
+
+                // we have a new enough commit, but it might not have reached enough participants; make sure it has before terminating
+                // note: we could send to only those we know haven't witnessed it, but this is a rare operation so a small amount of redundant work is fine
+                return oldestCommitted.equals(latestCommitted.ballot)
+                        ? DONE
+                        : PaxosCommit.commit(latestCommitted, participants, paxosConsistency, commitConsistency(), true,
+                                             new CommittingRepair());
+            }
+            else if (isAcceptedButNotCommitted && !isPromisedButNotAccepted && !reproposalMayBeRejected)
+            {
+                if (logger.isTraceEnabled())
+                    logger.trace("PaxosRepair of {} completing {}", partitionKey(), latestAccepted);
+                // We need to complete this in-progress accepted proposal, which may not have been seen by a majority
+                // However, since we have not sought any promises, we can simply complete the existing proposal
+                // since this is an idempotent operation - both us and the original proposer (and others) can
+                // all do it at the same time without incident
+
+                // If ballots with same timestamp have been both accepted and rejected by different nodes,
+                // to avoid a livelock we simply try to poison, knowing we will fail but use a new ballot
+                // (note there are alternative approaches but this is conservative)
+
+                return PaxosPropose.propose(latestAccepted, participants, false,
+                        new ProposingRepair(latestAccepted));
+            }
+            else if (isAcceptedButNotCommitted || isPromisedButNotAccepted || latestWitnessed.compareTo(latestPreviouslyWitnessed) < 0)
+            {
+                Ballot ballot = staleBallotNewerThan(latest(latestWitnessed, latestPreviouslyWitnessed), paxosConsistency);
+                // We need to propose a no-op > latestPromised, to ensure we don't later discover
+                // that latestPromised had already been accepted (by a minority) and repair it
+                // This means starting a new ballot, but we choose to use one that is likely to lose a contention battle
+                // Since this operation is not urgent, and we can piggy-back on other paxos operations
+                if (logger.isTraceEnabled())
+                    logger.trace("PaxosRepair of {} found incomplete promise or proposal; preparing stale ballot {}", partitionKey(), Ballot.toString(ballot));
+
+                return prepareWithBallot(ballot, participants, partitionKey(), table, false, false,
+                        new PoisonProposals());
+            }
+            else
+            {
+                logger.error("PaxosRepair illegal state latestWitnessed={}, latestAcceptedButNotCommitted={}, latestCommitted={}, oldestCommitted={}", latestWitnessed, latestAccepted, latestCommitted, oldestCommitted);
+                throw new IllegalStateException(); // should be logically impossible
+            }
+        }
+
+        public void run()
+        {
+            Message<Request> message = Message.out(PAXOS2_REPAIR_REQ, new Request(partitionKey(), table));
+            for (int i = 0, size = participants.sizeOfPoll(); i < size ; ++i)
+                MessagingService.instance().sendWithCallback(message, participants.voter(i), this);
+        }
+    }
+
+    /**
+     * We found either an incomplete promise or proposal, so we need to start a new paxos round to complete them
+     */
+    private class PoisonProposals extends ConsumerState<Status>
+    {
+        @Override
+        public State execute(Status input) throws Throwable
+        {
+            switch (input.outcome)
+            {
+                case MAYBE_FAILURE:
+                    return retry(this);
+
+                case READ_PERMITTED:
+                case SUPERSEDED:
+                    prevSupersededBy = latest(prevSupersededBy, input.retryWithAtLeast());
+                    return retry(this);
+
+                case FOUND_INCOMPLETE_ACCEPTED:
+                {
+                    // finish the in-progress proposal
+                    // cannot simply restart, as our latest promise is newer than the proposal
+                    // so we require a promise before we decide which proposal to complete
+                    // (else an "earlier" operation can sneak in and invalidate us while we're proposing
+                    // with a newer ballot)
+                    FoundIncompleteAccepted incomplete = input.incompleteAccepted();
+                    Proposal propose = new Proposal(incomplete.ballot, incomplete.accepted.update);
+                    logger.trace("PaxosRepair of {} found incomplete {}", partitionKey(), incomplete.accepted);
+                    return PaxosPropose.propose(propose, participants, false,
+                            new ProposingRepair(propose)); // we don't know if we're done, so we must restart
+                }
+
+                case FOUND_INCOMPLETE_COMMITTED:
+                {
+                    // finish the in-progress commit
+                    FoundIncompleteCommitted incomplete = input.incompleteCommitted();
+                    logger.trace("PaxosRepair of {} found in progress {}", partitionKey(), incomplete.committed);
+                    return PaxosCommit.commit(incomplete.committed, participants, paxosConsistency, commitConsistency(), true,
+                                              new CommitAndRestart()); // we don't know if we're done, so we must restart
+                }
+
+                case PROMISED:
+                {
+                    // propose the empty ballot
+                    logger.trace("PaxosRepair of {} submitting empty proposal", partitionKey());
+                    Proposal proposal = Proposal.empty(input.success().ballot, partitionKey(), table);
+                    return PaxosPropose.propose(proposal, participants, false,
+                            new ProposingRepair(proposal));
+                }
+
+                default:
+                    throw new IllegalStateException();
+            }
+        }
+    }
+
+    private class ProposingRepair extends ConsumerState<PaxosPropose.Status>
+    {
+        final Proposal proposal;
+        private ProposingRepair(Proposal proposal)
+        {
+            this.proposal = proposal;
+        }
+
+        @Override
+        public State execute(PaxosPropose.Status input)
+        {
+            switch (input.outcome)
+            {
+                case MAYBE_FAILURE:
+                    return retry(this);
+
+                case SUPERSEDED:
+                    if (isAfter(input.superseded().by, prevSupersededBy))
+                        prevSupersededBy = input.superseded().by;
+                    return retry(this);
+
+                case SUCCESS:
+                    if (proposal.update.isEmpty())
+                    {
+                        logger.trace("PaxosRepair of {} complete after successful empty proposal", partitionKey());
+                        return DONE;
+                    }
+
+                    logger.trace("PaxosRepair of {} committing successful proposal {}", partitionKey(), proposal);
+                    return PaxosCommit.commit(proposal.agreed(), participants, paxosConsistency, commitConsistency(), true,
+                                              new CommittingRepair());
+
+                default:
+                    throw new IllegalStateException();
+            }
+        }
+    }
+
+    private class CommittingRepair extends ConsumerState<PaxosCommit.Status>
+    {
+        @Override
+        public State execute(PaxosCommit.Status input)
+        {
+            logger.trace("PaxosRepair of {} {}", partitionKey(), input);
+            return input.isSuccess() ? DONE : retry(this);
+        }
+    }
+
+    private class CommitAndRestart extends ConsumerState<PaxosCommit.Status>
+    {
+        @Override
+        public State execute(PaxosCommit.Status input)
+        {
+            return restart(this);
+        }
+    }
+
+    private PaxosRepair(DecoratedKey partitionKey, Ballot incompleteBallot, TableMetadata table, ConsistencyLevel paxosConsistency)
+    {
+        super(partitionKey, incompleteBallot);
+        // TODO: move precondition into super ctor
+        Preconditions.checkArgument(paxosConsistency.isSerialConsistency());
+        this.table = table;
+        this.paxosConsistency = paxosConsistency;
+        this.successCriteria = incompleteBallot;
+    }
+
+    public static PaxosRepair create(ConsistencyLevel consistency, DecoratedKey partitionKey, Ballot incompleteBallot, TableMetadata table)
+    {
+        return new PaxosRepair(partitionKey, incompleteBallot, table, consistency);
+    }
+
+    private State retry(State state)
+    {
+        Preconditions.checkState(isStarted());
+        if (isResult(state))
+            return state;
+
+        return restart(state, waitUntilForContention(++attempts, table, partitionKey(), paxosConsistency, REPAIR));
+    }
+
+    @Override
+    public State restart(State state, long waitUntil)
+    {
+        if (isResult(state))
+            return state;
+
+        participants = Participants.get(table, partitionKey(), paxosConsistency);
+
+        if (waitUntil > Long.MIN_VALUE && waitUntil - startedNanos() > RETRY_TIMEOUT_NANOS)
+            return new Failure(null);
+
+        try
+        {
+            participants.assureSufficientLiveNodesForRepair();
+        }
+        catch (UnavailableException e)
+        {
+            return new Failure(e);
+        }
+
+        Querying querying = new Querying();
+        long now;
+        if (waitUntil == Long.MIN_VALUE || waitUntil - (now = nanoTime()) < 0) querying.run();
+        else RETRIES.schedule(querying, waitUntil - now, NANOSECONDS);
+
+        return querying;
+    }
+
+    private ConsistencyLevel commitConsistency()
+    {
+        Preconditions.checkState(paxosConsistency.isSerialConsistency());
+        return paxosConsistency.isDatacenterLocal() ? ConsistencyLevel.LOCAL_QUORUM : ConsistencyLevel.QUORUM;
+    }
+
+    static class Request
+    {
+        final DecoratedKey partitionKey;
+        final TableMetadata table;
+        Request(DecoratedKey partitionKey, TableMetadata table)
+        {
+            this.partitionKey = partitionKey;
+            this.table = table;
+        }
+    }
+
+    /**
+     * The response to a proposal, indicating success (if {@code supersededBy == null},
+     * or failure, alongside the ballot that beat us
+     */
+    static class Response
+    {
+        @Nonnull final Ballot latestWitnessedOrLowBound;
+        @Nullable final Accepted acceptedButNotCommitted;
+        @Nonnull final Committed committed;
+
+        Response(Ballot latestWitnessedOrLowBound, @Nullable Accepted acceptedButNotCommitted, Committed committed)
+        {
+            this.latestWitnessedOrLowBound = latestWitnessedOrLowBound;
+            this.acceptedButNotCommitted = acceptedButNotCommitted;
+            this.committed = committed;
+        }
+
+        public String toString()
+        {
+            return String.format("Response(%s, %s, %s", latestWitnessedOrLowBound, acceptedButNotCommitted, committed);
+        }
+    }
+
+    private static Map<String, Set<InetAddressAndPort>> mapToDc(Collection<InetAddressAndPort> endpoints, Function<InetAddressAndPort, String> dcFunc)
+    {
+        Map<String, Set<InetAddressAndPort>> map = new HashMap<>();
+        endpoints.forEach(e -> map.computeIfAbsent(dcFunc.apply(e), k -> new HashSet<>()).add(e));
+        return map;
+    }
+
+    private static boolean hasQuorumOrSingleDead(Collection<InetAddressAndPort> all, Collection<InetAddressAndPort> live, boolean requireQuorum)
+    {
+        Preconditions.checkArgument(all.size() >= live.size());
+        return live.size() >= (all.size() / 2) + 1 || (!requireQuorum && live.size() >= all.size() - 1);
+    }
+
+    @VisibleForTesting
+    static boolean hasSufficientLiveNodesForTopologyChange(Collection<InetAddressAndPort> allEndpoints, Collection<InetAddressAndPort> liveEndpoints, Function<InetAddressAndPort, String> dcFunc, boolean onlyQuorumRequired, boolean strictQuorum)
+    {
+
+        Map<String, Set<InetAddressAndPort>> allDcMap = mapToDc(allEndpoints, dcFunc);
+        Map<String, Set<InetAddressAndPort>> liveDcMap = mapToDc(liveEndpoints, dcFunc);
+
+        if (!hasQuorumOrSingleDead(allEndpoints, liveEndpoints, strictQuorum))
+            return false;
+
+        if (onlyQuorumRequired)
+            return true;
+
+        for (Map.Entry<String, Set<InetAddressAndPort>> entry : allDcMap.entrySet())
+        {
+            Set<InetAddressAndPort> all = entry.getValue();
+            Set<InetAddressAndPort> live = liveDcMap.getOrDefault(entry.getKey(), Collections.emptySet());
+            if (!hasQuorumOrSingleDead(all, live, strictQuorum))
+                return false;
+        }
+        return true;
+    }
+
+    /**
+     * checks if we have enough live nodes to perform a paxos repair for topology repair. Generally, this means that we need enough
+     * live participants to reach EACH_QUORUM, with a few exceptions. The EACH_QUORUM requirement is meant to support workload using either
+     * SERIAL or LOCAL_SERIAL
+     *
+     * if paxos_topology_repair_strict_each_quorum is set to false (the default), we will accept either a quorum or n-1 live nodes
+     * in the cluster and per dc. If paxos_topology_repair_no_dc_checks is true, we only check the live nodes in the cluster,
+     * and do not do any per-dc checks.
+     */
+    public static boolean hasSufficientLiveNodesForTopologyChange(Keyspace keyspace, Range<Token> range, Collection<InetAddressAndPort> liveEndpoints)
+    {
+        return hasSufficientLiveNodesForTopologyChange(keyspace.getReplicationStrategy().getNaturalReplicasForToken(range.right).endpoints(),
+                                                       liveEndpoints,
+                                                       DatabaseDescriptor.getEndpointSnitch()::getDatacenter,
+                                                       DatabaseDescriptor.paxoTopologyRepairNoDcChecks(),
+                                                       DatabaseDescriptor.paxoTopologyRepairStrictEachQuorum());
+    }
+
+    /**
+     * The proposal request handler, i.e. receives a proposal from a peer and responds with either acccept/reject
+     */
+    public static class RequestHandler implements IVerbHandler<PaxosRepair.Request>
+    {
+        @Override
+        public void doVerb(Message<PaxosRepair.Request> message)
+        {
+            PaxosRepair.Request request = message.payload;
+            if (!isInRangeAndShouldProcess(message.from(), request.partitionKey, request.table, false))
+            {
+                MessagingService.instance().respondWithFailure(UNKNOWN, message);
+                return;
+            }
+
+            Ballot latestWitnessed;
+            Accepted acceptedButNotCommited;
+            Committed committed;
+            int nowInSec = FBUtilities.nowInSeconds();
+            try (PaxosState state = PaxosState.get(request.partitionKey, request.table))
+            {
+                PaxosState.Snapshot snapshot = state.current(nowInSec);
+                latestWitnessed = snapshot.latestWitnessedOrLowBound();
+                acceptedButNotCommited = snapshot.accepted;
+                committed = snapshot.committed;
+            }
+
+            Response response = new Response(latestWitnessed, acceptedButNotCommited, committed);
+            MessagingService.instance().respond(response, message);
+        }
+    }
+
+    public static class RequestSerializer implements IVersionedSerializer<Request>
+    {
+        @Override
+        public void serialize(Request request, DataOutputPlus out, int version) throws IOException
+        {
+            request.table.id.serialize(out);
+            DecoratedKey.serializer.serialize(request.partitionKey, out, version);
+        }
+
+        @Override
+        public Request deserialize(DataInputPlus in, int version) throws IOException
+        {
+            TableMetadata table = Schema.instance.getExistingTableMetadata(TableId.deserialize(in));
+            DecoratedKey partitionKey = (DecoratedKey) DecoratedKey.serializer.deserialize(in, table.partitioner, version);
+            return new Request(partitionKey, table);
+        }
+
+        @Override
+        public long serializedSize(Request request, int version)
+        {
+            return request.table.id.serializedSize()
+                   + DecoratedKey.serializer.serializedSize(request.partitionKey, version);
+        }
+    }
+
+    public static class ResponseSerializer implements IVersionedSerializer<Response>
+    {
+        public void serialize(Response response, DataOutputPlus out, int version) throws IOException
+        {
+            response.latestWitnessedOrLowBound.serialize(out);
+            serializeNullable(Accepted.serializer, response.acceptedButNotCommitted, out, version);
+            Committed.serializer.serialize(response.committed, out, version);
+        }
+
+        public Response deserialize(DataInputPlus in, int version) throws IOException
+        {
+            Ballot latestWitnessed = Ballot.deserialize(in);
+            Accepted acceptedButNotCommitted = deserializeNullable(Accepted.serializer, in, version);
+            Committed committed = Committed.serializer.deserialize(in, version);
+            return new Response(latestWitnessed, acceptedButNotCommitted, committed);
+        }
+
+        public long serializedSize(Response response, int version)
+        {
+            return Ballot.sizeInBytes()
+                   + serializedSizeNullable(Accepted.serializer, response.acceptedButNotCommitted, version)
+                   + Committed.serializer.serializedSize(response.committed, version);
+        }
+    }
+
+    private static volatile boolean SKIP_VERSION_VALIDATION = Boolean.getBoolean("cassandra.skip_paxos_repair_version_validation");
+
+    public static void setSkipPaxosRepairCompatibilityCheck(boolean v)
+    {
+        SKIP_VERSION_VALIDATION = v;
+    }
+
+    public static boolean getSkipPaxosRepairCompatibilityCheck()
+    {
+        return SKIP_VERSION_VALIDATION;
+    }
+
+    static boolean validateVersionCompatibility(CassandraVersion version)
+    {
+        if (SKIP_VERSION_VALIDATION)
+            return true;
+
+        if (version == null)
+            return false;
+
+        // assume 4.0 is ok
+        return (version.major == 4 && version.minor > 0) || version.major > 4;
+    }
+
+    static String getPeerVersion(InetAddressAndPort peer)
+    {
+        EndpointState epState = Gossiper.instance.getEndpointStateForEndpoint(peer);
+        if (epState == null)
+            return null;
+
+        VersionedValue value = epState.getApplicationState(ApplicationState.RELEASE_VERSION);
+        if (value == null)
+            return null;
+
+        try
+        {
+            return value.value;
+        }
+        catch (IllegalArgumentException e)
+        {
+            return null;
+        }
+    }
+
+    static boolean validatePeerCompatibility(Replica peer)
+    {
+        String versionString = getPeerVersion(peer.endpoint());
+        CassandraVersion version = versionString != null ? new CassandraVersion(versionString) : null;
+        boolean result = validateVersionCompatibility(version);
+        if (!result)
+            logger.info("PaxosRepair isn't supported by {} on version {}", peer, versionString);
+        return result;
+    }
+
+    static boolean validatePeerCompatibility(TableMetadata table, Range<Token> range)
+    {
+        Participants participants = Participants.get(table, range.right, ConsistencyLevel.SERIAL);
+        return Iterables.all(participants.all, PaxosRepair::validatePeerCompatibility);
+    }
+
+    public static boolean validatePeerCompatibility(TableMetadata table, Collection<Range<Token>> ranges)
+    {
+        return Iterables.all(ranges, range -> validatePeerCompatibility(table, range));
+    }
+
+    public static void shutdownAndWait(long timeout, TimeUnit units) throws InterruptedException, TimeoutException
+    {
+        ExecutorUtils.shutdownAndWait(timeout, units, RETRIES);
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosRepairHistory.java b/src/java/org/apache/cassandra/service/paxos/PaxosRepairHistory.java
new file mode 100644
index 0000000..1627fdb
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosRepairHistory.java
@@ -0,0 +1,479 @@
+/*
+ * 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.service.paxos;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.TupleType;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+import static java.lang.Math.min;
+import static org.apache.cassandra.service.paxos.Commit.isAfter;
+import static org.apache.cassandra.service.paxos.Commit.latest;
+
+public class PaxosRepairHistory
+{
+    public static final PaxosRepairHistory EMPTY = new PaxosRepairHistory(new Token[0], new Ballot[] { Ballot.none() });
+    private static final Token.TokenFactory TOKEN_FACTORY = DatabaseDescriptor.getPartitioner().getTokenFactory();
+    private static final Token MIN_TOKEN = DatabaseDescriptor.getPartitioner().getMinimumToken();
+    private static final TupleType TYPE = new TupleType(ImmutableList.of(BytesType.instance, BytesType.instance));
+
+    /**
+     * The following two fields represent the mapping of ranges to ballot lower bounds, for example:
+     *
+     *   ballotLowBound           = [ none(), b2, none(), b4, none() ]
+     *   tokenInclusiveUpperBound = [ t1, t2, t3, t4 ]
+     *
+     * Correspond to the following token bounds:
+     *
+     *   (MIN_VALUE, t1] => none()
+     *   (t1, t2]        => b2
+     *   (t2, t3]        => none()
+     *   (t3, t4]        => b4
+     *   (t4, MAX_VALUE) => none()
+     */
+
+    private final Token[] tokenInclusiveUpperBound;
+    private final Ballot[] ballotLowBound; // always one longer to capture values up to "MAX_VALUE" (which in some cases doesn't exist, as is infinite)
+
+    PaxosRepairHistory(Token[] tokenInclusiveUpperBound, Ballot[] ballotLowBound)
+    {
+        assert ballotLowBound.length == tokenInclusiveUpperBound.length + 1;
+        this.tokenInclusiveUpperBound = tokenInclusiveUpperBound;
+        this.ballotLowBound = ballotLowBound;
+    }
+
+    public Ballot maxLowBound()
+    {
+        Ballot maxBallot = Ballot.none();
+        for (Ballot lowBound : ballotLowBound)
+        {
+            maxBallot = Commit.latest(maxBallot, lowBound);
+        }
+        return maxBallot;
+    }
+
+    public String toString()
+    {
+        return "PaxosRepairHistory{" +
+                IntStream.range(0, ballotLowBound.length)
+                        .filter(i -> !Ballot.none().equals(ballotLowBound[i]))
+                        .mapToObj(i -> range(i) + "=" + ballotLowBound[i])
+                        .collect(Collectors.joining(", ")) + '}';
+    }
+
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PaxosRepairHistory that = (PaxosRepairHistory) o;
+        return Arrays.equals(ballotLowBound, that.ballotLowBound) && Arrays.equals(tokenInclusiveUpperBound, that.tokenInclusiveUpperBound);
+    }
+
+    public int hashCode()
+    {
+        return Arrays.hashCode(ballotLowBound);
+    }
+
+    public Ballot ballotForToken(Token token)
+    {
+        int idx = Arrays.binarySearch(tokenInclusiveUpperBound, token);
+        if (idx < 0) idx = -1 - idx;
+        return ballotLowBound[idx];
+    }
+
+    private Ballot ballotForIndex(int idx)
+    {
+        if (idx < 0 || idx > size())
+            throw new IndexOutOfBoundsException();
+
+        return ballotLowBound[idx];
+    }
+
+    private int indexForToken(Token token)
+    {
+        int idx = Arrays.binarySearch(tokenInclusiveUpperBound, token);
+        if (idx < 0) idx = -1 - idx;
+        return idx;
+    }
+
+    private boolean contains(int idx, Token token)
+    {
+        if (idx < 0 || idx > size())
+            throw new IndexOutOfBoundsException();
+
+        return  (idx == 0      || tokenInclusiveUpperBound[idx - 1].compareTo(token) <  0)
+             && (idx == size() || tokenInclusiveUpperBound[idx    ].compareTo(token) >= 0);
+    }
+
+    public int size()
+    {
+        return tokenInclusiveUpperBound.length;
+    }
+
+    private RangeIterator rangeIterator()
+    {
+        return new RangeIterator();
+    }
+
+    private Range<Token> range(int i)
+    {
+        return new Range<>(tokenExclusiveLowerBound(i), tokenInclusiveUpperBound(i));
+    }
+
+    public Searcher searcher()
+    {
+        return new Searcher();
+    }
+
+    private Token tokenExclusiveLowerBound(int i)
+    {
+        return i == 0 ? MIN_TOKEN : tokenInclusiveUpperBound[i - 1];
+    }
+
+    private Token tokenInclusiveUpperBound(int i)
+    {
+        return i == tokenInclusiveUpperBound.length ? MIN_TOKEN : tokenInclusiveUpperBound[i];
+    }
+
+    public List<ByteBuffer> toTupleBufferList()
+    {
+        List<ByteBuffer> tuples = new ArrayList<>(size() + 1);
+        for (int i = 0 ; i < 1 + size() ; ++i)
+            tuples.add(TupleType.buildValue(new ByteBuffer[] { TOKEN_FACTORY.toByteArray(tokenInclusiveUpperBound(i)), ballotLowBound[i].toBytes() }));
+        return tuples;
+    }
+
+    public static PaxosRepairHistory fromTupleBufferList(List<ByteBuffer> tuples)
+    {
+        Token[] tokenInclusiveUpperBounds = new Token[tuples.size() - 1];
+        Ballot[] ballotLowBounds = new Ballot[tuples.size()];
+        for (int i = 0 ; i < tuples.size() ; ++i)
+        {
+            ByteBuffer[] split = TYPE.split(tuples.get(i));
+            if (i < tokenInclusiveUpperBounds.length)
+                tokenInclusiveUpperBounds[i] = TOKEN_FACTORY.fromByteArray(split[0]);
+            ballotLowBounds[i] = Ballot.deserialize(split[1]);
+        }
+
+        return new PaxosRepairHistory(tokenInclusiveUpperBounds, ballotLowBounds);
+    }
+
+    // append the item to the given list, modifying the underlying list
+    // if the item makes previoud entries redundant
+
+    public static PaxosRepairHistory merge(PaxosRepairHistory historyLeft, PaxosRepairHistory historyRight)
+    {
+        if (historyLeft == null)
+            return historyRight;
+
+        if (historyRight == null)
+            return historyLeft;
+
+        Builder builder = new Builder(historyLeft.size() + historyRight.size());
+
+        RangeIterator left = historyLeft.rangeIterator();
+        RangeIterator right = historyRight.rangeIterator();
+        while (left.hasUpperBound() && right.hasUpperBound())
+        {
+            int cmp = left.tokenInclusiveUpperBound().compareTo(right.tokenInclusiveUpperBound());
+
+            Ballot ballot = latest(left.ballotLowBound(), right.ballotLowBound());
+            if (cmp == 0)
+            {
+                builder.append(left.tokenInclusiveUpperBound(), ballot);
+                left.next();
+                right.next();
+            }
+            else
+            {
+                RangeIterator firstIter = cmp < 0 ? left : right;
+                builder.append(firstIter.tokenInclusiveUpperBound(), ballot);
+                firstIter.next();
+            }
+        }
+
+        while (left.hasUpperBound())
+        {
+            builder.append(left.tokenInclusiveUpperBound(), latest(left.ballotLowBound(), right.ballotLowBound()));
+            left.next();
+        }
+
+        while (right.hasUpperBound())
+        {
+            builder.append(right.tokenInclusiveUpperBound(), latest(left.ballotLowBound(), right.ballotLowBound()));
+            right.next();
+        }
+
+        builder.appendLast(latest(left.ballotLowBound(), right.ballotLowBound()));
+        return builder.build();
+    }
+
+    @VisibleForTesting
+    public static PaxosRepairHistory add(PaxosRepairHistory existing, Collection<Range<Token>> ranges, Ballot ballot)
+    {
+        ranges = Range.normalize(ranges);
+        Builder builder = new Builder(ranges.size() * 2);
+        for (Range<Token> range : ranges)
+        {
+            // don't add a point for an opening min token, since it
+            // effectively leaves the bottom of the range unbounded
+            builder.appendMaybeMin(range.left, Ballot.none());
+            builder.appendMaybeMax(range.right, ballot);
+        }
+
+        return merge(existing, builder.build());
+    }
+
+    /**
+     * returns a copy of this PaxosRepairHistory limited to the ranges supplied, with all other ranges reporting Ballot.none()
+     */
+    @VisibleForTesting
+    static PaxosRepairHistory trim(PaxosRepairHistory existing, Collection<Range<Token>> ranges)
+    {
+        Builder builder = new Builder(existing.size());
+
+        ranges = Range.normalize(ranges);
+        for (Range<Token> select : ranges)
+        {
+            RangeIterator intersects = existing.intersects(select);
+            while (intersects.hasNext())
+            {
+                if (Ballot.none().equals(intersects.ballotLowBound()))
+                {
+                    intersects.next();
+                    continue;
+                }
+
+                Token exclusiveLowerBound = maxExclusiveLowerBound(select.left, intersects.tokenExclusiveLowerBound());
+                Token inclusiveUpperBound = minInclusiveUpperBound(select.right, intersects.tokenInclusiveUpperBound());
+                assert exclusiveLowerBound.compareTo(inclusiveUpperBound) < 0 || inclusiveUpperBound.isMinimum();
+
+                builder.appendMaybeMin(exclusiveLowerBound, Ballot.none());
+                builder.appendMaybeMax(inclusiveUpperBound, intersects.ballotLowBound());
+                intersects.next();
+            }
+        }
+
+        return builder.build();
+    }
+
+    RangeIterator intersects(Range<Token> unwrapped)
+    {
+        int from = Arrays.binarySearch(tokenInclusiveUpperBound, unwrapped.left);
+        if (from < 0) from = -1 - from; else ++from;
+        int to = unwrapped.right.isMinimum() ? ballotLowBound.length - 1 : Arrays.binarySearch(tokenInclusiveUpperBound, unwrapped.right);
+        if (to < 0) to = -1 - to;
+        return new RangeIterator(from, min(1 + to, ballotLowBound.length));
+    }
+
+    private static Token maxExclusiveLowerBound(Token a, Token b)
+    {
+        return a.compareTo(b) < 0 ? b : a;
+    }
+
+    private static Token minInclusiveUpperBound(Token a, Token b)
+    {
+        if (!a.isMinimum() && !b.isMinimum()) return a.compareTo(b) <= 0 ? a : b;
+        else if (!a.isMinimum()) return a;
+        else if (!b.isMinimum()) return b;
+        else return a;
+    }
+
+    public static final IVersionedSerializer<PaxosRepairHistory> serializer = new IVersionedSerializer<PaxosRepairHistory>()
+    {
+        public void serialize(PaxosRepairHistory history, DataOutputPlus out, int version) throws IOException
+        {
+            out.writeUnsignedVInt(history.size());
+            for (int i = 0; i < history.size() ; ++i)
+            {
+                Token.serializer.serialize(history.tokenInclusiveUpperBound[i], out, version);
+                history.ballotLowBound[i].serialize(out);
+            }
+            history.ballotLowBound[history.size()].serialize(out);
+        }
+
+        public PaxosRepairHistory deserialize(DataInputPlus in, int version) throws IOException
+        {
+            int size = (int) in.readUnsignedVInt();
+            Token[] tokenInclusiveUpperBounds = new Token[size];
+            Ballot[] ballotLowBounds = new Ballot[size + 1];
+            for (int i = 0; i < size; i++)
+            {
+                tokenInclusiveUpperBounds[i] = Token.serializer.deserialize(in, DatabaseDescriptor.getPartitioner(), version);
+                ballotLowBounds[i] = Ballot.deserialize(in);
+            }
+            ballotLowBounds[size] = Ballot.deserialize(in);
+            return new PaxosRepairHistory(tokenInclusiveUpperBounds, ballotLowBounds);
+        }
+
+        public long serializedSize(PaxosRepairHistory history, int version)
+        {
+            long size = TypeSizes.sizeofUnsignedVInt(history.size());
+            for (int i = 0; i < history.size() ; ++i)
+            {
+                size += Token.serializer.serializedSize(history.tokenInclusiveUpperBound[i], version);
+                size += Ballot.sizeInBytes();
+            }
+            size += Ballot.sizeInBytes();
+            return size;
+        }
+    };
+
+    public class Searcher
+    {
+        int idx = -1;
+
+        public Ballot ballotForToken(Token token)
+        {
+            if (idx < 0 || !contains(idx, token))
+                idx = indexForToken(token);
+            return ballotForIndex(idx);
+        }
+    }
+
+    class RangeIterator
+    {
+        final int end;
+        int i;
+
+        RangeIterator()
+        {
+            this.end = ballotLowBound.length;
+        }
+
+        RangeIterator(int from, int to)
+        {
+            this.i = from;
+            this.end = to;
+        }
+
+        boolean hasNext()
+        {
+            return i < end;
+        }
+
+        boolean hasUpperBound()
+        {
+            return i < tokenInclusiveUpperBound.length;
+        }
+
+        void next()
+        {
+            ++i;
+        }
+
+        Token tokenExclusiveLowerBound()
+        {
+            return PaxosRepairHistory.this.tokenExclusiveLowerBound(i);
+        }
+
+        Token tokenInclusiveUpperBound()
+        {
+            return PaxosRepairHistory.this.tokenInclusiveUpperBound(i);
+        }
+
+        Ballot ballotLowBound()
+        {
+            return ballotLowBound[i];
+        }
+    }
+
+    static class Builder
+    {
+        final List<Token> tokenInclusiveUpperBounds;
+        final List<Ballot> ballotLowBounds;
+
+        Builder(int capacity)
+        {
+            this.tokenInclusiveUpperBounds = new ArrayList<>(capacity);
+            this.ballotLowBounds = new ArrayList<>(capacity + 1);
+        }
+
+        void appendMaybeMin(Token inclusiveLowBound, Ballot ballotLowBound)
+        {
+            if (inclusiveLowBound.isMinimum())
+                assert ballotLowBound.equals(Ballot.none()) && ballotLowBounds.isEmpty();
+            else
+                append(inclusiveLowBound, ballotLowBound);
+        }
+
+        void appendMaybeMax(Token inclusiveLowBound, Ballot ballotLowBound)
+        {
+            if (inclusiveLowBound.isMinimum())
+                appendLast(ballotLowBound);
+            else
+                append(inclusiveLowBound, ballotLowBound);
+        }
+
+        void append(Token inclusiveLowBound, Ballot ballotLowBound)
+        {
+            int tailIdx = tokenInclusiveUpperBounds.size() - 1;
+
+            assert tokenInclusiveUpperBounds.size() == ballotLowBounds.size();
+            assert tailIdx < 0 || inclusiveLowBound.compareTo(tokenInclusiveUpperBounds.get(tailIdx)) >= 0;
+
+            boolean sameAsTailToken = tailIdx >= 0 && inclusiveLowBound.equals(tokenInclusiveUpperBounds.get(tailIdx));
+            boolean sameAsTailBallot = tailIdx >= 0 && ballotLowBound.equals(ballotLowBounds.get(tailIdx));
+            if (sameAsTailToken || sameAsTailBallot)
+            {
+                if (sameAsTailBallot)
+                    tokenInclusiveUpperBounds.set(tailIdx, inclusiveLowBound);
+                else if (isAfter(ballotLowBound, ballotLowBounds.get(tailIdx)))
+                    ballotLowBounds.set(tailIdx, ballotLowBound);
+            }
+            else
+            {
+                tokenInclusiveUpperBounds.add(inclusiveLowBound);
+                ballotLowBounds.add(ballotLowBound);
+            }
+        }
+
+        void appendLast(Ballot ballotLowBound)
+        {
+            assert ballotLowBounds.size() == tokenInclusiveUpperBounds.size();
+            int tailIdx = tokenInclusiveUpperBounds.size() - 1;
+            if (!ballotLowBounds.isEmpty() && ballotLowBound.equals(ballotLowBounds.get(tailIdx)))
+                tokenInclusiveUpperBounds.remove(tailIdx);
+            else
+                ballotLowBounds.add(ballotLowBound);
+        }
+
+        PaxosRepairHistory build()
+        {
+            if (tokenInclusiveUpperBounds.size() == ballotLowBounds.size())
+                ballotLowBounds.add(Ballot.none());
+            return new PaxosRepairHistory(tokenInclusiveUpperBounds.toArray(new Token[0]), ballotLowBounds.toArray(new Ballot[0]));
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosRequestCallback.java b/src/java/org/apache/cassandra/service/paxos/PaxosRequestCallback.java
new file mode 100644
index 0000000..282aeb2
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosRequestCallback.java
@@ -0,0 +1,76 @@
+/*
+ * 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.service.paxos;
+
+import java.util.function.BiFunction;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.exceptions.WriteTimeoutException;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.service.FailureRecordingCallback;
+
+import static org.apache.cassandra.exceptions.RequestFailureReason.TIMEOUT;
+import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
+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();
+
+    protected abstract void onResponse(T response, InetAddressAndPort from);
+
+    @Override
+    public void onResponse(Message<T> message)
+    {
+        onResponse(message.payload, message.from());
+    }
+
+    protected <I> void executeOnSelf(I parameter, BiFunction<I, InetAddressAndPort, T> execute)
+    {
+        T response;
+        try
+        {
+            response = execute.apply(parameter, getBroadcastAddressAndPort());
+            if (response == null)
+                return;
+        }
+        catch (Exception ex)
+        {
+            RequestFailureReason reason = UNKNOWN;
+            if (ex instanceof WriteTimeoutException) reason = TIMEOUT;
+            else logger.error("Failed to apply {} locally", parameter, ex);
+
+            onFailure(getBroadcastAddressAndPort(), reason);
+            return;
+        }
+
+        onResponse(response, getBroadcastAddressAndPort());
+    }
+
+    static boolean shouldExecuteOnSelf(InetAddressAndPort replica)
+    {
+        return USE_SELF_EXECUTION && replica.equals(getBroadcastAddressAndPort());
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/PaxosState.java b/src/java/org/apache/cassandra/service/paxos/PaxosState.java
index 6e02435..e802cd0 100644
--- a/src/java/org/apache/cassandra/service/paxos/PaxosState.java
+++ b/src/java/org/apache/cassandra/service/paxos/PaxosState.java
@@ -1,5 +1,5 @@
 /*
- *
+ * 
  * 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
@@ -7,155 +7,816 @@
  * 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.service.paxos;
 
-import java.util.concurrent.locks.Lock;
+import java.io.IOException;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
 
-import com.google.common.util.concurrent.Striped;
+import javax.annotation.Nonnull;
+import javax.annotation.Nullable;
 
-import org.apache.cassandra.schema.TableMetadata;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.primitives.Ints;
+
+import com.github.benmanes.caffeine.cache.Caffeine;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.*;
+import org.apache.cassandra.metrics.PaxosMetrics;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.exceptions.ReadTimeoutException;
+import org.apache.cassandra.exceptions.RequestTimeoutException;
+import org.apache.cassandra.exceptions.WriteTimeoutException;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosBallotTracker;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosStateTracker;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTracker;
 import org.apache.cassandra.tracing.Tracing;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.Nemesis;
 
-public class PaxosState
+import static java.util.concurrent.TimeUnit.SECONDS;
+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;
+import static org.apache.cassandra.config.DatabaseDescriptor.paxosStatePurging;
+import static org.apache.cassandra.service.paxos.Commit.*;
+import static org.apache.cassandra.service.paxos.PaxosState.MaybePromise.Outcome.*;
+import static org.apache.cassandra.service.paxos.Commit.Accepted.latestAccepted;
+import static org.apache.cassandra.service.paxos.Commit.Committed.latestCommitted;
+import static org.apache.cassandra.service.paxos.Commit.isAfter;
+
+/**
+ * We save to memory the result of each operation before persisting to disk, however each operation that performs
+ * the update does not return a result to the coordinator until the result is fully persisted.
+ */
+public class PaxosState implements PaxosOperationLock
 {
-    private static final Striped<Lock> LOCKS = Striped.lazyWeakLock(DatabaseDescriptor.getConcurrentWriters() * 1024);
+    private static volatile boolean DISABLE_COORDINATOR_LOCKING = Boolean.getBoolean("cassandra.paxos.disable_coordinator_locking");
+    public static final ConcurrentHashMap<Key, PaxosState> ACTIVE = new ConcurrentHashMap<>();
+    public static final Map<Key, Snapshot> RECENT = Caffeine.newBuilder()
+                                                            .maximumWeight(DatabaseDescriptor.getPaxosCacheSizeInMiB() << 20)
+                                                            .<Key, Snapshot>weigher((k, v) -> Ints.saturatedCast((v.accepted != null ? v.accepted.update.unsharedHeapSize() : 0L) + v.committed.update.unsharedHeapSize()))
+                                                            .executor(ImmediateExecutor.INSTANCE)
+                                                            .build().asMap();
 
-    private final Commit promised;
-    private final Commit accepted;
-    private final Commit mostRecentCommit;
-
-    public PaxosState(DecoratedKey key, TableMetadata metadata)
+    private static class TrackerHandle
     {
-        this(Commit.emptyCommit(key, metadata), Commit.emptyCommit(key, metadata), Commit.emptyCommit(key, metadata));
-    }
+        static final PaxosStateTracker tracker;
 
-    public PaxosState(Commit promised, Commit accepted, Commit mostRecentCommit)
-    {
-        assert promised.update.partitionKey().equals(accepted.update.partitionKey()) && accepted.update.partitionKey().equals(mostRecentCommit.update.partitionKey());
-        assert promised.update.metadata().id.equals(accepted.update.metadata().id) && accepted.update.metadata().id.equals(mostRecentCommit.update.metadata().id);
-
-        this.promised = promised;
-        this.accepted = accepted;
-        this.mostRecentCommit = mostRecentCommit;
-    }
-
-    public static PrepareResponse prepare(Commit toPrepare)
-    {
-        long start = System.nanoTime();
-        try
+        static
         {
-            Lock lock = LOCKS.get(toPrepare.update.partitionKey());
-            lock.lock();
             try
             {
-                // When preparing, we need to use the same time as "now" (that's the time we use to decide if something
-                // is expired or not) accross nodes otherwise we may have a window where a Most Recent Commit shows up
-                // on some replica and not others during a new proposal (in StorageProxy.beginAndRepairPaxos()), and no
-                // amount of re-submit will fix this (because the node on which the commit has expired will have a
-                // tombstone that hides any re-submit). See CASSANDRA-12043 for details.
-                int nowInSec = UUIDGen.unixTimestampInSec(toPrepare.ballot);
-                PaxosState state = SystemKeyspace.loadPaxosState(toPrepare.update.partitionKey(), toPrepare.update.metadata(), nowInSec);
-                if (toPrepare.isAfter(state.promised))
-                {
-                    Tracing.trace("Promising ballot {}", toPrepare.ballot);
-                    SystemKeyspace.savePaxosPromise(toPrepare);
-                    return new PrepareResponse(true, state.accepted, state.mostRecentCommit);
-                }
-                else
-                {
-                    Tracing.trace("Promise rejected; {} is not sufficiently newer than {}", toPrepare, state.promised);
-                    // return the currently promised ballot (not the last accepted one) so the coordinator can make sure it uses newer ballot next time (#5667)
-                    return new PrepareResponse(false, state.promised, state.mostRecentCommit);
-                }
+                tracker = PaxosStateTracker.create(Directories.dataDirectories);
             }
-            finally
+            catch (IOException e)
             {
-                lock.unlock();
+                throw new RuntimeException(e);
             }
         }
-        finally
-        {
-            Keyspace.open(toPrepare.update.metadata().keyspace).getColumnFamilyStore(toPrepare.update.metadata().id).metric.casPrepare.addNano(System.nanoTime() - start);
-        }
-
-    }
-
-    public static Boolean propose(Commit proposal)
-    {
-        long start = System.nanoTime();
-        try
-        {
-            Lock lock = LOCKS.get(proposal.update.partitionKey());
-            lock.lock();
-            try
-            {
-                int nowInSec = UUIDGen.unixTimestampInSec(proposal.ballot);
-                PaxosState state = SystemKeyspace.loadPaxosState(proposal.update.partitionKey(), proposal.update.metadata(), nowInSec);
-                if (proposal.hasBallot(state.promised.ballot) || proposal.isAfter(state.promised))
-                {
-                    Tracing.trace("Accepting proposal {}", proposal);
-                    SystemKeyspace.savePaxosProposal(proposal);
-                    return true;
-                }
-                else
-                {
-                    Tracing.trace("Rejecting proposal for {} because inProgress is now {}", proposal, state.promised);
-                    return false;
-                }
-            }
-            finally
-            {
-                lock.unlock();
-            }
-        }
-        finally
-        {
-            Keyspace.open(proposal.update.metadata().keyspace).getColumnFamilyStore(proposal.update.metadata().id).metric.casPropose.addNano(System.nanoTime() - start);
-        }
     }
 
-    public static void commit(Commit proposal)
+    public static void setDisableCoordinatorLocking(boolean disable)
     {
-        long start = System.nanoTime();
+        DISABLE_COORDINATOR_LOCKING = disable;
+    }
+
+    public static boolean getDisableCoordinatorLocking()
+    {
+        return DISABLE_COORDINATOR_LOCKING;
+    }
+
+    public static PaxosUncommittedTracker uncommittedTracker()
+    {
+        return TrackerHandle.tracker.uncommitted();
+    }
+
+    public static PaxosBallotTracker ballotTracker()
+    {
+        return TrackerHandle.tracker.ballots();
+    }
+
+    public static void initializeTrackers()
+    {
+        Preconditions.checkState(TrackerHandle.tracker != null);
+        PaxosMetrics.initialize();
+    }
+
+    public static void maybeRebuildUncommittedState() throws IOException
+    {
+        TrackerHandle.tracker.maybeRebuild();
+    }
+
+    public static void startAutoRepairs()
+    {
+        TrackerHandle.tracker.uncommitted().startAutoRepairs();
+    }
+
+    public static class Key
+    {
+        final DecoratedKey partitionKey;
+        final TableMetadata metadata;
+
+        public Key(DecoratedKey partitionKey, TableMetadata metadata)
+        {
+            this.partitionKey = partitionKey;
+            this.metadata = metadata;
+        }
+
+        public int hashCode()
+        {
+            return partitionKey.hashCode() * 31 + metadata.id.hashCode();
+        }
+
+        public boolean equals(Object that)
+        {
+            return that instanceof Key && equals((Key) that);
+        }
+
+        public boolean equals(Key that)
+        {
+            return this.partitionKey.equals(that.partitionKey)
+                    && this.metadata.id.equals(that.metadata.id);
+        }
+    }
+
+    public static class Snapshot
+    {
+        public final @Nonnull
+        Ballot promised;
+        public final @Nonnull
+        Ballot promisedWrite; // <= promised
+        public final @Nullable Accepted  accepted; // if already committed, this will be null
+        public final @Nonnull  Committed committed;
+
+        public Snapshot(@Nonnull Ballot promised, @Nonnull Ballot promisedWrite, @Nullable Accepted accepted, @Nonnull Committed committed)
+        {
+            assert isAfter(promised, promisedWrite) || promised == promisedWrite;
+            assert accepted == null || accepted.update.partitionKey().equals(committed.update.partitionKey());
+            assert accepted == null || accepted.update.metadata().id.equals(committed.update.metadata().id);
+            assert accepted == null || committed.isBefore(accepted.ballot);
+
+            this.promised = promised;
+            this.promisedWrite = promisedWrite;
+            this.accepted = accepted;
+            this.committed = committed;
+        }
+
+        public @Nonnull
+        Ballot latestWitnessedOrLowBound(Ballot latestWriteOrLowBound)
+        {
+            return promised == promisedWrite ? latestWriteOrLowBound : latest(promised, latestWriteOrLowBound);
+        }
+
+        public @Nonnull
+        Ballot latestWitnessedOrLowBound()
+        {
+            // warn: if proposal has same timestamp as promised, we should prefer accepted
+            // since (if different) it reached a quorum of promises; this means providing it as first argument
+            Ballot latest;
+            latest = latest(accepted, committed).ballot;
+            latest = latest(latest, promised);
+            latest = latest(latest, ballotTracker().getLowBound());
+            return latest;
+        }
+
+        public @Nonnull
+        Ballot latestWriteOrLowBound()
+        {
+            // warn: if proposal has same timestamp as promised, we should prefer accepted
+            // since (if different) it reached a quorum of promises; this means providing it as first argument
+            Ballot latest = accepted != null && !accepted.update.isEmpty() ? accepted.ballot : null;
+            latest = latest(latest, committed.ballot);
+            latest = latest(latest, promisedWrite);
+            latest = latest(latest, ballotTracker().getLowBound());
+            return latest;
+        }
+
+        public static Snapshot merge(Snapshot a, Snapshot b)
+        {
+            if (a == null || b == null)
+                return a == null ? b : a;
+
+            Committed committed = latestCommitted(a.committed, b.committed);
+            if (a instanceof UnsafeSnapshot && b instanceof UnsafeSnapshot)
+                return new UnsafeSnapshot(committed);
+
+            Accepted accepted;
+            Ballot promised, promisedWrite;
+            if (a instanceof UnsafeSnapshot || b instanceof UnsafeSnapshot)
+            {
+                if (a instanceof UnsafeSnapshot)
+                    a = b; // we already have the winning Committed saved above, so just want the full snapshot (if either)
+
+                if (committed == a.committed)
+                    return a;
+
+                promised = a.promised;
+                promisedWrite = a.promisedWrite;
+                accepted = isAfter(a.accepted, committed) ? a.accepted : null;
+            }
+            else
+            {
+                accepted = latestAccepted(a.accepted, b.accepted);
+                accepted = isAfter(accepted, committed) ? accepted : null;
+                promised = latest(a.promised, b.promised);
+                promisedWrite = latest(a.promisedWrite, b.promisedWrite);
+            }
+
+            return new Snapshot(promised, promisedWrite, accepted, committed);
+        }
+
+        Snapshot removeExpired(int nowInSec)
+        {
+            boolean isAcceptedExpired = accepted != null && accepted.isExpired(nowInSec);
+            boolean isCommittedExpired = committed.isExpired(nowInSec);
+
+            if (paxosStatePurging() == gc_grace)
+            {
+                long expireOlderThan = SECONDS.toMicros(nowInSec - committed.update.metadata().params.gcGraceSeconds);
+                isAcceptedExpired |= accepted != null && accepted.ballot.unixMicros() < expireOlderThan;
+                isCommittedExpired |= committed.ballot.unixMicros() < expireOlderThan;
+            }
+
+            if (!isAcceptedExpired && !isCommittedExpired)
+                return this;
+
+            return new Snapshot(promised, promisedWrite,
+                                isAcceptedExpired ? null : accepted,
+                                isCommittedExpired
+                                    ? Committed.none(committed.update.partitionKey(), committed.update.metadata())
+                                    : committed);
+        }
+    }
+
+    // used to permit recording Committed outcomes without waiting for initial read
+    public static class UnsafeSnapshot extends Snapshot
+    {
+        public UnsafeSnapshot(@Nonnull Committed committed)
+        {
+            super(Ballot.none(), Ballot.none(), null, committed);
+        }
+
+        public UnsafeSnapshot(@Nonnull Commit committed)
+        {
+            this(new Committed(committed.ballot, committed.update));
+        }
+    }
+
+    @VisibleForTesting
+    public static class MaybePromise
+    {
+        public enum Outcome { REJECT, PERMIT_READ, PROMISE }
+
+        final Snapshot before;
+        final Snapshot after;
+        final Ballot supersededBy;
+        final Outcome outcome;
+
+        MaybePromise(Snapshot before, Snapshot after, Ballot supersededBy, Outcome outcome)
+        {
+            this.before = before;
+            this.after = after;
+            this.supersededBy = supersededBy;
+            this.outcome = outcome;
+        }
+
+        static MaybePromise promise(Snapshot before, Snapshot after)
+        {
+            return new MaybePromise(before, after, null, PROMISE);
+        }
+
+        static MaybePromise permitRead(Snapshot before, Ballot supersededBy)
+        {
+            return new MaybePromise(before, before, supersededBy, PERMIT_READ);
+        }
+
+        static MaybePromise reject(Snapshot snapshot, Ballot supersededBy)
+        {
+            return new MaybePromise(snapshot, snapshot, supersededBy, REJECT);
+        }
+
+        public Outcome outcome()
+        {
+            return outcome;
+        }
+
+        public Ballot supersededBy()
+        {
+            return supersededBy;
+        }
+    }
+
+    @Nemesis private static final AtomicReferenceFieldUpdater<PaxosState, Snapshot> currentUpdater = AtomicReferenceFieldUpdater.newUpdater(PaxosState.class, Snapshot.class, "current");
+
+    final Key key;
+    private int active; // current number of active referents (once drops to zero, we remove the global entry)
+    @Nemesis private volatile Snapshot current;
+    @Nemesis private volatile Thread lockedBy;
+    @Nemesis private volatile int waiting;
+
+    private static final AtomicReferenceFieldUpdater<PaxosState, Thread> lockedByUpdater = AtomicReferenceFieldUpdater.newUpdater(PaxosState.class, Thread.class, "lockedBy");
+
+    private PaxosState(Key key, Snapshot current)
+    {
+        this.key = key;
+        this.current = current;
+    }
+
+    @VisibleForTesting
+    public static PaxosState get(Commit commit)
+    {
+        return get(commit.update.partitionKey(), commit.update.metadata());
+    }
+
+    public static PaxosState get(DecoratedKey partitionKey, TableMetadata table)
+    {
+        // TODO would be nice to refactor verb handlers to support re-submitting to executor if waiting for another thread to read state
+        return getUnsafe(partitionKey, table).maybeLoad();
+    }
+
+    // does not increment total number of accessors, since we would accept null (so only access if others are, not for own benefit)
+    private static PaxosState tryGetUnsafe(DecoratedKey partitionKey, TableMetadata metadata)
+    {
+        return ACTIVE.compute(new Key(partitionKey, metadata), (key, cur) -> {
+            if (cur == null)
+            {
+                Snapshot saved = RECENT.remove(key);
+                if (saved != null)
+                    //noinspection resource
+                    cur = new PaxosState(key, saved);
+            }
+            if (cur != null)
+                ++cur.active;
+            return cur;
+        });
+    }
+
+    private static PaxosState getUnsafe(DecoratedKey partitionKey, TableMetadata metadata)
+    {
+        return ACTIVE.compute(new Key(partitionKey, metadata), (key, cur) -> {
+            if (cur == null)
+            {
+                //noinspection resource
+                cur = new PaxosState(key, RECENT.remove(key));
+            }
+            ++cur.active;
+            return cur;
+        });
+    }
+
+    private static PaxosState getUnsafe(Commit commit)
+    {
+        return getUnsafe(commit.update.partitionKey(), commit.update.metadata());
+    }
+
+    // don't increment the total count, as we are only using this for locking purposes when coordinating
+    @VisibleForTesting
+    public static PaxosOperationLock lock(DecoratedKey partitionKey, TableMetadata metadata, long deadline, ConsistencyLevel consistencyForConsensus, boolean isWrite) throws RequestTimeoutException
+    {
+        if (DISABLE_COORDINATOR_LOCKING)
+            return PaxosOperationLock.noOp();
+
+        PaxosState lock = ACTIVE.compute(new Key(partitionKey, metadata), (key, cur) -> {
+            if (cur == null)
+                cur = new PaxosState(key, RECENT.remove(key));
+            ++cur.active;
+            return cur;
+        });
+
         try
         {
-            // There is no guarantee we will see commits in the right order, because messages
-            // can get delayed, so a proposal can be older than our current most recent ballot/commit.
-            // Committing it is however always safe due to column timestamps, so always do it. However,
-            // if our current in-progress ballot is strictly greater than the proposal one, we shouldn't
-            // erase the in-progress update.
+            if (!lock.lock(deadline))
+                throw throwTimeout(metadata, consistencyForConsensus, isWrite);
+            return lock;
+        }
+        catch (Throwable t)
+        {
+            lock.close();
+            throw t;
+        }
+    }
+    
+    private static RequestTimeoutException throwTimeout(TableMetadata metadata, ConsistencyLevel consistencyForConsensus, boolean isWrite)
+    {
+        int blockFor = consistencyForConsensus.blockFor(Keyspace.open(metadata.keyspace).getReplicationStrategy());
+        throw isWrite
+                ? new WriteTimeoutException(WriteType.CAS, consistencyForConsensus, 0, blockFor)
+                : new ReadTimeoutException(consistencyForConsensus, 0, blockFor, false);
+    }
+
+    private PaxosState maybeLoad()
+    {
+        try
+        {
+            Snapshot current = this.current;
+            if (current == null || current instanceof UnsafeSnapshot)
+            {
+                synchronized (this)
+                {
+                    current = this.current;
+                    if (current == null || current instanceof UnsafeSnapshot)
+                    {
+                        Snapshot snapshot = SystemKeyspace.loadPaxosState(key.partitionKey, key.metadata, 0);
+                        currentUpdater.accumulateAndGet(this, snapshot, Snapshot::merge);
+                    }
+                }
+            }
+        }
+        catch (Throwable t)
+        {
+            try { close(); } catch (Throwable t2) { t.addSuppressed(t2); }
+            throw t;
+        }
+
+        return this;
+    }
+
+    private boolean lock(long deadline)
+    {
+        try
+        {
+            Thread thread = Thread.currentThread();
+            if (lockedByUpdater.compareAndSet(this, null, thread))
+                return true;
+
+            synchronized (this)
+            {
+                waiting++;
+
+                try
+                {
+                    while (true)
+                    {
+                        if (lockedByUpdater.compareAndSet(this, null, thread))
+                            return true;
+
+                        while (lockedBy != null)
+                        {
+                            long now = nanoTime();
+                            if (now >= deadline)
+                                return false;
+
+                            wait(1 + ((deadline - now) - 1) / 1000000);
+                        }
+                    }
+                }
+                finally
+                {
+                    waiting--;
+                }
+            }
+        }
+        catch (InterruptedException e)
+        {
+            Thread.currentThread().interrupt();
+            return false;
+        }
+    }
+
+    private void maybeUnlock()
+    {
+        // no visibility requirements, as if we hold the lock it was last updated by us
+        if (lockedBy == null)
+            return;
+
+        Thread thread = Thread.currentThread();
+
+        if (lockedBy == thread)
+        {
+            lockedBy = null;
+            if (waiting > 0)
+            {
+                synchronized (this)
+                {
+                    notify();
+                }
+            }
+        }
+    }
+
+    public void close()
+    {
+        maybeUnlock();
+        ACTIVE.compute(key, (key, cur) ->
+        {
+            assert cur != null;
+            if (--cur.active > 0)
+                return cur;
+
+            Snapshot stash = cur.current;
+            if (stash != null && stash.getClass() == Snapshot.class)
+                RECENT.put(key, stash);
+            return null;
+        });
+    }
+
+    Snapshot current(Ballot ballot)
+    {
+        return current((int)ballot.unix(SECONDS));
+    }
+
+    Snapshot current(int nowInSec)
+    {
+        // CASSANDRA-12043 is not an issue for v2, as we perform Commit+Prepare and PrepareRefresh
+        // which are able to make progress whether or not the old commit is shadowed by the TTL (since they
+        // depend only on the write being successful, not the data being read again later).
+        // However, we still use nowInSec to guard reads to ensure we do not log any linearizability violations
+        // due to discrepancies in gc grace handling
+
+        Snapshot current = this.current;
+        if (current == null || current.getClass() != Snapshot.class)
+            throw new IllegalStateException();
+        return current.removeExpired(nowInSec);
+    }
+
+    @VisibleForTesting
+    public Snapshot currentSnapshot()
+    {
+        return current;
+    }
+
+    @VisibleForTesting
+    public void updateStateUnsafe(Function<Snapshot, Snapshot> f)
+    {
+        current = f.apply(current);
+    }
+
+    /**
+     * Record the requested ballot as promised if it is newer than our current promise; otherwise do nothing.
+     * @return a PromiseResult containing the before and after state for this operation
+     */
+    public MaybePromise promiseIfNewer(Ballot ballot, boolean isWrite)
+    {
+        Snapshot before, after;
+        while (true)
+        {
+            Snapshot realBefore = current;
+            before = realBefore.removeExpired((int)ballot.unix(SECONDS));
+            Ballot latestWriteOrLowBound = before.latestWriteOrLowBound();
+            Ballot latest = before.latestWitnessedOrLowBound(latestWriteOrLowBound);
+            if (isAfter(ballot, latest))
+            {
+                after = new Snapshot(ballot, isWrite ? ballot : before.promisedWrite, before.accepted, before.committed);
+                if (currentUpdater.compareAndSet(this, before, after))
+                {
+                    // It doesn't matter if a later operation witnesses this before it's persisted,
+                    // as it can only lead to rejecting a promise which leaves no persistent state
+                    // (and it's anyway safe to arbitrarily reject promises)
+                    if (isWrite)
+                    {
+                        Tracing.trace("Promising read/write ballot {}", ballot);
+                        SystemKeyspace.savePaxosWritePromise(key.partitionKey, key.metadata, ballot);
+                    }
+                    else
+                    {
+                        Tracing.trace("Promising read ballot {}", ballot);
+                        SystemKeyspace.savePaxosReadPromise(key.partitionKey, key.metadata, ballot);
+                    }
+                    return MaybePromise.promise(before, after);
+                }
+            }
+            else if (isAfter(ballot, latestWriteOrLowBound))
+            {
+                Tracing.trace("Permitting only read by ballot {}", ballot);
+                return MaybePromise.permitRead(before, latest);
+            }
+            else
+            {
+                Tracing.trace("Promise rejected; {} older than {}", ballot, latest);
+                return MaybePromise.reject(before, latest);
+            }
+
+            Snapshot realAfter = new Snapshot(ballot, isWrite ? ballot : realBefore.promisedWrite, realBefore.accepted, realBefore.committed);
+            after = new Snapshot(ballot, realAfter.promisedWrite, before.accepted, before.committed);
+            if (currentUpdater.compareAndSet(this, realBefore, realAfter))
+                break;
+        }
+
+        // It doesn't matter if a later operation witnesses this before it's persisted,
+        // as it can only lead to rejecting a promise which leaves no persistent state
+        // (and it's anyway safe to arbitrarily reject promises)
+        Tracing.trace("Promising ballot {}", ballot);
+        if (isWrite) SystemKeyspace.savePaxosWritePromise(key.partitionKey, key.metadata, ballot);
+        else SystemKeyspace.savePaxosReadPromise(key.partitionKey, key.metadata, ballot);
+        return MaybePromise.promise(before, after);
+    }
+
+    /**
+     * Record an acceptance of the proposal if there is no newer promise; otherwise inform the caller of the newer ballot
+     */
+    public Ballot acceptIfLatest(Proposal proposal)
+    {
+        if (paxosStatePurging() == legacy && !(proposal instanceof AcceptedWithTTL))
+            proposal = AcceptedWithTTL.withDefaultTTL(proposal);
+
+        // state.promised can be null, because it is invalidated by committed;
+        // we may also have accepted a newer proposal than we promised, so we confirm that we are the absolute newest
+        // (or that we have the exact same ballot as our promise, which is the typical case)
+        Snapshot before, after;
+        while (true)
+        {
+            Snapshot realBefore = current;
+            before = realBefore.removeExpired((int)proposal.ballot.unix(SECONDS));
+            Ballot latest = before.latestWitnessedOrLowBound();
+            if (!proposal.isSameOrAfter(latest))
+            {
+                Tracing.trace("Rejecting proposal {}; latest is now {}", proposal.ballot, latest);
+                return latest;
+            }
+
+            if (proposal.hasSameBallot(before.committed)) // TODO: consider not answering
+                return null; // no need to save anything, or indeed answer at all
+
+            after = new Snapshot(realBefore.promised, realBefore.promisedWrite, proposal.accepted(), realBefore.committed);
+            if (currentUpdater.compareAndSet(this, realBefore, after))
+                break;
+        }
+
+        // It is more worrisome to permit witnessing an accepted proposal before we have persisted it
+        // because this has more tangible effects on the recipient, but again it is safe: either it is
+        //  - witnessed to reject (which is always safe, as it prevents rather than creates an outcome); or
+        //  - witnessed as an in progress proposal
+        // in the latter case, for there to be any effect on the state the proposal must be re-proposed, or not,
+        // on its own terms, and must
+        // be persisted by the re-proposer, and so it remains a non-issue
+        // though this
+        Tracing.trace("Accepting proposal {}", proposal);
+        SystemKeyspace.savePaxosProposal(proposal);
+        return null;
+    }
+
+    public void commit(Agreed commit)
+    {
+        applyCommit(commit, this, (apply, to) ->
+            currentUpdater.accumulateAndGet(to, new UnsafeSnapshot(apply), Snapshot::merge)
+        );
+    }
+
+    public static void commitDirect(Commit commit)
+    {
+        applyCommit(commit, null, (apply, ignore) -> {
+            try (PaxosState state = tryGetUnsafe(apply.update.partitionKey(), apply.update.metadata()))
+            {
+                if (state != null)
+                    currentUpdater.accumulateAndGet(state, new UnsafeSnapshot(apply), Snapshot::merge);
+            }
+        });
+    }
+
+    private static void applyCommit(Commit commit, PaxosState state, BiConsumer<Commit, PaxosState> postCommit)
+    {
+        if (paxosStatePurging() == legacy && !(commit instanceof CommittedWithTTL))
+            commit = CommittedWithTTL.withDefaultTTL(commit);
+
+        long start = nanoTime();
+        try
+        {
+            // TODO: run Paxos Repair before truncate so we can excise this
             // The table may have been truncated since the proposal was initiated. In that case, we
             // don't want to perform the mutation and potentially resurrect truncated data
-            if (UUIDGen.unixTimestamp(proposal.ballot) >= SystemKeyspace.getTruncatedAt(proposal.update.metadata().id))
+            if (commit.ballot.unixMicros() >= SystemKeyspace.getTruncatedAt(commit.update.metadata().id))
             {
-                Tracing.trace("Committing proposal {}", proposal);
-                Mutation mutation = proposal.makeMutation();
+                Tracing.trace("Committing proposal {}", commit);
+                Mutation mutation = commit.makeMutation();
                 Keyspace.open(mutation.getKeyspaceName()).apply(mutation, true);
             }
             else
             {
-                Tracing.trace("Not committing proposal {} as ballot timestamp predates last truncation time", proposal);
+                Tracing.trace("Not committing proposal {} as ballot timestamp predates last truncation time", commit);
             }
-            // We don't need to lock, we're just blindly updating
-            SystemKeyspace.savePaxosCommit(proposal);
+
+            // for commits we save to disk first, because we can; even here though it is safe to permit later events to
+            // witness the state before it is persisted. The only tricky situation is that we use the witnessing of
+            // a quorum of nodes having witnessed the latest commit to decide if we need to disseminate a commit
+            // again before proceeding with any new operation, but in this case we have already persisted the relevant
+            // information, namely the base table mutation.  So this fact is persistent, even if knowldge of this fact
+            // is not (and if this is lost, it may only lead to a future operation unnecessarily committing again)
+            SystemKeyspace.savePaxosCommit(commit);
+            postCommit.accept(commit, state);
         }
         finally
         {
-            Keyspace.open(proposal.update.metadata().keyspace).getColumnFamilyStore(proposal.update.metadata().id).metric.casCommit.addNano(System.nanoTime() - start);
+            Keyspace.openAndGetStore(commit.update.metadata()).metric.casCommit.addNano(nanoTime() - start);
         }
     }
+
+    public static PrepareResponse legacyPrepare(Commit toPrepare)
+    {
+        long start = nanoTime();
+        try (PaxosState unsafeState = getUnsafe(toPrepare))
+        {
+            synchronized (unsafeState.key)
+            {
+                unsafeState.maybeLoad();
+                assert unsafeState.current != null;
+
+                while (true)
+                {
+                    // ignore nowInSec when merging as this can only be an issue during the transition period, so the unbounded
+                    // problem of CASSANDRA-12043 is not an issue
+                    Snapshot realBefore = unsafeState.current;
+                    Snapshot before = realBefore.removeExpired((int)toPrepare.ballot.unix(SECONDS));
+                    Ballot latest = before.latestWitnessedOrLowBound();
+                    if (toPrepare.isAfter(latest))
+                    {
+                        Snapshot after = new Snapshot(toPrepare.ballot, toPrepare.ballot, realBefore.accepted, realBefore.committed);
+                        if (currentUpdater.compareAndSet(unsafeState, realBefore, after))
+                        {
+                            Tracing.trace("Promising ballot {}", toPrepare.ballot);
+                            DecoratedKey partitionKey = toPrepare.update.partitionKey();
+                            TableMetadata metadata = toPrepare.update.metadata();
+                            SystemKeyspace.savePaxosWritePromise(partitionKey, metadata, toPrepare.ballot);
+                            return new PrepareResponse(true, before.accepted == null ? Accepted.none(partitionKey, metadata) : before.accepted, before.committed);
+                        }
+                    }
+                    else
+                    {
+                        Tracing.trace("Promise rejected; {} is not sufficiently newer than {}", toPrepare, before.promised);
+                        // return the currently promised ballot (not the last accepted one) so the coordinator can make sure it uses newer ballot next time (#5667)
+                        return new PrepareResponse(false, new Commit(before.promised, toPrepare.update), before.committed);
+                    }
+                }
+            }
+        }
+        finally
+        {
+            Keyspace.openAndGetStore(toPrepare.update.metadata()).metric.casPrepare.addNano(nanoTime() - start);
+        }
+    }
+
+    public static Boolean legacyPropose(Commit proposal)
+    {
+        if (paxosStatePurging() == legacy && !(proposal instanceof AcceptedWithTTL))
+            proposal = AcceptedWithTTL.withDefaultTTL(proposal);
+
+        long start = nanoTime();
+        try (PaxosState unsafeState = getUnsafe(proposal))
+        {
+            synchronized (unsafeState.key)
+            {
+                unsafeState.maybeLoad();
+                assert unsafeState.current != null;
+
+                while (true)
+                {
+                    Snapshot realBefore = unsafeState.current;
+                    Snapshot before = realBefore.removeExpired((int)proposal.ballot.unix(SECONDS));
+                    boolean accept = proposal.isSameOrAfter(before.latestWitnessedOrLowBound());
+                    if (accept)
+                    {
+                        if (proposal.hasSameBallot(before.committed) ||
+                            currentUpdater.compareAndSet(unsafeState, realBefore,
+                                                         new Snapshot(realBefore.promised, realBefore.promisedWrite,
+                                                                      new Accepted(proposal), realBefore.committed)))
+                        {
+                            Tracing.trace("Accepting proposal {}", proposal);
+                            SystemKeyspace.savePaxosProposal(proposal);
+                            return true;
+                        }
+                    }
+                    else
+                    {
+                        Tracing.trace("Rejecting proposal for {} because inProgress is now {}", proposal, before.promised);
+                        return false;
+                    }
+                }
+            }
+        }
+        finally
+        {
+            Keyspace.openAndGetStore(proposal.update.metadata()).metric.casPropose.addNano(nanoTime() - start);
+        }
+    }
+
+    public static void unsafeReset()
+    {
+        ACTIVE.clear();
+        RECENT.clear();
+        ballotTracker().truncate();
+    }
+
+    @SuppressWarnings("resource")
+    public static Snapshot unsafeGetIfPresent(DecoratedKey partitionKey, TableMetadata metadata)
+    {
+        Key key = new Key(partitionKey, metadata);
+        PaxosState cur = ACTIVE.get(key);
+        if (cur != null) return cur.current;
+        return RECENT.get(key);
+    }
 }
diff --git a/src/java/org/apache/cassandra/service/paxos/PrepareCallback.java b/src/java/org/apache/cassandra/service/paxos/PrepareCallback.java
deleted file mode 100644
index 93941e9..0000000
--- a/src/java/org/apache/cassandra/service/paxos/PrepareCallback.java
+++ /dev/null
@@ -1,108 +0,0 @@
-package org.apache.cassandra.service.paxos;
-/*
- * 
- * 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.
- * 
- */
-
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-import com.google.common.base.Predicate;
-import com.google.common.collect.Iterables;
-
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.db.DecoratedKey;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.utils.UUIDGen;
-
-public class PrepareCallback extends AbstractPaxosCallback<PrepareResponse>
-{
-    private static final Logger logger = LoggerFactory.getLogger(PrepareCallback.class);
-
-    public boolean promised = true;
-    public Commit mostRecentCommit;
-    public Commit mostRecentInProgressCommit;
-
-    private final Map<InetAddressAndPort, Commit> commitsByReplica = new ConcurrentHashMap<>();
-
-    public PrepareCallback(DecoratedKey key, TableMetadata metadata, int targets, ConsistencyLevel consistency, long queryStartNanoTime)
-    {
-        super(targets, consistency, queryStartNanoTime);
-        // need to inject the right key in the empty commit so comparing with empty commits in the response works as expected
-        mostRecentCommit = Commit.emptyCommit(key, metadata);
-        mostRecentInProgressCommit = Commit.emptyCommit(key, metadata);
-    }
-
-    public synchronized void onResponse(Message<PrepareResponse> message)
-    {
-        PrepareResponse response = message.payload;
-        logger.trace("Prepare response {} from {}", response, message.from());
-
-        // We set the mostRecentInProgressCommit even if we're not promised as, in that case, the ballot of that commit
-        // will be used to avoid generating a ballot that has not chance to win on retry (think clock skew).
-        if (response.inProgressCommit.isAfter(mostRecentInProgressCommit))
-            mostRecentInProgressCommit = response.inProgressCommit;
-
-        if (!response.promised)
-        {
-            promised = false;
-            while (latch.getCount() > 0)
-                latch.countDown();
-            return;
-        }
-
-        commitsByReplica.put(message.from(), response.mostRecentCommit);
-        if (response.mostRecentCommit.isAfter(mostRecentCommit))
-            mostRecentCommit = response.mostRecentCommit;
-
-        latch.countDown();
-    }
-
-    public Iterable<InetAddressAndPort> replicasMissingMostRecentCommit(TableMetadata metadata, int nowInSec)
-    {
-        // In general, we need every replicas that have answered to the prepare (a quorum) to agree on the MRC (see
-        // coment in StorageProxy.beginAndRepairPaxos(), but basically we need to make sure at least a quorum of nodes
-        // have learn a commit before commit a new one otherwise that previous commit is not guaranteed to have reach a
-        // quorum and further commit may proceed on incomplete information).
-        // However, if that commit is too hold, it may have been expired from some of the replicas paxos table (we don't
-        // keep the paxos state forever or that could grow unchecked), and we could end up in some infinite loop as
-        // explained on CASSANDRA-12043. To avoid that, we ignore a MRC that is too old, i.e. older than the TTL we set
-        // on paxos tables. For such old commit, we rely on hints and repair to ensure the commit has indeed be
-        // propagated to all nodes.
-        long paxosTtlSec = SystemKeyspace.paxosTtlSec(metadata);
-        if (UUIDGen.unixTimestampInSec(mostRecentCommit.ballot) + paxosTtlSec < nowInSec)
-            return Collections.emptySet();
-
-        return Iterables.filter(commitsByReplica.keySet(), new Predicate<InetAddressAndPort>()
-        {
-            public boolean apply(InetAddressAndPort inetAddress)
-            {
-                return (!commitsByReplica.get(inetAddress).ballot.equals(mostRecentCommit.ballot));
-            }
-        });
-    }
-}
diff --git a/src/java/org/apache/cassandra/service/paxos/PrepareVerbHandler.java b/src/java/org/apache/cassandra/service/paxos/PrepareVerbHandler.java
deleted file mode 100644
index 157630f..0000000
--- a/src/java/org/apache/cassandra/service/paxos/PrepareVerbHandler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.apache.cassandra.service.paxos;
-/*
- * 
- * 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.
- * 
- */
-import org.apache.cassandra.net.IVerbHandler;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-
-public class PrepareVerbHandler implements IVerbHandler<Commit>
-{
-    public static PrepareVerbHandler instance = new PrepareVerbHandler();
-
-    public static PrepareResponse doPrepare(Commit toPrepare)
-    {
-        return PaxosState.prepare(toPrepare);
-    }
-
-    public void doVerb(Message<Commit> message)
-    {
-        Message<PrepareResponse> reply = message.responseWith(doPrepare(message.payload));
-        MessagingService.instance().send(reply, message.from());
-    }
-}
diff --git a/src/java/org/apache/cassandra/service/paxos/ProposeCallback.java b/src/java/org/apache/cassandra/service/paxos/ProposeCallback.java
deleted file mode 100644
index 7e755a0..0000000
--- a/src/java/org/apache/cassandra/service/paxos/ProposeCallback.java
+++ /dev/null
@@ -1,93 +0,0 @@
-package org.apache.cassandra.service.paxos;
-/*
- * 
- * 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.
- * 
- */
-
-
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.net.Message;
-
-/**
- * ProposeCallback has two modes of operation, controlled by the failFast parameter.
- *
- * In failFast mode, we will return a failure as soon as a majority of nodes reject
- * the proposal. This is used when replaying a proposal from an earlier leader.
- *
- * Otherwise, we wait for either all replicas to respond or until we achieve
- * the desired quorum. We continue to wait for all replicas even after we know we cannot succeed
- * because we need to know if no node at all have accepted or if at least one has.
- * In the former case, a proposer is guaranteed no-one will
- * replay its value; in the latter we don't, so we must timeout in case another
- * leader replays it before we can; see CASSANDRA-6013
- */
-public class ProposeCallback extends AbstractPaxosCallback<Boolean>
-{
-    private static final Logger logger = LoggerFactory.getLogger(ProposeCallback.class);
-
-    private final AtomicInteger accepts = new AtomicInteger(0);
-    private final int requiredAccepts;
-    private final boolean failFast;
-
-    public ProposeCallback(int totalTargets, int requiredTargets, boolean failFast, ConsistencyLevel consistency, long queryStartNanoTime)
-    {
-        super(totalTargets, consistency, queryStartNanoTime);
-        this.requiredAccepts = requiredTargets;
-        this.failFast = failFast;
-    }
-
-    public void onResponse(Message<Boolean> msg)
-    {
-        logger.trace("Propose response {} from {}", msg.payload, msg.from());
-
-        if (msg.payload)
-            accepts.incrementAndGet();
-
-        latch.countDown();
-
-        if (isSuccessful() || (failFast && (latch.getCount() + accepts.get() < requiredAccepts)))
-        {
-            while (latch.getCount() > 0)
-                latch.countDown();
-        }
-    }
-
-    public int getAcceptCount()
-    {
-        return accepts.get();
-    }
-
-    public boolean isSuccessful()
-    {
-        return accepts.get() >= requiredAccepts;
-    }
-
-    // Note: this is only reliable if !failFast
-    public boolean isFullyRefused()
-    {
-        // We need to check the latch first to avoid racing with a late arrival
-        // between the latch check and the accepts one
-        return latch.getCount() == 0 && accepts.get() == 0;
-    }
-}
diff --git a/src/java/org/apache/cassandra/service/paxos/ProposeVerbHandler.java b/src/java/org/apache/cassandra/service/paxos/ProposeVerbHandler.java
deleted file mode 100644
index 5a20b67..0000000
--- a/src/java/org/apache/cassandra/service/paxos/ProposeVerbHandler.java
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.apache.cassandra.service.paxos;
-/*
- * 
- * 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.
- * 
- */
-import org.apache.cassandra.net.IVerbHandler;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-
-public class ProposeVerbHandler implements IVerbHandler<Commit>
-{
-    public static final ProposeVerbHandler instance = new ProposeVerbHandler();
-
-    public static Boolean doPropose(Commit proposal)
-    {
-        return PaxosState.propose(proposal);
-    }
-
-    public void doVerb(Message<Commit> message)
-    {
-        Message<Boolean> reply = message.responseWith(doPropose(message.payload));
-        MessagingService.instance().send(reply, message.from());
-    }
-}
diff --git a/src/java/org/apache/cassandra/service/paxos/TablePaxosRepairHistory.java b/src/java/org/apache/cassandra/service/paxos/TablePaxosRepairHistory.java
new file mode 100644
index 0000000..81e0b14
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/TablePaxosRepairHistory.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.service.paxos;
+
+import java.util.Collection;
+
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+
+public class TablePaxosRepairHistory
+{
+    private final String keyspace;
+    private final String table;
+    private volatile PaxosRepairHistory history;
+
+    private TablePaxosRepairHistory(String keyspace, String table, PaxosRepairHistory history)
+    {
+        this.keyspace = keyspace;
+        this.table = table;
+        this.history = history;
+    }
+
+    public static TablePaxosRepairHistory load(String keyspace, String table)
+    {
+        return new TablePaxosRepairHistory(keyspace, table, SystemKeyspace.loadPaxosRepairHistory(keyspace, table));
+    }
+
+    public Ballot getBallotForToken(Token token)
+    {
+        return history.ballotForToken(token);
+    }
+
+    private void updatePaxosRepairTable(PaxosRepairHistory update, boolean flush)
+    {
+        SystemKeyspace.savePaxosRepairHistory(keyspace, table, update, flush);
+    }
+
+    public synchronized void add(Collection<Range<Token>> ranges, Ballot ballot, boolean flush)
+    {
+        PaxosRepairHistory update = PaxosRepairHistory.add(history, ranges, ballot);
+        updatePaxosRepairTable(update, flush);
+        history = update;
+    }
+
+    public synchronized void merge(PaxosRepairHistory toMerge, boolean flush)
+    {
+        PaxosRepairHistory update = PaxosRepairHistory.merge(history, toMerge);
+        if (!update.equals(history))
+            updatePaxosRepairTable(update, flush);
+        history = update;
+    }
+
+    public PaxosRepairHistory getHistory()
+    {
+        return history;
+    }
+
+    public PaxosRepairHistory getHistoryForRanges(Collection<Range<Token>> ranges)
+    {
+        return PaxosRepairHistory.trim(history, ranges);
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanup.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanup.java
new file mode 100644
index 0000000..6eb1ebd
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanup.java
@@ -0,0 +1,156 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.RangesAtEndpoint;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+import org.apache.cassandra.utils.concurrent.Future;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.config.DatabaseDescriptor.getCasContentionTimeout;
+import static org.apache.cassandra.config.DatabaseDescriptor.getWriteRpcTimeout;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+
+public class PaxosCleanup extends AsyncFuture<Void> implements Runnable
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosCleanup.class);
+
+    private final Collection<InetAddressAndPort> endpoints;
+    private final TableMetadata table;
+    private final Collection<Range<Token>> ranges;
+    private final boolean skippedReplicas;
+    private final Executor executor;
+
+    // references kept for debugging
+    private PaxosStartPrepareCleanup startPrepare;
+    private PaxosFinishPrepareCleanup finishPrepare;
+    private PaxosCleanupSession session;
+    private PaxosCleanupComplete complete;
+
+    public PaxosCleanup(Collection<InetAddressAndPort> endpoints, TableMetadata table, Collection<Range<Token>> ranges, boolean skippedReplicas, Executor executor)
+    {
+        this.endpoints = endpoints;
+        this.table = table;
+        this.ranges = ranges;
+        this.skippedReplicas = skippedReplicas;
+        this.executor = executor;
+    }
+
+    private <T> void addCallback(Future<T> future, Consumer<T> onComplete)
+    {
+        future.addCallback(onComplete, this::tryFailure);
+    }
+
+    public static PaxosCleanup cleanup(Collection<InetAddressAndPort> endpoints, TableMetadata table, Collection<Range<Token>> ranges, boolean skippedReplicas, Executor executor)
+    {
+        PaxosCleanup cleanup = new PaxosCleanup(endpoints, table, ranges, skippedReplicas, executor);
+        executor.execute(cleanup);
+        return cleanup;
+    }
+
+    public void run()
+    {
+        EndpointState localEpState = Gossiper.instance.getEndpointStateForEndpoint(getBroadcastAddressAndPort());
+        startPrepare = PaxosStartPrepareCleanup.prepare(table.id, endpoints, localEpState, ranges);
+        addCallback(startPrepare, this::finishPrepare);
+    }
+
+    private void finishPrepare(PaxosCleanupHistory result)
+    {
+        ScheduledExecutors.nonPeriodicTasks.schedule(() -> {
+            finishPrepare = PaxosFinishPrepareCleanup.finish(endpoints, result);
+            addCallback(finishPrepare, (v) -> startSession(result.highBound));
+        }, Math.min(getCasContentionTimeout(MILLISECONDS), getWriteRpcTimeout(MILLISECONDS)), MILLISECONDS);
+    }
+
+    private void startSession(Ballot lowBound)
+    {
+        session = new PaxosCleanupSession(endpoints, table.id, ranges);
+        addCallback(session, (v) -> finish(lowBound));
+        executor.execute(session);
+    }
+
+    private void finish(Ballot lowBound)
+    {
+        complete = new PaxosCleanupComplete(endpoints, table.id, ranges, lowBound, skippedReplicas);
+        addCallback(complete, this::trySuccess);
+        executor.execute(complete);
+    }
+
+    private static boolean isOutOfRange(String ksName, Collection<Range<Token>> repairRanges)
+    {
+        Keyspace keyspace = Keyspace.open(ksName);
+        List<Range<Token>> localRanges = Range.normalize(keyspace.getReplicationStrategy()
+                                                                 .getAddressReplicas()
+                                                                 .get(FBUtilities.getBroadcastAddressAndPort())
+                                                                 .ranges());
+
+        RangesAtEndpoint pendingRanges = StorageService.instance.getTokenMetadata().getPendingRanges(ksName, FBUtilities.getBroadcastAddressAndPort());
+        if (!pendingRanges.isEmpty())
+        {
+            localRanges.addAll(pendingRanges.ranges());
+            localRanges = Range.normalize(localRanges);
+        }
+
+        for (Range<Token> repairRange : Range.normalize(repairRanges))
+        {
+            if (!Iterables.any(localRanges, localRange -> localRange.contains(repairRange)))
+                return true;
+        }
+        return false;
+    }
+
+    static boolean isInRangeAndShouldProcess(Collection<Range<Token>> ranges, TableId tableId)
+    {
+        TableMetadata metadata = Schema.instance.getTableMetadata(tableId);
+
+        Keyspace keyspace = Keyspace.open(metadata.keyspace);
+        Preconditions.checkNotNull(keyspace);
+
+        if (!isOutOfRange(metadata.keyspace, ranges))
+            return true;
+
+        logger.warn("Out of range PaxosCleanup request for {}: {}", metadata, ranges);
+        return false;
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupComplete.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupComplete.java
new file mode 100644
index 0000000..0196e9c
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupComplete.java
@@ -0,0 +1,144 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.io.IOException;
+import java.util.*;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.dht.AbstractBounds;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.*;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+
+import static org.apache.cassandra.config.DatabaseDescriptor.getPartitioner;
+import static org.apache.cassandra.net.NoPayload.noPayload;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_COMPLETE_REQ;
+
+public class PaxosCleanupComplete extends AsyncFuture<Void> implements RequestCallbackWithFailure<Void>, Runnable
+{
+    private final Set<InetAddressAndPort> waitingResponse;
+    final TableId tableId;
+    final Collection<Range<Token>> ranges;
+    final Ballot lowBound;
+    final boolean skippedReplicas;
+
+    PaxosCleanupComplete(Collection<InetAddressAndPort> endpoints, TableId tableId, Collection<Range<Token>> ranges, Ballot lowBound, boolean skippedReplicas)
+    {
+        this.waitingResponse = new HashSet<>(endpoints);
+        this.tableId = tableId;
+        this.ranges = ranges;
+        this.lowBound = lowBound;
+        this.skippedReplicas = skippedReplicas;
+    }
+
+    public synchronized void run()
+    {
+        Request request = !skippedReplicas ? new Request(tableId, lowBound, ranges)
+                                           : new Request(tableId, Ballot.none(), Collections.emptyList());
+        Message<Request> message = Message.out(PAXOS2_CLEANUP_COMPLETE_REQ, request);
+        for (InetAddressAndPort endpoint : waitingResponse)
+            MessagingService.instance().sendWithCallback(message, endpoint, this);
+    }
+
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        tryFailure(new PaxosCleanupException("Timed out waiting on response from " + from));
+    }
+
+    @Override
+    public synchronized void onResponse(Message<Void> msg)
+    {
+        if (isDone())
+            return;
+
+        if (!waitingResponse.remove(msg.from()))
+            throw new IllegalArgumentException("Received unexpected response from " + msg.from());
+
+        if (waitingResponse.isEmpty())
+            trySuccess(null);
+    }
+
+    static class Request
+    {
+        final TableId tableId;
+        final Ballot lowBound;
+        final Collection<Range<Token>> ranges;
+
+        Request(TableId tableId, Ballot lowBound, Collection<Range<Token>> ranges)
+        {
+            this.tableId = tableId;
+            this.ranges = ranges;
+            this.lowBound = lowBound;
+        }
+    }
+
+    public static final IVersionedSerializer<Request> serializer = new IVersionedSerializer<Request>()
+    {
+        public void serialize(Request request, DataOutputPlus out, int version) throws IOException
+        {
+            request.tableId.serialize(out);
+            request.lowBound.serialize(out);
+            out.writeInt(request.ranges.size());
+            for (Range<Token> rt : request.ranges)
+                AbstractBounds.tokenSerializer.serialize(rt, out, version);
+        }
+
+        public Request deserialize(DataInputPlus in, int version) throws IOException
+        {
+            TableId tableId = TableId.deserialize(in);
+            Ballot lowBound = Ballot.deserialize(in);
+            int numRanges = in.readInt();
+            List<Range<Token>> ranges = new ArrayList<>();
+            for (int i = 0; i < numRanges; i++)
+            {
+                Range<Token> range = (Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, getPartitioner(), version);
+                ranges.add(range);
+            }
+            return new Request(tableId, lowBound, ranges);
+        }
+
+        public long serializedSize(Request request, int version)
+        {
+            long size = request.tableId.serializedSize();
+            size += Ballot.sizeInBytes();
+            size += TypeSizes.sizeof(request.ranges.size());
+            for (Range<Token> range : request.ranges)
+                size += AbstractBounds.tokenSerializer.serializedSize(range, version);
+            return size;
+        }
+    };
+
+    public static final IVerbHandler<Request> verbHandler = (in) -> {
+        ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(in.payload.tableId);
+        cfs.onPaxosRepairComplete(in.payload.ranges, in.payload.lowBound);
+        MessagingService.instance().respond(noPayload, in);
+    };
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupException.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupException.java
new file mode 100644
index 0000000..9eb8fbe
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupException.java
@@ -0,0 +1,27 @@
+/*
+ * 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.service.paxos.cleanup;
+
+class PaxosCleanupException extends RuntimeException
+{
+    PaxosCleanupException(String message)
+    {
+        super(message);
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupHistory.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupHistory.java
new file mode 100644
index 0000000..70b4099
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupHistory.java
@@ -0,0 +1,68 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.io.IOException;
+
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
+
+public class PaxosCleanupHistory
+{
+    final TableId tableId;
+    final Ballot highBound;
+    final PaxosRepairHistory history;
+
+    public PaxosCleanupHistory(TableId tableId, Ballot highBound, PaxosRepairHistory history)
+    {
+        this.tableId = tableId;
+        this.highBound = highBound;
+        this.history = history;
+    }
+
+    public static final IVersionedSerializer<PaxosCleanupHistory> serializer = new IVersionedSerializer<PaxosCleanupHistory>()
+    {
+        public void serialize(PaxosCleanupHistory message, DataOutputPlus out, int version) throws IOException
+        {
+            message.tableId.serialize(out);
+            message.highBound.serialize(out);
+            PaxosRepairHistory.serializer.serialize(message.history, out, version);
+        }
+
+        public PaxosCleanupHistory deserialize(DataInputPlus in, int version) throws IOException
+        {
+            TableId tableId = TableId.deserialize(in);
+            Ballot lowBound = Ballot.deserialize(in);
+            PaxosRepairHistory history = PaxosRepairHistory.serializer.deserialize(in, version);
+            return new PaxosCleanupHistory(tableId, lowBound, history);
+        }
+
+        public long serializedSize(PaxosCleanupHistory message, int version)
+        {
+            long size = message.tableId.serializedSize();
+            size += Ballot.sizeInBytes();
+            size += PaxosRepairHistory.serializer.serializedSize(message.history, version);
+            return size;
+        }
+    };
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupLocalCoordinator.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupLocalCoordinator.java
new file mode 100644
index 0000000..7b88276
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupLocalCoordinator.java
@@ -0,0 +1,188 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.google.common.base.Preconditions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.AbstractPaxosRepair;
+import org.apache.cassandra.service.paxos.PaxosRepair;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.service.paxos.uncommitted.UncommittedPaxosKey;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+
+import static org.apache.cassandra.service.paxos.cleanup.PaxosCleanupSession.TIMEOUT_NANOS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public class PaxosCleanupLocalCoordinator extends AsyncFuture<PaxosCleanupResponse>
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosCleanupLocalCoordinator.class);
+    private static final UUID INTERNAL_SESSION = new UUID(0, 0);
+
+    private final UUID session;
+    private final TableId tableId;
+    private final TableMetadata table;
+    private final Collection<Range<Token>> ranges;
+    private final CloseableIterator<UncommittedPaxosKey> uncommittedIter;
+    private int count = 0;
+    private final long deadline;
+
+    private final Map<DecoratedKey, AbstractPaxosRepair> inflight = new ConcurrentHashMap<>();
+    private final PaxosTableRepairs tableRepairs;
+
+    private PaxosCleanupLocalCoordinator(UUID session, TableId tableId, Collection<Range<Token>> ranges, CloseableIterator<UncommittedPaxosKey> uncommittedIter)
+    {
+        this.session = session;
+        this.tableId = tableId;
+        this.table = Schema.instance.getTableMetadata(tableId);
+        this.ranges = ranges;
+        this.uncommittedIter = uncommittedIter;
+        this.tableRepairs = PaxosTableRepairs.getForTable(tableId);
+        this.deadline = TIMEOUT_NANOS + nanoTime();
+    }
+
+    public synchronized void start()
+    {
+        if (table == null)
+        {
+            fail("Unknown tableId: " + tableId);
+            return;
+        }
+
+        if (!PaxosRepair.validatePeerCompatibility(table, ranges))
+        {
+            fail("Unsupported peer versions for " + tableId + ' ' + ranges.toString());
+            return;
+        }
+
+        logger.info("Completing uncommitted paxos instances for {} on ranges {} for session {}", table, ranges, session);
+
+        scheduleKeyRepairsOrFinish();
+    }
+
+    @SuppressWarnings("resource")
+    public static PaxosCleanupLocalCoordinator create(PaxosCleanupRequest request)
+    {
+        CloseableIterator<UncommittedPaxosKey> iterator = PaxosState.uncommittedTracker().uncommittedKeyIterator(request.tableId, request.ranges);
+        return new PaxosCleanupLocalCoordinator(request.session, request.tableId, request.ranges, iterator);
+    }
+
+    @SuppressWarnings("resource")
+    public static PaxosCleanupLocalCoordinator createForAutoRepair(TableId tableId, Collection<Range<Token>> ranges)
+    {
+        CloseableIterator<UncommittedPaxosKey> iterator = PaxosState.uncommittedTracker().uncommittedKeyIterator(tableId, ranges);
+        return new PaxosCleanupLocalCoordinator(INTERNAL_SESSION, tableId, ranges, iterator);
+    }
+
+    /**
+     * Schedule as many key repairs as we can, up to the paralellism limit. If no repairs are scheduled and
+     * none are in flight when the iterator is exhausted, the session will be finished
+     */
+    private void scheduleKeyRepairsOrFinish()
+    {
+        int parallelism = DatabaseDescriptor.getPaxosRepairParallelism();
+        Preconditions.checkArgument(parallelism > 0);
+        if (inflight.size() < parallelism)
+        {
+            if (nanoTime() - deadline >= 0)
+            {
+                fail("timeout");
+                return;
+            }
+
+            while (inflight.size() < parallelism && uncommittedIter.hasNext())
+                repairKey(uncommittedIter.next());
+
+        }
+
+        if (inflight.isEmpty())
+            finish();
+    }
+
+    private boolean repairKey(UncommittedPaxosKey uncommitted)
+    {
+        logger.trace("repairing {}", uncommitted);
+        Preconditions.checkState(!inflight.containsKey(uncommitted.getKey()));
+        ConsistencyLevel consistency = uncommitted.getConsistencyLevel();
+
+        // we don't know the consistency of this operation, presumably because it originated
+        // before we started tracking paxos cl, so we don't attempt to repair it
+        if (consistency == null)
+            return false;
+
+        inflight.put(uncommitted.getKey(), tableRepairs.startOrGetOrQueue(uncommitted.getKey(), uncommitted.ballot(), uncommitted.getConsistencyLevel(), table, result -> {
+            if (result.wasSuccessful())
+                onKeyFinish(uncommitted.getKey());
+            else
+                onKeyFailure(result.toString());
+        }));
+        return true;
+    }
+
+    private synchronized void onKeyFinish(DecoratedKey key)
+    {
+        if (!inflight.containsKey(key))
+            return;
+        logger.trace("finished repairing {}", key);
+        inflight.remove(key);
+        count++;
+
+        scheduleKeyRepairsOrFinish();
+    }
+
+    private void complete(PaxosCleanupResponse response)
+    {
+        uncommittedIter.close();
+        trySuccess(response);
+    }
+
+    private void onKeyFailure(String reason)
+    {
+        // not synchronized to avoid deadlock with callback we register on start
+        inflight.values().forEach(AbstractPaxosRepair::cancel);
+        fail(reason);
+    }
+
+    private synchronized void fail(String reason)
+    {
+        logger.info("Failing paxos cleanup session {} for {} on ranges {}. Reason: {}", session, table, ranges, reason);
+        complete(PaxosCleanupResponse.failed(session, reason));
+    }
+
+    private void finish()
+    {
+        logger.info("Completed {} uncommitted paxos instances for {} on ranges {} for session {}", count, table, ranges, session);
+        complete(PaxosCleanupResponse.success(session));
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupRequest.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupRequest.java
new file mode 100644
index 0000000..4db457f
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupRequest.java
@@ -0,0 +1,141 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import javax.annotation.Nullable;
+
+import com.google.common.util.concurrent.FutureCallback;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.dht.AbstractBounds;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.utils.UUIDSerializer;
+
+import static org.apache.cassandra.net.MessagingService.instance;
+import static org.apache.cassandra.net.NoPayload.noPayload;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_RSP2;
+
+// TODO: send the high bound as a minimum commit point, so later repairs can terminate early if a later commit has been witnessed
+public class PaxosCleanupRequest
+{
+    public final UUID session;
+    public final TableId tableId;
+    public final Collection<Range<Token>> ranges;
+
+    static Collection<Range<Token>> rangesOrMin(Collection<Range<Token>> ranges)
+    {
+        if (ranges != null && !ranges.isEmpty())
+            return ranges;
+
+        Token min = DatabaseDescriptor.getPartitioner().getMinimumToken();
+        return Collections.singleton(new Range<>(min, min));
+    }
+
+    public PaxosCleanupRequest(UUID session, TableId tableId, Collection<Range<Token>> ranges)
+    {
+        this.session = session;
+        this.tableId = tableId;
+        this.ranges = rangesOrMin(ranges);
+    }
+
+    public static final IVerbHandler<PaxosCleanupRequest> verbHandler = in -> {
+        PaxosCleanupRequest request = in.payload;
+
+        if (!PaxosCleanup.isInRangeAndShouldProcess(request.ranges, request.tableId))
+        {
+            String msg = String.format("Rejecting cleanup request %s from %s. Some ranges are not replicated (%s)",
+                                       request.session, in.from(), request.ranges);
+            Message<PaxosCleanupResponse> response = Message.out(PAXOS2_CLEANUP_RSP2, PaxosCleanupResponse.failed(request.session, msg));
+            instance().send(response, in.respondTo());
+            return;
+        }
+
+        PaxosCleanupLocalCoordinator coordinator = PaxosCleanupLocalCoordinator.create(request);
+
+        coordinator.addCallback(new FutureCallback<PaxosCleanupResponse>()
+        {
+            public void onSuccess(@Nullable PaxosCleanupResponse finished)
+            {
+                Message<PaxosCleanupResponse> response = Message.out(PAXOS2_CLEANUP_RSP2, coordinator.getNow());
+                instance().send(response, in.respondTo());
+            }
+
+            public void onFailure(Throwable throwable)
+            {
+                Message<PaxosCleanupResponse> response = Message.out(PAXOS2_CLEANUP_RSP2, PaxosCleanupResponse.failed(request.session, throwable.getMessage()));
+                instance().send(response, in.respondTo());
+            }
+        });
+
+        // ack the request so the coordinator knows we've started
+        instance().respond(noPayload, in);
+
+        coordinator.start();
+    };
+
+    public static final IVersionedSerializer<PaxosCleanupRequest> serializer = new IVersionedSerializer<PaxosCleanupRequest>()
+    {
+        public void serialize(PaxosCleanupRequest completer, DataOutputPlus out, int version) throws IOException
+        {
+            UUIDSerializer.serializer.serialize(completer.session, out, version);
+            completer.tableId.serialize(out);
+            out.writeInt(completer.ranges.size());
+            for (Range<Token> range: completer.ranges)
+                AbstractBounds.tokenSerializer.serialize(range, out, version);
+        }
+
+        public PaxosCleanupRequest deserialize(DataInputPlus in, int version) throws IOException
+        {
+            UUID session = UUIDSerializer.serializer.deserialize(in, version);
+            TableId tableId = TableId.deserialize(in);
+
+            int numRanges = in.readInt();
+            List<Range<Token>> ranges = new ArrayList<>(numRanges);
+            for (int i=0; i<numRanges; i++)
+            {
+                ranges.add((Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, DatabaseDescriptor.getPartitioner(), version));
+            }
+            return new PaxosCleanupRequest(session, tableId, ranges);
+        }
+
+        public long serializedSize(PaxosCleanupRequest completer, int version)
+        {
+            long size = UUIDSerializer.serializer.serializedSize(completer.session, version);
+            size += completer.tableId.serializedSize();
+            size += TypeSizes.sizeof(completer.ranges.size());
+            for (Range<Token> range: completer.ranges)
+                size += AbstractBounds.tokenSerializer.serializedSize(range, version);
+            return size;
+        }
+    };
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupResponse.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupResponse.java
new file mode 100644
index 0000000..1c90162
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupResponse.java
@@ -0,0 +1,87 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.io.IOException;
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.utils.UUIDSerializer;
+
+public class PaxosCleanupResponse
+{
+    public final UUID session;
+    public final boolean wasSuccessful;
+    public final String message;
+
+    public PaxosCleanupResponse(UUID session, boolean wasSuccessful, @Nullable String message)
+    {
+        this.session = session;
+        this.wasSuccessful = wasSuccessful;
+        this.message = message;
+    }
+
+    public static PaxosCleanupResponse success(UUID session)
+    {
+        return new PaxosCleanupResponse(session, true, null);
+    }
+
+    public static PaxosCleanupResponse failed(UUID session, String message)
+    {
+        return new PaxosCleanupResponse(session, false, message);
+    }
+
+    public static final IVerbHandler<PaxosCleanupResponse> verbHandler = (message) -> PaxosCleanupSession.finishSession(message.from(), message.payload);
+
+    public static final IVersionedSerializer<PaxosCleanupResponse> serializer = new IVersionedSerializer<PaxosCleanupResponse>()
+    {
+        public void serialize(PaxosCleanupResponse finished, DataOutputPlus out, int version) throws IOException
+        {
+            UUIDSerializer.serializer.serialize(finished.session, out, version);
+            out.writeBoolean(finished.wasSuccessful);
+            out.writeBoolean(finished.message != null);
+            if (finished.message != null)
+                out.writeUTF(finished.message);
+        }
+
+        public PaxosCleanupResponse deserialize(DataInputPlus in, int version) throws IOException
+        {
+            UUID session = UUIDSerializer.serializer.deserialize(in, version);
+            boolean success = in.readBoolean();
+            String message = in.readBoolean() ? in.readUTF() : null;
+            return new PaxosCleanupResponse(session, success, message);
+        }
+
+        public long serializedSize(PaxosCleanupResponse finished, int version)
+        {
+            long size = UUIDSerializer.serializer.serializedSize(finished.session, version);
+            size += TypeSizes.sizeof(finished.wasSuccessful);
+            size += TypeSizes.sizeof(finished.message != null);
+            if (finished.message != null)
+                size += TypeSizes.sizeof(finished.message);
+            return size;
+        }
+    };
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupSession.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupSession.java
new file mode 100644
index 0000000..3d765ea
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosCleanupSession.java
@@ -0,0 +1,267 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.lang.ref.WeakReference;
+import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.IEndpointStateChangeSubscriber;
+import org.apache.cassandra.gms.IFailureDetectionEventListener;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.RequestCallbackWithFailure;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_REQ;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public class PaxosCleanupSession extends AsyncFuture<Void> implements Runnable,
+                                                                      IEndpointStateChangeSubscriber,
+                                                                      IFailureDetectionEventListener,
+                                                                      RequestCallbackWithFailure<Void>
+{
+    private static final Map<UUID, PaxosCleanupSession> sessions = new ConcurrentHashMap<>();
+
+    static final long TIMEOUT_NANOS;
+    static
+    {
+        long timeoutSeconds = Integer.getInteger("cassandra.paxos_cleanup_session_timeout_seconds", (int) TimeUnit.HOURS.toSeconds(2));
+        TIMEOUT_NANOS = TimeUnit.SECONDS.toNanos(timeoutSeconds);
+    }
+
+    private static class TimeoutTask implements Runnable
+    {
+        private final WeakReference<PaxosCleanupSession> ref;
+
+        TimeoutTask(PaxosCleanupSession session)
+        {
+            this.ref = new WeakReference<>(session);
+        }
+
+        @Override
+        public void run()
+        {
+            PaxosCleanupSession session = ref.get();
+            if (session == null || session.isDone())
+                return;
+
+            long remaining = session.lastMessageSentNanos + TIMEOUT_NANOS - nanoTime();
+            if (remaining > 0)
+                schedule(remaining);
+            else
+                session.fail(String.format("Paxos cleanup session %s timed out", session.session));
+        }
+
+        ScheduledFuture<?> schedule(long delayNanos)
+        {
+            return ScheduledExecutors.scheduledTasks.scheduleTimeoutWithDelay(this, delayNanos, TimeUnit.NANOSECONDS);
+        }
+
+        private static ScheduledFuture<?> schedule(PaxosCleanupSession session)
+        {
+            return new TimeoutTask(session).schedule(TIMEOUT_NANOS);
+        }
+    }
+
+    private final UUID session = UUID.randomUUID();
+    private final TableId tableId;
+    private final Collection<Range<Token>> ranges;
+    private final Queue<InetAddressAndPort> pendingCleanups = new ConcurrentLinkedQueue<>();
+    private InetAddressAndPort inProgress = null;
+    private volatile long lastMessageSentNanos = nanoTime();
+    private ScheduledFuture<?> timeout;
+
+    PaxosCleanupSession(Collection<InetAddressAndPort> endpoints, TableId tableId, Collection<Range<Token>> ranges)
+    {
+        this.tableId = tableId;
+        this.ranges = ranges;
+
+        pendingCleanups.addAll(endpoints);
+    }
+
+    private static void setSession(PaxosCleanupSession session)
+    {
+        Preconditions.checkState(!sessions.containsKey(session.session));
+        sessions.put(session.session, session);
+    }
+
+    private static void removeSession(PaxosCleanupSession session)
+    {
+        Preconditions.checkState(sessions.containsKey(session.session));
+        sessions.remove(session.session);
+    }
+
+    @Override
+    public void run()
+    {
+        setSession(this);
+        startNextOrFinish();
+        if (!isDone())
+            timeout = TimeoutTask.schedule(this);
+    }
+
+    private void startCleanup(InetAddressAndPort endpoint)
+    {
+        lastMessageSentNanos = nanoTime();
+        PaxosCleanupRequest completer = new PaxosCleanupRequest(session, tableId, ranges);
+        Message<PaxosCleanupRequest> msg = Message.out(PAXOS2_CLEANUP_REQ, completer);
+        MessagingService.instance().sendWithCallback(msg, endpoint, this);
+    }
+
+    private synchronized void startNextOrFinish()
+    {
+        InetAddressAndPort endpoint = pendingCleanups.poll();
+
+        if (endpoint == null)
+            Preconditions.checkState(inProgress == null, "Unable to complete paxos cleanup session %s, still waiting on %s", session, inProgress);
+        else
+            Preconditions.checkState(inProgress == null, "Unable to start paxos cleanup on %s for %s, still waiting on response from %s", endpoint, session, inProgress);
+
+        inProgress = endpoint;
+
+        if (endpoint != null)
+        {
+            startCleanup(endpoint);
+        }
+        else
+        {
+            removeSession(this);
+            trySuccess(null);
+            if (timeout != null)
+                timeout.cancel(true);
+        }
+    }
+
+    private synchronized void fail(String message)
+    {
+        if (isDone())
+            return;
+        removeSession(this);
+        tryFailure(new PaxosCleanupException(message));
+        if (timeout != null)
+            timeout.cancel(true);
+    }
+
+    private synchronized void finish(InetAddressAndPort from, PaxosCleanupResponse finished)
+    {
+        Preconditions.checkArgument(from.equals(inProgress), "Received unexpected cleanup complete response from %s for session %s. Expected %s", from, session, inProgress);
+        inProgress = null;
+
+        if (finished.wasSuccessful)
+        {
+            startNextOrFinish();
+        }
+        else
+        {
+            fail(String.format("Paxos cleanup session %s failed on %s with message: %s", session, from, finished.message));
+        }
+    }
+
+    public static void finishSession(InetAddressAndPort from, PaxosCleanupResponse response)
+    {
+        PaxosCleanupSession session = sessions.get(response.session);
+        if (session != null)
+            session.finish(from, response);
+    }
+
+    private synchronized void maybeKillSession(InetAddressAndPort unavailable, String reason)
+    {
+        // don't fail if we've already completed the cleanup for the unavailable endpoint,
+        // if it's something that affects availability, the ongoing sessions will fail themselves
+        if (!pendingCleanups.contains(unavailable))
+            return;
+
+        fail(String.format("Paxos cleanup session %s failed after %s %s", session, unavailable, reason));
+    }
+
+    @Override
+    public void onJoin(InetAddressAndPort endpoint, EndpointState epState)
+    {
+
+    }
+
+    @Override
+    public void beforeChange(InetAddressAndPort endpoint, EndpointState currentState, ApplicationState newStateKey, VersionedValue newValue)
+    {
+
+    }
+
+    @Override
+    public void onChange(InetAddressAndPort endpoint, ApplicationState state, VersionedValue value)
+    {
+
+    }
+
+    @Override
+    public void onAlive(InetAddressAndPort endpoint, EndpointState state)
+    {
+
+    }
+
+    @Override
+    public void onDead(InetAddressAndPort endpoint, EndpointState state)
+    {
+        maybeKillSession(endpoint, "marked dead");
+    }
+
+    @Override
+    public void onRemove(InetAddressAndPort endpoint)
+    {
+        maybeKillSession(endpoint, "removed from ring");
+    }
+
+    @Override
+    public void onRestart(InetAddressAndPort endpoint, EndpointState state)
+    {
+        maybeKillSession(endpoint, "restarted");
+    }
+
+    @Override
+    public void convict(InetAddressAndPort ep, double phi)
+    {
+        maybeKillSession(ep, "convicted by failure detector");
+    }
+
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        fail(from.toString() + ' ' + reason + " for cleanup request for paxos cleanup session  " + session);
+    }
+
+    @Override
+    public void onResponse(Message<Void> msg)
+    {
+        // noop, we're only interested in failures
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosFinishPrepareCleanup.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosFinishPrepareCleanup.java
new file mode 100644
index 0000000..92d8d35
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosFinishPrepareCleanup.java
@@ -0,0 +1,169 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.io.IOException;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicReference;
+
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.io.FSWriteError;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.*;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.utils.Throwables;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+import org.apache.cassandra.utils.concurrent.IntrusiveStack;
+
+import static org.apache.cassandra.exceptions.RequestFailureReason.UNKNOWN;
+import static org.apache.cassandra.net.NoPayload.noPayload;
+
+public class PaxosFinishPrepareCleanup extends AsyncFuture<Void> implements RequestCallbackWithFailure<Void>
+{
+    private final Set<InetAddressAndPort> waitingResponse;
+
+    PaxosFinishPrepareCleanup(Collection<InetAddressAndPort> endpoints)
+    {
+        this.waitingResponse = new HashSet<>(endpoints);
+    }
+
+    public static PaxosFinishPrepareCleanup finish(Collection<InetAddressAndPort> endpoints, PaxosCleanupHistory result)
+    {
+        PaxosFinishPrepareCleanup callback = new PaxosFinishPrepareCleanup(endpoints);
+        synchronized (callback)
+        {
+            Message<PaxosCleanupHistory> message = Message.out(Verb.PAXOS2_CLEANUP_FINISH_PREPARE_REQ, result);
+            for (InetAddressAndPort endpoint : endpoints)
+                MessagingService.instance().sendWithCallback(message, endpoint, callback);
+        }
+        return callback;
+    }
+
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        tryFailure(new PaxosCleanupException(reason + " failure response from " + from));
+    }
+
+    public synchronized void onResponse(Message<Void> msg)
+    {
+        if (isDone())
+            return;
+
+        if (!waitingResponse.remove(msg.from()))
+            throw new IllegalArgumentException("Received unexpected response from " + msg.from());
+
+        if (waitingResponse.isEmpty())
+            trySuccess(null);
+    }
+
+    static class PendingCleanup extends IntrusiveStack<PendingCleanup>
+    {
+        private static final AtomicReference<PendingCleanup> pendingCleanup = new AtomicReference();
+        private static final Runnable CLEANUP = () -> {
+            PendingCleanup list = pendingCleanup.getAndSet(null);
+            if (list == null)
+                return;
+
+            Ballot highBound = Ballot.none();
+            for (PendingCleanup pending : IntrusiveStack.iterable(list))
+            {
+                PaxosCleanupHistory cleanupHistory = pending.message.payload;
+                if (cleanupHistory.highBound.compareTo(highBound) > 0)
+                    highBound = cleanupHistory.highBound;
+            }
+            try
+            {
+                try
+                {
+                    PaxosState.ballotTracker().updateLowBound(highBound);
+                }
+                catch (IOException e)
+                {
+                    throw new FSWriteError(e);
+                }
+            }
+            catch (Throwable t)
+            {
+                for (PendingCleanup pending : IntrusiveStack.iterable(list))
+                    MessagingService.instance().respondWithFailure(UNKNOWN, pending.message);
+                throw t;
+            }
+
+            Set<PendingCleanup> failed = null;
+            Throwable fail = null;
+            for (PendingCleanup pending : IntrusiveStack.iterable(list))
+            {
+                try
+                {
+                    Schema.instance.getColumnFamilyStoreInstance(pending.message.payload.tableId)
+                                   .syncPaxosRepairHistory(pending.message.payload.history, false);
+                }
+                catch (Throwable t)
+                {
+                    fail = Throwables.merge(fail, t);
+                    if (failed == null)
+                        failed = Collections.newSetFromMap(new IdentityHashMap<>());
+                    failed.add(pending);
+                    MessagingService.instance().respondWithFailure(UNKNOWN, pending.message);
+                }
+            }
+
+            try
+            {
+                SystemKeyspace.flushPaxosRepairHistory();
+                for (PendingCleanup pending : IntrusiveStack.iterable(list))
+                {
+                    if (failed == null || !failed.contains(pending))
+                        MessagingService.instance().respond(noPayload, pending.message);
+                }
+            }
+            catch (Throwable t)
+            {
+                fail = Throwables.merge(fail, t);
+                for (PendingCleanup pending : IntrusiveStack.iterable(list))
+                {
+                    if (failed == null || !failed.contains(pending))
+                        MessagingService.instance().respondWithFailure(UNKNOWN, pending.message);
+                }
+            }
+            Throwables.maybeFail(fail);
+        };
+
+        final Message<PaxosCleanupHistory> message;
+        PendingCleanup(Message<PaxosCleanupHistory> message)
+        {
+            this.message = message;
+        }
+
+        public static void add(Message<PaxosCleanupHistory> message)
+        {
+            PendingCleanup next = new PendingCleanup(message);
+            PendingCleanup prev = IntrusiveStack.push(AtomicReference::get, AtomicReference::compareAndSet, pendingCleanup, next);
+            if (prev == null)
+                Stage.MISC.execute(CLEANUP);
+        }
+    }
+
+    public static final IVerbHandler<PaxosCleanupHistory> verbHandler = PendingCleanup::add;
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosStartPrepareCleanup.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosStartPrepareCleanup.java
new file mode 100644
index 0000000..9f30692
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosStartPrepareCleanup.java
@@ -0,0 +1,192 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.io.IOException;
+import java.util.*;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.dht.AbstractBounds;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.*;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.service.PendingRangeCalculatorService;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_START_PREPARE_REQ;
+import static org.apache.cassandra.service.paxos.Paxos.newBallot;
+import static org.apache.cassandra.service.paxos.PaxosState.ballotTracker;
+
+/**
+ * Determines the highest ballot we should attempt to repair
+ */
+public class PaxosStartPrepareCleanup extends AsyncFuture<PaxosCleanupHistory> implements RequestCallbackWithFailure<PaxosCleanupHistory>
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosStartPrepareCleanup.class);
+
+    public static final RequestSerializer serializer = new RequestSerializer();
+
+    private final TableId table;
+
+    private final Set<InetAddressAndPort> waitingResponse;
+    private Ballot maxBallot = null;
+    private PaxosRepairHistory history = null;
+
+    PaxosStartPrepareCleanup(TableId table, Collection<InetAddressAndPort> endpoints)
+    {
+        this.table = table;
+        this.waitingResponse = new HashSet<>(endpoints);
+    }
+
+    /**
+     * We run paxos repair as part of topology changes, so we include the local endpoint state in the paxos repair
+     * prepare message to prevent racing with gossip dissemination and guarantee that every repair participant is aware
+     * of the pending ring change during repair.
+     */
+    public static PaxosStartPrepareCleanup prepare(TableId tableId, Collection<InetAddressAndPort> endpoints, EndpointState localEpState, Collection<Range<Token>> ranges)
+    {
+        PaxosStartPrepareCleanup callback = new PaxosStartPrepareCleanup(tableId, endpoints);
+        synchronized (callback)
+        {
+            Message<Request> message = Message.out(PAXOS2_CLEANUP_START_PREPARE_REQ, new Request(tableId, localEpState, ranges));
+            for (InetAddressAndPort endpoint : endpoints)
+                MessagingService.instance().sendWithCallback(message, endpoint, callback);
+        }
+        return callback;
+    }
+
+    @Override
+    public void onFailure(InetAddressAndPort from, RequestFailureReason reason)
+    {
+        tryFailure(new PaxosCleanupException("Received " + reason + " failure response from " + from));
+    }
+
+    public synchronized void onResponse(Message<PaxosCleanupHistory> msg)
+    {
+        if (isDone())
+            return;
+
+        if (!waitingResponse.remove(msg.from()))
+            throw new IllegalArgumentException("Received unexpected response from " + msg.from());
+
+        if (Commit.isAfter(msg.payload.highBound, maxBallot))
+            maxBallot = msg.payload.highBound;
+
+        history = PaxosRepairHistory.merge(history, msg.payload.history);
+
+        if (waitingResponse.isEmpty())
+            trySuccess(new PaxosCleanupHistory(table, maxBallot, history));
+    }
+
+    private static void maybeUpdateTopology(InetAddressAndPort endpoint, EndpointState remote)
+    {
+        EndpointState local = Gossiper.instance.getEndpointStateForEndpoint(endpoint);
+        if (local == null || local.isSupersededBy(remote))
+        {
+            logger.trace("updating endpoint info for {} with {}", endpoint, remote);
+            Map<InetAddressAndPort, EndpointState> states = Collections.singletonMap(endpoint, remote);
+
+            Gossiper.runInGossipStageBlocking(() -> {
+                Gossiper.instance.notifyFailureDetector(states);
+                Gossiper.instance.applyStateLocally(states);
+            });
+            // TODO: We should also wait for schema pulls/pushes, however this would be quite an involved change to MigrationManager
+            //       (which currently drops some migration tasks on the floor).
+            //       Note it would be fine for us to fail to complete the migration task and simply treat this response as a failure/timeout.
+        }
+        // even if we have th latest gossip info, wait until pending range calculations are complete
+        PendingRangeCalculatorService.instance.blockUntilFinished();
+    }
+
+    public static class Request
+    {
+        final TableId tableId;
+        final EndpointState epState;
+        final Collection<Range<Token>> ranges;
+
+        public Request(TableId tableId, EndpointState epState, Collection<Range<Token>> ranges)
+        {
+            this.tableId = tableId;
+            this.epState = epState;
+            this.ranges = ranges;
+        }
+    }
+
+    public static class RequestSerializer implements IVersionedSerializer<Request>
+    {
+        public void serialize(Request request, DataOutputPlus out, int version) throws IOException
+        {
+            request.tableId.serialize(out);
+            EndpointState.serializer.serialize(request.epState, out, version);
+            out.writeInt(request.ranges.size());
+            for (Range<Token> rt : request.ranges)
+                AbstractBounds.tokenSerializer.serialize(rt, out, version);
+        }
+
+        public Request deserialize(DataInputPlus in, int version) throws IOException
+        {
+            TableId tableId = TableId.deserialize(in);
+            EndpointState epState = EndpointState.serializer.deserialize(in, version);
+
+            int numRanges = in.readInt();
+            List<Range<Token>> ranges = new ArrayList<>();
+            for (int i = 0; i < numRanges; i++)
+            {
+                Range<Token> range = (Range<Token>) AbstractBounds.tokenSerializer.deserialize(in, DatabaseDescriptor.getPartitioner(), version);
+                ranges.add(range);
+            }
+            return new Request(tableId, epState, ranges);
+        }
+
+        public long serializedSize(Request request, int version)
+        {
+            long size = request.tableId.serializedSize();
+            size += EndpointState.serializer.serializedSize(request.epState, version);
+            size += TypeSizes.sizeof(request.ranges.size());
+            for (Range<Token> range : request.ranges)
+                size += AbstractBounds.tokenSerializer.serializedSize(range, version);
+            return size;
+        }
+    }
+
+    public static final IVerbHandler<Request> verbHandler = in -> {
+        ColumnFamilyStore table = Schema.instance.getColumnFamilyStoreInstance(in.payload.tableId);
+        maybeUpdateTopology(in.from(), in.payload.epState);
+        Ballot highBound = newBallot(ballotTracker().getHighBound(), ConsistencyLevel.SERIAL);
+        PaxosRepairHistory history = table.getPaxosRepairHistoryForRanges(in.payload.ranges);
+        Message<PaxosCleanupHistory> out = in.responseWith(new PaxosCleanupHistory(table.metadata.id, highBound, history));
+        MessagingService.instance().send(out, in.respondTo());
+    };
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosTableRepairs.java b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosTableRepairs.java
new file mode 100644
index 0000000..6da4e0b
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/cleanup/PaxosTableRepairs.java
@@ -0,0 +1,235 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import java.util.ArrayDeque;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.AbstractPaxosRepair;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.PaxosRepair;
+import org.apache.cassandra.utils.NoSpamLogger;
+
+import static org.apache.cassandra.service.paxos.Commit.isAfter;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+/**
+ * Coordinates repairs on a given key to prevent multiple repairs being scheduled for a single key
+ */
+public class PaxosTableRepairs implements AbstractPaxosRepair.Listener
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosTableRepairs.class);
+
+    static class KeyRepair
+    {
+        private final DecoratedKey key;
+
+        private final ArrayDeque<AbstractPaxosRepair> queued = new ArrayDeque<>();
+
+        private KeyRepair(DecoratedKey key)
+        {
+            this.key = key;
+        }
+
+        void onFirst(Predicate<AbstractPaxosRepair> predicate, Consumer<AbstractPaxosRepair> consumer, boolean removeBeforeAction)
+        {
+            while (!queued.isEmpty())
+            {
+                AbstractPaxosRepair repair = queued.peek();
+                if (repair.isComplete())
+                {
+                    queued.remove();
+                    continue;
+                }
+
+                if (predicate.test(repair))
+                {
+                    if (removeBeforeAction)
+                        queued.remove();
+                    consumer.accept(repair);
+                }
+                return;
+            }
+        }
+
+        void clear()
+        {
+            while (!queued.isEmpty())
+                queued.remove().cancelUnexceptionally();
+        }
+
+        AbstractPaxosRepair startOrGetOrQueue(PaxosTableRepairs tableRepairs, DecoratedKey key, Ballot incompleteBallot, ConsistencyLevel consistency, TableMetadata table, Consumer<PaxosRepair.Result> onComplete)
+        {
+            Preconditions.checkArgument(this.key.equals(key));
+
+            if (!queued.isEmpty() && !isAfter(incompleteBallot, queued.peekLast().incompleteBallot()))
+            {
+                queued.peekLast().addListener(onComplete);
+                return queued.peekLast();
+            }
+
+            AbstractPaxosRepair repair = tableRepairs.createRepair(key, incompleteBallot, consistency, table);
+
+            repair.addListener(tableRepairs);
+            repair.addListener(onComplete);
+
+            queued.add(repair);
+            maybeScheduleNext();
+            return repair;
+        }
+
+        @VisibleForTesting
+        AbstractPaxosRepair activeRepair()
+        {
+            return queued.peek();
+        }
+
+        @VisibleForTesting
+        boolean queueContains(AbstractPaxosRepair repair)
+        {
+            return queued.contains(repair);
+        }
+
+        void maybeScheduleNext()
+        {
+            onFirst(repair -> !repair.isStarted(), AbstractPaxosRepair::start, false);
+        }
+
+        void complete(AbstractPaxosRepair repair)
+        {
+            queued.remove(repair);
+            maybeScheduleNext();
+        }
+
+        int pending()
+        {
+            return queued.size();
+        }
+
+        boolean isEmpty()
+        {
+            return queued.isEmpty();
+        }
+    }
+
+    private final Map<DecoratedKey, KeyRepair> keyRepairs = new ConcurrentHashMap<>();
+
+    @VisibleForTesting
+    KeyRepair getKeyRepairUnsafe(DecoratedKey key)
+    {
+        return keyRepairs.get(key);
+    }
+
+    synchronized AbstractPaxosRepair startOrGetOrQueue(DecoratedKey key, Ballot incompleteBallot, ConsistencyLevel consistency, TableMetadata table, Consumer<PaxosRepair.Result> onComplete)
+    {
+        KeyRepair keyRepair = keyRepairs.computeIfAbsent(key, KeyRepair::new);
+        return keyRepair.startOrGetOrQueue(this, key, incompleteBallot, consistency, table, onComplete);
+    }
+
+    public synchronized void onComplete(AbstractPaxosRepair repair, AbstractPaxosRepair.Result result)
+    {
+        KeyRepair keyRepair = keyRepairs.get(repair.partitionKey());
+        if (keyRepair == null)
+        {
+            NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES,
+                             "onComplete callback fired for nonexistant KeyRepair");
+            return;
+        }
+
+        keyRepair.complete(repair);
+        if (keyRepair.queueContains(repair))
+            NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES,
+                             "repair not removed after call to onComplete");
+
+        if (keyRepair.isEmpty())
+            keyRepairs.remove(repair.partitionKey());
+    }
+
+    synchronized void evictHungRepairs(long activeSinceNanos)
+    {
+        Predicate<AbstractPaxosRepair> timeoutPredicate = repair -> repair.startedNanos() - activeSinceNanos < 0;
+        for (KeyRepair repair : keyRepairs.values())
+        {
+            if (repair.isEmpty())
+                NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES,
+                                 "inactive KeyRepair found, this means post-repair cleanup/schedule isn't working properly");
+            repair.onFirst(timeoutPredicate, r -> {
+                logger.warn("cancelling timed out paxos repair: {}", r);
+                r.cancelUnexceptionally();
+            }, true);
+            repair.maybeScheduleNext();
+            if (repair.isEmpty())
+                keyRepairs.remove(repair.key);
+        }
+    }
+
+    synchronized void clear()
+    {
+        for (KeyRepair repair : keyRepairs.values())
+            repair.clear();
+        keyRepairs.clear();
+    }
+
+    @VisibleForTesting
+    synchronized boolean hasActiveRepairs(DecoratedKey key)
+    {
+        return keyRepairs.containsKey(key);
+    }
+
+    AbstractPaxosRepair createRepair(DecoratedKey key, Ballot incompleteBallot, ConsistencyLevel consistency, TableMetadata table)
+    {
+        return PaxosRepair.create(consistency, key, incompleteBallot, table);
+    }
+
+    private static final ConcurrentMap<TableId, PaxosTableRepairs> tableRepairsMap = new ConcurrentHashMap<>();
+
+    static PaxosTableRepairs getForTable(TableId tableId)
+    {
+        return tableRepairsMap.computeIfAbsent(tableId, k -> new PaxosTableRepairs());
+    }
+
+    public static void evictHungRepairs()
+    {
+        long deadline = nanoTime() - TimeUnit.MINUTES.toNanos(5);
+        for (PaxosTableRepairs repairs : tableRepairsMap.values())
+            repairs.evictHungRepairs(deadline);
+    }
+
+    public static void clearRepairs()
+    {
+        for (PaxosTableRepairs repairs : tableRepairsMap.values())
+            repairs.clear();
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosBallotTracker.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosBallotTracker.java
new file mode 100644
index 0000000..41314a2e
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosBallotTracker.java
@@ -0,0 +1,206 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.zip.CRC32;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.service.ClientState;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.RandomAccessReader;
+import org.apache.cassandra.io.util.SequentialWriter;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.Commit;
+
+import static org.apache.cassandra.io.util.SequentialWriterOption.FINISH_ON_CLOSE;
+import static org.apache.cassandra.net.Crc.crc32;
+
+/**
+ * Tracks the highest paxos ballot we've seen, and the lowest ballot we can accept.
+ *
+ * During paxos repair, the coordinator gets the highest ballot seen by each participant. At the end of repair, that
+ * high ballot is set as the new low bound. Combined with paxos repair during topology changes, this eliminates the
+ * possibility of new nodes accepting ballots that are before the most recently accepted ballot for a key.
+ */
+public class PaxosBallotTracker
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosBallotTracker.class);
+
+    private static final int FILE_VERSION = 0;
+    static final String FNAME = "ballot.meta";
+    private static final String TMP_FNAME = FNAME + ".tmp";
+
+    private final File directory;
+    private final AtomicReference<Ballot> highBound;
+    private volatile Ballot lowBound;
+
+    private PaxosBallotTracker(File directory, Ballot highBound, Ballot lowBound)
+    {
+        Preconditions.checkNotNull(lowBound);
+        Preconditions.checkNotNull(highBound);
+        this.directory = directory;
+        this.highBound = new AtomicReference<>(highBound);
+        this.lowBound = lowBound;
+    }
+
+    private static void serializeBallot(SequentialWriter writer, CRC32 crc, Ballot ballot) throws IOException
+    {
+        ByteBuffer bytes = ballot.toBytes();
+        writer.write(bytes);
+        crc.update(bytes);
+    }
+
+    private static Ballot deserializeBallot(RandomAccessReader reader, CRC32 crc, byte[] bytes) throws IOException
+    {
+        reader.readFully(bytes);
+        crc.update(bytes);
+        return Ballot.deserialize(ByteBuffer.wrap(bytes));
+    }
+
+    public static void truncate(File directory) throws IOException
+    {
+        logger.info("truncating paxos ballot metadata in {}", directory);
+        deleteIfExists(new File(directory, TMP_FNAME));
+        deleteIfExists(new File(directory, FNAME));
+    }
+
+    public static PaxosBallotTracker load(File directory) throws IOException
+    {
+        deleteIfExists(new File(directory, TMP_FNAME));
+
+        File file = new File(directory, FNAME);
+        if (!file.exists())
+            return new PaxosBallotTracker(directory, Ballot.none(), Ballot.none());
+
+        try (RandomAccessReader reader = RandomAccessReader.open(file))
+        {
+            int version = reader.readInt();
+            if (version != FILE_VERSION)
+                throw new IOException("Unsupported ballot file version: " + version);
+
+            byte[] bytes = new byte[16];
+            CRC32 crc = crc32();
+            Ballot highBallot = deserializeBallot(reader, crc, bytes);
+            Ballot lowBallot = deserializeBallot(reader, crc, bytes);
+            int checksum = Integer.reverseBytes(reader.readInt());
+            if (!reader.isEOF() || (int) crc.getValue() != checksum)
+                throw new IOException("Ballot file corrupted");
+
+            return new PaxosBallotTracker(directory, highBallot, lowBallot);
+        }
+    }
+
+    private static void deleteIfExists(File file)
+    {
+        if (file.exists())
+            file.delete();
+    }
+
+    public synchronized void flush() throws IOException
+    {
+        File file = new File(directory, TMP_FNAME);
+        deleteIfExists(file);
+
+        try(SequentialWriter writer = new SequentialWriter(file, FINISH_ON_CLOSE))
+        {
+            CRC32 crc = crc32();
+            writer.writeInt(FILE_VERSION);
+            serializeBallot(writer, crc, getHighBound());
+            serializeBallot(writer, crc, getLowBound());
+            writer.writeInt(Integer.reverseBytes((int) crc.getValue()));
+        }
+        file.move(new File(directory, FNAME));
+    }
+
+    public synchronized void truncate()
+    {
+        deleteIfExists(new File(directory, TMP_FNAME));
+        deleteIfExists(new File(directory, FNAME));
+        highBound.set(Ballot.none());
+        lowBound = Ballot.none();
+    }
+
+    private void updateHighBound(Ballot current, Ballot next)
+    {
+        while (Commit.isAfter(next, current) && !highBound.compareAndSet(current, next))
+            current = highBound.get();
+    }
+
+    void updateHighBound(Ballot next)
+    {
+        updateHighBound(highBound.get(), next);
+    }
+
+    public void onUpdate(Row row)
+    {
+        Ballot current = highBound.get();
+        Ballot next = PaxosRows.getHighBallot(row, current);
+        if (current == next)
+            return;
+
+        updateHighBound(current, next);
+    }
+
+    @VisibleForTesting
+    void updateHighBoundUnsafe(Ballot expected, Ballot update)
+    {
+        highBound.compareAndSet(expected, update);
+    }
+
+    public File getDirectory()
+    {
+        return directory;
+    }
+
+    public synchronized void updateLowBound(Ballot update) throws IOException
+    {
+        if (!Commit.isAfter(update, lowBound))
+        {
+            logger.debug("Not updating lower bound with earlier or equal ballot from {} to {}", lowBound, update);
+            return;
+        }
+
+        logger.debug("Updating lower bound from {} to {}", lowBound, update);
+        ClientState.getTimestampForPaxos(lowBound.unixMicros());
+        lowBound = update;
+        flush();
+    }
+
+    public Ballot getHighBound()
+    {
+        return highBound.get();
+    }
+
+    /**
+     * @return a unique ballot that has never been proposed, below which we will reject all proposals
+     */
+    public Ballot getLowBound()
+    {
+        return lowBound;
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosKeyState.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosKeyState.java
new file mode 100644
index 0000000..c55269a
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosKeyState.java
@@ -0,0 +1,168 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.Objects;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+import com.google.common.primitives.Longs;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.MergeIterator;
+
+public class PaxosKeyState implements UncommittedPaxosKey
+{
+    static final Comparator<PaxosKeyState> KEY_COMPARATOR = Comparator.comparing(o -> o.key);
+    static final Comparator<PaxosKeyState> BALLOT_COMPARATOR = (o1, o2) -> Longs.compare(o1.ballot.uuidTimestamp(), o2.ballot.uuidTimestamp());
+
+    final TableId tableId;
+    final DecoratedKey key;
+    final Ballot ballot;
+    final boolean committed;
+
+    public PaxosKeyState(TableId tableId, DecoratedKey key, Ballot ballot, boolean committed)
+    {
+        Preconditions.checkNotNull(tableId);
+        Preconditions.checkNotNull(ballot);
+        this.tableId = tableId;
+        this.key = key;
+        this.ballot = ballot;
+        this.committed = committed;
+    }
+
+    public DecoratedKey getKey()
+    {
+        return key;
+    }
+
+    public ConsistencyLevel getConsistencyLevel()
+    {
+        switch (ballot.flag())
+        {
+            default: throw new IllegalStateException();
+            case GLOBAL: return ConsistencyLevel.SERIAL;
+            case LOCAL: return ConsistencyLevel.LOCAL_SERIAL;
+            case NONE: return null;
+        }
+    }
+
+    @Override
+    public Ballot ballot()
+    {
+        return ballot;
+    }
+
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        PaxosKeyState that = (PaxosKeyState) o;
+        return committed == that.committed &&
+               Objects.equals(key, that.key) &&
+               Objects.equals(ballot, that.ballot);
+    }
+
+    public int hashCode()
+    {
+        return Objects.hash(key, ballot, committed);
+    }
+
+    public String toString()
+    {
+        return "BallotState{" +
+               "tableId=" + tableId +
+               ", key=" + key +
+               ", ballot=" + ballot +
+               ", committed=" + committed +
+               '}';
+    }
+
+    static PaxosKeyState merge(PaxosKeyState left, PaxosKeyState right)
+    {
+        if (left == null)
+            return right;
+
+        if (right == null)
+            return left;
+
+        int cmp = BALLOT_COMPARATOR.compare(left, right);
+
+        // prefer committed operations if the ballots are the same so they can be filtered out later
+        if (cmp == 0)
+            return left.committed ? left : right;
+        else
+            return cmp > 0 ? left : right;
+    }
+
+    static class Reducer extends MergeIterator.Reducer<PaxosKeyState, PaxosKeyState>
+    {
+        private PaxosKeyState mostRecent = null;
+
+        public void reduce(int idx, PaxosKeyState current)
+        {
+            mostRecent = merge(mostRecent, current);
+        }
+
+        protected PaxosKeyState getReduced()
+        {
+            return mostRecent;
+        }
+
+        protected void onKeyChange()
+        {
+            super.onKeyChange();
+            mostRecent = null;
+        }
+    }
+
+    public static CloseableIterator<PaxosKeyState> mergeUncommitted(CloseableIterator<PaxosKeyState>... iterators)
+    {
+        return MergeIterator.get(Lists.newArrayList(iterators), PaxosKeyState.KEY_COMPARATOR, new Reducer());
+    }
+
+    public static CloseableIterator<UncommittedPaxosKey> toUncommittedInfo(CloseableIterator<PaxosKeyState> iter)
+    {
+        Iterator<PaxosKeyState> filtered = Iterators.filter(iter, k -> !k.committed);
+        return new CloseableIterator<UncommittedPaxosKey>()
+        {
+            public void close()
+            {
+                iter.close();
+            }
+
+            public boolean hasNext()
+            {
+                return filtered.hasNext();
+            }
+
+            public UncommittedPaxosKey next()
+            {
+                return filtered.next();
+            }
+        };
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosRows.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosRows.java
new file mode 100644
index 0000000..8bdbdf7
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosRows.java
@@ -0,0 +1,359 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import javax.annotation.Nullable;
+
+import com.google.common.collect.Lists;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.db.marshal.UUIDType;
+import org.apache.cassandra.db.marshal.ValueAccessor;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.DeserializationHelper;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.exceptions.UnknownTableException;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.Commit.Accepted;
+import org.apache.cassandra.service.paxos.Commit.AcceptedWithTTL;
+import org.apache.cassandra.service.paxos.Commit.Committed;
+import org.apache.cassandra.service.paxos.Commit.CommittedWithTTL;
+import org.apache.cassandra.utils.AbstractIterator;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.JVMStabilityInspector;
+
+import static org.apache.cassandra.db.partitions.PartitionUpdate.PartitionUpdateSerializer.*;
+import static org.apache.cassandra.service.paxos.Commit.isAfter;
+import static org.apache.cassandra.service.paxos.Commit.latest;
+
+@SuppressWarnings({ "unchecked", "rawtypes" })
+public class PaxosRows
+{
+    private static final ColumnMetadata WRITE_PROMISE = paxosColumn("in_progress_ballot", TimeUUIDType.instance);
+    private static final ColumnMetadata READ_PROMISE = paxosColumn("in_progress_read_ballot", TimeUUIDType.instance);
+    private static final ColumnMetadata PROPOSAL = paxosColumn("proposal_ballot", TimeUUIDType.instance);
+    private static final ColumnMetadata PROPOSAL_UPDATE = paxosColumn("proposal", BytesType.instance);
+    private static final ColumnMetadata PROPOSAL_VERSION = paxosColumn("proposal_version", Int32Type.instance);
+    private static final ColumnMetadata COMMIT = paxosColumn("most_recent_commit_at", TimeUUIDType.instance);
+    private static final ColumnMetadata COMMIT_UPDATE = paxosColumn("most_recent_commit", BytesType.instance);
+    private static final ColumnMetadata COMMIT_VERSION = paxosColumn("most_recent_commit_version", Int32Type.instance);
+
+    private PaxosRows() {}
+
+    private static ColumnMetadata paxosColumn(String name, AbstractType<?> type)
+    {
+        return ColumnMetadata.regularColumn(SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.PAXOS, name, type);
+    }
+
+    public static Ballot getPromise(Row row)
+    {
+        return getBallot(row, READ_PROMISE, Ballot.none());
+    }
+
+    public static Ballot getWritePromise(Row row)
+    {
+        return getBallot(row, WRITE_PROMISE, Ballot.none());
+    }
+
+    public static Accepted getAccepted(Row row)
+    {
+        Cell ballotCell = row.getCell(PROPOSAL);
+        if (ballotCell == null)
+            return null;
+
+        Ballot ballot = ballotCell.accessor().toBallot(ballotCell.value());
+        int version = getInt(row, PROPOSAL_VERSION, MessagingService.VERSION_30);
+        PartitionUpdate update = getUpdate(row, PROPOSAL_UPDATE, version);
+        return ballotCell.isExpiring()
+               ? new AcceptedWithTTL(ballot, update, ballotCell.localDeletionTime())
+               : new Accepted(ballot, update);
+    }
+
+    public static Committed getCommitted(TableMetadata metadata, DecoratedKey partitionKey, Row row)
+    {
+        Cell ballotCell = row.getCell(COMMIT);
+        if (ballotCell == null)
+            return Committed.none(partitionKey, metadata);
+
+        Ballot ballot = ballotCell.accessor().toBallot(ballotCell.value());
+        int version = getInt(row, COMMIT_VERSION, MessagingService.VERSION_30);
+        PartitionUpdate update = getUpdate(row, COMMIT_UPDATE, version);
+        return ballotCell.isExpiring()
+               ? new CommittedWithTTL(ballot, update, ballotCell.localDeletionTime())
+               : new Committed(ballot, update);
+    }
+
+    public static TableId getTableId(Row row)
+    {
+        return TableId.fromUUID(UUIDType.instance.compose(row.clustering().get(0), (ValueAccessor)row.clustering().accessor()));
+    }
+
+    public static UUID getTableUuid(Row row)
+    {
+        return UUIDType.instance.compose(row.clustering().get(0), (ValueAccessor)row.clustering().accessor());
+    }
+
+    private static int getInt(Row row, ColumnMetadata cmeta, @SuppressWarnings("SameParameterValue") int ifNull)
+    {
+        Cell cell = row.getCell(cmeta);
+        if (cell == null)
+            return ifNull;
+        return Int32Type.instance.compose(cell.value(), cell.accessor());
+    }
+
+    private static PartitionUpdate getUpdate(Row row, ColumnMetadata cmeta, int version)
+    {
+        Cell cell = row.getCell(cmeta);
+        if (cell == null)
+            throw new IllegalStateException();
+        try
+        {
+            return PartitionUpdate.fromBytes(cell.buffer(), version);
+        }
+        catch (RuntimeException e)
+        {
+            // the legacy behaviors of not deleting proposal_version along with proposal and proposal_ballot on commit,
+            // and accepting proposals younger than the most recent commit combined with the right sequence of tombstone
+            // purging and retention over a few compactions can result in 3.x format proposals without a proposal version
+            // value, causing deserialization to fail when looking up the table. So here we detect that and attempt to
+            // deserialize with the current version
+            if (e.getCause() instanceof UnknownTableException && version == MessagingService.VERSION_30)
+                return PartitionUpdate.fromBytes(cell.buffer(), MessagingService.current_version);
+
+            throw e;
+        }
+    }
+
+    private static Ballot getBallot(Row row, ColumnMetadata cmeta)
+    {
+        return getBallot(row, cmeta, null);
+    }
+
+    private static Ballot getBallot(Row row, ColumnMetadata cmeta, Ballot ifNull)
+    {
+        Cell cell = row.getCell(cmeta);
+        if (cell == null)
+            return ifNull;
+        return cell.accessor().toBallot(cell.value());
+    }
+
+    private static boolean proposalIsEmpty(Row row, DecoratedKey key)
+    {
+        try
+        {
+            Cell proposalVersionCell = row.getCell(PROPOSAL_VERSION);
+            if (proposalVersionCell == null)
+                return true;
+            Integer proposalVersion = Int32Type.instance.compose(proposalVersionCell.value(), proposalVersionCell.accessor());
+            if (proposalVersion == null)
+                return true;
+
+            Cell proposal = row.getCell(PROPOSAL_UPDATE);
+            if (proposal == null)
+                return true;
+
+            ByteBuffer proposalValue = proposal.buffer();
+            if (!proposalValue.hasRemaining())
+                return true;
+
+            return isEmpty(proposalValue, DeserializationHelper.Flag.LOCAL, key);
+        }
+        catch (IOException e)
+        {
+            JVMStabilityInspector.inspectThrowable(e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static long getTimestamp(Row row, ColumnMetadata cmeta)
+    {
+        Cell cell = row.getCell(cmeta);
+        if (cell == null || cell.valueSize() == 0)
+            return Long.MIN_VALUE;
+        return cell.timestamp();
+    }
+
+    static PaxosKeyState getCommitState(DecoratedKey key, Row row, TableId targetTableId)
+    {
+        if (row == null)
+            return null;
+
+        UUID tableUuid = getTableUuid(row);
+        if (targetTableId != null && !targetTableId.asUUID().equals(tableUuid))
+            return null;
+
+        Ballot promise = latest(getBallot(row, WRITE_PROMISE), getBallot(row, READ_PROMISE));
+        Ballot proposal = getBallot(row, PROPOSAL);
+        Ballot commit = getBallot(row, COMMIT);
+
+        Ballot inProgress = null;
+        Ballot committed = null;
+        if (isAfter(promise, proposal))
+        {
+            if (isAfter(promise, commit))
+                inProgress = promise;
+            else
+                committed = commit;
+        }
+        else if (isAfter(proposal, commit))
+        {
+            if (proposalIsEmpty(row, key))
+                committed = proposal;
+            else
+                inProgress = proposal;
+        }
+        else
+        {
+            committed = commit;
+        }
+
+        TableId tableId = TableId.fromUUID(tableUuid);
+        return inProgress != null ?
+               new PaxosKeyState(tableId, key, inProgress, false) :
+               new PaxosKeyState(tableId, key, committed, true);
+    }
+
+    private static class PaxosMemtableToKeyStateIterator extends AbstractIterator<PaxosKeyState> implements CloseableIterator<PaxosKeyState>
+    {
+        private final UnfilteredPartitionIterator partitions;
+        private UnfilteredRowIterator partition;
+        private final @Nullable TableId filterByTableId; // if unset, return records for all tables
+
+        private PaxosMemtableToKeyStateIterator(UnfilteredPartitionIterator partitions, TableId filterByTableId)
+        {
+            this.partitions = partitions;
+            this.filterByTableId = filterByTableId;
+        }
+
+        protected PaxosKeyState computeNext()
+        {
+            while (true)
+            {
+                if (partition != null && partition.hasNext())
+                {
+                    PaxosKeyState commitState = PaxosRows.getCommitState(partition.partitionKey(),
+                                                                         (Row) partition.next(),
+                                                                         filterByTableId);
+                    if (commitState == null)
+                        continue;
+
+                    return commitState;
+                }
+                else if (partition != null)
+                {
+                    partition.close();
+                    partition = null;
+                }
+
+                if (partitions.hasNext())
+                {
+                    partition = partitions.next();
+                }
+                else
+                {
+                    partitions.close();
+                    return endOfData();
+                }
+            }
+        }
+
+        public void close()
+        {
+            if (partition != null)
+                partition.close();
+            partitions.close();
+        }
+    }
+
+    static CloseableIterator<PaxosKeyState> toIterator(UnfilteredPartitionIterator partitions, TableId filterBytableId, boolean materializeLazily)
+    {
+        CloseableIterator<PaxosKeyState> iter = new PaxosMemtableToKeyStateIterator(partitions, filterBytableId);
+        if (materializeLazily)
+            return iter;
+
+        try
+        {
+            // eagerly materialize key states for repairs so we're not referencing memtables for the entire repair
+            return CloseableIterator.wrap(Lists.newArrayList(iter).iterator());
+        }
+        finally
+        {
+            iter.close();
+        }
+    }
+
+    public static Ballot getHighBallot(Row row, Ballot current)
+    {
+        long maxUnixMicros = current != null ? current.unixMicros() : Long.MIN_VALUE;
+        ColumnMetadata maxCol = null;
+
+        long inProgressRead = getTimestamp(row, READ_PROMISE);
+        if (inProgressRead > maxUnixMicros)
+        {
+            maxUnixMicros = inProgressRead;
+            maxCol = READ_PROMISE;
+        }
+
+        long inProgressWrite = getTimestamp(row, WRITE_PROMISE);
+        if (inProgressWrite > maxUnixMicros)
+        {
+            maxUnixMicros = inProgressWrite;
+            maxCol = WRITE_PROMISE;
+        }
+
+        long proposal = getTimestamp(row, PROPOSAL);
+        if (proposal > maxUnixMicros)
+        {
+            maxUnixMicros = proposal;
+            maxCol = PROPOSAL;
+        }
+
+        long commit = getTimestamp(row, COMMIT);
+        if (commit > maxUnixMicros)
+            maxCol = COMMIT;
+
+        return maxCol == null ? current : getBallot(row, maxCol);
+    }
+
+    public static boolean hasBallotBeforeOrEqualTo(Row row, Ballot ballot)
+    {
+        return !Commit.isAfter(ballot, getBallot(row, WRITE_PROMISE))
+            && !Commit.isAfter(ballot, getBallot(row, READ_PROMISE))
+            && !Commit.isAfter(ballot, getBallot(row, PROPOSAL))
+            && !Commit.isAfter(ballot, getBallot(row, COMMIT));
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTracker.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTracker.java
new file mode 100644
index 0000000..d3594b3
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTracker.java
@@ -0,0 +1,322 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+import com.google.common.base.Preconditions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.statements.SelectStatement;
+import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.ReadExecutionController;
+import org.apache.cassandra.db.ReadQuery;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.ListType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.RowIterator;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.apache.cassandra.db.SystemKeyspace.PAXOS_REPAIR_HISTORY;
+import static org.apache.cassandra.schema.SchemaConstants.SYSTEM_KEYSPACE_NAME;
+
+/**
+ * Tracks uncommitted and ballot high/low bounds
+ */
+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";
+
+    private static boolean skipRebuild()
+    {
+        return Boolean.getBoolean(SKIP_REBUILD_PROP);
+    }
+
+    private static boolean forceRebuild()
+    {
+        return Boolean.getBoolean(FORCE_REBUILD_PROP);
+    }
+
+    private static boolean truncateBallotMetadata()
+    {
+        return Boolean.getBoolean(TRUNCATE_BALLOT_METADATA_PROP);
+    }
+
+    private static final String DIRECTORY = "system/_paxos_repair_state";
+
+    private final PaxosUncommittedTracker uncommitted;
+    private final PaxosBallotTracker ballots;
+    private boolean rebuildNeeded;
+
+    public PaxosStateTracker(PaxosUncommittedTracker uncommitted, PaxosBallotTracker ballots, boolean rebuildNeeded)
+    {
+        this.uncommitted = uncommitted;
+        this.ballots = ballots;
+        this.rebuildNeeded = rebuildNeeded;
+    }
+
+    public boolean isRebuildNeeded()
+    {
+        return rebuildNeeded;
+    }
+
+    static File stateDirectory(File dataDirectory)
+    {
+        return new File(dataDirectory, DIRECTORY);
+    }
+
+    public static PaxosStateTracker create(File[] directories) throws IOException
+    {
+        File stateDirectory = null;
+        boolean hasExistingData = false;
+
+        for (File directory : directories)
+        {
+            File candidate = stateDirectory(directory);
+            if (candidate.exists() && new File(candidate, PaxosBallotTracker.FNAME).exists())
+            {
+                Preconditions.checkState(!hasExistingData,
+                                         "Multiple paxos repair metadata directories found (%s, %s), remove the older directory and restart.",
+                                         stateDirectory, candidate);
+                hasExistingData = true;
+                stateDirectory = candidate;
+            }
+        }
+
+        if (stateDirectory == null)
+            stateDirectory = stateDirectory(directories[0]);
+
+        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);
+
+        if (rebuildNeeded)
+        {
+            if (stateDirectory.exists())
+            {
+                PaxosUncommittedTracker.truncate(stateDirectory);
+                if (truncateBallotMetadata())
+                    PaxosBallotTracker.truncate(stateDirectory);
+            }
+            else
+            {
+                stateDirectory.createDirectoriesIfNotExists();
+            }
+        }
+
+        PaxosUncommittedTracker uncommitted = PaxosUncommittedTracker.load(stateDirectory);
+        PaxosBallotTracker ballots = PaxosBallotTracker.load(stateDirectory);
+
+        if (!rebuildNeeded)
+            uncommitted.start();
+
+        return new PaxosStateTracker(uncommitted, ballots, rebuildNeeded);
+    }
+
+    public static PaxosStateTracker create(Directories.DataDirectories dataDirectories) throws IOException
+    {
+        return create(dataDirectories.getAllDirectories().stream().map(d -> d.location).toArray(File[]::new));
+    }
+
+    @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");
+
+        String queryStr = "SELECT * FROM " + SYSTEM_KEYSPACE_NAME + '.' + SystemKeyspace.PAXOS;
+        SelectStatement stmt = (SelectStatement) QueryProcessor.parseStatement(queryStr).prepare(ClientState.forInternalCalls());
+        ReadQuery query = stmt.getQuery(QueryOptions.DEFAULT, FBUtilities.nowInSeconds());
+        try (ReadExecutionController controller = query.executionController();
+             PartitionIterator partitions = query.executeInternal(controller);
+             PaxosKeyStateRowsIterator rows = new PaxosKeyStateRowsIterator(partitions))
+        {
+            uncommitted.rebuild(rows);
+        }
+    }
+
+    class PaxosKeyStateRowsIterator implements CloseableIterator<PaxosKeyState>
+    {
+        // note: this is not closed by this iterator
+        final PartitionIterator partitions;
+
+        RowIterator partition = null;
+        PaxosKeyState next = null;
+
+        PaxosKeyStateRowsIterator(PartitionIterator partitions)
+        {
+            this.partitions = partitions;
+        }
+
+        @Override
+        public boolean hasNext()
+        {
+            if (next != null)
+                return true;
+
+            while (true)
+            {
+                if (partition != null && partition.hasNext())
+                {
+                    PaxosKeyState commitState = PaxosRows.getCommitState(partition.partitionKey(), partition.next(), null);
+                    if (commitState == null)
+                        continue;
+                    ballots.updateHighBound(commitState.ballot);
+                    if (!commitState.committed)
+                    {
+                        next = commitState;
+                        return true;
+                    }
+                }
+                else
+                {
+                    if (partition != null)
+                    {
+                        partition.close();
+                        partition = null;
+                    }
+
+                    if (!partitions.hasNext())
+                        return false;
+
+                    partition = partitions.next();
+                }
+            }
+        }
+
+        @Override
+        public PaxosKeyState next()
+        {
+            if (next == null && !hasNext())
+                throw new NoSuchElementException();
+            PaxosKeyState next = this.next;
+            this.next = null;
+            return next;
+        }
+
+        @Override
+        public void close()
+        {
+            if (partition != null)
+            {
+                partition.close();
+                partition = null;
+            }
+        }
+    }
+
+    private void updateLowBoundFromRepairHistory() throws IOException
+    {
+        String queryStr = "SELECT * FROM " + SYSTEM_KEYSPACE_NAME + '.' + PAXOS_REPAIR_HISTORY;
+        SelectStatement stmt = (SelectStatement) QueryProcessor.parseStatement(queryStr).prepare(ClientState.forInternalCalls());
+        ReadQuery query = stmt.getQuery(QueryOptions.DEFAULT, FBUtilities.nowInSeconds());
+
+        Ballot lowBound = null;
+        ListType<ByteBuffer> listType = ListType.getInstance(BytesType.instance, false);
+        ColumnMetadata pointsColumn = ColumnMetadata.regularColumn(SYSTEM_KEYSPACE_NAME, PAXOS_REPAIR_HISTORY, "points", listType);
+        try (ReadExecutionController controller = query.executionController(); PartitionIterator partitions = query.executeInternal(controller))
+        {
+            while (partitions.hasNext())
+            {
+                try (RowIterator partition = partitions.next())
+                {
+                    String keyspaceName = UTF8Type.instance.compose(partition.partitionKey().getKey());
+                    if (Schema.instance.getKeyspaceMetadata(keyspaceName) == null)
+                        continue;
+
+                    Keyspace.open(keyspaceName);
+                    while (partition.hasNext())
+                    {
+                        Row row = partition.next();
+                        Clustering clustering = row.clustering();
+                        String tableName = UTF8Type.instance.compose(clustering.get(0), clustering.accessor());
+                        if (Schema.instance.getTableMetadata(keyspaceName, tableName) == null)
+                            continue;
+
+                        Cell pointsCell = row.getCell(pointsColumn);
+                        List<ByteBuffer> points = listType.compose(pointsCell.value(), pointsCell.accessor());
+                        PaxosRepairHistory history = PaxosRepairHistory.fromTupleBufferList(points);
+                        lowBound = Commit.latest(lowBound, history.maxLowBound());
+                    }
+                }
+            }
+        }
+        ballots.updateLowBound(lowBound);
+    }
+
+    public void maybeRebuild() throws IOException
+    {
+        if (!rebuildNeeded)
+            return;
+
+        if (truncateBallotMetadata())
+        {
+            logger.info("Truncating {}.{}", SYSTEM_KEYSPACE_NAME, PAXOS_REPAIR_HISTORY);
+            Keyspace.open(SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(PAXOS_REPAIR_HISTORY).truncateBlocking();
+        }
+
+        if (!skipRebuild())
+        {
+            rebuildUncommittedData();
+
+            if (!truncateBallotMetadata()) // no point doing this if we just truncated the repair history table
+                updateLowBoundFromRepairHistory();
+            logger.info("Uncommitted paxos data rebuild completed");
+        }
+        uncommitted.start();
+        ballots.flush();   // explicitly flush since a missing ballot file on startup indicates a rebuild is needed
+        rebuildNeeded = false;
+    }
+
+    public PaxosUncommittedTracker uncommitted()
+    {
+        return uncommitted;
+    }
+
+    public PaxosBallotTracker ballots()
+    {
+        return ballots;
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedIndex.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedIndex.java
new file mode 100644
index 0000000..5e3b540
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedIndex.java
@@ -0,0 +1,266 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.util.*;
+import java.util.concurrent.Callable;
+import java.util.function.BiFunction;
+import java.util.stream.Collectors;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.Callables;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.Operator;
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.filter.RowFilter;
+import org.apache.cassandra.db.lifecycle.View;
+import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.partitions.*;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.index.Index;
+import org.apache.cassandra.index.IndexRegistry;
+import org.apache.cassandra.index.transactions.IndexTransaction;
+import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.IndexMetadata;
+import org.apache.cassandra.schema.Indexes;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.utils.CloseableIterator;
+
+import static java.util.Collections.*;
+import static org.apache.cassandra.schema.SchemaConstants.SYSTEM_KEYSPACE_NAME;
+import static org.apache.cassandra.service.paxos.PaxosState.ballotTracker;
+import static org.apache.cassandra.service.paxos.PaxosState.uncommittedTracker;
+
+/**
+ * A 2i implementation made specifically for system.paxos that listens for changes to paxos state by interpreting
+ * mutations against system.paxos and updates the uncommitted tracker accordingly.
+ *
+ * No read expressions are supported by the index.
+ *
+ * This is implemented as a 2i so it can piggy back off the commit log and paxos table flushes, and avoid worrying
+ * about implementing a parallel log/flush system for the tracker and potential bugs there. It also means we don't
+ * have to worry about cases where the tracker can become out of sync with the paxos table due to failure/edge cases
+ * outside of the PaxosTableState class itself.
+ */
+public class PaxosUncommittedIndex implements Index, PaxosUncommittedTracker.UpdateSupplier
+{
+    public final ColumnFamilyStore baseCfs;
+    protected IndexMetadata metadata;
+
+    private static final DataRange FULL_RANGE = DataRange.allData(DatabaseDescriptor.getPartitioner());
+    private final ColumnFilter memtableColumnFilter;
+
+    public PaxosUncommittedIndex(ColumnFamilyStore baseTable, IndexMetadata metadata)
+    {
+        Preconditions.checkState(baseTable.metadata.keyspace.equals(SYSTEM_KEYSPACE_NAME));
+        Preconditions.checkState(baseTable.metadata.name.equals(SystemKeyspace.PAXOS));
+
+        this.baseCfs = baseTable;
+        this.metadata = metadata;
+
+        this.memtableColumnFilter = ColumnFilter.all(baseTable.metadata.get());
+        PaxosUncommittedTracker.unsafSetUpdateSupplier(this);
+    }
+
+    public static IndexMetadata indexMetadata()
+    {
+        Map<String, String> options = new HashMap<>();
+        options.put("class_name", PaxosUncommittedIndex.class.getName());
+        options.put("target", "");
+        return IndexMetadata.fromSchemaMetadata("PaxosUncommittedIndex", IndexMetadata.Kind.CUSTOM, options);
+    }
+
+    public static Indexes indexes()
+    {
+        return Indexes.builder().add(indexMetadata()).build();
+    }
+
+    public Callable<?> getInitializationTask()
+    {
+        return Callables.returning(null);
+    }
+
+    public IndexMetadata getIndexMetadata()
+    {
+        return metadata;
+    }
+
+    public Callable<?> getMetadataReloadTask(IndexMetadata indexMetadata)
+    {
+        return Callables.returning(null);
+    }
+
+    public void register(IndexRegistry registry)
+    {
+        registry.registerIndex(this);
+    }
+
+    public Optional<ColumnFamilyStore> getBackingTable()
+    {
+        return Optional.empty();
+    }
+
+    private CloseableIterator<PaxosKeyState> getPaxosUpdates(List<UnfilteredPartitionIterator> iterators, TableId filterByTableId, boolean materializeLazily)
+    {
+        Preconditions.checkArgument((filterByTableId == null) == materializeLazily);
+
+        return PaxosRows.toIterator(UnfilteredPartitionIterators.merge(iterators, UnfilteredPartitionIterators.MergeListener.NOOP), filterByTableId, materializeLazily);
+    }
+
+    public CloseableIterator<PaxosKeyState> repairIterator(TableId tableId, Collection<Range<Token>> ranges)
+    {
+        Preconditions.checkNotNull(tableId);
+
+        View view = baseCfs.getTracker().getView();
+        List<Memtable> memtables = view.flushingMemtables.isEmpty()
+                                   ? view.liveMemtables
+                                   : ImmutableList.<Memtable>builder().addAll(view.flushingMemtables).addAll(view.liveMemtables).build();
+
+        List<DataRange> dataRanges = ranges.stream().map(DataRange::forTokenRange).collect(Collectors.toList());
+        List<UnfilteredPartitionIterator> iters = new ArrayList<>(memtables.size() * ranges.size());
+
+        for (int j=0, jsize=dataRanges.size(); j<jsize; j++)
+        {
+            for (int i=0, isize=memtables.size(); i<isize; i++)
+                iters.add(memtables.get(i).partitionIterator(memtableColumnFilter, dataRanges.get(j), SSTableReadsListener.NOOP_LISTENER));
+        }
+
+        return getPaxosUpdates(iters, tableId, false);
+    }
+
+    public CloseableIterator<PaxosKeyState> flushIterator(Memtable flushing)
+    {
+        List<UnfilteredPartitionIterator> iters = singletonList(flushing.partitionIterator(memtableColumnFilter, FULL_RANGE, SSTableReadsListener.NOOP_LISTENER));
+        return getPaxosUpdates(iters, null, true);
+    }
+
+    public Callable<?> getBlockingFlushTask()
+    {
+        return (Callable<Object>) () -> {
+            ballotTracker().flush();
+            return null;
+        };
+    }
+
+    public Callable<?> getBlockingFlushTask(Memtable paxos)
+    {
+        return (Callable<Object>) () -> {
+            uncommittedTracker().flushUpdates(paxos);
+            ballotTracker().flush();
+            return null;
+        };
+    }
+
+    public Callable<?> getInvalidateTask()
+    {
+        return (Callable<Object>) () -> {
+            uncommittedTracker().truncate();
+            ballotTracker().truncate();
+            return null;
+        };
+    }
+
+    public Callable<?> getTruncateTask(long truncatedAt)
+    {
+        return (Callable<Object>) () -> {
+            uncommittedTracker().truncate();
+            ballotTracker().truncate();
+            return null;
+        };
+    }
+
+    public boolean shouldBuildBlocking()
+    {
+        return false;
+    }
+
+    public boolean dependsOn(ColumnMetadata column)
+    {
+        return false;
+    }
+
+    public boolean supportsExpression(ColumnMetadata column, Operator operator)
+    {
+        // should prevent this from ever being used
+        return false;
+    }
+
+    public AbstractType<?> customExpressionValueType()
+    {
+        return null;
+    }
+
+    public RowFilter getPostIndexQueryFilter(RowFilter filter)
+    {
+        return null;
+    }
+
+    public long getEstimatedResultRows()
+    {
+        return 0;
+    }
+
+    public void validate(PartitionUpdate update) throws InvalidRequestException
+    {
+
+    }
+
+    public Indexer indexerFor(DecoratedKey key, RegularAndStaticColumns columns, int nowInSec, WriteContext ctx, IndexTransaction.Type transactionType)
+    {
+        return indexer;
+    }
+
+    public BiFunction<PartitionIterator, ReadCommand, PartitionIterator> postProcessorFor(ReadCommand command)
+    {
+        return null;
+    }
+
+    public Searcher searcherFor(ReadCommand command)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    private final Indexer indexer = new Indexer()
+    {
+        public void begin() {}
+        public void partitionDelete(DeletionTime deletionTime) {}
+        public void rangeTombstone(RangeTombstone tombstone) {}
+
+        public void insertRow(Row row)
+        {
+            ballotTracker().onUpdate(row);
+        }
+
+        public void updateRow(Row oldRowData, Row newRowData)
+        {
+            ballotTracker().onUpdate(newRowData);
+        }
+
+        public void removeRow(Row row) {}
+        public void finish() {}
+    };
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTracker.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTracker.java
new file mode 100644
index 0000000..7712c79
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTracker.java
@@ -0,0 +1,377 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.io.util.FileUtils;
+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.DatabaseDescriptor.paxosRepairEnabled;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosKeyState.mergeUncommitted;
+
+/**
+ * Tracks uncommitted paxos operations to enable operation completion as part of repair by returning an iterator of
+ * partition keys with uncommitted paxos operations (and their consistency levels) for a given table and token range(s)
+ *
+ * There are 2 parts to the uncommitted states it tracks: operations flushed to disk, and updates still in memory. This
+ * class handles merging these two sources for queries and for merging states as part of flush. In practice, in memory
+ * updates are the contents of the system.paxos memtables, although this has been generalized into an "UpdateSupplier"
+ * interface to accomodate testing.
+ */
+public class PaxosUncommittedTracker
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosUncommittedTracker.class);
+    private static final Range<Token> FULL_RANGE = new Range<>(DatabaseDescriptor.getPartitioner().getMinimumToken(),
+                                                               DatabaseDescriptor.getPartitioner().getMinimumToken());
+
+    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 boolean started = false;
+    private boolean autoRepairStarted = false;
+
+    private final Set<TableId> autoRepairTableIds = Sets.newConcurrentHashSet();
+
+    public interface UpdateSupplier
+    {
+        CloseableIterator<PaxosKeyState> repairIterator(TableId tableId, Collection<Range<Token>> ranges);
+        CloseableIterator<PaxosKeyState> flushIterator(Memtable paxos);
+    }
+
+    private final File dataDirectory;
+    private volatile ImmutableMap<TableId, UncommittedTableData> tableStates;
+
+    public PaxosUncommittedTracker(File dataDirectory, ImmutableMap<TableId, UncommittedTableData> tableStates)
+    {
+        this.dataDirectory = dataDirectory;
+        this.tableStates = tableStates;
+    }
+
+    public PaxosUncommittedTracker(File dataDirectory)
+    {
+        this(dataDirectory, ImmutableMap.of());
+    }
+
+    public File getDirectory()
+    {
+        return dataDirectory;
+    }
+
+    public static void truncate(File dataDirectory)
+    {
+        logger.info("truncating paxos uncommitted metadata in {}", dataDirectory);
+        for (File file : dataDirectory.tryList())
+        {
+            if (file.name().equals(PaxosBallotTracker.FNAME))
+                continue;
+
+            if (file.isDirectory())
+                FileUtils.deleteRecursive(file);
+            else
+                FileUtils.deleteWithConfirm(file);
+        }
+    }
+
+    public static PaxosUncommittedTracker load(File dataDirectory)
+    {
+        ImmutableMap.Builder<TableId, UncommittedTableData> builder = ImmutableMap.builder();
+        for (TableId tableId : UncommittedTableData.listTableIds(dataDirectory))
+        {
+            builder.put(tableId, UncommittedTableData.load(dataDirectory, tableId));
+        }
+
+        return new PaxosUncommittedTracker(dataDirectory, builder.build());
+    }
+
+    @VisibleForTesting
+    UncommittedTableData getOrCreateTableState(TableId tableId)
+    {
+        UncommittedTableData state = tableStates.get(tableId);
+        if (state == null)
+        {
+            synchronized (this)
+            {
+                state = tableStates.get(tableId);
+                if (state != null)
+                    return state;
+
+                state = UncommittedTableData.load(dataDirectory, tableId);
+                tableStates = ImmutableMap.<TableId, UncommittedTableData>builder()
+                              .putAll(tableStates).put(tableId, state)
+                              .build();
+            }
+        }
+        return state;
+    }
+
+    synchronized void flushUpdates(Memtable paxos) throws IOException
+    {
+        if (!stateFlushEnabled || !started)
+            return;
+
+        Map<TableId, UncommittedTableData.FlushWriter> flushWriters = new HashMap<>();
+        try (CloseableIterator<PaxosKeyState> iterator = updateSupplier.flushIterator(paxos))
+        {
+            while (iterator.hasNext())
+            {
+                PaxosKeyState next = iterator.next();
+                UncommittedTableData.FlushWriter writer = flushWriters.get(next.tableId);
+                if (writer == null)
+                {
+                    writer = getOrCreateTableState(next.tableId).flushWriter();
+                    flushWriters.put(next.tableId, writer);
+                }
+                writer.append(next);
+            }
+        }
+        catch (Throwable t)
+        {
+            for (UncommittedTableData.FlushWriter writer : flushWriters.values())
+                t = writer.abort(t);
+            throw new IOException(t);
+        }
+
+        for (UncommittedTableData.FlushWriter writer : flushWriters.values())
+            writer.finish();
+    }
+
+    @VisibleForTesting
+    UncommittedTableData getTableState(TableId tableId)
+    {
+        return tableStates.get(tableId);
+    }
+
+    @SuppressWarnings("resource")
+    public CloseableIterator<UncommittedPaxosKey> uncommittedKeyIterator(TableId tableId, Collection<Range<Token>> ranges)
+    {
+        ranges = (ranges == null || ranges.isEmpty()) ? Collections.singleton(FULL_RANGE) : Range.normalize(ranges);
+        CloseableIterator<PaxosKeyState> updates = updateSupplier.repairIterator(tableId, ranges);
+
+        try
+        {
+            UncommittedTableData state = tableStates.get(tableId);
+            if (state == null)
+                return PaxosKeyState.toUncommittedInfo(updates);
+
+            CloseableIterator<PaxosKeyState> fileIter = state.iterator(ranges);
+            try
+            {
+                @SuppressWarnings("unchecked") CloseableIterator<PaxosKeyState> merged = mergeUncommitted(updates, fileIter);
+
+                return PaxosKeyState.toUncommittedInfo(merged);
+            }
+            catch (Throwable t)
+            {
+                fileIter.close();
+                throw t;
+            }
+        }
+        catch (Throwable t)
+        {
+            updates.close();
+            throw t;
+        }
+    }
+
+    synchronized void truncate()
+    {
+        logger.info("truncating paxos uncommitted info");
+        tableStates.values().forEach(UncommittedTableData::truncate);
+        tableStates = ImmutableMap.of();
+    }
+
+    public synchronized void start()
+    {
+        if (started)
+            return;
+
+        logger.info("enabling PaxosUncommittedTracker");
+        started = true;
+    }
+
+    public synchronized void rebuild(Iterator<PaxosKeyState> iterator) throws IOException
+    {
+        Preconditions.checkState(!started);
+        truncate();
+
+        Map<TableId, UncommittedTableData.FlushWriter> flushWriters = new HashMap<>();
+        try
+        {
+            while (iterator.hasNext())
+            {
+                PaxosKeyState next = iterator.next();
+                UncommittedTableData.FlushWriter writer = flushWriters.get(next.tableId);
+                if (writer == null)
+                {
+                    writer = getOrCreateTableState(next.tableId).rebuildWriter();
+                    flushWriters.put(next.tableId, writer);
+                }
+                writer.append(next);
+            }
+            for (UncommittedTableData.FlushWriter writer : flushWriters.values())
+                writer.finish();
+        }
+        catch (Throwable t)
+        {
+            for (UncommittedTableData.FlushWriter writer : flushWriters.values())
+                t = writer.abort(t);
+            throw new IOException(t);
+        }
+
+        start();
+    }
+
+    synchronized void consolidateFiles()
+    {
+        tableStates.values().forEach(UncommittedTableData::maybeScheduleMerge);
+    }
+
+    synchronized void schedulePaxosAutoRepairs()
+    {
+        if (!paxosRepairEnabled() || !autoRepairsEnabled)
+            return;
+
+        for (UncommittedTableData tableData : tableStates.values())
+        {
+            if (tableData.numFiles() == 0)
+                continue;
+
+            if (SchemaConstants.REPLICATED_SYSTEM_KEYSPACE_NAMES.contains(tableData.keyspace()))
+                continue;
+
+            TableId tableId = tableData.tableId();
+            if (Schema.instance.getTableMetadata(tableId) == null)
+                continue;
+
+            logger.debug("Starting paxos auto repair for {}.{}", tableData.keyspace(), tableData.table());
+
+            if (!autoRepairTableIds.add(tableId))
+            {
+                logger.debug("Skipping paxos auto repair for {}.{}, another auto repair is already in progress", tableData.keyspace(), tableData.table());
+                continue;
+            }
+
+            StorageService.instance.autoRepairPaxos(tableId).addCallback((success, failure) -> {
+                if (failure != null) logger.error("Paxos auto repair for {}.{} failed", tableData.keyspace(), tableData.table(), failure);
+                else logger.debug("Paxos auto repair for {}.{} completed", tableData.keyspace(), tableData.table());
+                autoRepairTableIds.remove(tableId);
+            });
+        }
+    }
+
+    private static void runAndLogException(String desc, Runnable runnable)
+    {
+        try
+        {
+            runnable.run();
+        }
+        catch (Throwable t)
+        {
+            logger.error("Unhandled exception running " + desc, t);
+        }
+    }
+
+    void maintenance()
+    {
+        runAndLogException("file consolidation", this::consolidateFiles);
+        runAndLogException("schedule auto repairs", this::schedulePaxosAutoRepairs);
+        runAndLogException("evict hung repairs", PaxosTableRepairs::evictHungRepairs);
+    }
+
+    public synchronized void startAutoRepairs()
+    {
+        if (autoRepairStarted)
+            return;
+        int seconds = Integer.getInteger("cassandra.auto_repair_frequency_seconds", (int) TimeUnit.MINUTES.toSeconds(5));
+        ScheduledExecutors.scheduledTasks.scheduleAtFixedRate(this::maintenance, seconds, seconds, TimeUnit.SECONDS);
+        autoRepairStarted = true;
+    }
+
+    @VisibleForTesting
+    public boolean hasInflightAutoRepairs()
+    {
+        return !autoRepairTableIds.isEmpty();
+    }
+
+    public boolean isAutoRepairsEnabled()
+    {
+        return autoRepairsEnabled;
+    }
+
+    public void setAutoRepairsEnabled(boolean autoRepairsEnabled)
+    {
+        this.autoRepairsEnabled = autoRepairsEnabled;
+    }
+
+    public boolean isStateFlushEnabled()
+    {
+        return stateFlushEnabled;
+    }
+
+    public void setStateFlushEnabled(boolean enabled)
+    {
+        this.stateFlushEnabled = enabled;
+    }
+
+    public Set<TableId> tableIds()
+    {
+        return tableStates.keySet();
+    }
+
+    public static UpdateSupplier unsafGetUpdateSupplier()
+    {
+        return updateSupplier;
+    }
+
+    public static void unsafSetUpdateSupplier(UpdateSupplier updateSupplier)
+    {
+        Preconditions.checkArgument(updateSupplier != null);
+        PaxosUncommittedTracker.updateSupplier = updateSupplier;
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedDataFile.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedDataFile.java
new file mode 100644
index 0000000..b2a5004
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedDataFile.java
@@ -0,0 +1,383 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.PeekingIterator;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.FSReadError;
+import org.apache.cassandra.io.util.ChecksummedRandomAccessReader;
+import org.apache.cassandra.io.util.ChecksummedSequentialWriter;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.RandomAccessReader;
+import org.apache.cassandra.io.util.SequentialWriter;
+import org.apache.cassandra.io.util.SequentialWriterOption;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.AbstractIterator;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.Throwables;
+
+public class UncommittedDataFile
+{
+    static final String EXTENSION = "paxos";
+    static final String TMP_SUFFIX = ".tmp";
+    private static final int VERSION = 0;
+    final TableId tableId;
+    private final File file;
+    private final File crcFile;
+    private final long generation;
+    private int activeReaders = 0;
+    private boolean markedDeleted = false;
+
+    private UncommittedDataFile(TableId tableId, File file, File crcFile, long generation)
+    {
+        this.tableId = tableId;
+        this.file = file;
+        this.crcFile = crcFile;
+        this.generation = generation;
+    }
+
+    public static UncommittedDataFile create(TableId tableId, File file, File crcFile, long generation)
+    {
+        return new UncommittedDataFile(tableId, file, crcFile, generation);
+    }
+
+    static Writer writer(File directory, String keyspace, String table, TableId tableId, long generation) throws IOException
+    {
+        return new Writer(directory, keyspace, table, tableId, generation);
+    }
+
+    static Set<TableId> listTableIds(File directory)
+    {
+        Pattern pattern = Pattern.compile(".*-([a-fA-F0-9]{8}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{4}-[a-fA-F0-9]{12})-(\\d+)\\." + EXTENSION + '$');
+        Set<TableId> tableIds = new HashSet<>();
+        for (String fname : directory.listNamesUnchecked())
+        {
+            Matcher matcher = pattern.matcher(fname);
+            if (matcher.matches())
+                tableIds.add(TableId.fromUUID(UUID.fromString(matcher.group(1))));
+        }
+        return tableIds;
+    }
+
+    static Pattern fileRegexFor(TableId tableId)
+    {
+        return Pattern.compile(".*-" + tableId.toString() + "-(\\d+)\\." + EXTENSION + ".*");
+    }
+
+    static boolean isTmpFile(String fname)
+    {
+        return fname.endsWith(TMP_SUFFIX);
+    }
+
+    static boolean isCrcFile(String fname)
+    {
+        return fname.endsWith(".crc");
+    }
+
+    static String fileName(String keyspace, String table, TableId tableId, long generation)
+    {
+        return String.format("%s-%s-%s-%s.%s", keyspace, table, tableId, generation, EXTENSION);
+    }
+
+    static String crcName(String fname)
+    {
+        return fname + ".crc";
+    }
+
+    synchronized void markDeleted()
+    {
+        markedDeleted = true;
+        maybeDelete();
+    }
+
+    private void maybeDelete()
+    {
+        if (markedDeleted && activeReaders == 0)
+        {
+            file.delete();
+            crcFile.delete();
+        }
+    }
+
+    synchronized private void onIteratorClose()
+    {
+        activeReaders--;
+        maybeDelete();
+    }
+
+    @VisibleForTesting
+    File file()
+    {
+        return file;
+    }
+
+    @VisibleForTesting
+    int getActiveReaders()
+    {
+        return activeReaders;
+    }
+
+    @VisibleForTesting
+    boolean isMarkedDeleted()
+    {
+        return markedDeleted;
+    }
+
+    long generation()
+    {
+        return generation;
+    }
+
+    /**
+     * Return an iterator of the file contents for the given token ranges. Token ranges
+     * must be normalized
+     */
+    synchronized CloseableIterator<PaxosKeyState> iterator(Collection<Range<Token>> ranges)
+    {
+        Preconditions.checkArgument(Iterables.elementsEqual(Range.normalize(ranges), ranges));
+        if (markedDeleted)
+            return null;
+        activeReaders++;
+        return new KeyCommitStateIterator(ranges);
+    }
+
+    private interface PeekingKeyCommitIterator extends CloseableIterator<PaxosKeyState>, PeekingIterator<PaxosKeyState>
+    {
+        static final PeekingKeyCommitIterator EMPTY = new PeekingKeyCommitIterator()
+        {
+            public PaxosKeyState peek() { throw new NoSuchElementException(); }
+            public void remove() { throw new NoSuchElementException(); }
+            public void close() { }
+            public boolean hasNext() { return false; }
+            public PaxosKeyState next() { throw new NoSuchElementException(); }
+        };
+    }
+
+    static class Writer
+    {
+        final File directory;
+        final String keyspace;
+        final String table;
+        final TableId tableId;
+        long generation;
+
+        private final File file;
+        private final File crcFile;
+        final SequentialWriter writer;
+        DecoratedKey lastKey = null;
+
+        private String fileName(long generation)
+        {
+            return UncommittedDataFile.fileName(keyspace, table, tableId, generation);
+        }
+
+        private String crcName(long generation)
+        {
+            return UncommittedDataFile.crcName(fileName(generation));
+        }
+
+        Writer(File directory, String keyspace, String table, TableId tableId, long generation) throws IOException
+        {
+            this.directory = directory;
+            this.keyspace = keyspace;
+            this.table = table;
+            this.tableId = tableId;
+            this.generation = generation;
+
+            directory.createDirectoriesIfNotExists();
+
+            this.file = new File(this.directory, fileName(generation) + TMP_SUFFIX);
+            this.crcFile = new File(this.directory, crcName(generation) + TMP_SUFFIX);
+            this.writer = new ChecksummedSequentialWriter(file, crcFile, null, SequentialWriterOption.DEFAULT);
+            this.writer.writeInt(VERSION);
+        }
+
+        void append(PaxosKeyState state) throws IOException
+        {
+            if (lastKey != null)
+                Preconditions.checkArgument(state.key.compareTo(lastKey) > 0);
+            lastKey = state.key;
+            ByteBufferUtil.writeWithShortLength(state.key.getKey(), writer);
+            state.ballot.serialize(writer);
+            writer.writeBoolean(state.committed);
+        }
+
+        Throwable abort(Throwable accumulate)
+        {
+            return writer.abort(accumulate);
+        }
+
+        UncommittedDataFile finish()
+        {
+            writer.finish();
+            File finalCrc = new File(directory, crcName(generation));
+            File finalData = new File(directory, fileName(generation));
+            try
+            {
+                crcFile.move(finalCrc);
+                file.move(finalData);
+                return new UncommittedDataFile(tableId, finalData, finalCrc, generation);
+            }
+            catch (Throwable e)
+            {
+                Throwable merged = e;
+                for (File f : new File[]{crcFile, finalCrc, file, finalData})
+                {
+                    try
+                    {
+                        if (f.exists())
+                            Files.delete(f.toPath());
+                    }
+                    catch (Throwable t)
+                    {
+                        merged = Throwables.merge(merged, t);
+                    }
+                }
+
+                if (merged != e)
+                    throw new RuntimeException(merged);
+                throw e;
+            }
+        }
+    }
+
+    class KeyCommitStateIterator extends AbstractIterator<PaxosKeyState> implements PeekingKeyCommitIterator
+    {
+        private final Iterator<Range<Token>> rangeIterator;
+        private final RandomAccessReader reader;
+
+        private Range<PartitionPosition> currentRange;
+
+        KeyCommitStateIterator(Collection<Range<Token>> ranges)
+        {
+            this.rangeIterator = ranges.iterator();
+            try
+            {
+                this.reader = ChecksummedRandomAccessReader.open(file, crcFile);
+            }
+            catch (IOException e)
+            {
+                throw new FSReadError(e, file);
+            }
+            validateVersion(this.reader);
+
+            Preconditions.checkArgument(rangeIterator.hasNext());
+            currentRange = convertRange(rangeIterator.next());
+        }
+
+        private Range<PartitionPosition> convertRange(Range<Token> tokenRange)
+        {
+            return new Range<>(tokenRange.left.maxKeyBound(), tokenRange.right.maxKeyBound());
+        }
+
+        private void validateVersion(RandomAccessReader reader)
+        {
+            try
+            {
+                int version = reader.readInt();
+                Preconditions.checkArgument(version == VERSION, "unsupported file version: %s", version);
+            }
+            catch (IOException e)
+            {
+                throw new FSReadError(e, file);
+            }
+        }
+
+        PaxosKeyState createKeyState(DecoratedKey key, RandomAccessReader reader) throws IOException
+        {
+            return new PaxosKeyState(tableId, key,
+                                     Ballot.deserialize(reader),
+                                     reader.readBoolean());
+        }
+
+        /**
+         * skip any bytes after the key
+         */
+        void skipEntryRemainder(RandomAccessReader reader) throws IOException
+        {
+            reader.skipBytes((int) Ballot.sizeInBytes());
+            reader.readBoolean();
+        }
+
+        protected synchronized PaxosKeyState computeNext()
+        {
+            try
+            {
+                nextKey:
+                while (!reader.isEOF())
+                {
+                    DecoratedKey key = DatabaseDescriptor.getPartitioner().decorateKey(ByteBufferUtil.readWithShortLength(reader));
+
+                    while (!currentRange.contains(key))
+                    {
+                        // if this falls before our current target range, just keep going
+                        if (currentRange.left.compareTo(key) >= 0)
+                        {
+                            skipEntryRemainder(reader);
+                            continue nextKey;
+                        }
+
+                        // otherwise check against subsequent ranges and end iteration if there are none
+                        if (!rangeIterator.hasNext())
+                            return endOfData();
+
+                        currentRange = convertRange(rangeIterator.next());
+                    }
+
+                    return createKeyState(key, reader);
+                }
+                return endOfData();
+            }
+            catch (IOException e)
+            {
+                throw new FSReadError(e, file);
+            }
+        }
+
+        public void close()
+        {
+            synchronized (this)
+            {
+                reader.close();
+            }
+            onIteratorClose();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedPaxosKey.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedPaxosKey.java
new file mode 100644
index 0000000..c78f94d
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedPaxosKey.java
@@ -0,0 +1,30 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.service.paxos.Ballot;
+
+public interface UncommittedPaxosKey
+{
+    DecoratedKey getKey();
+    ConsistencyLevel getConsistencyLevel();
+    Ballot ballot();
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedTableData.java b/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedTableData.java
new file mode 100644
index 0000000..dd47e40
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/uncommitted/UncommittedTableData.java
@@ -0,0 +1,616 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOError;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.NavigableSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentSkipListSet;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.PeekingIterator;
+import com.google.common.collect.Sets;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.SchemaElement;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.FSReadError;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
+import org.apache.cassandra.utils.AbstractIterator;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.ExecutorUtils;
+import org.apache.cassandra.utils.MergeIterator;
+import org.apache.cassandra.utils.Throwables;
+
+import static com.google.common.collect.Iterables.elementsEqual;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.service.paxos.uncommitted.UncommittedDataFile.isCrcFile;
+import static org.apache.cassandra.service.paxos.uncommitted.UncommittedDataFile.isTmpFile;
+import static org.apache.cassandra.service.paxos.uncommitted.UncommittedDataFile.writer;
+
+/**
+ * On memtable flush
+ */
+public class UncommittedTableData
+{
+    private static final Logger logger = LoggerFactory.getLogger(UncommittedTableData.class);
+    private static final Collection<Range<Token>> FULL_RANGE;
+
+    static
+    {
+        Token min = DatabaseDescriptor.getPartitioner().getMinimumToken();
+        FULL_RANGE = Collections.singleton(new Range<>(min, min));
+    }
+
+    private static final SchemaElement UNKNOWN_TABLE = TableMetadata.minimal("UNKNOWN", "UNKNOWN");
+    private static final ExecutorPlus executor = executorFactory().sequential("PaxosUncommittedMerge");
+
+    public interface FlushWriter
+    {
+        void append(PaxosKeyState commitState) throws IOException;
+
+        void finish();
+
+        Throwable abort(Throwable accumulate);
+
+        default void appendAll(Iterable<PaxosKeyState> states) throws IOException
+        {
+            for (PaxosKeyState state : states)
+                append(state);
+        }
+    }
+
+    private static class FilteringIterator extends AbstractIterator<PaxosKeyState> implements CloseableIterator<PaxosKeyState>
+    {
+        private final CloseableIterator<PaxosKeyState> wrapped;
+        private final PeekingIterator<PaxosKeyState> peeking;
+        private final PeekingIterator<Range<Token>> rangeIterator;
+        private final PaxosRepairHistory.Searcher historySearcher;
+
+        FilteringIterator(CloseableIterator<PaxosKeyState> wrapped, List<Range<Token>> ranges, PaxosRepairHistory history)
+        {
+            this.wrapped = wrapped;
+            this.peeking = Iterators.peekingIterator(wrapped);
+            this.rangeIterator = Iterators.peekingIterator(Range.normalize(ranges).iterator());
+            this.historySearcher = history.searcher();
+        }
+
+        protected PaxosKeyState computeNext()
+        {
+            while (true)
+            {
+                if (!peeking.hasNext() || !rangeIterator.hasNext())
+                    return endOfData();
+
+                Range<Token> range = rangeIterator.peek();
+
+                Token token = peeking.peek().key.getToken();
+                if (!range.contains(token))
+                {
+                    if (range.right.compareTo(token) < 0)
+                        rangeIterator.next();
+                    else
+                        peeking.next();
+                    continue;
+                }
+
+                PaxosKeyState next = peeking.next();
+
+                Ballot lowBound = historySearcher.ballotForToken(token);
+                if (Commit.isAfter(lowBound, next.ballot))
+                    continue;
+
+                return next;
+            }
+        }
+
+        public void close()
+        {
+            wrapped.close();
+        }
+    }
+
+    static abstract class FilterFactory
+    {
+        abstract List<Range<Token>> getReplicatedRanges();
+        abstract PaxosRepairHistory getPaxosRepairHistory();
+
+        CloseableIterator<PaxosKeyState> filter(CloseableIterator<PaxosKeyState> iterator)
+        {
+            return new FilteringIterator(iterator, getReplicatedRanges(), getPaxosRepairHistory());
+        }
+    }
+
+    private static class CFSFilterFactory extends FilterFactory
+    {
+        private final TableId tableId;
+
+        /**
+         * @param tableId must refer to a known CFS
+         */
+        CFSFilterFactory(TableId tableId)
+        {
+            this.tableId = tableId;
+        }
+
+        List<Range<Token>> getReplicatedRanges()
+        {
+            if (tableId == null)
+                return Range.normalize(FULL_RANGE);
+
+            ColumnFamilyStore table = Schema.instance.getColumnFamilyStoreInstance(tableId);
+            if (table == null)
+                return Range.normalize(FULL_RANGE);
+
+            String ksName = table.keyspace.getName();
+            List<Range<Token>> ranges = StorageService.instance.getLocalAndPendingRanges(ksName);
+
+            // don't filter anything if we're not aware of any locally replicated ranges
+            if (ranges.isEmpty())
+                return Range.normalize(FULL_RANGE);
+
+            return Range.normalize(ranges);
+        }
+
+        PaxosRepairHistory getPaxosRepairHistory()
+        {
+            ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(tableId);
+            if (cfs == null)
+                return PaxosRepairHistory.EMPTY;
+
+            return cfs.getPaxosRepairHistory();
+        }
+    }
+
+    static class Data
+    {
+        final ImmutableSet<UncommittedDataFile> files;
+
+        Data(ImmutableSet<UncommittedDataFile> files)
+        {
+            this.files = files;
+        }
+
+        Data withFile(UncommittedDataFile file)
+        {
+            return new Data(ImmutableSet.<UncommittedDataFile>builder().addAll(files).add(file).build());
+        }
+
+        void truncate()
+        {
+            for (UncommittedDataFile file : files)
+                file.markDeleted();
+        }
+    }
+
+    private static class Reducer extends MergeIterator.Reducer<PaxosKeyState, PaxosKeyState>
+    {
+        PaxosKeyState merged = null;
+
+        public void reduce(int idx, PaxosKeyState current)
+        {
+            merged = PaxosKeyState.merge(merged, current);
+        }
+
+        protected PaxosKeyState getReduced()
+        {
+            return merged;
+        }
+
+        protected void onKeyChange()
+        {
+            merged = null;
+        }
+    }
+
+    @SuppressWarnings("resource")
+    private static CloseableIterator<PaxosKeyState> merge(Collection<UncommittedDataFile> files, Collection<Range<Token>> ranges)
+    {
+        List<CloseableIterator<PaxosKeyState>> iterators = new ArrayList<>(files.size());
+        try
+        {
+            for (UncommittedDataFile file : files)
+            {
+                CloseableIterator<PaxosKeyState> iterator = file.iterator(ranges);
+                if (iterator == null) continue;
+                iterators.add(iterator);
+            }
+            return MergeIterator.get(iterators, PaxosKeyState.KEY_COMPARATOR, new Reducer());
+        }
+        catch (Throwable t)
+        {
+            Throwables.close(t, iterators);
+            throw t;
+        }
+    }
+
+    class Merge implements Runnable
+    {
+        final int generation;
+        boolean isScheduled = false;
+
+        Merge(int generation)
+        {
+            this.generation = generation;
+        }
+
+        public void run()
+        {
+            try
+            {
+                Preconditions.checkState(!dependsOnActiveFlushes());
+                Data current = data;
+                SchemaElement name = tableName(tableId);
+                UncommittedDataFile.Writer writer = writer(directory, name.elementKeyspace(), name.elementName(), tableId, generation);
+                Set<UncommittedDataFile> files = Sets.newHashSet(Iterables.filter(current.files, u -> u.generation() < generation));
+                logger.info("merging {} paxos uncommitted files into a new generation {} file for {}.{}", files.size(), generation, keyspace(), table());
+                try (CloseableIterator<PaxosKeyState> iterator = filterFactory.filter(merge(files, FULL_RANGE)))
+                {
+                    while (iterator.hasNext())
+                    {
+                        PaxosKeyState next = iterator.next();
+
+                        if (next.committed)
+                            continue;
+
+                        writer.append(next);
+                    }
+                    mergeComplete(this, writer.finish());
+                }
+            }
+            catch (IOException e)
+            {
+                throw new IOError(e);
+            }
+        }
+
+        void maybeSchedule()
+        {
+            if (isScheduled)
+                return;
+
+            if (dependsOnActiveFlushes())
+                return;
+
+            executor.submit(merge);
+            merge.isScheduled = true;
+        }
+
+        boolean dependsOnActiveFlushes()
+        {
+            return !activeFlushes.headSet(generation).isEmpty();
+        }
+    }
+
+    private final File directory;
+    private final TableId tableId;
+    private final FilterFactory filterFactory;
+
+    private volatile Data data;
+    private volatile Merge merge;
+    private volatile boolean rebuilding = false;
+
+    private int nextGeneration;
+    private final NavigableSet<Integer> activeFlushes = new ConcurrentSkipListSet<>();
+
+    private UncommittedTableData(File directory, TableId tableId, FilterFactory filterFactory, Data data)
+    {
+        this.directory = directory;
+        this.tableId = tableId;
+        this.filterFactory = filterFactory;
+        this.data = data;
+        this.nextGeneration = 1 + (int) data.files.stream().mapToLong(UncommittedDataFile::generation).max().orElse(-1);
+    }
+
+    static UncommittedTableData load(File directory, TableId tableId, FilterFactory flushFilterFactory)
+    {
+        Preconditions.checkArgument(directory.exists());
+        Preconditions.checkArgument(directory.isDirectory());
+        Preconditions.checkNotNull(tableId);
+
+        String[] fnames = directory.tryListNames();
+        Preconditions.checkArgument(fnames != null);
+
+        Pattern pattern = UncommittedDataFile.fileRegexFor(tableId);
+        Set<Long> generations = new HashSet<>();
+        List<UncommittedDataFile> files = new ArrayList<>();
+        for (String fname : fnames)
+        {
+            Matcher matcher = pattern.matcher(fname);
+            if (!matcher.matches())
+                continue;
+
+            File file = new File(directory, fname);
+            if (isTmpFile(fname))
+            {
+                logger.info("deleting left over uncommitted paxos temp file {} for tableId {}", file, tableId);
+                file.delete();
+                continue;
+            }
+
+            if (isCrcFile(fname))
+                continue;
+
+            File crcFile = new File(directory, UncommittedDataFile.crcName(fname));
+            if (!crcFile.exists())
+                throw new FSReadError(new IOException(String.format("%s does not have a corresponding crc file", file)), crcFile);
+            long generation = Long.parseLong(matcher.group(1));
+            files.add(UncommittedDataFile.create(tableId, file, crcFile, generation));
+            generations.add(generation);
+        }
+
+        // cleanup orphaned crc files
+        for (String fname : fnames)
+        {
+            if (!isCrcFile(fname))
+                continue;
+
+            Matcher matcher = pattern.matcher(fname);
+            if (!matcher.matches())
+                continue;
+
+            long generation = Long.parseLong(matcher.group(1));
+            if (!generations.contains(generation))
+            {
+                File file = new File(directory, fname);
+                logger.info("deleting left over uncommitted paxos crc file {} for tableId {}", file, tableId);
+                file.delete();
+            }
+        }
+
+        return new UncommittedTableData(directory, tableId, flushFilterFactory, new Data(ImmutableSet.copyOf(files)));
+    }
+
+    static UncommittedTableData load(File directory, TableId tableId)
+    {
+        return load(directory, tableId, new CFSFilterFactory(tableId));
+    }
+
+    static Set<TableId> listTableIds(File directory)
+    {
+        Preconditions.checkArgument(directory.isDirectory());
+        return UncommittedDataFile.listTableIds(directory);
+    }
+
+    private static SchemaElement tableName(TableId tableId)
+    {
+        TableMetadata name = Schema.instance.getTableMetadata(tableId);
+        return name != null ? name : UNKNOWN_TABLE;
+    }
+
+    int numFiles()
+    {
+        return data.files.size();
+    }
+
+    TableId tableId()
+    {
+        return tableId;
+    }
+
+    public String keyspace()
+    {
+        return tableName(tableId).elementKeyspace();
+    }
+
+    public String table()
+    {
+        return tableName(tableId).elementName();
+    }
+
+    /**
+     * Return an iterator of the file contents for the given token ranges. Token ranges
+     * must be normalized
+     */
+    synchronized CloseableIterator<PaxosKeyState> iterator(Collection<Range<Token>> ranges)
+    {
+        // we don't wait for pending flushes because flushing memtable data is added in PaxosUncommittedIndex
+        Preconditions.checkArgument(elementsEqual(Range.normalize(ranges), ranges));
+        return filterFactory.filter(merge(data.files, ranges));
+    }
+
+    private void flushTerminated(int generation)
+    {
+        activeFlushes.remove(generation);
+        if (merge != null)
+            merge.maybeSchedule();
+    }
+
+    private synchronized void flushSuccess(int generation, UncommittedDataFile newFile)
+    {
+        assert newFile == null || generation == newFile.generation();
+        if (newFile != null)
+            data = data.withFile(newFile);
+        flushTerminated(generation);
+    }
+
+    private synchronized void flushAborted(int generation)
+    {
+        flushTerminated(generation);
+    }
+
+    private synchronized void mergeComplete(Merge merge, UncommittedDataFile newFile)
+    {
+        Preconditions.checkArgument(this.merge == merge);
+        ImmutableSet.Builder<UncommittedDataFile> files = ImmutableSet.builder();
+        files.add(newFile);
+        for (UncommittedDataFile file : data.files)
+        {
+            if (file.generation() > merge.generation)
+                files.add(file);
+            else
+                file.markDeleted();
+        }
+
+        data = new Data(files.build());
+        this.merge = null;
+        logger.info("paxos uncommitted merge completed for {}.{}, new generation {} file added", keyspace(), table(), newFile.generation());
+    }
+
+    synchronized FlushWriter flushWriter() throws IOException
+    {
+        int generation = nextGeneration++;
+        UncommittedDataFile.Writer writer = writer(directory, keyspace(), table(), tableId, generation);
+        activeFlushes.add(generation);
+        logger.info("flushing generation {} uncommitted paxos file for {}.{}", generation, keyspace(), table());
+
+        return new FlushWriter()
+        {
+            public void append(PaxosKeyState commitState) throws IOException
+            {
+                writer.append(commitState);
+            }
+
+            public void finish()
+            {
+                flushSuccess(generation, writer.finish());
+            }
+
+            public Throwable abort(Throwable accumulate)
+            {
+                accumulate = writer.abort(accumulate);
+                flushAborted(generation);
+                return accumulate;
+            }
+        };
+    }
+
+    private synchronized void rebuildComplete(UncommittedDataFile file)
+    {
+        Preconditions.checkState(rebuilding);
+        Preconditions.checkState(!hasInProgressIO());
+        Preconditions.checkState(data.files.isEmpty());
+
+        data = new Data(ImmutableSet.of(file));
+        logger.info("paxos rebuild completed for {}.{}", keyspace(), table());
+        rebuilding = false;
+    }
+
+    synchronized FlushWriter rebuildWriter() throws IOException
+    {
+        Preconditions.checkState(!rebuilding);
+        Preconditions.checkState(nextGeneration == 0);
+        Preconditions.checkState(!hasInProgressIO());
+        rebuilding = true;
+        int generation = nextGeneration++;
+        UncommittedDataFile.Writer writer = writer(directory, keyspace(), table(), tableId, generation);
+
+        return new FlushWriter()
+        {
+            public void append(PaxosKeyState commitState) throws IOException
+            {
+                if (commitState.committed)
+                    return;
+
+                writer.append(commitState);
+            }
+
+            public void finish()
+            {
+                rebuildComplete(writer.finish());
+            }
+
+            public Throwable abort(Throwable accumulate)
+            {
+                accumulate = writer.abort(accumulate);
+                logger.info("paxos rebuild aborted for {}.{}", keyspace(), table());
+                rebuilding = false;
+                return accumulate;
+            }
+        };
+    }
+
+    synchronized void maybeScheduleMerge()
+    {
+        logger.info("Scheduling uncommitted paxos data merge task for {}.{}", keyspace(), table());
+        if (data.files.size() < 2 || merge != null)
+            return;
+
+        createMergeTask().maybeSchedule();
+    }
+
+    @VisibleForTesting
+    synchronized Merge createMergeTask()
+    {
+        Preconditions.checkState(merge == null);
+        merge = new Merge(nextGeneration++);
+        return merge;
+    }
+
+    synchronized boolean hasInProgressIO()
+    {
+        return merge != null || !activeFlushes.isEmpty();
+    }
+
+    void truncate()
+    {
+        logger.info("truncating uncommitting paxos date for {}.{}", keyspace(), table());
+        data.truncate();
+        data = new Data(ImmutableSet.of());
+    }
+
+    @VisibleForTesting
+    Data data()
+    {
+        return data;
+    }
+
+    @VisibleForTesting
+    long nextGeneration()
+    {
+        return nextGeneration;
+    }
+
+    @VisibleForTesting
+    Merge currentMerge()
+    {
+        return merge;
+    }
+
+    public static void shutdownAndWait(long timeout, TimeUnit units) throws InterruptedException, TimeoutException
+    {
+        ExecutorUtils.shutdownAndWait(timeout, units, executor);
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/v1/AbstractPaxosCallback.java b/src/java/org/apache/cassandra/service/paxos/v1/AbstractPaxosCallback.java
new file mode 100644
index 0000000..e6ef1da
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/v1/AbstractPaxosCallback.java
@@ -0,0 +1,66 @@
+/*
+ * 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.service.paxos.v1;
+
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.WriteType;
+import org.apache.cassandra.exceptions.WriteTimeoutException;
+import org.apache.cassandra.net.RequestCallback;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
+
+public abstract class AbstractPaxosCallback<T> implements RequestCallback<T>
+{
+    protected final CountDownLatch latch;
+    protected final int targets;
+    private final ConsistencyLevel consistency;
+    private final long queryStartNanoTime;
+
+    public AbstractPaxosCallback(int targets, ConsistencyLevel consistency, long queryStartNanoTime)
+    {
+        this.targets = targets;
+        this.consistency = consistency;
+        latch = newCountDownLatch(targets);
+        this.queryStartNanoTime = queryStartNanoTime;
+    }
+
+    public int getResponseCount()
+    {
+        return targets - latch.count();
+    }
+
+    public void await() throws WriteTimeoutException
+    {
+        try
+        {
+            long timeout = DatabaseDescriptor.getWriteRpcTimeout(NANOSECONDS) - (nanoTime() - queryStartNanoTime);
+            if (!latch.await(timeout, NANOSECONDS))
+                throw new WriteTimeoutException(WriteType.CAS, consistency, getResponseCount(), targets);
+        }
+        catch (InterruptedException e)
+        {
+            throw new UncheckedInterruptedException(e);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/v1/PrepareCallback.java b/src/java/org/apache/cassandra/service/paxos/v1/PrepareCallback.java
new file mode 100644
index 0000000..a6afc3a
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/v1/PrepareCallback.java
@@ -0,0 +1,85 @@
+/*
+ * 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.service.paxos.v1;
+
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import com.google.common.collect.Iterables;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.PrepareResponse;
+
+public class PrepareCallback extends AbstractPaxosCallback<PrepareResponse>
+{
+    private static final Logger logger = LoggerFactory.getLogger(PrepareCallback.class);
+
+    public boolean promised = true;
+    public Commit mostRecentCommit;
+    public Commit mostRecentInProgressCommit;
+
+    private final Map<InetAddressAndPort, Commit> commitsByReplica = new ConcurrentHashMap<>();
+
+    public PrepareCallback(DecoratedKey key, TableMetadata metadata, int targets, ConsistencyLevel consistency, long queryStartNanoTime)
+    {
+        super(targets, consistency, queryStartNanoTime);
+        // need to inject the right key in the empty commit so comparing with empty commits in the response works as expected
+        mostRecentCommit = Commit.emptyCommit(key, metadata);
+        mostRecentInProgressCommit = Commit.emptyCommit(key, metadata);
+    }
+
+    public synchronized void onResponse(Message<PrepareResponse> message)
+    {
+        PrepareResponse response = message.payload;
+        logger.trace("Prepare response {} from {}", response, message.from());
+
+        // We set the mostRecentInProgressCommit even if we're not promised as, in that case, the ballot of that commit
+        // will be used to avoid generating a ballot that has not chance to win on retry (think clock skew).
+        if (response.inProgressCommit.isAfter(mostRecentInProgressCommit))
+            mostRecentInProgressCommit = response.inProgressCommit;
+
+        if (!response.promised)
+        {
+            promised = false;
+            while (latch.count() > 0)
+                latch.decrement();
+            return;
+        }
+
+        commitsByReplica.put(message.from(), response.mostRecentCommit);
+        if (response.mostRecentCommit.isAfter(mostRecentCommit))
+            mostRecentCommit = response.mostRecentCommit;
+
+        latch.decrement();
+    }
+
+    public Iterable<InetAddressAndPort> replicasMissingMostRecentCommit()
+    {
+        return Iterables.filter(commitsByReplica.keySet(), inetAddress -> (!commitsByReplica.get(inetAddress).ballot.equals(mostRecentCommit.ballot)));
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/v1/PrepareVerbHandler.java b/src/java/org/apache/cassandra/service/paxos/v1/PrepareVerbHandler.java
new file mode 100644
index 0000000..2ebcfeb
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/v1/PrepareVerbHandler.java
@@ -0,0 +1,41 @@
+/*
+ * 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.service.paxos.v1;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.service.paxos.PrepareResponse;
+
+public class PrepareVerbHandler implements IVerbHandler<Commit>
+{
+    public static PrepareVerbHandler instance = new PrepareVerbHandler();
+
+    public static PrepareResponse doPrepare(Commit toPrepare)
+    {
+        return PaxosState.legacyPrepare(toPrepare);
+    }
+
+    public void doVerb(Message<Commit> message)
+    {
+        Message<PrepareResponse> reply = message.responseWith(doPrepare(message.payload));
+        MessagingService.instance().send(reply, message.from());
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/v1/ProposeCallback.java b/src/java/org/apache/cassandra/service/paxos/v1/ProposeCallback.java
new file mode 100644
index 0000000..1c975cb
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/v1/ProposeCallback.java
@@ -0,0 +1,92 @@
+/*
+ * 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.service.paxos.v1;
+
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.utils.Nemesis;
+
+/**
+ * ProposeCallback has two modes of operation, controlled by the failFast parameter.
+ *
+ * In failFast mode, we will return a failure as soon as a majority of nodes reject
+ * the proposal. This is used when replaying a proposal from an earlier leader.
+ *
+ * Otherwise, we wait for either all replicas to respond or until we achieve
+ * the desired quorum. We continue to wait for all replicas even after we know we cannot succeed
+ * because we need to know if no node at all have accepted or if at least one has.
+ * In the former case, a proposer is guaranteed no-one will
+ * replay its value; in the latter we don't, so we must timeout in case another
+ * leader replays it before we can; see CASSANDRA-6013
+ */
+public class ProposeCallback extends AbstractPaxosCallback<Boolean>
+{
+    private static final Logger logger = LoggerFactory.getLogger(ProposeCallback.class);
+
+    @Nemesis private final AtomicInteger accepts = new AtomicInteger(0);
+    private final int requiredAccepts;
+    private final boolean failFast;
+
+    public ProposeCallback(int totalTargets, int requiredTargets, boolean failFast, ConsistencyLevel consistency, long queryStartNanoTime)
+    {
+        super(totalTargets, consistency, queryStartNanoTime);
+        this.requiredAccepts = requiredTargets;
+        this.failFast = failFast;
+    }
+
+    public void onResponse(Message<Boolean> msg)
+    {
+        logger.trace("Propose response {} from {}", msg.payload, msg.from());
+
+        if (msg.payload)
+            accepts.incrementAndGet();
+
+        latch.decrement();
+
+        if (isSuccessful() || (failFast && (latch.count() + accepts.get() < requiredAccepts)))
+        {
+            while (latch.count() > 0)
+                latch.decrement();
+        }
+    }
+
+    public int getAcceptCount()
+    {
+        return accepts.get();
+    }
+
+    public boolean isSuccessful()
+    {
+        return accepts.get() >= requiredAccepts;
+    }
+
+    // Note: this is only reliable if !failFast
+    public boolean isFullyRefused()
+    {
+        // We need to check the latch first to avoid racing with a late arrival
+        // between the latch check and the accepts one
+        return latch.count() == 0 && accepts.get() == 0;
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/paxos/v1/ProposeVerbHandler.java b/src/java/org/apache/cassandra/service/paxos/v1/ProposeVerbHandler.java
new file mode 100644
index 0000000..54c8c67
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/paxos/v1/ProposeVerbHandler.java
@@ -0,0 +1,41 @@
+/*
+ * 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.service.paxos.v1;
+import org.apache.cassandra.net.IVerbHandler;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.PaxosState;
+
+public class ProposeVerbHandler implements IVerbHandler<Commit>
+{
+    public static final ProposeVerbHandler instance = new ProposeVerbHandler();
+
+    public static Boolean doPropose(Commit proposal)
+    {
+        return PaxosState.legacyPropose(proposal);
+    }
+
+    public void doVerb(Message<Commit> message)
+    {
+        Boolean response = doPropose(message.payload);
+        Message<Boolean> reply = message.responseWith(response);
+        MessagingService.instance().send(reply, message.from());
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/reads/AbstractReadExecutor.java b/src/java/org/apache/cassandra/service/reads/AbstractReadExecutor.java
index fd1b372..1613283 100644
--- a/src/java/org/apache/cassandra/service/reads/AbstractReadExecutor.java
+++ b/src/java/org/apache/cassandra/service/reads/AbstractReadExecutor.java
@@ -45,9 +45,10 @@
 import org.apache.cassandra.service.reads.repair.ReadRepair;
 import org.apache.cassandra.tracing.TraceState;
 import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.utils.FBUtilities;
 
 import static com.google.common.collect.Iterables.all;
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
 
 /**
  * Sends a read request to the replicas needed to satisfy a given ConsistencyLevel.
@@ -195,7 +196,7 @@
 
         // There are simply no extra replicas to speculate.
         // Handle this separately so it can record failed attempts to speculate due to lack of replicas
-        if (replicaPlan.contacts().size() == replicaPlan.candidates().size())
+        if (replicaPlan.contacts().size() == replicaPlan.readCandidates().size())
         {
             boolean recordFailedSpeculation = consistencyLevel != ConsistencyLevel.ALL;
             return new NeverSpeculatingReadExecutor(cfs, command, replicaPlan, queryStartNanoTime, recordFailedSpeculation);
@@ -207,6 +208,11 @@
             return new SpeculatingReadExecutor(cfs, command, replicaPlan, queryStartNanoTime);
     }
 
+    public boolean hasLocalRead()
+    {
+        return replicaPlan().lookup(FBUtilities.getBroadcastAddressAndPort()) != null;
+    }
+
     /**
      *  Returns true if speculation should occur and if it should then block until it is time to
      *  send the speculative reads
@@ -214,10 +220,16 @@
     boolean shouldSpeculateAndMaybeWait()
     {
         // no latency information, or we're overloaded
-        if (cfs.sampleReadLatencyNanos > command.getTimeout(NANOSECONDS))
+        if (cfs.sampleReadLatencyMicros > command.getTimeout(MICROSECONDS))
+        {
+            if (logger.isTraceEnabled())
+                logger.trace("Decided not to speculate as {} > {}", cfs.sampleReadLatencyMicros, command.getTimeout(MICROSECONDS));
             return false;
+        }
 
-        return !handler.await(cfs.sampleReadLatencyNanos, NANOSECONDS);
+        if (logger.isTraceEnabled())
+            logger.trace("Awaiting {} microseconds before speculating", cfs.sampleReadLatencyMicros);
+        return !handler.await(cfs.sampleReadLatencyMicros, MICROSECONDS);
     }
 
     ReplicaPlan.ForTokenRead replicaPlan()
@@ -263,7 +275,7 @@
             // We're hitting additional targets for read repair (??).  Since our "extra" replica is the least-
             // preferred by the snitch, we do an extra data read to start with against a replica more
             // likely to respond; better to let RR fail than the entire query.
-            super(cfs, command, replicaPlan, replicaPlan.blockFor() < replicaPlan.contacts().size() ? 2 : 1, queryStartNanoTime);
+            super(cfs, command, replicaPlan, replicaPlan.readQuorum() < replicaPlan.contacts().size() ? 2 : 1, queryStartNanoTime);
         }
 
         public void maybeTryAdditionalReplicas()
@@ -357,13 +369,18 @@
     public void setResult(PartitionIterator result)
     {
         Preconditions.checkState(this.result == null, "Result can only be set once");
-        this.result = DuplicateRowChecker.duringRead(result, this.replicaPlan.get().candidates().endpointList());
+        this.result = DuplicateRowChecker.duringRead(result, this.replicaPlan.get().readCandidates().endpointList());
+    }
+
+    public void awaitResponses() throws ReadTimeoutException
+    {
+        awaitResponses(false);
     }
 
     /**
      * Wait for the CL to be satisfied by responses
      */
-    public void awaitResponses() throws ReadTimeoutException
+    public void awaitResponses(boolean logBlockingReadRepairAttempt) throws ReadTimeoutException
     {
         try
         {
@@ -391,6 +408,13 @@
         {
             Tracing.trace("Digest mismatch: Mismatch for key {}", getKey());
             readRepair.startRepair(digestResolver, this::setResult);
+            if (logBlockingReadRepairAttempt)
+            {
+                logger.info("Blocking Read Repair triggered for query [{}] at CL.{} with endpoints {}",
+                            command.toCQLString(),
+                            replicaPlan().consistencyLevel(),
+                            replicaPlan().contacts());
+            }
         }
     }
 
diff --git a/src/java/org/apache/cassandra/service/reads/AlwaysSpeculativeRetryPolicy.java b/src/java/org/apache/cassandra/service/reads/AlwaysSpeculativeRetryPolicy.java
index a6092fb..506378e 100644
--- a/src/java/org/apache/cassandra/service/reads/AlwaysSpeculativeRetryPolicy.java
+++ b/src/java/org/apache/cassandra/service/reads/AlwaysSpeculativeRetryPolicy.java
@@ -19,7 +19,7 @@
 
 import com.google.common.base.Objects;
 
-import com.codahale.metrics.Snapshot;
+import org.apache.cassandra.metrics.SnapshottingTimer;
 
 public class AlwaysSpeculativeRetryPolicy implements SpeculativeRetryPolicy
 {
@@ -30,7 +30,7 @@
     }
 
     @Override
-    public long calculateThreshold(Snapshot latency, long existingValue)
+    public long calculateThreshold(SnapshottingTimer latency, long existingValue)
     {
         return 0;
     }
diff --git a/src/java/org/apache/cassandra/service/reads/DataResolver.java b/src/java/org/apache/cassandra/service/reads/DataResolver.java
index 6abb2ad..e7e4952 100644
--- a/src/java/org/apache/cassandra/service/reads/DataResolver.java
+++ b/src/java/org/apache/cassandra/service/reads/DataResolver.java
@@ -21,8 +21,11 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.function.Supplier;
 import java.util.function.UnaryOperator;
 
+import javax.annotation.Nullable;
+
 import com.google.common.base.Joiner;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -50,24 +53,25 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.reads.repair.NoopReadRepair;
 import org.apache.cassandra.service.reads.repair.ReadRepair;
 import org.apache.cassandra.service.reads.repair.RepairedDataTracker;
 import org.apache.cassandra.service.reads.repair.RepairedDataVerifier;
 
 import static com.google.common.collect.Iterables.*;
 
-public class DataResolver<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>> extends ResponseResolver<E, P>
+public class DataResolver<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>> extends ResponseResolver<E, P>
 {
     private final boolean enforceStrictLiveness;
     private final ReadRepair<E, P> readRepair;
     private final boolean trackRepairedStatus;
 
-    public DataResolver(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, ReadRepair<E, P> readRepair, long queryStartNanoTime)
+    public DataResolver(ReadCommand command, Supplier<? extends P> replicaPlan, ReadRepair<E, P> readRepair, long queryStartNanoTime)
     {
         this(command, replicaPlan, readRepair, queryStartNanoTime, false);
     }
 
-    public DataResolver(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, ReadRepair<E, P> readRepair, long queryStartNanoTime, boolean trackRepairedStatus)
+    public DataResolver(ReadCommand command, Supplier<? extends P> replicaPlan, ReadRepair<E, P> readRepair, long queryStartNanoTime, boolean trackRepairedStatus)
     {
         super(command, replicaPlan, queryStartNanoTime);
         this.enforceStrictLiveness = command.metadata().enforceStrictLiveness();
@@ -88,12 +92,17 @@
 
     public PartitionIterator resolve()
     {
+        return resolve(null);
+    }
+
+    public PartitionIterator resolve(@Nullable Runnable runOnShortRead)
+    {
         // We could get more responses while this method runs, which is ok (we're happy to ignore any response not here
         // at the beginning of this method), so grab the response count once and use that through the method.
         Collection<Message<ReadResponse>> messages = responses.snapshot();
         assert !any(messages, msg -> msg.payload.isDigestResponse());
 
-        E replicas = replicaPlan().candidates().select(transform(messages, Message::from), false);
+        E replicas = replicaPlan().readCandidates().select(transform(messages, Message::from), false);
 
         // If requested, inspect each response for a digest of the replica's repaired data set
         RepairedDataTracker repairedDataTracker = trackRepairedStatus
@@ -115,7 +124,7 @@
         {
             ResolveContext context = new ResolveContext(replicas);
             return resolveWithReadRepair(context,
-                                         i -> shortReadProtectedResponse(i, context),
+                                         i -> shortReadProtectedResponse(i, context, runOnShortRead),
                                          UnaryOperator.identity(),
                                          repairedDataTracker);
         }
@@ -181,13 +190,13 @@
         UnfilteredPartitionIterator getResponse(int i);
     }
 
-    private UnfilteredPartitionIterator shortReadProtectedResponse(int i, ResolveContext context)
+    private UnfilteredPartitionIterator shortReadProtectedResponse(int i, ResolveContext context, @Nullable Runnable onShortRead)
     {
         UnfilteredPartitionIterator originalResponse = responses.get(i).payload.makeIterator(command);
 
         return context.needShortReadProtection()
                ? ShortReadProtection.extend(context.replicas.get(i),
-                                            () -> responses.clearUnsafe(i),
+                                            () -> { responses.clearUnsafe(i); if (onShortRead != null) onShortRead.run(); },
                                             originalResponse,
                                             command,
                                             context.mergedResultCounter,
@@ -202,9 +211,9 @@
                                                     RepairedDataTracker repairedDataTracker)
     {
         UnfilteredPartitionIterators.MergeListener listener = null;
-        if (context.needsReadRepair())
+        if (context.needsReadRepair() && readRepair != NoopReadRepair.instance)
         {
-            P sources = replicaPlan.getWithContacts(context.replicas);
+            P sources = replicaPlan.get().withContacts(context.replicas);
             listener = wrapMergeListener(readRepair.getMergeListener(sources), sources, repairedDataTracker);
         }
 
@@ -244,7 +253,7 @@
 
         PartitionIterator firstPhasePartitions = resolveInternal(firstPhaseContext,
                                                                  rfp.mergeController(),
-                                                                 i -> shortReadProtectedResponse(i, firstPhaseContext),
+                                                                 i -> shortReadProtectedResponse(i, firstPhaseContext, null),
                                                                  UnaryOperator.identity());
 
         PartitionIterator completedPartitions = resolveWithReadRepair(secondPhaseContext,
@@ -285,6 +294,7 @@
         Filter filter = new Filter(command.nowInSec(), command.metadata().enforceStrictLiveness());
         FilteredPartitions filtered = FilteredPartitions.filter(merged, filter);
         PartitionIterator counted = Transformation.apply(preCountFilter.apply(filtered), context.mergedResultCounter);
+
         return Transformation.apply(counted, new EmptyPartitionsDiscarder());
     }
 
diff --git a/src/java/org/apache/cassandra/service/reads/DigestResolver.java b/src/java/org/apache/cassandra/service/reads/DigestResolver.java
index 475c8c2..f799374 100644
--- a/src/java/org/apache/cassandra/service/reads/DigestResolver.java
+++ b/src/java/org/apache/cassandra/service/reads/DigestResolver.java
@@ -38,8 +38,9 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 import static com.google.common.collect.Iterables.any;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
-public class DigestResolver<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>> extends ResponseResolver<E, P>
+public class DigestResolver<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>> extends ResponseResolver<E, P>
 {
     private volatile Message<ReadResponse> dataResponse;
 
@@ -102,7 +103,7 @@
 
     public boolean responsesMatch()
     {
-        long start = System.nanoTime();
+        long start = nanoTime();
 
         // validate digests against each other; return false immediately on mismatch.
         ByteBuffer digest = null;
@@ -126,7 +127,7 @@
         }
 
         if (logger.isTraceEnabled())
-            logger.trace("responsesMatch: {} ms.", TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start));
+            logger.trace("responsesMatch: {} ms.", TimeUnit.NANOSECONDS.toMillis(nanoTime() - start));
 
         return true;
     }
diff --git a/src/java/org/apache/cassandra/service/reads/FixedSpeculativeRetryPolicy.java b/src/java/org/apache/cassandra/service/reads/FixedSpeculativeRetryPolicy.java
index 9bbeb12..7338b2c 100644
--- a/src/java/org/apache/cassandra/service/reads/FixedSpeculativeRetryPolicy.java
+++ b/src/java/org/apache/cassandra/service/reads/FixedSpeculativeRetryPolicy.java
@@ -23,8 +23,8 @@
 
 import com.google.common.base.Objects;
 
-import com.codahale.metrics.Snapshot;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.metrics.SnapshottingTimer;
 import org.apache.cassandra.schema.TableParams;
 
 public class FixedSpeculativeRetryPolicy implements SpeculativeRetryPolicy
@@ -39,9 +39,9 @@
     }
 
     @Override
-    public long calculateThreshold(Snapshot latency, long existingValue)
+    public long calculateThreshold(SnapshottingTimer latency, long existingValue)
     {
-        return TimeUnit.MILLISECONDS.toNanos(speculateAtMilliseconds);
+        return TimeUnit.MILLISECONDS.toMicros(speculateAtMilliseconds);
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/service/reads/HybridSpeculativeRetryPolicy.java b/src/java/org/apache/cassandra/service/reads/HybridSpeculativeRetryPolicy.java
index 8228c45..fedec23 100644
--- a/src/java/org/apache/cassandra/service/reads/HybridSpeculativeRetryPolicy.java
+++ b/src/java/org/apache/cassandra/service/reads/HybridSpeculativeRetryPolicy.java
@@ -23,8 +23,8 @@
 import com.google.common.base.Objects;
 
 import com.codahale.metrics.Snapshot;
-import com.codahale.metrics.Timer;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.metrics.SnapshottingTimer;
 import org.apache.cassandra.schema.TableParams;
 
 public class HybridSpeculativeRetryPolicy implements SpeculativeRetryPolicy
@@ -57,11 +57,15 @@
     }
 
     @Override
-    public long calculateThreshold(Snapshot latency, long existingValue)
+    public long calculateThreshold(SnapshottingTimer latency, long existingValue)
     {
-        if (latency.size() <= 0)
+        Snapshot snapshot = latency.getPercentileSnapshot();
+        
+        if (snapshot.size() <= 0)
             return existingValue;
-        return function.call(percentilePolicy.calculateThreshold(latency, existingValue), fixedPolicy.calculateThreshold(latency, existingValue));
+        
+        return function.call(percentilePolicy.calculateThreshold(snapshot, existingValue), 
+                             fixedPolicy.calculateThreshold(null, existingValue));
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/service/reads/NeverSpeculativeRetryPolicy.java b/src/java/org/apache/cassandra/service/reads/NeverSpeculativeRetryPolicy.java
index 1211142..5ed7585 100644
--- a/src/java/org/apache/cassandra/service/reads/NeverSpeculativeRetryPolicy.java
+++ b/src/java/org/apache/cassandra/service/reads/NeverSpeculativeRetryPolicy.java
@@ -19,7 +19,7 @@
 
 import com.google.common.base.Objects;
 
-import com.codahale.metrics.Snapshot;
+import org.apache.cassandra.metrics.SnapshottingTimer;
 
 public class NeverSpeculativeRetryPolicy implements SpeculativeRetryPolicy
 {
@@ -30,7 +30,7 @@
     }
 
     @Override
-    public long calculateThreshold(Snapshot latency, long existingValue)
+    public long calculateThreshold(SnapshottingTimer latency, long existingValue)
     {
         return Long.MAX_VALUE;
     }
diff --git a/src/java/org/apache/cassandra/service/reads/PercentileSpeculativeRetryPolicy.java b/src/java/org/apache/cassandra/service/reads/PercentileSpeculativeRetryPolicy.java
index ffd473e..a084a0f 100644
--- a/src/java/org/apache/cassandra/service/reads/PercentileSpeculativeRetryPolicy.java
+++ b/src/java/org/apache/cassandra/service/reads/PercentileSpeculativeRetryPolicy.java
@@ -27,6 +27,7 @@
 
 import com.codahale.metrics.Snapshot;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.metrics.SnapshottingTimer;
 import org.apache.cassandra.schema.TableParams;
 
 public class PercentileSpeculativeRetryPolicy implements SpeculativeRetryPolicy
@@ -47,11 +48,17 @@
     }
 
     @Override
-    public long calculateThreshold(Snapshot latency, long existingValue)
+    public long calculateThreshold(SnapshottingTimer latency, long existingValue)
     {
-        if (latency.size() <= 0)
+        return calculateThreshold(latency.getPercentileSnapshot(), existingValue);
+    }
+
+    public long calculateThreshold(Snapshot snapshot, long existingValue)
+    {
+        if (snapshot.size() <= 0)
             return existingValue;
-        return (long) latency.getValue(percentile / 100);
+        // latency snapshot uses a default timer so is in microseconds, so just return percentile
+        return (long) snapshot.getValue(percentile / 100);
     }
 
     @Override
diff --git a/src/java/org/apache/cassandra/service/reads/ReadCallback.java b/src/java/org/apache/cassandra/service/reads/ReadCallback.java
index 91d9370..e69e6bd 100644
--- a/src/java/org/apache/cassandra/service/reads/ReadCallback.java
+++ b/src/java/org/apache/cassandra/service/reads/ReadCallback.java
@@ -21,9 +21,12 @@
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.MessageParams;
 import org.apache.cassandra.locator.ReplicaPlan;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -35,20 +38,29 @@
 import org.apache.cassandra.exceptions.RequestFailureReason;
 import org.apache.cassandra.locator.Endpoints;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.ParamType;
+import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.service.reads.thresholds.CoordinatorWarnings;
+import org.apache.cassandra.service.reads.thresholds.WarningContext;
+import org.apache.cassandra.service.reads.thresholds.WarningsSnapshot;
 import org.apache.cassandra.tracing.Tracing;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.atomic.AtomicIntegerFieldUpdater.newUpdater;
+import static org.apache.cassandra.tracing.Tracing.isTracing;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
-public class ReadCallback<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>> implements RequestCallback<ReadResponse>
+public class ReadCallback<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>> implements RequestCallback<ReadResponse>
 {
-    protected static final Logger logger = LoggerFactory.getLogger( ReadCallback.class );
+    protected static final Logger logger = LoggerFactory.getLogger(ReadCallback.class);
 
     public final ResponseResolver<E, P> resolver;
-    final SimpleCondition condition = new SimpleCondition();
+    final Condition condition = newOneTimeCondition();
     private final long queryStartNanoTime;
     final int blockFor; // TODO: move to replica plan as well?
     // this uses a plain reference, but is initialised before handoff to any other threads; the later updates
@@ -56,9 +68,12 @@
     final ReplicaPlan.Shared<E, P> replicaPlan;
     private final ReadCommand command;
     private static final AtomicIntegerFieldUpdater<ReadCallback> failuresUpdater
-            = AtomicIntegerFieldUpdater.newUpdater(ReadCallback.class, "failures");
+            = newUpdater(ReadCallback.class, "failures");
     private volatile int failures = 0;
     private final Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint;
+    private volatile WarningContext warningContext;
+    private static final AtomicReferenceFieldUpdater<ReadCallback, WarningContext> warningsUpdater
+        = AtomicReferenceFieldUpdater.newUpdater(ReadCallback.class, WarningContext.class, "warningContext");
 
     public ReadCallback(ResponseResolver<E, P> resolver, ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
     {
@@ -66,7 +81,7 @@
         this.resolver = resolver;
         this.queryStartNanoTime = queryStartNanoTime;
         this.replicaPlan = replicaPlan;
-        this.blockFor = replicaPlan.get().blockFor();
+        this.blockFor = replicaPlan.get().readQuorum();
         this.failureReasonByEndpoint = new ConcurrentHashMap<>();
         // we don't support read repair (or rapid read protection) for range scans yet (CASSANDRA-6897)
         assert !(command instanceof PartitionRangeReadCommand) || blockFor >= replicaPlan().contacts().size();
@@ -82,14 +97,14 @@
 
     public boolean await(long timePastStart, TimeUnit unit)
     {
-        long time = unit.toNanos(timePastStart) - (System.nanoTime() - queryStartNanoTime);
+        long time = unit.toNanos(timePastStart) - (nanoTime() - queryStartNanoTime);
         try
         {
-            return condition.await(time, TimeUnit.NANOSECONDS);
+            return condition.await(time, NANOSECONDS);
         }
-        catch (InterruptedException ex)
+        catch (InterruptedException e)
         {
-            throw new AssertionError(ex);
+            throw new UncheckedInterruptedException(e);
         }
     }
 
@@ -105,10 +120,22 @@
          */
         int received = resolver.responses.size();
         boolean failed = failures > 0 && (blockFor > received || !resolver.isDataPresent());
+        WarningContext warnings = warningContext;
+        // save the snapshot so abort state is not changed between now and when mayAbort gets called
+        WarningsSnapshot snapshot = null;
+        if (warnings != null)
+        {
+            snapshot = warnings.snapshot();
+            // this is possible due to a race condition between waiting and responding
+            // network thread creates the WarningContext to update metrics, but we are actively reading and see it is empty
+            // this is likely to happen when a timeout happens or from a speculative response
+            if (!snapshot.isEmpty())
+                CoordinatorWarnings.update(command, snapshot);
+        }
         if (signaled && !failed)
             return;
 
-        if (Tracing.isTracing())
+        if (isTracing())
         {
             String gotData = received > 0 ? (resolver.isDataPresent() ? " (including data)" : " (only digests)") : "";
             Tracing.trace("{}; received {} of {} responses{}", failed ? "Failed" : "Timed out", received, blockFor, gotData);
@@ -119,6 +146,9 @@
             logger.debug("{}; received {} of {} responses{}", failed ? "Failed" : "Timed out", received, blockFor, gotData);
         }
 
+        if (snapshot != null)
+            snapshot.maybeAbort(command, replicaPlan().consistencyLevel(), received, blockFor, resolver.isDataPresent(), failureReasonByEndpoint);
+
         // Same as for writes, see AbstractWriteResponseHandler
         throw failed
             ? new ReadFailureException(replicaPlan().consistencyLevel(), received, blockFor, resolver.isDataPresent(), failureReasonByEndpoint)
@@ -134,6 +164,17 @@
     public void onResponse(Message<ReadResponse> message)
     {
         assertWaitingFor(message.from());
+        Map<ParamType, Object> params = message.header.params();
+        InetAddressAndPort from = message.from();
+        if (WarningContext.isSupported(params.keySet()))
+        {
+            RequestFailureReason reason = getWarningContext().updateCounters(params, from);
+            if (reason != null)
+            {
+                onFailure(message.from(), reason);
+                return;
+            }
+        }
         resolver.preprocess(message);
 
         /*
@@ -146,14 +187,28 @@
             condition.signalAll();
     }
 
+    private WarningContext getWarningContext()
+    {
+        WarningContext current;
+        do {
+
+            current = warningContext;
+            if (current != null)
+                return current;
+
+            current = new WarningContext();
+        } while (!warningsUpdater.compareAndSet(this, null, current));
+        return current;
+    }
+
     public void response(ReadResponse result)
     {
         Verb kind = command.isRangeRequest() ? Verb.RANGE_RSP : Verb.READ_RSP;
         Message<ReadResponse> message = Message.internalResponse(kind, result);
+        message = MessageParams.addToMessage(message);
         onResponse(message);
     }
 
-
     @Override
     public boolean trackLatencyForSnitch()
     {
diff --git a/src/java/org/apache/cassandra/service/reads/ResponseResolver.java b/src/java/org/apache/cassandra/service/reads/ResponseResolver.java
index 6ae19ac..02e565d 100644
--- a/src/java/org/apache/cassandra/service/reads/ResponseResolver.java
+++ b/src/java/org/apache/cassandra/service/reads/ResponseResolver.java
@@ -17,6 +17,8 @@
  */
 package org.apache.cassandra.service.reads;
 
+import java.util.function.Supplier;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -27,22 +29,23 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.utils.concurrent.Accumulator;
 
-public abstract class ResponseResolver<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+public abstract class ResponseResolver<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
 {
     protected static final Logger logger = LoggerFactory.getLogger(ResponseResolver.class);
 
     protected final ReadCommand command;
-    protected final ReplicaPlan.Shared<E, P> replicaPlan;
+    // TODO: this doesn't need to be a full ReplicaPlan; just a replica collection
+    protected final Supplier<? extends P> replicaPlan;
 
     // Accumulator gives us non-blocking thread-safety with optimal algorithmic constraints
     protected final Accumulator<Message<ReadResponse>> responses;
     protected final long queryStartNanoTime;
 
-    public ResponseResolver(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
+    public ResponseResolver(ReadCommand command, Supplier<? extends P> replicaPlan, long queryStartNanoTime)
     {
         this.command = command;
         this.replicaPlan = replicaPlan;
-        this.responses = new Accumulator<>(replicaPlan.get().candidates().size());
+        this.responses = new Accumulator<>(replicaPlan.get().readCandidates().size());
         this.queryStartNanoTime = queryStartNanoTime;
     }
 
diff --git a/src/java/org/apache/cassandra/service/reads/ShortReadPartitionsProtection.java b/src/java/org/apache/cassandra/service/reads/ShortReadPartitionsProtection.java
index 51043c3..f49c9fb 100644
--- a/src/java/org/apache/cassandra/service/reads/ShortReadPartitionsProtection.java
+++ b/src/java/org/apache/cassandra/service/reads/ShortReadPartitionsProtection.java
@@ -174,7 +174,7 @@
         return executeReadCommand(cmd.withUpdatedLimitsAndDataRange(newLimits, newDataRange), ReplicaPlan.shared(replicaPlan));
     }
 
-    private <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+    private <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
     UnfilteredPartitionIterator executeReadCommand(ReadCommand cmd, ReplicaPlan.Shared<E, P> replicaPlan)
     {
         DataResolver<E, P> resolver = new DataResolver<>(cmd, replicaPlan, (NoopReadRepair<E, P>)NoopReadRepair.instance, queryStartNanoTime);
diff --git a/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java b/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java
index a1bdc0e..8bf877f 100644
--- a/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java
+++ b/src/java/org/apache/cassandra/service/reads/ShortReadProtection.java
@@ -18,15 +18,12 @@
 
 package org.apache.cassandra.service.reads;
 
-import java.net.InetAddress;
-
 
 import org.apache.cassandra.db.ReadCommand;
 import org.apache.cassandra.db.filter.DataLimits;
 import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
 import org.apache.cassandra.db.transform.MorePartitions;
 import org.apache.cassandra.db.transform.Transformation;
-import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 
 /**
diff --git a/src/java/org/apache/cassandra/service/reads/SpeculativeRetryPolicy.java b/src/java/org/apache/cassandra/service/reads/SpeculativeRetryPolicy.java
index e09ff51..1164076 100644
--- a/src/java/org/apache/cassandra/service/reads/SpeculativeRetryPolicy.java
+++ b/src/java/org/apache/cassandra/service/reads/SpeculativeRetryPolicy.java
@@ -17,8 +17,8 @@
  */
 package org.apache.cassandra.service.reads;
 
-import com.codahale.metrics.Snapshot;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.metrics.SnapshottingTimer;
 import org.apache.cassandra.schema.TableParams;
 
 public interface SpeculativeRetryPolicy
@@ -28,7 +28,14 @@
         NEVER, FIXED, PERCENTILE, HYBRID, ALWAYS
     }
 
-    long calculateThreshold(Snapshot latency, long existingValue);
+    /**
+     * Calculate the delay in microseconds after which speculation takes place
+     *
+     * @param latency       snapshot of coordinator latencies (in microseconds)
+     * @param existingValue existing speculation threshold (in microseconds)
+     * @return speculation delay (in microseconds).
+     */
+    long calculateThreshold(SnapshottingTimer latency, long existingValue);
 
     Kind kind();
 
diff --git a/src/java/org/apache/cassandra/service/reads/range/RangeCommandIterator.java b/src/java/org/apache/cassandra/service/reads/range/RangeCommandIterator.java
index 38014e2..b353b4b 100644
--- a/src/java/org/apache/cassandra/service/reads/range/RangeCommandIterator.java
+++ b/src/java/org/apache/cassandra/service/reads/range/RangeCommandIterator.java
@@ -19,6 +19,7 @@
 package org.apache.cassandra.service.reads.range;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 
@@ -34,6 +35,7 @@
 import org.apache.cassandra.db.filter.DataLimits;
 import org.apache.cassandra.db.partitions.PartitionIterator;
 import org.apache.cassandra.db.rows.RowIterator;
+import org.apache.cassandra.exceptions.ReadAbortException;
 import org.apache.cassandra.exceptions.ReadFailureException;
 import org.apache.cassandra.exceptions.ReadTimeoutException;
 import org.apache.cassandra.exceptions.UnavailableException;
@@ -51,7 +53,10 @@
 import org.apache.cassandra.utils.AbstractIterator;
 import org.apache.cassandra.utils.CloseableIterator;
 
-class RangeCommandIterator extends AbstractIterator<RowIterator> implements PartitionIterator
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+@VisibleForTesting
+public class RangeCommandIterator extends AbstractIterator<RowIterator> implements PartitionIterator
 {
     private static final Logger logger = LoggerFactory.getLogger(RangeCommandIterator.class);
 
@@ -89,7 +94,7 @@
         this.totalRangeCount = totalRangeCount;
         this.queryStartNanoTime = queryStartNanoTime;
 
-        startTime = System.nanoTime();
+        startTime = nanoTime();
         enforceStrictLiveness = command.metadata().enforceStrictLiveness();
     }
 
@@ -122,11 +127,18 @@
         catch (UnavailableException e)
         {
             rangeMetrics.unavailables.mark();
+            StorageProxy.logRequestException(e, Collections.singleton(command));
             throw e;
         }
         catch (ReadTimeoutException e)
         {
             rangeMetrics.timeouts.mark();
+            StorageProxy.logRequestException(e, Collections.singleton(command));
+            throw e;
+        }
+        catch (ReadAbortException e)
+        {
+            rangeMetrics.markAbort(e);
             throw e;
         }
         catch (ReadFailureException e)
@@ -256,7 +268,7 @@
         }
         finally
         {
-            long latency = System.nanoTime() - startTime;
+            long latency = nanoTime() - startTime;
             rangeMetrics.addNano(latency);
             Keyspace.openAndGetStore(command.metadata()).metric.coordinatorScanLatency.update(latency, TimeUnit.NANOSECONDS);
         }
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 3452a35..5b656d7 100644
--- a/src/java/org/apache/cassandra/service/reads/range/RangeCommands.java
+++ b/src/java/org/apache/cassandra/service/reads/range/RangeCommands.java
@@ -24,10 +24,14 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DataRange;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.PartitionRangeReadCommand;
 import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.exceptions.UnavailableException;
 import org.apache.cassandra.index.Index;
+import org.apache.cassandra.locator.ReplicaPlans;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.FBUtilities;
 import org.assertj.core.util.VisibleForTesting;
@@ -114,4 +118,26 @@
         return (maxExpectedResults / DatabaseDescriptor.getNumTokens())
                / keyspace.getReplicationStrategy().getReplicationFactor().allReplicas;
     }
+
+    /**
+     * Added specifically to check for sufficient nodes live to serve partition denylist queries
+     */
+    public static boolean sufficientLiveNodesForSelectStar(TableMetadata metadata, ConsistencyLevel consistency)
+    {
+        try
+        {
+            Keyspace keyspace = Keyspace.open(metadata.keyspace);
+            ReplicaPlanIterator rangeIterator = new ReplicaPlanIterator(DataRange.allData(metadata.partitioner).keyRange(),
+                                                                        keyspace, consistency);
+
+            // Called for the side effect of running assureSufficientLiveReplicasForRead.
+            // Deliberately called with an invalid vnode count in case it is used elsewhere in the future..
+            rangeIterator.forEachRemaining(r ->  ReplicaPlans.forRangeRead(keyspace, consistency, r.range(), -1));
+            return true;
+        }
+        catch (UnavailableException e)
+        {
+            return false;
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/service/reads/repair/AbstractReadRepair.java b/src/java/org/apache/cassandra/service/reads/repair/AbstractReadRepair.java
index 086766e..28f94fd 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/AbstractReadRepair.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/AbstractReadRepair.java
@@ -23,6 +23,9 @@
 import com.codahale.metrics.Meter;
 import com.google.common.base.Preconditions;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -44,10 +47,13 @@
 import org.apache.cassandra.service.reads.ReadCallback;
 import org.apache.cassandra.tracing.Tracing;
 
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
 
-public abstract class AbstractReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>> implements ReadRepair<E, P>
+public abstract class AbstractReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
+        implements ReadRepair<E, P>
 {
+    protected static final Logger logger = LoggerFactory.getLogger(AbstractReadRepair.class);
+
     protected final ReadCommand command;
     protected final long queryStartNanoTime;
     protected final ReplicaPlan.Shared<E, P> replicaPlan;
@@ -55,7 +61,7 @@
 
     private volatile DigestRepair<E, P> digestRepair = null;
 
-    private static class DigestRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+    private static class DigestRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
     {
         private final DataResolver<E, P> dataResolver;
         private final ReadCallback<E, P> readCallback;
@@ -153,7 +159,17 @@
         if (repair == null)
             return;
 
-        repair.readCallback.awaitResults();
+        try
+        {
+            repair.readCallback.awaitResults();
+        }
+        catch (ReadTimeoutException e)
+        {
+            ReadRepairMetrics.timedOut.mark();
+            if (logger.isDebugEnabled() )
+                logger.debug("Timed out merging read repair responses", e);
+            throw e;
+        }
         repair.resultConsumer.accept(digestRepair.dataResolver.resolve());
     }
 
@@ -163,7 +179,7 @@
         ConsistencyLevel speculativeCL = consistency.isDatacenterLocal() ? ConsistencyLevel.LOCAL_QUORUM : ConsistencyLevel.QUORUM;
         return  consistency != ConsistencyLevel.EACH_QUORUM
                 && consistency.satisfies(speculativeCL, replicaPlan.get().replicationStrategy())
-                && cfs.sampleReadLatencyNanos <= command.getTimeout(NANOSECONDS);
+                && cfs.sampleReadLatencyMicros <= command.getTimeout(MICROSECONDS);
     }
 
     public void maybeSendAdditionalReads()
@@ -174,7 +190,7 @@
         if (repair == null)
             return;
 
-        if (shouldSpeculate() && !repair.readCallback.await(cfs.sampleReadLatencyNanos, NANOSECONDS))
+        if (shouldSpeculate() && !repair.readCallback.await(cfs.sampleReadLatencyMicros, MICROSECONDS))
         {
             Replica uncontacted = replicaPlan().firstUncontactedCandidate(replica -> true);
             if (uncontacted == null)
diff --git a/src/java/org/apache/cassandra/service/reads/repair/BlockingPartitionRepair.java b/src/java/org/apache/cassandra/service/reads/repair/BlockingPartitionRepair.java
index edcf14d..c8b0e29 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/BlockingPartitionRepair.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/BlockingPartitionRepair.java
@@ -21,7 +21,9 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.CountDownLatch;
+
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.function.Predicate;
 
@@ -30,7 +32,6 @@
 import com.google.common.base.Predicates;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.AbstractFuture;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.ConsistencyLevel;
@@ -38,46 +39,48 @@
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
-import org.apache.cassandra.locator.Endpoints;
 import org.apache.cassandra.locator.EndpointsForToken;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.locator.ReplicaPlan;
 import org.apache.cassandra.locator.Replicas;
-import org.apache.cassandra.locator.InOurDcTester;
+import org.apache.cassandra.locator.InOurDc;
 import org.apache.cassandra.metrics.ReadRepairMetrics;
 import org.apache.cassandra.net.RequestCallback;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.tracing.Tracing;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static org.apache.cassandra.net.Verb.*;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.CountDownLatch.newCountDownLatch;
 
 public class BlockingPartitionRepair
-        extends AbstractFuture<Object> implements RequestCallback<Object>
+        extends AsyncFuture<Object> implements RequestCallback<Object>
 {
     private final DecoratedKey key;
-    private final ReplicaPlan.ForTokenWrite writePlan;
+    private final ReplicaPlan.ForWrite writePlan;
     private final Map<Replica, Mutation> pendingRepairs;
     private final CountDownLatch latch;
     private final Predicate<InetAddressAndPort> shouldBlockOn;
 
     private volatile long mutationsSentTime;
 
-    public BlockingPartitionRepair(DecoratedKey key, Map<Replica, Mutation> repairs, ReplicaPlan.ForTokenWrite writePlan)
+    public BlockingPartitionRepair(DecoratedKey key, Map<Replica, Mutation> repairs, ReplicaPlan.ForWrite writePlan)
     {
         this(key, repairs, writePlan,
-             writePlan.consistencyLevel().isDatacenterLocal() ? InOurDcTester.endpoints() : Predicates.alwaysTrue());
+             writePlan.consistencyLevel().isDatacenterLocal() ? InOurDc.endpoints() : Predicates.alwaysTrue());
     }
-    public BlockingPartitionRepair(DecoratedKey key, Map<Replica, Mutation> repairs, ReplicaPlan.ForTokenWrite writePlan, Predicate<InetAddressAndPort> shouldBlockOn)
+    public BlockingPartitionRepair(DecoratedKey key, Map<Replica, Mutation> repairs, ReplicaPlan.ForWrite writePlan, Predicate<InetAddressAndPort> shouldBlockOn)
     {
         this.key = key;
         this.pendingRepairs = new ConcurrentHashMap<>(repairs);
         this.writePlan = writePlan;
         this.shouldBlockOn = shouldBlockOn;
 
-        int blockFor = writePlan.blockFor();
+        int blockFor = writePlan.writeQuorum();
         // here we remove empty repair mutations from the block for total, since
         // we're not sending them mutations
         for (Replica participant : writePlan.contacts())
@@ -93,18 +96,18 @@
         // empty mutations. If we'd also speculated on either of the read stages, the number
         // of empty mutations would be greater than blockFor, causing the latch ctor to throw
         // an illegal argument exception due to a negative start value. So here we clamp it 0
-        latch = new CountDownLatch(Math.max(blockFor, 0));
+        latch = newCountDownLatch(Math.max(blockFor, 0));
     }
 
     int blockFor()
     {
-        return writePlan.blockFor();
+        return writePlan.writeQuorum();
     }
 
     @VisibleForTesting
     int waitingOn()
     {
-        return (int) latch.getCount();
+        return (int) latch.count();
     }
 
     @VisibleForTesting
@@ -113,7 +116,7 @@
         if (shouldBlockOn.test(from))
         {
             pendingRepairs.remove(writePlan.lookup(from));
-            latch.countDown();
+            latch.decrement();
         }
     }
 
@@ -146,7 +149,7 @@
 
     public void sendInitialRepairs()
     {
-        mutationsSentTime = System.nanoTime();
+        mutationsSentTime = nanoTime();
         Replicas.assertFull(pendingRepairs.keySet());
 
         for (Map.Entry<Replica, Mutation> entry: pendingRepairs.entrySet())
@@ -177,14 +180,14 @@
     public boolean awaitRepairsUntil(long timeoutAt, TimeUnit timeUnit)
     {
         long timeoutAtNanos = timeUnit.toNanos(timeoutAt);
-        long remaining = timeoutAtNanos - System.nanoTime();
+        long remaining = timeoutAtNanos - nanoTime();
         try
         {
             return latch.await(remaining, TimeUnit.NANOSECONDS);
         }
         catch (InterruptedException e)
         {
-            throw new AssertionError(e);
+            throw new UncheckedInterruptedException(e);
         }
     }
 
diff --git a/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepair.java b/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepair.java
index fdc8b50..9143a47 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepair.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/BlockingReadRepair.java
@@ -21,7 +21,6 @@
 import java.util.Map;
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.TimeUnit;
 
 import org.apache.cassandra.db.DecoratedKey;
 import org.slf4j.Logger;
@@ -39,6 +38,7 @@
 import org.apache.cassandra.metrics.ReadRepairMetrics;
 import org.apache.cassandra.tracing.Tracing;
 
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
 
 /**
@@ -46,7 +46,7 @@
  *  updates have been written to nodes needing correction. Breaks write
  *  atomicity in some situations
  */
-public class BlockingReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+public class BlockingReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
         extends AbstractReadRepair<E, P>
 {
     private static final Logger logger = LoggerFactory.getLogger(BlockingReadRepair.class);
@@ -74,7 +74,7 @@
     {
         for (BlockingPartitionRepair repair: repairs)
         {
-            repair.maybeSendAdditionalWrites(cfs.additionalWriteLatencyNanos, TimeUnit.NANOSECONDS);
+            repair.maybeSendAdditionalWrites(cfs.additionalWriteLatencyMicros, MICROSECONDS);
         }
     }
 
@@ -106,7 +106,7 @@
     }
 
     @Override
-    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForTokenWrite writePlan)
+    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForWrite writePlan)
     {
         BlockingPartitionRepair blockingRepair = new BlockingPartitionRepair(partitionKey, mutations, writePlan);
         blockingRepair.sendInitialRepairs();
diff --git a/src/java/org/apache/cassandra/service/reads/repair/NoopReadRepair.java b/src/java/org/apache/cassandra/service/reads/repair/NoopReadRepair.java
index b65f3fc..5cf72b3 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/NoopReadRepair.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/NoopReadRepair.java
@@ -34,7 +34,7 @@
 /**
  * Bypasses the read repair path for short read protection and testing
  */
-public class NoopReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>> implements ReadRepair<E, P>
+public class NoopReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>> implements ReadRepair<E, P>
 {
     public static final NoopReadRepair instance = new NoopReadRepair();
 
@@ -75,7 +75,7 @@
     }
 
     @Override
-    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForTokenWrite writePlan)
+    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForWrite writePlan)
     {
 
     }
diff --git a/src/java/org/apache/cassandra/service/reads/repair/PartitionIteratorMergeListener.java b/src/java/org/apache/cassandra/service/reads/repair/PartitionIteratorMergeListener.java
index 7247704..f77bd4d 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/PartitionIteratorMergeListener.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/PartitionIteratorMergeListener.java
@@ -21,7 +21,6 @@
 import java.util.List;
 
 import org.apache.cassandra.db.Columns;
-import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.ReadCommand;
 import org.apache.cassandra.db.RegularAndStaticColumns;
@@ -34,11 +33,11 @@
 public class PartitionIteratorMergeListener<E extends Endpoints<E>>
         implements UnfilteredPartitionIterators.MergeListener
 {
-    private final ReplicaPlan.ForRead<E> replicaPlan;
+    private final ReplicaPlan.ForRead<E, ?> replicaPlan;
     private final ReadCommand command;
     private final ReadRepair readRepair;
 
-    public PartitionIteratorMergeListener(ReplicaPlan.ForRead<E> replicaPlan, ReadCommand command, ReadRepair readRepair)
+    public PartitionIteratorMergeListener(ReplicaPlan.ForRead<E, ?> replicaPlan, ReadCommand command, ReadRepair readRepair)
     {
         this.replicaPlan = replicaPlan;
         this.command = command;
diff --git a/src/java/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepair.java b/src/java/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepair.java
index d9293fb..72a1298 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepair.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepair.java
@@ -34,7 +34,7 @@
  * Only performs the collection of data responses and reconciliation of them, doesn't send repair mutations
  * to replicas. This preserves write atomicity, but doesn't provide monotonic quorum reads
  */
-public class ReadOnlyReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+public class ReadOnlyReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
         extends AbstractReadRepair<E, P>
 {
     ReadOnlyReadRepair(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
@@ -61,7 +61,7 @@
     }
 
     @Override
-    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForTokenWrite writePlan)
+    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForWrite writePlan)
     {
         throw new UnsupportedOperationException("ReadOnlyReadRepair shouldn't be trying to repair partitions");
     }
diff --git a/src/java/org/apache/cassandra/service/reads/repair/ReadRepair.java b/src/java/org/apache/cassandra/service/reads/repair/ReadRepair.java
index 4747651..a6a9be2 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/ReadRepair.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/ReadRepair.java
@@ -19,7 +19,6 @@
 
 import java.util.Map;
 import java.util.function.Consumer;
-import java.util.function.Supplier;
 
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.locator.Endpoints;
@@ -33,15 +32,15 @@
 import org.apache.cassandra.locator.ReplicaPlan;
 import org.apache.cassandra.service.reads.DigestResolver;
 
-public interface ReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+public interface ReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
 {
     public interface Factory
     {
-        <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+        <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
         ReadRepair<E, P> create(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime);
     }
 
-    static <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+    static <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
     ReadRepair<E, P> create(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
     {
         return command.metadata().params.readRepair.create(command, replicaPlan, queryStartNanoTime);
@@ -93,5 +92,5 @@
      * Repairs a partition _after_ receiving data responses. This method receives replica list, since
      * we will block repair only on the replicas that have responded.
      */
-    void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForTokenWrite writePlan);
+    void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForWrite writePlan);
 }
diff --git a/src/java/org/apache/cassandra/service/reads/repair/ReadRepairDiagnostics.java b/src/java/org/apache/cassandra/service/reads/repair/ReadRepairDiagnostics.java
index b9167bd..0443c3f 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/ReadRepairDiagnostics.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/ReadRepairDiagnostics.java
@@ -25,7 +25,6 @@
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.diag.DiagnosticEventService;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.locator.ReplicaLayout;
 import org.apache.cassandra.locator.ReplicaPlan;
 import org.apache.cassandra.service.reads.DigestResolver;
 import org.apache.cassandra.service.reads.repair.PartitionRepairEvent.PartitionRepairEventType;
@@ -39,22 +38,22 @@
     {
     }
 
-    static void startRepair(AbstractReadRepair readRepair, ReplicaPlan.ForRead<?> fullPlan, DigestResolver digestResolver)
+    static void startRepair(AbstractReadRepair readRepair, ReplicaPlan.ForRead<?, ?> fullPlan, DigestResolver digestResolver)
     {
         if (service.isEnabled(ReadRepairEvent.class, ReadRepairEventType.START_REPAIR))
             service.publish(new ReadRepairEvent(ReadRepairEventType.START_REPAIR,
                                                 readRepair,
                                                 fullPlan.contacts().endpoints(),
-                                                fullPlan.candidates().endpoints(), digestResolver));
+                                                fullPlan.readCandidates().endpoints(), digestResolver));
     }
 
     static void speculatedRead(AbstractReadRepair readRepair, InetAddressAndPort endpoint,
-                               ReplicaPlan.ForRead<?> fullPlan)
+                               ReplicaPlan.ForRead<?, ?> fullPlan)
     {
         if (service.isEnabled(ReadRepairEvent.class, ReadRepairEventType.SPECULATED_READ))
             service.publish(new ReadRepairEvent(ReadRepairEventType.SPECULATED_READ,
                                                 readRepair, Collections.singletonList(endpoint),
-                                                Lists.newArrayList(fullPlan.candidates().endpoints()), null));
+                                                Lists.newArrayList(fullPlan.readCandidates().endpoints()), null));
     }
 
     static void sendInitialRepair(BlockingPartitionRepair partitionRepair, InetAddressAndPort destination, Mutation mutation)
diff --git a/src/java/org/apache/cassandra/service/reads/repair/ReadRepairEvent.java b/src/java/org/apache/cassandra/service/reads/repair/ReadRepairEvent.java
index 5cec802..a30efa1 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/ReadRepairEvent.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/ReadRepairEvent.java
@@ -22,7 +22,6 @@
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.stream.Collectors;
@@ -90,7 +89,7 @@
         ret.put("consistency", consistency.name());
         ret.put("speculativeRetry", speculativeRetry.name());
 
-        Set<String> eps = destinations.stream().map(InetAddressAndPort::toString).collect(Collectors.toSet());
+        Set<String> eps = destinations.stream().map(Object::toString).collect(Collectors.toSet());
         ret.put("endpointDestinations", new HashSet<>(eps));
 
         if (digestsByEndpoint != null)
@@ -107,7 +106,7 @@
         }
         if (allEndpoints != null)
         {
-            eps = allEndpoints.stream().map(InetAddressAndPort::toString).collect(Collectors.toSet());
+            eps = allEndpoints.stream().map(Object::toString).collect(Collectors.toSet());
             ret.put("allEndpoints", new HashSet<>(eps));
         }
         return ret;
diff --git a/src/java/org/apache/cassandra/service/reads/repair/ReadRepairStrategy.java b/src/java/org/apache/cassandra/service/reads/repair/ReadRepairStrategy.java
index 7a4b795..0d9caad 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/ReadRepairStrategy.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/ReadRepairStrategy.java
@@ -20,14 +20,13 @@
 
 import org.apache.cassandra.db.ReadCommand;
 import org.apache.cassandra.locator.Endpoints;
-import org.apache.cassandra.locator.ReplicaLayout;
 import org.apache.cassandra.locator.ReplicaPlan;
 
 public enum ReadRepairStrategy implements ReadRepair.Factory
 {
     NONE
     {
-        public <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+        public <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
         ReadRepair<E, P> create(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
         {
             return new ReadOnlyReadRepair<>(command, replicaPlan, queryStartNanoTime);
@@ -36,7 +35,7 @@
 
     BLOCKING
     {
-        public <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+        public <E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
         ReadRepair<E, P> create(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
         {
             return new BlockingReadRepair<>(command, replicaPlan, queryStartNanoTime);
diff --git a/src/java/org/apache/cassandra/service/reads/repair/RepairedDataVerifier.java b/src/java/org/apache/cassandra/service/reads/repair/RepairedDataVerifier.java
index d1cff11..c5a0f95 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/RepairedDataVerifier.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/RepairedDataVerifier.java
@@ -18,11 +18,7 @@
 
 package org.apache.cassandra.service.reads.repair;
 
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -30,14 +26,7 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.ReadCommand;
-import org.apache.cassandra.db.SnapshotCommand;
-import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.metrics.TableMetrics;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.net.Verb;
-import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.service.SnapshotVerbHandler;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.DiagnosticSnapshotService;
 import org.apache.cassandra.utils.NoSpamLogger;
diff --git a/src/java/org/apache/cassandra/service/reads/repair/RowIteratorMergeListener.java b/src/java/org/apache/cassandra/service/reads/repair/RowIteratorMergeListener.java
index 38d077a..079080a 100644
--- a/src/java/org/apache/cassandra/service/reads/repair/RowIteratorMergeListener.java
+++ b/src/java/org/apache/cassandra/service/reads/repair/RowIteratorMergeListener.java
@@ -68,8 +68,8 @@
     private final PartitionUpdate.Builder[] repairs;
     private final Row.Builder[] currentRows;
     private final RowDiffListener diffListener;
-    private final ReplicaPlan.ForRead<E> readPlan;
-    private final ReplicaPlan.ForTokenWrite writePlan;
+    private final ReplicaPlan.ForRead<E, ?> readPlan;
+    private final ReplicaPlan.ForWrite writePlan;
 
     // The partition level deletion for the merge row.
     private DeletionTime partitionLevelDeletion;
@@ -82,7 +82,7 @@
 
     private final ReadRepair readRepair;
 
-    public RowIteratorMergeListener(DecoratedKey partitionKey, RegularAndStaticColumns columns, boolean isReversed, ReplicaPlan.ForRead<E> readPlan, ReadCommand command, ReadRepair readRepair)
+    public RowIteratorMergeListener(DecoratedKey partitionKey, RegularAndStaticColumns columns, boolean isReversed, ReplicaPlan.ForRead<E, ?> readPlan, ReadCommand command, ReadRepair readRepair)
     {
         this.partitionKey = partitionKey;
         this.columns = columns;
diff --git a/src/java/org/apache/cassandra/service/reads/thresholds/CoordinatorWarnings.java b/src/java/org/apache/cassandra/service/reads/thresholds/CoordinatorWarnings.java
new file mode 100644
index 0000000..ff5bd78
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/reads/thresholds/CoordinatorWarnings.java
@@ -0,0 +1,197 @@
+/*
+ * 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.service.reads.thresholds;
+
+import java.util.AbstractMap;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.util.concurrent.FastThreadLocal;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.ReadCommand;
+import org.apache.cassandra.metrics.TableMetrics;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.service.ClientWarn;
+
+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");
+
+    // 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();
+    private static final FastThreadLocal<Map<ReadCommand, WarningsSnapshot>> STATE = new FastThreadLocal<>();
+
+    private CoordinatorWarnings() {}
+
+    public static void init()
+    {
+        logger.trace("CoordinatorTrackWarnings.init()");
+        if (STATE.get() != null)
+        {
+            if (ENABLE_DEFENSIVE_CHECKS)
+                throw new AssertionError("CoordinatorTrackWarnings.init called while state is not null: " + STATE.get());
+            return;
+        }
+        STATE.set(INIT);
+    }
+
+    public static void reset()
+    {
+        logger.trace("CoordinatorTrackWarnings.reset()");
+        STATE.remove();
+    }
+
+    public static void update(ReadCommand cmd, WarningsSnapshot snapshot)
+    {
+        logger.trace("CoordinatorTrackWarnings.update({}, {})", cmd.metadata(), snapshot);
+        Map<ReadCommand, WarningsSnapshot> map = mutable();
+        WarningsSnapshot previous = map.get(cmd);
+        WarningsSnapshot update = WarningsSnapshot.merge(previous, snapshot);
+        if (update == null) // null happens when the merge had null input or EMPTY input... remove the command from the map
+            map.remove(cmd);
+        else
+            map.put(cmd, update);
+    }
+
+    public static void done()
+    {
+        Map<ReadCommand, WarningsSnapshot> map = readonly();
+        logger.trace("CoordinatorTrackWarnings.done() with state {}", map);
+        map.forEach((command, merged) -> {
+            ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(command.metadata().id);
+            // race condition when dropping tables, also happens in unit tests as Schema may be bypassed
+            if (cfs == null)
+                return;
+
+            String cql = command.toCQLString();
+            String loggableTokens = command.loggableTokens();
+            recordAborts(merged.tombstones, cql, loggableTokens, cfs.metric.clientTombstoneAborts, WarningsSnapshot::tombstoneAbortMessage);
+            recordWarnings(merged.tombstones, cql, loggableTokens, cfs.metric.clientTombstoneWarnings, WarningsSnapshot::tombstoneWarnMessage);
+
+            recordAborts(merged.localReadSize, cql, loggableTokens, cfs.metric.localReadSizeAborts, WarningsSnapshot::localReadSizeAbortMessage);
+            recordWarnings(merged.localReadSize, cql, loggableTokens, cfs.metric.localReadSizeWarnings, WarningsSnapshot::localReadSizeWarnMessage);
+
+            recordAborts(merged.rowIndexReadSize, cql, loggableTokens, cfs.metric.rowIndexSizeAborts, WarningsSnapshot::rowIndexReadSizeAbortMessage);
+            recordWarnings(merged.rowIndexReadSize, cql, loggableTokens, cfs.metric.rowIndexSizeWarnings, WarningsSnapshot::rowIndexSizeWarnMessage);
+        });
+
+        // reset the state to block from double publishing
+        clearState();
+    }
+
+    private static Map<ReadCommand, WarningsSnapshot> mutable()
+    {
+        Map<ReadCommand, WarningsSnapshot> map = STATE.get();
+        if (map == null)
+        {
+            if (ENABLE_DEFENSIVE_CHECKS)
+                throw new AssertionError("CoordinatorTrackWarnings.mutable calling without calling .init() first");
+            // set map to an "ignore" map; dropping all mutations
+            // since init was not called, it isn't clear that the state will be cleaned up, so avoid populating
+            map = IgnoreMap.get();
+        }
+        else if (map == INIT)
+        {
+            map = new HashMap<>();
+            STATE.set(map);
+        }
+        return map;
+    }
+
+    private static Map<ReadCommand, WarningsSnapshot> readonly()
+    {
+        Map<ReadCommand, WarningsSnapshot> map = STATE.get();
+        if (map == null)
+        {
+            if (ENABLE_DEFENSIVE_CHECKS)
+                throw new AssertionError("CoordinatorTrackWarnings.readonly calling without calling .init() first");
+            // since init was not called, it isn't clear that the state will be cleaned up, so avoid populating
+            map = Collections.emptyMap();
+        }
+        return map;
+    }
+
+    private static void clearState()
+    {
+        Map<ReadCommand, WarningsSnapshot> map = STATE.get();
+        if (map == null || map == INIT)
+            return;
+        // map is mutable, so set to INIT
+        STATE.set(INIT);
+    }
+
+    // utility interface to let callers use static functions
+    @FunctionalInterface
+    private interface ToString
+    {
+        String apply(int count, long value, String cql);
+    }
+
+    private static void recordAborts(WarningsSnapshot.Warnings counter, String cql, String loggableTokens, TableMetrics.TableMeter metric, ToString toString)
+    {
+        if (!counter.aborts.instances.isEmpty())
+        {
+            String msg = toString.apply(counter.aborts.instances.size(), counter.aborts.maxValue, cql);
+            ClientWarn.instance.warn(msg + " with " + loggableTokens);
+            logger.warn(msg);
+            metric.mark();
+        }
+    }
+
+    private static void recordWarnings(WarningsSnapshot.Warnings counter, String cql, String loggableTokens, TableMetrics.TableMeter metric, ToString toString)
+    {
+        if (!counter.warnings.instances.isEmpty())
+        {
+            String msg = toString.apply(counter.warnings.instances.size(), counter.warnings.maxValue, cql);
+            ClientWarn.instance.warn(msg + " with " + loggableTokens);
+            logger.warn(msg);
+            metric.mark();
+        }
+    }
+
+    /**
+     * Utility class to create an immutable map which does not fail on mutation but instead ignores it.
+     */
+    private static final class IgnoreMap extends AbstractMap<Object, Object>
+    {
+        private static final IgnoreMap INSTANCE = new IgnoreMap();
+
+        private static <K, V> Map<K, V> get()
+        {
+            return (Map<K, V>) INSTANCE;
+        }
+
+        @Override
+        public Object put(Object key, Object value)
+        {
+            return null;
+        }
+
+        @Override
+        public Set<Entry<Object, Object>> entrySet()
+        {
+            return Collections.emptySet();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/reads/thresholds/WarnAbortCounter.java b/src/java/org/apache/cassandra/service/reads/thresholds/WarnAbortCounter.java
new file mode 100644
index 0000000..37a64b8
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/reads/thresholds/WarnAbortCounter.java
@@ -0,0 +1,57 @@
+/*
+ * 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.service.reads.thresholds;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.atomic.AtomicLong;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+public class WarnAbortCounter
+{
+    final Set<InetAddressAndPort> warnings = Collections.newSetFromMap(new ConcurrentHashMap<>());
+    // the highest number reported by a node's warning
+    final AtomicLong maxWarningValue = new AtomicLong();
+
+    final Set<InetAddressAndPort> aborts = Collections.newSetFromMap(new ConcurrentHashMap<>());
+    // the highest number reported by a node's rejection.
+    final AtomicLong maxAbortsValue = new AtomicLong();
+
+    void addWarning(InetAddressAndPort from, long value)
+    {
+        maxWarningValue.accumulateAndGet(value, Math::max);
+        // call add last so concurrent reads see empty even if values > 0; if done in different order then
+        // size=1 could have values == 0
+        warnings.add(from);
+    }
+
+    void addAbort(InetAddressAndPort from, long value)
+    {
+        maxAbortsValue.accumulateAndGet(value, Math::max);
+        // call add last so concurrent reads see empty even if values > 0; if done in different order then
+        // size=1 could have values == 0
+        aborts.add(from);
+    }
+
+    public WarningsSnapshot.Warnings snapshot()
+    {
+        return WarningsSnapshot.Warnings.create(WarningsSnapshot.Counter.create(warnings, maxWarningValue), WarningsSnapshot.Counter.create(aborts, maxAbortsValue));
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/reads/thresholds/WarningContext.java b/src/java/org/apache/cassandra/service/reads/thresholds/WarningContext.java
new file mode 100644
index 0000000..1303f9b
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/reads/thresholds/WarningContext.java
@@ -0,0 +1,83 @@
+/*
+ * 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.service.reads.thresholds;
+
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.ParamType;
+
+public class WarningContext
+{
+    private static EnumSet<ParamType> SUPPORTED = EnumSet.of(ParamType.TOMBSTONE_WARNING, ParamType.TOMBSTONE_FAIL,
+                                                             ParamType.LOCAL_READ_SIZE_WARN, ParamType.LOCAL_READ_SIZE_FAIL,
+                                                             ParamType.ROW_INDEX_READ_SIZE_WARN, ParamType.ROW_INDEX_READ_SIZE_FAIL);
+
+    final WarnAbortCounter tombstones = new WarnAbortCounter();
+    final WarnAbortCounter localReadSize = new WarnAbortCounter();
+    final WarnAbortCounter rowIndexReadSize = new WarnAbortCounter();
+
+    public static boolean isSupported(Set<ParamType> keys)
+    {
+        return !Collections.disjoint(keys, SUPPORTED);
+    }
+
+    public RequestFailureReason updateCounters(Map<ParamType, Object> params, InetAddressAndPort from)
+    {
+        for (Map.Entry<ParamType, Object> entry : params.entrySet())
+        {
+            WarnAbortCounter counter = null;
+            RequestFailureReason reason = null;
+            switch (entry.getKey())
+            {
+                case ROW_INDEX_READ_SIZE_FAIL:
+                    reason = RequestFailureReason.READ_SIZE;
+                case ROW_INDEX_READ_SIZE_WARN:
+                    counter = rowIndexReadSize;
+                    break;
+                case LOCAL_READ_SIZE_FAIL:
+                    reason = RequestFailureReason.READ_SIZE;
+                case LOCAL_READ_SIZE_WARN:
+                    counter = localReadSize;
+                    break;
+                case TOMBSTONE_FAIL:
+                    reason = RequestFailureReason.READ_TOO_MANY_TOMBSTONES;
+                case TOMBSTONE_WARNING:
+                    counter = tombstones;
+                    break;
+            }
+            if (reason != null)
+            {
+                counter.addAbort(from, ((Number) entry.getValue()).longValue());
+                return reason;
+            }
+            if (counter != null)
+                counter.addWarning(from, ((Number) entry.getValue()).longValue());
+        }
+        return null;
+    }
+
+    public WarningsSnapshot snapshot()
+    {
+        return WarningsSnapshot.create(tombstones.snapshot(), localReadSize.snapshot(), rowIndexReadSize.snapshot());
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/reads/thresholds/WarningsSnapshot.java b/src/java/org/apache/cassandra/service/reads/thresholds/WarningsSnapshot.java
new file mode 100644
index 0000000..fddb1e1
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/reads/thresholds/WarningsSnapshot.java
@@ -0,0 +1,355 @@
+/*
+ * 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.service.reads.thresholds;
+
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.ReadCommand;
+import org.apache.cassandra.exceptions.ReadSizeAbortException;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.exceptions.TombstoneAbortException;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+public class WarningsSnapshot
+{
+    private static final WarningsSnapshot EMPTY = new WarningsSnapshot(Warnings.EMPTY, Warnings.EMPTY, Warnings.EMPTY);
+
+    public final Warnings tombstones, localReadSize, rowIndexReadSize;
+
+    private WarningsSnapshot(Warnings tombstones, Warnings localReadSize, Warnings rowIndexReadSize)
+    {
+        this.tombstones = tombstones;
+        this.localReadSize = localReadSize;
+        this.rowIndexReadSize = rowIndexReadSize;
+    }
+
+    public static WarningsSnapshot empty()
+    {
+        return EMPTY;
+    }
+
+    public static WarningsSnapshot create(Warnings tombstones, Warnings localReadSize, Warnings rowIndexTooLarge)
+    {
+        if (tombstones == localReadSize && tombstones == rowIndexTooLarge && tombstones == Warnings.EMPTY)
+            return EMPTY;
+        return new WarningsSnapshot(tombstones, localReadSize, rowIndexTooLarge);
+    }
+
+    public static WarningsSnapshot merge(WarningsSnapshot... values)
+    {
+        if (values == null || values.length == 0)
+            return null;
+
+        WarningsSnapshot accum = EMPTY;
+        for (WarningsSnapshot a : values)
+            accum = accum.merge(a);
+        return accum == EMPTY ? null : accum;
+    }
+
+    public boolean isEmpty()
+    {
+        return this == EMPTY;
+    }
+
+    public boolean isDefined()
+    {
+        return this != EMPTY;
+    }
+
+    @VisibleForTesting
+    WarningsSnapshot merge(WarningsSnapshot other)
+    {
+        if (other == null || other == EMPTY)
+            return this;
+        return WarningsSnapshot.create(tombstones.merge(other.tombstones), localReadSize.merge(other.localReadSize), rowIndexReadSize.merge(other.rowIndexReadSize));
+    }
+
+    public void maybeAbort(ReadCommand command, ConsistencyLevel cl, int received, int blockFor, boolean isDataPresent, Map<InetAddressAndPort, RequestFailureReason> failureReasonByEndpoint)
+    {
+        if (!tombstones.aborts.instances.isEmpty())
+            throw new TombstoneAbortException(tombstones.aborts.instances.size(), tombstones.aborts.maxValue, command.toCQLString(), isDataPresent,
+                                              cl, received, blockFor, failureReasonByEndpoint);
+
+        if (!localReadSize.aborts.instances.isEmpty())
+            throw new ReadSizeAbortException(localReadSizeAbortMessage(localReadSize.aborts.instances.size(), localReadSize.aborts.maxValue, command.toCQLString()),
+                                             cl, received, blockFor, isDataPresent, failureReasonByEndpoint);
+
+        if (!rowIndexReadSize.aborts.instances.isEmpty())
+            throw new ReadSizeAbortException(rowIndexReadSizeAbortMessage(rowIndexReadSize.aborts.instances.size(), rowIndexReadSize.aborts.maxValue, command.toCQLString()),
+                                             cl, received, blockFor, isDataPresent, failureReasonByEndpoint);
+    }
+
+    @VisibleForTesting
+    public static String tombstoneAbortMessage(int nodes, long tombstones, String cql)
+    {
+        return String.format("%s nodes scanned over %s tombstones and aborted the query %s (see tombstone_failure_threshold)", nodes, tombstones, cql);
+    }
+
+    @VisibleForTesting
+    public static String tombstoneWarnMessage(int nodes, long tombstones, String cql)
+    {
+        return String.format("%s nodes scanned up to %s tombstones and issued tombstone warnings for query %s  (see tombstone_warn_threshold)", nodes, tombstones, cql);
+    }
+
+    @VisibleForTesting
+    public static String localReadSizeAbortMessage(long nodes, long bytes, String cql)
+    {
+        return String.format("%s nodes loaded over %s bytes and aborted the query %s (see local_read_size_fail_threshold)", nodes, bytes, cql);
+    }
+
+    @VisibleForTesting
+    public static String localReadSizeWarnMessage(int nodes, long bytes, String cql)
+    {
+        return String.format("%s nodes loaded over %s bytes and issued local read size warnings for query %s  (see local_read_size_warn_threshold)", nodes, bytes, cql);
+    }
+
+    @VisibleForTesting
+    public static String rowIndexReadSizeAbortMessage(long nodes, long bytes, String cql)
+    {
+        return String.format("%s nodes loaded over %s bytes in RowIndexEntry and aborted the query %s (see row_index_size_fail_threshold)", nodes, bytes, cql);
+    }
+
+    @VisibleForTesting
+    public static String rowIndexSizeWarnMessage(int nodes, long bytes, String cql)
+    {
+        return String.format("%s nodes loaded over %s bytes in RowIndexEntry and issued warnings for query %s  (see row_index_size_warn_threshold)", nodes, bytes, cql);
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        WarningsSnapshot that = (WarningsSnapshot) o;
+        return Objects.equals(tombstones, that.tombstones) && Objects.equals(localReadSize, that.localReadSize) && Objects.equals(rowIndexReadSize, that.rowIndexReadSize);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(tombstones, localReadSize, rowIndexReadSize);
+    }
+
+    @Override
+    public String toString()
+    {
+        return "(tombstones=" + tombstones + ", localReadSize=" + localReadSize + ", rowIndexTooLarge=" + rowIndexReadSize + ')';
+    }
+
+    public static final class Warnings
+    {
+        private static final Warnings EMPTY = new Warnings(Counter.EMPTY, Counter.EMPTY);
+
+        public final Counter warnings;
+        public final Counter aborts;
+
+        private Warnings(Counter warnings, Counter aborts)
+        {
+            this.warnings = warnings;
+            this.aborts = aborts;
+        }
+
+        public static Warnings create(Counter warnings, Counter aborts)
+        {
+            if (warnings == Counter.EMPTY && aborts == Counter.EMPTY)
+                return EMPTY;
+            return new Warnings(warnings, aborts);
+        }
+
+        public Warnings merge(Warnings other)
+        {
+            if (other == EMPTY)
+                return this;
+            return Warnings.create(warnings.merge(other.warnings), aborts.merge(other.aborts));
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Warnings warnings1 = (Warnings) o;
+            return Objects.equals(warnings, warnings1.warnings) && Objects.equals(aborts, warnings1.aborts);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hash(warnings, aborts);
+        }
+
+        @Override
+        public String toString()
+        {
+            return "(warnings=" + warnings + ", aborts=" + aborts + ')';
+        }
+    }
+
+    public static final class Counter
+    {
+        private static final Counter EMPTY = new Counter(ImmutableSet.of(), 0);
+
+        public final ImmutableSet<InetAddressAndPort> instances;
+        public final long maxValue;
+
+        @VisibleForTesting
+        Counter(ImmutableSet<InetAddressAndPort> instances, long maxValue)
+        {
+            this.instances = instances;
+            this.maxValue = maxValue;
+        }
+
+        @VisibleForTesting
+        static Counter empty()
+        {
+            return EMPTY;
+        }
+
+        public static Counter create(Set<InetAddressAndPort> instances, AtomicLong maxValue)
+        {
+            ImmutableSet<InetAddressAndPort> copy = ImmutableSet.copyOf(instances);
+            // if instances is empty ignore value
+            // writes and reads are concurrent (write = networking callback, read = coordinator thread), so there is
+            // an edge case where instances is empty and maxValue > 0; this is caused by the fact we update value first before count
+            // we write: value then instance
+            // we read: instance then value
+            if (copy.isEmpty())
+                return EMPTY;
+            return new Counter(copy, maxValue.get());
+        }
+
+        public Counter merge(Counter other)
+        {
+            if (other == EMPTY)
+                return this;
+            ImmutableSet<InetAddressAndPort> copy = ImmutableSet.<InetAddressAndPort>builder()
+                                                    .addAll(instances)
+                                                    .addAll(other.instances)
+                                                    .build();
+            // since other is NOT empty, then output can not be empty; so skip create method
+            return new Counter(copy, Math.max(maxValue, other.maxValue));
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Counter counter = (Counter) o;
+            return maxValue == counter.maxValue && Objects.equals(instances, counter.instances);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hash(instances, maxValue);
+        }
+
+        @Override
+        public String toString()
+        {
+            return "(" + instances + ", " + maxValue + ')';
+        }
+    }
+
+    @VisibleForTesting
+    static Builder builder()
+    {
+        return new Builder();
+    }
+
+    @VisibleForTesting
+    public static final class Builder
+    {
+        private WarningsSnapshot snapshot = empty();
+
+        public Builder tombstonesWarning(ImmutableSet<InetAddressAndPort> instances, long maxValue)
+        {
+            return tombstonesWarning(new Counter(Objects.requireNonNull(instances), maxValue));
+        }
+
+        public Builder tombstonesWarning(Counter counter)
+        {
+            Objects.requireNonNull(counter);
+            snapshot = snapshot.merge(new WarningsSnapshot(new Warnings(counter, Counter.EMPTY), Warnings.EMPTY, Warnings.EMPTY));
+            return this;
+        }
+
+        public Builder tombstonesAbort(ImmutableSet<InetAddressAndPort> instances, long maxValue)
+        {
+            return tombstonesAbort(new Counter(Objects.requireNonNull(instances), maxValue));
+        }
+
+        public Builder tombstonesAbort(Counter counter)
+        {
+            Objects.requireNonNull(counter);
+            snapshot = snapshot.merge(new WarningsSnapshot(new Warnings(Counter.EMPTY, counter), Warnings.EMPTY, Warnings.EMPTY));
+            return this;
+        }
+
+        public Builder localReadSizeWarning(ImmutableSet<InetAddressAndPort> instances, long maxValue)
+        {
+            return localReadSizeWarning(new Counter(Objects.requireNonNull(instances), maxValue));
+        }
+
+        public Builder localReadSizeWarning(Counter counter)
+        {
+            Objects.requireNonNull(counter);
+            snapshot = snapshot.merge(new WarningsSnapshot(Warnings.EMPTY, new Warnings(counter, Counter.EMPTY), Warnings.EMPTY));
+            return this;
+        }
+
+        public Builder localReadSizeAbort(ImmutableSet<InetAddressAndPort> instances, long maxValue)
+        {
+            return localReadSizeAbort(new Counter(Objects.requireNonNull(instances), maxValue));
+        }
+
+        public Builder localReadSizeAbort(Counter counter)
+        {
+            Objects.requireNonNull(counter);
+            snapshot = snapshot.merge(new WarningsSnapshot(Warnings.EMPTY, new Warnings(Counter.EMPTY, counter), Warnings.EMPTY));
+            return this;
+        }
+
+        public Builder rowIndexSizeWarning(Counter counter)
+        {
+            Objects.requireNonNull(counter);
+            snapshot = snapshot.merge(new WarningsSnapshot(Warnings.EMPTY, Warnings.EMPTY, new Warnings(counter, Counter.EMPTY)));
+            return this;
+        }
+
+        public Builder rowIndexSizeAbort(Counter counter)
+        {
+            Objects.requireNonNull(counter);
+            snapshot = snapshot.merge(new WarningsSnapshot(Warnings.EMPTY, Warnings.EMPTY, new Warnings(Counter.EMPTY, counter)));
+            return this;
+        }
+
+        public WarningsSnapshot build()
+        {
+            return snapshot;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/snapshot/SnapshotLoader.java b/src/java/org/apache/cassandra/service/snapshot/SnapshotLoader.java
new file mode 100644
index 0000000..523e1e5
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/snapshot/SnapshotLoader.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.service.snapshot;
+
+import java.io.IOException;
+import java.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.UUID;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.io.util.File;
+
+import static org.apache.cassandra.db.Directories.SNAPSHOT_SUBDIR;
+import static org.apache.cassandra.service.snapshot.TableSnapshot.buildSnapshotId;
+
+/**
+ * Loads snapshot metadata from data directories
+ */
+public class SnapshotLoader
+{
+    private static final Logger logger = LoggerFactory.getLogger(SnapshotLoader.class);
+
+    static final Pattern SNAPSHOT_DIR_PATTERN = Pattern.compile("(?<keyspace>\\w+)/(?<tableName>\\w+)-(?<tableId>[0-9a-f]{32})/snapshots/(?<tag>.+)$");
+
+    private final Collection<Path> dataDirectories;
+
+    public SnapshotLoader()
+    {
+        this(DatabaseDescriptor.getAllDataFileLocations());
+    }
+
+    public SnapshotLoader(String[] dataDirectories)
+    {
+        this(Arrays.stream(dataDirectories).map(File::getPath).collect(Collectors.toList()));
+    }
+
+    public SnapshotLoader(Collection<Path> dataDirs)
+    {
+        this.dataDirectories = dataDirs;
+    }
+
+    @VisibleForTesting
+    static class Visitor extends SimpleFileVisitor<Path>
+    {
+        private static final Pattern UUID_PATTERN = Pattern.compile("([0-9a-f]{8})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]{4})([0-9a-f]+)");
+        private final Map<String, TableSnapshot.Builder> snapshots;
+
+        public Visitor(Map<String, TableSnapshot.Builder> snapshots)
+        {
+            this.snapshots = snapshots;
+        }
+
+        @Override
+        public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
+        {
+            // Cassandra can remove some files while traversing the tree,
+            // for example when SSTables are compacted while we are walking it.
+            // SnapshotLoader is interested only in SSTables in snapshot directories which are not compacted,
+            // but we need to cover these in regular table directories too.
+            // If listing failed but exception is NoSuchFileException, then we
+            // just skip it and continue with the listing.
+            if (exc instanceof NoSuchFileException)
+                return FileVisitResult.CONTINUE;
+            else
+                throw exc;
+        }
+
+        @Override
+        public FileVisitResult preVisitDirectory(Path subdir, BasicFileAttributes attrs)
+        {
+            // see CASSANDRA-18359
+            if (subdir.getParent() == null || subdir.getParent().getFileName() == null)
+                return FileVisitResult.CONTINUE;
+
+            if (subdir.getParent().getFileName().toString().equals(SNAPSHOT_SUBDIR))
+            {
+                logger.trace("Processing directory " + subdir);
+                Matcher snapshotDirMatcher = SNAPSHOT_DIR_PATTERN.matcher(subdir.toString());
+                if (snapshotDirMatcher.find())
+                {
+                    try
+                    {
+                        loadSnapshotFromDir(snapshotDirMatcher, subdir);
+                    }
+                    catch (Throwable e)
+                    {
+                        logger.warn("Could not load snapshot from {}.", subdir, e);
+                    }
+                }
+                return FileVisitResult.SKIP_SUBTREE;
+            }
+
+            return subdir.getFileName().toString().equals(Directories.BACKUPS_SUBDIR)
+                   ? FileVisitResult.SKIP_SUBTREE
+                   : FileVisitResult.CONTINUE;
+        }
+
+        /**
+         * Given an UUID string without dashes (ie. c7e513243f0711ec9bbc0242ac130002)
+         * return an UUID object (ie. c7e51324-3f07-11ec-9bbc-0242ac130002)
+         */
+        static UUID parseUUID(String uuidWithoutDashes) throws IllegalArgumentException
+        {
+            assert uuidWithoutDashes.length() == 32 && !uuidWithoutDashes.contains("-");
+            String dashedUUID = UUID_PATTERN.matcher(uuidWithoutDashes).replaceFirst("$1-$2-$3-$4-$5");
+            return UUID.fromString(dashedUUID);
+        }
+
+        private void loadSnapshotFromDir(Matcher snapshotDirMatcher, Path snapshotDir)
+        {
+            String keyspaceName = snapshotDirMatcher.group("keyspace");
+            String tableName = snapshotDirMatcher.group("tableName");
+            UUID tableId = parseUUID(snapshotDirMatcher.group("tableId"));
+            String tag = snapshotDirMatcher.group("tag");
+            String snapshotId = buildSnapshotId(keyspaceName, tableName, tableId, tag);
+            TableSnapshot.Builder builder = snapshots.computeIfAbsent(snapshotId, k -> new TableSnapshot.Builder(keyspaceName, tableName, tableId, tag));
+            builder.addSnapshotDir(new File(snapshotDir));
+        }
+    }
+
+    public Set<TableSnapshot> loadSnapshots()
+    {
+        Map<String, TableSnapshot.Builder> snapshots = new HashMap<>();
+        Visitor visitor = new Visitor(snapshots);
+
+        for (Path dataDir : dataDirectories)
+        {
+            try
+            {
+                if (new File(dataDir).exists())
+                    Files.walkFileTree(dataDir, Collections.emptySet(), 5, visitor);
+                else
+                    logger.debug("Skipping non-existing data directory {}", dataDir);
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(String.format("Error while loading snapshots from %s", dataDir), e);
+            }
+        }
+
+        return snapshots.values().stream().map(TableSnapshot.Builder::build).collect(Collectors.toSet());
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/snapshot/SnapshotManager.java b/src/java/org/apache/cassandra/service/snapshot/SnapshotManager.java
new file mode 100644
index 0000000..8e630c7
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/snapshot/SnapshotManager.java
@@ -0,0 +1,164 @@
+/*
+ * 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.service.snapshot;
+
+
+import java.util.Collection;
+import java.util.PriorityQueue;
+import java.util.Set;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Directories;
+
+import java.util.concurrent.TimeoutException;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
+
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.utils.ExecutorUtils;
+
+import static java.util.Comparator.comparing;
+import static java.util.stream.Collectors.toList;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.FBUtilities.now;
+
+public class SnapshotManager {
+
+    private static final ScheduledExecutorPlus executor = executorFactory().scheduled(false, "SnapshotCleanup");
+
+    private static final Logger logger = LoggerFactory.getLogger(SnapshotManager.class);
+
+    private final long initialDelaySeconds;
+    private final long cleanupPeriodSeconds;
+    private final SnapshotLoader snapshotLoader;
+
+    @VisibleForTesting
+    protected volatile ScheduledFuture<?> cleanupTaskFuture;
+
+    /**
+     * Expiring snapshots ordered by expiration date, to allow only iterating over snapshots
+     * that need to be removed on {@link this#clearExpiredSnapshots()}
+     */
+    private final PriorityQueue<TableSnapshot> expiringSnapshots = new PriorityQueue<>(comparing(TableSnapshot::getExpiresAt));
+
+    public SnapshotManager()
+    {
+        this(CassandraRelevantProperties.SNAPSHOT_CLEANUP_INITIAL_DELAY_SECONDS.getInt(),
+             CassandraRelevantProperties.SNAPSHOT_CLEANUP_PERIOD_SECONDS.getInt());
+    }
+
+    @VisibleForTesting
+    protected SnapshotManager(long initialDelaySeconds, long cleanupPeriodSeconds)
+    {
+        this.initialDelaySeconds = initialDelaySeconds;
+        this.cleanupPeriodSeconds = cleanupPeriodSeconds;
+        snapshotLoader = new SnapshotLoader(DatabaseDescriptor.getAllDataFileLocations());
+    }
+
+    public Collection<TableSnapshot> getExpiringSnapshots()
+    {
+        return expiringSnapshots;
+    }
+
+    public synchronized void start()
+    {
+        addSnapshots(loadSnapshots());
+        resumeSnapshotCleanup();
+    }
+
+    public synchronized void stop() throws InterruptedException, TimeoutException
+    {
+        expiringSnapshots.clear();
+        if (cleanupTaskFuture != null)
+        {
+            cleanupTaskFuture.cancel(false);
+            cleanupTaskFuture = null;
+        }
+    }
+
+    public synchronized void addSnapshot(TableSnapshot snapshot)
+    {
+        // We currently only care about expiring snapshots
+        if (snapshot.isExpiring())
+        {
+            logger.debug("Adding expiring snapshot {}", snapshot);
+            expiringSnapshots.add(snapshot);
+        }
+    }
+
+    public synchronized Set<TableSnapshot> loadSnapshots()
+    {
+        return snapshotLoader.loadSnapshots();
+    }
+
+    @VisibleForTesting
+    protected synchronized void addSnapshots(Collection<TableSnapshot> snapshots)
+    {
+        logger.debug("Adding snapshots: {}.", Joiner.on(", ").join(snapshots.stream().map(TableSnapshot::getId).collect(toList())));
+        snapshots.forEach(this::addSnapshot);
+    }
+
+    // TODO: Support pausing snapshot cleanup
+    @VisibleForTesting
+    synchronized void resumeSnapshotCleanup()
+    {
+        if (cleanupTaskFuture == null)
+        {
+            logger.info("Scheduling expired snapshot cleanup with initialDelaySeconds={} and cleanupPeriodSeconds={}",
+                        initialDelaySeconds, cleanupPeriodSeconds);
+            cleanupTaskFuture = executor.scheduleWithFixedDelay(this::clearExpiredSnapshots, initialDelaySeconds,
+                                                                cleanupPeriodSeconds, TimeUnit.SECONDS);
+        }
+    }
+
+    @VisibleForTesting
+    protected synchronized void clearExpiredSnapshots()
+    {
+        TableSnapshot expiredSnapshot;
+        while ((expiredSnapshot = expiringSnapshots.peek()) != null)
+        {
+            if (!expiredSnapshot.isExpired(now()))
+                break; // the earliest expiring snapshot is not expired yet, so there is no more expired snapshots to remove
+
+            logger.debug("Removing expired snapshot {}.", expiredSnapshot);
+            clearSnapshot(expiredSnapshot);
+        }
+    }
+
+    public synchronized void clearSnapshot(TableSnapshot snapshot)
+    {
+        for (File snapshotDir : snapshot.getDirectories())
+            Directories.removeSnapshotDirectory(DatabaseDescriptor.getSnapshotRateLimiter(), snapshotDir);
+
+        expiringSnapshots.remove(snapshot);
+    }
+
+    @VisibleForTesting
+    public static void shutdownAndWait(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
+    {
+        ExecutorUtils.shutdownNowAndWait(timeout, unit, executor);
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/snapshot/SnapshotManifest.java b/src/java/org/apache/cassandra/service/snapshot/SnapshotManifest.java
new file mode 100644
index 0000000..ba840ef
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/snapshot/SnapshotManifest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.service.snapshot;
+
+import java.io.*;
+import java.time.Instant;
+import java.util.List;
+import java.util.Objects;
+
+import com.fasterxml.jackson.annotation.JsonAutoDetect;
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import org.apache.cassandra.config.DurationSpec;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.utils.FBUtilities;
+
+// Only serialize fields
+@JsonAutoDetect(fieldVisibility = JsonAutoDetect.Visibility.ANY,
+                getterVisibility = JsonAutoDetect.Visibility.NONE,
+                setterVisibility = JsonAutoDetect.Visibility.NONE)
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class SnapshotManifest
+{
+    @JsonProperty("files")
+    public final List<String> files;
+
+    @JsonProperty("created_at")
+    public final Instant createdAt;
+
+    @JsonProperty("expires_at")
+    public final Instant expiresAt;
+
+    /** needed for jackson serialization */
+    @SuppressWarnings("unused")
+    private SnapshotManifest() {
+        this.files = null;
+        this.createdAt = null;
+        this.expiresAt = null;
+    }
+
+    public SnapshotManifest(List<String> files, DurationSpec.IntSecondsBound ttl, Instant creationTime)
+    {
+        this.files = files;
+        this.createdAt = creationTime;
+        this.expiresAt = ttl == null ? null : createdAt.plusSeconds(ttl.toSeconds());
+    }
+
+    public List<String> getFiles()
+    {
+        return files;
+    }
+
+    public Instant getCreatedAt()
+    {
+        return createdAt;
+    }
+
+    public Instant getExpiresAt()
+    {
+        return expiresAt;
+    }
+
+    public void serializeToJsonFile(File outputFile) throws IOException
+    {
+        FBUtilities.serializeToJsonFile(this, outputFile);
+    }
+
+    public static SnapshotManifest deserializeFromJsonFile(File file) throws IOException
+    {
+        return FBUtilities.deserializeFromJsonFile(SnapshotManifest.class, file);
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        SnapshotManifest manifest = (SnapshotManifest) o;
+        return Objects.equals(files, manifest.files) && Objects.equals(createdAt, manifest.createdAt) && Objects.equals(expiresAt, manifest.expiresAt);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(files, createdAt, expiresAt);
+    }
+}
diff --git a/src/java/org/apache/cassandra/service/snapshot/TableSnapshot.java b/src/java/org/apache/cassandra/service/snapshot/TableSnapshot.java
new file mode 100644
index 0000000..0cfcfea
--- /dev/null
+++ b/src/java/org/apache/cassandra/service/snapshot/TableSnapshot.java
@@ -0,0 +1,308 @@
+/*
+ * 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.service.snapshot;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.time.Instant;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.utils.DirectorySizeCalculator;
+
+public class TableSnapshot
+{
+    private static final Logger logger = LoggerFactory.getLogger(TableSnapshot.class);
+
+    private final String keyspaceName;
+    private final String tableName;
+    private final UUID tableId;
+    private final String tag;
+
+    private final Instant createdAt;
+    private final Instant expiresAt;
+
+    private final Set<File> snapshotDirs;
+
+    public TableSnapshot(String keyspaceName, String tableName, UUID tableId,
+                         String tag, Instant createdAt, Instant expiresAt,
+                         Set<File> snapshotDirs)
+    {
+        this.keyspaceName = keyspaceName;
+        this.tableName = tableName;
+        this.tableId = tableId;
+        this.tag = tag;
+        this.createdAt = createdAt;
+        this.expiresAt = expiresAt;
+        this.snapshotDirs = snapshotDirs;
+    }
+
+    /**
+     * Unique identifier of a snapshot. Used
+     * only to deduplicate snapshots internally,
+     * not exposed externally.
+     *
+     * Format: "$ks:$table_name:$table_id:$tag"
+     */
+    public String getId()
+    {
+        return buildSnapshotId(keyspaceName, tableName, tableId, tag);
+    }
+
+    public String getKeyspaceName()
+    {
+        return keyspaceName;
+    }
+
+    public String getTableName()
+    {
+        return tableName;
+    }
+
+    public String getTag()
+    {
+        return tag;
+    }
+
+    public Instant getCreatedAt()
+    {
+        if (createdAt == null)
+        {
+            long minCreation = snapshotDirs.stream().mapToLong(File::lastModified).min().orElse(0);
+            if (minCreation != 0)
+            {
+                return Instant.ofEpochMilli(minCreation);
+            }
+        }
+        return createdAt;
+    }
+
+    public Instant getExpiresAt()
+    {
+        return expiresAt;
+    }
+
+    public boolean isExpired(Instant now)
+    {
+        if (createdAt == null || expiresAt == null)
+        {
+            return false;
+        }
+
+        return expiresAt.compareTo(now) < 0;
+    }
+
+    public boolean exists()
+    {
+        return snapshotDirs.stream().anyMatch(File::exists);
+    }
+
+    public boolean isExpiring()
+    {
+        return expiresAt != null;
+    }
+
+    public long computeSizeOnDiskBytes()
+    {
+        return snapshotDirs.stream().mapToLong(FileUtils::folderSize).sum();
+    }
+
+    public long computeTrueSizeBytes()
+    {
+        DirectorySizeCalculator visitor = new SnapshotTrueSizeCalculator();
+
+        for (File snapshotDir : snapshotDirs)
+        {
+            try
+            {
+                Files.walkFileTree(snapshotDir.toPath(), visitor);
+            }
+            catch (IOException e)
+            {
+                logger.error("Could not calculate the size of {}.", snapshotDir, e);
+            }
+        }
+
+        return visitor.getAllocatedSize();
+    }
+
+    public Collection<File> getDirectories()
+    {
+        return snapshotDirs;
+    }
+
+    public Optional<File> getManifestFile()
+    {
+        for (File snapshotDir : snapshotDirs)
+        {
+            File manifestFile = Directories.getSnapshotManifestFile(snapshotDir);
+            if (manifestFile.exists())
+            {
+                return Optional.of(manifestFile);
+            }
+        }
+        return Optional.empty();
+    }
+
+    public Optional<File> getSchemaFile()
+    {
+        for (File snapshotDir : snapshotDirs)
+        {
+            File schemaFile = Directories.getSnapshotSchemaFile(snapshotDir);
+            if (schemaFile.exists())
+            {
+                return Optional.of(schemaFile);
+            }
+        }
+        return Optional.empty();
+    }
+
+    @Override
+    public boolean equals(Object o)
+    {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+        TableSnapshot snapshot = (TableSnapshot) o;
+        return Objects.equals(keyspaceName, snapshot.keyspaceName) && Objects.equals(tableName, snapshot.tableName) &&
+               Objects.equals(tableId, snapshot.tableId) && Objects.equals(tag, snapshot.tag) &&
+               Objects.equals(createdAt, snapshot.createdAt) && Objects.equals(expiresAt, snapshot.expiresAt) &&
+               Objects.equals(snapshotDirs, snapshot.snapshotDirs);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return Objects.hash(keyspaceName, tableName, tableId, tag, createdAt, expiresAt, snapshotDirs);
+    }
+
+    @Override
+    public String toString()
+    {
+        return "TableSnapshot{" +
+               "keyspaceName='" + keyspaceName + '\'' +
+               ", tableName='" + tableName + '\'' +
+               ", tableId=" + tableId +
+               ", tag='" + tag + '\'' +
+               ", createdAt=" + createdAt +
+               ", expiresAt=" + expiresAt +
+               ", snapshotDirs=" + snapshotDirs +
+               '}';
+    }
+
+    static class Builder {
+        private final String keyspaceName;
+        private final String tableName;
+        private final UUID tableId;
+        private final String tag;
+
+        private Instant createdAt = null;
+        private Instant expiresAt = null;
+
+        private final Set<File> snapshotDirs = new HashSet<>();
+
+        Builder(String keyspaceName, String tableName, UUID tableId, String tag)
+        {
+            this.keyspaceName = keyspaceName;
+            this.tableName = tableName;
+            this.tag = tag;
+            this.tableId = tableId;
+        }
+
+        void addSnapshotDir(File snapshotDir)
+        {
+            snapshotDirs.add(snapshotDir);
+            File manifestFile = new File(snapshotDir, "manifest.json");
+            if (manifestFile.exists() && createdAt == null && expiresAt == null) {
+                loadTimestampsFromManifest(manifestFile);
+            }
+        }
+
+        private void loadTimestampsFromManifest(File manifestFile)
+        {
+            try
+            {
+                logger.trace("Loading snapshot manifest from {}", manifestFile);
+                SnapshotManifest manifest = SnapshotManifest.deserializeFromJsonFile(manifestFile);
+                createdAt = manifest.createdAt;
+                expiresAt = manifest.expiresAt;
+            }
+            catch (IOException e)
+            {
+                logger.warn("Cannot read manifest file {} of snapshot {}.", manifestFile, tag, e);
+            }
+        }
+
+        TableSnapshot build()
+        {
+            return new TableSnapshot(keyspaceName, tableName, tableId, tag, createdAt, expiresAt, snapshotDirs);
+        }
+    }
+
+    protected static String buildSnapshotId(String keyspaceName, String tableName, UUID tableId, String tag)
+    {
+        return String.format("%s:%s:%s:%s", keyspaceName, tableName, tableId, tag);
+    }
+
+    public static class SnapshotTrueSizeCalculator extends DirectorySizeCalculator
+    {
+        /**
+         * Snapshots are composed of hard-linked sstables. The true snapshot size should only include
+         * snapshot files which do not contain a corresponding "live" sstable file.
+         */
+        @Override
+        public boolean isAcceptable(Path snapshotFilePath)
+        {
+            return !getLiveFileFromSnapshotFile(snapshotFilePath).exists();
+        }
+    }
+
+    /**
+     * Returns the corresponding live file for a given snapshot file.
+     *
+     * Example:
+     *  - Base table:
+     *    - Snapshot file: ~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/snapshots/1643481737850/me-1-big-Data.db
+     *    - Live file: ~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/me-1-big-Data.db
+     *  - Secondary index:
+     *    - Snapshot file: ~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/snapshots/1643481737850/.tbl_val_idx/me-1-big-Summary.db
+     *    - Live file: ~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/.tbl_val_idx/me-1-big-Summary.db
+     *
+     */
+    static File getLiveFileFromSnapshotFile(Path snapshotFilePath)
+    {
+        // Snapshot directory structure format is {data_dir}/snapshots/{snapshot_name}/{snapshot_file}
+        Path liveDir = snapshotFilePath.getParent().getParent().getParent();
+        if (Directories.isSecondaryIndexFolder(snapshotFilePath.getParent()))
+        {
+            // Snapshot file structure format is {data_dir}/snapshots/{snapshot_name}/.{index}/{sstable-component}.db
+            liveDir = File.getPath(liveDir.getParent().toString(), snapshotFilePath.getParent().getFileName().toString());
+        }
+        return new File(liveDir.toString(), snapshotFilePath.getFileName().toString());
+    }
+}
diff --git a/src/java/org/apache/cassandra/streaming/DefaultConnectionFactory.java b/src/java/org/apache/cassandra/streaming/DefaultConnectionFactory.java
deleted file mode 100644
index 5f2163f..0000000
--- a/src/java/org/apache/cassandra/streaming/DefaultConnectionFactory.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.streaming;
-
-import java.io.IOException;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import io.netty.channel.Channel;
-import io.netty.channel.EventLoop;
-import io.netty.util.concurrent.Future;
-import org.apache.cassandra.net.ConnectionCategory;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.net.OutboundConnectionInitiator.Result;
-import org.apache.cassandra.net.OutboundConnectionInitiator.Result.StreamingSuccess;
-import org.apache.cassandra.net.OutboundConnectionSettings;
-
-import static org.apache.cassandra.net.OutboundConnectionInitiator.initiateStreaming;
-
-public class DefaultConnectionFactory implements StreamConnectionFactory
-{
-    @VisibleForTesting
-    public static int MAX_CONNECT_ATTEMPTS = 3;
-
-    @Override
-    public Channel createConnection(OutboundConnectionSettings template, int messagingVersion) throws IOException
-    {
-        EventLoop eventLoop = MessagingService.instance().socketFactory.outboundStreamingGroup().next();
-
-        int attempts = 0;
-        while (true)
-        {
-            Future<Result<StreamingSuccess>> result = initiateStreaming(eventLoop, template.withDefaults(ConnectionCategory.STREAMING), messagingVersion);
-            result.awaitUninterruptibly(); // initiate has its own timeout, so this is "guaranteed" to return relatively promptly
-            if (result.isSuccess())
-                return result.getNow().success().channel;
-
-            if (++attempts == MAX_CONNECT_ATTEMPTS)
-                throw new IOException("failed to connect to " + template.to + " for streaming data", result.cause());
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/streaming/IncomingStream.java b/src/java/org/apache/cassandra/streaming/IncomingStream.java
index 0733249..25ab626 100644
--- a/src/java/org/apache/cassandra/streaming/IncomingStream.java
+++ b/src/java/org/apache/cassandra/streaming/IncomingStream.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.streaming;
 
-import java.io.IOException;
-
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.schema.TableId;
 
@@ -37,7 +35,7 @@
     /**
      * Read in the stream data.
      */
-    void read(DataInputPlus inputPlus, int version) throws IOException;
+    void read(DataInputPlus inputPlus, int version) throws Throwable;
 
     String getName();
     long getSize();
diff --git a/src/java/org/apache/cassandra/streaming/OutgoingStream.java b/src/java/org/apache/cassandra/streaming/OutgoingStream.java
index 546462d..cc42ab6 100644
--- a/src/java/org/apache/cassandra/streaming/OutgoingStream.java
+++ b/src/java/org/apache/cassandra/streaming/OutgoingStream.java
@@ -19,10 +19,9 @@
 package org.apache.cassandra.streaming;
 
 import java.io.IOException;
-import java.util.UUID;
 
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Some subset of data to be streamed. Implementations handle writing out their data via the write method.
@@ -36,7 +35,7 @@
     /**
      * Write the streams data into the socket
      */
-    void write(StreamSession session, DataOutputStreamPlus output, int version) throws IOException;
+    void write(StreamSession session, StreamingDataOutputPlus output, int version) throws IOException;
 
     /**
      * Release any resources held by the stream
@@ -44,7 +43,7 @@
     void finish();
 
     long getRepairedAt();
-    UUID getPendingRepair();
+    TimeUUID getPendingRepair();
 
     String getName();
 
diff --git a/src/java/org/apache/cassandra/streaming/PreviewKind.java b/src/java/org/apache/cassandra/streaming/PreviewKind.java
index 3d0bff9..8d7ad8a 100644
--- a/src/java/org/apache/cassandra/streaming/PreviewKind.java
+++ b/src/java/org/apache/cassandra/streaming/PreviewKind.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.streaming;
 
-import java.util.UUID;
-
 import com.google.common.base.Predicate;
 import com.google.common.base.Predicates;
 
@@ -29,6 +27,7 @@
 import org.apache.cassandra.repair.consistent.ConsistentSession;
 import org.apache.cassandra.repair.consistent.LocalSession;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 public enum PreviewKind
 {
@@ -69,7 +68,7 @@
         return isPreview() ? "preview repair" : "repair";
     }
 
-    public String logPrefix(UUID sessionId)
+    public String logPrefix(TimeUUID sessionId)
     {
         return '[' + logPrefix() + " #" + sessionId.toString() + ']';
     }
diff --git a/src/java/org/apache/cassandra/streaming/ProgressInfo.java b/src/java/org/apache/cassandra/streaming/ProgressInfo.java
index 2b306f8..2ed78ac 100644
--- a/src/java/org/apache/cassandra/streaming/ProgressInfo.java
+++ b/src/java/org/apache/cassandra/streaming/ProgressInfo.java
@@ -54,9 +54,11 @@
     public final String fileName;
     public final Direction direction;
     public final long currentBytes;
+    public final long deltaBytes; // change from previous ProgressInfo
     public final long totalBytes;
 
-    public ProgressInfo(InetAddressAndPort peer, int sessionIndex, String fileName, Direction direction, long currentBytes, long totalBytes)
+    public ProgressInfo(InetAddressAndPort peer, int sessionIndex, String fileName, Direction direction,
+                        long currentBytes,  long deltaBytes, long totalBytes)
     {
         assert totalBytes > 0;
 
@@ -65,6 +67,7 @@
         this.fileName = fileName;
         this.direction = direction;
         this.currentBytes = currentBytes;
+        this.deltaBytes = deltaBytes;
         this.totalBytes = totalBytes;
     }
 
diff --git a/src/java/org/apache/cassandra/streaming/SessionInfo.java b/src/java/org/apache/cassandra/streaming/SessionInfo.java
index c77e90d..d95d85b 100644
--- a/src/java/org/apache/cassandra/streaming/SessionInfo.java
+++ b/src/java/org/apache/cassandra/streaming/SessionInfo.java
@@ -18,6 +18,7 @@
 package org.apache.cassandra.streaming;
 
 import java.io.Serializable;
+import java.net.InetSocketAddress;
 import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
@@ -26,7 +27,6 @@
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 
-import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.utils.FBUtilities;
 
 /**
@@ -34,9 +34,9 @@
  */
 public final class SessionInfo implements Serializable
 {
-    public final InetAddressAndPort peer;
+    public final InetSocketAddress peer;
     public final int sessionIndex;
-    public final InetAddressAndPort connecting;
+    public final InetSocketAddress connecting;
     /** Immutable collection of receiving summaries */
     public final Collection<StreamSummary> receivingSummaries;
     /** Immutable collection of sending summaries*/
@@ -44,12 +44,12 @@
     /** Current session state */
     public final StreamSession.State state;
 
-    private final Map<String, ProgressInfo> receivingFiles;
-    private final Map<String, ProgressInfo> sendingFiles;
+    private final Map<String, ProgressInfo> receivingFiles = new ConcurrentHashMap<>();
+    private final Map<String, ProgressInfo> sendingFiles = new ConcurrentHashMap<>();
 
-    public SessionInfo(InetAddressAndPort peer,
+    public SessionInfo(InetSocketAddress peer,
                        int sessionIndex,
-                       InetAddressAndPort connecting,
+                       InetSocketAddress connecting,
                        Collection<StreamSummary> receivingSummaries,
                        Collection<StreamSummary> sendingSummaries,
                        StreamSession.State state)
@@ -59,11 +59,14 @@
         this.connecting = connecting;
         this.receivingSummaries = ImmutableSet.copyOf(receivingSummaries);
         this.sendingSummaries = ImmutableSet.copyOf(sendingSummaries);
-        this.receivingFiles = new ConcurrentHashMap<>();
-        this.sendingFiles = new ConcurrentHashMap<>();
         this.state = state;
     }
 
+    public SessionInfo(SessionInfo other)
+    {
+        this(other.peer, other.sessionIndex, other.connecting, other.receivingSummaries, other.sendingSummaries, other.state);
+    }
+
     public boolean isFailed()
     {
         return state == StreamSession.State.FAILED;
diff --git a/src/java/org/apache/cassandra/streaming/SessionSummary.java b/src/java/org/apache/cassandra/streaming/SessionSummary.java
index 5b168a0..9588e49 100644
--- a/src/java/org/apache/cassandra/streaming/SessionSummary.java
+++ b/src/java/org/apache/cassandra/streaming/SessionSummary.java
@@ -19,6 +19,7 @@
 package org.apache.cassandra.streaming;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -28,20 +29,19 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.locator.InetAddressAndPort.Serializer;
 
 import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
 
 public class SessionSummary
 {
-    public final InetAddressAndPort coordinator;
-    public final InetAddressAndPort peer;
+    public final InetSocketAddress coordinator;
+    public final InetSocketAddress peer;
     /** Immutable collection of receiving summaries */
     public final Collection<StreamSummary> receivingSummaries;
     /** Immutable collection of sending summaries*/
     public final Collection<StreamSummary> sendingSummaries;
 
-    public SessionSummary(InetAddressAndPort coordinator, InetAddressAndPort peer,
+    public SessionSummary(InetSocketAddress coordinator, InetSocketAddress peer,
                           Collection<StreamSummary> receivingSummaries,
                           Collection<StreamSummary> sendingSummaries)
     {
diff --git a/src/java/org/apache/cassandra/streaming/StreamConnectionFactory.java b/src/java/org/apache/cassandra/streaming/StreamConnectionFactory.java
index 97bb452..95208e4 100644
--- a/src/java/org/apache/cassandra/streaming/StreamConnectionFactory.java
+++ b/src/java/org/apache/cassandra/streaming/StreamConnectionFactory.java
@@ -26,18 +26,4 @@
 public interface StreamConnectionFactory
 {
     Channel createConnection(OutboundConnectionSettings template, int messagingVersion) throws IOException;
-
-    /** Provide way to disable getPreferredIP() for tools without access to the system keyspace
-     * <p> 
-     * CASSANDRA-17663 moves calls to SystemKeyspace.getPreferredIP() outside of any threads
-     * that are regularly interrupted.  However the streaming subsystem is also used
-     * by the bulk loader tool, which does not have direct access to the local tables
-     * and uses the client metadata/queries to retrieve it.
-     *
-     * @return true if SystemKeyspace.getPreferredIP() should be used when connecting
-     */
-    default boolean supportsPreferredIp()
-    {
-        return true;
-    }
 }
diff --git a/src/java/org/apache/cassandra/streaming/StreamCoordinator.java b/src/java/org/apache/cassandra/streaming/StreamCoordinator.java
index 8bcf54e..ad292517 100644
--- a/src/java/org/apache/cassandra/streaming/StreamCoordinator.java
+++ b/src/java/org/apache/cassandra/streaming/StreamCoordinator.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.streaming;
 
+import java.net.InetSocketAddress;
 import java.util.*;
 import java.util.concurrent.ConcurrentHashMap;
 
@@ -25,6 +26,9 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.net.MessagingService.current_version;
 
 
 /**
@@ -40,17 +44,17 @@
 
     private final boolean connectSequentially;
 
-    private final Map<InetAddressAndPort, HostStreamingData> peerSessions = new ConcurrentHashMap<>();
+    private final Map<InetSocketAddress, HostStreamingData> peerSessions = new ConcurrentHashMap<>();
     private final StreamOperation streamOperation;
     private final int connectionsPerHost;
     private final boolean follower;
-    private StreamConnectionFactory factory;
+    private StreamingChannel.Factory factory;
     private Iterator<StreamSession> sessionsToConnect = null;
-    private final UUID pendingRepair;
+    private final TimeUUID pendingRepair;
     private final PreviewKind previewKind;
 
-    public StreamCoordinator(StreamOperation streamOperation, int connectionsPerHost, StreamConnectionFactory factory,
-                             boolean follower, boolean connectSequentially, UUID pendingRepair, PreviewKind previewKind)
+    public StreamCoordinator(StreamOperation streamOperation, int connectionsPerHost, StreamingChannel.Factory factory,
+                             boolean follower, boolean connectSequentially, TimeUUID pendingRepair, PreviewKind previewKind)
     {
         this.streamOperation = streamOperation;
         this.connectionsPerHost = connectionsPerHost;
@@ -61,7 +65,7 @@
         this.previewKind = previewKind;
     }
 
-    public void setConnectionFactory(StreamConnectionFactory factory)
+    public void setConnectionFactory(StreamingChannel.Factory factory)
     {
         this.factory = factory;
     }
@@ -148,19 +152,19 @@
             logger.debug("Finished connecting all sessions");
     }
 
-    public synchronized Set<InetAddressAndPort> getPeers()
+    public synchronized Set<InetSocketAddress> getPeers()
     {
         return new HashSet<>(peerSessions.keySet());
     }
 
-    public synchronized StreamSession getOrCreateNextSession(InetAddressAndPort peer)
+    public synchronized StreamSession getOrCreateOutboundSession(InetAddressAndPort peer)
     {
-        return getOrCreateHostData(peer).getOrCreateNextSession(peer);
+        return getOrCreateHostData(peer).getOrCreateOutboundSession(peer);
     }
 
-    public synchronized StreamSession getOrCreateSessionById(InetAddressAndPort peer, int id)
+    public synchronized StreamSession getOrCreateInboundSession(InetAddressAndPort from, StreamingChannel channel, int messagingVersion, int id)
     {
-        return getOrCreateHostData(peer).getOrCreateSessionById(peer, id);
+        return getOrCreateHostData(from).getOrCreateInboundSession(from, channel, messagingVersion, id);
     }
 
     public StreamSession getSessionById(InetAddressAndPort peer, int id)
@@ -199,13 +203,13 @@
 
             for (Collection<OutgoingStream> bucket : buckets)
             {
-                StreamSession session = sessionList.getOrCreateNextSession(to);
+                StreamSession session = sessionList.getOrCreateOutboundSession(to);
                 session.addTransferStreams(bucket);
             }
         }
         else
         {
-            StreamSession session = sessionList.getOrCreateNextSession(to);
+            StreamSession session = sessionList.getOrCreateOutboundSession(to);
             session.addTransferStreams(streams);
         }
     }
@@ -242,7 +246,7 @@
         return data;
     }
 
-    private HostStreamingData getOrCreateHostData(InetAddressAndPort peer)
+    private HostStreamingData getOrCreateHostData(InetSocketAddress peer)
     {
         HostStreamingData data = peerSessions.get(peer);
         if (data == null)
@@ -253,7 +257,7 @@
         return data;
     }
 
-    public UUID getPendingRepair()
+    public TimeUUID getPendingRepair()
     {
         return pendingRepair;
     }
@@ -281,12 +285,12 @@
             return false;
         }
 
-        public StreamSession getOrCreateNextSession(InetAddressAndPort peer)
+        public StreamSession getOrCreateOutboundSession(InetAddressAndPort peer)
         {
             // create
             if (streamSessions.size() < connectionsPerHost)
             {
-                StreamSession session = new StreamSession(streamOperation, peer, factory, isFollower(), streamSessions.size(),
+                StreamSession session = new StreamSession(streamOperation, peer, factory, null, current_version, isFollower(), streamSessions.size(),
                                                           pendingRepair, previewKind);
                 streamSessions.put(++lastReturned, session);
                 sessionInfos.put(lastReturned, session.getSessionInfo());
@@ -315,12 +319,12 @@
             return Collections.unmodifiableCollection(streamSessions.values());
         }
 
-        public StreamSession getOrCreateSessionById(InetAddressAndPort peer, int id)
+        public StreamSession getOrCreateInboundSession(InetAddressAndPort from, StreamingChannel channel, int messagingVersion, int id)
         {
             StreamSession session = streamSessions.get(id);
             if (session == null)
             {
-                session = new StreamSession(streamOperation, peer, factory, isFollower(), id, pendingRepair, previewKind);
+                session = new StreamSession(streamOperation, from, factory, channel, messagingVersion, isFollower(), id, pendingRepair, previewKind);
                 streamSessions.put(id, session);
                 sessionInfos.put(id, session.getSessionInfo());
             }
diff --git a/src/java/org/apache/cassandra/streaming/StreamDeserializingTask.java b/src/java/org/apache/cassandra/streaming/StreamDeserializingTask.java
new file mode 100644
index 0000000..3785249
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/StreamDeserializingTask.java
@@ -0,0 +1,114 @@
+/*
+ * 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.streaming;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.streaming.messages.KeepAliveMessage;
+import org.apache.cassandra.streaming.messages.StreamMessage;
+import org.apache.cassandra.utils.JVMStabilityInspector;
+
+import static org.apache.cassandra.streaming.StreamSession.createLogTag;
+
+/**
+ * The task that performs the actual deserialization.
+ */
+public class StreamDeserializingTask implements Runnable
+{
+    private static final Logger logger = LoggerFactory.getLogger(StreamDeserializingTask.class);
+
+    private final StreamingChannel channel;
+    private final int messagingVersion;
+    @VisibleForTesting
+    protected StreamSession session;
+
+    public StreamDeserializingTask(StreamSession session, StreamingChannel channel, int messagingVersion)
+    {
+        this.session = session;
+        this.channel = channel;
+        this.messagingVersion = messagingVersion;
+    }
+
+    @Override
+    public void run()
+    {
+        @SuppressWarnings("resource") // closed in finally
+        StreamingDataInputPlus input = channel.in();
+        try
+        {
+            StreamMessage message;
+            while (null != (message = StreamMessage.deserialize(input, messagingVersion)))
+            {
+                // keep-alives don't necessarily need to be tied to a session (they could be arrive before or after
+                // wrt session lifecycle, due to races), just log that we received the message and carry on
+                if (message instanceof KeepAliveMessage)
+                {
+                    if (logger.isDebugEnabled())
+                        logger.debug("{} Received {}", createLogTag(session, channel), message);
+                    continue;
+                }
+
+                if (session == null)
+                    session = deriveSession(message);
+
+                if (logger.isDebugEnabled())
+                    logger.debug("{} Received {}", createLogTag(session, channel), message);
+
+                session.messageReceived(message);
+            }
+        }
+        catch (Throwable t)
+        {
+            JVMStabilityInspector.inspectThrowable(t);
+            if (session != null)
+            {
+                session.onError(t);
+            }
+            else if (t instanceof StreamReceiveException)
+            {
+                ((StreamReceiveException)t).session.onError(t.getCause());
+            }
+            else
+            {
+                logger.error("{} stream operation from {} failed", createLogTag(session, channel), InetAddressAndPort.toString(channel.peer(), true), t);
+            }
+        }
+        finally
+        {
+            channel.close();
+            input.close();
+        }
+    }
+
+    @VisibleForTesting
+    public StreamSession deriveSession(StreamMessage message)
+    {
+        // StreamInitMessage starts a new channel here, but IncomingStreamMessage needs a session
+        // to be established a priori
+        StreamSession streamSession = message.getOrCreateAndAttachInboundSession(channel, messagingVersion);
+
+        // Attach this channel to the session: this only happens upon receiving the first init message as a follower;
+        // in all other cases, no new control channel will be added, as the proper control channel will be already attached.
+        streamSession.attachInbound(channel);
+        return streamSession;
+    }
+}
diff --git a/src/java/org/apache/cassandra/streaming/StreamEvent.java b/src/java/org/apache/cassandra/streaming/StreamEvent.java
index 7ecd081..ff83a19 100644
--- a/src/java/org/apache/cassandra/streaming/StreamEvent.java
+++ b/src/java/org/apache/cassandra/streaming/StreamEvent.java
@@ -20,13 +20,13 @@
 import java.util.Collections;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.ImmutableSet;
 
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.utils.TimeUUID;
 
 public abstract class StreamEvent
 {
@@ -38,9 +38,9 @@
     }
 
     public final Type eventType;
-    public final UUID planId;
+    public final TimeUUID planId;
 
-    protected StreamEvent(Type eventType, UUID planId)
+    protected StreamEvent(Type eventType, TimeUUID planId)
     {
         this.eventType = eventType;
         this.planId = planId;
@@ -71,7 +71,7 @@
     {
         public final ProgressInfo progress;
 
-        public ProgressEvent(UUID planId, ProgressInfo progress)
+        public ProgressEvent(TimeUUID planId, ProgressInfo progress)
         {
             super(Type.FILE_PROGRESS, planId);
             this.progress = progress;
@@ -87,11 +87,13 @@
     public static class SessionPreparedEvent extends StreamEvent
     {
         public final SessionInfo session;
+        public final StreamSession.PrepareDirection prepareDirection;
 
-        public SessionPreparedEvent(UUID planId, SessionInfo session)
+        public SessionPreparedEvent(TimeUUID planId, SessionInfo session, StreamSession.PrepareDirection prepareDirection)
         {
             super(Type.STREAM_PREPARED, planId);
             this.session = session;
+            this.prepareDirection = prepareDirection;
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/streaming/StreamManager.java b/src/java/org/apache/cassandra/streaming/StreamManager.java
index 849f7b5..408b6f4 100644
--- a/src/java/org/apache/cassandra/streaming/StreamManager.java
+++ b/src/java/org/apache/cassandra/streaming/StreamManager.java
@@ -17,9 +17,10 @@
  */
 package org.apache.cassandra.streaming;
 
+import java.util.Collection;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
+import java.util.concurrent.CopyOnWriteArrayList;
 import javax.management.ListenerNotFoundException;
 import javax.management.MBeanNotificationInfo;
 import javax.management.NotificationFilter;
@@ -28,29 +29,37 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Function;
+import com.google.common.cache.Cache;
+import com.google.common.cache.CacheBuilder;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.MoreExecutors;
 import com.google.common.util.concurrent.RateLimiter;
-
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.streaming.management.StreamEventJMXNotifier;
 import org.apache.cassandra.streaming.management.StreamStateCompositeData;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * StreamManager manages currently running {@link StreamResultFuture}s and provides status of all operation invoked.
  *
- * All stream operation should be created through this class to track streaming status and progress.
+ * All stream operations should be created through this class to track streaming status and progress.
  */
 public class StreamManager implements StreamManagerMBean
 {
+    private static final Logger logger = LoggerFactory.getLogger(StreamManager.class);
+
     public static final StreamManager instance = new StreamManager();
 
     /**
      * Gets streaming rate limiter.
-     * When stream_throughput_outbound_megabits_per_sec is 0, this returns rate limiter
+     * When stream_throughput_outbound is 0, this returns rate limiter
      * with the rate of Double.MAX_VALUE bytes per second.
      * Rate unit is bytes per sec.
      *
@@ -58,25 +67,60 @@
      */
     public static StreamRateLimiter getRateLimiter(InetAddressAndPort peer)
     {
-        return new StreamRateLimiter(peer);
+        return new StreamRateLimiter(peer,
+                                     StreamRateLimiter.LIMITER,
+                                     StreamRateLimiter.INTER_DC_LIMITER,
+                                     DatabaseDescriptor.getStreamThroughputOutboundBytesPerSec(),
+                                     DatabaseDescriptor.getInterDCStreamThroughputOutboundBytesPerSec());
     }
 
-    public static class StreamRateLimiter
+    /**
+     * Get streaming rate limiter for entire SSTable operations.
+     * When {@code entire_sstable_stream_throughput_outbound}
+     * is less than or equal ot {@code 0}, this returns rate limiter with the
+     * rate of {@link Double.MAX_VALUE} bytes per second.
+     * Rate unit is bytes per sec.
+     *
+     * @param peer the peer location
+     * @return {@link  StreamRateLimiter} with entire SSTable rate limit set based on peer location
+     */
+    public static StreamRateLimiter getEntireSSTableRateLimiter(InetAddressAndPort peer)
     {
-        public static final double BYTES_PER_MEGABIT = (1000 * 1000) / 8.0;
-        private static final RateLimiter limiter = RateLimiter.create(calculateRateInBytes());
-        private static final RateLimiter interDCLimiter = RateLimiter.create(calculateInterDCRateInBytes());
-        private final boolean isLocalDC;
+        return new StreamRateLimiter(peer,
+                                     StreamRateLimiter.ENTIRE_SSTABLE_LIMITER,
+                                     StreamRateLimiter.ENTIRE_SSTABLE_INTER_DC_LIMITER,
+                                     DatabaseDescriptor.getEntireSSTableStreamThroughputOutboundBytesPerSec(),
+                                     DatabaseDescriptor.getEntireSSTableInterDCStreamThroughputOutboundBytesPerSec());
+    }
 
-        public StreamRateLimiter(InetAddressAndPort peer)
+    public static class StreamRateLimiter implements StreamingDataOutputPlus.RateLimiter
+    {
+        public static final double BYTES_PER_MEBIBYTE = 1024.0 * 1024.0;
+        private static final RateLimiter LIMITER = RateLimiter.create(calculateRateInBytes());
+        private static final RateLimiter INTER_DC_LIMITER = RateLimiter.create(calculateInterDCRateInBytes());
+        private static final RateLimiter ENTIRE_SSTABLE_LIMITER = RateLimiter.create(calculateEntireSSTableRateInBytes());
+        private static final RateLimiter ENTIRE_SSTABLE_INTER_DC_LIMITER = RateLimiter.create(calculateEntireSSTableInterDCRateInBytes());
+
+        private final RateLimiter limiter;
+        private final RateLimiter interDCLimiter;
+        private final boolean isLocalDC;
+        private final double throughput;
+        private final double interDCThroughput;
+
+        private StreamRateLimiter(InetAddressAndPort peer, RateLimiter limiter, RateLimiter interDCLimiter, double throughput, double interDCThroughput)
         {
+            this.limiter = limiter;
+            this.interDCLimiter = interDCLimiter;
+            this.throughput = throughput;
+            this.interDCThroughput = interDCThroughput;
             if (DatabaseDescriptor.getLocalDataCenter() != null && DatabaseDescriptor.getEndpointSnitch() != null)
                 isLocalDC = DatabaseDescriptor.getLocalDataCenter().equals(
-                            DatabaseDescriptor.getEndpointSnitch().getDatacenter(peer));
+                DatabaseDescriptor.getEndpointSnitch().getDatacenter(peer));
             else
                 isLocalDC = true;
         }
 
+        @Override
         public void acquire(int toTransfer)
         {
             limiter.acquire(toTransfer);
@@ -84,52 +128,180 @@
                 interDCLimiter.acquire(toTransfer);
         }
 
+        @Override
+        public boolean isRateLimited()
+        {
+            // Rate limiting is enabled when throughput greater than 0.
+            // If the peer is not local, also check whether inter-DC rate limiting is enabled.
+            return throughput > 0 || (!isLocalDC && interDCThroughput > 0);
+        }
+
         public static void updateThroughput()
         {
-            limiter.setRate(calculateRateInBytes());
+            LIMITER.setRate(calculateRateInBytes());
         }
 
         public static void updateInterDCThroughput()
         {
-            interDCLimiter.setRate(calculateInterDCRateInBytes());
+            INTER_DC_LIMITER.setRate(calculateInterDCRateInBytes());
+        }
+
+        public static void updateEntireSSTableThroughput()
+        {
+            ENTIRE_SSTABLE_LIMITER.setRate(calculateEntireSSTableRateInBytes());
+        }
+
+        public static void updateEntireSSTableInterDCThroughput()
+        {
+            ENTIRE_SSTABLE_INTER_DC_LIMITER.setRate(calculateEntireSSTableInterDCRateInBytes());
         }
 
         private static double calculateRateInBytes()
         {
-            return DatabaseDescriptor.getStreamThroughputOutboundMegabitsPerSec() > 0
-                   ? DatabaseDescriptor.getStreamThroughputOutboundMegabitsPerSec() * BYTES_PER_MEGABIT
-                   : Double.MAX_VALUE; // if throughput is set to 0 or negative value, throttling is disabled
+            double throughput = DatabaseDescriptor.getStreamThroughputOutboundBytesPerSec();
+            return calculateEffectiveRateInBytes(throughput);
         }
 
         private static double calculateInterDCRateInBytes()
         {
-            return DatabaseDescriptor.getInterDCStreamThroughputOutboundMegabitsPerSec() > 0
-                   ? DatabaseDescriptor.getInterDCStreamThroughputOutboundMegabitsPerSec() * BYTES_PER_MEGABIT
-                   : Double.MAX_VALUE; // if throughput is set to 0 or negative value, throttling is disabled
+            double throughput = DatabaseDescriptor.getInterDCStreamThroughputOutboundBytesPerSec();
+            return calculateEffectiveRateInBytes(throughput);
+        }
+
+        private static double calculateEntireSSTableRateInBytes()
+        {
+            double throughput = DatabaseDescriptor.getEntireSSTableStreamThroughputOutboundBytesPerSec();
+            return calculateEffectiveRateInBytes(throughput);
+        }
+
+        private static double calculateEntireSSTableInterDCRateInBytes()
+        {
+            double throughput = DatabaseDescriptor.getEntireSSTableInterDCStreamThroughputOutboundBytesPerSec();
+            return calculateEffectiveRateInBytes(throughput);
         }
 
         @VisibleForTesting
         public static double getRateLimiterRateInBytes()
         {
-            return limiter.getRate();
+            return LIMITER.getRate();
         }
 
         @VisibleForTesting
         public static double getInterDCRateLimiterRateInBytes()
         {
-            return interDCLimiter.getRate();
+            return INTER_DC_LIMITER.getRate();
+        }
+
+        @VisibleForTesting
+        public static double getEntireSSTableRateLimiterRateInBytes()
+        {
+            return ENTIRE_SSTABLE_LIMITER.getRate();
+        }
+
+        @VisibleForTesting
+        public static double getEntireSSTableInterDCRateLimiterRateInBytes()
+        {
+            return ENTIRE_SSTABLE_INTER_DC_LIMITER.getRate();
+        }
+
+        private static double calculateEffectiveRateInBytes(double throughput)
+        {
+            // if throughput is set to 0, throttling is disabled
+            return throughput > 0
+                   ? throughput
+                   : Double.MAX_VALUE;
         }
     }
 
     private final StreamEventJMXNotifier notifier = new StreamEventJMXNotifier();
+    private final CopyOnWriteArrayList<StreamListener> listeners = new CopyOnWriteArrayList<>();
 
     /*
      * Currently running streams. Removed after completion/failure.
      * We manage them in two different maps to distinguish plan from initiated ones to
      * receiving ones withing the same JVM.
      */
-    private final Map<UUID, StreamResultFuture> initiatorStreams = new NonBlockingHashMap<>();
-    private final Map<UUID, StreamResultFuture> followerStreams = new NonBlockingHashMap<>();
+    private final Map<TimeUUID, StreamResultFuture> initiatorStreams = new NonBlockingHashMap<>();
+    private final Map<TimeUUID, StreamResultFuture> followerStreams = new NonBlockingHashMap<>();
+
+    private final Cache<TimeUUID, StreamingState> states;
+    private final StreamListener listener = new StreamListener()
+    {
+        @Override
+        public void onRegister(StreamResultFuture result)
+        {
+            if (!DatabaseDescriptor.getStreamingStatsEnabled())
+                return;
+            // reason for synchronized rather than states.get is to detect duplicates
+            // streaming shouldn't be producing duplicates as that would imply a planId collision
+            synchronized (states)
+            {
+                StreamingState previous = states.getIfPresent(result.planId);
+                if (previous == null)
+                {
+                    StreamingState state = new StreamingState(result);
+                    states.put(state.id(), state);
+                    state.phase.start();
+                    result.addEventListener(state);
+                }
+                else
+                {
+                    logger.warn("Duplicate streaming states detected for id {}", result.planId);
+                }
+            }
+        }
+    };
+
+    public StreamManager()
+    {
+        DurationSpec.LongNanosecondsBound duration = DatabaseDescriptor.getStreamingStateExpires();
+        long sizeBytes = DatabaseDescriptor.getStreamingStateSize().toBytes();
+        long numElements = sizeBytes / StreamingState.ELEMENT_SIZE;
+        logger.info("Storing streaming state for {} or for {} elements", duration, numElements);
+        states = CacheBuilder.newBuilder()
+                             .expireAfterWrite(duration.quantity(), duration.unit())
+                             .maximumSize(numElements)
+                             .build();
+    }
+
+    public void start()
+    {
+        addListener(listener);
+    }
+
+    public void stop()
+    {
+        removeListener(listener);
+    }
+
+    public Collection<StreamingState> getStreamingStates()
+    {
+        return states.asMap().values();
+    }
+
+    public StreamingState getStreamingState(TimeUUID id)
+    {
+        return states.getIfPresent(id);
+    }
+
+    @VisibleForTesting
+    public void putStreamingState(StreamingState state)
+    {
+        synchronized (states)
+        {
+            StreamingState previous = states.getIfPresent(state.id());
+            if (previous != null)
+                throw new AssertionError("StreamPlan id " + state.id() + " already exists");
+            states.put(state.id(), state);
+        }
+    }
+
+    @VisibleForTesting
+    public void clearStates()
+    {
+        // states.cleanUp() doesn't clear, it looks to only run gc on things that could be removed... this method should remove all state
+        states.asMap().clear();
+    }
 
     public Set<CompositeData> getCurrentStreams()
     {
@@ -142,42 +314,104 @@
         }));
     }
 
+    @Override
+    public boolean getStreamingStatsEnabled()
+    {
+        return DatabaseDescriptor.getStreamingStatsEnabled();
+    }
+
+    @Override
+    public void setStreamingStatsEnabled(boolean streamingStatsEnabled)
+    {
+        DatabaseDescriptor.setStreamingStatsEnabled(streamingStatsEnabled);
+    }
+
+    @Override
+    public String getStreamingSlowEventsLogTimeout()
+    {
+        return DatabaseDescriptor.getStreamingSlowEventsLogTimeout().toString();
+    }
+
+    @Override
+    public void setStreamingSlowEventsLogTimeout(String value)
+    {
+        DatabaseDescriptor.setStreamingSlowEventsLogTimeout(value);
+    }
+
     public void registerInitiator(final StreamResultFuture result)
     {
         result.addEventListener(notifier);
         // Make sure we remove the stream on completion (whether successful or not)
-        result.addListener(new Runnable()
-        {
-            public void run()
-            {
-                initiatorStreams.remove(result.planId);
-            }
-        }, MoreExecutors.directExecutor());
+        result.addListener(() -> initiatorStreams.remove(result.planId));
 
         initiatorStreams.put(result.planId, result);
+        notifySafeOnRegister(result);
     }
 
     public StreamResultFuture registerFollower(final StreamResultFuture result)
     {
         result.addEventListener(notifier);
         // Make sure we remove the stream on completion (whether successful or not)
-        result.addListener(new Runnable()
-        {
-            public void run()
-            {
-                followerStreams.remove(result.planId);
-            }
-        }, MoreExecutors.directExecutor());
+        result.addListener(() -> followerStreams.remove(result.planId));
 
         StreamResultFuture previous = followerStreams.putIfAbsent(result.planId, result);
-        return previous ==  null ? result : previous;
+        if (previous == null)
+        {
+            notifySafeOnRegister(result);
+            return result;
+        }
+        return previous;
     }
 
-    public StreamResultFuture getReceivingStream(UUID planId)
+    @VisibleForTesting
+    public void putInitiatorStream(StreamResultFuture future)
+    {
+        StreamResultFuture current = initiatorStreams.putIfAbsent(future.planId, future);
+        assert current == null: "Duplicat initiator stream for " + future.planId;
+    }
+
+    @VisibleForTesting
+    public void putFollowerStream(StreamResultFuture future)
+    {
+        StreamResultFuture current = followerStreams.putIfAbsent(future.planId, future);
+        assert current == null: "Duplicate follower stream for " + future.planId;
+    }
+
+    public void addListener(StreamListener listener)
+    {
+        listeners.add(listener);
+    }
+
+    public void removeListener(StreamListener listener)
+    {
+        listeners.remove(listener);
+    }
+
+    private void notifySafeOnRegister(StreamResultFuture result)
+    {
+        for (StreamListener l : listeners)
+        {
+            try
+            {
+                l.onRegister(result);
+            }
+            catch (Throwable t)
+            {
+                logger.warn("Failed to notify stream listener of new Initiator/Follower", t);
+            }
+        }
+    }
+
+    public StreamResultFuture getReceivingStream(TimeUUID planId)
     {
         return followerStreams.get(planId);
     }
 
+    public StreamResultFuture getInitiatorStream(TimeUUID planId)
+    {
+        return initiatorStreams.get(planId);
+    }
+
     public void addNotificationListener(NotificationListener listener, NotificationFilter filter, Object handback)
     {
         notifier.addNotificationListener(listener, filter, handback);
@@ -198,13 +432,13 @@
         return notifier.getNotificationInfo();
     }
 
-    public StreamSession findSession(InetAddressAndPort peer, UUID planId, int sessionIndex, boolean searchInitiatorSessions)
+    public StreamSession findSession(InetAddressAndPort peer, TimeUUID planId, int sessionIndex, boolean searchInitiatorSessions)
     {
-        Map<UUID, StreamResultFuture> streams = searchInitiatorSessions ? initiatorStreams : followerStreams;
+        Map<TimeUUID, StreamResultFuture> streams = searchInitiatorSessions ? initiatorStreams : followerStreams;
         return findSession(streams, peer, planId, sessionIndex);
     }
 
-    private StreamSession findSession(Map<UUID, StreamResultFuture> streams, InetAddressAndPort peer, UUID planId, int sessionIndex)
+    private StreamSession findSession(Map<TimeUUID, StreamResultFuture> streams, InetAddressAndPort peer, TimeUUID planId, int sessionIndex)
     {
         StreamResultFuture streamResultFuture = streams.get(planId);
         if (streamResultFuture == null)
@@ -212,4 +446,9 @@
 
         return streamResultFuture.getSession(peer, sessionIndex);
     }
+
+    public interface StreamListener
+    {
+        default void onRegister(StreamResultFuture result) {}
+    }
 }
diff --git a/src/java/org/apache/cassandra/streaming/StreamManagerMBean.java b/src/java/org/apache/cassandra/streaming/StreamManagerMBean.java
index f329596..e49c059 100644
--- a/src/java/org/apache/cassandra/streaming/StreamManagerMBean.java
+++ b/src/java/org/apache/cassandra/streaming/StreamManagerMBean.java
@@ -29,4 +29,24 @@
      * Returns the current state of all ongoing streams.
      */
     Set<CompositeData> getCurrentStreams();
+
+    /**
+     * @return whether the streaming virtual table should collect stats while streaming is running
+     */
+    boolean getStreamingStatsEnabled();
+
+    /**
+     * enable/disable collection of streaming stats while streaming is running.
+     */
+    void setStreamingStatsEnabled(boolean streamingStatsEnabled);
+
+    /**
+     * @return current timeout for streaming slow events log
+     */
+    String getStreamingSlowEventsLogTimeout();
+
+    /**
+     * Sets the timeout for the streaming slow events log
+     */
+    void setStreamingSlowEventsLogTimeout(String value);
 }
diff --git a/src/java/org/apache/cassandra/streaming/StreamPlan.java b/src/java/org/apache/cassandra/streaming/StreamPlan.java
index 60845fa..9e79a5d 100644
--- a/src/java/org/apache/cassandra/streaming/StreamPlan.java
+++ b/src/java/org/apache/cassandra/streaming/StreamPlan.java
@@ -24,10 +24,12 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.locator.Replica;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static com.google.common.collect.Iterables.all;
 import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
+import static org.apache.cassandra.streaming.StreamingChannel.Factory.Global.streamingFactory;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * {@link StreamPlan} is a helper class that builds StreamOperation of given configuration.
@@ -37,7 +39,7 @@
 public class StreamPlan
 {
     private static final String[] EMPTY_COLUMN_FAMILIES = new String[0];
-    private final UUID planId = UUIDGen.getTimeUUID();
+    private final TimeUUID planId = nextTimeUUID();
     private final StreamOperation streamOperation;
     private final List<StreamEventHandler> handlers = new ArrayList<>();
     private final StreamCoordinator coordinator;
@@ -60,10 +62,10 @@
     }
 
     public StreamPlan(StreamOperation streamOperation, int connectionsPerHost,
-                      boolean connectSequentially, UUID pendingRepair, PreviewKind previewKind)
+                      boolean connectSequentially, TimeUUID pendingRepair, PreviewKind previewKind)
     {
         this.streamOperation = streamOperation;
-        this.coordinator = new StreamCoordinator(streamOperation, connectionsPerHost, new DefaultConnectionFactory(),
+        this.coordinator = new StreamCoordinator(streamOperation, connectionsPerHost, streamingFactory(),
                                                  false, connectSequentially, pendingRepair, previewKind);
     }
 
@@ -107,7 +109,7 @@
         assert all(fullRanges, Replica::isSelf) || RangesAtEndpoint.isDummyList(fullRanges) : fullRanges.toString();
         assert all(transientRanges, Replica::isSelf) || RangesAtEndpoint.isDummyList(transientRanges) : transientRanges.toString();
 
-        StreamSession session = coordinator.getOrCreateNextSession(from);
+        StreamSession session = coordinator.getOrCreateOutboundSession(from);
         session.addStreamRequest(keyspace, fullRanges, transientRanges, Arrays.asList(columnFamilies));
         return this;
     }
@@ -123,7 +125,7 @@
      */
     public StreamPlan transferRanges(InetAddressAndPort to, String keyspace, RangesAtEndpoint replicas, String... columnFamilies)
     {
-        StreamSession session = coordinator.getOrCreateNextSession(to);
+        StreamSession session = coordinator.getOrCreateOutboundSession(to);
         session.addTransferRanges(keyspace, replicas, Arrays.asList(columnFamilies), flushBeforeTransfer);
         return this;
     }
@@ -155,7 +157,7 @@
      * @param factory StreamConnectionFactory to use
      * @return self
      */
-    public StreamPlan connectionFactory(StreamConnectionFactory factory)
+    public StreamPlan connectionFactory(StreamingChannel.Factory factory)
     {
         this.coordinator.setConnectionFactory(factory);
         return this;
@@ -192,7 +194,7 @@
         return this;
     }
 
-    public UUID getPendingRepair()
+    public TimeUUID getPendingRepair()
     {
         return coordinator.getPendingRepair();
     }
diff --git a/src/java/org/apache/cassandra/streaming/StreamReceiveException.java b/src/java/org/apache/cassandra/streaming/StreamReceiveException.java
index 54b365a..c564182 100644
--- a/src/java/org/apache/cassandra/streaming/StreamReceiveException.java
+++ b/src/java/org/apache/cassandra/streaming/StreamReceiveException.java
@@ -18,7 +18,9 @@
 
 package org.apache.cassandra.streaming;
 
-public class StreamReceiveException extends RuntimeException
+import java.io.IOException;
+
+public class StreamReceiveException extends IOException
 {
     public final StreamSession session;
 
diff --git a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java
index d127edb..002e182 100644
--- a/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java
+++ b/src/java/org/apache/cassandra/streaming/StreamReceiveTask.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.streaming;
 
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
@@ -26,11 +25,11 @@
 import com.google.common.base.Preconditions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.apache.cassandra.utils.ExecutorUtils.awaitTermination;
 import static org.apache.cassandra.utils.ExecutorUtils.shutdown;
 
@@ -41,7 +40,7 @@
 {
     private static final Logger logger = LoggerFactory.getLogger(StreamReceiveTask.class);
 
-    private static final ExecutorService executor = Executors.newCachedThreadPool(new NamedThreadFactory("StreamReceiveTask"));
+    private static final ExecutorService executor = executorFactory().pooled("StreamReceiveTask", Integer.MAX_VALUE);
 
     private final StreamReceiver receiver;
 
diff --git a/src/java/org/apache/cassandra/streaming/StreamResultFuture.java b/src/java/org/apache/cassandra/streaming/StreamResultFuture.java
index 3b8ffdc..b43203d 100644
--- a/src/java/org/apache/cassandra/streaming/StreamResultFuture.java
+++ b/src/java/org/apache/cassandra/streaming/StreamResultFuture.java
@@ -17,20 +17,26 @@
  */
 package org.apache.cassandra.streaming;
 
+import java.time.Duration;
 import java.util.Collection;
-import java.util.UUID;
 import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.TimeUnit;
 
-import com.google.common.util.concurrent.AbstractFuture;
-import com.google.common.util.concurrent.Futures;
-import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.netty.channel.Channel;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.streaming.StreamingChannel.Factory.Global.streamingFactory;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * A future on the result ({@link StreamState}) of a streaming plan.
  *
@@ -44,14 +50,15 @@
  * You can attach {@link StreamEventHandler} to this object to listen on {@link StreamEvent}s to
  * track progress of the streaming.
  */
-public final class StreamResultFuture extends AbstractFuture<StreamState>
+public final class StreamResultFuture extends AsyncFuture<StreamState>
 {
     private static final Logger logger = LoggerFactory.getLogger(StreamResultFuture.class);
 
-    public final UUID planId;
+    public final TimeUUID planId;
     public final StreamOperation streamOperation;
     private final StreamCoordinator coordinator;
     private final Collection<StreamEventHandler> eventListeners = new ConcurrentLinkedQueue<>();
+    private final long slowEventsLogTimeoutNanos = DatabaseDescriptor.getStreamingSlowEventsLogTimeout().toNanoseconds();
 
     /**
      * Create new StreamResult of given {@code planId} and streamOperation.
@@ -61,7 +68,7 @@
      * @param planId Stream plan ID
      * @param streamOperation Stream streamOperation
      */
-    private StreamResultFuture(UUID planId, StreamOperation streamOperation, StreamCoordinator coordinator)
+    public StreamResultFuture(TimeUUID planId, StreamOperation streamOperation, StreamCoordinator coordinator)
     {
         this.planId = planId;
         this.streamOperation = streamOperation;
@@ -69,15 +76,16 @@
 
         // if there is no session to listen to, we immediately set result for returning
         if (!coordinator.isFollower() && !coordinator.hasActiveSessions())
-            set(getCurrentState());
+            trySuccess(getCurrentState());
     }
 
-    private StreamResultFuture(UUID planId, StreamOperation streamOperation, UUID pendingRepair, PreviewKind previewKind)
+    @VisibleForTesting
+    public StreamResultFuture(TimeUUID planId, StreamOperation streamOperation, TimeUUID pendingRepair, PreviewKind previewKind)
     {
-        this(planId, streamOperation, new StreamCoordinator(streamOperation, 0, new DefaultConnectionFactory(), true, false, pendingRepair, previewKind));
+        this(planId, streamOperation, new StreamCoordinator(streamOperation, 0, streamingFactory(), true, false, pendingRepair, previewKind));
     }
 
-    public static StreamResultFuture createInitiator(UUID planId, StreamOperation streamOperation, Collection<StreamEventHandler> listeners,
+    public static StreamResultFuture createInitiator(TimeUUID planId, StreamOperation streamOperation, Collection<StreamEventHandler> listeners,
                                                      StreamCoordinator coordinator)
     {
         StreamResultFuture future = createAndRegisterInitiator(planId, streamOperation, coordinator);
@@ -101,31 +109,31 @@
     }
 
     public static synchronized StreamResultFuture createFollower(int sessionIndex,
-                                                                 UUID planId,
+                                                                 TimeUUID planId,
                                                                  StreamOperation streamOperation,
                                                                  InetAddressAndPort from,
-                                                                 Channel channel,
-                                                                 UUID pendingRepair,
+                                                                 StreamingChannel channel,
+                                                                 int messagingVersion,
+                                                                 TimeUUID pendingRepair,
                                                                  PreviewKind previewKind)
     {
         StreamResultFuture future = StreamManager.instance.getReceivingStream(planId);
         if (future == null)
         {
-            logger.info("[Stream #{} ID#{}] Creating new streaming plan for {} from {} channel.remote {} channel.local {}" +
-                        " channel.id {}", planId, sessionIndex, streamOperation.getDescription(),
-                        from, channel.remoteAddress(), channel.localAddress(), channel.id());
+            logger.info("[Stream #{} ID#{}] Creating new streaming plan for {} from {} {}", planId, sessionIndex, streamOperation.getDescription(),
+                        from, channel.description());
 
             // The main reason we create a StreamResultFuture on the receiving side is for JMX exposure.
             future = new StreamResultFuture(planId, streamOperation, pendingRepair, previewKind);
             StreamManager.instance.registerFollower(future);
         }
-        future.attachConnection(from, sessionIndex);
-        logger.info("[Stream #{}, ID#{}] Received streaming plan for {} from {} channel.remote {} channel.local {} channel.id {}",
-                    planId, sessionIndex, streamOperation.getDescription(), from, channel.remoteAddress(), channel.localAddress(), channel.id());
+        future.initInbound(from, channel, messagingVersion, sessionIndex);
+        logger.info("[Stream #{}, ID#{}] Received streaming plan for {} from {} {}",
+                    planId, sessionIndex, streamOperation.getDescription(), from, channel.description());
         return future;
     }
 
-    private static StreamResultFuture createAndRegisterInitiator(UUID planId, StreamOperation streamOperation, StreamCoordinator coordinator)
+    private static StreamResultFuture createAndRegisterInitiator(TimeUUID planId, StreamOperation streamOperation, StreamCoordinator coordinator)
     {
         StreamResultFuture future = new StreamResultFuture(planId, streamOperation, coordinator);
         StreamManager.instance.registerInitiator(future);
@@ -137,16 +145,16 @@
         return coordinator;
     }
 
-    private void attachConnection(InetAddressAndPort from, int sessionIndex)
+    private void initInbound(InetAddressAndPort from, StreamingChannel channel, int messagingVersion, int sessionIndex)
     {
-        StreamSession session = coordinator.getOrCreateSessionById(from, sessionIndex);
+        StreamSession session = coordinator.getOrCreateInboundSession(from, channel, messagingVersion, sessionIndex);
         session.init(this);
     }
 
     @SuppressWarnings("UnstableApiUsage")
     public void addEventListener(StreamEventHandler listener)
     {
-        Futures.addCallback(this, listener, MoreExecutors.directExecutor());
+        addCallback(listener);
         eventListeners.add(listener);
     }
 
@@ -173,7 +181,7 @@
         return planId.hashCode();
     }
 
-    void handleSessionPrepared(StreamSession session)
+    void handleSessionPrepared(StreamSession session, StreamSession.PrepareDirection prepareDirection)
     {
         SessionInfo sessionInfo = session.getSessionInfo();
         logger.info("[Stream #{} ID#{}] Prepare completed. Receiving {} files({}), sending {} files({})",
@@ -183,14 +191,14 @@
                               FBUtilities.prettyPrintMemory(sessionInfo.getTotalSizeToReceive()),
                               sessionInfo.getTotalFilesToSend(),
                               FBUtilities.prettyPrintMemory(sessionInfo.getTotalSizeToSend()));
-        StreamEvent.SessionPreparedEvent event = new StreamEvent.SessionPreparedEvent(planId, sessionInfo);
+        StreamEvent.SessionPreparedEvent event = new StreamEvent.SessionPreparedEvent(planId, sessionInfo, prepareDirection);
         coordinator.addSessionInfo(sessionInfo);
         fireStreamEvent(event);
     }
 
     void handleSessionComplete(StreamSession session)
     {
-        logger.info("[Stream #{}] Session with {} is complete", session.planId(), session.peer);
+        logger.info("[Stream #{}] Session with {} is {}", session.planId(), session.peer, session.state().name().toLowerCase());
         fireStreamEvent(new StreamEvent.SessionCompleteEvent(session));
         SessionInfo sessionInfo = session.getSessionInfo();
         coordinator.addSessionInfo(sessionInfo);
@@ -206,8 +214,22 @@
     synchronized void fireStreamEvent(StreamEvent event)
     {
         // delegate to listener
+        long startNanos = nanoTime();
         for (StreamEventHandler listener : eventListeners)
-            listener.handleStreamEvent(event);
+        {
+            try
+            {
+                listener.handleStreamEvent(event);
+            }
+            catch (Throwable t)
+            {
+                logger.warn("Unexpected exception in listern while calling handleStreamEvent", t);
+            }
+        }
+        long totalNanos = nanoTime() - startNanos;
+        if (totalNanos > slowEventsLogTimeoutNanos)
+            NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES, "Handling streaming events took longer than {}; took {}",
+                             () -> new Object[] { Duration.ofNanos(slowEventsLogTimeoutNanos), Duration.ofNanos(totalNanos)});
     }
 
     private synchronized void maybeComplete()
@@ -218,17 +240,17 @@
             if (finalState.hasFailedSession())
             {
                 logger.warn("[Stream #{}] Stream failed", planId);
-                setException(new StreamException(finalState, "Stream failed"));
+                tryFailure(new StreamException(finalState, "Stream failed"));
             }
             else if (finalState.hasAbortedSession())
             {
                 logger.info("[Stream #{}] Stream aborted", planId);
-                set(finalState);
+                trySuccess(finalState);
             }
             else
             {
                 logger.info("[Stream #{}] All sessions completed", planId);
-                set(finalState);
+                trySuccess(finalState);
             }
         }
     }
diff --git a/src/java/org/apache/cassandra/streaming/StreamSession.java b/src/java/org/apache/cassandra/streaming/StreamSession.java
index a2e479c..811717f 100644
--- a/src/java/org/apache/cassandra/streaming/StreamSession.java
+++ b/src/java/org/apache/cassandra/streaming/StreamSession.java
@@ -19,21 +19,36 @@
 
 import java.io.EOFException;
 import java.net.SocketTimeoutException;
-import java.util.*;
-import java.util.concurrent.*;
+import java.nio.channels.ClosedChannelException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.Nullable;
 
 import com.google.common.annotations.VisibleForTesting;
-import com.google.common.collect.*;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
 
+import io.netty.channel.Channel;
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelId;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.dht.Range;
@@ -42,16 +57,17 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.metrics.StreamingMetrics;
-import org.apache.cassandra.net.OutboundConnectionSettings;
 import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.streaming.async.NettyStreamingMessageSender;
+import org.apache.cassandra.streaming.async.StreamingMultiplexedChannel;
 import org.apache.cassandra.streaming.messages.*;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.NoSpamLogger;
 
 import static com.google.common.collect.Iterables.all;
-import static org.apache.cassandra.net.MessagingService.current_version;
+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;
 
 /**
  * Handles the streaming a one or more streams to and from a specific remote node.
@@ -85,7 +101,7 @@
  * 3. Streaming phase
  *
  *   (a) The streaming phase is started at each node by calling {@link StreamSession#startStreamingFiles(boolean)}.
- *       This will send, sequentially on each outbound streaming connection (see {@link NettyStreamingMessageSender}),
+ *       This will send, sequentially on each outbound streaming connection (see {@link StreamingMultiplexedChannel}),
  *       an {@link OutgoingStreamMessage} for each stream in each of the {@link StreamTransferTask}.
  *       Each {@link OutgoingStreamMessage} consists of a {@link StreamMessageHeader} that contains metadata about
  *       the stream, followed by the stream content itself. Once all the files for a {@link StreamTransferTask} are sent,
@@ -126,12 +142,14 @@
  *
  * All messages which derive from {@link StreamMessage} are sent by the standard internode messaging
  * (via {@link org.apache.cassandra.net.MessagingService}, while the actual files themselves are sent by a special
- * "streaming" connection type. See {@link NettyStreamingMessageSender} for details. Because of the asynchronous
+ * "streaming" connection type. See {@link StreamingMultiplexedChannel} for details. Because of the asynchronous
  */
 public class StreamSession implements IEndpointStateChangeSubscriber
 {
     private static final Logger logger = LoggerFactory.getLogger(StreamSession.class);
 
+    public enum PrepareDirection { SEND, ACK }
+
     // for test purpose to record received message and state transition
     public volatile static MessageStateSink sink = MessageStateSink.NONE;
 
@@ -143,7 +161,6 @@
      * Each {@code StreamSession} is identified by this InetAddressAndPort which is broadcast address of the node streaming.
      */
     public final InetAddressAndPort peer;
-    private final OutboundConnectionSettings template;
 
     private final int index;
 
@@ -162,9 +179,10 @@
     final Map<String, Set<Range<Token>>> transferredRangesPerKeyspace = new HashMap<>();
 
     private final boolean isFollower;
-    private final NettyStreamingMessageSender messageSender;
+    private final StreamingMultiplexedChannel channel;
     // contains both inbound and outbound channels
-    private final ConcurrentMap<ChannelId, Channel> channels = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Object, StreamingChannel> inbound = new ConcurrentHashMap<>();
+    private final ConcurrentMap<Object, StreamingChannel> outbound = new ConcurrentHashMap<>();
 
     // "maybeCompleted()" should be executed at most once. Because it can be executed asynchronously by IO
     // threads(serialization/deserialization) and stream messaging processing thread, causing connection closed before
@@ -172,7 +190,7 @@
     private boolean maybeCompleted = false;
     private Future<?> closeFuture;
 
-    private final UUID pendingRepair;
+    private final TimeUUID pendingRepair;
     private final PreviewKind previewKind;
 
 /**
@@ -226,21 +244,18 @@
     /**
      * Create new streaming session with the peer.
      */
-    public StreamSession(StreamOperation streamOperation, InetAddressAndPort peer, StreamConnectionFactory factory,
-                         boolean isFollower, int index, UUID pendingRepair, PreviewKind previewKind)
+    public StreamSession(StreamOperation streamOperation, InetAddressAndPort peer, StreamingChannel.Factory factory, @Nullable StreamingChannel controlChannel, int messagingVersion,
+                         boolean isFollower, int index, TimeUUID pendingRepair, PreviewKind previewKind)
     {
         this.streamOperation = streamOperation;
         this.peer = peer;
-        this.template = new OutboundConnectionSettings(peer);
         this.isFollower = isFollower;
         this.index = index;
 
-        this.messageSender = new NettyStreamingMessageSender(this, template, factory, current_version, previewKind.isPreview());
+        this.channel = new StreamingMultiplexedChannel(this, factory, peer, controlChannel, messagingVersion);
         this.metrics = StreamingMetrics.get(peer);
         this.pendingRepair = pendingRepair;
         this.previewKind = previewKind;
-
-        logger.debug("Creating stream session to {} as {}", template, isFollower ? "follower" : "initiator");
     }
 
     public boolean isFollower()
@@ -248,7 +263,7 @@
         return isFollower;
     }
 
-    public UUID planId()
+    public TimeUUID planId()
     {
         return streamResult == null ? null : streamResult.planId;
     }
@@ -268,7 +283,7 @@
         return streamOperation;
     }
 
-    public UUID getPendingRepair()
+    public TimeUUID getPendingRepair()
     {
         return pendingRepair;
     }
@@ -305,18 +320,19 @@
      * Attach a channel to this session upon receiving the first inbound message.
      *
      * @param channel The channel to attach.
-     * @param isControlChannel If the channel is the one to send control messages to.
      * @return False if the channel was already attached, true otherwise.
      */
-    public synchronized boolean attachInbound(Channel channel, boolean isControlChannel)
+    public synchronized boolean attachInbound(StreamingChannel channel)
     {
         failIfFinished();
 
-        if (!messageSender.hasControlChannel() && isControlChannel)
-            messageSender.injectControlMessageChannel(channel);
-
-        channel.closeFuture().addListener(ignored -> onChannelClose(channel));
-        return channels.putIfAbsent(channel.id(), channel) == null;
+        boolean attached = inbound.putIfAbsent(channel.id(), channel) == null;
+        if (attached)
+            channel.onClose(() -> {
+                if (null != inbound.remove(channel.id()) && inbound.isEmpty())
+                    this.channel.close();
+            });
+        return attached;
     }
 
     /**
@@ -325,22 +341,14 @@
      * @param channel The channel to attach.
      * @return False if the channel was already attached, true otherwise.
      */
-    public synchronized boolean attachOutbound(Channel channel)
+    public synchronized boolean attachOutbound(StreamingChannel channel)
     {
         failIfFinished();
 
-        channel.closeFuture().addListener(ignored -> onChannelClose(channel));
-        return channels.putIfAbsent(channel.id(), channel) == null;
-    }
-
-    /**
-     * On channel closing, if no channels are left just close the message sender; this must be closed last to ensure
-     * keep alive messages are sent until the very end of the streaming session.
-     */
-    private void onChannelClose(Channel channel)
-    {
-        if (channels.remove(channel.id()) != null && channels.isEmpty())
-            messageSender.close();
+        boolean attached = outbound.putIfAbsent(channel.id(), channel) == null;
+        if (attached)
+            channel.onClose(() -> outbound.remove(channel.id()));
+        return attached;
     }
 
     /**
@@ -358,9 +366,17 @@
         try
         {
             logger.info("[Stream #{}] Starting streaming to {}{}", planId(),
-                                                                   peer,
-                                                                   template.connectTo == null ? "" : " through " + template.connectTo);
-            messageSender.initialize();
+                        hostAddressAndPort(channel.peer()),
+                        channel.connectedTo().equals(channel.peer()) ? "" : " through " + hostAddressAndPort(channel.connectedTo()));
+
+            StreamInitMessage message = new StreamInitMessage(getBroadcastAddressAndPort(),
+                                                              sessionIndex(),
+                                                              planId(),
+                                                              streamOperation(),
+                                                              getPendingRepair(),
+                                                              getPreviewKind());
+
+            channel.sendControlMessage(message).sync();
             onInitializationComplete();
         }
         catch (Exception e)
@@ -443,7 +459,7 @@
     }
 
     @VisibleForTesting
-    public List<OutgoingStream> getOutgoingStreamsForRanges(RangesAtEndpoint replicas, Collection<ColumnFamilyStore> stores, UUID pendingRepair, PreviewKind previewKind)
+    public List<OutgoingStream> getOutgoingStreamsForRanges(RangesAtEndpoint replicas, Collection<ColumnFamilyStore> stores, TimeUUID pendingRepair, PreviewKind previewKind)
     {
         List<OutgoingStream> streams = new ArrayList<>();
         try
@@ -499,13 +515,14 @@
         // due to failure, channels should be always closed regardless, even if this is not the initator.
         if (!isFollower || state != State.COMPLETE)
         {
-            logger.debug("[Stream #{}] Will close attached channels {}", planId(), channels);
-            channels.values().forEach(channel -> futures.add(channel.close()));
+            logger.debug("[Stream #{}] Will close attached inbound {} and outbound {} channels", planId(), inbound, outbound);
+            inbound.values().forEach(channel -> futures.add(channel.close()));
+            outbound.values().forEach(channel -> futures.add(channel.close()));
         }
 
         sink.onClose(peer);
         streamResult.handleSessionComplete(this);
-        closeFuture = FBUtilities.allOf(futures);
+        closeFuture = FutureCombiner.allOf(futures);
 
         return closeFuture;
     }
@@ -530,8 +547,8 @@
      */
     public void state(State newState)
     {
-        if (logger.isTraceEnabled())
-            logger.trace("[Stream #{}] Changing session state from {} to {}", planId(), state, newState);
+        if (logger.isDebugEnabled())
+            logger.debug("[Stream #{}] Changing session state from {} to {}", planId(), state, newState);
 
         sink.recordState(peer, newState);
         state = newState;
@@ -545,9 +562,9 @@
         return state;
     }
 
-    public NettyStreamingMessageSender getMessageSender()
+    public StreamingMultiplexedChannel getChannel()
     {
-        return messageSender;
+        return channel;
     }
 
     /**
@@ -621,7 +638,7 @@
             prepare.summaries.add(task.getSummary());
         }
 
-        messageSender.sendMessage(prepare);
+        channel.sendControlMessage(prepare).syncUninterruptibly();
     }
 
     /**
@@ -629,11 +646,12 @@
      * after completion or because the peer was down, otherwise sends a {@link SessionFailedMessage} and closes
      * the session as {@link State#FAILED}.
      */
-    public synchronized Future<?> onError(Throwable e)
+    public Future<?> onError(Throwable e)
     {
-        boolean isEofException = e instanceof EOFException;
+        boolean isEofException = e instanceof EOFException || e instanceof ClosedChannelException;
         if (isEofException)
         {
+            State state = this.state;
             if (state.finalState)
             {
                 logger.debug("[Stream #{}] Socket closed after session completed with state {}", planId(), state);
@@ -653,10 +671,10 @@
 
         logError(e);
 
-        if (messageSender.connected())
+        if (channel.connected())
         {
-            state(State.FAILED); // make sure subsequent error handling sees the session in a final state
-            messageSender.sendMessage(new SessionFailedMessage());
+            state(State.FAILED); // make sure subsequent error handling sees the session in a final state 
+            channel.sendControlMessage(new SessionFailedMessage()).awaitUninterruptibly();
         }
 
         return closeSession(State.FAILED);
@@ -666,18 +684,18 @@
     {
         if (e instanceof SocketTimeoutException)
         {
-            logger.error("[Stream #{}] Did not receive response from peer {}{} for {} secs. Is peer down? " +
-                         "If not, maybe try increasing streaming_keep_alive_period_in_secs.", planId(),
-                         peer.getHostAddressAndPort(),
-                         template.connectTo == null ? "" : " through " + template.connectTo.getHostAddressAndPort(),
-                         2 * DatabaseDescriptor.getStreamingKeepAlivePeriod(),
+            logger.error("[Stream #{}] Timeout from peer {}{}. Is peer down? " +
+                         "If not, and earlier failure detection is required enable (or lower) streaming_keep_alive_period.",
+                         planId(),
+                         hostAddressAndPort(channel.peer()),
+                         channel.peer().equals(channel.connectedTo()) ? "" : " through " + hostAddressAndPort(channel.connectedTo()),
                          e);
         }
         else
         {
             logger.error("[Stream #{}] Streaming error occurred on session with peer {}{}", planId(),
-                         peer.getHostAddressAndPort(),
-                         template.connectTo == null ? "" : " through " + template.connectTo.getHostAddressAndPort(),
+                         hostAddressAndPort(channel.peer()),
+                         channel.peer().equals(channel.connectedTo()) ? "" : " through " + hostAddressAndPort(channel.connectedTo()),
                          e);
         }
     }
@@ -701,6 +719,11 @@
         });
     }
 
+    public void countStreamedIn(boolean isEntireSSTable)
+    {
+        metrics.countStreamedIn(isEntireSSTable);
+    }
+
     /**
      * Finish preparing the session. This method is blocking (memtables are flushed in {@link #addTransferRanges}),
      * so the logic should not execute on the main IO thread (read: netty event loop).
@@ -716,9 +739,16 @@
         if (!peer.equals(FBUtilities.getBroadcastAddressAndPort()))
             for (StreamTransferTask task : transfers.values())
                 prepareSynAck.summaries.add(task.getSummary());
-        messageSender.sendMessage(prepareSynAck);
 
-        streamResult.handleSessionPrepared(this);
+        streamResult.handleSessionPrepared(this, PrepareDirection.SEND);
+        // After sending the message the initiator can close the channel which will cause a ClosedChannelException
+        // in buffer logic, this then gets sent to onError which validates the state isFinalState, if not fails
+        // the session.  To avoid a race condition between sending and setting state, make sure to update the state
+        // before sending the message (without closing the channel)
+        // see CASSANDRA-17116
+        if (isPreview())
+            state(State.COMPLETE);
+        channel.sendControlMessage(prepareSynAck).syncUninterruptibly();
 
         if (isPreview())
             completePreview();
@@ -735,20 +765,20 @@
 
             // only send the (final) ACK if we are expecting the peer to send this node (the initiator) some files
             if (!isPreview())
-                messageSender.sendMessage(new PrepareAckMessage());
+                channel.sendControlMessage(new PrepareAckMessage()).syncUninterruptibly();
         }
 
         if (isPreview())
             completePreview();
         else
-            startStreamingFiles(true);
+            startStreamingFiles(PrepareDirection.ACK);
     }
 
     private void prepareAck(PrepareAckMessage msg)
     {
         if (isPreview())
             throw new RuntimeException(String.format("[Stream #%s] Cannot receive PrepareAckMessage for preview session", planId()));
-        startStreamingFiles(true);
+        startStreamingFiles(PrepareDirection.ACK);
     }
 
     /**
@@ -792,16 +822,16 @@
         StreamingMetrics.totalIncomingBytes.inc(headerSize);
         metrics.incomingBytes.inc(headerSize);
         // send back file received message
-        messageSender.sendMessage(new ReceivedMessage(message.header.tableId, message.header.sequenceNumber));
+        channel.sendControlMessage(new ReceivedMessage(message.header.tableId, message.header.sequenceNumber)).syncUninterruptibly();
         StreamHook.instance.reportIncomingStream(message.header.tableId, message.stream, this, message.header.sequenceNumber);
-        long receivedStartNanos = System.nanoTime();
+        long receivedStartNanos = nanoTime();
         try
         {
             receivers.get(message.header.tableId).received(message.stream);
         }
         finally
         {
-            long latencyNanos = System.nanoTime() - receivedStartNanos;
+            long latencyNanos = nanoTime() - receivedStartNanos;
             metrics.incomingProcessTime.update(latencyNanos, TimeUnit.NANOSECONDS);
             long latencyMs = TimeUnit.NANOSECONDS.toMillis(latencyNanos);
             int timeout = DatabaseDescriptor.getInternodeStreamingTcpUserTimeoutInMS();
@@ -811,15 +841,19 @@
                                  "The time taken ({} ms) for processing the incoming stream message ({})" +
                                  " exceeded internode streaming TCP user timeout ({} ms).\n" +
                                  "The streaming connection might be closed due to tcp user timeout.\n" +
-                                 "Try to increase the internode_streaming_tcp_user_timeout_in_ms" +
+                                 "Try to increase the internode_streaming_tcp_user_timeout" +
                                  " or set it to 0 to use system defaults.",
                                  latencyMs, message, timeout);
         }
     }
 
-    public void progress(String filename, ProgressInfo.Direction direction, long bytes, long total)
+    public void progress(String filename, ProgressInfo.Direction direction, long bytes, long delta, long total)
     {
-        ProgressInfo progress = new ProgressInfo(peer, index, filename, direction, bytes, total);
+        if (delta < 0)
+            NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES,
+                             "[id={}, key={{}, {}, {})] Stream event reported a negative delta ({})",
+                             planId(), peer, filename, direction, delta);
+        ProgressInfo progress = new ProgressInfo(peer, index, filename, direction, bytes, delta, total);
         streamResult.handleProgress(progress);
     }
 
@@ -835,14 +869,11 @@
     {
         logger.debug("[Stream #{}] handling Complete message, state = {}", planId(), state);
 
-        if (!isFollower)
+        if (!isFollower) // initiator
         {
-            if (state == State.WAIT_COMPLETE)
-                closeSession(State.COMPLETE);
-            else
-                state(State.WAIT_COMPLETE);
+            initiatorCompleteOrWait();
         }
-        else
+        else // follower
         {
             // pre-4.0 nodes should not be connected via streaming, see {@link MessagingService#accept_streaming}
             throw new IllegalStateException(String.format("[Stream #%s] Complete message can be only received by the initiator!", planId()));
@@ -862,22 +893,35 @@
             return true;
 
         maybeCompleted = true;
-        if (!isFollower)
+        if (!isFollower) // initiator
         {
-            if (state == State.WAIT_COMPLETE)
-                closeSession(State.COMPLETE);
-            else
-                state(State.WAIT_COMPLETE);
+            initiatorCompleteOrWait();
         }
-        else
+        else // follower
         {
-            messageSender.sendMessage(new CompleteMessage());
+            // After sending the message the initiator can close the channel which will cause a ClosedChannelException
+            // in buffer logic, this then gets sent to onError which validates the state isFinalState, if not fails
+            // the session.  To avoid a race condition between sending and setting state, make sure to update the state
+            // before sending the message (without closing the channel)
+            // see CASSANDRA-17116
+            state(State.COMPLETE);
+            channel.sendControlMessage(new CompleteMessage()).syncUninterruptibly();
             closeSession(State.COMPLETE);
         }
 
         return true;
     }
 
+    private void initiatorCompleteOrWait()
+    {
+        // This is called when coordination completes AND when COMPLETE message is seen; it is possible that the
+        // COMPLETE method is seen first!
+        if (state == State.WAIT_COMPLETE)
+            closeSession(State.COMPLETE);
+        else
+            state(State.WAIT_COMPLETE);
+    }
+
     /**
      * Call back on receiving {@code StreamMessage.Type.SESSION_FAILED} message.
      */
@@ -888,6 +932,15 @@
     }
 
     /**
+     * Call back on receiving {@code StreamMessage.Type.SESSION_FAILED} message.
+     */
+    public synchronized void sessionTimeout()
+    {
+        logger.error("[Stream #{}] timeout with {}.", planId(), peer.toString());
+        closeSession(State.FAILED);
+    }
+
+    /**
      * @return Current snapshot of this session info.
      */
     public SessionInfo getSessionInfo()
@@ -898,8 +951,7 @@
         List<StreamSummary> transferSummaries = Lists.newArrayList();
         for (StreamTask transfer : transfers.values())
             transferSummaries.add(transfer.getSummary());
-        // TODO: the connectTo treatment here is peculiar, and needs thinking about - since the connection factory can change it
-        return new SessionInfo(peer, index, template.connectTo == null ? peer : template.connectTo, receivingSummaries, transferSummaries, state);
+        return new SessionInfo(channel.peer(), index, channel.connectedTo(), receivingSummaries, transferSummaries, state);
     }
 
     public synchronized void taskCompleted(StreamReceiveTask completedTask)
@@ -950,7 +1002,7 @@
     {
         List<Future<?>> flushes = new ArrayList<>();
         for (ColumnFamilyStore cfs : stores)
-            flushes.add(cfs.forceFlush());
+            flushes.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.STREAMING));
         FBUtilities.waitOnFutures(flushes);
     }
 
@@ -962,10 +1014,10 @@
             receivers.put(summary.tableId, new StreamReceiveTask(this, summary.tableId, summary.files, summary.totalSize));
     }
 
-    private void startStreamingFiles(boolean notifyPrepared)
+    private void startStreamingFiles(@Nullable PrepareDirection prepareDirection)
     {
-        if (notifyPrepared)
-            streamResult.handleSessionPrepared(this);
+        if (prepareDirection != null)
+            streamResult.handleSessionPrepared(this, prepareDirection);
 
         state(State.STREAMING);
 
@@ -978,7 +1030,8 @@
                 {
                     // pass the session planId/index to the OFM (which is only set at init(), after the transfers have already been created)
                     ofm.header.addSessionInfo(this);
-                    messageSender.sendMessage(ofm);
+                    // do not sync here as this does disk access
+                    channel.sendControlMessage(ofm);
                 }
             }
             else
@@ -1040,6 +1093,36 @@
         public void onClose(InetAddressAndPort from);
     }
 
+    public static String createLogTag(StreamSession session)
+    {
+        return createLogTag(session, (Object) null);
+    }
+
+    public static String createLogTag(StreamSession session, StreamingChannel channel)
+    {
+        return createLogTag(session, channel == null ? null : channel.id());
+    }
+
+    public static String createLogTag(StreamSession session, Channel channel)
+    {
+        return createLogTag(session, channel == null ? null : channel.id());
+    }
+
+    public static String createLogTag(StreamSession session, Object channelId)
+    {
+        StringBuilder sb = new StringBuilder(64);
+        sb.append("[Stream");
+
+        if (session != null)
+            sb.append(" #").append(session.planId());
+
+        if (channelId != null)
+            sb.append(" channel: ").append(channelId);
+
+        sb.append(']');
+        return sb.toString();
+    }
+
     public synchronized void abort()
     {
         if (state.isFinalState())
@@ -1050,8 +1133,8 @@
 
         logger.info("[Stream #{}] Aborting stream session with peer {}...", planId(), peer);
 
-        if (getMessageSender().connected())
-            getMessageSender().sendMessage(new SessionFailedMessage());
+        if (channel.connected())
+            channel.sendControlMessage(new SessionFailedMessage());
 
         try
         {
diff --git a/src/java/org/apache/cassandra/streaming/StreamState.java b/src/java/org/apache/cassandra/streaming/StreamState.java
index 1b7c042..88eb76d 100644
--- a/src/java/org/apache/cassandra/streaming/StreamState.java
+++ b/src/java/org/apache/cassandra/streaming/StreamState.java
@@ -20,21 +20,22 @@
 import java.io.Serializable;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 
+import org.apache.cassandra.utils.TimeUUID;
+
 /**
  * Current snapshot of streaming progress.
  */
 public class StreamState implements Serializable
 {
-    public final UUID planId;
+    public final TimeUUID planId;
     public final StreamOperation streamOperation;
     public final Set<SessionInfo> sessions;
 
-    public StreamState(UUID planId, StreamOperation streamOperation, Set<SessionInfo> sessions)
+    public StreamState(TimeUUID planId, StreamOperation streamOperation, Set<SessionInfo> sessions)
     {
         this.planId = planId;
         this.sessions = sessions;
diff --git a/src/java/org/apache/cassandra/streaming/StreamTransferTask.java b/src/java/org/apache/cassandra/streaming/StreamTransferTask.java
index 1fbd540..45fbcc6 100644
--- a/src/java/org/apache/cassandra/streaming/StreamTransferTask.java
+++ b/src/java/org/apache/cassandra/streaming/StreamTransferTask.java
@@ -22,7 +22,6 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.ScheduledThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -33,12 +32,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.messages.OutgoingStreamMessage;
+import org.apache.cassandra.utils.ExecutorUtils;
 
-import static org.apache.cassandra.utils.ExecutorUtils.awaitTermination;
-import static org.apache.cassandra.utils.ExecutorUtils.shutdown;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 
 /**
  * StreamTransferTask sends streams for a given table
@@ -46,7 +45,7 @@
 public class StreamTransferTask extends StreamTask
 {
     private static final Logger logger = LoggerFactory.getLogger(StreamTransferTask.class);
-    private static final ScheduledThreadPoolExecutor timeoutExecutor = createTimeoutExecutor();
+    private static final ScheduledExecutorPlus timeoutExecutor = executorFactory().scheduled(false, "StreamingTransferTaskTimeouts");
 
     private final AtomicInteger sequenceNumber = new AtomicInteger(0);
     private boolean aborted = false;
@@ -91,7 +90,7 @@
             if (stream != null)
                 stream.complete();
 
-            logger.debug("recevied sequenceNumber {}, remaining files {}", sequenceNumber, streams.keySet());
+            logger.debug("received sequenceNumber {}, remaining files {}", sequenceNumber, streams.keySet());
             signalComplete = streams.isEmpty();
         }
 
@@ -100,6 +99,26 @@
             session.taskCompleted(this);
     }
 
+    /**
+     * Received ACK for stream at {@code sequenceNumber}.
+     *
+     * @param sequenceNumber sequence number of stream
+     */
+    public void timeout(int sequenceNumber)
+    {
+        synchronized (this)
+        {
+            timeoutTasks.remove(sequenceNumber);
+            OutgoingStreamMessage stream = streams.remove(sequenceNumber);
+            if (stream == null) return;
+            stream.complete();
+
+            logger.debug("timeout sequenceNumber {}, remaining files {}", sequenceNumber, streams.keySet());
+        }
+
+        session.sessionTimeout();
+    }
+
     public synchronized void abort()
     {
         if (aborted)
@@ -169,35 +188,15 @@
         if (!streams.containsKey(sequenceNumber))
             return null;
 
-        ScheduledFuture<?> future = timeoutExecutor.schedule(new Runnable()
-        {
-            public void run()
-            {
-                synchronized (StreamTransferTask.this)
-                {
-                    // remove so we don't cancel ourselves
-                    timeoutTasks.remove(sequenceNumber);
-                    StreamTransferTask.this.complete(sequenceNumber);
-                }
-            }
-        }, time, unit);
-
+        ScheduledFuture<?> future = timeoutExecutor.scheduleTimeoutWithDelay(() -> StreamTransferTask.this.timeout(sequenceNumber), time, unit);
         ScheduledFuture<?> prev = timeoutTasks.put(sequenceNumber, future);
         assert prev == null;
         return future;
     }
 
-    private static ScheduledThreadPoolExecutor createTimeoutExecutor()
-    {
-        ScheduledThreadPoolExecutor executor = new ScheduledThreadPoolExecutor(1, new NamedThreadFactory("StreamingTransferTaskTimeouts"));
-        executor.setExecuteExistingDelayedTasksAfterShutdownPolicy(false);
-        return executor;
-    }
-
     @VisibleForTesting
     public static void shutdownAndWait(long timeout, TimeUnit units) throws InterruptedException, TimeoutException
     {
-        shutdown(timeoutExecutor);
-        awaitTermination(timeout, units, timeoutExecutor);
+        ExecutorUtils.shutdownAndWait(timeout, units, timeoutExecutor);
     }
 }
diff --git a/src/java/org/apache/cassandra/streaming/StreamingChannel.java b/src/java/org/apache/cassandra/streaming/StreamingChannel.java
new file mode 100644
index 0000000..6b623b8
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/StreamingChannel.java
@@ -0,0 +1,101 @@
+/*
+ * 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.streaming;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.util.function.IntFunction;
+
+import io.netty.util.concurrent.Future; //checkstyle: permit this import
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface StreamingChannel
+{
+    public interface Factory
+    {
+        public static class Global
+        {
+            private static StreamingChannel.Factory FACTORY = new NettyStreamingConnectionFactory();
+            public static StreamingChannel.Factory streamingFactory()
+            {
+                return FACTORY;
+            }
+
+            public static void unsafeSet(StreamingChannel.Factory factory)
+            {
+                FACTORY = factory;
+            }
+        }
+
+        StreamingChannel create(InetSocketAddress to, int messagingVersion, Kind kind) throws IOException;
+
+        default StreamingChannel create(InetSocketAddress to,
+                                        InetSocketAddress preferred,
+                                        int messagingVersion,
+                                        StreamingChannel.Kind kind) throws IOException
+        {
+            // Implementations can decide whether or not to do something with the preferred address.
+            return create(to, messagingVersion, kind);
+        }
+
+        /** Provide way to disable getPreferredIP() for tools without access to the system keyspace
+         *
+         * CASSANDRA-17663 moves calls to SystemKeyspace.getPreferredIP() outside of any threads
+         * that are regularly interrupted.  However the streaming subsystem is also used
+         * by the bulk loader tool, which does not have direct access to the local tables
+         * and uses the client metadata/queries to retrieve it.
+         *
+         * @return true if SystemKeyspace.getPreferredIP() should be used when connecting
+         */
+        default boolean supportsPreferredIp()
+        {
+            return true;
+        }
+    }
+
+    public enum Kind { CONTROL, FILE }
+
+    public interface Send
+    {
+        void send(IntFunction<StreamingDataOutputPlus> outSupplier) throws IOException;
+    }
+
+    Object id();
+    String description();
+
+    InetSocketAddress peer();
+    InetSocketAddress connectedTo();
+    boolean connected();
+
+    StreamingDataInputPlus in();
+
+    /**
+     * until closed, cannot invoke {@link #send(Send)}
+     */
+    StreamingDataOutputPlus acquireOut();
+    Future<?> send(Send send) throws IOException;
+
+    Future<?> close();
+    void onClose(Runnable runOnClose);
+}
diff --git a/src/java/org/apache/cassandra/streaming/StreamingDataInputPlus.java b/src/java/org/apache/cassandra/streaming/StreamingDataInputPlus.java
new file mode 100644
index 0000000..0cfcc0d
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/StreamingDataInputPlus.java
@@ -0,0 +1,33 @@
+/*
+ * 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.streaming;
+
+import java.io.Closeable;
+
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface StreamingDataInputPlus extends DataInputPlus, Closeable
+{
+    @Override
+    void close();
+}
diff --git a/src/java/org/apache/cassandra/streaming/StreamingDataOutputPlus.java b/src/java/org/apache/cassandra/streaming/StreamingDataOutputPlus.java
new file mode 100644
index 0000000..d845497
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/StreamingDataOutputPlus.java
@@ -0,0 +1,87 @@
+/*
+ * 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.streaming;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+import io.netty.channel.FileRegion;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface StreamingDataOutputPlus extends DataOutputPlus, Closeable
+{
+    interface BufferSupplier
+    {
+        /**
+         * Request a buffer with at least the given capacity.
+         * This method may only be invoked once, and the lifetime of buffer it returns will be managed
+         * by the AsyncChannelOutputPlus it was created for.
+         */
+        ByteBuffer get(int capacity) throws IOException;
+    }
+
+    interface Write
+    {
+        /**
+         * Write to a buffer, and flush its contents to the channel.
+         * <p>
+         * The lifetime of the buffer will be managed by the AsyncChannelOutputPlus you issue this Write to.
+         * If the method exits successfully, the contents of the buffer will be written to the channel, otherwise
+         * the buffer will be cleaned and the exception propagated to the caller.
+         */
+        void write(BufferSupplier supplier) throws IOException;
+    }
+
+    interface RateLimiter
+    {
+        void acquire(int bytes);
+
+        boolean isRateLimited();
+    }
+
+    /**
+     * Provide a lambda that can request a buffer of suitable size, then fill the buffer and have
+     * that buffer written and flushed to the underlying channel, without having to handle buffer
+     * allocation, lifetime or cleanup, including in case of exceptions.
+     * <p>
+     * Any exception thrown by the Write will be propagated to the caller, after any buffer is cleaned up.
+     */
+    int writeToChannel(Write write, RateLimiter limiter) throws IOException;
+
+    /**
+     * Writes all data in file channel to stream: <br>
+     * * For zero-copy-streaming, 1MiB at a time, with at most 2MiB in flight at once. <br>
+     * * For streaming with SSL, 64KiB at a time, with at most 32+64KiB (default low water mark + batch size) in flight. <br>
+     * <p>
+     * This method takes ownership of the provided {@link FileChannel}.
+     * <p>
+     * WARNING: this method blocks only for permission to write to the netty channel; it exits before
+     * the {@link FileRegion}(zero-copy) or {@link ByteBuffer}(ssl) is flushed to the network.
+     */
+    long writeFileToChannel(FileChannel file, RateLimiter limiter) throws IOException;
+
+    default void flush() throws IOException {}
+}
diff --git a/src/java/org/apache/cassandra/streaming/StreamingDataOutputPlusFixed.java b/src/java/org/apache/cassandra/streaming/StreamingDataOutputPlusFixed.java
new file mode 100644
index 0000000..2159090
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/StreamingDataOutputPlusFixed.java
@@ -0,0 +1,50 @@
+/*
+ * 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.streaming;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+
+import org.apache.cassandra.io.util.DataOutputBufferFixed;
+
+public class StreamingDataOutputPlusFixed extends DataOutputBufferFixed implements StreamingDataOutputPlus
+{
+    public StreamingDataOutputPlusFixed(ByteBuffer buffer)
+    {
+        super(buffer);
+    }
+
+    @Override
+    public int writeToChannel(Write write, RateLimiter limiter) throws IOException
+    {
+        int position = buffer.position();
+        write.write(size -> buffer);
+        return buffer.position() - position;
+    }
+
+    @Override
+    public long writeFileToChannel(FileChannel file, RateLimiter limiter) throws IOException
+    {
+        long count = 0;
+        long tmp;
+        while (0 <= (tmp = file.read(buffer))) count += tmp;
+        return count;
+    }
+}
diff --git a/src/java/org/apache/cassandra/streaming/StreamingMessageSender.java b/src/java/org/apache/cassandra/streaming/StreamingMessageSender.java
deleted file mode 100644
index 96e7626..0000000
--- a/src/java/org/apache/cassandra/streaming/StreamingMessageSender.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.streaming;
-
-import java.io.IOException;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.streaming.messages.StreamMessage;
-
-public interface StreamingMessageSender
-{
-    void initialize() throws IOException;
-
-    void sendMessage(StreamMessage message) throws IOException;
-
-    boolean connected();
-
-    void close();
-}
diff --git a/src/java/org/apache/cassandra/streaming/StreamingState.java b/src/java/org/apache/cassandra/streaming/StreamingState.java
new file mode 100644
index 0000000..c2eed1e
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/StreamingState.java
@@ -0,0 +1,361 @@
+/*
+ * 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.streaming;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.net.InetSocketAddress;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.concurrent.GuardedBy;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Throwables;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.virtual.SimpleDataSet;
+import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.ObjectSizes;
+import org.apache.cassandra.utils.TimeUUID;
+import org.checkerframework.checker.nullness.qual.Nullable;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+public class StreamingState implements StreamEventHandler
+{
+    private static final Logger logger = LoggerFactory.getLogger(StreamingState.class);
+
+    public static final long ELEMENT_SIZE = ObjectSizes.measureDeep(new StreamingState(nextTimeUUID(), StreamOperation.OTHER, false));
+
+    public enum Status
+    {INIT, START, SUCCESS, FAILURE}
+
+    private final long createdAtMillis = Clock.Global.currentTimeMillis();
+
+    private final TimeUUID id;
+    private final boolean follower;
+    private final StreamOperation operation;
+    private final Set<InetSocketAddress> peers = Collections.newSetFromMap(new ConcurrentHashMap<>());
+    @GuardedBy("this")
+    private final Sessions sessions = new Sessions();
+
+    private Status status;
+    private String completeMessage = null;
+
+    private final long[] stateTimesNanos;
+    private volatile long lastUpdatedAtNanos;
+
+    // API for state changes
+    public final Phase phase = new Phase();
+
+    public StreamingState(StreamResultFuture result)
+    {
+        this(result.planId, result.streamOperation, result.getCoordinator().isFollower());
+    }
+
+    private StreamingState(TimeUUID planId, StreamOperation streamOperation, boolean follower)
+    {
+        this.id = planId;
+        this.operation = streamOperation;
+        this.follower = follower;
+        this.stateTimesNanos = new long[Status.values().length];
+        updateState(Status.INIT);
+    }
+
+    public TimeUUID id()
+    {
+        return id;
+    }
+
+    public boolean follower()
+    {
+        return follower;
+    }
+
+    public StreamOperation operation()
+    {
+        return operation;
+    }
+
+    public Set<InetSocketAddress> peers()
+    {
+        return this.peers;
+    }
+
+    public Status status()
+    {
+        return status;
+    }
+
+    public Sessions sessions()
+    {
+        return sessions;
+    }
+
+    public boolean isComplete()
+    {
+        switch (status)
+        {
+            case SUCCESS:
+            case FAILURE:
+                return true;
+            default:
+                return false;
+        }
+    }
+
+    @VisibleForTesting
+    public StreamResultFuture future()
+    {
+        if (follower)
+            return StreamManager.instance.getReceivingStream(id);
+        else
+            return StreamManager.instance.getInitiatorStream(id);
+    }
+
+    public float progress()
+    {
+        switch (status)
+        {
+            case INIT:
+                return 0;
+            case START:
+                return Math.min(0.99f, sessions().progress().floatValue());
+            case SUCCESS:
+            case FAILURE:
+                return 1;
+            default:
+                throw new AssertionError("unknown state: " + status);
+        }
+    }
+
+    public EnumMap<Status, Long> stateTimesMillis()
+    {
+        EnumMap<Status, Long> map = new EnumMap<>(Status.class);
+        for (int i = 0; i < stateTimesNanos.length; i++)
+        {
+            long nanos = stateTimesNanos[i];
+            if (nanos != 0)
+                map.put(Status.values()[i], nanosToMillis(nanos));
+        }
+        return map;
+    }
+
+    public long durationMillis()
+    {
+        long endNanos = lastUpdatedAtNanos;
+        if (!isComplete())
+            endNanos = Clock.Global.nanoTime();
+        return TimeUnit.NANOSECONDS.toMillis(endNanos - stateTimesNanos[0]);
+    }
+
+    public long lastUpdatedAtMillis()
+    {
+        return nanosToMillis(lastUpdatedAtNanos);
+    }
+
+    public long lastUpdatedAtNanos()
+    {
+        return lastUpdatedAtNanos;
+    }
+
+    public String failureCause()
+    {
+        if (status == Status.FAILURE)
+            return completeMessage;
+        return null;
+    }
+
+    public String successMessage()
+    {
+        if (status == Status.SUCCESS)
+            return completeMessage;
+        return null;
+    }
+
+    @Override
+    public String toString()
+    {
+        TableBuilder table = new TableBuilder();
+        table.add("id", id.toString());
+        table.add("status", status().name().toLowerCase());
+        table.add("progress", (progress() * 100) + "%");
+        table.add("duration_ms", Long.toString(durationMillis()));
+        table.add("last_updated_ms", Long.toString(lastUpdatedAtMillis()));
+        table.add("failure_cause", failureCause());
+        table.add("success_message", successMessage());
+        for (Map.Entry<Status, Long> e : stateTimesMillis().entrySet())
+            table.add("status_" + e.getKey().name().toLowerCase() + "_ms", e.toString());
+        return table.toString();
+    }
+
+    @Override
+    public synchronized void handleStreamEvent(StreamEvent event)
+    {
+        try
+        {
+            switch (event.eventType)
+            {
+                case STREAM_PREPARED:
+                    streamPrepared((StreamEvent.SessionPreparedEvent) event);
+                    break;
+                case STREAM_COMPLETE:
+                    // currently not taking track of state, so ignore
+                    break;
+                case FILE_PROGRESS:
+                    streamProgress((StreamEvent.ProgressEvent) event);
+                    break;
+                default:
+                    logger.warn("Unknown stream event type: {}", event.eventType);
+            }
+        }
+        catch (Throwable t)
+        {
+            logger.warn("Unexpected exception handling stream event", t);
+        }
+        lastUpdatedAtNanos = Clock.Global.nanoTime();
+    }
+
+    private void streamPrepared(StreamEvent.SessionPreparedEvent event)
+    {
+        SessionInfo session = event.session;
+        peers.add(session.peer);
+        // only update stats on ACK to avoid duplication
+        if (event.prepareDirection != StreamSession.PrepareDirection.ACK)
+            return;
+        sessions.bytesToReceive += session.getTotalSizeToReceive();
+        sessions.bytesToSend += session.getTotalSizeToSend();
+
+        sessions.filesToReceive += session.getTotalFilesToReceive();
+        sessions.filesToSend += session.getTotalFilesToSend();
+    }
+
+    private void streamProgress(StreamEvent.ProgressEvent event)
+    {
+        ProgressInfo info = event.progress;
+
+        if (info.direction == ProgressInfo.Direction.IN)
+        {
+            // receiving
+            sessions.bytesReceived += info.deltaBytes;
+            if (info.isCompleted())
+                sessions.filesReceived++;
+        }
+        else
+        {
+            // sending
+            sessions.bytesSent += info.deltaBytes;
+            if (info.isCompleted())
+                sessions.filesSent++;
+        }
+    }
+
+    @Override
+    public synchronized void onSuccess(@Nullable StreamState state)
+    {
+        updateState(Status.SUCCESS);
+    }
+
+    @Override
+    public synchronized void onFailure(Throwable throwable)
+    {
+        completeMessage = Throwables.getStackTraceAsString(throwable);
+        updateState(Status.FAILURE);
+    }
+
+    private synchronized void updateState(Status state)
+    {
+        this.status = state;
+        long now = Clock.Global.nanoTime();
+        stateTimesNanos[state.ordinal()] = now;
+        lastUpdatedAtNanos = now;
+    }
+
+    private long nanosToMillis(long nanos)
+    {
+        // nanos - creationTimeNanos = delta since init
+        return createdAtMillis + TimeUnit.NANOSECONDS.toMillis(nanos - stateTimesNanos[0]);
+    }
+
+    public class Phase
+    {
+        public void start()
+        {
+            updateState(Status.START);
+        }
+    }
+
+    public static class Sessions
+    {
+        public long bytesToReceive, bytesReceived;
+        public long bytesToSend, bytesSent;
+        public long filesToReceive, filesReceived;
+        public long filesToSend, filesSent;
+
+        public static String columns()
+        {
+            return "  bytes_to_receive bigint, \n" +
+                   "  bytes_received bigint, \n" +
+                   "  bytes_to_send bigint, \n" +
+                   "  bytes_sent bigint, \n" +
+                   "  files_to_receive bigint, \n" +
+                   "  files_received bigint, \n" +
+                   "  files_to_send bigint, \n" +
+                   "  files_sent bigint, \n";
+        }
+
+        public boolean isEmpty()
+        {
+            return bytesToReceive == 0 && bytesToSend == 0 && filesToReceive == 0 && filesToSend == 0;
+        }
+
+        public BigDecimal progress()
+        {
+            return div(bytesSent + bytesReceived, bytesToSend + bytesToReceive);
+        }
+
+        private static BigDecimal div(long a, long b)
+        {
+            // not "correct" but its what you would do if this happened...
+            if (b == 0)
+                return BigDecimal.ZERO;
+            return BigDecimal.valueOf(a).divide(BigDecimal.valueOf(b), 4, RoundingMode.HALF_UP);
+        }
+
+        public void update(SimpleDataSet ds)
+        {
+            if (isEmpty())
+                return;
+            ds.column("bytes_to_receive", bytesToReceive)
+              .column("bytes_received", bytesReceived)
+              .column("bytes_to_send", bytesToSend)
+              .column("bytes_sent", bytesSent)
+              .column("files_to_receive", filesToReceive)
+              .column("files_received", filesReceived)
+              .column("files_to_send", filesToSend)
+              .column("files_sent", filesSent);
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/streaming/TableStreamManager.java b/src/java/org/apache/cassandra/streaming/TableStreamManager.java
index d97fabc..208dc34 100644
--- a/src/java/org/apache/cassandra/streaming/TableStreamManager.java
+++ b/src/java/org/apache/cassandra/streaming/TableStreamManager.java
@@ -19,10 +19,10 @@
 package org.apache.cassandra.streaming;
 
 import java.util.Collection;
-import java.util.UUID;
 
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.streaming.messages.StreamMessageHeader;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * The main streaming hook for a storage implementation.
@@ -51,6 +51,6 @@
      */
     Collection<OutgoingStream> createOutgoingStreams(StreamSession session,
                                                      RangesAtEndpoint replicas,
-                                                     UUID pendingRepair,
+                                                     TimeUUID pendingRepair,
                                                      PreviewKind previewKind);
 }
diff --git a/src/java/org/apache/cassandra/streaming/async/NettyStreamingChannel.java b/src/java/org/apache/cassandra/streaming/async/NettyStreamingChannel.java
new file mode 100644
index 0000000..70b1c37
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/async/NettyStreamingChannel.java
@@ -0,0 +1,260 @@
+/*
+ * 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.streaming.async;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.IntFunction;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.channel.ChannelInboundHandlerAdapter;
+import io.netty.util.AttributeKey;
+import io.netty.util.ReferenceCountUtil;
+import org.apache.cassandra.net.AsyncChannelPromise;
+import org.apache.cassandra.net.AsyncStreamingInputPlus;
+import org.apache.cassandra.net.AsyncStreamingOutputPlus;
+import org.apache.cassandra.net.GlobalBufferPoolAllocator;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.StreamingDataInputPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlusFixed;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+
+import static io.netty.util.AttributeKey.valueOf;
+import static java.lang.Boolean.FALSE;
+
+public class NettyStreamingChannel extends ChannelInboundHandlerAdapter implements StreamingChannel
+{
+    private static final Logger logger = LoggerFactory.getLogger(NettyStreamingChannel.class);
+    private static volatile boolean trackInboundHandlers = false;
+    private static Collection<NettyStreamingChannel> inboundHandlers;
+
+    @VisibleForTesting
+    static final AttributeKey<Boolean> TRANSFERRING_FILE_ATTR = valueOf("transferringFile");
+    final int messagingVersion;
+    final Channel channel;
+
+    /**
+     * A collection of {@link ByteBuf}s that are yet to be processed. Incoming buffers are first dropped into this
+     * structure, and then consumed.
+     * <p>
+     * For thread safety, this structure's resources are released on the consuming thread
+     * (via {@link AsyncStreamingInputPlus#close()},
+     * but the producing side calls {@link AsyncStreamingInputPlus#requestClosure()} to notify the input that it should close.
+     */
+    @VisibleForTesting
+    final AsyncStreamingInputPlus in;
+
+    private volatile boolean closed;
+
+    public NettyStreamingChannel(int messagingVersion, Channel channel, Kind kind)
+    {
+        this.messagingVersion = messagingVersion;
+        this.channel = channel;
+        channel.attr(TRANSFERRING_FILE_ATTR).set(FALSE);
+        if (kind == Kind.CONTROL)
+        {
+            if (trackInboundHandlers)
+                inboundHandlers.add(this);
+            in = new AsyncStreamingInputPlus(channel);
+        }
+        else in = null;
+    }
+
+    @Override
+    public Object id()
+    {
+        return channel.id();
+    }
+
+    @Override
+    public String description()
+    {
+        return "channel.remote " + channel.remoteAddress() +
+               " channel.local " + channel.localAddress() +
+               " channel.id " + channel.id();
+    }
+
+    @Override
+    public InetSocketAddress peer()
+    {
+        return (InetSocketAddress) channel.remoteAddress();
+    }
+
+    @Override
+    public InetSocketAddress connectedTo()
+    {
+        return peer();
+    }
+
+    @Override
+    public boolean connected()
+    {
+        return channel.isOpen();
+    }
+
+    public StreamingDataInputPlus in()
+    {
+        return in;
+    }
+
+    public StreamingDataOutputPlus acquireOut()
+    {
+        if (!channel.attr(TRANSFERRING_FILE_ATTR).compareAndSet(false, true))
+            throw new IllegalStateException("channel's transferring state is currently set to true. refusing to start new stream");
+
+        return new AsyncStreamingOutputPlus(channel)
+        {
+            @Override
+            public void close() throws IOException
+            {
+                try
+                {
+                    super.close();
+                }
+                finally
+                {
+                    NettyStreamingChannel.this.channel.attr(TRANSFERRING_FILE_ATTR).set(FALSE);
+                }
+            }
+        };
+    }
+
+    public Future<?> send(Send send)
+    {
+        class Factory implements IntFunction<StreamingDataOutputPlus>
+        {
+            ByteBuf buf;
+            ByteBuffer buffer;
+
+            @Override
+            public StreamingDataOutputPlus apply(int size)
+            {
+                buf = GlobalBufferPoolAllocator.instance.buffer(size);
+                buffer = buf.nioBuffer(buf.writerIndex(), size);
+                return new StreamingDataOutputPlusFixed(buffer);
+            }
+        }
+
+        Factory factory = new Factory();
+        try
+        {
+            send.send(factory);
+            ByteBuf buf = factory.buf;
+            ByteBuffer buffer = factory.buffer;
+            try
+            {
+                assert buffer.position() == buffer.limit();
+                buf.writerIndex(buffer.position());
+                AsyncChannelPromise promise = new AsyncChannelPromise(channel);
+                channel.writeAndFlush(buf, promise);
+                return promise;
+            }
+            catch (Throwable t)
+            {
+                buf.release();
+                throw t;
+            }
+        }
+        catch (Throwable t)
+        {
+            return ImmediateFuture.failure(t);
+        }
+    }
+
+    @Override
+    public synchronized io.netty.util.concurrent.Future<?> close()
+    {
+        if (closed)
+            return channel.closeFuture();
+
+        closed = true;
+        if (in != null)
+        {
+            in.requestClosure();
+            if (trackInboundHandlers)
+                inboundHandlers.remove(this);
+        }
+
+        return channel.close();
+    }
+
+    @Override
+    public void onClose(Runnable runOnClose)
+    {
+        channel.closeFuture().addListener(ignore -> runOnClose.run());
+    }
+
+    @Override
+    public void channelRead(ChannelHandlerContext ctx, Object message)
+    {
+        if (closed || !(message instanceof ByteBuf) || !in.append((ByteBuf) message))
+            ReferenceCountUtil.release(message);
+    }
+
+    @Override
+    public void channelInactive(ChannelHandlerContext ctx)
+    {
+        close();
+        ctx.fireChannelInactive();
+    }
+
+    @Override
+    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
+    {
+        if (cause instanceof IOException)
+            logger.trace("connection problem while streaming", cause);
+        else
+            logger.warn("exception occurred while in processing streaming data", cause);
+        close();
+    }
+
+    /** Shutdown for in-JVM tests. For any other usage, tracking of active inbound streaming handlers
+     *  should be revisted first and in-JVM shutdown refactored with it.
+     *  This does not prevent new inbound handlers being added after shutdown, nor is not thread-safe
+     *  around new inbound handlers being opened during shutdown.
+     */
+    @VisibleForTesting
+    public static void shutdown()
+    {
+        assert trackInboundHandlers : "in-JVM tests required tracking of inbound streaming handlers";
+
+        inboundHandlers.forEach(NettyStreamingChannel::close);
+        inboundHandlers.clear();
+    }
+
+    public static void trackInboundHandlers()
+    {
+        inboundHandlers = Collections.newSetFromMap(new ConcurrentHashMap<>());
+        trackInboundHandlers = true;
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/streaming/async/NettyStreamingConnectionFactory.java b/src/java/org/apache/cassandra/streaming/async/NettyStreamingConnectionFactory.java
new file mode 100644
index 0000000..6a57e39
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/async/NettyStreamingConnectionFactory.java
@@ -0,0 +1,85 @@
+/*
+ * 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.streaming.async;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelPipeline;
+import io.netty.channel.EventLoop;
+import io.netty.util.concurrent.Future; // checkstyle: permit this import
+import org.apache.cassandra.net.ConnectionCategory;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.OutboundConnectionInitiator.Result;
+import org.apache.cassandra.net.OutboundConnectionInitiator.Result.StreamingSuccess;
+import org.apache.cassandra.net.OutboundConnectionSettings;
+import org.apache.cassandra.streaming.StreamingChannel;
+
+import static org.apache.cassandra.locator.InetAddressAndPort.getByAddress;
+import static org.apache.cassandra.net.OutboundConnectionInitiator.initiateStreaming;
+
+public class NettyStreamingConnectionFactory implements StreamingChannel.Factory
+{
+    @VisibleForTesting
+    public static int MAX_CONNECT_ATTEMPTS = 3;
+
+    public static NettyStreamingChannel connect(OutboundConnectionSettings template, int messagingVersion, StreamingChannel.Kind kind) throws IOException
+    {
+        EventLoop eventLoop = MessagingService.instance().socketFactory.outboundStreamingGroup().next();
+
+        int attempts = 0;
+        while (true)
+        {
+            Future<Result<StreamingSuccess>> result = initiateStreaming(eventLoop, template.withDefaults(ConnectionCategory.STREAMING), messagingVersion);
+            result.awaitUninterruptibly(); // initiate has its own timeout, so this is "guaranteed" to return relatively promptly
+            if (result.isSuccess())
+            {
+                Channel channel = result.getNow().success().channel;
+                NettyStreamingChannel streamingChannel = new NettyStreamingChannel(messagingVersion, channel, kind);
+                if (kind == StreamingChannel.Kind.CONTROL)
+                {
+                    ChannelPipeline pipeline = channel.pipeline();
+                    pipeline.addLast("stream", streamingChannel);
+                }
+                return streamingChannel;
+            }
+
+            if (++attempts == MAX_CONNECT_ATTEMPTS)
+                throw new IOException("failed to connect to " + template.to + " for streaming data", result.cause());
+        }
+    }
+
+    @Override
+    public StreamingChannel create(InetSocketAddress to, int messagingVersion, StreamingChannel.Kind kind) throws IOException
+    {
+        return connect(new OutboundConnectionSettings(getByAddress(to)), messagingVersion, kind);
+    }
+
+    @Override
+    public StreamingChannel create(InetSocketAddress to,
+                                   InetSocketAddress preferred,
+                                   int messagingVersion,
+                                   StreamingChannel.Kind kind) throws IOException
+    {
+        return connect(new OutboundConnectionSettings(getByAddress(to), getByAddress(preferred)), messagingVersion, kind);
+    }
+}
diff --git a/src/java/org/apache/cassandra/streaming/async/NettyStreamingMessageSender.java b/src/java/org/apache/cassandra/streaming/async/NettyStreamingMessageSender.java
deleted file mode 100644
index 9f8f476..0000000
--- a/src/java/org/apache/cassandra/streaming/async/NettyStreamingMessageSender.java
+++ /dev/null
@@ -1,568 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.streaming.async;
-
-import java.io.IOError;
-import java.io.IOException;
-import java.nio.ByteBuffer;
-import java.nio.channels.ClosedByInterruptException;
-import java.util.Collection;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.ScheduledFuture;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Throwables;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelPipeline;
-import io.netty.util.AttributeKey;
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.GenericFutureListener;
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.config.Config;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.io.util.DataOutputBufferFixed;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.net.AsyncChannelPromise;
-import org.apache.cassandra.net.OutboundConnectionSettings;
-import org.apache.cassandra.net.AsyncStreamingOutputPlus;
-import org.apache.cassandra.streaming.StreamConnectionFactory;
-import org.apache.cassandra.streaming.StreamSession;
-import org.apache.cassandra.streaming.StreamingMessageSender;
-import org.apache.cassandra.streaming.messages.IncomingStreamMessage;
-import org.apache.cassandra.streaming.messages.KeepAliveMessage;
-import org.apache.cassandra.streaming.messages.OutgoingStreamMessage;
-import org.apache.cassandra.streaming.messages.StreamInitMessage;
-import org.apache.cassandra.streaming.messages.StreamMessage;
-import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.JVMStabilityInspector;
-
-/**
- * Responsible for sending {@link StreamMessage}s to a given peer. We manage an array of netty {@link Channel}s
- * for sending {@link OutgoingStreamMessage} instances; all other {@link StreamMessage} types are sent via
- * a special control channel. The reason for this is to treat those messages carefully and not let them get stuck
- * behind a stream transfer.
- *
- * One of the challenges when sending streams is we might need to delay shipping the stream if:
- *
- * - we've exceeded our network I/O use due to rate limiting (at the cassandra level)
- * - the receiver isn't keeping up, which causes the local TCP socket buffer to not empty, which causes epoll writes to not
- * move any bytes to the socket, which causes buffers to stick around in user-land (a/k/a cassandra) memory.
- *
- * When those conditions occur, it's easy enough to reschedule processing the stream once the resources pick up
- * (we acquire the permits from the rate limiter, or the socket drains). However, we need to ensure that
- * no other messages are submitted to the same channel while the current stream is still being processed.
- */
-public class NettyStreamingMessageSender implements StreamingMessageSender
-{
-    private static final Logger logger = LoggerFactory.getLogger(NettyStreamingMessageSender.class);
-
-    private static final int DEFAULT_MAX_PARALLEL_TRANSFERS = FBUtilities.getAvailableProcessors();
-    private static final int MAX_PARALLEL_TRANSFERS = Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "streaming.session.parallelTransfers", Integer.toString(DEFAULT_MAX_PARALLEL_TRANSFERS)));
-
-    private static final long DEFAULT_CLOSE_WAIT_IN_MILLIS = TimeUnit.MINUTES.toMillis(5);
-
-    // a simple mechansim for allowing a degree of fairnes across multiple sessions
-    private static final Semaphore fileTransferSemaphore = new Semaphore(DEFAULT_MAX_PARALLEL_TRANSFERS, true);
-
-    private final StreamSession session;
-    private final boolean isPreview;
-    private final int streamingVersion;
-    private final OutboundConnectionSettings template;
-    private final StreamConnectionFactory factory;
-
-    private volatile boolean closed;
-
-    /**
-     * A special {@link Channel} for sending non-stream streaming messages, basically anything that isn't an
-     * {@link OutgoingStreamMessage} (or an {@link IncomingStreamMessage}, but a node doesn't send that, it's only received).
-     */
-    private volatile Channel controlMessageChannel;
-
-    // note: this really doesn't need to be a LBQ, just something that's thread safe
-    private final Collection<ScheduledFuture<?>> channelKeepAlives = new LinkedBlockingQueue<>();
-
-    private final ThreadPoolExecutor fileTransferExecutor;
-
-    /**
-     * A mapping of each {@link #fileTransferExecutor} thread to a channel that can be written to (on that thread).
-     */
-    private final ConcurrentMap<Thread, Channel> threadToChannelMap = new ConcurrentHashMap<>();
-
-    /**
-     * A netty channel attribute used to indicate if a channel is currently transferring a stream. This is primarily used
-     * to indicate to the {@link KeepAliveTask} if it is safe to send a {@link KeepAliveMessage}, as sending the
-     * (application level) keep-alive in the middle of a stream would be bad news.
-     */
-    @VisibleForTesting
-    static final AttributeKey<Boolean> TRANSFERRING_FILE_ATTR = AttributeKey.valueOf("transferringFile");
-
-    public NettyStreamingMessageSender(StreamSession session, OutboundConnectionSettings template, StreamConnectionFactory factory, int streamingVersion, boolean isPreview)
-    {
-        this.session = session;
-        this.streamingVersion = streamingVersion;
-        this.template = template;
-        this.factory = factory;
-        this.isPreview = isPreview;
-
-        String name = session.peer.toString().replace(':', '.');
-        fileTransferExecutor = new DebuggableThreadPoolExecutor(1, MAX_PARALLEL_TRANSFERS, 1L, TimeUnit.SECONDS, new LinkedBlockingQueue<>(),
-                                                                new NamedThreadFactory("NettyStreaming-Outbound-" + name));
-        fileTransferExecutor.allowCoreThreadTimeOut(true);
-    }
-
-    @Override
-    public void initialize()
-    {
-        StreamInitMessage message = new StreamInitMessage(FBUtilities.getBroadcastAddressAndPort(),
-                                                          session.sessionIndex(),
-                                                          session.planId(),
-                                                          session.streamOperation(),
-                                                          session.getPendingRepair(),
-                                                          session.getPreviewKind());
-        sendMessage(message);
-    }
-
-    public boolean hasControlChannel()
-    {
-        return controlMessageChannel != null;
-    }
-
-    /**
-     * Used by follower to setup control message channel created by initiator
-     */
-    public void injectControlMessageChannel(Channel channel)
-    {
-        this.controlMessageChannel = channel;
-        channel.attr(TRANSFERRING_FILE_ATTR).set(Boolean.FALSE);
-        scheduleKeepAliveTask(channel);
-    }
-
-    /**
-     * Used by initiator to setup control message channel connecting to follower
-     */
-    private void setupControlMessageChannel(OutboundConnectionSettings templateWithConnectTo) throws IOException
-    {
-        if (controlMessageChannel == null)
-        {
-            /*
-             * Inbound handlers are needed:
-             *  a) for initiator's control channel(the first outbound channel) to receive follower's message.
-             *  b) for streaming receiver (note: both initiator and follower can receive streaming files) to reveive files,
-             *     in {@link Handler#setupStreamingPipeline}
-             */
-            controlMessageChannel = createChannel(true, templateWithConnectTo);
-            scheduleKeepAliveTask(controlMessageChannel);
-        }
-    }
-
-    private void scheduleKeepAliveTask(Channel channel)
-    {
-        int keepAlivePeriod = DatabaseDescriptor.getStreamingKeepAlivePeriod();
-        if (logger.isDebugEnabled())
-            logger.debug("{} Scheduling keep-alive task with {}s period.", createLogTag(session, channel), keepAlivePeriod);
-
-        KeepAliveTask task = new KeepAliveTask(channel, session);
-        ScheduledFuture<?> scheduledFuture = channel.eventLoop().scheduleAtFixedRate(task, 0, keepAlivePeriod, TimeUnit.SECONDS);
-        channelKeepAlives.add(scheduledFuture);
-        task.future = scheduledFuture;
-    }
-    
-    private Channel createChannel(boolean isInboundHandlerNeeded, OutboundConnectionSettings templateWithConnectTo) throws IOException
-    {
-        Channel channel = factory.createConnection(templateWithConnectTo, streamingVersion);
-        session.attachOutbound(channel);
-
-        if (isInboundHandlerNeeded)
-        {
-            ChannelPipeline pipeline = channel.pipeline();
-            pipeline.addLast("stream", new StreamingInboundHandler(template.to, streamingVersion, session));
-        }
-        channel.attr(TRANSFERRING_FILE_ATTR).set(Boolean.FALSE);
-        logger.debug("Creating channel id {} local {} remote {}", channel.id(), channel.localAddress(), channel.remoteAddress());
-        return channel;
-    }
-
-    static String createLogTag(StreamSession session, Channel channel)
-    {
-        StringBuilder sb = new StringBuilder(64);
-        sb.append("[Stream");
-
-        if (session != null)
-                sb.append(" #").append(session.planId());
-
-        if (channel != null)
-                sb.append(" channel: ").append(channel.id());
-
-        sb.append(']');
-        return sb.toString();
-    }
-
-    @Override
-    public void sendMessage(StreamMessage message)
-    {
-        if (closed)
-            throw new RuntimeException("stream has been closed, cannot send " + message);
-
-        if (message instanceof OutgoingStreamMessage)
-        {
-            if (isPreview)
-                throw new RuntimeException("Cannot send stream data messages for preview streaming sessions");
-            if (logger.isDebugEnabled())
-                logger.debug("{} Sending {}", createLogTag(session, null), message);
-
-            // Supply a preferred IP up-front to avoid trying to get it in the executor thread, which can be interrupted.
-            OutboundConnectionSettings templateWithConnectTo = factory.supportsPreferredIp() ? template.withConnectTo(template.connectTo()) : template;
-            fileTransferExecutor.submit(new FileStreamTask((OutgoingStreamMessage) message, templateWithConnectTo));
-            return;
-        }
-
-        try
-        {
-            setupControlMessageChannel(template);
-            sendControlMessage(controlMessageChannel, message, future -> onControlMessageComplete(future, message));
-        }
-        catch (Exception e)
-        {
-            close();
-            session.onError(e);
-        }
-    }
-
-    private void sendControlMessage(Channel channel, StreamMessage message, GenericFutureListener listener) throws IOException
-    {
-        if (logger.isDebugEnabled())
-            logger.debug("{} Sending {}", createLogTag(session, channel), message);
-
-        // we anticipate that the control messages are rather small, so allocating a ByteBuf shouldn't  blow out of memory.
-        long messageSize = StreamMessage.serializedSize(message, streamingVersion);
-        if (messageSize > 1 << 30)
-        {
-            throw new IllegalStateException(String.format("%s something is seriously wrong with the calculated stream control message's size: %d bytes, type is %s",
-                                                          createLogTag(session, channel), messageSize, message.type));
-        }
-
-        // as control messages are (expected to be) small, we can simply allocate a ByteBuf here, wrap it, and send via the channel
-        ByteBuf buf = channel.alloc().directBuffer((int) messageSize, (int) messageSize);
-        ByteBuffer nioBuf = buf.nioBuffer(0, (int) messageSize);
-        @SuppressWarnings("resource")
-        DataOutputBufferFixed out = new DataOutputBufferFixed(nioBuf);
-        StreamMessage.serialize(message, out, streamingVersion, session);
-        assert nioBuf.position() == nioBuf.limit();
-        buf.writerIndex(nioBuf.position());
-
-        AsyncChannelPromise.writeAndFlush(channel, buf, listener);
-    }
-
-    /**
-     * Decides what to do after a {@link StreamMessage} is processed.
-     *
-     * Note: this is called from the netty event loop.
-     *
-     * @return null if the message was processed sucessfully; else, a {@link java.util.concurrent.Future} to indicate
-     * the status of aborting any remaining tasks in the session.
-     */
-    java.util.concurrent.Future onControlMessageComplete(Future<?> future, StreamMessage msg)
-    {
-        ChannelFuture channelFuture = (ChannelFuture)future;
-        Throwable cause = future.cause();
-        if (cause == null)
-            return null;
-
-        Channel channel = channelFuture.channel();
-        logger.error("{} failed to send a stream message/data to peer {}: msg = {}",
-                     createLogTag(session, channel), template.to, msg, future.cause());
-
-        // StreamSession will invoke close(), but we have to mark this sender as closed so the session doesn't try
-        // to send any failure messages
-        return session.onError(cause);
-    }
-
-    class FileStreamTask implements Runnable
-    {
-        /**
-         * Time interval, in minutes, to wait between logging a message indicating that we're waiting on a semaphore
-         * permit to become available.
-         */
-        private static final int SEMAPHORE_UNAVAILABLE_LOG_INTERVAL = 3;
-
-        /**
-         * Even though we expect only an {@link OutgoingStreamMessage} at runtime, the type here is {@link StreamMessage}
-         * to facilitate simpler testing.
-         */
-        private final StreamMessage msg;
-
-        private final OutboundConnectionSettings templateWithConnectTo;
-
-        FileStreamTask(OutgoingStreamMessage ofm, OutboundConnectionSettings templateWithConnectTo)
-        {
-            this.msg = ofm;
-            this.templateWithConnectTo = templateWithConnectTo;
-        }
-
-        /**
-         * For testing purposes
-         */
-        FileStreamTask(StreamMessage msg)
-        {
-            this.msg = msg;
-            this.templateWithConnectTo = null;
-        }
-
-        @Override
-        public void run()
-        {
-            if (!acquirePermit(SEMAPHORE_UNAVAILABLE_LOG_INTERVAL))
-                return;
-
-            Channel channel = null;
-            try
-            {
-                channel = getOrCreateChannel(templateWithConnectTo);
-                if (!channel.attr(TRANSFERRING_FILE_ATTR).compareAndSet(false, true))
-                    throw new IllegalStateException("channel's transferring state is currently set to true. refusing to start new stream");
-
-                // close the DataOutputStreamPlus as we're done with it - but don't close the channel
-                try (DataOutputStreamPlus outPlus = new AsyncStreamingOutputPlus(channel))
-                {
-                    StreamMessage.serialize(msg, outPlus, streamingVersion, session);
-                }
-                finally
-                {
-                    channel.attr(TRANSFERRING_FILE_ATTR).set(Boolean.FALSE);
-                }
-            }
-            catch (Exception e)
-            {
-                session.onError(e);
-            }
-            catch (Throwable t)
-            {
-                if (closed && Throwables.getRootCause(t) instanceof ClosedByInterruptException && fileTransferExecutor.isShutdown())
-                {
-                    logger.debug("{} Streaming channel was closed due to the executor pool being shutdown", createLogTag(session, channel));
-                }
-                else
-                {
-                    JVMStabilityInspector.inspectThrowable(t);
-                    if (!session.state().isFinalState())
-                        session.onError(t);
-                }
-            }
-            finally
-            {
-                fileTransferSemaphore.release();
-            }
-        }
-
-        boolean acquirePermit(int logInterval)
-        {
-            long logIntervalNanos = TimeUnit.MINUTES.toNanos(logInterval);
-            long timeOfLastLogging = System.nanoTime();
-            while (true)
-            {
-                if (closed)
-                    return false;
-                try
-                {
-                    if (fileTransferSemaphore.tryAcquire(1, TimeUnit.SECONDS))
-                        return true;
-
-                    // log a helpful message to operators in case they are wondering why a given session might not be making progress.
-                    long now = System.nanoTime();
-                    if (now - timeOfLastLogging > logIntervalNanos)
-                    {
-                        timeOfLastLogging = now;
-                        OutgoingStreamMessage ofm = (OutgoingStreamMessage)msg;
-
-                        if (logger.isInfoEnabled())
-                            logger.info("{} waiting to acquire a permit to begin streaming {}. This message logs every {} minutes",
-                                        createLogTag(session, null), ofm.getName(), logInterval);
-                    }
-                }
-                catch (InterruptedException ie)
-                {
-                    //ignore
-                }
-            }
-        }
-
-        private Channel getOrCreateChannel(OutboundConnectionSettings templateWithConnectTo)
-        {
-            Thread currentThread = Thread.currentThread();
-            try
-            {
-                Channel channel = threadToChannelMap.get(currentThread);
-                if (channel != null)
-                    return channel;
-
-                channel = createChannel(false, templateWithConnectTo);
-                threadToChannelMap.put(currentThread, channel);
-                return channel;
-            }
-            catch (Exception e)
-            {
-                throw new IOError(e);
-            }
-        }
-
-        private void onError(Throwable t)
-        {
-            try
-            {
-                session.onError(t).get(DEFAULT_CLOSE_WAIT_IN_MILLIS, TimeUnit.MILLISECONDS);
-            }
-            catch (Exception e)
-            {
-                // nop - let the Throwable param be the main failure point here, and let session handle it
-            }
-        }
-
-        /**
-         * For testing purposes
-         */
-        void injectChannel(Channel channel)
-        {
-            Thread currentThread = Thread.currentThread();
-            if (threadToChannelMap.get(currentThread) != null)
-                throw new IllegalStateException("previous channel already set");
-
-            threadToChannelMap.put(currentThread, channel);
-        }
-
-        /**
-         * For testing purposes
-         */
-        void unsetChannel()
-        {
-            threadToChannelMap.remove(Thread.currentThread());
-        }
-    }
-
-    /**
-     * Periodically sends the {@link KeepAliveMessage}.
-     *
-     * NOTE: this task, and the callback function {@link #keepAliveListener(Future)} is executed in the netty event loop.
-     */
-    class KeepAliveTask implements Runnable
-    {
-        private final Channel channel;
-        private final StreamSession session;
-
-        /**
-         * A reference to the scheduled task for this instance so that it may be cancelled.
-         */
-        ScheduledFuture<?> future;
-
-        KeepAliveTask(Channel channel, StreamSession session)
-        {
-            this.channel = channel;
-            this.session = session;
-        }
-
-        public void run()
-        {
-            // if the channel has been closed, cancel the scheduled task and return
-            if (!channel.isOpen() || closed)
-            {
-                future.cancel(false);
-                return;
-            }
-
-            // if the channel is currently processing streaming, skip this execution. As this task executes
-            // on the event loop, even if there is a race with a FileStreamTask which changes the channel attribute
-            // after we check it, the FileStreamTask cannot send out any bytes as this KeepAliveTask is executing
-            // on the event loop (and FileStreamTask publishes it's buffer to the channel, consumed after we're done here).
-            if (channel.attr(TRANSFERRING_FILE_ATTR).get())
-                return;
-
-            try
-            {
-                if (logger.isTraceEnabled())
-                    logger.trace("{} Sending keep-alive to {}.", createLogTag(session, channel), session.peer);
-                sendControlMessage(channel, new KeepAliveMessage(), this::keepAliveListener);
-            }
-            catch (IOException ioe)
-            {
-                future.cancel(false);
-            }
-        }
-
-        private void keepAliveListener(Future<? super Void> future)
-        {
-            if (future.isSuccess() || future.isCancelled())
-                return;
-
-            if (logger.isDebugEnabled())
-                logger.debug("{} Could not send keep-alive message (perhaps stream session is finished?).",
-                             createLogTag(session, channel), future.cause());
-        }
-    }
-
-    /**
-     * For testing purposes only.
-     */
-    public void setClosed()
-    {
-        closed = true;
-    }
-
-    void setControlMessageChannel(Channel channel)
-    {
-        controlMessageChannel = channel;
-    }
-
-    int semaphoreAvailablePermits()
-    {
-        return fileTransferSemaphore.availablePermits();
-    }
-
-    @Override
-    public boolean connected()
-    {
-        return !closed && (controlMessageChannel == null || controlMessageChannel.isOpen());
-    }
-
-    @Override
-    public void close()
-    {
-        if (closed)
-            return;
-
-        closed = true;
-        if (logger.isDebugEnabled())
-            logger.debug("{} Closing stream connection channels on {}", createLogTag(session, null), template.to);
-        for (ScheduledFuture<?> future : channelKeepAlives)
-            future.cancel(false);
-        channelKeepAlives.clear();
-
-        threadToChannelMap.clear();
-        fileTransferExecutor.shutdownNow();
-    }
-}
diff --git a/src/java/org/apache/cassandra/streaming/async/StreamCompressionSerializer.java b/src/java/org/apache/cassandra/streaming/async/StreamCompressionSerializer.java
index fc1bde2..f7d8101 100644
--- a/src/java/org/apache/cassandra/streaming/async/StreamCompressionSerializer.java
+++ b/src/java/org/apache/cassandra/streaming/async/StreamCompressionSerializer.java
@@ -27,7 +27,7 @@
 import net.jpountz.lz4.LZ4Compressor;
 import net.jpountz.lz4.LZ4SafeDecompressor;
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.net.AsyncStreamingOutputPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 
 import static org.apache.cassandra.net.MessagingService.current_version;
 
@@ -54,7 +54,7 @@
      */
     private static final int HEADER_LENGTH = 8;
 
-    public static AsyncStreamingOutputPlus.Write serialize(LZ4Compressor compressor, ByteBuffer in, int version)
+    public static StreamingDataOutputPlus.Write serialize(LZ4Compressor compressor, ByteBuffer in, int version)
     {
         assert version == current_version;
         return bufferSupplier -> {
diff --git a/src/java/org/apache/cassandra/streaming/async/StreamingInboundHandler.java b/src/java/org/apache/cassandra/streaming/async/StreamingInboundHandler.java
deleted file mode 100644
index 3b9c172..0000000
--- a/src/java/org/apache/cassandra/streaming/async/StreamingInboundHandler.java
+++ /dev/null
@@ -1,256 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.streaming.async;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.TimeUnit;
-import javax.annotation.Nullable;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.util.concurrent.Uninterruptibles;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.ChannelInboundHandlerAdapter;
-import io.netty.util.ReferenceCountUtil;
-import io.netty.util.concurrent.FastThreadLocalThread;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.AsyncStreamingInputPlus;
-import org.apache.cassandra.streaming.StreamReceiveException;
-import org.apache.cassandra.streaming.StreamSession;
-import org.apache.cassandra.streaming.messages.KeepAliveMessage;
-import org.apache.cassandra.streaming.messages.StreamInitMessage;
-import org.apache.cassandra.streaming.messages.StreamMessage;
-import org.apache.cassandra.utils.JVMStabilityInspector;
-
-import static org.apache.cassandra.streaming.async.NettyStreamingMessageSender.createLogTag;
-
-/**
- * Handles the inbound side of streaming messages and stream data. From the incoming data, we derserialize the message
- * including the actual stream data itself. Because the reading and deserialization of streams is a blocking affair,
- * we can't block the netty event loop. Thus we have a background thread perform all the blocking deserialization.
- */
-public class StreamingInboundHandler extends ChannelInboundHandlerAdapter
-{
-    private static final Logger logger = LoggerFactory.getLogger(StreamingInboundHandler.class);
-    private static volatile boolean trackInboundHandlers = false;
-    private static Collection<StreamingInboundHandler> inboundHandlers;
-    private final InetAddressAndPort remoteAddress;
-    private final int protocolVersion;
-
-    private final StreamSession session;
-
-    /**
-     * A collection of {@link ByteBuf}s that are yet to be processed. Incoming buffers are first dropped into this
-     * structure, and then consumed.
-     * <p>
-     * For thread safety, this structure's resources are released on the consuming thread
-     * (via {@link AsyncStreamingInputPlus#close()},
-     * but the producing side calls {@link AsyncStreamingInputPlus#requestClosure()} to notify the input that is should close.
-     */
-    private AsyncStreamingInputPlus buffers;
-
-    private volatile boolean closed;
-
-    public StreamingInboundHandler(InetAddressAndPort remoteAddress, int protocolVersion, @Nullable StreamSession session)
-    {
-        this.remoteAddress = remoteAddress;
-        this.protocolVersion = protocolVersion;
-        this.session = session;
-        if (trackInboundHandlers)
-            inboundHandlers.add(this);
-    }
-
-    @Override
-    @SuppressWarnings("resource")
-    public void handlerAdded(ChannelHandlerContext ctx)
-    {
-        buffers = new AsyncStreamingInputPlus(ctx.channel());
-        Thread blockingIOThread = new FastThreadLocalThread(new StreamDeserializingTask(session, ctx.channel()),
-                                                            String.format("Stream-Deserializer-%s-%s", remoteAddress.toString(), ctx.channel().id()));
-        blockingIOThread.setDaemon(true);
-        blockingIOThread.start();
-    }
-
-    @Override
-    public void channelRead(ChannelHandlerContext ctx, Object message)
-    {
-        if (closed || !(message instanceof ByteBuf) || !buffers.append((ByteBuf) message))
-            ReferenceCountUtil.release(message);
-    }
-
-    @Override
-    public void channelInactive(ChannelHandlerContext ctx)
-    {
-        close();
-        ctx.fireChannelInactive();
-    }
-
-    void close()
-    {
-        closed = true;
-        buffers.requestClosure();
-        if (trackInboundHandlers)
-            inboundHandlers.remove(this);
-    }
-
-    @Override
-    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause)
-    {
-        if (cause instanceof IOException)
-            logger.trace("connection problem while streaming", cause);
-        else
-            logger.warn("exception occurred while in processing streaming data", cause);
-        close();
-    }
-
-    /**
-     * For testing only!!
-     */
-    void setPendingBuffers(AsyncStreamingInputPlus bufChannel)
-    {
-        this.buffers = bufChannel;
-    }
-
-    /**
-     * The task that performs the actual deserialization.
-     */
-    class StreamDeserializingTask implements Runnable
-    {
-        private final Channel channel;
-
-        @VisibleForTesting
-        StreamSession session;
-
-        StreamDeserializingTask(StreamSession session, Channel channel)
-        {
-            this.session = session;
-            this.channel = channel;
-        }
-
-        @Override
-        public void run()
-        {
-            try
-            {
-                while (true)
-                {
-                    buffers.maybeIssueRead();
-
-                    // do a check of available bytes and possibly sleep some amount of time (then continue).
-                    // this way we can break out of run() sanely or we end up blocking indefintely in StreamMessage.deserialize()
-                    while (buffers.isEmpty())
-                    {
-                        if (closed)
-                            return;
-
-                        Uninterruptibles.sleepUninterruptibly(400, TimeUnit.MILLISECONDS);
-                    }
-
-                    StreamMessage message = StreamMessage.deserialize(buffers, protocolVersion);
-
-                    // keep-alives don't necessarily need to be tied to a session (they could be arrive before or after
-                    // wrt session lifecycle, due to races), just log that we received the message and carry on
-                    if (message instanceof KeepAliveMessage)
-                    {
-                        if (logger.isDebugEnabled())
-                            logger.debug("{} Received {}", createLogTag(session, channel), message);
-                        continue;
-                    }
-
-                    if (session == null)
-                        session = deriveSession(message);
-
-                    if (logger.isDebugEnabled())
-                        logger.debug("{} Received {}", createLogTag(session, channel), message);
-
-                    session.messageReceived(message);
-                }
-            }
-            catch (Throwable t)
-            {
-                JVMStabilityInspector.inspectThrowable(t);
-                if (session != null)
-                {
-                    session.onError(t);
-                }
-                else if (t instanceof StreamReceiveException)
-                {
-                    ((StreamReceiveException)t).session.onError(t);
-                }
-                else
-                {
-                    logger.error("{} stream operation from {} failed", createLogTag(session, channel), remoteAddress, t);
-                }
-            }
-            finally
-            {
-                channel.close();
-                closed = true;
-
-                if (buffers != null)
-                {
-                    // request closure again as the original request could have raced with receiving a
-                    // message and been consumed in the message receive loop above.  Otherweise
-                    // buffers could hang indefinitely on the queue.poll.
-                    buffers.requestClosure();
-                    buffers.close();
-                }
-            }
-        }
-
-        StreamSession deriveSession(StreamMessage message)
-        {
-            // StreamInitMessage starts a new channel here, but IncomingStreamMessage needs a session
-            // to be established a priori
-            StreamSession streamSession = message.getOrCreateSession(channel);
-
-            // Attach this channel to the session: this only happens upon receiving the first init message as a follower;
-            // in all other cases, no new control channel will be added, as the proper control channel will be already attached.
-            streamSession.attachInbound(channel, message instanceof StreamInitMessage);
-            return streamSession;
-        }
-    }
-
-    /** Shutdown for in-JVM tests. For any other usage, tracking of active inbound streaming handlers
-     *  should be revisted first and in-JVM shutdown refactored with it.
-     *  This does not prevent new inbound handlers being added after shutdown, nor is not thread-safe
-     *  around new inbound handlers being opened during shutdown.
-      */
-    @VisibleForTesting
-    public static void shutdown()
-    {
-        assert trackInboundHandlers : "in-JVM tests required tracking of inbound streaming handlers";
-
-        inboundHandlers.forEach(StreamingInboundHandler::close);
-        inboundHandlers.clear();
-    }
-
-    public static void trackInboundHandlers()
-    {
-        inboundHandlers = Collections.newSetFromMap(new ConcurrentHashMap<>());
-        trackInboundHandlers = true;
-    }
-}
diff --git a/src/java/org/apache/cassandra/streaming/async/StreamingMultiplexedChannel.java b/src/java/org/apache/cassandra/streaming/async/StreamingMultiplexedChannel.java
new file mode 100644
index 0000000..560fee9
--- /dev/null
+++ b/src/java/org/apache/cassandra/streaming/async/StreamingMultiplexedChannel.java
@@ -0,0 +1,521 @@
+/*
+ * 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.streaming.async;
+
+import java.io.IOError;
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.channels.ClosedByInterruptException;
+import java.util.Collection;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelFuture;
+import io.netty.util.concurrent.Future; // checkstyle: permit this import
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.streaming.StreamDeserializingTask;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
+import org.apache.cassandra.streaming.StreamSession;
+import org.apache.cassandra.streaming.messages.IncomingStreamMessage;
+import org.apache.cassandra.streaming.messages.KeepAliveMessage;
+import org.apache.cassandra.streaming.messages.OutgoingStreamMessage;
+import org.apache.cassandra.streaming.messages.StreamMessage;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+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.streaming.StreamSession.createLogTag;
+import static org.apache.cassandra.streaming.messages.StreamMessage.serialize;
+import static org.apache.cassandra.streaming.messages.StreamMessage.serializedSize;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.FBUtilities.getAvailableProcessors;
+import static org.apache.cassandra.utils.JVMStabilityInspector.inspectThrowable;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
+import static org.apache.cassandra.utils.concurrent.Semaphore.newFairSemaphore;
+
+/**
+ * Responsible for sending {@link StreamMessage}s to a given peer. We manage an array of netty {@link Channel}s
+ * for sending {@link OutgoingStreamMessage} instances; all other {@link StreamMessage} types are sent via
+ * a special control channel. The reason for this is to treat those messages carefully and not let them get stuck
+ * behind a stream transfer.
+ *
+ * One of the challenges when sending streams is we might need to delay shipping the stream if:
+ *
+ * - we've exceeded our network I/O use due to rate limiting (at the cassandra level)
+ * - the receiver isn't keeping up, which causes the local TCP socket buffer to not empty, which causes epoll writes to not
+ * move any bytes to the socket, which causes buffers to stick around in user-land (a/k/a cassandra) memory.
+ *
+ * When those conditions occur, it's easy enough to reschedule processing the stream once the resources pick up
+ * (we acquire the permits from the rate limiter, or the socket drains). However, we need to ensure that
+ * no other messages are submitted to the same channel while the current stream is still being processed.
+ */
+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)));
+
+    // a simple mechansim for allowing a degree of fairness across multiple sessions
+    private static final Semaphore fileTransferSemaphore = newFairSemaphore(DEFAULT_MAX_PARALLEL_TRANSFERS);
+
+    private final StreamingChannel.Factory factory;
+    private final InetAddressAndPort to;
+    private final StreamSession session;
+    private final int messagingVersion;
+
+    private volatile boolean closed;
+
+    /**
+     * A special {@link Channel} for sending non-stream streaming messages, basically anything that isn't an
+     * {@link OutgoingStreamMessage} (or an {@link IncomingStreamMessage}, but a node doesn't send that, it's only received).
+     */
+    private volatile StreamingChannel controlChannel;
+
+    // note: this really doesn't need to be a LBQ, just something that's thread safe
+    private final Collection<ScheduledFuture<?>> channelKeepAlives = newBlockingQueue();
+
+    private final ExecutorPlus fileTransferExecutor;
+
+    /**
+     * A mapping of each {@link #fileTransferExecutor} thread to a channel that can be written to (on that thread).
+     */
+    private final ConcurrentMap<Thread, StreamingChannel> threadToChannelMap = new ConcurrentHashMap<>();
+
+    public StreamingMultiplexedChannel(StreamSession session, StreamingChannel.Factory factory, InetAddressAndPort to, @Nullable StreamingChannel controlChannel, int messagingVersion)
+    {
+        this.session = session;
+        this.factory = factory;
+        this.to = to;
+        this.messagingVersion = messagingVersion;
+        this.controlChannel = controlChannel;
+
+        String name = session.peer.toString().replace(':', '.');
+        fileTransferExecutor = executorFactory()
+                .configurePooled("NettyStreaming-Outbound-" + name, MAX_PARALLEL_TRANSFERS)
+                .withKeepAlive(1L, SECONDS).build();
+    }
+
+
+
+    public InetAddressAndPort peer()
+    {
+        return to;
+    }
+
+    public InetSocketAddress connectedTo()
+    {
+        return controlChannel == null ? to : controlChannel.connectedTo();
+    }
+
+    /**
+     * Used by initiator to setup control message channel connecting to follower
+     */
+    private void setupControlMessageChannel() throws IOException
+    {
+        if (controlChannel == null)
+        {
+            /*
+             * Inbound handlers are needed:
+             *  a) for initiator's control channel(the first outbound channel) to receive follower's message.
+             *  b) for streaming receiver (note: both initiator and follower can receive streaming files) to reveive files,
+             *     in {@link Handler#setupStreamingPipeline}
+             */
+            controlChannel = createControlChannel();
+        }
+    }
+
+    private StreamingChannel createControlChannel() throws IOException
+    {
+        logger.debug("Creating stream session to {} as {}", to, session.isFollower() ? "follower" : "initiator");
+
+        StreamingChannel channel = factory.create(to, messagingVersion, StreamingChannel.Kind.CONTROL);
+        executorFactory().startThread(String.format("Stream-Deserializer-%s-%s", to.toString(), channel.id()),
+                                      new StreamDeserializingTask(session, channel, messagingVersion));
+
+        session.attachInbound(channel);
+        session.attachOutbound(channel);
+
+        scheduleKeepAliveTask(channel);
+
+        logger.debug("Creating control {}", channel.description());
+        return channel;
+    }
+    
+    private StreamingChannel createFileChannel(InetAddressAndPort connectTo) throws IOException
+    {
+        logger.debug("Creating stream session to {} as {}", to, session.isFollower() ? "follower" : "initiator");
+
+        StreamingChannel channel = factory.create(to, connectTo, messagingVersion, StreamingChannel.Kind.FILE);
+        session.attachOutbound(channel);
+
+        logger.debug("Creating file {}", channel.description());
+        return channel;
+    }
+
+    public Future<?> sendControlMessage(StreamMessage message)
+    {
+        try
+        {
+            setupControlMessageChannel();
+            return sendMessage(controlChannel, message);
+        }
+        catch (Exception e)
+        {
+            close();
+            session.onError(e);
+            return ImmediateFuture.failure(e);
+        }
+
+    }
+    public Future<?> sendMessage(StreamingChannel channel, StreamMessage message)
+    {
+        if (closed)
+            throw new RuntimeException("stream has been closed, cannot send " + message);
+
+        if (message instanceof OutgoingStreamMessage)
+        {
+            if (session.isPreview())
+                throw new RuntimeException("Cannot send stream data messages for preview streaming sessions");
+            if (logger.isDebugEnabled())
+                logger.debug("{} Sending {}", createLogTag(session), message);
+
+            InetAddressAndPort connectTo = factory.supportsPreferredIp() ? SystemKeyspace.getPreferredIP(to) : to;
+            return fileTransferExecutor.submit(new FileStreamTask((OutgoingStreamMessage) message, connectTo));
+        }
+
+        try
+        {
+            Future<?> promise = channel.send(outSupplier -> {
+                // we anticipate that the control messages are rather small, so allocating a ByteBuf shouldn't  blow out of memory.
+                long messageSize = serializedSize(message, messagingVersion);
+                if (messageSize > 1 << 30)
+                {
+                    throw new IllegalStateException(format("%s something is seriously wrong with the calculated stream control message's size: %d bytes, type is %s",
+                                                           createLogTag(session, controlChannel.id()), messageSize, message.type));
+                }
+                try (StreamingDataOutputPlus out = outSupplier.apply((int) messageSize))
+                {
+                    StreamMessage.serialize(message, out, messagingVersion, session);
+                }
+            });
+            promise.addListener(future -> onMessageComplete(future, message));
+            return promise;
+        }
+        catch (Exception e)
+        {
+            close();
+            session.onError(e);
+            return ImmediateFuture.failure(e);
+        }
+    }
+
+    /**
+     * Decides what to do after a {@link StreamMessage} is processed.
+     *
+     * Note: this is called from the netty event loop.
+     *
+     * @return null if the message was processed successfully; else, a {@link java.util.concurrent.Future} to indicate
+     * the status of aborting any remaining tasks in the session.
+     */
+    Future<?> onMessageComplete(Future<?> future, StreamMessage msg)
+    {
+        Throwable cause = future.cause();
+        if (cause == null)
+            return null;
+
+        Channel channel = future instanceof ChannelFuture ? ((ChannelFuture)future).channel() : null;
+        logger.error("{} failed to send a stream message/data to peer {}: msg = {}",
+                     createLogTag(session, channel), to, msg, future.cause());
+
+        // StreamSession will invoke close(), but we have to mark this sender as closed so the session doesn't try
+        // to send any failure messages
+        return session.onError(cause);
+    }
+
+    class FileStreamTask implements Runnable
+    {
+        /**
+         * Time interval, in minutes, to wait between logging a message indicating that we're waiting on a semaphore
+         * permit to become available.
+         */
+        private static final int SEMAPHORE_UNAVAILABLE_LOG_INTERVAL = 3;
+
+        /**
+         * Even though we expect only an {@link OutgoingStreamMessage} at runtime, the type here is {@link StreamMessage}
+         * to facilitate simpler testing.
+         */
+        private final StreamMessage msg;
+
+        private final InetAddressAndPort connectTo;
+
+        FileStreamTask(OutgoingStreamMessage ofm, InetAddressAndPort connectTo)
+        {
+            this.msg = ofm;
+            this.connectTo = connectTo;
+        }
+
+        /**
+         * For testing purposes
+         */
+        FileStreamTask(StreamMessage msg)
+        {
+            this.msg = msg;
+            this.connectTo = null;
+        }
+
+        @Override
+        public void run()
+        {
+            if (!acquirePermit(SEMAPHORE_UNAVAILABLE_LOG_INTERVAL))
+                return;
+
+            StreamingChannel channel = null;
+            try
+            {
+                channel = getOrCreateFileChannel(connectTo);
+
+                // close the DataOutputStreamPlus as we're done with it - but don't close the channel
+                try (StreamingDataOutputPlus out = channel.acquireOut())
+                {
+                    serialize(msg, out, messagingVersion, session);
+                }
+            }
+            catch (Exception e)
+            {
+                session.onError(e);
+            }
+            catch (Throwable t)
+            {
+                if (closed && getRootCause(t) instanceof ClosedByInterruptException && fileTransferExecutor.isShutdown())
+                {
+                    logger.debug("{} Streaming channel was closed due to the executor pool being shutdown", createLogTag(session, channel));
+                }
+                else
+                {
+                    inspectThrowable(t);
+                    if (!session.state().isFinalState())
+                        session.onError(t);
+                }
+            }
+            finally
+            {
+                fileTransferSemaphore.release(1);
+            }
+        }
+
+        boolean acquirePermit(int logInterval)
+        {
+            long logIntervalNanos = MINUTES.toNanos(logInterval);
+            long timeOfLastLogging = nanoTime();
+            while (true)
+            {
+                if (closed)
+                    return false;
+                try
+                {
+                    if (fileTransferSemaphore.tryAcquire(1, 1, SECONDS))
+                        return true;
+
+                    // log a helpful message to operators in case they are wondering why a given session might not be making progress.
+                    long now = nanoTime();
+                    if (now - timeOfLastLogging > logIntervalNanos)
+                    {
+                        timeOfLastLogging = now;
+                        OutgoingStreamMessage ofm = (OutgoingStreamMessage)msg;
+
+                        if (logger.isInfoEnabled())
+                            logger.info("{} waiting to acquire a permit to begin streaming {}. This message logs every {} minutes",
+                                        createLogTag(session), ofm.getName(), logInterval);
+                    }
+                }
+                catch (InterruptedException e)
+                {
+                    throw new UncheckedInterruptedException(e);
+                }
+            }
+        }
+
+        private StreamingChannel getOrCreateFileChannel(InetAddressAndPort connectTo)
+        {
+            Thread currentThread = currentThread();
+            try
+            {
+                StreamingChannel channel = threadToChannelMap.get(currentThread);
+                if (channel != null)
+                    return channel;
+
+                channel = createFileChannel(connectTo);
+                threadToChannelMap.put(currentThread, channel);
+                return channel;
+            }
+            catch (Exception e)
+            {
+                throw new IOError(e);
+            }
+        }
+
+        /**
+         * For testing purposes
+         */
+        void injectChannel(StreamingChannel channel)
+        {
+            Thread currentThread = currentThread();
+            if (threadToChannelMap.get(currentThread) != null)
+                throw new IllegalStateException("previous channel already set");
+
+            threadToChannelMap.put(currentThread, channel);
+        }
+
+        /**
+         * For testing purposes
+         */
+        void unsetChannel()
+        {
+            threadToChannelMap.remove(currentThread());
+        }
+    }
+
+    /**
+     * Periodically sends the {@link KeepAliveMessage}.
+     * <p>
+     * NOTE: this task, and the callback function are executed in the netty event loop.
+     */
+    class KeepAliveTask implements Runnable
+    {
+        private final StreamingChannel channel;
+
+        /**
+         * A reference to the scheduled task for this instance so that it may be cancelled.
+         */
+        ScheduledFuture<?> future;
+
+        KeepAliveTask(StreamingChannel channel)
+        {
+            this.channel = channel;
+        }
+
+        @Override
+        public void run()
+        {
+            // if the channel has been closed, cancel the scheduled task and return
+            if (!channel.connected() || closed)
+            {
+                if (null != future)
+                    future.cancel(false);
+                return;
+            }
+
+            if (logger.isTraceEnabled())
+                logger.trace("{} Sending keep-alive to {}.", createLogTag(session, channel), session.peer);
+
+            sendControlMessage(new KeepAliveMessage()).addListener(f ->
+            {
+                if (f.isSuccess() || f.isCancelled())
+                    return;
+
+                if (logger.isDebugEnabled())
+                    logger.debug("{} Could not send keep-alive message (perhaps stream session is finished?).",
+                                 createLogTag(session, channel), f.cause());
+            });
+        }
+    }
+
+    private void scheduleKeepAliveTask(StreamingChannel channel)
+    {
+        if (!(channel instanceof NettyStreamingChannel))
+            return;
+
+        int keepAlivePeriod = DatabaseDescriptor.getStreamingKeepAlivePeriod();
+        if (keepAlivePeriod <= 0)
+            return;
+
+        if (logger.isDebugEnabled())
+            logger.debug("{} Scheduling keep-alive task with {}s period.", createLogTag(session, channel), keepAlivePeriod);
+
+        KeepAliveTask task = new KeepAliveTask(channel);
+        ScheduledFuture<?> scheduledFuture =
+            ((NettyStreamingChannel)channel).channel
+                                            .eventLoop()
+                                            .scheduleAtFixedRate(task, keepAlivePeriod, keepAlivePeriod, TimeUnit.SECONDS);
+        task.future = scheduledFuture;
+        channelKeepAlives.add(scheduledFuture);
+    }
+
+    /**
+     * For testing purposes only.
+     */
+    public void setClosed()
+    {
+        closed = true;
+    }
+
+    void setControlChannel(NettyStreamingChannel channel)
+    {
+        controlChannel = channel;
+    }
+
+    int semaphoreAvailablePermits()
+    {
+        return fileTransferSemaphore.permits();
+    }
+
+    public boolean connected()
+    {
+        return !closed && (controlChannel == null || controlChannel.connected());
+    }
+
+    public void close()
+    {
+        if (closed)
+            return;
+
+        closed = true;
+        if (logger.isDebugEnabled())
+            logger.debug("{} Closing stream connection channels on {}", createLogTag(session), to);
+        for (ScheduledFuture<?> future : channelKeepAlives)
+            future.cancel(false);
+        channelKeepAlives.clear();
+
+        threadToChannelMap.values().forEach(StreamingChannel::close);
+        threadToChannelMap.clear();
+        fileTransferExecutor.shutdownNow();
+    }
+}
diff --git a/src/java/org/apache/cassandra/streaming/management/ProgressInfoCompositeData.java b/src/java/org/apache/cassandra/streaming/management/ProgressInfoCompositeData.java
index a1fa19f..72ab844 100644
--- a/src/java/org/apache/cassandra/streaming/management/ProgressInfoCompositeData.java
+++ b/src/java/org/apache/cassandra/streaming/management/ProgressInfoCompositeData.java
@@ -20,13 +20,13 @@
 import java.net.UnknownHostException;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.UUID;
 import javax.management.openmbean.*;
 
 import com.google.common.base.Throwables;
 
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.streaming.ProgressInfo;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class ProgressInfoCompositeData
 {
@@ -72,12 +72,14 @@
         }
     }
 
-    public static CompositeData toCompositeData(UUID planId, ProgressInfo progressInfo)
+    public static CompositeData toCompositeData(TimeUUID planId, ProgressInfo progressInfo)
     {
+        // Delta is not returned as it wasn't clear the impact to backwards compatability; it may be safe to expose.
+        // see CASSANDRA-18110
         Map<String, Object> valueMap = new HashMap<>();
         valueMap.put(ITEM_NAMES[0], planId.toString());
-        valueMap.put(ITEM_NAMES[1], progressInfo.peer.address.getHostAddress());
-        valueMap.put(ITEM_NAMES[2], progressInfo.peer.port);
+        valueMap.put(ITEM_NAMES[1], progressInfo.peer.getAddress().getHostAddress());
+        valueMap.put(ITEM_NAMES[2], progressInfo.peer.getPort());
         valueMap.put(ITEM_NAMES[3], progressInfo.sessionIndex);
         valueMap.put(ITEM_NAMES[4], progressInfo.fileName);
         valueMap.put(ITEM_NAMES[5], progressInfo.direction.name());
@@ -103,6 +105,7 @@
                                     (String) values[4],
                                     ProgressInfo.Direction.valueOf((String)values[5]),
                                     (long) values[6],
+                                    (long) values[6],
                                     (long) values[7]);
         }
         catch (UnknownHostException e)
diff --git a/src/java/org/apache/cassandra/streaming/management/SessionCompleteEventCompositeData.java b/src/java/org/apache/cassandra/streaming/management/SessionCompleteEventCompositeData.java
index 1c0d8c5..665b4cd 100644
--- a/src/java/org/apache/cassandra/streaming/management/SessionCompleteEventCompositeData.java
+++ b/src/java/org/apache/cassandra/streaming/management/SessionCompleteEventCompositeData.java
@@ -61,8 +61,8 @@
     {
         Map<String, Object> valueMap = new HashMap<>();
         valueMap.put(ITEM_NAMES[0], event.planId.toString());
-        valueMap.put(ITEM_NAMES[1], event.peer.address.getHostAddress());
-        valueMap.put(ITEM_NAMES[2], event.peer.port);
+        valueMap.put(ITEM_NAMES[1], event.peer.getAddress().getHostAddress());
+        valueMap.put(ITEM_NAMES[2], event.peer.getPort());
         valueMap.put(ITEM_NAMES[3], event.success);
         try
         {
diff --git a/src/java/org/apache/cassandra/streaming/management/SessionInfoCompositeData.java b/src/java/org/apache/cassandra/streaming/management/SessionInfoCompositeData.java
index d20eaf5..f39b321 100644
--- a/src/java/org/apache/cassandra/streaming/management/SessionInfoCompositeData.java
+++ b/src/java/org/apache/cassandra/streaming/management/SessionInfoCompositeData.java
@@ -31,6 +31,7 @@
 import org.apache.cassandra.streaming.SessionInfo;
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.streaming.StreamSummary;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class SessionInfoCompositeData
 {
@@ -86,14 +87,14 @@
         }
     }
 
-    public static CompositeData toCompositeData(final UUID planId, SessionInfo sessionInfo)
+    public static CompositeData toCompositeData(final TimeUUID planId, SessionInfo sessionInfo)
     {
         Map<String, Object> valueMap = new HashMap<>();
         valueMap.put(ITEM_NAMES[0], planId.toString());
-        valueMap.put(ITEM_NAMES[1], sessionInfo.peer.address.getHostAddress());
-        valueMap.put(ITEM_NAMES[2], sessionInfo.peer.port);
-        valueMap.put(ITEM_NAMES[3], sessionInfo.connecting.address.getHostAddress());
-        valueMap.put(ITEM_NAMES[4], sessionInfo.connecting.port);
+        valueMap.put(ITEM_NAMES[1], sessionInfo.peer.getAddress().getHostAddress());
+        valueMap.put(ITEM_NAMES[2], sessionInfo.peer.getPort());
+        valueMap.put(ITEM_NAMES[3], sessionInfo.connecting.getAddress().getHostAddress());
+        valueMap.put(ITEM_NAMES[4], sessionInfo.connecting.getPort());
         Function<StreamSummary, CompositeData> fromStreamSummary = new Function<StreamSummary, CompositeData>()
         {
             public CompositeData apply(StreamSummary input)
diff --git a/src/java/org/apache/cassandra/streaming/management/StreamEventJMXNotifier.java b/src/java/org/apache/cassandra/streaming/management/StreamEventJMXNotifier.java
index 3e12c2a..b8c7487 100644
--- a/src/java/org/apache/cassandra/streaming/management/StreamEventJMXNotifier.java
+++ b/src/java/org/apache/cassandra/streaming/management/StreamEventJMXNotifier.java
@@ -23,6 +23,8 @@
 
 import org.apache.cassandra.streaming.*;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  */
 public class StreamEventJMXNotifier extends NotificationBroadcasterSupport implements StreamEventHandler
@@ -53,14 +55,14 @@
                 break;
             case FILE_PROGRESS:
                 ProgressInfo progress = ((StreamEvent.ProgressEvent) event).progress;
-                long current = System.currentTimeMillis();
+                long current = currentTimeMillis();
                 if (current - progressLastSent >= PROGRESS_NOTIFICATION_INTERVAL || progress.isCompleted())
                 {
                     notif = new Notification(StreamEvent.ProgressEvent.class.getCanonicalName(),
                                              StreamManagerMBean.OBJECT_NAME,
                                              seq.getAndIncrement());
                     notif.setUserData(ProgressInfoCompositeData.toCompositeData(event.planId, progress));
-                    progressLastSent = System.currentTimeMillis();
+                    progressLastSent = currentTimeMillis();
                 }
                 else
                 {
@@ -85,7 +87,7 @@
         Notification notif = new Notification(StreamEvent.class.getCanonicalName() + ".failure",
                                               StreamManagerMBean.OBJECT_NAME,
                                               seq.getAndIncrement());
-        notif.setUserData(t.fillInStackTrace().toString());
+        notif.setUserData(t.toString());
         sendNotification(notif);
     }
 }
diff --git a/src/java/org/apache/cassandra/streaming/management/StreamStateCompositeData.java b/src/java/org/apache/cassandra/streaming/management/StreamStateCompositeData.java
index de88762..5ee4f32 100644
--- a/src/java/org/apache/cassandra/streaming/management/StreamStateCompositeData.java
+++ b/src/java/org/apache/cassandra/streaming/management/StreamStateCompositeData.java
@@ -29,6 +29,7 @@
 import org.apache.cassandra.streaming.SessionInfo;
 import org.apache.cassandra.streaming.StreamState;
 import org.apache.cassandra.streaming.StreamOperation;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  */
@@ -121,7 +122,7 @@
     {
         assert cd.getCompositeType().equals(COMPOSITE_TYPE);
         Object[] values = cd.getAll(ITEM_NAMES);
-        UUID planId = UUID.fromString((String) values[0]);
+        TimeUUID planId = TimeUUID.fromString((String) values[0]);
         String typeString = (String) values[1];
         Set<SessionInfo> sessions = Sets.newHashSet(Iterables.transform(Arrays.asList((CompositeData[]) values[2]),
                                                                         new Function<CompositeData, SessionInfo>()
diff --git a/src/java/org/apache/cassandra/streaming/messages/CompleteMessage.java b/src/java/org/apache/cassandra/streaming/messages/CompleteMessage.java
index 83d95e0..bf35266 100644
--- a/src/java/org/apache/cassandra/streaming/messages/CompleteMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/CompleteMessage.java
@@ -18,7 +18,7 @@
 package org.apache.cassandra.streaming.messages;
 
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 
 public class CompleteMessage extends StreamMessage
@@ -30,7 +30,7 @@
             return new CompleteMessage();
         }
 
-        public void serialize(CompleteMessage message, DataOutputStreamPlus out, int version, StreamSession session) {}
+        public void serialize(CompleteMessage message, StreamingDataOutputPlus out, int version, StreamSession session) {}
 
         public long serializedSize(CompleteMessage message, int version)
         {
diff --git a/src/java/org/apache/cassandra/streaming/messages/IncomingStreamMessage.java b/src/java/org/apache/cassandra/streaming/messages/IncomingStreamMessage.java
index e268747..ff1e61f 100644
--- a/src/java/org/apache/cassandra/streaming/messages/IncomingStreamMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/IncomingStreamMessage.java
@@ -20,23 +20,20 @@
 import java.io.IOException;
 import java.util.Objects;
 
-import io.netty.channel.Channel;
-
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.io.util.DataInputPlus;
 
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.streaming.IncomingStream;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamManager;
 import org.apache.cassandra.streaming.StreamReceiveException;
 import org.apache.cassandra.streaming.StreamSession;
-import org.apache.cassandra.utils.JVMStabilityInspector;
 
 public class IncomingStreamMessage extends StreamMessage
 {
     public static Serializer<IncomingStreamMessage> serializer = new Serializer<IncomingStreamMessage>()
     {
-        @SuppressWarnings("resource")
         public IncomingStreamMessage deserialize(DataInputPlus input, int version) throws IOException
         {
             StreamMessageHeader header = StreamMessageHeader.serializer.deserialize(input, version);
@@ -56,12 +53,14 @@
             }
             catch (Throwable t)
             {
-                JVMStabilityInspector.inspectThrowable(t);
+                if (t instanceof StreamReceiveException)
+                    throw (StreamReceiveException) t;
+                // make sure to wrap so the caller always has access to the session to call onError
                 throw new StreamReceiveException(session, t);
             }
         }
 
-        public void serialize(IncomingStreamMessage message, DataOutputStreamPlus out, int version, StreamSession session)
+        public void serialize(IncomingStreamMessage message, StreamingDataOutputPlus out, int version, StreamSession session)
         {
             throw new UnsupportedOperationException("Not allowed to call serialize on an incoming stream");
         }
@@ -83,8 +82,9 @@
     }
 
     @Override
-    public StreamSession getOrCreateSession(Channel channel)
+    public StreamSession getOrCreateAndAttachInboundSession(StreamingChannel channel, int messagingVersion)
     {
+        stream.session().attachInbound(channel);
         return stream.session();
     }
 
diff --git a/src/java/org/apache/cassandra/streaming/messages/KeepAliveMessage.java b/src/java/org/apache/cassandra/streaming/messages/KeepAliveMessage.java
index 5352b3b..a09cfca 100644
--- a/src/java/org/apache/cassandra/streaming/messages/KeepAliveMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/KeepAliveMessage.java
@@ -15,40 +15,40 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-
 package org.apache.cassandra.streaming.messages;
 
-import java.io.IOException;
-
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 
 public class KeepAliveMessage extends StreamMessage
 {
-    public static Serializer<KeepAliveMessage> serializer = new Serializer<KeepAliveMessage>()
-    {
-        public KeepAliveMessage deserialize(DataInputPlus in, int version) throws IOException
-        {
-            return new KeepAliveMessage();
-        }
-
-        public void serialize(KeepAliveMessage message, DataOutputStreamPlus out, int version, StreamSession session)
-        {}
-
-        public long serializedSize(KeepAliveMessage message, int version)
-        {
-            return 0;
-        }
-    };
 
     public KeepAliveMessage()
     {
         super(Type.KEEP_ALIVE);
     }
 
+    @Override
     public String toString()
     {
         return "keep-alive";
     }
+
+    public static Serializer<KeepAliveMessage> serializer = new Serializer<KeepAliveMessage>()
+    {
+        public KeepAliveMessage deserialize(DataInputPlus in, int version)
+        {
+            return new KeepAliveMessage();
+        }
+
+        public void serialize(KeepAliveMessage message, StreamingDataOutputPlus out, int version, StreamSession session)
+        {
+        }
+
+        public long serializedSize(KeepAliveMessage message, int version)
+        {
+            return 0;
+        }
+    };
 }
diff --git a/src/java/org/apache/cassandra/streaming/messages/OutgoingStreamMessage.java b/src/java/org/apache/cassandra/streaming/messages/OutgoingStreamMessage.java
index 702e806..4128ddb 100644
--- a/src/java/org/apache/cassandra/streaming/messages/OutgoingStreamMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/OutgoingStreamMessage.java
@@ -22,9 +22,9 @@
 import com.google.common.annotations.VisibleForTesting;
 
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.OutgoingStream;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -37,7 +37,7 @@
             throw new UnsupportedOperationException("Not allowed to call deserialize on an outgoing stream");
         }
 
-        public void serialize(OutgoingStreamMessage message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+        public void serialize(OutgoingStreamMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
         {
             message.startTransfer();
             try
@@ -77,7 +77,7 @@
                                               stream.getPendingRepair());
     }
 
-    public synchronized void serialize(DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+    public synchronized void serialize(StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
     {
         if (completed)
         {
diff --git a/src/java/org/apache/cassandra/streaming/messages/PrepareAckMessage.java b/src/java/org/apache/cassandra/streaming/messages/PrepareAckMessage.java
index 97fdff7..479ef34 100644
--- a/src/java/org/apache/cassandra/streaming/messages/PrepareAckMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/PrepareAckMessage.java
@@ -21,14 +21,14 @@
 import java.io.IOException;
 
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 
 public class PrepareAckMessage extends StreamMessage
 {
     public static Serializer<PrepareAckMessage> serializer = new Serializer<PrepareAckMessage>()
     {
-        public void serialize(PrepareAckMessage message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+        public void serialize(PrepareAckMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
         {
             //nop
         }
diff --git a/src/java/org/apache/cassandra/streaming/messages/PrepareSynAckMessage.java b/src/java/org/apache/cassandra/streaming/messages/PrepareSynAckMessage.java
index 4e5e8fb..9d97de6 100644
--- a/src/java/org/apache/cassandra/streaming/messages/PrepareSynAckMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/PrepareSynAckMessage.java
@@ -23,7 +23,7 @@
 import java.util.Collection;
 
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.streaming.StreamSummary;
 
@@ -31,7 +31,7 @@
 {
     public static Serializer<PrepareSynAckMessage> serializer = new Serializer<PrepareSynAckMessage>()
     {
-        public void serialize(PrepareSynAckMessage message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+        public void serialize(PrepareSynAckMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
         {
             out.writeInt(message.summaries.size());
             for (StreamSummary summary : message.summaries)
diff --git a/src/java/org/apache/cassandra/streaming/messages/PrepareSynMessage.java b/src/java/org/apache/cassandra/streaming/messages/PrepareSynMessage.java
index e378af7..1160033 100644
--- a/src/java/org/apache/cassandra/streaming/messages/PrepareSynMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/PrepareSynMessage.java
@@ -22,7 +22,7 @@
 import java.util.Collection;
 
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamRequest;
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.streaming.StreamSummary;
@@ -55,7 +55,7 @@
             return size;
         }
 
-        public void serialize(PrepareSynMessage message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+        public void serialize(PrepareSynMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
         {
             // requests
             out.writeInt(message.requests.size());
diff --git a/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java b/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java
index ff2cdec..134e2cf 100644
--- a/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/ReceivedMessage.java
@@ -20,8 +20,8 @@
 import java.io.*;
 
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 
 public class ReceivedMessage extends StreamMessage
@@ -34,7 +34,7 @@
             return new ReceivedMessage(TableId.deserialize(input), input.readInt());
         }
 
-        public void serialize(ReceivedMessage message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+        public void serialize(ReceivedMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
         {
             message.tableId.serialize(out);
             out.writeInt(message.sequenceNumber);
diff --git a/src/java/org/apache/cassandra/streaming/messages/SessionFailedMessage.java b/src/java/org/apache/cassandra/streaming/messages/SessionFailedMessage.java
index ca10bcc..f09b643 100644
--- a/src/java/org/apache/cassandra/streaming/messages/SessionFailedMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/SessionFailedMessage.java
@@ -18,7 +18,7 @@
 package org.apache.cassandra.streaming.messages;
 
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 
 public class SessionFailedMessage extends StreamMessage
@@ -30,7 +30,7 @@
             return new SessionFailedMessage();
         }
 
-        public void serialize(SessionFailedMessage message, DataOutputStreamPlus out, int version, StreamSession session) {}
+        public void serialize(SessionFailedMessage message, StreamingDataOutputPlus out, int version, StreamSession session) {}
 
         public long serializedSize(SessionFailedMessage message, int version)
         {
diff --git a/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java b/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java
index 0d6ef47..889c732 100644
--- a/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/StreamInitMessage.java
@@ -18,20 +18,17 @@
 package org.apache.cassandra.streaming.messages;
 
 import java.io.IOException;
-import java.util.UUID;
-
-import io.netty.channel.Channel;
 
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.StreamResultFuture;
 import org.apache.cassandra.streaming.StreamSession;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
 
@@ -45,14 +42,14 @@
 
     public final InetAddressAndPort from;
     public final int sessionIndex;
-    public final UUID planId;
+    public final TimeUUID planId;
     public final StreamOperation streamOperation;
 
-    public final UUID pendingRepair;
+    public final TimeUUID pendingRepair;
     public final PreviewKind previewKind;
 
-    public StreamInitMessage(InetAddressAndPort from, int sessionIndex, UUID planId, StreamOperation streamOperation,
-                             UUID pendingRepair, PreviewKind previewKind)
+    public StreamInitMessage(InetAddressAndPort from, int sessionIndex, TimeUUID planId, StreamOperation streamOperation,
+                             TimeUUID pendingRepair, PreviewKind previewKind)
     {
         super(Type.STREAM_INIT);
         this.from = from;
@@ -64,10 +61,12 @@
     }
 
     @Override
-    public StreamSession getOrCreateSession(Channel channel)
+    public StreamSession getOrCreateAndAttachInboundSession(StreamingChannel channel, int messagingVersion)
     {
-        return StreamResultFuture.createFollower(sessionIndex, planId, streamOperation, from, channel, pendingRepair, previewKind)
+        StreamSession session = StreamResultFuture.createFollower(sessionIndex, planId, streamOperation, from, channel, messagingVersion, pendingRepair, previewKind)
                                  .getSession(from, sessionIndex);
+        session.attachInbound(channel);
+        return session;
     }
 
     @Override
@@ -81,18 +80,16 @@
 
     private static class StreamInitMessageSerializer implements Serializer<StreamInitMessage>
     {
-        public void serialize(StreamInitMessage message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+        public void serialize(StreamInitMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
         {
             inetAddressAndPortSerializer.serialize(message.from, out, version);
             out.writeInt(message.sessionIndex);
-            UUIDSerializer.serializer.serialize(message.planId, out, MessagingService.current_version);
+            message.planId.serialize(out);
             out.writeUTF(message.streamOperation.getDescription());
 
             out.writeBoolean(message.pendingRepair != null);
             if (message.pendingRepair != null)
-            {
-                UUIDSerializer.serializer.serialize(message.pendingRepair, out, MessagingService.current_version);
-            }
+                message.pendingRepair.serialize(out);
             out.writeInt(message.previewKind.getSerializationVal());
         }
 
@@ -100,10 +97,10 @@
         {
             InetAddressAndPort from = inetAddressAndPortSerializer.deserialize(in, version);
             int sessionIndex = in.readInt();
-            UUID planId = UUIDSerializer.serializer.deserialize(in, MessagingService.current_version);
+            TimeUUID planId = TimeUUID.deserialize(in);
             String description = in.readUTF();
 
-            UUID pendingRepair = in.readBoolean() ? UUIDSerializer.serializer.deserialize(in, version) : null;
+            TimeUUID pendingRepair = in.readBoolean() ? TimeUUID.deserialize(in) : null;
             PreviewKind previewKind = PreviewKind.deserialize(in.readInt());
             return new StreamInitMessage(from, sessionIndex, planId, StreamOperation.fromString(description),
                                          pendingRepair, previewKind);
@@ -113,13 +110,11 @@
         {
             long size = inetAddressAndPortSerializer.serializedSize(message.from, version);
             size += TypeSizes.sizeof(message.sessionIndex);
-            size += UUIDSerializer.serializer.serializedSize(message.planId, MessagingService.current_version);
+            size += TimeUUID.sizeInBytes();
             size += TypeSizes.sizeof(message.streamOperation.getDescription());
             size += TypeSizes.sizeof(message.pendingRepair != null);
             if (message.pendingRepair != null)
-            {
-                size += UUIDSerializer.serializer.serializedSize(message.pendingRepair, MessagingService.current_version);
-            }
+                size += TimeUUID.sizeInBytes();
             size += TypeSizes.sizeof(message.previewKind.getSerializationVal());
 
             return size;
diff --git a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java
index e3f805e..db393a5 100644
--- a/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java
+++ b/src/java/org/apache/cassandra/streaming/messages/StreamMessage.java
@@ -21,14 +21,11 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import io.netty.channel.Channel;
-
 import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
 import org.apache.cassandra.streaming.StreamSession;
 
-import static java.lang.Math.max;
-
 /**
  * StreamMessage is an abstract base class that every messages in streaming protocol inherit.
  *
@@ -36,7 +33,7 @@
  */
 public abstract class StreamMessage
 {
-    public static void serialize(StreamMessage message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException
+    public static void serialize(StreamMessage message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException
     {
         out.writeByte(message.type.id);
         message.type.outSerializer.serialize(message, out, version, session);
@@ -57,7 +54,7 @@
     public static interface Serializer<V extends StreamMessage>
     {
         V deserialize(DataInputPlus in, int version) throws IOException;
-        void serialize(V message, DataOutputStreamPlus out, int version, StreamSession session) throws IOException;
+        void serialize(V message, StreamingDataOutputPlus out, int version, StreamSession session) throws IOException;
         long serializedSize(V message, int version) throws IOException;
     }
 
@@ -138,7 +135,7 @@
      * Get or create a {@link StreamSession} based on this stream message data: not all stream messages support this,
      * so the default implementation just throws an exception.
      */
-    public StreamSession getOrCreateSession(Channel channel)
+    public StreamSession getOrCreateAndAttachInboundSession(StreamingChannel channel, int messagingVersion)
     {
         throw new UnsupportedOperationException("Not supported by streaming messages of type: " + this.getClass());
     }
diff --git a/src/java/org/apache/cassandra/streaming/messages/StreamMessageHeader.java b/src/java/org/apache/cassandra/streaming/messages/StreamMessageHeader.java
index 30afbb8..ec9d8e8 100644
--- a/src/java/org/apache/cassandra/streaming/messages/StreamMessageHeader.java
+++ b/src/java/org/apache/cassandra/streaming/messages/StreamMessageHeader.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.streaming.messages;
 
 import java.io.IOException;
-import java.util.UUID;
 
 import com.google.common.base.Objects;
 
@@ -26,10 +25,9 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.StreamSession;
-import org.apache.cassandra.utils.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.locator.InetAddressAndPort.Serializer.inetAddressAndPortSerializer;
 
@@ -41,23 +39,23 @@
     public static FileMessageHeaderSerializer serializer = new FileMessageHeaderSerializer();
 
     public final TableId tableId;
-    public UUID planId;
+    public TimeUUID planId;
     // it tells us if the file was sent by a follower stream session
     public final boolean sendByFollower;
     public int sessionIndex;
     public final int sequenceNumber;
     public final long repairedAt;
-    public final UUID pendingRepair;
+    public final TimeUUID pendingRepair;
     public final InetAddressAndPort sender;
 
     public StreamMessageHeader(TableId tableId,
                                InetAddressAndPort sender,
-                               UUID planId,
+                               TimeUUID planId,
                                boolean sendByFollower,
                                int sessionIndex,
                                int sequenceNumber,
                                long repairedAt,
-                               UUID pendingRepair)
+                               TimeUUID pendingRepair)
     {
         this.tableId = tableId;
         this.sender = sender;
@@ -111,7 +109,7 @@
         {
             header.tableId.serialize(out);
             inetAddressAndPortSerializer.serialize(header.sender, out, version);
-            UUIDSerializer.serializer.serialize(header.planId, out, version);
+            header.planId.serialize(out);
             out.writeBoolean(header.sendByFollower);
             out.writeInt(header.sessionIndex);
             out.writeInt(header.sequenceNumber);
@@ -119,7 +117,7 @@
             out.writeBoolean(header.pendingRepair != null);
             if (header.pendingRepair != null)
             {
-                UUIDSerializer.serializer.serialize(header.pendingRepair, out, version);
+                header.pendingRepair.serialize(out);
             }
         }
 
@@ -127,12 +125,12 @@
         {
             TableId tableId = TableId.deserialize(in);
             InetAddressAndPort sender = inetAddressAndPortSerializer.deserialize(in, version);
-            UUID planId = UUIDSerializer.serializer.deserialize(in, MessagingService.current_version);
+            TimeUUID planId = TimeUUID.deserialize(in);
             boolean sendByFollower = in.readBoolean();
             int sessionIndex = in.readInt();
             int sequenceNumber = in.readInt();
             long repairedAt = in.readLong();
-            UUID pendingRepair = in.readBoolean() ? UUIDSerializer.serializer.deserialize(in, version) : null;
+            TimeUUID pendingRepair = in.readBoolean() ? TimeUUID.deserialize(in) : null;
 
             return new StreamMessageHeader(tableId, sender, planId, sendByFollower, sessionIndex, sequenceNumber, repairedAt, pendingRepair);
         }
@@ -141,13 +139,13 @@
         {
             long size = header.tableId.serializedSize();
             size += inetAddressAndPortSerializer.serializedSize(header.sender, version);
-            size += UUIDSerializer.serializer.serializedSize(header.planId, version);
+            size += TimeUUID.sizeInBytes();
             size += TypeSizes.sizeof(header.sendByFollower);
             size += TypeSizes.sizeof(header.sessionIndex);
             size += TypeSizes.sizeof(header.sequenceNumber);
             size += TypeSizes.sizeof(header.repairedAt);
             size += TypeSizes.sizeof(header.pendingRepair != null);
-            size += header.pendingRepair != null ? UUIDSerializer.serializer.serializedSize(header.pendingRepair, version) : 0;
+            size += header.pendingRepair != null ? TimeUUID.sizeInBytes() : 0;
 
             return size;
         }
diff --git a/src/java/org/apache/cassandra/tools/AuditLogViewer.java b/src/java/org/apache/cassandra/tools/AuditLogViewer.java
index dd0e839..f226aa2 100644
--- a/src/java/org/apache/cassandra/tools/AuditLogViewer.java
+++ b/src/java/org/apache/cassandra/tools/AuditLogViewer.java
@@ -17,12 +17,12 @@
  */
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.util.Arrays;
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.GnuParser;
@@ -76,7 +76,7 @@
         Pauser pauser = Pauser.millis(100);
         List<ExcerptTailer> tailers = pathList.stream()
                                               .distinct()
-                                              .map(path -> SingleChronicleQueueBuilder.single(new File(path)).readOnly(true).rollCycle(RollCycles.valueOf(rollCycle)).build())
+                                              .map(path -> SingleChronicleQueueBuilder.single(new File(path).toJavaIOFile()).readOnly(true).rollCycle(RollCycles.valueOf(rollCycle)).build())
                                               .map(SingleChronicleQueue::createTailer)
                                               .collect(Collectors.toList());
         boolean hadWork = true;
diff --git a/src/java/org/apache/cassandra/tools/BootstrapMonitor.java b/src/java/org/apache/cassandra/tools/BootstrapMonitor.java
index 9719192..4d58638 100644
--- a/src/java/org/apache/cassandra/tools/BootstrapMonitor.java
+++ b/src/java/org/apache/cassandra/tools/BootstrapMonitor.java
@@ -20,18 +20,20 @@
 import java.io.IOException;
 import java.io.PrintStream;
 import java.text.SimpleDateFormat;
-import java.util.concurrent.locks.Condition;
 
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.apache.cassandra.utils.progress.ProgressEvent;
 import org.apache.cassandra.utils.progress.ProgressEventType;
 import org.apache.cassandra.utils.progress.jmx.JMXNotificationProgressListener;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+
 public class BootstrapMonitor extends JMXNotificationProgressListener
 {
     private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
     private final PrintStream out;
-    private final Condition condition = new SimpleCondition();
+    private final Condition condition = newOneTimeCondition();
 
     public BootstrapMonitor(PrintStream out)
     {
@@ -74,7 +76,7 @@
     public void progress(String tag, ProgressEvent event)
     {
         ProgressEventType type = event.getType();
-        String message = String.format("[%s] %s", format.format(System.currentTimeMillis()), event.getMessage());
+        String message = String.format("[%s] %s", format.format(currentTimeMillis()), event.getMessage());
         if (type == ProgressEventType.PROGRESS)
         {
             message = message + " (progress: " + (int)event.getProgressPercentage() + "%)";
diff --git a/src/java/org/apache/cassandra/tools/BulkLoadConnectionFactory.java b/src/java/org/apache/cassandra/tools/BulkLoadConnectionFactory.java
index 5b61fab..eef0ef4 100644
--- a/src/java/org/apache/cassandra/tools/BulkLoadConnectionFactory.java
+++ b/src/java/org/apache/cassandra/tools/BulkLoadConnectionFactory.java
@@ -19,14 +19,17 @@
 package org.apache.cassandra.tools;
 
 import java.io.IOException;
+import java.net.InetSocketAddress;
 
-import io.netty.channel.Channel;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.net.OutboundConnectionSettings;
-import org.apache.cassandra.streaming.DefaultConnectionFactory;
-import org.apache.cassandra.streaming.StreamConnectionFactory;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
+import org.apache.cassandra.streaming.async.NettyStreamingChannel;
 
-public class BulkLoadConnectionFactory extends DefaultConnectionFactory implements StreamConnectionFactory
+import static org.apache.cassandra.locator.InetAddressAndPort.getByAddress;
+
+public class BulkLoadConnectionFactory extends NettyStreamingConnectionFactory
 {
     private final int storagePort;
     private final EncryptionOptions.ServerEncryptionOptions encryptionOptions;
@@ -37,7 +40,26 @@
         this.encryptionOptions = encryptionOptions;
     }
 
-    public Channel createConnection(OutboundConnectionSettings template, int messagingVersion) throws IOException
+    @Override
+    public NettyStreamingChannel create(InetSocketAddress to, int messagingVersion, StreamingChannel.Kind kind) throws IOException
+    {
+        OutboundConnectionSettings template = new OutboundConnectionSettings(getByAddress(to));
+        return create(template, messagingVersion, kind);
+    }
+
+    @Override
+    public StreamingChannel create(InetSocketAddress to,
+                                   InetSocketAddress preferred,
+                                   int messagingVersion,
+                                   StreamingChannel.Kind kind) throws IOException
+    {
+        // The preferred address is always overwritten in create(). This method override only exists so we can avoid 
+        // falling back to the NettyStreamingConnectionFactory implementation.
+        OutboundConnectionSettings template = new OutboundConnectionSettings(getByAddress(to), getByAddress(preferred));
+        return create(template, messagingVersion, kind);
+    }
+
+    private NettyStreamingChannel create(OutboundConnectionSettings template, int messagingVersion, StreamingChannel.Kind kind) throws IOException
     {
         // storage port can handle both encrypted and unencrypted traffic from 4.0
         // so from sstableloader's point of view we can use just storage port for both cases
@@ -47,9 +69,8 @@
         if (encryptionOptions != null && encryptionOptions.internode_encryption != EncryptionOptions.ServerEncryptionOptions.InternodeEncryption.none)
             template = template.withEncryption(encryptionOptions);
 
-        return super.createConnection(template, messagingVersion);
+        return connect(template, messagingVersion, kind);
     }
-
     @Override
     public boolean supportsPreferredIp()
     {
diff --git a/src/java/org/apache/cassandra/tools/BulkLoader.java b/src/java/org/apache/cassandra/tools/BulkLoader.java
index f68c74d..ebdd072 100644
--- a/src/java/org/apache/cassandra/tools/BulkLoader.java
+++ b/src/java/org/apache/cassandra/tools/BulkLoader.java
@@ -23,29 +23,36 @@
 import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLEngine;
 
-import com.datastax.driver.core.AuthProvider;
-import com.datastax.driver.core.RemoteEndpointAwareJdkSSLOptions;
-import com.datastax.driver.core.SSLOptions;
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
 import org.apache.commons.cli.Option;
 import org.apache.commons.cli.Options;
 
+import com.datastax.driver.core.AuthProvider;
+import com.datastax.driver.core.RemoteEndpointAwareJdkSSLOptions;
+import com.datastax.driver.core.SSLOptions;
 import com.datastax.shaded.netty.channel.socket.SocketChannel;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.io.sstable.SSTableLoader;
-import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.security.SSLFactory;
-import org.apache.cassandra.streaming.*;
+import org.apache.cassandra.streaming.ProgressInfo;
+import org.apache.cassandra.streaming.SessionInfo;
+import org.apache.cassandra.streaming.StreamEvent;
+import org.apache.cassandra.streaming.StreamEventHandler;
+import org.apache.cassandra.streaming.StreamResultFuture;
+import org.apache.cassandra.streaming.StreamState;
+import org.apache.cassandra.streaming.StreamingChannel;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.NativeSSTableLoaderClient;
 import org.apache.cassandra.utils.OutputHandler;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class BulkLoader
 {
-    public static void main(String args[]) throws BulkLoadException
+    public static void main(String[] args) throws BulkLoadException
     {
         LoaderOptions options = LoaderOptions.builder().parseArgs(args).build();
         load(options);
@@ -56,7 +63,7 @@
         DatabaseDescriptor.toolInitialization();
         OutputHandler handler = new OutputHandler.SystemOutput(options.verbose, options.debug);
         SSTableLoader loader = new SSTableLoader(
-                options.directory.getAbsoluteFile(),
+                options.directory.toAbsolute(),
                 new ExternalClient(
                         options.hosts,
                         options.storagePort,
@@ -66,9 +73,11 @@
                         handler,
                         options.connectionsPerHost,
                         options.targetKeyspace);
-        DatabaseDescriptor.setStreamThroughputOutboundMegabitsPerSec(options.throttle);
-        DatabaseDescriptor.setInterDCStreamThroughputOutboundMegabitsPerSec(options.interDcThrottle);
-        StreamResultFuture future = null;
+        DatabaseDescriptor.setStreamThroughputOutboundBytesPerSec(options.throttleBytes);
+        DatabaseDescriptor.setInterDCStreamThroughputOutboundBytesPerSec(options.interDcThrottleBytes);
+        DatabaseDescriptor.setEntireSSTableStreamThroughputOutboundMebibytesPerSec(options.entireSSTableThrottleMebibytes);
+        DatabaseDescriptor.setEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec(options.entireSSTableInterDcThrottleMebibytes);
+        StreamResultFuture future;
 
         ProgressIndicator indicator = new ProgressIndicator();
         try
@@ -119,18 +128,18 @@
     // Return true when everything is at 100%
     static class ProgressIndicator implements StreamEventHandler
     {
-        private long start;
+        private final long start;
         private long lastProgress;
         private long lastTime;
 
         private long peak = 0;
         private int totalFiles = 0;
 
-        private final Multimap<InetAddressAndPort, SessionInfo> sessionsByHost = HashMultimap.create();
+        private final Multimap<InetSocketAddress, SessionInfo> sessionsByHost = HashMultimap.create();
 
         public ProgressIndicator()
         {
-            start = lastTime = System.nanoTime();
+            start = lastTime = nanoTime();
         }
 
         public void onSuccess(StreamState finalState)
@@ -156,7 +165,7 @@
                     progressInfo = ((StreamEvent.ProgressEvent) event).progress;
                 }
 
-                long time = System.nanoTime();
+                long time = nanoTime();
                 long deltaTime = time - lastTime;
 
                 StringBuilder sb = new StringBuilder();
@@ -167,7 +176,7 @@
 
                 boolean updateTotalFiles = totalFiles == 0;
                 // recalculate progress across all sessions in all hosts and display
-                for (InetAddressAndPort peer : sessionsByHost.keySet())
+                for (InetSocketAddress peer : sessionsByHost.keySet())
                 {
                     sb.append("[").append(peer).append("]");
 
@@ -218,7 +227,7 @@
                 }
                 sb.append(" (avg: ").append(FBUtilities.prettyPrintMemoryPerSecond(totalProgress, time - start)).append(")");
 
-                System.out.println(sb.toString());
+                System.out.println(sb);
             }
         }
 
@@ -229,7 +238,7 @@
 
         private void printSummary(int connectionsPerHost)
         {
-            long end = System.nanoTime();
+            long end = nanoTime();
             long durationMS = ((end - start) / (1000000));
 
             StringBuilder sb = new StringBuilder();
@@ -240,14 +249,14 @@
             sb.append(String.format("   %-24s: %-10s%n", "Total duration ", durationMS + " ms"));
             sb.append(String.format("   %-24s: %-10s%n", "Average transfer rate ", FBUtilities.prettyPrintMemoryPerSecond(lastProgress, end - start)));
             sb.append(String.format("   %-24s: %-10s%n", "Peak transfer rate ",  FBUtilities.prettyPrintMemoryPerSecond(peak)));
-            System.out.println(sb.toString());
+            System.out.println(sb);
         }
     }
 
     private static SSLOptions buildSSLOptions(EncryptionOptions clientEncryptionOptions)
     {
 
-        if (!clientEncryptionOptions.isEnabled())
+        if (!clientEncryptionOptions.getEnabled())
         {
             return null;
         }
@@ -297,7 +306,7 @@
         }
 
         @Override
-        public StreamConnectionFactory getConnectionFactory()
+        public StreamingChannel.Factory getConnectionFactory()
         {
             return new BulkLoadConnectionFactory(serverEncOptions, storagePort);
         }
diff --git a/src/java/org/apache/cassandra/tools/GenerateTokens.java b/src/java/org/apache/cassandra/tools/GenerateTokens.java
index c03a4d0..a6888d7 100644
--- a/src/java/org/apache/cassandra/tools/GenerateTokens.java
+++ b/src/java/org/apache/cassandra/tools/GenerateTokens.java
@@ -21,7 +21,6 @@
 import java.util.Arrays;
 
 import org.apache.commons.cli.CommandLine;
-import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.GnuParser;
 import org.apache.commons.cli.HelpFormatter;
 import org.apache.commons.cli.Option;
diff --git a/src/java/org/apache/cassandra/tools/HashPassword.java b/src/java/org/apache/cassandra/tools/HashPassword.java
new file mode 100644
index 0000000..ddc0a72
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/HashPassword.java
@@ -0,0 +1,196 @@
+/*
+ * 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.tools;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.OptionGroup;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.lang3.StringUtils;
+
+import org.apache.cassandra.io.util.File;
+import org.mindrot.jbcrypt.BCrypt;
+
+public class HashPassword
+{
+    private static final String LOGROUNDS_OPTION = "logrounds";
+    private static final String HELP_OPTION = "help";
+    private static final String ENV_VAR = "environment-var";
+    private static final String PLAIN = "plain";
+    private static final String INPUT = "input";
+
+    private static final int LOGROUNDS_DEFAULT = 10;
+    private static final int MIN_PASS_LENGTH = 4;
+
+    public static void main(String[] args)
+    {
+        try
+        {
+            Options options = getOptions();
+            CommandLine cmd = parseCommandLine(args, options);
+
+            String password = null;
+            if (cmd.hasOption(ENV_VAR))
+            {
+                password = System.getenv(cmd.getOptionValue(ENV_VAR));
+                if (password == null)
+                {
+                    System.err.println(String.format("Environment variable '%s' is undefined.", cmd.getOptionValue(ENV_VAR)));
+                    System.exit(1);
+                }
+            }
+            else if (cmd.hasOption(PLAIN))
+            {
+                password = cmd.getOptionValue(PLAIN);
+            }
+            else if (cmd.hasOption(INPUT))
+            {
+                String input = cmd.getOptionValue(INPUT);
+                byte[] fileInput = null;
+                if ("-".equals(input))
+                {
+                    ByteArrayOutputStream os = new ByteArrayOutputStream();
+                    int rd;
+                    while ((rd = System.in.read()) != -1)
+                        os.write(rd);
+                    fileInput = os.toByteArray();
+                }
+                else
+                {
+                    try
+                    {
+                        Path file = File.getPath(input);
+                        fileInput = Files.readAllBytes(file);
+                    }
+                    catch (IOException e)
+                    {
+                        System.err.printf("Failed to read from '%s': %s%n", input, e);
+                        System.exit(1);
+                    }
+                }
+                password = new String(fileInput, StandardCharsets.UTF_8);
+            }
+            else
+            {
+                System.err.println(String.format("One of the options --%s, --%s or --%s must be used.",
+                                                 ENV_VAR, PLAIN, INPUT));
+                printUsage(options);
+                System.exit(1);
+            }
+
+            if (password.chars().anyMatch(i -> i < 32))
+                System.err.println("WARNING: The provided plain text password contains non-printable characters (ASCII<32).");
+
+            if (password.length() < MIN_PASS_LENGTH)
+                System.err.println("WARNING: The provided password is very short, probably too short to be secure.");
+
+            int logRounds = cmd.hasOption(LOGROUNDS_OPTION) ? Integer.parseInt(cmd.getOptionValue(LOGROUNDS_OPTION)) : LOGROUNDS_DEFAULT;
+            if (logRounds < 4 || logRounds > 30)
+            {
+                System.err.println(String.format("Bad value for --%s %d. " +
+                                                 "Please use a value between 4 and 30 inclusively",
+                        LOGROUNDS_OPTION, logRounds));
+                System.exit(1);
+            }
+
+            // The number of rounds is in fact = 2^rounds.
+            if (logRounds > 16)
+                System.err.println(String.format("WARNING: Using a high number of hash rounds, as configured using '--%s %d' " +
+                                                 "will consume a lot of CPU and likely cause timeouts. Note that the parameter defines the " +
+                                                 "logarithmic number of rounds: %d becomes 2^%d = %d rounds",
+                        LOGROUNDS_OPTION, logRounds,
+                        logRounds, logRounds, 1 << logRounds));
+
+            if (password.getBytes().length > 72)
+                System.err.println(String.format("WARNING: The provided password has a length of %d bytes, but the underlying hash/crypt algorithm " +
+                        "(bcrypt) can only compare up to 72 bytes. The password will be accepted and work, but only compared up to 72 bytes.",
+                        password.getBytes().length));
+
+            String hashed = escape(hashpw(password, logRounds));
+            System.out.print(hashed);
+            System.out.flush();
+        }
+        catch (Exception e)
+        {
+            e.printStackTrace();
+            System.exit(1);
+        }
+    }
+
+    private static CommandLine parseCommandLine(String[] args, Options options) throws ParseException
+    {
+        CommandLineParser parser = new GnuParser();
+
+        CommandLine cmd = parser.parse(options, args, false);
+
+        if (cmd.hasOption(HELP_OPTION))
+        {
+            printUsage(options);
+            System.exit(0);
+        }
+        return cmd;
+    }
+
+    private static Options getOptions()
+    {
+        Options options = new Options();
+        options.addOption("h", HELP_OPTION, false, "Display this help message");
+        options.addOption("r", LOGROUNDS_OPTION, true, "Number of hash rounds (default: " + LOGROUNDS_DEFAULT + ").");
+        OptionGroup group = new OptionGroup();
+        group.addOption(new Option("e", ENV_VAR, true,
+                                   "Use value of the specified environment variable as the password"));
+        group.addOption(new Option("p", PLAIN, true,
+                                   "Argument is the plain text password"));
+        group.addOption(new Option("i", INPUT, true,
+                                   "Input is a file (or - for stdin) to read the password from. " +
+                                   "Make sure that the whole input including newlines is considered. " +
+                                   "For example, the shell command 'echo -n foobar | hash_password -i -' will " +
+                                   "work as intended and just hash 'foobar'."));
+        options.addOptionGroup(group);
+        return options;
+    }
+
+    private static String hashpw(String password, int rounds)
+    {
+        return BCrypt.hashpw(password, BCrypt.gensalt(rounds));
+    }
+
+    private static String escape(String name)
+    {
+        return StringUtils.replace(name, "'", "''");
+    }
+
+    public static void printUsage(Options options)
+    {
+        String usage = "hash_password [options]";
+        String header = "--\n" +
+                        "Hashes a plain text password and prints the hashed password.\n" +
+                        "Options are:";
+        new HelpFormatter().printHelp(usage, header, options, "");
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/JMXTool.java b/src/java/org/apache/cassandra/tools/JMXTool.java
index e917179..d054716 100644
--- a/src/java/org/apache/cassandra/tools/JMXTool.java
+++ b/src/java/org/apache/cassandra/tools/JMXTool.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.tools;
 
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
@@ -71,6 +69,8 @@
 import io.airlift.airline.Help;
 import io.airlift.airline.HelpOption;
 import io.airlift.airline.Option;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.yaml.snakeyaml.TypeDescription;
 import org.yaml.snakeyaml.Yaml;
 import org.yaml.snakeyaml.constructor.Constructor;
@@ -229,8 +229,8 @@
             Preconditions.checkArgument(files.size() == 2, "files requires 2 arguments but given %s", files);
             Map<String, Info> left;
             Map<String, Info> right;
-            try (FileInputStream leftStream = new FileInputStream(files.get(0));
-                 FileInputStream rightStream = new FileInputStream(files.get(1)))
+            try (FileInputStreamPlus leftStream = new FileInputStreamPlus(files.get(0));
+                 FileInputStreamPlus rightStream = new FileInputStreamPlus(files.get(1)))
             {
                 left = format.load(leftStream);
                 right = format.load(rightStream);
diff --git a/src/java/org/apache/cassandra/tools/JsonTransformer.java b/src/java/org/apache/cassandra/tools/JsonTransformer.java
index 341512c..ed0830d 100644
--- a/src/java/org/apache/cassandra/tools/JsonTransformer.java
+++ b/src/java/org/apache/cassandra/tools/JsonTransformer.java
@@ -58,6 +58,8 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public final class JsonTransformer
 {
 
@@ -282,7 +284,7 @@
                     json.writeFieldName("expires_at");
                     json.writeString(dateString(TimeUnit.SECONDS, liveInfo.localExpirationTime()));
                     json.writeFieldName("expired");
-                    json.writeBoolean(liveInfo.localExpirationTime() < (System.currentTimeMillis() / 1000));
+                    json.writeBoolean(liveInfo.localExpirationTime() < (currentTimeMillis() / 1000));
                 }
                 json.writeEndObject();
                 objectIndenter.setCompact(false);
@@ -497,7 +499,7 @@
                 json.writeFieldName("expires_at");
                 json.writeString(dateString(TimeUnit.SECONDS, cell.localDeletionTime()));
                 json.writeFieldName("expired");
-                json.writeBoolean(!cell.isLive((int) (System.currentTimeMillis() / 1000)));
+                json.writeBoolean(!cell.isLive((int) (currentTimeMillis() / 1000)));
             }
             json.writeEndObject();
             objectIndenter.setCompact(false);
diff --git a/src/java/org/apache/cassandra/tools/LoaderOptions.java b/src/java/org/apache/cassandra/tools/LoaderOptions.java
index 22729fc..7729955 100644
--- a/src/java/org/apache/cassandra/tools/LoaderOptions.java
+++ b/src/java/org/apache/cassandra/tools/LoaderOptions.java
@@ -20,28 +20,40 @@
  */
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.InvocationTargetException;
-import java.net.*;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.MalformedURLException;
+import java.net.UnknownHostException;
 import java.util.HashSet;
 import java.util.Set;
 
 import com.google.common.base.Throwables;
 import com.google.common.net.HostAndPort;
-
-import org.apache.cassandra.config.*;
-import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
-
-import com.datastax.driver.core.AuthProvider;
-import com.datastax.driver.core.PlainTextAuthProvider;
-import org.apache.commons.cli.*;
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.datastax.driver.core.AuthProvider;
+import com.datastax.driver.core.PlainTextAuthProvider;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DataRateSpec;
+import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.config.YamlConfigurationLoader;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
+
+import static org.apache.cassandra.config.DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND;
+
 public class LoaderOptions
 {
     private static final Logger logger = LoggerFactory.getLogger(LoaderOptions.class);
@@ -60,8 +72,25 @@
     public static final String IGNORE_NODES_OPTION = "ignore";
     public static final String CONNECTIONS_PER_HOST = "connections-per-host";
     public static final String CONFIG_PATH = "conf-path";
+
+    /**
+     * Throttle defined in megabits per second. CASSANDRA-10637 introduced a builder and is the preferred way to
+     * provide options instead of using these constant fields.
+     * @deprecated Use {@code throttle-mib} instead
+     */
+    @Deprecated
     public static final String THROTTLE_MBITS = "throttle";
+    public static final String THROTTLE_MEBIBYTES = "throttle-mib";
+    /**
+     * Inter-datacenter throttle defined in megabits per second. CASSANDRA-10637 introduced a builder and is the
+     * preferred way to provide options instead of using these constant fields.
+     * @deprecated Use {@code inter-dc-throttle-mib} instead
+     */
+    @Deprecated
     public static final String INTER_DC_THROTTLE_MBITS = "inter-dc-throttle";
+    public static final String INTER_DC_THROTTLE_MEBIBYTES = "inter-dc-throttle-mib";
+    public static final String ENTIRE_SSTABLE_THROTTLE_MEBIBYTES = "entire-sstable-throttle-mib";
+    public static final String ENTIRE_SSTABLE_INTER_DC_THROTTLE_MEBIBYTES = "entire-sstable-inter-dc-throttle-mib";
     public static final String TOOL_NAME = "sstableloader";
     public static final String TARGET_KEYSPACE = "target-keyspace";
 
@@ -83,8 +112,10 @@
     public final String user;
     public final String passwd;
     public final AuthProvider authProvider;
-    public final int throttle;
-    public final int interDcThrottle;
+    public final long throttleBytes;
+    public final long interDcThrottleBytes;
+    public final int entireSSTableThrottleMebibytes;
+    public final int entireSSTableInterDcThrottleMebibytes;
     public final int storagePort;
     public final int sslStoragePort;
     public final EncryptionOptions clientEncOptions;
@@ -104,8 +135,10 @@
         user = builder.user;
         passwd = builder.passwd;
         authProvider = builder.authProvider;
-        throttle = builder.throttle;
-        interDcThrottle = builder.interDcThrottle;
+        throttleBytes = builder.throttleBytes;
+        interDcThrottleBytes = builder.interDcThrottleBytes;
+        entireSSTableThrottleMebibytes = builder.entireSSTableThrottleMebibytes;
+        entireSSTableInterDcThrottleMebibytes = builder.entireSSTableInterDcThrottleMebibytes;
         storagePort = builder.storagePort;
         sslStoragePort = builder.sslStoragePort;
         clientEncOptions = builder.clientEncOptions;
@@ -127,8 +160,11 @@
         String passwd;
         String authProviderName;
         AuthProvider authProvider;
-        int throttle = 0;
-        int interDcThrottle = 0;
+        long throttleBytes = 0;
+        long interDcThrottleBytes = 0;
+        int entireSSTableThrottleMebibytes = 0;
+        int entireSSTableInterDcThrottleMebibytes = 0;
+
         int storagePort;
         int sslStoragePort;
         EncryptionOptions clientEncOptions = new EncryptionOptions();
@@ -216,15 +252,60 @@
             return this;
         }
 
-        public Builder throttle(int throttle)
+        public Builder throttleMebibytes(int throttleMebibytes)
         {
-            this.throttle = throttle;
+            this.throttleBytes = (long) MEBIBYTES_PER_SECOND.toBytesPerSecond(throttleMebibytes);
             return this;
         }
 
+        @Deprecated
+        public Builder throttle(int throttleMegabits)
+        {
+            this.throttleBytes = (long) DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(throttleMegabits).toBytesPerSecond();
+            return this;
+        }
+
+        public Builder interDcThrottleMebibytes(int interDcThrottleMebibytes)
+        {
+            this.interDcThrottleBytes = (long) MEBIBYTES_PER_SECOND.toBytesPerSecond(interDcThrottleMebibytes);
+            return this;
+        }
+
+        public Builder interDcThrottleMegabits(int interDcThrottleMegabits)
+        {
+            this.interDcThrottleBytes = (long) DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(interDcThrottleMegabits).toBytesPerSecond();
+            return this;
+        }
+
+        @Deprecated
         public Builder interDcThrottle(int interDcThrottle)
         {
-            this.interDcThrottle = interDcThrottle;
+            return interDcThrottleMegabits(interDcThrottle);
+        }
+
+        public Builder entireSSTableThrottleMebibytes(int entireSSTableThrottleMebibytes)
+        {
+            this.entireSSTableThrottleMebibytes = entireSSTableThrottleMebibytes;
+            return this;
+        }
+
+        @Deprecated
+        public Builder entireSSTableThrottle(int entireSSTableThrottle)
+        {
+            this.entireSSTableThrottleMebibytes = entireSSTableThrottle;
+            return this;
+        }
+
+        public Builder entireSSTableInterDcThrottleMebibytes(int entireSSTableInterDcThrottleMebibytes)
+        {
+            this.entireSSTableInterDcThrottleMebibytes = entireSSTableInterDcThrottleMebibytes;
+            return this;
+        }
+
+        @Deprecated
+        public Builder entireSSTableInterDcThrottle(int entireSSTableInterDcThrottle)
+        {
+            this.entireSSTableInterDcThrottleMebibytes = entireSSTableInterDcThrottle;
             return this;
         }
 
@@ -381,14 +462,37 @@
                     {
                         errorMsg("Config file not found", options);
                     }
-                    config = new YamlConfigurationLoader().loadConfig(configFile.toURI().toURL());
+                    config = new YamlConfigurationLoader().loadConfig(configFile.toPath().toUri().toURL());
+
+                    // below 2 checks are needed in order to match the pre-CASSANDRA-15234 upper bound for those parameters which were still in megabits per second
+                    if (config.stream_throughput_outbound.toMegabitsPerSecond() >= Integer.MAX_VALUE)
+                    {
+                        throw new ConfigurationException("stream_throughput_outbound: " + config.stream_throughput_outbound.toString() + " is too large", false);
+                    }
+
+                    if (config.inter_dc_stream_throughput_outbound.toMegabitsPerSecond() >= Integer.MAX_VALUE)
+                    {
+                        throw new ConfigurationException("inter_dc_stream_throughput_outbound: " + config.inter_dc_stream_throughput_outbound.toString() + " is too large", false);
+                    }
+
+                    if (config.entire_sstable_stream_throughput_outbound.toMebibytesPerSecond() >= Integer.MAX_VALUE)
+                    {
+                        throw new ConfigurationException("entire_sstable_stream_throughput_outbound: " + config.entire_sstable_stream_throughput_outbound.toString() + " is too large", false);
+                    }
+
+                    if (config.entire_sstable_inter_dc_stream_throughput_outbound.toMebibytesPerSecond() >= Integer.MAX_VALUE)
+                    {
+                        throw new ConfigurationException("entire_sstable_inter_dc_stream_throughput_outbound: " + config.entire_sstable_inter_dc_stream_throughput_outbound.toString() + " is too large", false);
+                    }
                 }
                 else
                 {
                     config = new Config();
                     // unthrottle stream by default
-                    config.stream_throughput_outbound_megabits_per_sec = 0;
-                    config.inter_dc_stream_throughput_outbound_megabits_per_sec = 0;
+                    config.stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(0);
+                    config.inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(0);
+                    config.entire_sstable_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(0);
+                    config.entire_sstable_inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(0);
                 }
 
                 if (cmd.hasOption(STORAGE_PORT_OPTION))
@@ -416,11 +520,12 @@
                     connectionsPerHost = Integer.parseInt(cmd.getOptionValue(CONNECTIONS_PER_HOST));
                 }
 
+                throttleBytes = config.stream_throughput_outbound.toBytesPerSecondAsInt();
+
                 if (cmd.hasOption(SSL_STORAGE_PORT_OPTION))
                     logger.info("ssl storage port is deprecated and not used, all communication goes though storage port " +
                                 "which is able to handle encrypted communication too.");
 
-                throttle = config.stream_throughput_outbound_megabits_per_sec;
                 // Copy the encryption options and apply the config so that argument parsing can accesss isEnabled.
                 clientEncOptions = config.client_encryption_options.applyConfig();
                 serverEncOptions = config.server_encryption_options;
@@ -432,7 +537,7 @@
                 }
                 else
                 {
-                    if (config.native_transport_port_ssl != null && (config.client_encryption_options.isEnabled() || clientEncOptions.isEnabled()))
+                    if (config.native_transport_port_ssl != null && (config.client_encryption_options.getEnabled() || clientEncOptions.getEnabled()))
                         nativePort = config.native_transport_port_ssl;
                     else
                         nativePort = config.native_transport_port;
@@ -460,18 +565,48 @@
                     System.exit(1);
                 }
 
+                if (cmd.hasOption(THROTTLE_MBITS) && cmd.hasOption(THROTTLE_MEBIBYTES))
+                {
+                    errorMsg(String.format("Both '%s' and '%s' were provided. Please only provide one of the two options", THROTTLE_MBITS, THROTTLE_MEBIBYTES), options);
+                }
+
+                if (cmd.hasOption(INTER_DC_THROTTLE_MBITS) && cmd.hasOption(INTER_DC_THROTTLE_MEBIBYTES))
+                {
+                    errorMsg(String.format("Both '%s' and '%s' were provided. Please only provide one of the two options", INTER_DC_THROTTLE_MBITS, INTER_DC_THROTTLE_MEBIBYTES), options);
+                }
+
                 if (cmd.hasOption(THROTTLE_MBITS))
                 {
-                    throttle = Integer.parseInt(cmd.getOptionValue(THROTTLE_MBITS));
+                    throttle(Integer.parseInt(cmd.getOptionValue(THROTTLE_MBITS)));
+                }
+
+                if (cmd.hasOption(THROTTLE_MEBIBYTES))
+                {
+                    throttleMebibytes(Integer.parseInt(cmd.getOptionValue(THROTTLE_MEBIBYTES)));
                 }
 
                 if (cmd.hasOption(INTER_DC_THROTTLE_MBITS))
                 {
-                    interDcThrottle = Integer.parseInt(cmd.getOptionValue(INTER_DC_THROTTLE_MBITS));
+                    interDcThrottleMegabits(Integer.parseInt(cmd.getOptionValue(INTER_DC_THROTTLE_MBITS)));
+                }
+
+                if (cmd.hasOption(INTER_DC_THROTTLE_MEBIBYTES))
+                {
+                    interDcThrottleMebibytes(Integer.parseInt(cmd.getOptionValue(INTER_DC_THROTTLE_MEBIBYTES)));
+                }
+
+                if (cmd.hasOption(ENTIRE_SSTABLE_THROTTLE_MEBIBYTES))
+                {
+                    entireSSTableThrottleMebibytes(Integer.parseInt(cmd.getOptionValue(ENTIRE_SSTABLE_THROTTLE_MEBIBYTES)));
+                }
+
+                if (cmd.hasOption(ENTIRE_SSTABLE_INTER_DC_THROTTLE_MEBIBYTES))
+                {
+                    entireSSTableInterDcThrottleMebibytes(Integer.parseInt(cmd.getOptionValue(ENTIRE_SSTABLE_INTER_DC_THROTTLE_MEBIBYTES)));
                 }
 
                 if (cmd.hasOption(SSL_TRUSTSTORE) || cmd.hasOption(SSL_TRUSTSTORE_PW) ||
-                            cmd.hasOption(SSL_KEYSTORE) || cmd.hasOption(SSL_KEYSTORE_PW))
+                    cmd.hasOption(SSL_KEYSTORE) || cmd.hasOption(SSL_KEYSTORE_PW))
                 {
                     clientEncOptions = clientEncOptions.withEnabled(true);
                 }
@@ -615,8 +750,12 @@
         options.addOption("p",  NATIVE_PORT_OPTION, "native transport port", "port used for native connection (default 9042)");
         options.addOption("sp",  STORAGE_PORT_OPTION, "storage port", "port used for internode communication (default 7000)");
         options.addOption("ssp",  SSL_STORAGE_PORT_OPTION, "ssl storage port", "port used for TLS internode communication (default 7001), this option is deprecated, all communication goes through storage port which handles encrypted communication as well");
-        options.addOption("t", THROTTLE_MBITS, "throttle", "throttle speed in Mbits (default unlimited)");
-        options.addOption("idct", INTER_DC_THROTTLE_MBITS, "inter-dc-throttle", "inter-datacenter throttle speed in Mbits (default unlimited)");
+        options.addOption("t", THROTTLE_MBITS, "throttle", "throttle speed in Mbps (default 0 for unlimited), this option is deprecated, use \"throttle-mib\" instead");
+        options.addOption(null, THROTTLE_MEBIBYTES, "throttle-mib", "throttle speed in MiB/s (default 0 for unlimited)");
+        options.addOption("idct", INTER_DC_THROTTLE_MBITS, "inter-dc-throttle", "inter-datacenter throttle speed in Mbps (default 0 for unlimited), this option is deprecated, use \"inter-dc-throttle-mib\" instead");
+        options.addOption(null, INTER_DC_THROTTLE_MEBIBYTES, "inter-dc-throttle-mib", "inter-datacenter throttle speed in MiB/s (default 0 for unlimited)");
+        options.addOption(null, ENTIRE_SSTABLE_THROTTLE_MEBIBYTES, "entire-sstable-throttle-mib", "entire SSTable throttle speed in MiB/s (default 0 for unlimited)");
+        options.addOption(null, ENTIRE_SSTABLE_INTER_DC_THROTTLE_MEBIBYTES, "entire-sstable-inter-dc-throttle-mib", "entire SSTable inter-datacenter throttle speed in MiB/s (default 0 for unlimited)");
         options.addOption("u", USER_OPTION, "username", "username for cassandra authentication");
         options.addOption("pw", PASSWD_OPTION, "password", "password for cassandra authentication");
         options.addOption("ap", AUTH_PROVIDER_OPTION, "auth provider", "custom AuthProvider class name for cassandra authentication");
@@ -645,7 +784,7 @@
                 "you will need to have the files Standard1-g-1-Data.db and Standard1-g-1-Index.db into a directory /path/to/Keyspace1/Standard1/.";
         String footer = System.lineSeparator() +
                 "You can provide cassandra.yaml file with -f command line option to set up streaming throughput, client and server encryption options. " +
-                "Only stream_throughput_outbound_megabits_per_sec, server_encryption_options and client_encryption_options are read from yaml. " +
+                "Only stream_throughput_outbound, server_encryption_options and client_encryption_options are read from yaml. " +
                 "You can override options read from cassandra.yaml with corresponding command line options.";
         new HelpFormatter().printHelp(usage, header, options, footer);
     }
diff --git a/src/java/org/apache/cassandra/tools/NodeProbe.java b/src/java/org/apache/cassandra/tools/NodeProbe.java
index b06e0f3..4a2f43d 100644
--- a/src/java/org/apache/cassandra/tools/NodeProbe.java
+++ b/src/java/org/apache/cassandra/tools/NodeProbe.java
@@ -55,6 +55,21 @@
 import javax.management.remote.JMXServiceURL;
 import javax.rmi.ssl.SslRMIClientSocketFactory;
 
+import org.apache.cassandra.audit.AuditLogManager;
+import org.apache.cassandra.audit.AuditLogManagerMBean;
+import org.apache.cassandra.audit.AuditLogOptions;
+import org.apache.cassandra.audit.AuditLogOptionsCompositeData;
+import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.auth.AuthCache;
+import org.apache.cassandra.auth.AuthCacheMBean;
+import org.apache.cassandra.auth.NetworkPermissionsCache;
+import org.apache.cassandra.auth.NetworkPermissionsCacheMBean;
+import org.apache.cassandra.auth.PasswordAuthenticator;
+import org.apache.cassandra.auth.PermissionsCache;
+import org.apache.cassandra.auth.PermissionsCacheMBean;
+import org.apache.cassandra.auth.RolesCache;
+import org.apache.cassandra.auth.RolesCacheMBean;
+import org.apache.cassandra.auth.jmx.AuthorizationProxy;
 import org.apache.cassandra.batchlog.BatchlogManager;
 import org.apache.cassandra.batchlog.BatchlogManagerMBean;
 import org.apache.cassandra.db.ColumnFamilyStoreMBean;
@@ -133,6 +148,12 @@
     protected HintsServiceMBean hsProxy;
     protected BatchlogManagerMBean bmProxy;
     protected ActiveRepairServiceMBean arsProxy;
+    protected AuditLogManagerMBean almProxy;
+    protected PasswordAuthenticator.CredentialsCacheMBean ccProxy;
+    protected AuthorizationProxy.JmxPermissionsCacheMBean jpcProxy;
+    protected NetworkPermissionsCacheMBean npcProxy;
+    protected PermissionsCacheMBean pcProxy;
+    protected RolesCacheMBean rcProxy;
     protected Output output;
     private boolean failed;
 
@@ -245,6 +266,18 @@
             bmProxy = JMX.newMBeanProxy(mbeanServerConn, name, BatchlogManagerMBean.class);
             name = new ObjectName(ActiveRepairServiceMBean.MBEAN_NAME);
             arsProxy = JMX.newMBeanProxy(mbeanServerConn, name, ActiveRepairServiceMBean.class);
+            name = new ObjectName(AuditLogManager.MBEAN_NAME);
+            almProxy = JMX.newMBeanProxy(mbeanServerConn, name, AuditLogManagerMBean.class);
+            name = new ObjectName(AuthCache.MBEAN_NAME_BASE + PasswordAuthenticator.CredentialsCacheMBean.CACHE_NAME);
+            ccProxy = JMX.newMBeanProxy(mbeanServerConn, name, PasswordAuthenticator.CredentialsCacheMBean.class);
+            name = new ObjectName(AuthCache.MBEAN_NAME_BASE + AuthorizationProxy.JmxPermissionsCacheMBean.CACHE_NAME);
+            jpcProxy = JMX.newMBeanProxy(mbeanServerConn, name, AuthorizationProxy.JmxPermissionsCacheMBean.class);
+            name = new ObjectName(AuthCache.MBEAN_NAME_BASE + NetworkPermissionsCache.CACHE_NAME);
+            npcProxy = JMX.newMBeanProxy(mbeanServerConn, name, NetworkPermissionsCacheMBean.class);
+            name = new ObjectName(AuthCache.MBEAN_NAME_BASE + PermissionsCache.CACHE_NAME);
+            pcProxy = JMX.newMBeanProxy(mbeanServerConn, name, PermissionsCacheMBean.class);
+            name = new ObjectName(AuthCache.MBEAN_NAME_BASE + RolesCache.CACHE_NAME);
+            rcProxy = JMX.newMBeanProxy(mbeanServerConn, name, RolesCacheMBean.class);
         }
         catch (MalformedObjectNameException e)
         {
@@ -304,9 +337,9 @@
         return ssProxy.verify(extendedVerify, checkVersion, diskFailurePolicy, mutateRepairStatus, checkOwnsTokens, quick, keyspaceName, tableNames);
     }
 
-    public int upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
+    public int upgradeSSTables(String keyspaceName, boolean excludeCurrentVersion, long maxSSTableTimestamp, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
     {
-        return ssProxy.upgradeSSTables(keyspaceName, excludeCurrentVersion, jobs, tableNames);
+        return ssProxy.upgradeSSTables(keyspaceName, excludeCurrentVersion, maxSSTableTimestamp, jobs, tableNames);
     }
 
     public int garbageCollect(String tombstoneOption, int jobs, String keyspaceName, String... tableNames) throws IOException, ExecutionException, InterruptedException
@@ -314,6 +347,11 @@
         return ssProxy.garbageCollect(tombstoneOption, jobs, keyspaceName, tableNames);
     }
 
+    public int recompressSSTables(String keyspaceName, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
+    {
+        return ssProxy.recompressSSTables(keyspaceName, jobs, tableNames);
+    }
+
     private void checkJobs(PrintStream out, int jobs)
     {
         int compactors = ssProxy.getConcurrentCompactors();
@@ -324,64 +362,59 @@
     public void forceKeyspaceCleanup(PrintStream out, int jobs, String keyspaceName, String... tableNames) throws IOException, ExecutionException, InterruptedException
     {
         checkJobs(out, jobs);
-        switch (forceKeyspaceCleanup(jobs, keyspaceName, tableNames))
-        {
-            case 1:
-                failed = true;
-                out.println("Aborted cleaning up at least one table in keyspace "+keyspaceName+", check server logs for more information.");
-                break;
-            case 2:
-                failed = true;
-                out.println("Failed marking some sstables compacting in keyspace "+keyspaceName+", check server logs for more information");
-                break;
-        }
+        perform(out, keyspaceName,
+                () -> forceKeyspaceCleanup(jobs, keyspaceName, tableNames),
+                "cleaning up");
     }
 
     public void scrub(PrintStream out, boolean disableSnapshot, boolean skipCorrupted, boolean checkData, boolean reinsertOverflowedTTL, int jobs, String keyspaceName, String... tables) throws IOException, ExecutionException, InterruptedException
     {
         checkJobs(out, jobs);
-        switch (ssProxy.scrub(disableSnapshot, skipCorrupted, checkData, reinsertOverflowedTTL, jobs, keyspaceName, tables))
-        {
-            case 1:
-                failed = true;
-                out.println("Aborted scrubbing at least one table in keyspace "+keyspaceName+", check server logs for more information.");
-                break;
-            case 2:
-                failed = true;
-                out.println("Failed marking some sstables compacting in keyspace "+keyspaceName+", check server logs for more information");
-                break;
-        }
+        perform(out, keyspaceName,
+                () -> scrub(disableSnapshot, skipCorrupted, checkData, reinsertOverflowedTTL, jobs, keyspaceName, tables),
+                "scrubbing");
     }
 
     public void verify(PrintStream out, boolean extendedVerify, boolean checkVersion, boolean diskFailurePolicy, boolean mutateRepairStatus, boolean checkOwnsTokens, boolean quick, String keyspaceName, String... tableNames) throws IOException, ExecutionException, InterruptedException
     {
-        switch (verify(extendedVerify, checkVersion, diskFailurePolicy, mutateRepairStatus, checkOwnsTokens, quick, keyspaceName, tableNames))
-        {
-            case 1:
-                failed = true;
-                out.println("Aborted verifying at least one table in keyspace "+keyspaceName+", check server logs for more information.");
-                break;
-            case 2:
-                failed = true;
-                out.println("Failed marking some sstables compacting in keyspace "+keyspaceName+", check server logs for more information");
-                break;
-        }
+        perform(out, keyspaceName,
+                () -> verify(extendedVerify, checkVersion, diskFailurePolicy, mutateRepairStatus, checkOwnsTokens, quick, keyspaceName, tableNames),
+                "verifying");
     }
 
-
-    public void upgradeSSTables(PrintStream out, String keyspaceName, boolean excludeCurrentVersion, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
+    public void recompressSSTables(PrintStream out, String keyspaceName, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
     {
         checkJobs(out, jobs);
-        switch (upgradeSSTables(keyspaceName, excludeCurrentVersion, jobs, tableNames))
+        perform(out, keyspaceName,
+                () -> recompressSSTables(keyspaceName, jobs, tableNames),
+                "recompressing sstables");
+    }
+
+    public void upgradeSSTables(PrintStream out, String keyspaceName, boolean excludeCurrentVersion, long maxSSTableTimestamp, int jobs, String... tableNames) throws IOException, ExecutionException, InterruptedException
+    {
+        checkJobs(out, jobs);
+        perform(out, keyspaceName,
+                () -> upgradeSSTables(keyspaceName, excludeCurrentVersion, maxSSTableTimestamp, jobs, tableNames),
+                "upgrading sstables");
+    }
+
+    private static interface Job
+    {
+        int perform() throws IOException, ExecutionException, InterruptedException;
+    }
+
+    private void perform(PrintStream out, String ks, Job job, String jobName) throws IOException, ExecutionException, InterruptedException
+    {
+        switch (job.perform())
         {
             case 1:
-                failed = true;
-                out.println("Aborted upgrading sstables for at least one table in keyspace " + keyspaceName + ", check server logs for more information.");
+                out.printf("Aborted %s for at least one table in keyspace %s, check server logs for more information.\n",
+                           jobName, ks);
                 break;
             case 2:
                 failed = true;
-                out.println("Failed marking some sstables compacting in keyspace "+keyspaceName+", check server logs for more information");
-                break;
+                out.printf("Failed marking some sstables compacting in keyspace %s, check server logs for more information.\n",
+                           ks);
         }
     }
 
@@ -422,6 +455,11 @@
         ssProxy.forceKeyspaceCompactionForTokenRange(keyspaceName, startToken, endToken, tableNames);
     }
 
+    public void forceKeyspaceCompactionForPartitionKey(String keyspaceName, String partitionKey, String... tableNames) throws InterruptedException, ExecutionException, IOException
+    {
+        ssProxy.forceKeyspaceCompactionForPartitionKey(keyspaceName, partitionKey, tableNames);
+    }
+
     public void forceKeyspaceFlush(String keyspaceName, String... tableNames) throws IOException, ExecutionException, InterruptedException
     {
         ssProxy.forceKeyspaceFlush(keyspaceName, tableNames);
@@ -491,16 +529,85 @@
         cacheService.invalidateCounterCache();
     }
 
+    public void invalidateCredentialsCache()
+    {
+        ccProxy.invalidate();
+    }
+
+    public void invalidateCredentialsCache(String roleName)
+    {
+        ccProxy.invalidateCredentials(roleName);
+    }
+
+    public void invalidateJmxPermissionsCache()
+    {
+        jpcProxy.invalidate();
+    }
+
+    public void invalidateJmxPermissionsCache(String roleName)
+    {
+        jpcProxy.invalidatePermissions(roleName);
+    }
+
     public void invalidateKeyCache()
     {
         cacheService.invalidateKeyCache();
     }
 
+    public void invalidateNetworkPermissionsCache()
+    {
+        npcProxy.invalidate();
+    }
+
+    public void invalidateNetworkPermissionsCache(String roleName)
+    {
+        npcProxy.invalidateNetworkPermissions(roleName);
+    }
+
+    public void invalidatePermissionsCache()
+    {
+        pcProxy.invalidate();
+    }
+
+    public void invalidatePermissionsCache(String roleName, String resourceName)
+    {
+        pcProxy.invalidatePermissions(roleName, resourceName);
+    }
+
+    public void invalidateRolesCache()
+    {
+        rcProxy.invalidate();
+    }
+
+    public void invalidateRolesCache(String roleName)
+    {
+        rcProxy.invalidateRoles(roleName);
+    }
+
     public void invalidateRowCache()
     {
         cacheService.invalidateRowCache();
     }
 
+    public AuthCacheMBean getAuthCacheMBean(String cacheName)
+    {
+        switch (cacheName)
+        {
+            case PasswordAuthenticator.CredentialsCacheMBean.CACHE_NAME:
+                return ccProxy;
+            case AuthorizationProxy.JmxPermissionsCacheMBean.CACHE_NAME:
+                return jpcProxy;
+            case NetworkPermissionsCacheMBean.CACHE_NAME:
+                return npcProxy;
+            case PermissionsCacheMBean.CACHE_NAME:
+                return pcProxy;
+            case RolesCacheMBean.CACHE_NAME:
+                return rcProxy;
+            default:
+                throw new IllegalArgumentException("Unknown cache name: " + cacheName);
+        }
+    }
+
     public void drain() throws IOException, InterruptedException, ExecutionException
     {
         ssProxy.drain();
@@ -623,6 +730,11 @@
         }
     }
 
+    public Map<String, String> getHostIdToEndpointWithPort()
+    {
+        return ssProxy.getHostIdToEndpointWithPort();
+    }
+
     public String getLocalHostId()
     {
         return ssProxy.getLocalHostId();
@@ -722,9 +834,15 @@
         ssProxy.clearSnapshot(tag, keyspaces);
     }
 
+    public Map<String, TabularData> getSnapshotDetails(Map<String, String> options)
+    {
+        return ssProxy.getSnapshotDetails(options);
+    }
+
+    @Deprecated
     public Map<String, TabularData> getSnapshotDetails()
     {
-        return ssProxy.getSnapshotDetails();
+        return getSnapshotDetails(ImmutableMap.of());
     }
 
     public long trueSnapshotsSize()
@@ -1071,6 +1189,11 @@
         hsProxy.deleteAllHints();
     }
 
+    public List<Map<String, String>> listPendingHints()
+    {
+        return hsProxy.getPendingHints();
+    }
+
     public void refreshSizeEstimates()
     {
         try
@@ -1123,16 +1246,37 @@
         return ssProxy.isInitialized();
     }
 
+    public void setColumnIndexSize(int columnIndexSizeInKiB)
+    {
+        ssProxy.setColumnIndexSize(columnIndexSizeInKiB);
+    }
+
+    public int getColumnIndexSizeInKB()
+    {
+        return ssProxy.getColumnIndexSizeInKiB();
+    }
+
     public void setCompactionThroughput(int value)
     {
         ssProxy.setCompactionThroughputMbPerSec(value);
     }
 
+    @Deprecated
     public int getCompactionThroughput()
     {
         return ssProxy.getCompactionThroughputMbPerSec();
     }
 
+    public double getCompactionThroughputMebibytesAsDouble()
+    {
+        return ssProxy.getCompactionThroughtputMibPerSecAsDouble();
+    }
+
+    public long getCompactionThroughputBytes()
+    {
+        return ssProxy.getCompactionThroughtputBytesPerSec();
+    }
+
     public void setBatchlogReplayThrottle(int value)
     {
         ssProxy.setBatchlogReplayThrottleInKB(value);
@@ -1202,14 +1346,46 @@
         }
     }
 
+    @Deprecated
     public int getStreamThroughput()
     {
-        return ssProxy.getStreamThroughputMbPerSec();
+        return ssProxy.getStreamThroughputMbitPerSec();
     }
 
+    public double getStreamThroughputAsDouble()
+    {
+        return ssProxy.getStreamThroughputMbitPerSecAsDouble();
+    }
+
+    @Deprecated
     public int getInterDCStreamThroughput()
     {
-        return ssProxy.getInterDCStreamThroughputMbPerSec();
+        return ssProxy.getInterDCStreamThroughputMbitPerSec();
+    }
+
+    public double getInterDCStreamThroughputAsDouble()
+    {
+        return ssProxy.getInterDCStreamThroughputMbitPerSecAsDouble();
+    }
+
+    public double getStreamThroughputMibAsDouble()
+    {
+        return ssProxy.getStreamThroughputMebibytesPerSecAsDouble();
+    }
+
+    public double getInterDCStreamThroughputMibAsDouble()
+    {
+        return ssProxy.getInterDCStreamThroughputMebibytesPerSecAsDouble();
+    }
+
+    public double getEntireSSTableStreamThroughput()
+    {
+        return ssProxy.getEntireSSTableStreamThroughputMebibytesPerSecAsDouble();
+    }
+
+    public double getEntireSSTableInterDCStreamThroughput()
+    {
+        return ssProxy.getEntireSSTableInterDCStreamThroughputMebibytesPerSecAsDouble();
     }
 
     public double getTraceProbability()
@@ -1243,9 +1419,22 @@
         ssProxy.rebuildSecondaryIndex(ksName, cfName, idxNames);
     }
 
+    public Map<String, String> getSimpleStatesWithPort()
+    {
+        return fdProxy.getSimpleStatesWithPort();
+    }
+
     public String getGossipInfo(boolean withPort)
     {
-        return withPort ? fdProxy.getAllEndpointStatesWithPort() : fdProxy.getAllEndpointStates();
+        return getGossipInfo(withPort, false);
+    }
+
+    public String getGossipInfo(boolean withPort, boolean resolveIp)
+    {
+        if (resolveIp)
+            return withPort ? fdProxy.getAllEndpointStatesWithPortAndResolveIp() : fdProxy.getAllEndpointStatesWithResolveIp();
+        else
+            return withPort ? fdProxy.getAllEndpointStatesWithPort() : fdProxy.getAllEndpointStates();
     }
 
     public void stop(String string)
@@ -1302,12 +1491,32 @@
 
     public void setStreamThroughput(int value)
     {
-        ssProxy.setStreamThroughputMbPerSec(value);
+        ssProxy.setStreamThroughputMbitPerSec(value);
+    }
+
+    public void setStreamThroughputMiB(int value)
+    {
+        ssProxy.setStreamThroughputMebibytesPerSec(value);
     }
 
     public void setInterDCStreamThroughput(int value)
     {
-        ssProxy.setInterDCStreamThroughputMbPerSec(value);
+        ssProxy.setInterDCStreamThroughputMbitPerSec(value);
+    }
+
+    public void setInterDCStreamThroughputMiB(int value)
+    {
+        ssProxy.setInterDCStreamThroughputMebibytesPerSec(value);
+    }
+
+    public void setEntireSSTableStreamThroughput(int value)
+    {
+        ssProxy.setEntireSSTableStreamThroughputMebibytesPerSec(value);
+    }
+
+    public void setEntireSSTableInterDCStreamThroughput(int value)
+    {
+        ssProxy.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(value);
     }
 
     public void setTraceProbability(double value)
@@ -1859,16 +2068,26 @@
         ssProxy.disableAuditLog();
     }
 
-    public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces ,String excludedKeyspaces ,String includedCategories ,String excludedCategories ,String includedUsers ,String excludedUsers)
+    public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces, String excludedKeyspaces,
+                               String includedCategories, String excludedCategories, String includedUsers, String excludedUsers)
     {
         ssProxy.enableAuditLog(loggerName, parameters, includedKeyspaces, excludedKeyspaces, includedCategories, excludedCategories, includedUsers, excludedUsers);
     }
 
-    public void enableAuditLog(String loggerName, String includedKeyspaces ,String excludedKeyspaces ,String includedCategories ,String excludedCategories ,String includedUsers ,String excludedUsers)
+    public void enableAuditLog(String loggerName, String includedKeyspaces, String excludedKeyspaces, String includedCategories,
+                               String excludedCategories, String includedUsers, String excludedUsers)
     {
         this.enableAuditLog(loggerName, Collections.emptyMap(), includedKeyspaces, excludedKeyspaces, includedCategories, excludedCategories, includedUsers, excludedUsers);
     }
 
+    public void enableAuditLog(String loggerName, Map<String, String> parameters, String includedKeyspaces, String excludedKeyspaces, String includedCategories, String excludedCategories,
+                               String includedUsers, String excludedUsers, Integer maxArchiveRetries, Boolean block, String rollCycle,
+                               Long maxLogSize, Integer maxQueueWeight, String archiveCommand)
+    {
+        ssProxy.enableAuditLog(loggerName, parameters, includedKeyspaces, excludedKeyspaces, includedCategories, excludedCategories, includedUsers, excludedUsers,
+                               maxArchiveRetries, block, rollCycle, maxLogSize, maxQueueWeight, archiveCommand);
+    }
+
     public void enableOldProtocolVersions()
     {
         ssProxy.enableNativeTransportOldProtocolVersions();
@@ -1903,6 +2122,21 @@
     {
         return FullQueryLoggerOptionsCompositeData.fromCompositeData(ssProxy.getFullQueryLoggerOptions());
     }
+
+    public AuditLogOptions getAuditLogOptions()
+    {
+        return AuditLogOptionsCompositeData.fromCompositeData(almProxy.getAuditLogOptionsData());
+    }
+
+    public void setDefaultKeyspaceReplicationFactor(int value)
+    {
+        ssProxy.setDefaultKeyspaceReplicationFactor(value);
+    }
+
+    public int getDefaultKeyspaceReplicationFactor()
+    {
+        return ssProxy.getDefaultKeyspaceReplicationFactor();
+    }
 }
 
 class ColumnFamilyStoreMBeanIterator implements Iterator<Map.Entry<String, ColumnFamilyStoreMBean>>
diff --git a/src/java/org/apache/cassandra/tools/NodeTool.java b/src/java/org/apache/cassandra/tools/NodeTool.java
index b796e02..8d87c88 100644
--- a/src/java/org/apache/cassandra/tools/NodeTool.java
+++ b/src/java/org/apache/cassandra/tools/NodeTool.java
@@ -22,18 +22,18 @@
 import static com.google.common.collect.Lists.newArrayList;
 import static java.lang.Integer.parseInt;
 import static java.lang.String.format;
+import static org.apache.cassandra.io.util.File.WriteMode.APPEND;
 import static org.apache.commons.lang3.ArrayUtils.EMPTY_STRING_ARRAY;
 import static org.apache.commons.lang3.StringUtils.EMPTY;
 import static org.apache.commons.lang3.StringUtils.isEmpty;
 import static org.apache.commons.lang3.StringUtils.isNotEmpty;
 
 import java.io.Console;
-import java.io.File;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileWriter;
 import java.io.FileNotFoundException;
-import java.io.FileWriter;
 import java.io.IOError;
 import java.io.IOException;
-import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
@@ -51,7 +51,6 @@
 import org.apache.cassandra.locator.EndpointSnitchInfoMBean;
 import org.apache.cassandra.tools.nodetool.*;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.tools.nodetool.Sjk;
 
 import com.google.common.collect.Maps;
 
@@ -93,126 +92,140 @@
     public int execute(String... args)
     {
         List<Class<? extends NodeToolCmdRunnable>> commands = newArrayList(
+                Assassinate.class,
                 CassHelp.class,
-                Info.class,
-                Ring.class,
-                NetStats.class,
-                CfStats.class,
-                TableStats.class,
                 CfHistograms.class,
-                TableHistograms.class,
+                CfStats.class,
                 Cleanup.class,
                 ClearSnapshot.class,
                 ClientStats.class,
                 Compact.class,
-                Scrub.class,
-                Verify.class,
-                Flush.class,
-                UpgradeSSTable.class,
-                GarbageCollect.class,
-                DisableAutoCompaction.class,
-                EnableAutoCompaction.class,
-                CompactionStats.class,
                 CompactionHistory.class,
+                CompactionStats.class,
+                DataPaths.class,
                 Decommission.class,
                 DescribeCluster.class,
+                DescribeRing.class,
+                DisableAuditLog.class,
+                DisableAutoCompaction.class,
+                DisableBackup.class,
                 DisableBinary.class,
-                EnableBinary.class,
-                EnableGossip.class,
-                DisableGossip.class,
-                EnableHandoff.class,
-                EnableFullQueryLog.class,
                 DisableFullQueryLog.class,
+                DisableGossip.class,
+                DisableHandoff.class,
+                DisableHintsForDC.class,
+                DisableOldProtocolVersions.class,
+                Drain.class,
+                EnableAuditLog.class,
+                EnableAutoCompaction.class,
+                EnableBackup.class,
+                EnableBinary.class,
+                EnableFullQueryLog.class,
+                EnableGossip.class,
+                EnableHandoff.class,
+                EnableHintsForDC.class,
+                EnableOldProtocolVersions.class,
+                FailureDetectorInfo.class,
+                Flush.class,
+                GarbageCollect.class,
                 GcStats.class,
+                GetAuditLog.class,
+                GetAuthCacheConfig.class,
                 GetBatchlogReplayTrottle.class,
+                GetColumnIndexSize.class,
                 GetCompactionThreshold.class,
                 GetCompactionThroughput.class,
                 GetConcurrency.class,
-                GetFullQueryLog.class,
-                GetTimeout.class,
-                GetStreamThroughput.class,
-                GetTraceProbability.class,
-                GetInterDCStreamThroughput.class,
+                GetConcurrentCompactors.class,
+                GetConcurrentViewBuilders.class,
+                GetDefaultKeyspaceRF.class,
                 GetEndpoints.class,
-                GetSeeds.class,
-                GetSSTables.class,
+                GetFullQueryLog.class,
+                GetInterDCStreamThroughput.class,
+                GetLoggingLevels.class,
                 GetMaxHintWindow.class,
+                GetSSTables.class,
+                GetSeeds.class,
+                GetSnapshotThrottle.class,
+                GetStreamThroughput.class,
+                GetTimeout.class,
+                GetTraceProbability.class,
                 GossipInfo.class,
                 Import.class,
-                InvalidateKeyCache.class,
-                InvalidateRowCache.class,
+                Info.class,
                 InvalidateCounterCache.class,
+                InvalidateCredentialsCache.class,
+                InvalidateJmxPermissionsCache.class,
+                InvalidateKeyCache.class,
+                InvalidateNetworkPermissionsCache.class,
+                InvalidatePermissionsCache.class,
+                InvalidateRolesCache.class,
+                InvalidateRowCache.class,
                 Join.class,
+                ListPendingHints.class,
+                ListSnapshots.class,
                 Move.class,
+                NetStats.class,
                 PauseHandoff.class,
-                ResumeHandoff.class,
                 ProfileLoad.class,
                 ProxyHistograms.class,
+                RangeKeySample.class,
                 Rebuild.class,
+                RebuildIndex.class,
+                RecompressSSTables.class,
                 Refresh.class,
-                RemoveNode.class,
-                Assassinate.class,
+                RefreshSizeEstimates.class,
+                ReloadLocalSchema.class,
                 ReloadSeeds.class,
-                ResetFullQueryLog.class,
+                ReloadSslCertificates.class,
+                ReloadTriggers.class,
+                RelocateSSTables.class,
+                RemoveNode.class,
                 Repair.class,
                 ReplayBatchlog.class,
-                SetCacheCapacity.class,
-                SetConcurrency.class,
-                SetHintedHandoffThrottleInKB.class,
+                ResetFullQueryLog.class,
+                ResetLocalSchema.class,
+                ResumeHandoff.class,
+                Ring.class,
+                Scrub.class,
+                SetAuthCacheConfig.class,
                 SetBatchlogReplayThrottle.class,
+                SetCacheCapacity.class,
+                SetCacheKeysToSave.class,
+                SetColumnIndexSize.class,
                 SetCompactionThreshold.class,
                 SetCompactionThroughput.class,
-                GetConcurrentCompactors.class,
-                SetConcurrentCompactors.class,
-                GetConcurrentViewBuilders.class,
-                SetConcurrentViewBuilders.class,
                 SetConcurrency.class,
-                SetTimeout.class,
-                SetStreamThroughput.class,
+                SetConcurrentCompactors.class,
+                SetConcurrentViewBuilders.class,
+                SetDefaultKeyspaceRF.class,
+                SetHintedHandoffThrottleInKB.class,
                 SetInterDCStreamThroughput.class,
-                SetTraceProbability.class,
+                SetLoggingLevel.class,
                 SetMaxHintWindow.class,
-                Snapshot.class,
-                ListSnapshots.class,
-                GetSnapshotThrottle.class,
                 SetSnapshotThrottle.class,
+                SetStreamThroughput.class,
+                SetTimeout.class,
+                SetTraceProbability.class,
+                Sjk.class,
+                Snapshot.class,
                 Status.class,
+                StatusAutoCompaction.class,
+                StatusBackup.class,
                 StatusBinary.class,
                 StatusGossip.class,
-                StatusBackup.class,
                 StatusHandoff.class,
-                StatusAutoCompaction.class,
                 Stop.class,
                 StopDaemon.class,
-                Version.class,
-                DescribeRing.class,
-                RebuildIndex.class,
-                RangeKeySample.class,
-                EnableBackup.class,
-                DisableBackup.class,
-                ResetLocalSchema.class,
-                ReloadLocalSchema.class,
-                ReloadTriggers.class,
-                SetCacheKeysToSave.class,
-                DisableHandoff.class,
-                Drain.class,
-                TruncateHints.class,
-                TpStats.class,
+                TableHistograms.class,
+                TableStats.class,
                 TopPartitions.class,
-                SetLoggingLevel.class,
-                GetLoggingLevels.class,
-                Sjk.class,
-                DisableHintsForDC.class,
-                EnableHintsForDC.class,
-                FailureDetectorInfo.class,
-                RefreshSizeEstimates.class,
-                RelocateSSTables.class,
-                ViewBuildStatus.class,
-                ReloadSslCertificates.class,
-                EnableAuditLog.class,
-                DisableAuditLog.class,
-                EnableOldProtocolVersions.class,
-                DisableOldProtocolVersions.class
+                TpStats.class,
+                TruncateHints.class,
+                UpgradeSSTable.class,
+                Verify.class,
+                Version.class,
+                ViewBuildStatus.class
         );
 
         Cli.CliBuilder<NodeToolCmdRunnable> builder = Cli.builder("nodetool");
@@ -274,7 +287,7 @@
         String cmdLine = Joiner.on(" ").skipNulls().join(args);
         cmdLine = cmdLine.replaceFirst("(?<=(-pw|--password))\\s+\\S+", " <hidden>");
 
-        try (FileWriter writer = new FileWriter(new File(FBUtilities.getToolsOutputDirectory(), HISTORYFILE), true))
+        try (FileWriter writer = new File(FBUtilities.getToolsOutputDirectory(), HISTORYFILE).newWriter(APPEND))
         {
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
             writer.append(sdf.format(new Date())).append(": ").append(cmdLine).append(System.lineSeparator());
@@ -329,7 +342,7 @@
         @Option(type = OptionType.GLOBAL, name = {"-pwf", "--password-file"}, description = "Path to the JMX password file")
         private String passwordFilePath = EMPTY;
 
-		@Option(type = OptionType.GLOBAL, name = { "-pp", "--print-port"}, description = "Operate in 4.0 mode with hosts disambiguated by port number", arity = 0)
+        @Option(type = OptionType.GLOBAL, name = { "-pp", "--print-port"}, description = "Operate in 4.0 mode with hosts disambiguated by port number", arity = 0)
         protected boolean printPort = false;
 
         private INodeProbeFactory nodeProbeFactory;
@@ -370,7 +383,7 @@
             String password = EMPTY;
 
             File passwordFile = new File(passwordFilePath);
-            try (Scanner scanner = new Scanner(passwordFile).useDelimiter("\\s+"))
+            try (Scanner scanner = new Scanner(passwordFile.toJavaIOFile()).useDelimiter("\\s+"))
             {
                 while (scanner.hasNextLine())
                 {
@@ -385,7 +398,8 @@
                     }
                     scanner.nextLine();
                 }
-            } catch (FileNotFoundException e)
+            }
+            catch (FileNotFoundException e)
             {
                 throw new RuntimeException(e);
             }
@@ -472,29 +486,6 @@
         }
     }
 
-    public static SortedMap<String, SetHostStat> getOwnershipByDc(NodeProbe probe, boolean resolveIp,
-                                                                  Map<String, String> tokenToEndpoint,
-                                                                  Map<InetAddress, Float> ownerships)
-    {
-        SortedMap<String, SetHostStat> ownershipByDc = Maps.newTreeMap();
-        EndpointSnitchInfoMBean epSnitchInfo = probe.getEndpointSnitchInfoProxy();
-        try
-        {
-            for (Entry<String, String> tokenAndEndPoint : tokenToEndpoint.entrySet())
-            {
-                String dc = epSnitchInfo.getDatacenter(tokenAndEndPoint.getValue());
-                if (!ownershipByDc.containsKey(dc))
-                    ownershipByDc.put(dc, new SetHostStat(resolveIp));
-                ownershipByDc.get(dc).add(tokenAndEndPoint.getKey(), tokenAndEndPoint.getValue(), ownerships);
-            }
-        }
-        catch (UnknownHostException e)
-        {
-            throw new RuntimeException(e);
-        }
-        return ownershipByDc;
-    }
-
     public static SortedMap<String, SetHostStatWithPort> getOwnershipByDcWithPort(NodeProbe probe, boolean resolveIp,
                                                                   Map<String, String> tokenToEndpoint,
                                                                   Map<String, Float> ownerships)
diff --git a/src/java/org/apache/cassandra/tools/RepairRunner.java b/src/java/org/apache/cassandra/tools/RepairRunner.java
index 593bc26..cd09c57 100644
--- a/src/java/org/apache/cassandra/tools/RepairRunner.java
+++ b/src/java/org/apache/cassandra/tools/RepairRunner.java
@@ -22,19 +22,23 @@
 import java.text.SimpleDateFormat;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Condition;
 
-import com.google.common.base.Throwables;
-
-import org.apache.cassandra.repair.messages.RepairOption;
-import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.StorageServiceMBean;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.concurrent.Condition;
+
 import org.apache.cassandra.utils.progress.ProgressEvent;
 import org.apache.cassandra.utils.progress.ProgressEventType;
 import org.apache.cassandra.utils.progress.jmx.JMXNotificationProgressListener;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
+import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus.FAILED;
+import static org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus.valueOf;
+import static org.apache.cassandra.tools.NodeProbe.JMX_NOTIFICATION_POLL_INTERVAL_SECONDS;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+import static org.apache.cassandra.utils.progress.ProgressEventType.*;
+
 public class RepairRunner extends JMXNotificationProgressListener
 {
     private final SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS");
@@ -43,7 +47,7 @@
     private final StorageServiceMBean ssProxy;
     private final String keyspace;
     private final Map<String, String> options;
-    private final SimpleCondition condition = new SimpleCondition();
+    private final Condition condition = newOneTimeCondition();
 
     private int cmd;
     private volatile Exception error;
@@ -67,10 +71,10 @@
         }
         else
         {
-            while (!condition.await(NodeProbe.JMX_NOTIFICATION_POLL_INTERVAL_SECONDS, TimeUnit.SECONDS))
+            while (!condition.await(JMX_NOTIFICATION_POLL_INTERVAL_SECONDS, SECONDS))
             {
                 queryForCompletedRepair(String.format("After waiting for poll interval of %s seconds",
-                                                      NodeProbe.JMX_NOTIFICATION_POLL_INTERVAL_SECONDS));
+                                                      JMX_NOTIFICATION_POLL_INTERVAL_SECONDS));
             }
             Exception error = this.error;
             if (error == null)
@@ -123,18 +127,18 @@
     {
         ProgressEventType type = event.getType();
         String message = event.getMessage();
-        if (type == ProgressEventType.PROGRESS)
+        if (type == PROGRESS)
         {
             message = message + " (progress: " + (int) event.getProgressPercentage() + "%)";
         }
         printMessage(message);
-        if (type == ProgressEventType.ERROR)
+        if (type == ERROR)
         {
             error = new RuntimeException(String.format("Repair job has failed with the error message: %s. " +
                                                        "Check the logs on the repair participants for further details",
                                                        message));
         }
-        if (type == ProgressEventType.COMPLETE)
+        if (type == COMPLETE)
         {
             condition.signalAll();
         }
@@ -153,7 +157,7 @@
         }
         else
         {
-            ActiveRepairService.ParentRepairStatus parentRepairStatus = ActiveRepairService.ParentRepairStatus.valueOf(status.get(0));
+            ParentRepairStatus parentRepairStatus = valueOf(status.get(0));
             List<String> messages = status.subList(1, status.size());
             switch (parentRepairStatus)
             {
@@ -162,7 +166,7 @@
                     printMessage(String.format("%s %s discovered repair %s.",
                                               triggeringCondition,
                                               queriedString, parentRepairStatus.name().toLowerCase()));
-                    if (parentRepairStatus == ActiveRepairService.ParentRepairStatus.FAILED)
+                    if (parentRepairStatus == FAILED)
                     {
                         error = new IOException(messages.get(0));
                     }
@@ -189,6 +193,6 @@
 
     private void printMessage(String message)
     {
-        out.println(String.format("[%s] %s", this.format.format(System.currentTimeMillis()), message));
+        out.println(String.format("[%s] %s", this.format.format(currentTimeMillis()), message));
     }
 }
diff --git a/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java b/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java
index 56c57d9..f5d24ed 100644
--- a/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java
+++ b/src/java/org/apache/cassandra/tools/SSTableExpiredBlockers.java
@@ -35,6 +35,8 @@
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * During compaction we can drop entire sstables if they only contain expired tombstones and if it is guaranteed
  * to not cover anything in other sstables. An expired sstable can be blocked from getting dropped if its newest
@@ -58,7 +60,7 @@
 
         String keyspace = args[args.length - 2];
         String columnfamily = args[args.length - 1];
-        Schema.instance.loadFromDisk(false);
+        Schema.instance.loadFromDisk();
 
         TableMetadata metadata = Schema.instance.validateTable(keyspace, columnfamily);
 
@@ -87,7 +89,7 @@
             System.exit(1);
         }
 
-        int gcBefore = (int)(System.currentTimeMillis()/1000) - metadata.params.gcGraceSeconds;
+        int gcBefore = (int)(currentTimeMillis() / 1000) - metadata.params.gcGraceSeconds;
         Multimap<SSTableReader, SSTableReader> blockers = checkForExpiredSSTableBlockers(sstables, gcBefore);
         for (SSTableReader blocker : blockers.keySet())
         {
diff --git a/src/java/org/apache/cassandra/tools/SSTableExport.java b/src/java/org/apache/cassandra/tools/SSTableExport.java
index 5be67d7..771380b 100644
--- a/src/java/org/apache/cassandra/tools/SSTableExport.java
+++ b/src/java/org/apache/cassandra/tools/SSTableExport.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -26,6 +25,7 @@
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
@@ -135,7 +135,7 @@
             printUsage();
             System.exit(1);
         }
-        String ssTableFileName = new File(cmd.getArgs()[0]).getAbsolutePath();
+        String ssTableFileName = new File(cmd.getArgs()[0]).absolutePath();
 
         if (!new File(ssTableFileName).exists())
         {
@@ -217,7 +217,6 @@
         }
         catch (IOException e)
         {
-            // throwing exception outside main with broken pipe causes windows cmd to hang
             e.printStackTrace(System.err);
         }
 
diff --git a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java
index 4340e8e..9618d362 100644
--- a/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java
+++ b/src/java/org/apache/cassandra/tools/SSTableLevelResetter.java
@@ -65,7 +65,7 @@
         try
         {
             // load keyspace descriptions.
-            Schema.instance.loadFromDisk(false);
+            Schema.instance.loadFromDisk();
 
             String keyspaceName = args[1];
             String columnfamily = args[2];
diff --git a/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java b/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java
old mode 100755
new mode 100644
index bad7b13..c4bef35
--- a/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java
+++ b/src/java/org/apache/cassandra/tools/SSTableMetadataViewer.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.tools;
 
 import java.io.DataInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.io.PrintWriter;
@@ -62,6 +61,7 @@
 import org.apache.cassandra.io.sstable.metadata.MetadataType;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.io.sstable.metadata.ValidationMetadata;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.tools.Util.TermHistogram;
@@ -72,6 +72,7 @@
 import static org.apache.cassandra.tools.Util.CYAN;
 import static org.apache.cassandra.tools.Util.RESET;
 import static org.apache.cassandra.tools.Util.WHITE;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.apache.commons.lang3.time.DurationFormatUtils.formatDurationWords;
 
 /**
@@ -232,9 +233,9 @@
                                     cellCount++;
                                     double percentComplete = Math.min(1.0, cellCount / totalCells);
                                     if (lastPercent != (int) (percentComplete * 100) &&
-                                        (System.currentTimeMillis() - lastPercentTime) > 1000)
+                                        (currentTimeMillis() - lastPercentTime) > 1000)
                                     {
-                                        lastPercentTime = System.currentTimeMillis();
+                                        lastPercentTime = currentTimeMillis();
                                         lastPercent = (int) (percentComplete * 100);
                                         if (color)
                                             out.printf("\r%sAnalyzing SSTable...  %s%s %s(%%%s)", BLUE, CYAN,
@@ -371,7 +372,7 @@
                 field("maxClusteringValues", Arrays.toString(maxValues));
             }
             field("Estimated droppable tombstones",
-                  stats.getEstimatedDroppableTombstoneRatio((int) (System.currentTimeMillis() / 1000) - this.gc));
+                  stats.getEstimatedDroppableTombstoneRatio((int) (currentTimeMillis() / 1000) - this.gc));
             field("SSTable Level", stats.sstableLevel);
             field("Repaired at", stats.repairedAt, toDateString(stats.repairedAt, TimeUnit.MILLISECONDS));
             field("Originating host id", stats.originatingHostId);
@@ -544,7 +545,7 @@
             File sstable = new File(fname);
             if (sstable.exists())
             {
-                metawriter.printSStableMetadata(sstable.getAbsolutePath(), fullScan);
+                metawriter.printSStableMetadata(sstable.absolutePath(), fullScan);
             }
             else
             {
diff --git a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java
index 79fec81..e4e343f 100644
--- a/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java
+++ b/src/java/org/apache/cassandra/tools/SSTableOfflineRelevel.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.util.ArrayList;
@@ -35,6 +34,7 @@
 import com.google.common.collect.SetMultimap;
 
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -91,7 +91,7 @@
         boolean dryRun = args[0].equals("--dry-run");
         String keyspace = args[args.length - 2];
         String columnfamily = args[args.length - 1];
-        Schema.instance.loadFromDisk(false);
+        Schema.instance.loadFromDisk();
 
         if (Schema.instance.getTableMetadataRef(keyspace, columnfamily) == null)
             throw new IllegalArgumentException(String.format("Unknown keyspace/table %s.%s",
diff --git a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java
index 31d80fa..1289e7e 100644
--- a/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java
+++ b/src/java/org/apache/cassandra/tools/SSTableRepairedAtSetter.java
@@ -17,10 +17,11 @@
  */
 package org.apache.cassandra.tools;
 
-import java.io.*;
+
+import java.io.IOException;
+import java.io.PrintStream;
 import java.nio.charset.Charset;
 import java.nio.file.Files;
-import java.nio.file.Paths;
 import java.nio.file.attribute.FileTime;
 import java.util.Arrays;
 import java.util.List;
@@ -39,6 +40,8 @@
  * sstablerepairset --is-repaired -f <(find /var/lib/cassandra/data/.../ -iname "*Data.db*" -mtime +14)
  * }
  */
+import org.apache.cassandra.io.util.File;
+
 public class SSTableRepairedAtSetter
 {
     /**
@@ -69,7 +72,7 @@
         List<String> fileNames;
         if (args[2].equals("-f"))
         {
-            fileNames = Files.readAllLines(Paths.get(args[3]), Charset.defaultCharset());
+            fileNames = Files.readAllLines(File.getPath(args[3]), Charset.defaultCharset());
         }
         else
         {
diff --git a/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java b/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java
index cca48fc..4d2acd2 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneSSTableUtil.java
@@ -25,10 +25,10 @@
 import org.apache.cassandra.utils.OutputHandler;
 import org.apache.commons.cli.*;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.function.BiPredicate;
 
+import org.apache.cassandra.io.util.File;
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
 
 public class StandaloneSSTableUtil
@@ -48,7 +48,7 @@
         {
             // load keyspace descriptions.
             Util.initDatabaseDescriptor();
-            Schema.instance.loadFromDisk(false);
+            Schema.instance.loadFromDisk();
 
             TableMetadata metadata = Schema.instance.getTableMetadata(options.keyspaceName, options.cfName);
             if (metadata == null)
@@ -87,7 +87,7 @@
         for (File dir : directories.getCFDirectories())
         {
             for (File file : LifecycleTransaction.getFiles(dir.toPath(), getFilter(options), Directories.OnTxnErr.THROW))
-                handler.output(file.getCanonicalPath());
+                handler.output(file.canonicalPath());
         }
     }
 
diff --git a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
index bd71c64..4484b69 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneScrubber.java
@@ -18,8 +18,6 @@
  */
 package org.apache.cassandra.tools;
 
-import java.io.File;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
@@ -27,6 +25,7 @@
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.cli.CommandLine;
 import org.apache.commons.cli.CommandLineParser;
 import org.apache.commons.cli.GnuParser;
@@ -55,6 +54,8 @@
 import org.apache.cassandra.utils.OutputHandler;
 import org.apache.cassandra.utils.Pair;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class StandaloneScrubber
 {
     public static final String REINSERT_OVERFLOWED_TTL_OPTION_DESCRIPTION = "Rewrites rows with overflowed expiration date affected by CASSANDRA-14092 with " +
@@ -85,7 +86,7 @@
         try
         {
             // load keyspace descriptions.
-            Schema.instance.loadFromDisk(false);
+            Schema.instance.loadFromDisk();
 
             if (Schema.instance.getKeyspaceMetadata(options.keyspaceName) == null)
                 throw new IllegalArgumentException(String.format("Unknown keyspace %s", options.keyspaceName));
@@ -108,7 +109,7 @@
                                                                   options.keyspaceName,
                                                                   options.cfName));
 
-            String snapshotName = "pre-scrub-" + System.currentTimeMillis();
+            String snapshotName = "pre-scrub-" + currentTimeMillis();
 
             OutputHandler handler = new OutputHandler.SystemOutput(options.verbose, options.debug);
             Directories.SSTableLister lister = cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true);
@@ -125,7 +126,7 @@
                 listResult.add(Pair.create(descriptor, components));
 
                 File snapshotDirectory = Directories.getSnapshotDirectory(descriptor, snapshotName);
-                SSTableReader.createLinks(descriptor, components, snapshotDirectory.getPath());
+                SSTableReader.createLinks(descriptor, components, snapshotDirectory.path());
             }
             System.out.println(String.format("Pre-scrub sstables snapshotted into snapshot %s", snapshotName));
 
@@ -142,7 +143,7 @@
                     headerFixBuilder = headerFixBuilder.dryRun();
 
                 for (Pair<Descriptor, Set<Component>> p : listResult)
-                    headerFixBuilder.withPath(Paths.get(p.left.filenameFor(Component.DATA)));
+                    headerFixBuilder.withPath(File.getPath(p.left.filenameFor(Component.DATA)));
 
                 SSTableHeaderFix headerFix = headerFixBuilder.build();
                 try
@@ -260,7 +261,7 @@
     {
         if (strategyManager.getCompactionParams().klass().equals(LeveledCompactionStrategy.class))
         {
-            int maxSizeInMB = (int)((cfs.getCompactionStrategyManager().getMaxSSTableBytes()) / (1024L * 1024L));
+            int maxSizeInMiB = (int)((cfs.getCompactionStrategyManager().getMaxSSTableBytes()) / (1024L * 1024L));
             int fanOut = cfs.getCompactionStrategyManager().getLevelFanoutSize();
             for (AbstractStrategyHolder.GroupedSSTableContainer sstableGroup : strategyManager.groupSSTables(sstables))
             {
@@ -268,7 +269,7 @@
                 {
                     List<SSTableReader> groupSSTables = new ArrayList<>(sstableGroup.getGroup(i));
                     // creating the manifest makes sure the leveling is sane:
-                    LeveledManifest.create(cfs, maxSizeInMB, fanOut, groupSSTables);
+                    LeveledManifest.create(cfs, maxSizeInMiB, fanOut, groupSSTables);
                 }
             }
         }
diff --git a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
index e15e5bc..efadb56 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneSplitter.java
@@ -18,10 +18,10 @@
  */
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.commons.cli.*;
@@ -38,6 +38,7 @@
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
 import static org.apache.cassandra.tools.BulkLoader.CmdLineOptions;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class StandaloneSplitter
 {
@@ -60,7 +61,7 @@
         try
         {
             // load keyspace descriptions.
-            Schema.instance.loadFromDisk(false);
+            Schema.instance.loadFromDisk();
 
             String ksName = null;
             String cfName = null;
@@ -115,7 +116,7 @@
             // Do not load sstables since they might be broken
             Keyspace keyspace = Keyspace.openWithoutSSTables(ksName);
             ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfName);
-            String snapshotName = "pre-split-" + System.currentTimeMillis();
+            String snapshotName = "pre-split-" + currentTimeMillis();
 
             List<SSTableReader> sstables = new ArrayList<>();
             for (Map.Entry<Descriptor, Set<Component>> fn : parsedFilenames.entrySet())
@@ -132,7 +133,7 @@
 
                     if (options.snapshot) {
                         File snapshotDirectory = Directories.getSnapshotDirectory(sstable.descriptor, snapshotName);
-                        sstable.createLinks(snapshotDirectory.getPath());
+                        sstable.createLinks(snapshotDirectory.path());
                     }
 
                 }
diff --git a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
index e1b546b..a7c099c 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneUpgrader.java
@@ -57,7 +57,7 @@
         try
         {
             // load keyspace descriptions.
-            Schema.instance.loadFromDisk(false);
+            Schema.instance.loadFromDisk();
 
             if (Schema.instance.getTableMetadataRef(options.keyspace, options.cf) == null)
                 throw new IllegalArgumentException(String.format("Unknown keyspace/table %s.%s",
diff --git a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
index df276bd..d7554dd 100644
--- a/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
+++ b/src/java/org/apache/cassandra/tools/StandaloneVerifier.java
@@ -62,11 +62,18 @@
     private static final String CHECK_VERSION = "check_version";
     private static final String MUTATE_REPAIR_STATUS = "mutate_repair_status";
     private static final String QUICK = "quick";
+    private static final String FORCE = "force";
     private static final String TOKEN_RANGE = "token_range";
 
     public static void main(String args[])
     {
         Options options = Options.parseArgs(args);
+        if (!options.force)
+        {
+            System.err.println("verify will not run without -f or --force. See CASSANDRA-17017 for details.");
+            Options.printUsage(Options.getCmdLineOptions());
+            System.exit(1);
+        }
         initDatabaseDescriptorForTool();
 
         System.out.println("sstableverify using the following options: " + options);
@@ -74,7 +81,7 @@
         try
         {
             // load keyspace descriptions.
-            Schema.instance.loadFromDisk(false);
+            Schema.instance.loadFromDisk();
 
             boolean hasFailed = false;
 
@@ -165,6 +172,7 @@
         public boolean checkVersion;
         public boolean mutateRepairStatus;
         public boolean quick;
+        public boolean force;
         public Collection<Range<Token>> tokens;
 
         private Options(String keyspaceName, String cfName)
@@ -190,8 +198,8 @@
                 String[] args = cmd.getArgs();
                 if (args.length != 2)
                 {
-                    String msg = args.length < 2 ? "Missing arguments" : "Too many arguments";
-                    System.err.println(msg);
+                    String prefix = args.length < 2 ? "Missing" : "Too many";
+                    System.err.println(prefix + " arguments");
                     printUsage(options);
                     System.exit(1);
                 }
@@ -207,6 +215,7 @@
                 opts.checkVersion = cmd.hasOption(CHECK_VERSION);
                 opts.mutateRepairStatus = cmd.hasOption(MUTATE_REPAIR_STATUS);
                 opts.quick = cmd.hasOption(QUICK);
+                opts.force = cmd.hasOption(FORCE);
 
                 if (cmd.hasOption(TOKEN_RANGE))
                 {
@@ -260,17 +269,24 @@
             options.addOption("c",  CHECK_VERSION,         "make sure sstables are the latest version");
             options.addOption("r",  MUTATE_REPAIR_STATUS,  "don't mutate repair status");
             options.addOption("q",  QUICK,                 "do a quick check, don't read all data");
+            options.addOption("f",  FORCE,                 "force verify - see CASSANDRA-17017");
             options.addOptionList("t", TOKEN_RANGE, "range", "long token range of the format left,right. This may be provided multiple times to define multiple different ranges");
             return options;
         }
 
         public static void printUsage(CmdLineOptions options)
         {
-            String usage = String.format("%s [options] <keyspace> <column_family>", TOOL_NAME);
+            String usage = String.format("%s [options] <keyspace> <column_family> force", TOOL_NAME);
             StringBuilder header = new StringBuilder();
             header.append("--\n");
             header.append("Verify the sstable for the provided table." );
             header.append("\n--\n");
+            header.append("NOTE: There are significant risks associated with using this tool; it likely doesn't do what " +
+                          "you expect and there are known edge cases. You must provide a -f or --force argument in " +
+                          "order to allow usage of the tool -> see CASSANDRA-9947 and CASSANDRA-17017 for known risks.\n");
+            header.append("https://issues.apache.org/jira/browse/CASSANDRA-9947\n");
+            header.append("https://issues.apache.org/jira/browse/CASSANDRA-17017");
+            header.append("\n--\n");
             header.append("Options are:");
             new HelpFormatter().printHelp(usage, header.toString(), options, "");
         }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Assassinate.java b/src/java/org/apache/cassandra/tools/nodetool/Assassinate.java
index a075ded..2639ec8 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Assassinate.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Assassinate.java
@@ -44,4 +44,4 @@
             throw new RuntimeException(e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/CfHistograms.java b/src/java/org/apache/cassandra/tools/nodetool/CfHistograms.java
index 8fdf803..6a06fd4 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/CfHistograms.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/CfHistograms.java
@@ -26,4 +26,4 @@
 @Deprecated
 public class CfHistograms extends TableHistograms
 {
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/CfStats.java b/src/java/org/apache/cassandra/tools/nodetool/CfStats.java
index 2d27ea0..42e2bc3 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/CfStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/CfStats.java
@@ -26,4 +26,4 @@
 @Deprecated
 public class CfStats extends TableStats
 {
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ClientStats.java b/src/java/org/apache/cassandra/tools/nodetool/ClientStats.java
index b9bf45e..7ed9b9d 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/ClientStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/ClientStats.java
@@ -44,6 +44,9 @@
     @Option(title = "clear_history", name = "--clear-history", description = "Clear the history of connected clients")
     private boolean clearConnectionHistory = false;
 
+    @Option(title = "list_connections_with_client_options", name = "--client-options", description = "Lists all connections and the client options")
+    private boolean clientOptions = false;
+
     @Override
     public void execute(NodeProbe probe)
     {
@@ -108,6 +111,32 @@
             }
         }
 
+        if (clientOptions)
+        {
+            List<Map<String, String>> clients = (List<Map<String, String>>) probe.getClientMetric("connections");
+            if (!clients.isEmpty())
+            {
+                TableBuilder table = new TableBuilder();
+                table.add("Address", "SSL", "Cipher", "Protocol", "Version", "User", "Keyspace", "Requests", "Driver-Name", "Driver-Version", "Client-Options");
+                for (Map<String, String> conn : clients)
+                {
+                    table.add(conn.get(ConnectedClient.ADDRESS),
+                              conn.get(ConnectedClient.SSL),
+                              conn.get(ConnectedClient.CIPHER),
+                              conn.get(ConnectedClient.PROTOCOL),
+                              conn.get(ConnectedClient.VERSION),
+                              conn.get(ConnectedClient.USER),
+                              conn.get(ConnectedClient.KEYSPACE),
+                              conn.get(ConnectedClient.REQUESTS),
+                              conn.get(ConnectedClient.DRIVER_NAME),
+                              conn.get(ConnectedClient.DRIVER_VERSION),
+                              conn.get(ConnectedClient.CLIENT_OPTIONS));
+                }
+                table.printTo(out);
+                out.println();
+            }
+        }
+
         Map<String, Integer> connectionsByUser = (Map<String, Integer>) probe.getClientMetric("connectedNativeClientsByUser");
         int total = connectionsByUser.values().stream().reduce(0, Integer::sum);
         out.println("Total connected clients: " + total);
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Compact.java b/src/java/org/apache/cassandra/tools/nodetool/Compact.java
index bf7f5f3..f5a83ed 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Compact.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Compact.java
@@ -47,11 +47,16 @@
     @Option(title = "end_token", name = {"-et", "--end-token"}, description = "Use -et to specify a token at which compaction range ends (inclusive)")
     private String endToken = EMPTY;
 
+    @Option(title = "partition_key", name = {"--partition"}, description = "String representation of the partition key")
+    private String partitionKey = EMPTY;
+
 
     @Override
     public void execute(NodeProbe probe)
     {
-        final boolean tokenProvided = !(startToken.isEmpty() && endToken.isEmpty());
+        final boolean startEndTokenProvided = !(startToken.isEmpty() && endToken.isEmpty());
+        final boolean partitionKeyProvided = !partitionKey.isEmpty();
+        final boolean tokenProvided = startEndTokenProvided || partitionKeyProvided;
         if (splitOutput && (userDefined || tokenProvided))
         {
             throw new RuntimeException("Invalid option combination: Can not use split-output here");
@@ -80,10 +85,14 @@
         {
             try
             {
-                if (tokenProvided)
+                if (startEndTokenProvided)
                 {
                     probe.forceKeyspaceCompactionForTokenRange(keyspace, startToken, endToken, tableNames);
                 }
+                else if (partitionKeyProvided)
+                {
+                    probe.forceKeyspaceCompactionForPartitionKey(keyspace, partitionKey, tableNames);
+                }
                 else
                 {
                     probe.forceKeyspaceCompaction(splitOutput, keyspace, tableNames);
@@ -94,4 +103,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
index 04dcc2b..799ef56 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/CompactionStats.java
@@ -44,6 +44,11 @@
             description = "Display bytes in human readable form, i.e. KiB, MiB, GiB, TiB")
     private boolean humanReadable = false;
 
+    @Option(title = "vtable_output",
+            name = {"-V", "--vtable"},
+            description = "Display fields matching vtable output")
+    private boolean vtableOutput = false;
+
     @Override
     public void execute(NodeProbe probe)
     {
@@ -70,17 +75,26 @@
             }
         }
         out.println();
-        reportCompactionTable(cm.getCompactions(), probe.getCompactionThroughput(), humanReadable, out);
+        reportCompactionTable(cm.getCompactions(), probe.getCompactionThroughputBytes(), humanReadable, vtableOutput, out);
     }
 
-    public static void reportCompactionTable(List<Map<String,String>> compactions, int compactionThroughput, boolean humanReadable, PrintStream out)
+    public static void reportCompactionTable(List<Map<String,String>> compactions, long compactionThroughputInBytes, boolean humanReadable, PrintStream out)
+    {
+        reportCompactionTable(compactions, compactionThroughputInBytes, humanReadable, false, out);
+    }
+
+    public static void reportCompactionTable(List<Map<String,String>> compactions, long compactionThroughputInBytes, boolean humanReadable, boolean vtableOutput, PrintStream out)
     {
         if (!compactions.isEmpty())
         {
             long remainingBytes = 0;
             TableBuilder table = new TableBuilder();
 
-            table.add("id", "compaction type", "keyspace", "table", "completed", "total", "unit", "progress");
+            if (vtableOutput)
+                table.add("keyspace", "table", "task id", "completion ratio", "kind", "progress", "sstables", "total", "unit");
+            else
+                table.add("id", "compaction type", "keyspace", "table", "completed", "total", "unit", "progress");
+
             for (Map<String, String> c : compactions)
             {
                 long total = Long.parseLong(c.get(CompactionInfo.TOTAL));
@@ -90,19 +104,24 @@
                 String columnFamily = c.get(CompactionInfo.COLUMNFAMILY);
                 String unit = c.get(CompactionInfo.UNIT);
                 boolean toFileSize = humanReadable && Unit.isFileSize(unit);
-                String completedStr = toFileSize ? FileUtils.stringifyFileSize(completed) : Long.toString(completed);
+                String[] tables = c.get(CompactionInfo.SSTABLES).split(",");
+                String progressStr = toFileSize ? FileUtils.stringifyFileSize(completed) : Long.toString(completed);
                 String totalStr = toFileSize ? FileUtils.stringifyFileSize(total) : Long.toString(total);
                 String percentComplete = total == 0 ? "n/a" : new DecimalFormat("0.00").format((double) completed / total * 100) + "%";
                 String id = c.get(CompactionInfo.COMPACTION_ID);
-                table.add(id, taskType, keyspace, columnFamily, completedStr, totalStr, unit, percentComplete);
+                if (vtableOutput)
+                    table.add(keyspace, columnFamily, id, percentComplete, taskType, progressStr, String.valueOf(tables.length), totalStr, unit);
+                else
+                    table.add(id, taskType, keyspace, columnFamily, progressStr, totalStr, unit, percentComplete);
+
                 remainingBytes += total - completed;
             }
             table.printTo(out);
 
             String remainingTime = "n/a";
-            if (compactionThroughput != 0)
+            if (compactionThroughputInBytes != 0)
             {
-                long remainingTimeInSecs = remainingBytes / (1024L * 1024L * compactionThroughput);
+                long remainingTimeInSecs = remainingBytes / compactionThroughputInBytes;
                 remainingTime = format("%dh%02dm%02ds", remainingTimeInSecs / 3600, (remainingTimeInSecs % 3600) / 60, (remainingTimeInSecs % 60));
             }
             out.printf("%25s%10s%n", "Active compaction remaining time : ", remainingTime);
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DataPaths.java b/src/java/org/apache/cassandra/tools/nodetool/DataPaths.java
new file mode 100644
index 0000000..10ae01e
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/DataPaths.java
@@ -0,0 +1,53 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+import org.apache.cassandra.tools.nodetool.stats.DataPathsHolder;
+import org.apache.cassandra.tools.nodetool.stats.DataPathsPrinter;
+import org.apache.cassandra.tools.nodetool.stats.StatsPrinter;
+
+@Command(name = "datapaths", description = "Print all directories where data of tables are stored")
+public class DataPaths extends NodeToolCmd
+{
+    @Arguments(usage = "[<keyspace.table>...]", description = "List of table (or keyspace) names")
+    private List<String> tableNames = new ArrayList<>();
+
+    @Option(title = "format", name = {"-F", "--format"}, description = "Output format (json, yaml)")
+    private String outputFormat = "";
+
+    @Override
+    protected void execute(NodeProbe probe)
+    {
+        if (!outputFormat.isEmpty() && !"json".equals(outputFormat) && !"yaml".equals(outputFormat))
+        {
+            throw new IllegalArgumentException("arguments for -F are yaml and json only.");
+        }
+
+        DataPathsHolder holder = new DataPathsHolder(probe, tableNames);
+        StatsPrinter<DataPathsHolder> printer = DataPathsPrinter.from(outputFormat);
+        printer.print(holder, probe.output().out);
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Decommission.java b/src/java/org/apache/cassandra/tools/nodetool/Decommission.java
index 0e58687..98b6d58 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Decommission.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Decommission.java
@@ -46,4 +46,4 @@
             throw new IllegalStateException("Unsupported operation: " + e.getMessage(), e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableAuditLog.java b/src/java/org/apache/cassandra/tools/nodetool/DisableAuditLog.java
index 35653ae..6d878a0 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableAuditLog.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableAuditLog.java
@@ -30,4 +30,4 @@
     {
         probe.disableAuditLog();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableAutoCompaction.java b/src/java/org/apache/cassandra/tools/nodetool/DisableAutoCompaction.java
index b9fc7d6..39a4c76 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableAutoCompaction.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableAutoCompaction.java
@@ -50,4 +50,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableBackup.java b/src/java/org/apache/cassandra/tools/nodetool/DisableBackup.java
index 4b0bfbe..4ee6340 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableBackup.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableBackup.java
@@ -30,4 +30,4 @@
     {
         probe.setIncrementalBackupsEnabled(false);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableBinary.java b/src/java/org/apache/cassandra/tools/nodetool/DisableBinary.java
index 463f2b0..79b9219 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableBinary.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableBinary.java
@@ -30,4 +30,4 @@
     {
         probe.stopNativeTransport();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableFullQueryLog.java b/src/java/org/apache/cassandra/tools/nodetool/DisableFullQueryLog.java
index 8820e5f..aa5d0b7 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableFullQueryLog.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableFullQueryLog.java
@@ -30,4 +30,4 @@
     {
         probe.stopFullQueryLogger();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableGossip.java b/src/java/org/apache/cassandra/tools/nodetool/DisableGossip.java
index 6f950bb..7b6c348 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableGossip.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableGossip.java
@@ -30,4 +30,4 @@
     {
         probe.stopGossiping();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableHandoff.java b/src/java/org/apache/cassandra/tools/nodetool/DisableHandoff.java
index d7ec35f..62465a3 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableHandoff.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableHandoff.java
@@ -30,4 +30,4 @@
     {
         probe.disableHintedHandoff();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableHintsForDC.java b/src/java/org/apache/cassandra/tools/nodetool/DisableHintsForDC.java
index d65c70b..3615a99 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableHintsForDC.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableHintsForDC.java
@@ -39,4 +39,4 @@
 
         probe.disableHintsForDC(args.get(0));
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/DisableOldProtocolVersions.java b/src/java/org/apache/cassandra/tools/nodetool/DisableOldProtocolVersions.java
index 2083062..8756471 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/DisableOldProtocolVersions.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/DisableOldProtocolVersions.java
@@ -30,4 +30,4 @@
     {
         probe.disableOldProtocolVersions();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Drain.java b/src/java/org/apache/cassandra/tools/nodetool/Drain.java
index eaa537a..a152057 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Drain.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Drain.java
@@ -39,4 +39,4 @@
             throw new RuntimeException("Error occurred during flushing", e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableAuditLog.java b/src/java/org/apache/cassandra/tools/nodetool/EnableAuditLog.java
index c71d210..cf9d05e 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableAuditLog.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableAuditLog.java
@@ -18,6 +18,8 @@
 
 package org.apache.cassandra.tools.nodetool;
 
+import java.util.Collections;
+
 import io.airlift.airline.Command;
 import io.airlift.airline.Option;
 import org.apache.cassandra.tools.NodeProbe;
@@ -47,9 +49,39 @@
     @Option(title = "excluded_users", name = { "--excluded-users" }, description = "Comma separated list of users to be excluded for audit log. If not set the value from cassandra.yaml will be used")
     private String excluded_users = null;
 
+    @Option(title = "roll_cycle", name = {"--roll-cycle"}, description = "How often to roll the log file (MINUTELY, HOURLY, DAILY).")
+    private String rollCycle = null;
+
+    @Option(title = "blocking", name = {"--blocking"}, description = "If the queue is full whether to block producers or drop samples [true|false].")
+    private String blocking = null;
+
+    @Option(title = "max_queue_weight", name = {"--max-queue-weight"}, description = "Maximum number of bytes of query data to queue to disk before blocking or dropping samples.")
+    private int maxQueueWeight = Integer.MIN_VALUE;
+
+    @Option(title = "max_log_size", name = {"--max-log-size"}, description = "How many bytes of log data to store before dropping segments. Might not be respected if a log file hasn't rolled so it can be deleted.")
+    private long maxLogSize = Long.MIN_VALUE;
+
+    @Option(title = "archive_command", name = {"--archive-command"}, description = "Command that will handle archiving rolled audit log files." +
+                                                                                   " Format is \"/path/to/script.sh %path\" where %path will be replaced with the file to archive" +
+                                                                                   " Enable this by setting the audit_logging_options.allow_nodetool_archive_command: true in the config.")
+
+    private String archiveCommand = null;
+
+    @Option(title = "archive_retries", name = {"--max-archive-retries"}, description = "Max number of archive retries.")
+    private int archiveRetries = Integer.MIN_VALUE;
+
     @Override
     public void execute(NodeProbe probe)
     {
-        probe.enableAuditLog(logger, included_keyspaces, excluded_keyspaces, included_categories, excluded_categories, included_users, excluded_users);
+        Boolean bblocking = null;
+        if (blocking != null)
+        {
+            if (!blocking.equalsIgnoreCase("TRUE") && !blocking.equalsIgnoreCase("FALSE"))
+                throw new IllegalArgumentException("Invalid [" + blocking + "]. Blocking only accepts 'true' or 'false'.");
+            else
+                bblocking = Boolean.parseBoolean(blocking);
+        }
+        probe.enableAuditLog(logger, Collections.EMPTY_MAP, included_keyspaces, excluded_keyspaces, included_categories, excluded_categories, included_users, excluded_users,
+                             archiveRetries, bblocking, rollCycle, maxLogSize, maxQueueWeight, archiveCommand);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableAutoCompaction.java b/src/java/org/apache/cassandra/tools/nodetool/EnableAutoCompaction.java
index 795ab13..f8b98ff 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableAutoCompaction.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableAutoCompaction.java
@@ -50,4 +50,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableBackup.java b/src/java/org/apache/cassandra/tools/nodetool/EnableBackup.java
index d1773d9..7ebad8a 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableBackup.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableBackup.java
@@ -30,4 +30,4 @@
     {
         probe.setIncrementalBackupsEnabled(true);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableBinary.java b/src/java/org/apache/cassandra/tools/nodetool/EnableBinary.java
index 506945f..2e37e6f 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableBinary.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableBinary.java
@@ -30,4 +30,4 @@
     {
         probe.startNativeTransport();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableFullQueryLog.java b/src/java/org/apache/cassandra/tools/nodetool/EnableFullQueryLog.java
index d78d5ae..511730d 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableFullQueryLog.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableFullQueryLog.java
@@ -62,4 +62,4 @@
         }
         probe.enableFullQueryLogger(path, rollCycle, bblocking, maxQueueWeight, maxLogSize, archiveCommand, archiveRetries);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableGossip.java b/src/java/org/apache/cassandra/tools/nodetool/EnableGossip.java
index 900c427..3433c3e 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableGossip.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableGossip.java
@@ -30,4 +30,4 @@
     {
         probe.startGossiping();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableHandoff.java b/src/java/org/apache/cassandra/tools/nodetool/EnableHandoff.java
index bccf7e7..be64e12 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableHandoff.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableHandoff.java
@@ -30,4 +30,4 @@
     {
         probe.enableHintedHandoff();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/EnableOldProtocolVersions.java b/src/java/org/apache/cassandra/tools/nodetool/EnableOldProtocolVersions.java
index f6d5be5..06c9f8d 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/EnableOldProtocolVersions.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/EnableOldProtocolVersions.java
@@ -31,4 +31,4 @@
     {
         probe.enableOldProtocolVersions();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Flush.java b/src/java/org/apache/cassandra/tools/nodetool/Flush.java
index c83e420..fb2446d 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Flush.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Flush.java
@@ -49,4 +49,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetAuditLog.java b/src/java/org/apache/cassandra/tools/nodetool/GetAuditLog.java
new file mode 100644
index 0000000..1e08984
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetAuditLog.java
@@ -0,0 +1,56 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Command;
+import org.apache.cassandra.audit.AuditLogOptions;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool;
+import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
+
+@Command(name = "getauditlog", description = "Print configuration of audit log if enabled, otherwise the configuration reflected in cassandra.yaml")
+public class GetAuditLog extends NodeTool.NodeToolCmd
+{
+    @Override
+    protected void execute(NodeProbe probe)
+    {
+        final TableBuilder tableBuilder = new TableBuilder();
+
+        tableBuilder.add("enabled", Boolean.toString(probe.getStorageService().isAuditLogEnabled()));
+
+        final AuditLogOptions options = probe.getAuditLogOptions();
+
+        tableBuilder.add("logger", options.logger.class_name);
+        tableBuilder.add("audit_logs_dir", options.audit_logs_dir);
+        tableBuilder.add("archive_command", options.archive_command);
+        tableBuilder.add("roll_cycle", options.roll_cycle);
+        tableBuilder.add("block", Boolean.toString(options.block));
+        tableBuilder.add("max_log_size", Long.toString(options.max_log_size));
+        tableBuilder.add("max_queue_weight", Integer.toString(options.max_queue_weight));
+        tableBuilder.add("max_archive_retries", Long.toString(options.max_archive_retries));
+        tableBuilder.add("included_keyspaces", options.included_keyspaces);
+        tableBuilder.add("excluded_keyspaces", options.excluded_keyspaces);
+        tableBuilder.add("included_categories", options.included_categories);
+        tableBuilder.add("excluded_categories", options.excluded_categories);
+        tableBuilder.add("included_users", options.included_users);
+        tableBuilder.add("excluded_users", options.excluded_users);
+
+        tableBuilder.printTo(probe.output().out);
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetAuthCacheConfig.java b/src/java/org/apache/cassandra/tools/nodetool/GetAuthCacheConfig.java
new file mode 100644
index 0000000..347500b
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetAuthCacheConfig.java
@@ -0,0 +1,47 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
+import org.apache.cassandra.auth.AuthCacheMBean;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool;
+
+@Command(name = "getauthcacheconfig", description = "Get configuration of Auth cache")
+public class GetAuthCacheConfig extends NodeTool.NodeToolCmd
+{
+    @SuppressWarnings("unused")
+    @Option(title = "cache-name",
+            name = {"--cache-name"},
+            description = "Name of Auth cache (required)",
+            required = true)
+    private String cacheName;
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        AuthCacheMBean authCacheMBean = probe.getAuthCacheMBean(cacheName);
+
+        probe.output().out.println("Validity Period: " + authCacheMBean.getValidity());
+        probe.output().out.println("Update Interval: " + authCacheMBean.getUpdateInterval());
+        probe.output().out.println("Max Entries: " + authCacheMBean.getMaxEntries());
+        probe.output().out.println("Active Update: " + authCacheMBean.getActiveUpdate());
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetColumnIndexSize.java b/src/java/org/apache/cassandra/tools/nodetool/GetColumnIndexSize.java
new file mode 100644
index 0000000..6925932
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetColumnIndexSize.java
@@ -0,0 +1,33 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+@Command(name = "getcolumnindexsize", description = "Print the granularity of the collation index of rows within a partition in KiB")
+public class GetColumnIndexSize extends NodeToolCmd
+{
+    @Override
+    protected void execute(NodeProbe probe)
+    {
+        probe.output().out.println("Current value for column_index_size: " + probe.getColumnIndexSizeInKB() + " KiB");
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetCompactionThroughput.java b/src/java/org/apache/cassandra/tools/nodetool/GetCompactionThroughput.java
index 839c78d..e71fe0a 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/GetCompactionThroughput.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetCompactionThroughput.java
@@ -17,17 +17,34 @@
  */
 package org.apache.cassandra.tools.nodetool;
 
+import com.google.common.math.DoubleMath;
+
 import io.airlift.airline.Command;
 
+import io.airlift.airline.Option;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
-@Command(name = "getcompactionthroughput", description = "Print the MB/s throughput cap for compaction in the system")
+@Command(name = "getcompactionthroughput", description = "Print the MiB/s throughput cap for compaction in the system as a rounded number")
 public class GetCompactionThroughput extends NodeToolCmd
 {
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-d", "--precise-mib" }, description = "Print the MiB/s throughput cap for compaction in the system as a precise number (double)")
+    private boolean  compactionThroughputAsDouble;
+
     @Override
     public void execute(NodeProbe probe)
     {
-        probe.output().out.println("Current compaction throughput: " + probe.getCompactionThroughput() + " MB/s");
+        double throughput = probe.getCompactionThroughputMebibytesAsDouble();
+
+        if (compactionThroughputAsDouble)
+            probe.output().out.println("Current compaction throughput: " + throughput + " MiB/s");
+        else
+        {
+            if (!DoubleMath.isMathematicalInteger(throughput))
+                throw new RuntimeException("Use the -d flag to quiet this error and get the exact throughput in MiB/s");
+
+            probe.output().out.println("Current compaction throughput: " + probe.getCompactionThroughput() + " MB/s");
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetDefaultKeyspaceRF.java b/src/java/org/apache/cassandra/tools/nodetool/GetDefaultKeyspaceRF.java
new file mode 100644
index 0000000..0ba7d37
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetDefaultKeyspaceRF.java
@@ -0,0 +1,32 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool;
+
+@Command(name = "getdefaultrf", description = "Gets default keyspace replication factor.")
+public class GetDefaultKeyspaceRF extends NodeTool.NodeToolCmd
+{
+    protected void execute(NodeProbe probe)
+    {
+        probe.output().out.println(probe.getDefaultKeyspaceReplicationFactor());
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetFullQueryLog.java b/src/java/org/apache/cassandra/tools/nodetool/GetFullQueryLog.java
index be3aa56..1dc4c3f 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/GetFullQueryLog.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetFullQueryLog.java
@@ -24,7 +24,7 @@
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
 
-@Command(name = "getfullquerylog", description = "print configuration of fql if enabled, otherwise the configuration reflected in cassandra.yaml")
+@Command(name = "getfullquerylog", description = "Print configuration of fql if enabled, otherwise the configuration reflected in cassandra.yaml")
 public class GetFullQueryLog extends NodeToolCmd
 {
     protected void execute(NodeProbe probe)
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetInterDCStreamThroughput.java b/src/java/org/apache/cassandra/tools/nodetool/GetInterDCStreamThroughput.java
index 554876d..50098a5 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/GetInterDCStreamThroughput.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetInterDCStreamThroughput.java
@@ -17,17 +17,71 @@
  */
 package org.apache.cassandra.tools.nodetool;
 
-import io.airlift.airline.Command;
+import com.google.common.math.DoubleMath;
 
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
-@Command(name = "getinterdcstreamthroughput", description = "Print the Mb/s throughput cap for inter-datacenter streaming in the system")
+@Command(name = "getinterdcstreamthroughput", description = "Print the throughput cap for inter-datacenter streaming and entire SSTable inter-datacenter streaming in the system" +
+                                                            "in rounded megabits. For precise number, please, use option -d")
 public class GetInterDCStreamThroughput extends NodeToolCmd
 {
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-e", "--entire-sstable-throughput" }, description = "Print entire SSTable streaming throughput in MiB/s")
+    private boolean entireSSTableThroughput;
+
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-m", "--mib" }, description = "Print the throughput cap for inter-datacenter streaming in MiB/s")
+    private boolean interDCStreamThroughputMiB;
+
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-d", "--precise-mbit" }, description = "Print the throughput cap for inter-datacenter streaming in precise Mbits (double)")
+    private boolean interDCStreamThroughputDoubleMbit;
+
     @Override
     public void execute(NodeProbe probe)
     {
-        probe.output().out.println("Current inter-datacenter stream throughput: " + probe.getInterDCStreamThroughput() + " Mb/s");
+        int throughput;
+        double throughputInDouble;
+
+        if (entireSSTableThroughput)
+        {
+            if (interDCStreamThroughputDoubleMbit || interDCStreamThroughputMiB)
+                throw new IllegalArgumentException("You cannot use more than one flag with this command");
+
+            throughputInDouble = probe.getEntireSSTableInterDCStreamThroughput();
+            probe.output().out.printf("Current entire SSTable inter-datacenter stream throughput: %s%n",
+                                      throughputInDouble > 0 ? throughputInDouble + " MiB/s" : "unlimited");
+        }
+        else if (interDCStreamThroughputMiB)
+        {
+            if (interDCStreamThroughputDoubleMbit)
+                throw new IllegalArgumentException("You cannot use more than one flag with this command");
+
+            throughputInDouble = probe.getInterDCStreamThroughputMibAsDouble();
+            probe.output().out.printf("Current inter-datacenter stream throughput: %s%n",
+                                      throughputInDouble > 0 ? throughputInDouble + " MiB/s" : "unlimited");
+
+        }
+        else if (interDCStreamThroughputDoubleMbit)
+        {
+            throughputInDouble = probe.getInterDCStreamThroughputAsDouble();
+            probe.output().out.printf("Current stream throughput: %s%n",
+                                      throughputInDouble > 0 ? throughputInDouble + " Mb/s" : "unlimited");
+        }
+        else
+        {
+            throughputInDouble = probe.getInterDCStreamThroughputAsDouble();
+            throughput = probe.getInterDCStreamThroughput();
+
+            if (throughput <= 0)
+                probe.output().out.printf("Current inter-datacenter stream throughput: unlimited%n");
+            else if (DoubleMath.isMathematicalInteger(throughputInDouble))
+                probe.output().out.printf(throughputInDouble + "Current inter-datacenter stream throughput: %s%n", throughput + " Mb/s");
+            else
+                throw new RuntimeException("Use the -d flag to quiet this error and get the exact throughput in megabits/s");
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetSnapshotThrottle.java b/src/java/org/apache/cassandra/tools/nodetool/GetSnapshotThrottle.java
index 0e9bdc1..bd98d34 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/GetSnapshotThrottle.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetSnapshotThrottle.java
@@ -33,4 +33,4 @@
         else
             System.out.println("Snapshot throttle is disabled");
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GetStreamThroughput.java b/src/java/org/apache/cassandra/tools/nodetool/GetStreamThroughput.java
index 9014d3c..94cf298 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/GetStreamThroughput.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/GetStreamThroughput.java
@@ -17,17 +17,70 @@
  */
 package org.apache.cassandra.tools.nodetool;
 
-import io.airlift.airline.Command;
+import com.google.common.math.DoubleMath;
 
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
-@Command(name = "getstreamthroughput", description = "Print the Mb/s throughput cap for streaming in the system")
+@Command(name = "getstreamthroughput", description = "Print the throughput cap for streaming and entire SSTable streaming in the system in rounded megabits. " +
+                                                     "For precise number, please, use option -d")
 public class GetStreamThroughput extends NodeToolCmd
 {
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-e", "--entire-sstable-throughput" }, description = "Print entire SSTable streaming throughput in MiB/s")
+    private boolean entireSSTableThroughput;
+
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-m", "--mib" }, description = "Print the throughput cap for streaming in MiB/s")
+    private boolean streamThroughputMiB;
+
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-d", "--precise-mbit" }, description = "Print the throughput cap for streaming in precise Mbits (double)")
+    private boolean streamThroughputDoubleMbit;
+
     @Override
     public void execute(NodeProbe probe)
     {
-        probe.output().out.println("Current stream throughput: " + probe.getStreamThroughput() + " Mb/s");
+        int throughput;
+        double throughputInDouble;
+
+        if (entireSSTableThroughput)
+        {
+            if (streamThroughputDoubleMbit || streamThroughputMiB)
+                throw new IllegalArgumentException("You cannot use more than one flag with this command");
+
+            throughputInDouble = probe.getEntireSSTableStreamThroughput();
+            probe.output().out.printf("Current entire SSTable stream throughput: %s%n",
+                                      throughputInDouble > 0 ? throughputInDouble + " MiB/s" : "unlimited");
+        }
+        else if (streamThroughputMiB)
+        {
+            if (streamThroughputDoubleMbit)
+                throw new IllegalArgumentException("You cannot use more than one flag with this command");
+
+            throughputInDouble = probe.getStreamThroughputMibAsDouble();
+            probe.output().out.printf("Current stream throughput: %s%n",
+                                      throughputInDouble > 0 ? throughputInDouble + " MiB/s" : "unlimited");
+        }
+        else if (streamThroughputDoubleMbit)
+        {
+            throughputInDouble = probe.getStreamThroughputAsDouble();
+            probe.output().out.printf("Current stream throughput: %s%n",
+                                      throughputInDouble > 0 ? throughputInDouble + " Mb/s" : "unlimited");
+        }
+        else
+        {
+            throughputInDouble = probe.getStreamThroughputAsDouble();
+            throughput = probe.getStreamThroughput();
+
+            if (throughput <= 0)
+                probe.output().out.printf("Current stream throughput: unlimited%n");
+            else if (DoubleMath.isMathematicalInteger(throughputInDouble))
+                probe.output().out.printf("Current stream throughput: %s%n", throughput + " Mb/s");
+            else
+                throw new RuntimeException("Use the -d flag to quiet this error and get the exact throughput in megabits/s");
+        }
     }
 }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/GossipInfo.java b/src/java/org/apache/cassandra/tools/nodetool/GossipInfo.java
index 4f5f1b3..a297f76 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/GossipInfo.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/GossipInfo.java
@@ -18,6 +18,7 @@
 package org.apache.cassandra.tools.nodetool;
 
 import io.airlift.airline.Command;
+import io.airlift.airline.Option;
 
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
@@ -25,9 +26,12 @@
 @Command(name = "gossipinfo", description = "Shows the gossip information for the cluster")
 public class GossipInfo extends NodeToolCmd
 {
+    @Option(title = "resolve_ip", name = {"-r", "--resolve-ip"}, description = "Show node domain names instead of IPs")
+    private boolean resolveIp = false;
+
     @Override
     public void execute(NodeProbe probe)
     {
-        probe.output().out.println(probe.getGossipInfo(printPort));
+        probe.output().out.println(probe.getGossipInfo(printPort, resolveIp));
     }
 }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/HostStat.java b/src/java/org/apache/cassandra/tools/nodetool/HostStat.java
index 19c0448..56c46ee 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/HostStat.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/HostStat.java
@@ -38,4 +38,4 @@
     {
         return resolveIp ? endpoint.getHostName() : endpoint.getHostAddress();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/HostStatWithPort.java b/src/java/org/apache/cassandra/tools/nodetool/HostStatWithPort.java
index 9cff725..b07a6e3 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/HostStatWithPort.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/HostStatWithPort.java
@@ -26,7 +26,7 @@
 
     public HostStatWithPort(String token, InetAddressAndPort endpoint, boolean resolveIp, Float owns)
     {
-        super(token, endpoint.address, resolveIp, owns);
+        super(token, endpoint.getAddress(), resolveIp, owns);
         this.endpointWithPort = endpoint;
     }
 
@@ -41,7 +41,7 @@
             return super.ipOrDns();
 
         return resolveIp ?
-               endpointWithPort.address.getHostName() + ':' + endpointWithPort.port :
+               endpointWithPort.getAddress().getHostName() + ':' + endpointWithPort.getPort() :
                endpointWithPort.getHostAddressAndPort();
     }
 }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Info.java b/src/java/org/apache/cassandra/tools/nodetool/Info.java
index cf1f894..db7277e 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Info.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Info.java
@@ -178,8 +178,8 @@
     }
 
     /**
-     * Returns the total off heap memory used in MB.
-     * @return the total off heap memory used in MB.
+     * Returns the total off heap memory used in MiB.
+     * @return the total off heap memory used in MiB.
      */
     private static double getOffHeapMemoryUsed(NodeProbe probe)
     {
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidateCounterCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidateCounterCache.java
index aef77bd..3cba8e0 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/InvalidateCounterCache.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidateCounterCache.java
@@ -30,4 +30,4 @@
     {
         probe.invalidateCounterCache();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCache.java
new file mode 100644
index 0000000..0f9079f
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCache.java
@@ -0,0 +1,49 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+@Command(name = "invalidatecredentialscache", description = "Invalidate the credentials cache")
+public class InvalidateCredentialsCache extends NodeToolCmd
+{
+    @Arguments(usage = "[<role>...]", description = "List of roles to invalidate. By default, all roles")
+    private List<String> args = new ArrayList<>();
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        if (args.isEmpty())
+        {
+            probe.invalidateCredentialsCache();
+        }
+        else
+        {
+            for (String roleName : args)
+            {
+                probe.invalidateCredentialsCache(roleName);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCache.java
new file mode 100644
index 0000000..c242b03
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCache.java
@@ -0,0 +1,48 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+@Command(name = "invalidatejmxpermissionscache", description = "Invalidate the JMX permissions cache")
+public class InvalidateJmxPermissionsCache extends NodeToolCmd
+{
+    @Arguments(usage = "[<role>...]", description = "List of roles to invalidate. By default, all roles")
+    private List<String> args = new ArrayList<>();
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        if (args.isEmpty())
+        {
+            probe.invalidateJmxPermissionsCache();
+        } else
+        {
+            for (String roleName : args)
+            {
+                probe.invalidateJmxPermissionsCache(roleName);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidateKeyCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidateKeyCache.java
index cfe7d2f..4414b42 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/InvalidateKeyCache.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidateKeyCache.java
@@ -30,4 +30,4 @@
     {
         probe.invalidateKeyCache();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCache.java
new file mode 100644
index 0000000..8b58060
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCache.java
@@ -0,0 +1,49 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+@Command(name = "invalidatenetworkpermissionscache", description = "Invalidate the network permissions cache")
+public class InvalidateNetworkPermissionsCache extends NodeToolCmd
+{
+    @Arguments(usage = "[<role>...]", description = "List of roles to invalidate. By default, all roles")
+    private List<String> args = new ArrayList<>();
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        if (args.isEmpty())
+        {
+            probe.invalidateNetworkPermissionsCache();
+        }
+        else
+        {
+            for (String roleName : args)
+            {
+                probe.invalidateNetworkPermissionsCache(roleName);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCache.java
new file mode 100644
index 0000000..cc66c98
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCache.java
@@ -0,0 +1,188 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.commons.lang3.StringUtils;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
+import org.apache.cassandra.auth.DataResource;
+import org.apache.cassandra.auth.FunctionResource;
+import org.apache.cassandra.auth.JMXResource;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+@Command(name = "invalidatepermissionscache", description = "Invalidate the permissions cache")
+public class InvalidatePermissionsCache extends NodeToolCmd
+{
+    @Arguments(usage = "[<role>]", description = "A role for which permissions to specified resources need to be invalidated")
+    private List<String> args = new ArrayList<>();
+
+    // Data Resources
+    @Option(title = "all-keyspaces",
+            name = {"--all-keyspaces"},
+            description = "Invalidate permissions for 'ALL KEYSPACES'")
+    private boolean allKeyspaces;
+
+    @Option(title = "keyspace",
+            name = {"--keyspace"},
+            description = "Keyspace to invalidate permissions for")
+    private String keyspace;
+
+    @Option(title = "all-tables",
+            name = {"--all-tables"},
+            description = "Invalidate permissions for 'ALL TABLES'")
+    private boolean allTables;
+
+    @Option(title = "table",
+            name = {"--table"},
+            description = "Table to invalidate permissions for (you must specify --keyspace for using this option)")
+    private String table;
+
+    // Roles Resources
+    @Option(title = "all-roles",
+            name = {"--all-roles"},
+            description = "Invalidate permissions for 'ALL ROLES'")
+    private boolean allRoles;
+
+    @Option(title = "role",
+            name = {"--role"},
+            description = "Role to invalidate permissions for")
+    private String role;
+
+    // Functions Resources
+    @Option(title = "all-functions",
+            name = {"--all-functions"},
+            description = "Invalidate permissions for 'ALL FUNCTIONS'")
+    private boolean allFunctions;
+
+    @Option(title = "functions-in-keyspace",
+            name = {"--functions-in-keyspace"},
+            description = "Keyspace to invalidate permissions for")
+    private String functionsInKeyspace;
+
+    @Option(title = "function",
+            name = {"--function"},
+            description = "Function to invalidate permissions for (you must specify --functions-in-keyspace for using " +
+                    "this option; function format: name[arg1^..^agrN], for example: foo[Int32Type^DoubleType])")
+    private String function;
+
+    // MBeans Resources
+    @Option(title = "all-mbeans",
+            name = {"--all-mbeans"},
+            description = "Invalidate permissions for 'ALL MBEANS'")
+    private boolean allMBeans;
+
+    @Option(title = "mbean",
+            name = {"--mbean"},
+            description = "MBean to invalidate permissions for")
+    private String mBean;
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        if (args.isEmpty())
+        {
+            checkArgument(!allKeyspaces && StringUtils.isEmpty(keyspace) && StringUtils.isEmpty(table)
+                    && !allRoles && StringUtils.isEmpty(role)
+                    && !allFunctions && StringUtils.isEmpty(functionsInKeyspace) && StringUtils.isEmpty(function)
+                    && !allMBeans && StringUtils.isEmpty(mBean),
+                    "No resource options allowed without a <role> being specified");
+
+            probe.invalidatePermissionsCache();
+        }
+        else
+        {
+            checkArgument(args.size() == 1,
+                    "A single <role> is only supported / you have a typo in the resource options spelling");
+            List<String> resourceNames = new ArrayList<>();
+
+            // Data Resources
+            if (allKeyspaces)
+                resourceNames.add(DataResource.root().getName());
+
+            if (allTables)
+                if (StringUtils.isNotEmpty(keyspace))
+                    resourceNames.add(DataResource.allTables(keyspace).getName());
+                else
+                    throw new IllegalArgumentException("--all-tables option should be passed along with --keyspace option");
+
+            if (StringUtils.isNotEmpty(table))
+                if (StringUtils.isNotEmpty(keyspace))
+                    resourceNames.add(DataResource.table(keyspace, table).getName());
+                else
+                    throw new IllegalArgumentException("--table option should be passed along with --keyspace option");
+
+            if (StringUtils.isNotEmpty(keyspace) && !allTables && StringUtils.isEmpty(table))
+                resourceNames.add(DataResource.keyspace(keyspace).getName());
+
+            // Roles Resources
+            if (allRoles)
+                resourceNames.add(RoleResource.root().getName());
+
+            if (StringUtils.isNotEmpty(role))
+                resourceNames.add(RoleResource.role(role).getName());
+
+            // Function Resources
+            if (allFunctions)
+                resourceNames.add(FunctionResource.root().getName());
+
+            if (StringUtils.isNotEmpty(function))
+                if (StringUtils.isNotEmpty(functionsInKeyspace))
+                    resourceNames.add(constructFunctionResource(functionsInKeyspace, function));
+                else
+                    throw new IllegalArgumentException("--function option should be passed along with --functions-in-keyspace option");
+            else
+                if (StringUtils.isNotEmpty(functionsInKeyspace))
+                    resourceNames.add(FunctionResource.keyspace(functionsInKeyspace).getName());
+
+            // MBeans Resources
+            if (allMBeans)
+                resourceNames.add(JMXResource.root().getName());
+
+            if (StringUtils.isNotEmpty(mBean))
+                resourceNames.add(JMXResource.mbean(mBean).getName());
+
+            String roleName = args.get(0);
+
+            if (resourceNames.isEmpty())
+                throw new IllegalArgumentException("No resource options specified");
+
+            for (String resourceName : resourceNames)
+                probe.invalidatePermissionsCache(roleName, resourceName);
+        }
+    }
+
+    private String constructFunctionResource(String functionsInKeyspace, String function) {
+        try
+        {
+            return FunctionResource.fromName("functions/" + functionsInKeyspace + '/' + function).getName();
+        } catch (ConfigurationException e)
+        {
+            throw new IllegalArgumentException("An error was encountered when looking up function definition: " + e.getMessage());
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidateRolesCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidateRolesCache.java
new file mode 100644
index 0000000..4fca5c3
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidateRolesCache.java
@@ -0,0 +1,50 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+@Command(name = "invalidaterolescache", description = "Invalidate the roles cache")
+public class InvalidateRolesCache extends NodeToolCmd
+{
+
+    @Arguments(usage = "[<role>...]", description = "List of roles to invalidate. By default, all roles")
+    private List<String> args = new ArrayList<>();
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        if (args.isEmpty())
+        {
+            probe.invalidateRolesCache();
+        }
+        else
+        {
+            for (String roleName : args)
+            {
+                probe.invalidateRolesCache(roleName);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/tools/nodetool/InvalidateRowCache.java b/src/java/org/apache/cassandra/tools/nodetool/InvalidateRowCache.java
index 7357e27..1a10ed0 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/InvalidateRowCache.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/InvalidateRowCache.java
@@ -30,4 +30,4 @@
     {
         probe.invalidateRowCache();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ListPendingHints.java b/src/java/org/apache/cassandra/tools/nodetool/ListPendingHints.java
new file mode 100644
index 0000000..af414d8
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/ListPendingHints.java
@@ -0,0 +1,98 @@
+/*
+ * 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.tools.nodetool;
+
+import java.net.UnknownHostException;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
+import java.util.Map;
+
+import io.airlift.airline.Command;
+import org.apache.cassandra.hints.PendingHintsInfo;
+import org.apache.cassandra.locator.EndpointSnitchInfoMBean;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool;
+import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
+
+@Command(name = "listpendinghints", description = "Print all pending hints that this node has")
+public class ListPendingHints extends NodeTool.NodeToolCmd
+{
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        List<Map<String, String>> pendingHints = probe.listPendingHints();
+        if(pendingHints.isEmpty())
+        {
+            probe.output().out.println("This node does not have any pending hints");
+        }
+        else
+        {
+            Map<String, String> endpointMap = probe.getHostIdToEndpointWithPort();
+            Map<String, String> simpleStates = probe.getSimpleStatesWithPort();
+            EndpointSnitchInfoMBean epSnitchInfo = probe.getEndpointSnitchInfoProxy();
+
+            DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss,SSS");
+            TableBuilder tableBuilder = new TableBuilder();
+
+            tableBuilder.add("Host ID", "Address", "Rack", "DC", "Status", "Total files", "Newest", "Oldest");
+            for (Map<String, String> hintInfo : pendingHints)
+            {
+                String endpoint = hintInfo.get(PendingHintsInfo.HOST_ID);
+                String totalFiles = hintInfo.get(PendingHintsInfo.TOTAL_FILES);
+                LocalDateTime newest = Instant.ofEpochMilli(Long.parseLong(hintInfo.get(PendingHintsInfo.NEWEST_TIMESTAMP)))
+                                              .atZone(ZoneId.of("UTC"))
+                                              .toLocalDateTime();
+                LocalDateTime oldest = Instant.ofEpochMilli(Long.parseLong(hintInfo.get(PendingHintsInfo.OLDEST_TIMESTAMP)))
+                                              .atZone(ZoneId.of("UTC"))
+                                              .toLocalDateTime();
+                String address = endpointMap.get(endpoint);
+                String rack = null;
+                String dc = null;
+                String status = null;
+                try
+                {
+                    rack = epSnitchInfo.getRack(address);
+                    dc = epSnitchInfo.getDatacenter(address);
+                    status = simpleStates.getOrDefault(InetAddressAndPort.getByName(address).toString(),
+                                                       "Unknown");
+                }
+                catch (UnknownHostException e)
+                {
+                    rack = rack != null ? rack : "Unknown";
+                    dc = dc != null ? dc : "Unknown";
+                    status = "Unknown";
+                }
+
+                tableBuilder.add(endpoint,
+                                 address,
+                                 rack,
+                                 dc,
+                                 status,
+                                 String.valueOf(totalFiles),
+                                 dtf.format(newest),
+                                 dtf.format(oldest));
+            }
+            tableBuilder.printTo(probe.output().out);
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ListSnapshots.java b/src/java/org/apache/cassandra/tools/nodetool/ListSnapshots.java
index 79494cd..b70a7a9 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/ListSnapshots.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/ListSnapshots.java
@@ -18,6 +18,7 @@
 package org.apache.cassandra.tools.nodetool;
 
 import java.io.PrintStream;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -25,6 +26,7 @@
 
 import io.airlift.airline.Command;
 
+import io.airlift.airline.Option;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
@@ -33,6 +35,11 @@
 @Command(name = "listsnapshots", description = "Lists all the snapshots along with the size on disk and true size. True size is the total size of all SSTables which are not backed up to disk. Size on disk is total size of the snapshot on disk. Total TrueDiskSpaceUsed does not make any SSTable deduplication.")
 public class ListSnapshots extends NodeToolCmd
 {
+    @Option(title = "no_ttl",
+    name = { "-nt", "--no-ttl" },
+    description = "Skip snapshots with TTL")
+    private boolean noTTL = false;
+
     @Override
     public void execute(NodeProbe probe)
     {
@@ -41,7 +48,10 @@
         {
             out.println("Snapshot Details: ");
 
-            final Map<String,TabularData> snapshotDetails = probe.getSnapshotDetails();
+            Map<String, String> options = new HashMap<>();
+            options.put("no_ttl", Boolean.toString(noTTL));
+
+            final Map<String, TabularData> snapshotDetails = probe.getSnapshotDetails(options);
             if (snapshotDetails.isEmpty())
             {
                 out.println("There are no snapshots");
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Move.java b/src/java/org/apache/cassandra/tools/nodetool/Move.java
index 8654d25..075e008 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Move.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Move.java
@@ -43,4 +43,4 @@
             throw new RuntimeException("Error during moving node", e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/NetStats.java b/src/java/org/apache/cassandra/tools/nodetool/NetStats.java
index cc6b7b1..aacc071 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/NetStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/NetStats.java
@@ -26,6 +26,7 @@
 import com.google.common.annotations.VisibleForTesting;
 
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.MessagingServiceMBean;
 import org.apache.cassandra.streaming.ProgressInfo;
 import org.apache.cassandra.streaming.SessionInfo;
@@ -54,11 +55,11 @@
             out.printf("%s %s%n", status.streamOperation.getDescription(), status.planId.toString());
             for (SessionInfo info : status.sessions)
             {
-                out.printf("    %s", info.peer.toString(printPort));
+                out.printf("    %s", InetAddressAndPort.toString(info.peer, printPort));
                 // print private IP when it is used
                 if (!info.peer.equals(info.connecting))
                 {
-                    out.printf(" (using %s)", info.connecting.toString(printPort));
+                    out.printf(" (using %s)", InetAddressAndPort.toString(info.connecting, printPort));
                 }
                 out.printf("%n");
                 if (!info.receivingSummaries.isEmpty())
diff --git a/src/java/org/apache/cassandra/tools/nodetool/PauseHandoff.java b/src/java/org/apache/cassandra/tools/nodetool/PauseHandoff.java
index 4ec70d8..fde9eef 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/PauseHandoff.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/PauseHandoff.java
@@ -30,4 +30,4 @@
     {
         probe.pauseHintsDelivery();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Rebuild.java b/src/java/org/apache/cassandra/tools/nodetool/Rebuild.java
index a083cde..a16e8f2 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Rebuild.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Rebuild.java
@@ -57,4 +57,4 @@
 
         probe.rebuild(sourceDataCenterName, keyspace, tokens, specificSources);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/RebuildIndex.java b/src/java/org/apache/cassandra/tools/nodetool/RebuildIndex.java
index 4a6b071..f7a3b6f 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/RebuildIndex.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/RebuildIndex.java
@@ -40,4 +40,4 @@
         checkArgument(args.size() >= 3, "rebuild_index requires ks, cf and idx args");
         probe.rebuildIndex(args.get(0), args.get(1), toArray(args.subList(2, args.size()), String.class));
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/RecompressSSTables.java b/src/java/org/apache/cassandra/tools/nodetool/RecompressSSTables.java
new file mode 100644
index 0000000..78ed7ec
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/RecompressSSTables.java
@@ -0,0 +1,59 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+@Command(name = "recompress_sstables", description = "Rewrite sstables (for the requested tables) that have compression configuration different from the current")
+public class RecompressSSTables extends NodeToolCmd
+{
+    @Arguments(usage = "[<keyspace> <tables>...]", description = "The keyspace followed by one or many tables")
+    private List<String> args = new ArrayList<>();
+
+    @Option(title = "jobs",
+            name = {"-j", "--jobs"},
+            description = "Number of sstables to upgrade simultanously, set to 0 to use all available compaction threads")
+    private int jobs = 2;
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        List<String> keyspaces = parseOptionalKeyspace(args, probe);
+        String[] tableNames = parseOptionalTables(args);
+
+        for (String keyspace : keyspaces)
+        {
+            try
+            {
+                probe.recompressSSTables(probe.output().out, keyspace, jobs, tableNames);
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException("Error occurred during enabling auto-compaction", e);
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ReloadTriggers.java b/src/java/org/apache/cassandra/tools/nodetool/ReloadTriggers.java
index 6ca90fb..8727a61 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/ReloadTriggers.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/ReloadTriggers.java
@@ -30,4 +30,4 @@
     {
         probe.reloadTriggers();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Repair.java b/src/java/org/apache/cassandra/tools/nodetool/Repair.java
index c4f60af..8e5aab2 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Repair.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Repair.java
@@ -97,6 +97,12 @@
     @Option(title = "optimise_streams", name = {"-os", "--optimise-streams"}, description = "Use --optimise-streams to try to reduce the number of streams we do (EXPERIMENTAL, see CASSANDRA-3200).")
     private boolean optimiseStreams = false;
 
+    @Option(title = "skip-paxos", name = {"-skip-paxos", "--skip-paxos"}, description = "If the --skip-paxos flag is included, the paxos repair step is skipped. Paxos repair is also skipped for preview repairs.")
+    private boolean skipPaxos = false;
+
+    @Option(title = "paxos-only", name = {"-paxos-only", "--paxos-only"}, description = "If the --paxos-only flag is included, no table data is repaired, only paxos operations..")
+    private boolean paxosOnly = false;
+
     @Option(title = "ignore_unreplicated_keyspaces", name = {"-iuk","--ignore-unreplicated-keyspaces"}, description = "Use --ignore-unreplicated-keyspaces to ignore keyspaces which are not replicated, otherwise the repair will fail")
     private boolean ignoreUnreplicatedKeyspaces = false;
 
@@ -152,6 +158,8 @@
             options.put(RepairOption.PREVIEW, getPreviewKind().toString());
             options.put(RepairOption.OPTIMISE_STREAMS_KEY, Boolean.toString(optimiseStreams));
             options.put(RepairOption.IGNORE_UNREPLICATED_KS, Boolean.toString(ignoreUnreplicatedKeyspaces));
+            options.put(RepairOption.REPAIR_PAXOS_KEY, Boolean.toString(!skipPaxos && getPreviewKind() == PreviewKind.NONE));
+            options.put(RepairOption.PAXOS_ONLY_KEY, Boolean.toString(paxosOnly && getPreviewKind() == PreviewKind.NONE));
 
             if (!startToken.isEmpty() || !endToken.isEmpty())
             {
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ResetFullQueryLog.java b/src/java/org/apache/cassandra/tools/nodetool/ResetFullQueryLog.java
index 786852d..d7ac301 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/ResetFullQueryLog.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/ResetFullQueryLog.java
@@ -30,4 +30,4 @@
     {
         probe.resetFullQueryLogger();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ResetLocalSchema.java b/src/java/org/apache/cassandra/tools/nodetool/ResetLocalSchema.java
index 708636f..62775a4 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/ResetLocalSchema.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/ResetLocalSchema.java
@@ -38,4 +38,4 @@
             throw new RuntimeException(e);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/ResumeHandoff.java b/src/java/org/apache/cassandra/tools/nodetool/ResumeHandoff.java
index a3984f8..bda98aa 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/ResumeHandoff.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/ResumeHandoff.java
@@ -30,4 +30,4 @@
     {
         probe.resumeHintsDelivery();
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetAuthCacheConfig.java b/src/java/org/apache/cassandra/tools/nodetool/SetAuthCacheConfig.java
new file mode 100644
index 0000000..8adad65
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetAuthCacheConfig.java
@@ -0,0 +1,114 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
+import org.apache.cassandra.auth.AuthCacheMBean;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+import static com.google.common.base.Preconditions.checkArgument;
+
+@Command(name = "setauthcacheconfig", description = "Set configuration for Auth cache")
+public class SetAuthCacheConfig extends NodeToolCmd
+{
+    @SuppressWarnings("unused")
+    @Option(title = "cache-name",
+            name = {"--cache-name"},
+            description = "Name of Auth cache (required)",
+            required = true)
+    private String cacheName;
+
+    @SuppressWarnings("unused")
+    @Option(title = "validity-period",
+            name = {"--validity-period"},
+            description = "Validity period in milliseconds")
+    private Integer validityPeriod;
+
+    @SuppressWarnings("unused")
+    @Option(title = "update-interval",
+            name = {"--update-interval"},
+            description = "Update interval in milliseconds")
+    private Integer updateInterval;
+
+    @SuppressWarnings("unused")
+    @Option(title = "max-entries",
+            name = {"--max-entries"},
+            description = "Max entries")
+    private Integer maxEntries;
+
+    @SuppressWarnings("unused")
+    @Option(title = "enable-active-update",
+            name = {"--enable-active-update"},
+            description = "Enable active update")
+    private Boolean enableActiveUpdate;
+
+    @SuppressWarnings("unused")
+    @Option(title = "disable-active-update",
+            name = {"--disable-active-update"},
+            description = "Disable active update")
+    private Boolean disableActiveUpdate;
+
+    @Override
+    public void execute(NodeProbe probe)
+    {
+        Boolean activeUpdate = getActiveUpdate(enableActiveUpdate, disableActiveUpdate);
+
+        checkArgument(validityPeriod != null || updateInterval != null
+                      || maxEntries != null || activeUpdate != null,
+                      "At least one optional parameter need to be passed");
+
+        AuthCacheMBean authCacheMBean = probe.getAuthCacheMBean(cacheName);
+
+        if (validityPeriod != null)
+        {
+            authCacheMBean.setValidity(validityPeriod);
+            probe.output().out.println("Changed Validity Period to " + validityPeriod);
+        }
+
+        if (updateInterval != null)
+        {
+            authCacheMBean.setUpdateInterval(updateInterval);
+            probe.output().out.println("Changed Update Interval to " + updateInterval);
+        }
+
+        if (maxEntries != null)
+        {
+            authCacheMBean.setMaxEntries(maxEntries);
+            probe.output().out.println("Changed Max Entries to " + maxEntries);
+        }
+
+        if (activeUpdate != null)
+        {
+            authCacheMBean.setActiveUpdate(activeUpdate);
+            probe.output().out.println("Changed Active Update to " + activeUpdate);
+        }
+    }
+
+    private Boolean getActiveUpdate(Boolean enableActiveUpdate, Boolean disableActiveUpdate)
+    {
+        if (enableActiveUpdate == null && disableActiveUpdate == null)
+            return null;
+
+        if (enableActiveUpdate != null && disableActiveUpdate != null)
+            throw new IllegalArgumentException("enable-active-update and disable-active-update cannot be used together");
+
+        return Boolean.TRUE.equals(enableActiveUpdate) ? Boolean.TRUE : Boolean.FALSE;
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetBatchlogReplayThrottle.java b/src/java/org/apache/cassandra/tools/nodetool/SetBatchlogReplayThrottle.java
index 65bb8f5..b96146c 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetBatchlogReplayThrottle.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetBatchlogReplayThrottle.java
@@ -26,7 +26,7 @@
                                                            "This will be reduced proportionally to the number of nodes in the cluster.")
 public class SetBatchlogReplayThrottle extends NodeToolCmd
 {
-    @Arguments(title = "batchlog_replay_throttle", usage = "<value_in_kb_per_sec>", description = "Value in KB per second, 0 to disable throttling", required = true)
+    @Arguments(title = "batchlog_replay_throttle", usage = "<value_in_kb_per_sec>", description = "Value in KiB per second, 0 to disable throttling", required = true)
     private Integer batchlogReplayThrottle = null;
 
     @Override
@@ -34,4 +34,4 @@
     {
         probe.setBatchlogReplayThrottle(batchlogReplayThrottle);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetCacheCapacity.java b/src/java/org/apache/cassandra/tools/nodetool/SetCacheCapacity.java
index 461f6ae..b07eb9e 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetCacheCapacity.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetCacheCapacity.java
@@ -42,4 +42,4 @@
         checkArgument(args.size() == 3, "setcachecapacity requires key-cache-capacity, row-cache-capacity, and counter-cache-capacity args.");
         probe.setCacheCapacities(args.get(0), args.get(1), args.get(2));
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetCacheKeysToSave.java b/src/java/org/apache/cassandra/tools/nodetool/SetCacheKeysToSave.java
index 18197e6..de9bab5 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetCacheKeysToSave.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetCacheKeysToSave.java
@@ -42,4 +42,4 @@
         checkArgument(args.size() == 3, "setcachekeystosave requires key-cache-keys-to-save, row-cache-keys-to-save, and counter-cache-keys-to-save args.");
         probe.setCacheKeysToSave(args.get(0), args.get(1), args.get(2));
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetColumnIndexSize.java b/src/java/org/apache/cassandra/tools/nodetool/SetColumnIndexSize.java
new file mode 100644
index 0000000..fe5d8b3
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetColumnIndexSize.java
@@ -0,0 +1,38 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
+
+@Command(name = "setcolumnindexsize", description = "Set the granularity of the collation index of rows within a partition in KiB")
+public class SetColumnIndexSize extends NodeToolCmd
+{
+    @SuppressWarnings("UnusedDeclaration")
+    @Arguments(title = "column_index_size", usage = "<value_in_kib>", description = "Value in KiB", required = true)
+    private int columnIndexSizeInKiB;
+
+    @Override
+    protected void execute(NodeProbe probe)
+    {
+        probe.setColumnIndexSize(columnIndexSizeInKiB);
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThreshold.java b/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThreshold.java
index 56e558f..52bb5bc 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThreshold.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThreshold.java
@@ -47,4 +47,4 @@
 
         probe.setCompactionThreshold(args.get(0), args.get(1), minthreshold, maxthreshold);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThroughput.java b/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThroughput.java
index 80e7222..a75aa13 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThroughput.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetCompactionThroughput.java
@@ -23,10 +23,10 @@
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
-@Command(name = "setcompactionthroughput", description = "Set the MB/s throughput cap for compaction in the system, or 0 to disable throttling")
+@Command(name = "setcompactionthroughput", description = "Set the MiB/s throughput cap for compaction in the system, or 0 to disable throttling")
 public class SetCompactionThroughput extends NodeToolCmd
 {
-    @Arguments(title = "compaction_throughput", usage = "<value_in_mb>", description = "Value in MB, 0 to disable throttling", required = true)
+    @Arguments(title = "compaction_throughput", usage = "<value_in_mb>", description = "Value in MiB, 0 to disable throttling", required = true)
     private Integer compactionThroughput = null;
 
     @Override
@@ -34,4 +34,4 @@
     {
         probe.setCompactionThroughput(compactionThroughput);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetDefaultKeyspaceRF.java b/src/java/org/apache/cassandra/tools/nodetool/SetDefaultKeyspaceRF.java
new file mode 100644
index 0000000..6126bac
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetDefaultKeyspaceRF.java
@@ -0,0 +1,36 @@
+/*
+ * 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.tools.nodetool;
+
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.NodeTool;
+
+@Command(name = "setdefaultrf", description = "Sets default keyspace replication factor.")
+public class SetDefaultKeyspaceRF extends NodeTool.NodeToolCmd
+{
+    @Arguments(title = "default_rf", usage = "<value>", description = "Default replication factor", required = true)
+    private Integer defaultRF = null;
+
+    protected void execute(NodeProbe probe)
+    {
+        probe.setDefaultKeyspaceReplicationFactor(defaultRF);
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetHintedHandoffThrottleInKB.java b/src/java/org/apache/cassandra/tools/nodetool/SetHintedHandoffThrottleInKB.java
index feb945b..b7b7b61 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetHintedHandoffThrottleInKB.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetHintedHandoffThrottleInKB.java
@@ -23,10 +23,10 @@
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
-@Command(name = "sethintedhandoffthrottlekb", description =  "Set hinted handoff throttle in kb per second, per delivery thread.")
+@Command(name = "sethintedhandoffthrottlekb", description =  "Set hinted handoff throttle in KiB per second, per delivery thread.")
 public class SetHintedHandoffThrottleInKB extends NodeToolCmd
 {
-    @Arguments(title = "throttle_in_kb", usage = "<value_in_kb_per_sec>", description = "Value in KB per second", required = true)
+    @Arguments(title = "throttle_in_kb", usage = "<value_in_kb_per_sec>", description = "Value in KiB per second", required = true)
     private Integer throttleInKB = null;
 
     @Override
@@ -34,4 +34,4 @@
     {
         probe.setHintedHandoffThrottleInKB(throttleInKB);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetHostStat.java b/src/java/org/apache/cassandra/tools/nodetool/SetHostStat.java
index c43abe1..1160876 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetHostStat.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetHostStat.java
@@ -51,4 +51,4 @@
         Float owns = ownerships.get(endpoint);
         hostStats.add(new HostStat(token, endpoint, resolveIp, owns));
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetInterDCStreamThroughput.java b/src/java/org/apache/cassandra/tools/nodetool/SetInterDCStreamThroughput.java
index 1397573..29465c6 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetInterDCStreamThroughput.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetInterDCStreamThroughput.java
@@ -19,20 +19,36 @@
 
 import io.airlift.airline.Arguments;
 import io.airlift.airline.Command;
-
+import io.airlift.airline.Option;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
-@Command(name = "setinterdcstreamthroughput", description = "Set the Mb/s throughput cap for inter-datacenter streaming in the system, or 0 to disable throttling")
+@Command(name = "setinterdcstreamthroughput", description = "Set the throughput cap for inter-datacenter streaming and entire SSTable inter-datacenter streaming in the system, or 0 to disable throttling")
 public class SetInterDCStreamThroughput extends NodeToolCmd
 {
     @SuppressWarnings("UnusedDeclaration")
-    @Arguments(title = "inter_dc_stream_throughput", usage = "<value_in_mb>", description = "Value in Mb, 0 to disable throttling", required = true)
+    @Arguments(title = "inter_dc_stream_throughput", usage = "<value_in_mb>", description = "Value in megabits, 0 to disable throttling", required = true)
     private int interDCStreamThroughput;
 
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-e", "--entire-sstable-throughput" }, description = "Set entire SSTable streaming throughput in MiB/s")
+    private boolean setEntireSSTableThroughput;
+
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-m", "--mib" }, description = "Set streaming throughput in MiB/s")
+    private boolean interDCStreamThroughputInMebibytes;
+
     @Override
     public void execute(NodeProbe probe)
     {
-        probe.setInterDCStreamThroughput(interDCStreamThroughput);
+        if (setEntireSSTableThroughput && interDCStreamThroughputInMebibytes)
+            throw new IllegalArgumentException("You cannot use -e and -m at the same time");
+
+        if (setEntireSSTableThroughput)
+            probe.setEntireSSTableInterDCStreamThroughput(interDCStreamThroughput);
+        else if (interDCStreamThroughputInMebibytes )
+            probe.setInterDCStreamThroughputMiB(interDCStreamThroughput);
+        else
+            probe.setInterDCStreamThroughput(interDCStreamThroughput);
     }
 }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetLoggingLevel.java b/src/java/org/apache/cassandra/tools/nodetool/SetLoggingLevel.java
index 8d9ad90..66d6283 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetLoggingLevel.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetLoggingLevel.java
@@ -100,4 +100,4 @@
         for (String classQualifier : classQualifiers)
             probe.setLoggingLevel(classQualifier, level);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetSnapshotThrottle.java b/src/java/org/apache/cassandra/tools/nodetool/SetSnapshotThrottle.java
index a4c49b8..045ccc1 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetSnapshotThrottle.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetSnapshotThrottle.java
@@ -33,4 +33,4 @@
     {
         probe.setSnapshotLinksPerSecond(snapshotThrottle);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetStreamThroughput.java b/src/java/org/apache/cassandra/tools/nodetool/SetStreamThroughput.java
index 469ec95..210a736 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetStreamThroughput.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetStreamThroughput.java
@@ -19,20 +19,36 @@
 
 import io.airlift.airline.Arguments;
 import io.airlift.airline.Command;
-
+import io.airlift.airline.Option;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
-@Command(name = "setstreamthroughput", description = "Set the Mb/s throughput cap for streaming in the system, or 0 to disable throttling")
+@Command(name = "setstreamthroughput", description = "Set throughput cap for streaming and entire SSTable streaming in the system, or 0 to disable throttling")
 public class SetStreamThroughput extends NodeToolCmd
 {
     @SuppressWarnings("UnusedDeclaration")
-    @Arguments(title = "stream_throughput", usage = "<value_in_mb>", description = "Value in Mb, 0 to disable throttling", required = true)
+    @Arguments(title = "stream_throughput", usage = "<value_in_mb>", description = "Value in megabits, 0 to disable throttling", required = true)
     private int streamThroughput;
 
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-e", "--entire-sstable-throughput" }, description = "Set entire SSTable streaming throughput in MiB/s")
+    private boolean setEntireSSTableThroughput;
+
+    @SuppressWarnings("UnusedDeclaration")
+    @Option(name = { "-m", "--mib" }, description = "Set streaming throughput in MiB/s")
+    private boolean streamThroughputInMebibytes;
+
     @Override
     public void execute(NodeProbe probe)
     {
-        probe.setStreamThroughput(streamThroughput);
+        if (setEntireSSTableThroughput && streamThroughputInMebibytes)
+            throw new IllegalArgumentException("You cannot use -e and -m at the same time");
+
+        if (setEntireSSTableThroughput)
+            probe.setEntireSSTableStreamThroughput(streamThroughput);
+        else if (streamThroughputInMebibytes )
+            probe.setStreamThroughputMiB(streamThroughput);
+        else
+            probe.setStreamThroughput(streamThroughput);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/SetTraceProbability.java b/src/java/org/apache/cassandra/tools/nodetool/SetTraceProbability.java
index e081980..ef9f498 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/SetTraceProbability.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/SetTraceProbability.java
@@ -36,4 +36,4 @@
         checkArgument(traceProbability >= 0 && traceProbability <= 1, "Trace probability must be between 0 and 1");
         probe.setTraceProbability(traceProbability);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Sjk.java b/src/java/org/apache/cassandra/tools/nodetool/Sjk.java
index 3ad2c94..d7f7a04 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Sjk.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Sjk.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.tools.nodetool;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.lang.reflect.Field;
@@ -57,6 +56,7 @@
 import com.beust.jcommander.Parameterized;
 import io.airlift.airline.Arguments;
 import io.airlift.airline.Command;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.tools.Output;
 import org.gridkit.jvmtool.JmxConnectionInfo;
 import org.gridkit.jvmtool.cli.CommandLauncher;
@@ -464,15 +464,15 @@
             {
                 // loop through files in classpath
                 File dir = new File(packageURL.getFile());
-                String cp = dir.getCanonicalPath();
+                String cp = dir.canonicalPath();
                 File root = dir;
                 while (true)
                 {
-                    if (cp.equals(new File(root, path).getCanonicalPath()))
+                    if (cp.equals(new File(root, path).canonicalPath()))
                     {
                         break;
                     }
-                    root = root.getParentFile();
+                    root = root.parent();
                 }
                 listFiles(results, root, dir);
             }
@@ -480,10 +480,10 @@
 
         static void listFiles(List<String> names, File root, File dir)
         {
-            String rootPath = root.getAbsolutePath();
+            String rootPath = root.absolutePath();
             if (dir.exists() && dir.isDirectory())
             {
-                for (File file : dir.listFiles())
+                for (File file : dir.tryList())
                 {
                     if (file.isDirectory())
                     {
@@ -491,7 +491,7 @@
                     }
                     else
                     {
-                        String name = file.getAbsolutePath().substring(rootPath.length() + 1);
+                        String name = file.absolutePath().substring(rootPath.length() + 1);
                         name = name.replace('\\', '/');
                         names.add(name);
                     }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java b/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java
index ac485ea..52cc5df 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Snapshot.java
@@ -17,13 +17,6 @@
  */
 package org.apache.cassandra.tools.nodetool;
 
-import static com.google.common.collect.Iterables.toArray;
-import static org.apache.commons.lang3.StringUtils.join;
-import io.airlift.airline.Arguments;
-import io.airlift.airline.Command;
-import io.airlift.airline.Option;
-
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
 import java.util.ArrayList;
@@ -31,9 +24,18 @@
 import java.util.List;
 import java.util.Map;
 
+import io.airlift.airline.Arguments;
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
+import org.apache.cassandra.config.DurationSpec;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
 
+import static com.google.common.collect.Iterables.toArray;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.commons.lang3.StringUtils.join;
+
 @Command(name = "snapshot", description = "Take a snapshot of specified keyspaces or a snapshot of the specified table")
 public class Snapshot extends NodeToolCmd
 {
@@ -44,7 +46,7 @@
     private String table = null;
 
     @Option(title = "tag", name = {"-t", "--tag"}, description = "The name of the snapshot")
-    private String snapshotName = Long.toString(System.currentTimeMillis());
+    private String snapshotName = Long.toString(currentTimeMillis());
 
     @Option(title = "ktlist", name = { "-kt", "--kt-list", "-kc", "--kc.list" }, description = "The list of Keyspace.table to take snapshot.(you must not specify only keyspace)")
     private String ktList = null;
@@ -52,6 +54,9 @@
     @Option(title = "skip-flush", name = {"-sf", "--skip-flush"}, description = "Do not flush memtables before snapshotting (snapshot will not contain unflushed data)")
     private boolean skipFlush = false;
 
+    @Option(title = "ttl", name = {"--ttl"}, description = "Specify a TTL of created snapshot")
+    private String ttl = null;
+
     @Override
     public void execute(NodeProbe probe)
     {
@@ -64,10 +69,14 @@
 
             Map<String, String> options = new HashMap<String,String>();
             options.put("skipFlush", Boolean.toString(skipFlush));
+            if (null != ttl) {
+                DurationSpec.LongNanosecondsBound d = new DurationSpec.LongNanosecondsBound(ttl);
+                options.put("ttl", d.toString());
+            }
 
-            if (!snapshotName.isEmpty() && snapshotName.contains(File.pathSeparator))
+            if (!snapshotName.isEmpty() && snapshotName.contains(File.pathSeparator()))
             {
-                throw new IOException("Snapshot name cannot contain " + File.pathSeparatorChar);
+                throw new IOException("Snapshot name cannot contain " + File.pathSeparator());
             }
             // Create a separate path for kclist to avoid breaking of already existing scripts
             if (null != ktList && !ktList.isEmpty())
diff --git a/src/java/org/apache/cassandra/tools/nodetool/TpStats.java b/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
index 5b20b13..1d16d8d 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/TpStats.java
@@ -22,8 +22,6 @@
 import io.airlift.airline.Option;
 import org.apache.cassandra.tools.NodeProbe;
 import org.apache.cassandra.tools.NodeTool.NodeToolCmd;
-import org.apache.cassandra.tools.nodetool.stats.TpStatsHolder;
-import org.apache.cassandra.tools.nodetool.stats.TpStatsPrinter;
 import org.apache.cassandra.tools.nodetool.stats.*;
 
 
diff --git a/src/java/org/apache/cassandra/tools/nodetool/TruncateHints.java b/src/java/org/apache/cassandra/tools/nodetool/TruncateHints.java
index a3a0049..2a19d3a 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/TruncateHints.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/TruncateHints.java
@@ -38,4 +38,4 @@
         else
             probe.truncateHints(endpoint);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/UpgradeSSTable.java b/src/java/org/apache/cassandra/tools/nodetool/UpgradeSSTable.java
index ba1b6f5..cc94d8b 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/UpgradeSSTable.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/UpgradeSSTable.java
@@ -33,9 +33,16 @@
     @Arguments(usage = "[<keyspace> <tables>...]", description = "The keyspace followed by one or many tables")
     private List<String> args = new ArrayList<>();
 
-    @Option(title = "include_all", name = {"-a", "--include-all-sstables"}, description = "Use -a to include all sstables, even those already on the current version")
+    @Option(title = "include_all",
+            name = {"-a", "--include-all-sstables"},
+            description = "Use -a to include all sstables, even those already on the current version")
     private boolean includeAll = false;
 
+    @Option(title = "max_timestamp",
+            name = {"-t", "--max-timestamp"},
+            description = "Use -t to compact only SSTables that have local creation time _older_ than the given timestamp")
+    private long maxSSTableTimestamp = Long.MAX_VALUE;
+
     @Option(title = "jobs",
             name = {"-j", "--jobs"},
             description = "Number of sstables to upgrade simultanously, set to 0 to use all available compaction threads")
@@ -51,7 +58,7 @@
         {
             try
             {
-                probe.upgradeSSTables(probe.output().out, keyspace, !includeAll, jobs, tableNames);
+                probe.upgradeSSTables(probe.output().out, keyspace, !includeAll, maxSSTableTimestamp, jobs, tableNames);
             }
             catch (Exception e)
             {
diff --git a/src/java/org/apache/cassandra/tools/nodetool/Verify.java b/src/java/org/apache/cassandra/tools/nodetool/Verify.java
index 872a124..0a610b3 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/Verify.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/Verify.java
@@ -44,6 +44,11 @@
             description = "Also check that all sstables are the latest version")
     private boolean checkVersion = false;
 
+    @Option(title = "override-disable",
+    name = {"-f", "--force"},
+    description = "Override disabling of verify tool - see CASSANDRA-9947 for caveats")
+    private boolean overrideDisable = false;
+
     @Option(title = "dfp",
             name = {"-d", "--dfp"},
             description = "Invoke the disk failure policy if a corrupt sstable is found")
@@ -68,6 +73,12 @@
     public void execute(NodeProbe probe)
     {
         PrintStream out = probe.output().out;
+        if (!overrideDisable)
+        {
+            out.println("verify is disabled unless a [-f|--force] override flag is provided. See CASSANDRA-9947 and CASSANDRA-17017 for details.");
+            System.exit(1);
+        }
+
         List<String> keyspaces = parseOptionalKeyspace(args, probe);
         String[] tableNames = parseOptionalTables(args);
 
diff --git a/src/java/org/apache/cassandra/tools/nodetool/formatter/TableBuilder.java b/src/java/org/apache/cassandra/tools/nodetool/formatter/TableBuilder.java
index 166ed3d..a95cb9e 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/formatter/TableBuilder.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/formatter/TableBuilder.java
@@ -18,7 +18,11 @@
 
 package org.apache.cassandra.tools.nodetool.formatter;
 
+import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
+import java.io.UncheckedIOException;
+import java.io.UnsupportedEncodingException;
+import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -72,6 +76,11 @@
         this.rows.addAll(base.rows);
     }
 
+    public void add(@Nonnull List<String> row)
+    {
+        add(row.toArray(new String[0]));
+    }
+
     public void add(@Nonnull String... row)
     {
         Objects.requireNonNull(row);
@@ -116,6 +125,22 @@
         }
     }
 
+    @Override
+    public String toString()
+    {
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        try (PrintStream stream = new PrintStream(os, true, StandardCharsets.UTF_8.displayName()))
+        {
+            printTo(stream);
+            stream.flush();
+            return os.toString(StandardCharsets.UTF_8.displayName());
+        }
+        catch (UnsupportedEncodingException e)
+        {
+            throw new UncheckedIOException(e);
+        }
+    }
+
     /**
      * Share max offsets across multiple TableBuilders
      */
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/DataPathsHolder.java b/src/java/org/apache/cassandra/tools/nodetool/stats/DataPathsHolder.java
new file mode 100644
index 0000000..9bf7bdb
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/DataPathsHolder.java
@@ -0,0 +1,84 @@
+/*
+ * 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.tools.nodetool.stats;
+
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import static com.google.common.base.Throwables.getStackTraceAsString;
+
+import org.apache.cassandra.db.ColumnFamilyStoreMBean;
+import org.apache.cassandra.tools.NodeProbe;
+
+public class DataPathsHolder implements StatsHolder
+{
+    public final Map<String, Object> pathsHash = new HashMap<>();
+
+    public DataPathsHolder(NodeProbe probe, List<String> tableNames)
+    {
+        Iterator<Map.Entry<String, ColumnFamilyStoreMBean>> mbeansIterator = probe.getColumnFamilyStoreMBeanProxies();
+        while (mbeansIterator.hasNext())
+        {
+            Map.Entry<String, ColumnFamilyStoreMBean> entry = mbeansIterator.next();
+            String keyspaceName = entry.getKey();
+            String tableName = entry.getValue().getTableName();
+
+            if (!(tableNames.isEmpty() || 
+                  tableNames.contains(keyspaceName + '.' + tableName) || 
+                  tableNames.contains(keyspaceName) ))
+            {
+                continue;
+            }
+
+            Map<String, List<String>> ksPaths;
+            List<String> dataPaths;
+
+            try
+            {
+                dataPaths = entry.getValue().getDataPaths();
+            }
+            catch (Throwable e)
+            {
+                probe.output().err.println("Failed to get data paths for " + keyspaceName + '.' + tableName + ". Skipped.");
+                probe.output().err.println("error: " + e.getMessage());
+                probe.output().err.println("-- StackTrace --");
+                probe.output().err.println(getStackTraceAsString(e));
+                continue;
+            }
+
+            if (pathsHash.containsKey(keyspaceName))
+            {
+                ksPaths = (Map<String, List<String>>) pathsHash.get(keyspaceName);
+            }
+            else
+            {
+                ksPaths = new HashMap<>();
+                pathsHash.put(keyspaceName, ksPaths);
+            }
+            ksPaths.put(tableName, dataPaths);
+        }
+    }
+
+    @Override
+    public Map<String, Object> convert2Map()
+    {
+        return pathsHash;
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/DataPathsPrinter.java b/src/java/org/apache/cassandra/tools/nodetool/stats/DataPathsPrinter.java
new file mode 100644
index 0000000..ba2b29e
--- /dev/null
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/DataPathsPrinter.java
@@ -0,0 +1,63 @@
+/*
+ * 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.tools.nodetool.stats;
+
+import java.io.PrintStream;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+public class DataPathsPrinter<T extends StatsHolder>
+{
+    public static StatsPrinter<DataPathsHolder> from(String format)
+    {
+        if ("json".equals(format))
+            return new StatsPrinter.JsonPrinter<>();
+        if ("yaml".equals(format))
+            return new StatsPrinter.YamlPrinter<>();
+
+        return new DefaultPrinter();
+    }
+
+    public static class DefaultPrinter implements StatsPrinter<DataPathsHolder>
+    {
+        @Override
+        public void print(DataPathsHolder data, PrintStream out)
+        {
+            Iterator<Map.Entry<String, Object>> iterator = data.pathsHash.entrySet().iterator();
+
+            while (iterator.hasNext())
+            {
+                Map.Entry<String, Object> entry = iterator.next();
+
+                out.println("Keyspace: " + entry.getKey());
+                Map<String, List<String>> ksPaths = (Map<String, List<String>>) entry.getValue();
+                for (Map.Entry<String, List<String>> table : ksPaths.entrySet())
+                {
+                    out.println("\tTable: " + table.getKey());
+                    out.println("\tPaths:");
+
+                    for (String path : table.getValue())
+                        out.println("\t\t" + path);
+
+                    out.println("");
+                }
+            }
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsHolder.java b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsHolder.java
index c35e1fe..a345ce0 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsHolder.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsHolder.java
@@ -26,4 +26,4 @@
 public interface StatsHolder
 {
     public Map<String, Object> convert2Map();
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsKeyspace.java b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsKeyspace.java
index dc15332..89d7705 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsKeyspace.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsKeyspace.java
@@ -75,4 +75,4 @@
                ? totalWriteTime / writeCount / 1000
                : Double.NaN;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsPrinter.java b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsPrinter.java
index 389efba..037227b 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsPrinter.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsPrinter.java
@@ -66,4 +66,4 @@
             out.println(yaml.dump(data.convert2Map()));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsTable.java b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsTable.java
index 0859327..8b5090b 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/StatsTable.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/StatsTable.java
@@ -20,6 +20,7 @@
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.Map;
 
 public class StatsTable
 {
@@ -69,6 +70,11 @@
     public long maximumTombstonesPerSliceLastFiveMinutes;
     public String droppedMutations;
     public List<String> sstablesInEachLevel = new ArrayList<>();
+    public List<String> sstableBytesInEachLevel = new ArrayList<>();
     public Boolean isInCorrectLocation = null; // null: option not active
     public double droppableTombstoneRatio;
+    public Map<String, String> topSizePartitions;
+    public Map<String, Long> topTombstonePartitions;
+    public String topSizePartitionsLastUpdate;
+    public String topTombstonePartitionsLastUpdate;
 }
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsHolder.java b/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsHolder.java
index 3cd2570..60132d1 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsHolder.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsHolder.java
@@ -18,6 +18,8 @@
 
 package org.apache.cassandra.tools.nodetool.stats;
 
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 import com.google.common.collect.ArrayListMultimap;
@@ -120,6 +122,7 @@
         mpTable.put("sstable_count", table.sstableCount);
         mpTable.put("old_sstable_count", table.oldSSTableCount);
         mpTable.put("sstables_in_each_level", table.sstablesInEachLevel);
+        mpTable.put("sstable_bytes_in_each_level", table.sstableBytesInEachLevel);
         mpTable.put("space_used_live", table.spaceUsedLive);
         mpTable.put("space_used_total", table.spaceUsedTotal);
         mpTable.put("space_used_by_snapshots_total", table.spaceUsedBySnapshotsTotal);
@@ -165,6 +168,8 @@
         mpTable.put("dropped_mutations", table.droppedMutations);
         mpTable.put("droppable_tombstone_ratio",
                     String.format("%01.5f", table.droppableTombstoneRatio));
+        mpTable.put("top_size_partitions", table.topSizePartitions);
+        mpTable.put("top_tombstone_partitions", table.topTombstonePartitions);
         if (locationCheck)
             mpTable.put("sstables_in_correct_location", table.isInCorrectLocation);
         return mpTable;
@@ -239,6 +244,17 @@
                     }
                 }
 
+                long[] leveledSSTablesBytes = table.getPerLevelSizeBytes();
+                if (leveledSSTablesBytes != null)
+                {
+                    statsTable.isLeveledSstable = true;
+                    for (int level = 0; level < leveledSSTablesBytes.length; level++)
+                    {
+                        long size = leveledSSTablesBytes[level];
+                        statsTable.sstableBytesInEachLevel.add(format(size, humanReadable));
+                    }
+                }
+
                 if (locationCheck)
                     statsTable.isInCorrectLocation = !table.hasMisplacedSSTables();
 
@@ -350,6 +366,13 @@
                 statsTable.maximumTombstonesPerSliceLastFiveMinutes = histogram.getMax();
                 statsTable.droppedMutations = format((Long) probe.getColumnFamilyMetric(keyspaceName, tableName, "DroppedMutations"), humanReadable);
                 statsTable.droppableTombstoneRatio = probe.getDroppableTombstoneRatio(keyspaceName, tableName);
+                statsTable.topSizePartitions = format(table.getTopSizePartitions(), humanReadable);
+                if (table.getTopSizePartitionsLastUpdate() != null)
+                    statsTable.topSizePartitionsLastUpdate = millisToDateString(table.getTopSizePartitionsLastUpdate());
+                statsTable.topTombstonePartitions = table.getTopTombstonePartitions();
+                if (table.getTopTombstonePartitionsLastUpdate() != null)
+                    statsTable.topTombstonePartitionsLastUpdate = millisToDateString(table.getTopTombstonePartitionsLastUpdate());
+
                 statsKeyspace.tables.add(statsTable);
             }
             keyspaces.add(statsKeyspace);
@@ -361,6 +384,22 @@
         return humanReadable ? FileUtils.stringifyFileSize(bytes) : Long.toString(bytes);
     }
 
+    private Map<String, String> format(Map<String, Long> map, boolean humanReadable)
+    {
+        LinkedHashMap<String, String> retMap = new LinkedHashMap<>();
+        for (Map.Entry<String, Long> entry : map.entrySet())
+            retMap.put(entry.getKey(), format(entry.getValue(), humanReadable));
+        return retMap;
+    }
+
+    private String millisToDateString(long millis)
+    {
+        TimeZone tz = TimeZone.getTimeZone("UTC");
+        DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
+        df.setTimeZone(tz);
+        return df.format(new Date(millis));
+    }
+
     /**
      * Sort and filter this TableStatHolder's tables as specified by its sortKey and top attributes.
      */
@@ -447,7 +486,7 @@
             return filter.get(keyspace) != null || ignoreMode;
         }
 
-        public void verifyKeyspaces(List<String> keyspaces)
+        public void verifyKeyspaces(Collection<String> keyspaces)
         {
             for (String ks : verifier.keySet())
                 if (!keyspaces.contains(ks))
diff --git a/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinter.java b/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinter.java
index d8e4d4a..7f17c21 100644
--- a/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinter.java
+++ b/src/java/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinter.java
@@ -20,6 +20,7 @@
 
 import java.io.PrintStream;
 import java.util.List;
+import java.util.Map;
 
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -79,8 +80,12 @@
             out.println(indent + "SSTable count: " + table.sstableCount);
             out.println(indent + "Old SSTable count: " + table.oldSSTableCount);
             if (table.isLeveledSstable)
+            {
                 out.println(indent + "SSTables in each level: [" + String.join(", ",
-                                                                          table.sstablesInEachLevel) + "]");
+                                                                               table.sstablesInEachLevel) + "]");
+                out.println(indent + "SSTable bytes in each level: [" + String.join(", ",
+                                                                                    table.sstableBytesInEachLevel) + "]");
+            }
 
             out.println(indent + "Space used (live): " + table.spaceUsedLive);
             out.println(indent + "Space used (total): " + table.spaceUsedTotal);
@@ -129,6 +134,23 @@
             out.printf(indent + "Droppable tombstone ratio: %01.5f%n", table.droppableTombstoneRatio);
             if (table.isInCorrectLocation != null)
                 out.println(indent + "SSTables in correct location: " + table.isInCorrectLocation);
+            if (table.topSizePartitions != null && !table.topSizePartitions.isEmpty())
+            {
+                out.printf(indent + "Top partitions by size (last update: %s):%n", table.topSizePartitionsLastUpdate);
+                int maxWidth = Math.max(table.topSizePartitions.keySet().stream().map(String::length).max(Integer::compareTo).get() + 3, 5);
+                out.printf(indent + "  %-" + maxWidth + "s %s%n", "Key", "Size");
+                for (Map.Entry<String, String> size : table.topSizePartitions.entrySet())
+                    out.printf(indent + "  %-" + maxWidth + "s %s%n", size.getKey(), size.getValue());
+            }
+
+            if (table.topTombstonePartitions != null && !table.topTombstonePartitions.isEmpty())
+            {
+                out.printf(indent + "Top partitions by tombstone count (last update: %s):%n", table.topTombstonePartitionsLastUpdate);
+                int maxWidth = Math.max(table.topTombstonePartitions.keySet().stream().map(String::length).max(Integer::compareTo).get() + 3, 5);
+                out.printf(indent + "  %-" + maxWidth + "s %s%n", "Key", "Count");
+                for (Map.Entry<String, Long> tombstonecnt : table.topTombstonePartitions.entrySet())
+                    out.printf(indent + "  %-" + maxWidth + "s %s%n", tombstonecnt.getKey(), tombstonecnt.getValue());
+            }
             out.println("");
         }
     }
diff --git a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java
index c2e74d8..c6ca1f2 100644
--- a/src/java/org/apache/cassandra/tracing/TraceKeyspace.java
+++ b/src/java/org/apache/cassandra/tracing/TraceKeyspace.java
@@ -21,7 +21,9 @@
 import java.nio.ByteBuffer;
 import java.util.*;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.rows.Row;
@@ -33,9 +35,9 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.Tables;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
 
 import static java.lang.String.format;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public final class TraceKeyspace
 {
@@ -43,6 +45,8 @@
     {
     }
 
+    private static final int DEFAULT_RF = CassandraRelevantProperties.SYSTEM_TRACES_DEFAULT_RF.getInt();
+
     /**
      * Generation is used as a timestamp for automatic table creation on startup.
      * If you make any changes to the tables below, make sure to increment the
@@ -102,7 +106,7 @@
 
     public static KeyspaceMetadata metadata()
     {
-        return KeyspaceMetadata.create(SchemaConstants.TRACE_KEYSPACE_NAME, KeyspaceParams.simple(2), Tables.of(Sessions, Events));
+        return KeyspaceMetadata.create(SchemaConstants.TRACE_KEYSPACE_NAME, KeyspaceParams.simple(Math.max(DEFAULT_RF, DatabaseDescriptor.getDefaultKeyspaceRF())), Tables.of(Sessions, Events));
     }
 
     static Mutation makeStartSessionMutation(ByteBuffer sessionId,
@@ -117,9 +121,9 @@
         Row.SimpleBuilder rb = builder.row();
         rb.ttl(ttl)
           .add("client", client)
-          .add("coordinator", FBUtilities.getBroadcastAddressAndPort().address);
+          .add("coordinator", FBUtilities.getBroadcastAddressAndPort().getAddress());
         if (!Gossiper.instance.hasMajorVersion3Nodes())
-            rb.add("coordinator_port", FBUtilities.getBroadcastAddressAndPort().port);
+            rb.add("coordinator_port", FBUtilities.getBroadcastAddressAndPort().getPort());
         rb.add("request", request)
           .add("started_at", new Date(startedAt))
           .add("command", command)
@@ -140,13 +144,13 @@
     static Mutation makeEventMutation(ByteBuffer sessionId, String message, int elapsed, String threadName, int ttl)
     {
         PartitionUpdate.SimpleBuilder builder = PartitionUpdate.simpleBuilder(Events, sessionId);
-        Row.SimpleBuilder rowBuilder = builder.row(UUIDGen.getTimeUUID())
+        Row.SimpleBuilder rowBuilder = builder.row(nextTimeUUID())
                                               .ttl(ttl);
 
         rowBuilder.add("activity", message)
-                  .add("source", FBUtilities.getBroadcastAddressAndPort().address);
+                  .add("source", FBUtilities.getBroadcastAddressAndPort().getAddress());
         if (!Gossiper.instance.hasMajorVersion3Nodes())
-            rowBuilder.add("source_port", FBUtilities.getBroadcastAddressAndPort().port);
+            rowBuilder.add("source_port", FBUtilities.getBroadcastAddressAndPort().getPort());
         rowBuilder.add("thread", threadName);
 
         if (elapsed >= 0)
diff --git a/src/java/org/apache/cassandra/tracing/TraceState.java b/src/java/org/apache/cassandra/tracing/TraceState.java
index 1e0813c..1713369 100644
--- a/src/java/org/apache/cassandra/tracing/TraceState.java
+++ b/src/java/org/apache/cassandra/tracing/TraceState.java
@@ -19,7 +19,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -28,7 +27,8 @@
 import org.slf4j.helpers.MessageFormatter;
 
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 import org.apache.cassandra.utils.progress.ProgressEvent;
 import org.apache.cassandra.utils.progress.ProgressEventNotifier;
 import org.apache.cassandra.utils.progress.ProgressListener;
@@ -39,7 +39,7 @@
  */
 public abstract class TraceState implements ProgressEventNotifier
 {
-    public final UUID sessionId;
+    public final TimeUUID sessionId;
     public final InetAddressAndPort coordinator;
     public final Stopwatch watch;
     public final ByteBuffer sessionIdBytes;
@@ -63,14 +63,14 @@
     // See CASSANDRA-7626 for more details.
     private final AtomicInteger references = new AtomicInteger(1);
 
-    protected TraceState(InetAddressAndPort coordinator, UUID sessionId, Tracing.TraceType traceType)
+    protected TraceState(InetAddressAndPort coordinator, TimeUUID sessionId, Tracing.TraceType traceType)
     {
         assert coordinator != null;
         assert sessionId != null;
 
         this.coordinator = coordinator;
         this.sessionId = sessionId;
-        sessionIdBytes = ByteBufferUtil.bytes(sessionId);
+        sessionIdBytes = sessionId.toBytes();
         this.traceType = traceType;
         this.ttl = traceType.getTTL();
         watch = Stopwatch.createStarted();
@@ -134,7 +134,7 @@
             }
             catch (InterruptedException e)
             {
-                throw new RuntimeException();
+                throw new UncheckedInterruptedException(e);
             }
         }
         if (status == Status.ACTIVE)
diff --git a/src/java/org/apache/cassandra/tracing/TraceStateImpl.java b/src/java/org/apache/cassandra/tracing/TraceStateImpl.java
index 48f193c..f8691ee 100644
--- a/src/java/org/apache/cassandra/tracing/TraceStateImpl.java
+++ b/src/java/org/apache/cassandra/tracing/TraceStateImpl.java
@@ -17,12 +17,9 @@
  */
 package org.apache.cassandra.tracing;
 
-import java.util.Collections;
+import java.util.Arrays;
 import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
@@ -31,13 +28,18 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.concurrent.Stage;
-import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.exceptions.OverloadedException;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.utils.JVMStabilityInspector;
-import org.apache.cassandra.utils.WrappedRunnable;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
+
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.db.ConsistencyLevel.ANY;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 /**
  * ThreadLocal state for a tracing session. The presence of an instance of this class as a ThreadLocal denotes that an
@@ -53,7 +55,7 @@
 
     private final Set<Future<?>> pendingFutures = ConcurrentHashMap.newKeySet();
 
-    public TraceStateImpl(InetAddressAndPort coordinator, UUID sessionId, Tracing.TraceType traceType)
+    public TraceStateImpl(InetAddressAndPort coordinator, TimeUUID sessionId, Tracing.TraceType traceType)
     {
         super(coordinator, sessionId, traceType);
     }
@@ -82,8 +84,8 @@
                 logger.trace("Waiting for up to {} seconds for {} trace events to complete",
                              +WAIT_FOR_PENDING_EVENTS_TIMEOUT_SECS, pendingFutures.size());
 
-            CompletableFuture.allOf(pendingFutures.toArray(new CompletableFuture<?>[pendingFutures.size()]))
-                             .get(WAIT_FOR_PENDING_EVENTS_TIMEOUT_SECS, TimeUnit.SECONDS);
+            FutureCombiner.allOf(Arrays.asList(pendingFutures.toArray(new Future<?>[pendingFutures.size()])))
+                          .get(WAIT_FOR_PENDING_EVENTS_TIMEOUT_SECS, TimeUnit.SECONDS);
         }
         catch (TimeoutException ex)
         {
@@ -101,14 +103,7 @@
 
     void executeMutation(final Mutation mutation)
     {
-        CompletableFuture<Void> fut = CompletableFuture.runAsync(new WrappedRunnable()
-        {
-            protected void runMayThrow()
-            {
-                mutateWithCatch(mutation);
-            }
-        }, Stage.TRACING.executor());
-
+        Future<Void> fut = Stage.TRACING.executor().submit(() -> mutateWithCatch(mutation), null);
         boolean ret = pendingFutures.add(fut);
         if (!ret)
             logger.warn("Failed to insert pending future, tracing synchronization may not work");
@@ -118,7 +113,7 @@
     {
         try
         {
-            StorageProxy.mutate(Collections.singletonList(mutation), ConsistencyLevel.ANY, System.nanoTime());
+            StorageProxy.mutate(singletonList(mutation), ANY, nanoTime());
         }
         catch (OverloadedException e)
         {
diff --git a/src/java/org/apache/cassandra/tracing/Tracing.java b/src/java/org/apache/cassandra/tracing/Tracing.java
index 7d72224..5c820db 100644
--- a/src/java/org/apache/cassandra/tracing/Tracing.java
+++ b/src/java/org/apache/cassandra/tracing/Tracing.java
@@ -24,17 +24,14 @@
 import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.netty.util.concurrent.FastThreadLocal;
-import org.apache.cassandra.concurrent.ExecutorLocal;
+import org.apache.cassandra.concurrent.ExecutorLocals;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.marshal.TimeUUIDType;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
@@ -43,14 +40,15 @@
 import org.apache.cassandra.net.ParamType;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * A trace session context. Able to track and store trace sessions. A session is usually a user initiated query, and may
  * have multiple local and remote events before it is completed.
  */
-public abstract class Tracing implements ExecutorLocal<TraceState>
+public abstract class Tracing extends ExecutorLocals.Impl
 {
     public static final IVersionedSerializer<TraceType> traceTypeSerializer = new IVersionedSerializer<TraceType>()
     {
@@ -105,9 +103,7 @@
 
     private final InetAddressAndPort localAddress = FBUtilities.getLocalAddressAndPort();
 
-    private final FastThreadLocal<TraceState> state = new FastThreadLocal<>();
-
-    protected final ConcurrentMap<UUID, TraceState> sessions = new ConcurrentHashMap<>();
+    protected final ConcurrentMap<TimeUUID, TraceState> sessions = new ConcurrentHashMap<>();
 
     public static final Tracing instance;
 
@@ -131,22 +127,22 @@
         instance = null != tracing ? tracing : new TracingImpl();
     }
 
-    public UUID getSessionId()
+    public TimeUUID getSessionId()
     {
         assert isTracing();
-        return state.get().sessionId;
+        return get().sessionId;
     }
 
     public TraceType getTraceType()
     {
         assert isTracing();
-        return state.get().traceType;
+        return get().traceType;
     }
 
     public int getTTL()
     {
         assert isTracing();
-        return state.get().ttl;
+        return get().ttl;
     }
 
     /**
@@ -157,29 +153,29 @@
         return instance.get() != null;
     }
 
-    public UUID newSession(Map<String,ByteBuffer> customPayload)
+    public TimeUUID newSession(Map<String,ByteBuffer> customPayload)
     {
         return newSession(
-                TimeUUIDType.instance.compose(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes())),
+                nextTimeUUID(),
                 TraceType.QUERY,
                 customPayload);
     }
 
-    public UUID newSession(TraceType traceType)
+    public TimeUUID newSession(TraceType traceType)
     {
         return newSession(
-                TimeUUIDType.instance.compose(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes())),
+                nextTimeUUID(),
                 traceType,
                 Collections.EMPTY_MAP);
     }
 
-    public UUID newSession(UUID sessionId, Map<String,ByteBuffer> customPayload)
+    public TimeUUID newSession(TimeUUID sessionId, Map<String,ByteBuffer> customPayload)
     {
         return newSession(sessionId, TraceType.QUERY, customPayload);
     }
 
     /** This method is intended to be overridden in tracing implementations that need access to the customPayload */
-    protected UUID newSession(UUID sessionId, TraceType traceType, Map<String,ByteBuffer> customPayload)
+    protected TimeUUID newSession(TimeUUID sessionId, TraceType traceType, Map<String,ByteBuffer> customPayload)
     {
         assert get() == null;
 
@@ -221,17 +217,19 @@
 
     public TraceState get()
     {
-        return state.get();
+        return ExecutorLocals.current().traceState;
     }
 
-    public TraceState get(UUID sessionId)
+    public TraceState get(TimeUUID sessionId)
     {
         return sessions.get(sessionId);
     }
 
-    public void set(final TraceState tls)
+    public void set(TraceState tls)
     {
-        state.set(tls);
+        @SuppressWarnings("resource")
+        ExecutorLocals current = ExecutorLocals.current();
+        ExecutorLocals.Impl.set(tls, current.clientWarnState);
     }
 
     public TraceState begin(final String request, final Map<String, String> parameters)
@@ -248,7 +246,7 @@
      */
     public TraceState initializeFromMessage(final Message.Header header)
     {
-        final UUID sessionId = header.traceSession();
+        final TimeUUID sessionId = header.traceSession();
         if (sessionId == null)
             return null;
 
@@ -278,7 +276,7 @@
     {
         try
         {
-            final UUID sessionId = message.traceSession();
+            final TimeUUID sessionId = message.traceSession();
             if (sessionId == null)
                 return;
 
@@ -289,7 +287,7 @@
             if (state == null) // session may have already finished; see CASSANDRA-5668
             {
                 TraceType traceType = message.traceType();
-                trace(ByteBuffer.wrap(UUIDGen.decompose(sessionId)), logMessage, traceType.getTTL());
+                trace(sessionId.toBytes(), logMessage, traceType.getTTL());
             }
             else
             {
@@ -313,7 +311,7 @@
         return addToMutable;
     }
 
-    protected abstract TraceState newTraceState(InetAddressAndPort coordinator, UUID sessionId, Tracing.TraceType traceType);
+    protected abstract TraceState newTraceState(InetAddressAndPort coordinator, TimeUUID sessionId, Tracing.TraceType traceType);
 
     // repair just gets a varargs method since it's so heavyweight anyway
     public static void traceRepair(String format, Object... args)
diff --git a/src/java/org/apache/cassandra/tracing/TracingImpl.java b/src/java/org/apache/cassandra/tracing/TracingImpl.java
index c786fa2..1885146 100644
--- a/src/java/org/apache/cassandra/tracing/TracingImpl.java
+++ b/src/java/org/apache/cassandra/tracing/TracingImpl.java
@@ -22,12 +22,14 @@
 import java.net.InetAddress;
 import java.nio.ByteBuffer;
 import java.util.Map;
-import java.util.UUID;
 
 import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.WrappedRunnable;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 
 /**
  * A trace session context. Able to track and store trace sessions. A session is usually a user initiated query, and may
@@ -55,7 +57,7 @@
         final TraceStateImpl state = getStateImpl();
         assert state != null;
 
-        final long startedAt = System.currentTimeMillis();
+        final long startedAt = currentTimeMillis();
         final ByteBuffer sessionId = state.sessionIdBytes;
         final String command = state.traceType.toString();
         final int ttl = state.ttl;
@@ -93,7 +95,7 @@
     }
 
     @Override
-    protected TraceState newTraceState(InetAddressAndPort coordinator, UUID sessionId, TraceType traceType)
+    protected TraceState newTraceState(InetAddressAndPort coordinator, TimeUUID sessionId, TraceType traceType)
     {
         return new TraceStateImpl(coordinator, sessionId, traceType);
     }
diff --git a/src/java/org/apache/cassandra/transport/CBUtil.java b/src/java/org/apache/cassandra/transport/CBUtil.java
index fd6a0ff..6cab638 100644
--- a/src/java/org/apache/cassandra/transport/CBUtil.java
+++ b/src/java/org/apache/cassandra/transport/CBUtil.java
@@ -44,6 +44,7 @@
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.UUIDGen;
 
 /**
@@ -301,11 +302,24 @@
         return UUIDGen.getUUID(buffer);
     }
 
+    public static TimeUUID readTimeUUID(ByteBuf cb)
+    {
+        long msb = cb.readLong();
+        long lsb = cb.readLong();
+        return TimeUUID.fromBytes(msb, lsb);
+    }
+
     public static void writeUUID(UUID uuid, ByteBuf cb)
     {
         cb.writeBytes(UUIDGen.decompose(uuid));
     }
 
+    public static void writeUUID(TimeUUID uuid, ByteBuf cb)
+    {
+        cb.writeLong(uuid.msb());
+        cb.writeLong(uuid.lsb());
+    }
+
     public static int sizeOfUUID(UUID uuid)
     {
         return UUID_SIZE;
diff --git a/src/java/org/apache/cassandra/transport/CQLMessageHandler.java b/src/java/org/apache/cassandra/transport/CQLMessageHandler.java
index a9dba8b..09e9996 100644
--- a/src/java/org/apache/cassandra/transport/CQLMessageHandler.java
+++ b/src/java/org/apache/cassandra/transport/CQLMessageHandler.java
@@ -23,6 +23,8 @@
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.primitives.Ints;
+import org.apache.cassandra.transport.ClientResourceLimits.Overload;
+import org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,10 +44,9 @@
 import org.apache.cassandra.net.ShareableBytes;
 import org.apache.cassandra.transport.Flusher.FlushItem.Framed;
 import org.apache.cassandra.transport.messages.ErrorMessage;
-import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.NoSpamLogger;
 
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 /**
  * Implementation of {@link AbstractMessageHandler} for processing CQL messages which comprise a {@link Message} wrapped
@@ -78,6 +79,7 @@
     private static final NoSpamLogger noSpamLogger = NoSpamLogger.getLogger(logger, 1L, TimeUnit.SECONDS);
 
     public static final int LARGE_MESSAGE_THRESHOLD = FrameEncoder.Payload.MAX_SIZE - 1;
+    public static final TimeUnit RATE_LIMITER_DELAY_UNIT = TimeUnit.NANOSECONDS;
 
     private final Envelope.Decoder envelopeDecoder;
     private final Message.Decoder<M> messageDecoder;
@@ -86,13 +88,14 @@
     private final ErrorHandler errorHandler;
     private final boolean throwOnOverload;
     private final ProtocolVersion version;
+    private final NonBlockingRateLimiter requestRateLimiter;
 
     long channelPayloadBytesInFlight;
     private int consecutiveMessageErrors = 0;
 
     interface MessageConsumer<M extends Message>
     {
-        void accept(Channel channel, M message, Dispatcher.FlushItemConverter toFlushItem);
+        void accept(Channel channel, M message, Dispatcher.FlushItemConverter toFlushItem, Overload backpressure);
     }
 
     interface ErrorHandler
@@ -129,6 +132,7 @@
         this.errorHandler       = errorHandler;
         this.throwOnOverload    = throwOnOverload;
         this.version            = version;
+        this.requestRateLimiter = resources.requestRateLimiter();
     }
 
     @Override
@@ -139,6 +143,23 @@
         return super.process(frame);
     }
 
+    /**
+     * Checks limits on bytes in flight and the request rate limiter (if enabled), then takes one of three actions:
+     * 
+     * 1.) If no limits are breached, process the request.
+     * 2.) If a limit is breached, and the connection is configured to throw on overload, throw {@link OverloadedException}.
+     * 3.) If a limit is breached, and the connection is not configurd to throw, process the request, and return false
+     *     to let the {@link FrameDecoder} know it should stop processing frames.
+     *     
+     * If the connection is configured to throw {@link OverloadedException}, requests that breach the rate limit are
+     * not counted against that limit.
+     * 
+     * @return true if the {@link FrameDecoder} should continue to process incoming frames, and false if it should stop
+     *         processing them, effectively applying backpressure to clients
+     * 
+     * @throws ErrorMessage.WrappedException with an {@link OverloadedException} if overload occurs and the 
+     *         connection is configured to throw on overload
+     */
     protected boolean processOneContainedMessage(ShareableBytes bytes, Limit endpointReserve, Limit globalReserve)
     {
         ByteBuffer buf = bytes.get();
@@ -157,41 +178,108 @@
 
         // max CQL message size defaults to 256mb, so should be safe to downcast
         int messageSize = Ints.checkedCast(header.bodySizeInBytes);
+        
         if (throwOnOverload)
         {
             if (!acquireCapacity(header, endpointReserve, globalReserve))
             {
-                // discard the request and throw an exception
-                ClientMetrics.instance.markRequestDiscarded();
-                logger.trace("Discarded request of size: {}. InflightChannelRequestPayload: {}, " +
-                             "InflightEndpointRequestPayload: {}, InflightOverallRequestPayload: {}, Header: {}",
-                             messageSize,
-                             channelPayloadBytesInFlight,
-                             endpointReserve.using(),
-                             globalReserve.using(),
-                             header);
+                discardAndThrow(endpointReserve, globalReserve, buf, header, messageSize, Overload.BYTES_IN_FLIGHT);
+                return true;
+            }
 
-                handleError(new OverloadedException("Server is in overloaded state. " +
-                                                    "Cannot accept more requests at this point"), header);
-
-                // Don't stop processing incoming messages, rely on the client to apply
-                // backpressure when it receives OverloadedException
-                // but discard this message as we're responding with the overloaded error
-                incrementReceivedMessageMetrics(messageSize);
-                buf.position(buf.position() + Envelope.Header.LENGTH + messageSize);
+            if (DatabaseDescriptor.getNativeTransportRateLimitingEnabled() && !requestRateLimiter.tryReserve())
+            {
+                // We've already allocated against the bytes-in-flight limits, so release those resources.
+                release(header);
+                discardAndThrow(endpointReserve, globalReserve, buf, header, messageSize, Overload.REQUESTS);
                 return true;
             }
         }
-        else if (!acquireCapacityAndQueueOnFailure(header, endpointReserve, globalReserve))
+        else
         {
-            // set backpressure on the channel, queuing the request until we have capacity
-            ClientMetrics.instance.pauseConnection();
-            return false;
+            Overload backpressure = Overload.NONE;
+
+            if (!acquireCapacityAndQueueOnFailure(header, endpointReserve, globalReserve))
+            {
+                if (processRequestAndUpdateMetrics(bytes, header, messageSize, Overload.BYTES_IN_FLIGHT))
+                {
+                    if (decoder.isActive())
+                        ClientMetrics.instance.pauseConnection();
+                }
+
+                backpressure = Overload.BYTES_IN_FLIGHT;
+            }
+            
+            if (DatabaseDescriptor.getNativeTransportRateLimitingEnabled())
+            {
+                // Reserve a permit even if we've already triggered backpressure on bytes in flight.
+                long delay = requestRateLimiter.reserveAndGetDelay(RATE_LIMITER_DELAY_UNIT);
+                
+                if (backpressure == Overload.NONE && delay > 0)
+                {
+                    if (processRequestAndUpdateMetrics(bytes, header, messageSize, Overload.REQUESTS))
+                    {
+                        if (decoder.isActive())
+                            ClientMetrics.instance.pauseConnection();
+
+                        // Schedule a wakup here if we process successfully. The connection should be closing otherwise.  
+                        scheduleConnectionWakeupTask(delay, RATE_LIMITER_DELAY_UNIT);
+                    }
+                    
+                    backpressure = Overload.REQUESTS;
+                }
+            }
+            
+            // If we triggered backpressure, make sure the caller stops processing frames after the request completes.
+            if (backpressure != Overload.NONE)
+                return false;
         }
 
+        return processRequestAndUpdateMetrics(bytes, header, messageSize, Overload.NONE);
+    }
+
+    private boolean processRequestAndUpdateMetrics(ShareableBytes bytes, Envelope.Header header, int messageSize, Overload backpressure)
+    {
         channelPayloadBytesInFlight += messageSize;
         incrementReceivedMessageMetrics(messageSize);
-        return processRequest(composeRequest(header, bytes));
+        return processRequest(composeRequest(header, bytes), backpressure);
+    }
+
+    private void discardAndThrow(Limit endpointReserve, Limit globalReserve, 
+                                 ByteBuffer buf, Envelope.Header header, int messageSize,
+                                 Overload overload)
+    {
+        ClientMetrics.instance.markRequestDiscarded();
+        logOverload(endpointReserve, globalReserve, header, messageSize);
+
+        OverloadedException exception = buildOverloadedException(endpointReserve, globalReserve, overload);
+        handleError(exception, header);
+
+        // Don't stop processing incoming messages, as we rely on the client to apply
+        // backpressure when it receives OverloadedException, but discard this message 
+        // as we're responding with the overloaded error.
+        incrementReceivedMessageMetrics(messageSize);
+        buf.position(buf.position() + Envelope.Header.LENGTH + messageSize);
+    }
+
+    private OverloadedException buildOverloadedException(Limit endpointReserve, Limit globalReserve, Overload overload) {
+        return overload == Overload.REQUESTS
+                ? new OverloadedException(String.format("Request breached global limit of %d requests/second. Server is " +
+                                                        "currently in an overloaded state and cannot accept more requests.", 
+                                                        requestRateLimiter.getRate()))
+                : new OverloadedException(String.format("Request breached limit on bytes in flight. (Endpoint: %d/%d bytes, Global: %d/%d bytes.) " +
+                                                        "Server is currently in an overloaded state and cannot accept more requests.",
+                                                        endpointReserve.using(), endpointReserve.limit(), globalReserve.using(), globalReserve.limit()));
+    }
+
+    private void logOverload(Limit endpointReserve, Limit globalReserve, Envelope.Header header, int messageSize)
+    {
+        logger.trace("Discarded request of size {} with {} bytes in flight on channel. " + 
+                     "Using {}/{} bytes of endpoint limit and {}/{} bytes of global limit. " + 
+                     "Global rate limiter: {} Header: {}",
+                     messageSize, channelPayloadBytesInFlight,
+                     endpointReserve.using(), endpointReserve.limit(), globalReserve.using(), globalReserve.limit(),
+                     requestRateLimiter, header);
     }
 
     private boolean handleProtocolException(ProtocolException exception,
@@ -251,11 +339,17 @@
 
     protected boolean processRequest(Envelope request)
     {
+        return processRequest(request, Overload.NONE);
+    }
+    
+    protected boolean processRequest(Envelope request, Overload backpressure)
+    {
         M message = null;
         try
         {
             message = messageDecoder.decode(channel, request);
-            dispatcher.accept(channel, message, this::toFlushItem);
+            dispatcher.accept(channel, message, this::toFlushItem, backpressure);
+            
             // sucessfully delivered a CQL message to the execution
             // stage, so reset the counter of consecutive errors
             consecutiveMessageErrors = 0;
@@ -293,8 +387,6 @@
      * to the client.
      * This also releases the capacity acquired for processing as
      * indicated by supplied header.
-     * @param t
-     * @param header
      */
     private void handleErrorAndRelease(Throwable t, Envelope.Header header)
     {
@@ -311,8 +403,6 @@
      * when an error occurs without any capacity being acquired.
      * Typically, this would be the result of an acquisition failure
      * if the THROW_ON_OVERLOAD option has been specified by the client.
-     * @param t
-     * @param header
      */
     private void handleError(Throwable t, Envelope.Header header)
     {
@@ -328,8 +418,6 @@
      * when an error occurs without any capacity being acquired.
      * Typically, this would be the result of an acquisition failure
      * if the THROW_ON_OVERLOAD option has been specified by the client.
-     * @param t
-     * @param streamId
      */
     private void handleError(Throwable t, int streamId)
     {
@@ -342,8 +430,6 @@
      * payload fails. This does not attempt to release any resources, as these errors
      * should only occur before any capacity acquisition is attempted (e.g. on receipt
      * of a corrupt frame, or failure to extract a CQL message from the envelope).
-     *
-     * @param t
      */
     private void handleError(Throwable t)
     {
@@ -405,8 +491,9 @@
             // max CQL message size defaults to 256mb, so should be safe to downcast
             int messageSize = Ints.checkedCast(header.bodySizeInBytes);
             receivedBytes += buf.remaining();
-
+            
             LargeMessage largeMessage = new LargeMessage(header);
+
             if (!acquireCapacity(header, endpointReserve, globalReserve))
             {
                 // In the case of large messages, never stop processing incoming frames
@@ -424,21 +511,49 @@
                 // concurrently.
                 if (throwOnOverload)
                 {
-                    // discard the request and throw an exception
+                    // Mark as overloaded so that discard the message after consuming any subsequent frames.
                     ClientMetrics.instance.markRequestDiscarded();
-                    logger.trace("Discarded request of size: {}. InflightChannelRequestPayload: {}, " +
-                                 "InflightEndpointRequestPayload: {}, InflightOverallRequestPayload: {}, Header: {}",
-                                 messageSize,
-                                 channelPayloadBytesInFlight,
-                                 endpointReserve.using(),
-                                 globalReserve.using(),
-                                 header);
-
-                    // mark as overloaded so that discard the message
-                    // after consuming any subsequent frames
-                    largeMessage.markOverloaded();
+                    logOverload(endpointReserve, globalReserve, header, messageSize);
+                    largeMessage.markOverloaded(Overload.BYTES_IN_FLIGHT);
                 }
             }
+            else if (DatabaseDescriptor.getNativeTransportRateLimitingEnabled())
+            {
+                if (throwOnOverload)
+                {
+                    if (!requestRateLimiter.tryReserve())
+                    {
+                        ClientMetrics.instance.markRequestDiscarded();
+                        logOverload(endpointReserve, globalReserve, header, messageSize);
+                        
+                        // Mark as overloaded so that we discard the message after consuming any subsequent frames.
+                        // (i.e. Request resources we may already have acquired above will be released.)
+                        largeMessage.markOverloaded(Overload.REQUESTS);
+                        
+                        this.largeMessage = largeMessage;
+                        largeMessage.supply(frame);
+                        return true;
+                    }
+                }
+                else
+                {
+                    long delay = requestRateLimiter.reserveAndGetDelay(RATE_LIMITER_DELAY_UNIT);
+
+                    if (delay > 0)
+                    {
+                        this.largeMessage = largeMessage;
+                        largeMessage.markBackpressure(Overload.REQUESTS);
+                        largeMessage.supply(frame);
+
+                        if (decoder.isActive())
+                            ClientMetrics.instance.pauseConnection();
+
+                        scheduleConnectionWakeupTask(delay, RATE_LIMITER_DELAY_UNIT);
+                        return false;
+                    }
+                }
+            }
+            
             this.largeMessage = largeMessage;
             largeMessage.supply(frame);
             return true;
@@ -454,6 +569,31 @@
         return channel.id().asShortText();
     }
 
+    private void scheduleConnectionWakeupTask(long waitLength, TimeUnit unit)
+    {
+        channel.eventLoop().schedule(() ->
+                                     {
+                                         try
+                                         {
+                                             // We might have already reactivated via another wake task.
+                                             if (!decoder.isActive())
+                                             {
+                                                 decoder.reactivate();
+
+                                                 // Only update the relevant metric if we've actually activated.
+                                                 if (decoder.isActive())
+                                                     ClientMetrics.instance.unpauseConnection();
+                                             }
+                                         }
+                                         catch (Throwable t)
+                                         {
+                                             fatalExceptionCaught(t);
+                                         }
+                                     },
+                                     waitLength,
+                                     unit);
+    }
+
     @SuppressWarnings("BooleanMethodIsAlwaysInverted")
     private boolean acquireCapacityAndQueueOnFailure(Envelope.Header header, Limit endpointReserve, Limit globalReserve)
     {
@@ -515,7 +655,8 @@
     {
         private static final long EXPIRES_AT = Long.MAX_VALUE;
 
-        private boolean overloaded = false;
+        private Overload overload = Overload.NONE;
+        private Overload backpressure = Overload.NONE;
 
         private LargeMessage(Envelope.Header header)
         {
@@ -541,19 +682,22 @@
          * so we must ensure that subsequent frames are consumed from the channel. At that
          * point an error response is returned to the client, rather than processing the message.
          */
-        private void markOverloaded()
+        private void markOverloaded(Overload overload)
         {
-            overloaded = true;
+            this.overload = overload;
+        }
+
+        private void markBackpressure(Overload backpressure)
+        {
+            this.backpressure = backpressure;
         }
 
         protected void onComplete()
         {
-            if (overloaded)
-                handleErrorAndRelease(new OverloadedException("Server is in overloaded state. " +
-                                                              "Cannot accept more requests at this point"), header);
+            if (overload != Overload.NONE)
+                handleErrorAndRelease(buildOverloadedException(endpointReserveCapacity, globalReserveCapacity, overload), header);
             else if (!isCorrupt)
-                processRequest(assembleFrame());
-
+                processRequest(assembleFrame(), backpressure);
         }
 
         protected void abort()
diff --git a/src/java/org/apache/cassandra/transport/ClientResourceLimits.java b/src/java/org/apache/cassandra/transport/ClientResourceLimits.java
index 17a6e59..e38cfdb 100644
--- a/src/java/org/apache/cassandra/transport/ClientResourceLimits.java
+++ b/src/java/org/apache/cassandra/transport/ClientResourceLimits.java
@@ -24,6 +24,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import com.google.common.annotations.VisibleForTesting;
+import org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -42,6 +43,10 @@
     private static final AbstractMessageHandler.WaitQueue GLOBAL_QUEUE = AbstractMessageHandler.WaitQueue.global(GLOBAL_LIMIT);
     private static final ConcurrentMap<InetAddress, Allocator> PER_ENDPOINT_ALLOCATORS = new ConcurrentHashMap<>();
 
+    public static final NonBlockingRateLimiter GLOBAL_REQUEST_LIMITER = new NonBlockingRateLimiter(getNativeTransportMaxRequestsPerSecond());
+
+    public enum Overload { NONE, REQUESTS, BYTES_IN_FLIGHT }
+    
     public static Allocator getAllocatorForEndpoint(InetAddress endpoint)
     {
         while (true)
@@ -56,12 +61,12 @@
 
     public static long getGlobalLimit()
     {
-        return DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytes();
+        return DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightInBytes();
     }
 
     public static void setGlobalLimit(long newLimit)
     {
-        DatabaseDescriptor.setNativeTransportMaxConcurrentRequestsInBytes(newLimit);
+        DatabaseDescriptor.setNativeTransportConcurrentRequestDataInFlightInBytes(newLimit);
         long existingLimit = GLOBAL_LIMIT.setLimit(getGlobalLimit());
         logger.info("Changed native_max_transport_requests_in_bytes from {} to {}", existingLimit, newLimit);
     }
@@ -73,13 +78,13 @@
 
     public static long getEndpointLimit()
     {
-        return DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytesPerIp();
+        return DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightPerIpInBytes();
     }
 
     public static void setEndpointLimit(long newLimit)
     {
-        long existingLimit = DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytesPerIp();
-        DatabaseDescriptor.setNativeTransportMaxConcurrentRequestsInBytesPerIp(newLimit); // ensure new instances get the new limit
+        long existingLimit = DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightPerIpInBytes();
+        DatabaseDescriptor.setNativeTransportMaxRequestDataInFlightPerIpInBytes(newLimit); // ensure new instances get the new limit
         for (Allocator allocator : PER_ENDPOINT_ALLOCATORS.values())
             existingLimit = allocator.endpointAndGlobal.endpoint().setLimit(newLimit);
         logger.info("Changed native_max_transport_requests_in_bytes_per_ip from {} to {}", existingLimit, newLimit);
@@ -95,6 +100,19 @@
         return histogram.getSnapshot();
     }
 
+    public static int getNativeTransportMaxRequestsPerSecond()
+    {
+        return DatabaseDescriptor.getNativeTransportMaxRequestsPerSecond();
+    }
+
+    public static void setNativeTransportMaxRequestsPerSecond(int newPerSecond)
+    {
+        int existingPerSecond = getNativeTransportMaxRequestsPerSecond();
+        DatabaseDescriptor.setNativeTransportMaxRequestsPerSecond(newPerSecond);
+        GLOBAL_REQUEST_LIMITER.setRate(newPerSecond);
+        logger.info("Changed native_transport_max_requests_per_second from {} to {}", existingPerSecond, newPerSecond);
+    }
+
     /**
      * This will recompute the ip usage histo on each query of the snapshot when requested instead of trying to keep
      * a histogram up to date with each request
@@ -166,8 +184,8 @@
          *
          * @param amount number permits to allocate
          * @return outcome SUCCESS if the allocation was successful. In the case of failure,
-         * either INSUFFICIENT_GLOBAL or INSUFFICIENT_ENPOINT to indicate which reserve rejected
-         * the allocation request.
+         * either INSUFFICIENT_GLOBAL or INSUFFICIENT_ENDPOINT to indicate which 
+         * reserve rejected the allocation request.
          */
         ResourceLimits.Outcome tryAllocate(long amount)
         {
@@ -211,19 +229,18 @@
            return endpointAndGlobal.global().using();
         }
 
+        @Override
         public String toString()
         {
-            return String.format("InflightEndpointRequestPayload: %d/%d, InflightOverallRequestPayload: %d/%d",
-                                 endpointAndGlobal.endpoint().using(),
-                                 endpointAndGlobal.endpoint().limit(),
-                                 endpointAndGlobal.global().using(),
-                                 endpointAndGlobal.global().limit());
+            return String.format("Using %d/%d bytes of endpoint limit and %d/%d bytes of global limit.",
+                                 endpointAndGlobal.endpoint().using(), endpointAndGlobal.endpoint().limit(),
+                                 endpointAndGlobal.global().using(), endpointAndGlobal.global().limit());
         }
     }
 
     /**
      * Used in protocol V5 and later by the AbstractMessageHandler/CQLMessageHandler hierarchy.
-     * This hides the allocate/tryAllocate/release methods from EndpointResourceLimits and exposes
+     * This hides the allocate/tryAllocate/release methods from {@link ClientResourceLimits} and exposes
      * the endpoint and global limits, along with their corresponding
      * {@link org.apache.cassandra.net.AbstractMessageHandler.WaitQueue} directly.
      * Provided as an interface and single implementation for testing (see CQLConnectionTest)
@@ -234,9 +251,10 @@
         AbstractMessageHandler.WaitQueue globalWaitQueue();
         ResourceLimits.Limit endpointLimit();
         AbstractMessageHandler.WaitQueue endpointWaitQueue();
+        NonBlockingRateLimiter requestRateLimiter();
         void release();
 
-        static class Default implements ResourceProvider
+        class Default implements ResourceProvider
         {
             private final Allocator limits;
 
@@ -265,6 +283,11 @@
                 return limits.waitQueue;
             }
 
+            public NonBlockingRateLimiter requestRateLimiter()
+            {
+                return GLOBAL_REQUEST_LIMITER;
+            }
+            
             public void release()
             {
                 limits.release();
diff --git a/src/java/org/apache/cassandra/transport/ConnectedClient.java b/src/java/org/apache/cassandra/transport/ConnectedClient.java
index ca100f2..a4af32f 100644
--- a/src/java/org/apache/cassandra/transport/ConnectedClient.java
+++ b/src/java/org/apache/cassandra/transport/ConnectedClient.java
@@ -18,9 +18,11 @@
 package org.apache.cassandra.transport;
 
 import java.net.InetSocketAddress;
+import java.util.Collections;
 import java.util.Map;
 import java.util.Optional;
 
+import com.google.common.base.Joiner;
 import com.google.common.collect.ImmutableMap;
 
 import io.netty.handler.ssl.SslHandler;
@@ -32,6 +34,7 @@
     public static final String ADDRESS = "address";
     public static final String USER = "user";
     public static final String VERSION = "version";
+    public static final String CLIENT_OPTIONS = "clientOptions";
     public static final String DRIVER_NAME = "driverName";
     public static final String DRIVER_VERSION = "driverVersion";
     public static final String REQUESTS = "requests";
@@ -83,6 +86,11 @@
         return state().getDriverVersion();
     }
 
+    public Optional<Map<String,String>> clientOptions()
+    {
+        return state().getClientOptions();
+    }
+
     public long requestCount()
     {
         return connection.requests.getCount();
@@ -132,6 +140,9 @@
                            .put(ADDRESS, remoteAddress().toString())
                            .put(USER, username().orElse(UNDEFINED))
                            .put(VERSION, String.valueOf(protocolVersion()))
+                           .put(CLIENT_OPTIONS, Joiner.on(", ")
+                                                      .withKeyValueSeparator("=")
+                                                      .join(clientOptions().orElse(Collections.emptyMap())))
                            .put(DRIVER_NAME, driverName().orElse(UNDEFINED))
                            .put(DRIVER_VERSION, driverVersion().orElse(UNDEFINED))
                            .put(REQUESTS, String.valueOf(requestCount()))
diff --git a/src/java/org/apache/cassandra/transport/Dispatcher.java b/src/java/org/apache/cassandra/transport/Dispatcher.java
index 05b55e8..da79c3d 100644
--- a/src/java/org/apache/cassandra/transport/Dispatcher.java
+++ b/src/java/org/apache/cassandra/transport/Dispatcher.java
@@ -20,29 +20,41 @@
 
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
+import com.google.common.base.Predicate;
+import org.apache.cassandra.metrics.ClientMetrics;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import io.netty.channel.Channel;
 import io.netty.channel.EventLoop;
 import io.netty.util.AttributeKey;
-import org.apache.cassandra.concurrent.LocalAwareExecutorService;
+import org.apache.cassandra.concurrent.LocalAwareExecutorPlus;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.net.FrameEncoder;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.service.reads.thresholds.CoordinatorWarnings;
+import org.apache.cassandra.transport.ClientResourceLimits.Overload;
 import org.apache.cassandra.transport.Flusher.FlushItem;
 import org.apache.cassandra.transport.messages.ErrorMessage;
 import org.apache.cassandra.transport.messages.EventMessage;
 import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.NoSpamLogger;
 
 import static org.apache.cassandra.concurrent.SharedExecutorPool.SHARED;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class Dispatcher
 {
-    private static final LocalAwareExecutorService requestExecutor = SHARED.newExecutor(DatabaseDescriptor.getNativeTransportMaxThreads(),
-                                                                                        DatabaseDescriptor::setNativeTransportMaxThreads,
-                                                                                        "transport",
-                                                                                        "Native-Transport-Requests");
+    private static final Logger logger = LoggerFactory.getLogger(Dispatcher.class);
+    
+    private static final LocalAwareExecutorPlus requestExecutor = SHARED.newExecutor(DatabaseDescriptor.getNativeTransportMaxThreads(),
+                                                                                     DatabaseDescriptor::setNativeTransportMaxThreads,
+                                                                                     "transport",
+                                                                                     "Native-Transport-Requests");
 
     private static final ConcurrentMap<EventLoop, Flusher> flusherLookup = new ConcurrentHashMap<>();
     private final boolean useLegacyFlusher;
@@ -65,25 +77,53 @@
         this.useLegacyFlusher = useLegacyFlusher;
     }
 
-    public void dispatch(Channel channel, Message.Request request, FlushItemConverter forFlusher)
+    public void dispatch(Channel channel, Message.Request request, FlushItemConverter forFlusher, Overload backpressure)
     {
-        requestExecutor.submit(() -> processRequest(channel, request, forFlusher));
+        requestExecutor.submit(() -> processRequest(channel, request, forFlusher, backpressure));
+        ClientMetrics.instance.markRequestDispatched();
     }
 
     /**
-     * Note: this method may be executed on the netty event loop, during initial protocol negotiation
+     * Note: this method may be executed on the netty event loop, during initial protocol negotiation; the caller is
+     * responsible for cleaning up any global or thread-local state. (ex. tracing, client warnings, etc.).
      */
-    static Message.Response processRequest(ServerConnection connection, Message.Request request)
+    private static Message.Response processRequest(ServerConnection connection, Message.Request request, Overload backpressure)
     {
-        long queryStartNanoTime = System.nanoTime();
+        long queryStartNanoTime = nanoTime();
         if (connection.getVersion().isGreaterOrEqualTo(ProtocolVersion.V4))
             ClientWarn.instance.captureWarnings();
 
+        // even if ClientWarn is disabled, still setup CoordinatorTrackWarnings, as this will populate metrics and
+        // emit logs on the server; the warnings will just be ignored and not sent to the client
+        if (request.isTrackable())
+            CoordinatorWarnings.init();
+
+        if (backpressure == Overload.REQUESTS)
+        {
+            String message = String.format("Request breached global limit of %d requests/second and triggered backpressure.",
+                                           ClientResourceLimits.getNativeTransportMaxRequestsPerSecond());
+
+            NoSpamLogger.log(logger, NoSpamLogger.Level.INFO, 1, TimeUnit.MINUTES, message);
+            ClientWarn.instance.warn(message);
+        }
+        else if (backpressure == Overload.BYTES_IN_FLIGHT)
+        {
+            String message = String.format("Request breached limit(s) on bytes in flight (Endpoint: %d, Global: %d) and triggered backpressure.",
+                                           ClientResourceLimits.getEndpointLimit(), ClientResourceLimits.getGlobalLimit());
+
+            NoSpamLogger.log(logger, NoSpamLogger.Level.INFO, 1, TimeUnit.MINUTES, message);
+            ClientWarn.instance.warn(message);
+        }
+
         QueryState qstate = connection.validateNewMessage(request.type, connection.getVersion());
 
         Message.logger.trace("Received: {}, v={}", request, connection.getVersion());
         connection.requests.inc();
         Message.Response response = request.execute(qstate, queryStartNanoTime);
+
+        if (request.isTrackable())
+            CoordinatorWarnings.done();
+
         response.setStreamId(request.getStreamId());
         response.setWarnings(ClientWarn.instance.getWarnings());
         response.attach(connection);
@@ -92,33 +132,42 @@
     }
 
     /**
-     * Note: this method is not expected to execute on the netty event loop.
+     * Note: this method may be executed on the netty event loop.
      */
-    void processRequest(Channel channel, Message.Request request, FlushItemConverter forFlusher)
+    static Message.Response processRequest(Channel channel, Message.Request request, Overload backpressure)
     {
-        final Message.Response response;
-        final ServerConnection connection;
-        FlushItem<?> toFlush;
         try
         {
-            assert request.connection() instanceof ServerConnection;
-            connection = (ServerConnection) request.connection();
-            response = processRequest(connection, request);
-            toFlush = forFlusher.toFlushItem(channel, request, response);
-            Message.logger.trace("Responding: {}, v={}", response, connection.getVersion());
+            return processRequest((ServerConnection) request.connection(), request, backpressure);
         }
         catch (Throwable t)
         {
             JVMStabilityInspector.inspectThrowable(t);
-            ExceptionHandlers.UnexpectedChannelExceptionHandler handler = new ExceptionHandlers.UnexpectedChannelExceptionHandler(channel, true);
+
+            if (request.isTrackable())
+                CoordinatorWarnings.done();
+
+            Predicate<Throwable> handler = ExceptionHandlers.getUnexpectedExceptionHandler(channel, true);
             ErrorMessage error = ErrorMessage.fromException(t, handler);
             error.setStreamId(request.getStreamId());
-            toFlush = forFlusher.toFlushItem(channel, request, error);
+            error.setWarnings(ClientWarn.instance.getWarnings());
+            return error;
         }
         finally
         {
+            CoordinatorWarnings.reset();
             ClientWarn.instance.resetWarnings();
         }
+    }
+
+    /**
+     * Note: this method is not expected to execute on the netty event loop.
+     */
+    void processRequest(Channel channel, Message.Request request, FlushItemConverter forFlusher, Overload backpressure)
+    {
+        Message.Response response = processRequest(channel, request, backpressure);
+        FlushItem<?> toFlush = forFlusher.toFlushItem(channel, request, response);
+        Message.logger.trace("Responding: {}, v={}", response, request.connection().getVersion());
         flush(toFlush);
     }
 
@@ -152,7 +201,7 @@
      * for delivering events to registered clients is dependent on protocol version and the configuration
      * of the pipeline. For v5 and newer connections, the event message is encoded into an Envelope,
      * wrapped in a FlushItem and then delivered via the pipeline's flusher, in a similar way to
-     * a Response returned from {@link #processRequest(Channel, Message.Request, FlushItemConverter)}.
+     * a Response returned from {@link #processRequest(Channel, Message.Request, FlushItemConverter, Overload)}.
      * It's worth noting that events are not generally fired as a direct response to a client request,
      * so this flush item has a null request attribute. The dispatcher itself is created when the
      * pipeline is first configured during protocol negotiation and is attached to the channel for
diff --git a/src/java/org/apache/cassandra/transport/Envelope.java b/src/java/org/apache/cassandra/transport/Envelope.java
index 6b15a2a..99c6e13 100644
--- a/src/java/org/apache/cassandra/transport/Envelope.java
+++ b/src/java/org/apache/cassandra/transport/Envelope.java
@@ -353,7 +353,19 @@
             int firstByte = buffer.getByte(idx++);
             Message.Direction direction = Message.Direction.extractFromVersion(firstByte);
             int versionNum = firstByte & PROTOCOL_VERSION_MASK;
-            ProtocolVersion version = ProtocolVersion.decode(versionNum, DatabaseDescriptor.getNativeTransportAllowOlderProtocols());
+
+            ProtocolVersion version;
+            
+            try
+            {
+                version = ProtocolVersion.decode(versionNum, DatabaseDescriptor.getNativeTransportAllowOlderProtocols());
+            }
+            catch (ProtocolException e)
+            {
+                // Skip the remaining useless bytes. Otherwise the channel closing logic may try to decode again. 
+                buffer.skipBytes(readableBytes);
+                throw e;
+            }
 
             // Wait until we have the complete header
             if (readableBytes < Header.LENGTH)
diff --git a/src/java/org/apache/cassandra/transport/Event.java b/src/java/org/apache/cassandra/transport/Event.java
index c62a73f..5e8e201 100644
--- a/src/java/org/apache/cassandra/transport/Event.java
+++ b/src/java/org/apache/cassandra/transport/Event.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.transport;
 
-import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.util.Iterator;
 import java.util.List;
@@ -116,17 +115,17 @@
 
         public static TopologyChange newNode(InetAddressAndPort address)
         {
-            return new TopologyChange(Change.NEW_NODE, new InetSocketAddress(address.address, address.port));
+            return new TopologyChange(Change.NEW_NODE, new InetSocketAddress(address.getAddress(), address.getPort()));
         }
 
         public static TopologyChange removedNode(InetAddressAndPort address)
         {
-            return new TopologyChange(Change.REMOVED_NODE, new InetSocketAddress(address.address, address.port));
+            return new TopologyChange(Change.REMOVED_NODE, new InetSocketAddress(address.getAddress(), address.getPort()));
         }
 
         public static TopologyChange movedNode(InetAddressAndPort address)
         {
-            return new TopologyChange(Change.MOVED_NODE, new InetSocketAddress(address.address, address.port));
+            return new TopologyChange(Change.MOVED_NODE, new InetSocketAddress(address.getAddress(), address.getPort()));
         }
 
         // Assumes the type has already been deserialized
@@ -187,12 +186,12 @@
 
         public static StatusChange nodeUp(InetAddressAndPort address)
         {
-            return new StatusChange(Status.UP, new InetSocketAddress(address.address, address.port));
+            return new StatusChange(Status.UP, new InetSocketAddress(address.getAddress(), address.getPort()));
         }
 
         public static StatusChange nodeDown(InetAddressAndPort address)
         {
-            return new StatusChange(Status.DOWN, new InetSocketAddress(address.address, address.port));
+            return new StatusChange(Status.DOWN, new InetSocketAddress(address.getAddress(), address.getPort()));
         }
 
         // Assumes the type has already been deserialized
diff --git a/src/java/org/apache/cassandra/transport/ExceptionHandlers.java b/src/java/org/apache/cassandra/transport/ExceptionHandlers.java
index 1c5c976..0039bc0 100644
--- a/src/java/org/apache/cassandra/transport/ExceptionHandlers.java
+++ b/src/java/org/apache/cassandra/transport/ExceptionHandlers.java
@@ -19,6 +19,7 @@
 package org.apache.cassandra.transport;
 
 import java.io.IOException;
+import java.net.SocketAddress;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
@@ -33,6 +34,8 @@
 import io.netty.channel.ChannelInboundHandlerAdapter;
 import io.netty.channel.ChannelPromise;
 import io.netty.channel.unix.Errors;
+import org.apache.cassandra.exceptions.OverloadedException;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.metrics.ClientMetrics;
 import org.apache.cassandra.net.FrameEncoder;
 import org.apache.cassandra.transport.messages.ErrorMessage;
@@ -67,7 +70,7 @@
             // Provide error message to client in case channel is still open
             if (ctx.channel().isOpen())
             {
-                UnexpectedChannelExceptionHandler handler = new UnexpectedChannelExceptionHandler(ctx.channel(), false);
+                Predicate<Throwable> handler = getUnexpectedExceptionHandler(ctx.channel(), false);
                 ErrorMessage errorMessage = ErrorMessage.fromException(cause, handler);
                 Envelope response = errorMessage.encode(version);
                 FrameEncoder.Payload payload = allocator.allocate(true, CQLMessageHandler.envelopeSize(response.header));
@@ -88,27 +91,16 @@
                     JVMStabilityInspector.inspectThrowable(cause);
                 }
             }
-            if (Throwables.anyCauseMatches(cause, t -> t instanceof ProtocolException))
+            
+            if (DatabaseDescriptor.getClientErrorReportingExclusions().contains(ctx.channel().remoteAddress()))
             {
-                // if any ProtocolExceptions is not silent, then handle
-                if (Throwables.anyCauseMatches(cause, t -> t instanceof ProtocolException && !((ProtocolException) t).isSilent()))
-                {
-                    ClientMetrics.instance.markProtocolException();
-                    // since protocol exceptions are expected to be client issues, not logging stack trace
-                    // to avoid spamming the logs once a bad client shows up
-                    NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES, "Protocol exception with client networking: " + cause.getMessage());
-                }
+                // Sometimes it is desirable to ignore exceptions from specific IPs; such as when security scans are
+                // running.  To avoid polluting logs and metrics, metrics are not updated when the IP is in the exclude
+                // list.
+                logger.debug("Excluding client exception for {}; address contained in client_error_reporting_exclusions", ctx.channel().remoteAddress(), cause);
+                return;
             }
-            else if (Throwables.anyCauseMatches(cause, t -> t instanceof Errors.NativeIoException))
-            {
-                ClientMetrics.instance.markUnknownException();
-                logger.trace("Native exception in client networking", cause);
-            }
-            else
-            {
-                ClientMetrics.instance.markUnknownException();
-                logger.warn("Unknown exception in client networking", cause);
-            }
+            logClientNetworkingExceptions(cause);
         }
 
         private static boolean isFatal(Throwable cause)
@@ -118,6 +110,49 @@
         }
     }
 
+    static void logClientNetworkingExceptions(Throwable cause)
+    {
+        if (Throwables.anyCauseMatches(cause, t -> t instanceof ProtocolException))
+        {
+            // if any ProtocolExceptions is not silent, then handle
+            if (Throwables.anyCauseMatches(cause, t -> t instanceof ProtocolException && !((ProtocolException) t).isSilent()))
+            {
+                ClientMetrics.instance.markProtocolException();
+                // since protocol exceptions are expected to be client issues, not logging stack trace
+                // to avoid spamming the logs once a bad client shows up
+                NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES, "Protocol exception with client networking: " + cause.getMessage());
+            }
+        }
+        else if (Throwables.anyCauseMatches(cause, t -> t instanceof OverloadedException))
+        {
+            // Once the threshold for overload is breached, it will very likely spam the logs...
+            NoSpamLogger.log(logger, NoSpamLogger.Level.INFO, 1, TimeUnit.MINUTES, cause.getMessage());
+        }
+        else if (Throwables.anyCauseMatches(cause, t -> t instanceof Errors.NativeIoException))
+        {
+            ClientMetrics.instance.markUnknownException();
+            logger.trace("Native exception in client networking", cause);
+        }
+        else
+        {
+            ClientMetrics.instance.markUnknownException();
+            logger.warn("Unknown exception in client networking", cause);
+        }
+    }
+
+    static Predicate<Throwable> getUnexpectedExceptionHandler(Channel channel, boolean alwaysLogAtError)
+    {
+        SocketAddress address = channel.remoteAddress();
+        if (DatabaseDescriptor.getClientErrorReportingExclusions().contains(address))
+        {
+            return cause -> {
+                logger.debug("Excluding client exception for {}; address contained in client_error_reporting_exclusions", address, cause);
+                return true;
+            };
+        }
+        return new UnexpectedChannelExceptionHandler(channel, alwaysLogAtError);
+    }
+
     /**
      * Include the channel info in the logged information for unexpected errors, and (if {@link #alwaysLogAtError} is
      * false then choose the log level based on the type of exception (some are clearly client issues and shouldn't be
diff --git a/src/java/org/apache/cassandra/transport/InitialConnectionHandler.java b/src/java/org/apache/cassandra/transport/InitialConnectionHandler.java
index bc53fd2..75cb72e 100644
--- a/src/java/org/apache/cassandra/transport/InitialConnectionHandler.java
+++ b/src/java/org/apache/cassandra/transport/InitialConnectionHandler.java
@@ -25,6 +25,7 @@
 import java.util.List;
 import java.util.Map;
 
+import org.apache.cassandra.transport.ClientResourceLimits.Overload;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -147,7 +148,7 @@
                         promise = new VoidChannelPromise(ctx.channel(), false);
                     }
 
-                    final Message.Response response = Dispatcher.processRequest((ServerConnection) connection, startup);
+                    final Message.Response response = Dispatcher.processRequest(ctx.channel(), startup, Overload.NONE);
                     outbound = response.encode(inbound.header.version);
                     ctx.writeAndFlush(outbound, promise);
                     logger.trace("Configured pipeline: {}", ctx.pipeline());
diff --git a/src/java/org/apache/cassandra/transport/Message.java b/src/java/org/apache/cassandra/transport/Message.java
index 0284489..75c997e 100644
--- a/src/java/org/apache/cassandra/transport/Message.java
+++ b/src/java/org/apache/cassandra/transport/Message.java
@@ -23,7 +23,6 @@
 import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 
 import com.google.common.annotations.VisibleForTesting;
 
@@ -37,7 +36,9 @@
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.messages.*;
 import org.apache.cassandra.service.QueryState;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * A message from the CQL binary protocol.
@@ -209,24 +210,35 @@
                 throw new IllegalArgumentException();
         }
 
+        /**
+         * @return true if the execution of this {@link Request} should be recorded in a tracing session
+         */
         protected boolean isTraceable()
         {
             return false;
         }
 
+        /**
+         * @return true if warnings should be tracked and aborts enforced for resource limits on this {@link Request}
+         */
+        protected boolean isTrackable()
+        {
+            return false;
+        }
+
         protected abstract Response execute(QueryState queryState, long queryStartNanoTime, boolean traceRequest);
 
         public final Response execute(QueryState queryState, long queryStartNanoTime)
         {
             boolean shouldTrace = false;
-            UUID tracingSessionId = null;
+            TimeUUID tracingSessionId = null;
 
             if (isTraceable())
             {
                 if (isTracingRequested())
                 {
                     shouldTrace = true;
-                    tracingSessionId = UUIDGen.getTimeUUID();
+                    tracingSessionId = nextTimeUUID();
                     Tracing.instance.newSession(tracingSessionId, getCustomPayload());
                 }
                 else if (StorageService.instance.shouldTraceProbablistically())
@@ -266,7 +278,7 @@
 
     public static abstract class Response extends Message
     {
-        protected UUID tracingId;
+        protected TimeUUID tracingId;
         protected List<String> warnings;
 
         protected Response(Type type)
@@ -277,13 +289,13 @@
                 throw new IllegalArgumentException();
         }
 
-        Message setTracingId(UUID tracingId)
+        Message setTracingId(TimeUUID tracingId)
         {
             this.tracingId = tracingId;
             return this;
         }
 
-        UUID getTracingId()
+        TimeUUID getTracingId()
         {
             return tracingId;
         }
@@ -312,16 +324,23 @@
             if (this instanceof Response)
             {
                 Response message = (Response)this;
-                UUID tracingId = message.getTracingId();
+                TimeUUID tracingId = message.getTracingId();
                 Map<String, ByteBuffer> customPayload = message.getCustomPayload();
                 if (tracingId != null)
-                    messageSize += CBUtil.sizeOfUUID(tracingId);
+                    messageSize += TimeUUID.sizeInBytes();
                 List<String> warnings = message.getWarnings();
                 if (warnings != null)
                 {
+                    // if cassandra populates warnings for <= v3 protocol, this is a bug
                     if (version.isSmallerThan(ProtocolVersion.V4))
-                        throw new ProtocolException("Must not send frame with WARNING flag for native protocol version < 4");
-                    messageSize += CBUtil.sizeOfStringList(warnings);
+                    {
+                        logger.warn("Warnings present in message with version less than v4 (it is {}); warnings={}", version, warnings);
+                        warnings = null;
+                    }
+                    else
+                    {
+                        messageSize += CBUtil.sizeOfStringList(warnings);
+                    }
                 }
                 if (customPayload != null)
                 {
@@ -398,7 +417,7 @@
             boolean isCustomPayload = inbound.header.flags.contains(Envelope.Header.Flag.CUSTOM_PAYLOAD);
             boolean hasWarning = inbound.header.flags.contains(Envelope.Header.Flag.WARNING);
 
-            UUID tracingId = isRequest || !isTracing ? null : CBUtil.readUUID(inbound.body);
+            TimeUUID tracingId = isRequest || !isTracing ? null : CBUtil.readTimeUUID(inbound.body);
             List<String> warnings = isRequest || !hasWarning ? null : CBUtil.readStringList(inbound.body);
             Map<String, ByteBuffer> customPayload = !isCustomPayload ? null : CBUtil.readBytesMap(inbound.body);
 
diff --git a/src/java/org/apache/cassandra/transport/PipelineConfigurator.java b/src/java/org/apache/cassandra/transport/PipelineConfigurator.java
index 0250f13..81ff136 100644
--- a/src/java/org/apache/cassandra/transport/PipelineConfigurator.java
+++ b/src/java/org/apache/cassandra/transport/PipelineConfigurator.java
@@ -44,6 +44,7 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.net.*;
+import org.apache.cassandra.security.ISslContextFactory;
 import org.apache.cassandra.security.SSLFactory;
 import org.apache.cassandra.transport.messages.StartupMessage;
 
@@ -163,7 +164,7 @@
                 return channel -> {
                     SslContext sslContext = SSLFactory.getOrCreateSslContext(encryptionOptions,
                                                                              encryptionOptions.require_client_auth,
-                                                                             SSLFactory.SocketType.SERVER);
+                                                                             ISslContextFactory.SocketType.SERVER);
 
                     channel.pipeline().addFirst(SSL_HANDLER, new ByteToMessageDecoder()
                     {
@@ -197,7 +198,7 @@
                 return channel -> {
                     SslContext sslContext = SSLFactory.getOrCreateSslContext(encryptionOptions,
                                                                              encryptionOptions.require_client_auth,
-                                                                             SSLFactory.SocketType.SERVER);
+                                                                             ISslContextFactory.SocketType.SERVER);
                     channel.pipeline().addFirst(SSL_HANDLER, sslContext.newHandler(channel.alloc()));
                 };
             default:
diff --git a/src/java/org/apache/cassandra/transport/PreV5Handlers.java b/src/java/org/apache/cassandra/transport/PreV5Handlers.java
index cec8edd..ea850cc 100644
--- a/src/java/org/apache/cassandra/transport/PreV5Handlers.java
+++ b/src/java/org/apache/cassandra/transport/PreV5Handlers.java
@@ -19,8 +19,11 @@
 package org.apache.cassandra.transport;
 
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
+import com.google.common.base.Predicate;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.transport.ClientResourceLimits.Overload;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -39,10 +42,9 @@
 import org.apache.cassandra.net.ResourceLimits;
 import org.apache.cassandra.transport.messages.ErrorMessage;
 import org.apache.cassandra.utils.JVMStabilityInspector;
-import org.apache.cassandra.utils.NoSpamLogger;
-import org.apache.cassandra.utils.Throwables;
 
-import static org.apache.cassandra.transport.Message.logger;
+import static org.apache.cassandra.transport.CQLMessageHandler.RATE_LIMITER_DELAY_UNIT;
+import static org.apache.cassandra.transport.ClientResourceLimits.GLOBAL_REQUEST_LIMITER;
 
 public class PreV5Handlers
 {
@@ -63,7 +65,9 @@
          * Note: should only be accessed while on the netty event loop.
          */
         private long channelPayloadBytesInFlight;
-        private boolean paused;
+        
+        /** The cause of the current connection pause, or {@link Overload#NONE} if it is unpaused. */
+        private Overload backpressure = Overload.NONE;
 
         LegacyDispatchHandler(Dispatcher dispatcher, ClientResourceLimits.Allocator endpointPayloadTracker)
         {
@@ -71,11 +75,12 @@
             this.endpointPayloadTracker = endpointPayloadTracker;
         }
 
-        protected void channelRead0(ChannelHandlerContext ctx, Message.Request request) throws Exception
+        protected void channelRead0(ChannelHandlerContext ctx, Message.Request request)
         {
-            // if we decide to handle this message, process it outside of the netty event loop
-            if (shouldHandleRequest(ctx, request))
-                dispatcher.dispatch(ctx.channel(), request, this::toFlushItem);
+            // The only reason we won't process this message is if checkLimits() throws an OverloadedException.
+            // (i.e. Even if backpressure is applied, the current request is allowed to finish.)
+            checkLimits(ctx, request);
+            dispatcher.dispatch(ctx.channel(), request, this::toFlushItem, backpressure);
         }
 
         // Acts as a Dispatcher.FlushItemConverter
@@ -95,76 +100,143 @@
 
             // since the request has been processed, decrement inflight payload at channel, endpoint and global levels
             channelPayloadBytesInFlight -= itemSize;
-            ResourceLimits.Outcome endpointGlobalReleaseOutcome = endpointPayloadTracker.release(itemSize);
+            boolean globalInFlightBytesBelowLimit = endpointPayloadTracker.release(itemSize) == ResourceLimits.Outcome.BELOW_LIMIT;
 
-            // now check to see if we need to reenable the channel's autoRead.
-            // If the current payload side is zero, we must reenable autoread as
-            // 1) we allow no other thread/channel to do it, and
-            // 2) there's no other events following this one (becuase we're at zero bytes in flight),
-            // so no successive to trigger the other clause in this if-block
+            // Now check to see if we need to reenable the channel's autoRead.
             //
-            // note: this path is only relevant when part of a pre-V5 pipeline, as only in this case is
+            // If the current payload bytes in flight is zero, we must reenable autoread as
+            // 1) we allow no other thread/channel to do it, and
+            // 2) there are no other events following this one (becuase we're at zero bytes in flight),
+            // so no successive to trigger the other clause in this if-block.
+            //
+            // The only exception to this is if the global request rate limit has been breached, which means
+            // we'll have to wait until a scheduled wakeup task unpauses the connection.
+            //
+            // Note: This path is only relevant when part of a pre-V5 pipeline, as only in this case is
             // paused ever set to true. In pipelines configured for V5 or later, backpressure and control
             // over the inbound pipeline's autoread status are handled by the FrameDecoder/FrameProcessor.
             ChannelConfig config = item.channel.config();
-            if (paused && (channelPayloadBytesInFlight == 0 || endpointGlobalReleaseOutcome == ResourceLimits.Outcome.BELOW_LIMIT))
+
+            if (backpressure == Overload.BYTES_IN_FLIGHT && (channelPayloadBytesInFlight == 0 || globalInFlightBytesBelowLimit))
             {
-                paused = false;
+                unpauseConnection(config);
+            }
+        }
+
+        /**
+         * Checks limits on bytes in flight and the request rate limiter (if enabled) to determine whether to drop a
+         * request or trigger backpressure and pause the connection.
+         * <p>
+         * The check for inflight payload to potentially discard the request should have been ideally in one of the
+         * first handlers in the pipeline (Envelope.Decoder::decode()). However, in case of any exception thrown between
+         * that handler (where inflight payload is incremented) and this handler (Dispatcher::channelRead0) (where 
+         * inflight payload in decremented), inflight payload becomes erroneous. ExceptionHandler is not sufficient for 
+         * this purpose since it does not have the message envelope associated with the exception.
+         * <p>
+         * If the connection is configured to throw {@link OverloadedException}, requests that breach the rate limit are
+         * not counted against that limit.
+         * <p>
+         * Note: this method should execute on the netty event loop.
+         * 
+         * @throws ErrorMessage.WrappedException with an {@link OverloadedException} if overload occurs and the 
+         *         connection is configured to throw on overload
+         */
+        private void checkLimits(ChannelHandlerContext ctx, Message.Request request)
+        {
+            long requestSize = request.getSource().header.bodySizeInBytes;
+            
+            if (request.connection.isThrowOnOverload())
+            {
+                if (endpointPayloadTracker.tryAllocate(requestSize) != ResourceLimits.Outcome.SUCCESS)
+                {
+                    discardAndThrow(request, requestSize, Overload.BYTES_IN_FLIGHT);
+                }
+
+                if (DatabaseDescriptor.getNativeTransportRateLimitingEnabled() && !GLOBAL_REQUEST_LIMITER.tryReserve())
+                {
+                    // We've already allocated against the payload tracker here, so release those resources.
+                    endpointPayloadTracker.release(requestSize);
+                    discardAndThrow(request, requestSize, Overload.REQUESTS);
+                }
+            }
+            else
+            {
+                // Any request that gets here will be processed, so increment the channel bytes in flight.
+                channelPayloadBytesInFlight += requestSize;
+                
+                // Check for overloaded state by trying to allocate the message size from inflight payload trackers
+                if (endpointPayloadTracker.tryAllocate(requestSize) != ResourceLimits.Outcome.SUCCESS)
+                {
+                    endpointPayloadTracker.allocate(requestSize);
+                    pauseConnection(ctx);
+                    backpressure = Overload.BYTES_IN_FLIGHT;
+                }
+
+                if (DatabaseDescriptor.getNativeTransportRateLimitingEnabled())
+                {
+                    // Reserve a permit even if we've already triggered backpressure on bytes in flight.
+                    long delay = GLOBAL_REQUEST_LIMITER.reserveAndGetDelay(RATE_LIMITER_DELAY_UNIT);
+                    
+                    // If we've already triggered backpressure on bytes in flight, no further action is necessary.
+                    if (backpressure == Overload.NONE && delay > 0)
+                    {
+                        pauseConnection(ctx);
+                        
+                        // A permit isn't immediately available, so schedule an unpause for when it is.
+                        ctx.channel().eventLoop().schedule(() -> unpauseConnection(ctx.channel().config()), delay, RATE_LIMITER_DELAY_UNIT);
+                        backpressure = Overload.REQUESTS;
+                    }
+                }
+            }
+        }
+
+        private void pauseConnection(ChannelHandlerContext ctx)
+        {
+            if (ctx.channel().config().isAutoRead())
+            {
+                ctx.channel().config().setAutoRead(false);
+                ClientMetrics.instance.pauseConnection();
+            }
+        }
+
+        private void unpauseConnection(ChannelConfig config)
+        {
+            backpressure = Overload.NONE;
+            
+            if (!config.isAutoRead())
+            {
                 ClientMetrics.instance.unpauseConnection();
                 config.setAutoRead(true);
             }
         }
 
-        /**
-         * This check for inflight payload to potentially discard the request should have been ideally in one of the
-         * first handlers in the pipeline (Envelope.Decoder::decode()). However, incase of any exception thrown between that
-         * handler (where inflight payload is incremented) and this handler (Dispatcher::channelRead0) (where inflight
-         * payload in decremented), inflight payload becomes erroneous. ExceptionHandler is not sufficient for this
-         * purpose since it does not have the message envelope associated with the exception.
-         * <p>
-         * Note: this method should execute on the netty event loop.
-         */
-        private boolean shouldHandleRequest(ChannelHandlerContext ctx, Message.Request request)
+        private void discardAndThrow(Message.Request request, long requestSize, Overload overload)
         {
-            long requestSize = request.getSource().header.bodySizeInBytes;
+            ClientMetrics.instance.markRequestDiscarded();
 
-            // check for overloaded state by trying to allocate the message size from inflight payload trackers
-            if (endpointPayloadTracker.tryAllocate(requestSize) != ResourceLimits.Outcome.SUCCESS)
-            {
-                if (request.connection.isThrowOnOverload())
-                {
-                    // discard the request and throw an exception
-                    ClientMetrics.instance.markRequestDiscarded();
-                    logger.trace("Discarded request of size: {}. InflightChannelRequestPayload: {}, {}, Request: {}",
-                                 requestSize,
-                                 channelPayloadBytesInFlight,
-                                 endpointPayloadTracker.toString(),
-                                 request);
-                    throw ErrorMessage.wrap(new OverloadedException("Server is in overloaded state. Cannot accept more requests at this point"),
-                                            request.getSource().header.streamId);
-                }
-                else
-                {
-                    // set backpressure on the channel, and handle the request
-                    endpointPayloadTracker.allocate(requestSize);
-                    ctx.channel().config().setAutoRead(false);
-                    ClientMetrics.instance.pauseConnection();
-                    paused = true;
-                }
-            }
+            logger.trace("Discarded request of size {} with {} bytes in flight on channel. {} " + 
+                         "Global rate limiter: {} Request: {}",
+                         requestSize, channelPayloadBytesInFlight, endpointPayloadTracker,
+                         GLOBAL_REQUEST_LIMITER, request);
 
-            channelPayloadBytesInFlight += requestSize;
-            return true;
+            OverloadedException exception = overload == Overload.REQUESTS
+                    ? new OverloadedException(String.format("Request breached global limit of %d requests/second. Server is " +
+                                                            "currently in an overloaded state and cannot accept more requests.",
+                                                            GLOBAL_REQUEST_LIMITER.getRate()))
+                    : new OverloadedException(String.format("Request breached limit on bytes in flight. (%s)) " +
+                                                            "Server is currently in an overloaded state and cannot accept more requests.",
+
+                    endpointPayloadTracker));
+            
+            throw ErrorMessage.wrap(exception, request.getSource().header.streamId);
         }
 
-
         @Override
         public void channelInactive(ChannelHandlerContext ctx)
         {
             endpointPayloadTracker.release();
-            if (paused)
+            if (!ctx.channel().config().isAutoRead())
             {
-                paused = false;
                 ClientMetrics.instance.unpauseConnection();
             }
             ctx.fireChannelInactive();
@@ -181,7 +253,7 @@
         public static final ProtocolDecoder instance = new ProtocolDecoder();
         private ProtocolDecoder(){}
 
-        public void decode(ChannelHandlerContext ctx, Envelope source, List results)
+        public void decode(ChannelHandlerContext ctx, Envelope source, List<Object> results)
         {
             try
             {
@@ -212,7 +284,7 @@
     {
         public static final ProtocolEncoder instance = new ProtocolEncoder();
         private ProtocolEncoder(){}
-        public void encode(ChannelHandlerContext ctx, Message source, List results)
+        public void encode(ChannelHandlerContext ctx, Message source, List<Object> results)
         {
             ProtocolVersion version = getConnectionVersion(ctx);
             results.add(source.encode(version));
@@ -226,6 +298,8 @@
     @ChannelHandler.Sharable
     public static final class ExceptionHandler extends ChannelInboundHandlerAdapter
     {
+        private static final Logger logger = LoggerFactory.getLogger(ExceptionHandler.class);
+
         public static final ExceptionHandler instance = new ExceptionHandler();
         private ExceptionHandler(){}
 
@@ -235,7 +309,7 @@
             // Provide error message to client in case channel is still open
             if (ctx.channel().isOpen())
             {
-                ExceptionHandlers.UnexpectedChannelExceptionHandler handler = new ExceptionHandlers.UnexpectedChannelExceptionHandler(ctx.channel(), false);
+                Predicate<Throwable> handler = ExceptionHandlers.getUnexpectedExceptionHandler(ctx.channel(), false);
                 ErrorMessage errorMessage = ErrorMessage.fromException(cause, handler);
                 ChannelFuture future = ctx.writeAndFlush(errorMessage.encode(getConnectionVersion(ctx)));
                 // On protocol exception, close the channel as soon as the message have been sent.
@@ -244,22 +318,16 @@
                 if (isFatal(cause))
                     future.addListener((ChannelFutureListener) f -> ctx.close());
             }
-            if (Throwables.anyCauseMatches(cause, t -> t instanceof ProtocolException))
+            
+            if (DatabaseDescriptor.getClientErrorReportingExclusions().contains(ctx.channel().remoteAddress()))
             {
-                // if any ProtocolExceptions is not silent, then handle
-                if (Throwables.anyCauseMatches(cause, t -> t instanceof ProtocolException && !((ProtocolException) t).isSilent()))
-                {
-                    ClientMetrics.instance.markProtocolException();
-                    // since protocol exceptions are expected to be client issues, not logging stack trace
-                    // to avoid spamming the logs once a bad client shows up
-                    NoSpamLogger.log(logger, NoSpamLogger.Level.WARN, 1, TimeUnit.MINUTES, "Protocol exception with client networking: " + cause.getMessage());
-                }
+                // Sometimes it is desirable to ignore exceptions from specific IPs; such as when security scans are
+                // running.  To avoid polluting logs and metrics, metrics are not updated when the IP is in the exclude
+                // list.
+                logger.debug("Excluding client exception for {}; address contained in client_error_reporting_exclusions", ctx.channel().remoteAddress(), cause);
+                return;
             }
-            else
-            {
-                ClientMetrics.instance.markUnknownException();
-                logger.warn("Unknown exception in client networking", cause);
-            }
+            ExceptionHandlers.logClientNetworkingExceptions(cause);
             JVMStabilityInspector.inspectThrowable(cause);
         }
 
diff --git a/src/java/org/apache/cassandra/transport/ProtocolVersion.java b/src/java/org/apache/cassandra/transport/ProtocolVersion.java
index aa02aab..fc97cc8 100644
--- a/src/java/org/apache/cassandra/transport/ProtocolVersion.java
+++ b/src/java/org/apache/cassandra/transport/ProtocolVersion.java
@@ -67,7 +67,7 @@
     final static ProtocolVersion MIN_SUPPORTED_VERSION = SUPPORTED_VERSIONS[0];
     final static ProtocolVersion MAX_SUPPORTED_VERSION = SUPPORTED_VERSIONS[SUPPORTED_VERSIONS.length - 1];
     /** These versions are sent by some clients, but are not valid Apache Cassandra versions (66, and 65 are DSE versions) */
-    private static int[] KNOWN_INVALID_VERSIONS = {66, 65};
+    private static int[] KNOWN_INVALID_VERSIONS = { 66, 65 };
 
     /** All supported versions, published as an enumset */
     public final static EnumSet<ProtocolVersion> SUPPORTED = EnumSet.copyOf(Arrays.asList(ArrayUtils.addAll(SUPPORTED_VERSIONS)));
diff --git a/src/java/org/apache/cassandra/transport/ProtocolVersionTracker.java b/src/java/org/apache/cassandra/transport/ProtocolVersionTracker.java
index f289377..3d6e900 100644
--- a/src/java/org/apache/cassandra/transport/ProtocolVersionTracker.java
+++ b/src/java/org/apache/cassandra/transport/ProtocolVersionTracker.java
@@ -26,6 +26,8 @@
 import com.github.benmanes.caffeine.cache.Caffeine;
 import com.github.benmanes.caffeine.cache.LoadingCache;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * This class tracks the last 100 connections per protocol version
  */
@@ -47,13 +49,13 @@
         for (ProtocolVersion version : ProtocolVersion.values())
         {
             clientsByProtocolVersion.put(version, Caffeine.newBuilder().maximumSize(capacity)
-                                                          .build(key -> System.currentTimeMillis()));
+                                                          .build(key -> currentTimeMillis()));
         }
     }
 
     void addConnection(InetAddress addr, ProtocolVersion version)
     {
-        clientsByProtocolVersion.get(version).put(addr, System.currentTimeMillis());
+        clientsByProtocolVersion.get(version).put(addr, currentTimeMillis());
     }
 
     List<ClientStat> getAll()
diff --git a/src/java/org/apache/cassandra/transport/Server.java b/src/java/org/apache/cassandra/transport/Server.java
index 5c9e575..5ec6d20 100644
--- a/src/java/org/apache/cassandra/transport/Server.java
+++ b/src/java/org/apache/cassandra/transport/Server.java
@@ -41,10 +41,15 @@
 import org.apache.cassandra.auth.AuthenticatedUser;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.cql3.functions.UDAggregate;
+import org.apache.cassandra.cql3.functions.UDFunction;
 import org.apache.cassandra.db.marshal.AbstractType;
+import org.apache.cassandra.db.marshal.UserType;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaChangeListener;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.*;
 import org.apache.cassandra.transport.messages.EventMessage;
 import org.apache.cassandra.utils.FBUtilities;
@@ -354,7 +359,7 @@
         }
     }
 
-    public static class EventNotifier extends SchemaChangeListener implements IEndpointLifecycleSubscriber
+    public static class EventNotifier implements SchemaChangeListener, IEndpointLifecycleSubscriber
     {
         private ConnectionTracker connectionTracker;
 
@@ -381,7 +386,7 @@
                 // That should not happen, so log an error, but return the
                 // endpoint address since there's a good change this is right
                 logger.error("Problem retrieving RPC address for {}", endpoint, e);
-                return InetAddressAndPort.getByAddressOverrideDefaults(endpoint.address, DatabaseDescriptor.getNativeTransportPort());
+                return InetAddressAndPort.getByAddressOverrideDefaults(endpoint.getAddress(), DatabaseDescriptor.getNativeTransportPort());
             }
         }
 
@@ -407,6 +412,7 @@
             connectionTracker.send(event);
         }
 
+        @Override
         public void onJoinCluster(InetAddressAndPort endpoint)
         {
             if (!StorageService.instance.isRpcReady(endpoint))
@@ -415,16 +421,19 @@
                 onTopologyChange(endpoint, Event.TopologyChange.newNode(getNativeAddress(endpoint)));
         }
 
+        @Override
         public void onLeaveCluster(InetAddressAndPort endpoint)
         {
             onTopologyChange(endpoint, Event.TopologyChange.removedNode(getNativeAddress(endpoint)));
         }
 
+        @Override
         public void onMove(InetAddressAndPort endpoint)
         {
             onTopologyChange(endpoint, Event.TopologyChange.movedNode(getNativeAddress(endpoint)));
         }
 
+        @Override
         public void onUp(InetAddressAndPort endpoint)
         {
             if (endpointsPendingJoinedNotification.remove(endpoint))
@@ -433,6 +442,7 @@
             onStatusChange(endpoint, Event.StatusChange.nodeUp(getNativeAddress(endpoint)));
         }
 
+        @Override
         public void onDown(InetAddressAndPort endpoint)
         {
             onStatusChange(endpoint, Event.StatusChange.nodeDown(getNativeAddress(endpoint)));
@@ -466,85 +476,100 @@
             }
         }
 
-        public void onCreateKeyspace(String ksName)
+        @Override
+        public void onCreateKeyspace(KeyspaceMetadata keyspace)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, ksName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, keyspace.name));
         }
 
-        public void onCreateTable(String ksName, String cfName)
+        @Override
+        public void onCreateTable(TableMetadata table)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.TABLE, ksName, cfName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.TABLE, table.keyspace, table.name));
         }
 
-        public void onCreateType(String ksName, String typeName)
+        @Override
+        public void onCreateType(UserType type)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.TYPE, ksName, typeName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.TYPE, type.keyspace, type.getNameAsString()));
         }
 
-        public void onCreateFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onCreateFunction(UDFunction function)
         {
             send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.FUNCTION,
-                                        ksName, functionName, AbstractType.asCQLTypeStringList(argTypes)));
+                                        function.name().keyspace, function.name().name, AbstractType.asCQLTypeStringList(function.argTypes())));
         }
 
-        public void onCreateAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onCreateAggregate(UDAggregate aggregate)
         {
             send(new Event.SchemaChange(Event.SchemaChange.Change.CREATED, Event.SchemaChange.Target.AGGREGATE,
-                                        ksName, aggregateName, AbstractType.asCQLTypeStringList(argTypes)));
+                                        aggregate.name().keyspace, aggregate.name().name, AbstractType.asCQLTypeStringList(aggregate.argTypes())));
         }
 
-        public void onAlterKeyspace(String ksName)
+        @Override
+        public void onAlterKeyspace(KeyspaceMetadata before, KeyspaceMetadata after)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, ksName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, after.name));
         }
 
-        public void onAlterTable(String ksName, String cfName, boolean affectsStatements)
+        @Override
+        public void onAlterTable(TableMetadata before, TableMetadata after, boolean affectsStatements)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TABLE, ksName, cfName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TABLE, after.keyspace, after.name));
         }
 
-        public void onAlterType(String ksName, String typeName)
+        @Override
+        public void onAlterType(UserType before, UserType after)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TYPE, ksName, typeName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.TYPE, after.keyspace, after.getNameAsString()));
         }
 
-        public void onAlterFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onAlterFunction(UDFunction before, UDFunction after)
         {
             send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.FUNCTION,
-                                        ksName, functionName, AbstractType.asCQLTypeStringList(argTypes)));
+                                        after.name().keyspace, after.name().name, AbstractType.asCQLTypeStringList(after.argTypes())));
         }
 
-        public void onAlterAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onAlterAggregate(UDAggregate before, UDAggregate after)
         {
             send(new Event.SchemaChange(Event.SchemaChange.Change.UPDATED, Event.SchemaChange.Target.AGGREGATE,
-                                        ksName, aggregateName, AbstractType.asCQLTypeStringList(argTypes)));
+                                        after.name().keyspace, after.name().name, AbstractType.asCQLTypeStringList(after.argTypes())));
         }
 
-        public void onDropKeyspace(String ksName)
+        @Override
+        public void onDropKeyspace(KeyspaceMetadata keyspace, boolean dropData)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, ksName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, keyspace.name));
         }
 
-        public void onDropTable(String ksName, String cfName)
+        @Override
+        public void onDropTable(TableMetadata table, boolean dropData)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TABLE, ksName, cfName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TABLE, table.keyspace, table.name));
         }
 
-        public void onDropType(String ksName, String typeName)
+        @Override
+        public void onDropType(UserType type)
         {
-            send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TYPE, ksName, typeName));
+            send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.TYPE, type.keyspace, type.getNameAsString()));
         }
 
-        public void onDropFunction(String ksName, String functionName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onDropFunction(UDFunction function)
         {
             send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.FUNCTION,
-                                        ksName, functionName, AbstractType.asCQLTypeStringList(argTypes)));
+                                        function.name().keyspace, function.name().name, AbstractType.asCQLTypeStringList(function.argTypes())));
         }
 
-        public void onDropAggregate(String ksName, String aggregateName, List<AbstractType<?>> argTypes)
+        @Override
+        public void onDropAggregate(UDAggregate aggregate)
         {
             send(new Event.SchemaChange(Event.SchemaChange.Change.DROPPED, Event.SchemaChange.Target.AGGREGATE,
-                                        ksName, aggregateName, AbstractType.asCQLTypeStringList(argTypes)));
+                                        aggregate.name().keyspace, aggregate.name().name, AbstractType.asCQLTypeStringList(aggregate.argTypes())));
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/transport/SimpleClient.java b/src/java/org/apache/cassandra/transport/SimpleClient.java
index ae89e93..43bb8ad 100644
--- a/src/java/org/apache/cassandra/transport/SimpleClient.java
+++ b/src/java/org/apache/cassandra/transport/SimpleClient.java
@@ -27,6 +27,8 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
+import org.apache.cassandra.transport.ClientResourceLimits.Overload;
+import org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -36,7 +38,7 @@
 import io.netty.handler.codec.MessageToMessageDecoder;
 import io.netty.handler.codec.MessageToMessageEncoder;
 import io.netty.handler.ssl.SslContext;
-import io.netty.util.concurrent.Promise;
+import io.netty.util.concurrent.Promise; // checkstyle: permit this import
 import io.netty.util.concurrent.PromiseCombiner;
 import io.netty.util.internal.logging.InternalLoggerFactory;
 import io.netty.util.internal.logging.Slf4JLoggerFactory;
@@ -45,14 +47,23 @@
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.net.*;
+import org.apache.cassandra.security.ISslContextFactory;
 import org.apache.cassandra.security.SSLFactory;
 import org.apache.cassandra.transport.messages.*;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static org.apache.cassandra.transport.CQLMessageHandler.envelopeSize;
 import static org.apache.cassandra.transport.Flusher.MAX_FRAMED_PAYLOAD_SIZE;
+import static org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter.NO_OP_LIMITER;
+
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 public class SimpleClient implements Closeable
 {
+
+    public static final int TIMEOUT_SECONDS = 10;
+
     static
     {
         InternalLoggerFactory.setDefaultFactory(new Slf4JLoggerFactory());
@@ -211,7 +222,7 @@
                     .option(ChannelOption.TCP_NODELAY, true);
 
         // Configure the pipeline factory.
-        if(encryptionOptions.isEnabled())
+        if(encryptionOptions.getEnabled())
         {
             bootstrap.handler(new SecureInitializer(largeMessageThreshold));
         }
@@ -281,7 +292,7 @@
         {
             request.attach(connection);
             lastWriteFuture = channel.writeAndFlush(Collections.singletonList(request));
-            Message.Response msg = responseHandler.responses.poll(10, TimeUnit.SECONDS);
+            Message.Response msg = responseHandler.responses.poll(TIMEOUT_SECONDS, TimeUnit.SECONDS);
             if (msg == null)
                 throw new RuntimeException("timeout");
             if (throwOnErrorResponse && msg instanceof ErrorMessage)
@@ -290,7 +301,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
     }
 
@@ -310,10 +321,10 @@
                 }
                 lastWriteFuture = channel.writeAndFlush(requests);
 
-                long deadline = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10);
+                long deadline = currentTimeMillis() + TimeUnit.SECONDS.toMillis(TIMEOUT_SECONDS);
                 for (int i = 0; i < requests.size(); i++)
                 {
-                    Message.Response msg = responseHandler.responses.poll(deadline - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+                    Message.Response msg = responseHandler.responses.poll(deadline - currentTimeMillis(), TimeUnit.MILLISECONDS);
                     if (msg == null)
                         throw new RuntimeException("timeout");
                     if (msg instanceof ErrorMessage)
@@ -332,7 +343,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
     }
 
@@ -343,7 +354,7 @@
 
     public static class SimpleEventHandler implements EventHandler
     {
-        public final LinkedBlockingQueue<Event> queue = new LinkedBlockingQueue<>();
+        public final BlockingQueue<Event> queue = newBlockingQueue();
 
         public void onEvent(Event event)
         {
@@ -393,7 +404,7 @@
                 case AUTHENTICATE:
                     if (response.header.version.isGreaterOrEqualTo(ProtocolVersion.V5))
                     {
-                        configureModernPipeline(ctx, response);
+                        configureModernPipeline(ctx, response, largeMessageThreshold);
                         // consuming the message is done when setting up the pipeline
                     }
                     else
@@ -414,7 +425,7 @@
             }
         }
 
-        private void configureModernPipeline(ChannelHandlerContext ctx, Envelope response)
+        private void configureModernPipeline(ChannelHandlerContext ctx, Envelope response, int largeMessageThreshold)
         {
             logger.info("Configuring modern pipeline");
             ChannelPipeline pipeline = ctx.pipeline();
@@ -434,7 +445,7 @@
             FrameEncoder frameEncoder = frameEncoder(ctx);
             FrameEncoder.PayloadAllocator payloadAllocator = frameEncoder.allocator();
 
-            CQLMessageHandler.MessageConsumer<Message.Response> responseConsumer = (c, message, converter) -> {
+            CQLMessageHandler.MessageConsumer<Message.Response> responseConsumer = (c, message, converter, backpressured) -> {
                 responseHandler.handleResponse(c, message);
             };
 
@@ -470,6 +481,12 @@
                     return endpointQueue;
                 }
 
+                @Override
+                public NonBlockingRateLimiter requestRateLimiter()
+                {
+                    return NO_OP_LIMITER;
+                }
+
                 public void release()
                 {
                 }
@@ -512,7 +529,7 @@
                     Connection connection = ctx.channel().attr(Connection.attributeKey).get();
                     // The only case the connection can be null is when we send the initial STARTUP message (client side thus)
                     ProtocolVersion version = connection == null ? ProtocolVersion.CURRENT : connection.getVersion();
-                    SimpleFlusher flusher = new SimpleFlusher(frameEncoder);
+                    SimpleFlusher flusher = new SimpleFlusher(frameEncoder, largeMessageThreshold);
                     for (Message message : (List<Message>) msg)
                         flusher.enqueue(message.encode(version));
 
@@ -522,7 +539,7 @@
             pipeline.remove(this);
 
             Message.Response message = messageDecoder.decode(ctx.channel(), response);
-            responseConsumer.accept(channel, message, (ch, req, resp) -> null);
+            responseConsumer.accept(channel, message, (ch, req, resp) -> null, Overload.NONE);
         }
 
         private FrameDecoder frameDecoder(ChannelHandlerContext ctx, BufferPoolAllocator allocator)
@@ -606,7 +623,7 @@
         {
             super.initChannel(channel);
             SslContext sslContext = SSLFactory.getOrCreateSslContext(encryptionOptions, encryptionOptions.require_client_auth,
-                                                                     SSLFactory.SocketType.CLIENT);
+                                                                     ISslContextFactory.SocketType.CLIENT);
             channel.pipeline().addFirst("ssl", sslContext.newHandler(channel.alloc()));
         }
     }
@@ -639,9 +656,9 @@
                 else
                     responses.put(r);
             }
-            catch (InterruptedException ie)
+            catch (InterruptedException e)
             {
-                throw new RuntimeException(ie);
+                throw new UncheckedInterruptedException(e);
             }
         }
 
@@ -669,10 +686,17 @@
         final Queue<Envelope> outbound = new ConcurrentLinkedQueue<>();
         final FrameEncoder frameEncoder;
         private final AtomicBoolean scheduled = new AtomicBoolean(false);
+        private final int largeMessageThreshold;
+
+        SimpleFlusher(FrameEncoder frameEncoder, int largeMessageThreshold)
+        {
+            this.frameEncoder = frameEncoder;
+            this.largeMessageThreshold = largeMessageThreshold;
+        }
 
         SimpleFlusher(FrameEncoder frameEncoder)
         {
-            this.frameEncoder = frameEncoder;
+            this(frameEncoder, MAX_FRAMED_PAYLOAD_SIZE);
         }
 
         public void enqueue(Envelope message)
@@ -709,14 +733,14 @@
             Envelope f;
             while ((f = outbound.poll()) != null)
             {
-                if (f.header.bodySizeInBytes > MAX_FRAMED_PAYLOAD_SIZE)
+                if (f.header.bodySizeInBytes > largeMessageThreshold)
                 {
                     combiner.addAll(writeLargeMessage(ctx, f));
                 }
                 else
                 {
                     int messageSize = envelopeSize(f.header);
-                    if (bufferSize + messageSize >= MAX_FRAMED_PAYLOAD_SIZE)
+                    if (bufferSize + messageSize >= largeMessageThreshold)
                     {
                         combiner.add(flushBuffer(ctx, buffer, bufferSize));
                         buffer = new ArrayList<>();
@@ -751,9 +775,9 @@
         private FrameEncoder.Payload allocate(int size, boolean selfContained)
         {
             FrameEncoder.Payload payload = frameEncoder.allocator()
-                                                       .allocate(selfContained, Math.min(size, MAX_FRAMED_PAYLOAD_SIZE));
-            if (size >= MAX_FRAMED_PAYLOAD_SIZE)
-                payload.buffer.limit(MAX_FRAMED_PAYLOAD_SIZE);
+                                                       .allocate(selfContained, Math.min(size, largeMessageThreshold));
+            if (size >= largeMessageThreshold)
+                payload.buffer.limit(largeMessageThreshold);
 
             return payload;
         }
@@ -766,14 +790,14 @@
             boolean firstFrame = true;
             while (f.body.readableBytes() > 0 || firstFrame)
             {
-                int payloadSize = Math.min(f.body.readableBytes(), MAX_FRAMED_PAYLOAD_SIZE);
+                int payloadSize = Math.min(f.body.readableBytes(), largeMessageThreshold);
                 payload = allocate(f.body.readableBytes(), false);
 
                 buf = payload.buffer;
                 // BufferPool may give us a buffer larger than we asked for.
                 // FrameEncoder may object if buffer.remaining is >= MAX_SIZE.
-                if (payloadSize >= MAX_FRAMED_PAYLOAD_SIZE)
-                    buf.limit(MAX_FRAMED_PAYLOAD_SIZE);
+                if (payloadSize >= largeMessageThreshold)
+                    buf.limit(largeMessageThreshold);
 
                 if (firstFrame)
                 {
diff --git a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
index afc308a..de575ce 100644
--- a/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/BatchMessage.java
@@ -20,13 +20,9 @@
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
-import java.util.concurrent.TimeUnit;
 
 import com.google.common.collect.ImmutableMap;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import io.netty.buffer.ByteBuf;
 import org.apache.cassandra.cql3.Attributes;
 import org.apache.cassandra.cql3.BatchQueryOptions;
@@ -49,7 +45,8 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.MD5Digest;
-import org.apache.cassandra.utils.NoSpamLogger;
+
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class BatchMessage extends Message.Request
 {
@@ -166,6 +163,12 @@
     }
 
     @Override
+    protected boolean isTrackable()
+    {
+        return true;
+    }
+
+    @Override
     protected Message.Response execute(QueryState state, long queryStartNanoTime, boolean traceRequest)
     {
         List<QueryHandler.Prepared> prepared = null;
@@ -222,7 +225,7 @@
             // (and no value would be really correct, so we prefer passing a clearly wrong one).
             BatchStatement batch = new BatchStatement(batchType, VariableSpecifications.empty(), statements, Attributes.none());
 
-            long queryTime = System.currentTimeMillis();
+            long queryTime = currentTimeMillis();
             Message.Response response = handler.processBatch(batch, state, batchOptions, getCustomPayload(), queryStartNanoTime);
             if (queries != null)
                 QueryEvents.instance.notifyBatchSuccess(batchType, statements, queries, values, options, state, queryTime, response);
diff --git a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
index 6890584..5d29d3a 100644
--- a/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/ErrorMessage.java
@@ -222,7 +222,7 @@
                         {
                             for (Map.Entry<InetAddressAndPort, RequestFailureReason> entry : rfe.failureReasonByEndpoint.entrySet())
                             {
-                                CBUtil.writeInetAddr(entry.getKey().address, dest);
+                                CBUtil.writeInetAddr(entry.getKey().getAddress(), dest);
                                 dest.writeShort(entry.getValue().code);
                             }
                         }
@@ -302,7 +302,7 @@
                         {
                             for (Map.Entry<InetAddressAndPort, RequestFailureReason> entry : rfe.failureReasonByEndpoint.entrySet())
                             {
-                                size += CBUtil.sizeOfInetAddr(entry.getKey().address);
+                                size += CBUtil.sizeOfInetAddr(entry.getKey().getAddress());
                                 size += 2; // RequestFailureReason code
                             }
                         }
diff --git a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
index 19d40ba..692d183 100644
--- a/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/ExecuteMessage.java
@@ -42,6 +42,8 @@
 import org.apache.cassandra.utils.MD5Digest;
 import org.apache.cassandra.utils.NoSpamLogger;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class ExecuteMessage extends Message.Request
 {
     private static final NoSpamLogger nospam = NoSpamLogger.getLogger(logger, 10, TimeUnit.MINUTES);
@@ -117,6 +119,12 @@
     }
 
     @Override
+    protected boolean isTrackable()
+    {
+        return true;
+    }
+
+    @Override
     protected Message.Response execute(QueryState state, long queryStartNanoTime, boolean traceRequest)
     {
         QueryHandler.Prepared prepared = null;
@@ -154,7 +162,7 @@
             // by wrapping the QueryOptions.
             QueryOptions queryOptions = QueryOptions.addColumnSpecifications(options, prepared.statement.getBindVariables());
 
-            long requestStartTime = System.currentTimeMillis();
+            long requestStartTime = currentTimeMillis();
 
             Message.Response response = handler.processPrepared(statement, state, queryOptions, getCustomPayload(), queryStartNanoTime);
 
diff --git a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
index 6c60f78..20861d0 100644
--- a/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/PrepareMessage.java
@@ -36,6 +36,8 @@
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.NoSpamLogger;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class PrepareMessage extends Message.Request
 {
     private static final Logger logger = LoggerFactory.getLogger(PrepareMessage.class);
@@ -121,7 +123,7 @@
 
             ClientState clientState = state.getClientState().cloneWithKeyspaceIfSet(keyspace);
             QueryHandler queryHandler = ClientState.getCQLQueryHandler();
-            long queryTime = System.currentTimeMillis();
+            long queryTime = currentTimeMillis();
             ResultMessage.Prepared response = queryHandler.prepare(query, clientState, getCustomPayload());
             QueryEvents.instance.notifyPrepareSuccess(() -> queryHandler.getPrepared(response.statementId), query, state, queryTime, response);
             return response;
diff --git a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
index 71d7c73..9a296e4 100644
--- a/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/QueryMessage.java
@@ -35,6 +35,8 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * A CQL query
  */
@@ -90,6 +92,12 @@
     }
 
     @Override
+    protected boolean isTrackable()
+    {
+        return true;
+    }
+
+    @Override
     protected Message.Response execute(QueryState state, long queryStartNanoTime, boolean traceRequest)
     {
         CQLStatement statement = null;
@@ -101,7 +109,7 @@
             if (traceRequest)
                 traceQuery(state);
 
-            long queryStartTime = System.currentTimeMillis();
+            long queryStartTime = currentTimeMillis();
 
             QueryHandler queryHandler = ClientState.getCQLQueryHandler();
             statement = queryHandler.parse(query, state, options);
diff --git a/src/java/org/apache/cassandra/transport/messages/StartupMessage.java b/src/java/org/apache/cassandra/transport/messages/StartupMessage.java
index 172768c..37afb22 100644
--- a/src/java/org/apache/cassandra/transport/messages/StartupMessage.java
+++ b/src/java/org/apache/cassandra/transport/messages/StartupMessage.java
@@ -110,6 +110,7 @@
         connection.setThrowOnOverload("1".equals(options.get(THROW_ON_OVERLOAD)));
 
         ClientState clientState = state.getClientState();
+        clientState.setClientOptions(options);
         String driverName = options.get(DRIVER_NAME);
         if (null != driverName)
         {
diff --git a/src/java/org/apache/cassandra/triggers/CustomClassLoader.java b/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
index 6948c2d..95be219 100644
--- a/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
+++ b/src/java/org/apache/cassandra/triggers/CustomClassLoader.java
@@ -19,35 +19,34 @@
  * under the License.
  *
  */
-
-
-import java.io.File;
-import java.io.FilenameFilter;
 import java.io.IOException;
 import java.net.URL;
 import java.net.URLClassLoader;
+import java.nio.file.StandardCopyOption;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiPredicate;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.io.Files;
-
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.util.FileUtils;
 
+import static java.nio.file.Files.*;
+
 /**
  * Custom class loader will load the classes from the class path, CCL will load
- * the classes from the the URL first, if it cannot find the required class it
- * will let the parent class loader do the its job.
+ * the classes from the URL first, if it cannot find the required class it
+ * will let the parent class loader do its job.
  *
  * Note: If the CCL is GC'ed then the associated classes will be unloaded.
  */
 public class CustomClassLoader extends URLClassLoader
 {
     private static final Logger logger = LoggerFactory.getLogger(CustomClassLoader.class);
-    private final Map<String, Class<?>> cache = new ConcurrentHashMap<String, Class<?>>();
+    private final Map<String, Class<?>> cache = new ConcurrentHashMap<>();
     private final ClassLoader parent;
 
     public CustomClassLoader(ClassLoader parent)
@@ -69,28 +68,22 @@
     {
         if (dir == null || !dir.exists())
             return;
-        FilenameFilter filter = new FilenameFilter()
-        {
-            public boolean accept(File dir, String name)
-            {
-                return name.endsWith(".jar");
-            }
-        };
-        for (File inputJar : dir.listFiles(filter))
+        BiPredicate<File, String> filter = (ignore, name) -> name.endsWith(".jar");
+        for (File inputJar : dir.tryList(filter))
         {
             File lib = new File(FileUtils.getTempDir(), "lib");
             if (!lib.exists())
             {
-                lib.mkdir();
+                lib.tryCreateDirectory();
                 lib.deleteOnExit();
             }
             File out = FileUtils.createTempFile("cassandra-", ".jar", lib);
             out.deleteOnExit();
-            logger.info("Loading new jar {}", inputJar.getAbsolutePath());
+            logger.info("Loading new jar {}", inputJar.absolutePath());
             try
             {
-                Files.copy(inputJar, out);
-                addURL(out.toURI().toURL());
+                copy(inputJar.toPath(), out.toPath(), StandardCopyOption.REPLACE_EXISTING);
+                addURL(out.toPath().toUri().toURL());
             }
             catch (IOException ex)
             {
diff --git a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
index 295003f..c76c6bd 100644
--- a/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
+++ b/src/java/org/apache/cassandra/triggers/TriggerExecutor.java
@@ -18,7 +18,6 @@
  */
 package org.apache.cassandra.triggers;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.*;
 
@@ -33,6 +32,7 @@
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.exceptions.CassandraException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TriggerMetadata;
 import org.apache.cassandra.schema.Triggers;
@@ -44,7 +44,7 @@
     public static final TriggerExecutor instance = new TriggerExecutor();
 
     private final Map<String, ITrigger> cachedTriggers = Maps.newConcurrentMap();
-    private final ClassLoader parent = Thread.currentThread().getContextClassLoader();
+    private final ClassLoader parent = TriggerExecutor.class.getClassLoader();
     private volatile ClassLoader customClassLoader;
 
     private TriggerExecutor()
diff --git a/src/java/org/apache/cassandra/utils/ApproximateTime.java b/src/java/org/apache/cassandra/utils/ApproximateTime.java
deleted file mode 100644
index 32b6e44..0000000
--- a/src/java/org/apache/cassandra/utils/ApproximateTime.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.utils;
-
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-
-import com.google.common.annotations.VisibleForTesting;
-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.utils.ApproximateTime.Measurement.ALMOST_NOW;
-import static org.apache.cassandra.utils.ApproximateTime.Measurement.ALMOST_SAME_TIME;
-
-/**
- * This class provides approximate time utilities:
- *   - An imprecise nanoTime (monotonic) and currentTimeMillis (non-monotonic), that are faster than their regular counterparts
- *     They have a configured approximate precision (default of 10ms), which is the cadence they will be updated if the system is healthy
- *   - A mechanism for converting between nanoTime and currentTimeMillis measurements.
- *     These conversions may have drifted, and they offer no absolute guarantees on precision
- */
-public class ApproximateTime
-{
-    private static final Logger logger = LoggerFactory.getLogger(ApproximateTime.class);
-    private static final int ALMOST_NOW_UPDATE_INTERVAL_MS = Math.max(1, Integer.parseInt(System.getProperty(Config.PROPERTY_PREFIX + "approximate_time_precision_ms", "2")));
-    private static final String CONVERSION_UPDATE_INTERVAL_PROPERTY = Config.PROPERTY_PREFIX + "NANOTIMETOMILLIS_TIMESTAMP_UPDATE_INTERVAL";
-    private static final long ALMOST_SAME_TIME_UPDATE_INTERVAL_MS = Long.getLong(CONVERSION_UPDATE_INTERVAL_PROPERTY, 10000);
-
-    public static class AlmostSameTime
-    {
-        final long millis;
-        final long nanos;
-        final long error; // maximum error of millis measurement (in nanos)
-
-        private AlmostSameTime(long millis, long nanos, long error)
-        {
-            this.millis = millis;
-            this.nanos = nanos;
-            this.error = error;
-        }
-
-        public long toCurrentTimeMillis(long nanoTime)
-        {
-            return millis + TimeUnit.NANOSECONDS.toMillis(nanoTime - nanos);
-        }
-
-        public long toNanoTime(long currentTimeMillis)
-        {
-            return nanos + MILLISECONDS.toNanos(currentTimeMillis - millis);
-        }
-    }
-
-    public enum Measurement { ALMOST_NOW, ALMOST_SAME_TIME }
-
-    private static volatile Future<?> almostNowUpdater;
-    private static volatile Future<?> almostSameTimeUpdater;
-
-    private static volatile long almostNowMillis;
-    private static volatile long almostNowNanos;
-
-    private static volatile AlmostSameTime almostSameTime = new AlmostSameTime(0L, 0L, Long.MAX_VALUE);
-    private static double failedAlmostSameTimeUpdateModifier = 1.0;
-
-    private static final Runnable refreshAlmostNow = () -> {
-        almostNowMillis = System.currentTimeMillis();
-        almostNowNanos = System.nanoTime();
-    };
-
-    private static final Runnable refreshAlmostSameTime = () -> {
-        final int tries = 3;
-        long[] samples = new long[2 * tries + 1];
-        samples[0] = System.nanoTime();
-        for (int i = 1 ; i < samples.length ; i += 2)
-        {
-            samples[i] = System.currentTimeMillis();
-            samples[i + 1] = System.nanoTime();
-        }
-
-        int best = 1;
-        // take sample with minimum delta between calls
-        for (int i = 3 ; i < samples.length - 1 ; i += 2)
-        {
-            if ((samples[i+1] - samples[i-1]) < (samples[best+1]-samples[best-1]))
-                best = i;
-        }
-
-        long millis = samples[best];
-        long nanos = (samples[best+1] / 2) + (samples[best-1] / 2);
-        long error = (samples[best+1] / 2) - (samples[best-1] / 2);
-
-        AlmostSameTime prev = almostSameTime;
-        AlmostSameTime next = new AlmostSameTime(millis, nanos, error);
-
-        if (next.error > prev.error && next.error > prev.error * failedAlmostSameTimeUpdateModifier)
-        {
-            failedAlmostSameTimeUpdateModifier *= 1.1;
-            return;
-        }
-
-        failedAlmostSameTimeUpdateModifier = 1.0;
-        almostSameTime = next;
-    };
-
-    static
-    {
-        start(ALMOST_NOW);
-        start(ALMOST_SAME_TIME);
-    }
-
-    public static synchronized void stop(Measurement measurement)
-    {
-        switch (measurement)
-        {
-            case ALMOST_NOW:
-                almostNowUpdater.cancel(true);
-                try { almostNowUpdater.get(); } catch (Throwable t) { }
-                almostNowUpdater = null;
-                break;
-            case ALMOST_SAME_TIME:
-                almostSameTimeUpdater.cancel(true);
-                try { almostSameTimeUpdater.get(); } catch (Throwable t) { }
-                almostSameTimeUpdater = null;
-                break;
-        }
-    }
-
-    public static synchronized void start(Measurement measurement)
-    {
-        switch (measurement)
-        {
-            case ALMOST_NOW:
-                if (almostNowUpdater != null)
-                    throw new IllegalStateException("Already running");
-                refreshAlmostNow.run();
-                logger.info("Scheduling approximate time-check task with a precision of {} milliseconds", ALMOST_NOW_UPDATE_INTERVAL_MS);
-                almostNowUpdater = ScheduledExecutors.scheduledFastTasks.scheduleWithFixedDelay(refreshAlmostNow, ALMOST_NOW_UPDATE_INTERVAL_MS, ALMOST_NOW_UPDATE_INTERVAL_MS, MILLISECONDS);
-                break;
-            case ALMOST_SAME_TIME:
-                if (almostSameTimeUpdater != null)
-                    throw new IllegalStateException("Already running");
-                refreshAlmostSameTime.run();
-                logger.info("Scheduling approximate time conversion task with an interval of {} milliseconds", ALMOST_SAME_TIME_UPDATE_INTERVAL_MS);
-                almostSameTimeUpdater = ScheduledExecutors.scheduledFastTasks.scheduleWithFixedDelay(refreshAlmostSameTime, ALMOST_SAME_TIME_UPDATE_INTERVAL_MS, ALMOST_SAME_TIME_UPDATE_INTERVAL_MS, MILLISECONDS);
-                break;
-        }
-    }
-
-
-    /**
-     * Request an immediate refresh; this shouldn't generally be invoked, except perhaps by tests
-     */
-    @VisibleForTesting
-    public static synchronized void refresh(Measurement measurement)
-    {
-        stop(measurement);
-        start(measurement);
-    }
-
-    /** no guarantees about relationship to nanoTime; non-monotonic (tracks currentTimeMillis as closely as possible) */
-    public static long currentTimeMillis()
-    {
-        return almostNowMillis;
-    }
-
-    /** no guarantees about relationship to currentTimeMillis; monotonic */
-    public static long nanoTime()
-    {
-        return almostNowNanos;
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/BiLongAccumulator.java b/src/java/org/apache/cassandra/utils/BiLongAccumulator.java
index 2c3d6b5..cdf2a4f 100644
--- a/src/java/org/apache/cassandra/utils/BiLongAccumulator.java
+++ b/src/java/org/apache/cassandra/utils/BiLongAccumulator.java
@@ -20,5 +20,5 @@
 
 public interface BiLongAccumulator<T, A>
 {
-    long apply(T obj, A arguemnt, long v);
+    long apply(T obj, A argument, long v);
 }
diff --git a/src/java/org/apache/cassandra/utils/BloomFilterSerializer.java b/src/java/org/apache/cassandra/utils/BloomFilterSerializer.java
index d3c08b5..3df4314 100644
--- a/src/java/org/apache/cassandra/utils/BloomFilterSerializer.java
+++ b/src/java/org/apache/cassandra/utils/BloomFilterSerializer.java
@@ -17,8 +17,9 @@
  */
 package org.apache.cassandra.utils;
 
-import java.io.DataInputStream;
+import java.io.DataInput;
 import java.io.IOException;
+import java.io.InputStream;
 
 import org.apache.cassandra.db.TypeSizes;
 import org.apache.cassandra.io.util.DataOutputPlus;
@@ -38,7 +39,7 @@
     }
 
     @SuppressWarnings("resource")
-    public static BloomFilter deserialize(DataInputStream in, boolean oldBfFormat) throws IOException
+    public static <I extends InputStream & DataInput> BloomFilter deserialize(I in, boolean oldBfFormat) throws IOException
     {
         int hashes = in.readInt();
         IBitSet bs = OffHeapBitSet.deserialize(in, oldBfFormat);
diff --git a/src/java/org/apache/cassandra/utils/BreaksJMX.java b/src/java/org/apache/cassandra/utils/BreaksJMX.java
new file mode 100644
index 0000000..566ef82
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/BreaksJMX.java
@@ -0,0 +1,34 @@
+/*
+ * 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.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Annotation to have JMX breaking APIs not trigger test failures, each example must explain why it is ok to expose a
+ * JMX breaking API
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.METHOD })
+public @interface BreaksJMX
+{
+    String value();
+}
diff --git a/src/java/org/apache/cassandra/utils/ByteArrayUtil.java b/src/java/org/apache/cassandra/utils/ByteArrayUtil.java
index 58229c0..8c84ee5 100644
--- a/src/java/org/apache/cassandra/utils/ByteArrayUtil.java
+++ b/src/java/org/apache/cassandra/utils/ByteArrayUtil.java
@@ -277,4 +277,4 @@
     {
         FastByteOperations.copy(src, srcPos, dst, dstPos, length);
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
index d0ab6b2..ba7d1be 100644
--- a/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
+++ b/src/java/org/apache/cassandra/utils/ByteBufferUtil.java
@@ -522,6 +522,8 @@
             return ByteBufferUtil.bytes((InetAddress) obj);
         else if (obj instanceof String)
             return ByteBufferUtil.bytes((String) obj);
+        else if (obj instanceof byte[])
+            return ByteBuffer.wrap((byte[]) obj);
         else if (obj instanceof ByteBuffer)
             return (ByteBuffer) obj;
         else
@@ -662,6 +664,11 @@
         return ByteBuffer.wrap(UUIDGen.decompose(uuid));
     }
 
+    public static ByteBuffer bytes(TimeUUID uuid)
+    {
+        return bytes(uuid.asUUID());
+    }
+
     // Returns whether {@code prefix} is a prefix of {@code value}.
     public static boolean isPrefix(ByteBuffer prefix, ByteBuffer value)
     {
diff --git a/src/java/org/apache/cassandra/utils/CassandraVersion.java b/src/java/org/apache/cassandra/utils/CassandraVersion.java
index 56290fb..766f0e8 100644
--- a/src/java/org/apache/cassandra/utils/CassandraVersion.java
+++ b/src/java/org/apache/cassandra/utils/CassandraVersion.java
@@ -43,17 +43,31 @@
      * note: 3rd/4th groups matches to words but only allows number and checked after regexp test.
      * this is because 3rd and the last can be identical.
      **/
-    private static final String VERSION_REGEXP = "(\\d+)\\.(\\d+)(?:\\.(\\w+))?(?:\\.(\\w+))?(\\-[-.\\w]+)?([.+][.\\w]+)?";
+    private static final String VERSION_REGEXP = "(?<major>\\d+)\\.(?<minor>\\d+)(\\.(?<patch>\\w+)(\\.(?<hotfix>\\w+))?)?(-(?<prerelease>[-.\\w]+))?([.+](?<build>[.\\w]+))?";
     private static final Pattern PATTERN_WORDS = Pattern.compile("\\w+");
     @VisibleForTesting
     static final int NO_HOTFIX = -1;
 
     private static final Pattern PATTERN = Pattern.compile(VERSION_REGEXP);
 
+    public static final CassandraVersion CASSANDRA_4_1 = new CassandraVersion("4.1").familyLowerBound.get();
     public static final CassandraVersion CASSANDRA_4_0 = new CassandraVersion("4.0").familyLowerBound.get();
     public static final CassandraVersion CASSANDRA_4_0_RC2 = new CassandraVersion(4, 0, 0, NO_HOTFIX, new String[] {"rc2"}, null);
     public static final CassandraVersion CASSANDRA_3_4 = new CassandraVersion("3.4").familyLowerBound.get();
 
+    /**
+     * Used to indicate that there was a previous version written to the legacy (pre 1.2)
+     * system.Versions table, but that we cannot read it. Suffice to say, any upgrade should
+     * proceed through 1.2.x before upgrading to the current version.
+     */
+    public static final CassandraVersion UNREADABLE_VERSION = new CassandraVersion("0.0.0-unknown");
+
+    /**
+     * Used to indicate that no previous version information was found. When encountered, we assume that
+     * Cassandra was not previously installed and we're in the process of starting a fresh node.
+     */
+    public static final CassandraVersion NULL_VERSION = new CassandraVersion("0.0.0-absent");
+
     public final int major;
     public final int minor;
     public final int patch;
@@ -90,13 +104,13 @@
 
         try
         {
-            this.major = Integer.parseInt(matcher.group(1));
-            this.minor = Integer.parseInt(matcher.group(2));
-            this.patch = matcher.group(3) != null ? Integer.parseInt(matcher.group(3)) : 0;
-            this.hotfix = matcher.group(4) != null ? Integer.parseInt(matcher.group(4)) : NO_HOTFIX;
+            this.major = intPart(matcher, "major");
+            this.minor = intPart(matcher, "minor");
+            this.patch = intPart(matcher, "patch", 0);
+            this.hotfix = intPart(matcher, "hotfix", NO_HOTFIX);
 
-            String pr = matcher.group(5);
-            String bld = matcher.group(6);
+            String pr = matcher.group("prerelease");
+            String bld = matcher.group("build");
 
             this.preRelease = pr == null || pr.isEmpty() ? null : parseIdentifiers(version, pr);
             this.build = bld == null || bld.isEmpty() ? null : parseIdentifiers(version, bld);
@@ -107,6 +121,17 @@
         }
     }
 
+    private static int intPart(Matcher matcher, String group)
+    {
+        return Integer.parseInt(matcher.group(group));
+    }
+
+    private static int intPart(Matcher matcher, String group, int orElse)
+    {
+        String value = matcher.group(group);
+        return value == null ? orElse : Integer.parseInt(value);
+    }
+
     private CassandraVersion getFamilyLowerBound()
     {
         return patch == 0 && hotfix == NO_HOTFIX && preRelease != null && preRelease.length == 0 && build == null
@@ -117,7 +142,6 @@
     private static String[] parseIdentifiers(String version, String str)
     {
         // Drop initial - or +
-        str = str.substring(1);
         String[] parts = StringUtils.split(str, ".-");
         for (String part : parts)
         {
diff --git a/src/java/org/apache/cassandra/utils/Clock.java b/src/java/org/apache/cassandra/utils/Clock.java
new file mode 100644
index 0000000..7fffefb
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Clock.java
@@ -0,0 +1,143 @@
+/*
+ * 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.utils;
+
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+
+import static org.apache.cassandra.config.CassandraRelevantProperties.CLOCK_GLOBAL;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Wrapper around time related functions that are either implemented by using the default JVM calls
+ * or by using a custom implementation for testing purposes.
+ *
+ * See {@link Global#instance} for how to use a custom implementation.
+ *
+ * Please note that {@link java.time.Clock} wasn't used, as it would not be possible to provide an
+ * implementation for {@link #nanoTime()} with the exact same properties of {@link System#nanoTime()}.
+ */
+@Shared(scope = SIMULATION)
+public interface Clock
+{
+    public static class Global
+    {
+        // something weird happens with class loading Logger that can cause a deadlock
+        private static Throwable FAILED_TO_INITIALISE;
+        private static String INITIALIZE_MESSAGE;
+
+        /**
+         * Static singleton object that will be instantiated by default with a system clock
+         * implementation. Set <code>cassandra.clock</code> system property to a FQCN to use a
+         * different implementation instead.
+         */
+        private static final Clock instance;
+
+        static
+        {
+            String classname = CLOCK_GLOBAL.getString();
+            Clock clock = new Default();
+            Throwable errorOutcome = null;
+            String outcome = null;
+            if (classname != null)
+            {
+                try
+                {
+                    outcome = "Using custom clock implementation: " + classname;
+                    clock = (Clock) Class.forName(classname).newInstance();
+                }
+                catch (Throwable t)
+                {
+                    outcome = "Failed to load clock implementation " + classname;
+                    errorOutcome = t;
+                }
+            }
+            instance = clock;
+            FAILED_TO_INITIALISE = errorOutcome;
+            INITIALIZE_MESSAGE = outcome;
+        }
+
+        public static void logInitializationOutcome(Logger logger)
+        {
+            if (FAILED_TO_INITIALISE != null)
+            {
+                logger.error(INITIALIZE_MESSAGE, FAILED_TO_INITIALISE);
+            }
+            else if (INITIALIZE_MESSAGE != null)
+            {
+                logger.debug(INITIALIZE_MESSAGE);
+            }
+            FAILED_TO_INITIALISE = null;
+            INITIALIZE_MESSAGE = null;
+        }
+
+        /**
+         * Semantically equivalent to {@link System#nanoTime()}
+         */
+        public static long nanoTime()
+        {
+            return instance.nanoTime();
+        }
+
+        /**
+         * Semantically equivalent to {@link System#currentTimeMillis()}
+         */
+        public static long currentTimeMillis()
+        {
+            return instance.currentTimeMillis();
+        }
+    }
+
+    public static class Default implements Clock
+    {
+        /**
+         * {@link System#nanoTime()}
+         */
+        public long nanoTime()
+        {
+            return System.nanoTime(); // checkstyle: permit system clock
+        }
+
+        /**
+         * {@link System#currentTimeMillis()}
+         */
+        public long currentTimeMillis()
+        {
+            return System.currentTimeMillis(); // checkstyle: permit system clock
+        }
+    }
+
+    /**
+     * Semantically equivalent to {@link System#nanoTime()}
+     */
+    public long nanoTime();
+
+    /**
+     * Semantically equivalent to {@link System#currentTimeMillis()}
+     */
+    public long currentTimeMillis();
+
+    @Intercept
+    public static void waitUntil(long deadlineNanos) throws InterruptedException
+    {
+        long waitNanos = deadlineNanos - Clock.Global.nanoTime();
+        if (waitNanos > 0)
+            TimeUnit.NANOSECONDS.sleep(waitNanos);
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/Closeable.java b/src/java/org/apache/cassandra/utils/Closeable.java
new file mode 100644
index 0000000..1a8c1e9
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Closeable.java
@@ -0,0 +1,27 @@
+/*
+ * 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.utils;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface Closeable extends java.io.Closeable
+{
+    public void close();
+}
diff --git a/src/java/org/apache/cassandra/utils/CloseableIterator.java b/src/java/org/apache/cassandra/utils/CloseableIterator.java
index 57034ae..32de799 100644
--- a/src/java/org/apache/cassandra/utils/CloseableIterator.java
+++ b/src/java/org/apache/cassandra/utils/CloseableIterator.java
@@ -18,9 +18,53 @@
 package org.apache.cassandra.utils;
 
 import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 // so we can instantiate anonymous classes implementing both interfaces
 public interface CloseableIterator<T> extends Iterator<T>, AutoCloseable
 {
     public void close();
+
+    public static <T> CloseableIterator<T> wrap(Iterator<T> iter)
+    {
+        return new CloseableIterator<T>()
+        {
+            public void close()
+            {
+                // noop
+            }
+
+            public boolean hasNext()
+            {
+                return iter.hasNext();
+            }
+
+            public T next()
+            {
+                return iter.next();
+            }
+        };
+    }
+
+    public static <T> CloseableIterator<T> empty()
+    {
+        return new CloseableIterator<T>()
+        {
+            public void close()
+            {
+                // noop
+            }
+
+            public boolean hasNext()
+            {
+                return false;
+            }
+
+            public T next()
+            {
+                throw new NoSuchElementException();
+            }
+        };
+    }
+
 }
diff --git a/src/java/org/apache/cassandra/utils/CollectionSerializer.java b/src/java/org/apache/cassandra/utils/CollectionSerializer.java
new file mode 100644
index 0000000..4f8e8b0
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/CollectionSerializer.java
@@ -0,0 +1,125 @@
+/*
+ * 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.utils;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.RandomAccess;
+import java.util.Set;
+import java.util.function.IntFunction;
+
+import com.google.common.collect.Maps;
+import com.google.common.collect.Sets;
+
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+public class CollectionSerializer
+{
+
+    public static <V> void serializeCollection(IVersionedSerializer<V> valueSerializer, Collection<V> values, DataOutputPlus out, int version) throws IOException
+    {
+        out.writeUnsignedVInt(values.size());
+        for (V value : values)
+            valueSerializer.serialize(value, out, version);
+    }
+
+    public static <V, L extends List<V> & RandomAccess> void serializeList(IVersionedSerializer<V> valueSerializer, L values, DataOutputPlus out, int version) throws IOException
+    {
+        int size = values.size();
+        out.writeUnsignedVInt(size);
+        for (int i = 0 ; i < size ; ++i)
+            valueSerializer.serialize(values.get(i), out, version);
+    }
+
+    public static <K, V> void serializeMap(IVersionedSerializer<K> keySerializer, IVersionedSerializer<V> valueSerializer, Map<K, V> map, DataOutputPlus out, int version) throws IOException
+    {
+        out.writeUnsignedVInt(map.size());
+        for (Map.Entry<K, V> e : map.entrySet())
+        {
+            keySerializer.serialize(e.getKey(), out, version);
+            valueSerializer.serialize(e.getValue(), out, version);
+        }
+    }
+
+    public static <V, C extends Collection<? super V>> C deserializeCollection(IVersionedSerializer<V> serializer, IntFunction<C> factory, DataInputPlus in, int version) throws IOException
+    {
+        int size = (int) in.readUnsignedVInt();
+        C result = factory.apply(size);
+        while (size-- > 0)
+            result.add(serializer.deserialize(in, version));
+        return result;
+    }
+
+    public static <K, V, M extends Map<K, V>> M deserializeMap(IVersionedSerializer<K> keySerializer, IVersionedSerializer<V> valueSerializer, IntFunction<M> factory, DataInputPlus in, int version) throws IOException
+    {
+        int size = (int) in.readUnsignedVInt();
+        M result = factory.apply(size);
+        while (size-- > 0)
+        {
+            K key = keySerializer.deserialize(in, version);
+            V value = valueSerializer.deserialize(in, version);
+            result.put(key, value);
+        }
+        return result;
+    }
+
+    public static <V> long serializedSizeCollection(IVersionedSerializer<V> valueSerializer, Collection<V> values, int version)
+    {
+        long size = TypeSizes.sizeofUnsignedVInt(values.size());
+        for (V value : values)
+            size += valueSerializer.serializedSize(value, version);
+        return size;
+    }
+
+    public static <V, L extends List<V> & RandomAccess> long serializedSizeList(IVersionedSerializer<V> valueSerializer, L values, int version) throws IOException
+    {
+        int items = values.size();
+        long size = TypeSizes.sizeofUnsignedVInt(items);
+        for (int i = 0 ; i < items ; ++i)
+            size += valueSerializer.serializedSize(values.get(i), version);
+        return size;
+    }
+
+
+    public static <K, V> long serializedSizeMap(IVersionedSerializer<K> keySerializer, IVersionedSerializer<V> valueSerializer, Map<K, V> map, int version)
+    {
+        long size = TypeSizes.sizeofUnsignedVInt(map.size());
+        for (Map.Entry<K, V> e : map.entrySet())
+            size += keySerializer.serializedSize(e.getKey(), version)
+                  + valueSerializer.serializedSize(e.getValue(), version);
+        return size;
+    }
+
+    public static <V> IntFunction<Set<V>> newHashSet()
+    {
+        return i -> i == 0 ? Collections.emptySet() : Sets.newHashSetWithExpectedSize(i);
+    }
+
+    public static <K, V> IntFunction<Map<K, V>> newHashMap()
+    {
+        return i -> i == 0 ? Collections.emptyMap() : Maps.newHashMapWithExpectedSize(i);
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/utils/Collectors3.java b/src/java/org/apache/cassandra/utils/Collectors3.java
index f8f262e..c48f160 100644
--- a/src/java/org/apache/cassandra/utils/Collectors3.java
+++ b/src/java/org/apache/cassandra/utils/Collectors3.java
@@ -18,22 +18,24 @@
 
 package org.apache.cassandra.utils;
 
-import java.util.List;
-import java.util.Set;
+import java.util.Map;
+import java.util.function.Function;
 import java.util.stream.Collector;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
 
 /**
  * Some extra Collector implementations.
- *
+ * <p>
  * Named Collectors3 just in case Guava ever makes a Collectors2
  */
 public class Collectors3
 {
-    private static final Collector.Characteristics[] LIST_CHARACTERISTICS = new Collector.Characteristics[] { };
-    public static <T>  Collector<T, ?, List<T>> toImmutableList()
+    private static final Collector.Characteristics[] LIST_CHARACTERISTICS = new Collector.Characteristics[]{};
+
+    public static <T> Collector<T, ?, ImmutableList<T>> toImmutableList()
     {
         return Collector.of(ImmutableList.Builder<T>::new,
                             ImmutableList.Builder<T>::add,
@@ -42,8 +44,9 @@
                             LIST_CHARACTERISTICS);
     }
 
-    private static final Collector.Characteristics[] SET_CHARACTERISTICS = new Collector.Characteristics[] { Collector.Characteristics.UNORDERED };
-    public static <T>  Collector<T, ?, Set<T>> toImmutableSet()
+    private static final Collector.Characteristics[] SET_CHARACTERISTICS = new Collector.Characteristics[]{ Collector.Characteristics.UNORDERED };
+
+    public static <T> Collector<T, ?, ImmutableSet<T>> toImmutableSet()
     {
         return Collector.of(ImmutableSet.Builder<T>::new,
                             ImmutableSet.Builder<T>::add,
@@ -51,4 +54,25 @@
                             ImmutableSet.Builder<T>::build,
                             SET_CHARACTERISTICS);
     }
+
+    private static final Collector.Characteristics[] MAP_CHARACTERISTICS = new Collector.Characteristics[]{ Collector.Characteristics.UNORDERED };
+
+    public static <K, V> Collector<Map.Entry<K, V>, ?, ImmutableMap<K, V>> toImmutableMap()
+    {
+        return Collector.of(ImmutableMap.Builder<K, V>::new,
+                            ImmutableMap.Builder<K, V>::put,
+                            (l, r) -> l.putAll(r.build()),
+                            ImmutableMap.Builder<K, V>::build,
+                            MAP_CHARACTERISTICS);
+    }
+
+    public static <T, K, V> Collector<T, ?, ImmutableMap<K, V>> toImmutableMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends V> valueMapper)
+    {
+        return Collector.of(ImmutableMap.Builder<K, V>::new,
+                            (b, t) -> b.put(keyMapper.apply(t), valueMapper.apply(t)),
+                            (l, r) -> l.putAll(r.build()),
+                            ImmutableMap.Builder::build,
+                            MAP_CHARACTERISTICS);
+    }
+
 }
diff --git a/src/java/org/apache/cassandra/utils/CounterId.java b/src/java/org/apache/cassandra/utils/CounterId.java
index b138aac..fc0385e 100644
--- a/src/java/org/apache/cassandra/utils/CounterId.java
+++ b/src/java/org/apache/cassandra/utils/CounterId.java
@@ -22,6 +22,8 @@
 
 import org.apache.cassandra.db.SystemKeyspace;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUIDAsBytes;
+
 public class CounterId implements Comparable<CounterId>
 {
     public static final int LENGTH = 16; // we assume a fixed length size for all CounterIds
@@ -84,7 +86,7 @@
 
     public static CounterId generate()
     {
-        return new CounterId(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes()));
+        return new CounterId(ByteBuffer.wrap(nextTimeUUIDAsBytes()));
     }
 
     /*
diff --git a/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java b/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java
index d1f33ed..ab2d67e 100644
--- a/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java
+++ b/src/java/org/apache/cassandra/utils/DiagnosticSnapshotService.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils;
 
-import java.net.InetAddress;
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
 import java.util.concurrent.*;
@@ -29,7 +28,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.Message;
@@ -37,7 +35,9 @@
 import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
-import org.hsqldb.Table;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 
 /**
  * Provides a means to take snapshots when triggered by anomalous events or when the breaking of invariants is
@@ -64,7 +64,7 @@
     private static final Logger logger = LoggerFactory.getLogger(DiagnosticSnapshotService.class);
 
     public static final DiagnosticSnapshotService instance =
-        new DiagnosticSnapshotService(Executors.newSingleThreadExecutor(new NamedThreadFactory("DiagnosticSnapshot")));
+        new DiagnosticSnapshotService(executorFactory().sequential("DiagnosticSnapshot"));
 
     public static final String REPAIRED_DATA_MISMATCH_SNAPSHOT_PREFIX = "RepairedDataMismatch-";
     public static final String DUPLICATE_ROWS_DETECTED_SNAPSHOT_PREFIX = "DuplicateRows-";
@@ -119,7 +119,7 @@
 
     private void maybeTriggerSnapshot(TableMetadata metadata, String prefix, Iterable<InetAddressAndPort> endpoints)
     {
-        long now = System.nanoTime();
+        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);
diff --git a/src/java/org/apache/cassandra/utils/DirectorySizeCalculator.java b/src/java/org/apache/cassandra/utils/DirectorySizeCalculator.java
index c1fb6e0..94f9b22 100644
--- a/src/java/org/apache/cassandra/utils/DirectorySizeCalculator.java
+++ b/src/java/org/apache/cassandra/utils/DirectorySizeCalculator.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.FileVisitResult;
 import java.nio.file.Path;
@@ -30,13 +29,11 @@
  */
 public class DirectorySizeCalculator extends SimpleFileVisitor<Path>
 {
-    protected volatile long size = 0;
-    protected final File path;
+    private volatile long size = 0;
 
-    public DirectorySizeCalculator(File path)
+    public DirectorySizeCalculator()
     {
         super();
-        this.path = path;
     }
 
     public boolean isAcceptable(Path file)
@@ -53,7 +50,7 @@
     }
 
     @Override
-    public FileVisitResult visitFileFailed(Path file, IOException exc) throws IOException
+    public FileVisitResult visitFileFailed(Path file, IOException exc)
     {
         return FileVisitResult.CONTINUE;
     }
@@ -62,4 +59,12 @@
     {
         return size;
     }
+
+    /**
+     * Reset the size to 0 in case that the size calculator is used multiple times
+     */
+    protected void resetSize()
+    {
+        size = 0;
+    }
 }
diff --git a/src/java/org/apache/cassandra/utils/EstimatedHistogram.java b/src/java/org/apache/cassandra/utils/EstimatedHistogram.java
index a494b3a..198f922 100644
--- a/src/java/org/apache/cassandra/utils/EstimatedHistogram.java
+++ b/src/java/org/apache/cassandra/utils/EstimatedHistogram.java
@@ -20,6 +20,7 @@
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.concurrent.atomic.AtomicLongArray;
+import java.util.function.DoubleToLongFunction;
 
 import com.google.common.base.Objects;
 import org.slf4j.Logger;
@@ -30,10 +31,12 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 
-public class EstimatedHistogram
+public class EstimatedHistogram implements DoubleToLongFunction
 {
     public static final EstimatedHistogramSerializer serializer = new EstimatedHistogramSerializer();
 
+    public static final int DEFAULT_BUCKET_COUNT = 90;
+
     /**
      * The series of values to which the counts in `buckets` correspond:
      * 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 17, 20, etc.
@@ -52,7 +55,7 @@
 
     public EstimatedHistogram()
     {
-        this(90);
+        this(DEFAULT_BUCKET_COUNT);
     }
 
     public EstimatedHistogram(int bucketCount)
@@ -382,6 +385,12 @@
         return Objects.hashCode(getBucketOffsets(), getBuckets(false));
     }
 
+    @Override
+    public long applyAsLong(double value)
+    {
+        return percentile(value);
+    }
+
     public static class EstimatedHistogramSerializer implements ISerializer<EstimatedHistogram>
     {
         private static final Logger logger = LoggerFactory.getLogger(EstimatedHistogramSerializer.class);
diff --git a/src/java/org/apache/cassandra/utils/ExecutorUtils.java b/src/java/org/apache/cassandra/utils/ExecutorUtils.java
index 21933a3..5bb841f 100644
--- a/src/java/org/apache/cassandra/utils/ExecutorUtils.java
+++ b/src/java/org/apache/cassandra/utils/ExecutorUtils.java
@@ -24,9 +24,10 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-import org.apache.cassandra.concurrent.InfiniteLoopExecutor;
+import org.apache.cassandra.concurrent.Shutdownable;
 
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class ExecutorUtils
 {
@@ -66,8 +67,11 @@
                 if (interrupt) ((ExecutorService) executor).shutdownNow();
                 else ((ExecutorService) executor).shutdown();
             }
-            else if (executor instanceof InfiniteLoopExecutor)
-                ((InfiniteLoopExecutor) executor).shutdownNow();
+            else if (executor instanceof Shutdownable)
+            {
+                if (interrupt) ((Shutdownable) executor).shutdownNow();
+                else ((Shutdownable) executor).shutdown();
+            }
             else if (executor instanceof Thread)
                 ((Thread) executor).interrupt();
             else if (executor != null)
@@ -92,7 +96,7 @@
 
     public static void awaitTermination(long timeout, TimeUnit unit, Collection<?> executors) throws InterruptedException, TimeoutException
     {
-        long deadline = System.nanoTime() + unit.toNanos(timeout);
+        long deadline = nanoTime() + unit.toNanos(timeout);
         awaitTerminationUntil(deadline, executors);
     }
 
@@ -100,15 +104,15 @@
     {
         for (Object executor : executors)
         {
-            long wait = deadline - System.nanoTime();
+            long wait = deadline - nanoTime();
             if (executor instanceof ExecutorService)
             {
                 if (wait <= 0 || !((ExecutorService)executor).awaitTermination(wait, NANOSECONDS))
                     throw new TimeoutException(executor + " did not terminate on time");
             }
-            else if (executor instanceof InfiniteLoopExecutor)
+            else if (executor instanceof Shutdownable)
             {
-                if (wait <= 0 || !((InfiniteLoopExecutor)executor).awaitTermination(wait, NANOSECONDS))
+                if (wait <= 0 || !((Shutdownable)executor).awaitTermination(wait, NANOSECONDS))
                     throw new TimeoutException(executor + " did not terminate on time");
             }
             else if (executor instanceof Thread)
@@ -148,4 +152,4 @@
     {
         shutdownNowAndWait(timeout, unit, Arrays.asList(executors));
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java b/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java
index 1736ae2..02aa09d 100644
--- a/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java
+++ b/src/java/org/apache/cassandra/utils/ExpiringMemoizingSupplier.java
@@ -25,6 +25,8 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * An implementation similar to Guava's Suppliers.memoizeWithExpiration(Supplier)
  * but allowing for memoization to be skipped.
@@ -59,7 +61,7 @@
         // the extra memory consumption and indirection are more
         // expensive than the extra volatile reads.
         long nanos = this.expirationNanos;
-        long now = System.nanoTime();
+        long now = nanoTime();
         if (nanos == 0L || now - nanos >= 0L) {
             synchronized(this) {
                 if (nanos == this.expirationNanos) {
@@ -69,8 +71,7 @@
                     else
                         return t.value();
 
-                    nanos = now + this.durationNanos;
-                    this.expirationNanos = nanos == 0L ? 1L : nanos;
+                    this.expirationNanos = now + this.durationNanos;
                     return t.value();
                 }
             }
@@ -79,7 +80,7 @@
     }
 
     @VisibleForTesting
-    public void expire()
+    public synchronized void expire()
     {
         this.expirationNanos = 0;
     }
diff --git a/src/java/org/apache/cassandra/utils/FBUtilities.java b/src/java/org/apache/cassandra/utils/FBUtilities.java
index 63ffc63..6d210ce 100644
--- a/src/java/org/apache/cassandra/utils/FBUtilities.java
+++ b/src/java/org/apache/cassandra/utils/FBUtilities.java
@@ -17,15 +17,26 @@
  */
 package org.apache.cassandra.utils;
 
-import java.io.*;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
 import java.lang.reflect.Field;
 import java.math.BigInteger;
 import java.net.*;
 import java.nio.ByteBuffer;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
+import java.time.Instant;
 import java.util.*;
-import java.util.concurrent.*;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeoutException;
 import java.util.zip.CRC32;
 import java.util.zip.Checksum;
 
@@ -34,16 +45,21 @@
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import com.google.common.util.concurrent.Uninterruptibles;
+
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
+import org.apache.cassandra.utils.concurrent.*;
 import org.apache.commons.lang3.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.fasterxml.jackson.core.JsonFactory;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.cassandra.auth.AllowAllNetworkAuthorizer;
 import org.apache.cassandra.audit.IAuditLogger;
+import org.apache.cassandra.auth.AllowAllNetworkAuthorizer;
 import org.apache.cassandra.auth.IAuthenticator;
 import org.apache.cassandra.auth.IAuthorizer;
 import org.apache.cassandra.auth.INetworkAuthorizer;
@@ -66,29 +82,34 @@
 import org.apache.cassandra.io.util.DataOutputBufferFixed;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.security.ISslContextFactory;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.LINE_SEPARATOR;
 import static org.apache.cassandra.config.CassandraRelevantProperties.USER_HOME;
+import static org.apache.cassandra.io.util.File.WriteMode.OVERWRITE;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 
 public class FBUtilities
 {
+    private static final ObjectMapper jsonMapper = new ObjectMapper(new JsonFactory());
+
     static
     {
         preventIllegalAccessWarnings();
+        jsonMapper.registerModule(new JavaTimeModule());
+        jsonMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
     }
 
     private static final Logger logger = LoggerFactory.getLogger(FBUtilities.class);
-
-    private static final ObjectMapper jsonMapper = new ObjectMapper(new JsonFactory());
-
     public static final String UNKNOWN_RELEASE_VERSION = "Unknown";
 
     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();
-    public static final boolean isWindows = OPERATING_SYSTEM.contains("windows");
     public static final boolean isLinux = OPERATING_SYSTEM.contains("linux");
 
     private static volatile InetAddress localInetAddress;
@@ -100,11 +121,17 @@
 
     private static volatile String previousReleaseVersionString;
 
+    private static int availableProcessors = Integer.getInteger("cassandra.available_processors", DatabaseDescriptor.getAvailableProcessors());
+
+    public static void setAvailableProcessors(int value)
+    {
+        availableProcessors = value;
+    }
+
     public static int getAvailableProcessors()
     {
-        String availableProcessors = System.getProperty("cassandra.available_processors");
-        if (!Strings.isNullOrEmpty(availableProcessors))
-            return Integer.parseInt(availableProcessors);
+        if (availableProcessors > 0)
+            return availableProcessors;
         else
             return Runtime.getRuntime().availableProcessors();
     }
@@ -226,7 +253,7 @@
      */
     public static void setBroadcastInetAddressAndPort(InetAddressAndPort addr)
     {
-        broadcastInetAddress = addr.address;
+        broadcastInetAddress = addr.getAddress();
         broadcastInetAddressAndPort = addr;
     }
 
@@ -358,7 +385,7 @@
         if (scpurl == null)
             throw new ConfigurationException("unable to locate " + filename);
 
-        return new File(scpurl.getFile()).getAbsolutePath();
+        return new File(scpurl.getFile()).absolutePath();
     }
 
     public static File cassandraTriggerDir()
@@ -426,12 +453,18 @@
     {
         // we use microsecond resolution for compatibility with other client libraries, even though
         // we can't actually get microsecond precision.
-        return System.currentTimeMillis() * 1000;
+        return currentTimeMillis() * 1000;
     }
 
     public static int nowInSeconds()
     {
-        return (int) (System.currentTimeMillis() / 1000);
+        return (int) (currentTimeMillis() / 1000);
+    }
+
+    public static Instant now()
+    {
+        long epochMilli = currentTimeMillis();
+        return Instant.ofEpochMilli(epochMilli);
     }
 
     public static <T> List<T> waitOnFutures(Iterable<? extends Future<? extends T>> futures)
@@ -451,7 +484,7 @@
     {
         long endNanos = 0;
         if (timeout > 0)
-            endNanos = System.nanoTime() + units.toNanos(timeout);
+            endNanos = nanoTime() + units.toNanos(timeout);
         List<T> results = new ArrayList<>();
         Throwable fail = null;
         for (Future<? extends T> f : futures)
@@ -464,7 +497,7 @@
                 }
                 else
                 {
-                    long waitFor = Math.max(1, endNanos - System.nanoTime());
+                    long waitFor = Math.max(1, endNanos - nanoTime());
                     results.add(f.get(waitFor, TimeUnit.NANOSECONDS));
                 }
             }
@@ -485,15 +518,15 @@
         }
         catch (ExecutionException ee)
         {
-            throw new RuntimeException(ee);
+            throw Throwables.cleaned(ee);
         }
         catch (InterruptedException ie)
         {
-            throw new AssertionError(ie);
+            throw new UncheckedInterruptedException(ie);
         }
     }
 
-    public static <T> Future<? extends T> waitOnFirstFuture(Iterable<? extends Future<? extends T>> futures)
+    public static <T, F extends Future<? extends T>> F waitOnFirstFuture(Iterable<? extends F> futures)
     {
         return waitOnFirstFuture(futures, 100);
     }
@@ -502,105 +535,49 @@
      * @param futures The futures to wait on
      * @return future that completed.
      */
-    public static <T> Future<? extends T> waitOnFirstFuture(Iterable<? extends Future<? extends T>> futures, long delay)
+    public static <T, F extends Future<? extends T>> F waitOnFirstFuture(Iterable<? extends F> futures, long delay)
     {
         while (true)
         {
-            for (Future<? extends T> f : futures)
+            Iterator<? extends F> iter = futures.iterator();
+            if (!iter.hasNext())
+                throw new IllegalArgumentException();
+
+            while (true)
             {
-                if (f.isDone())
+                F f = iter.next();
+                boolean isDone;
+                if ((isDone = f.isDone()) || !iter.hasNext())
                 {
                     try
                     {
-                        f.get();
+                        f.get(delay, TimeUnit.MILLISECONDS);
                     }
                     catch (InterruptedException e)
                     {
-                        throw new AssertionError(e);
+                        throw new UncheckedInterruptedException(e);
                     }
                     catch (ExecutionException e)
                     {
                         throw new RuntimeException(e);
                     }
+                    catch (TimeoutException e)
+                    {
+                        if (!isDone) // prevent infinite loops on bad implementations (not encountered)
+                            break;
+                    }
                     return f;
                 }
             }
-            Uninterruptibles.sleepUninterruptibly(delay, TimeUnit.MILLISECONDS);
         }
     }
 
     /**
      * Returns a new {@link Future} wrapping the given list of futures and returning a list of their results.
      */
-    public static Future<List> allOf(Collection<Future<?>> futures)
+    public static <T> org.apache.cassandra.utils.concurrent.Future<List<T>> allOf(Collection<? extends org.apache.cassandra.utils.concurrent.Future<? extends T>> futures)
     {
-        if (futures.isEmpty())
-            return CompletableFuture.completedFuture(null);
-
-        return new Future<List>()
-        {
-            @Override
-            @SuppressWarnings("unchecked")
-            public List get() throws InterruptedException, ExecutionException
-            {
-                List result = new ArrayList<>(futures.size());
-                for (Future current : futures)
-                {
-                    result.add(current.get());
-                }
-                return result;
-            }
-
-            @Override
-            @SuppressWarnings("unchecked")
-            public List get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
-            {
-                List result = new ArrayList<>(futures.size());
-                long deadline = System.nanoTime() + TimeUnit.NANOSECONDS.convert(timeout, unit);
-                for (Future current : futures)
-                {
-                    long remaining = deadline - System.nanoTime();
-                    if (remaining <= 0)
-                        throw new TimeoutException();
-
-                    result.add(current.get(remaining, TimeUnit.NANOSECONDS));
-                }
-                return result;
-            }
-
-            @Override
-            public boolean cancel(boolean mayInterruptIfRunning)
-            {
-                for (Future current : futures)
-                {
-                    if (!current.cancel(mayInterruptIfRunning))
-                        return false;
-                }
-                return true;
-            }
-
-            @Override
-            public boolean isCancelled()
-            {
-                for (Future current : futures)
-                {
-                    if (!current.isCancelled())
-                        return false;
-                }
-                return true;
-            }
-
-            @Override
-            public boolean isDone()
-            {
-                for (Future current : futures)
-                {
-                    if (!current.isDone())
-                        return false;
-                }
-                return true;
-            }
-        };
+        return FutureCombiner.allOf(futures);
     }
 
     /**
@@ -670,7 +647,7 @@
         }
         return FBUtilities.construct(className, "network authorizer");
     }
-    
+
     public static IAuditLogger newAuditLogger(String className, Map<String, String> parameters) throws ConfigurationException
     {
         if (!className.contains("."))
@@ -678,7 +655,7 @@
 
         try
         {
-            Class<?> auditLoggerClass = Class.forName(className);
+            Class<?> auditLoggerClass = FBUtilities.classForName(className, "Audit logger");
             return (IAuditLogger) auditLoggerClass.getConstructor(Map.class).newInstance(parameters);
         }
         catch (Exception ex)
@@ -687,20 +664,20 @@
         }
     }
 
-    public static boolean isAuditLoggerClassExists(String className)
+    public static ISslContextFactory newSslContextFactory(String className, Map<String,Object> parameters) throws ConfigurationException
     {
         if (!className.contains("."))
-            className = "org.apache.cassandra.audit." + className;
+            className = "org.apache.cassandra.security." + className;
 
         try
         {
-            FBUtilities.classForName(className, "Audit logger");
+            Class<?> sslContextFactoryClass = Class.forName(className);
+            return (ISslContextFactory) sslContextFactoryClass.getConstructor(Map.class).newInstance(parameters);
         }
-        catch (ConfigurationException e)
+        catch (Exception ex)
         {
-            return false;
+            throw new ConfigurationException("Unable to create instance of ISslContextFactory for " + className, ex);
         }
-        return true;
     }
 
     /**
@@ -866,6 +843,22 @@
         }
     }
 
+    public static void serializeToJsonFile(Object object, File outputFile) throws IOException
+    {
+        try (FileOutputStreamPlus out = outputFile.newOutputStream(OVERWRITE))
+        {
+            jsonMapper.writeValue((OutputStream) out, object);
+        }
+    }
+
+    public static <T> T deserializeFromJsonFile(Class<T> tClass, File file) throws IOException
+    {
+        try (FileInputStreamPlus in = file.newInputStream())
+        {
+            return jsonMapper.readValue((InputStream) in, tClass);
+        }
+    }
+
     public static String prettyPrintMemory(long size)
     {
         return prettyPrintMemory(size, false);
@@ -930,7 +923,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new AssertionError(e);
+            throw new UncheckedInterruptedException(e);
         }
     }
 
@@ -1086,7 +1079,7 @@
         }
         catch (InterruptedException e)
         {
-            throw new RuntimeException(e);
+            throw new UncheckedInterruptedException(e);
         }
     }
 
@@ -1128,4 +1121,24 @@
             // ignore
         }
     }
+
+    public static String camelToSnake(String camel)
+    {
+        StringBuilder sb = new StringBuilder();
+        for (char c : camel.toCharArray())
+        {
+            if (Character.isUpperCase(c))
+            {
+                // if first char is uppercase, then avoid adding the _ prefix
+                if (sb.length() > 0)
+                    sb.append('_');
+                sb.append(Character.toLowerCase(c));
+            }
+            else
+            {
+                sb.append(c);
+            }
+        }
+        return sb.toString();
+    }
 }
diff --git a/src/java/org/apache/cassandra/utils/GuidGenerator.java b/src/java/org/apache/cassandra/utils/GuidGenerator.java
index aa3ee5b..46843b4 100644
--- a/src/java/org/apache/cassandra/utils/GuidGenerator.java
+++ b/src/java/org/apache/cassandra/utils/GuidGenerator.java
@@ -22,6 +22,7 @@
 import java.util.Random;
 
 import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_SECURITY_EGD;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class GuidGenerator
 {
@@ -90,7 +91,7 @@
 
     public static ByteBuffer guidAsBytes()
     {
-        return guidAsBytes(myRand, s_id, System.currentTimeMillis());
+        return guidAsBytes(myRand, s_id, currentTimeMillis());
     }
 
     /*
diff --git a/src/java/org/apache/cassandra/utils/HeapUtils.java b/src/java/org/apache/cassandra/utils/HeapUtils.java
index 4dd0d46..c0910d8 100644
--- a/src/java/org/apache/cassandra/utils/HeapUtils.java
+++ b/src/java/org/apache/cassandra/utils/HeapUtils.java
@@ -17,9 +17,13 @@
  */
 package org.apache.cassandra.utils;
 
-import java.io.*;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.lang.management.ManagementFactory;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.ArrayUtils;
 import org.apache.commons.lang3.text.StrBuilder;
 
@@ -81,14 +85,8 @@
         if (javaHome == null)
             return null;
         File javaBinDirectory = new File(javaHome, "bin");
-        File[] files = javaBinDirectory.listFiles(new FilenameFilter()
-        {
-            public boolean accept(File dir, String name)
-            {
-                return name.startsWith("jcmd");
-            }
-        });
-        return ArrayUtils.isEmpty(files) ? null : files[0].getPath();
+        File[] files = javaBinDirectory.tryList((dir, name) -> name.startsWith("jcmd"));
+        return ArrayUtils.isEmpty(files) ? null : files[0].path();
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/utils/Hex.java b/src/java/org/apache/cassandra/utils/Hex.java
index 9163067..b8044b8 100644
--- a/src/java/org/apache/cassandra/utils/Hex.java
+++ b/src/java/org/apache/cassandra/utils/Hex.java
@@ -86,6 +86,23 @@
         return wrapCharArray(c);
     }
 
+    public static long parseLong(String hex, int start, int end)
+    {
+        int len = end - start;
+        if (len > 16)
+            throw new IllegalArgumentException();
+
+        long result = 0;
+        int shift = 4 * (len - 1);
+        for (int i = start ; i < end ; ++i)
+        {
+            char c = hex.charAt(i);
+            result |= (long)(c - (c >= 'a' ? 'a' - 10 : '0')) << shift;
+            shift -= 4;
+        }
+        return result;
+    }
+
     /**
      * Create a String from a char array with zero-copy (if available), using reflection to access a package-protected constructor of String.
      * */
diff --git a/src/java/org/apache/cassandra/utils/IndexedSearchIterator.java b/src/java/org/apache/cassandra/utils/IndexedSearchIterator.java
index 597e5bb..bd2f70a 100644
--- a/src/java/org/apache/cassandra/utils/IndexedSearchIterator.java
+++ b/src/java/org/apache/cassandra/utils/IndexedSearchIterator.java
@@ -35,4 +35,4 @@
      * @throws java.util.NoSuchElementException if next() returned null
      */
     public int indexOfCurrent();
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/utils/Int32Serializer.java b/src/java/org/apache/cassandra/utils/Int32Serializer.java
new file mode 100644
index 0000000..731f5aa
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Int32Serializer.java
@@ -0,0 +1,46 @@
+/*
+ * 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.utils;
+
+import java.io.IOException;
+
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+public class Int32Serializer implements IVersionedSerializer<Integer>
+{
+    public static final Int32Serializer serializer = new Int32Serializer();
+
+    public void serialize(Integer t, DataOutputPlus out, int version) throws IOException
+    {
+        out.writeInt(t);
+    }
+
+    public Integer deserialize(DataInputPlus in, int version) throws IOException
+    {
+        return in.readInt();
+    }
+
+    public long serializedSize(Integer t, int version)
+    {
+        return TypeSizes.sizeof(t.intValue());
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/Int64Serializer.java b/src/java/org/apache/cassandra/utils/Int64Serializer.java
new file mode 100644
index 0000000..3f65d60
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Int64Serializer.java
@@ -0,0 +1,49 @@
+/*
+ * 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.utils;
+
+import java.io.IOException;
+
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+public class Int64Serializer implements IVersionedSerializer<Long>
+{
+    public static final Int64Serializer serializer = new Int64Serializer();
+
+    @Override
+    public void serialize(Long t, DataOutputPlus out, int version) throws IOException
+    {
+        out.writeLong(t);
+    }
+
+    @Override
+    public Long deserialize(DataInputPlus in, int version) throws IOException
+    {
+        return in.readLong();
+    }
+
+    @Override
+    public long serializedSize(Long t, int version)
+    {
+        return TypeSizes.sizeof(t);
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/Intercept.java b/src/java/org/apache/cassandra/utils/Intercept.java
new file mode 100644
index 0000000..b81947b
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Intercept.java
@@ -0,0 +1,31 @@
+/*
+ * 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.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+// a marker to indicate that the method is intercepted by the Simulator
+@Retention(RetentionPolicy.SOURCE)
+@Target({ ElementType.METHOD })
+public @interface Intercept
+{
+}
diff --git a/src/java/org/apache/cassandra/utils/IntervalTree.java b/src/java/org/apache/cassandra/utils/IntervalTree.java
index f761180..35ec614 100644
--- a/src/java/org/apache/cassandra/utils/IntervalTree.java
+++ b/src/java/org/apache/cassandra/utils/IntervalTree.java
@@ -23,7 +23,6 @@
 import java.util.*;
 
 import com.google.common.base.Joiner;
-import org.apache.cassandra.utils.AbstractIterator;
 import com.google.common.collect.Iterators;
 
 import org.slf4j.Logger;
diff --git a/src/java/org/apache/cassandra/utils/Isolated.java b/src/java/org/apache/cassandra/utils/Isolated.java
new file mode 100644
index 0000000..d132b73
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Isolated.java
@@ -0,0 +1,39 @@
+/*
+ * 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.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Tells jvm-dtest that a class should be isolated and loaded into the instance class loader.
+ *
+ * Jvm-dtest relies on classloader isolation to run multiple cassandra instances in the same JVM, this makes it
+ * so some classes do not get shared (outside a blesssed set of classes/packages). When the default behavior
+ * is not desirable, this annotation will tell jvm-dtest to isolate the class accross all class loaders.
+ *
+ * This is the oposite of {@link Shared}.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE })
+public @interface Isolated
+{
+}
diff --git a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
index 4c0f972..1d3c09f 100644
--- a/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
+++ b/src/java/org/apache/cassandra/utils/JVMStabilityInspector.java
@@ -19,16 +19,20 @@
 
 import java.io.FileNotFoundException;
 import java.net.SocketException;
+import java.nio.file.FileSystemException;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.List;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Consumer;
 
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
 
 import org.apache.cassandra.exceptions.UnrecoverableIllegalStateException;
+import org.apache.cassandra.metrics.StorageMetrics;
+import org.apache.cassandra.tracing.Tracing;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -40,6 +44,7 @@
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 /**
  * Responsible for deciding whether to kill the JVM if it gets in an "unstable" state (think OOM).
@@ -57,6 +62,20 @@
 
     private JVMStabilityInspector() {}
 
+    public static void uncaughtException(Thread thread, Throwable t)
+    {
+        try { StorageMetrics.uncaughtExceptions.inc(); } catch (Throwable ignore) { /* might not be initialised */ }
+        logger.error("Exception in thread {}", thread, t);
+        Tracing.trace("Exception in thread {}", thread, t);
+        for (Throwable t2 = t; t2 != null; t2 = t2.getCause())
+        {
+            // make sure error gets logged exactly once.
+            if (t2 != t && (t2 instanceof FSError || t2 instanceof CorruptSSTableException))
+                logger.error("Exception in thread {}", thread, t2);
+        }
+        JVMStabilityInspector.inspectThrowable(t);
+    }
+
     /**
      * Certain Throwables and Exceptions represent "Die" conditions for the server.
      * This recursively checks the input Throwable's cause hierarchy until null.
@@ -114,49 +133,59 @@
             isUnstable = true;
         }
 
+        if (t instanceof InterruptedException)
+            throw new UncheckedInterruptedException((InterruptedException) t);
+
         if (DatabaseDescriptor.getDiskFailurePolicy() == Config.DiskFailurePolicy.die)
             if (t instanceof FSError || t instanceof CorruptSSTableException)
                 isUnstable = true;
 
-        fn.accept(t);
-
         // Check for file handle exhaustion
-        if (t instanceof FileNotFoundException || t instanceof SocketException)
+        if (t instanceof FileNotFoundException || t instanceof FileSystemException || t instanceof SocketException)
             if (t.getMessage() != null && t.getMessage().contains("Too many open files"))
                 isUnstable = true;
 
         if (isUnstable)
+        {
+            if (!StorageService.instance.isDaemonSetupCompleted())
+                FileUtils.handleStartupFSError(t);
             killer.killCurrentJVM(t);
+        }
+
+        try
+        {
+            fn.accept(t);
+        }
+        catch (Exception | Error e)
+        {
+            logger.warn("Unexpected error while handling unexpected error", e);
+        }
 
         if (t.getCause() != null)
             inspectThrowable(t.getCause(), fn);
     }
 
+    private static final Set<String> FORCE_HEAP_OOM_IGNORE_SET = ImmutableSet.of("Java heap space", "GC Overhead limit exceeded");
+
     /**
-     * Intentionally produce a heap space OOM upon seeing a Direct buffer memory OOM.
+     * Intentionally produce a heap space OOM upon seeing a non heap memory OOM.
      * Direct buffer OOM cannot trigger JVM OOM error related options,
      * e.g. OnOutOfMemoryError, HeapDumpOnOutOfMemoryError, etc.
-     * See CASSANDRA-15214 for more details
+     * See CASSANDRA-15214 and CASSANDRA-17128 for more details
      */
     @Exclude // Exclude from just in time compilation.
     private static void forceHeapSpaceOomMaybe(OutOfMemoryError oom)
     {
-        // See the oom thrown from java.nio.Bits.reserveMemory.
-        // In jdk 13 and up, the message is "Cannot reserve XX bytes of direct buffer memory (...)"
-        // In jdk 11 and below, the message is "Direct buffer memory"
-        if ((oom.getMessage() != null && oom.getMessage().toLowerCase().contains("direct buffer memory")) ||
-            Arrays.stream(oom.getStackTrace()).anyMatch(x -> x.getClassName().equals("java.nio.Bits")
-                                                             && x.getMethodName().equals("reserveMemory")))
+        if (FORCE_HEAP_OOM_IGNORE_SET.contains(oom.getMessage()))
+            return;
+        logger.error("Force heap space OutOfMemoryError in the presence of", oom);
+        // Start to produce heap space OOM forcibly.
+        List<long[]> ignored = new ArrayList<>();
+        while (true)
         {
-            logger.error("Force heap space OutOfMemoryError in the presence of", oom);
-            // Start to produce heap space OOM forcibly.
-            List<long[]> ignored = new ArrayList<>();
-            while (true)
-            {
-                // java.util.AbstractCollection.MAX_ARRAY_SIZE is defined as Integer.MAX_VALUE - 8
-                // so Integer.MAX_VALUE / 2 should be a large enough and safe size to request.
-                ignored.add(new long[Integer.MAX_VALUE / 2]);
-            }
+            // java.util.AbstractCollection.MAX_ARRAY_SIZE is defined as Integer.MAX_VALUE - 8
+            // so Integer.MAX_VALUE / 2 should be a large enough and safe size to request.
+            ignored.add(new long[Integer.MAX_VALUE / 2]);
         }
     }
 
diff --git a/src/java/org/apache/cassandra/utils/LazyToString.java b/src/java/org/apache/cassandra/utils/LazyToString.java
new file mode 100644
index 0000000..e719445
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/LazyToString.java
@@ -0,0 +1,36 @@
+/*
+ * 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.utils;
+
+import java.util.function.Supplier;
+
+public interface LazyToString
+{
+    public static LazyToString lazy(Supplier<String> castAsLambda)
+    {
+        return new LazyToString()
+        {
+            @Override
+            public String toString()
+            {
+                return castAsLambda.get();
+            }
+        };
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/MerkleTrees.java b/src/java/org/apache/cassandra/utils/MerkleTrees.java
index 0043fe0..15469d3 100644
--- a/src/java/org/apache/cassandra/utils/MerkleTrees.java
+++ b/src/java/org/apache/cassandra/utils/MerkleTrees.java
@@ -145,7 +145,7 @@
     /**
      * Dereference all merkle trees and release direct memory for all off-heap trees.
      */
-    public void release()
+    public synchronized void release()
     {
         merkleTrees.values().forEach(MerkleTree::release);
         merkleTrees.clear();
@@ -381,15 +381,15 @@
     /**
      * Get the differences between the two sets of MerkleTrees.
      *
-     * @param ltree
-     * @param rtree
+     * @param ltrees
+     * @param rtrees
      * @return
      */
-    public static List<Range<Token>> difference(MerkleTrees ltree, MerkleTrees rtree)
+    public static List<Range<Token>> difference(MerkleTrees ltrees, MerkleTrees rtrees)
     {
         List<Range<Token>> differences = new ArrayList<>();
-        for (MerkleTree tree : ltree.merkleTrees.values())
-            differences.addAll(MerkleTree.difference(tree, rtree.getMerkleTree(tree.fullRange)));
+        for (MerkleTree tree : ltrees.merkleTrees.values())
+            differences.addAll(MerkleTree.difference(tree, rtrees.getMerkleTree(tree.fullRange)));
         return differences;
     }
 
diff --git a/src/java/org/apache/cassandra/utils/MonotonicClock.java b/src/java/org/apache/cassandra/utils/MonotonicClock.java
index bd69bd5..ad9ee81 100644
--- a/src/java/org/apache/cassandra/utils/MonotonicClock.java
+++ b/src/java/org/apache/cassandra/utils/MonotonicClock.java
@@ -30,25 +30,25 @@
 import org.apache.cassandra.config.Config;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+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.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
 
 /**
  * Wrapper around time related functions that are either implemented by using the default JVM calls
  * or by using a custom implementation for testing purposes.
  *
- * See {@link #preciseTime} for how to use a custom implementation.
+ * See {@link Global#preciseTime} for how to use a custom implementation.
  *
  * Please note that {@link java.time.Clock} wasn't used, as it would not be possible to provide an
  * implementation for {@link #now()} with the exact same properties of {@link System#nanoTime()}.
+ *
+ * TODO better rationalise MonotonicClock/Clock
  */
+@Shared(scope = SIMULATION)
 public interface MonotonicClock
 {
-    /**
-     * Static singleton object that will be instantiated by default with a system clock
-     * implementation. Set <code>cassandra.clock</code> system property to a FQCN to use a
-     * different implementation instead.
-     */
-    public static final MonotonicClock preciseTime = Defaults.precise();
-    public static final MonotonicClock approxTime = Defaults.approx(preciseTime);
 
     /**
      * @see System#nanoTime()
@@ -70,15 +70,21 @@
     public boolean isAfter(long instant);
     public boolean isAfter(long now, long instant);
 
-    static class Defaults
+    public static class Global
     {
         private static final Logger logger = LoggerFactory.getLogger(MonotonicClock.class);
 
+        /**
+         * Static singleton object that will be instantiated by default with a system clock
+         * implementation. Set <code>cassandra.clock</code> system property to a FQCN to use a
+         * different implementation instead.
+         */
+        public static final MonotonicClock preciseTime = precise();
+        public static final MonotonicClock approxTime = approx(preciseTime);
+
         private static MonotonicClock precise()
         {
-            String sclock = System.getProperty("cassandra.clock");
-            if (sclock == null)
-                sclock = System.getProperty("cassandra.monotonic_clock.precise");
+            String sclock = CLOCK_MONOTONIC_PRECISE.getString();
 
             if (sclock != null)
             {
@@ -98,7 +104,7 @@
 
         private static MonotonicClock approx(MonotonicClock precise)
         {
-            String sclock = System.getProperty("cassandra.monotonic_clock.approx");
+            String sclock = CLOCK_MONOTONIC_APPROX.getString();
             if (sclock != null)
             {
                 try
@@ -137,14 +143,14 @@
         private static final long UPDATE_INTERVAL_MS = Long.getLong(UPDATE_INTERVAL_PROPERTY, 10000);
 
         @VisibleForTesting
-        static class AlmostSameTime implements MonotonicClockTranslation
+        public static class AlmostSameTime implements MonotonicClockTranslation
         {
             final long millisSinceEpoch;
             final long monotonicNanos;
             final long error; // maximum error of millis measurement (in nanos)
 
             @VisibleForTesting
-            AlmostSameTime(long millisSinceEpoch, long monotonicNanos, long errorNanos)
+            public AlmostSameTime(long millisSinceEpoch, long monotonicNanos, long errorNanos)
             {
                 this.millisSinceEpoch = millisSinceEpoch;
                 this.monotonicNanos = monotonicNanos;
@@ -207,7 +213,7 @@
         {
             final int tries = 3;
             long[] samples = new long[2 * tries + 1];
-            samples[0] = System.nanoTime();
+            samples[0] = nanoTime();
             for (int i = 1 ; i < samples.length ; i += 2)
             {
                 samples[i] = millisSinceEpoch.getAsLong();
@@ -244,13 +250,13 @@
     {
         private SystemClock()
         {
-            super(System::currentTimeMillis);
+            super(Clock.Global::currentTimeMillis);
         }
 
         @Override
         public long now()
         {
-            return System.nanoTime();
+            return nanoTime();
         }
 
         @Override
diff --git a/src/java/org/apache/cassandra/utils/MonotonicClockTranslation.java b/src/java/org/apache/cassandra/utils/MonotonicClockTranslation.java
index f7f83e4..cef8bd8 100644
--- a/src/java/org/apache/cassandra/utils/MonotonicClockTranslation.java
+++ b/src/java/org/apache/cassandra/utils/MonotonicClockTranslation.java
@@ -18,6 +18,9 @@
 
 package org.apache.cassandra.utils;
 
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
 public interface MonotonicClockTranslation
 {
     /** accepts millis since epoch, returns nanoTime in the related clock */
diff --git a/src/java/org/apache/cassandra/utils/Mx4jTool.java b/src/java/org/apache/cassandra/utils/Mx4jTool.java
index 054fdcf..e0e998f 100644
--- a/src/java/org/apache/cassandra/utils/Mx4jTool.java
+++ b/src/java/org/apache/cassandra/utils/Mx4jTool.java
@@ -23,8 +23,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.config.CassandraRelevantProperties;
-
 import static org.apache.cassandra.config.CassandraRelevantProperties.MX4JADDRESS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.MX4JPORT;
 
@@ -82,7 +80,7 @@
     {
         String sAddress = MX4JADDRESS.getString();
         if (StringUtils.isEmpty(sAddress))
-            sAddress = FBUtilities.getBroadcastAddressAndPort().address.getHostAddress();
+            sAddress = FBUtilities.getBroadcastAddressAndPort().getAddress().getHostAddress();
         return sAddress;
     }
 
diff --git a/src/java/org/apache/cassandra/utils/NativeLibrary.java b/src/java/org/apache/cassandra/utils/NativeLibrary.java
index e5b5da7..9348433 100644
--- a/src/java/org/apache/cassandra/utils/NativeLibrary.java
+++ b/src/java/org/apache/cassandra/utils/NativeLibrary.java
@@ -17,14 +17,14 @@
  */
 package org.apache.cassandra.utils;
 
-import java.io.File;
 import java.io.FileDescriptor;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.nio.channels.FileChannel;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -32,22 +32,22 @@
 
 import org.apache.cassandra.io.FSWriteError;
 
+import static org.apache.cassandra.config.CassandraRelevantProperties.IGNORE_MISSING_NATIVE_FILE_HINTS;
 import static org.apache.cassandra.config.CassandraRelevantProperties.OS_ARCH;
 import static org.apache.cassandra.config.CassandraRelevantProperties.OS_NAME;
 import static org.apache.cassandra.utils.NativeLibrary.OSType.LINUX;
 import static org.apache.cassandra.utils.NativeLibrary.OSType.MAC;
-import static org.apache.cassandra.utils.NativeLibrary.OSType.WINDOWS;
 import static org.apache.cassandra.utils.NativeLibrary.OSType.AIX;
 
 public final class NativeLibrary
 {
     private static final Logger logger = LoggerFactory.getLogger(NativeLibrary.class);
+    private static final boolean REQUIRE = !IGNORE_MISSING_NATIVE_FILE_HINTS.getBoolean();
 
     public enum OSType
     {
         LINUX,
         MAC,
-        WINDOWS,
         AIX,
         OTHER;
     }
@@ -96,7 +96,6 @@
         switch (osType)
         {
             case MAC: wrappedLibrary = new NativeLibraryDarwin(); break;
-            case WINDOWS: wrappedLibrary = new NativeLibraryWindows(); break;
             case LINUX:
             case AIX:
             case OTHER:
@@ -140,10 +139,8 @@
             return LINUX;
         else if (osName.contains("mac"))
             return MAC;
-        else if (osName.contains("windows"))
-            return WINDOWS;
 
-        logger.warn("the current operating system, {}, is unsupported by cassandra", osName);
+        logger.warn("the current operating system, {}, is unsupported by Cassandra", osName);
         if (osName.contains("aix"))
             return AIX;
         else
@@ -160,7 +157,8 @@
         }
         catch (NoSuchMethodError x)
         {
-            logger.warn("Obsolete version of JNA present; unable to read errno. Upgrade to JNA 3.2.7 or later");
+            if (REQUIRE)
+                logger.warn("Obsolete version of JNA present; unable to read errno. Upgrade to JNA 3.2.7 or later");
             return 0;
         }
     }
@@ -216,7 +214,7 @@
         if (!f.exists())
             return;
 
-        try (FileInputStream fis = new FileInputStream(f))
+        try (FileInputStreamPlus fis = new FileInputStreamPlus(f))
         {
             trySkipCache(getfd(fis.getChannel()), offset, len, path);
         }
@@ -292,7 +290,8 @@
             if (!(e instanceof LastErrorException))
                 throw e;
 
-            logger.warn("fcntl({}, {}, {}) failed, errno ({}).", fd, command, flags, errno(e));
+            if (REQUIRE)
+                logger.warn("fcntl({}, {}, {}) failed, errno ({}).", fd, command, flags, errno(e));
         }
 
         return result;
@@ -315,7 +314,8 @@
             if (!(e instanceof LastErrorException))
                 throw e;
 
-            logger.warn("open({}, O_RDONLY) failed, errno ({}).", path, errno(e));
+            if (REQUIRE)
+                logger.warn("open({}, O_RDONLY) failed, errno ({}).", path, errno(e));
         }
 
         return fd;
@@ -339,9 +339,12 @@
             if (!(e instanceof LastErrorException))
                 throw e;
 
-            String errMsg = String.format("fsync(%s) failed, errno (%s) %s", fd, errno(e), e.getMessage());
-            logger.warn(errMsg);
-            throw new FSWriteError(e, errMsg);
+            if (REQUIRE)
+            {
+                String errMsg = String.format("fsync(%s) failed, errno (%s) %s", fd, errno(e), e.getMessage());
+                logger.warn(errMsg);
+                throw new FSWriteError(e, errMsg);
+            }
         }
     }
 
@@ -363,9 +366,12 @@
             if (!(e instanceof LastErrorException))
                 throw e;
 
-            String errMsg = String.format("close(%d) failed, errno (%d).", fd, errno(e));
-            logger.warn(errMsg);
-            throw new FSWriteError(e, errMsg);
+            if (REQUIRE)
+            {
+                String errMsg = String.format("close(%d) failed, errno (%d).", fd, errno(e));
+                logger.warn(errMsg);
+                throw new FSWriteError(e, errMsg);
+            }
         }
     }
 
@@ -377,7 +383,8 @@
         }
         catch (IllegalArgumentException|IllegalAccessException e)
         {
-            logger.warn("Unable to read fd field from FileChannel");
+            if (REQUIRE)
+                logger.warn("Unable to read fd field from FileChannel", e);
         }
         return -1;
     }
@@ -395,8 +402,11 @@
         }
         catch (Exception e)
         {
-            JVMStabilityInspector.inspectThrowable(e);
-            logger.warn("Unable to read fd field from FileDescriptor");
+            if (REQUIRE)
+            {
+                JVMStabilityInspector.inspectThrowable(e);
+                logger.warn("Unable to read fd field from FileDescriptor", e);
+            }
         }
 
         return -1;
@@ -417,7 +427,8 @@
         }
         catch (Exception e)
         {
-            logger.info("Failed to get PID from JNA", e);
+            if (REQUIRE)
+                logger.info("Failed to get PID from JNA", e);
         }
 
         return -1;
diff --git a/src/java/org/apache/cassandra/utils/NativeLibraryDarwin.java b/src/java/org/apache/cassandra/utils/NativeLibraryDarwin.java
index 6ed18d1..c119311 100644
--- a/src/java/org/apache/cassandra/utils/NativeLibraryDarwin.java
+++ b/src/java/org/apache/cassandra/utils/NativeLibraryDarwin.java
@@ -42,6 +42,7 @@
  * @see org.apache.cassandra.utils.NativeLibraryWrapper
  * @see NativeLibrary
  */
+@Shared
 public class NativeLibraryDarwin implements NativeLibraryWrapper
 {
     private static final Logger logger = LoggerFactory.getLogger(NativeLibraryDarwin.class);
diff --git a/src/java/org/apache/cassandra/utils/NativeLibraryLinux.java b/src/java/org/apache/cassandra/utils/NativeLibraryLinux.java
index 3f21d17..9c7bb3b 100644
--- a/src/java/org/apache/cassandra/utils/NativeLibraryLinux.java
+++ b/src/java/org/apache/cassandra/utils/NativeLibraryLinux.java
@@ -42,6 +42,7 @@
  * @see org.apache.cassandra.utils.NativeLibraryWrapper
  * @see NativeLibrary
  */
+@Shared
 public class NativeLibraryLinux implements NativeLibraryWrapper
 {
     private static boolean available;
diff --git a/src/java/org/apache/cassandra/utils/NativeLibraryWindows.java b/src/java/org/apache/cassandra/utils/NativeLibraryWindows.java
deleted file mode 100644
index b8304c7..0000000
--- a/src/java/org/apache/cassandra/utils/NativeLibraryWindows.java
+++ /dev/null
@@ -1,126 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.utils;
-
-import java.util.Collections;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.sun.jna.LastErrorException;
-import com.sun.jna.Native;
-import com.sun.jna.Pointer;
-
-/**
- * A {@code NativeLibraryWrapper} implementation for Windows.
- * <p> This implementation only offers support for the {@code callGetpid} method
- * using the Windows/Kernel32 library.</p>
- *
- * @see org.apache.cassandra.utils.NativeLibraryWrapper
- * @see NativeLibrary
- */
-public class NativeLibraryWindows implements NativeLibraryWrapper
-{
-    private static final Logger logger = LoggerFactory.getLogger(NativeLibraryWindows.class);
-
-    private static boolean available;
-
-    static
-    {
-        try
-        {
-            Native.register(com.sun.jna.NativeLibrary.getInstance("kernel32", Collections.emptyMap()));
-            available = true;
-        }
-        catch (NoClassDefFoundError e)
-        {
-            logger.warn("JNA not found. Native methods will be disabled.");
-        }
-        catch (UnsatisfiedLinkError e)
-        {
-            logger.error("Failed to link the Windows/Kernel32 library against JNA. Native methods will be unavailable.", e);
-        }
-        catch (NoSuchMethodError e)
-        {
-            logger.warn("Obsolete version of JNA present; unable to register Windows/Kernel32 library. Upgrade to JNA 3.2.7 or later");
-        }
-    }
-
-    /**
-     * Retrieves the process identifier of the calling process (<a href='https://msdn.microsoft.com/en-us/library/windows/desktop/ms683180(v=vs.85).aspx'>GetCurrentProcessId function</a>).
-     *
-     * @return the process identifier of the calling process
-     */
-    private static native long GetCurrentProcessId() throws LastErrorException;
-
-    public int callMlockall(int flags) throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    public int callMunlockall() throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    public int callFcntl(int fd, int command, long flags) throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    public int callPosixFadvise(int fd, long offset, int len, int flag) throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    public int callOpen(String path, int flags) throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    public int callFsync(int fd) throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    public int callClose(int fd) throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    public Pointer callStrerror(int errnum) throws UnsatisfiedLinkError, RuntimeException
-    {
-        throw new UnsatisfiedLinkError();
-    }
-
-    /**
-     * @return the PID of the JVM running
-     * @throws UnsatisfiedLinkError if we fail to link against Sigar
-     * @throws RuntimeException if another unexpected error is thrown by Sigar
-     */
-    public long callGetpid() throws UnsatisfiedLinkError, RuntimeException
-    {
-        return GetCurrentProcessId();
-    }
-
-    public boolean isAvailable()
-    {
-        return available;
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/NativeLibraryWrapper.java b/src/java/org/apache/cassandra/utils/NativeLibraryWrapper.java
index 879ea88..2c3d47f 100644
--- a/src/java/org/apache/cassandra/utils/NativeLibraryWrapper.java
+++ b/src/java/org/apache/cassandra/utils/NativeLibraryWrapper.java
@@ -24,7 +24,8 @@
  * An interface to implement for using OS specific native methods.
  * @see NativeLibrary
  */
-interface NativeLibraryWrapper
+@Shared
+public interface NativeLibraryWrapper
 {
     /**
      * Checks if the library has been successfully linked.
diff --git a/src/java/org/apache/cassandra/utils/Nemesis.java b/src/java/org/apache/cassandra/utils/Nemesis.java
new file mode 100644
index 0000000..840eba3
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Nemesis.java
@@ -0,0 +1,43 @@
+/*
+ * 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.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+import static org.apache.cassandra.utils.Nemesis.Traffic.HIGH;
+
+/**
+ * Annotate fields, particularly important volatile fields, where the system should adversarially schedule
+ * thread events around memory accesses (read or write).
+ *
+ * This can introduce significant simulation overhead, so should be used sparingly.
+ *
+ * TODO: Support @Nemesis on methods, to insert nemesis points either before or after invocations of the method
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.FIELD, ElementType.METHOD })
+public @interface Nemesis
+{
+    enum Traffic { LOW, HIGH }
+
+    Traffic traffic() default HIGH;
+}
diff --git a/src/java/org/apache/cassandra/utils/NoSpamLogger.java b/src/java/org/apache/cassandra/utils/NoSpamLogger.java
index ac9168a..9b62e21 100644
--- a/src/java/org/apache/cassandra/utils/NoSpamLogger.java
+++ b/src/java/org/apache/cassandra/utils/NoSpamLogger.java
@@ -19,12 +19,15 @@
 
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Supplier;
 
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 import org.slf4j.Logger;
 
 import com.google.common.annotations.VisibleForTesting;
 
+import static org.apache.cassandra.utils.Clock.Global;
+
 /**
  * Logging that limits each log statement to firing based on time since the statement last fired.
  *
@@ -44,7 +47,7 @@
      */
     public enum Level
     {
-        INFO, WARN, ERROR;
+        INFO, WARN, ERROR
     }
 
     @VisibleForTesting
@@ -58,7 +61,7 @@
     {
         public long nanoTime()
         {
-            return System.nanoTime();
+            return Global.nanoTime();
         }
     };
 
@@ -82,21 +85,31 @@
             return nowNanos >= expected && compareAndSet(expected, nowNanos + minIntervalNanos);
         }
 
+        public boolean log(Level l, long nowNanos, Supplier<Object[]> objects)
+        {
+            if (!shouldLog(nowNanos)) return false;
+            return logNoCheck(l, objects.get());
+        }
+
         public boolean log(Level l, long nowNanos, Object... objects)
         {
             if (!shouldLog(nowNanos)) return false;
+            return logNoCheck(l, objects);
+        }
 
+        private boolean logNoCheck(Level l, Object... objects)
+        {
             switch (l)
             {
-            case INFO:
-                wrapped.info(statement, objects);
-                break;
-            case WARN:
-                wrapped.warn(statement, objects);
-                break;
-            case ERROR:
-                wrapped.error(statement, objects);
-                break;
+                case INFO:
+                    wrapped.info(statement, objects);
+                    break;
+                case WARN:
+                    wrapped.warn(statement, objects);
+                    break;
+                case ERROR:
+                    wrapped.error(statement, objects);
+                    break;
                 default:
                     throw new AssertionError();
             }
@@ -172,6 +185,23 @@
         return statement.log(level, nowNanos, objects);
     }
 
+    public static boolean log(Logger logger, Level level, long minInterval, TimeUnit unit, String message, Supplier<Object[]> objects)
+    {
+        return log(logger, level, message, minInterval, unit, CLOCK.nanoTime(), message, objects);
+    }
+
+    public static boolean log(Logger logger, Level level, String key, long minInterval, TimeUnit unit, String message, Supplier<Object[]> objects)
+    {
+        return log(logger, level, key, minInterval, unit, CLOCK.nanoTime(), message, objects);
+    }
+
+    public static boolean log(Logger logger, Level level, String key, long minInterval, TimeUnit unit, long nowNanos, String message, Supplier<Object[]> objects)
+    {
+        NoSpamLogger wrapped = getLogger(logger, minInterval, unit);
+        NoSpamLogStatement statement = wrapped.getStatement(key, message);
+        return statement.log(level, nowNanos, objects);
+    }
+
     public static NoSpamLogStatement getStatement(Logger logger, String message, long minInterval, TimeUnit unit)
     {
         NoSpamLogger wrapped = getLogger(logger, minInterval, unit);
diff --git a/src/java/org/apache/cassandra/utils/NullableSerializer.java b/src/java/org/apache/cassandra/utils/NullableSerializer.java
new file mode 100644
index 0000000..67e2d6a
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/NullableSerializer.java
@@ -0,0 +1,70 @@
+/*
+ * 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.utils;
+
+import java.io.IOException;
+
+import org.apache.cassandra.db.TypeSizes;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+public class NullableSerializer
+{
+
+    public static <T> void serializeNullable(IVersionedSerializer<T> serializer, T value, DataOutputPlus out, int version) throws IOException
+    {
+        out.writeBoolean(value != null);
+        if (value != null)
+            serializer.serialize(value, out, version);
+    }
+
+    public static <T> T deserializeNullable(IVersionedSerializer<T> serializer, DataInputPlus in, int version) throws IOException
+    {
+        return in.readBoolean() ? serializer.deserialize(in, version) : null;
+    }
+
+    public static <T> long serializedSizeNullable(IVersionedSerializer<T> serializer, T value, int version)
+    {
+        return value != null
+                ? TypeSizes.sizeof(true) + serializer.serializedSize(value, version)
+                : TypeSizes.sizeof(false);
+    }
+
+    public static <T> IVersionedSerializer<T> wrap(IVersionedSerializer<T> wrap)
+    {
+        return new IVersionedSerializer<T>() {
+            public void serialize(T t, DataOutputPlus out, int version) throws IOException
+            {
+                serializeNullable(wrap, t, out, version);
+            }
+
+            public T deserialize(DataInputPlus in, int version) throws IOException
+            {
+                return deserializeNullable(wrap, in, version);
+            }
+
+            public long serializedSize(T t, int version)
+            {
+                return serializedSizeNullable(wrap, t, version);
+            }
+        };
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/utils/ObjectSizes.java b/src/java/org/apache/cassandra/utils/ObjectSizes.java
index 468522c..07066cf 100644
--- a/src/java/org/apache/cassandra/utils/ObjectSizes.java
+++ b/src/java/org/apache/cassandra/utils/ObjectSizes.java
@@ -29,8 +29,7 @@
  */
 public class ObjectSizes
 {
-    private static final MemoryMeter meter = new MemoryMeter().omitSharedBufferOverhead()
-                                                              .withGuessing(MemoryMeter.Guess.FALLBACK_UNSAFE)
+    private static final MemoryMeter meter = new MemoryMeter().withGuessing(MemoryMeter.Guess.FALLBACK_UNSAFE)
                                                               .ignoreKnownSingletons();
 
     private static final long EMPTY_HEAP_BUFFER_SIZE = measure(ByteBufferUtil.EMPTY_BYTE_BUFFER);
diff --git a/src/java/org/apache/cassandra/utils/RecomputingSupplier.java b/src/java/org/apache/cassandra/utils/RecomputingSupplier.java
index ba6a1ff..0554439 100644
--- a/src/java/org/apache/cassandra/utils/RecomputingSupplier.java
+++ b/src/java/org/apache/cassandra/utils/RecomputingSupplier.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils;
 
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.TimeUnit;
@@ -27,6 +26,10 @@
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.function.Supplier;
 
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.Promise;
+
 /**
  * Supplier that caches the last computed value until it is reset, forcing every caller of
  * {@link RecomputingSupplier#get(long, TimeUnit)} to wait until this value is computed if
@@ -38,7 +41,7 @@
 public class RecomputingSupplier<T>
 {
     private final Supplier<T> supplier;
-    private final AtomicReference<CompletableFuture<T>> cached = new AtomicReference<>(null);
+    private final AtomicReference<Future<T>> cached = new AtomicReference<>(null);
     private final AtomicBoolean workInProgress = new AtomicBoolean(false);
     private final ExecutorService executor;
 
@@ -50,7 +53,7 @@
 
     public void recompute()
     {
-        CompletableFuture<T> current = cached.get();
+        Future<T> current = cached.get();
         boolean origWip = workInProgress.get();
 
         if (origWip || (current != null && !current.isDone()))
@@ -63,14 +66,14 @@
         assert current == null || current.isDone();
 
         // The work is not in progress, and current future is done. Try to submit a new task.
-        CompletableFuture<T> lazyValue = new CompletableFuture<>();
+        Promise<T> lazyValue = new AsyncPromise<>();
         if (cached.compareAndSet(current, lazyValue))
             executor.submit(() -> doWork(lazyValue));
         else
             executor.submit(this::recompute); // Lost CAS, resubmit
     }
 
-    private void doWork(CompletableFuture<T> lazyValue)
+    private void doWork(Promise<T> lazyValue)
     {
         T value = null;
         Throwable err = null;
@@ -89,9 +92,9 @@
         }
 
         if (err == null)
-            lazyValue.complete(value);
+            lazyValue.trySuccess(value);
         else
-            lazyValue.completeExceptionally(err);
+            lazyValue.tryFailure(err);
     }
 
     private static void sanityCheck(boolean check)
@@ -101,7 +104,7 @@
 
     public T get(long timeout, TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException
     {
-        CompletableFuture<T> lazyValue = cached.get();
+        Future<T> lazyValue = cached.get();
 
         // recompute was never called yet, return null.
         if (lazyValue == null)
diff --git a/src/java/org/apache/cassandra/utils/ResourceWatcher.java b/src/java/org/apache/cassandra/utils/ResourceWatcher.java
index 5e7cbdd..e8dcb85 100644
--- a/src/java/org/apache/cassandra/utils/ResourceWatcher.java
+++ b/src/java/org/apache/cassandra/utils/ResourceWatcher.java
@@ -17,9 +17,9 @@
  */
 package org.apache.cassandra.utils;
 
-import java.io.File;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/src/java/org/apache/cassandra/utils/Shared.java b/src/java/org/apache/cassandra/utils/Shared.java
new file mode 100644
index 0000000..e576c86
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Shared.java
@@ -0,0 +1,45 @@
+/*
+ * 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.utils;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+
+/**
+ * Tells jvm-dtest that a class should be shared accross all {@link ClassLoader}s.
+ *
+ * Jvm-dtest relies on classloader isolation to run multiple cassandra instances in the same JVM, this makes it
+ * so some classes do not get shared (outside a blesssed set of classes/packages). When the default behavior
+ * is not desirable, this annotation will tell jvm-dtest to share the class accross all class loaders.
+ *
+ * This is the oposite of {@link Isolated}.
+ */
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.TYPE })
+public @interface Shared
+{
+    enum Scope { ANY, SIMULATION }
+    enum Recursive { NONE, INTERFACES /*(and enums and exceptions) */, ALL }
+    Scope[] scope() default Scope.ANY;
+    Recursive inner() default Recursive.NONE;
+    Recursive ancestors() default Recursive.NONE;
+    Recursive members() default Recursive.NONE;
+}
diff --git a/src/java/org/apache/cassandra/utils/SigarLibrary.java b/src/java/org/apache/cassandra/utils/SigarLibrary.java
index 246a9c8..32987d8 100644
--- a/src/java/org/apache/cassandra/utils/SigarLibrary.java
+++ b/src/java/org/apache/cassandra/utils/SigarLibrary.java
@@ -21,6 +21,8 @@
 import org.slf4j.LoggerFactory;
 import org.slf4j.Logger;
 
+import org.apache.cassandra.config.CassandraRelevantProperties;
+
 public class SigarLibrary
 {
     private Logger logger = LoggerFactory.getLogger(SigarLibrary.class);
@@ -111,10 +113,6 @@
 
     private boolean hasAcceptableAddressSpace()
     {
-        // Check is invalid on Windows
-        if (FBUtilities.isWindows)
-            return true;
-
         try
         {
             long fileMax = sigar.getResourceLimit().getVirtualMemoryMax();
@@ -169,7 +167,7 @@
             boolean goodAddressSpace = hasAcceptableAddressSpace();
             boolean goodFileLimits = hasAcceptableFileLimits();
             boolean goodProcNumber = hasAcceptableProcNumber();
-            if (swapEnabled || !goodAddressSpace || !goodFileLimits || !goodProcNumber)
+            if (swapEnabled || !goodAddressSpace || !goodFileLimits || !goodProcNumber || CassandraRelevantProperties.TEST_IGNORE_SIGAR.getBoolean())
             {
                 logger.warn("Cassandra server running in degraded mode. Is swap disabled? : {},  Address space adequate? : {}, " +
                             " nofile limit adequate? : {}, nproc limit adequate? : {} ", !swapEnabled, goodAddressSpace,
diff --git a/src/java/org/apache/cassandra/utils/Simulate.java b/src/java/org/apache/cassandra/utils/Simulate.java
new file mode 100644
index 0000000..dd0d230
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/Simulate.java
@@ -0,0 +1,56 @@
+/*
+ * 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.utils;
+
+/**
+ * Enable certain features for a specific method or class.
+ *
+ * Note that presently class level annotations are not inherited by inner classes.
+ *
+ * TODO: support package level, and apply to all nested classes
+ */
+public @interface Simulate
+{
+    enum With
+    {
+        /**
+         * Calls to FBUtilities.timestampMicros() will be guaranteed globally monotonically increasing.
+         *
+         * May be annotated at the method or class level.
+         */
+        GLOBAL_CLOCK,
+
+        /**
+         * synchronized methods and blocks, and wait/notify.
+         *
+         * May be annotated at the class level.
+         */
+        MONITORS,
+
+        /**
+         * Usages of LockSupport. This defaults to ON for all classes, including system classes.
+         *
+         * May be annotated at the method or class level.
+         */
+        LOCK_SUPPORT
+    }
+
+    With[] with() default {};
+    With[] without() default {};
+}
diff --git a/src/java/org/apache/cassandra/utils/SlidingTimeRate.java b/src/java/org/apache/cassandra/utils/SlidingTimeRate.java
deleted file mode 100644
index 0e00054..0000000
--- a/src/java/org/apache/cassandra/utils/SlidingTimeRate.java
+++ /dev/null
@@ -1,171 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils;
-
-import java.util.concurrent.ConcurrentNavigableMap;
-import java.util.concurrent.ConcurrentSkipListMap;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Preconditions;
-
-/**
- * Concurrent rate computation over a sliding time window.
- *
- * Currently not used in the Cassandra 4.0 code base. If you decide to use it, please check CASSANDRA-16713.
- * There still might be a bug, flaky test to be fixed before using it again.
- */
-public class SlidingTimeRate
-{
-    private final ConcurrentSkipListMap<Long, AtomicInteger> counters = new ConcurrentSkipListMap<>();
-    private final AtomicLong lastCounterTimestamp = new AtomicLong(0);
-    private final ReadWriteLock pruneLock = new ReentrantReadWriteLock();
-    private final long sizeInMillis;
-    private final long precisionInMillis;
-    private final TimeSource timeSource;
-
-    /**
-     * Creates a sliding rate whose time window is of the given size, with the given precision and time unit.
-     * <p>
-     * The precision defines how accurate the rate computation is, as it will be computed over window size +/-
-     * precision.
-     * </p>
-     */
-    public SlidingTimeRate(TimeSource timeSource, long size, long precision, TimeUnit unit)
-    {
-        Preconditions.checkArgument(size > precision, "Size should be greater than precision.");
-        Preconditions.checkArgument(TimeUnit.MILLISECONDS.convert(precision, unit) >= 1, "Precision must be greater than or equal to 1 millisecond.");
-        this.sizeInMillis = TimeUnit.MILLISECONDS.convert(size, unit);
-        this.precisionInMillis = TimeUnit.MILLISECONDS.convert(precision, unit);
-        this.timeSource = timeSource;
-    }
-
-    /**
-     * Updates the rate.
-     */
-    public void update(int delta)
-    {
-        pruneLock.readLock().lock();
-        try
-        {
-            while (true)
-            {
-                long now = timeSource.currentTimeMillis();
-                long lastTimestamp = lastCounterTimestamp.get();
-                boolean isWithinPrecisionRange = (now - lastTimestamp) < precisionInMillis;
-                AtomicInteger lastCounter = counters.get(lastTimestamp);
-                // If there's a valid counter for the current last timestamp, and we're in the precision range,
-                // update such counter:
-                if (lastCounter != null && isWithinPrecisionRange)
-                {
-                    lastCounter.addAndGet(delta);
-
-                    break;
-                }
-                // Else if there's no counter or we're past the precision range, try to create a new counter,
-                // but only the thread updating the last timestamp will create a new counter:
-                else if (lastCounterTimestamp.compareAndSet(lastTimestamp, now))
-                {
-                    AtomicInteger existing = counters.putIfAbsent(now, new AtomicInteger(delta));
-                    if (existing != null)
-                    {
-                        existing.addAndGet(delta);
-                    }
-
-                    break;
-                }
-            }
-        }
-        finally
-        {
-            pruneLock.readLock().unlock();
-        }
-    }
-
-    /**
-     * Gets the current rate in the given time unit from the beginning of the time window to the
-     * provided point in time ago.
-     */
-    public double get(long toAgo, TimeUnit unit)
-    {
-        pruneLock.readLock().lock();
-        try
-        {
-            long toAgoInMillis = TimeUnit.MILLISECONDS.convert(toAgo, unit);
-            Preconditions.checkArgument(toAgoInMillis < sizeInMillis, "Cannot get rate in the past!");
-
-            long now = timeSource.currentTimeMillis();
-            long sum = 0;
-            ConcurrentNavigableMap<Long, AtomicInteger> tailCounters = counters
-                    .tailMap(now - sizeInMillis, true)
-                    .headMap(now - toAgoInMillis, true);
-            for (AtomicInteger i : tailCounters.values())
-            {
-                sum += i.get();
-            }
-
-            double rateInMillis = sum == 0
-                                  ? sum
-                                  : sum / (double) Math.max(1000, (now - toAgoInMillis) - tailCounters.firstKey());
-            double multiplier = TimeUnit.MILLISECONDS.convert(1, unit);
-            return rateInMillis * multiplier;
-        }
-        finally
-        {
-            pruneLock.readLock().unlock();
-        }
-    }
-
-    /**
-     * Gets the current rate in the given time unit.
-     */
-    public double get(TimeUnit unit)
-    {
-        return get(0, unit);
-    }
-
-    /**
-     * Prunes the time window of old unused updates.
-     */
-    public void prune()
-    {
-        pruneLock.writeLock().lock();
-        try
-        {
-            long now = timeSource.currentTimeMillis();
-            counters.headMap(now - sizeInMillis, false).clear();
-        }
-        finally
-        {
-            pruneLock.writeLock().unlock();
-        }
-    }
-
-    @VisibleForTesting
-    public int size()
-    {
-        return counters.values().stream().reduce(new AtomicInteger(), (v1, v2) -> {
-            v1.addAndGet(v2.get());
-            return v1;
-        }).get();
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/SyncUtil.java b/src/java/org/apache/cassandra/utils/SyncUtil.java
index 1917e8b..6055859 100644
--- a/src/java/org/apache/cassandra/utils/SyncUtil.java
+++ b/src/java/org/apache/cassandra/utils/SyncUtil.java
@@ -28,9 +28,9 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import org.apache.cassandra.config.Config;
-import org.apache.cassandra.service.CassandraDaemon;
 
 import com.google.common.base.Preconditions;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -173,12 +173,6 @@
         }
     }
 
-    public static void sync(RandomAccessFile ras) throws IOException
-    {
-        Preconditions.checkNotNull(ras);
-        sync(ras.getFD());
-    }
-
     public static void sync(FileOutputStream fos) throws IOException
     {
         Preconditions.checkNotNull(fos);
@@ -198,7 +192,7 @@
         if (SKIP_SYNC)
             return;
 
-        int directoryFD = NativeLibrary.tryOpenDirectory(dir.getPath());
+        int directoryFD = NativeLibrary.tryOpenDirectory(dir.path());
         try
         {
             trySync(directoryFD);
diff --git a/src/java/org/apache/cassandra/utils/SystemTimeSource.java b/src/java/org/apache/cassandra/utils/SystemTimeSource.java
deleted file mode 100644
index fef525e..0000000
--- a/src/java/org/apache/cassandra/utils/SystemTimeSource.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils;
-
-import java.util.concurrent.TimeUnit;
-
-import com.google.common.util.concurrent.Uninterruptibles;
-
-/**
- * Time source backed by JVM clock.
- */
-public class SystemTimeSource implements TimeSource
-{
-    @Override
-    public long currentTimeMillis()
-    {
-        return System.currentTimeMillis();
-    }
-
-    @Override
-    public long nanoTime()
-    {
-        return System.nanoTime();
-    }
-
-    @Override
-    public TimeSource sleepUninterruptibly(long sleepFor, TimeUnit unit)
-    {
-        Uninterruptibles.sleepUninterruptibly(sleepFor, unit);
-        return this;
-    }
-
-    @Override
-    public TimeSource sleep(long sleepFor, TimeUnit unit) throws InterruptedException
-    {
-        TimeUnit.NANOSECONDS.sleep(TimeUnit.NANOSECONDS.convert(sleepFor, unit));
-        return this;
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/Throwables.java b/src/java/org/apache/cassandra/utils/Throwables.java
index 86c0156..8337a56 100644
--- a/src/java/org/apache/cassandra/utils/Throwables.java
+++ b/src/java/org/apache/cassandra/utils/Throwables.java
@@ -18,7 +18,7 @@
 */
 package org.apache.cassandra.utils;
 
-import java.io.File;
+import org.apache.cassandra.io.util.File;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.util.Arrays;
@@ -31,6 +31,7 @@
 
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.FSWriteError;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 
 public final class Throwables
 {
@@ -60,6 +61,8 @@
     {
         if (existingFail == null)
             return newFail;
+        if (newFail == null)
+            return existingFail;
         existingFail.addSuppressed(newFail);
         return existingFail;
     }
@@ -87,6 +90,9 @@
         if (fail instanceof RuntimeException)
             throw (RuntimeException) fail;
 
+        if (fail instanceof InterruptedException)
+            throw new UncheckedInterruptedException((InterruptedException) fail);
+
         if (checked != null && checked.isInstance(fail))
             throw checked.cast(fail);
 
@@ -148,7 +154,7 @@
     @SafeVarargs
     public static void perform(File against, FileOpType opType, DiscreteAction<? extends IOException> ... actions)
     {
-        perform(against.getPath(), opType, actions);
+        perform(against.path(), opType, actions);
     }
 
     @SafeVarargs
@@ -237,7 +243,10 @@
      */
     public static RuntimeException unchecked(Throwable t)
     {
-        return t instanceof RuntimeException ? (RuntimeException)t : new RuntimeException(t);
+        return t instanceof RuntimeException ? (RuntimeException)t :
+               t instanceof InterruptedException
+               ? new UncheckedInterruptedException((InterruptedException) t)
+               : new RuntimeException(t);
     }
 
     /**
diff --git a/src/java/org/apache/cassandra/utils/TimeSource.java b/src/java/org/apache/cassandra/utils/TimeSource.java
deleted file mode 100644
index 5d8acec..0000000
--- a/src/java/org/apache/cassandra/utils/TimeSource.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils;
-
-import java.util.concurrent.TimeUnit;
-
-public interface TimeSource
-{
-    /**
-     *
-     * @return the current time in milliseconds
-     */
-    long currentTimeMillis();
-
-    /**
-     *
-     * @return Returns the current time value in nanoseconds.
-     *
-     * <p>This method can only be used to measure elapsed time and is
-     * not related to any other notion of system or wall-clock time.
-     */
-    long nanoTime();
-
-    /**
-     * Sleep for the given amount of time uninterruptibly.
-     *
-     * @param  sleepFor given amout.
-     * @param  unit time unit
-     * @return The time source itself after the given sleep period.
-     */
-    TimeSource sleepUninterruptibly(long sleepFor, TimeUnit unit);
-
-    /**
-     * Sleep for the given amount of time. This operation could interrupted.
-     * Hence after returning from this method, it is not guaranteed
-     * that the request amount of time has passed.
-     *
-     * @param  sleepFor given amout.
-     * @param  unit time unit
-     * @return The time source itself after the given sleep period.
-     */
-    TimeSource sleep(long sleepFor, TimeUnit unit) throws InterruptedException;
-}
diff --git a/src/java/org/apache/cassandra/utils/TimeUUID.java b/src/java/org/apache/cassandra/utils/TimeUUID.java
new file mode 100644
index 0000000..8d79096
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/TimeUUID.java
@@ -0,0 +1,574 @@
+/*
+ * 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.utils;
+
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
+import java.io.Serializable;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.nio.ByteBuffer;
+import java.security.SecureRandom;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import com.google.common.hash.Hasher;
+import com.google.common.hash.Hashing;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.marshal.ValueAccessor;
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.locator.InetAddressAndPort;
+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.DETERMINISM_UNSAFE_UUID_NODE;
+import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+
+@Shared(inner = INTERFACES)
+public class TimeUUID implements Serializable, Comparable<TimeUUID>
+{
+    public static final long serialVersionUID = 1L;
+
+    // A grand day! millis at 00:00:00.000 15 Oct 1582.
+    public static final long UUID_EPOCH_UNIX_MILLIS = -12219292800000L;
+    protected static final long TIMESTAMP_UUID_VERSION_IN_MSB = 0x1000L;
+    protected static final long UUID_VERSION_BITS_IN_MSB = 0xf000L;
+
+    /*
+     * The min and max possible lsb for a UUID.
+     * Note that his is not 0 and all 1's because Cassandra TimeUUIDType
+     * compares the lsb parts as a signed byte array comparison. So the min
+     * value is 8 times -128 and the max is 8 times +127.
+     *
+     * Note that we ignore the uuid variant (namely, MIN_CLOCK_SEQ_AND_NODE
+     * have variant 2 as it should, but MAX_CLOCK_SEQ_AND_NODE have variant 0).
+     * I don't think that has any practical consequence and is more robust in
+     * case someone provides a UUID with a broken variant.
+     */
+    private static final long MIN_CLOCK_SEQ_AND_NODE = 0x8080808080808080L;
+    private static final long MAX_CLOCK_SEQ_AND_NODE = 0x7f7f7f7f7f7f7f7fL;
+
+
+    final long uuidTimestamp, lsb;
+
+    public TimeUUID(long uuidTimestamp, long lsb)
+    {
+        // we don't validate that this is a true TIMEUUID to avoid problems with historical mixing of UUID with TimeUUID
+        this.uuidTimestamp = uuidTimestamp;
+        this.lsb = lsb;
+    }
+
+    public static TimeUUID atUnixMicrosWithLsb(long unixMicros, long uniqueLsb)
+    {
+        return new TimeUUID(unixMicrosToRawTimestamp(unixMicros), uniqueLsb);
+    }
+
+    public static UUID atUnixMicrosWithLsbAsUUID(long unixMicros, long uniqueLsb)
+    {
+        return new UUID(rawTimestampToMsb(unixMicrosToRawTimestamp(unixMicros)), uniqueLsb);
+    }
+
+    /**
+     * Returns the smaller possible type 1 UUID having the provided timestamp.
+     *
+     * <b>Warning:</b> this method should only be used for querying as this
+     * doesn't at all guarantee the uniqueness of the resulting UUID.
+     */
+    public static TimeUUID minAtUnixMillis(long unixMillis)
+    {
+        return new TimeUUID(unixMillisToRawTimestamp(unixMillis, 0), MIN_CLOCK_SEQ_AND_NODE);
+    }
+
+    /**
+     * Returns the biggest possible type 1 UUID having the provided timestamp.
+     *
+     * <b>Warning:</b> this method should only be used for querying as this
+     * doesn't at all guarantee the uniqueness of the resulting UUID.
+     */
+    public static TimeUUID maxAtUnixMillis(long unixMillis)
+    {
+        return new TimeUUID(unixMillisToRawTimestamp(unixMillis + 1, 0) - 1, MAX_CLOCK_SEQ_AND_NODE);
+    }
+
+    public static TimeUUID fromString(String uuidString)
+    {
+        return fromUuid(UUID.fromString(uuidString));
+    }
+
+    public static TimeUUID fromUuid(UUID uuid)
+    {
+        return fromBytes(uuid.getMostSignificantBits(), uuid.getLeastSignificantBits());
+    }
+
+    public static TimeUUID fromBytes(long msb, long lsb)
+    {
+        return new TimeUUID(msbToRawTimestamp(msb), lsb);
+    }
+
+    public static TimeUUID deserialize(ByteBuffer buffer)
+    {
+        return fromBytes(buffer.getLong(buffer.position()), buffer.getLong(buffer.position() + 8));
+    }
+
+    public static TimeUUID deserialize(DataInput in) throws IOException
+    {
+        long msb = in.readLong();
+        long lsb = in.readLong();
+        return fromBytes(msb, lsb);
+    }
+
+    public void serialize(DataOutput out) throws IOException
+    {
+        out.writeLong(msb());
+        out.writeLong(lsb());
+    }
+
+    public ByteBuffer toBytes()
+    {
+        return ByteBuffer.wrap(toBytes(msb(), lsb()));
+    }
+
+    public static byte[] toBytes(long msb, long lsb)
+    {
+        byte[] uuidBytes = new byte[16];
+
+        for (int i = 0; i < 8; i++)
+            uuidBytes[i] = (byte) (msb >>> 8 * (7 - i));
+
+        for (int i = 8; i < 16; i++)
+            uuidBytes[i] = (byte) (lsb >>> 8 * (15 - i));
+
+        return uuidBytes;
+    }
+
+    public static long sizeInBytes()
+    {
+        return 16;
+    }
+
+    public UUID asUUID()
+    {
+        return new UUID(rawTimestampToMsb(uuidTimestamp), lsb);
+    }
+
+    /**
+     * The Cassandra internal micros-resolution timestamp of the TimeUUID, as of unix epoch
+     */
+    public long unix(TimeUnit units)
+    {
+        return units.convert(unixMicros(), MICROSECONDS);
+    }
+
+    /**
+     * The Cassandra internal micros-resolution timestamp of the TimeUUID, as of unix epoch
+     */
+    public long unixMicros()
+    {
+        return rawTimestampToUnixMicros(uuidTimestamp);
+    }
+
+    /**
+     * The UUID-format timestamp, i.e. 10x micros-resolution, as of UUIDGen.UUID_EPOCH_UNIX_MILLIS
+     * The tenths of a microsecond are used to store a flag value.
+     */
+    public long uuidTimestamp()
+    {
+        return uuidTimestamp & 0x0FFFFFFFFFFFFFFFL;
+    }
+
+    public long msb()
+    {
+        return rawTimestampToMsb(uuidTimestamp);
+    }
+
+    public long lsb()
+    {
+        return lsb;
+    }
+
+    public static long rawTimestampToUnixMicros(long rawTimestamp)
+    {
+        return (rawTimestamp / 10) + UUID_EPOCH_UNIX_MILLIS * 1000;
+    }
+
+    public static long unixMillisToRawTimestamp(long unixMillis, long tenthsOfAMicro)
+    {
+        return unixMillis * 10000 - (UUID_EPOCH_UNIX_MILLIS * 10000) + tenthsOfAMicro;
+    }
+
+    public static long unixMicrosToRawTimestamp(long unixMicros)
+    {
+        return unixMicros * 10 - (UUID_EPOCH_UNIX_MILLIS * 10000);
+    }
+
+    public static long msbToRawTimestamp(long msb)
+    {
+        assert (UUID_VERSION_BITS_IN_MSB & msb) == TIMESTAMP_UUID_VERSION_IN_MSB;
+        msb &= ~TIMESTAMP_UUID_VERSION_IN_MSB;
+        return   (msb &     0xFFFFL) << 48
+               | (msb & 0xFFFF0000L) << 16
+               | (msb >>> 32);
+    }
+
+    public static long rawTimestampToMsb(long rawTimestamp)
+    {
+        return TIMESTAMP_UUID_VERSION_IN_MSB
+               | (rawTimestamp >>> 48)
+               | ((rawTimestamp & 0xFFFF00000000L) >>> 16)
+               | (rawTimestamp << 32);
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return (int) ((uuidTimestamp ^ (uuidTimestamp >> 32) * 31) + (lsb ^ (lsb >> 32)));
+    }
+
+    @Override
+    public boolean equals(Object that)
+    {
+        return    (that instanceof UUID && equals((UUID) that))
+               || (that instanceof TimeUUID && equals((TimeUUID) that));
+    }
+
+    public boolean equals(TimeUUID that)
+    {
+        return that != null && uuidTimestamp == that.uuidTimestamp && lsb == that.lsb;
+    }
+
+    public boolean equals(UUID that)
+    {
+        return that != null && uuidTimestamp == that.timestamp() && lsb == that.getLeastSignificantBits();
+    }
+
+    @Override
+    public String toString()
+    {
+        return asUUID().toString();
+    }
+
+    public static String toString(TimeUUID ballot)
+    {
+        return ballot == null ? "null" : ballot.uuidTimestamp() + ":" + ballot;
+    }
+
+    public static String toString(TimeUUID ballot, String kind)
+    {
+        return ballot == null ? "null" : String.format("%s(%d:%s)", kind, ballot.uuidTimestamp(), ballot);
+    }
+
+    @Override
+    public int compareTo(TimeUUID that)
+    {
+        return this.uuidTimestamp != that.uuidTimestamp
+               ? Long.compare(this.uuidTimestamp, that.uuidTimestamp)
+               : Long.compare(this.lsb, that.lsb);
+    }
+
+    protected static abstract class AbstractSerializer<T extends TimeUUID> extends TypeSerializer<T>
+    {
+        public <V> void validate(V value, ValueAccessor<V> accessor) throws MarshalException
+        {
+            if (accessor.isEmpty(value))
+                return;
+
+            if (accessor.size(value) != 16)
+                throw new MarshalException(String.format("UUID should be 16 or 0 bytes (%d)", accessor.size(value)));
+
+            if ((accessor.getByte(value, 6) & 0xf0) != 0x10)
+                throw new MarshalException(String.format("Invalid version for TimeUUID type: 0x%s", Integer.toHexString((accessor.getByte(value, 0) >> 4) & 0xf)));
+        }
+
+        public String toString(T value)
+        {
+            return value == null ? "" : value.toString();
+        }
+
+        public ByteBuffer serialize(T value)
+        {
+            if (value == null)
+                return EMPTY_BYTE_BUFFER;
+            ByteBuffer buffer = ByteBuffer.allocate(16);
+            buffer.putLong(value.msb());
+            buffer.putLong(value.lsb());
+            buffer.flip();
+            return buffer;
+        }
+    }
+
+    public static class Serializer extends AbstractSerializer<TimeUUID> implements IVersionedSerializer<TimeUUID>
+    {
+        public static final Serializer instance = new Serializer();
+
+        public <V> TimeUUID deserialize(V value, ValueAccessor<V> accessor)
+        {
+            return accessor.isEmpty(value) ? null : accessor.toTimeUUID(value);
+        }
+
+        public Class<TimeUUID> getType()
+        {
+            return TimeUUID.class;
+        }
+
+        @Override
+        public void serialize(TimeUUID t, DataOutputPlus out, int version) throws IOException
+        {
+            t.serialize(out);
+        }
+
+        @Override
+        public TimeUUID deserialize(DataInputPlus in, int version) throws IOException
+        {
+            return TimeUUID.deserialize(in);
+        }
+
+        @Override
+        public long serializedSize(TimeUUID t, int version)
+        {
+            return 16;
+        }
+    }
+
+    public static class Generator
+    {
+        private static final long clockSeqAndNode = makeClockSeqAndNode();
+
+        private static final AtomicLong lastMicros = new AtomicLong();
+
+        public static TimeUUID nextTimeUUID()
+        {
+            return atUnixMicrosWithLsb(nextUnixMicros(), clockSeqAndNode);
+        }
+
+        public static UUID nextTimeAsUUID()
+        {
+            return atUnixMicrosWithLsbAsUUID(nextUnixMicros(), clockSeqAndNode);
+        }
+
+        public static TimeUUID atUnixMillis(long unixMillis)
+        {
+            return atUnixMillis(unixMillis, 0);
+        }
+
+        public static TimeUUID atUnixMillis(long unixMillis, long tenthsOfAMicro)
+        {
+            return new TimeUUID(unixMillisToRawTimestamp(unixMillis, tenthsOfAMicro), clockSeqAndNode);
+        }
+
+        public static byte[] atUnixMillisAsBytes(long unixMillis)
+        {
+            return atUnixMillisAsBytes(unixMillis, 0);
+        }
+
+        public static byte[] atUnixMillisAsBytes(long unixMillis, long tenthsOfAMicro)
+        {
+            return toBytes(rawTimestampToMsb(unixMillisToRawTimestamp(unixMillis, tenthsOfAMicro)), clockSeqAndNode);
+        }
+
+        public static byte[] nextTimeUUIDAsBytes()
+        {
+            return toBytes(rawTimestampToMsb(unixMicrosToRawTimestamp(nextUnixMicros())), clockSeqAndNode);
+        }
+
+        // needs to return two different values for the same when.
+        // we can generate at most 10k UUIDs per ms.
+        private static long nextUnixMicros()
+        {
+            long newLastMicros;
+            while (true)
+            {
+                //Generate a candidate value for new lastNanos
+                newLastMicros = currentTimeMillis() * 1000;
+                long originalLastNanos = lastMicros.get();
+                if (newLastMicros > originalLastNanos)
+                {
+                    //Slow path once per millisecond do a CAS
+                    if (lastMicros.compareAndSet(originalLastNanos, newLastMicros))
+                    {
+                        break;
+                    }
+                }
+                else
+                {
+                    //Fast path do an atomic increment
+                    //Or when falling behind this will move time forward past the clock if necessary
+                    newLastMicros = lastMicros.incrementAndGet();
+                    break;
+                }
+            }
+            return newLastMicros;
+        }
+
+        private static long makeClockSeqAndNode()
+        {
+            if (DETERMINISM_UNSAFE_UUID_NODE.getBoolean())
+                return FBUtilities.getBroadcastAddressAndPort().addressBytes[3];
+
+            Long specified = Long.getLong("cassandra.unsafe.timeuuidnode");
+            if (specified != null)
+                return specified
+                       ^ FBUtilities.getBroadcastAddressAndPort().addressBytes[3]
+                       ^ (FBUtilities.getBroadcastAddressAndPort().addressBytes[2] << 8);
+
+            long clock = new SecureRandom().nextLong();
+
+            long lsb = 0;
+            lsb |= 0x8000000000000000L;                 // variant (2 bits)
+            lsb |= (clock & 0x0000000000003FFFL) << 48; // clock sequence (14 bits)
+            lsb |= makeNode();                          // 6 bytes
+            return lsb;
+        }
+
+        private static long makeNode()
+        {
+            /*
+             * We don't have access to the MAC address but need to generate a node part
+             * that identify this host as uniquely as possible.
+             * The spec says that one option is to take as many source that identify
+             * this node as possible and hash them together. That's what we do here by
+             * gathering all the ip of this host.
+             * Note that FBUtilities.getJustBroadcastAddress() should be enough to uniquely
+             * identify the node *in the cluster* but it triggers DatabaseDescriptor
+             * instanciation and the UUID generator is used in Stress for instance,
+             * where we don't want to require the yaml.
+             */
+            Collection<InetAddressAndPort> localAddresses = getAllLocalAddresses();
+            if (localAddresses.isEmpty())
+                throw new RuntimeException("Cannot generate the node component of the UUID because cannot retrieve any IP addresses.");
+
+            // ideally, we'd use the MAC address, but java doesn't expose that.
+            byte[] hash = hash(localAddresses);
+            long node = 0;
+            for (int i = 0; i < Math.min(6, hash.length); i++)
+                node |= (0x00000000000000ff & (long)hash[i]) << (5-i)*8;
+            assert (0xff00000000000000L & node) == 0;
+
+            // Since we don't use the mac address, the spec says that multicast
+            // bit (least significant bit of the first octet of the node ID) must be 1.
+            return node | 0x0000010000000000L;
+        }
+
+        private static byte[] hash(Collection<InetAddressAndPort> data)
+        {
+            // Identify the host.
+            Hasher hasher = Hashing.md5().newHasher();
+            for(InetAddressAndPort addr : data)
+            {
+                hasher.putBytes(addr.addressBytes);
+                hasher.putInt(addr.getPort());
+            }
+
+            // Identify the process on the load: we use both the PID and class loader hash.
+            long pid = NativeLibrary.getProcessID();
+            if (pid < 0)
+                pid = new Random(currentTimeMillis()).nextLong();
+            updateWithLong(hasher, pid);
+
+            ClassLoader loader = UUIDGen.class.getClassLoader();
+            int loaderId = loader != null ? System.identityHashCode(loader) : 0;
+            updateWithInt(hasher, loaderId);
+
+            return hasher.hash().asBytes();
+        }
+
+        private static void updateWithInt(Hasher hasher, int val)
+        {
+            hasher.putByte((byte) ((val >>> 24) & 0xFF));
+            hasher.putByte((byte) ((val >>> 16) & 0xFF));
+            hasher.putByte((byte) ((val >>>  8) & 0xFF));
+            hasher.putByte((byte) ((val >>> 0) & 0xFF));
+        }
+
+        public static void updateWithLong(Hasher hasher, long val)
+        {
+            hasher.putByte((byte) ((val >>> 56) & 0xFF));
+            hasher.putByte((byte) ((val >>> 48) & 0xFF));
+            hasher.putByte((byte) ((val >>> 40) & 0xFF));
+            hasher.putByte((byte) ((val >>> 32) & 0xFF));
+            hasher.putByte((byte) ((val >>> 24) & 0xFF));
+            hasher.putByte((byte) ((val >>> 16) & 0xFF));
+            hasher.putByte((byte) ((val >>>  8) & 0xFF));
+            hasher.putByte((byte)  ((val >>> 0) & 0xFF));
+        }
+
+        /**
+         * Helper function used exclusively by UUIDGen to create
+         **/
+        public static Collection<InetAddressAndPort> getAllLocalAddresses()
+        {
+            Set<InetAddressAndPort> localAddresses = new HashSet<>();
+            try
+            {
+                Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
+                if (nets != null)
+                {
+                    while (nets.hasMoreElements())
+                    {
+                        Function<InetAddress, InetAddressAndPort> converter =
+                        address -> InetAddressAndPort.getByAddressOverrideDefaults(address, 0);
+                        List<InetAddressAndPort> addresses =
+                        Collections.list(nets.nextElement().getInetAddresses()).stream().map(converter).collect(Collectors.toList());
+                        localAddresses.addAll(addresses);
+                    }
+                }
+            }
+            catch (SocketException e)
+            {
+                throw new AssertionError(e);
+            }
+            if (DatabaseDescriptor.isDaemonInitialized())
+            {
+                localAddresses.add(FBUtilities.getBroadcastAddressAndPort());
+                localAddresses.add(FBUtilities.getBroadcastNativeAddressAndPort());
+                localAddresses.add(FBUtilities.getLocalAddressAndPort());
+            }
+            return localAddresses;
+        }
+    }
+}
+
+// ---Copied from UUIDGen
+// for the curious, here is how I generated START_EPOCH
+//        Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT-0"));
+//        c.set(Calendar.YEAR, 1582);
+//        c.set(Calendar.MONTH, Calendar.OCTOBER);
+//        c.set(Calendar.DAY_OF_MONTH, 15);
+//        c.set(Calendar.HOUR_OF_DAY, 0);
+//        c.set(Calendar.MINUTE, 0);
+//        c.set(Calendar.SECOND, 0);
+//        c.set(Calendar.MILLISECOND, 0);
+//        long START_EPOCH = c.getTimeInMillis();
diff --git a/src/java/org/apache/cassandra/utils/UUIDGen.java b/src/java/org/apache/cassandra/utils/UUIDGen.java
index c83e292..14ab230 100644
--- a/src/java/org/apache/cassandra/utils/UUIDGen.java
+++ b/src/java/org/apache/cassandra/utils/UUIDGen.java
@@ -17,138 +17,16 @@
  */
 package org.apache.cassandra.utils;
 
-import java.net.InetAddress;
-import java.net.NetworkInterface;
-import java.net.SocketException;
 import java.nio.ByteBuffer;
-import java.security.SecureRandom;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
 import java.util.UUID;
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.hash.Hasher;
-import com.google.common.hash.Hashing;
-import com.google.common.primitives.Ints;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.locator.InetAddressAndPort;
 
 /**
  * The goods are here: www.ietf.org/rfc/rfc4122.txt.
  */
 public class UUIDGen
 {
-    // A grand day! millis at 00:00:00.000 15 Oct 1582.
-    private static final long START_EPOCH = -12219292800000L;
-    private static final long clockSeqAndNode = makeClockSeqAndNode();
-
     public static final int UUID_LEN = 16;
 
-    /*
-     * The min and max possible lsb for a UUID.
-     * Note that his is not 0 and all 1's because Cassandra TimeUUIDType
-     * compares the lsb parts as a signed byte array comparison. So the min
-     * value is 8 times -128 and the max is 8 times +127.
-     *
-     * Note that we ignore the uuid variant (namely, MIN_CLOCK_SEQ_AND_NODE
-     * have variant 2 as it should, but MAX_CLOCK_SEQ_AND_NODE have variant 0).
-     * I don't think that has any practical consequence and is more robust in
-     * case someone provides a UUID with a broken variant.
-     */
-    private static final long MIN_CLOCK_SEQ_AND_NODE = 0x8080808080808080L;
-    private static final long MAX_CLOCK_SEQ_AND_NODE = 0x7f7f7f7f7f7f7f7fL;
-
-    private static final SecureRandom secureRandom = new SecureRandom();
-
-    // placement of this singleton is important.  It needs to be instantiated *AFTER* the other statics.
-    private static final UUIDGen instance = new UUIDGen();
-
-    private AtomicLong lastNanos = new AtomicLong();
-
-    private UUIDGen()
-    {
-        // make sure someone didn't whack the clockSeqAndNode by changing the order of instantiation.
-        if (clockSeqAndNode == 0) throw new RuntimeException("singleton instantiation is misplaced.");
-    }
-
-    /**
-     * Creates a type 1 UUID (time-based UUID).
-     *
-     * @return a UUID instance
-     */
-    public static UUID getTimeUUID()
-    {
-        return new UUID(instance.createTimeSafe(), clockSeqAndNode);
-    }
-
-    /**
-     * Creates a type 1 UUID (time-based UUID) with the timestamp of @param when, in milliseconds.
-     *
-     * @return a UUID instance
-     */
-    public static UUID getTimeUUID(long when)
-    {
-        return new UUID(createTime(fromUnixTimestamp(when)), clockSeqAndNode);
-    }
-
-    /**
-     * Returns a version 1 UUID using the provided timestamp and the local clock and sequence.
-     * <p>
-     * Note that this method is generally only safe to use if you can guarantee that the provided
-     * parameter is unique across calls (otherwise the returned UUID won't be unique accross calls).
-     *
-     * @param whenInMicros a unix time in microseconds.
-     * @return a new UUID {@code id} such that {@code microsTimestamp(id) == whenInMicros}. Please not that
-     * multiple calls to this method with the same value of {@code whenInMicros} will return the <b>same</b>
-     * UUID.
-     */
-    public static UUID getTimeUUIDFromMicros(long whenInMicros)
-    {
-        long whenInMillis = whenInMicros / 1000;
-        long nanos = (whenInMicros - (whenInMillis * 1000)) * 10;
-        return getTimeUUID(whenInMillis, nanos);
-    }
-
-    /**
-     * Similar to {@link #getTimeUUIDFromMicros}, but randomize (using SecureRandom) the clock and sequence.
-     * <p>
-     * If you can guarantee that the {@code whenInMicros} argument is unique (for this JVM instance) for
-     * every call, then you should prefer {@link #getTimeUUIDFromMicros} which is faster. If you can't
-     * guarantee this however, this method will ensure the returned UUID are still unique (accross calls)
-     * through randomization.
-     *
-     * @param whenInMicros a unix time in microseconds.
-     * @return a new UUID {@code id} such that {@code microsTimestamp(id) == whenInMicros}. The UUID returned
-     * by different calls will be unique even if {@code whenInMicros} is not.
-     */
-    public static UUID getRandomTimeUUIDFromMicros(long whenInMicros)
-    {
-        long whenInMillis = whenInMicros / 1000;
-        long nanos = (whenInMicros - (whenInMillis * 1000)) * 10;
-        return new UUID(createTime(fromUnixTimestamp(whenInMillis, nanos)), secureRandom.nextLong());
-    }
-
-    public static UUID getTimeUUID(long when, long nanos)
-    {
-        return new UUID(createTime(fromUnixTimestamp(when, nanos)), clockSeqAndNode);
-    }
-
-    @VisibleForTesting
-    public static UUID getTimeUUID(long when, long nanos, long clockSeqAndNode)
-    {
-        return new UUID(createTime(fromUnixTimestamp(when, nanos)), clockSeqAndNode);
-    }
-
     /** creates a type 1 uuid from raw bytes. */
     public static UUID getUUID(ByteBuffer raw)
     {
@@ -179,118 +57,6 @@
     }
 
     /**
-     * Returns a 16 byte representation of a type 1 UUID (a time-based UUID),
-     * based on the current system time.
-     *
-     * @return a type 1 UUID represented as a byte[]
-     */
-    public static byte[] getTimeUUIDBytes()
-    {
-        return createTimeUUIDBytes(instance.createTimeSafe());
-    }
-
-    /**
-     * Returns the smaller possible type 1 UUID having the provided timestamp.
-     *
-     * <b>Warning:</b> this method should only be used for querying as this
-     * doesn't at all guarantee the uniqueness of the resulting UUID.
-     */
-    public static UUID minTimeUUID(long timestamp)
-    {
-        return new UUID(createTime(fromUnixTimestamp(timestamp)), MIN_CLOCK_SEQ_AND_NODE);
-    }
-
-    /**
-     * Returns the biggest possible type 1 UUID having the provided timestamp.
-     *
-     * <b>Warning:</b> this method should only be used for querying as this
-     * doesn't at all guarantee the uniqueness of the resulting UUID.
-     */
-    public static UUID maxTimeUUID(long timestamp)
-    {
-        // unix timestamp are milliseconds precision, uuid timestamp are 100's
-        // nanoseconds precision. If we ask for the biggest uuid have unix
-        // timestamp 1ms, then we should not extend 100's nanoseconds
-        // precision by taking 10000, but rather 19999.
-        long uuidTstamp = fromUnixTimestamp(timestamp + 1) - 1;
-        return new UUID(createTime(uuidTstamp), MAX_CLOCK_SEQ_AND_NODE);
-    }
-
-    /**
-     * @param uuid
-     * @return milliseconds since Unix epoch
-     */
-    public static long unixTimestamp(UUID uuid)
-    {
-        return (uuid.timestamp() / 10000) + START_EPOCH;
-    }
-
-    /**
-     * @param uuid
-     * @return seconds since Unix epoch
-     */
-    public static int unixTimestampInSec(UUID uuid)
-    {
-        return Ints.checkedCast(TimeUnit.MILLISECONDS.toSeconds(unixTimestamp(uuid)));
-    }
-
-    /**
-     * @param uuid
-     * @return microseconds since Unix epoch
-     */
-    public static long microsTimestamp(UUID uuid)
-    {
-        return (uuid.timestamp() / 10) + START_EPOCH * 1000;
-    }
-
-    /**
-     * @param timestamp milliseconds since Unix epoch
-     * @return
-     */
-    private static long fromUnixTimestamp(long timestamp)
-    {
-        return fromUnixTimestamp(timestamp, 0L);
-    }
-
-    private static long fromUnixTimestamp(long timestamp, long nanos)
-    {
-        return ((timestamp - START_EPOCH) * 10000) + nanos;
-    }
-
-    /**
-     * Converts a 100-nanoseconds precision timestamp into the 16 byte representation
-     * of a type 1 UUID (a time-based UUID).
-     *
-     * To specify a 100-nanoseconds precision timestamp, one should provide a milliseconds timestamp and
-     * a number {@code 0 <= n < 10000} such that n*100 is the number of nanoseconds within that millisecond.
-     *
-     * <p><i><b>Warning:</b> This method is not guaranteed to return unique UUIDs; Multiple
-     * invocations using identical timestamps will result in identical UUIDs.</i></p>
-     *
-     * @return a type 1 UUID represented as a byte[]
-     */
-    public static byte[] getTimeUUIDBytes(long timeMillis, int nanos)
-    {
-        if (nanos >= 10000)
-            throw new IllegalArgumentException();
-        return createTimeUUIDBytes(instance.createTimeUnsafe(timeMillis, nanos));
-    }
-
-    private static byte[] createTimeUUIDBytes(long msb)
-    {
-        long lsb = clockSeqAndNode;
-        byte[] uuidBytes = new byte[16];
-
-        for (int i = 0; i < 8; i++)
-            uuidBytes[i] = (byte) (msb >>> 8 * (7 - i));
-
-        for (int i = 8; i < 16; i++)
-            uuidBytes[i] = (byte) (lsb >>> 8 * (7 - i));
-
-        return uuidBytes;
-    }
-
-    /**
      * Returns a milliseconds-since-epoch value for a type-1 UUID.
      *
      * @param uuid a type-1 (time-based) UUID
@@ -301,169 +67,7 @@
     {
         if (uuid.version() != 1)
             throw new IllegalArgumentException("incompatible with uuid version: "+uuid.version());
-        return (uuid.timestamp() / 10000) + START_EPOCH;
-    }
-
-    private static long makeClockSeqAndNode()
-    {
-        long clock = new SecureRandom().nextLong();
-
-        long lsb = 0;
-        lsb |= 0x8000000000000000L;                 // variant (2 bits)
-        lsb |= (clock & 0x0000000000003FFFL) << 48; // clock sequence (14 bits)
-        lsb |= makeNode();                          // 6 bytes
-        return lsb;
-    }
-
-    // needs to return two different values for the same when.
-    // we can generate at most 10k UUIDs per ms.
-    private long createTimeSafe()
-    {
-        long newLastNanos;
-        while (true)
-        {
-            //Generate a candidate value for new lastNanos
-            newLastNanos = (System.currentTimeMillis() - START_EPOCH) * 10000;
-            long originalLastNanos = lastNanos.get();
-            if (newLastNanos > originalLastNanos)
-            {
-                //Slow path once per millisecond do a CAS
-                if (lastNanos.compareAndSet(originalLastNanos, newLastNanos))
-                {
-                    break;
-                }
-            }
-            else
-            {
-                //Fast path do an atomic increment
-                //Or when falling behind this will move time forward past the clock if necessary
-                newLastNanos = lastNanos.incrementAndGet();
-                break;
-            }
-        }
-        return createTime(newLastNanos);
-    }
-
-    private long createTimeUnsafe(long when, int nanos)
-    {
-        long nanosSince = ((when - START_EPOCH) * 10000) + nanos;
-        return createTime(nanosSince);
-    }
-
-    private static long createTime(long nanosSince)
-    {
-        long msb = 0L;
-        msb |= (0x00000000ffffffffL & nanosSince) << 32;
-        msb |= (0x0000ffff00000000L & nanosSince) >>> 16;
-        msb |= (0xffff000000000000L & nanosSince) >>> 48;
-        msb |= 0x0000000000001000L; // sets the version to 1.
-        return msb;
-    }
-
-    private static long makeNode()
-    {
-       /*
-        * We don't have access to the MAC address but need to generate a node part
-        * that identify this host as uniquely as possible.
-        * The spec says that one option is to take as many source that identify
-        * this node as possible and hash them together. That's what we do here by
-        * gathering all the ip of this host.
-        * Note that FBUtilities.getJustBroadcastAddress() should be enough to uniquely
-        * identify the node *in the cluster* but it triggers DatabaseDescriptor
-        * instanciation and the UUID generator is used in Stress for instance,
-        * where we don't want to require the yaml.
-        */
-        Collection<InetAddressAndPort> localAddresses = getAllLocalAddresses();
-        if (localAddresses.isEmpty())
-            throw new RuntimeException("Cannot generate the node component of the UUID because cannot retrieve any IP addresses.");
-
-        // ideally, we'd use the MAC address, but java doesn't expose that.
-        byte[] hash = hash(localAddresses);
-        long node = 0;
-        for (int i = 0; i < Math.min(6, hash.length); i++)
-            node |= (0x00000000000000ff & (long)hash[i]) << (5-i)*8;
-        assert (0xff00000000000000L & node) == 0;
-
-        // Since we don't use the mac address, the spec says that multicast
-        // bit (least significant bit of the first octet of the node ID) must be 1.
-        return node | 0x0000010000000000L;
-    }
-
-    private static byte[] hash(Collection<InetAddressAndPort> data)
-    {
-        // Identify the host.
-        Hasher hasher = Hashing.md5().newHasher();
-        for(InetAddressAndPort addr : data)
-        {
-            hasher.putBytes(addr.addressBytes);
-            hasher.putInt(addr.port);
-        }
-
-        // Identify the process on the load: we use both the PID and class loader hash.
-        long pid = NativeLibrary.getProcessID();
-        if (pid < 0)
-            pid = new Random(System.currentTimeMillis()).nextLong();
-        updateWithLong(hasher, pid);
-
-        ClassLoader loader = UUIDGen.class.getClassLoader();
-        int loaderId = loader != null ? System.identityHashCode(loader) : 0;
-        updateWithInt(hasher, loaderId);
-
-        return hasher.hash().asBytes();
-    }
-
-    private static void updateWithInt(Hasher hasher, int val)
-    {
-        hasher.putByte((byte) ((val >>> 24) & 0xFF));
-        hasher.putByte((byte) ((val >>> 16) & 0xFF));
-        hasher.putByte((byte) ((val >>>  8) & 0xFF));
-        hasher.putByte((byte) ((val >>> 0) & 0xFF));
-    }
-
-    public static void updateWithLong(Hasher hasher, long val)
-    {
-        hasher.putByte((byte) ((val >>> 56) & 0xFF));
-        hasher.putByte((byte) ((val >>> 48) & 0xFF));
-        hasher.putByte((byte) ((val >>> 40) & 0xFF));
-        hasher.putByte((byte) ((val >>> 32) & 0xFF));
-        hasher.putByte((byte) ((val >>> 24) & 0xFF));
-        hasher.putByte((byte) ((val >>> 16) & 0xFF));
-        hasher.putByte((byte) ((val >>>  8) & 0xFF));
-        hasher.putByte((byte)  ((val >>> 0) & 0xFF));
-    }
-
-    /**
-     * Helper function used exclusively by UUIDGen to create
-     **/
-    public static Collection<InetAddressAndPort> getAllLocalAddresses()
-    {
-        Set<InetAddressAndPort> localAddresses = new HashSet<>();
-        try
-        {
-            Enumeration<NetworkInterface> nets = NetworkInterface.getNetworkInterfaces();
-            if (nets != null)
-            {
-                while (nets.hasMoreElements())
-                {
-                    Function<InetAddress, InetAddressAndPort> converter =
-                    address -> InetAddressAndPort.getByAddressOverrideDefaults(address, 0);
-                    List<InetAddressAndPort> addresses =
-                    Collections.list(nets.nextElement().getInetAddresses()).stream().map(converter).collect(Collectors.toList());
-                    localAddresses.addAll(addresses);
-                }
-            }
-        }
-        catch (SocketException e)
-        {
-            throw new AssertionError(e);
-        }
-        if (DatabaseDescriptor.isDaemonInitialized())
-        {
-            localAddresses.add(FBUtilities.getBroadcastAddressAndPort());
-            localAddresses.add(FBUtilities.getBroadcastNativeAddressAndPort());
-            localAddresses.add(FBUtilities.getLocalAddressAndPort());
-        }
-        return localAddresses;
+        return (uuid.timestamp() / 10000) + TimeUUID.UUID_EPOCH_UNIX_MILLIS;
     }
 
 }
diff --git a/src/java/org/apache/cassandra/utils/VoidSerializer.java b/src/java/org/apache/cassandra/utils/VoidSerializer.java
new file mode 100644
index 0000000..1bc1167
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/VoidSerializer.java
@@ -0,0 +1,34 @@
+/*
+ * 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.utils;
+
+import java.io.IOException;
+
+import org.apache.cassandra.io.IVersionedSerializer;
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+
+public class VoidSerializer implements IVersionedSerializer<Void>
+{
+    public static final VoidSerializer serializer = new VoidSerializer();
+    private VoidSerializer() {}
+    public void serialize(Void v, DataOutputPlus out, int version) throws IOException {}
+    public Void deserialize(DataInputPlus in, int version) throws IOException { return null; }
+    public long serializedSize(Void v, int version) { return 0; }
+}
diff --git a/src/java/org/apache/cassandra/utils/WindowsTimer.java b/src/java/org/apache/cassandra/utils/WindowsTimer.java
deleted file mode 100644
index bbd162c..0000000
--- a/src/java/org/apache/cassandra/utils/WindowsTimer.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.utils;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import com.sun.jna.LastErrorException;
-import com.sun.jna.Native;
-
-public final class WindowsTimer
-{
-    private static final Logger logger = LoggerFactory.getLogger(WindowsTimer.class);
-
-    static
-    {
-        try
-        {
-            Native.register("winmm");
-        }
-        catch (NoClassDefFoundError e)
-        {
-            logger.warn("JNA not found. winmm.dll cannot be registered. Performance will be negatively impacted on this node.");
-        }
-        catch (Exception e)
-        {
-            logger.error("Failed to register winmm.dll. Performance will be negatively impacted on this node.");
-        }
-    }
-
-    private static native int timeBeginPeriod(int period) throws LastErrorException;
-    private static native int timeEndPeriod(int period) throws LastErrorException;
-
-    private WindowsTimer() {}
-
-    public static void startTimerPeriod(int period)
-    {
-        if (period == 0)
-            return;
-        assert(period > 0);
-        if (timeBeginPeriod(period) != 0)
-            logger.warn("Failed to set timer to : {}. Performance will be degraded.", period);
-    }
-
-    public static void endTimerPeriod(int period)
-    {
-        if (period == 0)
-            return;
-        assert(period > 0);
-        if (timeEndPeriod(period) != 0)
-            logger.warn("Failed to end accelerated timer period. System timer will remain set to: {} ms.", period);
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/WithResources.java b/src/java/org/apache/cassandra/utils/WithResources.java
new file mode 100644
index 0000000..0c0bb92
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/WithResources.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.utils;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A generic interface for encapsulating a Runnable task with related work before and after execution,
+ * using the built-in try-with-resources functionality offered by {@link Closeable}.
+ *
+ * See {@link ExecutorPlus#execute(WithResources, Runnable)}
+ */
+@Shared(scope = SIMULATION)
+public interface WithResources
+{
+    static class None implements WithResources
+    {
+        static final None INSTANCE = new None();
+        private None() {}
+        @Override
+        public Closeable get()
+        {
+            return () -> {};
+        }
+
+        @Override
+        public boolean isNoOp()
+        {
+            return true;
+        }
+    }
+
+    /**
+     * Instantiate any necessary resources
+     * @return an object that closes any instantiated resources
+     */
+    public Closeable get();
+
+    /**
+     * A convenience method to avoid unnecessary work.
+     * @return true iff this object performs no work when {@link #get()} is invoked, nor when {@link Closeable#close()}
+     *         is invoked on the object it returns.
+     */
+    default public boolean isNoOp() { return false; }
+    default public WithResources and(WithResources withResources)
+    {
+        return and(this, withResources);
+    }
+    static WithResources none() { return None.INSTANCE; }
+
+    @SuppressWarnings("resource")
+    public static WithResources and(WithResources first, WithResources second)
+    {
+        if (second.isNoOp()) return first;
+        if (first.isNoOp()) return second;
+        return () -> {
+            Closeable a = first.get();
+            try
+            {
+                Closeable b = second.get();
+                return () -> {
+                    try { a.close(); }
+                    finally { b.close(); }
+                };
+            }
+            catch (Throwable t)
+            {
+                try { a.close(); } catch (Throwable t2) { t.addSuppressed(t2); }
+                throw t;
+            }
+        };
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/binlog/BinLog.java b/src/java/org/apache/cassandra/utils/binlog/BinLog.java
index b226751..43ff67e 100644
--- a/src/java/org/apache/cassandra/utils/binlog/BinLog.java
+++ b/src/java/org/apache/cassandra/utils/binlog/BinLog.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils.binlog;
 
-import java.io.File;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -32,6 +31,7 @@
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Strings;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -44,10 +44,10 @@
 import net.openhft.chronicle.wire.WriteMarshallable;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.io.FSError;
-import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.NoSpamLogger;
 import org.apache.cassandra.utils.Throwables;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
 import org.apache.cassandra.utils.concurrent.WeightedQueue;
 
 import static java.lang.String.format;
@@ -125,7 +125,7 @@
         Preconditions.checkNotNull(path, "path was null");
         Preconditions.checkNotNull(options.roll_cycle, "roll_cycle was null");
         Preconditions.checkArgument(options.max_queue_weight > 0, "max_queue_weight must be > 0");
-        SingleChronicleQueueBuilder builder = SingleChronicleQueueBuilder.single(path.toFile());
+        SingleChronicleQueueBuilder builder = SingleChronicleQueueBuilder.single(path.toFile()); // checkstyle: permit this invocation
         builder.rollCycle(RollCycles.valueOf(options.roll_cycle));
 
         sampleQueue = new WeightedQueue<>(options.max_queue_weight);
@@ -295,7 +295,7 @@
                 }
                 catch (InterruptedException e)
                 {
-                    throw new RuntimeException(e);
+                    throw new UncheckedInterruptedException(e);
                 }
             }
             else
@@ -366,11 +366,11 @@
         public Builder path(Path path)
         {
             Preconditions.checkNotNull(path, "path was null");
-            File pathAsFile = path.toFile();
+            File pathAsFile = new File(path);
             //Exists and is a directory or can be created
             Preconditions.checkArgument(!pathAsFile.toString().isEmpty(), "you might have forgotten to specify a directory to save logs");
-            Preconditions.checkArgument((pathAsFile.exists() && pathAsFile.isDirectory()) || (!pathAsFile.exists() && pathAsFile.mkdirs()), "path exists and is not a directory or couldn't be created");
-            Preconditions.checkArgument(pathAsFile.canRead() && pathAsFile.canWrite() && pathAsFile.canExecute(), "path is not readable, writable, and executable");
+            Preconditions.checkArgument((pathAsFile.exists() && pathAsFile.isDirectory()) || (!pathAsFile.exists() && pathAsFile.tryCreateDirectories()), "path exists and is not a directory or couldn't be created");
+            Preconditions.checkArgument(pathAsFile.isReadable() && pathAsFile.isWritable() && pathAsFile.isExecutable(), "path is not readable, writable, and executable");
             this.path = path;
             return this;
         }
@@ -428,7 +428,7 @@
             }
             try
             {
-                Throwable sanitationThrowable = cleanEmptyLogFiles(path.toFile(), null);
+                Throwable sanitationThrowable = cleanEmptyLogFiles(new File(path), null);
                 if (sanitationThrowable != null)
                     throw new RuntimeException(format("Unable to clean up %s directory from empty %s files.",
                                                       path.toAbsolutePath(), SingleChronicleQueue.SUFFIX),
@@ -439,9 +439,9 @@
                 if (cleanDirectory)
                 {
                     logger.info("Cleaning directory: {} as requested", path);
-                    if (path.toFile().exists())
+                    if (new File(path).exists())
                     {
-                        Throwable error = cleanDirectory(path.toFile(), null);
+                        Throwable error = cleanDirectory(new File(path), null);
                         if (error != null)
                         {
                             throw new RuntimeException(error);
@@ -476,14 +476,14 @@
     private static Throwable cleanEmptyLogFiles(File directory, Throwable accumulate)
     {
         return cleanDirectory(directory, accumulate,
-                              (dir) -> dir.listFiles(file -> {
+                              (dir) -> dir.tryList(file -> {
                                   boolean foundEmptyCq4File = !file.isDirectory()
                                                               && file.length() == 0
-                                                              && file.getName().endsWith(SingleChronicleQueue.SUFFIX);
+                                                              && file.name().endsWith(SingleChronicleQueue.SUFFIX);
 
                                   if (foundEmptyCq4File)
                                       logger.warn("Found empty ChronicleQueue file {}. This file wil be deleted as part of BinLog initialization.",
-                                                  file.getAbsolutePath());
+                                                  file.absolutePath());
 
                                   return foundEmptyCq4File;
                               }));
@@ -491,7 +491,7 @@
 
     public static Throwable cleanDirectory(File directory, Throwable accumulate)
     {
-        return cleanDirectory(directory, accumulate, File::listFiles);
+        return cleanDirectory(directory, accumulate, File::tryList);
     }
 
     private static Throwable cleanDirectory(File directory, Throwable accumulate, Function<File, File[]> lister)
@@ -517,12 +517,12 @@
     {
         if (fileOrDirectory.isDirectory())
         {
-            File[] files = fileOrDirectory.listFiles();
+            File[] files = fileOrDirectory.tryList();
             if (files != null)
                 for (File f : files)
-                    accumulate = FileUtils.deleteWithConfirm(f, accumulate);
+                    accumulate = f.delete(accumulate, null);
         }
-        return FileUtils.deleteWithConfirm(fileOrDirectory, accumulate);
+        return fileOrDirectory.delete(accumulate, null);
     }
 
     private static Throwable checkDirectory(File directory, Throwable accumulate)
diff --git a/src/java/org/apache/cassandra/utils/binlog/BinLogArchiver.java b/src/java/org/apache/cassandra/utils/binlog/BinLogArchiver.java
index 9a6f0bc..f009629 100644
--- a/src/java/org/apache/cassandra/utils/binlog/BinLogArchiver.java
+++ b/src/java/org/apache/cassandra/utils/binlog/BinLogArchiver.java
@@ -18,7 +18,7 @@
 
 package org.apache.cassandra.utils.binlog;
 
-import java.io.File;
+import java.io.File; // checkstyle: permit this import
 
 import net.openhft.chronicle.queue.impl.StoreFileListener;
 
diff --git a/src/java/org/apache/cassandra/utils/binlog/DeletingArchiver.java b/src/java/org/apache/cassandra/utils/binlog/DeletingArchiver.java
index 3bdbb8f..44bdc8e 100644
--- a/src/java/org/apache/cassandra/utils/binlog/DeletingArchiver.java
+++ b/src/java/org/apache/cassandra/utils/binlog/DeletingArchiver.java
@@ -18,7 +18,7 @@
 
 package org.apache.cassandra.utils.binlog;
 
-import java.io.File;
+import java.io.File; // checkstyle: permit this import
 import java.util.Queue;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
diff --git a/src/java/org/apache/cassandra/utils/binlog/ExternalArchiver.java b/src/java/org/apache/cassandra/utils/binlog/ExternalArchiver.java
index e53c5b0..a6b2335 100644
--- a/src/java/org/apache/cassandra/utils/binlog/ExternalArchiver.java
+++ b/src/java/org/apache/cassandra/utils/binlog/ExternalArchiver.java
@@ -18,14 +18,13 @@
 
 package org.apache.cassandra.utils.binlog;
 
-import java.io.File;
+import java.io.File; // checkstyle: permit this import
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.concurrent.DelayQueue;
 import java.util.concurrent.Delayed;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -37,8 +36,12 @@
 import org.slf4j.LoggerFactory;
 
 import net.openhft.chronicle.queue.impl.single.SingleChronicleQueue;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * Archives binary log files immediately when they are rolled using a configure archive command.
@@ -57,7 +60,7 @@
      */
     private final DelayQueue<DelayFile> archiveQueue = new DelayQueue<>();
     private final String archiveCommand;
-    private final ExecutorService executor = Executors.newSingleThreadExecutor(new NamedThreadFactory("BinLogArchiver"));
+    private final ExecutorService executor = executorFactory().sequential("BinLogArchiver");
     private final Path path;
     /**
      * for testing, to be able to make sure that the command is executed
@@ -134,7 +137,11 @@
             // and try to archive all remaining files before exiting
             archiveExisting(path);
         }
-        catch (InterruptedException | ExecutionException e)
+        catch (InterruptedException e)
+        {
+            throw new UncheckedInterruptedException(e);
+        }
+        catch (ExecutionException e)
         {
             throw new RuntimeException(e);
         }
@@ -147,7 +154,7 @@
     {
         if (path == null)
             return;
-        for (File f : path.toFile().listFiles((f) -> f.isFile() && f.getName().endsWith(SingleChronicleQueue.SUFFIX)))
+        for (File f : path.toFile().listFiles((f) -> f.isFile() && f.getName().endsWith(SingleChronicleQueue.SUFFIX))) // checkstyle: permit this invocation
         {
             try
             {
@@ -184,12 +191,12 @@
         public DelayFile(File file, long delay, TimeUnit delayUnit, int retries)
         {
             this.file = file;
-            this.delayTime = System.currentTimeMillis() + TimeUnit.MILLISECONDS.convert(delay, delayUnit);
+            this.delayTime = currentTimeMillis() + MILLISECONDS.convert(delay, delayUnit);
             this.retries = retries;
         }
         public long getDelay(TimeUnit unit)
         {
-            return unit.convert(delayTime - System.currentTimeMillis(), TimeUnit.MILLISECONDS);
+            return unit.convert(delayTime - currentTimeMillis(), TimeUnit.MILLISECONDS);
         }
 
         public int compareTo(Delayed o)
diff --git a/src/java/org/apache/cassandra/utils/btree/BTree.java b/src/java/org/apache/cassandra/utils/btree/BTree.java
index 97f5cc0..a026f70 100644
--- a/src/java/org/apache/cassandra/utils/btree/BTree.java
+++ b/src/java/org/apache/cassandra/utils/btree/BTree.java
@@ -2199,6 +2199,7 @@
     {
         if (isEmpty(tree))
             return 0;
+
         long size = ObjectSizes.sizeOfArray(tree);
         if (isLeaf(tree))
             return size;
@@ -2212,6 +2213,7 @@
     {
         if (isEmpty(tree))
             return 0;
+
         return ObjectSizes.sizeOfArray(tree);
     }
 
diff --git a/src/java/org/apache/cassandra/utils/btree/LeafBTreeSearchIterator.java b/src/java/org/apache/cassandra/utils/btree/LeafBTreeSearchIterator.java
index a23f460..3c1991a 100644
--- a/src/java/org/apache/cassandra/utils/btree/LeafBTreeSearchIterator.java
+++ b/src/java/org/apache/cassandra/utils/btree/LeafBTreeSearchIterator.java
@@ -133,4 +133,4 @@
         int current = forwards ? nextPos - 1 : nextPos + 1;
         return forwards ? current - lowerBound : upperBound - current;
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/utils/btree/NodeCursor.java b/src/java/org/apache/cassandra/utils/btree/NodeCursor.java
index e9fa89e..4c7e993 100644
--- a/src/java/org/apache/cassandra/utils/btree/NodeCursor.java
+++ b/src/java/org/apache/cassandra/utils/btree/NodeCursor.java
@@ -195,4 +195,4 @@
     {
         return (K) node[position];
     }
-}
\ No newline at end of file
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/AbstractFuture.java b/src/java/org/apache/cassandra/utils/concurrent/AbstractFuture.java
new file mode 100644
index 0000000..83cd7d3
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/AbstractFuture.java
@@ -0,0 +1,530 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import javax.annotation.Nullable;
+
+import com.google.common.base.Preconditions;
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
+
+import io.netty.util.concurrent.GenericFutureListener;
+import io.netty.util.internal.ThrowableUtil;
+import org.apache.cassandra.utils.concurrent.ListenerList.CallbackBiConsumerListener;
+import org.apache.cassandra.utils.concurrent.ListenerList.CallbackLambdaListener;
+import org.apache.cassandra.utils.concurrent.ListenerList.CallbackListener;
+import org.apache.cassandra.utils.concurrent.ListenerList.CallbackListenerWithExecutor;
+import org.apache.cassandra.utils.concurrent.ListenerList.GenericFutureListenerList;
+import org.apache.cassandra.utils.concurrent.ListenerList.RunnableWithExecutor;
+import org.apache.cassandra.utils.concurrent.ListenerList.RunnableWithNotifyExecutor;
+
+import static java.util.concurrent.atomic.AtomicReferenceFieldUpdater.newUpdater;
+import static org.apache.cassandra.utils.concurrent.ListenerList.notifyListener;
+
+/**
+ * Our default {@link Future} implementation, with all state being managed without locks (except those used by the JVM).
+ *
+ * Some implementation comments versus Netty's default promise:
+ *  - We permit efficient initial state declaration, avoiding unnecessary CAS or lock acquisitions when mutating
+ *    a Promise we are ourselves constructing (and can easily add more; only those we use have been added)
+ *  - We guarantee the order of invocation of listeners (and callbacks etc, and with respect to each other)
+ *  - We save some space when registering listeners, especially if there is only one listener, as we perform no
+ *    extra allocations in this case.
+ *  - We implement our invocation list as a concurrent stack, that is cleared on notification
+ *  - We handle special values slightly differently.
+ *    - We do not use a special value for null, instead using a special value to indicate the result has not been set.
+ *      This means that once isSuccess() holds, the result must be a correctly typed object (modulo generics pitfalls).
+ *    - All special values are also instances of FailureHolder, which simplifies a number of the logical conditions.
+ */
+@SuppressWarnings({ "rawtypes", "unchecked" })
+public abstract class AbstractFuture<V> implements Future<V>
+{
+    protected static final FailureHolder UNSET = new FailureHolder(null);
+    protected static final FailureHolder UNCANCELLABLE = new FailureHolder(null);
+    protected static final FailureHolder CANCELLED = new FailureHolder(ThrowableUtil.unknownStackTrace(new CancellationException(), AbstractFuture.class, "cancel(...)"));
+
+    static class FailureHolder
+    {
+        final Throwable cause;
+        FailureHolder(Throwable cause)
+        {
+            this.cause = cause;
+        }
+    }
+
+    private static Throwable cause(Object result)
+    {
+        return result instanceof FailureHolder ? ((FailureHolder) result).cause : null;
+    }
+    static boolean isSuccess(Object result)
+    {
+        return !(result instanceof FailureHolder);
+    }
+    static boolean isCancelled(Object result)
+    {
+        return result == CANCELLED;
+    }
+    static boolean isDone(Object result)
+    {
+        return result != UNSET && result != UNCANCELLABLE;
+    }
+
+    volatile Object result;
+    volatile ListenerList<V> listeners; // either a ListenerList or GenericFutureListener (or null)
+    static final AtomicReferenceFieldUpdater<AbstractFuture, Object> resultUpdater = newUpdater(AbstractFuture.class, Object.class, "result");
+    static final AtomicReferenceFieldUpdater<AbstractFuture, ListenerList> listenersUpdater = newUpdater(AbstractFuture.class, ListenerList.class, "listeners");
+
+    protected AbstractFuture(FailureHolder initialState)
+    {
+        // TODO: document visibility of constructor (i.e. must be safe published)
+        resultUpdater.lazySet(this, initialState);
+    }
+
+    public AbstractFuture()
+    {
+        this(UNSET);
+    }
+
+    protected AbstractFuture(V immediateSuccess)
+    {
+        resultUpdater.lazySet(this, immediateSuccess);
+    }
+
+    protected AbstractFuture(Throwable immediateFailure)
+    {
+       this(new FailureHolder(immediateFailure));
+    }
+
+    protected AbstractFuture(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        this();
+        listenersUpdater.lazySet(this, new GenericFutureListenerList(listener));
+    }
+
+    protected AbstractFuture(FailureHolder initialState, GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        this(initialState);
+        listenersUpdater.lazySet(this, new GenericFutureListenerList(listener));
+    }
+
+    public Executor notifyExecutor()
+    {
+        return null;
+    }
+
+    protected boolean trySuccess(V v)
+    {
+        return trySet(v);
+    }
+
+    protected boolean tryFailure(Throwable throwable)
+    {
+        return trySet(new FailureHolder(throwable));
+    }
+
+    protected boolean setUncancellable()
+    {
+        if (trySet(UNCANCELLABLE))
+            return true;
+        return isUncancellable();
+    }
+
+    protected boolean setUncancellableExclusive()
+    {
+        return trySet(UNCANCELLABLE);
+    }
+
+    protected boolean isUncancellable()
+    {
+        Object result = this.result;
+        return result == UNCANCELLABLE || (isDone(result) && !isCancelled(result));
+    }
+
+    public boolean cancel(boolean b)
+    {
+        return trySet(CANCELLED);
+    }
+
+    /**
+     * Shared implementation of various promise completion methods.
+     * Updates the result if it is possible to do so, returning success/failure.
+     *
+     * If the promise is UNSET the new value will succeed;
+     *          if it is UNCANCELLABLE it will succeed only if the new value is not CANCELLED
+     *          otherwise it will fail, as isDone() is implied
+     *
+     * If the update succeeds, and the new state implies isDone(), any listeners and waiters will be notified
+     */
+    abstract boolean trySet(Object v);
+
+    @Override
+    public boolean isSuccess()
+    {
+        return isSuccess(result);
+    }
+
+    @Override
+    public boolean isCancelled()
+    {
+        return isCancelled(result);
+    }
+
+    @Override
+    public boolean isDone()
+    {
+        return isDone(result);
+    }
+
+    @Override
+    public boolean isCancellable()
+    {
+        return result == UNSET;
+    }
+
+    @Override
+    public Throwable cause()
+    {
+        return cause(result);
+    }
+
+    /**
+     * if isSuccess(), returns the value, otherwise returns null
+     */
+    @Override
+    public V getNow()
+    {
+        Object result = this.result;
+        if (isSuccess(result))
+            return (V) result;
+        return null;
+    }
+
+    /**
+     * Shared implementation of get() after suitable await(); assumes isDone(), and returns
+     * either the success result or throws the suitable exception under failure
+     */
+    protected V getWhenDone() throws ExecutionException
+    {
+        Object result = this.result;
+        if (isSuccess(result))
+            return (V) result;
+        if (result == CANCELLED)
+            throw new CancellationException();
+        throw new ExecutionException(((FailureHolder) result).cause);
+    }
+
+    @Override
+    public V get() throws InterruptedException, ExecutionException
+    {
+        await();
+        return getWhenDone();
+    }
+
+    @Override
+    public V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException
+    {
+        if (!await(timeout, unit))
+            throw new TimeoutException();
+        return getWhenDone();
+    }
+
+    /**
+     * Logically append {@code newListener} to {@link #listeners}
+     * (at this stage it is a stack, so we actually prepend)
+     */
+    abstract void appendListener(ListenerList<V> newListener);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public AbstractFuture<V> addCallback(FutureCallback<? super V> callback)
+    {
+        appendListener(new CallbackListener<>(this, callback));
+        return this;
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public AbstractFuture<V> addCallback(BiConsumer<? super V, Throwable> callback)
+    {
+        appendListener(new CallbackBiConsumerListener<>(this, callback, null));
+        return this;
+    }
+
+    @Override
+    public Future<V> addCallback(BiConsumer<? super V, Throwable> callback, Executor executor)
+    {
+        appendListener(new CallbackBiConsumerListener<>(this, callback, executor));
+        return this;
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public AbstractFuture<V> addCallback(FutureCallback<? super V> callback, Executor executor)
+    {
+        Preconditions.checkNotNull(executor);
+        appendListener(new CallbackListenerWithExecutor<>(this, callback, executor));
+        return this;
+    }
+
+    /**
+     * Support more fluid version of {@link com.google.common.util.concurrent.Futures#addCallback}
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public AbstractFuture<V> addCallback(Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure)
+    {
+        appendListener(new CallbackLambdaListener<>(this, onSuccess, onFailure, null));
+        return this;
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transformAsync(ListenableFuture, AsyncFunction, Executor)} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public <T> Future<T> map(Function<? super V, ? extends T> mapper)
+    {
+        return map(mapper, null);
+    }
+
+    /**
+     * Support more fluid version of {@link com.google.common.util.concurrent.Futures#addCallback}
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public AbstractFuture<V> addCallback(Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure, Executor executor)
+    {
+        appendListener(new CallbackLambdaListener<>(this, onSuccess, onFailure, executor));
+        return this;
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transform(ListenableFuture, com.google.common.base.Function, Executor)} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    protected <T> Future<T> map(AbstractFuture<T> result, Function<? super V, ? extends T> mapper, @Nullable Executor executor)
+    {
+        addListener(() -> {
+            try
+            {
+                if (isSuccess()) result.trySet(mapper.apply(getNow()));
+                else result.tryFailure(cause());
+            }
+            catch (Throwable t)
+            {
+                result.tryFailure(t);
+                throw t;
+            }
+        }, executor);
+        return result;
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transformAsync(ListenableFuture, AsyncFunction, Executor)} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    protected <T> Future<T> flatMap(AbstractFuture<T> result, Function<? super V, ? extends Future<T>> flatMapper, @Nullable Executor executor)
+    {
+        addListener(() -> {
+            try
+            {
+                if (isSuccess()) flatMapper.apply(getNow()).addListener(propagate(result));
+                else result.tryFailure(cause());
+            }
+            catch (Throwable t)
+            {
+                result.tryFailure(t);
+                throw t;
+            }
+        }, executor);
+        return result;
+    }
+
+    /**
+     * Add a listener to be invoked once this future completes.
+     * Listeners are submitted to {@link #notifyExecutor} in the order they are added (or the specified executor
+     * in the case of {@link #addListener(Runnable, Executor)}.
+     * if {@link #notifyExecutor} is unset, they are invoked in the order they are added.
+     * The ordering holds across all variants of this method.
+     */
+    public Future<V> addListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        appendListener(new GenericFutureListenerList(listener));
+        return this;
+    }
+
+    /**
+     * Add a listener to be invoked once this future completes.
+     * Listeners are submitted to their {@code #executor} (or {@link #notifyExecutor}) in the order they are added;
+     * if {@link #notifyExecutor} is unset, they are invoked in the order they are added.
+     * The ordering holds across all variants of this method.
+     */
+    public void addListener(Runnable task, @Nullable Executor executor)
+    {
+        appendListener(new RunnableWithExecutor(task, executor));
+    }
+
+    /**
+     * Add a listener to be invoked once this future completes.
+     * Listeners are submitted to {@link #notifyExecutor} in the order they are added (or the specified executor
+     * in the case of {@link #addListener(Runnable, Executor)}.
+     * if {@link #notifyExecutor} is unset, they are invoked in the order they are added.
+     * The ordering holds across all variants of this method.
+     */
+    public void addListener(Runnable task)
+    {
+        appendListener(new RunnableWithNotifyExecutor(task));
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Future<V> addListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... listeners)
+    {
+        // this could be more efficient if we cared, but we do not
+        return addListener(future -> {
+            for (GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener : listeners)
+                notifyListener((GenericFutureListener<io.netty.util.concurrent.Future<? super V>>)listener, future);
+        });
+    }
+
+    @Override
+    public Future<V> removeListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public Future<V> removeListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... listeners)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public boolean await(long timeout, TimeUnit unit) throws InterruptedException
+    {
+        return Defaults.await(this, timeout, unit);
+    }
+
+    @Override
+    public boolean awaitThrowUncheckedOnInterrupt(long time, TimeUnit units) throws UncheckedInterruptedException
+    {
+        return Defaults.awaitThrowUncheckedOnInterrupt(this, time, units);
+    }
+
+    @Override
+    public boolean awaitUninterruptibly(long timeout, TimeUnit unit)
+    {
+        return Defaults.awaitUninterruptibly(this, timeout, unit);
+    }
+
+    @Override
+    public boolean awaitUntilThrowUncheckedOnInterrupt(long nanoTimeDeadline) throws UncheckedInterruptedException
+    {
+        return Defaults.awaitUntilThrowUncheckedOnInterrupt(this, nanoTimeDeadline);
+    }
+
+    @Override
+    public boolean awaitUntilUninterruptibly(long nanoTimeDeadline)
+    {
+        return Defaults.awaitUntilUninterruptibly(this, nanoTimeDeadline);
+    }
+
+    /**
+     * Wait for this future to complete {@link Awaitable#awaitUninterruptibly()}
+     */
+    @Override
+    public Future<V> awaitUninterruptibly()
+    {
+        return Defaults.awaitUninterruptibly(this);
+    }
+
+    /**
+     * Wait for this future to complete {@link Awaitable#awaitThrowUncheckedOnInterrupt()}
+     */
+    @Override
+    public Future<V> awaitThrowUncheckedOnInterrupt() throws UncheckedInterruptedException
+    {
+        return Defaults.awaitThrowUncheckedOnInterrupt(this);
+    }
+
+    public String toString()
+    {
+        String description = description();
+        String state = state();
+        return description == null ? state : (state + ' ' + description);
+    }
+
+    private String state()
+    {
+        Object result = this.result;
+        if (isSuccess(result))
+            return "(success: " + result + ')';
+        if (result == UNCANCELLABLE)
+            return "(uncancellable)";
+        if (result == CANCELLED)
+            return "(cancelled)";
+        if (isDone(result))
+            return "(failure: " + ((FailureHolder) result).cause + ')';
+        return "(incomplete)";
+    }
+
+    protected String description()
+    {
+        return null;
+    }
+
+    /**
+     * @return a listener that will propagate to {@code to} the result of the future it is invoked with
+     */
+    private static <V> GenericFutureListener<? extends Future<V>> propagate(AbstractFuture<? super V> to)
+    {
+        return from -> {
+            if (from.isSuccess()) to.trySuccess(from.getNow());
+            else to.tryFailure(from.cause());
+        };
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/AsyncFuture.java b/src/java/org/apache/cassandra/utils/concurrent/AsyncFuture.java
new file mode 100644
index 0000000..0ef35d5
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/AsyncFuture.java
@@ -0,0 +1,163 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.Function;
+import javax.annotation.Nullable;
+
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
+
+import io.netty.util.concurrent.GenericFutureListener;
+
+/**
+ * Our default {@link Future} implementation, with all state being managed without locks (except those used by the JVM).
+ *
+ * Some implementation comments versus Netty's default promise:
+ *  - We permit efficient initial state declaration, avoiding unnecessary CAS or lock acquisitions when mutating
+ *    a Promise we are ourselves constructing (and can easily add more; only those we use have been added)
+ *  - We guarantee the order of invocation of listeners (and callbacks etc, and with respect to each other)
+ *  - We save some space when registering listeners, especially if there is only one listener, as we perform no
+ *    extra allocations in this case.
+ *  - We implement our invocation list as a concurrent stack, that is cleared on notification
+ *  - We handle special values slightly differently.
+ *    - We do not use a special value for null, instead using a special value to indicate the result has not been set.
+ *      This means that once isSuccess() holds, the result must be a correctly typed object (modulo generics pitfalls).
+ *    - All special values are also instances of FailureHolder, which simplifies a number of the logical conditions.
+ */
+public class AsyncFuture<V> extends AbstractFuture<V>
+{
+    @SuppressWarnings({ "rawtypes" })
+    private static final AtomicReferenceFieldUpdater<AsyncFuture, WaitQueue> waitingUpdater = AtomicReferenceFieldUpdater.newUpdater(AsyncFuture.class, WaitQueue.class, "waiting");
+    @SuppressWarnings({ "unused" })
+    private volatile WaitQueue waiting;
+
+    public AsyncFuture()
+    {
+        super();
+    }
+
+    protected AsyncFuture(V immediateSuccess)
+    {
+        super(immediateSuccess);
+    }
+
+    protected AsyncFuture(Throwable immediateFailure)
+    {
+        super(immediateFailure);
+    }
+
+    protected AsyncFuture(FailureHolder initialState)
+    {
+        super(initialState);
+    }
+
+    protected AsyncFuture(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        super(listener);
+    }
+
+    protected AsyncFuture(FailureHolder initialState, GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        super(initialState, listener);
+    }
+
+    /**
+     * Shared implementation of various promise completion methods.
+     * Updates the result if it is possible to do so, returning success/failure.
+     *
+     * If the promise is UNSET the new value will succeed;
+     *          if it is UNCANCELLABLE it will succeed only if the new value is not CANCELLED
+     *          otherwise it will fail, as isDone() is implied
+     *
+     * If the update succeeds, and the new state implies isDone(), any listeners and waiters will be notified
+     */
+    boolean trySet(Object v)
+    {
+        while (true)
+        {
+            Object current = result;
+            if (isDone(current) || (current == UNCANCELLABLE && (v == CANCELLED || v == UNCANCELLABLE)))
+                return false;
+            if (resultUpdater.compareAndSet(this, current, v))
+            {
+                if (v != UNCANCELLABLE)
+                {
+                    ListenerList.notify(listenersUpdater, this);
+                    AsyncAwaitable.signalAll(waitingUpdater, this);
+                }
+                return true;
+            }
+        }
+    }
+
+    /**
+     * Logically append {@code newListener} to {@link #listeners}
+     * (at this stage it is a stack, so we actually prepend)
+     *
+     * @param newListener must be either a {@link ListenerList} or {@link GenericFutureListener}
+     */
+    void appendListener(ListenerList<V> newListener)
+    {
+        ListenerList.push(listenersUpdater, this, newListener);
+        if (isDone())
+            ListenerList.notify(listenersUpdater, this);
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transform} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public <T> Future<T> map(Function<? super V, ? extends T> mapper, Executor executor)
+    {
+        return map(new AsyncFuture<>(), mapper, executor);
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transformAsync(ListenableFuture, AsyncFunction, Executor)} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public <T> Future<T> flatMap(Function<? super V, ? extends Future<T>> flatMapper, @Nullable Executor executor)
+    {
+        return flatMap(new AsyncFuture<>(), flatMapper, executor);
+    }
+
+    /**
+     * Wait for this future to complete {@link Awaitable#await()}
+     */
+    @Override
+    public AsyncFuture<V> await() throws InterruptedException
+    {
+        //noinspection unchecked
+        return AsyncAwaitable.await(waitingUpdater, Future::isDone, this);
+    }
+
+    @Override
+    public boolean awaitUntil(long nanoTimeDeadline) throws InterruptedException
+    {
+        return AsyncAwaitable.awaitUntil(waitingUpdater, Future::isDone, this, nanoTimeDeadline);
+    }
+}
+
diff --git a/src/java/org/apache/cassandra/utils/concurrent/AsyncPromise.java b/src/java/org/apache/cassandra/utils/concurrent/AsyncPromise.java
new file mode 100644
index 0000000..61b5818
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/AsyncPromise.java
@@ -0,0 +1,269 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+import com.google.common.util.concurrent.FutureCallback;
+
+import io.netty.util.concurrent.Future; // checkstyle: permit this import
+import io.netty.util.concurrent.GenericFutureListener;
+
+/**
+ * Extends {@link AsyncFuture} to implement the {@link Promise} interface.
+ */
+public class AsyncPromise<V> extends AsyncFuture<V> implements Promise<V>
+{
+    public static class WithExecutor<V> extends AsyncPromise<V>
+    {
+        final Executor notifyExecutor;
+        protected WithExecutor(Executor notifyExecutor)
+        {
+            this.notifyExecutor = notifyExecutor;
+        }
+
+        protected WithExecutor(Executor notifyExecutor, FailureHolder initialState)
+        {
+            super(initialState);
+            this.notifyExecutor = notifyExecutor;
+        }
+
+        protected WithExecutor(Executor notifyExecutor, GenericFutureListener<? extends Future<? super V>> listener)
+        {
+            super(listener);
+            this.notifyExecutor = notifyExecutor;
+        }
+
+        @Override
+        public Executor notifyExecutor()
+        {
+            return notifyExecutor;
+        }
+    }
+
+    public AsyncPromise() {}
+
+    AsyncPromise(FailureHolder initialState)
+    {
+        super(initialState);
+    }
+
+    public AsyncPromise(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        super(listener);
+    }
+
+    AsyncPromise(FailureHolder initialState, GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        super(initialState, listener);
+    }
+
+    public static <V> AsyncPromise<V> withExecutor(Executor executor)
+    {
+        return new AsyncPromise.WithExecutor<>(executor);
+    }
+
+    public static <V> AsyncPromise<V> uncancellable()
+    {
+        return new AsyncPromise<>(UNCANCELLABLE);
+    }
+
+    public static <V> AsyncPromise<V> uncancellable(Executor executor)
+    {
+        return new WithExecutor<>(executor, UNCANCELLABLE);
+    }
+
+    public static <V> AsyncPromise<V> uncancellable(GenericFutureListener<? extends Future<? super V>> listener)
+    {
+        return new AsyncPromise<>(UNCANCELLABLE, listener);
+    }
+
+    /**
+     * Complete the promise successfully if not already complete
+     * @throws IllegalStateException if already set
+     */
+    @Override
+    public Promise<V> setSuccess(V v)
+    {
+        if (!trySuccess(v))
+            throw new IllegalStateException("complete already: " + this);
+        return this;
+    }
+
+    /**
+     * Complete the promise successfully if not already complete
+     * @return true iff completed promise
+     */
+    @Override
+    public boolean trySuccess(V v)
+    {
+        return super.trySuccess(v);
+    }
+
+    /**
+     * Complete the promise abnormally if not already complete
+     * @throws IllegalStateException if already set
+     */
+    @Override
+    public Promise<V> setFailure(Throwable throwable)
+    {
+        if (!tryFailure(throwable))
+            throw new IllegalStateException("complete already: " + this);
+        return this;
+    }
+
+    /**
+     * Complete the promise abnormally if not already complete
+     * @return true iff completed promise
+     */
+    @Override
+    public boolean tryFailure(Throwable throwable)
+    {
+        return super.tryFailure(throwable);
+    }
+
+    /**
+     * Prevent a future caller from cancelling this promise
+     * @return true if the promise is now uncancellable (whether or not we did this)
+     */
+    @Override
+    public boolean setUncancellable()
+    {
+        return super.setUncancellable();
+    }
+
+    /**
+     * Prevent a future caller from cancelling this promise
+     * @return true iff this invocation set it to uncancellable, whether or not now uncancellable
+     */
+    @Override
+    public boolean setUncancellableExclusive()
+    {
+        return super.setUncancellableExclusive();
+    }
+
+    @Override
+    public boolean isUncancellable()
+    {
+        return super.isUncancellable();
+    }
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    public Promise<V> sync() throws InterruptedException
+    {
+        super.sync();
+        return this;
+    }
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    public Promise<V> syncUninterruptibly()
+    {
+        super.syncUninterruptibly();
+        return this;
+    }
+
+    @Override
+    public AsyncPromise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener)
+    {
+        super.addListener(listener);
+        return this;
+    }
+
+    @Override
+    public AsyncPromise<V> addListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... listeners)
+    {
+        super.addListeners(listeners);
+        return this;
+    }
+
+    @Override
+    public AsyncPromise<V> removeListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public AsyncPromise<V> removeListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... listeners)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public AsyncPromise<V> addCallback(FutureCallback<? super V> callback)
+    {
+        super.addCallback(callback);
+        return this;
+    }
+
+    @Override
+    public AsyncPromise<V> addCallback(FutureCallback<? super V> callback, Executor executor)
+    {
+        super.addCallback(callback, executor);
+        return this;
+    }
+
+    @Override
+    public AsyncPromise<V> addCallback(Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure)
+    {
+        super.addCallback(onSuccess, onFailure);
+        return this;
+    }
+
+    /**
+     * Wait for this promise to complete
+     * @throws InterruptedException if interrupted
+     */
+    @Override
+    public AsyncPromise<V> await() throws InterruptedException
+    {
+        super.await();
+        return this;
+    }
+
+    /**
+     * Wait uninterruptibly for this promise to complete
+     */
+    @Override
+    public AsyncPromise<V> awaitUninterruptibly()
+    {
+        super.awaitUninterruptibly();
+        return this;
+    }
+
+    /**
+     * Wait for this promise to complete, throwing any interrupt as an UncheckedInterruptedException
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    @Override
+    public AsyncPromise<V> awaitThrowUncheckedOnInterrupt() throws UncheckedInterruptedException
+    {
+        super.awaitThrowUncheckedOnInterrupt();
+        return this;
+    }
+}
+
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Awaitable.java b/src/java/org/apache/cassandra/utils/concurrent/Awaitable.java
new file mode 100644
index 0000000..25bdf02
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/Awaitable.java
@@ -0,0 +1,409 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.Predicate;
+
+import net.nicoulaj.compilecommand.annotations.Inline;
+import org.apache.cassandra.utils.Shared;
+
+import org.apache.cassandra.utils.Intercept;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A generic signal consumer, supporting all of the typical patterns used in Cassandra.
+ * All of the methods defined in {@link Awaitable} may be waited on without a loop,
+ * as this interface declares that there are no spurious wake-ups.
+ */
+@Shared(scope = SIMULATION)
+public interface Awaitable
+{
+    /**
+     * Await until the deadline (in nanoTime), throwing any interrupt.
+     * No spurious wakeups.
+     * @return true if we were signalled, false if the deadline elapsed
+     * @throws InterruptedException if interrupted
+     */
+    boolean awaitUntil(long nanoTimeDeadline) throws InterruptedException;
+
+    /**
+     * Await until the deadline (in nanoTime), throwing any interrupt as an unchecked exception.
+     * No spurious wakeups.
+     * @return true if we were signalled, false if the deadline elapsed
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    boolean awaitUntilThrowUncheckedOnInterrupt(long nanoTimeDeadline) throws UncheckedInterruptedException;
+
+    /**
+     * Await until the deadline (in nanoTime), ignoring interrupts (but maintaining the interrupt flag on exit).
+     * No spurious wakeups.
+     * @return true if we were signalled, false if the deadline elapsed
+     */
+    boolean awaitUntilUninterruptibly(long nanoTimeDeadline);
+
+    /**
+     * Await for the specified period, throwing any interrupt.
+     * No spurious wakeups.
+     * @return true if we were signalled, false if the timeout elapses
+     * @throws InterruptedException if interrupted
+     */
+    boolean await(long time, TimeUnit units) throws InterruptedException;
+
+    /**
+     * Await for the specified period, throwing any interrupt as an unchecked exception.
+     * No spurious wakeups.
+     * @return true if we were signalled, false if the timeout elapses
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    boolean awaitThrowUncheckedOnInterrupt(long time, TimeUnit units) throws UncheckedInterruptedException;
+
+    /**
+     * Await until the deadline (in nanoTime), ignoring interrupts (but maintaining the interrupt flag on exit).
+     * No spurious wakeups.
+     * @return true if we were signalled, false if the timeout elapses
+     */
+    boolean awaitUninterruptibly(long time, TimeUnit units);
+
+    /**
+     * Await indefinitely, throwing any interrupt.
+     * No spurious wakeups.
+     * @throws InterruptedException if interrupted
+     */
+    Awaitable await() throws InterruptedException;
+
+    /**
+     * Await indefinitely, throwing any interrupt as an unchecked exception.
+     * No spurious wakeups.
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    Awaitable awaitThrowUncheckedOnInterrupt() throws UncheckedInterruptedException;
+
+    /**
+     * Await indefinitely, ignoring interrupts (but maintaining the interrupt flag on exit).
+     * No spurious wakeups.
+     */
+    Awaitable awaitUninterruptibly();
+
+    // we must declare the static implementation methods outside of the interface,
+    // so that they can be loaded by different classloaders during simulation
+    class Defaults
+    {
+        public static boolean await(Awaitable await, long time, TimeUnit unit) throws InterruptedException
+        {
+            return await.awaitUntil(nanoTime() + unit.toNanos(time));
+        }
+
+        public static boolean awaitThrowUncheckedOnInterrupt(Awaitable await, long time, TimeUnit units) throws UncheckedInterruptedException
+        {
+            return awaitUntilThrowUncheckedOnInterrupt(await, nanoTime() + units.toNanos(time));
+        }
+
+        public static boolean awaitUninterruptibly(Awaitable await, long time, TimeUnit units)
+        {
+            return awaitUntilUninterruptibly(await, nanoTime() + units.toNanos(time));
+        }
+
+        public static <A extends Awaitable> A awaitThrowUncheckedOnInterrupt(A await) throws UncheckedInterruptedException
+        {
+            try
+            {
+                await.await();
+            }
+            catch (InterruptedException e)
+            {
+                throw new UncheckedInterruptedException();
+            }
+            return await;
+        }
+
+        public static boolean awaitUntilThrowUncheckedOnInterrupt(Awaitable await, long nanoTimeDeadline) throws UncheckedInterruptedException
+        {
+            try
+            {
+                return await.awaitUntil(nanoTimeDeadline);
+            }
+            catch (InterruptedException e)
+            {
+                throw new UncheckedInterruptedException();
+            }
+        }
+
+        /**
+         * {@link Awaitable#awaitUntilUninterruptibly(long)}
+         */
+        public static boolean awaitUntilUninterruptibly(Awaitable await, long nanoTimeDeadline)
+        {
+            boolean interrupted = false;
+            boolean result;
+            while (true)
+            {
+                try
+                {
+                    result = await.awaitUntil(nanoTimeDeadline);
+                    break;
+                }
+                catch (InterruptedException e)
+                {
+                    interrupted = true;
+                }
+            }
+            if (interrupted)
+                Thread.currentThread().interrupt();
+            return result;
+        }
+
+        /**
+         * {@link Awaitable#awaitUninterruptibly()}
+         */
+        public static <A extends Awaitable> A awaitUninterruptibly(A await)
+        {
+            boolean interrupted = false;
+            while (true)
+            {
+                try
+                {
+                    await.await();
+                    break;
+                }
+                catch (InterruptedException e)
+                {
+                    interrupted = true;
+                }
+            }
+            if (interrupted)
+                Thread.currentThread().interrupt();
+            return await;
+        }
+    }
+
+    abstract class AbstractAwaitable implements Awaitable
+    {
+        protected AbstractAwaitable() {}
+
+        /**
+         * {@link Awaitable#await(long, TimeUnit)}
+         */
+        @Override
+        public boolean await(long time, TimeUnit unit) throws InterruptedException
+        {
+            return Defaults.await(this, time, unit);
+        }
+
+        /**
+         * {@link Awaitable#awaitThrowUncheckedOnInterrupt(long, TimeUnit)}
+         */
+        @Override
+        public boolean awaitThrowUncheckedOnInterrupt(long time, TimeUnit units) throws UncheckedInterruptedException
+        {
+            return Defaults.awaitThrowUncheckedOnInterrupt(this, time, units);
+        }
+
+        /**
+         * {@link Awaitable#awaitUninterruptibly(long, TimeUnit)}
+         */
+        public boolean awaitUninterruptibly(long time, TimeUnit units)
+        {
+            return awaitUntilUninterruptibly(nanoTime() + units.toNanos(time));
+        }
+
+        /**
+         * {@link Awaitable#awaitThrowUncheckedOnInterrupt()}
+         */
+        public Awaitable awaitThrowUncheckedOnInterrupt() throws UncheckedInterruptedException
+        {
+            return Defaults.awaitThrowUncheckedOnInterrupt(this);
+        }
+
+        /**
+         * {@link Awaitable#awaitUntilThrowUncheckedOnInterrupt(long)}
+         */
+        public boolean awaitUntilThrowUncheckedOnInterrupt(long nanoTimeDeadline) throws UncheckedInterruptedException
+        {
+            return Defaults.awaitUntilThrowUncheckedOnInterrupt(this, nanoTimeDeadline);
+        }
+
+        /**
+         * {@link Awaitable#awaitUntilUninterruptibly(long)}
+         */
+        public boolean awaitUntilUninterruptibly(long nanoTimeDeadline)
+        {
+            return Defaults.awaitUntilUninterruptibly(this, nanoTimeDeadline);
+        }
+
+        /**
+         * {@link Awaitable#awaitUninterruptibly()}
+         */
+        public Awaitable awaitUninterruptibly()
+        {
+            return Defaults.awaitUninterruptibly(this);
+        }
+    }
+
+    /**
+     * A barebones asynchronous {@link Awaitable}.
+     * If your state is minimal, or can be updated concurrently, extend this class.
+     */
+    abstract class AsyncAwaitable extends AbstractAwaitable
+    {
+        /**
+         * Maintain an internal variable containing a lazily-initialized wait queue
+         * @return null if is done
+         */
+        @Inline
+        private static <A extends Awaitable> WaitQueue.Signal register(AtomicReferenceFieldUpdater<A, WaitQueue> waitingUpdater, Predicate<A> isDone, A awaitable)
+        {
+            if (isDone.test(awaitable))
+                return null;
+
+            WaitQueue waiting = waitingUpdater.get(awaitable);
+            if (waiting == null)
+            {
+                if (!waitingUpdater.compareAndSet(awaitable, null, waiting = newWaitQueue()))
+                {
+                    waiting = waitingUpdater.get(awaitable);
+                    if (waiting == null)
+                    {
+                        assert isDone.test(awaitable);
+                        return null;
+                    }
+                }
+            }
+
+            WaitQueue.Signal s = waiting.register();
+            if (!isDone.test(awaitable))
+                return s;
+
+            s.cancel();
+            return null;
+        }
+
+        @Inline
+        static <A extends Awaitable> A await(AtomicReferenceFieldUpdater<A, WaitQueue> waitingUpdater, Predicate<A> isDone, A awaitable) throws InterruptedException
+        {
+            WaitQueue.Signal s = register(waitingUpdater, isDone, awaitable);
+            if (s != null)
+                s.await();
+            return awaitable;
+        }
+
+        @Inline
+        static <A extends Awaitable> boolean awaitUntil(AtomicReferenceFieldUpdater<A, WaitQueue> waitingUpdater, Predicate<A> isDone, A awaitable, long nanoTimeDeadline) throws InterruptedException
+        {
+            WaitQueue.Signal s = register(waitingUpdater, isDone, awaitable);
+            return s == null || s.awaitUntil(nanoTimeDeadline) || isDone.test(awaitable);
+        }
+
+        @Inline
+        static <A extends Awaitable> void signalAll(AtomicReferenceFieldUpdater<A, WaitQueue> waitingUpdater, A awaitable)
+        {
+            WaitQueue waiting = waitingUpdater.get(awaitable);
+            if (waiting == null)
+                return;
+
+            waiting.signalAll();
+            waitingUpdater.lazySet(awaitable, null);
+        }
+
+        private static final AtomicReferenceFieldUpdater<AsyncAwaitable, WaitQueue> waitingUpdater = AtomicReferenceFieldUpdater.newUpdater(AsyncAwaitable.class, WaitQueue.class, "waiting");
+        private volatile WaitQueue waiting;
+
+        protected AsyncAwaitable() {}
+
+        /**
+         * {@link Awaitable#await()}
+         */
+        public Awaitable await() throws InterruptedException
+        {
+            return await(waitingUpdater, AsyncAwaitable::isSignalled, this);
+        }
+
+        /**
+         * {@link Awaitable#awaitUntil(long)}
+         */
+        public boolean awaitUntil(long nanoTimeDeadline) throws InterruptedException
+        {
+            return awaitUntil(waitingUpdater, AsyncAwaitable::isSignalled, this, nanoTimeDeadline);
+        }
+
+        /**
+         * Signal any waiting threads; {@link #isSignalled()} must return {@code true} before this method is invoked.
+         */
+        protected void signal()
+        {
+            signalAll(waitingUpdater, this);
+        }
+
+        /**
+         * Return true once signalled. Unidirectional; once true, must never again be false.
+         */
+        protected abstract boolean isSignalled();
+    }
+
+    /**
+     * A barebones {@link Awaitable} that uses mutual exclusion.
+     * If your state will be updated while holding the object monitor, extend this class.
+     */
+    abstract class SyncAwaitable extends AbstractAwaitable
+    {
+        protected SyncAwaitable() {}
+
+        /**
+         * {@link Awaitable#await()}
+         */
+        public synchronized Awaitable await() throws InterruptedException
+        {
+            while (!isSignalled())
+                wait();
+            return this;
+        }
+
+        /**
+         * {@link Awaitable#awaitUntil(long)}
+         */
+        public synchronized boolean awaitUntil(long nanoTimeDeadline) throws InterruptedException
+        {
+            while (true)
+            {
+                if (isSignalled()) return true;
+                if (!waitUntil(this, nanoTimeDeadline)) return false;
+            }
+        }
+
+        /**
+         * Return true once signalled. Unidirectional; once true, must never again be false.
+         */
+        protected abstract boolean isSignalled();
+
+        @Intercept
+        public static boolean waitUntil(Object monitor, long deadlineNanos) throws InterruptedException
+        {
+            long wait = deadlineNanos - nanoTime();
+            if (wait <= 0)
+                return false;
+
+            monitor.wait((wait + 999999) / 1000000);
+            return true;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Blocker.java b/src/java/org/apache/cassandra/utils/concurrent/Blocker.java
deleted file mode 100644
index 5192e98..0000000
--- a/src/java/org/apache/cassandra/utils/concurrent/Blocker.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*    http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-package org.apache.cassandra.utils.concurrent;
-
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.locks.ReentrantLock;
-
-public class Blocker
-{
-    private final ReentrantLock lock = new ReentrantLock();
-    private final Condition unblocked = lock.newCondition();
-    private volatile boolean block = false;
-
-    public void block(boolean block)
-    {
-        this.block = block;
-        if (!block)
-        {
-            lock.lock();
-            try
-            {
-                unblocked.signalAll();
-            }
-            finally
-            {
-                lock.unlock();
-            }
-        }
-    }
-
-    public void ask()
-    {
-        if (block)
-        {
-            lock.lock();
-            try
-            {
-                while (block)
-                    unblocked.awaitUninterruptibly();
-            }
-            finally
-            {
-                lock.unlock();
-            }
-        }
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/BlockingQueues.java b/src/java/org/apache/cassandra/utils/concurrent/BlockingQueues.java
new file mode 100644
index 0000000..4d79ed3
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/BlockingQueues.java
@@ -0,0 +1,253 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.Queue;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue; // checkstyle: permit this import
+import java.util.concurrent.SynchronousQueue; // checkstyle: permit this import
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.utils.Intercept;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.concurrent.Awaitable.SyncAwaitable.waitUntil;
+
+public class BlockingQueues
+{
+    @Intercept
+    public static <T> BlockingQueue<T> newBlockingQueue()
+    {
+        return new LinkedBlockingQueue<>();
+    }
+
+    @Intercept
+    public static <T> BlockingQueue<T> newBlockingQueue(int capacity)
+    {
+        return capacity == 0 ? new SynchronousQueue<>()
+                             : new LinkedBlockingQueue<>(capacity);
+    }
+
+    public static class Sync<T> implements BlockingQueue<T>
+    {
+        final int capacity;
+        final Queue<T> wrapped;
+        public Sync(int capacity, Queue<T> wrapped)
+        {
+            this.capacity = capacity;
+            this.wrapped = wrapped;
+        }
+
+        public synchronized boolean add(T t)
+        {
+            if (!wrapped.add(t))
+                throw new IllegalStateException();
+            notify();
+            return true;
+        }
+
+        public synchronized boolean offer(T t)
+        {
+            if (wrapped.size() == capacity)
+                return false;
+            return add(t);
+        }
+
+        public synchronized T remove()
+        {
+            return poll();
+        }
+
+        public synchronized T poll()
+        {
+            if (wrapped.size() == capacity)
+                notify();
+
+            return wrapped.poll();
+        }
+
+        public synchronized T element()
+        {
+            return wrapped.element();
+        }
+
+        public synchronized T peek()
+        {
+            return wrapped.peek();
+        }
+
+        public synchronized void put(T t) throws InterruptedException
+        {
+            while (!offer(t))
+                wait();
+        }
+
+        public synchronized boolean offer(T t, long timeout, TimeUnit unit) throws InterruptedException
+        {
+            if (offer(t))
+                return true;
+
+            long deadline = nanoTime() + unit.toNanos(timeout);
+            while (true)
+            {
+                if (offer(t))
+                    return true;
+
+                if (!waitUntil(this, deadline))
+                    return false;
+            }
+        }
+
+        public synchronized T take() throws InterruptedException
+        {
+            T result;
+            while (null == (result = poll()))
+                wait();
+
+            return result;
+        }
+
+        public synchronized T poll(long timeout, TimeUnit unit) throws InterruptedException
+        {
+            T result = poll();
+            if (result != null)
+                return result;
+
+            long deadline = nanoTime() + unit.toNanos(timeout);
+            while (null == (result = poll()))
+            {
+                if (!waitUntil(this, deadline))
+                    return null;
+            }
+            return result;
+        }
+
+        public synchronized int remainingCapacity()
+        {
+            return capacity - wrapped.size();
+        }
+
+        public synchronized boolean remove(Object o)
+        {
+            if (!wrapped.remove(o))
+                return false;
+            if (wrapped.size() == capacity - 1)
+                notify();
+            return true;
+        }
+
+        public synchronized boolean containsAll(Collection<?> c)
+        {
+            return wrapped.containsAll(c);
+        }
+
+        public synchronized boolean addAll(Collection<? extends T> c)
+        {
+            c.forEach(this::add);
+            return true;
+        }
+
+        public synchronized boolean removeAll(Collection<?> c)
+        {
+            boolean result = wrapped.removeAll(c);
+            notifyAll();
+            return result;
+        }
+
+        public synchronized boolean retainAll(Collection<?> c)
+        {
+            boolean result = wrapped.retainAll(c);
+            notifyAll();
+            return result;
+        }
+
+        public synchronized void clear()
+        {
+            wrapped.clear();
+            notifyAll();
+        }
+
+        public synchronized int size()
+        {
+            return wrapped.size();
+        }
+
+        public synchronized boolean isEmpty()
+        {
+            return wrapped.isEmpty();
+        }
+
+        public synchronized boolean contains(Object o)
+        {
+            return wrapped.contains(o);
+        }
+
+        public synchronized Iterator<T> iterator()
+        {
+            Iterator<T> iter = wrapped.iterator();
+            return new Iterator<T>()
+            {
+                public boolean hasNext()
+                {
+                    synchronized (Sync.this)
+                    {
+                        return iter.hasNext();
+                    }
+                }
+
+                public T next()
+                {
+                    synchronized (Sync.this)
+                    {
+                        return iter.next();
+                    }
+                }
+            };
+        }
+
+        public synchronized Object[] toArray()
+        {
+            return wrapped.toArray();
+        }
+
+        public synchronized <T1> T1[] toArray(T1[] a)
+        {
+            return wrapped.toArray(a);
+        }
+
+        public synchronized int drainTo(Collection<? super T> c)
+        {
+            return drainTo(c, Integer.MAX_VALUE);
+        }
+
+        public synchronized int drainTo(Collection<? super T> c, int maxElements)
+        {
+            int count = 0;
+            while (count < maxElements && !isEmpty())
+            {
+                c.add(poll());
+                ++count;
+            }
+
+            return count;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Condition.java b/src/java/org/apache/cassandra/utils/concurrent/Condition.java
new file mode 100644
index 0000000..eb97848
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/Condition.java
@@ -0,0 +1,104 @@
+/*
+ * 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.utils.concurrent;
+
+import org.apache.cassandra.utils.Intercept;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Simpler API than java.util.concurrent.Condition; would be nice to extend it, but also nice
+ * to share API with Future, for which Netty's API is incompatible with java.util.concurrent.Condition
+ *
+ * {@link Awaitable} for explicit external signals.
+ */
+@Shared(scope = SIMULATION)
+public interface Condition extends Awaitable
+{
+    /**
+     * Returns true once signalled. Unidirectional; once true, will never again be false.
+     */
+    boolean isSignalled();
+
+    /**
+     * Signal the condition as met, and wake all waiting threads.
+     */
+    void signal();
+
+    /**
+     * Signal the condition as met, and wake all waiting threads.
+     */
+    default void signalAll() { signal(); }
+
+    /**
+     * Factory method used to capture and redirect instantiations for simulation
+     */
+    @Intercept
+    static Condition newOneTimeCondition()
+    {
+        return new Async();
+    }
+
+    /**
+     * An asynchronous {@link Condition}. Typically lower overhead than {@link Sync}.
+     */
+    public static class Async extends AsyncAwaitable implements Condition
+    {
+        private volatile boolean signaled = false;
+
+        // WARNING: if extending this class, consider simulator interactions
+        protected Async() {}
+
+        public boolean isSignalled()
+        {
+            return signaled;
+        }
+
+        public void signal()
+        {
+            signaled = true;
+            super.signal();
+        }
+    }
+
+    /**
+     * A {@link Condition} based on its object monitor.
+     * WARNING: lengthy operations performed while holding the lock may prevent timely notification of waiting threads
+     * that a deadline has passed.
+     */
+    public static class Sync extends SyncAwaitable implements Condition
+    {
+        private boolean signaled = false;
+
+        // this can be instantiated directly, as we intercept monitors directly with byte weaving
+        public Sync() {}
+
+        public synchronized boolean isSignalled()
+        {
+            return signaled;
+        }
+
+        public synchronized void signal()
+        {
+            signaled = true;
+            notifyAll();
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/ConditionAsConsumer.java b/src/java/org/apache/cassandra/utils/concurrent/ConditionAsConsumer.java
new file mode 100644
index 0000000..985daf7
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/ConditionAsConsumer.java
@@ -0,0 +1,34 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.function.Consumer;
+
+public interface ConditionAsConsumer<T> extends Condition, Consumer<T>
+{
+    @Override
+    default void accept(T t) { signal(); }
+
+    public static class Async<T> extends Condition.Async implements ConditionAsConsumer<T> { }
+
+    public static <T> ConditionAsConsumer<T> newConditionAsConsumer()
+    {
+        return new Async<T>();
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/CountDownLatch.java b/src/java/org/apache/cassandra/utils/concurrent/CountDownLatch.java
new file mode 100644
index 0000000..976abb7
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/CountDownLatch.java
@@ -0,0 +1,111 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+
+import org.apache.cassandra.utils.Intercept;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface CountDownLatch extends Awaitable
+{
+    /**
+     * Count down by 1, signalling waiters if we have reached zero
+     */
+    void decrement();
+
+    /**
+     * @return the current count
+     */
+    int count();
+
+    /**
+     * Factory method used to capture and redirect instantiations for simulation
+     */
+    @Intercept
+    static CountDownLatch newCountDownLatch(int count)
+    {
+        return new Async(count);
+    }
+
+    static class Async extends AsyncAwaitable implements CountDownLatch
+    {
+        private static final AtomicIntegerFieldUpdater<CountDownLatch.Async> countUpdater = AtomicIntegerFieldUpdater.newUpdater(CountDownLatch.Async.class, "count");
+        private volatile int count;
+
+        // WARNING: if extending this class, consider simulator interactions
+        protected Async(int count)
+        {
+            this.count = count;
+            if (count == 0)
+                signal();
+        }
+
+        public void decrement()
+        {
+            if (countUpdater.decrementAndGet(this) == 0)
+                signal();
+        }
+
+        public int count()
+        {
+            return count;
+        }
+
+        @Override
+        protected boolean isSignalled()
+        {
+            return count <= 0;
+        }
+    }
+
+    static final class Sync extends SyncAwaitable implements CountDownLatch
+    {
+        private int count;
+
+        public Sync(int count)
+        {
+            this.count = count;
+        }
+
+        public synchronized void decrement()
+        {
+            if (count > 0 && --count == 0)
+                notifyAll();
+        }
+
+        public synchronized int count()
+        {
+            return count;
+        }
+
+        /**
+         * not synchronized as only intended for internal usage by externally synchronized methods
+         */
+
+        @Override
+        protected boolean isSignalled()
+        {
+            return count <= 0;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Future.java b/src/java/org/apache/cassandra/utils/concurrent/Future.java
new file mode 100644
index 0000000..fae5d43
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/Future.java
@@ -0,0 +1,202 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.Executor;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
+
+import io.netty.util.concurrent.GenericFutureListener;
+
+import io.netty.util.internal.PlatformDependent;
+import org.apache.cassandra.utils.Shared;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A Future that integrates several different (but equivalent) APIs used within Cassandra into a single concept,
+ * integrating also with our {@link Awaitable} abstraction, to overall improve coherency and clarity in the codebase.
+ */
+@Shared(scope = SIMULATION, ancestors = INTERFACES)
+public interface Future<V> extends io.netty.util.concurrent.Future<V>, ListenableFuture<V>, Awaitable
+{
+    /**
+     * Wait indefinitely for this future to complete, throwing any interrupt
+     * @throws InterruptedException if interrupted
+     */
+    @Override
+    Future<V> await() throws InterruptedException;
+
+    /**
+     * Wait indefinitely for this future to complete
+     */
+    @Override
+    Future<V> awaitUninterruptibly();
+
+    /**
+     * Wait indefinitely for this promise to complete, throwing any interrupt as an UncheckedInterruptedException
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    @Override
+    Future<V> awaitThrowUncheckedOnInterrupt();
+
+    default void rethrowIfFailed()
+    {
+        Throwable cause = this.cause();
+        if (cause != null)
+        {
+            PlatformDependent.throwException(cause);
+        }
+    }
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    default Future<V> sync() throws InterruptedException
+    {
+        await();
+        rethrowIfFailed();
+        return this;
+    }
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    default Future<V> syncUninterruptibly()
+    {
+        awaitUninterruptibly();
+        rethrowIfFailed();
+        return this;
+    }
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    default Future<V> syncThrowUncheckedOnInterrupt()
+    {
+        awaitThrowUncheckedOnInterrupt();
+        rethrowIfFailed();
+        return this;
+    }
+
+    @Deprecated
+    @Override
+    default boolean await(long l) throws InterruptedException
+    {
+        return await(l, MILLISECONDS);
+    }
+
+    @Deprecated
+    @Override
+    default boolean awaitUninterruptibly(long l)
+    {
+        return awaitUninterruptibly(l, MILLISECONDS);
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     */
+    Future<V> addCallback(BiConsumer<? super V, Throwable> callback);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     */
+    Future<V> addCallback(BiConsumer<? super V, Throwable> callback, Executor executor);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     */
+    Future<V> addCallback(FutureCallback<? super V> callback);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     */
+    Future<V> addCallback(FutureCallback<? super V> callback, Executor executor);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     */
+    Future<V> addCallback(Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#addCallback} natively
+     */
+    Future<V> addCallback(Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure, Executor executor);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transform(ListenableFuture, com.google.common.base.Function, Executor)} natively
+     */
+    default <T> Future<T> map(Function<? super V, ? extends T> mapper)
+    {
+        return map(mapper, null);
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transform(ListenableFuture, com.google.common.base.Function, Executor)} natively
+     */
+    <T> Future<T> map(Function<? super V, ? extends T> mapper, Executor executor);
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transformAsync(ListenableFuture, AsyncFunction, Executor)} natively
+     */
+    default <T> Future<T> flatMap(Function<? super V, ? extends Future<T>> flatMapper)
+    {
+        return flatMap(flatMapper, null);
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transformAsync(ListenableFuture, AsyncFunction, Executor)} natively
+     */
+    <T> Future<T> flatMap(Function<? super V, ? extends Future<T>> flatMapper, Executor executor);
+
+    /**
+     * Invoke {@code runnable} on completion, using {@code executor}.
+     *
+     * Tasks are submitted to their executors in the order they were added to this Future.
+     */
+    @Override
+    void addListener(Runnable runnable, Executor executor);
+
+    /**
+     * Invoke {@code runnable} on completion. Depending on the implementation and its configuration, this
+     * may be executed immediately by the notifying/completing thread, or asynchronously by an executor.
+     * Tasks are executed, or submitted to the executor, in the order they were added to this Future.
+     */
+    void addListener(Runnable runnable);
+
+    Executor notifyExecutor();
+
+    @Override Future<V> addListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> genericFutureListener);
+    @Override Future<V> addListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... genericFutureListeners);
+    @Override Future<V> removeListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> genericFutureListener);
+    @Override Future<V> removeListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... genericFutureListeners);
+}
+
diff --git a/src/java/org/apache/cassandra/utils/concurrent/FutureCombiner.java b/src/java/org/apache/cassandra/utils/concurrent/FutureCombiner.java
new file mode 100644
index 0000000..e47feff
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/FutureCombiner.java
@@ -0,0 +1,262 @@
+/*
+ * 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.utils.concurrent;
+
+import io.netty.util.concurrent.GenericFutureListener;
+import io.netty.util.concurrent.GlobalEventExecutor;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import com.google.common.base.Preconditions;
+
+/**
+ * Netty's PromiseCombiner is not threadsafe, and we combine futures from multiple event executors.
+ *
+ * This class groups a number of Future into a single logical Future, by registering a listener to each that
+ * decrements a shared counter; if any of them fail, the FutureCombiner is completed with the first cause,
+ * but in all scenario only completes when all underlying future have completed (exceptionally or otherwise)
+ *
+ * This Future is always uncancellable.
+ *
+ * We extend AsyncFuture, and simply provide it an uncancellable Promise that will be completed by the listeners
+ * registered to the input futures.
+ */
+public class FutureCombiner<T> extends AsyncFuture<T>
+{
+    private interface ListenerFactory<T>
+    {
+        Listener<T> create(int count, Supplier<T> onSuccess, FutureCombiner<T> complete);
+    }
+
+    /**
+     * Tracks completion; once all futures have completed, invokes {@link Listener#complete#trySuccess(Object)} with {@link Listener#onSuccess}.
+     * Never invokes failure on {@link Listener#complete}.
+     */
+    private static class Listener<T> extends AtomicInteger implements GenericFutureListener<io.netty.util.concurrent.Future<Object>>
+    {
+        Supplier<T> onSuccess; // non-final so we can release resources immediately when failing fast
+        final FutureCombiner<T> complete;
+
+        Listener(int count, Supplier<T> onSuccess, FutureCombiner<T> complete)
+        {
+            super(count);
+            Preconditions.checkNotNull(onSuccess);
+            this.onSuccess = onSuccess;
+            this.complete = complete;
+        }
+
+        @Override
+        public void operationComplete(io.netty.util.concurrent.Future<Object> result)
+        {
+            if (0 == decrementAndGet())
+                onCompletion();
+        }
+
+        void onCompletion()
+        {
+            complete.trySuccess(onSuccess.get());
+            onSuccess = null;
+        }
+    }
+
+    /**
+     * Tracks completion; once all futures have completed, invokes {@link Listener#complete#trySuccess(Object)} with {@link Listener#onSuccess}.
+     * If any future fails, immediately propagates this failure and releases associated resources.
+     */
+    private static class FailFastListener<T> extends Listener<T>
+    {
+        FailFastListener(int count, Supplier<T> onSuccess, FutureCombiner<T> complete)
+        {
+            super(count, onSuccess, complete);
+        }
+
+        @Override
+        public void operationComplete(io.netty.util.concurrent.Future<Object> result)
+        {
+            if (!result.isSuccess())
+            {
+                onSuccess = null;
+                complete.tryFailure(result.cause());
+            }
+            else
+            {
+                super.operationComplete(result);
+            }
+        }
+    }
+
+    /**
+     * Tracks completion; once all futures have completed, invokes {@link Listener#complete#trySuccess(Object)} with {@link Listener#onSuccess}.
+     * If any future fails we propagate this failure, but only once all have completed.
+     */
+    private static class FailSlowListener<T> extends Listener<T>
+    {
+        private static final AtomicReferenceFieldUpdater<FailSlowListener, Throwable> firstCauseUpdater =
+        AtomicReferenceFieldUpdater.newUpdater(FailSlowListener.class, Throwable.class, "firstCause");
+
+        private volatile Throwable firstCause;
+
+        FailSlowListener(int count, Supplier<T> onSuccess, FutureCombiner<T> complete)
+        {
+            super(count, onSuccess, complete);
+        }
+
+        @Override
+        void onCompletion()
+        {
+            if (onSuccess == null)
+                complete.tryFailure(firstCause);
+            else
+                super.onCompletion();
+        }
+
+        @Override
+        public void operationComplete(io.netty.util.concurrent.Future<Object> result)
+        {
+            if (!result.isSuccess())
+            {
+                onSuccess = null;
+                firstCauseUpdater.compareAndSet(FailSlowListener.this, null, result.cause());
+            }
+
+            super.operationComplete(result);
+        }
+    }
+
+    private volatile Collection<? extends io.netty.util.concurrent.Future<?>> propagateCancellation;
+
+    private FutureCombiner(Collection<? extends io.netty.util.concurrent.Future<?>> combine, Supplier<T> resultSupplier, ListenerFactory<T> listenerFactory)
+    {
+        if (combine.isEmpty())
+        {
+            trySuccess(null);
+        }
+        else
+        {
+            Listener<T> listener = listenerFactory.create(combine.size(), resultSupplier, this);
+            combine.forEach(f -> {
+                if (f.isDone()) listener.operationComplete((io.netty.util.concurrent.Future<Object>) f);
+                else f.addListener(listener);
+            });
+        }
+    }
+
+    @Override
+    protected boolean setUncancellable()
+    {
+        if (!super.setUncancellable())
+            return false;
+        propagateCancellation = null;
+        return true;
+    }
+
+    @Override
+    protected boolean setUncancellableExclusive()
+    {
+        if (!super.setUncancellableExclusive())
+            return false;
+        propagateCancellation = null;
+        return true;
+    }
+
+    @Override
+    protected boolean trySuccess(T t)
+    {
+        if (!super.trySuccess(t))
+            return false;
+        propagateCancellation = null;
+        return true;
+    }
+
+    @Override
+    protected boolean tryFailure(Throwable throwable)
+    {
+        if (!super.tryFailure(throwable))
+            return false;
+        propagateCancellation = null;
+        return true;
+    }
+
+    @Override
+    public boolean cancel(boolean b)
+    {
+        if (!super.cancel(b))
+            return false;
+        Collection<? extends io.netty.util.concurrent.Future<?>> propagate = propagateCancellation;
+        propagateCancellation = null;
+        if (propagate != null)
+            propagate.forEach(f -> f.cancel(b));
+        return true;
+    }
+
+    /**
+     * Waits for all of {@code futures} to complete, only propagating failures on completion
+     */
+    public static FutureCombiner<Void> nettySuccessListener(Collection<? extends io.netty.util.concurrent.Future<?>> futures)
+    {
+        return new FutureCombiner<Void>(futures, () -> null, FailSlowListener::new)
+        {
+            @Override
+            public Executor notifyExecutor()
+            {
+                return GlobalEventExecutor.INSTANCE;
+            }
+        };
+    }
+
+    /**
+     * Waits only until the first failure, or until all have succeeded.
+     * Returns a list of results if successful; an exception if any failed.
+     *
+     * @param futures futures to wait for completion of
+     * @return a Future containing all results of {@code futures}
+     */
+    public static <V> Future<List<V>> allOf(Collection<? extends io.netty.util.concurrent.Future<? extends V>> futures)
+    {
+        if (futures.isEmpty())
+            return ImmediateFuture.success(Collections.emptyList());
+
+        return new FutureCombiner<>(futures, () -> futures.stream().map(f -> f.getNow()).collect(Collectors.toList()), FailFastListener::new);
+    }
+
+    /**
+     * Waits for all futures to complete, returning a list containing values of all successful input futures. This
+     * emulates Guava's Futures::successfulAsList in that results will be in the same order as inputs and any
+     * non-success value (e.g. failure or cancellation) will be replaced by null.
+     * @param futures futures to wait for completion of
+     * @return a Future containing all successful results of {@code futures} and nulls for non-successful futures
+     */
+    public static <V> Future<List<V>> successfulOf(List<? extends io.netty.util.concurrent.Future<V>> futures)
+    {
+        if (futures.isEmpty())
+            return ImmediateFuture.success(Collections.emptyList());
+
+        return new FutureCombiner<>(futures,
+                                    () -> futures.stream()
+                                                 .map(f -> f.isSuccess() ? f.getNow() : null)
+                                                 .collect(Collectors.toList()),
+                                    Listener::new);
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/ImmediateFuture.java b/src/java/org/apache/cassandra/utils/concurrent/ImmediateFuture.java
new file mode 100644
index 0000000..159d580
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/ImmediateFuture.java
@@ -0,0 +1,52 @@
+/*
+ * 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.utils.concurrent;
+
+public class ImmediateFuture<V> extends AsyncFuture<V>
+{
+    private ImmediateFuture(V value)
+    {
+        super(value);
+    }
+
+    private ImmediateFuture(Throwable cause)
+    {
+        super(cause);
+    }
+
+    private ImmediateFuture(FailureHolder failure)
+    {
+        super(failure);
+    }
+
+    public static <V> ImmediateFuture<V> success(V value)
+    {
+        return new ImmediateFuture<>(value);
+    }
+
+    public static <V> ImmediateFuture<V> failure(Throwable cause)
+    {
+        return new ImmediateFuture<>(cause);
+    }
+
+    public static <V> ImmediateFuture<V> cancelled()
+    {
+        return new ImmediateFuture<>(CANCELLED);
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/IntervalLock.java b/src/java/org/apache/cassandra/utils/concurrent/IntervalLock.java
deleted file mode 100644
index 382a2dc..0000000
--- a/src/java/org/apache/cassandra/utils/concurrent/IntervalLock.java
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils.concurrent;
-
-import java.util.concurrent.atomic.AtomicLong;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import org.apache.cassandra.utils.TimeSource;
-
-/**
- * This class extends ReentrantReadWriteLock to provide a write lock that can only be acquired at provided intervals.
- */
-public class IntervalLock extends ReentrantReadWriteLock
-{
-    private final AtomicLong lastAcquire = new AtomicLong();
-    private final TimeSource timeSource;
-
-    public IntervalLock(TimeSource timeSource)
-    {
-        this.timeSource = timeSource;
-    }
-
-    /**
-     * Try acquiring a write lock if the given interval is passed since the last call to this method.
-     *
-     * @param interval In millis.
-     * @return True if acquired and locked, false otherwise.
-     */
-    public boolean tryIntervalLock(long interval)
-    {
-        long now = timeSource.currentTimeMillis();
-        boolean acquired = (now - lastAcquire.get() >= interval) && writeLock().tryLock();
-        if (acquired)
-            lastAcquire.set(now);
-
-        return acquired;
-    }
-
-    /**
-     * Release the last acquired interval lock.
-     */
-    public void releaseIntervalLock()
-    {
-        writeLock().unlock();
-    }
-
-    @VisibleForTesting
-    public long getLastIntervalAcquire()
-    {
-        return lastAcquire.get();
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/IntrusiveStack.java b/src/java/org/apache/cassandra/utils/concurrent/IntrusiveStack.java
new file mode 100644
index 0000000..e61d565
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/IntrusiveStack.java
@@ -0,0 +1,205 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.Iterator;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import net.nicoulaj.compilecommand.annotations.Inline;
+import org.apache.cassandra.utils.LongAccumulator;
+
+/**
+ * An efficient stack/list that is expected to be ordinarily either empty or close to, and for which
+ * we need concurrent insertions and do not need to support removal - i.e. the list is semi immutable.
+ *
+ * This is an intrusive stack, and for simplicity we treat all
+ *
+ * @param <T>
+ */
+public class IntrusiveStack<T extends IntrusiveStack<T>> implements Iterable<T>
+{
+    static class Itr<T extends IntrusiveStack<T>> implements Iterator<T>
+    {
+        private T next;
+
+        Itr(T next)
+        {
+            this.next = next;
+        }
+
+        @Override
+        public boolean hasNext()
+        {
+            return next != null;
+        }
+
+        @Override
+        public T next()
+        {
+            T result = next;
+            next = result.next;
+            return result;
+        }
+    }
+
+    T next;
+
+    @Inline
+    protected static <O, T extends IntrusiveStack<T>> T push(AtomicReferenceFieldUpdater<? super O, T> headUpdater, O owner, T prepend)
+    {
+        return push(headUpdater, owner, prepend, (prev, next) -> {
+            next.next = prev;
+            return next;
+        });
+    }
+
+    protected static <O, T extends IntrusiveStack<T>> T push(AtomicReferenceFieldUpdater<O, T> headUpdater, O owner, T prepend, BiFunction<T, T, T> combine)
+    {
+        while (true)
+        {
+            T head = headUpdater.get(owner);
+            if (headUpdater.compareAndSet(owner, head, combine.apply(head, prepend)))
+                return head;
+        }
+    }
+
+    protected interface Setter<O, T>
+    {
+        public boolean compareAndSet(O owner, T expect, T update);
+    }
+
+    @Inline
+    protected static <O, T extends IntrusiveStack<T>> T push(Function<O, T> getter, Setter<O, T> setter, O owner, T prepend)
+    {
+        return push(getter, setter, owner, prepend, (prev, next) -> {
+            next.next = prev;
+            return next;
+        });
+    }
+
+    protected static <O, T extends IntrusiveStack<T>> T push(Function<O, T> getter, Setter<O, T> setter, O owner, T prepend, BiFunction<T, T, T> combine)
+    {
+        while (true)
+        {
+            T head = getter.apply(owner);
+            if (setter.compareAndSet(owner, head, combine.apply(head, prepend)))
+                return head;
+        }
+    }
+
+    protected static <O, T extends IntrusiveStack<T>> void pushExclusive(AtomicReferenceFieldUpdater<O, T> headUpdater, O owner, T prepend, BiFunction<T, T, T> combine)
+    {
+        T head = headUpdater.get(owner);
+        headUpdater.lazySet(owner, combine.apply(head, prepend));
+    }
+
+    protected static <T extends IntrusiveStack<T>, O> void pushExclusive(AtomicReferenceFieldUpdater<O, T> headUpdater, O owner, T prepend)
+    {
+        prepend.next = headUpdater.get(owner);
+        headUpdater.lazySet(owner, prepend);
+    }
+
+    protected static <T extends IntrusiveStack<T>> T pushExclusive(T head, T prepend)
+    {
+        prepend.next = head;
+        return prepend;
+    }
+
+    protected static <T extends IntrusiveStack<T>, O> Iterable<T> iterable(AtomicReferenceFieldUpdater<O, T> headUpdater, O owner)
+    {
+        return iterable(headUpdater.get(owner));
+    }
+
+    protected static <T extends IntrusiveStack<T>> Iterable<T> iterable(T list)
+    {
+        return list == null ? () -> iterator(null) : list;
+    }
+
+    protected static <T extends IntrusiveStack<T>> Iterator<T> iterator(T list)
+    {
+        return new Itr<>(list);
+    }
+
+    protected static int size(IntrusiveStack<?> list)
+    {
+        int size = 0;
+        while (list != null)
+        {
+            ++size;
+            list = list.next;
+        }
+        return size;
+    }
+
+    protected static <T extends IntrusiveStack<T>> long accumulate(T list, LongAccumulator<T> accumulator, long initialValue)
+    {
+        long value = initialValue;
+        while (list != null)
+        {
+            value = accumulator.apply(list, initialValue);
+            list = list.next;
+        }
+        return value;
+    }
+
+    // requires exclusive ownership (incl. with readers)
+    protected T reverse()
+    {
+        return reverse((T) this);
+    }
+
+    // requires exclusive ownership (incl. with readers)
+    protected static <T extends IntrusiveStack<T>> T reverse(T list)
+    {
+        T prev = null;
+        T cur = list;
+        while (cur != null)
+        {
+            T next = cur.next;
+            cur.next = prev;
+            prev = cur;
+            cur = next;
+        }
+        return prev;
+    }
+
+    @Override
+    public void forEach(Consumer<? super T> forEach)
+    {
+        forEach((T)this, forEach);
+    }
+
+    protected static <T extends IntrusiveStack<T>> void forEach(T list, Consumer<? super T> forEach)
+    {
+        while (list != null)
+        {
+            forEach.accept(list);
+            list = list.next;
+        }
+    }
+
+    @Override
+    public Iterator<T> iterator()
+    {
+        return new Itr<>((T) this);
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/ListenerList.java b/src/java/org/apache/cassandra/utils/concurrent/ListenerList.java
new file mode 100644
index 0000000..40b908b
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/ListenerList.java
@@ -0,0 +1,373 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import javax.annotation.Nullable;
+
+import com.google.common.util.concurrent.FutureCallback;
+
+import io.netty.util.concurrent.EventExecutor;
+import io.netty.util.concurrent.GenericFutureListener;
+import net.nicoulaj.compilecommand.annotations.Inline;
+import org.apache.cassandra.concurrent.ExecutionFailure;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
+
+import static org.apache.cassandra.utils.concurrent.ListenerList.Notifying.NOTIFYING;
+
+/**
+ * Encapsulate one or more items in a linked-list that is immutable whilst shared, forming a prepend-only list (or stack).
+ * Once the list is ready to consume, exclusive ownership is taken by clearing the shared variable containing it, after
+ * which the list may be invoked using {@link #notifyExclusive(ListenerList, Future)}, which reverses the list before invoking the work it contains.
+ */
+abstract class ListenerList<V> extends IntrusiveStack<ListenerList<V>>
+{
+    abstract void notifySelf(Executor notifyExecutor, Future<V> future);
+
+    static ListenerList pushHead(ListenerList prev, ListenerList next)
+    {
+        if (prev instanceof Notifying<?>)
+        {
+            Notifying result = new Notifying();
+            result.next = next;
+            next.next = prev == NOTIFYING ? null : prev;
+            return result;
+        }
+        next.next = prev;
+        return next;
+    }
+
+    /**
+     * Logically append {@code newListener} to {@link #listeners}
+     * (at this stage it is a stack, so we actually prepend)
+     *
+     * @param newListener must be either a {@link ListenerList} or {@link GenericFutureListener}
+     */
+    @Inline
+    static <T> void push(AtomicReferenceFieldUpdater<? super T, ListenerList> updater, T in, ListenerList newListener)
+    {
+        IntrusiveStack.push(updater, in, newListener, ListenerList::pushHead);
+    }
+
+    /**
+     * Logically append {@code newListener} to {@link #listeners}
+     * (at this stage it is a stack, so we actually prepend)
+     *
+     * @param newListener must be either a {@link ListenerList} or {@link GenericFutureListener}
+     */
+    @Inline
+    static <T> void pushExclusive(AtomicReferenceFieldUpdater<? super T, ListenerList> updater, T in, ListenerList newListener)
+    {
+        IntrusiveStack.pushExclusive(updater, in, newListener, ListenerList::pushHead);
+    }
+
+    static <V, T extends Future<V>> void notify(AtomicReferenceFieldUpdater<? super T, ListenerList> updater, T in)
+    {
+        while (true)
+        {
+            ListenerList<V> listeners = updater.get(in);
+            if (listeners == null || listeners instanceof Notifying)
+                return; // either no listeners, or we are already notifying listeners, so we'll get to the new one when ready
+
+            if (updater.compareAndSet(in, listeners, NOTIFYING))
+            {
+                while (true)
+                {
+                    notifyExclusive(listeners, in);
+                    if (updater.compareAndSet(in, NOTIFYING, null))
+                        return;
+
+                    listeners = updater.getAndSet(in, NOTIFYING);
+                }
+            }
+        }
+    }
+
+    /**
+     * Requires exclusive ownership of {@code head}.
+     *
+     * Task submission occurs in the order the operations were submitted; if all of the executors
+     * are immediate or unspecified this guarantees execution order.
+     * Tasks are submitted to the executor individually, as this simplifies semantics and
+     * we anticipate few listeners in practice, and even fewer with indirect executors.
+     *
+     * @param head must be either a {@link ListenerList} or {@link GenericFutureListener}
+     */
+    static <T> void notifyExclusive(ListenerList<T> head, Future<T> future)
+    {
+        Executor notifyExecutor; {
+            Executor exec = future.notifyExecutor();
+            notifyExecutor = inExecutor(exec) ? null : exec;
+        }
+
+        head = reverse(head);
+        forEach(head, i -> i.notifySelf(notifyExecutor, future));
+    }
+
+    /**
+     * Notify {@code listener} on the invoking thread, handling any exceptions
+     */
+    static <F extends io.netty.util.concurrent.Future<?>> void notifyListener(GenericFutureListener<F> listener, F future)
+    {
+        try
+        {
+            listener.operationComplete(future);
+        }
+        catch (Throwable t)
+        {
+            // TODO: suboptimal package interdependency - move FutureTask etc here?
+            ExecutionFailure.handle(t);
+        }
+    }
+
+    /**
+     * Notify {@code listener} using {@code notifyExecutor} if set, and handling exceptions otherwise
+     */
+    static <F extends io.netty.util.concurrent.Future<?>> void notifyListener(Executor notifyExecutor, GenericFutureListener<F> listener, F future)
+    {
+        if (notifyExecutor == null) notifyListener(listener, future);
+        else safeExecute(notifyExecutor, () -> notifyListener(listener, future));
+    }
+
+    /**
+     * Notify {@code listener} using {@code notifyExecutor} if set, and handling exceptions otherwise
+     */
+    static void notifyListener(@Nullable Executor notifyExecutor, Runnable listener)
+    {
+        safeExecute(notifyExecutor, listener);
+    }
+
+    private static void safeExecute(@Nullable Executor notifyExecutor, Runnable runnable)
+    {
+        if (notifyExecutor == null)
+            notifyExecutor = ImmediateExecutor.INSTANCE;
+        try
+        {
+            notifyExecutor.execute(runnable);
+        }
+        catch (Exception | Error e)
+        {
+            // TODO: suboptimal package interdependency - move FutureTask etc here?
+            ExecutionFailure.handle(e);
+        }
+    }
+
+    /**
+     * Encapsulate a regular listener in a linked list
+     */
+    static class GenericFutureListenerList<V> extends ListenerList<V>
+    {
+        final GenericFutureListener listener;
+
+        GenericFutureListenerList(GenericFutureListener listener)
+        {
+            this.listener = listener;
+        }
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future<V> future)
+        {
+            notifyListener(notifyExecutor, listener, future);
+        }
+    }
+
+    /**
+     * Encapsulates the invocation of a callback with everything needed to submit for execution
+     * without incurring significant further overhead as a list
+     */
+    static class CallbackListener<V> extends ListenerList<V> implements Runnable
+    {
+        final Future<V> future;
+        final FutureCallback<? super V> callback;
+
+        CallbackListener(Future<V> future, FutureCallback<? super V> callback)
+        {
+            this.future = future;
+            this.callback = callback;
+        }
+
+        @Override
+        public void run()
+        {
+            if (future.isSuccess()) callback.onSuccess(future.getNow());
+            else callback.onFailure(future.cause());
+        }
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future<V> future)
+        {
+            notifyListener(notifyExecutor, this);
+        }
+    }
+
+    /**
+     * Encapsulates the invocation of a callback with everything needed to submit for execution
+     * without incurring significant further overhead as a list
+     */
+    static class CallbackBiConsumerListener<V> extends ListenerList<V> implements Runnable
+    {
+        final Future<V> future;
+        final BiConsumer<? super V, Throwable> callback;
+        final Executor executor;
+
+        CallbackBiConsumerListener(Future<V> future, BiConsumer<? super V, Throwable> callback, Executor executor)
+        {
+            this.future = future;
+            this.callback = callback;
+            this.executor = executor;
+        }
+
+        @Override
+        public void run()
+        {
+            if (future.isSuccess()) callback.accept(future.getNow(), null);
+            else callback.accept(null, future.cause());
+        }
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future<V> future)
+        {
+            notifyListener(executor == null ? notifyExecutor : executor, this);
+        }
+    }
+
+    /**
+     * Encapsulates the invocation of a callback with everything needed to submit for execution
+     * without incurring significant further overhead as a list
+     */
+    static class CallbackListenerWithExecutor<V> extends CallbackListener<V>
+    {
+        final Executor executor;
+        CallbackListenerWithExecutor(Future<V> future, FutureCallback<? super V> callback, Executor executor)
+        {
+            super(future, callback);
+            this.executor = executor;
+        }
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future<V> future)
+        {
+            notifyListener(executor, this);
+        }
+    }
+
+    /**
+     * Encapsulates the invocation of a callback with everything needed to submit for execution
+     * without incurring significant further overhead as a list
+     */
+    static class CallbackLambdaListener<V> extends ListenerList<V> implements Runnable
+    {
+        final Future<V> future;
+        final Consumer<? super V> onSuccess;
+        final Consumer<? super Throwable> onFailure;
+        final Executor executor;
+
+        CallbackLambdaListener(Future<V> future, Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure, Executor executor)
+        {
+            this.future = future;
+            this.onSuccess = onSuccess;
+            this.onFailure = onFailure;
+            this.executor = executor;
+        }
+
+        @Override
+        public void run()
+        {
+            if (future.isSuccess()) onSuccess.accept(future.getNow());
+            else onFailure.accept(future.cause());
+        }
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future future)
+        {
+            notifyListener(executor == null ? notifyExecutor : executor, this);
+        }
+    }
+
+    /**
+     * Encapsulate a task, executable on completion by {@link Future#notifyExecutor}, in a linked list for storing in
+     * {@link #listeners}, either as a listener on its own (since we need to encapsulate it anyway), or alongside
+     * other listeners in a list
+     */
+    static class RunnableWithNotifyExecutor<V> extends ListenerList<V>
+    {
+        final Runnable task;
+        RunnableWithNotifyExecutor(Runnable task)
+        {
+            this.task = task;
+        }
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future<V> future)
+        {
+            notifyListener(notifyExecutor, task);
+        }
+    }
+
+    /**
+     * Encapsulate a task executable on completion in a linked list for storing in {@link #listeners},
+     * either as a listener on its own (since we need to encapsulate it anyway), or alongside other listeners
+     * in a list
+     */
+    static class RunnableWithExecutor<V> extends ListenerList<V>
+    {
+        final Runnable task;
+        @Nullable final Executor executor;
+        RunnableWithExecutor(Runnable task, @Nullable Executor executor)
+        {
+            this.task = task;
+            this.executor = executor;
+        }
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future<V> future)
+        {
+            notifyListener(inExecutor(executor) ? null : executor, task);
+        }
+    }
+
+    /**
+     * Dummy that indicates listeners are already being notified after the future was completed,
+     * so we cannot notify them ourselves whilst maintaining the guaranteed invocation order.
+     * The invocation of the list can be left to the thread already notifying listeners.
+     */
+    static class Notifying<V> extends ListenerList<V>
+    {
+        static final Notifying NOTIFYING = new Notifying();
+
+        @Override
+        void notifySelf(Executor notifyExecutor, Future<V> future)
+        {
+        }
+    }
+
+    /**
+     * @return true iff the invoking thread is executing {@code executor}
+     */
+    static boolean inExecutor(Executor executor)
+    {
+        return (executor instanceof EventExecutor && ((EventExecutor) executor).inEventLoop())
+               || (executor instanceof ExecutorPlus && ((ExecutorPlus) executor).inExecutor());
+    }
+}
+
diff --git a/src/java/org/apache/cassandra/utils/concurrent/LoadingMap.java b/src/java/org/apache/cassandra/utils/concurrent/LoadingMap.java
new file mode 100644
index 0000000..399eb0e
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/LoadingMap.java
@@ -0,0 +1,202 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+import com.google.common.annotations.VisibleForTesting;
+import org.cliffc.high_scale_lib.NonBlockingHashMap;
+
+/**
+ * An extension of {@link NonBlockingHashMap} where all values are wrapped by {@link Future}.
+ * <p>
+ * The main purpose of this class is to provide the functionality of concurrent hash map which may perform operations like
+ * {@link ConcurrentHashMap#computeIfAbsent(Object, Function)} and {@link ConcurrentHashMap#computeIfPresent(Object, BiFunction)}
+ * with synchronization scope reduced to the single key - that is, when dealing with a single key, unlike
+ * {@link ConcurrentHashMap} we do not lock the whole map for the time the mapping function is running. This may help
+ * to avoid the case when we want to load/unload a value for a key K1 while loading/unloading a value for a key K2. Such
+ * scenario is forbidden in case of {@link ConcurrentHashMap} and leads to a deadlock. On the other hand, {@link NonBlockingHashMap}
+ * does not guarantee at-most-once semantics of running the mapping function for a single key.
+ *
+ * @param <K>
+ * @param <V>
+ */
+public class LoadingMap<K, V>
+{
+    private final NonBlockingHashMap<K, Future<V>> internalMap = new NonBlockingHashMap<>();
+
+    /**
+     * Returns a promise for the given key or null if there is nothing associated with the key.
+     * <p/>if the promise is not fulfilled, it means that there a loading process associated with the key
+     * <p/>if the promise is fulfilled with {@code null} value, it means that there is an unloading process associated with the key
+     * <p/>if the promise is fulfilled with a failure, it means that a loading process associated with the key failed
+     * but the exception was not propagated yet (a failed promise is eventually removed from the map)
+     */
+    @VisibleForTesting
+    Future<V> get(K key)
+    {
+        return internalMap.get(key);
+    }
+
+    /**
+     * Get a value for a given key. Returns a non-null object only if there is a successfully initialized value associated,
+     * with the provided key. It returns {@code null} if there is no value for the key, or the value is being initialized
+     * or removed. It does not throw if the last attempt to initialize the value failed.
+     */
+    public V getIfReady(K key)
+    {
+        Future<V> future = internalMap.get(key);
+        return future != null ? future.getNow() : null;
+    }
+
+    /**
+     * If the value for the given key is missing, execute a load function to obtain a value and put it into the map.
+     * It is guaranteed that the loading and unloading a value for a single key are executed serially. It is also
+     * guaranteed that the load function is executed exactly once to load a value into the map (regardless of the concurrent attempts).
+     * <p/>
+     * In case there is a concurrent attempt to load a value for this key, this attempt waits until the concurrent attempt
+     * is done and returns its result (if succeeded). If the concurrent attempt fails, this attempt is retried. However,
+     * if this attempt fails, it is not retried and the exception is rethrown. In case there is a concurrent attempt
+     * to unload a value for this key, this attempt waits until the concurrent attempt is done and retries loading.
+     * <p/>
+     * When the mapping function returns {@code null}, {@link NullPointerException} is thrown. When the mapping function
+     * throws exception, it is rethrown by this method. In both cases nothing gets added to the map.
+     * <p/>
+     * It is allowed to nest loading for a different key, though nested loading for the same key results in a deadlock.
+     */
+    public V blockingLoadIfAbsent(K key, Supplier<? extends V> loadFunction) throws RuntimeException
+    {
+        while (true)
+        {
+            Future<V> future = internalMap.get(key);
+            boolean attemptedInThisThread = false;
+            if (future == null)
+            {
+                AsyncPromise<V> newEntry = new AsyncPromise<>();
+                future = internalMap.putIfAbsent(key, newEntry);
+                if (future == null)
+                {
+                    // We managed to create an entry for the value. Now initialize it.
+                    attemptedInThisThread = true;
+                    future = newEntry;
+                    try
+                    {
+                        V v = loadFunction.get();
+                        if (v == null)
+                            throw new NullPointerException("The mapping function returned null");
+                        else
+                            newEntry.setSuccess(v);
+                    }
+                    catch (Throwable t)
+                    {
+                        newEntry.setFailure(t);
+                        // Remove future so that construction can be retried later
+                        internalMap.remove(key, future);
+                    }
+                }
+
+                // Else some other thread beat us to it, but we now have the reference to the future which we can wait for.
+            }
+
+            V v = future.awaitUninterruptibly().getNow();
+
+            if (v != null) // implies success
+                return v;
+
+            if (attemptedInThisThread)
+                // Rethrow if the failing attempt was initiated by us (failed and attemptedInThisThread)
+                future.rethrowIfFailed();
+
+            // Retry in other cases, that is, if blockingUnloadIfPresent was called in the meantime
+            // (success and getNow == null) hoping that unloading gets finished soon, and if the concurrent attempt
+            // to load entry fails
+            Thread.yield();
+        }
+    }
+
+    /**
+     * If a value for the given key is present, unload function is run and the value is removed from the map.
+     * Similarly to {@link #blockingLoadIfAbsent(Object, Supplier)} at-most-once semantics is guaranteed for unload
+     * function.
+     * <p/>
+     * When unload function fails, the value is removed from the map anyway and the failure is rethrown.
+     * <p/>
+     * When the key was not found, the method returns {@code null}.
+     *
+     * @throws UnloadExecutionException when the unloading failed to complete - this is checked exception because
+     *                                  the value is removed from the map regardless of the result of unloading;
+     *                                  therefore if the unloading failed, the caller is responsible for handling that
+     */
+    public V blockingUnloadIfPresent(K key, Consumer<? super V> unloadFunction) throws UnloadExecutionException
+    {
+        Promise<V> droppedFuture = new AsyncPromise<V>().setSuccess(null);
+
+        Future<V> existingFuture;
+        do
+        {
+            existingFuture = internalMap.get(key);
+            if (existingFuture == null || existingFuture.isDone() && existingFuture.getNow() == null)
+                return null;
+        } while (!internalMap.replace(key, existingFuture, droppedFuture));
+
+        V v = existingFuture.awaitUninterruptibly().getNow();
+        try
+        {
+            if (v == null)
+                // which means that either the value failed to load or a concurrent attempt to unload already did the work
+                return null;
+
+            unloadFunction.accept(v);
+            return v;
+        }
+        catch (Throwable t)
+        {
+            throw new UnloadExecutionException(v, t);
+        }
+        finally
+        {
+            Future<V> future = internalMap.remove(key);
+            assert future == droppedFuture;
+        }
+    }
+
+    /**
+     * Thrown when unloading a value failed. It encapsulates the value which was failed to unload.
+     */
+    public static class UnloadExecutionException extends ExecutionException
+    {
+        private final Object value;
+
+        public UnloadExecutionException(Object value, Throwable cause)
+        {
+            super(cause);
+            this.value = value;
+        }
+
+        public <T> T value()
+        {
+            return (T) value;
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/NonBlockingRateLimiter.java b/src/java/org/apache/cassandra/utils/concurrent/NonBlockingRateLimiter.java
new file mode 100644
index 0000000..2a98222
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/NonBlockingRateLimiter.java
@@ -0,0 +1,188 @@
+/*
+ * 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.utils.concurrent;
+
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
+import com.google.common.base.Ticker;
+
+import javax.annotation.concurrent.ThreadSafe;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static java.lang.Math.toIntExact;
+
+/**
+ * A rate limiter implementation that allows callers to reserve permits that may only be available 
+ * in the future, delegating to them decisions about how to schedule/delay work and whether or not
+ * to block execution to do so.
+ */
+@SuppressWarnings("UnstableApiUsage")
+@ThreadSafe
+public class NonBlockingRateLimiter
+{
+    public static final long NANOS_PER_SECOND = TimeUnit.SECONDS.toNanos(1);
+    static final long DEFAULT_BURST_NANOS = NANOS_PER_SECOND;
+
+    /** a starting time for elapsed time calculations */
+    private final long startedNanos;
+
+    /** nanoseconds from start time corresponding to the next available permit */
+    private final AtomicLong nextAvailable = new AtomicLong();
+    
+    private volatile Ticker ticker;
+    
+    private volatile int permitsPerSecond;
+    
+    /** time in nanoseconds between permits on the timeline */
+    private volatile long intervalNanos;
+
+    /**
+     * To allow the limiter to more closely adhere to the configured rate in the face of
+     * unevenly distributed permits requests, it will allow a number of permits equal to
+     * burstNanos / intervalNanos to be issued in a "burst" before reaching a steady state.
+     * 
+     * Another way to think about this is that it allows us to bring forward the permits
+     * from short periods of inactivity. This is especially useful when the upstream user
+     * of the limiter delays request processing mechanism contains overhead that is longer
+     * than the intervalNanos in duration.
+     */
+    private final long burstNanos;
+
+    public NonBlockingRateLimiter(int permitsPerSecond)
+    {
+        this(permitsPerSecond, DEFAULT_BURST_NANOS, Ticker.systemTicker());
+    }
+
+    @VisibleForTesting
+    public NonBlockingRateLimiter(int permitsPerSecond, long burstNanos, Ticker ticker)
+    {
+        this.startedNanos = ticker.read();
+        this.burstNanos = burstNanos;
+        setRate(permitsPerSecond, ticker);
+    }
+
+    public void setRate(int permitsPerSecond)
+    {
+        setRate(permitsPerSecond, Ticker.systemTicker());
+    }
+
+    @VisibleForTesting
+    public synchronized void setRate(int permitsPerSecond, Ticker ticker)
+    {
+        Preconditions.checkArgument(permitsPerSecond > 0, "permits/second must be positive");
+        Preconditions.checkArgument(permitsPerSecond <= NANOS_PER_SECOND, "permits/second cannot be greater than " + NANOS_PER_SECOND);
+
+        this.ticker = ticker;
+        this.permitsPerSecond = permitsPerSecond;
+        intervalNanos = NANOS_PER_SECOND / permitsPerSecond;
+        nextAvailable.set(nanosElapsed());
+    }
+
+    /**
+     * @return the number of available permits per second
+     */
+    public int getRate()
+    {
+        return permitsPerSecond;
+    }
+
+    /**
+     * Reserves a single permit slot on the timeline which may not yet be available.
+     *
+     * @return time until the reserved permit will be available (or zero if it already is) in the specified units
+     */
+    public long reserveAndGetDelay(TimeUnit delayUnit)
+    {
+        long nowNanos = nanosElapsed();
+
+        for (;;)
+        {
+            long prev = nextAvailable.get();
+            long interval = this.intervalNanos;
+
+            // Push the first available permit slot up to the burst window if necessary.
+            long firstAvailable = Math.max(prev, nowNanos - burstNanos);
+
+            // Advance the configured interval starting from the bounded previous permit slot.
+            if (nextAvailable.compareAndSet(prev, firstAvailable + interval))
+                // If the time now is before the first available slot, return the delay.  
+                return delayUnit.convert(Math.max(0,  firstAvailable - nowNanos), TimeUnit.NANOSECONDS);
+        }
+    }
+
+    /**
+     * Reserves a single permit slot on the timeline, but only if one is available.
+     *
+     * @return true if a permit is available, false if one is not
+     */
+    public boolean tryReserve()
+    {
+        long nowNanos = nanosElapsed();
+    
+        for (;;)
+        {
+            long prev = nextAvailable.get();
+            long interval = this.intervalNanos;
+    
+            // Push the first available permit slot up to the burst window if necessary.
+            long firstAvailable = Math.max(prev, nowNanos - burstNanos);
+            
+            // If we haven't reached the time for the first available permit, we've failed to reserve. 
+            if (nowNanos < firstAvailable)
+                return false;
+    
+            // Advance the configured interval starting from the bounded previous permit slot.
+            // If another thread has already taken the next slot, retry.
+            if (nextAvailable.compareAndSet(prev, firstAvailable + interval))
+                return true;
+        }
+    }
+
+    @VisibleForTesting
+    public long getIntervalNanos()
+    {
+        return intervalNanos;
+    }
+    
+    @VisibleForTesting
+    public long getStartedNanos()
+    {
+        return startedNanos;
+    }
+
+    private long nanosElapsed()
+    {
+        return ticker.read() - startedNanos;
+    }
+
+    public static final NonBlockingRateLimiter NO_OP_LIMITER = new NonBlockingRateLimiter(toIntExact(NANOS_PER_SECOND))
+    {
+        @Override
+        public long reserveAndGetDelay(TimeUnit delayUnit) {
+            return 0;
+        }
+
+        @Override
+        public boolean tryReserve()
+        {
+            return true;
+        }
+    };
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/NotScheduledFuture.java b/src/java/org/apache/cassandra/utils/concurrent/NotScheduledFuture.java
new file mode 100644
index 0000000..a81f9a9
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/NotScheduledFuture.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.utils.concurrent;
+
+import java.util.concurrent.Delayed;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+
+public class NotScheduledFuture<T> implements ScheduledFuture<T>
+{
+    public long getDelay(TimeUnit unit)
+    {
+        return 0;
+    }
+
+    public int compareTo(Delayed o)
+    {
+        return 0;
+    }
+
+    public boolean cancel(boolean mayInterruptIfRunning)
+    {
+        return false;
+    }
+
+    public boolean isCancelled()
+    {
+        return false;
+    }
+
+    public boolean isDone()
+    {
+        return false;
+    }
+
+    public T get()
+    {
+        return null;
+    }
+
+    public T get(long timeout, TimeUnit unit)
+    {
+        return null;
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java b/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java
index 863f038..7f18a0c 100644
--- a/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java
+++ b/src/java/org/apache/cassandra/utils/concurrent/OpOrder.java
@@ -18,7 +18,11 @@
  */
 package org.apache.cassandra.utils.concurrent;
 
+import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
 
 /**
  * <p>A class for providing synchronization between producers and consumers that do not
@@ -113,8 +117,6 @@
      * after which all new operations will start against a new Group that will not be accepted
      * by barrier.isAfter(), and barrier.await() will return only once all operations started prior to the issue
      * have completed.
-     *
-     * @return
      */
     public Barrier newBarrier()
     {
@@ -162,10 +164,11 @@
         private final long id; // monotonically increasing id for compareTo()
         private volatile int running = 0; // number of operations currently running.  < 0 means we're expired, and the count of tasks still running is -(running + 1)
         private volatile boolean isBlocking; // indicates running operations are blocking future barriers
-        private final WaitQueue isBlockingSignal = new WaitQueue(); // signal to wait on to indicate isBlocking is true
-        private final WaitQueue waiting = new WaitQueue(); // signal to wait on for completion
+        private volatile ConcurrentLinkedQueue<WaitQueue.Signal> blocking; // signal to wait on to indicate isBlocking is true
+        private final WaitQueue waiting = newWaitQueue(); // signal to wait on for completion
 
         static final AtomicIntegerFieldUpdater<Group> runningUpdater = AtomicIntegerFieldUpdater.newUpdater(Group.class, "running");
+        static final AtomicReferenceFieldUpdater<Group, ConcurrentLinkedQueue> blockingUpdater = AtomicReferenceFieldUpdater.newUpdater(Group.class, ConcurrentLinkedQueue.class, "blocking");
 
         // constructs first instance only
         private Group()
@@ -318,21 +321,21 @@
             return isBlocking;
         }
 
-        /**
-         * register to be signalled when a barrier waiting on us is, or maybe, blocking general progress,
-         * so we should try more aggressively to progress
-         */
-        public WaitQueue.Signal isBlockingSignal()
+        public void notifyIfBlocking(WaitQueue.Signal signal)
         {
-            return isBlockingSignal.register();
+            if (blocking == null)
+                blockingUpdater.compareAndSet(this, null, new ConcurrentLinkedQueue<>());
+            blocking.add(signal);
+            if (isBlocking() && blocking.remove(signal))
+                signal.signal();
         }
 
-        /**
-         * wrap the provided signal to also be signalled if the operation gets marked blocking
-         */
-        public WaitQueue.Signal isBlockingSignal(WaitQueue.Signal signal)
+        private void markBlocking()
         {
-            return WaitQueue.any(signal, isBlockingSignal());
+            isBlocking = true;
+            ConcurrentLinkedQueue<WaitQueue.Signal> blocking = this.blocking;
+            if (blocking != null)
+                blocking.forEach(WaitQueue.Signal::signal);
         }
 
         public int compareTo(Group that)
@@ -406,21 +409,12 @@
             Group current = orderOnOrBefore;
             while (current != null)
             {
-                current.isBlocking = true;
-                current.isBlockingSignal.signalAll();
+                current.markBlocking();
                 current = current.prev;
             }
         }
 
         /**
-         * Register to be signalled once allPriorOpsAreFinished() or allPriorOpsAreFinishedOrSafe() may return true
-         */
-        public WaitQueue.Signal register()
-        {
-            return orderOnOrBefore.waiting.register();
-        }
-
-        /**
          * wait for all operations started prior to issuing the barrier to complete
          */
         public void await()
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Promise.java b/src/java/org/apache/cassandra/utils/concurrent/Promise.java
new file mode 100644
index 0000000..d9e4623
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/Promise.java
@@ -0,0 +1,129 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
+import java.util.function.Consumer;
+
+import com.google.common.util.concurrent.FutureCallback;
+
+import io.netty.util.concurrent.GenericFutureListener;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A Promise that integrates {@link io.netty.util.concurrent.Promise} with our {@link Future} API
+ * to improve clarity and coherence in the codebase.
+ */
+@Shared(scope = SIMULATION, ancestors = INTERFACES)
+public interface Promise<V> extends io.netty.util.concurrent.Promise<V>, Future<V>
+{
+    public static <V> GenericFutureListener<? extends Future<V>> listener(FutureCallback<V> callback)
+    {
+        return future -> {
+            if (future.isSuccess()) callback.onSuccess(future.getNow());
+            else callback.onFailure(future.cause());
+        };
+    }
+
+    public static <V> GenericFutureListener<? extends Future<V>> listener(ExecutorService executor, FutureCallback<V> callback)
+    {
+        return future -> executor.execute(() -> {
+            if (future.isSuccess()) callback.onSuccess(future.getNow());
+            else callback.onFailure(future.cause());
+        });
+    }
+
+    @Override
+    Promise<V> addCallback(FutureCallback<? super V> callback);
+
+    Promise<V> addCallback(FutureCallback<? super V> callback, Executor executor);
+
+    Promise<V> addCallback(Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure);
+
+    @Override
+    Promise<V> addListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> var1);
+
+    @Override
+    Promise<V> addListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... var1);
+
+    @Override
+    Promise<V> removeListener(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> var1);
+
+    @Override
+    Promise<V> removeListeners(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>>... var1);
+
+    /**
+     * Complete the promise successfully if not already complete
+     * @throws IllegalStateException if already set
+     */
+    @Override
+    Promise<V> setSuccess(V v) throws IllegalStateException;
+
+    /**
+     * Complete the promise abnormally if not already complete
+     * @throws IllegalStateException if already set
+     */
+    @Override
+    Promise<V> setFailure(Throwable throwable) throws IllegalStateException;
+
+    /**
+     * Prevent a future caller from cancelling this promise
+     * @return true iff this invocation set it to uncancellable, whether or not now uncancellable
+     */
+    boolean setUncancellableExclusive();
+
+    /**
+     * Wait indefinitely for this promise to complete, throwing any interrupt
+     * @throws InterruptedException if interrupted
+     */
+    @Override
+    Promise<V> await() throws InterruptedException;
+
+    /**
+     * Wait indefinitely for this promise to complete
+     */
+    @Override
+    Promise<V> awaitUninterruptibly();
+
+    /**
+     * Wait indefinitely for this promise to complete, throwing any interrupt as an UncheckedInterruptedException
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    @Override
+    Promise<V> awaitThrowUncheckedOnInterrupt();
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    Promise<V> sync() throws InterruptedException;
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    Promise<V> syncUninterruptibly();
+}
+
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Ref.java b/src/java/org/apache/cassandra/utils/concurrent/Ref.java
index 121e71d..90650cf 100644
--- a/src/java/org/apache/cassandra/utils/concurrent/Ref.java
+++ b/src/java/org/apache/cassandra/utils/concurrent/Ref.java
@@ -31,14 +31,13 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
 
-import org.apache.cassandra.concurrent.InfiniteLoopExecutor;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import org.apache.cassandra.concurrent.Shutdownable;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.lifecycle.View;
@@ -48,12 +47,15 @@
 import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.NoSpamLogger;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.Shared;
+
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 
 import static java.util.Collections.emptyList;
 
-import static org.apache.cassandra.utils.ExecutorUtils.awaitTermination;
-import static org.apache.cassandra.utils.ExecutorUtils.shutdownNow;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe.UNSAFE;
+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;
 
@@ -92,6 +94,13 @@
 {
     static final Logger logger = LoggerFactory.getLogger(Ref.class);
     public static final boolean DEBUG_ENABLED = System.getProperty("cassandra.debugrefcount", "false").equalsIgnoreCase("true");
+    static OnLeak ON_LEAK;
+
+    @Shared(scope = SIMULATION)
+    public interface OnLeak
+    {
+        void onLeak(Object state);
+    }
 
     final State state;
     final T referent;
@@ -182,7 +191,7 @@
 
         private static final AtomicIntegerFieldUpdater<State> releasedUpdater = AtomicIntegerFieldUpdater.newUpdater(State.class, "released");
 
-        public State(final GlobalState globalState, Ref reference, ReferenceQueue<? super Ref> q)
+        State(final GlobalState globalState, Ref reference, ReferenceQueue<? super Ref> q)
         {
             super(reference, q);
             this.globalState = globalState;
@@ -228,6 +237,9 @@
                 logger.error("LEAK DETECTED: a reference ({}) to {} was not released before the reference was garbage collected", id, globalState);
                 if (DEBUG_ENABLED)
                     debug.log(id);
+                OnLeak onLeak = ON_LEAK;
+                if (onLeak != null)
+                    onLeak.onLeak(this);
             }
             else if (DEBUG_ENABLED)
             {
@@ -236,6 +248,12 @@
             if (fail != null)
                 logger.error("Error when closing {}", globalState, fail);
         }
+
+        @Override
+        public String toString()
+        {
+            return globalState.toString();
+        }
     }
 
     static final class Debug
@@ -358,8 +376,8 @@
     static final Set<Class<?>> concurrentIterables = Collections.newSetFromMap(new IdentityHashMap<>());
     private static final Set<GlobalState> globallyExtant = Collections.newSetFromMap(new ConcurrentHashMap<>());
     static final ReferenceQueue<Object> referenceQueue = new ReferenceQueue<>();
-    private static final InfiniteLoopExecutor EXEC = new InfiniteLoopExecutor("Reference-Reaper", Ref::reapOneReference).start();
-    static final ScheduledExecutorService STRONG_LEAK_DETECTOR = !DEBUG_ENABLED ? null : Executors.newScheduledThreadPool(1, new NamedThreadFactory("Strong-Reference-Leak-Detector"));
+    private static final Shutdownable EXEC = executorFactory().infiniteLoop("Reference-Reaper", Ref::reapOneReference, UNSAFE);
+    static final ScheduledExecutorService STRONG_LEAK_DETECTOR = !DEBUG_ENABLED ? null : executorFactory().scheduled("Strong-Reference-Leak-Detector");
     static
     {
         if (DEBUG_ENABLED)
@@ -679,7 +697,10 @@
         {
             final Set<Tidy> candidates = Collections.newSetFromMap(new IdentityHashMap<>());
             for (GlobalState state : globallyExtant)
-                candidates.add(state.tidy);
+            {
+                if (state.tidy != null)
+                    candidates.add(state.tidy);
+            }
             removeExpected(candidates);
             this.candidates.retainAll(candidates);
             if (!this.candidates.isEmpty())
@@ -707,6 +728,11 @@
         }
     }
 
+    public static void setOnLeak(OnLeak onLeak)
+    {
+        ON_LEAK = onLeak;
+    }
+
     @VisibleForTesting
     public static void shutdownReferenceReaper(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
     {
diff --git a/src/java/org/apache/cassandra/utils/concurrent/RunnableFuture.java b/src/java/org/apache/cassandra/utils/concurrent/RunnableFuture.java
new file mode 100644
index 0000000..6ec1daa4
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/RunnableFuture.java
@@ -0,0 +1,28 @@
+/*
+ * 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.utils.concurrent;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface RunnableFuture<V> extends Future<V>, java.util.concurrent.RunnableFuture<V>
+{
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Semaphore.java b/src/java/org/apache/cassandra/utils/concurrent/Semaphore.java
new file mode 100644
index 0000000..01c52c5
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/Semaphore.java
@@ -0,0 +1,158 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.utils.Intercept;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface Semaphore
+{
+    /**
+     * @return the number of permits presently in this semaphore
+     */
+    int permits();
+
+    /**
+     * set the number of permits in this semaphore to zero
+     */
+    int drain();
+
+    /**
+     * Increase the number of available permits and signal any waiters that may be served by the release
+     */
+    void release(int permits);
+
+    /**
+     * Try to take permits, returning immediately
+     * @return true iff permits acquired
+     */
+    boolean tryAcquire(int acquire);
+
+    /**
+     * Try to take permits, waiting up to timeout
+     * @return true iff permits acquired
+     * @throws InterruptedException if interrupted
+     */
+    boolean tryAcquire(int acquire, long time, TimeUnit unit) throws InterruptedException;
+
+    /**
+     * Try to take permits, waiting until the deadline
+     * @return true iff permits acquired
+     * @throws InterruptedException if interrupted
+     */
+    boolean tryAcquireUntil(int acquire, long nanoTimeDeadline) throws InterruptedException;
+
+    /**
+     * Take permits, waiting indefinitely until available
+     * @throws InterruptedException if interrupted
+     */
+    void acquire(int acquire) throws InterruptedException;
+
+    /**
+     * Take permits, waiting indefinitely until available
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    void acquireThrowUncheckedOnInterrupt(int acquire) throws UncheckedInterruptedException;
+
+    /**
+     * Factory method used to capture and redirect instantiations for simulation
+     *
+     * Construct an unfair Semaphore initially holding the specified number of permits
+     */
+    @Intercept
+    public static Semaphore newSemaphore(int permits)
+    {
+        return new Standard(permits, false);
+    }
+
+    /**
+     * Factory method used to capture and redirect instantiations for simulation
+     *
+     * Construct a fair Semaphore initially holding the specified number of permits
+     */
+    @Intercept
+    public static Semaphore newFairSemaphore(int permits)
+    {
+        return new Standard(permits, true);
+    }
+
+    public static class Standard extends java.util.concurrent.Semaphore implements Semaphore
+    {
+        public Standard(int permits)
+        {
+            this(permits, false);
+        }
+
+        public Standard(int permits, boolean fair)
+        {
+            super(permits, fair);
+        }
+
+        /**
+         * {@link Semaphore#drain()}
+         */
+        public int drain()
+        {
+            return drainPermits();
+        }
+
+        /**
+         * Number of permits that are available to be acquired. {@link Semaphore#permits()}
+         */
+        public int permits()
+        {
+            return availablePermits();
+        }
+
+        /**
+         * Number of permits that have been acquired in excess of available. {@link Semaphore#permits()}
+         */
+        public int waiting()
+        {
+            return getQueueLength();
+        }
+
+        /**
+         * {@link Semaphore#tryAcquireUntil(int, long)}
+         */
+        public boolean tryAcquireUntil(int acquire, long nanoTimeDeadline) throws InterruptedException
+        {
+            long wait = nanoTimeDeadline - System.nanoTime();
+            return tryAcquire(acquire, Math.max(0, wait), TimeUnit.NANOSECONDS);
+        }
+
+        @Override
+        public void acquireThrowUncheckedOnInterrupt(int acquire) throws UncheckedInterruptedException
+        {
+            try
+            {
+                acquire(acquire);
+            }
+            catch (InterruptedException e)
+            {
+                throw new UncheckedInterruptedException(e);
+            }
+        }
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/SimpleCondition.java b/src/java/org/apache/cassandra/utils/concurrent/SimpleCondition.java
deleted file mode 100644
index 61ec640..0000000
--- a/src/java/org/apache/cassandra/utils/concurrent/SimpleCondition.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils.concurrent;
-
-import java.util.Date;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
-import java.util.concurrent.locks.Condition;
-
-// fulfils the Condition interface without spurious wakeup problems
-// (or lost notify problems either: that is, even if you call await()
-// _after_ signal(), it will work as desired.)
-public class SimpleCondition implements Condition
-{
-    private static final AtomicReferenceFieldUpdater<SimpleCondition, WaitQueue> waitingUpdater = AtomicReferenceFieldUpdater.newUpdater(SimpleCondition.class, WaitQueue.class, "waiting");
-
-    private volatile WaitQueue waiting;
-    private volatile boolean signaled = false;
-
-    @Override
-    public void await() throws InterruptedException
-    {
-        if (isSignaled())
-            return;
-        if (waiting == null)
-            waitingUpdater.compareAndSet(this, null, new WaitQueue());
-        WaitQueue.Signal s = waiting.register();
-        if (isSignaled())
-            s.cancel();
-        else
-            s.await();
-        assert isSignaled();
-    }
-
-    public boolean await(long time, TimeUnit unit) throws InterruptedException
-    {
-        long start = System.nanoTime();
-        long until = start + unit.toNanos(time);
-        return awaitUntil(until);
-    }
-
-    public boolean awaitUntil(long deadlineNanos) throws InterruptedException
-    {
-        if (isSignaled())
-            return true;
-        if (waiting == null)
-            waitingUpdater.compareAndSet(this, null, new WaitQueue());
-        WaitQueue.Signal s = waiting.register();
-        if (isSignaled())
-        {
-            s.cancel();
-            return true;
-        }
-        return s.awaitUntil(deadlineNanos) || isSignaled();
-    }
-
-    public void signal()
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    public boolean isSignaled()
-    {
-        return signaled;
-    }
-
-    public void signalAll()
-    {
-        signaled = true;
-        if (waiting != null)
-            waiting.signalAll();
-    }
-
-    public void awaitUninterruptibly()
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public long awaitNanos(long nanosTimeout)
-    {
-        throw new UnsupportedOperationException();
-    }
-
-    @Override
-    public boolean awaitUntil(Date deadline)
-    {
-        throw new UnsupportedOperationException();
-    }
-}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/SyncFuture.java b/src/java/org/apache/cassandra/utils/concurrent/SyncFuture.java
new file mode 100644
index 0000000..2a3598a
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/SyncFuture.java
@@ -0,0 +1,171 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.Executor;
+import java.util.function.Function;
+
+import javax.annotation.Nullable;
+
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.ListenableFuture; // checkstyle: permit this import
+
+import io.netty.util.concurrent.GenericFutureListener;
+
+import static org.apache.cassandra.utils.concurrent.Awaitable.SyncAwaitable.waitUntil;
+
+/**
+ * Netty's DefaultPromise uses a mutex to coordinate notifiers AND waiters between the eventLoop and the other threads.
+ * Since we register cross-thread listeners, this has the potential to block internode messaging for an unknown
+ * number of threads for an unknown period of time, if we are unlucky with the scheduler (which will certainly
+ * happen, just with some unknown but low periodicity)
+ *
+ * At the same time, we manage some other efficiencies:
+ *  - We save some space when registering listeners, especially if there is only one listener, as we perform no
+ *    extra allocations in this case.
+ *  - We permit efficient initial state declaration, avoiding unnecessary CAS or lock acquisitions when mutating
+ *    a Promise we are ourselves constructing (and can easily add more; only those we use have been added)
+ *
+ * We can also make some guarantees about our behaviour here, although we primarily mirror Netty.
+ * Specifically, we can guarantee that notifiers are always invoked in the order they are added (which may be true
+ * for netty, but was unclear and is not declared).  This is useful for ensuring the correctness of some of our
+ * behaviours in OutboundConnection without having to jump through extra hoops.
+ *
+ * The implementation loosely follows that of Netty's DefaultPromise, with some slight changes; notably that we have
+ * no synchronisation on our listeners, instead using a CoW list that is cleared each time we notify listeners.
+ *
+ * We handle special values slightly differently.  We do not use a special value for null, instead using
+ * a special value to indicate the result has not been set yet.  This means that once isSuccess() holds,
+ * the result must be a correctly typed object (modulo generics pitfalls).
+ * All special values are also instances of FailureHolder, which simplifies a number of the logical conditions.
+ *
+ * @param <V>
+ */
+public class SyncFuture<V> extends AbstractFuture<V>
+{
+    protected SyncFuture()
+    {
+        super();
+    }
+
+    protected SyncFuture(V immediateSuccess)
+    {
+        super(immediateSuccess);
+    }
+
+    protected SyncFuture(Throwable immediateFailure)
+    {
+        super(immediateFailure);
+    }
+
+    protected SyncFuture(FailureHolder initialState)
+    {
+        super(initialState);
+    }
+
+    protected SyncFuture(GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        super(listener);
+    }
+
+    protected SyncFuture(FailureHolder initialState, GenericFutureListener<? extends io.netty.util.concurrent.Future<? super V>> listener)
+    {
+        super(initialState, listener);
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transform} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public <T> Future<T> map(Function<? super V, ? extends T> mapper, Executor executor)
+    {
+        return map(new SyncFuture<>(), mapper, executor);
+    }
+
+    /**
+     * Support {@link com.google.common.util.concurrent.Futures#transformAsync(ListenableFuture, AsyncFunction, Executor)} natively
+     *
+     * See {@link #addListener(GenericFutureListener)} for ordering semantics.
+     */
+    @Override
+    public <T> Future<T> flatMap(Function<? super V, ? extends Future<T>> flatMapper, @Nullable Executor executor)
+    {
+        return flatMap(new SyncFuture<>(), flatMapper, executor);
+    }
+
+    /**
+     * Shared implementation of various promise completion methods.
+     * Updates the result if it is possible to do so, returning success/failure.
+     *
+     * If the promise is UNSET the new value will succeed;
+     *          if it is UNCANCELLABLE it will succeed only if the new value is not CANCELLED
+     *          otherwise it will fail, as isDone() is implied
+     *
+     * If the update succeeds, and the new state implies isDone(), any listeners and waiters will be notified
+     */
+    synchronized boolean trySet(Object v)
+    {
+        Object current = result;
+        if (isDone(current) || (current == UNCANCELLABLE && (v == CANCELLED || v == UNCANCELLABLE)))
+            return false;
+
+        resultUpdater.lazySet(this, v);
+        if (v != UNCANCELLABLE)
+        {
+            notifyListeners();
+            notifyAll();
+        }
+        return true;
+    }
+
+    public synchronized boolean awaitUntil(long deadline) throws InterruptedException
+    {
+        if (isDone())
+            return true;
+
+        waitUntil(this, deadline);
+        return isDone();
+    }
+
+    public synchronized Future<V> await() throws InterruptedException
+    {
+        while (!isDone())
+            wait();
+        return this;
+    }
+
+    /**
+     * Logically append {@code newListener} to {@link #listeners}
+     * (at this stage it is a stack, so we actually prepend)
+     */
+    synchronized void appendListener(ListenerList<V> newListener)
+    {
+        ListenerList.pushExclusive(listenersUpdater, this, newListener);
+        if (isDone())
+            notifyListeners();
+    }
+
+    private void notifyListeners()
+    {
+        ListenerList.notifyExclusive(listeners, this);
+        listenersUpdater.lazySet(this, null);
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/SyncPromise.java b/src/java/org/apache/cassandra/utils/concurrent/SyncPromise.java
new file mode 100644
index 0000000..fc5fb81
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/SyncPromise.java
@@ -0,0 +1,269 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.Executor;
+import java.util.function.Consumer;
+
+import com.google.common.util.concurrent.FutureCallback;
+
+import io.netty.util.concurrent.Future; // checkstyle: permit this import
+import io.netty.util.concurrent.GenericFutureListener;
+
+/**
+ * Extends {@link SyncFuture} to implement the {@link Promise} interface.
+ */
+public class SyncPromise<V> extends SyncFuture<V> implements Promise<V>
+{
+    public static class WithExecutor<V> extends SyncPromise<V>
+    {
+        final Executor notifyExecutor;
+        protected WithExecutor(Executor notifyExecutor)
+        {
+            this.notifyExecutor = notifyExecutor;
+        }
+
+        protected WithExecutor(Executor notifyExecutor, FailureHolder initialState)
+        {
+            super(initialState);
+            this.notifyExecutor = notifyExecutor;
+        }
+
+        protected WithExecutor(Executor notifyExecutor, GenericFutureListener<? extends Future<? super V>> listener)
+        {
+            super(listener);
+            this.notifyExecutor = notifyExecutor;
+        }
+
+        @Override
+        public Executor notifyExecutor()
+        {
+            return notifyExecutor;
+        }
+    }
+
+    public SyncPromise() {}
+
+    SyncPromise(FailureHolder initialState)
+    {
+        super(initialState);
+    }
+
+    public SyncPromise(GenericFutureListener<? extends Future<? super V>> listener)
+    {
+        super(listener);
+    }
+
+    SyncPromise(FailureHolder initialState, GenericFutureListener<? extends Future<? super V>> listener)
+    {
+        super(initialState, listener);
+    }
+
+    public static <V> SyncPromise<V> withExecutor(Executor executor)
+    {
+        return new SyncPromise.WithExecutor<>(executor);
+    }
+
+    public static <V> SyncPromise<V> uncancellable()
+    {
+        return new SyncPromise<>(UNCANCELLABLE);
+    }
+
+    public static <V> SyncPromise<V> uncancellable(Executor executor)
+    {
+        return new WithExecutor<>(executor, UNCANCELLABLE);
+    }
+
+    public static <V> SyncPromise<V> uncancellable(GenericFutureListener<? extends Future<? super V>> listener)
+    {
+        return new SyncPromise<>(UNCANCELLABLE, listener);
+    }
+
+    /**
+     * Complete the promise successfully if not already complete
+     * @throws IllegalStateException if already set
+     */
+    @Override
+    public Promise<V> setSuccess(V v)
+    {
+        if (!trySuccess(v))
+            throw new IllegalStateException("complete already: " + this);
+        return this;
+    }
+
+    /**
+     * Complete the promise successfully if not already complete
+     * @return true iff completed promise
+     */
+    @Override
+    public boolean trySuccess(V v)
+    {
+        return super.trySuccess(v);
+    }
+
+    /**
+     * Complete the promise abnormally if not already complete
+     * @throws IllegalStateException if already set
+     */
+    @Override
+    public Promise<V> setFailure(Throwable throwable)
+    {
+        if (!tryFailure(throwable))
+            throw new IllegalStateException("complete already: " + this);
+        return this;
+    }
+
+    /**
+     * Complete the promise abnormally if not already complete
+     * @return true iff completed promise
+     */
+    @Override
+    public boolean tryFailure(Throwable throwable)
+    {
+        return super.tryFailure(throwable);
+    }
+
+    /**
+     * Prevent a future caller from cancelling this promise
+     * @return true if the promise is now uncancellable (whether or not we did this)
+     */
+    @Override
+    public boolean setUncancellable()
+    {
+        return super.setUncancellable();
+    }
+
+    /**
+     * Prevent a future caller from cancelling this promise
+     * @return true iff this invocation set it to uncancellable, whether or not now uncancellable
+     */
+    @Override
+    public boolean setUncancellableExclusive()
+    {
+        return super.setUncancellableExclusive();
+    }
+
+    @Override
+    public boolean isUncancellable()
+    {
+        return super.isUncancellable();
+    }
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    public Promise<V> sync() throws InterruptedException
+    {
+        super.sync();
+        return this;
+    }
+
+    /**
+     * waits for completion; in case of failure rethrows the original exception without a new wrapping exception
+     * so may cause problems for reporting stack traces
+     */
+    @Override
+    public Promise<V> syncUninterruptibly()
+    {
+        super.syncUninterruptibly();
+        return this;
+    }
+
+    @Override
+    public SyncPromise<V> addListener(GenericFutureListener<? extends Future<? super V>> listener)
+    {
+        super.addListener(listener);
+        return this;
+    }
+
+    @Override
+    public SyncPromise<V> addListeners(GenericFutureListener<? extends Future<? super V>>... listeners)
+    {
+        super.addListeners(listeners);
+        return this;
+    }
+
+    @Override
+    public SyncPromise<V> removeListener(GenericFutureListener<? extends Future<? super V>> listener)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public SyncPromise<V> removeListeners(GenericFutureListener<? extends Future<? super V>>... listeners)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public SyncPromise<V> addCallback(FutureCallback<? super V> callback)
+    {
+        super.addCallback(callback);
+        return this;
+    }
+
+    @Override
+    public SyncPromise<V> addCallback(FutureCallback<? super V> callback, Executor executor)
+    {
+        super.addCallback(callback, executor);
+        return this;
+    }
+
+    @Override
+    public SyncPromise<V> addCallback(Consumer<? super V> onSuccess, Consumer<? super Throwable> onFailure)
+    {
+        super.addCallback(onSuccess, onFailure);
+        return this;
+    }
+
+    /**
+     * Wait for this promise to complete
+     * @throws InterruptedException if interrupted
+     */
+    @Override
+    public SyncPromise<V> await() throws InterruptedException
+    {
+        super.await();
+        return this;
+    }
+
+    /**
+     * Wait uninterruptibly for this promise to complete
+     */
+    @Override
+    public SyncPromise<V> awaitUninterruptibly()
+    {
+        super.awaitUninterruptibly();
+        return this;
+    }
+
+    /**
+     * Wait for this promise to complete, throwing any interrupt as an UncheckedInterruptedException
+     * @throws UncheckedInterruptedException if interrupted
+     */
+    @Override
+    public SyncPromise<V> awaitThrowUncheckedOnInterrupt() throws UncheckedInterruptedException
+    {
+        super.awaitThrowUncheckedOnInterrupt();
+        return this;
+    }
+}
+
diff --git a/src/java/org/apache/cassandra/utils/concurrent/Threads.java b/src/java/org/apache/cassandra/utils/concurrent/Threads.java
new file mode 100644
index 0000000..f02519a
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/Threads.java
@@ -0,0 +1,140 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.BinaryOperator;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collector;
+import java.util.stream.Stream;
+
+public class Threads
+{
+    public static class StackTraceCombiner implements Collector<StackTraceElement, StringBuilder, String>, Supplier<StringBuilder>, Function<StringBuilder, String>
+    {
+        final boolean printBriefPackages;
+        final String prefix;
+        final String delimiter;
+        final String suffix;
+
+        public StackTraceCombiner(boolean printBriefPackages, String prefix, String delimiter, String suffix)
+        {
+            this.printBriefPackages = printBriefPackages;
+            this.prefix = prefix;
+            this.delimiter = delimiter;
+            this.suffix = suffix;
+        }
+
+        public Supplier<StringBuilder> supplier()
+        {
+
+            return this;
+        }
+
+        public BiConsumer<StringBuilder, StackTraceElement> accumulator()
+        {
+            return (sb, ste) ->
+            {
+                if (sb.length() > prefix.length())
+                    sb.append(delimiter);
+
+                String className = ste.getClassName();
+
+                if (printBriefPackages)
+                {
+                    int afterPrevDot = 0;
+                    while (true)
+                    {
+                        int dot = className.indexOf('.', afterPrevDot);
+                        if (dot < 0)
+                            break;
+
+                        sb.append(className.charAt(afterPrevDot));
+                        sb.append('.');
+                        afterPrevDot = dot + 1;
+                    }
+                    sb.append(className, afterPrevDot, className.length());
+                }
+                else
+                {
+                    sb.append(className);
+                }
+                sb.append('.');
+                sb.append(ste.getMethodName());
+                sb.append(':');
+                sb.append(ste.getLineNumber());
+            };
+        }
+
+        public BinaryOperator<StringBuilder> combiner()
+        {
+            return (sb1, sb2) -> sb1.append("; ").append(sb2);
+        }
+
+        public Function<StringBuilder, String> finisher()
+        {
+            return this;
+        }
+
+        public Set<Characteristics> characteristics()
+        {
+            return Collections.emptySet();
+        }
+
+        public StringBuilder get()
+        {
+            return new StringBuilder(prefix);
+        }
+
+        public String apply(StringBuilder finish)
+        {
+            finish.append(suffix);
+            return finish.toString();
+        }
+    }
+
+    public static String prettyPrintStackTrace(Thread thread, boolean printBriefPackages, String delimiter)
+    {
+        return prettyPrint(thread.getStackTrace(), printBriefPackages, delimiter);
+    }
+
+    public static String prettyPrintStackTrace(Thread thread, boolean printBriefPackages, String prefix, String delimiter, String suffix)
+    {
+        return prettyPrint(thread.getStackTrace(), printBriefPackages, prefix, delimiter, suffix);
+    }
+
+    public static String prettyPrint(StackTraceElement[] st, boolean printBriefPackages, String delimiter)
+    {
+        return prettyPrint(st, printBriefPackages, "", delimiter, "");
+    }
+
+    public static String prettyPrint(StackTraceElement[] st, boolean printBriefPackages, String prefix, String delimiter, String suffix)
+    {
+        return Stream.of(st).collect(new StackTraceCombiner(printBriefPackages, prefix, delimiter, suffix));
+    }
+
+    public static String prettyPrint(Stream<StackTraceElement> st, boolean printBriefPackages, String prefix, String delimiter, String suffix)
+    {
+        return st.collect(new StackTraceCombiner(printBriefPackages, prefix, delimiter, suffix));
+    }
+
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/UncheckedInterruptedException.java b/src/java/org/apache/cassandra/utils/concurrent/UncheckedInterruptedException.java
new file mode 100644
index 0000000..d7248e8
--- /dev/null
+++ b/src/java/org/apache/cassandra/utils/concurrent/UncheckedInterruptedException.java
@@ -0,0 +1,38 @@
+/*
+ * 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.utils.concurrent;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Unchecked {@link InterruptedException}, to be thrown in places where an interrupt is unexpected
+ */
+@Shared(scope = SIMULATION)
+public class UncheckedInterruptedException extends RuntimeException
+{
+    public UncheckedInterruptedException()
+    {
+    }
+    public UncheckedInterruptedException(InterruptedException cause)
+    {
+        super(cause);
+    }
+}
diff --git a/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java b/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java
index 3647623..e9dcdf8 100644
--- a/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java
+++ b/src/java/org/apache/cassandra/utils/concurrent/WaitQueue.java
@@ -23,8 +23,15 @@
 import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
 import java.util.concurrent.locks.LockSupport;
 import java.util.function.BooleanSupplier;
+import java.util.function.Consumer;
 
-import com.codahale.metrics.Timer;
+import org.apache.cassandra.utils.Intercept;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.Awaitable.AbstractAwaitable;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
 
 /**
  * <p>A relatively easy to use utility for general purpose thread signalling.</p>
@@ -67,131 +74,12 @@
  * to be met that we no longer need.
  * <p>5. This scheme is not fair</p>
  * <p>6. Only the thread that calls register() may call await()</p>
+ *
+ * TODO: this class should not be backed by CLQ (should use an intrusive linked-list with lower overhead)
  */
-public final class WaitQueue
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface WaitQueue
 {
-
-    private static final int CANCELLED = -1;
-    private static final int SIGNALLED = 1;
-    private static final int NOT_SET = 0;
-
-    private static final AtomicIntegerFieldUpdater signalledUpdater = AtomicIntegerFieldUpdater.newUpdater(RegisteredSignal.class, "state");
-
-    // the waiting signals
-    private final ConcurrentLinkedQueue<RegisteredSignal> queue = new ConcurrentLinkedQueue<>();
-
-    /**
-     * The calling thread MUST be the thread that uses the signal
-     * @return                                x
-     */
-    public Signal register()
-    {
-        RegisteredSignal signal = new RegisteredSignal();
-        queue.add(signal);
-        return signal;
-    }
-
-    /**
-     * The calling thread MUST be the thread that uses the signal.
-     * If the Signal is waited on, context.stop() will be called when the wait times out, the Signal is signalled,
-     * or the waiting thread is interrupted.
-     * @return
-     */
-    public Signal register(Timer.Context context)
-    {
-        assert context != null;
-        RegisteredSignal signal = new TimedSignal(context);
-        queue.add(signal);
-        return signal;
-    }
-
-    /**
-     * Signal one waiting thread
-     */
-    public boolean signal()
-    {
-        if (!hasWaiters())
-            return false;
-        while (true)
-        {
-            RegisteredSignal s = queue.poll();
-            if (s == null || s.signal() != null)
-                return s != null;
-        }
-    }
-
-    /**
-     * Signal all waiting threads
-     */
-    public void signalAll()
-    {
-        if (!hasWaiters())
-            return;
-
-        // to avoid a race where the condition is not met and the woken thread managed to wait on the queue before
-        // we finish signalling it all, we pick a random thread we have woken-up and hold onto it, so that if we encounter
-        // it again we know we're looping. We reselect a random thread periodically, progressively less often.
-        // the "correct" solution to this problem is to use a queue that permits snapshot iteration, but this solution is sufficient
-        int i = 0, s = 5;
-        Thread randomThread = null;
-        Iterator<RegisteredSignal> iter = queue.iterator();
-        while (iter.hasNext())
-        {
-            RegisteredSignal signal = iter.next();
-            Thread signalled = signal.signal();
-
-            if (signalled != null)
-            {
-                if (signalled == randomThread)
-                    break;
-
-                if (++i == s)
-                {
-                    randomThread = signalled;
-                    s <<= 1;
-                }
-            }
-
-            iter.remove();
-        }
-    }
-
-    private void cleanUpCancelled()
-    {
-        // TODO: attempt to remove the cancelled from the beginning only (need atomic cas of head)
-        Iterator<RegisteredSignal> iter = queue.iterator();
-        while (iter.hasNext())
-        {
-            RegisteredSignal s = iter.next();
-            if (s.isCancelled())
-                iter.remove();
-        }
-    }
-
-    public boolean hasWaiters()
-    {
-        return !queue.isEmpty();
-    }
-
-    /**
-     * Return how many threads are waiting
-     * @return
-     */
-    public int getWaiting()
-    {
-        if (!hasWaiters())
-            return 0;
-        Iterator<RegisteredSignal> iter = queue.iterator();
-        int count = 0;
-        while (iter.hasNext())
-        {
-            Signal next = iter.next();
-            if (!next.isCancelled())
-                count++;
-        }
-        return count;
-    }
-
     /**
      * A Signal is a one-time-use mechanism for a thread to wait for notification that some condition
      * state has transitioned that it may be interested in (and hence should check if it is).
@@ -207,14 +95,8 @@
      * thread that registered itself with WaitQueue(s) to obtain the underlying RegisteredSignal(s);
      * only the owning thread should use a Signal.
      */
-    public static interface Signal
+    public static interface Signal extends Condition
     {
-
-        /**
-         * @return true if signalled; once true, must be discarded by the owning thread.
-         */
-        public boolean isSignalled();
-
         /**
          * @return true if cancelled; once cancelled, must be discarded by the owning thread.
          */
@@ -238,324 +120,318 @@
          * and if signalled propagates the signal to another waiting thread
          */
         public abstract void cancel();
-
-        /**
-         * Wait, without throwing InterruptedException, until signalled. On exit isSignalled() must be true.
-         * If the thread is interrupted in the meantime, the interrupted flag will be set.
-         */
-        public void awaitUninterruptibly();
-
-        /**
-         * Wait until signalled, or throw an InterruptedException if interrupted before this happens.
-         * On normal exit isSignalled() must be true; however if InterruptedException is thrown isCancelled()
-         * will be true.
-         * @throws InterruptedException
-         */
-        public void await() throws InterruptedException;
-
-        /**
-         * Wait until signalled, or the provided time is reached, or the thread is interrupted. If signalled,
-         * isSignalled() will be true on exit, and the method will return true; if timedout, the method will return
-         * false and isCancelled() will be true; if interrupted an InterruptedException will be thrown and isCancelled()
-         * will be true.
-         * @param nanos System.nanoTime() to wait until
-         * @return true if signalled, false if timed out
-         * @throws InterruptedException
-         */
-        public boolean awaitUntil(long nanos) throws InterruptedException;
-
-        /**
-         * Wait until signalled, or the provided time is reached, or the thread is interrupted. If signalled,
-         * isSignalled() will be true on exit, and the method will return true; if timedout, the method will return
-         * false and isCancelled() will be true
-         * @param nanos System.nanoTime() to wait until
-         * @return true if signalled, false if timed out
-         */
-        public boolean awaitUntilUninterruptibly(long nanos);
     }
 
     /**
-     * An abstract signal implementation
+     * The calling thread MUST be the thread that uses the signal
      */
-    public static abstract class AbstractSignal implements Signal
+    public Signal register();
+
+    /**
+     * The calling thread MUST be the thread that uses the signal.
+     * If the Signal is waited on, context.stop() will be called when the wait times out, the Signal is signalled,
+     * or the waiting thread is interrupted.
+     */
+    public <V> Signal register(V supplyOnDone, Consumer<V> receiveOnDone);
+
+    /**
+     * Signal one waiting thread
+     */
+    public boolean signal();
+
+    /**
+     * Signal all waiting threads
+     */
+    public void signalAll();
+
+    /** getWaiting() > 0 */
+    public boolean hasWaiters();
+
+    /** Return how many threads are waiting */
+    public int getWaiting();
+
+    /**
+     * Factory method used to capture and redirect instantiations for simulation
+     */
+    @Intercept
+    public static WaitQueue newWaitQueue()
     {
-        public void awaitUninterruptibly()
+        return new Standard();
+    }
+
+    class Standard implements WaitQueue
+    {
+        private static final int CANCELLED = -1;
+        private static final int SIGNALLED = 1;
+        private static final int NOT_SET = 0;
+
+        private static final AtomicIntegerFieldUpdater<RegisteredSignal> signalledUpdater = AtomicIntegerFieldUpdater.newUpdater(RegisteredSignal.class, "state");
+
+        // the waiting signals
+        private final ConcurrentLinkedQueue<RegisteredSignal> queue = new ConcurrentLinkedQueue<>();
+
+        protected Standard() {}
+
+        /**
+         * The calling thread MUST be the thread that uses the signal
+         * @return                                x
+         */
+        public Signal register()
         {
-            boolean interrupted = false;
-            while (!isSignalled())
+            RegisteredSignal signal = new RegisteredSignal();
+            queue.add(signal);
+            return signal;
+        }
+
+        /**
+         * The calling thread MUST be the thread that uses the signal.
+         * If the Signal is waited on, context.stop() will be called when the wait times out, the Signal is signalled,
+         * or the waiting thread is interrupted.
+         */
+        public <V> Signal register(V supplyOnDone, Consumer<V> receiveOnDone)
+        {
+            RegisteredSignal signal = new SignalWithListener<>(supplyOnDone, receiveOnDone);
+            queue.add(signal);
+            return signal;
+        }
+
+        /**
+         * Signal one waiting thread
+         */
+        public boolean signal()
+        {
+            while (true)
+            {
+                RegisteredSignal s = queue.poll();
+                if (s == null || s.doSignal() != null)
+                    return s != null;
+            }
+        }
+
+        /**
+         * Signal all waiting threads
+         */
+        public void signalAll()
+        {
+            if (!hasWaiters())
+                return;
+
+            // to avoid a race where the condition is not met and the woken thread managed to wait on the queue before
+            // we finish signalling it all, we pick a random thread we have woken-up and hold onto it, so that if we encounter
+            // it again we know we're looping. We reselect a random thread periodically, progressively less often.
+            // the "correct" solution to this problem is to use a queue that permits snapshot iteration, but this solution is sufficient
+            // TODO: this is only necessary because we use CLQ - which is only for historical any-NIH reasons
+            int i = 0, s = 5;
+            Thread randomThread = null;
+            Iterator<RegisteredSignal> iter = queue.iterator();
+            while (iter.hasNext())
+            {
+                RegisteredSignal signal = iter.next();
+                Thread signalled = signal.doSignal();
+
+                if (signalled != null)
+                {
+                    if (signalled == randomThread)
+                        break;
+
+                    if (++i == s)
+                    {
+                        randomThread = signalled;
+                        s <<= 1;
+                    }
+                }
+
+                iter.remove();
+            }
+        }
+
+        private void cleanUpCancelled()
+        {
+            // TODO: attempt to remove the cancelled from the beginning only (need atomic cas of head)
+            queue.removeIf(RegisteredSignal::isCancelled);
+        }
+
+        public boolean hasWaiters()
+        {
+            return !queue.isEmpty();
+        }
+
+        /**
+         * @return how many threads are waiting
+         */
+        public int getWaiting()
+        {
+            if (!hasWaiters())
+                return 0;
+            Iterator<RegisteredSignal> iter = queue.iterator();
+            int count = 0;
+            while (iter.hasNext())
+            {
+                Signal next = iter.next();
+                if (!next.isCancelled())
+                    count++;
+            }
+            return count;
+        }
+
+        /**
+         * An abstract signal implementation
+         *
+         * TODO: use intrusive linked list
+         */
+        public static abstract class AbstractSignal extends AbstractAwaitable implements Signal
+        {
+            public Signal await() throws InterruptedException
+            {
+                while (!isSignalled())
+                {
+                    checkInterrupted();
+                    LockSupport.park();
+                }
+                checkAndClear();
+                return this;
+            }
+
+            public boolean awaitUntil(long nanoTimeDeadline) throws InterruptedException
+            {
+                long now;
+                while (nanoTimeDeadline > (now = nanoTime()) && !isSignalled())
+                {
+                    checkInterrupted();
+                    long delta = nanoTimeDeadline - now;
+                    LockSupport.parkNanos(delta);
+                }
+                return checkAndClear();
+            }
+
+            private void checkInterrupted() throws InterruptedException
             {
                 if (Thread.interrupted())
-                    interrupted = true;
-                LockSupport.park();
+                {
+                    cancel();
+                    throw new InterruptedException();
+                }
             }
-            if (interrupted)
-                Thread.currentThread().interrupt();
-            checkAndClear();
-        }
-
-        public void await() throws InterruptedException
-        {
-            while (!isSignalled())
-            {
-                checkInterrupted();
-                LockSupport.park();
-            }
-            checkAndClear();
-        }
-
-        public boolean awaitUntil(long until) throws InterruptedException
-        {
-            long now;
-            while (until > (now = System.nanoTime()) && !isSignalled())
-            {
-                checkInterrupted();
-                long delta = until - now;
-                LockSupport.parkNanos(delta);
-            }
-            return checkAndClear();
-        }
-
-        public boolean awaitUntilUninterruptibly(long until)
-        {
-            long now;
-            while (until > (now = System.nanoTime()) && !isSignalled())
-            {
-                long delta = until - now;
-                LockSupport.parkNanos(delta);
-            }
-            return checkAndClear();
-        }
-
-        private void checkInterrupted() throws InterruptedException
-        {
-            if (Thread.interrupted())
-            {
-                cancel();
-                throw new InterruptedException();
-            }
-        }
-    }
-
-    /**
-     * A signal registered with this WaitQueue
-     */
-    private class RegisteredSignal extends AbstractSignal
-    {
-        private volatile Thread thread = Thread.currentThread();
-        volatile int state;
-
-        public boolean isSignalled()
-        {
-            return state == SIGNALLED;
-        }
-
-        public boolean isCancelled()
-        {
-            return state == CANCELLED;
-        }
-
-        public boolean isSet()
-        {
-            return state != NOT_SET;
-        }
-
-        private Thread signal()
-        {
-            if (!isSet() && signalledUpdater.compareAndSet(this, NOT_SET, SIGNALLED))
-            {
-                Thread thread = this.thread;
-                LockSupport.unpark(thread);
-                this.thread = null;
-                return thread;
-            }
-            return null;
-        }
-
-        public boolean checkAndClear()
-        {
-            if (!isSet() && signalledUpdater.compareAndSet(this, NOT_SET, CANCELLED))
-            {
-                thread = null;
-                cleanUpCancelled();
-                return false;
-            }
-            // must now be signalled assuming correct API usage
-            return true;
         }
 
         /**
-         * Should only be called by the registered thread. Indicates the signal can be retired,
-         * and if signalled propagates the signal to another waiting thread
+         * A signal registered with this WaitQueue
          */
-        public void cancel()
+        private class RegisteredSignal extends AbstractSignal
         {
-            if (isCancelled())
-                return;
-            if (!signalledUpdater.compareAndSet(this, NOT_SET, CANCELLED))
+            private volatile Thread thread = Thread.currentThread();
+            volatile int state;
+
+            public boolean isSignalled()
             {
-                // must already be signalled - switch to cancelled and
-                state = CANCELLED;
-                // propagate the signal
-                WaitQueue.this.signal();
+                return state == SIGNALLED;
             }
-            thread = null;
-            cleanUpCancelled();
-        }
-    }
 
-    /**
-     * A RegisteredSignal that stores a TimerContext, and stops the timer when either cancelled or
-     * finished waiting. i.e. if the timer is started when the signal is registered it tracks the
-     * time in between registering and invalidating the signal.
-     */
-    private final class TimedSignal extends RegisteredSignal
-    {
-        private final Timer.Context context;
-
-        private TimedSignal(Timer.Context context)
-        {
-            this.context = context;
-        }
-
-        @Override
-        public boolean checkAndClear()
-        {
-            context.stop();
-            return super.checkAndClear();
-        }
-
-        @Override
-        public void cancel()
-        {
-            if (!isCancelled())
+            public boolean isCancelled()
             {
-                context.stop();
-                super.cancel();
+                return state == CANCELLED;
+            }
+
+            public boolean isSet()
+            {
+                return state != NOT_SET;
+            }
+
+            private Thread doSignal()
+            {
+                if (!isSet() && signalledUpdater.compareAndSet(this, NOT_SET, SIGNALLED))
+                {
+                    Thread thread = this.thread;
+                    LockSupport.unpark(thread);
+                    this.thread = null;
+                    return thread;
+                }
+                return null;
+            }
+
+            public void signal()
+            {
+                doSignal();
+            }
+
+            public boolean checkAndClear()
+            {
+                if (!isSet() && signalledUpdater.compareAndSet(this, NOT_SET, CANCELLED))
+                {
+                    thread = null;
+                    cleanUpCancelled();
+                    return false;
+                }
+                // must now be signalled assuming correct API usage
+                return true;
+            }
+
+            /**
+             * Should only be called by the registered thread. Indicates the signal can be retired,
+             * and if signalled propagates the signal to another waiting thread
+             */
+            public void cancel()
+            {
+                if (isCancelled())
+                    return;
+                if (!signalledUpdater.compareAndSet(this, NOT_SET, CANCELLED))
+                {
+                    // must already be signalled - switch to cancelled and
+                    state = CANCELLED;
+                    // propagate the signal
+                    WaitQueue.Standard.this.signal();
+                }
+                thread = null;
+                cleanUpCancelled();
             }
         }
-    }
 
-    /**
-     * An abstract signal wrapping multiple delegate signals
-     */
-    private abstract static class MultiSignal extends AbstractSignal
-    {
-        final Signal[] signals;
-        protected MultiSignal(Signal[] signals)
+        /**
+         * A RegisteredSignal that stores a TimerContext, and stops the timer when either cancelled or
+         * finished waiting. i.e. if the timer is started when the signal is registered it tracks the
+         * time in between registering and invalidating the signal.
+         */
+        private final class SignalWithListener<V> extends RegisteredSignal
         {
-            this.signals = signals;
+            private final V supplyOnDone;
+            private final Consumer<V> receiveOnDone;
+
+            private SignalWithListener(V supplyOnDone, Consumer<V> receiveOnDone)
+            {
+                this.receiveOnDone = receiveOnDone;
+                this.supplyOnDone = supplyOnDone;
+            }
+
+
+            @Override
+            public boolean checkAndClear()
+            {
+                receiveOnDone.accept(supplyOnDone);
+                return super.checkAndClear();
+            }
+
+            @Override
+            public void cancel()
+            {
+                if (!isCancelled())
+                {
+                    receiveOnDone.accept(supplyOnDone);
+                    super.cancel();
+                }
+            }
         }
-
-        public boolean isCancelled()
-        {
-            for (Signal signal : signals)
-                if (!signal.isCancelled())
-                    return false;
-            return true;
-        }
-
-        public boolean checkAndClear()
-        {
-            for (Signal signal : signals)
-                signal.checkAndClear();
-            return isSignalled();
-        }
-
-        public void cancel()
-        {
-            for (Signal signal : signals)
-                signal.cancel();
-        }
-    }
-
-    /**
-     * A Signal that wraps multiple Signals and returns when any single one of them would have returned
-     */
-    private static class AnySignal extends MultiSignal
-    {
-        protected AnySignal(Signal ... signals)
-        {
-            super(signals);
-        }
-
-        public boolean isSignalled()
-        {
-            for (Signal signal : signals)
-                if (signal.isSignalled())
-                    return true;
-            return false;
-        }
-
-        public boolean isSet()
-        {
-            for (Signal signal : signals)
-                if (signal.isSet())
-                    return true;
-            return false;
-        }
-    }
-
-    /**
-     * A Signal that wraps multiple Signals and returns when all of them would have finished returning
-     */
-    private static class AllSignal extends MultiSignal
-    {
-        protected AllSignal(Signal ... signals)
-        {
-            super(signals);
-        }
-
-        public boolean isSignalled()
-        {
-            for (Signal signal : signals)
-                if (!signal.isSignalled())
-                    return false;
-            return true;
-        }
-
-        public boolean isSet()
-        {
-            for (Signal signal : signals)
-                if (!signal.isSet())
-                    return false;
-            return true;
-        }
-    }
-
-    /**
-     * @param signals
-     * @return a signal that returns only when any of the provided signals would have returned
-     */
-    public static Signal any(Signal ... signals)
-    {
-        return new AnySignal(signals);
-    }
-
-    /**
-     * @param signals
-     * @return a signal that returns only when all provided signals would have returned
-     */
-    public static Signal all(Signal ... signals)
-    {
-        return new AllSignal(signals);
     }
 
     /**
      * Loops waiting on the supplied condition and WaitQueue and will not return until the condition is true
      */
-    public static void waitOnCondition(BooleanSupplier condition, WaitQueue queue)
+    public static void waitOnCondition(BooleanSupplier condition, WaitQueue queue) throws InterruptedException
     {
         while (!condition.getAsBoolean())
         {
             Signal s = queue.register();
-            if (!condition.getAsBoolean())
-            {
-                s.awaitUninterruptibly();
-            }
-            else
-            {
-                s.cancel();
-            }
+            if (!condition.getAsBoolean()) s.await();
+            else s.cancel();
         }
     }
 }
diff --git a/src/java/org/apache/cassandra/utils/concurrent/WeightedQueue.java b/src/java/org/apache/cassandra/utils/concurrent/WeightedQueue.java
index 3a6505e..b1def45 100644
--- a/src/java/org/apache/cassandra/utils/concurrent/WeightedQueue.java
+++ b/src/java/org/apache/cassandra/utils/concurrent/WeightedQueue.java
@@ -22,14 +22,15 @@
 import java.util.Iterator;
 import java.util.Objects;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.base.Preconditions;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
+import static org.apache.cassandra.utils.concurrent.Semaphore.newSemaphore;
+
 /**
  * Weighted queue is a wrapper around any blocking queue that turns it into a blocking weighted queue. The queue
  * will weigh each element being added and removed. Adding to the queue is blocked if adding would violate
@@ -262,7 +263,7 @@
 
     public WeightedQueue(int maxWeight)
     {
-        this(maxWeight, new LinkedBlockingQueue<T>(), NATURAL_WEIGHER);
+        this(maxWeight, newBlockingQueue(), NATURAL_WEIGHER);
     }
 
     public WeightedQueue(int maxWeight, BlockingQueue<T> queue, Weigher<T> weigher)
@@ -273,7 +274,7 @@
         this.maxWeight = maxWeight;
         this.queue = queue;
         this.weigher = weigher;
-        availableWeight = new Semaphore(maxWeight);
+        availableWeight = newSemaphore(maxWeight);
     }
 
     boolean acquireWeight(T weighable, long timeout, TimeUnit unit) throws InterruptedException
diff --git a/src/java/org/apache/cassandra/utils/memory/BufferPool.java b/src/java/org/apache/cassandra/utils/memory/BufferPool.java
index a92f637..b9009bc 100644
--- a/src/java/org/apache/cassandra/utils/memory/BufferPool.java
+++ b/src/java/org/apache/cassandra/utils/memory/BufferPool.java
@@ -38,7 +38,7 @@
 import com.google.common.annotations.VisibleForTesting;
 
 import net.nicoulaj.compilecommand.annotations.Inline;
-import org.apache.cassandra.concurrent.InfiniteLoopExecutor;
+import org.apache.cassandra.concurrent.Shutdownable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -48,11 +48,15 @@
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.metrics.BufferPoolMetrics;
 import org.apache.cassandra.utils.NoSpamLogger;
+import org.apache.cassandra.utils.Shared;
 import org.apache.cassandra.utils.concurrent.Ref;
 
 import static com.google.common.collect.ImmutableList.of;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe.UNSAFE;
 import static org.apache.cassandra.utils.ExecutorUtils.*;
 import static org.apache.cassandra.utils.FBUtilities.prettyPrintMemory;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
 import static org.apache.cassandra.utils.memory.MemoryUtil.isExactlyDirect;
 
 /**
@@ -129,6 +133,7 @@
     private static final ByteBuffer EMPTY_BUFFER = ByteBuffer.allocateDirect(0);
 
     private volatile Debug debug = Debug.NO_OP;
+    private volatile DebugLeaks debugLeaks = DebugLeaks.NO_OP;
 
     protected final String name;
     protected final BufferPoolMetrics metrics;
@@ -174,7 +179,7 @@
     private final Set<LocalPoolRef> localPoolReferences = Collections.newSetFromMap(new ConcurrentHashMap<>());
 
     private final ReferenceQueue<Object> localPoolRefQueue = new ReferenceQueue<>();
-    private final InfiniteLoopExecutor localPoolCleaner;
+    private final Shutdownable localPoolCleaner;
 
     public BufferPool(String name, long memoryUsageThreshold, boolean recyclePartially)
     {
@@ -184,7 +189,7 @@
         this.globalPool = new GlobalPool();
         this.metrics = new BufferPoolMetrics(name, this);
         this.recyclePartially = recyclePartially;
-        this.localPoolCleaner = new InfiniteLoopExecutor("LocalPool-Cleaner-" + name, this::cleanupOneReference).start();
+        this.localPoolCleaner = executorFactory().infiniteLoop("LocalPool-Cleaner-" + name, this::cleanupOneReference, UNSAFE);
     }
 
     /**
@@ -331,10 +336,19 @@
         void recyclePartial(Chunk chunk);
     }
 
-    public void debug(Debug setDebug)
+    @Shared(scope = SIMULATION)
+    public interface DebugLeaks
     {
-        assert setDebug != null;
-        this.debug = setDebug;
+        public static DebugLeaks NO_OP = () -> {};
+        void leak();
+    }
+
+    public void debug(Debug newDebug, DebugLeaks newDebugLeaks)
+    {
+        if (newDebug != null)
+            this.debug = newDebug;
+        if (newDebugLeaks != null)
+            this.debugLeaks = newDebugLeaks;
     }
 
     interface Recycler
@@ -1069,6 +1083,7 @@
         Object obj = localPoolRefQueue.remove(100);
         if (obj instanceof LocalPoolRef)
         {
+            debugLeaks.leak();
             ((LocalPoolRef) obj).release();
             localPoolReferences.remove(obj);
         }
@@ -1578,8 +1593,7 @@
     @VisibleForTesting
     public void shutdownLocalCleaner(long timeout, TimeUnit unit) throws InterruptedException, TimeoutException
     {
-        shutdownNow(of(localPoolCleaner));
-        awaitTermination(timeout, unit, of(localPoolCleaner));
+        shutdownAndWait(timeout, unit, of(localPoolCleaner));
     }
 
     @VisibleForTesting
diff --git a/src/java/org/apache/cassandra/utils/memory/BufferPools.java b/src/java/org/apache/cassandra/utils/memory/BufferPools.java
index 736e1cd..5d80881 100644
--- a/src/java/org/apache/cassandra/utils/memory/BufferPools.java
+++ b/src/java/org/apache/cassandra/utils/memory/BufferPools.java
@@ -35,13 +35,13 @@
     /**
      * Used by chunk cache to store decompressed data and buffers may be held by chunk cache for arbitrary period.
      */
-    private static final long FILE_MEMORY_USAGE_THRESHOLD = DatabaseDescriptor.getFileCacheSizeInMB() * 1024L * 1024L;
+    private static final long FILE_MEMORY_USAGE_THRESHOLD = DatabaseDescriptor.getFileCacheSizeInMiB() * 1024L * 1024L;
     private static final BufferPool CHUNK_CACHE_POOL = new BufferPool("chunk-cache", FILE_MEMORY_USAGE_THRESHOLD, true);
 
     /**
      * Used by client-server or inter-node requests, buffers should be released immediately after use.
      */
-    private static final long NETWORKING_MEMORY_USAGE_THRESHOLD = DatabaseDescriptor.getNetworkingCacheSizeInMB() * 1024L * 1024L;
+    private static final long NETWORKING_MEMORY_USAGE_THRESHOLD = DatabaseDescriptor.getNetworkingCacheSizeInMiB() * 1024L * 1024L;
     private static final BufferPool NETWORKING_POOL = new BufferPool("networking", NETWORKING_MEMORY_USAGE_THRESHOLD, false);
 
     static
diff --git a/src/java/org/apache/cassandra/utils/memory/HeapPool.java b/src/java/org/apache/cassandra/utils/memory/HeapPool.java
index b625b60..532d11f 100644
--- a/src/java/org/apache/cassandra/utils/memory/HeapPool.java
+++ b/src/java/org/apache/cassandra/utils/memory/HeapPool.java
@@ -20,18 +20,24 @@
 
 import java.nio.ByteBuffer;
 
+import com.google.common.annotations.VisibleForTesting;
+
+import org.apache.cassandra.utils.Shared;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 
-import com.google.common.annotations.VisibleForTesting;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
 
 public class HeapPool extends MemtablePool
 {
+    private static final EnsureOnHeap ENSURE_NOOP = new EnsureOnHeap.NoOp();
+
     public HeapPool(long maxOnHeapMemory, float cleanupThreshold, MemtableCleaner cleaner)
     {
         super(maxOnHeapMemory, 0, cleanupThreshold, cleaner);
     }
 
-    public MemtableAllocator newAllocator()
+    public MemtableAllocator newAllocator(String table)
     {
         return new Allocator(this);
     }
@@ -39,8 +45,6 @@
     @VisibleForTesting
     public static class Allocator extends MemtableBufferAllocator
     {
-        private static final EnsureOnHeap ENSURE_NOOP = new EnsureOnHeap.NoOp();
-
         @VisibleForTesting
         public Allocator(HeapPool pool)
         {
@@ -63,4 +67,80 @@
             return allocator(opGroup);
         }
     }
+
+    public static class Logged extends MemtablePool
+    {
+        @Shared(scope = SIMULATION)
+        public interface Listener
+        {
+            public void accept(long size, String table);
+        }
+
+        private static Listener onAllocated = (i, table) -> {};
+
+        class LoggedSubPool extends SubPool
+        {
+            public LoggedSubPool(long limit, float cleanThreshold)
+            {
+                super(limit, cleanThreshold);
+            }
+
+            public MemtableAllocator.SubAllocator newAllocator(String table)
+            {
+                return new MemtableAllocator.SubAllocator(this)
+                {
+                    public void allocate(long size, OpOrder.Group opGroup)
+                    {
+                        onAllocated.accept(size, table);
+                        super.allocate(size, opGroup);
+                    }
+                };
+            }
+        }
+
+        public Logged(long maxOnHeapMemory, float cleanupThreshold, MemtableCleaner cleaner)
+        {
+            super(maxOnHeapMemory, 0, cleanupThreshold, cleaner);
+        }
+
+        public MemtableAllocator newAllocator(String table)
+        {
+            return new Allocator(this, table);
+        }
+
+        private static class Allocator extends MemtableBufferAllocator
+        {
+            Allocator(Logged pool, String table)
+            {
+                super(((LoggedSubPool) pool.onHeap).newAllocator(table), ((LoggedSubPool) pool.offHeap).newAllocator(table));
+            }
+
+            public ByteBuffer allocate(int size, OpOrder.Group opGroup)
+            {
+                super.onHeap().allocate(size, opGroup);
+                return ByteBuffer.allocate(size);
+            }
+
+            @Override
+            public EnsureOnHeap ensureOnHeap()
+            {
+                return ENSURE_NOOP;
+            }
+
+            public Cloner cloner(OpOrder.Group opGroup)
+            {
+                return allocator(opGroup);
+            }
+        }
+
+        SubPool getSubPool(long limit, float cleanThreshold)
+        {
+            return new LoggedSubPool(limit, cleanThreshold);
+        }
+
+        public static void setListener(Listener listener)
+        {
+            onAllocated = listener;
+        }
+    }
 }
diff --git a/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java b/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java
index 42ae904..139d4a0 100644
--- a/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java
+++ b/src/java/org/apache/cassandra/utils/memory/MemtableAllocator.java
@@ -23,6 +23,8 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.codahale.metrics.Timer;
+
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.concurrent.WaitQueue;
 
@@ -100,7 +102,7 @@
     }
 
     /** Mark the BB as unused, permitting it to be reclaimed */
-    public static final class SubAllocator
+    public static class SubAllocator
     {
         // the tracker we are owning memory from
         private final MemtablePool.SubPool parent;
@@ -180,19 +182,17 @@
                     allocated(size);
                     return;
                 }
-                WaitQueue.Signal signal = opGroup.isBlockingSignal(parent.hasRoom().register(parent.blockedTimerContext()));
+                WaitQueue.Signal signal = parent.hasRoom().register(parent.blockedTimerContext(), Timer.Context::stop);
+                opGroup.notifyIfBlocking(signal);
                 boolean allocated = parent.tryAllocate(size);
-                if (allocated || opGroup.isBlocking())
+                if (allocated)
                 {
                     signal.cancel();
-                    if (allocated) // if we allocated, take ownership
-                        acquired(size);
-                    else // otherwise we're blocking so we're permitted to overshoot our constraints, to just allocate without blocking
-                        allocated(size);
+                    acquired(size);
                     return;
                 }
                 else
-                    signal.awaitUninterruptibly();
+                    signal.awaitThrowUncheckedOnInterrupt();
             }
         }
 
diff --git a/src/java/org/apache/cassandra/utils/memory/MemtableCleaner.java b/src/java/org/apache/cassandra/utils/memory/MemtableCleaner.java
index d2cb9c5..bce0421 100644
--- a/src/java/org/apache/cassandra/utils/memory/MemtableCleaner.java
+++ b/src/java/org/apache/cassandra/utils/memory/MemtableCleaner.java
@@ -18,7 +18,7 @@
 
 package org.apache.cassandra.utils.memory;
 
-import java.util.concurrent.CompletableFuture;
+import org.apache.cassandra.utils.concurrent.Future;
 
 /**
  * The cleaner is used by {@link MemtableCleanerThread} in order to reclaim space from memtables, normally
@@ -36,5 +36,5 @@
      * The future will complete with an error if the cleaning operation encounters an error.
      *
      */
-    CompletableFuture<Boolean> clean();
+    Future<Boolean> clean();
 }
\ No newline at end of file
diff --git a/src/java/org/apache/cassandra/utils/memory/MemtableCleanerThread.java b/src/java/org/apache/cassandra/utils/memory/MemtableCleanerThread.java
index f6fccc6..dbc23e5 100644
--- a/src/java/org/apache/cassandra/utils/memory/MemtableCleanerThread.java
+++ b/src/java/org/apache/cassandra/utils/memory/MemtableCleanerThread.java
@@ -24,18 +24,24 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.concurrent.InfiniteLoopExecutor;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.concurrent.Interruptible;
 import org.apache.cassandra.utils.concurrent.WaitQueue;
 
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe.SAFE;
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
 /**
  * A thread that reclaims memory from a MemtablePool on demand.  The actual reclaiming work is delegated to the
  * cleaner Runnable, e.g., FlushLargestColumnFamily
  */
-public class MemtableCleanerThread<P extends MemtablePool> extends InfiniteLoopExecutor
+public class MemtableCleanerThread<P extends MemtablePool> implements Interruptible
 {
     private static final Logger logger = LoggerFactory.getLogger(MemtableCleanerThread.class);
 
-    public static class Clean<P extends MemtablePool> implements InterruptibleRunnable
+    private static class Clean<P extends MemtablePool> implements Interruptible.SimpleTask
     {
         /** This is incremented when a cleaner is invoked and decremented when a cleaner has completed */
         final AtomicInteger numPendingTasks = new AtomicInteger(0);
@@ -47,7 +53,7 @@
         final MemtableCleaner cleaner;
 
         /** signalled whenever needsCleaning() may return true */
-        final WaitQueue wait = new WaitQueue();
+        final WaitQueue wait = newWaitQueue();
 
         private Clean(P pool, MemtableCleaner cleaner)
         {
@@ -79,7 +85,7 @@
                 if (logger.isTraceEnabled())
                     logger.trace("Invoking cleaner with {} tasks pending", numPendingTasks);
 
-                cleaner.clean().handle(this::apply);
+                cleaner.clean().addCallback(this::apply);
             }
         }
 
@@ -98,14 +104,20 @@
 
             return res;
         }
+
+        public String toString()
+        {
+            return pool.toString() + ' ' + cleaner.toString();
+        }
     }
 
+    private final Interruptible executor;
     private final Runnable trigger;
     private final Clean<P> clean;
 
     private MemtableCleanerThread(Clean<P> clean)
     {
-        super(clean.pool.getClass().getSimpleName() + "Cleaner", clean);
+        this.executor = executorFactory().infiniteLoop(clean.pool.getClass().getSimpleName() + "Cleaner", clean, SAFE);
         this.trigger = clean.wait::signal;
         this.clean = clean;
     }
@@ -127,4 +139,34 @@
     {
         return clean.numPendingTasks();
     }
+
+    @Override
+    public void interrupt()
+    {
+        executor.interrupt();
+    }
+
+    @Override
+    public boolean isTerminated()
+    {
+        return executor.isTerminated();
+    }
+
+    @Override
+    public void shutdown()
+    {
+        executor.shutdown();
+    }
+
+    @Override
+    public Object shutdownNow()
+    {
+        return executor.shutdownNow();
+    }
+
+    @Override
+    public boolean awaitTermination(long timeout, TimeUnit units) throws InterruptedException
+    {
+        return executor.awaitTermination(timeout, units);
+    }
 }
diff --git a/src/java/org/apache/cassandra/utils/memory/MemtablePool.java b/src/java/org/apache/cassandra/utils/memory/MemtablePool.java
index 966c560..26c4791 100644
--- a/src/java/org/apache/cassandra/utils/memory/MemtablePool.java
+++ b/src/java/org/apache/cassandra/utils/memory/MemtablePool.java
@@ -32,6 +32,8 @@
 import org.apache.cassandra.utils.concurrent.WaitQueue;
 import org.apache.cassandra.utils.ExecutorUtils;
 
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
+
 
 /**
  * Represents an amount of memory used for a given purpose, that can be allocated to specific tasks through
@@ -48,7 +50,7 @@
     public final Timer blockedOnAllocating;
     public final Gauge<Long> numPendingTasks;
 
-    final WaitQueue hasRoom = new WaitQueue();
+    final WaitQueue hasRoom = newWaitQueue();
 
     MemtablePool(long maxOnHeapMemory, long maxOffHeapMemory, float cleanThreshold, MemtableCleaner cleaner)
     {
@@ -57,7 +59,6 @@
         this.onHeap = getSubPool(maxOnHeapMemory, cleanThreshold);
         this.offHeap = getSubPool(maxOffHeapMemory, cleanThreshold);
         this.cleaner = getCleaner(cleaner);
-        this.cleaner.start();
         DefaultNameFactory nameFactory = new DefaultNameFactory("MemtablePool");
         blockedOnAllocating = CassandraMetricsRegistry.Metrics.timer(nameFactory.createMetricName("BlockedOnAllocation"));
         numPendingTasks = CassandraMetricsRegistry.Metrics.register(nameFactory.createMetricName("PendingFlushTasks"),
@@ -80,7 +81,7 @@
         ExecutorUtils.shutdownNowAndWait(timeout, unit, cleaner);
     }
 
-    public abstract MemtableAllocator newAllocator();
+    public abstract MemtableAllocator newAllocator(String table);
 
     public boolean needsCleaning()
     {
diff --git a/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java b/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java
index 0505962..0d1fdd4 100644
--- a/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java
+++ b/src/java/org/apache/cassandra/utils/memory/NativeAllocator.java
@@ -20,19 +20,21 @@
 import java.util.HashMap;
 import java.util.Map;
 import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Semaphore;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.utils.concurrent.OpOrder;
+import org.apache.cassandra.utils.concurrent.Semaphore;
 import org.apache.cassandra.utils.concurrent.OpOrder.Group;
 
+import static org.apache.cassandra.utils.concurrent.Semaphore.newSemaphore;
+
 /**
  * This NativeAllocator uses global slab allocation strategy
- * with slab size that scales exponentially from 8kb to 1Mb to
- * serve allocation of up to 128kb.
+ * with slab size that scales exponentially from 8KiB to 1MiB to
+ * serve allocation of up to 128KiB.
  * <p>
  * </p>
  * The slab allocation reduces heap fragmentation from small
@@ -207,10 +209,10 @@
     private static class RaceAllocated
     {
         final ConcurrentLinkedQueue<Region> stash = new ConcurrentLinkedQueue<>();
-        final Semaphore permits = new Semaphore(8);
+        final Semaphore permits = newSemaphore(8);
         boolean stash(Region region)
         {
-            if (!permits.tryAcquire())
+            if (!permits.tryAcquire(1))
                 return false;
             stash.add(region);
             return true;
@@ -219,7 +221,7 @@
         {
             Region next = stash.poll();
             if (next != null)
-                permits.release();
+                permits.release(1);
             return next;
         }
     }
diff --git a/src/java/org/apache/cassandra/utils/memory/NativePool.java b/src/java/org/apache/cassandra/utils/memory/NativePool.java
index e88b4d7..1391a37 100644
--- a/src/java/org/apache/cassandra/utils/memory/NativePool.java
+++ b/src/java/org/apache/cassandra/utils/memory/NativePool.java
@@ -26,7 +26,7 @@
     }
 
     @Override
-    public NativeAllocator newAllocator()
+    public NativeAllocator newAllocator(String table)
     {
         return new NativeAllocator(this);
     }
diff --git a/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java b/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java
index c5c4563..05f9927 100644
--- a/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java
+++ b/src/java/org/apache/cassandra/utils/memory/SlabAllocator.java
@@ -32,8 +32,8 @@
 
 /**
 + * The SlabAllocator is a bump-the-pointer allocator that allocates
-+ * large (1MB) global regions and then doles them out to threads that
-+ * request smaller sized (up to 128kb) slices into the array.
++ * large (1MiB) global regions and then doles them out to threads that
++ * request smaller sized (up to 128KiB) slices into the array.
  * <p></p>
  * The purpose of this class is to combat heap fragmentation in long lived
  * objects: by ensuring that all allocations with similar lifetimes
diff --git a/src/java/org/apache/cassandra/utils/memory/SlabPool.java b/src/java/org/apache/cassandra/utils/memory/SlabPool.java
index 416d1dd..edaddc9 100644
--- a/src/java/org/apache/cassandra/utils/memory/SlabPool.java
+++ b/src/java/org/apache/cassandra/utils/memory/SlabPool.java
@@ -28,7 +28,7 @@
         this.allocateOnHeap = maxOffHeapMemory == 0;
     }
 
-    public MemtableAllocator newAllocator()
+    public MemtableAllocator newAllocator(String table)
     {
         return new SlabAllocator(onHeap.newAllocator(), offHeap.newAllocator(), allocateOnHeap);
     }
diff --git a/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java b/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java
index 486ec38..ae89594 100644
--- a/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java
+++ b/src/java/org/apache/cassandra/utils/obs/OffHeapBitSet.java
@@ -17,10 +17,7 @@
  */
 package org.apache.cassandra.utils.obs;
 
-import java.io.DataInput;
-import java.io.DataInputStream;
-import java.io.DataOutput;
-import java.io.IOException;
+import java.io.*;
 
 import com.google.common.annotations.VisibleForTesting;
 
@@ -145,7 +142,7 @@
     }
 
     @SuppressWarnings("resource")
-    public static OffHeapBitSet deserialize(DataInputStream in, boolean oldBfFormat) throws IOException
+    public static <I extends InputStream & DataInput> OffHeapBitSet deserialize(I in, boolean oldBfFormat) throws IOException
     {
         long byteCount = in.readInt() * 8L;
         Memory memory = Memory.allocate(byteCount);
diff --git a/src/java/org/apache/cassandra/utils/progress/jmx/JMXBroadcastExecutor.java b/src/java/org/apache/cassandra/utils/progress/jmx/JMXBroadcastExecutor.java
index f28609c..c21146b 100644
--- a/src/java/org/apache/cassandra/utils/progress/jmx/JMXBroadcastExecutor.java
+++ b/src/java/org/apache/cassandra/utils/progress/jmx/JMXBroadcastExecutor.java
@@ -19,9 +19,8 @@
 package org.apache.cassandra.utils.progress.jmx;
 
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 
 /**
  * Holds dedicated executor for JMX event handling. Events will internally queued by ArrayNotificationBuffer,
@@ -32,6 +31,6 @@
 
     private JMXBroadcastExecutor() { }
 
-    public final static ExecutorService executor = Executors.newSingleThreadExecutor(new NamedThreadFactory("JMX"));
+    public final static ExecutorService executor = executorFactory().sequential("JMX");
 
 }
diff --git a/src/java/org/apache/cassandra/utils/progress/jmx/JMXProgressSupport.java b/src/java/org/apache/cassandra/utils/progress/jmx/JMXProgressSupport.java
index 12efd0d..1d5023d 100644
--- a/src/java/org/apache/cassandra/utils/progress/jmx/JMXProgressSupport.java
+++ b/src/java/org/apache/cassandra/utils/progress/jmx/JMXProgressSupport.java
@@ -26,6 +26,8 @@
 import org.apache.cassandra.utils.progress.ProgressEvent;
 import org.apache.cassandra.utils.progress.ProgressListener;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * ProgressListener that translates ProgressEvent to JMX Notification message.
  */
@@ -46,7 +48,7 @@
         Notification notification = new Notification("progress",
                                                      tag,
                                                      notificationSerialNumber.getAndIncrement(),
-                                                     System.currentTimeMillis(),
+                                                     currentTimeMillis(),
                                                      event.getMessage());
         Map<String, Integer> userData = new HashMap<>();
         userData.put("type", event.getType().ordinal());
diff --git a/src/java/org/apache/cassandra/utils/streamhist/HistogramDataConsumer.java b/src/java/org/apache/cassandra/utils/streamhist/HistogramDataConsumer.java
old mode 100755
new mode 100644
diff --git a/src/java/org/apache/cassandra/utils/streamhist/StreamingTombstoneHistogramBuilder.java b/src/java/org/apache/cassandra/utils/streamhist/StreamingTombstoneHistogramBuilder.java
old mode 100755
new mode 100644
diff --git a/src/java/org/apache/cassandra/utils/streamhist/TombstoneHistogram.java b/src/java/org/apache/cassandra/utils/streamhist/TombstoneHistogram.java
old mode 100755
new mode 100644
diff --git a/src/java/org/apache/cassandra/utils/vint/VIntCoding.java b/src/java/org/apache/cassandra/utils/vint/VIntCoding.java
index c35f834..8543e6f 100644
--- a/src/java/org/apache/cassandra/utils/vint/VIntCoding.java
+++ b/src/java/org/apache/cassandra/utils/vint/VIntCoding.java
@@ -47,13 +47,13 @@
 package org.apache.cassandra.utils.vint;
 
 import java.io.DataInput;
-import java.io.DataOutput;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 
 import io.netty.util.concurrent.FastThreadLocal;
 import net.nicoulaj.compilecommand.annotations.Inline;
 import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
 
 /**
  * Borrows idea from
@@ -61,6 +61,16 @@
  */
 public class VIntCoding
 {
+
+    protected static final FastThreadLocal<byte[]> encodingBuffer = new FastThreadLocal<byte[]>()
+    {
+        @Override
+        public byte[] initialValue()
+        {
+            return new byte[9];
+        }
+    };
+
     public static final int MAX_SIZE = 10;
 
     public static long readUnsignedVInt(DataInput input) throws IOException
@@ -176,26 +186,31 @@
         return Integer.numberOfLeadingZeros(~firstByte) - 24;
     }
 
-    protected static final FastThreadLocal<byte[]> encodingBuffer = new FastThreadLocal<byte[]>()
-    {
-        @Override
-        public byte[] initialValue()
-        {
-            return new byte[9];
-        }
-    };
-
     @Inline
-    public static void writeUnsignedVInt(long value, DataOutput output) throws IOException
+    public static void writeUnsignedVInt(long value, DataOutputPlus output) throws IOException
     {
         int size = VIntCoding.computeUnsignedVIntSize(value);
         if (size == 1)
         {
-            output.write((int)value);
-            return;
+            output.writeByte((int) value);
         }
-
-        output.write(VIntCoding.encodeUnsignedVInt(value, size), 0, size);
+        else if (size < 9)
+        {
+            int shift = (8 - size) << 3;
+            int extraBytes = size - 1;
+            long mask = (long)VIntCoding.encodeExtraBytesToRead(extraBytes) << 56;
+            long register = (value << shift) | mask;
+            output.writeBytes(register, size);
+        }
+        else if (size == 9)
+        {
+            output.write((byte) 0xFF);
+            output.writeLong(value);
+        }
+        else
+        {
+            throw new AssertionError();
+        }
     }
 
     @Inline
@@ -204,11 +219,47 @@
         int size = VIntCoding.computeUnsignedVIntSize(value);
         if (size == 1)
         {
-            output.put((byte) value);
-            return;
+            output.put((byte) (value));
         }
+        else if (size < 9)
+        {
+            int limit = output.limit();
+            int pos = output.position();
+            if (limit - pos >= 8)
+            {
+                int shift = (8 - size) << 3;
+                int extraBytes = size - 1;
+                long mask = (long)VIntCoding.encodeExtraBytesToRead(extraBytes) << 56;
+                long register = (value << shift) | mask;
+                output.putLong(pos, register);
+                output.position(pos + size);
+            }
+            else
+            {
+                output.put(VIntCoding.encodeUnsignedVInt(value, size), 0, size);
+            }
+        }
+        else if (size == 9)
+        {
+            output.put((byte) 0xFF);
+            output.putLong(value);
+        }
+        else
+        {
+            throw new AssertionError();
+        }
+    }
 
-        output.put(VIntCoding.encodeUnsignedVInt(value, size), 0, size);
+    @Inline
+    public static void writeVInt(long value, DataOutputPlus output) throws IOException
+    {
+        writeUnsignedVInt(encodeZigZag64(value), output);
+    }
+
+    @Inline
+    public static void writeVInt(long value, ByteBuffer output) throws IOException
+    {
+        writeUnsignedVInt(encodeZigZag64(value), output);
     }
 
     /**
@@ -219,26 +270,16 @@
     private static byte[] encodeUnsignedVInt(long value, int size)
     {
         byte[] encodingSpace = encodingBuffer.get();
-        encodeUnsignedVInt(value, size, encodingSpace);
-        return encodingSpace;
-    }
 
-    @Inline
-    private static void encodeUnsignedVInt(long value, int size, byte[] encodeInto)
-    {
         int extraBytes = size - 1;
         for (int i = extraBytes ; i >= 0; --i)
         {
-            encodeInto[i] = (byte) value;
+            encodingSpace[i] = (byte) value;
             value >>= 8;
         }
-        encodeInto[0] |= VIntCoding.encodeExtraBytesToRead(extraBytes);
-    }
+        encodingSpace[0] |= VIntCoding.encodeExtraBytesToRead(extraBytes);
 
-    @Inline
-    public static void writeVInt(long value, DataOutput output) throws IOException
-    {
-        writeUnsignedVInt(encodeZigZag64(value), output);
+        return encodingSpace;
     }
 
     /**
@@ -282,6 +323,7 @@
     public static int computeUnsignedVIntSize(final long value)
     {
         int magnitude = Long.numberOfLeadingZeros(value | 1); // | with 1 to ensure magntiude <= 63, so (63 - 1) / 7 <= 8
-        return 9 - ((magnitude - 1) / 7);
+        // the formula below is hand-picked to match the original 9 - ((magnitude - 1) / 7)
+        return (639 - magnitude * 9) >> 6;
     }
 }
diff --git a/test/anttasks/org/apache/cassandra/anttasks/EchoEclipseProjectLibs.java b/test/anttasks/org/apache/cassandra/anttasks/EchoEclipseProjectLibs.java
new file mode 100644
index 0000000..c0cfb41
--- /dev/null
+++ b/test/anttasks/org/apache/cassandra/anttasks/EchoEclipseProjectLibs.java
@@ -0,0 +1,66 @@
+/*
+ * 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.anttasks;
+
+import org.apache.cassandra.io.util.File;
+
+import org.apache.commons.io.FilenameUtils;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.Echo;
+
+public class EchoEclipseProjectLibs extends Task
+{
+    public void execute()
+    {
+        Project project = getProject();
+        StringBuilder msg = buildMsg();
+
+        Echo echo = (Echo) project.createTask("echo");
+        echo.setMessage(msg.toString());
+        echo.setFile(new File(".classpath").toJavaIOFile());
+        echo.setAppend(true);
+        echo.perform();
+    }
+
+    public StringBuilder buildMsg()
+    {
+        Project project = getProject();
+        String[] jars = project.getProperty("eclipse-project-libs")
+                               .split(project.getProperty("path.separator"));
+
+        StringBuilder msg = new StringBuilder();
+        for (int i=0; i< jars.length; i++)
+        {
+            String srcJar = FilenameUtils.getBaseName(jars[i]) + "-sources.jar";
+            String srcDir = FilenameUtils.concat(project.getProperty("build.test.dir"), "sources");
+            File srcFile = new File(FilenameUtils.concat(srcDir, srcJar));
+
+            msg.append("\" <classpathentry kind=\"lib\" path=\"").append(jars[i]).append('"');
+            if (srcFile.exists())
+                msg.append(" sourcepath=\"").append(srcFile.path()).append('"');
+            msg.append("/>\n");
+        }
+
+        msg.append("</classpath>");
+
+        return msg;
+    }
+}
diff --git a/test/anttasks/org/apache/cassandra/anttasks/TestHelper.java b/test/anttasks/org/apache/cassandra/anttasks/TestHelper.java
new file mode 100644
index 0000000..be2949a
--- /dev/null
+++ b/test/anttasks/org/apache/cassandra/anttasks/TestHelper.java
@@ -0,0 +1,55 @@
+/*
+ * 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.anttasks;
+
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.MacroInstance;
+import org.apache.tools.ant.taskdefs.Sequential;
+
+public class TestHelper extends Task
+{
+    private String property;
+
+    public void setProperty(String property)
+    {
+        this.property = property;
+    }
+
+    public void execute()
+    {
+        Project project = getProject();
+
+        String sep = project.getProperty("path.separator");
+        String[] allTestClasses = project.getProperty("all-test-classes").split(sep);
+
+        Sequential seqTask = (Sequential) project.createTask("sequential");
+        for (int i=0; i< allTestClasses.length; i++)
+        {
+            if (allTestClasses[i] == null)
+                continue;
+
+            MacroInstance task = (MacroInstance) project.createTask(property);
+            task.setDynamicAttribute("test.file.list", ' ' + allTestClasses[i]);
+            seqTask.addTask(task);
+        }
+
+        seqTask.perform();
+    }
+}
diff --git a/test/burn/org/apache/cassandra/concurrent/LongOpOrderTest.java b/test/burn/org/apache/cassandra/concurrent/LongOpOrderTest.java
index d7105df..b236fb1 100644
--- a/test/burn/org/apache/cassandra/concurrent/LongOpOrderTest.java
+++ b/test/burn/org/apache/cassandra/concurrent/LongOpOrderTest.java
@@ -37,6 +37,7 @@
 import org.apache.cassandra.utils.concurrent.OpOrder;
 
 import static org.junit.Assert.assertTrue;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 // TODO: we don't currently test SAFE functionality at all!
 // TODO: should also test markBlocking and SyncOrdered
@@ -85,13 +86,13 @@
         @Override
         public void run()
         {
-            final long until = System.currentTimeMillis() + RUNTIME;
-            long lastReport = System.currentTimeMillis();
+            final long until = currentTimeMillis() + RUNTIME;
+            long lastReport = currentTimeMillis();
             long count = 0;
             long opCount = 0;
             while (true)
             {
-                long now = System.currentTimeMillis();
+                long now = currentTimeMillis();
                 if (now > until)
                     break;
                 if (now > lastReport + REPORT_INTERVAL)
diff --git a/test/burn/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java b/test/burn/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java
index fd7920a..b5f5718 100644
--- a/test/burn/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java
+++ b/test/burn/org/apache/cassandra/concurrent/LongSharedExecutorPoolTest.java
@@ -31,6 +31,8 @@
 import org.junit.Ignore;
 import org.junit.Test;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class LongSharedExecutorPoolTest
 {
 
@@ -134,11 +136,11 @@
         // (beyond max queued size), and longer operations
         for (float multiplier = 0f ; multiplier < 2.01f ; )
         {
-            if (System.nanoTime() > until)
+            if (nanoTime() > until)
             {
                 System.out.println(String.format("Completed %.0fK batches with %.1fM events", runs * 0.001f, events * 0.000001f));
                 events = 0;
-                until = System.nanoTime() + intervalNanos;
+                until = nanoTime() + intervalNanos;
                 multiplier += loadIncrement;
                 System.out.println(String.format("Running for %ds with load multiplier %.1f", TimeUnit.NANOSECONDS.toSeconds(intervalNanos), multiplier));
             }
@@ -150,20 +152,20 @@
             else if (pending.size() == executorCount) timeout = pending.first().timeout;
             else timeout = (long) (Math.random() * pending.last().timeout);
 
-            while (!pending.isEmpty() && timeout > System.nanoTime())
+            while (!pending.isEmpty() && timeout > nanoTime())
             {
                 Batch first = pending.first();
                 boolean complete = false;
                 try
                 {
                     for (Result result : first.results.descendingSet())
-                        result.future.get(timeout - System.nanoTime(), TimeUnit.NANOSECONDS);
+                        result.future.get(timeout - nanoTime(), TimeUnit.NANOSECONDS);
                     complete = true;
                 }
                 catch (TimeoutException e)
                 {
                 }
-                if (!complete && System.nanoTime() > first.timeout)
+                if (!complete && nanoTime() > first.timeout)
                 {
                     for (Result result : first.results)
                         if (!result.future.isDone())
@@ -190,7 +192,7 @@
             TreeSet<Result> results = new TreeSet<>();
             int count = (int) (workCount[executorIndex].sample() * multiplier);
             long targetTotalElapsed = 0;
-            long start = System.nanoTime();
+            long start = nanoTime();
             long baseTime;
             if (Math.random() > 0.5) baseTime = 2 * (long) (workTime.sample() * multiplier);
             else  baseTime = 0;
@@ -205,11 +207,11 @@
                     time = maxWorkTime;
                 targetTotalElapsed += time;
                 Future<?> future = executor.submit(new WaitTask(time));
-                results.add(new Result(future, System.nanoTime() + time));
+                results.add(new Result(future, nanoTime() + time));
             }
             long end = start + (long) Math.ceil(targetTotalElapsed / (double) threadCounts[executorIndex])
                        + TimeUnit.MILLISECONDS.toNanos(100L);
-            long now = System.nanoTime();
+            long now = nanoTime();
             if (runs++ > executorCount && now > end)
                 throw new AssertionError();
             events += results.size();
diff --git a/test/burn/org/apache/cassandra/net/Connection.java b/test/burn/org/apache/cassandra/net/Connection.java
index c74c0ae..de5df6b 100644
--- a/test/burn/org/apache/cassandra/net/Connection.java
+++ b/test/burn/org/apache/cassandra/net/Connection.java
@@ -35,7 +35,7 @@
 import static org.apache.cassandra.net.MessagingService.VERSION_40;
 import static org.apache.cassandra.net.MessagingService.current_version;
 import static org.apache.cassandra.utils.ExecutorUtils.runWithThreadName;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 public class Connection implements InboundMessageCallbacks, OutboundMessageCallbacks, OutboundDebugCallbacks
 {
diff --git a/test/burn/org/apache/cassandra/net/ConnectionBurnTest.java b/test/burn/org/apache/cassandra/net/ConnectionBurnTest.java
index eba8b65..6b0f5f5 100644
--- a/test/burn/org/apache/cassandra/net/ConnectionBurnTest.java
+++ b/test/burn/org/apache/cassandra/net/ConnectionBurnTest.java
@@ -43,6 +43,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.Uninterruptibles;
 
+import org.apache.cassandra.utils.concurrent.FutureCombiner;
 import org.junit.BeforeClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,8 +65,9 @@
 import static java.lang.Math.min;
 import static org.apache.cassandra.net.MessagingService.current_version;
 import static org.apache.cassandra.net.ConnectionType.LARGE_MESSAGES;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
-import static org.apache.cassandra.utils.MonotonicClock.preciseTime;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.preciseTime;
 
 public class ConnectionBurnTest
 {
@@ -259,7 +261,7 @@
             Reporters reporters = new Reporters(endpoints, connections);
             try
             {
-                long deadline = System.nanoTime() + runForNanos;
+                long deadline = nanoTime() + runForNanos;
                 Verb._TEST_2.unsafeSetHandler(() -> message -> {});
                 Verb._TEST_2.unsafeSetSerializer(() -> serializer);
                 inbound.sockets.open().get();
@@ -345,7 +347,7 @@
                 executor.execute(() -> {
                     Thread.currentThread().setName("Test-Reconnect");
                     ThreadLocalRandom random = ThreadLocalRandom.current();
-                    while (deadline > System.nanoTime())
+                    while (deadline > nanoTime())
                     {
                         try
                         {
@@ -411,7 +413,7 @@
                     };
 
                     int count = 0;
-                    while (deadline > System.nanoTime())
+                    while (deadline > nanoTime())
                     {
 
                         try
@@ -465,7 +467,7 @@
                     }
                 });
 
-                while (deadline > System.nanoTime() && failed.getCount() > 0)
+                while (deadline > nanoTime() && failed.getCount() > 0)
                 {
                     reporters.update();
                     reporters.print();
@@ -481,7 +483,7 @@
                 reporters.print();
 
                 inbound.sockets.close().get();
-                new FutureCombiner(Arrays.stream(connections)
+                FutureCombiner.allOf(Arrays.stream(connections)
                                          .map(c -> c.outbound.close(false))
                                          .collect(Collectors.toList()))
                 .get();
diff --git a/test/burn/org/apache/cassandra/net/GlobalInboundSettings.java b/test/burn/org/apache/cassandra/net/GlobalInboundSettings.java
index 9b23041..da453fe 100644
--- a/test/burn/org/apache/cassandra/net/GlobalInboundSettings.java
+++ b/test/burn/org/apache/cassandra/net/GlobalInboundSettings.java
@@ -54,4 +54,4 @@
     {
         return new GlobalInboundSettings(queueCapacity, endpointReserveLimit, globalReserveLimit, template);
     }
-}
\ No newline at end of file
+}
diff --git a/test/burn/org/apache/cassandra/net/MessageGenerator.java b/test/burn/org/apache/cassandra/net/MessageGenerator.java
index 3c03689..43ea16e 100644
--- a/test/burn/org/apache/cassandra/net/MessageGenerator.java
+++ b/test/burn/org/apache/cassandra/net/MessageGenerator.java
@@ -31,7 +31,7 @@
 import sun.misc.Unsafe;
 
 import static org.apache.cassandra.net.MessagingService.VERSION_40;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 abstract class MessageGenerator
 {
diff --git a/test/burn/org/apache/cassandra/net/Reporters.java b/test/burn/org/apache/cassandra/net/Reporters.java
index 9ab4643..1f4f823 100644
--- a/test/burn/org/apache/cassandra/net/Reporters.java
+++ b/test/burn/org/apache/cassandra/net/Reporters.java
@@ -30,12 +30,14 @@
 
 import org.apache.cassandra.locator.InetAddressAndPort;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 class Reporters
 {
     final Collection<InetAddressAndPort> endpoints;
     final Connection[] connections;
     final List<Reporter> reporters;
-    final long start = System.nanoTime();
+    final long start = nanoTime();
 
     Reporters(Collection<InetAddressAndPort> endpoints, Connection[] connections)
     {
@@ -66,7 +68,7 @@
 
     void print()
     {
-        System.out.println("==" + prettyPrintElapsed(System.nanoTime() - start) + "==\n");
+        System.out.println("==" + prettyPrintElapsed(nanoTime() - start) + "==\n");
 
         for (Reporter reporter : reporters)
         {
diff --git a/test/burn/org/apache/cassandra/net/Verifier.java b/test/burn/org/apache/cassandra/net/Verifier.java
index 219e613..cd6bdc3 100644
--- a/test/burn/org/apache/cassandra/net/Verifier.java
+++ b/test/burn/org/apache/cassandra/net/Verifier.java
@@ -32,14 +32,11 @@
 import org.slf4j.LoggerFactory;
 
 import com.carrotsearch.hppc.LongObjectHashMap;
-import com.carrotsearch.hppc.predicates.LongObjectPredicate;
 import com.carrotsearch.hppc.procedures.LongObjectProcedure;
-import com.carrotsearch.hppc.procedures.LongProcedure;
 import org.apache.cassandra.net.Verifier.ExpiredMessageEvent.ExpirationType;
 import org.apache.cassandra.utils.concurrent.WaitQueue;
 
 import static java.util.concurrent.TimeUnit.*;
-import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.cassandra.net.MessagingService.VERSION_40;
 import static org.apache.cassandra.net.MessagingService.current_version;
 import static org.apache.cassandra.net.ConnectionType.LARGE_MESSAGES;
@@ -65,7 +62,9 @@
 import static org.apache.cassandra.net.Verifier.EventType.SENT_FRAME;
 import static org.apache.cassandra.net.Verifier.EventType.SERIALIZE;
 import static org.apache.cassandra.net.Verifier.ExpiredMessageEvent.ExpirationType.ON_SENT;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
 
 /**
  * This class is a single-threaded verifier monitoring a single link, with events supplied by inbound and outbound threads
@@ -1110,7 +1109,7 @@
                                 throw new IllegalStateException();
                         }
 
-                        now = System.nanoTime();
+                        now = nanoTime();
                         if (m.expiresAtNanos > now)
                         {
                             // we fix the conversion AlmostSameTime for an entire run, which should suffice to guarantee these comparisons
@@ -1281,7 +1280,7 @@
 
         // we use a concurrent skip list to permit efficient searching, even if we always append
         final ConcurrentSkipListMap<Long, Chunk> chunkList = new ConcurrentSkipListMap<>();
-        final WaitQueue writerWaiting = new WaitQueue();
+        final WaitQueue writerWaiting = newWaitQueue();
 
         volatile Chunk writerChunk = new Chunk(0);
         Chunk readerChunk = writerChunk;
@@ -1356,7 +1355,7 @@
 
         public Event await(long id, long timeout, TimeUnit unit) throws InterruptedException
         {
-            return await(id, System.nanoTime() + unit.toNanos(timeout));
+            return await(id, nanoTime() + unit.toNanos(timeout));
         }
 
         public Event await(long id, long deadlineNanos) throws InterruptedException
@@ -1370,7 +1369,7 @@
             readerWaiting = Thread.currentThread();
             while (null == (result = chunk.get(id)))
             {
-                long waitNanos = deadlineNanos - System.nanoTime();
+                long waitNanos = deadlineNanos - nanoTime();
                 if (waitNanos <= 0)
                     return null;
                 LockSupport.parkNanos(waitNanos);
diff --git a/test/burn/org/apache/cassandra/transport/BurnTestUtil.java b/test/burn/org/apache/cassandra/transport/BurnTestUtil.java
index 9610455..c8017d1 100644
--- a/test/burn/org/apache/cassandra/transport/BurnTestUtil.java
+++ b/test/burn/org/apache/cassandra/transport/BurnTestUtil.java
@@ -35,6 +35,9 @@
 import org.apache.cassandra.net.ResourceLimits;
 import org.apache.cassandra.transport.messages.QueryMessage;
 import org.apache.cassandra.transport.messages.ResultMessage;
+import org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter;
+
+import static org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter.NO_OP_LIMITER;
 
 public class BurnTestUtil
 {
@@ -143,6 +146,12 @@
                     return delegate.endpointWaitQueue();
                 }
 
+                @Override
+                public NonBlockingRateLimiter requestRateLimiter()
+                {
+                    return NO_OP_LIMITER;
+                }
+                
                 public void release()
                 {
                     delegate.release();
diff --git a/test/burn/org/apache/cassandra/transport/DriverBurnTest.java b/test/burn/org/apache/cassandra/transport/DriverBurnTest.java
index 37ebec1..7856b1b 100644
--- a/test/burn/org/apache/cassandra/transport/DriverBurnTest.java
+++ b/test/burn/org/apache/cassandra/transport/DriverBurnTest.java
@@ -45,6 +45,7 @@
 import static org.apache.cassandra.transport.BurnTestUtil.generateQueryMessage;
 import static org.apache.cassandra.transport.BurnTestUtil.generateQueryStatement;
 import static org.apache.cassandra.transport.BurnTestUtil.generateRows;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class DriverBurnTest extends CQLTester
@@ -62,7 +63,7 @@
             }
         };
 
-        requireNetwork((builder) -> builder.withPipelineConfigurator(configurator));
+        requireNetwork(builder -> builder.withPipelineConfigurator(configurator), builder -> {});
     }
 
     @Test
@@ -385,10 +386,10 @@
 
                         for (int j = 0; j < perThread; j++)
                         {
-                            long startNanos = System.nanoTime();
+                            long startNanos = nanoTime();
                             ResultSetFuture future = session.executeAsync(request);
                             future.addListener(() -> {
-                                long diff = System.nanoTime() - startNanos;
+                                long diff = nanoTime() - startNanos;
                                 if (measure.get())
                                 {
                                     lock.lock();
@@ -437,4 +438,4 @@
         System.out.println("99p:      " + stats.getPercentile(0.99));
     }
 }
-// TODO: test disconnecting and reconnecting constantly
\ No newline at end of file
+// TODO: test disconnecting and reconnecting constantly
diff --git a/test/burn/org/apache/cassandra/transport/SimpleClientBurnTest.java b/test/burn/org/apache/cassandra/transport/SimpleClientBurnTest.java
index 7e57916..2d863cf 100644
--- a/test/burn/org/apache/cassandra/transport/SimpleClientBurnTest.java
+++ b/test/burn/org/apache/cassandra/transport/SimpleClientBurnTest.java
@@ -212,4 +212,4 @@
         server.stop();
     }
 
-}
\ No newline at end of file
+}
diff --git a/test/burn/org/apache/cassandra/transport/SimpleClientPerfTest.java b/test/burn/org/apache/cassandra/transport/SimpleClientPerfTest.java
index 20b8cb3..a050245 100644
--- a/test/burn/org/apache/cassandra/transport/SimpleClientPerfTest.java
+++ b/test/burn/org/apache/cassandra/transport/SimpleClientPerfTest.java
@@ -23,12 +23,14 @@
 import java.util.*;
 import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 import java.util.stream.Collectors;
 
-import org.apache.commons.math3.stat.descriptive.DescriptiveStatistics;
+import com.google.common.util.concurrent.RateLimiter;
+import org.apache.commons.math.stat.descriptive.DescriptiveStatistics;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -41,15 +43,18 @@
 import org.apache.cassandra.auth.AllowAllNetworkAuthorizer;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.exceptions.OverloadedException;
 import org.apache.cassandra.metrics.ClientMetrics;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.transport.messages.QueryMessage;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.AssertUtil;
+import org.apache.cassandra.utils.Throwables;
 
 import static org.apache.cassandra.transport.BurnTestUtil.SizeCaps;
 import static org.apache.cassandra.transport.BurnTestUtil.generateQueryMessage;
 import static org.apache.cassandra.transport.BurnTestUtil.generateRows;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 @RunWith(Parameterized.class)
 public class SimpleClientPerfTest
@@ -57,7 +62,7 @@
     @Parameterized.Parameter
     public ProtocolVersion version;
 
-    @Parameterized.Parameters()
+    @Parameterized.Parameters(name="{0}")
     public static Collection<Object[]> versions()
     {
         return ProtocolVersion.SUPPORTED.stream()
@@ -90,6 +95,7 @@
         }
     }
 
+    @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed", "resource"})
     @Test
     public void measureSmall() throws Throwable
     {
@@ -102,6 +108,7 @@
                  version);
     }
 
+    @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed", "resource"})
     @Test
     public void measureSmallWithCompression() throws Throwable
     {
@@ -114,6 +121,7 @@
                  version);
     }
 
+    @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed", "resource"})
     @Test
     public void measureLarge() throws Throwable
     {
@@ -126,6 +134,7 @@
                  version);
     }
 
+    @SuppressWarnings({"IOResourceOpenedButNotSafelyClosed", "resource"})
     @Test
     public void measureLargeWithCompression() throws Throwable
     {
@@ -138,6 +147,7 @@
                  version);
     }
 
+    @SuppressWarnings({"UnstableApiUsage", "UseOfSystemOutOrSystemErr", "ResultOfMethodCallIgnored"})
     public void perfTest(SizeCaps requestCaps, SizeCaps responseCaps, AssertUtil.ThrowingSupplier<SimpleClient> clientSupplier, ProtocolVersion version) throws Throwable
     {
         ResultMessage.Rows response = generateRows(0, responseCaps);
@@ -190,7 +200,9 @@
         AtomicBoolean measure = new AtomicBoolean(false);
         DescriptiveStatistics stats = new DescriptiveStatistics();
         Lock lock = new ReentrantLock();
-
+        RateLimiter limiter = RateLimiter.create(2000);
+        AtomicLong overloadedExceptions = new AtomicLong(0);
+        
         // TODO: exercise client -> server large messages
         for (int t = 0; t < threads; t++)
         {
@@ -203,24 +215,53 @@
                         for (int j = 0; j < 1; j++)
                             messages.add(requestMessage);
 
-                        if (measure.get())
-                        {
-                            long nanoStart = System.nanoTime();
-                            client.execute(messages);
-                            long diff = System.nanoTime() - nanoStart;
+                            if (measure.get())
+                            {
+                                try
+                                {
+                                    limiter.acquire();
+                                    long nanoStart = nanoTime();
+                                    client.execute(messages);
+                                    long elapsed = nanoTime() - nanoStart;
 
-                            lock.lock();
-                            try
-                            {
-                                stats.addValue(TimeUnit.MICROSECONDS.toMillis(diff));
+                                    lock.lock();
+                                    try
+                                    {
+                                        stats.addValue(TimeUnit.NANOSECONDS.toMicros(elapsed));
+                                    }
+                                    finally
+                                    {
+                                        lock.unlock();
+                                    }
+                                }
+                                catch (RuntimeException e)
+                                {
+                                    if (Throwables.anyCauseMatches(e, cause -> cause instanceof OverloadedException))
+                                    {
+                                        overloadedExceptions.incrementAndGet();
+                                    }
+                                    else
+                                    {
+                                        throw e;
+                                    }
+                                }
                             }
-                            finally
+                            else
                             {
-                                lock.unlock();
+                                try
+                                {
+                                    limiter.acquire();
+                                    client.execute(messages); // warm-up
+                                }
+                                catch (RuntimeException e)
+                                {
+                                    // Ignore overloads during warmup...
+                                    if (!Throwables.anyCauseMatches(e, cause -> cause instanceof OverloadedException))
+                                    {
+                                        throw e;
+                                    }
+                                }
                             }
-                        }
-                        else
-                            client.execute(messages); // warm-up
                     }
                 }
                 catch (Throwable e)
@@ -240,14 +281,19 @@
 
         System.out.println("requestSize = " + requestSize);
         System.out.println("responseSize = " + responseSize);
+
+        System.out.println("Latencies (in microseconds)");
+        System.out.println("Elements: " + stats.getN());
         System.out.println("Mean:     " + stats.getMean());
         System.out.println("Variance: " + stats.getVariance());
         System.out.println("Median:   " + stats.getPercentile(0.5));
         System.out.println("90p:      " + stats.getPercentile(0.90));
         System.out.println("95p:      " + stats.getPercentile(0.95));
         System.out.println("99p:      " + stats.getPercentile(0.99));
+        System.out.println("Max:      " + stats.getMax());
+        
+        System.out.println("Failed due to overload: " + overloadedExceptions.get());
 
         server.stop();
     }
 }
-
diff --git a/test/burn/org/apache/cassandra/utils/LongBTreeTest.java b/test/burn/org/apache/cassandra/utils/LongBTreeTest.java
index aaa4e53..01b4493 100644
--- a/test/burn/org/apache/cassandra/utils/LongBTreeTest.java
+++ b/test/burn/org/apache/cassandra/utils/LongBTreeTest.java
@@ -53,6 +53,7 @@
 import static java.util.Comparator.naturalOrder;
 import static java.util.Comparator.reverseOrder;
 import static org.apache.cassandra.utils.btree.BTree.iterable;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -1179,7 +1180,7 @@
     {
         args = Arrays.copyOf(args, args.length + 1);
         System.arraycopy(args, 0, args, 1, args.length - 1);
-        args[0] = System.currentTimeMillis();
+        args[0] = currentTimeMillis();
         System.out.printf("%tT: " + formatstr + "\n", args);
     }
 }
\ No newline at end of file
diff --git a/test/burn/org/apache/cassandra/utils/memory/LongBufferPoolTest.java b/test/burn/org/apache/cassandra/utils/memory/LongBufferPoolTest.java
index 117ee7c..caf8ec2 100644
--- a/test/burn/org/apache/cassandra/utils/memory/LongBufferPoolTest.java
+++ b/test/burn/org/apache/cassandra/utils/memory/LongBufferPoolTest.java
@@ -39,6 +39,7 @@
 import org.apache.cassandra.io.compress.BufferType;
 import org.apache.cassandra.utils.DynamicList;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.*;
 
 /**
@@ -210,7 +211,7 @@
             this.threadCount = threadCount;
             this.duration = duration;
             this.poolSize = Math.toIntExact(poolSize);
-            until = System.nanoTime() + duration;
+            until = nanoTime() + duration;
             latch = new CountDownLatch(threadCount);
             sharedRecycle = new SPSCQueue[threadCount];
 
@@ -329,7 +330,7 @@
         logger.info("{} - testing {} threads for {}m", DATE_FORMAT.format(new Date()), threadCount, TimeUnit.NANOSECONDS.toMinutes(duration));
         logger.info("Testing BufferPool with memoryUsageThreshold={} and enabling BufferPool.DEBUG", bufferPool.memoryUsageThreshold());
         Debug debug = new Debug();
-        bufferPool.debug(debug);
+        bufferPool.debug(debug, null);
 
         TestEnvironment testEnv = new TestEnvironment(threadCount, duration, bufferPool.memoryUsageThreshold());
 
@@ -380,7 +381,7 @@
         assertEquals(0, testEnv.executorService.shutdownNow().size());
 
         logger.info("Reverting BufferPool DEBUG config");
-        bufferPool.debug(BufferPool.Debug.NO_OP);
+        bufferPool.debug(BufferPool.Debug.NO_OP, null);
 
         testEnv.assertCheckedThreadsSucceeded();
 
@@ -429,7 +430,7 @@
                         }
                         else if (!recycleFromNeighbour())
                         {
-                            if (++spinCount > 1000 && System.nanoTime() > until)
+                            if (++spinCount > 1000 && nanoTime() > until)
                                 return;
                             // otherwise, free one of our other neighbour's buffers if can; and otherwise yield
                             Thread.yield();
@@ -674,7 +675,7 @@
         {
             try
             {
-                while (System.nanoTime() < until)
+                while (nanoTime() < until)
                 {
                     checkpoint();
                     for (int i = 0 ; i < 100 ; i++)
diff --git a/test/conf/cassandra-converters-special-cases-old-names.yaml b/test/conf/cassandra-converters-special-cases-old-names.yaml
new file mode 100644
index 0000000..b3e26d8
--- /dev/null
+++ b/test/conf/cassandra-converters-special-cases-old-names.yaml
@@ -0,0 +1,10 @@
+#
+# This test config is used to test the Converters added for configuration backward compatibility in 4.1 post
+# CASSANDRA-15234. It tests setting old Config names (CASSANDRA-17737)
+#
+sstable_preemptive_open_interval_in_mb: -1
+index_summary_resize_interval_in_minutes: -1
+cache_load_timeout_seconds: -1
+commitlog_sync_group_window_in_ms: NaN
+credentials_update_interval_in_ms: -1
+
diff --git a/test/conf/cassandra-converters-special-cases.yaml b/test/conf/cassandra-converters-special-cases.yaml
new file mode 100644
index 0000000..f3f896a
--- /dev/null
+++ b/test/conf/cassandra-converters-special-cases.yaml
@@ -0,0 +1,10 @@
+#
+# This test config is used to test the Converters added for configuration backward compatibility in 4.1 post
+# CASSANDRA-15234. It tests setting new Config names (CASSANDRA-17737)
+#
+sstable_preemptive_open_interval:
+index_summary_resize_interval:
+cache_load_timeout: 0s
+commitlog_sync_group_window: 0ms
+credentials_update_interval:
+
diff --git a/test/conf/cassandra-murmur.yaml b/test/conf/cassandra-murmur.yaml
index 3c263a5..c0c2ae7 100644
--- a/test/conf/cassandra-murmur.yaml
+++ b/test/conf/cassandra-murmur.yaml
@@ -6,7 +6,7 @@
 memtable_allocation_type: heap_buffers
 commitlog_sync: batch
 commitlog_sync_batch_window_in_ms: 1.0
-commitlog_segment_size_in_mb: 5
+commitlog_segment_size: 5MiB
 commitlog_directory: build/test/cassandra/commitlog
 cdc_raw_directory: build/test/cassandra/cdc_raw
 cdc_enabled: false
@@ -16,7 +16,7 @@
 storage_port: 7012
 start_native_transport: true
 native_transport_port: 9042
-column_index_size_in_kb: 4
+column_index_size: 4KiB
 saved_caches_directory: build/test/cassandra/saved_caches
 data_file_directories:
     - build/test/cassandra/data
@@ -35,10 +35,10 @@
     truststore_password: cassandra
 incremental_backups: true
 concurrent_compactors: 4
-compaction_throughput_mb_per_sec: 0
+compaction_throughput: 0MiB/s
 row_cache_class_name: org.apache.cassandra.cache.OHCProvider
-row_cache_size_in_mb: 16
-enable_user_defined_functions: true
-enable_scripted_user_defined_functions: true
-enable_sasi_indexes: true
-enable_materialized_views: true
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+sasi_indexes_enabled: true
+materialized_views_enabled: true
diff --git a/test/conf/cassandra-old.yaml b/test/conf/cassandra-old.yaml
new file mode 100644
index 0000000..86983ac
--- /dev/null
+++ b/test/conf/cassandra-old.yaml
@@ -0,0 +1,58 @@
+#
+# Warning!
+# Consider the effects on 'o.a.c.i.s.LegacySSTableTest' before changing schemas in this file.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_sync_batch_window_in_ms: 1.0
+commitlog_segment_size_in_mb: 5
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+server_encryption_options:
+    internode_encryption: none
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    truststore: conf/.truststore
+    truststore_password: cassandra
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput_mb_per_sec: 64
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size_in_mb: 16
+enable_user_defined_functions: true
+enable_scripted_user_defined_functions: true
+prepared_statements_cache_size_mb:
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound_megabits_per_sec: 200000000
+enable_sasi_indexes: true
+enable_materialized_views: true
+enable_drop_compact_storage: true
+file_cache_enabled: true
+internode_send_buff_size_in_bytes: 5
+internode_recv_buff_size_in_bytes: 5
+max_hint_window_in_ms: 10800000
+cache_load_timeout_seconds: 35
diff --git a/test/conf/cassandra-pem-jks-sslcontextfactory.yaml b/test/conf/cassandra-pem-jks-sslcontextfactory.yaml
new file mode 100644
index 0000000..1f10e6c
--- /dev/null
+++ b/test/conf/cassandra-pem-jks-sslcontextfactory.yaml
@@ -0,0 +1,150 @@
+#
+# 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.
+#
+
+#
+# Testing for pluggable ssl_context_factory option for client and server encryption options with a valid and a missing
+# implementation classes.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_segment_size: 5MiB
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+client_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+        parameters:
+          private_key: |
+            -----BEGIN ENCRYPTED PRIVATE KEY-----
+            MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/
+            g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl
+            xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29
+            L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V
+            sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/
+            f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8
+            RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR
+            0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs
+            evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU
+            tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6
+            wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN
+            K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv
+            zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5
+            mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo
+            WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ
+            jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6
+            eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny
+            DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn
+            AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY
+            Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow
+            Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut
+            ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr
+            bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH
+            hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI
+            RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw
+            pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP
+            FujZhqbKUDbYAcqTkoQ=
+            -----END ENCRYPTED PRIVATE KEY-----
+            -----BEGIN CERTIFICATE-----
+            MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+            bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+            VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+            Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+            EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+            a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+            FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+            MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+            ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+            q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+            TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+            TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+            YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+            N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+            iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+            IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+            6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+            qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+            HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+            n3MVF9w=
+            -----END CERTIFICATE-----
+          private_key_password: "cassandra"
+          trusted_certificates: |
+            -----BEGIN CERTIFICATE-----
+            MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+            bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+            VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+            Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+            EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+            a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+            FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+            MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+            ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+            q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+            TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+            TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+            YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+            N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+            iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+            IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+            6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+            qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+            HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+            n3MVF9w=
+            -----END CERTIFICATE-----
+server_encryption_options:
+    internode_encryption: none
+    keystore: test/conf/cassandra_ssl_test.keystore
+    keystore_password: cassandra
+    truststore: test/conf/cassandra_ssl_test.truststore
+    truststore_password: cassandra
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput: 0MiB/s
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+prepared_statements_cache_size: 1MiB
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound: 24MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+file_cache_enabled: true
diff --git a/test/conf/cassandra-pem-sslcontextfactory-invalidconfiguration.yaml b/test/conf/cassandra-pem-sslcontextfactory-invalidconfiguration.yaml
new file mode 100644
index 0000000..8c7d910
--- /dev/null
+++ b/test/conf/cassandra-pem-sslcontextfactory-invalidconfiguration.yaml
@@ -0,0 +1,147 @@
+#
+# 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.
+#
+
+#
+# Testing for pluggable ssl_context_factory option for client and server encryption options with a valid and a missing
+# implementation classes.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_segment_size: 5MiB
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+client_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+        parameters:
+            private_key: |
+             -----BEGIN ENCRYPTED PRIVATE KEY-----
+             MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/
+             g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl
+             xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29
+             L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V
+             sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/
+             f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8
+             RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR
+             0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs
+             evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU
+             tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6
+             wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN
+             K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv
+             zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5
+             mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo
+             WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ
+             jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6
+             eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny
+             DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn
+             AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY
+             Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow
+             Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut
+             ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr
+             bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH
+             hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI
+             RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw
+             pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP
+             FujZhqbKUDbYAcqTkoQ=
+             -----END ENCRYPTED PRIVATE KEY-----
+             -----BEGIN CERTIFICATE-----
+             MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+             bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+             VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+             Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+             EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+             a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+             FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+             MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+             ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+             q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+             TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+             TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+             YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+             N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+             iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+             IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+             6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+             qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+             HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+             n3MVF9w=
+             -----END CERTIFICATE-----
+            private_key_password: "cassandra"
+            trusted_certificates: |
+              -----BEGIN CERTIFICATE-----
+              MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+              bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+              VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+              Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+              EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+              a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+              FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+              MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+              ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+              q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+              TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+              TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+              YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+              N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+              iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+              IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+              6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+              qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+              HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+              n3MVF9w=
+              -----END CERTIFICATE-----
+    keystore: test/conf/cassandra_ssl_test.keystore.pem
+    keystore_password: cassandra
+    truststore: test/conf/cassandra_ssl_test.truststore.pem
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput: 0MiB/s
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+prepared_statements_cache_size: 1MiB
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound: 24MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+file_cache_enabled: true
diff --git a/test/conf/cassandra-pem-sslcontextfactory-mismatching-passwords.yaml b/test/conf/cassandra-pem-sslcontextfactory-mismatching-passwords.yaml
new file mode 100644
index 0000000..5d64354
--- /dev/null
+++ b/test/conf/cassandra-pem-sslcontextfactory-mismatching-passwords.yaml
@@ -0,0 +1,154 @@
+#
+# 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.
+#
+
+#
+# Testing for pluggable ssl_context_factory option for client and server encryption options with a valid and a missing
+# implementation classes.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_segment_size: 5MiB
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+client_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+        parameters:
+            private_key: |
+             -----BEGIN ENCRYPTED PRIVATE KEY-----
+             MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/
+             g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl
+             xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29
+             L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V
+             sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/
+             f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8
+             RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR
+             0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs
+             evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU
+             tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6
+             wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN
+             K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv
+             zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5
+             mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo
+             WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ
+             jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6
+             eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny
+             DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn
+             AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY
+             Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow
+             Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut
+             ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr
+             bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH
+             hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI
+             RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw
+             pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP
+             FujZhqbKUDbYAcqTkoQ=
+             -----END ENCRYPTED PRIVATE KEY-----
+             -----BEGIN CERTIFICATE-----
+             MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+             bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+             VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+             Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+             EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+             a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+             FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+             MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+             ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+             q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+             TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+             TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+             YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+             N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+             iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+             IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+             6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+             qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+             HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+             n3MVF9w=
+             -----END CERTIFICATE-----
+            private_key_password: "cassandra"
+            trusted_certificates: |
+              -----BEGIN CERTIFICATE-----
+              MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+              bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+              VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+              Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+              EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+              a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+              FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+              MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+              ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+              q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+              TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+              TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+              YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+              N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+              iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+              IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+              6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+              qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+              HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+              n3MVF9w=
+              -----END CERTIFICATE-----
+    keystore_password: cassandra-abracadbra
+server_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+        parameters:
+          private_key_password: "cassandra-abracadbra"
+    internode_encryption: none
+    keystore: test/conf/cassandra_ssl_test.keystore.pem
+    keystore_password: cassandra
+    truststore: test/conf/cassandra_ssl_test.truststore.pem
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput: 0MiB/s
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: false
+prepared_statements_cache_size: 1MiB
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound: 24MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+file_cache_enabled: true
diff --git a/test/conf/cassandra-pem-sslcontextfactory-unencryptedkeys.yaml b/test/conf/cassandra-pem-sslcontextfactory-unencryptedkeys.yaml
new file mode 100644
index 0000000..7b08bcc
--- /dev/null
+++ b/test/conf/cassandra-pem-sslcontextfactory-unencryptedkeys.yaml
@@ -0,0 +1,148 @@
+#
+# 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.
+#
+
+#
+# Testing for pluggable ssl_context_factory option for client and server encryption options with a valid and a missing
+# implementation classes.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_segment_size: 5MiB
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+client_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+        parameters:
+            private_key: |
+              -----BEGIN PRIVATE KEY-----
+              MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOSZVf8dLj1xLw
+              efqjbogbAwhwRXd3tmEfQY1zHyudJF3XR1T0Xp26BKNvAYUxxZRDNg16M3prPRZv
+              wkhDJdE9NaN+BpZPJUavRsZOfGDq/CHN8j/2PPKrn3G/b065JjV3GZjfV/Sln047
+              DeZptaSyOg7ZN7F8qjGqxEcnw+szV/wTzhnjGjZMlcbOm4jFGQAn6xUOooQCGsoB
+              9FgxKB0nvNG3xVe/2eCNfbS4DabT3Y1wfQqZ62hOa5ZS0rwT+pw3tQs3zFFY1Sfi
+              G7qYbqZrKTheWIZGojVVm6mqH4yA2ofOe5N3RsBitCwU/D0dpnaG9Wcl98nmXueM
+              B6Rk04v7AgMBAAECggEAYnxIKjrFz/JkJ5MmiszM5HV698r9YB0aqHnFIHPoykIL
+              uiCjiumantDrFsCkosixULwvI/BRwbxstTpyrheU9psT6P1CONICVPvV8ylgJAYU
+              l+ofn56cEXKxVuICSWFLDH7pM1479g+IJJQAchbKQpqxAGTuMu3SpvJolfuj5srt
+              bM7/RYhJFLwDuvHNA3ivlogMneItP03+C25aaxstM+lBuBf68+n78zMgSvt6J/6Y
+              G2TOMKnxveMlG2qu9l2lAw/2i8daG/qre08nTH7wpRx0gZLZqNpe45exkrzticzF
+              FgWYjG2K2brX21jqHroFgMhdXF7zhhRgLoIeC0BrIQKBgQDCfGfWrJESKBbVai5u
+              7wqD9nlzjv6N6FXfTDOPXO1vz5frdvtLVWbs0SMPy+NglkaZK0iqHvb9mf2of8eC
+              0D5cmewjn7WCDBQMypIMYgT912ak/BBVuGXcxb6UgD+xARfSARo2C8NG1hfprw1W
+              ad14CjS5xhFMs44HpVYhI7iPYwKBgQC7SqVG/b37vZ7CINemdvoMujLvvYXDJJM8
+              N21LqNJfVXdukdH3T0xuLnh9Z/wPHjJDMF/9+1foxSEPHijtyz5P19EilNEC/3qw
+              fI19+VZoY0mdhPtXSGzy+rbTE2v71QgwFLizSos14Gr+eNiIjF7FYccK05++K/zk
+              cd8ZA3bwiQKBgQCl+HTFBs9mpz+VMOAfW2+l3hkXPNiPUc62mNkHZ05ZNNd44jjh
+              uSf0wSUiveR08MmevQlt5K7zDQ8jVKh2QjB15gVXAVxsdtJFeDnax2trFP9LnLBz
+              9sE2/qn9INU5wK0LUlWD+dXUBbCyg+jl7cJKRqtoPldVFYYHkFlIPqup8QKBgHXv
+              hyuw1FUVDkdHzwOvn70r8q8sNHKxMVWVwWkHIZGOi+pAQGrusD4hXRX6yKnsZdIR
+              QCD6iFy25R5T64nxlYdJaxPPid3NakB/7ckJnPOWseBSwMIxhQlr/nvjmve1Kba9
+              FaEwq4B9lGIxToiNe4/nBiM3JzvlDxX67nUdzWOhAoGAdFvriyvjshSJ4JHgIY9K
+              37BVB0VKMcFV2P8fLVWO5oyRtE1bJhU4QVpQmauABU4RGSojJ3NPIVH1wxmJeYtj
+              Q3b7EZaqI6ovna2eK2qtUx4WwxhRaXTT8xueBI2lgL6sBSTGG+K69ZOzGQzG/Mfr
+              RXKInnLInFD9JD94VqmMozo=
+              -----END PRIVATE KEY-----
+              -----BEGIN CERTIFICATE-----
+              MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+              bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+              VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+              Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+              EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+              a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+              FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+              MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+              ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+              q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+              TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+              TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+              YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+              N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+              iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+              IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+              6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+              qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+              HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+              n3MVF9w=
+              -----END CERTIFICATE-----
+            trusted_certificates: |
+              -----BEGIN CERTIFICATE-----
+              MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+              bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+              VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+              Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+              EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+              a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+              FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+              MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+              ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+              q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+              TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+              TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+              YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+              N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+              iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+              IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+              6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+              qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+              HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+              n3MVF9w=
+              -----END CERTIFICATE-----
+server_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+    internode_encryption: none
+    keystore: test/conf/cassandra_ssl_test.unencrypted_keystore.pem
+    truststore: test/conf/cassandra_ssl_test.truststore.pem
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput: 0MiB/s
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: false
+prepared_statements_cache_size: 1MiB
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound: 24MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+file_cache_enabled: true
diff --git a/test/conf/cassandra-pem-sslcontextfactory.yaml b/test/conf/cassandra-pem-sslcontextfactory.yaml
new file mode 100644
index 0000000..26d0f1f
--- /dev/null
+++ b/test/conf/cassandra-pem-sslcontextfactory.yaml
@@ -0,0 +1,151 @@
+#
+# 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.
+#
+
+#
+# Testing for pluggable ssl_context_factory option for client and server encryption options with a valid and a missing
+# implementation classes.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_segment_size: 5MiB
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+client_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+        parameters:
+            private_key: |
+             -----BEGIN ENCRYPTED PRIVATE KEY-----
+             MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/
+             g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl
+             xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29
+             L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V
+             sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/
+             f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8
+             RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR
+             0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs
+             evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU
+             tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6
+             wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN
+             K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv
+             zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5
+             mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo
+             WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ
+             jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6
+             eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny
+             DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn
+             AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY
+             Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow
+             Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut
+             ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr
+             bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH
+             hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI
+             RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw
+             pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP
+             FujZhqbKUDbYAcqTkoQ=
+             -----END ENCRYPTED PRIVATE KEY-----
+             -----BEGIN CERTIFICATE-----
+             MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+             bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+             VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+             Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+             EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+             a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+             FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+             MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+             ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+             q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+             TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+             TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+             YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+             N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+             iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+             IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+             6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+             qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+             HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+             n3MVF9w=
+             -----END CERTIFICATE-----
+            private_key_password: "cassandra"
+            trusted_certificates: |
+              -----BEGIN CERTIFICATE-----
+              MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+              bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+              VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+              Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+              EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+              a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+              FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+              MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+              ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+              q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+              TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+              TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+              YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+              N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+              iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+              IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+              6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+              qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+              HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+              n3MVF9w=
+              -----END CERTIFICATE-----
+server_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.PEMBasedSslContextFactory
+    internode_encryption: none
+    keystore: test/conf/cassandra_ssl_test.keystore.pem
+    keystore_password: cassandra
+    truststore: test/conf/cassandra_ssl_test.truststore.pem
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput: 0MiB/s
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+prepared_statements_cache_size: 1MiB
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound: 24MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+file_cache_enabled: true
diff --git a/test/conf/cassandra-seeds.yaml b/test/conf/cassandra-seeds.yaml
index f3279ae..1c38f8e 100644
--- a/test/conf/cassandra-seeds.yaml
+++ b/test/conf/cassandra-seeds.yaml
@@ -7,7 +7,7 @@
 memtable_allocation_type: offheap_objects
 commitlog_sync: batch
 commitlog_sync_batch_window_in_ms: 1.0
-commitlog_segment_size_in_mb: 5
+commitlog_segment_size: 5MiB
 commitlog_directory: build/test/cassandra/commitlog
 cdc_raw_directory: build/test/cassandra/cdc_raw
 cdc_enabled: false
@@ -17,7 +17,7 @@
 storage_port: 7012
 start_native_transport: true
 native_transport_port: 9042
-column_index_size_in_kb: 4
+column_index_size: 4KiB
 saved_caches_directory: build/test/cassandra/saved_caches
 data_file_directories:
     - build/test/cassandra/data
@@ -36,8 +36,8 @@
     truststore_password: cassandra
 incremental_backups: true
 concurrent_compactors: 4
-compaction_throughput_mb_per_sec: 0
+compaction_throughput: 0MiB/s
 row_cache_class_name: org.apache.cassandra.cache.OHCProvider
-row_cache_size_in_mb: 16
-enable_user_defined_functions: true
-enable_scripted_user_defined_functions: true
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
diff --git a/test/conf/cassandra-sslcontextfactory-invalidconfiguration.yaml b/test/conf/cassandra-sslcontextfactory-invalidconfiguration.yaml
new file mode 100644
index 0000000..d3970cb
--- /dev/null
+++ b/test/conf/cassandra-sslcontextfactory-invalidconfiguration.yaml
@@ -0,0 +1,82 @@
+#
+# 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.
+#
+
+#
+# Testing for pluggable ssl_context_factory option for client and server encryption options with a valid and a missing
+# implementation classes.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_sync_batch_window_in_ms: 1.0
+commitlog_segment_size: 5MiB
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+client_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.DummySslContextFactoryImpl
+        parameters:
+            key1: "value1"
+            key2: "value2"
+            key3: "value3"
+            truststore: conf/.truststore
+            truststore_password: cassandra
+    keystore: conf/.keystore
+    keystore_password: cassandra
+server_encryption_options:
+    internode_encryption: none
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    truststore: conf/.truststore
+    truststore_password: cassandra
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput: 0MiB/s
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+prepared_statements_cache_size: 1MiB
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound: 23841858MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+file_cache_enabled: true
diff --git a/test/conf/cassandra-sslcontextfactory.yaml b/test/conf/cassandra-sslcontextfactory.yaml
new file mode 100644
index 0000000..fde4bfd
--- /dev/null
+++ b/test/conf/cassandra-sslcontextfactory.yaml
@@ -0,0 +1,85 @@
+#
+# 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.
+#
+
+#
+# Testing for pluggable ssl_context_factory option for client and server encryption options with a valid and a missing
+# implementation classes.
+#
+cluster_name: Test Cluster
+# memtable_allocation_type: heap_buffers
+memtable_allocation_type: offheap_objects
+commitlog_sync: batch
+commitlog_sync_batch_window_in_ms: 1.0
+commitlog_segment_size: 5MiB
+commitlog_directory: build/test/cassandra/commitlog
+# commitlog_compression:
+# - class_name: LZ4Compressor
+cdc_raw_directory: build/test/cassandra/cdc_raw
+cdc_enabled: false
+hints_directory: build/test/cassandra/hints
+partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
+listen_address: 127.0.0.1
+storage_port: 7012
+ssl_storage_port: 17012
+start_native_transport: true
+native_transport_port: 9042
+column_index_size: 4KiB
+saved_caches_directory: build/test/cassandra/saved_caches
+data_file_directories:
+    - build/test/cassandra/data
+disk_access_mode: mmap
+seed_provider:
+    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
+      parameters:
+          - seeds: "127.0.0.1:7012"
+endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
+dynamic_snitch: true
+client_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.DummySslContextFactoryImpl
+        parameters:
+            key1: "value1"
+            key2: "value2"
+            key3: "value3"
+    keystore: dummy-keystore
+server_encryption_options:
+    ssl_context_factory:
+        class_name: org.apache.cassandra.security.MissingSslContextFactoryImpl
+        parameters:
+            key1: "value1"
+            key2: "value2"
+            key3: "value3"
+    internode_encryption: none
+    keystore: conf/.keystore
+    keystore_password: cassandra
+    truststore: conf/.truststore
+    truststore_password: cassandra
+incremental_backups: true
+concurrent_compactors: 4
+compaction_throughput: 0MiB/s
+row_cache_class_name: org.apache.cassandra.cache.OHCProvider
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+prepared_statements_cache_size: 1MiB
+corrupted_tombstone_strategy: exception
+stream_entire_sstables: true
+stream_throughput_outbound: 23841858MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+file_cache_enabled: true
diff --git a/test/conf/cassandra.yaml b/test/conf/cassandra.yaml
index 017797f..89c5685 100644
--- a/test/conf/cassandra.yaml
+++ b/test/conf/cassandra.yaml
@@ -7,7 +7,7 @@
 memtable_allocation_type: offheap_objects
 commitlog_sync: batch
 commitlog_sync_batch_window_in_ms: 1.0
-commitlog_segment_size_in_mb: 5
+commitlog_segment_size: 5MiB
 commitlog_directory: build/test/cassandra/commitlog
 # commitlog_compression:
 # - class_name: LZ4Compressor
@@ -20,7 +20,7 @@
 ssl_storage_port: 17012
 start_native_transport: true
 native_transport_port: 9042
-column_index_size_in_kb: 4
+column_index_size: 4KiB
 saved_caches_directory: build/test/cassandra/saved_caches
 data_file_directories:
     - build/test/cassandra/data
@@ -39,18 +39,69 @@
     truststore_password: cassandra
 incremental_backups: true
 concurrent_compactors: 4
-compaction_throughput_mb_per_sec: 0
+compaction_throughput: 0MiB/s
 row_cache_class_name: org.apache.cassandra.cache.OHCProvider
-row_cache_size_in_mb: 16
-enable_user_defined_functions: true
-enable_scripted_user_defined_functions: true
-prepared_statements_cache_size_mb: 1
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+prepared_statements_cache_size: 1MiB
 corrupted_tombstone_strategy: exception
 stream_entire_sstables: true
-stream_throughput_outbound_megabits_per_sec: 200000000
-enable_sasi_indexes: true
-enable_materialized_views: true
-enable_drop_compact_storage: true
+stream_throughput_outbound: 23841858MiB/s
+sasi_indexes_enabled: true
+materialized_views_enabled: true
+drop_compact_storage_enabled: true
 file_cache_enabled: true
 full_query_logging_options:
   allow_nodetool_archive_command: true
+auto_hints_cleanup_enabled: true
+
+read_thresholds_enabled: true
+coordinator_read_size_warn_threshold: 1024KiB
+coordinator_read_size_fail_threshold: 4096KiB
+local_read_size_warn_threshold: 4096KiB
+local_read_size_fail_threshold: 8192KiB
+row_index_read_size_warn_threshold: 4096KiB
+row_index_read_size_fail_threshold: 8192KiB
+
+memtable:
+    configurations:
+        skiplist:
+            inherits: default
+            class_name: SkipListMemtable
+        skiplist_sharded:
+            class_name: ShardedSkipListMemtable
+            parameters:
+                serialize_writes: false
+                shards: 4
+        skiplist_sharded_locking:
+            inherits: skiplist_sharded
+            parameters:
+                serialize_writes: true
+        skiplist_remapped:
+            inherits: skiplist
+        test_fullname:
+            inherits: default
+            class_name: org.apache.cassandra.db.memtable.TestMemtable
+        test_shortname:
+            class_name: TestMemtable
+            parameters:
+                skiplist: true  # note: YAML must interpret this as string, not a boolean
+        test_empty_class:
+            class_name: ""
+        test_missing_class:
+            parameters:
+        test_unknown_class:
+            class_name: NotExisting
+        test_invalid_param:
+            class_name: SkipListMemtable
+            parameters:
+                invalid: throw
+        test_invalid_extra_param:
+            inherits: test_shortname
+            parameters:
+                invalid: throw
+        test_invalid_factory_method:
+            class_name: org.apache.cassandra.cql3.validation.operations.CreateTest$InvalidMemtableFactoryMethod
+        test_invalid_factory_field:
+            class_name: org.apache.cassandra.cql3.validation.operations.CreateTest$InvalidMemtableFactoryField
diff --git a/test/conf/cassandra_deprecated_parameters_names.yaml b/test/conf/cassandra_deprecated_parameters_names.yaml
deleted file mode 100644
index 3258b7f..0000000
--- a/test/conf/cassandra_deprecated_parameters_names.yaml
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-# Warning!
-# Consider the effects on 'o.a.c.i.s.LegacySSTableTest' before changing schemas in this file.
-#
-cluster_name: Test Cluster
-# memtable_allocation_type: heap_buffers
-memtable_allocation_type: offheap_objects
-commitlog_sync: batch
-commitlog_sync_batch_window_in_ms: 1.0
-commitlog_segment_size_in_mb: 5
-commitlog_directory: build/test/cassandra/commitlog
-# commitlog_compression:
-# - class_name: LZ4Compressor
-cdc_raw_directory: build/test/cassandra/cdc_raw
-cdc_enabled: false
-hints_directory: build/test/cassandra/hints
-partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner
-listen_address: 127.0.0.1
-storage_port: 7012
-ssl_storage_port: 17012
-start_native_transport: true
-native_transport_port: 9042
-column_index_size_in_kb: 4
-saved_caches_directory: build/test/cassandra/saved_caches
-data_file_directories:
-    - build/test/cassandra/data
-disk_access_mode: mmap
-seed_provider:
-    - class_name: org.apache.cassandra.locator.SimpleSeedProvider
-      parameters:
-          - seeds: "127.0.0.1:7012"
-endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch
-dynamic_snitch: true
-server_encryption_options:
-    internode_encryption: none
-    keystore: conf/.keystore
-    keystore_password: cassandra
-    truststore: conf/.truststore
-    truststore_password: cassandra
-incremental_backups: true
-concurrent_compactors: 4
-compaction_throughput_mb_per_sec: 0
-row_cache_class_name: org.apache.cassandra.cache.OHCProvider
-row_cache_size_in_mb: 16
-enable_user_defined_functions: true
-enable_scripted_user_defined_functions: true
-prepared_statements_cache_size_mb: 1
-corrupted_tombstone_strategy: exception
-stream_entire_sstables: true
-stream_throughput_outbound_megabits_per_sec: 200000000
-enable_sasi_indexes: true
-enable_materialized_views: true
-enable_drop_compact_storage: true
-file_cache_enabled: true
-internode_send_buff_size_in_bytes: 5
-internode_recv_buff_size_in_bytes: 5
diff --git a/test/conf/cassandra_encryption.yaml b/test/conf/cassandra_encryption.yaml
index 47e1312..3b8d08d 100644
--- a/test/conf/cassandra_encryption.yaml
+++ b/test/conf/cassandra_encryption.yaml
@@ -1,14 +1,14 @@
 transparent_data_encryption_options:
-    enabled: true
-    chunk_length_kb: 2
-    cipher: AES/CBC/PKCS5Padding
-    key_alias: testing:1
-    # CBC requires iv length to be 16 bytes
-    # iv_length: 16
-    key_provider: 
-      - class_name: org.apache.cassandra.security.JKSKeyProvider
-        parameters: 
-          - keystore: test/conf/cassandra.keystore
-            keystore_password: cassandra
-            store_type: JCEKS
-            key_password: cassandra
+  enabled: true
+  chunk_length_kb: 2
+  cipher: AES/CBC/PKCS5Padding
+  key_alias: testing:1
+  # CBC requires iv length to be 16 bytes
+  # iv_length: 16
+  key_provider:
+    - class_name: org.apache.cassandra.security.JKSKeyProvider
+      parameters:
+        - keystore: test/conf/cassandra.keystore
+          keystore_password: cassandra
+          store_type: JCEKS
+          key_password: cassandra
diff --git a/test/conf/cassandra_ssl_test.keystore.pem b/test/conf/cassandra_ssl_test.keystore.pem
new file mode 100644
index 0000000..ed981cc
--- /dev/null
+++ b/test/conf/cassandra_ssl_test.keystore.pem
@@ -0,0 +1,51 @@
+-----BEGIN ENCRYPTED PRIVATE KEY-----
+MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/
+g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl
+xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29
+L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V
+sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/
+f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8
+RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR
+0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs
+evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU
+tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6
+wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN
+K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv
+zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5
+mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo
+WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ
+jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6
+eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny
+DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn
+AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY
+Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow
+Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut
+ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr
+bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH
+hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI
+RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw
+pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP
+FujZhqbKUDbYAcqTkoQ=
+-----END ENCRYPTED PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+n3MVF9w=
+-----END CERTIFICATE-----
diff --git a/test/conf/cassandra_ssl_test.truststore.pem b/test/conf/cassandra_ssl_test.truststore.pem
new file mode 100644
index 0000000..8806ce8
--- /dev/null
+++ b/test/conf/cassandra_ssl_test.truststore.pem
@@ -0,0 +1,22 @@
+-----BEGIN CERTIFICATE-----
+MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+n3MVF9w=
+-----END CERTIFICATE-----
diff --git a/test/conf/cassandra_ssl_test.unencrypted_keystore.pem b/test/conf/cassandra_ssl_test.unencrypted_keystore.pem
new file mode 100644
index 0000000..ce3d8e7
--- /dev/null
+++ b/test/conf/cassandra_ssl_test.unencrypted_keystore.pem
@@ -0,0 +1,50 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOSZVf8dLj1xLw
+efqjbogbAwhwRXd3tmEfQY1zHyudJF3XR1T0Xp26BKNvAYUxxZRDNg16M3prPRZv
+wkhDJdE9NaN+BpZPJUavRsZOfGDq/CHN8j/2PPKrn3G/b065JjV3GZjfV/Sln047
+DeZptaSyOg7ZN7F8qjGqxEcnw+szV/wTzhnjGjZMlcbOm4jFGQAn6xUOooQCGsoB
+9FgxKB0nvNG3xVe/2eCNfbS4DabT3Y1wfQqZ62hOa5ZS0rwT+pw3tQs3zFFY1Sfi
+G7qYbqZrKTheWIZGojVVm6mqH4yA2ofOe5N3RsBitCwU/D0dpnaG9Wcl98nmXueM
+B6Rk04v7AgMBAAECggEAYnxIKjrFz/JkJ5MmiszM5HV698r9YB0aqHnFIHPoykIL
+uiCjiumantDrFsCkosixULwvI/BRwbxstTpyrheU9psT6P1CONICVPvV8ylgJAYU
+l+ofn56cEXKxVuICSWFLDH7pM1479g+IJJQAchbKQpqxAGTuMu3SpvJolfuj5srt
+bM7/RYhJFLwDuvHNA3ivlogMneItP03+C25aaxstM+lBuBf68+n78zMgSvt6J/6Y
+G2TOMKnxveMlG2qu9l2lAw/2i8daG/qre08nTH7wpRx0gZLZqNpe45exkrzticzF
+FgWYjG2K2brX21jqHroFgMhdXF7zhhRgLoIeC0BrIQKBgQDCfGfWrJESKBbVai5u
+7wqD9nlzjv6N6FXfTDOPXO1vz5frdvtLVWbs0SMPy+NglkaZK0iqHvb9mf2of8eC
+0D5cmewjn7WCDBQMypIMYgT912ak/BBVuGXcxb6UgD+xARfSARo2C8NG1hfprw1W
+ad14CjS5xhFMs44HpVYhI7iPYwKBgQC7SqVG/b37vZ7CINemdvoMujLvvYXDJJM8
+N21LqNJfVXdukdH3T0xuLnh9Z/wPHjJDMF/9+1foxSEPHijtyz5P19EilNEC/3qw
+fI19+VZoY0mdhPtXSGzy+rbTE2v71QgwFLizSos14Gr+eNiIjF7FYccK05++K/zk
+cd8ZA3bwiQKBgQCl+HTFBs9mpz+VMOAfW2+l3hkXPNiPUc62mNkHZ05ZNNd44jjh
+uSf0wSUiveR08MmevQlt5K7zDQ8jVKh2QjB15gVXAVxsdtJFeDnax2trFP9LnLBz
+9sE2/qn9INU5wK0LUlWD+dXUBbCyg+jl7cJKRqtoPldVFYYHkFlIPqup8QKBgHXv
+hyuw1FUVDkdHzwOvn70r8q8sNHKxMVWVwWkHIZGOi+pAQGrusD4hXRX6yKnsZdIR
+QCD6iFy25R5T64nxlYdJaxPPid3NakB/7ckJnPOWseBSwMIxhQlr/nvjmve1Kba9
+FaEwq4B9lGIxToiNe4/nBiM3JzvlDxX67nUdzWOhAoGAdFvriyvjshSJ4JHgIY9K
+37BVB0VKMcFV2P8fLVWO5oyRtE1bJhU4QVpQmauABU4RGSojJ3NPIVH1wxmJeYtj
+Q3b7EZaqI6ovna2eK2qtUx4WwxhRaXTT8xueBI2lgL6sBSTGG+K69ZOzGQzG/Mfr
+RXKInnLInFD9JD94VqmMozo=
+-----END PRIVATE KEY-----
+-----BEGIN CERTIFICATE-----
+MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV
+bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD
+VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh
+Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx
+EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu
+a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw
+FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A
+MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d
+ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy
+q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2
+TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto
+TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA
+YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD
+N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v
+iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh
+IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv
+6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG
+qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa
+HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru
+n3MVF9w=
+-----END CERTIFICATE-----
diff --git a/test/conf/cdc.yaml b/test/conf/cdc.yaml
index 8fb9427..f79930a 100644
--- a/test/conf/cdc.yaml
+++ b/test/conf/cdc.yaml
@@ -1,4 +1 @@
 cdc_enabled: true
-# Compression enabled since uncompressed + cdc isn't compatible w/Windows
-commitlog_compression:
-  - class_name: LZ4Compressor
diff --git a/test/conf/harry-generic.yaml b/test/conf/harry-generic.yaml
new file mode 100644
index 0000000..e4bfbab
--- /dev/null
+++ b/test/conf/harry-generic.yaml
@@ -0,0 +1,75 @@
+seed: 1
+
+# Default schema provider generates random schema
+schema_provider:
+  default: {}
+
+drop_schema: false
+create_schema: true
+truncate_table: false
+
+clock:
+  approximate_monotonic:
+    history_size: 7300
+    epoch_length: 1
+    epoch_time_unit: "SECONDS"
+
+system_under_test:
+  println: {}
+
+partition_descriptor_selector:
+  default:
+    window_size: 100
+    slide_after_repeats: 10
+
+clustering_descriptor_selector:
+  default:
+    modifications_per_lts:
+      type: "constant"
+      constant: 2
+    rows_per_modification:
+      type: "constant"
+      constant: 2
+    operation_kind_weights:
+      DELETE_RANGE: 1
+      DELETE_SLICE: 1
+      DELETE_ROW: 1
+      DELETE_COLUMN: 1
+      DELETE_PARTITION: 1
+      INSERT: 50
+      UPDATE: 50
+      DELETE_COLUMN_WITH_STATICS: 1
+      INSERT_WITH_STATICS: 1
+      UPDATE_WITH_STATICS: 1
+    column_mask_bitsets: null
+    max_partition_size: 100
+
+data_tracker:
+  default:
+    max_seen_lts: -1
+    max_complete_lts: -1
+
+runner:
+  sequential:
+    run_time: 60
+    run_time_unit: "MINUTES"
+    visitors:
+      - logging:
+          row_visitor:
+            mutating: {}
+      - sampler:
+          trigger_after: 100000
+          sample_partitions: 10
+      - validate_recent_partitions:
+          partition_count: 5
+          trigger_after: 10000
+          model:
+            querying_no_op_checker: {}
+      - validate_all_partitions:
+          concurrency: 5
+          trigger_after: 10000
+          model:
+            querying_no_op_checker: {}
+
+metric_reporter:
+  no_op: {}
\ No newline at end of file
diff --git a/test/conf/logback-simulator.xml b/test/conf/logback-simulator.xml
new file mode 100644
index 0000000..25c9de8
--- /dev/null
+++ b/test/conf/logback-simulator.xml
@@ -0,0 +1,59 @@
+<!--
+  ~ 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.
+  -->
+
+<configuration debug="false" scan="true" scanPeriod="60 seconds">
+  <define name="cluster_id" class="org.apache.cassandra.distributed.impl.ClusterIDDefiner" />
+  <define name="instance_id" class="org.apache.cassandra.distributed.impl.InstanceIDDefiner" />
+
+  <!-- Shutdown hook ensures that async appender flushes -->
+  <shutdownHook class="ch.qos.logback.core.hook.DelayingShutdownHook"/>
+
+  <appender name="INSTANCEFILE" class="ch.qos.logback.core.FileAppender">
+    <file>./build/test/logs/${cassandra.testtag}/${suitename}/${cluster_id}/${instance_id}/system.log</file>
+    <encoder>
+      <pattern>%-5level [%thread] ${instance_id} %date{ISO8601} %msg%n</pattern>
+    </encoder>
+    <immediateFlush>true</immediateFlush>
+  </appender>
+
+  <appender name="STDOUT" target="System.out" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%-5level [%thread] ${instance_id} %date{ISO8601} %F:%L - %msg%n</pattern>
+    </encoder>
+    <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
+      <level>WARN</level>
+    </filter>
+  </appender>
+
+  <logger name="org.apache.cassandra.locator.TokenMetadata" level="ERROR"/>
+  <logger name="org.apache.cassandra.net.Message" level="ERROR"/>
+  <logger name="org.reflections.Reflections" level="ERROR"/>
+  <logger name="org.apache.hadoop" level="WARN"/>
+  <logger name="org.apache.cassandra.utils.SigarLibrary" level="ERROR"/>
+  <logger name="org.apache.cassandra.utils.FBUtilities" level="ERROR"/>
+  <logger name="org.apache.cassandra.config.DatabaseDescriptor" level="ERROR"/>
+  <logger name="org.apache.cassandra.service.StartupChecks" level="ERROR"/>
+  <logger name="org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir" level="ERROR"/>
+  <logger name="io.netty.handler.ssl.SslHandler" level="WARN"/>
+
+  <root level="INFO">
+    <appender-ref ref="INSTANCEFILE" />
+    <appender-ref ref="STDOUT" />
+  </root>
+</configuration>
+
diff --git a/test/conf/unit-test-conf/test-native-port.yaml b/test/conf/unit-test-conf/test-native-port.yaml
index b46525f..c8ed929 100644
--- a/test/conf/unit-test-conf/test-native-port.yaml
+++ b/test/conf/unit-test-conf/test-native-port.yaml
@@ -7,7 +7,7 @@
 memtable_allocation_type: offheap_objects
 commitlog_sync: batch
 commitlog_sync_batch_window_in_ms: 1.0
-commitlog_segment_size_in_mb: 5
+commitlog_segment_size: 5MiB
 commitlog_directory: build/test/cassandra/commitlog
 # commitlog_compression:
 # - class_name: LZ4Compressor
@@ -20,7 +20,7 @@
 ssl_storage_port: 7011
 start_native_transport: true
 native_transport_port_ssl: 9142
-column_index_size_in_kb: 4
+column_index_size: 4KiB
 saved_caches_directory: build/test/cassandra/saved_caches
 data_file_directories:
 - build/test/cassandra/data
@@ -39,15 +39,15 @@
   truststore_password: cassandra
 incremental_backups: true
 concurrent_compactors: 4
-compaction_throughput_mb_per_sec: 0
+compaction_throughput: 0MiB/s
 row_cache_class_name: org.apache.cassandra.cache.OHCProvider
-row_cache_size_in_mb: 16
-enable_user_defined_functions: true
-enable_scripted_user_defined_functions: true
-prepared_statements_cache_size_mb: 1
+row_cache_size: 16MiB
+user_defined_functions_enabled: true
+scripted_user_defined_functions_enabled: true
+prepared_statements_cache_size: 1MiB
 corrupted_tombstone_strategy: exception
 stream_entire_sstables: true
-stream_throughput_outbound_megabits_per_sec: 200000000
+stream_throughput_outbound: 23841858MiB/s
 
 client_encryption_options:
   enabled: true
diff --git a/test/data/config/version=3.0.0-alpha1.yml b/test/data/config/version=3.0.0-alpha1.yml
new file mode 100644
index 0000000..4c5381b
--- /dev/null
+++ b/test/data/config/version=3.0.0-alpha1.yml
@@ -0,0 +1,214 @@
+---
+trickle_fsync: "java.lang.Boolean"
+rpc_listen_backlog: "java.lang.Integer"
+max_streaming_retries: "java.lang.Integer"
+native_transport_flush_in_batches_legacy: "java.lang.Boolean"
+row_cache_save_period: "java.lang.Integer"
+rpc_address: "java.lang.String"
+disk_optimization_estimate_percentile: "java.lang.Double"
+hinted_handoff_disabled_datacenters: "java.util.Set"
+num_tokens: "java.lang.Integer"
+read_request_timeout_in_ms: "java.lang.Long"
+rpc_max_threads: "java.lang.Integer"
+enable_drop_compact_storage: "java.lang.Boolean"
+commitlog_directory: "java.lang.String"
+unlogged_batch_across_partitions_warn_threshold: "java.lang.Integer"
+auto_bootstrap: "java.lang.Boolean"
+authorizer: "java.lang.String"
+memtable_heap_space_in_mb: "java.lang.Integer"
+index_interval: "java.lang.Integer"
+sstable_preemptive_open_interval_in_mb: "java.lang.Integer"
+broadcast_rpc_address: "java.lang.String"
+commitlog_sync: "org.apache.cassandra.config.Config.CommitLogSync"
+listen_interface_prefer_ipv6: "java.lang.Boolean"
+repair_session_max_tree_depth: "java.lang.Integer"
+request_scheduler_options:
+  throttle_limit: "java.lang.Integer"
+  default_weight: "java.lang.Integer"
+  weights: "java.util.Map"
+user_defined_function_warn_timeout: "java.lang.Long"
+request_scheduler_id: "org.apache.cassandra.config.Config.RequestSchedulerId"
+tracetype_repair_ttl: "java.lang.Integer"
+rpc_send_buff_size_in_bytes: "java.lang.Integer"
+concurrent_compactors: "java.lang.Integer"
+buffer_pool_use_heap_if_exhausted: "java.lang.Boolean"
+concurrent_materialized_view_writes: "java.lang.Integer"
+commitlog_total_space_in_mb: "java.lang.Integer"
+hints_directory: "java.lang.String"
+listen_address: "java.lang.String"
+native_transport_max_concurrent_connections_per_ip: "java.lang.Long"
+rpc_keepalive: "java.lang.Boolean"
+request_scheduler: "java.lang.String"
+rpc_interface_prefer_ipv6: "java.lang.Boolean"
+check_for_duplicate_rows_during_compaction: "java.lang.Boolean"
+request_timeout_in_ms: "java.lang.Long"
+user_function_timeout_policy: "org.apache.cassandra.config.Config.UserFunctionTimeoutPolicy"
+disk_access_mode: "org.apache.cassandra.config.Config.DiskAccessMode"
+rpc_server_type: "java.lang.String"
+concurrent_counter_writes: "java.lang.Integer"
+counter_write_request_timeout_in_ms: "java.lang.Long"
+roles_update_interval_in_ms: "java.lang.Integer"
+row_cache_size_in_mb: "java.lang.Long"
+memtable_allocation_type: "org.apache.cassandra.config.Config.MemtableAllocationType"
+trickle_fsync_interval_in_kb: "java.lang.Integer"
+cas_contention_timeout_in_ms: "java.lang.Long"
+key_cache_size_in_mb: "java.lang.Long"
+tombstone_warn_threshold: "java.lang.Integer"
+min_free_space_per_drive_in_mb: "java.lang.Integer"
+write_request_timeout_in_ms: "java.lang.Long"
+cross_node_timeout: "java.lang.Boolean"
+dynamic_snitch: "java.lang.Boolean"
+permissions_validity_in_ms: "java.lang.Integer"
+phi_convict_threshold: "java.lang.Double"
+commitlog_sync_batch_window_in_ms: "java.lang.Double"
+native_transport_max_threads: "java.lang.Integer"
+thrift_max_message_length_in_mb: "java.lang.Integer"
+disk_failure_policy: "org.apache.cassandra.config.Config.DiskFailurePolicy"
+permissions_update_interval_in_ms: "java.lang.Integer"
+tombstone_failure_threshold: "java.lang.Integer"
+authenticator: "java.lang.String"
+max_mutation_size_in_kb: "java.lang.Integer"
+cache_load_timeout_seconds: "java.lang.Integer"
+initial_token: "java.lang.String"
+batch_size_warn_threshold_in_kb: "java.lang.Integer"
+concurrent_replicates: "java.lang.Integer"
+dynamic_snitch_badness_threshold: "java.lang.Double"
+index_summary_capacity_in_mb: "java.lang.Long"
+commitlog_sync_period_in_ms: "java.lang.Integer"
+counter_cache_keys_to_save: "java.lang.Integer"
+disk_optimization_page_cross_chance: "java.lang.Double"
+listen_on_broadcast_address: "java.lang.Boolean"
+native_transport_max_concurrent_requests_in_bytes: "java.lang.Long"
+rpc_min_threads: "java.lang.Integer"
+row_cache_class_name: "java.lang.String"
+gc_warn_threshold_in_ms: "java.lang.Integer"
+disk_optimization_strategy: "org.apache.cassandra.config.Config.DiskOptimizationStrategy"
+compaction_large_partition_warning_threshold_mb: "java.lang.Integer"
+enable_user_defined_functions_threads: "java.lang.Boolean"
+hinted_handoff_throttle_in_kb: "java.lang.Integer"
+otc_backlog_expiration_interval_ms: "java.lang.Integer"
+counter_cache_save_period: "java.lang.Integer"
+otc_coalescing_enough_coalesced_messages: "java.lang.Integer"
+hints_flush_period_in_ms: "java.lang.Integer"
+role_manager: "java.lang.String"
+thrift_framed_transport_size_in_mb: "java.lang.Integer"
+server_encryption_options:
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  internode_encryption: "org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  truststore: "java.lang.String"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  algorithm: "java.lang.String"
+max_hints_delivery_threads: "java.lang.Integer"
+column_index_size_in_kb: "java.lang.Integer"
+memtable_offheap_space_in_mb: "java.lang.Integer"
+data_file_directories: "java.util.List"
+saved_caches_directory: "java.lang.String"
+native_transport_max_frame_size_in_mb: "java.lang.Integer"
+index_summary_resize_interval_in_minutes: "java.lang.Integer"
+streaming_socket_timeout_in_ms: "java.lang.Integer"
+encryption_options:
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  internode_encryption: "org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  truststore: "java.lang.String"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  algorithm: "java.lang.String"
+start_rpc: "java.lang.Boolean"
+enable_user_defined_functions: "java.lang.Boolean"
+max_hint_window_in_ms: "java.lang.Integer"
+gc_log_threshold_in_ms: "java.lang.Integer"
+snapshot_on_duplicate_row_detection: "java.lang.Boolean"
+seed_provider:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+check_for_duplicate_rows_during_reads: "java.lang.Boolean"
+internode_compression: "org.apache.cassandra.config.Config.InternodeCompression"
+internode_send_buff_size_in_bytes: "java.lang.Integer"
+otc_coalescing_window_us: "java.lang.Integer"
+batchlog_replay_throttle_in_kb: "java.lang.Integer"
+enable_scripted_user_defined_functions: "java.lang.Boolean"
+commitlog_compression:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+broadcast_address: "java.lang.String"
+rpc_recv_buff_size_in_bytes: "java.lang.Integer"
+enable_materialized_views: "java.lang.Boolean"
+roles_validity_in_ms: "java.lang.Integer"
+snapshot_before_compaction: "java.lang.Boolean"
+native_transport_port_ssl: "java.lang.Integer"
+allocate_tokens_for_keyspace: "java.lang.String"
+storage_port: "java.lang.Integer"
+counter_cache_size_in_mb: "java.lang.Long"
+native_transport_port: "java.lang.Integer"
+dynamic_snitch_reset_interval_in_ms: "java.lang.Integer"
+permissions_cache_max_entries: "java.lang.Integer"
+tracetype_query_ttl: "java.lang.Integer"
+stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
+rpc_port: "java.lang.Integer"
+commit_failure_policy: "org.apache.cassandra.config.Config.CommitFailurePolicy"
+concurrent_writes: "java.lang.Integer"
+range_request_timeout_in_ms: "java.lang.Long"
+dynamic_snitch_update_interval_in_ms: "java.lang.Integer"
+hints_compression:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+commitlog_periodic_queue_size: "java.lang.Integer"
+hinted_handoff_enabled: "java.lang.Boolean"
+max_value_size_in_mb: "java.lang.Integer"
+memtable_flush_writers: "java.lang.Integer"
+otc_coalescing_strategy: "java.lang.String"
+commitlog_max_compression_buffers_in_pool: "java.lang.Integer"
+roles_cache_max_entries: "java.lang.Integer"
+native_transport_max_negotiable_protocol_version: "java.lang.Integer"
+partitioner: "java.lang.String"
+internode_recv_buff_size_in_bytes: "java.lang.Integer"
+listen_interface: "java.lang.String"
+start_native_transport: "java.lang.Boolean"
+ssl_storage_port: "java.lang.Integer"
+user_defined_function_fail_timeout: "java.lang.Long"
+cluster_name: "java.lang.String"
+incremental_backups: "java.lang.Boolean"
+file_cache_size_in_mb: "java.lang.Integer"
+inter_dc_tcp_nodelay: "java.lang.Boolean"
+internode_authenticator: "java.lang.String"
+key_cache_keys_to_save: "java.lang.Integer"
+key_cache_save_period: "java.lang.Integer"
+windows_timer_interval: "java.lang.Integer"
+rpc_interface: "java.lang.String"
+commitlog_segment_size_in_mb: "java.lang.Integer"
+row_cache_keys_to_save: "java.lang.Integer"
+replica_filtering_protection:
+  cached_rows_fail_threshold: "java.lang.Integer"
+  cached_rows_warn_threshold: "java.lang.Integer"
+native_transport_max_concurrent_requests_in_bytes_per_ip: "java.lang.Long"
+native_transport_max_concurrent_connections: "java.lang.Long"
+memtable_cleanup_threshold: "java.lang.Float"
+concurrent_reads: "java.lang.Integer"
+inter_dc_stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
+truncate_request_timeout_in_ms: "java.lang.Long"
+client_encryption_options:
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  optional: "java.lang.Boolean"
+  truststore: "java.lang.String"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  enabled: "java.lang.Boolean"
+  algorithm: "java.lang.String"
+auto_snapshot: "java.lang.Boolean"
+batch_size_fail_threshold_in_kb: "java.lang.Integer"
+compaction_throughput_mb_per_sec: "java.lang.Integer"
+max_hints_file_size_in_mb: "java.lang.Integer"
+endpoint_snitch: "java.lang.String"
diff --git a/test/data/config/version=3.11.0.yml b/test/data/config/version=3.11.0.yml
new file mode 100644
index 0000000..9492cbf
--- /dev/null
+++ b/test/data/config/version=3.11.0.yml
@@ -0,0 +1,247 @@
+---
+trickle_fsync: "java.lang.Boolean"
+rpc_listen_backlog: "java.lang.Integer"
+max_streaming_retries: "java.lang.Integer"
+cdc_total_space_in_mb: "java.lang.Integer"
+native_transport_flush_in_batches_legacy: "java.lang.Boolean"
+row_cache_save_period: "java.lang.Integer"
+rpc_address: "java.lang.String"
+disk_optimization_estimate_percentile: "java.lang.Double"
+hinted_handoff_disabled_datacenters: "java.util.Set"
+cdc_enabled: "java.lang.Boolean"
+cdc_raw_directory: "java.lang.String"
+num_tokens: "java.lang.Integer"
+read_request_timeout_in_ms: "java.lang.Long"
+rpc_max_threads: "java.lang.Integer"
+enable_drop_compact_storage: "java.lang.Boolean"
+commitlog_directory: "java.lang.String"
+unlogged_batch_across_partitions_warn_threshold: "java.lang.Integer"
+credentials_validity_in_ms: "java.lang.Integer"
+auto_bootstrap: "java.lang.Boolean"
+authorizer: "java.lang.String"
+memtable_heap_space_in_mb: "java.lang.Integer"
+index_interval: "java.lang.Integer"
+sstable_preemptive_open_interval_in_mb: "java.lang.Integer"
+broadcast_rpc_address: "java.lang.String"
+commitlog_sync: "org.apache.cassandra.config.Config.CommitLogSync"
+listen_interface_prefer_ipv6: "java.lang.Boolean"
+repair_session_max_tree_depth: "java.lang.Integer"
+request_scheduler_options:
+  throttle_limit: "java.lang.Integer"
+  default_weight: "java.lang.Integer"
+  weights: "java.util.Map"
+user_defined_function_warn_timeout: "java.lang.Long"
+request_scheduler_id: "org.apache.cassandra.config.Config.RequestSchedulerId"
+tracetype_repair_ttl: "java.lang.Integer"
+rpc_send_buff_size_in_bytes: "java.lang.Integer"
+concurrent_compactors: "java.lang.Integer"
+buffer_pool_use_heap_if_exhausted: "java.lang.Boolean"
+concurrent_materialized_view_writes: "java.lang.Integer"
+commitlog_total_space_in_mb: "java.lang.Integer"
+hints_directory: "java.lang.String"
+listen_address: "java.lang.String"
+native_transport_max_concurrent_connections_per_ip: "java.lang.Long"
+rpc_keepalive: "java.lang.Boolean"
+request_scheduler: "java.lang.String"
+allow_extra_insecure_udfs: "java.lang.Boolean"
+rpc_interface_prefer_ipv6: "java.lang.Boolean"
+check_for_duplicate_rows_during_compaction: "java.lang.Boolean"
+request_timeout_in_ms: "java.lang.Long"
+user_function_timeout_policy: "org.apache.cassandra.config.Config.UserFunctionTimeoutPolicy"
+disk_access_mode: "org.apache.cassandra.config.Config.DiskAccessMode"
+rpc_server_type: "java.lang.String"
+concurrent_counter_writes: "java.lang.Integer"
+counter_write_request_timeout_in_ms: "java.lang.Long"
+roles_update_interval_in_ms: "java.lang.Integer"
+row_cache_size_in_mb: "java.lang.Long"
+memtable_allocation_type: "org.apache.cassandra.config.Config.MemtableAllocationType"
+trickle_fsync_interval_in_kb: "java.lang.Integer"
+cas_contention_timeout_in_ms: "java.lang.Long"
+key_cache_size_in_mb: "java.lang.Long"
+tombstone_warn_threshold: "java.lang.Integer"
+column_index_cache_size_in_kb: "java.lang.Integer"
+min_free_space_per_drive_in_mb: "java.lang.Integer"
+write_request_timeout_in_ms: "java.lang.Long"
+cross_node_timeout: "java.lang.Boolean"
+dynamic_snitch: "java.lang.Boolean"
+permissions_validity_in_ms: "java.lang.Integer"
+phi_convict_threshold: "java.lang.Double"
+commitlog_sync_batch_window_in_ms: "java.lang.Double"
+native_transport_max_threads: "java.lang.Integer"
+thrift_max_message_length_in_mb: "java.lang.Integer"
+disk_failure_policy: "org.apache.cassandra.config.Config.DiskFailurePolicy"
+permissions_update_interval_in_ms: "java.lang.Integer"
+tombstone_failure_threshold: "java.lang.Integer"
+authenticator: "java.lang.String"
+max_mutation_size_in_kb: "java.lang.Integer"
+allow_insecure_udfs: "java.lang.Boolean"
+cache_load_timeout_seconds: "java.lang.Integer"
+initial_token: "java.lang.String"
+batch_size_warn_threshold_in_kb: "java.lang.Integer"
+concurrent_replicates: "java.lang.Integer"
+dynamic_snitch_badness_threshold: "java.lang.Double"
+index_summary_capacity_in_mb: "java.lang.Long"
+commitlog_sync_period_in_ms: "java.lang.Integer"
+counter_cache_keys_to_save: "java.lang.Integer"
+disk_optimization_page_cross_chance: "java.lang.Double"
+listen_on_broadcast_address: "java.lang.Boolean"
+native_transport_max_concurrent_requests_in_bytes: "java.lang.Long"
+rpc_min_threads: "java.lang.Integer"
+row_cache_class_name: "java.lang.String"
+gc_warn_threshold_in_ms: "java.lang.Integer"
+disk_optimization_strategy: "org.apache.cassandra.config.Config.DiskOptimizationStrategy"
+compaction_large_partition_warning_threshold_mb: "java.lang.Integer"
+enable_user_defined_functions_threads: "java.lang.Boolean"
+hinted_handoff_throttle_in_kb: "java.lang.Integer"
+otc_backlog_expiration_interval_ms: "java.lang.Integer"
+counter_cache_save_period: "java.lang.Integer"
+otc_coalescing_enough_coalesced_messages: "java.lang.Integer"
+slow_query_log_timeout_in_ms: "java.lang.Long"
+hints_flush_period_in_ms: "java.lang.Integer"
+role_manager: "java.lang.String"
+thrift_framed_transport_size_in_mb: "java.lang.Integer"
+server_encryption_options:
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  internode_encryption: "org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  truststore: "java.lang.String"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  require_endpoint_verification: "java.lang.Boolean"
+  algorithm: "java.lang.String"
+max_hints_delivery_threads: "java.lang.Integer"
+column_index_size_in_kb: "java.lang.Integer"
+memtable_offheap_space_in_mb: "java.lang.Integer"
+data_file_directories: "java.util.List"
+saved_caches_directory: "java.lang.String"
+native_transport_max_frame_size_in_mb: "java.lang.Integer"
+index_summary_resize_interval_in_minutes: "java.lang.Integer"
+streaming_socket_timeout_in_ms: "java.lang.Integer"
+encryption_options:
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  internode_encryption: "org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  truststore: "java.lang.String"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  require_endpoint_verification: "java.lang.Boolean"
+  algorithm: "java.lang.String"
+file_cache_round_up: "java.lang.Boolean"
+streaming_keep_alive_period_in_secs: "java.lang.Integer"
+start_rpc: "java.lang.Boolean"
+enable_user_defined_functions: "java.lang.Boolean"
+max_hint_window_in_ms: "java.lang.Integer"
+enable_sasi_indexes: "java.lang.Boolean"
+gc_log_threshold_in_ms: "java.lang.Integer"
+snapshot_on_duplicate_row_detection: "java.lang.Boolean"
+seed_provider:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+check_for_duplicate_rows_during_reads: "java.lang.Boolean"
+internode_compression: "org.apache.cassandra.config.Config.InternodeCompression"
+internode_send_buff_size_in_bytes: "java.lang.Integer"
+otc_coalescing_window_us: "java.lang.Integer"
+credentials_cache_max_entries: "java.lang.Integer"
+batchlog_replay_throttle_in_kb: "java.lang.Integer"
+enable_scripted_user_defined_functions: "java.lang.Boolean"
+commitlog_compression:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+broadcast_address: "java.lang.String"
+rpc_recv_buff_size_in_bytes: "java.lang.Integer"
+credentials_update_interval_in_ms: "java.lang.Integer"
+enable_materialized_views: "java.lang.Boolean"
+roles_validity_in_ms: "java.lang.Integer"
+snapshot_before_compaction: "java.lang.Boolean"
+back_pressure_strategy:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+prepared_statements_cache_size_mb: "java.lang.Long"
+native_transport_port_ssl: "java.lang.Integer"
+allocate_tokens_for_keyspace: "java.lang.String"
+storage_port: "java.lang.Integer"
+counter_cache_size_in_mb: "java.lang.Long"
+native_transport_port: "java.lang.Integer"
+dynamic_snitch_reset_interval_in_ms: "java.lang.Integer"
+permissions_cache_max_entries: "java.lang.Integer"
+tracetype_query_ttl: "java.lang.Integer"
+stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
+rpc_port: "java.lang.Integer"
+commit_failure_policy: "org.apache.cassandra.config.Config.CommitFailurePolicy"
+concurrent_writes: "java.lang.Integer"
+range_request_timeout_in_ms: "java.lang.Long"
+dynamic_snitch_update_interval_in_ms: "java.lang.Integer"
+hints_compression:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+commitlog_periodic_queue_size: "java.lang.Integer"
+force_new_prepared_statement_behaviour: "java.lang.Boolean"
+hinted_handoff_enabled: "java.lang.Boolean"
+back_pressure_enabled: "java.lang.Boolean"
+max_value_size_in_mb: "java.lang.Integer"
+memtable_flush_writers: "java.lang.Integer"
+otc_coalescing_strategy: "java.lang.String"
+commitlog_max_compression_buffers_in_pool: "java.lang.Integer"
+roles_cache_max_entries: "java.lang.Integer"
+cdc_free_space_check_interval_ms: "java.lang.Integer"
+native_transport_max_negotiable_protocol_version: "java.lang.Integer"
+transparent_data_encryption_options:
+  cipher: "java.lang.String"
+  chunk_length_kb: "java.lang.Integer"
+  iv_length: "java.lang.Integer"
+  key_alias: "java.lang.String"
+  key_provider:
+    class_name: "java.lang.String"
+    parameters: "java.util.Map"
+  enabled: "java.lang.Boolean"
+partitioner: "java.lang.String"
+internode_recv_buff_size_in_bytes: "java.lang.Integer"
+listen_interface: "java.lang.String"
+start_native_transport: "java.lang.Boolean"
+ssl_storage_port: "java.lang.Integer"
+user_defined_function_fail_timeout: "java.lang.Long"
+cluster_name: "java.lang.String"
+incremental_backups: "java.lang.Boolean"
+file_cache_size_in_mb: "java.lang.Integer"
+inter_dc_tcp_nodelay: "java.lang.Boolean"
+internode_authenticator: "java.lang.String"
+key_cache_keys_to_save: "java.lang.Integer"
+key_cache_save_period: "java.lang.Integer"
+windows_timer_interval: "java.lang.Integer"
+rpc_interface: "java.lang.String"
+commitlog_segment_size_in_mb: "java.lang.Integer"
+row_cache_keys_to_save: "java.lang.Integer"
+replica_filtering_protection:
+  cached_rows_fail_threshold: "java.lang.Integer"
+  cached_rows_warn_threshold: "java.lang.Integer"
+native_transport_max_concurrent_requests_in_bytes_per_ip: "java.lang.Long"
+native_transport_max_concurrent_connections: "java.lang.Long"
+memtable_cleanup_threshold: "java.lang.Float"
+concurrent_reads: "java.lang.Integer"
+inter_dc_stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
+thrift_prepared_statements_cache_size_mb: "java.lang.Long"
+truncate_request_timeout_in_ms: "java.lang.Long"
+client_encryption_options:
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  optional: "java.lang.Boolean"
+  truststore: "java.lang.String"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  enabled: "java.lang.Boolean"
+  require_endpoint_verification: "java.lang.Boolean"
+  algorithm: "java.lang.String"
+auto_snapshot: "java.lang.Boolean"
+batch_size_fail_threshold_in_kb: "java.lang.Integer"
+compaction_throughput_mb_per_sec: "java.lang.Integer"
+max_hints_file_size_in_mb: "java.lang.Integer"
+endpoint_snitch: "java.lang.String"
diff --git a/test/data/config/version=4.0-alpha1.yml b/test/data/config/version=4.0-alpha1.yml
new file mode 100644
index 0000000..2a0c58e
--- /dev/null
+++ b/test/data/config/version=4.0-alpha1.yml
@@ -0,0 +1,301 @@
+---
+repaired_data_tracking_for_range_reads_enabled: "java.lang.Boolean"
+block_for_peers_timeout_in_secs: "java.lang.Integer"
+flush_compression: "org.apache.cassandra.config.Config.FlushCompression"
+audit_logging_options:
+  audit_logs_dir: "java.lang.String"
+  included_users: "java.lang.String"
+  logger:
+    class_name: "java.lang.String"
+    parameters: "java.util.Map"
+  excluded_categories: "java.lang.String"
+  roll_cycle: "java.lang.String"
+  enabled: "java.lang.Boolean"
+  included_categories: "java.lang.String"
+  max_archive_retries: "java.lang.Integer"
+  excluded_keyspaces: "java.lang.String"
+  archive_command: "java.lang.String"
+  included_keyspaces: "java.lang.String"
+  max_log_size: "java.lang.Long"
+  block: "java.lang.Boolean"
+  excluded_users: "java.lang.String"
+  max_queue_weight: "java.lang.Integer"
+cdc_total_space_in_mb: "java.lang.Integer"
+internode_application_send_queue_reserve_global_capacity_in_bytes: "java.lang.Integer"
+row_cache_save_period: "java.lang.Integer"
+snapshot_links_per_second: "java.lang.Long"
+disk_optimization_estimate_percentile: "java.lang.Double"
+hinted_handoff_disabled_datacenters: "java.util.Set"
+cdc_enabled: "java.lang.Boolean"
+read_request_timeout_in_ms: "java.lang.Long"
+internode_application_receive_queue_reserve_global_capacity_in_bytes: "java.lang.Integer"
+credentials_validity_in_ms: "java.lang.Integer"
+memtable_heap_space_in_mb: "java.lang.Integer"
+commitlog_sync: "org.apache.cassandra.config.Config.CommitLogSync"
+user_defined_function_warn_timeout: "java.lang.Long"
+tracetype_repair_ttl: "java.lang.Integer"
+concurrent_materialized_view_writes: "java.lang.Integer"
+commitlog_total_space_in_mb: "java.lang.Integer"
+hints_directory: "java.lang.String"
+native_transport_max_concurrent_connections_per_ip: "java.lang.Long"
+internode_socket_send_buffer_size_in_bytes: "java.lang.Integer"
+rpc_interface_prefer_ipv6: "java.lang.Boolean"
+check_for_duplicate_rows_during_compaction: "java.lang.Boolean"
+internode_socket_receive_buffer_size_in_bytes: "java.lang.Integer"
+user_function_timeout_policy: "org.apache.cassandra.config.Config.UserFunctionTimeoutPolicy"
+counter_write_request_timeout_in_ms: "java.lang.Long"
+roles_update_interval_in_ms: "java.lang.Integer"
+memtable_allocation_type: "org.apache.cassandra.config.Config.MemtableAllocationType"
+trickle_fsync_interval_in_kb: "java.lang.Integer"
+enable_transient_replication: "java.lang.Boolean"
+key_cache_size_in_mb: "java.lang.Long"
+tombstone_warn_threshold: "java.lang.Integer"
+column_index_cache_size_in_kb: "java.lang.Integer"
+full_query_logging_options:
+  log_dir: "java.lang.String"
+  archive_command: "java.lang.String"
+  max_log_size: "java.lang.Long"
+  block: "java.lang.Boolean"
+  roll_cycle: "java.lang.String"
+  max_queue_weight: "java.lang.Integer"
+  max_archive_retries: "java.lang.Integer"
+table_count_warn_threshold: "java.lang.Integer"
+write_request_timeout_in_ms: "java.lang.Long"
+internode_tcp_user_timeout_in_ms: "java.lang.Integer"
+auto_optimise_inc_repair_streams: "java.lang.Boolean"
+commitlog_sync_batch_window_in_ms: "java.lang.Double"
+disk_failure_policy: "org.apache.cassandra.config.Config.DiskFailurePolicy"
+tombstone_failure_threshold: "java.lang.Integer"
+validation_preview_purge_head_start_in_sec: "java.lang.Integer"
+max_mutation_size_in_kb: "java.lang.Integer"
+initial_token: "java.lang.String"
+batch_size_warn_threshold_in_kb: "java.lang.Integer"
+dynamic_snitch_badness_threshold: "java.lang.Double"
+index_summary_capacity_in_mb: "java.lang.Long"
+allocate_tokens_for_local_replication_factor: "java.lang.Integer"
+counter_cache_keys_to_save: "java.lang.Integer"
+disk_optimization_page_cross_chance: "java.lang.Double"
+listen_on_broadcast_address: "java.lang.Boolean"
+internode_application_receive_queue_reserve_endpoint_capacity_in_bytes: "java.lang.Integer"
+row_cache_class_name: "java.lang.String"
+gc_warn_threshold_in_ms: "java.lang.Integer"
+disk_optimization_strategy: "org.apache.cassandra.config.Config.DiskOptimizationStrategy"
+hinted_handoff_throttle_in_kb: "java.lang.Integer"
+otc_backlog_expiration_interval_ms: "java.lang.Integer"
+counter_cache_save_period: "java.lang.Integer"
+keyspace_count_warn_threshold: "java.lang.Integer"
+hints_flush_period_in_ms: "java.lang.Integer"
+role_manager: "java.lang.String"
+block_for_peers_in_remote_dcs: "java.lang.Boolean"
+repair_command_pool_size: "java.lang.Integer"
+column_index_size_in_kb: "java.lang.Integer"
+memtable_offheap_space_in_mb: "java.lang.Integer"
+data_file_directories: "java.util.List"
+native_transport_max_frame_size_in_mb: "java.lang.Integer"
+index_summary_resize_interval_in_minutes: "java.lang.Integer"
+enable_user_defined_functions: "java.lang.Boolean"
+max_hint_window_in_ms: "java.lang.Integer"
+seed_provider:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+check_for_duplicate_rows_during_reads: "java.lang.Boolean"
+key_cache_migrate_during_compaction: "java.lang.Boolean"
+network_authorizer: "java.lang.String"
+batchlog_replay_throttle_in_kb: "java.lang.Integer"
+enable_scripted_user_defined_functions: "java.lang.Boolean"
+internode_application_send_queue_reserve_endpoint_capacity_in_bytes: "java.lang.Integer"
+commitlog_compression:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+broadcast_address: "java.lang.String"
+credentials_update_interval_in_ms: "java.lang.Integer"
+snapshot_before_compaction: "java.lang.Boolean"
+back_pressure_strategy:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+prepared_statements_cache_size_mb: "java.lang.Long"
+native_transport_port_ssl: "java.lang.Integer"
+allocate_tokens_for_keyspace: "java.lang.String"
+diagnostic_events_enabled: "java.lang.Boolean"
+storage_port: "java.lang.Integer"
+counter_cache_size_in_mb: "java.lang.Long"
+dynamic_snitch_reset_interval_in_ms: "java.lang.Integer"
+tracetype_query_ttl: "java.lang.Integer"
+autocompaction_on_startup_enabled: "java.lang.Boolean"
+commit_failure_policy: "org.apache.cassandra.config.Config.CommitFailurePolicy"
+concurrent_writes: "java.lang.Integer"
+range_request_timeout_in_ms: "java.lang.Long"
+dynamic_snitch_update_interval_in_ms: "java.lang.Integer"
+hinted_handoff_enabled: "java.lang.Boolean"
+internode_application_receive_queue_capacity_in_bytes: "java.lang.Integer"
+automatic_sstable_upgrade: "java.lang.Boolean"
+max_value_size_in_mb: "java.lang.Integer"
+memtable_flush_writers: "java.lang.Integer"
+otc_coalescing_strategy: "java.lang.String"
+snapshot_on_repaired_data_mismatch: "java.lang.Boolean"
+commitlog_max_compression_buffers_in_pool: "java.lang.Integer"
+internode_application_send_queue_capacity_in_bytes: "java.lang.Integer"
+roles_cache_max_entries: "java.lang.Integer"
+native_transport_max_negotiable_protocol_version: "java.lang.Integer"
+start_native_transport: "java.lang.Boolean"
+ssl_storage_port: "java.lang.Integer"
+cluster_name: "java.lang.String"
+incremental_backups: "java.lang.Boolean"
+key_cache_save_period: "java.lang.Integer"
+windows_timer_interval: "java.lang.Integer"
+rpc_interface: "java.lang.String"
+repair_session_space_in_mb: "java.lang.Integer"
+row_cache_keys_to_save: "java.lang.Integer"
+repair_command_pool_full_strategy: "org.apache.cassandra.config.Config.RepairCommandPoolFullStrategy"
+inter_dc_stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
+client_encryption_options:
+  optional: "java.lang.Boolean"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  enabled: "java.lang.Boolean"
+  require_endpoint_verification: "java.lang.Boolean"
+  accepted_protocols: "java.util.List"
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  truststore: "java.lang.String"
+  algorithm: "java.lang.String"
+concurrent_validations: "java.lang.Integer"
+ideal_consistency_level: "org.apache.cassandra.db.ConsistencyLevel"
+consecutive_message_errors_threshold: "java.lang.Integer"
+trickle_fsync: "java.lang.Boolean"
+reject_repair_compaction_threshold: "java.lang.Integer"
+max_streaming_retries: "java.lang.Integer"
+native_transport_flush_in_batches_legacy: "java.lang.Boolean"
+rpc_address: "java.lang.String"
+file_cache_enabled: "java.lang.Boolean"
+cdc_raw_directory: "java.lang.String"
+num_tokens: "java.lang.Integer"
+repaired_data_tracking_for_partition_reads_enabled: "java.lang.Boolean"
+enable_drop_compact_storage: "java.lang.Boolean"
+commitlog_directory: "java.lang.String"
+unlogged_batch_across_partitions_warn_threshold: "java.lang.Integer"
+auto_bootstrap: "java.lang.Boolean"
+authorizer: "java.lang.String"
+sstable_preemptive_open_interval_in_mb: "java.lang.Integer"
+broadcast_rpc_address: "java.lang.String"
+listen_interface_prefer_ipv6: "java.lang.Boolean"
+repair_session_max_tree_depth: "java.lang.Integer"
+auto_optimise_preview_repair_streams: "java.lang.Boolean"
+concurrent_compactors: "java.lang.Integer"
+buffer_pool_use_heap_if_exhausted: "java.lang.Boolean"
+local_system_data_file_directory: "java.lang.String"
+stream_entire_sstables: "java.lang.Boolean"
+corrupted_tombstone_strategy: "org.apache.cassandra.config.Config.CorruptedTombstoneStrategy"
+listen_address: "java.lang.String"
+rpc_keepalive: "java.lang.Boolean"
+allow_extra_insecure_udfs: "java.lang.Boolean"
+request_timeout_in_ms: "java.lang.Long"
+disk_access_mode: "org.apache.cassandra.config.Config.DiskAccessMode"
+concurrent_counter_writes: "java.lang.Integer"
+row_cache_size_in_mb: "java.lang.Long"
+cas_contention_timeout_in_ms: "java.lang.Long"
+min_free_space_per_drive_in_mb: "java.lang.Integer"
+cross_node_timeout: "java.lang.Boolean"
+dynamic_snitch: "java.lang.Boolean"
+permissions_validity_in_ms: "java.lang.Integer"
+phi_convict_threshold: "java.lang.Double"
+native_transport_max_threads: "java.lang.Integer"
+permissions_update_interval_in_ms: "java.lang.Integer"
+authenticator: "java.lang.String"
+allow_insecure_udfs: "java.lang.Boolean"
+cache_load_timeout_seconds: "java.lang.Integer"
+concurrent_replicates: "java.lang.Integer"
+commitlog_sync_period_in_ms: "java.lang.Integer"
+auto_optimise_full_repair_streams: "java.lang.Boolean"
+internode_max_message_size_in_bytes: "java.lang.Integer"
+native_transport_max_concurrent_requests_in_bytes: "java.lang.Long"
+compaction_large_partition_warning_threshold_mb: "java.lang.Integer"
+enable_user_defined_functions_threads: "java.lang.Boolean"
+native_transport_allow_older_protocols: "java.lang.Boolean"
+otc_coalescing_enough_coalesced_messages: "java.lang.Integer"
+slow_query_log_timeout_in_ms: "java.lang.Long"
+report_unconfirmed_repaired_data_mismatches: "java.lang.Boolean"
+use_offheap_merkle_trees: "java.lang.Boolean"
+concurrent_materialized_view_builders: "java.lang.Integer"
+server_encryption_options:
+  enable_legacy_ssl_storage_port: "java.lang.Boolean"
+  optional: "java.lang.Boolean"
+  store_type: "java.lang.String"
+  cipher_suites: "java.util.List"
+  enabled: "java.lang.Boolean"
+  require_endpoint_verification: "java.lang.Boolean"
+  accepted_protocols: "java.util.List"
+  keystore_password: "java.lang.String"
+  protocol: "java.lang.String"
+  require_client_auth: "java.lang.Boolean"
+  internode_encryption: "org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption"
+  truststore_password: "java.lang.String"
+  keystore: "java.lang.String"
+  truststore: "java.lang.String"
+  algorithm: "java.lang.String"
+max_hints_delivery_threads: "java.lang.Integer"
+native_transport_idle_timeout_in_ms: "java.lang.Long"
+saved_caches_directory: "java.lang.String"
+max_concurrent_automatic_sstable_upgrades: "java.lang.Integer"
+file_cache_round_up: "java.lang.Boolean"
+streaming_keep_alive_period_in_secs: "java.lang.Integer"
+enable_sasi_indexes: "java.lang.Boolean"
+gc_log_threshold_in_ms: "java.lang.Integer"
+snapshot_on_duplicate_row_detection: "java.lang.Boolean"
+commitlog_sync_group_window_in_ms: "java.lang.Double"
+internode_compression: "org.apache.cassandra.config.Config.InternodeCompression"
+otc_coalescing_window_us: "java.lang.Integer"
+credentials_cache_max_entries: "java.lang.Integer"
+periodic_commitlog_sync_lag_block_in_ms: "java.lang.Integer"
+enable_materialized_views: "java.lang.Boolean"
+roles_validity_in_ms: "java.lang.Integer"
+networking_cache_size_in_mb: "java.lang.Integer"
+native_transport_port: "java.lang.Integer"
+permissions_cache_max_entries: "java.lang.Integer"
+stream_throughput_outbound_megabits_per_sec: "java.lang.Integer"
+hints_compression:
+  class_name: "java.lang.String"
+  parameters: "java.util.Map"
+commitlog_periodic_queue_size: "java.lang.Integer"
+force_new_prepared_statement_behaviour: "java.lang.Boolean"
+back_pressure_enabled: "java.lang.Boolean"
+cdc_free_space_check_interval_ms: "java.lang.Integer"
+transparent_data_encryption_options:
+  cipher: "java.lang.String"
+  chunk_length_kb: "java.lang.Integer"
+  iv_length: "java.lang.Integer"
+  key_alias: "java.lang.String"
+  key_provider:
+    class_name: "java.lang.String"
+    parameters: "java.util.Map"
+  enabled: "java.lang.Boolean"
+initial_range_tombstone_list_allocation_size: "java.lang.Integer"
+partitioner: "java.lang.String"
+listen_interface: "java.lang.String"
+user_defined_function_fail_timeout: "java.lang.Long"
+file_cache_size_in_mb: "java.lang.Integer"
+inter_dc_tcp_nodelay: "java.lang.Boolean"
+internode_authenticator: "java.lang.String"
+key_cache_keys_to_save: "java.lang.Integer"
+commitlog_segment_size_in_mb: "java.lang.Integer"
+replica_filtering_protection:
+  cached_rows_fail_threshold: "java.lang.Integer"
+  cached_rows_warn_threshold: "java.lang.Integer"
+internode_tcp_connect_timeout_in_ms: "java.lang.Integer"
+native_transport_max_concurrent_requests_in_bytes_per_ip: "java.lang.Long"
+range_tombstone_list_growth_factor: "java.lang.Double"
+native_transport_max_concurrent_connections: "java.lang.Long"
+memtable_cleanup_threshold: "java.lang.Float"
+concurrent_reads: "java.lang.Integer"
+streaming_connections_per_host: "java.lang.Integer"
+truncate_request_timeout_in_ms: "java.lang.Long"
+auto_snapshot: "java.lang.Boolean"
+native_transport_receive_queue_capacity_in_bytes: "java.lang.Integer"
+internode_streaming_tcp_user_timeout_in_ms: "java.lang.Integer"
+batch_size_fail_threshold_in_kb: "java.lang.Integer"
+compaction_throughput_mb_per_sec: "java.lang.Integer"
+max_hints_file_size_in_mb: "java.lang.Integer"
+endpoint_snitch: "java.lang.String"
diff --git a/test/data/jmxdump/cassandra-4.1-jmx.yaml b/test/data/jmxdump/cassandra-4.1-jmx.yaml
new file mode 100644
index 0000000..14e2044
--- /dev/null
+++ b/test/data/jmxdump/cassandra-4.1-jmx.yaml
@@ -0,0 +1,104302 @@
+org.apache.cassandra.db:type=BatchlogManager:
+  attributes:
+  - {access: read-only, name: TotalBatchesReplayed, type: long}
+  operations:
+  - name: countAllBatches
+    parameters: []
+    returnType: int
+  - name: forceBatchlogReplay
+    parameters: []
+    returnType: void
+org.apache.cassandra.db:type=BlacklistedDirectories:
+  attributes:
+  - {access: read-only, name: UnreadableDirectories, type: java.util.Set}
+  - {access: read-only, name: UnwritableDirectories, type: java.util.Set}
+  operations:
+  - name: markUnreadable
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: markUnwritable
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+org.apache.cassandra.db:type=Caches:
+  attributes:
+  - {access: write-only, name: CounterCacheCapacityInMB, type: long}
+  - {access: read/write, name: CounterCacheKeysToSave, type: int}
+  - {access: read/write, name: CounterCacheSavePeriodInSeconds, type: int}
+  - {access: write-only, name: KeyCacheCapacityInMB, type: long}
+  - {access: read/write, name: KeyCacheKeysToSave, type: int}
+  - {access: read/write, name: KeyCacheSavePeriodInSeconds, type: int}
+  - {access: write-only, name: RowCacheCapacityInMB, type: long}
+  - {access: read/write, name: RowCacheKeysToSave, type: int}
+  - {access: read/write, name: RowCacheSavePeriodInSeconds, type: int}
+  operations:
+  - name: invalidateCounterCache
+    parameters: []
+    returnType: void
+  - name: invalidateKeyCache
+    parameters: []
+    returnType: void
+  - name: invalidateRowCache
+    parameters: []
+    returnType: void
+  - name: saveCaches
+    parameters: []
+    returnType: void
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=IndexInfo:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=available_ranges:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=available_ranges_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=batches:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=built_views:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=compaction_history:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=local:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=paxos:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=peer_events:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=peer_events_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=peers:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=peers_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=prepared_statements:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=repairs:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=size_estimates:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=sstable_activity_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=table_estimates:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=transferred_ranges:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=transferred_ranges_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system,columnfamily=view_builds_in_progress:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_auth,columnfamily=network_permissions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_auth,columnfamily=resource_role_permissons_index:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_auth,columnfamily=role_members:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_auth,columnfamily=role_permissions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_auth,columnfamily=roles:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_distributed,columnfamily=parent_repair_history:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_distributed,columnfamily=repair_history:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_distributed,columnfamily=view_build_status:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=aggregates:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=columns:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=dropped_columns:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=functions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=indexes:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=keyspaces:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=tables:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=triggers:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=types:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_schema,columnfamily=views:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_traces,columnfamily=events:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=ColumnFamilies,keyspace=system_traces,columnfamily=sessions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Commitlog:
+  attributes:
+  - {access: read-only, name: ActiveContentSize, type: long}
+  - {access: read-only, name: ActiveOnDiskSize, type: long}
+  - {access: read-only, name: ActiveSegmentCompressionRatios, type: java.util.Map}
+  - {access: read-only, name: ActiveSegmentNames, type: java.util.List}
+  - {access: read-only, name: ArchiveCommand, type: java.lang.String}
+  - {access: read-only, name: ArchivingSegmentNames, type: java.util.List}
+  - {access: read-only, name: RestoreCommand, type: java.lang.String}
+  - {access: read-only, name: RestoreDirectories, type: java.lang.String}
+  - {access: read-only, name: RestorePointInTime, type: long}
+  - {access: read-only, name: RestorePrecision, type: java.lang.String}
+  operations:
+  - name: recover
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+org.apache.cassandra.db:type=CompactionManager:
+  attributes:
+  - {access: read/write, name: AutomaticSSTableUpgradeEnabled, type: boolean}
+  - {access: read-only, name: CompactionHistory, type: javax.management.openmbean.TabularData}
+  - {access: read-only, name: CompactionSummary, type: java.util.List}
+  - {access: read-only, name: Compactions, type: java.util.List}
+  - {access: read/write, name: CoreCompactorThreads, type: int}
+  - {access: read/write, name: CoreValidationThreads, type: int}
+  - {access: read/write, name: CoreViewBuildThreads, type: int}
+  - {access: read/write, name: DisableSTCSInL0, type: boolean}
+  - {access: read/write, name: MaxConcurrentAutoUpgradeTasks, type: int}
+  - {access: read/write, name: MaximumCompactorThreads, type: int}
+  - {access: read/write, name: MaximumValidatorThreads, type: int}
+  - {access: read/write, name: MaximumViewBuildThreads, type: int}
+  operations:
+  - name: forceUserDefinedCleanup
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: forceUserDefinedCompaction
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: stopCompaction
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: stopCompactionById
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+org.apache.cassandra.db:type=DisallowedDirectories:
+  attributes:
+  - {access: read-only, name: UnreadableDirectories, type: java.util.Set}
+  - {access: read-only, name: UnwritableDirectories, type: java.util.Set}
+  operations:
+  - name: markUnreadable
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: markUnwritable
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+org.apache.cassandra.db:type=DynamicEndpointSnitch:
+  attributes:
+  - {access: read-only, name: BadnessThreshold, type: double}
+  - {access: read-only, name: ResetInterval, type: int}
+  - {access: read-only, name: Scores, type: java.util.Map}
+  - {access: read-only, name: ScoresWithPort, type: java.util.Map}
+  - {access: read/write, name: Severity, type: double}
+  - {access: read-only, name: SubsnitchClassName, type: java.lang.String}
+  - {access: read-only, name: UpdateInterval, type: int}
+  operations:
+  - name: dumpTimings
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+org.apache.cassandra.db:type=EndpointSnitchInfo:
+  attributes:
+  - {access: read-only, name: Datacenter, type: java.lang.String}
+  - {access: read-only, name: Rack, type: java.lang.String}
+  - {access: read-only, name: SnitchName, type: java.lang.String}
+  operations:
+  - name: getDatacenter
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.lang.String
+  - name: getRack
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.lang.String
+org.apache.cassandra.db:type=IndexSummaries:
+  attributes:
+  - {access: read-only, name: AverageIndexInterval, type: double}
+  - {access: read-only, name: IndexIntervals, type: java.util.Map}
+  - {access: read/write, name: MemoryPoolCapacityInMB, type: long}
+  - {access: read-only, name: MemoryPoolSizeInMB, type: double}
+  - {access: read/write, name: ResizeIntervalInMinutes, type: int}
+  operations:
+  - name: redistributeSummaries
+    parameters: []
+    returnType: void
+org.apache.cassandra.db:type=NativeAccess:
+  attributes:
+  - {access: read-only, name: Available, type: boolean}
+  - {access: read-only, name: MemoryLockable, type: boolean}
+  operations: []
+org.apache.cassandra.db:type=RepairService:
+  attributes:
+  - {access: read/write, name: RepairPendingCompactionRejectThreshold, type: int}
+  - {access: read/write, name: RepairSessionSpaceInMegabytes, type: int}
+  - {access: read/write, name: UseOffheapMerkleTrees, type: boolean}
+  operations:
+  - name: cleanupPending
+    parameters:
+    - {name: p1, type: java.util.List}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: boolean}
+    returnType: java.util.List
+  - name: failSession
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: void
+  - name: getPendingStats
+    parameters:
+    - {name: p1, type: java.util.List}
+    - {name: p2, type: java.lang.String}
+    returnType: java.util.List
+  - name: getRepairStats
+    parameters:
+    - {name: p1, type: java.util.List}
+    - {name: p2, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSessions
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: java.lang.String}
+    returnType: java.util.List
+org.apache.cassandra.db:type=StorageProxy:
+  attributes:
+  - {access: read/write, name: CasContentionTimeout, type: java.lang.Long}
+  - {access: read-only, name: CheckForDuplicateRowsDuringCompaction, type: boolean}
+  - {access: read-only, name: CheckForDuplicateRowsDuringReads, type: boolean}
+  - {access: read/write, name: CounterWriteRpcTimeout, type: java.lang.Long}
+  - {access: read-only, name: HintedHandoffDisabledDCs, type: java.util.Set}
+  - {access: read/write, name: HintedHandoffEnabled, type: boolean}
+  - {access: read-only, name: HintsInProgress, type: int}
+  - {access: read-only, name: IdealConsistencyLevel, type: java.lang.String}
+  - {access: read/write, name: MaxHintWindow, type: int}
+  - {access: read/write, name: MaxHintsInProgress, type: int}
+  - {access: read/write, name: NativeTransportMaxConcurrentConnections, type: java.lang.Long}
+  - {access: read-only, name: NumberOfTables, type: int}
+  - {access: read/write, name: OtcBacklogExpirationInterval, type: int}
+  - {access: read/write, name: RangeRpcTimeout, type: java.lang.Long}
+  - {access: read-only, name: ReadRepairAttempted, type: long}
+  - {access: read-only, name: ReadRepairRepairedBackground, type: long}
+  - {access: read-only, name: ReadRepairRepairedBlocking, type: long}
+  - {access: read/write, name: ReadRpcTimeout, type: java.lang.Long}
+  - {access: read-only, name: RepairedDataTrackingEnabledForPartitionReads, type: boolean}
+  - {access: read-only, name: RepairedDataTrackingEnabledForRangeReads, type: boolean}
+  - {access: read-only, name: ReportingUnconfirmedRepairedDataMismatchesEnabled, type: boolean}
+  - {access: read/write, name: RpcTimeout, type: java.lang.Long}
+  - {access: read-only, name: SchemaVersions, type: java.util.Map}
+  - {access: read-only, name: SchemaVersionsWithPort, type: java.util.Map}
+  - {access: read-only, name: SnapshotOnDuplicateRowDetectionEnabled, type: boolean}
+  - {access: read-only, name: SnapshotOnRepairedDataMismatchEnabled, type: boolean}
+  - {access: read-only, name: TotalHints, type: long}
+  - {access: read/write, name: TruncateRpcTimeout, type: java.lang.Long}
+  - {access: read/write, name: WriteRpcTimeout, type: java.lang.Long}
+  operations:
+  - name: disableCheckForDuplicateRowsDuringCompaction
+    parameters: []
+    returnType: void
+  - name: disableCheckForDuplicateRowsDuringReads
+    parameters: []
+    returnType: void
+  - name: disableHintsForDC
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: disableRepairedDataTrackingForPartitionReads
+    parameters: []
+    returnType: void
+  - name: disableRepairedDataTrackingForRangeReads
+    parameters: []
+    returnType: void
+  - name: disableReportingUnconfirmedRepairedDataMismatches
+    parameters: []
+    returnType: void
+  - name: disableSnapshotOnDuplicateRowDetection
+    parameters: []
+    returnType: void
+  - name: disableSnapshotOnRepairedDataMismatch
+    parameters: []
+    returnType: void
+  - name: enableCheckForDuplicateRowsDuringCompaction
+    parameters: []
+    returnType: void
+  - name: enableCheckForDuplicateRowsDuringReads
+    parameters: []
+    returnType: void
+  - name: enableHintsForDC
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: enableRepairedDataTrackingForPartitionReads
+    parameters: []
+    returnType: void
+  - name: enableRepairedDataTrackingForRangeReads
+    parameters: []
+    returnType: void
+  - name: enableReportingUnconfirmedRepairedDataMismatches
+    parameters: []
+    returnType: void
+  - name: enableSnapshotOnDuplicateRowDetection
+    parameters: []
+    returnType: void
+  - name: enableSnapshotOnRepairedDataMismatch
+    parameters: []
+    returnType: void
+  - name: reloadTriggerClasses
+    parameters: []
+    returnType: void
+  - name: setIdealConsistencyLevel
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.lang.String
+org.apache.cassandra.db:type=StorageService:
+  attributes:
+  - {access: read-only, name: AllDataFileLocations, type: 'java.lang.String[]'}
+  - {access: read-only, name: AuditLogEnabled, type: boolean}
+  - {access: write-only, name: AutoOptimiseFullRepairStreams, type: boolean}
+  - {access: write-only, name: AutoOptimiseIncRepairStreams, type: boolean}
+  - {access: write-only, name: AutoOptimisePreviewRepairStreams, type: boolean}
+  - {access: read/write, name: BatchSizeFailureThreshold, type: int}
+  - {access: read/write, name: BatchSizeWarnThreshold, type: int}
+  - {access: read/write, name: BatchlogReplayThrottleInKB, type: int}
+  - {access: read-only, name: BootstrapMode, type: boolean}
+  - {access: read/write, name: CachedReplicaRowsFailThreshold, type: int}
+  - {access: read/write, name: CachedReplicaRowsWarnThreshold, type: int}
+  - {access: read/write, name: CasContentionTimeout, type: long}
+  - {access: read-only, name: ClusterName, type: java.lang.String}
+  - {access: read/write, name: ColumnIndexCacheSize, type: int}
+  - {access: read-only, name: CommitLogLocation, type: java.lang.String}
+  - {access: read/write, name: CompactionThroughputMbPerSec, type: int}
+  - {access: read/write, name: ConcurrentCompactors, type: int}
+  - {access: read/write, name: ConcurrentValidators, type: int}
+  - {access: read-only, name: ConcurrentValidatorsLimitEnforced, type: boolean}
+  - {access: read/write, name: ConcurrentViewBuilders, type: int}
+  - {access: read/write, name: CorruptedTombstoneStrategy, type: java.lang.String}
+  - {access: read/write, name: CounterWriteRpcTimeout, type: long}
+  - {access: read-only, name: CurrentGenerationNumber, type: int}
+  - {access: read-only, name: DrainProgress, type: java.lang.String}
+  - {access: read-only, name: Drained, type: boolean}
+  - {access: read-only, name: Draining, type: boolean}
+  - {access: read/write, name: DynamicUpdateInterval, type: int}
+  - {access: read-only, name: EndpointToHostId, type: java.util.Map}
+  - {access: read-only, name: EndpointWithPortToHostId, type: java.util.Map}
+  - {access: read-only, name: FullQueryLogEnabled, type: boolean}
+  - {access: read-only, name: FullQueryLoggerOptions, type: javax.management.openmbean.CompositeData}
+  - {access: read-only, name: GossipRunning, type: boolean}
+  - {access: write-only, name: HintedHandoffThrottleInKB, type: int}
+  - {access: read-only, name: HostIdMap, type: java.util.Map}
+  - {access: read-only, name: HostIdToEndpoint, type: java.util.Map}
+  - {access: read-only, name: HostIdToEndpointWithPort, type: java.util.Map}
+  - {access: read/write, name: IncrementalBackupsEnabled, type: boolean}
+  - {access: read/write, name: InitialRangeTombstoneListAllocationSize, type: int}
+  - {access: read-only, name: Initialized, type: boolean}
+  - {access: read/write, name: InterDCStreamThroughputMbPerSec, type: int}
+  - {access: read/write, name: InternodeStreamingTcpUserTimeoutInMS, type: int}
+  - {access: read/write, name: InternodeTcpConnectTimeoutInMS, type: int}
+  - {access: read/write, name: InternodeTcpUserTimeoutInMS, type: int}
+  - {access: read-only, name: Joined, type: boolean}
+  - {access: read-only, name: JoiningNodes, type: java.util.List}
+  - {access: read-only, name: JoiningNodesWithPort, type: java.util.List}
+  - {access: read/write, name: KeyspaceCountWarnThreshold, type: int}
+  - {access: read-only, name: Keyspaces, type: java.util.List}
+  - {access: read-only, name: LeavingNodes, type: java.util.List}
+  - {access: read-only, name: LeavingNodesWithPort, type: java.util.List}
+  - {access: read-only, name: LiveNodes, type: java.util.List}
+  - {access: read-only, name: LiveNodesWithPort, type: java.util.List}
+  - {access: read-only, name: LoadMap, type: java.util.Map}
+  - {access: read-only, name: LoadMapWithPort, type: java.util.Map}
+  - {access: read-only, name: LoadString, type: java.lang.String}
+  - {access: read-only, name: LocalHostId, type: java.lang.String}
+  - {access: read-only, name: LoggingLevels, type: java.util.Map}
+  - {access: read/write, name: MigrateKeycacheOnCompaction, type: boolean}
+  - {access: read-only, name: MovingNodes, type: java.util.List}
+  - {access: read-only, name: MovingNodesWithPort, type: java.util.List}
+  - {access: read/write, name: NativeTransportMaxConcurrentRequestsInBytes, type: long}
+  - {access: read/write, name: NativeTransportMaxConcurrentRequestsInBytesPerIp, type: long}
+  - {access: read-only, name: NativeTransportRunning, type: boolean}
+  - {access: read-only, name: NonLocalStrategyKeyspaces, type: java.util.List}
+  - {access: read-only, name: NonSystemKeyspaces, type: java.util.List}
+  - {access: read-only, name: NotificationInfo, type: 'javax.management.MBeanNotificationInfo[]'}
+  - {access: read-only, name: OperationMode, type: java.lang.String}
+  - {access: read-only, name: OutstandingSchemaVersions, type: java.util.Map}
+  - {access: read-only, name: OutstandingSchemaVersionsWithPort, type: java.util.Map}
+  - {access: read-only, name: Ownership, type: java.util.Map}
+  - {access: read-only, name: OwnershipWithPort, type: java.util.Map}
+  - {access: read-only, name: PartitionerName, type: java.lang.String}
+  - {access: read/write, name: RangeRpcTimeout, type: long}
+  - {access: write-only, name: RangeTombstoneListResizeGrowthFactor, type: double}
+  - {access: read-only, name: RangeTombstoneResizeListGrowthFactor, type: double}
+  - {access: read/write, name: ReadRpcTimeout, type: long}
+  - {access: read-only, name: ReleaseVersion, type: java.lang.String}
+  - {access: read-only, name: RemovalStatus, type: java.lang.String}
+  - {access: read-only, name: RemovalStatusWithPort, type: java.lang.String}
+  - {access: read/write, name: RepairSessionMaxTreeDepth, type: int}
+  - {access: read/write, name: RpcTimeout, type: long}
+  - {access: read/write, name: SSTablePreemptiveOpenIntervalInMB, type: int}
+  - {access: read-only, name: SavedCachesLocation, type: java.lang.String}
+  - {access: read-only, name: SchemaVersion, type: java.lang.String}
+  - {access: read-only, name: SnapshotDetails, type: java.util.Map}
+  - {access: read/write, name: SnapshotLinksPerSecond, type: long}
+  - {access: read-only, name: Starting, type: boolean}
+  - {access: read/write, name: StreamThroughputMbPerSec, type: int}
+  - {access: read/write, name: TableCountWarnThreshold, type: int}
+  - {access: read-only, name: TokenToEndpointMap, type: java.util.Map}
+  - {access: read-only, name: TokenToEndpointWithPortMap, type: java.util.Map}
+  - {access: read-only, name: Tokens, type: java.util.List}
+  - {access: read/write, name: TombstoneFailureThreshold, type: int}
+  - {access: read/write, name: TombstoneWarnThreshold, type: int}
+  - {access: read/write, name: TraceProbability, type: double}
+  - {access: read/write, name: TruncateRpcTimeout, type: long}
+  - {access: read-only, name: UnreachableNodes, type: java.util.List}
+  - {access: read-only, name: UnreachableNodesWithPort, type: java.util.List}
+  - {access: read/write, name: WriteRpcTimeout, type: long}
+  operations:
+  - name: addNotificationListener
+    parameters:
+    - {name: p1, type: javax.management.NotificationListener}
+    - {name: p2, type: javax.management.NotificationFilter}
+    - {name: p3, type: java.lang.Object}
+    returnType: void
+  - name: autoOptimiseFullRepairStreams
+    parameters: []
+    returnType: boolean
+  - name: autoOptimiseIncRepairStreams
+    parameters: []
+    returnType: boolean
+  - name: autoOptimisePreviewRepairStreams
+    parameters: []
+    returnType: boolean
+  - name: bulkLoad
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: bulkLoadAsync
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.lang.String
+  - name: bypassConcurrentValidatorsLimit
+    parameters: []
+    returnType: void
+  - name: cleanupSizeEstimates
+    parameters: []
+    returnType: void
+  - name: clearConnectionHistory
+    parameters: []
+    returnType: void
+  - name: clearSnapshot
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: void
+  - name: decommission
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: deliverHints
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: describeRingJMX
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: describeRingWithPortJMX
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: disableAuditLog
+    parameters: []
+    returnType: void
+  - name: disableAutoCompaction
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: void
+  - name: disableNativeTransportOldProtocolVersions
+    parameters: []
+    returnType: void
+  - name: drain
+    parameters: []
+    returnType: void
+  - name: effectiveOwnership
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: effectiveOwnershipWithPort
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: enableAuditLog
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: java.lang.String}
+    - {name: p4, type: java.lang.String}
+    - {name: p5, type: java.lang.String}
+    - {name: p6, type: java.lang.String}
+    - {name: p7, type: java.lang.String}
+    returnType: void
+  - name: enableAuditLog
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.util.Map}
+    - {name: p3, type: java.lang.String}
+    - {name: p4, type: java.lang.String}
+    - {name: p5, type: java.lang.String}
+    - {name: p6, type: java.lang.String}
+    - {name: p7, type: java.lang.String}
+    - {name: p8, type: java.lang.String}
+    returnType: void
+  - name: enableAutoCompaction
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: void
+  - name: enableFullQueryLogger
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: java.lang.Boolean}
+    - {name: p4, type: int}
+    - {name: p5, type: long}
+    - {name: p6, type: java.lang.String}
+    - {name: p7, type: int}
+    returnType: void
+  - name: enableNativeTransportOldProtocolVersions
+    parameters: []
+    returnType: void
+  - name: enforceConcurrentValidatorsLimit
+    parameters: []
+    returnType: void
+  - name: forceKeyspaceCleanup
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: int
+  - name: forceKeyspaceCleanup
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: 'java.lang.String[]'}
+    returnType: int
+  - name: forceKeyspaceCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: 'java.lang.String[]'}
+    returnType: void
+  - name: forceKeyspaceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: java.lang.String}
+    - {name: p4, type: 'java.lang.String[]'}
+    returnType: void
+  - name: forceKeyspaceFlush
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: void
+  - name: forceRemoveCompletion
+    parameters: []
+    returnType: void
+  - name: forceTerminateAllRepairSessions
+    parameters: []
+    returnType: void
+  - name: garbageCollect
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: java.lang.String}
+    - {name: p4, type: 'java.lang.String[]'}
+    returnType: int
+  - name: getAutoCompactionStatus
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: java.util.Map
+  - name: getConcurrency
+    parameters:
+    - {name: p1, type: java.util.List}
+    returnType: java.util.Map
+  - name: getKeyspaceReplicationInfo
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.lang.String
+  - name: getNaturalEndpoints
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.nio.ByteBuffer}
+    returnType: java.util.List
+  - name: getNaturalEndpoints
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: java.lang.String}
+    returnType: java.util.List
+  - name: getNaturalEndpointsWithPort
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.nio.ByteBuffer}
+    returnType: java.util.List
+  - name: getNaturalEndpointsWithPort
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: java.lang.String}
+    returnType: java.util.List
+  - name: getParentRepairStatus
+    parameters:
+    - {name: p1, type: int}
+    returnType: java.util.List
+  - name: getPendingRangeToEndpointMap
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: getPendingRangeToEndpointWithPortMap
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: getRangeToEndpointMap
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: getRangeToEndpointWithPortMap
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: getRangeToNativeaddressWithPortMap
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: getRangeToRpcaddressMap
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.Map
+  - name: getTokens
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getViewBuildStatuses
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    returnType: java.util.Map
+  - name: getViewBuildStatusesWithPort
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    returnType: java.util.Map
+  - name: joinRing
+    parameters: []
+    returnType: void
+  - name: loadNewSSTables
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    returnType: void
+  - name: move
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: rebuild
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: rebuild
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: java.lang.String}
+    - {name: p4, type: java.lang.String}
+    returnType: void
+  - name: rebuildSecondaryIndex
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: 'java.lang.String[]'}
+    returnType: void
+  - name: refreshSizeEstimates
+    parameters: []
+    returnType: void
+  - name: reloadLocalSchema
+    parameters: []
+    returnType: void
+  - name: relocateSSTables
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: int
+  - name: relocateSSTables
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: 'java.lang.String[]'}
+    returnType: int
+  - name: removeNode
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: removeNotificationListener
+    parameters:
+    - {name: p1, type: javax.management.NotificationListener}
+    returnType: void
+  - name: removeNotificationListener
+    parameters:
+    - {name: p1, type: javax.management.NotificationListener}
+    - {name: p2, type: javax.management.NotificationFilter}
+    - {name: p3, type: java.lang.Object}
+    returnType: void
+  - name: repairAsync
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.util.Map}
+    returnType: int
+  - name: rescheduleFailedDeletions
+    parameters: []
+    returnType: void
+  - name: resetFullQueryLogger
+    parameters: []
+    returnType: void
+  - name: resetLocalSchema
+    parameters: []
+    returnType: void
+  - name: resumeBootstrap
+    parameters: []
+    returnType: boolean
+  - name: sampleKeyRange
+    parameters: []
+    returnType: java.util.List
+  - name: samplePartitions
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    - {name: p4, type: java.util.List}
+    returnType: java.util.Map
+  - name: scrub
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: boolean}
+    - {name: p3, type: java.lang.String}
+    - {name: p4, type: 'java.lang.String[]'}
+    returnType: int
+  - name: scrub
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: java.lang.String}
+    - {name: p5, type: 'java.lang.String[]'}
+    returnType: int
+  - name: scrub
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: int}
+    - {name: p5, type: java.lang.String}
+    - {name: p6, type: 'java.lang.String[]'}
+    returnType: int
+  - name: scrub
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: int}
+    - {name: p6, type: java.lang.String}
+    - {name: p7, type: 'java.lang.String[]'}
+    returnType: int
+  - name: setConcurrency
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: setLoggingLevel
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    returnType: void
+  - name: startGossiping
+    parameters: []
+    returnType: void
+  - name: startNativeTransport
+    parameters: []
+    returnType: void
+  - name: stopDaemon
+    parameters: []
+    returnType: void
+  - name: stopFullQueryLogger
+    parameters: []
+    returnType: void
+  - name: stopGossiping
+    parameters: []
+    returnType: void
+  - name: stopNativeTransport
+    parameters: []
+    returnType: void
+  - name: takeMultipleTableSnapshot
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: void
+  - name: takeSnapshot
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: 'java.lang.String[]'}
+    returnType: void
+  - name: takeSnapshot
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.util.Map}
+    - {name: p3, type: 'java.lang.String[]'}
+    returnType: void
+  - name: takeTableSnapshot
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: java.lang.String}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+  - name: truncate
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.String}
+    returnType: void
+  - name: updateSnitch
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: java.lang.Boolean}
+    - {name: p3, type: java.lang.Integer}
+    - {name: p4, type: java.lang.Integer}
+    - {name: p5, type: java.lang.Double}
+    returnType: void
+  - name: upgradeSSTables
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    - {name: p3, type: 'java.lang.String[]'}
+    returnType: int
+  - name: upgradeSSTables
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    - {name: p3, type: int}
+    - {name: p4, type: 'java.lang.String[]'}
+    returnType: int
+  - name: verify
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: java.lang.String}
+    - {name: p3, type: 'java.lang.String[]'}
+    returnType: int
+  - name: verify
+    parameters:
+    - {name: p1, type: boolean}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: java.lang.String}
+    - {name: p8, type: 'java.lang.String[]'}
+    returnType: int
+org.apache.cassandra.db:type=Tables,keyspace=system,table=IndexInfo:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=available_ranges:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=available_ranges_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=batches:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=built_views:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=compaction_history:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=local:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=paxos:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=peer_events:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=peer_events_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=peers:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=peers_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=prepared_statements:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=repairs:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=size_estimates:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=sstable_activity_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=table_estimates:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=transferred_ranges:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=transferred_ranges_v2:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system,table=view_builds_in_progress:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_auth,table=network_permissions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_auth,table=resource_role_permissons_index:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_auth,table=role_members:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_auth,table=role_permissions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_auth,table=roles:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_distributed,table=parent_repair_history:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_distributed,table=repair_history:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_distributed,table=view_build_status:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=aggregates:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=columns:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=dropped_columns:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=functions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=indexes:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=keyspaces:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=tables:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=triggers:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=types:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_schema,table=views:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_traces,table=events:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.db:type=Tables,keyspace=system_traces,table=sessions:
+  attributes:
+  - {access: read-only, name: AutoCompactionDisabled, type: boolean}
+  - {access: read-only, name: BuiltIndexes, type: java.util.List}
+  - {access: read-only, name: ColumnFamilyName, type: java.lang.String}
+  - {access: read-only, name: CompactionDiskSpaceCheckEnabled, type: boolean}
+  - {access: read/write, name: CompactionParameters, type: java.util.Map}
+  - {access: read/write, name: CompactionParametersJson, type: java.lang.String}
+  - {access: read/write, name: CompressionParameters, type: java.util.Map}
+  - {access: read/write, name: CompressionParametersJson, type: java.lang.String}
+  - {access: write-only, name: CrcCheckChance, type: double}
+  - {access: read-only, name: DroppableTombstoneRatio, type: double}
+  - {access: read-only, name: LevelFanoutSize, type: int}
+  - {access: read/write, name: MaximumCompactionThreshold, type: int}
+  - {access: read/write, name: MinimumCompactionThreshold, type: int}
+  - {access: read/write, name: NeverPurgeTombstones, type: boolean}
+  - {access: read-only, name: SSTableCountPerLevel, type: 'int[]'}
+  - {access: read-only, name: TableName, type: java.lang.String}
+  - {access: read-only, name: UnleveledSSTables, type: int}
+  operations:
+  - name: beginLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    - {name: p3, type: int}
+    returnType: void
+  - name: compactionDiskSpaceCheck
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: estimateKeys
+    parameters: []
+    returnType: long
+  - name: finishLocalSampling
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: int}
+    returnType: java.util.List
+  - name: forceCompactionForTokenRange
+    parameters:
+    - {name: p1, type: java.util.Collection}
+    returnType: void
+  - name: forceMajorCompaction
+    parameters:
+    - {name: p1, type: boolean}
+    returnType: void
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.util.List
+  - name: getSSTablesForKey
+    parameters:
+    - {name: p1, type: java.lang.String}
+    - {name: p2, type: boolean}
+    returnType: java.util.List
+  - name: importNewSSTables
+    parameters:
+    - {name: p1, type: java.util.Set}
+    - {name: p2, type: boolean}
+    - {name: p3, type: boolean}
+    - {name: p4, type: boolean}
+    - {name: p5, type: boolean}
+    - {name: p6, type: boolean}
+    - {name: p7, type: boolean}
+    returnType: java.util.List
+  - name: loadNewSSTables
+    parameters: []
+    returnType: void
+  - name: setCompactionThresholds
+    parameters:
+    - {name: p1, type: int}
+    - {name: p2, type: int}
+    returnType: void
+  - name: trueSnapshotsSize
+    parameters: []
+    returnType: long
+org.apache.cassandra.hints:type=HintsService:
+  attributes: []
+  operations:
+  - name: deleteAllHints
+    parameters: []
+    returnType: void
+  - name: deleteAllHintsForEndpoint
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: pauseDispatch
+    parameters: []
+    returnType: void
+  - name: resumeDispatch
+    parameters: []
+    returnType: void
+org.apache.cassandra.internal:type=CacheCleanupExecutor:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=CompactionExecutor:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=GossipStage:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=HintsDispatcher:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=MemtableFlushWriter:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=MemtablePostFlush:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=MemtableReclaimMemory:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=MigrationStage:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=PendingRangeCalculator:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=PerDiskMemtableFlushWriter_0:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=Sampler:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=SecondaryIndexManagement:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=ValidationExecutor:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.internal:type=ViewBuildExecutor:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: CoreThreads, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  - {access: read/write, name: MaximumThreads, type: int}
+  operations: []
+org.apache.cassandra.metrics:type=BufferPool,name=Misses:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,name=Size:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=chunk-cache,name=Hits:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=chunk-cache,name=Misses:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=chunk-cache,name=OverflowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=chunk-cache,name=Size:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=chunk-cache,name=UsedSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=networking,name=Hits:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=networking,name=Misses:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=networking,name=OverflowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=networking,name=Size:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=BufferPool,scope=networking,name=UsedSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CQL,name=PreparedStatementsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CQL,name=PreparedStatementsEvicted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CQL,name=PreparedStatementsExecuted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CQL,name=PreparedStatementsRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CQL,name=RegularStatementsExecuted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=Capacity:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=Entries:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=FifteenMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=FiveMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=HitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=Hits:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=Misses:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=OneMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=Requests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=CounterCache,name=Size:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Capacity:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Entries:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=FifteenMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=FiveMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=HitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Hits:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Misses:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=OneMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Requests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=KeyCache,name=Size:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Capacity:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Entries:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=FifteenMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=FiveMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=HitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Hits:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Misses:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=OneMinuteHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Requests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Cache,scope=RowCache,name=Size:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=AuthFailure:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=AuthSuccess:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=ClientsByProtocolVersion:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=ConnectedNativeClients:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=ConnectedNativeClientsByUser:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=Connections:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=PausedConnections:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=RequestDiscarded:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=RequestsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=RequestsSizeByIpDistribution:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Client,name=clientsByProtocolVersion:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=connectedNativeClients:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=connectedNativeClientsByUser:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Client,name=connections:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=ConditionNotMet:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=ContentionHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=UnfinishedCommit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASRead,name=UnknownResult:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=ConditionNotMet:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=ContentionHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=UnfinishedCommit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=CASWrite,name=UnknownResult:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=RangeSlice,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ALL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ALL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ALL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ALL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ALL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ANY,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ANY,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ANY,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ANY,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ANY,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-EACH_QUORUM,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-EACH_QUORUM,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-EACH_QUORUM,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-EACH_QUORUM,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-EACH_QUORUM,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_ONE,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_ONE,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_ONE,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_ONE,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_ONE,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_QUORUM,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_QUORUM,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_QUORUM,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_QUORUM,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_QUORUM,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_SERIAL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_SERIAL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_SERIAL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_SERIAL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-LOCAL_SERIAL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-NODE_LOCAL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-NODE_LOCAL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-NODE_LOCAL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-NODE_LOCAL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-NODE_LOCAL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ONE,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ONE,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ONE,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ONE,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-ONE,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-QUORUM,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-QUORUM,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-QUORUM,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-QUORUM,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-QUORUM,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-SERIAL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-SERIAL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-SERIAL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-SERIAL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-SERIAL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-THREE,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-THREE,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-THREE,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-THREE,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-THREE,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-TWO,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-TWO,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-TWO,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-TWO,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Read-TWO,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=ViewPendingMutations:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=ViewReplicasAttempted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=ViewReplicasSuccess:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=ViewWrite,name=ViewWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ALL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ALL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ALL,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ALL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ALL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ALL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ANY,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ANY,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ANY,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ANY,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ANY,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ANY,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-EACH_QUORUM,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-EACH_QUORUM,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-EACH_QUORUM,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-EACH_QUORUM,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-EACH_QUORUM,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-EACH_QUORUM,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_ONE,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_ONE,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_ONE,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_ONE,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_ONE,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_ONE,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_QUORUM,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_QUORUM,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_QUORUM,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_QUORUM,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_QUORUM,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_QUORUM,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_SERIAL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_SERIAL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_SERIAL,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_SERIAL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_SERIAL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-LOCAL_SERIAL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-NODE_LOCAL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-NODE_LOCAL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-NODE_LOCAL,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-NODE_LOCAL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-NODE_LOCAL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-NODE_LOCAL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ONE,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ONE,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ONE,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ONE,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ONE,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-ONE,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-QUORUM,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-QUORUM,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-QUORUM,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-QUORUM,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-QUORUM,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-QUORUM,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-SERIAL,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-SERIAL,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-SERIAL,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-SERIAL,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-SERIAL,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-SERIAL,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-THREE,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-THREE,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-THREE,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-THREE,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-THREE,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-THREE,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-TWO,name=Failures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-TWO,name=Latency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-TWO,name=MutationSizeHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-TWO,name=Timeouts:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-TWO,name=TotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ClientRequest,scope=Write-TWO,name=Unavailables:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=IndexInfo,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=available_ranges_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=batches,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=built_views,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=compaction_history,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=local,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=paxos,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peer_events_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=peers_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=prepared_statements,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=repairs,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=size_estimates,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=sstable_activity_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=table_estimates,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=transferred_ranges_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=EstimatedRowSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system,scope=view_builds_in_progress,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AllMemtablesLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BloomFilterDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=EstimatedRowSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=SSTablesPerReadHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=SpeculativeFailedRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=network_permissions,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AdditionalWrites
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=AnticompactionTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesAnticompacted
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesPendingRepair
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesRepaired
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesUnrepaired
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesValidated
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=CompactionBytesWritten
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=CompressionRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=CoordinatorReadLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=CoordinatorScanLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=CoordinatorWriteLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=DroppedMutations
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=EstimatedRowCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=EstimatedRowSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=KeyCacheHitRate
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=LiveDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=LiveSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=LiveScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableColumnsCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOnHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableSwitchCount
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=OldVersionSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=PartitionsValidated
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=PendingCompactions
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=PendingFlushes
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=PercentRepaired
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ReadRepairRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairJobsCompleted
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairJobsStarted
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairSyncTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RowCacheHitOutOfRange
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=SSTablesPerReadHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=SnapshotsSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeFailedRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=TombstoneFailures
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=TombstoneWarnings
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=TotalDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=UnleveledSSTables
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ValidationTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ViewLockAcquireTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=resource_role_permissons_index,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_members,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=role_permissions,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_auth,scope=roles,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AdditionalWrites
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=AnticompactionTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BytesAnticompacted
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BytesPendingRepair
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BytesUnrepaired
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=CompactionBytesWritten
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=CompressionRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=CoordinatorReadLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=CoordinatorScanLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=CoordinatorWriteLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=DroppedMutations
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=EstimatedRowCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=EstimatedRowSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=KeyCacheHitRate
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=LiveDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=LiveSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=LiveScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MemtableColumnsCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MemtableLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOnHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MemtableSwitchCount
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=OldVersionSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=PartitionsValidated
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=PendingCompactions
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=PercentRepaired
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ReadRepairRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RepairJobsCompleted
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RepairJobsStarted
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RowCacheHitOutOfRange
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=SSTablesPerReadHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeFailedRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=TombstoneFailures
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=TombstoneWarnings
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=TotalDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=UnleveledSSTables
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ViewLockAcquireTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=parent_repair_history,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AllMemtablesLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AllMemtablesOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BloomFilterDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=CompactionBytesWritten
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=CoordinatorReadLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=CoordinatorScanLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=CoordinatorWriteLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=EstimatedRowSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MemtableOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MemtableOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=OldVersionSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=SSTablesPerReadHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=SpeculativeFailedRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=repair_history,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BloomFilterDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=CompactionBytesWritten
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=CoordinatorReadLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=CoordinatorScanLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=CoordinatorWriteLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=EstimatedRowSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=LiveScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MemtableColumnsCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MemtableLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MemtableOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MemtableOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MemtableOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MemtableSwitchCount
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=OldVersionSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=PartitionsValidated
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RepairJobsCompleted
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RowCacheHitOutOfRange
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=SSTablesPerReadHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=SpeculativeFailedRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ViewLockAcquireTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_distributed,scope=view_build_status,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=aggregates,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=columns,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=dropped_columns,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=functions,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=indexes,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=keyspaces,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=tables,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=triggers,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=types,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_schema,scope=views,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=events,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=EstimatedRowCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=EstimatedRowSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,keyspace=system_traces,scope=sessions,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=MaxRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MeanRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MinRowSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ColumnFamily,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ColumnFamily,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CommitLog,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CommitLog,name=OverSizedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CommitLog,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CommitLog,name=TotalCommitLogSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=CommitLog,name=WaitingOnCommit:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=CommitLog,name=WaitingOnSegmentAllocation:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Compaction,name=BytesCompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Compaction,name=CompactionsAborted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Compaction,name=CompactionsReduced:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Compaction,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Compaction,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Compaction,name=PendingTasksByTableName:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Compaction,name=SSTablesDroppedFromCompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Compaction,name=TotalCompactionsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_REMOVE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=BATCH_STORE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=CLEANUP_MSG,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=CLEANUP_MSG,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=CLEANUP_MSG,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=COUNTER_MUTATION_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=ECHO_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=ECHO_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=ECHO_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=ECHO_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=ECHO_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=ECHO_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FAILED_SESSION_MSG,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FAILED_SESSION_MSG,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FAILED_SESSION_MSG,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FAILURE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FAILURE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FAILURE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_COMMIT_MSG,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_COMMIT_MSG,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_COMMIT_MSG,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_PROMISE_MSG,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_PROMISE_MSG,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_PROMISE_MSG,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_PROPOSE_MSG,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_PROPOSE_MSG,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=FINALIZE_PROPOSE_MSG,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_ACK,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_ACK,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_ACK,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_ACK2,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_ACK2,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_ACK2,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_SYN,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_SYN,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_DIGEST_SYN,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_SHUTDOWN,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_SHUTDOWN,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=GOSSIP_SHUTDOWN,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=HINT_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=INTERNAL_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=INTERNAL_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=INTERNAL_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=MUTATION_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_COMMIT_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_COMMIT_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_COMMIT_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_COMMIT_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_COMMIT_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_COMMIT_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PREPARE_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PREPARE_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PREPARE_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PREPARE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PREPARE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PREPARE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PROPOSE_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PROPOSE_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PROPOSE_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PROPOSE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PROPOSE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PAXOS_PROPOSE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PING_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PING_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PING_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PING_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PING_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PING_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_CONSISTENT_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_CONSISTENT_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_CONSISTENT_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_CONSISTENT_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_CONSISTENT_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_CONSISTENT_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_MSG,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_MSG,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=PREPARE_MSG,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_SLICE,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_SLICE,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=RANGE_SLICE,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REPAIR_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=READ_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPAIR_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPAIR_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPAIR_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPLICATION_DONE_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPLICATION_DONE_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPLICATION_DONE_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPLICATION_DONE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPLICATION_DONE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REPLICATION_DONE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REQUEST_RESPONSE,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REQUEST_RESPONSE,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REQUEST_RESPONSE,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REQUEST_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REQUEST_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=REQUEST_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PULL_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PULL_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PULL_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PULL_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PULL_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PULL_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PUSH_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PUSH_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PUSH_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PUSH_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PUSH_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_PUSH_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_VERSION_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_VERSION_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_VERSION_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_VERSION_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_VERSION_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SCHEMA_VERSION_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_MSG,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_MSG,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_MSG,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SNAPSHOT_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=STATUS_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=STATUS_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=STATUS_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=STATUS_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=STATUS_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=STATUS_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SYNC_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SYNC_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SYNC_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SYNC_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SYNC_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=SYNC_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=TRUNCATE_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=TRUNCATE_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=TRUNCATE_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=TRUNCATE_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=TRUNCATE_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=TRUNCATE_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=UNUSED_CUSTOM_VERB,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=UNUSED_CUSTOM_VERB,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=UNUSED_CUSTOM_VERB,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=VALIDATION_REQ,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=VALIDATION_REQ,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=VALIDATION_REQ,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=VALIDATION_RSP,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=VALIDATION_RSP,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=VALIDATION_RSP,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_SAMPLE,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_SAMPLE,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_SAMPLE,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TEST_1,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TEST_1,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TEST_1,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TEST_2,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TEST_2,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TEST_2,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TRACE,name=CrossNodeDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TRACE,name=Dropped:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=DroppedMessage,scope=_TRACE,name=InternalDroppedLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Index,scope=RowIndexEntry,name=IndexInfoCount:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Index,scope=RowIndexEntry,name=IndexInfoGets:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Index,scope=RowIndexEntry,name=IndexInfoReads:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Index,scope=RowIndexEntry,name=IndexedEntrySize:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=AntiCompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=IdealCLWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=IdealCLWriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairPrepareTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=WriteFailedIdealCL:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=AntiCompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=IdealCLWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=IdealCLWriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairPrepareTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=WriteFailedIdealCL:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_auth,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=AntiCompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=IdealCLWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=IdealCLWriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairPrepareTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=WriteFailedIdealCL:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_distributed,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=AntiCompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=IdealCLWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=IdealCLWriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairPrepareTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=WriteFailedIdealCL:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_schema,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=AntiCompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=IdealCLWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=IdealCLWriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairPrepareTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=WriteFailedIdealCL:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Keyspace,keyspace=system_traces,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=MemtablePool,name=BlockedOnAllocation:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=MemtablePool,name=PendingFlushTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Messaging,name=BATCH_REMOVE_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=BATCH_REMOVE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=BATCH_STORE_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=BATCH_STORE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=CLEANUP_MSG-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=COUNTER_MUTATION_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=COUNTER_MUTATION_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=CrossNodeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=ECHO_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=ECHO_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=FAILED_SESSION_MSG-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=FAILURE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=FINALIZE_COMMIT_MSG-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=FINALIZE_PROMISE_MSG-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=FINALIZE_PROPOSE_MSG-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=GOSSIP_DIGEST_ACK-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=GOSSIP_DIGEST_ACK2-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=GOSSIP_DIGEST_SYN-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=GOSSIP_SHUTDOWN-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=HINT_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=HINT_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=INTERNAL_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=MUTATION_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=MUTATION_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PAXOS_COMMIT_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PAXOS_COMMIT_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PAXOS_PREPARE_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PAXOS_PREPARE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PAXOS_PROPOSE_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PAXOS_PROPOSE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PING_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PING_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PREPARE_CONSISTENT_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PREPARE_CONSISTENT_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=PREPARE_MSG-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=RANGE_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=RANGE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=READ_REPAIR_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=READ_REPAIR_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=READ_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=READ_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=REPAIR_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=REPLICATION_DONE_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=REPLICATION_DONE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=REQUEST_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SCHEMA_PULL_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SCHEMA_PULL_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SCHEMA_PUSH_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SCHEMA_PUSH_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SCHEMA_VERSION_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SCHEMA_VERSION_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SNAPSHOT_MSG-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SNAPSHOT_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SNAPSHOT_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=STATUS_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=STATUS_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SYNC_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=SYNC_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=TRUNCATE_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=TRUNCATE_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=UNUSED_CUSTOM_VERB-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=VALIDATION_REQ-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=VALIDATION_RSP-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=_SAMPLE-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=_TEST_1-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=_TEST_2-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Messaging,name=_TRACE-WaitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=ReadRepair,name=Attempted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ReadRepair,name=ReconcileRead:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ReadRepair,name=RepairedBackground:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ReadRepair,name=RepairedBlocking:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ReadRepair,name=SpeculatedRead:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ReadRepair,name=SpeculatedWrite:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Repair,name=PreviewFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Storage,name=Exceptions:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Storage,name=Load:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Storage,name=RepairExceptions:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Storage,name=TotalHints:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Storage,name=TotalHintsInProgress:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=IndexInfo,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=available_ranges_v2,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=batches,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=built_views,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=compaction_history,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=local,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=paxos,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peer_events_v2,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=peers_v2,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=prepared_statements,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=repairs,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=size_estimates,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=sstable_activity_v2,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=table_estimates,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=transferred_ranges_v2,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system,scope=view_builds_in_progress,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=EstimatedPartitionSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=network_permissions,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CasCommitTotalLatency
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CasPrepareTotalLatency
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CasProposeTotalLatency
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CompactionBytesWritten
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CoordinatorReadLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CoordinatorScanLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=CoordinatorWriteLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=EstimatedPartitionCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=EstimatedPartitionSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=LiveScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableColumnsCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=OldVersionSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RowCacheHitOutOfRange
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=SSTablesPerReadHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeFailedRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=resource_role_permissons_index,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_members,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=role_permissions,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ReplicaFilteringProtectionRowsCachedPerQuery:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_auth,scope=roles,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesLiveDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesOffHeapSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterDiskSpaceUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CasPrepareTotalLatency
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CasProposeTotalLatency
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CompactionBytesWritten
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CoordinatorReadLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CoordinatorScanLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=CoordinatorWriteLatency
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=EstimatedPartitionCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=EstimatedPartitionSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=OldVersionSSTableCount
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=SSTablesPerReadHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeFailedRetries
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=TombstoneScannedHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=parent_repair_history,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=EstimatedPartitionSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=repair_history,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AdditionalWriteLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesOffHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AllMemtablesOnHeapDataSize
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BloomFilterOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BytesMutatedAnticompaction
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ColUpdateTimeDeltaHistogram
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=EstimatedColumnCountHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=EstimatedPartitionSizeHistogram
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=IndexSummaryOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=MutatedAnticompactionGauge
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RecentBloomFilterFalsePositives
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RecentBloomFilterFalseRatio
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RepairedDataTrackingOverreadRows
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RepairedDataTrackingOverreadTime
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ShortReadProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=SpeculativeInsufficientReplicas
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=SpeculativeSampleLatencyNanos
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=WaitingOnFreeMemtableSpace
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_distributed,scope=view_build_status,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=aggregates,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=columns,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CompressionMetadataOffHeapMemoryUsed
+: attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RepairedDataInconsistenciesConfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RepairedDataInconsistenciesUnconfirmed
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ReplicaFilteringProtectionRequests
+: attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=dropped_columns,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=functions,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=indexes,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=keyspaces,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=tables,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=triggers,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=types,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_schema,scope=views,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=events,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CasCommitLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CasCommitTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CasPrepareLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CasPrepareTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CasProposeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CasProposeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CoordinatorReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CoordinatorScanLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=CoordinatorWriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=EstimatedColumnCountHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=EstimatedPartitionCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=EstimatedPartitionSizeHistogram:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=KeyCacheHitRate:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ReadRepairRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ReplicaFilteringProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+? org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ReplicaFilteringProtectionRowsCachedPerQuery
+: attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ShortReadProtectionRequests:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=WaitingOnFreeMemtableSpace:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,keyspace=system_traces,scope=sessions,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AdditionalWriteLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AdditionalWrites:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AllMemtablesHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AllMemtablesLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AllMemtablesOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AllMemtablesOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AllMemtablesOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=AnticompactionTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=BloomFilterDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BloomFilterOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BytesAnticompacted:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BytesFlushed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BytesMutatedAnticompaction:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BytesPendingRepair:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BytesRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BytesUnrepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=BytesValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=ColUpdateTimeDeltaHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=CompactionBytesWritten:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=CompressionMetadataOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=CompressionRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=DroppedMutations:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=IndexSummaryOffHeapMemoryUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=LiveDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=LiveSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=LiveScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=MaxPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MeanPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MemtableColumnsCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MemtableLiveDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MemtableOffHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MemtableOffHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MemtableOnHeapDataSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MemtableOnHeapSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MemtableSwitchCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MinPartitionSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=MutatedAnticompactionGauge:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=OldVersionSSTableCount:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=PartitionsValidated:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=PendingCompactions:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=PendingFlushes:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=PercentRepaired:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RangeLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=RangeTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=ReadLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=ReadTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RecentBloomFilterFalsePositives:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RecentBloomFilterFalseRatio:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RepairJobsCompleted:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RepairJobsStarted:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RepairSyncTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=RepairedDataInconsistenciesConfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RepairedDataInconsistenciesUnconfirmed:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RepairedDataTrackingOverreadRows:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=RepairedDataTrackingOverreadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=RowCacheHit:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RowCacheHitOutOfRange:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=RowCacheMiss:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=SSTablesPerReadHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=SnapshotsSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=SpeculativeFailedRetries:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=SpeculativeInsufficientReplicas:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=SpeculativeRetries:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=SpeculativeSampleLatencyNanos:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=TombstoneFailures:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=TombstoneScannedHistogram:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: Max, type: long}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: Min, type: long}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=TombstoneWarnings:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=TotalDiskSpaceUsed:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=UnleveledSSTables:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=Table,name=ValidationTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=ViewLockAcquireTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=ViewReadTime:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=WriteLatency:
+  attributes:
+  - {access: read-only, name: 50thPercentile, type: double}
+  - {access: read-only, name: 75thPercentile, type: double}
+  - {access: read-only, name: 95thPercentile, type: double}
+  - {access: read-only, name: 98thPercentile, type: double}
+  - {access: read-only, name: 999thPercentile, type: double}
+  - {access: read-only, name: 99thPercentile, type: double}
+  - {access: read-only, name: Count, type: long}
+  - {access: read-only, name: DurationUnit, type: java.lang.String}
+  - {access: read-only, name: FifteenMinuteRate, type: double}
+  - {access: read-only, name: FiveMinuteRate, type: double}
+  - {access: read-only, name: Max, type: double}
+  - {access: read-only, name: Mean, type: double}
+  - {access: read-only, name: MeanRate, type: double}
+  - {access: read-only, name: Min, type: double}
+  - {access: read-only, name: OneMinuteRate, type: double}
+  - {access: read-only, name: RateUnit, type: java.lang.String}
+  - {access: read-only, name: RecentValues, type: 'long[]'}
+  - {access: read-only, name: StdDev, type: double}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+  - name: values
+    parameters: []
+    returnType: long[]
+org.apache.cassandra.metrics:type=Table,name=WriteTotalLatency:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CacheCleanupExecutor,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CacheCleanupExecutor,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CacheCleanupExecutor,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CacheCleanupExecutor,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CacheCleanupExecutor,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CacheCleanupExecutor,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CacheCleanupExecutor,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=CompactionExecutor,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=GossipStage,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=GossipStage,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=GossipStage,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=GossipStage,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=GossipStage,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=GossipStage,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=GossipStage,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=HintsDispatcher,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=HintsDispatcher,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=HintsDispatcher,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=HintsDispatcher,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=HintsDispatcher,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=HintsDispatcher,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=HintsDispatcher,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableFlushWriter,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtablePostFlush,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableReclaimMemory,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableReclaimMemory,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableReclaimMemory,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableReclaimMemory,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableReclaimMemory,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableReclaimMemory,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MemtableReclaimMemory,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MigrationStage,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MigrationStage,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MigrationStage,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MigrationStage,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MigrationStage,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MigrationStage,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=MigrationStage,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PendingRangeCalculator,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PendingRangeCalculator,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PendingRangeCalculator,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PendingRangeCalculator,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PendingRangeCalculator,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PendingRangeCalculator,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PendingRangeCalculator,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PerDiskMemtableFlushWriter_0,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PerDiskMemtableFlushWriter_0,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PerDiskMemtableFlushWriter_0,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PerDiskMemtableFlushWriter_0,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PerDiskMemtableFlushWriter_0,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PerDiskMemtableFlushWriter_0,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=PerDiskMemtableFlushWriter_0,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=Sampler,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=Sampler,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=Sampler,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=Sampler,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=Sampler,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=Sampler,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=Sampler,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=SecondaryIndexManagement,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=SecondaryIndexManagement,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=SecondaryIndexManagement,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=SecondaryIndexManagement,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=SecondaryIndexManagement,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=SecondaryIndexManagement,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=SecondaryIndexManagement,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ValidationExecutor,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ValidationExecutor,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ValidationExecutor,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ValidationExecutor,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ValidationExecutor,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ValidationExecutor,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ValidationExecutor,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ViewBuildExecutor,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ViewBuildExecutor,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ViewBuildExecutor,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ViewBuildExecutor,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ViewBuildExecutor,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ViewBuildExecutor,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=internal,scope=ViewBuildExecutor,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=MutationStage,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=request,scope=ReadStage,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=transport,scope=Native-Transport-Requests,name=ActiveTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=transport,scope=Native-Transport-Requests,name=CompletedTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=transport,scope=Native-Transport-Requests,name=CurrentlyBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=transport,scope=Native-Transport-Requests,name=MaxPoolSize:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=transport,scope=Native-Transport-Requests,name=MaxTasksQueued:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=transport,scope=Native-Transport-Requests,name=PendingTasks:
+  attributes:
+  - {access: read-only, name: Value, type: java.lang.Object}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.metrics:type=ThreadPools,path=transport,scope=Native-Transport-Requests,name=TotalBlockedTasks:
+  attributes:
+  - {access: read-only, name: Count, type: long}
+  operations:
+  - name: objectName
+    parameters: []
+    returnType: javax.management.ObjectName
+org.apache.cassandra.net:type=FailureDetector:
+  attributes:
+  - {access: read-only, name: AllEndpointStates, type: java.lang.String}
+  - {access: read-only, name: AllEndpointStatesWithPort, type: java.lang.String}
+  - {access: read-only, name: DownEndpointCount, type: int}
+  - {access: read/write, name: PhiConvictThreshold, type: double}
+  - {access: read-only, name: PhiValues, type: javax.management.openmbean.TabularData}
+  - {access: read-only, name: PhiValuesWithPort, type: javax.management.openmbean.TabularData}
+  - {access: read-only, name: SimpleStates, type: java.util.Map}
+  - {access: read-only, name: SimpleStatesWithPort, type: java.util.Map}
+  - {access: read-only, name: UpEndpointCount, type: int}
+  operations:
+  - name: dumpInterArrivalTimes
+    parameters: []
+    returnType: void
+  - name: getEndpointState
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: java.lang.String
+org.apache.cassandra.net:type=Gossiper:
+  attributes:
+  - {access: read-only, name: ReleaseVersionsWithPort, type: java.util.Map}
+  - {access: read-only, name: Seeds, type: java.util.List}
+  operations:
+  - name: assassinateEndpoint
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+  - name: getCurrentGenerationNumber
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: int
+  - name: getEndpointDowntime
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: long
+  - name: reloadSeeds
+    parameters: []
+    returnType: java.util.List
+  - name: unsafeAssassinateEndpoint
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: void
+org.apache.cassandra.net:type=MessagingService:
+  attributes:
+  - {access: read/write, name: BackPressureEnabled, type: boolean}
+  - {access: read-only, name: BackPressurePerHost, type: java.util.Map}
+  - {access: read-only, name: DroppedMessages, type: java.util.Map}
+  - {access: read-only, name: GossipMessageCompletedTasks, type: java.util.Map}
+  - {access: read-only, name: GossipMessageCompletedTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: GossipMessageDroppedTasks, type: java.util.Map}
+  - {access: read-only, name: GossipMessageDroppedTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: GossipMessagePendingTasks, type: java.util.Map}
+  - {access: read-only, name: GossipMessagePendingTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: LargeMessageCompletedTasks, type: java.util.Map}
+  - {access: read-only, name: LargeMessageCompletedTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: LargeMessageDroppedTasks, type: java.util.Map}
+  - {access: read-only, name: LargeMessageDroppedTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: LargeMessagePendingTasks, type: java.util.Map}
+  - {access: read-only, name: LargeMessagePendingTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: SmallMessageCompletedTasks, type: java.util.Map}
+  - {access: read-only, name: SmallMessageCompletedTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: SmallMessageDroppedTasks, type: java.util.Map}
+  - {access: read-only, name: SmallMessageDroppedTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: SmallMessagePendingTasks, type: java.util.Map}
+  - {access: read-only, name: SmallMessagePendingTasksWithPort, type: java.util.Map}
+  - {access: read-only, name: TimeoutsPerHost, type: java.util.Map}
+  - {access: read-only, name: TimeoutsPerHostWithPort, type: java.util.Map}
+  - {access: read-only, name: TotalTimeouts, type: long}
+  operations:
+  - name: getVersion
+    parameters:
+    - {name: p1, type: java.lang.String}
+    returnType: int
+  - name: reloadSslCertificates
+    parameters: []
+    returnType: void
+org.apache.cassandra.net:type=StreamManager:
+  attributes:
+  - {access: read-only, name: CurrentStreams, type: java.util.Set}
+  - {access: read-only, name: NotificationInfo, type: 'javax.management.MBeanNotificationInfo[]'}
+  operations:
+  - name: addNotificationListener
+    parameters:
+    - {name: p1, type: javax.management.NotificationListener}
+    - {name: p2, type: javax.management.NotificationFilter}
+    - {name: p3, type: java.lang.Object}
+    returnType: void
+  - name: removeNotificationListener
+    parameters:
+    - {name: p1, type: javax.management.NotificationListener}
+    returnType: void
+  - name: removeNotificationListener
+    parameters:
+    - {name: p1, type: javax.management.NotificationListener}
+    - {name: p2, type: javax.management.NotificationFilter}
+    - {name: p3, type: java.lang.Object}
+    returnType: void
+org.apache.cassandra.request:type=MutationStage:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  operations: []
+org.apache.cassandra.request:type=ReadStage:
+  attributes:
+  - {access: read/write, name: CorePoolSize, type: int}
+  - {access: read/write, name: MaximumPoolSize, type: int}
+  operations: []
+org.apache.cassandra.service:type=GCInspector:
+  attributes:
+  - {access: read-only, name: AndResetStats, type: 'double[]'}
+  - {access: read/write, name: GcLogThresholdInMs, type: long}
+  - {access: read/write, name: GcWarnThresholdInMs, type: long}
+  - {access: read-only, name: StatusThresholdInMs, type: long}
+  operations: []
diff --git a/test/data/serialization/4.1/gms.EndpointState.bin b/test/data/serialization/4.1/gms.EndpointState.bin
new file mode 100644
index 0000000..083dbb7
--- /dev/null
+++ b/test/data/serialization/4.1/gms.EndpointState.bin
Binary files differ
diff --git a/test/data/serialization/4.1/gms.Gossip.bin b/test/data/serialization/4.1/gms.Gossip.bin
new file mode 100644
index 0000000..7a4fb56
--- /dev/null
+++ b/test/data/serialization/4.1/gms.Gossip.bin
Binary files differ
diff --git a/test/data/serialization/4.1/service.SyncComplete.bin b/test/data/serialization/4.1/service.SyncComplete.bin
new file mode 100644
index 0000000..39a6243
--- /dev/null
+++ b/test/data/serialization/4.1/service.SyncComplete.bin
Binary files differ
diff --git a/test/data/serialization/4.1/service.SyncRequest.bin b/test/data/serialization/4.1/service.SyncRequest.bin
new file mode 100644
index 0000000..f853b20
--- /dev/null
+++ b/test/data/serialization/4.1/service.SyncRequest.bin
Binary files differ
diff --git a/test/data/serialization/4.1/service.ValidationComplete.bin b/test/data/serialization/4.1/service.ValidationComplete.bin
new file mode 100644
index 0000000..bb4de43
--- /dev/null
+++ b/test/data/serialization/4.1/service.ValidationComplete.bin
Binary files differ
diff --git a/test/data/serialization/4.1/service.ValidationRequest.bin b/test/data/serialization/4.1/service.ValidationRequest.bin
new file mode 100644
index 0000000..04c492a
--- /dev/null
+++ b/test/data/serialization/4.1/service.ValidationRequest.bin
Binary files differ
diff --git a/test/data/serialization/4.1/utils.EstimatedHistogram.bin b/test/data/serialization/4.1/utils.EstimatedHistogram.bin
new file mode 100644
index 0000000..e878eda
--- /dev/null
+++ b/test/data/serialization/4.1/utils.EstimatedHistogram.bin
Binary files differ
diff --git a/test/distributed/org/apache/cassandra/distributed/Cluster.java b/test/distributed/org/apache/cassandra/distributed/Cluster.java
index 5c5a954..b7b9207 100644
--- a/test/distributed/org/apache/cassandra/distributed/Cluster.java
+++ b/test/distributed/org/apache/cassandra/distributed/Cluster.java
@@ -32,15 +32,14 @@
  */
 public class Cluster extends AbstractCluster<IInvokableInstance>
 {
-
     private Cluster(Builder builder)
     {
         super(builder);
     }
 
-    protected IInvokableInstance newInstanceWrapper(int generation, Versions.Version version, IInstanceConfig config)
+    protected IInvokableInstance newInstanceWrapper(Versions.Version version, IInstanceConfig config)
     {
-        return new Wrapper(generation, version, config);
+        return new Wrapper(version, config);
     }
 
     public static Builder build()
diff --git a/test/distributed/org/apache/cassandra/distributed/UpgradeableCluster.java b/test/distributed/org/apache/cassandra/distributed/UpgradeableCluster.java
index 7a4d2bb..b7bd1d6 100644
--- a/test/distributed/org/apache/cassandra/distributed/UpgradeableCluster.java
+++ b/test/distributed/org/apache/cassandra/distributed/UpgradeableCluster.java
@@ -40,10 +40,10 @@
         super(builder);
     }
 
-    protected IUpgradeableInstance newInstanceWrapper(int generation, Versions.Version version, IInstanceConfig config)
+    protected IUpgradeableInstance newInstanceWrapper(Versions.Version version, IInstanceConfig config)
     {
         config.set(Constants.KEY_DTEST_API_CONFIG_CHECK, false);
-        return new Wrapper(generation, version, config);
+        return new Wrapper(version, config);
     }
 
     public static Builder build()
diff --git a/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java b/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java
index 4f0d343..5b23b86 100644
--- a/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java
+++ b/test/distributed/org/apache/cassandra/distributed/action/GossipHelper.java
@@ -29,7 +29,8 @@
 import java.util.List;
 import java.util.Map;
 import java.util.UUID;
-import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Token;
@@ -45,15 +46,21 @@
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.schema.MigrationCoordinator;
+import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.apache.cassandra.distributed.impl.DistributedTestSnitch.toCassandraInetAddressAndPort;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.junit.Assert.assertTrue;
 
 public class GossipHelper
 {
+    public static InstanceAction statusToBlank(IInvokableInstance newNode)
+    {
+        return (instance) -> changeGossipState(instance, newNode,Collections.emptyList());
+    }
+
     public static InstanceAction statusToBootstrap(IInvokableInstance newNode)
     {
         return (instance) ->
@@ -234,8 +241,8 @@
             pullTo.acceptsOnInstance((InetSocketAddress pullFrom) -> {
                 InetAddressAndPort endpoint = toCassandraInetAddressAndPort(pullFrom);
                 EndpointState state = Gossiper.instance.getEndpointStateForEndpoint(endpoint);
-                MigrationCoordinator.instance.reportEndpointVersion(endpoint, state);
-                assertTrue("schema is ready", MigrationCoordinator.instance.awaitSchemaRequests(TimeUnit.SECONDS.toMillis(10)));
+                Gossiper.instance.doOnChangeNotifications(endpoint, ApplicationState.SCHEMA, state.getApplicationState(ApplicationState.SCHEMA));
+                assertTrue("schema is ready", Schema.instance.waitUntilReady(Duration.ofSeconds(10)));
             }).accept(pullFrom);
         }
     }
@@ -265,7 +272,7 @@
                 List<Token> tokens = Collections.singletonList(partitioner.getTokenFactory().fromString(tokenString));
                 try
                 {
-                    Collection<InetAddressAndPort> collisions = StorageService.instance.prepareForBootstrap(waitForSchema.toMillis());
+                    Collection<InetAddressAndPort> collisions = StorageService.instance.prepareForBootstrap(waitForSchema.toMillis(), 0);
                     assert collisions.size() == 0 : String.format("Didn't expect any replacements but got %s", collisions);
                     boolean isBootstrapSuccessful = StorageService.instance.bootstrap(tokens, waitForBootstrap.toMillis());
                     assert isBootstrapSuccessful : "Bootstrap did not complete successfully";
@@ -342,14 +349,14 @@
     public static VersionedApplicationState statusLeft(IInvokableInstance instance)
     {
         return versionedToken(instance, ApplicationState.STATUS, (partitioner, tokens) -> {
-            return new VersionedValue.VersionedValueFactory(partitioner).left(tokens, System.currentTimeMillis() + Gossiper.aVeryLongTime);
+            return new VersionedValue.VersionedValueFactory(partitioner).left(tokens, currentTimeMillis() + Gossiper.aVeryLongTime);
         });
     }
 
     public static VersionedApplicationState statusWithPortLeft(IInvokableInstance instance)
     {
         return versionedToken(instance, ApplicationState.STATUS_WITH_PORT, (partitioner, tokens) -> {
-            return new VersionedValue.VersionedValueFactory(partitioner).left(tokens, System.currentTimeMillis() + Gossiper.aVeryLongTime);
+            return new VersionedValue.VersionedValueFactory(partitioner).left(tokens, currentTimeMillis() + Gossiper.aVeryLongTime);
 
         });
     }
@@ -376,9 +383,11 @@
     {
         return instance.appliesOnInstance((String partitionerString, String tokenString) -> {
             IPartitioner partitioner = FBUtilities.newPartitioner(partitionerString);
-            Token token = partitioner.getTokenFactory().fromString(tokenString);
+            Collection<Token> tokens = tokenString.contains(",")
+                                       ? Stream.of(tokenString.split(",")).map(partitioner.getTokenFactory()::fromString).collect(Collectors.toList())
+                                       : Collections.singleton(partitioner.getTokenFactory().fromString(tokenString));
 
-            VersionedValue versionedValue = supplier.apply(partitioner, Collections.singleton(token));
+            VersionedValue versionedValue = supplier.apply(partitioner, tokens);
             return new VersionedApplicationState(applicationState.ordinal(), versionedValue.value, versionedValue.version);
         }).apply(partitionerStr, initialTokenStr);
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/api/ConsistencyLevel.java b/test/distributed/org/apache/cassandra/distributed/api/ConsistencyLevel.java
new file mode 100644
index 0000000..c28de53
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/ConsistencyLevel.java
@@ -0,0 +1,41 @@
+/*
+ * 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.distributed.api;
+
+public enum ConsistencyLevel
+{
+    ANY(0),
+    ONE(1),
+    TWO(2),
+    THREE(3),
+    QUORUM(4),
+    ALL(5),
+    LOCAL_QUORUM(6),
+    EACH_QUORUM(7),
+    SERIAL(8),
+    LOCAL_SERIAL(9),
+    LOCAL_ONE(10),
+    NODE_LOCAL(11);
+
+    public final int code;
+    ConsistencyLevel(int code)
+    {
+        this.code = code;
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/api/IClassTransformer.java b/test/distributed/org/apache/cassandra/distributed/api/IClassTransformer.java
new file mode 100644
index 0000000..dd26822
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/IClassTransformer.java
@@ -0,0 +1,30 @@
+/*
+ * 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.distributed.api;
+
+public interface IClassTransformer {
+
+    /**
+     * Modify the bytecode of the provided class. Provides the original bytecode and the fully qualified name of the class.
+     * Note, bytecode may be null indicating the class definition could not be found. In this case a synthetic definition
+     * may be returned, or null.
+     */
+    byte[] transform(String name, byte[] bytecode);
+
+    default IClassTransformer initialise() { return this; }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/api/ICoordinator.java b/test/distributed/org/apache/cassandra/distributed/api/ICoordinator.java
new file mode 100644
index 0000000..6415a30
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/ICoordinator.java
@@ -0,0 +1,72 @@
+/*
+ * 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.distributed.api;
+
+import java.util.Iterator;
+import java.util.UUID;
+import java.util.concurrent.Future;
+
+import org.apache.cassandra.distributed.shared.FutureUtils;
+
+// The cross-version API requires that a Coordinator can be constructed without any constructor arguments
+public interface ICoordinator
+{
+    default Object[][] execute(String query, ConsistencyLevel consistencyLevel, Object... boundValues)
+    {
+        return executeWithResult(query, consistencyLevel, boundValues).toObjectArrays();
+    }
+
+    default Object[][] execute(String query, ConsistencyLevel serialConsistencyLevel, ConsistencyLevel commitConsistencyLevel, Object... boundValues)
+    {
+        return executeWithResult(query, serialConsistencyLevel, commitConsistencyLevel, boundValues).toObjectArrays();
+    }
+
+    SimpleQueryResult executeWithResult(String query, ConsistencyLevel consistencyLevel, Object... boundValues);
+
+    default SimpleQueryResult executeWithResult(String query, ConsistencyLevel serialConsistencyLevel, ConsistencyLevel commitConsistencyLevel, Object... boundValues)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    default Iterator<Object[]> executeWithPaging(String query, ConsistencyLevel consistencyLevel, int pageSize, Object... boundValues)
+    {
+        return executeWithPagingWithResult(query, consistencyLevel, pageSize, boundValues).map(Row::toObjectArray);
+    }
+
+    QueryResult executeWithPagingWithResult(String query, ConsistencyLevel consistencyLevel, int pageSize, Object... boundValues);
+
+    default Future<Object[][]> asyncExecuteWithTracing(UUID sessionId, String query, ConsistencyLevel consistencyLevel, Object... boundValues)
+    {
+        return FutureUtils.map(asyncExecuteWithTracingWithResult(sessionId, query, consistencyLevel, boundValues), r -> r.toObjectArrays());
+    }
+
+    Future<SimpleQueryResult> asyncExecuteWithTracingWithResult(UUID sessionId, String query, ConsistencyLevel consistencyLevel, Object... boundValues);
+
+    default Object[][] executeWithTracing(UUID sessionId, String query, ConsistencyLevel consistencyLevel, Object... boundValues)
+    {
+        return executeWithTracingWithResult(sessionId, query, consistencyLevel, boundValues).toObjectArrays();
+    }
+
+    default SimpleQueryResult executeWithTracingWithResult(UUID sessionId, String query, ConsistencyLevel consistencyLevel, Object... boundValues)
+    {
+        return FutureUtils.waitOn(asyncExecuteWithTracingWithResult(sessionId, query, consistencyLevel, boundValues));
+    }
+
+    IInstance instance();
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/api/IMessage.java b/test/distributed/org/apache/cassandra/distributed/api/IMessage.java
new file mode 100644
index 0000000..cf7e920
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/IMessage.java
@@ -0,0 +1,43 @@
+/*
+ * 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.distributed.api;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+
+/**
+ * A cross-version interface for delivering internode messages via message sinks.
+ * <p>
+ * Message implementations should be serializable so we could load into instances.
+ */
+public interface IMessage extends Serializable
+{
+    int verb();
+
+    byte[] bytes();
+
+    // TODO: need to make this a long
+    int id();
+
+    int version();
+
+    InetSocketAddress from();
+
+    default long expiresAtNanos() { return -1L; }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/api/QueryResult.java b/test/distributed/org/apache/cassandra/distributed/api/QueryResult.java
new file mode 100644
index 0000000..90cc83f
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/QueryResult.java
@@ -0,0 +1,86 @@
+/*
+ * 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.distributed.api;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+/**
+ * A table of data representing a complete query result.
+ * <p>
+ * A <code>QueryResult</code> is different from {@link java.sql.ResultSet} in several key ways:
+ *
+ * <ul>
+ *     <li>represents a complete result rather than a cursor</li>
+ *     <li>returns a {@link Row} to access the current row of data</li>
+ *     <li>relies on object pooling; {@link #hasNext()} may return the same object just with different data, accessing a
+ *     {@link Row} from a previous {@link #hasNext()} call has undefined behavior.</li>
+ *     <li>includes {@link #filter(Predicate)}, this will do client side filtering since Apache Cassandra is more
+ *     restrictive on server side filtering</li>
+ * </ul>
+ *
+ * <h2>Unsafe patterns</h2>
+ * <p>
+ * Below are a few unsafe patterns which may lead to unexpected results
+ *
+ * <code>{@code
+ * while (rs.hasNext()) {
+ *   list.add(rs.next());
+ * }
+ * }</code>
+ *
+ * <code>{@code
+ * rs.forEach(list::add)
+ * }</code>
+ * <p>
+ * Both cases have the same issue; reference to a row from a previous call to {@link #hasNext()}.  Since the same {@link Row}
+ * object can be used across different calls to {@link #hasNext()} this would mean any attempt to access after the fact
+ * points to newer data.  If this behavior is not desirable and access is needed between calls, then {@link Row#copy()}
+ * should be used; this will clone the {@link Row} and return a new object pointing to the same data.
+ */
+public interface QueryResult extends Iterator<Row>
+{
+    List<String> names();
+    
+    List<String> warnings();
+
+    default QueryResult filter(Predicate<Row> fn)
+    {
+        return QueryResults.filter(this, fn);
+    }
+
+    default <A> Iterator<A> map(Function<? super Row, ? extends A> fn)
+    {
+        return new Iterator<A>()
+        {
+            @Override
+            public boolean hasNext()
+            {
+                return QueryResult.this.hasNext();
+            }
+
+            @Override
+            public A next()
+            {
+                return fn.apply(QueryResult.this.next());
+            }
+        };
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/api/QueryResults.java b/test/distributed/org/apache/cassandra/distributed/api/QueryResults.java
new file mode 100644
index 0000000..081d06a
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/QueryResults.java
@@ -0,0 +1,224 @@
+/*
+ * 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.distributed.api;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.function.Predicate;
+
+public final class QueryResults
+{
+    private static final SimpleQueryResult EMPTY = new SimpleQueryResult(new String[0], null);
+
+    private QueryResults() {}
+
+    public static SimpleQueryResult empty()
+    {
+        return EMPTY;
+    }
+
+    public static QueryResult fromIterator(String[] names, Iterator<Row> iterator)
+    {
+        Objects.requireNonNull(names, "names");
+        Objects.requireNonNull(iterator, "iterator");
+        return new IteratorQueryResult(names, iterator);
+    }
+
+    public static QueryResult fromObjectArrayIterator(String[] names, Iterator<Object[]> iterator)
+    {
+        Row row = new Row(names);
+        return fromIterator(names, new Iterator<Row>()
+        {
+            @Override
+            public boolean hasNext()
+            {
+                return iterator.hasNext();
+            }
+
+            @Override
+            public Row next()
+            {
+                row.setResults(iterator.next());
+                return row;
+            }
+        });
+    }
+
+    public static QueryResult filter(QueryResult result, Predicate<Row> fn)
+    {
+        return new FilterQueryResult(result, fn);
+    }
+
+    public static Builder builder()
+    {
+        return new Builder();
+    }
+
+    public static final class Builder
+    {
+        private static final int UNSET = -1;
+
+        private int numColumns = UNSET;
+        private String[] names;
+        private final List<Object[]> results = new ArrayList<>();
+        private final List<String> warnings = new ArrayList<>();
+
+        public Builder columns(String... columns)
+        {
+            if (columns != null)
+            {
+                if (numColumns == UNSET)
+                    numColumns = columns.length;
+
+                if (numColumns != columns.length)
+                    throw new AssertionError("Attempted to add column names with different column count; " +
+                                             "expected " + numColumns + " columns but given " + Arrays.toString(columns));
+            }
+
+            names = columns;
+            return this;
+        }
+
+        public Builder row(Object... values)
+        {
+            if (numColumns == UNSET)
+                numColumns = values.length;
+
+            if (numColumns != values.length)
+                throw new AssertionError("Attempted to add row with different column count; " +
+                                         "expected " + numColumns + " columns but given " + Arrays.toString(values));
+            results.add(values);
+            return this;
+        }
+
+        public Builder warning(String message)
+        {
+            warnings.add(message);
+            return this;
+        }
+
+        public SimpleQueryResult build()
+        {
+            if (names == null)
+            {
+                if (numColumns == UNSET)
+                    return QueryResults.empty();
+                names = new String[numColumns];
+                for (int i = 0; i < numColumns; i++)
+                    names[i] = "unknown";
+            }
+            
+            return new SimpleQueryResult(names, results.toArray(new Object[0][]), warnings);
+        }
+    }
+
+    private static final class IteratorQueryResult implements QueryResult
+    {
+        private final List<String> names;
+        private final Iterator<Row> iterator;
+
+        private IteratorQueryResult(String[] names, Iterator<Row> iterator)
+        {
+            this(Collections.unmodifiableList(Arrays.asList(names)), iterator);
+        }
+
+        private IteratorQueryResult(List<String> names, Iterator<Row> iterator)
+        {
+            this.names = names;
+            this.iterator = iterator;
+        }
+
+        @Override
+        public List<String> names()
+        {
+            return names;
+        }
+
+        @Override
+        public List<String> warnings()
+        {
+            throw new UnsupportedOperationException("Warnings are not yet supported for " + getClass().getSimpleName());
+        }
+
+        @Override
+        public boolean hasNext()
+        {
+            return iterator.hasNext();
+        }
+
+        @Override
+        public Row next()
+        {
+            return iterator.next();
+        }
+    }
+
+    private static final class FilterQueryResult implements QueryResult
+    {
+        private final QueryResult delegate;
+        private final Predicate<Row> filter;
+        private Row current;
+
+        private FilterQueryResult(QueryResult delegate, Predicate<Row> filter)
+        {
+            this.delegate = delegate;
+            this.filter = filter;
+        }
+
+        @Override
+        public List<String> names()
+        {
+            return delegate.names();
+        }
+        
+        @Override 
+        public List<String> warnings()
+        {
+            return delegate.warnings();
+        }
+
+        @Override
+        public boolean hasNext()
+        {
+            while (delegate.hasNext())
+            {
+                Row row = delegate.next();
+                if (filter.test(row))
+                {
+                    current = row;
+                    return true;
+                }
+            }
+            current = null;
+            return false;
+        }
+
+        @Override
+        public Row next()
+        {
+            if (current == null)
+                throw new NoSuchElementException();
+            return current;
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/api/Row.java b/test/distributed/org/apache/cassandra/distributed/api/Row.java
new file mode 100644
index 0000000..33272ed
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/Row.java
@@ -0,0 +1,219 @@
+/*
+ * 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.distributed.api;
+
+import java.util.Arrays;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.Set;
+import java.util.UUID;
+
+import org.apache.cassandra.utils.TimeUUID;
+
+/**
+ * Data representing a single row in a query result.
+ * <p>
+ * This class is mutable from the parent {@link SimpleQueryResult} and can have the row it points to changed between calls
+ * to {@link SimpleQueryResult#hasNext()}, for this reason it is unsafe to hold reference to this class after that call;
+ * to get around this, a call to {@link #copy()} will return a new object pointing to the same row.
+ */
+public class Row
+{
+    private static final int NOT_FOUND = -1;
+
+    private final String[] names;
+    private final Map<String, Integer> nameIndex;
+    private Object[] results; // mutable to avoid allocations in loops
+
+    public Row(String[] names)
+    {
+        Objects.requireNonNull(names, "names");
+        this.names = names;
+        this.nameIndex = new HashMap<>(names.length);
+        for (int i = 0; i < names.length; i++)
+        {
+            // if duplicate names, always index by the first one seen
+            nameIndex.putIfAbsent(names[i], i);
+        }
+    }
+
+    private Row(String[] names, Map<String, Integer> nameIndex)
+    {
+        this.names = names;
+        this.nameIndex = nameIndex;
+    }
+
+    void setResults(Object[] results)
+    {
+        this.results = results;
+    }
+
+    /**
+     * Creates a copy of the current row; can be used past calls to {@link SimpleQueryResult#hasNext()}.
+     */
+    public Row copy()
+    {
+        Row copy = new Row(names, nameIndex);
+        copy.setResults(results);
+        return copy;
+    }
+
+    public <T> T get(int index)
+    {
+        checkAccess();
+        if (index < 0 || index >= results.length)
+            throw new NoSuchElementException("by index: " + index);
+        return (T) results[index];
+    }
+
+    public <T> T get(String name)
+    {
+        checkAccess();
+        int idx = findIndex(name);
+        if (idx == NOT_FOUND)
+            throw new NoSuchElementException("by name: " + name);
+        return (T) results[idx];
+    }
+
+    public Short getShort(int index)
+    {
+        return get(index);
+    }
+
+    public Short getShort(String name)
+    {
+        return get(name);
+    }
+
+    public Integer getInteger(int index)
+    {
+        return get(index);
+    }
+
+    public Integer getInteger(String name)
+    {
+        return get(name);
+    }
+
+    public Long getLong(int index)
+    {
+        return get(index);
+    }
+
+    public Long getLong(String name)
+    {
+        return get(name);
+    }
+
+    public Float getFloat(int index)
+    {
+        return get(index);
+    }
+
+    public Float getFloat(String name)
+    {
+        return get(name);
+    }
+
+    public Double getDouble(int index)
+    {
+        return get(index);
+    }
+
+    public Double getDouble(String name)
+    {
+        return get(name);
+    }
+
+    public String getString(int index)
+    {
+        return get(index);
+    }
+
+    public String getString(String name)
+    {
+        return get(name);
+    }
+
+    public UUID getUUID(int index)
+    {
+        Object uuid = get(index);
+        if (uuid instanceof TimeUUID)
+            return ((TimeUUID) uuid).asUUID();
+        return (UUID) uuid;
+    }
+
+    public UUID getUUID(String name)
+    {
+        Object uuid = get(name);
+        if (uuid instanceof TimeUUID)
+            return ((TimeUUID) uuid).asUUID();
+        return (UUID) uuid;
+    }
+
+    public Date getTimestamp(int index)
+    {
+        return get(index);
+    }
+
+    public Date getTimestamp(String name)
+    {
+        return get(name);
+    }
+
+    public <T> Set<T> getSet(int index)
+    {
+        return get(index);
+    }
+
+    public <T> Set<T> getSet(String name)
+    {
+        return get(name);
+    }
+
+    /**
+     * Get the row as a array.
+     */
+    public Object[] toObjectArray()
+    {
+        return results;
+    }
+
+    public String toString()
+    {
+        return "Row{" +
+               "names=" + Arrays.toString(names) +
+               ", results=" + (results == null ? "[]" : Arrays.toString(results)) +
+               '}';
+    }
+
+    private void checkAccess()
+    {
+        if (results == null)
+            throw new NoSuchElementException();
+    }
+
+    private int findIndex(String name)
+    {
+        return nameIndex.getOrDefault(name, NOT_FOUND);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/api/SimpleQueryResult.java b/test/distributed/org/apache/cassandra/distributed/api/SimpleQueryResult.java
new file mode 100644
index 0000000..2b71e8b
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/api/SimpleQueryResult.java
@@ -0,0 +1,163 @@
+/*
+ * 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.distributed.api;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * A table of data representing a complete query result.
+ * <p>
+ * A <code>QueryResult</code> is different from {@link java.sql.ResultSet} in several key ways:
+ *
+ * <ul>
+ *     <li>represents a complete result rather than a cursor</li>
+ *     <li>returns a {@link Row} to access the current row of data</li>
+ *     <li>relies on object pooling; {@link #hasNext()} may return the same object just with different data, accessing a
+ *     {@link Row} from a previous {@link #hasNext()} call has undefined behavior.</li>
+ *     <li>includes {@link #filter(Predicate)}, this will do client side filtering since Apache Cassandra is more
+ *     restrictive on server side filtering</li>
+ * </ul>
+ *
+ * <h2>Unsafe patterns</h2>
+ * <p>
+ * Below are a few unsafe patterns which may lead to unexpected results
+ *
+ * <code>{@code
+ * while (rs.hasNext()) {
+ *   list.add(rs.next());
+ * }
+ * }</code>
+ *
+ * <code>{@code
+ * rs.forEach(list::add)
+ * }</code>
+ * <p>
+ * Both cases have the same issue; reference to a row from a previous call to {@link #hasNext()}.  Since the same {@link Row}
+ * object can be used accross different calls to {@link #hasNext()} this would mean any attempt to access after the fact
+ * points to newer data.  If this behavior is not desirable and access is needed between calls, then {@link Row#copy()}
+ * should be used; this will clone the {@link Row} and return a new object pointing to the same data.
+ */
+public class SimpleQueryResult implements QueryResult
+{
+    private final String[] names;
+    private final Object[][] results;
+    private final List<String> warnings;
+    private final Predicate<Row> filter;
+    private final Row row;
+    private int offset = -1;
+
+    public SimpleQueryResult(String[] names, Object[][] results)
+    {
+        this(names, results, Collections.emptyList());
+    }
+
+    public SimpleQueryResult(String[] names, Object[][] results, List<String> warnings)
+    {
+        this.names = Objects.requireNonNull(names, "names");
+        this.results = results;
+        this.warnings = Objects.requireNonNull(warnings, "warnings");
+        this.row = new Row(names);
+        this.filter = ignore -> true;
+    }
+
+    private SimpleQueryResult(String[] names, Object[][] results, Predicate<Row> filter, int offset)
+    {
+        this.names = names;
+        this.results = results;
+        this.warnings = Collections.emptyList();
+        this.filter = filter;
+        this.offset = offset;
+        this.row = new Row(names);
+    }
+
+    public List<String> names()
+    {
+        return Collections.unmodifiableList(Arrays.asList(names));
+    }
+
+    @Override
+    public List<String> warnings()
+    {
+        return Collections.unmodifiableList(warnings);
+    }
+
+    public SimpleQueryResult filter(Predicate<Row> fn)
+    {
+        return new SimpleQueryResult(names, results, filter.and(fn), offset);
+    }
+
+    /**
+     * Reset the cursor to the start of the query result; if the query result has not been iterated, this has no effect.
+     */
+    public void reset()
+    {
+        offset = -1;
+        row.setResults(null);
+    }
+
+    /**
+     * Get all rows as a 2d array.  Any calls to {@link #filter(Predicate)} will be ignored and the array returned will
+     * be the full set from the query.
+     */
+    public Object[][] toObjectArrays()
+    {
+        return results;
+    }
+
+    @Override
+    public boolean hasNext()
+    {
+        if (results == null)
+            return false;
+        while ((offset += 1) < results.length)
+        {
+            row.setResults(results[offset]);
+            if (filter.test(row))
+            {
+                return true;
+            }
+        }
+        row.setResults(null);
+        return false;
+    }
+
+    @Override
+    public Row next()
+    {
+        // no null check needed for results since offset only increments IFF results is not null
+        if (offset < 0 || offset >= results.length)
+            throw new NoSuchElementException();
+        return row;
+    }
+
+    @Override
+    public String toString() {
+        if (results == null)
+            return "[]";
+        return Stream.of(results)
+                     .map(Arrays::toString)
+                     .collect(Collectors.joining(",", "[", "]"));
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/FixedSchemaProviderConfiguration.java b/test/distributed/org/apache/cassandra/distributed/fuzz/FixedSchemaProviderConfiguration.java
new file mode 100644
index 0000000..2e03903
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/FixedSchemaProviderConfiguration.java
@@ -0,0 +1,43 @@
+/*
+ * 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.distributed.fuzz;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import harry.core.Configuration;
+import harry.ddl.SchemaSpec;
+import harry.model.sut.SystemUnderTest;
+
+@JsonTypeName("fixed")
+public class FixedSchemaProviderConfiguration implements Configuration.SchemaProviderConfiguration
+{
+    private final SchemaSpec schemaSpec;
+
+    @JsonCreator
+    public FixedSchemaProviderConfiguration(SchemaSpec schemaSpec)
+    {
+        this.schemaSpec = schemaSpec;
+    }
+
+    @Override
+    public SchemaSpec make(long l, SystemUnderTest systemUnderTest)
+    {
+        return this.schemaSpec;
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/FuzzTestBase.java b/test/distributed/org/apache/cassandra/distributed/fuzz/FuzzTestBase.java
new file mode 100644
index 0000000..13e4f8c
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/FuzzTestBase.java
@@ -0,0 +1,132 @@
+/*
+ * 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.distributed.fuzz;
+
+import java.util.Collection;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+
+import harry.core.Configuration;
+import harry.core.Run;
+import harry.ddl.SchemaSpec;
+import harry.model.clock.OffsetClock;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+
+public abstract class FuzzTestBase extends TestBaseImpl
+{
+    protected static Configuration configuration;
+    public static final int RF = 2;
+    static
+    {
+        try
+        {
+            HarryHelper.init();
+            configuration = HarryHelper.defaultConfiguration().build();
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    protected static Cluster cluster;
+
+    @BeforeClass
+    public static void beforeClassOverride() throws Throwable
+    {
+        cluster = Cluster.build(2)
+                         .start();
+
+        init(cluster, RF);
+    }
+
+    @AfterClass
+    public static void afterClass()
+    {
+        if (cluster != null)
+            cluster.close();
+    }
+
+    public void reset()
+    {
+        cluster.schemaChange("DROP KEYSPACE IF EXISTS " + KEYSPACE);
+        init(cluster, RF);
+    }
+
+    /**
+     * Helped method to generate a {@code number} of sstables for the given {@code schemaSpec}.
+     */
+    @SuppressWarnings("unused")
+    public static void generateTables(SchemaSpec schemaSpec, int number)
+    {
+        Run run = configuration.unbuild()
+                               .setSeed(1)
+                               .setSchemaProvider(new FixedSchemaProviderConfiguration(schemaSpec))
+                               .setClock(() -> new OffsetClock(10000L))
+                               .setDropSchema(false)
+                               .setCreateSchema(false)
+                               .build()
+                               .createRun();
+
+        ColumnFamilyStore store = Keyspace.open(schemaSpec.keyspace).getColumnFamilyStore(schemaSpec.table);
+        store.disableAutoCompaction();
+
+        SSTableGenerator gen = new SSTableGenerator(run, store);
+        SSTableGenerator largePartitionGen = new SSTableWithLargePartition(run, store);
+        for (int i = 0; i < number; i++)
+        {
+            if (i % 3 == 0)
+                largePartitionGen.gen(1_000);
+            else
+                gen.gen(1_000);
+        }
+    }
+
+    /**
+     * Helper class to force generation of a fixed partition size.
+     */
+    private static class SSTableWithLargePartition extends SSTableGenerator
+    {
+        public SSTableWithLargePartition(Run run, ColumnFamilyStore store)
+        {
+            super(run, store);
+        }
+
+        @Override
+        public Collection<SSTableReader> gen(int rows)
+        {
+            long lts = 0;
+            for (int i = 0; i < rows; i++)
+            {
+                long current = lts++;
+                write(current, current, current, current, true).applyUnsafe();
+                if (schema.staticColumns != null)
+                    writeStatic(current, 0, current, current, true).applyUnsafe();
+            }
+            Util.flush(store);
+            return null;
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/HarryHelper.java b/test/distributed/org/apache/cassandra/distributed/fuzz/HarryHelper.java
new file mode 100644
index 0000000..2997fa6
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/HarryHelper.java
@@ -0,0 +1,96 @@
+/*
+ * 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.distributed.fuzz;
+
+import java.io.File;
+import java.util.concurrent.TimeUnit;
+
+import harry.core.Configuration;
+import harry.model.OpSelectors;
+import harry.model.clock.OffsetClock;
+import harry.model.sut.PrintlnSut;
+
+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");
+
+        InJvmSut.init();
+        QueryingNoOpChecker.init();
+        Configuration.registerSubtypes(PrintlnSut.PrintlnSutConfiguration.class);
+        Configuration.registerSubtypes(Configuration.NoOpMetricReporterConfiguration.class);
+        Configuration.registerSubtypes(Configuration.RecentPartitionsValidatorConfiguration.class);
+    }
+    
+    public static Configuration configuration(String... args) throws Exception
+    {
+        File configFile = harry.runner.HarryRunner.loadConfig(args);
+        Configuration configuration = Configuration.fromFile(configFile);
+        System.out.println("Using configuration generated from: " + configFile);
+        return configuration;
+    }
+
+    public static Configuration.ConfigurationBuilder defaultConfiguration() throws Exception
+    {
+        return new Configuration.ConfigurationBuilder()
+               .setClock(() -> new OffsetClock(100000))
+               .setCreateSchema(true)
+               .setTruncateTable(false)
+               .setDropSchema(false)
+               .setSchemaProvider(new Configuration.DefaultSchemaProviderConfiguration())
+               .setClock(new Configuration.ApproximateMonotonicClockConfiguration(7300, 1, TimeUnit.SECONDS))
+               .setClusteringDescriptorSelector(defaultClusteringDescriptorSelectorConfiguration().build())
+               .setPartitionDescriptorSelector(new Configuration.DefaultPDSelectorConfiguration(100, 10))
+               .setSUT(new PrintlnSut.PrintlnSutConfiguration())
+               .setDataTracker(new Configuration.DefaultDataTrackerConfiguration())
+               .setRunner((run, configuration) -> {
+                   throw new IllegalArgumentException("Runner is not configured by default.");
+               })
+               .setMetricReporter(new Configuration.NoOpMetricReporterConfiguration());
+    }
+
+    public static Configuration.CDSelectorConfigurationBuilder defaultClusteringDescriptorSelectorConfiguration()
+    {
+        return new Configuration.CDSelectorConfigurationBuilder()
+               .setNumberOfModificationsDistribution(new Configuration.ConstantDistributionConfig(2))
+               .setRowsPerModificationDistribution(new Configuration.ConstantDistributionConfig(2))
+               .setMaxPartitionSize(100)
+               .setOperationKindWeights(new Configuration.OperationKindSelectorBuilder()
+                                        .addWeight(OpSelectors.OperationKind.DELETE_ROW, 1)
+                                        .addWeight(OpSelectors.OperationKind.DELETE_COLUMN, 1)
+                                        .addWeight(OpSelectors.OperationKind.DELETE_RANGE, 1)
+                                        .addWeight(OpSelectors.OperationKind.DELETE_SLICE, 1)
+                                        .addWeight(OpSelectors.OperationKind.DELETE_PARTITION, 1)
+                                        .addWeight(OpSelectors.OperationKind.DELETE_COLUMN_WITH_STATICS, 1)
+                                        .addWeight(OpSelectors.OperationKind.INSERT_WITH_STATICS, 20)
+                                        .addWeight(OpSelectors.OperationKind.INSERT, 20)
+                                        .addWeight(OpSelectors.OperationKind.UPDATE_WITH_STATICS, 20)
+                                        .addWeight(OpSelectors.OperationKind.UPDATE, 20)
+                                        .build());
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/InJvmSut.java b/test/distributed/org/apache/cassandra/distributed/fuzz/InJvmSut.java
new file mode 100644
index 0000000..d62b2c6
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/InJvmSut.java
@@ -0,0 +1,86 @@
+/*
+ * 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.distributed.fuzz;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.function.Consumer;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import harry.core.Configuration;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+
+public class InJvmSut extends InJvmSutBase<IInvokableInstance, Cluster>
+{
+    public static void init()
+    {
+        Configuration.registerSubtypes(InJvmSutConfiguration.class);
+    }
+
+    private static final Logger logger = LoggerFactory.getLogger(InJvmSut.class);
+
+    public InJvmSut(Cluster cluster)
+    {
+        super(cluster, 10);
+    }
+
+    public InJvmSut(Cluster cluster, int threads)
+    {
+        super(cluster, threads);
+    }
+
+    @JsonTypeName("in_jvm")
+    public static class InJvmSutConfiguration extends InJvmSutBaseConfiguration<IInvokableInstance, Cluster>
+    {
+        @JsonCreator
+        public InJvmSutConfiguration(@JsonProperty(value = "nodes", defaultValue = "3") int nodes,
+                                     @JsonProperty(value = "worker_threads", defaultValue = "10") int worker_threads,
+                                     @JsonProperty("root") String root)
+        {
+            super(nodes, worker_threads, root);
+        }
+
+        protected Cluster cluster(Consumer<IInstanceConfig> cfg, int nodes, File root)
+        {
+            try
+            {
+                return Cluster.build().withConfig(cfg)
+                               .withNodes(nodes)
+                               .withRoot(root)
+                              .createWithoutStarting();
+            }
+            catch (IOException e)
+            {
+                throw new IllegalStateException(e);
+            }
+        }
+
+        protected InJvmSutBase<IInvokableInstance, Cluster> sut(Cluster cluster)
+        {
+            return new InJvmSut(cluster);
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/InJvmSutBase.java b/test/distributed/org/apache/cassandra/distributed/fuzz/InJvmSutBase.java
new file mode 100644
index 0000000..585fc81
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/InJvmSutBase.java
@@ -0,0 +1,287 @@
+/*
+ * 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.distributed.fuzz;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
+
+import com.google.common.collect.Iterators;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import harry.core.Configuration;
+import harry.model.sut.SystemUnderTest;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IMessage;
+import org.apache.cassandra.distributed.api.IMessageFilters;
+
+public class InJvmSutBase<NODE extends IInstance, CLUSTER extends ICluster<NODE>> implements SystemUnderTest.FaultInjectingSut
+{
+    public static void init()
+    {
+        Configuration.registerSubtypes(InJvmSutBaseConfiguration.class);
+    }
+
+    private static final Logger logger = LoggerFactory.getLogger(InJvmSutBase.class);
+
+    private final ExecutorService executor;
+    public final CLUSTER cluster;
+    private final AtomicLong cnt = new AtomicLong();
+    private final AtomicBoolean isShutdown = new AtomicBoolean(false);
+
+    public InJvmSutBase(CLUSTER cluster)
+    {
+        this(cluster, 10);
+    }
+
+    public InJvmSutBase(CLUSTER cluster, int threads)
+    {
+        this.cluster = cluster;
+        this.executor = Executors.newFixedThreadPool(threads);
+    }
+
+    public CLUSTER cluster()
+    {
+        return cluster;
+    }
+
+    @Override
+    public boolean isShutdown()
+    {
+        return isShutdown.get();
+    }
+
+    @Override
+    public void shutdown()
+    {
+        assert isShutdown.compareAndSet(false, true);
+
+        try
+        {
+            cluster.close();
+            executor.shutdown();
+            if (!executor.awaitTermination(30, TimeUnit.SECONDS))
+                throw new TimeoutException("Could not terminate cluster within expected timeout");
+        }
+        catch (Throwable e)
+        {
+            logger.error("Could not terminate cluster.", e);
+            throw new RuntimeException(e);
+        }
+    }
+
+    public void schemaChange(String statement)
+    {
+        cluster.schemaChange(statement);
+    }
+
+    public Object[][] execute(String statement, ConsistencyLevel cl, Object... bindings)
+    {
+        return execute(statement, cl, (int) (cnt.getAndIncrement() % cluster.size() + 1), bindings);
+    }
+
+    public Object[][] execute(String statement, ConsistencyLevel cl, int coordinator, Object... bindings)
+    {
+        if (isShutdown.get())
+            throw new RuntimeException("Instance is shut down");
+
+        try
+        {
+            if (cl == ConsistencyLevel.NODE_LOCAL)
+            {
+                return cluster.get(coordinator)
+                              .executeInternal(statement, bindings);
+            }
+            else if (StringUtils.startsWithIgnoreCase(statement, "SELECT"))
+            {
+                return Iterators.toArray(cluster
+                                         // round-robin
+                                         .coordinator(coordinator)
+                                         .executeWithPaging(statement, toApiCl(cl), 1, bindings),
+                                         Object[].class);
+            }
+            else
+            {
+                return cluster
+                       // round-robin
+                       .coordinator(coordinator)
+                       .execute(statement, toApiCl(cl), bindings);
+            }
+        }
+        catch (Throwable t)
+        {
+            // TODO: find a better way to work around timeouts
+            if (t.getMessage().contains("timed out"))
+                return execute(statement, cl, coordinator, bindings);
+
+            logger.error(String.format("Caught error while trying execute statement %s (%s): %s",
+                                       statement, Arrays.toString(bindings), t.getMessage()),
+                         t);
+            throw t;
+        }
+    }
+
+    // TODO: Ideally, we need to be able to induce a failure of a single specific message
+    public Object[][] executeWithWriteFailure(String statement, ConsistencyLevel cl, Object... bindings)
+    {
+        if (isShutdown.get())
+            throw new RuntimeException("Instance is shut down");
+
+        try
+        {
+            int coordinator = (int) (cnt.getAndIncrement() % cluster.size() + 1);
+            IMessageFilters filters = cluster.filters();
+
+            // Drop exactly one coordinated message
+            int MUTATION_REQ = 0;
+            // TODO: make dropping deterministic
+            filters.verbs(MUTATION_REQ).from(coordinator).messagesMatching(new IMessageFilters.Matcher()
+            {
+                private final AtomicBoolean issued = new AtomicBoolean();
+                public boolean matches(int from, int to, IMessage message)
+                {
+                    if (from != coordinator || message.verb() != MUTATION_REQ)
+                        return false;
+
+                    return !issued.getAndSet(true);
+                }
+            }).drop().on();
+            Object[][] res = cluster
+                             .coordinator(coordinator)
+                             .execute(statement, toApiCl(cl), bindings);
+            filters.reset();
+            return res;
+        }
+        catch (Throwable t)
+        {
+            logger.error(String.format("Caught error while trying execute statement %s", statement),
+                         t);
+            throw t;
+        }
+    }
+
+    public CompletableFuture<Object[][]> executeAsync(String statement, ConsistencyLevel cl, Object... bindings)
+    {
+        return CompletableFuture.supplyAsync(() -> execute(statement, cl, bindings), executor);
+    }
+
+    public CompletableFuture<Object[][]> executeAsyncWithWriteFailure(String statement, ConsistencyLevel cl, Object... bindings)
+    {
+        return CompletableFuture.supplyAsync(() -> executeWithWriteFailure(statement, cl, bindings), executor);
+    }
+
+    public static abstract class InJvmSutBaseConfiguration<NODE extends IInstance, CLUSTER extends ICluster<NODE>> implements Configuration.SutConfiguration
+    {
+        public final int nodes;
+        public final int worker_threads;
+        public final String root;
+
+        @JsonCreator
+        public InJvmSutBaseConfiguration(@JsonProperty(value = "nodes", defaultValue = "3") int nodes,
+                                         @JsonProperty(value = "worker_threads", defaultValue = "10") int worker_threads,
+                                         @JsonProperty("root") String root)
+        {
+            this.nodes = nodes;
+            this.worker_threads = worker_threads;
+            if (root == null)
+            {
+                try
+                {
+                    this.root = Files.createTempDirectory("cluster_" + nodes + "_nodes").toString();
+                }
+                catch (IOException e)
+                {
+                    throw new IllegalArgumentException(e);
+                }
+            }
+            else
+            {
+                this.root = root;
+            }
+        }
+
+        protected abstract CLUSTER cluster(Consumer<IInstanceConfig> cfg, int nodes, File root);
+        protected abstract InJvmSutBase<NODE, CLUSTER> sut(CLUSTER cluster);
+
+        public SystemUnderTest make()
+        {
+            try
+            {
+                ICluster.setup();
+            }
+            catch (Throwable throwable)
+            {
+                throw new RuntimeException(throwable);
+            }
+
+            CLUSTER cluster;
+
+            cluster = cluster((cfg) -> {
+                                  // TODO: make this configurable
+                                  cfg.with(Feature.NETWORK, Feature.GOSSIP, Feature.NATIVE_PROTOCOL)
+                                     .set("row_cache_size_in_mb", 10L)
+                                     .set("index_summary_capacity_in_mb", 10L)
+                                     .set("counter_cache_size_in_mb", 10L)
+                                     .set("key_cache_size_in_mb", 10L)
+                                     .set("file_cache_size_in_mb", 10)
+                                     .set("memtable_heap_space_in_mb", 128)
+                                     .set("memtable_offheap_space_in_mb", 128)
+                                     .set("memtable_flush_writers", 1)
+                                     .set("concurrent_compactors", 1)
+                                     .set("concurrent_reads", 5)
+                                     .set("concurrent_writes", 5)
+                                     .set("compaction_throughput_mb_per_sec", 10)
+                                     .set("hinted_handoff_enabled", false);
+                              },
+                              nodes,
+                              new File(root));
+
+            cluster.startup();
+            return sut(cluster);
+        }
+    }
+
+    public static org.apache.cassandra.distributed.api.ConsistencyLevel toApiCl(ConsistencyLevel cl)
+    {
+        switch (cl)
+        {
+            case ALL:    return org.apache.cassandra.distributed.api.ConsistencyLevel.ALL;
+            case QUORUM: return org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
+            case NODE_LOCAL: return org.apache.cassandra.distributed.api.ConsistencyLevel.NODE_LOCAL;
+            case ONE: return org.apache.cassandra.distributed.api.ConsistencyLevel.ONE;
+        }
+        throw new IllegalArgumentException("Don't know a CL: " + cl);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/QueryingNoOpChecker.java b/test/distributed/org/apache/cassandra/distributed/fuzz/QueryingNoOpChecker.java
new file mode 100644
index 0000000..77d19a2
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/QueryingNoOpChecker.java
@@ -0,0 +1,66 @@
+/*
+ * 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.distributed.fuzz;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+import harry.core.Configuration;
+import harry.core.Run;
+import harry.model.Model;
+import harry.model.sut.SystemUnderTest;
+import harry.operations.CompiledStatement;
+import harry.operations.Query;
+
+public class QueryingNoOpChecker implements Model
+{
+    public static void init()
+    {
+        Configuration.registerSubtypes(QueryingNoOpCheckerConfig.class);
+    }
+
+    private final Run run;
+
+    public QueryingNoOpChecker(Run run)
+    {
+        this.run = run;
+    }
+
+    @Override
+    public void validate(Query query)
+    {
+        CompiledStatement compiled = query.toSelectStatement();
+        run.sut.execute(compiled.cql(),
+                        SystemUnderTest.ConsistencyLevel.ALL,
+                        compiled.bindings());
+    }
+
+    @JsonTypeName("querying_no_op_checker")
+    public static class QueryingNoOpCheckerConfig implements Configuration.ModelConfiguration
+    {
+        @JsonCreator
+        public QueryingNoOpCheckerConfig()
+        {
+        }
+
+        public Model make(Run run)
+        {
+            return new QueryingNoOpChecker(run);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/SSTableGenerator.java b/test/distributed/org/apache/cassandra/distributed/fuzz/SSTableGenerator.java
new file mode 100644
index 0000000..627d360
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/SSTableGenerator.java
@@ -0,0 +1,360 @@
+/*
+ * 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.distributed.fuzz;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.SortedSet;
+
+import harry.core.Run;
+import harry.ddl.SchemaSpec;
+import harry.model.OpSelectors;
+import harry.operations.Relation;
+import harry.operations.Query;
+import harry.operations.QueryGenerator;
+import harry.util.BitSet;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.cql3.AbstractMarker;
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.cql3.Operator;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.SingleColumnRelation;
+import org.apache.cassandra.cql3.VariableSpecifications;
+import org.apache.cassandra.cql3.WhereClause;
+import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
+import org.apache.cassandra.cql3.statements.Bound;
+import org.apache.cassandra.cql3.statements.DeleteStatement;
+import org.apache.cassandra.cql3.statements.StatementType;
+import org.apache.cassandra.db.ClusteringBound;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.DeletionTime;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.db.RangeTombstone;
+import org.apache.cassandra.db.RowUpdateBuilder;
+import org.apache.cassandra.db.Slices;
+import org.apache.cassandra.db.marshal.ByteBufferAccessor;
+import org.apache.cassandra.db.marshal.CompositeType;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static harry.generators.DataGenerators.UNSET_VALUE;
+
+public class SSTableGenerator
+{
+    protected final SchemaSpec schema;
+    protected final OpSelectors.DescriptorSelector descriptorSelector;
+    protected final OpSelectors.MonotonicClock clock;
+    protected final ColumnFamilyStore store;
+    protected final TableMetadata metadata;
+    protected final QueryGenerator rangeSelector;
+
+    private final Set<SSTableReader> sstables = new HashSet<>();
+
+    private long lts = 0;
+
+    public SSTableGenerator(Run run,
+                            ColumnFamilyStore store)
+    {
+        this.schema = run.schemaSpec;
+        this.descriptorSelector = run.descriptorSelector;
+        this.clock = run.clock;
+        this.store = store;
+        // We assume metadata can not change over the lifetime of sstable generator
+        this.metadata = store.metadata.get();
+        this.rangeSelector = new QueryGenerator(schema, run.pdSelector, descriptorSelector, run.rng);
+        store.disableAutoCompaction();
+    }
+
+    public Collection<SSTableReader> gen(int rows)
+    {
+        mark();
+        for (int i = 0; i < rows; i++)
+        {
+            long current = lts++;
+            write(current, current, current, current, true).applyUnsafe();
+            if (schema.staticColumns != null)
+                writeStatic(current, current, current, current, true).applyUnsafe();
+        }
+
+        return flush();
+    }
+
+    public void mark()
+    {
+        sstables.clear();
+        sstables.addAll(store.getLiveSSTables());
+    }
+
+    public Collection<SSTableReader> flush()
+    {
+        Util.flush(store);
+        sstables.removeAll(store.getLiveSSTables());
+
+        Set<SSTableReader> ret = new HashSet<>(sstables);
+        mark();
+        return ret;
+    }
+
+    public Mutation write(long lts, long pd, long cd, long opId, boolean withRowMarker)
+    {
+        long[] vds = descriptorSelector.vds(pd, cd, lts, opId, OpSelectors.OperationKind.INSERT, schema);
+
+        Object[] partitionKey = schema.inflatePartitionKey(pd);
+        Object[] clusteringKey = schema.inflateClusteringKey(cd);
+        Object[] regularColumns = schema.inflateRegularColumns(vds);
+
+        RowUpdateBuilder builder = new RowUpdateBuilder(metadata,
+                                                        FBUtilities.nowInSeconds(),
+                                                        clock.rts(lts),
+                                                        metadata.params.defaultTimeToLive,
+                                                        serializePartitionKey(store, partitionKey))
+                                   .clustering(clusteringKey);
+
+        if (!withRowMarker)
+            builder.noRowMarker();
+
+        for (int i = 0; i < regularColumns.length; i++)
+        {
+            Object value = regularColumns[i];
+            if (value == UNSET_VALUE)
+                continue;
+
+            ColumnMetadata def = metadata.getColumn(new ColumnIdentifier(schema.regularColumns.get(i).name, false));
+            builder.add(def, value);
+        }
+
+        return builder.build();
+    }
+
+    public Mutation writeStatic(long lts, long pd, long cd, long opId, boolean withRowMarker)
+    {
+        long[] sds = descriptorSelector.sds(pd, cd, lts, opId, OpSelectors.OperationKind.INSERT_WITH_STATICS, schema);
+
+        Object[] partitionKey = schema.inflatePartitionKey(pd);
+        Object[] staticColumns = schema.inflateStaticColumns(sds);
+
+        RowUpdateBuilder builder = new RowUpdateBuilder(metadata,
+                                                        FBUtilities.nowInSeconds(),
+                                                        clock.rts(lts),
+                                                        metadata.params.defaultTimeToLive,
+                                                        serializePartitionKey(store, partitionKey));
+
+        if (!withRowMarker)
+            builder.noRowMarker();
+
+        for (int i = 0; i < staticColumns.length; i++)
+        {
+            Object value = staticColumns[i];
+            if (value == UNSET_VALUE)
+                continue;
+            ColumnMetadata def = metadata.getColumn(new ColumnIdentifier(schema.staticColumns.get(i).name, false));
+            builder.add(def, staticColumns[i]);
+        }
+
+        return builder.build();
+    }
+
+    public Mutation deleteColumn(long lts, long pd, long cd, long opId)
+    {
+        Object[] partitionKey = schema.inflatePartitionKey(pd);
+        Object[] clusteringKey = schema.inflateClusteringKey(cd);
+
+        RowUpdateBuilder builder = new RowUpdateBuilder(metadata,
+                                                        FBUtilities.nowInSeconds(),
+                                                        clock.rts(lts),
+                                                        metadata.params.defaultTimeToLive,
+                                                        serializePartitionKey(store, partitionKey))
+                                   .noRowMarker()
+                                   .clustering(clusteringKey);
+
+        BitSet columns = descriptorSelector.columnMask(pd, lts, opId, OpSelectors.OperationKind.DELETE_COLUMN);
+        BitSet mask = schema.regularColumnsMask();
+
+        if (columns == null || columns.allUnset(mask))
+            throw new IllegalArgumentException("Can't have a delete column query with no columns set. Column mask: " + columns);
+
+        columns.eachSetBit((idx) -> {
+            if (idx < schema.regularColumnsOffset)
+                throw new RuntimeException("Can't delete parts of partition or clustering key");
+
+            if (idx > schema.allColumns.size())
+                throw new IndexOutOfBoundsException(String.format("Index %d is out of bounds. Max index: %d", idx, schema.allColumns.size()));
+
+            builder.delete(schema.allColumns.get(idx).name);
+        }, mask);
+
+        return builder.build();
+    }
+
+    public Mutation deleteStatic(long lts, long pd, long opId)
+    {
+        Object[] partitionKey = schema.inflatePartitionKey(pd);
+
+        RowUpdateBuilder builder = new RowUpdateBuilder(metadata,
+                                                        FBUtilities.nowInSeconds(),
+                                                        clock.rts(lts),
+                                                        metadata.params.defaultTimeToLive,
+                                                        serializePartitionKey(store, partitionKey))
+                                   .noRowMarker();
+
+
+        BitSet columns = descriptorSelector.columnMask(pd, lts, opId, OpSelectors.OperationKind.DELETE_COLUMN_WITH_STATICS);
+        BitSet mask = schema.staticColumnsMask();
+
+        if (columns == null || columns.allUnset(mask))
+            throw new IllegalArgumentException("Can't have a delete column query with no columns set. Column mask: " + columns);
+
+        columns.eachSetBit((idx) -> {
+            if (idx < schema.staticColumnsOffset)
+                throw new RuntimeException(String.format("Can't delete parts of partition or clustering key %d (%s)",
+                                                         idx, schema.allColumns.get(idx)));
+
+            if (idx > schema.allColumns.size())
+                throw new IndexOutOfBoundsException(String.format("Index %d is out of bounds. Max index: %d", idx, schema.allColumns.size()));
+
+            builder.delete(schema.allColumns.get(idx).name);
+        }, mask);
+
+        return builder.build();
+    }
+
+    public Mutation deletePartition(long lts, long pd)
+    {
+        Object[] partitionKey = schema.inflatePartitionKey(pd);
+
+        PartitionUpdate update = PartitionUpdate.fullPartitionDelete(metadata,
+                                                                     serializePartitionKey(store, partitionKey),
+                                                                     clock.rts(lts),
+                                                                     FBUtilities.nowInSeconds());
+
+        return new Mutation(update);
+    }
+
+    public Mutation deleteRow(long lts, long pd, long cd)
+    {
+        Object[] partitionKey = schema.inflatePartitionKey(pd);
+        Object[] clusteringKey = schema.inflateClusteringKey(cd);
+
+        return RowUpdateBuilder.deleteRow(metadata,
+                                          clock.rts(lts),
+                                          serializePartitionKey(store, partitionKey),
+                                          clusteringKey);
+    }
+
+    public Mutation deleteSlice(long lts, long pd, long opId)
+    {
+        return delete(lts, pd, rangeSelector.inflate(lts, opId, Query.QueryKind.CLUSTERING_SLICE));
+    }
+
+    public Mutation deleteRange(long lts, long pd, long opId)
+    {
+        return delete(lts, pd, rangeSelector.inflate(lts, opId, Query.QueryKind.CLUSTERING_RANGE));
+    }
+
+    Mutation delete(long lts, long pd, Query query)
+    {
+        Object[] partitionKey = schema.inflatePartitionKey(pd);
+        WhereClause.Builder builder = new WhereClause.Builder();
+        List<ColumnIdentifier> variableNames = new ArrayList<>();
+
+        List<ByteBuffer> values = new ArrayList<>();
+        for (int i = 0; i < partitionKey.length; i++)
+        {
+            String name = schema.partitionKeys.get(i).name;
+            ColumnMetadata columnDef = metadata.getColumn(ByteBufferUtil.bytes(name));
+            variableNames.add(columnDef.name);
+            values.add(ByteBufferUtil.objectToBytes(partitionKey[i]));
+            builder.add(new SingleColumnRelation(ColumnIdentifier.getInterned(name, true),
+                                                 toOperator(Relation.RelationKind.EQ),
+                                                 new AbstractMarker.Raw(values.size() - 1)));
+        }
+
+        for (Relation relation : query.relations)
+        {
+            String name = relation.column();
+            ColumnMetadata columnDef = metadata.getColumn(ByteBufferUtil.bytes(relation.column()));
+            variableNames.add(columnDef.name);
+            values.add(ByteBufferUtil.objectToBytes(relation.value()));
+            builder.add(new SingleColumnRelation(ColumnIdentifier.getInterned(name, false),
+                                                 toOperator(relation.kind),
+                                                 new AbstractMarker.Raw(values.size() - 1)));
+        }
+
+        StatementRestrictions restrictions = new StatementRestrictions(StatementType.DELETE,
+                                                                       metadata,
+                                                                       builder.build(),
+                                                                       new VariableSpecifications(variableNames),
+                                                                       false,
+                                                                       false,
+                                                                       false,
+                                                                       false);
+
+        QueryOptions options = QueryOptions.forInternalCalls(ConsistencyLevel.QUORUM, values);
+        SortedSet<ClusteringBound<?>> startBounds = restrictions.getClusteringColumnsBounds(Bound.START, options);
+        SortedSet<ClusteringBound<?>> endBounds = restrictions.getClusteringColumnsBounds(Bound.END, options);
+
+        Slices slices = DeleteStatement.toSlices(metadata, startBounds, endBounds);
+        assert slices.size() == 1;
+        int deletionTime = FBUtilities.nowInSeconds();
+        long rts = clock.rts(lts);
+
+        return new RowUpdateBuilder(metadata,
+                                    deletionTime,
+                                    rts,
+                                    metadata.params.defaultTimeToLive,
+                                    serializePartitionKey(store, partitionKey))
+               .noRowMarker()
+               .addRangeTombstone(new RangeTombstone(slices.get(0), new DeletionTime(rts, deletionTime)))
+               .build();
+    }
+
+    public static Operator toOperator(Relation.RelationKind kind)
+    {
+        switch (kind)
+        {
+            case LT: return Operator.LT;
+            case GT: return Operator.GT;
+            case LTE: return Operator.LTE;
+            case GTE: return Operator.GTE;
+            case EQ: return Operator.EQ;
+            default: throw new IllegalArgumentException("Unsupported " + kind);
+        }
+    }
+
+    public static DecoratedKey serializePartitionKey(ColumnFamilyStore store, Object... pk)
+    {
+        if (pk.length == 1)
+            return store.getPartitioner().decorateKey(ByteBufferUtil.objectToBytes(pk[0]));
+
+        ByteBuffer[] values = new ByteBuffer[pk.length];
+        for (int i = 0; i < pk.length; i++)
+            values[i] = ByteBufferUtil.objectToBytes(pk[i]);
+        return store.getPartitioner().decorateKey(CompositeType.build(ByteBufferAccessor.instance, values));
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/SSTableLoadingVisitor.java b/test/distributed/org/apache/cassandra/distributed/fuzz/SSTableLoadingVisitor.java
new file mode 100644
index 0000000..ce6ef57
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/SSTableLoadingVisitor.java
@@ -0,0 +1,113 @@
+/*
+ * 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.distributed.fuzz;
+
+import harry.core.Run;
+import harry.model.OpSelectors;
+import harry.visitors.VisitExecutor;
+import org.apache.cassandra.db.Keyspace;
+
+public class SSTableLoadingVisitor extends VisitExecutor
+{
+    private final SSTableGenerator gen;
+    private final int forceFlushAfter;
+
+    public SSTableLoadingVisitor(Run run, int forceFlushAfter)
+    {
+        this.forceFlushAfter = forceFlushAfter;
+        gen = new SSTableGenerator(run, Keyspace.open(run.schemaSpec.keyspace).getColumnFamilyStore(run.schemaSpec.table));
+        gen.mark();
+    }
+
+    @Override
+    protected void beforeLts(long l, long l1)
+    {
+
+    }
+
+    protected void afterLts(long lts, long pd) {
+        if (lts > 0 && lts % forceFlushAfter == 0)
+            forceFlush();
+    }
+
+    @Override
+    protected void beforeBatch(long l, long l1, long l2)
+    {
+
+    }
+
+    @Override
+    protected void afterBatch(long l, long l1, long l2)
+    {
+
+    }
+
+    @Override
+    protected void operation(long lts, long pd, long cd, long m, long opId, OpSelectors.OperationKind operationKind)
+    {
+        switch (operationKind)
+        {
+            case INSERT:
+                gen.write(lts, pd, cd, opId, true).applyUnsafe();
+                break;
+            case INSERT_WITH_STATICS:
+                gen.write(lts, pd, cd, opId, true).applyUnsafe();
+                gen.writeStatic(lts, pd, cd, opId, true).applyUnsafe();
+                break;
+            case UPDATE:
+                gen.write(lts, pd, cd, opId, false).applyUnsafe();
+                break;
+            case UPDATE_WITH_STATICS:
+                gen.write(lts, pd, cd, opId, false).applyUnsafe();
+                gen.writeStatic(lts, pd, cd, opId, false).applyUnsafe();
+                break;
+            case DELETE_PARTITION:
+                gen.deletePartition(lts, pd).applyUnsafe();
+                break;
+            case DELETE_ROW:
+                gen.deleteRow(lts, pd, cd).applyUnsafe();
+                break;
+            case DELETE_COLUMN:
+                gen.deleteColumn(lts, pd, cd, opId).applyUnsafe();
+                break;
+            case DELETE_COLUMN_WITH_STATICS:
+                gen.deleteColumn(lts, pd, cd, opId).applyUnsafe();
+                gen.deleteStatic(lts, pd, opId).applyUnsafe();
+                break;
+            case DELETE_RANGE:
+                gen.deleteRange(lts, pd, opId).applyUnsafe();
+                break;
+            case DELETE_SLICE:
+                gen.deleteSlice(lts, pd, opId).applyUnsafe();
+                break;
+        }
+    }
+
+    public void forceFlush()
+    {
+        gen.flush();
+    }
+
+
+    @Override
+    public void shutdown() throws InterruptedException
+    {
+
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/fuzz/test/SSTableGeneratorTest.java b/test/distributed/org/apache/cassandra/distributed/fuzz/test/SSTableGeneratorTest.java
new file mode 100644
index 0000000..5050bc6
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/fuzz/test/SSTableGeneratorTest.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.distributed.fuzz.test;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.CompletableFuture;
+
+import com.google.common.collect.Iterators;
+import org.junit.Test;
+
+import harry.core.Configuration;
+import harry.core.Run;
+import harry.ddl.ColumnSpec;
+import harry.ddl.SchemaSpec;
+import harry.model.Model;
+import harry.model.QuiescentChecker;
+import harry.model.clock.OffsetClock;
+import harry.model.sut.SystemUnderTest;
+import harry.operations.Query;
+import harry.visitors.GeneratingVisitor;
+import harry.visitors.LtsVisitor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.distributed.fuzz.FixedSchemaProviderConfiguration;
+import org.apache.cassandra.distributed.fuzz.HarryHelper;
+import org.apache.cassandra.distributed.fuzz.SSTableLoadingVisitor;
+import org.apache.cassandra.distributed.impl.RowUtil;
+
+public class SSTableGeneratorTest extends CQLTester
+{
+    private static final Configuration configuration;
+
+    static
+    {
+        try
+        {
+            HarryHelper.init();
+            configuration = HarryHelper.defaultConfiguration()
+                                       .setClock(() -> new OffsetClock(10000L))
+                                       .build();
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static SchemaSpec schemaSpec = new SchemaSpec(KEYSPACE, "tbl1",
+                                                          Arrays.asList(ColumnSpec.pk("pk1", ColumnSpec.asciiType),
+                                                                        ColumnSpec.pk("pk2", ColumnSpec.int64Type)),
+                                                          Arrays.asList(ColumnSpec.ck("ck1", ColumnSpec.asciiType, false),
+                                                                        ColumnSpec.ck("ck2", ColumnSpec.int64Type, false)),
+                                                          Arrays.asList(ColumnSpec.regularColumn("v1", ColumnSpec.int32Type),
+                                                                        ColumnSpec.regularColumn("v2", ColumnSpec.int64Type),
+                                                                        ColumnSpec.regularColumn("v3", ColumnSpec.int32Type),
+                                                                        ColumnSpec.regularColumn("v4", ColumnSpec.asciiType)),
+                                                          Arrays.asList(ColumnSpec.staticColumn("s1", ColumnSpec.asciiType),
+                                                                        ColumnSpec.staticColumn("s2", ColumnSpec.int64Type)));
+
+    @Test
+    public void testSSTableGenerator()
+    {
+        createTable(schemaSpec.compile().cql());
+        Run run = configuration.unbuild()
+                               .setSchemaProvider(new FixedSchemaProviderConfiguration(schemaSpec))
+                               .setSUT(CqlTesterSUT::new)
+                               .build()
+                               .createRun();
+
+
+        SSTableLoadingVisitor sstableVisitor = new SSTableLoadingVisitor(run, 1000);
+        LtsVisitor visitor = new GeneratingVisitor(run, sstableVisitor);
+        Set<Long> pds = new HashSet<>();
+        run.tracker.onLtsStarted((lts) -> pds.add(run.pdSelector.pd(lts, run.schemaSpec)));
+        for (int i = 0; i < 1000; i++)
+            visitor.visit();
+
+        sstableVisitor.forceFlush();
+
+        Model checker = new QuiescentChecker(run);
+        for (Long pd : pds)
+            checker.validate(Query.selectPartition(run.schemaSpec, pd, false));
+    }
+
+    public class CqlTesterSUT implements SystemUnderTest
+    {
+        public boolean isShutdown()
+        {
+            return false;
+        }
+
+        public void shutdown()
+        {
+        }
+
+        public CompletableFuture<Object[][]> executeAsync(String s, ConsistencyLevel consistencyLevel, Object... objects)
+        {
+            throw new RuntimeException("Not implemented");
+        }
+
+        public Object[][] execute(String s, ConsistencyLevel consistencyLevel, Object... objects)
+        {
+            try
+            {
+                return Iterators.toArray(RowUtil.toIter(SSTableGeneratorTest.this.execute(s, objects)),
+                                         Object[].class);
+            }
+            catch (Throwable throwable)
+            {
+                throw new RuntimeException();
+            }
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java b/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java
index 95a2ac5..7d33372 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/AbstractCluster.java
@@ -18,33 +18,45 @@
 
 package org.apache.cassandra.distributed.impl;
 
-import java.io.File;
+import java.io.IOException;
 import java.lang.annotation.Annotation;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.lang.reflect.Modifier;
 import java.net.InetSocketAddress;
+import java.nio.file.FileSystem;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Optional;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.BiConsumer;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 import java.util.stream.Stream;
-
 import javax.annotation.concurrent.GuardedBy;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
+import org.junit.Assume;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,35 +68,46 @@
 import org.apache.cassandra.distributed.Constants;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IClassTransformer;
 import org.apache.cassandra.distributed.api.ICluster;
 import org.apache.cassandra.distributed.api.ICoordinator;
 import org.apache.cassandra.distributed.api.IInstance;
 import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IInstanceInitializer;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.distributed.api.IIsolatedExecutor;
 import org.apache.cassandra.distributed.api.IListen;
 import org.apache.cassandra.distributed.api.IMessage;
 import org.apache.cassandra.distributed.api.IMessageFilters;
+import org.apache.cassandra.distributed.api.IMessageSink;
 import org.apache.cassandra.distributed.api.IUpgradeableInstance;
 import org.apache.cassandra.distributed.api.LogAction;
 import org.apache.cassandra.distributed.api.NodeToolResult;
 import org.apache.cassandra.distributed.api.TokenSupplier;
 import org.apache.cassandra.distributed.shared.InstanceClassLoader;
-import org.apache.cassandra.distributed.shared.Isolated;
-import org.apache.cassandra.distributed.shared.MessageFilters;
 import org.apache.cassandra.distributed.shared.Metrics;
 import org.apache.cassandra.distributed.shared.NetworkTopology;
-import org.apache.cassandra.distributed.shared.Shared;
 import org.apache.cassandra.distributed.shared.ShutdownException;
 import org.apache.cassandra.distributed.shared.Versions;
-import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.PathUtils;
 import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.Isolated;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.Shared.Recursive;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.reflections.Reflections;
+import org.reflections.scanners.Scanners;
 import org.reflections.util.ConfigurationBuilder;
+import org.reflections.util.NameHelper;
 
+import static java.util.stream.Stream.of;
+import static org.apache.cassandra.distributed.impl.IsolatedExecutor.DEFAULT_SHUTDOWN_EXECUTOR;
 import static org.apache.cassandra.distributed.shared.NetworkTopology.addressAndPort;
+import static org.apache.cassandra.utils.Shared.Recursive.ALL;
+import static org.apache.cassandra.utils.Shared.Recursive.NONE;
+import static org.apache.cassandra.utils.Shared.Scope.ANY;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
 /**
  * AbstractCluster creates, initializes and manages Cassandra instances ({@link Instance}.
@@ -118,23 +141,15 @@
     // to ensure we have instantiated the main classloader's LoggerFactory (and any LogbackStatusListener)
     // before we instantiate any for a new instance
     private static final Logger logger = LoggerFactory.getLogger(AbstractCluster.class);
-    private static final AtomicInteger GENERATION = new AtomicInteger();
 
     // include byteman so tests can use
-    private static final Set<String> SHARED_CLASSES = findClassesMarkedForSharedClassLoader();
-    private static final Set<String> ISOLATED_CLASSES = findClassesMarkedForInstanceClassLoader();
-    private static final Predicate<String> SHARED_PREDICATE = s -> {
-        if (ISOLATED_CLASSES.contains(s))
-            return false;
-
-        return SHARED_CLASSES.contains(s) ||
-               InstanceClassLoader.getDefaultLoadSharedFilter().test(s) ||
-               s.startsWith("org.jboss.byteman");
-    };
+    public static final Predicate<String> SHARED_PREDICATE = getSharedClassPredicate(ANY);
 
     private final UUID clusterId = UUID.randomUUID();
-    private final File root;
+    private final Path root;
     private final ClassLoader sharedClassLoader;
+    private final Predicate<String> sharedClassPredicate;
+    private final IClassTransformer classTransformer;
     private final int subnet;
     private final TokenSupplier tokenSupplier;
     private final Map<Integer, NetworkTopology.DcAndRack> nodeIdTopology;
@@ -150,12 +165,17 @@
     // mutated by user-facing API
     private final MessageFilters filters;
     private final INodeProvisionStrategy.Strategy nodeProvisionStrategy;
-    private final BiConsumer<ClassLoader, Integer> instanceInitializer;
+    private final IInstanceInitializer instanceInitializer;
     private final int datadirCount;
     private volatile Thread.UncaughtExceptionHandler previousHandler = null;
     private volatile BiPredicate<Integer, Throwable> ignoreUncaughtThrowable = null;
     private final List<Throwable> uncaughtExceptions = new CopyOnWriteArrayList<>();
 
+    private final ThreadGroup clusterThreadGroup = new ThreadGroup(clusterId.toString());
+    private final ShutdownExecutor shutdownExecutor;
+
+    private volatile IMessageSink messageSink;
+
     /**
      * Common builder, add methods that are applicable to both Cluster and Upgradable cluster here.
      */
@@ -163,6 +183,7 @@
         extends org.apache.cassandra.distributed.shared.AbstractBuilder<I, C, B>
     {
         private INodeProvisionStrategy.Strategy nodeProvisionStrategy = INodeProvisionStrategy.Strategy.MultipleNetworkInterfaces;
+        private ShutdownExecutor shutdownExecutor = DEFAULT_SHUTDOWN_EXECUTOR;
 
         {
             // those properties may be set for unit-test optimizations; those should not be used when running dtests
@@ -173,6 +194,7 @@
         public AbstractBuilder(Factory<I, C, B> factory)
         {
             super(factory);
+            withSharedClasses(SHARED_PREDICATE);
         }
 
         public B withNodeProvisionStrategy(INodeProvisionStrategy.Strategy nodeProvisionStrategy)
@@ -180,11 +202,47 @@
             this.nodeProvisionStrategy = nodeProvisionStrategy;
             return (B) this;
         }
+
+        public B withShutdownExecutor(ShutdownExecutor shutdownExecutor)
+        {
+            this.shutdownExecutor = shutdownExecutor;
+            return (B) this;
+        }
+
+        @Override
+        public C createWithoutStarting() throws IOException
+        {
+            // if running as vnode but test sets withoutVNodes(), then skip the test
+            // AbstractCluster.createInstanceConfig has similar logic, but handles the cases where the test
+            // attempts to control tokens via config
+            // when token supplier is defined, use getTokenCount() to see if vnodes is supported or not
+            if (isVnode())
+            {
+                Assume.assumeTrue("vnode is not supported", isVNodeAllowed());
+                // if token count > 1 and isVnode, then good
+                Assume.assumeTrue("no-vnode is requested but not supported", getTokenCount() > 1);
+            }
+            else
+            {
+                Assume.assumeTrue("single-token is not supported", isSingleTokenAllowed());
+                // if token count == 1 and isVnode == false, then goodAbstractClusterTest
+                Assume.assumeTrue("vnode is requested but not supported", getTokenCount() == 1);
+            }
+
+            return super.createWithoutStarting();
+        }
+
+        private boolean isVnode()
+        {
+            TokenSupplier ts = getTokenSupplier();
+            return ts == null
+                   ? getTokenCount() > 1 // token supplier wasn't defined yet, so rely on getTokenCount()
+                   : ts.tokens(1).size() > 1; // token supplier is defined... check the first instance to see what tokens are used
+        }
     }
 
     protected class Wrapper extends DelegatingInvokableInstance implements IUpgradeableInstance
     {
-        private final int generation;
         private final IInstanceConfig config;
         private volatile IInvokableInstance delegate;
         private volatile Versions.Version version;
@@ -192,38 +250,81 @@
         private volatile boolean isShutdown = true;
         @GuardedBy("this")
         private InetSocketAddress broadcastAddress;
+        private int generation = -1;
 
         protected IInvokableInstance delegate()
         {
             if (delegate == null)
-                throw new IllegalStateException("Can't use shut down instances, delegate is null");
+                throw new IllegalStateException("Can't use shutdown instances, delegate is null");
             return delegate;
         }
 
         protected IInvokableInstance delegateForStartup()
         {
             if (delegate == null)
-                delegate = newInstance(generation);
+                delegate = newInstance();
             return delegate;
         }
 
-        public Wrapper(int generation, Versions.Version version, IInstanceConfig config)
+        public Wrapper(Versions.Version version, IInstanceConfig config)
         {
-            this.generation = generation;
             this.config = config;
             this.version = version;
             // we ensure there is always a non-null delegate, so that the executor may be used while the node is offline
-            this.delegate = newInstance(generation);
+            this.delegate = newInstance();
             this.broadcastAddress = config.broadcastAddress();
         }
 
-        private IInvokableInstance newInstance(int generation)
+        private IInvokableInstance newInstance()
         {
-            ClassLoader classLoader = new InstanceClassLoader(generation, config.num(), version.classpath, sharedClassLoader, SHARED_PREDICATE);
+            ++generation;
+            IClassTransformer transformer = classTransformer == null ? null : classTransformer.initialise();
+            ClassLoader classLoader = new InstanceClassLoader(generation, config.num(), version.classpath, sharedClassLoader, sharedClassPredicate, transformer);
+            ThreadGroup threadGroup = new ThreadGroup(clusterThreadGroup, "node" + config.num() + (generation > 1 ? "_" + generation : ""));
             if (instanceInitializer != null)
-                instanceInitializer.accept(classLoader, config.num());
-            return Instance.transferAdhoc((SerializableBiFunction<IInstanceConfig, ClassLoader, Instance>)Instance::new, classLoader)
-                                        .apply(config.forVersion(version.version), classLoader);
+                instanceInitializer.initialise(classLoader, threadGroup, config.num(), generation);
+
+            IInvokableInstance instance;
+            try
+            {
+                instance = Instance.transferAdhocPropagate((SerializableQuadFunction<IInstanceConfig, ClassLoader, FileSystem, ShutdownExecutor, Instance>)Instance::new, classLoader)
+                                   .apply(config.forVersion(version.version), classLoader, root.getFileSystem(), shutdownExecutor);
+            }
+            catch (InvocationTargetException e)
+            {
+                try
+                {
+                    instance = Instance.transferAdhocPropagate((SerializableTriFunction<IInstanceConfig, ClassLoader, FileSystem, Instance>)Instance::new, classLoader)
+                                       .apply(config.forVersion(version.version), classLoader, root.getFileSystem());
+                }
+                catch (InvocationTargetException e2)
+                {
+                    instance = Instance.transferAdhoc((SerializableBiFunction<IInstanceConfig, ClassLoader, Instance>)Instance::new, classLoader)
+                                       .apply(config.forVersion(version.version), classLoader);
+                }
+                catch (IllegalAccessException e2)
+                {
+                    throw new RuntimeException(e);
+                }
+            }
+            catch (IllegalAccessException e)
+            {
+                throw new RuntimeException(e);
+            }
+
+            if (instanceInitializer != null)
+                instanceInitializer.beforeStartup(instance);
+
+            return instance;
+        }
+
+        public Executor executorFor(int verb)
+        {
+            if (isShutdown)
+                throw new IllegalStateException();
+
+            // this method must be lock-free to avoid Simulator deadlock
+            return delegate().executorFor(verb);
         }
 
         public IInstanceConfig config()
@@ -233,19 +334,29 @@
 
         public boolean isShutdown()
         {
-            return isShutdown;
+            IInvokableInstance delegate = this.delegate;
+            // if the instance shuts down on its own, detect that
+            return isShutdown || (delegate != null && delegate.isShutdown());
         }
 
         private boolean isRunning()
         {
-            return !isShutdown;
+            return !isShutdown();
+        }
+
+        @Override
+        public boolean isValid()
+        {
+            return delegate != null;
         }
 
         @Override
         public synchronized void startup()
         {
             startup(AbstractCluster.this);
+            postStartup();
         }
+
         public synchronized void startup(ICluster cluster)
         {
             if (cluster != AbstractCluster.this)
@@ -253,6 +364,9 @@
             if (isRunning())
                 throw new IllegalStateException("Can not start a instance that is already running");
             isShutdown = false;
+            // if the delegate isn't running, remove so it can be recreated
+            if (delegate != null && delegate.isShutdown())
+                delegate = null;
             if (!broadcastAddress.equals(config.broadcastAddress()))
             {
                 // previous address != desired address, so cleanup
@@ -261,6 +375,8 @@
                 instanceMap.put(newAddress, (I) this); // if the broadcast address changes, update
                 instanceMap.remove(previous);
                 broadcastAddress = newAddress;
+                // remove delegate to make sure static state is reset
+                delegate = null;
             }
             try
             {
@@ -288,6 +404,9 @@
             // This duplicates work done in Instance startup, but keeping as other Instance implementations
             // do not, so to permit older releases to be tested, repeat the setup
             updateMessagingVersions();
+
+            if (instanceInitializer != null)
+                instanceInitializer.afterStartup(this);
         }
 
         @Override
@@ -346,6 +465,14 @@
         }
 
         @Override
+        public void receiveMessageWithInvokingThread(IMessage message)
+        {
+            IInvokableInstance delegate = this.delegate;
+            if (isRunning() && delegate != null) // since we sync directly on the other node, we drop messages immediately if we are shutdown
+                delegate.receiveMessageWithInvokingThread(message);
+        }
+
+        @Override
         public boolean getLogsEnabled()
         {
             return delegate().getLogsEnabled();
@@ -392,28 +519,30 @@
 
     protected AbstractCluster(AbstractBuilder<I, ? extends ICluster<I>, ?> builder)
     {
-        this.root = builder.getRoot();
+        this.root = builder.getRootPath();
         this.sharedClassLoader = builder.getSharedClassLoader();
+        this.sharedClassPredicate = builder.getSharedClasses();
+        this.classTransformer = builder.getClassTransformer();
         this.subnet = builder.getSubnet();
         this.tokenSupplier = builder.getTokenSupplier();
         this.nodeIdTopology = builder.getNodeIdTopology();
         this.configUpdater = builder.getConfigUpdater();
         this.broadcastPort = builder.getBroadcastPort();
         this.nodeProvisionStrategy = builder.nodeProvisionStrategy;
+        this.shutdownExecutor = builder.shutdownExecutor;
         this.instances = new ArrayList<>();
         this.instanceMap = new ConcurrentHashMap<>();
         this.initialVersion = builder.getVersion();
         this.filters = new MessageFilters();
-        this.instanceInitializer = builder.getInstanceInitializer();
+        this.instanceInitializer = builder.getInstanceInitializer2();
         this.datadirCount = builder.getDatadirCount();
 
-        int generation = GENERATION.incrementAndGet();
         for (int i = 0; i < builder.getNodeCount(); ++i)
         {
             int nodeNum = i + 1;
             InstanceConfig config = createInstanceConfig(nodeNum);
 
-            I instance = newInstanceWrapperInternal(generation, initialVersion, config);
+            I instance = newInstanceWrapperInternal(initialVersion, config);
             instances.add(instance);
             // we use the config().broadcastAddressAndPort() here because we have not initialised the Instance
             I prev = instanceMap.put(instance.config().broadcastAddress(), instance);
@@ -427,15 +556,46 @@
         return createInstanceConfig(size() + 1);
     }
 
-    private InstanceConfig createInstanceConfig(int nodeNum)
+    @VisibleForTesting
+    InstanceConfig createInstanceConfig(int nodeNum)
     {
         INodeProvisionStrategy provisionStrategy = nodeProvisionStrategy.create(subnet);
-        long token = tokenSupplier.token(nodeNum);
+        Collection<String> tokens = tokenSupplier.tokens(nodeNum);
         NetworkTopology topology = buildNetworkTopology(provisionStrategy, nodeIdTopology);
-        InstanceConfig config = InstanceConfig.generate(nodeNum, provisionStrategy, topology, root, Long.toString(token), datadirCount);
+        InstanceConfig config = InstanceConfig.generate(nodeNum, provisionStrategy, topology, root, tokens, datadirCount);
         config.set(Constants.KEY_DTEST_API_CLUSTER_ID, clusterId.toString());
+        // if a test sets num_tokens directly, then respect it and only run if vnode or no-vnode is defined
+        int defaultTokenCount = config.getInt("num_tokens");
+        assert tokens.size() == defaultTokenCount : String.format("num_tokens=%d but tokens are %s; size does not match", defaultTokenCount, tokens);
+        String defaultTokens = config.getString("initial_token");
         if (configUpdater != null)
+        {
             configUpdater.accept(config);
+            int testTokenCount = config.getInt("num_tokens");
+            if (defaultTokenCount != testTokenCount)
+            {
+                if (testTokenCount == 1)
+                {
+                    // test is no-vnode, but running with vnode, so skip
+                    Assume.assumeTrue("vnode is not supported", false);
+                }
+                else
+                {
+                    Assume.assumeTrue("no-vnode is requested but not supported", defaultTokenCount > 1);
+                    // if the test controls initial_token or GOSSIP is enabled, then the test is safe to run
+                    if (defaultTokens.equals(config.getString("initial_token")))
+                    {
+                        // test didn't define initial_token
+                        Assume.assumeTrue("vnode is enabled and num_tokens is defined in test without GOSSIP or setting initial_token", config.has(Feature.GOSSIP));
+                        config.remove("initial_token");
+                    }
+                    else
+                    {
+                        // test defined initial_token; trust it
+                    }
+                }
+            }
+        }
         return config;
     }
 
@@ -453,17 +613,17 @@
     }
 
 
-    protected abstract I newInstanceWrapper(int generation, Versions.Version version, IInstanceConfig config);
+    protected abstract I newInstanceWrapper(Versions.Version version, IInstanceConfig config);
 
-    protected I newInstanceWrapperInternal(int generation, Versions.Version version, IInstanceConfig config)
+    protected I newInstanceWrapperInternal(Versions.Version version, IInstanceConfig config)
     {
         config.validate();
-        return newInstanceWrapper(generation, version, config);
+        return newInstanceWrapper(version, config);
     }
 
     public I bootstrap(IInstanceConfig config)
     {
-        I instance = newInstanceWrapperInternal(0, initialVersion, config);
+        I instance = newInstanceWrapperInternal(initialVersion, config);
         instances.add(instance);
         I prev = instanceMap.put(config.broadcastAddress(), instance);
 
@@ -530,7 +690,7 @@
                                               i.config().localRack().equals(rackName));
     }
 
-    public void run(Consumer<? super I> action,  Predicate<I> filter)
+    public void run(Consumer<? super I> action, Predicate<I> filter)
     {
         run(Collections.singletonList(action), filter);
     }
@@ -598,6 +758,20 @@
         return filters;
     }
 
+    public synchronized void setMessageSink(IMessageSink sink)
+    {
+        if (messageSink != null && sink != null)
+            throw new IllegalStateException();
+        this.messageSink = sink;
+    }
+
+    public void deliverMessage(InetSocketAddress to, IMessage message)
+    {
+        IMessageSink sink = messageSink;
+        if (sink == null) get(to).receiveMessage(message);
+        else sink.accept(to, message);
+    }
+
     public IMessageFilters.Builder verbs(Verb... verbs)
     {
         int[] ids = new int[verbs.length];
@@ -678,7 +852,7 @@
     public abstract class ChangeMonitor implements AutoCloseable
     {
         final List<IListen.Cancel> cleanup;
-        final SimpleCondition completed;
+        final Condition completed;
         private final long timeOut;
         private final TimeUnit timeoutUnit;
         protected Predicate<IInstance> instanceFilter;
@@ -690,7 +864,7 @@
             this.timeoutUnit = timeoutUnit;
             this.instanceFilter = i -> true;
             this.cleanup = new ArrayList<>(instances.size());
-            this.completed = new SimpleCondition();
+            this.completed = newOneTimeCondition();
         }
 
         public void ignoreStoppedInstances()
@@ -700,7 +874,7 @@
 
         protected void signal()
         {
-            if (initialized && !completed.isSignaled() && isCompleted())
+            if (initialized && !completed.isSignalled() && isCompleted())
                 completed.signalAll();
         }
 
@@ -819,8 +993,14 @@
                     startParallel.add(instance);
             }
 
-            forEach(startSequentially, I::startup);
-            parallelForEach(startParallel, I::startup, 0, null);
+            forEach(startSequentially, i -> {
+                i.startup(this);
+                i.postStartup();
+            });
+            parallelForEach(startParallel, i -> {
+                i.startup(this);
+                i.postStartup();
+            }, 0, null);
             monitor.waitForCompletion();
         }
     }
@@ -861,9 +1041,10 @@
 
         instances.clear();
         instanceMap.clear();
+        PathUtils.setDeletionListener(ignore -> {});
         // Make sure to only delete directory when threads are stopped
-        if (root.exists())
-            FileUtils.deleteRecursive(root);
+        if (Files.exists(root))
+            PathUtils.deleteRecursive(root);
         Thread.setDefaultUncaughtExceptionHandler(previousHandler);
         previousHandler = null;
         checkAndResetUncaughtExceptions();
@@ -915,12 +1096,12 @@
     public List<Token> tokens()
     {
         return stream()
-               .map(i ->
+               .flatMap(i ->
                     {
                         try
                         {
                             IPartitioner partitioner = ((IPartitioner)Class.forName(i.config().getString("partitioner")).newInstance());
-                            return partitioner.getTokenFactory().fromString(i.config().getString("initial_token"));
+                            return Stream.of(i.config().getString("initial_token").split(",")).map(partitioner.getTokenFactory()::fromString);
                         }
                         catch (Throwable t)
                         {
@@ -930,21 +1111,218 @@
                .collect(Collectors.toList());
     }
 
-    private static Set<String> findClassesMarkedForSharedClassLoader()
+    private static Set<String> findClassesMarkedForSharedClassLoader(Class<?>[] share, Shared.Scope ... scopes)
     {
-        return findClassesMarkedWith(Shared.class);
+        return findClassesMarkedForSharedClassLoader(share, ImmutableSet.copyOf(scopes)::contains);
     }
 
-    private static Set<String> findClassesMarkedForInstanceClassLoader()
+    private static Set<String> findClassesMarkedForSharedClassLoader(Class<?>[] share, Predicate<Shared.Scope> scopes)
     {
-        return findClassesMarkedWith(Isolated.class);
+        Set<Class<?>> classes = findClassesMarkedWith(Shared.class, a -> of(a.scope()).anyMatch(scopes));
+        Collections.addAll(classes, share);
+        assertTransitiveClosure(classes);
+        return toNames(classes);
     }
 
-    private static Set<String> findClassesMarkedWith(Class<? extends Annotation> annotation)
+    private static Set<String> findClassesMarkedForInstanceClassLoader(Class<?>[] isolate)
     {
-        return new Reflections(ConfigurationBuilder.build("org.apache.cassandra").setExpandSuperTypes(false))
-               .getTypesAnnotatedWith(annotation).stream()
-               .map(Class::getName)
+        Set<Class<?>> classes = findClassesMarkedWith(Isolated.class, ignore -> true);
+        Collections.addAll(classes, isolate);
+        return toNames(classes);
+    }
+
+    public static Predicate<String> getSharedClassPredicate(Shared.Scope ... scopes)
+    {
+        return getSharedClassPredicate(new Class[0], new Class[0], scopes);
+    }
+
+    public static Predicate<String> getSharedClassPredicate(Class<?>[] isolate, Class<?>[] share, Shared.Scope ... scopes)
+    {
+        Set<String> shared = findClassesMarkedForSharedClassLoader(share, scopes);
+        Set<String> isolated = findClassesMarkedForInstanceClassLoader(isolate);
+        return s -> {
+            if (isolated.contains(s))
+                return false;
+
+            return shared.contains(s) ||
+                   InstanceClassLoader.getDefaultLoadSharedFilter().test(s) ||
+                   s.startsWith("org.jboss.byteman");
+        };
+    }
+
+    private static <A extends Annotation> Set<Class<?>> findClassesMarkedWith(Class<A> annotation, Predicate<A> testAnnotation)
+    {
+        Reflections reflections = new Reflections(ConfigurationBuilder.build("org.apache.cassandra").setExpandSuperTypes(false));
+        return Utils.INSTANCE.forNames(reflections.get(Scanners.TypesAnnotated.get(annotation.getName())),
+                        reflections.getConfiguration().getClassLoaders())
+               .stream()
+               .filter(testAnnotation(annotation, testAnnotation))
+               .flatMap(expander())
                .collect(Collectors.toSet());
     }
+
+    private static Set<String> toNames(Set<Class<?>> classes)
+    {
+        return classes.stream().map(Class::getName).collect(Collectors.toSet());
+    }
+
+    private static <A extends Annotation> Predicate<Class<?>> testAnnotation(Class<A> annotation, Predicate<A> test)
+    {
+        return clazz -> {
+            A[] annotations = clazz.getDeclaredAnnotationsByType(annotation);
+            for (A a : annotations)
+            {
+                if (!test.test(a))
+                    return false;
+            }
+            return true;
+        };
+    }
+
+    private static void assertTransitiveClosure(Set<Class<?>> classes)
+    {
+        Set<Class<?>> tested = new HashSet<>();
+        for (Class<?> clazz : classes)
+        {
+            forEach(test -> {
+                if (!classes.contains(test))
+                    throw new AssertionError(clazz.getName() + " is shared, but its dependency " + test + " is not");
+            }, new SharedParams(ALL, ALL, NONE), clazz, tested);
+        }
+    }
+
+    private static class SharedParams
+    {
+        final Recursive ancestors, members, inner;
+
+        private SharedParams(Recursive ancestors, Recursive members, Recursive inner)
+        {
+            this.ancestors = ancestors;
+            this.members = members;
+            this.inner = inner;
+        }
+
+        private SharedParams(Shared shared)
+        {
+            this.ancestors = shared.ancestors();
+            this.members = shared.members();
+            this.inner = shared.inner();
+        }
+    }
+
+    private static void forEach(Consumer<Class<?>> forEach, SharedParams shared, Class<?> cur, Set<Class<?>> done)
+    {
+        if (null == (cur = consider(cur, done)))
+            return;
+
+        forEach.accept(cur);
+
+        switch (shared.ancestors)
+        {
+            case ALL:
+                forEach(forEach, shared, cur.getSuperclass(), done);
+            case INTERFACES:
+                for (Class<?> i : cur.getInterfaces())
+                    forEach(forEach, shared, i, done);
+        }
+
+        if (shared.members != NONE)
+        {
+            for (Field field : cur.getDeclaredFields())
+            {
+                if ((field.getModifiers() & Modifier.PRIVATE) == 0)
+                    forEachMatch(shared.members, forEach, shared, field.getType(), done);
+            }
+
+            for (Method method : cur.getDeclaredMethods())
+            {
+                if ((method.getModifiers() & Modifier.PRIVATE) == 0)
+                {
+                    forEachMatch(shared.members, forEach, shared, method.getReturnType(), done);
+                    forEachMatch(shared.members, forEach, shared, method.getParameterTypes(), done);
+                }
+            }
+        }
+
+        if (shared.inner != NONE)
+            forEachMatch(shared.inner, forEach, shared, cur.getDeclaredClasses(), done);
+    }
+
+    private static void forEachMatch(Recursive ifMatches, Consumer<Class<?>> forEach, SharedParams shared, Class<?>[] classes, Set<Class<?>> done)
+    {
+        for (Class<?> cur : classes)
+            forEachMatch(ifMatches, forEach, shared, cur, done);
+    }
+
+    private static void forEachMatch(Recursive ifMatches, Consumer<Class<?>> forEach, SharedParams shared, Class<?> cur, Set<Class<?>> done)
+    {
+        if (ifMatches == ALL || isInterface(cur))
+            forEach(forEach, shared, cur, done);
+    }
+
+    private static boolean isInterface(Class<?> test)
+    {
+        return test.isInterface() || test.isEnum() || Throwable.class.isAssignableFrom(test);
+    }
+
+    private static Function<Class<?>, Stream<Class<?>>> expander()
+    {
+        Set<Class<?>> done = new HashSet<>();
+        return clazz -> expand(clazz, done);
+    }
+
+    private static Stream<Class<?>> expand(Class<?> clazz, Set<Class<?>> done)
+    {
+        Optional<Shared> maybeShared = of(clazz.getDeclaredAnnotationsByType(Shared.class)).findFirst();
+        if (!maybeShared.isPresent())
+            return Stream.of(clazz);
+
+        Shared shared = maybeShared.get();
+        if (shared.inner() == NONE && shared.members() == NONE && shared.ancestors() == NONE)
+            return Stream.of(clazz);
+
+        Set<Class<?>> closure = new HashSet<>();
+        forEach(closure::add, new SharedParams(shared), clazz, done);
+        return closure.stream();
+    }
+
+    private static Class<?> consider(Class<?> consider, Set<Class<?>> considered)
+    {
+        if (consider == null) return null;
+        while (consider.isArray()) // TODO (future): this is inadequate handling of array types (fine for now)
+            consider = consider.getComponentType();
+
+        if (consider.isPrimitive()) return null;
+        if (consider.getPackage() != null && consider.getPackage().getName().startsWith("java.")) return null;
+        if (!considered.add(consider)) return null;
+        if (InstanceClassLoader.getDefaultLoadSharedFilter().test(consider.getName())) return null;
+
+        return consider;
+    }
+
+    // 3.0 and earlier clusters must have unique InetAddressAndPort for each InetAddress
+    public static <I extends IInstance> Map<InetSocketAddress, I> getUniqueAddressLookup(ICluster<I> cluster)
+    {
+        return getUniqueAddressLookup(cluster, Function.identity());
+    }
+
+    public static <I extends IInstance, V> Map<InetSocketAddress, V> getUniqueAddressLookup(ICluster<I> cluster, Function<I, V> function)
+    {
+        Map<InetSocketAddress, V> lookup = new HashMap<>();
+        cluster.stream().forEach(instance -> {
+            InetSocketAddress address = instance.broadcastAddress();
+            if (!address.equals(instance.config().broadcastAddress()))
+                throw new IllegalStateException("addressAndPort mismatch: " + address + " vs " + instance.config().broadcastAddress());
+            V prev = lookup.put(address, function.apply(instance));
+            if (null != prev)
+                throw new IllegalStateException("This version of Cassandra does not support multiple nodes with the same InetAddress: " + address + " vs " + prev);
+        });
+        return lookup;
+    }
+
+    // after upgrading a static function became an interface method, so need this class to mimic old behavior
+    private enum Utils implements NameHelper
+    {
+        INSTANCE;
+    }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/AbstractClusterTest.java b/test/distributed/org/apache/cassandra/distributed/impl/AbstractClusterTest.java
new file mode 100644
index 0000000..1b2a1ce
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/impl/AbstractClusterTest.java
@@ -0,0 +1,251 @@
+/*
+ * 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.distributed.impl;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import org.junit.AssumptionViolatedException;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.TokenSupplier;
+import org.apache.cassandra.distributed.impl.AbstractCluster.AbstractBuilder;
+import org.apache.cassandra.distributed.shared.Versions;
+import org.apache.cassandra.utils.FailingRunnable;
+import org.assertj.core.api.Assertions;
+import org.mockito.Mockito;
+
+
+public class AbstractClusterTest
+{
+    @Test
+    public void allowVnodeWithMultipleTokens()
+    {
+        AbstractBuilder builder = builder();
+        builder.withTokenCount(42);
+        unroll(() -> builder.createWithoutStarting());
+    }
+
+    @Test
+    public void allowVnodeWithSingleToken()
+    {
+        AbstractBuilder builder = builder();
+        builder.withTokenCount(1);
+        unroll(() -> builder.createWithoutStarting());
+    }
+
+    @Test
+    public void disallowVnodeWithMultipleTokens()
+    {
+        AbstractBuilder builder = builder();
+
+        builder.withoutVNodes();
+        builder.withTokenCount(42);
+
+        Assertions.assertThatThrownBy(() -> builder.createWithoutStarting())
+                  .isInstanceOf(AssumptionViolatedException.class)
+                  .hasMessage("vnode is not supported");
+    }
+
+
+    @Test
+    public void disallowVnodeWithSingleToken()
+    {
+        AbstractBuilder builder = builder();
+
+        builder.withoutVNodes();
+        builder.withTokenCount(1);
+
+        unroll(() -> builder.createWithoutStarting());
+    }
+
+    @Test
+    public void withoutVNodes()
+    {
+        AbstractBuilder builder = builder();
+
+        builder.withoutVNodes();
+        //TODO casting is annoying... what can be done to be smarter?
+        builder.withTokenSupplier((TokenSupplier) i -> Arrays.asList("a", "b", "c"));
+
+        Assertions.assertThatThrownBy(() -> builder.createWithoutStarting())
+                  .isInstanceOf(AssumptionViolatedException.class)
+                  .hasMessage("vnode is not supported");
+    }
+
+    @Test
+    public void vnodeButTokensDoNotMatch()
+    {
+        AbstractBuilder builder = builder();
+
+        builder.withTokenCount(1);
+        //TODO casting is annoying... what can be done to be smarter?
+        builder.withTokenSupplier((TokenSupplier) i -> Arrays.asList("a", "b", "c"));
+
+        Assertions.assertThatThrownBy(() -> builder.createWithoutStarting())
+                  .isInstanceOf(AssumptionViolatedException.class)
+                  .hasMessage("no-vnode is requested but not supported");
+    }
+
+    @Test
+    public void noVnodeButTokensDoNotMatch()
+    {
+        AbstractBuilder builder = builder();
+
+        builder.withTokenCount(42);
+        //TODO casting is annoying... what can be done to be smarter?
+        builder.withTokenSupplier((TokenSupplier) i -> Arrays.asList("a"));
+
+        Assertions.assertThatThrownBy(() -> builder.createWithoutStarting())
+                  .isInstanceOf(AssumptionViolatedException.class)
+                  .hasMessage("vnode is requested but not supported");
+    }
+
+    @Test
+    public void vnodeNotSupported()
+    {
+        ConfigUpdate config = ConfigUpdate.of("num_tokens", 1);
+        AbstractCluster<?> cluster = cluster(4, config);
+        config.check = true;
+        Assertions.assertThatThrownBy(() -> cluster.createInstanceConfig(1))
+                  .isInstanceOf(AssumptionViolatedException.class)
+                  .hasMessage("vnode is not supported");
+    }
+
+    @Test
+    public void noVnodeNotSupported()
+    {
+        ConfigUpdate config = ConfigUpdate.of("num_tokens", 4);
+        AbstractCluster<?> cluster = cluster(1, config);
+        config.check = true;
+        Assertions.assertThatThrownBy(() -> cluster.createInstanceConfig(1))
+                  .isInstanceOf(AssumptionViolatedException.class)
+                  .hasMessage("no-vnode is requested but not supported");
+    }
+
+    @Test
+    public void vnodeMismatch()
+    {
+        ConfigUpdate config = ConfigUpdate.of("num_tokens", 4);
+        AbstractCluster<?> cluster = cluster(2, config);
+        config.check = true;
+        Assertions.assertThatThrownBy(() -> cluster.createInstanceConfig(1))
+                  .isInstanceOf(AssumptionViolatedException.class)
+                  .hasMessage("vnode is enabled and num_tokens is defined in test without GOSSIP or setting initial_token");
+    }
+
+    @Test
+    public void vnodeMismatchDefinesTokens()
+    {
+        ConfigUpdate config = ConfigUpdate.of("num_tokens", 4, "initial_token", "some values");
+        AbstractCluster<?> cluster = cluster(2, config);
+        config.check = true;
+        unroll(() -> cluster.createInstanceConfig(1));
+    }
+
+    private static void unroll(FailingRunnable r)
+    {
+        try
+        {
+            r.run();
+        }
+        catch (AssumptionViolatedException e)
+        {
+            AssertionError e2 = new AssertionError(e.getMessage());
+            e2.setStackTrace(e.getStackTrace());
+            throw e2;
+        }
+    }
+
+    private static AbstractCluster<?> cluster(int tokenCount, Consumer<IInstanceConfig> fn)
+    {
+        try
+        {
+            return (AbstractCluster<?>) builder()
+                                        .withTokenCount(tokenCount)
+                                        .withConfig(fn)
+                                        .createWithoutStarting();
+        }
+        catch (IOException e)
+        {
+            throw new AssertionError(e);
+        }
+    }
+
+    private static AbstractBuilder builder()
+    {
+        return new Builder().withNodes(1);
+    }
+
+    private static class Builder extends AbstractBuilder<IInvokableInstance, Cluster, Builder>
+    {
+        public Builder()
+        {
+            super(Cluster::new);
+        }
+    }
+
+    private static class Cluster extends AbstractCluster<IInvokableInstance>
+    {
+        protected Cluster(AbstractBuilder builder)
+        {
+            super(builder);
+        }
+
+        @Override
+        protected IInvokableInstance newInstanceWrapper(Versions.Version version, IInstanceConfig config)
+        {
+            IInvokableInstance inst = Mockito.mock(IInvokableInstance.class);
+            Mockito.when(inst.config()).thenReturn(config);
+            return inst;
+        }
+    }
+
+    private static class ConfigUpdate implements Consumer<IInstanceConfig>
+    {
+        public boolean check = false;
+        private final Map<String, Object> override;
+
+        private ConfigUpdate(Map<String, Object> override)
+        {
+            this.override = override;
+        }
+
+        public static ConfigUpdate of(Object... args)
+        {
+            Map<String, Object> override = new HashMap<>();
+            for (int i = 0; i < args.length; i = i + 2)
+                override.put((String) args[i], args[i + 1]);
+            return new ConfigUpdate(override);
+        }
+
+        @Override
+        public void accept(IInstanceConfig config)
+        {
+            if (!check)
+                return;
+            for (Map.Entry<String, Object> e : override.entrySet())
+                config.set(e.getKey(), e.getValue());
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/Coordinator.java b/test/distributed/org/apache/cassandra/distributed/impl/Coordinator.java
index e31ce2c..19d8062 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/Coordinator.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/Coordinator.java
@@ -32,7 +32,6 @@
 import org.apache.cassandra.cql3.CQLStatement;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.ICoordinator;
@@ -43,13 +42,15 @@
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.service.QueryState;
-import org.apache.cassandra.service.pager.QueryPager;
-import org.apache.cassandra.transport.ClientStat;
+import org.apache.cassandra.service.reads.thresholds.CoordinatorWarnings;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class Coordinator implements ICoordinator
 {
@@ -62,7 +63,7 @@
     @Override
     public SimpleQueryResult executeWithResult(String query, ConsistencyLevel consistencyLevel, Object... boundValues)
     {
-        return instance().sync(() -> executeInternal(query, consistencyLevel, boundValues)).call();
+        return instance().sync(() -> unsafeExecuteInternal(query, consistencyLevel, boundValues)).call();
     }
 
     public Future<SimpleQueryResult> asyncExecuteWithTracingWithResult(UUID sessionId, String query, ConsistencyLevel consistencyLevelOrigin, Object... boundValues)
@@ -70,8 +71,8 @@
         return instance.async(() -> {
             try
             {
-                Tracing.instance.newSession(sessionId, Collections.emptyMap());
-                return executeInternal(query, consistencyLevelOrigin, boundValues);
+                Tracing.instance.newSession(TimeUUID.fromUuid(sessionId), Collections.emptyMap());
+                return unsafeExecuteInternal(query, consistencyLevelOrigin, boundValues);
             }
             finally
             {
@@ -80,17 +81,33 @@
         }).call();
     }
 
-    protected org.apache.cassandra.db.ConsistencyLevel toCassandraCL(ConsistencyLevel cl)
+    public static org.apache.cassandra.db.ConsistencyLevel toCassandraCL(ConsistencyLevel cl)
     {
-        return org.apache.cassandra.db.ConsistencyLevel.fromCode(cl.ordinal());
+        try
+        {
+            return org.apache.cassandra.db.ConsistencyLevel.fromCode(cl.code);
+        }
+        catch (NoSuchFieldError e)
+        {
+            return org.apache.cassandra.db.ConsistencyLevel.fromCode(cl.ordinal());
+        }
     }
 
-    private SimpleQueryResult executeInternal(String query, ConsistencyLevel consistencyLevelOrigin, Object[] boundValues)
+    protected static org.apache.cassandra.db.ConsistencyLevel toCassandraSerialCL(ConsistencyLevel cl)
+    {
+        return toCassandraCL(cl == null ? ConsistencyLevel.SERIAL : cl);
+    }
+
+    public static SimpleQueryResult unsafeExecuteInternal(String query, ConsistencyLevel consistencyLevel, Object[] boundValues)
+    {
+        return unsafeExecuteInternal(query, null, consistencyLevel, boundValues);
+    }
+
+    public static SimpleQueryResult unsafeExecuteInternal(String query, ConsistencyLevel serialConsistencyLevel, ConsistencyLevel commitConsistencyLevel, Object[] boundValues)
     {
         ClientState clientState = makeFakeClientState();
         CQLStatement prepared = QueryProcessor.getStatement(query, clientState);
         List<ByteBuffer> boundBBValues = new ArrayList<>();
-        ConsistencyLevel consistencyLevel = ConsistencyLevel.valueOf(consistencyLevelOrigin.name());
         for (Object boundValue : boundValues)
             boundBBValues.add(ByteBufferUtil.objectToBytes(boundValue));
 
@@ -99,23 +116,36 @@
         // Start capturing warnings on this thread. Note that this will implicitly clear out any previous 
         // warnings as it sets a new State instance on the ThreadLocal.
         ClientWarn.instance.captureWarnings();
-        
-        ResultMessage res = prepared.execute(QueryState.forInternalCalls(),
-                                             QueryOptions.create(toCassandraCL(consistencyLevel),
-                                                                 boundBBValues,
-                                                                 false,
-                                                                 Integer.MAX_VALUE,
-                                                                 null,
-                                                                 null,
-                                                                 ProtocolVersion.CURRENT,
-                                                                 null),
-                                             System.nanoTime());
+        CoordinatorWarnings.init();
+        try
+        {
+            ResultMessage res = prepared.execute(QueryState.forInternalCalls(),
+                                   QueryOptions.create(toCassandraCL(commitConsistencyLevel),
+                                                       boundBBValues,
+                                                       false,
+                                                       Integer.MAX_VALUE,
+                                                       null,
+                                                       toCassandraSerialCL(serialConsistencyLevel),
+                                                       ProtocolVersion.CURRENT,
+                                                       null),
+                                   nanoTime());
+            // Collect warnings reported during the query.
+            CoordinatorWarnings.done();
+            if (res != null)
+                res.setWarnings(ClientWarn.instance.getWarnings());
 
-        // Collect warnings reported during the query.
-        if (res != null)
-            res.setWarnings(ClientWarn.instance.getWarnings());
-
-        return RowUtil.toQueryResult(res);
+            return RowUtil.toQueryResult(res);
+        }
+        catch (Exception | Error e)
+        {
+            CoordinatorWarnings.done();
+            throw e;
+        }
+        finally
+        {
+            CoordinatorWarnings.reset();
+            ClientWarn.instance.resetWarnings();
+        }
     }
 
     public Object[][] executeWithTracing(UUID sessionId, String query, ConsistencyLevel consistencyLevelOrigin, Object... boundValues)
@@ -129,6 +159,12 @@
     }
 
     @Override
+    public SimpleQueryResult executeWithResult(String query, ConsistencyLevel serialConsistencyLevel, ConsistencyLevel commitConsistencyLevel, Object... boundValues)
+    {
+        return instance.sync(() -> unsafeExecuteInternal(query, serialConsistencyLevel, commitConsistencyLevel, boundValues)).call();
+    }
+
+    @Override
     public QueryResult executeWithPagingWithResult(String query, ConsistencyLevel consistencyLevelOrigin, int pageSize, Object... boundValues)
     {
         if (pageSize <= 0)
@@ -145,7 +181,7 @@
             prepared.validate(clientState);
             assert prepared instanceof SelectStatement : "Only SELECT statements can be executed with paging";
 
-            long nanoTime = System.nanoTime();
+            long nanoTime = nanoTime();
             SelectStatement selectStatement = (SelectStatement) prepared;
 
             QueryState queryState = new QueryState(clientState);
@@ -197,7 +233,7 @@
         }).call();
     }
 
-    private static final ClientState makeFakeClientState()
+    public static ClientState makeFakeClientState()
     {
         return ClientState.forExternalCalls(new InetSocketAddress(FBUtilities.getJustLocalAddress(), 9042));
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/DelegatingInvokableInstance.java b/test/distributed/org/apache/cassandra/distributed/impl/DelegatingInvokableInstance.java
index 50f59a2..23b3768 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/DelegatingInvokableInstance.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/DelegatingInvokableInstance.java
@@ -21,6 +21,8 @@
 import java.io.Serializable;
 import java.net.InetSocketAddress;
 import java.util.UUID;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
@@ -31,6 +33,7 @@
 import org.apache.cassandra.distributed.api.ICoordinator;
 import org.apache.cassandra.distributed.api.IInstanceConfig;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
 import org.apache.cassandra.distributed.api.IListen;
 import org.apache.cassandra.distributed.api.IMessage;
 import org.apache.cassandra.distributed.api.SimpleQueryResult;
@@ -49,7 +52,7 @@
     @Override
     public InetSocketAddress broadcastAddress()
     {
-        return delegate().broadcastAddress();
+        return config().broadcastAddress();
     }
 
     @Override
@@ -134,6 +137,18 @@
     }
 
     @Override
+    public IIsolatedExecutor with(ExecutorService executor)
+    {
+        return delegate().with(executor);
+    }
+
+    @Override
+    public Executor executor()
+    {
+        return delegate().executor();
+    }
+
+    @Override
     public void startup(ICluster cluster)
     {
         delegateForStartup().startup(cluster);
@@ -254,11 +269,6 @@
     }
 
     @Override
-    public <O> O callOnInstance(SerializableCallable<O> call)
-    {
-        return delegate().callOnInstance(call);
-    }
-
     public <I1, I2, I3, I4, O> QuadFunction<I1, I2, I3, I4, Future<O>> async(QuadFunction<I1, I2, I3, I4, O> f)
     {
         return delegate().async(f);
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/DirectStreamingConnectionFactory.java b/test/distributed/org/apache/cassandra/distributed/impl/DirectStreamingConnectionFactory.java
new file mode 100644
index 0000000..72105d8
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/impl/DirectStreamingConnectionFactory.java
@@ -0,0 +1,398 @@
+/*
+ * 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.distributed.impl;
+
+import java.io.IOException;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
+import java.nio.channels.FileChannel;
+import java.util.ArrayDeque;
+import java.util.Queue;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
+import java.util.function.IntFunction;
+
+import io.netty.util.concurrent.Future;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
+import org.apache.cassandra.io.util.RebufferingInputStream;
+import org.apache.cassandra.net.OutboundConnectionSettings;
+import org.apache.cassandra.streaming.StreamDeserializingTask;
+import org.apache.cassandra.streaming.StreamingDataInputPlus;
+import org.apache.cassandra.streaming.StreamingDataOutputPlus;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.StreamingDataOutputPlusFixed;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.locator.InetAddressAndPort.getByAddress;
+import static org.apache.cassandra.net.MessagingService.*;
+
+// TODO: Simulator should schedule based on some streaming data rate
+public class DirectStreamingConnectionFactory
+{
+    static class DirectConnection
+    {
+        private static final AtomicInteger nextId = new AtomicInteger();
+
+        final int protocolVersion;
+        final long sendBufferSize;
+
+        // TODO rename
+        private static class Buffer
+        {
+            final Queue<byte[]> pending = new ArrayDeque<>();
+            boolean isClosed;
+            int pendingBytes = 0;
+        }
+
+        @SuppressWarnings({"InnerClassMayBeStatic","unused"}) // helpful for debugging
+        class DirectStreamingChannel implements StreamingChannel
+        {
+            class Out extends BufferedDataOutputStreamPlus implements StreamingDataOutputPlus
+            {
+                private final Buffer out;
+                private Thread thread;
+                private boolean inUse;
+
+                Out(Buffer out)
+                {
+                    super(ByteBuffer.allocate(16 << 10));
+                    this.out = out;
+                }
+
+                protected void doFlush(int count) throws IOException
+                {
+                    if (buffer.position() == 0)
+                        return;
+
+                    try
+                    {
+                        synchronized (out)
+                        {
+                            while (out.pendingBytes > 0 && count + out.pendingBytes > sendBufferSize && !out.isClosed)
+                                out.wait();
+
+                            if (out.isClosed)
+                                throw new ClosedChannelException();
+
+                            buffer.flip();
+                            out.pendingBytes += buffer.remaining();
+                            out.pending.add(ByteBufferUtil.getArray(buffer));
+                            buffer.clear();
+
+                            out.notify();
+                        }
+                    }
+                    catch (InterruptedException e)
+                    {
+                        throw new UncheckedInterruptedException(e);
+                    }
+                }
+
+                public synchronized Out acquire()
+                {
+                    if (inUse)
+                        throw new IllegalStateException();
+                    inUse = true;
+                    thread = Thread.currentThread();
+                    return this;
+                }
+
+                public synchronized void close() throws IOException
+                {
+                    flush();
+                    inUse = false;
+                }
+
+                void realClose()
+                {
+                    synchronized (out)
+                    {
+                        out.isClosed = true;
+                        out.notifyAll();
+                    }
+                }
+
+                @Override
+                public int writeToChannel(Write write, RateLimiter limiter) throws IOException
+                {
+                    class Holder
+                    {
+                        ByteBuffer buffer;
+                    }
+                    Holder holder = new Holder();
+
+                    write.write(size -> {
+                        if (holder.buffer != null)
+                            throw new IllegalStateException("Can only allocate one ByteBuffer");
+                        holder.buffer = ByteBuffer.allocate(size);
+                        return holder.buffer;
+                    });
+
+                    ByteBuffer buffer = holder.buffer;
+                    int length = buffer.limit();
+                    write(buffer);
+                    return length;
+                }
+
+                // TODO (future): support RateLimiter
+                @Override
+                public long writeFileToChannel(FileChannel file, RateLimiter limiter) throws IOException
+                {
+                    long count = 0;
+                    while (file.read(buffer) >= 0)
+                    {
+                        count += buffer.position();
+                        doFlush(0);
+                    }
+                    return count;
+                }
+            }
+
+            class In extends RebufferingInputStream implements StreamingDataInputPlus
+            {
+                private final Buffer in;
+                private Thread thread;
+
+                In(Buffer in)
+                {
+                    super(ByteBuffer.allocate(0));
+                    this.in = in;
+                }
+
+                protected void reBuffer() throws IOException
+                {
+                    try
+                    {
+                        synchronized (in)
+                        {
+                            while (in.pendingBytes == 0 && !in.isClosed)
+                                in.wait();
+
+                            if (in.pendingBytes == 0)
+                                throw new ClosedChannelException();
+
+                            byte[] bytes = in.pending.poll();
+                            if (bytes == null)
+                                throw new IllegalStateException();
+
+                            in.pendingBytes -= bytes.length;
+                            buffer = ByteBuffer.wrap(bytes);
+                            in.notify();
+                        }
+                    }
+                    catch (InterruptedException e)
+                    {
+                        throw new UncheckedInterruptedException(e);
+                    }
+                }
+
+                public void close()
+                {
+                    DirectStreamingChannel.this.close();
+                }
+
+                public void realClose()
+                {
+                    synchronized (in)
+                    {
+                        in.isClosed = true;
+                        in.notifyAll();
+                    }
+                }
+            }
+
+            final InetSocketAddress remoteAddress;
+
+            private final In in;
+            private final Out out;
+            private final Integer id = nextId.incrementAndGet();
+            Runnable onClose;
+            boolean isClosed;
+
+            DirectStreamingChannel(InetSocketAddress remoteAddress, Buffer outBuffer, Buffer inBuffer)
+            {
+                this.remoteAddress = remoteAddress;
+                this.in = new In(inBuffer);
+                this.out = new Out(outBuffer);
+            }
+
+            public StreamingDataOutputPlus acquireOut()
+            {
+                return out.acquire();
+            }
+
+            @Override
+            public synchronized Future<?> send(Send send) throws IOException
+            {
+                class Factory implements IntFunction<StreamingDataOutputPlus>
+                {
+                    ByteBuffer buffer;
+                    @Override
+                    public StreamingDataOutputPlus apply(int size)
+                    {
+                        buffer = ByteBuffer.allocate(size);
+                        return new StreamingDataOutputPlusFixed(buffer);
+                    }
+                }
+                Factory factory = new Factory();
+                send.send(factory);
+                factory.buffer.flip();
+                try (StreamingDataOutputPlus out = acquireOut())
+                {
+                    out.write(factory.buffer);
+                }
+                return ImmediateFuture.success(true);
+            }
+
+            @Override
+            public Object id()
+            {
+                return id;
+            }
+
+            @Override
+            public String description()
+            {
+                return remoteAddress.getAddress().getHostAddress() + "/in@" + id;
+            }
+
+            public StreamingDataInputPlus in()
+            {
+                in.thread = Thread.currentThread();
+                return in;
+            }
+
+            public InetSocketAddress peer()
+            {
+                return remoteAddress;
+            }
+
+            @Override
+            public InetSocketAddress connectedTo()
+            {
+                return remoteAddress;
+            }
+
+            @Override
+            public boolean connected()
+            {
+                return true;
+            }
+
+            @Override
+            public Future<?> close()
+            {
+                in.realClose();
+                out.realClose();
+                synchronized (this)
+                {
+                    if (!isClosed)
+                    {
+                        isClosed = true;
+                        if (onClose != null)
+                            onClose.run();
+                    }
+                }
+                return ImmediateFuture.success(null);
+            }
+
+            @Override
+            public synchronized void onClose(Runnable runOnClose)
+            {
+                if (isClosed) runOnClose.run();
+                else if (onClose == null) onClose = runOnClose;
+                else { Runnable tmp = onClose; onClose = () -> { tmp.run(); runOnClose.run(); }; }
+            }
+        }
+
+        private final DirectStreamingChannel outToRecipient, outToOriginator;
+
+        DirectConnection(int protocolVersion, long sendBufferSize, InetSocketAddress originator, InetSocketAddress recipient)
+        {
+            this.protocolVersion = protocolVersion;
+            this.sendBufferSize = sendBufferSize;
+            Buffer buffer1 = new Buffer(), buffer2 = new Buffer();
+            outToRecipient = new DirectStreamingChannel(recipient, buffer1, buffer2);
+            outToOriginator = new DirectStreamingChannel(originator, buffer2, buffer1);
+        }
+
+        StreamingChannel get(InetSocketAddress remoteAddress)
+        {
+            if (remoteAddress.equals(outToOriginator.remoteAddress)) return outToOriginator;
+            else if (remoteAddress.equals(outToRecipient.remoteAddress)) return outToRecipient;
+            else throw new IllegalArgumentException();
+        }
+    }
+
+    public class Factory implements StreamingChannel.Factory
+    {
+        final InetSocketAddress from;
+        Factory(InetSocketAddress from)
+        {
+            this.from = from;
+        }
+
+        @Override
+        public StreamingChannel create(InetSocketAddress to, int messagingVersion, StreamingChannel.Kind kind)
+        {
+            long sendBufferSize = new OutboundConnectionSettings(getByAddress(to)).socketSendBufferSizeInBytes();
+            if (sendBufferSize <= 0)
+                sendBufferSize = 1 << 14;
+            
+            DirectConnection connection = new DirectConnection(messagingVersion, sendBufferSize, from, to);
+            IInvokableInstance instance = cluster.get(to);
+            instance.unsafeAcceptOnThisThread((channel, version) -> executorFactory().startThread(channel.description(), new StreamDeserializingTask(null, channel, version)),
+                         connection.get(from), messagingVersion);
+            return connection.get(to);
+        }
+    }
+
+    final ICluster<IInvokableInstance> cluster;
+    final int protocolVersion;
+
+    private DirectStreamingConnectionFactory(ICluster<IInvokableInstance> cluster)
+    {
+        this.cluster = cluster;
+        // we don't invoke this on the host ClassLoader as it initiates state like DatabaseDescriptor,
+        // potentially leading to resource leaks on the hosts (particularly in validateHeader which runs on the host threads)
+        this.protocolVersion = current_version;
+    }
+
+    public static Function<IInvokableInstance, StreamingChannel.Factory> create(ICluster<IInvokableInstance> cluster)
+    {
+        return cluster.get(1).unsafeApplyOnThisThread(c -> new DirectStreamingConnectionFactory(c)::get, cluster);
+    }
+
+    public static void setup(ICluster<IInvokableInstance> cluster)
+    {
+        Function<IInvokableInstance, StreamingChannel.Factory> streamingConnectionFactory = create(cluster);
+        cluster.stream().forEach(i -> i.unsafeAcceptOnThisThread(StreamingChannel.Factory.Global::unsafeSet, streamingConnectionFactory.apply(i)));
+    }
+
+    public Factory get(IInvokableInstance instance)
+    {
+        return new Factory(instance.config().broadcastAddress());
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java b/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java
index 0dfaa7e..6a892c4 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/DistributedTestSnitch.java
@@ -56,7 +56,7 @@
         InetSocketAddress m = cache.get(addressAndPort);
         if (m == null)
         {
-            m = NetworkTopology.addressAndPort(addressAndPort.address, addressAndPort.port);
+            m = NetworkTopology.addressAndPort(addressAndPort.getAddress(), addressAndPort.getPort());
             cache.put(addressAndPort, m);
         }
         return m;
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/FileLogAction.java b/test/distributed/org/apache/cassandra/distributed/impl/FileLogAction.java
index 0f48a23..db2dfaa 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/FileLogAction.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/FileLogAction.java
@@ -18,16 +18,15 @@
 
 package org.apache.cassandra.distributed.impl;
 
-import java.io.File;
-import java.io.FileNotFoundException;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.io.UncheckedIOException;
 import java.util.Objects;
 import java.util.function.Predicate;
 
 import com.google.common.io.Closeables;
 
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.utils.AbstractIterator;
 import org.apache.cassandra.distributed.api.LogAction;
 import org.apache.cassandra.distributed.api.LineIterator;
@@ -50,36 +49,21 @@
     @Override
     public LineIterator match(long startPosition, Predicate<String> fn)
     {
-        RandomAccessFile reader;
-        try
-        {
-            reader = new RandomAccessFile(file, "r");
-        }
-        catch (FileNotFoundException e)
-        {
-            // if file isn't present, don't return an empty stream as it looks the same as no log lines matched
-            throw new UncheckedIOException(e);
-        }
+        RandomAccessReader reader;
+        reader = RandomAccessReader.open(file);
         if (startPosition > 0) // -1 used to disable, so ignore any negative values or 0 (default offset)
         {
-            try
-            {
-                reader.seek(startPosition);
-            }
-            catch (IOException e)
-            {
-                throw new UncheckedIOException("Unable to seek to " + startPosition, e);
-            }
+            reader.seek(startPosition);
         }
         return new FileLineIterator(reader, fn);
     }
 
     private static final class FileLineIterator extends AbstractIterator<String> implements LineIterator
     {
-        private final RandomAccessFile reader;
+        private final RandomAccessReader reader;
         private final Predicate<String> fn;
 
-        private FileLineIterator(RandomAccessFile reader, Predicate<String> fn)
+        private FileLineIterator(RandomAccessReader reader, Predicate<String> fn)
         {
             this.reader = reader;
             this.fn = fn;
@@ -88,14 +72,7 @@
         @Override
         public long mark()
         {
-            try
-            {
-                return reader.getFilePointer();
-            }
-            catch (IOException e)
-            {
-                throw new UncheckedIOException(e);
-            }
+            return reader.getFilePointer();
         }
 
         @Override
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/INodeProvisionStrategy.java b/test/distributed/org/apache/cassandra/distributed/impl/INodeProvisionStrategy.java
index 32f82c0..1ec844e 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/INodeProvisionStrategy.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/INodeProvisionStrategy.java
@@ -18,9 +18,13 @@
 
 package org.apache.cassandra.distributed.impl;
 
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+
+@Shared(inner = INTERFACES)
 public interface INodeProvisionStrategy
 {
-
     public enum Strategy
     {
         OneNetworkInterface
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/Instance.java b/test/distributed/org/apache/cassandra/distributed/impl/Instance.java
index b8833dd..d4cb1cb 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/Instance.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/Instance.java
@@ -19,12 +19,12 @@
 package org.apache.cassandra.distributed.impl;
 
 import java.io.ByteArrayOutputStream;
-import java.io.Closeable;
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintStream;
+import java.net.BindException;
 import java.net.InetSocketAddress;
 import java.nio.ByteBuffer;
+import java.nio.file.FileSystem;
 import java.security.Permission;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -32,13 +32,13 @@
 import java.util.Map;
 import java.util.Objects;
 import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.stream.Stream;
 import javax.management.ListenerNotFoundException;
 import javax.management.Notification;
 import javax.management.NotificationListener;
@@ -49,9 +49,13 @@
 import org.slf4j.LoggerFactory;
 
 import io.netty.util.concurrent.GlobalEventExecutor;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.auth.AuthCache;
 import org.apache.cassandra.batchlog.Batch;
 import org.apache.cassandra.batchlog.BatchlogManager;
+import org.apache.cassandra.concurrent.ExecutorFactory;
 import org.apache.cassandra.concurrent.ExecutorLocals;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.concurrent.SharedExecutorPool;
 import org.apache.cassandra.concurrent.Stage;
@@ -64,13 +68,12 @@
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.Memtable;
 import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.db.SystemKeyspaceMigrator40;
+import org.apache.cassandra.db.SystemKeyspaceMigrator41;
 import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.db.compaction.CompactionLogger;
 import org.apache.cassandra.db.compaction.CompactionManager;
-import org.apache.cassandra.dht.IPartitioner;
-import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.db.memtable.AbstractAllocatorMemtable;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.Constants;
 import org.apache.cassandra.distributed.action.GossipHelper;
@@ -87,9 +90,8 @@
 import org.apache.cassandra.distributed.mock.nodetool.InternalNodeProbe;
 import org.apache.cassandra.distributed.mock.nodetool.InternalNodeProbeFactory;
 import org.apache.cassandra.distributed.shared.Metrics;
-import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.distributed.shared.ThrowingRunnable;
 import org.apache.cassandra.gms.Gossiper;
-import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.hints.DTestSerializer;
 import org.apache.cassandra.hints.HintsService;
 import org.apache.cassandra.index.SecondaryIndexManager;
@@ -99,9 +101,12 @@
 import org.apache.cassandra.io.util.DataInputBuffer;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.PathUtils;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry;
+import org.apache.cassandra.metrics.Sampler;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.NoPayload;
@@ -112,14 +117,21 @@
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.CassandraDaemon;
 import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.service.DefaultFSErrorHandler;
 import org.apache.cassandra.service.PendingRangeCalculatorService;
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.service.StorageServiceMBean;
+import org.apache.cassandra.service.paxos.PaxosRepair;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.service.paxos.uncommitted.UncommittedTableData;
+import org.apache.cassandra.service.reads.thresholds.CoordinatorWarnings;
+import org.apache.cassandra.service.snapshot.SnapshotManager;
+import org.apache.cassandra.streaming.StreamManager;
 import org.apache.cassandra.streaming.StreamReceiveTask;
 import org.apache.cassandra.streaming.StreamTransferTask;
-import org.apache.cassandra.streaming.async.StreamingInboundHandler;
+import org.apache.cassandra.streaming.async.NettyStreamingChannel;
 import org.apache.cassandra.tools.NodeTool;
 import org.apache.cassandra.tools.Output;
 import org.apache.cassandra.tools.SystemExitException;
@@ -127,24 +139,30 @@
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.transport.messages.ResultMessage;
 import org.apache.cassandra.utils.ByteArrayUtil;
+import org.apache.cassandra.utils.Closeable;
 import org.apache.cassandra.utils.DiagnosticSnapshotService;
 import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.Throwables;
-import org.apache.cassandra.utils.UUIDSerializer;
 import org.apache.cassandra.utils.concurrent.Ref;
 import org.apache.cassandra.utils.memory.BufferPools;
 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.distributed.api.Feature.BLANK_GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static org.apache.cassandra.distributed.impl.DistributedTestSnitch.fromCassandraInetAddressAndPort;
 import static org.apache.cassandra.distributed.impl.DistributedTestSnitch.toCassandraInetAddressAndPort;
 import static org.apache.cassandra.net.Verb.BATCH_STORE_REQ;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
+/**
+ * This class is instantiated on the relevant classloader, so its methods invoke the correct target classes automatically
+ */
 public class Instance extends IsolatedExecutor implements IInvokableInstance
 {
     private Logger inInstancelogger; // Defer creation until running in the instance context
@@ -153,12 +171,23 @@
     private volatile boolean internodeMessagingStarted = false;
     private final AtomicLong startedAt = new AtomicLong();
 
-    // should never be invoked directly, so that it is instantiated on other class loader;
-    // only visible for inheritance
+    @Deprecated
     Instance(IInstanceConfig config, ClassLoader classLoader)
     {
-        super("node" + config.num(), classLoader);
+        this(config, classLoader, null);
+    }
+
+    Instance(IInstanceConfig config, ClassLoader classLoader, FileSystem fileSystem)
+    {
+        this(config, classLoader, fileSystem, null);
+    }
+
+    Instance(IInstanceConfig config, ClassLoader classLoader, FileSystem fileSystem, ShutdownExecutor shutdownExecutor)
+    {
+        super("node" + config.num(), classLoader, executorFactory().pooled("isolatedExecutor", Integer.MAX_VALUE), shutdownExecutor);
         this.config = config;
+        if (fileSystem != null)
+            File.unsafeSetFilesystem(fileSystem);
         Object clusterId = Objects.requireNonNull(config.get(Constants.KEY_DTEST_API_CLUSTER_ID), "cluster_id is not defined");
         ClusterIDDefiner.setId("cluster-" + clusterId);
         InstanceIDDefiner.setInstanceId(config.num());
@@ -173,7 +202,7 @@
 
         // Enable streaming inbound handler tracking so they can be closed properly without leaking
         // the blocking IO thread.
-        StreamingInboundHandler.trackInboundHandlers();
+        NettyStreamingChannel.trackInboundHandlers();
     }
 
     @Override
@@ -191,7 +220,13 @@
         String suite = System.getProperty("suitename", "suitename_IS_UNDEFINED");
         String clusterId = ClusterIDDefiner.getId();
         String instanceId = InstanceIDDefiner.getInstanceId();
-        return new FileLogAction(new File(String.format("build/test/logs/%s/%s/%s/%s/system.log", tag, suite, clusterId, instanceId)));
+        File f = new File(String.format("build/test/logs/%s/%s/%s/%s/system.log", tag, suite, clusterId, instanceId));
+        // when creating a cluster globally in a test class we get the logs without the suite, try finding those logs:
+        if (!f.exists())
+            f = new File(String.format("build/test/logs/%s/%s/%s/system.log", tag, clusterId, instanceId));
+        if (!f.exists())
+            throw new AssertionError("Unable to locate system.log under " + new File("build/test/logs").absolutePath() + "; make sure ICluster.setup() is called or extend TestBaseImpl and do not define a static beforeClass function with @BeforeClass");
+        return new FileLogAction(f);
     }
 
     @Override
@@ -217,12 +252,34 @@
     @Override
     public SimpleQueryResult executeInternalWithResult(String query, Object... args)
     {
-        return sync(() -> {
+        return sync(() -> unsafeExecuteInternalWithResult(query, args)).call();
+    }
+
+    public static SimpleQueryResult unsafeExecuteInternalWithResult(String query, Object ... args)
+    {
+        ClientWarn.instance.captureWarnings();
+        CoordinatorWarnings.init();
+        try
+        {
             QueryHandler.Prepared prepared = QueryProcessor.prepareInternal(query);
             ResultMessage result = prepared.statement.executeLocally(QueryProcessor.internalQueryState(),
                                                                      QueryProcessor.makeInternalOptions(prepared.statement, args));
+            CoordinatorWarnings.done();
+
+            if (result != null)
+                result.setWarnings(ClientWarn.instance.getWarnings());
             return RowUtil.toQueryResult(result);
-        }).call();
+        }
+        catch (Exception | Error e)
+        {
+            CoordinatorWarnings.done();
+            throw e;
+        }
+        finally
+        {
+            CoordinatorWarnings.reset();
+            ClientWarn.instance.resetWarnings();
+        }
     }
 
     @Override
@@ -265,7 +322,7 @@
         }).run();
     }
 
-    private void registerMockMessaging(ICluster cluster)
+    private void registerMockMessaging(ICluster<?> cluster)
     {
         MessagingService.instance().outboundSink.add((message, to) -> {
             if (!internodeMessagingStarted)
@@ -274,17 +331,16 @@
                                        message, to);
                 return false;
             }
-            InetSocketAddress toAddr = fromCassandraInetAddressAndPort(to);
-            IInstance toInstance = cluster.get(toAddr);
-            if (toInstance != null)
-                toInstance.receiveMessage(serializeMessage(message.from(), to, message));
+            cluster.deliverMessage(to, serializeMessage(message.from(), to, message));
             return false;
         });
     }
 
-    private void registerInboundFilter(ICluster cluster)
+    private void registerInboundFilter(ICluster<?> cluster)
     {
         MessagingService.instance().inboundSink.add(message -> {
+            if (!cluster.filters().hasInbound())
+                return true;
             if (isShutdown())
                 return false;
             IMessage serialized = serializeMessage(message.from(), toCassandraInetAddressAndPort(broadcastAddress()), message);
@@ -301,12 +357,12 @@
     {
         MessagingService.instance().outboundSink.add((message, to) -> {
             if (isShutdown())
-                return false;
+                return false; // TODO: Simulator needs this to trigger a failure
             IMessage serialzied = serializeMessage(message.from(), to, message);
             int fromNum = config.num(); // since this instance is sending the message, from will always be this instance
             IInstance toInstance = cluster.get(fromCassandraInetAddressAndPort(to));
             if (toInstance == null)
-                return false;
+                return false; // TODO: Simulator needs this to trigger a failure
             int toNum = toInstance.config().num();
             return cluster.filters().permitOutbound(fromNum, toNum, serialzied);
         });
@@ -314,10 +370,10 @@
 
     public void uncaughtException(Thread thread, Throwable throwable)
     {
-        sync(CassandraDaemon::uncaughtException).accept(thread, throwable);
+        sync(JVMStabilityInspector::uncaughtException).accept(thread, throwable);
     }
 
-    private static IMessage serializeMessage(InetAddressAndPort from, InetAddressAndPort to, Message<?> messageOut)
+    public static IMessage serializeMessage(InetAddressAndPort from, InetAddressAndPort to, Message<?> messageOut)
     {
         int fromVersion = MessagingService.instance().versions.get(from);
         int toVersion = MessagingService.instance().versions.get(to);
@@ -331,6 +387,7 @@
                                    ByteArrayUtil.EMPTY_BYTE_ARRAY,
                                    messageOut.id(),
                                    toVersion,
+                                   messageOut.expiresAtNanos(),
                                    fromCassandraInetAddressAndPort(from));
         }
 
@@ -353,7 +410,7 @@
                     {
                         reserialize(batch, out, toVersion);
                         byte[] bytes = out.toByteArray();
-                        return new MessageImpl(messageOut.verb().id, bytes, messageOut.id(), toVersion, fromCassandraInetAddressAndPort(from));
+                        return new MessageImpl(messageOut.verb().id, bytes, messageOut.id(), toVersion, messageOut.expiresAtNanos(), fromCassandraInetAddressAndPort(from));
                     }
                 }
             }
@@ -364,7 +421,7 @@
                 throw new AssertionError(String.format("Message serializedSize(%s) does not match what was written with serialize(out, %s) for verb %s and serializer %s; " +
                                                        "expected %s, actual %s", toVersion, toVersion, messageOut.verb(), Message.serializer.getClass(),
                                                        messageOut.serializedSize(toVersion), bytes.length));
-            return new MessageImpl(messageOut.verb().id, bytes, messageOut.id(), toVersion, fromCassandraInetAddressAndPort(from));
+            return new MessageImpl(messageOut.verb().id, bytes, messageOut.id(), toVersion, messageOut.expiresAtNanos(), fromCassandraInetAddressAndPort(from));
         }
         catch (IOException e)
         {
@@ -381,7 +438,7 @@
     {
         assert !batch.isLocal() : "attempted to reserialize a 'local' batch";
 
-        UUIDSerializer.serializer.serialize(batch.id, out, version);
+        batch.id.serialize(out);
         out.writeLong(batch.creationTime);
 
         out.writeUnsignedVInt(batch.getEncodedMutations().size());
@@ -408,32 +465,52 @@
     @Override
     public void receiveMessage(IMessage message)
     {
-        sync(() -> receiveMessageWithInvokingThread(message)).run();
+        sync(receiveMessageRunnable(message)).accept(false);
     }
 
     @Override
     public void receiveMessageWithInvokingThread(IMessage message)
     {
-        if (!internodeMessagingStarted)
-        {
-            inInstancelogger.debug("Dropping inbound message {} to {} as internode messaging has not been started yet",
-                                   message, config().broadcastAddress());
-            return;
-        }
-        if (message.version() > MessagingService.current_version)
-        {
-            throw new IllegalStateException(String.format("Node%d received message version %d but current version is %d",
-                                                          this.config.num(),
-                                                          message.version(),
-                                                          MessagingService.current_version));
-        }
+        if (classLoader != Thread.currentThread().getContextClassLoader())
+            throw new IllegalStateException("Must be invoked by a Thread utilising the node's class loader");
+        receiveMessageRunnable(message).accept(true);
+    }
 
-        Message<?> messageIn = deserializeMessage(message);
-        Message.Header header = messageIn.header;
-        TraceState state = Tracing.instance.initializeFromMessage(header);
-        if (state != null) state.trace("{} message received from {}", header.verb, header.from);
-        header.verb.stage.execute(() -> MessagingService.instance().inboundSink.accept(messageIn),
-                                  ExecutorLocals.create(state));
+    private SerializableConsumer<Boolean> receiveMessageRunnable(IMessage message)
+    {
+        return runOnCaller -> {
+            if (!internodeMessagingStarted)
+            {
+                inInstancelogger.debug("Dropping inbound message {} to {} as internode messaging has not been started yet",
+                             message, config().broadcastAddress());
+                return;
+            }
+            if (message.version() > MessagingService.current_version)
+            {
+                throw new IllegalStateException(String.format("Node%d received message version %d but current version is %d",
+                                                              this.config.num(),
+                                                              message.version(),
+                                                              MessagingService.current_version));
+            }
+
+            Message<?> messageIn = deserializeMessage(message);
+            Message.Header header = messageIn.header;
+            TraceState state = Tracing.instance.initializeFromMessage(header);
+            if (state != null)
+                state.trace("{} message received from {}", header.verb, header.from);
+
+            if (runOnCaller)
+            {
+                try (Closeable close = ExecutorLocals.create(state))
+                {
+                    MessagingService.instance().inboundSink.accept(messageIn);
+                }
+            }
+            else
+            {
+                header.verb.stage.executor().execute(ExecutorLocals.create(state), () -> MessagingService.instance().inboundSink.accept(messageIn));
+            }
+        };
     }
 
     public int getMessagingVersion()
@@ -451,43 +528,53 @@
             MessagingService.instance().versions.set(toCassandraInetAddressAndPort(endpoint), version);
         else
             inInstancelogger.warn("Skipped setting messaging version for {} to {} as daemon not initialized yet. Stacktrace attached for debugging.",
-                                  endpoint, version, new RuntimeException());
+                        endpoint, version, new RuntimeException());
     }
 
     @Override
     public String getReleaseVersionString()
     {
-        return callsOnInstance(() -> FBUtilities.getReleaseVersionString()).call();
+        return FBUtilities.getReleaseVersionString();
     }
 
     public void flush(String keyspace)
     {
-        runOnInstance(() -> FBUtilities.waitOnFutures(Keyspace.open(keyspace).flush()));
+        Util.flushKeyspace(keyspace);
     }
 
     public void forceCompact(String keyspace, String table)
     {
-        runOnInstance(() -> {
-            try
-            {
-                Keyspace.open(keyspace).getColumnFamilyStore(table).forceMajorCompaction();
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException(e);
-            }
-        });
+        try
+        {
+            Keyspace.open(keyspace).getColumnFamilyStore(table).forceMajorCompaction();
+        }
+        catch (Exception e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public ExecutorPlus executorFor(int verbId)
+    {
+        return Verb.fromId(verbId).stage.executor();
     }
 
     @Override
     public void startup(ICluster cluster)
     {
+        // Defer initialisation of Clock.Global until cluster/instance identifiers are set.
+        // Otherwise, the instance classloader's logging classes are setup ahead of time and
+        // the patterns/file paths are not set correctly. This will be addressed in a subsequent
+        // commit to extend the functionality of the @Shared annotation to app classes.
         assert startedAt.compareAndSet(0L, System.nanoTime()) : "startedAt uninitialized";
 
         sync(() -> {
             inInstancelogger = LoggerFactory.getLogger(Instance.class);
             try
             {
+                // org.apache.cassandra.distributed.impl.AbstractCluster.startup sets the exception handler for the thread
+                // so extract it to populate ExecutorFactory.Global
+                ExecutorFactory.Global.tryUnsafeSet(new ExecutorFactory.Default(Thread.currentThread().getContextClassLoader(), null, Thread.getDefaultUncaughtExceptionHandler()));
                 if (config.has(GOSSIP))
                 {
                     // TODO: hacky
@@ -513,7 +600,7 @@
                 // We need to persist this as soon as possible after startup checks.
                 // This should be the first write to SystemKeyspace (CASSANDRA-11742)
                 SystemKeyspace.persistLocalMetadata(config::hostId);
-                SystemKeyspaceMigrator40.migrate();
+                SystemKeyspaceMigrator41.migrate();
 
                 // Same order to populate tokenMetadata for the first time,
                 // see org.apache.cassandra.service.CassandraDaemon.setup
@@ -547,6 +634,15 @@
                 // Re-populate token metadata after commit log recover (new peers might be loaded onto system keyspace #10293)
                 StorageService.instance.populateTokenMetadata();
 
+                try
+                {
+                    PaxosState.maybeRebuildUncommittedState();
+                }
+                catch (IOException e)
+                {
+                    throw new RuntimeException(e);
+                }
+
                 Verb.HINT_REQ.unsafeSetSerializer(DTestSerializer::new);
 
                 if (config.has(NETWORK))
@@ -567,38 +663,51 @@
                     propagateMessagingVersions(cluster); // fake messaging needs to know messaging version for filters
                 }
                 internodeMessagingStarted = true;
-
-                JVMStabilityInspector.replaceKiller(new InstanceKiller());
+                JVMStabilityInspector.replaceKiller(new InstanceKiller(Instance.this::shutdown));
 
                 // TODO: this is more than just gossip
                 StorageService.instance.registerDaemon(CassandraDaemon.getInstanceForTesting());
                 if (config.has(GOSSIP))
                 {
-                    MigrationCoordinator.setUptimeFn(() -> TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startedAt.get()));
-                    StorageService.instance.initServer();
+                    MigrationCoordinator.setUptimeFn(() -> TimeUnit.NANOSECONDS.toMillis(nanoTime() - startedAt.get()));
+                    try
+                    {
+                        StorageService.instance.initServer();
+                    }
+                    catch (Exception e)
+                    {
+                        // I am tired of looking up my notes for how to fix this... so why not tell the user?
+                        Throwable cause = com.google.common.base.Throwables.getRootCause(e);
+                        if (cause instanceof BindException && "Can't assign requested address".equals(cause.getMessage()))
+                            throw new RuntimeException("Unable to bind, run the following in a termanl and try again:\nfor subnet in $(seq 0 5); do for id in $(seq 0 5); do sudo ifconfig lo0 alias \"127.0.$subnet.$id\"; done; done;", e);
+                        throw e;
+                    }
                     StorageService.instance.removeShutdownHook();
+
                     Gossiper.waitToSettle();
                 }
                 else
                 {
-                    cluster.stream().forEach(peer -> {
-                        if (cluster instanceof Cluster)
-                            GossipHelper.statusToNormal((IInvokableInstance) peer).accept(this);
-                        else
-                            GossipHelper.unsafeStatusToNormal(this, (IInstance) peer);
-                    });
+                    Schema.instance.startSync();
+                    Stream peers = cluster.stream().filter(instance -> ((IInstance) instance).isValid());
+                    SystemKeyspace.setLocalHostId(config.hostId());
+                    if (config.has(BLANK_GOSSIP))
+                        peers.forEach(peer -> GossipHelper.statusToBlank((IInvokableInstance) peer).accept(this));
+                    else if (cluster instanceof Cluster)
+                        peers.forEach(peer -> GossipHelper.statusToNormal((IInvokableInstance) peer).accept(this));
+                    else
+                        peers.forEach(peer -> GossipHelper.unsafeStatusToNormal(this, (IInstance) peer));
 
                     StorageService.instance.setUpDistributedSystemKeyspaces();
                     StorageService.instance.setNormalModeUnsafe();
+                    Gossiper.instance.register(StorageService.instance);
+                    StorageService.instance.startSnapshotManager();
                 }
 
                 // Populate tokenMetadata for the second time,
                 // see org.apache.cassandra.service.CassandraDaemon.setup
                 StorageService.instance.populateTokenMetadata();
 
-                SystemKeyspace.finishStartup();
-
-                StorageService.instance.doAuthSetup(false);
                 CassandraDaemon.getInstanceForTesting().completeSetup();
 
                 if (config.has(NATIVE_PROTOCOL))
@@ -607,11 +716,16 @@
                     CassandraDaemon.getInstanceForTesting().start();
                 }
 
-                if (!FBUtilities.getBroadcastAddressAndPort().address.equals(broadcastAddress().getAddress()) ||
-                    FBUtilities.getBroadcastAddressAndPort().port != broadcastAddress().getPort())
+                if (!FBUtilities.getBroadcastAddressAndPort().getAddress().equals(broadcastAddress().getAddress()) ||
+                    FBUtilities.getBroadcastAddressAndPort().getPort() != broadcastAddress().getPort())
                     throw new IllegalStateException(String.format("%s != %s", FBUtilities.getBroadcastAddressAndPort(), broadcastAddress()));
 
                 ActiveRepairService.instance.start();
+                StreamManager.instance.start();
+
+                PaxosState.startAutoRepairs();
+
+                CassandraDaemon.getInstanceForTesting().completeSetup();
             }
             catch (Throwable t)
             {
@@ -651,101 +765,30 @@
         });
     }
 
+    @Override
+    public void postStartup()
+    {
+        StorageService.instance.doAuthSetup(false);
+    }
+
     private void mkdirs()
     {
-        new File(config.getString("saved_caches_directory")).mkdirs();
-        new File(config.getString("hints_directory")).mkdirs();
-        new File(config.getString("commitlog_directory")).mkdirs();
+        new File(config.getString("saved_caches_directory")).tryCreateDirectories();
+        new File(config.getString("hints_directory")).tryCreateDirectories();
+        new File(config.getString("commitlog_directory")).tryCreateDirectories();
         for (String dir : (String[]) config.get("data_file_directories"))
-            new File(dir).mkdirs();
+            new File(dir).tryCreateDirectories();
     }
 
     private Config loadConfig(IInstanceConfig overrides)
     {
-        Map<String,Object> params = overrides.getParams();
+        Map<String, Object> params = overrides.getParams();
         boolean check = true;
         if (overrides.get(Constants.KEY_DTEST_API_CONFIG_CHECK) != null)
             check = (boolean) overrides.get(Constants.KEY_DTEST_API_CONFIG_CHECK);
         return YamlConfigurationLoader.fromMap(params, check, Config.class);
     }
 
-    public static void addToRing(boolean bootstrapping, IInstance peer)
-    {
-        try
-        {
-            IInstanceConfig config = peer.config();
-            IPartitioner partitioner = FBUtilities.newPartitioner(config.getString("partitioner"));
-            Token token = partitioner.getTokenFactory().fromString(config.getString("initial_token"));
-            InetAddressAndPort addressAndPort = toCassandraInetAddressAndPort(peer.broadcastAddress());
-
-            UUID hostId = config.hostId();
-            Gossiper.runInGossipStageBlocking(() -> {
-                Gossiper.instance.initializeNodeUnsafe(addressAndPort, hostId, 1);
-                Gossiper.instance.injectApplicationState(addressAndPort,
-                                                         ApplicationState.TOKENS,
-                                                         new VersionedValue.VersionedValueFactory(partitioner).tokens(Collections.singleton(token)));
-                StorageService.instance.onChange(addressAndPort,
-                                                 ApplicationState.STATUS,
-                                                 bootstrapping
-                                                 ? new VersionedValue.VersionedValueFactory(partitioner).bootstrapping(Collections.singleton(token))
-                                                 : new VersionedValue.VersionedValueFactory(partitioner).normal(Collections.singleton(token)));
-                Gossiper.instance.realMarkAlive(addressAndPort, Gossiper.instance.getEndpointStateForEndpoint(addressAndPort));
-            });
-            int messagingVersion = peer.isShutdown()
-                    ? MessagingService.current_version
-                    : Math.min(MessagingService.current_version, peer.getMessagingVersion());
-            MessagingService.instance().versions.set(addressAndPort, messagingVersion);
-
-            assert bootstrapping || StorageService.instance.getTokenMetadata().isMember(addressAndPort);
-            PendingRangeCalculatorService.instance.blockUntilFinished();
-        }
-        catch (Throwable e) // UnknownHostException
-        {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static void removeFromRing(IInstance peer)
-    {
-        try
-        {
-            IInstanceConfig config = peer.config();
-            IPartitioner partitioner = FBUtilities.newPartitioner(config.getString("partitioner"));
-            Token token = partitioner.getTokenFactory().fromString(config.getString("initial_token"));
-            InetAddressAndPort addressAndPort = toCassandraInetAddressAndPort(peer.broadcastAddress());
-
-            Gossiper.runInGossipStageBlocking(() -> {
-                StorageService.instance.onChange(addressAndPort,
-                        ApplicationState.STATUS,
-                        new VersionedValue.VersionedValueFactory(partitioner).left(Collections.singleton(token), 0L));
-            });
-        }
-        catch (Throwable e) // UnknownHostException
-        {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public static void addToRingNormal(IInstance peer)
-    {
-        addToRing(false, peer);
-        assert StorageService.instance.getTokenMetadata().isMember(toCassandraInetAddressAndPort(peer.broadcastAddress()));
-    }
-
-    public static void addToRingBootstrapping(IInstance peer)
-    {
-        addToRing(true, peer);
-    }
-
-    private static void initializeRing(ICluster cluster)
-    {
-        for (int i = 1 ; i <= cluster.size() ; ++i)
-            addToRing(false, cluster.get(i));
-
-        for (int i = 1; i <= cluster.size(); ++i)
-            assert StorageService.instance.getTokenMetadata().isMember(toCassandraInetAddressAndPort(cluster.get(i).broadcastAddress()));
-    }
-
     public Future<Void> shutdown()
     {
         return shutdown(true);
@@ -754,9 +797,7 @@
     @Override
     public Future<Void> shutdown(boolean graceful)
     {
-        if (!graceful)
-            MessagingService.instance().shutdown(1L, MINUTES, false, true);
-
+        inInstancelogger.info("Shutting down instance {} / {}", config.num(), config.broadcastAddress().getHostString());
         Future<?> future = async((ExecutorService executor) -> {
             Throwable error = null;
 
@@ -776,34 +817,54 @@
                 Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
             }
 
+            // trigger init early or else it could try to init and touch a thread pool that got shutdown
+            HintsService hints = HintsService.instance;
+            ThrowingRunnable shutdownHints = () -> {
+                // this is to allow shutdown in the case hints were halted already
+                try
+                {
+                    HintsService.instance.shutdownBlocking();
+                }
+                catch (IllegalStateException e)
+                {
+                    if (!"HintsService has already been shut down".equals(e.getMessage()))
+                        throw e;
+                }
+            };
             error = parallelRun(error, executor,
                                 () -> Gossiper.instance.stopShutdownAndWait(1L, MINUTES),
                                 CompactionManager.instance::forceShutdown,
                                 () -> BatchlogManager.instance.shutdownAndWait(1L, MINUTES),
-                                HintsService.instance::shutdownBlocking,
-                                StreamingInboundHandler::shutdown,
+                                shutdownHints,
+                                () -> CompactionLogger.shutdownNowAndWait(1L, MINUTES),
+                                () -> AuthCache.shutdownAllAndWait(1L, MINUTES),
+                                () -> Sampler.shutdownNowAndWait(1L, MINUTES),
+                                NettyStreamingChannel::shutdown,
                                 () -> StreamReceiveTask.shutdownAndWait(1L, MINUTES),
                                 () -> StreamTransferTask.shutdownAndWait(1L, MINUTES),
+                                () -> StreamManager.instance.stop(),
                                 () -> SecondaryIndexManager.shutdownAndWait(1L, MINUTES),
                                 () -> IndexSummaryManager.instance.shutdownAndWait(1L, MINUTES),
                                 () -> ColumnFamilyStore.shutdownExecutorsAndWait(1L, MINUTES),
-                                () -> PendingRangeCalculatorService.instance.shutdownAndWait(1L, MINUTES),
                                 () -> BufferPools.shutdownLocalCleaner(1L, MINUTES),
+                                () -> PaxosRepair.shutdownAndWait(1L, MINUTES),
                                 () -> Ref.shutdownReferenceReaper(1L, MINUTES),
-                                () -> Memtable.MEMORY_POOL.shutdownAndWait(1L, MINUTES),
+                                () -> UncommittedTableData.shutdownAndWait(1L, MINUTES),
+                                () -> AbstractAllocatorMemtable.MEMORY_POOL.shutdownAndWait(1L, MINUTES),
                                 () -> DiagnosticSnapshotService.instance.shutdownAndWait(1L, MINUTES),
                                 () -> SSTableReader.shutdownBlocking(1L, MINUTES),
-                                () -> shutdownAndWait(Collections.singletonList(ActiveRepairService.repairCommandExecutor()))
+                                () -> shutdownAndWait(Collections.singletonList(ActiveRepairService.repairCommandExecutor())),
+                                () -> ActiveRepairService.instance.shutdownNowAndWait(1L, MINUTES),
+                                () -> SnapshotManager.shutdownAndWait(1L, MINUTES)
             );
 
             internodeMessagingStarted = false;
             error = parallelRun(error, executor,
                                 // can only shutdown message once, so if the test shutsdown an instance, then ignore the failure
-                                (IgnoreThrowingRunnable) () -> MessagingService.instance().shutdown(1L, MINUTES, false, true)
+                                (IgnoreThrowingRunnable) () -> MessagingService.instance().shutdown(1L, MINUTES, false, config.has(NETWORK))
             );
-
             error = parallelRun(error, executor,
-                                () -> GlobalEventExecutor.INSTANCE.awaitInactivity(1L, MINUTES),
+                                () -> { if (config.has(NETWORK)) { try { GlobalEventExecutor.INSTANCE.awaitInactivity(1L, MINUTES); } catch (IllegalStateException ignore) {} } },
                                 () -> Stage.shutdownAndWait(1L, MINUTES),
                                 () -> SharedExecutorPool.SHARED.shutdownAndWait(1L, MINUTES)
             );
@@ -811,17 +872,40 @@
             // CommitLog must shut down after Stage, or threads from the latter may attempt to use the former.
             // (ex. A Mutation stage thread may attempt to add a mutation to the CommitLog.)
             error = parallelRun(error, executor, CommitLog.instance::shutdownBlocking);
-            error = parallelRun(error, executor, () -> shutdownAndWait(Collections.singletonList(JMXBroadcastExecutor.executor)));
-            
+            error = parallelRun(error, executor,
+                                () -> PendingRangeCalculatorService.instance.shutdownAndWait(1L, MINUTES),
+                                () -> shutdownAndWait(Collections.singletonList(JMXBroadcastExecutor.executor))
+            );
+
             // ScheduledExecutors shuts down after MessagingService, as MessagingService may issue tasks to it.
-            error = parallelRun(error, executor, () -> ScheduledExecutors.shutdownAndWait(1L, MINUTES));
+            error = parallelRun(error, executor, () -> ScheduledExecutors.shutdownNowAndWait(1L, MINUTES));
+
+            // Make sure any shutdown hooks registered for DeleteOnExit are released to prevent
+            // references to the instance class loaders from being held
+            if (graceful)
+            {
+                PathUtils.runOnExitThreadsAndClear();
+            }
+            else
+            {
+                PathUtils.clearOnExitThreads();
+            }
 
             Throwables.maybeFail(error);
         }).apply(isolatedExecutor);
 
-        return CompletableFuture.runAsync(ThrowingRunnable.toRunnable(future::get), isolatedExecutor)
-                                .thenRun(super::shutdown)
-                                .thenRun(() -> startedAt.set(0L));
+        return isolatedExecutor.submit(() -> {
+            try
+            {
+                future.get();
+                return null;
+            }
+            finally
+            {
+                super.shutdown();
+                startedAt.set(0L);
+            }
+        });
     }
 
     @Override
@@ -840,7 +924,7 @@
     @Override
     public Metrics metrics()
     {
-        return callOnInstance(() -> new InstanceMetrics(CassandraMetricsRegistry.Metrics));
+        return new InstanceMetrics(CassandraMetricsRegistry.Metrics);
     }
 
     @Override
@@ -1006,8 +1090,7 @@
 
     private static void shutdownAndWait(List<ExecutorService> executors) throws TimeoutException, InterruptedException
     {
-        ExecutorUtils.shutdownNow(executors);
-        ExecutorUtils.awaitTermination(1L, MINUTES, executors);
+        ExecutorUtils.shutdownNowAndWait(1L, MINUTES, executors);
     }
 
     private static Throwable parallelRun(Throwable accumulate, ExecutorService runOn, ThrowingRunnable ... runnables)
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java b/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java
index 037c221..92c56d6 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/InstanceConfig.java
@@ -18,34 +18,28 @@
 
 package org.apache.cassandra.distributed.impl;
 
-import java.io.File;
 import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
+import java.nio.file.Path;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Map;
 import java.util.TreeMap;
 import java.util.UUID;
 import java.util.function.Function;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
+import java.util.stream.Collectors;
 
 import com.vdurmont.semver4j.Semver;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.IInstanceConfig;
 import org.apache.cassandra.distributed.shared.NetworkTopology;
-import org.apache.cassandra.distributed.shared.Shared;
 import org.apache.cassandra.distributed.upgrade.UpgradeTestBase;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.SimpleSeedProvider;
 
-@Shared
 public class InstanceConfig implements IInstanceConfig
 {
-    private static final Object NULL = new Object();
-    private static final Logger logger = LoggerFactory.getLogger(InstanceConfig.class);
-
     public final int num;
     public int num() { return num; }
 
@@ -75,14 +69,16 @@
                            String commitlog_directory,
                            String hints_directory,
                            String cdc_raw_directory,
-                           String initial_token,
+                           Collection<String> initial_token,
                            int storage_port,
                            int native_transport_port)
     {
         this.num = num;
         this.networkTopology = networkTopology;
-        this.hostId = java.util.UUID.randomUUID();
-        this    .set("num_tokens", 1)
+        this.hostId = new UUID(0x4000L, (1L << 63) | num); // deterministic hostId for simulator
+        //TODO move away from magic strings in favor of constants
+        this    .set("num_tokens", initial_token.size())
+                .set("initial_token", initial_token.stream().collect(Collectors.joining(",")))
                 .set("broadcast_address", broadcast_address)
                 .set("listen_address", listen_address)
                 .set("broadcast_rpc_address", broadcast_rpc_address)
@@ -92,7 +88,6 @@
                 .set("commitlog_directory", commitlog_directory)
                 .set("hints_directory", hints_directory)
                 .set("cdc_raw_directory", cdc_raw_directory)
-                .set("initial_token", initial_token)
                 .set("partitioner", "org.apache.cassandra.dht.Murmur3Partitioner")
                 .set("start_native_transport", true)
                 .set("concurrent_writes", 2)
@@ -101,7 +96,7 @@
                 .set("concurrent_reads", 2)
                 .set("memtable_flush_writers", 1)
                 .set("concurrent_compactors", 1)
-                .set("memtable_heap_space_in_mb", 10)
+                .set("memtable_heap_space", "10MiB")
                 .set("commitlog_sync", "batch")
                 .set("storage_port", storage_port)
                 .set("native_transport_port", native_transport_port)
@@ -112,11 +107,11 @@
                 .set("diagnostic_events_enabled", true)
                 .set("auto_bootstrap", false)
                 // capacities that are based on `totalMemory` that should be fixed size
-                .set("index_summary_capacity_in_mb", 50l)
-                .set("counter_cache_size_in_mb", 50l)
-                .set("key_cache_size_in_mb", 50l)
+                .set("index_summary_capacity", "50MiB")
+                .set("counter_cache_size", "50MiB")
+                .set("key_cache_size", "50MiB")
                 // legacy parameters
-                .forceSet("commitlog_sync_batch_window_in_ms", 1.0);
+                .forceSet("commitlog_sync_batch_window_in_ms", "1");
         this.featureFlags = EnumSet.noneOf(Feature.class);
     }
 
@@ -131,7 +126,6 @@
         this.broadcastAddressAndPort = copy.broadcastAddressAndPort;
     }
 
-
     @Override
     public InetSocketAddress broadcastAddress()
     {
@@ -194,18 +188,18 @@
 
     public InstanceConfig set(String fieldName, Object value)
     {
-        if (value == null)
-            value = NULL;
         getParams(fieldName).put(fieldName, value);
         return this;
     }
 
+    public InstanceConfig remove(String fieldName)
+    {
+        getParams(fieldName).remove(fieldName);
+        return this;
+    }
+
     public InstanceConfig forceSet(String fieldName, Object value)
     {
-        if (value == null)
-            value = NULL;
-
-        // test value
         getParams(fieldName).put(fieldName, value);
         return this;
     }
@@ -223,10 +217,12 @@
         throw new IllegalStateException("In-JVM dtests no longer support propagate");
     }
 
+    @Override
     public void validate()
     {
-        if (((int) get("num_tokens")) > 1)
-            throw new IllegalArgumentException("In-JVM dtests do not support vnodes as of now.");
+        // Previous logic would validate vnode was not used, but with vnode support added that validation isn't needed.
+        // Rather than attempting validating the configs here, its best to leave that to the instance; this method
+        // is no longer really needed, but can not be removed due to backwards compatability.
     }
 
     public Object get(String name)
@@ -252,8 +248,8 @@
     public static InstanceConfig generate(int nodeNum,
                                           INodeProvisionStrategy provisionStrategy,
                                           NetworkTopology networkTopology,
-                                          File root,
-                                          String token,
+                                          Path root,
+                                          Collection<String> tokens,
                                           int datadirCount)
     {
         return new InstanceConfig(nodeNum,
@@ -269,14 +265,14 @@
                                   String.format("%s/node%d/commitlog", root, nodeNum),
                                   String.format("%s/node%d/hints", root, nodeNum),
                                   String.format("%s/node%d/cdc", root, nodeNum),
-                                  token,
+                                  tokens,
                                   provisionStrategy.storagePort(nodeNum),
                                   provisionStrategy.nativeTransportPort(nodeNum));
     }
 
-    private static String[] datadirs(int datadirCount, File root, int nodeNum)
+    private static String[] datadirs(int datadirCount, Path root, int nodeNum)
     {
-        String datadirFormat = String.format("%s/node%d/data%%d", root.getPath(), nodeNum);
+        String datadirFormat = String.format("%s/node%d/data%%d", root, nodeNum);
         String [] datadirs = new String[datadirCount];
         for (int i = 0; i < datadirs.length; i++)
             datadirs[i] = String.format(datadirFormat, i);
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/InstanceKiller.java b/test/distributed/org/apache/cassandra/distributed/impl/InstanceKiller.java
index e7ca49b..38b045b 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/InstanceKiller.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/InstanceKiller.java
@@ -19,6 +19,7 @@
 package org.apache.cassandra.distributed.impl;
 
 import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
 
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
@@ -26,6 +27,13 @@
 {
     private static final AtomicLong KILL_ATTEMPTS = new AtomicLong(0);
 
+    private final Consumer<Boolean> onKill;
+
+    public InstanceKiller(Consumer<Boolean> onKill)
+    {
+        this.onKill = onKill != null ? onKill : ignore -> {};
+    }
+
     public static long getKillAttempts()
     {
         return KILL_ATTEMPTS.get();
@@ -40,6 +48,7 @@
     protected void killCurrentJVM(Throwable t, boolean quiet)
     {
         KILL_ATTEMPTS.incrementAndGet();
+        onKill.accept(quiet);
         // the bad part is that System.exit kills the JVM, so all code which calls kill won't hit the
         // next line; yet in in-JVM dtests System.exit is not desirable, so need to rely on a runtime exception
         // as a means to try to stop execution
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/InstanceMetrics.java b/test/distributed/org/apache/cassandra/distributed/impl/InstanceMetrics.java
index 939691d..7bedce1 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/InstanceMetrics.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/InstanceMetrics.java
@@ -24,10 +24,11 @@
 import java.util.Map;
 import java.util.function.Predicate;
 
-import com.codahale.metrics.Counter;
+import com.codahale.metrics.Counting;
 import com.codahale.metrics.Gauge;
 import com.codahale.metrics.Histogram;
 import com.codahale.metrics.Meter;
+import com.codahale.metrics.Metric;
 import com.codahale.metrics.Snapshot;
 import com.codahale.metrics.Timer;
 import org.apache.cassandra.distributed.shared.Metrics;
@@ -45,33 +46,43 @@
         this.metricsRegistry = metricsRegistry;
     }
 
+    @Override
     public List<String> getNames()
     {
         return new ArrayList<>(metricsRegistry.getNames());
     }
 
+    @Override
     public long getCounter(String name)
     {
-        return metricsRegistry.getCounters().get(name).getCount();
+        Metric metric = metricsRegistry.getMetrics().get(name);
+        if (metric instanceof Counting)
+            return ((Counting) metric).getCount();
+        // If the metric is not found or does not expose a getCount method
+        return 0;
     }
 
+    @Override
     public Map<String, Long> getCounters(Predicate<String> filter)
     {
         Map<String, Long> values = new HashMap<>();
-        for (Map.Entry<String, Counter> e : metricsRegistry.getCounters().entrySet())
+        for (Map.Entry<String, Metric> e : metricsRegistry.getMetrics().entrySet())
         {
-            if (filter.test(e.getKey()))
-                values.put(e.getKey(), e.getValue().getCount());
+            Metric metric = e.getValue();
+            if (metric instanceof Counting && filter.test(e.getKey()))
+                values.put(e.getKey(), ((Counting) metric).getCount());
         }
         return values;
     }
 
+    @Override
     public double getHistogram(String name, MetricValue value)
     {
         Histogram histogram = metricsRegistry.getHistograms().get(name);
         return getValue(histogram, value);
     }
 
+    @Override
     public Map<String, Double> getHistograms(Predicate<String> filter, MetricValue value)
     {
         Map<String, Double> values = new HashMap<>();
@@ -83,11 +94,13 @@
         return values;
     }
 
+    @Override
     public Object getGauge(String name)
     {
         return metricsRegistry.getGauges().get(name).getValue();
     }
 
+    @Override
     public Map<String, Object> getGauges(Predicate<String> filter)
     {
         Map<String, Object> values = new HashMap<>();
@@ -99,11 +112,13 @@
         return values;
     }
 
+    @Override
     public double getMeter(String name, Rate value)
     {
         return getRate(metricsRegistry.getMeters().get(name), value);
     }
 
+    @Override
     public Map<String, Double> getMeters(Predicate<String> filter, Rate rate)
     {
         Map<String, Double> values = new HashMap<>();
@@ -115,11 +130,13 @@
         return values;
     }
 
+    @Override
     public double getTimer(String name, MetricValue value)
     {
         return getValue(metricsRegistry.getTimers().get(name).getSnapshot(), value);
     }
 
+    @Override
     public Map<String, Double> getTimers(Predicate<String> filter, MetricValue value)
     {
         Map<String, Double> values = new HashMap<>();
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/IsolatedExecutor.java b/test/distributed/org/apache/cassandra/distributed/impl/IsolatedExecutor.java
index dd52b5d..68ff1e7 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/IsolatedExecutor.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/IsolatedExecutor.java
@@ -28,8 +28,8 @@
 import java.lang.reflect.Method;
 import java.net.URLClassLoader;
 import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadFactory;
@@ -44,61 +44,102 @@
 import org.slf4j.LoggerFactory;
 
 import ch.qos.logback.classic.LoggerContext;
-import org.apache.cassandra.concurrent.NamedThreadFactory;
+import io.netty.util.concurrent.FastThreadLocal;
+import org.apache.cassandra.concurrent.ExecutorFactory;
 import org.apache.cassandra.distributed.api.IIsolatedExecutor;
 import org.apache.cassandra.utils.ExecutorUtils;
 import org.apache.cassandra.utils.Throwables;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
+
 public class IsolatedExecutor implements IIsolatedExecutor
 {
     final ExecutorService isolatedExecutor;
     private final String name;
-    private final ClassLoader classLoader;
-    private final Method deserializeOnInstance;
+    final ClassLoader classLoader;
+    private final DynamicFunction<Serializable> transfer;
+    private final ShutdownExecutor shutdownExecutor;
 
-    IsolatedExecutor(String name, ClassLoader classLoader)
-    {
-        this.name = name;
-        this.isolatedExecutor = Executors.newCachedThreadPool(new NamedThreadFactory("isolatedExecutor", Thread.NORM_PRIORITY, classLoader, new ThreadGroup(name)));
-        this.classLoader = classLoader;
-        this.deserializeOnInstance = lookupDeserializeOneObject(classLoader);
-    }
-
-    public Future<Void> shutdown()
-    {
-        isolatedExecutor.shutdownNow();
-
+    public static final ShutdownExecutor DEFAULT_SHUTDOWN_EXECUTOR = (name, classLoader, shuttingDown, onTermination) -> {
         /* Use a thread pool with a core pool size of zero to terminate the thread as soon as possible
-        ** so the instance class loader can be garbage collected.  Uses a custom thread factory
-        ** rather than NamedThreadFactory to avoid calling FastThreadLocal.removeAll() in 3.0 and up
-        ** as it was observed crashing during test failures and made it harder to find the real cause.
-        */
+         ** so the instance class loader can be garbage collected.  Uses a custom thread factory
+         ** rather than NamedThreadFactory to avoid calling FastThreadLocal.removeAll() in 3.0 and up
+         ** as it was observed crashing during test failures and made it harder to find the real cause.
+         */
         ThreadFactory threadFactory = (Runnable r) -> {
             Thread t = new Thread(r, name + "_shutdown");
             t.setDaemon(true);
             return t;
         };
-        ExecutorService shutdownExecutor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0, TimeUnit.SECONDS,
+
+        ExecutorService shutdownExecutor = new ThreadPoolExecutor(0, Integer.MAX_VALUE, 0, SECONDS,
                                                                   new LinkedBlockingQueue<>(), threadFactory);
         return shutdownExecutor.submit(() -> {
             try
             {
-                ExecutorUtils.awaitTermination(60, TimeUnit.SECONDS, isolatedExecutor);
-
-                // Shutdown logging last - this is not ideal as the logging subsystem is initialized
-                // outsize of this class, however doing it this way provides access to the full
-                // logging system while termination is taking place.
-                LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
-                loggerContext.stop();
-
-                // Close the instance class loader after shutting down the isolatedExecutor and logging
-                // in case error handling triggers loading additional classes
-                ((URLClassLoader) classLoader).close();
+                ExecutorUtils.awaitTermination(60, TimeUnit.SECONDS, shuttingDown);
+                return onTermination.call();
             }
             finally
             {
                 shutdownExecutor.shutdownNow();
             }
+        });
+    };
+
+    // retained for backwards compatibility
+    @SuppressWarnings("unused")
+    public IsolatedExecutor(String name, ClassLoader classLoader, ExecutorFactory executorFactory)
+    {
+        this(name, classLoader, executorFactory.pooled("isolatedExecutor", Integer.MAX_VALUE), DEFAULT_SHUTDOWN_EXECUTOR);
+    }
+
+    // retained for backwards compatibility
+    @SuppressWarnings("unused")
+    public IsolatedExecutor(String name, ClassLoader classLoader, ExecutorService executorService)
+    {
+        this(name, classLoader, executorService, DEFAULT_SHUTDOWN_EXECUTOR);
+    }
+
+    IsolatedExecutor(String name, ClassLoader classLoader, ExecutorService executorService, ShutdownExecutor shutdownExecutor)
+    {
+        this.name = name;
+        this.isolatedExecutor = executorService;
+        this.classLoader = classLoader;
+        this.transfer = transferTo(classLoader);
+        this.shutdownExecutor = shutdownExecutor;
+    }
+
+    protected IsolatedExecutor(IsolatedExecutor from, ExecutorService executor)
+    {
+        this.name = from.name;
+        this.isolatedExecutor = executor;
+        this.classLoader = from.classLoader;
+        this.transfer = from.transfer;
+        this.shutdownExecutor = from.shutdownExecutor;
+    }
+
+    public IIsolatedExecutor with(ExecutorService executor)
+    {
+        return new IsolatedExecutor(this, executor);
+    }
+
+    public Future<Void> shutdown()
+    {
+        isolatedExecutor.shutdownNow();
+        return shutdownExecutor.shutdown(name, classLoader, isolatedExecutor, () -> {
+
+            // Shutdown logging last - this is not ideal as the logging subsystem is initialized
+            // outsize of this class, however doing it this way provides access to the full
+            // logging system while termination is taking place.
+            LoggerContext loggerContext = (LoggerContext) LoggerFactory.getILoggerFactory();
+            loggerContext.stop();
+
+            FastThreadLocal.destroy();
+
+            // Close the instance class loader after shutting down the isolatedExecutor and logging
+            // in case error handling triggers loading additional classes
+            ((URLClassLoader) classLoader).close();
             return null;
         });
     }
@@ -136,33 +177,57 @@
     public <I1, I2, I3, I4, I5, O> QuintFunction<I1, I2, I3, I4, I5, Future<O>> async(QuintFunction<I1, I2, I3, I4, I5, O> f) { return (a, b, c, d, e) -> isolatedExecutor.submit(() -> f.apply(a, b, c, d, e)); }
     public <I1, I2, I3, I4, I5, O> QuintFunction<I1, I2, I3, I4, I5, O> sync(QuintFunction<I1, I2, I3, I4, I5, O> f) { return (a, b, c, d,e ) -> waitOn(async(f).apply(a, b, c, d, e)); }
 
-    public <E extends Serializable> E transfer(E object)
+    public Executor executor()
     {
-        return (E) transferOneObject(object, classLoader, deserializeOnInstance);
+        return isolatedExecutor;
     }
 
-    static <E extends Serializable> E transferAdhoc(E object, ClassLoader classLoader)
+    public <T extends Serializable> T transfer(T in)
     {
-        return transferOneObject(object, classLoader, lookupDeserializeOneObject(classLoader));
+        return transfer.apply(in);
     }
 
-    private static <E extends Serializable> E transferOneObject(E object, ClassLoader classLoader, Method deserializeOnInstance)
+    public static <T extends Serializable> T transferAdhoc(T object, ClassLoader classLoader)
     {
-        byte[] bytes = serializeOneObject(object);
         try
         {
-            Object onInstance = deserializeOnInstance.invoke(null, bytes);
-            if (onInstance.getClass().getClassLoader() != classLoader)
-                throw new IllegalStateException(onInstance + " seemingly from wrong class loader: " + onInstance.getClass().getClassLoader() + ", but expected " + classLoader);
-
-            return (E) onInstance;
+            return transferOneObjectAdhoc(object, classLoader, lookupDeserializeOneObject(classLoader));
         }
         catch (IllegalAccessException | InvocationTargetException e)
         {
-            throw new RuntimeException("Error while transfering object to " + classLoader, e);
+            throw new RuntimeException(e);
         }
     }
 
+    public static <T extends Serializable> T transferAdhocPropagate(T object, ClassLoader classLoader) throws InvocationTargetException, IllegalAccessException
+    {
+        return transferOneObjectAdhoc(object, classLoader, lookupDeserializeOneObject(classLoader));
+    }
+
+    private static final SerializableFunction<byte[], Object> DESERIALIZE_ONE_OBJECT = IsolatedExecutor::deserializeOneObject;
+
+    public static DynamicFunction<Serializable> transferTo(ClassLoader classLoader)
+    {
+        SerializableFunction<byte[], Object> deserializeOneObject = transferAdhoc(DESERIALIZE_ONE_OBJECT, classLoader);
+        return new DynamicFunction<Serializable>()
+        {
+            public <T extends Serializable> T apply(T in)
+            {
+                return (T) deserializeOneObject.apply(serializeOneObject(in));
+            }
+        };
+    }
+
+    private static <T extends Serializable> T transferOneObjectAdhoc(T object, ClassLoader classLoader, Method deserializeOnInstance) throws IllegalAccessException, InvocationTargetException
+    {
+        byte[] bytes = serializeOneObject(object);
+        Object onInstance = deserializeOnInstance.invoke(null, bytes);
+        if (onInstance.getClass().getClassLoader() != classLoader)
+            throw new IllegalStateException(onInstance + " seemingly from wrong class loader: " + onInstance.getClass().getClassLoader() + ", but expected " + classLoader);
+
+        return (T) onInstance;
+    }
+
     private static Method lookupDeserializeOneObject(ClassLoader classLoader)
     {
         try
@@ -221,22 +286,4 @@
         }
     }
 
-    public interface ThrowingRunnable
-    {
-        public void run() throws Throwable;
-
-        public static Runnable toRunnable(ThrowingRunnable runnable)
-        {
-            return () -> {
-                try
-                {
-                    runnable.run();
-                }
-                catch (Throwable throwable)
-                {
-                    throw new RuntimeException(throwable);
-                }
-            };
-        }
-    }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/MessageFilters.java b/test/distributed/org/apache/cassandra/distributed/impl/MessageFilters.java
new file mode 100644
index 0000000..84db349
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/impl/MessageFilters.java
@@ -0,0 +1,207 @@
+/*
+ * 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.distributed.impl;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.CopyOnWriteArrayList;
+
+import org.apache.cassandra.distributed.api.IMessage;
+import org.apache.cassandra.distributed.api.IMessageFilters;
+
+// note: as a pure implementation class of an interface, this should not live in dtest-api
+public class MessageFilters implements IMessageFilters
+{
+    private final List<Filter> inboundFilters = new CopyOnWriteArrayList<>();
+    private final List<Filter> outboundFilters = new CopyOnWriteArrayList<>();
+
+    public boolean permitInbound(int from, int to, IMessage msg)
+    {
+        return permit(inboundFilters, from, to, msg);
+    }
+
+    public boolean permitOutbound(int from, int to, IMessage msg)
+    {
+        return permit(outboundFilters, from, to, msg);
+    }
+
+    @Override
+    public boolean hasInbound()
+    {
+        return !inboundFilters.isEmpty();
+    }
+
+    @Override
+    public boolean hasOutbound()
+    {
+        return !outboundFilters.isEmpty();
+    }
+
+    private static boolean permit(List<Filter> filters, int from, int to, IMessage msg)
+    {
+        for (Filter filter : filters)
+        {
+            if (filter.matches(from, to, msg))
+                return false;
+        }
+        return true;
+    }
+
+    public static class Filter implements IMessageFilters.Filter
+    {
+        final int[] from;
+        final int[] to;
+        final int[] verbs;
+        final Matcher matcher;
+        final List<Filter> parent;
+
+        Filter(int[] from, int[] to, int[] verbs, Matcher matcher, List<Filter> parent)
+        {
+            if (from != null)
+            {
+                from = from.clone();
+                Arrays.sort(from);
+            }
+            if (to != null)
+            {
+                to = to.clone();
+                Arrays.sort(to);
+            }
+            if (verbs != null)
+            {
+                verbs = verbs.clone();
+                Arrays.sort(verbs);
+            }
+            this.from = from;
+            this.to = to;
+            this.verbs = verbs;
+            this.matcher = matcher;
+            this.parent = Objects.requireNonNull(parent, "parent");
+        }
+
+        public int hashCode()
+        {
+            return (from == null ? 0 : Arrays.hashCode(from))
+                   + (to == null ? 0 : Arrays.hashCode(to))
+                   + (verbs == null ? 0 : Arrays.hashCode(verbs)
+                                          + parent.hashCode());
+        }
+
+        public boolean equals(Object that)
+        {
+            return that instanceof Filter && equals((Filter) that);
+        }
+
+        public boolean equals(Filter that)
+        {
+            return Arrays.equals(from, that.from)
+                   && Arrays.equals(to, that.to)
+                   && Arrays.equals(verbs, that.verbs)
+                   && parent.equals(that.parent);
+        }
+
+        public Filter off()
+        {
+            parent.remove(this);
+            return this;
+        }
+
+        public Filter on()
+        {
+            parent.add(this);
+            return this;
+        }
+
+        public boolean matches(int from, int to, IMessage msg)
+        {
+            return (this.from == null || Arrays.binarySearch(this.from, from) >= 0)
+                   && (this.to == null || Arrays.binarySearch(this.to, to) >= 0)
+                   && (this.verbs == null || Arrays.binarySearch(this.verbs, msg.verb()) >= 0)
+                   && (this.matcher == null || this.matcher.matches(from, to, msg));
+        }
+    }
+
+    public class Builder implements IMessageFilters.Builder
+    {
+        int[] from;
+        int[] to;
+        int[] verbs;
+        Matcher matcher;
+        boolean inbound;
+
+        private Builder(boolean inbound)
+        {
+            this.inbound = inbound;
+        }
+
+        public Builder from(int... nums)
+        {
+            from = nums;
+            return this;
+        }
+
+        public Builder to(int... nums)
+        {
+            to = nums;
+            return this;
+        }
+
+        public IMessageFilters.Builder verbs(int... verbs)
+        {
+            this.verbs = verbs;
+            return this;
+        }
+
+        public IMessageFilters.Builder allVerbs()
+        {
+            this.verbs = null;
+            return this;
+        }
+
+        public IMessageFilters.Builder inbound(boolean inbound)
+        {
+            this.inbound = inbound;
+            return this;
+        }
+
+        public IMessageFilters.Builder messagesMatching(Matcher matcher)
+        {
+            this.matcher = matcher;
+            return this;
+        }
+
+        public IMessageFilters.Filter drop()
+        {
+            return new Filter(from, to, verbs, matcher, inbound ? inboundFilters : outboundFilters).on();
+        }
+    }
+
+    public IMessageFilters.Builder inbound(boolean inbound)
+    {
+        return new Builder(inbound);
+    }
+
+    @Override
+    public void reset()
+    {
+        inboundFilters.clear();
+        outboundFilters.clear();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/MessageImpl.java b/test/distributed/org/apache/cassandra/distributed/impl/MessageImpl.java
index 607e890..758d413 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/MessageImpl.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/MessageImpl.java
@@ -30,14 +30,16 @@
     public final byte[] bytes;
     public final long id;
     public final int version;
+    public final long expiresAtNanos;
     public final InetSocketAddress from;
 
-    public MessageImpl(int verb, byte[] bytes, long id, int version, InetSocketAddress from)
+    public MessageImpl(int verb, byte[] bytes, long id, int version, long expiresAtNanos, InetSocketAddress from)
     {
         this.verb = verb;
         this.bytes = bytes;
         this.id = id;
         this.version = version;
+        this.expiresAtNanos = expiresAtNanos;
         this.from = from;
     }
 
@@ -61,6 +63,12 @@
         return version;
     }
 
+    @Override
+    public long expiresAtNanos()
+    {
+        return expiresAtNanos;
+    }
+
     public InetSocketAddress from()
     {
         return from;
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/Query.java b/test/distributed/org/apache/cassandra/distributed/impl/Query.java
new file mode 100644
index 0000000..823113f
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/impl/Query.java
@@ -0,0 +1,111 @@
+/*
+ * 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.distributed.impl;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cassandra.cql3.CQLStatement;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.transport.messages.ResultMessage;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public class Query implements IIsolatedExecutor.SerializableCallable<Object[][]>
+{
+    private static final long serialVersionUID = 1L;
+
+    final String query;
+    final long timestamp;
+    final org.apache.cassandra.distributed.api.ConsistencyLevel commitConsistencyOrigin;
+    final org.apache.cassandra.distributed.api.ConsistencyLevel serialConsistencyOrigin;
+    final Object[] boundValues;
+
+    public Query(String query, long timestamp, org.apache.cassandra.distributed.api.ConsistencyLevel commitConsistencyOrigin, org.apache.cassandra.distributed.api.ConsistencyLevel serialConsistencyOrigin, Object[] boundValues)
+    {
+        this.query = query;
+        this.timestamp = timestamp;
+        this.commitConsistencyOrigin = commitConsistencyOrigin;
+        this.serialConsistencyOrigin = serialConsistencyOrigin;
+        this.boundValues = boundValues;
+    }
+
+    public Object[][] call()
+    {
+        ConsistencyLevel commitConsistency = toCassandraCL(commitConsistencyOrigin);
+        ConsistencyLevel serialConsistency = serialConsistencyOrigin == null ? null : toCassandraCL(serialConsistencyOrigin);
+        ClientState clientState = Coordinator.makeFakeClientState();
+        CQLStatement prepared = QueryProcessor.getStatement(query, clientState);
+        List<ByteBuffer> boundBBValues = new ArrayList<>();
+        for (Object boundValue : boundValues)
+            boundBBValues.add(ByteBufferUtil.objectToBytes(boundValue));
+
+        prepared.validate(QueryState.forInternalCalls().getClientState());
+
+        // Start capturing warnings on this thread. Note that this will implicitly clear out any previous
+        // warnings as it sets a new State instance on the ThreadLocal.
+        ClientWarn.instance.captureWarnings();
+
+        ResultMessage res = prepared.execute(QueryState.forInternalCalls(),
+                                             QueryOptions.create(commitConsistency,
+                                                                 boundBBValues,
+                                                                 false,
+                                                                 Integer.MAX_VALUE,
+                                                                 null,
+                                                                 serialConsistency,
+                                                                 ProtocolVersion.V4,
+                                                                 null,
+                                                                 timestamp,
+                                                                 FBUtilities.nowInSeconds()),
+                                             nanoTime());
+
+        // Collect warnings reported during the query.
+        if (res != null)
+            res.setWarnings(ClientWarn.instance.getWarnings());
+
+        return RowUtil.toQueryResult(res).toObjectArrays();
+    }
+
+    public String toString()
+    {
+        return String.format(query.replaceAll("\\?", "%s") + " AT " + commitConsistencyOrigin, boundValues);
+    }
+
+    static org.apache.cassandra.db.ConsistencyLevel toCassandraCL(org.apache.cassandra.distributed.api.ConsistencyLevel cl)
+    {
+        return org.apache.cassandra.db.ConsistencyLevel.fromCode(cl.ordinal());
+    }
+
+    static final org.apache.cassandra.distributed.api.ConsistencyLevel[] API_CLs = org.apache.cassandra.distributed.api.ConsistencyLevel.values();
+    static org.apache.cassandra.distributed.api.ConsistencyLevel fromCassandraCL(org.apache.cassandra.db.ConsistencyLevel cl)
+    {
+        return API_CLs[cl.ordinal()];
+    }
+
+}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/RowUtil.java b/test/distributed/org/apache/cassandra/distributed/impl/RowUtil.java
index ca26639..18ac07d 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/RowUtil.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/RowUtil.java
@@ -29,7 +29,6 @@
 
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
-
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.distributed.api.QueryResults;
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/ShutdownExecutor.java b/test/distributed/org/apache/cassandra/distributed/impl/ShutdownExecutor.java
new file mode 100644
index 0000000..15ed4a2
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/impl/ShutdownExecutor.java
@@ -0,0 +1,31 @@
+/*
+ * 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.distributed.impl;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+
+import org.apache.cassandra.utils.Shared;
+
+@Shared
+public interface ShutdownExecutor
+{
+    Future<Void> shutdown(String name, ClassLoader classLoader, ExecutorService shuttingDown, Callable<Void> onTermination);
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java b/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java
index 439d4b7..06fdabb 100644
--- a/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java
+++ b/test/distributed/org/apache/cassandra/distributed/impl/TracingUtil.java
@@ -25,6 +25,7 @@
 import java.util.UUID;
 
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.utils.TimeUUID;
 
 
 /**
@@ -56,8 +57,9 @@
 
         static TraceEntry fromRowResultObjects(Object[] objects)
         {
-            return new TraceEntry((UUID) objects[0],
-                                  (UUID) objects[1],
+            UUID eventId = objects[1] instanceof UUID ? (UUID)objects[1]: ((TimeUUID)objects[1]).asUUID();
+            return new TraceEntry((UUID)objects[0],
+                                  eventId,
                                   (String) objects[2],
                                   (InetAddress) objects[3],
                                   (Integer) objects[4],
diff --git a/test/distributed/org/apache/cassandra/distributed/impl/UnsafeGossipHelper.java b/test/distributed/org/apache/cassandra/distributed/impl/UnsafeGossipHelper.java
new file mode 100644
index 0000000..7cf4c16
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/impl/UnsafeGossipHelper.java
@@ -0,0 +1,277 @@
+/*
+ * 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.distributed.impl;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.util.Collection;
+import java.util.UUID;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.dht.IPartitioner;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.service.PendingRangeCalculatorService;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static com.google.common.collect.Iterables.getOnlyElement;
+import static java.util.Collections.singleton;
+import static org.apache.cassandra.distributed.impl.DistributedTestSnitch.toCassandraInetAddressAndPort;
+import static org.apache.cassandra.locator.InetAddressAndPort.getByAddress;
+
+public class UnsafeGossipHelper
+{
+    public static class HostInfo implements Serializable
+    {
+        final InetSocketAddress address;
+        final UUID hostId;
+        final String tokenString;
+        final int messagingVersion;
+        final boolean isShutdown;
+
+        private HostInfo(InetSocketAddress address, UUID hostId, String tokenString, int messagingVersion, boolean isShutdown)
+        {
+            this.address = address;
+            this.hostId = hostId;
+            this.tokenString = tokenString;
+            this.messagingVersion = messagingVersion;
+            this.isShutdown = isShutdown;
+        }
+
+        private HostInfo(IInstance instance)
+        {
+            this(instance, instance.config().hostId(), instance.config().getString("initial_token"));
+        }
+
+        private HostInfo(IInstance instance, UUID hostId, String tokenString)
+        {
+            this(instance.broadcastAddress(), hostId, tokenString, instance.getMessagingVersion(), instance.isShutdown());
+        }
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingRunner(IIsolatedExecutor.SerializableBiFunction<VersionedValue.VersionedValueFactory, Collection<Token>, VersionedValue> statusFactory, InetSocketAddress address, UUID hostId, String tokenString, int messagingVersion, boolean isShutdown)
+    {
+        return () -> {
+            try
+            {
+                IPartitioner partitioner = DatabaseDescriptor.getPartitioner();
+                InetAddressAndPort addressAndPort = getByAddress(address);
+                Token token;
+                if (FBUtilities.getBroadcastAddressAndPort().equals(addressAndPort))
+                {
+                    // try grabbing saved tokens so that - if we're leaving - we get the ones we may have adopted as part of a range movement
+                    // if that fails, grab them from config (as we're probably joining and should just use the default token)
+                    Token.TokenFactory tokenFactory = DatabaseDescriptor.getPartitioner().getTokenFactory();
+                    if (tokenString == null)
+                    {
+                        Token tmp;
+                        try
+                        {
+                             tmp = getOnlyElement(SystemKeyspace.getSavedTokens());
+                        }
+                        catch (Throwable t)
+                        {
+                            tmp = tokenFactory.fromString(getOnlyElement(DatabaseDescriptor.getInitialTokens()));
+                        }
+                        token = tmp;
+                    }
+                    else
+                    {
+                        token = tokenFactory.fromString(tokenString);
+                    }
+
+                    SystemKeyspace.setLocalHostId(hostId);
+                    SystemKeyspace.updateTokens(singleton(token));
+                }
+                else
+                {
+                    if (tokenString == null)
+                        throw new IllegalArgumentException();
+
+                    token = DatabaseDescriptor.getPartitioner().getTokenFactory().fromString(tokenString);
+                }
+
+                Gossiper.runInGossipStageBlocking(() -> {
+                    EndpointState state = Gossiper.instance.getEndpointStateForEndpoint(addressAndPort);
+                    if (state == null)
+                    {
+                        Gossiper.instance.initializeNodeUnsafe(addressAndPort, hostId, 1);
+                        state = Gossiper.instance.getEndpointStateForEndpoint(addressAndPort);
+                        Gossiper.instance.realMarkAlive(addressAndPort, state);
+                    }
+
+                    state.addApplicationState(ApplicationState.TOKENS, new VersionedValue.VersionedValueFactory(partitioner).tokens(singleton(token)));
+                    VersionedValue status = statusFactory.apply(new VersionedValue.VersionedValueFactory(partitioner), singleton(token));
+                    state.addApplicationState(ApplicationState.STATUS_WITH_PORT, status);
+                    StorageService.instance.onChange(addressAndPort, ApplicationState.STATUS_WITH_PORT, status);
+                });
+
+                int setMessagingVersion = isShutdown
+                                          ? MessagingService.current_version
+                                          : Math.min(MessagingService.current_version, messagingVersion);
+                MessagingService.instance().versions.set(addressAndPort, setMessagingVersion);
+
+                PendingRangeCalculatorService.instance.blockUntilFinished();
+            }
+            catch (Throwable e) // UnknownHostException
+            {
+                throw new RuntimeException(e);
+            }
+        };
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingNormalRunner(IInstance peer)
+    {
+        return addToRingNormalRunner(new HostInfo(peer));
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingNormalRunner(IInstance peer, UUID hostId, String tokenString)
+    {
+        return addToRingNormalRunner(new HostInfo(peer, hostId, tokenString));
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingNormalRunner(HostInfo info)
+    {
+        return addToRingNormalRunner(info.address, info.hostId, info.tokenString, info.messagingVersion, info.isShutdown);
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingNormalRunner(InetSocketAddress address, UUID hostId, String tokenString, int messagingVersion, boolean isShutdown)
+    {
+        return addToRingRunner(VersionedValue.VersionedValueFactory::normal, address, hostId, tokenString, messagingVersion, isShutdown);
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingRunner(IIsolatedExecutor.SerializableBiFunction<VersionedValue.VersionedValueFactory, Collection<Token>, VersionedValue> statusFactory, HostInfo info)
+    {
+        return addToRingRunner(statusFactory, info.address, info.hostId, info.tokenString, info.messagingVersion, info.isShutdown);
+    }
+
+    // reset gossip state so we know of the node being alive only
+    public static IIsolatedExecutor.SerializableRunnable removeFromRingRunner(IInstance instance)
+    {
+        return removeFromRingRunner(new HostInfo(instance));
+    }
+
+    // reset gossip state so we know of the node being alive only
+    public static IIsolatedExecutor.SerializableRunnable removeFromRingRunner(HostInfo info)
+    {
+        return removeFromRingRunner(info.address, info.hostId, info.tokenString);
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable removeFromRingRunner(InetSocketAddress address, UUID hostId, String tokenString)
+    {
+        return () -> {
+
+            try
+            {
+                IPartitioner partitioner = DatabaseDescriptor.getPartitioner();
+                Token token = partitioner.getTokenFactory().fromString(tokenString);
+                InetAddressAndPort addressAndPort = toCassandraInetAddressAndPort(address);
+
+                Gossiper.runInGossipStageBlocking(() -> {
+                    StorageService.instance.onChange(addressAndPort,
+                                                     ApplicationState.STATUS,
+                                                     new VersionedValue.VersionedValueFactory(partitioner).left(singleton(token), 0L));
+                    Gossiper.instance.unsafeAnnulEndpoint(addressAndPort);
+                    Gossiper.instance.initializeNodeUnsafe(addressAndPort, hostId, 1);
+                    Gossiper.instance.realMarkAlive(addressAndPort, Gossiper.instance.getEndpointStateForEndpoint(addressAndPort));
+                });
+                PendingRangeCalculatorService.instance.blockUntilFinished();
+            }
+            catch (Throwable e) // UnknownHostException
+            {
+                throw new RuntimeException(e);
+            }
+        };
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingBootstrappingRunner(IInstance peer)
+    {
+        return addToRingRunner(VersionedValue.VersionedValueFactory::bootstrapping, new HostInfo(peer));
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingBootstrapReplacingRunner(IInstance peer, IInvokableInstance replacing, UUID hostId, String tokenString)
+    {
+        return addToRingBootstrapReplacingRunner(peer, replacing.broadcastAddress(), hostId, tokenString);
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingBootstrapReplacingRunner(IInstance peer, InetSocketAddress replacingAddress, UUID hostId, String tokenString)
+    {
+        return addToRingRunner((factory, ignore) -> factory.bootReplacingWithPort(getByAddress(replacingAddress)), new HostInfo(peer, hostId, tokenString));
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingNormalReplacedRunner(IInstance peer, IInstance replaced)
+    {
+        return addToRingNormalReplacedRunner(peer, replaced.broadcastAddress());
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingNormalReplacedRunner(IInstance peer, InetSocketAddress replacedAddress)
+    {
+        return addToRingRunner((factory, ignore) -> factory.bootReplacingWithPort(getByAddress(replacedAddress)), new HostInfo(peer, null, null));
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingLeavingRunner(IInstance peer)
+    {
+        return addToRingRunner(VersionedValue.VersionedValueFactory::leaving, new HostInfo(peer, null, null));
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable addToRingLeftRunner(IInstance peer)
+    {
+        return addToRingRunner((factory, tokens) -> factory.left(tokens, Long.MAX_VALUE), new HostInfo(peer, null, null));
+    }
+
+    public static void removeFromRing(IInstance peer)
+    {
+        removeFromRingRunner(peer).run();
+    }
+
+    public static void addToRingNormal(IInstance peer)
+    {
+        addToRingNormalRunner(peer).run();
+        assert StorageService.instance.getTokenMetadata().isMember(toCassandraInetAddressAndPort(peer.broadcastAddress()));
+    }
+
+    public static void addToRingBootstrapping(IInstance peer)
+    {
+        addToRingBootstrappingRunner(peer).run();
+    }
+
+    public static IIsolatedExecutor.SerializableRunnable markShutdownRunner(InetSocketAddress address)
+    {
+        return () -> {
+            IPartitioner partitioner = DatabaseDescriptor.getPartitioner();
+            Gossiper.runInGossipStageBlocking(() -> {
+                EndpointState state = Gossiper.instance.getEndpointStateForEndpoint(getByAddress(address));
+                VersionedValue status = new VersionedValue.VersionedValueFactory(partitioner).shutdown(true);
+                state.addApplicationState(ApplicationState.STATUS, status);
+                state.getHeartBeatState().forceHighestPossibleVersionUnsafe();
+                StorageService.instance.onChange(getByAddress(address), ApplicationState.STATUS, status);
+            });
+        };
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java b/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java
index bc27ec7..b4dd10c 100644
--- a/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java
+++ b/test/distributed/org/apache/cassandra/distributed/shared/Byteman.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.distributed.shared;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.UncheckedIOException;
 import java.lang.reflect.Method;
@@ -42,6 +41,7 @@
 import com.google.common.base.StandardSystemProperty;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Files;
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -96,7 +96,7 @@
         List<String> texts = Stream.of(scripts).map(p -> {
             try
             {
-                return Files.toString(new File(p), StandardCharsets.UTF_8);
+                return Files.toString(new File(p).toJavaIOFile(), StandardCharsets.UTF_8);
             }
             catch (IOException e)
             {
@@ -155,11 +155,11 @@
                 if (DEBUG_TRANSFORMATIONS)
                 {
                     File f = new File(StandardSystemProperty.JAVA_IO_TMPDIR.value(), "byteman/" + details.klassPath + ".class");
-                    f.getParentFile().mkdirs();
-                    File original = new File(f.getParentFile(), "original-" + f.getName());
-                    logger.info("Writing class file for {} to {}", details.klassPath, f.getAbsolutePath());
-                    Files.asByteSink(f).write(newBytes);
-                    Files.asByteSink(original).write(details.bytes);
+                    f.parent().tryCreateDirectories();
+                    File original = new File(f.parent(), "original-" + f.name());
+                    logger.info("Writing class file for {} to {}", details.klassPath, f.absolutePath());
+                    Files.asByteSink(f.toJavaIOFile()).write(newBytes);
+                    Files.asByteSink(original.toJavaIOFile()).write(details.bytes);
                 }
             }
         }
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java b/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java
index 1755857..dc280f3 100644
--- a/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java
+++ b/test/distributed/org/apache/cassandra/distributed/shared/ClusterUtils.java
@@ -18,8 +18,9 @@
 
 package org.apache.cassandra.distributed.shared;
 
-import java.io.File;
+import java.lang.reflect.Field;
 import java.net.InetSocketAddress;
+import java.security.Permission;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -39,6 +40,7 @@
 import java.util.stream.Collectors;
 
 import com.google.common.util.concurrent.Futures;
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 
 import org.apache.cassandra.dht.Token;
@@ -51,7 +53,9 @@
 import org.apache.cassandra.distributed.impl.AbstractCluster;
 import org.apache.cassandra.distributed.impl.InstanceConfig;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.tools.SystemExitException;
 import org.apache.cassandra.utils.FBUtilities;
+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;
@@ -139,6 +143,22 @@
      * Create a new instance and add it to the cluster, without starting it.
      *
      * @param cluster to add to
+     * @param other config to copy from
+     * @param fn function to add to the config before starting
+     * @param <I> instance type
+     * @return the instance added
+     */
+    public static <I extends IInstance> I addInstance(AbstractCluster<I> cluster,
+                                                      IInstanceConfig other,
+                                                      Consumer<IInstanceConfig> fn)
+    {
+        return addInstance(cluster, other.localDatacenter(), other.localRack(), fn);
+    }
+
+    /**
+     * Create a new instance and add it to the cluster, without starting it.
+     *
+     * @param cluster to add to
      * @param dc the instance should be in
      * @param rack the instance should be in
      * @param <I> instance type
@@ -208,8 +228,26 @@
                                                               IInstance toReplace,
                                                               Consumer<WithProperties> fn)
     {
+        return replaceHostAndStart(cluster, toReplace, (ignore, prop) -> fn.accept(prop));
+    }
+
+    /**
+     * Create and start a new instance that replaces an existing instance.
+     *
+     * The instance will be in the same datacenter and rack as the existing instance.
+     *
+     * @param cluster to add to
+     * @param toReplace instance to replace
+     * @param fn lambda to add additional properties or modify instance
+     * @param <I> instance type
+     * @return the instance added
+     */
+    public static <I extends IInstance> I replaceHostAndStart(AbstractCluster<I> cluster,
+                                                              IInstance toReplace,
+                                                              BiConsumer<I, WithProperties> fn)
+    {
         IInstanceConfig toReplaceConf = toReplace.config();
-        I inst = addInstance(cluster, toReplaceConf.localDatacenter(), toReplaceConf.localRack(), c -> c.set("auto_bootstrap", true));
+        I inst = addInstance(cluster, toReplaceConf, c -> c.set("auto_bootstrap", true));
 
         return start(inst, properties -> {
             // lower this so the replacement waits less time
@@ -221,7 +259,7 @@
             // state which node to replace
             properties.setProperty("cassandra.replace_address_first_boot", toReplace.config().broadcastAddress().getAddress().getHostAddress());
 
-            fn.accept(properties);
+            fn.accept(inst, properties);
         });
     }
 
@@ -237,15 +275,13 @@
                                                           .collect(Collectors.toList()));
     }
 
-    public static String getLocalToken(IInvokableInstance inst)
+    public static Collection<String> getLocalTokens(IInvokableInstance inst)
     {
         return inst.callOnInstance(() -> {
             List<String> tokens = new ArrayList<>();
             for (Token t : StorageService.instance.getTokenMetadata().getTokens(FBUtilities.getBroadcastAddressAndPort()))
                 tokens.add(t.getTokenValue().toString());
-
-            assert tokens.size() == 1 : "getLocalToken assumes a single token, but multiple tokens found";
-            return tokens.get(0);
+            return tokens;
         });
     }
 
@@ -592,6 +628,17 @@
     }
 
     /**
+     * Get the number of tokens for the instance via config.
+     *
+     * @param instance to get token count from
+     * @return number of tokens
+     */
+    public static int getTokenCount(IInvokableInstance instance)
+    {
+        return instance.config().getInt("num_tokens");
+    }
+
+    /**
      * Get all data directories for the given instance.
      *
      * @param instance to get data directories for
@@ -702,13 +749,33 @@
      */
     private static void updateAddress(IInstanceConfig conf, String address)
     {
+        InetSocketAddress previous = conf.broadcastAddress();
+
         for (String key : Arrays.asList("broadcast_address", "listen_address", "broadcast_rpc_address", "rpc_address"))
             conf.set(key, address);
 
         // InstanceConfig caches InetSocketAddress -> InetAddressAndPort
         // this causes issues as startup now ignores config, so force reset it to pull from conf.
         ((InstanceConfig) conf).unsetBroadcastAddressAndPort(); //TODO remove the need to null out the cache...
-        conf.networkTopology().put(conf.broadcastAddress(), NetworkTopology.dcAndRack(conf.localDatacenter(), conf.localRack()));
+
+        //TODO NetworkTopology class isn't flexible and doesn't handle adding/removing nodes well...
+        // it also uses a HashMap which makes the class not thread safe... so mutating AFTER starting nodes
+        // are a risk
+        if (!conf.broadcastAddress().equals(previous))
+        {
+            conf.networkTopology().put(conf.broadcastAddress(), NetworkTopology.dcAndRack(conf.localDatacenter(), conf.localRack()));
+            try
+            {
+                Field field = NetworkTopology.class.getDeclaredField("map");
+                field.setAccessible(true);
+                Map<InetSocketAddress, NetworkTopology.DcAndRack> map = (Map<InetSocketAddress, NetworkTopology.DcAndRack>) field.get(conf.networkTopology());
+                map.remove(previous);
+            }
+            catch (NoSuchFieldException | IllegalAccessException e)
+            {
+                throw new AssertionError(e);
+            }
+        }
     }
 
     /**
@@ -802,4 +869,26 @@
             return Arrays.asList(address, rack, status, state, token).toString();
         }
     }
+
+    public static void preventSystemExit()
+    {
+        System.setSecurityManager(new SecurityManager()
+        {
+            @Override
+            public void checkExit(int status)
+            {
+                throw new SystemExitException(status);
+            }
+
+            @Override
+            public void checkPermission(Permission perm)
+            {
+            }
+
+            @Override
+            public void checkPermission(Permission perm, Object context)
+            {
+            }
+        });
+    }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/Isolated.java b/test/distributed/org/apache/cassandra/distributed/shared/Isolated.java
deleted file mode 100644
index 898631f..0000000
--- a/test/distributed/org/apache/cassandra/distributed/shared/Isolated.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.shared;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Tells jvm-dtest that a class should be isolated and loaded into the instance class loader.
- *
- * Jvm-dtest relies on classloader isolation to run multiple cassandra instances in the same JVM, this makes it
- * so some classes do not get shared (outside a blesssed set of classes/packages). When the default behavior
- * is not desirable, this annotation will tell jvm-dtest to isolate the class accross all class loaders.
- *
- * This is the oposite of {@link Shared}.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ ElementType.TYPE })
-public @interface Isolated
-{
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/Shared.java b/test/distributed/org/apache/cassandra/distributed/shared/Shared.java
deleted file mode 100644
index bb67070..0000000
--- a/test/distributed/org/apache/cassandra/distributed/shared/Shared.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.shared;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Tells jvm-dtest that a class should be shared accross all {@link ClassLoader}s.
- *
- * Jvm-dtest relies on classloader isolation to run multiple cassandra instances in the same JVM, this makes it
- * so some classes do not get shared (outside a blesssed set of classes/packages). When the default behavior
- * is not desirable, this annotation will tell jvm-dtest to share the class accross all class loaders.
- *
- * This is the oposite of {@link Isolated}.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ ElementType.TYPE })
-public @interface Shared
-{
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/shared/ShutdownException.java b/test/distributed/org/apache/cassandra/distributed/shared/ShutdownException.java
index d2b5bf7..9738357 100644
--- a/test/distributed/org/apache/cassandra/distributed/shared/ShutdownException.java
+++ b/test/distributed/org/apache/cassandra/distributed/shared/ShutdownException.java
@@ -27,4 +27,4 @@
         super("Uncaught exceptions were thrown during test");
         uncaughtExceptions.forEach(super::addSuppressed);
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/AbstractEncryptionOptionsImpl.java b/test/distributed/org/apache/cassandra/distributed/test/AbstractEncryptionOptionsImpl.java
index 3ca69c8..1c5ddbf 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/AbstractEncryptionOptionsImpl.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/AbstractEncryptionOptionsImpl.java
@@ -21,7 +21,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Map;
-import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
 
@@ -29,6 +28,7 @@
 import javax.net.ssl.SSLSession;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.Assert;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -50,8 +50,13 @@
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.security.ISslContextFactory;
 import org.apache.cassandra.security.SSLFactory;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.distributed.test.AbstractEncryptionOptionsImpl.ConnectResult.CONNECTING;
+import static org.apache.cassandra.distributed.test.AbstractEncryptionOptionsImpl.ConnectResult.UNINITIALIZED;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
 public class AbstractEncryptionOptionsImpl extends TestBaseImpl
 {
@@ -189,17 +194,17 @@
         ConnectResult connect() throws Throwable
         {
             AtomicInteger connectAttempts = new AtomicInteger(0);
-            result.set(ConnectResult.UNINITIALIZED);
+            result.set(UNINITIALIZED);
             setLastThrowable(null);
             setProtocolAndCipher(null, null);
 
             SslContext sslContext = SSLFactory.getOrCreateSslContext(
                 encryptionOptions.withAcceptedProtocols(acceptedProtocols).withCipherSuites(cipherSuites),
-                true, SSLFactory.SocketType.CLIENT);
+                true, ISslContextFactory.SocketType.CLIENT);
 
             EventLoopGroup workerGroup = new NioEventLoopGroup();
             Bootstrap b = new Bootstrap();
-            SimpleCondition attemptCompleted = new SimpleCondition();
+            Condition attemptCompleted = newOneTimeCondition();
 
             // Listener on the SSL handshake makes sure that the test completes immediately as
             // the server waits to receive a message over the TLS connection, so the discardHandler.decode
@@ -296,12 +301,12 @@
                 }
             });
 
-            result.set(ConnectResult.CONNECTING);
+            result.set(CONNECTING);
             ChannelFuture f = b.connect(host, port);
             try
             {
                 f.sync();
-                attemptCompleted.await(15, TimeUnit.SECONDS);
+                attemptCompleted.await(15, SECONDS);
             }
             finally
             {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsBootstrapStreaming.java b/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsBootstrapStreaming.java
index 7aca7bd..d327fd7 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsBootstrapStreaming.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsBootstrapStreaming.java
@@ -36,12 +36,22 @@
     protected void executeTest(final boolean streamEntireSSTables,
                                final boolean compressionEnabled) throws Exception
     {
+        executeTest(streamEntireSSTables, compressionEnabled, 1);
+    }
+
+    protected void executeTest(final boolean streamEntireSSTables,
+                               final boolean compressionEnabled,
+                               final int throughput) throws Exception
+    {
         final Cluster.Builder builder = builder().withNodes(1)
                                                  .withTokenSupplier(TokenSupplier.evenlyDistributedTokens(2))
                                                  .withNodeIdTopology(NetworkTopology.singleDcNetworkTopology(2, "dc0", "rack0"))
                                                  .withConfig(config -> config.with(NETWORK, GOSSIP, NATIVE_PROTOCOL)
-                                                                             .set("stream_throughput_outbound_megabits_per_sec", 1)
-                                                                             .set("compaction_throughput_mb_per_sec", 1)
+                                                                             .set(streamEntireSSTables
+                                                                                  ? "entire_sstable_stream_throughput_outbound"
+                                                                                  : "stream_throughput_outbound",
+                                                                                  throughput+"MiB/s")
+                                                                             .set("compaction_throughput", "1MiB/s")
                                                                              .set("stream_entire_sstables", streamEntireSSTables));
 
         try (final Cluster cluster = builder.withNodes(1).start())
@@ -52,14 +62,7 @@
 
             cluster.get(1).nodetoolResult("disableautocompaction", "netstats_test").asserts().success();
 
-            if (compressionEnabled)
-            {
-                populateData(true);
-            }
-            else
-            {
-                populateData(false);
-            }
+            populateData(compressionEnabled);
 
             cluster.get(1).flush("netstats_test");
 
@@ -74,8 +77,10 @@
             final Future<?> startupRunnable = executorService.submit((Runnable) secondNode::startup);
             final Future<AbstractNetstatsStreaming.NetstatResults> netstatsFuture = executorService.submit(new NetstatsCallable(cluster.get(1)));
 
+            startupRunnable.get(3, MINUTES);
+            // 1m is a bit much, but should be fine on slower environments.  Node2 can't come up without streaming
+            // completing, so if node2 is up 1m is enough time for the nodetool watcher to yield
             final AbstractNetstatsStreaming.NetstatResults results = netstatsFuture.get(1, MINUTES);
-            startupRunnable.get(2, MINUTES);
 
             results.assertSuccessful();
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsStreaming.java b/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsStreaming.java
index 2e828e0..93d26f1 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsStreaming.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/AbstractNetstatsStreaming.java
@@ -40,6 +40,7 @@
 import com.datastax.driver.core.Session;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.LogResult;
 import org.apache.cassandra.distributed.api.NodeToolResult;
 import org.apache.cassandra.utils.Pair;
 
@@ -509,6 +510,7 @@
 
             boolean sawAnyStreamingOutput = false;
 
+            long mark = 0;
             while (true)
             {
                 try
@@ -523,6 +525,20 @@
                         {
                             sawAnyStreamingOutput = true;
                         }
+                        else
+                        {
+                            // there is a race condition that streaming starts/stops between calls to netstats
+                            // to detect this, check to see if the node has completed a stream
+                            // expected log: [Stream (.*)?] All sessions completed
+                            LogResult<List<String>> logs = node.logs().grep(mark, "\\[Stream .*\\] All sessions completed");
+                            mark = logs.getMark();
+                            if (!logs.getResult().isEmpty())
+                            {
+                                // race condition detected...
+                                logger.info("Test race condition detected where streaming started/stopped between calls to netstats");
+                                sawAnyStreamingOutput = true;
+                            }
+                        }
                     }
 
                     if (sawAnyStreamingOutput && (!result.getStdout().contains("Receiving") && !result.getStdout().contains("Sending")))
diff --git a/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java b/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java
index b8912b2..2061c291 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/AlterTest.java
@@ -18,17 +18,29 @@
 
 package org.apache.cassandra.distributed.test;
 
+import java.util.List;
+
+import com.google.common.collect.ImmutableMap;
 import org.junit.Assert;
 import org.junit.Test;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.cql3.Lists;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.ICluster;
 import org.apache.cassandra.distributed.api.IInstanceConfig;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.distributed.api.IIsolatedExecutor;
 import org.apache.cassandra.distributed.api.SimpleQueryResult;
+import org.apache.cassandra.distributed.api.TokenSupplier;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
+import org.apache.cassandra.distributed.util.QueryResultUtil;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.Throwables;
 
 import static org.apache.cassandra.distributed.action.GossipHelper.withProperty;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.ONE;
@@ -39,6 +51,7 @@
 import static org.apache.cassandra.distributed.shared.NetworkTopology.singleDcNetworkTopology;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
 
 public class AlterTest extends TestBaseImpl
 {
@@ -107,4 +120,73 @@
             }
         }
     }
+
+    @Test
+    public void unknownMemtableConfigurationTest() throws Throwable
+    {
+        Logger logger = LoggerFactory.getLogger(getClass());
+        try (Cluster cluster = Cluster.build(1)
+                                      .withTokenSupplier(TokenSupplier.evenlyDistributedTokens(3, 1))
+                                      .withConfig(c -> c.with(Feature.values())
+                                                        .set("memtable", ImmutableMap.of(
+                                                        "configurations", ImmutableMap.of(
+                                                            "testconfig", ImmutableMap.of(
+                                                                "class_name", "SkipListMemtable")))))
+                                      .start())
+        {
+            init(cluster);
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int PRIMARY KEY)");
+
+            // Start Node 2 without the memtable configuration definition.
+            IInvokableInstance node1 = cluster.get(1);
+            IInvokableInstance node2 = ClusterUtils.addInstance(cluster, node1.config(), c -> c.set("memtable", ImmutableMap.of()));
+            node2.startup(cluster);
+
+            try
+            {
+                cluster.schemaChange("ALTER TABLE " + KEYSPACE + ".tbl WITH memtable = 'testconfig'", false, node2);
+                fail("Expected ALTER to fail with unknown memtable configuration.");
+            }
+            catch (Throwable t)
+            {
+                // expected
+                logger.info("Expected: {}", t.getMessage());
+                Assert.assertTrue(Throwables.isCausedBy(t, x -> x.getMessage().matches("Memtable configuration.*not found.*")));
+            }
+            long mark = node2.logs().mark();
+
+            cluster.schemaChange("ALTER TABLE " + KEYSPACE + ".tbl WITH memtable = 'testconfig'", false, node1);
+            // the above should succeed, the configuration is acceptable to node1
+
+            final String schema1 = QueryResultUtil.expand(node1.executeInternalWithResult("SELECT * FROM system_schema.tables WHERE keyspace_name=?", KEYSPACE));
+            final String schema2 = QueryResultUtil.expand(node2.executeInternalWithResult("SELECT * FROM system_schema.tables WHERE keyspace_name=?", KEYSPACE));
+            logger.info("node1 schema: \n{}", schema1);
+            logger.info("node2 schema: \n{}", schema2);
+            Assert.assertEquals(schema1, schema2);
+            List<String> errorInLog = node2.logs().grep(mark, "ERROR.*Invalid memtable configuration.*").getResult();
+            Assert.assertTrue(errorInLog.size() > 0);
+            logger.info(Lists.listToString(errorInLog));
+
+            // Add a new node that has an invalid definition but should accept the already defined table schema.
+            IInvokableInstance node3 = ClusterUtils.addInstance(cluster,
+                                                                node2.config(),
+                                                                c -> c.set("memtable", ImmutableMap.of(
+                                                                "configurations", ImmutableMap.of(
+                                                                    "testconfig", ImmutableMap.of(
+                                                                        "class_name", "NotExistingMemtable")))));
+            node3.startup(cluster);
+            final String schema3 = QueryResultUtil.expand(node3.executeInternalWithResult("SELECT * FROM system_schema.tables WHERE keyspace_name=?", KEYSPACE));
+            logger.info("node3 schema: \n{}", schema3);
+            Assert.assertEquals(schema1, schema3);
+
+            errorInLog = node3.logs().grep("ERROR.*Invalid memtable configuration.*").getResult();
+            Assert.assertTrue(errorInLog.size() > 0);
+            logger.info(Lists.listToString(errorInLog));
+
+            // verify that all nodes can write to the table
+            node1.executeInternalWithResult("INSERT INTO " + KEYSPACE + ".tbl (pk) VALUES (?)", 1);
+            node2.executeInternalWithResult("INSERT INTO " + KEYSPACE + ".tbl (pk) VALUES (?)", 2);
+            node3.executeInternalWithResult("INSERT INTO " + KEYSPACE + ".tbl (pk) VALUES (?)", 3);
+        }
+    }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/AutoSnapshotTtlTest.java b/test/distributed/org/apache/cassandra/distributed/test/AutoSnapshotTtlTest.java
new file mode 100644
index 0000000..550cbdc
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/AutoSnapshotTtlTest.java
@@ -0,0 +1,196 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.shared.WithProperties;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.db.ColumnFamilyStore.SNAPSHOT_DROP_PREFIX;
+import static org.apache.cassandra.db.ColumnFamilyStore.SNAPSHOT_TRUNCATE_PREFIX;
+import static org.apache.cassandra.distributed.Cluster.build;
+import static org.apache.cassandra.distributed.shared.ClusterUtils.stopUnchecked;
+import static org.awaitility.Awaitility.await;
+
+public class AutoSnapshotTtlTest extends TestBaseImpl
+{
+    public static final Integer SNAPSHOT_CLEANUP_PERIOD_SECONDS = 1;
+    public static final Integer FIVE_SECONDS = 5;
+    private static WithProperties properties = new WithProperties();
+
+    @BeforeClass
+    public static void beforeClass() throws Throwable
+    {
+        TestBaseImpl.beforeClass();
+        properties.set(CassandraRelevantProperties.SNAPSHOT_CLEANUP_INITIAL_DELAY_SECONDS, 0);
+        properties.set(CassandraRelevantProperties.SNAPSHOT_CLEANUP_PERIOD_SECONDS, SNAPSHOT_CLEANUP_PERIOD_SECONDS);
+        properties.set(CassandraRelevantProperties.SNAPSHOT_MIN_ALLOWED_TTL_SECONDS, FIVE_SECONDS);
+    }
+
+    @AfterClass
+    public static void after()
+    {
+        properties.close();
+    }
+
+    /**
+     * Check that when auto_snapshot_ttl=5s, snapshots created from TRUNCATE are expired after 10s
+     */
+    @Test
+    public void testAutoSnapshotTTlOnTruncate() throws IOException
+    {
+        try (Cluster cluster = init(build().withNodes(1)
+                                      .withConfig(c -> c.with(Feature.GOSSIP)
+                                                        .set("auto_snapshot_ttl", String.format("%ds", FIVE_SECONDS)))
+                                      .start()))
+        {
+            IInvokableInstance instance = cluster.get(1);
+
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+
+            populate(cluster);
+
+            // Truncate Table
+            cluster.schemaChange(withKeyspace("TRUNCATE %s.tbl;"));
+
+            // Check snapshot is listed after table is truncated
+            instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains(SNAPSHOT_TRUNCATE_PREFIX);
+
+            // Check snapshot is removed after 10s
+            await().timeout(10, SECONDS)
+                   .pollInterval(1, SECONDS)
+                   .until(() -> !instance.nodetoolResult("listsnapshots").getStdout().contains(SNAPSHOT_DROP_PREFIX));
+        }
+    }
+
+    /**
+     * Check that when auto_snapshot_ttl=5s, snapshots created from TRUNCATE are expired after 10s
+     */
+    @Test
+    public void testAutoSnapshotTTlOnDrop() throws IOException
+    {
+        try (Cluster cluster = init(build().withNodes(1)
+                                      .withConfig(c -> c.with(Feature.GOSSIP)
+                                                                  .set("auto_snapshot_ttl", String.format("%ds", FIVE_SECONDS)))
+                                      .start()))
+        {
+            IInvokableInstance instance = cluster.get(1);
+
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+
+            populate(cluster);
+
+            // Drop Table
+            cluster.schemaChange(withKeyspace("DROP TABLE %s.tbl;"));
+
+            // Check snapshot is listed after table is dropped
+            instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains(SNAPSHOT_DROP_PREFIX);
+
+            // Check snapshot is removed after 10s
+            await().timeout(10, SECONDS)
+                   .pollInterval(1, SECONDS)
+                   .until(() -> !instance.nodetoolResult("listsnapshots").getStdout().contains(SNAPSHOT_DROP_PREFIX));
+        }
+    }
+
+    /**
+     * Check that when auto_snapshot_ttl=60s, snapshots created from DROP TABLE are expired after a node restart
+     */
+    @Test
+    public void testAutoSnapshotTTlOnDropAfterRestart() throws IOException
+    {
+        int ONE_MINUTE = 60; // longer TTL to allow snapshot to survive node restart
+        try (Cluster cluster = init(build().withNodes(1)
+                                           .withConfig(c -> c.with(Feature.GOSSIP)
+                                                             .set("auto_snapshot_ttl", String.format("%ds", ONE_MINUTE)))
+                                           .start()))
+        {
+            IInvokableInstance instance = cluster.get(1);
+
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+
+            populate(cluster);
+
+            // Drop Table
+            cluster.schemaChange(withKeyspace("DROP TABLE %s.tbl;"));
+
+            // Restart node
+            stopUnchecked(instance);
+            instance.startup();
+
+            // Check snapshot is listed after restart
+            instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains(SNAPSHOT_DROP_PREFIX);
+
+            // Check snapshot is removed after at most auto_snapshot_ttl + 1s
+            await().timeout(ONE_MINUTE + 1, SECONDS)
+                   .pollInterval(1, SECONDS)
+                   .until(() -> !instance.nodetoolResult("listsnapshots").getStdout().contains(SNAPSHOT_DROP_PREFIX));
+        }
+    }
+
+    /**
+     * Check that when auto_snapshot_ttl is unset, snapshots created from DROP or TRUNCATE do not expire
+     */
+    @Test
+    public void testAutoSnapshotTtlDisabled() throws IOException, InterruptedException
+    {
+        try (Cluster cluster = init(build().withNodes(1)
+                                      .withConfig(c -> c.with(Feature.GOSSIP))
+                                      .start()))
+        {
+            IInvokableInstance instance = cluster.get(1);
+
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+
+            populate(cluster);
+
+            // Truncate Table
+            cluster.schemaChange(withKeyspace("TRUNCATE %s.tbl;"));
+
+            // Drop Table
+            cluster.schemaChange(withKeyspace("DROP TABLE %s.tbl;"));
+
+            // Check snapshots are created after table is truncated and dropped
+            instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains(SNAPSHOT_TRUNCATE_PREFIX);
+            instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains(SNAPSHOT_DROP_PREFIX);
+
+            // Check snapshot are *NOT* expired after 10s
+            Thread.sleep(2 * FIVE_SECONDS * 1000L);
+            instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains(ColumnFamilyStore.SNAPSHOT_TRUNCATE_PREFIX);
+            instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains(ColumnFamilyStore.SNAPSHOT_DROP_PREFIX);
+        }
+    }
+
+    protected static void populate(Cluster cluster)
+    {
+        for (int i = 0; i < 100; i++)
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.tbl (key, value) VALUES (?, 'txt')"), ConsistencyLevel.ONE, i);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java b/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java
index a7ac605..3f50c30 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/BootstrapBinaryDisabledTest.java
@@ -36,7 +36,7 @@
 import org.apache.cassandra.distributed.api.TokenSupplier;
 import org.apache.cassandra.distributed.shared.Byteman;
 import org.apache.cassandra.distributed.shared.NetworkTopology;
-import org.apache.cassandra.distributed.shared.Shared;
+import org.apache.cassandra.utils.Shared;
 
 /**
  * Replaces python dtest bootstrap_test.py::TestBootstrap::test_bootstrap_binary_disabled
@@ -50,8 +50,8 @@
         config.put("authenticator", "org.apache.cassandra.auth.PasswordAuthenticator");
         config.put("authorizer", "org.apache.cassandra.auth.CassandraAuthorizer");
         config.put("role_manager", "org.apache.cassandra.auth.CassandraRoleManager");
-        config.put("permissions_validity_in_ms", 0);
-        config.put("roles_validity_in_ms", 0);
+        config.put("permissions_validity", "0ms");
+        config.put("roles_validity", "0ms");
 
         int originalNodeCount = 1;
         int expandedNodeCount = originalNodeCount + 2;
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASAddTest.java b/test/distributed/org/apache/cassandra/distributed/test/CASAddTest.java
new file mode 100644
index 0000000..d6c892e
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASAddTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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.distributed.test;
+
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.utils.AssertionUtils;
+import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
+import static org.apache.cassandra.distributed.shared.AssertUtils.row;
+
+public class CASAddTest extends TestBaseImpl
+{
+    private static final Logger logger = LoggerFactory.getLogger(CASAddTest.class);
+
+    /**
+     * The {@code cas_contention_timeout} used during the tests
+     */
+    private static final long CONTENTION_TIMEOUT = 1000L;
+
+    /**
+     * The {@code write_request_timeout} used during the tests
+     */
+    private static final long REQUEST_TIMEOUT = 1000L;
+
+    @Test
+    public void testAddition() throws Throwable
+    {
+        try (Cluster cluster = init(Cluster.create(3)))
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int PRIMARY KEY, v int)");
+
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, v) VALUES (1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, 1));
+            
+            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = v + 1 WHERE pk = 1 IF v = 2", ConsistencyLevel.QUORUM);
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, 1));
+
+            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = v + 1 WHERE pk = 1 IF v = 1", ConsistencyLevel.QUORUM);
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, 2));
+        }
+    }
+
+    @Test
+    public void testAdditionNotExists() throws Throwable
+    {
+        try (Cluster cluster = init(Cluster.create(3)))
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int PRIMARY KEY, a int, b text)");
+
+            // in this context partition/row not existing looks like column not existing, so to simplify the LWT required
+            // condition, add a row with null columns so can rely on IF EXISTS
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk) VALUES (1)", ConsistencyLevel.QUORUM);
+
+            // n = n + value where n = null
+            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET a = a + 1, b = b + 'fail' WHERE pk = 1 IF EXISTS", ConsistencyLevel.QUORUM);
+            // the SET should all no-op due to null... so should no-op
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, null, null));
+
+            // this section is testing current limitations... if they start to fail due to the limitations going away... update this test to include those cases
+            Assertions.assertThatThrownBy(() -> cluster.coordinator(1).execute(batch(
+                      "INSERT INTO " + KEYSPACE + ".tbl (pk, a, b) VALUES (1, 0, '') IF NOT EXISTS",
+                      "UPDATE " + KEYSPACE + ".tbl SET a = a + 1, b = b + 'success' WHERE pk = 1 IF EXISTS"
+                      ), ConsistencyLevel.QUORUM))
+                      .is(AssertionUtils.is(InvalidRequestException.class))
+                      .hasMessage("Cannot mix IF EXISTS and IF NOT EXISTS conditions for the same row");
+            Assertions.assertThatThrownBy(() -> cluster.coordinator(1).execute(batch(
+                      "INSERT INTO " + KEYSPACE + ".tbl (pk, a, b) VALUES (1, 0, '') IF NOT EXISTS",
+
+                      "UPDATE " + KEYSPACE + ".tbl SET a = a + 1, b = b + 'success' WHERE pk = 1"
+                      ), ConsistencyLevel.QUORUM))
+                      .is(AssertionUtils.is(InvalidRequestException.class))
+                      .hasMessage("Invalid operation (a = a + 1) for non counter column a");
+
+            // since CAS doesn't allow the above cases, manually add the data to unblock...
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, a, b) VALUES (1, 0, '')", ConsistencyLevel.QUORUM);
+
+            // have cas add defaults when missing
+            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET a = a + 1, b = b + 'success' WHERE pk = 1 IF EXISTS", ConsistencyLevel.QUORUM);
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, 1, "success"));
+        }
+    }
+
+    @Test
+    public void testConcat() throws Throwable
+    {
+        try (Cluster cluster = init(Cluster.create(3)))
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int PRIMARY KEY, v text)");
+
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, v) VALUES (1, 'foo') IF NOT EXISTS", ConsistencyLevel.QUORUM);
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, "foo"));
+
+            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = v + 'bar' WHERE pk = 1 IF v = 'foobar'", ConsistencyLevel.QUORUM);
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, "foo"));
+
+            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = v + 'bar' WHERE pk = 1 IF v = 'foo'", ConsistencyLevel.QUORUM);
+            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL), row(1, "foobar"));
+        }
+    }
+
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASCommonTestCases.java b/test/distributed/org/apache/cassandra/distributed/test/CASCommonTestCases.java
new file mode 100644
index 0000000..151abb7
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASCommonTestCases.java
@@ -0,0 +1,204 @@
+/*
+ * 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.distributed.test;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IMessageFilters;
+import org.apache.cassandra.exceptions.CasWriteTimeoutException;
+
+import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
+import static org.apache.cassandra.distributed.shared.AssertUtils.row;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PROPOSE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_PROPOSE_REQ;
+
+public abstract class CASCommonTestCases extends CASTestBase
+{
+    protected abstract Cluster getCluster();
+
+    @Test
+    public void simpleUpdate() throws Throwable
+    {
+        String tableName = tableName();
+        String fullTableName = KEYSPACE + "." + tableName;
+        getCluster().schemaChange("CREATE TABLE " + fullTableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        getCluster().coordinator(1).execute("INSERT INTO " + fullTableName + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+        assertRows(getCluster().coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL),
+                   row(1, 1, 1));
+        getCluster().coordinator(1).execute("UPDATE " + fullTableName + " SET v = 3 WHERE pk = 1 and ck = 1 IF v = 2", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+        assertRows(getCluster().coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL),
+                   row(1, 1, 1));
+        getCluster().coordinator(1).execute("UPDATE " + fullTableName + " SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+        assertRows(getCluster().coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL),
+                   row(1, 1, 2));
+    }
+
+    @Test
+    public void incompletePrepare() throws Throwable
+    {
+        String tableName = tableName();
+        String fullTableName = KEYSPACE + "." + tableName;
+        getCluster().schemaChange("CREATE TABLE " + fullTableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        IMessageFilters.Filter drop = getCluster().filters().verbs(PAXOS2_PREPARE_REQ.id, PAXOS_PREPARE_REQ.id).from(1).to(2, 3).drop();
+        try
+        {
+            getCluster().coordinator(1).execute("INSERT INTO " + fullTableName + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+            Assert.assertTrue(false);
+        }
+        catch (RuntimeException t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw new AssertionError(t);
+        }
+        drop.off();
+        getCluster().coordinator(1).execute("UPDATE " + fullTableName + " SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+        assertRows(getCluster().coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL));
+    }
+
+    @Test
+    public void incompletePropose() throws Throwable
+    {
+        String tableName = tableName();
+        String fullTableName = KEYSPACE + "." + tableName;
+        getCluster().schemaChange("CREATE TABLE " + fullTableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        IMessageFilters.Filter drop1 = getCluster().filters().verbs(PAXOS2_PROPOSE_REQ.id, PAXOS_PROPOSE_REQ.id).from(1).to(2, 3).drop();
+        try
+        {
+            getCluster().coordinator(1).execute("INSERT INTO " + fullTableName + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+            Assert.assertTrue(false);
+        }
+        catch (RuntimeException t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw new AssertionError(t);
+        }
+        drop1.off();
+        // make sure we encounter one of the in-progress proposals so we complete it
+        drop(getCluster(), 1, to(2), to(), to());
+        getCluster().coordinator(1).execute("UPDATE " + fullTableName + " SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+        assertRows(getCluster().coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL),
+                   row(1, 1, 2));
+    }
+
+    @Test
+    public void incompleteCommit() throws Throwable
+    {
+        String tableName = tableName();
+        String fullTableName = KEYSPACE + "." + tableName;
+        getCluster().schemaChange("CREATE TABLE " + fullTableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        try (AutoCloseable drop = drop(getCluster(), 1, to(), to(), to(2, 3)))
+        {
+            getCluster().coordinator(1).execute("INSERT INTO " + fullTableName + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+            Assert.assertTrue(false);
+        }
+        catch (RuntimeException t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw new AssertionError(t);
+        }
+
+        // make sure we see one of the successful commits
+        try (AutoCloseable drop = drop(getCluster(), 1, to(2), to(2), to()))
+        {
+            getCluster().coordinator(1).execute("UPDATE " + fullTableName + " SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM);
+            assertRows(getCluster().coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL),
+                       row(1, 1, 2));
+        }
+    }
+
+    /**
+     *  - Prepare A to {1, 2, 3}
+     *  - Propose A to {1}
+     */
+    @Test
+    public void testRepairIncompletePropose() throws Throwable
+    {
+        String tableName = tableName();
+        String fullTableName = KEYSPACE + "." + tableName;
+        getCluster().schemaChange("CREATE TABLE " + fullTableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        for (int repairWithout = 1 ; repairWithout <= 3 ; ++repairWithout)
+        {
+            try (AutoCloseable drop = drop(getCluster(), 1, to(), to(2, 3), to()))
+            {
+                getCluster().coordinator(1).execute("INSERT INTO " + fullTableName + " (pk, ck, v) VALUES (?, 1, 1) IF NOT EXISTS", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM, repairWithout);
+                Assert.assertTrue(false);
+            }
+            catch (RuntimeException t)
+            {
+                if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                    throw new AssertionError(t);
+            }
+            int repairWith = repairWithout == 3 ? 2 : 3;
+            repair(getCluster(), tableName, repairWithout, repairWith, repairWithout);
+
+            try (AutoCloseable drop = drop(getCluster(), repairWith, to(repairWithout), to(), to()))
+            {
+                Object[][] rows = getCluster().coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = ?", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM, repairWithout);
+                if (repairWithout == 1) assertRows(rows); // invalidated
+                else assertRows(rows, row(repairWithout, 1, 1)); // finished
+            }
+        }
+    }
+
+    /**
+     *  - Prepare A to {1, 2, 3}
+     *  - Propose A to {1, 2}
+     *  -  Commit A to {1}
+     *  - Repair using {2, 3}
+     */
+    @Test
+    public void testRepairIncompleteCommit() throws Throwable
+    {
+        String tableName = tableName();
+        String fullTableName = KEYSPACE + "." + tableName;
+        getCluster().schemaChange("CREATE TABLE " + fullTableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        for (int repairWithout = 1 ; repairWithout <= 3 ; ++repairWithout)
+        {
+            try (AutoCloseable drop = drop(getCluster(), 1, to(), to(3), to(2, 3)))
+            {
+                getCluster().coordinator(1).execute("INSERT INTO " + fullTableName + " (pk, ck, v) VALUES (?, 1, 1) IF NOT EXISTS", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM, repairWithout);
+                Assert.assertTrue(false);
+            }
+            catch (RuntimeException t)
+            {
+                if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                    throw new AssertionError(t);
+            }
+
+            int repairWith = repairWithout == 3 ? 2 : 3;
+            repair(getCluster(), tableName, repairWithout, repairWith, repairWithout);
+            try (AutoCloseable drop = drop(getCluster(), repairWith, to(repairWithout), to(), to()))
+            {
+                //TODO dtest api is missing one with message?  booo... removed "" + repairWithout,
+                assertRows(getCluster().coordinator(repairWith).execute("SELECT * FROM " + fullTableName + " WHERE pk = ?", org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM, repairWithout),
+                           row(repairWithout, 1, 1));
+            }
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASContentionTest.java b/test/distributed/org/apache/cassandra/distributed/test/CASContentionTest.java
new file mode 100644
index 0000000..aafbc45
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASContentionTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.distributed.test;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.service.paxos.ContentionStrategy;
+import org.apache.cassandra.utils.FBUtilities;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REQ;
+
+public class CASContentionTest extends CASTestBase
+{
+    private static Cluster THREE_NODES;
+
+    @BeforeClass
+    public static void beforeClass() throws Throwable
+    {
+        System.setProperty("cassandra.paxos.use_self_execution", "false");
+        TestBaseImpl.beforeClass();
+        Consumer<IInstanceConfig> conf = config -> config
+                .set("paxos_variant", "v2")
+                .set("write_request_timeout_in_ms", 20000L)
+                .set("cas_contention_timeout_in_ms", 20000L)
+                .set("request_timeout_in_ms", 20000L);
+        THREE_NODES = init(Cluster.create(3, conf));
+    }
+
+    @AfterClass
+    public static void afterClass()
+    {
+        if (THREE_NODES != null)
+            THREE_NODES.close();
+    }
+
+    @Test
+    public void testDynamicContentionTracing() throws Throwable
+    {
+        try
+        {
+
+            String tableName = tableName("tbl");
+            THREE_NODES.schemaChange("CREATE TABLE " + KEYSPACE + '.' + tableName + " (pk int, v int, PRIMARY KEY (pk))");
+
+            CountDownLatch haveStarted = new CountDownLatch(1);
+            CountDownLatch haveInvalidated = new CountDownLatch(1);
+            THREE_NODES.verbs(PAXOS2_PREPARE_REQ).from(1).messagesMatching((from, to, verb) -> {
+                haveStarted.countDown();
+                Uninterruptibles.awaitUninterruptibly(haveInvalidated);
+                return false;
+            }).drop();
+            THREE_NODES.get(1).runOnInstance(() -> ContentionStrategy.setStrategy("trace=1"));
+            Future<?> insert = THREE_NODES.get(1).async(() -> {
+                THREE_NODES.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + tableName + " (pk, v) VALUES (1, 1) IF NOT EXISTS", QUORUM);
+            }).call();
+            haveStarted.await();
+            THREE_NODES.coordinator(2).execute("INSERT INTO " + KEYSPACE + '.' + tableName + " (pk, v) VALUES (1, 1) IF NOT EXISTS", QUORUM);
+            haveInvalidated.countDown();
+            THREE_NODES.filters().reset();
+            insert.get();
+            Uninterruptibles.sleepUninterruptibly(1L, TimeUnit.SECONDS);
+            THREE_NODES.forEach(i -> i.runOnInstance(() -> FBUtilities.waitOnFuture(Stage.TRACING.submit(() -> {}))));
+            Object[][] result = THREE_NODES.coordinator(1).execute("SELECT parameters FROM system_traces.sessions", QUORUM);
+            Assert.assertEquals(1, result.length);
+            Assert.assertEquals(1, result[0].length);
+            Assert.assertTrue(Map.class.isAssignableFrom(result[0][0].getClass()));
+            Map<?, ?> params = (Map<?, ?>) result[0][0];
+            Assert.assertEquals("SERIAL", params.get("consistency"));
+            Assert.assertEquals(tableName, params.get("table"));
+            Assert.assertEquals(KEYSPACE, params.get("keyspace"));
+            Assert.assertEquals("1", params.get("partitionKey"));
+            Assert.assertEquals("write", params.get("kind"));
+        }
+        finally
+        {
+            THREE_NODES.filters().reset();
+        }
+    }
+
+
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASMultiDCTest.java b/test/distributed/org/apache/cassandra/distributed/test/CASMultiDCTest.java
new file mode 100644
index 0000000..e36f34b
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASMultiDCTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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.distributed.test;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.service.paxos.PaxosCommit;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.*;
+
+public class CASMultiDCTest
+{
+    private static Cluster CLUSTER;
+    private static final String KEYSPACE = "ks";
+    private static final String TABLE = "tbl";
+    private static final String KS_TBL = KEYSPACE + '.' + TABLE;
+
+    private static final AtomicInteger nextKey = new AtomicInteger();
+
+    @BeforeClass
+    public static void beforeClass() throws Throwable
+    {
+        TestBaseImpl.beforeClass();
+        Consumer<IInstanceConfig> conf = config -> config
+                                                   .with(Feature.NETWORK)
+                                                   .set("paxos_variant", "v2")
+                                                   .set("write_request_timeout_in_ms", 1000L)
+                                                   .set("cas_contention_timeout_in_ms", 1000L)
+                                                   .set("request_timeout_in_ms", 1000L);
+
+        Cluster.Builder builder = new Cluster.Builder();
+        builder.withNodes(4);
+        builder.withDCs(2);
+        builder.withConfig(conf);
+        CLUSTER = builder.start();
+        CLUSTER.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'NetworkTopologyStrategy', 'datacenter1':2, 'datacenter2':2};");
+        CLUSTER.schemaChange("CREATE TABLE " + KS_TBL + " (k int, c int, v int, primary key (k, v))");
+        CLUSTER.forEach(i -> i.runOnInstance(() -> {
+            Assert.assertTrue(PaxosCommit.getEnableDcLocalCommit()); // should be enabled by default
+        }));
+    }
+
+    @Before
+    public void setUp()
+    {
+        CLUSTER.forEach(i -> i.runOnInstance(() -> {
+            PaxosCommit.setEnableDcLocalCommit(true);
+        }));
+    }
+
+    private static void testLocalSerialCommit(ConsistencyLevel serialCL, ConsistencyLevel commitCL, int key, boolean expectRemoteCommit)
+    {
+        for (int i=0; i<CLUSTER.size(); i++)
+        {
+            CLUSTER.get(i + 1).runOnInstance(() -> {
+                UntypedResultSet result = QueryProcessor.executeInternal("SELECT * FROM system.paxos WHERE row_key=?", ByteBufferUtil.bytes(key));
+                Assert.assertEquals(0, result.size());
+            });
+        }
+
+        CLUSTER.coordinator(1).execute("INSERT INTO " + KS_TBL + " (k, c, v) VALUES (?, ?, ?) IF NOT EXISTS", serialCL, commitCL, key, key, key);
+
+        int numCommitted = 0;
+        int numWritten = 0;
+        for (int i=0; i<CLUSTER.size(); i++)
+        {
+            boolean expectPaxosRows = expectRemoteCommit || i < 2;
+            int flags = CLUSTER.get(i + 1).callOnInstance(() -> {
+                int numPaxosRows = QueryProcessor.executeInternal("SELECT * FROM system.paxos WHERE row_key=?", ByteBufferUtil.bytes(key)).size();
+                Assert.assertTrue(numPaxosRows == 0 || numPaxosRows == 1);
+                if (!expectRemoteCommit)
+                    Assert.assertEquals(expectPaxosRows ? 1 : 0, numPaxosRows);
+                int numTableRows = QueryProcessor.executeInternal("SELECT * FROM " + KS_TBL + " WHERE k=?", ByteBufferUtil.bytes(key)).size();
+                Assert.assertTrue(numTableRows == 0 || numTableRows == 1);
+                return (numPaxosRows > 0 ? 1 : 0) | (numTableRows > 0 ? 2 : 0);
+            });
+            if ((flags & 1) != 0)
+                numCommitted++;
+            if ((flags & 2) != 0)
+                numWritten++;
+        }
+        Assert.assertTrue(String.format("numWritten: %s < 3", numWritten), numWritten >= 3);
+        if (expectRemoteCommit)
+            Assert.assertTrue(String.format("numCommitted: %s < 3", numCommitted), numCommitted >= 3);
+        else
+            Assert.assertEquals(2, numCommitted);
+    }
+
+    @Test
+    public void testLocalSerialLocalCommit()
+    {
+        testLocalSerialCommit(LOCAL_SERIAL, LOCAL_QUORUM, nextKey.getAndIncrement(), false);
+    }
+
+    @Test
+    public void testLocalSerialQuorumCommit()
+    {
+        testLocalSerialCommit(LOCAL_SERIAL, QUORUM, nextKey.getAndIncrement(), false);
+    }
+
+    @Test
+    public void testSerialLocalCommit()
+    {
+        testLocalSerialCommit(SERIAL, LOCAL_QUORUM, nextKey.getAndIncrement(), true);
+    }
+
+    @Test
+    public void testSerialQuorumCommit()
+    {
+        testLocalSerialCommit(SERIAL, QUORUM, nextKey.getAndIncrement(), true);
+    }
+
+    @Test
+    public void testDcLocalCommitDisabled()
+    {
+        CLUSTER.forEach(i -> i.runOnInstance(() -> {
+            PaxosCommit.setEnableDcLocalCommit(false);
+        }));
+        testLocalSerialCommit(LOCAL_SERIAL, QUORUM, nextKey.getAndIncrement(), true);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASTest.java b/test/distributed/org/apache/cassandra/distributed/test/CASTest.java
index 91d26f8..8e2b8ac 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/CASTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASTest.java
@@ -19,261 +19,180 @@
 package org.apache.cassandra.distributed.test;
 
 import java.io.IOException;
-import java.util.UUID;
 import java.util.function.BiConsumer;
+import java.util.function.Consumer;
 
 
+import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Test;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.marshal.Int32Type;
-import org.apache.cassandra.dht.Murmur3Partitioner;
-import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.ICoordinator;
-import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
 import org.apache.cassandra.distributed.api.IMessageFilters;
-import org.apache.cassandra.distributed.impl.Instance;
-import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.exceptions.CasWriteTimeoutException;
 
+import org.apache.cassandra.utils.FBUtilities;
+
+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;
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
-import static org.apache.cassandra.distributed.shared.AssertUtils.fail;
 import static org.apache.cassandra.distributed.shared.AssertUtils.row;
+import static org.apache.cassandra.net.Verb.PAXOS2_COMMIT_AND_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REFRESH_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PROPOSE_REQ;
 import static org.apache.cassandra.net.Verb.PAXOS_COMMIT_REQ;
 import static org.apache.cassandra.net.Verb.PAXOS_PREPARE_REQ;
 import static org.apache.cassandra.net.Verb.PAXOS_PROPOSE_REQ;
 import static org.apache.cassandra.net.Verb.READ_REQ;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
-public class CASTest extends TestBaseImpl
+public class CASTest extends CASCommonTestCases
 {
-    private static final Logger logger = LoggerFactory.getLogger(CASTest.class);
-
     /**
-     * The {@code cas_contention_timeout_in_ms} used during the tests
+     * The {@code cas_contention_timeout} used during the tests
      */
-    private static final long CONTENTION_TIMEOUT = 1000L;
+    private static final String CONTENTION_TIMEOUT = "1000ms";
 
     /**
-     * The {@code write_request_timeout_in_ms} used during the tests
+     * The {@code write_request_timeout} used during the tests
      */
-    private static final long REQUEST_TIMEOUT = 1000L;
+    private static final String REQUEST_TIMEOUT = "1000ms";
 
-    @Test
-    public void simpleUpdate() throws Throwable
+    private static Cluster THREE_NODES;
+    private static Cluster FOUR_NODES;
+
+    @BeforeClass
+    public static void beforeClass() throws Throwable
     {
-        try (Cluster cluster = init(Cluster.create(3)))
-        {
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
-
-            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
-            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL),
-                    row(1, 1, 1));
-            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = 3 WHERE pk = 1 and ck = 1 IF v = 2", ConsistencyLevel.QUORUM);
-            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL),
-                    row(1, 1, 1));
-            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", ConsistencyLevel.QUORUM);
-            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL),
-                    row(1, 1, 2));
-        }
+        System.setProperty("cassandra.paxos.use_self_execution", "false");
+        TestBaseImpl.beforeClass();
+        Consumer<IInstanceConfig> conf = config -> config
+                                                   .set("paxos_variant", "v2")
+                                                   .set("write_request_timeout", REQUEST_TIMEOUT)
+                                                   .set("cas_contention_timeout", CONTENTION_TIMEOUT)
+                                                   .set("request_timeout", REQUEST_TIMEOUT);
+        // TODO: fails with vnode enabled
+        THREE_NODES = init(Cluster.build(3).withConfig(conf).withoutVNodes().start());
+        FOUR_NODES = init(Cluster.build(4).withConfig(conf).withoutVNodes().start(), 3);
     }
 
-    @Test
-    public void incompletePrepare() throws Throwable
+    @AfterClass
+    public static void afterClass()
     {
-        try (Cluster cluster = init(Cluster.create(3, config -> config.set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                                                                      .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT))))
-        {
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
-
-            IMessageFilters.Filter drop = cluster.filters().verbs(PAXOS_PREPARE_REQ.id).from(1).to(2, 3).drop();
-            try
-            {
-                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
-                Assert.fail();
-            }
-            catch (RuntimeException e)
-            {
-                Assert.assertEquals("CAS operation timed out - encountered contentions: 0", e.getMessage());
-            }
-            drop.off();
-            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", ConsistencyLevel.QUORUM);
-            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL));
-        }
+        if (THREE_NODES != null)
+            THREE_NODES.close();
+        if (FOUR_NODES != null)
+            FOUR_NODES.close();
     }
 
-    @Test
-    public void incompletePropose() throws Throwable
+    @Before
+    public void before()
     {
-        try (Cluster cluster = init(Cluster.create(3, config -> config.set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                                                                      .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT))))
+        THREE_NODES.filters().reset();
+        FOUR_NODES.filters().reset();
+        // tests add/remove nodes from the ring, so attempt to add them back
+        for (int i = 1 ; i <= 4 ; ++i)
         {
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
-
-            IMessageFilters.Filter drop1 = cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(2, 3).drop();
-            try
+            for (int j = 1; j <= 4; j++)
             {
-                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
-                Assert.fail();
+                FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingNormal).accept(FOUR_NODES.get(j));
             }
-            catch (RuntimeException e)
-            {
-                Assert.assertEquals("CAS operation timed out - encountered contentions: 0", e.getMessage());
-            }
-            drop1.off();
-            // make sure we encounter one of the in-progress proposals so we complete it
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id).from(1).to(2).drop();
-            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", ConsistencyLevel.QUORUM);
-            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL),
-                    row(1, 1, 2));
         }
     }
 
-    @Test
-    public void incompleteCommit() throws Throwable
-    {
-        try (Cluster cluster = init(Cluster.create(3, config -> config.set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                                                                      .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT))))
-        {
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
-
-            IMessageFilters.Filter drop1 = cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(1).to(2, 3).drop();
-            try
-            {
-                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
-                Assert.fail();
-            }
-            catch (RuntimeException e)
-            {
-                Assert.assertEquals("CAS operation timed out - encountered contentions: 0", e.getMessage());
-            }
-            drop1.off();
-            // make sure we see one of the successful commits
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(2).drop();
-            cluster.coordinator(1).execute("UPDATE " + KEYSPACE + ".tbl SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", ConsistencyLevel.QUORUM);
-            assertRows(cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.SERIAL),
-                    row(1, 1, 2));
-        }
-    }
-
-    private int[] paxosAndReadVerbs() {
-        return new int[] { PAXOS_PREPARE_REQ.id, PAXOS_PROPOSE_REQ.id, PAXOS_COMMIT_REQ.id, READ_REQ.id };
-    }
-
     /**
-     * Base test to ensure that if a write times out but with a proposal accepted by some nodes (less then quorum), and
-     * a following SERIAL operation does not observe that write (the node having accepted it do not participate in that
-     * following operation), then that write is never applied, even when the nodes having accepted the original proposal
-     * participate.
+     * A write and a read that are able to witness different (i.e. non-linearizable) histories
+     * See CASSANDRA-12126
      *
-     * <p>In other words, if an operation timeout, it may or may not be applied, but that "fate" is persistently decided
-     * by the very SERIAL operation that "succeed" (in the sense of 'not timing out or throwing some other exception').
-     *
-     * @param postTimeoutOperation1 a SERIAL operation executed after an initial write that inserts the row [0, 0] times
-     *                              out. It is executed with a QUORUM of nodes that have _not_ see the timed out
-     *                              proposal, and so that operation should expect that the [0, 0] write has not taken
-     *                              place.
-     * @param postTimeoutOperation2 a 2nd SERIAL operation executed _after_ {@code postTimeoutOperation1}, with no
-     *                              write executed between the 2 operation. Contrarily to the 1st operation, the QORUM
-     *                              for this operation _will_ include the node that got the proposal for the [0, 0]
-     *                              insert but didn't participated to {@code postTimeoutOperation1}}. That operation
-     *                              should also no witness that [0, 0] write (since {@code postTimeoutOperation1}
-     *                              didn't).
-     * @param loseCommitOfOperation1 if {@code true}, the test will also drop the "commits" messages for
-     *                               {@code postTimeoutOperation1}. In general, the test should behave the same with or
-     *                               without that flag since a value is decided as soon as it has been "accepted by
-     *                               quorum" and the commits should always be properly replayed.
+     *  - A Promised by {1, 2, 3}
+     *  - A Acccepted by {1}
+     *  - B (=>!A) Promised and Proposed to {2, 3}
+     *  - Read from (or attempt C (=>!B)) to {1, 2} -> witness either A or B, not both
      */
-    private void consistencyAfterWriteTimeoutTest(BiConsumer<String, ICoordinator> postTimeoutOperation1,
-                                                  BiConsumer<String, ICoordinator> postTimeoutOperation2,
-                                                  boolean loseCommitOfOperation1) throws IOException
+    @Test
+    public void testIncompleteWriteSupersededByConflictingRejectedCondition() throws Throwable
     {
-        // It's unclear why (haven't dug), but in some of the instance of this test method, there is a consistent 2+
-        // seconds pauses between the prepare and propose phases during the execution of 'postTimeoutOperation2'. This
-        // does not happen on 3.0 and there is no report of such long pauses otherwise, so an hypothesis is that this
-        // is due to the in-jvm dtest framework. This is is why we use a 4 seconds timeout here. Given this test is
-        // not about performance, this is probably ok, even if we ideally should dug into the underlying reason.
-        try (Cluster cluster = init(Cluster.create(3, config -> config.set("write_request_timeout_in_ms", 4000L)
-                                                                      .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT))))
+        String tableName = tableName("tbl");
+        THREE_NODES.schemaChange("CREATE TABLE " + KEYSPACE + "." + tableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        IMessageFilters.Filter drop1 = THREE_NODES.filters().verbs(PAXOS2_PROPOSE_REQ.id, PAXOS_PROPOSE_REQ.id).from(1).to(2, 3).drop();
+        try
         {
-            String table = KEYSPACE + ".t";
-            cluster.schemaChange("CREATE TABLE " + table + " (k int PRIMARY KEY, v int)");
-
-            // We do a CAS insertion, but have with the PROPOSE message dropped on node 1 and 2. The CAS will not get
-            // through and should timeout. Importantly, node 3 does receive and answer the PROPOSE.
-            IMessageFilters.Filter dropProposeFilter = cluster.filters()
-                                                              .inbound()
-                                                              .verbs(PAXOS_PROPOSE_REQ.id)
-                                                              .from(3)
-                                                              .to(1, 2)
-                                                              .drop();
-            try
-            {
-                // NOTE: the consistency below is the "commit" one, so it doesn't matter at all here.
-                // NOTE 2: we use node 3 as coordinator because message filters don't currently work for locally
-                //   delivered messages and as we want to drop messages to 1 and 2, we can't use them.
-                cluster.coordinator(3)
-                       .execute("INSERT INTO " + table + "(k, v) VALUES (0, 0) IF NOT EXISTS", ConsistencyLevel.ONE);
-                fail("The insertion should have timed-out");
-            }
-            catch (Exception e)
-            {
-                // We expect a write timeout. If we get one, the test can continue, otherwise, we rethrow. Note that we
-                // look at the root cause because the dtest framework effectively wrap the exception in a RuntimeException
-                // (we could just look at the immediate cause, but this feel a bit more resilient this way).
-                // TODO: we can't use an instanceof below because the WriteTimeoutException we get is from a different class
-                //  loader than the one the test run under, and that's our poor-man work-around. This kind of things should
-                //  be improved at the dtest API level.
-                if (!e.getClass().getSimpleName().equals("CasWriteTimeoutException"))
-                    throw e;
-            }
-            finally
-            {
-                dropProposeFilter.off();
-            }
-
-            // Isolates node 3 and executes the SERIAL operation. As neither node 1 or 2 got the initial insert proposal,
-            // there is nothing to "replay" and the operation should assert the table is still empty.
-            IMessageFilters.Filter ignoreNode3Filter = cluster.filters().verbs(paxosAndReadVerbs()).to(3).drop();
-            IMessageFilters.Filter dropCommitFilter = null;
-            if (loseCommitOfOperation1)
-            {
-                dropCommitFilter = cluster.filters().verbs(PAXOS_COMMIT_REQ.id).to(1, 2).drop();
-            }
-            try
-            {
-                postTimeoutOperation1.accept(table, cluster.coordinator(1));
-            }
-            finally
-            {
-                ignoreNode3Filter.off();
-                if (dropCommitFilter != null)
-                    dropCommitFilter.off();
-            }
-
-            // Node 3 is now back and we isolate node 2 to ensure the next read hits node 1 and 3.
-            // What we want to ensure is that despite node 3 having the initial insert in its paxos state in a position of
-            // being replayed, that insert is _not_ replayed (it would contradict serializability since the previous
-            // operation asserted nothing was inserted). It is this execution that failed before CASSANDRA-12126.
-            IMessageFilters.Filter ignoreNode2Filter = cluster.filters().verbs(paxosAndReadVerbs()).to(2).drop();
-            try
-            {
-                postTimeoutOperation2.accept(table, cluster.coordinator(1));
-            }
-            finally
-            {
-                ignoreNode2Filter.off();
-            }
+            THREE_NODES.coordinator(1).execute("INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", QUORUM);
+            fail();
         }
+        catch (Throwable t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw t;
+        }
+        drop(THREE_NODES, 2, to(1), to(1), to());
+        assertRows(THREE_NODES.coordinator(2).execute("UPDATE " + KEYSPACE + "." + tableName + " SET v = 2 WHERE pk = 1 and ck = 1 IF v = 1", QUORUM),
+                   row(false));
+        drop1.off();
+        drop(THREE_NODES, 1, to(2), to(), to());
+        assertRows(THREE_NODES.coordinator(1).execute("SELECT * FROM " + KEYSPACE + "." + tableName + " WHERE pk = 1", SERIAL));
+    }
+
+    /**
+     * Two reads that are able to witness different (i.e. non-linearizable) histories
+     *  - A Promised by {1, 2, 3}
+     *  - A Accepted by {1}
+     *  - Read from {2, 3} -> do not witness A?
+     *  - Read from {1, 2} -> witnesses A?
+     * See CASSANDRA-12126
+     */
+    @Ignore
+    @Test
+    public void testIncompleteWriteSupersededByRead() throws Throwable
+    {
+        String tableName = tableName();
+        String fullTableName = KEYSPACE + "." + tableName;
+        THREE_NODES.schemaChange("CREATE TABLE " + fullTableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        IMessageFilters.Filter drop1 = THREE_NODES.filters().verbs(PAXOS2_PROPOSE_REQ.id, PAXOS_PROPOSE_REQ.id).from(1).to(2, 3).drop();
+        try
+        {
+            THREE_NODES.coordinator(1).execute("INSERT INTO " + fullTableName + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", QUORUM);
+            fail();
+        }
+        catch (Throwable t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw t;
+        }
+        drop(THREE_NODES, 2, to(1), to(), to());
+        assertRows(THREE_NODES.coordinator(2).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", SERIAL));
+        drop1.off();
+
+        drop(THREE_NODES, 1, to(2), to(), to());
+        assertRows(THREE_NODES.coordinator(1).execute("SELECT * FROM " + fullTableName + " WHERE pk = 1", SERIAL));
+    }
+
+    private static int[] paxosAndReadVerbs()
+    {
+        return new int[] {
+            PAXOS_PREPARE_REQ.id,
+            PAXOS2_PREPARE_REQ.id,
+            PAXOS2_PREPARE_REFRESH_REQ.id,
+            PAXOS2_COMMIT_AND_PREPARE_REQ.id,
+            PAXOS_PROPOSE_REQ.id,
+            PAXOS2_PROPOSE_REQ.id,
+            PAXOS_COMMIT_REQ.id,
+            READ_REQ.id
+        };
     }
 
     /**
@@ -286,11 +205,73 @@
     public void readConsistencyAfterWriteTimeoutTest() throws IOException
     {
         BiConsumer<String, ICoordinator> operation =
-            (table, coordinator) -> assertRows(coordinator.execute("SELECT * FROM " + table + " WHERE k=0",
-                                                                   ConsistencyLevel.SERIAL));
+                (table, coordinator) -> assertRows(coordinator.execute("SELECT * FROM " + table + " WHERE k=0",
+                        SERIAL));
 
-        consistencyAfterWriteTimeoutTest(operation, operation, false);
-        consistencyAfterWriteTimeoutTest(operation, operation, true);
+        consistencyAfterWriteTimeoutTest(operation, operation, false, THREE_NODES);
+        consistencyAfterWriteTimeoutTest(operation, operation, true, THREE_NODES);
+    }
+
+    /**
+     * Tests that a sequence of reads exploit the fast read optimisation, as does a fail write, but that
+     * a read after a failed write that does not propose successfully does not
+     */
+    @Test
+    public void fastReadsAndFailedWrites() throws IOException
+    {
+        String tableName = tableName("t");
+        String table = KEYSPACE + "." + tableName;
+        THREE_NODES.schemaChange("CREATE TABLE " + table + " (k int PRIMARY KEY, v int)");
+
+        // We do a CAS insertion, but have with the PROPOSE message dropped on node 1 and 2. The CAS will not get
+        // through and should timeout. Importantly, node 3 does receive and answer the PROPOSE.
+        IMessageFilters.Filter dropProposeFilter = THREE_NODES.filters()
+                                                              .verbs(PAXOS_PROPOSE_REQ.id, PAXOS2_PROPOSE_REQ.id,
+                                                                     PAXOS_COMMIT_REQ.id, PAXOS2_COMMIT_AND_PREPARE_REQ.id)
+                                                              .to(1, 2)
+                                                              .drop();
+
+        try
+        {
+            // shouldn't timeout
+            THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+            THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+            THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+            THREE_NODES.coordinator(1).execute("UPDATE " + table + " SET v = 1 WHERE k = 1 IF EXISTS", ANY);
+            try
+            {
+                THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+                Assert.fail();
+            }
+            catch (AssertionError propagate)
+            {
+                throw propagate;
+            }
+            catch (Throwable maybeIgnore)
+            {
+                if (!maybeIgnore.getClass().getSimpleName().equals("ReadTimeoutException"))
+                    throw maybeIgnore;
+            }
+        }
+        finally
+        {
+            dropProposeFilter.off();
+        }
+
+        THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+
+        try
+        {
+            dropProposeFilter.on();
+            // shouldn't timeout
+            THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+            THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+            THREE_NODES.coordinator(1).execute("SELECT * FROM " + table + " WHERE k = 1", SERIAL);
+        }
+        finally
+        {
+            dropProposeFilter.off();
+        }
     }
 
     /**
@@ -306,10 +287,10 @@
         // Note: we use CL.ANY so that the operation don't timeout in the case where we "lost" the operation1 commits.
         // The commit CL shouldn't have impact on this test anyway, so this doesn't diminishes the test.
         BiConsumer<String, ICoordinator> operation =
-            (table, coordinator) -> assertCasNotApplied(coordinator.execute("UPDATE " + table + " SET v = 1 WHERE k = 0 IF v = 0",
-                                                                            ConsistencyLevel.ANY));
-        consistencyAfterWriteTimeoutTest(operation, operation, false);
-        consistencyAfterWriteTimeoutTest(operation, operation, true);
+                (table, coordinator) -> assertCasNotApplied(coordinator.execute("UPDATE " + table + " SET v = 1 WHERE k = 0 IF v = 0",
+                        ANY));
+        consistencyAfterWriteTimeoutTest(operation, operation, false, THREE_NODES);
+        consistencyAfterWriteTimeoutTest(operation, operation, true, THREE_NODES);
     }
 
     /**
@@ -322,13 +303,13 @@
     public void mixedReadAndNonApplyingCasConsistencyAfterWriteTimeout() throws IOException
     {
         BiConsumer<String, ICoordinator> operation1 =
-            (table, coordinator) -> assertRows(coordinator.execute("SELECT * FROM " + table + " WHERE k=0",
-                                                                   ConsistencyLevel.SERIAL));
+                (table, coordinator) -> assertRows(coordinator.execute("SELECT * FROM " + table + " WHERE k=0",
+                        SERIAL));
         BiConsumer<String, ICoordinator> operation2 =
-            (table, coordinator) -> assertCasNotApplied(coordinator.execute("UPDATE " + table + " SET v = 1 WHERE k = 0 IF v = 0",
-                                                                            ConsistencyLevel.QUORUM));
-        consistencyAfterWriteTimeoutTest(operation1, operation2, false);
-        consistencyAfterWriteTimeoutTest(operation1, operation2, true);
+                (table, coordinator) -> assertCasNotApplied(coordinator.execute("UPDATE " + table + " SET v = 1 WHERE k = 0 IF v = 0",
+                        QUORUM));
+        consistencyAfterWriteTimeoutTest(operation1, operation2, false, THREE_NODES);
+        consistencyAfterWriteTimeoutTest(operation1, operation2, true, THREE_NODES);
     }
 
     /**
@@ -344,104 +325,116 @@
         // Note: we use CL.ANY so that the operation don't timeout in the case where we "lost" the operation1 commits.
         // The commit CL shouldn't have impact on this test anyway, so this doesn't diminishes the test.
         BiConsumer<String, ICoordinator> operation1 =
-            (table, coordinator) -> assertCasNotApplied(coordinator.execute("UPDATE " + table + " SET v = 1 WHERE k = 0 IF v = 0",
-                                                                            ConsistencyLevel.ANY));
+                (table, coordinator) -> assertCasNotApplied(coordinator.execute("UPDATE " + table + " SET v = 1 WHERE k = 0 IF v = 0",
+                        ANY));
         BiConsumer<String, ICoordinator> operation2 =
-            (table, coordinator) -> assertRows(coordinator.execute("SELECT * FROM " + table + " WHERE k=0",
-                                                                   ConsistencyLevel.SERIAL));
-        consistencyAfterWriteTimeoutTest(operation1, operation2, false);
-        consistencyAfterWriteTimeoutTest(operation1, operation2, true);
+                (table, coordinator) -> assertRows(coordinator.execute("SELECT * FROM " + table + " WHERE k=0",
+                        SERIAL));
+        consistencyAfterWriteTimeoutTest(operation1, operation2, false, THREE_NODES);
+        consistencyAfterWriteTimeoutTest(operation1, operation2, true, THREE_NODES);
     }
 
     // TODO: this shoud probably be moved into the dtest API.
     private void assertCasNotApplied(Object[][] resultSet)
     {
         assertFalse("Expected a CAS resultSet (with at least application result) but got an empty one.",
-                    resultSet.length == 0);
+                resultSet.length == 0);
         assertFalse("Invalid empty first row in CAS resultSet.", resultSet[0].length == 0);
         Object wasApplied = resultSet[0][0];
         assertTrue("Expected 1st column of CAS resultSet to be a boolean, but got a " + wasApplied.getClass(),
-                   wasApplied instanceof Boolean);
+                wasApplied instanceof Boolean);
         assertFalse("Expected CAS to not be applied, but was applied.", (Boolean)wasApplied);
     }
 
-    /**
-     * Failed write (by node that did not yet witness a range movement via gossip) is witnessed later as successful
-     * conflicting with another successful write performed by a node that did witness the range movement
-     * Prepare, Propose and Commit A to {1, 2}
-     * Range moves to {2, 3, 4}
-     * Prepare and Propose B (=> !A) to {3, 4}
-     */
-    @Ignore
+
+    private static Object[][] executeWithRetry(int attempts, ICoordinator coordinator, String query, ConsistencyLevel consistencyLevel, Object... boundValues)
+    {
+        while (--attempts > 0)
+        {
+            try
+            {
+                return coordinator.execute(query, consistencyLevel, boundValues);
+            }
+            catch (Throwable t)
+            {
+                if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                    throw t;
+                FBUtilities.sleepQuietly(100);
+            }
+        }
+        return coordinator.execute(query, consistencyLevel, boundValues);
+    }
+
+    private static Object[][] executeWithRetry(ICoordinator coordinator, String query, ConsistencyLevel consistencyLevel, Object... boundValues)
+    {
+        return executeWithRetry(2, coordinator, query, consistencyLevel, boundValues);
+    }
+
+    // failed write (by node that did not yet witness a range movement via gossip) is witnessed later as successful
+    // conflicting with another successful write performed by a node that did witness the range movement
+    // A Promised, Accepted and Committed by {1, 2}
+    // Range moves to {2, 3, 4}
+    // B (=> !A) Promised and Proposed to {3, 4}
     @Test
     public void testSuccessfulWriteBeforeRangeMovement() throws Throwable
     {
-        try (Cluster cluster = Cluster.create(4, config -> config
-                .set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT)))
+        String tableName = tableName("tbl");
+        FOUR_NODES.schemaChange("CREATE TABLE " + KEYSPACE + "." + tableName + " (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
+
+        // make it so {1} is unaware (yet) that {4} is an owner of the token
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::removeFromRing).accept(FOUR_NODES.get(4));
+
+        int pk = pk(FOUR_NODES, 1, 2);
+
+        // {1} promises and accepts on !{3} => {1, 2}; commits on !{2,3} => {1}
+        drop(FOUR_NODES, 1, to(3), to(3), to(2, 3));
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
+        assertRows(executeWithRetry(FOUR_NODES.coordinator(1), "INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ONE, pk),
+                   row(true));
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+
+        for (int i = 1; i <= 3; ++i)
         {
-            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
-
-            // make it so {1} is unaware (yet) that {4} is an owner of the token
-            cluster.get(1).acceptsOnInstance(Instance::removeFromRing).accept(cluster.get(4));
-
-            int pk = pk(cluster, 1, 2);
-
-            // {1} promises and accepts on !{3} => {1, 2}; commits on !{2,3} => {1}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(1).to(2, 3).drop();
-            assertRows(cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(true));
-
-            for (int i = 1 ; i <= 3 ; ++i)
-                cluster.get(i).acceptsOnInstance(Instance::addToRingNormal).accept(cluster.get(4));
-
-            // {4} reads from !{2} => {3, 4}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(4).to(2).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(4).to(2).drop();
-            assertRows(cluster.coordinator(4).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(false, pk, 1, 1, null));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingNormal).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
         }
+
+        // {4} reads from !{2} => {3, 4}
+        drop(FOUR_NODES, 4, to(2), to(2), to());
+        assertRows(executeWithRetry(FOUR_NODES.coordinator(4), "INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ONE, pk),
+                   row(false, pk, 1, 1, null));
     }
 
     /**
      * Failed write (by node that did not yet witness a range movement via gossip) is witnessed later as successful
      * conflicting with another successful write performed by a node that did witness the range movement
      *  - Range moves from {1, 2, 3} to {2, 3, 4}, witnessed by X (not by !X)
-     *  -  X: Prepare, Propose and Commit A to {3, 4}
-     *  - !X: Prepare and Propose B (=>!A) to {1, 2}
+     *  -  X: A Promised, Accepted and Committed by {3, 4}
+     *  - !X: B (=>!A) Promised and Proposed to {1, 2}
      */
-    @Ignore
     @Test
     public void testConflictingWritesWithStaleRingInformation() throws Throwable
     {
-        try (Cluster cluster = Cluster.create(4, config -> config
-                .set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT)))
-        {
-            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
+        String tableName = tableName("tbl");
+        FOUR_NODES.schemaChange("CREATE TABLE " + KEYSPACE + "." + tableName + " (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
 
-            // make it so {1} is unaware (yet) that {4} is an owner of the token
-            cluster.get(1).acceptsOnInstance(Instance::removeFromRing).accept(cluster.get(4));
+        // make it so {1} is unaware (yet) that {4} is an owner of the token
+        FOUR_NODES.get(1).acceptOnInstance(CASTestBase::removeFromRing, FOUR_NODES.get(4));
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
 
-            // {4} promises, accepts and commits on !{2} => {3, 4}
-            int pk = pk(cluster, 1, 2);
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(4).to(2).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(4).to(2).drop();
-            cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(4).to(2).drop();
-            assertRows(cluster.coordinator(4).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(true));
+        // {4} promises, accepts and commits on !{2} => {3, 4}
+        int pk = pk(FOUR_NODES, 1, 2);
+        drop(FOUR_NODES, 4, to(2), to(2), to(2));
+        assertRows(executeWithRetry(FOUR_NODES.coordinator(4), "INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ONE, pk),
+                   row(true));
 
-            // {1} promises, accepts and commmits on !{3} => {1, 2}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(1).to(3).drop();
-            assertRows(cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(false, pk, 1, 1, null));
-        }
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
+        // {1} promises, accepts and commmits on !{3} => {1, 2}
+        drop(FOUR_NODES, 1, to(3), to(3), to(3));
+        assertRows(executeWithRetry(FOUR_NODES.coordinator(1), "INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ONE, pk),
+                   row(false, pk, 1, 1, null));
+
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
     }
 
     /**
@@ -449,90 +442,91 @@
      * Very similar to {@link #testConflictingWritesWithStaleRingInformation}.
      *
      *  - Range moves from {1, 2, 3} to {2, 3, 4}; witnessed by X (not by !X)
-     *  -  !X: Prepare and Propose to {1, 2}
+     *  -  !X: Promised and Accepted by {1, 2}
      *  - Range movement witnessed by !X
-     *  - Any: Prepare and Read from {3, 4}
+     *  - Any: Promised and Read from {3, 4}
      */
-    @Ignore
     @Test
     public void testSucccessfulWriteDuringRangeMovementFollowedByRead() throws Throwable
     {
-        try (Cluster cluster = Cluster.create(4, config -> config
-                .set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT)))
+        String tableName = tableName("tbl");
+        FOUR_NODES.schemaChange("CREATE TABLE " + KEYSPACE + "." + tableName + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+        // make it so {4} is bootstrapping, and this has propagated to only a quorum of other nodes
+        for (int i = 1 ; i <= 4 ; ++i)
         {
-            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
-
-            // make it so {4} is bootstrapping, and this has not propagated to other nodes yet
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(1).acceptsOnInstance(Instance::removeFromRing).accept(cluster.get(4));
-            cluster.get(4).acceptsOnInstance(Instance::addToRingBootstrapping).accept(cluster.get(4));
-
-            int pk = pk(cluster, 1, 2);
-
-            // {1} promises and accepts on !{3} => {1, 2}; commmits on !{2, 3} => {1}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(1).to(2, 3).drop();
-            assertRows(cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (?, 1, 1) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(true));
-
-            // finish topology change
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(i).acceptsOnInstance(Instance::addToRingNormal).accept(cluster.get(4));
-
-            // {3} reads from !{2} => {3, 4}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(3).to(2).drop();
-            assertRows(cluster.coordinator(3).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = ?", ConsistencyLevel.SERIAL, pk),
-                    row(pk, 1, 1));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::removeFromRing).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
         }
+        for (int i = 2 ; i <= 4 ; ++i)
+        {
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingBootstrapping).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+        }
+
+        int pk = pk(FOUR_NODES, 1, 2);
+
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
+        // {1} promises and accepts on !{3} => {1, 2}; commmits on !{2, 3} => {1}
+        drop(FOUR_NODES, 1, to(3), to(3), to(2, 3));
+        assertRows(executeWithRetry(FOUR_NODES.coordinator(1), "INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v) VALUES (?, 1, 1) IF NOT EXISTS", ONE, pk),
+                   row(true));
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+
+        // finish topology change
+        for (int i = 1 ; i <= 4 ; ++i)
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingNormal).accept(FOUR_NODES.get(4));
+
+        // {3} reads from !{2} => {3, 4}
+        drop(FOUR_NODES, 3, to(2), to(), to());
+        assertRows(FOUR_NODES.coordinator(3).execute("SELECT * FROM " + KEYSPACE + "." + tableName + " WHERE pk = ?", SERIAL, pk),
+                   row(pk, 1, 1));
     }
 
     /**
      * Successful write during range movement not witnessed by write after range movement
      *
      *  - Range moves from {1, 2, 3} to {2, 3, 4}; witnessed by X (not by !X)
-     *  -  !X: Prepare and Propose to {1, 2}
+     *  -  !X: Promised and Accepted by {1, 2}
      *  - Range movement witnessed by !X
-     *  - Any: Prepare and Propose to {3, 4}
+     *  - Any: Promised and Propose to {3, 4}
      */
-    @Ignore
     @Test
     public void testSuccessfulWriteDuringRangeMovementFollowedByConflicting() throws Throwable
     {
-        try (Cluster cluster = Cluster.create(4, config -> config
-                .set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT)))
+        FOUR_NODES.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
+
+        // make it so {4} is bootstrapping, and this has propagated to only a quorum of other nodes
+        for (int i = 1 ; i <= 4 ; ++i)
         {
-            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
-
-            // make it so {4} is bootstrapping, and this has not propagated to other nodes yet
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(1).acceptsOnInstance(Instance::removeFromRing).accept(cluster.get(4));
-            cluster.get(4).acceptsOnInstance(Instance::addToRingBootstrapping).accept(cluster.get(4));
-
-            int pk = pk(cluster, 1, 2);
-
-            // {1} promises and accepts on !{3} => {1, 2}; commits on !{2, 3} => {1}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(1).to(2, 3).drop();
-            assertRows(cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(true));
-
-            // finish topology change
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(i).acceptsOnInstance(Instance::addToRingNormal).accept(cluster.get(4));
-
-            // {3} reads from !{2} => {3, 4}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(3).to(2).drop();
-            assertRows(cluster.coordinator(3).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(false, pk, 1, 1, null));
-
-            // TODO: repair and verify base table state
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::removeFromRing).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
         }
+        for (int i = 2 ; i <= 4 ; ++i)
+        {
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingBootstrapping).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+        }
+
+        int pk = pk(FOUR_NODES, 1, 2);
+
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
+        // {1} promises and accepts on !{3} => {1, 2}; commits on !{2, 3} => {1}
+        drop(FOUR_NODES, 1, to(3), to(3), to(2, 3));
+        assertRows(executeWithRetry(FOUR_NODES.coordinator(1), "INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ONE, pk),
+                   row(true));
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+
+        // finish topology change
+        for (int i = 1 ; i <= 4 ; ++i)
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingNormal).accept(FOUR_NODES.get(4));
+
+        // {3} reads from !{2} => {3, 4}
+        drop(FOUR_NODES, 3, to(2), to(), to());
+        assertRows(FOUR_NODES.coordinator(3).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ONE, pk),
+                   row(false, pk, 1, 1, null));
+
+        // TODO: repair and verify base table state
     }
 
     /**
@@ -543,60 +537,70 @@
      * See CASSANDRA-15745
      *
      *  - Range moves from {1, 2, 3} to {2, 3, 4}; witnessed by X (not by !X)
-     *  -   X: Prepare to {2, 3, 4}
-     *  -   X: Propose to {4}
-     *  -  !X: Prepare and Propose to {1, 2}
+     *  -   X: Promised by {2, 3, 4}
+     *  -   X: Accepted by {4}
+     *  -  !X: Promised and Accepted by {1, 2}
      *  - Range move visible by !X
-     *  - Any: Prepare and Read from {3, 4}
+     *  - Any: Promised and Propose to {3, 4}
      */
-    @Ignore
     @Test
     public void testIncompleteWriteFollowedBySuccessfulWriteWithStaleRingDuringRangeMovementFollowedByRead() throws Throwable
     {
-        try (Cluster cluster = Cluster.create(4, config -> config
-                .set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT)))
+        String tableName = tableName("tbl");
+        FOUR_NODES.schemaChange("CREATE TABLE " + KEYSPACE + "." + tableName + " (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
+
+        // make it so {4} is bootstrapping, and this has propagated to only a quorum of other nodes
+        for (int i = 1 ; i <= 4 ; ++i)
         {
-            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
-
-            // make it so {4} is bootstrapping, and this has not propagated to other nodes yet
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(1).acceptsOnInstance(Instance::removeFromRing).accept(cluster.get(4));
-            cluster.get(4).acceptsOnInstance(Instance::addToRingBootstrapping).accept(cluster.get(4));
-
-            int pk = pk(cluster, 1, 2);
-
-            // {4} promises and accepts on !{1} => {2, 3, 4}; commits on !{1, 2, 3} => {4}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(4).to(1).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(4).to(1, 2, 3).drop();
-            try
-            {
-                cluster.coordinator(4).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM, pk);
-                Assert.assertTrue(false);
-            }
-            catch (RuntimeException wrapped)
-            {
-                Assert.assertEquals("Operation timed out - received only 1 responses.", wrapped.getCause().getMessage());
-            }
-
-            // {1} promises and accepts on !{3} => {1, 2}; commits on !{2, 3} => {1}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(1).to(2, 3).drop();
-            assertRows(cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(true));
-
-            // finish topology change
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(i).acceptsOnInstance(Instance::addToRingNormal).accept(cluster.get(4));
-
-            // {3} reads from !{2} => {3, 4}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(3).to(2).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(3).to(2).drop();
-            assertRows(cluster.coordinator(3).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = ?", ConsistencyLevel.SERIAL, pk),
-                    row(pk, 1, null, 2));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::removeFromRing).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
         }
+        for (int i = 2 ; i <= 4 ; ++i)
+        {
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingBootstrapping).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+        }
+
+        int pk = pk(FOUR_NODES, 1, 2);
+
+        // {4} promises !{1} => {2, 3, 4}, accepts on !{1, 2, 3} => {4}
+        try (AutoCloseable drop = drop(FOUR_NODES, 4, to(1), to(1, 2, 3), to()))
+        {
+            FOUR_NODES.coordinator(4).execute("INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", QUORUM, pk);
+            Assert.assertTrue(false);
+        }
+        catch (Throwable t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw t;
+        }
+
+        // {1} promises and accepts on !{3} => {1, 2}; commits on !{2, 3} => {1}
+        drop(FOUR_NODES, 1, to(3), to(3), to(2, 3));
+        // two options: either we can invalidate the previous operation and succeed, or we can complete the previous operation
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
+        Object[][] result = executeWithRetry(FOUR_NODES.coordinator(1), "INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ONE, pk);
+        Object[] expectRow;
+        if (result[0].length == 1)
+        {
+            assertRows(result, row(true));
+            expectRow = row(pk, 1, null, 2);
+        }
+        else
+        {
+            assertRows(result, row(false, pk, 1, 1, null));
+            expectRow = row(pk, 1, 1, null);
+        }
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+
+        // finish topology change
+        for (int i = 1 ; i <= 4 ; ++i)
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingNormal).accept(FOUR_NODES.get(4));
+
+        // {3} reads from !{2} => {3, 4}
+        drop(FOUR_NODES, 3, to(2), to(2), to());
+        assertRows(FOUR_NODES.coordinator(3).execute("SELECT * FROM " + KEYSPACE + "." + tableName + " WHERE pk = ?", SERIAL, pk),
+                   expectRow);
     }
 
     /**
@@ -607,95 +611,173 @@
      * See CASSANDRA-15745
      *
      *  - Range moves from {1, 2, 3} to {2, 3, 4}; witnessed by X (not by !X)
-     *  -   X: Prepare to {2, 3, 4}
-     *  -   X: Propose to {4}
-     *  -  !X: Prepare and Propose to {1, 2}
+     *  -   X: Promised by {2, 3, 4}
+     *  -   X: Accepted by {4}
+     *  -  !X: Promised and Accepted by {1, 2}
      *  - Range move visible by !X
-     *  - Any: Prepare and Propose to {3, 4}
+     *  - Any: Promised and Propose to {3, 4}
      */
-    @Ignore
     @Test
     public void testIncompleteWriteFollowedBySuccessfulWriteWithStaleRingDuringRangeMovementFollowedByWrite() throws Throwable
     {
-        try (Cluster cluster = Cluster.create(4, config -> config
-                .set("write_request_timeout_in_ms", REQUEST_TIMEOUT)
-                .set("cas_contention_timeout_in_ms", CONTENTION_TIMEOUT)))
+        String tableName = tableName("tbl");
+        FOUR_NODES.schemaChange("CREATE TABLE " + KEYSPACE + "." + tableName + " (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
+
+        // make it so {4} is bootstrapping, and this has propagated to only a quorum of other nodes
+        for (int i = 1; i <= 4; ++i)
         {
-            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::removeFromRing).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
+        }
+        for (int i = 2; i <= 4; ++i)
+        {
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingBootstrapping).accept(FOUR_NODES.get(4));
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
+        }
 
-            // make it so {4} is bootstrapping, and this has not propagated to other nodes yet
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(1).acceptsOnInstance(Instance::removeFromRing).accept(cluster.get(4));
-            cluster.get(4).acceptsOnInstance(Instance::addToRingBootstrapping).accept(cluster.get(4));
+        int pk = pk(FOUR_NODES, 1, 2);
 
-            int pk = pk(cluster, 1, 2);
+        // {4} promises and accepts on !{1} => {2, 3, 4}; commits on !{1, 2, 3} => {4}
+        drop(FOUR_NODES, 4, to(1), to(1, 2, 3), to());
+        try
+        {
+            FOUR_NODES.coordinator(4).execute("INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", QUORUM, pk);
+            Assert.assertTrue(false);
+        }
+        catch (Throwable t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw t;
+        }
 
-            // {4} promises and accepts on !{1} => {2, 3, 4}; commits on !{1, 2, 3} => {4}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(4).to(1).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(4).to(1, 2, 3).drop();
-            try
-            {
-                cluster.coordinator(4).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM, pk);
-                Assert.assertTrue(false);
-            }
-            catch (RuntimeException wrapped)
-            {
-                Assert.assertEquals("Operation timed out - received only 1 responses.", wrapped.getCause().getMessage());
-            }
+        // {1} promises and accepts on !{3} => {1, 2}; commits on !{2, 3} => {1}
+        drop(FOUR_NODES, 1, to(3), to(3), to(2, 3));
+        // two options: either we can invalidate the previous operation and succeed, or we can complete the previous operation
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertNotVisibleInRing).accept(FOUR_NODES.get(4));
+        Object[][] result = executeWithRetry(FOUR_NODES.coordinator(1), "INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ONE, pk);
+        Object[] expectRow;
+        if (result[0].length == 1)
+        {
+            assertRows(result, row(true));
+            expectRow = row(false, pk, 1, null, 2);
+        }
+        else
+        {
+            assertRows(result, row(false, pk, 1, 1, null));
+            expectRow = row(false, pk, 1, 1, null);
+        }
+        FOUR_NODES.get(1).acceptsOnInstance(CASTestBase::assertVisibleInRing).accept(FOUR_NODES.get(4));
 
-            // {1} promises and accepts on !{3} => {1, 2}; commits on !{2, 3} => {1}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(1).to(3).drop();
-            cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(1).to(2, 3).drop();
-            assertRows(cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(true));
+        // finish topology change
+        for (int i = 1; i <= 4; ++i)
+            FOUR_NODES.get(i).acceptsOnInstance(CASTestBase::addToRingNormal).accept(FOUR_NODES.get(4));
 
-            // finish topology change
-            for (int i = 1 ; i <= 4 ; ++i)
-                cluster.get(i).acceptsOnInstance(Instance::addToRingNormal).accept(cluster.get(4));
+        // {3} reads from !{2} => {3, 4}
+        FOUR_NODES.filters().verbs(PAXOS2_PREPARE_REQ.id, PAXOS_PREPARE_REQ.id, READ_REQ.id).from(3).to(2).drop();
+        FOUR_NODES.filters().verbs(PAXOS2_PROPOSE_REQ.id, PAXOS_PROPOSE_REQ.id).from(3).to(2).drop();
+        assertRows(FOUR_NODES.coordinator(3).execute("INSERT INTO " + KEYSPACE + "." + tableName + " (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ONE, pk),
+                   expectRow);
+    }
 
-            // {3} reads from !{2} => {3, 4}
-            cluster.filters().verbs(PAXOS_PREPARE_REQ.id, READ_REQ.id).from(3).to(2).drop();
-            cluster.filters().verbs(PAXOS_PROPOSE_REQ.id).from(3).to(2).drop();
-            assertRows(cluster.coordinator(3).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", ConsistencyLevel.ONE, pk),
-                    row(false, 5, 1, null, 2));
+    // TODO: RF changes
+    // TODO: Aborted range movements
+    // TODO: Leaving ring
+
+    static void consistencyAfterWriteTimeoutTest(BiConsumer<String, ICoordinator> postTimeoutOperation1, BiConsumer<String, ICoordinator> postTimeoutOperation2, boolean loseCommitOfOperation1, Cluster cluster)
+    {
+        String tableName = tableName("t");
+        String table = KEYSPACE + "." + tableName;
+        cluster.schemaChange("CREATE TABLE " + table + " (k int PRIMARY KEY, v int)");
+
+        // We do a CAS insertion, but have with the PROPOSE message dropped on node 1 and 2. The CAS will not get
+        // through and should timeout. Importantly, node 3 does receive and answer the PROPOSE.
+        IMessageFilters.Filter dropProposeFilter = cluster.filters()
+                                                          .verbs(PAXOS_PROPOSE_REQ.id, PAXOS2_PROPOSE_REQ.id)
+                                                          .to(1, 2)
+                                                          .drop();
+
+        // Prepare A to {1, 2, 3}
+        // Propose A to {3}
+        // Timeout
+        try
+        {
+            // NOTE: the consistency below is the "commit" one, so it doesn't matter at all here.
+            cluster.coordinator(1)
+                   .execute("INSERT INTO " + table + "(k, v) VALUES (0, 0) IF NOT EXISTS", ONE);
+            Assert.fail("The insertion should have timed-out");
+        }
+        catch (Throwable t)
+        {
+            if (!t.getClass().getName().equals(CasWriteTimeoutException.class.getName()))
+                throw t;
+        }
+        finally
+        {
+            dropProposeFilter.off();
+        }
+
+        // Prepare and Propose to {1, 2}
+        // Commit(?) to either {1, 2, 3} or {3}
+        // Isolates node 3 and executes the SERIAL operation. As neither node 1 or 2 got the initial insert proposal,
+        // there is nothing to "replay" and the operation should assert the table is still empty.
+        IMessageFilters.Filter ignoreNode3Filter = cluster.filters().verbs(paxosAndReadVerbs()).to(3).drop();
+        IMessageFilters.Filter dropCommitFilter = null;
+        if (loseCommitOfOperation1)
+        {
+            dropCommitFilter = cluster.filters().verbs(PAXOS_COMMIT_REQ.id).to(1, 2).drop();
+        }
+        try
+        {
+            postTimeoutOperation1.accept(table, cluster.coordinator(1));
+        }
+        finally
+        {
+            ignoreNode3Filter.off();
+            if (dropCommitFilter != null)
+                dropCommitFilter.off();
+        }
+
+        // Node 3 is now back and we isolate node 2 to ensure the next read hits node 1 and 3.
+        // What we want to ensure is that despite node 3 having the initial insert in its paxos state in a position of
+        // being replayed, that insert is _not_ replayed (it would contradict serializability since the previous
+        // operation asserted nothing was inserted). It is this execution that failed before CASSANDRA-12126.
+        IMessageFilters.Filter ignoreNode2Filter = cluster.filters().verbs(paxosAndReadVerbs()).to(2).drop();
+        try
+        {
+            postTimeoutOperation2.accept(table, cluster.coordinator(1));
+        }
+        finally
+        {
+            ignoreNode2Filter.off();
         }
     }
 
-    private static int pk(Cluster cluster, int lb, int ub)
+    protected Cluster getCluster()
     {
-        return pk(cluster.get(lb), cluster.get(ub));
+        return THREE_NODES;
     }
 
-    private static int pk(IInstance lb, IInstance ub)
+    /**
+     * Regression test for a bug (CASSANDRA-17999) where a WriteTimeoutException is encountered when using Paxos v2 in
+     * an LWT performance test that only has a single datacenter because Paxos was still waiting for a response from
+     * another datacenter during the Commit/Acknowledge phase even though we were running with LOCAL_SERIAL.
+     *
+     *
+     * <p>This specifically test for the inconsistency described/fixed by CASSANDRA-17999.
+     */
+    @Test
+    public void testWriteTimeoutExceptionUsingPaxosInLwtPerformaceTest() throws IOException
     {
-        return pk(Murmur3Partitioner.instance.getTokenFactory().fromString(lb.config().getString("initial_token")),
-                Murmur3Partitioner.instance.getTokenFactory().fromString(ub.config().getString("initial_token")));
-    }
 
-    private static int pk(Token lb, Token ub)
-    {
-        int pk = 0;
-        Token pkt;
-        while (lb.compareTo(pkt = Murmur3Partitioner.instance.getToken(Int32Type.instance.decompose(pk))) >= 0 || ub.compareTo(pkt) < 0)
-            ++pk;
-        return pk;
-    }
+        THREE_NODES.schemaChange(String.format("CREATE KEYSPACE IF NOT EXISTS %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '3'}", KEYSPACE));
 
-    private static void debugOwnership(Cluster cluster, int pk)
-    {
-        for (int i = 1 ; i <= cluster.size() ; ++i)
-            System.out.println(i + ": " + cluster.get(i).appliesOnInstance((Integer v) -> StorageService.instance.getNaturalEndpointsWithPort(KEYSPACE, Int32Type.instance.decompose(v)))
-                    .apply(pk));
-    }
+        String tableName = tableName("t");
+        String table = KEYSPACE + "." + tableName;
+        THREE_NODES.schemaChange("CREATE TABLE " + table + " (k int PRIMARY KEY, v int)");
 
-    private static void debugPaxosState(Cluster cluster, int pk)
-    {
-        TableId tableId = cluster.get(1).callOnInstance(() -> Keyspace.open(KEYSPACE).getColumnFamilyStore("tbl").metadata.id);
-        for (int i = 1 ; i <= cluster.size() ; ++i)
-            for (Object[] row : cluster.get(i).executeInternal("select in_progress_ballot, proposal_ballot, most_recent_commit_at from system.paxos where row_key = ? and cf_id = ?", Int32Type.instance.decompose(pk), tableId))
-                System.out.println(i + ": " + (row[0] == null ? 0L : UUIDGen.microsTimestamp((UUID)row[0])) + ", " + (row[1] == null ? 0L : UUIDGen.microsTimestamp((UUID)row[1])) + ", " + (row[2] == null ? 0L : UUIDGen.microsTimestamp((UUID)row[2])));
+        THREE_NODES.coordinator(1).execute("INSERT INTO " + table + " (k, v) VALUES (5, 5) IF NOT EXISTS", LOCAL_QUORUM);
+        THREE_NODES.coordinator(1).execute("UPDATE " + table + " SET v = 123 WHERE k = 5 IF EXISTS", LOCAL_QUORUM);
+
     }
 
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CASTestBase.java b/test/distributed/org/apache/cassandra/distributed/test/CASTestBase.java
new file mode 100644
index 0000000..cae6eef
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/CASTestBase.java
@@ -0,0 +1,233 @@
+/*
+ * 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.distributed.test;
+
+import java.util.Collections;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.dht.IPartitioner;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IMessageFilters;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.HeartBeatState;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.PendingRangeCalculatorService;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.paxos.PaxosRepair;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.apache.cassandra.db.ConsistencyLevel.SERIAL;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PROPOSE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_REPAIR_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_COMMIT_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_PROPOSE_REQ;
+import static org.apache.cassandra.net.Verb.READ_REQ;
+
+public abstract class CASTestBase extends TestBaseImpl
+{
+    private static final Logger logger = LoggerFactory.getLogger(CASTestBase.class);
+
+    static final AtomicInteger TABLE_COUNTER = new AtomicInteger(0);
+
+    static String tableName()
+    {
+        return tableName("tbl");
+    }
+
+    static String tableName(String prefix)
+    {
+        return prefix + TABLE_COUNTER.getAndIncrement();
+    }
+
+    static void repair(Cluster cluster, String tableName, int pk, int repairWith, int repairWithout)
+    {
+        IMessageFilters.Filter filter = cluster.filters().verbs(
+                PAXOS2_REPAIR_REQ.id,
+                PAXOS2_PREPARE_REQ.id, PAXOS_PREPARE_REQ.id, READ_REQ.id).from(repairWith).to(repairWithout).drop();
+        cluster.get(repairWith).runOnInstance(() -> {
+            TableMetadata schema = Keyspace.open(KEYSPACE).getColumnFamilyStore(tableName).metadata.get();
+            DecoratedKey key = schema.partitioner.decorateKey(Int32Type.instance.decompose(pk));
+            try
+            {
+                PaxosRepair.create(SERIAL, key, null, schema).start().await();
+            }
+            catch (Throwable t)
+            {
+                throw new RuntimeException(t);
+            }
+        });
+        filter.off();
+    }
+
+    static int pk(Cluster cluster, int lb, int ub)
+    {
+        return pk(cluster.get(lb), cluster.get(ub));
+    }
+
+    static int pk(IInstance lb, IInstance ub)
+    {
+        return pk(Murmur3Partitioner.instance.getTokenFactory().fromString(lb.config().getString("initial_token")),
+                Murmur3Partitioner.instance.getTokenFactory().fromString(ub.config().getString("initial_token")));
+    }
+
+    static int pk(Token lb, Token ub)
+    {
+        int pk = 0;
+        Token pkt;
+        while (lb.compareTo(pkt = Murmur3Partitioner.instance.getToken(Int32Type.instance.decompose(pk))) >= 0 || ub.compareTo(pkt) < 0)
+            ++pk;
+        return pk;
+    }
+
+    int[] to(int ... nodes)
+    {
+        return nodes;
+    }
+
+
+    private static final IMessageFilters.Matcher LOG_DROPPED = (from, to, message) -> { logger.info("Dropping {} from {} to {}", Verb.fromId(message.verb()), from, to); return true; };
+    AutoCloseable drop(Cluster cluster, int from, int[] toPrepareAndRead, int[] toPropose, int[] toCommit)
+    {
+        IMessageFilters.Filter filter1 = cluster.filters().verbs(PAXOS2_PREPARE_REQ.id, PAXOS_PREPARE_REQ.id, READ_REQ.id).from(from).to(toPrepareAndRead).messagesMatching(LOG_DROPPED).drop();
+        IMessageFilters.Filter filter2 = cluster.filters().verbs(PAXOS2_PROPOSE_REQ.id, PAXOS_PROPOSE_REQ.id).from(from).to(toPropose).messagesMatching(LOG_DROPPED).drop();
+        IMessageFilters.Filter filter3 = cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(from).to(toCommit).messagesMatching(LOG_DROPPED).drop();
+        return () -> {
+            filter1.off();
+            filter2.off();
+            filter3.off();
+        };
+    }
+
+    AutoCloseable drop(Cluster cluster, int from, int[] toPrepare, int[] toRead, int[] toPropose, int[] toCommit)
+    {
+        IMessageFilters.Filter filter1 = cluster.filters().verbs(PAXOS2_PREPARE_REQ.id, PAXOS_PREPARE_REQ.id).from(from).to(toPrepare).drop();
+        IMessageFilters.Filter filter2 = cluster.filters().verbs(READ_REQ.id).from(from).to(toRead).drop();
+        IMessageFilters.Filter filter3 = cluster.filters().verbs(PAXOS2_PROPOSE_REQ.id, PAXOS_PROPOSE_REQ.id).from(from).to(toPropose).drop();
+        IMessageFilters.Filter filter4 = cluster.filters().verbs(PAXOS_COMMIT_REQ.id).from(from).to(toCommit).drop();
+        return () -> {
+            filter1.off();
+            filter2.off();
+            filter3.off();
+            filter4.off();
+        };
+    }
+
+    public static void addToRing(boolean bootstrapping, IInstance peer)
+    {
+        try
+        {
+            IInstanceConfig config = peer.config();
+            IPartitioner partitioner = FBUtilities.newPartitioner(config.getString("partitioner"));
+            Token token = partitioner.getTokenFactory().fromString(config.getString("initial_token"));
+            InetAddressAndPort address = InetAddressAndPort.getByAddress(peer.broadcastAddress());
+
+            UUID hostId = config.hostId();
+            Gossiper.runInGossipStageBlocking(() -> {
+                Gossiper.instance.initializeNodeUnsafe(address, hostId, 1);
+                Gossiper.instance.injectApplicationState(address,
+                                                         ApplicationState.TOKENS,
+                                                         new VersionedValue.VersionedValueFactory(partitioner).tokens(Collections.singleton(token)));
+                VersionedValue status = bootstrapping
+                                        ? new VersionedValue.VersionedValueFactory(partitioner).bootstrapping(Collections.singleton(token))
+                                        : new VersionedValue.VersionedValueFactory(partitioner).normal(Collections.singleton(token));
+                Gossiper.instance.injectApplicationState(address, ApplicationState.STATUS, status);
+                StorageService.instance.onChange(address, ApplicationState.STATUS, status);
+                Gossiper.instance.realMarkAlive(address, Gossiper.instance.getEndpointStateForEndpoint(address));
+            });
+            int version = Math.min(MessagingService.current_version, peer.getMessagingVersion());
+            MessagingService.instance().versions.set(address, version);
+
+            if (!bootstrapping)
+                assert StorageService.instance.getTokenMetadata().isMember(address);
+            PendingRangeCalculatorService.instance.blockUntilFinished();
+        }
+        catch (Throwable e) // UnknownHostException
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void assertVisibleInRing(IInstance peer)
+    {
+        InetAddressAndPort endpoint = InetAddressAndPort.getByAddress(peer.broadcastAddress());
+        Assert.assertTrue(Gossiper.instance.isAlive(endpoint));
+    }
+
+    // reset gossip state so we know of the node being alive only
+    public static void removeFromRing(IInstance peer)
+    {
+        try
+        {
+            IInstanceConfig config = peer.config();
+            IPartitioner partitioner = FBUtilities.newPartitioner(config.getString("partitioner"));
+            Token token = partitioner.getTokenFactory().fromString(config.getString("initial_token"));
+            InetAddressAndPort address = InetAddressAndPort.getByAddress(config.broadcastAddress());
+
+            Gossiper.runInGossipStageBlocking(() -> {
+                StorageService.instance.onChange(address,
+                                                 ApplicationState.STATUS,
+                                                 new VersionedValue.VersionedValueFactory(partitioner).left(Collections.singleton(token), 0L, 0));
+                Gossiper.instance.unsafeAnnulEndpoint(address);
+                Gossiper.instance.realMarkAlive(address, new EndpointState(new HeartBeatState(0, 0)));
+            });
+            PendingRangeCalculatorService.instance.blockUntilFinished();
+        }
+        catch (Throwable e) // UnknownHostException
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    public static void assertNotVisibleInRing(IInstance peer)
+    {
+        InetAddressAndPort endpoint = InetAddressAndPort.getByAddress(peer.broadcastAddress());
+        Assert.assertFalse(Gossiper.instance.isAlive(endpoint));
+    }
+
+    public static void addToRingNormal(IInstance peer)
+    {
+        addToRing(false, peer);
+        assert StorageService.instance.getTokenMetadata().isMember(InetAddressAndPort.getByAddress(peer.broadcastAddress()));
+    }
+
+    public static void addToRingBootstrapping(IInstance peer)
+    {
+        addToRing(true, peer);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CasCriticalSectionTest.java b/test/distributed/org/apache/cassandra/distributed/test/CasCriticalSectionTest.java
new file mode 100644
index 0000000..685e848
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/CasCriticalSectionTest.java
@@ -0,0 +1,218 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BooleanSupplier;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+/**
+ * A simple sanity check that uses CAS as mutex: each lock tries to CAS a variable thread_id for a specific row,
+ * and set its own thread id. Then it sleeps for a short time, and releases the lock.
+ *
+ * Write timeouts are handled by simply re-reading the variable and checking if locking has actually succeeded.
+ */
+public class CasCriticalSectionTest extends TestBaseImpl
+{
+    private static Random rng = new Random();
+    private static final int threadCount = 5;
+    private static final int rowCount = 1;
+
+    @Test
+    public void criticalSectionTest() throws IOException, InterruptedException
+    {
+        try (Cluster cluster = init(Cluster.create(5, c -> c.set("paxos_variant", "v2")
+                                                            .set("write_request_timeout_in_ms", 2000L)
+                                                            .set("cas_contention_timeout_in_ms", 2000L)
+                                                            .set("request_timeout_in_ms", 2000L))))
+        {
+            cluster.schemaChange("create table " + KEYSPACE + ".tbl (pk int, ck int, thread_id int, PRIMARY KEY(pk, ck))");
+
+            List<Thread> threads = new ArrayList<>();
+
+            AtomicBoolean failed = new AtomicBoolean(false);
+            AtomicBoolean stop = new AtomicBoolean(false);
+            BooleanSupplier exitCondition = () -> failed.get() || stop.get();
+
+            for (int i = 0; i < rowCount; i++)
+            {
+                final int rowId = i;
+                AtomicInteger counter = new AtomicInteger();
+                cluster.coordinator(1)
+                       .execute("insert into " + KEYSPACE + ".tbl (pk, ck, thread_id) VALUES (?, ?, ?) IF NOT EXISTS",
+                                ConsistencyLevel.QUORUM,
+                                1, rowId, 0);
+
+                // threads should be numbered from 1 to allow 0 to be "unlocked"
+                for (int j = 1; j <= threadCount; j++)
+                {
+                    int threadId = j;
+                    AtomicInteger lockedTimes = new AtomicInteger();
+                    AtomicInteger unlockedTimes = new AtomicInteger();
+
+                    Runnable sanityCheck = () -> {
+                        Assert.assertEquals(lockedTimes.get(), unlockedTimes.get());
+                    };
+                    threads.add(new Thread(() -> {
+                        while (!exitCondition.getAsBoolean())
+                        {
+                            while (!tryLockOnce(cluster, threadId, rowId))
+                            {
+                                if (exitCondition.getAsBoolean())
+                                {
+                                    sanityCheck.run();
+                                    return;
+                                }
+                            }
+                            int ctr = counter.getAndIncrement();
+                            if (ctr != 0)
+                            {
+                                failed.set(true);
+                                Assert.fail(String.format("Thread %s encountered lock that is held by %d participants while trying to lock.",
+                                                          Thread.currentThread().getName(),
+                                                          ctr));
+                            }
+
+                            // hold lock for a bit
+                            Uninterruptibles.sleepUninterruptibly(rng.nextInt(5), TimeUnit.MILLISECONDS);
+                            ctr = counter.decrementAndGet();
+                            if (ctr != 0)
+                            {
+                                failed.set(true);
+                                Assert.fail(String.format("Thread %s encountered lock that is held by %d participants while trying to unlock.",
+                                                          Thread.currentThread().getName(),
+                                                          ctr));
+                            }
+                            while (!tryUnlockOnce(cluster, threadId, rowId))
+                            {
+                                if (exitCondition.getAsBoolean())
+                                {
+                                    sanityCheck.run();
+                                    return;
+                                }
+                            }
+                        }
+                        sanityCheck.run();
+                    }, String.format("CAS Thread %d-%d", rowId, threadId)));
+                }
+            }
+
+            for (Thread thread : threads)
+                thread.start();
+
+            Thread.sleep(TimeUnit.SECONDS.toMillis(30));
+            stop.set(true);
+
+            for (Thread thread : threads)
+                thread.join();
+
+            Assert.assertFalse(failed.get());
+        }
+    }
+
+    public static boolean isCasSuccess(Object[][] res)
+    {
+        if (res == null || res.length != 1)
+            return false;
+
+        return Arrays.equals(res[0], new Object[] {true});
+    }
+
+    public static boolean tryLockOnce(Cluster cluster, int threadId, int rowId)
+    {
+        Object[][] res = null;
+
+        try
+        {
+            res = cluster.coordinator(rng.nextInt(cluster.size()) + 1)
+                         .execute("update " + KEYSPACE + ".tbl SET thread_id = ? WHERE pk = ? AND ck = ? IF thread_id = 0",
+                                  ConsistencyLevel.QUORUM,
+                                  threadId, 1, rowId);
+            return isCasSuccess(res);
+        }
+        catch (Throwable writeTimeout)
+        {
+            while (true)
+            {
+                try
+                {
+                    res = cluster.coordinator(rng.nextInt(cluster.size()) + 1)
+                                 .execute("SELECT thread_id FROM " + KEYSPACE + ".tbl WHERE pk = ? AND ck = ?",
+                                          ConsistencyLevel.SERIAL,
+                                          1, rowId);
+                    break;
+                }
+                catch (Throwable t)
+                {
+                    // retry
+                }
+            }
+
+            return (int) res[0][0] == threadId;
+        }
+    }
+
+    public static boolean tryUnlockOnce(Cluster cluster, int threadId, int rowId)
+    {
+        Object[][] res = null;
+
+        try
+        {
+            res = cluster.coordinator(rng.nextInt(cluster.size()) + 1)
+                         .execute("update " + KEYSPACE + ".tbl SET thread_id = ? WHERE pk = ? AND ck = ? IF thread_id = ?",
+                                  ConsistencyLevel.QUORUM,
+                                  0, 1, rowId, threadId);
+            return isCasSuccess(res);
+        }
+        catch (Throwable writeTimeout)
+        {
+            while (true)
+            {
+                try
+                {
+                    res = cluster.coordinator(rng.nextInt(cluster.size()) + 1)
+                                 .execute("SELECT thread_id FROM " + KEYSPACE + ".tbl WHERE pk = ? AND ck = ?",
+                                          ConsistencyLevel.SERIAL,
+                                          1, rowId);
+                    break;
+                }
+                catch (Throwable t)
+                {
+                    // retry
+                }
+            }
+
+            return (int) res[0][0] != threadId;
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CompactionOverlappingSSTableTest.java b/test/distributed/org/apache/cassandra/distributed/test/CompactionOverlappingSSTableTest.java
index 54f8ad7..6a65c91 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/CompactionOverlappingSSTableTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/CompactionOverlappingSSTableTest.java
@@ -22,6 +22,7 @@
 import java.util.Arrays;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.stream.Collectors;
 
@@ -47,7 +48,7 @@
 public class CompactionOverlappingSSTableTest extends TestBaseImpl
 {
     @Test
-    public void partialCompactionOverlappingTest() throws IOException
+    public void partialCompactionOverlappingTest() throws IOException, TimeoutException
     {
 
         try (Cluster cluster = init(builder().withNodes(1)
diff --git a/test/distributed/org/apache/cassandra/distributed/test/CountersTest.java b/test/distributed/org/apache/cassandra/distributed/test/CountersTest.java
index 7cc632f..29ce511 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/CountersTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/CountersTest.java
@@ -45,7 +45,7 @@
 
     private static void testUpdateCounter(boolean droppedCompactStorage) throws Throwable
     {
-        try (Cluster cluster = Cluster.build(2).withConfig(c -> c.with(GOSSIP, NATIVE_PROTOCOL).set("enable_drop_compact_storage", true)).start())
+        try (Cluster cluster = Cluster.build(2).withConfig(c -> c.with(GOSSIP, NATIVE_PROTOCOL).set("drop_compact_storage_enabled", true)).start())
         {
             cluster.schemaChange("CREATE KEYSPACE k WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1}");
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/DataResurrectionCheckTest.java b/test/distributed/org/apache/cassandra/distributed/test/DataResurrectionCheckTest.java
new file mode 100644
index 0000000..1b297da
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/DataResurrectionCheckTest.java
@@ -0,0 +1,184 @@
+/*
+ * 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.distributed.test;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Map;
+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;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.exceptions.StartupException;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.service.DataResurrectionCheck;
+import org.apache.cassandra.service.DataResurrectionCheck.Heartbeat;
+import org.apache.cassandra.service.StartupChecks.StartupCheckType;
+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.StartupChecksOptions.ENABLED_PROPERTY;
+import static org.apache.cassandra.distributed.Cluster.build;
+import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
+import static org.apache.cassandra.service.DataResurrectionCheck.DEFAULT_HEARTBEAT_FILE;
+import static org.apache.cassandra.service.DataResurrectionCheck.EXCLUDED_KEYSPACES_CONFIG_PROPERTY;
+import static org.apache.cassandra.service.DataResurrectionCheck.EXCLUDED_TABLES_CONFIG_PROPERTY;
+import static org.apache.cassandra.service.StartupChecks.StartupCheckType.check_data_resurrection;
+import static org.awaitility.Awaitility.await;
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class DataResurrectionCheckTest extends TestBaseImpl
+{
+    @Test
+    public void testDataResurrectionCheck() throws Exception
+    {
+        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");
+
+            // 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
+            try (Cluster cluster = build().withNodes(1)
+                                          .withDataDirCount(3) // we will expect heartbeat to be in the first data dir
+                                          .withConfig(config -> config.with(NATIVE_PROTOCOL)
+                                                                      .set("startup_checks",
+                                                                           getStartupChecksConfig(ENABLED_PROPERTY, "true")))
+                                          .start())
+            {
+                IInvokableInstance instance = cluster.get(1);
+
+                checkHeartbeat(instance);
+
+                for (String ks : new String[]{ "ks1", "ks2", "ks3" })
+                {
+                    cluster.schemaChange("CREATE KEYSPACE " + ks + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};");
+                    cluster.schemaChange(format("CREATE TABLE %s.tb1 (pk text PRIMARY KEY) WITH gc_grace_seconds = 10", ks));
+                    cluster.schemaChange(format("CREATE TABLE %s.tb2 (pk text PRIMARY KEY)", ks));
+                }
+
+                AtomicReference<Throwable> throwable = new AtomicReference<>();
+                // periodically execute check on a running instance and wait until the exception is thrown on all keyspaces
+                // wait for all violations by Awaitility as due to nature how tables were created,
+                // they will not expire on their gc_grace_period exactly at the same time
+                await().timeout(1, MINUTES)
+                       .pollInterval(5, SECONDS)
+                       .until(() -> {
+                           Throwable t = executeChecksOnInstance(instance);
+                           if (t == null)
+                               return false;
+                           String message = t.getMessage();
+                           if (!message.contains("ks1") || !message.contains("ks2") || !message.contains("ks3"))
+                           {
+                               return false;
+                           }
+                           throwable.set(t);
+                           return true;
+                       });
+
+                assertThat(throwable.get().getMessage(), containsString("Invalid tables"));
+                // returned tables in output are not in any particular order
+                // it is how they are returned from system tables
+                assertThat(throwable.get().getMessage(), containsString("ks1.tb1"));
+                assertThat(throwable.get().getMessage(), containsString("ks2.tb1"));
+                assertThat(throwable.get().getMessage(), containsString("ks3.tb1"));
+
+                // exclude failing keyspaces which already expired on their gc_grace_seconds, so we will pass the check
+                assertNull(executeChecksOnInstance(instance, EXCLUDED_KEYSPACES_CONFIG_PROPERTY, "ks1,ks2,ks3"));
+
+                // exclude failing tables which already expired on their gc_grace_seconds, so we will pass the check
+                assertNull(executeChecksOnInstance(instance, EXCLUDED_TABLES_CONFIG_PROPERTY, "ks1.tb1,ks2.tb1,ks3.tb1"));
+
+                // exclude failing tables, but not all of them,
+                // so check detects only one table violates the check
+                Throwable t = executeChecksOnInstance(instance, EXCLUDED_TABLES_CONFIG_PROPERTY, "ks1.tb1,ks2.tb1");
+
+                assertNotNull(t);
+                assertThat(t.getMessage(), containsString("Invalid tables: ks3.tb1"));
+
+                // shadow table exclusion with keyspace exclusion, we have not excluded ks3.tb1, but we excluded whole ks3
+                assertNull(executeChecksOnInstance(instance,
+                                                   EXCLUDED_TABLES_CONFIG_PROPERTY, "ks1.tb1,ks2.tb1",
+                                                   EXCLUDED_KEYSPACES_CONFIG_PROPERTY, "ks3"));
+            }
+        }
+        finally
+        {
+            System.clearProperty(CassandraRelevantProperties.CHECK_DATA_RESURRECTION_HEARTBEAT_PERIOD.getKey());
+        }
+    }
+
+    private Throwable executeChecksOnInstance(IInvokableInstance instance, final String... config)
+    {
+        assert config.length % 2 == 0;
+        return instance.callsOnInstance((IIsolatedExecutor.SerializableCallable<Throwable>) () ->
+        {
+            try
+            {
+                DataResurrectionCheck check = new DataResurrectionCheck();
+                StartupChecksOptions startupChecksOptions = new StartupChecksOptions();
+                startupChecksOptions.enable(check_data_resurrection);
+
+                for (int i = 0; i < config.length - 1; i = i + 2)
+                    startupChecksOptions.set(check_data_resurrection, config[i], config[i + 1]);
+
+                check.execute(startupChecksOptions);
+                return null;
+            }
+            catch (StartupException e)
+            {
+                return e;
+            }
+        }).call();
+    }
+
+    private Map<StartupCheckType, Map<String, Object>> getStartupChecksConfig(String... configs)
+    {
+        return new EnumMap<StartupCheckType, Map<String, Object>>(StartupCheckType.class)
+        {{
+            put(check_data_resurrection,
+                new HashMap<String, Object>()
+                {{
+                    for (int i = 0; i < configs.length - 1; i = i + 2)
+                        put(configs[i], configs[i + 1]);
+                }});
+        }};
+    }
+
+    private void checkHeartbeat(IInvokableInstance instance) throws Exception
+    {
+        File heartbeatFile = new File(((String[]) instance.config().get("data_file_directories"))[0],
+                                      DEFAULT_HEARTBEAT_FILE);
+        assertTrue(heartbeatFile.exists());
+        Heartbeat heartbeat = Heartbeat.deserializeFromJsonFile(heartbeatFile);
+        assertNotNull(heartbeat.lastHeartbeat);
+        assertTrue(heartbeat.lastHeartbeat.toEpochMilli() < Global.currentTimeMillis());
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/FailingRepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/FailingRepairTest.java
index 7feefa3..eb1cdff 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/FailingRepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/FailingRepairTest.java
@@ -20,6 +20,7 @@
 
 import java.io.IOException;
 import java.io.Serializable;
+import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
@@ -44,9 +45,8 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.distributed.Cluster;
-import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.db.DataRange;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.PartitionPosition;
@@ -55,10 +55,12 @@
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.ICluster;
-import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
 import org.apache.cassandra.distributed.impl.InstanceKiller;
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
@@ -72,6 +74,7 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService.ParentRepairStatus;
 import org.apache.cassandra.service.StorageService;
+import org.awaitility.Awaitility;
 
 @RunWith(Parameterized.class)
 public class FailingRepairTest extends TestBaseImpl implements Serializable
@@ -110,7 +113,7 @@
         return () -> {
             String cfName = getCfName(type, parallelism, withTracing);
             ColumnFamilyStore cf = Keyspace.open(KEYSPACE).getColumnFamilyStore(cfName);
-            cf.forceBlockingFlush();
+            Util.flush(cf);
             Set<SSTableReader> remove = cf.getLiveSSTables();
             Set<SSTableReader> replace = new HashSet<>();
             if (type == Verb.VALIDATION_REQ)
@@ -162,7 +165,12 @@
     public void cleanupState()
     {
         for (int i = 1; i <= CLUSTER.size(); i++)
-            CLUSTER.get(i).runOnInstance(InstanceKiller::clear);
+        {
+            IInvokableInstance inst = CLUSTER.get(i);
+            if (inst.isShutdown())
+                inst.startup();
+            inst.runOnInstance(InstanceKiller::clear);
+        }
     }
 
     @Test(timeout = 10 * 60 * 1000)
@@ -240,10 +248,7 @@
         // its possible that the coordinator gets the message that the replica failed before the replica completes
         // shutting down; this then means that isKilled could be updated after the fact
         IInvokableInstance replicaInstance = CLUSTER.get(replica);
-        while (replicaInstance.killAttempts() <= 0)
-            Uninterruptibles.sleepUninterruptibly(50, TimeUnit.MILLISECONDS);
-
-        Assert.assertEquals("replica should be killed", 1, replicaInstance.killAttempts());
+        Awaitility.await().atMost(Duration.ofSeconds(30)).until(replicaInstance::isShutdown);
         Assert.assertEquals("coordinator should not be killed", 0, CLUSTER.get(coordinator).killAttempts());
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/FailingResponseDoesNotLogTest.java b/test/distributed/org/apache/cassandra/distributed/test/FailingResponseDoesNotLogTest.java
new file mode 100644
index 0000000..1071938
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/FailingResponseDoesNotLogTest.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.distributed.test;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.BatchQueryOptions;
+import org.apache.cassandra.cql3.CQLStatement;
+import org.apache.cassandra.cql3.QueryHandler;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.statements.BatchStatement;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.LogAction;
+import org.apache.cassandra.distributed.api.LogResult;
+import org.apache.cassandra.exceptions.RequestExecutionException;
+import org.apache.cassandra.exceptions.RequestValidationException;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.transport.SimpleClient;
+import org.apache.cassandra.transport.messages.ResultMessage;
+import org.apache.cassandra.utils.MD5Digest;
+import org.assertj.core.api.Assertions;
+
+/**
+ * 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.
+ *
+ * This class makes sure we do not do logging/update metrics for client from a specific set of ip domains, so as long
+ * as we still do not log/update metrics, then the test is doing the right thing.
+ */
+public class FailingResponseDoesNotLogTest extends TestBaseImpl
+{
+    @BeforeClass
+    public static void beforeClassTopLevel() // need to make sure not to conflict with TestBaseImpl.beforeClass
+    {
+
+        DatabaseDescriptor.clientInitialization();
+    }
+
+    @Test
+    public void dispatcherErrorDoesNotLock() throws IOException
+    {
+        System.setProperty("cassandra.custom_query_handler_class", 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")))
+                                      )
+                                      .start())
+        {
+            try (SimpleClient client = SimpleClient.builder("127.0.0.1", 9042).build().connect(false))
+            {
+                client.execute("SELECT * FROM system.peers", ConsistencyLevel.ONE);
+                Assert.fail("Query should have failed");
+            }
+            catch (Exception e)
+            {
+                // ignore; expected
+            }
+
+            // logs happen before client response; so grep is enough
+            LogAction logs = cluster.get(1).logs();
+            LogResult<List<String>> matches = logs.grep("address contained in client_error_reporting_exclusions");
+            Assertions.assertThat(matches.getResult()).hasSize(1);
+            matches = logs.grep("Unexpected exception during request");
+            Assertions.assertThat(matches.getResult()).isEmpty();
+        }
+        finally
+        {
+            System.clearProperty("cassandra.custom_query_handler_class");
+        }
+    }
+
+    public static class AlwaysRejectErrorQueryHandler implements QueryHandler
+    {
+        @Override
+        public CQLStatement parse(String queryString, QueryState queryState, QueryOptions options)
+        {
+            throw new AssertionError("reject");
+        }
+
+        @Override
+        public ResultMessage process(CQLStatement statement, QueryState state, QueryOptions options, Map<String, ByteBuffer> customPayload, long queryStartNanoTime) throws RequestExecutionException, RequestValidationException
+        {
+            throw new AssertionError("reject");
+        }
+
+        @Override
+        public ResultMessage.Prepared prepare(String query, ClientState clientState, Map<String, ByteBuffer> customPayload) throws RequestValidationException
+        {
+            throw new AssertionError("reject");
+        }
+
+        @Override
+        public Prepared getPrepared(MD5Digest id)
+        {
+            throw new AssertionError("reject");
+        }
+
+        @Override
+        public ResultMessage processPrepared(CQLStatement statement, QueryState state, QueryOptions options, Map<String, ByteBuffer> customPayload, long queryStartNanoTime) throws RequestExecutionException, RequestValidationException
+        {
+            throw new AssertionError("reject");
+        }
+
+        @Override
+        public ResultMessage processBatch(BatchStatement statement, QueryState state, BatchQueryOptions options, Map<String, ByteBuffer> customPayload, long queryStartNanoTime) throws RequestExecutionException, RequestValidationException
+        {
+            throw new AssertionError("reject");
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java b/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java
index bcd184e..dd419db 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/FailingTruncationTest.java
@@ -35,13 +35,17 @@
 
 public class FailingTruncationTest extends TestBaseImpl
 {
+    private static final String BB_FAIL_HELPER_PROP = "test.bbfailhelper.enabled";
+
     @Test
     public void testFailingTruncation() throws IOException
     {
-        try(Cluster cluster = init(Cluster.build(2)
-                                          .withInstanceInitializer(BBFailHelper::install)
-                                          .start()))
+        try (Cluster cluster = init(Cluster.build(2)
+                                           .withInstanceInitializer(BBFailHelper::install)
+                                           .start()))
         {
+            cluster.setUncaughtExceptionsFilter(t -> "truncateBlocking".equals(t.getMessage()));
+            System.setProperty(BB_FAIL_HELPER_PROP, "true");
             cluster.schemaChange("create table " + KEYSPACE + ".tbl (id int primary key, t int)");
             try
             {
@@ -53,11 +57,11 @@
                 assertTrue(e.getMessage().contains("Truncate failed on replica /127.0.0.2"));
             }
         }
-
     }
 
     public static class BBFailHelper
     {
+
         static void install(ClassLoader cl, int nodeNumber)
         {
             if (nodeNumber == 2)
@@ -72,8 +76,8 @@
 
         public static void truncateBlocking()
         {
-            throw new RuntimeException();
+            if (Boolean.getBoolean(BB_FAIL_HELPER_PROP))
+                throw new RuntimeException("truncateBlocking");
         }
     }
-
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/FailureLoggingTest.java b/test/distributed/org/apache/cassandra/distributed/test/FailureLoggingTest.java
new file mode 100644
index 0000000..ff8234d
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/FailureLoggingTest.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.distributed.test;
+
+import java.io.IOException;
+import java.util.List;
+
+import net.bytebuddy.ByteBuddy;
+import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
+import net.bytebuddy.implementation.MethodDelegation;
+
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.db.SinglePartitionReadCommand;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.LogResult;
+import org.apache.cassandra.exceptions.UnavailableException;
+import org.apache.cassandra.service.StorageProxy;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.reads.range.RangeCommandIterator;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class FailureLoggingTest extends TestBaseImpl
+{
+    private static Cluster cluster;
+    
+    @BeforeClass
+    public static void setUpCluster() throws IOException
+    {
+        CassandraRelevantProperties.FAILURE_LOGGING_INTERVAL_SECONDS.setInt(0);
+        cluster = init(Cluster.build(1).withInstanceInitializer(BBRequestFailures::install).start());
+        cluster.schemaChange("create table "+KEYSPACE+".tbl (id int primary key, i int)");
+    }
+
+    @AfterClass
+    public static void tearDownCluster()
+    {
+        if (cluster != null)
+            cluster.close();
+    }
+
+    @Before
+    public void resetBootstrappingState()
+    {
+        cluster.get(1).callOnInstance(() -> BBRequestFailures.bootstrapping = false);
+        
+    }
+
+    @Test
+    public void testRequestBootstrapFail() throws Throwable
+    {
+        cluster.get(1).callOnInstance(() -> BBRequestFailures.bootstrapping = true);
+        long mark = cluster.get(1).logs().mark();
+
+        try
+        {
+            cluster.coordinator(1).execute("select * from " + KEYSPACE + ".tbl where id = 55", ConsistencyLevel.ALL);
+            fail("Query should fail");
+        }
+        catch (RuntimeException e)
+        {
+            LogResult<List<String>> result = cluster.get(1).logs().grep(mark, "while executing SELECT");
+            assertEquals(1, result.getResult().size());
+            assertTrue(result.getResult().get(0).contains("Cannot read from a bootstrapping node"));
+        }
+    }
+
+    @Test
+    public void testRangeRequestFail() throws Throwable
+    {
+        long mark = cluster.get(1).logs().mark();
+
+        try
+        {
+            cluster.coordinator(1).execute("select * from " + KEYSPACE + ".tbl", ConsistencyLevel.ALL);
+            fail("Query should fail");
+        }
+        catch (RuntimeException e)
+        {
+            LogResult<List<String>> result = cluster.get(1).logs().grep(mark, "while executing SELECT");
+            assertEquals(1, result.getResult().size());
+            assertTrue(result.getResult().get(0).contains("Cannot achieve consistency level"));
+        }
+    }
+
+    @Test
+    public void testReadRequestFail() throws Throwable
+    {
+        long mark = cluster.get(1).logs().mark();
+
+        try
+        {
+            cluster.coordinator(1).execute("select * from " + KEYSPACE + ".tbl where id = 55", ConsistencyLevel.ALL);
+            fail("Query should fail");
+        }
+        catch (RuntimeException e)
+        {
+            LogResult<List<String>> result = cluster.get(1).logs().grep(mark, "while executing SELECT");
+            assertEquals(1, result.getResult().size());
+            assertTrue(result.getResult().get(0).contains("Cannot achieve consistency level"));
+        }
+    }
+
+    public static class BBRequestFailures
+    {
+        static volatile boolean bootstrapping = false;
+        
+        static void install(ClassLoader cl, int nodeNumber)
+        {
+            ByteBuddy bb = new ByteBuddy();
+            
+            bb.redefine(StorageService.class)
+              .method(named("isBootstrapMode"))
+              .intercept(MethodDelegation.to(BBRequestFailures.class))
+              .make()
+              .load(cl, ClassLoadingStrategy.Default.INJECTION);
+
+            bb.redefine(RangeCommandIterator.class)
+              .method(named("sendNextRequests"))
+              .intercept(MethodDelegation.to(BBRequestFailures.class))
+              .make()
+              .load(cl, ClassLoadingStrategy.Default.INJECTION);
+
+            bb.redefine(StorageProxy.class)
+              .method(named("fetchRows"))
+              .intercept(MethodDelegation.to(BBRequestFailures.class))
+              .make()
+              .load(cl, ClassLoadingStrategy.Default.INJECTION);
+        }
+
+        @SuppressWarnings("unused")
+        public static boolean isBootstrapMode()
+        {
+            return bootstrapping;
+        }
+
+        @SuppressWarnings("unused")
+        public static PartitionIterator sendNextRequests()
+        {
+            throw UnavailableException.create(org.apache.cassandra.db.ConsistencyLevel.ALL, 1, 0);
+        }
+
+        @SuppressWarnings("unused")
+        public static PartitionIterator fetchRows(List<SinglePartitionReadCommand> commands, 
+                                                  org.apache.cassandra.db.ConsistencyLevel consistencyLevel, 
+                                                  long queryStartNanoTime)
+        {
+            throw UnavailableException.create(org.apache.cassandra.db.ConsistencyLevel.ALL, 1, 0);
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/test/FrozenUDTTest.java b/test/distributed/org/apache/cassandra/distributed/test/FrozenUDTTest.java
index 2a45b86..3b54398 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/FrozenUDTTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/FrozenUDTTest.java
@@ -150,4 +150,4 @@
     {
         return String.format("system.fromjson('{\"foo\":\"%d\", \"bar\":\"%d\"}')", i, j);
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java b/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java
index 5b9629a..341d854 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/GossipSettlesTest.java
@@ -33,7 +33,7 @@
 import org.apache.cassandra.gms.FailureDetector;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.repair.SystemDistributedKeyspace;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.service.StorageService;
diff --git a/test/distributed/org/apache/cassandra/distributed/test/GossipShutdownTest.java b/test/distributed/org/apache/cassandra/distributed/test/GossipShutdownTest.java
index ad21c21..c05925f 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/GossipShutdownTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/GossipShutdownTest.java
@@ -20,29 +20,30 @@
 
 import java.io.IOException;
 import java.io.Serializable;
-import java.net.InetSocketAddress;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.Test;
 
 import org.apache.cassandra.distributed.Cluster;
-import org.apache.cassandra.distributed.api.ConsistencyLevel;
-import org.apache.cassandra.gms.ApplicationState;
 import org.apache.cassandra.gms.EndpointState;
-import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.gms.IEndpointStateChangeSubscriber;
-import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
 
+
+import static java.lang.Thread.sleep;
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.ALL;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.gms.Gossiper.instance;
+import static org.apache.cassandra.net.Verb.GOSSIP_DIGEST_ACK;
+import static org.apache.cassandra.net.Verb.GOSSIP_DIGEST_SYN;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
 public class GossipShutdownTest extends TestBaseImpl
 {
@@ -61,27 +62,27 @@
             cluster.schemaChange("create table "+KEYSPACE+".tbl (id int primary key, v int)");
 
             for (int i = 0; i < 10; i++)
-                cluster.coordinator(1).execute("insert into "+KEYSPACE+".tbl (id, v) values (?,?)", ConsistencyLevel.ALL, i, i);
+                cluster.coordinator(1).execute("insert into "+KEYSPACE+".tbl (id, v) values (?,?)", ALL, i, i);
 
-            SimpleCondition timeToShutdown = new SimpleCondition();
-            SimpleCondition waitForShutdown = new SimpleCondition();
+            Condition timeToShutdown = newOneTimeCondition();
+            Condition waitForShutdown = newOneTimeCondition();
             AtomicBoolean signalled = new AtomicBoolean(false);
             Future f = es.submit(() -> {
                 await(timeToShutdown);
 
                 cluster.get(1).runOnInstance(() -> {
-                    Gossiper.instance.register(new EPChanges());
+                    instance.register(new EPChanges());
                 });
 
                 cluster.get(2).runOnInstance(() -> {
                     StorageService.instance.setIsShutdownUnsafeForTests(true);
-                    Gossiper.instance.stop();
+                    instance.stop();
                 });
                 waitForShutdown.signalAll();
             });
 
-            cluster.filters().outbound().from(2).to(1).verbs(Verb.GOSSIP_DIGEST_SYN.id).messagesMatching((from, to, message) -> true).drop();
-            cluster.filters().outbound().from(2).to(1).verbs(Verb.GOSSIP_DIGEST_ACK.id).messagesMatching((from, to, message) ->
+            cluster.filters().outbound().from(2).to(1).verbs(GOSSIP_DIGEST_SYN.id).messagesMatching((from, to, message) -> true).drop();
+            cluster.filters().outbound().from(2).to(1).verbs(GOSSIP_DIGEST_ACK.id).messagesMatching((from, to, message) ->
                                                                                                          {
                                                                                                              if (signalled.compareAndSet(false, true))
                                                                                                              {
@@ -92,7 +93,7 @@
                                                                                                              return true;
                                                                                                          }).drop();
 
-            Thread.sleep(10000); // wait for gossip to exchange a few messages
+            sleep(10000); // wait for gossip to exchange a few messages
             f.get();
         }
         finally
@@ -101,7 +102,7 @@
         }
     }
 
-    private static void await(SimpleCondition sc)
+    private static void await(Condition sc)
     {
         try
         {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java b/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java
index 4569600..c5f2a07 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/GossipTest.java
@@ -37,6 +37,7 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.*;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
 import org.apache.cassandra.gms.ApplicationState;
 import org.apache.cassandra.gms.EndpointState;
 import org.apache.cassandra.gms.Gossiper;
@@ -46,6 +47,7 @@
 import org.apache.cassandra.streaming.StreamPlan;
 import org.apache.cassandra.streaming.StreamResultFuture;
 import org.apache.cassandra.utils.FBUtilities;
+import org.assertj.core.api.Assertions;
 
 import static net.bytebuddy.matcher.ElementMatchers.named;
 import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
@@ -54,7 +56,6 @@
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static org.apache.cassandra.distributed.api.TokenSupplier.evenlyDistributedTokens;
 import static org.apache.cassandra.distributed.impl.DistributedTestSnitch.toCassandraInetAddressAndPort;
-import static org.apache.cassandra.distributed.shared.ClusterUtils.getLocalToken;
 import static org.apache.cassandra.distributed.shared.ClusterUtils.runAndWaitForLogs;
 import static org.apache.cassandra.distributed.shared.NetworkTopology.singleDcNetworkTopology;
 import static org.junit.Assert.assertEquals;
@@ -116,7 +117,7 @@
                 }).accept(failAddress);
             }
 
-            cluster.get(fail).shutdown(false).get();
+            ClusterUtils.stopAbrupt(cluster, cluster.get(fail));
             cluster.get(late).startup();
             cluster.get(late).acceptsOnInstance((InetSocketAddress address) -> {
                 EndpointState ep;
@@ -244,9 +245,11 @@
     @Test
     public void gossipShutdownUpdatesTokenMetadata() throws Exception
     {
+        // TODO: fails with vnode enabled
         try (Cluster cluster = Cluster.build(3)
                                       .withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK))
                                       .withInstanceInitializer(FailureHelper::installMoveFailure)
+                                      .withoutVNodes()
                                       .start())
         {
             init(cluster, 2);
@@ -313,6 +316,13 @@
         }
     }
 
+    private static String getLocalToken(IInvokableInstance node)
+    {
+        Collection<String> tokens = ClusterUtils.getLocalTokens(node);
+        Assertions.assertThat(tokens).hasSize(1);
+        return tokens.stream().findFirst().get();
+    }
+
     void assertPendingRangesForPeer(final boolean expectPending, final InetSocketAddress movingAddress, final Cluster cluster)
     {
         for (IInvokableInstance inst : new IInvokableInstance[]{ cluster.get(1), cluster.get(3)})
diff --git a/test/distributed/org/apache/cassandra/distributed/test/GroupByTest.java b/test/distributed/org/apache/cassandra/distributed/test/GroupByTest.java
index cab3fee..789321d 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/GroupByTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/GroupByTest.java
@@ -18,6 +18,7 @@
 
 package org.apache.cassandra.distributed.test;
 
+import java.util.Date;
 import java.util.Iterator;
 
 import com.google.common.collect.Iterators;
@@ -31,7 +32,11 @@
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.ICoordinator;
+import org.apache.cassandra.serializers.SimpleDateSerializer;
+import org.apache.cassandra.serializers.TimeSerializer;
+import org.apache.cassandra.serializers.TimestampSerializer;
 
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
@@ -42,7 +47,7 @@
     @Test
     public void groupByWithDeletesAndSrpOnPartitions() throws Throwable
     {
-        try (Cluster cluster = init(builder().withNodes(2).withConfig((cfg) -> cfg.set("enable_user_defined_functions", "true")).start()))
+        try (Cluster cluster = init(builder().withNodes(2).withConfig((cfg) -> cfg.set("user_defined_functions_enabled", "true")).start()))
         {
             cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (pk int, ck text, PRIMARY KEY (pk, ck))"));
             initFunctions(cluster);
@@ -69,7 +74,7 @@
     @Test
     public void groupByWithDeletesAndSrpOnRows() throws Throwable
     {
-        try (Cluster cluster = init(builder().withNodes(2).withConfig((cfg) -> cfg.set("enable_user_defined_functions", "true")).start()))
+        try (Cluster cluster = init(builder().withNodes(2).withConfig((cfg) -> cfg.set("user_defined_functions_enabled", "true")).start()))
         {
             cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (pk int, ck text, PRIMARY KEY (pk, ck))"));
             initFunctions(cluster);
@@ -96,7 +101,7 @@
     @Test
     public void testGroupByWithAggregatesAndPaging() throws Throwable
     {
-        try (Cluster cluster = init(builder().withNodes(2).withConfig((cfg) -> cfg.set("enable_user_defined_functions", "true")).start()))
+        try (Cluster cluster = init(builder().withNodes(2).withConfig((cfg) -> cfg.set("user_defined_functions_enabled", "true")).start()))
         {
             cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (pk int, ck int, v1 text, v2 text, v3 text, primary key (pk, ck))"));
             initFunctions(cluster);
@@ -149,6 +154,183 @@
         }
     }
 
+    @Test
+    public void testGroupByTimeRangesWithTimestampType() throws Throwable
+    {
+        try (Cluster cluster = init(builder().withNodes(3).start()))
+        {
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.testWithTimestamp (pk int, time timestamp, v int, primary key (pk, time))"));
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:10:00 UTC', 1)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:12:00 UTC', 2)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:14:00 UTC', 3)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:15:00 UTC', 4)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:21:00 UTC', 5)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:22:00 UTC', 6)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:26:00 UTC', 7)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (1, '2016-09-27 16:26:20 UTC', 8)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (2, '2016-09-27 16:26:20 UTC', 10)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTimestamp (pk, time, v) VALUES (2, '2016-09-27 16:30:00 UTC', 11)"), ConsistencyLevel.QUORUM);
+
+            for (int pageSize : new int[] {2, 3, 4, 5, 7, 10})
+            {
+                for (String startingTime : new String[] {"", ", '2016-09-27 UTC'"} )
+                {
+                    String stmt = "SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithTimestamp GROUP BY pk, floor(time, 5m" + startingTime + ")";
+                    Iterator<Object[]> pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                               row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                               row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                               row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                               row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L),
+                               row(2, toTimestamp("2016-09-27 16:30:00 UTC"), 11, 11, 1L));
+
+                    stmt = "SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithTimestamp GROUP BY pk, floor(time, 5m" + startingTime + ") LIMIT 2";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                               row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L));
+
+                    stmt = "SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithTimestamp GROUP BY pk, floor(time, 5m" + startingTime + ") PER PARTITION LIMIT 1";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                               row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L));
+
+                    stmt = "SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithTimestamp WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                               row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                               row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                               row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L));
+
+                    stmt = "SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithTimestamp WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC LIMIT 2";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                               row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L));
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithDateType() throws Throwable
+    {
+        try (Cluster cluster = init(builder().withNodes(3).start()))
+        {
+
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.testWithDate (pk int, time date, v int, primary key (pk, time))"));
+
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-09-27', 1)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-09-28', 2)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-09-29', 3)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-09-30', 4)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-10-01', 5)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-10-04', 6)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-10-20', 7)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (1, '2016-11-27', 8)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (2, '2016-11-01', 10)"), ConsistencyLevel.QUORUM);
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithDate (pk, time, v) VALUES (2, '2016-11-02', 11)"), ConsistencyLevel.QUORUM);
+
+            for (int pageSize : new int[] {2, 3, 4, 5, 7, 10})
+            {
+                for (String startingTime : new String[] {"", ", '2016-06-01'"} )
+                {
+
+                    String stmt = "SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithDate GROUP BY pk, floor(time, 1mo" + startingTime + ")";
+                    Iterator<Object[]> pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-09-01"), 1, 4, 4L),
+                               row(1, toLocalDate("2016-10-01"), 5, 7, 3L),
+                               row(1, toLocalDate("2016-11-01"), 8, 8, 1L),
+                               row(2, toLocalDate("2016-11-01"), 10, 11, 2L));
+
+                    stmt = "SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithDate GROUP BY pk, floor(time, 1mo" + startingTime + ") LIMIT 2";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-09-01"), 1, 4, 4L),
+                               row(1, toLocalDate("2016-10-01"), 5, 7, 3L));
+
+                    stmt = "SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithDate GROUP BY pk, floor(time, 1mo" + startingTime + ") PER PARTITION LIMIT 1";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-09-01"), 1, 4, 4L),
+                               row(2, toLocalDate("2016-11-01"), 10, 11, 2L));
+
+                    stmt = "SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithDate WHERE pk = 1 GROUP BY pk, floor(time, 1mo" + startingTime + ") ORDER BY time DESC";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-11-01"), 8, 8, 1L),
+                               row(1, toLocalDate("2016-10-01"), 5, 7, 3L),
+                               row(1, toLocalDate("2016-09-01"), 1, 4, 4L));
+
+                    stmt = "SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s.testWithDate WHERE pk = 1 GROUP BY pk, floor(time, 1mo" + startingTime + ") ORDER BY time DESC LIMIT 2";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-11-01"), 8, 8, 1L),
+                               row(1, toLocalDate("2016-10-01"), 5, 7, 3L));
+                }
+            }
+        }
+    }
+
+        @Test
+        public void testGroupByTimeRangesWithTimeType() throws Throwable
+        {
+            try (Cluster cluster = init(builder().withNodes(3).start()))
+            {
+
+                cluster.schemaChange(withKeyspace("CREATE TABLE %s.testWithTime (pk int, date date, time time, v int, primary key (pk, date, time))"));
+
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:10:00', 1)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:12:00', 2)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:14:00', 3)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:15:00', 4)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:21:00', 5)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:22:00', 6)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:26:00', 7)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-27', '16:26:20', 8)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-28', '16:26:20', 9)"), ConsistencyLevel.QUORUM);
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.testWithTime (pk, date, time, v) VALUES (1, '2016-09-28', '16:26:30', 10)"), ConsistencyLevel.QUORUM);
+
+                for (int pageSize : new int[] {2, 3, 4, 5, 7, 10})
+                {
+
+                    String stmt = "SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s.testWithTime GROUP BY pk, date, floor(time, 5m)";
+                    Iterator<Object[]> pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:20:00"), 5, 6, 2L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L),
+                               row(1, toLocalDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L));
+
+                    stmt = "SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s.testWithTime GROUP BY pk, date, floor(time, 5m) LIMIT 2";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L));
+
+                    stmt = "SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s.testWithTime WHERE pk = 1 GROUP BY pk, date, floor(time, 5m) ORDER BY date DESC, time DESC";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:20:00"), 5, 6, 2L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L));
+
+                    stmt = "SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s.testWithTime WHERE pk = 1 GROUP BY pk, date, floor(time, 5m) ORDER BY date DESC, time DESC LIMIT 2";
+                    pagingRows = cluster.coordinator(1).executeWithPaging(withKeyspace(stmt), QUORUM, pageSize);
+                    assertRows(pagingRows, 
+                               row(1, toLocalDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L),
+                               row(1, toLocalDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L));
+                }
+            }
+        }
+
     private static void initFunctions(Cluster cluster)
     {
         cluster.schemaChange(withKeyspace("CREATE FUNCTION %s.concat_strings_fn(a text, b text) " +
@@ -162,4 +344,20 @@
                                           " STYPE text" +
                                           " INITCOND '_'"));
     }
+
+    private static Date toTimestamp(String timestampAsString)
+    {
+        return new Date(TimestampSerializer.dateStringToTimestamp(timestampAsString));
+    }
+
+    private static int toLocalDate(String dateAsString)
+    {
+        return SimpleDateSerializer.dateStringToDays(dateAsString) ;
+    }
+
+    private static long toTime(String timeAsString)
+    {
+        return TimeSerializer.timeStringToLong(timeAsString) ;
+    }
+
 }
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/test/HintedHandoffNodetoolTest.java b/test/distributed/org/apache/cassandra/distributed/test/HintedHandoffNodetoolTest.java
index 5045301..a401bd0 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/HintedHandoffNodetoolTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/HintedHandoffNodetoolTest.java
@@ -122,10 +122,10 @@
     @Test
     public void testThrottle()
     {
-        Integer throttleInKB = cluster.get(node).callOnInstance(DatabaseDescriptor::getHintedHandoffThrottleInKB);
-        cluster.get(node).nodetoolResult("sethintedhandoffthrottlekb", String.valueOf(throttleInKB * 2)).asserts().success();
-        Integer newThrottleInKB = cluster.get(node).callOnInstance(DatabaseDescriptor::getHintedHandoffThrottleInKB);
-        assertEquals(throttleInKB * 2, newThrottleInKB.intValue());
+        Integer throttleInKiB = cluster.get(node).callOnInstance(DatabaseDescriptor::getHintedHandoffThrottleInKiB);
+        cluster.get(node).nodetoolResult("sethintedhandoffthrottlekb", String.valueOf(throttleInKiB * 2)).asserts().success();
+        Integer newThrottleInKB = cluster.get(node).callOnInstance(DatabaseDescriptor::getHintedHandoffThrottleInKiB);
+        assertEquals(throttleInKiB * 2, newThrottleInKB.intValue());
     }
 
     @SuppressWarnings("Convert2MethodRef")
diff --git a/test/distributed/org/apache/cassandra/distributed/test/HintsDisabledTest.java b/test/distributed/org/apache/cassandra/distributed/test/HintsDisabledTest.java
new file mode 100644
index 0000000..00c7e7c
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/HintsDisabledTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.distributed.test;
+
+import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+
+import org.awaitility.Awaitility;
+import org.junit.Test;
+
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.IMessageFilters;
+import org.apache.cassandra.metrics.StorageMetrics;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+
+import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
+import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.net.Verb.MUTATION_REQ;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class HintsDisabledTest extends TestBaseImpl
+{
+    @Test
+    public void testHintedHandoffDisabled() throws IOException
+    {
+        try (Cluster cluster = init(Cluster.build(2)
+                                           .withDataDirCount(1)
+                                           .withConfig(config -> config.with(NETWORK, GOSSIP)
+                                                                       .set("write_request_timeout", "1000ms")
+                                                                       .set("hinted_handoff_enabled", false))
+                                           .start(), 2))
+        {
+            String createTableStatement = String.format("CREATE TABLE %s.cf (k text PRIMARY KEY, c1 text) " +
+                                                        "WITH compaction = {'class': 'SizeTieredCompactionStrategy', 'enabled': 'false'} ", KEYSPACE);
+            cluster.schemaChange(createTableStatement);
+
+            CountDownLatch dropped = CountDownLatch.newCountDownLatch(1);
+            // Drop all messages from node1 to node2 so hints should be created
+            IMessageFilters.Filter drop1to2 = cluster.filters().verbs(MUTATION_REQ.id).messagesMatching((from, to, m) -> {
+                if (from != 1 || to != 2)
+                    return false;
+                dropped.decrement();
+                return true;
+            }).drop();
+
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.cf (k, c1) VALUES (?, ?) USING TIMESTAMP 1;"),
+                                           ConsistencyLevel.ONE,
+                                           String.valueOf(1),
+                                           String.valueOf(1));
+            // make sure the write response handler has completed after a chance to hint
+            assertTrue(dropped.awaitUninterruptibly(1, TimeUnit.MINUTES));
+            cluster.get(1).runOnInstance(() -> {
+                Awaitility.waitAtMost(1, TimeUnit.MINUTES).until(() -> Stage.INTERNAL_RESPONSE.executor().getPendingTaskCount() == 0);
+            });
+
+            // Check that no hints were created on node1
+            assertThat(cluster.get(1).callOnInstance(() -> Long.valueOf(StorageMetrics.totalHints.getCount()))).isEqualTo(0L);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/IncRepairAdminTest.java b/test/distributed/org/apache/cassandra/distributed/test/IncRepairAdminTest.java
index 236c819..b902632 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/IncRepairAdminTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/IncRepairAdminTest.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.net.InetSocketAddress;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -41,11 +40,13 @@
 import org.apache.cassandra.repair.consistent.LocalSessionAccessor;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.PreviewKind;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static org.apache.cassandra.repair.consistent.ConsistentSession.State.REPAIRING;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertTrue;
 
 public class IncRepairAdminTest extends TestBaseImpl
@@ -83,7 +84,7 @@
                 res.asserts().stdoutContains("no sessions");
             });
 
-            UUID uuid = makeFakeSession(cluster);
+            TimeUUID uuid = makeFakeSession(cluster);
             awaitNodetoolRepairAdminContains(cluster, uuid, "REPAIRING", false);
             IInvokableInstance instance = cluster.get(coordinator ? 1 : 2);
 
@@ -113,7 +114,7 @@
 
 
 
-    private static void awaitNodetoolRepairAdminContains(Cluster cluster, UUID uuid, String state, boolean all)
+    private static void awaitNodetoolRepairAdminContains(Cluster cluster, TimeUUID uuid, String state, boolean all)
     {
         cluster.forEach(i -> {
             while (true)
@@ -136,9 +137,9 @@
         });
     }
 
-    private static UUID makeFakeSession(Cluster cluster)
+    private static TimeUUID makeFakeSession(Cluster cluster)
     {
-        UUID sessionId = UUIDGen.getTimeUUID();
+        TimeUUID sessionId = nextTimeUUID();
         InetSocketAddress coordinator = cluster.get(1).config().broadcastAddress();
         Set<InetSocketAddress> participants = cluster.stream()
                                                      .map(i -> i.config().broadcastAddress())
@@ -153,7 +154,7 @@
                                                                          Lists.newArrayList(cfs),
                                                                          Sets.newHashSet(range),
                                                                          true,
-                                                                         System.currentTimeMillis(),
+                                                                         currentTimeMillis(),
                                                                          true,
                                                                          PreviewKind.NONE);
                 LocalSessionAccessor.prepareUnsafe(sessionId,
diff --git a/test/distributed/org/apache/cassandra/distributed/test/IncRepairCoordinatorErrorTest.java b/test/distributed/org/apache/cassandra/distributed/test/IncRepairCoordinatorErrorTest.java
index c06e848..447cd82 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/IncRepairCoordinatorErrorTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/IncRepairCoordinatorErrorTest.java
@@ -18,14 +18,13 @@
 
 package org.apache.cassandra.distributed.test;
 
-import java.util.UUID;
-
 import org.junit.Test;
 
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.net.Verb.FINALIZE_COMMIT_MSG;
 import static org.assertj.core.api.Assertions.assertThat;
@@ -47,7 +46,7 @@
                    .to(3)
                    .messagesMatching((from, to, msg) -> msg.verb() == FINALIZE_COMMIT_MSG.id).drop();
             cluster.get(1).nodetoolResult("repair", KEYSPACE).asserts().success();
-            UUID result = (UUID) cluster.get(1).executeInternal("select parent_id from system_distributed.repair_history")[0][0];
+            TimeUUID result = (TimeUUID) cluster.get(1).executeInternal("select parent_id from system_distributed.repair_history")[0][0];
             cluster.get(3).runOnInstance(() -> {
                 ActiveRepairService.instance.failSession(result.toString(), true);
             });
diff --git a/test/distributed/org/apache/cassandra/distributed/test/IncRepairTruncationTest.java b/test/distributed/org/apache/cassandra/distributed/test/IncRepairTruncationTest.java
index 4ffdaa9..989e0ab 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/IncRepairTruncationTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/IncRepairTruncationTest.java
@@ -26,6 +26,7 @@
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.util.concurrent.Uninterruptibles;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.Test;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -33,14 +34,15 @@
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.IMessage;
-import org.apache.cassandra.distributed.api.IMessageFilters;
 import org.apache.cassandra.distributed.api.NodeToolResult;
 import org.apache.cassandra.net.Verb;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+
 
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.distributed.api.IMessageFilters.Matcher;
 import static org.apache.cassandra.distributed.test.PreviewRepairTest.insert;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 
 public class IncRepairTruncationTest extends TestBaseImpl
 {
@@ -133,10 +135,10 @@
         }
     }
 
-    private static class BlockMessage implements IMessageFilters.Matcher
+    private static class BlockMessage implements Matcher
     {
-        private final SimpleCondition gotMessage = new SimpleCondition();
-        private final SimpleCondition allowMessage = new SimpleCondition();
+        private final Condition gotMessage = newOneTimeCondition();
+        private final Condition allowMessage = newOneTimeCondition();
 
         public boolean matches(int from, int to, IMessage message)
         {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/IndexDroppingTest.java b/test/distributed/org/apache/cassandra/distributed/test/IndexDroppingTest.java
index 3622d7d..a7cc1ad3 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/IndexDroppingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/IndexDroppingTest.java
@@ -57,7 +57,7 @@
     @BeforeClass
     public static void init() throws IOException
     {
-        CLUSTER = Cluster.build(1).withConfig(conf -> conf.with(NETWORK).set("enable_materialized_views", "true")).start();
+        CLUSTER = Cluster.build(1).withConfig(conf -> conf.with(NETWORK).set("materialized_views_enabled", "true")).start();
         CLUSTER.get(1).runOnInstance((IIsolatedExecutor.SerializableRunnable) () -> CompactionManager.instance.disableAutoCompaction());
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionEnforcementTest.java b/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionEnforcementTest.java
index 969f372..62f0a73 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionEnforcementTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionEnforcementTest.java
@@ -32,7 +32,6 @@
 
 import static com.google.common.collect.Iterables.getOnlyElement;
 import static org.hamcrest.Matchers.containsString;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -87,8 +86,7 @@
 
             cluster.get(1).runOnInstance(() ->
             {
-                InboundMessageHandlers inbound = getOnlyElement(MessagingService.instance().messageHandlers.values());
-                assertEquals(0, inbound.count());
+                assertTrue(MessagingService.instance().messageHandlers.isEmpty());
 
                 OutboundConnections outbound = getOnlyElement(MessagingService.instance().channelManagers.values());
                 assertFalse(outbound.small.isConnected() || outbound.large.isConnected() || outbound.urgent.isConnected());
diff --git a/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionOptionsTest.java b/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionOptionsTest.java
index 1462b03..b06f02a 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionOptionsTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/InternodeEncryptionOptionsTest.java
@@ -55,7 +55,7 @@
                   ImmutableMap.builder().putAll(validKeystore)
                   .put("internode_encryption", "none")
                   .put("optional", false)
-                  .put("enable_legacy_ssl_storage_port", "true")
+                  .put("legacy_ssl_storage_port_enabled", "true")
                   .build());
         }).createWithoutStarting())
         {
@@ -113,7 +113,7 @@
                   ImmutableMap.builder().putAll(validKeystore)
                               .put("internode_encryption", "none")
                               .put("optional", true)
-                              .put("enable_legacy_ssl_storage_port", "true")
+                              .put("legacy_ssl_storage_port_enabled", "true")
                               .build());
         }).createWithoutStarting())
         {
@@ -148,7 +148,7 @@
                   ImmutableMap.builder().putAll(validKeystore)
                               .put("internode_encryption", "none")
                               .put("optional", true)
-                              .put("enable_legacy_ssl_storage_port", "true")
+                              .put("legacy_ssl_storage_port_enabled", "true")
                               .build());
         }).createWithoutStarting())
         {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/InternodeErrorExclusionTest.java b/test/distributed/org/apache/cassandra/distributed/test/InternodeErrorExclusionTest.java
new file mode 100644
index 0000000..08fd122
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/InternodeErrorExclusionTest.java
@@ -0,0 +1,68 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.concurrent.TimeoutException;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.transport.SimpleClient;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class InternodeErrorExclusionTest extends TestBaseImpl
+{
+    @BeforeClass
+    public static void beforeClass2()
+    {
+        DatabaseDescriptor.clientInitialization();
+    }
+
+    // Connect a simple native client to the internode port (which fails on the protocol magic check)
+    // and make sure the exception is swallowed.
+    @Test
+    public void ignoreExcludedInternodeErrors() throws IOException, TimeoutException
+    {
+        try (Cluster cluster = Cluster.build(1)
+                                      .withConfig(c -> c
+                                                       .with(Feature.NETWORK)
+                                                       .set("internode_error_reporting_exclusions", ImmutableMap.of("subnets", Arrays.asList("127.0.0.1"))))
+                                      .start())
+        {
+            try (SimpleClient client = SimpleClient.builder("127.0.0.1", 7012).build())
+            {
+                client.connect(true);
+                Assert.fail("Connection should fail");
+            }
+            catch (Exception e)
+            {
+                // expected
+            }
+            assertThat(cluster.get(1).logs().watchFor("address contained in internode_error_reporting_exclusions").getResult()).hasSize(1);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/JVMDTestTest.java b/test/distributed/org/apache/cassandra/distributed/test/JVMDTestTest.java
index ebf00d7..089d17b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/JVMDTestTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/JVMDTestTest.java
@@ -26,6 +26,7 @@
 import java.util.concurrent.TimeoutException;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.junit.Test;
 
 import org.apache.cassandra.concurrent.Stage;
@@ -35,7 +36,6 @@
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.LogAction;
-import org.apache.cassandra.service.CassandraDaemon;
 import org.apache.cassandra.utils.FBUtilities;
 import org.assertj.core.api.Assertions;
 
@@ -80,7 +80,7 @@
             long mark = logs.mark(); // get the current position so watching doesn't see any previous exceptions
             cluster.get(2).runOnInstance(() -> {
                 // pretend that an uncaught exception was thrown
-                CassandraDaemon.uncaughtException(Thread.currentThread(), new RuntimeException("fail without fail"));
+                JVMStabilityInspector.uncaughtException(Thread.currentThread(), new RuntimeException("fail without fail"));
             });
             List<String> errors = logs.watchFor(mark, "^ERROR").getResult();
             Assertions.assertThat(errors)
diff --git a/test/distributed/org/apache/cassandra/distributed/test/JVMStabilityInspectorThrowableTest.java b/test/distributed/org/apache/cassandra/distributed/test/JVMStabilityInspectorThrowableTest.java
index f8b9f01..665d58c 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/JVMStabilityInspectorThrowableTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/JVMStabilityInspectorThrowableTest.java
@@ -29,6 +29,7 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.Config.DiskFailurePolicy;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -53,6 +54,7 @@
 import org.apache.cassandra.io.util.FileDataInput;
 import org.apache.cassandra.service.CassandraDaemon;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.Throwables;
 
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
@@ -102,6 +104,8 @@
         String table = policy.name();
         try (final Cluster cluster = init(getCluster(policy).start()))
         {
+            cluster.setUncaughtExceptionsFilter(t -> Throwables.anyCauseMatches(
+            t, t2 -> Arrays.asList(CorruptSSTableException.class.getCanonicalName(), FSReadError.class.getCanonicalName()).contains(t2.getClass().getCanonicalName())));
             IInvokableInstance node = cluster.get(1);
             boolean[] setup = node.callOnInstance(() -> {
                 CassandraDaemon instanceForTesting = CassandraDaemon.getInstanceForTesting();
@@ -190,7 +194,7 @@
     {
         node.runOnInstance(() -> {
             ColumnFamilyStore cf = Keyspace.open(keyspace).getColumnFamilyStore(table);
-            cf.forceBlockingFlush();
+            Util.flush(cf);
 
             Set<SSTableReader> remove = cf.getLiveSSTables();
             Set<SSTableReader> replace = new HashSet<>();
@@ -220,7 +224,7 @@
         }
 
         @Override
-        public UnfilteredRowIterator iterator(DecoratedKey key, Slices slices, ColumnFilter selectedColumns, boolean reversed, SSTableReadsListener listener)
+        public UnfilteredRowIterator rowIterator(DecoratedKey key, Slices slices, ColumnFilter selectedColumns, boolean reversed, SSTableReadsListener listener)
         {
             if (shouldThrowCorrupted)
                 throw throwCorrupted();
@@ -228,7 +232,7 @@
         }
 
         @Override
-        public UnfilteredRowIterator iterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed)
+        public UnfilteredRowIterator rowIterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed)
         {
             if (shouldThrowCorrupted)
                 throw throwCorrupted();
diff --git a/test/distributed/org/apache/cassandra/distributed/test/JavaDriverUtils.java b/test/distributed/org/apache/cassandra/distributed/test/JavaDriverUtils.java
new file mode 100644
index 0000000..c7c478b
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/JavaDriverUtils.java
@@ -0,0 +1,59 @@
+/*
+ * 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.distributed.test;
+
+import com.datastax.driver.core.ProtocolVersion;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInstance;
+
+public final class JavaDriverUtils
+{
+    private JavaDriverUtils()
+    {
+    }
+
+    public static com.datastax.driver.core.Cluster create(ICluster<? extends IInstance> dtest)
+    {
+        return create(dtest, null);
+    }
+
+    public static com.datastax.driver.core.Cluster create(ICluster<? extends IInstance> dtest, ProtocolVersion version)
+    {
+        if (dtest.size() == 0)
+            throw new IllegalArgumentException("Attempted to open java driver for empty cluster");
+
+        // make sure the needed Features are added
+        dtest.stream().forEach(i -> {
+            if (!(i.config().has(Feature.NATIVE_PROTOCOL) && i.config().has(Feature.GOSSIP))) // gossip is needed as currently Host.getHostId is empty without it
+                throw new IllegalStateException("java driver requires Feature.NATIVE_PROTOCOL and Feature.GOSSIP; but one or more is missing");
+        });
+
+        com.datastax.driver.core.Cluster.Builder builder = com.datastax.driver.core.Cluster.builder();
+
+        //TODO support port
+        //TODO support auth
+        dtest.stream().forEach(i -> builder.addContactPoint(i.broadcastAddress().getAddress().getHostAddress()));
+
+        if (version != null)
+            builder.withProtocolVersion(version);
+
+        return builder.build();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/LargeColumnTest.java b/test/distributed/org/apache/cassandra/distributed/test/LargeColumnTest.java
index 0a81359..b03171b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/LargeColumnTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/LargeColumnTest.java
@@ -29,8 +29,6 @@
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.ICluster;
 
-import static java.util.concurrent.TimeUnit.SECONDS;
-
 // TODO: this test should be removed after running in-jvm dtests is set up via the shared API repository
 public class LargeColumnTest extends TestBaseImpl
 {
@@ -67,12 +65,12 @@
         try (ICluster cluster = init(builder()
                                      .withNodes(nodes)
                                      .withConfig(config ->
-                                                 config.set("commitlog_segment_size_in_mb", (columnSize * 3) >> 20)
-                                                       .set("internode_application_send_queue_reserve_endpoint_capacity_in_bytes", columnSize * 2)
-                                                       .set("internode_application_send_queue_reserve_global_capacity_in_bytes", columnSize * 3)
-                                                       .set("write_request_timeout_in_ms", SECONDS.toMillis(30L))
-                                                       .set("read_request_timeout_in_ms", SECONDS.toMillis(30L))
-                                                       .set("memtable_heap_space_in_mb", 1024)
+                                                 config.set("commitlog_segment_size", String.format("%dMiB",(columnSize * 3) >> 20))
+                                                       .set("internode_application_send_queue_reserve_endpoint_capacity", String.format("%dB", (columnSize * 2)))
+                                                       .set("internode_application_send_queue_reserve_global_capacity", String.format("%dB", (columnSize * 3)))
+                                                       .set("write_request_timeout", "30s")
+                                                       .set("read_request_timeout", "30s")
+                                                       .set("memtable_heap_space", "1024MiB")
                                      )
                                      .start()))
         {
@@ -94,4 +92,4 @@
     {
         testLargeColumns(2, 16 << 20, 5);
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/LegacyCASTest.java b/test/distributed/org/apache/cassandra/distributed/test/LegacyCASTest.java
new file mode 100644
index 0000000..0f764cf
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/LegacyCASTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.distributed.test;
+
+import java.util.function.Consumer;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.impl.UnsafeGossipHelper;
+
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.ANY;
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.QUORUM;
+import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
+import static org.apache.cassandra.distributed.shared.AssertUtils.row;
+
+public class LegacyCASTest extends CASCommonTestCases
+{
+    private static Cluster CLUSTER;
+
+    @BeforeClass
+    public static void beforeClass() throws Throwable
+    {
+        TestBaseImpl.beforeClass();
+        CLUSTER = init(Cluster.create(3, config()));
+    }
+
+    @AfterClass
+    public static void afterClass()
+    {
+        if (CLUSTER != null)
+            CLUSTER.close();
+    }
+
+    private static Consumer<IInstanceConfig> config()
+    {
+        return config -> config
+                .set("paxos_variant", "v1")
+                .set("write_request_timeout_in_ms", 5000L)
+                .set("cas_contention_timeout_in_ms", 5000L)
+                .set("request_timeout_in_ms", 5000L);
+    }
+
+    /**
+     * This particular variant is unique to legacy Paxos because of the differing quorums for consensus, read and commit.
+     * It is also unique to range movements with an even-numbered RF under legacy paxos.
+     *
+     * Range movements do not necessarily complete; they may be aborted.
+     * CAS consistency should not be affected by this.
+     *
+     *  - Range moving from {1, 2} to {2, 3}; witnessed by all
+     *  - Promised and Accepted on {2, 3}; Commits are delayed and arrive after next commit (or perhaps vanish)
+     *  - Range move cancelled; a new one starts moving {1, 2} to {2, 4}; witnessed by all
+     *  - Promised, Accepted and Committed on {1, 4}
+     */
+    @Ignore // known to be unsafe, just documents issue
+    @Test
+    public void testAbortedRangeMovement() throws Throwable
+    {
+        try (Cluster cluster = Cluster.create(4, config()))
+        {
+            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v1 int, v2 int, PRIMARY KEY (pk, ck))");
+            int pk = pk(cluster, 1, 2);
+
+            // set {3} bootstrapping, {4} not in ring
+            for (int i = 1 ; i <= 4 ; ++i)
+                cluster.get(i).acceptsOnInstance(UnsafeGossipHelper::removeFromRing).accept(cluster.get(3));
+            for (int i = 1 ; i <= 4 ; ++i)
+                cluster.get(i).acceptsOnInstance(UnsafeGossipHelper::removeFromRing).accept(cluster.get(4));
+            for (int i = 1 ; i <= 4 ; ++i)
+                cluster.get(i).acceptsOnInstance(UnsafeGossipHelper::addToRingBootstrapping).accept(cluster.get(3));
+
+            // {3} promises and accepts on !{1} => {2, 3}
+            // {3} commits do not YET arrive on either of {1, 2} (must be either due to read quorum differing on legacy Paxos)
+            drop(cluster, 3, to(1), to(), to(1), to(1, 2));
+            assertRows(cluster.coordinator(3).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v1) VALUES (?, 1, 1) IF NOT EXISTS", ANY, pk),
+                    row(true));
+
+            // abort {3} bootstrap, start {4} bootstrap
+            for (int i = 1 ; i <= 4 ; ++i)
+                cluster.get(i).acceptsOnInstance(UnsafeGossipHelper::removeFromRing).accept(cluster.get(3));
+            for (int i = 1 ; i <= 4 ; ++i)
+                cluster.get(i).acceptsOnInstance(UnsafeGossipHelper::addToRingBootstrapping).accept(cluster.get(4));
+
+            // {4} promises and accepts on !{2} => {1, 4}
+            // {4} commits on {1, 2, 4}
+            drop(cluster, 4, to(2), to(), to(2), to());
+            assertRows(cluster.coordinator(4).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v2) VALUES (?, 1, 2) IF NOT EXISTS", QUORUM, pk),
+                    row(false, pk, 1, 1, null));
+        }
+    }
+
+    protected Cluster getCluster()
+    {
+        return CLUSTER;
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/MessageFiltersTest.java b/test/distributed/org/apache/cassandra/distributed/test/MessageFiltersTest.java
index 6ea186c..e1a0a91 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/MessageFiltersTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/MessageFiltersTest.java
@@ -187,7 +187,7 @@
         String read = "SELECT * FROM " + KEYSPACE + ".tbl";
         String write = "INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, 1)";
 
-        try (ICluster<IInvokableInstance> cluster = builder().withNodes(2).withConfig(c -> c.set("range_request_timeout_in_ms", 20000)).start())
+        try (ICluster<IInvokableInstance> cluster = builder().withNodes(2).withConfig(c -> c.set("range_request_timeout", "2000ms")).start())
         {
             cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': " + cluster.size() + "};");
             cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
@@ -335,4 +335,4 @@
             // ignore
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java b/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java
index f7883b3..a4dd8e6 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/MessageForwardingTest.java
@@ -23,7 +23,6 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -40,7 +39,9 @@
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.impl.IsolatedExecutor;
 import org.apache.cassandra.distributed.impl.TracingUtil;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class MessageForwardingTest extends TestBaseImpl
 {
@@ -60,9 +61,9 @@
             cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v text, PRIMARY KEY (pk, ck))");
 
             cluster.forEach(instance -> commitCounts.put(instance.broadcastAddress().getAddress(), 0));
-            final UUID sessionId = UUIDGen.getTimeUUID();
+            final TimeUUID sessionId = nextTimeUUID();
             Stream<Future<Object[][]>> inserts = IntStream.range(0, numInserts).mapToObj((idx) -> {
-                return cluster.coordinator(1).asyncExecuteWithTracing(sessionId,
+                return cluster.coordinator(1).asyncExecuteWithTracing(sessionId.asUUID(),
                                                                       "INSERT INTO " + KEYSPACE + ".tbl(pk,ck,v) VALUES (1, 1, 'x')",
                                                                       ConsistencyLevel.ALL);
             });
@@ -89,7 +90,7 @@
 
             cluster.stream("dc1").forEach(instance -> forwardFromCounts.put(instance.broadcastAddress().getAddress(), 0));
             cluster.forEach(instance -> commitCounts.put(instance.broadcastAddress().getAddress(), 0));
-            List<TracingUtil.TraceEntry> traces = TracingUtil.getTrace(cluster, sessionId, ConsistencyLevel.ALL);
+            List<TracingUtil.TraceEntry> traces = TracingUtil.getTrace(cluster, sessionId.asUUID(), ConsistencyLevel.ALL);
             traces.forEach(traceEntry -> {
                 if (traceEntry.activity.contains("Appending to commitlog"))
                 {
@@ -119,4 +120,4 @@
             TracingUtil.setWaitForTracingEventTimeoutSecs(originalTraceTimeout);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/MoveTest.java b/test/distributed/org/apache/cassandra/distributed/test/MoveTest.java
new file mode 100644
index 0000000..fc1bca3
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/MoveTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.distributed.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+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.distributed.api.Feature.GOSSIP;
+import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+
+public class MoveTest extends TestBaseImpl
+{
+    private static final String KEYSPACE = "move_test_ks";
+    private static final String TABLE = "tbl";
+    private static final String KS_TBL = KEYSPACE + '.' + TABLE;
+
+    static
+    {
+        System.setProperty("cassandra.ring_delay_ms", "5000"); // down from 30s default
+    }
+
+    private void move(boolean forwards) throws Throwable
+    {
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = Cluster.build(4)
+                                      .withConfig(config -> config.set("paxos_variant", "v2_without_linearizable_reads").with(NETWORK).with(GOSSIP))
+                                      .withoutVNodes()
+                                      .start())
+        {
+            cluster.schemaChange("CREATE KEYSPACE " + KEYSPACE + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 3};");
+            cluster.schemaChange("CREATE TABLE " + KS_TBL + " (k int, c int, v int, primary key (k, c));");
+            for (int i=0; i<30; i++)
+            {
+                cluster.coordinator(1).execute("INSERT INTO " + KS_TBL + " (k, c, v) VALUES (?, 1, 1) IF NOT EXISTS",
+                                               ConsistencyLevel.SERIAL, ConsistencyLevel.ALL, i);
+            }
+
+            List<String> initialTokens = new ArrayList<>();
+            for (int i=0; i<cluster.size(); i++)
+            {
+                String token = cluster.get(i + 1).callsOnInstance(() -> Iterables.getOnlyElement(StorageService.instance.getLocalTokens()).toString()).call();
+                initialTokens.add(token);
+            }
+            Assert.assertEquals(Lists.newArrayList("-4611686018427387905",
+                                                   "-3",
+                                                   "4611686018427387899",
+                                                   "9223372036854775801"), initialTokens);
+
+            NodeToolResult result = cluster.get(forwards ? 2 : 3).nodetoolResult("move", "2305843009213693949");
+            Assert.assertTrue(result.toString(), result.getRc() == 0);
+        }
+    }
+
+    @Test
+    public void moveBack() throws Throwable
+    {
+        move(false);
+    }
+
+    @Test
+    public void moveForwards() throws Throwable
+    {
+        move(true);
+    }
+
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/MultipleDataDirectoryTest.java b/test/distributed/org/apache/cassandra/distributed/test/MultipleDataDirectoryTest.java
index a2f4aab..0826954 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/MultipleDataDirectoryTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/MultipleDataDirectoryTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.distributed.test;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.util.Iterator;
@@ -38,6 +37,7 @@
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 
 public class MultipleDataDirectoryTest extends TestBaseImpl
 {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/NativeMixedVersionTest.java b/test/distributed/org/apache/cassandra/distributed/test/NativeMixedVersionTest.java
new file mode 100644
index 0000000..26d0186
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/NativeMixedVersionTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+
+import org.junit.Test;
+
+import com.datastax.driver.core.ProtocolVersion;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.assertj.core.api.Assertions;
+
+public class NativeMixedVersionTest extends TestBaseImpl
+{
+    @Test
+    public void v4ConnectionCleansUpThreadLocalState() throws IOException
+    {
+        // 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");
+        try (Cluster cluster = Cluster.build(1)
+                                      .withConfig(c ->
+                                                  c.with(Feature.values())
+                                                   .set("read_thresholds_enabled", true)
+                                                   .set("local_read_size_warn_threshold", "1KiB")
+                                      )
+                                      .start())
+        {
+            init(cluster);
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (pk int, ck1 int, value blob, PRIMARY KEY (pk, ck1))"));
+            IInvokableInstance node = cluster.get(1);
+
+            ByteBuffer blob = ByteBuffer.wrap("This is just some large string to get some number of bytes".getBytes(StandardCharsets.UTF_8));
+
+            for (int i = 0; i < 100; i++)
+                node.executeInternal(withKeyspace("INSERT INTO %s.tbl (pk, ck1, value) VALUES (?, ?, ?)"), 0, i, blob);
+
+            // v4+ process STARTUP message on the netty thread.  To make sure we do not leak the ClientWarn state,
+            // make sure a warning will be generated by a query then run on the same threads on the v3 protocol (which
+            // does not support warnings)
+            try (com.datastax.driver.core.Cluster driver = JavaDriverUtils.create(cluster, ProtocolVersion.V5);
+                 Session session = driver.connect())
+            {
+                ResultSet rs = session.execute(withKeyspace("SELECT * FROM %s.tbl"));
+                Assertions.assertThat(rs.getExecutionInfo().getWarnings()).isNotEmpty();
+            }
+
+            try (com.datastax.driver.core.Cluster driver = JavaDriverUtils.create(cluster, ProtocolVersion.V3);
+                 Session session = driver.connect())
+            {
+                ResultSet rs = session.execute(withKeyspace("SELECT * FROM %s.tbl"));
+                Assertions.assertThat(rs.getExecutionInfo().getWarnings()).isEmpty();
+            }
+
+            // this should not happen; so make sure no logs are found
+            List<String> result = node.logs().grep("Warnings present in message with version less than").getResult();
+            Assertions.assertThat(result).isEmpty();
+        }
+        finally
+        {
+            System.clearProperty("io.netty.eventLoopThreads");
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java b/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java
index d9d01e0..f965572 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/NativeProtocolTest.java
@@ -18,6 +18,11 @@
 
 package org.apache.cassandra.distributed.test;
 
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.service.StorageService;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -26,21 +31,8 @@
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.SimpleStatement;
 import com.datastax.driver.core.Statement;
-import com.datastax.driver.core.exceptions.DriverInternalError;
-import com.datastax.driver.core.policies.LoadBalancingPolicy;
-import net.bytebuddy.ByteBuddy;
-import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
-import net.bytebuddy.implementation.MethodDelegation;
-import org.apache.cassandra.cql3.CQLStatement;
-import org.apache.cassandra.cql3.QueryHandler;
-import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ICluster;
-import org.apache.cassandra.distributed.api.IInstanceConfig;
-import org.apache.cassandra.distributed.api.IInvokableInstance;
-import org.apache.cassandra.distributed.api.IIsolatedExecutor;
 import org.apache.cassandra.distributed.impl.RowUtil;
-import org.apache.cassandra.service.StorageService;
 
 import static org.apache.cassandra.distributed.action.GossipHelper.withProperty;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
@@ -127,4 +119,4 @@
                                                            () -> StorageService.instance.isNativeTransportRunning()));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/NetstatsBootstrapWithEntireSSTablesCompressionStreamingTest.java b/test/distributed/org/apache/cassandra/distributed/test/NetstatsBootstrapWithEntireSSTablesCompressionStreamingTest.java
index 7c53426..8cc8a44 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/NetstatsBootstrapWithEntireSSTablesCompressionStreamingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/NetstatsBootstrapWithEntireSSTablesCompressionStreamingTest.java
@@ -33,4 +33,10 @@
     {
         executeTest(true, false);
     }
+
+    @Test
+    public void testWithStreamingEntireSSTablesWithoutCompressionWithoutThrottling() throws Exception
+    {
+        executeTest(true, false, 0);
+    }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/NetstatsRepairStreamingTest.java b/test/distributed/org/apache/cassandra/distributed/test/NetstatsRepairStreamingTest.java
index 5f74c77..8e280a3 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/NetstatsRepairStreamingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/NetstatsRepairStreamingTest.java
@@ -54,8 +54,8 @@
         try (final Cluster cluster = Cluster.build()
                                             .withNodeIdTopology(NetworkTopology.singleDcNetworkTopology(2, "dc0", "rack0"))
                                             .withConfig(config -> config.with(NETWORK, GOSSIP, NATIVE_PROTOCOL)
-                                                                        .set("stream_throughput_outbound_megabits_per_sec", 1)
-                                                                        .set("compaction_throughput_mb_per_sec", 1)
+                                                                        .set("stream_throughput_outbound", "122KiB/s")
+                                                                        .set("compaction_throughput", "1MiB/s")
                                                                         .set("stream_entire_sstables", false)).start())
         {
             final IInvokableInstance node1 = cluster.get(1);
@@ -85,4 +85,4 @@
             NetstatsOutputParser.validate(NetstatsOutputParser.parse(results));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java b/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java
index 89e6168..9087f96 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/NodeToolTest.java
@@ -73,7 +73,7 @@
     public void testNodetoolSystemExit()
     {
         // Verify currently calls System.exit, this test uses that knowlege to test System.exit behavior in jvm-dtest
-        NODE.nodetoolResult("verify", "--check-tokens")
+        NODE.nodetoolResult("verify", "--check-tokens", "--force")
             .asserts()
             .failure()
             .stdoutContains("Token verification requires --extended-verify");
@@ -110,7 +110,7 @@
     @Test
     public void testSetCacheCapacityWhenDisabled() throws Throwable
     {
-        try (ICluster cluster = init(builder().withNodes(1).withConfig(c->c.set("row_cache_size_in_mb", "0")).start()))
+        try (ICluster cluster = init(builder().withNodes(1).withConfig(c->c.set("row_cache_size", "0MiB")).start()))
         {
             NodeToolResult ringResult = cluster.get(1).nodetoolResult("setcachecapacity", "1", "1", "1");
             ringResult.asserts().stderrContains("is not permitted as this cache is disabled");
diff --git a/test/distributed/org/apache/cassandra/distributed/test/OversizedMutationTest.java b/test/distributed/org/apache/cassandra/distributed/test/OversizedMutationTest.java
new file mode 100644
index 0000000..2b0d0a0
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/OversizedMutationTest.java
@@ -0,0 +1,64 @@
+/*
+ * 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.distributed.test;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.ALL;
+
+public class OversizedMutationTest extends TestBaseImpl
+{
+    @Test
+    public void testSingleOversizedMutation() throws Throwable
+    {
+        try (Cluster cluster = init(builder().withNodes(1).withConfig(c -> c.set("max_mutation_size", "48KiB"))
+                                             .start()))
+        {
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.t (key int PRIMARY KEY, val blob)"));
+            String payload = StringUtils.repeat('1', 1024 * 49);
+            String query = "INSERT INTO %s.t (key, val) VALUES (1, textAsBlob('" + payload + "'))";
+            Assertions.assertThatThrownBy(() -> cluster.coordinator(1).execute(withKeyspace(query), ALL))
+                      .hasMessageContaining("Rejected an oversized mutation (")
+                      .hasMessageContaining("/49152) for keyspace: distributed_test_keyspace. Top keys are: t.1");
+        }
+    }
+
+    @Test
+    public void testOversizedBatch() throws Throwable
+    {
+        try (Cluster cluster = init(builder().withNodes(1).withConfig(c -> c.set("max_mutation_size", "48KiB"))
+                                             .start()))
+        {
+            cluster.schemaChange(withKeyspace("CREATE KEYSPACE ks1 WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};"));
+            cluster.schemaChange(withKeyspace("CREATE TABLE ks1.t (key int PRIMARY KEY, val blob)"));
+            String payload = StringUtils.repeat('1', 1024 * 48);
+            String query = "BEGIN BATCH\n" +
+                           "INSERT INTO ks1.t (key, val) VALUES (1, textAsBlob('" + payload + "'))\n" +
+                           "INSERT INTO ks1.t (key, val) VALUES (2, textAsBlob('222'))\n" +
+                           "APPLY BATCH";
+            Assertions.assertThatThrownBy(() -> cluster.coordinator(1).execute(withKeyspace(query), ALL))
+                      .hasMessageContaining("Rejected an oversized mutation (")
+                      .hasMessageContaining("/49152) for keyspace: ks1. Top keys are: t.1");
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PartitionDenylistTest.java b/test/distributed/org/apache/cassandra/distributed/test/PartitionDenylistTest.java
new file mode 100644
index 0000000..382981f
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/PartitionDenylistTest.java
@@ -0,0 +1,155 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.service.StorageProxy;
+import org.apache.cassandra.service.StorageService;
+
+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;
+
+public class PartitionDenylistTest extends TestBaseImpl
+{
+    private static final Logger logger = LoggerFactory.getLogger(PartitionDenylistTest.class);
+    private static final int testReplicationFactor = 3;
+
+    // Create a four node cluster, populate with some denylist entries, stop all
+    // the nodes, then bring them up one by one, waiting for each node to complete
+    // startup before starting the next.
+    //
+    // On startup each node runs a SELECT * query on the partition denylist table
+    // to populate the cache.  The whole keyspace is unlikely to be available until
+    // three of the four nodes are started, so the early nodes will go through several
+    // cycles of failing to retrieve the partition denylist before succeeding.
+    //
+    // with({NETWORK,GOSSIP} is currently required for in-JVM dtests to create
+    // the distributed system tables.
+    @Test
+    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");
+        try (Cluster cluster = Cluster.build(nodeCount)
+                                      .withConfig(config -> config
+                                      .with(NETWORK)
+                                      .with(GOSSIP)
+                                      .set("partition_denylist_enabled", true)
+                                      .set("denylist_initial_load_retry", "1s"))
+                                      .createWithoutStarting())
+        {
+            cluster.forEach(i -> {
+                i.startup();
+                i.runOnInstance(PartitionDenylistTest::waitUntilStarted);
+            });
+
+            // Do a cluster-wide no unavailables were recorded while the denylist was loaded.
+            cluster.forEach(i -> i.runOnInstance(PartitionDenylistTest::checkNoUnavailables));
+        }
+    }
+
+    static private void waitUntilStarted()
+    {
+        waitUntilStarted(60, TimeUnit.SECONDS);
+    }
+
+    // To be called inside the instance with runOnInstance
+    static private void waitUntilStarted(int waitDuration, TimeUnit waitUnits)
+    {
+        long deadlineInMillis = currentTimeMillis() + Math.max(1, waitUnits.toMillis(waitDuration));
+        while (!StorageService.instance.getOperationMode().equals("NORMAL"))
+        {
+            if (currentTimeMillis() >= deadlineInMillis)
+            {
+                throw new RuntimeException("Instance did not reach application state NORMAL before timeout");
+            }
+            Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MILLISECONDS);
+        }
+    }
+
+    // To be called inside the instance with runOnInstance
+    static private void checkNoUnavailables()
+    {
+        long deadlineInMillis = currentTimeMillis() + TimeUnit.SECONDS.toMillis(30);
+
+        while (currentTimeMillis() < deadlineInMillis &&
+               StorageProxy.instance.getPartitionDenylistLoadSuccesses() == 0)
+        {
+            Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
+        }
+
+        Assert.assertTrue("Partition denylist must have loaded before checking unavailables",
+                          StorageProxy.instance.getPartitionDenylistLoadSuccesses() > 0);
+    }
+
+    // To be called inside the instance with runOnInstance, no nodes are started/stopped
+    // and not enough nodes are available to succeed, so it should just retry a few times
+    static private void checkTimerActive()
+    {
+        long deadlineInMillis = currentTimeMillis() + TimeUnit.SECONDS.toMillis(30);
+
+        do
+        {
+            // Make sure at least two load attempts have happened,
+            // in case we received a node up event about this node
+            if (StorageProxy.instance.getPartitionDenylistLoadAttempts() > 2)
+            {
+                return;
+            }
+            Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
+        } while (currentTimeMillis() < deadlineInMillis);
+
+        Assert.fail("Node did not retry loading on timeout in 30s");
+    }
+
+    @Test
+    public void checkTimerRetriesLoad() throws IOException
+    {
+        int nodeCount = 3;
+
+        try (Cluster cluster = Cluster.build(nodeCount)
+                                      .withConfig(config -> config
+                                      .with(NETWORK)
+                                      .with(GOSSIP)
+                                      .set("partition_denylist_enabled", true)
+                                      .set("denylist_initial_load_retry", "1s"))
+                                      .createWithoutStarting())
+        {
+            // Starting without networking enabled in the hope it doesn't trigger
+            // node lifecycle events when nodes start up.
+            cluster.get(1).startup();
+            cluster.get(1).runOnInstance(PartitionDenylistTest::checkTimerActive);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PaxosRepair2Test.java b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepair2Test.java
new file mode 100644
index 0000000..574b84f
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepair2Test.java
@@ -0,0 +1,609 @@
+/*
+ * 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.distributed.test;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Sets;
+import org.awaitility.Awaitility;
+import org.junit.Assert;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.statements.SelectStatement;
+import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.ReadExecutionController;
+import org.apache.cassandra.db.ReadQuery;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.rows.BTreeRow;
+import org.apache.cassandra.db.rows.BufferCell;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.RowIterator;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.exceptions.CasWriteTimeoutException;
+import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.repair.RepairParallelism;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.Paxos;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosKeyState;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosRows;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTracker;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTracker.UpdateSupplier;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Pair;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+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;
+
+import org.apache.cassandra.utils.CloseableIterator;
+
+// quick workaround for metaspace ooms, will properly reuse clusters later
+public class PaxosRepair2Test extends TestBaseImpl
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosRepair2Test.class);
+    private static final String TABLE = "tbl";
+    public static final String OFFSETTABLE_CLOCK_NAME = OffsettableClock.class.getName();
+
+    static
+    {
+        CassandraRelevantProperties.PAXOS_EXECUTE_ON_SELF.setBoolean(false);
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    private static int getUncommitted(IInvokableInstance instance, String keyspace, String table)
+    {
+        if (instance.isShutdown())
+            return 0;
+        int uncommitted = instance.callsOnInstance(() -> {
+            TableMetadata cfm = Schema.instance.getTableMetadata(keyspace, table);
+            return Iterators.size(PaxosState.uncommittedTracker().uncommittedKeyIterator(cfm.id, null));
+        }).call();
+        logger.info("{} has {} uncommitted instances", instance, uncommitted);
+        return uncommitted;
+    }
+
+    private static void assertUncommitted(IInvokableInstance instance, String ks, String table, int expected)
+    {
+        Assert.assertEquals(expected, getUncommitted(instance, ks, table));
+    }
+
+    private static void repair(Cluster cluster, String keyspace, String table, boolean force)
+    {
+        Map<String, String> options = new HashMap<>();
+        options.put(RepairOption.PARALLELISM_KEY, RepairParallelism.SEQUENTIAL.getName());
+        options.put(RepairOption.PRIMARY_RANGE_KEY, Boolean.toString(false));
+        options.put(RepairOption.INCREMENTAL_KEY, Boolean.toString(false));
+        options.put(RepairOption.JOB_THREADS_KEY, Integer.toString(1));
+        options.put(RepairOption.TRACE_KEY, Boolean.toString(false));
+        options.put(RepairOption.COLUMNFAMILIES_KEY, "");
+        options.put(RepairOption.PULL_REPAIR_KEY, Boolean.toString(false));
+        options.put(RepairOption.FORCE_REPAIR_KEY, Boolean.toString(force));
+        options.put(RepairOption.PREVIEW, PreviewKind.NONE.toString());
+        options.put(RepairOption.IGNORE_UNREPLICATED_KS, Boolean.toString(false));
+        options.put(RepairOption.REPAIR_PAXOS_KEY, Boolean.toString(true));
+        options.put(RepairOption.PAXOS_ONLY_KEY, Boolean.toString(true));
+
+        cluster.get(1).runOnInstance(() -> {
+            int cmd = StorageService.instance.repairAsync(keyspace, options);
+
+            while (true)
+            {
+                try
+                {
+                    Thread.sleep(500);
+                }
+                catch (InterruptedException e)
+                {
+                    throw new AssertionError(e);
+                }
+                Pair<ActiveRepairService.ParentRepairStatus, List<String>> status = ActiveRepairService.instance.getRepairStatus(cmd);
+                if (status == null)
+                    continue;
+
+                switch (status.left)
+                {
+                    case IN_PROGRESS:
+                        continue;
+                    case COMPLETED:
+                        return;
+                    default:
+                        throw new AssertionError("Repair failed with errors: " + status.right);
+                }
+            }
+        });
+    }
+
+    private static void repair(Cluster cluster, String keyspace, String table)
+    {
+        repair(cluster, keyspace, table, false);
+    }
+
+    @Test
+    public void paxosRepairPreventsStaleReproposal() throws Throwable
+    {
+        Ballot staleBallot = Paxos.newBallot(Ballot.none(), org.apache.cassandra.db.ConsistencyLevel.SERIAL);
+        try (Cluster cluster = init(Cluster.create(3, cfg -> cfg
+                                                             .set("paxos_variant", "v2")
+                                                             .set("paxos_purge_grace_period", "0s")
+                                                             .set("truncate_request_timeout_in_ms", 1000L)))
+        )
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (k int primary key, v int)");
+            repair(cluster, KEYSPACE, TABLE);
+
+            // stop and start node 2 to test loading paxos repair history from disk
+            cluster.get(2).shutdown().get();
+            cluster.get(2).startup();
+
+            for (int i=0; i<cluster.size(); i++)
+            {
+                cluster.get(i+1).runOnInstance(() -> {
+                    ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(TABLE);
+                    DecoratedKey key = cfs.decorateKey(ByteBufferUtil.bytes(1));
+                    Assert.assertFalse(FBUtilities.getBroadcastAddressAndPort().toString(), Commit.isAfter(staleBallot, cfs.getPaxosRepairLowBound(key)));
+                });
+            }
+
+            // add in the stale proposal
+            cluster.get(1).runOnInstance(() -> {
+                TableMetadata cfm = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+                DecoratedKey key = DatabaseDescriptor.getPartitioner().decorateKey(ByteBufferUtil.bytes(1));
+                ColumnMetadata cdef = cfm.getColumn(new ColumnIdentifier("v", false));
+                Cell cell = BufferCell.live(cdef, staleBallot.unixMicros(), ByteBufferUtil.bytes(1));
+                Row row = BTreeRow.singleCellRow(Clustering.EMPTY, cell);
+                PartitionUpdate update = PartitionUpdate.singleRowUpdate(cfm, key, row);
+                Commit.Proposal proposal = new Commit.Proposal(staleBallot, update);
+                SystemKeyspace.savePaxosProposal(proposal);
+            });
+
+            // shutdown node 3 so we're guaranteed to see the stale proposal
+            cluster.get(3).shutdown().get();
+
+            // the stale inflight proposal should be ignored and the query should succeed
+            String query = "INSERT INTO " + KEYSPACE + '.' + TABLE + " (k, v) VALUES (1, 2) IF NOT EXISTS";
+            Object[][] result = cluster.coordinator(1).execute(query, ConsistencyLevel.QUORUM);
+            Assert.assertEquals(new Object[][]{new Object[]{ true }}, result);
+
+            assertLowBoundPurged(cluster.get(1));
+            assertLowBoundPurged(cluster.get(2));
+        }
+    }
+
+    @Test
+    public void paxosRepairHistoryIsntUpdatedInForcedRepair() throws Throwable
+    {
+        Ballot staleBallot = staleBallot(System.currentTimeMillis() - 1000000, System.currentTimeMillis() - 100000, GLOBAL);
+        try (Cluster cluster = init(Cluster.create(3, cfg -> cfg.with(Feature.GOSSIP, Feature.NETWORK)
+                                                                .set("paxos_variant", "v2")
+                                                                .set("truncate_request_timeout_in_ms", 1000L)))
+        )
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (k int primary key, v int)");
+            cluster.get(3).shutdown().get();
+            InetAddressAndPort node3 = InetAddressAndPort.getByAddress(cluster.get(3).broadcastAddress());
+
+            // make sure node1 knows node3 is down
+            Awaitility.waitAtMost(1,TimeUnit.MINUTES).until(
+            () -> !cluster.get(1).callOnInstance(() -> FailureDetector.instance.isAlive(node3)));
+
+            repair(cluster, KEYSPACE, TABLE, true);
+            for (int i = 0; i < cluster.size() - 1; i++)
+            {
+                cluster.get(i + 1).runOnInstance(() -> {
+                    Assert.assertFalse(CassandraRelevantProperties.CLOCK_GLOBAL.isPresent());
+                    ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(TABLE);
+                    DecoratedKey key = cfs.decorateKey(ByteBufferUtil.bytes(1));
+                    Assert.assertTrue(FBUtilities.getBroadcastAddressAndPort().toString(), Commit.isAfter(staleBallot, cfs.getPaxosRepairLowBound(key)));
+                });
+            }
+        }
+    }
+
+    private static class PaxosRow
+    {
+        final DecoratedKey key;
+        final Row row;
+
+        PaxosRow(DecoratedKey key, Row row)
+        {
+            this.key = key;
+            this.row = row;
+        }
+
+        public String toString()
+        {
+            TableMetadata cfm = Schema.instance.getTableMetadata(SYSTEM_KEYSPACE_NAME, SystemKeyspace.PAXOS);
+            return ByteBufferUtil.bytesToHex(key.getKey()) + " -> " + row.toString(cfm, true);
+        }
+    }
+
+    private static void compactPaxos()
+    {
+        ColumnFamilyStore paxos = Keyspace.open(SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.PAXOS);
+        FBUtilities.waitOnFuture(paxos.forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS));
+        FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(paxos, 0, false));
+    }
+
+    private static Map<Integer, PaxosRow> getPaxosRows()
+    {
+        Map<Integer, PaxosRow> rows = new HashMap<>();
+        String queryStr = "SELECT * FROM " + SYSTEM_KEYSPACE_NAME + '.' + SystemKeyspace.PAXOS;
+        SelectStatement stmt = (SelectStatement) QueryProcessor.parseStatement(queryStr).prepare(ClientState.forInternalCalls());
+        ReadQuery query = stmt.getQuery(QueryOptions.DEFAULT, FBUtilities.nowInSeconds());
+        try (ReadExecutionController controller = query.executionController(); PartitionIterator partitions = query.executeInternal(controller))
+        {
+            while (partitions.hasNext())
+            {
+                RowIterator partition = partitions.next();
+                while (partition.hasNext())
+                {
+                    rows.put(Int32Type.instance.compose(partition.partitionKey().getKey()),
+                             new PaxosRow(partition.partitionKey(), partition.next()));
+                }
+            }
+        }
+        return rows;
+    }
+
+    private static void assertLowBoundPurged(Collection<PaxosRow> rows)
+    {
+        Assert.assertEquals(0, DatabaseDescriptor.getPaxosPurgeGrace(SECONDS));
+        String ip = FBUtilities.getBroadcastAddressAndPort().toString();
+        for (PaxosRow row : rows)
+        {
+            Ballot keyLowBound = Keyspace.open(KEYSPACE).getColumnFamilyStore(TABLE).getPaxosRepairLowBound(row.key);
+            Assert.assertTrue(ip, Commit.isAfter(keyLowBound, Ballot.none()));
+            Assert.assertFalse(ip, PaxosRows.hasBallotBeforeOrEqualTo(row.row, keyLowBound));
+        }
+    }
+
+    private static void assertLowBoundPurged(IInvokableInstance instance)
+    {
+        instance.runOnInstance(() -> assertLowBoundPurged(getPaxosRows().values()));
+    }
+
+    private static void assertLowBoundPurged(Cluster cluster)
+    {
+        cluster.forEach(PaxosRepair2Test::assertLowBoundPurged);
+    }
+
+    @Test
+    public void paxosAutoRepair() throws Throwable
+    {
+        System.setProperty("cassandra.auto_repair_frequency_seconds", "1");
+        System.setProperty("cassandra.disable_paxos_auto_repairs", "true");
+        try (Cluster cluster = init(Cluster.create(3, cfg -> cfg
+                                                             .set("paxos_variant", "v2")
+                                                             .set("paxos_repair_enabled", true)
+                                                             .set("truncate_request_timeout_in_ms", 1000L)))
+        )
+        {
+            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"));
+            });
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+            cluster.get(3).shutdown().get();
+            cluster.verbs(Verb.PAXOS_COMMIT_REQ).drop();
+            try
+            {
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+                Assert.fail("expected write timeout");
+            }
+            catch (Throwable t)
+            {
+                // expected
+            }
+            assertUncommitted(cluster.get(1), KEYSPACE, TABLE, 1);
+            assertUncommitted(cluster.get(2), KEYSPACE, TABLE, 1);
+
+            cluster.filters().reset();
+            // paxos table needs at least 1 flush to be picked up by auto-repairs
+            cluster.get(1).flush("system");
+            cluster.get(2).flush("system");
+            // re-enable repairs
+            cluster.get(1).runOnInstance(() -> StorageService.instance.setPaxosAutoRepairsEnabled(true));
+            cluster.get(2).runOnInstance(() -> StorageService.instance.setPaxosAutoRepairsEnabled(true));
+            Thread.sleep(2000);
+            for (int i=0; i<20; i++)
+            {
+                if (!cluster.get(1).callsOnInstance(() -> PaxosState.uncommittedTracker().hasInflightAutoRepairs()).call()
+                 && !cluster.get(2).callsOnInstance(() -> PaxosState.uncommittedTracker().hasInflightAutoRepairs()).call())
+                    break;
+                logger.info("Waiting for auto repairs to finish...");
+                Thread.sleep(1000);
+            }
+            assertUncommitted(cluster.get(1), KEYSPACE, TABLE, 0);
+            assertUncommitted(cluster.get(2), KEYSPACE, TABLE, 0);
+        }
+        finally
+        {
+            System.clearProperty("cassandra.auto_repair_frequency_seconds");
+            System.clearProperty("cassandra.disable_paxos_auto_repairs");
+        }
+    }
+
+    @Test
+    public void paxosPurgeGraceSeconds() throws Exception
+    {
+        int graceSeconds = 5;
+        try (Cluster cluster = init(Cluster.create(3, cfg -> cfg
+                                                             .set("paxos_variant", "v2")
+                                                             .set("paxos_purge_grace_period", graceSeconds + "s")
+                                                             .set("paxos_state_purging", Config.PaxosStatePurging.repaired.toString())
+                                                             .set("truncate_request_timeout_in_ms", 1000L)))
+        )
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+
+            repair(cluster, KEYSPACE, TABLE);
+            cluster.forEach(i -> i.runOnInstance(() -> {
+                Assert.assertFalse(CassandraRelevantProperties.CLOCK_GLOBAL.isPresent());
+                compactPaxos();
+                Map<Integer, PaxosRow> rows = getPaxosRows();
+                Assert.assertEquals(Sets.newHashSet(1), rows.keySet());
+            }));
+
+            // wait for the grace period to pass, repair again, and the rows should be removed
+            Thread.sleep((graceSeconds + 1) * 1000);
+            repair(cluster, KEYSPACE, TABLE);
+            cluster.forEach(i -> i.runOnInstance(() -> {
+                compactPaxos();
+                Map<Integer, PaxosRow> rows = getPaxosRows();
+                Assert.assertEquals(Sets.newHashSet(), rows.keySet());
+            }));
+        }
+    }
+
+    static void assertTimeout(Runnable runnable)
+    {
+        try
+        {
+            runnable.run();
+            Assert.fail("timeout expected");
+        }
+        catch (RuntimeException e)
+        {
+            Assert.assertEquals(CasWriteTimeoutException.class.getName(), e.getClass().getName());
+        }
+    }
+
+    private static int ballotDeletion(Commit commit)
+    {
+        return (int) TimeUnit.MICROSECONDS.toSeconds(commit.ballot.unixMicros()) + SystemKeyspace.legacyPaxosTtlSec(commit.update.metadata());
+    }
+
+    private static void backdateTimestamps(int seconds)
+    {
+        long offsetMillis = SECONDS.toMillis(seconds);
+        ClientState.resetLastTimestamp(System.currentTimeMillis() - offsetMillis);
+        OffsettableClock.offsetMillis = -offsetMillis;
+    }
+
+    public static class OffsettableClock implements Clock
+    {
+        private static volatile long offsetMillis = 0;
+        public long nanoTime()
+        {
+            return System.nanoTime(); // checkstyle: permit system clock
+        }
+
+        public long currentTimeMillis()
+        {
+            return System.currentTimeMillis() + offsetMillis; // checkstyle: permit system clock
+        }
+    }
+
+    @Test
+    public void legacyPurgeRepairLoop() throws Exception
+    {
+        try
+        {
+            CassandraRelevantProperties.CLOCK_GLOBAL.setString(OFFSETTABLE_CLOCK_NAME);
+            try (Cluster cluster = init(Cluster.create(3, cfg -> cfg
+                                                                 .set("paxos_variant", "v2")
+                                                                 .set("paxos_state_purging", "legacy")
+                                                                 .set("paxos_purge_grace_period", "0s")
+                                                                 .set("truncate_request_timeout_in_ms", 1000L)))
+            )
+            {
+                cluster.forEach(i -> Assert.assertEquals(OFFSETTABLE_CLOCK_NAME, CassandraRelevantProperties.CLOCK_GLOBAL.getString()));
+                int ttl = 3 * 3600;
+                cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck)) WITH gc_grace_seconds=" + ttl);
+
+                // prepare an operation ttl + 1 hour into the past on a single node
+                cluster.forEach(instance -> {
+                    instance.runOnInstance(() -> {
+                        Assert.assertEquals(OFFSETTABLE_CLOCK_NAME, CassandraRelevantProperties.CLOCK_GLOBAL.getString());
+                        backdateTimestamps(ttl + 3600);
+                    });
+                });
+                cluster.filters().inbound().to(1, 2).drop();
+                assertTimeout(() -> cluster.coordinator(3).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (400, 2, 2) IF NOT EXISTS", ConsistencyLevel.QUORUM));
+                Ballot oldBallot = Ballot.fromUuid(cluster.get(3).callOnInstance(() -> {
+                    TableMetadata cfm = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+                    DecoratedKey dk = cfm.partitioner.decorateKey(ByteBufferUtil.bytes(400));
+                    try (PaxosState state = PaxosState.get(dk, cfm))
+                    {
+                        return state.currentSnapshot().promised.asUUID();
+                    }
+                }));
+
+                assertUncommitted(cluster.get(1), KEYSPACE, TABLE, 0);
+                assertUncommitted(cluster.get(2), KEYSPACE, TABLE, 0);
+                assertUncommitted(cluster.get(3), KEYSPACE, TABLE, 1);
+
+                // commit an operation just over ttl in the past on the other nodes
+                cluster.filters().reset();
+                cluster.filters().inbound().to(2).drop();
+                cluster.forEach(instance -> {
+                    instance.runOnInstance(() -> {
+                        backdateTimestamps(ttl + 2);
+                    });
+                });
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (400, 2, 2) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+
+                // expire the cache entries
+                int nowInSec = FBUtilities.nowInSeconds();
+                cluster.get(1).runOnInstance(() -> {
+                    TableMetadata table = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+                    DecoratedKey dk = table.partitioner.decorateKey(ByteBufferUtil.bytes(400));
+                    try (PaxosState state = PaxosState.get(dk, table))
+                    {
+                        state.updateStateUnsafe(s -> {
+                            Assert.assertNull(s.accepted);
+                            Assert.assertTrue(Commit.isAfter(s.committed.ballot, oldBallot));
+                            Commit.CommittedWithTTL committed = new Commit.CommittedWithTTL(s.committed.ballot,
+                                                                                            s.committed.update,
+                                                                                            ballotDeletion(s.committed));
+                            Assert.assertTrue(committed.localDeletionTime < nowInSec);
+                            return new PaxosState.Snapshot(Ballot.none(), Ballot.none(), null, committed);
+                        });
+                    }
+                });
+
+                cluster.get(3).runOnInstance(() -> {
+                    TableMetadata table = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+                    DecoratedKey dk = table.partitioner.decorateKey(ByteBufferUtil.bytes(400));
+                    try (PaxosState state = PaxosState.get(dk, table))
+                    {
+                        state.updateStateUnsafe(s -> {
+                            Assert.assertNull(s.accepted);
+                            Assert.assertTrue(Commit.isAfter(s.committed.ballot, oldBallot));
+                            Commit.CommittedWithTTL committed = new Commit.CommittedWithTTL(s.committed.ballot,
+                                                                                            s.committed.update,
+                                                                                            ballotDeletion(s.committed));
+                            Assert.assertTrue(committed.localDeletionTime < nowInSec);
+                            return new PaxosState.Snapshot(oldBallot, oldBallot, null, committed);
+                        });
+                    }
+                });
+
+                cluster.forEach(instance -> {
+                    instance.runOnInstance(() -> {
+                        backdateTimestamps(0);
+                    });
+                });
+
+                cluster.filters().reset();
+                cluster.filters().inbound().to(2).drop();
+                cluster.get(3).runOnInstance(() -> {
+
+                    TableMetadata table = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+                    DecoratedKey dk = table.partitioner.decorateKey(ByteBufferUtil.bytes(400));
+
+                    UpdateSupplier supplier = PaxosState.uncommittedTracker().unsafGetUpdateSupplier();
+                    try
+                    {
+                        PaxosUncommittedTracker.unsafSetUpdateSupplier(new SingleUpdateSupplier(table, dk, oldBallot));
+                        StorageService.instance.autoRepairPaxos(table.id).get();
+                    }
+                    catch (Exception e)
+                    {
+                        throw new RuntimeException(e);
+                    }
+                    finally
+                    {
+                        PaxosUncommittedTracker.unsafSetUpdateSupplier(supplier);
+                    }
+                });
+
+                assertUncommitted(cluster.get(1), KEYSPACE, TABLE, 0);
+                assertUncommitted(cluster.get(2), KEYSPACE, TABLE, 0);
+                assertUncommitted(cluster.get(3), KEYSPACE, TABLE, 0);
+            }
+        }
+        finally
+        {
+            CassandraRelevantProperties.CLOCK_GLOBAL.reset();
+        }
+    }
+
+    private static class SingleUpdateSupplier implements UpdateSupplier
+    {
+        private final TableMetadata cfm;
+        private final DecoratedKey dk;
+        private final Ballot ballot;
+
+        public SingleUpdateSupplier(TableMetadata cfm, DecoratedKey dk, Ballot ballot)
+        {
+            this.cfm = cfm;
+            this.dk = dk;
+            this.ballot = ballot;
+        }
+
+        public CloseableIterator<PaxosKeyState> repairIterator(TableId cfId, Collection<Range<Token>> ranges)
+        {
+            if (!cfId.equals(cfm.id))
+                return CloseableIterator.empty();
+            return CloseableIterator.wrap(Collections.singleton(new PaxosKeyState(cfId, dk, ballot, false)).iterator());
+        }
+
+        public CloseableIterator<PaxosKeyState> flushIterator(Memtable paxos)
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PaxosRepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepairTest.java
new file mode 100644
index 0000000..bfd4e95
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/PaxosRepairTest.java
@@ -0,0 +1,642 @@
+/*
+ * 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.distributed.test;
+
+import java.net.InetSocketAddress;
+import java.util.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicIntegerArray;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Sets;
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Assert;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.*;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.statements.SelectStatement;
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.db.rows.*;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IMessageFilters;
+import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.repair.RepairParallelism;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.paxos.*;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanup;
+import org.apache.cassandra.service.paxos.uncommitted.PaxosRows;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.*;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
+import static org.apache.cassandra.distributed.shared.AssertUtils.row;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_FINISH_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_COMMIT_AND_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PREPARE_RSP;
+import static org.apache.cassandra.net.Verb.PAXOS2_PROPOSE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_PROPOSE_RSP;
+import static org.apache.cassandra.net.Verb.PAXOS2_REPAIR_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_COMMIT_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS_COMMIT_RSP;
+import static org.apache.cassandra.schema.SchemaConstants.SYSTEM_KEYSPACE_NAME;
+
+public class PaxosRepairTest extends TestBaseImpl
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosRepairTest.class);
+    private static final String TABLE = "tbl";
+
+    static
+    {
+        CassandraRelevantProperties.PAXOS_EXECUTE_ON_SELF.setBoolean(false);
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    private static int getUncommitted(IInvokableInstance instance, String keyspace, String table)
+    {
+        if (instance.isShutdown())
+            return 0;
+        int uncommitted = instance.callsOnInstance(() -> {
+            TableMetadata meta = Schema.instance.getTableMetadata(keyspace, table);
+            return Iterators.size(PaxosState.uncommittedTracker().uncommittedKeyIterator(meta.id, null));
+        }).call();
+        logger.info("{} has {} uncommitted instances", instance, uncommitted);
+        return uncommitted;
+    }
+
+    private static void assertAllAlive(Cluster cluster)
+    {
+        Set<InetAddressAndPort> allEndpoints = cluster.stream().map(i -> InetAddressAndPort.getByAddress(i.broadcastAddress())).collect(Collectors.toSet());
+        cluster.stream().forEach(instance -> {
+            instance.runOnInstance(() -> {
+                ImmutableSet<InetAddressAndPort> endpoints = Gossiper.instance.getEndpoints();
+                Assert.assertEquals(allEndpoints, endpoints);
+                for (InetAddressAndPort endpoint : endpoints)
+                    Assert.assertTrue(FailureDetector.instance.isAlive(endpoint));
+            });
+        });
+    }
+
+    private static void assertUncommitted(IInvokableInstance instance, String ks, String table, int expected)
+    {
+        Assert.assertEquals(expected, getUncommitted(instance, ks, table));
+    }
+
+    private static boolean hasUncommitted(Cluster cluster, String ks, String table)
+    {
+        return cluster.stream().map(instance -> getUncommitted(instance, ks, table)).reduce((a, b) -> a + b).get() > 0;
+    }
+
+    private static boolean hasUncommittedQuorum(Cluster cluster, String ks, String table)
+    {
+        int uncommitted = 0;
+        for (int i=0; i<cluster.size(); i++)
+        {
+            if (getUncommitted(cluster.get(i+1), ks, table) > 0)
+                uncommitted++;
+        }
+        return uncommitted >= ((cluster.size() / 2) + 1);
+    }
+
+    private static void repair(Cluster cluster, String keyspace, String table, boolean force)
+    {
+        Map<String, String> options = new HashMap<>();
+        options.put(RepairOption.PARALLELISM_KEY, RepairParallelism.SEQUENTIAL.getName());
+        options.put(RepairOption.PRIMARY_RANGE_KEY, Boolean.toString(false));
+        options.put(RepairOption.INCREMENTAL_KEY, Boolean.toString(false));
+        options.put(RepairOption.JOB_THREADS_KEY, Integer.toString(1));
+        options.put(RepairOption.TRACE_KEY, Boolean.toString(false));
+        options.put(RepairOption.COLUMNFAMILIES_KEY, "");
+        options.put(RepairOption.PULL_REPAIR_KEY, Boolean.toString(false));
+        options.put(RepairOption.FORCE_REPAIR_KEY, Boolean.toString(force));
+        options.put(RepairOption.PREVIEW, PreviewKind.NONE.toString());
+        options.put(RepairOption.IGNORE_UNREPLICATED_KS, Boolean.toString(false));
+        options.put(RepairOption.REPAIR_PAXOS_KEY, Boolean.toString(true));
+        options.put(RepairOption.PAXOS_ONLY_KEY, Boolean.toString(true));
+
+        cluster.get(1).runOnInstance(() -> {
+            int cmd = StorageService.instance.repairAsync(keyspace, options);
+
+            while (true)
+            {
+                try
+                {
+                    Thread.sleep(500);
+                }
+                catch (InterruptedException e)
+                {
+                    throw new AssertionError(e);
+                }
+                Pair<ActiveRepairService.ParentRepairStatus, List<String>> status = ActiveRepairService.instance.getRepairStatus(cmd);
+                if (status == null)
+                    continue;
+
+                switch (status.left)
+                {
+                    case IN_PROGRESS:
+                        continue;
+                    case COMPLETED:
+                        return;
+                    default:
+                        throw new AssertionError("Repair failed with errors: " + status.right);
+                }
+            }
+        });
+    }
+
+    private static void repair(Cluster cluster, String keyspace, String table)
+    {
+        repair(cluster, keyspace, table, false);
+    }
+
+    private static final Consumer<IInstanceConfig> WITH_NETWORK = cfg -> {
+        cfg.with(Feature.NETWORK);
+        cfg.with(Feature.GOSSIP);
+        cfg.set("paxos_purge_grace_period", "0s");
+        cfg.set("paxos_state_purging", Config.PaxosStatePurging.repaired.toString());
+        cfg.set("paxos_variant", "v2_without_linearizable_reads");
+        cfg.set("truncate_request_timeout", "1000ms");
+        cfg.set("partitioner", "ByteOrderedPartitioner");
+        cfg.set("initial_token", ByteBufferUtil.bytesToHex(ByteBufferUtil.bytes(cfg.num() * 100)));
+    };
+
+    private static final Consumer<IInstanceConfig> WITHOUT_NETWORK = cfg -> {
+        cfg.set("paxos_purge_grace_period", "0s");
+        cfg.set("paxos_state_purging", Config.PaxosStatePurging.repaired.toString());
+        cfg.set("paxos_variant", "v2_without_linearizable_reads");
+        cfg.set("truncate_request_timeout", "1000ms");
+        cfg.set("partitioner", "ByteOrderedPartitioner");
+        cfg.set("initial_token", ByteBufferUtil.bytesToHex(ByteBufferUtil.bytes(cfg.num() * 100)));
+    };
+
+    @Test
+    public void paxosRepairTest() throws Throwable
+    {
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = init(Cluster.build(3).withConfig(WITH_NETWORK).withoutVNodes().start()))
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+            Assert.assertFalse(hasUncommittedQuorum(cluster, KEYSPACE, TABLE));
+
+            assertAllAlive(cluster);
+            cluster.verbs(PAXOS_COMMIT_REQ).drop();
+            try
+            {
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (400, 2, 2) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+                Assert.fail("expected write timeout");
+            }
+            catch (RuntimeException e)
+            {
+                // exception expected
+            }
+
+            Assert.assertTrue(hasUncommitted(cluster, KEYSPACE, TABLE));
+
+            cluster.filters().reset();
+
+            assertAllAlive(cluster);
+            repair(cluster, KEYSPACE, TABLE);
+
+            Assert.assertFalse(hasUncommitted(cluster, KEYSPACE, TABLE));
+
+            cluster.forEach(i -> i.runOnInstance(() -> {
+                compactPaxos();
+                Map<Integer, PaxosRow> rows = getPaxosRows();
+                assertLowBoundPurged(rows.values());
+                Assert.assertEquals(Sets.newHashSet(400), rows.keySet());
+            }));
+
+            // check that operations occuring after the last repair are not purged
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (500, 3, 3) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+            cluster.forEach(i -> i.runOnInstance(() -> {
+                compactPaxos();
+                Map<Integer, PaxosRow> rows = getPaxosRows();
+                assertLowBoundPurged(rows.values());
+                Assert.assertEquals(Sets.newHashSet(400, 500), rows.keySet());
+            }));
+        }
+    }
+
+    @Ignore
+    @Test
+    public void topologyChangePaxosTest() throws Throwable
+    {
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = Cluster.build(4).withConfig(WITH_NETWORK).withoutVNodes().createWithoutStarting())
+        {
+            for (int i=1; i<=3; i++)
+                cluster.get(i).startup();
+
+            init(cluster);
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+
+            cluster.verbs(PAXOS_COMMIT_REQ).drop();
+            try
+            {
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (350, 2, 2) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+                Assert.fail("expected write timeout");
+            }
+            catch (RuntimeException e)
+            {
+                // exception expected
+            }
+            Assert.assertTrue(hasUncommitted(cluster, KEYSPACE, TABLE));
+
+            cluster.filters().reset();
+
+            // node 4 starting should repair paxos and inform the other nodes of its gossip state
+            cluster.get(4).startup();
+            Assert.assertFalse(hasUncommittedQuorum(cluster, KEYSPACE, TABLE));
+        }
+    }
+
+    @Test
+    public void paxosCleanupWithReproposal() throws Throwable
+    {
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = init(Cluster.build(3)
+                                           .withConfig(cfg -> cfg
+                                                              .set("paxos_variant", "v2")
+                                                              .set("paxos_purge_grace_period", "0s")
+                                                              .set("paxos_state_purging", Config.PaxosStatePurging.repaired.toString())
+                                                              .set("truncate_request_timeout", "1000ms"))
+                                           .withoutVNodes()
+                                           .start()))
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+            cluster.verbs(PAXOS_COMMIT_REQ).drop();
+            try
+            {
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+                Assert.fail("expected write timeout");
+            }
+            catch (RuntimeException e)
+            {
+                // exception expected
+            }
+            Assert.assertTrue(hasUncommitted(cluster, KEYSPACE, TABLE));
+            cluster.forEach(i -> i.runOnInstance(() -> Keyspace.open("system").getColumnFamilyStore("paxos").forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS)));
+
+            CountDownLatch haveFetchedLowBound = new CountDownLatch(1);
+            CountDownLatch haveReproposed = new CountDownLatch(1);
+            cluster.verbs(PAXOS2_CLEANUP_FINISH_PREPARE_REQ).inbound().messagesMatching((from, to, verb) -> {
+                haveFetchedLowBound.countDown();
+                Uninterruptibles.awaitUninterruptibly(haveReproposed);
+                return false;
+            }).drop();
+
+            ExecutorService executor = Executors.newCachedThreadPool();
+            List<InetAddressAndPort> endpoints = cluster.stream().map(IInstance::broadcastAddress).map(InetAddressAndPort::getByAddress).collect(Collectors.toList());
+            Future<?> cleanup = cluster.get(1).appliesOnInstance((List<? extends InetSocketAddress> es, ExecutorService exec)-> {
+                TableMetadata metadata = Keyspace.open(KEYSPACE).getMetadata().getTableOrViewNullable(TABLE);
+                return PaxosCleanup.cleanup(es.stream().map(InetAddressAndPort::getByAddress).collect(Collectors.toSet()), metadata, StorageService.instance.getLocalRanges(KEYSPACE), false, exec);
+            }).apply(endpoints, executor);
+
+            Uninterruptibles.awaitUninterruptibly(haveFetchedLowBound);
+            IMessageFilters.Filter filter2 = cluster.verbs(PAXOS_COMMIT_REQ, PAXOS2_COMMIT_AND_PREPARE_REQ).drop();
+            try
+            {
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+                Assert.fail("expected write timeout");
+            }
+            catch (RuntimeException e)
+            {
+                // exception expected
+            }
+            filter2.off();
+            haveReproposed.countDown();
+            cluster.filters().reset();
+
+            cleanup.get();
+            ExecutorUtils.shutdownNowAndWait(1L, TimeUnit.MINUTES, executor);
+            Assert.assertFalse(hasUncommitted(cluster, KEYSPACE, TABLE));
+            cluster.forEach(i -> i.runOnInstance(PaxosRepairTest::compactPaxos));
+            for (int i = 1 ; i <= 3 ; ++i)
+                assertRows(cluster.get(i).executeInternal("SELECT * FROM " + KEYSPACE + '.' + TABLE + " WHERE pk = 1"), row(1, 1, 1));
+
+            Assert.assertFalse(hasUncommittedQuorum(cluster, KEYSPACE, TABLE));
+            assertLowBoundPurged(cluster);
+        }
+    }
+
+    @SuppressWarnings("unused")
+    @Test
+    public void paxosCleanupWithReproposalClashingTimestamp() throws Throwable
+    {
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = init(Cluster.build(5)
+                                           .withConfig(cfg -> cfg
+                                                              .set("paxos_variant", "v2")
+                                                              .set("paxos_purge_grace_period", "0s")
+                                                              .set("paxos_cache_size", "0MiB")
+                                                              .set("truncate_request_timeout", "1000ms"))
+                                           .withoutVNodes()
+                                           .start()))
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+            // we ensure:
+            //  - node 1 only witnesses a promise that conflicts with something we committed
+            //  - node 2 does not witness the commit, so it has an in progress proposal
+            //  - node 3 does not witness the proposal, so that we have an incomplete commit
+            //  - node 1's response arrives first, so that it might retain its promise as latestWitnessed (without bugfix)
+
+            CountDownLatch haveStartedCleanup = new CountDownLatch(1);
+            CountDownLatch haveInsertedClashingPromise = new CountDownLatch(1);
+            IMessageFilters.Filter pauseCleanupUntilCommitted = cluster.verbs(PAXOS2_CLEANUP_REQ).from(1).to(1).outbound().messagesMatching((from, to, verb) -> {
+                haveStartedCleanup.countDown();
+                Uninterruptibles.awaitUninterruptibly(haveInsertedClashingPromise);
+                return false;
+            }).drop();
+
+            ExecutorService executor = Executors.newCachedThreadPool();
+            List<InetAddressAndPort> endpoints = cluster.stream().map(i -> InetAddressAndPort.getByAddress(i.broadcastAddress())).collect(Collectors.toList());
+            Future<?> cleanup = cluster.get(1).appliesOnInstance((List<? extends InetSocketAddress> es, ExecutorService exec)-> {
+                TableMetadata metadata = Keyspace.open(KEYSPACE).getMetadata().getTableOrViewNullable(TABLE);
+                return PaxosCleanup.cleanup(es.stream().map(InetAddressAndPort::getByAddress).collect(Collectors.toSet()), metadata, StorageService.instance.getLocalRanges(KEYSPACE), false, exec);
+            }).apply(endpoints, executor);
+
+            IMessageFilters.Filter dropAllTo1 = cluster.verbs(PAXOS2_PREPARE_REQ, PAXOS2_PROPOSE_REQ, PAXOS_COMMIT_REQ).from(2).to(1).outbound().drop();
+            IMessageFilters.Filter dropCommitTo3 = cluster.verbs(PAXOS_COMMIT_REQ).from(2).to(3).outbound().drop();
+            IMessageFilters.Filter dropAcceptTo4 = cluster.verbs(PAXOS2_PROPOSE_REQ).from(2).to(4).outbound().drop();
+
+            CountDownLatch haveFetchedClashingRepair = new CountDownLatch(1);
+            AtomicIntegerArray fetchResponseIds = new AtomicIntegerArray(new int[] { -1, -1, -1, -1, -1, -1 });
+            cluster.verbs(PAXOS2_REPAIR_REQ).outbound().from(1).messagesMatching((from, to, msg) -> {
+                fetchResponseIds.set(to, msg.id());
+                return false;
+            }).drop();
+            cluster.verbs(PAXOS2_PREPARE_RSP, PAXOS2_PROPOSE_RSP, PAXOS_COMMIT_RSP).outbound().to(1).messagesMatching((from, to, msg) -> {
+                if (fetchResponseIds.get(from) == msg.id())
+                {
+                    if (from == 1) haveFetchedClashingRepair.countDown();
+                    else Uninterruptibles.awaitUninterruptibly(haveFetchedClashingRepair);
+                }
+                return false;
+            }).drop();
+
+            Uninterruptibles.awaitUninterruptibly(haveStartedCleanup);
+            cluster.coordinator(2).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.ONE);
+
+            UUID cfId = cluster.get(2).callOnInstance(() -> Keyspace.open(KEYSPACE).getColumnFamilyStore(TABLE).metadata.id.asUUID());
+            TimeUUID uuid = (TimeUUID) cluster.get(2).executeInternal("select in_progress_ballot from system.paxos WHERE row_key = ? and cf_id = ?", Int32Type.instance.decompose(1), cfId)[0][0];
+            TimeUUID clashingUuid = TimeUUID.fromBytes(uuid.msb(), 0);
+            cluster.get(1).executeInternal("update system.paxos set in_progress_ballot = ? WHERE row_key = ? and cf_id = ?", clashingUuid, Int32Type.instance.decompose(1), cfId);
+            Assert.assertEquals(clashingUuid, cluster.get(1).executeInternal("select in_progress_ballot from system.paxos WHERE row_key = ? and cf_id = ?", Int32Type.instance.decompose(1), cfId)[0][0]);
+
+            Assert.assertTrue(hasUncommitted(cluster, KEYSPACE, TABLE));
+            haveInsertedClashingPromise.countDown();
+
+            cleanup.get();
+            ExecutorUtils.shutdownNowAndWait(1L, TimeUnit.MINUTES, executor);
+        }
+    }
+
+    @Test
+    public void paxosCleanupWithDelayedProposal() throws Throwable
+    {
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = init(Cluster.build(3)
+                                           .withConfig(cfg -> cfg
+                                                              .set("paxos_variant", "v2")
+                                                              .set("paxos_purge_grace_period", "0s")
+                                                              .set("paxos_state_purging", Config.PaxosStatePurging.repaired.toString())
+                                                              .set("truncate_request_timeout", "1000ms"))
+                                           .withoutVNodes()
+                                           .start())
+        )
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+
+            CountDownLatch haveFinishedRepair = new CountDownLatch(1);
+            cluster.verbs(PAXOS2_PREPARE_REQ).messagesMatching((from, to, verb) -> {
+                Uninterruptibles.awaitUninterruptibly(haveFinishedRepair);
+                return false;
+            }).drop();
+            cluster.verbs(PAXOS_COMMIT_REQ).drop();
+            Future<?> insert = cluster.get(1).async(() -> {
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+                Assert.fail("expected write timeout");
+            }).call();
+            cluster.verbs(PAXOS2_CLEANUP_FINISH_PREPARE_REQ).messagesMatching((from, to, verb) -> {
+                haveFinishedRepair.countDown();
+                try { insert.get(); } catch (Throwable t) {}
+                cluster.filters().reset();
+                return false;
+            }).drop();
+
+            ExecutorService executor = Executors.newCachedThreadPool();
+
+            Uninterruptibles.sleepUninterruptibly(10L, TimeUnit.MILLISECONDS);
+
+            List<InetAddressAndPort> endpoints = cluster.stream().map(i -> InetAddressAndPort.getByAddress(i.broadcastAddress())).collect(Collectors.toList());
+            Future<?> cleanup = cluster.get(1).appliesOnInstance((List<? extends InetSocketAddress> es, ExecutorService exec)-> {
+                TableMetadata metadata = Keyspace.open(KEYSPACE).getMetadata().getTableOrViewNullable(TABLE);
+                return PaxosCleanup.cleanup(es.stream().map(InetAddressAndPort::getByAddress).collect(Collectors.toSet()), metadata, StorageService.instance.getLocalRanges(KEYSPACE), false, exec);
+            }).apply(endpoints, executor);
+
+            cleanup.get();
+            try
+            {
+                insert.get();
+            }
+            catch (Throwable t)
+            {
+            }
+            ExecutorUtils.shutdownNowAndWait(1L, TimeUnit.MINUTES, executor);
+            Assert.assertFalse(hasUncommittedQuorum(cluster, KEYSPACE, TABLE));
+
+            assertLowBoundPurged(cluster);
+        }
+    }
+
+    private static void setVersion(IInvokableInstance instance, InetSocketAddress peer, String version)
+    {
+        instance.runOnInstance(() -> {
+            Gossiper.runInGossipStageBlocking(() -> {
+                EndpointState epState = Gossiper.instance.getEndpointStateForEndpoint(InetAddressAndPort.getByAddress(peer.getAddress()));
+                VersionedValue value = version != null ? StorageService.instance.valueFactory.rack(version) : null;
+                epState.addApplicationState(ApplicationState.RELEASE_VERSION, value);
+            });
+        });
+    }
+
+    private static void assertRepairFailsWithVersion(Cluster cluster, String version)
+    {
+        for (int i = 1 ; i <= cluster.size() ; ++i)
+            setVersion(cluster.get(i), cluster.get(2).broadcastAddress(), version);
+        try
+        {
+            repair(cluster, KEYSPACE, TABLE);
+        }
+        catch (AssertionError e)
+        {
+            return;
+        }
+        Assert.fail("Repair should have failed on unsupported version");
+    }
+
+    private static void assertRepairSucceedsWithVersion(Cluster cluster, String version)
+    {
+        for (int i = 1 ; i <= cluster.size() ; ++i)
+            setVersion(cluster.get(i), cluster.get(2).broadcastAddress(), version);
+        repair(cluster, KEYSPACE, TABLE);
+    }
+
+    @Test
+    public void paxosRepairVersionGate() throws Throwable
+    {
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = init(Cluster.build(3).withConfig(WITHOUT_NETWORK).withoutVNodes().start()))
+        {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + '.' + TABLE + " (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+            cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (1, 1, 1) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+            Assert.assertFalse(hasUncommittedQuorum(cluster, KEYSPACE, TABLE));
+
+            assertAllAlive(cluster);
+            cluster.verbs(PAXOS_COMMIT_REQ).drop();
+            try
+            {
+                cluster.coordinator(1).execute("INSERT INTO " + KEYSPACE + '.' + TABLE + " (pk, ck, v) VALUES (400, 2, 2) IF NOT EXISTS", ConsistencyLevel.QUORUM);
+                Assert.fail("expected write timeout");
+            }
+            catch (RuntimeException e)
+            {
+                // exception expected
+            }
+
+            Assert.assertTrue(hasUncommitted(cluster, KEYSPACE, TABLE));
+
+            cluster.filters().reset();
+
+            assertAllAlive(cluster);
+
+            assertRepairFailsWithVersion(cluster, "3.0.24");
+            assertRepairFailsWithVersion(cluster, "4.0.0");
+
+            // test valid versions
+            assertRepairSucceedsWithVersion(cluster, "4.1.0");
+        }
+    }
+
+    private static class PaxosRow
+    {
+        final DecoratedKey key;
+        final Row row;
+
+        PaxosRow(DecoratedKey key, Row row)
+        {
+            this.key = key;
+            this.row = row;
+        }
+
+        public String toString()
+        {
+            TableMetadata table = Schema.instance.getTableMetadata(SYSTEM_KEYSPACE_NAME, SystemKeyspace.PAXOS);
+            return ByteBufferUtil.bytesToHex(key.getKey()) + " -> " + row.toString(table, true);
+        }
+    }
+
+    private static void compactPaxos()
+    {
+        ColumnFamilyStore paxos = Keyspace.open(SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.PAXOS);
+        FBUtilities.waitOnFuture(paxos.forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS));
+        FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(paxos, 0, false));
+    }
+
+    private static Map<Integer, PaxosRow> getPaxosRows()
+    {
+        Map<Integer, PaxosRow> rows = new HashMap<>();
+        String queryStr = "SELECT * FROM " + SYSTEM_KEYSPACE_NAME + '.' + SystemKeyspace.PAXOS;
+        SelectStatement stmt = (SelectStatement) QueryProcessor.parseStatement(queryStr).prepare(ClientState.forInternalCalls());
+        ReadQuery query = stmt.getQuery(QueryOptions.DEFAULT, FBUtilities.nowInSeconds());
+        try (ReadExecutionController controller = query.executionController(); PartitionIterator partitions = query.executeInternal(controller))
+        {
+            while (partitions.hasNext())
+            {
+                try (RowIterator partition = partitions.next())
+                {
+                    while (partition.hasNext())
+                    {
+                        rows.put(Int32Type.instance.compose(partition.partitionKey().getKey()),
+                                 new PaxosRow(partition.partitionKey(), partition.next()));
+                    }
+                }
+            }
+        }
+        return rows;
+    }
+
+    private static void assertLowBoundPurged(Collection<PaxosRow> rows)
+    {
+        Assert.assertEquals(0, DatabaseDescriptor.getPaxosPurgeGrace(SECONDS));
+        String ip = FBUtilities.getBroadcastAddressAndPort().toString();
+        for (PaxosRow row : rows)
+        {
+            Ballot keyLowBound = Keyspace.open(KEYSPACE).getColumnFamilyStore(TABLE).getPaxosRepairLowBound(row.key);
+            Assert.assertTrue(ip, Commit.isAfter(keyLowBound, Ballot.none()));
+            Assert.assertFalse(ip, PaxosRows.hasBallotBeforeOrEqualTo(row.row, keyLowBound));
+        }
+    }
+
+    private static void assertLowBoundPurged(IInvokableInstance instance)
+    {
+        instance.runOnInstance(() -> assertLowBoundPurged(getPaxosRows().values()));
+    }
+
+    private static void assertLowBoundPurged(Cluster cluster)
+    {
+        cluster.forEach(PaxosRepairTest::assertLowBoundPurged);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PaxosUncommittedIndexTest.java b/test/distributed/org/apache/cassandra/distributed/test/PaxosUncommittedIndexTest.java
new file mode 100644
index 0000000..0ef52e7
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/PaxosUncommittedIndexTest.java
@@ -0,0 +1,54 @@
+/*
+ * 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.distributed.test;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+
+public class PaxosUncommittedIndexTest extends TestBaseImpl
+{
+    @Test
+    public void indexCqlIsExportableAndParsableTest() throws Throwable
+    {
+        String expectedCreateCustomIndex = "CREATE CUSTOM INDEX \"PaxosUncommittedIndex\" ON system.paxos () USING 'org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedIndex'";
+        try (Cluster dtestCluster = init(Cluster.build(1).withConfig(c -> c.with(Feature.NATIVE_PROTOCOL)).start()))
+        {
+            try (com.datastax.driver.core.Cluster clientCluster = com.datastax.driver.core.Cluster.builder().addContactPoint("127.0.0.1").build())
+            {
+                Assert.assertTrue(clientCluster.getMetadata().exportSchemaAsString()
+                                               .contains(expectedCreateCustomIndex));
+                Throwable thrown = null;
+                try
+                {
+                    dtestCluster.schemaChange(expectedCreateCustomIndex);
+                }
+                catch (Throwable tr)
+                {
+                    thrown = tr;
+                }
+
+                // Check parsing succeeds and index creation fails
+                Assert.assertTrue(thrown.getMessage().contains("System keyspace 'system' is not user-modifiable"));
+            }
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/PreviewRepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/PreviewRepairTest.java
index 849bc65..90e29f2 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/PreviewRepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/PreviewRepairTest.java
@@ -33,8 +33,10 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.util.concurrent.Uninterruptibles;
+
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -50,9 +52,8 @@
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.distributed.api.IIsolatedExecutor;
 import org.apache.cassandra.distributed.api.IMessage;
-import org.apache.cassandra.distributed.api.IMessageFilters;
 import org.apache.cassandra.distributed.api.NodeToolResult;
-import org.apache.cassandra.distributed.impl.Instance;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
 import org.apache.cassandra.distributed.shared.RepairResult;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.Verb;
@@ -63,14 +64,22 @@
 import org.apache.cassandra.repair.messages.RepairOption;
 import org.apache.cassandra.repair.messages.ValidationRequest;
 import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
-import org.apache.cassandra.utils.progress.ProgressEventType;
 
+import static com.google.common.collect.ImmutableList.of;
+import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.distributed.api.IMessageFilters.Matcher;
+import static org.apache.cassandra.distributed.impl.Instance.deserializeMessage;
+import static org.apache.cassandra.distributed.test.PreviewRepairTest.DelayFirstRepairTypeMessageFilter.finalizePropose;
+import static org.apache.cassandra.distributed.test.PreviewRepairTest.DelayFirstRepairTypeMessageFilter.validationRequest;
+import static org.apache.cassandra.net.Verb.FINALIZE_PROPOSE_MSG;
+import static org.apache.cassandra.net.Verb.VALIDATION_REQ;
+import static org.apache.cassandra.service.StorageService.instance;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+import static org.apache.cassandra.utils.progress.ProgressEventType.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -168,11 +177,11 @@
             insert(cluster.coordinator(1), 100, 100);
             cluster.forEach((node) -> node.flush(KEYSPACE));
             
-            SimpleCondition previewRepairStarted = new SimpleCondition();
-            SimpleCondition continuePreviewRepair = new SimpleCondition();
-            DelayFirstRepairTypeMessageFilter filter = DelayFirstRepairTypeMessageFilter.validationRequest(previewRepairStarted, continuePreviewRepair);
+            Condition previewRepairStarted = newOneTimeCondition();
+            Condition continuePreviewRepair = newOneTimeCondition();
+            DelayFirstRepairTypeMessageFilter filter = validationRequest(previewRepairStarted, continuePreviewRepair);
             // this pauses the validation request sent from node1 to node2 until we have run a full inc repair below
-            cluster.filters().outbound().verbs(Verb.VALIDATION_REQ.id).from(1).to(2).messagesMatching(filter).drop();
+            cluster.filters().outbound().verbs(VALIDATION_REQ.id).from(1).to(2).messagesMatching(filter).drop();
 
             Future<RepairResult> rsFuture = es.submit(() -> cluster.get(1).callOnInstance(repair(options(true, false))));
             previewRepairStarted.await();
@@ -207,24 +216,24 @@
             insert(cluster.coordinator(1), 100, 100);
             cluster.forEach((node) -> node.flush(KEYSPACE));
 
-            SimpleCondition previewRepairStarted = new SimpleCondition();
-            SimpleCondition continuePreviewRepair = new SimpleCondition();
+            Condition previewRepairStarted = newOneTimeCondition();
+            Condition continuePreviewRepair = newOneTimeCondition();
             // this pauses the validation request sent from node1 to node2 until the inc repair below has run
             cluster.filters()
                    .outbound()
-                   .verbs(Verb.VALIDATION_REQ.id)
+                   .verbs(VALIDATION_REQ.id)
                    .from(1).to(2)
-                   .messagesMatching(DelayFirstRepairTypeMessageFilter.validationRequest(previewRepairStarted, continuePreviewRepair))
+                   .messagesMatching(validationRequest(previewRepairStarted, continuePreviewRepair))
                    .drop();
 
-            SimpleCondition irRepairStarted = new SimpleCondition();
-            SimpleCondition continueIrRepair = new SimpleCondition();
+            Condition irRepairStarted = newOneTimeCondition();
+            Condition continueIrRepair = newOneTimeCondition();
             // this blocks the IR from committing, so we can reenable the preview
             cluster.filters()
                    .outbound()
-                   .verbs(Verb.FINALIZE_PROPOSE_MSG.id)
+                   .verbs(FINALIZE_PROPOSE_MSG.id)
                    .from(1).to(2)
-                   .messagesMatching(DelayFirstRepairTypeMessageFilter.finalizePropose(irRepairStarted, continueIrRepair))
+                   .messagesMatching(finalizePropose(irRepairStarted, continueIrRepair))
                    .drop();
 
             Future<RepairResult> previewResult = cluster.get(1).asyncCallsOnInstance(repair(options(true, false))).call();
@@ -258,6 +267,7 @@
         ExecutorService es = Executors.newSingleThreadExecutor();
         try(Cluster cluster = init(Cluster.build(2).withConfig(config -> config.with(GOSSIP).with(NETWORK)).start()))
         {
+            int tokenCount = ClusterUtils.getTokenCount(cluster.get(1));
             cluster.schemaChange("create table " + KEYSPACE + ".tbl (id int primary key, t int)");
 
             insert(cluster.coordinator(1), 0, 100);
@@ -268,20 +278,20 @@
             cluster.forEach((node) -> node.flush(KEYSPACE));
 
             // pause preview repair validation messages on node2 until node1 has finished
-            SimpleCondition previewRepairStarted = new SimpleCondition();
-            SimpleCondition continuePreviewRepair = new SimpleCondition();
-            DelayFirstRepairTypeMessageFilter filter = DelayFirstRepairTypeMessageFilter.validationRequest(previewRepairStarted, continuePreviewRepair);
-            cluster.filters().outbound().verbs(Verb.VALIDATION_REQ.id).from(1).to(2).messagesMatching(filter).drop();
+            Condition previewRepairStarted = newOneTimeCondition();
+            Condition continuePreviewRepair = newOneTimeCondition();
+            DelayFirstRepairTypeMessageFilter filter = validationRequest(previewRepairStarted, continuePreviewRepair);
+            cluster.filters().outbound().verbs(VALIDATION_REQ.id).from(1).to(2).messagesMatching(filter).drop();
 
             // get local ranges to repair two separate ranges:
             List<String> localRanges = cluster.get(1).callOnInstance(() -> {
                 List<String> res = new ArrayList<>();
-                for (Range<Token> r : StorageService.instance.getLocalReplicas(KEYSPACE).ranges())
+                for (Range<Token> r : instance.getLocalReplicas(KEYSPACE).ranges())
                     res.add(r.left.getTokenValue()+ ":"+ r.right.getTokenValue());
                 return res;
             });
 
-            assertEquals(2, localRanges.size());
+            assertEquals(2 * tokenCount, localRanges.size());
             Future<RepairResult> repairStatusFuture = es.submit(() -> cluster.get(1).callOnInstance(repair(options(true, false, localRanges.get(0)))));
             previewRepairStarted.await(); // wait for node1 to start validation compaction
             // this needs to finish before the preview repair is unpaused on node2
@@ -310,6 +320,7 @@
                                                                      .with(NETWORK))
                                           .start()))
         {
+            int tokenCount = ClusterUtils.getTokenCount(cluster.get(1));
             cluster.schemaChange("create table " + KEYSPACE + ".tbl (id int primary key, t int)");
             insert(cluster.coordinator(1), 0, 100);
             cluster.forEach((node) -> node.flush(KEYSPACE));
@@ -319,8 +330,8 @@
             cluster.forEach((node) -> node.flush(KEYSPACE));
 
             // pause inc repair validation messages on node2 until node1 has finished
-            SimpleCondition incRepairStarted = new SimpleCondition();
-            SimpleCondition continueIncRepair = new SimpleCondition();
+            Condition incRepairStarted = newOneTimeCondition();
+            Condition continueIncRepair = newOneTimeCondition();
 
             DelayFirstRepairTypeMessageFilter filter = DelayFirstRepairTypeMessageFilter.validationRequest(incRepairStarted, continueIncRepair);
             cluster.filters().outbound().verbs(Verb.VALIDATION_REQ.id).from(1).to(2).messagesMatching(filter).drop();
@@ -333,7 +344,7 @@
                 return res;
             });
 
-            assertEquals(2, localRanges.size());
+            assertEquals(2 * tokenCount, localRanges.size());
             String [] previewedRange = localRanges.get(0).split(":");
             String [] repairedRange = localRanges.get(1).split(":");
             Future<NodeToolResult> repairStatusFuture = es.submit(() -> cluster.get(1).nodetoolResult("repair", "-st", repairedRange[0], "-et", repairedRange[1], KEYSPACE, "tbl"));
@@ -434,23 +445,23 @@
             ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(table);
             if(shouldBeEmpty)
             {
-                assertTrue(cfs.getSnapshotDetails().isEmpty());
+                assertTrue(cfs.listSnapshots().isEmpty());
             }
             else
             {
-                while (cfs.getSnapshotDetails().isEmpty())
+                while (cfs.listSnapshots().isEmpty())
                     Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
             }
         }));
     }
 
-    static abstract class DelayFirstRepairMessageFilter implements IMessageFilters.Matcher
+    static abstract class DelayFirstRepairMessageFilter implements Matcher
     {
-        private final SimpleCondition pause;
-        private final SimpleCondition resume;
+        private final Condition pause;
+        private final Condition resume;
         private final AtomicBoolean waitForRepair = new AtomicBoolean(true);
 
-        protected DelayFirstRepairMessageFilter(SimpleCondition pause, SimpleCondition resume)
+        protected DelayFirstRepairMessageFilter(Condition pause, Condition resume)
         {
             this.pause = pause;
             this.resume = resume;
@@ -462,7 +473,7 @@
         {
             try
             {
-                Message<?> msg = Instance.deserializeMessage(message);
+                Message<?> msg = deserializeMessage(message);
                 RepairMessage repairMessage = (RepairMessage) msg.payload;
                 // only the first message should be delayed:
                 if (matchesMessage(repairMessage) && waitForRepair.compareAndSet(true, false))
@@ -483,18 +494,18 @@
     {
         private final Class<? extends RepairMessage> type;
 
-        public DelayFirstRepairTypeMessageFilter(SimpleCondition pause, SimpleCondition resume, Class<? extends RepairMessage> type)
+        public DelayFirstRepairTypeMessageFilter(Condition pause, Condition resume, Class<? extends RepairMessage> type)
         {
             super(pause, resume);
             this.type = type;
         }
 
-        public static DelayFirstRepairTypeMessageFilter validationRequest(SimpleCondition pause, SimpleCondition resume)
+        public static DelayFirstRepairTypeMessageFilter validationRequest(Condition pause, Condition resume)
         {
             return new DelayFirstRepairTypeMessageFilter(pause, resume, ValidationRequest.class);
         }
 
-        public static DelayFirstRepairTypeMessageFilter finalizePropose(SimpleCondition pause, SimpleCondition resume)
+        public static DelayFirstRepairTypeMessageFilter finalizePropose(Condition pause, Condition resume)
         {
             return new DelayFirstRepairTypeMessageFilter(pause, resume, FinalizePropose.class);
         }
@@ -522,25 +533,25 @@
     private static IIsolatedExecutor.SerializableCallable<RepairResult> repair(Map<String, String> options)
     {
         return () -> {
-            SimpleCondition await = new SimpleCondition();
+            Condition await = newOneTimeCondition();
             AtomicBoolean success = new AtomicBoolean(true);
             AtomicBoolean wasInconsistent = new AtomicBoolean(false);
-            StorageService.instance.repair(KEYSPACE, options, ImmutableList.of((tag, event) -> {
-                if (event.getType() == ProgressEventType.ERROR)
+            instance.repair(KEYSPACE, options, of((tag, event) -> {
+                if (event.getType() == ERROR)
                 {
                     success.set(false);
                     await.signalAll();
                 }
-                else if (event.getType() == ProgressEventType.NOTIFICATION && event.getMessage().contains("Repaired data is inconsistent"))
+                else if (event.getType() == NOTIFICATION && event.getMessage().contains("Repaired data is inconsistent"))
                 {
                     wasInconsistent.set(true);
                 }
-                else if (event.getType() == ProgressEventType.COMPLETE)
+                else if (event.getType() == COMPLETE)
                     await.signalAll();
             }));
             try
             {
-                await.await(1, TimeUnit.MINUTES);
+                await.await(1, MINUTES);
             }
             catch (InterruptedException e)
             {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ReadDigestConsistencyTest.java b/test/distributed/org/apache/cassandra/distributed/test/ReadDigestConsistencyTest.java
index 05e705b..85c2783 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ReadDigestConsistencyTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ReadDigestConsistencyTest.java
@@ -31,6 +31,7 @@
 import org.apache.cassandra.distributed.api.ICoordinator;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.utils.Throwables;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class ReadDigestConsistencyTest extends TestBaseImpl
 {
@@ -65,7 +66,7 @@
 
     public static void checkTraceForDigestMismatch(ICoordinator coordinator, String query, Object... boundValues)
     {
-        UUID sessionId = UUID.randomUUID();
+        UUID sessionId = TimeUUID.Generator.nextTimeUUID().asUUID();
         try
         {
             coordinator.executeWithTracing(sessionId, query, ConsistencyLevel.ALL, boundValues);
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairEmptyRangeTombstonesTest.java b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairEmptyRangeTombstonesTest.java
index c07b128..6cdea9b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairEmptyRangeTombstonesTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairEmptyRangeTombstonesTest.java
@@ -33,7 +33,6 @@
 import org.apache.cassandra.distributed.shared.AssertUtils;
 import org.apache.cassandra.service.reads.repair.ReadRepairStrategy;
 
-import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.distributed.shared.AssertUtils.row;
 
 
@@ -96,8 +95,8 @@
     public static void setupCluster() throws IOException
     {
         cluster = init(Cluster.build(NUM_NODES)
-                              .withConfig(config -> config.set("read_request_timeout_in_ms", MINUTES.toMillis(1))
-                                                          .set("write_request_timeout_in_ms", MINUTES.toMillis(1)))
+                              .withConfig(config -> config.set("read_request_timeout", "1m")
+                                                          .set("write_request_timeout", "1m"))
                               .start());
         cluster.schemaChange(withKeyspace("CREATE TYPE %s.udt (x int, y int)"));
     }
@@ -286,4 +285,4 @@
             return this;
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairQueryTester.java b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairQueryTester.java
index 10bf050..26516104 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairQueryTester.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairQueryTester.java
@@ -31,7 +31,6 @@
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.service.reads.repair.ReadRepairStrategy;
 
-import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertEquals;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
 import static org.apache.cassandra.service.reads.repair.ReadRepairStrategy.NONE;
@@ -116,8 +115,8 @@
     public static void setupCluster() throws IOException
     {
         cluster = init(Cluster.build(NUM_NODES)
-                              .withConfig(config -> config.set("read_request_timeout_in_ms", MINUTES.toMillis(1))
-                                                          .set("write_request_timeout_in_ms", MINUTES.toMillis(1)))
+                              .withConfig(config -> config.set("read_request_timeout", "1m")
+                                                          .set("write_request_timeout", "1m"))
                               .start());
         cluster.schemaChange(withKeyspace("CREATE TYPE %s.udt (x int, y int)"));
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java
index c68320e..9a70e89 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTest.java
@@ -26,6 +26,7 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -36,7 +37,6 @@
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
-import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
@@ -52,14 +52,14 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.locator.ReplicaPlan;
-import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.service.PendingRangeCalculatorService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.service.reads.repair.BlockingReadRepair;
 import org.apache.cassandra.service.reads.repair.ReadRepairStrategy;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
 
 import static net.bytebuddy.matcher.ElementMatchers.named;
+
+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;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertEquals;
@@ -68,6 +68,8 @@
 import static org.apache.cassandra.net.Verb.READ_REPAIR_REQ;
 import static org.apache.cassandra.net.Verb.READ_REPAIR_RSP;
 import static org.apache.cassandra.net.Verb.READ_REQ;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 import static org.junit.Assert.fail;
 
 public class ReadRepairTest extends TestBaseImpl
@@ -131,7 +133,7 @@
             cluster.get(2).executeInternal("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, 1)");
             assertRows(cluster.get(3).executeInternal("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1"));
             cluster.verbs(READ_REPAIR_RSP).to(1).drop();
-            final long start = System.currentTimeMillis();
+            final long start = currentTimeMillis();
             try
             {
                 cluster.coordinator(1).execute("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", ConsistencyLevel.ALL);
@@ -141,7 +143,7 @@
             {
                 // the containing exception class was loaded by another class loader. Comparing the message as a workaround to assert the exception
                 Assert.assertTrue(ex.getClass().toString().contains("ReadTimeoutException"));
-                long actualTimeTaken = System.currentTimeMillis() - start;
+                long actualTimeTaken = currentTimeMillis() - start;
                 long magicDelayAmount = 100L; // it might not be the best way to check if the time taken is around the timeout value.
                 // Due to the delays, the actual time taken from client perspective is slighly more than the timeout value
                 Assert.assertTrue(actualTimeTaken > reducedReadTimeout);
@@ -178,7 +180,8 @@
     @Test
     public void movingTokenReadRepairTest() throws Throwable
     {
-        try (Cluster cluster = init(Cluster.create(4), 3))
+        // TODO: fails with vnode enabled
+        try (Cluster cluster = init(Cluster.build(4).withoutVNodes().start(), 3))
         {
             List<Token> tokens = cluster.tokens();
 
@@ -353,7 +356,7 @@
         String key = "test1";
         try (Cluster cluster = init(Cluster.build()
                                            .withConfig(config -> config.with(Feature.GOSSIP, Feature.NETWORK)
-                                                                       .set("read_request_timeout_in_ms", Integer.MAX_VALUE))
+                                                                       .set("read_request_timeout", String.format("%dms", Integer.MAX_VALUE)))
                                            .withTokenSupplier(TokenSupplier.evenlyDistributedTokens(4))
                                            .withNodeIdTopology(NetworkTopology.singleDcNetworkTopology(4, "dc0", "rack0"))
                                            .withNodes(3)
@@ -365,7 +368,7 @@
                                  "    PRIMARY KEY (key, column1)\n" +
                                  ") WITH CLUSTERING ORDER BY (column1 ASC)");
 
-            cluster.forEach(i -> i.runOnInstance(() -> Keyspace.open(KEYSPACE).getColumnFamilyStore("tbl").disableAutoCompaction()));
+            cluster.forEach(i -> i.runOnInstance(() -> open(KEYSPACE).getColumnFamilyStore("tbl").disableAutoCompaction()));
 
             for (int i = 1; i <= 2; i++)
             {
@@ -378,9 +381,9 @@
             cluster.get(3).flush(KEYSPACE);
 
             // pause the read until we have bootstrapped a new node below
-            SimpleCondition continueRead = new SimpleCondition();
-            SimpleCondition readStarted = new SimpleCondition();
-            cluster.filters().outbound().from(3).to(1,2).verbs(Verb.READ_REQ.id).messagesMatching((i, i1, iMessage) -> {
+            Condition continueRead = newOneTimeCondition();
+            Condition readStarted = newOneTimeCondition();
+            cluster.filters().outbound().from(3).to(1,2).verbs(READ_REQ.id).messagesMatching((i, i1, iMessage) -> {
                 try
                 {
                     readStarted.signalAll();
@@ -394,7 +397,7 @@
             }).drop();
             Future<Object[][]> read = es.submit(() -> cluster.coordinator(3)
                                                           .execute("SELECT * FROM distributed_test_keyspace.tbl WHERE key=? and column1 >= ? and column1 <= ?",
-                                                                   ConsistencyLevel.ALL, key, 20, 40));
+                                                                   ALL, key, 20, 40));
             readStarted.await();
             IInstanceConfig config = cluster.newInstanceConfig();
             config.set("auto_bootstrap", true);
@@ -491,7 +494,7 @@
         // on timestamp tie of RT and partition deletion: we should not generate RT bounds in such case,
         // since monotonicity is already ensured by the partition deletion, and RT is unnecessary there.
         // For details, see CASSANDRA-16453.
-        public static Object repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForTokenWrite writePlan, @SuperCall Callable<Void> r) throws Exception
+        public static Object repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForWrite writePlan, @SuperCall Callable<Void> r) throws Exception
         {
             Assert.assertEquals(2, mutations.size());
             for (Mutation value : mutations.values())
@@ -505,4 +508,4 @@
             return r.call();
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTester.java b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTester.java
index c3a36cb..a73d968 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTester.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ReadRepairTester.java
@@ -159,4 +159,4 @@
             return cfs.metric.readRepairRequests.getCount();
         });
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/RepairBoundaryTest.java b/test/distributed/org/apache/cassandra/distributed/test/RepairBoundaryTest.java
index d269bef..d7cd0ec 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/RepairBoundaryTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/RepairBoundaryTest.java
@@ -23,7 +23,7 @@
 import java.util.HashMap;
 import java.util.Map;
 
-import com.google.common.collect.ImmutableList;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -31,16 +31,17 @@
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
-import org.apache.cassandra.utils.progress.ProgressEventType;
 
+import static com.google.common.collect.ImmutableList.of;
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.dht.Murmur3Partitioner.*;
 import static org.apache.cassandra.dht.Murmur3Partitioner.LongToken.keyForToken;
 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;
+import static org.apache.cassandra.service.StorageService.instance;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+import static org.apache.cassandra.utils.progress.ProgressEventType.COMPLETE;
 
 public class RepairBoundaryTest extends TestBaseImpl
 {
@@ -142,9 +143,9 @@
                 Map<String, String> options = new HashMap<>();
                 options.put("ranges", "999:1000");
                 options.put("incremental", "false");
-                SimpleCondition await = new SimpleCondition();
-                StorageService.instance.repair(KEYSPACE, options, ImmutableList.of((tag, event) -> {
-                    if (event.getType() == ProgressEventType.COMPLETE)
+                Condition await = newOneTimeCondition();
+                instance.repair(KEYSPACE, options, of((tag, event) -> {
+                    if (event.getType() == COMPLETE)
                         await.signalAll();
                 })).right.get();
                 await.await(1L, MINUTES);
diff --git a/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java b/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java
index fc058db..f1266fa 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/RepairCoordinatorBase.java
@@ -22,6 +22,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.RejectedExecutionException;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -78,6 +79,8 @@
                               .withConfig(c -> c.with(Feature.NETWORK)
                                                 .with(Feature.GOSSIP))
                               .start());
+
+        CLUSTER.setUncaughtExceptionsFilter(throwable -> throwable instanceof RejectedExecutionException && "RepairJobTask has shut down".equals(throwable.getMessage()));
     }
 
     @AfterClass
diff --git a/test/distributed/org/apache/cassandra/distributed/test/RepairDigestTrackingTest.java b/test/distributed/org/apache/cassandra/distributed/test/RepairDigestTrackingTest.java
index a4daceb..f6da888 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/RepairDigestTrackingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/RepairDigestTrackingTest.java
@@ -19,7 +19,11 @@
 package org.apache.cassandra.distributed.test;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.TimeUnit;
@@ -63,6 +67,7 @@
 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;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -540,7 +545,7 @@
                     SSTableReader sstable = sstables.next();
                     Descriptor descriptor = sstable.descriptor;
                     descriptor.getMetadataSerializer()
-                              .mutateRepairMetadata(descriptor, System.currentTimeMillis(), null, false);
+                              .mutateRepairMetadata(descriptor, currentTimeMillis(), null, false);
                     sstable.reloadSSTableMetadata();
                 }
             } catch (IOException e) {
@@ -586,7 +591,7 @@
             int attempts = 100;
             ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(TABLE);
 
-            while (cfs.getSnapshotDetails().isEmpty())
+            while (cfs.listSnapshots().isEmpty())
             {
                 Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
                 if (attempts-- < 0)
diff --git a/test/distributed/org/apache/cassandra/distributed/test/RepairErrorsTest.java b/test/distributed/org/apache/cassandra/distributed/test/RepairErrorsTest.java
index b3de7db..f34bb2a 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/RepairErrorsTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/RepairErrorsTest.java
@@ -19,32 +19,38 @@
 package org.apache.cassandra.distributed.test;
 
 import java.io.IOException;
+import java.util.Collection;
 import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
 import net.bytebuddy.ByteBuddy;
 import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
 import net.bytebuddy.implementation.MethodDelegation;
 import net.bytebuddy.implementation.bind.annotation.SuperCall;
+import org.assertj.core.api.Assertions;
 import org.junit.Test;
 
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.compaction.CompactionInterruptedException;
+import org.apache.cassandra.db.compaction.CompactionIterator;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.db.streaming.CassandraIncomingFile;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.distributed.api.NodeToolResult;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.streaming.StreamSession;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static net.bytebuddy.matcher.ElementMatchers.named;
-import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -54,6 +60,33 @@
 public class RepairErrorsTest extends TestBaseImpl
 {
     @Test
+    public void testRemoteValidationFailure() throws IOException
+    {
+        Cluster.Builder builder = Cluster.build(2)
+                                         .withConfig(config -> config.with(GOSSIP).with(NETWORK))
+                                         .withInstanceInitializer(ByteBuddyHelper::install);
+        try (Cluster cluster = builder.createWithoutStarting())
+        {
+            cluster.setUncaughtExceptionsFilter((i, throwable) -> {
+                if (i == 2)
+                    return throwable.getMessage() != null && throwable.getMessage().contains("IGNORE");
+                return false;
+            });
+
+            cluster.startup();
+            init(cluster);
+
+            cluster.schemaChange("create table "+KEYSPACE+".tbl (id int primary key, x int)");
+            for (int i = 0; i < 10; i++)
+                cluster.coordinator(1).execute("insert into "+KEYSPACE+".tbl (id, x) VALUES (?,?)", ConsistencyLevel.ALL, i, i);
+            cluster.forEach(i -> i.flush(KEYSPACE));
+            long mark = cluster.get(1).logs().mark();
+            cluster.forEach(i -> i.nodetoolResult("repair", "--full").asserts().failure());
+            Assertions.assertThat(cluster.get(1).logs().grep(mark, "^ERROR").getResult()).isEmpty();
+        }
+    }
+
+    @Test
     public void testRemoteSyncFailure() throws Exception
     {
         try (Cluster cluster = init(Cluster.build(3)
@@ -96,6 +129,10 @@
             result.asserts().success();
 
             assertNoActiveRepairSessions(cluster.get(1));
+
+            cluster.forEach(i -> Assertions.assertThat(i.logs().grep("SomeRepairFailedException").getResult())
+                                           .describedAs("node%d logged hidden exception org.apache.cassandra.repair.SomeRepairFailedException", i.config().num())
+                                           .isEmpty());
         }
     }
 
@@ -142,6 +179,24 @@
         }
     }
 
+    @Test
+    public void testNoSuchRepairSessionAnticompaction() throws IOException
+    {
+        try (Cluster cluster = init(Cluster.build(2)
+                                           .withConfig(config -> config.with(GOSSIP).with(NETWORK))
+                                           .withInstanceInitializer(ByteBuddyHelper::installACNoSuchRepairSession)
+                                           .start()))
+        {
+            cluster.schemaChange("create table "+KEYSPACE+".tbl (id int primary key, x int)");
+            for (int i = 0; i < 10; i++)
+                cluster.coordinator(1).execute("insert into "+KEYSPACE+".tbl (id, x) VALUES (?,?)", ConsistencyLevel.ALL, i, i);
+            cluster.forEach(i -> i.flush(KEYSPACE));
+            long mark = cluster.get(1).logs().mark();
+            cluster.forEach(i -> i.nodetoolResult("repair", KEYSPACE).asserts().failure());
+            assertTrue(cluster.get(1).logs().grep(mark, "^ERROR").getResult().isEmpty());
+        }
+    }
+
     @SuppressWarnings("Convert2MethodRef")
     private void assertNoActiveRepairSessions(IInvokableInstance instance)
     {
@@ -152,6 +207,30 @@
 
     public static class ByteBuddyHelper
     {
+        public static void install(ClassLoader cl, int nodeNumber)
+        {
+            if (nodeNumber == 2)
+            {
+                new ByteBuddy().redefine(CompactionIterator.class)
+                               .method(named("next"))
+                               .intercept(MethodDelegation.to(ByteBuddyHelper.class))
+                               .make()
+                               .load(cl, ClassLoadingStrategy.Default.INJECTION);
+            }
+        }
+
+        public static void installACNoSuchRepairSession(ClassLoader cl, int nodeNumber)
+        {
+            if (nodeNumber == 2)
+            {
+                new ByteBuddy().redefine(CompactionManager.class)
+                               .method(named("validateSSTableBoundsForAnticompaction"))
+                               .intercept(MethodDelegation.to(ByteBuddyHelper.class))
+                               .make()
+                               .load(cl, ClassLoadingStrategy.Default.INJECTION);
+            }
+        }
+        
         public static void installStreamPlanExecutionFailure(ClassLoader cl, int nodeNumber)
         {
             if (nodeNumber == 2)
@@ -170,15 +249,22 @@
                         .intercept(MethodDelegation.to(ByteBuddyHelper.class))
                         .make()
                         .load(cl, ClassLoadingStrategy.Default.INJECTION);
-
-                new ByteBuddy().rebase(DebuggableThreadPoolExecutor.class)
-                        .method(named("extractThrowable").and(takesArguments(Future.class)))
-                        .intercept(MethodDelegation.to(ByteBuddyHelper.class))
-                        .make()
-                        .load(cl, ClassLoadingStrategy.Default.INJECTION);
             }
         }
 
+        public static UnfilteredRowIterator next()
+        {
+            throw new RuntimeException("IGNORE");
+        }
+
+        @SuppressWarnings("unused")
+        public static void validateSSTableBoundsForAnticompaction(TimeUUID sessionID,
+                                                                  Collection<SSTableReader> sstables,
+                                                                  RangesAtEndpoint ranges)
+        {
+            throw new CompactionInterruptedException(String.valueOf(sessionID));
+        }
+
         @SuppressWarnings("unused")
         public static void onInitializationComplete()
         {
@@ -192,7 +278,7 @@
             {
                 try
                 {
-                    TimeUnit.SECONDS.sleep(60);
+                    TimeUnit.SECONDS.sleep(10);
                 }
                 catch (InterruptedException e)
                 {
@@ -203,16 +289,6 @@
 
             return zuper.call();
         }
-
-        @SuppressWarnings({"unused", "ResultOfMethodCallIgnored"})
-        public static Throwable extractThrowable(Future<?> future, @SuperCall Callable<Throwable> zuper) throws Exception
-        {
-            if (Thread.currentThread().getName().contains("RepairJobTask"))
-                // Clear the interrupt flag so the FSReadError is propagated correctly in DebuggableThreadPoolExecutor:
-                Thread.interrupted();
-            
-            return zuper.call();
-        }
     }
 
     public static class ByteBuddyHelperStreamFailure
@@ -222,19 +298,19 @@
             if (nodeNumber == 3)
             {
                 new ByteBuddy().rebase(CassandraIncomingFile.class)
-                        .method(named("read"))
-                        .intercept(MethodDelegation.to(ByteBuddyHelperStreamFailure.class))
-                        .make()
-                        .load(cl, ClassLoadingStrategy.Default.INJECTION);
+                               .method(named("read"))
+                               .intercept(MethodDelegation.to(ByteBuddyHelperStreamFailure.class))
+                               .make()
+                               .load(cl, ClassLoadingStrategy.Default.INJECTION);
             }
 
             if (nodeNumber == 1)
             {
                 new ByteBuddy().rebase(SystemKeyspace.class)
-                        .method(named("getPreferredIP"))
-                        .intercept(MethodDelegation.to(ByteBuddyHelperStreamFailure.class))
-                        .make()
-                        .load(cl, ClassLoadingStrategy.Default.INJECTION);
+                               .method(named("getPreferredIP"))
+                               .intercept(MethodDelegation.to(ByteBuddyHelperStreamFailure.class))
+                               .make()
+                               .load(cl, ClassLoadingStrategy.Default.INJECTION);
             }
         }
 
@@ -247,7 +323,7 @@
         @SuppressWarnings("unused")
         public static InetAddressAndPort getPreferredIP(InetAddressAndPort ep, @SuperCall Callable<InetAddressAndPort> zuper) throws Exception
         {
-            if (Thread.currentThread().getName().contains("NettyStreaming-Outbound") && ep.address.toString().contains("127.0.0.2"))
+            if (Thread.currentThread().getName().contains("NettyStreaming-Outbound") && ep.getAddress().toString().contains("127.0.0.2"))
             {
                 try
                 {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/RepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/RepairTest.java
index b127a74..669e762 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/RepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/RepairTest.java
@@ -22,11 +22,13 @@
 import java.util.Arrays;
 import java.util.Map;
 import java.util.Set;
-import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 
-import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -37,14 +39,16 @@
 import org.apache.cassandra.distributed.api.IInstanceConfig;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
-import org.apache.cassandra.utils.progress.ProgressEventType;
 
+import static com.google.common.collect.ImmutableList.of;
 import static java.util.concurrent.TimeUnit.MINUTES;
 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;
 import static org.apache.cassandra.distributed.test.ExecUtil.rethrow;
+import static org.apache.cassandra.service.StorageService.instance;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+import static org.apache.cassandra.utils.progress.ProgressEventType.COMPLETE;
 
 public class RepairTest extends TestBaseImpl
 {
@@ -77,7 +81,8 @@
     private static void flush(ICluster<IInvokableInstance> cluster, String keyspace, int ... nodes)
     {
         for (int node : nodes)
-            cluster.get(node).runOnInstance(rethrow(() -> StorageService.instance.forceKeyspaceFlush(keyspace)));
+            cluster.get(node).runOnInstance(rethrow(() -> StorageService.instance.forceKeyspaceFlush(keyspace,
+                                                                                                     ColumnFamilyStore.FlushReason.UNIT_TESTS)));
     }
 
     private static ICluster create(Consumer<IInstanceConfig> configModifier) throws IOException
@@ -95,9 +100,9 @@
     static void repair(ICluster<IInvokableInstance> cluster, String keyspace, Map<String, String> options)
     {
         cluster.get(1).runOnInstance(rethrow(() -> {
-            SimpleCondition await = new SimpleCondition();
-            StorageService.instance.repair(keyspace, options, ImmutableList.of((tag, event) -> {
-                if (event.getType() == ProgressEventType.COMPLETE)
+            Condition await = newOneTimeCondition();
+            instance.repair(keyspace, options, of((tag, event) -> {
+                if (event.getType() == COMPLETE)
                     await.signalAll();
             })).right.get();
             await.await(1L, MINUTES);
@@ -139,7 +144,7 @@
     void shutDownNodesAndForceRepair(ICluster<IInvokableInstance> cluster, String keyspace, int downNode) throws Exception
     {
         populate(cluster, keyspace, "{'enabled': false}");
-        cluster.get(downNode).shutdown().get(5, TimeUnit.SECONDS);
+        ClusterUtils.stopUnchecked(cluster.get(downNode));
         repair(cluster, keyspace, ImmutableMap.of("forceRepair", "true"));
     }
 
@@ -198,6 +203,7 @@
         // The test uses its own keyspace with rf == 2
         String forceRepairKeyspace = "test_force_repair_keyspace";
         int rf = 2;
+        int tokenCount = ClusterUtils.getTokenCount(cluster.get(1));
         cluster.schemaChange("CREATE KEYSPACE " + forceRepairKeyspace + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': " + rf + "};");
 
         try
@@ -208,9 +214,9 @@
                 Set<String> requestedRanges = row.getSet("requested_ranges");
                 Assert.assertNotNull("Found no successful ranges", successfulRanges);
                 Assert.assertNotNull("Found no requested ranges", requestedRanges);
-                Assert.assertEquals("Requested ranges count should equals to replication factor", rf, requestedRanges.size());
-                Assert.assertTrue("Given clusterSize = 3, RF = 2 and 1 node down in the replica set, it should yield only 1 successful repaired range.",
-                                  successfulRanges.size() == 1 && !successfulRanges.contains("")); // the successful ranges set should not only contain empty string
+                Assert.assertEquals("Requested ranges count should equals to replication factor", rf * tokenCount, requestedRanges.size());
+                Assert.assertTrue("Given clusterSize = 3, RF = 2 and 1 node down in the replica set, it should yield only " + tokenCount + " successful repaired range.",
+                                  successfulRanges.size() == tokenCount && !successfulRanges.contains("")); // the successful ranges set should not only contain empty string
             });
         }
         finally
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ReplicaFilteringProtectionTest.java b/test/distributed/org/apache/cassandra/distributed/test/ReplicaFilteringProtectionTest.java
index f891dfe..099ea05 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ReplicaFilteringProtectionTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ReplicaFilteringProtectionTest.java
@@ -57,8 +57,7 @@
         cluster = init(Cluster.build()
                               .withNodes(REPLICAS)
                               .withConfig(config -> config.set("hinted_handoff_enabled", false)
-                                                          .set("commitlog_sync", "batch")
-                                                          .set("num_tokens", 1)).start());
+                                                          .set("commitlog_sync", "batch")).start());
 
         // Make sure we start w/ the correct defaults:
         cluster.get(1).runOnInstance(() -> assertEquals(DEFAULT_WARN_THRESHOLD, StorageService.instance.getCachedReplicaRowsWarnThreshold()));
@@ -68,7 +67,8 @@
     @AfterClass
     public static void teardown()
     {
-        cluster.close();
+        if (cluster != null)
+            cluster.close();
     }
 
     @Test
@@ -241,4 +241,4 @@
                                                      .getColumnFamilyStore(tableName)
                                                      .metric.rfpRowsCachedPerQuery.getCount());
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ResourceLeakTest.java b/test/distributed/org/apache/cassandra/distributed/test/ResourceLeakTest.java
index 5430800..a5a2dce 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ResourceLeakTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ResourceLeakTest.java
@@ -18,17 +18,16 @@
 
 package org.apache.cassandra.distributed.test;
 
-import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.nio.file.FileSystems;
 import java.nio.file.Path;
 import java.sql.Date;
 import java.text.SimpleDateFormat;
-import java.time.Instant;
 import java.util.function.Consumer;
 import javax.management.MBeanServer;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Ignore;
 import org.junit.Test;
 
@@ -41,6 +40,7 @@
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.utils.FBUtilities.now;
 
 /* Resource Leak Test - useful when tracking down issues with in-JVM framework cleanup.
  * All objects referencing the InstanceClassLoader need to be garbage collected or
@@ -65,7 +65,7 @@
     final long finalWaitMillis = 0l;       // Number of millis to wait before final resource dump to give gc a chance
 
     static final SimpleDateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
-    static final String when = format.format(Date.from(Instant.now()));
+    static final String when = format.format(Date.from(now()));
 
     static String outputFilename(String base, String description, String extension)
     {
@@ -123,7 +123,7 @@
         long pid = getProcessId();
         ProcessBuilder map = new ProcessBuilder("/usr/sbin/lsof", "-p", Long.toString(pid));
         File output = new File(outputFilename("lsof", description, ".txt"));
-        map.redirectOutput(output);
+        map.redirectOutput(output.toJavaIOFile());
         map.redirectErrorStream(true);
         map.start().waitFor();
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/RestartTest.java b/test/distributed/org/apache/cassandra/distributed/test/RestartTest.java
new file mode 100644
index 0000000..4d3049b
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/RestartTest.java
@@ -0,0 +1,39 @@
+/*
+ * 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.distributed.test;
+
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.utils.FBUtilities;
+
+public class RestartTest extends TestBaseImpl
+{
+    @Test
+    public void test() throws Exception
+    {
+        try (Cluster cluster = init(Cluster.build(2).withDataDirCount(1).start()))
+        {
+            FBUtilities.waitOnFuture(cluster.get(2).shutdown());
+            FBUtilities.waitOnFuture(cluster.get(1).shutdown());
+            cluster.get(1).startup();
+            cluster.get(2).startup();
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/SSTableIdGenerationTest.java b/test/distributed/org/apache/cassandra/distributed/test/SSTableIdGenerationTest.java
new file mode 100644
index 0000000..dd37bd3
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/SSTableIdGenerationTest.java
@@ -0,0 +1,531 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.io.FileUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.compaction.AbstractCompactionStrategy;
+import org.apache.cassandra.db.compaction.DateTieredCompactionStrategy;
+import org.apache.cassandra.db.compaction.LeveledCompactionStrategy;
+import org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy;
+import org.apache.cassandra.db.compaction.TimeWindowCompactionStrategy;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.SimpleQueryResult;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
+import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.io.sstable.UUIDBasedSSTableId;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.metrics.RestorableMeter;
+import org.apache.cassandra.tools.SystemExitException;
+import org.apache.cassandra.utils.TimeUUID;
+import org.assertj.core.api.Assertions;
+import org.assertj.core.data.Offset;
+
+import static java.lang.String.format;
+import static org.apache.cassandra.Util.bulkLoadSSTables;
+import static org.apache.cassandra.Util.getBackups;
+import static org.apache.cassandra.Util.getSSTables;
+import static org.apache.cassandra.Util.getSnapshots;
+import static org.apache.cassandra.Util.relativizePath;
+import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
+import static org.apache.cassandra.db.SystemKeyspace.LEGACY_SSTABLE_ACTIVITY;
+import static org.apache.cassandra.db.SystemKeyspace.SSTABLE_ACTIVITY_V2;
+import static org.apache.cassandra.distributed.shared.FutureUtils.waitOn;
+import static org.apache.cassandra.distributed.test.ExecUtil.rethrow;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class SSTableIdGenerationTest extends TestBaseImpl
+{
+    private final static String ENABLE_UUID_FIELD_NAME = "uuid_sstable_identifiers_enabled";
+    private final static String SNAPSHOT_TAG = "test";
+
+    private int v;
+
+    private static SecurityManager originalSecurityManager;
+
+    @BeforeClass
+    public static void beforeClass() throws Throwable
+    {
+        TestBaseImpl.beforeClass();
+
+        originalSecurityManager = System.getSecurityManager();
+        // we prevent system exit and convert it to exception becuase this is one of the expected test outcomes,
+        // and we want to make an assertion on that
+        ClusterUtils.preventSystemExit();
+    }
+
+    @AfterClass
+    public static void afterClass() throws Throwable
+    {
+        System.setSecurityManager(originalSecurityManager);
+    }
+
+    /**
+     * This test verifies that a node with uuid disabled actually creates sstables with sequential ids and
+     * both the current and legacy sstable activity tables are updated.
+     * Then, when enable uuid, we actually create sstables with uuid but keep and can read the old sstables. Also, only
+     * update the current sstable activity table.
+     */
+    @Test
+    public void testRestartWithUUIDEnabled() throws IOException
+    {
+        try (Cluster cluster = init(Cluster.build(1)
+                                           .withDataDirCount(1)
+                                           .withConfig(config -> config.set(ENABLE_UUID_FIELD_NAME, false))
+                                           .start()))
+        {
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl", null));
+            createSSTables(cluster.get(1), KEYSPACE, "tbl", 1, 2);
+            assertSSTablesCount(cluster.get(1), 2, 0, KEYSPACE, "tbl");
+            verfiySSTableActivity(cluster, true);
+
+            restartNode(cluster, 1, true);
+
+            createSSTables(cluster.get(1), KEYSPACE, "tbl", 3, 4);
+            assertSSTablesCount(cluster.get(1), 2, 2, KEYSPACE, "tbl");
+            verfiySSTableActivity(cluster, false);
+
+            checkRowsNumber(cluster.get(1), KEYSPACE, "tbl", 9);
+        }
+    }
+
+    /**
+     * This test verifies that we should not be able to start a node with uuid disabled when there are uuid sstables
+     */
+    @Test
+    public void testRestartWithUUIDDisabled() throws IOException
+    {
+        try (Cluster cluster = init(Cluster.build(1)
+                                           .withDataDirCount(1)
+                                           .withConfig(config -> config.set(ENABLE_UUID_FIELD_NAME, true))
+                                           .start()))
+        {
+            cluster.disableAutoCompaction(KEYSPACE);
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl", null));
+            createSSTables(cluster.get(1), KEYSPACE, "tbl", 1, 2);
+            assertSSTablesCount(cluster.get(1), 0, 2, KEYSPACE, "tbl");
+            verfiySSTableActivity(cluster, false);
+
+            Assertions.assertThatExceptionOfType(RuntimeException.class)
+                      .isThrownBy(() -> restartNode(cluster, 1, false))
+                      .withCauseInstanceOf(SystemExitException.class);
+        }
+    }
+
+    @Test
+    public final void testCompactionStrategiesWithMixedSSTables() throws Exception
+    {
+        testCompactionStrategiesWithMixedSSTables(SizeTieredCompactionStrategy.class,
+                                                  DateTieredCompactionStrategy.class,
+                                                  TimeWindowCompactionStrategy.class,
+                                                  LeveledCompactionStrategy.class);
+    }
+
+    /**
+     * The purpose of this test is to verify that we can compact using the given strategy the mix of sstables created
+     * with sequential id and with uuid. Then we verify whether the number results matches the number of rows which we
+     * would get by merging data from the initial sstables.
+     */
+    @SafeVarargs
+    private final void testCompactionStrategiesWithMixedSSTables(final Class<? extends AbstractCompactionStrategy>... compactionStrategyClasses) throws Exception
+    {
+        try (Cluster cluster = init(Cluster.build(1)
+                                           .withDataDirCount(1)
+                                           .withConfig(config -> config.set(ENABLE_UUID_FIELD_NAME, false))
+                                           .start()))
+        {
+            // create a table and two sstables with sequential id for each strategy, the sstables will contain overlapping partitions
+            for (Class<? extends AbstractCompactionStrategy> compactionStrategyClass : compactionStrategyClasses)
+            {
+                String tableName = "tbl_" + compactionStrategyClass.getSimpleName().toLowerCase();
+                cluster.schemaChange(createTableStmt(KEYSPACE, tableName, compactionStrategyClass));
+
+                createSSTables(cluster.get(1), KEYSPACE, tableName, 1, 2);
+                assertSSTablesCount(cluster.get(1), 2, 0, KEYSPACE, tableName);
+            }
+
+            // restart the node with uuid enabled
+            restartNode(cluster, 1, true);
+
+            // create another two sstables with uuid for each previously created table
+            for (Class<? extends AbstractCompactionStrategy> compactionStrategyClass : compactionStrategyClasses)
+            {
+                String tableName = "tbl_" + compactionStrategyClass.getSimpleName().toLowerCase();
+
+                createSSTables(cluster.get(1), KEYSPACE, tableName, 3, 4);
+
+                // expect to have a mix of sstables with sequential id and uuid
+                assertSSTablesCount(cluster.get(1), 2, 2, KEYSPACE, tableName);
+
+                // after compaction, we expect to have a single sstable with uuid
+                cluster.get(1).forceCompact(KEYSPACE, tableName);
+                assertSSTablesCount(cluster.get(1), 0, 1, KEYSPACE, tableName);
+
+                // verify the number of rows
+                checkRowsNumber(cluster.get(1), KEYSPACE, tableName, 9);
+            }
+        }
+    }
+
+    @Test
+    public void testStreamingToNodeWithUUIDEnabled() throws Exception
+    {
+        testStreaming(true);
+    }
+
+    @Test
+    public void testStreamingToNodeWithUUIDDisabled() throws Exception
+    {
+        testStreaming(false);
+    }
+
+    /**
+     * The purpose of this test case is to verify the scenario when we need to stream mixed UUID and seq sstables to
+     * a node which have: 1) UUID disabled, and 2) UUID enabled; then verify that we can read all the data properly
+     * from that node alone.
+     */
+    private void testStreaming(boolean uuidEnabledOnTargetNode) throws Exception
+    {
+        // start both nodes with uuid disabled
+        try (Cluster cluster = init(Cluster.build(2)
+                                           .withDataDirCount(1)
+                                           .withConfig(config -> config.set(ENABLE_UUID_FIELD_NAME, false).with(Feature.NETWORK))
+                                           .start()))
+        {
+            // create an empty table and shutdown nodes 2, 3
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl", null));
+            waitOn(cluster.get(2).shutdown());
+
+            // create 2 sstables with overlapping partitions on node 1 (with seq ids)
+            createSSTables(cluster.get(1), KEYSPACE, "tbl", 1, 2);
+
+            // restart node 1 with uuid enabled
+            restartNode(cluster, 1, true);
+
+            // create 2 sstables with overlapping partitions on node 1 (with UUID ids)
+            createSSTables(cluster.get(1), KEYSPACE, "tbl", 3, 4);
+
+            assertSSTablesCount(cluster.get(1), 2, 2, KEYSPACE, "tbl");
+
+            // now start node with UUID disabled and perform repair
+            cluster.get(2).config().set(ENABLE_UUID_FIELD_NAME, uuidEnabledOnTargetNode);
+            cluster.get(2).startup();
+
+            assertSSTablesCount(cluster.get(2), 0, 0, KEYSPACE, "tbl");
+
+            // at this point we have sstables with seq and uuid on nodes and no sstables on node
+            // when we run repair, we expect streaming all 4 sstables from node 1 to node 2
+
+            cluster.get(2).nodetool("repair", KEYSPACE);
+
+            if (uuidEnabledOnTargetNode)
+                assertSSTablesCount(cluster.get(2), 0, 4, KEYSPACE, "tbl");
+            else
+                assertSSTablesCount(cluster.get(2), 4, 0, KEYSPACE, "tbl");
+
+            waitOn(cluster.get(1).shutdown());
+
+            checkRowsNumber(cluster.get(2), KEYSPACE, "tbl", 9);
+        }
+    }
+
+    @Test
+    public void testSnapshot() throws Exception
+    {
+        File tmpDir = new File(Files.createTempDirectory("test"));
+        Set<String> seqOnlyBackupDirs;
+        Set<String> seqAndUUIDBackupDirs;
+        Set<String> uuidOnlyBackupDirs;
+        try (Cluster cluster = init(Cluster.build(1)
+                                           .withDataDirCount(1)
+                                           .withConfig(config -> config.with(Feature.NETWORK)
+                                                                       .set("incremental_backups", true)
+                                                                       .set("snapshot_before_compaction", false)
+                                                                       .set("auto_snapshot", false)
+                                                                       .set(ENABLE_UUID_FIELD_NAME, false))
+                                           .start()))
+        {
+            // create the tables
+
+            cluster.schemaChange("CREATE KEYSPACE new_ks WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};");
+
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl_seq_only", null));
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl_seq_and_uuid", null));
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl_uuid_only", null));
+            cluster.schemaChange(createTableStmt("new_ks", "tbl_seq_only", null));
+            cluster.schemaChange(createTableStmt("new_ks", "tbl_seq_and_uuid", null));
+            cluster.schemaChange(createTableStmt("new_ks", "tbl_uuid_only", null));
+
+            // creating sstables
+            createSSTables(cluster.get(1), KEYSPACE, "tbl_seq_only", 1, 2, 3, 4);
+            createSSTables(cluster.get(1), KEYSPACE, "tbl_seq_and_uuid", 1, 2);
+            createSSTables(cluster.get(1), "new_ks", "tbl_seq_only", 5, 6, 7, 8);
+            createSSTables(cluster.get(1), "new_ks", "tbl_seq_and_uuid", 5, 6);
+
+            restartNode(cluster, 1, true);
+
+            createSSTables(cluster.get(1), KEYSPACE, "tbl_seq_and_uuid", 3, 4);
+            createSSTables(cluster.get(1), KEYSPACE, "tbl_uuid_only", 1, 2, 3, 4);
+            createSSTables(cluster.get(1), "new_ks", "tbl_seq_and_uuid", 7, 8);
+            createSSTables(cluster.get(1), "new_ks", "tbl_uuid_only", 5, 6, 7, 8);
+
+            Set<String> seqOnlySnapshotDirs = snapshot(cluster.get(1), KEYSPACE, "tbl_seq_only");
+            Set<String> seqAndUUIDSnapshotDirs = snapshot(cluster.get(1), KEYSPACE, "tbl_seq_and_uuid");
+            Set<String> uuidOnlySnapshotDirs = snapshot(cluster.get(1), KEYSPACE, "tbl_uuid_only");
+
+            seqOnlyBackupDirs = getBackupDirs(cluster.get(1), KEYSPACE, "tbl_seq_only");
+            seqAndUUIDBackupDirs = getBackupDirs(cluster.get(1), KEYSPACE, "tbl_seq_and_uuid");
+            uuidOnlyBackupDirs = getBackupDirs(cluster.get(1), KEYSPACE, "tbl_uuid_only");
+
+            // at this point, we should have sstables with backups and snapshots for all tables
+            assertSSTablesCount(cluster.get(1), 4, 0, KEYSPACE, "tbl_seq_only");
+            assertSSTablesCount(cluster.get(1), 2, 2, KEYSPACE, "tbl_seq_and_uuid");
+            assertSSTablesCount(cluster.get(1), 0, 4, KEYSPACE, "tbl_uuid_only");
+
+            assertBackupSSTablesCount(cluster.get(1), 4, 0, KEYSPACE, "tbl_seq_only");
+            assertBackupSSTablesCount(cluster.get(1), 2, 2, KEYSPACE, "tbl_seq_and_uuid");
+            assertBackupSSTablesCount(cluster.get(1), 0, 4, KEYSPACE, "tbl_uuid_only");
+
+            assertSnapshotSSTablesCount(cluster.get(1), 4, 0, KEYSPACE, "tbl_seq_only");
+            assertSnapshotSSTablesCount(cluster.get(1), 2, 2, KEYSPACE, "tbl_seq_and_uuid");
+            assertSnapshotSSTablesCount(cluster.get(1), 0, 4, KEYSPACE, "tbl_uuid_only");
+
+            checkRowsNumber(cluster.get(1), KEYSPACE, "tbl_seq_only", 9);
+            checkRowsNumber(cluster.get(1), KEYSPACE, "tbl_seq_and_uuid", 9);
+            checkRowsNumber(cluster.get(1), KEYSPACE, "tbl_uuid_only", 9);
+
+            // truncate the first set of tables
+            truncateAndAssertEmpty(cluster.get(1), KEYSPACE, "tbl_seq_only", "tbl_seq_and_uuid", "tbl_uuid_only");
+
+            restore(cluster.get(1), seqOnlySnapshotDirs, "tbl_seq_only", 9);
+            restore(cluster.get(1), seqAndUUIDSnapshotDirs, "tbl_seq_and_uuid", 9);
+            restore(cluster.get(1), uuidOnlySnapshotDirs, "tbl_uuid_only", 9);
+
+            truncateAndAssertEmpty(cluster.get(1), KEYSPACE, "tbl_seq_only", "tbl_seq_and_uuid", "tbl_uuid_only");
+
+            restore(cluster.get(1), seqOnlyBackupDirs, "tbl_seq_only", 9);
+            restore(cluster.get(1), seqAndUUIDBackupDirs, "tbl_seq_and_uuid", 9);
+            restore(cluster.get(1), uuidOnlyBackupDirs, "tbl_uuid_only", 9);
+
+            ImmutableSet<String> allBackupDirs = ImmutableSet.<String>builder().addAll(seqOnlyBackupDirs).addAll(seqAndUUIDBackupDirs).addAll(uuidOnlyBackupDirs).build();
+            cluster.get(1).runOnInstance(rethrow(() -> allBackupDirs.forEach(dir -> bulkLoadSSTables(new File(dir), "new_ks"))));
+
+            checkRowsNumber(cluster.get(1), "new_ks", "tbl_seq_only", 17);
+            checkRowsNumber(cluster.get(1), "new_ks", "tbl_seq_and_uuid", 17);
+            checkRowsNumber(cluster.get(1), "new_ks", "tbl_uuid_only", 17);
+
+
+            for (String dir : allBackupDirs)
+            {
+                File src = new File(dir);
+                File dest = relativizePath(tmpDir, src, 3);
+                Files.createDirectories(dest.parent().toPath());
+                FileUtils.moveDirectory(src.toJavaIOFile(), dest.toJavaIOFile());
+            }
+        }
+
+        try (Cluster cluster = init(Cluster.build(1)
+                                           .withDataDirCount(1)
+                                           .withConfig(config -> config.with(Feature.NETWORK, Feature.NATIVE_PROTOCOL)
+                                                                       .set("incremental_backups", true)
+                                                                       .set("snapshot_before_compaction", false)
+                                                                       .set("auto_snapshot", false)
+                                                                       .set(ENABLE_UUID_FIELD_NAME, false))
+                                           .start()))
+        {
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl_seq_only", null));
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl_seq_and_uuid", null));
+            cluster.schemaChange(createTableStmt(KEYSPACE, "tbl_uuid_only", null));
+
+            Function<String, String> relativeToTmpDir = d -> relativizePath(tmpDir, new File(d), 3).toString();
+            restore(cluster.get(1), seqOnlyBackupDirs.stream().map(relativeToTmpDir).collect(Collectors.toSet()), "tbl_seq_only", 9);
+            restore(cluster.get(1), seqAndUUIDBackupDirs.stream().map(relativeToTmpDir).collect(Collectors.toSet()), "tbl_seq_and_uuid", 9);
+            restore(cluster.get(1), uuidOnlyBackupDirs.stream().map(relativeToTmpDir).collect(Collectors.toSet()), "tbl_uuid_only", 9);
+        }
+    }
+
+    private static void restore(IInvokableInstance instance, Set<String> dirs, String targetTableName, int expectedRowsNum)
+    {
+        List<String> failedImports = instance.callOnInstance(() -> ColumnFamilyStore.getIfExists(KEYSPACE, targetTableName)
+                                                                                    .importNewSSTables(dirs, false, false, true, true, true, true, true));
+        assertThat(failedImports).isEmpty();
+        checkRowsNumber(instance, KEYSPACE, targetTableName, expectedRowsNum);
+    }
+
+    private static void truncateAndAssertEmpty(IInvokableInstance instance, String ks, String... tableNames)
+    {
+        for (String tableName : tableNames)
+        {
+            instance.executeInternal(format("TRUNCATE %s.%s", ks, tableName));
+            assertSSTablesCount(instance, 0, 0, ks, tableName);
+            checkRowsNumber(instance, ks, tableName, 0);
+        }
+    }
+
+    private static Set<String> snapshot(IInvokableInstance instance, String ks, String tableName)
+    {
+        Set<String> snapshotDirs = instance.callOnInstance(() -> ColumnFamilyStore.getIfExists(ks, tableName)
+                                                                                  .snapshot(SNAPSHOT_TAG)
+                                                                                  .getDirectories()
+                                                                                  .stream()
+                                                                                  .map(File::toString)
+                                                                                  .collect(Collectors.toSet()));
+        assertThat(snapshotDirs).isNotEmpty();
+        return snapshotDirs;
+    }
+
+    private static String createTableStmt(String ks, String name, Class<? extends AbstractCompactionStrategy> compactionStrategy)
+    {
+        if (compactionStrategy == null)
+            compactionStrategy = SizeTieredCompactionStrategy.class;
+        return format("CREATE TABLE %s.%s (pk int, ck int, v int, PRIMARY KEY (pk, ck)) " +
+                      "WITH compaction = {'class':'%s', 'enabled':'false'}",
+                      ks, name, compactionStrategy.getCanonicalName());
+    }
+
+    private void createSSTables(IInstance instance, String ks, String tableName, int... records)
+    {
+        String insert = format("INSERT INTO %s.%s (pk, ck, v) VALUES (?, ?, ?)", ks, tableName);
+        for (int record : records)
+        {
+            instance.executeInternal(insert, record, record, ++v);
+            instance.executeInternal(insert, record, record + 1, ++v);
+            instance.executeInternal(insert, record + 1, record + 1, ++v);
+            instance.flush(ks);
+        }
+    }
+
+    private static void assertSSTablesCount(Set<Descriptor> descs, String tableName, int expectedSeqGenIds, int expectedUUIDGenIds)
+    {
+        List<String> seqSSTables = descs.stream().filter(desc -> desc.id instanceof SequenceBasedSSTableId).map(Descriptor::baseFilename).sorted().collect(Collectors.toList());
+        List<String> uuidSSTables = descs.stream().filter(desc -> desc.id instanceof UUIDBasedSSTableId).map(Descriptor::baseFilename).sorted().collect(Collectors.toList());
+        assertThat(seqSSTables).describedAs("SSTables of %s with sequence based id", tableName).hasSize(expectedSeqGenIds);
+        assertThat(uuidSSTables).describedAs("SSTables of %s with UUID based id", tableName).hasSize(expectedUUIDGenIds);
+    }
+
+    private static void assertSSTablesCount(IInvokableInstance instance, int expectedSeqGenIds, int expectedUUIDGenIds, String ks, String... tableNames)
+    {
+        instance.runOnInstance(rethrow(() -> Arrays.stream(tableNames).forEach(tableName -> assertSSTablesCount(getSSTables(ks, tableName), tableName, expectedSeqGenIds, expectedUUIDGenIds))));
+    }
+
+    private static void assertSnapshotSSTablesCount(IInvokableInstance instance, int expectedSeqGenIds, int expectedUUIDGenIds, String ks, String... tableNames)
+    {
+        instance.runOnInstance(rethrow(() -> Arrays.stream(tableNames).forEach(tableName -> assertSSTablesCount(getSnapshots(ks, tableName, SNAPSHOT_TAG), tableName, expectedSeqGenIds, expectedUUIDGenIds))));
+    }
+
+    private static void assertBackupSSTablesCount(IInvokableInstance instance, int expectedSeqGenIds, int expectedUUIDGenIds, String ks, String... tableNames)
+    {
+        instance.runOnInstance(rethrow(() -> Arrays.stream(tableNames).forEach(tableName -> assertSSTablesCount(getBackups(ks, tableName), tableName, expectedSeqGenIds, expectedUUIDGenIds))));
+    }
+
+    private static Set<String> getBackupDirs(IInvokableInstance instance, String ks, String tableName)
+    {
+        return instance.callOnInstance(() -> getBackups(ks, tableName).stream()
+                                                                      .map(d -> d.directory)
+                                                                      .map(File::toString)
+                                                                      .collect(Collectors.toSet()));
+    }
+
+    private static void verfiySSTableActivity(Cluster cluster, boolean expectLegacyTableIsPopulated)
+    {
+        cluster.get(1).runOnInstance(() -> {
+            RestorableMeter meter = new RestorableMeter(15, 120);
+            SequenceBasedSSTableId seqGenId = new SequenceBasedSSTableId(1);
+            SystemKeyspace.persistSSTableReadMeter("ks", "tab", seqGenId, meter);
+            assertThat(SystemKeyspace.getSSTableReadMeter("ks", "tab", seqGenId)).matches(m -> m.fifteenMinuteRate() == meter.fifteenMinuteRate()
+                                                                                               && m.twoHourRate() == meter.twoHourRate());
+
+            checkSSTableActivityRow(SSTABLE_ACTIVITY_V2, seqGenId.toString(), true);
+            if (expectLegacyTableIsPopulated)
+                checkSSTableActivityRow(LEGACY_SSTABLE_ACTIVITY, seqGenId.generation, true);
+
+            SystemKeyspace.clearSSTableReadMeter("ks", "tab", seqGenId);
+
+            checkSSTableActivityRow(SSTABLE_ACTIVITY_V2, seqGenId.toString(), false);
+            if (expectLegacyTableIsPopulated)
+                checkSSTableActivityRow(LEGACY_SSTABLE_ACTIVITY, seqGenId.generation, false);
+
+            UUIDBasedSSTableId uuidGenId = new UUIDBasedSSTableId(TimeUUID.Generator.nextTimeUUID());
+            SystemKeyspace.persistSSTableReadMeter("ks", "tab", uuidGenId, meter);
+            assertThat(SystemKeyspace.getSSTableReadMeter("ks", "tab", uuidGenId)).matches(m -> m.fifteenMinuteRate() == meter.fifteenMinuteRate()
+                                                                                                && m.twoHourRate() == meter.twoHourRate());
+
+            checkSSTableActivityRow(SSTABLE_ACTIVITY_V2, uuidGenId.toString(), true);
+
+            SystemKeyspace.clearSSTableReadMeter("ks", "tab", uuidGenId);
+
+            checkSSTableActivityRow(SSTABLE_ACTIVITY_V2, uuidGenId.toString(), false);
+        });
+    }
+
+    private static void checkSSTableActivityRow(String table, Object genId, boolean expectExists)
+    {
+        String tableColName = SSTABLE_ACTIVITY_V2.equals(table) ? "table_name" : "columnfamily_name";
+        String idColName = SSTABLE_ACTIVITY_V2.equals(table) ? "id" : "generation";
+        String cql = "SELECT rate_15m, rate_120m FROM system.%s WHERE keyspace_name=? and %s=? and %s=?";
+        UntypedResultSet results = executeInternal(format(cql, table, tableColName, idColName), "ks", "tab", genId);
+        assertThat(results).isNotNull();
+
+        if (expectExists)
+        {
+            assertThat(results.isEmpty()).isFalse();
+            UntypedResultSet.Row row = results.one();
+            assertThat(row.getDouble("rate_15m")).isEqualTo(15d, Offset.offset(0.001d));
+            assertThat(row.getDouble("rate_120m")).isEqualTo(120d, Offset.offset(0.001d));
+        }
+        else
+        {
+            assertThat(results.isEmpty()).isTrue();
+        }
+    }
+
+    private static void restartNode(Cluster cluster, int node, boolean uuidEnabled)
+    {
+        waitOn(cluster.get(node).shutdown());
+        cluster.get(node).config().set(ENABLE_UUID_FIELD_NAME, uuidEnabled);
+        cluster.get(node).startup();
+    }
+
+    private static void checkRowsNumber(IInstance instance, String ks, String tableName, int expectedNumber)
+    {
+        SimpleQueryResult result = instance.executeInternalWithResult(format("SELECT * FROM %s.%s", ks, tableName));
+        Object[][] rows = result.toObjectArrays();
+        assertThat(rows).withFailMessage("Invalid results for %s.%s - should have %d rows but has %d: \n%s", ks, tableName, expectedNumber,
+                                         rows.length, result.toString()).hasSize(expectedNumber);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java b/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java
index c9b6c62..00834ba 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/SSTableLoaderEncryptionOptionsTest.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.distributed.test;
 
 import java.io.IOException;
-import java.io.File;
 import java.util.Collections;
 import java.util.List;
 
@@ -30,9 +29,11 @@
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.tools.BulkLoader;
 import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.service.StorageService;
@@ -41,6 +42,7 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
+import static com.google.common.collect.Lists.transform;
 import static org.apache.cassandra.distributed.test.ExecUtil.rethrow;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
 import static org.apache.cassandra.distributed.shared.AssertUtils.row;
@@ -96,7 +98,7 @@
                                                             "--truststore", validTrustStorePath,
                                                             "--truststore-password", validTrustStorePassword,
                                                             "--conf-path", "test/conf/sstableloader_with_encryption.yaml",
-                                                            sstables_to_upload.getAbsolutePath());
+                                                            sstables_to_upload.absolutePath());
         tool.assertOnCleanExit();
         assertTrue(tool.getStdout().contains("Summary statistics"));
         assertRows(CLUSTER.get(1).executeInternal("SELECT count(*) FROM ssl_upload_tables.test"), row(42L));
@@ -116,7 +118,7 @@
                                                             "--truststore", validTrustStorePath,
                                                             "--truststore-password", validTrustStorePassword,
                                                             "--conf-path", "test/conf/sstableloader_with_encryption.yaml",
-                                                            sstables_to_upload.getAbsolutePath());
+                                                            sstables_to_upload.absolutePath());
         tool.assertOnCleanExit();
         assertTrue(tool.getStdout().contains("Summary statistics"));
         assertTrue(tool.getStdout().contains("ssl storage port is deprecated and not used"));
@@ -156,7 +158,8 @@
         {
             CLUSTER.get(1).executeInternal(String.format("INSERT INTO ssl_upload_tables.test (pk, val) VALUES (%s, '%s')", i, i));
         }
-        CLUSTER.get(1).runOnInstance(rethrow(() -> StorageService.instance.forceKeyspaceFlush("ssl_upload_tables")));
+        CLUSTER.get(1).runOnInstance(rethrow(() -> StorageService.instance.forceKeyspaceFlush("ssl_upload_tables",
+                                                                                              ColumnFamilyStore.FlushReason.UNIT_TESTS)));
     }
 
     private static void truncateGeneratedTables() throws IOException
@@ -167,16 +170,18 @@
     private static File copySstablesFromDataDir(String table) throws IOException
     {
         File cfDir = new File("build/test/cassandra/ssl_upload_tables", table);
-        cfDir.mkdirs();
-        List<File> keyspace_dirs = CLUSTER.get(1).callOnInstance(() -> Keyspace.open("ssl_upload_tables").getColumnFamilyStore(table).getDirectories().getCFDirectories());
-        for (File srcDir : keyspace_dirs)
+        cfDir.tryCreateDirectories();
+        // Get paths as Strings, because org.apache.cassandra.io.util.File in the dtest
+        // node is loaded by org.apache.cassandra.distributed.shared.InstanceClassLoader.
+        List<String> keyspace_dir_paths = CLUSTER.get(1).callOnInstance(() -> {
+            List<File> cfDirs = Keyspace.open("ssl_upload_tables").getColumnFamilyStore(table).getDirectories().getCFDirectories();
+            return transform(cfDirs, (d) -> d.absolutePath());
+        });
+        for (File srcDir : transform(keyspace_dir_paths, (p) -> new File(p)))
         {
-            for (File file : srcDir.listFiles())
+            for (File file : srcDir.tryList((file) -> file.isFile()))
             {
-                if (file.isFile())
-                {
-                    FileUtils.copyFileToDirectory(file, cfDir);
-                }
+                FileUtils.copyFileToDirectory(file.toJavaIOFile(), cfDir.toJavaIOFile());
             }
         }
         return cfDir;
diff --git a/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java b/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java
index bc5ccbe..142b66b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/SchemaTest.java
@@ -18,27 +18,35 @@
 
 package org.apache.cassandra.distributed.test;
 
+import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
-import com.google.common.util.concurrent.Uninterruptibles;
 import org.junit.Test;
 
 import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableCallable;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.assertj.core.api.Assertions;
 import org.awaitility.Awaitility;
+import org.awaitility.core.ConditionFactory;
 
-import static java.time.Duration.ofMillis;
 import static java.time.Duration.ofSeconds;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 public class SchemaTest extends TestBaseImpl
 {
+    public static final String TABLE_ONE = "tbl_one";
+    public static final String TABLE_TWO = "tbl_two";
+
     @Test
     public void readRepair() throws Throwable
     {
@@ -91,7 +99,7 @@
             Throwable cause = e;
             while (cause != null)
             {
-                if (cause.getMessage() != null && cause.getMessage().contains("Unknown column "+name+" during deserialization"))
+                if (cause.getMessage() != null && cause.getMessage().contains("Unknown column " + name + " during deserialization"))
                     causeIsUnknownColumn = true;
                 cause = cause.getCause();
             }
@@ -99,58 +107,94 @@
         }
     }
 
+    /**
+     * The purpose of this test is to verify manual schema reset functinality.
+     * <p>
+     * There is a 2-node cluster and a TABLE_ONE created. The schema version is agreed on both nodes. Then the 2nd node
+     * is shutdown. We introduce a disagreement by dropping TABLE_ONE and creating TABLE_TWO on the 1st node. Therefore,
+     * the 1st node has a newer schema version with TABLE_TWO, while the shutdown 2nd node has older schema version with
+     * TABLE_ONE.
+     * <p>
+     * At this point, if we just started the 2nd node, it would sync its schema by getting fresh mutations from the 1st
+     * node which would result in both nodes having only the definition of TABLE_TWO.
+     * <p>
+     * However, before starting the 2nd node the schema is reset on the 1st node, so the 1st node will discard its local
+     * schema whenever it manages to fetch a schema definition from some other node (the 2nd node in this case).
+     * It is expected to end up with both nodes having only the definition of TABLE_ONE.
+     * <p>
+     * In the second phase of the test we simply break the schema on the 1st node and call reset to fetch the schema
+     * definition it from the 2nd node.
+     */
     @Test
     public void schemaReset() throws Throwable
     {
-        int delayUnit = 1000;
-        CassandraRelevantProperties.MIGRATION_DELAY.setInt(5 * delayUnit);
-        CassandraRelevantProperties.SCHEMA_PULL_INTERVAL_MS.setInt(5 * delayUnit);
-        CassandraRelevantProperties.SCHEMA_PULL_BACKOFF_DELAY_MS.setInt(delayUnit);
-
+        CassandraRelevantProperties.MIGRATION_DELAY.setLong(10000);
+        CassandraRelevantProperties.SCHEMA_PULL_INTERVAL_MS.setLong(10000);
         try (Cluster cluster = init(Cluster.build(2).withConfig(cfg -> cfg.with(Feature.GOSSIP, Feature.NETWORK)).start()))
         {
-            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk INT PRIMARY KEY, v TEXT)");
+            // create TABLE_ONE and make sure it is propagated
+            cluster.schemaChange(String.format("CREATE TABLE %s.%s (pk INT PRIMARY KEY, v TEXT)", KEYSPACE, TABLE_ONE));
+            assertTrue(checkTablesPropagated(cluster.get(1), true, false));
+            assertTrue(checkTablesPropagated(cluster.get(2), true, false));
 
-            assertTrue(cluster.get(1).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
-            assertTrue(cluster.get(2).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
-
+            // shutdown the 2nd node and make sure that the 1st does not see it any longer as alive
             cluster.get(2).shutdown().get();
+            await(30).until(() -> cluster.get(1).callOnInstance(() -> {
+                return Gossiper.instance.getLiveMembers()
+                                        .stream()
+                                        .allMatch(e -> e.equals(getBroadcastAddressAndPort()));
+            }));
 
-            Awaitility.await()
-                      .atMost(ofSeconds(30))
-                      .until(() -> cluster
-                                   .get(1)
-                                   .callOnInstance(() -> Gossiper.instance
-                                                         .getLiveMembers()
-                                                         .stream()
-                                                         .allMatch(addr -> addr.equals(FBUtilities.getBroadcastAddressAndPort()))));
+            // when there is no node to fetch the schema from, reset local schema should immediately fail
+            Assertions.assertThatExceptionOfType(RuntimeException.class).isThrownBy(() -> {
+                cluster.get(1).runOnInstance(() -> Schema.instance.resetLocalSchema());
+            }).withMessageContaining("Cannot reset local schema when there are no other live nodes");
 
-            // when schema is removed and there is no other node to fetch it from, node 1 should be left with clean schema
-            //noinspection Convert2MethodRef
-            cluster.get(1).runOnInstance(() -> StorageService.instance.resetLocalSchema());
-            assertTrue(cluster.get(1).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") == null));
+            // now, let's make a disagreement, the shutdown node 2 has a definition of TABLE_ONE, while the running
+            // node 1 will have a definition of TABLE_TWO
+            cluster.coordinator(1).execute(String.format("DROP TABLE %s.%s", KEYSPACE, TABLE_ONE), ConsistencyLevel.ONE);
+            cluster.coordinator(1).execute(String.format("CREATE TABLE %s.%s (pk INT PRIMARY KEY, v TEXT)", KEYSPACE, TABLE_TWO), ConsistencyLevel.ONE);
+            await(30).until(() -> checkTablesPropagated(cluster.get(1), false, true));
 
-            // sleep slightly longer than the schema pull interval
-            Uninterruptibles.sleepUninterruptibly(6 * delayUnit, TimeUnit.MILLISECONDS);
+            // Schema.resetLocalSchema is guarded by some conditions which would not let us reset schema if there is no
+            // live node in the cluster, therefore we simply call SchemaUpdateHandler.clear (this is the only real thing
+            // being done by Schema.resetLocalSchema under the hood)
+            SerializableCallable<Boolean> clear = () -> Schema.instance.updateHandler.clear().awaitUninterruptibly(1, TimeUnit.MINUTES);
+            Future<Boolean> clear1 = cluster.get(1).asyncCallsOnInstance(clear).call();
+            assertFalse(clear1.isDone());
 
-            // when the other node is started, schema should be back in sync - node 2 should send schema mutations to node 1
+            // when the 2nd node is started, schema should be back in sync
             cluster.get(2).startup();
+            await(30).until(() -> clear1.isDone() && clear1.get());
 
-            // sleep slightly longer than the schema pull interval
-            Uninterruptibles.sleepUninterruptibly(6 * delayUnit, TimeUnit.MILLISECONDS);
+            // this proves that reset schema works on the 1st node - the most recent change should be discarded because
+            // it receives the schema from the 2nd node and applies it on empty schema
+            await(60).until(() -> checkTablesPropagated(cluster.get(1), true, false));
 
-            Awaitility.waitAtMost(ofMillis(6 * delayUnit))
-                      .pollDelay(ofSeconds(1))
-                      .until(() -> cluster.get(1).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
+            // now let's break schema locally and let it be reset
+            cluster.get(1).runOnInstance(() -> Schema.instance.getLocalKeyspaces()
+                                                              .get(SchemaConstants.SCHEMA_KEYSPACE_NAME)
+                                                              .get().tables.forEach(t -> ColumnFamilyStore.getIfExists(t.keyspace, t.name).truncateBlockingWithoutSnapshot()));
 
-            // when schema is removed and there is a node to fetch it from, node 1 should immediately restore the schema
-            //noinspection Convert2MethodRef
-            cluster.get(2).runOnInstance(() -> StorageService.instance.resetLocalSchema());
-
-            Awaitility.waitAtMost(ofMillis(6 * delayUnit))
-                      .pollDelay(ofSeconds(1))
-                      .until(() -> cluster.get(2).callOnInstance(() -> Schema.instance.getTableMetadata(KEYSPACE, "tbl") != null));
+            // when schema is removed and there is a node to fetch it from, the 1st node should immediately restore it
+            cluster.get(1).runOnInstance(() -> Schema.instance.resetLocalSchema());
+            // note that we should not wait for this to be true because resetLocalSchema is blocking
+            // and after successfully completing it, the schema should be already back in sync
+            assertTrue(checkTablesPropagated(cluster.get(1), true, false));
+            assertTrue(checkTablesPropagated(cluster.get(2), true, false));
         }
     }
 
+    private static ConditionFactory await(int seconds)
+    {
+        return Awaitility.await().atMost(ofSeconds(seconds)).pollDelay(ofSeconds(1));
+    }
+
+    private static boolean checkTablesPropagated(IInvokableInstance instance, boolean one, boolean two)
+    {
+        return instance.callOnInstance(() -> {
+            return (Schema.instance.getTableMetadata(KEYSPACE, TABLE_ONE) != null ^ !one)
+                   && (Schema.instance.getTableMetadata(KEYSPACE, TABLE_TWO) != null ^ !two);
+        });
+    }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/SecondaryIndexTest.java b/test/distributed/org/apache/cassandra/distributed/test/SecondaryIndexTest.java
new file mode 100644
index 0000000..3b55dcf
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/SecondaryIndexTest.java
@@ -0,0 +1,125 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import org.awaitility.Awaitility;
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.utils.TimeUUID;
+
+public class SecondaryIndexTest extends TestBaseImpl
+{
+    private static final int NUM_NODES = 3;
+    private static final int REPLICATION_FACTOR = 1;
+    private static final String CREATE_TABLE = "CREATE TABLE %s(k int, v int, PRIMARY KEY (k))";
+    private static final String CREATE_INDEX = "CREATE INDEX v_index_%d ON %s(v)";
+
+    private static final AtomicInteger seq = new AtomicInteger();
+    
+    private static String tableName;
+    private static Cluster cluster;
+
+    @BeforeClass
+    public static void setupCluster() throws IOException
+    {
+        cluster = init(Cluster.build(NUM_NODES).start(), REPLICATION_FACTOR);
+    }
+
+    @AfterClass
+    public static void teardownCluster()
+    {
+        if (cluster != null)
+            cluster.close();
+    }
+
+    @Before
+    public void before()
+    {
+        tableName = String.format("%s.t_%d", KEYSPACE, seq.getAndIncrement());
+        cluster.schemaChange(String.format(CREATE_TABLE, tableName));
+        cluster.schemaChange(String.format(CREATE_INDEX, seq.get(), tableName));
+    }
+
+    @After
+    public void after()
+    {
+        cluster.schemaChange(String.format("DROP TABLE %s", tableName));
+    }
+
+    @Test
+    public void test_only_coordinator_chooses_index_for_query()
+    {
+        for (int i = 0 ; i < 99 ; ++i)
+            cluster.coordinator(1).execute(String.format("INSERT INTO %s (k, v) VALUES (?, ?)", tableName), ConsistencyLevel.ALL, i, i/3);
+        cluster.forEach(i -> i.flush(KEYSPACE));
+
+        Pattern indexScanningPattern =
+                Pattern.compile(String.format("Index mean cardinalities are v_index_%d:[0-9]+. Scanning with v_index_%d.", seq.get(), seq.get()));
+
+        for (int i = 0 ; i < 33; ++i)
+        {
+            UUID trace = TimeUUID.Generator.nextTimeUUID().asUUID();
+            Object[][] result = cluster.coordinator(1).executeWithTracing(trace, String.format("SELECT * FROM %s WHERE v = ?", tableName), ConsistencyLevel.ALL, i);
+            Assert.assertEquals("Failed on iteration " + i, 3, result.length);
+
+            Awaitility.await("For all events in the tracing session to persist")
+                    .pollInterval(100, TimeUnit.MILLISECONDS)
+                    .atMost(10, TimeUnit.SECONDS)
+                    .untilAsserted(() -> 
+                                   {
+                                       Object[][] traces = cluster.coordinator(1)
+                                                                  .execute("SELECT source, activity FROM system_traces.events WHERE session_id = ?", 
+                                                                           ConsistencyLevel.ALL, trace);
+
+                                       List<InetAddress> scanning =
+                                               Arrays.stream(traces)
+                                                     .filter(t -> indexScanningPattern.matcher(t[1].toString()).matches())
+                                                     .map(t -> (InetAddress) t[0])
+                                                     .distinct().collect(Collectors.toList());
+
+                                       List<InetAddress> executing =
+                                               Arrays.stream(traces)
+                                                     .filter(t -> t[1].toString().equals(String.format("Executing read on " + tableName + " using index v_index_%d", seq.get())))
+                                                     .map(t -> (InetAddress) t[0])
+                                                     .distinct().collect(Collectors.toList());
+
+                                       Assert.assertEquals(Collections.singletonList(cluster.get(1).broadcastAddress().getAddress()), scanning);
+                                       Assert.assertEquals(3, executing.size());
+                                   });
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ShortReadProtectionTest.java b/test/distributed/org/apache/cassandra/distributed/test/ShortReadProtectionTest.java
index 69b074f..2e26659 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ShortReadProtectionTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ShortReadProtectionTest.java
@@ -544,4 +544,4 @@
             cluster.schemaChange(format("DROP TABLE IF EXISTS %s"));
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/SnapshotsTest.java b/test/distributed/org/apache/cassandra/distributed/test/SnapshotsTest.java
new file mode 100644
index 0000000..8ba3a90
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/SnapshotsTest.java
@@ -0,0 +1,365 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+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;
+import org.apache.cassandra.distributed.api.NodeToolResult;
+import org.apache.cassandra.distributed.shared.WithProperties;
+import org.apache.cassandra.utils.Clock;
+
+import static java.lang.String.format;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.util.stream.Collectors.toList;
+import static org.apache.cassandra.distributed.shared.ClusterUtils.stopUnchecked;
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertEquals;
+
+public class SnapshotsTest extends TestBaseImpl
+{
+    public static final Integer SNAPSHOT_CLEANUP_PERIOD_SECONDS = 1;
+    public static final Integer FIVE_SECONDS = 5;
+    public static final Integer TEN_SECONDS = 10;
+    private static final WithProperties properties = new WithProperties();
+    private static Cluster cluster;
+
+    private final String[] exoticSnapshotNames = new String[] { "snapshot", "snapshots", "backup", "backups",
+                                                                "Snapshot", "Snapshots", "Backups", "Backup",
+                                                                "snapshot.with.dots-and-dashes"};
+
+    @BeforeClass
+    public static void before() throws IOException
+    {
+        properties.set(CassandraRelevantProperties.SNAPSHOT_CLEANUP_INITIAL_DELAY_SECONDS, 0);
+        properties.set(CassandraRelevantProperties.SNAPSHOT_CLEANUP_PERIOD_SECONDS, SNAPSHOT_CLEANUP_PERIOD_SECONDS);
+        properties.set(CassandraRelevantProperties.SNAPSHOT_MIN_ALLOWED_TTL_SECONDS, FIVE_SECONDS);
+        cluster = init(Cluster.build(1).start());
+    }
+
+    @After
+    public void clearAllSnapshots()
+    {
+        cluster.schemaChange(withKeyspace("DROP TABLE IF EXISTS %s.tbl;"));
+        cluster.get(1).nodetoolResult("clearsnapshot", "--all").asserts().success();
+        for (String tag : new String[] {"basic", "first", "second", "tag1"})
+            waitForSnapshotCleared(tag);
+        for (String tag : exoticSnapshotNames)
+            waitForSnapshot(tag, false, true);
+    }
+
+    @AfterClass
+    public static void after()
+    {
+        properties.close();
+        if (cluster != null)
+            cluster.close();
+    }
+
+    @Test
+    public void testSnapshotsCleanupByTTL()
+    {
+        cluster.get(1).nodetoolResult("snapshot", "--ttl", format("%ds", FIVE_SECONDS),
+                                      "-t", "basic").asserts().success();
+        waitForSnapshotPresent("basic");
+        waitForSnapshotCleared("basic");
+    }
+
+    @Test
+    public void testSnapshotCleanupAfterRestart() throws Exception
+    {
+        int TWENTY_SECONDS = 20; // longer TTL to allow snapshot to survive node restart
+        IInvokableInstance instance = cluster.get(1);
+
+        // Create snapshot and check exists
+        instance.nodetoolResult("snapshot", "--ttl", format("%ds", TWENTY_SECONDS),
+                                "-t", "basic").asserts().success();
+        waitForSnapshotPresent("basic");
+
+        // Restart node
+        long beforeStop = Clock.Global.currentTimeMillis();
+        stopUnchecked(instance);
+        instance.startup();
+        long afterStart = Clock.Global.currentTimeMillis();
+
+        // if stop & start of the node took more than 20 seconds
+        // we assume that the snapshot should be expired by now, so we wait until we do not see it
+        if (afterStart - beforeStop > 20_000)
+        {
+            waitForSnapshotCleared("basic");
+            return;
+        }
+        else
+        {
+            // Check snapshot still exists after restart
+            cluster.get(1).nodetoolResult("listsnapshots").asserts().stdoutContains("basic");
+        }
+
+        // Sleep for 2*TTL and then check snapshot is gone
+        Thread.sleep(TWENTY_SECONDS * 1000L);
+        waitForSnapshotCleared("basic");
+    }
+
+    @Test
+    public void testSnapshotInvalidArgument() throws Exception
+    {
+        IInvokableInstance instance = cluster.get(1);
+
+        instance.nodetoolResult("snapshot", "--ttl", format("%ds", 1), "-t", "basic")
+                .asserts()
+                .failure()
+                .stdoutContains(format("ttl for snapshot must be at least %d seconds", FIVE_SECONDS));
+
+        instance.nodetoolResult("snapshot", "--ttl", "invalid-ttl").asserts().failure();
+    }
+
+    @Test
+    public void testListingSnapshotsWithoutTTL()
+    {
+        // take snapshot without ttl
+        cluster.get(1).nodetoolResult("snapshot", "-t", "snapshot_without_ttl").asserts().success();
+
+        // take snapshot with ttl
+        cluster.get(1).nodetoolResult("snapshot", "--ttl",
+                                      format("%ds", 1000),
+                                      "-t", "snapshot_with_ttl").asserts().success();
+
+        // list snaphots without TTL
+        waitForSnapshot("snapshot_without_ttl", true, true);
+        waitForSnapshot("snapshot_with_ttl", false, true);
+
+        // list all snapshots
+        waitForSnapshotPresent("snapshot_without_ttl");
+        waitForSnapshotPresent("snapshot_with_ttl");
+    }
+
+    @Test
+    public void testManualSnapshotCleanup() {
+        // take snapshots with ttl
+        cluster.get(1).nodetoolResult("snapshot", "--ttl",
+                                      format("%ds", TEN_SECONDS),
+                                      "-t", "first").asserts().success();
+
+        cluster.get(1).nodetoolResult("snapshot", "--ttl",
+                                      format("%ds", TEN_SECONDS),
+                                      "-t", "second").asserts().success();
+
+        waitForSnapshotPresent("first");
+        waitForSnapshotPresent("second");
+
+        cluster.get(1).nodetoolResult("clearsnapshot", "-t", "first").asserts().success();
+
+        waitForSnapshotCleared("first");
+        waitForSnapshotPresent("second");
+
+        // wait for the second snapshot to be removed as well
+        waitForSnapshotCleared("second");
+    }
+
+    @Test
+    public void testSecondaryIndexCleanup()
+    {
+        cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+        cluster.schemaChange(withKeyspace("CREATE INDEX value_idx ON %s.tbl (value)"));
+
+        populate(cluster);
+
+        cluster.get(1).nodetoolResult("snapshot", "--ttl",
+                                      format("%ds", FIVE_SECONDS),
+                                      "-t", "first",
+                                      "-kt", withKeyspace("%s.tbl")).asserts().success();
+
+        waitForSnapshotPresent("first");
+        waitForSnapshotCleared("first");
+    }
+
+    @Test
+    public void testListSnapshotOfDroppedTable()
+    {
+        IInvokableInstance instance = cluster.get(1);
+
+        cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+
+        populate(cluster);
+
+        instance.nodetoolResult("snapshot",
+                                      "-t", "tag1",
+                                      "-kt", withKeyspace("%s.tbl")).asserts().success();
+
+        // Check snapshot is listed when table is not dropped
+        waitForSnapshotPresent("tag1");
+
+        // Drop Table
+        cluster.schemaChange(withKeyspace("DROP TABLE %s.tbl;"));
+
+        // Check snapshot is listed after table is dropped
+        waitForSnapshotPresent("tag1");
+
+        // Restart node
+        stopUnchecked(instance);
+        instance.startup();
+
+        // Check snapshot of dropped table still exists after restart
+        waitForSnapshotPresent("tag1");
+    }
+
+    @Test
+    public void testTTLSnapshotOfDroppedTable()
+    {
+        IInvokableInstance instance = cluster.get(1);
+
+        cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+
+        populate(cluster);
+
+        instance.nodetoolResult("snapshot",
+                                "-t", "tag1",
+                                "-kt", withKeyspace("%s.tbl"),
+                                "--ttl", format("%ds", FIVE_SECONDS)).asserts().success();
+
+        // Check snapshot is listed when table is not dropped
+        instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains("tag1");
+
+        // Drop Table
+        cluster.schemaChange(withKeyspace("DROP TABLE %s.tbl;"));
+
+        // Check snapshot is listed after table is dropped
+        instance.nodetoolResult("listsnapshots").asserts().success().stdoutContains("tag1");
+
+        // Check snapshot is removed after at most 10s
+        await().timeout(2L * FIVE_SECONDS, SECONDS)
+               .pollInterval(1, SECONDS)
+               .until(() -> !instance.nodetoolResult("listsnapshots").getStdout().contains("tag1"));
+    }
+
+    @Test
+    public void testTTLSnapshotOfDroppedTableAfterRestart()
+    {
+        IInvokableInstance instance = cluster.get(1);
+
+        cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+
+        populate(cluster);
+
+        instance.nodetoolResult("snapshot",
+                                "-t", "tag1",
+                                "-kt", withKeyspace("%s.tbl"),
+                                "--ttl", "1h").asserts().success();
+
+
+        // Check snapshot is listed when table is not dropped
+        waitForSnapshotPresent("tag1");
+
+        // Drop Table
+        cluster.schemaChange(withKeyspace("DROP TABLE %s.tbl;"));
+
+        // Restart node
+        stopUnchecked(instance);
+        instance.startup();
+
+        // Check snapshot still exists after restart
+        waitForSnapshotPresent("tag1");
+    }
+
+    @Test
+    public void testExoticSnapshotNames()
+    {
+        IInvokableInstance instance = cluster.get(1);
+        cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (key int, value text, PRIMARY KEY (key))"));
+        populate(cluster);
+
+        for (String tag : exoticSnapshotNames)
+        {
+            instance.nodetoolResult("snapshot",
+                                    "-t", tag,
+                                    "-kt", withKeyspace("%s.tbl")).asserts().success();
+
+            waitForSnapshot(tag, true, true);
+        }
+    }
+
+    @Test
+    public void testSameTimestampOnEachTableOfSnaphot()
+    {
+        cluster.get(1).nodetoolResult("snapshot", "-t", "sametimestamp").asserts().success();
+        waitForSnapshotPresent("sametimestamp");
+        NodeToolResult result = cluster.get(1).nodetoolResult("listsnapshots");
+
+        Pattern COMPILE = Pattern.compile(" +");
+        long distinctTimestamps = Arrays.stream(result.getStdout().split("\n"))
+                                   .filter(line -> line.startsWith("sametimestamp"))
+                                   .map(line -> COMPILE.matcher(line).replaceAll(" ").split(" ")[7])
+                                   .distinct()
+                                   .count();
+
+        // assert all dates are same so there is just one value accross all individual tables
+        assertEquals(1, distinctTimestamps);
+    }
+
+    private void populate(Cluster cluster)
+    {
+        for (int i = 0; i < 100; i++)
+            cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.tbl (key, value) VALUES (?, 'txt')"), ConsistencyLevel.ONE, i);
+    }
+
+    private void waitForSnapshotPresent(String snapshotName)
+    {
+        waitForSnapshot(snapshotName, true, false);
+    }
+
+    private void waitForSnapshotCleared(String snapshotName)
+    {
+        waitForSnapshot(snapshotName, false, false);
+    }
+
+    private void waitForSnapshot(String snapshotName, boolean expectPresent, boolean noTTL)
+    {
+        await().timeout(20, SECONDS)
+               .pollDelay(0, SECONDS)
+               .pollInterval(1, SECONDS)
+               .until(() -> waitForSnapshotInternal(snapshotName, expectPresent, noTTL));
+    }
+
+    private boolean waitForSnapshotInternal(String snapshotName, boolean expectPresent, boolean noTTL) {
+        NodeToolResult listsnapshots;
+        if (noTTL)
+            listsnapshots = cluster.get(1).nodetoolResult("listsnapshots", "-nt");
+        else
+            listsnapshots = cluster.get(1).nodetoolResult("listsnapshots");
+
+        List<String> lines = Arrays.stream(listsnapshots.getStdout().split("\n"))
+                                   .filter(line -> !line.isEmpty())
+                                   .filter(line -> !line.startsWith("Snapshot Details:") && !line.startsWith("There are no snapshots"))
+                                   .filter(line -> !line.startsWith("Snapshot name") && !line.startsWith("Total TrueDiskSpaceUsed"))
+                                   .collect(toList());
+
+        return expectPresent == lines.stream().anyMatch(line -> line.startsWith(snapshotName));
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/StreamingTest.java b/test/distributed/org/apache/cassandra/distributed/test/StreamingTest.java
index 8fff004..72fd7f9 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/StreamingTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/StreamingTest.java
@@ -121,7 +121,10 @@
             // verify on follower's stream session
             MessageStateSinkImpl followerSink = new MessageStateSinkImpl();
             followerSink.messages(initiator, Arrays.asList(STREAM_INIT, PREPARE_SYN, PREPARE_ACK, RECEIVED));
-            followerSink.states(initiator,  Arrays.asList(PREPARING, STREAMING, StreamSession.State.COMPLETE));
+            // why 2 completes?  There is a race condition bug with sending COMPLETE where the socket gets closed
+            // by the initator, which then triggers a ClosedChannelException, which then checks the current state (PREPARING)
+            // to solve this, COMPLETE is set before sending the message, and reset when closing the stream
+            followerSink.states(initiator,  Arrays.asList(PREPARING, STREAMING, StreamSession.State.COMPLETE, StreamSession.State.COMPLETE));
             followerNode.runOnInstance(() -> StreamSession.sink = followerSink);
         }
 
@@ -149,7 +152,7 @@
         @Override
         public void recordState(InetAddressAndPort from, StreamSession.State state)
         {
-            Queue<Integer> states = stateTransitions.get(from.address);
+            Queue<Integer> states = stateTransitions.get(from.getAddress());
             if (states.peek() == null)
                 Assert.fail("Unexpected state " + state);
 
@@ -163,7 +166,7 @@
             if (message == StreamMessage.Type.KEEP_ALIVE)
                 return;
 
-            Queue<Integer> messages = messageSink.get(from.address);
+            Queue<Integer> messages = messageSink.get(from.getAddress());
             if (messages.peek() == null)
                 Assert.fail("Unexpected message " + message);
 
@@ -174,10 +177,10 @@
         @Override
         public void onClose(InetAddressAndPort from)
         {
-            Queue<Integer> states = stateTransitions.get(from.address);
+            Queue<Integer> states = stateTransitions.get(from.getAddress());
             Assert.assertTrue("Missing states: " + states, states.isEmpty());
 
-            Queue<Integer> messages = messageSink.get(from.address);
+            Queue<Integer> messages = messageSink.get(from.getAddress());
             Assert.assertTrue("Missing messages: " + messages, messages.isEmpty());
         }
     }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java b/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java
index 343ccc8..e97a081 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/TestBaseImpl.java
@@ -104,6 +104,16 @@
         return TupleType.buildValue(bbs);
     }
 
+    public static String batch(String... queries)
+    {
+        StringBuilder sb = new StringBuilder();
+        sb.append("BEGIN UNLOGGED BATCH\n");
+        for (String q : queries)
+            sb.append(q).append(";\n");
+        sb.append("APPLY BATCH;");
+        return sb.toString();
+    }
+
     protected void bootstrapAndJoinNode(Cluster cluster)
     {
         IInstanceConfig config = cluster.newInstanceConfig();
@@ -178,7 +188,7 @@
 
     public static void fixDistributedSchemas(Cluster cluster)
     {
-        // These keyspaces are under replicated by default, so must be updated when doing a mulit-node cluster;
+        // These keyspaces are under replicated by default, so must be updated when doing a multi-node cluster;
         // else bootstrap will fail with 'Unable to find sufficient sources for streaming range <range> in keyspace <name>'
         for (String ks : Arrays.asList("system_auth", "system_traces"))
         {
diff --git a/test/distributed/org/apache/cassandra/distributed/test/TombstoneWarningTest.java b/test/distributed/org/apache/cassandra/distributed/test/TombstoneWarningTest.java
new file mode 100644
index 0000000..9406432
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/TombstoneWarningTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.LogResult;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class TombstoneWarningTest extends TestBaseImpl
+{
+    private static final int COMPACTION_TOMBSTONE_WARN = 75;
+    private static final ICluster<IInvokableInstance> cluster;
+
+    static
+    {
+        try
+        {
+            Cluster.Builder builder = Cluster.build(3);
+            builder.withConfig(c -> c.set("compaction_tombstone_warning_threshold", COMPACTION_TOMBSTONE_WARN));
+            cluster = builder.createWithoutStarting();
+        }
+        catch (IOException e)
+        {
+            throw new AssertionError(e);
+        }
+    }
+
+    @BeforeClass
+    public static void setupClass()
+    {
+        cluster.startup();
+    }
+
+    @Before
+    public void setup()
+    {
+        cluster.schemaChange("DROP KEYSPACE IF EXISTS " + KEYSPACE);
+        init(cluster);
+        cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+    }
+
+    @Test
+    public void regularTombstonesLogTest()
+    {
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                cluster.coordinator(1).execute(withKeyspace("update %s.tbl set v = null where pk = ? and ck = ?"), ConsistencyLevel.ALL, i, j);
+        assertTombstoneLogs(99 - COMPACTION_TOMBSTONE_WARN , false);
+    }
+
+    @Test
+    public void rowTombstonesLogTest()
+    {
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                cluster.coordinator(1).execute(withKeyspace("delete from %s.tbl where pk = ? and ck = ?"), ConsistencyLevel.ALL, i, j);
+        assertTombstoneLogs(99 - COMPACTION_TOMBSTONE_WARN , false);
+    }
+
+    @Test
+    public void rangeTombstonesLogTest()
+    {
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                cluster.coordinator(1).execute(withKeyspace("delete from %s.tbl where pk = ? and ck >= ? and ck <= ?"), ConsistencyLevel.ALL, i, j, j);
+        assertTombstoneLogs(99 - (COMPACTION_TOMBSTONE_WARN / 2), true);
+    }
+
+    @Test
+    public void ttlTest() throws InterruptedException
+    {
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                cluster.coordinator(1).execute(withKeyspace("insert into %s.tbl (pk, ck, v) values (?, ?, ?) using ttl 1000"), ConsistencyLevel.ALL, i, j, j);
+        assertTombstoneLogs(0, true);
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                cluster.coordinator(1).execute(withKeyspace("update %s.tbl using ttl 1 set v = 33 where pk = ? and ck = ?"), ConsistencyLevel.ALL, i, j);
+        Thread.sleep(1500);
+        assertTombstoneLogs(99 - COMPACTION_TOMBSTONE_WARN, false);
+    }
+
+    @Test
+    public void noTombstonesLogTest()
+    {
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                cluster.coordinator(1).execute(withKeyspace("insert into %s.tbl (pk, ck, v) values (?, ?, ?)"), ConsistencyLevel.ALL, i, j, j);
+        assertTombstoneLogs(0, false);
+    }
+
+    private void assertTombstoneLogs(long expectedCount, boolean isRangeTombstones)
+    {
+        long mark = cluster.get(1).logs().mark();
+        cluster.get(1).flush(KEYSPACE);
+        String pattern = ".*Writing (?<tscount>\\d+) tombstones to distributed_test_keyspace/tbl:(?<key>\\d+).*";
+        LogResult<List<String>> res = cluster.get(1).logs().grep(mark, pattern);
+        assertEquals(expectedCount, res.getResult().size());
+        Pattern p = Pattern.compile(pattern);
+        for (String r : res.getResult())
+        {
+            Matcher m = p.matcher(r);
+            assertTrue(m.matches());
+            long tombstoneCount = Integer.parseInt(m.group("tscount"));
+            assertTrue(tombstoneCount > COMPACTION_TOMBSTONE_WARN);
+            assertEquals(r, Integer.parseInt(m.group("key")) * (isRangeTombstones ? 2 : 1), tombstoneCount);
+        }
+
+        mark = cluster.get(1).logs().mark();
+        cluster.get(1).forceCompact(KEYSPACE, "tbl");
+        res = cluster.get(1).logs().grep(mark, pattern);
+        assertEquals(expectedCount, res.getResult().size());
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/TopPartitionsTest.java b/test/distributed/org/apache/cassandra/distributed/test/TopPartitionsTest.java
new file mode 100644
index 0000000..9df6726
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/TopPartitionsTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.NodeToolResult;
+import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
+import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.distributed.test.PreviewRepairTest.logMark;
+import static org.junit.Assert.assertEquals;
+import static org.psjava.util.AssertStatus.assertTrue;
+
+@RunWith(Parameterized.class)
+public class TopPartitionsTest extends TestBaseImpl
+{
+    public enum Repair
+    {
+        Incremental, Full, FullPreview
+    }
+
+    private static AtomicInteger COUNTER = new AtomicInteger(0);
+    private static Cluster CLUSTER;
+
+    private final Repair repair;
+
+    public TopPartitionsTest(Repair repair)
+    {
+        this.repair = repair;
+    }
+
+    @Parameterized.Parameters(name = "{0}")
+    public static Collection<Object[]> messages()
+    {
+        return Stream.of(Repair.values())
+                     .map(a -> new Object[]{ a })
+                     .collect(Collectors.toList());
+    }
+
+    @BeforeClass
+    public static void setup() throws IOException
+    {
+        CLUSTER = init(Cluster.build(2).withConfig(config ->
+                                                   config.set("min_tracked_partition_size", "0MiB")
+                                                         .set("min_tracked_partition_tombstone_count", 0)
+                                                         .with(GOSSIP, NETWORK))
+                              .start());
+    }
+
+    @AfterClass
+    public static void cleanup()
+    {
+        if (CLUSTER != null)
+            CLUSTER.close();
+    }
+
+    @Before
+    public void before()
+    {
+        setCount(10, 10);
+    }
+
+    @Test
+    public void basicPartitionSizeTest() throws TimeoutException
+    {
+        String name = "tbl" + COUNTER.getAndIncrement();
+        String table = KEYSPACE + "." + name;
+        CLUSTER.schemaChange("create table " + table + " (id int, ck int, t int, primary key (id, ck))");
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                CLUSTER.coordinator(1).execute("insert into " + table + " (id, ck, t) values (?,?,?)", ConsistencyLevel.ALL, i, j, i * j + 100);
+
+        repair();
+        CLUSTER.forEach(inst -> inst.runOnInstance(() -> {
+            // partitions 99 -> 90 are the largest, make sure they are in the map;
+            Map<String, Long> sizes = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopSizePartitions();
+            for (int i = 99; i >= 90; i--)
+                assertTrue(sizes.containsKey(String.valueOf(i)));
+
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            assertEquals(10, tombstones.size());
+            assertTrue(tombstones.values().stream().allMatch(l -> l == 0));
+        }));
+
+        // make sure incremental repair doesn't change anything;
+        CLUSTER.get(1).nodetool("repair", KEYSPACE);
+        CLUSTER.forEach(inst -> inst.runOnInstance(() -> {
+            Map<String, Long> sizes = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopSizePartitions();
+            for (int i = 99; i >= 90; i--)
+                assertTrue(sizes.containsKey(String.valueOf(i)));
+        }));
+    }
+
+    @Test
+    public void configChangeTest() throws TimeoutException
+    {
+        String name = "tbl" + COUNTER.getAndIncrement();
+        String table = KEYSPACE + "." + name;
+        CLUSTER.schemaChange("create table " + table + " (id int, ck int, t int, primary key (id, ck))");
+        for (int i = 0; i < 100; i++)
+        {
+            for (int j = 0; j < i; j++)
+            {
+                CLUSTER.coordinator(1).execute("insert into " + table + " (id, ck, t) values (?,?,?)", ConsistencyLevel.ALL, i, j, i * j + 100);
+                CLUSTER.coordinator(1).execute("DELETE FROM " + table + " where id = ? and ck = ?", ConsistencyLevel.ALL, i, -j);
+            }
+        }
+
+        // top should have 10 elements
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            ColumnFamilyStore store = Keyspace.open(KEYSPACE).getColumnFamilyStore(name);
+            Assertions.assertThat(store.getTopTombstonePartitions()).hasSize(10);
+            Assertions.assertThat(store.getTopTombstonePartitions()).hasSize(10);
+        });
+
+        // reconfigure and repair; top should have 20 elements
+        setCount(20, 20);
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            ColumnFamilyStore store = Keyspace.open(KEYSPACE).getColumnFamilyStore(name);
+            Assertions.assertThat(store.getTopTombstonePartitions()).hasSize(20);
+            Assertions.assertThat(store.getTopTombstonePartitions()).hasSize(20);
+        });
+
+        // test shrinking config
+        setCount(5, 5);
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            ColumnFamilyStore store = Keyspace.open(KEYSPACE).getColumnFamilyStore(name);
+            Assertions.assertThat(store.getTopTombstonePartitions()).hasSize(5);
+            Assertions.assertThat(store.getTopTombstonePartitions()).hasSize(5);
+        });
+    }
+
+    @Test
+    public void basicRowTombstonesTest() throws InterruptedException, TimeoutException
+    {
+        String name = "tbl" + COUNTER.getAndIncrement();
+        String table = KEYSPACE + "." + name;
+        CLUSTER.schemaChange("create table " + table + " (id int, ck int, t int, primary key (id, ck)) with gc_grace_seconds = 1");
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                CLUSTER.coordinator(1).execute("DELETE FROM " + table + " where id = ? and ck = ?", ConsistencyLevel.ALL, i, j);
+        repair();
+        // tombstones not purgeable
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            for (int i = 99; i >= 90; i--)
+            {
+                assertTrue(tombstones.containsKey(String.valueOf(i)));
+                assertEquals(i, (long) tombstones.get(String.valueOf(i)));
+            }
+        });
+        Thread.sleep(2000);
+        // count purgeable tombstones;
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            for (int i = 99; i >= 90; i--)
+            {
+                assertTrue(tombstones.containsKey(String.valueOf(i)));
+                assertEquals(i, (long) tombstones.get(String.valueOf(i)));
+            }
+        });
+        CLUSTER.get(1).forceCompact(KEYSPACE, name);
+        // all tombstones actually purged;
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            assertTrue(tombstones.values().stream().allMatch(l -> l == 0));
+        });
+    }
+
+    @Test
+    public void basicRegularTombstonesTest() throws InterruptedException, TimeoutException
+    {
+        String name = "tbl" + COUNTER.getAndIncrement();
+        String table = KEYSPACE + "." + name;
+        CLUSTER.schemaChange("create table " + table + " (id int, ck int, t int, primary key (id, ck)) with gc_grace_seconds = 1");
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                CLUSTER.coordinator(1).execute("UPDATE " + table + " SET t = null where id = ? and ck = ?", ConsistencyLevel.ALL, i, j);
+        repair();
+        // tombstones not purgeable
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            for (int i = 99; i >= 90; i--)
+            {
+                assertTrue(tombstones.containsKey(String.valueOf(i)));
+                assertEquals(i, (long) tombstones.get(String.valueOf(i)));
+            }
+        });
+        Thread.sleep(2000);
+        // count purgeable tombstones;
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            for (int i = 99; i >= 90; i--)
+            {
+                assertTrue(tombstones.containsKey(String.valueOf(i)));
+                assertEquals(i, (long) tombstones.get(String.valueOf(i)));
+            }
+        });
+
+        CLUSTER.get(1).forceCompact(KEYSPACE, name);
+        // all tombstones actually purged;
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            assertTrue(tombstones.values().stream().allMatch(l -> l == 0));
+        });
+    }
+
+    private static void setCount(int size, int tombstone)
+    {
+        CLUSTER.forEach(i -> i.runOnInstance(() -> {
+            DatabaseDescriptor.setMaxTopSizePartitionCount(size);
+            DatabaseDescriptor.setMaxTopTombstonePartitionCount(tombstone);
+        }));
+    }
+
+    private void repair() throws TimeoutException
+    {
+        switch (repair)
+        {
+            case Incremental:
+            {
+                // IR will not populate, as it only looks at non-repaired data
+                // to trigger this patch, we need IR + --validate
+                long[] marks = logMark(CLUSTER);
+                NodeToolResult res = CLUSTER.get(1).nodetoolResult("repair", KEYSPACE);
+                res.asserts().success();
+                PreviewRepairTest.waitLogsRepairFullyFinished(CLUSTER, marks);
+                res = CLUSTER.get(1).nodetoolResult("repair", "--validate", KEYSPACE);
+                res.asserts().success();
+                res.asserts().notificationContains("Repaired data is in sync");
+            }
+            break;
+            case Full:
+            {
+                CLUSTER.get(1).nodetoolResult("repair", "-full", KEYSPACE).asserts().success();
+            }
+            break;
+            case FullPreview:
+            {
+                CLUSTER.get(1).nodetoolResult("repair", "-full", "--preview", KEYSPACE).asserts().success();
+            }
+            break;
+            default:
+                throw new AssertionError("Unknown repair type: " + repair);
+        }
+    }
+
+    @Test
+    public void basicRangeTombstonesTest() throws Throwable
+    {
+        String name = "tbl" + COUNTER.getAndIncrement();
+        String table = KEYSPACE + "." + name;
+        CLUSTER.schemaChange("create table " + table + " (id int, ck int, t int, primary key (id, ck)) with gc_grace_seconds = 1");
+        for (int i = 0; i < 100; i++)
+            for (int j = 0; j < i; j++)
+                CLUSTER.coordinator(1).execute("DELETE FROM " + table + " WHERE id = ? and ck >= ? and ck <= ?", ConsistencyLevel.ALL, i, j, j);
+        repair();
+        // tombstones not purgeable
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            // note that we count range tombstone markers - so the count will be double the number of deletions we did above
+            for (int i = 99; i >= 90; i--)
+                assertEquals(i * 2, (long)tombstones.get(String.valueOf(i)));
+        });
+        Thread.sleep(2000);
+        // count purgeable tombstones;
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            for (int i = 99; i >= 90; i--)
+                assertEquals(i * 2, (long)tombstones.get(String.valueOf(i)));
+        });
+
+        CLUSTER.get(1).forceCompact(KEYSPACE, name);
+        // all tombstones actually purged;
+        repair();
+        CLUSTER.get(1).runOnInstance(() -> {
+            Map<String, Long> tombstones = Keyspace.open(KEYSPACE).getColumnFamilyStore(name).getTopTombstonePartitions();
+            assertTrue(tombstones.values().stream().allMatch( l -> l == 0));
+        });
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/UnableToParseClientMessageFromBlockedSubnetTest.java b/test/distributed/org/apache/cassandra/distributed/test/UnableToParseClientMessageFromBlockedSubnetTest.java
new file mode 100644
index 0000000..27dcd2c
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/UnableToParseClientMessageFromBlockedSubnetTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.io.UncheckedIOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.TimeoutException;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.LogAction;
+import org.apache.cassandra.transport.Message;
+import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.transport.SimpleClient;
+import org.apache.cassandra.transport.messages.ErrorMessage;
+import org.assertj.core.api.Assertions;
+
+@RunWith(Parameterized.class)
+public class UnableToParseClientMessageFromBlockedSubnetTest extends TestBaseImpl
+{
+    private static Cluster CLUSTER;
+    private static List<String> CLUSTER_EXCLUDED_SUBNETS;
+
+    @SuppressWarnings("DefaultAnnotationParam")
+    @Parameterized.Parameter(0)
+    public List<String> excludeSubnets;
+    @Parameterized.Parameter(1)
+    public ProtocolVersion version;
+
+    @Parameterized.Parameters(name = "domains={0},version={1}")
+    public static Iterable<Object[]> params()
+    {
+        List<Object[]> tests = new ArrayList<>();
+        for (List<String> domains : Arrays.asList(Collections.singletonList("127.0.0.1"), Collections.singletonList("127.0.0.0/31")))
+        {
+            for (ProtocolVersion version : ProtocolVersion.SUPPORTED)
+            {
+                tests.add(new Object[] { domains, version });
+            }
+        }
+        return tests;
+    }
+
+    @BeforeClass
+    public static void setup()
+    {
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    @AfterClass
+    public static void cleanup()
+    {
+        if (CLUSTER != null)
+            CLUSTER.close();
+    }
+
+    @Test
+    public void badMessageCausesProtocolExceptionFromExcludeList() throws IOException, TimeoutException
+    {
+        Cluster cluster = getCluster();
+        // write gibberish to the native protocol
+        IInvokableInstance node = cluster.get(1);
+        // make sure everything is fine at the start
+        Assertions.assertThat(node.metrics().getCounter("org.apache.cassandra.metrics.Client.ProtocolException")).isEqualTo(0);
+        Assertions.assertThat(node.metrics().getCounter("org.apache.cassandra.metrics.Client.UnknownException")).isEqualTo(0);
+
+        LogAction logs = node.logs();
+        long mark = logs.mark();
+        try (SimpleClient client = SimpleClient.builder("127.0.0.1", 9042).protocolVersion(version).useBeta().build())
+        {
+            client.connect(false, true);
+
+            // this should return a failed response
+            // disable waiting on procol errors as that logic was reverted until we can figure out its 100% safe
+            // right now ProtocolException is thrown for fatal and non-fatal issues, so closing the channel
+            // on non-fatal issues could cause other issues for the cluster
+            byte expectedVersion = (byte) (80 + version.asInt());
+            Message.Response response = client.execute(new UnableToParseClientMessageTest.CustomHeaderMessage(new byte[]{ expectedVersion, 1, 2, 3, 4, 5, 6, 7, 8, 9 }), false);
+            Assertions.assertThat(response).isInstanceOf(ErrorMessage.class);
+
+            logs.watchFor(mark, "address contained in client_error_reporting_exclusions");
+            Assertions.assertThat(node.metrics().getCounter("org.apache.cassandra.metrics.Client.ProtocolException")).isEqualTo(0);
+            Assertions.assertThat(node.metrics().getCounter("org.apache.cassandra.metrics.Client.UnknownException")).isEqualTo(0);
+
+            Assertions.assertThat(logs.grep(mark, "Excluding client exception fo").getResult()).hasSize(1);
+            Assertions.assertThat(logs.grep(mark, "Unexpected exception during request").getResult()).isEmpty();
+        }
+    }
+
+    private Cluster getCluster()
+    {
+        if (CLUSTER == null || CLUSTER_EXCLUDED_SUBNETS != excludeSubnets)
+        {
+            if (CLUSTER != null)
+            {
+                CLUSTER.close();
+                CLUSTER = null;
+            }
+            try
+            {
+                CLUSTER = init(Cluster.build(1)
+                                      .withConfig(c -> c.with(Feature.values()).set("client_error_reporting_exclusions", ImmutableMap.of("subnets", excludeSubnets)))
+                                      .start());
+                CLUSTER_EXCLUDED_SUBNETS = excludeSubnets;
+            }
+            catch (IOException e)
+            {
+                throw new UncheckedIOException(e);
+            }
+        }
+        return CLUSTER;
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/UnableToParseClientMessageTest.java b/test/distributed/org/apache/cassandra/distributed/test/UnableToParseClientMessageTest.java
index 332b783..5c976b9 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/UnableToParseClientMessageTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/UnableToParseClientMessageTest.java
@@ -22,7 +22,6 @@
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 import java.util.Objects;
-import java.util.function.Consumer;
 import java.util.function.Predicate;
 
 import org.junit.AfterClass;
@@ -144,13 +143,13 @@
                 // using spinAssertEquals as the metric is updated AFTER replying back to the client
                 // so there is a race where we check the metric before it gets updated
                 Util.spinAssertEquals(currentCount + 1L,
-                        () -> CassandraMetricsRegistry.Metrics.getMeters()
-                                .get("org.apache.cassandra.metrics.Client.ProtocolException")
-                                .getCount(),
-                        10);
+                                      () -> CassandraMetricsRegistry.Metrics.getMeters()
+                                                                            .get("org.apache.cassandra.metrics.Client.ProtocolException")
+                                                                            .getCount(),
+                                      10);
                 Assert.assertEquals(0, CassandraMetricsRegistry.Metrics.getMeters()
-                        .get("org.apache.cassandra.metrics.Client.UnknownException")
-                        .getCount());
+                                                                       .get("org.apache.cassandra.metrics.Client.UnknownException")
+                                                                       .getCount());
             });
             // the logs are noSpamLogger, so each iteration may not produce a new log; only valid if present and not seen before
             List<String> results = node.logs().grep(logStart, "Protocol exception with client networking").getResult();
@@ -165,11 +164,11 @@
     private static long getProtocolExceptionCount(IInvokableInstance node)
     {
         return node.callOnInstance(() -> CassandraMetricsRegistry.Metrics.getMeters()
-                .get("org.apache.cassandra.metrics.Client.ProtocolException")
-                .getCount());
+                                                                         .get("org.apache.cassandra.metrics.Client.ProtocolException")
+                                                                         .getCount());
     }
 
-    private static class CustomHeaderMessage extends OptionsMessage
+    public static class CustomHeaderMessage extends OptionsMessage
     {
         private final ByteBuf headerEncoded;
 
diff --git a/test/distributed/org/apache/cassandra/distributed/test/UpdateSystemAuthAfterDCExpansionTest.java b/test/distributed/org/apache/cassandra/distributed/test/UpdateSystemAuthAfterDCExpansionTest.java
new file mode 100644
index 0000000..8765067
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/UpdateSystemAuthAfterDCExpansionTest.java
@@ -0,0 +1,233 @@
+/*
+ * 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.distributed.test;
+
+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;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.RoleOptions;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.TokenSupplier;
+import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.service.StorageService;
+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.distributed.api.Feature.GOSSIP;
+import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
+import static org.apache.cassandra.distributed.shared.AssertUtils.row;
+import static org.apache.cassandra.distributed.shared.NetworkTopology.dcAndRack;
+import static org.apache.cassandra.distributed.shared.NetworkTopology.networkTopology;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+/*
+ * Test that system_auth can only be altered to have valid datacenters, and that
+ * all valid datacenters must have at least one replica.
+ *
+ * Create a cluster with one nodes in dc1 with a new role
+ * Alter the system_auth keyspace to use NTS with {dc1: 1}
+ * Expand a cluster with a new node in dc2
+ * Alter the system auth keyspace to use NTS with {dc1: 1}, {dc2, 1} & repair
+ * Check that the new role is present in the new datacenter
+ * Remove the dc2 node
+ * Check the keyspace can be altered again to remove it
+ */
+public class UpdateSystemAuthAfterDCExpansionTest extends TestBaseImpl
+{
+    static final Logger logger = LoggerFactory.getLogger(UpdateSystemAuthAfterDCExpansionTest.class);
+    static final String username = "shinynewuser";
+
+    static void assertRolePresent(IInstance instance)
+    {
+        assertRows(instance.executeInternal(String.format("SELECT role FROM %s.%s WHERE role = ?",
+                                                          SchemaConstants.AUTH_KEYSPACE_NAME, ROLES),
+                                            username),
+                                            row(username));
+    }
+
+    static void assertRoleAbsent(IInstance instance)
+    {
+        assertRows(instance.executeInternal(String.format("SELECT role FROM %s.%s WHERE role = ?",
+                                                          SchemaConstants.AUTH_KEYSPACE_NAME, ROLES),
+                                            username));
+    }
+
+    static void assertQueryThrowsConfigurationException(Cluster cluster, String query)
+    {
+        cluster.forEach(instance -> {
+            try
+            {
+                // No need to use cluster.schemaChange as we're expecting a failure
+                instance.executeInternal(query);
+                fail("Expected \"" + query + "\" to throw a ConfigurationException, but it completed");
+            }
+            catch (Throwable tr)
+            {
+                assertEquals("org.apache.cassandra.exceptions.ConfigurationException", tr.getClass().getCanonicalName());
+            }
+        });
+    }
+
+    String alterKeyspaceStatement(String ntsOptions)
+    {
+        return String.format("ALTER KEYSPACE " + SchemaConstants.AUTH_KEYSPACE_NAME +
+                             " WITH replication = {'class': 'NetworkTopologyStrategy', %s};", ntsOptions);
+    }
+
+    @BeforeClass
+    static public void beforeClass() throws Throwable
+    {
+        // 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");
+        TestBaseImpl.beforeClass();
+    }
+
+    public void validateExpandAndContract(String initialDatacenters,
+                                          String expandedDatacenters,
+                                          String beforeDecommissionedDatacenters,
+                                          String afterDecommissionedDatacenters) throws Throwable
+    {
+        try (Cluster cluster = Cluster.build(1)
+                                      .withConfig(config -> config.set("auto_bootstrap", true)
+                                                                      .with(GOSSIP)
+                                                                      .with(NETWORK))
+                                      .withTokenSupplier(TokenSupplier.evenlyDistributedTokens(2))
+                                      .withNodeIdTopology(networkTopology(2,
+                                                                          (nodeid) -> nodeid % 2 == 1 ? dcAndRack("dc1", "rack1")
+                                                                                                      : dcAndRack("dc2", "rack2")
+                                      ))
+                                      .withNodes(1)
+                                      .createWithoutStarting())
+        {
+            logger.debug("Starting cluster with single node in dc1");
+            cluster.startup();
+
+            // currently no way to set authenticated user for coordinator
+            logger.debug("Creating test role");
+            cluster.get(1).runOnInstance(() -> DatabaseDescriptor.getRoleManager().createRole(AuthenticatedUser.SYSTEM_USER,
+                                                                                              RoleResource.role(username),
+                                                                                              new RoleOptions()));
+            assertRolePresent(cluster.get(1));
+
+            logger.debug("Try changing NTS too early before a node from the DC has joined");
+            assertQueryThrowsConfigurationException(cluster, alterKeyspaceStatement("'dc1': '1', 'dc2': '1'"));
+
+            logger.debug("Altering '{}' keyspace to use NTS with {}", SchemaConstants.AUTH_KEYSPACE_NAME, initialDatacenters);
+            cluster.schemaChangeIgnoringStoppedInstances(alterKeyspaceStatement(initialDatacenters));
+
+            logger.debug("Bootstrapping second node in dc2");
+            IInstanceConfig config = cluster.newInstanceConfig();
+            config.set("auto_bootstrap", true);
+            cluster.bootstrap(config).startup();
+
+            // Check that the role is on node1 but has not made it to node2
+            assertRolePresent(cluster.get(1));
+            assertRoleAbsent(cluster.get(2));
+
+            // Update options to make sure a replica is in the remote DC
+            logger.debug("Altering '{}' keyspace to use NTS with dc1 & dc2", SchemaConstants.AUTH_KEYSPACE_NAME);
+            cluster.schemaChangeIgnoringStoppedInstances(alterKeyspaceStatement(expandedDatacenters));
+
+            // make sure that all sstables have moved to repaired by triggering a compaction
+            logger.debug("Repair system_auth to make sure role is replicated everywhere");
+            cluster.get(1).runOnInstance(() -> {
+                try
+                {
+                    Condition await = newOneTimeCondition();
+                    StorageService.instance.repair(SchemaConstants.AUTH_KEYSPACE_NAME, Collections.emptyMap(), ImmutableList.of((tag, event) -> {
+                        if (event.getType() == ProgressEventType.COMPLETE)
+                            await.signalAll();
+                    })).right.get();
+                    await.await(1L, MINUTES);
+                }
+                catch (Exception e)
+                {
+                    fail("Unexpected exception: " + e);
+                }
+            });
+
+            logger.debug("Check the role is now replicated as expected after repairing");
+            assertRolePresent(cluster.get(1));
+            assertRolePresent(cluster.get(2));
+
+            // Make sure we cannot remove either of the active datacenters
+            logger.debug("Verify that neither active datacenter can be ALTER KEYSPACEd away");
+            assertQueryThrowsConfigurationException(cluster, alterKeyspaceStatement("'dc1': '1'"));
+            assertQueryThrowsConfigurationException(cluster, alterKeyspaceStatement("'dc2': '1'"));
+
+            logger.debug("Starting to decomission dc2");
+            cluster.schemaChangeIgnoringStoppedInstances(alterKeyspaceStatement(beforeDecommissionedDatacenters));
+
+            // Forcibly shutdown and have node2 evicted by FD
+            logger.debug("Force shutdown node2");
+            String node2hostId = cluster.get(2).callOnInstance(() -> StorageService.instance.getLocalHostId());
+            cluster.get(2).shutdown(false);
+
+            logger.debug("removeNode node2");
+            cluster.get(1).runOnInstance(() -> {
+                UUID hostId = UUID.fromString(node2hostId);
+                InetAddressAndPort endpoint = StorageService.instance.getEndpointForHostId(hostId);
+                FailureDetector.instance.forceConviction(endpoint);
+                StorageService.instance.removeNode(node2hostId);
+            });
+
+            logger.debug("Remove replication to decomissioned dc2");
+            cluster.schemaChangeIgnoringStoppedInstances(alterKeyspaceStatement(afterDecommissionedDatacenters));
+        }
+    }
+
+    @Test
+    public void explicitDCTest() throws Throwable
+    {
+        String initialDatacenters = "'dc1': '1'";
+        String expandedDatacenters = "'dc1': '1', 'dc2': '1'";
+        String beforeDecommissionedDatacenters = "'dc1': '1', 'dc2': '1'";
+        String afterDecommissionedDatacenters = "'dc1': '1'";
+        validateExpandAndContract(initialDatacenters, expandedDatacenters, beforeDecommissionedDatacenters, afterDecommissionedDatacenters);
+    }
+
+    @Test
+    public void replicaFactorTest() throws Throwable
+    {
+        String initialDatacenters = "'replication_factor': '1'";
+        String expandedDatacenters = "'replication_factor': '1'";
+        String beforeDecommissionedDatacenters = "'replication_factor': '1', 'dc2': '1'";
+        String afterDecommissionedDatacenters =  "'dc1': '1'";
+        validateExpandAndContract(initialDatacenters, expandedDatacenters, beforeDecommissionedDatacenters, afterDecommissionedDatacenters);
+    }
+}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/test/UpgradeSSTablesTest.java b/test/distributed/org/apache/cassandra/distributed/test/UpgradeSSTablesTest.java
new file mode 100644
index 0000000..ee89a81
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/UpgradeSSTablesTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.distributed.test;
+
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.LogAction;
+import org.apache.cassandra.io.sstable.Component;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+
+public class UpgradeSSTablesTest extends TestBaseImpl
+{
+    @Test
+    public void rewriteSSTablesTest() throws Throwable
+    {
+        try (ICluster<IInvokableInstance> cluster = builder().withNodes(1).withDataDirCount(1).start())
+        {
+            for (String compressionBefore : new String[]{ "{'class' : 'LZ4Compressor', 'chunk_length_in_kb' : 32}", "{'enabled': 'false'}" })
+            {
+                for (String command : new String[]{ "upgradesstables", "recompress_sstables" })
+                {
+                    cluster.schemaChange(withKeyspace("DROP KEYSPACE IF EXISTS %s"));
+                    cluster.schemaChange(withKeyspace("CREATE KEYSPACE %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': 1};"));
+
+                    cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (pk int, ck int, v text, PRIMARY KEY (pk, ck)) " +
+                                                      "WITH compression = " + compressionBefore));
+                    cluster.get(1).acceptsOnInstance((String ks) -> {
+                        Keyspace.open(ks).getColumnFamilyStore("tbl").disableAutoCompaction();
+                    }).accept(KEYSPACE);
+
+                    String blob = "blob";
+                    for (int i = 0; i < 6; i++)
+                        blob += blob;
+
+                    for (int i = 0; i < 100; i++)
+                    {
+                        cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.tbl (pk, ck, v) VALUES (?,?,?)"),
+                                                       ConsistencyLevel.QUORUM, i, i, blob);
+                    }
+                    cluster.get(1).nodetool("flush", KEYSPACE, "tbl");
+
+                    Assert.assertEquals(0, cluster.get(1).nodetool("upgradesstables", "-a", KEYSPACE, "tbl"));
+                    cluster.schemaChange(withKeyspace("ALTER TABLE %s.tbl WITH compression = {'class' : 'LZ4Compressor', 'chunk_length_in_kb' : 128};"));
+
+                    Thread.sleep(2000); // Make sure timestamp will be different even with 1-second resolution.
+
+                    long maxSoFar = cluster.get(1).appliesOnInstance((String ks) -> {
+                        long maxTs = -1;
+                        ColumnFamilyStore cfs = Keyspace.open(ks).getColumnFamilyStore("tbl");
+                        cfs.disableAutoCompaction();
+                        for (SSTableReader tbl : cfs.getLiveSSTables())
+                        {
+                            maxTs = Math.max(maxTs, tbl.getCreationTimeFor(Component.DATA));
+                        }
+                        return maxTs;
+                    }).apply(KEYSPACE);
+
+                    for (int i = 100; i < 200; i++)
+                    {
+                        cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.tbl (pk, ck, v) VALUES (?,?,?)"),
+                                                       ConsistencyLevel.QUORUM, i, i, blob);
+                    }
+                    cluster.get(1).nodetool("flush", KEYSPACE, "tbl");
+
+                    LogAction logAction = cluster.get(1).logs();
+                    logAction.mark();
+
+                    long expectedCount = cluster.get(1).appliesOnInstance((String ks, Long maxTs) -> {
+                        long count = 0;
+                        long skipped = 0;
+                        Set<SSTableReader> liveSSTables = Keyspace.open(ks).getColumnFamilyStore("tbl").getLiveSSTables();
+                        assert liveSSTables.size() == 2 : String.format("Expected 2 sstables, but got " + liveSSTables.size());
+                        for (SSTableReader tbl : liveSSTables)
+                        {
+                            if (tbl.getCreationTimeFor(Component.DATA) <= maxTs)
+                                count++;
+                            else
+                                skipped++;
+                        }
+                        assert skipped > 0;
+                        return count;
+                    }).apply(KEYSPACE, maxSoFar);
+
+                    if (command.equals("upgradesstables"))
+                        Assert.assertEquals(0, cluster.get(1).nodetool("upgradesstables", "-a", "-t", Long.toString(maxSoFar), KEYSPACE, "tbl"));
+                    else
+                        Assert.assertEquals(0, cluster.get(1).nodetool("recompress_sstables", KEYSPACE, "tbl"));
+
+                    Assert.assertFalse(logAction.grep(String.format("%d sstables to", expectedCount)).getResult().isEmpty());
+                }
+            }
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/VirtualTableFromInternodeTest.java b/test/distributed/org/apache/cassandra/distributed/test/VirtualTableFromInternodeTest.java
new file mode 100644
index 0000000..229dd96
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/VirtualTableFromInternodeTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.distributed.test;
+
+import java.io.IOException;
+import java.util.HashSet;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+import static org.apache.cassandra.distributed.util.QueryResultUtil.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class VirtualTableFromInternodeTest extends TestBaseImpl
+{
+    private static Cluster CLUSTER;
+
+    @BeforeClass
+    public static void setup() throws IOException
+    {
+        CLUSTER = Cluster.build(2)
+                         .withConfig(c -> c.with(Feature.values()))
+                         .start();
+    }
+
+    @AfterClass
+    public static void cleanup()
+    {
+        if (CLUSTER != null)
+            CLUSTER.close();
+    }
+
+    @Test
+    public void normal()
+    {
+        assertThat(CLUSTER.coordinator(1).executeWithResult("SELECT * FROM system_views.settings", ConsistencyLevel.ONE))
+        .hasSizeGreaterThan(2)
+        .contains("rpc_address", "127.0.0.1")
+        .contains("broadcast_address", "127.0.0.1");
+
+        assertThat(CLUSTER.coordinator(1).executeWithResult("SELECT * FROM system_views.settings WHERE name=?", ConsistencyLevel.ONE, "rpc_address"))
+        .isEqualTo("rpc_address", "127.0.0.1");
+
+        assertThat(CLUSTER.coordinator(1).executeWithResult("SELECT * FROM system_views.settings WHERE name IN (?, ?)", ConsistencyLevel.ONE, "rpc_address", "broadcast_address"))
+        .contains("rpc_address", "127.0.0.1")
+        .contains("broadcast_address", "127.0.0.1")
+        .hasSize(2);
+    }
+
+    @Test
+    public void readCommandAccessVirtualTable()
+    {
+        CLUSTER.get(1).runOnInstance(() -> {
+            boolean didWork = false;
+            for (InetAddressAndPort address : Gossiper.instance.getLiveMembers())
+            {
+                didWork = true;
+                UntypedResultSet rs = QueryProcessor.executeAsync(address, "SELECT * FROM system_views.settings")
+                                                    .syncUninterruptibly().getNow();
+                assertThat(rs.isEmpty()).isFalse();
+                for (UntypedResultSet.Row row : rs)
+                {
+                    String name = row.getString("name");
+                    switch (name)
+                    {
+                        case "broadcast_address":
+                        case "rpc_address":
+                            assertThat(row.getString("value")).isEqualTo(address.getAddress().getHostAddress());
+                            break;
+                    }
+                }
+            }
+            assertThat(didWork).isTrue();
+        });
+    }
+
+    @Test
+    public void readCommandAccessVirtualTableSinglePartition()
+    {
+        CLUSTER.get(1).runOnInstance(() -> {
+            boolean didWork = false;
+            for (InetAddressAndPort address : Gossiper.instance.getLiveMembers())
+            {
+                didWork = true;
+                UntypedResultSet rs = QueryProcessor.executeAsync(address, "SELECT * FROM system_views.settings WHERE name=?", "rpc_address")
+                                                    .syncUninterruptibly().getNow();
+                assertThat(rs.isEmpty()).isFalse();
+                assertThat(rs.one().getString("value")).isEqualTo(address.getAddress().getHostAddress());
+            }
+            assertThat(didWork).isTrue();
+        });
+    }
+
+    @Test
+    public void readCommandAccessVirtualTableMultiplePartition()
+    {
+        CLUSTER.get(1).runOnInstance(() -> {
+            boolean didWork = false;
+            for (InetAddressAndPort address : Gossiper.instance.getLiveMembers())
+            {
+                didWork = true;
+                UntypedResultSet rs = QueryProcessor.executeAsync(address, "SELECT * FROM system_views.settings WHERE name IN (?, ?)", "rpc_address", "broadcast_address")
+                                                    .syncUninterruptibly().getNow();
+                assertThat(rs.isEmpty()).isFalse();
+                Set<String> columns = new HashSet<>();
+                for (UntypedResultSet.Row row : rs)
+                {
+                    columns.add(row.getString("name"));
+                    assertThat(row.getString("value")).isEqualTo(address.getAddress().getHostAddress());
+                }
+                assertThat(columns).isEqualTo(ImmutableSet.of("rpc_address", "broadcast_address"));
+            }
+            assertThat(didWork).isTrue();
+        });
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailCollectionSizeOnSSTableWriteTest.java b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailCollectionSizeOnSSTableWriteTest.java
new file mode 100644
index 0000000..6b7daef
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailCollectionSizeOnSSTableWriteTest.java
@@ -0,0 +1,437 @@
+/*
+ * 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.distributed.test.guardrails;
+
+import java.io.IOException;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.SimpleStatement;
+import org.apache.cassandra.db.guardrails.Guardrails;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+
+import static java.nio.ByteBuffer.allocate;
+
+/**
+ * Tests the guardrail for the size of collections, {@link Guardrails#collectionSize}.
+ * <p>
+ * This test only includes the activation of the guardrail during sstable writes, all other cases are covered by
+ * {@link org.apache.cassandra.db.guardrails.GuardrailCollectionSizeTest}.
+ */
+public class GuardrailCollectionSizeOnSSTableWriteTest extends GuardrailTester
+{
+    private static final int NUM_NODES = 2;
+
+    private static final int WARN_THRESHOLD = 1024;
+    private static final int FAIL_THRESHOLD = WARN_THRESHOLD * 4;
+
+    private static Cluster cluster;
+    private static com.datastax.driver.core.Cluster driverCluster;
+    private static Session driverSession;
+
+    @BeforeClass
+    public static void setupCluster() throws IOException
+    {
+        cluster = init(Cluster.build(NUM_NODES)
+                              .withConfig(c -> c.with(Feature.GOSSIP, Feature.NATIVE_PROTOCOL)
+                                                .set("collection_size_warn_threshold", WARN_THRESHOLD + "B")
+                                                .set("collection_size_fail_threshold", FAIL_THRESHOLD + "B"))
+                              .start());
+        cluster.disableAutoCompaction(KEYSPACE);
+        driverCluster = com.datastax.driver.core.Cluster.builder().addContactPoint("127.0.0.1").build();
+        driverSession = driverCluster.connect();
+    }
+
+    @AfterClass
+    public static void teardownCluster()
+    {
+        if (driverSession != null)
+            driverSession.close();
+
+        if (driverCluster != null)
+            driverCluster.close();
+
+        if (cluster != null)
+            cluster.close();
+    }
+
+    @Override
+    protected Cluster getCluster()
+    {
+        return cluster;
+    }
+
+    @Test
+    public void testSetSize() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v set<blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", set());
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", set(allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (3, ?)", set(allocate(WARN_THRESHOLD / 2)));
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", set(allocate(WARN_THRESHOLD)));
+        assertWarnedOnFlush(warnMessage("4"));
+
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", set(allocate(WARN_THRESHOLD / 4), allocate(WARN_THRESHOLD * 3 / 4)));
+        assertWarnedOnFlush(warnMessage("5"));
+
+        execute("INSERT INTO %s (k, v) VALUES (6, ?)", set(allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("6"));
+
+        execute("INSERT INTO %s (k, v) VALUES (7, ?)", set(allocate(FAIL_THRESHOLD / 4), allocate(FAIL_THRESHOLD * 3 / 4)));
+        assertFailedOnFlush(failMessage("7"));
+    }
+
+    @Test
+    public void testSetSizeFrozen()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v frozen<set<blob>>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", set());
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", set(allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", set(allocate(WARN_THRESHOLD)));
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", set(allocate(FAIL_THRESHOLD)));
+
+        // frozen collections size is not checked during sstable write
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testSetSizeWithUpdates()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v set<blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, ?)", set(allocate(1)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 0", set(allocate(1)));
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", set(allocate(WARN_THRESHOLD / 4)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 1", set(allocate(WARN_THRESHOLD * 3 / 4)));
+        assertWarnedOnFlush(warnMessage("1"));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", set(allocate(FAIL_THRESHOLD / 4)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 2", set(allocate(FAIL_THRESHOLD * 3 / 4)));
+        assertFailedOnFlush(failMessage("2"));
+
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", set(allocate(FAIL_THRESHOLD)));
+        execute("UPDATE %s SET v = v - ? WHERE k = 4", set(allocate(FAIL_THRESHOLD)));
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testSetSizeAfterCompaction() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v set<blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, ?)", set(allocate(1)));
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + ? WHERE k = 0", set(allocate(1)));
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", set(allocate(WARN_THRESHOLD * 3 / 4)));
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + ? WHERE k = 1", set(allocate(WARN_THRESHOLD / 4)));
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("1"));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", set(allocate(FAIL_THRESHOLD * 3 / 4)));
+        assertWarnedOnFlush(warnMessage("2"));
+        execute("UPDATE %s SET v = v + ? WHERE k = 2", set(allocate(FAIL_THRESHOLD / 4)));
+        assertWarnedOnFlush(warnMessage("2"));
+        assertFailedOnCompact(failMessage("2"));
+
+        execute("INSERT INTO %s (k, v) VALUES (3, ?)", set(allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("3"));
+        execute("UPDATE %s SET v = v - ? WHERE k = 3", set(allocate(FAIL_THRESHOLD)));
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+    }
+
+    @Test
+    public void testListSize() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v list<blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", list());
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", list(allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (3, ?)", list(allocate(WARN_THRESHOLD / 2)));
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", list(allocate(WARN_THRESHOLD)));
+        assertWarnedOnFlush(warnMessage("4"));
+
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", list(allocate(WARN_THRESHOLD / 2), allocate(WARN_THRESHOLD / 2)));
+        assertWarnedOnFlush(warnMessage("5"));
+
+        execute("INSERT INTO %s (k, v) VALUES (6, ?)", list(allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("6"));
+
+        execute("INSERT INTO %s (k, v) VALUES (7, ?)", list(allocate(FAIL_THRESHOLD / 2), allocate(FAIL_THRESHOLD / 2)));
+        assertFailedOnFlush(failMessage("7"));
+    }
+
+    @Test
+    public void testListSizeFrozen()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v frozen<list<blob>>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", list());
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", list(allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", list(allocate(WARN_THRESHOLD)));
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", list(allocate(FAIL_THRESHOLD)));
+
+        // frozen collections size is not checked during sstable write
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testListSizeWithUpdates()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v list<blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, ?)", list(allocate(1)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 0", list(allocate(1)));
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", list(allocate(WARN_THRESHOLD / 2)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 1", list(allocate(WARN_THRESHOLD / 2)));
+        assertWarnedOnFlush(warnMessage("1"));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", list(allocate(FAIL_THRESHOLD / 2)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 2", list(allocate(FAIL_THRESHOLD / 2)));
+        assertFailedOnFlush(failMessage("2"));
+
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", list(allocate(FAIL_THRESHOLD)));
+        execute("UPDATE %s SET v = v - ? WHERE k = 4", list(allocate(FAIL_THRESHOLD)));
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testListSizeAfterCompaction() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v list<blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, ?)", list(allocate(1)));
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + ? WHERE k = 0", list(allocate(1)));
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", list(allocate(WARN_THRESHOLD / 2)));
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + ? WHERE k = 1", list(allocate(WARN_THRESHOLD / 2)));
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("1"));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", list(allocate(FAIL_THRESHOLD / 2)));
+        assertWarnedOnFlush(warnMessage("2"));
+        execute("UPDATE %s SET v = v + ? WHERE k = 2", list(allocate(FAIL_THRESHOLD / 2)));
+        assertNotWarnedOnFlush();
+        assertFailedOnCompact(failMessage("2"));
+
+        execute("INSERT INTO %s (k, v) VALUES (3, ?)", list(allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("3"));
+        execute("UPDATE %s SET v[0] = ? WHERE k = 3", allocate(1));
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+    }
+
+    @Test
+    public void testMapSize() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v map<blob, blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", map());
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", map(allocate(1), allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (3, ?)", map(allocate(1), allocate(WARN_THRESHOLD / 2)));
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", map(allocate(WARN_THRESHOLD / 2), allocate(1)));
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", map(allocate(WARN_THRESHOLD), allocate(1)));
+        assertWarnedOnFlush(warnMessage("5"));
+
+        execute("INSERT INTO %s (k, v) VALUES (6, ?)", map(allocate(1), allocate(WARN_THRESHOLD)));
+        assertWarnedOnFlush(warnMessage("6"));
+
+        execute("INSERT INTO %s (k, v) VALUES (7, ?)", map(allocate(WARN_THRESHOLD), allocate(WARN_THRESHOLD)));
+        assertWarnedOnFlush(warnMessage("7"));
+
+        execute("INSERT INTO %s (k, v) VALUES (8, ?)", map(allocate(FAIL_THRESHOLD), allocate(1)));
+        assertFailedOnFlush(failMessage("8"));
+
+        execute("INSERT INTO %s (k, v) VALUES (9, ?)", map(allocate(1), allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("9"));
+
+        execute("INSERT INTO %s (k, v) VALUES (10, ?)", map(allocate(FAIL_THRESHOLD), allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("10"));
+    }
+
+    @Test
+    public void testMapSizeFrozen()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v frozen<map<blob, blob>>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", map());
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", map(allocate(1), allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", map(allocate(1), allocate(WARN_THRESHOLD)));
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", map(allocate(WARN_THRESHOLD), allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (6, ?)", map(allocate(WARN_THRESHOLD), allocate(WARN_THRESHOLD)));
+        execute("INSERT INTO %s (k, v) VALUES (7, ?)", map(allocate(1), allocate(FAIL_THRESHOLD)));
+        execute("INSERT INTO %s (k, v) VALUES (8, ?)", map(allocate(FAIL_THRESHOLD), allocate(1)));
+        execute("INSERT INTO %s (k, v) VALUES (9, ?)", map(allocate(FAIL_THRESHOLD), allocate(FAIL_THRESHOLD)));
+
+        // frozen collections size is not checked during sstable write
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testMapSizeWithUpdates()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v map<blob, blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, ?)", map(allocate(1), allocate(1)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 0", map(allocate(1), allocate(1)));
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", map(allocate(1), allocate(WARN_THRESHOLD / 2)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 1", map(allocate(2), allocate(WARN_THRESHOLD / 2)));
+        assertWarnedOnFlush(warnMessage("1"));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", map(allocate(WARN_THRESHOLD / 4), allocate(1)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 2", map(allocate(WARN_THRESHOLD * 3 / 4), allocate(1)));
+        assertWarnedOnFlush(warnMessage("2"));
+
+        execute("INSERT INTO %s (k, v) VALUES (3, ?)", map(allocate(WARN_THRESHOLD / 4), allocate(WARN_THRESHOLD / 4)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 3", map(allocate(WARN_THRESHOLD / 4 + 1), allocate(WARN_THRESHOLD / 4)));
+        assertWarnedOnFlush(warnMessage("3"));
+
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", map(allocate(1), allocate(FAIL_THRESHOLD / 2)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 4", map(allocate(2), allocate(FAIL_THRESHOLD / 2)));
+        assertFailedOnFlush(failMessage("4"));
+
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", map(allocate(FAIL_THRESHOLD / 4), allocate(1)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 5", map(allocate(FAIL_THRESHOLD * 3 / 4), allocate(1)));
+        assertFailedOnFlush(failMessage("5"));
+
+        execute("INSERT INTO %s (k, v) VALUES (6, ?)", map(allocate(FAIL_THRESHOLD / 4), allocate(FAIL_THRESHOLD / 4)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 6", map(allocate(FAIL_THRESHOLD / 4 + 1), allocate(FAIL_THRESHOLD / 4)));
+        assertFailedOnFlush(failMessage("6"));
+    }
+
+    @Test
+    public void testMapSizeAfterCompaction()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v map<blob, blob>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, ?)", map(allocate(1), allocate(1)));
+        execute("UPDATE %s SET v = v + ? WHERE k = 0", map(allocate(1), allocate(1)));
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, ?)", map(allocate(1), allocate(WARN_THRESHOLD / 2)));
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + ? WHERE k = 1", map(allocate(2), allocate(WARN_THRESHOLD / 2)));
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("1"));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, ?)", map(allocate(WARN_THRESHOLD / 4), allocate(1)));
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + ? WHERE k = 2", map(allocate(WARN_THRESHOLD * 3 / 4), allocate(1)));
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("2"));
+
+        execute("INSERT INTO %s (k, v) VALUES (3, ?)", map(allocate(WARN_THRESHOLD / 4), allocate(WARN_THRESHOLD / 4)));
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + ? WHERE k = 3", map(allocate(WARN_THRESHOLD / 4 + 1), allocate(WARN_THRESHOLD / 4)));
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("3"));
+
+        execute("INSERT INTO %s (k, v) VALUES (4, ?)", map(allocate(1), allocate(FAIL_THRESHOLD / 2)));
+        assertWarnedOnFlush(failMessage("4"));
+        execute("UPDATE %s SET v = v + ? WHERE k = 4", map(allocate(2), allocate(FAIL_THRESHOLD / 2)));
+        assertWarnedOnFlush(warnMessage("4"));
+        assertFailedOnCompact(failMessage("4"));
+
+        execute("INSERT INTO %s (k, v) VALUES (5, ?)", map(allocate(FAIL_THRESHOLD / 4), allocate(1)));
+        assertWarnedOnFlush(failMessage("5"));
+        execute("UPDATE %s SET v = v + ? WHERE k = 5", map(allocate(FAIL_THRESHOLD * 3 / 4), allocate(1)));
+        assertWarnedOnFlush(warnMessage("5"));
+        assertFailedOnCompact(failMessage("5"));
+
+        execute("INSERT INTO %s (k, v) VALUES (6, ?)", map(allocate(FAIL_THRESHOLD / 4), allocate(FAIL_THRESHOLD / 4)));
+        assertWarnedOnFlush(failMessage("6"));
+        execute("UPDATE %s SET v = v + ? WHERE k = 6", map(allocate(FAIL_THRESHOLD / 4 + 1), allocate(FAIL_THRESHOLD / 4)));
+        assertWarnedOnFlush(warnMessage("6"));
+        assertFailedOnCompact(failMessage("6"));
+    }
+
+    @Test
+    public void testCompositePartitionKey()
+    {
+        schemaChange("CREATE TABLE %s (k1 int, k2 text, v set<blob>, PRIMARY KEY((k1, k2)))");
+
+        execute("INSERT INTO %s (k1, k2, v) VALUES (0, 'a', ?)", set(allocate(WARN_THRESHOLD)));
+        assertWarnedOnFlush(warnMessage("(0, 'a')"));
+
+        execute("INSERT INTO %s (k1, k2, v) VALUES (1, 'b', ?)", set(allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("(1, 'b')"));
+    }
+
+    @Test
+    public void testCompositeClusteringKey()
+    {
+        schemaChange("CREATE TABLE %s (k int, c1 int, c2 text, v set<blob>, PRIMARY KEY(k, c1, c2))");
+
+        execute("INSERT INTO %s (k, c1, c2, v) VALUES (1, 10, 'a', ?)", set(allocate(WARN_THRESHOLD)));
+        assertWarnedOnFlush(warnMessage("(1, 10, 'a')"));
+
+        execute("INSERT INTO %s (k, c1, c2, v) VALUES (2, 20, 'b', ?)", set(allocate(FAIL_THRESHOLD)));
+        assertFailedOnFlush(failMessage("(2, 20, 'b')"));
+    }
+
+    private void execute(String query, Object... args)
+    {
+        SimpleStatement stmt = new SimpleStatement(format(query), args);
+        stmt.setConsistencyLevel(com.datastax.driver.core.ConsistencyLevel.ALL);
+        driverSession.execute(stmt);
+    }
+
+    private String warnMessage(String key)
+    {
+        return String.format("Detected collection v in row %s in table %s of size", key, qualifiedTableName);
+    }
+
+    private String failMessage(String key)
+    {
+        return String.format("Detected collection v in row %s in table %s of size", key, qualifiedTableName);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailDiskUsageTest.java b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailDiskUsageTest.java
new file mode 100644
index 0000000..e1868e2
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailDiskUsageTest.java
@@ -0,0 +1,225 @@
+/*
+ * 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.distributed.test.guardrails;
+
+import java.io.IOException;
+import java.util.List;
+import java.util.concurrent.Callable;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+import com.datastax.driver.core.exceptions.InvalidQueryException;
+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.Util;
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.db.guardrails.Guardrails;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.service.disk.usage.DiskUsageBroadcaster;
+import org.apache.cassandra.service.disk.usage.DiskUsageMonitor;
+import org.apache.cassandra.service.disk.usage.DiskUsageState;
+import org.assertj.core.api.Assertions;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
+/**
+ * Tests the guardrails for disk usage, {@link Guardrails#localDataDiskUsage} and {@link Guardrails#replicaDiskUsage}.
+ */
+public class GuardrailDiskUsageTest extends GuardrailTester
+{
+    private static final int NUM_ROWS = 100;
+
+    private static final String WARN_MESSAGE = "Replica disk usage exceeds warning threshold";
+    private static final String FAIL_MESSAGE = "Write request failed because disk usage exceeds failure threshold";
+
+    private static Cluster cluster;
+    private static com.datastax.driver.core.Cluster driverCluster;
+    private static Session driverSession;
+
+    @BeforeClass
+    public static void setupCluster() throws IOException
+    {
+        // speed up the task that calculates and propagates the disk usage info
+        CassandraRelevantProperties.DISK_USAGE_MONITOR_INTERVAL_MS.setInt(100);
+
+        // build a 2-node cluster with RF=1
+        cluster = init(Cluster.build(2)
+                              .withInstanceInitializer(DiskStateInjection::install)
+                              .withConfig(c -> c.with(Feature.GOSSIP, Feature.NATIVE_PROTOCOL)
+                                                .set("data_disk_usage_percentage_warn_threshold", 98)
+                                                .set("data_disk_usage_percentage_fail_threshold", 99)
+                                                .set("authenticator", "PasswordAuthenticator"))
+                              .start(), 1);
+
+        // create a regular user, since the default superuser is excluded from guardrails
+        com.datastax.driver.core.Cluster.Builder builder = com.datastax.driver.core.Cluster.builder().addContactPoint("127.0.0.1");
+        try (com.datastax.driver.core.Cluster c = builder.withCredentials("cassandra", "cassandra").build();
+             Session session = c.connect())
+        {
+            session.execute("CREATE USER test WITH PASSWORD 'test'");
+        }
+
+        // connect using that superuser, we use the driver to get access to the client warnings
+        driverCluster = builder.withCredentials("test", "test").build();
+        driverSession = driverCluster.connect();
+    }
+
+    @AfterClass
+    public static void teardownCluster()
+    {
+        if (driverSession != null)
+            driverSession.close();
+
+        if (driverCluster != null)
+            driverCluster.close();
+
+        if (cluster != null)
+            cluster.close();
+    }
+
+    @Override
+    protected Cluster getCluster()
+    {
+        return cluster;
+    }
+
+    @Test
+    public void testDiskUsage() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v int)");
+        String insert = format("INSERT INTO %s(k, v) VALUES (?, 0)");
+
+        // With both nodes in SPACIOUS state, we can write without warnings nor failures
+        for (int i = 0; i < NUM_ROWS; i++)
+        {
+            ResultSet rs = driverSession.execute(insert, i);
+            Assertions.assertThat(rs.getExecutionInfo().getWarnings()).isEmpty();
+        }
+
+        // If the disk usage information about one node becomes unavailable, we can still write without warnings
+        DiskStateInjection.setState(getCluster(), 2, DiskUsageState.NOT_AVAILABLE);
+        for (int i = 0; i < NUM_ROWS; i++)
+        {
+            ResultSet rs = driverSession.execute(insert, i);
+            Assertions.assertThat(rs.getExecutionInfo().getWarnings()).isEmpty();
+        }
+
+        // If one node becomes STUFFED, the writes targeting that node will raise a warning, while the writes targetting
+        // the node that remains SPACIOUS will keep succeeding without warnings
+        DiskStateInjection.setState(getCluster(), 2, DiskUsageState.STUFFED);
+        int numWarnings = 0;
+        for (int i = 0; i < NUM_ROWS; i++)
+        {
+            ResultSet rs = driverSession.execute(insert, i);
+
+            List<String> warnings = rs.getExecutionInfo().getWarnings();
+            if (!warnings.isEmpty())
+            {
+                Assertions.assertThat(warnings).hasSize(1).anyMatch(s -> s.contains(WARN_MESSAGE));
+                numWarnings++;
+            }
+        }
+        Assertions.assertThat(numWarnings).isGreaterThan(0).isLessThan(NUM_ROWS);
+
+        // If the STUFFED node becomes FULL, the writes targeting that node will fail, while the writes targeting
+        // the node that remains SPACIOUS will keep succeeding without warnings
+        DiskStateInjection.setState(getCluster(), 2, DiskUsageState.FULL);
+        int numFailures = 0;
+        for (int i = 0; i < NUM_ROWS; i++)
+        {
+            try
+            {
+                ResultSet rs = driverSession.execute(insert, i);
+                Assertions.assertThat(rs.getExecutionInfo().getWarnings()).isEmpty();
+            }
+            catch (InvalidQueryException e)
+            {
+                Assertions.assertThat(e).hasMessageContaining(FAIL_MESSAGE);
+                numFailures++;
+            }
+        }
+        Assertions.assertThat(numFailures).isGreaterThan(0).isLessThan(NUM_ROWS);
+
+        // If both nodes are FULL, all queries will fail
+        DiskStateInjection.setState(getCluster(), 1, DiskUsageState.FULL);
+        for (int i = 0; i < NUM_ROWS; i++)
+        {
+            try
+            {
+                driverSession.execute(insert, i);
+                Assertions.fail("Should have failed");
+            }
+            catch (InvalidQueryException e)
+            {
+                numFailures++;
+            }
+        }
+
+        // Finally, if both nodes go back to SPACIOUS, all queries will succeed again
+        DiskStateInjection.setState(getCluster(), 1, DiskUsageState.SPACIOUS);
+        DiskStateInjection.setState(getCluster(), 2, DiskUsageState.SPACIOUS);
+        for (int i = 0; i < NUM_ROWS; i++)
+        {
+            ResultSet rs = driverSession.execute(insert, i);
+            Assertions.assertThat(rs.getExecutionInfo().getWarnings()).isEmpty();
+        }
+    }
+
+    /**
+     * ByteBuddy rule to override the disk usage state of each node.
+     */
+    public static class DiskStateInjection
+    {
+        public static volatile DiskUsageState state = DiskUsageState.SPACIOUS;
+
+        private static void install(ClassLoader cl, int node)
+        {
+            new ByteBuddy().rebase(DiskUsageMonitor.class)
+                           .method(named("getState"))
+                           .intercept(MethodDelegation.to(DiskStateInjection.class))
+                           .make()
+                           .load(cl, ClassLoadingStrategy.Default.INJECTION);
+        }
+
+        public static void setState(Cluster cluster, int node, DiskUsageState state)
+        {
+            IInvokableInstance instance = cluster.get(node);
+            instance.runOnInstance(() -> DiskStateInjection.state = state);
+
+            // wait for disk usage state propagation, all nodes must see it
+            InetAddressAndPort enpoint = InetAddressAndPort.getByAddress(instance.broadcastAddress());
+            cluster.forEach(n -> n.runOnInstance(() -> Util.spinAssertEquals(state, () -> DiskUsageBroadcaster.instance.state(enpoint), 60)));
+        }
+
+        @SuppressWarnings("unused")
+        public static DiskUsageState getState(long usagePercentage, @SuperCall Callable<DiskUsageState> zuper)
+        {
+            return state;
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailItemsPerCollectionOnSSTableWriteTest.java b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailItemsPerCollectionOnSSTableWriteTest.java
new file mode 100644
index 0000000..260752e
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailItemsPerCollectionOnSSTableWriteTest.java
@@ -0,0 +1,339 @@
+/*
+ * 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.distributed.test.guardrails;
+
+import java.io.IOException;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.db.guardrails.Guardrails;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.ICoordinator;
+
+/**
+ * Tests the guardrail for the number of items on a collection, {@link Guardrails#itemsPerCollection}.
+ * <p>
+ * This test only includes the activation of the guardrail during sstable writes, all other cases are covered by
+ * {@link org.apache.cassandra.db.guardrails.GuardrailItemsPerCollectionTest}.
+ */
+public class GuardrailItemsPerCollectionOnSSTableWriteTest extends GuardrailTester
+{
+    private static final int NUM_NODES = 2;
+
+    private static final int WARN_THRESHOLD = 2;
+    private static final int FAIL_THRESHOLD = 4;
+
+    private static Cluster cluster;
+    private static ICoordinator coordinator;
+
+    @BeforeClass
+    public static void setupCluster() throws IOException
+    {
+        cluster = init(Cluster.build(NUM_NODES)
+                              .withConfig(c -> c.set("items_per_collection_warn_threshold", WARN_THRESHOLD)
+                                                .set("items_per_collection_fail_threshold", FAIL_THRESHOLD))
+                              .start());
+        cluster.disableAutoCompaction(KEYSPACE);
+        coordinator = cluster.coordinator(1);
+    }
+
+    @AfterClass
+    public static void teardownCluster()
+    {
+        if (cluster != null)
+            cluster.close();
+    }
+
+    @Override
+    protected Cluster getCluster()
+    {
+        return cluster;
+    }
+
+    @Test
+    public void testSetSize() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v set<int>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, {1})");
+        execute("INSERT INTO %s (k, v) VALUES (2, {1, 2})");
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (3, {1, 2, 3})");
+        execute("INSERT INTO %s (k, v) VALUES (4, {1, 2, 3, 4})");
+        assertWarnedOnFlush(warnMessage("3", 3), warnMessage("4", 4));
+
+        execute("INSERT INTO %s (k, v) VALUES (5, {1, 2, 3, 4, 5})");
+        execute("INSERT INTO %s (k, v) VALUES (6, {1, 2, 3, 4, 5, 6})");
+        assertFailedOnFlush(failMessage("5", 5), failMessage("6", 6));
+    }
+
+    @Test
+    public void testSetSizeFrozen()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v frozen<set<int>>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (3, {1, 2, 3})");
+        execute("INSERT INTO %s (k, v) VALUES (5, {1, 2, 3, 4, 5})");
+
+        // the size of frozen collections is not checked during sstable write
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testSetSizeWithUpdates()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v set<int>)");
+
+        execute("UPDATE %s SET v = v + {1, 2} WHERE k = 1");
+        execute("UPDATE %s SET v = v - {1, 2} WHERE k = 2");
+        assertNotWarnedOnFlush();
+
+        execute("UPDATE %s SET v = v + {1, 2, 3} WHERE k = 3");
+        execute("UPDATE %s SET v = v - {1, 2, 3} WHERE k = 4");
+        assertWarnedOnFlush(warnMessage("3", 3));
+
+        execute("UPDATE %s SET v = v + {1, 2, 3, 4, 5} WHERE k = 5");
+        execute("UPDATE %s SET v = v - {1, 2, 3, 4, 5} WHERE k = 6");
+        assertFailedOnFlush(failMessage("5", 5));
+    }
+
+    @Test
+    public void testSetSizeAfterCompaction() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v set<int>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, {1})");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + {2} WHERE k = 0");
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, {1})");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + {2, 3} WHERE k = 1");
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("1", 3));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, {1, 2})");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + {3, 4, 5} WHERE k = 2");
+        assertWarnedOnFlush(warnMessage("2", 3));
+        assertFailedOnCompact(failMessage("2", 5));
+    }
+
+    @Test
+    public void testListSize() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v list<int>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, [1])");
+        execute("INSERT INTO %s (k, v) VALUES (2, [1, 2])");
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (3, [1, 2, 3])");
+        execute("INSERT INTO %s (k, v) VALUES (4, [1, 2, 3, 4])");
+        assertWarnedOnFlush(warnMessage("3", 3), warnMessage("4", 4));
+
+        execute("INSERT INTO %s (k, v) VALUES (5, [1, 2, 3, 4, 5])");
+        execute("INSERT INTO %s (k, v) VALUES (6, [1, 2, 3, 4, 5, 6])");
+        assertFailedOnFlush(failMessage("5", 5), failMessage("6", 6));
+    }
+
+    @Test
+    public void testListSizeFrozen() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v frozen<list<int>>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (3, [1, 2, 3])");
+        execute("INSERT INTO %s (k, v) VALUES (5, [1, 2, 3, 4, 5])");
+
+        // the size of frozen collections is not checked during sstable write
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testListSizeWithUpdates()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v list<int>)");
+
+        execute("UPDATE %s SET v = v + [1, 2] WHERE k = 1");
+        execute("UPDATE %s SET v = v - [1, 2] WHERE k = 2");
+        assertNotWarnedOnFlush();
+
+        execute("UPDATE %s SET v = v + [1, 2, 3] WHERE k = 3");
+        execute("UPDATE %s SET v = v - [1, 2, 3] WHERE k = 4");
+        assertWarnedOnFlush(warnMessage("3", 3));
+
+        execute("UPDATE %s SET v = v + [1, 2, 3, 4, 5] WHERE k = 5");
+        execute("UPDATE %s SET v = v - [1, 2, 3, 4, 5] WHERE k = 6");
+        assertFailedOnFlush(failMessage("5", 5));
+    }
+
+    @Test
+    public void testListSizeAfterCompaction() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v list<int>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, [1])");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + [2] WHERE k = 0");
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, [1])");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + [2, 3] WHERE k = 1");
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("1", 3));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, [1, 2])");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + [3, 4, 5] WHERE k = 2");
+        assertWarnedOnFlush(warnMessage("2", 3));
+        assertFailedOnCompact(failMessage("2", 5));
+
+        execute("INSERT INTO %s (k, v) VALUES (3, [1, 2, 3])");
+        assertWarnedOnFlush(warnMessage("3", 3));
+        execute("UPDATE %s SET v[1] = null WHERE k = 3");
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+    }
+
+    @Test
+    public void testMapSize() throws Throwable
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v map<int, int>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, null)");
+        execute("INSERT INTO %s (k, v) VALUES (1, {1:10})");
+        execute("INSERT INTO %s (k, v) VALUES (2, {1:10, 2:20})");
+        assertNotWarnedOnFlush();
+
+        execute("INSERT INTO %s (k, v) VALUES (3, {1:10, 2:20, 3:30})");
+        execute("INSERT INTO %s (k, v) VALUES (4, {1:10, 2:20, 3:30, 4:40})");
+        assertWarnedOnFlush(warnMessage("3", 3), warnMessage("4", 4));
+
+        execute("INSERT INTO %s (k, v) VALUES (5, {1:10, 2:20, 3:30, 4:40, 5:50})");
+        execute("INSERT INTO %s (k, v) VALUES (6, {1:10, 2:20, 3:30, 4:40, 5:50, 6:60})");
+        assertFailedOnFlush(failMessage("5", 5), failMessage("6", 6));
+    }
+
+    @Test
+    public void testMapSizeFrozen()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v frozen<map<int, int>>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (3, {1:10, 2:20, 3:30})");
+        execute("INSERT INTO %s (k, v) VALUES (4, {1:10, 2:20, 3:30, 4:40})");
+
+        // the size of frozen collections is not checked during sstable write
+        assertNotWarnedOnFlush();
+    }
+
+    @Test
+    public void testMapSizeWithUpdates()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v map<int, int>)");
+
+        execute("UPDATE %s SET v = v + {1:10, 2:20} WHERE k = 1");
+        execute("UPDATE %s SET v = v - {1, 2} WHERE k = 2");
+        assertNotWarnedOnFlush();
+
+        execute("UPDATE %s SET v = v + {1:10, 2:20, 3:30} WHERE k = 3");
+        execute("UPDATE %s SET v = v - {1, 2, 3} WHERE k = 4");
+        assertWarnedOnFlush(warnMessage("3", 3));
+
+        execute("UPDATE %s SET v = v + {1:10, 2:20, 3:30, 4:40, 5:50} WHERE k = 5");
+        execute("UPDATE %s SET v = v - {1, 2, 3, 4, 5} WHERE k = 6");
+        assertFailedOnFlush(failMessage("5", 5));
+    }
+
+    @Test
+    public void testMapSizeAfterCompaction()
+    {
+        schemaChange("CREATE TABLE %s (k int PRIMARY KEY, v map<int, int>)");
+
+        execute("INSERT INTO %s (k, v) VALUES (0, {1:10})");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + {2:20} WHERE k = 0");
+        assertNotWarnedOnFlush();
+        assertNotWarnedOnCompact();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, {1:10})");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + {2:20, 3:30} WHERE k = 1");
+        assertNotWarnedOnFlush();
+        assertWarnedOnCompact(warnMessage("1", 3));
+
+        execute("INSERT INTO %s (k, v) VALUES (2, {1:10, 2:20})");
+        assertNotWarnedOnFlush();
+        execute("UPDATE %s SET v = v + {3:30, 4:40, 5:50} WHERE k = 2");
+        assertWarnedOnFlush(warnMessage("2", 3));
+        assertFailedOnCompact(failMessage("2", 5));
+    }
+
+    @Test
+    public void testCompositePartitionKey()
+    {
+        schemaChange("CREATE TABLE %s (k1 int, k2 text, v set<int>, PRIMARY KEY((k1, k2)))");
+
+        execute("INSERT INTO %s (k1, k2, v) VALUES (0, 'a', {1, 2, 3})");
+        assertWarnedOnFlush(warnMessage("(0, 'a')", 3));
+
+        execute("INSERT INTO %s (k1, k2, v) VALUES (1, 'b', {1, 2, 3, 4, 5})");
+        assertFailedOnFlush(failMessage("(1, 'b')", 5));
+    }
+
+    @Test
+    public void testCompositeClusteringKey()
+    {
+        schemaChange("CREATE TABLE %s (k int, c1 int, c2 text, v set<int>, PRIMARY KEY(k, c1, c2))");
+
+        execute("INSERT INTO %s (k, c1, c2, v) VALUES (1, 10, 'a', {1, 2, 3})");
+        assertWarnedOnFlush(warnMessage("(1, 10, 'a')", 3));
+
+        execute("INSERT INTO %s (k, c1, c2, v) VALUES (2, 20, 'b', {1, 2, 3, 4, 5})");
+        assertFailedOnFlush(failMessage("(2, 20, 'b')", 5));
+    }
+
+    private void execute(String query)
+    {
+        coordinator.execute(format(query), ConsistencyLevel.ALL);
+    }
+
+    private String warnMessage(String key, int numItems)
+    {
+        return String.format("Detected collection v in row %s in table %s with %d items, " +
+                             "this exceeds the warning threshold of %d.",
+                             key, qualifiedTableName, numItems, WARN_THRESHOLD);
+    }
+
+    private String failMessage(String key, int numItems)
+    {
+        return String.format("Detected collection v in row %s in table %s with %d items, " +
+                             "this exceeds the failure threshold of %d.",
+                             key, qualifiedTableName, numItems, FAIL_THRESHOLD);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailTester.java b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailTester.java
new file mode 100644
index 0000000..b12d9ab
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/guardrails/GuardrailTester.java
@@ -0,0 +1,154 @@
+/*
+ * 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.distributed.test.guardrails;
+
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.junit.After;
+import org.junit.Before;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.assertj.core.api.Assertions;
+import org.assertj.core.api.ListAssert;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public abstract class GuardrailTester extends TestBaseImpl
+{
+    private static final AtomicInteger seqNumber = new AtomicInteger();
+    protected String tableName, qualifiedTableName;
+
+    protected abstract Cluster getCluster();
+
+    @Before
+    public void beforeTest()
+    {
+        tableName = "t_" + seqNumber.getAndIncrement();
+        qualifiedTableName = KEYSPACE + "." + tableName;
+    }
+
+    @After
+    public void afterTest()
+    {
+        schemaChange("DROP TABLE IF EXISTS %s");
+    }
+
+    protected String format(String query)
+    {
+        return String.format(query, qualifiedTableName);
+    }
+
+    protected void schemaChange(String query)
+    {
+        getCluster().schemaChange(format(query));
+    }
+
+    protected void assertNotWarnedOnFlush()
+    {
+        assertNotWarnsOnSSTableWrite(false);
+    }
+
+    protected void assertNotWarnedOnCompact()
+    {
+        assertNotWarnsOnSSTableWrite(true);
+    }
+
+    protected void assertNotWarnsOnSSTableWrite(boolean compact)
+    {
+        getCluster().stream().forEach(node -> assertNotWarnsOnSSTableWrite(node, compact));
+    }
+
+    protected void assertNotWarnsOnSSTableWrite(IInstance node, boolean compact)
+    {
+        long mark = node.logs().mark();
+        try
+        {
+            writeSSTables(node, compact);
+            assertTrue(node.logs().grep(mark, "^ERROR", "^WARN").getResult().isEmpty());
+        }
+        catch (InvalidRequestException e)
+        {
+            fail("Expected not to fail, but Fails with error message: " + e.getMessage());
+        }
+    }
+
+    protected void assertWarnedOnFlush(String... msgs)
+    {
+        assertWarnsOnSSTableWrite(false, msgs);
+    }
+
+    protected void assertWarnedOnCompact(String... msgs)
+    {
+        assertWarnsOnSSTableWrite(true, msgs);
+    }
+
+    protected void assertWarnsOnSSTableWrite(boolean compact, String... msgs)
+    {
+        getCluster().stream().forEach(node -> assertWarnsOnSSTableWrite(node, compact, msgs));
+    }
+
+    protected void assertWarnsOnSSTableWrite(IInstance node, boolean compact, String... msgs)
+    {
+        long mark = node.logs().mark();
+        writeSSTables(node, compact);
+        assertTrue(node.logs().grep(mark, "^ERROR").getResult().isEmpty());
+        List<String> warnings = node.logs().grep(mark, "^WARN").getResult();
+        ListAssert<String> assertion = Assertions.assertThat(warnings).isNotEmpty().hasSize(msgs.length);
+        for (String msg : msgs)
+            assertion.anyMatch(m -> m.contains(msg));
+    }
+
+    protected void assertFailedOnFlush(String... msgs)
+    {
+        assertFailsOnSSTableWrite(false, msgs);
+    }
+
+    protected void assertFailedOnCompact(String... msgs)
+    {
+        assertFailsOnSSTableWrite(true, msgs);
+    }
+
+    private void assertFailsOnSSTableWrite(boolean compact, String... msgs)
+    {
+        getCluster().stream().forEach(node -> assertFailsOnSSTableWrite(node, compact, msgs));
+    }
+
+    private void assertFailsOnSSTableWrite(IInstance node, boolean compact, String... msgs)
+    {
+        long mark = node.logs().mark();
+        writeSSTables(node, compact);
+        assertTrue(node.logs().grep(mark, "^WARN").getResult().isEmpty());
+        List<String> warnings = node.logs().grep(mark, "^ERROR").getResult();
+        ListAssert<String> assertion = Assertions.assertThat(warnings).isNotEmpty().hasSize(msgs.length);
+        for (String msg : msgs)
+            assertion.anyMatch(m -> m.contains(msg));
+    }
+
+    private void writeSSTables(IInstance node, boolean compact)
+    {
+        node.flush(KEYSPACE);
+        if (compact)
+            node.forceCompact(KEYSPACE, tableName);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/HostReplacementAbruptDownedInstanceTest.java b/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/HostReplacementAbruptDownedInstanceTest.java
index 11a30e5..d7b8f99 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/HostReplacementAbruptDownedInstanceTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/HostReplacementAbruptDownedInstanceTest.java
@@ -44,6 +44,7 @@
 import static org.apache.cassandra.distributed.shared.ClusterUtils.stopAbrupt;
 import static org.apache.cassandra.distributed.test.hostreplacement.HostReplacementTest.setupCluster;
 import static org.apache.cassandra.distributed.test.hostreplacement.HostReplacementTest.validateRows;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class HostReplacementAbruptDownedInstanceTest extends TestBaseImpl
 {
@@ -82,14 +83,14 @@
 //            peers.forEach(p -> validateRows(p.coordinator(), expectedState));
 
             // now create a new node to replace the other node
-            long startNanos = System.nanoTime();
+            long startNanos = nanoTime();
             IInvokableInstance replacingNode = replaceHostAndStart(cluster, nodeToRemove, properties -> {
                 // since node2 was killed abruptly its possible that node2's gossip state has an old schema version
                 // if this happens then bootstrap will fail waiting for a schema version it will never see; to avoid
                 // this, setting this property to log the warning rather than fail bootstrap
                 properties.set(BOOTSTRAP_SKIP_SCHEMA_CHECK, true);
             });
-            logger.info("Host replacement of {} with {} took {}", nodeToRemove, replacingNode, Duration.ofNanos(System.nanoTime() - startNanos));
+            logger.info("Host replacement of {} with {} took {}", nodeToRemove, replacingNode, Duration.ofNanos(nanoTime() - startNanos));
             peers.forEach(p -> awaitRingJoin(p, replacingNode));
 
             // make sure all nodes are healthy
diff --git a/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/NodeCannotJoinAsHibernatingNodeWithoutReplaceAddressTest.java b/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/NodeCannotJoinAsHibernatingNodeWithoutReplaceAddressTest.java
new file mode 100644
index 0000000..7d69248
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/hostreplacement/NodeCannotJoinAsHibernatingNodeWithoutReplaceAddressTest.java
@@ -0,0 +1,133 @@
+/*
+ * 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.distributed.test.hostreplacement;
+
+import java.io.IOException;
+import java.util.Objects;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+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.distributed.Cluster;
+import org.apache.cassandra.distributed.Constants;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.TokenSupplier;
+import org.apache.cassandra.distributed.impl.InstanceIDDefiner;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.service.PendingRangeCalculatorService;
+import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.Shared;
+import org.assertj.core.api.Assertions;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+
+public class NodeCannotJoinAsHibernatingNodeWithoutReplaceAddressTest extends TestBaseImpl
+{
+    @Test
+    public void test() throws IOException, InterruptedException
+    {
+        TokenSupplier even = TokenSupplier.evenlyDistributedTokens(2);
+        try (Cluster cluster = init(Cluster.build(2)
+                                           .withConfig(c -> c.with(Feature.values()).set(Constants.KEY_DTEST_API_STARTUP_FAILURE_AS_SHUTDOWN, false))
+                                           .withInstanceInitializer(BBHelper::install)
+                                           .withTokenSupplier(node -> even.token((node == 3 || node == 4) ? 2 : node))
+                                           .start()))
+        {
+            final IInvokableInstance toReplace = cluster.get(2);
+            final String toReplaceAddress = toReplace.broadcastAddress().getAddress().getHostAddress();
+
+            SharedState.cluster = cluster;
+            cluster.setUncaughtExceptionsFilter((nodeId, cause) -> nodeId > 2); // ignore host replacement errors
+            fixDistributedSchemas(cluster);
+
+            ClusterUtils.stopUnchecked(toReplace);
+
+            try
+            {
+                ClusterUtils.replaceHostAndStart(cluster, toReplace, (inst, ignore) -> ClusterUtils.updateAddress(inst, toReplaceAddress));
+                Assert.fail("Host replacement should exit with an error");
+            }
+            catch (Exception e)
+            {
+                // the instance is expected to fail, but it may not have finished shutdown yet, so wait for it to shutdown
+                SharedState.shutdownComplete.await(1, TimeUnit.MINUTES);
+            }
+
+            IInvokableInstance inst = ClusterUtils.addInstance(cluster, toReplace.config(), c -> c.set("auto_bootstrap", true));
+            ClusterUtils.updateAddress(inst, toReplaceAddress);
+            Assertions.assertThatThrownBy(() -> inst.startup())
+                      .hasMessageContaining("A node with address")
+                      .hasMessageContaining("already exists, cancelling join");
+        }
+    }
+
+    public static class BBHelper
+    {
+        static void install(ClassLoader cl, int nodeNumber)
+        {
+            if (nodeNumber != 3)
+                return;
+            shutdownBeforeNormal(cl);
+        }
+
+        private static void shutdownBeforeNormal(ClassLoader cl)
+        {
+            new ByteBuddy().rebase(PendingRangeCalculatorService.class)
+                           .method(named("blockUntilFinished"))
+                           .intercept(MethodDelegation.to(ShutdownBeforeNormal.class))
+                           .make()
+                           .load(cl, ClassLoadingStrategy.Default.INJECTION);
+        }
+    }
+
+    @Shared
+    public static class SharedState
+    {
+        public static volatile ICluster cluster;
+        // Instance.shutdown can only be called once so only the caller knows when its done (isShutdown looks at a field set BEFORE shutting down..)
+        // since the test needs to know when shutdown completes, add this static state so the caller (bytebuddy rewrite) can update it
+        public static final CountDownLatch shutdownComplete = new CountDownLatch(1);
+    }
+
+    public static class ShutdownBeforeNormal
+    {
+        public static void blockUntilFinished(@SuperCall Runnable fn)
+        {
+            fn.run();
+            int id = Integer.parseInt(InstanceIDDefiner.getInstanceId().replace("node", ""));
+            ICluster cluster = Objects.requireNonNull(SharedState.cluster);
+            // can't stop here as the stop method and start method share a lock; and block gets called in start...
+            ForkJoinPool.commonPool().execute(() -> {
+                ClusterUtils.stopAbrupt(cluster, cluster.get(id));
+                SharedState.shutdownComplete.countDown();
+            });
+            JVMStabilityInspector.killCurrentJVM(new RuntimeException("Attempting to stop the instance"), false);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/jmx/JMXGetterCheckTest.java b/test/distributed/org/apache/cassandra/distributed/test/jmx/JMXGetterCheckTest.java
new file mode 100644
index 0000000..ef0f1ec
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/jmx/JMXGetterCheckTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.distributed.test.jmx;
+
+import java.net.InetAddress;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
+import javax.management.JMRuntimeException;
+import javax.management.MBeanAttributeInfo;
+import javax.management.MBeanInfo;
+import javax.management.MBeanOperationInfo;
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXConnectorServer;
+import javax.management.remote.JMXServiceURL;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+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.cql3.CQLTester.getAutomaticallyAllocatedPort;
+
+public class JMXGetterCheckTest extends TestBaseImpl
+{
+    private static final Set<String> IGNORE_ATTRIBUTES = ImmutableSet.of(
+    "org.apache.cassandra.net:type=MessagingService:BackPressurePerHost" // throws unsupported saying the feature was removed... dropped in CASSANDRA-15375
+    );
+    private static final Set<String> IGNORE_OPERATIONS = ImmutableSet.of(
+    "org.apache.cassandra.db:type=StorageService:stopDaemon", // halts the instance, which then causes the JVM to exit
+    "org.apache.cassandra.db:type=StorageService:drain", // don't drain, it stops things which can cause other APIs to be unstable as we are in a stopped state
+    "org.apache.cassandra.db:type=StorageService:stopGossiping", // if we stop gossip this can cause other issues, so avoid
+    "org.apache.cassandra.db:type=StorageService:resetLocalSchema" // this will fail when there are no other nodes which can serve schema
+    );
+
+    @Test
+    public void test() throws Exception
+    {
+        // start JMX server, which the instance will register with
+        InetAddress loopback = InetAddress.getLoopbackAddress();
+        String jmxHost = loopback.getHostAddress();
+        int jmxPort = getAutomaticallyAllocatedPort(loopback);
+        JMXConnectorServer jmxServer = JMXServerUtils.createJMXServer(jmxPort, true);
+        jmxServer.start();
+        String url = "service:jmx:rmi:///jndi/rmi://" + jmxHost + ":" + jmxPort + "/jmxrmi";
+
+        IS_DISABLED_MBEAN_REGISTRATION.setBoolean(false);
+        try (Cluster cluster = Cluster.build(1).withConfig(c -> c.with(Feature.values())).start())
+        {
+            List<Named> errors = new ArrayList<>();
+            try (JMXConnector jmxc = JMXConnectorFactory.connect(new JMXServiceURL(url), null))
+            {
+                MBeanServerConnection mbsc = jmxc.getMBeanServerConnection();
+                Set<ObjectName> metricNames = new TreeSet<>(mbsc.queryNames(null, null));
+                for (ObjectName name : metricNames)
+                {
+                    if (!name.getDomain().startsWith("org.apache.cassandra"))
+                        continue;
+                    MBeanInfo info = mbsc.getMBeanInfo(name);
+                    for (MBeanAttributeInfo a : info.getAttributes())
+                    {
+                        String fqn = String.format("%s:%s", name, a.getName());
+                        if (!a.isReadable() || IGNORE_ATTRIBUTES.contains(fqn))
+                            continue;
+                        try
+                        {
+                            mbsc.getAttribute(name, a.getName());
+                        }
+                        catch (JMRuntimeException e)
+                        {
+                            errors.add(new Named(String.format("Attribute %s", fqn), e.getCause()));
+                        }
+                    }
+
+                    for (MBeanOperationInfo o : info.getOperations())
+                    {
+                        String fqn = String.format("%s:%s", name, o.getName());
+                        if (o.getSignature().length != 0 || IGNORE_OPERATIONS.contains(fqn))
+                            continue;
+                        try
+                        {
+                            mbsc.invoke(name, o.getName(), new Object[0], new String[0]);
+                        }
+                        catch (JMRuntimeException e)
+                        {
+                            errors.add(new Named(String.format("Operation %s", fqn), e.getCause()));
+                        }
+                    }
+                }
+            }
+            if (!errors.isEmpty())
+            {
+                AssertionError root = new AssertionError();
+                errors.forEach(root::addSuppressed);
+                throw root;
+            }
+        }
+    }
+
+    /**
+     * This class is meant to make new errors easier to read, by adding the JMX endpoint, and cleaning up the unneded JMX/Reflection logic cluttering the stacktrace
+     */
+    private static class Named extends RuntimeException
+    {
+        public Named(String msg, Throwable cause)
+        {
+            super(msg + "\nCaused by: " + cause.getClass().getCanonicalName() + ": " + cause.getMessage(), cause.getCause());
+            StackTraceElement[] stack = cause.getStackTrace();
+            List<StackTraceElement> copy = new ArrayList<>();
+            for (StackTraceElement s : stack)
+            {
+                if (!s.getClassName().startsWith("org.apache.cassandra"))
+                    break;
+                copy.add(s);
+            }
+            Collections.reverse(copy);
+            setStackTrace(copy.toArray(new StackTraceElement[0]));
+        }
+    }
+}
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 3540acd..08c9324 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/metric/TableMetricTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/metric/TableMetricTest.java
@@ -41,8 +41,9 @@
 import org.apache.cassandra.distributed.Cluster;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
 import org.apache.cassandra.distributed.test.TestBaseImpl;
-import org.apache.cassandra.repair.SystemDistributedKeyspace;
+import org.apache.cassandra.schema.SystemDistributedKeyspace;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaKeyspace;
 import org.apache.cassandra.tracing.TraceKeyspace;
 import org.apache.cassandra.utils.MBeanWrapper;
 
@@ -120,7 +121,7 @@
         SYSTEM_TABLES = cluster.get(1).callOnInstance(() -> {
             Map<String, Collection<String>> map = new HashMap<>();
             Arrays.asList(SystemKeyspace.metadata(), AuthKeyspace.metadata(), SystemDistributedKeyspace.metadata(),
-                          Schema.getSystemKeyspaceMetadata(), TraceKeyspace.metadata())
+                          SchemaKeyspace.metadata(), TraceKeyspace.metadata())
                   .forEach(meta -> {
                       Set<String> tables = meta.tables.stream().map(t -> t.name).collect(Collectors.toSet());
                       map.put(meta.name, tables);
diff --git a/test/distributed/org/apache/cassandra/distributed/test/metrics/HintsServiceMetricsTest.java b/test/distributed/org/apache/cassandra/distributed/test/metrics/HintsServiceMetricsTest.java
index a47c782..0fc9bff 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/metrics/HintsServiceMetricsTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/metrics/HintsServiceMetricsTest.java
@@ -20,7 +20,6 @@
 
 import java.util.Arrays;
 import java.util.concurrent.Callable;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -38,6 +37,7 @@
 import org.apache.cassandra.hints.Hint;
 import org.apache.cassandra.metrics.HintsServiceMetrics;
 import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.awaitility.core.ThrowingRunnable;
 
 import static java.util.concurrent.TimeUnit.MINUTES;
@@ -69,6 +69,7 @@
                                         .withInstanceInitializer(FailHints::install)
                                         .start())
         {
+            cluster.setUncaughtExceptionsFilter(t -> "Injected failure".equals(t.getMessage()));
             // setup a message filter to drop some of the hint request messages from node1
             AtomicInteger hintsNode2 = new AtomicInteger();
             AtomicInteger hintsNode3 = new AtomicInteger();
@@ -152,6 +153,7 @@
         await().atMost(5, MINUTES)
                .pollDelay(0, SECONDS)
                .pollInterval(1, SECONDS)
+               .dontCatchUncaughtExceptions()
                .untilAsserted(assertion);
     }
 
@@ -221,7 +223,7 @@
                            .load(cl, ClassLoadingStrategy.Default.INJECTION);
         }
 
-        public static CompletableFuture<?> execute(@SuperCall Callable<CompletableFuture<?>> r) throws Exception
+        public static Future<?> execute(@SuperCall Callable<Future<?>> r) throws Exception
         {
             if (numHints.incrementAndGet() <= NUM_FAILURES_PER_NODE)
                 throw new RuntimeException("Injected failure");
diff --git a/test/distributed/org/apache/cassandra/distributed/test/repair/ForceRepairTest.java b/test/distributed/org/apache/cassandra/distributed/test/repair/ForceRepairTest.java
new file mode 100644
index 0000000..946c41e
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/repair/ForceRepairTest.java
@@ -0,0 +1,191 @@
+/*
+ * 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.distributed.test.repair;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.apache.commons.lang3.ArrayUtils;
+import org.junit.Test;
+
+import com.carrotsearch.hppc.LongArrayList;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.lifecycle.View;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.QueryResults;
+import org.apache.cassandra.distributed.api.SimpleQueryResult;
+import org.apache.cassandra.distributed.shared.AssertUtils;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.FBUtilities;
+import org.assertj.core.api.Assertions;
+
+public class ForceRepairTest extends TestBaseImpl
+{
+    /**
+     * Port of python dtest "repair_tests/incremental_repair_test.py::TestIncRepair::test_force" but extends to test
+     * all types of repair.
+     */
+    @Test
+    public void force() throws IOException
+    {
+        force(false);
+    }
+
+    @Test
+    public void forceWithDifference() throws IOException
+    {
+        force(true);
+    }
+
+    private void force(boolean includeDifference) throws IOException
+    {
+        long nowInMicro = System.currentTimeMillis() * 1000;
+        try (Cluster cluster = Cluster.build(3)
+                                      .withConfig(c -> c.set("hinted_handoff_enabled", false)
+                                                        .with(Feature.values()))
+                                      .start())
+        {
+            init(cluster);
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (k INT PRIMARY KEY, v INT)"));
+
+            for (int i = 0; i < 10; i++)
+                cluster.coordinator(1).execute(withKeyspace("INSERT INTO %s.tbl (k,v) VALUES (?, ?) USING TIMESTAMP ?"), ConsistencyLevel.ALL, i, i, nowInMicro++);
+
+            String downAddress = cluster.get(2).callOnInstance(() -> FBUtilities.getBroadcastAddressAndPort().getHostAddressAndPort());
+            ClusterUtils.stopUnchecked(cluster.get(2));
+            cluster.get(1).runOnInstance(() -> {
+                InetAddressAndPort neighbor;
+                try
+                {
+                    neighbor = InetAddressAndPort.getByName(downAddress);
+                }
+                catch (UnknownHostException e)
+                {
+                    throw new RuntimeException(e);
+                }
+                while (FailureDetector.instance.isAlive(neighbor))
+                    Uninterruptibles.sleepUninterruptibly(500, TimeUnit.MILLISECONDS);
+            });
+
+
+            // repair should fail because node2 is down
+            IInvokableInstance node1 = cluster.get(1);
+
+            for (String[] args : Arrays.asList(new String[]{ "--full" },
+                                               new String[]{ "--full", "--preview" },
+                                               new String[]{ "--full", "--validate"}, // nothing should be in the repaired set, so shouldn't stream
+                                               new String[]{ "--preview" }, // IR Preview
+                                               new String[]{ "--validate"}, // nothing should be in the repaired set, so shouldn't stream
+                                               new String[0])) // IR
+            {
+                if (includeDifference)
+                    node1.executeInternal(withKeyspace("INSERT INTO %s.tbl (k,v) VALUES (?, ?) USING TIMESTAMP ?"), -1, -1, nowInMicro++); // each loop should have a different timestamp, causing a new difference
+
+                try
+                {
+                    node1.nodetoolResult(ArrayUtils.addAll(new String[] {"repair", KEYSPACE}, args)).asserts().failure();
+                    node1.nodetoolResult(ArrayUtils.addAll(new String[] {"repair", KEYSPACE, "--force"}, args)).asserts().success();
+
+                    assertNoRepairedAt(cluster);
+                }
+                catch (Exception | Error e)
+                {
+                    // tag the error to include which args broke
+                    e.addSuppressed(new AssertionError("Failure for args: " + Arrays.toString(args)));
+                    throw e;
+                }
+            }
+
+            if (includeDifference)
+            {
+                SimpleQueryResult expected = QueryResults.builder()
+                                                         .row(-1, -1)
+                                                         .build();
+                for (IInvokableInstance node : Arrays.asList(node1, cluster.get(3)))
+                {
+                    SimpleQueryResult results = node.executeInternalWithResult(withKeyspace("SELECT * FROM %s.tbl WHERE k=?"), -1);
+                    expected.reset();
+                    AssertUtils.assertRows(results, expected);
+                }
+            }
+        }
+    }
+
+    private static void assertNoRepairedAt(Cluster cluster)
+    {
+        List<long[]> repairedAt = getRepairedAt(cluster, KEYSPACE, "tbl");
+        Assertions.assertThat(repairedAt).hasSize(cluster.size());
+        for (int i = 0; i < repairedAt.size(); i++)
+        {
+            long[] array = repairedAt.get(i);
+            if (array == null)
+            {
+                // ignore downed nodes
+                Assertions.assertThat(cluster.get(i + 1).isShutdown()).isTrue();
+                continue;
+            }
+            Assertions.assertThat(array).isNotEmpty();
+            for (long a : array)
+                Assertions.assertThat(a).describedAs("node%d had a repaired sstable", i + 1).isEqualTo(0);
+        }
+    }
+
+    private static List<long[]> getRepairedAt(Cluster cluster, String keyspace, String table)
+    {
+        return cluster.stream().map(i -> {
+            if (i.isShutdown())
+                return null;
+
+            return i.callOnInstance(() -> {
+                TableMetadata meta = Schema.instance.getTableMetadata(keyspace, table);
+                ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(meta.id);
+
+                View view = cfs.getTracker().getView();
+                LongArrayList list = new LongArrayList();
+                for (SSTableReader sstable : view.liveSSTables())
+                {
+                    try
+                    {
+                        StatsMetadata metadata = sstable.getSSTableMetadata();
+                        list.add(metadata.repairedAt);
+                    }
+                    catch (Exception e)
+                    {
+                        // ignore
+                    }
+                }
+                return list.toArray();
+            });
+        }).collect(Collectors.toList());
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ring/AutoBootstrapTest.java b/test/distributed/org/apache/cassandra/distributed/test/ring/AutoBootstrapTest.java
index 3051639..dd8b7be 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/AutoBootstrapTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/AutoBootstrapTest.java
@@ -49,7 +49,7 @@
                                         .withConfig(config -> config.with(NETWORK, GOSSIP))
                                         .start())
         {
-            populate(cluster,0, 100);
+            populate(cluster, 0, 100);
             bootstrapAndJoinNode(cluster);
 
             for (Map.Entry<Integer, Long> e : count(cluster).entrySet())
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 d6e715a..423e78b 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/BootstrapTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/BootstrapTest.java
@@ -18,13 +18,17 @@
 
 package org.apache.cassandra.distributed.test.ring;
 
+import java.lang.management.ManagementFactory;
 import java.util.Map;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
+import org.junit.After;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.Test;
 
+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.ICluster;
@@ -44,6 +48,27 @@
 
 public class BootstrapTest extends TestBaseImpl
 {
+    private long savedMigrationDelay;
+
+    @Before
+    public void beforeTest()
+    {
+        // MigrationCoordinator schedules schema pull requests immediatelly when the node is just starting up, otherwise
+        // the first pull request is sent in 60 seconds. Whether we are starting up or not is detected by examining
+        // the node up-time and if it is lower than MIGRATION_DELAY, we consider the server is starting up.
+        // When we are running multiple test cases in the class, where each starts a node but in the same JVM, the
+        // up-time will be more or less relevant only for the first test. In order to enforce the startup-like behaviour
+        // for each test case, the MIGRATION_DELAY time is adjusted accordingly
+        savedMigrationDelay = CassandraRelevantProperties.MIGRATION_DELAY.getLong();
+        CassandraRelevantProperties.MIGRATION_DELAY.setLong(ManagementFactory.getRuntimeMXBean().getUptime() + savedMigrationDelay);
+    }
+
+    @After
+    public void afterTest()
+    {
+        CassandraRelevantProperties.MIGRATION_DELAY.setLong(savedMigrationDelay);
+    }
+
     @Test
     public void bootstrapTest() throws Throwable
     {
@@ -56,7 +81,7 @@
                                         .withConfig(config -> config.with(NETWORK, GOSSIP))
                                         .start())
         {
-            populate(cluster,0, 100);
+            populate(cluster, 0, 100);
 
             IInstanceConfig config = cluster.newInstanceConfig();
             IInvokableInstance newInstance = cluster.bootstrap(config);
@@ -95,7 +120,7 @@
 
             cluster.forEach(statusToBootstrap(newInstance));
 
-            populate(cluster,0, 100);
+            populate(cluster, 0, 100);
 
             Assert.assertEquals(100, newInstance.executeInternal("SELECT *FROM " + KEYSPACE + ".tbl").length);
         }
@@ -125,5 +150,4 @@
                         .collect(Collectors.toMap(nodeId -> nodeId,
                                                   nodeId -> (Long) cluster.get(nodeId).executeInternal("SELECT count(*) FROM " + KEYSPACE + ".tbl")[0][0]));
     }
-
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ring/CommunicationDuringDecommissionTest.java b/test/distributed/org/apache/cassandra/distributed/test/ring/CommunicationDuringDecommissionTest.java
index d6825d9..631ea91 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/CommunicationDuringDecommissionTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/CommunicationDuringDecommissionTest.java
@@ -33,6 +33,7 @@
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
 import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 public class CommunicationDuringDecommissionTest extends TestBaseImpl
 {
@@ -53,10 +54,10 @@
 
 
             Map<Integer, Long> connectionAttempts = new HashMap<>();
-            long deadline = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(10);
+            long deadline = currentTimeMillis() + TimeUnit.SECONDS.toMillis(10);
 
             // Wait 10 seconds and check if there are any new connection attempts to the decomissioned node
-            while (System.currentTimeMillis() <= deadline)
+            while (currentTimeMillis() <= deadline)
             {
                 for (int i = 2; i <= cluster.size(); i++)
                 {
@@ -73,4 +74,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
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 8daa58a..2e702b2 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/PendingWritesTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/PendingWritesTest.java
@@ -106,4 +106,4 @@
                 Assert.assertEquals("Node " + e.getKey() + " has incorrect row state", e.getValue().longValue(), 150L);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/ring/ReadsDuringBootstrapTest.java b/test/distributed/org/apache/cassandra/distributed/test/ring/ReadsDuringBootstrapTest.java
index 4898479..ba2cdc5 100644
--- a/test/distributed/org/apache/cassandra/distributed/test/ring/ReadsDuringBootstrapTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/test/ring/ReadsDuringBootstrapTest.java
@@ -50,6 +50,7 @@
 
 public class ReadsDuringBootstrapTest extends TestBaseImpl
 {
+
     @Test
     public void readsDuringBootstrapTest() throws IOException, ExecutionException, InterruptedException, TimeoutException
     {
@@ -60,8 +61,8 @@
                                         .withTokenSupplier(TokenSupplier.evenlyDistributedTokens(expandedNodeCount))
                                         .withNodeIdTopology(NetworkTopology.singleDcNetworkTopology(expandedNodeCount, "dc0", "rack0"))
                                         .withConfig(config -> config.with(NETWORK, GOSSIP)
-                                                                    .set("read_request_timeout_in_ms", Integer.MAX_VALUE)
-                                                                    .set("request_timeout_in_ms", Integer.MAX_VALUE))
+                                                                    .set("read_request_timeout", String.format("%dms", Integer.MAX_VALUE))
+                                                                    .set("request_timeout", String.format("%dms", Integer.MAX_VALUE)))
                                         .withInstanceInitializer(BB::install)
                                         .start())
         {
@@ -90,6 +91,7 @@
     {
         public static final AtomicBoolean block = new AtomicBoolean();
         public static final CountDownLatch latch = new CountDownLatch(1);
+
         private static void install(ClassLoader cl, Integer instanceId)
         {
             if (instanceId != 1)
@@ -110,5 +112,4 @@
             return zuper.call();
         }
     }
-
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/test/streaming/RebuildStreamingTest.java b/test/distributed/org/apache/cassandra/distributed/test/streaming/RebuildStreamingTest.java
new file mode 100644
index 0000000..ee41ec4
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/streaming/RebuildStreamingTest.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.cassandra.distributed.test.streaming;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Collections;
+
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.Row;
+import org.apache.cassandra.distributed.api.SimpleQueryResult;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.distributed.util.QueryResultUtil;
+import org.assertj.core.api.Assertions;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class RebuildStreamingTest extends TestBaseImpl
+{
+    private static final ByteBuffer BLOB = ByteBuffer.wrap(new byte[1 << 16]);
+    // zero copy streaming sends all components, so the events will include non-Data files as well
+    private static final int NUM_COMPONENTS = 7;
+
+    @Test
+    public void zeroCopy() throws IOException
+    {
+        test(true);
+    }
+
+    @Test
+    public void notZeroCopy() throws IOException
+    {
+        test(false);
+    }
+
+    private void test(boolean zeroCopyStreaming) throws IOException
+    {
+        try (Cluster cluster = init(Cluster.build(2)
+                                           .withConfig(c -> c.with(Feature.values())
+                                                             .set("stream_entire_sstables", zeroCopyStreaming).set("streaming_slow_events_log_timeout", "0s"))
+                                           .start()))
+        {
+            // streaming sends events every 65k, so need to make sure that the files are larger than this to hit
+            // all cases of the vtable
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.users (user_id varchar, spacing blob, PRIMARY KEY (user_id)) WITH compression = { 'enabled' : false };"));
+            cluster.stream().forEach(i -> i.nodetoolResult("disableautocompaction", KEYSPACE).asserts().success());
+            IInvokableInstance first = cluster.get(1);
+            IInvokableInstance second = cluster.get(2);
+            long expectedFiles = 10;
+            for (int i = 0; i < expectedFiles; i++)
+            {
+                first.executeInternal(withKeyspace("insert into %s.users(user_id, spacing) values (?, ? )"), "dcapwell" + i, BLOB);
+                first.flush(KEYSPACE);
+            }
+            if (zeroCopyStreaming) // will include all components so need to account for
+                expectedFiles *= NUM_COMPONENTS;
+
+            second.nodetoolResult("rebuild", "--keyspace", KEYSPACE).asserts().success();
+
+            SimpleQueryResult qr = first.executeInternalWithResult("SELECT * FROM system_views.streaming");
+            String txt = QueryResultUtil.expand(qr);
+            qr.reset();
+            assertThat(qr.toObjectArrays().length).describedAs("Found rows\n%s", txt).isEqualTo(1);
+            assertThat(qr.hasNext()).isTrue();
+            Row row = qr.next();
+            QueryResultUtil.assertThat(row)
+                           .isEqualTo("peers", Collections.singletonList("/127.0.0.2:7012"))
+                           .isEqualTo("follower", true)
+                           .isEqualTo("operation", "Rebuild")
+                           .isEqualTo("status", "success")
+                           .isEqualTo("progress_percentage", 100.0F)
+                           .isEqualTo("success_message", null).isEqualTo("failure_cause", null)
+                           .isEqualTo("files_sent", expectedFiles)
+                           .columnsEqualTo("files_sent", "files_to_send")
+                           .columnsEqualTo("bytes_sent", "bytes_to_send")
+                           .isEqualTo("files_received", 0L)
+                           .columnsEqualTo("files_received", "files_to_receive", "bytes_received", "bytes_to_receive");
+            long totalBytes = row.getLong("bytes_sent");
+            assertThat(totalBytes).isGreaterThan(0);
+
+            qr = second.executeInternalWithResult("SELECT * FROM system_views.streaming");
+            txt = QueryResultUtil.expand(qr);
+            qr.reset();
+            assertThat(qr.toObjectArrays().length).describedAs("Found rows\n%s", txt).isEqualTo(1);
+            assertThat(qr.hasNext()).isTrue();
+
+            QueryResultUtil.assertThat(qr.next())
+                           .isEqualTo("peers", Collections.singletonList("/127.0.0.1:7012"))
+                           .isEqualTo("follower", false)
+                           .isEqualTo("operation", "Rebuild")
+                           .isEqualTo("status", "success")
+                           .isEqualTo("progress_percentage", 100.0F)
+                           .isEqualTo("success_message", null).isEqualTo("failure_cause", null)
+                           .columnsEqualTo("files_to_receive", "files_received").isEqualTo("files_received", expectedFiles)
+                           .columnsEqualTo("bytes_to_receive", "bytes_received").isEqualTo("bytes_received", totalBytes)
+                           .columnsEqualTo("files_sent", "files_to_send", "bytes_sent", "bytes_to_send").isEqualTo("files_sent", 0L);
+
+            // did we trigger slow event log?
+            cluster.forEach(i -> Assertions.assertThat(i.logs().grep("Handling streaming events took longer than").getResult()).describedAs("Unable to find slow log for node%d", i.config().num()).isNotEmpty());
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/streaming/StreamCloseInMiddleTest.java b/test/distributed/org/apache/cassandra/distributed/test/streaming/StreamCloseInMiddleTest.java
new file mode 100644
index 0000000..fc52ab6
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/streaming/StreamCloseInMiddleTest.java
@@ -0,0 +1,196 @@
+/*
+ * 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.distributed.test.streaming;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.concurrent.Callable;
+import java.util.stream.Collectors;
+
+import org.junit.Test;
+
+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.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.db.streaming.CassandraIncomingFile;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.TokenSupplier;
+import org.apache.cassandra.distributed.shared.ClusterUtils;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.io.sstable.format.RangeAwareSSTableWriter;
+import org.apache.cassandra.io.sstable.format.big.BigTableZeroCopyWriter;
+import org.apache.cassandra.io.util.SequentialWriter;
+import org.assertj.core.api.Assertions;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static net.bytebuddy.matcher.ElementMatchers.takesArguments;
+
+public class StreamCloseInMiddleTest extends TestBaseImpl
+{
+    @Test
+    public void zeroCopy() throws IOException
+    {
+        streamClose(true);
+    }
+
+    @Test
+    public void notZeroCopy() throws IOException
+    {
+        streamClose(false);
+    }
+
+    private void streamClose(boolean zeroCopyStreaming) throws IOException
+    {
+        try (Cluster cluster = Cluster.build(2)
+                                      .withTokenSupplier(TokenSupplier.evenlyDistributedTokens(3))
+                                      .withInstanceInitializer(BBHelper::install)
+                                      .withConfig(c -> c.with(Feature.values())
+                                                        .set("stream_entire_sstables", zeroCopyStreaming)
+                                                        // when die, this will try to halt JVM, which is easier to validate in the test
+                                                        // other levels require checking state of the subsystems
+                                                        .set("disk_failure_policy", "die"))
+                                      .start())
+        {
+            init(cluster);
+
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl (pk int PRIMARY KEY)"));
+
+            triggerStreaming(cluster, zeroCopyStreaming);
+            // make sure disk failure policy is not triggered
+            assertNoNodeShutdown(cluster);
+
+            // now bootstrap a new node; streaming will fail
+            IInvokableInstance node3 = ClusterUtils.addInstance(cluster, cluster.get(1).config(), c -> c.set("auto_bootstrap", true));
+            node3.startup();
+            for (String line : Arrays.asList("Error while waiting on bootstrap to complete. Bootstrap will have to be restarted", // bootstrap failed
+                                             "Some data streaming failed. Use nodetool to check bootstrap state and resume")) // didn't join ring because bootstrap failed
+                Assertions.assertThat(node3.logs().grep(line).getResult())
+                          .hasSize(1);
+
+            assertNoNodeShutdown(cluster);
+        }
+    }
+
+    private void assertNoNodeShutdown(Cluster cluster)
+    {
+        AssertionError t = null;
+        for (IInvokableInstance i : cluster.stream().collect(Collectors.toList()))
+        {
+            try
+            {
+                Assertions.assertThat(i.isShutdown()).describedAs("%s was shutdown; this is not expected", i).isFalse();
+                Assertions.assertThat(i.killAttempts()).describedAs("%s saw kill attempts; this is not expected", i).isEqualTo(0);
+            }
+            catch (AssertionError t2)
+            {
+                if (t == null)
+                    t = t2;
+                else
+                    t.addSuppressed(t2);
+            }
+        }
+        if (t != null)
+            throw t;
+    }
+
+    private static void triggerStreaming(Cluster cluster, boolean expectedEntireSSTable)
+    {
+        IInvokableInstance node1 = cluster.get(1);
+        IInvokableInstance node2 = cluster.get(2);
+
+        // repair will do streaming IFF there is a mismatch; so cause one
+        for (int i = 0; i < 10; i++)
+            node1.executeInternal(withKeyspace("INSERT INTO %s.tbl (pk) VALUES (?)"), i); // timestamp won't match, causing a mismatch
+
+        // trigger streaming; expected to fail as streaming socket closed in the middle (currently this is an unrecoverable event)
+        node2.nodetoolResult("repair", "-full", KEYSPACE, "tbl").asserts().failure();
+
+        assertStreamingType(node2, expectedEntireSSTable);
+    }
+
+    private static void assertStreamingType(IInvokableInstance node, boolean expectedEntireSSTable)
+    {
+        String key = "org.apache.cassandra.metrics.Streaming.%s./127.0.0.1.7012";
+        long entire = node.metrics().getCounter(String.format(key, "EntireSSTablesStreamedIn"));
+        long partial = node.metrics().getCounter(String.format(key, "PartialSSTablesStreamedIn"));
+        if (expectedEntireSSTable)
+        {
+            Assertions.assertThat(partial).isEqualTo(0);
+            Assertions.assertThat(entire).isGreaterThan(0);
+        }
+        else
+        {
+            Assertions.assertThat(partial).isGreaterThan(0);
+            Assertions.assertThat(entire).isEqualTo(0);
+        }
+    }
+
+    public static class BBHelper
+    {
+        @SuppressWarnings("unused")
+        public static int writeDirectlyToChannel(ByteBuffer buf, @SuperCall Callable<Integer> zuper) throws Exception
+        {
+            if (isCaller(BigTableZeroCopyWriter.class.getName(), "write"))
+                throw new java.nio.channels.ClosedChannelException();
+            // different context; pass through
+            return zuper.call();
+        }
+
+        @SuppressWarnings("unused")
+        public static boolean append(UnfilteredRowIterator partition, @SuperCall Callable<Boolean> zuper) throws Exception
+        {
+            if (isCaller(CassandraIncomingFile.class.getName(), "read")) // handles compressed and non-compressed
+                throw new java.nio.channels.ClosedChannelException();
+            // different context; pass through
+            return zuper.call();
+        }
+
+        private static boolean isCaller(String klass, String method)
+        {
+            //TODO is there a cleaner way to check this?
+            StackTraceElement[] stack = Thread.currentThread().getStackTrace();
+            for (int i = 0; i < stack.length; i++)
+            {
+                StackTraceElement e = stack[i];
+                if (klass.equals(e.getClassName()) && method.equals(e.getMethodName()))
+                    return true;
+            }
+            return false;
+        }
+
+        public static void install(ClassLoader classLoader, Integer num)
+        {
+            new ByteBuddy().rebase(SequentialWriter.class)
+                           .method(named("writeDirectlyToChannel").and(takesArguments(1)))
+                           .intercept(MethodDelegation.to(BBHelper.class))
+                           .make()
+                           .load(classLoader, ClassLoadingStrategy.Default.INJECTION);
+
+            new ByteBuddy().rebase(RangeAwareSSTableWriter.class)
+                           .method(named("append").and(takesArguments(1)))
+                           .intercept(MethodDelegation.to(BBHelper.class))
+                           .make()
+                           .load(classLoader, ClassLoadingStrategy.Default.INJECTION);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/streaming/StreamingStatsDisabledTest.java b/test/distributed/org/apache/cassandra/distributed/test/streaming/StreamingStatsDisabledTest.java
new file mode 100644
index 0000000..f3d4394
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/streaming/StreamingStatsDisabledTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.distributed.test.streaming;
+
+import java.io.IOException;
+import java.util.Arrays;
+
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.distributed.util.QueryResultUtil;
+import org.apache.cassandra.streaming.StreamManager;
+
+public class StreamingStatsDisabledTest extends TestBaseImpl
+{
+    @Test
+    public void test() throws IOException
+    {
+        try (Cluster cluster = init(Cluster.build(2)
+                                           .withConfig(c -> c.with(Feature.values()).set("streaming_stats_enabled", false))
+                                           .start()))
+        {
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.users (user_id varchar, PRIMARY KEY (user_id));"));
+            cluster.stream().forEach(i -> i.nodetoolResult("disableautocompaction", KEYSPACE).asserts().success());
+
+            long expectedFiles = 10;
+            for (int i = 0; i < expectedFiles; i++)
+            {
+                cluster.get(1).executeInternal(withKeyspace("insert into %s.users(user_id) values (?)"), "dcapwell" + i);
+                cluster.get(1).flush(KEYSPACE);
+            }
+
+            cluster.get(2).nodetoolResult("rebuild", "--keyspace", KEYSPACE).asserts().success();
+            for (int nodeId : Arrays.asList(1, 2))
+                QueryResultUtil.assertThat(cluster.get(nodeId).executeInternalWithResult("SELECT * FROM system_views.streaming")).isEmpty();
+
+            // trigger streaming again
+            cluster.get(1).executeInternal(withKeyspace("INSERT INTO %s.users(user_id) VALUES ('trigger streaming')"));
+            // mimic JMX
+            cluster.get(2).runOnInstance(() -> StreamManager.instance.setStreamingStatsEnabled(true));
+            cluster.get(2).nodetoolResult("repair", KEYSPACE).asserts().success();
+
+            QueryResultUtil.assertThat(cluster.get(1).executeInternalWithResult("SELECT * FROM system_views.streaming")).isEmpty();
+            QueryResultUtil.assertThat(cluster.get(2).executeInternalWithResult("SELECT * FROM system_views.streaming")).hasSize(1);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/thresholds/AbstractClientSizeWarning.java b/test/distributed/org/apache/cassandra/distributed/test/thresholds/AbstractClientSizeWarning.java
new file mode 100644
index 0000000..2355403
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/thresholds/AbstractClientSizeWarning.java
@@ -0,0 +1,390 @@
+/*
+ * 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.distributed.test.thresholds;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import java.util.function.Consumer;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.SimpleStatement;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.ICoordinator;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.SimpleQueryResult;
+import org.apache.cassandra.distributed.test.JavaDriverUtils;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.exceptions.ReadSizeAbortException;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.service.reads.thresholds.CoordinatorWarnings;
+import org.assertj.core.api.Condition;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public abstract class AbstractClientSizeWarning extends TestBaseImpl
+{
+    private static final String CQL_PK_READ = "SELECT * FROM " + KEYSPACE + ".tbl WHERE pk=1";
+    private static final String CQL_TABLE_SCAN = "SELECT * FROM " + KEYSPACE + ".tbl";
+
+    private static final Random RANDOM = new Random(0);
+    protected static ICluster<IInvokableInstance> CLUSTER;
+    protected static com.datastax.driver.core.Cluster JAVA_DRIVER;
+    protected static com.datastax.driver.core.Session JAVA_DRIVER_SESSION;
+
+    @BeforeClass
+    public static void setupClass() throws IOException
+    {
+        Cluster.Builder builder = Cluster.build(3);
+        builder.withConfig(c -> c.with(Feature.NATIVE_PROTOCOL, Feature.GOSSIP));
+        CLUSTER = builder.start();
+        JAVA_DRIVER = JavaDriverUtils.create(CLUSTER);
+        JAVA_DRIVER_SESSION = JAVA_DRIVER.connect();
+    }
+
+    protected abstract long totalWarnings();
+    protected abstract long totalAborts();
+    protected abstract void assertWarnings(List<String> warnings);
+    protected abstract void assertAbortWarnings(List<String> warnings);
+    protected boolean shouldFlush()
+    {
+        return false;
+    }
+
+    @Before
+    public void setup()
+    {
+        CLUSTER.schemaChange("DROP KEYSPACE IF EXISTS " + KEYSPACE);
+        init(CLUSTER);
+        // disable key cache so RowIndexEntry is read each time
+        CLUSTER.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v blob, PRIMARY KEY (pk, ck)) WITH caching = { 'keys' : 'NONE'}");
+    }
+
+    @Test
+    public void noWarningsSinglePartition()
+    {
+        noWarnings(CQL_PK_READ);
+    }
+
+    @Test
+    public void noWarningsScan()
+    {
+        noWarnings(CQL_TABLE_SCAN);
+    }
+
+    public void noWarnings(String cql)
+    {
+        CLUSTER.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 1, ?)", ConsistencyLevel.ALL, bytes(128));
+        CLUSTER.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, 2, ?)", ConsistencyLevel.ALL, bytes(128));
+        if (shouldFlush())
+            CLUSTER.stream().forEach(i -> i.flush(KEYSPACE));
+
+        Consumer<List<String>> test = warnings ->
+                                      Assert.assertEquals(Collections.emptyList(), warnings);
+
+        for (boolean b : Arrays.asList(true, false))
+        {
+            enable(b);
+            checkpointHistogram();
+            SimpleQueryResult result = CLUSTER.coordinator(1).executeWithResult(cql, ConsistencyLevel.ALL);
+            test.accept(result.warnings());
+            if (b)
+            {
+                assertHistogramUpdated();
+            }
+            else
+            {
+                assertHistogramNotUpdated();
+            }
+            test.accept(driverQueryAll(cql).getExecutionInfo().getWarnings());
+            if (b)
+            {
+                assertHistogramUpdated();
+            }
+            else
+            {
+                assertHistogramNotUpdated();
+            }
+            assertWarnAborts(0, 0, 0);
+        }
+    }
+
+    @Test
+    public void warnThresholdSinglePartition()
+    {
+        warnThreshold(CQL_PK_READ, false);
+    }
+
+    @Test
+    public void warnThresholdScan()
+    {
+        warnThreshold(CQL_TABLE_SCAN, false);
+    }
+
+    @Test
+    public void warnThresholdSinglePartitionWithReadRepair()
+    {
+        warnThreshold(CQL_PK_READ, true);
+    }
+
+    @Test
+    public void warnThresholdScanWithReadRepair()
+    {
+        warnThreshold(CQL_TABLE_SCAN, true);
+    }
+
+    protected int warnThresholdRowCount()
+    {
+        return 2;
+    }
+
+    public void warnThreshold(String cql, boolean triggerReadRepair)
+    {
+        for (int i = 0; i < warnThresholdRowCount(); i++)
+        {
+            if (triggerReadRepair)
+            {
+                int finalI = i;
+                // cell timestamps will not match (even though the values match) which will trigger a read-repair
+                CLUSTER.stream().forEach(node -> node.executeInternal("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, ?, ?)", finalI + 1, bytes(512)));
+            }
+            else
+            {
+                CLUSTER.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, ?, ?)", ConsistencyLevel.ALL, i + 1, bytes(512));
+            }
+        }
+
+        if (shouldFlush())
+            CLUSTER.stream().forEach(i -> i.flush(KEYSPACE));
+
+        enable(true);
+        checkpointHistogram();
+        SimpleQueryResult result = CLUSTER.coordinator(1).executeWithResult(cql, ConsistencyLevel.ALL);
+        assertWarnings(result.warnings());
+        assertHistogramUpdated();
+        assertWarnAborts(1, 0, 0);
+        assertWarnings(driverQueryAll(cql).getExecutionInfo().getWarnings());
+        assertHistogramUpdated();
+        assertWarnAborts(2, 0, 0);
+
+        enable(false);
+        result = CLUSTER.coordinator(1).executeWithResult(cql, ConsistencyLevel.ALL);
+        assertThat(result.warnings()).isEmpty();
+        assertHistogramNotUpdated();
+        assertThat(driverQueryAll(cql).getExecutionInfo().getWarnings()).isEmpty();
+        assertHistogramNotUpdated();
+        assertWarnAborts(2, 0, 0);
+    }
+
+    @Test
+    public void failThresholdSinglePartitionTrackingEnabled() throws UnknownHostException
+    {
+        failThresholdEnabled(CQL_PK_READ);
+    }
+
+    @Test
+    public void failThresholdSinglePartitionTrackingDisabled() throws UnknownHostException
+    {
+        failThresholdDisabled(CQL_PK_READ);
+    }
+
+    @Test
+    public void failThresholdScanTrackingEnabled() throws UnknownHostException
+    {
+        failThresholdEnabled(CQL_TABLE_SCAN);
+    }
+
+    @Test
+    public void failThresholdScanTrackingDisabled() throws UnknownHostException
+    {
+        failThresholdDisabled(CQL_TABLE_SCAN);
+    }
+
+    protected int failThresholdRowCount()
+    {
+        return 5;
+    }
+
+    public void failThresholdEnabled(String cql) throws UnknownHostException
+    {
+        ICoordinator node = CLUSTER.coordinator(1);
+        for (int i = 0; i < failThresholdRowCount(); i++)
+            node.execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, ?, ?)", ConsistencyLevel.ALL, i + 1, bytes(512));
+
+        if (shouldFlush())
+            CLUSTER.stream().forEach(i -> i.flush(KEYSPACE));
+
+        enable(true);
+        checkpointHistogram();
+        List<String> warnings = CLUSTER.get(1).callsOnInstance(() -> {
+            ClientWarn.instance.captureWarnings();
+            CoordinatorWarnings.init();
+            try
+            {
+                QueryProcessor.execute(cql, org.apache.cassandra.db.ConsistencyLevel.ALL, QueryState.forInternalCalls());
+                Assert.fail("Expected query failure");
+            }
+            catch (ReadSizeAbortException e)
+            {
+                // expected, client transport returns an error message and includes client warnings
+            }
+            CoordinatorWarnings.done();
+            CoordinatorWarnings.reset();
+            return ClientWarn.instance.getWarnings();
+        }).call();
+        assertAbortWarnings(warnings);
+        assertHistogramUpdated();
+        assertWarnAborts(0, 1, 1);
+
+        try
+        {
+            driverQueryAll(cql);
+            Assert.fail("Query should have thrown ReadFailureException");
+        }
+        catch (com.datastax.driver.core.exceptions.ReadFailureException e)
+        {
+            // without changing the client can't produce a better message...
+            // client does NOT include the message sent from the server in the exception; so the message doesn't work
+            // well in this case
+            assertThat(e.getMessage()).contains("responses were required but only 0 replica responded");
+            ImmutableSet<InetAddress> expectedKeys = ImmutableSet.of(InetAddress.getByAddress(new byte[]{ 127, 0, 0, 1 }), InetAddress.getByAddress(new byte[]{ 127, 0, 0, 2 }), InetAddress.getByAddress(new byte[]{ 127, 0, 0, 3 }));
+            assertThat(e.getFailuresMap())
+            .hasSizeBetween(1, 3)
+            // coordinator changes from run to run, so can't assert map as the key is dynamic... so assert the domain of keys and the single value expect
+            .containsValue(RequestFailureReason.READ_SIZE.code)
+            .hasKeySatisfying(new Condition<InetAddress>() {
+                public boolean matches(InetAddress value)
+                {
+                    return expectedKeys.contains(value);
+                }
+            });
+        }
+        assertHistogramUpdated();
+        assertWarnAborts(0, 2, 1);
+    }
+
+    public void failThresholdDisabled(String cql) throws UnknownHostException
+    {
+        ICoordinator node = CLUSTER.coordinator(1);
+        for (int i = 0; i < failThresholdRowCount(); i++)
+            node.execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, ?, ?)", ConsistencyLevel.ALL, i + 1, bytes(512));
+
+        if (shouldFlush())
+            CLUSTER.stream().forEach(i -> i.flush(KEYSPACE));
+
+        // query should no longer fail
+        enable(false);
+        checkpointHistogram();
+        SimpleQueryResult result = node.executeWithResult(cql, ConsistencyLevel.ALL);
+        assertThat(result.warnings()).isEmpty();
+        assertHistogramNotUpdated();
+        assertThat(driverQueryAll(cql).getExecutionInfo().getWarnings()).isEmpty();
+        assertHistogramNotUpdated();
+        assertWarnAborts(0, 0, 0);
+    }
+
+    protected static void enable(boolean value)
+    {
+        CLUSTER.stream().forEach(i -> i.runOnInstance(() -> DatabaseDescriptor.setReadThresholdsEnabled(value)));
+    }
+
+    protected static ByteBuffer bytes(int size)
+    {
+        byte[] b = new byte[size];
+        RANDOM.nextBytes(b);
+        return ByteBuffer.wrap(b);
+    }
+
+    protected static ResultSet driverQueryAll(String cql)
+    {
+        return JAVA_DRIVER_SESSION.execute(new SimpleStatement(cql).setConsistencyLevel(com.datastax.driver.core.ConsistencyLevel.ALL));
+    }
+
+    protected abstract long[] getHistogram();
+    private static long[] previous = new long[0];
+    protected void assertHistogramUpdated()
+    {
+        long[] latestCount = getHistogram();
+        try
+        {
+            // why notEquals?  timing can cause 1 replica to not process before the failure makes it to the test
+            // for this reason it is possible 1 replica was not updated but the others were; by expecting everyone
+            // to update the test will become flaky
+            assertThat(latestCount).isNotEqualTo(previous);
+        }
+        finally
+        {
+            previous = latestCount;
+        }
+    }
+
+    protected void assertHistogramNotUpdated()
+    {
+        long[] latestCount = getHistogram();
+        try
+        {
+            assertThat(latestCount).isEqualTo(previous);
+        }
+        finally
+        {
+            previous = latestCount;
+        }
+    }
+
+    private void checkpointHistogram()
+    {
+        previous = getHistogram();
+    }
+
+    private static long GLOBAL_READ_ABORTS = 0;
+    protected void assertWarnAborts(int warns, int aborts, int globalAborts)
+    {
+        assertThat(totalWarnings()).as("warnings").isEqualTo(warns);
+        assertThat(totalAborts()).as("aborts").isEqualTo(aborts);
+        long expectedGlobalAborts = GLOBAL_READ_ABORTS + globalAborts;
+        assertThat(totalReadAborts()).as("global aborts").isEqualTo(expectedGlobalAborts);
+        GLOBAL_READ_ABORTS = expectedGlobalAborts;
+    }
+
+    protected static long totalReadAborts()
+    {
+        return CLUSTER.stream().mapToLong(i ->
+                                          i.metrics().getCounter("org.apache.cassandra.metrics.ClientRequest.Aborts.Read-ALL")
+                                          + i.metrics().getCounter("org.apache.cassandra.metrics.ClientRequest.Aborts.RangeSlice")
+        ).sum();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/thresholds/CoordinatorReadSizeWarningTest.java b/test/distributed/org/apache/cassandra/distributed/test/thresholds/CoordinatorReadSizeWarningTest.java
new file mode 100644
index 0000000..31469af
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/thresholds/CoordinatorReadSizeWarningTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.distributed.test.thresholds;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.*;
+
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * ReadSize client warn/abort is coordinator only, so the fact ClientMetrics is coordinator only does not
+ * impact the user experience
+ */
+public class CoordinatorReadSizeWarningTest extends AbstractClientSizeWarning
+{
+    @BeforeClass
+    public static void setupClass() throws IOException
+    {
+        AbstractClientSizeWarning.setupClass();
+
+        // setup threshold after init to avoid driver issues loading
+        // the test uses a rather small limit, which causes driver to fail while loading metadata
+        CLUSTER.stream().forEach(i -> i.runOnInstance(() -> {
+            DatabaseDescriptor.setCoordinatorReadSizeWarnThreshold(new DataStorageSpec.LongBytesBound(1, KIBIBYTES));
+            DatabaseDescriptor.setCoordinatorReadSizeFailThreshold(new DataStorageSpec.LongBytesBound(2, KIBIBYTES));
+        }));
+    }
+
+    private static void assertPrefix(String expectedPrefix, String actual)
+    {
+        if (!actual.startsWith(expectedPrefix))
+            throw new AssertionError(String.format("expected \"%s\" to begin with \"%s\"", actual, expectedPrefix));
+    }
+
+    @Override
+    protected void assertWarnings(List<String> warnings)
+    {
+        assertThat(warnings).hasSize(1);
+        assertPrefix("Read on table " + KEYSPACE + ".tbl has exceeded the size warning threshold", warnings.get(0));
+    }
+
+    @Override
+    protected void assertAbortWarnings(List<String> warnings)
+    {
+        assertThat(warnings).hasSize(1);
+        assertPrefix("Read on table " + KEYSPACE + ".tbl has exceeded the size failure threshold", warnings.get(0));
+    }
+
+    @Override
+    protected long[] getHistogram()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.CoordinatorReadSize." + KEYSPACE)).toArray();
+    }
+
+    @Override
+    protected long totalWarnings()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.CoordinatorReadSizeWarnings." + KEYSPACE)).sum();
+    }
+
+    @Override
+    protected long totalAborts()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.CoordinatorReadSizeAborts." + KEYSPACE)).sum();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/thresholds/LocalReadSizeWarningTest.java b/test/distributed/org/apache/cassandra/distributed/test/thresholds/LocalReadSizeWarningTest.java
new file mode 100644
index 0000000..31a9415
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/thresholds/LocalReadSizeWarningTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.distributed.test.thresholds;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.BeforeClass;
+
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class LocalReadSizeWarningTest extends AbstractClientSizeWarning
+{
+    @BeforeClass
+    public static void setupClass() throws IOException
+    {
+        AbstractClientSizeWarning.setupClass();
+
+        // setup threshold after init to avoid driver issues loading
+        // the test uses a rather small limit, which causes driver to fail while loading metadata
+        CLUSTER.stream().forEach(i -> i.runOnInstance(() -> {
+            // disable coordinator version
+            DatabaseDescriptor.setCoordinatorReadSizeWarnThreshold(null);
+            DatabaseDescriptor.setCoordinatorReadSizeFailThreshold(null);
+
+            DatabaseDescriptor.setLocalReadSizeWarnThreshold(new DataStorageSpec.LongBytesBound(1, KIBIBYTES));
+            DatabaseDescriptor.setLocalReadSizeFailThreshold(new DataStorageSpec.LongBytesBound(2, KIBIBYTES));
+        }));
+    }
+
+    @Override
+    protected void assertWarnings(List<String> warnings)
+    {
+        assertThat(warnings).hasSize(1);
+        assertThat(warnings.get(0)).contains("(see local_read_size_warn_threshold)").contains("and issued local read size warnings for query");
+    }
+
+    @Override
+    protected void assertAbortWarnings(List<String> warnings)
+    {
+        assertThat(warnings).hasSize(1);
+        assertThat(warnings.get(0)).contains("(see local_read_size_fail_threshold)").contains("aborted the query");
+    }
+
+    @Override
+    protected long[] getHistogram()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.LocalReadSize." + KEYSPACE)).toArray();
+    }
+
+    @Override
+    protected long totalWarnings()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.LocalReadSizeWarnings." + KEYSPACE)).sum();
+    }
+
+    @Override
+    protected long totalAborts()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.LocalReadSizeAborts." + KEYSPACE)).sum();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/thresholds/RowIndexSizeWarningTest.java b/test/distributed/org/apache/cassandra/distributed/test/thresholds/RowIndexSizeWarningTest.java
new file mode 100644
index 0000000..33e6cd6
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/thresholds/RowIndexSizeWarningTest.java
@@ -0,0 +1,131 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.distributed.test.thresholds;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.junit.Assume;
+import org.junit.BeforeClass;
+
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class RowIndexSizeWarningTest extends AbstractClientSizeWarning
+{
+    @BeforeClass
+    public static void setupClass() throws IOException
+    {
+        AbstractClientSizeWarning.setupClass();
+
+        CLUSTER.stream().forEach(i -> i.runOnInstance(() -> {
+            DatabaseDescriptor.setRowIndexReadSizeWarnThreshold(new DataStorageSpec.LongBytesBound(1, KIBIBYTES));
+            DatabaseDescriptor.setRowIndexReadSizeFailThreshold(new DataStorageSpec.LongBytesBound(2, KIBIBYTES));
+
+            // hack to force multiple index entries
+            DatabaseDescriptor.setColumnIndexCacheSize(1 << 20);
+            DatabaseDescriptor.setColumnIndexSize(0);
+        }));
+    }
+
+    @Override
+    protected boolean shouldFlush()
+    {
+        // need to flush as RowIndexEntry is at the SSTable level
+        return true;
+    }
+
+    @Override
+    protected int warnThresholdRowCount()
+    {
+        return 15;
+    }
+
+    @Override
+    protected int failThresholdRowCount()
+    {
+        // since the RowIndexEntry grows slower than a partition, need even more rows to trigger
+        return 40;
+    }
+
+    @Override
+    public void noWarningsScan()
+    {
+        Assume.assumeFalse("Ignore Scans", true);
+    }
+
+    @Override
+    public void warnThresholdScan()
+    {
+        Assume.assumeFalse("Ignore Scans", true);
+    }
+
+    @Override
+    public void warnThresholdScanWithReadRepair()
+    {
+        Assume.assumeFalse("Ignore Scans", true);
+    }
+
+    @Override
+    public void failThresholdScanTrackingEnabled()
+    {
+        Assume.assumeFalse("Ignore Scans", true);
+    }
+
+    @Override
+    public void failThresholdScanTrackingDisabled()
+    {
+        Assume.assumeFalse("Ignore Scans", true);
+    }
+
+    @Override
+    protected void assertWarnings(List<String> warnings)
+    {
+        assertThat(warnings).hasSize(1);
+        assertThat(warnings.get(0)).contains("(see row_index_size_warn_threshold)").contains("bytes in RowIndexEntry and issued warnings for query");
+    }
+
+    @Override
+    protected void assertAbortWarnings(List<String> warnings)
+    {
+        assertThat(warnings).hasSize(1);
+        assertThat(warnings.get(0)).contains("(see row_index_size_fail_threshold)").contains("bytes in RowIndexEntry and aborted the query");
+    }
+
+    @Override
+    protected long[] getHistogram()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.RowIndexSize." + KEYSPACE)).toArray();
+    }
+
+    @Override
+    protected long totalWarnings()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.RowIndexSizeWarnings." + KEYSPACE)).sum();
+    }
+
+    @Override
+    protected long totalAborts()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.RowIndexSizeAborts." + KEYSPACE)).sum();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/test/thresholds/TombstoneCountWarningTest.java b/test/distributed/org/apache/cassandra/distributed/test/thresholds/TombstoneCountWarningTest.java
new file mode 100644
index 0000000..5e409cb
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/test/thresholds/TombstoneCountWarningTest.java
@@ -0,0 +1,443 @@
+/*
+ * 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.distributed.test.thresholds;
+
+import java.io.IOException;
+import java.net.InetAddress;
+import java.net.InetSocketAddress;
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.CompletableFuture;
+import java.util.function.Consumer;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.SimpleStatement;
+import net.bytebuddy.ByteBuddy;
+import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;
+import net.bytebuddy.implementation.MethodDelegation;
+import net.bytebuddy.implementation.bind.annotation.SuperCall;
+import net.bytebuddy.implementation.bind.annotation.This;
+import org.apache.cassandra.concurrent.SEPExecutor;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.SimpleQueryResult;
+import org.apache.cassandra.distributed.test.JavaDriverUtils;
+import org.apache.cassandra.distributed.test.TestBaseImpl;
+import org.apache.cassandra.exceptions.ReadFailureException;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.exceptions.TombstoneAbortException;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.service.reads.ReadCallback;
+import org.apache.cassandra.service.reads.thresholds.CoordinatorWarnings;
+import org.apache.cassandra.utils.Shared;
+import org.assertj.core.api.Assertions;
+import org.assertj.core.api.Condition;
+
+import static net.bytebuddy.matcher.ElementMatchers.named;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TombstoneCountWarningTest extends TestBaseImpl
+{
+    private static final Logger logger = LoggerFactory.getLogger(TombstoneCountWarningTest.class);
+
+    private static final int TOMBSTONE_WARN = 50;
+    private static final int TOMBSTONE_FAIL = 100;
+    private static ICluster<IInvokableInstance> CLUSTER;
+    private static com.datastax.driver.core.Cluster JAVA_DRIVER;
+    private static com.datastax.driver.core.Session JAVA_DRIVER_SESSION;
+
+    @BeforeClass
+    public static void setupClass() throws IOException
+    {
+        logger.info("[test step : @BeforeClass] setupClass");
+        Cluster.Builder builder = Cluster.build(3);
+        builder.withConfig(c -> c.set("tombstone_warn_threshold", TOMBSTONE_WARN)
+                                 .set("tombstone_failure_threshold", TOMBSTONE_FAIL)
+                                 .with(Feature.NATIVE_PROTOCOL, Feature.GOSSIP));
+        builder.withInstanceInitializer(BB::install);
+        CLUSTER = builder.start();
+        JAVA_DRIVER = JavaDriverUtils.create(CLUSTER);
+        JAVA_DRIVER_SESSION = JAVA_DRIVER.connect();
+    }
+
+    @AfterClass
+    public static void teardown()
+    {
+        logger.info("[test step : @AfterClass] teardown");
+        if (JAVA_DRIVER_SESSION != null)
+            JAVA_DRIVER_SESSION.close();
+        if (JAVA_DRIVER != null)
+            JAVA_DRIVER.close();
+    }
+
+    @Before
+    public void setup()
+    {
+        logger.info("[test step : @Before] setup");
+        CLUSTER.schemaChange("DROP KEYSPACE IF EXISTS " + KEYSPACE);
+        init(CLUSTER);
+        CLUSTER.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+    }
+
+    private static void enable(boolean value)
+    {
+        CLUSTER.stream().forEach(i -> i.runOnInstance(() -> DatabaseDescriptor.setReadThresholdsEnabled(value)));
+    }
+
+    @Test
+    public void noWarningsSinglePartition()
+    {
+        logger.info("[test step : @Test] noWarningsSinglePartition");
+        noWarnings("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk=1");
+    }
+
+    @Test
+    public void noWarningsScan()
+    {
+        logger.info("[test step : @Test] noWarningsScan");
+        noWarnings("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk=1");
+    }
+
+    public void noWarnings(String cql)
+    {
+        Consumer<List<String>> test = warnings ->
+                                      Assert.assertEquals(Collections.emptyList(), warnings);
+
+        for (int i=0; i<TOMBSTONE_WARN; i++)
+            CLUSTER.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, ?, null)", ConsistencyLevel.ALL, i);
+
+        for (boolean b : Arrays.asList(true, false))
+        {
+            enable(b);
+
+            SimpleQueryResult result = CLUSTER.coordinator(1).executeWithResult(cql, ConsistencyLevel.ALL);
+            test.accept(result.warnings());
+            test.accept(driverQueryAll(cql).getExecutionInfo().getWarnings());
+
+            assertWarnAborts(0, 0, 0);
+        }
+    }
+
+    @Test
+    public void warnThresholdSinglePartition()
+    {
+        logger.info("[test step : @Test] warnThresholdSinglePartition");
+        warnThreshold("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", false);
+    }
+
+    @Test
+    public void warnThresholdScan()
+    {
+        logger.info("[test step : @Test] warnThresholdScan");
+        warnThreshold("SELECT * FROM " + KEYSPACE + ".tbl", true);
+    }
+
+    private void warnThreshold(String cql, boolean isScan)
+    {
+        for (int i = 0; i < TOMBSTONE_WARN + 1; i++)
+            CLUSTER.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, ?, null)", ConsistencyLevel.ALL, i);
+
+        enable(true);
+        Consumer<List<String>> testEnabled = warnings ->
+                                             Assertions.assertThat(Iterables.getOnlyElement(warnings))
+                                                       .contains("nodes scanned up to " + (TOMBSTONE_WARN + 1) + " tombstones and issued tombstone warnings for query " + cql);
+
+        SimpleQueryResult result = CLUSTER.coordinator(1).executeWithResult(cql, ConsistencyLevel.ALL);
+        testEnabled.accept(result.warnings());
+        assertWarnAborts(1, 0, 0);
+        testEnabled.accept(driverQueryAll(cql).getExecutionInfo().getWarnings());
+        assertWarnAborts(2, 0, 0);
+
+        enable(false);
+        Consumer<List<String>> testDisabled = warnings -> {
+            // client warnings are currently coordinator only, so if present only 1 is expected
+            if (isScan)
+            {
+                // Scans perform multiple ReadCommands, which will not propgate the warnings to the top-level coordinator; so no warnings are expected
+                Assertions.assertThat(warnings).isEmpty();
+            }
+            else
+            {
+                Assertions.assertThat(Iterables.getOnlyElement(warnings))
+                          .startsWith("Read " + (TOMBSTONE_WARN + 1) + " live rows and " + (TOMBSTONE_WARN + 1) + " tombstone cells for query " + cql);
+            }
+        };
+        result = CLUSTER.coordinator(1).executeWithResult(cql, ConsistencyLevel.ALL);
+        testDisabled.accept(result.warnings());
+        assertWarnAborts(2, 0, 0);
+        testDisabled.accept(driverQueryAll(cql).getExecutionInfo().getWarnings());
+        assertWarnAborts(2, 0, 0);
+    }
+
+    @Test
+    public void failThresholdSinglePartition() throws UnknownHostException
+    {
+        logger.info("[test step : @Test] failThresholdSinglePartition");
+        failThreshold("SELECT * FROM " + KEYSPACE + ".tbl WHERE pk = 1", false);
+    }
+
+    @Test
+    public void failThresholdScan() throws UnknownHostException
+    {
+        logger.info("[test step : @Test] failThresholdScan");
+        failThreshold("SELECT * FROM " + KEYSPACE + ".tbl", true);
+    }
+
+    private void failThreshold(String cql, boolean isScan) throws UnknownHostException
+    {
+        for (int i = 0; i < TOMBSTONE_FAIL + 1; i++)
+            CLUSTER.coordinator(1).execute("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES (1, ?, null)", ConsistencyLevel.ALL, i);
+
+        enable(true);
+        List<String> warnings = CLUSTER.get(1).callsOnInstance(() -> {
+            ClientWarn.instance.captureWarnings();
+            CoordinatorWarnings.init();
+            try
+            {
+                QueryProcessor.execute(cql, org.apache.cassandra.db.ConsistencyLevel.ALL, QueryState.forInternalCalls());
+                Assert.fail("Expected query failure");
+            }
+            catch (TombstoneAbortException e)
+            {
+                Assert.assertTrue(e.nodes >= 1 && e.nodes <= 3);
+                Assert.assertEquals(TOMBSTONE_FAIL + 1, e.tombstones);
+                // expected, client transport returns an error message and includes client warnings
+            }
+            CoordinatorWarnings.done();
+            CoordinatorWarnings.reset();
+            return ClientWarn.instance.getWarnings();
+        }).call();
+        Assertions.assertThat(Iterables.getOnlyElement(warnings))
+                  .contains("nodes scanned over " + (TOMBSTONE_FAIL + 1) + " tombstones and aborted the query " + cql);
+
+        assertWarnAborts(0, 1, 1);
+
+        try
+        {
+            driverQueryAll(cql);
+            Assert.fail("Query should have thrown ReadFailureException");
+        }
+        catch (com.datastax.driver.core.exceptions.ReadFailureException e)
+        {
+            // without changing the client can't produce a better message...
+            // client does NOT include the message sent from the server in the exception; so the message doesn't work
+            // well in this case
+            Assertions.assertThat(e.getMessage()).contains("responses were required but only 0 replica responded"); // can't include ', 3 failed)' as some times its 2
+
+            ImmutableSet<InetAddress> expectedKeys = ImmutableSet.of(InetAddress.getByAddress(new byte[]{ 127, 0, 0, 1 }), InetAddress.getByAddress(new byte[]{ 127, 0, 0, 2 }), InetAddress.getByAddress(new byte[]{ 127, 0, 0, 3 }));
+            assertThat(e.getFailuresMap())
+            .hasSizeBetween(1, 3)
+            // coordinator changes from run to run, so can't assert map as the key is dynamic... so assert the domain of keys and the single value expect
+            .containsValue(RequestFailureReason.READ_TOO_MANY_TOMBSTONES.code)
+            .hasKeySatisfying(new Condition<InetAddress>() {
+                public boolean matches(InetAddress value)
+                {
+                    return expectedKeys.contains(value);
+                }
+            });
+        }
+
+        assertWarnAborts(0, 2, 1);
+
+        // when disabled warnings only happen if on the coordinator, and coordinator may not be the one replying
+        // to every query
+        enable(false);
+        State.blockFor(CLUSTER.get(1).config().broadcastAddress());
+        warnings = CLUSTER.get(1).callsOnInstance(() -> {
+            ClientWarn.instance.captureWarnings();
+            try
+            {
+                QueryProcessor.execute(cql, org.apache.cassandra.db.ConsistencyLevel.ALL, QueryState.forInternalCalls());
+                Assert.fail("Expected query failure");
+            }
+            catch (ReadFailureException e)
+            {
+                Assertions.assertThat(e).isNotInstanceOf(TombstoneAbortException.class);
+                Assertions.assertThat(e.failureReasonByEndpoint).isNotEmpty();
+                Assertions.assertThat(e.failureReasonByEndpoint.values())
+                          .as("Non READ_TOO_MANY_TOMBSTONES exists")
+                          .allMatch(RequestFailureReason.READ_TOO_MANY_TOMBSTONES::equals);
+            }
+            logger.warn("Checking warnings...");
+            return ClientWarn.instance.getWarnings();
+        }).call();
+        // client warnings are currently coordinator only, so if present only 1 is expected
+        if (isScan)
+        {
+            // Scans perform multiple ReadCommands, which will not propgate the warnings to the top-level coordinator; so no warnings are expected
+            Assertions.assertThat(warnings).isNull();
+        }
+        else
+        {
+            Assertions.assertThat(Iterables.getOnlyElement(warnings))
+                      .startsWith("Read " + TOMBSTONE_FAIL + " live rows and " + (TOMBSTONE_FAIL + 1) + " tombstone cells for query " + cql);
+        }
+
+        assertWarnAborts(0, 2, 0);
+
+        State.blockFor(CLUSTER.get(1).config().broadcastAddress());
+        try
+        {
+            driverQueryAll(cql);
+            Assert.fail("Query should have thrown ReadFailureException");
+        }
+        catch (com.datastax.driver.core.exceptions.ReadFailureException e)
+        {
+            // not checking the message as different cases exist for the failure, so the fact that this failed is enough
+
+            Assertions.assertThat(e.getFailuresMap())
+                      .isNotEmpty();
+            Assertions.assertThat(e.getFailuresMap().values())
+                      .as("Non READ_TOO_MANY_TOMBSTONES exists")
+                      .allMatch(i -> i.equals(RequestFailureReason.READ_TOO_MANY_TOMBSTONES.code));
+        }
+
+        assertWarnAborts(0, 2, 0);
+    }
+
+    private static long GLOBAL_READ_ABORTS = 0;
+    private static void assertWarnAborts(int warns, int aborts, int globalAborts)
+    {
+        Assertions.assertThat(totalWarnings()).as("warnings").isEqualTo(warns);
+        Assertions.assertThat(totalAborts()).as("aborts").isEqualTo(aborts);
+        long expectedGlobalAborts = GLOBAL_READ_ABORTS + globalAborts;
+        Assertions.assertThat(totalReadAborts()).as("global aborts").isEqualTo(expectedGlobalAborts);
+        GLOBAL_READ_ABORTS = expectedGlobalAborts;
+    }
+
+    private static long totalWarnings()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.ClientTombstoneWarnings." + KEYSPACE)).sum();
+    }
+
+    private static long totalAborts()
+    {
+        return CLUSTER.stream().mapToLong(i -> i.metrics().getCounter("org.apache.cassandra.metrics.keyspace.ClientTombstoneAborts." + KEYSPACE)).sum();
+    }
+
+    private static long totalReadAborts()
+    {
+        return CLUSTER.stream().mapToLong(i ->
+                                          i.metrics().getCounter("org.apache.cassandra.metrics.ClientRequest.Aborts.Read-ALL")
+                                          + i.metrics().getCounter("org.apache.cassandra.metrics.ClientRequest.Aborts.RangeSlice")
+        ).sum();
+    }
+
+    private static ResultSet driverQueryAll(String cql)
+    {
+        return JAVA_DRIVER_SESSION.execute(new SimpleStatement(cql).setConsistencyLevel(com.datastax.driver.core.ConsistencyLevel.ALL));
+    }
+
+    @Shared
+    public static class State
+    {
+        // use InetSocketAddress as InetAddressAndPort is @Isolated which means equality doesn't work due to different
+        // ClassLoaders; InetSocketAddress is @Shared so safe to use between app and cluster class loaders
+        public static volatile InetSocketAddress blockFor = null;
+        public static volatile CompletableFuture<Void> promise = null;
+
+        // called on main thread
+        public static void blockFor(InetSocketAddress address)
+        {
+            blockFor = address;
+            promise = new CompletableFuture<>();
+        }
+
+        // called in C* threads; non-test threads
+        public static void onFailure(InetSocketAddress address)
+        {
+            if (address.equals(blockFor))
+                promise.complete(null);
+        }
+
+        // called on main thread
+        public static void syncAndClear()
+        {
+            if (blockFor != null)
+            {
+                promise.join();
+                blockFor = null;
+                promise = null;
+            }
+        }
+    }
+
+    public static class BB
+    {
+        private static void install(ClassLoader cl, int instanceId)
+        {
+            if (instanceId != 1)
+                return;
+            new ByteBuddy().rebase(ReadCallback.class)
+                           .method(named("awaitResults"))
+                           .intercept(MethodDelegation.to(BB.class))
+                           .method(named("onFailure"))
+                           .intercept(MethodDelegation.to(BB.class))
+                           .make()
+                           .load(cl, ClassLoadingStrategy.Default.INJECTION);
+            new ByteBuddy().rebase(SEPExecutor.class)
+                           .method(named("maybeExecuteImmediately"))
+                           .intercept(MethodDelegation.to(BB.class))
+                           .make()
+                           .load(cl, ClassLoadingStrategy.Default.INJECTION);
+        }
+
+        @SuppressWarnings("unused")
+        public static void awaitResults(@SuperCall Runnable zuper)
+        {
+            State.syncAndClear();
+            zuper.run();
+        }
+
+        @SuppressWarnings("unused")
+        public static void onFailure(InetAddressAndPort from, RequestFailureReason failureReason, @SuperCall Runnable zuper) throws Exception
+        {
+            State.onFailure(new InetSocketAddress(from.getAddress(), from.getPort()));
+            zuper.run();
+        }
+
+        // make sure to schedule the task rather than running inline...
+        // this is imporant as the read may block on the local version which can get the test to include it rather than
+        // block waiting, so by scheduling we make sure its always fair
+        @SuppressWarnings("unused")
+        public static void maybeExecuteImmediately(Runnable task, @This SEPExecutor executor)
+        {
+            executor.execute(task);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/BatchUpgradeTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/BatchUpgradeTest.java
new file mode 100644
index 0000000..db5e2e1
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/BatchUpgradeTest.java
@@ -0,0 +1,55 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.junit.Test;
+
+import org.apache.cassandra.Util;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+import static org.junit.Assert.assertEquals;
+
+public class BatchUpgradeTest extends UpgradeTestBase
+{
+    @Test
+    public void batchTest() throws Throwable
+    {
+        new TestCase()
+        .nodes(2)
+        .nodesToUpgrade(2)
+        .upgradesFrom(v40).setup((cluster) -> {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".users (" +
+                                 "userid uuid PRIMARY KEY," +
+                                 "firstname ascii," +
+                                 "lastname ascii," +
+                                 "age int) WITH COMPACT STORAGE");
+        }).runAfterNodeUpgrade((cluster, node) -> {
+            cluster.coordinator(2).execute("BEGIN BATCH\n" +
+                                           "    UPDATE " + KEYSPACE + ".users SET age = 37 WHERE userid = f47ac10b-58cc-4372-a567-0e02b2c3d479\n" +
+                                           "    DELETE firstname, lastname FROM " + KEYSPACE + ".users WHERE userid = 550e8400-e29b-41d4-a716-446655440000\n" +
+                                           "APPLY BATCH", ConsistencyLevel.ALL);
+        }).runAfterClusterUpgrade((cluster) -> {
+            Util.spinAssertEquals(0, () -> cluster.get(1).executeInternal("select * from system.batches").length, 10);
+            Util.spinAssertEquals(0, () -> cluster.get(2).executeInternal("select * from system.batches").length, 10);
+            assertEquals(0, cluster.get(1).logs().grep("ClassCastException").getResult().size());
+            assertEquals(0, cluster.get(2).logs().grep("ClassCastException").getResult().size());
+        })
+        .run();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStoragePagingWithProtocolTester.java b/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStoragePagingWithProtocolTester.java
index 2683e7d..6dd3bd9 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStoragePagingWithProtocolTester.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStoragePagingWithProtocolTester.java
@@ -61,7 +61,7 @@
         new TestCase()
         .nodes(2)
         .nodesToUpgrade(1)
-        .singleUpgrade(initialVersion(), CURRENT)
+        .singleUpgrade(initialVersion())
         .withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL))
         .setup(c -> {
             c.schemaChange(withKeyspace("CREATE TABLE %s.t (pk text, ck text, v text, " +
@@ -88,7 +88,7 @@
         new TestCase()
         .nodes(2)
         .nodesToUpgrade(1)
-        .singleUpgrade(initialVersion(), CURRENT)
+        .singleUpgrade(initialVersion())
         .withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL))
         .setup(c -> {
             c.schemaChange(withKeyspace("CREATE TABLE %s.t (pk text, ck1 text, ck2 text, v text, " +
@@ -114,7 +114,7 @@
         new TestCase()
         .nodes(2)
         .nodesToUpgrade(1)
-        .singleUpgrade(initialVersion(), CURRENT)
+        .singleUpgrade(initialVersion())
         .withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL))
         .setup(c -> {
             c.schemaChange(withKeyspace("CREATE TABLE %s.t (pk text PRIMARY KEY, v1 text, v2 text) WITH COMPACT STORAGE"));
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStoragePagingWithProtocolV40Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStoragePagingWithProtocolV40Test.java
new file mode 100644
index 0000000..d245d9f
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/CompactStoragePagingWithProtocolV40Test.java
@@ -0,0 +1,33 @@
+/*
+ * 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.distributed.upgrade;
+
+import com.vdurmont.semver4j.Semver;
+
+/**
+ * {@link CompactStoragePagingWithProtocolTester} for v40 -> CURRENT upgrade path.
+ */
+public class CompactStoragePagingWithProtocolV40Test extends CompactStoragePagingWithProtocolTester
+{
+    @Override
+    protected Semver initialVersion()
+    {
+        return v40;
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/ConfigCompatabilityTestGenerate.java b/test/distributed/org/apache/cassandra/distributed/upgrade/ConfigCompatabilityTestGenerate.java
new file mode 100644
index 0000000..518fd14
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/ConfigCompatabilityTestGenerate.java
@@ -0,0 +1,63 @@
+/*
+ * 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.distributed.upgrade;
+
+import java.io.File;
+import java.util.Arrays;
+
+import org.apache.commons.lang3.ArrayUtils;
+
+import com.vdurmont.semver4j.Semver;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.distributed.UpgradeableCluster;
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.impl.AbstractCluster;
+import org.apache.cassandra.distributed.shared.Versions;
+
+import static org.apache.cassandra.config.ConfigCompatabilityTest.TEST_DIR;
+import static org.apache.cassandra.config.ConfigCompatabilityTest.dump;
+import static org.apache.cassandra.config.ConfigCompatabilityTest.toTree;
+
+/**
+ * This class is to generate YAML dumps per version, this is a manual process and should be updated for each release.
+ */
+public class ConfigCompatabilityTestGenerate
+{
+    public static void main(String[] args) throws Throwable
+    {
+        ICluster.setup();
+        Versions versions = Versions.find();
+        for (Semver version : Arrays.asList(UpgradeTestBase.v30, UpgradeTestBase.v3X, UpgradeTestBase.v40))
+        {
+            File path = new File(TEST_DIR, "version=" + version + ".yml");
+            path.getParentFile().mkdirs();
+            Versions.Version latest = versions.getLatest(version);
+            // this class isn't present so the lambda can't be deserialized... so add to the classpath
+            latest = new Versions.Version(latest.version, ArrayUtils.addAll(latest.classpath, AbstractCluster.CURRENT_VERSION.classpath));
+
+            try (UpgradeableCluster cluster = UpgradeableCluster.create(1, latest))
+            {
+                IInvokableInstance inst = (IInvokableInstance) cluster.get(1);
+                Class<?> klass = inst.callOnInstance(() -> Config.class);
+                assert klass.getClassLoader() != ConfigCompatabilityTestGenerate.class.getClassLoader();
+                dump(toTree(klass), path.getAbsolutePath());
+            }
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/GroupByTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/GroupByTest.java
index 2e67497..b09b882 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/GroupByTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/GroupByTest.java
@@ -21,10 +21,8 @@
 import org.junit.Test;
 
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
-import org.apache.cassandra.distributed.shared.Versions;
 
 import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
-import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
 import static org.apache.cassandra.distributed.api.Feature.NETWORK;
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
 import static org.apache.cassandra.distributed.shared.AssertUtils.row;
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityTestBase.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityTestBase.java
index c1ae153..4e50eb1 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityTestBase.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityTestBase.java
@@ -18,18 +18,22 @@
 
 package org.apache.cassandra.distributed.upgrade;
 
-import java.util.Arrays;
-import java.util.List;
 import java.util.UUID;
+import java.util.concurrent.RejectedExecutionException;
+
+import org.junit.Test;
 
 import com.vdurmont.semver4j.Semver;
-
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.ICoordinator;
+import org.apache.cassandra.exceptions.ReadFailureException;
 import org.apache.cassandra.exceptions.ReadTimeoutException;
+import org.apache.cassandra.exceptions.WriteFailureException;
 import org.apache.cassandra.exceptions.WriteTimeoutException;
 import org.apache.cassandra.net.Verb;
+import org.assertj.core.api.Assertions;
 
+import static java.lang.String.format;
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.ALL;
 import static org.apache.cassandra.distributed.api.ConsistencyLevel.ONE;
@@ -37,47 +41,67 @@
 import static org.apache.cassandra.distributed.shared.AssertUtils.assertRows;
 import static org.apache.cassandra.distributed.shared.AssertUtils.row;
 import static org.apache.cassandra.net.Verb.READ_REQ;
-import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static java.lang.String.format;
 
 
-public class MixedModeAvailabilityTestBase extends UpgradeTestBase
+public abstract class MixedModeAvailabilityTestBase extends UpgradeTestBase
 {
     private static final int NUM_NODES = 3;
     private static final int COORDINATOR = 1;
-    private static final List<Tester> TESTERS = Arrays.asList(new Tester(ONE, ALL),
-                                                              new Tester(QUORUM, QUORUM),
-                                                              new Tester(ALL, ONE));
+    private static final String INSERT = withKeyspace("INSERT INTO %s.t (k, c, v) VALUES (?, ?, ?)");
+    private static final String SELECT = withKeyspace("SELECT * FROM %s.t WHERE k = ?");
 
+    private final Semver initial;
+    private final ConsistencyLevel writeConsistencyLevel;
+    private final ConsistencyLevel readConsistencyLevel;
 
-    protected static void testAvailability(Semver initial) throws Throwable
+    public MixedModeAvailabilityTestBase(Semver initial, ConsistencyLevel writeConsistencyLevel, ConsistencyLevel readConsistencyLevel)
     {
-        testAvailability(initial, UpgradeTestBase.CURRENT);
+        this.initial = initial;
+        this.writeConsistencyLevel = writeConsistencyLevel;
+        this.readConsistencyLevel = readConsistencyLevel;
     }
 
-    protected static void testAvailability(Semver initial, Semver upgrade) throws Throwable
+    @Test
+    public void testAvailabilityCoordinatorNotUpgraded() throws Throwable
     {
-        testAvailability(true, initial, upgrade);
-        testAvailability(false, initial, upgrade);
+        testAvailability(false, initial, writeConsistencyLevel, readConsistencyLevel);
+    }
+
+    @Test
+    public void testAvailabilityCoordinatorUpgraded() throws Throwable
+    {
+        testAvailability(true, initial, writeConsistencyLevel, readConsistencyLevel);
     }
 
     private static void testAvailability(boolean upgradedCoordinator,
                                          Semver initial,
-                                         Semver upgrade) throws Throwable
+                                         ConsistencyLevel writeConsistencyLevel,
+                                         ConsistencyLevel readConsistencyLevel) throws Throwable
     {
         new TestCase()
         .nodes(NUM_NODES)
         .nodesToUpgrade(upgradedCoordinator ? 1 : 2)
-        .upgrades(initial, upgrade)
-        .withConfig(config -> config.set("read_request_timeout_in_ms", SECONDS.toMillis(2))
-                                    .set("write_request_timeout_in_ms", SECONDS.toMillis(2)))
-        .setup(c -> c.schemaChange(withKeyspace("CREATE TABLE %s.t (k uuid, c int, v int, PRIMARY KEY (k, c))")))
+        .upgrades(initial, UpgradeTestBase.CURRENT)
+        .withConfig(config -> config.set("read_request_timeout_in_ms", SECONDS.toMillis(5))
+                                    .set("write_request_timeout_in_ms", SECONDS.toMillis(5)))
+        // use retry of 10ms so that each check is consistent
+        // At the start of the world cfs.sampleLatencyNanos == 0, which means speculation acts as if ALWAYS is done,
+        // but after the first refresh this gets set high enough that we don't trigger speculation for the rest of the test!
+        // To be consistent set retry to 10ms so cfs.sampleLatencyNanos stays consistent for the duration of the test.
+        .setup(cluster -> {
+            cluster.schemaChange(withKeyspace("CREATE TABLE %s.t (k uuid, c int, v int, PRIMARY KEY (k, c)) WITH speculative_retry = '10ms'"));
+            cluster.setUncaughtExceptionsFilter(throwable -> throwable instanceof RejectedExecutionException);
+        })
         .runAfterNodeUpgrade((cluster, n) -> {
 
+            ICoordinator coordinator = cluster.coordinator(COORDINATOR);
+
             // using 0 to 2 down nodes...
-            for (int numNodesDown = 0; numNodesDown < NUM_NODES; numNodesDown++)
+            for (int i = 0; i < NUM_NODES; i++)
             {
+                final int numNodesDown = i;
+
                 // disable communications to the down nodes
                 if (numNodesDown > 0)
                 {
@@ -85,10 +109,38 @@
                     cluster.filters().outbound().verbs(Verb.MUTATION_REQ.id).to(replica(COORDINATOR, numNodesDown)).drop();
                 }
 
-                // run the test cases that are compatible with the number of down nodes
-                ICoordinator coordinator = cluster.coordinator(COORDINATOR);
-                for (Tester tester : TESTERS)
-                    tester.test(coordinator, numNodesDown, upgradedCoordinator);
+                UUID key = UUID.randomUUID();
+                Object[] row1 = row(key, 1, 10);
+                Object[] row2 = row(key, 2, 20);
+
+                boolean wrote = false;
+                try
+                {
+                    // test write
+                    maybeFail(false, numNodesDown > maxNodesDown(writeConsistencyLevel), () -> {
+                        coordinator.execute(INSERT, writeConsistencyLevel, row1);
+                        coordinator.execute(INSERT, writeConsistencyLevel, row2);
+                    });
+
+                    wrote = true;
+
+                    // test read
+                    maybeFail(true, numNodesDown > maxNodesDown(readConsistencyLevel), () -> {
+                        Object[][] rows = coordinator.execute(SELECT, readConsistencyLevel, key);
+                        if (numNodesDown <= maxNodesDown(writeConsistencyLevel))
+                            assertRows(rows, row1, row2);
+                    });
+                }
+                catch (Throwable t)
+                {
+                    throw new AssertionError(format("Unexpected error while %s in case write-read consistency %s-%s with %s coordinator and %d nodes down: %s",
+                                                    wrote ? "reading" : "writing",
+                                                    writeConsistencyLevel,
+                                                    readConsistencyLevel,
+                                                    upgradedCoordinator ? "upgraded" : "not upgraded",
+                                                    numNodesDown,
+                                                    t), t);
+                }
             }
         }).run();
     }
@@ -99,88 +151,49 @@
         return depth == 0 ? node : replica(node == NUM_NODES ? 1 : node + 1, depth - 1);
     }
 
-    private static class Tester
+    private static void maybeFail(boolean isRead, boolean shouldFail, Runnable test)
     {
-        private static final String INSERT = withKeyspace("INSERT INTO %s.t (k, c, v) VALUES (?, ?, ?)");
-        private static final String SELECT = withKeyspace("SELECT * FROM %s.t WHERE k = ?");
-
-        private final ConsistencyLevel writeConsistencyLevel;
-        private final ConsistencyLevel readConsistencyLevel;
-
-        private Tester(ConsistencyLevel writeConsistencyLevel, ConsistencyLevel readConsistencyLevel)
+        try
         {
-            this.writeConsistencyLevel = writeConsistencyLevel;
-            this.readConsistencyLevel = readConsistencyLevel;
+            test.run();
+            assertFalse("Should have failed", shouldFail);
         }
-
-        public void test(ICoordinator coordinator, int numNodesDown, boolean upgradedCoordinator)
+        catch (Exception e)
         {
-            UUID key = UUID.randomUUID();
-            Object[] row1 = row(key, 1, 10);
-            Object[] row2 = row(key, 2, 20);
+            if (!shouldFail)
+                throw e;
 
-            boolean wrote = false;
-            try
+            // we should use exception class names due to the different classpaths
+            String className = (e instanceof RuntimeException && e.getCause() != null)
+                               ? e.getCause().getClass().getCanonicalName()
+                               : e.getClass().getCanonicalName();
+
+            if (isRead)
             {
-                // test write
-                maybeFail(WriteTimeoutException.class, numNodesDown > maxNodesDown(writeConsistencyLevel), () -> {
-                    coordinator.execute(INSERT, writeConsistencyLevel, row1);
-                    coordinator.execute(INSERT, writeConsistencyLevel, row2);
-                });
-
-                wrote = true;
-
-                // test read
-                maybeFail(ReadTimeoutException.class, numNodesDown > maxNodesDown(readConsistencyLevel), () -> {
-                    Object[][] rows = coordinator.execute(SELECT, readConsistencyLevel, key);
-                    if (numNodesDown <= maxNodesDown(writeConsistencyLevel))
-                        assertRows(rows, row1, row2);
-                });
+                Assertions.assertThat(className)
+                          .isIn(ReadTimeoutException.class.getCanonicalName(),
+                                ReadFailureException.class.getCanonicalName());
             }
-            catch (Throwable t)
+            else
             {
-                throw new AssertionError(format("Unexpected error while %s in case write-read consistency %s-%s with %s coordinator and %d nodes down",
-                                                wrote ? "reading" : "writing",
-                                                writeConsistencyLevel,
-                                                readConsistencyLevel,
-                                                upgradedCoordinator ? "upgraded" : "not upgraded",
-                                                numNodesDown), t);
+                Assertions.assertThat(className)
+                          .isIn(WriteTimeoutException.class.getCanonicalName(),
+                                WriteFailureException.class.getCanonicalName());
             }
         }
+    }
 
-        private static <E extends Exception> void maybeFail(Class<E> exceptionClass, boolean shouldFail, Runnable test)
-        {
-            try
-            {
-                test.run();
-                assertFalse(shouldFail);
-            }
-            catch (Exception e)
-            {
-                // we should use exception class names due to the different classpaths
-                String className = e.getClass().getCanonicalName();
-                if (e instanceof RuntimeException && e.getCause() != null)
-                    className = e.getCause().getClass().getCanonicalName();
+    private static int maxNodesDown(ConsistencyLevel cl)
+    {
+        if (cl == ONE)
+            return 2;
 
-                if (shouldFail)
-                    assertEquals(exceptionClass.getCanonicalName(), className);
-                else
-                    throw e;
-            }
-        }
+        if (cl == QUORUM)
+            return 1;
 
-        private static int maxNodesDown(ConsistencyLevel cl)
-        {
-            if (cl == ONE)
-                return 2;
+        if (cl == ALL)
+            return 0;
 
-            if (cl == QUORUM)
-                return 1;
-
-            if (cl == ALL)
-                return 0;
-
-            throw new IllegalArgumentException("Unsupported consistency level: " + cl);
-        }
+        throw new IllegalArgumentException("Unsupported consistency level: " + cl);
     }
 }
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV22Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV22Test.java
deleted file mode 100644
index f756574..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV22Test.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.shared.Versions;
-
-/**
- * {@link MixedModeAvailabilityTestBase} for upgrades from v22.
- */
-public class MixedModeAvailabilityV22Test extends MixedModeAvailabilityTestBase
-{
-    @Test
-    public void testAvailabilityV22ToV30() throws Throwable
-    {
-        testAvailability(v22, v30);
-    }
-
-    @Test
-    public void testAvailabilityV22ToV3X() throws Throwable
-    {
-        testAvailability(v22, v3X);
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30AllOneTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30AllOneTest.java
new file mode 100644
index 0000000..96dc454
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30AllOneTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+/**
+ * {@link MixedModeAvailabilityTestBase} for upgrades from v30 with ALL-ONE write-read consistency.
+ */
+public class MixedModeAvailabilityV30AllOneTest extends MixedModeAvailabilityTestBase
+{
+    public MixedModeAvailabilityV30AllOneTest()
+    {
+        super(v30, ConsistencyLevel.ALL, ConsistencyLevel.ONE);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30OneAllTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30OneAllTest.java
new file mode 100644
index 0000000..be51549
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30OneAllTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+/**
+ * {@link MixedModeAvailabilityTestBase} for upgrades from v30 with ONE-ALL write-read consistency.
+ */
+public class MixedModeAvailabilityV30OneAllTest extends MixedModeAvailabilityTestBase
+{
+    public MixedModeAvailabilityV30OneAllTest()
+    {
+        super(v30, ConsistencyLevel.ONE, ConsistencyLevel.ALL);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30QuorumQuorumTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30QuorumQuorumTest.java
new file mode 100644
index 0000000..8df53d1
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30QuorumQuorumTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+/**
+ * {@link MixedModeAvailabilityTestBase} for upgrades from v30 with QUORUM-QUORUM write-read consistency.
+ */
+public class MixedModeAvailabilityV30QuorumQuorumTest extends MixedModeAvailabilityTestBase
+{
+    public MixedModeAvailabilityV30QuorumQuorumTest()
+    {
+        super(v30, ConsistencyLevel.QUORUM, ConsistencyLevel.QUORUM);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30Test.java
deleted file mode 100644
index 984df3b..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV30Test.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.shared.Versions;
-
-/**
- * {@link MixedModeAvailabilityTestBase} for upgrades from v30.
- */
-public class MixedModeAvailabilityV30Test extends MixedModeAvailabilityTestBase
-{
-    @Test
-    public void testAvailability() throws Throwable
-    {
-        testAvailability(v30);
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XAllOneTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XAllOneTest.java
new file mode 100644
index 0000000..955e0ba
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XAllOneTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+/**
+ * {@link MixedModeAvailabilityTestBase} for upgrades from v3X with ALL-ONE write-read consistency.
+ */
+public class MixedModeAvailabilityV3XAllOneTest extends MixedModeAvailabilityTestBase
+{
+    public MixedModeAvailabilityV3XAllOneTest()
+    {
+        super(v3X, ConsistencyLevel.ALL, ConsistencyLevel.ONE);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XOneAllTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XOneAllTest.java
new file mode 100644
index 0000000..8ea94ea
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XOneAllTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+/**
+ * {@link MixedModeAvailabilityTestBase} for upgrades from v3X with ONE-ALL write-read consistency.
+ */
+public class MixedModeAvailabilityV3XOneAllTest extends MixedModeAvailabilityTestBase
+{
+    public MixedModeAvailabilityV3XOneAllTest() throws Throwable
+    {
+        super(v3X, ConsistencyLevel.ONE, ConsistencyLevel.ALL);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XQuorumQuorumTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XQuorumQuorumTest.java
new file mode 100644
index 0000000..e65f4f4
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XQuorumQuorumTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+
+/**
+ * {@link MixedModeAvailabilityTestBase} for upgrades from v3X with QUORUM-QUORUM write-read consistency.
+ */
+public class MixedModeAvailabilityV3XQuorumQuorumTest extends MixedModeAvailabilityTestBase
+{
+    public MixedModeAvailabilityV3XQuorumQuorumTest()
+    {
+        super(v3X, ConsistencyLevel.QUORUM, ConsistencyLevel.QUORUM);
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XTest.java
deleted file mode 100644
index 70230f5..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeAvailabilityV3XTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.shared.Versions;
-
-/**
- * {@link MixedModeAvailabilityTestBase} for upgrades from v3X.
- */
-public class MixedModeAvailabilityV3XTest extends MixedModeAvailabilityTestBase
-{
-    @Test
-    public void testAvailability() throws Throwable
-    {
-        testAvailability(v3X);
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV22Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV22Test.java
deleted file mode 100644
index deb0863..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV22Test.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.shared.Versions;
-
-/**
- * {@link MixedModeConsistencyTestBase} for upgrades from v22.
- */
-public class MixedModeConsistencyV22Test extends MixedModeConsistencyTestBase
-{
-    @Test
-    public void testConsistencyV22ToV30() throws Throwable
-    {
-        testConsistency(v22, v30);
-    }
-
-    @Test
-    public void testConsistencyV22ToV3X() throws Throwable
-    {
-        testConsistency(v22, v3X);
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV30Test.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV30Test.java
index 8687c55..2712a46 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV30Test.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV30Test.java
@@ -20,8 +20,6 @@
 
 import org.junit.Test;
 
-import org.apache.cassandra.distributed.shared.Versions;
-
 /**
  * {@link MixedModeConsistencyTestBase} for upgrades from v30.
  */
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV3XTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV3XTest.java
index 9e4ec6a..d39ea56 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV3XTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeConsistencyV3XTest.java
@@ -20,8 +20,6 @@
 
 import org.junit.Test;
 
-import org.apache.cassandra.distributed.shared.Versions;
-
 /**
  * {@link MixedModeConsistencyTestBase} for upgrades from v3X.
  */
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2LoggedBatchTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2LoggedBatchTest.java
deleted file mode 100644
index 3835521..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2LoggedBatchTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.shared.Versions;
-
-public class MixedModeFrom2LoggedBatchTest extends MixedModeBatchTestBase
-{
-    @Test
-    public void testSimpleStrategy22to30() throws Throwable
-    {
-        testSimpleStrategy(v22, v30, true);
-    }
-
-    @Test
-    public void testSimpleStrategy22to3X() throws Throwable
-    {
-        testSimpleStrategy(v22, v3X, true);
-    }
-}
\ No newline at end of file
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2ReplicationTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2ReplicationTest.java
deleted file mode 100644
index ea56415..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2ReplicationTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.shared.Versions;
-
-public class MixedModeFrom2ReplicationTest extends MixedModeReplicationTestBase
-{
-    @Test
-    public void testSimpleStrategy22to30() throws Throwable
-    {
-        testSimpleStrategy(v22, v30);
-    }
-
-    @Test
-    public void testSimpleStrategy22to3X() throws Throwable
-    {
-        testSimpleStrategy(v22, v3X);
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2UnloggedBatchTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2UnloggedBatchTest.java
deleted file mode 100644
index 4f4b722..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom2UnloggedBatchTest.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.shared.Versions;
-
-public class MixedModeFrom2UnloggedBatchTest extends MixedModeBatchTestBase
-{
-    @Test
-    public void testSimpleStrategy22to30() throws Throwable
-    {
-        testSimpleStrategy(v22, v30, false);
-    }
-
-    @Test
-    public void testSimpleStrategy22to3X() throws Throwable
-    {
-        testSimpleStrategy(v22, v3X, false);
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3LoggedBatchTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3LoggedBatchTest.java
index 77eb058..7326f6f 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3LoggedBatchTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3LoggedBatchTest.java
@@ -20,8 +20,6 @@
 
 import org.junit.Test;
 
-import org.apache.cassandra.distributed.shared.Versions;
-
 public class MixedModeFrom3LoggedBatchTest extends MixedModeBatchTestBase
 {
     @Test
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3ReplicationTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3ReplicationTest.java
index a38e25d..4902385 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3ReplicationTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3ReplicationTest.java
@@ -20,8 +20,6 @@
 
 import org.junit.Test;
 
-import org.apache.cassandra.distributed.shared.Versions;
-
 public class MixedModeFrom3ReplicationTest extends MixedModeReplicationTestBase
 {
     @Test
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3UnloggedBatchTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3UnloggedBatchTest.java
index 7256d2e..d169142 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3UnloggedBatchTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeFrom3UnloggedBatchTest.java
@@ -20,8 +20,6 @@
 
 import org.junit.Test;
 
-import org.apache.cassandra.distributed.shared.Versions;
-
 public class MixedModeFrom3UnloggedBatchTest extends MixedModeBatchTestBase
 {
     @Test
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeGossipTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeGossipTest.java
index e706bda..f4c9695 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeGossipTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeGossipTest.java
@@ -33,7 +33,6 @@
 import org.apache.cassandra.distributed.UpgradeableCluster;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.IMessageFilters;
-import org.apache.cassandra.distributed.shared.Versions;
 import org.apache.cassandra.net.Verb;
 import org.assertj.core.api.Assertions;
 
@@ -50,9 +49,9 @@
         .withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK))
         .nodes(3)
         .nodesToUpgradeOrdered(1, 2, 3)
-        // all upgrades from v30 up, excluding v30->v3X
-        .singleUpgrade(v30, v40)
-        .upgradesFrom(v3X)
+        // all upgrades from v30 up, excluding v30->v3X and from v40
+        .singleUpgrade(v30)
+        .singleUpgrade(v3X)
         .setup(c -> {})
         .runAfterNodeUpgrade((cluster, node) -> {
             if (node == 1) {
@@ -86,9 +85,9 @@
         .withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK))
         .nodes(3)
         .nodesToUpgradeOrdered(1, 2, 3)
-        // all upgrades from v30 up, excluding v30->v3X
-        .singleUpgrade(v30, v40)
-        .upgradesFrom(v3X)
+        // all upgrades from v30 up, excluding v30->v3X and from v40
+        .singleUpgrade(v30)
+        .singleUpgrade(v3X)
         .setup(cluster -> {
             // node2 and node3 gossiper cannot talk with each other
             cluster.filters().verbs(Verb.GOSSIP_DIGEST_SYN.id).from(2).to(3).drop();
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeMessageForwardTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeMessageForwardTest.java
index 29c3209..d1551fb 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeMessageForwardTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeMessageForwardTest.java
@@ -30,12 +30,10 @@
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.IUpgradeableInstance;
-import org.apache.cassandra.distributed.shared.Shared;
 import org.awaitility.Awaitility;
 
 import static org.apache.cassandra.distributed.shared.AssertUtils.*;
 
-@Shared
 public class MixedModeMessageForwardTest extends UpgradeTestBase
 {
     private static final Logger logger = LoggerFactory.getLogger(MixedModeMessageForwardTest.class);
@@ -105,7 +103,7 @@
         .withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK))
         .withBuilder(b -> b.withRacks(numDCs, 1, nodesPerDc))
         .nodes(numDCs * nodesPerDc)
-        .singleUpgrade(v30, v40)
+        .singleUpgrade(v30)
         .setup(cluster -> {
             cluster.schemaChange("ALTER KEYSPACE " + KEYSPACE +
                 " WITH replication = {'class': 'NetworkTopologyStrategy', " + ntsArgs + " };");
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairWriteTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairWriteTest.java
index 4e3074d..fcb0482 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairWriteTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadRepairWriteTest.java
@@ -100,4 +100,4 @@
         })
         .run();
     }
-}
\ No newline at end of file
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java
index c95aede..cbbcff0 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeReadTest.java
@@ -22,7 +22,6 @@
 
 import org.apache.cassandra.distributed.api.Feature;
 import org.apache.cassandra.distributed.api.IInvokableInstance;
-import org.apache.cassandra.distributed.shared.Versions;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.utils.CassandraVersion;
 
@@ -39,9 +38,9 @@
         .withConfig(c -> c.with(Feature.GOSSIP, Feature.NETWORK))
         .nodes(2)
         .nodesToUpgrade(1)
-        // all upgrades from v30 up, excluding v30->v3X
-        .singleUpgrade(v30, v40)
-        .upgradesFrom(v3X)
+        // all upgrades from v30 up, excluding v30->v3X and from v40
+        .singleUpgrade(v30)
+        .singleUpgrade(v3X)
         .setup(cluster -> {
             cluster.schemaChange(CREATE_TABLE);
             insertData(cluster.coordinator(1));
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRepairTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRepairTest.java
index adcfd1f..813d9f2 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRepairTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/MixedModeRepairTest.java
@@ -54,7 +54,7 @@
         new UpgradeTestBase.TestCase()
         .nodes(2)
         .nodesToUpgrade(UPGRADED_NODE)
-        .upgradesFrom(v3X)
+        .singleUpgrade(v3X)
         .withConfig(config -> config.with(NETWORK, GOSSIP))
         .setup(cluster -> {
             cluster.schemaChange(CREATE_TABLE);
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/PagingTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/PagingTest.java
deleted file mode 100644
index 30e248d..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/PagingTest.java
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.Set;
-
-import org.junit.Test;
-
-import com.datastax.driver.core.ProtocolVersion;
-import com.datastax.driver.core.QueryOptions;
-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.Statement;
-import org.apache.cassandra.distributed.api.ConsistencyLevel;
-import org.apache.cassandra.distributed.shared.DistributedTestBase;
-import org.apache.cassandra.distributed.shared.Versions;
-
-import static org.apache.cassandra.distributed.api.Feature.GOSSIP;
-import static org.apache.cassandra.distributed.api.Feature.NATIVE_PROTOCOL;
-import static org.apache.cassandra.distributed.api.Feature.NETWORK;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class PagingTest extends UpgradeTestBase
-{
-    @Test
-    public void testReads() throws Throwable
-    {
-        new UpgradeTestBase.TestCase()
-        .nodes(2)
-        .upgrades(v22, v30)
-        .nodesToUpgrade(2)
-        .withConfig(config -> config.with(GOSSIP, NETWORK, NATIVE_PROTOCOL))
-        .setup((cluster) -> {
-            cluster.disableAutoCompaction(DistributedTestBase.KEYSPACE);
-            cluster.schemaChange("CREATE TABLE " + DistributedTestBase.KEYSPACE + ".tbl (pk int, ck int, v text, PRIMARY KEY (pk, ck)) ");
-            for (int j = 0; j < 5000; j++)
-            {
-                for (int i = 0; i < 10; i++)
-                    cluster.coordinator(1).execute("insert into " + DistributedTestBase.KEYSPACE + ".tbl (pk, ck, v) VALUES (" + j + ", " + i + ", 'hello')", ConsistencyLevel.ALL);
-            }
-            cluster.forEach(c -> c.flush(DistributedTestBase.KEYSPACE));
-            checkDuplicates("BOTH ON 2.2");
-        })
-        .runAfterClusterUpgrade((cluster) -> checkDuplicates("MIXED MODE"))
-        .run();
-    }
-
-    private void checkDuplicates(String message) throws InterruptedException
-    {
-        Thread.sleep(5000); // sometimes one node doesn't have time come up properly?
-        try (com.datastax.driver.core.Cluster c = com.datastax.driver.core.Cluster.builder()
-                                                                                  .addContactPoint("127.0.0.1")
-                                                                                  .withProtocolVersion(ProtocolVersion.V3)
-                                                                                  .withQueryOptions(new QueryOptions().setFetchSize(101))
-                                                                                  .build();
-             Session s = c.connect())
-        {
-            Statement stmt = new SimpleStatement("select distinct token(pk) from " + DistributedTestBase.KEYSPACE + ".tbl WHERE token(pk) > " + Long.MIN_VALUE + " AND token(pk) < " + Long.MAX_VALUE);
-            stmt.setConsistencyLevel(com.datastax.driver.core.ConsistencyLevel.ALL);
-            ResultSet res = s.execute(stmt);
-            Set<Object> seenTokens = new HashSet<>();
-            Iterator<Row> rows = res.iterator();
-            Set<Object> dupes = new HashSet<>();
-            while (rows.hasNext())
-            {
-                Object token = rows.next().getObject(0);
-                if (seenTokens.contains(token))
-                    dupes.add(token);
-                seenTokens.add(token);
-            }
-            assertEquals(message+": too few rows", 5000, seenTokens.size());
-            assertTrue(message+": dupes is not empty", dupes.isEmpty());
-        }
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/Pre40MessageFilterTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/Pre40MessageFilterTest.java
index 3e6c9ca..4cca7b9 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/Pre40MessageFilterTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/Pre40MessageFilterTest.java
@@ -35,7 +35,7 @@
         .withConfig(configConsumer)
         .nodesToUpgrade(1)
         // all upgrades from v30 up, excluding v30->v3X
-        .singleUpgrade(v30, v40)
+        .singleUpgrade(v30)
         .upgradesFrom(v3X)
         .setup((cluster) -> {
             cluster.filters().outbound().allVerbs().messagesMatching((f,t,m) -> false).drop();
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/ReadRepairCompactStorageUpgradeTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/ReadRepairCompactStorageUpgradeTest.java
deleted file mode 100644
index 5567d40..0000000
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/ReadRepairCompactStorageUpgradeTest.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.distributed.upgrade;
-
-import org.junit.Test;
-
-import org.apache.cassandra.distributed.api.ConsistencyLevel;
-import org.apache.cassandra.distributed.shared.Versions;
-
-public class ReadRepairCompactStorageUpgradeTest extends UpgradeTestBase
-{
-    /**
-     * Tests {@code COMPACT STORAGE} behaviour with mixed replica versions.
-     * <p>
-     * See CASSANDRA-15363 for further details.
-     */
-    @Test
-    public void mixedModeReadRepairCompactStorage() throws Throwable
-    {
-        new TestCase()
-        .nodes(2)
-        .upgrades(v22, v3X)
-        .setup((cluster) -> cluster.schemaChange(withKeyspace("CREATE TABLE %s.tbl" +
-                                                              " (pk ascii, b boolean, v blob, PRIMARY KEY (pk))" +
-                                                              " WITH COMPACT STORAGE")))
-        .runAfterNodeUpgrade((cluster, node) -> {
-            if (node != 1)
-                return;
-            // now node1 is 3.0/3.x and node2 is 2.2
-            // make sure 2.2 side does not get the mutation
-            cluster.get(1).executeInternal(withKeyspace("DELETE FROM %s.tbl WHERE pk = ?"), "something");
-            // trigger a read repair
-            cluster.coordinator(2).execute(withKeyspace("SELECT * FROM %s.tbl WHERE pk = ?"),
-                                           ConsistencyLevel.ALL,
-                                           "something");
-            cluster.get(2).flush(KEYSPACE);
-        })
-        .runAfterClusterUpgrade((cluster) -> cluster.get(2).forceCompact(KEYSPACE, "tbl"))
-        .run();
-    }
-}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/RepairRequestTimeoutUpgradeTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/RepairRequestTimeoutUpgradeTest.java
new file mode 100644
index 0000000..4929d8d
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/RepairRequestTimeoutUpgradeTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.distributed.upgrade;
+
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.api.Feature;
+
+import static org.apache.cassandra.net.Verb.VALIDATION_REQ;
+
+public class RepairRequestTimeoutUpgradeTest extends UpgradeTestBase
+{
+    @Test
+    public void simpleUpgradeWithNetworkAndGossipTest() throws Throwable
+    {
+        new TestCase()
+        .nodes(2)
+        .nodesToUpgrade(1)
+        .withConfig((cfg) -> cfg.with(Feature.NETWORK, Feature.GOSSIP).set("repair_request_timeout_in_ms", 1000))
+        .upgrades(v40, v41)
+        .setup((cluster) -> {
+            cluster.schemaChange("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck))");
+            for (int i = 0; i < 10; i++)
+                cluster.get(i % 2 + 1).executeInternal("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES ("+i+", 1, 1)");
+            cluster.forEach(i -> i.flush(KEYSPACE));
+        })
+        .runAfterNodeUpgrade((cluster, node) -> {
+            cluster.filters().verbs(VALIDATION_REQ.id).drop();
+            cluster.get(2).nodetoolResult("repair", KEYSPACE, "-full").asserts().failure();
+            cluster.filters().reset();
+            for (int i = 10; i < 20; i++)
+                cluster.get(i % 2 + 1).executeInternal("INSERT INTO " + KEYSPACE + ".tbl (pk, ck, v) VALUES ("+i+", 1, 1)");
+            cluster.forEach(i -> i.flush(KEYSPACE));
+            cluster.get(1).nodetoolResult("repair", KEYSPACE, "-full").asserts().success();
+        }).run();
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
index 691d8af..b1692b9 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTest.java
@@ -22,7 +22,6 @@
 
 import org.apache.cassandra.distributed.api.ConsistencyLevel;
 import org.apache.cassandra.distributed.api.Feature;
-import org.apache.cassandra.distributed.shared.Versions;
 import static org.apache.cassandra.distributed.shared.AssertUtils.*;
 
 public class UpgradeTest extends UpgradeTestBase
diff --git a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java
index 11178c3..5c32fcd 100644
--- a/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java
+++ b/test/distributed/org/apache/cassandra/distributed/upgrade/UpgradeTestBase.java
@@ -32,13 +32,16 @@
 import org.junit.After;
 import org.junit.BeforeClass;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.distributed.UpgradeableCluster;
 import org.apache.cassandra.distributed.api.ICluster;
 import org.apache.cassandra.distributed.api.IInstanceConfig;
-import org.apache.cassandra.distributed.impl.Instance;
 import org.apache.cassandra.distributed.shared.DistributedTestBase;
+import org.apache.cassandra.distributed.shared.ThrowingRunnable;
 import org.apache.cassandra.distributed.shared.Versions;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Pair;
@@ -46,10 +49,10 @@
 import static org.apache.cassandra.distributed.shared.Versions.Version;
 import static org.apache.cassandra.distributed.shared.Versions.find;
 
-
-
 public class UpgradeTestBase extends DistributedTestBase
 {
+    private static final Logger logger = LoggerFactory.getLogger(UpgradeTestBase.class);
+
     @After
     public void afterEach()
     {
@@ -79,17 +82,18 @@
         public void run(UpgradeableCluster cluster, int node) throws Throwable;
     }
 
-    public static final Semver v22 = new Semver("2.2.0-beta1", SemverType.LOOSE);
     public static final Semver v30 = new Semver("3.0.0-alpha1", SemverType.LOOSE);
     public static final Semver v3X = new Semver("3.11.0", SemverType.LOOSE);
     public static final Semver v40 = new Semver("4.0-alpha1", SemverType.LOOSE);
+    public static final Semver v41 = new Semver("4.1-alpha1", SemverType.LOOSE);
 
     protected static final List<Pair<Semver,Semver>> SUPPORTED_UPGRADE_PATHS = ImmutableList.of(
-        Pair.create(v22, v30),
-        Pair.create(v22, v3X),
         Pair.create(v30, v3X),
         Pair.create(v30, v40),
-        Pair.create(v3X, v40));
+        Pair.create(v30, v41),
+        Pair.create(v3X, v40),
+        Pair.create(v3X, v41),
+        Pair.create(v40, v41));
 
     // the last is always the current
     public static final Semver CURRENT = SUPPORTED_UPGRADE_PATHS.get(SUPPORTED_UPGRADE_PATHS.size() - 1).right;
@@ -106,7 +110,7 @@
         }
     }
 
-    public static class TestCase implements Instance.ThrowingRunnable
+    public static class TestCase implements ThrowingRunnable
     {
         private final Versions versions;
         private final List<TestVersions> upgrade = new ArrayList<>();
@@ -155,9 +159,9 @@
         }
 
         /** Will test this specific upgrade path **/
-        public TestCase singleUpgrade(Semver from, Semver to)
+        public TestCase singleUpgrade(Semver from)
         {
-            this.upgrade.add(new TestVersions(versions.getLatest(from), versions.getLatest(to)));
+            this.upgrade.add(new TestVersions(versions.getLatest(from), versions.getLatest(CURRENT)));
             return this;
         }
 
@@ -217,7 +221,7 @@
 
             for (TestVersions upgrade : this.upgrade)
             {
-                System.out.printf("testing upgrade from %s to %s%n", upgrade.initial.version, upgrade.upgrade.version);
+                logger.info("testing upgrade from {} to {}", upgrade.initial.version, upgrade.upgrade.version);
                 try (UpgradeableCluster cluster = init(UpgradeableCluster.create(nodeCount, upgrade.initial, configConsumer, builderConsumer)))
                 {
                     setup.run(cluster);
@@ -259,7 +263,7 @@
     protected TestCase allUpgrades(int nodes, int... toUpgrade)
     {
         return new TestCase().nodes(nodes)
-                             .upgradesFrom(v22)
+                             .upgradesFrom(v30)
                              .nodesToUpgrade(toUpgrade);
     }
 
diff --git a/test/distributed/org/apache/cassandra/distributed/util/QueryResultUtil.java b/test/distributed/org/apache/cassandra/distributed/util/QueryResultUtil.java
new file mode 100644
index 0000000..a502e8c
--- /dev/null
+++ b/test/distributed/org/apache/cassandra/distributed/util/QueryResultUtil.java
@@ -0,0 +1,187 @@
+/*
+ * 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.distributed.util;
+
+import java.util.Arrays;
+import java.util.Objects;
+import java.util.function.Predicate;
+
+import com.google.monitoring.runtime.instrumentation.common.collect.Iterators;
+import org.apache.cassandra.distributed.api.Row;
+import org.apache.cassandra.distributed.api.SimpleQueryResult;
+import org.apache.cassandra.tools.nodetool.formatter.TableBuilder;
+import org.assertj.core.api.Assertions;
+
+public class QueryResultUtil
+{
+    private QueryResultUtil()
+    {
+    }
+
+    public static boolean contains(SimpleQueryResult qr, Object... values)
+    {
+        return contains(qr, a -> equals(a, values));
+    }
+
+    public static boolean contains(SimpleQueryResult qr, Row row)
+    {
+        return contains(qr, a -> equals(a, row));
+    }
+
+    public static boolean contains(SimpleQueryResult qr, Predicate<Row> fn)
+    {
+        while (qr.hasNext())
+        {
+            if (fn.test(qr.next()))
+                return true;
+        }
+        return false;
+    }
+
+    private static boolean equals(Row a, Row b)
+    {
+        return equals(a, b.toObjectArray());
+    }
+
+    private static boolean equals(Row a, Object[] bs)
+    {
+        Object[] as = a.toObjectArray();
+        if (as.length != bs.length)
+            return false;
+        for (int i = 0; i < as.length; i++)
+        {
+            if (!Objects.equals(as[i], bs[i]))
+                return false;
+        }
+        return true;
+    }
+
+    public static SimpleQueryResultAssertHelper assertThat(SimpleQueryResult qr)
+    {
+        return new SimpleQueryResultAssertHelper(qr);
+    }
+
+    public static RowAssertHelper assertThat(Row row)
+    {
+        return new RowAssertHelper(row);
+    }
+
+    public static String expand(SimpleQueryResult qr)
+    {
+        StringBuilder sb = new StringBuilder();
+        int rowNum = 1;
+        while (qr.hasNext())
+        {
+            sb.append("@ Row ").append(rowNum).append('\n');
+            TableBuilder table = new TableBuilder('|');
+            Row next = qr.next();
+            for (String column : qr.names())
+            {
+                Object value = next.get(column);
+                table.add(column, value == null ? null : value.toString());
+            }
+            sb.append(table);
+        }
+        return sb.toString();
+    }
+
+    public static class RowAssertHelper
+    {
+        private final Row row;
+
+        public RowAssertHelper(Row row)
+        {
+            this.row = row;
+        }
+
+        public RowAssertHelper isEqualTo(String column, Object expected)
+        {
+            Object actual = row.get(column);
+            Assertions.assertThat(actual).describedAs("Column %s had unexpected value", column).isEqualTo(expected);
+            return this;
+        }
+
+        public RowAssertHelper columnsEqualTo(String first, String... others)
+        {
+            Object expected = row.get(first);
+            for (String other : others)
+                Assertions.assertThat(row.<Object>get(other)).describedAs("Columns %s and %s are not equal", first, other).isEqualTo(expected);
+            return this;
+        }
+    }
+
+    public static class SimpleQueryResultAssertHelper
+    {
+        private final SimpleQueryResult qr;
+
+        private SimpleQueryResultAssertHelper(SimpleQueryResult qr)
+        {
+            this.qr = qr;
+        }
+
+        public SimpleQueryResultAssertHelper contains(Object... values)
+        {
+            qr.reset();
+            if (!QueryResultUtil.contains(qr, a -> QueryResultUtil.equals(a, values)))
+                throw new AssertionError("Row " + Arrays.asList(values) + " is not present");
+            return this;
+        }
+
+        public SimpleQueryResultAssertHelper contains(Row row)
+        {
+            qr.reset();
+            if (!QueryResultUtil.contains(qr, a -> QueryResultUtil.equals(a, row)))
+                throw new AssertionError("Row " + row + " is not present");
+            return this;
+        }
+
+        public SimpleQueryResultAssertHelper contains(Predicate<Row> fn)
+        {
+            qr.reset();
+            if (!QueryResultUtil.contains(qr, fn))
+                throw new AssertionError("Row  is not present");
+            return this;
+        }
+
+        public SimpleQueryResultAssertHelper isEqualTo(Object... values)
+        {
+            Assertions.assertThat(qr.toObjectArrays())
+                      .hasSize(1)
+                      .contains(values);
+            return this;
+        }
+
+        public SimpleQueryResultAssertHelper hasSize(int size)
+        {
+            Assertions.assertThat(qr.toObjectArrays()).hasSize(size);
+            return this;
+        }
+
+        public SimpleQueryResultAssertHelper hasSizeGreaterThan(int size)
+        {
+            Assertions.assertThat(qr.toObjectArrays()).hasSizeGreaterThan(size);
+            return this;
+        }
+
+        public void isEmpty()
+        {
+            int size = Iterators.size(qr);
+            Assertions.assertThat(size).describedAs("QueryResult is not empty").isEqualTo(0);
+        }
+    }
+}
diff --git a/test/distributed/org/apache/cassandra/io/sstable/format/ForwardingSSTableReader.java b/test/distributed/org/apache/cassandra/io/sstable/format/ForwardingSSTableReader.java
index 9a76661..9012dcc 100644
--- a/test/distributed/org/apache/cassandra/io/sstable/format/ForwardingSSTableReader.java
+++ b/test/distributed/org/apache/cassandra/io/sstable/format/ForwardingSSTableReader.java
@@ -23,7 +23,6 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
-import java.util.UUID;
 
 import com.google.common.util.concurrent.RateLimiter;
 
@@ -36,6 +35,7 @@
 import org.apache.cassandra.db.RowIndexEntry;
 import org.apache.cassandra.db.Slices;
 import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
 import org.apache.cassandra.db.rows.EncodingStats;
 import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.dht.AbstractBounds;
@@ -56,6 +56,7 @@
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.utils.EstimatedHistogram;
 import org.apache.cassandra.utils.IFilter;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Ref;
 
 public abstract class ForwardingSSTableReader extends SSTableReader
@@ -283,15 +284,15 @@
     }
 
     @Override
-    public UnfilteredRowIterator iterator(DecoratedKey key, Slices slices, ColumnFilter selectedColumns, boolean reversed, SSTableReadsListener listener)
+    public UnfilteredRowIterator rowIterator(DecoratedKey key, Slices slices, ColumnFilter selectedColumns, boolean reversed, SSTableReadsListener listener)
     {
-        return delegate.iterator(key, slices, selectedColumns, reversed, listener);
+        return delegate.rowIterator(key, slices, selectedColumns, reversed, listener);
     }
 
     @Override
-    public UnfilteredRowIterator iterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed)
+    public UnfilteredRowIterator rowIterator(FileDataInput file, DecoratedKey key, RowIndexEntry indexEntry, Slices slices, ColumnFilter selectedColumns, boolean reversed)
     {
-        return delegate.iterator(file, key, indexEntry, slices, selectedColumns, reversed);
+        return delegate.rowIterator(file, key, indexEntry, slices, selectedColumns, reversed);
     }
 
     @Override
@@ -385,9 +386,9 @@
     }
 
     @Override
-    public ISSTableScanner getScanner(ColumnFilter columns, DataRange dataRange, SSTableReadsListener listener)
+    public UnfilteredPartitionIterator partitionIterator(ColumnFilter columns, DataRange dataRange, SSTableReadsListener listener)
     {
-        return delegate.getScanner(columns, dataRange, listener);
+        return delegate.partitionIterator(columns, dataRange, listener);
     }
 
     @Override
@@ -427,7 +428,7 @@
     }
 
     @Override
-    public UUID getPendingRepair()
+    public TimeUUID getPendingRepair()
     {
         return delegate.getPendingRepair();
     }
diff --git a/test/long/org/apache/cassandra/cql3/CorruptionTest.java b/test/long/org/apache/cassandra/cql3/CorruptionTest.java
index f2ed36a..0ef43a0 100644
--- a/test/long/org/apache/cassandra/cql3/CorruptionTest.java
+++ b/test/long/org/apache/cassandra/cql3/CorruptionTest.java
@@ -18,8 +18,6 @@
 package org.apache.cassandra.cql3;
 
 
-import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -28,6 +26,10 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.io.util.File;
+
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -35,13 +37,12 @@
 import com.datastax.driver.core.policies.LoggingRetryPolicy;
 import com.datastax.driver.core.policies.Policies;
 import com.datastax.driver.core.utils.Bytes;
-import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.io.util.FileWriter;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 
-public class CorruptionTest extends SchemaLoader
+public class CorruptionTest
 {
 
     private static EmbeddedCassandraService cassandra;
@@ -59,10 +60,7 @@
     @BeforeClass()
     public static void setup() throws ConfigurationException, IOException
     {
-        Schema.instance.clear();
-
-        cassandra = new EmbeddedCassandraService();
-        cassandra.start();
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
 
         cluster = Cluster.builder().addContactPoint("127.0.0.1")
                          .withRetryPolicy(new LoggingRetryPolicy(Policies.defaultRetryPolicy()))
@@ -102,6 +100,15 @@
         VALUE = s.toString();
     }
 
+    @AfterClass
+    public static void tearDown()
+    {
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
+    }
+
     @Test
     public void runCorruptionTest()
     {
@@ -145,10 +152,12 @@
                     String basename = "bad-data-tid" + Thread.currentThread().getId();
                     File put = new File(basename+"-put");
                     File get = new File(basename+"-get");
-                    try(FileWriter pw = new FileWriter(put)) {
+                    try (FileWriter pw = put.newWriter(File.WriteMode.OVERWRITE))
+                    {
                         pw.write(new String(putdata));
                     }
-                    try(FileWriter pw = new FileWriter(get)) {
+                    try (FileWriter pw = get.newWriter(File.WriteMode.OVERWRITE))
+                    {
                         pw.write(new String(getdata));
                     }
                 }
diff --git a/test/long/org/apache/cassandra/cql3/ViewLongTest.java b/test/long/org/apache/cassandra/cql3/ViewLongTest.java
index de888d4..2a9415f 100644
--- a/test/long/org/apache/cassandra/cql3/ViewLongTest.java
+++ b/test/long/org/apache/cassandra/cql3/ViewLongTest.java
@@ -18,86 +18,25 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.CyclicBarrier;
-import java.util.stream.Collectors;
 
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
 
 import com.datastax.driver.core.Row;
 import com.datastax.driver.core.exceptions.NoHostAvailableException;
-import com.datastax.driver.core.exceptions.OperationTimedOutException;
 import com.datastax.driver.core.exceptions.WriteTimeoutException;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.batchlog.BatchlogManager;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.concurrent.SEPExecutor;
-import org.apache.cassandra.concurrent.Stage;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.WrappedRunnable;
 
-@RunWith(Parameterized.class)
-public class ViewLongTest extends CQLTester
+public class ViewLongTest extends ViewAbstractParameterizedTest
 {
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ProtocolVersion.SUPPORTED.stream()
-                                        .map(v -> new Object[]{v})
-                                        .collect(Collectors.toList());
-    }
-
-    private final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        requireNetwork();
-    }
-    @Before
-    public void begin()
-    {
-        views.clear();
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        for (String viewName : views)
-            executeNet(version, "DROP MATERIALIZED VIEW " + viewName);
-    }
-
-    private void createView(String name, String query) throws Throwable
-    {
-        try
-        {
-            executeNet(version, String.format(query, name));
-            // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is
-            // the desired behavior
-            views.add(name);
-        }
-        catch (OperationTimedOutException ex)
-        {
-            // ... except for timeout, when we actually do not know whether the view was created or not
-            views.add(name);
-            throw ex;
-        }
-    }
-
     @Test
     public void testConflictResolution() throws Throwable
     {
@@ -111,9 +50,9 @@
                     "c int," +
                     "PRIMARY KEY (a, b))");
 
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL " +
+                   "PRIMARY KEY (c, a, b)");
 
         CyclicBarrier semaphore = new CyclicBarrier(writers);
 
@@ -121,7 +60,7 @@
         for (int i = 0; i < writers; i++)
         {
             final int writer = i;
-            Thread t = NamedThreadFactory.createThread(new WrappedRunnable()
+            Thread t = NamedThreadFactory.createAnonymousThread(new WrappedRunnable()
             {
                 public void runMayThrow()
                 {
@@ -133,7 +72,7 @@
                         {
                             try
                             {
-                                executeNet(version, "INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP 1",
+                                executeNet("INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP 1",
                                            1,
                                            1,
                                            i + writerOffset);
@@ -159,7 +98,7 @@
 
         for (int i = 0; i < writers * insertsPerWriter; i++)
         {
-            if (executeNet(version, "SELECT COUNT(*) FROM system.batches").one().getLong(0) == 0)
+            if (executeNet("SELECT COUNT(*) FROM system.batches").one().getLong(0) == 0)
                 break;
             try
             {
@@ -173,9 +112,9 @@
             }
         }
 
-        int value = executeNet(version, "SELECT c FROM %s WHERE a = 1 AND b = 1").one().getInt("c");
+        int value = executeNet("SELECT c FROM %s WHERE a = 1 AND b = 1").one().getInt("c");
 
-        List<Row> rows = executeNet(version, "SELECT c FROM " + keyspace() + ".mv").all();
+        List<Row> rows = executeNet("SELECT c FROM " + keyspace() + "." + currentView()).all();
 
         boolean containsC = false;
         StringBuilder others = new StringBuilder();
@@ -203,13 +142,19 @@
 
         if (rows.size() > 1)
         {
-            throw new AssertionError(String.format("Expected 1 row, but found %d; %s c = %d, and (%s) of which (%s) failed to insert", rows.size(), containsC ? "found row with" : "no rows contained", value, others, overlappingFailedWrites));
+            throw new AssertionError(String.format("Expected 1 row, but found %d; %s c = %d, " +
+                                                   "and (%s) of which (%s) failed to insert",
+                                                   rows.size(),
+                                                   containsC ? "found row with" : "no rows contained",
+                                                   value,
+                                                   others,
+                                                   overlappingFailedWrites));
         }
         else if (rows.isEmpty())
         {
             throw new AssertionError(String.format("Could not find row with c = %d", value));
         }
-        else if (rows.size() == 1 && !containsC)
+        else if (!containsC)
         {
             throw new AssertionError(String.format("Single row had c = %d, expected %d", rows.get(0).getInt("c"), value));
         }
@@ -231,104 +176,102 @@
     {
         createTable("CREATE TABLE %s (field1 int,field2 int,date int,PRIMARY KEY ((field1), field2)) WITH default_time_to_live = 5;");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv",
-                   "CREATE MATERIALIZED VIEW mv AS SELECT * FROM %%s WHERE field1 IS NOT NULL AND field2 IS NOT NULL AND date IS NOT NULL PRIMARY KEY ((field1), date, field2) WITH CLUSTERING ORDER BY (date desc, field2 asc);");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE field1 IS NOT NULL AND field2 IS NOT NULL AND date IS NOT NULL " +
+                   "PRIMARY KEY ((field1), date, field2) WITH CLUSTERING ORDER BY (date desc, field2 asc)");
 
         updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 111);", flush);
         assertRows(execute("select * from %s"), row(1, 2, 111));
-        assertRows(execute("select * from mv"), row(1, 111, 2));
+        assertRows(executeView("select * from %s"), row(1, 111, 2));
 
         updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 222);", flush);
         assertRows(execute("select * from %s"), row(1, 2, 222));
-        assertRows(execute("select * from mv"), row(1, 222, 2));
+        assertRows(executeView("select * from %s"), row(1, 222, 2));
 
         updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 333);", flush);
 
         assertRows(execute("select * from %s"), row(1, 2, 333));
-        assertRows(execute("select * from mv"), row(1, 333, 2));
+        assertRows(executeView("select * from %s"), row(1, 333, 2));
 
         if (flush)
         {
-            Keyspace.open(keyspace()).getColumnFamilyStore("mv").forceMajorCompaction();
+            Keyspace.open(keyspace()).getColumnFamilyStore(currentView()).forceMajorCompaction();
             assertRows(execute("select * from %s"), row(1, 2, 333));
-            assertRows(execute("select * from mv"), row(1, 333, 2));
+            assertRows(executeView("select * from %s"), row(1, 333, 2));
         }
 
         // wait for ttl, data should be removed
         updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 444);", flush);
         assertRows(execute("select * from %s"), row(1, 2, 444));
-        assertRows(execute("select * from mv"), row(1, 444, 2));
+        assertRows(executeView("select * from %s"), row(1, 444, 2));
 
         Thread.sleep(5000);
         assertRows(execute("select * from %s"));
-        assertRows(execute("select * from mv"));
+        assertRows(executeView("select * from %s"));
 
         // shadow mv with date=555 and then update it back to live, wait for ttl
         updateView("update %s set date=555 where field1=1 and field2=2;");
         updateView("update %s set date=666 where field1=1 and field2=2;");
         updateViewWithFlush("update %s set date=555 where field1=1 and field2=2;", flush);
         assertRows(execute("select * from %s"), row(1, 2, 555));
-        assertRows(execute("select * from mv"), row(1, 555, 2));
+        assertRows(executeView("select * from %s"), row(1, 555, 2));
 
         Thread.sleep(5000);
         assertRows(execute("select * from %s"));
-        assertRows(execute("select * from mv"));
+        assertRows(executeView("select * from %s"));
 
         // test user-provided ttl for table with/without default-ttl
         for (boolean withDefaultTTL : Arrays.asList(true, false))
         {
             execute("TRUNCATE %s");
             if (withDefaultTTL)
-                execute("ALTER TABLE %s with default_time_to_live=" + (withDefaultTTL ? 10 : 0));
+                execute("ALTER TABLE %s with default_time_to_live=" + 10);
             updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 666) USING TTL 1000;", flush);
 
             assertRows(execute("select * from %s"), row(1, 2, 666));
-            assertRows(execute("select * from mv"), row(1, 666, 2));
+            assertRows(executeView("select * from %s"), row(1, 666, 2));
 
             updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 777) USING TTL 1100;", flush);
             assertRows(execute("select * from %s"), row(1, 2, 777));
-            assertRows(execute("select * from mv"), row(1, 777, 2));
+            assertRows(executeView("select * from %s"), row(1, 777, 2));
 
             updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 888) USING TTL 800;", flush);
 
             assertRows(execute("select * from %s"), row(1, 2, 888));
-            assertRows(execute("select * from mv"), row(1, 888, 2));
+            assertRows(executeView("select * from %s"), row(1, 888, 2));
 
             if (flush)
             {
-                Keyspace.open(keyspace()).getColumnFamilyStore("mv").forceMajorCompaction();
+                Keyspace.open(keyspace()).getColumnFamilyStore(currentView()).forceMajorCompaction();
                 assertRows(execute("select * from %s"), row(1, 2, 888));
-                assertRows(execute("select * from mv"), row(1, 888, 2));
+                assertRows(executeView("select * from %s"), row(1, 888, 2));
             }
 
             // wait for ttl, data should be removed
             updateViewWithFlush("insert into %s (field1, field2, date) values (1, 2, 999) USING TTL 5;", flush);
             assertRows(execute("select * from %s"), row(1, 2, 999));
-            assertRows(execute("select * from mv"), row(1, 999, 2));
+            assertRows(executeView("select * from %s"), row(1, 999, 2));
 
             Thread.sleep(5000);
             assertRows(execute("select * from %s"));
-            assertRows(execute("select * from mv"));
+            assertRows(executeView("select * from %s"));
 
             // shadow mv with date=555 and then update it back to live with ttl=5, wait for ttl to expire
             updateViewWithFlush("update %s  USING TTL 800 set date=555 where field1=1 and field2=2;", flush);
             assertRows(execute("select * from %s"), row(1, 2, 555));
-            assertRows(execute("select * from mv"), row(1, 555, 2));
+            assertRows(executeView("select * from %s"), row(1, 555, 2));
 
             updateViewWithFlush("update %s set date=666 where field1=1 and field2=2;", flush);
             assertRows(execute("select * from %s"), row(1, 2, 666));
-            assertRows(execute("select * from mv"), row(1, 666, 2));
+            assertRows(executeView("select * from %s"), row(1, 666, 2));
 
             updateViewWithFlush("update %s USING TTL 5 set date=555 where field1=1 and field2=2;", flush);
             assertRows(execute("select * from %s"), row(1, 2, 555));
-            assertRows(execute("select * from mv"), row(1, 555, 2));
+            assertRows(executeView("select * from %s"), row(1, 555, 2));
 
             Thread.sleep(5000);
             assertRows(execute("select * from %s"));
-            assertRows(execute("select * from mv"));
+            assertRows(executeView("select * from %s"));
         }
     }
 
@@ -348,35 +291,32 @@
     {
         createTable("CREATE TABLE %s (k int,c int,a int, b int, PRIMARY KEY ((k), c)) WITH default_time_to_live = 1000;");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv",
-                   "CREATE MATERIALIZED VIEW mv AS SELECT k,c,a FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL "
-                           + "PRIMARY KEY (c, k)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT k,c,a FROM %s " +
+                   "WHERE k IS NOT NULL AND c IS NOT NULL " +
+                   "PRIMARY KEY (c, k)");
 
         // table default ttl
         updateViewWithFlush("UPDATE %s SET b = 111 WHERE k = 1 AND c = 2", flush);
         assertRows(execute("select k,c,a,b from %s"), row(1, 2, null, 111));
-        assertRows(execute("select k,c,a from mv"), row(1, 2, null));
+        assertRows(executeView("select k,c,a from %s"), row(1, 2, null));
 
         updateViewWithFlush("UPDATE %s SET b = null WHERE k = 1 AND c = 2", flush);
         assertRows(execute("select k,c,a,b from %s"));
-        assertRows(execute("select k,c,a from mv"));
+        assertRows(executeView("select k,c,a from %s"));
 
         updateViewWithFlush("UPDATE %s SET b = 222 WHERE k = 1 AND c = 2", flush);
         assertRows(execute("select k,c,a,b from %s"), row(1, 2, null, 222));
-        assertRows(execute("select k,c,a from mv"), row(1, 2, null));
+        assertRows(executeView("select k,c,a from %s"), row(1, 2, null));
 
         updateViewWithFlush("DELETE b FROM %s WHERE k = 1 AND c = 2", flush);
         assertRows(execute("select k,c,a,b from %s"));
-        assertRows(execute("select k,c,a from mv"));
+        assertRows(executeView("select k,c,a from %s"));
 
         if (flush)
         {
-            Keyspace.open(keyspace()).getColumnFamilyStore("mv").forceMajorCompaction();
+            Keyspace.open(keyspace()).getColumnFamilyStore(currentView()).forceMajorCompaction();
             assertRows(execute("select k,c,a,b from %s"));
-            assertRows(execute("select k,c,a from mv"));
+            assertRows(executeView("select k,c,a from %s"));
         }
 
         // test user-provided ttl for table with/without default-ttl
@@ -384,59 +324,42 @@
         {
             execute("TRUNCATE %s");
             if (withDefaultTTL)
-                execute("ALTER TABLE %s with default_time_to_live=" + (withDefaultTTL ? 10 : 0));
+                execute("ALTER TABLE %s with default_time_to_live=" + 10);
 
             updateViewWithFlush("UPDATE %s USING TTL 100 SET b = 666 WHERE k = 1 AND c = 2", flush);
             assertRows(execute("select k,c,a,b from %s"), row(1, 2, null, 666));
-            assertRows(execute("select k,c,a from mv"), row(1, 2, null));
+            assertRows(executeView("select k,c,a from %s"), row(1, 2, null));
 
             updateViewWithFlush("UPDATE %s USING TTL 90  SET b = null WHERE k = 1 AND c = 2", flush);
             if (flush)
-                FBUtilities.waitOnFutures(Keyspace.open(keyspace()).flush());
+                Util.flushKeyspace(keyspace());
             assertRows(execute("select k,c,a,b from %s"));
-            assertRows(execute("select k,c,a from mv"));
+            assertRows(executeView("select k,c,a from %s"));
 
             updateViewWithFlush("UPDATE %s USING TTL 80  SET b = 777 WHERE k = 1 AND c = 2", flush);
             assertRows(execute("select k,c,a,b from %s"), row(1, 2, null, 777));
-            assertRows(execute("select k,c,a from mv"), row(1, 2, null));
+            assertRows(executeView("select k,c,a from %s"), row(1, 2, null));
 
             updateViewWithFlush("DELETE b FROM %s WHERE k = 1 AND c = 2", flush);
             assertRows(execute("select k,c,a,b from %s"));
-            assertRows(execute("select k,c,a from mv"));
+            assertRows(executeView("select k,c,a from %s"));
 
             updateViewWithFlush("UPDATE %s USING TTL 110  SET b = 888 WHERE k = 1 AND c = 2", flush);
             assertRows(execute("select k,c,a,b from %s"), row(1, 2, null, 888));
-            assertRows(execute("select k,c,a from mv"), row(1, 2, null));
+            assertRows(executeView("select k,c,a from %s"), row(1, 2, null));
 
             updateViewWithFlush("UPDATE %s USING TTL 5  SET b = 999 WHERE k = 1 AND c = 2", flush);
             assertRows(execute("select k,c,a,b from %s"), row(1, 2, null, 999));
-            assertRows(execute("select k,c,a from mv"), row(1, 2, null));
+            assertRows(executeView("select k,c,a from %s"), row(1, 2, null));
 
             Thread.sleep(5000); // wait for ttl expired
 
             if (flush)
             {
-                Keyspace.open(keyspace()).getColumnFamilyStore("mv").forceMajorCompaction();
+                Keyspace.open(keyspace()).getColumnFamilyStore(currentView()).forceMajorCompaction();
                 assertRows(execute("select k,c,a,b from %s"));
-                assertRows(execute("select k,c,a from mv"));
+                assertRows(executeView("select k,c,a from %s"));
             }
         }
     }
-
-    private void updateView(String query, Object... params) throws Throwable
-    {
-        updateViewWithFlush(query, false, params);
-    }
-
-    private void updateViewWithFlush(String query, boolean flush, Object... params) throws Throwable
-    {
-        executeNet(version, query, params);
-        while (!(((SEPExecutor) Stage.VIEW_MUTATION.executor()).getPendingTaskCount() == 0
-                && ((SEPExecutor) Stage.VIEW_MUTATION.executor()).getActiveTaskCount() == 0))
-        {
-            Thread.sleep(1);
-        }
-        if (flush)
-            Keyspace.open(keyspace()).flush();
-    }
 }
diff --git a/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java b/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java
index a4f98e9..9531dd2 100644
--- a/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java
+++ b/test/long/org/apache/cassandra/db/commitlog/CommitLogStressTest.java
@@ -21,7 +21,7 @@
  *
  */
 
-import java.io.*;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.*;
@@ -30,6 +30,8 @@
 
 import com.google.common.util.concurrent.RateLimiter;
 
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -55,6 +57,7 @@
 import org.apache.cassandra.security.EncryptionContext;
 import org.apache.cassandra.security.EncryptionContextGenerator;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 @Ignore
 public abstract class CommitLogStressTest
@@ -101,7 +104,7 @@
     @BeforeClass
     static public void initialize() throws IOException
     {
-        try (FileInputStream fis = new FileInputStream("CHANGES.txt"))
+        try (FileInputStreamPlus fis = new FileInputStreamPlus("CHANGES.txt"))
         {
             dataSource = ByteBuffer.allocateDirect((int) fis.getChannel().size());
             while (dataSource.hasRemaining())
@@ -123,15 +126,15 @@
         File dir = new File(location);
         if (dir.isDirectory())
         {
-            File[] files = dir.listFiles();
+            File[] files = dir.tryList();
 
             for (File f : files)
-                if (!f.delete())
+                if (!f.tryDelete())
                     Assert.fail("Failed to delete " + f);
         }
         else
         {
-            dir.mkdir();
+            dir.tryCreateDirectory();
         }
     }
 
@@ -245,13 +248,13 @@
         System.out.println("Stopped. Replaying... ");
         System.out.flush();
         Reader reader = new Reader();
-        File[] files = new File(location).listFiles();
+        File[] files = new File(location).tryList();
 
         DummyHandler handler = new DummyHandler();
         reader.readAllFiles(handler, files);
 
         for (File f : files)
-            if (!f.delete())
+            if (!f.tryDelete())
                 Assert.fail("Failed to delete " + f);
 
         if (hash == reader.hash && cells == reader.cells)
@@ -278,7 +281,7 @@
         commitLog.segmentManager.awaitManagementTasksCompletion();
 
         long combinedSize = 0;
-        for (File f : new File(commitLog.segmentManager.storageDirectory).listFiles())
+        for (File f : new File(commitLog.segmentManager.storageDirectory).tryList())
             combinedSize += f.length();
         Assert.assertEquals(combinedSize, commitLog.getActiveOnDiskSize());
 
@@ -307,7 +310,7 @@
             t.start();
         }
 
-        final long start = System.currentTimeMillis();
+        final long start = currentTimeMillis();
         Runnable printRunnable = new Runnable()
         {
             long lastUpdate = 0;
@@ -325,11 +328,11 @@
                     temp += clt.counter.get();
                     sz += clt.dataSize;
                 }
-                double time = (System.currentTimeMillis() - start) / 1000.0;
+                double time = (currentTimeMillis() - start) / 1000.0;
                 double avg = (temp / time);
                 System.out.println(
                         String.format("second %d mem max %.0fmb allocated %.0fmb free %.0fmb mutations %d since start %d avg %.3f content %.1fmb ondisk %.1fmb transfer %.3fmb",
-                                      ((System.currentTimeMillis() - start) / 1000),
+                                      ((currentTimeMillis() - start) / 1000),
                                       mb(maxMemory),
                                       mb(allocatedMemory),
                                       mb(freeMemory),
diff --git a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java
index fe8cdc2..a75ca52 100644
--- a/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java
+++ b/test/long/org/apache/cassandra/db/compaction/LongCompactionsTest.java
@@ -40,6 +40,9 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 
 public class LongCompactionsTest
@@ -122,8 +125,8 @@
         // give garbage collection a bit of time to catch up
         Thread.sleep(1000);
 
-        long start = System.nanoTime();
-        final int gcBefore = (int) (System.currentTimeMillis() / 1000) - Schema.instance.getTableMetadata(KEYSPACE1, "Standard1").params.gcGraceSeconds;
+        long start = nanoTime();
+        final int gcBefore = (int) (currentTimeMillis() / 1000) - Schema.instance.getTableMetadata(KEYSPACE1, "Standard1").params.gcGraceSeconds;
         try (LifecycleTransaction txn = store.getTracker().tryModify(sstables, OperationType.COMPACTION))
         {
             assert txn != null : "Cannot markCompacting all sstables";
@@ -134,7 +137,7 @@
                                          sstableCount,
                                          partitionsPerSSTable,
                                          rowsPerPartition,
-                                         TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start)));
+                                         TimeUnit.NANOSECONDS.toMillis(nanoTime() - start)));
     }
 
     @Test
@@ -165,7 +168,7 @@
 
                 inserted.add(key);
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
             CompactionsTest.assertMaxTimestamp(cfs, maxTimestampExpected);
 
             assertEquals(inserted.toString(), inserted.size(), Util.getAll(Util.cmd(cfs).build()).size());
diff --git a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java
index 9bfa380..1df7e7c 100644
--- a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java
+++ b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyCQLTest.java
@@ -32,9 +32,12 @@
 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.utils.Clock.Global.currentTimeMillis;
+
 public class LongLeveledCompactionStrategyCQLTest extends CQLTester
 {
 
@@ -47,7 +50,7 @@
         ExecutorService es = Executors.newSingleThreadExecutor();
         DatabaseDescriptor.setConcurrentCompactors(8);
         AtomicBoolean stop = new AtomicBoolean(false);
-        long start = System.currentTimeMillis();
+        long start = currentTimeMillis();
         try
         {
             Random r = new Random();
@@ -70,12 +73,12 @@
                             throw new RuntimeException(throwable);
                         }
                     }
-                    getCurrentColumnFamilyStore().forceBlockingFlush();
+                    getCurrentColumnFamilyStore().forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
                     Uninterruptibles.sleepUninterruptibly(r.nextInt(200), TimeUnit.MILLISECONDS);
                 }
             });
 
-            while(System.currentTimeMillis() - start < TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES))
+            while(currentTimeMillis() - start < TimeUnit.MILLISECONDS.convert(5, TimeUnit.MINUTES))
             {
                 StorageService.instance.getTokenMetadata().invalidateCachedRings();
                 Uninterruptibles.sleepUninterruptibly(r.nextInt(1000), TimeUnit.MILLISECONDS);
diff --git a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java
index 3de764a..733e46f 100644
--- a/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java
+++ b/test/long/org/apache/cassandra/db/compaction/LongLeveledCompactionStrategyTest.java
@@ -29,7 +29,6 @@
 import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.junit.BeforeClass;
-import org.junit.Ignore;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
@@ -40,7 +39,6 @@
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertFalse;
@@ -77,7 +75,7 @@
         CompactionStrategyManager mgr = store.getCompactionStrategyManager();
         LeveledCompactionStrategy lcs = (LeveledCompactionStrategy) mgr.getStrategies().get(1).get(0);
 
-        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KiB value, make it easy to have multiple files
 
         populateSSTables(store);
 
@@ -140,7 +138,7 @@
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_STANDARDLVL2);
-        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KiB value, make it easy to have multiple files
 
         populateSSTables(store);
 
@@ -149,7 +147,7 @@
         CompactionStrategyManager mgr = store.getCompactionStrategyManager();
         LeveledCompactionStrategy lcs = (LeveledCompactionStrategy) mgr.getStrategies().get(1).get(0);
 
-        value = ByteBuffer.wrap(new byte[10 * 1024]); // 10 KB value
+        value = ByteBuffer.wrap(new byte[10 * 1024]); // 10 KiB value
 
         // Adds 10 partitions
         for (int r = 0; r < 10; r++)
@@ -164,7 +162,7 @@
         }
 
         //Flush sstable
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         store.runWithCompactionsDisabled(new Callable<Void>()
         {
@@ -247,7 +245,7 @@
 
     private void populateSSTables(ColumnFamilyStore store)
     {
-        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KiB value, make it easy to have multiple files
 
         // Enough data to have a level 1 and 2
         int rows = 128;
@@ -263,7 +261,7 @@
 
             Mutation rm = new Mutation(builder.build());
             rm.apply();
-            store.forceBlockingFlush();
+            Util.flush(store);
         }
     }
 }
diff --git a/test/long/org/apache/cassandra/dht/tokenallocator/AbstractReplicationAwareTokenAllocatorTest.java b/test/long/org/apache/cassandra/dht/tokenallocator/AbstractReplicationAwareTokenAllocatorTest.java
index 5f9aa31..26d454d 100644
--- a/test/long/org/apache/cassandra/dht/tokenallocator/AbstractReplicationAwareTokenAllocatorTest.java
+++ b/test/long/org/apache/cassandra/dht/tokenallocator/AbstractReplicationAwareTokenAllocatorTest.java
@@ -31,6 +31,8 @@
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Token;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * Base class for {@link Murmur3ReplicationAwareTokenAllocatorTest} and {@link RandomReplicationAwareTokenAllocatorTest},
  * we need to separate classes to avoid timeous in case flaky tests need to be repeated, see CASSANDRA-12784.
@@ -489,7 +491,7 @@
         if (size < targetClusterSize)
         {
             System.out.format("Adding %d unit(s) using %s...", targetClusterSize - size, t.toString());
-            long time = System.currentTimeMillis();
+            long time = currentTimeMillis();
             while (size < targetClusterSize)
             {
                 int tokens = tc.tokenCount(perUnitCount, rand);
@@ -500,7 +502,7 @@
                 if (verifyMetrics)
                     updateSummary(t, su, st, false);
             }
-            System.out.format(" Done in %.3fs\n", (System.currentTimeMillis() - time) / 1000.0);
+            System.out.format(" Done in %.3fs\n", (currentTimeMillis() - time) / 1000.0);
             if (verifyMetrics)
             {
                 updateSummary(t, su, st, true);
@@ -540,4 +542,4 @@
             System.out.format("Worst intermediate unit\t%s  token %s\n", su, st);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/long/org/apache/cassandra/dht/tokenallocator/NoReplicationTokenAllocatorTest.java b/test/long/org/apache/cassandra/dht/tokenallocator/NoReplicationTokenAllocatorTest.java
index ee38a28..5e13519 100644
--- a/test/long/org/apache/cassandra/dht/tokenallocator/NoReplicationTokenAllocatorTest.java
+++ b/test/long/org/apache/cassandra/dht/tokenallocator/NoReplicationTokenAllocatorTest.java
@@ -34,6 +34,8 @@
 import org.apache.cassandra.dht.RandomPartitioner;
 import org.apache.cassandra.dht.Token;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class NoReplicationTokenAllocatorTest extends TokenAllocatorTestBase
 {
 
@@ -149,7 +151,7 @@
         if (size < targetClusterSize)
         {
             System.out.format("Adding %d unit(s) using %s...", targetClusterSize - size, t.toString());
-            long time = System.currentTimeMillis();
+            long time = currentTimeMillis();
 
             while (size < targetClusterSize)
             {
@@ -160,7 +162,7 @@
                 if (verifyMetrics)
                     updateSummary(t, su, st, false);
             }
-            System.out.format(" Done in %.3fs\n", (System.currentTimeMillis() - time) / 1000.0);
+            System.out.format(" Done in %.3fs\n", (currentTimeMillis() - time) / 1000.0);
 
             if (verifyMetrics)
             {
diff --git a/test/long/org/apache/cassandra/dht/tokenallocator/RandomReplicationAwareTokenAllocatorTest.java b/test/long/org/apache/cassandra/dht/tokenallocator/RandomReplicationAwareTokenAllocatorTest.java
index 6a2d59e..bb1a2c8 100644
--- a/test/long/org/apache/cassandra/dht/tokenallocator/RandomReplicationAwareTokenAllocatorTest.java
+++ b/test/long/org/apache/cassandra/dht/tokenallocator/RandomReplicationAwareTokenAllocatorTest.java
@@ -20,7 +20,6 @@
 
 import org.junit.Test;
 
-import org.apache.cassandra.Util;
 import org.apache.cassandra.dht.RandomPartitioner;
 
 public class RandomReplicationAwareTokenAllocatorTest extends AbstractReplicationAwareTokenAllocatorTest
diff --git a/test/long/org/apache/cassandra/hints/HintsWriteThenReadTest.java b/test/long/org/apache/cassandra/hints/HintsWriteThenReadTest.java
index 24a9a78..1b78c48 100644
--- a/test/long/org/apache/cassandra/hints/HintsWriteThenReadTest.java
+++ b/test/long/org/apache/cassandra/hints/HintsWriteThenReadTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.nio.ByteBuffer;
@@ -29,6 +28,7 @@
 
 import com.google.common.collect.Iterables;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
@@ -48,6 +48,8 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class HintsWriteThenReadTest
 {
     private static final String KEYSPACE = "hints_write_then_read_test";
@@ -61,9 +63,9 @@
         SchemaLoader.prepareServer();
         SchemaLoader.createKeyspace(KEYSPACE, KeyspaceParams.simple(1), SchemaLoader.standardCFMD(KEYSPACE, TABLE));
 
-        HintsDescriptor descriptor = new HintsDescriptor(UUID.randomUUID(), System.currentTimeMillis());
+        HintsDescriptor descriptor = new HintsDescriptor(UUID.randomUUID(), currentTimeMillis());
 
-        File directory = Files.createTempDirectory(null).toFile();
+        File directory = new File(Files.createTempDirectory(null));
         try
         {
             testWriteReadCycle(directory, descriptor);
@@ -96,8 +98,8 @@
 
     private static void verifyChecksum(File directory, HintsDescriptor descriptor) throws IOException
     {
-        File hintsFile = new File(directory, descriptor.fileName());
-        File checksumFile = new File(directory, descriptor.checksumFileName());
+        File hintsFile = descriptor.file(directory);
+        File checksumFile = descriptor.checksumFile(directory);
 
         assertTrue(checksumFile.exists());
 
@@ -112,7 +114,7 @@
         long baseTimestamp = descriptor.timestamp;
         int index = 0;
 
-        try (HintsReader reader = HintsReader.open(new File(directory, descriptor.fileName())))
+        try (HintsReader reader = HintsReader.open(descriptor.file(directory)))
         {
             for (HintsReader.Page page : reader)
             {
diff --git a/test/long/org/apache/cassandra/io/compress/CompressorPerformance.java b/test/long/org/apache/cassandra/io/compress/CompressorPerformance.java
index b3cdaa1..9fbf24d 100644
--- a/test/long/org/apache/cassandra/io/compress/CompressorPerformance.java
+++ b/test/long/org/apache/cassandra/io/compress/CompressorPerformance.java
@@ -20,12 +20,15 @@
  */
 package org.apache.cassandra.io.compress;
 
-import java.io.FileInputStream;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.concurrent.ThreadLocalRandom;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class CompressorPerformance
 {
 
@@ -71,7 +74,7 @@
         int checksum = 0;
         int count = 100;
 
-        long time = System.nanoTime();
+        long time = nanoTime();
         long uncompressedBytes = 0;
         long compressedBytes = 0;
         for (int i=0; i<count; ++i)
@@ -85,12 +88,12 @@
             checksum += output.get(ThreadLocalRandom.current().nextInt(output.position()));
             dataSource.rewind();
         }
-        long timec = System.nanoTime() - time;
+        long timec = nanoTime() - time;
         output.flip();
         input.put(output);
         input.flip();
 
-        time = System.nanoTime();
+        time = nanoTime();
         for (int i=0; i<count; ++i)
         {
             output.clear();
@@ -99,7 +102,7 @@
             checksum += output.get(ThreadLocalRandom.current().nextInt(output.position()));
             input.rewind();
         }
-        long timed = System.nanoTime() - time;
+        long timed = nanoTime() - time;
         System.out.format("Compressor %s %s->%s compress %.3f ns/b %.3f mb/s uncompress %.3f ns/b %.3f mb/s ratio %.2f:1.%s\n",
                           compressor.getClass().getSimpleName(),
                           in,
@@ -114,7 +117,7 @@
 
     public static void main(String[] args) throws IOException
     {
-        try (FileInputStream fis = new FileInputStream("CHANGES.txt"))
+        try (FileInputStreamPlus fis = new FileInputStreamPlus("CHANGES.txt"))
         {
             int len = (int)fis.getChannel().size();
             dataSource = ByteBuffer.allocateDirect(len);
diff --git a/test/long/org/apache/cassandra/io/sstable/CQLSSTableWriterLongTest.java b/test/long/org/apache/cassandra/io/sstable/CQLSSTableWriterLongTest.java
index a6f428a..f2bbfa6 100644
--- a/test/long/org/apache/cassandra/io/sstable/CQLSSTableWriterLongTest.java
+++ b/test/long/org/apache/cassandra/io/sstable/CQLSSTableWriterLongTest.java
@@ -18,13 +18,13 @@
 
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Random;
 
 import com.google.common.io.Files;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.apache.cassandra.SchemaLoader;
@@ -46,9 +46,9 @@
         String TABLE = "table1";
         int size = 30000;
 
-        File tempdir = Files.createTempDir();
-        File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);
-        assert dataDir.mkdirs();
+        File tempdir = new File(Files.createTempDir());
+        File dataDir = new File(tempdir.absolutePath() + File.pathSeparator() + KS + File.pathSeparator() + TABLE);
+        assert dataDir.tryCreateDirectories();
 
         StringBuilder schemaColumns = new StringBuilder();
         StringBuilder queryColumns = new StringBuilder();
diff --git a/test/long/org/apache/cassandra/streaming/LongStreamingTest.java b/test/long/org/apache/cassandra/streaming/LongStreamingTest.java
index e37045a..19d7709 100644
--- a/test/long/org/apache/cassandra/streaming/LongStreamingTest.java
+++ b/test/long/org/apache/cassandra/streaming/LongStreamingTest.java
@@ -18,12 +18,12 @@
 
 package org.apache.cassandra.streaming;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.io.Files;
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -44,6 +44,7 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.OutputHandler;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 
 public class LongStreamingTest
@@ -58,8 +59,8 @@
         StorageService.instance.initServer();
 
         StorageService.instance.setCompactionThroughputMbPerSec(0);
-        StorageService.instance.setStreamThroughputMbPerSec(0);
-        StorageService.instance.setInterDCStreamThroughputMbPerSec(0);
+        StorageService.instance.setStreamThroughputMbitPerSec(0);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(0);
     }
 
     @Test
@@ -79,9 +80,9 @@
         String KS = useSstableCompression ? "sstable_compression_ks" : "stream_compression_ks";
         String TABLE = "table1";
 
-        File tempdir = Files.createTempDir();
-        File dataDir = new File(tempdir.getAbsolutePath() + File.separator + KS + File.separator + TABLE);
-        assert dataDir.mkdirs();
+        File tempdir = new File(Files.createTempDir());
+        File dataDir = new File(tempdir.absolutePath() + File.pathSeparator() + KS + File.pathSeparator() + TABLE);
+        assert dataDir.tryCreateDirectories();
 
         String schema = "CREATE TABLE " + KS + '.'  + TABLE + "  ("
                         + "  k int PRIMARY KEY,"
@@ -99,20 +100,20 @@
         Assert.assertEquals(useSstableCompression, compressionParams.isEnabled());
 
 
-        long start = System.nanoTime();
+        long start = nanoTime();
 
         for (int i = 0; i < 10_000_000; i++)
             writer.addRow(i, "test1", 24);
 
         writer.close();
-        System.err.println(String.format("Writer finished after %d seconds....", TimeUnit.NANOSECONDS.toSeconds(System.nanoTime() - start)));
+        System.err.println(String.format("Writer finished after %d seconds....", TimeUnit.NANOSECONDS.toSeconds(nanoTime() - start)));
 
-        File[] dataFiles = dataDir.listFiles((dir, name) -> name.endsWith("-Data.db"));
-        long dataSize = 0l;
+        File[] dataFiles = dataDir.tryList((dir, name) -> name.endsWith("-Data.db"));
+        long dataSizeInBytes = 0l;
         for (File file : dataFiles)
         {
-            System.err.println("File : "+file.getAbsolutePath());
-            dataSize += file.length();
+            System.err.println("File : "+file.absolutePath());
+            dataSizeInBytes += file.length();
         }
 
         SSTableLoader loader = new SSTableLoader(dataDir, new SSTableLoader.Client()
@@ -132,13 +133,13 @@
             }
         }, new OutputHandler.SystemOutput(false, false));
 
-        start = System.nanoTime();
+        start = nanoTime();
         loader.stream().get();
 
-        long millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
-        System.err.println(String.format("Finished Streaming in %.2f seconds: %.2f Mb/sec",
+        long millis = TimeUnit.NANOSECONDS.toMillis(nanoTime() - start);
+        System.err.println(String.format("Finished Streaming in %.2f seconds: %.2f MiBsec",
                                          millis/1000d,
-                                         (dataSize / (1 << 20) / (millis / 1000d)) * 8));
+                                         (dataSizeInBytes / (1 << 20) / (millis / 1000d)) * 8));
 
 
         //Stream again
@@ -159,23 +160,23 @@
             }
         }, new OutputHandler.SystemOutput(false, false));
 
-        start = System.nanoTime();
+        start = nanoTime();
         loader.stream().get();
 
-        millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
-        System.err.println(String.format("Finished Streaming in %.2f seconds: %.2f Mb/sec",
+        millis = TimeUnit.NANOSECONDS.toMillis(nanoTime() - start);
+        System.err.println(String.format("Finished Streaming in %.2f seconds: %.2f MiBsec",
                                          millis/1000d,
-                                         (dataSize / (1 << 20) / (millis / 1000d)) * 8));
+                                         (dataSizeInBytes / (1 << 20) / (millis / 1000d)) * 8));
 
 
         //Compact them both
-        start = System.nanoTime();
+        start = nanoTime();
         Keyspace.open(KS).getColumnFamilyStore(TABLE).forceMajorCompaction();
-        millis = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
+        millis = TimeUnit.NANOSECONDS.toMillis(nanoTime() - start);
 
-        System.err.println(String.format("Finished Compacting in %.2f seconds: %.2f Mb/sec",
+        System.err.println(String.format("Finished Compacting in %.2f seconds: %.2f MiBsec",
                                          millis / 1000d,
-                                         (dataSize * 2 / (1 << 20) / (millis / 1000d)) * 8));
+                                         (dataSizeInBytes * 2 / (1 << 20) / (millis / 1000d)) * 8));
 
         UntypedResultSet rs = QueryProcessor.executeInternal("SELECT * FROM " + KS + '.'  + TABLE + " limit 100;");
         assertEquals(100, rs.size());
diff --git a/test/memory/org/apache/cassandra/db/compaction/CompactionAllocationTest.java b/test/memory/org/apache/cassandra/db/compaction/CompactionAllocationTest.java
index 4398b3d..4d652b7 100644
--- a/test/memory/org/apache/cassandra/db/compaction/CompactionAllocationTest.java
+++ b/test/memory/org/apache/cassandra/db/compaction/CompactionAllocationTest.java
@@ -23,15 +23,22 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
+import java.util.concurrent.TimeUnit;
 
 import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.primitives.Ints;
+import com.google.common.util.concurrent.Uninterruptibles;
+
+import org.apache.cassandra.Util;
+import org.apache.cassandra.index.internal.CollatedViewIndexBuilder;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -51,8 +58,13 @@
 import org.apache.cassandra.db.ReadExecutionController;
 import org.apache.cassandra.db.ReadQuery;
 import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.lifecycle.SSTableSet;
+import org.apache.cassandra.db.lifecycle.View;
 import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
 import org.apache.cassandra.db.partitions.UnfilteredPartitionIterators;
+import org.apache.cassandra.index.Index;
+import org.apache.cassandra.index.SecondaryIndexBuilder;
+import org.apache.cassandra.io.sstable.ReducingKeyIterator;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.io.util.UnbufferedDataOutputStreamPlus;
@@ -64,6 +76,7 @@
 import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.ObjectSizes;
+import org.apache.cassandra.utils.concurrent.Refs;
 
 public class CompactionAllocationTest
 {
@@ -186,6 +199,8 @@
                                       "wideOverlappingPartitions9",
                                       "widePartitionsOverlappingRows9",
                                       "widePartitionsOverlappingRows3"));
+        groups.add(Lists.newArrayList("widePartitionsSingleIndexedColumn",
+                                      "widePartitionsMultipleIndexedColumns"));
 
         Map<String, List<String>> fullRows = new HashMap<>();
         for (String workload : Iterables.concat(groups))
@@ -222,6 +237,38 @@
         ColumnFamilyStore getCfs();
         String name();
         List<Runnable> getReads();
+
+        default int executeReads()
+        {
+            List<Runnable> reads = getReads();
+            for (int i=0; i<reads.size(); i++)
+                reads.get(i).run();
+            return reads.size();
+        }
+
+        default void executeCompactions()
+        {
+            ColumnFamilyStore cfs = getCfs();
+            ActiveCompactions active = new ActiveCompactions();
+            Set<SSTableReader> sstables = cfs.getLiveSSTables();
+
+            CompactionTasks tasks = cfs.getCompactionStrategyManager()
+                                       .getUserDefinedTasks(sstables, FBUtilities.nowInSeconds());
+            
+            Assert.assertFalse(tasks.isEmpty());
+
+            for (AbstractCompactionTask task : tasks)
+                task.execute(active);
+
+            Assert.assertEquals(1, cfs.getLiveSSTables().size());
+        }
+
+        default int[] getSSTableStats()
+        {
+            int numPartitions = Ints.checkedCast(Iterables.getOnlyElement(getCfs().getLiveSSTables()).getSSTableMetadata().estimatedPartitionSize.count());
+            int numRows = Ints.checkedCast(Iterables.getOnlyElement(getCfs().getLiveSSTables()).getSSTableMetadata().totalRows);
+            return new int[] {numPartitions, numRows};
+        }
     }
 
     private static Measurement createMeasurement()
@@ -259,6 +306,7 @@
         {
             if (Thread.currentThread().getId() != threadID)
                 return;
+
             objectsAllocated++;
             bytesAllocated += bytes;
         }
@@ -369,8 +417,7 @@
                 logger.info(">>> Start profiling");
                 Thread.sleep(10000);
             }
-            for (int i=0; i<reads.size(); i++)
-                reads.get(i).run();
+            int readCount = workload.executeReads();
             Thread.sleep(1000);
             if (PROFILING_READS && !workload.name().equals("warmup"))
             {
@@ -378,20 +425,12 @@
                 Thread.sleep(10000);
             }
             readSampler.stop();
-
-            readSummary = String.format("%s bytes, %s /read, %s cpu", readSampler.bytes(), readSampler.bytes()/reads.size(), readSampler.cpu());
-            readSummaries.put(workload.name(), new ReadSummary(readSampler, reads.size()));
+            readSummary = String.format("%s bytes, %s /read, %s cpu", readSampler.bytes(), readSampler.bytes()/readCount, readSampler.cpu());
+            readSummaries.put(workload.name(), new ReadSummary(readSampler, readCount));
         }
 
-        ColumnFamilyStore cfs = workload.getCfs();
-        ActiveCompactions active = new ActiveCompactions();
-        Set<SSTableReader> sstables = cfs.getLiveSSTables();
-
-        CompactionTasks tasks = cfs.getCompactionStrategyManager()
-                                   .getUserDefinedTasks(sstables, FBUtilities.nowInSeconds());
-        Assert.assertFalse(tasks.isEmpty());
-
         String compactionSummary = "SKIPPED";
+        ColumnFamilyStore cfs = workload.getCfs();
         if (!PROFILING_READS)
         {
             compactionSampler.start();
@@ -400,8 +439,8 @@
                 logger.info(">>> Start profiling");
                 Thread.sleep(10000);
             }
-            for (AbstractCompactionTask task : tasks)
-                task.execute(active);
+
+            workload.executeCompactions();
             Thread.sleep(1000);
             if (PROFILING_COMPACTION && !workload.name().equals("warmup"))
             {
@@ -410,11 +449,11 @@
             }
             compactionSampler.stop();
 
-            Assert.assertEquals(1, cfs.getLiveSSTables().size());
-            int numPartitions = Ints.checkedCast(Iterables.getOnlyElement(cfs.getLiveSSTables()).getSSTableMetadata().estimatedPartitionSize.count());
-            int numRows = Ints.checkedCast(Iterables.getOnlyElement(cfs.getLiveSSTables()).getSSTableMetadata().totalRows);
+            int[] tableStats = workload.getSSTableStats();
+            int numPartitions = tableStats[0];
+            int numRows = tableStats[1];
 
-            compactionSummary = String.format("%s bytes, %s /partition, %s /row, %s cpu", compactionSampler.bytes(), compactionSampler.bytes()/numPartitions, compactionSampler.bytes()/numRows, compactionSampler.cpu());
+            compactionSummary = String.format("%s bytes, %s objects, %s /partition, %s /row, %s cpu", compactionSampler.bytes(), compactionSampler.objects(), compactionSampler.bytes()/numPartitions, compactionSampler.bytes()/numRows, compactionSampler.cpu());
             compactionSummaries.put(workload.name(), new CompactionSummary(compactionSampler, numPartitions, numRows));
         }
 
@@ -474,7 +513,7 @@
                 String read = String.format("SELECT * FROM %s.%s WHERE k = ?", ksname, "tbl");
                 SelectStatement select = (SelectStatement) QueryProcessor.parseStatement(read).prepare(ClientState.forInternalCalls());
                 QueryState queryState = QueryState.forInternalCalls();
-                for (int f=0; f<numSSTable; f++)
+                for (int f = 0; f < numSSTable; f++)
                 {
                     for (int p = 0; p < sstablePartitions; p++)
                     {
@@ -487,7 +526,7 @@
                             reads.add(() -> runQuery(query, cfs.metadata.get()));
                         }
                     }
-                    cfs.forceBlockingFlush();
+                    Util.flush(cfs);
                 }
 
                 Assert.assertEquals(numSSTable, cfs.getLiveSSTables().size());
@@ -583,12 +622,12 @@
                 String read = String.format("SELECT * FROM %s.%s WHERE k = ?", ksname, "tbl");
                 SelectStatement select = (SelectStatement) QueryProcessor.parseStatement(read).prepare(ClientState.forInternalCalls());
                 QueryState queryState = QueryState.forInternalCalls();
-                for (int f=0; f<numSSTable; f++)
+                for (int f = 0; f < numSSTable; f++)
                 {
                     for (int p = 0; p < sstablePartitions; p++)
                     {
                         String key = String.format("%08d", overlap ? p : (f * sstablePartitions) + p);
-                        for (int r=0; r<rowsPerPartition; r++)
+                        for (int r = 0; r < rowsPerPartition; r++)
                         {
                             QueryProcessor.executeInternal(insert, key, makeRandomString(6, overlapCK ? r : -1),
                                                            makeRandomString(8), makeRandomString(8),
@@ -602,7 +641,7 @@
                             reads.add(() -> runQuery(query, cfs.metadata.get()));
                         }
                     }
-                    cfs.forceBlockingFlush();
+                    Util.flush(cfs);
                 }
 
                 Assert.assertEquals(numSSTable, cfs.getLiveSSTables().size());
@@ -684,12 +723,12 @@
                 String read = String.format("SELECT * FROM %s.%s WHERE k = ?", ksname, "tbl");
                 SelectStatement select = (SelectStatement) QueryProcessor.parseStatement(read).prepare(ClientState.forInternalCalls());
                 QueryState queryState = QueryState.forInternalCalls();
-                for (int f=0; f<numSSTable; f++)
+                for (int f = 0; f < numSSTable; f++)
                 {
                     for (int p = 0; p < sstablePartitions; p++)
                     {
                         String key = String.format("%08d", overlap ? p : (f * sstablePartitions) + p);
-                        for (int r=0; r<rowsPerPartition; r++)
+                        for (int r = 0; r < rowsPerPartition; r++)
                         {
                             QueryProcessor.executeInternal(insert , key, makeRandomString(6, overlapCK ? r : -1),
                                                            makeRandomString(rowWidth>>2), makeRandomString(rowWidth>>2),
@@ -702,7 +741,7 @@
                             reads.add(() -> runQuery(query, cfs.metadata.get()));
                         }
                     }
-                    cfs.forceBlockingFlush();
+                    Util.flush(cfs);
                 }
 
                 Assert.assertEquals(numSSTable, cfs.getLiveSSTables().size());
@@ -760,4 +799,135 @@
     {
         testWidePartitions("widePartitionsOverlappingRows3", 3, maybeInflate(24), true, true);
     }
+
+
+    private static void testIndexingWidePartitions(String name,
+                                                   int numSSTable,
+                                                   int sstablePartitions,
+                                                   IndexDef...indexes) throws Throwable
+    {
+        String ksname = "ks_" + name.toLowerCase();
+        SchemaLoader.createKeyspace(ksname, KeyspaceParams.simple(1),
+                CreateTableStatement.parse("CREATE TABLE tbl (k text, c text, v1 text, v2 text, v3 text, v4 text, PRIMARY KEY (k, c))", ksname).build());
+
+        ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(Schema.instance.getTableMetadata(ksname, "tbl").id);
+        Assert.assertNotNull(cfs);
+        cfs.disableAutoCompaction();
+        int rowWidth = 100;
+        int rowsPerPartition = 1000;
+
+        measure(new Workload()
+        {
+            @SuppressWarnings("UnstableApiUsage")
+            public void setup()
+            {
+                cfs.disableAutoCompaction();
+                String insert = String.format("INSERT INTO %s.%s (k, c, v1, v2, v3, v4) VALUES (?, ?, ?, ?, ?, ?)", ksname, "tbl");
+                for (int f = 0; f < numSSTable; f++)
+                {
+                    for (int p = 0; p < sstablePartitions; p++)
+                    {
+                        String key = String.format("%08d", (f * sstablePartitions) + p);
+                        for (int r = 0; r < rowsPerPartition; r++)
+                        {
+                            QueryProcessor.executeInternal(insert , key, makeRandomString(6, -1),
+                                                           makeRandomString(rowWidth>>2), makeRandomString(rowWidth>>2),
+                                                           makeRandomString(rowWidth>>2), makeRandomString(rowWidth>>2));
+                        }
+                    }
+                    Util.flush(cfs);
+                }
+
+                for (IndexDef index : indexes)
+                {
+                    QueryProcessor.executeInternal(String.format(index.cql, index.name, ksname, "tbl"));
+                    while (!cfs.indexManager.getBuiltIndexNames().contains(index.name))
+                        Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
+                }
+
+                Assert.assertEquals(numSSTable, cfs.getLiveSSTables().size());
+            }
+
+            public ColumnFamilyStore getCfs()
+            {
+                return cfs;
+            }
+
+            public List<Runnable> getReads()
+            {
+                return new ArrayList<>();
+            }
+
+            public String name()
+            {
+                return name;
+            }
+
+            public int executeReads()
+            {
+                // return 1 to avoid divide by zero error
+                return 1;
+            }
+
+            public void executeCompactions()
+            {
+                logger.info("Starting index re-build");
+                try (ColumnFamilyStore.RefViewFragment viewFragment = cfs.selectAndReference(View.selectFunction(SSTableSet.CANONICAL));
+                     Refs<SSTableReader> sstables = viewFragment.refs)
+                {
+
+                    Set<Index> indexes = new HashSet<>(cfs.indexManager.listIndexes());
+                    SecondaryIndexBuilder builder = new CollatedViewIndexBuilder(cfs,
+                                                                                 indexes,
+                                                                                 new ReducingKeyIterator(sstables),
+                                                                                 ImmutableSet.copyOf(sstables));
+                    builder.build();
+                }
+                logger.info("Index re-build complete");
+            }
+
+            public int[] getSSTableStats()
+            {
+                int numPartitions = cfs.getLiveSSTables()
+                                       .stream()
+                                       .mapToInt(sstable -> Ints.checkedCast(sstable.getSSTableMetadata().estimatedPartitionSize.count()))
+                                       .sum();
+                int numRows = cfs.getLiveSSTables()
+                                 .stream()
+                                 .mapToInt(sstable -> Ints.checkedCast(sstable.getSSTableMetadata().totalRows))
+                                 .sum();
+
+                return new int[] {numPartitions, numRows};
+            }
+        });
+    }
+
+    @Test
+    public void widePartitionsSingleIndexedColumn() throws Throwable
+    {
+        testIndexingWidePartitions("widePartitionsSingleIndexedColumn", 3, maybeInflate(24),
+                new IndexDef("wide_partition_index_0", "CREATE INDEX %s on %s.%s(v1)"));
+    }
+
+    @Test
+    public void widePartitionsMultipleIndexedColumns() throws Throwable
+    {
+        testIndexingWidePartitions("widePartitionsMultipleIndexedColumns", 3, maybeInflate(24),
+                                   new IndexDef("wide_partition_index_0", "CREATE INDEX %s on %s.%s(v1)"),
+                                   new IndexDef("wide_partition_index_1", "CREATE INDEX %s on %s.%s(v2)"),
+                                   new IndexDef("wide_partition_index_2", "CREATE INDEX %s on %s.%s(v3)"),
+                                   new IndexDef("wide_partition_index_3", "CREATE INDEX %s on %s.%s(v4)"));
+    }
+
+    static class IndexDef
+    {
+        final String name;
+        final String cql;
+
+        IndexDef(String name, String cql)
+        {
+            this.name = name;
+            this.cql = cql;
+        }
+    }
 }
diff --git a/test/microbench/org/apache/cassandra/test/microbench/BTreeSearchIteratorBench.java b/test/microbench/org/apache/cassandra/test/microbench/BTreeSearchIteratorBench.java
index 400b297..d7cf8dc 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/BTreeSearchIteratorBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/BTreeSearchIteratorBench.java
@@ -36,7 +36,6 @@
 import org.openjdk.jmh.annotations.Level;
 import org.openjdk.jmh.annotations.Measurement;
 import org.openjdk.jmh.annotations.Mode;
-import org.openjdk.jmh.annotations.OperationsPerInvocation;
 import org.openjdk.jmh.annotations.OutputTimeUnit;
 import org.openjdk.jmh.annotations.Param;
 import org.openjdk.jmh.annotations.Scope;
diff --git a/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java b/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java
index b79f154..9678b8d 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/BatchStatementBench.java
@@ -40,8 +40,9 @@
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.utils.FBUtilities;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
@@ -63,6 +64,7 @@
 import org.openjdk.jmh.runner.options.OptionsBuilder;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 
 @BenchmarkMode(Mode.Throughput)
@@ -87,7 +89,7 @@
     String table = "tbl";
 
     int nowInSec = FBUtilities.nowInSeconds();
-    long queryStartTime = System.nanoTime();
+    long queryStartTime = nanoTime();
     BatchStatement bs;
     BatchQueryOptions bqo;
 
@@ -100,11 +102,11 @@
     @Setup
     public void setup() throws Throwable
     {
-        Schema.instance.load(KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1)));
+        SchemaTestUtil.addOrUpdateKeyspace(KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1)), false);
         KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace);
         TableMetadata metadata = CreateTableStatement.parse(String.format("CREATE TABLE %s (id int, ck int, v int, primary key (id, ck))", table), keyspace).build();
 
-        Schema.instance.load(ksm.withSwapped(ksm.tables.with(metadata)));
+        SchemaTestUtil.addOrUpdateKeyspace(ksm.withSwapped(ksm.tables.with(metadata)), false);
 
         List<ModificationStatement> modifications = new ArrayList<>(batchSize);
         List<List<ByteBuffer>> parameters = new ArrayList<>(batchSize);
@@ -124,7 +126,7 @@
     @Benchmark
     public void bench()
     {
-        bs.getMutations(bqo, false, nowInSec, nowInSec, queryStartTime);
+        bs.getMutations(ClientState.forInternalCalls(), bqo, false, nowInSec, nowInSec, queryStartTime);
     }
 
 
diff --git a/test/microbench/org/apache/cassandra/test/microbench/BloomFilterSerializerBench.java b/test/microbench/org/apache/cassandra/test/microbench/BloomFilterSerializerBench.java
index 9222811..32e048d 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/BloomFilterSerializerBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/BloomFilterSerializerBench.java
@@ -18,18 +18,16 @@
 
 package org.apache.cassandra.test.microbench;
 
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
+import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.cassandra.db.BufferDecoratedKey;
 import org.apache.cassandra.dht.Murmur3Partitioner;
-import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.BloomFilter;
 import org.apache.cassandra.utils.BloomFilterSerializer;
@@ -77,7 +75,7 @@
         {
             BloomFilter filter = (BloomFilter) FilterFactory.getFilter(numElemsInK * 1024, 0.01d);
             filter.add(wrap(testVal));
-            DataOutputStreamPlus out = new BufferedDataOutputStreamPlus(new FileOutputStream(file));
+            DataOutputStreamPlus out = new FileOutputStreamPlus(file);
             if (oldBfFormat)
                 SerializationsTest.serializeOldBfFormat(filter, out);
             else
@@ -85,14 +83,14 @@
             out.close();
             filter.close();
 
-            DataInputStream in = new DataInputStream(new FileInputStream(file));
+            FileInputStreamPlus in = new FileInputStreamPlus(file);
             BloomFilter filter2 = BloomFilterSerializer.deserialize(in, oldBfFormat);
             FileUtils.closeQuietly(in);
             filter2.close();
         }
         finally
         {
-            file.delete();
+            file.tryDelete();
         }
     }
 
diff --git a/test/microbench/org/apache/cassandra/test/microbench/CacheLoaderBench.java b/test/microbench/org/apache/cassandra/test/microbench/CacheLoaderBench.java
index d91db6e..de788b7 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/CacheLoaderBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/CacheLoaderBench.java
@@ -97,7 +97,7 @@
                 RowUpdateBuilder rowBuilder = new RowUpdateBuilder(cfs.metadata(), System.currentTimeMillis() + random.nextInt(), "key");
                 rowBuilder.add(colDef, "val1");
                 rowBuilder.build().apply();
-                cfs.forceBlockingFlush();
+                cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
             }
 
             Assert.assertEquals(numSSTables, cfs.getLiveSSTables().size());
diff --git a/test/microbench/org/apache/cassandra/test/microbench/CachingBenchTest.java b/test/microbench/org/apache/cassandra/test/microbench/CachingBenchTest.java
index 2859f58..c589ca5 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/CachingBenchTest.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/CachingBenchTest.java
@@ -51,6 +51,8 @@
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class CachingBenchTest extends CQLTester
@@ -186,9 +188,9 @@
             if (ii % (FLUSH_FREQ * 10) == 0)
             {
                 System.out.println("C");
-                long startTime = System.nanoTime();
+                long startTime = nanoTime();
                 getCurrentColumnFamilyStore().enableAutoCompaction(!CONCURRENT_COMPACTIONS);
-                long endTime = System.nanoTime();
+                long endTime = nanoTime();
                 compactionTimeNanos += endTime - startTime;
                 getCurrentColumnFamilyStore().disableAutoCompaction();
             }
@@ -206,7 +208,7 @@
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
         cfs.disableAutoCompaction();
 
-        long onStartTime = System.currentTimeMillis();
+        long onStartTime = currentTimeMillis();
         ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
         List<Future<?>> tasks = new ArrayList<>();
         for (int ti = 0; ti < 1; ++ti)
@@ -230,7 +232,7 @@
             task.get();
 
         flush();
-        long onEndTime = System.currentTimeMillis();
+        long onEndTime = currentTimeMillis();
         int startRowCount = countRows(cfs);
         int startTombCount = countTombstoneMarkers(cfs);
         int startRowDeletions = countRowDeletions(cfs);
@@ -260,9 +262,9 @@
             System.out.println();
 
         String hashesBefore = getHashes();
-        long startTime = System.currentTimeMillis();
+        long startTime = currentTimeMillis();
         CompactionManager.instance.performMaximal(cfs, true);
-        long endTime = System.currentTimeMillis();
+        long endTime = currentTimeMillis();
 
         int endRowCount = countRows(cfs);
         int endTombCount = countTombstoneMarkers(cfs);
@@ -283,9 +285,9 @@
 
     private String getHashes() throws Throwable
     {
-        long startTime = System.currentTimeMillis();
+        long startTime = currentTimeMillis();
         String hashes = Arrays.toString(getRows(execute(hashQuery))[0]);
-        long endTime = System.currentTimeMillis();
+        long endTime = currentTimeMillis();
         System.out.println(String.format("Hashes: %s, retrieved in %.3fs", hashes, (endTime - startTime) * 1e-3));
         return hashes;
     }
diff --git a/test/microbench/org/apache/cassandra/test/microbench/CompactionBench.java b/test/microbench/org/apache/cassandra/test/microbench/CompactionBench.java
index 41220a2..8d7e800 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/CompactionBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/CompactionBench.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.test.microbench;
 
 
-import java.io.File;
 import java.io.IOException;
 import java.util.List;
 import java.util.concurrent.*;
@@ -29,6 +28,7 @@
 import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.openjdk.jmh.annotations.*;
 
@@ -70,13 +70,13 @@
             execute(writeStatement, i, i, i );
 
 
-        cfs.forceBlockingFlush();
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
 
         System.err.println("Writing 50k again...");
         for (long i = 0; i < 50000; i++)
             execute(writeStatement, i, i, i );
 
-        cfs.forceBlockingFlush();
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
 
         cfs.snapshot("originals");
 
@@ -108,7 +108,7 @@
 
         for (File file : directories)
         {
-            for (File f : file.listFiles())
+            for (File f : file.tryList())
             {
                 if (f.isDirectory())
                     continue;
@@ -119,7 +119,7 @@
 
 
         for (File file : snapshotFiles)
-            FileUtils.createHardLink(file, new File(file.toPath().getParent().getParent().getParent().toFile(), file.getName()));
+            FileUtils.createHardLink(file, new File(new File(file.toPath().getParent().getParent().getParent()), file.name()));
 
         cfs.loadNewSSTables();
     }
diff --git a/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java b/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java
index 52dcd2d..ad72f3d 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/DirectorySizerBench.java
@@ -18,14 +18,13 @@
 
 package org.apache.cassandra.test.microbench;
 
-import java.io.File;
 import java.io.IOException;
 import java.io.PrintWriter;
 import java.nio.file.Files;
-import java.util.Arrays;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.DirectorySizeCalculator;
 import org.openjdk.jmh.annotations.*;
@@ -46,7 +45,7 @@
     @Setup(Level.Trial)
     public void setUp() throws IOException
     {
-        tempDir = Files.createTempDirectory(randString()).toFile();
+        tempDir = new File(Files.createTempDirectory(randString()));
 
         // Since #'s on laptops and commodity desktops are so useful in considering enterprise virtualized server environments...
 
@@ -65,14 +64,9 @@
         // [java]   Statistics: (min, avg, max) = (73.687, 74.714, 76.872), stdev = 0.835
         // [java]   Confidence interval (99.9%): [74.156, 75.272]
 
-        // Throttle CPU on the Windows box to .87GHZ from 4.3GHZ turbo single-core, and #'s for 25600:
-        // [java] Result: 298.628 ▒(99.9%) 14.755 ms/op [Average]
-        // [java]   Statistics: (min, avg, max) = (291.245, 298.628, 412.881), stdev = 22.085
-        // [java]   Confidence interval (99.9%): [283.873, 313.383]
-
         // Test w/25,600 files, 100x the load of a full default CommitLog (8192) divided by size (32 per)
         populateRandomFiles(tempDir, 25600);
-        sizer = new DirectorySizeCalculator(tempDir);
+        sizer = new DirectorySizeCalculator();
     }
 
     @TearDown
@@ -85,7 +79,7 @@
     {
         for (int i = 0; i < count; i++)
         {
-            PrintWriter pw = new PrintWriter(dir + File.separator + randString(), "UTF-8");
+            PrintWriter pw = new PrintWriter(dir + File.pathSeparator() + randString(), "UTF-8");
             pw.write(randString());
             pw.close();
         }
diff --git a/test/microbench/org/apache/cassandra/test/microbench/FastThreadExecutor.java b/test/microbench/org/apache/cassandra/test/microbench/FastThreadExecutor.java
index 5644e4f..03ea710 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/FastThreadExecutor.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/FastThreadExecutor.java
@@ -18,12 +18,13 @@
 
 package org.apache.cassandra.test.microbench;
 
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.TimeUnit;
 
 import io.netty.util.concurrent.DefaultThreadFactory;
 
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
+
 /**
  * Created to test perf of FastThreadLocal
  *
@@ -34,6 +35,6 @@
 {
     public FastThreadExecutor(int size, String name)
     {
-        super(size, size, 10, TimeUnit.SECONDS, new LinkedBlockingQueue<>(), new DefaultThreadFactory(name, true));
+        super(size, size, 10, SECONDS, newBlockingQueue(), new DefaultThreadFactory(name, true));
     }
 }
diff --git a/test/microbench/org/apache/cassandra/test/microbench/GcCompactionBenchTest.java b/test/microbench/org/apache/cassandra/test/microbench/GcCompactionBenchTest.java
index a1a6146..6af9811 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/GcCompactionBenchTest.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/GcCompactionBenchTest.java
@@ -49,6 +49,9 @@
 import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class GcCompactionBenchTest extends CQLTester
 {
     private static final String SIZE_TIERED_STRATEGY = "SizeTieredCompactionStrategy', 'min_sstable_size' : '0";
@@ -186,9 +189,9 @@
             if (ii % (FLUSH_FREQ * 10) == 0)
             {
                 System.out.println("C");
-                long startTime = System.nanoTime();
+                long startTime = nanoTime();
                 getCurrentColumnFamilyStore().enableAutoCompaction(true);
-                long endTime = System.nanoTime();
+                long endTime = nanoTime();
                 compactionTimeNanos += endTime - startTime;
                 getCurrentColumnFamilyStore().disableAutoCompaction();
             }
@@ -203,7 +206,7 @@
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
         cfs.disableAutoCompaction();
 
-        long onStartTime = System.currentTimeMillis();
+        long onStartTime = currentTimeMillis();
         ExecutorService es = Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors());
         List<Future<?>> tasks = new ArrayList<>();
         for (int ti = 0; ti < 1; ++ti)
@@ -227,7 +230,7 @@
             task.get();
 
         flush();
-        long onEndTime = System.currentTimeMillis();
+        long onEndTime = currentTimeMillis();
         int startRowCount = countRows(cfs);
         int startTombCount = countTombstoneMarkers(cfs);
         int startRowDeletions = countRowDeletions(cfs);
@@ -238,9 +241,9 @@
 
         String hashesBefore = getHashes();
 
-        long startTime = System.currentTimeMillis();
+        long startTime = currentTimeMillis();
         CompactionManager.instance.performGarbageCollection(cfs, tombstoneOption, 0);
-        long endTime = System.currentTimeMillis();
+        long endTime = currentTimeMillis();
 
         int endRowCount = countRows(cfs);
         int endTombCount = countTombstoneMarkers(cfs);
@@ -267,9 +270,9 @@
 
     private String getHashes() throws Throwable
     {
-        long startTime = System.currentTimeMillis();
+        long startTime = currentTimeMillis();
         String hashes = Arrays.toString(getRows(execute(hashQuery))[0]);
-        long endTime = System.currentTimeMillis();
+        long endTime = currentTimeMillis();
         System.out.println(String.format("Hashes: %s, retrieved in %.3fs", hashes, (endTime - startTime) * 1e-3));
         return hashes;
     }
diff --git a/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java b/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java
index eaa74de..8db3f34 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/LatencyTrackingBench.java
@@ -20,18 +20,12 @@
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
-import com.codahale.metrics.Histogram;
-import com.codahale.metrics.Timer;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry;
-import org.apache.cassandra.metrics.ClearableHistogram;
 import org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir;
 import org.apache.cassandra.metrics.LatencyMetrics;
-import org.apache.cassandra.metrics.LatencyMetricsTest;
 import org.apache.cassandra.metrics.MetricNameFactory;
-import org.apache.cassandra.metrics.TableMetrics;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
-import org.openjdk.jmh.annotations.CompilerControl;
 import org.openjdk.jmh.annotations.Fork;
 import org.openjdk.jmh.annotations.Level;
 import org.openjdk.jmh.annotations.Measurement;
@@ -41,7 +35,6 @@
 import org.openjdk.jmh.annotations.Scope;
 import org.openjdk.jmh.annotations.Setup;
 import org.openjdk.jmh.annotations.State;
-import org.openjdk.jmh.annotations.TearDown;
 import org.openjdk.jmh.annotations.Threads;
 import org.openjdk.jmh.annotations.Warmup;
 import org.openjdk.jmh.infra.Blackhole;
diff --git a/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java b/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java
index a3446aa..9070473 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/MessageOutBench.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.util.EnumMap;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.net.InetAddresses;
@@ -36,7 +35,7 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.NoPayload;
 import org.apache.cassandra.net.ParamType;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 import org.openjdk.jmh.annotations.Benchmark;
 import org.openjdk.jmh.annotations.BenchmarkMode;
 import org.openjdk.jmh.annotations.Fork;
@@ -50,6 +49,8 @@
 import org.openjdk.jmh.annotations.Warmup;
 
 import static org.apache.cassandra.net.Verb.ECHO_REQ;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 @State(Scope.Thread)
 @Warmup(iterations = 4, time = 1, timeUnit = TimeUnit.SECONDS)
@@ -71,12 +72,12 @@
     {
         DatabaseDescriptor.daemonInitialization();
 
-        UUID uuid = UUIDGen.getTimeUUID();
+        TimeUUID timeUuid = nextTimeUUID();
         Map<ParamType, Object> parameters = new EnumMap<>(ParamType.class);
 
         if (withParams)
         {
-            parameters.put(ParamType.TRACE_SESSION, uuid);
+            parameters.put(ParamType.TRACE_SESSION, timeUuid);
         }
 
         addr = InetAddressAndPort.getByAddress(InetAddresses.forString("127.0.73.101"));
@@ -96,7 +97,7 @@
     {
         try (DataOutputBuffer out = new DataOutputBuffer())
         {
-            Message.serializer.serialize(Message.builder(msgOut).withCreatedAt(System.nanoTime()).withId(42).build(),
+            Message.serializer.serialize(Message.builder(msgOut).withCreatedAt(nanoTime()).withId(42).build(),
                                          out, messagingVersion);
             DataInputBuffer in = new DataInputBuffer(out.buffer(), false);
             Message.serializer.deserialize(in, addr, messagingVersion);
diff --git a/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java b/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java
index 41d6aab..d258026 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/MutationBench.java
@@ -29,6 +29,7 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.io.util.DataInputBuffer;
@@ -87,7 +88,7 @@
     @Setup
     public void setup() throws IOException
     {
-        Schema.instance.load(KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1)));
+        SchemaTestUtil.addOrUpdateKeyspace(KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1)), false);
         KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace);
         TableMetadata metadata =
             CreateTableStatement.parse("CREATE TABLE userpics " +
@@ -97,7 +98,7 @@
                                        "PRIMARY KEY(userid, picid))", keyspace)
                                 .build();
 
-        Schema.instance.load(ksm.withSwapped(ksm.tables.with(metadata)));
+        SchemaTestUtil.addOrUpdateKeyspace(ksm.withSwapped(ksm.tables.with(metadata)), false);
 
         mutation = (Mutation)UpdateBuilder.create(metadata, 1L).newRow(1L).add("commentid", 32L).makeMutation();
         buffer = ByteBuffer.allocate(mutation.serializedSize(MessagingService.current_version));
diff --git a/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java b/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java
index cd15646..890f74c 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/OutputStreamBench.java
@@ -288,4 +288,4 @@
     public void testRLargeLegacyWriteUTF() throws IOException {
         BufferedDataOutputStreamTest.writeUTFLegacy(large, hole);
     }
-}
\ No newline at end of file
+}
diff --git a/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java b/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java
index b4b126f..e3644c7 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/PendingRangesBench.java
@@ -29,7 +29,6 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.PendingRangeMaps;
 import org.apache.cassandra.locator.Replica;
-import org.apache.cassandra.locator.ReplicaUtils;
 import org.openjdk.jmh.annotations.*;
 import org.openjdk.jmh.infra.Blackhole;
 
diff --git a/test/microbench/org/apache/cassandra/test/microbench/StreamingTombstoneHistogramBuilderBench.java b/test/microbench/org/apache/cassandra/test/microbench/StreamingTombstoneHistogramBuilderBench.java
old mode 100755
new mode 100644
index f3df8c1..0dd51f2
--- a/test/microbench/org/apache/cassandra/test/microbench/StreamingTombstoneHistogramBuilderBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/StreamingTombstoneHistogramBuilderBench.java
@@ -28,6 +28,8 @@
 import org.openjdk.jmh.runner.*;
 import org.openjdk.jmh.runner.options.*;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 @BenchmarkMode(Mode.AverageTime)
 @OutputTimeUnit(TimeUnit.MILLISECONDS)
 @Warmup(iterations = 3, time = 1, timeUnit = TimeUnit.SECONDS)
@@ -45,7 +47,7 @@
 
     static
     {
-        final int now = (int) (System.currentTimeMillis() / 1000L);
+        final int now = (int) (currentTimeMillis() / 1000L);
         Random random = new Random();
         for(int i = 0 ; i < 10000000; i++)
         {
diff --git a/test/microbench/org/apache/cassandra/test/microbench/TimedMonitorBench.java b/test/microbench/org/apache/cassandra/test/microbench/TimedMonitorBench.java
new file mode 100644
index 0000000..2420b71
--- /dev/null
+++ b/test/microbench/org/apache/cassandra/test/microbench/TimedMonitorBench.java
@@ -0,0 +1,198 @@
+/*
+ * 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.test.microbench;
+
+import org.openjdk.jmh.annotations.*;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+@BenchmarkMode(Mode.SampleTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 2, time = 10, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 2)
+@Threads(4)
+@State(Scope.Benchmark)
+public class TimedMonitorBench
+{
+    @Param({"A", "B"})
+    private String type;
+
+    private Lock lock;
+
+    @State(Scope.Thread)
+    public static class ThreadState
+    {
+        Lock lock;
+
+        @Setup(Level.Iteration)
+        public void setup(TimedMonitorBench benchState) throws Throwable
+        {
+            if (benchState.type.equals("A")) lock = new A();
+            else if (benchState.type.equals("B")) lock = new B();
+            else throw new IllegalStateException();
+        }
+    }
+
+    @Setup(Level.Trial)
+    public void setup() throws Throwable
+    {
+        if (type.equals("A")) lock = new A();
+        else if (type.equals("B")) lock = new B();
+        else throw new IllegalStateException();
+    }
+
+    interface Lock
+    {
+        boolean lock(long deadline);
+        void maybeUnlock();
+    }
+
+    static class A implements Lock
+    {
+        private volatile Thread lockedBy;
+        private volatile int waiting;
+
+        private static final AtomicReferenceFieldUpdater<A, Thread> lockedByUpdater = AtomicReferenceFieldUpdater.newUpdater(A.class, Thread.class, "lockedBy");
+
+        public boolean lock(long deadline)
+        {
+            try
+            {
+                Thread thread = Thread.currentThread();
+                if (lockedByUpdater.compareAndSet(this, null, thread))
+                    return true;
+
+                synchronized (this)
+                {
+                    waiting++;
+
+                    try
+                    {
+                        while (true)
+                        {
+                            if (lockedByUpdater.compareAndSet(this, null, thread))
+                                return true;
+
+                            while (lockedBy != null)
+                            {
+                                long now = System.nanoTime();
+                                if (now >= deadline)
+                                    return false;
+
+                                wait(1 + ((deadline - now) - 1) / 1000000);
+                            }
+                        }
+                    }
+                    finally
+                    {
+                        waiting--;
+                    }
+                }
+            }
+            catch (InterruptedException e)
+            {
+                Thread.currentThread().interrupt();
+                return false;
+            }
+        }
+
+        public void maybeUnlock()
+        {
+            // no visibility requirements, as if we hold the lock it was last updated by us
+            if (lockedBy == null)
+                return;
+
+            Thread thread = Thread.currentThread();
+
+            if (lockedBy == thread)
+            {
+                lockedBy = null;
+                if (waiting > 0)
+                {
+                    synchronized (this)
+                    {
+                        notify();
+                    }
+                }
+            }
+        }
+    }
+
+    static class B implements Lock
+    {
+        private Thread lockedBy;
+
+        public synchronized boolean lock(long deadline)
+        {
+            try
+            {
+                Thread thread = Thread.currentThread();
+                while (lockedBy != null)
+                {
+                    long now = System.nanoTime();
+                    if (now >= deadline)
+                        return false;
+
+                    wait(1 + ((deadline - now) - 1) / 1000000);
+                }
+                lockedBy = thread;
+                return true;
+            }
+            catch (InterruptedException e)
+            {
+                Thread.currentThread().interrupt();
+                return false;
+            }
+        }
+
+        public void maybeUnlock()
+        {
+            // no visibility requirements, as if we hold the lock it was last updated by us
+            if (lockedBy == null)
+                return;
+
+            Thread thread = Thread.currentThread();
+
+            if (lockedBy == thread)
+            {
+                synchronized (this)
+                {
+                    lockedBy = null;
+                    notify();
+                }
+            }
+        }
+    }
+
+    @Benchmark
+    public void unshared(ThreadState state)
+    {
+        state.lock.lock(Long.MAX_VALUE);
+        state.lock.maybeUnlock();
+    }
+
+    @Benchmark
+    public void shared()
+    {
+        lock.lock(Long.MAX_VALUE);
+        lock.maybeUnlock();
+    }
+}
diff --git a/test/microbench/org/apache/cassandra/test/microbench/VIntCodingBench.java b/test/microbench/org/apache/cassandra/test/microbench/VIntCodingBench.java
new file mode 100644
index 0000000..9c82236
--- /dev/null
+++ b/test/microbench/org/apache/cassandra/test/microbench/VIntCodingBench.java
@@ -0,0 +1,353 @@
+/*
+ * 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.test.microbench;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.channels.WritableByteChannel;
+import java.util.PrimitiveIterator;
+import java.util.Random;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
+import org.apache.cassandra.io.util.DataOutputPlus;
+import org.apache.cassandra.utils.vint.VIntCoding;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+import org.openjdk.jmh.infra.Blackhole;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.NANOSECONDS)
+@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 3, jvmArgsAppend = "-Xmx512M")
+@Threads(1)
+@State(Scope.Benchmark)
+public class VIntCodingBench
+{
+    long oneByte = 53;
+    long twoBytes = 10201;
+    long threeBytes = 1097151L;
+    long fourBytes = 168435455L;
+    long fiveBytes = 33251130335L;
+    long sixBytes = 3281283447775L;
+    long sevenBytes = 417672546086779L;
+    long eightBytes = 52057592037927932L;
+    long nineBytes = 72057594037927937L;
+
+    final static String MONOMORPHIC = "monomorphic";
+    final static String BIMORPHIC = "bimorphic";
+    final static String MEGAMORPHIC = "megamorphic";
+
+    @Param({ MONOMORPHIC, BIMORPHIC, MEGAMORPHIC})
+    String allocation;
+
+    final Random random = new Random(100);
+    final PrimitiveIterator.OfLong longs = random.longs().iterator();
+    final static int BUFFER_SIZE = 8192;
+
+    ByteBuffer onheap = ByteBuffer.allocate(BUFFER_SIZE);
+    ByteBuffer direct = ByteBuffer.allocateDirect(BUFFER_SIZE);
+    File mmapedFile = new File(VIntCodingBench.class + "_mmap");
+    ByteBuffer mmaped = allocateMmapedByteBuffer(mmapedFile, BUFFER_SIZE);
+
+    @TearDown
+    public void tearDown()
+    {
+        mmapedFile.delete();
+    }
+
+    private static ByteBuffer allocateMmapedByteBuffer(File mmapFile, int bufferSize)
+    {
+        try(RandomAccessFile file = new RandomAccessFile(mmapFile, "rw");
+            FileChannel ch = file.getChannel())
+        {
+            return ch.map(FileChannel.MapMode.READ_WRITE, 0, bufferSize);
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private ByteBuffer getByteBuffer(String allocation)
+    {
+        ByteBuffer buffer;
+        if (allocation.equals(MONOMORPHIC))
+        {
+            buffer = onheap;
+        }
+        else if (allocation.equals(BIMORPHIC))
+        {
+            buffer = random.nextBoolean() ? onheap : direct;
+        }
+        else
+        {
+            switch(random.nextInt(3))
+            {
+                case 0:
+                    buffer = onheap;
+                    break;
+                case 1:
+                    buffer = direct;
+                    break;
+                default:
+                    buffer = mmaped;
+                    break;
+            }
+        }
+        return buffer;
+    }
+
+    private DataOutputPlus getBufferedDataOutput(Blackhole bh, ByteBuffer buffer)
+    {
+        WritableByteChannel wbc = new WritableByteChannel() {
+
+            @Override
+            public boolean isOpen()
+            {
+                return true;
+            }
+
+            @Override
+            public void close() throws IOException
+            {
+            }
+
+            @Override
+            public int write(ByteBuffer src) throws IOException
+            {
+                bh.consume(src);
+                int remaining = src.remaining();
+                src.position(src.limit());
+                return remaining;
+            }
+        };
+        return new BufferedDataOutputStreamPlus(wbc, buffer);
+    }
+
+    @Benchmark
+    public void testWrite1ByteBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(oneByte, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite1ByteDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(oneByte, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite2BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(twoBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite2BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(twoBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite3BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(threeBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite3BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(threeBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite4BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(fourBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite4BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(fourBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite5BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(fiveBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite5BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(fiveBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite6BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(sixBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite6BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(sixBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite7BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(sevenBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite7BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(sevenBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite8BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(eightBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite8BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(eightBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite9BytesBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(nineBytes, buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWrite9BytesDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(nineBytes, out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWriteRandomLongBB(final Blackhole bh)
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        VIntCoding.writeUnsignedVInt(longs.nextLong(), buffer);
+        bh.consume(buffer);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testWriteRandomLongDOP(final Blackhole bh) throws IOException
+    {
+        ByteBuffer buffer = getByteBuffer(allocation);
+        DataOutputPlus out = getBufferedDataOutput(bh, buffer);
+        VIntCoding.writeUnsignedVInt(longs.nextLong(), out);
+        bh.consume(out);
+        buffer.clear();
+    }
+
+    @Benchmark
+    public void testComputeUnsignedVIntSize(final Blackhole bh)
+    {
+        bh.consume(VIntCoding.computeUnsignedVIntSize(longs.nextLong()));
+    }
+}
diff --git a/test/microbench/org/apache/cassandra/test/microbench/ZeroCopyStreamingBenchmark.java b/test/microbench/org/apache/cassandra/test/microbench/ZeroCopyStreamingBenchmark.java
index 9e84e0a..b5bb40c 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/ZeroCopyStreamingBenchmark.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/ZeroCopyStreamingBenchmark.java
@@ -25,7 +25,6 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
 import io.netty.buffer.ByteBuf;
@@ -55,7 +54,7 @@
 import org.apache.cassandra.net.AsyncStreamingOutputPlus;
 import org.apache.cassandra.schema.CachingParams;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.streaming.DefaultConnectionFactory;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.SessionInfo;
 import org.apache.cassandra.streaming.StreamCoordinator;
@@ -79,9 +78,11 @@
 import org.openjdk.jmh.annotations.Threads;
 import org.openjdk.jmh.annotations.Warmup;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 /**
- * Please ensure that this benchmark is run with stream_throughput_outbound_megabits_per_sec set to a
- * really high value otherwise, throttling will kick in and the results will not be meaningful.
+ * Please ensure that this benchmark is run with entire_sstable_stream_throughput_outbound
+ * set to a really high value otherwise, throttling will kick in and the results will not be meaningful.
  */
 @Warmup(iterations = 1, time = 1, timeUnit = TimeUnit.SECONDS)
 @Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@@ -202,7 +203,7 @@
                 .build()
                 .applyUnsafe();
             }
-            store.forceBlockingFlush();
+            store.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
             CompactionManager.instance.performMaximal(store, false);
         }
 
@@ -216,13 +217,13 @@
 
         private StreamSession setupStreamingSessionForTest()
         {
-            StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new DefaultConnectionFactory(), false, false, null, PreviewKind.NONE);
-            StreamResultFuture future = StreamResultFuture.createInitiator(UUID.randomUUID(), StreamOperation.BOOTSTRAP, Collections.<StreamEventHandler>emptyList(), streamCoordinator);
+            StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new NettyStreamingConnectionFactory(), false, false, null, PreviewKind.NONE);
+            StreamResultFuture future = StreamResultFuture.createInitiator(nextTimeUUID(), StreamOperation.BOOTSTRAP, Collections.<StreamEventHandler>emptyList(), streamCoordinator);
 
             InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
             streamCoordinator.addSessionInfo(new SessionInfo(peer, 0, peer, Collections.emptyList(), Collections.emptyList(), StreamSession.State.INITIALIZED));
 
-            StreamSession session = streamCoordinator.getOrCreateNextSession(peer);
+            StreamSession session = streamCoordinator.getOrCreateOutboundSession(peer);
             session.init(future);
             return session;
         }
@@ -241,7 +242,7 @@
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
-    public void blockStreamReader(BenchmarkState state) throws Exception
+    public void blockStreamReader(BenchmarkState state) throws Throwable
     {
         EmbeddedChannel channel = createMockNettyChannel();
         AsyncStreamingInputPlus in = new AsyncStreamingInputPlus(channel);
@@ -265,7 +266,7 @@
 
     @Benchmark
     @BenchmarkMode(Mode.Throughput)
-    public void partialStreamReader(BenchmarkState state) throws Exception
+    public void partialStreamReader(BenchmarkState state) throws Throwable
     {
         EmbeddedChannel channel = createMockNettyChannel();
         AsyncStreamingInputPlus in = new AsyncStreamingInputPlus(channel);
diff --git a/test/microbench/org/apache/cassandra/test/microbench/btree/AtomicBTreePartitionUpdateBench.java b/test/microbench/org/apache/cassandra/test/microbench/btree/AtomicBTreePartitionUpdateBench.java
index c32b1e3..34ec29a 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/btree/AtomicBTreePartitionUpdateBench.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/btree/AtomicBTreePartitionUpdateBench.java
@@ -24,7 +24,6 @@
 import java.util.List;
 import java.util.Random;
 import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -71,6 +70,7 @@
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.utils.btree.BTree;
 import org.apache.cassandra.utils.btree.UpdateFunction;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.BulkIterator;
 import org.apache.cassandra.utils.memory.ByteBufferCloner;
@@ -105,7 +105,7 @@
 {
     private static final OpOrder NO_ORDER = new OpOrder();
     private static final MutableDeletionInfo NO_DELETION_INFO = new MutableDeletionInfo(DeletionTime.LIVE);
-    private static final HeapPool POOL = new HeapPool(Long.MAX_VALUE, 1.0f, () -> CompletableFuture.completedFuture(Boolean.TRUE));
+    private static final HeapPool POOL = new HeapPool(Long.MAX_VALUE, 1.0f, () -> ImmediateFuture.success(Boolean.TRUE));
     private static final ByteBuffer zero = Int32Type.instance.decompose(0);
     private static final DecoratedKey decoratedKey = new BufferDecoratedKey(new ByteOrderedPartitioner().getToken(zero), zero);
 
diff --git a/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTest.java b/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTest.java
index 789ca00..54f721b 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTest.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTest.java
@@ -19,108 +19,59 @@
 package org.apache.cassandra.test.microbench.instance;
 
 
-import java.util.Random;
-import java.util.concurrent.TimeUnit;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.Future;
 import java.util.function.Supplier;
-import java.util.stream.IntStream;
 
 import com.google.common.base.Throwables;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.Memtable;
-import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.utils.FBUtilities;
 import org.openjdk.jmh.annotations.*;
 
-@BenchmarkMode(Mode.AverageTime)
-@OutputTimeUnit(TimeUnit.MILLISECONDS)
-@Warmup(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
-@Measurement(iterations = 15, time = 2, timeUnit = TimeUnit.SECONDS)
-@Fork(value = 1)
-@Threads(1)
 @State(Scope.Benchmark)
-public abstract class ReadTest extends CQLTester
+public abstract class ReadTest extends SimpleTableWriter
 {
-    static String keyspace;
-    String table;
-    ColumnFamilyStore cfs;
-    Random rand;
-
-    @Param({"1000"})
-    int BATCH = 1_000;
-
     public enum Flush
     {
         INMEM, NO, YES
     }
 
-    @Param({"1000000"})
-    int count = 1_000_000;
-
     @Param({"INMEM", "YES"})
     Flush flush = Flush.INMEM;
 
-    public enum Execution
-    {
-        SERIAL,
-        SERIAL_NET,
-        PARALLEL,
-        PARALLEL_NET,
-    }
-
-    @Param({"PARALLEL"})
-    Execution async = Execution.PARALLEL;
-
     @Setup(Level.Trial)
     public void setup() throws Throwable
     {
-        rand = new Random(1);
-        CQLTester.setUpClass();
-        CQLTester.prepareServer();
-        System.err.println("setupClass done.");
-        keyspace = createKeyspace("CREATE KEYSPACE %s with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } and durable_writes = false");
-        table = createTable(keyspace, "CREATE TABLE %s ( userid bigint, picid bigint, commentid bigint, PRIMARY KEY(userid, picid)) with compression = {'enabled': false}");
-        execute("use "+keyspace+";");
-        switch (async)
-        {
-            case SERIAL_NET:
-            case PARALLEL_NET:
-                CQLTester.requireNetwork();
-                executeNet(getDefaultVersion(), "use " + keyspace + ";");
-        }
-        String writeStatement = "INSERT INTO "+table+"(userid,picid,commentid)VALUES(?,?,?)";
-        System.err.println("Prepared, batch " + BATCH + " flush " + flush);
-        System.err.println("Disk access mode " + DatabaseDescriptor.getDiskAccessMode() + " index " + DatabaseDescriptor.getIndexAccessMode());
+        super.commonSetup();
 
-        cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
-        cfs.disableAutoCompaction();
-        cfs.forceBlockingFlush();
-
-        //Warm up
+        // Write the data we are going to read.
+        long writeStart = System.currentTimeMillis();
         System.err.println("Writing " + count);
         long i;
         for (i = 0; i <= count - BATCH; i += BATCH)
-            performWrite(writeStatement, i, BATCH);
+            performWrite(i, BATCH);
         if (i < count)
-            performWrite(writeStatement, i, count - i);
+            performWrite(i, (int) (count - i));
+        long writeLength = System.currentTimeMillis() - writeStart;
+        System.err.format("... done in %.3f s.\n", writeLength / 1000.0);
 
         Memtable memtable = cfs.getTracker().getView().getCurrentMemtable();
-        System.err.format("Memtable in %s mode: %d ops, %s serialized bytes, %s (%.0f%%) on heap, %s (%.0f%%) off-heap\n",
+        Memtable.MemoryUsage usage = Memtable.getMemoryUsage(memtable);
+        System.err.format("%s in %s mode: %d ops, %s serialized bytes, %s\n",
+                          memtable.getClass().getSimpleName(),
                           DatabaseDescriptor.getMemtableAllocationType(),
-                          memtable.getOperations(),
+                          memtable.operationCount(),
                           FBUtilities.prettyPrintMemory(memtable.getLiveDataSize()),
-                          FBUtilities.prettyPrintMemory(memtable.getAllocator().onHeap().owns()),
-                          100 * memtable.getAllocator().onHeap().ownershipRatio(),
-                          FBUtilities.prettyPrintMemory(memtable.getAllocator().offHeap().owns()),
-                          100 * memtable.getAllocator().offHeap().ownershipRatio());
+                          usage);
 
         switch (flush)
         {
         case YES:
-            cfs.forceBlockingFlush();
+            cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
             break;
         case INMEM:
             if (!cfs.getLiveSSTables().isEmpty())
@@ -137,29 +88,6 @@
         }
     }
 
-    abstract Object[] writeArguments(long i);
-
-    public void performWrite(String writeStatement, long ofs, long count) throws Throwable
-    {
-        for (long i = ofs; i < ofs + count; ++i)
-            execute(writeStatement, writeArguments(i));
-    }
-
-
-    @TearDown(Level.Trial)
-    public void teardown() throws InterruptedException
-    {
-        if (flush == Flush.INMEM && !cfs.getLiveSSTables().isEmpty())
-            throw new AssertionError("SSTables created for INMEM test.");
-
-        // do a flush to print sizes
-        cfs.forceBlockingFlush();
-
-        CommitLog.instance.shutdownBlocking();
-        CQLTester.tearDownClass();
-        CQLTester.cleanup();
-    }
-
     public Object performReadSerial(String readStatement, Supplier<Object[]> supplier) throws Throwable
     {
         long sum = 0;
@@ -170,20 +98,25 @@
 
     public Object performReadThreads(String readStatement, Supplier<Object[]> supplier) throws Throwable
     {
-        return IntStream.range(0, BATCH)
-                        .parallel()
-                        .mapToLong(i ->
-                                   {
-                                       try
-                                       {
-                                           return execute(readStatement, supplier.get()).size();
-                                       }
-                                       catch (Throwable throwable)
-                                       {
-                                           throw Throwables.propagate(throwable);
-                                       }
-                                   })
-                        .sum();
+        List<Future<Integer>> futures = new ArrayList<>();
+        for (long i = 0; i < BATCH; ++i)
+        {
+            futures.add(executorService.submit(() ->
+                                               {
+                                                   try
+                                                   {
+                                                       return execute(readStatement, supplier.get()).size();
+                                                   }
+                                                   catch (Throwable throwable)
+                                                   {
+                                                       throw Throwables.propagate(throwable);
+                                                   }
+                                               }));
+        }
+        long done = 0;
+        for (Future<Integer> f : futures)
+            done += f.get();
+        return done;
     }
 
     public Object performReadSerialNet(String readStatement, Supplier<Object[]> supplier) throws Throwable
@@ -197,37 +130,55 @@
 
     public long performReadThreadsNet(String readStatement, Supplier<Object[]> supplier) throws Throwable
     {
-        return IntStream.range(0, BATCH)
-                        .parallel()
-                        .mapToLong(i ->
-                                   {
-                                       try
-                                       {
-                                           return executeNet(getDefaultVersion(), readStatement, supplier.get())
-                                                          .getAvailableWithoutFetching();
-                                       }
-                                       catch (Throwable throwable)
-                                       {
-                                           throw Throwables.propagate(throwable);
-                                       }
-                                   })
-                        .sum();
+        List<Future<Integer>> futures = new ArrayList<>();
+        for (long i = 0; i < BATCH; ++i)
+        {
+            futures.add(executorService.submit(() ->
+                                               {
+                                                   try
+                                                   {
+                                                       return executeNet(getDefaultVersion(), readStatement, supplier.get())
+                                                              .getAvailableWithoutFetching();
+                                                   }
+                                                   catch (Throwable throwable)
+                                                   {
+                                                       throw Throwables.propagate(throwable);
+                                                   }
+                                               }));
+        }
+        long done = 0;
+        for (Future<Integer> f : futures)
+            done += f.get();
+        return done;
     }
 
 
     public Object performRead(String readStatement, Supplier<Object[]> supplier) throws Throwable
     {
-        switch (async)
+        if (useNet)
         {
-            case SERIAL:
-                return performReadSerial(readStatement, supplier);
-            case SERIAL_NET:
+            if (threadCount == 1)
                 return performReadSerialNet(readStatement, supplier);
-            case PARALLEL:
-                return performReadThreads(readStatement, supplier);
-            case PARALLEL_NET:
+            else
                 return performReadThreadsNet(readStatement, supplier);
         }
-        return null;
+        else
+        {
+            if (threadCount == 1)
+                return performReadSerial(readStatement, supplier);
+            else
+                return performReadThreads(readStatement, supplier);
+        }
+    }
+
+    void doExtraChecks()
+    {
+        if (flush == Flush.INMEM && !cfs.getLiveSSTables().isEmpty())
+            throw new AssertionError("SSTables created for INMEM test.");
+    }
+
+    String extraInfo()
+    {
+        return " flush " + flush;
     }
 }
diff --git a/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTestSmallPartitions.java b/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTestSmallPartitions.java
index b36cfd1..c665c59 100644
--- a/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTestSmallPartitions.java
+++ b/test/microbench/org/apache/cassandra/test/microbench/instance/ReadTestSmallPartitions.java
@@ -19,8 +19,26 @@
 package org.apache.cassandra.test.microbench.instance;
 
 
-import org.openjdk.jmh.annotations.Benchmark;
+import java.util.concurrent.TimeUnit;
 
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.BenchmarkMode;
+import org.openjdk.jmh.annotations.Fork;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.OutputTimeUnit;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.Threads;
+import org.openjdk.jmh.annotations.Warmup;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 1)
+@Threads(1)
+@State(Scope.Benchmark)
 public class ReadTestSmallPartitions extends ReadTest
 {
     String readStatement()
diff --git a/test/microbench/org/apache/cassandra/test/microbench/instance/SimpleTableWriter.java b/test/microbench/org/apache/cassandra/test/microbench/instance/SimpleTableWriter.java
new file mode 100644
index 0000000..fba8d16
--- /dev/null
+++ b/test/microbench/org/apache/cassandra/test/microbench/instance/SimpleTableWriter.java
@@ -0,0 +1,209 @@
+/*
+ * 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.test.microbench.instance;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.base.Throwables;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.utils.FBUtilities;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Param;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+
+@State(Scope.Benchmark)
+public abstract class SimpleTableWriter extends CQLTester
+{
+    static String keyspace;
+    String table;
+    ColumnFamilyStore cfs;
+    Random rand;
+    String writeStatement;
+    ExecutorService executorService;
+
+    @Param({"1000000"})
+    int count = 1_000_000;
+
+    @Param({ "1000" })
+    int BATCH = 1_000;
+
+    @Param({ "default" })
+    String memtableClass = "default";
+
+    @Param({ "false" })
+    boolean useNet = false;
+
+    @Param({ "32" })
+    int threadCount;
+
+    public void commonSetup() throws Throwable
+    {
+        rand = new Random(1);
+        executorService = Executors.newFixedThreadPool(threadCount);
+        CQLTester.setUpClass();
+        CQLTester.prepareServer();
+        DatabaseDescriptor.setAutoSnapshot(false);
+        System.err.println("setupClass done.");
+        String memtableSetup = "";
+        if (!memtableClass.isEmpty())
+            memtableSetup = String.format(" AND memtable = '%s'", memtableClass);
+        keyspace = createKeyspace("CREATE KEYSPACE %s with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } and durable_writes = false");
+        table = createTable(keyspace,
+                            "CREATE TABLE %s ( userid bigint, picid bigint, commentid bigint, PRIMARY KEY(userid, picid)) with compression = {'enabled': false}" +
+                            memtableSetup);
+        execute("use " + keyspace + ";");
+        if (useNet)
+        {
+            CQLTester.requireNetwork();
+            executeNet(getDefaultVersion(), "use " + keyspace + ";");
+        }
+        writeStatement = "INSERT INTO " + table + "(userid,picid,commentid)VALUES(?,?,?)";
+        System.err.println("Prepared, batch " + BATCH + " threads " + threadCount + extraInfo());
+        System.err.println("Disk access mode " + DatabaseDescriptor.getDiskAccessMode() +
+                           " index " + DatabaseDescriptor.getIndexAccessMode());
+
+        cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
+        cfs.disableAutoCompaction();
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
+    }
+
+    abstract Object[] writeArguments(long i);
+
+    public void performWrite(long ofs, int count) throws Throwable
+    {
+        if (useNet)
+        {
+            if (threadCount == 1)
+                performWriteSerialNet(ofs, count);
+            else
+                performWriteThreadsNet(ofs, count);
+        }
+        else
+        {
+            if (threadCount == 1)
+                performWriteSerial(ofs, count);
+            else
+                performWriteThreads(ofs, count);
+        }
+    }
+
+    public void performWriteSerial(long ofs, int count) throws Throwable
+    {
+        for (long i = ofs; i < ofs + count; ++i)
+            execute(writeStatement, writeArguments(i));
+    }
+
+    public void performWriteThreads(long ofs, int count) throws Throwable
+    {
+        List<Future<Integer>> futures = new ArrayList<>();
+        for (int i = 0; i < count; ++i)
+        {
+            long pos = ofs + i;
+            futures.add(executorService.submit(() ->
+                                               {
+                                                   try
+                                                   {
+                                                       execute(writeStatement, writeArguments(pos));
+                                                       return 1;
+                                                   }
+                                                   catch (Throwable throwable)
+                                                   {
+                                                       throw Throwables.propagate(throwable);
+                                                   }
+                                               }));
+        }
+        int done = 0;
+        for (Future<Integer> f : futures)
+            done += f.get();
+        assert count == done;
+    }
+
+    public void performWriteSerialNet(long ofs, int count) throws Throwable
+    {
+        for (long i = ofs; i < ofs + count; ++i)
+            sessionNet().execute(writeStatement, writeArguments(i));
+    }
+
+    public void performWriteThreadsNet(long ofs, int count) throws Throwable
+    {
+        List<Future<Integer>> futures = new ArrayList<>();
+        for (long i = 0; i < count; ++i)
+        {
+            long pos = ofs + i;
+            futures.add(executorService.submit(() ->
+                                               {
+                                                   try
+                                                   {
+                                                       sessionNet().execute(writeStatement, writeArguments(pos));
+                                                       return 1;
+                                                   }
+                                                   catch (Throwable throwable)
+                                                   {
+                                                       throw Throwables.propagate(throwable);
+                                                   }
+                                               }));
+        }
+        long done = 0;
+        for (Future<Integer> f : futures)
+            done += f.get();
+        assert count == done;
+    }
+
+    @TearDown(Level.Trial)
+    public void teardown() throws InterruptedException
+    {
+        executorService.shutdown();
+        executorService.awaitTermination(15, TimeUnit.SECONDS);
+
+        Memtable memtable = cfs.getTracker().getView().getCurrentMemtable();
+        Memtable.MemoryUsage usage = Memtable.getMemoryUsage(memtable);
+        System.err.format("\n%s in %s mode: %d ops, %s serialized bytes, %s\n",
+                          memtable.getClass().getSimpleName(),
+                          DatabaseDescriptor.getMemtableAllocationType(),
+                          memtable.operationCount(),
+                          FBUtilities.prettyPrintMemory(memtable.getLiveDataSize()),
+                          usage);
+
+        doExtraChecks();
+
+        // do a flush to print sizes
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
+
+        CommitLog.instance.shutdownBlocking();
+        CQLTester.tearDownClass();
+        CQLTester.cleanup();
+    }
+
+    abstract void doExtraChecks();
+    abstract String extraInfo();
+}
diff --git a/test/microbench/org/apache/cassandra/test/microbench/instance/WriteTest.java b/test/microbench/org/apache/cassandra/test/microbench/instance/WriteTest.java
new file mode 100644
index 0000000..eda93b7
--- /dev/null
+++ b/test/microbench/org/apache/cassandra/test/microbench/instance/WriteTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.test.microbench.instance;
+
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.openjdk.jmh.annotations.*;
+
+@BenchmarkMode(Mode.AverageTime)
+@OutputTimeUnit(TimeUnit.MILLISECONDS)
+@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
+@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
+@Fork(value = 1)
+@Threads(1)
+@State(Scope.Benchmark)
+public class WriteTest extends SimpleTableWriter
+{
+
+    public enum EndOp
+    {
+        INMEM, TRUNCATE, FLUSH
+    }
+
+    @Param({"INMEM", "TRUNCATE", "FLUSH"})
+    EndOp flush = EndOp.INMEM;
+
+    @Setup(Level.Trial)
+    public void setup() throws Throwable
+    {
+        super.commonSetup();
+    }
+
+    @Benchmark
+    public void writeTable() throws Throwable
+    {
+        long i;
+        for (i = 0; i <= count - BATCH; i += BATCH)
+            performWrite(i, BATCH);
+        if (i < count)
+            performWrite(i, Math.toIntExact(count - i));
+
+        switch (flush)
+        {
+        case FLUSH:
+            cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.USER_FORCED);
+            // if we flush we also must truncate to avoid accummulating sstables
+        case TRUNCATE:
+            execute("TRUNCATE TABLE " + table);
+            // note: we turn snapshotting and durable writes (which would have caused a flush) off for this benchmark
+            break;
+        case INMEM:
+            if (!cfs.getLiveSSTables().isEmpty())
+                throw new AssertionError("SSTables created for INMEM test.");
+            // leave unflushed, i.e. next iteration will overwrite data
+        default:
+        }
+    }
+
+    public Object[] writeArguments(long i)
+    {
+        return new Object[] { i, i, i };
+    }
+
+    void doExtraChecks()
+    {
+        if (flush == WriteTest.EndOp.INMEM && !cfs.getLiveSSTables().isEmpty())
+            throw new AssertionError("SSTables created for INMEM test.");
+    }
+
+    String extraInfo()
+    {
+        return " flush " + flush;
+    }
+}
diff --git a/test/resources/data/config/YamlConfigurationLoaderTest/shared_client_error_reporting_exclusions.yaml b/test/resources/data/config/YamlConfigurationLoaderTest/shared_client_error_reporting_exclusions.yaml
new file mode 100644
index 0000000..7fcb720
--- /dev/null
+++ b/test/resources/data/config/YamlConfigurationLoaderTest/shared_client_error_reporting_exclusions.yaml
@@ -0,0 +1,6 @@
+# This is used to test to validate that YAML Anchors ARE supported; this is useful for cases where client/internode errors are coming from the same sources (such as security scans)
+client_error_reporting_exclusions: &share
+  subnets:
+    - 127.0.0.1
+    - 127.0.0.0/31
+internode_error_reporting_exclusions: *share
\ No newline at end of file
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/ChanceSupplier.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/ChanceSupplier.java
new file mode 100644
index 0000000..620f3e0
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/ChanceSupplier.java
@@ -0,0 +1,24 @@
+/*
+ * 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.simulator.asm;
+
+public interface ChanceSupplier
+{
+    float get();
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/ClassTransformer.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/ClassTransformer.java
new file mode 100644
index 0000000..6e6b0d3
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/ClassTransformer.java
@@ -0,0 +1,279 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.EnumSet;
+import java.util.List;
+import java.util.function.Consumer;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.AbstractInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.simulator.asm.Flag.DETERMINISTIC;
+import static org.apache.cassandra.simulator.asm.Flag.GLOBAL_METHODS;
+import static org.apache.cassandra.simulator.asm.Flag.MONITORS;
+import static org.apache.cassandra.simulator.asm.Flag.NEMESIS;
+import static org.apache.cassandra.simulator.asm.Flag.NO_PROXY_METHODS;
+import static org.apache.cassandra.simulator.asm.TransformationKind.HASHCODE;
+import static org.apache.cassandra.simulator.asm.TransformationKind.SYNCHRONIZED;
+import static org.apache.cassandra.simulator.asm.Utils.deterministicToString;
+import static org.apache.cassandra.simulator.asm.Utils.visitEachRefType;
+import static org.apache.cassandra.simulator.asm.Utils.generateTryFinallyProxyCall;
+import static org.objectweb.asm.Opcodes.ACC_PRIVATE;
+import static org.objectweb.asm.Opcodes.ACC_STATIC;
+import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+
+class ClassTransformer extends ClassVisitor implements MethodWriterSink
+{
+    private static final List<AbstractInsnNode> DETERMINISM_SETUP = singletonList(new MethodInsnNode(INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptibleThread", "enterDeterministicMethod", "()V", false));
+    private static final List<AbstractInsnNode> DETERMINISM_CLEANUP = singletonList(new MethodInsnNode(INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptibleThread", "exitDeterministicMethod", "()V", false));
+
+    class DependentTypeVisitor extends MethodVisitor
+    {
+        public DependentTypeVisitor(int api, MethodVisitor methodVisitor)
+        {
+            super(api, methodVisitor);
+        }
+
+        @Override
+        public void visitTypeInsn(int opcode, String type)
+        {
+            super.visitTypeInsn(opcode, type);
+            Utils.visitIfRefType(type, dependentTypes);
+        }
+
+        @Override
+        public void visitFieldInsn(int opcode, String owner, String name, String descriptor)
+        {
+            super.visitFieldInsn(opcode, owner, name, descriptor);
+            Utils.visitIfRefType(descriptor, dependentTypes);
+        }
+
+        @Override
+        public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)
+        {
+            super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+            Utils.visitEachRefType(descriptor, dependentTypes);
+        }
+
+        @Override
+        public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments)
+        {
+            super.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
+            Utils.visitEachRefType(descriptor, dependentTypes);
+        }
+
+        @Override
+        public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index)
+        {
+            super.visitLocalVariable(name, descriptor, signature, start, end, index);
+            Utils.visitIfRefType(descriptor, dependentTypes);
+        }
+    }
+
+    private final String className;
+    private final ChanceSupplier monitorDelayChance;
+    private final NemesisGenerator nemesis;
+    private final NemesisFieldKind.Selector nemesisFieldSelector;
+    private final Hashcode insertHashcode;
+    private final MethodLogger methodLogger;
+    private boolean isTransformed;
+    private boolean isCacheablyTransformed = true;
+    private final EnumSet<Flag> flags;
+    private final Consumer<String> dependentTypes;
+
+    ClassTransformer(int api, String className, EnumSet<Flag> flags, Consumer<String> dependentTypes)
+    {
+        this(api, new ClassWriter(0), className, flags, null, null, null, null, dependentTypes);
+    }
+
+    ClassTransformer(int api, String className, EnumSet<Flag> flags, ChanceSupplier monitorDelayChance, NemesisGenerator nemesis, NemesisFieldKind.Selector nemesisFieldSelector, Hashcode insertHashcode, Consumer<String> dependentTypes)
+    {
+        this(api, new ClassWriter(0), className, flags, monitorDelayChance, nemesis, nemesisFieldSelector, insertHashcode, dependentTypes);
+    }
+
+    private ClassTransformer(int api, ClassWriter classWriter, String className, EnumSet<Flag> flags, ChanceSupplier monitorDelayChance, NemesisGenerator nemesis, NemesisFieldKind.Selector nemesisFieldSelector, Hashcode insertHashcode, Consumer<String> dependentTypes)
+    {
+        super(api, classWriter);
+        if (flags.contains(NEMESIS) && (nemesis == null || nemesisFieldSelector == null))
+            throw new IllegalArgumentException();
+        if (flags.contains(MONITORS) && monitorDelayChance == null)
+            throw new IllegalArgumentException();
+        this.dependentTypes = dependentTypes;
+        this.className = className;
+        this.flags = flags;
+        this.monitorDelayChance = monitorDelayChance;
+        this.nemesis = nemesis;
+        this.nemesisFieldSelector = nemesisFieldSelector;
+        this.insertHashcode = insertHashcode;
+        this.methodLogger = MethodLogger.log(api, className);
+    }
+
+    @Override
+    public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value)
+    {
+        if (dependentTypes != null)
+            Utils.visitIfRefType(descriptor, dependentTypes);
+        return super.visitField(access, name, descriptor, signature, value);
+    }
+
+    @Override
+    public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions)
+    {
+        if (dependentTypes != null)
+            visitEachRefType(descriptor, dependentTypes);
+
+        EnumSet<Flag> flags = this.flags;
+        if (flags.isEmpty() || ((access & ACC_SYNTHETIC) != 0 && (name.endsWith("$unsync") || name.endsWith("$catch") || name.endsWith("$nemesis"))))
+        {
+            MethodVisitor visitor = super.visitMethod(access, name, descriptor, signature, exceptions);
+            if (dependentTypes != null && (access & (ACC_STATIC | ACC_SYNTHETIC)) != 0 && (name.equals("<clinit>") || name.startsWith("lambda$")))
+                visitor = new DependentTypeVisitor(api, visitor);
+            return visitor;
+        }
+
+        boolean isToString = false;
+        if (access == Opcodes.ACC_PUBLIC && name.equals("toString") && descriptor.equals("()Ljava/lang/String;") && !flags.contains(NO_PROXY_METHODS))
+        {
+            generateTryFinallyProxyCall(super.visitMethod(access, name, descriptor, signature, exceptions), className,
+                                        "toString$original", "()Ljava/lang/String;", access, true, false, DETERMINISM_SETUP, DETERMINISM_CLEANUP);
+            access = ACC_PRIVATE | ACC_SYNTHETIC;
+            name = "toString$original";
+            if (!flags.contains(DETERMINISTIC) || flags.contains(NEMESIS))
+            {
+                flags = EnumSet.copyOf(flags);
+                flags.add(DETERMINISTIC);
+                flags.remove(NEMESIS);
+            }
+            isToString = true;
+        }
+
+        MethodVisitor visitor;
+        if (flags.contains(MONITORS) && (access & Opcodes.ACC_SYNCHRONIZED) != 0)
+        {
+            visitor = new MonitorMethodTransformer(this, className, api, access, name, descriptor, signature, exceptions, monitorDelayChance);
+            witness(SYNCHRONIZED);
+        }
+        else
+        {
+            visitor = super.visitMethod(access, name, descriptor, signature, exceptions);
+            visitor = methodLogger.visitMethod(access, name, descriptor, visitor);
+        }
+
+        if (flags.contains(MONITORS))
+            visitor = new MonitorEnterExitParkTransformer(this, api, visitor, className, monitorDelayChance);
+        if (isToString)
+            visitor = deterministicToString(visitor);
+        if (flags.contains(GLOBAL_METHODS) || flags.contains(Flag.LOCK_SUPPORT) || flags.contains(Flag.DETERMINISTIC))
+            visitor = new GlobalMethodTransformer(flags, this, api, name, visitor);
+        if (flags.contains(NEMESIS))
+            visitor = new NemesisTransformer(this, api, name, visitor, nemesis, nemesisFieldSelector);
+        if (dependentTypes != null && (access & (ACC_STATIC | ACC_SYNTHETIC)) != 0 && (name.equals("<clinit>") || name.startsWith("lambda$")))
+            visitor = new DependentTypeVisitor(api, visitor);
+        return visitor;
+    }
+
+    @Override
+    public void visitEnd()
+    {
+        if (insertHashcode != null)
+            writeSyntheticMethod(HASHCODE, insertHashcode);
+        super.visitEnd();
+        methodLogger.visitEndOfClass();
+    }
+
+    public void writeMethod(MethodNode node)
+    {
+        writeMethod(null, node);
+    }
+
+    public void writeSyntheticMethod(TransformationKind kind, MethodNode node)
+    {
+        writeMethod(kind, node);
+    }
+
+    void writeMethod(TransformationKind kind, MethodNode node)
+    {
+        String[] exceptions = node.exceptions == null ? null : node.exceptions.toArray(new String[0]);
+        MethodVisitor visitor = super.visitMethod(node.access, node.name, node.desc, node.signature, exceptions);
+        visitor = methodLogger.visitMethod(node.access, node.name, node.desc, visitor);
+        if (kind != null)
+            witness(kind);
+        node.accept(visitor);
+    }
+
+    @Override
+    public AnnotationVisitor visitAnnotation(String descriptor, boolean visible)
+    {
+        return Utils.checkForSimulationAnnotations(api, descriptor, super.visitAnnotation(descriptor, visible), (flag, add) -> {
+            if (add) flags.add(flag);
+            else flags.remove(flag);
+        });
+    }
+
+    void readAndTransform(byte[] input)
+    {
+        ClassReader reader = new ClassReader(input);
+        reader.accept(this, 0);
+    }
+
+    void witness(TransformationKind kind)
+    {
+        isTransformed = true;
+        switch (kind)
+        {
+            case FIELD_NEMESIS:
+            case SIGNAL_NEMESIS:
+                isCacheablyTransformed = false;
+        }
+        methodLogger.witness(kind);
+    }
+
+    String className()
+    {
+        return className;
+    }
+
+    boolean isTransformed()
+    {
+        return isTransformed;
+    }
+
+    boolean isCacheablyTransformed()
+    {
+        return isCacheablyTransformed;
+    }
+
+    byte[] toBytes()
+    {
+        return ((ClassWriter) cv).toByteArray();
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/Flag.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/Flag.java
new file mode 100644
index 0000000..d127064
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/Flag.java
@@ -0,0 +1,24 @@
+/*
+ * 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.simulator.asm;
+
+public enum Flag
+{
+    GLOBAL_CLOCK, SYSTEM_CLOCK, MONITORS, LOCK_SUPPORT, GLOBAL_METHODS, DETERMINISTIC, NO_PROXY_METHODS, NEMESIS
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/GlobalMethodTransformer.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/GlobalMethodTransformer.java
new file mode 100644
index 0000000..fbea223
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/GlobalMethodTransformer.java
@@ -0,0 +1,164 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.EnumSet;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+import static org.apache.cassandra.simulator.asm.Flag.GLOBAL_METHODS;
+import static org.apache.cassandra.simulator.asm.TransformationKind.CONCURRENT_HASH_MAP;
+import static org.apache.cassandra.simulator.asm.TransformationKind.GLOBAL_METHOD;
+import static org.apache.cassandra.simulator.asm.TransformationKind.IDENTITY_HASH_MAP;
+
+/**
+ * Intercept factory methods in org.apache.concurrent.utils.concurrent, and redirect them to
+ * {@link org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods}
+ */
+class GlobalMethodTransformer extends MethodVisitor
+{
+    private final ClassTransformer transformer;
+    private final String methodName;
+    private boolean globalMethods;
+    private boolean globalClock;
+    private boolean systemClock;
+    private boolean lockSupport;
+    private boolean deterministic;
+    boolean hasSeenAnyMethodInsn;
+
+    public GlobalMethodTransformer(EnumSet<Flag> flags, ClassTransformer transformer, int api, String methodName, MethodVisitor parent)
+    {
+        super(api, parent);
+        this.globalMethods = flags.contains(GLOBAL_METHODS);
+        this.globalClock = flags.contains(Flag.GLOBAL_CLOCK);
+        this.systemClock = flags.contains(Flag.SYSTEM_CLOCK);
+        this.lockSupport = flags.contains(Flag.LOCK_SUPPORT);
+        this.deterministic = flags.contains(Flag.DETERMINISTIC);
+        this.transformer = transformer;
+        this.methodName = methodName;
+    }
+
+    @Override
+    public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)
+    {
+        boolean isFirstMethodInsn = !hasSeenAnyMethodInsn;
+        hasSeenAnyMethodInsn = true;
+
+        if (globalMethods && opcode == Opcodes.INVOKESTATIC && owner.startsWith("org/apache/cassandra/utils/") && (
+               (owner.equals("org/apache/cassandra/utils/concurrent/WaitQueue") && name.equals("newWaitQueue"))
+            || (owner.equals("org/apache/cassandra/utils/concurrent/CountDownLatch") && name.equals("newCountDownLatch"))
+            || (owner.equals("org/apache/cassandra/utils/concurrent/Condition") && name.equals("newOneTimeCondition"))
+            || (owner.equals("org/apache/cassandra/utils/concurrent/BlockingQueues") && name.equals("newBlockingQueue"))
+            || (owner.equals("org/apache/cassandra/utils/concurrent/Semaphore") && (name.equals("newSemaphore") || name.equals("newFairSemaphore")))
+            ))
+        {
+            transformer.witness(GLOBAL_METHOD);
+            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfGlobalMethods$Global", name, descriptor, false);
+        }
+        else if (globalMethods && ((opcode == Opcodes.INVOKESTATIC && (
+                   owner.startsWith("org/apache/cassandra/utils/") && (
+                        (owner.equals("org/apache/cassandra/utils/Clock") && name.equals("waitUntil"))
+                     || (owner.equals("org/apache/cassandra/utils/concurrent/Awaitable$SyncAwaitable") && name.equals("waitUntil")))
+                || !deterministic && owner.equals("java/lang/System") && name.equals("identityHashCode")
+                || owner.equals("java/util/UUID") && name.equals("randomUUID")
+                || owner.equals("com/google/common/util/concurrent/Uninterruptibles") && name.equals("sleepUninterruptibly")
+                || owner.equals("sun/misc/Unsafe") && name.equals("getUnsafe")))
+             || (owner.equals("java/util/concurrent/TimeUnit") && name.equals("sleep")))
+        )
+        {
+            transformer.witness(GLOBAL_METHOD);
+            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", name, descriptor, false);
+        }
+        else if ((globalMethods || deterministic) && opcode == Opcodes.INVOKESTATIC &&
+            owner.equals("java/util/concurrent/ThreadLocalRandom") && (name.equals("getProbe") || name.equals("advanceProbe") || name.equals("localInit"))
+        )
+        {
+            transformer.witness(GLOBAL_METHOD);
+            // if we're in deterministic mode (i.e. for base ConcurrentHashMap) don't initialise ThreadLocalRandom
+            if (name.equals("getProbe")) super.visitLdcInsn(0);
+            else if (name.equals("advanceProbe")) super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", name, descriptor, false);
+        }
+        else if (globalMethods && opcode == Opcodes.INVOKESPECIAL && owner.equals("java/util/IdentityHashMap") && name.equals("<init>"))
+        {
+            transformer.witness(IDENTITY_HASH_MAP);
+            super.visitMethodInsn(opcode, "org/apache/cassandra/simulator/systems/InterceptedIdentityHashMap", name, descriptor, false);
+        }
+        else if (globalMethods && opcode == Opcodes.INVOKESPECIAL && owner.equals("java/util/concurrent/ConcurrentHashMap") && name.equals("<init>")
+                 && !(transformer.className().equals("org/apache/cassandra/simulator/systems/InterceptibleConcurrentHashMap") && methodName.equals("<init>") && isFirstMethodInsn))
+        {
+            transformer.witness(CONCURRENT_HASH_MAP);
+            super.visitMethodInsn(opcode, "org/apache/cassandra/simulator/systems/InterceptibleConcurrentHashMap", name, descriptor, false);
+        }
+        else if (lockSupport && opcode == Opcodes.INVOKESTATIC && owner.equals("java/util/concurrent/locks/LockSupport") && (name.startsWith("park") || name.equals("unpark")))
+        {
+            transformer.witness(TransformationKind.LOCK_SUPPORT);
+            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", name, descriptor, false);
+        }
+        else if (globalClock && opcode == Opcodes.INVOKESTATIC && name.equals("timestampMicros") && owner.equals("org/apache/cassandra/utils/FBUtilities"))
+        {
+            transformer.witness(GLOBAL_METHOD);
+            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/SimulatedTime$Global", "nextGlobalMonotonicMicros", descriptor, false);
+        }
+        else if (systemClock && opcode == Opcodes.INVOKESTATIC && owner.equals("java/lang/System") && (name.equals("nanoTime") || name.equals("currentTimeMillis")))
+        {
+            transformer.witness(GLOBAL_METHOD);
+            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", name, descriptor, false);
+        }
+        else
+        {
+            super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+        }
+    }
+
+    @Override
+    public void visitTypeInsn(int opcode, String type)
+    {
+        if (globalMethods && opcode == Opcodes.NEW && type.equals("java/util/IdentityHashMap"))
+        {
+            super.visitTypeInsn(opcode, "org/apache/cassandra/simulator/systems/InterceptedIdentityHashMap");
+        }
+        else if (globalMethods && opcode == Opcodes.NEW && type.equals("java/util/concurrent/ConcurrentHashMap"))
+        {
+            super.visitTypeInsn(opcode, "org/apache/cassandra/simulator/systems/InterceptibleConcurrentHashMap");
+        }
+        else
+        {
+            super.visitTypeInsn(opcode, type);
+        }
+    }
+
+    @Override
+    public AnnotationVisitor visitAnnotation(String descriptor, boolean visible)
+    {
+        return Utils.checkForSimulationAnnotations(api, descriptor, super.visitAnnotation(descriptor, visible), (flag, add) -> {
+            switch (flag)
+            {
+                default: throw new AssertionError();
+                case GLOBAL_METHODS: globalMethods = add; break;
+                case GLOBAL_CLOCK: globalClock = add; break;
+                case SYSTEM_CLOCK: systemClock = add; break;
+                case LOCK_SUPPORT: lockSupport = add; break;
+                case DETERMINISTIC: deterministic = add; break;
+                case MONITORS: throw new UnsupportedOperationException("Cannot currently toggle MONITORS at the method level");
+            }
+        });
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/Hashcode.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/Hashcode.java
new file mode 100644
index 0000000..0377854
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/Hashcode.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.asm;
+
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.IntInsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Generate a new hashCode method in the class that invokes a deterministic hashCode generator
+ */
+class Hashcode extends MethodNode
+{
+    Hashcode(int api)
+    {
+        super(api, Opcodes.ACC_PUBLIC, "hashCode", "()I", null, null);
+        maxLocals = 1;
+        maxStack = 1;
+        instructions.add(new LabelNode());
+        instructions.add(new IntInsnNode(Opcodes.ALOAD, 0));
+        instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "identityHashCode", "(Ljava/lang/Object;)I", false));
+        instructions.add(new LabelNode());
+        instructions.add(new InsnNode(Opcodes.IRETURN));
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptAgent.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptAgent.java
new file mode 100644
index 0000000..87cfab0
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptAgent.java
@@ -0,0 +1,341 @@
+/*
+ * 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.simulator.asm;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.instrument.ClassDefinition;
+import java.lang.instrument.ClassFileTransformer;
+import java.lang.instrument.IllegalClassFormatException;
+import java.lang.instrument.Instrumentation;
+import java.lang.instrument.UnmodifiableClassException;
+import java.security.ProtectionDomain;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.EnumSet;
+import java.util.List;
+import java.util.function.BiFunction;
+import java.util.regex.Pattern;
+
+import org.objectweb.asm.ClassReader;
+import org.objectweb.asm.ClassVisitor;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+
+import static org.apache.cassandra.simulator.asm.Flag.DETERMINISTIC;
+import static org.apache.cassandra.simulator.asm.Flag.LOCK_SUPPORT;
+import static org.apache.cassandra.simulator.asm.Flag.NO_PROXY_METHODS;
+import static org.apache.cassandra.simulator.asm.Flag.SYSTEM_CLOCK;
+import static org.apache.cassandra.simulator.asm.InterceptClasses.BYTECODE_VERSION;
+import static org.objectweb.asm.Opcodes.ALOAD;
+import static org.objectweb.asm.Opcodes.GETFIELD;
+import static org.objectweb.asm.Opcodes.GETSTATIC;
+import static org.objectweb.asm.Opcodes.INVOKESPECIAL;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+import static org.objectweb.asm.Opcodes.INVOKEVIRTUAL;
+import static org.objectweb.asm.Opcodes.IRETURN;
+import static org.objectweb.asm.Opcodes.RETURN;
+
+/**
+ * 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
+ * weave LockSupport or the internals of other blocking concurrency primitives.
+ *
+ * Ultimately this wasn't necessary for the initial functionality, but we have maintained
+ * the layout so that it will be easier to enable such functionality in future should it be needed.
+ *
+ * To this end, the asm package and simulator-asm.jar is as self-contained set of classes for performing
+ * simulator byteweaving, and simulator-bootstrap.jar contains a self-contained class and interface for
+ * replacing important system methods.
+ */
+public class InterceptAgent
+{
+    public static void premain(final String agentArgs, final Instrumentation instrumentation) throws UnmodifiableClassException, ClassNotFoundException, IOException
+    {
+        setup(agentArgs, instrumentation);
+    }
+
+    public void agentmain(final String agentArgs, final Instrumentation instrumentation) throws UnmodifiableClassException, ClassNotFoundException, IOException
+    {
+        setup(agentArgs, instrumentation);
+    }
+
+    private static void setup(final String agentArgs, final Instrumentation instrumentation) throws UnmodifiableClassException, ClassNotFoundException, IOException
+    {
+        instrumentation.addTransformer(new ClassFileTransformer()
+        {
+            @Override
+            public byte[] transform(ClassLoader loader, String className, Class<?> classBeingRedefined, ProtectionDomain protectionDomain, byte[] bytecode) throws IllegalClassFormatException
+            {
+                if (className == null)
+                    return null;
+
+                if (className.equals("java/lang/Object"))
+                    return transformObject(bytecode);
+
+                if (className.equals("java/lang/Enum"))
+                    return transformEnum(bytecode);
+
+                if (className.equals("java/util/Random"))
+                    return transformRandom(bytecode);
+
+                if (className.equals("java/util/concurrent/ThreadLocalRandom"))
+                    return transformThreadLocalRandom(bytecode);
+
+                if (className.startsWith("java/util/concurrent/ConcurrentHashMap"))
+                    return transformConcurrent(className, bytecode, DETERMINISTIC, NO_PROXY_METHODS);
+
+                if (className.startsWith("java/util/concurrent/locks"))
+                    return transformConcurrent(className, bytecode, SYSTEM_CLOCK, LOCK_SUPPORT, NO_PROXY_METHODS);
+
+                return null;
+            }
+        });
+
+        Pattern reloadPattern = Pattern.compile("java\\.(lang\\.Enum|util\\.concurrent\\.(locks\\..*|ConcurrentHashMap)|util\\.(concurrent\\.ThreadLocal)?Random|lang\\.Object)");
+        List<ClassDefinition> redefine = new ArrayList<>();
+        for (Class<?> loadedClass : instrumentation.getAllLoadedClasses())
+        {
+            if (reloadPattern.matcher(loadedClass.getName()).matches())
+                redefine.add(new ClassDefinition(loadedClass, readDefinition(loadedClass)));
+        }
+        if (!redefine.isEmpty())
+            instrumentation.redefineClasses(redefine.toArray(new ClassDefinition[0]));
+    }
+
+    private static byte[] readDefinition(Class<?> clazz) throws IOException
+    {
+        return readDefinition(clazz.getName().replaceAll("\\.", "/"));
+    }
+
+    private static byte[] readDefinition(String className) throws IOException
+    {
+        byte[] bytes = new byte[1024];
+        try (InputStream in = ClassLoader.getSystemResourceAsStream(className + ".class"))
+        {
+            int count = 0;
+            while (true)
+            {
+                int add = in.read(bytes, count, bytes.length - count);
+                if (add < 0)
+                    break;
+                if (add == 0)
+                    bytes = Arrays.copyOf(bytes, bytes.length * 2);
+                count += add;
+            }
+            return Arrays.copyOf(bytes, count);
+        }
+    }
+
+    /**
+     * We don't want Object.toString() to invoke our overridden identityHashCode by virtue of invoking some overridden hashCode()
+     * So we overwrite Object.toString() to replace calls to Object.hashCode() with direct calls to System.identityHashCode()
+     */
+    private static byte[] transformObject(byte[] bytes)
+    {
+        class ObjectVisitor extends ClassVisitor
+        {
+            public ObjectVisitor(int api, ClassVisitor classVisitor)
+            {
+                super(api, classVisitor);
+            }
+
+            @Override
+            public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions)
+            {
+                if (descriptor.equals("()Ljava/lang/String;") && name.equals("toString"))
+                    return Utils.deterministicToString(super.visitMethod(access, name, descriptor, signature, exceptions));
+                else
+                    return super.visitMethod(access, name, descriptor, signature, exceptions);
+            }
+        }
+        return transform(bytes, ObjectVisitor::new);
+    }
+
+    /**
+     * We want Enum to have a deterministic hashCode() so we simply forward calls to ordinal()
+     */
+    private static byte[] transformEnum(byte[] bytes)
+    {
+        class EnumVisitor extends ClassVisitor
+        {
+            public EnumVisitor(int api, ClassVisitor classVisitor)
+            {
+                super(api, classVisitor);
+            }
+
+            @Override
+            public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions)
+            {
+                if (descriptor.equals("()I") && name.equals("hashCode"))
+                {
+                    MethodVisitor visitor = super.visitMethod(access, name, descriptor, signature, exceptions);
+                    visitor.visitLabel(new Label());
+                    visitor.visitIntInsn(ALOAD, 0);
+                    visitor.visitFieldInsn(GETFIELD, "java/lang/Enum", "ordinal", "I");
+                    visitor.visitInsn(IRETURN);
+                    visitor.visitLabel(new Label());
+                    visitor.visitMaxs(1, 1);
+                    visitor.visitEnd();
+
+                    return new MethodVisitor(BYTECODE_VERSION) {};
+                }
+                else
+                {
+                    return super.visitMethod(access, name, descriptor, signature, exceptions);
+                }
+            }
+        }
+        return transform(bytes, EnumVisitor::new);
+    }
+
+    /**
+     * We want Random to be initialised deterministically, so we modify the default constructor to fetch
+     * some deterministically generated seed to pass to its seed constructor
+     */
+    private static byte[] transformRandom(byte[] bytes)
+    {
+        class RandomVisitor extends ClassVisitor
+        {
+            public RandomVisitor(int api, ClassVisitor classVisitor)
+            {
+                super(api, classVisitor);
+            }
+
+            @Override
+            public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions)
+            {
+                if (descriptor.equals("()V") && name.equals("<init>"))
+                {
+                    MethodVisitor visitor = super.visitMethod(access, name, descriptor, signature, exceptions);
+                    visitor.visitLabel(new Label());
+                    visitor.visitIntInsn(ALOAD, 0);
+                    visitor.visitMethodInsn(INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "randomSeed", "()J", false);
+                    visitor.visitMethodInsn(INVOKESPECIAL, "java/util/Random", "<init>", "(J)V", false);
+                    visitor.visitInsn(RETURN);
+                    visitor.visitLabel(new Label());
+                    visitor.visitMaxs(3, 1);
+                    visitor.visitEnd();
+
+                    return new MethodVisitor(BYTECODE_VERSION) {};
+                }
+                else
+                {
+                    return super.visitMethod(access, name, descriptor, signature, exceptions);
+                }
+            }
+        }
+        return transform(bytes, RandomVisitor::new);
+    }
+
+    /**
+     * We require ThreadLocalRandom to be deterministic, so we modify its initialisation method to invoke a
+     * global deterministic random value generator
+     */
+    private static byte[] transformThreadLocalRandom(byte[] bytes)
+    {
+        class ThreadLocalRandomVisitor extends ClassVisitor
+        {
+            // CassandraRelevantProperties is not available to us here
+            final boolean determinismCheck = System.getProperty("cassandra.test.simulator.determinismcheck", "none").matches("relaxed|strict");
+
+            public ThreadLocalRandomVisitor(int api, ClassVisitor classVisitor)
+            {
+                super(api, classVisitor);
+            }
+
+            String unsafeDescriptor;
+            String unsafeFieldName;
+
+            @Override
+            public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value)
+            {
+                if (descriptor.equals("Lsun/misc/Unsafe;") || descriptor.equals("Ljdk/internal/misc/Unsafe;"))
+                {
+                    unsafeFieldName = name;
+                    unsafeDescriptor = descriptor;
+                }
+                return super.visitField(access, name, descriptor, signature, value);
+            }
+
+            @Override
+            public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions)
+            {
+                if (descriptor.equals("()V") && name.equals("localInit"))
+                {
+                    if (unsafeFieldName == null)
+                    {
+                        String version = System.getProperty("java.version");
+                        if (version.startsWith("11.")) { unsafeFieldName = "U"; unsafeDescriptor = "Ljdk/internal/misc/Unsafe;"; }
+                        else if (version.startsWith("1.8")) { unsafeFieldName = "UNSAFE"; unsafeDescriptor = "Lsun/misc/Unsafe;"; }
+                        else throw new AssertionError("Unsupported Java Version");
+                    }
+
+                    MethodVisitor visitor = super.visitMethod(access, name, descriptor, signature, exceptions);
+                    visitor.visitLabel(new Label());
+                    visitor.visitIntInsn(ALOAD, 0);
+                    visitor.visitFieldInsn(GETSTATIC, "java/util/concurrent/ThreadLocalRandom", unsafeFieldName, unsafeDescriptor);
+                    visitor.visitMethodInsn(INVOKESTATIC, "java/lang/Thread", "currentThread", "()Ljava/lang/Thread;", false);
+                    visitor.visitFieldInsn(GETSTATIC, "java/util/concurrent/ThreadLocalRandom", "SEED", "J");
+                    visitor.visitMethodInsn(INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "randomSeed", "()J", false);
+                    visitor.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putLong", "(Ljava/lang/Object;JJ)V", false);
+                    visitor.visitFieldInsn(GETSTATIC, "java/util/concurrent/ThreadLocalRandom", unsafeFieldName, unsafeDescriptor);
+                    visitor.visitMethodInsn(INVOKESTATIC, "java/lang/Thread", "currentThread", "()Ljava/lang/Thread;", false);
+                    visitor.visitFieldInsn(GETSTATIC, "java/util/concurrent/ThreadLocalRandom", "PROBE", "J");
+                    visitor.visitLdcInsn(0);
+                    visitor.visitMethodInsn(INVOKEVIRTUAL, "sun/misc/Unsafe", "putInt", "(Ljava/lang/Object;JI)V", false);
+                    visitor.visitInsn(RETURN);
+                    visitor.visitLabel(new Label());
+                    visitor.visitMaxs(6, 1);
+                    visitor.visitEnd();
+
+                    return new MethodVisitor(BYTECODE_VERSION) {};
+                }
+                else
+                {
+                    MethodVisitor mv = super.visitMethod(access, name, descriptor, signature, exceptions);
+                    if (determinismCheck && (name.equals("nextSeed") || name.equals("nextSecondarySeed")))
+                        mv = new ThreadLocalRandomCheckTransformer(api, mv);
+                    return mv;
+                }
+            }
+        }
+        return transform(bytes, ThreadLocalRandomVisitor::new);
+    }
+
+    private static byte[] transform(byte[] bytes, BiFunction<Integer, ClassWriter, ClassVisitor> constructor)
+    {
+        ClassWriter out = new ClassWriter(0);
+        ClassReader in = new ClassReader(bytes);
+        ClassVisitor transform = constructor.apply(BYTECODE_VERSION, out);
+        in.accept(transform, 0);
+        return out.toByteArray();
+    }
+
+    private static byte[] transformConcurrent(String className, byte[] bytes, Flag flag, Flag ... flags)
+    {
+        ClassTransformer transformer = new ClassTransformer(BYTECODE_VERSION, className, EnumSet.of(flag, flags), null);
+        transformer.readAndTransform(bytes);
+        if (!transformer.isTransformed())
+            return null;
+        return transformer.toBytes();
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptClasses.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptClasses.java
new file mode 100644
index 0000000..a57074d
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/InterceptClasses.java
@@ -0,0 +1,387 @@
+/*
+ * 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.simulator.asm;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.Serializable;
+import java.io.UncheckedIOException;
+import java.lang.reflect.Method;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.NavigableSet;
+import java.util.Set;
+import java.util.TreeSet;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+import java.util.regex.Pattern;
+
+import org.objectweb.asm.Opcodes;
+
+import static org.apache.cassandra.simulator.asm.InterceptClasses.Cached.Kind.MODIFIED;
+import static org.apache.cassandra.simulator.asm.InterceptClasses.Cached.Kind.UNMODIFIED;
+import static org.apache.cassandra.simulator.asm.InterceptClasses.Cached.Kind.UNSHAREABLE;
+
+// TODO (completeness): confirm that those classes we weave monitor-access for only extend other classes we also weave monitor access for
+// TODO (completeness): confirm that those classes we weave monitor access for only take monitors on types we also weave monitor access for (and vice versa)
+// WARNING: does not implement IClassTransformer directly as must be accessible to bootstrap class loader
+public class InterceptClasses implements BiFunction<String, byte[], byte[]>
+{
+    public static final int BYTECODE_VERSION = Opcodes.ASM7;
+
+    // TODO (cleanup): use annotations
+    private static final Pattern MONITORS = Pattern.compile( "org[/.]apache[/.]cassandra[/.]utils[/.]concurrent[/.].*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]concurrent[/.].*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]simulator[/.]test.*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]db[/.]ColumnFamilyStore.*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]db[/.]Keyspace.*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]db[/.]SystemKeyspace.*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]streaming[/.].*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]db.streaming[/.].*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]distributed[/.]impl[/.]DirectStreamingConnectionFactory.*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]db[/.]commitlog[/.].*" +
+                                                            "|org[/.]apache[/.]cassandra[/.]service[/.]paxos[/.].*");
+
+    private static final Pattern GLOBAL_METHODS = Pattern.compile("org[/.]apache[/.]cassandra[/.](?!simulator[/.]).*" +
+                                                                  "|org[/.]apache[/.]cassandra[/.]simulator[/.]test[/.].*" +
+                                                                  "|org[/.]apache[/.]cassandra[/.]simulator[/.]cluster[/.].*" +
+                                                                  "|io[/.]netty[/.]util[/.]concurrent[/.]FastThreadLocal"); // intercept IdentityHashMap for execution consistency
+    private static final Pattern NEMESIS = GLOBAL_METHODS;
+    private static final Set<String> WARNED = Collections.newSetFromMap(new ConcurrentHashMap<>());
+
+    static final byte[] SENTINEL = new byte[0];
+    static class Cached
+    {
+        enum Kind { MODIFIED, UNMODIFIED, UNSHAREABLE }
+        final Kind kind;
+        final byte[] bytes;
+        final Set<String> uncacheablePeers;
+        private Cached(Kind kind, byte[] bytes, Set<String> uncacheablePeers)
+        {
+            this.kind = kind;
+            this.bytes = bytes;
+            this.uncacheablePeers = uncacheablePeers;
+        }
+    }
+
+    static class PeerGroup
+    {
+        final Set<String> uncacheablePeers = new TreeSet<>();
+        final Cached unmodified = new Cached(UNMODIFIED, null, uncacheablePeers);
+    }
+
+    class SubTransformer implements BiFunction<String, byte[], byte[]>
+    {
+        private final Map<String, byte[]> isolatedCache = new ConcurrentHashMap<>();
+
+        @Override
+        public byte[] apply(String name, byte[] bytes)
+        {
+            return transformTransitiveClosure(name, bytes, isolatedCache);
+        }
+    }
+
+    private final Map<String, Cached> cache = new ConcurrentHashMap<>();
+
+    private final int api;
+    private final ChanceSupplier nemesisChance;
+    private final ChanceSupplier monitorDelayChance;
+    private final Hashcode insertHashcode;
+    private final NemesisFieldKind.Selector nemesisFieldSelector;
+    private final ClassLoader prewarmClassLoader;
+    private final Predicate<String> prewarm;
+    private final byte[] bufIn = new byte[4096];
+    private final ByteArrayOutputStream bufOut = new ByteArrayOutputStream();
+
+    public InterceptClasses(ChanceSupplier monitorDelayChance, ChanceSupplier nemesisChance, NemesisFieldKind.Selector nemesisFieldSelector, ClassLoader prewarmClassLoader, Predicate<String> prewarm)
+    {
+        this(BYTECODE_VERSION, monitorDelayChance, nemesisChance, nemesisFieldSelector, prewarmClassLoader, prewarm);
+    }
+
+    public InterceptClasses(int api, ChanceSupplier monitorDelayChance, ChanceSupplier nemesisChance, NemesisFieldKind.Selector nemesisFieldSelector, ClassLoader prewarmClassLoader, Predicate<String> prewarm)
+    {
+        this.api = api;
+        this.nemesisChance = nemesisChance;
+        this.monitorDelayChance = monitorDelayChance;
+        this.insertHashcode = new Hashcode(api);
+        this.nemesisFieldSelector = nemesisFieldSelector;
+        this.prewarmClassLoader = prewarmClassLoader;
+        this.prewarm = prewarm;
+    }
+
+    @Override
+    public byte[] apply(String name, byte[] bytes)
+    {
+        return transformTransitiveClosure(name, bytes, null);
+    }
+
+    private synchronized byte[] transformTransitiveClosure(String externalName, byte[] input, Map<String, byte[]> isolatedCache)
+    {
+        if (input == null)
+            return maybeSynthetic(externalName);
+
+        String internalName = dotsToSlashes(externalName);
+        if (isolatedCache != null)
+        {
+            byte[] isolatedCached = isolatedCache.get(internalName);
+            if (isolatedCached != null)
+                return isolatedCached == SENTINEL ? input : isolatedCached;
+        }
+
+        Cached cached = cache.get(internalName);
+        if (cached != null)
+        {
+            if (isolatedCache == null)
+            {
+                switch (cached.kind)
+                {
+                    default: throw new AssertionError();
+                    case MODIFIED:
+                        return cached.bytes;
+                    case UNMODIFIED:
+                        return input;
+                    case UNSHAREABLE:
+                        return transform(internalName, externalName, null, input, null, null);
+                }
+            }
+
+            for (String peer : cached.uncacheablePeers)
+                transform(peer, slashesToDots(peer), null, cache.get(peer).bytes, isolatedCache, null);
+
+            switch (cached.kind)
+            {
+                default: throw new AssertionError();
+                case MODIFIED:
+                    return cached.bytes;
+                case UNMODIFIED:
+                    return input;
+                case UNSHAREABLE:
+                    return isolatedCache.get(internalName);
+            }
+        }
+
+        Set<String> visited = new HashSet<>();
+        visited.add(internalName);
+        NavigableSet<String> load = new TreeSet<>();
+        Consumer<String> dependentTypeConsumer = type -> {
+            if (prewarm.test(type) && visited.add(type))
+                load.add(type);
+        };
+
+        final PeerGroup peerGroup = new PeerGroup();
+        byte[] result = transform(internalName, externalName, peerGroup, input, isolatedCache, dependentTypeConsumer);
+        for (String next = load.pollFirst(); next != null; next = load.pollFirst())
+        {
+            // TODO (now): otherwise merge peer groups
+            Cached existing = cache.get(next);
+            if (existing == null)
+                transform(next, slashesToDots(next), peerGroup, read(next), isolatedCache, dependentTypeConsumer);
+        }
+
+        return result;
+    }
+
+    private byte[] read(String name)
+    {
+        try (InputStream in = prewarmClassLoader.getResourceAsStream(dotsToSlashes(name) + ".class"))
+        {
+            if (in == null)
+                throw new NoClassDefFoundError(dotsToSlashes(name) + ".class");
+
+            bufOut.reset();
+            for (int c = in.read(bufIn) ; c >= 0 ; c = in.read(bufIn))
+                bufOut.write(bufIn, 0, c);
+            return bufOut.toByteArray();
+        }
+        catch (IOException e)
+        {
+            throw new NoClassDefFoundError(name);
+        }
+    }
+
+    private byte[] transform(String internalName, String externalName, PeerGroup peerGroup, byte[] input, Map<String, byte[]> isolatedCache, Consumer<String> dependentTypes)
+    {
+        Hashcode hashcode = insertHashCode(externalName);
+
+        EnumSet<Flag> flags = EnumSet.noneOf(Flag.class);
+        if (MONITORS.matcher(internalName).matches())
+        {
+            flags.add(Flag.MONITORS);
+        }
+        if (GLOBAL_METHODS.matcher(internalName).matches())
+        {
+            flags.add(Flag.GLOBAL_METHODS);
+            flags.add(Flag.LOCK_SUPPORT);
+        }
+        if (NEMESIS.matcher(internalName).matches())
+        {
+            flags.add(Flag.NEMESIS);
+        }
+
+        if (flags.isEmpty() && hashcode == null)
+        {
+            cache.put(internalName, peerGroup.unmodified);
+            return input;
+        }
+
+        ClassTransformer transformer = new ClassTransformer(api, internalName, flags, monitorDelayChance, new NemesisGenerator(api, internalName, nemesisChance), nemesisFieldSelector, hashcode, dependentTypes);
+        transformer.readAndTransform(input);
+
+        if (!transformer.isTransformed())
+        {
+            cache.put(internalName, peerGroup.unmodified);
+            return input;
+        }
+
+        byte[] output = transformer.toBytes();
+        if (transformer.isCacheablyTransformed())
+        {
+            cache.put(internalName, new Cached(MODIFIED, output, peerGroup.uncacheablePeers));
+        }
+        else
+        {
+            if (peerGroup != null)
+            {
+                cache.put(internalName, new Cached(UNSHAREABLE, input, peerGroup.uncacheablePeers));
+                peerGroup.uncacheablePeers.add(internalName);
+            }
+            if (isolatedCache != null)
+                isolatedCache.put(internalName, output);
+        }
+
+        return output;
+    }
+
+    static String dotsToSlashes(String className)
+    {
+        return className.replace('.', '/');
+    }
+
+    static String dotsToSlashes(Class<?> clazz)
+    {
+        return dotsToSlashes(clazz.getName());
+    }
+
+    static String slashesToDots(String className)
+    {
+        return className.replace('/', '.');
+    }
+
+    /**
+     * Decide if we should insert our own hashCode() implementation that assigns deterministic hashes, i.e.
+     *   - If it's one of our classes
+     *   - If its parent is not one of our classes (else we'll assign it one anyway)
+     *   - If it does not have its own hashCode() implementation that overrides Object's
+     *   - If it is not Serializable OR it has a serialVersionUID
+     *
+     * Otherwise we either probably do not need it, or may break serialization between classloaders
+     */
+    private Hashcode insertHashCode(String externalName)
+    {
+        try
+        {
+            if (!externalName.startsWith("org.apache.cassandra"))
+                return null;
+
+            Class<?> sharedClass = getClass().getClassLoader().loadClass(externalName);
+            if (sharedClass.isInterface() || sharedClass.isEnum() || sharedClass.isArray() || sharedClass.isSynthetic())
+                return null;
+
+            Class<?> parent = sharedClass.getSuperclass();
+            if (parent.getName().startsWith("org.apache.cassandra"))
+                return null;
+
+            try
+            {
+                Method method = sharedClass.getMethod("hashCode");
+                if (method.getDeclaringClass() != Object.class)
+                    return null;
+            }
+            catch (NoSuchMethodException ignore)
+            {
+            }
+
+            if (!Serializable.class.isAssignableFrom(sharedClass))
+                return insertHashcode;
+
+            try
+            {
+                // if we haven't specified serialVersionUID we break ObjectInputStream transfers between class loaders
+                // (might be easiest to switch to serialization that doesn't require it)
+                sharedClass.getDeclaredField("serialVersionUID");
+                return insertHashcode;
+            }
+            catch (NoSuchFieldException e)
+            {
+                if (!Throwable.class.isAssignableFrom(sharedClass) && WARNED.add(externalName))
+                    System.err.println("No serialVersionUID on Serializable " + sharedClass);
+                return null;
+            }
+        }
+        catch (ClassNotFoundException e)
+        {
+            System.err.println("Unable to determine if should insert hashCode() for " + externalName);
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+    static final String shadowRootExternalType = "org.apache.cassandra.simulator.systems.InterceptibleConcurrentHashMap";
+    static final String shadowRootType = "org/apache/cassandra/simulator/systems/InterceptibleConcurrentHashMap";
+    static final String originalRootType = Utils.toInternalName(ConcurrentHashMap.class);
+    static final String shadowOuterTypePrefix = shadowRootType + '$';
+    static final String originalOuterTypePrefix = originalRootType + '$';
+
+    protected byte[] maybeSynthetic(String externalName)
+    {
+        if (!externalName.startsWith(shadowRootExternalType))
+            return null;
+
+        try
+        {
+            String originalType, shadowType = Utils.toInternalName(externalName);
+            if (!shadowType.startsWith(shadowOuterTypePrefix))
+                originalType = originalRootType;
+            else
+                originalType = originalOuterTypePrefix + externalName.substring(shadowOuterTypePrefix.length());
+
+            EnumSet<Flag> flags = EnumSet.of(Flag.GLOBAL_METHODS, Flag.MONITORS, Flag.LOCK_SUPPORT);
+            if (NEMESIS.matcher(externalName).matches()) flags.add(Flag.NEMESIS);
+            NemesisGenerator nemesis = new NemesisGenerator(api, externalName, nemesisChance);
+
+            ShadowingTransformer transformer;
+            transformer = new ShadowingTransformer(InterceptClasses.BYTECODE_VERSION,
+                                                   originalType, shadowType, originalRootType, shadowRootType,
+                                                   originalOuterTypePrefix, shadowOuterTypePrefix,
+                                                   flags, monitorDelayChance, nemesis, nemesisFieldSelector, null);
+            transformer.readAndTransform(Utils.readDefinition(originalType + ".class"));
+            return transformer.toBytes();
+        }
+        catch (IOException e)
+        {
+            throw new UncheckedIOException(e);
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodLogger.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodLogger.java
new file mode 100644
index 0000000..1e6a844
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodLogger.java
@@ -0,0 +1,258 @@
+/*
+ * 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.simulator.asm;
+
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.regex.Pattern;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.util.Printer;
+import org.objectweb.asm.util.Textifier;
+import org.objectweb.asm.util.TraceMethodVisitor;
+
+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;
+
+// TODO (config): support logging only for packages/classes matching a pattern
+interface MethodLogger
+{
+    static final Level LOG = valueOf(System.getProperty("cassandra.test.simulator.print_asm", "none").toUpperCase());
+    static final Set<TransformationKind> KINDS = System.getProperty("cassandra.test.simulator.print_asm_opts", "").isEmpty()
+                                                 ? EnumSet.allOf(TransformationKind.class)
+                                                 : stream(System.getProperty("cassandra.test.simulator.print_asm_opts", "").split(","))
+                                                   .map(TransformationKind::valueOf)
+                                                   .collect(() -> EnumSet.noneOf(TransformationKind.class), Collection::add, Collection::addAll);
+    static final Pattern LOG_CLASSES = System.getProperty("cassandra.test.simulator.print_asm_classes", "").isEmpty()
+                                                 ? null
+                                                 : Pattern.compile(System.getProperty("cassandra.test.simulator.print_asm_classes", ""));
+
+    // debug the output of each class at most once
+    static final Set<String> LOGGED_CLASS = LOG != NONE ? Collections.newSetFromMap(new ConcurrentHashMap<>()) : null;
+
+    enum Level { NONE, CLASS_SUMMARY, CLASS_DETAIL, METHOD_SUMMARY, METHOD_DETAIL, ASM }
+
+    MethodVisitor visitMethod(int access, String name, String descriptor, MethodVisitor parent);
+    void witness(TransformationKind kind);
+    void visitEndOfClass();
+
+    static MethodLogger log(int api, String className)
+    {
+        switch (LOG)
+        {
+            default:
+            case NONE:
+                return None.INSTANCE;
+            case ASM:
+                return (LOG_CLASSES == null || LOG_CLASSES.matcher(className).matches()) && LOGGED_CLASS.add(className)
+                       ? new Printing(api, className) : None.INSTANCE;
+            case CLASS_DETAIL:
+            case CLASS_SUMMARY:
+            case METHOD_DETAIL:
+            case METHOD_SUMMARY:
+                return (LOG_CLASSES == null || LOG_CLASSES.matcher(className).matches()) && LOGGED_CLASS.add(className)
+                       ? new Counting(api, className, LOG) : None.INSTANCE;
+        }
+    }
+
+    static class None implements MethodLogger
+    {
+        static final None INSTANCE = new None();
+
+        @Override
+        public MethodVisitor visitMethod(int access, String name, String descriptor, MethodVisitor parent)
+        {
+            return parent;
+        }
+
+        @Override
+        public void witness(TransformationKind kind)
+        {
+        }
+
+        @Override
+        public void visitEndOfClass()
+        {
+        }
+    }
+
+    static class Counting implements MethodLogger
+    {
+        final int api;
+        final String className;
+        final Level level;
+        StringWriter buffer = new StringWriter();
+        PrintWriter out = new PrintWriter(buffer);
+
+        boolean isMethodInProgress;
+        boolean printMethod;
+        boolean printClass;
+
+        int methodCount;
+        final int[] methodCounts = new int[TransformationKind.VALUES.size()];
+        final int[] classCounts = new int[TransformationKind.VALUES.size()];
+
+        public Counting(int api, String className, Level level)
+        {
+            this.api = api;
+            this.className = className;
+            this.level = level;
+        }
+
+        @Override
+        public MethodVisitor visitMethod(int access, String name, String descriptor, MethodVisitor parent)
+        {
+            ++methodCount;
+            if (isMethodInProgress)
+                return parent;
+
+            return new MethodVisitor(api, parent) {
+                @Override
+                public void visitEnd()
+                {
+                    super.visitEnd();
+                    if (printMethod)
+                    {
+                        for (int i = 0 ; i < methodCounts.length ; ++i)
+                            classCounts[i] += methodCounts[i];
+
+                        switch (level)
+                        {
+                            case METHOD_DETAIL:
+                                out.printf("Transformed %s.%s %s\n", className, name, descriptor);
+                                for (int i = 0 ; i < methodCounts.length ; ++i)
+                                {
+                                    if (methodCounts[i] > 0)
+                                        out.printf("    %3d %s\n", methodCounts[i], TransformationKind.VALUES.get(i));
+                                }
+                                break;
+
+                            case METHOD_SUMMARY:
+                                out.printf("Transformed %s.%s %s with %d modifications\n", className, name, descriptor, stream(methodCounts).sum());
+                                break;
+                        }
+                        printMethod = false;
+                        Arrays.fill(methodCounts, 0);
+                    }
+                    isMethodInProgress = false;
+                }
+            };
+        }
+
+        public void visitEndOfClass()
+        {
+            if (!printClass)
+                return;
+
+            switch (level)
+            {
+                case CLASS_DETAIL:
+                    out.printf("Transformed %s: %d methods\n", className, methodCount);
+                    for (int i = 0 ; i < classCounts.length ; ++i)
+                    {
+                        if (classCounts[i] > 0)
+                            out.printf("    %3d %s\n", classCounts[i], TransformationKind.VALUES.get(i));
+                    }
+                case CLASS_SUMMARY:
+                    out.printf("Transformed %s: %d methods with %d modifications\n", className, methodCount, stream(classCounts).sum());
+            }
+            System.out.print(buffer.toString());
+            buffer = null;
+            out = null;
+        }
+
+        @Override
+        public void witness(TransformationKind kind)
+        {
+            ++methodCounts[kind.ordinal()];
+            if (KINDS.contains(kind))
+            {
+                printMethod = true;
+                printClass = true;
+            }
+        }
+    }
+
+    static class Printing implements MethodLogger
+    {
+        final int api;
+        final String className;
+        final Textifier textifier = new Textifier();
+        StringWriter buffer = new StringWriter();
+        PrintWriter out = new PrintWriter(buffer);
+
+        boolean printClass;
+        boolean printMethod;
+        boolean isMethodInProgress;
+
+        public Printing(int api, String className)
+        {
+            this.api = api;
+            this.className = className;
+        }
+
+        @Override
+        public MethodVisitor visitMethod(int access, String name, String descriptor, MethodVisitor parent)
+        {
+            Printer printer = textifier.visitMethod(access, name, descriptor, null, null);
+            boolean isOuter = !isMethodInProgress;
+            if (isOuter) isMethodInProgress = true;
+            return new TraceMethodVisitor(new MethodVisitor(api, parent) {
+                @Override
+                public void visitEnd()
+                {
+                    super.visitEnd();
+                    if (printMethod)
+                    {
+                        out.println("====" + className + '.' + name + ' ' + descriptor + ' ');
+                        printer.print(out);
+                    }
+                    if (isOuter) isMethodInProgress = false;
+                }
+            }, printer);
+        }
+
+        @Override
+        public void witness(TransformationKind kind)
+        {
+            if (KINDS.contains(kind))
+            {
+                printMethod = true;
+                printClass = true;
+            }
+        }
+
+        @Override
+        public void visitEndOfClass()
+        {
+            if (printClass)
+                System.out.println(buffer.toString());
+            buffer = null;
+            out = null;
+        }
+    }
+
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodWriterSink.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodWriterSink.java
new file mode 100644
index 0000000..a4b8a8d
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/MethodWriterSink.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.asm;
+
+import org.objectweb.asm.tree.MethodNode;
+
+public interface MethodWriterSink
+{
+
+    void writeMethod(MethodNode method);
+    void writeSyntheticMethod(TransformationKind kind, MethodNode method);
+
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/MonitorEnterExitParkTransformer.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/MonitorEnterExitParkTransformer.java
new file mode 100644
index 0000000..f92013e
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/MonitorEnterExitParkTransformer.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.asm;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+import static org.apache.cassandra.simulator.asm.TransformationKind.LOCK_SUPPORT;
+import static org.apache.cassandra.simulator.asm.TransformationKind.MONITOR;
+
+/**
+ * Handle simply thread signalling behaviours, namely monitorenter/monitorexit bytecodes to
+ * {@link org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods}, and LockSupport invocations to
+ * {@link org.apache.cassandra.simulator.systems.InterceptibleThread}.
+ *
+ * The global static methods we redirect monitors to take only one parameter (the monitor) and also return it,
+ * so that they have net zero effect on the stack, permitting the existing monitorenter/monitorexit instructions
+ * to remain where they are. LockSupport on the other hand is redirected entirely to the new method.
+ */
+class MonitorEnterExitParkTransformer extends MethodVisitor
+{
+    private final ClassTransformer transformer;
+    private final String className;
+    private final ChanceSupplier monitorDelayChance;
+
+    public MonitorEnterExitParkTransformer(ClassTransformer transformer,
+                                           int api,
+                                           MethodVisitor parent,
+                                           String className,
+                                           ChanceSupplier monitorDelayChance)
+    {
+        super(api, parent);
+        this.transformer = transformer;
+        this.className = className;
+        this.monitorDelayChance = monitorDelayChance;
+    }
+
+    @Override
+    public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)
+    {
+        if (opcode == Opcodes.INVOKEVIRTUAL && !isInterface && owner.equals("java/lang/Object"))
+        {
+            switch (name.charAt(0))
+            {
+                case 'w':
+                    assert name.equals("wait");
+                    switch (descriptor.charAt(2))
+                    {
+                        default:
+                            throw new AssertionError("Unexpected descriptor for method wait() in " + className + '.' + name);
+                        case 'V': // ()V
+                            transformer.witness(MONITOR);
+                            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "wait", "(Ljava/lang/Object;)V", false);
+                            return;
+                        case ')': // (J)V
+                            transformer.witness(MONITOR);
+                            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "wait", "(Ljava/lang/Object;J)V", false);
+                            return;
+                        case 'I': // (JI)V
+                            transformer.witness(MONITOR);
+                            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "wait", "(Ljava/lang/Object;JI)V", false);
+                            return;
+                    }
+                case 'n':
+                    switch (name.length())
+                    {
+                        default:
+                            throw new AssertionError();
+                        case 6: // notify
+                            transformer.witness(MONITOR);
+                            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "notify", "(Ljava/lang/Object;)V", false);
+                            return;
+
+                        case 9: // notifyAll
+                            transformer.witness(MONITOR);
+                            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "notifyAll", "(Ljava/lang/Object;)V", false);
+                            return;
+                    }
+            }
+        }
+        if (opcode == Opcodes.INVOKESTATIC && !isInterface && owner.equals("java/util/concurrent/locks/LockSupport"))
+        {
+            transformer.witness(LOCK_SUPPORT);
+            super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptibleThread", name, descriptor, false);
+            return;
+        }
+        super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+    }
+
+    @Override
+    public void visitInsn(int opcode)
+    {
+        switch (opcode)
+        {
+            case Opcodes.MONITORENTER:
+                transformer.witness(MONITOR);
+                super.visitLdcInsn(monitorDelayChance.get());
+                super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "preMonitorEnter", "(Ljava/lang/Object;F)Ljava/lang/Object;", false);
+                break;
+            case Opcodes.MONITOREXIT:
+                transformer.witness(MONITOR);
+                super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "preMonitorExit", "(Ljava/lang/Object;)Ljava/lang/Object;", false);
+                break;
+        }
+        super.visitInsn(opcode);
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/MonitorMethodTransformer.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/MonitorMethodTransformer.java
new file mode 100644
index 0000000..d9c9c7a
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/MonitorMethodTransformer.java
@@ -0,0 +1,338 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.Comparator;
+import java.util.ListIterator;
+
+import org.objectweb.asm.Label;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.FrameNode;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.IntInsnNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.LocalVariableNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+import org.objectweb.asm.tree.TryCatchBlockNode;
+
+import static org.apache.cassandra.simulator.asm.TransformationKind.MONITOR;
+
+/**
+ * For synchronized methods, we generate a new method that contains the source method's body, and the original method
+ * instead invoke preMonitorEnter before invoking the new hidden method.
+ */
+class MonitorMethodTransformer extends MethodNode
+{
+    private final String className;
+    private final MethodWriterSink methodWriterSink;
+    private final ChanceSupplier monitorDelayChance;
+    private final String baseName;
+    private final boolean isInstanceMethod;
+    private int returnCode;
+
+    int maxLocalParams; // double counts long/double to match asm spec
+
+    public MonitorMethodTransformer(MethodWriterSink methodWriterSink, String className, int api, int access, String name, String descriptor, String signature, String[] exceptions, ChanceSupplier monitorDelayChance)
+    {
+        super(api, access, name, descriptor, signature, exceptions);
+        this.methodWriterSink = methodWriterSink;
+        this.className = className;
+        this.baseName = name;
+        this.isInstanceMethod = (access & Opcodes.ACC_STATIC) == 0;
+        this.monitorDelayChance = monitorDelayChance;
+    }
+
+    @Override
+    public void visitInsn(int opcode)
+    {
+        switch (opcode)
+        {
+            case Opcodes.RETURN:
+            case Opcodes.ARETURN:
+            case Opcodes.IRETURN:
+            case Opcodes.FRETURN:
+            case Opcodes.LRETURN:
+            case Opcodes.DRETURN:
+                if (returnCode != 0) assert returnCode == opcode;
+                else returnCode = opcode;
+        }
+        super.visitInsn(opcode);
+    }
+
+    int returnCode()
+    {
+        return returnCode;
+    }
+
+    // TODO (cleanup): this _should_ be possible to determine purely from the method signature
+    int loadParamsAndReturnInvokeCode()
+    {
+        if (isInstanceMethod)
+            instructions.add(new IntInsnNode(Opcodes.ALOAD, 0));
+
+        ListIterator<LocalVariableNode> it = localVariables.listIterator();
+        while (it.hasNext())
+        {
+            LocalVariableNode cur = it.next();
+            if (cur.index < maxLocalParams)
+            {
+                if (!isInstanceMethod || cur.index > 0)
+                {
+                    int opcode;
+                    switch (cur.desc.charAt(0))
+                    {
+                        case 'L':
+                        case '[':
+                            opcode = Opcodes.ALOAD;
+                            break;
+                        case 'J':
+                            opcode = Opcodes.LLOAD;
+                            break;
+                        case 'D':
+                            opcode = Opcodes.DLOAD;
+                            break;
+                        case 'F':
+                            opcode = Opcodes.FLOAD;
+                            break;
+                        default:
+                            opcode = Opcodes.ILOAD;
+                            break;
+                    }
+                    instructions.add(new IntInsnNode(opcode, cur.index));
+                }
+            }
+        }
+
+        int invokeCode;
+        if (isInstanceMethod && (access & Opcodes.ACC_PRIVATE) != 0) invokeCode = Opcodes.INVOKESPECIAL;
+        else if (isInstanceMethod) invokeCode = Opcodes.INVOKEVIRTUAL;
+        else invokeCode = Opcodes.INVOKESTATIC;
+        return invokeCode;
+    }
+
+    void pushRef()
+    {
+        if (isInstanceMethod) instructions.add(new IntInsnNode(Opcodes.ALOAD, 0));
+        else instructions.add(new LdcInsnNode(org.objectweb.asm.Type.getType('L' + className + ';')));
+    }
+
+    void pop()
+    {
+        instructions.add(new InsnNode(Opcodes.POP));
+    }
+
+    void invokePreMonitorExit()
+    {
+        pushRef();
+        instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "preMonitorExit", "(Ljava/lang/Object;)Ljava/lang/Object;", false));
+    }
+
+    void invokePreMonitorEnter()
+    {
+        pushRef();
+        instructions.add(new LdcInsnNode(monitorDelayChance.get()));
+        instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "preMonitorEnter", "(Ljava/lang/Object;F)Ljava/lang/Object;", false));
+    }
+
+    void invokeMonitor(int insn)
+    {
+        instructions.add(new InsnNode(insn));
+    }
+
+    void reset(Label start, Label end)
+    {
+        instructions.clear();
+        tryCatchBlocks.clear();
+        if (visibleLocalVariableAnnotations != null)
+            visibleLocalVariableAnnotations.clear();
+        if (invisibleLocalVariableAnnotations != null)
+            invisibleLocalVariableAnnotations.clear();
+
+        Type[] args = Type.getArgumentTypes(desc);
+        // remove all local variables that aren't parameters and the `this` parameter
+        maxLocals = args.length == 1 && Type.VOID_TYPE.equals(args[0]) ? 0 : args.length;
+        if (isInstanceMethod) ++maxLocals;
+
+        // sort our local variables and remove those that aren't parameters
+        localVariables.sort(Comparator.comparingInt(c -> c.index));
+        ListIterator<LocalVariableNode> it = localVariables.listIterator();
+        while (it.hasNext())
+        {
+            LocalVariableNode cur = it.next();
+            if (cur.index >= maxLocals)
+            {
+                it.remove();
+            }
+            else
+            {
+                it.set(new LocalVariableNode(cur.name, cur.desc, cur.signature, getLabelNode(start), getLabelNode(end), cur.index));
+                switch (cur.desc.charAt(0))
+                {
+                    case 'J':
+                    case 'D':
+                        // doubles and longs take two local variable positions
+                        ++maxLocals;
+                }
+            }
+        }
+
+        // save the number of pure-parameters for use elsewhere
+        maxLocalParams = maxLocals;
+    }
+
+    void writeOriginal()
+    {
+        access &= ~Opcodes.ACC_SYNCHRONIZED;
+        access |= Opcodes.ACC_SYNTHETIC;
+        name = baseName + "$unsync";
+        methodWriterSink.writeMethod(this);
+    }
+
+    // alternative approach (with writeInnerTryCatchSynchronized)
+    @SuppressWarnings("unused")
+    void writeOuterUnsynchronized()
+    {
+        access &= ~(Opcodes.ACC_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC);
+        name = baseName;
+
+        Label start = new Label();
+        Label end = new Label();
+
+        reset(start, end);
+        maxStack = maxLocalParams;
+
+        instructions.add(getLabelNode(start));
+        invokePreMonitorEnter();
+        pop();
+
+        int invokeCode = loadParamsAndReturnInvokeCode();
+        instructions.add(new MethodInsnNode(invokeCode, className, baseName + "$catch", desc));
+        instructions.add(new InsnNode(returnCode()));
+        instructions.add(getLabelNode(end));
+        methodWriterSink.writeMethod(this);
+    }
+
+    // alternative approach (with writeOuterUnsynchronized)
+    @SuppressWarnings("unused")
+    void writeInnerTryCatchSynchronized()
+    {
+        access |= Opcodes.ACC_SYNCHRONIZED | Opcodes.ACC_SYNTHETIC;
+        name = baseName + "$catch";
+
+        Label start = new Label();
+        Label normal = new Label();
+        Label except = new Label();
+        Label end = new Label();
+        reset(start, end);
+        maxStack = Math.max(maxLocalParams, returnCode == Opcodes.RETURN ? 1 : 2); // must load self or class onto stack, and return value (if any)
+        ++maxLocals;
+        tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(start), getLabelNode(normal), getLabelNode(except), null));
+        instructions.add(getLabelNode(start));
+        int invokeCode = loadParamsAndReturnInvokeCode();
+        instructions.add(new MethodInsnNode(invokeCode, className, baseName + "$unsync", desc));
+        instructions.add(getLabelNode(normal));
+        invokePreMonitorExit();
+        instructions.add(new InsnNode(returnCode()));
+        instructions.add(getLabelNode(except));
+        instructions.add(new FrameNode(Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" }));
+        instructions.add(new IntInsnNode(Opcodes.ASTORE, maxLocalParams));
+        invokePreMonitorExit();
+        instructions.add(new IntInsnNode(Opcodes.ALOAD, maxLocalParams));
+        instructions.add(new InsnNode(Opcodes.ATHROW));
+        instructions.add(getLabelNode(end));
+        methodWriterSink.writeSyntheticMethod(MONITOR, this);
+    }
+
+    void writeTryCatchMonitorEnterExit()
+    {
+        access |= Opcodes.ACC_SYNTHETIC;
+        name = baseName;
+
+        Label start = new Label();
+        Label inmonitor = new Label();
+        Label normal = new Label();
+        Label except = new Label(); // normal
+        Label normalRetExcept = new Label(); // normal return failed
+        Label exceptRetNormal = new Label(); // exceptional return success
+        Label exceptRetExcept = new Label(); // exceptional return failed
+        Label end = new Label();
+        reset(start, end);
+        ++maxLocals; // add a local variable slot to save any exceptions into (at maxLocalParams position)
+        maxStack = Math.max(maxLocalParams, returnCode == Opcodes.RETURN ? 2 : 3); // must load self or class onto stack, and return value (if any)
+        tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(inmonitor), getLabelNode(normal), getLabelNode(except), null));
+        tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(normal), getLabelNode(normalRetExcept), getLabelNode(normalRetExcept), null));
+        tryCatchBlocks.add(new TryCatchBlockNode(getLabelNode(except), getLabelNode(exceptRetNormal), getLabelNode(exceptRetExcept), null));
+        // preMonitorEnter
+        // monitorenter
+        instructions.add(getLabelNode(start));
+        invokePreMonitorEnter();
+        invokeMonitor(Opcodes.MONITORENTER);
+        {
+            // try1 { val = original();
+            instructions.add(getLabelNode(inmonitor));
+            int invokeCode = loadParamsAndReturnInvokeCode();
+            instructions.add(new MethodInsnNode(invokeCode, className, baseName + "$unsync", desc));
+            {
+                // try2 { preMonitorExit(); monitorexit; return val; }
+                instructions.add(getLabelNode(normal));
+                invokePreMonitorExit();
+                invokeMonitor(Opcodes.MONITOREXIT);
+                instructions.add(new InsnNode(returnCode())); // success
+                // }
+                // catch2 { monitorexit; throw }
+                instructions.add(getLabelNode(normalRetExcept));
+                instructions.add(new FrameNode(Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" }));
+                instructions.add(new IntInsnNode(Opcodes.ASTORE, maxLocalParams));
+                pushRef();
+                invokeMonitor(Opcodes.MONITOREXIT);
+                instructions.add(new IntInsnNode(Opcodes.ALOAD, maxLocalParams));
+                instructions.add(new InsnNode(Opcodes.ATHROW));
+                // }
+            }
+            // catch1 { try3 { preMonitorExit; monitorexit; throw
+            instructions.add(getLabelNode(except));
+            instructions.add(new FrameNode(Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" }));
+            instructions.add(new IntInsnNode(Opcodes.ASTORE, maxLocalParams));
+            invokePreMonitorExit();
+            invokeMonitor(Opcodes.MONITOREXIT);
+            instructions.add(new IntInsnNode(Opcodes.ALOAD, maxLocalParams));
+            instructions.add(getLabelNode(exceptRetNormal));
+            instructions.add(new InsnNode(Opcodes.ATHROW));
+            instructions.add(getLabelNode(exceptRetExcept));
+            instructions.add(new FrameNode(Opcodes.F_SAME1, 0, null, 1, new Object[]{ "java/lang/Throwable" }));
+            instructions.add(new IntInsnNode(Opcodes.ASTORE, maxLocalParams));
+            pushRef();
+            invokeMonitor(Opcodes.MONITOREXIT);
+            instructions.add(new IntInsnNode(Opcodes.ALOAD, maxLocalParams));
+            instructions.add(new InsnNode(Opcodes.ATHROW));
+        }
+        instructions.add(getLabelNode(end));
+        methodWriterSink.writeSyntheticMethod(MONITOR, this);
+    }
+
+    @Override
+    public void visitEnd()
+    {
+        writeOriginal();
+        writeTryCatchMonitorEnterExit();
+        super.visitEnd();
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisFieldKind.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisFieldKind.java
new file mode 100644
index 0000000..d26f196
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisFieldKind.java
@@ -0,0 +1,50 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+
+public enum NemesisFieldKind
+{
+    SIMPLE(),
+    ATOMICX(AtomicBoolean.class, AtomicInteger.class, AtomicLong.class, AtomicReference.class),
+    ATOMICUPDATERX(AtomicIntegerFieldUpdater.class, AtomicLongFieldUpdater.class, AtomicReferenceFieldUpdater.class);
+
+    public interface Selector
+    {
+        NemesisFieldKind get(String className, String fieldName);
+    }
+
+    final Set<Class<?>> classes;
+
+    NemesisFieldKind(Class<?> ... classes)
+    {
+        this.classes = Collections.unmodifiableSet(new HashSet<>(Arrays.asList(classes)));
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisGenerator.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisGenerator.java
new file mode 100644
index 0000000..814348b
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisGenerator.java
@@ -0,0 +1,73 @@
+/*
+ * 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.simulator.asm;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.tree.InsnNode;
+import org.objectweb.asm.tree.LabelNode;
+import org.objectweb.asm.tree.LdcInsnNode;
+import org.objectweb.asm.tree.MethodInsnNode;
+import org.objectweb.asm.tree.MethodNode;
+
+/**
+ * Generate a new static method in the class with a randomly generated constant chance of triggering the nemesis.
+ * Generate also the invocation of this method at the relevant point(s).
+ *
+ * A static method with no parameters or return values is created, so that only the method invocation instruction is
+ * needed in the original method, simplifying the transformation.
+ */
+class NemesisGenerator extends MethodNode
+{
+    private final ChanceSupplier chanceSupplier;
+
+    private final String className;
+    private String baseName;
+    private int methodsCounter = 0; // avoid nemesis method name clashes when weaving two or more methods with same name
+    private int withinMethodCounter = 0;
+    private final LdcInsnNode ldc = new LdcInsnNode(null);
+
+    NemesisGenerator(int api, String className, ChanceSupplier chanceSupplier)
+    {
+        super(api, Opcodes.ACC_STATIC | Opcodes.ACC_SYNTHETIC | Opcodes.ACC_PRIVATE, null, "()V", "", null);
+        this.chanceSupplier = chanceSupplier;
+        this.className = className;
+        this.maxLocals = 0;
+        this.maxStack = 1;
+        instructions.add(new LabelNode());
+        instructions.add(ldc);
+        instructions.add(new MethodInsnNode(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global", "nemesis", "(F)V", false));
+        instructions.add(new LabelNode());
+        instructions.add(new InsnNode(Opcodes.RETURN));
+    }
+
+    void newMethod(String name)
+    {
+        this.baseName = name.replaceAll("[<>]", "") + '$' + (methodsCounter++) + '$';
+        this.withinMethodCounter = 0;
+    }
+
+    void generateAndCall(TransformationKind kind, ClassTransformer writeDefinitionTo, MethodVisitor writeInvocationTo)
+    {
+        this.name = baseName + '$' + (withinMethodCounter++) + "$nemesis";
+        ldc.cst = chanceSupplier.get();
+        writeDefinitionTo.writeSyntheticMethod(kind, this);
+        writeInvocationTo.visitMethodInsn(Opcodes.INVOKESTATIC, className, name, "()V", false);
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisTransformer.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisTransformer.java
new file mode 100644
index 0000000..94ed1f4
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/NemesisTransformer.java
@@ -0,0 +1,134 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+import static org.apache.cassandra.simulator.asm.TransformationKind.FIELD_NEMESIS;
+import static org.apache.cassandra.simulator.asm.TransformationKind.SIGNAL_NEMESIS;
+
+/**
+ * Insert nemesis points at all obvious thread signalling points (execution and blocking primitive methods),
+ * as well as to any fields annotated with {@link org.apache.cassandra.utils.Nemesis}.
+ *
+ * If the annotated field is an AtomicX or AtomicXFieldUpdater, we insert nemesis points either side of the next
+ * invocation of
+ *
+ * TODO (config): permit Nemesis on a class as well as a field, so as to mark all (at least volatile or atomic) members
+ */
+class NemesisTransformer extends MethodVisitor
+{
+    private final ClassTransformer transformer;
+    final NemesisGenerator generator;
+    final NemesisFieldKind.Selector nemesisFieldSelector;
+
+    // for simplicity, we simply activate nemesis for all atomic operations on the relevant type once any such
+    // field is loaded in a method
+    Set<String> onForTypes;
+
+    public NemesisTransformer(ClassTransformer transformer, int api, String name, MethodVisitor parent, NemesisGenerator generator, NemesisFieldKind.Selector nemesisFieldSelector)
+    {
+        super(api, parent);
+        this.transformer = transformer;
+        this.generator = generator;
+        this.nemesisFieldSelector = nemesisFieldSelector;
+        generator.newMethod(name);
+    }
+
+    @Override
+    public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)
+    {
+        boolean nemesisAfter = false;
+        if (isInterface && opcode == Opcodes.INVOKEINTERFACE
+        && (owner.startsWith("org/apache/cassandra/concurrent") || owner.startsWith("org/apache/cassandra/utils/concurrent")) && (
+               (owner.equals("org/apache/cassandra/utils/concurrent/CountDownLatch") && name.equals("decrement"))
+            || (owner.equals("org/apache/cassandra/utils/concurrent/Condition") && name.equals("signal"))
+            || (owner.equals("org/apache/cassandra/utils/concurrent/Semaphore") && name.equals("release"))
+            || ((owner.equals("org/apache/cassandra/concurrent/ExecutorPlus")
+                 || owner.equals("org/apache/cassandra/concurrent/LocalAwareExecutorPlus")
+                 || owner.equals("org/apache/cassandra/concurrent/ScheduledExecutorPlus")
+                 || owner.equals("org/apache/cassandra/concurrent/SequentialExecutorPlus")
+                 || owner.equals("org/apache/cassandra/concurrent/LocalAwareSequentialExecutorPlus")
+                ) && (name.equals("execute") || name.equals("submit") || name.equals("maybeExecuteImmediately")))
+        ))
+        {
+            generateAndCall(SIGNAL_NEMESIS);
+        }
+        else if ((opcode == Opcodes.INVOKESPECIAL || opcode == Opcodes.INVOKEVIRTUAL)
+                 && (onForTypes != null && onForTypes.contains(owner)))
+        {
+            nemesisAfter = true;
+            generateAndCall(FIELD_NEMESIS);
+        }
+
+        super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+        if (nemesisAfter)
+            generateAndCall(FIELD_NEMESIS);
+    }
+
+    @Override
+    public void visitFieldInsn(int opcode, String owner, String name, String descriptor)
+    {
+        boolean nemesisAfter = false;
+        NemesisFieldKind nemesis = nemesisFieldSelector.get(owner, name);
+        if (nemesis != null)
+        {
+            switch (nemesis)
+            {
+                case SIMPLE:
+                    switch (opcode)
+                    {
+                        default:
+                            throw new AssertionError();
+                        case Opcodes.PUTFIELD:
+                        case Opcodes.PUTSTATIC:
+                            generateAndCall(FIELD_NEMESIS);
+                            break;
+                        case Opcodes.GETFIELD:
+                        case Opcodes.GETSTATIC:
+                            nemesisAfter = true;
+                    }
+                    break;
+                case ATOMICX:
+                case ATOMICUPDATERX:
+                    switch (opcode)
+                    {
+                        case Opcodes.GETFIELD:
+                        case Opcodes.GETSTATIC:
+                            if (onForTypes == null)
+                                onForTypes = new HashSet<>();
+                            onForTypes.add(descriptor.substring(1, descriptor.length() - 1));
+                    }
+                    break;
+            }
+        }
+        super.visitFieldInsn(opcode, owner, name, descriptor);
+        if (nemesisAfter)
+            generateAndCall(FIELD_NEMESIS);
+    }
+
+    private void generateAndCall(TransformationKind kind)
+    {
+        generator.generateAndCall(kind, transformer, mv);
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/ShadowingTransformer.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/ShadowingTransformer.java
new file mode 100644
index 0000000..ca42f24
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/ShadowingTransformer.java
@@ -0,0 +1,278 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.EnumSet;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.FieldVisitor;
+import org.objectweb.asm.Handle;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.TypePath;
+
+/**
+ * A SORT OF general purpose facility for creating a copy of a system class that we want to transform
+ * and use in place of the system class without transforming the system class itself.
+ *
+ * NOTE that this does not implement this translation perfectly, so care must be taken when extending its usage
+ * Some things not handled:
+ *   - generic type signatures in class files
+ *   - 
+ *
+ * While it is possible and safe in principle to modify ConcurrentHashMap in particular, in practice it messes
+ * with class loading, as ConcurrentHashMap is used widely within the JDK, including for things like class loaders
+ * and method handle caching. It seemed altogether more tractable and safe to selectively replace ConcurrentHashMap
+ * with a shadowed variety.
+ *
+ * This approach makes some rough assumptions, namely that any public method on the root class should accept the
+ * shadowed type, but that any inner class may safely use the shadow type.
+ */
+public class ShadowingTransformer extends ClassTransformer
+{
+    final String originalType;
+    final String originalRootType;
+    final String shadowRootType;
+    final String originalOuterTypePrefix;
+    final String shadowOuterTypePrefix;
+    String originalSuperName;
+
+    ShadowingTransformer(int api, String originalType, String shadowType, String originalRootType, String shadowRootType, String originalOuterTypePrefix, String shadowOuterTypePrefix, EnumSet<Flag> flags, ChanceSupplier monitorDelayChance, NemesisGenerator nemesis, NemesisFieldKind.Selector nemesisFieldSelector, Hashcode insertHashcode)
+    {
+        super(api, shadowType, flags, monitorDelayChance, nemesis, nemesisFieldSelector, insertHashcode, null);
+        this.originalType = originalType;
+        this.originalRootType = originalRootType;
+        this.shadowRootType = shadowRootType;
+        this.originalOuterTypePrefix = originalOuterTypePrefix;
+        this.shadowOuterTypePrefix = shadowOuterTypePrefix;
+    }
+
+    private String toShadowType(String type)
+    {
+        if (type.startsWith("["))
+            return toShadowTypeDescriptor(type);
+        else if (type.equals(originalRootType))
+            type = shadowRootType;
+        else if (type.startsWith(originalOuterTypePrefix))
+            type = shadowOuterTypePrefix + type.substring(originalOuterTypePrefix.length());
+        else
+            return type;
+
+        witness(TransformationKind.SHADOW);
+        return type;
+    }
+
+    private String toShadowTypeDescriptor(String owner)
+    {
+        return toShadowTypeDescriptor(owner, false);
+    }
+
+    private String toShadowTypeDescriptor(String desc, boolean innerTypeOnly)
+    {
+        int i = 0;
+        while (i < desc.length() && desc.charAt(i) == '[') ++i;
+        if (desc.charAt(i) != 'L')
+            return desc;
+        ++i;
+
+        if (!innerTypeOnly && desc.regionMatches(i, originalRootType, 0, originalRootType.length()) && desc.length() == originalRootType.length() + 1 + i && desc.charAt(i + originalRootType.length()) == ';')
+            desc = desc.substring(0, i) + shadowRootType + ';';
+        else if (desc.regionMatches(i, originalOuterTypePrefix, 0, originalOuterTypePrefix.length()))
+            desc = desc.substring(0, i) + shadowOuterTypePrefix + desc.substring(i + originalOuterTypePrefix.length());
+        else
+            return desc;
+
+        witness(TransformationKind.SHADOW);
+        return desc;
+    }
+
+    private Type toShadowTypeDescriptor(Type type)
+    {
+        String in = type.getDescriptor();
+        String out = toShadowTypeDescriptor(in, false);
+        if (in == out) return type;
+        return Type.getType(out);
+    }
+
+    private Type toShadowInnerTypeDescriptor(Type type)
+    {
+        String in = type.getDescriptor();
+        String out = toShadowTypeDescriptor(in, true);
+        if (in == out) return type;
+        return Type.getType(out);
+    }
+
+    Object[] toShadowTypes(Object[] in)
+    {
+        Object[] out = null;
+        for (int i = 0 ; i < in.length ; ++i)
+        {
+            if (in[i] instanceof String)
+            {
+                // TODO (broader correctness): in some cases we want the original type, and others the new type
+                String inv = (String) in[i];
+                String outv = toShadowType(inv);
+                if (inv != outv)
+                {
+                    if (out == null)
+                    {
+                        out = new Object[in.length];
+                        System.arraycopy(in, 0, out, 0, i);
+                    }
+                    out[i] = outv;
+                    continue;
+                }
+            }
+
+            if (out != null)
+                out[i] = in[i];
+        }
+        return out != null ? out : in;
+    }
+
+    String methodDescriptorToShadowInnerArgumentTypes(String descriptor)
+    {
+        Type ret = toShadowTypeDescriptor(Type.getReturnType(descriptor));
+        Type[] args = Type.getArgumentTypes(descriptor);
+        for (int i = 0 ; i < args.length ; ++i)
+            args[i] = toShadowInnerTypeDescriptor(args[i]);
+        return Type.getMethodDescriptor(ret, args);
+    }
+
+    String methodDescriptorToShadowTypes(String descriptor)
+    {
+        Type ret = toShadowTypeDescriptor(Type.getReturnType(descriptor));
+        Type[] args = Type.getArgumentTypes(descriptor);
+        for (int i = 0 ; i < args.length ; ++i)
+            args[i] = toShadowTypeDescriptor(args[i]);
+        return Type.getMethodDescriptor(ret, args);
+    }
+
+    class ShadowingMethodVisitor extends MethodVisitor
+    {
+        final boolean isConstructor;
+        public ShadowingMethodVisitor(int api, boolean isConstructor, MethodVisitor methodVisitor)
+        {
+            super(api, methodVisitor);
+            this.isConstructor = isConstructor;
+        }
+
+        @Override
+        public AnnotationVisitor visitTypeAnnotation(int typeRef, TypePath typePath, String descriptor, boolean visible)
+        {
+            return super.visitTypeAnnotation(typeRef, typePath, descriptor, visible);
+        }
+
+        @Override
+        public void visitFieldInsn(int opcode, String owner, String name, String descriptor)
+        {
+            super.visitFieldInsn(opcode, toShadowType(owner), name, toShadowTypeDescriptor(descriptor));
+        }
+
+        @Override
+        public void visitTypeInsn(int opcode, String type)
+        {
+            // TODO (broader correctness): in some cases we want the original type, and others the new type
+            super.visitTypeInsn(opcode, toShadowType(type));
+        }
+
+        @Override
+        public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index)
+        {
+            super.visitLocalVariable(name, toShadowTypeDescriptor(descriptor), signature, start, end, index);
+        }
+
+        @Override
+        public void visitFrame(int type, int numLocal, Object[] local, int numStack, Object[] stack)
+        {
+            super.visitFrame(type, numLocal, toShadowTypes(local), numStack, toShadowTypes(stack));
+        }
+
+        @Override
+        public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)
+        {
+            // TODO (broader correctness): this is incorrect, but will do for ConcurrentHashMap (no general guarantee of same constructors)
+            if (owner.equals(originalRootType)) descriptor = methodDescriptorToShadowInnerArgumentTypes(descriptor);
+            else descriptor = methodDescriptorToShadowTypes(descriptor);
+            if (isConstructor && name.equals("<init>") && owner.equals(originalSuperName) && originalType.equals(originalRootType)) owner = originalRootType;
+            else owner = toShadowType(owner);
+            super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+        }
+
+        @Override
+        public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments)
+        {
+            if (bootstrapMethodHandle.getOwner().startsWith(originalRootType))
+            {
+                bootstrapMethodHandle = new Handle(bootstrapMethodHandle.getTag(), toShadowType(bootstrapMethodHandle.getOwner()),
+                                                   bootstrapMethodHandle.getName(), bootstrapMethodHandle.getDesc(),
+                                                   bootstrapMethodHandle.isInterface());
+            }
+            super.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments);
+        }
+
+        @Override
+        public void visitLdcInsn(Object value)
+        {
+            if (value instanceof Type)
+                value = toShadowTypeDescriptor((Type) value);
+            super.visitLdcInsn(value);
+        }
+    }
+
+    @Override
+    public void visitInnerClass(String name, String outerName, String innerName, int access)
+    {
+        super.visitInnerClass(name, toShadowType(outerName), innerName, access);
+    }
+
+    @Override
+    public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value)
+    {
+        return super.visitField(access, name, toShadowTypeDescriptor(descriptor), signature, value);
+    }
+
+    @Override
+    public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions)
+    {
+        if (originalType.equals(originalRootType)) descriptor = methodDescriptorToShadowInnerArgumentTypes(descriptor);
+        else descriptor = methodDescriptorToShadowTypes(descriptor);
+        return new ShadowingMethodVisitor(api, name.equals("<init>"), super.visitMethod(access, name, descriptor, signature, exceptions));
+    }
+
+    @Override
+    public void visit(int version, int access, String name, String signature, String superName, String[] interfaces)
+    {
+        originalSuperName = superName;
+        if (originalType.equals(originalRootType))
+        {
+            superName = name;
+            name = shadowRootType;
+        }
+        else
+        {
+            name = toShadowType(name);
+            superName = toShadowType(superName);
+        }
+
+        super.visit(version, access, name, signature, superName, interfaces);
+    }
+
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/ThreadLocalRandomCheckTransformer.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/ThreadLocalRandomCheckTransformer.java
new file mode 100644
index 0000000..ba5cefb
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/ThreadLocalRandomCheckTransformer.java
@@ -0,0 +1,56 @@
+/*
+ * 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.simulator.asm;
+
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+/**
+ * Handle simply thread signalling behaviours, namely monitorenter/monitorexit bytecodes to
+ * {@link org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods}, and LockSupport invocations to
+ * {@link org.apache.cassandra.simulator.systems.InterceptibleThread}.
+ *
+ * The global static methods we redirect monitors to take only one parameter (the monitor) and also return it,
+ * so that they have net zero effect on the stack, permitting the existing monitorenter/monitorexit instructions
+ * to remain where they are. LockSupport on the other hand is redirected entirely to the new method.
+ */
+class ThreadLocalRandomCheckTransformer extends MethodVisitor
+{
+    public ThreadLocalRandomCheckTransformer(int api, MethodVisitor parent)
+    {
+        super(api, parent);
+    }
+
+    @Override
+    public void visitInsn(int opcode)
+    {
+        switch (opcode)
+        {
+            case Opcodes.IRETURN:
+                super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global",
+                                      "threadLocalRandomCheck", "(I)I", false);
+                break;
+            case Opcodes.LRETURN:
+                super.visitMethodInsn(Opcodes.INVOKESTATIC, "org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods$Global",
+                                      "threadLocalRandomCheck", "(J)J", false);
+                break;
+        }
+        super.visitInsn(opcode);
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/TransformationKind.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/TransformationKind.java
new file mode 100644
index 0000000..841a28c
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/TransformationKind.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.Arrays;
+import java.util.List;
+
+public enum TransformationKind
+{
+    MONITOR, SYNCHRONIZED, LOCK_SUPPORT, GLOBAL_METHOD, SIGNAL_NEMESIS, FIELD_NEMESIS, SYNTHETIC_METHOD, HASHCODE,
+    IDENTITY_HASH_MAP, CONCURRENT_HASH_MAP, SHADOW;
+    static final List<TransformationKind> VALUES = Arrays.asList(values());
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/Utils.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/Utils.java
new file mode 100644
index 0000000..be2ef6c
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/Utils.java
@@ -0,0 +1,290 @@
+/*
+ * 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.simulator.asm;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+import org.objectweb.asm.AnnotationVisitor;
+import org.objectweb.asm.Label;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+import org.objectweb.asm.Type;
+import org.objectweb.asm.tree.AbstractInsnNode;
+
+import static org.apache.cassandra.simulator.asm.InterceptClasses.BYTECODE_VERSION;
+import static org.objectweb.asm.Opcodes.ATHROW;
+import static org.objectweb.asm.Opcodes.F_SAME1;
+import static org.objectweb.asm.Opcodes.INVOKESTATIC;
+
+public class Utils
+{
+    public static String toInternalName(Class<?> clazz)
+    {
+        return toInternalName(clazz.getName());
+    }
+
+    public static String toInternalName(String className)
+    {
+        return className.replace('.', '/');
+    }
+
+    public static String toPath(Class<?> clazz)
+    {
+        return toInternalName(clazz) + ".class";
+    }
+
+    public static byte[] readDefinition(Class<?> clazz) throws IOException
+    {
+        return readDefinition(toPath(clazz));
+    }
+
+    public static byte[] readDefinition(String path) throws IOException
+    {
+        byte[] bytes = new byte[1024];
+        try (InputStream in = ClassLoader.getSystemResourceAsStream(path))
+        {
+            int count = 0;
+            while (true)
+            {
+                int add = in.read(bytes, count, bytes.length - count);
+                if (add < 0)
+                    break;
+                if (add == 0)
+                    bytes = Arrays.copyOf(bytes, bytes.length * 2);
+                count += add;
+            }
+            return Arrays.copyOf(bytes, count);
+        }
+    }
+
+    /**
+     * Generate a proxy method call, i.e. one whose only job is forwarding the parameters to a different method
+     * (and perhaps within a superclass, or another class entirely if static) with the same signature but perhaps
+     * different properties.
+     */
+    private static long visitProxyCall(MethodVisitor visitor, String calleeClassName, String calleeMethodName, String descriptor, int access, boolean isInstanceMethod, boolean isInterface)
+    {
+        Type[] argTypes = Type.getArgumentTypes(descriptor);
+        Type returnType = Type.getReturnType(descriptor);
+
+        int stackSize = argTypes.length;
+        int localsSize = 0;
+        if (isInstanceMethod)
+        {
+            visitor.visitIntInsn(Opcodes.ALOAD, 0);
+            localsSize += 2;
+            stackSize += 1;
+        }
+
+        int i = 1;
+        for (Type type : argTypes)
+        {
+            int opcode;
+            switch (type.getDescriptor().charAt(0))
+            {
+                case 'L':
+                case '[':
+                    opcode = Opcodes.ALOAD;
+                    localsSize += 1;
+                    break;
+                case 'J':
+                    opcode = Opcodes.LLOAD;
+                    localsSize += 2;
+                    break;
+                case 'D':
+                    opcode = Opcodes.DLOAD;
+                    localsSize += 2;
+                    break;
+                case 'F':
+                    opcode = Opcodes.FLOAD;
+                    localsSize += 1;
+                    break;
+                default:
+                    opcode = Opcodes.ILOAD;
+                    localsSize += 1;
+                    break;
+            }
+            visitor.visitIntInsn(opcode, i++);
+        }
+
+        int returnCode;
+        switch (returnType.getDescriptor().charAt(0))
+        {
+            case 'L':
+            case '[':
+                returnCode = Opcodes.ARETURN;
+                localsSize = Math.max(localsSize, 1);
+                break;
+            case 'J':
+                returnCode = Opcodes.LRETURN;
+                localsSize = Math.max(localsSize, 2);
+                break;
+            case 'D':
+                returnCode = Opcodes.DRETURN;
+                localsSize = Math.max(localsSize, 2);
+                break;
+            case 'F':
+                returnCode = Opcodes.FRETURN;
+                localsSize = Math.max(localsSize, 1);
+                break;
+            case 'V':
+                returnCode = Opcodes.RETURN;
+                break;
+            default:
+                returnCode = Opcodes.IRETURN;
+                localsSize = Math.max(localsSize, 1);
+                break;
+        }
+
+        int invokeCode;
+        if (isInstanceMethod && (access & Opcodes.ACC_PRIVATE) != 0 || calleeMethodName.equals("<init>")) invokeCode = Opcodes.INVOKESPECIAL;
+        else if (isInstanceMethod) invokeCode = Opcodes.INVOKEVIRTUAL;
+        else invokeCode = Opcodes.INVOKESTATIC;
+
+        visitor.visitMethodInsn(invokeCode, calleeClassName, calleeMethodName, descriptor, isInterface);
+
+        return localsSize | (((long)stackSize) << 28) | (((long) returnCode) << 56);
+    }
+
+    /**
+     * Generate a proxy method call, i.e. one whose only job is forwarding the parameters to a different method
+     * (and perhaps within a superclass, or another class entirely if static) with the same signature but perhaps
+     * different properties.
+     */
+    public static void generateProxyCall(MethodVisitor visitor, String calleeClassName, String calleeMethodName, String descriptor, int access, boolean isInstanceMethod, boolean isInterface)
+    {
+        Label start = new Label(), end = new Label();
+        visitor.visitLabel(start);
+
+        long sizesAndReturnCode = visitProxyCall(visitor, calleeClassName, calleeMethodName, descriptor, access, isInstanceMethod, isInterface);
+        visitor.visitLabel(end);
+        visitor.visitInsn((int)(sizesAndReturnCode >>> 56) & 0xff);
+        visitor.visitMaxs((int)(sizesAndReturnCode >>> 28) & 0xfffffff, (int)(sizesAndReturnCode & 0xfffffff));
+        visitor.visitEnd();
+    }
+
+    /**
+     * Generate a proxy method call, i.e. one whose only job is forwarding the parameters to a different method
+     * (and perhaps within a superclass, or another class entirely if static) with the same signature but perhaps
+     * different properties.
+     *
+     * Invoke within a try/catch block, invoking the provided setup/cleanup instructions.
+     * As designed these must not assign any local variables, and the catch block must be exception free.
+     */
+    public static void generateTryFinallyProxyCall(MethodVisitor visitor, String calleeClassName, String calleeMethodName, String descriptor, int access, boolean isInstanceMethod, boolean isInterface,
+                                                   List<AbstractInsnNode> setup, List<AbstractInsnNode> cleanup)
+    {
+        Label startMethod = new Label(), startTry = new Label(), endTry = new Label(), startCatch = new Label(), endMethod = new Label();
+        visitor.visitLabel(startMethod);
+        visitor.visitTryCatchBlock(startTry, endTry, startCatch, null);
+        setup.forEach(i -> i.accept(visitor));
+        visitor.visitLabel(startTry);
+        long sizesAndReturnCode = visitProxyCall(visitor, calleeClassName, calleeMethodName, descriptor, access, isInstanceMethod, isInterface);
+        int returnCode = (int)(sizesAndReturnCode >>> 56) & 0xff;
+        visitor.visitLabel(endTry);
+        cleanup.forEach(i -> i.accept(visitor));
+        visitor.visitInsn(returnCode);
+        visitor.visitLabel(startCatch);
+        visitor.visitFrame(F_SAME1, 0, null, 1, new Object[] { "java/lang/Throwable" });
+        cleanup.forEach(i -> i.accept(visitor));
+        visitor.visitInsn(ATHROW);
+        visitor.visitLabel(endMethod);
+        if (isInstanceMethod)
+            visitor.visitLocalVariable("this", "L" + calleeClassName + ';', null, startMethod, endMethod, 0);
+        visitor.visitMaxs((int)(sizesAndReturnCode >>> 28) & 0xfffffff, (int)(sizesAndReturnCode & 0xfffffff));
+        visitor.visitEnd();
+    }
+
+    public static AnnotationVisitor checkForSimulationAnnotations(int api, String descriptor, AnnotationVisitor wrap, BiConsumer<Flag, Boolean> annotations)
+    {
+        if (!descriptor.equals("Lorg/apache/cassandra/utils/Simulate;"))
+            return wrap;
+
+        return new AnnotationVisitor(api, wrap)
+        {
+            @Override
+            public AnnotationVisitor visitArray(String name)
+            {
+                if (!name.equals("with") && !name.equals("without"))
+                    return super.visitArray(name);
+
+                boolean add = name.equals("with");
+                return new AnnotationVisitor(api, super.visitArray(name))
+                {
+                    @Override
+                    public void visitEnum(String name, String descriptor, String value)
+                    {
+                        super.visitEnum(name, descriptor, value);
+                        if (descriptor.equals("Lorg/apache/cassandra/utils/Simulate$With;"))
+                            annotations.accept(Flag.valueOf(value), add);
+                    }
+                };
+            }
+        };
+    }
+
+    public static MethodVisitor deterministicToString(MethodVisitor wrap)
+    {
+        return new MethodVisitor(BYTECODE_VERSION, wrap)
+        {
+            @Override
+            public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface)
+            {
+                if (name.equals("hashCode") && owner.equals("java/lang/Object"))
+                {
+                    super.visitMethodInsn(INVOKESTATIC, "java/lang/System", "identityHashCode", "(Ljava/lang/Object;)I", false);
+                }
+                else
+                {
+                    super.visitMethodInsn(opcode, owner, name, descriptor, isInterface);
+                }
+            }
+        };
+    }
+
+    public static void visitEachRefType(String descriptor, Consumer<String> forEach)
+    {
+        Type[] argTypes = Type.getArgumentTypes(descriptor);
+        Type retType = Type.getReturnType(descriptor);
+        for (Type argType : argTypes)
+            visitIfRefType(argType.getDescriptor(), forEach);
+        visitIfRefType(retType.getDescriptor(), forEach);
+    }
+
+    public static void visitIfRefType(String descriptor, Consumer<String> forEach)
+    {
+        if (descriptor.charAt(0) != '[' && descriptor.charAt(descriptor.length() - 1) != ';')
+        {
+            if (descriptor.length() > 1)
+                forEach.accept(descriptor);
+        }
+        else
+        {
+            int i = 1;
+            while (descriptor.charAt(i) == '[') ++i;
+            if (descriptor.charAt(i) == 'L')
+                forEach.accept(descriptor.substring(i + 1, descriptor.length() - 1));
+        }
+    }
+}
diff --git a/test/simulator/asm/org/apache/cassandra/simulator/asm/package-info.java b/test/simulator/asm/org/apache/cassandra/simulator/asm/package-info.java
new file mode 100644
index 0000000..fe9394b
--- /dev/null
+++ b/test/simulator/asm/org/apache/cassandra/simulator/asm/package-info.java
@@ -0,0 +1,25 @@
+/*
+ * 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.
+ */
+
+/**
+ * This package has no dependencies besides asm.*\.jar (and should perhaps be a separate module)
+ *
+ * This is to permit it to be built as a standlone javaagent.
+ */
+package org.apache.cassandra.simulator.asm;
+
diff --git a/test/simulator/bootstrap/org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods.java b/test/simulator/bootstrap/org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods.java
new file mode 100644
index 0000000..645bbb8
--- /dev/null
+++ b/test/simulator/bootstrap/org/apache/cassandra/simulator/systems/InterceptorOfSystemMethods.java
@@ -0,0 +1,415 @@
+/*
+ * 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.simulator.systems;
+
+import java.lang.reflect.Field;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.locks.LockSupport;
+import java.util.function.ToIntFunction;
+
+import sun.misc.Unsafe;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+
+/**
+ * A superclass of InterceptorOfGlobalMethods exposing those methods we might want to use for byte-weaving classes
+ * loaded by the system classloader (such as concurrency primitives). Today we byte weave Enum, Object, Random,
+ * ThreadLocalRandom, ConcurrentHashMap (only for determinism) and all of java.util.concurrent.locks (for park/unpark).
+ * See {@link org.apache.cassandra.simulator.asm.InterceptAgent} for more details.
+ */
+@SuppressWarnings("unused")
+public interface InterceptorOfSystemMethods
+{
+    void waitUntil(long deadlineNanos) throws InterruptedException;
+    void sleep(long period, TimeUnit units) throws InterruptedException;
+    void sleepUninterriptibly(long period, TimeUnit units);
+    boolean waitUntil(Object monitor, long deadlineNanos) throws InterruptedException;
+    void wait(Object monitor) throws InterruptedException;
+    void wait(Object monitor, long millis) throws InterruptedException;
+    void wait(Object monitor, long millis, int nanos) throws InterruptedException;
+    void preMonitorEnter(Object object, float chanceOfSwitch);
+    void preMonitorExit(Object object);
+    void notify(Object monitor);
+    void notifyAll(Object monitor);
+    void nemesis(float chance);
+
+    void park();
+    void parkNanos(long nanos);
+    void parkUntil(long millis);
+    void park(Object blocker);
+    void parkNanos(Object blocker, long nanos);
+    void parkUntil(Object blocker, long millis);
+    void unpark(Thread thread);
+
+    long randomSeed();
+    UUID randomUUID();
+
+    void threadLocalRandomCheck(long seed);
+
+    long nanoTime();
+    long currentTimeMillis();
+
+    @SuppressWarnings("unused")
+    public static class Global
+    {
+        private static InterceptorOfSystemMethods methods = new None();
+        private static ToIntFunction<Object> identityHashCode;
+
+        public static void waitUntil(long deadlineNanos) throws InterruptedException
+        {
+            methods.waitUntil(deadlineNanos);
+        }
+
+        public static void sleep(long millis) throws InterruptedException
+        {
+            sleep(MILLISECONDS, millis);
+        }
+
+        // slipped param order to replace instance method call without other ASM modification
+        public static void sleep(TimeUnit units, long period) throws InterruptedException
+        {
+            methods.sleep(period, units);
+        }
+
+        // to match Guava Uninterruptibles
+        public static void sleepUninterruptibly(long period, TimeUnit units)
+        {
+            methods.sleepUninterriptibly(period, units);
+        }
+
+        public static boolean waitUntil(Object monitor, long deadlineNanos) throws InterruptedException
+        {
+            return methods.waitUntil(monitor, deadlineNanos);
+        }
+
+        public static void wait(Object monitor) throws InterruptedException
+        {
+            methods.wait(monitor);
+        }
+
+        public static void wait(Object monitor, long millis) throws InterruptedException
+        {
+            methods.wait(monitor, millis);
+        }
+
+        @SuppressWarnings("unused")
+        public static Object preMonitorEnter(Object object, float chance)
+        {
+            methods.preMonitorEnter(object, chance);
+            return object;
+        }
+
+        public static Object preMonitorExit(Object object)
+        {
+            methods.preMonitorExit(object);
+            return object;
+        }
+
+        public static void notify(Object monitor)
+        {
+            methods.notify(monitor);
+        }
+
+        public static void notifyAll(Object monitor)
+        {
+            methods.notifyAll(monitor);
+        }
+
+        public static void park()
+        {
+            methods.park();
+        }
+
+        public static void parkNanos(long nanos)
+        {
+            methods.parkNanos(nanos);
+        }
+
+        public static void parkUntil(long millis)
+        {
+            methods.parkUntil(millis);
+        }
+
+        public static void park(Object blocker)
+        {
+            methods.park(blocker);
+        }
+
+        public static void parkNanos(Object blocker, long nanos)
+        {
+            methods.parkNanos(blocker, nanos);
+        }
+
+        public static void parkUntil(Object blocker, long millis)
+        {
+            methods.parkUntil(blocker, millis);
+        }
+
+        public static void unpark(Thread thread)
+        {
+            methods.unpark(thread);
+        }
+        
+        public static void nemesis(float chance)
+        {
+            methods.nemesis(chance);
+        }
+
+        public static int advanceProbe(int probe)
+        {
+            return probe + 1;
+        }
+
+        public static long randomSeed()
+        {
+            return methods.randomSeed();
+        }
+
+        public static UUID randomUUID()
+        {
+            return methods.randomUUID();
+        }
+
+        public static int threadLocalRandomCheck(int seed)
+        {
+            methods.threadLocalRandomCheck(seed);
+            return seed;
+        }
+
+        public static long threadLocalRandomCheck(long seed)
+        {
+            methods.threadLocalRandomCheck(seed);
+            return seed;
+        }
+
+        public static long nanoTime()
+        {
+            return methods.nanoTime();
+        }
+
+        public static long currentTimeMillis()
+        {
+            return methods.currentTimeMillis();
+        }
+
+        public static int identityHashCode(Object object)
+        {
+            return identityHashCode.applyAsInt(object);
+        }
+
+        public static Unsafe getUnsafe()
+        {
+            try
+            {
+                Field field = Unsafe.class.getDeclaredField("theUnsafe");
+                field.setAccessible(true);
+                return (Unsafe) field.get(null);
+            }
+            catch (Exception e)
+            {
+                throw new AssertionError(e);
+            }
+        }
+
+        public static void unsafeSet(InterceptorOfSystemMethods methods)
+        {
+            Global.methods = methods;
+        }
+
+        public static void unsafeSet(InterceptorOfSystemMethods methods, ToIntFunction<Object> identityHashCode)
+        {
+            Global.methods = methods;
+            Global.identityHashCode = identityHashCode;
+        }
+    }
+
+    public static class None implements InterceptorOfSystemMethods
+    {
+        @Override
+        public void waitUntil(long deadlineNanos) throws InterruptedException
+        {
+            long waitNanos = System.nanoTime() - deadlineNanos;
+            if (waitNanos > 0)
+                TimeUnit.NANOSECONDS.sleep(waitNanos);
+        }
+
+        @Override
+        public void sleep(long period, TimeUnit units) throws InterruptedException
+        {
+            waitUntil(System.nanoTime() + units.toNanos(period));
+        }
+
+        @Override
+        public void sleepUninterriptibly(long period, TimeUnit units)
+        {
+            long until = System.nanoTime() + units.toNanos(period);
+            boolean isInterrupted = false;
+            while (true)
+            {
+                try
+                {
+                    waitUntil(until);
+                    break;
+                }
+                catch (InterruptedException e)
+                {
+                    isInterrupted = true;
+                }
+            }
+
+            if (isInterrupted)
+                Thread.currentThread().interrupt();
+        }
+
+        @Override
+        public boolean waitUntil(Object monitor, long deadlineNanos) throws InterruptedException
+        {
+            long wait = deadlineNanos - System.nanoTime();
+            if (wait <= 0)
+                return false;
+
+            monitor.wait((wait + 999999) / 1000000);
+            return true;
+        }
+
+        @Override
+        public void wait(Object monitor) throws InterruptedException
+        {
+            monitor.wait();
+        }
+
+        @Override
+        public void wait(Object monitor, long millis) throws InterruptedException
+        {
+            monitor.wait(millis);
+        }
+
+        @Override
+        public void wait(Object monitor, long millis, int nanos) throws InterruptedException
+        {
+            monitor.wait(millis, nanos);
+        }
+
+        @Override
+        public void preMonitorEnter(Object object, float chanceOfSwitch)
+        {
+        }
+
+        @Override
+        public void preMonitorExit(Object object)
+        {
+        }
+
+        @Override
+        public void notify(Object monitor)
+        {
+            monitor.notify();
+        }
+
+        @Override
+        public void notifyAll(Object monitor)
+        {
+            monitor.notifyAll();
+        }
+
+        @Override
+        public void nemesis(float chance)
+        {
+        }
+
+        @Override
+        public void park()
+        {
+            LockSupport.park();
+        }
+
+        @Override
+        public void parkNanos(long nanos)
+        {
+            LockSupport.parkNanos(nanos);
+        }
+
+        @Override
+        public void parkUntil(long millis)
+        {
+            LockSupport.parkUntil(millis);
+        }
+
+        @Override
+        public void park(Object blocker)
+        {
+            LockSupport.park(blocker);
+        }
+
+        @Override
+        public void parkNanos(Object blocker, long nanos)
+        {
+            LockSupport.parkNanos(blocker, nanos);
+        }
+
+        @Override
+        public void parkUntil(Object blocker, long millis)
+        {
+            LockSupport.parkUntil(blocker, millis);
+        }
+
+        @Override
+        public void unpark(Thread thread)
+        {
+            LockSupport.unpark(thread);
+        }
+
+        private static final long SEED_MULTIPLIER = 2862933555777941757L;
+        private static final long SEED_CONSTANT = 0x121d34a;
+        private long nextSeed = 0x10523dfe2L;
+        @Override
+        public synchronized long randomSeed()
+        {
+            long next = nextSeed;
+            nextSeed *= SEED_MULTIPLIER;
+            nextSeed += SEED_CONSTANT;
+            return next;
+        }
+
+        @Override
+        public UUID randomUUID()
+        {
+            return UUID.randomUUID();
+        }
+
+        @Override
+        public long nanoTime()
+        {
+            return System.nanoTime();
+        }
+
+        @Override
+        public long currentTimeMillis()
+        {
+            return System.currentTimeMillis();
+        }
+
+        @Override
+        public void threadLocalRandomCheck(long seed)
+        {
+        }
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/Action.java b/test/simulator/main/org/apache/cassandra/simulator/Action.java
new file mode 100644
index 0000000..edb661f
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/Action.java
@@ -0,0 +1,1007 @@
+/*
+ * 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.simulator;
+
+import java.io.Serializable;
+import java.util.ArrayDeque;
+import java.util.Deque;
+import java.util.EnumSet;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+
+import com.google.common.base.Preconditions;
+
+import io.netty.util.internal.DefaultPriorityQueue;
+import io.netty.util.internal.PriorityQueue;
+import io.netty.util.internal.PriorityQueueNode;
+import org.apache.cassandra.simulator.Ordered.StrictlyOrdered;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.utils.Throwables;
+
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SIMULATOR_DEBUG;
+import static org.apache.cassandra.simulator.Action.Modifier.*;
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Phase.CANCELLED;
+import static org.apache.cassandra.simulator.Action.Phase.CONSEQUENCE;
+import static org.apache.cassandra.simulator.Action.Phase.FINISHED;
+import static org.apache.cassandra.simulator.Action.Phase.INVALIDATED;
+import static org.apache.cassandra.simulator.Action.Phase.NASCENT;
+import static org.apache.cassandra.simulator.Action.Phase.STARTED;
+import static org.apache.cassandra.simulator.Action.Phase.WITHHELD;
+import static org.apache.cassandra.simulator.Action.RegisteredType.CHILD;
+import static org.apache.cassandra.simulator.Action.RegisteredType.LISTENER;
+import static org.apache.cassandra.simulator.ActionListener.Before.DROP;
+import static org.apache.cassandra.simulator.ActionListener.Before.INVALIDATE;
+import static org.apache.cassandra.simulator.ActionListener.Before.EXECUTE;
+import static org.apache.cassandra.simulator.utils.CompactLists.append;
+import static org.apache.cassandra.simulator.utils.CompactLists.remove;
+import static org.apache.cassandra.simulator.utils.CompactLists.safeForEach;
+
+public abstract class Action implements PriorityQueueNode
+{
+    private static final boolean DEBUG = TEST_SIMULATOR_DEBUG.getBoolean();
+
+    public enum Modifier
+    {
+        /**
+         * Never drop an action. Primarily intended to transitively mark an action's descendants as
+         * required to succeed (e.g. in the case of repair and other cluster actions that are brittle)
+         */
+        RELIABLE('r', true),
+
+        /**
+         * Mark an action to be discarded, which may result in some alternative action being undertaken.
+         * This marker is only to ensure correctness, as the simulator will fail if an action is performed
+         * that is marked DROP and RELIABLE.
+         */
+        DROP('f', false),
+
+        // indicates some scheduler delay should be added to the execution time of this action
+        // TODO (feature): support per node scheduler delay to simulate struggling nodes
+        THREAD_SIGNAL('t', false),
+
+        /**
+         * a general purpose mechanism for withholding actions until all other actions have had an opportunity to run
+         * (intended primarily for TIMEOUT+NO_TIMEOUTS, but may be used elsewhere)
+         * this is a very similar feature to Ordered, but it was easier to model this way, as the predecessors are
+         * all other child actions in the entire transitive closure of operations, with the premise that the action
+         * will no longer be valid by the time it has an opportunity run
+         */
+        WITHHOLD((char)0, false),
+
+        // Mark operations as a THREAD_TIMEOUT, and parent operations as forbidding such timeouts (unless all else has failed)
+        NO_THREAD_TIMEOUTS('n', true, null, true), THREAD_TIMEOUT('t', false, NO_THREAD_TIMEOUTS),
+
+        /**
+         * All children of this action should be performed in strict order wrt the parent's consequences
+         * i.e. this is the continuation version of {@link #STRICT_CHILD_ORDER}
+         * this is a bit clunky, but not the end of the world
+         */
+        STRICT_CHILD_OF_PARENT_ORDER('c', false),
+
+        /**
+         * All children of this action should be performed in strict order, which means not only that
+         * they must be performed in the provided order, but all of their consequences must finish before
+         * the next sibling is permitted to run
+         */
+        STRICT_CHILD_ORDER('s', true, null, STRICT_CHILD_OF_PARENT_ORDER),
+
+        /**
+         * InfiniteLoopExecutors, when started, should be treated as detached from the action that happens to start them
+         * so the child action is considered to be orphaned, and not registered or counted against its parent action
+         */
+        ORPHAN('o', false),
+
+        /**
+         * Must be combined with ORPHAN. Unlinks an Action from its direct parent, attaching it as a child of its
+         * grandparent. This is used to support streams of streams
+         */
+        ORPHAN_TO_GRANDPARENT((char)0, false),
+
+        /**
+         * When we both deliver a message and timeout, the timeout may be scheduled for much later. We do not want to
+         * apply restrictions on later operations starting because we are waiting for a timeout to fire in this case,
+         * so we detach the timeout from its parent's accounting - but re-attach its children to the parent if
+         * still alive. Must be coincident with ORPHAN.
+         */
+        PSEUDO_ORPHAN('p', false),
+
+        /**
+         * Recurring tasks, that the schedule may discount when determining if has terminated
+         */
+        STREAM((char)0, false),
+
+        /**
+         * Recurring scheduled tasks, that the schedule should discount when determining if has terminated
+         */
+        DAEMON((char)0, false),
+
+        /**
+         * Informational messages produced for logging only
+         */
+        INFO((char)0, false),
+
+        /**
+         * A thread wakeup action that is ordinarily filtered from logging.
+         */
+        WAKEUP('w', false),
+
+        /**
+         * Show this action in the chain of origin actions
+         */
+        DISPLAY_ORIGIN('d', false);
+
+        final char displayId;
+        final boolean heritable;
+        final Modifier withholdIfPresent;
+        final Modifier inheritIfContinuation;
+
+        private Modifiers asSet;
+
+        Modifier(char displayId, boolean heritable)
+        {
+            this(displayId, heritable, null);
+        }
+
+        Modifier(char displayId, boolean heritable, Modifier withholdIfPresent)
+        {
+            this(displayId, heritable, withholdIfPresent, null);
+        }
+
+        Modifier(char displayId, boolean heritable, Modifier withholdIfPresent, boolean inheritIfContinuation)
+        {
+            this.displayId = displayId;
+            this.heritable = heritable;
+            this.withholdIfPresent = withholdIfPresent;
+            this.inheritIfContinuation = inheritIfContinuation ? this : null;
+        }
+
+        Modifier(char displayId, boolean heritable, Modifier withholdIfPresent, Modifier inheritIfContinuation)
+        {
+            this.displayId = displayId;
+            this.heritable = heritable;
+            this.withholdIfPresent = withholdIfPresent;
+            this.inheritIfContinuation = inheritIfContinuation;
+        }
+
+        Modifiers asSet()
+        {
+            if (asSet == null)
+                asSet = Modifiers.of(this);
+            return asSet;
+        }
+    }
+
+    public static class Modifiers implements Serializable
+    {
+        public static final Modifiers NONE = of();
+        public static final Modifiers INFO = Modifier.INFO.asSet();
+        public static final Modifiers RELIABLE = Modifier.RELIABLE.asSet();
+        public static final Modifiers DROP = Modifier.DROP.asSet();
+        public static final Modifiers PSEUDO_ORPHAN = of(Modifier.PSEUDO_ORPHAN);
+        public static final Modifiers STREAM = of(Modifier.STREAM);
+        public static final Modifiers INFINITE_STREAM = of(Modifier.STREAM, DAEMON);
+        public static final Modifiers STREAM_ITEM = of(Modifier.STREAM, ORPHAN, ORPHAN_TO_GRANDPARENT);
+        public static final Modifiers INFINITE_STREAM_ITEM = of(Modifier.STREAM, DAEMON, ORPHAN, ORPHAN_TO_GRANDPARENT);
+
+        public static final Modifiers START_TASK = of(THREAD_SIGNAL);
+        public static final Modifiers START_THREAD = of(THREAD_SIGNAL);
+        public static final Modifiers START_INFINITE_LOOP = of(ORPHAN, THREAD_SIGNAL);
+        public static final Modifiers START_SCHEDULED_TASK = of(THREAD_SIGNAL);
+        public static final Modifiers START_TIMEOUT_TASK = of(Modifier.THREAD_TIMEOUT, THREAD_SIGNAL);
+        public static final Modifiers START_DAEMON_TASK = of(ORPHAN, Modifier.DAEMON, THREAD_SIGNAL);
+
+        public static final Modifiers WAKE_UP_THREAD = of(THREAD_SIGNAL, WAKEUP);
+
+        public static final Modifiers STRICT = of(STRICT_CHILD_ORDER);
+        public static final Modifiers NO_TIMEOUTS = Modifier.NO_THREAD_TIMEOUTS.asSet();
+
+        public static final Modifiers RELIABLE_NO_TIMEOUTS = of(Modifier.NO_THREAD_TIMEOUTS, Modifier.RELIABLE);
+        public static final Modifiers DISPLAY_ORIGIN = of(Modifier.DISPLAY_ORIGIN);
+
+        public static Modifiers of()
+        {
+            return new Modifiers(EnumSet.noneOf(Modifier.class));
+        }
+
+        public static Modifiers of(Modifier first, Modifier ... rest)
+        {
+            return new Modifiers(EnumSet.of(first, rest));
+        }
+
+        final EnumSet<Modifier> contents;
+        Modifiers(EnumSet<Modifier> contents)
+        {
+            this.contents = contents;
+        }
+
+        public Modifiers with(Modifiers add)
+        {
+            if (add == NONE)
+                return this;
+
+            if (this == NONE)
+                return add;
+
+            if (contents.containsAll(add.contents))
+                return this;
+
+            return add(add.contents);
+        }
+
+        public Modifiers with(Modifier add)
+        {
+            if (this == NONE)
+                return add.asSet();
+
+            if (contents.contains(add))
+                return this;
+
+            return add(add.asSet().contents);
+        }
+
+        private Modifiers add(EnumSet<Modifier> add)
+        {
+            EnumSet<Modifier> merge = EnumSet.noneOf(Modifier.class);
+            for (Modifier modifier : this.contents) add(modifier, merge, add);
+            for (Modifier modifier : add) add(modifier, merge, this.contents);
+            return new Modifiers(merge);
+        }
+
+        private static void add(Modifier modifier, EnumSet<Modifier> to, EnumSet<Modifier> mergingWith)
+        {
+            if (modifier.withholdIfPresent != null && mergingWith.contains(modifier.withholdIfPresent))
+                to.add(WITHHOLD);
+            to.add(modifier);
+        }
+
+        // for continuations to inherit the relevant modifiers from their immediate parent
+        // (since we represent a continuation of the same execution)
+        public Modifiers inheritIfContinuation(Modifiers inheritIfContinuation)
+        {
+            EnumSet<Modifier> merge = null;
+            for (Modifier modifier : inheritIfContinuation.contents)
+            {
+                if (modifier.inheritIfContinuation != null)
+                {
+                    if (merge == null && !contents.contains(modifier.inheritIfContinuation)) merge = EnumSet.copyOf(contents);
+                    if (merge != null) merge.add(modifier.inheritIfContinuation);
+                }
+            }
+
+            if (merge == null)
+                return this;
+
+            if (!merge.contains(WITHHOLD))
+            {
+                for (Modifier modifier : merge)
+                {
+                    if (modifier.withholdIfPresent != null && merge.contains(modifier.withholdIfPresent))
+                        merge.add(WITHHOLD);
+                }
+            }
+            return new Modifiers(merge);
+        }
+
+        public Modifiers without(Modifier modifier)
+        {
+            if (!contents.contains(modifier))
+                return this;
+
+            EnumSet<Modifier> remove = EnumSet.noneOf(Modifier.class);
+            remove.addAll(this.contents);
+            remove.remove(modifier);
+            return new Modifiers(remove);
+        }
+
+        public boolean is(Modifier modifier)
+        {
+            return contents.contains(modifier);
+        }
+    }
+
+    enum RegisteredType { LISTENER, CHILD }
+
+    enum Phase
+    {
+        NASCENT,
+        WITHHELD,
+        CONSEQUENCE,
+        READY_TO_SCHEDULE,
+        SEQUENCED_PRE_SCHEDULED,
+        SCHEDULED,
+        SEQUENCED_POST_SCHEDULED,
+        RUNNABLE,
+        STARTED,
+        FINISHED,
+        CANCELLED,
+        INVALIDATED
+    }
+
+    // configuration/status
+    private final Object description;
+    private OrderOns orderOn;
+    private Modifiers self, transitive;
+    private Phase phase = NASCENT;
+    Ordered ordered;
+
+    /** The listeners (and, if DEBUG, children) we have already registered */
+    private final Map<Object, RegisteredType> registered = new IdentityHashMap<>(2);
+
+    /** The list of listeners (for deterministic evaluation order) to notify on any event */
+    private List<ActionListener> listeners;
+
+    /** The immediate parent, and furthest ancestor of this Action */
+    protected Action parent, origin = this, pseudoParent;
+
+    /** The number of direct consequences of this action that have not <i>transitively</i> terminated */
+    private int childCount;
+
+    /**
+     * Consequences marked WITHHOLD are kept in their parent (or parent thread's) {@code withheld} queue until all
+     * other immediate children have <i>transitively</i> terminated their execution
+     */
+    private DefaultPriorityQueue<Action> withheld;
+
+    // scheduler and scheduled state
+    protected RunnableActionScheduler scheduler;
+
+    private long deadline; // some actions have an associated wall clock time to execute and are first scheduled by this
+    private double priority; // all actions eventually get prioritised for execution in some order "now"
+
+    // used to track the index and priority queue we're being managed for execution by (either by scheduledAt or priority)
+    private PriorityQueue<?> scheduledIn;
+    private int scheduledIndex = -1;
+
+    // used to track the scheduledAt of events we have moved to actively scheduling/prioritising
+    private PriorityQueue<?> savedIn;
+    private int savedIndex = -1;
+
+    public Action(Object description, Modifiers self)
+    {
+        this(description, self, NONE);
+    }
+    public Action(Object description, Modifiers self, Modifiers transitive)
+    {
+        this(description, OrderOn.NONE, self, transitive);
+    }
+
+    public Action(Object description, OrderOns orderOn, Modifiers self, Modifiers transitive)
+    {
+        this.description = description;
+        if (orderOn == null || self == null || transitive == null)
+            throw new IllegalArgumentException();
+        assert transitive.contents.stream().allMatch(m -> m.heritable) : transitive.contents.toString();
+        this.orderOn = orderOn;
+        this.self = self;
+        this.transitive = transitive;
+    }
+
+    public Object description()
+    {
+        return description;
+    }
+    public OrderOns orderOns() { return orderOn; }
+    public Phase phase() { return phase; }
+    public Modifiers self() { return self; }
+    public Modifiers transitive() { return transitive; }
+    public boolean is(Modifier modifier)
+    {
+        return self.contents.contains(modifier);
+    }
+    public void inherit(Modifiers add)
+    {
+        if (add != NONE)
+            add(add, add);
+    }
+    public void add(Modifiers self, Modifiers children)
+    {
+        this.self = this.self.with(self);
+        this.transitive = this.transitive.with(children);
+    }
+
+    public boolean isStarted()
+    {
+        return phase.compareTo(STARTED) >= 0;
+    }
+    public boolean isFinished()
+    {
+        return phase.compareTo(FINISHED) >= 0;
+    }
+    public boolean isCancelled()
+    {
+        return phase.compareTo(CANCELLED) >= 0;
+    }
+    public boolean isInvalidated()
+    {
+        return phase.compareTo(INVALIDATED) >= 0;
+    }
+
+    public Action parent()
+    {
+        return parent;
+    }
+    public int childCount()
+    {
+        return childCount;
+    }
+
+    /**
+     * Main implementation of {@link #perform()}, that must be completed by an extending classes.
+     *
+     * Does not need to handle consequences, registration etc.
+     *
+     * @return the action consequences
+     */
+    protected abstract ActionList performSimple();
+
+    /**
+     * Invokes {@link #performSimple} before invoking {@link #performed}.
+     *
+     * May be overridden by an extending classes that does not finish immediately (e.g, SimulatedAction).
+     *
+     * MUST handle consequences, registration etc by invoking performed() on its results before returning,
+     * to register children and record the action's state
+     *
+     * @return the action consequences
+     */
+    protected ActionList performAndRegister()
+    {
+        return performed(performSimple(), true, true);
+    }
+
+    /**
+     * Invoke the action, and return its consequences, i.e. any follow up actions.
+     */
+    public final ActionList perform()
+    {
+        Preconditions.checkState(!(is(RELIABLE) && is(Modifier.DROP)));
+        Throwable fail = safeForEach(listeners, ActionListener::before, this, is(Modifier.DROP) ? DROP : EXECUTE);
+        if (fail != null)
+        {
+            invalidate(false);
+            Throwables.maybeFail(fail);
+        }
+
+        if (DEBUG && parent != null && parent.registered.get(this) != CHILD) throw new AssertionError();
+
+        ActionList next = performAndRegister();
+        next.forEach(Action::setConsequence);
+
+        if (is(STRICT_CHILD_ORDER)) next.setStrictlySequentialOn(this);
+        else if (is(STRICT_CHILD_OF_PARENT_ORDER)) next.setStrictlySequentialOn(parent);
+
+        return next;
+    }
+
+    /**
+     * To be invoked on the results of {@link #performSimple()} by its implementations.
+     * We invite the implementation to invoke it so that it may control state either side of its invocation.
+     *
+     * {@link #register(ActionList)}'s the consequences, restores any old withheld actions,
+     * and updates this Action's internal state.
+     *
+     * @return the provided actions, minus any withheld
+     */
+    protected ActionList performed(ActionList consequences, boolean isStart, boolean isFinish)
+    {
+        assert isStarted() != isStart;
+        assert !isFinished();
+
+        consequences = register(consequences);
+        assert !consequences.anyMatch(c -> c.is(WITHHOLD));
+
+        if (isFinish) finishedSelf();
+        else if (isStart) phase = STARTED;
+
+        return restoreWithheld(consequences);
+    }
+
+    /**
+     * Similar to cancel() but invoked under abnormal termination
+     */
+    public void invalidate()
+    {
+        invalidate(INVALIDATED);
+    }
+
+    /**
+     * To be invoked when this action has become redundant.
+     *  - Marks itself invalidated
+     *  - Notifies its listeners (which may remove it from any ordered sequences in the ActionSchedule)
+     *  - If present, clears itself directly from:
+     *    - its parent's withholding space
+     *    - the schedule's priority queue
+     */
+    public void cancel()
+    {
+        assert !isStarted();
+        invalidate(CANCELLED);
+    }
+
+    private void invalidate(Phase advanceTo)
+    {
+        if (phase.compareTo(CANCELLED) >= 0)
+            return;
+
+        advanceTo(advanceTo);
+        Throwable fail = safeForEach(listeners, ActionListener::before, this, INVALIDATE);
+        fail = Throwables.merge(fail, safeInvalidate(phase == CANCELLED));
+        invalidate(phase == CANCELLED);
+        finishedSelf();
+        Throwables.maybeFail(fail);
+    }
+
+    protected Throwable safeInvalidate(boolean isCancellation)
+    {
+        return null;
+    }
+
+    private void invalidate(boolean isCancellation)
+    {
+        if (parent != null && parent.withheld != null && is(WITHHOLD))
+        {
+            if (parent.withheld.remove(this))
+                parent.cleanupWithheld();
+        }
+        if (scheduledIndex >= 0) scheduledIn.remove(this);
+        if (savedIndex >= 0) savedIn.remove(this);
+        if (ordered != null) ordered.invalidate(isCancellation);
+    }
+
+    /**
+     * Register consequences of this action, i.e.:
+     *  - attach a scheduler to them for prioritising when they are permitted to execute
+     *  - pass them to any listeners as consequences
+     *  - count them as children, and mark ourselves as parent, so that we may track transitive completion
+     *  - withhold any actions that are so marked, to be {@link #restoreWithheld}d once we have transitively completed
+     *    all non-withheld actions.
+     */
+    protected ActionList register(ActionList consequences)
+    {
+        assert !isFinished();
+        if (consequences.isEmpty())
+            return consequences;
+
+        scheduler.attachTo(consequences);
+        Throwable fail = safeForEach(listeners, ActionListener::consequences, consequences);
+        if (fail != null)
+        {
+            invalidate(false);
+            Throwables.merge(fail, consequences.safeForEach(Action::invalidate));
+            Throwables.maybeFail(fail);
+        }
+
+        boolean isParentPseudoOrphan = is(PSEUDO_ORPHAN);
+        boolean withheld = false;
+        for (int i = 0 ; i < consequences.size() ; ++i)
+        {
+            Action child = consequences.get(i);
+            if (child.is(ORPHAN))
+            {
+                if (parent != null && child.is(ORPHAN_TO_GRANDPARENT))
+                {
+                    ++parent.childCount;
+                    parent.registerChild(child);
+                }
+                else if (child.is(PSEUDO_ORPHAN))
+                {
+                    child.inherit(transitive);
+                    registerPseudoOrphan(child);
+                    assert !child.is(WITHHOLD);
+                }
+            }
+            else
+            {
+                Action parent;
+                if (isParentPseudoOrphan && pseudoParent != null && pseudoParent.childCount > 0)
+                    parent = pseudoParent;
+                else
+                    parent = this;
+
+                child.inherit(parent.transitive);
+                if (child.is(WITHHOLD))
+                {
+                    // this could be supported in principle by applying the ordering here, but it would be
+                    // some work to ensure it doesn't lead to deadlocks so for now just assert we don't use it
+                    Preconditions.checkState(!parent.is(STRICT_CHILD_ORDER) && !parent.is(STRICT_CHILD_OF_PARENT_ORDER));
+                    withheld = true;
+                    parent.addWithheld(child);
+                }
+
+                parent.registerChild(child);
+                parent.childCount++;
+            }
+        }
+
+        if (!withheld)
+            return consequences;
+
+        return consequences.filter(child -> !child.is(WITHHOLD));
+    }
+
+    // setup the child relationship, but do not update childCount
+    private void registerChild(Action child)
+    {
+        assert child.parent == null;
+        child.parent = this;
+        registerChildOrigin(child);
+        if (DEBUG && !register(child, CHILD)) throw new AssertionError();
+    }
+
+    private void registerPseudoOrphan(Action child)
+    {
+        assert child.parent == null;
+        assert child.pseudoParent == null;
+        child.pseudoParent = this;
+        registerChildOrigin(child);
+    }
+
+    private void registerChildOrigin(Action child)
+    {
+        if (is(Modifier.DISPLAY_ORIGIN)) child.origin = this;
+        else if (origin != this) child.origin = origin;
+    }
+
+    private boolean register(Object object, RegisteredType type)
+    {
+        RegisteredType prev = registered.putIfAbsent(object, type);
+        if (prev != null && prev != type)
+            throw new AssertionError();
+        return prev == null;
+    }
+
+    public void register(ActionListener listener)
+    {
+        if (register(listener, LISTENER))
+            listeners = append(listeners, listener);
+    }
+
+    private boolean deregister(Object object, RegisteredType type)
+    {
+        return registered.remove(object, type);
+    }
+
+    public void deregister(ActionListener listener)
+    {
+        if (deregister(listener, LISTENER))
+            listeners = remove(listeners, listener);
+    }
+
+    private void addWithheld(Action action)
+    {
+        if (withheld == null)
+            withheld = new DefaultPriorityQueue<>(Action::compareByPriority, 2);
+        action.advanceTo(WITHHELD);
+        action.saveIn(withheld);
+    }
+
+    /**
+     * Restore withheld (by ourselves or a parent) actions, when no other outstanding actions remain
+     */
+    public ActionList restoreWithheld(ActionList consequences)
+    {
+        if (withheld != null && childCount == withheld.size())
+        {
+            Action next = withheld.poll();
+            cleanupWithheld();
+            consequences = consequences.andThen(next);
+        }
+        else if (childCount == 0 && parent != null)
+        {
+            Action cur = parent;
+            while (cur.childCount == 0 && cur.parent != null)
+                cur = cur.parent;
+            consequences = cur.restoreWithheld(consequences);
+        }
+        return consequences;
+    }
+
+    private void cleanupWithheld()
+    {
+        Action cur = this;
+        if (cur.withheld.isEmpty())
+            cur.withheld = null;
+    }
+
+    /**
+     * Invoked once we finish executing ourselves. Typically this occurs immediately after invocation,
+     * but for SimulatedAction it occurs only once the thread terminates its execution.
+     *
+     * In practice this is entirely determined by the {@code isFinished} parameter supplied to
+     * {@link #performed(ActionList, boolean, boolean)}.
+     */
+    void finishedSelf()
+    {
+        if (phase.compareTo(CANCELLED) < 0)
+            advanceTo(FINISHED);
+
+        scheduler = null;
+        if (withheld != null)
+        {
+            Queue<Action> withheld = this.withheld;
+            this.withheld = null;
+            withheld.forEach(Action::cancel);
+        }
+        Throwable fail = safeForEach(listeners, ActionListener::after, this);
+        if (childCount == 0)
+            fail = Throwables.merge(fail, transitivelyFinished());
+
+        if (fail != null)
+        {
+            invalidate(false);
+            Throwables.maybeFail(fail);
+        }
+    }
+
+    /**
+     * Invoked once all of the consequences of this action, and of those actions (recursively) have completed.
+     */
+    Throwable transitivelyFinished()
+    {
+        return transitivelyFinished(this);
+    }
+
+    static Throwable transitivelyFinished(Action cur)
+    {
+        Throwable fail = null;
+        while (true)
+        {
+            Action parent = cur.parent;
+            assert 0 == cur.childCount && cur.isFinished();
+            if (DEBUG && cur.registered.values().stream().anyMatch(t -> t == CHILD)) throw new AssertionError();
+            fail = Throwables.merge(fail, safeForEach(cur.listeners, ActionListener::transitivelyAfter, cur));
+            if (parent == null)
+                break;
+            if (DEBUG && CHILD != parent.registered.remove(cur)) throw new AssertionError();
+            if (--parent.childCount == 0 && parent.isFinished()) cur = parent;
+            else break;
+        }
+        return fail;
+    }
+
+    void orderOn(OrderOn orderOn)
+    {
+        this.orderOn = this.orderOn.with(orderOn);
+    }
+
+    void setupOrdering(ActionSchedule schedule)
+    {
+        if (orderOn.isOrdered())
+        {
+            ordered = orderOn.isStrict() ? new StrictlyOrdered(this, schedule) : new Ordered(this, schedule);
+            for (int i = 0, maxi = orderOn.size(); i < maxi ; ++i)
+                ordered.join(orderOn.get(i));
+        }
+    }
+
+    void advanceTo(Phase phase)
+    {
+        Preconditions.checkArgument(phase.compareTo(this.phase) > 0);
+        this.phase = phase;
+    }
+
+    void addTo(PriorityQueue<Action> byDeadline)
+    {
+        Preconditions.checkState(scheduledIndex < 0);
+        scheduledIn = byDeadline;
+        byDeadline.add(this);
+    }
+
+    void saveIn(PriorityQueue<Action> saveIn)
+    {
+        Preconditions.checkState(savedIndex < 0);
+        savedIn = saveIn;
+        saveIn.add(this);
+    }
+
+    void setScheduler(RunnableActionScheduler scheduler)
+    {
+        Preconditions.checkState(this.scheduler == null);
+        Preconditions.checkState(this.phase == NASCENT);
+        this.scheduler = scheduler;
+    }
+
+    void setConsequence()
+    {
+        advanceTo(CONSEQUENCE);
+    }
+
+    void schedule(SimulatedTime time, FutureActionScheduler future)
+    {
+        setPriority(time, scheduler.priority());
+        if (is(THREAD_SIGNAL) || deadline == 0)
+        {
+            long newDeadline = deadline == 0 ? time.nanoTime() : deadline;
+            newDeadline += future.schedulerDelayNanos();
+            deadline = newDeadline;
+            time.onTimeEvent("ResetDeadline", newDeadline);
+        }
+    }
+
+    public void setDeadline(SimulatedTime time, long deadlineNanos)
+    {
+        Preconditions.checkState(deadline == 0);
+        Preconditions.checkArgument(deadlineNanos >= deadline);
+        deadline = deadlineNanos;
+        time.onTimeEvent("SetDeadline", deadlineNanos);
+    }
+
+    public void setPriority(SimulatedTime time, double priority)
+    {
+        this.priority = priority;
+        time.onTimeEvent("SetPriority", Double.doubleToLongBits(priority));
+    }
+
+    public long deadline()
+    {
+        if (deadline < 0) throw new AssertionError();
+        return deadline;
+    }
+
+    public double priority()
+    {
+        return priority;
+    }
+
+    @Override
+    public int priorityQueueIndex(DefaultPriorityQueue<?> queue)
+    {
+        if (queue == scheduledIn) return scheduledIndex;
+        else if (queue == savedIn) return savedIndex;
+        else return -1;
+    }
+
+    @Override
+    public void priorityQueueIndex(DefaultPriorityQueue<?> queue, int i)
+    {
+        if (queue == scheduledIn) { scheduledIndex = i; if (i < 0) scheduledIn = null; }
+        else if (queue == savedIn) { savedIndex = i; if (i < 0) savedIn = null; }
+        else throw new IllegalStateException();
+    }
+
+    public int compareByDeadline(Action that)
+    {
+        return Long.compare(this.deadline, that.deadline);
+    }
+
+    public int compareByPriority(Action that)
+    {
+        return Double.compare(this.priority, that.priority);
+    }
+
+    private String describeModifiers()
+    {
+        StringBuilder builder = new StringBuilder("[");
+        for (Modifier modifier : self.contents)
+        {
+            if (modifier.displayId == 0)
+                continue;
+
+            if (!transitive.is(modifier)) builder.append(modifier.displayId);
+            else builder.append(Character.toUpperCase(modifier.displayId));
+        }
+
+        boolean hasTransitiveOnly = false;
+        for (Modifier modifier : transitive.contents)
+        {
+            if (modifier.displayId == 0)
+                continue;
+
+            if (!self.is(modifier))
+            {
+                if (!hasTransitiveOnly)
+                {
+                    hasTransitiveOnly = true;
+                    builder.append('(');
+                }
+                builder.append(modifier.displayId);
+            }
+        }
+
+        if (builder.length() == 1)
+            return "";
+
+        if (hasTransitiveOnly)
+            builder.append(')');
+        builder.append(']');
+
+        return builder.toString();
+    }
+
+    public String toString()
+    {
+        return describeModifiers() + description() + (origin != this ? " for " + origin : "");
+    }
+
+    public String toReconcileString()
+    {
+        return this + " at [" + deadline + ',' + priority + ']';
+    }
+
+    private static class StackElement
+    {
+        final Action action;
+        final Deque<Action> children;
+
+        private StackElement(Action action)
+        {
+            this.action = action;
+            this.children = new ArrayDeque<>(action.childCount);
+            for (Map.Entry<Object, RegisteredType> e : action.registered.entrySet())
+            {
+                if (e.getValue() == CHILD)
+                    children.add((Action) e.getKey());
+            }
+        }
+    }
+
+    public String describeCurrentState()
+    {
+        StringBuilder sb = new StringBuilder();
+        Deque<StackElement> stack = new ArrayDeque<>();
+        appendCurrentState(sb);
+
+        stack.push(new StackElement(this));
+        while (!stack.isEmpty())
+        {
+            StackElement last = stack.peek();
+            if (last.children.isEmpty())
+            {
+                stack.pop();
+            }
+            else
+            {
+                Action child = last.children.pop();
+                sb.append('\n');
+                appendPrefix(stack.size(), sb);
+                child.appendCurrentState(sb);
+                stack.push(new StackElement(child));
+            }
+        }
+        return sb.toString();
+    }
+
+    private static void appendPrefix(int count, StringBuilder sb)
+    {
+        while (--count >= 0)
+            sb.append("   |");
+    }
+
+    private void appendCurrentState(StringBuilder sb)
+    {
+        if (!isStarted()) sb.append("NOT_STARTED ");
+        else if (!isFinished()) sb.append("NOT_FINISHED ");
+        if (childCount > 0)
+        {
+            sb.append('(');
+            sb.append(childCount);
+            sb.append(") ");
+        }
+        if (orderOn.isOrdered())
+        {
+            sb.append(orderOn);
+            sb.append(": ");
+        }
+        sb.append(description());
+    }
+
+}
\ No newline at end of file
diff --git a/test/simulator/main/org/apache/cassandra/simulator/ActionList.java b/test/simulator/main/org/apache/cassandra/simulator/ActionList.java
new file mode 100644
index 0000000..64474e6
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/ActionList.java
@@ -0,0 +1,148 @@
+/*
+ * 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.simulator;
+
+import java.util.AbstractCollection;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.google.common.collect.Iterators;
+
+import org.apache.cassandra.simulator.OrderOn.StrictSequential;
+import org.apache.cassandra.utils.Throwables;
+
+import static java.util.Arrays.copyOf;
+
+public class ActionList extends AbstractCollection<Action>
+{
+    private static final ActionList EMPTY = new ActionList(new Action[0]);
+    public static ActionList empty() { return EMPTY; }
+    public static ActionList of(Action action) { return new ActionList(new Action[] { action }); }
+    public static ActionList of(Stream<Action> action) { return new ActionList(action.toArray(Action[]::new)); }
+    public static ActionList of(Collection<Action> actions) { return actions.isEmpty() ? EMPTY : new ActionList(actions.toArray(new Action[0])); }
+    public static ActionList of(Action ... actions) { return new ActionList(actions); }
+
+    private final Action[] actions;
+
+    ActionList(Action[] actions)
+    {
+        this.actions = actions;
+    }
+
+    public int size()
+    {
+        return actions.length;
+    }
+
+    public boolean isEmpty()
+    {
+        return 0 == actions.length;
+    }
+
+    public Action get(int i)
+    {
+        return actions[i];
+    }
+
+    public Iterator<Action> iterator()
+    {
+        return Iterators.forArray(actions);
+    }
+
+    public Stream<Action> stream()
+    {
+        return Stream.of(actions);
+    }
+
+    public ActionList transform(Function<Action, Action> apply)
+    {
+        return ActionList.of(stream().map(apply));
+    }
+
+    public ActionList filter(Predicate<Action> apply)
+    {
+        return ActionList.of(stream().filter(apply));
+    }
+
+    public boolean anyMatch(Predicate<Action> test)
+    {
+        for (int i = 0 ; i < actions.length ; ++i)
+            if (test.test(actions[i])) return true;
+        return false;
+    }
+
+    public ActionList andThen(Action andThen)
+    {
+        return andThen(ActionList.of(andThen));
+    }
+
+    public ActionList andThen(ActionList andThen)
+    {
+        Action[] result = copyOf(actions, size() + andThen.size());
+        System.arraycopy(andThen.actions, 0, result, size(), andThen.size());
+        return new ActionList(result);
+    }
+
+    public ActionList setStrictlySequential()
+    {
+        return setStrictlySequentialOn(this);
+    }
+
+    public ActionList setStrictlySequentialOn(Object on)
+    {
+        if (isEmpty()) return this;
+        StrictSequential orderOn = new StrictSequential(on);
+        forEach(a -> a.orderOn(orderOn));
+        return this;
+    }
+
+    public Throwable safeForEach(Consumer<Action> forEach)
+    {
+        Throwable result = null;
+        for (Action action : actions)
+        {
+            try
+            {
+                forEach.accept(action);
+            }
+            catch (Throwable t)
+            {
+                result = Throwables.merge(result, t);
+            }
+        }
+        return result;
+    }
+
+    public String toString()
+    {
+        return Arrays.toString(actions);
+    }
+
+    public String toReconcileString()
+    {
+        return Arrays.stream(actions).map(Action::toReconcileString).collect(Collectors.joining(",", "[", "]"));
+    }
+}
+
diff --git a/test/simulator/main/org/apache/cassandra/simulator/ActionListener.java b/test/simulator/main/org/apache/cassandra/simulator/ActionListener.java
new file mode 100644
index 0000000..2bc8ae8
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/ActionListener.java
@@ -0,0 +1,201 @@
+/*
+ * 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.simulator;
+
+import java.util.List;
+import java.util.function.Consumer;
+
+public interface ActionListener
+{
+    enum Before { EXECUTE, DROP, INVALIDATE }
+
+    /**
+     * Immediately before the action is first executed
+     * @param action the action we are about to perform
+     * @param before if the action is to be performed (rather than dropped)
+     */
+    default void before(Action action, Before before) {}
+
+    /**
+     * Immediately after the action is first executed (or dropped)
+     * @param consequences the actions that result from the execution
+     */
+    default void consequences(ActionList consequences) {}
+
+    /**
+     * If an ActionThread, after termination; otherwise immediately after invoked
+     * @param finished the action that has finished
+     */
+    default void after(Action finished) {}
+
+    /**
+     * After the action and all its consequent terminate (excluding the initiation of an infinite loop execution)
+     * @param finished the action that has finished
+     */
+    default void transitivelyAfter(Action finished) {}
+
+    static ActionListener runAfter(Consumer<Action> after)
+    {
+        return new ActionListener()
+        {
+            @Override
+            public void after(Action performed)
+            {
+                after.accept(performed);
+            }
+        };
+    }
+
+    static ActionListener runAfterAndTransitivelyAfter(Consumer<Action> after)
+    {
+        return new ActionListener()
+        {
+            @Override
+            public void after(Action performed)
+            {
+                after.accept(performed);
+            }
+
+            @Override
+            public void transitivelyAfter(Action performed)
+            {
+                after.accept(performed);
+            }
+        };
+    }
+
+    static ActionListener runAfterTransitiveClosure(Consumer<Action> transitivelyAfter)
+    {
+        return new ActionListener()
+        {
+            @Override
+            public void transitivelyAfter(Action performed)
+            {
+                transitivelyAfter.accept(performed);
+            }
+        };
+    }
+
+    static ActionListener recursive(ActionListener runOnAll)
+    {
+        return new WrappedRecursiveActionListener(runOnAll);
+    }
+
+    public interface SelfAddingActionListener extends ActionListener, Consumer<Action>
+    {
+        @Override
+        default public void accept(Action action)
+        {
+            action.register(this);
+        }
+    }
+
+    public static class RecursiveActionListener implements SelfAddingActionListener
+    {
+        @Override
+        public void consequences(ActionList consequences)
+        {
+            consequences.forEach(this);
+        }
+    }
+
+    public static class WrappedRecursiveActionListener extends Wrapped implements SelfAddingActionListener
+    {
+        public WrappedRecursiveActionListener(ActionListener wrap)
+        {
+            super(wrap);
+        }
+
+        @Override
+        public void consequences(ActionList consequences)
+        {
+            consequences.forEach(this);
+            super.consequences(consequences);
+        }
+    }
+
+    public static class Wrapped implements ActionListener
+    {
+        final ActionListener wrap;
+
+        public Wrapped(ActionListener wrap)
+        {
+            this.wrap = wrap;
+        }
+
+        @Override
+        public void before(Action action, Before before)
+        {
+            wrap.before(action, before);
+        }
+
+        @Override
+        public void consequences(ActionList consequences)
+        {
+            wrap.consequences(consequences);
+        }
+
+        @Override
+        public void after(Action finished)
+        {
+            wrap.after(finished);
+        }
+
+        @Override
+        public void transitivelyAfter(Action finished)
+        {
+            wrap.transitivelyAfter(finished);
+        }
+    }
+
+    public static class Combined implements ActionListener
+    {
+        final List<ActionListener> combined;
+
+        public Combined(List<ActionListener> combined)
+        {
+            this.combined = combined;
+        }
+
+        @Override
+        public void before(Action action, Before before)
+        {
+            combined.forEach(listener -> listener.before(action, before));
+        }
+
+        @Override
+        public void consequences(ActionList consequences)
+        {
+            combined.forEach(listener -> listener.consequences(consequences));
+        }
+
+        @Override
+        public void after(Action finished)
+        {
+            combined.forEach(listener -> listener.after(finished));
+        }
+
+        @Override
+        public void transitivelyAfter(Action finished)
+        {
+            combined.forEach(listener -> listener.transitivelyAfter(finished));
+        }
+    }
+}
+
diff --git a/test/simulator/main/org/apache/cassandra/simulator/ActionPlan.java b/test/simulator/main/org/apache/cassandra/simulator/ActionPlan.java
new file mode 100644
index 0000000..1813de0
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/ActionPlan.java
@@ -0,0 +1,90 @@
+/*
+ * 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.simulator;
+
+import java.util.List;
+import java.util.function.LongSupplier;
+
+import com.google.common.collect.ImmutableList;
+
+import org.apache.cassandra.simulator.ActionSchedule.Work;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.utils.CloseableIterator;
+
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.FINITE;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.UNLIMITED;
+
+public class ActionPlan
+{
+    /**
+     * Actions to perform (reliably, and in strict order) before starting the proper simulation
+     */
+    public final ActionList pre;
+
+    /**
+     * List of action sequences, each representing the actions planned by a given actor, that will
+     * be performed in the provided sequence but otherwise randomly interleaved with the other action sequences.
+     * These planned actions may initiate other actions, that will all complete before the next planned action
+     * for that action sequence is started.
+     */
+    public final List<ActionList> interleave;
+
+    /**
+     * Actions to perform (reliably, and in strict order) after finishing the proper simulation.
+     *
+     * This is only run if the simulation was successful, so no cleanup should be performed here unless optional.
+     */
+    public final ActionList post;
+
+    public ActionPlan(ActionList pre, List<ActionList> interleave, ActionList post)
+    {
+        this.pre = pre;
+        this.interleave = interleave;
+        this.post = post;
+    }
+
+    public CloseableIterator<?> iterator(ActionSchedule.Mode mode, long runForNanos, LongSupplier schedulerJitter, SimulatedTime time, RunnableActionScheduler runnableScheduler, FutureActionScheduler futureScheduler)
+    {
+        return new ActionSchedule(time, futureScheduler, schedulerJitter, runnableScheduler,
+                                  new Work(UNLIMITED, singletonList(pre.setStrictlySequential())),
+                                  new Work(mode, runForNanos, interleave),
+                                  new Work(FINITE, singletonList(post.setStrictlySequential())));
+    }
+
+    public static ActionPlan interleave(List<ActionList> interleave)
+    {
+        return new ActionPlan(ActionList.empty(), interleave, ActionList.empty());
+    }
+
+    public static ActionPlan setUpTearDown(ActionList pre, ActionList post)
+    {
+        return new ActionPlan(pre, emptyList(), post);
+    }
+
+    public ActionPlan encapsulate(ActionPlan that)
+    {
+        return new ActionPlan(
+                this.pre.andThen(that.pre),
+                ImmutableList.<ActionList>builder().addAll(this.interleave).addAll(that.interleave).build(),
+                that.post.andThen(this.post));
+    }
+}
+
diff --git a/test/simulator/main/org/apache/cassandra/simulator/ActionSchedule.java b/test/simulator/main/org/apache/cassandra/simulator/ActionSchedule.java
new file mode 100644
index 0000000..18fc877
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/ActionSchedule.java
@@ -0,0 +1,438 @@
+/*
+ * 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.simulator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.function.LongConsumer;
+import java.util.function.LongSupplier;
+import java.util.stream.Stream;
+
+import com.google.common.base.Preconditions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.netty.util.internal.DefaultPriorityQueue;
+import io.netty.util.internal.PriorityQueue;
+import org.apache.cassandra.simulator.OrderOn.OrderOnId;
+import org.apache.cassandra.simulator.Ordered.Sequence;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.simulator.utils.SafeCollections;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.Throwables;
+
+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;
+import static org.apache.cassandra.simulator.Action.Phase.READY_TO_SCHEDULE;
+import static org.apache.cassandra.simulator.Action.Phase.RUNNABLE;
+import static org.apache.cassandra.simulator.Action.Phase.SCHEDULED;
+import static org.apache.cassandra.simulator.Action.Phase.SEQUENCED_POST_SCHEDULED;
+import static org.apache.cassandra.simulator.Action.Phase.SEQUENCED_PRE_SCHEDULED;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.TIME_LIMITED;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.UNLIMITED;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.simulator.SimulatorUtils.dumpStackTraces;
+
+/**
+ * TODO (feature): support total stalls on specific nodes
+ *
+ * This class coordinates the running of actions that have been planned by an ActionPlan, or are the consequences
+ * of actions that have been executed by such a plan. This coordination includes enforcing all {@link OrderOn}
+ * criteria, and running DAEMON (recurring scheduled) tasks.
+ *
+ * Note there is a distinct scheduling mechanism {@link org.apache.cassandra.simulator.Action.Modifier#WITHHOLD}
+ * that is coordinated by an Action and its parent, that is used to prevent certain actions from running unless
+ * all descendants have executed (with the aim of it ordinarily being invalidated before this happens), and this
+ * is not imposed here because it would be more complicated to manage.
+ */
+public class ActionSchedule implements CloseableIterator<Object>, LongConsumer
+{
+    private static final Logger logger = LoggerFactory.getLogger(ActionList.class);
+
+    public enum Mode { TIME_LIMITED, STREAM_LIMITED, TIME_AND_STREAM_LIMITED, FINITE, UNLIMITED }
+
+    public static class Work
+    {
+        final Mode mode;
+        final long runForNanos;
+        final List<ActionList> actors;
+
+        public Work(Mode mode, List<ActionList> actors)
+        {
+            this(mode, -1, actors);
+            Preconditions.checkArgument(mode != TIME_LIMITED);
+        }
+
+        public Work(long runForNanos, List<ActionList> actors)
+        {
+            this(TIME_LIMITED, runForNanos, actors);
+            Preconditions.checkArgument(runForNanos > 0);
+        }
+
+        public Work(Mode mode, long runForNanos, List<ActionList> actors)
+        {
+            this.mode = mode;
+            this.runForNanos = runForNanos;
+            this.actors = actors;
+        }
+    }
+
+    public static class ReconcileItem
+    {
+        final long start, end;
+        final Action performed;
+        final ActionList result;
+
+        public ReconcileItem(long start, long end, Action performed, ActionList result)
+        {
+            this.start = start;
+            this.end = end;
+            this.performed = performed;
+            this.result = result;
+        }
+
+        public String toString()
+        {
+            return "run:" + performed.toReconcileString() + "; next:" + result.toReconcileString()
+                   + "; between [" + start + ',' + end + ']';
+        }
+    }
+
+    final SimulatedTime time;
+    final FutureActionScheduler scheduler;
+    final RunnableActionScheduler runnableScheduler;
+    final LongSupplier schedulerJitter; // we will prioritise all actions scheduled to run within this period of the current oldest action
+    long currentJitter, currentJitterUntil;
+
+    // Action flow is:
+    //    perform() -> [withheld]
+    //              -> consequences
+    //              -> [pendingDaemonWave | <invalidate daemon>]
+    //              -> [sequences (if ordered and SEQUENCE_EAGERLY)]
+    //              -> [scheduled]
+    //              -> [sequences (if ordered and !SEQUENCE_EAGERLY)]
+    //              -> runnable + [runnableByScheduledAt]
+    final Map<OrderOn, Sequence> sequences = new HashMap<>();
+    // queue of items that are not yet runnable sorted by deadline
+    final PriorityQueue<Action> scheduled = new DefaultPriorityQueue<>(Action::compareByDeadline, 128);
+    // queue of items that are runnable (i.e. within scheduler jitter of min deadline) sorted by their execution order (i.e. priority)
+    final PriorityQueue<Action> runnable = new DefaultPriorityQueue<>(Action::compareByPriority, 128);
+    // auxillary queue of items that are runnable so that we may track the time span covered by runnable items we are randomising execution of
+    final PriorityQueue<Action> runnableByDeadline = new DefaultPriorityQueue<>(Action::compareByDeadline, 128);
+
+    private Mode mode;
+
+    // if running in TIME_LIMITED mode, stop ALL streams (finite or infinite) and daemon tasks once we pass this point
+    private long runUntilNanos;
+
+    // if running in STREAM_LIMITED mode, stop infinite streams once we have no more finite streams to process
+    private int activeFiniteStreamCount;
+
+    // If running in UNLIMITED mode, release daemons (recurring tasks) in waves,
+    // so we can simplify checking if they're all that's running
+    // TODO (cleanup): we can do better than this, probably most straightforwardly by ensuring daemon actions
+    //                 have a consistent but unique id(), and managing the set of these.
+    private int activeDaemonWaveCount;
+    private int pendingDaemonWaveCountDown;
+    private DefaultPriorityQueue<Action> pendingDaemonWave;
+
+    private final Iterator<Work> moreWork;
+
+    public ActionSchedule(SimulatedTime time, FutureActionScheduler futureScheduler, LongSupplier schedulerJitter, RunnableActionScheduler runnableScheduler, Work... moreWork)
+    {
+        this(time, futureScheduler, runnableScheduler, schedulerJitter, Arrays.asList(moreWork).iterator());
+    }
+
+    public ActionSchedule(SimulatedTime time, FutureActionScheduler futureScheduler, RunnableActionScheduler runnableScheduler, LongSupplier schedulerJitter, Iterator<Work> moreWork)
+    {
+        this.time = time;
+        this.runnableScheduler = runnableScheduler;
+        this.time.onDiscontinuity(this);
+        this.scheduler = futureScheduler;
+        this.schedulerJitter = schedulerJitter;
+        this.moreWork = moreWork;
+        moreWork();
+    }
+
+    void add(Action action)
+    {
+        Preconditions.checkState(action.phase() == CONSEQUENCE);
+        action.schedule(time, scheduler);
+        action.setupOrdering(this);
+        if (action.is(STREAM) && !action.is(DAEMON))
+            ++activeFiniteStreamCount;
+
+        switch (mode)
+        {
+            default: throw new AssertionError();
+            case TIME_AND_STREAM_LIMITED:
+                if ((activeFiniteStreamCount == 0 || time.nanoTime() >= runUntilNanos) && action.is(DAEMON))
+                {
+                    action.cancel();
+                    return;
+                }
+                break;
+            case TIME_LIMITED:
+                if (time.nanoTime() >= runUntilNanos && (action.is(DAEMON) || action.is(STREAM)))
+                {
+                    action.cancel();
+                    return;
+                }
+                break;
+            case STREAM_LIMITED:
+                if (activeFiniteStreamCount == 0 && action.is(DAEMON))
+                {
+                    action.cancel();
+                    return;
+                }
+                break;
+            case UNLIMITED:
+                if (action.is(STREAM)) throw new IllegalStateException();
+                if (action.is(DAEMON))
+                {
+                    action.saveIn(pendingDaemonWave);
+                    action.advanceTo(READY_TO_SCHEDULE);
+                    return;
+                }
+                break;
+            case FINITE:
+                if (action.is(STREAM)) throw new IllegalStateException();
+                break;
+        }
+        action.advanceTo(READY_TO_SCHEDULE);
+        advance(action);
+    }
+
+    void advance(Action action)
+    {
+        switch (action.phase())
+        {
+            default:
+                throw new AssertionError();
+
+            case CONSEQUENCE:
+                    // this should only happen if we invalidate an Ordered action that tries to
+                    // enqueue one of the actions we are in the middle of scheduling for the first time
+                    return;
+
+            case READY_TO_SCHEDULE:
+                if (action.ordered != null && action.ordered.waitPreScheduled())
+                {
+                    action.advanceTo(SEQUENCED_PRE_SCHEDULED);
+                    return;
+                }
+
+            case SEQUENCED_PRE_SCHEDULED:
+                if (action.deadline() > time.nanoTime())
+                {
+                    action.addTo(scheduled);
+                    action.advanceTo(SCHEDULED);
+                    return;
+                }
+
+            case SCHEDULED:
+                if (action.ordered != null && action.ordered.waitPostScheduled())
+                {
+                    action.advanceTo(SEQUENCED_POST_SCHEDULED);
+                    return;
+                }
+
+            case SEQUENCED_POST_SCHEDULED:
+                action.addTo(runnable);
+                action.saveIn(runnableByDeadline);
+                action.advanceTo(RUNNABLE);
+        }
+    }
+
+    void add(ActionList add)
+    {
+        if (add.isEmpty())
+            return;
+
+        add.forEach(this::add);
+    }
+
+    public boolean hasNext()
+    {
+        if (!runnable.isEmpty() || !scheduled.isEmpty())
+            return true;
+
+        while (moreWork())
+        {
+            if (!runnable.isEmpty() || !scheduled.isEmpty())
+                return true;
+        }
+
+        if (!sequences.isEmpty())
+        {
+            // TODO (feature): detection of which action is blocking progress, and logging of its stack trace only
+            Stream<Action> actions;
+            if (Ordered.DEBUG)
+            {
+                logger.error("Simulation failed to make progress; blocked task graph:");
+                actions = sequences.values()
+                                   .stream()
+                                   .flatMap(s -> Stream.concat(s.maybeRunning.stream(), s.next.stream()))
+                                   .map(o -> o.ordered().action);
+            }
+            else
+            {
+                logger.error("Simulation failed to make progress. Run with -Dcassandra.test.simulator.debug=true to see the blocked task graph. Blocked tasks:");
+                actions = sequences.values()
+                                   .stream()
+                                   .filter(s -> s.on instanceof OrderOnId)
+                                   .map(s -> ((OrderOnId) s.on).id)
+                                   .flatMap(s -> s instanceof ActionList ? ((ActionList) s).stream() : Stream.empty());
+            }
+
+            actions.filter(Action::isStarted)
+                   .distinct()
+                   .sorted(Comparator.comparingLong(a -> ((long) ((a.isStarted() ? 1 : 0) + (a.isFinished() ? 2 : 0)) << 32) | a.childCount()))
+                   .forEach(a -> logger.error(a.describeCurrentState()));
+
+            logger.error("Thread stack traces:");
+            dumpStackTraces(logger);
+            throw failWithOOM();
+        }
+
+        return false;
+    }
+
+    private boolean moreWork()
+    {
+        if (!moreWork.hasNext())
+            return false;
+
+        Work work = moreWork.next();
+        this.runUntilNanos = work.runForNanos < 0 ? -1 : time.nanoTime() + work.runForNanos;
+        Mode oldMode = mode;
+        mode = work.mode;
+        if (oldMode != work.mode)
+        {
+            if (work.mode == UNLIMITED)
+            {
+                this.pendingDaemonWave = new DefaultPriorityQueue<>(Action::compareByPriority, 128);
+            }
+            else if (oldMode == UNLIMITED)
+            {
+                while (!pendingDaemonWave.isEmpty())
+                    advance(pendingDaemonWave.poll());
+                pendingDaemonWave = null;
+            }
+        }
+        work.actors.forEach(runnableScheduler::attachTo);
+        work.actors.forEach(a -> a.forEach(Action::setConsequence));
+        work.actors.forEach(this::add);
+        return true;
+    }
+
+    public Object next()
+    {
+        long now = time.nanoTime();
+        if (now >= currentJitterUntil)
+        {
+            currentJitter = schedulerJitter.getAsLong();
+            currentJitterUntil = now + currentJitter + schedulerJitter.getAsLong();
+        }
+        if (!scheduled.isEmpty())
+        {
+            long scheduleUntil = Math.min((runnableByDeadline.isEmpty() ? now : runnableByDeadline.peek().deadline())
+                                          + currentJitter, currentJitterUntil);
+
+            while (!scheduled.isEmpty() && (runnable.isEmpty() || scheduled.peek().deadline() <= scheduleUntil))
+                advance(scheduled.poll());
+        }
+
+        Action perform = runnable.poll();
+        if (perform == null)
+            throw new NoSuchElementException();
+
+        if (!runnableByDeadline.remove(perform) && perform.deadline() > 0)
+            throw new IllegalStateException();
+        time.tick(perform.deadline());
+        maybeScheduleDaemons(perform);
+
+        ActionList consequences = perform.perform();
+        add(consequences);
+        if (perform.is(STREAM) && !perform.is(DAEMON))
+            --activeFiniteStreamCount;
+
+        long end = time.nanoTime();
+        return new ReconcileItem(now, end, perform, consequences);
+    }
+
+    private void maybeScheduleDaemons(Action perform)
+    {
+        if (pendingDaemonWave != null)
+        {
+            if (perform.is(DAEMON) && --activeDaemonWaveCount == 0)
+            {
+                pendingDaemonWaveCountDown = Math.max(128, 16 * (scheduled.size() + pendingDaemonWave.size()));
+            }
+            else if (activeDaemonWaveCount == 0 && --pendingDaemonWaveCountDown <= 0)
+            {
+                activeDaemonWaveCount = pendingDaemonWave.size();
+                while (!pendingDaemonWave.isEmpty())
+                    advance(pendingDaemonWave.poll());
+                if (activeDaemonWaveCount == 0) pendingDaemonWaveCountDown = Math.max(128, 16 * scheduled.size());
+            }
+        }
+    }
+
+    public void close()
+    {
+        if (sequences.isEmpty() && scheduled.isEmpty() && runnable.isEmpty()
+            && (pendingDaemonWave == null || pendingDaemonWave.isEmpty()) && !moreWork.hasNext())
+            return;
+
+        List<Sequence> invalidateSequences = new ArrayList<>(this.sequences.values());
+        List<Action> invalidateActions = new ArrayList<>(scheduled.size() + runnable.size() + (pendingDaemonWave == null ? 0 : pendingDaemonWave.size()));
+        invalidateActions.addAll(scheduled);
+        invalidateActions.addAll(runnable);
+        if (pendingDaemonWave != null)
+            invalidateActions.addAll(pendingDaemonWave);
+        while (moreWork.hasNext())
+            moreWork.next().actors.forEach(invalidateActions::addAll);
+
+        Throwable fail = SafeCollections.safeForEach(invalidateSequences, Sequence::invalidatePending);
+        fail = Throwables.merge(fail, SafeCollections.safeForEach(invalidateActions, Action::invalidate));
+        scheduled.clear();
+        runnable.clear();
+        runnableByDeadline.clear();
+        if (pendingDaemonWave != null)
+            pendingDaemonWave.clear();
+        sequences.clear();
+        Throwables.maybeFail(fail);
+    }
+
+    @Override
+    public void accept(long discontinuity)
+    {
+        if (runUntilNanos > 0)
+            runUntilNanos += discontinuity;
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/Actions.java b/test/simulator/main/org/apache/cassandra/simulator/Actions.java
new file mode 100644
index 0000000..eea1dd9
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/Actions.java
@@ -0,0 +1,158 @@
+/*
+ * 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.simulator;
+
+import java.util.function.Supplier;
+
+import org.apache.cassandra.simulator.Action.Modifiers;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.INFINITE_STREAM;
+import static org.apache.cassandra.simulator.Action.Modifiers.INFINITE_STREAM_ITEM;
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+import static org.apache.cassandra.simulator.Action.Modifiers.STREAM;
+import static org.apache.cassandra.simulator.Action.Modifiers.STREAM_ITEM;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+import static org.apache.cassandra.utils.LazyToString.lazy;
+
+public class Actions
+{
+    public static class LambdaAction extends Action
+    {
+        private Supplier<ActionList> perform;
+
+        public LambdaAction(Object description, Supplier<ActionList> perform)
+        {
+            this(description, Modifiers.NONE, perform);
+        }
+
+        public LambdaAction(Object description, Modifiers self, Supplier<ActionList> perform)
+        {
+            this(description, self, Modifiers.NONE, perform);
+        }
+
+        public LambdaAction(Object description, Modifiers self, Modifiers children, Supplier<ActionList> perform)
+        {
+            this(description, OrderOn.NONE, self, children, perform);
+        }
+
+        public LambdaAction(Object description, OrderOn orderOn, Modifiers self, Modifiers children, Supplier<ActionList> perform)
+        {
+            super(description, orderOn, self, children);
+            this.perform = perform;
+        }
+
+        protected ActionList performSimple()
+        {
+            ActionList result = perform.get();
+            perform = null;
+            return result;
+        }
+    }
+
+    /**
+     * Should always be performed eventually.
+     */
+    public static class ReliableAction extends LambdaAction
+    {
+        public ReliableAction(Object description, Supplier<ActionList> perform, boolean transitive)
+        {
+            this(description, RELIABLE, transitive ? RELIABLE : NONE, perform);
+        }
+
+        public ReliableAction(Object description, Modifiers self, Modifiers children, Supplier<ActionList> perform)
+        {
+            this(description, OrderOn.NONE, self, children, perform);
+        }
+
+        public ReliableAction(Object description, OrderOn orderOn, Modifiers self, Modifiers children, Supplier<ActionList> perform)
+        {
+            super(description, orderOn, self, children, perform);
+            assert !is(Modifier.DROP);
+            assert children.is(Modifier.RELIABLE);
+        }
+
+        public static ReliableAction transitively(Object description, Supplier<ActionList> action)
+        {
+            return new ReliableAction(description, action, true);
+        }
+    }
+
+    /**
+     * Should always be performed in strict order, i.e. all of this action's child actions should complete before
+     * the next action scheduled by the same actor is invoked.
+     */
+    public static class StrictAction extends LambdaAction
+    {
+        public StrictAction(Object description, Supplier<ActionList> perform, boolean transitive)
+        {
+            super(description, STRICT, transitive ? STRICT : NONE, perform);
+        }
+
+        public static StrictAction of(Object description, Supplier<ActionList> action)
+        {
+            return new StrictAction(description, action, false);
+        }
+    }
+
+    public static Action of(Object description, Supplier<ActionList> action)
+    {
+        return new LambdaAction(description, action);
+    }
+
+    public static Action of(Modifiers self, Modifiers children, Object description, Supplier<ActionList> action)
+    {
+        return new LambdaAction(description, self, children, action);
+    }
+
+    public static Action of(OrderOn orderOn, Modifiers self, Modifiers children, Object description, Supplier<ActionList> action)
+    {
+        return new LambdaAction(description, orderOn, self, children, action);
+    }
+
+    public static Action empty(String message)
+    {
+        return of(message, ActionList::empty);
+    }
+
+    public static Action empty(Modifiers modifiers, Object message)
+    {
+        return of(modifiers, NONE, message, ActionList::empty);
+    }
+
+    public static Action stream(int concurrency, Supplier<Action> actions) { return stream(new OrderOn.Strict(actions, concurrency), actions); }
+    public static Action stream(OrderOn on, Supplier<Action> actions) { return of(OrderOn.NONE, STREAM, NONE, on, () -> ActionList.of(streamNextSupplier(STREAM, STREAM_ITEM, on, 0, on, actions))); }
+    public static Action infiniteStream(int concurrency, Supplier<Action> actions) { return infiniteStream(new OrderOn.Strict(actions, concurrency), actions); }
+    public static Action infiniteStream(OrderOn on, Supplier<Action> actions) { return of(OrderOn.NONE, INFINITE_STREAM, NONE, on, () -> ActionList.of(streamNextSupplier(INFINITE_STREAM, INFINITE_STREAM_ITEM, on, 0, on, actions))); }
+    private static ActionList next(Modifiers modifiers, Object description, int sequence, OrderOn on, Supplier<Action> actions)
+    {
+        Action next = actions.get();
+        if (next == null)
+            return ActionList.empty();
+        return ActionList.of(next, streamNextSupplier(modifiers, modifiers, description, sequence + 1, on, actions));
+    }
+
+    private static Action streamNextSupplier(Modifiers modifiers, Modifiers nextModifiers, Object description, int sequence, OrderOn on, Supplier<Action> actions)
+    {
+        return Actions.of(on, modifiers, NONE,
+                          lazy(() -> description + " " + sequence), () -> next(nextModifiers, description, sequence, on, actions));
+    }
+
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/ClusterSimulation.java b/test/simulator/main/org/apache/cassandra/simulator/ClusterSimulation.java
new file mode 100644
index 0000000..caf642e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/ClusterSimulation.java
@@ -0,0 +1,835 @@
+/*
+ * 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.simulator;
+
+import java.io.IOException;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.nio.file.FileSystem;
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
+import java.util.function.IntSupplier;
+import java.util.function.LongConsumer;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+
+import com.google.common.jimfs.Configuration;
+import com.google.common.jimfs.Jimfs;
+import com.google.common.util.concurrent.AsyncFunction;
+import com.google.common.util.concurrent.FutureCallback;
+
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.config.ParameterizedClass;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.Feature;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.distributed.api.IInstanceInitializer;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableBiConsumer;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableConsumer;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
+import org.apache.cassandra.distributed.impl.DirectStreamingConnectionFactory;
+import org.apache.cassandra.distributed.impl.IsolatedExecutor;
+import org.apache.cassandra.io.compress.LZ4Compressor;
+import org.apache.cassandra.service.paxos.BallotGenerator;
+import org.apache.cassandra.service.paxos.PaxosPrepare;
+import org.apache.cassandra.simulator.RandomSource.Choices;
+import org.apache.cassandra.simulator.asm.InterceptAsClassTransformer;
+import org.apache.cassandra.simulator.asm.NemesisFieldSelectors;
+import org.apache.cassandra.simulator.cluster.ClusterActions;
+import org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange;
+import org.apache.cassandra.simulator.systems.Failures;
+import org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites.Capture;
+import org.apache.cassandra.simulator.systems.InterceptibleThread;
+import org.apache.cassandra.simulator.systems.InterceptingGlobalMethods;
+import org.apache.cassandra.simulator.systems.InterceptingGlobalMethods.ThreadLocalRandomCheck;
+import org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods;
+import org.apache.cassandra.simulator.systems.InterceptingExecutorFactory;
+import org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods.IfInterceptibleThread;
+import org.apache.cassandra.simulator.systems.NetworkConfig;
+import org.apache.cassandra.simulator.systems.NetworkConfig.PhaseConfig;
+import org.apache.cassandra.simulator.systems.SchedulerConfig;
+import org.apache.cassandra.simulator.systems.SimulatedFutureActionScheduler;
+import org.apache.cassandra.simulator.systems.SimulatedSystems;
+import org.apache.cassandra.simulator.systems.SimulatedBallots;
+import org.apache.cassandra.simulator.systems.SimulatedExecution;
+import org.apache.cassandra.simulator.systems.SimulatedFailureDetector;
+import org.apache.cassandra.simulator.systems.SimulatedMessageDelivery;
+import org.apache.cassandra.simulator.systems.SimulatedSnitch;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.simulator.utils.ChanceRange;
+import org.apache.cassandra.simulator.utils.IntRange;
+import org.apache.cassandra.simulator.utils.KindOfSequence;
+import org.apache.cassandra.simulator.utils.LongRange;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Throwables;
+import org.apache.cassandra.utils.concurrent.Ref;
+import org.apache.cassandra.utils.memory.BufferPool;
+import org.apache.cassandra.utils.memory.BufferPools;
+import org.apache.cassandra.utils.memory.HeapPool;
+
+import static java.lang.Integer.min;
+import static java.util.Collections.emptyMap;
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.distributed.impl.AbstractCluster.getSharedClassPredicate;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.utils.Shared.Scope.ANY;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * Wraps a Cluster and a Simulation to run upon it
+ */
+@SuppressWarnings("RedundantCast")
+public class ClusterSimulation<S extends Simulation> implements AutoCloseable
+{
+    public static final Class<?>[] SHARE = new Class[]
+                                        {
+                                            AsyncFunction.class,
+                                            FutureCallback.class,
+                                            io.netty.util.concurrent.GenericFutureListener.class,
+                                            io.netty.channel.FileRegion.class,
+                                            io.netty.util.ReferenceCounted.class
+                                        };
+
+    public static final Class<?>[] ISOLATE = new Class<?>[0];
+
+    public interface SimulationFactory<S extends Simulation>
+    {
+        S create(SimulatedSystems simulated, RunnableActionScheduler scheduler, Cluster cluster, ClusterActions.Options options);
+    }
+
+    public interface SchedulerFactory
+    {
+        RunnableActionScheduler create(RandomSource random);
+    }
+
+    @SuppressWarnings("UnusedReturnValue")
+    public static abstract class Builder<S extends Simulation>
+    {
+        protected Supplier<RandomSource> randomSupplier = RandomSource.Default::new;
+        protected int uniqueNum = 0;
+        protected int threadCount;
+
+        protected int concurrency = 10;
+        protected IntRange nodeCount = new IntRange(4, 16), dcCount = new IntRange(1, 2),
+                        primaryKeySeconds = new IntRange(5, 30), withinKeyConcurrency = new IntRange(2, 5);
+        protected TopologyChange[] topologyChanges = TopologyChange.values();
+        protected int topologyChangeLimit = -1;
+
+        protected int primaryKeyCount;
+        protected int secondsToSimulate;
+
+        protected ChanceRange normalNetworkDropChance  = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0f, 0.001f),
+                              normalNetworkDelayChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.01f, 0.1f),
+                                flakyNetworkDropChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.01f, 0.1f),
+                               flakyNetworkDelayChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.01f, 0.1f),
+                                networkPartitionChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.0f, 0.1f),
+                                    networkFlakyChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.0f, 0.1f),
+                                    monitorDelayChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.01f, 0.1f),
+                                  schedulerDelayChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.01f, 0.1f),
+                                         timeoutChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.01f, 0.1f),
+                                            readChance = new ChanceRange(RandomSource::uniformFloat,                        0.05f, 0.95f),
+                                         nemesisChance = new ChanceRange(randomSource -> randomSource.qlog2uniformFloat(4), 0.001f, 0.01f);
+
+        protected LongRange normalNetworkLatencyNanos = new LongRange(1, 2, MILLISECONDS, NANOSECONDS),
+                              normalNetworkDelayNanos = new LongRange(2, 100, MILLISECONDS, NANOSECONDS),
+                             flakyNetworkLatencyNanos = new LongRange(2, 100, MILLISECONDS, NANOSECONDS),
+                               flakyNetworkDelayNanos = new LongRange(2, 100, MILLISECONDS, NANOSECONDS),
+                           networkReconfigureInterval = new LongRange(50, 5000, MICROSECONDS, NANOSECONDS),
+                                 schedulerJitterNanos = new LongRange(100, 2000, MICROSECONDS, NANOSECONDS),
+                                  schedulerDelayNanos = new LongRange(0, 50, MICROSECONDS, NANOSECONDS),
+                              schedulerLongDelayNanos = new LongRange(50, 5000, MICROSECONDS, NANOSECONDS),
+                                      clockDriftNanos = new LongRange(1, 5000, MILLISECONDS, NANOSECONDS),
+                       clockDiscontinuitIntervalNanos = new LongRange(10, 60, SECONDS, NANOSECONDS),
+                          topologyChangeIntervalNanos = new LongRange(5, 15, SECONDS, NANOSECONDS);
+
+
+
+        protected long contentionTimeoutNanos = MILLISECONDS.toNanos(500L),
+                            writeTimeoutNanos = SECONDS.toNanos(1L),
+                             readTimeoutNanos = SECONDS.toNanos(2L),
+                          requestTimeoutNanos = SECONDS.toNanos(2L);
+
+        protected SchedulerFactory schedulerFactory = schedulerFactory(RunnableActionScheduler.Kind.values());
+
+        protected Debug debug = new Debug();
+        protected Capture capture = new Capture(false, false, false);
+        protected HeapPool.Logged.Listener memoryListener;
+        protected SimulatedTime.Listener timeListener = (i1, i2) -> {};
+        protected LongConsumer onThreadLocalRandomCheck;
+
+        public Debug debug()
+        {
+            return debug;
+        }
+
+        public Builder<S> debug(EnumMap<Debug.Info, Debug.Levels> debug, int[] primaryKeys)
+        {
+            this.debug = new Debug(debug, primaryKeys);
+            return this;
+        }
+
+        public Builder<S> unique(int num)
+        {
+            this.uniqueNum = num;
+            return this;
+        }
+
+        public Builder<S> threadCount(int count)
+        {
+            this.threadCount = count;
+            return this;
+        }
+
+        public Builder<S> nodes(IntRange range)
+        {
+            this.nodeCount = range;
+            return this;
+        }
+
+        public Builder<S> nodes(int min, int max)
+        {
+            this.nodeCount = new IntRange(min, max);
+            return this;
+        }
+
+        public Builder<S> dcs(IntRange range)
+        {
+            this.dcCount = range;
+            return this;
+        }
+
+        public Builder<S> dcs(int min, int max)
+        {
+            this.dcCount = new IntRange(min, max);
+            return this;
+        }
+
+        public Builder<S> concurrency(int concurrency)
+        {
+            this.concurrency = concurrency;
+            return this;
+        }
+
+        public IntRange primaryKeySeconds()
+        {
+            return primaryKeySeconds;
+        }
+
+        public Builder<S> primaryKeySeconds(IntRange range)
+        {
+            this.primaryKeySeconds = range;
+            return this;
+        }
+
+        public Builder<S> withinKeyConcurrency(IntRange range)
+        {
+            this.withinKeyConcurrency = range;
+            return this;
+        }
+
+        public Builder<S> withinKeyConcurrency(int min, int max)
+        {
+            this.withinKeyConcurrency = new IntRange(min, max);
+            return this;
+        }
+
+        public Builder<S> topologyChanges(TopologyChange[] topologyChanges)
+        {
+            this.topologyChanges = topologyChanges;
+            return this;
+        }
+
+        public Builder<S> topologyChangeIntervalNanos(LongRange topologyChangeIntervalNanos)
+        {
+            this.topologyChangeIntervalNanos = topologyChangeIntervalNanos;
+            return this;
+        }
+
+        public Builder<S> topologyChangeLimit(int topologyChangeLimit)
+        {
+            this.topologyChangeLimit = topologyChangeLimit;
+            return this;
+        }
+
+        public int primaryKeyCount()
+        {
+            return primaryKeyCount;
+        }
+
+        public Builder<S> primaryKeyCount(int count)
+        {
+            this.primaryKeyCount = count;
+            return this;
+        }
+
+        public int secondsToSimulate()
+        {
+            return secondsToSimulate;
+        }
+
+        public Builder<S> secondsToSimulate(int seconds)
+        {
+            this.secondsToSimulate = seconds;
+            return this;
+        }
+
+        public Builder<S> networkPartitionChance(ChanceRange partitionChance)
+        {
+            this.networkPartitionChance = partitionChance;
+            return this;
+        }
+
+        public Builder<S> networkFlakyChance(ChanceRange flakyChance)
+        {
+            this.networkFlakyChance = flakyChance;
+            return this;
+        }
+
+        public Builder<S> networkReconfigureInterval(LongRange reconfigureIntervalNanos)
+        {
+            this.networkReconfigureInterval = reconfigureIntervalNanos;
+            return this;
+        }
+
+        public Builder<S> networkDropChance(ChanceRange dropChance)
+        {
+            this.normalNetworkDropChance = dropChance;
+            return this;
+        }
+
+        public Builder<S> networkDelayChance(ChanceRange delayChance)
+        {
+            this.normalNetworkDelayChance = delayChance;
+            return this;
+        }
+
+        public Builder<S> networkLatencyNanos(LongRange networkLatencyNanos)
+        {
+            this.normalNetworkLatencyNanos = networkLatencyNanos;
+            return this;
+        }
+
+        public Builder<S> networkDelayNanos(LongRange networkDelayNanos)
+        {
+            this.normalNetworkDelayNanos = networkDelayNanos;
+            return this;
+        }
+
+        public Builder<S> flakyNetworkDropChance(ChanceRange dropChance)
+        {
+            this.flakyNetworkDropChance = dropChance;
+            return this;
+        }
+
+        public Builder<S> flakyNetworkDelayChance(ChanceRange delayChance)
+        {
+            this.flakyNetworkDelayChance = delayChance;
+            return this;
+        }
+
+        public Builder<S> flakyNetworkLatencyNanos(LongRange networkLatencyNanos)
+        {
+            this.flakyNetworkLatencyNanos = networkLatencyNanos;
+            return this;
+        }
+
+        public Builder<S> flakyNetworkDelayNanos(LongRange networkDelayNanos)
+        {
+            this.flakyNetworkDelayNanos = networkDelayNanos;
+            return this;
+        }
+
+        public Builder<S> clockDriftNanos(LongRange clockDriftNanos)
+        {
+            this.clockDriftNanos = clockDriftNanos;
+            return this;
+        }
+
+        public Builder<S> clockDiscontinuityIntervalNanos(LongRange clockDiscontinuityIntervalNanos)
+        {
+            this.clockDiscontinuitIntervalNanos = clockDiscontinuityIntervalNanos;
+            return this;
+        }
+
+        public Builder<S> schedulerDelayChance(ChanceRange delayChance)
+        {
+            this.schedulerDelayChance = delayChance;
+            return this;
+        }
+
+        public Builder<S> schedulerJitterNanos(LongRange schedulerJitterNanos)
+        {
+            this.schedulerJitterNanos = schedulerJitterNanos;
+            return this;
+        }
+
+        public LongRange schedulerJitterNanos()
+        {
+            return schedulerJitterNanos;
+        }
+
+        public Builder<S> schedulerDelayNanos(LongRange schedulerDelayNanos)
+        {
+            this.schedulerDelayNanos = schedulerDelayNanos;
+            return this;
+        }
+
+        public Builder<S> schedulerLongDelayNanos(LongRange schedulerLongDelayNanos)
+        {
+            this.schedulerLongDelayNanos = schedulerLongDelayNanos;
+            return this;
+        }
+
+        public Builder<S> timeoutChance(ChanceRange timeoutChance)
+        {
+            this.timeoutChance = timeoutChance;
+            return this;
+        }
+
+        public ChanceRange readChance()
+        {
+            return readChance;
+        }
+
+        public IntRange withinKeyConcurrency()
+        {
+            return withinKeyConcurrency;
+        }
+
+        public int concurrency()
+        {
+            return concurrency;
+        }
+
+        public Builder<S> readChance(ChanceRange readChance)
+        {
+            this.readChance = readChance;
+            return this;
+        }
+
+        public Builder<S> nemesisChance(ChanceRange nemesisChance)
+        {
+            this.nemesisChance = nemesisChance;
+            return this;
+        }
+
+        public Builder<S> scheduler(RunnableActionScheduler.Kind... kinds)
+        {
+            this.schedulerFactory = schedulerFactory(kinds);
+            return this;
+        }
+
+        public SimulatedFutureActionScheduler futureActionScheduler(int nodeCount, SimulatedTime time, RandomSource random)
+        {
+            KindOfSequence kind = Choices.random(random, KindOfSequence.values())
+                                         .choose(random);
+            return new SimulatedFutureActionScheduler(kind, nodeCount, random, time,
+                                                      new NetworkConfig(new PhaseConfig(normalNetworkDropChance, normalNetworkDelayChance, normalNetworkLatencyNanos, normalNetworkDelayNanos),
+                                                                        new PhaseConfig(flakyNetworkDropChance, flakyNetworkDelayChance, flakyNetworkLatencyNanos, flakyNetworkDelayNanos),
+                                                                        networkPartitionChance, networkFlakyChance, networkReconfigureInterval),
+                                                      new SchedulerConfig(schedulerDelayChance, schedulerDelayNanos, schedulerLongDelayNanos));
+        }
+
+        static SchedulerFactory schedulerFactory(RunnableActionScheduler.Kind... kinds)
+        {
+            return (random) -> {
+                switch (Choices.random(random, kinds).choose(random))
+                {
+                    default: throw new AssertionError();
+                    case SEQUENTIAL: return new RunnableActionScheduler.Sequential();
+                    case UNIFORM: return new RunnableActionScheduler.RandomUniform(random);
+                    case RANDOM_WALK: return new RunnableActionScheduler.RandomWalk(random);
+                }
+            };
+        }
+
+        public Builder<S> scheduler(SchedulerFactory schedulerFactory)
+        {
+            this.schedulerFactory = schedulerFactory;
+            return this;
+        }
+
+        public Builder<S> random(Supplier<RandomSource> randomSupplier)
+        {
+            this.randomSupplier = randomSupplier;
+            return this;
+        }
+
+        public Builder<S> memoryListener(HeapPool.Logged.Listener memoryListener)
+        {
+            this.memoryListener = memoryListener;
+            return this;
+        }
+
+        public Builder<S> timeListener(SimulatedTime.Listener timeListener)
+        {
+            this.timeListener = timeListener;
+            return this;
+        }
+
+        public Builder<S> capture(Capture capture)
+        {
+            this.capture = capture;
+            return this;
+        }
+
+        public Capture capture()
+        {
+            return capture;
+        }
+
+        public Builder<S> onThreadLocalRandomCheck(LongConsumer runnable)
+        {
+            this.onThreadLocalRandomCheck = runnable;
+            return this;
+        }
+
+        public abstract ClusterSimulation<S> create(long seed) throws IOException;
+    }
+
+    static class ThreadAllocator
+    {
+        final RandomSource random;
+        int clusterPool; // number of threads we have left for the whole cluster
+        int remainingNodes; // number of nodes we still need to allocate them to
+        int allocationPool; //  threads to allocate for the node we're currently processing
+        int remainingAllocations; // number of _remaining_ allocations take() assumes we want to evenly allocate threads over
+
+        public ThreadAllocator(RandomSource random, int threadsToAllocate, int betweenNodes)
+        {
+            this.random = random;
+            this.clusterPool = threadsToAllocate;
+            this.remainingNodes = betweenNodes;
+        }
+
+        // randomly set the number of threads in various thread pools
+        IInstanceConfig update(IInstanceConfig config)
+        {
+            cycle();
+            // allocate in ascending order of max, for take() correctness
+            return config
+                   .set("memtable_flush_writers", take(1, 1, 2))
+                   .set("concurrent_compactors", take(1, 1, 4))
+                   .set("concurrent_writes", take(1, 4))
+                   .set("concurrent_counter_writes", take(1, 4))
+                   .set("concurrent_materialized_view_writes", take(1, 4))
+                   .set("concurrent_reads", take(1, 4))
+                   .forceSet("available_processors", take(3, 4));
+        }
+
+        // begin allocating for a new node
+        void cycle()
+        {
+            assert remainingNodes > 0;
+            // return unallocated items to the outerPool
+            clusterPool += allocationPool;
+            // set the curPool to allocate the next allocationPool size
+            allocationPool = clusterPool;
+            remainingAllocations = remainingNodes;
+            // randomly select the next pool size, subtracting it from the outer pool
+            allocationPool = take(1, 1);
+            clusterPool -= allocationPool;
+            // this is hard-coded to match the sum of the first arguments above
+            remainingAllocations = 9;
+            --remainingNodes;
+        }
+
+        /**
+         * See {@link #take(int, int, int)}
+         */
+        int take(int times, int min)
+        {
+            return take(times, min, allocationPool);
+        }
+
+        /**
+         * Allocate a random number of threads between [min..max)
+         * The allocation is suitable for multiple users of the value, i.e.
+         * {@code times} multiple of the result are deducted from the pool.
+         *
+         * If there are adequate supplies we aim to allocate threads "equally" between pools,
+         * selecting a uniform value between 0.5x and 2x the fair split of the remaining pool
+         * on each allocation. If the min/max bounds override that, they are preferred.
+         *
+         * The minimum is always honoured, regardless of available pool size.
+         */
+        int take(int times, int min, int max)
+        {
+            int remaining = remainingAllocations;
+            assert remaining >= times;
+            remainingAllocations -= times;
+            if (remaining * min <= allocationPool)
+                return min;
+            if (times == remaining)
+                return allocationPool / remaining;
+            if (times + 1 == remaining)
+                return random.uniform(Math.max(min, (allocationPool - max) / times), Math.min(max, (allocationPool - min) / times));
+
+            int median = allocationPool / remaining;
+            min = Math.max(min, Math.min(max, median) / 2);
+            max = Math.min(max, median * 2);
+            return min >= max ? min : random.uniform(min, max);
+        }
+    }
+
+
+    public final RandomSource random;
+    public final SimulatedSystems simulated;
+    public final Cluster cluster;
+    public final S simulation;
+    private final FileSystem jimfs;
+    protected final Map<Integer, List<Closeable>> onUnexpectedShutdown = new TreeMap<>();
+    protected final List<Callable<Void>> onShutdown = new CopyOnWriteArrayList<>();
+    protected final ThreadLocalRandomCheck threadLocalRandomCheck;
+
+    public ClusterSimulation(RandomSource random, long seed, int uniqueNum,
+                             Builder<?> builder,
+                             Consumer<IInstanceConfig> configUpdater,
+                             SimulationFactory<S> factory) throws IOException
+    {
+        this.random = random;
+        this.jimfs  = Jimfs.newFileSystem(Long.toHexString(seed) + 'x' + uniqueNum, Configuration.unix().toBuilder()
+                                                                               .setMaxSize(4L << 30).setBlockSize(512)
+                                                                               .build());
+
+        final SimulatedMessageDelivery delivery;
+        final SimulatedExecution execution;
+        final SimulatedBallots ballots;
+        final SimulatedSnitch snitch;
+        final SimulatedTime time;
+        final SimulatedFailureDetector failureDetector;
+
+        int numOfNodes = builder.nodeCount.select(random);
+        int numOfDcs = builder.dcCount.select(random, 0, numOfNodes / 4);
+        int[] numInDcs = new int[numOfDcs];
+        int[] nodeToDc = new int[numOfNodes];
+
+        int[] minRf = new int[numOfDcs], initialRf = new int[numOfDcs], maxRf = new int[numOfDcs];
+        {
+            // TODO (feature): split unevenly
+            int n = 0, nc = 0;
+            for (int i = 0; i < numOfDcs; ++i)
+            {
+                int numInDc = (numOfNodes / numOfDcs) + (numOfNodes % numOfDcs > i ? 1 : 0);
+                numInDcs[i] = numInDc;
+                minRf[i] = 3;
+                maxRf[i] = min(numInDc, 9);
+                initialRf[i] = random.uniform(minRf[i], 1 + maxRf[i]);
+                nc += numInDc;
+                while (n < nc)
+                    nodeToDc[n++] = i;
+            }
+        }
+        snitch = new SimulatedSnitch(nodeToDc, numInDcs);
+
+        execution = new SimulatedExecution();
+
+        KindOfSequence kindOfDriftSequence = Choices.uniform(KindOfSequence.values()).choose(random);
+        KindOfSequence kindOfDiscontinuitySequence = Choices.uniform(KindOfSequence.values()).choose(random);
+        time = new SimulatedTime(numOfNodes, random, 1577836800000L /*Jan 1st UTC*/, builder.clockDriftNanos, kindOfDriftSequence,
+                                 kindOfDiscontinuitySequence.period(builder.clockDiscontinuitIntervalNanos, random),
+                                 builder.timeListener);
+        ballots = new SimulatedBallots(random, () -> {
+            long max = random.uniform(2, 16);
+            return () -> random.uniform(1, max);
+        });
+
+        Predicate<String> sharedClassPredicate = getSharedClassPredicate(ISOLATE, SHARE, ANY, SIMULATION);
+        InterceptAsClassTransformer interceptClasses = new InterceptAsClassTransformer(builder.monitorDelayChance.asSupplier(random), builder.nemesisChance.asSupplier(random), NemesisFieldSelectors.get(), ClassLoader.getSystemClassLoader(), sharedClassPredicate.negate());
+        threadLocalRandomCheck = new ThreadLocalRandomCheck(builder.onThreadLocalRandomCheck);
+
+        Failures failures = new Failures();
+        ThreadAllocator threadAllocator = new ThreadAllocator(random, builder.threadCount, numOfNodes);
+        cluster = snitch.setup(Cluster.build(numOfNodes)
+                         .withRoot(jimfs.getPath("/cassandra"))
+                         .withSharedClasses(sharedClassPredicate)
+                         .withConfig(config -> configUpdater.accept(threadAllocator.update(config
+                             .with(Feature.BLANK_GOSSIP)
+                             .set("read_request_timeout", String.format("%dms", NANOSECONDS.toMillis(builder.readTimeoutNanos)))
+                             .set("write_request_timeout", String.format("%dms", NANOSECONDS.toMillis(builder.writeTimeoutNanos)))
+                             .set("cas_contention_timeout", String.format("%dms", NANOSECONDS.toMillis(builder.contentionTimeoutNanos)))
+                             .set("request_timeout", String.format("%dms", NANOSECONDS.toMillis(builder.requestTimeoutNanos)))
+                             .set("memtable_heap_space", "1MiB")
+                             .set("memtable_allocation_type", builder.memoryListener != null ? "unslabbed_heap_buffers_logged" : "heap_buffers")
+                             .set("file_cache_size", "16MiB")
+                             .set("use_deterministic_table_id", true)
+                             .set("disk_access_mode", "standard")
+                             .set("failure_detector", SimulatedFailureDetector.Instance.class.getName())
+                             .set("commitlog_compression", new ParameterizedClass(LZ4Compressor.class.getName(), emptyMap()))
+                         )))
+                         .withInstanceInitializer(new IInstanceInitializer()
+                         {
+                             @Override
+                             public void initialise(ClassLoader classLoader, ThreadGroup threadGroup, int num, int generation)
+                             {
+                                 List<Closeable> onShutdown = new ArrayList<>();
+                                 InterceptorOfGlobalMethods interceptorOfGlobalMethods = IsolatedExecutor.transferAdhoc((IIsolatedExecutor.SerializableQuadFunction<Capture, LongConsumer, Consumer<Throwable>, RandomSource, InterceptorOfGlobalMethods>) InterceptingGlobalMethods::new, classLoader)
+                                                                                                         .apply(builder.capture, builder.onThreadLocalRandomCheck, failures, random);
+                                 onShutdown.add(interceptorOfGlobalMethods);
+
+                                 InterceptingExecutorFactory factory = execution.factory(interceptorOfGlobalMethods, classLoader, threadGroup);
+                                 IsolatedExecutor.transferAdhoc((SerializableConsumer<ExecutorFactory>) ExecutorFactory.Global::unsafeSet, classLoader)
+                                                 .accept(factory);
+                                 onShutdown.add(factory);
+
+                                 IsolatedExecutor.transferAdhoc((SerializableBiConsumer<InterceptorOfGlobalMethods, IntSupplier>) InterceptorOfGlobalMethods.Global::unsafeSet, classLoader)
+                                                 .accept(interceptorOfGlobalMethods, () -> {
+                                                     if (InterceptibleThread.isDeterministic())
+                                                         throw failWithOOM();
+                                                     return random.uniform(Integer.MIN_VALUE, Integer.MAX_VALUE);
+                                                 });
+                                 onShutdown.add(IsolatedExecutor.transferAdhoc((SerializableRunnable)InterceptorOfGlobalMethods.Global::unsafeReset, classLoader)::run);
+                                 onShutdown.add(time.setup(num, classLoader));
+
+                                 onUnexpectedShutdown.put(num, onShutdown);
+                             }
+
+                             @Override
+                             public void beforeStartup(IInstance i)
+                             {
+                                 ((IInvokableInstance) i).unsafeAcceptOnThisThread(FBUtilities::setAvailableProcessors, i.config().getInt("available_processors"));
+                                 ((IInvokableInstance) i).unsafeAcceptOnThisThread(IfInterceptibleThread::setThreadLocalRandomCheck, (LongConsumer) threadLocalRandomCheck);
+
+                                 int num = i.config().num();
+                                 if (builder.memoryListener != null)
+                                 {
+                                    ((IInvokableInstance) i).unsafeAcceptOnThisThread(HeapPool.Logged::setListener, builder.memoryListener);
+                                     onUnexpectedShutdown.get(num).add(() -> ((IInvokableInstance) i).unsafeAcceptOnThisThread(HeapPool.Logged::setListener, (ignore1, ignore2) -> {}));
+                                 }
+
+                                 ((IInvokableInstance) i).unsafeAcceptOnThisThread(PaxosPrepare::setOnLinearizabilityViolation, SimulatorUtils::failWithOOM);
+                                 onUnexpectedShutdown.get(num).add(() -> ((IInvokableInstance) i).unsafeRunOnThisThread(() -> PaxosPrepare.setOnLinearizabilityViolation(null)));
+                             }
+
+                             @Override
+                             public void afterStartup(IInstance i)
+                             {
+                                 int num = i.config().num();
+                                 ((IInvokableInstance) i).unsafeAcceptOnThisThread(BallotGenerator.Global::unsafeSet, (BallotGenerator) ballots.get());
+                                 onUnexpectedShutdown.get(num).add(() -> ((IInvokableInstance) i).unsafeRunOnThisThread(() -> BallotGenerator.Global.unsafeSet(new BallotGenerator.Default())));
+
+                                 ((IInvokableInstance) i).unsafeAcceptOnThisThread((SerializableConsumer<BufferPool.DebugLeaks>) debug -> BufferPools.forChunkCache().debug(null, debug), failures);
+                                 onUnexpectedShutdown.get(num).add(() -> ((IInvokableInstance) i).unsafeRunOnThisThread(() -> BufferPools.forChunkCache().debug(null, null)));
+
+                                 ((IInvokableInstance) i).unsafeAcceptOnThisThread((SerializableConsumer<BufferPool.DebugLeaks>) debug -> BufferPools.forNetworking().debug(null, debug), failures);
+                                 onUnexpectedShutdown.get(num).add(() -> ((IInvokableInstance) i).unsafeRunOnThisThread(() -> BufferPools.forNetworking().debug(null, null)));
+
+                                 ((IInvokableInstance) i).unsafeAcceptOnThisThread((SerializableConsumer<Ref.OnLeak>) Ref::setOnLeak, failures);
+                                 onUnexpectedShutdown.get(num).add(() -> ((IInvokableInstance) i).unsafeRunOnThisThread(() -> Ref.setOnLeak(null)));
+                             }
+                         }).withClassTransformer(interceptClasses)
+                           .withShutdownExecutor((name, classLoader, shuttingDown, call) -> {
+                               onShutdown.add(call);
+                               return null;
+                           })
+        ).createWithoutStarting();
+
+        IfInterceptibleThread.setThreadLocalRandomCheck(threadLocalRandomCheck);
+        snitch.setup(cluster);
+        DirectStreamingConnectionFactory.setup(cluster);
+        delivery = new SimulatedMessageDelivery(cluster);
+        failureDetector = new SimulatedFailureDetector(cluster);
+        SimulatedFutureActionScheduler futureActionScheduler = builder.futureActionScheduler(numOfNodes, time, random);
+        simulated = new SimulatedSystems(random, time, delivery, execution, ballots, failureDetector, snitch, futureActionScheduler, builder.debug, failures);
+        simulated.register(futureActionScheduler);
+
+        RunnableActionScheduler scheduler = builder.schedulerFactory.create(random);
+        ClusterActions.Options options = new ClusterActions.Options(builder.topologyChangeLimit, Choices.uniform(KindOfSequence.values()).choose(random).period(builder.topologyChangeIntervalNanos, random),
+                                                                    Choices.random(random, builder.topologyChanges),
+                                                                    minRf, initialRf, maxRf, null);
+        simulation = factory.create(simulated, scheduler, cluster, options);
+    }
+
+    public synchronized void close() throws IOException
+    {
+        // Re-enable time on shutdown
+        try
+        {
+            Field field = Clock.Global.class.getDeclaredField("instance");
+            field.setAccessible(true);
+
+            Field modifiersField = Field.class.getDeclaredField("modifiers");
+            modifiersField.setAccessible(true);
+            modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL);
+
+            field.set(null, new Clock.Default());
+        }
+        catch (NoSuchFieldException|IllegalAccessException e)
+        {
+            throw new RuntimeException(e);
+        }
+
+        threadLocalRandomCheck.stop();
+        simulated.execution.forceStop();
+        SimulatedTime.Global.disable();
+
+        Throwable fail = null;
+        for (int num = 1 ; num <= cluster.size() ; ++num)
+        {
+            if (!cluster.get(num).isShutdown())
+            {
+                fail = Throwables.close(fail, onUnexpectedShutdown.get(num));
+            }
+        }
+
+        try
+        {
+            simulation.close();
+        }
+        catch (Throwable t)
+        {
+            fail = t;
+        }
+
+        try
+        {
+            cluster.close();
+        }
+        catch (Throwable t)
+        {
+            fail = Throwables.merge(fail, t);
+        }
+        for (Callable<Void> call : onShutdown)
+        {
+            try
+            {
+                call.call();
+            }
+            catch (Throwable t)
+            {
+                fail = Throwables.merge(fail, t);
+            }
+        }
+        Throwables.maybeFail(fail, IOException.class);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/Debug.java b/test/simulator/main/org/apache/cassandra/simulator/Debug.java
new file mode 100644
index 0000000..8afdd3e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/Debug.java
@@ -0,0 +1,357 @@
+/*
+ * 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.simulator;
+
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
+
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.BufferDecoratedKey;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.TriFunction;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.ReplicaLayout;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static java.util.function.Function.identity;
+import static org.apache.cassandra.simulator.Action.Modifier.INFO;
+import static org.apache.cassandra.simulator.Action.Modifier.WAKEUP;
+import static org.apache.cassandra.simulator.ActionListener.runAfter;
+import static org.apache.cassandra.simulator.ActionListener.runAfterAndTransitivelyAfter;
+import static org.apache.cassandra.simulator.ActionListener.recursive;
+import static org.apache.cassandra.simulator.Debug.EventType.*;
+import static org.apache.cassandra.simulator.Debug.Info.LOG;
+import static org.apache.cassandra.simulator.Debug.Level.*;
+import static org.apache.cassandra.simulator.paxos.Ballots.paxosDebugInfo;
+
+// TODO (feature): move logging to a depth parameter
+// TODO (feature): log only deltas for schema/cluster data
+public class Debug
+{
+    private static final Logger logger = LoggerFactory.getLogger(Debug.class);
+
+    public enum EventType { PARTITION, CLUSTER }
+    public enum Level
+    {
+        PLANNED,
+        CONSEQUENCES,
+        ALL;
+
+        private static final Level[] LEVELS = values();
+    }
+    public enum Info
+    {
+        LOG(EventType.values()),
+        PAXOS(PARTITION),
+        OWNERSHIP(CLUSTER),
+        GOSSIP(CLUSTER),
+        RF(CLUSTER),
+        RING(CLUSTER);
+
+        public final EventType[] defaultEventTypes;
+
+        Info(EventType ... defaultEventTypes)
+        {
+            this.defaultEventTypes = defaultEventTypes;
+        }
+    }
+
+    public static class Levels
+    {
+        private final EnumMap<EventType, Level> levels;
+
+        public Levels(EnumMap<EventType, Level> levels)
+        {
+            this.levels = levels;
+        }
+
+        public Levels(Level level, EventType ... types)
+        {
+            this.levels = new EnumMap<>(EventType.class);
+            for (EventType type : types)
+                this.levels.put(type, level);
+        }
+
+        public Levels(int partition, int cluster)
+        {
+            this.levels = new EnumMap<>(EventType.class);
+            if (partition > 0) this.levels.put(PARTITION, Level.LEVELS[partition - 1]);
+            if (cluster > 0) this.levels.put(CLUSTER, Level.LEVELS[cluster - 1]);
+        }
+
+        Level get(EventType type)
+        {
+            return levels.get(type);
+        }
+
+        boolean anyMatch(Predicate<Level> test)
+        {
+            return levels.values().stream().anyMatch(test);
+        }
+    }
+
+    private final EnumMap<Info, Levels> levels;
+    public final int[] primaryKeys;
+
+    public Debug()
+    {
+        this(new EnumMap<>(Info.class), null);
+    }
+
+    public Debug(Map<Info, Levels> levels, int[] primaryKeys)
+    {
+        this.levels = new EnumMap<>(levels);
+        this.primaryKeys = primaryKeys;
+    }
+
+    public ActionListener debug(EventType type, SimulatedTime time, Cluster cluster, String keyspace, Integer primaryKey)
+    {
+        List<ActionListener> listeners = new ArrayList<>();
+        for (Map.Entry<Info, Levels> e : levels.entrySet())
+        {
+            Info info = e.getKey();
+            Level level = e.getValue().get(type);
+            if (level == null) continue;
+
+            ActionListener listener;
+            if (info == LOG)
+            {
+                Function<ActionListener, ActionListener> adapt = type == CLUSTER ? LogTermination::new : identity();
+                switch (level)
+                {
+                    default: throw new AssertionError();
+                    case PLANNED: listener = adapt.apply(new LogOne(time, false)); break;
+                    case CONSEQUENCES: case ALL: listener = adapt.apply(recursive(new LogOne(time, true))); break;
+                }
+            }
+            else if (keyspace != null)
+            {
+                Consumer<Action> debug;
+                switch (info)
+                {
+                    default: throw new AssertionError();
+                    case GOSSIP: debug = debugGossip(cluster); break;
+                    case RF: debug = debugRf(cluster, keyspace); break;
+                    case RING: debug = debugRing(cluster, keyspace); break;
+                    case PAXOS: debug = forKeys(cluster, keyspace, primaryKey, Debug::debugPaxos); break;
+                    case OWNERSHIP: debug = forKeys(cluster, keyspace, primaryKey, Debug::debugOwnership); break;
+                }
+                switch (level)
+                {
+                    default: throw new AssertionError();
+                    case PLANNED: listener = type == CLUSTER ? runAfterAndTransitivelyAfter(debug) : runAfter(debug); break;
+                    case CONSEQUENCES: listener = recursive(runAfter(ignoreWakeupAndLogEvents(debug))); break;
+                    case ALL: listener = recursive(runAfter(ignoreLogEvents(debug))); break;
+                }
+            }
+            else continue;
+
+            listeners.add(listener);
+        }
+
+        if (listeners.isEmpty())
+            return null;
+        return new ActionListener.Combined(listeners);
+    }
+
+    public boolean isOn(Info info)
+    {
+        return isOn(info, PLANNED);
+    }
+
+    public boolean isOn(Info info, Level level)
+    {
+        Levels levels = this.levels.get(info);
+        if (levels == null) return false;
+        return levels.anyMatch(test -> level.compareTo(test) >= 0);
+    }
+
+    @SuppressWarnings("UnnecessaryToStringCall")
+    private static class LogOne implements ActionListener
+    {
+        final SimulatedTime time;
+        final boolean logConsequences;
+        private LogOne(SimulatedTime time, boolean logConsequences)
+        {
+            this.time = time;
+            this.logConsequences = logConsequences;
+        }
+
+        @Override
+        public void before(Action action, Before before)
+        {
+            if (logger.isWarnEnabled()) // invoke toString() eagerly to ensure we have the task's descriptin
+                logger.warn(String.format("%6ds %s %s", TimeUnit.NANOSECONDS.toSeconds(time.nanoTime()), before, action));
+        }
+
+        @Override
+        public void consequences(ActionList consequences)
+        {
+            if (logConsequences && !consequences.isEmpty() && logger.isWarnEnabled())
+                logger.warn(String.format("%6ds Next: %s", TimeUnit.NANOSECONDS.toSeconds(time.nanoTime()), consequences));
+        }
+    }
+
+    private static class LogTermination extends ActionListener.Wrapped
+    {
+        public LogTermination(ActionListener wrap)
+        {
+            super(wrap);
+        }
+
+        @Override
+        public void transitivelyAfter(Action finished)
+        {
+            logger.warn("Terminated {}", finished);
+        }
+    }
+
+    private static Consumer<Action> ignoreWakeupAndLogEvents(Consumer<Action> consumer)
+    {
+        return action -> {
+            if (!action.is(WAKEUP) && !action.is(INFO))
+                consumer.accept(action);
+        };
+    }
+
+    private static Consumer<Action> ignoreLogEvents(Consumer<Action> consumer)
+    {
+        return action -> {
+            if (!action.is(INFO))
+                consumer.accept(action);
+        };
+    }
+
+    private Consumer<Action> debugGossip(Cluster cluster)
+    {
+        return ignore -> {
+            cluster.forEach(i -> i.unsafeRunOnThisThread(() -> {
+                for (InetAddressAndPort ep : Gossiper.instance.getLiveMembers())
+                {
+                    EndpointState epState = Gossiper.instance.getEndpointStateForEndpoint(ep);
+                    logger.warn("Gossip {}: {} {}", ep, epState.isAlive(), epState.states().stream()
+                                                                                   .map(e -> e.getKey().toString() + "=(" + e.getValue().value + ',' + e.getValue().version + ')')
+                                                                                   .collect(Collectors.joining(", ", "[", "]")));
+                }
+            }));
+        };
+    }
+
+    private Consumer<Action> forKeys(Cluster cluster, String keyspace, @Nullable Integer specificPrimaryKey, TriFunction<Cluster, String, Integer, Consumer<Action>> factory)
+    {
+        if (specificPrimaryKey != null) return factory.apply(cluster, keyspace, specificPrimaryKey);
+        else return forEachKey(cluster, keyspace, primaryKeys, Debug::debugPaxos);
+    }
+
+    public static Consumer<Action> forEachKey(Cluster cluster, String keyspace, int[] primaryKeys, TriFunction<Cluster, String, Integer, Consumer<Action>> factory)
+    {
+        Consumer<Action>[] eachKey = new Consumer[primaryKeys.length];
+        for (int i = 0 ; i < primaryKeys.length ; ++i)
+            eachKey[i] = factory.apply(cluster, keyspace, primaryKeys[i]);
+
+        return action -> {
+            for (Consumer<Action> run : eachKey)
+                run.accept(action);
+        };
+    }
+
+    public static Consumer<Action> debugPaxos(Cluster cluster, String keyspace, int primaryKey)
+    {
+        return ignore -> {
+            for (int node = 1 ; node <= cluster.size() ; ++node)
+            {
+                cluster.get(node).unsafeAcceptOnThisThread((num, pkint) -> {
+                    try
+                    {
+                        TableMetadata metadata = Keyspace.open(keyspace).getColumnFamilyStore("tbl").metadata.get();
+                        ByteBuffer pkbb = Int32Type.instance.decompose(pkint);
+                        DecoratedKey key = new BufferDecoratedKey(DatabaseDescriptor.getPartitioner().getToken(pkbb), pkbb);
+                        logger.warn("node{}({}): {}", num, primaryKey, paxosDebugInfo(key, metadata, FBUtilities.nowInSeconds()));
+                    }
+                    catch (Throwable t)
+                    {
+                        logger.warn("node{}({})", num, primaryKey, t);
+                    }
+                }, node, primaryKey);
+            }
+        };
+    }
+
+    public static Consumer<Action> debugRf(Cluster cluster, String keyspace)
+    {
+        return ignore -> {
+            cluster.forEach(i -> i.unsafeRunOnThisThread(() -> {
+                logger.warn("{} {}",
+                        Schema.instance.getKeyspaceMetadata(keyspace) == null ? "" : Schema.instance.getKeyspaceMetadata(keyspace).params.replication.toString(),
+                        Schema.instance.getKeyspaceMetadata(keyspace) == null ? "" : Keyspace.open(keyspace).getReplicationStrategy().configOptions.toString());
+            }));
+        };
+    }
+
+    public static Consumer<Action> debugOwnership(Cluster cluster, String keyspace, int primaryKey)
+    {
+        return ignore -> {
+            for (int node = 1 ; node <= cluster.size() ; ++node)
+            {
+                logger.warn("node{}({}): {}", node, primaryKey, cluster.get(node).unsafeApplyOnThisThread(v -> {
+                    try
+                    {
+                        return ReplicaLayout.forTokenWriteLiveAndDown(Keyspace.open(keyspace), Murmur3Partitioner.instance.getToken(Int32Type.instance.decompose(v))).all().endpointList().toString();
+                    }
+                    catch (Throwable t)
+                    {
+                        return "Error";
+                    }
+                }, primaryKey));
+            }
+        };
+    }
+
+    public static Consumer<Action> debugRing(Cluster cluster, String keyspace)
+    {
+        return ignore -> cluster.forEach(i -> i.unsafeRunOnThisThread(() -> {
+            if (Schema.instance.getKeyspaceMetadata(keyspace) != null)
+                logger.warn("{}", StorageService.instance.getTokenMetadata().toString());
+        }));
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/FutureActionScheduler.java b/test/simulator/main/org/apache/cassandra/simulator/FutureActionScheduler.java
new file mode 100644
index 0000000..67d601d
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/FutureActionScheduler.java
@@ -0,0 +1,57 @@
+/*
+ * 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.simulator;
+
+/**
+ * Makes decisions about when in the simulated scheduled, in terms of the global simulated nanoTime,
+ * events should occur.
+ */
+public interface FutureActionScheduler
+{
+    enum Deliver { DELIVER, TIMEOUT, DELIVER_AND_TIMEOUT, FAILURE }
+
+    /**
+     * Make a decision about the result of some attempt to deliver a message.
+     * Note that this includes responses, so for any given message the chance
+     * of a successful reply depends on two of these calls succeeding.
+     */
+    Deliver shouldDeliver(int from, int to);
+
+    /**
+     * The simulated global nanoTime arrival of a message
+     */
+    long messageDeadlineNanos(int from, int to);
+
+    /**
+     * The simulated global nanoTime at which a timeout should be reported for a message
+     * with {@code expiresAfterNanos} timeout
+     */
+    long messageTimeoutNanos(long expiresAfterNanos, long expirationIntervalNanos);
+
+    /**
+     * The simulated global nanoTime at which a failure should be reported for a message
+     */
+    long messageFailureNanos(int from, int to);
+
+    /**
+     * The additional time in nanos that should elapse for some thread signal event to occur
+     * to simulate scheduler latency
+     */
+    long schedulerDelayNanos();
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/OrderOn.java b/test/simulator/main/org/apache/cassandra/simulator/OrderOn.java
new file mode 100644
index 0000000..382bd8c
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/OrderOn.java
@@ -0,0 +1,180 @@
+/*
+ * 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.simulator;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A token representing some ordering property of the system.
+ * Most notably this is used to implement executor services where a number of tasks may be run concurrently,
+ * particularly single threaded executors where causality is a strict requirement of correctness.
+ *
+ * This is also used to denote "strict" ordering on any suitably annotated {@link Action}.
+ *
+ * For convenience, efficiency and simplicity we have OrderOn represent a singleton collection of OrderOns.
+ */
+@Shared(scope = SIMULATION)
+public interface OrderOn extends OrderOns
+{
+    /**
+     * The number of {@link Action} in the provided sequence that may be executed at once,
+     * before any ordering takes effect.
+     */
+    int concurrency();
+
+    /**
+     * If true then all child actions (and their children, etc) must be ordered together, i.e. the next
+     * {@link Action} ordered by this sequence may not run until the present {@link Action} and all actions
+     * started by it, directly or indirectly, have completed.
+     */
+    default boolean isStrict() { return false; }
+
+    /**
+     * Whether the ordering is imposed immediately, occupying a slot in the sequence prior to any Action being scheduled
+     * (e.g. in the case of {@code executor.execute()}), or if it applies only after the scheduled time elapsed
+     * (e.g. in the case of {@code executor.schedule()}).
+     *
+     * This may be modified and still refer to the same {@code OrderOn} as another {@code OrderOn} by overriding
+     * the {@code unwrap()} method
+     */
+    default boolean appliesBeforeScheduling() { return true; }
+
+    /**
+     * {@code this} may be a thin wrapper around another {@code OrderOn} with a different {@code appliesBeforeScheduling()}.
+     * In this case this method returns the underlying {@code OrderOn} to impose the order upon.
+     */
+    default OrderOn unwrap() { return this; }
+
+    /**
+     * A convenience method to indicate if this {@code OrderOn} imposes any ordering
+     */
+    @Override
+    default boolean isOrdered() { return concurrency() < Integer.MAX_VALUE; }
+
+    @Override
+    default OrderOns with(OrderOn add)
+    {
+        return new TwoOrderOns(this, add);
+    }
+
+    @Override
+    default int size()
+    {
+        return 1;
+    }
+
+    @Override
+    default OrderOn get(int i)
+    {
+        Preconditions.checkArgument(i == 0);
+        return this;
+    }
+
+    abstract class OrderOnId implements OrderOn
+    {
+        public final Object id;
+
+        public OrderOnId(Object id)
+        {
+            this.id = id;
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return id.hashCode();
+        }
+
+        @Override
+        public boolean equals(Object that)
+        {
+            return that instanceof OrderOnId && id.equals(((OrderOnId) that).id);
+        }
+
+        public String toString()
+        {
+            return id.toString();
+        }
+    }
+
+    public class Sequential extends OrderOnId
+    {
+        public Sequential(Object id)
+        {
+            super(id);
+        }
+
+        public int concurrency() { return 1; }
+    }
+
+    public class StrictSequential extends Sequential
+    {
+        public StrictSequential(Object id)
+        {
+            super(id);
+        }
+
+        @Override
+        public boolean isStrict()
+        {
+            return true;
+        }
+    }
+
+    public class Strict extends Sequential
+    {
+        final int concurrency;
+
+        public Strict(Object id, int concurrency)
+        {
+            super(id);
+            this.concurrency = concurrency;
+        }
+
+        @Override
+        public int concurrency()
+        {
+            return concurrency;
+        }
+
+        @Override
+        public boolean isStrict()
+        {
+            return true;
+        }
+    }
+
+    public class OrderAppliesAfterScheduling implements OrderOn
+    {
+        final OrderOn inner;
+
+        public OrderAppliesAfterScheduling(OrderOn inner) { this.inner = inner; }
+        @Override public int concurrency() { return inner.concurrency(); }
+        @Override public boolean isStrict() { return inner.isStrict(); }
+        @Override public boolean isOrdered() { return inner.isOrdered(); }
+
+        @Override public boolean appliesBeforeScheduling() { return false; }
+        @Override public OrderOn unwrap() { return inner; }
+        @Override public String toString() { return inner.toString(); }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/OrderOns.java b/test/simulator/main/org/apache/cassandra/simulator/OrderOns.java
new file mode 100644
index 0000000..d4a07c1
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/OrderOns.java
@@ -0,0 +1,165 @@
+/*
+ * 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.simulator;
+
+import java.util.ArrayList;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A (possibly empty) collection of OrderOn
+ */
+@Shared(scope = SIMULATION)
+public interface OrderOns
+{
+    /**
+     * Equivalent to !isEmpty()
+     */
+    boolean isOrdered();
+
+    /**
+     * Equivalent to anyMatch(OrderOn::isOrdered)
+     */
+    boolean isStrict();
+
+    /**
+     * Return an {@code OrderOns} (possibly this one) also containing {@code add}
+     */
+    OrderOns with(OrderOn add);
+
+    /**
+     * The number of {@link OrderOn} contained in this collection
+     */
+    int size();
+
+    /**
+     * The i'th {@link OrderOn} contained in this collection
+     */
+    OrderOn get(int i);
+
+    public static final OrderOn NONE = new OrderOn()
+    {
+        @Override
+        public OrderOns with(OrderOn add)
+        {
+            return add;
+        }
+
+        @Override
+        public int size()
+        {
+            return 0;
+        }
+
+        @Override
+        public OrderOn get(int i)
+        {
+            throw new IndexOutOfBoundsException();
+        }
+
+        @Override
+        public int concurrency()
+        {
+            return Integer.MAX_VALUE;
+        }
+
+        @Override
+        public String toString()
+        {
+            return "Unordered";
+        }
+    };
+
+    public class TwoOrderOns implements OrderOns
+    {
+        final OrderOn one;
+        final OrderOn two;
+
+        public TwoOrderOns(OrderOn one, OrderOn two)
+        {
+            this.one = one;
+            this.two = two;
+        }
+
+        @Override
+        public boolean isOrdered()
+        {
+            return true;
+        }
+
+        @Override
+        public boolean isStrict()
+        {
+            return one.isStrict() || two.isStrict();
+        }
+
+        @Override
+        public OrderOns with(OrderOn three)
+        {
+            OrderOnsList result = new OrderOnsList();
+            result.add(one);
+            result.add(two);
+            result.add(three);
+            return result;
+        }
+
+        @Override
+        public int size()
+        {
+            return 2;
+        }
+
+        @Override
+        public OrderOn get(int i)
+        {
+            Preconditions.checkArgument((i & 1) == i);
+            return i == 0 ? one : two;
+        }
+    }
+
+    public class OrderOnsList extends ArrayList<OrderOn> implements OrderOns
+    {
+        @Override
+        public boolean isOrdered()
+        {
+            return true;
+        }
+
+        @Override
+        public boolean isStrict()
+        {
+            for (int i = 0 ; i < size() ; ++i)
+            {
+                if (get(i).isStrict())
+                    return true;
+            }
+            return false;
+        }
+
+        public OrderOns with(OrderOn add)
+        {
+            add(add);
+            return this;
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/Ordered.java b/test/simulator/main/org/apache/cassandra/simulator/Ordered.java
new file mode 100644
index 0000000..3e57c95
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/Ordered.java
@@ -0,0 +1,330 @@
+/*
+ * 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.simulator;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.function.Function;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.simulator.utils.CountingCollection;
+import org.apache.cassandra.simulator.utils.IntrusiveLinkedList;
+import org.apache.cassandra.simulator.utils.IntrusiveLinkedListNode;
+
+import static java.util.Collections.newSetFromMap;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SIMULATOR_DEBUG;
+
+/**
+ * Represents an action that may not run before certain other actions
+ * have been executed, excluding child tasks that are not continuations
+ * (i.e. required threads/tasks to terminate their execution, but not
+ * any other child or transitive child actions)
+ */
+class Ordered extends OrderedLink implements ActionListener
+{
+    static final boolean DEBUG = TEST_SIMULATOR_DEBUG.getBoolean();
+
+    /**
+     * A sequence is used to model STRICT execution order imposed on certain actions that are not able
+     * to reliably complete if their actions are re-ordered, and to implement thread executor order,
+     * both for sequential executors and for ensuring executors with a given concurrency level do not
+     * exceed that concurrency level.
+     */
+    static class Sequence
+    {
+        final OrderOn on;
+        final int concurrency;
+        /** The tasks we are currently permitting to run (but may not be running due to membership of other sequences) */
+        final Collection<Ordered> maybeRunning;
+        /** The tasks we have pending */
+        final IntrusiveLinkedList<OrderedLink> next = new IntrusiveLinkedList<>();
+
+        Sequence(OrderOn on)
+        {
+            this.on = on;
+            this.concurrency = on.concurrency();
+            this.maybeRunning = concurrency == 1
+                                ? new ArrayList<>(1)
+                                : new LinkedHashSet<>();
+        }
+
+        <O extends Ordered> void add(O add, Function<O, List<Sequence>> memberOf)
+        {
+            memberOf.apply(add).add(this);
+            if (maybeRunning.size() < concurrency)
+            {
+                maybeRunning.add(add);
+            }
+            else
+            {
+                if (add.isFree())
+                {
+                    next.add(add);
+                }
+                else
+                {
+                    Preconditions.checkState(add.additionalLink == null);
+                    add.additionalLink = new AdditionalOrderedLink(add);
+                    next.add(add.additionalLink);
+                }
+
+                add.predecessors.add(this); // we don't submit, as we may yet be added to other sequences that prohibit our execution
+            }
+        }
+
+        /**
+         * Mark a task complete, and maybe schedule another from {@link #next}
+         */
+        void complete(Ordered completed, ActionSchedule schedule)
+        {
+            if (!maybeRunning.remove(completed))
+                throw new IllegalStateException();
+
+            complete(schedule);
+        }
+
+        void invalidate(Ordered completed, ActionSchedule schedule)
+        {
+            if (maybeRunning.remove(completed))
+                complete(schedule);
+        }
+
+        void invalidatePending()
+        {
+            if (next.isEmpty())
+                return;
+
+            List<Ordered> invalidate = new ArrayList<>();
+            for (OrderedLink link = next.poll() ; link != null ; link = next.poll())
+                invalidate.add(link.ordered());
+            invalidate.forEach(Ordered::invalidate);
+        }
+
+        void complete(ActionSchedule schedule)
+        {
+            if (next.isEmpty() && maybeRunning.isEmpty())
+            {
+                schedule.sequences.remove(on);
+            }
+            else
+            {
+                OrderedLink nextLink = this.next.poll();
+                if (nextLink != null)
+                {
+                    Ordered next = nextLink.ordered();
+                    if (!next.predecessors.remove(this))
+                        throw new IllegalStateException();
+                    maybeRunning.add(next);
+                    next.maybeAdvance();
+                }
+            }
+        }
+
+        public String toString()
+        {
+            return on.toString();
+        }
+    }
+
+    /**
+     * Represents an action that may not run before all child actions
+     * have been executed, transitively (i.e. child of child, ad infinitum).
+     */
+    static class StrictlyOrdered extends Ordered implements ActionListener
+    {
+        /** The sequences we participate in, in a strict fashion */
+        final List<Sequence> strictMemberOf = new ArrayList<>(1);
+        boolean isCompleteStrict;
+
+        StrictlyOrdered(Action action, ActionSchedule schedule)
+        {
+            super(action, schedule);
+        }
+
+        @Override
+        public void transitivelyAfter(Action finished)
+        {
+            assert !isCompleteStrict;
+            isCompleteStrict = true;
+            strictMemberOf.forEach(m -> m.complete(this, schedule));
+        }
+
+        @Override
+        void invalidate(boolean isCancellation)
+        {
+            super.invalidate(isCancellation);
+            strictMemberOf.forEach(m -> m.invalidate(this, schedule));
+        }
+
+        @Override
+        void joinNow(OrderOn orderOn)
+        {
+            schedule.sequences.computeIfAbsent(orderOn.unwrap(), Sequence::new)
+                              .add(this, orderOn.isStrict() ? o -> o.strictMemberOf : o -> o.memberOf);
+        }
+    }
+
+    final ActionSchedule schedule;
+    /** Those sequences that contain tasks that must complete before we can execute */
+    final Collection<Sequence> predecessors = !DEBUG ? new CountingCollection<>() : newSetFromMap(new IdentityHashMap<>());
+
+    /** The sequences we participate in, in a non-strict fashion */
+    final List<Sequence> memberOf = new ArrayList<>(1);
+    /** The underlying action waiting to execute */
+    final Action action;
+    /** State tracking to assert correct behaviour */
+    boolean isStarted, isComplete;
+    List<OrderOn> joinPostScheduling;
+    OrderedLink additionalLink;
+
+    Ordered(Action action, ActionSchedule schedule)
+    {
+        this.schedule = schedule;
+        this.action = action;
+        action.register(this);
+    }
+
+    public String toString()
+    {
+        return action.toString();
+    }
+
+    public void before(Action performed, Before before)
+    {
+        switch (before)
+        {
+            default: throw new AssertionError();
+            case INVALIDATE: // will be handled by invalidate()
+                return;
+            case DROP:
+            case EXECUTE:
+                assert performed == action;
+                assert !isStarted;
+                isStarted = true;
+        }
+    }
+
+    void join(OrderOn orderOn)
+    {
+        if (!orderOn.isOrdered())
+            return;
+
+        if (orderOn.appliesBeforeScheduling()) joinNow(orderOn);
+        else joinPostScheduling(orderOn);
+    }
+
+    void joinNow(OrderOn orderOn)
+    {
+        schedule.sequences.computeIfAbsent(orderOn.unwrap(), Sequence::new)
+                          .add(this, o -> o.memberOf);
+    }
+
+    void joinPostScheduling(OrderOn orderOn)
+    {
+        if (joinPostScheduling == null)
+        {
+            joinPostScheduling = Collections.singletonList(orderOn);
+        }
+        else
+        {
+            if (joinPostScheduling.size() == 1)
+            {
+                List<OrderOn> tmp = new ArrayList<>(2);
+                tmp.addAll(joinPostScheduling);
+                joinPostScheduling = tmp;
+            }
+            joinPostScheduling.add(orderOn);
+        }
+    }
+
+    boolean waitPreScheduled()
+    {
+        return !predecessors.isEmpty();
+    }
+
+    boolean waitPostScheduled()
+    {
+        Preconditions.checkState(predecessors.isEmpty());
+        if (joinPostScheduling == null)
+            return false;
+        joinPostScheduling.forEach(this::joinNow);
+        joinPostScheduling = null;
+        return !predecessors.isEmpty();
+    }
+
+    void invalidate()
+    {
+        invalidate(false);
+    }
+
+    void invalidate(boolean isCancellation)
+    {
+        Preconditions.checkState(!isCancellation || !isStarted);
+        isStarted = isComplete = true;
+        action.deregister(this);
+        remove();
+        if (additionalLink != null)
+        {
+            additionalLink.remove();
+            additionalLink = null;
+        }
+        memberOf.forEach(m -> m.invalidate(this, schedule));
+    }
+
+    void maybeAdvance()
+    {
+        if (predecessors.isEmpty())
+            schedule.advance(action);
+    }
+
+    @Override
+    public void after(Action performed)
+    {
+        assert isStarted;
+        assert !isComplete;
+        isComplete = true;
+        memberOf.forEach(m -> m.complete(this, schedule));
+    }
+
+    @Override
+    Ordered ordered()
+    {
+        return this;
+    }
+}
+
+abstract class OrderedLink extends IntrusiveLinkedListNode
+{
+    abstract Ordered ordered();
+    public void remove() { super.remove(); }
+    public boolean isFree() { return super.isFree(); }
+}
+
+class AdditionalOrderedLink extends OrderedLink
+{
+    final Ordered ordered;
+
+    AdditionalOrderedLink(Ordered ordered) { this.ordered = ordered; }
+    Ordered ordered() { return ordered; }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/OrderedOn.java b/test/simulator/main/org/apache/cassandra/simulator/OrderedOn.java
new file mode 100644
index 0000000..b8dc81f
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/OrderedOn.java
@@ -0,0 +1,32 @@
+/*
+ * 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.simulator;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface OrderedOn
+{
+    OrderOn on();
+    default boolean appliesBeforeScheduling() { return true; }
+    default boolean isOrdered() { return on().isOrdered(); }
+    default boolean isStrict() { return on().isStrict(); }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/RandomSource.java b/test/simulator/main/org/apache/cassandra/simulator/RandomSource.java
new file mode 100644
index 0000000..14d7ad9
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/RandomSource.java
@@ -0,0 +1,320 @@
+/*
+ * 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.simulator;
+
+import java.lang.reflect.Array;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Random;
+import java.util.function.IntSupplier;
+import java.util.function.LongSupplier;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface RandomSource
+{
+    public static class Choices<T>
+    {
+        final float[] cumulativeProbabilities;
+        public final T[] options;
+
+        private Choices(float[] cumulativeProbabilities, T[] options)
+        {
+            this.cumulativeProbabilities = cumulativeProbabilities;
+            this.options = options;
+        }
+
+        public T choose(RandomSource random)
+        {
+            if (options.length == 0)
+                return null;
+
+            float choose = random.uniformFloat();
+            int i = Arrays.binarySearch(cumulativeProbabilities, choose);
+
+            if (i < 0) i = -1 - i;
+            return options[i];
+        }
+
+        public Choices<T> without(T option)
+        {
+            for (int i = 0 ; i < options.length ; ++i)
+            {
+                if (option.equals(options[i]))
+                {
+                    float[] prob = new float[cumulativeProbabilities.length - 1];
+                    T[] opts = (T[]) Array.newInstance(options.getClass().getComponentType(), options.length - 1);
+                    System.arraycopy(cumulativeProbabilities, 0, prob, 0, i);
+                    System.arraycopy(cumulativeProbabilities, i + 1, prob, i, this.options.length - (i + 1));
+                    System.arraycopy(options, 0, opts, 0, i);
+                    System.arraycopy(options, i + 1, opts, i, options.length - (i + 1));
+                    for (int j = prob.length - 1 ; j > 1 ; --j)
+                        prob[j] -= prob[j - 1];
+                    return build(prob, opts);
+                }
+            }
+            return this;
+        }
+
+        private static float[] randomCumulativeProbabilities(RandomSource random, int count)
+        {
+            float[] nonCumulativeProbabilities = new float[count];
+            for (int i = 0 ; i < count ; ++i)
+                nonCumulativeProbabilities[i] = random.uniformFloat();
+            return cumulativeProbabilities(nonCumulativeProbabilities);
+        }
+
+        private static float[] cumulativeProbabilities(float[] nonCumulativeProbabilities)
+        {
+            int count = nonCumulativeProbabilities.length;
+            if (count == 0)
+                return new float[0];
+
+            float[] result = new float[nonCumulativeProbabilities.length];
+            float sum = 0;
+            for (int i = 0 ; i < count ; ++i)
+                result[i] = sum += nonCumulativeProbabilities[i];
+            result[result.length - 1] = 1.0f;
+            for (int i = 0 ; i < count - 1 ; ++i)
+                result[i] = result[i] /= sum;
+            return result;
+        }
+
+        public static <T> Choices<T> random(RandomSource random, T[] options)
+        {
+            return new Choices<>(randomCumulativeProbabilities(random, options.length), options);
+        }
+
+        public static <T> Choices<T> random(RandomSource random, T[] options, Map<T, float[]> bounds)
+        {
+            float[] nonCumulativeProbabilities = new float[options.length];
+            for (int i = 0 ; i < options.length ; ++i)
+            {
+                float[] minmax = bounds.get(options[i]);
+                float uniform = random.uniformFloat();
+                nonCumulativeProbabilities[i] = minmax == null ? uniform : minmax[0] + (uniform * (minmax[1] - minmax[0]));
+            }
+            return new Choices<>(cumulativeProbabilities(nonCumulativeProbabilities), options);
+        }
+
+        public static <T> Choices<T> build(float[] nonCumulativeProbabilities, T[] options)
+        {
+            if (nonCumulativeProbabilities.length != options.length)
+                throw new IllegalArgumentException();
+            return new Choices<>(cumulativeProbabilities(nonCumulativeProbabilities), options);
+        }
+
+        public static <T> Choices<T> uniform(T ... options)
+        {
+            float[] nonCumulativeProbabilities = new float[options.length];
+            Arrays.fill(nonCumulativeProbabilities, 1f / options.length);
+            return new Choices<>(cumulativeProbabilities(nonCumulativeProbabilities), options);
+        }
+    }
+
+    public static abstract class Abstract implements RandomSource
+    {
+        public abstract float uniformFloat();
+        public abstract int uniform(int min, int max);
+        public abstract long uniform(long min, long max);
+
+        public LongSupplier uniqueUniformSupplier(long min, long max)
+        {
+            return uniqueUniformStream(min, max).iterator()::nextLong;
+        }
+
+        public LongStream uniqueUniformStream(long min, long max)
+        {
+            return uniformStream(min, max).distinct();
+        }
+
+        public LongStream uniformStream(long min, long max)
+        {
+            return LongStream.generate(() -> uniform(min, max));
+        }
+
+        public LongSupplier uniformSupplier(long min, long max)
+        {
+            return () -> uniform(min, max);
+        }
+
+        public IntSupplier uniqueUniformSupplier(int min, int max)
+        {
+            return uniqueUniformStream(min, max).iterator()::nextInt;
+        }
+
+        public IntStream uniqueUniformStream(int min, int max)
+        {
+            return uniformStream(min, max).distinct();
+        }
+
+        public IntStream uniformStream(int min, int max)
+        {
+            return IntStream.generate(() -> uniform(min, max));
+        }
+
+        public boolean decide(float chance)
+        {
+            return uniformFloat() < chance;
+        }
+
+        public int log2uniform(int min, int max)
+        {
+            return (int) log2uniform((long) min, max);
+        }
+
+        public long log2uniform(long min, long max)
+        {
+            return qlog2uniform(min, max, 64);
+        }
+
+        public long qlog2uniform(long min, long max, int quantizations)
+        {
+            return min + log2uniform(max - min, quantizations);
+        }
+
+        private long log2uniform(long max, int quantizations)
+        {
+            int maxBits = 64 - Long.numberOfLeadingZeros(max - 1);
+            if (maxBits == 0)
+                return 0;
+
+            long min;
+            if (maxBits <= quantizations)
+            {
+                int bits = uniform(0, maxBits);
+                min = 1L << (bits - 1);
+                max = Math.min(max, min * 2);
+            }
+            else
+            {
+                int bitsPerRange = (maxBits / quantizations);
+                int i = uniform(0, quantizations);
+                min = 1L << (i * bitsPerRange);
+                max = Math.min(max, 1L << ((i + 1) * bitsPerRange));
+            }
+
+            return uniform(min, max);
+        }
+
+        public float qlog2uniformFloat(int quantizations)
+        {
+            return qlog2uniform(0, 1 << 24, quantizations) / (float)(1 << 24);
+        }
+    }
+
+    public static class Default extends Abstract
+    {
+        private final Random random = new Random(0);
+
+        public float uniformFloat() { return random.nextFloat(); }
+
+        @Override
+        public double uniformDouble()
+        {
+            return random.nextDouble();
+        }
+
+        public int uniform(int min, int max)
+        {
+            int delta = max - min;
+            if (delta > 1) return min + random.nextInt(max - min);
+            if (delta == 1) return min;
+            if (min >= max)
+                throw new IllegalArgumentException(String.format("Min (%s) should be less than max (%d).", min, max));
+            return (int)uniform(min, (long)max);
+        }
+
+        public long uniform(long min, long max)
+        {
+            if (min >= max) throw new IllegalArgumentException();
+
+            long delta = max - min;
+            if (delta == 1) return min;
+            if (delta == Long.MIN_VALUE && max == Long.MAX_VALUE) return random.nextLong();
+            if (delta < 0) return random.longs(min, max).iterator().nextLong();
+            if (delta <= Integer.MAX_VALUE) return min + uniform(0, (int) delta);
+
+            long result = min + 1 == max ? min : min + ((random.nextLong() & 0x7fffffff) % (max - min));
+            assert result >= min && result < max;
+            return result;
+        }
+
+        public void reset(long seed)
+        {
+            random.setSeed(seed);
+        }
+
+        public long reset()
+        {
+            long seed = random.nextLong();
+            reset(seed);
+            return seed;
+        }
+    }
+
+    IntStream uniqueUniformStream(int min, int max);
+
+    LongSupplier uniqueUniformSupplier(long min, long max);
+    LongStream uniqueUniformStream(long min, long max);
+    LongStream uniformStream(long min, long max);
+
+    // [min...max)
+    int uniform(int min, int max);
+    // [min...max)
+    long uniform(long min, long max);
+
+    /**
+     * Select a number in the range [min, max), with a power of two in the range [0, max-min)
+     * selected uniformly and a uniform value less than this power of two added to it
+     */
+    int log2uniform(int min, int max);
+    long log2uniform(long min, long max);
+
+    /**
+     * Select a number in the range [min, max), with the range being split into
+     * {@code quantizations} adjacent powers of two, a range being select from these
+     * with uniform probability, and the value within that range being selected uniformly
+     */
+    long qlog2uniform(long min, long max, int quantizations);
+
+    float uniformFloat();
+
+    /**
+     * Select a number in the range [0, 1), with the range being split into
+     * {@code quantizations} adjacent powers of two; a range being select from these
+     * with uniform probability, and the value within that range being selected uniformly
+     *
+     * This is used to distribute behavioural toggles more extremely between different runs of the simulator.
+     */
+    float qlog2uniformFloat(int quantizations);
+    double uniformDouble();
+
+    // options should be cumulative probability in range [0..1]
+    boolean decide(float chance);
+
+    void reset(long seed);
+    long reset();
+}
+
diff --git a/test/simulator/main/org/apache/cassandra/simulator/RunnableActionScheduler.java b/test/simulator/main/org/apache/cassandra/simulator/RunnableActionScheduler.java
new file mode 100644
index 0000000..95be929
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/RunnableActionScheduler.java
@@ -0,0 +1,141 @@
+/*
+ * 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.simulator;
+
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.Consumer;
+
+import org.apache.cassandra.simulator.utils.KindOfSequence;
+
+public abstract class RunnableActionScheduler implements Consumer<Action>
+{
+    public enum Kind { RANDOM_WALK, UNIFORM, SEQUENTIAL }
+
+    public static class Immediate extends RunnableActionScheduler
+    {
+        private final AtomicLong id = new AtomicLong();
+
+        public Immediate() { }
+
+        @Override
+        public double priority()
+        {
+            return id.incrementAndGet();
+        }
+    }
+
+    public static class Sequential extends RunnableActionScheduler
+    {
+        final AtomicInteger next = new AtomicInteger();
+
+        @Override
+        public double priority()
+        {
+            return next.incrementAndGet();
+        }
+
+        public Sequential() { }
+    }
+
+    public abstract static class AbstractRandom extends RunnableActionScheduler
+    {
+        protected final RandomSource random;
+
+        public AbstractRandom(RandomSource random)
+        {
+            this.random = random;
+        }
+    }
+
+    public static class RandomUniform extends AbstractRandom
+    {
+        final double min, range;
+
+        RandomUniform(RandomSource random, double min, double range)
+        {
+            super(random);
+            this.min = min;
+            this.range = range;
+        }
+
+        public RandomUniform(RandomSource random)
+        {
+            this(random, 0d, 1d);
+        }
+
+        @Override
+        public double priority()
+        {
+            return min + random.uniformDouble() * range;
+        }
+    }
+
+    static class RandomWalk extends AbstractRandom
+    {
+        final double maxStepSize;
+        double cur;
+
+        @Override
+        public double priority()
+        {
+            double result = cur;
+            double step = 2 * (random.uniformDouble() - 1f) * maxStepSize;
+            this.cur = step > 0 ? Math.min(1d, cur + step)
+                                : Math.max(0d, cur + step);
+            return result;
+        }
+
+        @Override
+        protected RunnableActionScheduler next()
+        {
+            return new RunnableActionScheduler.RandomWalk(random, cur);
+        }
+
+        RandomWalk(RandomSource random, double cur)
+        {
+            super(random);
+            this.maxStepSize = KindOfSequence.maxStepSize(0f, 1f, random);
+            this.cur = cur;
+        }
+
+        RandomWalk(RandomSource random)
+        {
+            this(random, 0.5d);
+        }
+    }
+
+    public abstract double priority();
+
+    protected RunnableActionScheduler next()
+    {
+        return this;
+    }
+
+    public void attachTo(ActionList actions)
+    {
+        actions.forEach(next());
+    }
+
+    @Override
+    public void accept(Action action)
+    {
+        action.setScheduler(this);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/Simulation.java b/test/simulator/main/org/apache/cassandra/simulator/Simulation.java
new file mode 100644
index 0000000..8fd1532
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/Simulation.java
@@ -0,0 +1,27 @@
+/*
+ * 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.simulator;
+
+import org.apache.cassandra.utils.CloseableIterator;
+
+public interface Simulation extends AutoCloseable
+{
+    CloseableIterator<?> iterator();
+    void run();
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/SimulationException.java b/test/simulator/main/org/apache/cassandra/simulator/SimulationException.java
new file mode 100644
index 0000000..71ad4e0
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/SimulationException.java
@@ -0,0 +1,37 @@
+/*
+ * 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.simulator;
+
+public class SimulationException extends RuntimeException
+{
+    public SimulationException(long seed, Throwable t)
+    {
+        super(createMsg(seed, null), t, true, false);
+    }
+
+    public SimulationException(long seed, String msg, Throwable t)
+    {
+        super(createMsg(seed, msg), t, true, false);
+    }
+
+    private static String createMsg(long seed, String msg)
+    {
+        return String.format("Failed on seed 0x%s%s", Long.toHexString(seed), msg == null ? "" : "; " + msg);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/SimulationRunner.java b/test/simulator/main/org/apache/cassandra/simulator/SimulationRunner.java
new file mode 100644
index 0000000..6f1eb12
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/SimulationRunner.java
@@ -0,0 +1,471 @@
+/*
+ * 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.simulator;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Optional;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.function.ToDoubleFunction;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import org.junit.BeforeClass;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import io.airlift.airline.Command;
+import io.airlift.airline.Help;
+import io.airlift.airline.Option;
+import io.netty.util.concurrent.FastThreadLocal;
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.simulator.Debug.Info;
+import org.apache.cassandra.simulator.Debug.Levels;
+import org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange;
+import org.apache.cassandra.simulator.debug.SelfReconcile;
+import org.apache.cassandra.simulator.systems.InterceptedWait;
+import org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites.Capture;
+import org.apache.cassandra.simulator.systems.InterceptibleThread;
+import org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods;
+import org.apache.cassandra.simulator.utils.ChanceRange;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.Hex;
+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.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.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.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.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;
+import static org.apache.cassandra.config.CassandraRelevantProperties.RING_DELAY;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SHUTDOWN_ANNOUNCE_DELAY_IN_MS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.SYSTEM_AUTH_DEFAULT_RF;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_IGNORE_SIGAR;
+import static org.apache.cassandra.config.CassandraRelevantProperties.DISABLE_GOSSIP_ENDPOINT_REMOVAL;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_JVM_DTEST_DISABLE_SSL;
+import static org.apache.cassandra.simulator.debug.Reconcile.reconcileWith;
+import static org.apache.cassandra.simulator.debug.Record.record;
+import static org.apache.cassandra.simulator.debug.SelfReconcile.reconcileWithSelf;
+import static org.apache.cassandra.simulator.utils.IntRange.parseRange;
+import static org.apache.cassandra.simulator.utils.LongRange.parseNanosRange;
+
+@SuppressWarnings({ "ZeroLengthArrayAllocation", "CodeBlock2Expr", "SameParameterValue", "DynamicRegexReplaceableByCompiledPattern", "CallToSystemGC" })
+public class SimulationRunner
+{
+    private static final Logger logger = LoggerFactory.getLogger(SimulationRunner.class);
+
+    public enum RecordOption { NONE, VALUE, WITH_CALLSITES }
+
+    @BeforeClass
+    public static void beforeAll()
+    {
+        // setup system properties for our instances to behave correctly and consistently/deterministically
+
+        // Disallow time on the bootstrap classloader
+        for (CassandraRelevantProperties property : Arrays.asList(CLOCK_GLOBAL, CLOCK_MONOTONIC_APPROX, CLOCK_MONOTONIC_PRECISE))
+            property.setString("org.apache.cassandra.simulator.systems.SimulatedTime$Delegating");
+        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");
+
+        // 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");
+
+        for (CassandraRelevantProperties property : Arrays.asList(CLOCK_GLOBAL, CLOCK_MONOTONIC_APPROX, CLOCK_MONOTONIC_PRECISE))
+            property.setString("org.apache.cassandra.simulator.systems.SimulatedTime$Global");
+
+        CASSANDRA_JMX_REMOTE_PORT.setString("");
+        RING_DELAY.setInt(0);
+        PAXOS_REPAIR_RETRY_TIMEOUT_IN_MS.setLong(NANOSECONDS.toMillis(Long.MAX_VALUE));
+        SHUTDOWN_ANNOUNCE_DELAY_IN_MS.setInt(0);
+        DETERMINISM_UNSAFE_UUID_NODE.setBoolean(true);
+        GOSSIPER_SKIP_WAITING_TO_SETTLE.setInt(0);
+        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);
+        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);
+        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
+        new InterceptedWait.CaptureSites(Thread.currentThread())
+        .toString(ste -> !ste.getClassName().equals(SelfReconcile.class.getName())); // ensure self reconcile verify can work without infinite looping
+        InterceptorOfGlobalMethods.Global.unsafeReset();
+        ThreadLocalRandom.current();
+    }
+
+    protected interface ICommand<B extends ClusterSimulation.Builder<?>>
+    {
+        public void run(B builder) throws IOException;
+    }
+
+    protected abstract static class BasicCommand<B extends ClusterSimulation.Builder<?>> implements ICommand<B>
+    {
+        @Option(name = { "--seed" } , title = "0x", description = "Specify the first seed to test (each simulation will increment the seed by 1)")
+        protected String seed;
+
+        @Option(name = { "--simulations"} , title = "int", description = "The number of simulations to run")
+        protected int simulationCount = 1;
+
+        @Option(name = { "-t", "--threads" }, title = "int", description = "The number of threads to split between node thread pools. Each ongoing action also requires its own thread.")
+        protected int threadCount = 1000;
+
+        @Option(name = { "-n", "--nodes" } , title = "int...int", description = "Cluster size range, lb..ub (default 4..16)")
+        protected String nodeCount = "4..16";
+
+        @Option(name = { "--dcs" }, title = "int...int", description = "Cluster DC count, lb..ub (default 1..2)")
+        protected String dcCount = "1..2";
+
+        @Option(name = { "-o", "--within-key-concurrency" }, title = "int..int", description = "Number of simultaneous paxos operations per key, lb..ub (default 2..5)")
+        protected String withinKeyConcurrency = "2..5";
+
+        @Option(name = { "-c", "--concurrency" }, title = "int", description = "Number of keys to operate on simultaneously (default 10)")
+        protected int concurrency = 10;
+        @Option(name = { "-k", "--keys" }, title = "int", description = "Number of unique partition keys to operate over (default to 2* concurrency)")
+        protected int primaryKeyCount = -1;
+        @Option(name = { "--key-seconds" }, title = "int...int", description = "Number of seconds to simulate a partition key for before selecting another (default 5..30)")
+        protected String primaryKeySeconds = "5..30";
+
+        @Option(name = { "--cluster-actions" }, title = "JOIN,LEAVE,REPLACE,CHANGE_RF", description = "Cluster actions to select from, comma delimited (JOIN, LEAVE, REPLACE, CHANGE_RF)")
+        protected String topologyChanges = stream(TopologyChange.values()).map(Object::toString).collect(Collectors.joining(","));
+        @Option(name = { "--cluster-action-interval" }, title = "int...int(s|ms|us|ns)", description = "The period of time between two cluster actions (default 5..15s)")
+        protected String topologyChangeInterval = "5..15s";
+        @Option(name = { "--cluster-action-limit" }, title = "int", description = "The maximum number of topology change events to perform (default 0)")
+        protected String topologyChangeLimit = "0";
+
+        @Option(name = { "-s", "--run-time" }, title = "int", description = "Length of simulated time to run in seconds (default -1)")
+        protected int secondsToSimulate = -1;
+
+        @Option(name = { "--reads" }, title = "[distribution:]float...float", description = "Proportion of actions that are reads (default: 0.05..0.95)")
+        protected String readChance;
+        @Option(name = { "--nemesis" }, title = "[distribution:]float...float", description = "Proportion of nemesis points that are intercepted (default: 0..0.01)")
+        protected String nemesisChance;
+
+        @Option(name = { "--priority" }, title = "uniform|randomwalk|seq", description = "Priority assignment for actions that may overlap their execution", allowedValues = { "uniform", "randomwalk", "seq" })
+        protected String priority;
+
+        // TODO (feature): simulate GC pauses
+
+        @Option(name = { "--network-flaky-chance" }, title = "[distribution:]float...float", description = "Chance of some minority of nodes experiencing flaky connections (default: qlog:0.01..0.1)")
+        protected String networkFlakyChance = "qlog:0.01..0.1";
+        @Option(name = { "--network-partition-chance" }, title = "[distribution:]float...float", description = "Chance of some minority of nodes being isolated (default: qlog:0.01..0.1)")
+        protected String networkPartitionChance = "qlog:0.01..0.1";
+        @Option(name = { "--network-reconfigure-interval" }, title = "int...int(s|ms|us|ns)", description = "Period of time for which a flaky or catastrophic network partition may be in force")
+        protected String networkReconfigureInterval = "1..10s";
+        @Option(name = { "--network-drop-chance" }, title = "[distribution:]float...float", description = "Chance of dropping a message under normal circumstances (default: qlog:0..0.001)")
+        protected String networkDropChance = "qlog:0..0.001";
+        // TODO (feature): TDP vs UDP simulation (right now we have no head of line blocking so we deliver in a UDP fashion which is not how the cluster operates)
+        @Option(name = { "--network-delay-chance" }, title = "[distribution:]float...float", description = "Chance of delaying a message under normal circumstances (default: qlog:0..0.1)")
+        protected String networkDelayChance = "qlog:0..0.01";
+        @Option(name = { "--network-latency" }, title = "int...int(s|ms|us|ns)", description = "Range of possible latencies messages can be simulated to experience (default 1..2ms)")
+        protected String networkLatency = "1..2ms";
+        @Option(name = { "--network-delay" }, title = "int...int(s|ms|us|ns)", description = "Range of possible latencies messages can be simulated to experience when delayed (default 2..20ms)")
+        protected String networkDelay = "2..20ms";
+        @Option(name = { "--network-flaky-drop-chance" }, title = "[distribution:]float...float", description = "Chance of dropping a message on a flaky connection (default: qlog:0.01..0.1)")
+        protected String flakyNetworkDropChance = "qlog:0.01..0.1";
+        @Option(name = { "--network-flaky-delay-chance" }, title = "[distribution:]float...float", description = "Chance of delaying a message on a flaky connection (default: qlog:0.01..0.2)")
+        protected String flakyNetworkDelayChance = "qlog:0.01..0.2";
+        @Option(name = { "--network-flaky-latency" }, title = "int...int(s|ms|us|ns)", description = "Range of possible latencies messages can be simulated to experience on a flaky connection (default 2..4ms)")
+        protected String flakyNetworkLatency = "2..4ms";
+        @Option(name = { "--network-flaky-delay" }, title = "int...int(s|ms|us|ns)", description = "Range of possible latencies messages can be simulated to experience when delayed on a flaky connection (default 4..100ms)")
+        protected String flakyNetworkDelay = "4..100ms";
+
+        @Option(name = { "--clock-drift" }, title = "int...int(s|ms|us|ns)", description = "The range of clock skews to experience (default 10..1000ms)")
+        protected String clockDrift = "10..1000ms";
+        @Option(name = { "--clock-discontinuity-interval" }, title = "int...int(s|ms|us|ns)", description = "The period of clock continuity (a discontinuity is a large jump of the global clock to introduce additional chaos for event scheduling) (default 10..60s)")
+        protected String clockDiscontinuityInterval = "10..60s";
+
+        @Option(name = { "--scheduler-jitter" }, title = "int...int(s|ms|us|ns)", description = "The scheduler will randomly prioritise all tasks scheduled to run within this interval (default 10..1500us)")
+        protected String schedulerJitter = "10..1500us";
+        @Option(name = { "--scheduler-delay-chance" }, title = "[distribution:]float...float", description = "Chance of delaying the consequence of an action (default: 0..0.1)")
+        protected String schedulerDelayChance = "qlog:0..0.1";
+        @Option(name = { "--scheduler-delay" }, title = "int...int(s|ms|us|ns)", description = "Range of possible additional latencies thread execution can be simulated to experience when delayed (default 1..10000us)")
+        protected String schedulerDelayMicros = "1..10000us";
+        @Option(name = { "--scheduler-long-delay" }, title = "int...int(s|ms|us|ns)", description = "Range of possible additional latencies thread execution can be simulated to experience when delayed (default 1..10000us)")
+        protected String schedulerLongDelayMicros = "1..10000us";
+
+        @Option(name = { "--log" }, title = "level", description = "<partition> <cluster> level events, between 0 and 2", arity = 2)
+        protected List<Integer> log;
+
+        @Option(name = { "--debug-keys" }, title = "level", description = "Print debug info only for these keys (comma delimited)")
+        protected String debugKeys;
+
+        @Option(name = { "--debug-rf" }, title = "level", description = "Print RF on <partition> <cluster> events; level 0 to 2", arity = 2, allowedValues = { "0", "1", "2" })
+        protected List<Integer> debugRf;
+
+        @Option(name = { "--debug-ownership" }, title = "level", description = "Print ownership on <partition> <cluster> events; level 0 to 2", arity = 2, allowedValues = { "0", "1", "2" })
+        protected List<Integer> debugOwnership;
+
+        @Option(name = { "--debug-ring" }, title = "level", description = "Print ring state on <partition> <cluster> events; level 0 to 2", arity = 2, allowedValues = { "0", "1", "2" })
+        protected List<Integer> debugRing;
+
+        @Option(name = { "--debug-gossip" }, title = "level", description = "Debug gossip at <partition> <cluster> events; level 0 to 2", arity = 2, allowedValues = { "0", "1", "2" })
+        protected List<Integer> debugGossip;
+
+        @Option(name = { "--debug-paxos" }, title = "level", description = "Print paxos state on <partition> <cluster> events; level 0 to 2", arity = 2, allowedValues = { "0", "1", "2" })
+        protected List<Integer> debugPaxos;
+
+        @Option(name = { "--capture" }, title = "wait,wake,now", description = "Capture thread stack traces alongside events, choose from (wait,wake,now)")
+        protected String capture;
+
+        protected void propagate(B builder)
+        {
+            builder.threadCount(threadCount);
+            builder.concurrency(concurrency);
+            if (primaryKeyCount >= 0) builder.primaryKeyCount(primaryKeyCount);
+            else builder.primaryKeyCount(2 * concurrency);
+            builder.secondsToSimulate(secondsToSimulate);
+            parseChanceRange(Optional.ofNullable(networkPartitionChance)).ifPresent(builder::networkPartitionChance);
+            parseChanceRange(Optional.ofNullable(networkFlakyChance)).ifPresent(builder::networkFlakyChance);
+            parseNanosRange(Optional.ofNullable(networkReconfigureInterval)).ifPresent(builder::networkReconfigureInterval);
+            parseChanceRange(Optional.ofNullable(networkDropChance)).ifPresent(builder::networkDropChance);
+            parseChanceRange(Optional.ofNullable(networkDelayChance)).ifPresent(builder::networkDelayChance);
+            parseNanosRange(Optional.ofNullable(networkLatency)).ifPresent(builder::networkLatencyNanos);
+            parseNanosRange(Optional.ofNullable(networkDelay)).ifPresent(builder::networkDelayNanos);
+            parseChanceRange(Optional.ofNullable(flakyNetworkDropChance)).ifPresent(builder::flakyNetworkDropChance);
+            parseChanceRange(Optional.ofNullable(flakyNetworkDelayChance)).ifPresent(builder::flakyNetworkDelayChance);
+            parseNanosRange(Optional.ofNullable(flakyNetworkLatency)).ifPresent(builder::flakyNetworkLatencyNanos);
+            parseNanosRange(Optional.ofNullable(flakyNetworkDelay)).ifPresent(builder::flakyNetworkDelayNanos);
+            parseChanceRange(Optional.ofNullable(schedulerDelayChance)).ifPresent(builder::schedulerDelayChance);
+            parseNanosRange(Optional.ofNullable(clockDrift)).ifPresent(builder::clockDriftNanos);
+            parseNanosRange(Optional.ofNullable(clockDiscontinuityInterval)).ifPresent(builder::clockDiscontinuityIntervalNanos);
+            parseNanosRange(Optional.ofNullable(schedulerJitter)).ifPresent(builder::schedulerJitterNanos);
+            parseNanosRange(Optional.ofNullable(schedulerDelayMicros)).ifPresent(builder::schedulerDelayNanos);
+            parseNanosRange(Optional.ofNullable(schedulerLongDelayMicros)).ifPresent(builder::schedulerLongDelayNanos);
+            parseChanceRange(Optional.ofNullable(readChance)).ifPresent(builder::readChance);
+            parseChanceRange(Optional.ofNullable(nemesisChance)).ifPresent(builder::nemesisChance);
+            parseRange(Optional.ofNullable(nodeCount)).ifPresent(builder::nodes);
+            parseRange(Optional.ofNullable(dcCount)).ifPresent(builder::dcs);
+            parseRange(Optional.ofNullable(primaryKeySeconds)).ifPresent(builder::primaryKeySeconds);
+            parseRange(Optional.ofNullable(withinKeyConcurrency)).ifPresent(builder::withinKeyConcurrency);
+            Optional.ofNullable(topologyChanges).ifPresent(topologyChanges -> {
+                builder.topologyChanges(stream(topologyChanges.split(","))
+                                        .filter(v -> !v.isEmpty())
+                                        .map(v -> TopologyChange.valueOf(v.toUpperCase()))
+                                        .toArray(TopologyChange[]::new));
+            });
+            parseNanosRange(Optional.ofNullable(topologyChangeInterval)).ifPresent(builder::topologyChangeIntervalNanos);
+            builder.topologyChangeLimit(Integer.parseInt(topologyChangeLimit));
+            Optional.ofNullable(priority).ifPresent(kinds -> {
+                builder.scheduler(stream(kinds.split(","))
+                                  .filter(v -> !v.isEmpty())
+                                  .map(v -> RunnableActionScheduler.Kind.valueOf(v.toUpperCase()))
+                                  .toArray(RunnableActionScheduler.Kind[]::new));
+            });
+
+            Optional.ofNullable(this.capture)
+                    .map(s -> s.split(","))
+                    .map(s -> new Capture(
+                        stream(s).anyMatch(s2 -> s2.equalsIgnoreCase("wait")),
+                        stream(s).anyMatch(s2 -> s2.equalsIgnoreCase("wake")),
+                        stream(s).anyMatch(s2 -> s2.equalsIgnoreCase("now"))
+                    ))
+                    .ifPresent(builder::capture);
+
+            EnumMap<Info, Levels> debugLevels = new EnumMap<>(Info.class);
+            Optional.ofNullable(log).ifPresent(list -> debugLevels.put(Info.LOG, new Levels(list.get(0), list.get(1))));
+            Optional.ofNullable(debugRf).ifPresent(list -> debugLevels.put(Info.RF, new Levels(list.get(0), list.get(1))));
+            Optional.ofNullable(debugOwnership).ifPresent(list -> debugLevels.put(Info.OWNERSHIP, new Levels(list.get(0), list.get(1))));
+            Optional.ofNullable(debugRing).ifPresent(list -> debugLevels.put(Info.RING, new Levels(list.get(0), list.get(1))));
+            Optional.ofNullable(debugGossip).ifPresent(list -> debugLevels.put(Info.GOSSIP, new Levels(list.get(0), list.get(1))));
+            Optional.ofNullable(debugPaxos).ifPresent(list -> debugLevels.put(Info.PAXOS, new Levels(list.get(0), list.get(1))));
+            if (!debugLevels.isEmpty())
+            {
+                int[] debugPrimaryKeys = Optional.ofNullable(debugKeys)
+                                                 .map(pks -> stream(pks.split(",")).mapToInt(Integer::parseInt).sorted().toArray())
+                                                 .orElse(new int[0]);
+                builder.debug(debugLevels, debugPrimaryKeys);
+            }
+        }
+
+        public void run(B builder) throws IOException
+        {
+            beforeAll();
+            Thread.setDefaultUncaughtExceptionHandler((th, e) -> {
+                boolean isInterrupt = false;
+                Throwable t = e;
+                while (!isInterrupt && t != null)
+                {
+                    isInterrupt = t instanceof InterruptedException || t instanceof UncheckedInterruptedException;
+                    t = t.getCause();
+                }
+                if (!isInterrupt)
+                    logger.error("Uncaught exception on {}", th, e);
+                if (e instanceof Error)
+                    throw (Error) e;
+            });
+
+            propagate(builder);
+
+            long seed = parseHex(Optional.ofNullable(this.seed)).orElse(new Random(System.nanoTime()).nextLong());
+            for (int i = 0 ; i < simulationCount ; ++i)
+            {
+                cleanup();
+                run(seed, builder);
+                ++seed;
+            }
+        }
+
+        protected abstract void run(long seed, B builder) throws IOException;
+    }
+
+    @Command(name = "run")
+    protected static class Run<B extends ClusterSimulation.Builder<?>> extends BasicCommand<B>
+    {
+        protected void run(long seed, B builder) throws IOException
+        {
+            logger.error("Seed 0x{}", Long.toHexString(seed));
+
+            try (ClusterSimulation<?> cluster = builder.create(seed))
+            {
+                try
+                {
+                    cluster.simulation.run();
+                }
+                catch (Throwable t)
+                {
+                    throw new SimulationException(seed, t);
+                }
+            }
+            catch (Throwable t)
+            {
+                if (t instanceof SimulationException) throw t;
+                throw new SimulationException(seed, "Failure creating the simulation", t);
+            }
+        }
+    }
+
+    @Command(name = "record")
+    protected static class Record<B extends ClusterSimulation.Builder<?>> extends BasicCommand<B>
+    {
+        @Option(name = {"--to"}, description = "Directory of recordings to reconcile with for the seed", required = true)
+        private String dir;
+
+        @Option(name = {"--with-rng"}, title = "0|1", description = "Record RNG values (with or without call sites)", allowedValues = {"0", "1"})
+        private int rng = -1;
+
+        @Option(name = {"--with-time"}, title = "0|1", description = "Record time values (with or without call sites)", allowedValues = {"0", "1"})
+        private int time = -1;
+
+        @Override
+        protected void run(long seed, B builder) throws IOException
+        {
+            record(dir, seed, RecordOption.values()[rng + 1], RecordOption.values()[time + 1], builder);
+        }
+    }
+
+    @Command(name = "reconcile")
+    protected static class Reconcile<B extends ClusterSimulation.Builder<?>> extends BasicCommand<B>
+    {
+        @Option(name = {"--with"}, description = "Directory of recordings to reconcile with for the seed")
+        private String dir;
+
+        @Option(name = {"--with-rng"}, title = "0|1", description = "Reconcile RNG values (if present in source)", allowedValues = {"0", "1"})
+        private int rng = -1;
+
+        @Option(name = {"--with-time"}, title = "0|1", description = "Reconcile time values (if present in source)", allowedValues = {"0", "1"})
+        private int time = -1;
+
+        @Option(name = {"--with-allocations"}, description = "Reconcile memtable allocations (only with --with-self)", arity = 0)
+        private boolean allocations;
+
+        @Option(name = {"--with-self"}, description = "Reconcile with self", arity = 0)
+        private boolean withSelf;
+
+        @Override
+        protected void run(long seed, B builder) throws IOException
+        {
+            RecordOption withRng = RecordOption.values()[rng + 1];
+            RecordOption withTime = RecordOption.values()[time + 1];
+            if (withSelf) reconcileWithSelf(seed, withRng, withTime, allocations, builder);
+            else if (allocations) throw new IllegalArgumentException("--with-allocations is only compatible with --with-self");
+            else reconcileWith(dir, seed, withRng, withTime, builder);
+        }
+    }
+
+    protected static class HelpCommand<B extends ClusterSimulation.Builder<?>> extends Help implements ICommand<B>
+    {
+        @Override
+        public void run(B builder) throws IOException
+        {
+            super.run();
+        }
+    }
+
+
+    private static Optional<Long> parseHex(Optional<String> value)
+    {
+        return value.map(s -> {
+            if (s.startsWith("0x"))
+                return Hex.parseLong(s, 2, s.length());
+            throw new IllegalArgumentException("Invalid hex string: " + s);
+        });
+    }
+
+    private static final Pattern CHANCE_PATTERN = Pattern.compile("(uniform|(?<qlog>qlog(\\((?<quantizations>[0-9]+)\\))?):)?(?<min>0(\\.[0-9]+)?)(..(?<max>0\\.[0-9]+))?", Pattern.CASE_INSENSITIVE);
+    private static Optional<ChanceRange> parseChanceRange(Optional<String> chance)
+    {
+        return chance.map(s -> {
+            ToDoubleFunction<RandomSource> chanceSelector = RandomSource::uniformFloat;
+            Matcher m = CHANCE_PATTERN.matcher(s);
+            if (!m.matches()) throw new IllegalArgumentException("Invalid chance specification: " + s);
+            if (m.group("qlog") != null)
+            {
+                int quantizations = m.group("quantizations") == null ? 4 : Integer.parseInt(m.group("quantizations"));
+                chanceSelector = randomSource -> randomSource.qlog2uniformFloat(quantizations);
+            }
+            float min = Float.parseFloat(m.group("min"));
+            float max = m.group("max") == null ? min : Float.parseFloat(m.group("max"));
+            return new ChanceRange(chanceSelector, min, max);
+        });
+    }
+
+    private static void cleanup()
+    {
+        FastThreadLocal.destroy();
+        for (int i = 0 ; i < 10 ; ++i)
+            System.gc();
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/SimulatorUtils.java b/test/simulator/main/org/apache/cassandra/simulator/SimulatorUtils.java
new file mode 100644
index 0000000..5be3384
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/SimulatorUtils.java
@@ -0,0 +1,48 @@
+/*
+ * 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.simulator;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.slf4j.Logger;
+
+import io.netty.util.concurrent.FastThreadLocal;
+import org.apache.cassandra.utils.concurrent.Threads;
+
+public class SimulatorUtils
+{
+    public static RuntimeException failWithOOM()
+    {
+        List<long[]> oom = new ArrayList<>();
+        for (int i = 0 ; i < 1024 ; ++i)
+            oom.add(new long[0x7fffffff]);
+        throw new AssertionError();
+    }
+
+    public static void dumpStackTraces(Logger logger)
+    {
+        Map<Thread, StackTraceElement[]> threadMap = Thread.getAllStackTraces();
+        threadMap.forEach((thread, ste) -> {
+            logger.error("{}:\n   {}", thread, Threads.prettyPrint(ste, false, "   ", "\n", ""));
+        });
+        FastThreadLocal.destroy();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/asm/InterceptAsClassTransformer.java b/test/simulator/main/org/apache/cassandra/simulator/asm/InterceptAsClassTransformer.java
new file mode 100644
index 0000000..200f984
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/asm/InterceptAsClassTransformer.java
@@ -0,0 +1,49 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.function.Predicate;
+
+import org.apache.cassandra.distributed.api.IClassTransformer;
+
+// an adapter to IClassTransformer that is loaded by the system classloader
+public class InterceptAsClassTransformer extends InterceptClasses implements IClassTransformer
+{
+    public InterceptAsClassTransformer(ChanceSupplier monitorDelayChance, ChanceSupplier nemesisChance, NemesisFieldKind.Selector nemesisFieldSelector, ClassLoader prewarmClassLoader, Predicate<String> prewarm)
+    {
+        super(monitorDelayChance, nemesisChance, nemesisFieldSelector, prewarmClassLoader, prewarm);
+    }
+
+    public InterceptAsClassTransformer(int api, ChanceSupplier monitorDelayChance, ChanceSupplier nemesisChance, NemesisFieldKind.Selector nemesisFieldSelector, ClassLoader prewarmClassLoader, Predicate<String> prewarm)
+    {
+        super(api, monitorDelayChance, nemesisChance, nemesisFieldSelector, prewarmClassLoader, prewarm);
+    }
+
+    @Override
+    public byte[] transform(String name, byte[] bytecode)
+    {
+        return apply(name, bytecode);
+    }
+
+    @Override
+    public IClassTransformer initialise()
+    {
+        return new SubTransformer()::apply;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/asm/NemesisFieldSelectors.java b/test/simulator/main/org/apache/cassandra/simulator/asm/NemesisFieldSelectors.java
new file mode 100644
index 0000000..e8c420d
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/asm/NemesisFieldSelectors.java
@@ -0,0 +1,67 @@
+/*
+ * 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.simulator.asm;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.stream.Stream;
+
+import org.apache.cassandra.utils.Nemesis;
+import org.reflections.Reflections;
+import org.reflections.scanners.FieldAnnotationsScanner;
+import org.reflections.util.ConfigurationBuilder;
+
+import static java.util.Collections.emptyMap;
+import static org.apache.cassandra.simulator.asm.InterceptClasses.dotsToSlashes;
+import static org.apache.cassandra.simulator.asm.NemesisFieldKind.SIMPLE;
+
+/**
+ * Define classes that receive special handling.
+ * At present all instance methods invoked on such classes have nemesis points inserted either side of them.
+ */
+public class NemesisFieldSelectors
+{
+    public static final Map<String, Map<String, NemesisFieldKind>> classToFieldToNemesis;
+
+    static
+    {
+        Map<Class<?>, NemesisFieldKind> byClass = new HashMap<>();
+        for (NemesisFieldKind type : NemesisFieldKind.values())
+            type.classes.forEach(c -> byClass.put(c, type));
+
+        Stream.of(AtomicIntegerFieldUpdater.class, AtomicLongFieldUpdater.class, AtomicReferenceFieldUpdater.class)
+              .forEach(c -> byClass.put(c, NemesisFieldKind.ATOMICUPDATERX));
+
+        Map<String, Map<String, NemesisFieldKind>> byField = new HashMap<>();
+        new Reflections(ConfigurationBuilder.build("org.apache.cassandra").addScanners(new FieldAnnotationsScanner()))
+        .getFieldsAnnotatedWith(Nemesis.class)
+        .forEach(field -> byField.computeIfAbsent(dotsToSlashes(field.getDeclaringClass()), ignore -> new HashMap<>())
+                                 .put(field.getName(), byClass.getOrDefault(field.getType(), SIMPLE)));
+        classToFieldToNemesis = Collections.unmodifiableMap(byField);
+    }
+
+    public static NemesisFieldKind.Selector get()
+    {
+        return (name, field) -> classToFieldToNemesis.getOrDefault(name, emptyMap()).get(field);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterAction.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterAction.java
new file mode 100644
index 0000000..90289de
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterAction.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
+import org.apache.cassandra.simulator.systems.SimulatedActionTask;
+
+class ClusterAction extends SimulatedActionTask
+{
+    ClusterAction(String description, Modifiers self, Modifiers children, ClusterActions actions, int on, SerializableRunnable invoke)
+    {
+        super(description, self.with(Modifier.DISPLAY_ORIGIN), children, actions, actions.cluster.get(on), invoke);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterActionListener.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterActionListener.java
new file mode 100644
index 0000000..c8d873f
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterActionListener.java
@@ -0,0 +1,75 @@
+/*
+ * 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.simulator.cluster;
+
+public interface ClusterActionListener
+{
+    interface TopologyChangeValidator
+    {
+        public void before(Topology before, int[] participatingKeys);
+        public void after(Topology after);
+    }
+
+    interface RepairValidator
+    {
+        public void before(Topology topology, boolean repairPaxos, boolean repairOnlyPaxos);
+        public void after();
+    }
+
+    TopologyChangeValidator newTopologyChangeValidator(Object id);
+    RepairValidator newRepairValidator(Object id);
+
+    class NoOpListener implements ClusterActionListener
+    {
+
+        @Override
+        public TopologyChangeValidator newTopologyChangeValidator(Object id)
+        {
+            return new TopologyChangeValidator()
+            {
+                @Override
+                public void before(Topology before, int[] participatingKeys)
+                {
+                }
+
+                @Override
+                public void after(Topology after)
+                {
+                }
+            };
+        }
+
+        @Override
+        public RepairValidator newRepairValidator(Object id)
+        {
+            return new RepairValidator()
+            {
+                @Override
+                public void before(Topology topology, boolean repairPaxos, boolean repairOnlyPaxos)
+                {
+                }
+
+                @Override
+                public void after()
+                {
+                }
+            };
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterActions.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterActions.java
new file mode 100644
index 0000000..ab66d50
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterActions.java
@@ -0,0 +1,287 @@
+/*
+ * 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.simulator.cluster;
+
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.google.common.base.Preconditions;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.Config.PaxosVariant;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstance;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.ReplicaLayout;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.Actions.ReliableAction;
+import org.apache.cassandra.simulator.Actions.StrictAction;
+import org.apache.cassandra.simulator.Debug;
+import org.apache.cassandra.simulator.RandomSource.Choices;
+import org.apache.cassandra.simulator.systems.InterceptedExecution;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor;
+import org.apache.cassandra.simulator.systems.NonInterceptible;
+import org.apache.cassandra.simulator.systems.SimulatedSystems;
+import org.apache.cassandra.simulator.utils.KindOfSequence;
+
+import static org.apache.cassandra.distributed.impl.UnsafeGossipHelper.addToRingNormalRunner;
+import static org.apache.cassandra.simulator.Action.Modifiers.NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.Debug.EventType.CLUSTER;
+import static org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange.JOIN;
+import static org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange.LEAVE;
+import static org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange.REPLACE;
+import static org.apache.cassandra.simulator.systems.NonInterceptible.Permit.REQUIRED;
+import static org.apache.cassandra.simulator.utils.KindOfSequence.UNIFORM;
+
+
+// TODO (feature): add Gossip failures (up to some acceptable number)
+// TODO (feature): add node down/up (need to coordinate bootstrap/repair execution around this)
+// TODO (feature): add node stop/start (need to coordinate normal operation execution around this)
+// TODO (feature): permit multiple topology actions in parallel, e.g. REPLACE and CHANGE_RF
+// TODO (feature): support nodes rejoining cluster so we can leave running indefinitely
+@SuppressWarnings("unused")
+public class ClusterActions extends SimulatedSystems
+{
+    private static final Logger logger = LoggerFactory.getLogger(ClusterActions.class);
+
+    public enum TopologyChange
+    {
+        JOIN, LEAVE, REPLACE, CHANGE_RF
+    }
+
+    public static class Options
+    {
+        public final int topologyChangeLimit;
+        public final KindOfSequence.Period topologyChangeInterval;
+        public final Choices<TopologyChange> allChoices;
+        public final Choices<TopologyChange> choicesNoLeave;
+        public final Choices<TopologyChange> choicesNoJoin;
+
+        public final int[] minRf, initialRf, maxRf;
+        public final PaxosVariant changePaxosVariantTo;
+
+        public Options(Options copy)
+        {
+            this(copy, copy.changePaxosVariantTo);
+        }
+
+        public Options(Options copy, PaxosVariant changePaxosVariantTo)
+        {
+            this.topologyChangeLimit = copy.topologyChangeLimit;
+            this.topologyChangeInterval = copy.topologyChangeInterval;
+            this.allChoices = copy.allChoices;
+            this.choicesNoLeave = copy.choicesNoLeave;
+            this.choicesNoJoin = copy.choicesNoJoin;
+            this.minRf = copy.minRf;
+            this.initialRf = copy.initialRf;
+            this.maxRf = copy.maxRf;
+            this.changePaxosVariantTo = changePaxosVariantTo;
+        }
+
+        public Options(int topologyChangeLimit, KindOfSequence.Period topologyChangeInterval, Choices<TopologyChange> choices, int[] minRf, int[] initialRf, int[] maxRf, PaxosVariant changePaxosVariantTo)
+        {
+            if (Arrays.equals(minRf, maxRf))
+                choices = choices.without(TopologyChange.CHANGE_RF);
+
+            this.topologyChangeInterval = topologyChangeInterval;
+            this.topologyChangeLimit = topologyChangeLimit;
+            this.minRf = minRf;
+            this.initialRf = initialRf;
+            this.maxRf = maxRf;
+            this.allChoices = choices;
+            this.choicesNoJoin = allChoices.without(JOIN).without(REPLACE);
+            this.choicesNoLeave = allChoices.without(LEAVE);
+            this.changePaxosVariantTo = changePaxosVariantTo;
+        }
+
+        public static Options noActions(int clusterSize)
+        {
+            int[] rf = new int[]{clusterSize};
+            return new Options(0, UNIFORM.period(null, null), Choices.uniform(), rf, rf, rf, null);
+        }
+
+        public Options changePaxosVariantTo(PaxosVariant newVariant)
+        {
+            return new Options(this, newVariant);
+        }
+    }
+
+    final Cluster cluster;
+    final Options options;
+    final ClusterActionListener listener;
+    final Debug debug;
+
+    public ClusterActions(SimulatedSystems simulated,
+                          Cluster cluster,
+                          Options options,
+                          ClusterActionListener listener,
+                          Debug debug)
+    {
+        super(simulated);
+        Preconditions.checkNotNull(cluster);
+        Preconditions.checkNotNull(options);
+        Preconditions.checkNotNull(listener);
+        Preconditions.checkNotNull(debug);
+        this.cluster = cluster;
+        this.options = options;
+        this.listener = listener;
+        this.debug = debug;
+    }
+
+    public static class InitialConfiguration
+    {
+        public static final int[] EMPTY = {};
+        private final int[] joined;
+        private final int[] prejoin;
+
+        public InitialConfiguration(int[] joined, int[] prejoin)
+        {
+            this.joined = joined;
+            this.prejoin = prejoin;
+        }
+
+        public static InitialConfiguration initializeAll(int nodes)
+        {
+            int[] joined = new int[nodes];
+            for (int i = 0; i < nodes; i++)
+                joined[i] = i + 1;
+            return new InitialConfiguration(joined, EMPTY);
+        }
+    }
+
+    public Action initializeCluster(InitialConfiguration config)
+    {
+        return this.initializeCluster(config.joined, config.prejoin);
+    }
+
+    public Action initializeCluster(int[] joined, int[] prejoin)
+    {
+        return StrictAction.of("Initialise Cluster", () -> {
+            List<Action> actions = new ArrayList<>();
+
+            cluster.stream().forEach(i -> actions.add(invoke("Startup " + i.broadcastAddress(), NO_TIMEOUTS, NO_TIMEOUTS,
+                                                             new InterceptedExecution.InterceptedRunnableExecution((InterceptingExecutor) i.executor(), i::startup))));
+
+            List<InetSocketAddress> endpoints = cluster.stream().map(IInstance::broadcastAddress).collect(Collectors.toList());
+            cluster.forEach(i -> actions.add(resetGossipState(i, endpoints)));
+
+            for (int add : joined)
+            {
+                actions.add(transitivelyReliable("Add " + add + " to ring", cluster.get(add), addToRingNormalRunner(cluster.get(add))));
+                actions.addAll(sendLocalGossipStateToAll(add));
+            }
+
+            actions.add(ReliableAction.transitively("Sync Pending Ranges Executor", ClusterActions.this::syncPendingRanges));
+            debug.debug(CLUSTER, time, cluster, null, null);
+            return ActionList.of(actions);
+        });
+    }
+
+    Action resetGossipState(IInvokableInstance i, List<InetSocketAddress> endpoints)
+    {
+        return transitivelyReliable("Reset Gossip", i, () -> Gossiper.runInGossipStageBlocking(Gossiper.instance::unsafeSetEnabled));
+    }
+
+    @SuppressWarnings("unchecked")
+    void validateReplicasForKeys(IInvokableInstance on, String keyspace, String table, Topology topology)
+    {
+        int[] primaryKeys = topology.primaryKeys;
+        int[][] validate = NonInterceptible.apply(REQUIRED, () -> {
+            Map<InetSocketAddress, Integer> lookup = Cluster.getUniqueAddressLookup(cluster, i -> i.config().num());
+            int[][] result = new int[primaryKeys.length][];
+            for (int i = 0 ; i < primaryKeys.length ; ++i)
+            {
+                int primaryKey = primaryKeys[i];
+                result[i] = on.unsafeApplyOnThisThread(ClusterActions::replicasForPrimaryKey, keyspace, table, primaryKey)
+                              .stream()
+                              .mapToInt(lookup::get)
+                              .filter(r -> Arrays.binarySearch(topology.membersOfQuorum, r) >= 0)
+                              .toArray();
+            }
+            return result;
+        });
+        for (int i = 0 ; i < primaryKeys.length ; ++i)
+        {
+            int[] vs1 = validate[i];
+            int[] vs2 = topology.replicasForKeys[i].clone();
+            Arrays.sort(vs1);
+            Arrays.sort(vs2);
+            if (!Arrays.equals(vs1, vs2))
+                throw new AssertionError();
+        }
+    }
+
+    // assumes every node knows the correct topology
+    static List<InetSocketAddress> replicasForPrimaryKey(String keyspaceName, String table, int primaryKey)
+    {
+        Keyspace keyspace = Keyspace.open(keyspaceName);
+        TableMetadata metadata = keyspace.getColumnFamilyStore(table).metadata.get();
+        DecoratedKey key = metadata.partitioner.decorateKey(Int32Type.instance.decompose(primaryKey));
+        // we return a Set because simulator can easily encounter point where nodes are both natural and pending
+        return ReplicaLayout.forTokenWriteLiveAndDown(keyspace, key.getToken()).all().asList(Replica::endpoint);
+    }
+
+    private ActionList to(BiFunction<Integer, Integer, Action> action, int from, IntStream to)
+    {
+        return ActionList.of(to.filter(i -> i != from)
+                .mapToObj(i -> action.apply(from, i)));
+    }
+    private ActionList toAll(BiFunction<Integer, Integer, Action> action, int from)
+    {
+        return to(action, from, IntStream.rangeClosed(1, cluster.size()));
+    }
+    private ActionList to(BiFunction<Integer, Integer, Action> action, int from, int[] to)
+    {
+        return to(action, from, IntStream.of(to));
+    }
+
+    ActionList on(Function<Integer, Action> action, IntStream on)
+    {
+        return ActionList.of(on.mapToObj(action::apply));
+    }
+    ActionList onAll(Function<Integer, Action> action)
+    {
+        return on(action, IntStream.rangeClosed(1, cluster.size()));
+    }
+    ActionList on(Function<Integer, Action> action, int[] on)
+    {
+        return on(action, IntStream.of(on));
+    }
+
+    ActionList syncPendingRanges() { return onAll(OnInstanceSyncPendingRanges.factory(this)); }
+    ActionList gossipWithAll(int from) { return toAll(OnInstanceGossipWith.factory(this), from); }
+    ActionList sendShutdownToAll(int from) { return toAll(OnInstanceSendShutdown.factory(this), from); }
+    ActionList sendLocalGossipStateToAll(int from) { return toAll(OnInstanceSendLocalGossipState.factory(this), from); }
+    ActionList flushAndCleanup(int[] on) { return on(OnInstanceFlushAndCleanup.factory(this), on); }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterReliableAction.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterReliableAction.java
new file mode 100644
index 0000000..591f2b9
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterReliableAction.java
@@ -0,0 +1,30 @@
+/*
+ * 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.simulator.cluster;
+
+import static org.apache.cassandra.distributed.api.IIsolatedExecutor.*;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+
+public class ClusterReliableAction extends ClusterAction
+{
+    public ClusterReliableAction(String description, ClusterActions actions, int on, SerializableRunnable runnable)
+    {
+        super(description, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, actions, on, runnable);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterReliableQueryAction.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterReliableQueryAction.java
new file mode 100644
index 0000000..ea22081
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterReliableQueryAction.java
@@ -0,0 +1,38 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.simulator.systems.SimulatedQuery;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+
+class ClusterReliableQueryAction extends SimulatedQuery
+{
+    ClusterReliableQueryAction(String id, ClusterActions actions, int on, String query, long timestamp, ConsistencyLevel consistencyLevel, Object... params)
+    {
+        super(id, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, actions, actions.cluster.get(on), query, timestamp, consistencyLevel, params);
+    }
+
+    public static ClusterReliableQueryAction schemaChange(String id, ClusterActions actions, int on, String query)
+    {
+        // this isn't used on 4.0+ nodes, but no harm in supplying it anyway
+        return new ClusterReliableQueryAction(id, actions, on, query, actions.time.nextGlobalMonotonicMicros(), ConsistencyLevel.ALL);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterUnsafeAction.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterUnsafeAction.java
new file mode 100644
index 0000000..3b61e92
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/ClusterUnsafeAction.java
@@ -0,0 +1,34 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.simulator.systems.SimulatedActionTask;
+
+class ClusterUnsafeAction extends SimulatedActionTask
+{
+    ClusterUnsafeAction(String id, Modifiers self, Modifiers children, ClusterActions actions, int on, Runnable run)
+    {
+        this(id, self, children, actions, actions.cluster.get(on), run);
+    }
+
+    ClusterUnsafeAction(String id, Modifiers self, Modifiers children, ClusterActions actions, IInvokableInstance on, Runnable run)
+    {
+        super(id, self, children, null, actions, unsafeAsTask(on, run, actions.failures));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/KeyspaceActions.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/KeyspaceActions.java
new file mode 100644
index 0000000..55ab20a
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/KeyspaceActions.java
@@ -0,0 +1,395 @@
+/*
+ * 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.simulator.cluster;
+
+import java.net.InetSocketAddress;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.stream.IntStream;
+
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.Murmur3Partitioner.LongToken;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.locator.AbstractReplicationStrategy;
+import org.apache.cassandra.locator.EndpointsForToken;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.NetworkTopologyStrategy;
+import org.apache.cassandra.locator.PendingRangeMaps;
+import org.apache.cassandra.locator.TokenMetadata;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.ActionListener;
+import org.apache.cassandra.simulator.ActionPlan;
+import org.apache.cassandra.simulator.Actions;
+import org.apache.cassandra.simulator.Debug;
+import org.apache.cassandra.simulator.OrderOn.StrictSequential;
+import org.apache.cassandra.simulator.systems.SimulatedSystems;
+
+import static java.util.Collections.singleton;
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.LOCAL_SERIAL;
+import static org.apache.cassandra.simulator.Debug.EventType.CLUSTER;
+import static org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange.CHANGE_RF;
+import static org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange.JOIN;
+import static org.apache.cassandra.simulator.cluster.ClusterActions.TopologyChange.LEAVE;
+import static org.apache.cassandra.simulator.cluster.ClusterReliableQueryAction.schemaChange;
+
+public class KeyspaceActions extends ClusterActions
+{
+    final String keyspace;
+    final String table;
+    final String createTableCql;
+    final ConsistencyLevel serialConsistency;
+    final int[] primaryKeys;
+
+    final EnumSet<TopologyChange> ops = EnumSet.noneOf(TopologyChange.class);
+    final NodeLookup nodeLookup;
+    final int[] minRf, initialRf, maxRf;
+    final int[] membersOfQuorumDcs;
+
+    // working state
+    final NodesByDc all;
+    final NodesByDc prejoin;
+    final NodesByDc joined;
+    final NodesByDc left;
+
+    final int[] currentRf;
+    final TokenMetadata tokenMetadata = new TokenMetadata(snitch.get());
+    Topology topology;
+    boolean haveChangedVariant;
+    int topologyChangeCount = 0;
+
+    public KeyspaceActions(SimulatedSystems simulated,
+                           String keyspace, String table, String createTableCql,
+                           Cluster cluster,
+                           Options options,
+                           ConsistencyLevel serialConsistency,
+                           ClusterActionListener listener,
+                           int[] primaryKeys,
+                           Debug debug)
+    {
+        super(simulated, cluster, options, listener, debug);
+        this.keyspace = keyspace;
+        this.table = table;
+        this.createTableCql = createTableCql;
+        this.primaryKeys = primaryKeys;
+        this.serialConsistency = serialConsistency;
+
+        this.nodeLookup = simulated.snitch;
+
+        int[] dcSizes = new int[options.initialRf.length];
+        for (int dc : nodeLookup.nodeToDc)
+            ++dcSizes[dc];
+
+        this.all = new NodesByDc(nodeLookup, dcSizes);
+        this.prejoin = new NodesByDc(nodeLookup, dcSizes);
+        this.joined = new NodesByDc(nodeLookup, dcSizes);
+        this.left = new NodesByDc(nodeLookup, dcSizes);
+
+        for (int i = 1 ; i <= nodeLookup.nodeToDc.length ; ++i)
+        {
+            this.prejoin.add(i);
+            this.all.add(i);
+        }
+
+        minRf = options.minRf;
+        initialRf = options.initialRf;
+        maxRf = options.maxRf;
+        currentRf = initialRf.clone();
+        membersOfQuorumDcs = serialConsistency == LOCAL_SERIAL ? all.dcs[0] : all.toArray();
+        ops.addAll(Arrays.asList(options.allChoices.options));
+
+    }
+
+    public ActionPlan plan()
+    {
+        ActionList pre = ActionList.of(pre(createKeyspaceCql(keyspace), createTableCql));
+        ActionList interleave = stream();
+        ActionList post = ActionList.empty();
+        return new ActionPlan(pre, singletonList(interleave), post);
+    }
+
+    @SuppressWarnings("StringConcatenationInLoop")
+    private String createKeyspaceCql(String keyspace)
+    {
+        String createKeyspaceCql = "CREATE KEYSPACE " + keyspace  + " WITH replication = {'class': 'NetworkTopologyStrategy'";
+        for (int i = 0 ; i < options.initialRf.length ; ++i)
+            createKeyspaceCql += ", '" + snitch.nameOfDc(i) + "': " + options.initialRf[i];
+        createKeyspaceCql += "};";
+        return createKeyspaceCql;
+    }
+
+    private Action pre(String createKeyspaceCql, String createTableCql)
+    {
+        // randomise initial cluster, and return action to initialise it
+        for (int dc = 0 ; dc < options.initialRf.length ; ++dc)
+        {
+            for (int i = 0 ; i < options.initialRf[dc] ; ++i)
+            {
+                int join = prejoin.removeRandom(random, dc);
+                joined.add(join);
+                tokenMetadata.updateNormalToken(tokenOf(join), inet(join));
+            }
+        }
+
+        updateTopology(recomputeTopology());
+        int[] joined = this.joined.toArray();
+        int[] prejoin = this.prejoin.toArray();
+        return Actions.StrictAction.of("Initialize", () -> {
+            return ActionList.of(initializeCluster(joined, prejoin),
+                                 schemaChange("Create Keyspace", KeyspaceActions.this, 1, createKeyspaceCql),
+                                 schemaChange("Create Table", KeyspaceActions.this, 1, createTableCql));
+        });
+    }
+
+    @SuppressWarnings("StatementWithEmptyBody")
+    private ActionList stream()
+    {
+        ActionListener listener = debug.debug(CLUSTER, time, cluster, keyspace, null);
+        if (listener == null)
+            return ActionList.of(Actions.stream(new StrictSequential("Cluster Actions"), this::next));
+
+        return ActionList.of(Actions.stream(new StrictSequential("Cluster Actions"), () -> {
+            Action action = next();
+            if (action != null)
+                action.register(listener);
+            return action;
+        }));
+    }
+
+    private Action next()
+    {
+        if (options.topologyChangeLimit >= 0 && topologyChangeCount++ > options.topologyChangeLimit)
+            return null;
+
+        while (!ops.isEmpty() && (!prejoin.isEmpty() || joined.size() > sum(minRf)))
+        {
+            if (options.changePaxosVariantTo != null && !haveChangedVariant && random.decide(1f / (1 + prejoin.size())))
+            {
+                haveChangedVariant = true;
+                return schedule(new OnClusterSetPaxosVariant(KeyspaceActions.this, options.changePaxosVariantTo));
+            }
+
+            // pick a dc
+            int dc = random.uniform(0, currentRf.length);
+
+            // try to pick an action (and simply loop again if we cannot for this dc)
+            TopologyChange next;
+            if (prejoin.size(dc) > 0 && joined.size(dc) > currentRf[dc]) next = options.allChoices.choose(random);
+            else if (prejoin.size(dc) > 0 && ops.contains(JOIN)) next = options.choicesNoLeave.choose(random);
+            else if (joined.size(dc) > currentRf[dc] && ops.contains(LEAVE)) next = options.choicesNoJoin.choose(random);
+            else if (joined.size(dc) > minRf[dc]) next = CHANGE_RF;
+            else continue;
+
+            // TODO (feature): introduce some time period between cluster actions
+            switch (next)
+            {
+                case REPLACE:
+                {
+                    Topology before = topology;
+                    int join = prejoin.removeRandom(random, dc);
+                    int leave = joined.selectRandom(random, dc);
+                    joined.add(join);
+                    joined.remove(leave);
+                    left.add(leave);
+                    nodeLookup.setTokenOf(join, nodeLookup.tokenOf(leave));
+                    Collection<Token> token = singleton(tokenOf(leave));
+                    tokenMetadata.addReplaceTokens(token, inet(join), inet(leave));
+                    tokenMetadata.unsafeCalculatePendingRanges(strategy(), keyspace);
+                    Topology during = recomputeTopology();
+                    updateTopology(during);
+                    tokenMetadata.updateNormalTokens(token, inet(join));
+                    tokenMetadata.unsafeCalculatePendingRanges(strategy(), keyspace);
+                    Topology after = recomputeTopology();
+                    Action action = new OnClusterReplace(KeyspaceActions.this, before, during, after, leave, join);
+                    return scheduleAndUpdateTopologyOnCompletion(action, after);
+                    // if replication factor is 2, cannot perform safe replacements
+                    // however can have operations that began earlier during RF=2
+                    // so need to introduce some concept of barriers/ordering/sync points
+                }
+                case JOIN:
+                {
+                    Topology before = topology;
+                    int join = prejoin.removeRandom(random, dc);
+                    joined.add(join);
+                    Collection<Token> token = singleton(tokenOf(join));
+                    tokenMetadata.addBootstrapTokens(token, inet(join));
+                    tokenMetadata.unsafeCalculatePendingRanges(strategy(), keyspace);
+                    Topology during = recomputeTopology();
+                    updateTopology(during);
+                    tokenMetadata.updateNormalTokens(token, inet(join));
+                    tokenMetadata.unsafeCalculatePendingRanges(strategy(), keyspace);
+                    Topology after = recomputeTopology();
+                    Action action = new OnClusterJoin(KeyspaceActions.this, before, during, after, join);
+                    return scheduleAndUpdateTopologyOnCompletion(action, after);
+                }
+                case LEAVE:
+                {
+                    Topology before = topology;
+                    int leave = joined.removeRandom(random, dc);
+                    left.add(leave);
+                    tokenMetadata.addLeavingEndpoint(inet(leave));
+                    tokenMetadata.unsafeCalculatePendingRanges(strategy(), keyspace);
+                    Topology during = recomputeTopology();
+                    updateTopology(during);
+                    tokenMetadata.removeEndpoint(inet(leave));
+                    tokenMetadata.unsafeCalculatePendingRanges(strategy(), keyspace);
+                    Topology after = recomputeTopology();
+                    Action action = new OnClusterLeave(KeyspaceActions.this, before, during, after, leave);
+                    return scheduleAndUpdateTopologyOnCompletion(action, after);
+                }
+                case CHANGE_RF:
+                    if (maxRf[dc] == minRf[dc]) {} // cannot perform RF changes at all
+                    if (currentRf[dc] == minRf[dc] && joined.size(dc) == currentRf[dc]) {} // can do nothing until joined grows
+                    else
+                    {
+                        boolean increase;
+                        if (currentRf[dc] == minRf[dc]) // can only grow
+                        { ++currentRf[dc]; increase = true;}
+                        else if (currentRf[dc] == joined.size(dc) || currentRf[dc] == maxRf[dc]) // can only shrink, and we know currentRf > minRf
+                        { --currentRf[dc]; increase = false; }
+                        else if (random.decide(0.5f)) // can do either
+                        { --currentRf[dc]; increase = false; }
+                        else
+                        { ++currentRf[dc]; increase = true; }
+
+                        // this isn't used on 4.0+ nodes, but no harm in supplying it anyway
+                        long timestamp = time.nextGlobalMonotonicMicros();
+                        int coordinator = joined.selectRandom(random, dc);
+                        Topology before = topology;
+                        Topology after = recomputeTopology();
+                        return scheduleAndUpdateTopologyOnCompletion(new OnClusterChangeRf(KeyspaceActions.this, timestamp, coordinator, before, after, increase), after);
+                    }
+            }
+        }
+
+        if (options.changePaxosVariantTo != null && !haveChangedVariant)
+        {
+            haveChangedVariant = true;
+            return schedule(new OnClusterSetPaxosVariant(KeyspaceActions.this, options.changePaxosVariantTo));
+        }
+
+        return null;
+    }
+
+    private Action schedule(Action action)
+    {
+        action.setDeadline(time, time.nanoTime() + options.topologyChangeInterval.get(random));
+        return action;
+    }
+
+    private Action scheduleAndUpdateTopologyOnCompletion(Action action, Topology newTopology)
+    {
+        action.register(new ActionListener()
+        {
+            @Override
+            public void before(Action action, Before before)
+            {
+                if (before == Before.EXECUTE)
+                    time.forbidDiscontinuities();
+            }
+
+            @Override
+            public void transitivelyAfter(Action finished)
+            {
+                updateTopology(newTopology);
+                time.permitDiscontinuities();
+            }
+        });
+        return schedule(action);
+    }
+
+    void updateTopology(Topology newTopology)
+    {
+        topology = newTopology;
+        announce(topology);
+    }
+
+    private Topology recomputeTopology()
+    {
+        AbstractReplicationStrategy strategy = strategy();
+        Map<InetSocketAddress, Integer> lookup = Cluster.getUniqueAddressLookup(cluster, i -> i.config().num());
+        int[][] replicasForKey = new int[primaryKeys.length][];
+        int[][] pendingReplicasForKey = new int[primaryKeys.length][];
+        for (int i = 0 ; i < primaryKeys.length ; ++i)
+        {
+            int primaryKey = primaryKeys[i];
+            Token token = new Murmur3Partitioner().getToken(Int32Type.instance.decompose(primaryKey));
+            replicasForKey[i] = strategy.calculateNaturalReplicas(token, tokenMetadata)
+                                        .endpointList().stream().mapToInt(lookup::get).toArray();
+            PendingRangeMaps pendingRanges = tokenMetadata.getPendingRanges(keyspace);
+            EndpointsForToken pendingEndpoints = pendingRanges == null ? null : pendingRanges.pendingEndpointsFor(token);
+            if (pendingEndpoints == null) pendingReplicasForKey[i] = new int[0];
+            else pendingReplicasForKey[i] = pendingEndpoints.endpointList().stream().mapToInt(lookup::get).toArray();
+        }
+        int[] membersOfRing = joined.toArray();
+        long[] membersOfRingTokens = IntStream.of(membersOfRing).mapToLong(nodeLookup::tokenOf).toArray();
+        return new Topology(primaryKeys, membersOfRing, membersOfRingTokens, membersOfQuorum(), currentRf.clone(),
+                            quorumRf(), replicasForKey, pendingReplicasForKey);
+    }
+
+    private int quorumRf()
+    {
+        if (serialConsistency == LOCAL_SERIAL)
+            return currentRf[0];
+
+        return sum(currentRf);
+    }
+
+    private int[] membersOfQuorum()
+    {
+        if (serialConsistency == LOCAL_SERIAL)
+            return joined.toArray(0);
+
+        return joined.toArray();
+    }
+
+    private static int sum(int[] vs)
+    {
+        int sum = 0;
+        for (int v : vs)
+            sum += v;
+        return sum;
+    }
+
+    private InetAddressAndPort inet(int node)
+    {
+        return InetAddressAndPort.getByAddress(cluster.get(node).config().broadcastAddress());
+    }
+
+    AbstractReplicationStrategy strategy()
+    {
+        Map<String, String> rf = new HashMap<>();
+        for (int i = 0 ; i < snitch.dcCount() ; ++i)
+            rf.put(snitch.nameOfDc(i), Integer.toString(currentRf[i]));
+        return new NetworkTopologyStrategy(keyspace, tokenMetadata, snitch.get(), rf);
+    }
+
+    private Token tokenOf(int node)
+    {
+        return new LongToken(Long.parseLong(cluster.get(nodeLookup.tokenOf(node)).config().getString("initial_token")));
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/NodeLookup.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/NodeLookup.java
new file mode 100644
index 0000000..e1e339f
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/NodeLookup.java
@@ -0,0 +1,48 @@
+/*
+ * 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.simulator.cluster;
+
+public class NodeLookup
+{
+    protected final int[] nodeToDc;
+    protected final int[] nodeToToken;
+
+    protected NodeLookup(int[] nodeToDc)
+    {
+        this.nodeToDc = nodeToDc;
+        this.nodeToToken = new int[nodeToDc.length];
+        for (int i = 0; i < nodeToToken.length; ++i)
+            nodeToToken[i] = i + 1;
+    }
+
+    public int dcOf(int node)
+    {
+        return nodeToDc[node - 1];
+    }
+
+    public int tokenOf(int node)
+    {
+        return nodeToToken[node - 1];
+    }
+
+    public void setTokenOf(int node, int token)
+    {
+        nodeToToken[node - 1] = token;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/NodesByDc.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/NodesByDc.java
new file mode 100644
index 0000000..976febd
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/NodesByDc.java
@@ -0,0 +1,172 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.Arrays;
+import java.util.function.IntConsumer;
+
+import org.apache.cassandra.simulator.RandomSource;
+
+@SuppressWarnings("ManualArrayCopy")
+class NodesByDc
+{
+    final NodeLookup lookup;
+    final int[][] dcs;
+    final int[] dcSizes;
+    int size;
+
+    public NodesByDc(NodeLookup lookup, int[] dcSizes)
+    {
+        this.lookup = lookup;
+        this.dcs = new int[dcSizes.length][];
+        for (int i = 0; i < dcs.length; ++i)
+        {
+            dcs[i] = new int[dcSizes[i]];
+            Arrays.fill(dcs[i], Integer.MAX_VALUE);
+        }
+        this.dcSizes = new int[dcSizes.length];
+    }
+
+    boolean contains(int node)
+    {
+        int[] dc = dcs[lookup.dcOf(node)];
+        return Arrays.binarySearch(dc, node) >= 0;
+    }
+
+    void add(int node)
+    {
+        int dcIndex = lookup.dcOf(node);
+        int dcSize = dcSizes[dcIndex];
+        int[] dc = dcs[dcIndex];
+        int insertPos = -1 - Arrays.binarySearch(dc, node);
+        assert insertPos >= 0;
+        for (int i = dcSize; i > insertPos; --i)
+            dc[i] = dc[i - 1];
+        dc[insertPos] = node;
+        ++size;
+        ++dcSizes[dcIndex];
+    }
+
+    int removeRandom(RandomSource random, int dcIndex)
+    {
+        return removeIndex(dcIndex, random.uniform(0, dcSizes[dcIndex]));
+    }
+
+    private int removeIndex(int dcIndex, int nodeIndex)
+    {
+        int dcSize = dcSizes[dcIndex];
+        int[] dc = dcs[dcIndex];
+        int node = dc[nodeIndex];
+        for (int i = nodeIndex + 1; i < dcSize; ++i)
+            dc[i - 1] = dc[i];
+        dc[dcSize - 1] = Integer.MAX_VALUE;
+        --size;
+        --dcSizes[dcIndex];
+        return node;
+    }
+
+    int removeRandom(RandomSource random)
+    {
+        int index = random.uniform(0, size);
+        for (int dcIndex = 0; dcIndex < dcSizes.length; ++dcIndex)
+        {
+            if (dcSizes[dcIndex] > index)
+                return removeIndex(dcIndex, index);
+            index -= dcSizes[dcIndex];
+        }
+        throw new IllegalStateException();
+    }
+
+    int selectRandom(RandomSource random, int dcIndex)
+    {
+        int i = random.uniform(0, dcSizes[dcIndex]);
+        return dcs[dcIndex][i];
+    }
+
+    int selectRandom(RandomSource random)
+    {
+        int index = random.uniform(0, size);
+        for (int dcIndex = 0; dcIndex < dcSizes.length; ++dcIndex)
+        {
+            if (dcSizes[dcIndex] > index)
+                return dcs[dcIndex][index];
+            index -= dcSizes[dcIndex];
+        }
+        throw new IllegalStateException();
+    }
+
+    void remove(int node)
+    {
+        int dcIndex = lookup.dcOf(node);
+        int[] dc = dcs[dcIndex];
+        removeIndex(dcIndex, Arrays.binarySearch(dc, node));
+    }
+
+    void forEach(IntConsumer consumer)
+    {
+        for (int dc = 0; dc < dcs.length; ++dc)
+            forEach(consumer, dc);
+    }
+
+    void forEach(IntConsumer consumer, int dc)
+    {
+        for (int i : dcs[dc])
+        {
+            if (i == Integer.MAX_VALUE)
+                break;
+            consumer.accept(dcs[dc][i]);
+        }
+    }
+
+    int[] toArray()
+    {
+        int[] result = new int[size];
+        int count = 0;
+        for (int dcIndex = 0; dcIndex < dcs.length; ++dcIndex)
+        {
+            int dcSize = dcSizes[dcIndex];
+            System.arraycopy(dcs[dcIndex], 0, result, count, dcSize);
+            count += dcSize;
+        }
+        return result;
+    }
+
+    int[] toArray(int dcIndex)
+    {
+        int size = dcSizes[dcIndex];
+        int[] result = new int[size];
+        System.arraycopy(dcs[dcIndex], 0, result, 0, size);
+        return result;
+    }
+
+    boolean isEmpty()
+    {
+        return size == 0;
+    }
+
+    int size()
+    {
+        return size;
+    }
+
+    int size(int dc)
+    {
+        return dcSizes[dc];
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterChangeRf.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterChangeRf.java
new file mode 100644
index 0000000..46067f9
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterChangeRf.java
@@ -0,0 +1,66 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.Arrays;
+
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.Actions;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+import static org.apache.cassandra.simulator.cluster.ClusterReliableQueryAction.schemaChange;
+import static org.apache.cassandra.utils.LazyToString.lazy;
+
+class OnClusterChangeRf extends OnClusterChangeTopology
+{
+    final KeyspaceActions actions;
+    final long timestamp;
+    final int on;
+    final boolean increase;
+
+    OnClusterChangeRf(KeyspaceActions actions, long timestamp, int on, Topology before, Topology after, boolean increase)
+    {
+        super(increase ? lazy(() -> "Increase replication factor to " + Arrays.toString(after.rf))
+                       : lazy(() -> "Decrease replication factor to " + Arrays.toString(after.rf)),
+              actions, STRICT, NONE, before, after, before.primaryKeys);
+        this.actions = actions;
+        this.timestamp = timestamp;
+        this.on = on;
+        this.increase = increase;
+    }
+
+    protected ActionList performSimple()
+    {
+        before(actions.cluster.get(on));
+
+        StringBuilder command = new StringBuilder("ALTER KEYSPACE " + actions.keyspace + " WITH replication = {'class': 'NetworkTopologyStrategy'");
+        for (int i = 0; i < after.rf.length; ++i)
+            command.append(", '").append(actions.snitch.nameOfDc(i)).append("': ").append(after.rf[i]);
+        command.append("};");
+
+        return ActionList.of(
+            schemaChange("ALTER KEYSPACE " + description(), actions, on, command.toString()),
+            new OnClusterSyncPendingRanges(actions),
+            new OnClusterFullRepair(actions, after, true, false, false),
+            // TODO: cleanup should clear paxos state tables
+            Actions.of("Flush and Cleanup", !increase ? () -> actions.flushAndCleanup(after.membersOfRing) : ActionList::empty)
+        );
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterChangeTopology.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterChangeTopology.java
new file mode 100644
index 0000000..5f0d46f
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterChangeTopology.java
@@ -0,0 +1,71 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.function.Consumer;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.cluster.ClusterActionListener.TopologyChangeValidator;
+import org.apache.cassandra.simulator.systems.NonInterceptible;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+import static org.apache.cassandra.simulator.ActionListener.runAfterTransitiveClosure;
+import static org.apache.cassandra.simulator.systems.NonInterceptible.Permit.REQUIRED;
+
+abstract class OnClusterChangeTopology extends Action implements Consumer<Action>
+{
+    final KeyspaceActions actions;
+
+    final int[] participatingKeys;
+    final Topology before;
+    final Topology after;
+
+    final TopologyChangeValidator validator;
+
+    public OnClusterChangeTopology(Object description, KeyspaceActions actions, Topology before, Topology after, int[] participatingKeys)
+    {
+        this(description, actions, STRICT, RELIABLE, before, after, participatingKeys);
+    }
+
+    public OnClusterChangeTopology(Object description, KeyspaceActions actions, Modifiers self, Modifiers children, Topology before, Topology after, int[] participatingKeys)
+    {
+        super(description, self, children);
+        this.actions = actions;
+        this.participatingKeys = participatingKeys;
+        this.before = before;
+        this.after = after;
+        this.validator = actions.listener.newTopologyChangeValidator(this);
+        register(runAfterTransitiveClosure(this));
+    }
+
+    void before(IInvokableInstance instance)
+    {
+        NonInterceptible.execute(REQUIRED, () -> {
+            actions.validateReplicasForKeys(instance, actions.keyspace, actions.table, before);
+            validator.before(before, participatingKeys);
+        });
+    }
+
+    public void accept(Action ignore)
+    {
+        validator.after(after);
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterFullRepair.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterFullRepair.java
new file mode 100644
index 0000000..d415d4e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterFullRepair.java
@@ -0,0 +1,66 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.cluster.ClusterActionListener.RepairValidator;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+import static org.apache.cassandra.simulator.ActionListener.runAfterTransitiveClosure;
+import static org.apache.cassandra.utils.LazyToString.lazy;
+
+class OnClusterFullRepair extends Action implements Consumer<Action>
+{
+    final KeyspaceActions actions;
+    final Topology topology;
+    final boolean force;
+    final RepairValidator validator;
+    final boolean repairPaxos;
+    final boolean repairOnlyPaxos;
+
+    public OnClusterFullRepair(KeyspaceActions actions, Topology topology, boolean repairPaxos, boolean repairOnlyPaxos, boolean force)
+    {
+        super(lazy(() -> "Full Repair on " + Arrays.toString(topology.membersOfRing)), STRICT, RELIABLE_NO_TIMEOUTS);
+        this.actions = actions;
+        // STRICT to ensure repairs do not run simultaneously, as seems not to be permitted even for non-overlapping ranges?
+        this.topology = topology;
+        this.repairPaxos = repairPaxos;
+        this.repairOnlyPaxos = repairOnlyPaxos;
+        this.force = force;
+        this.validator = actions.listener.newRepairValidator(this);
+        register(runAfterTransitiveClosure(this));
+    }
+
+    protected ActionList performSimple()
+    {
+        actions.validateReplicasForKeys(actions.cluster.get(topology.membersOfQuorum[0]), actions.keyspace, actions.table, topology);
+        validator.before(topology, repairPaxos, repairOnlyPaxos);
+        return actions.on(i -> new OnInstanceRepair(actions, i, repairPaxos, repairOnlyPaxos, force), topology.membersOfRing);
+    }
+
+    public void accept(Action ignore)
+    {
+        validator.after();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterJoin.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterJoin.java
new file mode 100644
index 0000000..cf39379
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterJoin.java
@@ -0,0 +1,51 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.simulator.ActionList;
+
+import static org.apache.cassandra.utils.LazyToString.lazy;
+
+class OnClusterJoin extends OnClusterChangeTopology
+{
+    final int joining;
+
+    OnClusterJoin(KeyspaceActions actions, Topology before, Topology during, Topology after, int joining)
+    {
+        super(lazy(() -> String.format("node%d Joining", joining)), actions, before, after, during.pendingKeys());
+        this.joining = joining;
+    }
+
+    public ActionList performSimple()
+    {
+        IInvokableInstance joinInstance = actions.cluster.get(joining);
+        before(joinInstance);
+        return ActionList.of(
+            // setup the node's own gossip state for pending ownership, and return gossip actions to disseminate
+            new OnClusterUpdateGossip(actions, joining, new OnInstanceSetBootstrapping(actions, joining)),
+            new OnInstanceSyncSchemaForBootstrap(actions, joining),
+            new OnInstanceTopologyChangePaxosRepair(actions, joining, "Join"),
+            // stream/repair from a peer
+            new OnInstanceBootstrap(actions, joinInstance),
+            // setup the node's own gossip state for natural ownership, and return gossip actions to disseminate
+            new OnClusterUpdateGossip(actions, joining, new OnInstanceSetNormal(actions, joining))
+        );
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterLeave.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterLeave.java
new file mode 100644
index 0000000..4250e24
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterLeave.java
@@ -0,0 +1,60 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.systems.SimulatedActionConsumer;
+import org.apache.cassandra.utils.concurrent.Future;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.utils.LazyToString.lazy;
+
+class OnClusterLeave extends OnClusterChangeTopology
+{
+    final int leaving;
+
+    OnClusterLeave(KeyspaceActions actions, Topology before, Topology during, Topology after, int leaving)
+    {
+        super(lazy(() -> String.format("node%d Leaving", leaving)), actions, before, after, during.pendingKeys());
+        this.leaving = leaving;
+    }
+
+    public ActionList performSimple()
+    {
+        IInvokableInstance leaveInstance = actions.cluster.get(leaving);
+        before(leaveInstance);
+        AtomicReference<Supplier<? extends Future<?>>> preparedUnbootstrap = new AtomicReference<>();
+        return ActionList.of(
+            // setup the node's own gossip state for pending ownership, and return gossip actions to disseminate
+            new OnClusterUpdateGossip(actions, leaving, new OnInstanceSetLeaving(actions, leaving)),
+            new SimulatedActionConsumer<>("Prepare unbootstrap on " + leaving, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, actions, leaveInstance,
+                                          ref -> ref.set(StorageService.instance.prepareUnbootstrapStreaming()), preparedUnbootstrap),
+            new OnInstanceTopologyChangePaxosRepair(actions, leaving, "Leave"),
+            new SimulatedActionConsumer<>("Execute unbootstrap on " + leaving, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, actions, leaveInstance,
+                                          ref -> ref.get().get().syncThrowUncheckedOnInterrupt(), preparedUnbootstrap),
+            // setup the node's own gossip state for natural ownership, and return gossip actions to disseminate
+            new OnClusterUpdateGossip(actions, leaving, new OnInstanceSetLeft(actions, leaving))
+        );
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterMarkDown.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterMarkDown.java
new file mode 100644
index 0000000..c5a3186
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterMarkDown.java
@@ -0,0 +1,37 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+
+class OnClusterMarkDown extends ClusterUnsafeAction
+{
+    OnClusterMarkDown(ClusterActions actions, int on)
+    {
+        this(actions, on, actions.cluster.get(on));
+    }
+
+    OnClusterMarkDown(ClusterActions actions, int on, IInvokableInstance instance)
+    {
+        super("Mark " + on + " Down in Snitches", RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS,
+              actions, on, () -> actions.failureDetector.markDown(instance.broadcastAddress()));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterRepairRanges.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterRepairRanges.java
new file mode 100644
index 0000000..94dcea5
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterRepairRanges.java
@@ -0,0 +1,40 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.cluster;
+
+import java.util.List;
+import java.util.Map;
+
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.Actions.ReliableAction;
+
+import static java.util.stream.IntStream.range;
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+
+public class OnClusterRepairRanges extends ReliableAction
+{
+    public OnClusterRepairRanges(KeyspaceActions actions, int[] on, boolean repairPaxos, boolean repairOnlyPaxos, List<Map.Entry<String, String>> ranges)
+    {
+        super("Repair ranges", NONE, RELIABLE_NO_TIMEOUTS,
+              () -> ActionList.of(range(0, on.length)
+                              .mapToObj(
+                                    i -> new OnInstanceRepair(actions, on[i], repairPaxos, repairOnlyPaxos, ranges.get(i), true))));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterReplace.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterReplace.java
new file mode 100644
index 0000000..8e0af40
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterReplace.java
@@ -0,0 +1,116 @@
+/*
+ * 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.simulator.cluster;
+
+import java.net.InetSocketAddress;
+import java.util.AbstractMap;
+import java.util.List;
+import java.util.Map;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.Actions.ReliableAction;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+import static org.apache.cassandra.utils.LazyToString.lazy;
+
+class OnClusterReplace extends OnClusterChangeTopology
+{
+    final int leaving;
+    final int joining;
+
+    OnClusterReplace(KeyspaceActions actions, Topology before, Topology during, Topology after, int leaving, int joining)
+    {
+        super(lazy(() -> String.format("node%d Replacing node%d", joining, leaving)), actions, STRICT, NONE, before, after, during.pendingKeys());
+        this.leaving = leaving;
+        this.joining = joining;
+    }
+
+    public ActionList performSimple()
+    {
+        // need to mark it as DOWN, and perhaps shut it down
+        Map<InetSocketAddress, IInvokableInstance> lookup = Cluster.getUniqueAddressLookup(actions.cluster);
+        IInvokableInstance leaveInstance = actions.cluster.get(leaving);
+        IInvokableInstance joinInstance = actions.cluster.get(joining);
+        before(leaveInstance);
+        UUID hostId = leaveInstance.unsafeCallOnThisThread(SystemKeyspace::getLocalHostId);
+        String movingToken = leaveInstance.unsafeCallOnThisThread(() -> Utils.currentToken().toString());
+        List<Map.Entry<String, String>> repairRanges = leaveInstance.unsafeApplyOnThisThread(
+            (String keyspaceName) -> StorageService.instance.getLocalAndPendingRanges(keyspaceName).stream()
+                                                            .map(OnClusterReplace::toStringEntry)
+                                                            .collect(Collectors.toList()),
+            actions.keyspace
+        );
+
+        int[] others = repairRanges.stream().mapToInt(
+            repairRange -> lookup.get(leaveInstance.unsafeApplyOnThisThread(
+                (String keyspaceName, String tk) -> Keyspace.open(keyspaceName).getReplicationStrategy().getNaturalReplicasForToken(Utils.parseToken(tk)).stream().map(Replica::endpoint)
+                                                            .filter(i -> !i.equals(getBroadcastAddressAndPort()))
+                                                            .findFirst()
+                                                            .orElseThrow(IllegalStateException::new),
+                actions.keyspace, repairRange.getValue())
+            ).config().num()
+        ).toArray();
+
+        return ActionList.of(
+        // first sync gossip so that newly joined nodes are known by all, so that when we markdown we do not throw UnavailableException
+        ReliableAction.transitively("Sync Gossip", () -> actions.gossipWithAll(leaving)),
+
+        // "shutdown" the leaving instance
+        new OnClusterUpdateGossip(actions,
+                                      ActionList.of(new OnInstanceMarkShutdown(actions, leaving),
+                                                    new OnClusterMarkDown(actions, leaving)),
+                                      new OnInstanceSendShutdownToAll(actions, leaving)),
+
+        // TODO (safety): confirm repair does not include this node
+
+        // note that in the case of node replacement, we must perform a paxos repair before AND mid-transition.
+        // the first ensures the paxos state is flushed to the base table's sstables, so that the replacing node
+        // must receive a copy of all earlier operations (since the old node is now "offline")
+
+        new OnClusterRepairRanges(actions, others, true, false, repairRanges),
+
+        // stream/repair from a peer
+        new OnClusterUpdateGossip(actions, joining, new OnInstanceSetBootstrapReplacing(actions, joining, leaving, hostId, movingToken)),
+
+        new OnInstanceSyncSchemaForBootstrap(actions, joining),
+        new OnInstanceTopologyChangePaxosRepair(actions, joining, "Replace"),
+        new OnInstanceBootstrap(actions, joinInstance, movingToken, true),
+
+        // setup the node's own gossip state for natural ownership, and return gossip actions to disseminate
+        new OnClusterUpdateGossip(actions, joining, new OnInstanceSetNormal(actions, joining, hostId, movingToken))
+        );
+    }
+
+    static Map.Entry<String, String> toStringEntry(Range<Token> range)
+    {
+        return new AbstractMap.SimpleImmutableEntry<>(range.left.toString(), range.right.toString());
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterSetPaxosVariant.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterSetPaxosVariant.java
new file mode 100644
index 0000000..7919b2c
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterSetPaxosVariant.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.cluster;
+
+import org.apache.cassandra.config.Config.PaxosVariant;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+
+class OnClusterSetPaxosVariant extends Action
+{
+    private final ClusterActions actions;
+    final PaxosVariant newVariant;
+
+    OnClusterSetPaxosVariant(ClusterActions actions, PaxosVariant newVariant)
+    {
+        super("Set Paxos Variant to " + newVariant, RELIABLE, NONE);
+        this.actions = actions;
+        this.newVariant = newVariant;
+    }
+
+    protected ActionList performSimple()
+    {
+        return actions.onAll((on) -> new OnInstanceSetPaxosVariant(actions, on, newVariant));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterSyncPendingRanges.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterSyncPendingRanges.java
new file mode 100644
index 0000000..04065ae
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterSyncPendingRanges.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.simulator.Actions.ReliableAction;
+
+public class OnClusterSyncPendingRanges extends ReliableAction
+{
+    public OnClusterSyncPendingRanges(ClusterActions actions)
+    {
+        super("Sync Pending Ranges Executor", actions::syncPendingRanges, true);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterUpdateGossip.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterUpdateGossip.java
new file mode 100644
index 0000000..18263a3
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnClusterUpdateGossip.java
@@ -0,0 +1,64 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.Actions.ReliableAction;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.systems.SimulatedAction;
+
+import static org.apache.cassandra.simulator.Action.Modifier.DISPLAY_ORIGIN;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+
+public class OnClusterUpdateGossip extends ReliableAction
+{
+    ActionList cancel;
+    OnClusterUpdateGossip(ClusterActions actions, int on, SimulatedAction updateLocalState)
+    {
+        this(updateLocalState.description() + " and Sync Gossip", actions, ActionList.of(updateLocalState),
+             new OnInstanceGossipWithAll(actions, on));
+    }
+
+    OnClusterUpdateGossip(ClusterActions actions, ActionList updateLocalState, Action sendGossip)
+    {
+        this(updateLocalState.get(0).description() + " and Sync Gossip", actions, updateLocalState, sendGossip);
+    }
+
+    OnClusterUpdateGossip(Object id, ClusterActions actions, ActionList updateLocalState, Action sendGossip)
+    {
+        this(id, actions, updateLocalState.andThen(sendGossip));
+    }
+
+    OnClusterUpdateGossip(Object id, ClusterActions actions, ActionList updateLocalStateThenSendGossip)
+    {
+        super(id, STRICT.with(DISPLAY_ORIGIN), RELIABLE_NO_TIMEOUTS, () -> updateLocalStateThenSendGossip.andThen(new OnClusterSyncPendingRanges(actions)));
+        cancel = updateLocalStateThenSendGossip;
+    }
+
+    @Override
+    protected Throwable safeInvalidate(boolean isCancellation)
+    {
+        ActionList list = cancel;
+        if (list == null)
+            return null;
+        cancel = null;
+        return list.safeForEach(Action::invalidate);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceBootstrap.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceBootstrap.java
new file mode 100644
index 0000000..8fa9375
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceBootstrap.java
@@ -0,0 +1,54 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.List;
+
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.simulator.systems.SimulatedActionTask;
+
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.simulator.Action.Modifier.DISPLAY_ORIGIN;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.cluster.Utils.parseTokens;
+
+class OnInstanceBootstrap extends SimulatedActionTask
+{
+    public OnInstanceBootstrap(ClusterActions actions, IInvokableInstance on)
+    {
+        this(actions, on, on.config().getString("initial_token"), false);
+    }
+
+    public OnInstanceBootstrap(ClusterActions actions, IInvokableInstance on, String token, boolean replacing)
+    {
+        super("Bootstrap on " + on.config().num(), RELIABLE_NO_TIMEOUTS.with(DISPLAY_ORIGIN), RELIABLE_NO_TIMEOUTS, actions, on,
+              invokableBootstrap(token, replacing));
+    }
+
+    private static IIsolatedExecutor.SerializableRunnable invokableBootstrap(String token, boolean replacing)
+    {
+        return () -> {
+            List<Token> tokens = parseTokens(singletonList(token));
+            StorageService.instance.startBootstrap(tokens, replacing);
+        };
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceFlushAndCleanup.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceFlushAndCleanup.java
new file mode 100644
index 0000000..c34887a
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceFlushAndCleanup.java
@@ -0,0 +1,62 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.function.Function;
+
+import org.apache.cassandra.Util;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.simulator.Action;
+
+class OnInstanceFlushAndCleanup extends ClusterReliableAction
+{
+    OnInstanceFlushAndCleanup(ClusterActions actions, int on)
+    {
+        super("Flush and Cleanup on " + on, actions, on, invokableFlushAndCleanup());
+    }
+
+    public static Function<Integer, Action> factory(ClusterActions actions)
+    {
+        return (on) -> new OnInstanceFlushAndCleanup(actions, on);
+    }
+
+    private static IIsolatedExecutor.SerializableRunnable invokableFlushAndCleanup()
+    {
+        return () -> {
+            for (Keyspace keyspace : Keyspace.all())
+            {
+                for (ColumnFamilyStore cfs : keyspace.getColumnFamilyStores())
+                {
+                    try
+                    {
+                        Util.flush(cfs);
+                        if (cfs.forceCleanup(1) != CompactionManager.AllSSTableOpStatus.SUCCESSFUL)
+                            throw new IllegalStateException();
+                        cfs.forceMajorCompaction();
+                    }
+                    catch (Throwable t) { throw new RuntimeException(t); }
+                }
+            }
+        };
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceGossipWith.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceGossipWith.java
new file mode 100644
index 0000000..0532b35
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceGossipWith.java
@@ -0,0 +1,50 @@
+/*
+ * 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.simulator.cluster;
+
+import java.net.InetSocketAddress;
+import java.util.function.BiFunction;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.simulator.Action;
+
+import static org.apache.cassandra.locator.InetAddressAndPort.getByAddress;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+
+class OnInstanceGossipWith extends ClusterAction
+{
+    OnInstanceGossipWith(ClusterActions actions, int from, int to)
+    {
+        super("Gossip from " + from + " to " + to, STRICT, RELIABLE_NO_TIMEOUTS, actions, from, invokableGossipWith(actions.cluster, to));
+    }
+
+    public static BiFunction<Integer, Integer, Action> factory(ClusterActions actions)
+    {
+        return (from, to) -> new OnInstanceGossipWith(actions, from, to);
+    }
+
+    static IIsolatedExecutor.SerializableRunnable invokableGossipWith(Cluster cluster, int to)
+    {
+        InetSocketAddress address = cluster.get(to).broadcastAddress();
+        return () -> Gossiper.runInGossipStageBlocking(() -> Gossiper.instance.unsafeGossipWith(getByAddress(address)));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceGossipWithAll.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceGossipWithAll.java
new file mode 100644
index 0000000..4db8e2b
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceGossipWithAll.java
@@ -0,0 +1,38 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.simulator.Actions.ReliableAction;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+
+class OnInstanceGossipWithAll extends ReliableAction
+{
+    OnInstanceGossipWithAll(ClusterActions actions, int from)
+    {
+        super("Send Shutdown from " + from + " to all", NONE, RELIABLE_NO_TIMEOUTS,
+              () -> actions.gossipWithAll(from));
+    }
+    OnInstanceGossipWithAll(ClusterActions actions, IInvokableInstance from)
+    {
+        this(actions, from.config().num());
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceMarkShutdown.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceMarkShutdown.java
new file mode 100644
index 0000000..6ef615f
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceMarkShutdown.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.cluster;
+
+import static org.apache.cassandra.distributed.impl.UnsafeGossipHelper.markShutdownRunner;
+
+class OnInstanceMarkShutdown extends ClusterReliableAction
+{
+    OnInstanceMarkShutdown(ClusterActions actions, int on)
+    {
+        super("Mark Self Shutdown on " + on, actions, on, markShutdownRunner(actions.cluster.get(on).broadcastAddress()));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceRepair.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceRepair.java
new file mode 100644
index 0000000..9da7317
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceRepair.java
@@ -0,0 +1,105 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.TokenMetadata;
+import org.apache.cassandra.repair.RepairParallelism;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.progress.ProgressEventType;
+
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.cluster.Utils.currentToken;
+import static org.apache.cassandra.simulator.cluster.Utils.parseTokenRanges;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+
+class OnInstanceRepair extends ClusterAction
+{
+    public OnInstanceRepair(KeyspaceActions actions, int on, boolean repairPaxos, boolean repairOnlyPaxos, boolean force)
+    {
+        super("Repair on " + on, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, actions, on, invokableBlockingRepair(actions.keyspace, repairPaxos, repairOnlyPaxos, false, force));
+    }
+
+    public OnInstanceRepair(KeyspaceActions actions, int on, boolean repairPaxos, boolean repairOnlyPaxos, Map.Entry<String, String> repairRange, boolean force)
+    {
+        this(actions, on, RELIABLE_NO_TIMEOUTS, RELIABLE_NO_TIMEOUTS, repairPaxos, repairOnlyPaxos, repairRange, force);
+    }
+
+    public OnInstanceRepair(KeyspaceActions actions, int on, Modifiers self, Modifiers transitive, String id, boolean repairPaxos, boolean repairOnlyPaxos, boolean primaryRangeOnly, boolean force)
+    {
+        super(id, self, transitive, actions, on, invokableBlockingRepair(actions.keyspace, repairPaxos, repairOnlyPaxos, primaryRangeOnly, force));
+    }
+
+    public OnInstanceRepair(KeyspaceActions actions, int on, Modifiers self, Modifiers transitive, boolean repairPaxos, boolean repairOnlyPaxos, Map.Entry<String, String> repairRange, boolean force)
+    {
+        super("Repair on " + on, self, transitive, actions, on, invokableBlockingRepair(actions.keyspace, repairPaxos, repairOnlyPaxos, repairRange, force));
+    }
+
+    private static IIsolatedExecutor.SerializableRunnable invokableBlockingRepair(String keyspaceName, boolean repairPaxos, boolean repairOnlyPaxos, boolean primaryRangeOnly, boolean force)
+    {
+        return () -> {
+            Condition done = newOneTimeCondition();
+            invokeRepair(keyspaceName, repairPaxos, repairOnlyPaxos, primaryRangeOnly, force, done::signal);
+            done.awaitThrowUncheckedOnInterrupt();
+        };
+    }
+
+    private static IIsolatedExecutor.SerializableRunnable invokableBlockingRepair(String keyspaceName, boolean repairPaxos, boolean repairOnlyPaxos, Map.Entry<String, String> repairRange, boolean force)
+    {
+        return () -> {
+            Condition done = newOneTimeCondition();
+            invokeRepair(keyspaceName, repairPaxos, repairOnlyPaxos, () -> parseTokenRanges(singletonList(repairRange)), false, force, done::signal);
+            done.awaitThrowUncheckedOnInterrupt();
+        };
+    }
+
+    private static void invokeRepair(String keyspaceName, boolean repairPaxos, boolean repairOnlyPaxos, boolean primaryRangeOnly, boolean force, Runnable listener)
+    {
+        Keyspace keyspace = Keyspace.open(keyspaceName);
+        TokenMetadata metadata = StorageService.instance.getTokenMetadata().cloneOnlyTokenMap();
+        invokeRepair(keyspaceName, repairPaxos, repairOnlyPaxos,
+                     () -> primaryRangeOnly ? Collections.singletonList(metadata.getPrimaryRangeFor(currentToken()))
+                                            : keyspace.getReplicationStrategy().getAddressReplicas(metadata).get(getBroadcastAddressAndPort()).asList(Replica::range),
+                     primaryRangeOnly, force, listener);
+    }
+
+    private static void invokeRepair(String keyspaceName, boolean repairPaxos, boolean repairOnlyPaxos, IIsolatedExecutor.SerializableCallable<Collection<Range<Token>>> rangesSupplier, boolean isPrimaryRangeOnly, boolean force, Runnable listener)
+    {
+        Collection<Range<Token>> ranges = rangesSupplier.call();
+        // no need to wait for completion, as we track all task submissions and message exchanges, and ensure they finish before continuing to next action
+        StorageService.instance.repair(keyspaceName, new RepairOption(RepairParallelism.SEQUENTIAL, isPrimaryRangeOnly, false, false, 1, ranges, false, false, force, PreviewKind.NONE, false, true, repairPaxos, repairOnlyPaxos), singletonList((tag, event) -> {
+            if (event.getType() == ProgressEventType.COMPLETE)
+                listener.run();
+        }));
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendLocalGossipState.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendLocalGossipState.java
new file mode 100644
index 0000000..f466b35
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendLocalGossipState.java
@@ -0,0 +1,51 @@
+/*
+ * 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.simulator.cluster;
+
+import java.net.InetSocketAddress;
+import java.util.function.BiFunction;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.simulator.Action;
+
+import static org.apache.cassandra.locator.InetAddressAndPort.getByAddress;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+
+class OnInstanceSendLocalGossipState extends ClusterAction
+{
+    OnInstanceSendLocalGossipState(ClusterActions actions, int from, int to)
+    {
+        super("Send Local Gossip State from " + from + " to " + to, STRICT, RELIABLE_NO_TIMEOUTS, actions, from,
+              invokableSendLocalGossipState(actions.cluster, to));
+    }
+
+    public static BiFunction<Integer, Integer, Action> factory(ClusterActions actions)
+    {
+        return (from, to) -> new OnInstanceSendLocalGossipState(actions, from, to);
+    }
+
+    static IIsolatedExecutor.SerializableRunnable invokableSendLocalGossipState(Cluster cluster, int to)
+    {
+        InetSocketAddress address = cluster.get(to).broadcastAddress();
+        return () -> Gossiper.runInGossipStageBlocking(() -> Gossiper.instance.unsafeSendLocalEndpointStateTo(getByAddress(address)));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendShutdown.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendShutdown.java
new file mode 100644
index 0000000..b932349
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendShutdown.java
@@ -0,0 +1,50 @@
+/*
+ * 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.simulator.cluster;
+
+import java.net.InetSocketAddress;
+import java.util.function.BiFunction;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.simulator.Action;
+
+import static org.apache.cassandra.locator.InetAddressAndPort.getByAddress;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.Action.Modifiers.STRICT;
+
+class OnInstanceSendShutdown extends ClusterAction
+{
+    OnInstanceSendShutdown(ClusterActions actions, int from, int to)
+    {
+        super("Send Shutdown from " + from + " to " + to, STRICT, RELIABLE_NO_TIMEOUTS, actions, from, invokableSendShutdown(actions.cluster, to));
+    }
+
+    public static BiFunction<Integer, Integer, Action> factory(ClusterActions actions)
+    {
+        return (from, to) -> new OnInstanceSendShutdown(actions, from, to);
+    }
+
+    static IIsolatedExecutor.SerializableRunnable invokableSendShutdown(Cluster cluster, int to)
+    {
+        InetSocketAddress address = cluster.get(to).broadcastAddress();
+        return () -> Gossiper.runInGossipStageBlocking(() -> Gossiper.instance.unsafeSendShutdown(getByAddress(address)));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendShutdownToAll.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendShutdownToAll.java
new file mode 100644
index 0000000..fe62986
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSendShutdownToAll.java
@@ -0,0 +1,33 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.simulator.Actions.ReliableAction;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+
+class OnInstanceSendShutdownToAll extends ReliableAction
+{
+    OnInstanceSendShutdownToAll(ClusterActions actions, int from)
+    {
+        super("Send Shutdown from " + from + " to all", NONE, RELIABLE_NO_TIMEOUTS,
+              () -> actions.sendShutdownToAll(from));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetBootstrapReplacing.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetBootstrapReplacing.java
new file mode 100644
index 0000000..fea4e05
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetBootstrapReplacing.java
@@ -0,0 +1,31 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.UUID;
+
+import static org.apache.cassandra.distributed.impl.UnsafeGossipHelper.addToRingBootstrapReplacingRunner;
+
+class OnInstanceSetBootstrapReplacing extends ClusterReliableAction
+{
+    OnInstanceSetBootstrapReplacing(ClusterActions actions, int on, int replacing, UUID hostId, String token)
+    {
+        super("Set " + on + " to Bootstrap Replacing", actions, on, addToRingBootstrapReplacingRunner(actions.cluster.get(on), actions.cluster.get(replacing), hostId, token));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetBootstrapping.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetBootstrapping.java
new file mode 100644
index 0000000..c8a6f5d
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetBootstrapping.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.cluster;
+
+import static org.apache.cassandra.distributed.impl.UnsafeGossipHelper.addToRingBootstrappingRunner;
+
+class OnInstanceSetBootstrapping extends ClusterReliableAction
+{
+    OnInstanceSetBootstrapping(ClusterActions actions, int on)
+    {
+        super("Set " + on + " to Bootstrapping", actions, on, addToRingBootstrappingRunner(actions.cluster.get(on)));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetLeaving.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetLeaving.java
new file mode 100644
index 0000000..c35d0b4
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetLeaving.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.cluster;
+
+import static org.apache.cassandra.distributed.impl.UnsafeGossipHelper.addToRingLeavingRunner;
+
+class OnInstanceSetLeaving extends ClusterReliableAction
+{
+    OnInstanceSetLeaving(ClusterActions actions, int on)
+    {
+        super("Set " + on + " to Leaving", actions, on, addToRingLeavingRunner(actions.cluster.get(on)));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetLeft.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetLeft.java
new file mode 100644
index 0000000..83de795
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetLeft.java
@@ -0,0 +1,29 @@
+/*
+ * 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.simulator.cluster;
+
+import static org.apache.cassandra.distributed.impl.UnsafeGossipHelper.addToRingLeftRunner;
+
+class OnInstanceSetLeft extends ClusterReliableAction
+{
+    OnInstanceSetLeft(ClusterActions actions, int on)
+    {
+        super("Set " + on + " to Left", actions, on, addToRingLeftRunner(actions.cluster.get(on)));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetNormal.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetNormal.java
new file mode 100644
index 0000000..cc3702c
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetNormal.java
@@ -0,0 +1,36 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.UUID;
+
+import static org.apache.cassandra.distributed.impl.UnsafeGossipHelper.addToRingNormalRunner;
+
+class OnInstanceSetNormal extends ClusterReliableAction
+{
+    OnInstanceSetNormal(ClusterActions actions, int on, UUID hostId, String tokenString)
+    {
+        super("Set " + on + " to Normal", actions, on, addToRingNormalRunner(actions.cluster.get(on), hostId, tokenString));
+    }
+
+    OnInstanceSetNormal(ClusterActions actions, int on)
+    {
+        super("Set " + on + " to Normal", actions, on, addToRingNormalRunner(actions.cluster.get(on)));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetPaxosVariant.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetPaxosVariant.java
new file mode 100644
index 0000000..0cd3eb6
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSetPaxosVariant.java
@@ -0,0 +1,56 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.config.Config.PaxosVariant;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.service.paxos.Paxos;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+import static org.apache.cassandra.utils.LazyToString.lazy;
+
+class OnInstanceSetPaxosVariant extends Action
+{
+    final IInvokableInstance instance;
+    final int on;
+    final PaxosVariant newVariant;
+
+    OnInstanceSetPaxosVariant(ClusterActions actions, int on, PaxosVariant newVariant)
+    {
+        super(lazy(() -> "Set Paxos Variant to " + newVariant + " on node" + on), RELIABLE, NONE);
+        this.instance = actions.cluster.get(on);
+        this.on = on;
+        this.newVariant = newVariant;
+    }
+
+    protected ActionList performSimple()
+    {
+        instance.unsafeRunOnThisThread(invokableSetVariant(newVariant));
+        return ActionList.empty();
+    }
+
+    static IIsolatedExecutor.SerializableRunnable invokableSetVariant(PaxosVariant to)
+    {
+        return () -> Paxos.setPaxosVariant(to);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSyncPendingRanges.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSyncPendingRanges.java
new file mode 100644
index 0000000..4611d36
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSyncPendingRanges.java
@@ -0,0 +1,42 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.function.Function;
+
+import org.apache.cassandra.service.PendingRangeCalculatorService;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.systems.SimulatedActionTask;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+
+class OnInstanceSyncPendingRanges extends SimulatedActionTask
+{
+    OnInstanceSyncPendingRanges(ClusterActions actions, int node)
+    {
+        //noinspection Convert2MethodRef - invalid inspection across multiple classloaders
+        super("Sync Pending Ranges on " + node, RELIABLE, RELIABLE, actions, actions.cluster.get(node),
+              () -> PendingRangeCalculatorService.instance.blockUntilFinished());
+    }
+
+    public static Function<Integer, Action> factory(ClusterActions clusterActions)
+    {
+        return (node) -> new OnInstanceSyncPendingRanges(clusterActions, node);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSyncSchemaForBootstrap.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSyncSchemaForBootstrap.java
new file mode 100644
index 0000000..c8bc9f7
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceSyncSchemaForBootstrap.java
@@ -0,0 +1,37 @@
+/*
+ * 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.simulator.cluster;
+
+import java.time.Duration;
+
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.simulator.systems.SimulatedActionTask;
+
+import static org.apache.cassandra.simulator.Action.Modifier.DISPLAY_ORIGIN;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.junit.Assert.assertTrue;
+
+class OnInstanceSyncSchemaForBootstrap extends SimulatedActionTask
+{
+    public OnInstanceSyncSchemaForBootstrap(ClusterActions actions, int node)
+    {
+        super("Sync Schema on " + node, RELIABLE_NO_TIMEOUTS.with(DISPLAY_ORIGIN), RELIABLE_NO_TIMEOUTS, actions, actions.cluster.get(node),
+              () -> assertTrue("schema is ready", Schema.instance.waitUntilReady(Duration.ofMinutes(10))));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceTopologyChangePaxosRepair.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceTopologyChangePaxosRepair.java
new file mode 100644
index 0000000..daaa474
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/OnInstanceTopologyChangePaxosRepair.java
@@ -0,0 +1,71 @@
+/*
+ * 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.simulator.cluster;
+
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.Future;
+
+import static org.apache.cassandra.net.Verb.MUTATION_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_COMPLETE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_FINISH_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_RSP;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_RSP2;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_START_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.READ_REQ;
+import static org.apache.cassandra.net.Verb.SCHEMA_PULL_REQ;
+import static org.apache.cassandra.net.Verb.SCHEMA_PUSH_REQ;
+import static org.apache.cassandra.simulator.Action.Modifiers.NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+
+class OnInstanceTopologyChangePaxosRepair extends ClusterAction
+{
+    public OnInstanceTopologyChangePaxosRepair(ClusterActions actions, int on, String reason)
+    {
+        this("Paxos Topology Repair on " + on, RELIABLE, NO_TIMEOUTS, actions, on, invokableTopologyChangeRepair(reason));
+    }
+
+    public OnInstanceTopologyChangePaxosRepair(String id, Modifiers self, Modifiers transitive, ClusterActions actions, int on, SerializableRunnable runnable)
+    {
+        super(id, RELIABLE.with(self), NO_TIMEOUTS.with(transitive), actions, on, runnable);
+        setMessageModifiers(SCHEMA_PULL_REQ, RELIABLE, RELIABLE);
+        setMessageModifiers(SCHEMA_PUSH_REQ, RELIABLE, RELIABLE);
+        setMessageModifiers(PAXOS2_CLEANUP_START_PREPARE_REQ, RELIABLE, RELIABLE);
+        setMessageModifiers(PAXOS2_CLEANUP_REQ, RELIABLE, RELIABLE);
+        setMessageModifiers(PAXOS2_CLEANUP_FINISH_PREPARE_REQ, RELIABLE, RELIABLE);
+        setMessageModifiers(PAXOS2_CLEANUP_COMPLETE_REQ, RELIABLE, RELIABLE);
+        setMessageModifiers(PAXOS2_CLEANUP_RSP, RELIABLE, RELIABLE);
+        setMessageModifiers(PAXOS2_CLEANUP_RSP2, RELIABLE, RELIABLE);
+        setMessageModifiers(MUTATION_REQ, RELIABLE, RELIABLE);
+        setMessageModifiers(READ_REQ, RELIABLE, RELIABLE);
+    }
+
+    protected static SerializableRunnable invokableTopologyChangeRepair(String reason)
+    {
+        return () -> {
+            Condition condition = newOneTimeCondition();
+            Future<?> future = StorageService.instance.startRepairPaxosForTopologyChange(reason);
+            future.addListener(condition::signal); // add listener so we don't use Futures.addAllAsList
+            condition.awaitThrowUncheckedOnInterrupt();
+        };
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/Topology.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/Topology.java
new file mode 100644
index 0000000..11ec2f8
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/Topology.java
@@ -0,0 +1,94 @@
+/*
+ * 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.simulator.cluster;
+
+import java.util.Arrays;
+
+public class Topology
+{
+    public final int[] primaryKeys;
+    public final int[] membersOfRing;
+    public final long[] membersOfRingTokens;
+    public final int[] membersOfQuorum;
+    public final int[] rf;
+    public final int quorumRf;
+    public final int[][] replicasForKeys;
+    public final int[][] pendingReplicasForKeys;
+
+    public Topology(int[] primaryKeys, int[] membersOfRing, long[] membersOfRingTokens, int[] membersOfQuorum, int[] rf, int quorumRf, int[][] replicasForKeys, int[][] pendingReplicasForKeys)
+    {
+        for (int i = 0 ; i < primaryKeys.length ; ++i)
+        {
+            if (replicasForKeys[i].length != quorumRf)
+                throw new AssertionError(String.format("Inconsistent ownership information: %s (expect %d)", Arrays.toString(replicasForKeys[i]), quorumRf));
+        }
+        this.primaryKeys = primaryKeys;
+        this.membersOfRing = membersOfRing;
+        this.membersOfRingTokens = membersOfRingTokens;
+        this.membersOfQuorum = membersOfQuorum;
+        this.rf = rf;
+        this.quorumRf = quorumRf;
+        this.replicasForKeys = replicasForKeys;
+        this.pendingReplicasForKeys = pendingReplicasForKeys;
+    }
+
+    public int[] pendingKeys()
+    {
+        int count = 0;
+        for (int i = 0 ; i < pendingReplicasForKeys.length ; ++i)
+        {
+            if (pendingReplicasForKeys[i].length > 0)
+                ++count;
+        }
+        int[] pendingKeys = new int[count];
+        count = 0;
+        for (int i = 0 ; i < pendingReplicasForKeys.length ; ++i)
+        {
+            if (pendingReplicasForKeys[i].length == 0)
+                continue;
+            pendingKeys[count] = primaryKeys[i];
+            count++;
+        }
+        return pendingKeys;
+    }
+
+    public Topology select(int[] selectPrimaryKeys)
+    {
+        int[][] newReplicasForKeys = new int[selectPrimaryKeys.length][];
+        int[][] newPendingReplicasForKeys = new int[selectPrimaryKeys.length][];
+        int in = 0, out = 0;
+        while (out < newReplicasForKeys.length)
+        {
+            if (primaryKeys[in] < selectPrimaryKeys[out])
+            {
+                ++in;
+                continue;
+            }
+            if (primaryKeys[in] > selectPrimaryKeys[out])
+                throw new AssertionError();
+
+            newReplicasForKeys[out] = replicasForKeys[in];
+            newPendingReplicasForKeys[out] = pendingReplicasForKeys[in];
+            ++in;
+            ++out;
+        }
+        return new Topology(selectPrimaryKeys, membersOfRing, membersOfRingTokens, membersOfQuorum, rf, quorumRf,
+                            newReplicasForKeys, newPendingReplicasForKeys);
+    }
+}
\ No newline at end of file
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/TopologyListener.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/TopologyListener.java
new file mode 100644
index 0000000..f08c587
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/TopologyListener.java
@@ -0,0 +1,24 @@
+/*
+ * 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.simulator.cluster;
+
+public interface TopologyListener
+{
+    void onChange(Topology newTopology);
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/cluster/Utils.java b/test/simulator/main/org/apache/cassandra/simulator/cluster/Utils.java
new file mode 100644
index 0000000..277ae11
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/cluster/Utils.java
@@ -0,0 +1,84 @@
+/*
+ * 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.simulator.cluster;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.TokenSerializer;
+import org.apache.cassandra.gms.VersionedValue;
+
+import static org.apache.cassandra.config.DatabaseDescriptor.getPartitioner;
+import static org.apache.cassandra.utils.FBUtilities.getBroadcastAddressAndPort;
+
+public class Utils
+{
+    static Token currentToken()
+    {
+        EndpointState epState = Gossiper.instance.getEndpointStateForEndpoint(getBroadcastAddressAndPort());
+        VersionedValue value = epState.getApplicationState(ApplicationState.TOKENS);
+        try (DataInputStream in = new DataInputStream(new ByteArrayInputStream(value.toBytes())))
+        {
+            return TokenSerializer.deserialize(getPartitioner(), in).iterator().next();
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    static List<Token> parseTokens(Collection<String> tokens)
+    {
+        return tokens.stream()
+                .map(Utils::parseToken)
+                .collect(Collectors.toList());
+    }
+
+    static List<Range<Token>> parseTokenRanges(Collection<Map.Entry<String, String>> tokenRanges)
+    {
+        return tokenRanges.stream()
+                .map(Utils::parseTokenRange)
+                .collect(Collectors.toList());
+    }
+
+    static Token parseToken(String token)
+    {
+        return getPartitioner().getTokenFactory().fromString(token);
+    }
+
+    static Range<Token> parseTokenRange(Map.Entry<String, String> tokenRange)
+    {
+        return parseTokenRange(tokenRange.getKey(), tokenRange.getValue());
+    }
+
+    static Range<Token> parseTokenRange(String exclusiveLowerBound, String inclusiveUpperBound)
+    {
+        return new Range<>(parseToken(exclusiveLowerBound), parseToken(inclusiveUpperBound));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/debug/Reconcile.java b/test/simulator/main/org/apache/cassandra/simulator/debug/Reconcile.java
new file mode 100644
index 0000000..5acf764
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/debug/Reconcile.java
@@ -0,0 +1,563 @@
+/*
+ * 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.simulator.debug;
+
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.Supplier;
+import java.util.regex.Pattern;
+import java.util.zip.GZIPInputStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.io.util.DataInputPlus;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.simulator.ClusterSimulation;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.SimulationRunner.RecordOption;
+import org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites.Capture;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.concurrent.Threads;
+
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.NONE;
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.VALUE;
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.WITH_CALLSITES;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+
+public class Reconcile
+{
+    private static final Logger logger = LoggerFactory.getLogger(Reconcile.class);
+
+    private static final Pattern STRIP_TRACES = Pattern.compile("(Wakeup|Continue|Timeout|Waiting)\\[(((([a-zA-Z]\\.)*[a-zA-Z0-9_$]+\\.[a-zA-Z0-9_<>$]+:[\\-0-9]+; )*(([a-zA-Z]\\.)*[a-zA-Z0-9_$]+\\.[a-zA-Z0-9_<>$]+:[\\-0-9]+))( #\\[.*?]#)?) ?(by\\[.*?])?]");
+    private static final Pattern STRIP_NOW_TRACES = Pattern.compile("( #\\[.*?]#)");
+    private static final Pattern NORMALISE_THREAD_RECORDING_IN = Pattern.compile("(Thread\\[[^]]+:[0-9]+),?[0-9]+(,node[0-9]+)]");
+    static final Pattern NORMALISE_LAMBDA = Pattern.compile("((\\$\\$Lambda\\$[0-9]+/[0-9]+)?(@[0-9a-f]+)?)");
+    static final Pattern NORMALISE_THREAD = Pattern.compile("(Thread\\[[^]]+:[0-9]+),[0-9](,node[0-9]+)(_[0-9]+)?]");
+
+    public static class AbstractReconciler
+    {
+        private static final Logger logger = LoggerFactory.getLogger(AbstractReconciler.class);
+
+        final DataInputPlus in;
+        final List<String> strings = new ArrayList<>();
+        final boolean inputHasCallSites;
+        final boolean reconcileCallSites;
+        int line;
+
+        public AbstractReconciler(DataInputPlus in, boolean inputHasCallSites, RecordOption reconcile)
+        {
+            this.in = in;
+            this.inputHasCallSites = inputHasCallSites;
+            this.reconcileCallSites = reconcile == WITH_CALLSITES;
+        }
+
+        String readInterned() throws IOException
+        {
+            int id = (int) in.readVInt();
+            if (id == strings.size()) strings.add(in.readUTF());
+            else if (id > strings.size()) throw failWithOOM();
+            return strings.get(id);
+        }
+
+        private String readCallSite() throws IOException
+        {
+            if (!inputHasCallSites)
+                return "";
+
+            String trace = in.readUTF();
+            for (int i = trace.indexOf('\n') ; i >= 0 ; i = trace.indexOf('\n', i + 1))
+                ++line;
+            return reconcileCallSites ? trace : "";
+        }
+
+        private String ourCallSite()
+        {
+            if (!reconcileCallSites)
+                return "";
+
+            StackTraceElement[] ste = Thread.currentThread().getStackTrace();
+            return Arrays.stream(ste, 4, ste.length)
+                         .filter(st -> !st.getClassName().equals("org.apache.cassandra.simulator.debug.Reconcile")
+                                       && !st.getClassName().equals("org.apache.cassandra.simulator.SimulationRunner$Reconcile")
+                                       && !st.getClassName().equals("sun.reflect.NativeMethodAccessorImpl") // depends on async compile thread
+                                       && !st.getClassName().startsWith("sun.reflect.GeneratedMethodAccessor")) // depends on async compile thread
+                         .collect(new Threads.StackTraceCombiner(true, "", "\n", ""));
+        }
+
+        public void checkThread() throws IOException
+        {
+            // normalise lambda also strips Object.toString() inconsistencies for some Thread objects
+            String thread = NORMALISE_LAMBDA.matcher(readInterned()).replaceAll("");
+            String ourThread = NORMALISE_LAMBDA.matcher(Thread.currentThread().toString()).replaceAll("");
+            String callSite = NORMALISE_LAMBDA.matcher(readCallSite()).replaceAll("");
+            String ourCallSite = NORMALISE_LAMBDA.matcher(ourCallSite()).replaceAll("");
+            if (!thread.equals(ourThread) || !callSite.equals(ourCallSite))
+            {
+                logger.error(String.format("(%s,%s) != (%s,%s)", thread, callSite, ourThread, ourCallSite));
+                throw failWithOOM();
+            }
+        }
+    }
+
+    public static class TimeReconciler extends AbstractReconciler implements SimulatedTime.Listener, Closeable
+    {
+        boolean disabled;
+
+        public TimeReconciler(DataInputPlus in, boolean inputHasCallSites, RecordOption reconcile)
+        {
+            super(in, inputHasCallSites, reconcile);
+        }
+
+        @Override
+        public void close()
+        {
+            disabled = true;
+        }
+
+        @Override
+        public synchronized void accept(String kind, long value)
+        {
+            if (disabled)
+                return;
+
+            try
+            {
+                String testKind = readInterned();
+                long testValue = in.readUnsignedVInt();
+                checkThread();
+                if (!kind.equals(testKind) || value != testValue)
+                {
+                    logger.error("({},{}) != ({},{})", kind, value, testKind, testValue);
+                    throw failWithOOM();
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    public static class RandomSourceReconciler extends RandomSource.Abstract implements Supplier<RandomSource>, Closeable
+    {
+        private static final Logger logger = LoggerFactory.getLogger(RandomSourceReconciler.class);
+        private static final AtomicReferenceFieldUpdater<Reconcile.RandomSourceReconciler, Thread> lockedUpdater = AtomicReferenceFieldUpdater.newUpdater(Reconcile.RandomSourceReconciler.class, Thread.class, "locked");
+        final DataInputPlus in;
+        final RandomSource wrapped;
+        final AbstractReconciler threads;
+        int count;
+        volatile Thread locked;
+        volatile boolean disabled;
+
+        public RandomSourceReconciler(DataInputPlus in, RandomSource wrapped, boolean inputHasCallSites, RecordOption reconcile)
+        {
+            this.in = in;
+            this.wrapped = wrapped;
+            this.threads = new AbstractReconciler(in, inputHasCallSites, reconcile);
+        }
+
+        private void enter()
+        {
+            if (!lockedUpdater.compareAndSet(this, null, Thread.currentThread()))
+            {
+                if (disabled)
+                    return;
+
+                disabled = true;
+                logger.error("Race within RandomSourceReconciler - means we have a Simulator bug permitting two threads to run at once");
+                throw failWithOOM();
+            }
+        }
+
+        private void exit()
+        {
+            locked = null;
+        }
+
+        public void onDeterminismCheck(long value)
+        {
+            if (disabled)
+                return;
+
+            enter();
+            try
+            {
+                byte type = in.readByte();
+                int c = (int) in.readVInt();
+                long v = in.readLong();
+                threads.checkThread();
+                if (type != 7 || c != count || value != v)
+                {
+                    logger.error(String.format("(%d,%d,%d) != (%d,%d,%d)", 7, count, value, type, c, v));
+                    throw failWithOOM();
+                }
+                ++count;
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+        }
+
+        public int uniform(int min, int max)
+        {
+            int v = wrapped.uniform(min, max);
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                byte type = in.readByte();
+                int c = (int) in.readVInt();
+                threads.checkThread();
+                int min1 = (int) in.readVInt();
+                int max1 = (int) in.readVInt() + min1;
+                int v1 = (int) in.readVInt() + min1;
+                if (type != 1 || min != min1 || max != max1 || v != v1 || c != count)
+                {
+                    logger.error(String.format("(%d,%d,%d[%d,%d]) != (%d,%d,%d[%d,%d])", 1, count, v, min, max, type, c, v1, min1, max1));
+                    throw failWithOOM();
+                }
+                ++count;
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public long uniform(long min, long max)
+        {
+            long v = wrapped.uniform(min, max);
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                byte type = in.readByte();
+                int c = (int) in.readVInt();
+                threads.checkThread();
+                long min1 = in.readVInt();
+                long max1 = in.readVInt() + min1;
+                long v1 = in.readVInt() + min1;
+                if (type != 2 || min != min1 || max != max1 || v != v1 || c != count)
+                {
+                    logger.error(String.format("(%d,%d,%d[%d,%d]) != (%d,%d,%d[%d,%d])", 2, count, v, min, max, type, c, v1, min1, max1));
+                    throw failWithOOM();
+                }
+                ++count;
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public float uniformFloat()
+        {
+            float v = wrapped.uniformFloat();
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                byte type = in.readByte();
+                int c = (int) in.readVInt();
+                threads.checkThread();
+                float v1 = in.readFloat();
+                if (type != 3 || v != v1 || c != count)
+                {
+                    logger.error(String.format("(%d,%d,%f) != (%d,%d,%f)", 3, count, v, type, c, v1));
+                    throw failWithOOM();
+                }
+                ++count;
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        @Override
+        public double uniformDouble()
+        {
+            double v = wrapped.uniformDouble();
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                byte type = in.readByte();
+                int c = (int) in.readVInt();
+                threads.checkThread();
+                double v1 = in.readDouble();
+                if (type != 6 || v != v1 || c != count)
+                {
+                    logger.error(String.format("(%d,%d,%f) != (%d,%d,%f)", 6, count, v, type, c, v1));
+                    throw failWithOOM();
+                }
+                ++count;
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public synchronized void reset(long seed)
+        {
+            wrapped.reset(seed);
+            if (disabled)
+                return;
+
+            enter();
+            try
+            {
+                byte type = in.readByte();
+                int c = (int) in.readVInt();
+                long v1 = in.readVInt();
+                if (type != 4 || seed != v1 || c != count)
+                    throw failWithOOM();
+                ++count;
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+        }
+
+        public synchronized long reset()
+        {
+            long v = wrapped.reset();
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                byte type = in.readByte();
+                int c = (int) in.readVInt();
+                long v1 = in.readVInt();
+                if (type != 5 || v != v1 || c != count)
+                    throw failWithOOM();
+                ++count;
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public synchronized RandomSource get()
+        {
+            if (count++ > 0)
+                throw failWithOOM();
+            return this;
+        }
+
+        @Override
+        public void close()
+        {
+            disabled = true;
+        }
+    }
+
+    public static void reconcileWith(String loadFromDir, long seed, RecordOption withRng, RecordOption withTime, ClusterSimulation.Builder<?> builder)
+    {
+        File eventFile = new File(new File(loadFromDir), Long.toHexString(seed) + ".gz");
+        File rngFile = new File(new File(loadFromDir), Long.toHexString(seed) + ".rng.gz");
+        File timeFile = new File(new File(loadFromDir), Long.toHexString(seed) + ".time.gz");
+
+        try (BufferedReader eventIn = new BufferedReader(new InputStreamReader(new GZIPInputStream(eventFile.newInputStream())));
+             DataInputPlus.DataInputStreamPlus rngIn = new DataInputPlus.DataInputStreamPlus(rngFile.exists() && withRng != NONE ? new GZIPInputStream(rngFile.newInputStream()) : new ByteArrayInputStream(new byte[0]));
+             DataInputPlus.DataInputStreamPlus timeIn = new DataInputPlus.DataInputStreamPlus(timeFile.exists() && withTime != NONE ? new GZIPInputStream(timeFile.newInputStream()) : new ByteArrayInputStream(new byte[0])))
+        {
+            boolean inputHasWaitSites, inputHasWakeSites, inputHasRngCallSites, inputHasTimeCallSites;
+            {
+                String modifiers = eventIn.readLine();
+                if (!modifiers.startsWith("modifiers:"))
+                    throw new IllegalStateException();
+
+                builder.capture(new Capture(
+                    builder.capture().waitSites & (inputHasWaitSites = modifiers.contains("waitSites")),
+                    builder.capture().wakeSites & (inputHasWakeSites = modifiers.contains("wakeSites")),
+                    builder.capture().nowSites)
+                );
+                inputHasRngCallSites = modifiers.contains("rngCallSites");
+                if (!modifiers.contains("rng")) withRng = NONE;
+                if (withRng == WITH_CALLSITES && !inputHasRngCallSites) withRng = VALUE;
+
+                inputHasTimeCallSites = modifiers.contains("timeCallSites");
+                if (!modifiers.contains("time")) withTime = NONE;
+                if (withTime == WITH_CALLSITES && !inputHasTimeCallSites) withTime = VALUE;
+            }
+            if (withRng != NONE && !rngFile.exists())
+                throw new IllegalStateException();
+            if (withTime != NONE && !timeFile.exists())
+                throw new IllegalStateException();
+
+            {
+                Set<String> modifiers = new LinkedHashSet<>();
+                if (withRng == WITH_CALLSITES)
+                    modifiers.add("rngCallSites");
+                else if (withRng == VALUE)
+                    modifiers.add("rng");
+                if (withTime == WITH_CALLSITES)
+                    modifiers.add("timeCallSites");
+                else if (withTime == VALUE)
+                    modifiers.add("time");
+                if (builder.capture().waitSites)
+                    modifiers.add("WaitSites");
+                if (builder.capture().wakeSites)
+                    modifiers.add("WakeSites");
+                logger.error("Seed 0x{} ({}) (With: {})", Long.toHexString(seed), eventFile, modifiers);
+            }
+
+            RandomSourceReconciler random = null;
+            TimeReconciler time = null;
+            if (withRng != NONE)
+            {
+                builder.random(random = new RandomSourceReconciler(rngIn, new RandomSource.Default(), inputHasRngCallSites, withRng));
+                builder.onThreadLocalRandomCheck(random::onDeterminismCheck);
+            }
+            if (withTime != NONE)
+                builder.timeListener(time = new TimeReconciler(timeIn, inputHasTimeCallSites, withTime));
+
+            class Line { int line = 1; } Line line = new Line(); // box for heap dump analysis
+            try (ClusterSimulation<?> cluster = builder.create(seed);
+                 CloseableIterator<?> iter = cluster.simulation.iterator())
+            {
+                try
+                {
+                    while (iter.hasNext())
+                    {
+                        ++line.line;
+                        String rawInput = eventIn.readLine();
+                        String input = (inputHasWaitSites != builder.capture().waitSites || inputHasWakeSites != builder.capture().wakeSites)
+                                       ? normaliseRecordingInWithoutWaitOrWakeSites(rawInput, inputHasWaitSites && !builder.capture().waitSites, inputHasWakeSites && !builder.capture().wakeSites)
+                                       : normaliseRecordingIn(rawInput);
+                        Object next = iter.next();
+                        String rawOutput = next.toString();
+                        String output = normaliseReconcileWithRecording(rawOutput);
+                        if (!input.equals(output))
+                            failWithHeapDump(line.line, input, output);
+                    }
+                    if (random != null)
+                        random.close();
+                    if (time != null)
+                        time.close();
+                }
+                catch (Throwable t)
+                {
+                    t.printStackTrace();
+                    throw t;
+                }
+            }
+        }
+        catch (Throwable t)
+        {
+            if (t instanceof Error)
+                throw (Error) t;
+            throw new RuntimeException("Failed on seed " + Long.toHexString(seed), t);
+        }
+    }
+
+    private static String normaliseRecordingIn(String input)
+    {
+        return STRIP_NOW_TRACES.matcher(
+            NORMALISE_THREAD_RECORDING_IN.matcher(
+                NORMALISE_LAMBDA.matcher(input).replaceAll("")
+            ).replaceAll("$1$2]")
+        ).replaceAll("");
+    }
+
+    private static String normaliseRecordingInWithoutWaitOrWakeSites(String input, boolean stripWaitSites, boolean stripWakeSites)
+    {
+        return STRIP_TRACES.matcher(
+            NORMALISE_THREAD_RECORDING_IN.matcher(
+                NORMALISE_LAMBDA.matcher(input).replaceAll("")
+            ).replaceAll("$1$2]")
+        ).replaceAll(stripWaitSites && stripWakeSites ? "$1[]" : stripWaitSites ? "$1[$9]" : "$1[$3]");
+    }
+
+    private static String normaliseReconcileWithRecording(String input)
+    {
+        return STRIP_NOW_TRACES.matcher(
+            NORMALISE_THREAD.matcher(
+                NORMALISE_LAMBDA.matcher(input).replaceAll("")
+            ).replaceAll("$1$2]")
+        ).replaceAll("");
+    }
+
+    static void failWithHeapDump(int line, Object input, Object output)
+    {
+        logger.error("Line {}", line);
+        logger.error("Input {}", input);
+        logger.error("Output {}", output);
+        throw failWithOOM();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/debug/Record.java b/test/simulator/main/org/apache/cassandra/simulator/debug/Record.java
new file mode 100644
index 0000000..7ca7a20
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/debug/Record.java
@@ -0,0 +1,527 @@
+/*
+ * 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.simulator.debug;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.nio.channels.Channels;
+import java.util.Arrays;
+import java.util.IdentityHashMap;
+import java.util.LinkedHashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
+import java.util.function.Supplier;
+import java.util.regex.Pattern;
+import java.util.stream.Stream;
+import java.util.zip.GZIPOutputStream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
+import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.simulator.ClusterSimulation;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.SimulationRunner.RecordOption;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.concurrent.Threads;
+
+import static org.apache.cassandra.io.util.File.WriteMode.OVERWRITE;
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.NONE;
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.VALUE;
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.WITH_CALLSITES;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+
+public class Record
+{
+    private static final Logger logger = LoggerFactory.getLogger(Record.class);
+    private static final Pattern NORMALISE_THREAD_RECORDING_OUT = Pattern.compile("(Thread\\[[^]]+:[0-9]+),[0-9](,node[0-9]+)_[0-9]+]");
+    private static final Pattern NORMALISE_LAMBDA = Pattern.compile("((\\$\\$Lambda\\$[0-9]+/[0-9]+)?(@[0-9a-f]+)?)");
+
+    public static void record(String saveToDir, long seed, RecordOption withRng, RecordOption withTime, ClusterSimulation.Builder<?> builder)
+    {
+        File eventFile = new File(new File(saveToDir), Long.toHexString(seed) + ".gz");
+        File rngFile = new File(new File(saveToDir), Long.toHexString(seed) + ".rng.gz");
+        File timeFile = new File(new File(saveToDir), Long.toHexString(seed) + ".time.gz");
+
+        {
+            Set<String> modifiers = new LinkedHashSet<>();
+            if (withRng == WITH_CALLSITES)
+                modifiers.add("rngCallSites");
+            else if (withRng == VALUE)
+                modifiers.add("rng");
+            if (withTime == WITH_CALLSITES)
+                modifiers.add("timeCallSites");
+            else if (withTime == VALUE)
+                modifiers.add("time");
+            if (builder.capture().waitSites)
+                modifiers.add("WaitSites");
+            if (builder.capture().wakeSites)
+                modifiers.add("WakeSites");
+            logger.error("Seed 0x{} ({}) (With: {})", Long.toHexString(seed), eventFile, modifiers);
+        }
+
+        try (PrintWriter eventOut = new PrintWriter(new GZIPOutputStream(eventFile.newOutputStream(OVERWRITE), 1 << 16));
+             DataOutputStreamPlus rngOut = new BufferedDataOutputStreamPlus(Channels.newChannel(withRng != NONE ? new GZIPOutputStream(rngFile.newOutputStream(OVERWRITE), 1 << 16) : new ByteArrayOutputStream(0)));
+             DataOutputStreamPlus timeOut = new BufferedDataOutputStreamPlus(Channels.newChannel(withTime != NONE ? new GZIPOutputStream(timeFile.newOutputStream(OVERWRITE), 1 << 16) : new ByteArrayOutputStream(0))))
+        {
+            eventOut.println("modifiers:"
+                             + (withRng == VALUE ? "rng," : "") + (withRng == WITH_CALLSITES ? "rngCallSites," : "")
+                             + (withTime == VALUE ? "time," : "") + (withTime == WITH_CALLSITES ? "timeCallSites," : "")
+                             + (builder.capture().waitSites ? "waitSites," : "") + (builder.capture().wakeSites ? "wakeSites," : ""));
+
+            TimeRecorder time;
+            RandomSourceRecorder random;
+            if (withRng != NONE)
+            {
+                builder.random(random = new RandomSourceRecorder(rngOut, new RandomSource.Default(), withRng));
+                builder.onThreadLocalRandomCheck(random::onDeterminismCheck);
+            }
+            else random = null;
+
+            if (withTime != NONE) builder.timeListener(time = new TimeRecorder(timeOut, withTime));
+            else time = null;
+
+            // periodic forced flush to ensure state is on disk after some kind of stall
+            Thread flusher = new Thread(() -> {
+                try
+                {
+                    while (true)
+                    {
+                        Thread.sleep(1000);
+                        eventOut.flush();
+                        if (random != null)
+                        {
+                            synchronized (random)
+                            {
+                                rngOut.flush();
+                            }
+                        }
+                        if (time != null)
+                        {
+                            synchronized (time)
+                            {
+                                timeOut.flush();
+                            }
+                        }
+                    }
+                }
+                catch (IOException e)
+                {
+                    e.printStackTrace();
+                }
+                catch (InterruptedException ignore)
+                {
+                }
+                finally
+                {
+                    eventOut.flush();
+                    try
+                    {
+                        if (random != null)
+                        {
+                            synchronized (random)
+                            {
+                                rngOut.flush();
+                            }
+                        }
+                    }
+                    catch (IOException e)
+                    {
+                        e.printStackTrace();
+                    }
+                }
+            }, "Flush Recordings of " + seed);
+            flusher.setDaemon(true);
+            flusher.start();
+
+            try (ClusterSimulation<?> cluster = builder.create(seed))
+            {
+                try (CloseableIterator<?> iter = cluster.simulation.iterator();)
+                {
+                    while (iter.hasNext())
+                        eventOut.println(normaliseRecordingOut(iter.next().toString()));
+
+                    if (random != null)
+                        random.close();
+                }
+                finally
+                {
+                    eventOut.flush();
+                    rngOut.flush();
+                }
+            }
+            finally
+            {
+                flusher.interrupt();
+            }
+        }
+        catch (Throwable t)
+        {
+            t.printStackTrace();
+            throw new RuntimeException("Failed on seed " + Long.toHexString(seed), t);
+        }
+    }
+
+    private static String normaliseRecordingOut(String input)
+    {
+        return NORMALISE_THREAD_RECORDING_OUT.matcher(
+            NORMALISE_LAMBDA.matcher(input).replaceAll("")
+        ).replaceAll("$1$2]");
+    }
+
+    public static class TimeRecorder extends AbstractRecorder implements SimulatedTime.Listener, java.io.Closeable
+    {
+        boolean disabled;
+
+        public TimeRecorder(DataOutputStreamPlus out, RecordOption option)
+        {
+            super(out, option);
+        }
+
+        @Override
+        public void close() throws IOException
+        {
+            disabled = true;
+            out.close();
+        }
+
+        @Override
+        public synchronized void accept(String kind, long value)
+        {
+            if (disabled)
+                return;
+
+            try
+            {
+                writeInterned(kind);
+                out.writeUnsignedVInt(value);
+                writeThread();
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+        }
+    }
+
+    // TODO: merge with TimeRecorder to produce one stream, use to support live reconciliation between two JVMs over socket
+    public static class RandomSourceRecorder extends RandomSource.Abstract implements Supplier<RandomSource>, Closeable
+    {
+        private static final AtomicReferenceFieldUpdater<RandomSourceRecorder, Thread> lockedUpdater = AtomicReferenceFieldUpdater.newUpdater(Record.RandomSourceRecorder.class, Thread.class, "locked");
+
+        final DataOutputStreamPlus out;
+        final AbstractRecorder threads;
+        final RandomSource wrapped;
+        int count = 0;
+        volatile Thread locked;
+        volatile boolean disabled;
+
+        public RandomSourceRecorder(DataOutputStreamPlus out, RandomSource wrapped, RecordOption option)
+        {
+            this.out = out;
+            this.wrapped = wrapped;
+            this.threads = new AbstractRecorder(out, option);
+        }
+
+        private void enter()
+        {
+            while (!lockedUpdater.compareAndSet(this, null, Thread.currentThread()))
+            {
+                if (disabled)
+                    return;
+
+                Thread alt = locked;
+                if (alt == null)
+                    continue;
+                StackTraceElement[] altTrace = alt.getStackTrace();
+                if (Stream.of(altTrace).noneMatch(ste -> ste.getClassName().equals(RandomSourceRecorder.class.getName())))
+                    continue;
+
+                disabled = true;
+                logger.error("Race within RandomSourceReconciler between {} and {} - means we have a Simulator bug permitting two threads to run at once\n{}", Thread.currentThread(), alt, Threads.prettyPrint(altTrace, true, "\n"));
+                throw failWithOOM();
+            }
+        }
+
+        private void exit()
+        {
+            locked = null;
+        }
+
+        // determinism check is exclusively a ThreadLocalRandom issue at the moment
+        public void onDeterminismCheck(long value)
+        {
+            if (disabled)
+                return;
+
+            enter();
+            try
+            {
+                synchronized (this)
+                {
+                    out.writeByte(7);
+                    out.writeVInt(count++);
+                    out.writeLong(value);
+                    threads.writeThread();
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+        }
+
+        public int uniform(int min, int max)
+        {
+            int v = wrapped.uniform(min, max);
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                synchronized (this)
+                {
+                    out.writeByte(1);
+                    out.writeVInt(count++);
+                    threads.writeThread();
+                    out.writeVInt(min);
+                    out.writeVInt(max - min);
+                    out.writeVInt(v - min);
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public long uniform(long min, long max)
+        {
+            long v = wrapped.uniform(min, max);
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                synchronized (this)
+                {
+                    out.writeByte(2);
+                    out.writeVInt(count++);
+                    threads.writeThread();
+                    out.writeVInt(min);
+                    out.writeVInt(max - min);
+                    out.writeVInt(v - min);
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public float uniformFloat()
+        {
+            float v = wrapped.uniformFloat();
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                synchronized (this)
+                {
+                    out.writeByte(3);
+                    out.writeVInt(count++);
+                    threads.writeThread();
+                    out.writeFloat(v);
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public double uniformDouble()
+        {
+            double v = wrapped.uniformDouble();
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                synchronized (this)
+                {
+                    out.writeByte(6);
+                    out.writeVInt(count++);
+                    threads.writeThread();
+                    out.writeDouble(v);
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public void reset(long seed)
+        {
+            wrapped.reset(seed);
+            if (disabled)
+                return;
+
+            enter();
+            try
+            {
+                synchronized (this)
+                {
+                    out.writeByte(4);
+                    out.writeVInt(count++);
+                    out.writeVInt(seed);
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+        }
+
+        public long reset()
+        {
+            long v = wrapped.reset();
+            if (disabled)
+                return v;
+
+            enter();
+            try
+            {
+                synchronized (this)
+                {
+                    out.writeByte(5);
+                    out.writeVInt(count++);
+                    out.writeFloat(v);
+                }
+            }
+            catch (IOException e)
+            {
+                throw new RuntimeException(e);
+            }
+            finally
+            {
+                exit();
+            }
+            return v;
+        }
+
+        public RandomSource get()
+        {
+            if (count++ > 0)
+                throw failWithOOM();
+            return this;
+        }
+
+        @Override
+        public void close()
+        {
+            disabled = true;
+        }
+    }
+
+    public static class AbstractRecorder
+    {
+        final DataOutputStreamPlus out;
+        final boolean withCallSites;
+        final Map<Object, Integer> objects = new IdentityHashMap<>();
+
+        public AbstractRecorder(DataOutputStreamPlus out, RecordOption option)
+        {
+            this.out = out;
+            this.withCallSites = option == WITH_CALLSITES;
+        }
+
+        public void writeThread() throws IOException
+        {
+            Thread thread = Thread.currentThread();
+            writeInterned(thread);
+            if (withCallSites)
+            {
+                StackTraceElement[] ste = thread.getStackTrace();
+                String trace = Arrays.stream(ste, 3, ste.length)
+                                     .filter(st ->    !st.getClassName().equals("org.apache.cassandra.simulator.debug.Record")
+                                                   && !st.getClassName().equals("org.apache.cassandra.simulator.SimulationRunner$Record")
+                                                   && !st.getClassName().equals("sun.reflect.NativeMethodAccessorImpl") // depends on async compile thread
+                                                   && !st.getClassName().startsWith("sun.reflect.GeneratedMethodAccessor")) // depends on async compile thread
+                                     .collect(new Threads.StackTraceCombiner(true, "", "\n", ""));
+                out.writeUTF(trace);
+            }
+        }
+
+        public void writeInterned(Object o) throws IOException
+        {
+            Integer id = objects.get(o);
+            if (id != null)
+            {
+                out.writeVInt(id);
+            }
+            else
+            {
+                out.writeVInt(objects.size());
+                out.writeUTF(o.toString());
+                objects.put(o, objects.size());
+            }
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/debug/SelfReconcile.java b/test/simulator/main/org/apache/cassandra/simulator/debug/SelfReconcile.java
new file mode 100644
index 0000000..be8c05a
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/debug/SelfReconcile.java
@@ -0,0 +1,304 @@
+/*
+ * 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.simulator.debug;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Future;
+import java.util.function.Supplier;
+import java.util.regex.Pattern;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IMessage;
+import org.apache.cassandra.simulator.ClusterSimulation;
+import org.apache.cassandra.simulator.OrderOn;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.SimulationRunner.RecordOption;
+import org.apache.cassandra.simulator.systems.InterceptedExecution;
+import org.apache.cassandra.simulator.systems.InterceptedWait;
+import org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites;
+import org.apache.cassandra.simulator.systems.InterceptibleThread;
+import org.apache.cassandra.simulator.systems.InterceptorOfConsequences;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+import org.apache.cassandra.utils.memory.HeapPool;
+
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.NONE;
+import static org.apache.cassandra.simulator.SimulationRunner.RecordOption.WITH_CALLSITES;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.simulator.debug.Reconcile.NORMALISE_LAMBDA;
+import static org.apache.cassandra.simulator.debug.Reconcile.NORMALISE_THREAD;
+
+/**
+ * Simulator runs should be deterministic, so run two in parallel and see if they produce the same event stream
+ */
+public class SelfReconcile
+{
+    private static final Logger logger = LoggerFactory.getLogger(SelfReconcile.class);
+    static final Pattern NORMALISE_RECONCILE_THREAD = Pattern.compile("(Thread\\[Reconcile:)[0-9]+,[0-9],Reconcile(_[0-9]+)?]");
+
+    static class InterceptReconciler implements InterceptorOfConsequences, Supplier<RandomSource>, SimulatedTime.Listener
+    {
+        final List<Object> events = new ArrayList<>();
+        final boolean withRngCallsites;
+        int counter = 0;
+        boolean verifyUninterceptedRng;
+        boolean closed;
+
+        InterceptReconciler(boolean withRngCallsites)
+        {
+            this.withRngCallsites = withRngCallsites;
+        }
+
+        @Override
+        public void beforeInvocation(InterceptibleThread realThread)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public synchronized void interceptMessage(IInvokableInstance from, IInvokableInstance to, IMessage message)
+        {
+            verify("Send " + message.verb() + " from " + from.config().num() + " to " + to.config().num());
+        }
+
+        @Override
+        public synchronized void interceptWakeup(InterceptedWait wakeup, InterceptedWait.Trigger trigger, InterceptorOfConsequences waitWasInterceptedBy)
+        {
+            verify(normalise("Wakeup " + wakeup.waiting() + wakeup));
+        }
+
+        @Override
+        public synchronized void interceptExecution(InterceptedExecution invoke, OrderOn orderOn)
+        {
+            verify("Execute " + normalise(invoke.toString()) + " on " + orderOn);
+        }
+
+        @Override
+        public synchronized void interceptWait(InterceptedWait wakeupWith)
+        {
+            verify(normalise("Wait " + wakeupWith.waiting() + wakeupWith));
+        }
+
+        @Override
+        public void interceptTermination(boolean isThreadTermination)
+        {
+            // Cannot verify this, as thread may terminate after triggering follow-on events
+        }
+
+        void interceptAllocation(long amount, String table)
+        {
+            verify("Allocate " + amount + " for " + table + " on " + Thread.currentThread());
+        }
+
+        synchronized void verify(Object event)
+        {
+            if (closed)
+                return;
+
+            events.add(event);
+
+            if (events.size() == 1)
+            {
+                int cur = counter;
+                while (cur == counter)
+                {
+                    try
+                    {
+                        wait();
+                    }
+                    catch (InterruptedException e)
+                    {
+                        throw new UncheckedInterruptedException(e);
+                    }
+                }
+            }
+            else
+            {
+                if (events.size() != 2)
+                    throw new IllegalStateException();
+
+                try
+                {
+                    Object event0 = events.get(0);
+                    Object event1 = events.get(1);
+                    if (event0 instanceof Pair)
+                        event0 = ((Pair<?, ?>) event0).left;
+                    if (event1 instanceof Pair)
+                        event1 = ((Pair<?, ?>) event1).left;
+                    String e0 = normalise(event0.toString());
+                    String e1 = normalise(event1.toString());
+                    if (!e0.equals(e1))
+                        throw failWithOOM();
+                }
+                finally
+                {
+                    events.clear();
+                    ++counter;
+                    notifyAll();
+                }
+            }
+        }
+
+        public RandomSource get()
+        {
+            return new RandomSource.Abstract()
+            {
+                final RandomSource wrapped = new Default();
+
+                @Override
+                public float uniformFloat()
+                {
+                    return verify("uniformFloat:", wrapped.uniformFloat());
+                }
+
+                @Override
+                public double uniformDouble()
+                {
+                    return verify("uniformDouble:", wrapped.uniformDouble());
+                }
+
+                @Override
+                public void reset(long seed)
+                {
+                    wrapped.reset(seed);
+                    verify("reset(" + seed + ')', "");
+                }
+
+                @Override
+                public long reset()
+                {
+                    return verify("reset:", wrapped.reset());
+                }
+
+                @Override
+                public int uniform(int min, int max)
+                {
+                    return verify("uniform(" + min + ',' + max + "):", wrapped.uniform(min, max));
+                }
+
+                @Override
+                public long uniform(long min, long max)
+                {
+                    return verify("uniform(" + min + ',' + max + "):", wrapped.uniform(min, max));
+                }
+
+                private <T> T verify(String event, T result)
+                {
+                    Thread thread = Thread.currentThread();
+                    if (!(thread instanceof InterceptibleThread) || !((InterceptibleThread) thread).isIntercepting())
+                    {
+                        if (!verifyUninterceptedRng)
+                            return result;
+                    }
+                    InterceptReconciler.this.verify(withRngCallsites ? event + result + ' ' + Thread.currentThread() + ' '
+                                                                       + new CaptureSites(Thread.currentThread())
+                                                                         .toString(ste -> !ste.getClassName().startsWith(SelfReconcile.class.getName()))
+                                                                     : event + result);
+                    return result;
+                }
+            };
+        }
+
+        void close()
+        {
+            closed = true;
+        }
+
+        @Override
+        public void accept(String kind, long value)
+        {
+            verify(Thread.currentThread() + ":" + kind + ':' + value);
+        }
+    }
+
+    public static void reconcileWithSelf(long seed, RecordOption withRng, RecordOption withTime, boolean withAllocations, ClusterSimulation.Builder<?> builder)
+    {
+        logger.error("Seed 0x{}", Long.toHexString(seed));
+
+        InterceptReconciler reconciler = new InterceptReconciler(withRng == WITH_CALLSITES);
+        if (withRng != NONE) builder.random(reconciler);
+        if (withTime != NONE) builder.timeListener(reconciler);
+
+        HeapPool.Logged.Listener memoryListener = withAllocations ? reconciler::interceptAllocation : null;
+        ExecutorService executor = ExecutorFactory.Global.executorFactory().pooled("Reconcile", 2);
+
+        try (ClusterSimulation<?> cluster1 = builder.unique(0).memoryListener(memoryListener).create(seed);
+             ClusterSimulation<?> cluster2 = builder.unique(1).memoryListener(memoryListener).create(seed))
+        {
+            try
+            {
+
+                InterceptibleThread.setDebugInterceptor(reconciler);
+                reconciler.verifyUninterceptedRng = true;
+
+                Future<?> f1 = executor.submit(() -> {
+                    try (CloseableIterator<?> iter = cluster1.simulation.iterator())
+                    {
+                        while (iter.hasNext())
+                        {
+                            Object o = iter.next();
+                            reconciler.verify(Pair.create(normalise(o.toString()), o));
+                        }
+                    }
+                    reconciler.verify("done");
+                });
+                Future<?> f2 = executor.submit(() -> {
+                    try (CloseableIterator<?> iter = cluster2.simulation.iterator())
+                    {
+                        while (iter.hasNext())
+                        {
+                            Object o = iter.next();
+                            reconciler.verify(Pair.create(normalise(o.toString()), o));
+                        }
+                    }
+                    reconciler.verify("done");
+                });
+                f1.get();
+                f2.get();
+            }
+            finally
+            {
+                reconciler.close();
+            }
+        }
+        catch (Throwable t)
+        {
+            t.printStackTrace();
+            throw new RuntimeException("Failed on seed " + Long.toHexString(seed), t);
+        }
+    }
+
+    private static String normalise(String input)
+    {
+        return NORMALISE_RECONCILE_THREAD.matcher(
+            NORMALISE_THREAD.matcher(
+                NORMALISE_LAMBDA.matcher(input).replaceAll("")
+            ).replaceAll("$1$2]")
+        ).replaceAll("$1]");
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/debug/SelfReconcilingRandom.java b/test/simulator/main/org/apache/cassandra/simulator/debug/SelfReconcilingRandom.java
new file mode 100644
index 0000000..444ec44
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/debug/SelfReconcilingRandom.java
@@ -0,0 +1,136 @@
+/*
+ * 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.simulator.debug;
+
+import java.util.function.Supplier;
+
+import org.apache.cassandra.simulator.RandomSource;
+import org.hsqldb.lib.IntKeyLongValueHashMap;
+
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+
+public class SelfReconcilingRandom implements Supplier<RandomSource>
+{
+    static class Map extends IntKeyLongValueHashMap
+    {
+        public boolean put(int i, long v)
+        {
+            int size = this.size();
+            super.addOrRemove((long)i, (long)v, (Object)null, (Object)null, false);
+            return size != this.size();
+        }
+    }
+    final Map map = new Map();
+    long[] tmp = new long[1];
+    boolean isNextPrimary = true;
+
+    static abstract class AbstractVerifying extends RandomSource.Abstract
+    {
+        final RandomSource wrapped;
+        int cur = 0;
+
+        protected AbstractVerifying(RandomSource wrapped)
+        {
+            this.wrapped = wrapped;
+        }
+
+        abstract void next(long verify);
+
+        public int uniform(int min, int max)
+        {
+            int v = wrapped.uniform(min, max);
+            next(v);
+            return v;
+        }
+
+        public long uniform(long min, long max)
+        {
+            long v = wrapped.uniform(min, max);
+            next(v);
+            return v;
+        }
+
+        public float uniformFloat()
+        {
+            float v = wrapped.uniformFloat();
+            next(Float.floatToIntBits(v));
+            return v;
+        }
+
+        public double uniformDouble()
+        {
+            double v = wrapped.uniformDouble();
+            next(Double.doubleToLongBits(v));
+            return v;
+        }
+    }
+
+    public RandomSource get()
+    {
+        if (isNextPrimary)
+        {
+            isNextPrimary = false;
+            return new AbstractVerifying(new RandomSource.Default())
+            {
+                void next(long verify)
+                {
+                    map.put(++cur, verify);
+                }
+
+                public void reset(long seed)
+                {
+                    map.clear();
+                    cur = 0;
+                    wrapped.reset(seed);
+                }
+
+                public long reset()
+                {
+                    map.clear();
+                    cur = 0;
+                    return wrapped.reset();
+                }
+            };
+        }
+
+        return new AbstractVerifying(new RandomSource.Default())
+        {
+            void next(long v)
+            {
+                if (!map.get(++cur, tmp))
+                    throw failWithOOM();
+                map.remove(cur);
+                if (tmp[0] != v)
+                    throw failWithOOM();
+            }
+
+            public void reset(long seed)
+            {
+                cur = 0;
+                wrapped.reset(seed);
+            }
+
+            public long reset()
+            {
+                cur = 0;
+                return wrapped.reset();
+            }
+        };
+    }
+}
\ No newline at end of file
diff --git a/test/simulator/main/org/apache/cassandra/simulator/package-info.java b/test/simulator/main/org/apache/cassandra/simulator/package-info.java
new file mode 100644
index 0000000..896ce4e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/package-info.java
@@ -0,0 +1,86 @@
+/*
+ * 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.
+ */
+
+/**
+ * The Simulator is a facility for deterministic pseudorandom execution of anything
+ * from a snippet of code to an entire Cassandra cluster. A simulation execution
+ * consists of an {@link org.apache.cassandra.simulator.ActionPlan} containing various
+ * {@link org.apache.cassandra.simulator.Action} to simulate. Each {@code Action} represents
+ * some discrete unit of simulation and its consequences - which are themselves {@code Action}s.
+ * A simulation completes once all transitive consequences of the initial actions have completed.
+ * The execution order is determined by an {@link org.apache.cassandra.simulator.ActionSchedule}
+ * and its {@link org.apache.cassandra.simulator.RunnableActionScheduler} and
+ * {@link org.apache.cassandra.simulator.FutureActionScheduler}.
+ *
+ * An {@code Action} may be simple, representing some simulation book-keeping or setup, but most
+ * commonly derives from {@link org.apache.cassandra.simulator.systems.SimulatedAction}.
+ * These simulated actions represent some execution context on an {@link org.apache.cassandra.simulator.systems.InterceptibleThread},
+ * such as a task execution on an executor or a new thread. An {@code Action} is typically a one-shot
+ * concept, but these threaded actions simultaneously represent any initial synchronous step taken
+ * by a threaded execution context and the continuation of that state - through the creation of new
+ * child and continuation {@code Action} that resume execution as the schedule demands. Note that such
+ * a threaded action may have no consequences while still being in progress, e.g. when the thread enters
+ * an unbounded wait condition, in which case it expects to be awoken by some other threaded action's
+ * interaction with it.
+ *
+ * {@code Action} have various causality mechanisms to control their behaviour, in the form of {@link org.apache.cassandra.simulator.Action.Modifier}
+ * options that may be applied to themselves, transitively to all of their descendants, or to specific verbs that are
+ * consequences of a {@code SimulatedAction}. Also in the form of {@link org.apache.cassandra.simulator.OrderOn}
+ * constraints that may force actions to occur in strictly sequential order, or simply to occur at some maximum rate.
+ * This latter facility supports both the simulation of executor services and constraints for a correct simulation e.g.
+ * when some action's children must occur in sequential order to correctly simulate some system operation.
+ *
+ * Simulation is achieved through various simulated systems ({@link org.apache.cassandra.simulator.systems})
+ * and byte weaving ({@link org.apache.cassandra.simulator.asm}) of implementation classes, and chaos is introduced
+ * via {@link org.apache.cassandra.simulator.cluster.KeyspaceActions} and also {@link org.apache.cassandra.utils.Nemesis}
+ * points and on monitor entry and exit. Collectively these systems take control of: monitors, lock support, blocking
+ * data structures, threads and executors, random number generation, time, paxos ballots, the network and failure detection.
+ *
+ * The first major simulation introduced was {@link org.apache.cassandra.simulator.paxos.PaxosSimulationRunner} which
+ * may be invoked on the command line to simulate a cluster and some proportion of LWT read/write operations.
+ *
+ * For simulator simulation to operate correctly, be sure to run {@code ant simulator-jars} and to include the
+ * following JVM parameters:
+ *    -javaagent:/path/to/project.dir/build/test/lib/simulator-asm.jar
+ *    -Xbootclasspath/a:/path/to/project.dir/build/test/lib/simulator-bootstrap.jar
+ *    -Dlogback.configurationFile=file:///path/to/project.dir/test/conf/logback-simulator.xml
+ *
+ * For a reproducible simulation, make sure to use the same JVM and JDK for all runs, and to supply the following
+ * JVM parameters:
+ *    -XX:ActiveProcessorCount=???
+ *    -Xmx???
+ *    -XX:-BackgroundCompilation
+ *    -XX:CICompilerCount=1
+ *
+ * For performance reasons the following parameters are recommended:
+ *    -XX:Tier4CompileThreshold=1000
+ *    -XX:-TieredCompilation
+ *    -XX:ReservedCodeCacheSize=256M
+ *
+ * When debugging, the following parameters are recommended:
+ *    -Dcassandra.test.simulator.livenesscheck=false
+ *    -Dcassandra.test.simulator.debug=true
+ *
+ * Note also that when debugging the execution of arbitrary methods may modify the program output if these methods
+ * invoke any simulated methods, notably if the method is synchronised or otherwise uses a monitor, or invokes
+ * {@code System.identityHashCode} or a non-overidden {@code Object.hashCode()}, or many other scenarios.
+ * To support debugging, this behaviour is switched off as far as possible when evaluating any {@code toString()}
+ * method, but it is worth being prepared for the possibility that your use of the debugger has the potential to
+ * perturb program execution.
+ */
+package org.apache.cassandra.simulator;
\ No newline at end of file
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/Ballots.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/Ballots.java
new file mode 100644
index 0000000..08e1b2e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/Ballots.java
@@ -0,0 +1,272 @@
+/*
+ * 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.simulator.paxos;
+
+import java.util.Iterator;
+import java.util.List;
+
+import com.google.common.collect.ImmutableList;
+
+import org.apache.cassandra.db.ClusteringComparator;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.ReadExecutionController;
+import org.apache.cassandra.db.SinglePartitionReadCommand;
+import org.apache.cassandra.db.Slice;
+import org.apache.cassandra.db.Slices;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.Unfiltered;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.simulator.systems.NonInterceptible;
+import org.apache.cassandra.simulator.systems.NonInterceptible.Permit;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Shared;
+
+import static java.lang.Long.max;
+import static java.util.Arrays.stream;
+import static org.apache.cassandra.db.SystemKeyspace.loadPaxosState;
+import static org.apache.cassandra.service.paxos.Commit.latest;
+import static org.apache.cassandra.service.paxos.PaxosState.unsafeGetIfPresent;
+import static org.apache.cassandra.simulator.systems.NonInterceptible.Permit.OPTIONAL;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+public class Ballots
+{
+    private static final ColumnMetadata PROMISE = paxosUUIDColumn("in_progress_ballot");
+    private static final ColumnMetadata PROPOSAL = paxosUUIDColumn("proposal_ballot");
+    private static final ColumnMetadata COMMIT = paxosUUIDColumn("most_recent_commit_at");
+
+    @Shared(scope = SIMULATION)
+    public static class LatestBallots
+    {
+        public final long promise;
+        public final long accept; // the ballot actually accepted
+        public final long acceptOf; // the original ballot (i.e. if a reproposal accept != acceptOf)
+        public final long commit;
+        public final long persisted;
+
+        public LatestBallots(long promise, long accept, long acceptOf, long commit, long persisted)
+        {
+            this.promise = promise;
+            this.accept = accept;
+            this.acceptOf = acceptOf;
+            this.commit = commit;
+            this.persisted = persisted;
+        }
+
+        public long any()
+        {
+            return max(max(max(promise, accept), commit), persisted);
+        }
+
+        public long permanent()
+        {
+            return max(commit, persisted);
+        }
+
+        public String toString()
+        {
+            return "[" + promise + ',' + accept + ',' + commit + ',' + persisted + ']';
+        }
+    }
+
+    public static LatestBallots read(Permit permit, DecoratedKey key, TableMetadata metadata, int nowInSec, boolean includeEmptyProposals)
+    {
+        return NonInterceptible.apply(permit, () -> {
+            PaxosState.Snapshot state = unsafeGetIfPresent(key, metadata);
+            PaxosState.Snapshot persisted = loadPaxosState(key, metadata, nowInSec);
+            TimeUUID promised = latest(persisted.promised, state == null ? null : state.promised);
+            Commit.Accepted accepted = latest(persisted.accepted, state == null ? null : state.accepted);
+            Commit.Committed committed = latest(persisted.committed, state == null ? null : state.committed);
+            long baseTable = latestBallotFromBaseTable(key, metadata);
+            return new LatestBallots(
+                promised.unixMicros(),
+                accepted == null || accepted.update.isEmpty() ? 0L : accepted.ballot.unixMicros(),
+                accepted == null || accepted.update.isEmpty() ? 0L : accepted.update.stats().minTimestamp,
+                latestBallot(committed.update.iterator()),
+                baseTable
+            );
+        });
+    }
+
+    static LatestBallots[][] read(Permit permit, Cluster cluster, String keyspace, String table, int[] primaryKeys, int[][] replicasForKeys, boolean includeEmptyProposals)
+    {
+        return NonInterceptible.apply(permit, () -> {
+            LatestBallots[][] result = new LatestBallots[primaryKeys.length][];
+            for (int i = 0 ; i < primaryKeys.length ; ++i)
+            {
+                int primaryKey = primaryKeys[i];
+                result[i] = stream(replicasForKeys[i])
+                            .mapToObj(cluster::get)
+                            .map(node -> node.unsafeApplyOnThisThread((p, ks, tbl, pk, ie) -> {
+                                TableMetadata metadata = Keyspace.open(ks).getColumnFamilyStore(tbl).metadata.get();
+                                DecoratedKey key = metadata.partitioner.decorateKey(Int32Type.instance.decompose(pk));
+                                return read(p, key, metadata, FBUtilities.nowInSeconds(), ie);
+                            }, permit, keyspace, table, primaryKey, includeEmptyProposals))
+                            .toArray(LatestBallots[]::new);
+            }
+            return result;
+        });
+    }
+
+    public static String paxosDebugInfo(DecoratedKey key, TableMetadata metadata, int nowInSec)
+    {
+        return NonInterceptible.apply(OPTIONAL, () -> {
+            PaxosState.Snapshot state = unsafeGetIfPresent(key, metadata);
+            PaxosState.Snapshot persisted = loadPaxosState(key, metadata, nowInSec);
+            long[] memtable = latestBallotsFromPaxosMemtable(key, metadata);
+            PaxosState.Snapshot cache = state == null ? persisted : state;
+            long baseTable = latestBallotFromBaseTable(key, metadata);
+            long baseMemtable = latestBallotFromBaseMemtable(key, metadata);
+            return debugBallot(cache.promised, memtable[0], persisted.promised) + ", "
+                   + debugBallot(cache.accepted, memtable[1], persisted.accepted) + ", "
+                   + debugBallot(cache.committed, memtable[2], persisted.committed) + ", "
+                   + debugBallot(baseMemtable, 0L, baseTable);
+        });
+    }
+
+    private static ColumnMetadata paxosUUIDColumn(String name)
+    {
+        return ColumnMetadata.regularColumn(SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.PAXOS, name, TimeUUIDType.instance);
+    }
+
+    /**
+     * Load the current paxos state for the table and key
+     */
+    private static long[] latestBallotsFromPaxosMemtable(DecoratedKey key, TableMetadata metadata)
+    {
+        ColumnFamilyStore paxos = Keyspace.open("system").getColumnFamilyStore("paxos");
+        long[] result = new long[3];
+        List<Memtable> memtables = ImmutableList.copyOf(paxos.getTracker().getView().getAllMemtables());
+        for (Memtable memtable : memtables)
+        {
+            Row row = getRow(key, metadata, paxos, memtable);
+            if (row == null)
+                continue;
+
+            Cell promise = row.getCell(PROMISE);
+            if (promise != null && promise.value() != null)
+                result[0] = promise.timestamp();
+            Cell proposal = row.getCell(PROPOSAL);
+            if (proposal != null && proposal.value() != null)
+                result[1] = proposal.timestamp();
+            Cell commit = row.getCell(COMMIT);
+            if (commit != null && commit.value() != null)
+                result[2] = commit.timestamp();
+        }
+        return result;
+    }
+
+    private static Row getRow(DecoratedKey key, TableMetadata metadata, ColumnFamilyStore paxos, Memtable memtable)
+    {
+        final ClusteringComparator comparator = paxos.metadata.get().comparator;
+        UnfilteredRowIterator iter = memtable.rowIterator(key, Slices.with(comparator, Slice.make(comparator.make(metadata.id))), ColumnFilter.NONE, false, SSTableReadsListener.NOOP_LISTENER);
+        if (iter == null || !iter.hasNext())
+            return null;
+        return (Row) iter.next();
+    }
+
+    public static long latestBallotFromBaseTable(DecoratedKey key, TableMetadata metadata)
+    {
+        SinglePartitionReadCommand cmd = SinglePartitionReadCommand.create(metadata, 0, key, Slice.ALL);
+        try (ReadExecutionController controller = cmd.executionController(); UnfilteredPartitionIterator partitions = cmd.executeLocally(controller))
+        {
+            if (!partitions.hasNext())
+                return 0L;
+
+            try (UnfilteredRowIterator rows = partitions.next())
+            {
+                return latestBallot(rows);
+            }
+        }
+    }
+
+    private static long latestBallotFromBaseMemtable(DecoratedKey key, TableMetadata metadata)
+    {
+        ColumnFamilyStore table = Keyspace.openAndGetStore(metadata);
+        long timestamp = 0;
+        List<Memtable> memtables = ImmutableList.copyOf(table.getTracker().getView().getAllMemtables());
+        for (Memtable memtable : memtables)
+        {
+            try (UnfilteredRowIterator partition = memtable.rowIterator(key))
+            {
+                if (partition == null)
+                    continue;
+
+                timestamp = max(timestamp, latestBallot(partition));
+            }
+        }
+        return timestamp;
+    }
+
+    private static long latestBallot(Iterator<? extends Unfiltered> partition)
+    {
+        long timestamp = 0L;
+        while (partition.hasNext())
+        {
+            Unfiltered unfiltered = partition.next();
+            if (!unfiltered.isRow())
+                continue;
+            timestamp = ((Row) unfiltered).accumulate((cd, v) -> max(v, cd.maxTimestamp()), timestamp);
+        }
+        return timestamp;
+    }
+
+    private static String debugBallot(Commit cache, long memtable, Commit persisted)
+    {
+        return debugBallot(cache == null ? null : cache.ballot, memtable, persisted == null ? null : persisted.ballot);
+    }
+
+    private static String debugBallot(TimeUUID cache, long memtable, TimeUUID persisted)
+    {
+        return debugBallot(timestamp(cache), memtable, timestamp(persisted));
+    }
+
+    private static String debugBallot(long cache, long memtable, long persisted)
+    {
+        return debugBallotVsMemtable(cache, memtable)
+               + (cache == persisted ? "" : '(' + debugBallotVsMemtable(persisted, memtable) + ')');
+    }
+
+    private static String debugBallotVsMemtable(long value, long memtable)
+    {
+        return value + (memtable == value && memtable != 0 ? "*" : "");
+    }
+
+    private static long timestamp(TimeUUID a)
+    {
+        return a == null ? 0L : a.unixMicros();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryChecker.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryChecker.java
new file mode 100644
index 0000000..d1e0771
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryChecker.java
@@ -0,0 +1,350 @@
+/*
+ * 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.simulator.paxos;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Queue;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import static java.lang.Boolean.FALSE;
+import static java.lang.Boolean.TRUE;
+import static java.lang.Integer.max;
+import static org.apache.cassandra.simulator.paxos.HistoryChecker.Witness.Type.READ;
+import static org.apache.cassandra.simulator.paxos.HistoryChecker.Witness.Type.SELF;
+import static org.apache.cassandra.simulator.paxos.HistoryChecker.Witness.Type.UPDATE_SUCCESS;
+import static org.apache.cassandra.simulator.paxos.HistoryChecker.Witness.Type.UPDATE_UNKNOWN;
+
+/**
+ * Linearizability checker.
+ * <p>
+ * Since the partition maintains two total histories of successful operations, we simply verify that this history
+ * is consistent with what we view, that each copy of the history is consistent, and that there is no viewing
+ * histories backwards or forwards in time (i.e. that the time periods each history is witnessable for are disjoint)
+ */
+class HistoryChecker
+{
+    private static final Logger logger = LoggerFactory.getLogger(HistoryChecker.class);
+
+    static class Witness
+    {
+        enum Type { UPDATE_SUCCESS, UPDATE_UNKNOWN, READ, SELF }
+
+        final Witness.Type type;
+        final int eventId;
+        final int start;
+        final int end;
+
+        Witness(Witness.Type type, int eventId, int start, int end)
+        {
+            this.type = type;
+            this.eventId = eventId;
+            this.start = start;
+            this.end = end;
+        }
+
+        public String toString()
+        {
+            return String.format("((%3d,%3d),%s,%3d)", start, end, type, eventId);
+        }
+    }
+
+    static class VerboseWitness extends Witness
+    {
+        final int[] witnessSequence;
+
+        VerboseWitness(int eventId, int start, int end, int[] witnessSequence)
+        {
+            super(SELF, eventId, start, end);
+            this.witnessSequence = witnessSequence;
+        }
+
+        public String toString()
+        {
+            return String.format("((%3d,%3d), WITNESS, %s)", start, end, Arrays.toString(witnessSequence));
+        }
+    }
+
+    static class Event
+    {
+        final List<Witness> log = new ArrayList<>();
+
+        final int eventId;
+        int eventPosition = -1;
+        int[] witnessSequence;
+        int visibleBy = Integer.MAX_VALUE; // witnessed by at least this time
+        int visibleUntil = -1;             // witnessed until at least this time (i.e. witnessed nothing newer by then)
+        Boolean result;                    // unknown, success or (implied by not being witnessed) failure
+
+        Event(int eventId)
+        {
+            this.eventId = eventId;
+        }
+    }
+
+    final int primaryKey;
+    private final Queue<Event> unwitnessed = new ArrayDeque<>();
+    private Event[] byId = new Event[128];
+    private Event[] events = new Event[16];
+
+    HistoryChecker(int primaryKey)
+    {
+        this.primaryKey = primaryKey;
+    }
+
+    Event byId(int id)
+    {
+        if (byId.length <= id)
+            byId = Arrays.copyOf(byId, Math.max(id, byId.length * 2));
+        return byId[id];
+    }
+
+    Event setById(int id, Event event)
+    {
+        if (byId.length <= id)
+            byId = Arrays.copyOf(byId, Math.max(id, byId.length * 2));
+        return byId[id] = event;
+    }
+
+    void witness(Observation witness, int[] witnessSequence, int start, int end)
+    {
+        int eventPosition = witnessSequence.length;
+        int eventId = eventPosition == 0 ? -1 : witnessSequence[eventPosition - 1];
+        setById(witness.id, new Event(witness.id)).log.add(new VerboseWitness(witness.id, start, end, witnessSequence));
+        Event event = get(eventPosition, eventId);
+        recordWitness(event, witness, witnessSequence);
+        recordVisibleBy(event, end);
+        recordVisibleUntil(event, start);
+
+        // see if any of the unwitnessed events can be ruled out
+        if (!unwitnessed.isEmpty())
+        {
+            Iterator<Event> iter = unwitnessed.iterator();
+            while (iter.hasNext())
+            {
+                Event e = iter.next();
+                if (e.visibleBy < start)
+                {
+                    if (e.result == null)
+                    {
+                        // still accessible byId, so if we witness it later we will flag the inconsistency
+                        e.result = FALSE;
+                        iter.remove();
+                    }
+                    else if (e.result)
+                    {
+                        throw fail(primaryKey, "%d witnessed as absent by %d", e.eventId, witness.id);
+                    }
+                }
+            }
+        }
+    }
+
+    void applied(int eventId, int start, int end, boolean success)
+    {
+        Event event = byId(eventId);
+        if (event == null)
+        {
+            setById(eventId, event = new Event(eventId));
+            unwitnessed.add(event);
+        }
+
+        event.log.add(new Witness(success ? UPDATE_SUCCESS : UPDATE_UNKNOWN, eventId, start, end));
+        recordVisibleUntil(event, start);
+        recordVisibleBy(event, end); // even the result is unknown, the result must be visible to other operations by the time we terminate
+        if (success)
+        {
+            if (event.result == FALSE)
+                throw fail(primaryKey, "witnessed absence of %d but event returned success", eventId);
+            event.result = TRUE;
+        }
+    }
+
+    void recordWitness(Event event, Observation witness, int[] witnessSequence)
+    {
+        recordWitness(event, witness, witnessSequence.length, witnessSequence);
+    }
+
+    void recordWitness(Event event, Observation witness, int eventPosition, int[] witnessSequence)
+    {
+        while (true)
+        {
+            event.log.add(new Witness(READ, witness.id, witness.start, witness.end));
+            if (event.witnessSequence != null)
+            {
+                if (!Arrays.equals(event.witnessSequence, witnessSequence))
+                    throw fail(primaryKey, "%s previously witnessed %s", witnessSequence, event.witnessSequence);
+                return;
+            }
+
+            event.witnessSequence = witnessSequence;
+            event.eventPosition = eventPosition;
+
+            event = prev(event);
+            if (event == null)
+                break;
+
+            if (event.witnessSequence != null)
+            {
+                // verify it's a strict prefix
+                if (!equal(event.witnessSequence, witnessSequence, witnessSequence.length - 1))
+                    throw fail(primaryKey, "%s previously witnessed %s", witnessSequence, event.witnessSequence);
+                break;
+            }
+
+            // if our predecessor event hasn't been witnessed directly, witness it by this event, even if
+            // we say nothing about the times it may have been witnessed (besides those implied by the write event)
+            eventPosition -= 1;
+            witnessSequence = Arrays.copyOf(witnessSequence, eventPosition);
+        }
+    }
+
+    void recordVisibleBy(Event event, int visibleBy)
+    {
+        if (visibleBy < event.visibleBy)
+        {
+            event.visibleBy = visibleBy;
+            Event prev = prev(event);
+            if (prev != null && prev.visibleUntil >= visibleBy)
+                throw fail(primaryKey, "%s not witnessed >= %d, but also witnessed <= %d", event.witnessSequence, event.eventId, prev.visibleUntil, event.visibleBy);
+        }
+    }
+
+    void recordVisibleUntil(Event event, int visibleUntil)
+    {
+        if (visibleUntil > event.visibleUntil)
+        {
+            event.visibleUntil = visibleUntil;
+            Event next = next(event);
+            if (next != null && visibleUntil >= next.visibleBy)
+                throw fail(primaryKey, "%s %d not witnessed >= %d, but also witnessed <= %d", next.witnessSequence, next.eventId, event.visibleUntil, next.visibleBy);
+        }
+    }
+
+    /**
+     * Initialise the Event representing both eventPosition and eventId for witnessing
+     */
+    Event get(int eventPosition, int eventId)
+    {
+        if (eventPosition >= events.length)
+            events = Arrays.copyOf(events, max(eventPosition + 1, events.length * 2));
+
+        Event event = events[eventPosition];
+        if (event == null)
+        {
+            if (eventId < 0)
+            {
+                events[eventPosition] = event = new Event(eventId);
+            }
+            else
+            {
+                event = byId(eventId);
+                if (event != null)
+                {
+                    if (event.eventPosition >= 0)
+                        throw fail(primaryKey, "%d occurs at positions %d and %d", eventId, eventPosition, event.eventPosition);
+                    events[eventPosition] = event;
+                    unwitnessed.remove(event);
+                }
+                else
+                {
+                    setById(eventId, events[eventPosition] = event = new Event(eventId));
+                }
+            }
+        }
+        else
+        {
+            if (eventId != event.eventId)
+                throw fail(primaryKey, "(eventId, eventPosition): (%d, %d) != (%d, %d)", eventId, eventPosition, event.eventId, event.eventPosition);
+            else if (eventPosition != event.eventPosition)
+                throw fail(primaryKey, "%d occurs at positions %d and %d", eventId, eventPosition, event.eventPosition);
+        }
+        return event;
+    }
+
+    Event prev(Event event)
+    {
+        // we can reach here via recordOutcome without knowing our witnessSequence,
+        // in which case we won't know our predecessor event, so we cannot do anything useful
+        if (event.witnessSequence == null)
+            return null;
+
+        int eventPosition = event.eventPosition - 1;
+        if (eventPosition < 0)
+            return null;
+
+        // initialise the event, if necessary importing information from byId
+        return get(eventPosition, eventPosition == 0 ? -1 : event.witnessSequence[eventPosition - 1]);
+    }
+
+    Event next(Event event)
+    {
+        int eventPosition = event.eventPosition + 1;
+        if (eventPosition == 0 || eventPosition >= events.length)
+            return null;
+
+        // we cannot initialise the event meaningfully, so just return what is already known (if anything)
+        return events[eventPosition];
+    }
+
+    void print()
+    {
+        for (Event e : events)
+        {
+            if (e == null) break;
+            logger.error(String.format("%d: (%4d,%4d) %s %s", primaryKey, e.visibleBy, e.visibleUntil, Arrays.toString(e.witnessSequence), e.log));
+        }
+        for (Event e : byId)
+        {
+            if (e == null) continue;
+            logger.error("{}: {}", e.eventId, e.log);
+        }
+    }
+
+    static Error fail(int primaryKey, String message, Object ... params)
+    {
+        for (int i = 0 ; i < params.length ; ++i)
+            if (params[i] instanceof int[]) params[i] = Arrays.toString((int[]) params[i]);
+        throw new HistoryViolation(primaryKey, "history violation on " + primaryKey + ": " + String.format(message, params));
+    }
+
+    static boolean equal(int[] a, int [] b, int count)
+    {
+        for (int i = 0 ; i < count ; ++i)
+            if (a[i] != b[i])
+                return false;
+        return true;
+    }
+
+    static Integer causedBy(Throwable failure)
+    {
+        if (failure == null || failure.getMessage() == null)
+            return null;
+
+        if (!(failure instanceof HistoryViolation))
+            return causedBy(failure.getCause());
+
+        return ((HistoryViolation) failure).primaryKey;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryViolation.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryViolation.java
new file mode 100644
index 0000000..6712ab6
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/HistoryViolation.java
@@ -0,0 +1,35 @@
+/*
+ * 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.simulator.paxos;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public class HistoryViolation extends AssertionError
+{
+    final int primaryKey;
+
+    public HistoryViolation(int primaryKey, Object detailMessage)
+    {
+        super(detailMessage);
+        this.primaryKey = primaryKey;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/Observation.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/Observation.java
new file mode 100644
index 0000000..546fd31
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/Observation.java
@@ -0,0 +1,45 @@
+/*
+ * 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.simulator.paxos;
+
+class Observation implements Comparable<Observation>
+{
+    final int id;
+    final Object[][] result;
+    final int start;
+    final int end;
+
+    Observation(int id, Object[][] result, int start, int end)
+    {
+        this.id = id;
+        this.result = result;
+        this.start = start;
+        this.end = end;
+    }
+
+    // computes a PARTIAL ORDER on when the outcome occurred, i.e. for many pair-wise comparisons the answer is 0
+    public int compareTo(Observation that)
+    {
+        if (this.end < that.start)
+            return -1;
+        if (that.end < this.start)
+            return 1;
+        return 0;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PairOfSequencesPaxosSimulation.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PairOfSequencesPaxosSimulation.java
new file mode 100644
index 0000000..77eefb3
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PairOfSequencesPaxosSimulation.java
@@ -0,0 +1,355 @@
+/*
+ * 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.simulator.paxos;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.LongSupplier;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.ListType;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.distributed.impl.Instance;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.ActionListener;
+import org.apache.cassandra.simulator.ActionPlan;
+import org.apache.cassandra.simulator.RunnableActionScheduler;
+import org.apache.cassandra.simulator.Actions;
+import org.apache.cassandra.simulator.cluster.ClusterActions;
+import org.apache.cassandra.simulator.Debug;
+import org.apache.cassandra.simulator.cluster.KeyspaceActions;
+import org.apache.cassandra.simulator.systems.SimulatedActionTask;
+import org.apache.cassandra.simulator.systems.SimulatedSystems;
+import org.apache.cassandra.simulator.utils.IntRange;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+import static java.lang.Boolean.TRUE;
+import static java.util.Collections.emptyList;
+import static java.util.Collections.singletonList;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.ANY;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE_NO_TIMEOUTS;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.STREAM_LIMITED;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.TIME_AND_STREAM_LIMITED;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.TIME_LIMITED;
+import static org.apache.cassandra.simulator.Debug.EventType.PARTITION;
+import static org.apache.cassandra.simulator.paxos.HistoryChecker.fail;
+
+@SuppressWarnings("unused")
+public class PairOfSequencesPaxosSimulation extends PaxosSimulation
+{
+    private static final Logger logger = LoggerFactory.getLogger(PairOfSequencesPaxosSimulation.class);
+
+    private static final String KEYSPACE = "simple_paxos_simulation";
+    private static final String TABLE = "tbl";
+    private static final String CREATE_TABLE = "CREATE TABLE " + KEYSPACE + ".tbl (pk int, count int, seq1 text, seq2 list<int>, PRIMARY KEY (pk))";
+    private static final String INSERT = "INSERT INTO " + KEYSPACE + ".tbl (pk, count, seq1, seq2) VALUES (?, 0, '', []) IF NOT EXISTS";
+    private static final String INSERT1 = "INSERT INTO " + KEYSPACE + ".tbl (pk, count, seq1, seq2) VALUES (?, 0, '', []) USING TIMESTAMP 0";
+    private static final String UPDATE = "UPDATE " + KEYSPACE + ".tbl SET count = count + 1, seq1 = seq1 + ?, seq2 = seq2 + ? WHERE pk = ? IF EXISTS";
+    private static final String SELECT = "SELECT pk, count, seq1, seq2 FROM  " + KEYSPACE + ".tbl WHERE pk = ?";
+    private static final ListType<Integer> LIST_TYPE = ListType.getInstance(Int32Type.instance, true);
+
+    class VerifyingOperation extends Operation
+    {
+        final HistoryChecker historyChecker;
+        public VerifyingOperation(int id, IInvokableInstance instance, ConsistencyLevel consistencyLevel, int primaryKey, HistoryChecker historyChecker)
+        {
+            super(primaryKey, id, instance, "SELECT", SELECT, consistencyLevel, null, primaryKey);
+            this.historyChecker = historyChecker;
+        }
+
+        void verify(Observation outcome)
+        {
+            (outcome.result != null ? successfulReads : failedReads).incrementAndGet();
+
+            if (outcome.result == null)
+                return;
+
+            if (outcome.result.length != 1)
+                throw fail(primaryKey, "#result (%s) != 1", Arrays.toString(outcome.result));
+
+            Object[] row = outcome.result[0];
+            // first verify internally consistent
+            int count = row[1] == null ? 0 : (Integer) row[1];
+            int[] seq1 = Arrays.stream((row[2] == null ? "" : (String) row[2]).split(","))
+                               .filter(s -> !s.isEmpty())
+                               .mapToInt(Integer::parseInt)
+                               .toArray();
+            int[] seq2 = ((List<Integer>) (row[3] == null ? emptyList() : row[3]))
+                         .stream().mapToInt(x -> x).toArray();
+
+            if (!Arrays.equals(seq1, seq2))
+                throw fail(primaryKey, "%s != %s", seq1, seq2);
+
+            if (seq1.length != count)
+                throw fail(primaryKey, "%d != #%s", count, seq1);
+
+            historyChecker.witness(outcome, seq1, outcome.start, outcome.end);
+        }
+    }
+
+    class NonVerifyingOperation extends Operation
+    {
+        public NonVerifyingOperation(int id, IInvokableInstance instance, ConsistencyLevel consistencyLevel, int primaryKey, HistoryChecker historyChecker)
+        {
+            super(primaryKey, id, instance, "SELECT", SELECT, consistencyLevel, null, primaryKey);
+        }
+
+        void verify(Observation outcome)
+        {
+        }
+    }
+
+    public class ModifyingOperation extends Operation
+    {
+        final HistoryChecker historyChecker;
+        public ModifyingOperation(int id, IInvokableInstance instance, ConsistencyLevel commitConsistency, ConsistencyLevel serialConsistency, int primaryKey, HistoryChecker historyChecker)
+        {
+            super(primaryKey, id, instance, "UPDATE", UPDATE, commitConsistency, serialConsistency, id + ",", ByteBufferUtil.getArray(LIST_TYPE.decompose(singletonList(id))), primaryKey);
+            this.historyChecker = historyChecker;
+        }
+
+        void verify(Observation outcome)
+        {
+            (outcome.result != null ? successfulWrites : failedWrites).incrementAndGet();
+            if (outcome.result != null)
+            {
+                if (outcome.result.length != 1)
+                    throw fail(primaryKey, "Result: 1 != #%s", Arrays.toString(outcome.result));
+                if (outcome.result[0][0] != TRUE)
+                    throw fail(primaryKey, "Result != TRUE");
+            }
+            historyChecker.applied(outcome.id, outcome.start, outcome.end, outcome.result != null);
+        }
+    }
+
+    final ClusterActions.Options clusterOptions;
+    final float readRatio;
+    final IntRange withinKeyConcurrency;
+    final int concurrency;
+    final IntRange simulateKeyForSeconds;
+    final ConsistencyLevel serialConsistency;
+    final Debug debug;
+    final List<HistoryChecker> historyCheckers = new ArrayList<>();
+    final AtomicInteger successfulReads = new AtomicInteger();
+    final AtomicInteger successfulWrites = new AtomicInteger();
+    final AtomicInteger failedReads = new AtomicInteger();
+    final AtomicInteger failedWrites = new AtomicInteger();
+    final long seed;
+    final int[] primaryKeys;
+
+    public PairOfSequencesPaxosSimulation(SimulatedSystems simulated,
+                                          Cluster cluster,
+                                          ClusterActions.Options clusterOptions,
+                                          float readRatio,
+                                          int concurrency, IntRange simulateKeyForSeconds, IntRange withinKeyConcurrency,
+                                          ConsistencyLevel serialConsistency, RunnableActionScheduler scheduler, Debug debug,
+                                          long seed, int[] primaryKeys,
+                                          long runForNanos, LongSupplier jitter)
+    {
+        super(runForNanos < 0 ? STREAM_LIMITED : clusterOptions.topologyChangeLimit < 0 ? TIME_LIMITED : TIME_AND_STREAM_LIMITED,
+              simulated, cluster, scheduler, runForNanos, jitter);
+        this.readRatio = readRatio;
+        this.concurrency = concurrency;
+        this.simulateKeyForSeconds = simulateKeyForSeconds;
+        this.withinKeyConcurrency = withinKeyConcurrency;
+        this.serialConsistency = serialConsistency;
+        this.clusterOptions = clusterOptions;
+        this.debug = debug;
+        this.seed = seed;
+        this.primaryKeys = primaryKeys.clone();
+        Arrays.sort(this.primaryKeys);
+    }
+
+    public ActionPlan plan()
+    {
+        ActionPlan plan = new KeyspaceActions(simulated, KEYSPACE, TABLE, CREATE_TABLE, cluster,
+                                              clusterOptions, serialConsistency, this, primaryKeys, debug).plan();
+
+        plan = plan.encapsulate(ActionPlan.setUpTearDown(
+            ActionList.of(
+                cluster.stream().map(i -> simulated.run("Insert Partitions", i, executeForPrimaryKeys(INSERT1, primaryKeys)))
+            ),
+            ActionList.of(
+                cluster.stream().map(i -> SimulatedActionTask.unsafeTask("Shutdown " + i.broadcastAddress(), RELIABLE, RELIABLE_NO_TIMEOUTS, simulated, i, i::shutdown))
+            )
+        ));
+
+        final int nodes = cluster.size();
+        for (int primaryKey : primaryKeys)
+            historyCheckers.add(new HistoryChecker(primaryKey));
+
+        List<Supplier<Action>> primaryKeyActions = new ArrayList<>();
+        for (int pki = 0 ; pki < primaryKeys.length ; ++pki)
+        {
+            int primaryKey = primaryKeys[pki];
+            HistoryChecker historyChecker = historyCheckers.get(pki);
+            Supplier<Action> supplier = new Supplier<Action>()
+            {
+                int i = 0;
+
+                @Override
+                public Action get()
+                {
+                    int node = simulated.random.uniform(1, nodes + 1);
+                    IInvokableInstance instance = cluster.get(node);
+                    switch (serialConsistency)
+                    {
+                        default: throw new AssertionError();
+                        case LOCAL_SERIAL:
+                            if (simulated.snitch.dcOf(node) > 0)
+                            {
+                                // perform some queries against these nodes but don't expect them to be linearizable
+                                return new NonVerifyingOperation(i++, instance, serialConsistency, primaryKey, historyChecker);
+                            }
+                        case SERIAL:
+                            return simulated.random.decide(readRatio)
+                                   ? new VerifyingOperation(i++, instance, serialConsistency, primaryKey, historyChecker)
+                                   : new ModifyingOperation(i++, instance, ANY, serialConsistency, primaryKey, historyChecker);
+                    }
+                }
+
+                @Override
+                public String toString()
+                {
+                    return Integer.toString(primaryKey);
+                }
+            };
+
+            final ActionListener listener = debug.debug(PARTITION, simulated.time, cluster, KEYSPACE, primaryKey);
+            if (listener != null)
+            {
+                Supplier<Action> wrap = supplier;
+                supplier = new Supplier<Action>()
+                {
+                    @Override
+                    public Action get()
+                    {
+                        Action action = wrap.get();
+                        action.register(listener);
+                        return action;
+                    }
+
+                    @Override
+                    public String toString()
+                    {
+                        return wrap.toString();
+                    }
+                };
+            }
+
+            primaryKeyActions.add(supplier);
+        }
+
+        List<Integer> available = IntStream.range(0, primaryKeys.length).boxed().collect(Collectors.toList());
+        Action stream = Actions.infiniteStream(concurrency, new Supplier<Action>() {
+            @Override
+            public Action get()
+            {
+                int i = simulated.random.uniform(0, available.size());
+                int next = available.get(i);
+                available.set(i, available.get(available.size() - 1));
+                available.remove(available.size() - 1);
+                long untilNanos = simulated.time.nanoTime() + SECONDS.toNanos(simulateKeyForSeconds.select(simulated.random));
+                int concurrency = withinKeyConcurrency.select(simulated.random);
+                Supplier<Action> supplier = primaryKeyActions.get(next);
+                // while this stream is finite, it participates in an infinite stream via its parent, so we want to permit termination while it's running
+                return Actions.infiniteStream(concurrency, new Supplier<Action>()
+                {
+                    @Override
+                    public Action get()
+                    {
+                        if (simulated.time.nanoTime() >= untilNanos)
+                        {
+                            available.add(next);
+                            return null;
+                        }
+                        return supplier.get();
+                    }
+
+                    @Override
+                    public String toString()
+                    {
+                        return supplier.toString();
+                    }
+                });
+            }
+
+            @Override
+            public String toString()
+            {
+                return "Primary Key Actions";
+            }
+        });
+
+        return simulated.execution.plan()
+                                  .encapsulate(plan)
+                                  .encapsulate(ActionPlan.interleave(singletonList(ActionList.of(stream))));
+    }
+
+    private IIsolatedExecutor.SerializableRunnable executeForPrimaryKeys(String cql, int[] primaryKeys)
+    {
+        return () -> {
+            for (int primaryKey : primaryKeys)
+                Instance.unsafeExecuteInternalWithResult(cql, primaryKey);
+        };
+    }
+
+    @Override
+    public TopologyChangeValidator newTopologyChangeValidator(Object id)
+    {
+        return new PaxosTopologyChangeVerifier(cluster, KEYSPACE, TABLE, id);
+    }
+
+    @Override
+    public RepairValidator newRepairValidator(Object id)
+    {
+        return new PaxosRepairValidator(cluster, KEYSPACE, TABLE, id);
+    }
+
+    @Override
+    void log(@Nullable Integer primaryKey)
+    {
+        if (primaryKey == null) historyCheckers.forEach(HistoryChecker::print);
+        else historyCheckers.stream().filter(h -> h.primaryKey == primaryKey).forEach(HistoryChecker::print);
+    }
+
+    @Override
+    public void run()
+    {
+        super.run();
+        logger.warn("Writes: {} successful, {} failed", successfulWrites, failedWrites);
+        logger.warn("Reads: {} successful {} failed", successfulReads, failedReads);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosClusterSimulation.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosClusterSimulation.java
new file mode 100644
index 0000000..0fd9135
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosClusterSimulation.java
@@ -0,0 +1,102 @@
+/*
+ * 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.simulator.paxos;
+
+import java.io.IOException;
+
+import org.apache.cassandra.config.Config.PaxosVariant;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.ClusterSimulation;
+import org.apache.cassandra.simulator.utils.KindOfSequence;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.distributed.api.ConsistencyLevel.SERIAL;
+
+class PaxosClusterSimulation extends ClusterSimulation<PaxosSimulation> implements AutoCloseable
+{
+    @SuppressWarnings("UnusedReturnValue")
+    static class Builder extends ClusterSimulation.Builder<PaxosSimulation>
+    {
+        PaxosVariant initialPaxosVariant = PaxosVariant.v2;
+        PaxosVariant finalPaxosVariant = null;
+        Boolean stateCache;
+        ConsistencyLevel serialConsistency = SERIAL;
+
+        public Builder consistency(ConsistencyLevel serialConsistency)
+        {
+            this.serialConsistency = serialConsistency;
+            return this;
+        }
+
+        public Builder stateCache(Boolean stateCache)
+        {
+            this.stateCache = stateCache;
+            return this;
+        }
+
+        public Builder initialPaxosVariant(PaxosVariant variant)
+        {
+            initialPaxosVariant = variant;
+            return this;
+        }
+
+        public Builder finalPaxosVariant(PaxosVariant variant)
+        {
+            finalPaxosVariant = variant;
+            return this;
+        }
+
+        public PaxosClusterSimulation create(long seed) throws IOException
+        {
+            RandomSource random = randomSupplier.get();
+            random.reset(seed);
+            return new PaxosClusterSimulation(random, seed, uniqueNum, this);
+        }
+    }
+
+    PaxosClusterSimulation(RandomSource random, long seed, int uniqueNum, Builder builder) throws IOException
+    {
+        super(random, seed, uniqueNum, builder,
+              config -> config.set("paxos_variant", builder.initialPaxosVariant.name())
+                              .set("paxos_cache_size", (builder.stateCache != null ? builder.stateCache : random.uniformFloat() < 0.5) ? null : "0MiB")
+                              .set("paxos_state_purging", "repaired")
+                              .set("paxos_on_linearizability_violations", "log")
+        ,
+              (simulated, schedulers, cluster, options) -> {
+                  int[] primaryKeys = primaryKeys(seed, builder.primaryKeyCount());
+                  KindOfSequence.Period jitter = RandomSource.Choices.uniform(KindOfSequence.values()).choose(random)
+                                                                     .period(builder.schedulerJitterNanos(), random);
+                  return new PairOfSequencesPaxosSimulation(simulated, cluster, options.changePaxosVariantTo(builder.finalPaxosVariant),
+                                                            builder.readChance().select(random), builder.concurrency(), builder.primaryKeySeconds(), builder.withinKeyConcurrency(),
+                                                            builder.serialConsistency, schedulers, builder.debug(), seed,
+                                                            primaryKeys, builder.secondsToSimulate() >= 0 ? SECONDS.toNanos(builder.secondsToSimulate()) : -1,
+                                                            () -> jitter.get(random));
+              });
+    }
+
+    private static int[] primaryKeys(long seed, int count)
+    {
+        int primaryKey = (int) (seed);
+        int[] primaryKeys = new int[count];
+        for (int i = 0 ; i < primaryKeys.length ; ++i)
+            primaryKeys[i] = primaryKey += 1 << 20;
+        return primaryKeys;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosRepairValidator.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosRepairValidator.java
new file mode 100644
index 0000000..572b8ff
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosRepairValidator.java
@@ -0,0 +1,102 @@
+/*
+ * 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.simulator.paxos;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.simulator.cluster.ClusterActionListener.RepairValidator;
+import org.apache.cassandra.simulator.cluster.Topology;
+
+import static java.util.Arrays.stream;
+import static org.apache.cassandra.simulator.systems.NonInterceptible.Permit.REQUIRED;
+
+public class PaxosRepairValidator implements RepairValidator
+{
+    final Cluster cluster;
+    final String keyspace;
+    final String table;
+    final Object id;
+
+    boolean isPaxos;
+    Topology topology;
+    Ballots.LatestBallots[][] ballotsBefore;
+
+    public PaxosRepairValidator(Cluster cluster, String keyspace, String table, Object id)
+    {
+        this.cluster = cluster;
+        this.keyspace = keyspace;
+        this.table = table;
+        this.id = id;
+    }
+
+    @Override
+    public void before(Topology topology, boolean repairPaxos, boolean repairOnlyPaxos)
+    {
+        if (repairOnlyPaxos)
+            return;
+
+        this.isPaxos = isPaxos;
+        this.topology = topology;
+        this.ballotsBefore = Ballots.read(REQUIRED, cluster, keyspace, table, topology.primaryKeys, topology.replicasForKeys, false);
+    }
+
+    @Override
+    public void after()
+    {
+        if (ballotsBefore == null)
+            return;
+
+        int[] primaryKeys = topology.primaryKeys;
+        int[][] replicasForKeys = topology.replicasForKeys;
+        int quorumRf = topology.quorumRf;
+        int quorum = quorumRf / 2 + 1;
+        Ballots.LatestBallots[][] ballotsAfter  = Ballots.read(REQUIRED, cluster, keyspace, table, primaryKeys, replicasForKeys, true);
+        for (int pki = 0; pki < primaryKeys.length ; ++pki)
+        {
+            Ballots.LatestBallots[] before = ballotsBefore[pki];
+            Ballots.LatestBallots[] after  = ballotsAfter[pki];
+
+            if (before.length != after.length || before.length != quorumRf)
+                throw new AssertionError("Inconsistent ownership information");
+
+            String kind;
+            long expectPersisted;
+            if (isPaxos)
+            {
+                long committedBefore = stream(before).mapToLong(Ballots.LatestBallots::permanent).max().orElse(0L);
+                // anything accepted by a quorum should be persisted
+                long acceptedBefore = stream(before).mapToLong(n -> n.accept).max().orElse(0L);
+                long acceptedOfBefore = stream(before).filter(n -> n.accept == acceptedBefore).mapToLong(n -> n.acceptOf).findAny().orElse(0L);
+                int countAccepted = (int) stream(before).filter(n -> n.accept == acceptedBefore).count();
+                expectPersisted = countAccepted >= quorum ? acceptedOfBefore : committedBefore;
+                kind = countAccepted >= quorum ? "agreed" : "committed";
+            }
+            else
+            {
+                expectPersisted = stream(before).mapToLong(n -> n.persisted).max().orElse(0L);
+                kind = "persisted";
+            }
+
+            int countAfter = (int) stream(after).filter(n -> n.persisted >= expectPersisted).count();
+            if (countAfter < quorum)
+                throw new AssertionError(String.format("%d: %d %s before %s but only persisted on %d after (out of %d)",
+                                                       primaryKeys[pki], expectPersisted, kind, id, countAfter, quorumRf));
+        }
+
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulation.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulation.java
new file mode 100644
index 0000000..63e84dc
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulation.java
@@ -0,0 +1,281 @@
+/*
+ * 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.simulator.paxos;
+
+import java.util.Map;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+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;
+import org.apache.cassandra.exceptions.RequestExecutionException;
+import org.apache.cassandra.service.paxos.BallotGenerator;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.ActionPlan;
+import org.apache.cassandra.simulator.ActionSchedule;
+import org.apache.cassandra.simulator.RunnableActionScheduler;
+import org.apache.cassandra.simulator.Simulation;
+import org.apache.cassandra.simulator.cluster.ClusterActionListener;
+import org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods;
+import org.apache.cassandra.simulator.systems.SimulatedQuery;
+import org.apache.cassandra.simulator.systems.SimulatedSystems;
+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.simulator.Action.Modifiers.DISPLAY_ORIGIN;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.simulator.paxos.HistoryChecker.causedBy;
+
+public abstract class PaxosSimulation implements Simulation, ClusterActionListener
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosSimulation.class);
+
+    abstract class Operation extends SimulatedQuery implements BiConsumer<Object[][], Throwable>
+    {
+        final int primaryKey;
+        final int id;
+        int start;
+
+        public Operation(int primaryKey, int id, IInvokableInstance instance,
+                         String idString, String query, ConsistencyLevel commitConsistency, ConsistencyLevel serialConistency, Object... params)
+        {
+            super(primaryKey + "/" + id + ": " + idString, DISPLAY_ORIGIN, NONE, PaxosSimulation.this.simulated, instance, query, commitConsistency, serialConistency, params);
+            this.primaryKey = primaryKey;
+            this.id = id;
+        }
+
+        public ActionList performAndRegister()
+        {
+            start = logicalClock.incrementAndGet();
+            return super.performAndRegister();
+        }
+
+        @Override
+        public void accept(Object[][] success, Throwable failure)
+        {
+            if (failure != null && !(failure instanceof RequestExecutionException))
+            {
+                if (!simulated.failures.hasFailure() || !(failure instanceof UncheckedInterruptedException))
+                    logger.error("Unexpected exception", failure);
+                simulated.failures.accept(failure);
+                return;
+            }
+            else if (failure != null)
+            {
+                logger.trace("{}", failure.getMessage());
+            }
+
+            verify(new Observation(id, success, start, logicalClock.incrementAndGet()));
+        }
+
+        abstract void verify(Observation outcome);
+    }
+
+    final Cluster cluster;
+    final SimulatedSystems simulated;
+    final RunnableActionScheduler runnableScheduler;
+    final AtomicInteger logicalClock = new AtomicInteger(1);
+    final ActionSchedule.Mode mode;
+    final long runForNanos;
+    final LongSupplier jitter;
+
+    public PaxosSimulation(ActionSchedule.Mode mode, SimulatedSystems simulated, Cluster cluster, RunnableActionScheduler runnableScheduler, long runForNanos, LongSupplier jitter)
+    {
+        this.cluster = cluster;
+        this.simulated = simulated;
+        this.runnableScheduler = runnableScheduler;
+        this.runForNanos = runForNanos;
+        this.mode = mode;
+        this.jitter = jitter;
+    }
+
+    protected abstract ActionPlan plan();
+
+    public void run()
+    {
+        AtomicReference<CloseableIterator<?>> onFailedShutdown = new AtomicReference<>();
+        AtomicInteger shutdown = new AtomicInteger();
+
+        AtomicLong counter = new AtomicLong();
+        ScheduledExecutorPlus livenessChecker = null;
+        ScheduledFuture<?> liveness = null;
+        if (CassandraRelevantProperties.TEST_SIMULATOR_LIVENESS_CHECK.getBoolean())
+        {
+            livenessChecker = ExecutorFactory.Global.executorFactory().scheduled("SimulationLiveness");
+            liveness = livenessChecker.scheduleWithFixedDelay(new Runnable()
+            {
+                long prev = 0;
+                @Override
+                public void run()
+                {
+                    Thread.currentThread().setUncaughtExceptionHandler((th, ex) -> {
+                        logger.error("Unexpected exception on {}", th, ex);
+                    });
+                    if (shutdown.get() > 0)
+                    {
+                        int attempts = shutdown.getAndIncrement();
+                        if (attempts > 2 || onFailedShutdown.get() == null)
+                        {
+                            logger.error("Failed to exit despite best efforts, dumping threads and forcing shutdown");
+                            for (Map.Entry<Thread, StackTraceElement[]> stes : Thread.getAllStackTraces().entrySet())
+                            {
+                                logger.error("{}", stes.getKey());
+                                logger.error("{}", Threads.prettyPrint(stes.getValue(), false, "\n"));
+                            }
+
+                            System.exit(1);
+                        }
+                        else if (attempts > 1)
+                        {
+                            logger.error("Failed to exit cleanly, force closing simulation");
+                            onFailedShutdown.get().close();
+                        }
+                    }
+                    else
+                    {
+                        long cur = counter.get();
+                        if (cur == prev)
+                        {
+                            logger.error("Simulation appears to have stalled; terminating. To disable set -Dcassandra.test.simulator.livenesscheck=false");
+                            shutdown.set(1);
+                            throw failWithOOM();
+                        }
+                        prev = cur;
+                    }
+                }
+            }, 5L, 5L, TimeUnit.MINUTES);
+        }
+
+        try (CloseableIterator<?> iter = iterator())
+        {
+            onFailedShutdown.set(iter);
+            while (iter.hasNext())
+            {
+                if (shutdown.get() > 0)
+                    throw failWithOOM();
+
+                iter.next();
+                counter.incrementAndGet();
+            }
+        }
+
+        // only cancel if successfully shutdown; otherwise we may have a shutdown liveness issue, and should kill process
+        if (liveness != null)
+            liveness.cancel(true);
+        if (livenessChecker != null)
+            livenessChecker.shutdownNow();
+    }
+
+    public CloseableIterator<?> iterator()
+    {
+        CloseableIterator<?> iterator = plan().iterator(mode, runForNanos, jitter, simulated.time, runnableScheduler, simulated.futureScheduler);
+        return new CloseableIterator<Object>()
+        {
+            @Override
+            public boolean hasNext()
+            {
+                return !isDone() && iterator.hasNext();
+            }
+
+            @Override
+            public Object next()
+            {
+                try
+                {
+                    return iterator.next();
+                }
+                catch (Throwable t)
+                {
+                    throw failWith(t);
+                }
+            }
+
+            @Override
+            public void close()
+            {
+                iterator.close();
+            }
+        };
+    }
+
+    boolean isDone()
+    {
+        if (!simulated.failures.hasFailure())
+            return false;
+
+        throw logAndThrow();
+    }
+
+    RuntimeException failWith(Throwable t)
+    {
+        simulated.failures.onFailure(t);
+        throw logAndThrow();
+    }
+
+    abstract void log(@Nullable Integer primaryKey);
+
+    private RuntimeException logAndThrow()
+    {
+        Integer causedByPrimaryKey = null;
+        Throwable causedByThrowable = null;
+        for (Throwable t : simulated.failures.get())
+        {
+            if (null != (causedByPrimaryKey = causedBy(t)))
+            {
+                causedByThrowable = t;
+                break;
+            }
+        }
+
+        log(causedByPrimaryKey);
+        if (causedByPrimaryKey != null) throw Throwables.propagate(causedByThrowable);
+        else throw Throwables.propagate(simulated.failures.get().get(0));
+    }
+
+    public void close()
+    {
+        // stop intercepting message delivery
+        cluster.setMessageSink(null);
+        cluster.forEach(i -> {
+            if (!i.isShutdown())
+            {
+                i.unsafeRunOnThisThread(() -> BallotGenerator.Global.unsafeSet(new BallotGenerator.Default()));
+                i.unsafeRunOnThisThread(InterceptorOfGlobalMethods.Global::unsafeReset);
+            }
+        });
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulationRunner.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulationRunner.java
new file mode 100644
index 0000000..50a0ee5
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosSimulationRunner.java
@@ -0,0 +1,150 @@
+/*
+ * 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.simulator.paxos;
+
+import java.io.IOException;
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import io.airlift.airline.Cli;
+import io.airlift.airline.Command;
+import io.airlift.airline.Option;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.simulator.SimulationRunner;
+
+public class PaxosSimulationRunner extends SimulationRunner
+{
+    @Command(name = "run")
+    public static class Run extends SimulationRunner.Run<PaxosClusterSimulation.Builder>
+    {
+        @Option(name = "--consistency", description = "Specify the consistency level to perform paxos operations at")
+        String consistency;
+
+        @Option(name = "--with-paxos-state-cache", arity = 0, description = "Run with the paxos state cache always enabled")
+        boolean withStateCache;
+
+        @Option(name = "--without-paxos-state-cache", arity = 0, description = "Run with the paxos state cache always disabled")
+        boolean withoutStateCache;
+
+        @Option(name = "--variant", title = "paxos variant", description = "Specify the initial paxos variant to use")
+        String variant;
+
+        @Option(name = "--to-variant",  title = "paxos variant", description = "Specify the paxos variant to change to at some point during the simulation")
+        String toVariant;
+
+        public Run() {}
+
+        @Override
+        protected void propagate(PaxosClusterSimulation.Builder builder)
+        {
+            super.propagate(builder);
+            propagateTo(consistency, withStateCache, withoutStateCache, variant, toVariant, builder);
+        }
+    }
+
+    @Command(name = "record")
+    public static class Record extends SimulationRunner.Record<PaxosClusterSimulation.Builder>
+    {
+        @Option(name = "--consistency")
+        String consistency;
+
+        @Option(name = "--with-paxos-state-cache", arity = 0)
+        boolean withStateCache;
+
+        @Option(name = "--without-paxos-state-cache", arity = 0)
+        boolean withoutStateCache;
+
+        @Option(name = "--variant", description = "paxos variant to use")
+        String variant;
+
+        @Option(name = "--to-variant", description = "paxos variant to change to during the simulation")
+        String toVariant;
+
+        public Record() {}
+
+        @Override
+        protected void propagate(PaxosClusterSimulation.Builder builder)
+        {
+            super.propagate(builder);
+            propagateTo(consistency, withStateCache, withoutStateCache, variant, toVariant, builder);
+        }
+    }
+
+    @Command(name = "reconcile")
+    public static class Reconcile extends SimulationRunner.Reconcile<PaxosClusterSimulation.Builder>
+    {
+        @Option(name = "--consistency")
+        String consistency;
+
+        @Option(name = "--with-paxos-state-cache", arity = 0)
+        boolean withStateCache;
+
+        @Option(name = "--without-paxos-state-cache", arity = 0)
+        boolean withoutStateCache;
+
+        @Option(name = "--variant", description = "paxos variant to use")
+        String variant;
+
+        @Option(name = "--to-variant", description = "paxos variant to change to during the simulation")
+        String toVariant;
+        
+        public Reconcile() {}
+
+        @Override
+        protected void propagate(PaxosClusterSimulation.Builder builder)
+        {
+            super.propagate(builder);
+            propagateTo(consistency, withStateCache, withoutStateCache, variant, toVariant, builder);
+        }
+    }
+
+    public static class Help extends HelpCommand<PaxosClusterSimulation.Builder> {}
+
+    static void propagateTo(String consistency, boolean withStateCache, boolean withoutStateCache, String variant, String toVariant, PaxosClusterSimulation.Builder builder)
+    {
+        Optional.ofNullable(consistency).map(ConsistencyLevel::valueOf).ifPresent(builder::consistency);
+        if (withStateCache) builder.stateCache(true);
+        if (withoutStateCache) builder.stateCache(false);
+        Optional.ofNullable(variant).map(Config.PaxosVariant::valueOf).ifPresent(builder::initialPaxosVariant);
+        Optional.ofNullable(toVariant).map(Config.PaxosVariant::valueOf).ifPresent(builder::finalPaxosVariant);
+    }
+
+    // for simple unit tests so we can simply invoke main()
+    private static final AtomicInteger uniqueNum = new AtomicInteger();
+
+    /**
+     * See {@link org.apache.cassandra.simulator} package info for execution tips
+     */
+    public static void main(String[] args) throws IOException
+    {
+        PaxosClusterSimulation.Builder builder = new PaxosClusterSimulation.Builder();
+        builder.unique(uniqueNum.getAndIncrement());
+
+        Cli.<SimulationRunner.ICommand<PaxosClusterSimulation.Builder>>builder("paxos")
+           .withCommand(Run.class)
+           .withCommand(Reconcile.class)
+           .withCommand(Record.class)
+           .withCommand(Help.class)
+           .withDefaultCommand(Help.class)
+           .build()
+           .parse(args)
+           .run(builder);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosTopologyChangeVerifier.java b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosTopologyChangeVerifier.java
new file mode 100644
index 0000000..46c4c9e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/paxos/PaxosTopologyChangeVerifier.java
@@ -0,0 +1,113 @@
+/*
+ * 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.simulator.paxos;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.simulator.cluster.ClusterActionListener.TopologyChangeValidator;
+import org.apache.cassandra.simulator.cluster.Topology;
+
+import static java.util.Arrays.stream;
+import static org.apache.cassandra.simulator.systems.NonInterceptible.Permit.REQUIRED;
+
+public class PaxosTopologyChangeVerifier implements TopologyChangeValidator
+{
+    final Cluster cluster;
+    final String keyspace;
+    final String table;
+    final Object id;
+
+    Topology topologyBefore;
+    Ballots.LatestBallots[][] ballotsBefore;
+
+    public PaxosTopologyChangeVerifier(Cluster cluster, String keyspace, String table, Object id)
+    {
+        this.cluster = cluster;
+        this.keyspace = keyspace;
+        this.table = table;
+        this.id = id;
+    }
+
+    @Override
+    public void before(Topology before, int[] participatingKeys)
+    {
+        this.topologyBefore = before.select(participatingKeys);
+        this.ballotsBefore = Ballots.read(REQUIRED, cluster, keyspace, table, topologyBefore.primaryKeys, topologyBefore.replicasForKeys, true);
+        for (int i = 0; i < topologyBefore.primaryKeys.length ; ++i)
+        {
+            if (ballotsBefore[i].length != topologyBefore.quorumRf)
+                throw new AssertionError("Inconsistent ownership/ballot information");
+        }
+    }
+
+    @Override
+    public void after(Topology topologyAfter)
+    {
+        afterInternal(topologyAfter.select(topologyBefore.primaryKeys));
+    }
+
+    public void afterInternal(Topology topologyAfter)
+    {
+        int[] primaryKeys = topologyAfter.primaryKeys;
+        int quorumBefore = topologyBefore.quorumRf / 2 + 1;
+        int quorumAfter = topologyAfter.quorumRf / 2 + 1;
+        Ballots.LatestBallots[][] allBefore = ballotsBefore;
+        Ballots.LatestBallots[][] allAfter = Ballots.read(REQUIRED, cluster, keyspace, table, primaryKeys, topologyAfter.replicasForKeys, true);
+        for (int pki = 0; pki < primaryKeys.length; ++pki)
+        {
+            Ballots.LatestBallots[] before = allBefore[pki];
+            Ballots.LatestBallots[] after = allAfter[pki];
+
+            if (after.length != topologyAfter.quorumRf)
+                throw new AssertionError("Inconsistent ownership/ballot information");
+
+            {
+                // if we had accepted to a quorum we should be committed to a quorum afterwards
+                // note that we will not always witness something newer than the latest accepted proposal,
+                // because if we don't witness it during repair, we will simply invalidate it with the low bound
+                long acceptedBefore = stream(before).mapToLong(n -> n.accept).max().orElse(0L);
+                long acceptedOfBefore = stream(before).filter(n -> n.accept == acceptedBefore).mapToLong(n -> n.acceptOf).findAny().orElse(0L);
+                int countBefore = (int) stream(before).filter(n -> n.accept == acceptedBefore).count();
+                int countAfter = countBefore < quorumAfter
+                                 ? (int) stream(after).filter(n -> n.any() >= acceptedBefore).count()
+                                 : (int) stream(after).filter(n -> n.permanent() >= acceptedOfBefore).count();
+
+                if (countBefore >= quorumBefore && countAfter < quorumAfter)
+                {
+                    throw new AssertionError(String.format("%d: %d accepted by %d before %s but only %s on %d after (expect at least %d)",
+                                                           primaryKeys[pki], acceptedBefore, countBefore, this, countBefore >= quorumAfter ? "committed" : "accepted", countAfter, quorumAfter));
+                }
+            }
+            {
+                // we should always have at least a quorum of newer records than the most recently witnessed commit
+                long committedBefore = stream(before).mapToLong(Ballots.LatestBallots::permanent).max().orElse(0L);
+                int countAfter = (int) stream(after).filter(n -> n.permanent() >= committedBefore).count();
+                if (countAfter < quorumAfter)
+                {
+                    throw new AssertionError(String.format("%d: %d committed before %s but only committed on %d after (expect at least %d)",
+                                                           primaryKeys[pki], committedBefore, id, countAfter, quorumAfter));
+                }
+            }
+        }
+
+        // clear memory usage on success
+        topologyBefore = null;
+        ballotsBefore = null;
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/Failures.java b/test/simulator/main/org/apache/cassandra/simulator/systems/Failures.java
new file mode 100644
index 0000000..2c89d3c
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/Failures.java
@@ -0,0 +1,70 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
+
+import org.apache.cassandra.utils.concurrent.Ref;
+import org.apache.cassandra.utils.memory.BufferPool;
+
+/**
+ * A simple encapsulation for capturing and reporting failures during the simulation
+ */
+public class Failures implements Consumer<Throwable>, BufferPool.DebugLeaks, Ref.OnLeak
+{
+    private final List<Throwable> failures = Collections.synchronizedList(new ArrayList<>());
+    private volatile boolean hasFailure;
+
+    public void onFailure(Throwable t)
+    {
+        failures.add(t);
+        hasFailure = true;
+    }
+
+    public boolean hasFailure()
+    {
+        return hasFailure;
+    }
+
+    public List<Throwable> get()
+    {
+        return Collections.unmodifiableList(failures);
+    }
+
+    @Override
+    public void accept(Throwable throwable)
+    {
+        onFailure(throwable);
+    }
+
+    @Override
+    public void leak()
+    {
+        failures.add(new AssertionError("ChunkCache leak detected"));
+    }
+
+    @Override
+    public void onLeak(Object state)
+    {
+        failures.add(new AssertionError("Ref leak detected " + state.toString()));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedExecution.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedExecution.java
new file mode 100644
index 0000000..4002f4e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedExecution.java
@@ -0,0 +1,282 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.function.Function;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.simulator.systems.NotifyThreadPaused.AwaitPaused;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+// An asynchronous task we can intercept the execution of
+@Shared(scope = SIMULATION)
+public interface InterceptedExecution
+{
+    SimulatedAction.Kind kind();
+    long deadlineNanos();
+    void invokeAndAwaitPause(InterceptorOfConsequences interceptor);
+    void cancel();
+    void onCancel(Runnable onCancel);
+
+    /**
+     * Abstract implementation we only need to implement Runnable for, which we will invoke
+     * on the given executor. The runnable should perform any necessary transfer to the target
+     * class loader itself.
+     */
+    abstract class InterceptedTaskExecution implements InterceptedExecution, Runnable
+    {
+        public final InterceptingExecutor executor;
+        boolean submittedOrCancelled;
+        Runnable onCancel;
+
+        public InterceptedTaskExecution(InterceptingExecutor executor)
+        {
+            Preconditions.checkNotNull(executor);
+            this.executor = executor;
+            executor.addPending(this);
+        }
+
+        @Override
+        public SimulatedAction.Kind kind()
+        {
+            return SimulatedAction.Kind.TASK;
+        }
+
+        @Override
+        public long deadlineNanos()
+        {
+            return -1L;
+        }
+
+        public void invokeAndAwaitPause(InterceptorOfConsequences interceptor)
+        {
+            Preconditions.checkState(!submittedOrCancelled);
+            executor.submitAndAwaitPause(this, interceptor);
+            submittedOrCancelled = true;
+        }
+
+        @Override
+        public void cancel()
+        {
+            if (!submittedOrCancelled)
+            {
+                executor.cancelPending(this);
+                submittedOrCancelled = true;
+                if (onCancel != null)
+                {
+                    onCancel.run();
+                    onCancel = null;
+                }
+            }
+        }
+
+        @Override
+        public void onCancel(Runnable onCancel)
+        {
+            assert this.onCancel == null || onCancel == null;
+            this.onCancel = onCancel;
+        }
+    }
+
+    /**
+     * Simple implementation we only need to supply a Runnable to, which we will invoke
+     * on the given executor. The runnable should perform any necessary transfer to the target
+     * class loader itself.
+     */
+    class InterceptedRunnableExecution extends InterceptedTaskExecution
+    {
+        final Runnable run;
+        public InterceptedRunnableExecution(InterceptingExecutor executor, Runnable run)
+        {
+            super(executor);
+            this.run = run;
+        }
+
+        public void run()
+        {
+            run.run();
+        }
+
+        public String toString()
+        {
+            return run + " with " + executor;
+        }
+    }
+
+    class InterceptedFutureTaskExecution<T> implements InterceptedExecution
+    {
+        private final SimulatedAction.Kind kind;
+        private final InterceptingExecutor executor;
+        private final long deadlineNanos;
+        private RunnableFuture<T> run;
+        private Runnable onCancel;
+
+        public InterceptedFutureTaskExecution(SimulatedAction.Kind kind, InterceptingExecutor executor, RunnableFuture<T> run)
+        {
+            this(kind, executor, run, -1L);
+        }
+
+        public InterceptedFutureTaskExecution(SimulatedAction.Kind kind, InterceptingExecutor executor, RunnableFuture<T> run, long deadlineNanos)
+        {
+            Preconditions.checkArgument(deadlineNanos >= -1);
+            this.kind = kind;
+            this.executor = executor;
+            this.run = run;
+            this.deadlineNanos = deadlineNanos;
+            executor.addPending(run);
+        }
+
+        public String toString()
+        {
+            return (run != null ? run.toString() : "(done)") + " with " + executor;
+        }
+
+        @Override
+        public SimulatedAction.Kind kind()
+        {
+            return kind;
+        }
+
+        @Override
+        public long deadlineNanos()
+        {
+            return deadlineNanos;
+        }
+
+        @Override
+        public void invokeAndAwaitPause(InterceptorOfConsequences interceptor)
+        {
+            Preconditions.checkNotNull(run);
+            executor.submitAndAwaitPause(run, interceptor);
+            run = null;
+        }
+
+        @Override
+        public void cancel()
+        {
+            if (run != null)
+            {
+                executor.cancelPending(run);
+                run = null;
+                if (onCancel != null)
+                {
+                    onCancel.run();
+                    onCancel = null;
+                }
+            }
+        }
+
+        @Override
+        public void onCancel(Runnable onCancel)
+        {
+            assert this.onCancel == null || onCancel == null;
+            this.onCancel = onCancel;
+        }
+    }
+
+    public class InterceptedThreadStart implements Runnable, InterceptedExecution
+    {
+        final SimulatedAction.Kind kind;
+        final InterceptibleThread thread;
+        Runnable run;
+        Runnable onCancel;
+
+        public InterceptedThreadStart(Function<Runnable, InterceptibleThread> factory, Runnable run, SimulatedAction.Kind kind)
+        {
+            this.thread = factory.apply(this);
+            this.kind = kind;
+            this.run = run;
+        }
+
+        public void run()
+        {
+            try
+            {
+                run.run();
+            }
+            catch (UncheckedInterruptedException ignore)
+            {
+                // thrown on abnormal shutdown; don't want to pollute the log
+            }
+            catch (Throwable t)
+            {
+                thread.getUncaughtExceptionHandler().uncaughtException(thread, t);
+            }
+            finally
+            {
+                thread.onTermination();
+                thread.interceptTermination(true);
+            }
+        }
+
+        public String toString()
+        {
+            return (run != null ? run.toString() : "(done)") + " with " + thread;
+        }
+
+        @Override
+        public SimulatedAction.Kind kind()
+        {
+            return kind;
+        }
+
+        @Override
+        public long deadlineNanos()
+        {
+            return -1L;
+        }
+
+        public void invokeAndAwaitPause(InterceptorOfConsequences interceptor)
+        {
+            AwaitPaused done = new AwaitPaused();
+            synchronized (done)
+            {
+                thread.beforeInvocation(interceptor, done);
+                thread.start();
+                done.awaitPause();
+            }
+        }
+
+        @Override
+        public void cancel()
+        {
+            if (run != null)
+            {
+                run = null;
+                if (onCancel != null)
+                {
+                    onCancel.run();
+                    onCancel = null;
+                }
+            }
+        }
+
+        @Override
+        public void onCancel(Runnable onCancel)
+        {
+            assert this.onCancel == null || onCancel == null;
+            this.onCancel = onCancel;
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedIdentityHashMap.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedIdentityHashMap.java
new file mode 100644
index 0000000..61837c2
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedIdentityHashMap.java
@@ -0,0 +1,158 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.AbstractSet;
+import java.util.HashMap;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.Set;
+
+import com.google.common.collect.Iterators;
+
+import static org.apache.cassandra.simulator.systems.InterceptorOfSystemMethods.Global.identityHashCode;
+
+/**
+ * A class that behaves like IdentityHashMap but uses our deterministically generated
+ * {@link InterceptorOfSystemMethods.Global#identityHashCode(Object)}
+ *
+ * This is used in case we iterate over the contents of any such collection (which we do)
+ */
+@SuppressWarnings("unused")
+public class InterceptedIdentityHashMap<K, V> extends IdentityHashMap<K, V>
+{
+    static class Key<K>
+    {
+        final int hash;
+        final K key;
+
+        Key(K key)
+        {
+            this.key = key;
+            this.hash = identityHashCode(key);
+        }
+
+        K key()
+        {
+            return key;
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return hash;
+        }
+
+        @Override
+        public boolean equals(Object that)
+        {
+            return that instanceof Key && key == ((Key<?>)that).key;
+        }
+    }
+
+    final HashMap<Key<K>, V> wrapped = new HashMap<>();
+    public InterceptedIdentityHashMap() {}
+    public InterceptedIdentityHashMap(int sizeToIgnore) {}
+
+    @Override
+    public int size()
+    {
+        return wrapped.size();
+    }
+
+    @Override
+    public boolean isEmpty()
+    {
+        return wrapped.isEmpty();
+    }
+
+    @Override
+    public boolean containsValue(Object value)
+    {
+        return wrapped.containsValue(value);
+    }
+
+    @Override
+    public boolean containsKey(Object o)
+    {
+        return wrapped.containsKey(new Key<>(o));
+    }
+
+    @Override
+    public V put(K key, V value)
+    {
+        return wrapped.put(new Key<>(key), value);
+    }
+
+    @Override
+    public V get(Object key)
+    {
+        return wrapped.get(new Key<>(key));
+    }
+
+    @Override
+    public V remove(Object key)
+    {
+        return wrapped.remove(new Key<>(key));
+    }
+
+    @Override
+    public Set<K> keySet()
+    {
+        return new AbstractSet<K>()
+        {
+            @Override
+            public Iterator<K> iterator()
+            {
+                return Iterators.transform(wrapped.keySet().iterator(), Key::key);
+            }
+
+            @Override
+            public boolean contains(Object o)
+            {
+                return containsKey(new Key<>(o));
+            }
+
+            @Override
+            public int size()
+            {
+                return wrapped.size();
+            }
+        };
+    }
+
+    @Override
+    public Set<Entry<K, V>> entrySet()
+    {
+        return new AbstractSet<Entry<K, V>>()
+        {
+            @Override
+            public Iterator<Entry<K, V>> iterator()
+            {
+                return Iterators.transform(wrapped.entrySet().iterator(), e -> new SimpleEntry<>(e.getKey().key, e.getValue()));
+            }
+
+            @Override
+            public int size()
+            {
+                return wrapped.size();
+            }
+        };
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedWait.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedWait.java
new file mode 100644
index 0000000..999e9aa
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptedWait.java
@@ -0,0 +1,426 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.Threads;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites.Capture.WAKE;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites.Capture.WAKE_AND_NOW;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Trigger.SIGNAL;
+import static org.apache.cassandra.simulator.systems.InterceptibleThread.interceptorOrDefault;
+import static org.apache.cassandra.utils.Shared.Recursive.ALL;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * A general abstraction for intercepted thread wait events, either
+ * generated by the program execution or our nemesis system.
+ */
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface InterceptedWait extends NotifyThreadPaused
+{
+    enum Kind { SLEEP_UNTIL, WAIT_UNTIL, UNBOUNDED_WAIT, NEMESIS }
+    enum Trigger { TIMEOUT, INTERRUPT, SIGNAL }
+
+    interface TriggerListener
+    {
+        /**
+         * Invoked when the wait is triggered, permitting any dependent Action to be invalidated.
+         * This is particularly useful for thread timeouts, which are often logically invalidated
+         * but may otherwise hold up scheduling of further events until their scheduled time passes.
+         * @param triggered the wait that has been triggered, and is no longer valid
+         */
+        void onTrigger(InterceptedWait triggered);
+    }
+
+    /**
+     * The kind of simulated wait
+     */
+    Kind kind();
+
+    /**
+     * true if the signal has already been triggered by another simulation action
+     */
+    boolean isTriggered();
+
+    /**
+     * true if this wait can be interrupted
+     */
+    boolean isInterruptible();
+
+    /**
+     * If kind() == TIMED_WAIT or ABSOLUTE_TIMED_WAIT this returns the relative and absolute
+     * period to wait in nanos
+     */
+    long waitTime();
+
+    /**
+     * Intercept a wakeup signal on this wait
+     */
+    void interceptWakeup(Trigger trigger, Thread by);
+
+    /**
+     * Signal the waiter immediately, and have the caller wait until its simulation has terminated.
+     *
+     * @param interceptor the interceptor to relay events to
+     * @param trigger if SIGNAL, propagate the signal to the wrapped condition we are waiting on
+     */
+    void triggerAndAwaitDone(InterceptorOfConsequences interceptor, Trigger trigger);
+
+    /**
+     * Signal all waiters immediately, bypassing the simulation
+     */
+    void triggerBypass();
+
+    /**
+     * Add a trigger listener, to notify the wait is no longer valid
+     */
+    void addListener(TriggerListener onTrigger);
+
+    Thread waiting();
+
+    /**
+     * A general purpose superclass for implementing an intercepted/simulated thread wait event.
+     * All share this implementation except for monitor waits, which must use the monitor they are waiting on
+     * in order to release its lock.
+     */
+    class InterceptedConditionWait extends NotInterceptedSyncCondition implements InterceptedWait
+    {
+        static final Logger logger = LoggerFactory.getLogger(InterceptedConditionWait.class);
+
+        final Kind kind;
+        final InterceptibleThread waiting;
+        final CaptureSites captureSites;
+        final InterceptorOfConsequences interceptedBy;
+        final Condition propagateSignal;
+        final List<TriggerListener> onTrigger = new ArrayList<>(3);
+        final long waitTime;
+        boolean isInterruptible, isSignalPending, isTriggered, isDone, hasExited;
+
+        public InterceptedConditionWait(Kind kind, long waitTime, InterceptibleThread waiting, CaptureSites captureSites, Condition propagateSignal)
+        {
+            this.kind = kind;
+            this.waitTime = waitTime;
+            this.waiting = waiting;
+            this.captureSites = captureSites;
+            this.interceptedBy = waiting.interceptedBy();
+            this.propagateSignal = propagateSignal;
+        }
+
+        public synchronized void triggerAndAwaitDone(InterceptorOfConsequences interceptor, Trigger trigger)
+        {
+            if (isTriggered)
+                return;
+
+            if (hasExited)
+            {
+                logger.error("{} exited without trigger {}", waiting, captureSites == null ? new CaptureSites(waiting, WAKE_AND_NOW) : captureSites);
+                throw failWithOOM();
+            }
+
+            waiting.beforeInvocation(interceptor, this);
+            isTriggered = true;
+            onTrigger.forEach(listener -> listener.onTrigger(this));
+
+            if (!waiting.preWakeup(this) || !isInterruptible)
+                super.signal();
+
+            if (isSignalPending && propagateSignal != null)
+                propagateSignal.signal();
+
+            try
+            {
+                while (!isDone)
+                    wait();
+            }
+            catch (InterruptedException ie)
+            {
+                throw new UncheckedInterruptedException(ie);
+            }
+        }
+
+        public synchronized void triggerBypass()
+        {
+            if (isTriggered)
+                return;
+
+            isTriggered = true;
+            super.signal();
+            if (propagateSignal != null)
+                propagateSignal.signal();
+        }
+
+        @Override
+        public void addListener(TriggerListener onTrigger)
+        {
+            this.onTrigger.add(onTrigger);
+        }
+
+        @Override
+        public Thread waiting()
+        {
+            return waiting;
+        }
+
+        @Override
+        public synchronized void notifyThreadPaused()
+        {
+            isDone = true;
+            notifyAll();
+        }
+
+        @Override
+        public Kind kind()
+        {
+            return kind;
+        }
+
+        @Override
+        public long waitTime()
+        {
+            return waitTime;
+        }
+
+        @Override
+        public void interceptWakeup(Trigger trigger, Thread by)
+        {
+            assert !isTriggered;
+            isSignalPending |= trigger == SIGNAL;
+            if (captureSites != null)
+                captureSites.registerWakeup(by);
+            interceptorOrDefault(by).interceptWakeup(this, trigger, interceptedBy);
+        }
+
+        public boolean isTriggered()
+        {
+            return isTriggered;
+        }
+
+        @Override
+        public boolean isInterruptible()
+        {
+            return isInterruptible;
+        }
+
+        // ignore return value; always false as can only represent artificial (intercepted) signaled status
+        public boolean await(long time, TimeUnit unit) throws InterruptedException
+        {
+            try
+            {
+                isInterruptible = true;
+                super.await();
+            }
+            finally
+            {
+                hasExited = true;
+            }
+            return false;
+        }
+
+        // ignore return value; always false as can only represent artificial (intercepted) signaled status
+        public boolean awaitUntil(long until) throws InterruptedException
+        {
+            try
+            {
+                isInterruptible = true;
+                super.await();
+            }
+            finally
+            {
+                hasExited = true;
+            }
+            return false;
+        }
+
+        // ignore return value; always false as can only represent artificial (intercepted) signaled status
+        public boolean awaitUntilUninterruptibly(long until)
+        {
+            try
+            {
+                isInterruptible = false;
+                super.awaitUninterruptibly();
+            }
+            finally
+            {
+                hasExited = true;
+            }
+            return false;
+        }
+
+        // ignore return value; always false as can only represent artificial (intercepted) signaled status
+        public boolean awaitUninterruptibly(long time, TimeUnit units)
+        {
+            try
+            {
+                isInterruptible = false;
+                super.awaitUninterruptibly(time, units);
+            }
+            finally
+            {
+                hasExited = true;
+            }
+            return false;
+        }
+
+        public Condition await() throws InterruptedException
+        {
+            try
+            {
+                isInterruptible = true;
+                super.await();
+            }
+            finally
+            {
+                hasExited = true;
+            }
+            return this;
+        }
+
+        // declared as uninterruptible to the simulator to avoid unnecessary wakeups, but handles interrupts if they arise
+        public Condition awaitDeclaredUninterruptible() throws InterruptedException
+        {
+            try
+            {
+                isInterruptible = false;
+                super.await();
+            }
+            finally
+            {
+                hasExited = true;
+            }
+            return this;
+        }
+
+        public Condition awaitUninterruptibly()
+        {
+            try
+            {
+                isInterruptible = false;
+                super.awaitUninterruptibly();
+            }
+            finally
+            {
+                hasExited = true;
+            }
+            return this;
+        }
+
+        public String toString()
+        {
+            return captureSites == null ? "" : "[" + captureSites + ']';
+        }
+    }
+
+    // debug the place at which a thread waits or is signalled
+    @Shared(scope = SIMULATION, members = ALL)
+    public static class CaptureSites
+    {
+        public static class Capture
+        {
+            public static final Capture NONE = new Capture(false, false, false);
+            public static final Capture WAKE = new Capture(true, false, false);
+            public static final Capture WAKE_AND_NOW = new Capture(true, true, false);
+
+            public final boolean waitSites;
+            public final boolean wakeSites;
+            public final boolean nowSites;
+
+            public Capture(boolean waitSites, boolean wakeSites, boolean nowSites)
+            {
+                this.waitSites = waitSites;
+                this.wakeSites = wakeSites;
+                this.nowSites = nowSites;
+            }
+
+            public boolean any()
+            {
+                return waitSites | wakeSites | nowSites;
+            }
+        }
+
+        final Thread waiting;
+        final StackTraceElement[] waitSite;
+        final Capture capture;
+        @SuppressWarnings("unused") Thread waker;
+        StackTraceElement[] wakeupSite;
+
+        public CaptureSites(Thread waiting, StackTraceElement[] waitSite, Capture capture)
+        {
+            this.waiting = waiting;
+            this.waitSite = waitSite;
+            this.capture = capture;
+        }
+
+        public CaptureSites(Thread waiting, Capture capture)
+        {
+            this.waiting = waiting;
+            this.waitSite = waiting.getStackTrace();
+            this.capture = capture;
+        }
+
+        public CaptureSites(Thread waiting)
+        {
+            this.waiting = waiting;
+            this.waitSite = waiting.getStackTrace();
+            this.capture = WAKE;
+        }
+
+        public void registerWakeup(Thread waking)
+        {
+            this.waker = waking;
+            if (capture.wakeSites)
+                this.wakeupSite = waking.getStackTrace();
+        }
+
+        public String toString(Predicate<StackTraceElement> include)
+        {
+            String tail;
+            if (wakeupSite != null)
+                tail = Threads.prettyPrint(Stream.of(wakeupSite).filter(include), true, capture.nowSites ? "]# by[" : waitSite != null ? " by[" : "by[", "; ", "]");
+            else if (capture.nowSites)
+                tail = "]#";
+            else
+                tail = "";
+            if (capture.nowSites)
+                tail = Threads.prettyPrint(Stream.of(waiting.getStackTrace()).filter(include), true, waitSite != null ? " #[" : "#[", "; ", tail);
+            if (waitSite != null)
+                tail =Threads.prettyPrint(Stream.of(waitSite).filter(include), true, "", "; ", tail);
+            return tail;
+        }
+
+        public String toString()
+        {
+            return toString(ignore -> true);
+        }
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptibleThread.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptibleThread.java
new file mode 100644
index 0000000..0cb26bf
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptibleThread.java
@@ -0,0 +1,558 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.locks.LockSupport;
+
+import io.netty.util.concurrent.FastThreadLocalThread;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IMessage;
+import org.apache.cassandra.simulator.OrderOn;
+import org.apache.cassandra.simulator.systems.InterceptedWait.Trigger;
+import org.apache.cassandra.simulator.systems.SimulatedTime.LocalTime;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.UNBOUNDED_WAIT;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.WAIT_UNTIL;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Trigger.INTERRUPT;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Trigger.SIGNAL;
+import static org.apache.cassandra.simulator.systems.InterceptibleThread.WaitTimeKind.ABSOLUTE_MILLIS;
+import static org.apache.cassandra.simulator.systems.InterceptibleThread.WaitTimeKind.NONE;
+import static org.apache.cassandra.simulator.systems.InterceptibleThread.WaitTimeKind.RELATIVE_NANOS;
+import static org.apache.cassandra.utils.Shared.Recursive.ALL;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION, ancestors = ALL, members = ALL)
+public class InterceptibleThread extends FastThreadLocalThread implements InterceptorOfConsequences
+{
+    @Shared(scope = SIMULATION)
+    enum WaitTimeKind
+    {
+        NONE, RELATIVE_NANOS, ABSOLUTE_MILLIS
+    }
+
+    // used to implement LockSupport.park/unpark
+    @Shared(scope = SIMULATION)
+    private class Parked implements InterceptedWait
+    {
+        final Kind kind;
+        final CaptureSites captureSites;
+        final InterceptorOfConsequences waitInterceptedBy;
+        final List<TriggerListener> onTrigger = new ArrayList<>(3);
+        final long waitTime;
+        boolean isDone; // we have been signalled (by the simulation or otherwise)
+        Trigger trigger;
+
+        Parked(Kind kind, CaptureSites captureSites, long waitTime, InterceptorOfConsequences waitInterceptedBy)
+        {
+            this.kind = kind;
+            this.captureSites = captureSites;
+            this.waitTime = waitTime;
+            this.waitInterceptedBy = waitInterceptedBy;
+        }
+
+        @Override
+        public Kind kind()
+        {
+            return kind;
+        }
+
+        @Override
+        public long waitTime()
+        {
+            return waitTime;
+        }
+
+        @Override
+        public boolean isTriggered()
+        {
+            return parked != this;
+        }
+
+        @Override
+        public boolean isInterruptible()
+        {
+            return true;
+        }
+
+        @Override
+        public synchronized void triggerAndAwaitDone(InterceptorOfConsequences interceptor, Trigger trigger)
+        {
+            if (parked == null)
+                return;
+
+            beforeInvocation(interceptor, this);
+
+            parked = null;
+            onTrigger.forEach(listener -> listener.onTrigger(this));
+
+            if (!preWakeup(this))
+                notify();
+
+            try
+            {
+                while (!isDone)
+                    wait();
+            }
+            catch (InterruptedException ie)
+            {
+                throw new UncheckedInterruptedException(ie);
+            }
+        }
+
+        @Override
+        public synchronized void triggerBypass()
+        {
+            parked = null;
+            notifyAll();
+            LockSupport.unpark(InterceptibleThread.this);
+        }
+
+        @Override
+        public void addListener(TriggerListener onTrigger)
+        {
+            this.onTrigger.add(onTrigger);
+        }
+
+        @Override
+        public Thread waiting()
+        {
+            return InterceptibleThread.this;
+        }
+
+        @Override
+        public synchronized void notifyThreadPaused()
+        {
+            isDone = true;
+            notifyAll();
+        }
+
+        synchronized void await()
+        {
+            try
+            {
+                while (!isTriggered())
+                    wait();
+
+                if (hasPendingInterrupt)
+                    doInterrupt();
+                hasPendingInterrupt = false;
+            }
+            catch (InterruptedException e)
+            {
+                if (!isTriggered()) throw new UncheckedInterruptedException(e);
+                else doInterrupt();
+            }
+        }
+
+        @Override
+        public void interceptWakeup(Trigger trigger, Thread by)
+        {
+            if (this.trigger != null && this.trigger.compareTo(trigger) >= 0)
+                return;
+
+            this.trigger = trigger;
+            if (captureSites != null)
+                captureSites.registerWakeup(by);
+            interceptorOrDefault(by).interceptWakeup(this, trigger, waitInterceptedBy);
+        }
+
+        @Override
+        public String toString()
+        {
+            return captureSites == null ? "" : captureSites.toString();
+        }
+    }
+
+    private static InterceptorOfConsequences debug;
+
+    final Object extraToStringInfo; // optional dynamic extra information for reporting with toString
+    final String toString;
+    final Runnable onTermination;
+    private final InterceptorOfGlobalMethods interceptorOfGlobalMethods;
+    private final LocalTime time;
+
+    // this is set before the thread's execution begins/continues; events and cessation are reported back to this
+    private InterceptorOfConsequences interceptor;
+    private NotifyThreadPaused notifyOnPause;
+
+    private boolean hasPendingUnpark;
+    private boolean hasPendingInterrupt;
+    private Parked parked;
+    private InterceptedWait waitingOn;
+
+    volatile boolean trapInterrupts = true;
+    // we need to avoid non-determinism when evaluating things in the debugger and toString() is the main culprit
+    // so we re-write toString methods to update this counter, so that while we are evaluating a toString we do not
+    // perform any non-deterministic actions
+    private int determinismDepth;
+
+    public InterceptibleThread(ThreadGroup group, Runnable target, String name, Object extraToStringInfo, Runnable onTermination, InterceptorOfGlobalMethods interceptorOfGlobalMethods, LocalTime time)
+    {
+        super(group, target, name);
+        this.onTermination = onTermination;
+        this.interceptorOfGlobalMethods = interceptorOfGlobalMethods;
+        this.time = time;
+        // group is nulled on termination, and we need it for reporting purposes, so save the toString
+        this.toString = "Thread[" + name + ',' + getPriority() + ',' + group.getName() + ']';
+        this.extraToStringInfo = extraToStringInfo;
+    }
+
+    public boolean park(long waitTime, WaitTimeKind waitTimeKind)
+    {
+        if (interceptor == null) return false;
+        if (hasPendingUnpark) hasPendingUnpark = false;
+        else if (!isInterrupted())
+        {
+            InterceptedWait.Kind kind;
+            switch (waitTimeKind)
+            {
+                default:
+                    throw new AssertionError();
+                case NONE:
+                    kind = UNBOUNDED_WAIT;
+                    break;
+                case RELATIVE_NANOS:
+                    kind = WAIT_UNTIL;
+                    waitTime = time.localToGlobalNanos(time.relativeToLocalNanos(waitTime));
+                    break;
+                case ABSOLUTE_MILLIS:
+                    kind = WAIT_UNTIL;
+                    waitTime = time.translate().fromMillisSinceEpoch(waitTime);
+            }
+
+            Parked parked = new Parked(kind, interceptorOfGlobalMethods.captureWaitSite(this), waitTime, interceptor);
+            this.parked = parked;
+            interceptWait(parked);
+            parked.await();
+        }
+        return true;
+    }
+
+    public boolean unpark(InterceptibleThread by)
+    {
+        if (by.interceptor == null) return false;
+        if (parked == null) hasPendingUnpark = true;
+        else parked.interceptWakeup(SIGNAL, by);
+        return true;
+    }
+
+    public void trapInterrupts(boolean trapInterrupts)
+    {
+        this.trapInterrupts = trapInterrupts;
+        if (!trapInterrupts && hasPendingInterrupt)
+            doInterrupt();
+    }
+
+    public boolean hasPendingInterrupt()
+    {
+        return hasPendingInterrupt;
+    }
+
+    public boolean preWakeup(InterceptedWait wakingOn)
+    {
+        assert wakingOn == waitingOn;
+        waitingOn = null;
+        if (!hasPendingInterrupt)
+            return false;
+
+        hasPendingInterrupt = false;
+        doInterrupt();
+        return true;
+    }
+
+    public void doInterrupt()
+    {
+        super.interrupt();
+    }
+
+    @Override
+    public void interrupt()
+    {
+        Thread by = Thread.currentThread();
+        if (by == this || !(by instanceof InterceptibleThread) || !trapInterrupts) doInterrupt();
+        else
+        {
+            hasPendingInterrupt = true;
+            if (waitingOn != null && waitingOn.isInterruptible())
+                waitingOn.interceptWakeup(INTERRUPT, by);
+        }
+    }
+
+    @Override
+    public void beforeInvocation(InterceptibleThread realThread)
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public void interceptMessage(IInvokableInstance from, IInvokableInstance to, IMessage message)
+    {
+        ++determinismDepth;
+        try
+        {
+            if (interceptor == null) to.receiveMessage(message);
+            else interceptor.interceptMessage(from, to, message);
+            if (debug != null) debug.interceptMessage(from, to, message);
+        }
+        finally
+        {
+            --determinismDepth;
+        }
+    }
+
+    @Override
+    public void interceptWakeup(InterceptedWait wakeup, Trigger trigger, InterceptorOfConsequences waitWasInterceptedBy)
+    {
+        ++determinismDepth;
+        try
+        {
+            interceptor.interceptWakeup(wakeup, trigger, waitWasInterceptedBy);
+            if (debug != null) debug.interceptWakeup(wakeup, trigger, waitWasInterceptedBy);
+        }
+        finally
+        {
+            --determinismDepth;
+        }
+    }
+
+    @Override
+    public void interceptExecution(InterceptedExecution invoke, OrderOn orderOn)
+    {
+        ++determinismDepth;
+        try
+        {
+            interceptor.interceptExecution(invoke, orderOn);
+            if (debug != null) debug.interceptExecution(invoke, orderOn);
+        }
+        finally
+        {
+            --determinismDepth;
+        }
+    }
+
+    @Override
+    public void interceptWait(InterceptedWait wakeupWith)
+    {
+        ++determinismDepth;
+        try
+        {
+            if (interceptor == null)
+                return;
+
+            InterceptorOfConsequences interceptor = this.interceptor;
+            NotifyThreadPaused notifyOnPause = this.notifyOnPause;
+            this.interceptor = null;
+            this.notifyOnPause = null;
+            this.waitingOn = wakeupWith;
+
+            interceptor.interceptWait(wakeupWith);
+            if (debug != null) debug.interceptWait(wakeupWith);
+            notifyOnPause.notifyThreadPaused();
+        }
+        finally
+        {
+            --determinismDepth;
+        }
+    }
+
+    public void onTermination()
+    {
+        onTermination.run();
+    }
+
+    @Override
+    public void interceptTermination(boolean isThreadTermination)
+    {
+        ++determinismDepth;
+        try
+        {
+            if (interceptor == null)
+                return;
+
+            InterceptorOfConsequences interceptor = this.interceptor;
+            NotifyThreadPaused notifyOnPause = this.notifyOnPause;
+            this.interceptor = null;
+            this.notifyOnPause = null;
+
+            interceptor.interceptTermination(isThreadTermination);
+            if (debug != null) debug.interceptTermination(isThreadTermination);
+            notifyOnPause.notifyThreadPaused();
+        }
+        finally
+        {
+            --determinismDepth;
+        }
+    }
+
+    public void beforeInvocation(InterceptorOfConsequences interceptor, NotifyThreadPaused notifyOnPause)
+    {
+        assert this.interceptor == null;
+        assert this.notifyOnPause == null;
+
+        this.interceptor = interceptor;
+        this.notifyOnPause = notifyOnPause;
+        interceptor.beforeInvocation(this);
+    }
+
+    public boolean isEvaluationDeterministic()
+    {
+        return determinismDepth > 0;
+    }
+
+    public boolean isIntercepting()
+    {
+        return interceptor != null;
+    }
+
+    public InterceptorOfConsequences interceptedBy()
+    {
+        return interceptor;
+    }
+
+    public InterceptorOfGlobalMethods interceptorOfGlobalMethods()
+    {
+        return interceptorOfGlobalMethods;
+    }
+
+    public int hashCode()
+    {
+        return toString.hashCode();
+    }
+
+    public String toString()
+    {
+        return extraToStringInfo == null ? toString : toString + ' ' + extraToStringInfo;
+    }
+
+    public static boolean isDeterministic()
+    {
+        Thread thread = Thread.currentThread();
+        return thread instanceof InterceptibleThread && ((InterceptibleThread) thread).determinismDepth > 0;
+    }
+
+    public static void runDeterministic(Runnable runnable)
+    {
+        enterDeterministicMethod();
+        try
+        {
+            runnable.run();
+        }
+        finally
+        {
+            exitDeterministicMethod();
+        }
+    }
+    
+    public static void enterDeterministicMethod()
+    {
+        Thread anyThread = Thread.currentThread();
+        if (!(anyThread instanceof InterceptibleThread))
+            return;
+
+        InterceptibleThread thread = (InterceptibleThread) anyThread;
+        ++thread.determinismDepth;
+    }
+
+    public static void exitDeterministicMethod()
+    {
+        Thread anyThread = Thread.currentThread();
+        if (!(anyThread instanceof InterceptibleThread))
+            return;
+
+        InterceptibleThread thread = (InterceptibleThread) anyThread;
+        --thread.determinismDepth;
+    }
+
+    public static void park()
+    {
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread) || !((InterceptibleThread) thread).park(-1, NONE))
+            LockSupport.park();
+    }
+
+    public static void parkNanos(long nanos)
+    {
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread) || !((InterceptibleThread) thread).park(nanos, RELATIVE_NANOS))
+            LockSupport.parkNanos(nanos);
+    }
+
+    public static void parkUntil(long millis)
+    {
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread) || !((InterceptibleThread) thread).park(millis, ABSOLUTE_MILLIS))
+            LockSupport.parkUntil(millis);
+    }
+
+    public static void park(Object blocker)
+    {
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread) || !((InterceptibleThread) thread).park(-1, NONE))
+            LockSupport.park(blocker);
+    }
+
+    public static void parkNanos(Object blocker, long relative)
+    {
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread) || !((InterceptibleThread) thread).park(relative, RELATIVE_NANOS))
+            LockSupport.parkNanos(blocker, relative);
+    }
+
+    public static void parkUntil(Object blocker, long millis)
+    {
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread) || !((InterceptibleThread) thread).park(millis, ABSOLUTE_MILLIS))
+            LockSupport.parkUntil(blocker, millis);
+    }
+
+    public static void unpark(Thread thread)
+    {
+        Thread currentThread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread) || !(currentThread instanceof InterceptibleThread)
+            || !((InterceptibleThread) thread).unpark((InterceptibleThread) currentThread))
+            LockSupport.unpark(thread);
+    }
+
+    public static InterceptorOfConsequences interceptorOrDefault(Thread thread)
+    {
+        if (!(thread instanceof InterceptibleThread))
+            return DEFAULT_INTERCEPTOR;
+
+        return interceptorOrDefault((InterceptibleThread) thread);
+    }
+
+    public static InterceptorOfConsequences interceptorOrDefault(InterceptibleThread thread)
+    {
+        return thread.isIntercepting() ? thread : DEFAULT_INTERCEPTOR;
+    }
+
+    public LocalTime time()
+    {
+        return time;
+    }
+
+    public static void setDebugInterceptor(InterceptorOfConsequences interceptor)
+    {
+        debug = interceptor;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptibleThreadFactory.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptibleThreadFactory.java
new file mode 100644
index 0000000..6579319
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptibleThreadFactory.java
@@ -0,0 +1,87 @@
+/*
+ * 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.simulator.systems;
+
+import java.io.Serializable;
+import java.util.concurrent.ThreadFactory;
+
+import org.apache.cassandra.concurrent.NamedThreadFactory;
+
+public interface InterceptibleThreadFactory extends ThreadFactory
+{
+    public interface MetaFactory<F extends ThreadFactory> extends Serializable
+    {
+        F create(String id, int priority, ClassLoader contextClassLoader, Thread.UncaughtExceptionHandler uncaughtExceptionHandler,
+                 ThreadGroup threadGroup, Runnable onTermination, SimulatedTime.LocalTime time, InterceptingExecutorFactory parent, Object extraToStringInfo);
+    }
+
+    public static class ConcreteInterceptibleThreadFactory extends NamedThreadFactory implements InterceptibleThreadFactory
+    {
+        final InterceptingExecutorFactory parent;
+        final Runnable onTermination;
+        final SimulatedTime.LocalTime time;
+        final Object extraToStringInfo;
+
+        public ConcreteInterceptibleThreadFactory(String id, int priority, ClassLoader contextClassLoader, Thread.UncaughtExceptionHandler uncaughtExceptionHandler,
+                                                  ThreadGroup threadGroup, Runnable onTermination, SimulatedTime.LocalTime time,
+                                                  InterceptingExecutorFactory parent, Object extraToStringInfo)
+        {
+            super(id, priority, contextClassLoader, threadGroup, uncaughtExceptionHandler);
+            this.onTermination = onTermination;
+            this.time = time;
+            this.parent = parent;
+            this.extraToStringInfo = extraToStringInfo;
+        }
+
+        @Override
+        public InterceptibleThread newThread(Runnable runnable)
+        {
+            return (InterceptibleThread) super.newThread(runnable);
+        }
+
+        @Override
+        protected synchronized InterceptibleThread newThread(ThreadGroup threadGroup, Runnable runnable, String name)
+        {
+            InterceptibleThread thread = new InterceptibleThread(threadGroup, runnable, name, extraToStringInfo, onTermination, parent.interceptorOfGlobalMethods, time);
+            if (parent.isClosed)
+                thread.trapInterrupts(false);
+            return setupThread(thread);
+        }
+    }
+
+    public static class PlainThreadFactory extends NamedThreadFactory
+    {
+        final Runnable onTermination;
+
+        public PlainThreadFactory(String id, int priority, ClassLoader contextClassLoader, Thread.UncaughtExceptionHandler uncaughtExceptionHandler,
+                                  ThreadGroup threadGroup, Runnable onTermination, SimulatedTime.LocalTime time, InterceptingExecutorFactory parent, Object extraToStringInfo)
+        {
+            super(id, priority, contextClassLoader, threadGroup, uncaughtExceptionHandler);
+            this.onTermination = onTermination;
+        }
+
+        @Override
+        protected Thread newThread(ThreadGroup threadGroup, Runnable runnable, String name)
+        {
+            return super.newThread(threadGroup, () -> { try { runnable.run(); } finally { onTermination.run();} }, name);
+        }
+    }
+
+    InterceptibleThread newThread(Runnable runnable);
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingAwaitable.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingAwaitable.java
new file mode 100644
index 0000000..ef4e24d
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingAwaitable.java
@@ -0,0 +1,289 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Consumer;
+
+import org.apache.cassandra.simulator.systems.InterceptedWait.InterceptedConditionWait;
+import org.apache.cassandra.simulator.systems.InterceptedWait.TriggerListener;
+import org.apache.cassandra.utils.concurrent.Awaitable;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+import org.apache.cassandra.utils.concurrent.WaitQueue;
+
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.WAIT_UNTIL;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.UNBOUNDED_WAIT;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Trigger.SIGNAL;
+import static org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods.Global.captureWaitSite;
+import static org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods.Global.ifIntercepted;
+import static org.apache.cassandra.simulator.systems.SimulatedTime.Global.localToGlobalNanos;
+import static org.apache.cassandra.simulator.systems.SimulatedTime.Global.relativeToLocalNanos;
+
+@PerClassLoader
+abstract class InterceptingAwaitable implements Awaitable
+{
+    abstract boolean isSignalled();
+    abstract Condition maybeIntercept(InterceptedWait.Kind kind, long waitNanos);
+
+    Condition maybeInterceptThrowChecked(InterceptedWait.Kind kind, long waitNanos) throws InterruptedException
+    {
+        if (Thread.interrupted())
+            throw new InterruptedException();
+
+        return maybeIntercept(kind, waitNanos);
+    }
+
+    Condition maybeInterceptThrowUnchecked(InterceptedWait.Kind kind, long waitNanos)
+    {
+        if (Thread.interrupted())
+            throw new UncheckedInterruptedException();
+
+        return maybeIntercept(kind, waitNanos);
+    }
+
+    public boolean awaitUntil(long deadline) throws InterruptedException
+    {
+        maybeInterceptThrowChecked(WAIT_UNTIL, deadline).awaitUntil(deadline);
+        return isSignalled();
+    }
+
+    public boolean awaitUntilThrowUncheckedOnInterrupt(long deadline)
+    {
+        maybeInterceptThrowUnchecked(WAIT_UNTIL, deadline).awaitUntilThrowUncheckedOnInterrupt(deadline);
+        return isSignalled();
+    }
+
+    public boolean awaitUntilUninterruptibly(long deadline)
+    {
+        maybeIntercept(WAIT_UNTIL, deadline).awaitUntilUninterruptibly(deadline);
+        return isSignalled();
+    }
+
+    public Awaitable await() throws InterruptedException
+    {
+        maybeInterceptThrowChecked(UNBOUNDED_WAIT, 0).await();
+        return this;
+    }
+
+    public Awaitable awaitThrowUncheckedOnInterrupt()
+    {
+        maybeInterceptThrowUnchecked(UNBOUNDED_WAIT, 0).awaitThrowUncheckedOnInterrupt();
+        return this;
+    }
+
+    public Awaitable awaitUninterruptibly()
+    {
+        maybeIntercept(UNBOUNDED_WAIT, 0).awaitUninterruptibly();
+        return this;
+    }
+
+    public boolean await(long time, TimeUnit units) throws InterruptedException
+    {
+        long deadline = relativeToLocalNanos(units.toNanos(time));
+        maybeInterceptThrowChecked(WAIT_UNTIL, localToGlobalNanos(deadline)).awaitUntil(deadline);
+        return isSignalled();
+    }
+
+    public boolean awaitThrowUncheckedOnInterrupt(long time, TimeUnit units)
+    {
+        long deadline = relativeToLocalNanos(units.toNanos(time));
+        maybeInterceptThrowUnchecked(WAIT_UNTIL, localToGlobalNanos(deadline)).awaitUntilThrowUncheckedOnInterrupt(deadline);
+        return isSignalled();
+    }
+
+    public boolean awaitUninterruptibly(long time, TimeUnit units)
+    {
+        long deadline = relativeToLocalNanos(units.toNanos(time));
+        maybeIntercept(WAIT_UNTIL, localToGlobalNanos(deadline)).awaitUntilUninterruptibly(deadline);
+        return isSignalled();
+    }
+
+    @PerClassLoader
+    static class InterceptingCondition extends InterceptingAwaitable implements Condition, TriggerListener
+    {
+        final Condition inner = new NotInterceptedSyncCondition();
+        private List<InterceptedConditionWait> intercepted;
+
+        public InterceptingCondition()
+        {
+        }
+
+        Condition maybeIntercept(InterceptedWait.Kind kind, long waitNanos)
+        {
+            if (inner.isSignalled())
+                return inner;
+
+            InterceptibleThread thread = ifIntercepted();
+            if (thread == null)
+                return inner;
+
+            InterceptedConditionWait signal = new InterceptedConditionWait(kind, waitNanos, thread, captureWaitSite(thread), inner);
+            synchronized (this)
+            {
+                if (intercepted == null)
+                    intercepted = new ArrayList<>(2);
+                intercepted.add(signal);
+            }
+            signal.addListener(this);
+            thread.interceptWait(signal);
+            return signal;
+        }
+
+        public boolean isSignalled()
+        {
+            return inner.isSignalled();
+        }
+
+        public void signal()
+        {
+            if (isSignalled())
+                return;
+
+            inner.signal();
+            synchronized (this)
+            {
+                if (intercepted != null)
+                {
+                    Thread signalledBy = Thread.currentThread();
+                    intercepted.forEach(signal -> signal.interceptWakeup(SIGNAL, signalledBy));
+                }
+            }
+        }
+
+        @Override
+        public synchronized void onTrigger(InterceptedWait triggered)
+        {
+            intercepted.remove(triggered);
+        }
+    }
+
+    @PerClassLoader
+    static class InterceptingCountDownLatch extends InterceptingCondition implements CountDownLatch
+    {
+        private final AtomicInteger count;
+
+        public InterceptingCountDownLatch(int count)
+        {
+            super();
+            this.count = new AtomicInteger(count);
+        }
+
+        public void decrement()
+        {
+            if (count.decrementAndGet() == 0)
+                signal();
+        }
+
+        public int count()
+        {
+            return count.get();
+        }
+    }
+
+    @PerClassLoader
+    static class InterceptingSignal<V> extends InterceptingAwaitable implements WaitQueue.Signal
+    {
+        final Condition inner = new NotInterceptedSyncCondition();
+        final V supplyOnDone;
+        final Consumer<V> receiveOnDone;
+
+        InterceptedConditionWait intercepted;
+
+        boolean isSignalled;
+        boolean isCancelled;
+
+        InterceptingSignal()
+        {
+            this(null, ignore -> {});
+        }
+
+        InterceptingSignal(V supplyOnDone, Consumer<V> receiveOnDone)
+        {
+            this.supplyOnDone = supplyOnDone;
+            this.receiveOnDone = receiveOnDone;
+        }
+
+        public boolean isSignalled()
+        {
+            return isSignalled;
+        }
+
+        public synchronized boolean isCancelled()
+        {
+            return isCancelled;
+        }
+
+        public synchronized boolean isSet()
+        {
+            return isCancelled | isSignalled;
+        }
+
+        public void signal()
+        {
+            doSignal();
+        }
+
+        synchronized boolean doSignal()
+        {
+            if (isSet())
+                return false;
+
+            isSignalled = true;
+            receiveOnDone.accept(supplyOnDone);
+            inner.signal();
+            if (intercepted != null && !intercepted.isTriggered())
+                intercepted.interceptWakeup(SIGNAL, Thread.currentThread());
+            return true;
+        }
+
+        public synchronized boolean checkAndClear()
+        {
+            if (isSet())
+                return isSignalled;
+            isCancelled = true;
+            receiveOnDone.accept(supplyOnDone);
+            inner.signal();
+            return false;
+        }
+
+        public synchronized void cancel()
+        {
+            checkAndClear();
+        }
+
+        Condition maybeIntercept(InterceptedWait.Kind kind, long waitNanos)
+        {
+            assert intercepted == null;
+            assert !inner.isSignalled();
+
+            InterceptibleThread thread = ifIntercepted();
+            if (thread == null)
+                return inner;
+
+            intercepted = new InterceptedConditionWait(kind, waitNanos, thread, captureWaitSite(thread), inner);
+            thread.interceptWait(intercepted);
+            return intercepted;
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingExecutor.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingExecutor.java
new file mode 100644
index 0000000..94e068c
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingExecutor.java
@@ -0,0 +1,1060 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.Delayed;
+import java.util.concurrent.RejectedExecutionException;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.LocalAwareExecutorPlus;
+import org.apache.cassandra.concurrent.LocalAwareSequentialExecutorPlus;
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
+import org.apache.cassandra.concurrent.SequentialExecutorPlus;
+import org.apache.cassandra.concurrent.SingleThreadExecutorPlus;
+import org.apache.cassandra.concurrent.SyncFutureTask;
+import org.apache.cassandra.concurrent.TaskFactory;
+import org.apache.cassandra.simulator.OrderOn;
+import org.apache.cassandra.simulator.systems.InterceptingAwaitable.InterceptingCondition;
+import org.apache.cassandra.simulator.systems.NotifyThreadPaused.AwaitPaused;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
+import org.apache.cassandra.utils.concurrent.NotScheduledFuture;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static java.util.Collections.newSetFromMap;
+import static java.util.Collections.synchronizedMap;
+import static java.util.Collections.synchronizedSet;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SIMULATOR_DEBUG;
+import static org.apache.cassandra.simulator.systems.InterceptibleThread.runDeterministic;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.SCHEDULED_DAEMON;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.SCHEDULED_TASK;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.SCHEDULED_TIMEOUT;
+import static org.apache.cassandra.simulator.systems.SimulatedExecution.callable;
+import static org.apache.cassandra.simulator.systems.SimulatedTime.Global.localToRelativeNanos;
+import static org.apache.cassandra.simulator.systems.SimulatedTime.Global.localToGlobalNanos;
+import static org.apache.cassandra.simulator.systems.SimulatedTime.Global.relativeToGlobalNanos;
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+// An executor whose tasks we can intercept the execution of
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface InterceptingExecutor extends OrderOn
+{
+    class ForbiddenExecutionException extends RejectedExecutionException
+    {
+    }
+
+    interface InterceptingTaskFactory extends TaskFactory
+    {
+    }
+
+    void addPending(Object task);
+    void cancelPending(Object task);
+    void submitUnmanaged(Runnable task);
+    void submitAndAwaitPause(Runnable task, InterceptorOfConsequences interceptor);
+
+    OrderOn orderAppliesAfterScheduling();
+
+    static class InterceptedScheduledFutureTask<T> extends SyncFutureTask<T> implements ScheduledFuture<T>
+    {
+        final long delayNanos;
+        Runnable onCancel;
+        public InterceptedScheduledFutureTask(long delayNanos, Callable<T> call)
+        {
+            super(call);
+            this.delayNanos = delayNanos;
+        }
+
+        @Override
+        public long getDelay(TimeUnit unit)
+        {
+            return unit.convert(delayNanos, NANOSECONDS);
+        }
+
+        @Override
+        public int compareTo(Delayed that)
+        {
+            return Long.compare(delayNanos, that.getDelay(NANOSECONDS));
+        }
+
+        void onCancel(Runnable onCancel)
+        {
+            this.onCancel = onCancel;
+        }
+
+        @Override
+        public boolean cancel(boolean b)
+        {
+            if (onCancel != null)
+            {
+                onCancel.run();
+                onCancel = null;
+            }
+            return super.cancel(b);
+        }
+    }
+
+    @PerClassLoader
+    abstract class AbstractInterceptingExecutor implements InterceptingExecutor, ExecutorPlus
+    {
+        private static final AtomicIntegerFieldUpdater<AbstractInterceptingExecutor> pendingUpdater = AtomicIntegerFieldUpdater.newUpdater(AbstractInterceptingExecutor.class, "pending");
+
+        final OrderAppliesAfterScheduling orderAppliesAfterScheduling = new OrderAppliesAfterScheduling(this);
+
+        final InterceptorOfExecution interceptorOfExecution;
+        final InterceptingTaskFactory taskFactory;
+
+        final Set<Object> debugPending = TEST_SIMULATOR_DEBUG.getBoolean() ? synchronizedSet(newSetFromMap(new IdentityHashMap<>())) : null;
+        final Condition isTerminated;
+        volatile boolean isShutdown;
+        volatile int pending;
+
+        protected AbstractInterceptingExecutor(InterceptorOfExecution interceptorOfExecution, InterceptingTaskFactory taskFactory)
+        {
+            this.interceptorOfExecution = interceptorOfExecution;
+            this.isTerminated = new InterceptingCondition();
+            this.taskFactory = taskFactory;
+        }
+
+        @Override
+        public void addPending(Object task)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            pendingUpdater.incrementAndGet(this);
+            if (isShutdown)
+            {
+                if (0 == pendingUpdater.decrementAndGet(this))
+                    terminate();
+                throw new RejectedExecutionException();
+            }
+
+            if (debugPending != null && !debugPending.add(task))
+                throw new AssertionError();
+        }
+
+        @Override
+        public void cancelPending(Object task)
+        {
+            boolean shutdown = isShutdown;
+            if (completePending(task) == 0 && shutdown)
+                terminate();
+        }
+
+        @Override
+        public OrderOn orderAppliesAfterScheduling()
+        {
+            return orderAppliesAfterScheduling;
+        }
+
+        public int completePending(Object task)
+        {
+            int remaining = pendingUpdater.decrementAndGet(this);
+            if (debugPending != null && !debugPending.remove(task))
+                throw new AssertionError();
+            return remaining;
+        }
+
+        <V, T extends RunnableFuture<V>> T addTask(T task)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            return interceptorOfExecution.intercept().addTask(task, this);
+        }
+
+        public void maybeExecuteImmediately(Runnable command)
+        {
+            execute(command);
+        }
+
+        @Override
+        public void execute(Runnable run)
+        {
+            addTask(taskFactory.toSubmit(run));
+        }
+
+        @Override
+        public void execute(WithResources withResources, Runnable run)
+        {
+            addTask(taskFactory.toSubmit(withResources, run));
+        }
+
+        @Override
+        public Future<?> submit(Runnable run)
+        {
+            return addTask(taskFactory.toSubmit(run));
+        }
+
+        @Override
+        public <T> Future<T> submit(Runnable run, T result)
+        {
+            return addTask(taskFactory.toSubmit(run, result));
+        }
+
+        @Override
+        public <T> Future<T> submit(Callable<T> call)
+        {
+            return addTask(taskFactory.toSubmit(call));
+        }
+
+        @Override
+        public <T> Future<T> submit(WithResources withResources, Runnable run, T result)
+        {
+            return addTask(taskFactory.toSubmit(withResources, run, result));
+        }
+
+        @Override
+        public Future<?> submit(WithResources withResources, Runnable run)
+        {
+            return addTask(taskFactory.toSubmit(withResources, run));
+        }
+
+        @Override
+        public <T> Future<T> submit(WithResources withResources, Callable<T> call)
+        {
+            return addTask(taskFactory.toSubmit(withResources, call));
+        }
+
+        abstract void terminate();
+
+        public boolean isShutdown()
+        {
+            return isShutdown;
+        }
+
+        public boolean isTerminated()
+        {
+            return isTerminated.isSignalled();
+        }
+
+        public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                InterceptibleThread interceptibleThread = (InterceptibleThread) thread;
+                if (interceptibleThread.isIntercepting())
+                {
+                    // simpler to use no timeout than to ensure pending tasks all run first in simulation
+                    isTerminated.await();
+                    return true;
+                }
+            }
+            return isTerminated.await(timeout, unit);
+        }
+
+        @Override
+        public void setCorePoolSize(int newCorePoolSize)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void setMaximumPoolSize(int newMaximumPoolSize)
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    @PerClassLoader
+    class InterceptingPooledExecutor extends AbstractInterceptingExecutor implements InterceptingExecutor
+    {
+        enum State { RUNNING, TERMINATING, TERMINATED }
+
+        private class WaitingThread
+        {
+            final InterceptibleThread thread;
+            Runnable task;
+            State state = State.RUNNING;
+
+            WaitingThread(ThreadFactory factory)
+            {
+                this.thread = (InterceptibleThread) factory.newThread(() -> {
+                    InterceptibleThread thread = (InterceptibleThread) Thread.currentThread();
+                    try
+                    {
+                        while (true)
+                        {
+                            try
+                            {
+                                task.run();
+                            }
+                            catch (Throwable t)
+                            {
+                                try { thread.getUncaughtExceptionHandler().uncaughtException(thread, t); }
+                                catch (Throwable ignore) {}
+                            }
+
+                            boolean shutdown = isShutdown;
+                            int remaining = completePending(task);
+                            if (shutdown && remaining < threads.size())
+                            {
+                                threads.remove(thread);
+                                thread.onTermination();
+                                if (threads.isEmpty())
+                                    isTerminated.signal(); // this has simulator side-effects, so try to perform before we interceptTermination
+                                thread.interceptTermination(true);
+                                return;
+                            }
+
+                            task = null;
+                            waiting.add(this); // inverse order of waiting.add/isShutdown to ensure visibility vs shutdown()
+                            thread.interceptTermination(false);
+                            synchronized (this)
+                            {
+                                while (task == null)
+                                {
+                                    if (state == State.TERMINATING)
+                                        return;
+
+                                    try { wait(); }
+                                    catch (InterruptedException | UncheckedInterruptedException ignore) { }
+                                }
+                            }
+                        }
+                    }
+                    finally
+                    {
+                        try
+                        {
+                            runDeterministic(() -> {
+                                if (null != threads.remove(thread))
+                                {
+                                    task = null;
+                                    waiting.remove(this);
+                                    thread.onTermination();
+                                    if (isShutdown && threads.isEmpty() && waiting.isEmpty() && !isTerminated())
+                                        isTerminated.signal();
+                                }
+                            });
+                        }
+                        finally
+                        {
+                            synchronized (this)
+                            {
+                                state = State.TERMINATED;
+                                notify();
+                            }
+                        }
+                    }
+                });
+
+                threads.put(thread, this);
+            }
+
+            synchronized void submit(Runnable task)
+            {
+                if (state != State.RUNNING)
+                    throw new IllegalStateException();
+                this.task = task;
+                if (thread.isAlive()) notify();
+                else thread.start();
+            }
+
+            synchronized void terminate()
+            {
+                if (state != State.TERMINATED)
+                    state = State.TERMINATING;
+
+                if (thread.isAlive()) notify();
+                else thread.start();
+                try
+                {
+                    while (state != State.TERMINATED)
+                        wait();
+                }
+                catch (InterruptedException e)
+                {
+                    throw new UncheckedInterruptedException(e);
+                }
+            }
+        }
+
+        final Map<InterceptibleThread, WaitingThread> threads = synchronizedMap(new IdentityHashMap<>());
+        final ThreadFactory threadFactory;
+        final Queue<WaitingThread> waiting = new ConcurrentLinkedQueue<>();
+        final int concurrency;
+
+        InterceptingPooledExecutor(InterceptorOfExecution interceptorOfExecution, int concurrency, ThreadFactory threadFactory, InterceptingTaskFactory taskFactory)
+        {
+            super(interceptorOfExecution, taskFactory);
+            this.threadFactory = threadFactory;
+            this.concurrency = concurrency;
+        }
+
+        public void submitAndAwaitPause(Runnable task, InterceptorOfConsequences interceptor)
+        {
+            // we don't check isShutdown as we could have a task queued by simulation from prior to shutdown
+            if (isTerminated()) throw new AssertionError();
+            if (debugPending != null && !debugPending.contains(task)) throw new AssertionError();
+
+            WaitingThread waiting = getWaiting();
+            AwaitPaused done = new AwaitPaused(waiting);
+            waiting.thread.beforeInvocation(interceptor, done);
+            synchronized (waiting)
+            {
+                waiting.submit(task);
+                done.awaitPause();
+            }
+        }
+
+        public void submitUnmanaged(Runnable task)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            addPending(task);
+            WaitingThread waiting = getWaiting();
+            waiting.submit(task);
+        }
+
+        private WaitingThread getWaiting()
+        {
+            WaitingThread next = waiting.poll();
+            if (next != null)
+                return next;
+
+            return new WaitingThread(threadFactory);
+        }
+
+        public synchronized void shutdown()
+        {
+            isShutdown = true;
+            WaitingThread next;
+            while (null != (next = waiting.poll()))
+                next.terminate();
+
+            if (pending == 0)
+                terminate();
+        }
+
+        synchronized void terminate()
+        {
+            List<InterceptibleThread> snapshot = new ArrayList<>(threads.keySet());
+            for (InterceptibleThread thread : snapshot)
+            {
+                WaitingThread terminate = threads.get(thread);
+                if (terminate != null)
+                    terminate.terminate();
+            }
+            runDeterministic(isTerminated::signal);
+        }
+
+        public synchronized List<Runnable> shutdownNow()
+        {
+            shutdown();
+            threads.keySet().forEach(InterceptibleThread::interrupt);
+            return Collections.emptyList();
+        }
+
+        @Override
+        public boolean inExecutor()
+        {
+            return threads.containsKey(Thread.currentThread());
+        }
+
+        @Override
+        public int getActiveTaskCount()
+        {
+            return threads.size() - waiting.size();
+        }
+
+        @Override
+        public long getCompletedTaskCount()
+        {
+            return 0;
+        }
+
+        @Override
+        public int getPendingTaskCount()
+        {
+            return 0;
+        }
+
+        @Override
+        public int getCorePoolSize()
+        {
+            return concurrency;
+        }
+
+        @Override
+        public int getMaximumPoolSize()
+        {
+            return concurrency;
+        }
+
+        public String toString()
+        {
+            return threadFactory.toString();
+        }
+
+        @Override
+        public int concurrency()
+        {
+            return concurrency;
+        }
+    }
+
+    // we might want different variants
+    // (did consider a non-intercepting variant, or immediate executor, but we need to intercept the thread events)
+    @PerClassLoader
+    abstract class AbstractSingleThreadedExecutorPlus extends AbstractInterceptingExecutor implements SequentialExecutorPlus
+    {
+        static class AtLeastOnce extends SingleThreadExecutorPlus.AtLeastOnce
+        {
+            AtLeastOnce(SequentialExecutorPlus executor, Runnable run)
+            {
+                super(executor, run);
+            }
+
+            public boolean trigger()
+            {
+                boolean success;
+                if (success = compareAndSet(false, true))
+                    executor.execute(this);
+                else
+                    executor.execute(() -> {}); // submit a no-op, so we can still impose our causality orderings
+                return success;
+            }
+        }
+
+        final InterceptibleThread thread;
+        final ArrayDeque<Runnable> queue = new ArrayDeque<>();
+        volatile boolean executing, terminating, terminated;
+
+        AbstractSingleThreadedExecutorPlus(InterceptorOfExecution interceptorOfExecution, ThreadFactory threadFactory, InterceptingTaskFactory taskFactory)
+        {
+            super(interceptorOfExecution, taskFactory);
+            this.thread = (InterceptibleThread) threadFactory.newThread(() -> {
+                InterceptibleThread thread = (InterceptibleThread) Thread.currentThread();
+                try
+                {
+                    while (true)
+                    {
+                        Runnable task;
+                        try
+                        {
+                            task = dequeue();
+                        }
+                        catch (InterruptedException | UncheckedInterruptedException ignore)
+                        {
+                            if (terminating) return;
+                            else continue;
+                        }
+
+                        try
+                        {
+                            task.run();
+                        }
+                        catch (Throwable t)
+                        {
+                            try { thread.getUncaughtExceptionHandler().uncaughtException(thread, t); }
+                            catch (Throwable ignore) {}
+                        }
+
+                        executing = false;
+                        boolean shutdown = isShutdown;
+                        if ((0 == completePending(task) && shutdown))
+                            return;
+
+                        thread.interceptTermination(false);
+                    }
+                }
+                finally
+                {
+                    runDeterministic(thread::onTermination);
+                    if (terminating)
+                    {
+                        synchronized (this)
+                        {
+                            terminated = true;
+                            notifyAll();
+                        }
+                    }
+                    else
+                    {
+                        runDeterministic(this::terminate);
+                    }
+                }
+            });
+            thread.start();
+        }
+
+        void terminate()
+        {
+            synchronized (this)
+            {
+                assert pending == 0;
+                if (terminating)
+                    return;
+
+                terminating = true;
+                if (Thread.currentThread() != thread)
+                {
+                    notifyAll();
+                    try { while (!terminated) wait(); }
+                    catch (InterruptedException e) { throw new UncheckedInterruptedException(e); }
+                }
+                terminated = true;
+            }
+
+            isTerminated.signal(); // this has simulator side-effects, so try to perform before we interceptTermination
+            if (Thread.currentThread() == thread && thread.isIntercepting())
+                thread.interceptTermination(true);
+        }
+
+        public synchronized void shutdown()
+        {
+            if (isShutdown)
+                return;
+
+            isShutdown = true;
+            if (pending == 0)
+                terminate();
+        }
+
+        public synchronized List<Runnable> shutdownNow()
+        {
+            if (isShutdown)
+                return Collections.emptyList();
+
+            isShutdown = true;
+            List<Runnable> cancelled = new ArrayList<>(queue);
+            queue.clear();
+            cancelled.forEach(super::cancelPending);
+            if (pending == 0) terminate();
+            else thread.interrupt();
+            return cancelled;
+        }
+
+        synchronized void enqueue(Runnable runnable)
+        {
+            queue.add(runnable);
+            notify();
+        }
+
+        synchronized Runnable dequeue() throws InterruptedException
+        {
+            Runnable next;
+            while (null == (next = queue.poll()) && !terminating)
+                wait();
+
+            if (next == null)
+                throw new InterruptedException();
+
+            return next;
+        }
+
+        public AtLeastOnce atLeastOnceTrigger(Runnable run)
+        {
+            return new AtLeastOnce(this, run);
+        }
+
+        @Override
+        public boolean inExecutor()
+        {
+            return thread == Thread.currentThread();
+        }
+
+        @Override
+        public int getCorePoolSize()
+        {
+            return 1;
+        }
+
+        @Override
+        public int getMaximumPoolSize()
+        {
+            return 1;
+        }
+
+        public String toString()
+        {
+            return thread.toString();
+        }
+    }
+
+    @PerClassLoader
+    class InterceptingSequentialExecutor extends AbstractSingleThreadedExecutorPlus implements InterceptingExecutor, ScheduledExecutorPlus, OrderOn
+    {
+        InterceptingSequentialExecutor(InterceptorOfExecution interceptorOfExecution, ThreadFactory threadFactory, InterceptingTaskFactory taskFactory)
+        {
+            super(interceptorOfExecution, threadFactory, taskFactory);
+        }
+
+        public void submitAndAwaitPause(Runnable task, InterceptorOfConsequences interceptor)
+        {
+            synchronized (this)
+            {
+                // we don't check isShutdown as we could have a task queued by simulation from prior to shutdown
+                if (terminated) throw new AssertionError();
+                if (executing) throw new AssertionError();
+                if (debugPending != null && !debugPending.contains(task)) throw new AssertionError();
+                executing = true;
+
+                AwaitPaused done = new AwaitPaused(this);
+                thread.beforeInvocation(interceptor, done);
+                enqueue(task);
+                done.awaitPause();
+            }
+        }
+
+        public synchronized void submitUnmanaged(Runnable task)
+        {
+            addPending(task);
+            enqueue(task);
+        }
+
+        @Override public int getActiveTaskCount()
+        {
+            return !queue.isEmpty() || executing ? 1 : 0;
+        }
+
+        @Override public long getCompletedTaskCount()
+        {
+            return 0;
+        }
+
+        @Override
+        public int getPendingTaskCount()
+        {
+            return 0;
+        }
+
+        public ScheduledFuture<?> schedule(Runnable run, long delay, TimeUnit unit)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            long delayNanos = unit.toNanos(delay);
+            return interceptorOfExecution.intercept().schedule(SCHEDULED_TASK, delayNanos, relativeToGlobalNanos(delayNanos), callable(run, null), this);
+        }
+
+        public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            long delayNanos = unit.toNanos(delay);
+            return interceptorOfExecution.intercept().schedule(SCHEDULED_TASK, delayNanos, relativeToGlobalNanos(delayNanos), callable, this);
+        }
+
+        public ScheduledFuture<?> scheduleTimeoutWithDelay(Runnable run, long delay, TimeUnit unit)
+        {
+            return scheduleTimeoutAt(run, relativeToGlobalNanos(unit.toNanos(delay)));
+        }
+
+        public ScheduledFuture<?> scheduleAt(Runnable run, long deadlineNanos)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            return interceptorOfExecution.intercept().schedule(SCHEDULED_TASK, localToRelativeNanos(deadlineNanos), localToGlobalNanos(deadlineNanos), callable(run, null), this);
+        }
+
+        public ScheduledFuture<?> scheduleTimeoutAt(Runnable run, long deadlineNanos)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            return interceptorOfExecution.intercept().schedule(SCHEDULED_TIMEOUT, localToRelativeNanos(deadlineNanos), localToGlobalNanos(deadlineNanos), callable(run, null), this);
+        }
+
+        public ScheduledFuture<?> scheduleSelfRecurring(Runnable run, long delay, TimeUnit unit)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            long delayNanos = unit.toNanos(delay);
+            return interceptorOfExecution.intercept().schedule(SCHEDULED_DAEMON, delayNanos, relativeToGlobalNanos(delayNanos), callable(run, null), this);
+        }
+
+        public ScheduledFuture<?> scheduleAtFixedRate(Runnable run, long initialDelay, long period, TimeUnit unit)
+        {
+            if (isShutdown)
+                throw new RejectedExecutionException();
+
+            long delayNanos = unit.toNanos(initialDelay);
+            return interceptorOfExecution.intercept().schedule(SCHEDULED_DAEMON, delayNanos, relativeToGlobalNanos(delayNanos), new Callable<Object>()
+            {
+                @Override
+                public Object call()
+                {
+                    run.run();
+                    if (!isShutdown)
+                        scheduleAtFixedRate(run, period, period, unit);
+                    return null;
+                }
+
+                @Override
+                public String toString()
+                {
+                    return run.toString();
+                }
+            }, this);
+        }
+
+        public ScheduledFuture<?> scheduleWithFixedDelay(Runnable run, long initialDelay, long delay, TimeUnit unit)
+        {
+            return scheduleAtFixedRate(run, initialDelay, delay, unit);
+        }
+
+        public int concurrency()
+        {
+            return 1;
+        }
+    }
+
+    @PerClassLoader
+    class InterceptingPooledLocalAwareExecutor extends InterceptingPooledExecutor implements LocalAwareExecutorPlus
+    {
+        InterceptingPooledLocalAwareExecutor(InterceptorOfExecution interceptors, int concurrency, ThreadFactory threadFactory, InterceptingTaskFactory taskFactory)
+        {
+            super(interceptors, concurrency, threadFactory, taskFactory);
+        }
+    }
+
+    @PerClassLoader
+    class InterceptingLocalAwareSequentialExecutor extends InterceptingSequentialExecutor implements LocalAwareSequentialExecutorPlus
+    {
+        InterceptingLocalAwareSequentialExecutor(InterceptorOfExecution interceptorOfExecution, ThreadFactory threadFactory, InterceptingTaskFactory taskFactory)
+        {
+            super(interceptorOfExecution, threadFactory, taskFactory);
+        }
+    }
+
+    @PerClassLoader
+    static class DiscardingSequentialExecutor implements LocalAwareSequentialExecutorPlus, ScheduledExecutorPlus
+    {
+        @Override
+        public void shutdown()
+        {
+        }
+
+        @Override
+        public List<Runnable> shutdownNow()
+        {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public boolean isShutdown()
+        {
+            return false;
+        }
+
+        @Override
+        public boolean isTerminated()
+        {
+            return false;
+        }
+
+        @Override
+        public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
+        {
+            return false;
+        }
+
+        @Override
+        public <T> Future<T> submit(Callable<T> task)
+        {
+            return ImmediateFuture.cancelled();
+        }
+
+        @Override
+        public <T> Future<T> submit(Runnable task, T result)
+        {
+            return ImmediateFuture.cancelled();
+        }
+
+        @Override
+        public Future<?> submit(Runnable task)
+        {
+            return ImmediateFuture.cancelled();
+        }
+
+        @Override
+        public void execute(WithResources withResources, Runnable task)
+        {
+        }
+
+        @Override
+        public <T> Future<T> submit(WithResources withResources, Callable<T> task)
+        {
+            return ImmediateFuture.cancelled();
+        }
+
+        @Override
+        public Future<?> submit(WithResources withResources, Runnable task)
+        {
+            return ImmediateFuture.cancelled();
+        }
+
+        @Override
+        public <T> Future<T> submit(WithResources withResources, Runnable task, T result)
+        {
+            return ImmediateFuture.cancelled();
+        }
+
+        @Override
+        public boolean inExecutor()
+        {
+            return false;
+        }
+
+        @Override
+        public int getCorePoolSize()
+        {
+            return 0;
+        }
+
+        @Override
+        public void setCorePoolSize(int newCorePoolSize)
+        {
+
+        }
+
+        @Override
+        public int getMaximumPoolSize()
+        {
+            return 0;
+        }
+
+        @Override
+        public void setMaximumPoolSize(int newMaximumPoolSize)
+        {
+
+        }
+
+        @Override
+        public int getActiveTaskCount()
+        {
+            return 0;
+        }
+
+        @Override
+        public long getCompletedTaskCount()
+        {
+            return 0;
+        }
+
+        @Override
+        public int getPendingTaskCount()
+        {
+            return 0;
+        }
+
+        @Override
+        public AtLeastOnceTrigger atLeastOnceTrigger(Runnable runnable)
+        {
+            return new AtLeastOnceTrigger()
+            {
+                @Override
+                public boolean trigger()
+                {
+                    return false;
+                }
+
+                @Override
+                public void runAfter(Runnable run)
+                {
+                }
+
+                @Override
+                public void sync()
+                {
+                }
+            };
+        }
+
+        @Override
+        public void execute(Runnable command)
+        {
+        }
+
+        @Override
+        public ScheduledFuture<?> scheduleSelfRecurring(Runnable run, long delay, TimeUnit units)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        @Override
+        public ScheduledFuture<?> scheduleAt(Runnable run, long deadline)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        @Override
+        public ScheduledFuture<?> scheduleTimeoutAt(Runnable run, long deadline)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        @Override
+        public ScheduledFuture<?> scheduleTimeoutWithDelay(Runnable run, long delay, TimeUnit units)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        @Override
+        public ScheduledFuture<?> schedule(Runnable command, long delay, TimeUnit unit)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        @Override
+        public <V> ScheduledFuture<V> schedule(Callable<V> callable, long delay, TimeUnit unit)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        @Override
+        public ScheduledFuture<?> scheduleAtFixedRate(Runnable command, long initialDelay, long period, TimeUnit unit)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        @Override
+        public ScheduledFuture<?> scheduleWithFixedDelay(Runnable command, long initialDelay, long delay, TimeUnit unit)
+        {
+            return new NotScheduledFuture<>();
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingExecutorFactory.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingExecutorFactory.java
new file mode 100644
index 0000000..c7f4dce
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingExecutorFactory.java
@@ -0,0 +1,400 @@
+/*
+ * 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.simulator.systems;
+
+import java.io.Serializable;
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.RejectedExecutionHandler;
+import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.TimeUnit;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+
+import com.google.common.annotations.VisibleForTesting;
+
+import io.netty.util.concurrent.FastThreadLocal;
+import org.apache.cassandra.concurrent.ExecutorBuilder;
+import org.apache.cassandra.concurrent.ExecutorBuilderFactory;
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.InfiniteLoopExecutor;
+import org.apache.cassandra.concurrent.InfiniteLoopExecutor.Daemon;
+import org.apache.cassandra.concurrent.InfiniteLoopExecutor.Interrupts;
+import org.apache.cassandra.concurrent.InfiniteLoopExecutor.SimulatorSafe;
+import org.apache.cassandra.concurrent.Interruptible.Task;
+import org.apache.cassandra.concurrent.LocalAwareExecutorPlus;
+import org.apache.cassandra.concurrent.LocalAwareSequentialExecutorPlus;
+import org.apache.cassandra.concurrent.ScheduledExecutorPlus;
+import org.apache.cassandra.concurrent.SequentialExecutorPlus;
+import org.apache.cassandra.concurrent.Interruptible;
+import org.apache.cassandra.concurrent.SyncFutureTask;
+import org.apache.cassandra.concurrent.TaskFactory;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableBiFunction;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableCallable;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableQuadFunction;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableSupplier;
+import org.apache.cassandra.distributed.impl.IsolatedExecutor;
+import org.apache.cassandra.simulator.systems.InterceptibleThreadFactory.ConcreteInterceptibleThreadFactory;
+import org.apache.cassandra.simulator.systems.InterceptibleThreadFactory.PlainThreadFactory;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor.DiscardingSequentialExecutor;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor.InterceptingTaskFactory;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor.InterceptingLocalAwareSequentialExecutor;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor.InterceptingPooledExecutor;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor.InterceptingPooledLocalAwareExecutor;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor.InterceptingSequentialExecutor;
+import org.apache.cassandra.simulator.systems.InterceptorOfExecution.InterceptExecution;
+import org.apache.cassandra.simulator.systems.SimulatedTime.LocalTime;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.INFINITE_LOOP;
+
+public class InterceptingExecutorFactory implements ExecutorFactory, Closeable
+{
+    static class StandardSyncTaskFactory extends TaskFactory.Standard implements InterceptingTaskFactory, Serializable
+    {
+        @Override
+        public <T> RunnableFuture<T> newTask(Callable<T> call)
+        {
+            return new SyncFutureTask<>(call);
+        }
+
+        @Override
+        protected <T> RunnableFuture<T> newTask(WithResources withResources, Callable<T> call)
+        {
+            return new SyncFutureTask<>(withResources, call);
+        }
+    }
+
+    static class LocalAwareSyncTaskFactory extends TaskFactory.LocalAware implements InterceptingTaskFactory, Serializable
+    {
+        @Override
+        public <T> RunnableFuture<T> newTask(Callable<T> call)
+        {
+            return new SyncFutureTask<>(call);
+        }
+
+        @Override
+        protected <T> RunnableFuture<T> newTask(WithResources withResources, Callable<T> call)
+        {
+            return new SyncFutureTask<>(withResources, call);
+        }
+    }
+
+    abstract static class AbstractExecutorBuilder<E extends ExecutorService> implements ExecutorBuilder<E>
+    {
+        ThreadGroup threadGroup;
+        UncaughtExceptionHandler uncaughtExceptionHandler;
+
+        @Override
+        public ExecutorBuilder<E> withKeepAlive(long keepAlive, TimeUnit keepAliveUnits)
+        {
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withKeepAlive()
+        {
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withThreadPriority(int threadPriority)
+        {
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withThreadGroup(ThreadGroup threadGroup)
+        {
+            this.threadGroup = threadGroup;
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withDefaultThreadGroup()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public ExecutorBuilder<E> withQueueLimit(int queueLimit)
+        {
+            // should implement (not pressing)
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withRejectedExecutionHandler(RejectedExecutionHandler rejectedExecutionHandler)
+        {
+            // we don't currently ever reject execution, but we should perhaps consider implementing it
+            return this;
+        }
+
+        @Override
+        public ExecutorBuilder<E> withUncaughtExceptionHandler(UncaughtExceptionHandler uncaughtExceptionHandler)
+        {
+            this.uncaughtExceptionHandler = uncaughtExceptionHandler;
+            return this;
+        }
+    }
+
+    class SimpleExecutorBuilder<E extends ExecutorService> extends AbstractExecutorBuilder<E>
+    {
+        ThreadGroup threadGroup;
+
+        final String name;
+        final SerializableBiFunction<InterceptorOfExecution, ThreadFactory, E> factory;
+
+        SimpleExecutorBuilder(String name, SerializableBiFunction<InterceptorOfExecution, ThreadFactory, E> factory)
+        {
+            this.factory = factory;
+            this.name = name;
+        }
+
+        @Override
+        public E build()
+        {
+            return transferToInstance.apply(factory).apply(simulatedExecution, factory(name, null, threadGroup, uncaughtExceptionHandler));
+        }
+    }
+
+    final SimulatedExecution simulatedExecution;
+    final InterceptorOfGlobalMethods interceptorOfGlobalMethods;
+    final ClassLoader classLoader;
+    final ThreadGroup threadGroup;
+    final IIsolatedExecutor.DynamicFunction<Serializable> transferToInstance;
+    volatile boolean isClosed;
+
+    InterceptingExecutorFactory(SimulatedExecution simulatedExecution, InterceptorOfGlobalMethods interceptorOfGlobalMethods, ClassLoader classLoader, ThreadGroup threadGroup)
+    {
+        this.simulatedExecution = simulatedExecution;
+        this.interceptorOfGlobalMethods = interceptorOfGlobalMethods;
+        this.classLoader = classLoader;
+        this.threadGroup = threadGroup;
+        this.transferToInstance = IsolatedExecutor.transferTo(classLoader);
+    }
+
+    public InterceptibleThreadFactory factory(String name)
+    {
+        return factory(name, null);
+    }
+
+    InterceptibleThreadFactory factory(String name, Object extraInfo)
+    {
+        return factory(name, extraInfo, threadGroup);
+    }
+
+    InterceptibleThreadFactory factory(String name, Object extraInfo, ThreadGroup threadGroup)
+    {
+        return factory(name, extraInfo, threadGroup, null);
+    }
+
+    InterceptibleThreadFactory factory(String name, Object extraInfo, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler)
+    {
+        return factory(name, extraInfo, threadGroup, uncaughtExceptionHandler, ConcreteInterceptibleThreadFactory::new);
+    }
+
+    ThreadFactory plainFactory(String name, Object extraInfo, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler)
+    {
+        return factory(name, extraInfo, threadGroup, uncaughtExceptionHandler, PlainThreadFactory::new);
+    }
+
+    <F extends ThreadFactory> F factory(String name, Object extraInfo, ThreadGroup threadGroup, UncaughtExceptionHandler uncaughtExceptionHandler, InterceptibleThreadFactory.MetaFactory<F> factory)
+    {
+        if (uncaughtExceptionHandler == null)
+            uncaughtExceptionHandler = transferToInstance.apply((SerializableSupplier<UncaughtExceptionHandler>)() -> InterceptorOfGlobalMethods.Global::uncaughtException).get();
+
+        if (threadGroup == null) threadGroup = this.threadGroup;
+        else if (!this.threadGroup.parentOf(threadGroup)) throw new IllegalArgumentException();
+        Runnable onTermination = transferToInstance.apply((SerializableRunnable)FastThreadLocal::removeAll);
+        LocalTime time = transferToInstance.apply((SerializableCallable<LocalTime>) SimulatedTime.Global::current).call();
+        return factory.create(name, Thread.NORM_PRIORITY, classLoader, uncaughtExceptionHandler, threadGroup, onTermination, time, this, extraInfo);
+    }
+
+    @Override
+    public ExecutorBuilderFactory<ExecutorPlus, SequentialExecutorPlus> withJmx(String jmxPath)
+    {
+        return this;
+    }
+
+    @Override
+    public ExecutorBuilderFactory<ExecutorPlus, SequentialExecutorPlus> withJmxInternal()
+    {
+        return this;
+    }
+
+    @Override
+    public ExecutorBuilder<? extends SequentialExecutorPlus> configureSequential(String name)
+    {
+        return new SimpleExecutorBuilder<>(name, (interceptSupplier, threadFactory) -> new InterceptingSequentialExecutor(interceptSupplier, threadFactory, new StandardSyncTaskFactory()));
+    }
+
+    @Override
+    public ExecutorBuilder<? extends ExecutorPlus> configurePooled(String name, int threads)
+    {
+        return new SimpleExecutorBuilder<>(name, (interceptSupplier, threadFactory) -> new InterceptingPooledExecutor(interceptSupplier, threads, threadFactory, new StandardSyncTaskFactory()));
+    }
+
+    public SequentialExecutorPlus sequential(String name)
+    {
+        return configureSequential(name).build();
+    }
+
+    @Override
+    public LocalAwareSubFactory localAware()
+    {
+        return new LocalAwareSubFactory()
+        {
+            @Override
+            public LocalAwareSubFactoryWithJMX withJmx(String jmxPath)
+            {
+                return new LocalAwareSubFactoryWithJMX()
+                {
+                    @Override
+                    public LocalAwareExecutorPlus shared(String name, int threads, ExecutorPlus.MaximumPoolSizeListener onSetMaxSize)
+                    {
+                        return pooled(name, threads);
+                    }
+
+                    @Override
+                    public ExecutorBuilder<? extends LocalAwareSequentialExecutorPlus> configureSequential(String name)
+                    {
+                        return new SimpleExecutorBuilder<>(name, (interceptSupplier, threadFactory) -> new InterceptingLocalAwareSequentialExecutor(interceptSupplier, threadFactory, new LocalAwareSyncTaskFactory()));
+                    }
+
+                    @Override
+                    public ExecutorBuilder<? extends LocalAwareExecutorPlus> configurePooled(String name, int threads)
+                    {
+                        return new SimpleExecutorBuilder<>(name, (interceptSupplier, threadFactory) -> new InterceptingPooledLocalAwareExecutor(interceptSupplier, threads, threadFactory, new LocalAwareSyncTaskFactory()));
+                    }
+                };
+            }
+
+            @Override
+            public ExecutorBuilder<? extends LocalAwareSequentialExecutorPlus> configureSequential(String name)
+            {
+                return new SimpleExecutorBuilder<>(name, (interceptSupplier, threadFactory) -> new InterceptingLocalAwareSequentialExecutor(interceptSupplier, threadFactory, new LocalAwareSyncTaskFactory()));
+            }
+
+            @Override
+            public ExecutorBuilder<? extends LocalAwareExecutorPlus> configurePooled(String name, int threads)
+            {
+                return new SimpleExecutorBuilder<>(name, (interceptSupplier, threadFactory) -> new InterceptingPooledLocalAwareExecutor(interceptSupplier, threads, threadFactory, new LocalAwareSyncTaskFactory()));
+            }
+        };
+    }
+
+    @Override
+    public ScheduledExecutorPlus scheduled(boolean executeOnShutdown, String name, int priority, SimulatorSemantics simulatorSemantics)
+    {
+        switch (simulatorSemantics)
+        {
+            default: throw new AssertionError();
+            case NORMAL:
+                return transferToInstance.apply((SerializableBiFunction<InterceptorOfExecution, ThreadFactory, ScheduledExecutorPlus>) (interceptSupplier, threadFactory) -> new InterceptingSequentialExecutor(interceptSupplier, threadFactory, new StandardSyncTaskFactory())).apply(simulatedExecution, factory(name));
+            case DISCARD:
+                return transferToInstance.apply((SerializableSupplier<ScheduledExecutorPlus>) DiscardingSequentialExecutor::new).get();
+        }
+    }
+
+    @Override
+    public ExecutorPlus pooled(String name, int threads)
+    {
+        if (threads == 1)
+            return configureSequential(name).build();
+        return configurePooled(name, threads).build();
+    }
+
+    public Thread startThread(String name, Runnable runnable, Daemon daemon)
+    {
+        return simulatedExecution.intercept().start(SimulatedAction.Kind.THREAD, factory(name)::newThread, runnable);
+    }
+
+    @VisibleForTesting
+    public InterceptedExecution.InterceptedThreadStart startParked(String name, Runnable run)
+    {
+        return new InterceptedExecution.InterceptedThreadStart(factory(name)::newThread,
+                                                               run,
+                                                               SimulatedAction.Kind.THREAD);
+    }
+
+    @Override
+    public Interruptible infiniteLoop(String name, Task task, SimulatorSafe simulatorSafe, Daemon daemon, Interrupts interrupts)
+    {
+        if (simulatorSafe != SimulatorSafe.SAFE)
+        {
+            // avoid use rewritten classes here (so use system class loader's ILE), as we cannot fully control the thread's execution
+            return new InfiniteLoopExecutor((n, t) -> {
+                Thread thread = plainFactory(n, t, threadGroup, null).newThread(t);
+                thread.start();
+                return thread;
+            }, name, task, interrupts);
+        }
+
+        InterceptExecution interceptor = simulatedExecution.intercept();
+        return transferToInstance.apply((SerializableQuadFunction<BiFunction<String, Runnable, Thread>, String, Task, Interrupts, Interruptible>)InfiniteLoopExecutor::new)
+                                 .apply((n, r) -> interceptor.start(INFINITE_LOOP, factory(n, task)::newThread, r), name, task, interrupts);
+    }
+
+    @Override
+    public ThreadGroup newThreadGroup(String name)
+    {
+        return new ThreadGroup(threadGroup, name);
+    }
+
+    public void close()
+    {
+        isClosed = true;
+        forEach(threadGroup, thread -> {
+            thread.trapInterrupts(false);
+            thread.interrupt();
+        });
+        threadGroup.interrupt();
+    }
+
+    public void interrupt()
+    {
+        threadGroup.interrupt();
+    }
+
+    private static void forEach(ThreadGroup threadGroup, Consumer<InterceptibleThread> consumer)
+    {
+        Thread[] threads;
+        ThreadGroup[] groups;
+        synchronized (threadGroup)
+        {
+            threads = new Thread[threadGroup.activeCount()];
+            threadGroup.enumerate(threads, false);
+            groups = new ThreadGroup[threadGroup.activeGroupCount()];
+            threadGroup.enumerate(groups, false);
+        }
+        for (Thread thread : threads)
+        {
+            if (thread instanceof InterceptibleThread)
+                consumer.accept((InterceptibleThread) thread);
+        }
+        for (ThreadGroup group : groups) forEach(group, consumer);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingGlobalMethods.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingGlobalMethods.java
new file mode 100644
index 0000000..45a64f4
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingGlobalMethods.java
@@ -0,0 +1,225 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.UUID;
+import java.util.function.Consumer;
+import java.util.function.LongConsumer;
+
+import javax.annotation.Nullable;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites.Capture;
+import org.apache.cassandra.simulator.systems.InterceptedWait.InterceptedConditionWait;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+import org.apache.cassandra.utils.concurrent.WaitQueue;
+
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SIMULATOR_DETERMINISM_CHECK;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.NEMESIS;
+import static org.apache.cassandra.simulator.systems.NonInterceptible.Permit.OPTIONAL;
+import static org.apache.cassandra.simulator.systems.NonInterceptible.Permit.REQUIRED;
+
+@PerClassLoader
+public class InterceptingGlobalMethods extends InterceptingMonitors implements InterceptorOfGlobalMethods
+{
+    private static final Logger logger = LoggerFactory.getLogger(InterceptingGlobalMethods.class);
+    private static final boolean isDeterminismCheckStrict = TEST_SIMULATOR_DETERMINISM_CHECK.convert(name -> name.equals("strict"));
+
+    private final @Nullable LongConsumer onThreadLocalRandomCheck;
+    private final Capture capture;
+    private int uniqueUuidCounter = 0;
+    private final Consumer<Throwable> onUncaughtException;
+
+    public InterceptingGlobalMethods(Capture capture, LongConsumer onThreadLocalRandomCheck, Consumer<Throwable> onUncaughtException, RandomSource random)
+    {
+        super(random);
+        this.capture = capture.any() ? capture : null;
+        this.onThreadLocalRandomCheck = onThreadLocalRandomCheck;
+        this.onUncaughtException = onUncaughtException;
+    }
+
+    @Override
+    public WaitQueue newWaitQueue()
+    {
+        return new InterceptingWaitQueue();
+    }
+
+    @Override
+    public CountDownLatch newCountDownLatch(int count)
+    {
+        return new InterceptingAwaitable.InterceptingCountDownLatch(count);
+    }
+
+    @Override
+    public Condition newOneTimeCondition()
+    {
+        return new InterceptingAwaitable.InterceptingCondition();
+    }
+
+    @Override
+    public InterceptedWait.CaptureSites captureWaitSite(Thread thread)
+    {
+        if (capture == null)
+            return null;
+
+        return new InterceptedWait.CaptureSites(thread, capture);
+    }
+
+    @Override
+    public InterceptibleThread ifIntercepted()
+    {
+        Thread thread = Thread.currentThread();
+        if (thread instanceof InterceptibleThread)
+        {
+            InterceptibleThread interceptibleThread = (InterceptibleThread) thread;
+            if (interceptibleThread.isIntercepting())
+                return interceptibleThread;
+        }
+
+        if (NonInterceptible.isPermitted())
+            return null;
+
+        if (!disabled)
+            throw failWithOOM();
+
+        return null;
+    }
+
+    @Override
+    public void uncaughtException(Thread thread, Throwable throwable)
+    {
+        onUncaughtException.accept(throwable);
+    }
+
+    @Override
+    public void nemesis(float chance)
+    {
+        InterceptibleThread thread = ifIntercepted();
+        if (thread == null || thread.isEvaluationDeterministic() || !random.decide(chance))
+            return;
+
+        InterceptedConditionWait signal = new InterceptedConditionWait(NEMESIS, 0L, thread, captureWaitSite(thread), null);
+        thread.interceptWait(signal);
+
+        // save interrupt state to restore afterwards - new ones only arrive if terminating simulation
+        boolean restoreInterrupt = Thread.interrupted();
+        try
+        {
+            while (true)
+            {
+                try
+                {
+                    signal.awaitDeclaredUninterruptible();
+                    return;
+                }
+                catch (InterruptedException e)
+                {
+                    restoreInterrupt = true;
+                    if (disabled)
+                        return;
+                }
+            }
+        }
+        finally
+        {
+            if (restoreInterrupt)
+                thread.interrupt();
+        }
+    }
+
+    @Override
+    public long randomSeed()
+    {
+        InterceptibleThread thread = ifIntercepted();
+        if (thread == null || thread.isEvaluationDeterministic())
+            return Thread.currentThread().getName().hashCode();
+
+        return random.uniform(Long.MIN_VALUE, Long.MAX_VALUE);
+    }
+
+    @Override
+    public synchronized UUID randomUUID()
+    {
+        long msb = random.uniform(0, 1L << 60);
+        msb = ((msb << 4) & 0xffffffffffff0000L) | 0x4000 | (msb & 0xfff);
+        return new UUID(msb, (1L << 63) | uniqueUuidCounter++);
+    }
+
+    @Override
+    public void threadLocalRandomCheck(long seed)
+    {
+        if (onThreadLocalRandomCheck != null)
+            onThreadLocalRandomCheck.accept(seed);
+    }
+
+    public static class ThreadLocalRandomCheck implements LongConsumer
+    {
+        final LongConsumer wrapped;
+        private boolean disabled;
+
+        public ThreadLocalRandomCheck(LongConsumer wrapped)
+        {
+            this.wrapped = wrapped;
+        }
+
+        @Override
+        public void accept(long value)
+        {
+            if (wrapped != null)
+                wrapped.accept(value);
+
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                InterceptibleThread interceptibleThread = (InterceptibleThread) thread;
+                if (interceptibleThread.isIntercepting())
+                    return;
+            }
+
+            if (NonInterceptible.isPermitted(isDeterminismCheckStrict ? OPTIONAL : REQUIRED))
+                return;
+
+            if (!disabled)
+                throw failWithOOM();
+        }
+
+        public void stop()
+        {
+            disabled = true;
+        }
+    }
+
+    @Override
+    public long nanoTime()
+    {
+        return Clock.Global.nanoTime();
+    }
+
+    @Override
+    public long currentTimeMillis()
+    {
+        return Clock.Global.currentTimeMillis();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingMonitors.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingMonitors.java
new file mode 100644
index 0000000..eab35de
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingMonitors.java
@@ -0,0 +1,878 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayDeque;
+import java.util.ArrayList;
+import java.util.Deque;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.nicoulaj.compilecommand.annotations.Inline;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.systems.InterceptedWait.InterceptedConditionWait;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.concurrent.Awaitable.SyncAwaitable;
+import org.apache.cassandra.utils.concurrent.Threads;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.TEST_SIMULATOR_DEBUG;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.NEMESIS;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.SLEEP_UNTIL;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.UNBOUNDED_WAIT;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.WAIT_UNTIL;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Trigger.SIGNAL;
+import static org.apache.cassandra.simulator.systems.InterceptibleThread.interceptorOrDefault;
+import static org.apache.cassandra.simulator.systems.InterceptingMonitors.WaitListAccessor.LOCK;
+import static org.apache.cassandra.simulator.systems.InterceptingMonitors.WaitListAccessor.NOTIFY;
+import static org.apache.cassandra.simulator.systems.SimulatedTime.Global.relativeToGlobalNanos;
+
+@PerClassLoader
+@SuppressWarnings("SynchronizationOnLocalVariableOrMethodParameter")
+public abstract class InterceptingMonitors implements InterceptorOfGlobalMethods, Closeable
+{
+    private static final Logger logger = LoggerFactory.getLogger(InterceptingMonitors.class);
+    private static final boolean DEBUG_MONITOR_STATE = TEST_SIMULATOR_DEBUG.getBoolean();
+
+    static class MonitorState
+    {
+        InterceptedMonitorWait waitingOnNotify;
+        InterceptedMonitorWait waitingOnLock;
+        /**
+         * The thread we have assigned lock ownership to.
+         * This may not be actively holding the lock, if
+         * we found it waiting for the monitor and assigned
+         * it to receive
+         */
+        InterceptibleThread heldBy;
+        int depth;
+        int suspended;
+        Deque<Object> recentActions = DEBUG_MONITOR_STATE ? new ArrayDeque<>() : null;
+
+        boolean isEmpty()
+        {
+            return depth == 0 && waitingOnLock == null && waitingOnNotify == null && suspended == 0;
+        }
+
+        InterceptedMonitorWait removeAllWaitingOn(WaitListAccessor list)
+        {
+            InterceptedMonitorWait result = list.head(this);
+            list.setHead(this, null);
+
+            InterceptedMonitorWait cur = result;
+            while (cur != null)
+            {
+                InterceptedMonitorWait next = cur.next;
+                cur.waitingOn = null;
+                cur.next = null;
+                cur = next;
+            }
+            return result;
+        }
+
+        void removeWaitingOn(InterceptedMonitorWait remove)
+        {
+            if (remove.waitingOn != null)
+            {
+                InterceptedMonitorWait head = remove.waitingOn.head(this);
+                remove.waitingOn.setHead(this, head.remove(remove));
+                assert remove.next == null;
+            }
+        }
+
+        @Inline
+        InterceptedMonitorWait removeOneWaitingOn(WaitListAccessor list, RandomSource random)
+        {
+            InterceptedMonitorWait head = list.head(this);
+            if (head == null)
+                return null;
+
+            if (head.next == null)
+            {
+                list.setHead(this, null);
+                head.waitingOn = null;
+                return head;
+            }
+
+            int i = random.uniform(0, 1 + head.nextLength);
+            if (i == 0)
+            {
+                list.setHead(this, head.next);
+                head.next.nextLength = head.nextLength - 1;
+                head.next = null;
+                head.waitingOn = null;
+                return head;
+            }
+
+            InterceptedMonitorWait pred = head;
+            while (--i > 0)
+                pred = pred.next;
+
+            InterceptedMonitorWait result = pred.next;
+            pred.next = result.next;
+            --head.nextLength;
+            result.next = null;
+            result.waitingOn = null;
+            return result;
+        }
+
+        void waitOn(WaitListAccessor list, InterceptedMonitorWait wait)
+        {
+            assert wait.waitingOn == null;
+            wait.waitingOn = list;
+
+            assert wait.next == null;
+            InterceptedMonitorWait head = list.head(this);
+            if (head != null)
+            {
+                wait.next = head.next;
+                head.next = wait;
+                ++head.nextLength;
+            }
+            else
+            {
+                list.setHead(this, wait);
+                wait.nextLength = 0;
+            }
+        }
+
+        void suspend(InterceptedMonitorWait wait)
+        {
+            assert heldBy == wait.waiting;
+            wait.suspendMonitor(depth);
+            ++suspended;
+            heldBy = null;
+            depth = 0;
+        }
+
+        void restore(InterceptedMonitorWait wait)
+        {
+            assert heldBy == null || heldBy == wait.waiting;
+            assert depth == 0;
+            assert suspended > 0;
+            heldBy = wait.waiting;
+            depth = wait.unsuspendMonitor();
+            --suspended;
+        }
+
+        void claim(InterceptedMonitorWait wait)
+        {
+            assert heldBy == null || heldBy == wait.waiting;
+            assert depth == 0;
+            heldBy = wait.waiting;
+            depth = wait.unsuspendMonitor();
+        }
+
+        void log(Object event, Thread toThread, Thread byThread)
+        {
+            if (recentActions != null)
+                log(event + " " + toThread + " by " + byThread);
+        }
+
+        void log(Object event, Thread toThread)
+        {
+            if (recentActions != null)
+                log(event + " " + toThread);
+        }
+
+        void log(Object event)
+        {
+            if (recentActions == null)
+                return;
+
+            if (recentActions.size() > 20)
+                recentActions.poll();
+            recentActions.add(event + " " + depth);
+        }
+    }
+
+    interface WaitListAccessor
+    {
+        static final WaitListAccessor NOTIFY = new WaitListAccessor()
+        {
+            @Override public InterceptedMonitorWait head(MonitorState state) { return state.waitingOnNotify; }
+            @Override public void setHead(MonitorState state, InterceptedMonitorWait newHead) { state.waitingOnNotify = newHead; }
+        };
+
+        static final WaitListAccessor LOCK = new WaitListAccessor()
+        {
+            @Override public InterceptedMonitorWait head(MonitorState state) { return state.waitingOnLock; }
+            @Override public void setHead(MonitorState state, InterceptedMonitorWait newHead) { state.waitingOnLock = newHead; }
+        };
+
+        InterceptedMonitorWait head(MonitorState state);
+        void setHead(MonitorState state, InterceptedMonitorWait newHead);
+    }
+
+    static class InterceptedMonitorWait implements InterceptedWait
+    {
+        Kind kind;
+        final long waitTime;
+        final InterceptibleThread waiting;
+        final CaptureSites captureSites;
+        final InterceptorOfConsequences interceptedBy;
+        final MonitorState state;
+        final Object monitor;
+        int suspendedMonitorDepth;
+
+        Trigger trigger;
+        boolean isTriggered;
+        final List<TriggerListener> onTrigger = new ArrayList<>(3);
+
+        boolean notifiedOfPause;
+        boolean waitingOnRelinquish;
+
+        WaitListAccessor waitingOn;
+        volatile InterceptedMonitorWait next;
+        int nextLength;
+        boolean hasExited;
+
+        InterceptedMonitorWait(Kind kind, long waitTime, MonitorState state, InterceptibleThread waiting, CaptureSites captureSites)
+        {
+            this.kind = kind;
+            this.waitTime = waitTime;
+            this.waiting = waiting;
+            this.captureSites = captureSites;
+            this.interceptedBy = waiting.interceptedBy();
+            this.state = state;
+            this.monitor = this;
+        }
+
+        InterceptedMonitorWait(Kind kind, long waitTime, MonitorState state, InterceptibleThread waiting, CaptureSites captureSites, Object object)
+        {
+            this.kind = kind;
+            this.waitTime = waitTime;
+            this.waiting = waiting;
+            this.captureSites = captureSites;
+            this.interceptedBy = waiting.interceptedBy();
+            this.state = state;
+            this.monitor = object;
+        }
+
+        @Override
+        public Kind kind()
+        {
+            return kind;
+        }
+
+        void suspendMonitor(int depth)
+        {
+            assert suspendedMonitorDepth == 0;
+            suspendedMonitorDepth = depth;
+        }
+
+        int unsuspendMonitor()
+        {
+            assert suspendedMonitorDepth > 0;
+            int result = suspendedMonitorDepth;
+            suspendedMonitorDepth = 0;
+            return result;
+        }
+
+        public boolean isTriggered()
+        {
+            return isTriggered;
+        }
+
+        public boolean isInterruptible()
+        {
+            return true;
+        }
+
+        @Override
+        public long waitTime()
+        {
+            return waitTime;
+        }
+
+        @Override
+        public void interceptWakeup(Trigger trigger, Thread by)
+        {
+            if (this.trigger != null && this.trigger.compareTo(trigger) >= 0)
+                return;
+
+            this.trigger = trigger;
+            if (captureSites != null)
+                captureSites.registerWakeup(by);
+            interceptorOrDefault(by).interceptWakeup(this, trigger, interceptedBy);
+        }
+
+        public void triggerAndAwaitDone(InterceptorOfConsequences interceptor, Trigger trigger)
+        {
+            if (isTriggered)
+                return;
+
+            if (hasExited)
+                throw failWithOOM();
+
+            state.removeWaitingOn(this); // if still present, remove
+
+            // we may have been assigned ownership of the lock if we attempted to trigger but found the lock held
+            if (state.heldBy != null && state.heldBy != waiting)
+            {   // reset this condition to wait on lock release
+                state.waitOn(LOCK, this);
+                this.kind = UNBOUNDED_WAIT;
+                this.trigger = null;
+                interceptor.beforeInvocation(waiting);
+                interceptor.interceptWait(this);
+                return;
+            }
+
+            try
+            {
+                synchronized (monitor)
+                {
+                    waiting.beforeInvocation(interceptor, this);
+
+                    isTriggered = true;
+                    onTrigger.forEach(listener -> listener.onTrigger(this));
+
+                    if (!waiting.preWakeup(this))
+                        monitor.notifyAll(); // TODO: could use interrupts to target waiting anyway, avoiding notifyAll()
+
+                    while (!notifiedOfPause)
+                        monitor.wait();
+
+                    if (waitingOnRelinquish)
+                    {
+                        waitingOnRelinquish = false;
+                        monitor.notifyAll(); // TODO: could use interrupts to target waiting anyway, avoiding notifyAll()
+                    }
+                }
+            }
+            catch (InterruptedException ie)
+            {
+                throw new UncheckedInterruptedException(ie);
+            }
+        }
+
+        @Override
+        public void triggerBypass()
+        {
+            if (isTriggered)
+                return;
+
+            synchronized (monitor)
+            {
+                isTriggered = true;
+                monitor.notifyAll();
+                state.removeWaitingOn(this);
+            }
+        }
+
+        @Override
+        public void addListener(TriggerListener onTrigger)
+        {
+            this.onTrigger.add(onTrigger);
+        }
+
+        @Override
+        public Thread waiting()
+        {
+            return waiting;
+        }
+
+        @Override
+        public void notifyThreadPaused()
+        {
+            notifiedOfPause = true;
+            if (Thread.holdsLock(monitor))
+            {
+                monitor.notifyAll();
+                waitingOnRelinquish = true;
+                try { while (waitingOnRelinquish) monitor.wait(); }
+                catch (InterruptedException e) { throw new UncheckedInterruptedException(e); }
+            }
+            else
+            {
+                synchronized (monitor)
+                {
+                    monitor.notifyAll();
+                }
+            }
+        }
+
+        void await() throws InterruptedException
+        {
+            try
+            {
+                while (!isTriggered())
+                    monitor.wait();
+            }
+            finally
+            {
+                hasExited = true;
+            }
+        }
+
+        InterceptedMonitorWait remove(InterceptedMonitorWait remove)
+        {
+            remove.waitingOn = null;
+
+            if (remove == this)
+            {
+                InterceptedMonitorWait next = this.next;
+                if (next != null)
+                {
+                    next.nextLength = nextLength - 1;
+                    remove.next = null;
+                }
+
+                return next;
+            }
+
+            InterceptedMonitorWait cur = this;
+            while (cur != null && cur.next != remove)
+                cur = cur.next;
+
+            if (cur != null)
+            {
+                cur.next = remove.next;
+                remove.next = null;
+                --nextLength;
+            }
+            return this;
+        }
+
+        public String toString()
+        {
+            return captureSites == null ? "" : "[" + captureSites + ']';
+        }
+    }
+
+    final RandomSource random;
+    private final Map<Object, MonitorState> monitors = new IdentityHashMap<>();
+    private final Map<Thread, Object> waitingOn = new IdentityHashMap<>();
+    protected boolean disabled;
+
+    public InterceptingMonitors(RandomSource random)
+    {
+        this.random = random;
+    }
+
+    private MonitorState state(Object monitor)
+    {
+        return monitors.computeIfAbsent(monitor, ignore -> new MonitorState());
+    }
+
+    private MonitorState maybeState(Object monitor)
+    {
+        return monitors.get(monitor);
+    }
+
+    private void maybeClear(Object monitor, MonitorState state)
+    {
+        if (state.isEmpty())
+            monitors.remove(monitor, state);
+    }
+
+    @Override
+    public void waitUntil(long deadline) throws InterruptedException
+    {
+        InterceptibleThread thread = ifIntercepted();
+        if (thread == null)
+        {
+            Clock.waitUntil(deadline);
+            return;
+        }
+
+        if (Thread.interrupted())
+            throw new InterruptedException();
+
+        InterceptedMonitorWait trigger = new InterceptedMonitorWait(SLEEP_UNTIL, deadline, new MonitorState(), thread, captureWaitSite(thread));
+        thread.interceptWait(trigger);
+        synchronized (trigger)
+        {
+            try
+            {
+                trigger.await();
+            }
+            catch (InterruptedException e)
+            {
+                if (!trigger.isTriggered)
+                    throw e;
+            }
+        }
+    }
+
+    @Override
+    public void sleep(long period, TimeUnit units) throws InterruptedException
+    {
+        waitUntil(nanoTime() + units.toNanos(period));
+    }
+
+    @Override
+    public void sleepUninterriptibly(long period, TimeUnit units)
+    {
+        try
+        {
+            sleep(period, units);
+        }
+        catch (InterruptedException e)
+        {
+            // instead of looping uninterruptibly
+            throw new UncheckedInterruptedException(e);
+        }
+    }
+
+    public boolean waitUntil(Object monitor, long deadline) throws InterruptedException
+    {
+        InterceptibleThread thread = ifIntercepted();
+        if (thread == null) return SyncAwaitable.waitUntil(monitor, deadline);
+        else return wait(monitor, thread, WAIT_UNTIL, deadline);
+    }
+
+    @Override
+    public void wait(Object monitor) throws InterruptedException
+    {
+        InterceptibleThread thread = ifIntercepted();
+        if (thread == null) monitor.wait();
+        else wait(monitor, thread, UNBOUNDED_WAIT, -1L);
+    }
+
+    @Override
+    public void wait(Object monitor, long millis) throws InterruptedException
+    {
+        InterceptibleThread thread = ifIntercepted();
+        if (thread == null) monitor.wait(millis);
+        else wait(monitor, thread, WAIT_UNTIL, relativeToGlobalNanos(MILLISECONDS.toNanos(millis)));
+    }
+
+    @Override
+    public void wait(Object monitor, long millis, int nanos) throws InterruptedException
+    {
+        InterceptibleThread thread = ifIntercepted();
+        if (thread == null) monitor.wait(millis, nanos);
+        else wait(monitor, thread, WAIT_UNTIL, relativeToGlobalNanos(MILLISECONDS.toNanos(millis) + nanos));
+    }
+
+    private boolean wait(Object monitor, InterceptibleThread thread, InterceptedWait.Kind kind, long waitNanos) throws InterruptedException
+    {
+        if (Thread.interrupted())
+            throw new InterruptedException();
+
+        MonitorState state = state(monitor);
+        InterceptedMonitorWait trigger = new InterceptedMonitorWait(kind, waitNanos, state, thread, captureWaitSite(thread), monitor);
+        state.log("enterwait", thread);
+        state.suspend(trigger);
+        state.waitOn(NOTIFY, trigger);
+        wakeOneWaitingOnLock(thread, state);
+        thread.interceptWait(trigger);
+        try
+        {
+            trigger.await();
+        }
+        finally
+        {
+            state.restore(trigger);
+            state.log("exitwait", thread);
+        }
+        return trigger.trigger == SIGNAL;
+    }
+
+    public void notify(Object monitor)
+    {
+        MonitorState state = state(monitor);
+        if (state != null)
+        {
+            InterceptedMonitorWait wake = state.removeOneWaitingOn(NOTIFY, random);
+            if (wake != null)
+            {
+                // TODO: assign ownership on monitorExit
+                assert wake.waitingOn == null;
+                Thread waker = Thread.currentThread();
+                wake.interceptWakeup(SIGNAL, waker);
+                state.log("notify", wake.waiting, waker);
+                return;
+            }
+        }
+        monitor.notify();
+    }
+
+    @Override
+    public void notifyAll(Object monitor)
+    {
+        MonitorState state = state(monitor);
+        if (state != null)
+        {
+            InterceptedMonitorWait wake = state.removeAllWaitingOn(NOTIFY);
+            if (wake != null)
+            {
+                Thread waker = Thread.currentThread();
+                wake.interceptWakeup(SIGNAL, waker);
+                state.log("notify", wake.waiting, waker);
+
+                wake = wake.next;
+                while (wake != null)
+                {
+                    InterceptedMonitorWait next = wake.next;
+                    state.waitOn(LOCK, wake);
+                    state.log("movetowaitonlock ", wake.waiting, waker);
+                    wake = next;
+                }
+                return;
+            }
+        }
+        monitor.notifyAll();
+    }
+
+    @Override
+    public void preMonitorEnter(Object monitor, float preMonitorDelayChance)
+    {
+        if (disabled)
+            return;
+
+        Thread anyThread = Thread.currentThread();
+        if (!(anyThread instanceof InterceptibleThread))
+            return;
+
+        boolean restoreInterrupt = false;
+        InterceptibleThread thread = (InterceptibleThread) anyThread;
+        try
+        {
+            if (   !thread.isEvaluationDeterministic()
+                && random.decide(preMonitorDelayChance))
+            {
+                // TODO (feature): hold a stack of threads already paused by the nemesis, and, if one of the threads
+                //        is entering the monitor, put the contents of this stack into `waitingOn` for this monitor.
+                InterceptedConditionWait signal = new InterceptedConditionWait(NEMESIS, 0L, thread, captureWaitSite(thread), null);
+                thread.interceptWait(signal);
+
+                // save interrupt state to restore afterwards - new ones only arrive if terminating simulation
+                restoreInterrupt = Thread.interrupted();
+                while (true)
+                {
+                    try
+                    {
+                        signal.awaitDeclaredUninterruptible();
+                        break;
+                    }
+                    catch (InterruptedException e)
+                    {
+                        if (disabled)
+                            throw new UncheckedInterruptedException(e);
+                        restoreInterrupt = true;
+                    }
+                }
+            }
+
+            MonitorState state = state(monitor);
+            if (state.heldBy != thread)
+            {
+                if (state.heldBy != null)
+                {
+                    if (!thread.isIntercepting() && disabled) return;
+                    else if (!thread.isIntercepting())
+                        throw new AssertionError();
+
+                    checkForDeadlock(thread, state.heldBy);
+                    InterceptedMonitorWait wait = new InterceptedMonitorWait(UNBOUNDED_WAIT, 0L, state, thread, captureWaitSite(thread));
+                    wait.suspendedMonitorDepth = 1;
+                    state.log("monitorenter_wait", thread);
+                    state.waitOn(LOCK, wait);
+                    thread.interceptWait(wait);
+                    synchronized (wait)
+                    {
+                        waitingOn.put(thread, monitor);
+                        restoreInterrupt |= Thread.interrupted();
+                        try
+                        {
+                            while (true)
+                            {
+                                try
+                                {
+                                    wait.await();
+                                    break;
+                                }
+                                catch (InterruptedException e)
+                                {
+                                    if (disabled)
+                                    {
+                                        if (state.heldBy == thread)
+                                        {
+                                            state.heldBy = null;
+                                            state.depth = 0;
+                                        }
+                                        throw new UncheckedInterruptedException(e);
+                                    }
+
+                                    restoreInterrupt = true;
+                                    if (wait.isTriggered)
+                                        break;
+                                }
+                            }
+                        }
+                        finally
+                        {
+                            waitingOn.remove(thread);
+                        }
+                    }
+                    state.claim(wait);
+                    state.log("monitorenter_claim", thread);
+                }
+                else
+                {
+                    state.log("monitorenter_free", thread);
+                    state.heldBy = thread;
+                    state.depth = 1;
+                }
+            }
+            else
+            {
+                state.log("monitorreenter", thread);
+                state.depth++;
+            }
+        }
+        finally
+        {
+            if (restoreInterrupt)
+                thread.interrupt();
+        }
+    }
+
+    @Override
+    public void preMonitorExit(Object monitor)
+    {
+        if (disabled)
+            return;
+
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread))
+            return;
+
+        MonitorState state = maybeState(monitor);
+        if (state == null)
+            return;
+
+        if (state.heldBy != thread)
+            throw new AssertionError();
+
+        if (--state.depth > 0)
+        {
+            state.log("monitorreexit", thread);
+            return;
+        }
+
+        state.log("monitorexit", thread);
+        state.heldBy = null;
+
+        if (!wakeOneWaitingOnLock(thread, state))
+        {
+            maybeClear(monitor, state);
+        }
+    }
+
+    private boolean wakeOneWaitingOnLock(Thread waker, MonitorState state)
+    {
+        InterceptedMonitorWait wake = state.removeOneWaitingOn(LOCK, random);
+        if (wake != null)
+        {
+            assert wake.waitingOn == null;
+            assert !wake.isTriggered();
+
+            wake.interceptWakeup(SIGNAL, waker);
+
+            // assign them the lock, so they'll definitely get it when they wake
+            assert state.heldBy == null;
+            state.heldBy = wake.waiting;
+            state.log("wake", wake.waiting);
+            return true;
+        }
+        return false;
+    }
+
+    // TODO (feature): integrate LockSupport waits into this deadlock check
+    private void checkForDeadlock(Thread waiting, Thread blockedBy)
+    {
+        Thread cur = blockedBy;
+        while (true)
+        {
+            Object monitor = waitingOn.get(cur);
+            if (monitor == null)
+                return;
+            MonitorState state = monitors.get(monitor);
+            if (state == null)
+                return;
+            Thread next = state.heldBy;
+            if (next == cur)
+                return; // not really waiting, just hasn't woken up yet
+            if (next == waiting)
+            {
+                logger.error("Deadlock between {}{} and {}{}", waiting, Threads.prettyPrintStackTrace(waiting, true, ";"), cur, Threads.prettyPrintStackTrace(cur, true, ";"));
+                throw failWithOOM();
+            }
+            cur = next;
+        }
+    }
+
+    @Override
+    public void park()
+    {
+        InterceptibleThread.park();
+    }
+
+    @Override
+    public void parkNanos(long nanos)
+    {
+        InterceptibleThread.parkNanos(nanos);
+    }
+
+    @Override
+    public void parkUntil(long millis)
+    {
+        InterceptibleThread.parkUntil(millis);
+    }
+
+    @Override
+    public void park(Object blocker)
+    {
+        InterceptibleThread.park(blocker);
+    }
+
+    @Override
+    public void parkNanos(Object blocker, long nanos)
+    {
+        InterceptibleThread.parkNanos(blocker, nanos);
+    }
+
+    @Override
+    public void parkUntil(Object blocker, long millis)
+    {
+        InterceptibleThread.parkUntil(blocker, millis);
+    }
+
+    @Override
+    public void unpark(Thread thread)
+    {
+        InterceptibleThread.unpark(thread);
+    }
+
+    public void close()
+    {
+        disabled = true;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingWaitQueue.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingWaitQueue.java
new file mode 100644
index 0000000..d14bcfb
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptingWaitQueue.java
@@ -0,0 +1,100 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+import org.apache.cassandra.simulator.systems.InterceptingAwaitable.InterceptingSignal;
+import org.apache.cassandra.utils.concurrent.WaitQueue;
+
+import static org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods.Global.ifIntercepted;
+
+@PerClassLoader
+class InterceptingWaitQueue extends WaitQueue.Standard implements WaitQueue
+{
+    final Queue<InterceptingSignal<?>> interceptible = new ConcurrentLinkedQueue<>();
+
+    public InterceptingWaitQueue()
+    {
+    }
+
+    public Signal register()
+    {
+        if (ifIntercepted() == null)
+            return super.register();
+
+        InterceptingSignal<?> signal = new InterceptingSignal<>();
+        interceptible.add(signal);
+        return signal;
+    }
+
+    public <V> Signal register(V value, Consumer<V> consumer)
+    {
+        if (ifIntercepted() == null)
+            return super.register(value, consumer);
+
+        InterceptingSignal<V> signal = new InterceptingSignal<>(value, consumer);
+        interceptible.add(signal);
+        return signal;
+    }
+
+    public boolean signal()
+    {
+        // directly signal the actual underlying queue if no intercepted waiters are present
+        return consumeUntil(InterceptingSignal::doSignal) || super.signal();
+    }
+
+    public void signalAll()
+    {
+        consumeUntil(s -> {
+            s.signal();
+            return false;
+        });
+        super.signalAll();
+    }
+
+    public boolean hasWaiters()
+    {
+        if (super.hasWaiters())
+            return true;
+        if (interceptible.isEmpty())
+            return false;
+
+        return !interceptible.stream().allMatch(Signal::isSet);
+    }
+
+    private boolean consumeUntil(Predicate<InterceptingSignal<?>> consumeUntil)
+    {
+        InterceptingSignal<?> signal;
+        while (null != (signal = interceptible.poll()))
+        {
+            if (consumeUntil.test(signal))
+                return true;
+        }
+        return false;
+    }
+
+    public int getWaiting()
+    {
+        return super.getWaiting() + (int)interceptible.stream().filter(s -> !s.isSignalled).count();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfConsequences.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfConsequences.java
new file mode 100644
index 0000000..801b353
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfConsequences.java
@@ -0,0 +1,78 @@
+/*
+ * 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.simulator.systems;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IMessage;
+import org.apache.cassandra.simulator.OrderOn;
+import org.apache.cassandra.simulator.systems.InterceptedWait.Trigger;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public interface InterceptorOfConsequences
+{
+    public static final InterceptorOfConsequences DEFAULT_INTERCEPTOR = new InterceptorOfConsequences()
+    {
+        @Override
+        public void beforeInvocation(InterceptibleThread realThread)
+        {
+        }
+
+        @Override
+        public void interceptMessage(IInvokableInstance from, IInvokableInstance to, IMessage message)
+        {
+            throw new AssertionError();
+        }
+
+        @Override
+        public void interceptWait(InterceptedWait wakeupWith)
+        {
+            throw new AssertionError();
+        }
+
+        @Override
+        public void interceptWakeup(InterceptedWait wakeup, Trigger trigger, InterceptorOfConsequences waitWasInterceptedBy)
+        {
+            // TODO (now): should we be asserting here?
+            wakeup.triggerBypass();
+        }
+
+        @Override
+        public void interceptExecution(InterceptedExecution invoke, OrderOn orderOn)
+        {
+            throw new AssertionError();
+        }
+
+        @Override
+        public void interceptTermination(boolean isThreadTermination)
+        {
+            throw new AssertionError();
+        }
+    };
+
+
+    void beforeInvocation(InterceptibleThread realThread);
+    void interceptMessage(IInvokableInstance from, IInvokableInstance to, IMessage message);
+    void interceptWakeup(InterceptedWait wakeup, Trigger trigger, InterceptorOfConsequences waitWasInterceptedBy);
+    void interceptExecution(InterceptedExecution invoke, OrderOn orderOn);
+    void interceptWait(InterceptedWait wakeupWith);
+    void interceptTermination(boolean isThreadTermination);
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfExecution.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfExecution.java
new file mode 100644
index 0000000..ac8255d
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfExecution.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.systems;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledFuture;
+import java.util.function.Function;
+
+import org.apache.cassandra.simulator.systems.SimulatedAction.Kind;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+// some kind of bug in javac(?) sometimes causes this to not be found if not fully-qualified
+@Shared(scope = SIMULATION)
+public interface InterceptorOfExecution
+{
+    InterceptExecution intercept();
+
+    @Shared(scope = SIMULATION)
+    interface InterceptExecution
+    {
+        <V, T extends RunnableFuture<V>> T addTask(T task, InterceptingExecutor executor);
+        <T> ScheduledFuture<T> schedule(Kind kind, long delayNanos, long deadlineNanos, Callable<T> runnable, InterceptingExecutor executor);
+        Thread start(Kind kind, Function<Runnable, InterceptibleThread> factory, Runnable run);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfGlobalMethods.java b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfGlobalMethods.java
new file mode 100644
index 0000000..749f91e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/InterceptorOfGlobalMethods.java
@@ -0,0 +1,474 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayDeque;
+import java.util.UUID;
+import java.util.concurrent.BlockingQueue;
+import java.util.function.IntSupplier;
+import java.util.function.LongConsumer;
+import java.util.function.ToIntFunction;
+
+import net.openhft.chronicle.core.util.WeakIdentityHashMap;
+import org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.BlockingQueues;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+import org.apache.cassandra.utils.concurrent.Semaphore;
+import org.apache.cassandra.utils.concurrent.Semaphore.Standard;
+import org.apache.cassandra.utils.concurrent.WaitQueue;
+
+import static org.apache.cassandra.utils.Shared.Recursive.INTERFACES;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@SuppressWarnings("unused")
+@Shared(scope = SIMULATION, inner = INTERFACES)
+public interface InterceptorOfGlobalMethods extends InterceptorOfSystemMethods, Closeable
+{
+    WaitQueue newWaitQueue();
+    CountDownLatch newCountDownLatch(int count);
+    Condition newOneTimeCondition();
+
+    /**
+     * If this interceptor is debugging wait/wake/now sites, return one initialised with the current trace of the
+     * provided thread; otherwise return null.
+     */
+    CaptureSites captureWaitSite(Thread thread);
+
+    /**
+     * Returns the current thread as an InterceptibleThread IF it has its InterceptConsequences interceptor set.
+     * Otherwise, one of the following will happen:
+     *   * if the InterceptorOfWaits permits it, null will be returned;
+     *   * if it does not, the process will be failed.
+     */
+    InterceptibleThread ifIntercepted();
+
+    void uncaughtException(Thread thread, Throwable throwable);
+
+    @PerClassLoader
+    public static class IfInterceptibleThread extends None implements InterceptorOfGlobalMethods
+    {
+        static LongConsumer threadLocalRandomCheck;
+
+        @Override
+        public WaitQueue newWaitQueue()
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().newWaitQueue();
+
+            return WaitQueue.newWaitQueue();
+        }
+
+        @Override
+        public CountDownLatch newCountDownLatch(int count)
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().newCountDownLatch(count);
+
+            return CountDownLatch.newCountDownLatch(count);
+        }
+
+        @Override
+        public Condition newOneTimeCondition()
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().newOneTimeCondition();
+
+            return Condition.newOneTimeCondition();
+        }
+
+        @Override
+        public CaptureSites captureWaitSite(Thread thread)
+        {
+            if (thread instanceof InterceptibleThread)
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().captureWaitSite(thread);
+
+            Thread currentThread = Thread.currentThread();
+            if (currentThread instanceof InterceptibleThread)
+                return ((InterceptibleThread) currentThread).interceptorOfGlobalMethods().captureWaitSite(thread);
+
+            return null;
+        }
+
+        @Override
+        public InterceptibleThread ifIntercepted()
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().ifIntercepted();
+
+            return null;
+        }
+
+        @Override
+        public void waitUntil(long deadlineNanos) throws InterruptedException
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().waitUntil(deadlineNanos);
+            }
+            else
+            {
+                super.waitUntil(deadlineNanos);
+            }
+        }
+
+        @Override
+        public boolean waitUntil(Object monitor, long deadlineNanos) throws InterruptedException
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().waitUntil(monitor, deadlineNanos);
+
+            return super.waitUntil(monitor, deadlineNanos);
+        }
+
+        @Override
+        public void wait(Object monitor) throws InterruptedException
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().wait(monitor);
+            }
+            else
+            {
+                monitor.wait();
+            }
+        }
+
+        @Override
+        public void wait(Object monitor, long millis) throws InterruptedException
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().wait(monitor, millis);
+            }
+            else
+            {
+                monitor.wait(millis);
+            }
+        }
+
+        @Override
+        public void wait(Object monitor, long millis, int nanos) throws InterruptedException
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().wait(monitor, millis, nanos);
+            }
+            else
+            {
+                monitor.wait(millis, nanos);
+            }
+        }
+
+        @Override
+        public void preMonitorEnter(Object object, float chanceOfSwitch)
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().preMonitorEnter(object, chanceOfSwitch);
+            }
+        }
+
+        @Override
+        public void preMonitorExit(Object object)
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().preMonitorExit(object);
+            }
+        }
+
+        @Override
+        public void notify(Object monitor)
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().notify(monitor);
+            }
+            else
+            {
+                monitor.notify();
+            }
+        }
+
+        @Override
+        public void notifyAll(Object monitor)
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().notifyAll(monitor);
+            }
+            else
+            {
+                monitor.notifyAll();
+            }
+        }
+
+        @Override
+        public void park()
+        {
+            InterceptibleThread.park();
+        }
+
+        @Override
+        public void parkNanos(long nanos)
+        {
+            InterceptibleThread.parkNanos(nanos);
+        }
+
+        @Override
+        public void parkUntil(long millis)
+        {
+            InterceptibleThread.parkUntil(millis);
+        }
+
+        @Override
+        public void park(Object blocker)
+        {
+            InterceptibleThread.park(blocker);
+        }
+
+        @Override
+        public void parkNanos(Object blocker, long nanos)
+        {
+            InterceptibleThread.parkNanos(blocker, nanos);
+        }
+
+        @Override
+        public void parkUntil(Object blocker, long millis)
+        {
+            InterceptibleThread.parkUntil(blocker, millis);
+        }
+
+        @Override
+        public void unpark(Thread thread)
+        {
+            InterceptibleThread.unpark(thread);
+        }
+
+        @Override
+        public void nemesis(float chance)
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().nemesis(chance);
+            }
+        }
+
+        @Override
+        public long randomSeed()
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().randomSeed();
+            }
+            else
+            {   // TODO: throw an exception? May result in non-determinism
+                return super.randomSeed();
+            }
+        }
+
+        @Override
+        public UUID randomUUID()
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                return ((InterceptibleThread) thread).interceptorOfGlobalMethods().randomUUID();
+            }
+            else
+            {
+                return super.randomUUID();
+            }
+        }
+
+        @Override
+        public void threadLocalRandomCheck(long seed)
+        {
+            if (threadLocalRandomCheck != null)
+                threadLocalRandomCheck.accept(seed);
+        }
+
+        @Override
+        public void uncaughtException(Thread thread, Throwable throwable)
+        {
+            if (thread instanceof InterceptibleThread)
+                ((InterceptibleThread) thread).interceptorOfGlobalMethods().uncaughtException(thread, throwable);
+        }
+
+        @Override
+        public long nanoTime()
+        {
+            return Clock.Global.nanoTime();
+        }
+
+        @Override
+        public long currentTimeMillis()
+        {
+            return Clock.Global.currentTimeMillis();
+        }
+
+        public static void setThreadLocalRandomCheck(LongConsumer runnable)
+        {
+            threadLocalRandomCheck = runnable;
+        }
+
+        @Override
+        public void close()
+        {
+        }
+    }
+
+    @SuppressWarnings("unused")
+    public static class Global
+    {
+        private static InterceptorOfGlobalMethods methods;
+
+        public static WaitQueue newWaitQueue()
+        {
+            return methods.newWaitQueue();
+        }
+
+        public static CountDownLatch newCountDownLatch(int count)
+        {
+            return methods.newCountDownLatch(count);
+        }
+
+        public static Semaphore newSemaphore(int count)
+        {
+            return new Standard(count, false);
+        }
+
+        public static Semaphore newFairSemaphore(int count)
+        {
+            return new Standard(count, true);
+        }
+
+        public static Condition newOneTimeCondition()
+        {
+            return methods.newOneTimeCondition();
+        }
+
+        public static <T> BlockingQueue<T> newBlockingQueue()
+        {
+            return newBlockingQueue(Integer.MAX_VALUE);
+        }
+
+        public static <T> BlockingQueue<T> newBlockingQueue(int capacity)
+        {
+            return new BlockingQueues.Sync<>(capacity, new ArrayDeque<>());
+        }
+
+        public static CaptureSites captureWaitSite(Thread thread)
+        {
+            return methods.captureWaitSite(thread);
+        }
+
+        public static InterceptibleThread ifIntercepted()
+        {
+            return methods.ifIntercepted();
+        }
+
+        public static void uncaughtException(Thread thread, Throwable throwable)
+        {
+            System.err.println(thread);
+            throwable.printStackTrace(System.err);
+            methods.uncaughtException(thread, throwable);
+        }
+
+        public static void unsafeReset()
+        {
+            Global.methods = new IfInterceptibleThread();
+            InterceptorOfSystemMethods.Global.unsafeSet(methods);
+        }
+
+        public static void unsafeSet(InterceptorOfGlobalMethods methods, IntSupplier intSupplier)
+        {
+            unsafeSet(methods, new IdentityHashCode(intSupplier));
+        }
+
+        public static void unsafeSet(InterceptorOfGlobalMethods methods, ToIntFunction<Object> identityHashCode)
+        {
+            InterceptorOfSystemMethods.Global.unsafeSet(methods, identityHashCode);
+            Global.methods = methods;
+        }
+    }
+
+    static class IdentityHashCode implements ToIntFunction<Object>
+    {
+        static class LCGRandom implements IntSupplier
+        {
+            private static final int LCG_MULTIPLIER = 22695477;
+            private final int constant;
+            private int nextId;
+
+            public LCGRandom(int constant)
+            {
+                this.constant = constant == 0 ? 1 : constant;
+            }
+
+            @Override
+            public int getAsInt()
+            {
+                int id = nextId;
+                nextId = (id * LCG_MULTIPLIER) + constant;
+                id ^= id >> 16;
+                return id;
+            }
+        }
+
+        private final IntSupplier nextId;
+        private final WeakIdentityHashMap<Object, Integer> saved = new WeakIdentityHashMap<>();
+
+        public IdentityHashCode(IntSupplier nextId)
+        {
+            this.nextId = nextId;
+        }
+
+        public synchronized int applyAsInt(Object value)
+        {
+            Integer id = saved.get(value);
+            if (id == null)
+            {
+                id = nextId.getAsInt();
+                saved.put(value, id);
+            }
+            return id;
+        }
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/NetworkConfig.java b/test/simulator/main/org/apache/cassandra/simulator/systems/NetworkConfig.java
new file mode 100644
index 0000000..bde5e9e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/NetworkConfig.java
@@ -0,0 +1,54 @@
+/*
+ * 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.simulator.systems;
+
+import org.apache.cassandra.simulator.utils.ChanceRange;
+import org.apache.cassandra.simulator.utils.LongRange;
+
+public class NetworkConfig
+{
+    public static class PhaseConfig
+    {
+        final ChanceRange dropChance, delayChance;
+        final LongRange normalLatency, delayLatency;
+
+        public PhaseConfig(ChanceRange dropChance, ChanceRange delayChance, LongRange normalLatency, LongRange delayLatency)
+        {
+            this.dropChance = dropChance;
+            this.delayChance = delayChance;
+            this.normalLatency = normalLatency;
+            this.delayLatency = delayLatency;
+        }
+    }
+
+    final PhaseConfig normal;
+    final PhaseConfig flaky;
+    final ChanceRange partitionChance;
+    final ChanceRange flakyChance;
+    final LongRange reconfigureInterval;
+
+    public NetworkConfig(PhaseConfig normal, PhaseConfig flaky, ChanceRange partitionChance, ChanceRange flakyChance, LongRange reconfigureInterval)
+    {
+        this.normal = normal;
+        this.flaky = flaky;
+        this.partitionChance = partitionChance;
+        this.flakyChance = flakyChance;
+        this.reconfigureInterval = reconfigureInterval;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/NonInterceptible.java b/test/simulator/main/org/apache/cassandra/simulator/systems/NonInterceptible.java
new file mode 100644
index 0000000..6aee396
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/NonInterceptible.java
@@ -0,0 +1,106 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.concurrent.Callable;
+import java.util.function.Supplier;
+
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+@Shared(scope = SIMULATION)
+public class NonInterceptible
+{
+    @Shared(scope = SIMULATION)
+    public enum Permit { REQUIRED, OPTIONAL }
+
+    private static final ThreadLocal<Permit> PERMIT = new ThreadLocal<>();
+
+    public static boolean isPermitted(Permit permit)
+    {
+        Permit current = PERMIT.get();
+        return current != null && current.compareTo(permit) >= 0;
+    }
+
+    public static boolean isPermitted()
+    {
+        return PERMIT.get() != null;
+    }
+
+    public static void execute(Permit permit, Runnable runnable)
+    {
+        if (isPermitted())
+        {
+            runnable.run();
+        }
+        else
+        {
+            PERMIT.set(permit);
+            try
+            {
+                runnable.run();
+            }
+            finally
+            {
+                PERMIT.set(null);
+            }
+        }
+    }
+
+    public static <V> V apply(Permit permit, Supplier<V> supplier)
+    {
+        if (isPermitted())
+        {
+            return supplier.get();
+        }
+        else
+        {
+            PERMIT.set(permit);
+            try
+            {
+                return supplier.get();
+            }
+            finally
+            {
+                PERMIT.set(null);
+            }
+        }
+    }
+
+    public static <V> V call(Permit permit, Callable<V> call) throws Exception
+    {
+        if (isPermitted())
+        {
+            return call.call();
+        }
+        else
+        {
+            PERMIT.set(permit);
+            try
+            {
+                return call.call();
+            }
+            finally
+            {
+                PERMIT.set(null);
+            }
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/NotInterceptedSyncCondition.java b/test/simulator/main/org/apache/cassandra/simulator/systems/NotInterceptedSyncCondition.java
new file mode 100644
index 0000000..6c53a4e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/NotInterceptedSyncCondition.java
@@ -0,0 +1,70 @@
+/*
+ * 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.simulator.systems;
+
+import org.apache.cassandra.utils.concurrent.Awaitable;
+import org.apache.cassandra.utils.concurrent.Condition;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public class NotInterceptedSyncCondition extends Awaitable.AbstractAwaitable implements Condition
+{
+    private volatile boolean isSignalled;
+
+    @Override
+    public synchronized boolean awaitUntil(long nanoTimeDeadline) throws InterruptedException
+    {
+        while (true)
+        {
+            if (isSignalled()) return true;
+            if (!notInterceptedWaitUntil(this, nanoTimeDeadline)) return false;
+        }
+    }
+
+    @Override
+    public synchronized Awaitable await() throws InterruptedException
+    {
+        while (!isSignalled)
+            wait();
+        return this;
+    }
+
+    @Override
+    public boolean isSignalled()
+    {
+        return isSignalled;
+    }
+
+    @Override
+    public synchronized void signal()
+    {
+        isSignalled = true;
+        notifyAll();
+    }
+
+    private static boolean notInterceptedWaitUntil(Object monitor, long deadlineNanos) throws InterruptedException
+    {
+        long wait = deadlineNanos - nanoTime();
+        if (wait <= 0)
+            return false;
+
+        monitor.wait((wait + 999999) / 1000000);
+        return true;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/NotifyThreadPaused.java b/test/simulator/main/org/apache/cassandra/simulator/systems/NotifyThreadPaused.java
new file mode 100644
index 0000000..2c92073
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/NotifyThreadPaused.java
@@ -0,0 +1,73 @@
+/*
+ * 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.simulator.systems;
+
+import org.apache.cassandra.utils.Shared;
+import org.apache.cassandra.utils.concurrent.UncheckedInterruptedException;
+
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * An abstraction for the simulation to permit the main scheduling thread
+ * to trigger a simulation thread and then wait synchronously for the end
+ * of this part of its simulation, i.e. until its next wait is intercepted.
+ *
+ * This permits more efficient scheduling, by (often) ensuring the simulated
+ * thread and the scheduling thread do not run simultaneously.
+ */
+@Shared(scope = SIMULATION)
+public interface NotifyThreadPaused
+{
+    void notifyThreadPaused();
+
+    class AwaitPaused implements NotifyThreadPaused
+    {
+        final Object monitor;
+        boolean isDone;
+        AwaitPaused(Object monitor) { this.monitor = monitor; }
+        AwaitPaused() { this.monitor = this; }
+
+        @Override
+        public void notifyThreadPaused()
+        {
+            synchronized (monitor)
+            {
+                isDone = true;
+                monitor.notifyAll();
+            }
+        }
+
+        public void awaitPause()
+        {
+            try
+            {
+                synchronized (monitor)
+                {
+                    while (!isDone)
+                        monitor.wait();
+                }
+            }
+            catch (InterruptedException ie)
+            {
+                throw new UncheckedInterruptedException(ie);
+            }
+        }
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/PerClassLoader.java b/test/simulator/main/org/apache/cassandra/simulator/systems/PerClassLoader.java
new file mode 100644
index 0000000..2256405
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/PerClassLoader.java
@@ -0,0 +1,23 @@
+/*
+ * 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.simulator.systems;
+
+public @interface PerClassLoader
+{
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SchedulerConfig.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SchedulerConfig.java
new file mode 100644
index 0000000..3f5ce0e
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SchedulerConfig.java
@@ -0,0 +1,35 @@
+/*
+ * 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.simulator.systems;
+
+import org.apache.cassandra.simulator.utils.ChanceRange;
+import org.apache.cassandra.simulator.utils.LongRange;
+
+public class SchedulerConfig
+{
+    final ChanceRange longDelayChance;
+    final LongRange delayNanos, longDelayNanos;
+
+    public SchedulerConfig(ChanceRange longDelayChance, LongRange delayNanos, LongRange longDelayNanos)
+    {
+        this.longDelayChance = longDelayChance;
+        this.delayNanos = delayNanos;
+        this.longDelayNanos = longDelayNanos;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedAction.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedAction.java
new file mode 100644
index 0000000..551616f
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedAction.java
@@ -0,0 +1,466 @@
+/*
+ * 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.simulator.systems;
+
+import java.net.InetSocketAddress;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.Executor;
+
+import javax.annotation.Nullable;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IMessage;
+import org.apache.cassandra.exceptions.RequestFailureReason;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.RequestCallback;
+import org.apache.cassandra.net.RequestCallbacks;
+import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.Actions;
+import org.apache.cassandra.simulator.FutureActionScheduler.Deliver;
+import org.apache.cassandra.simulator.OrderOn;
+import org.apache.cassandra.simulator.systems.InterceptedExecution.InterceptedRunnableExecution;
+import org.apache.cassandra.simulator.systems.InterceptedWait.Trigger;
+import org.apache.cassandra.simulator.systems.InterceptedWait.TriggerListener;
+import org.apache.cassandra.utils.LazyToString;
+import org.apache.cassandra.utils.Shared;
+
+import static org.apache.cassandra.net.MessagingService.instance;
+import static org.apache.cassandra.simulator.Action.Modifiers.DROP;
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.PSEUDO_ORPHAN;
+import static org.apache.cassandra.simulator.Action.Modifiers.START_DAEMON_TASK;
+import static org.apache.cassandra.simulator.Action.Modifiers.START_SCHEDULED_TASK;
+import static org.apache.cassandra.simulator.Action.Modifiers.START_INFINITE_LOOP;
+import static org.apache.cassandra.simulator.Action.Modifiers.START_TASK;
+import static org.apache.cassandra.simulator.Action.Modifiers.START_THREAD;
+import static org.apache.cassandra.simulator.Action.Modifiers.START_TIMEOUT_TASK;
+import static org.apache.cassandra.simulator.Action.Modifiers.WAKE_UP_THREAD;
+import static org.apache.cassandra.simulator.FutureActionScheduler.Deliver.DELIVER;
+import static org.apache.cassandra.simulator.FutureActionScheduler.Deliver.DELIVER_AND_TIMEOUT;
+import static org.apache.cassandra.simulator.FutureActionScheduler.Deliver.FAILURE;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Trigger.SIGNAL;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Trigger.TIMEOUT;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.MESSAGE;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.REDUNDANT_MESSAGE_TIMEOUT;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.SCHEDULED_TIMEOUT;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.TASK;
+import static org.apache.cassandra.simulator.Debug.Info.LOG;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.Kind.UNBOUNDED_WAIT;
+import static org.apache.cassandra.utils.LazyToString.lazy;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+/**
+ * This class is the nexus of simulation, as this is where we translate intercepted system events
+ * into Action events.
+ */
+public abstract class SimulatedAction extends Action implements InterceptorOfConsequences
+{
+    @Shared(scope = SIMULATION)
+    public enum Kind
+    {
+        MESSAGE(NONE, NONE, WAKE_UP_THREAD),
+        REDUNDANT_MESSAGE_TIMEOUT(PSEUDO_ORPHAN, NONE, WAKE_UP_THREAD),
+        TASK(START_TASK, NONE, WAKE_UP_THREAD),
+        SCHEDULED_TASK(START_SCHEDULED_TASK, NONE, WAKE_UP_THREAD),
+        SCHEDULED_TIMEOUT(START_TIMEOUT_TASK, NONE, WAKE_UP_THREAD),
+        SCHEDULED_DAEMON(START_DAEMON_TASK, NONE, WAKE_UP_THREAD),
+        THREAD(START_THREAD, NONE, WAKE_UP_THREAD),
+        INFINITE_LOOP(START_INFINITE_LOOP, NONE, WAKE_UP_THREAD);
+
+        public final Modifiers self, transitive, signal;
+        Kind(Modifiers self, Modifiers transitive, Modifiers signal)
+        {
+            this.self = self;
+            this.transitive = transitive;
+            this.signal = signal;
+        }
+
+        public boolean logWakeups()
+        {
+            return this == MESSAGE || this == TASK || this == SCHEDULED_TASK;
+        }
+    }
+
+    class Signal extends Action implements TriggerListener
+    {
+        final InterceptedWait wakeup;
+        final Trigger trigger;
+        boolean signalling;
+
+        // note that we do not inherit from the parent thread's self, as anything relevantly heritable by continuations is likely already transitive
+        protected Signal(Object description, Modifiers self, InterceptedWait wakeup, Trigger trigger, long deadlineNanos)
+        {
+            super(description, self.inheritIfContinuation(SimulatedAction.this.self()), NONE);
+            this.wakeup = wakeup;
+            this.trigger = trigger;
+            assert deadlineNanos < 0 || trigger == TIMEOUT;
+            if (deadlineNanos >= 0)
+                setDeadline(simulated.time, deadlineNanos);
+            assert !wakeup.isTriggered();
+            wakeup.addListener(this);
+        }
+
+        // provide the parameters to send to SimulatedAction.this
+        @Override
+        protected ActionList performed(ActionList consequences, boolean isStart, boolean isFinish)
+        {
+            assert !isStart;
+            ActionList restored = super.performed(ActionList.empty(), true, true);
+            consequences = SimulatedAction.this.performed(consequences, false, isFinish);
+            if (!restored.isEmpty()) consequences = consequences.andThen(restored);
+            return consequences;
+        }
+
+        @Override
+        protected ActionList performAndRegister()
+        {
+            assert !wakeup.isTriggered();
+            assert !isFinished();
+
+            if (SimulatedAction.this.isFinished())
+                return super.performed(ActionList.empty(), true, true);
+            assert !realThreadHasTerminated;
+
+            signalling = true;
+            return performed(performSimple(), false, realThreadHasTerminated);
+        }
+
+        @Override
+        protected ActionList performSimple()
+        {
+            return simulate(() -> wakeup.triggerAndAwaitDone(SimulatedAction.this, trigger));
+        }
+
+        @Override
+        public void onTrigger(InterceptedWait triggered)
+        {
+            if (!signalling)
+                cancel();
+        }
+    }
+
+    protected final SimulatedAction.Kind kind;
+    protected final SimulatedSystems simulated;
+    protected final Verb forVerb;
+    protected Map<Verb, Modifiers> verbModifiers;
+
+    private InterceptibleThread realThread; // unset until first simulation
+
+    private List<Action> consequences; // valid only for one round of simulation, until paused
+    private @Nullable InterceptedWait pausedOn;
+    private boolean realThreadHasTerminated;
+
+    public SimulatedAction(Object description, Modifiers self, Modifiers transitive, Verb forVerb, SimulatedSystems simulated)
+    {
+        this(description, OrderOn.NONE, self, transitive, forVerb, simulated);
+    }
+
+    public SimulatedAction(Object description, OrderOn orderOn, Modifiers self, Modifiers transitive, Verb forVerb, SimulatedSystems simulated)
+    {
+        this(description, TASK, orderOn, self, transitive, Collections.emptyMap(), forVerb, simulated);
+    }
+
+    public SimulatedAction(Object description, Kind kind, OrderOn orderOn, Modifiers self, Modifiers transitive, Map<Verb, Modifiers> verbModifiers, Verb forVerb, SimulatedSystems simulated)
+    {
+        super(description, orderOn, self, transitive);
+        Preconditions.checkNotNull(kind);
+        Preconditions.checkNotNull(verbModifiers);
+        Preconditions.checkNotNull(simulated);
+        this.kind = kind;
+        this.simulated = simulated;
+        this.verbModifiers = verbModifiers;
+        this.forVerb = forVerb;
+    }
+
+    @Override
+    public void interceptMessage(IInvokableInstance from, IInvokableInstance to, IMessage message)
+    {
+        if (!to.isShutdown())
+            consequences.addAll(applyToMessage(from, to, message));
+    }
+
+    @Override
+    public void interceptWakeup(InterceptedWait wakeup, Trigger trigger, InterceptorOfConsequences waitWasInterceptedBy)
+    {
+        SimulatedAction action = (SimulatedAction) waitWasInterceptedBy;
+        action.applyToWakeup(consequences, wakeup, trigger);
+    }
+
+    @Override
+    public void interceptExecution(InterceptedExecution invoke, OrderOn orderOn)
+    {
+        if (invoke.kind() == SCHEDULED_TIMEOUT && transitive().is(Modifier.RELIABLE) && transitive().is(Modifier.NO_THREAD_TIMEOUTS))
+            invoke.cancel();
+        else
+            consequences.add(applyToExecution(invoke, orderOn));
+    }
+
+    @Override
+    public void interceptWait(@Nullable InterceptedWait wakeupWith)
+    {
+        pausedOn = wakeupWith;
+    }
+
+    @Override
+    public void interceptTermination(boolean isThreadTermination)
+    {
+        realThreadHasTerminated = true;
+    }
+
+    private ActionList simulate(Runnable simulate)
+    {
+        try
+        {
+            try
+            {
+                simulate.run();
+            }
+            catch (Throwable t)
+            {
+                consequences.forEach(Action::invalidate);
+                throw t;
+            }
+
+            InterceptedWait wakeUpWith = pausedOn;
+            if (wakeUpWith != null && wakeUpWith.kind() != UNBOUNDED_WAIT)
+            {
+                applyToWait(consequences, wakeUpWith);
+            }
+            else if (wakeUpWith != null && kind.logWakeups() && !isFinished())
+            {
+                if (simulated.debug.isOn(LOG))
+                    consequences.add(Actions.empty(Modifiers.INFO, lazy(() -> "Waiting[" + wakeUpWith + "] " + realThread)));
+            }
+
+            for (int i = consequences.size() - 1; i >= 0 ; --i)
+            {
+                // a scheduled future might be cancelled by the same action that creates it
+                if (consequences.get(i).isCancelled())
+                    consequences.remove(i);
+            }
+            return ActionList.of(consequences);
+        }
+        finally
+        {
+            this.consequences = null;
+            this.pausedOn = null;
+        }
+    }
+
+    protected abstract InterceptedExecution task();
+
+    protected ActionList performAndRegister()
+    {
+        return performed(performSimple(), true, realThreadHasTerminated);
+    }
+
+    @Override
+    protected ActionList performSimple()
+    {
+        return simulate(() -> task().invokeAndAwaitPause(this));
+    }
+
+    @Override
+    public void beforeInvocation(InterceptibleThread realThread)
+    {
+        this.consequences = new ArrayList<>();
+        this.realThread = realThread;
+    }
+
+    void applyToWait(List<Action> out, InterceptedWait wakeupWith)
+    {
+        switch (wakeupWith.kind())
+        {
+            case WAIT_UNTIL:
+                applyToSignal(out, START_TIMEOUT_TASK, "Timeout", wakeupWith, TIMEOUT, wakeupWith.waitTime());
+                break;
+            case NEMESIS:
+                applyToSignal(out, WAKE_UP_THREAD, "Nemesis", wakeupWith, SIGNAL, -1L);
+                break;
+            default :
+                applyToSignal(out, WAKE_UP_THREAD, "Continue", wakeupWith, SIGNAL, -1L);
+                break;
+        }
+    }
+
+    void applyToWakeup(List<Action> out, InterceptedWait wakeup, Trigger trigger)
+    {
+        applyToSignal(out, kind.signal, "Wakeup", wakeup, trigger, -1);
+    }
+
+    void applyToSignal(List<Action> out, Modifiers self, String kind, InterceptedWait wakeup, Trigger trigger, long deadlineNanos)
+    {
+        applyToSignal(out, lazy(() -> kind + wakeup + ' ' + realThread), self, wakeup, trigger, deadlineNanos);
+    }
+
+    void applyToSignal(List<Action> out, LazyToString id, Modifiers self, InterceptedWait wakeup, Trigger trigger, long deadlineNanos)
+    {
+        if (deadlineNanos >= 0 && !self.is(Modifier.THREAD_TIMEOUT))
+            throw new IllegalStateException();
+
+        out.add(new Signal(id, self, wakeup, trigger, deadlineNanos));
+    }
+
+    List<Action> applyToMessage(IInvokableInstance from, IInvokableInstance to, IMessage message)
+    {
+        Executor executor = to.executorFor(message.verb());
+        if (executor instanceof ImmediateExecutor)
+            executor = to.executor();
+
+        Verb verb = Verb.fromId(message.verb());
+        Modifiers self = verbModifiers.getOrDefault(verb, NONE);
+
+        int fromNum = from.config().num();
+        int toNum = to.config().num();
+
+        long expiresAtNanos = simulated.time.get(fromNum).localToGlobalNanos(message.expiresAtNanos());
+        boolean isReliable = is(Modifier.RELIABLE) || self.is(Modifier.RELIABLE);
+        Deliver deliver = isReliable ? DELIVER : simulated.futureScheduler.shouldDeliver(fromNum, toNum);
+
+        List<Action> actions = new ArrayList<>(deliver == DELIVER_AND_TIMEOUT ? 2 : 1);
+        switch (deliver)
+        {
+            default: throw new AssertionError();
+            case DELIVER:
+            case DELIVER_AND_TIMEOUT:
+            {
+                InterceptedExecution.InterceptedTaskExecution task = new InterceptedRunnableExecution(
+                    (InterceptingExecutor) executor, () -> to.receiveMessageWithInvokingThread(message)
+                );
+                Object description = lazy(() -> String.format("%s(%d) from %s to %s", verb, message.id(), message.from(), to.broadcastAddress()));
+                OrderOn orderOn = task.executor.orderAppliesAfterScheduling();
+                Action action = applyTo(description, MESSAGE, orderOn, self, verb, task);
+                long deadlineNanos = simulated.futureScheduler.messageDeadlineNanos(fromNum, toNum);
+                if (deliver == DELIVER && deadlineNanos >= expiresAtNanos)
+                {
+                    if (isReliable) deadlineNanos = verb.isResponse() ? expiresAtNanos : expiresAtNanos / 2;
+                    else deliver = DELIVER_AND_TIMEOUT;
+                }
+                action.setDeadline(simulated.time, deadlineNanos);
+                actions.add(action);
+                if (deliver == DELIVER)
+                    break;
+            }
+            case FAILURE:
+            case TIMEOUT:
+            {
+                InetSocketAddress failedOn;
+                IInvokableInstance notify;
+                if (verb.isResponse())
+                {
+                    failedOn = from.broadcastAddress();
+                    notify = to;
+                }
+                else
+                {
+                    failedOn = to.broadcastAddress();
+                    notify = from;
+                }
+                boolean isTimeout = deliver != FAILURE;
+                InterceptedExecution.InterceptedTaskExecution failTask = new InterceptedRunnableExecution(
+                    (InterceptingExecutor) notify.executorFor(verb.id),
+                    () -> notify.unsafeApplyOnThisThread((socketAddress, id, innerIsTimeout) -> {
+                        InetAddressAndPort address = InetAddressAndPort.getByAddress(socketAddress);
+                        RequestCallbacks.CallbackInfo callback = instance().callbacks.remove(id, address);
+                        if (callback != null)
+                        {
+                            RequestCallback<?> invokeOn = (RequestCallback<?>) callback.callback;
+                            RequestFailureReason reason = innerIsTimeout ? RequestFailureReason.TIMEOUT : RequestFailureReason.UNKNOWN;
+                            invokeOn.onFailure(address, reason);
+                        }
+                        return null;
+                    }, failedOn, message.id(), isTimeout)
+                );
+
+                Object description = (lazy(() -> String.format("Report Timeout of %s(%d) from %s to %s", Verb.fromId(message.verb()), message.id(), failedOn, notify.broadcastAddress())));
+                OrderOn orderOn = failTask.executor.orderAppliesAfterScheduling();
+                self = DROP.with(self);
+                Kind kind = deliver == DELIVER_AND_TIMEOUT ? REDUNDANT_MESSAGE_TIMEOUT : MESSAGE;
+                Action action = applyTo(description, kind, orderOn, self, failTask);
+                switch (deliver)
+                {
+                    default: throw new AssertionError();
+                    case FAILURE:
+                        long deadlineNanos = simulated.futureScheduler.messageFailureNanos(toNum, fromNum);
+                        if (deadlineNanos < expiresAtNanos)
+                        {
+                            action.setDeadline(simulated.time, deadlineNanos);
+                            break;
+                        }
+                    case DELIVER_AND_TIMEOUT:
+                    case TIMEOUT:
+                        long expirationIntervalNanos = from.unsafeCallOnThisThread(RequestCallbacks::defaultExpirationInterval);
+                        action.setDeadline(simulated.time, simulated.futureScheduler.messageTimeoutNanos(expiresAtNanos, expirationIntervalNanos));
+                        break;
+                }
+                actions.add(action);
+            }
+        }
+        return actions;
+    }
+
+    Action applyToExecution(InterceptedExecution invoke, OrderOn orderOn)
+    {
+        Action result =  applyTo(lazy(() -> String.format("Invoke %s", invoke)),
+                                 invoke.kind(), orderOn, invoke.kind().self, invoke);
+        switch (invoke.kind())
+        {
+            case SCHEDULED_DAEMON:
+            case SCHEDULED_TASK:
+            case SCHEDULED_TIMEOUT:
+                result.setDeadline(simulated.time, invoke.deadlineNanos());
+        }
+
+        return result;
+    }
+
+    Action applyTo(Object description, Kind kind, OrderOn orderOn, Modifiers self, InterceptedExecution task)
+    {
+        return new SimulatedActionTask(description, kind, orderOn, self, NONE, verbModifiers, forVerb, simulated, task);
+    }
+
+    Action applyTo(Object description, Kind kind, OrderOn orderOn, Modifiers self, Verb verb, InterceptedExecution task)
+    {
+        return new SimulatedActionTask(description, kind, orderOn, self, NONE, verbModifiers, verb, simulated, task);
+    }
+
+    @SuppressWarnings({"SameParameterValue", "UnusedReturnValue"})
+    protected SimulatedAction setMessageModifiers(Verb verb, Modifiers self, Modifiers responses)
+    {
+        if (verbModifiers.isEmpty())
+            verbModifiers = new EnumMap<>(Verb.class);
+        verbModifiers.put(verb, self);
+        if (verb.responseVerb != null)
+            verbModifiers.put(verb.responseVerb, responses);
+        return this;
+    }
+
+    public Object description()
+    {
+        return realThread == null ? super.description() : super.description() + " on " + realThread;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionCallable.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionCallable.java
new file mode 100644
index 0000000..2dc3d6a
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionCallable.java
@@ -0,0 +1,53 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.function.BiConsumer;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableCallable;
+import org.apache.cassandra.simulator.systems.InterceptedExecution.InterceptedTaskExecution;
+
+public abstract class SimulatedActionCallable<O> extends SimulatedAction implements BiConsumer<O, Throwable>
+{
+    private final IInvokableInstance on;
+    private SerializableCallable<? extends O> execute;
+
+    public SimulatedActionCallable(Object description, Modifiers self, Modifiers children, SimulatedSystems simulated, IInvokableInstance on, SerializableCallable<? extends O> execute)
+    {
+        super(description, self, children, null, simulated);
+        this.execute = execute;
+        this.on = on;
+    }
+
+    @Override
+    protected InterceptedTaskExecution task()
+    {
+        return new InterceptedTaskExecution((InterceptingExecutor) on.executor())
+        {
+            public void run()
+            {
+                // we'll be invoked on the node's executor, but we need to ensure the task is loaded on its classloader
+                try { accept(on.unsafeCallOnThisThread(execute), null); }
+                catch (Throwable t) { accept(null, t); }
+                finally { execute = null; }
+            }
+        };
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionConsumer.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionConsumer.java
new file mode 100644
index 0000000..c923813
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionConsumer.java
@@ -0,0 +1,57 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.function.Consumer;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableConsumer;
+import org.apache.cassandra.simulator.systems.InterceptedExecution.InterceptedTaskExecution;
+
+public class SimulatedActionConsumer<I> extends SimulatedAction
+{
+    private final IInvokableInstance on;
+    private Consumer<Throwable> onFailure;
+    private SerializableConsumer<I> execute;
+    private I parameter;
+
+    public SimulatedActionConsumer(Object description, Modifiers self, Modifiers children, SimulatedSystems simulated, IInvokableInstance on, SerializableConsumer<I> execute, I parameter)
+    {
+        super(description, self, children, null, simulated);
+        this.onFailure = simulated.failures;
+        this.execute = execute;
+        this.on = on;
+        this.parameter = parameter;
+    }
+
+    @Override
+    protected InterceptedTaskExecution task()
+    {
+        return new InterceptedTaskExecution((InterceptingExecutor) on.executor())
+        {
+            public void run()
+            {
+                // we'll be invoked on the node's executor, but we need to ensure the task is loaded on its classloader
+                try { on.unsafeAcceptOnThisThread(execute, parameter); }
+                catch (Throwable t) { onFailure.accept(t); }
+                finally { execute = null; parameter = null; onFailure = null; }
+            }
+        };
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionTask.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionTask.java
new file mode 100644
index 0000000..6607e19
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedActionTask.java
@@ -0,0 +1,137 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.Collections;
+import java.util.Map;
+import java.util.function.Consumer;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
+import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.OrderOn;
+import org.apache.cassandra.simulator.systems.InterceptedExecution.InterceptedTaskExecution;
+import org.apache.cassandra.utils.Throwables;
+
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.TASK;
+
+public class SimulatedActionTask extends SimulatedAction implements Runnable
+{
+    InterceptedExecution task;
+
+    public SimulatedActionTask(Object description, Modifiers self, Modifiers transitive, Verb forVerb, SimulatedSystems simulated, InterceptedExecution task)
+    {
+        this(description, TASK, OrderOn.NONE, self, transitive, Collections.emptyMap(), forVerb, simulated, task);
+    }
+
+    public SimulatedActionTask(Object description, Kind kind, OrderOn orderOn, Modifiers self, Modifiers transitive, Map<Verb, Modifiers> verbModifiers, Verb forVerb, SimulatedSystems simulated, InterceptedExecution task)
+    {
+        super(description, kind, orderOn, self, transitive, verbModifiers, forVerb, simulated);
+        this.task = task;
+        task.onCancel(this);
+    }
+
+    public SimulatedActionTask(Object description, Modifiers self, Modifiers children, SimulatedSystems simulated, IInvokableInstance on, SerializableRunnable run)
+    {
+        super(description, self, children, null, simulated);
+        this.task = unsafeAsTask(on, asSafeRunnable(on, run), simulated.failures);
+        task.onCancel(this);
+    }
+
+    private SimulatedActionTask(Object description, Modifiers self, Modifiers children, SimulatedSystems simulated, IInvokableInstance on, InterceptedExecution task)
+    {
+        super(description, self, children, null, simulated);
+        this.task = task;
+        task.onCancel(this);
+    }
+
+    /**
+     * To be used to create actions on runnable that are not serializable but are anyway safe to invoke
+     */
+    public static SimulatedActionTask unsafeTask(Object description, Modifiers self, Modifiers transitive, SimulatedSystems simulated, IInvokableInstance on, Runnable run)
+    {
+        return new SimulatedActionTask(description, self, transitive, simulated, on, unsafeAsTask(on, run, simulated.failures));
+    }
+
+    protected static Runnable asSafeRunnable(IInvokableInstance on, SerializableRunnable run)
+    {
+        return () -> on.unsafeRunOnThisThread(run);
+    }
+
+    protected static InterceptedTaskExecution unsafeAsTask(IInvokableInstance on, Runnable runnable, Consumer<? super Throwable> onFailure)
+    {
+        return new InterceptedTaskExecution((InterceptingExecutor) on.executor())
+        {
+            public void run()
+            {
+                // we'll be invoked on the node's executor, but we need to ensure the task is loaded on its classloader
+                try { runnable.run(); }
+                catch (Throwable t) { onFailure.accept(t); }
+            }
+        };
+    }
+
+    @Override
+    protected InterceptedExecution task()
+    {
+        return task;
+    }
+
+    @Override
+    protected ActionList performAndRegister()
+    {
+        try
+        {
+            return super.performAndRegister();
+        }
+        finally
+        {
+            task = null;
+        }
+    }
+
+    @Override
+    protected Throwable safeInvalidate(boolean isCancellation)
+    {
+        try
+        {
+            if (task != null)
+            {
+                task.onCancel(null);
+                task.cancel();
+                task = null;
+            }
+
+            return super.safeInvalidate(isCancellation);
+        }
+        catch (Throwable t)
+        {
+            return Throwables.merge(t, super.safeInvalidate(isCancellation));
+        }
+    }
+
+    @Override
+    public void run()
+    {
+        // cancellation invoked on the task by the application
+        task = null;
+        super.cancel();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedBallots.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedBallots.java
new file mode 100644
index 0000000..906dc5a
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedBallots.java
@@ -0,0 +1,104 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.function.LongSupplier;
+import java.util.function.Supplier;
+
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.BallotGenerator;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.RandomSource.Choices;
+
+import static org.apache.cassandra.service.paxos.Ballot.atUnixMicrosWithLsb;
+
+// TODO (feature): link with SimulateTime, and otherwise improve
+public class SimulatedBallots
+{
+    enum Next { ONE, JUMP, TO_LATEST }
+
+    final LongSupplier uniqueSupplier; // must be unique for all ballots
+    final RandomSource random;
+    final Choices<Next> nextChoice;
+    final LongSupplier nextJump;
+    final AtomicLong latest = new AtomicLong(1L);
+
+    public SimulatedBallots(RandomSource random, Supplier<LongSupplier> jumpsSupplier)
+    {
+        this.uniqueSupplier = random.uniqueUniformSupplier(Long.MIN_VALUE, Long.MAX_VALUE);
+        this.random = random;
+        this.nextChoice = Choices.random(random, Next.values());
+        this.nextJump = jumpsSupplier.get();
+    }
+
+    class Generator extends AtomicLong implements BallotGenerator
+    {
+        public Generator()
+        {
+            super(1L);
+        }
+
+        public Ballot atUnixMicros(long unixMicros, Ballot.Flag flag)
+        {
+            return atUnixMicrosWithLsb(unixMicros, uniqueSupplier.getAsLong(), flag);
+        }
+
+        public Ballot next(long minUnixMicros, Ballot.Flag flag)
+        {
+            return Ballot.atUnixMicrosWithLsb(nextBallotTimestampMicros(minUnixMicros), uniqueSupplier.getAsLong(), flag);
+        }
+
+        public Ballot stale(long from, long to, Ballot.Flag flag)
+        {
+            return Ballot.atUnixMicrosWithLsb(random.uniform(from, to), uniqueSupplier.getAsLong(), flag);
+        }
+
+        private long nextBallotTimestampMicros(long minUnixMicros)
+        {
+            long next;
+            switch (nextChoice.choose(random))
+            {
+                default: throw new IllegalStateException();
+                case TO_LATEST:
+                    minUnixMicros = Math.max(latest.get(), minUnixMicros);
+                case ONE:
+                    next = accumulateAndGet(minUnixMicros, (a, b) -> Math.max(a, b) + 1);
+                    break;
+                case JUMP:
+                    long jump = Math.max(1, nextJump.getAsLong());
+                    next = addAndGet(jump);
+                    if (next < minUnixMicros)
+                        next = accumulateAndGet(minUnixMicros, (a, b) -> Math.max(a, b) + 1);
+            }
+            latest.accumulateAndGet(next, Math::max);
+            return next;
+        }
+
+        public long prevUnixMicros()
+        {
+            return get();
+        }
+    }
+
+    public BallotGenerator get()
+    {
+        return new Generator();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedExecution.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedExecution.java
new file mode 100644
index 0000000..bb63879
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedExecution.java
@@ -0,0 +1,222 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.concurrent.Callable;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Function;
+
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.ActionPlan;
+import org.apache.cassandra.simulator.Actions;
+import org.apache.cassandra.simulator.OrderOn;
+import org.apache.cassandra.simulator.systems.InterceptedExecution.InterceptedFutureTaskExecution;
+import org.apache.cassandra.simulator.systems.InterceptedExecution.InterceptedThreadStart;
+import org.apache.cassandra.simulator.systems.InterceptingExecutor.InterceptedScheduledFutureTask;
+import org.apache.cassandra.utils.concurrent.Condition;
+import org.apache.cassandra.utils.concurrent.NotScheduledFuture;
+import org.apache.cassandra.utils.concurrent.RunnableFuture;
+
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.SCHEDULED_DAEMON;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.SCHEDULED_TASK;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.SCHEDULED_TIMEOUT;
+import static org.apache.cassandra.simulator.systems.SimulatedAction.Kind.TASK;
+
+public class SimulatedExecution implements InterceptorOfExecution
+{
+    static class NoExecutorMarker implements InterceptingExecutor
+    {
+        static final NoExecutorMarker INFINITE_LOOP = new NoExecutorMarker();
+        static final NoExecutorMarker THREAD = new NoExecutorMarker();
+
+        @Override public void addPending(Object task) { throw new UnsupportedOperationException(); }
+        @Override public void cancelPending(Object task) { throw new UnsupportedOperationException(); }
+        @Override public void submitUnmanaged(Runnable task) { throw new UnsupportedOperationException(); }
+        @Override public void submitAndAwaitPause(Runnable task, InterceptorOfConsequences interceptor) { throw new UnsupportedOperationException(); }
+
+        @Override public OrderOn orderAppliesAfterScheduling() { throw new UnsupportedOperationException(); }
+        @Override public int concurrency() { return Integer.MAX_VALUE; }
+    }
+
+    /**
+     * Used to handle executions submitted outside of the simulation
+     * Once "closed" only simulated executions are permitted (until a new NoIntercept instance is assigned).
+     */
+    static class NoIntercept implements InterceptExecution
+    {
+        private final AtomicInteger unmanaged = new AtomicInteger();
+        private volatile Condition forbidden;
+
+        public  <V, T extends RunnableFuture<V>> T addTask(T task, InterceptingExecutor executor)
+        {
+            synchronized (this)
+            {
+                if (forbidden != null)
+                    throw new InterceptingExecutor.ForbiddenExecutionException();
+                unmanaged.incrementAndGet();
+            }
+
+            class Run implements Runnable
+            {
+                public void run()
+                {
+                    try
+                    {
+                        task.run();
+                    }
+                    finally
+                    {
+                        if (unmanaged.decrementAndGet() == 0 && forbidden != null)
+                            forbidden.signal();
+                    }
+                }
+            }
+
+            executor.submitUnmanaged(new Run());
+            return task;
+        }
+
+        public <T> ScheduledFuture<T> schedule(SimulatedAction.Kind kind, long delayNanos, long deadlineNanos, Callable<T> runnable, InterceptingExecutor executor)
+        {
+            return new NotScheduledFuture<>();
+        }
+
+        public Thread start(SimulatedAction.Kind kind, Function<Runnable, InterceptibleThread> factory, Runnable run)
+        {
+            Thread thread = factory.apply(run);
+            thread.start();
+            return thread;
+        }
+
+        NoIntercept forbidExecution()
+        {
+            forbidden = new NotInterceptedSyncCondition();
+            if (0 == unmanaged.get())
+                forbidden.signal();
+            return this;
+        }
+
+        void awaitTermination()
+        {
+            forbidden.awaitUninterruptibly();
+        }
+    }
+
+    static class Intercept implements InterceptExecution
+    {
+        final InterceptorOfConsequences intercept;
+
+        Intercept(InterceptorOfConsequences intercept)
+        {
+            this.intercept = intercept;
+        }
+
+        public <V, T extends RunnableFuture<V>> T addTask(T task, InterceptingExecutor executor)
+        {
+            InterceptedFutureTaskExecution<?> intercepted = new InterceptedFutureTaskExecution<>(TASK, executor, task);
+            intercept.interceptExecution(intercepted, executor);
+            return task;
+        }
+
+        public <V> ScheduledFuture<V> schedule(SimulatedAction.Kind kind, long delayNanos, long deadlineNanos, Callable<V> call, InterceptingExecutor executor)
+        {
+            assert kind == SCHEDULED_TASK || kind == SCHEDULED_TIMEOUT || kind == SCHEDULED_DAEMON;
+            InterceptedScheduledFutureTask<V> task = new InterceptedScheduledFutureTask<>(delayNanos, call);
+            InterceptedFutureTaskExecution<?> intercepted = new InterceptedFutureTaskExecution<>(kind, executor, task, deadlineNanos);
+            task.onCancel(intercepted::cancel);
+            intercept.interceptExecution(intercepted, executor.orderAppliesAfterScheduling());
+            return task;
+        }
+
+        public Thread start(SimulatedAction.Kind kind, Function<Runnable, InterceptibleThread> factory, Runnable run)
+        {
+            InterceptedThreadStart intercepted = new InterceptedThreadStart(factory, run, kind);
+            intercept.interceptExecution(intercepted, kind == SimulatedAction.Kind.INFINITE_LOOP ? NoExecutorMarker.INFINITE_LOOP : NoExecutorMarker.THREAD);
+            return intercepted.thread;
+        }
+    }
+
+    private NoIntercept noIntercept = new NoIntercept();
+
+    public SimulatedExecution()
+    {
+    }
+
+    public InterceptingExecutorFactory factory(InterceptorOfGlobalMethods interceptorOfGlobalMethods, ClassLoader classLoader, ThreadGroup threadGroup)
+    {
+        return new InterceptingExecutorFactory(this, interceptorOfGlobalMethods, classLoader, threadGroup);
+    }
+
+    public InterceptExecution intercept()
+    {
+        Thread thread = Thread.currentThread();
+        if (!(thread instanceof InterceptibleThread))
+            return noIntercept;
+
+        InterceptibleThread interceptibleThread = (InterceptibleThread) thread;
+        if (!interceptibleThread.isIntercepting())
+            return noIntercept;
+
+        return new SimulatedExecution.Intercept(interceptibleThread);
+    }
+
+    public ActionPlan plan()
+    {
+        return ActionPlan.setUpTearDown(start(), stop());
+    }
+
+    private ActionList start()
+    {
+        return ActionList.of(Actions.of("Start Simulating Execution", () -> {
+            noIntercept.forbidExecution().awaitTermination();
+            return ActionList.empty();
+        }));
+    }
+
+    private ActionList stop()
+    {
+        return ActionList.of(Actions.of("Stop Simulating Execution", () -> {
+            noIntercept = new NoIntercept();
+            return ActionList.empty();
+        }));
+    }
+
+    public void forceStop()
+    {
+        noIntercept = new NoIntercept();
+    }
+
+    public static <T> Callable<T> callable(Runnable run, T result)
+    {
+        return new Callable<T>()
+        {
+            public T call()
+            {
+                run.run();
+                return result;
+            }
+
+            public String toString()
+            {
+                return result == null ? run.toString() : (run + " returning " + result);
+            }
+        };
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedFailureDetector.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedFailureDetector.java
new file mode 100644
index 0000000..b473cfc
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedFailureDetector.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.systems;
+
+import java.net.InetSocketAddress;
+import java.util.Collections;
+import java.util.IdentityHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.gms.FailureDetector;
+import org.apache.cassandra.gms.IFailureDetectionEventListener;
+import org.apache.cassandra.gms.IFailureDetector;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+public class SimulatedFailureDetector
+{
+    public static class Instance implements IFailureDetector
+    {
+        private static volatile FailureDetector wrapped;
+
+        private static volatile Function<InetSocketAddress, Boolean> OVERRIDE;
+        private static final Map<IFailureDetectionEventListener, Boolean> LISTENERS = Collections.synchronizedMap(new IdentityHashMap<>());
+
+        private static FailureDetector wrapped()
+        {
+            FailureDetector detector = wrapped;
+            if (detector == null)
+            {
+                synchronized (LISTENERS)
+                {
+                    if (wrapped == null)
+                        wrapped = new FailureDetector();
+                }
+                detector = wrapped;
+            }
+            return detector;
+        }
+
+        private Boolean override(InetAddressAndPort ep)
+        {
+            Function<InetSocketAddress, Boolean> overrideF = OVERRIDE;
+            return overrideF == null ? null : overrideF.apply(new InetSocketAddress(ep.getAddress(), ep.getPort()));
+        }
+
+        public boolean isAlive(InetAddressAndPort ep)
+        {
+            Boolean override = override(ep);
+            return override != null ? override : wrapped().isAlive(ep);
+        }
+
+        public void interpret(InetAddressAndPort ep)
+        {
+            wrapped().interpret(ep);
+        }
+
+        public void report(InetAddressAndPort ep)
+        {
+            wrapped().report(ep);
+        }
+
+        public void remove(InetAddressAndPort ep)
+        {
+            wrapped().remove(ep);
+        }
+
+        public void forceConviction(InetAddressAndPort ep)
+        {
+            wrapped().forceConviction(ep);
+        }
+
+        public void registerFailureDetectionEventListener(IFailureDetectionEventListener listener)
+        {
+            LISTENERS.put(listener, Boolean.TRUE);
+        }
+
+        public void unregisterFailureDetectionEventListener(IFailureDetectionEventListener listener)
+        {
+            LISTENERS.remove(listener);
+        }
+
+        synchronized static void setup(Function<InetSocketAddress, Boolean> override, Consumer<Consumer<InetSocketAddress>> register)
+        {
+            OVERRIDE = override;
+            register.accept(ep -> LISTENERS.keySet().forEach(c -> c.convict(InetAddressAndPort.getByAddress(ep), Double.MAX_VALUE)));
+        }
+    }
+
+    final List<Consumer<InetSocketAddress>> listeners = new CopyOnWriteArrayList<>();
+    final Map<InetSocketAddress, Boolean> override = new ConcurrentHashMap<>();
+
+    public SimulatedFailureDetector(Cluster cluster)
+    {
+        cluster.forEach(i -> i.unsafeAcceptOnThisThread(Instance::setup,
+                override::get,
+                consumer -> listeners.add(e -> i.unsafeAcceptOnThisThread(Consumer::accept, consumer, e)))
+        );
+    }
+
+    public void markDown(InetSocketAddress address)
+    {
+        override.put(address, Boolean.FALSE);
+        listeners.forEach(c -> c.accept(address));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedFutureActionScheduler.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedFutureActionScheduler.java
new file mode 100644
index 0000000..f66999b
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedFutureActionScheduler.java
@@ -0,0 +1,199 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.BitSet;
+
+import org.apache.cassandra.simulator.FutureActionScheduler;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.cluster.Topology;
+import org.apache.cassandra.simulator.cluster.TopologyListener;
+import org.apache.cassandra.simulator.systems.NetworkConfig.PhaseConfig;
+import org.apache.cassandra.simulator.utils.KindOfSequence;
+import org.apache.cassandra.simulator.utils.KindOfSequence.Decision;
+import org.apache.cassandra.simulator.utils.KindOfSequence.LinkLatency;
+import org.apache.cassandra.simulator.utils.KindOfSequence.NetworkDecision;
+import org.apache.cassandra.simulator.utils.KindOfSequence.Period;
+
+import static org.apache.cassandra.simulator.FutureActionScheduler.Deliver.DELIVER;
+import static org.apache.cassandra.simulator.FutureActionScheduler.Deliver.DELIVER_AND_TIMEOUT;
+import static org.apache.cassandra.simulator.FutureActionScheduler.Deliver.FAILURE;
+import static org.apache.cassandra.simulator.FutureActionScheduler.Deliver.TIMEOUT;
+
+public class SimulatedFutureActionScheduler implements FutureActionScheduler, TopologyListener
+{
+    static class Network
+    {
+        final LinkLatency normalLatency;
+        final LinkLatency delayLatency;
+        final NetworkDecision dropMessage;
+        final NetworkDecision delayMessage;
+
+        public Network(int nodes, PhaseConfig config, RandomSource random, KindOfSequence kind)
+        {
+            normalLatency = kind.linkLatency(nodes, config.normalLatency, random);
+            delayLatency = kind.linkLatency(nodes, config.delayLatency, random);
+            dropMessage = kind.networkDecision(nodes, config.dropChance, random);
+            delayMessage = kind.networkDecision(nodes, config.delayChance, random);
+        }
+    }
+
+    static class Scheduler extends SchedulerConfig
+    {
+        final Decision delayChance;
+        public Scheduler(SchedulerConfig config, RandomSource random, KindOfSequence kind)
+        {
+            super(config.longDelayChance, config.delayNanos, config.longDelayNanos);
+            delayChance = kind.decision(config.longDelayChance, random);
+        }
+    }
+
+    final int nodeCount;
+    final RandomSource random;
+    final SimulatedTime time;
+
+    // TODO (feature): should we produce more than two simultaneous partitions?
+    final BitSet isInDropPartition = new BitSet();
+    final BitSet isInFlakyPartition = new BitSet();
+
+    Topology topology;
+
+    final Network normal;
+    final Network flaky;
+    final Scheduler scheduler;
+
+    final Decision decidePartition;
+    final Decision decideFlaky;
+    final Period recomputePeriod;
+
+    long recomputeAt;
+
+    public SimulatedFutureActionScheduler(KindOfSequence kind, int nodeCount, RandomSource random, SimulatedTime time, NetworkConfig network, SchedulerConfig scheduler)
+    {
+        this.nodeCount = nodeCount;
+        this.random = random;
+        this.time = time;
+        this.normal = new Network(nodeCount, network.normal, random, kind);
+        this.flaky = new Network(nodeCount, network.flaky, random, kind);
+        this.scheduler = new Scheduler(scheduler, random, kind);
+        this.decidePartition = kind.decision(network.partitionChance, random);
+        this.decideFlaky = kind.decision(network.flakyChance, random);
+        this.recomputePeriod = kind.period(network.reconfigureInterval, random);
+    }
+
+    private void maybeRecompute()
+    {
+        if (time.nanoTime() < recomputeAt)
+            return;
+
+        if (topology == null)
+            return;
+
+        recompute();
+    }
+
+    private void recompute()
+    {
+        isInDropPartition.clear();
+        isInFlakyPartition.clear();
+
+        if (decidePartition.get(random))
+            computePartition(isInDropPartition);
+
+        if (decideFlaky.get(random))
+            computePartition(isInFlakyPartition);
+
+        recomputeAt = time.nanoTime() + recomputePeriod.get(random);
+    }
+
+    private void computePartition(BitSet compute)
+    {
+        int size = topology.quorumRf <= 4 ? 1 : random.uniform(1, (topology.quorumRf - 1)/2);
+        while (size > 0)
+        {
+            int next = random.uniform(0, topology.membersOfQuorum.length);
+            if (compute.get(next))
+                continue;
+            compute.set(next);
+            --size;
+        }
+    }
+
+    Network config(int from, int to)
+    {
+        maybeRecompute();
+        return isInFlakyPartition.get(from) != isInFlakyPartition.get(to) ? flaky : normal;
+    }
+
+    @Override
+    public FutureActionScheduler.Deliver shouldDeliver(int from, int to)
+    {
+        Network config = config(from, to);
+
+        if (isInDropPartition.get(from) != isInDropPartition.get(to))
+            return TIMEOUT;
+
+        if (!config.dropMessage.get(random, from, to))
+            return DELIVER;
+
+        if (random.decide(0.5f))
+            return DELIVER_AND_TIMEOUT;
+
+        if (random.decide(0.5f))
+            return TIMEOUT;
+
+        return FAILURE;
+    }
+
+    @Override
+    public long messageDeadlineNanos(int from, int to)
+    {
+        Network config = config(from, to);
+        return time.nanoTime() + (config.delayMessage.get(random, from, to)
+                                  ? config.normalLatency.get(random, from, to)
+                                  : config.delayLatency.get(random, from, to));
+    }
+
+    @Override
+    public long messageTimeoutNanos(long expiresAtNanos, long expirationIntervalNanos)
+    {
+        return expiresAtNanos + random.uniform(0, expirationIntervalNanos / 2);
+    }
+
+    @Override
+    public long messageFailureNanos(int from, int to)
+    {
+        return messageDeadlineNanos(from, to);
+    }
+
+    @Override
+    public long schedulerDelayNanos()
+    {
+        return (scheduler.delayChance.get(random) ? scheduler.longDelayNanos : scheduler.delayNanos).select(random);
+    }
+
+    @Override
+    public void onChange(Topology newTopology)
+    {
+        Topology oldTopology = topology;
+        topology = newTopology;
+        if (oldTopology == null || (newTopology.quorumRf < oldTopology.quorumRf && newTopology.quorumRf < isInDropPartition.cardinality()))
+            recompute();
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedMessageDelivery.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedMessageDelivery.java
new file mode 100644
index 0000000..b0821d7
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedMessageDelivery.java
@@ -0,0 +1,42 @@
+/*
+ * 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.simulator.systems;
+
+import java.net.InetSocketAddress;
+
+import org.apache.cassandra.distributed.api.ICluster;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IMessage;
+import org.apache.cassandra.distributed.api.IMessageSink;
+
+public class SimulatedMessageDelivery implements IMessageSink
+{
+    private final ICluster<? extends IInvokableInstance> cluster;
+    public SimulatedMessageDelivery(ICluster<? extends IInvokableInstance> cluster)
+    {
+        this.cluster = cluster;
+        cluster.setMessageSink(this);
+    }
+
+    @Override
+    public void accept(InetSocketAddress to, IMessage message)
+    {
+        ((InterceptibleThread)Thread.currentThread()).interceptMessage(cluster.get(message.from()), cluster.get(to), message);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedQuery.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedQuery.java
new file mode 100644
index 0000000..d190fd7
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedQuery.java
@@ -0,0 +1,53 @@
+/*
+ * 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.simulator.systems;
+
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.impl.Query;
+
+public class SimulatedQuery extends SimulatedActionCallable<Object[][]>
+{
+    public SimulatedQuery(Object description, SimulatedSystems simulated, IInvokableInstance instance, String query, ConsistencyLevel commitConsistency, ConsistencyLevel serialConsistency, Object... params)
+    {
+        this(description, Modifiers.NONE, Modifiers.NONE, simulated, instance, query, commitConsistency, serialConsistency, params);
+    }
+
+    public SimulatedQuery(Object description, Modifiers self, Modifiers transitive, SimulatedSystems simulated, IInvokableInstance instance, String query, ConsistencyLevel commitConsistency, ConsistencyLevel serialConsistency, Object[] params)
+    {
+        super(description, self, transitive, simulated, instance, new Query(query, -1, commitConsistency, serialConsistency, params));
+    }
+
+    public SimulatedQuery(Object description, Modifiers self, Modifiers transitive, SimulatedSystems simulated, IInvokableInstance instance, String query, long timestamp, ConsistencyLevel consistency, Object... params)
+    {
+        this(description, self, transitive, simulated, instance, query, timestamp, consistency, null, params);
+    }
+
+    public SimulatedQuery(Object description, Modifiers self, Modifiers transitive, SimulatedSystems simulated, IInvokableInstance instance, String query, long timestamp, ConsistencyLevel commitConsistency, ConsistencyLevel serialConsistency, Object[] params)
+    {
+        super(description, self, transitive, simulated, instance, new Query(query, timestamp, commitConsistency, serialConsistency, params));
+    }
+
+    @Override
+    public void accept(Object[][] success, Throwable failure)
+    {
+        if (failure != null)
+            simulated.failures.accept(failure);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedSnitch.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedSnitch.java
new file mode 100644
index 0000000..a87a88a
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedSnitch.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.systems;
+
+import java.net.InetSocketAddress;
+import java.util.Comparator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.stream.IntStream;
+
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.IInstanceConfig;
+import org.apache.cassandra.locator.IEndpointSnitch;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.ReplicaCollection;
+import org.apache.cassandra.simulator.cluster.NodeLookup;
+
+public class SimulatedSnitch extends NodeLookup
+{
+    public static class Instance implements IEndpointSnitch
+    {
+        private static volatile Function<InetSocketAddress, String> LOOKUP_DC;
+
+        public String getRack(InetAddressAndPort endpoint)
+        {
+            return LOOKUP_DC.apply(endpoint);
+        }
+
+        public String getDatacenter(InetAddressAndPort endpoint)
+        {
+            return LOOKUP_DC.apply(endpoint);
+        }
+
+        public <C extends ReplicaCollection<? extends C>> C sortedByProximity(InetAddressAndPort address, C addresses)
+        {
+            return addresses.sorted(Comparator.comparingInt(SimulatedSnitch::asInt));
+        }
+
+        public int compareEndpoints(InetAddressAndPort target, Replica r1, Replica r2)
+        {
+            return Comparator.comparingInt(SimulatedSnitch::asInt).compare(r1, r2);
+        }
+
+        public void gossiperStarting()
+        {
+        }
+
+        public boolean isWorthMergingForRangeQuery(ReplicaCollection<?> merged, ReplicaCollection<?> l1, ReplicaCollection<?> l2)
+        {
+            return false;
+        }
+
+        public static void setup(Function<InetSocketAddress, String> lookupDc)
+        {
+            LOOKUP_DC = lookupDc;
+        }
+    }
+
+    final int[] numInDcs;
+    final String[] nameOfDcs;
+
+    public SimulatedSnitch(int[] nodeToDc, int[] numInDcs)
+    {
+        super(nodeToDc);
+        this.nameOfDcs = IntStream.range(0, numInDcs.length).mapToObj(i -> "dc" + i).toArray(String[]::new);
+        this.numInDcs = numInDcs;
+    }
+
+    public int dcCount()
+    {
+        return nameOfDcs.length;
+    }
+
+    public String nameOfDc(int i)
+    {
+        return nameOfDcs[i];
+    }
+
+    public Cluster.Builder setup(Cluster.Builder builder)
+    {
+        for (int i = 0 ; i < numInDcs.length ; ++i)
+            builder.withRack(nameOfDcs[i], nameOfDcs[i], numInDcs[i]);
+        Consumer<IInstanceConfig> prev = builder.getConfigUpdater();
+        return builder.withConfig(config -> {
+            if (prev != null)
+                prev.accept(config);
+            config.set("endpoint_snitch", SimulatedSnitch.Instance.class.getName())
+                  .set("dynamic_snitch", false);
+        });
+    }
+
+    public Instance get()
+    {
+        return new Instance();
+    }
+
+    public void setup(Cluster cluster)
+    {
+        Function<InetSocketAddress, String> lookup = Cluster.getUniqueAddressLookup(cluster, i -> nameOfDcs[dcOf(i.config().num())])::get;
+        cluster.forEach(i -> i.unsafeAcceptOnThisThread(Instance::setup, lookup));
+        Instance.setup(lookup);
+    }
+
+    private static int asInt(Replica address)
+    {
+        byte[] bytes = address.endpoint().addressBytes;
+        return bytes[0] | (bytes[1] << 8) | (bytes[2] << 16) | (bytes[3] << 24);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedSystems.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedSystems.java
new file mode 100644
index 0000000..c3cf46a
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedSystems.java
@@ -0,0 +1,104 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.cassandra.distributed.api.IInvokableInstance;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.SerializableRunnable;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.Action.Modifiers;
+import org.apache.cassandra.simulator.Debug;
+import org.apache.cassandra.simulator.FutureActionScheduler;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.cluster.Topology;
+import org.apache.cassandra.simulator.cluster.TopologyListener;
+
+import static org.apache.cassandra.simulator.Action.Modifiers.NONE;
+import static org.apache.cassandra.simulator.Action.Modifiers.RELIABLE;
+
+public class SimulatedSystems
+{
+    public final RandomSource random;
+    public final SimulatedTime time;
+    public final SimulatedMessageDelivery delivery;
+    public final SimulatedExecution execution;
+    public final SimulatedBallots ballots;
+    public final SimulatedFailureDetector failureDetector;
+    public final SimulatedSnitch snitch;
+    public final FutureActionScheduler futureScheduler;
+    public final Debug debug;
+    public final Failures failures;
+    private final List<TopologyListener> topologyListeners; // TODO (cleanup): this is a mutable set of listeners but shared between instances
+
+    public SimulatedSystems(SimulatedSystems copy)
+    {
+        this(copy.random, copy.time, copy.delivery, copy.execution, copy.ballots, copy.failureDetector, copy.snitch, copy.futureScheduler, copy.debug, copy.failures, copy.topologyListeners);
+    }
+
+    public SimulatedSystems(RandomSource random, SimulatedTime time, SimulatedMessageDelivery delivery, SimulatedExecution execution, SimulatedBallots ballots, SimulatedFailureDetector failureDetector, SimulatedSnitch snitch, FutureActionScheduler futureScheduler, Debug debug, Failures failures)
+    {
+        this(random, time, delivery, execution, ballots, failureDetector, snitch, futureScheduler, debug, failures, new ArrayList<>());
+    }
+
+    private SimulatedSystems(RandomSource random, SimulatedTime time, SimulatedMessageDelivery delivery, SimulatedExecution execution, SimulatedBallots ballots, SimulatedFailureDetector failureDetector, SimulatedSnitch snitch, FutureActionScheduler futureScheduler, Debug debug, Failures failures, List<TopologyListener> topologyListeners)
+    {
+        this.random = random;
+        this.time = time;
+        this.delivery = delivery;
+        this.execution = execution;
+        this.ballots = ballots;
+        this.failureDetector = failureDetector;
+        this.snitch = snitch;
+        this.futureScheduler = futureScheduler;
+        this.debug = debug;
+        this.failures = failures;
+        this.topologyListeners = topologyListeners;
+    }
+
+    public Action run(Object description, IInvokableInstance on, SerializableRunnable run)
+    {
+        return new SimulatedActionTask(description, NONE, NONE, this, on, run);
+    }
+
+    public Action transitivelyReliable(Object description, IInvokableInstance on, SerializableRunnable run)
+    {
+        return new SimulatedActionTask(description, NONE, RELIABLE, this, on, run);
+    }
+
+    /**
+     * Useful for non-serializable operations we still need to intercept the execution of
+     */
+    public Action invoke(Object description, Modifiers self, Modifiers children, InterceptedExecution invoke)
+    {
+        return new SimulatedActionTask(description, self, children, null, this, invoke);
+    }
+
+    public void announce(Topology topology)
+    {
+        for (int i = 0; i < topologyListeners.size() ; ++i)
+            topologyListeners.get(i).onChange(topology);
+    }
+
+    public void register(TopologyListener listener)
+    {
+        topologyListeners.add(listener);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedTime.java b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedTime.java
new file mode 100644
index 0000000..ae20d57
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/systems/SimulatedTime.java
@@ -0,0 +1,490 @@
+/*
+ * 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.simulator.systems;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.LongConsumer;
+import java.util.regex.Pattern;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.distributed.impl.IsolatedExecutor;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.utils.KindOfSequence;
+import org.apache.cassandra.simulator.utils.KindOfSequence.Period;
+import org.apache.cassandra.simulator.utils.LongRange;
+import org.apache.cassandra.utils.Clock;
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.MonotonicClock;
+import org.apache.cassandra.utils.MonotonicClock.AbstractEpochSamplingClock.AlmostSameTime;
+import org.apache.cassandra.utils.MonotonicClockTranslation;
+import org.apache.cassandra.utils.Shared;
+
+import static java.util.concurrent.TimeUnit.DAYS;
+import static java.util.concurrent.TimeUnit.HOURS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.simulator.RandomSource.Choices.uniform;
+
+// TODO (cleanup): when we encounter an exception and unwind the simulation, we should restore normal time to go with normal waits etc.
+public class SimulatedTime
+{
+    private static final Pattern PERMITTED_TIME_THREADS = Pattern.compile("(logback|SimulationLiveness|Reconcile)[-:][0-9]+");
+
+    @Shared(scope = Shared.Scope.SIMULATION)
+    public interface Listener
+    {
+        void accept(String kind, long value);
+    }
+
+    @Shared(scope = Shared.Scope.SIMULATION)
+    public interface ClockAndMonotonicClock extends Clock, MonotonicClock
+    {
+    }
+
+    @Shared(scope = Shared.Scope.SIMULATION)
+    public interface LocalTime extends ClockAndMonotonicClock
+    {
+        long relativeToLocalNanos(long relativeNanos);
+        long relativeToGlobalNanos(long relativeNanos);
+        long localToRelativeNanos(long absoluteLocalNanos);
+        long localToGlobalNanos(long absoluteLocalNanos);
+        long nextGlobalMonotonicMicros();
+    }
+
+    @PerClassLoader
+    private static class Disabled extends Clock.Default implements LocalTime
+    {
+        @Override
+        public long now()
+        {
+            return nanoTime();
+        }
+
+        @Override
+        public long error()
+        {
+            return 0;
+        }
+
+        @Override
+        public MonotonicClockTranslation translate()
+        {
+            return new AlmostSameTime(System.currentTimeMillis(), System.nanoTime(), 0L);
+        }
+
+        @Override
+        public boolean isAfter(long instant)
+        {
+            return isAfter(System.nanoTime(), instant);
+        }
+
+        @Override
+        public boolean isAfter(long now, long instant)
+        {
+            return now > instant;
+        }
+
+        @Override
+        public long relativeToLocalNanos(long relativeNanos)
+        {
+            return System.nanoTime() + relativeNanos;
+        }
+
+        @Override
+        public long relativeToGlobalNanos(long relativeNanos)
+        {
+            return System.nanoTime() + relativeNanos;
+        }
+
+        @Override
+        public long localToRelativeNanos(long absoluteLocalNanos)
+        {
+            return absoluteLocalNanos - System.nanoTime();
+        }
+
+        @Override
+        public long localToGlobalNanos(long absoluteLocalNanos)
+        {
+            return absoluteLocalNanos;
+        }
+
+        @Override
+        public long nextGlobalMonotonicMicros()
+        {
+            return FBUtilities.timestampMicros();
+        }
+    }
+
+    public static class Delegating implements ClockAndMonotonicClock
+    {
+        final Disabled disabled = new Disabled();
+        private ClockAndMonotonicClock check()
+        {
+            Thread thread = Thread.currentThread();
+            if (thread instanceof InterceptibleThread)
+            {
+                InterceptibleThread interceptibleThread = ((InterceptibleThread) thread);
+                if (interceptibleThread.isIntercepting())
+                    return interceptibleThread.time();
+            }
+            if (PERMITTED_TIME_THREADS.matcher(Thread.currentThread().getName()).matches())
+                return disabled;
+            throw new IllegalStateException("Using time is not allowed during simulation");
+        }
+
+        public long nanoTime() { return check().nanoTime(); }
+        public long currentTimeMillis()  { return check().currentTimeMillis(); }
+        public long now()  { return check().now(); }
+        public long error()  { return check().error(); }
+        public MonotonicClockTranslation translate()  { return check().translate(); }
+        public boolean isAfter(long instant)  { return check().isAfter(instant); }
+        public boolean isAfter(long now, long instant)  { return check().isAfter(now, instant); }
+    }
+
+    @PerClassLoader
+    public static class Global implements Clock, MonotonicClock
+    {
+        private static LocalTime current;
+
+        public long nanoTime()
+        {
+            return current.nanoTime();
+        }
+
+        public long currentTimeMillis()
+        {
+            return current.currentTimeMillis();
+        }
+
+        @Override
+        public long now()
+        {
+            return current.now();
+        }
+
+        @Override
+        public long error()
+        {
+            return current.error();
+        }
+
+        @Override
+        public MonotonicClockTranslation translate()
+        {
+            return current.translate();
+        }
+
+        @Override
+        public boolean isAfter(long instant)
+        {
+            return current.isAfter(instant);
+        }
+
+        @Override
+        public boolean isAfter(long now, long instant)
+        {
+            return current.isAfter(now, instant);
+        }
+
+        public static long relativeToGlobalNanos(long relativeNanos)
+        {
+            return current.relativeToGlobalNanos(relativeNanos);
+        }
+
+        public static long relativeToLocalNanos(long relativeNanos)
+        {
+            return current.relativeToLocalNanos(relativeNanos);
+        }
+
+        public static long localToRelativeNanos(long absoluteNanos)
+        {
+            return current.localToRelativeNanos(absoluteNanos);
+        }
+
+        public static long localToGlobalNanos(long absoluteNanos)
+        {
+            return current.localToGlobalNanos(absoluteNanos);
+        }
+
+        public static LocalTime current()
+        {
+            return current;
+        }
+
+        @SuppressWarnings("unused") // used by simulator for schema changes
+        public static long nextGlobalMonotonicMicros()
+        {
+            return current.nextGlobalMonotonicMicros();
+        }
+
+        public static void setup(LocalTime newLocalTime)
+        {
+            current = newLocalTime;
+        }
+
+        public static void disable()
+        {
+            current = new Disabled();
+        }
+    }
+
+    public class InstanceTime implements LocalTime
+    {
+        final Period nanosDriftSupplier;
+        long from, to;
+        long baseDrift, nextDrift, lastLocalNanoTime, lastDrift, lastGlobal;
+        double diffPerGlobal;
+
+        private InstanceTime(Period nanosDriftSupplier)
+        {
+            this.nanosDriftSupplier = nanosDriftSupplier;
+        }
+
+        @Override
+        public long nanoTime()
+        {
+            long global = globalNanoTime;
+            if (lastGlobal == global)
+                return lastLocalNanoTime;
+
+            if (global >= to)
+            {
+                baseDrift = nextDrift;
+                nextDrift = nanosDriftSupplier.get(random);
+                from = global;
+                to = global + Math.max(baseDrift, nextDrift);
+                diffPerGlobal = (nextDrift - baseDrift) / (double)(to - from);
+                listener.accept("SetNextDrift", nextDrift);
+            }
+
+            long drift = baseDrift + (long)(diffPerGlobal * (global - from));
+            long local = global + drift;
+            lastGlobal = global;
+            lastDrift = drift;
+            lastLocalNanoTime = local;
+            listener.accept("ReadLocal", local);
+            return local;
+        }
+
+        @Override
+        public long currentTimeMillis()
+        {
+            return NANOSECONDS.toMillis(nanoTime()) + millisEpoch;
+        }
+
+        @Override
+        public long now()
+        {
+            return nanoTime();
+        }
+
+        @Override
+        public long error()
+        {
+            return 1;
+        }
+
+        @Override
+        public MonotonicClockTranslation translate()
+        {
+            return new MonotonicClockTranslation()
+            {
+                @Override
+                public long fromMillisSinceEpoch(long currentTimeMillis)
+                {
+                    return MILLISECONDS.toNanos(currentTimeMillis - millisEpoch);
+                }
+
+                @Override
+                public long toMillisSinceEpoch(long nanoTime)
+                {
+                    return NANOSECONDS.toMillis(nanoTime) + millisEpoch;
+                }
+
+                @Override
+                public long error()
+                {
+                    return MILLISECONDS.toNanos(1L);
+                }
+            };
+        }
+
+        @Override
+        public boolean isAfter(long instant)
+        {
+            return false;
+        }
+
+        @Override
+        public boolean isAfter(long now, long instant)
+        {
+            return false;
+        }
+
+        @Override
+        public long nextGlobalMonotonicMicros()
+        {
+            return SimulatedTime.this.nextGlobalMonotonicMicros();
+        }
+
+        @Override
+        public long relativeToLocalNanos(long relativeNanos)
+        {
+            return relativeNanos + lastLocalNanoTime;
+        }
+
+        @Override
+        public long relativeToGlobalNanos(long relativeNanos)
+        {
+            return relativeNanos + globalNanoTime;
+        }
+
+        @Override
+        public long localToRelativeNanos(long absoluteLocalNanos)
+        {
+            return absoluteLocalNanos - lastLocalNanoTime;
+        }
+
+        @Override
+        public long localToGlobalNanos(long absoluteLocalNanos)
+        {
+            return absoluteLocalNanos - lastDrift;
+        }
+    }
+
+    private final KindOfSequence kindOfDrift;
+    private final LongRange nanosDriftRange;
+    private final RandomSource random;
+    private final Period discontinuityTimeSupplier;
+    private final long millisEpoch;
+    private volatile long globalNanoTime;
+    private long futureTimestamp;
+    private long discontinuityTime;
+    private boolean permitDiscontinuities;
+    private final List<LongConsumer> onDiscontinuity = new ArrayList<>();
+    private final Listener listener;
+    private InstanceTime[] instanceTimes;
+
+    public SimulatedTime(int nodeCount, RandomSource random, long millisEpoch, LongRange nanoDriftRange, KindOfSequence kindOfDrift, Period discontinuityTimeSupplier, Listener listener)
+    {
+        this.random = random;
+        this.millisEpoch = millisEpoch;
+        this.nanosDriftRange = nanoDriftRange;
+        this.futureTimestamp = (millisEpoch + DAYS.toMillis(1000)) * 1000;
+        this.kindOfDrift = kindOfDrift;
+        this.discontinuityTime = MILLISECONDS.toNanos(random.uniform(500L, 30000L));
+        this.discontinuityTimeSupplier = discontinuityTimeSupplier;
+        this.listener = listener;
+        this.instanceTimes = new InstanceTime[nodeCount];
+    }
+
+    public Closeable setup(int nodeNum, ClassLoader classLoader)
+    {
+        Preconditions.checkState(instanceTimes[nodeNum - 1] == null);
+        InstanceTime instanceTime = new InstanceTime(kindOfDrift.period(nanosDriftRange, random));
+        IsolatedExecutor.transferAdhoc((IIsolatedExecutor.SerializableConsumer<LocalTime>) Global::setup, classLoader)
+                        .accept(instanceTime);
+        instanceTimes[nodeNum - 1] = instanceTime;
+        return IsolatedExecutor.transferAdhoc((IIsolatedExecutor.SerializableRunnable) Global::disable, classLoader)::run;
+    }
+
+    public InstanceTime get(int nodeNum)
+    {
+        return instanceTimes[nodeNum - 1];
+    }
+
+    public void permitDiscontinuities()
+    {
+        listener.accept("PermitDiscontinuity", 1);
+        permitDiscontinuities = true;
+        updateAndMaybeApplyDiscontinuity(globalNanoTime);
+    }
+
+    public void forbidDiscontinuities()
+    {
+        listener.accept("PermitDiscontinuity", 0);
+        permitDiscontinuities = false;
+    }
+
+    private void updateAndMaybeApplyDiscontinuity(long newGlobal)
+    {
+        if (permitDiscontinuities && newGlobal >= discontinuityTime)
+        {
+            updateAndApplyDiscontinuity(newGlobal);
+        }
+        else
+        {
+            globalNanoTime = newGlobal;
+            listener.accept("SetGlobal", newGlobal);
+        }
+    }
+
+    private void updateAndApplyDiscontinuity(long newGlobal)
+    {
+        long discontinuity = uniform(DAYS, HOURS, MINUTES).choose(random).toNanos(1L);
+        listener.accept("ApplyDiscontinuity", discontinuity);
+        discontinuityTime = newGlobal + discontinuity + discontinuityTimeSupplier.get(random);
+        globalNanoTime = newGlobal + discontinuity;
+        listener.accept("SetGlobal", newGlobal + discontinuity);
+        onDiscontinuity.forEach(l -> l.accept(discontinuity));
+    }
+
+    public void tick(long nanos)
+    {
+        listener.accept("Tick", nanos);
+        long global = globalNanoTime;
+        if (nanos > global)
+        {
+            updateAndMaybeApplyDiscontinuity(nanos);
+        }
+        else
+        {
+            globalNanoTime = global + 1;
+            listener.accept("IncrGlobal", global + 1);
+        }
+    }
+
+    public long nanoTime()
+    {
+        long global = globalNanoTime;
+        listener.accept("ReadGlobal", global);
+        return global;
+    }
+
+    // make sure schema changes persist
+    public synchronized long nextGlobalMonotonicMicros()
+    {
+        return ++futureTimestamp;
+    }
+
+    public void onDiscontinuity(LongConsumer onDiscontinuity)
+    {
+        this.onDiscontinuity.add(onDiscontinuity);
+    }
+
+    public void onTimeEvent(String kind, long value)
+    {
+        listener.accept(kind, value);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/ChanceRange.java b/test/simulator/main/org/apache/cassandra/simulator/utils/ChanceRange.java
new file mode 100644
index 0000000..5978e20
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/ChanceRange.java
@@ -0,0 +1,50 @@
+/*
+ * 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.simulator.utils;
+
+import java.util.function.ToDoubleFunction;
+
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.asm.ChanceSupplier;
+
+public class ChanceRange
+{
+    public final ToDoubleFunction<RandomSource> distribution;
+    public final float min;
+    public final float max;
+
+    public ChanceRange(ToDoubleFunction<RandomSource> distribution, float min, float max)
+    {
+        this.distribution = distribution;
+        assert min >= 0 && max <= 1.0;
+        this.min = min;
+        this.max = max;
+    }
+
+    public float select(RandomSource random)
+    {
+        if (min >= max) return min;
+        return (float) ((distribution.applyAsDouble(random) * (max - min)) + min);
+    }
+
+    public ChanceSupplier asSupplier(RandomSource random)
+    {
+        return () -> select(random);
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/CompactLists.java b/test/simulator/main/org/apache/cassandra/simulator/utils/CompactLists.java
new file mode 100644
index 0000000..cb62bb7
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/CompactLists.java
@@ -0,0 +1,160 @@
+/*
+ * 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.simulator.utils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+
+import org.apache.cassandra.distributed.api.IIsolatedExecutor.TriConsumer;
+import org.apache.cassandra.utils.Throwables;
+
+public class CompactLists
+{
+    public static <I> List<I> append(List<I> in, I append)
+    {
+        if (in == null) return Collections.singletonList(append);
+        else  if (in.size() == 1)
+        {
+            List<I> out = new ArrayList<>(2);
+            out.add(in.get(0));
+            out.add(append);
+            return out;
+        }
+        else
+        {
+            in.add(append);
+            return in;
+        }
+    }
+
+    public static <I> List<I> remove(List<I> in, I remove)
+    {
+        if (in == null) return null;
+        else if (in.size() == 1) return in.contains(remove) ? null : in;
+        else
+        {
+            in.remove(remove);
+            return in;
+        }
+    }
+
+    public static <I> Throwable safeForEach(List<I> list, Consumer<I> forEach)
+    {
+        if (list == null)
+            return null;
+
+        if (list.size() == 1)
+        {
+            try
+            {
+                forEach.accept(list.get(0));
+                return null;
+            }
+            catch (Throwable t)
+            {
+                return t;
+            }
+        }
+
+        Throwable result = null;
+        for (int i = 0, maxi = list.size() ; i < maxi ; ++i)
+        {
+            try
+            {
+                forEach.accept(list.get(i));
+            }
+            catch (Throwable t)
+            {
+                result = Throwables.merge(result, t);
+            }
+        }
+        return result;
+    }
+
+    public static <I1, I2> Throwable safeForEach(List<I1> list, BiConsumer<I1, I2> forEach, I2 i2)
+    {
+        if (list == null)
+            return null;
+
+        if (list.size() == 1)
+        {
+            try
+            {
+                forEach.accept(list.get(0), i2);
+                return null;
+            }
+            catch (Throwable t)
+            {
+                return t;
+            }
+        }
+
+        Throwable result = null;
+        for (int i = 0, maxi = list.size() ; i < maxi ; ++i)
+        {
+            try
+            {
+                forEach.accept(list.get(i), i2);
+            }
+            catch (Throwable t)
+            {
+                result = Throwables.merge(result, t);
+            }
+        }
+        return result;
+    }
+
+    public static <I1, I2, I3> Throwable safeForEach(List<I1> list, TriConsumer<I1, I2, I3> forEach, I2 i2, I3 i3)
+    {
+        if (list == null)
+            return null;
+
+        if (list.size() == 1)
+        {
+            try
+            {
+                forEach.accept(list.get(0), i2, i3);
+                return null;
+            }
+            catch (Throwable t)
+            {
+                return t;
+            }
+        }
+
+        Throwable result = null;
+        for (int i = 0, maxi = list.size() ; i < maxi ; ++i)
+        {
+            try
+            {
+                forEach.accept(list.get(i), i2, i3);
+            }
+            catch (Throwable t)
+            {
+                result = Throwables.merge(result, t);
+            }
+        }
+        return result;
+    }
+
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/CountingCollection.java b/test/simulator/main/org/apache/cassandra/simulator/utils/CountingCollection.java
new file mode 100644
index 0000000..7e04fcd
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/CountingCollection.java
@@ -0,0 +1,54 @@
+/*
+ * 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.simulator.utils;
+
+import java.util.AbstractCollection;
+import java.util.Iterator;
+
+public class CountingCollection<T> extends AbstractCollection<T>
+{
+    int count;
+
+    @Override
+    public boolean add(T t)
+    {
+        ++count;
+        return true;
+    }
+
+    @Override
+    public boolean remove(Object o)
+    {
+        if (count == 0) throw new AssertionError();
+        --count;
+        return true;
+    }
+
+    @Override
+    public Iterator<T> iterator()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public int size()
+    {
+        return count;
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/IntRange.java b/test/simulator/main/org/apache/cassandra/simulator/utils/IntRange.java
new file mode 100644
index 0000000..ad465dd
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/IntRange.java
@@ -0,0 +1,71 @@
+/*
+ * 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.simulator.utils;
+
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.base.Preconditions;
+
+import org.apache.cassandra.simulator.RandomSource;
+
+public class IntRange
+{
+    public final int min;
+    public final int max;
+
+    public IntRange(int min, int max)
+    {
+        this.min = min;
+        this.max = max;
+    }
+
+    public IntRange(long min, long max)
+    {
+        Preconditions.checkArgument(min < Integer.MAX_VALUE);
+        Preconditions.checkArgument(max <= Integer.MAX_VALUE);
+        this.min = (int)min;
+        this.max = (int)max;
+    }
+
+    public IntRange(long min, long max, TimeUnit from, TimeUnit to)
+    {
+        this(to.convert(min,from), to.convert(max, from));
+    }
+
+    public int select(RandomSource random)
+    {
+        if (min == max) return min;
+        return random.uniform(min, 1 + max);
+    }
+
+    public int select(RandomSource random, int minlb, int maxub)
+    {
+        int min = Math.max(this.min, minlb);
+        int max = Math.min(this.max, maxub);
+        if (min >= max) return min;
+        return random.uniform(min, 1 + max);
+    }
+
+    public static Optional<IntRange> parseRange(Optional<String> chance)
+    {
+        return chance.map(s -> new IntRange(Integer.parseInt(s.replaceFirst("\\.\\.+[0-9]+", "")),
+                                         Integer.parseInt(s.replaceFirst("[0-9]+\\.\\.+", ""))));
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/IntrusiveLinkedList.java b/test/simulator/main/org/apache/cassandra/simulator/utils/IntrusiveLinkedList.java
new file mode 100644
index 0000000..f3dd40d
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/IntrusiveLinkedList.java
@@ -0,0 +1,90 @@
+/*
+ * 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.simulator.utils;
+
+import java.util.Iterator;
+import java.util.Spliterator;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
+
+import static java.util.Spliterators.spliteratorUnknownSize;
+
+/**
+ * A simple intrusive double-linked list for maintaining a list of tasks,
+ * useful for invalidating queued ordered tasks
+ */
+@SuppressWarnings("unchecked")
+public class IntrusiveLinkedList<O extends IntrusiveLinkedListNode> extends IntrusiveLinkedListNode
+{
+    public IntrusiveLinkedList()
+    {
+        prev = next = this;
+    }
+
+    public void add(O add)
+    {
+        assert add.prev == null && add.next == null;
+        IntrusiveLinkedListNode after = this;
+        IntrusiveLinkedListNode before = prev;
+        add.next = after;
+        add.prev = before;
+        before.next = add;
+        after.prev = add;
+    }
+
+    public O poll()
+    {
+        if (isEmpty())
+            return null;
+
+        IntrusiveLinkedListNode next = this.next;
+        next.remove();
+        return (O) next;
+    }
+
+    public boolean isEmpty()
+    {
+        return next == this;
+    }
+
+    public Stream<O> stream()
+    {
+        Iterator<O> iterator = new Iterator<O>()
+        {
+            IntrusiveLinkedListNode next = IntrusiveLinkedList.this.next;
+
+            @Override
+            public boolean hasNext()
+            {
+                return next != IntrusiveLinkedList.this;
+            }
+
+            @Override
+            public O next()
+            {
+                O result = (O)next;
+                next = next.next;
+                return result;
+            }
+        };
+
+        return StreamSupport.stream(spliteratorUnknownSize(iterator, Spliterator.IMMUTABLE), false);
+    }
+}
+
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/IntrusiveLinkedListNode.java b/test/simulator/main/org/apache/cassandra/simulator/utils/IntrusiveLinkedListNode.java
new file mode 100644
index 0000000..2145bd8
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/IntrusiveLinkedListNode.java
@@ -0,0 +1,41 @@
+/*
+ * 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.simulator.utils;
+
+public abstract class IntrusiveLinkedListNode
+{
+    IntrusiveLinkedListNode prev;
+    IntrusiveLinkedListNode next;
+
+    protected boolean isFree()
+    {
+        return next == null;
+    }
+
+    protected void remove()
+    {
+        if (next != null)
+        {
+            prev.next = next;
+            next.prev = prev;
+            next = null;
+            prev = null;
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/KindOfSequence.java b/test/simulator/main/org/apache/cassandra/simulator/utils/KindOfSequence.java
new file mode 100644
index 0000000..367dea0
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/KindOfSequence.java
@@ -0,0 +1,427 @@
+/*
+ * 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.simulator.utils;
+
+import java.util.Arrays;
+
+import org.apache.cassandra.simulator.RandomSource;
+
+public enum KindOfSequence
+{
+    UNIFORM, UNIFORM_STEP, RANDOMWALK;
+
+    public interface LinkLatency
+    {
+        long get(RandomSource random, int from, int to);
+    }
+
+    public interface NetworkDecision
+    {
+        boolean get(RandomSource random, int from, int to);
+    }
+
+    public interface Period
+    {
+        long get(RandomSource random);
+    }
+
+    public interface Decision
+    {
+        boolean get(RandomSource random);
+    }
+
+    static class UniformPeriod implements LinkLatency, Period
+    {
+        final LongRange nanos;
+
+        UniformPeriod(LongRange nanos)
+        {
+            this.nanos = nanos;
+        }
+
+        @Override
+        public long get(RandomSource random, int from, int to)
+        {
+            return nanos.select(random);
+        }
+
+        @Override
+        public long get(RandomSource random)
+        {
+            return nanos.select(random);
+        }
+    }
+
+    static class UniformStepPeriod implements LinkLatency, Period
+    {
+        final LongRange range;
+        long target;
+        long cur;
+        long step;
+
+        UniformStepPeriod(LongRange range, RandomSource random)
+        {
+            this.range = range;
+            cur = range.select(random);
+            next(random);
+        }
+
+        void next(RandomSource random)
+        {
+            target = range.select(random);
+            step = (target - cur) / random.uniform(16, 128);
+            if (step == 0) step = target > cur ? 1 : -1;
+        }
+
+        @Override
+        public long get(RandomSource random, int from, int to)
+        {
+            return get(random);
+        }
+
+        @Override
+        public long get(RandomSource random)
+        {
+            long result = cur;
+            cur += step;
+            if (step < 0 && cur <= target) next(random);
+            else if (step > 0 && cur >= target) next(random);
+            return result;
+        }
+    }
+
+    static class RandomWalkPeriod implements Period
+    {
+        final LongRange nanos;
+        final long maxStepSize;
+        long cur;
+
+        RandomWalkPeriod(LongRange nanos, RandomSource random)
+        {
+            this.nanos = nanos;
+            this.maxStepSize = maxStepSize(nanos, random);
+            this.cur = nanos.select(random);
+        }
+
+        @Override
+        public long get(RandomSource random)
+        {
+            long step = random.uniform(-maxStepSize, maxStepSize);
+            long cur = this.cur;
+            this.cur = step > 0 ? Math.min(nanos.max, cur + step)
+                                : Math.max(nanos.min, cur + step);
+            return cur;
+        }
+    }
+
+    static class RandomWalkLinkLatency implements LinkLatency
+    {
+        final LongRange nanos;
+        final long maxStepSize;
+        final long[][] curs;
+
+        RandomWalkLinkLatency(int nodes, LongRange nanos, RandomSource random)
+        {
+            this.nanos = nanos;
+            this.maxStepSize = maxStepSize(nanos, random);
+            this.curs = new long[nodes][nodes];
+            for (long[] c : curs)
+                Arrays.fill(c, nanos.min);
+        }
+
+        @Override
+        public long get(RandomSource random, int from, int to)
+        {
+            --from;--to;
+            long cur = curs[from][to];
+            long step = random.uniform(-maxStepSize, maxStepSize);
+            curs[from][to] = step > 0 ? Math.min(nanos.max, cur + step)
+                                      : Math.max(nanos.min, cur + step);
+            return cur;
+        }
+    }
+
+    static class UniformStepLinkLatency implements LinkLatency
+    {
+        private static final int CUR = 0, TARGET = 1, STEP = 2;
+        final LongRange range;
+        final long[][][] state;
+
+        UniformStepLinkLatency(int nodes, LongRange range, RandomSource random)
+        {
+            this.range = range;
+            this.state = new long[nodes][nodes][3];
+            for (int i = 0 ; i < nodes ; ++i)
+            {
+                for (int j = 0 ; j < nodes ; ++j)
+                {
+                    long[] state = this.state[i][j];
+                    state[CUR] = range.select(random);
+                    next(random, state);
+                }
+            }
+        }
+
+        void next(RandomSource random, long[] state)
+        {
+            state[TARGET] = range.select(random);
+            state[STEP] = (state[TARGET] - state[CUR]) / random.uniform(16, 128);
+            if (state[STEP] == 0) state[STEP] = state[TARGET] > state[CUR] ? 1 : -1;
+        }
+
+        @Override
+        public long get(RandomSource random, int from, int to)
+        {
+            --from;--to;
+            long[] state = this.state[from][to];
+            long cur = state[CUR];
+            state[CUR] += state[STEP];
+            if (state[STEP] < 0 && cur <= state[TARGET]) next(random, state);
+            else if (state[STEP] > 0 && cur >= state[TARGET]) next(random, state);
+            return cur;
+        }
+    }
+
+    static class FixedChance implements NetworkDecision, Decision
+    {
+        final float chance;
+
+        FixedChance(float chance)
+        {
+            this.chance = chance;
+        }
+
+        @Override
+        public boolean get(RandomSource random, int from, int to)
+        {
+            return random.decide(chance);
+        }
+
+        @Override
+        public boolean get(RandomSource random)
+        {
+            return random.decide(chance);
+        }
+    }
+
+    static class RandomWalkNetworkDecision implements NetworkDecision
+    {
+        final ChanceRange range;
+        final float maxStepSize;
+        final float[][] curs;
+
+        RandomWalkNetworkDecision(int nodes, ChanceRange range, RandomSource random)
+        {
+            this.range = range;
+            this.maxStepSize = maxStepSize(range, random);
+            this.curs = new float[nodes][nodes];
+            for (float[] c : curs)
+                Arrays.fill(c, range.select(random));
+        }
+
+        @Override
+        public boolean get(RandomSource random, int from, int to)
+        {
+            --from;--to;
+            float cur = curs[from][to];
+            float step = (2*random.uniformFloat() - 1f) * maxStepSize;
+            curs[from][to] = step > 0 ? Math.min(range.max, cur + step)
+                                      : Math.max(range.min, cur + step);
+            return random.decide(cur);
+        }
+    }
+
+    static class UniformStepNetworkDecision implements NetworkDecision
+    {
+        private static final int CUR = 0, TARGET = 1, STEP = 2;
+        final ChanceRange range;
+        final float[][][] state;
+
+        UniformStepNetworkDecision(int nodes, ChanceRange range, RandomSource random)
+        {
+            this.range = range;
+            this.state = new float[nodes][nodes][3];
+            for (int i = 0 ; i < nodes ; ++i)
+            {
+                for (int j = 0 ; j < nodes ; ++j)
+                {
+                    float[] state = this.state[i][j];
+                    state[CUR] = range.select(random);
+                    next(random, state);
+                }
+            }
+        }
+
+        void next(RandomSource random, float[] state)
+        {
+            state[TARGET] = range.select(random);
+            state[STEP] = (state[TARGET] - state[CUR]) / random.uniform(16, 128);
+            if (state[STEP] == 0) state[STEP] = state[TARGET] > state[CUR] ? 1 : -1;
+        }
+
+        @Override
+        public boolean get(RandomSource random, int from, int to)
+        {
+            --from;--to;
+            float[] state = this.state[from][to];
+            float cur = state[CUR];
+            state[CUR] += state[STEP];
+            if (state[STEP] < 0 && cur <= state[TARGET]) next(random, state);
+            else if (state[STEP] > 0 && cur >= state[TARGET]) next(random, state);
+            return random.decide(cur);
+        }
+    }
+
+    static class RandomWalkDecision implements Decision
+    {
+        final ChanceRange range;
+        final float maxStepSize;
+        float cur;
+
+        RandomWalkDecision(ChanceRange range, RandomSource random)
+        {
+            this.range = range;
+            this.maxStepSize = maxStepSize(range, random);
+            this.cur = range.select(random);
+        }
+
+        @Override
+        public boolean get(RandomSource random)
+        {
+            float step = (2*random.uniformFloat() - 1f) * maxStepSize;
+            float cur = this.cur;
+            this.cur = step > 0 ? Math.min(range.max, cur + step)
+                                : Math.max(range.min, cur + step);
+            return random.decide(cur);
+        }
+    }
+
+    static class UniformStepDecision implements Decision
+    {
+        final ChanceRange range;
+        float target;
+        float cur;
+        float step;
+
+        UniformStepDecision(ChanceRange range, RandomSource random)
+        {
+            this.range = range;
+            cur = range.select(random);
+            next(random);
+        }
+
+        void next(RandomSource random)
+        {
+            target = range.select(random);
+            step = (target - cur) / random.uniform(16, 128);
+            if (step == 0) step = target > cur ? 1 : -1;
+        }
+
+        @Override
+        public boolean get(RandomSource random)
+        {
+            float chance = cur;
+            cur += step;
+            if (step < 0 && cur <= target) next(random);
+            else if (step > 0 && cur >= target) next(random);
+            return random.decide(chance);
+        }
+    }
+
+    public LinkLatency linkLatency(int nodes, LongRange nanos, RandomSource random)
+    {
+        switch (this)
+        {
+            default:throw new AssertionError();
+            case UNIFORM: return new UniformPeriod(nanos);
+            case UNIFORM_STEP: return new UniformStepLinkLatency(nodes, nanos, random);
+            case RANDOMWALK: return new RandomWalkLinkLatency(nodes, nanos, random);
+        }
+    }
+
+    public Period period(LongRange nanos, RandomSource random)
+    {
+        switch (this)
+        {
+            default: throw new AssertionError();
+            case UNIFORM: return new UniformPeriod(nanos);
+            case UNIFORM_STEP: return new UniformStepPeriod(nanos, random);
+            case RANDOMWALK: return new RandomWalkPeriod(nanos, random);
+        }
+    }
+
+    public NetworkDecision networkDecision(int nodes, ChanceRange range, RandomSource random)
+    {
+        switch (this)
+        {
+            default:throw new AssertionError();
+            // TODO: support a uniform per node variant?
+            case UNIFORM: return new FixedChance(range.select(random));
+            case UNIFORM_STEP: return new UniformStepNetworkDecision(nodes, range, random);
+            case RANDOMWALK: return new RandomWalkNetworkDecision(nodes, range, random);
+        }
+    }
+
+    public Decision decision(ChanceRange range, RandomSource random)
+    {
+        switch (this)
+        {
+            default:throw new AssertionError();
+            case UNIFORM: return new FixedChance(range.select(random));
+            case UNIFORM_STEP: return new UniformStepDecision(range, random);
+            case RANDOMWALK: return new RandomWalkDecision(range, random);
+        }
+    }
+
+
+    public static float maxStepSize(ChanceRange range, RandomSource random)
+    {
+        return maxStepSize(range.min, range.max, random);
+    }
+
+    public static float maxStepSize(float min, float max, RandomSource random)
+    {
+        switch (random.uniform(0, 3))
+        {
+            case 0:
+                return Math.max(Float.MIN_VALUE, (max/32) - (min/32));
+            case 1:
+                return Math.max(Float.MIN_VALUE, (max/256) - (min/256));
+            case 2:
+                return Math.max(Float.MIN_VALUE, (max/2048) - (min/2048));
+            default:
+                return Math.max(Float.MIN_VALUE, (max/16384) - (min/16384));
+        }
+    }
+
+    private static long maxStepSize(LongRange range, RandomSource random)
+    {
+        switch (random.uniform(0, 3))
+        {
+            case 0:
+                return Math.max(1, (range.max/32) - (range.min/32));
+            case 1:
+                return Math.max(1, (range.max/256) - (range.min/256));
+            case 2:
+                return Math.max(1, (range.max/2048) - (range.min/2048));
+            default:
+                return Math.max(1, (range.max/16384) - (range.min/16384));
+        }
+    }
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/LongRange.java b/test/simulator/main/org/apache/cassandra/simulator/utils/LongRange.java
new file mode 100644
index 0000000..92c4051
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/LongRange.java
@@ -0,0 +1,94 @@
+/*
+ * 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.simulator.utils;
+
+import java.util.Optional;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.cassandra.simulator.RandomSource;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+
+public class LongRange
+{
+    public final long min;
+    public final long max;
+
+    public LongRange(long min, long max)
+    {
+        this.min = min;
+        this.max = max;
+    }
+
+    public LongRange(long min, long max, TimeUnit from, TimeUnit to)
+    {
+        this(to.convert(min,from), to.convert(max, from));
+    }
+
+    public long select(RandomSource random)
+    {
+        if (min == max) return min;
+        return random.uniform(min, 1 + max);
+    }
+
+    public long select(RandomSource random, long minlb, long maxub)
+    {
+        long min = Math.max(this.min, minlb);
+        long max = Math.min(this.max, maxub);
+        if (min >= max) return min;
+        return random.uniform(min, 1 + max);
+    }
+
+    public static Optional<LongRange> parseRange(Optional<String> chance)
+    {
+        return chance.map(s -> new LongRange(Integer.parseInt(s.replaceFirst("\\.\\.+[0-9]+", "")),
+                                             Integer.parseInt(s.replaceFirst("[0-9]+\\.\\.+", ""))));
+    }
+
+    public static Optional<LongRange> parseNanosRange(Optional<String> chance)
+    {
+        if (!chance.isPresent())
+            return Optional.empty();
+
+        String parse = chance.get();
+        TimeUnit units = parseUnits(parse);
+        parse = stripUnits(parse, units);
+        return Optional.of(new LongRange(Long.parseLong(parse.replaceFirst("\\.\\.+[0-9]+", "")),
+                                         Long.parseLong(parse.replaceFirst("[0-9]+\\.\\.+", "")),
+                                         units, NANOSECONDS));
+    }
+
+    public static TimeUnit parseUnits(String parse)
+    {
+        TimeUnit units;
+        if (parse.endsWith("ms")) units = TimeUnit.MILLISECONDS;
+        else if (parse.endsWith("us")) units = TimeUnit.MICROSECONDS;
+        else if (parse.endsWith("ns")) units = NANOSECONDS;
+        else if (parse.endsWith("s")) units = SECONDS;
+        else throw new IllegalArgumentException("Unable to parse period range: " + parse);
+        return units;
+    }
+
+    public static String stripUnits(String parse, TimeUnit units)
+    {
+        return parse.substring(0, parse.length() - (units == SECONDS ? 1 : 2));
+    }
+
+}
diff --git a/test/simulator/main/org/apache/cassandra/simulator/utils/SafeCollections.java b/test/simulator/main/org/apache/cassandra/simulator/utils/SafeCollections.java
new file mode 100644
index 0000000..396a4be
--- /dev/null
+++ b/test/simulator/main/org/apache/cassandra/simulator/utils/SafeCollections.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.simulator.utils;
+
+import java.util.Collection;
+import java.util.function.Consumer;
+
+import org.apache.cassandra.utils.Throwables;
+
+public class SafeCollections
+{
+    public static <I> Throwable safeForEach(Collection<I> collection, Consumer<I> forEach)
+    {
+        Throwable result = null;
+        for (I i : collection)
+        {
+            try
+            {
+                forEach.accept(i);
+            }
+            catch (Throwable t)
+            {
+                result = Throwables.merge(result, t);
+            }
+        }
+        return result;
+    }
+}
diff --git a/test/simulator/test/org/apache/cassandra/simulator/test/ClassWithSynchronizedMethods.java b/test/simulator/test/org/apache/cassandra/simulator/test/ClassWithSynchronizedMethods.java
new file mode 100644
index 0000000..495d883
--- /dev/null
+++ b/test/simulator/test/org/apache/cassandra/simulator/test/ClassWithSynchronizedMethods.java
@@ -0,0 +1,75 @@
+/*
+ * 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.simulator.test;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import org.apache.cassandra.utils.Nemesis;
+import org.apache.cassandra.utils.Simulate;
+
+import static org.apache.cassandra.utils.Simulate.With.MONITORS;
+
+@Simulate(with = MONITORS)
+public class ClassWithSynchronizedMethods
+{
+    @Nemesis
+    private static final AtomicInteger staticCounter1 = new AtomicInteger();
+    @Nemesis
+    private static final AtomicInteger staticCounter2 = new AtomicInteger();
+
+    public static class Execution
+    {
+        public final int thread;
+        public final int sequenceNumber;
+
+        public Execution(int thread, int sequenceNumber)
+        {
+            this.thread = thread;
+            this.sequenceNumber = sequenceNumber;
+        }
+
+        public String toString()
+        {
+            return "Execution{" +
+                   "thread=" + thread +
+                   ", sequenceNumber=" + sequenceNumber +
+                   '}';
+        }
+    }
+
+    public static final List<Execution> executions = new ArrayList<>();
+
+    public static synchronized void synchronizedMethodWithParams(int thread, int sequenceNumber)
+    {
+        int before1 = staticCounter1.get();
+        int before2 = staticCounter2.get();
+
+        Execution execution = new Execution(thread, sequenceNumber);
+        executions.add(execution);
+
+        // Despite interleavings of synchronized method calls, two threads can not enter the synchronized block together,
+        // even in presence of nemesis
+        boolean res1 = staticCounter1.compareAndSet(before1, before1 + 1);
+        assert res1;
+        boolean res2 = staticCounter2.compareAndSet(before2, before2 + 1);
+        assert res2;
+    }
+}
diff --git a/test/simulator/test/org/apache/cassandra/simulator/test/MonitorMethodTransformerTest.java b/test/simulator/test/org/apache/cassandra/simulator/test/MonitorMethodTransformerTest.java
new file mode 100644
index 0000000..9c45810
--- /dev/null
+++ b/test/simulator/test/org/apache/cassandra/simulator/test/MonitorMethodTransformerTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.simulator.test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+
+// A simple demonstration of manipulating the order of JVM level events using the simulation framework
+public class MonitorMethodTransformerTest extends SimulationTestBase
+{
+    @Test
+    public void testSynchronizedMethod()
+    {
+        // This verifies that the simulation does introduce some change to the order in which
+        // system events are scheduled. Ordinarily, we would expect each runnable to execute
+        // in a purely serial manner. However, injecting them into the simulated system adds
+        // a degree of (pseudorandom) non-determinism around the ordering of:
+        //   * the scheduling of the threads executing the tasks, when they park / unpark
+        //   * the fairness of acquiring the monitor needed to enter the synchronized method
+        // so we expect to see an interleaving of the thread ids executing the synchronized
+        // method.
+        // The simulated system doesn't alter the semantics of the JVM however, so
+        // synchronization still ensures single threaded access to critical sections. The
+        // synchronized method itself includes a check to verify this.
+        ClassWithSynchronizedMethods.executions.clear();
+        IIsolatedExecutor.SerializableRunnable[] runnables = new IIsolatedExecutor.SerializableRunnable[10];
+        for (int j = 0; j < 10; j++)
+        {
+            int thread = j;
+            runnables[j] = () -> {
+                for (int iteration = 0; iteration < 10; iteration++)
+                {
+                    ClassWithSynchronizedMethods.synchronizedMethodWithParams(thread, iteration);
+                }
+            };
+        }
+
+        simulate(runnables,
+                 () -> checkInterleavings());
+    }
+
+    @Test
+    public void testSynchronizedMethodMultiThreaded()
+    {
+        // Similar to the method above, but this test adds submission of tasks to an Executor
+        // within the simulated system, effectively adding another layer of scheduling to be
+        // perturbed. The same invariants should preserved as in the previous test.
+        simulate(() -> {
+                     ExecutorPlus executor = ExecutorFactory.Global.executorFactory().pooled("name", 10);
+                     int threads = 10;
+                     for (int i = 0; i < threads; i++)
+                     {
+                         int thread = i;
+                         executor.submit(() -> {
+                             for (int iteration = 0; iteration < 10; iteration++)
+                                 ClassWithSynchronizedMethods.synchronizedMethodWithParams(thread, iteration);
+                         });
+                     }
+                 },
+                 () -> checkInterleavings());
+    }
+
+    public static void checkInterleavings()
+    {
+        List<Integer> seenThreads = new ArrayList<>();
+        // check if synchronized methods called by different threads did interleave
+        for (ClassWithSynchronizedMethods.Execution execution : ClassWithSynchronizedMethods.executions)
+        {
+            int idx = seenThreads.indexOf(execution.thread);
+            if (seenThreads.size() > 1)
+            {
+                // This thread was present in the list, and it is not the last one
+                if (idx > 0 && idx != seenThreads.size() - 1)
+                {
+                    System.out.println(String.format("Detected interleaving between %d and %d",
+                                       execution.thread, seenThreads.get(seenThreads.size() - 1)));
+                    return;
+                }
+            }
+
+            if (idx == -1)
+                seenThreads.add(execution.thread);
+        }
+        Assert.fail("No interleavings detected");
+    }
+}
+
diff --git a/test/simulator/test/org/apache/cassandra/simulator/test/ShortPaxosSimulationTest.java b/test/simulator/test/org/apache/cassandra/simulator/test/ShortPaxosSimulationTest.java
new file mode 100644
index 0000000..19d6601
--- /dev/null
+++ b/test/simulator/test/org/apache/cassandra/simulator/test/ShortPaxosSimulationTest.java
@@ -0,0 +1,42 @@
+/*
+ * 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.simulator.test;
+
+import java.io.IOException;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.apache.cassandra.simulator.paxos.PaxosSimulationRunner;
+
+public class ShortPaxosSimulationTest
+{
+    @Test
+    public void simulationTest() throws IOException
+    {
+        PaxosSimulationRunner.main(new String[] { "run", "-n", "3..6", "-t", "1000", "-c", "2", "--cluster-action-limit", "2", "-s", "30" });
+    }
+
+    @Test
+    @Ignore("fails due to OOM DirectMemory - unclear why")
+    public void selfReconcileTest() throws IOException
+    {
+        PaxosSimulationRunner.main(new String[] { "reconcile", "-n", "3..6", "-t", "1000", "-c", "2", "--cluster-action-limit", "2", "-s", "30", "--with-self" });
+    }
+}
diff --git a/test/simulator/test/org/apache/cassandra/simulator/test/SimulationTestBase.java b/test/simulator/test/org/apache/cassandra/simulator/test/SimulationTestBase.java
new file mode 100644
index 0000000..4cceb8f
--- /dev/null
+++ b/test/simulator/test/org/apache/cassandra/simulator/test/SimulationTestBase.java
@@ -0,0 +1,290 @@
+/*
+ * 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.simulator.test;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.IntSupplier;
+import java.util.function.Predicate;
+
+import com.google.common.collect.Iterators;
+
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.distributed.Cluster;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.distributed.api.IIsolatedExecutor;
+import org.apache.cassandra.distributed.impl.AbstractCluster;
+import org.apache.cassandra.distributed.impl.IsolatedExecutor;
+import org.apache.cassandra.distributed.shared.InstanceClassLoader;
+import org.apache.cassandra.simulator.Action;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.ActionPlan;
+import org.apache.cassandra.simulator.ActionSchedule;
+import org.apache.cassandra.simulator.ActionSchedule.Work;
+import org.apache.cassandra.simulator.FutureActionScheduler;
+import org.apache.cassandra.simulator.RunnableActionScheduler;
+import org.apache.cassandra.simulator.ClusterSimulation;
+import org.apache.cassandra.simulator.Debug;
+import org.apache.cassandra.simulator.RandomSource;
+import org.apache.cassandra.simulator.Simulation;
+import org.apache.cassandra.simulator.SimulationRunner;
+import org.apache.cassandra.simulator.asm.InterceptClasses;
+import org.apache.cassandra.simulator.asm.NemesisFieldSelectors;
+import org.apache.cassandra.simulator.systems.Failures;
+import org.apache.cassandra.simulator.systems.InterceptibleThread;
+import org.apache.cassandra.simulator.systems.InterceptingExecutorFactory;
+import org.apache.cassandra.simulator.systems.InterceptingGlobalMethods;
+import org.apache.cassandra.simulator.systems.InterceptorOfGlobalMethods;
+import org.apache.cassandra.simulator.systems.SimulatedExecution;
+import org.apache.cassandra.simulator.systems.SimulatedQuery;
+import org.apache.cassandra.simulator.systems.SimulatedSystems;
+import org.apache.cassandra.simulator.systems.SimulatedTime;
+import org.apache.cassandra.simulator.utils.LongRange;
+import org.apache.cassandra.utils.CloseableIterator;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.STREAM_LIMITED;
+import static org.apache.cassandra.simulator.ActionSchedule.Mode.UNLIMITED;
+import static org.apache.cassandra.simulator.ClusterSimulation.ISOLATE;
+import static org.apache.cassandra.simulator.ClusterSimulation.SHARE;
+import static org.apache.cassandra.simulator.SimulatorUtils.failWithOOM;
+import static org.apache.cassandra.simulator.systems.InterceptedWait.CaptureSites.Capture.NONE;
+import static org.apache.cassandra.simulator.utils.KindOfSequence.UNIFORM;
+import static org.apache.cassandra.utils.Shared.Scope.ANY;
+import static org.apache.cassandra.utils.Shared.Scope.SIMULATION;
+
+public class SimulationTestBase
+{
+    static abstract class DTestClusterSimulation implements Simulation
+    {
+        final SimulatedSystems simulated;
+        final RunnableActionScheduler scheduler;
+        final Cluster cluster;
+
+        public DTestClusterSimulation(SimulatedSystems simulated, RunnableActionScheduler scheduler, Cluster cluster)
+        {
+            this.simulated = simulated;
+            this.scheduler = scheduler;
+            this.cluster = cluster;
+        }
+
+        public Action executeQuery(int node, String query, ConsistencyLevel cl, Object... bindings)
+        {
+            return new SimulatedQuery(String.format("Execute query: %s %s %s", query, cl, Arrays.toString(bindings)),
+                                      simulated,
+                                      cluster.get(node),
+                                      query,
+                                      cl,
+                                      null,
+                                      bindings);
+        }
+
+        public Action schemaChange(int node, String query)
+        {
+            return new SimulatedQuery(String.format("Schema change: %s", query),
+                                      simulated,
+                                      cluster.get(node),
+                                      query,
+                                      org.apache.cassandra.distributed.api.ConsistencyLevel.ALL,
+                                      null);
+        }
+
+        protected abstract ActionList initialize();
+
+        protected abstract ActionList execute();
+
+        public CloseableIterator<?> iterator()
+        {
+            return new ActionPlan(ActionList.of(initialize()),
+                                  Collections.singletonList(execute()),
+                                  ActionList.empty())
+                   .iterator(STREAM_LIMITED, -1, () -> 0L, simulated.time, scheduler, simulated.futureScheduler);
+        }
+
+        public void run()
+        {
+            try (CloseableIterator<?> iter = iterator())
+            {
+                while (iter.hasNext())
+                    iter.next();
+            }
+        }
+
+        public void close() throws Exception
+        {
+
+        }
+    }
+
+    public static void simulate(Function<DTestClusterSimulation, ActionList> init,
+                                Function<DTestClusterSimulation, ActionList> test,
+                                Consumer<ClusterSimulation.Builder<DTestClusterSimulation>> configure) throws IOException
+    {
+        SimulationRunner.beforeAll();
+        long seed = System.currentTimeMillis();
+        RandomSource random = new RandomSource.Default();
+        random.reset(seed);
+        class Factory extends ClusterSimulation.Builder<DTestClusterSimulation>
+        {
+            public ClusterSimulation<DTestClusterSimulation> create(long seed) throws IOException
+            {
+                return new ClusterSimulation<>(random, seed, 1, this,
+                                               (c) -> {},
+                                               (simulated, scheduler, cluster, options) -> new DTestClusterSimulation(simulated, scheduler, cluster) {
+
+                                                   protected ActionList initialize()
+                                                   {
+                                                       return init.apply(this);
+                                                   }
+
+                                                   protected ActionList execute()
+                                                   {
+                                                       return test.apply(this);
+                                                   }
+                                               });
+            }
+        }
+
+        Factory factory = new Factory();
+        configure.accept(factory);
+        try (ClusterSimulation<?> cluster = factory.create(seed))
+        {
+            try
+            {
+                cluster.simulation.run();
+            }
+            catch (Throwable t)
+            {
+                throw new AssertionError(String.format("Failed on seed %s", Long.toHexString(seed)),
+                                         t);
+            }
+        }
+    }
+
+    public static void simulate(IIsolatedExecutor.SerializableRunnable run,
+                                IIsolatedExecutor.SerializableRunnable check)
+    {
+        simulate(new IIsolatedExecutor.SerializableRunnable[]{run},
+                 check);
+    }
+
+    public static void simulate(IIsolatedExecutor.SerializableRunnable[] runnables,
+                                IIsolatedExecutor.SerializableRunnable check)
+    {
+        Failures failures = new Failures();
+        RandomSource random = new RandomSource.Default();
+        long seed = System.currentTimeMillis();
+        System.out.println("Using seed: " + seed);
+        random.reset(seed);
+        SimulatedTime time = new SimulatedTime(1, random, 1577836800000L /*Jan 1st UTC*/, new LongRange(1, 100, MILLISECONDS, NANOSECONDS),
+                                               UNIFORM, UNIFORM.period(new LongRange(10L, 60L, SECONDS, NANOSECONDS), random), (i1, i2) -> {});
+        SimulatedExecution execution = new SimulatedExecution();
+
+        Predicate<String> sharedClassPredicate = AbstractCluster.getSharedClassPredicate(ISOLATE, SHARE, ANY, SIMULATION);
+        InstanceClassLoader classLoader = new InstanceClassLoader(1, 1, AbstractCluster.CURRENT_VERSION.classpath,
+                                                                  Thread.currentThread().getContextClassLoader(),
+                                                                  sharedClassPredicate,
+                                                                  new InterceptClasses(() -> 1.0f, () -> 1.0f, NemesisFieldSelectors.get(), ClassLoader.getSystemClassLoader(), sharedClassPredicate.negate())::apply);
+
+        ThreadGroup tg = new ThreadGroup("test");
+        InterceptorOfGlobalMethods interceptorOfGlobalMethods = new InterceptingGlobalMethods(NONE, null, failures, random);
+        InterceptingExecutorFactory factory = execution.factory(interceptorOfGlobalMethods, classLoader, tg);
+
+        time.setup(1, classLoader);
+        IsolatedExecutor.transferAdhoc((IIsolatedExecutor.SerializableConsumer<ExecutorFactory>) ExecutorFactory.Global::unsafeSet, classLoader)
+                        .accept(factory);
+
+        IsolatedExecutor.transferAdhoc((IIsolatedExecutor.SerializableBiConsumer<InterceptorOfGlobalMethods, IntSupplier>) InterceptorOfGlobalMethods.Global::unsafeSet, classLoader)
+                        .accept(interceptorOfGlobalMethods, () -> {
+                            if (InterceptibleThread.isDeterministic())
+                                throw failWithOOM();
+                            return random.uniform(Integer.MIN_VALUE, Integer.MAX_VALUE);
+                        });
+
+        SimulatedSystems simulated = new SimulatedSystems(random, time, null, execution, null, null, null, new FutureActionScheduler()
+        {
+            @Override
+            public Deliver shouldDeliver(int from, int to)
+            {
+                return Deliver.DELIVER;
+            }
+
+            @Override
+            public long messageDeadlineNanos(int from, int to)
+            {
+                return 0;
+            }
+
+            @Override
+            public long messageTimeoutNanos(long expiresAfterNanos, long expirationIntervalNanos)
+            {
+                return 0;
+            }
+
+            @Override
+            public long messageFailureNanos(int from, int to)
+            {
+                return 0;
+            }
+
+            @Override
+            public long schedulerDelayNanos()
+            {
+                return 0;
+            }
+        }, new Debug(), failures);
+
+        RunnableActionScheduler runnableScheduler = new RunnableActionScheduler.RandomUniform(random);
+
+        Action entrypoint = new Action("entrypoint", Action.Modifiers.NONE, Action.Modifiers.NONE)
+        {
+            protected ActionList performSimple()
+            {
+                Action[] actions = new Action[runnables.length];
+                for (int i = 0; i < runnables.length; i++)
+                    actions[i] = toAction(runnables[i], classLoader, factory, simulated);
+
+                return ActionList.of(actions);
+            }
+        };
+
+
+        ActionSchedule testSchedule = new ActionSchedule(simulated.time, simulated.futureScheduler, () -> 0, runnableScheduler, new Work(UNLIMITED, Collections.singletonList(ActionList.of(entrypoint))));
+        Iterators.advance(testSchedule, Integer.MAX_VALUE);
+        ActionSchedule checkSchedule = new ActionSchedule(simulated.time, simulated.futureScheduler, () -> 0, runnableScheduler, new Work(UNLIMITED, Collections.singletonList(ActionList.of(toAction(check, classLoader, factory, simulated)))));
+        Iterators.advance(checkSchedule, Integer.MAX_VALUE);
+    }
+
+    public static Action toAction(IIsolatedExecutor.SerializableRunnable r, ClassLoader classLoader, InterceptingExecutorFactory factory, SimulatedSystems simulated)
+    {
+        Runnable runnable = IsolatedExecutor.transferAdhoc(r, classLoader);
+        return simulated.invoke("action", Action.Modifiers.NONE, Action.Modifiers.NONE,
+                                factory.startParked("begin", runnable));
+    }
+
+    public static <T> T[] arr(T... arr)
+    {
+        return arr;
+    }
+}
\ No newline at end of file
diff --git a/test/simulator/test/org/apache/cassandra/simulator/test/TrivialSimulationTest.java b/test/simulator/test/org/apache/cassandra/simulator/test/TrivialSimulationTest.java
new file mode 100644
index 0000000..cf8fe1b
--- /dev/null
+++ b/test/simulator/test/org/apache/cassandra/simulator/test/TrivialSimulationTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.simulator.test;
+
+import java.io.IOException;
+import java.util.EnumMap;
+import java.util.IdentityHashMap;
+
+import org.junit.Test;
+
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.distributed.api.ConsistencyLevel;
+import org.apache.cassandra.simulator.ActionList;
+import org.apache.cassandra.simulator.Debug;
+import org.apache.cassandra.simulator.cluster.ClusterActionListener.NoOpListener;
+import org.apache.cassandra.simulator.cluster.ClusterActions;
+import org.apache.cassandra.simulator.cluster.ClusterActions.Options;
+import org.apache.cassandra.utils.concurrent.CountDownLatch;
+
+import static org.apache.cassandra.simulator.cluster.ClusterActions.InitialConfiguration.initializeAll;
+import static org.apache.cassandra.simulator.cluster.ClusterActions.Options.noActions;
+
+public class TrivialSimulationTest extends SimulationTestBase
+{
+    @Test
+    public void trivialTest() throws IOException // for demonstration/experiment purposes
+    {
+        simulate((simulation) -> {
+                     Options options = noActions(simulation.cluster.size());
+                     ClusterActions clusterActions = new ClusterActions(simulation.simulated, simulation.cluster,
+                                                                        options, new NoOpListener(), new Debug(new EnumMap<>(Debug.Info.class), new int[0]));
+                     return ActionList.of(clusterActions.initializeCluster(initializeAll(simulation.cluster.size())),
+                                          simulation.schemaChange(1, "CREATE KEYSPACE ks WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor' : 3}"),
+                                          simulation.schemaChange(1, "CREATE TABLE IF NOT EXISTS ks.tbl (pk int PRIMARY KEY, v int)"));
+                 },
+                 (simulation) -> ActionList.of(simulation.executeQuery(1, "INSERT INTO ks.tbl VALUES (1,1)", ConsistencyLevel.QUORUM),
+                                               simulation.executeQuery(1, "SELECT * FROM ks.tbl WHERE pk = 1", ConsistencyLevel.QUORUM)),
+                 (config) -> config
+                             .threadCount(10)
+                             .nodes(3, 3)
+                             .dcs(1, 1));
+    }
+
+    @Test
+    public void componentTest()
+    {
+        simulate(arr(() -> {
+                     ExecutorPlus executor = ExecutorFactory.Global.executorFactory().pooled("name", 10);
+                     CountDownLatch latch = CountDownLatch.newCountDownLatch(5);
+
+                     for (int i = 0; i < 5; i++)
+                     {
+                         executor.submit(() -> {
+                             latch.decrement();
+                             try
+                             {
+                                 latch.await();
+                             }
+                             catch (InterruptedException e)
+                             {
+                                 throw new RuntimeException(e);
+                             }
+                         });
+                     }
+                 }),
+                 () -> {});
+    }
+
+    @Test
+    public void identityHashMapTest()
+    {
+        simulate(arr(() -> new IdentityHashMap<>().put(1, 1)),
+                 () -> {});
+    }
+}
diff --git a/test/unit/org/apache/cassandra/AbstractSerializationsTester.java b/test/unit/org/apache/cassandra/AbstractSerializationsTester.java
index 3611f0e..6503707 100644
--- a/test/unit/org/apache/cassandra/AbstractSerializationsTester.java
+++ b/test/unit/org/apache/cassandra/AbstractSerializationsTester.java
@@ -20,27 +20,21 @@
 package org.apache.cassandra;
 
 import org.apache.cassandra.io.IVersionedSerializer;
-import org.apache.cassandra.io.util.DataInputPlus;
-import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus;
-import org.apache.cassandra.io.util.DataOutputBuffer;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
+import org.apache.cassandra.io.util.*;
 import org.apache.cassandra.net.MessagingService;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 
 public class AbstractSerializationsTester
 {
-    protected static final String CUR_VER = System.getProperty("cassandra.version", "4.0");
+    protected static final String CUR_VER = System.getProperty("cassandra.version", "4.1");
     protected static final Map<String, Integer> VERSION_MAP = new HashMap<String, Integer> ()
     {{
         put("3.0", MessagingService.VERSION_30);
         put("4.0", MessagingService.VERSION_40);
+        put("4.1", MessagingService.VERSION_41);
     }};
 
     protected static final boolean EXECUTE_WRITES = Boolean.getBoolean("cassandra.test-serialization-writes");
@@ -57,16 +51,16 @@
         assert out.getLength() == serializer.serializedSize(obj, getVersion());
     }
 
-    protected static DataInputStreamPlus getInput(String name) throws IOException
+    protected static FileInputStreamPlus getInput(String name) throws IOException
     {
         return getInput(CUR_VER, name);
     }
 
-    protected static DataInputStreamPlus getInput(String version, String name) throws IOException
+    protected static FileInputStreamPlus getInput(String version, String name) throws IOException
     {
         File f = new File("test/data/serialization/" + version + '/' + name);
-        assert f.exists() : f.getPath();
-        return new DataInputPlus.DataInputStreamPlus(new FileInputStream(f));
+        assert f.exists() : f.path();
+        return new FileInputStreamPlus(f);
     }
 
     @SuppressWarnings("resource")
@@ -79,7 +73,7 @@
     protected static DataOutputStreamPlus getOutput(String version, String name) throws IOException
     {
         File f = new File("test/data/serialization/" + version + '/' + name);
-        f.getParentFile().mkdirs();
-        return new BufferedDataOutputStreamPlus(new FileOutputStream(f).getChannel());
+        f.parent().tryCreateDirectories();
+        return new FileOutputStreamPlus(f);
     }
 }
diff --git a/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java b/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java
index a6c5997..2befb5c 100644
--- a/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java
+++ b/test/unit/org/apache/cassandra/CassandraBriefJUnitResultFormatter.java
@@ -24,8 +24,8 @@
 import java.io.StringWriter;
 import java.text.NumberFormat;
 
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
+import junit.framework.AssertionFailedError;  // checkstyle: permit this import
+import junit.framework.Test;  // checkstyle: permit this import
 
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.taskdefs.optional.junit.IgnoredTestListener;
@@ -316,4 +316,4 @@
     public void testAssumptionFailure(Test test, Throwable cause) {
         formatSkip(test, cause.getMessage());
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/CassandraIsolatedJunit4ClassRunner.java b/test/unit/org/apache/cassandra/CassandraIsolatedJunit4ClassRunner.java
index 8c37be7..5f65227 100644
--- a/test/unit/org/apache/cassandra/CassandraIsolatedJunit4ClassRunner.java
+++ b/test/unit/org/apache/cassandra/CassandraIsolatedJunit4ClassRunner.java
@@ -104,4 +104,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java b/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java
index 5015be9..de8fb4e 100644
--- a/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java
+++ b/test/unit/org/apache/cassandra/CassandraXMLJUnitResultFormatter.java
@@ -33,8 +33,8 @@
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 
-import junit.framework.AssertionFailedError;
-import junit.framework.Test;
+import junit.framework.AssertionFailedError;  // checkstyle: permit this import
+import junit.framework.Test;  // checkstyle: permit this import
 
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.taskdefs.optional.junit.IgnoredTestListener;
@@ -50,6 +50,7 @@
 import org.w3c.dom.Element;
 import org.w3c.dom.Text;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 
 /**
  * Prints XML output of the test to a specified Writer.
@@ -240,7 +241,7 @@
      * @param t the test.
      */
     public void startTest(final Test t) {
-        testStarts.put(createDescription(t), System.currentTimeMillis());
+        testStarts.put(createDescription(t), currentTimeMillis());
     }
 
     private static String createDescription(final Test test) throws BuildException {
@@ -284,7 +285,7 @@
 
         final Long l = testStarts.get(createDescription(test));
         currentTest.setAttribute(ATTR_TIME,
-            "" + ((System.currentTimeMillis() - l) / ONE_SECOND));
+            "" + ((currentTimeMillis() - l) / ONE_SECOND));
     }
 
     /**
@@ -388,4 +389,4 @@
         skippedTests.put(createDescription(test), test);
 
     }
-} // XMLJUnitResultFormatter
\ No newline at end of file
+} // XMLJUnitResultFormatter
diff --git a/test/unit/org/apache/cassandra/LogbackStatusListener.java b/test/unit/org/apache/cassandra/LogbackStatusListener.java
index 1f95bd4..719fada 100644
--- a/test/unit/org/apache/cassandra/LogbackStatusListener.java
+++ b/test/unit/org/apache/cassandra/LogbackStatusListener.java
@@ -121,14 +121,6 @@
                         return;
                 }
 
-                //Filter out Windows newline
-                if (size() == 2)
-                {
-                    byte[] bytes = toByteArray();
-                    if (bytes[0] == 0xD && bytes[1] == 0xA)
-                        return;
-                }
-
                 String statement;
                 if (encoding != null)
                     statement = new String(toByteArray(), encoding);
diff --git a/test/unit/org/apache/cassandra/SchemaLoader.java b/test/unit/org/apache/cassandra/SchemaLoader.java
index 1f46562..3279490 100644
--- a/test/unit/org/apache/cassandra/SchemaLoader.java
+++ b/test/unit/org/apache/cassandra/SchemaLoader.java
@@ -18,7 +18,12 @@
 package org.apache.cassandra;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 import org.apache.cassandra.auth.AuthKeyspace;
 import org.apache.cassandra.auth.AuthSchemaChangeListener;
@@ -39,13 +44,14 @@
 import org.apache.cassandra.index.sasi.SASIIndex;
 import org.apache.cassandra.index.sasi.disk.OnDiskIndexBuilder;
 import org.apache.cassandra.schema.*;
-import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
 import org.junit.After;
 import org.junit.BeforeClass;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class SchemaLoader
 {
     @BeforeClass
@@ -78,7 +84,7 @@
         // skip shadow round and endpoint collision check in tests
         System.setProperty("cassandra.allow_unsafe_join", "true");
         if (!Gossiper.instance.isEnabled())
-            Gossiper.instance.start((int) (System.currentTimeMillis() / 1000));
+            Gossiper.instance.start((int) (currentTimeMillis() / 1000));
     }
 
     public static void schemaDefinition(String testName) throws ConfigurationException
@@ -241,7 +247,7 @@
         // if you're messing with low-level sstable stuff, it can be useful to inject the schema directly
         // Schema.instance.load(schemaDefinition());
         for (KeyspaceMetadata ksm : schema)
-            MigrationManager.announceNewKeyspace(ksm, false);
+            SchemaTestUtil.announceNewKeyspace(ksm);
 
         if (Boolean.parseBoolean(System.getProperty("cassandra.test.compression", "false")))
             useCompression(schema, compressionParams(CompressionParams.DEFAULT_CHUNK_LENGTH));
@@ -249,7 +255,7 @@
 
     public static void createKeyspace(String name, KeyspaceParams params)
     {
-        MigrationManager.announceNewKeyspace(KeyspaceMetadata.create(name, params, Tables.of()), true);
+        SchemaTestUtil.announceNewKeyspace(KeyspaceMetadata.create(name, params, Tables.of()));
     }
 
     public static void createKeyspace(String name, KeyspaceParams params, TableMetadata.Builder... builders)
@@ -258,17 +264,17 @@
         for (TableMetadata.Builder builder : builders)
             tables.add(builder.build());
 
-        MigrationManager.announceNewKeyspace(KeyspaceMetadata.create(name, params, tables.build()), true);
+        SchemaTestUtil.announceNewKeyspace(KeyspaceMetadata.create(name, params, tables.build()));
     }
 
     public static void createKeyspace(String name, KeyspaceParams params, TableMetadata... tables)
     {
-        MigrationManager.announceNewKeyspace(KeyspaceMetadata.create(name, params, Tables.of(tables)), true);
+        SchemaTestUtil.announceNewKeyspace(KeyspaceMetadata.create(name, params, Tables.of(tables)));
     }
 
     public static void createKeyspace(String name, KeyspaceParams params, Tables tables, Types types)
     {
-        MigrationManager.announceNewKeyspace(KeyspaceMetadata.create(name, params, tables, Views.none(), types, Functions.none()), true);
+        SchemaTestUtil.announceNewKeyspace(KeyspaceMetadata.create(name, params, tables, Views.none(), types, Functions.none()));
     }
 
     public static void setupAuth(IRoleManager roleManager, IAuthenticator authenticator, IAuthorizer authorizer, INetworkAuthorizer networkAuthorizer)
@@ -277,7 +283,7 @@
         DatabaseDescriptor.setAuthenticator(authenticator);
         DatabaseDescriptor.setAuthorizer(authorizer);
         DatabaseDescriptor.setNetworkAuthorizer(networkAuthorizer);
-        MigrationManager.announceNewKeyspace(AuthKeyspace.metadata(), true);
+        SchemaTestUtil.announceNewKeyspace(AuthKeyspace.metadata());
         DatabaseDescriptor.getRoleManager().setup();
         DatabaseDescriptor.getAuthenticator().setup();
         DatabaseDescriptor.getAuthorizer().setup();
@@ -329,7 +335,7 @@
     {
         for (KeyspaceMetadata ksm : schema)
             for (TableMetadata cfm : ksm.tablesAndViews())
-                MigrationManager.announceTableUpdate(cfm.unbuild().compression(compressionParams.copy()).build(), true);
+                SchemaTestUtil.announceTableUpdate(cfm.unbuild().compression(compressionParams.copy()).build());
     }
 
     public static TableMetadata.Builder counterCFMD(String ksName, String cfName)
diff --git a/test/unit/org/apache/cassandra/ServerTestUtils.java b/test/unit/org/apache/cassandra/ServerTestUtils.java
index 221a23a..10cb082 100644
--- a/test/unit/org/apache/cassandra/ServerTestUtils.java
+++ b/test/unit/org/apache/cassandra/ServerTestUtils.java
@@ -17,9 +17,9 @@
  */
 package org.apache.cassandra;
 
-import java.io.File;
 import java.io.IOException;
 import java.net.UnknownHostException;
+import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -31,11 +31,12 @@
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.commitlog.CommitLog;
-import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.AbstractEndpointSnitch;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.security.ThreadAwareSecurityManager;
+import org.apache.cassandra.service.EmbeddedCassandraService;
 
 /**
  * Utility methodes used by SchemaLoader and CQLTester to manage the server and its state.
@@ -131,11 +132,10 @@
     }
 
     /**
-     * Cleanup the directories used by the server, creating them if they do not exists.
+     * Cleanup the directories used by the server, creating them if they do not exist.
      */
     public static void cleanupAndLeaveDirs() throws IOException
     {
-        // We need to stop and unmap all CLS instances prior to cleanup() or we'll get failures on Windows.
         CommitLog.instance.stopUnsafe(true);
         mkdirs(); // Creates the directories if they does not exists
         cleanup(); // Ensure that the directories are all empty
@@ -167,13 +167,14 @@
     {
         if (directory.exists())
         {
-            FileUtils.deleteChildrenRecursive(directory);
+            Arrays.stream(directory.tryList()).forEach(File::deleteRecursive);
         }
     }
 
     private static void cleanupDirectory(String dirName)
     {
-        cleanupDirectory(new File(dirName));
+        if (dirName != null)
+            cleanupDirectory(new File(dirName));
     }
 
     /**
@@ -189,6 +190,16 @@
         cleanupDirectory(DatabaseDescriptor.getSavedCachesLocation());
     }
 
+    public static EmbeddedCassandraService startEmbeddedCassandraService() throws IOException
+    {
+        DatabaseDescriptor.daemonInitialization();
+        mkdirs();
+        cleanup();
+        EmbeddedCassandraService service = new EmbeddedCassandraService();
+        service.start();
+        return service;
+    }
+
     private ServerTestUtils()
     {
     }
diff --git a/test/unit/org/apache/cassandra/Util.java b/test/unit/org/apache/cassandra/Util.java
index 4b7b6ea..0459cb3 100644
--- a/test/unit/org/apache/cassandra/Util.java
+++ b/test/unit/org/apache/cassandra/Util.java
@@ -21,52 +21,86 @@
 
 import java.io.Closeable;
 import java.io.EOFException;
-import java.io.File;
 import java.io.IOError;
+import java.io.IOException;
 import java.net.UnknownHostException;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.Path;
 import java.time.Duration;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
 
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
 import org.apache.commons.lang3.StringUtils;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.db.AbstractReadCommandBuilder;
+import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.db.ClusteringComparator;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.DeletionTime;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.db.Directories.DataDirectory;
+import org.apache.cassandra.db.DisallowedDirectories;
+import org.apache.cassandra.db.IMutation;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.db.PartitionRangeReadCommand;
+import org.apache.cassandra.db.ReadCommand;
+import org.apache.cassandra.db.ReadExecutionController;
+import org.apache.cassandra.db.compaction.AbstractCompactionTask;
 import org.apache.cassandra.db.compaction.ActiveCompactionsTracker;
+import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.compaction.CompactionTasks;
 import org.apache.cassandra.db.compaction.OperationType;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.locator.ReplicaCollection;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.schema.ColumnMetadata;
-import org.apache.cassandra.schema.TableId;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.cql3.ColumnIdentifier;
-
-import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.Directories.DataDirectory;
-import org.apache.cassandra.db.compaction.AbstractCompactionTask;
-import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.AsciiType;
 import org.apache.cassandra.db.marshal.Int32Type;
-import org.apache.cassandra.db.partitions.*;
-import org.apache.cassandra.db.rows.*;
+import org.apache.cassandra.db.partitions.FilteredPartition;
+import org.apache.cassandra.db.partitions.ImmutableBTreePartition;
+import org.apache.cassandra.db.partitions.Partition;
+import org.apache.cassandra.db.partitions.PartitionIterator;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.rows.AbstractUnfilteredRowIterator;
+import org.apache.cassandra.db.rows.BTreeRow;
+import org.apache.cassandra.db.rows.BufferCell;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.Cells;
+import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.RowIterator;
+import org.apache.cassandra.db.rows.Rows;
+import org.apache.cassandra.db.rows.Unfiltered;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.db.view.TableViews;
 import org.apache.cassandra.dht.IPartitioner;
-
 import org.apache.cassandra.dht.RandomPartitioner.BigIntegerToken;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
@@ -74,23 +108,41 @@
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SSTableId;
+import org.apache.cassandra.io.sstable.SSTableLoader;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.io.sstable.UUIDBasedSSTableId;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.ReplicaCollection;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.service.pager.PagingState;
+import org.apache.cassandra.streaming.StreamResultFuture;
+import org.apache.cassandra.streaming.StreamState;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.CassandraVersion;
 import org.apache.cassandra.utils.CounterId;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.FilterFactory;
+import org.apache.cassandra.utils.OutputHandler;
+import org.apache.cassandra.utils.Throwables;
 import org.awaitility.Awaitility;
 
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.equalTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.equalTo;
 
 public class Util
 {
@@ -201,7 +253,7 @@
             rm.applyUnsafe();
 
         ColumnFamilyStore store = Keyspace.open(keyspaceName).getColumnFamilyStore(tableId);
-        store.forceBlockingFlush();
+        Util.flush(store);
         return store;
     }
 
@@ -788,16 +840,18 @@
     {
         LifecycleTransaction.waitForDeletions();
         assertEquals(expectedSSTableCount, cfs.getLiveSSTables().size());
-        Set<Integer> liveGenerations = cfs.getLiveSSTables().stream().map(sstable -> sstable.descriptor.generation).collect(Collectors.toSet());
+        Set<SSTableId> liveIdentifiers = cfs.getLiveSSTables().stream()
+                                            .map(sstable -> sstable.descriptor.id)
+                                            .collect(Collectors.toSet());
         int fileCount = 0;
         for (File f : cfs.getDirectories().getCFDirectories())
         {
-            for (File sst : f.listFiles())
+            for (File sst : f.tryList())
             {
-                if (sst.getName().contains("Data"))
+                if (sst.name().contains("Data"))
                 {
-                    Descriptor d = Descriptor.fromFilename(sst.getAbsolutePath());
-                    assertTrue(liveGenerations.contains(d.generation));
+                    Descriptor d = Descriptor.fromFilename(sst.absolutePath());
+                    assertTrue(liveIdentifiers.contains(d.id));
                     fileCount++;
                 }
             }
@@ -850,4 +904,142 @@
         }
         Gossiper.instance.expireUpgradeFromVersion();
     }
+
+    /**
+     * Sets the length of the file to given size. File will be created if not exist.
+     *
+     * @param file file for which length needs to be set
+     * @param size new szie
+     * @throws IOException on any I/O error.
+     */
+    public static void setFileLength(File file, long size) throws IOException
+    {
+        try (FileChannel fileChannel = file.newReadWriteChannel())
+        {
+            if (file.length() >= size)
+            {
+                fileChannel.truncate(size);
+            }
+            else
+            {
+                fileChannel.position(size - 1);
+                fileChannel.write(ByteBuffer.wrap(new byte[1]));
+            }
+        }
+    }
+
+    public static Supplier<SequenceBasedSSTableId> newSeqGen(int ... existing)
+    {
+        return SequenceBasedSSTableId.Builder.instance.generator(IntStream.of(existing).mapToObj(SequenceBasedSSTableId::new));
+    }
+
+    public static Supplier<UUIDBasedSSTableId> newUUIDGen()
+    {
+        return UUIDBasedSSTableId.Builder.instance.generator(Stream.empty());
+    }
+
+    public static Set<Descriptor> getSSTables(String ks, String tableName)
+    {
+        return Keyspace.open(ks)
+                       .getColumnFamilyStore(tableName)
+                       .getLiveSSTables()
+                       .stream()
+                       .map(sstr -> sstr.descriptor)
+                       .collect(Collectors.toSet());
+    }
+
+    public static Set<Descriptor> getSnapshots(String ks, String tableName, String snapshotTag)
+    {
+        try
+        {
+            return Keyspace.open(ks)
+                           .getColumnFamilyStore(tableName)
+                           .getSnapshotSSTableReaders(snapshotTag)
+                           .stream()
+                           .map(sstr -> sstr.descriptor)
+                           .collect(Collectors.toSet());
+        }
+        catch (IOException e)
+        {
+            throw Throwables.unchecked(e);
+        }
+    }
+
+    public static Set<Descriptor> getBackups(String ks, String tableName)
+    {
+        return Keyspace.open(ks)
+                       .getColumnFamilyStore(tableName)
+                       .getDirectories()
+                       .sstableLister(Directories.OnTxnErr.THROW)
+                       .onlyBackups(true)
+                       .list()
+                       .keySet();
+    }
+
+    public static StreamState bulkLoadSSTables(File dir, String targetKeyspace)
+    {
+        SSTableLoader.Client client = new SSTableLoader.Client()
+        {
+            private String keyspace;
+
+            public void init(String keyspace)
+            {
+                this.keyspace = keyspace;
+                for (Replica replica : StorageService.instance.getLocalReplicas(keyspace))
+                    addRangeForEndpoint(replica.range(), FBUtilities.getBroadcastAddressAndPort());
+            }
+
+            public TableMetadataRef getTableMetadata(String tableName)
+            {
+                return Schema.instance.getTableMetadataRef(keyspace, tableName);
+            }
+        };
+
+        SSTableLoader loader = new SSTableLoader(dir, client, new OutputHandler.LogOutput(), 1, targetKeyspace);
+        StreamResultFuture result = loader.stream();
+        return FBUtilities.waitOnFuture(result);
+    }
+
+    public static File relativizePath(File targetBasePath, File path, int components)
+    {
+        Preconditions.checkArgument(components > 0);
+        Preconditions.checkArgument(path.toPath().getNameCount() >= components);
+        Path relative = path.toPath().subpath(path.toPath().getNameCount() - components, path.toPath().getNameCount());
+        return new File(targetBasePath.toPath().resolve(relative));
+    }
+
+    public static void flush(ColumnFamilyStore cfs)
+    {
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
+    }
+
+    public static void flushTable(Keyspace keyspace, String table)
+    {
+        flush(keyspace.getColumnFamilyStore(table));
+    }
+
+    public static void flushTable(Keyspace keyspace, TableId table)
+    {
+        flush(keyspace.getColumnFamilyStore(table));
+    }
+
+    public static void flushTable(String keyspace, String table)
+    {
+        flushTable(Keyspace.open(keyspace), table);
+    }
+
+    public static void flush(Keyspace keyspace)
+    {
+        FBUtilities.waitOnFutures(keyspace.flush(ColumnFamilyStore.FlushReason.UNIT_TESTS));
+    }
+
+    public static void flushKeyspace(String keyspaceName)
+    {
+        flush(Keyspace.open(keyspaceName));
+    }
+
+    public static void flush(TableViews view)
+    {
+        view.forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/audit/AuditLogFilterTest.java b/test/unit/org/apache/cassandra/audit/AuditLogFilterTest.java
index 8054f90..62bc767 100644
--- a/test/unit/org/apache/cassandra/audit/AuditLogFilterTest.java
+++ b/test/unit/org/apache/cassandra/audit/AuditLogFilterTest.java
@@ -29,6 +29,22 @@
 public class AuditLogFilterTest
 {
     @Test
+    public void testInputWithSpaces()
+    {
+        AuditLogOptions auditLogOptions = new AuditLogOptions.Builder()
+                                          .withIncludedKeyspaces(" ks, ks1, ks3, ")
+                                          .withEnabled(true)
+                                          .build();
+
+        AuditLogFilter auditLogFilter = AuditLogFilter.create(auditLogOptions);
+
+        Assert.assertFalse(auditLogFilter.isFiltered(new AuditLogEntry.Builder(AuditLogEntryType.CREATE_TYPE).setKeyspace("ks").build()));
+        Assert.assertFalse(auditLogFilter.isFiltered(new AuditLogEntry.Builder(AuditLogEntryType.CREATE_TYPE).setKeyspace("ks1").build()));
+        Assert.assertFalse(auditLogFilter.isFiltered(new AuditLogEntry.Builder(AuditLogEntryType.CREATE_TYPE).setKeyspace("ks3").build()));
+        Assert.assertTrue(auditLogFilter.isFiltered(new AuditLogEntry.Builder(AuditLogEntryType.CREATE_TYPE).setKeyspace("ks5").build()));
+    }
+
+    @Test
     public void isFiltered_IncludeSetOnly()
     {
         Set<String> includeSet = new HashSet<>();
@@ -186,4 +202,4 @@
         excludeSet.add("b");
         Assert.assertFalse(isFiltered(null, includeSet, excludeSet));
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/audit/AuditLogOptionsTest.java b/test/unit/org/apache/cassandra/audit/AuditLogOptionsTest.java
new file mode 100644
index 0000000..cdb9ff6
--- /dev/null
+++ b/test/unit/org/apache/cassandra/audit/AuditLogOptionsTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.audit;
+
+import java.util.Collections;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.assertj.core.api.Assertions;
+
+public class AuditLogOptionsTest
+{
+    @Test
+    public void testAuditLogOptions()
+    {
+        AuditLogOptions defaultOptions = new AuditLogOptions();
+        defaultOptions.enabled = false;
+        defaultOptions.included_categories = "dcl, ddl";
+        defaultOptions.included_keyspaces = "ks1, ks2";
+
+        AuditLogOptions options = new AuditLogOptions.Builder(defaultOptions).withEnabled(true).build();
+        Assert.assertEquals("DCL,DDL", options.included_categories);
+        Assert.assertEquals("ks1,ks2", options.included_keyspaces);
+        Assert.assertTrue(options.enabled);
+        Assert.assertNotNull(options.audit_logs_dir);
+        Assert.assertEquals(BinAuditLogger.class.getSimpleName(), options.logger.class_name);
+        Assert.assertEquals(Collections.emptyMap(), options.logger.parameters);
+    }
+
+    @Test
+    public void testInvalidCategoryShouldThrow()
+    {
+        Assertions.assertThatExceptionOfType(ConfigurationException.class)
+                  .isThrownBy(() -> new AuditLogOptions.Builder()
+                                    .withIncludedCategories("invalidCategoryName,dcl")
+                                    .build());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java b/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
index 963a473..9a3c605 100644
--- a/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
+++ b/test/unit/org/apache/cassandra/audit/AuditLoggerAuthTest.java
@@ -33,11 +33,10 @@
 import com.datastax.driver.core.exceptions.AuthenticationException;
 import com.datastax.driver.core.exceptions.SyntaxError;
 import com.datastax.driver.core.exceptions.UnauthorizedException;
-
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.OverrideConfigurationLoader;
 import org.apache.cassandra.config.ParameterizedClass;
-import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.PasswordObfuscator;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.EmbeddedCassandraService;
@@ -61,6 +60,7 @@
     private static final String TEST_USER = "testuser";
     private static final String TEST_ROLE = "testrole";
     private static final String TEST_PW = "testpassword";
+    private static final String TEST_PW_HASH = "$2a$10$1fI9MDCe13ZmEYW4XXZibuASNKyqOY828ELGUtml/t.0Mk/6Kqnsq";
     private static final String CASS_USER = "cassandra";
     private static final String CASS_PW = "cassandra";
 
@@ -74,11 +74,9 @@
             config.audit_logging_options.enabled = true;
             config.audit_logging_options.logger = new ParameterizedClass("InMemoryAuditLogger", null);
         });
-        CQLTester.prepareServer();
 
         System.setProperty("cassandra.superuser_setup_delay_ms", "0");
-        embedded = new EmbeddedCassandraService();
-        embedded.start();
+        embedded = ServerTestUtils.startEmbeddedCassandraService();
 
         executeWithCredentials(
         Arrays.asList(getCreateRoleCql(TEST_USER, true, false, false),
@@ -144,6 +142,21 @@
     }
 
     @Test
+    public void testCqlCreateRoleSyntaxErrorWithHashedPwd()
+    {
+        String createTestRoleCQL = String.format("CREATE ROLE %s WITH LOGIN = %s ANDSUPERUSER = %s AND HASHED PASSWORD",
+                                                 TEST_ROLE, true, false) + TEST_PW_HASH;
+        String createTestRoleCQLExpected = String.format("CREATE ROLE %s WITH LOGIN = %s ANDSUPERUSER = %s AND HASHED PASSWORD ",
+                                                         TEST_ROLE, true, false) + PasswordObfuscator.OBFUSCATION_TOKEN;
+
+        executeWithCredentials(Collections.singletonList(createTestRoleCQL), CASS_USER, CASS_PW, AuditLogEntryType.LOGIN_SUCCESS);
+        assertTrue(getInMemAuditLogger().size() > 0);
+        AuditLogEntry logEntry = getInMemAuditLogger().poll();
+        assertLogEntry(logEntry, AuditLogEntryType.REQUEST_FAILURE, createTestRoleCQLExpected, CASS_USER,  TEST_PW);
+        assertEquals(0, getInMemAuditLogger().size());
+    }
+
+    @Test
     public void testCqlALTERRoleAuditing()
     {
         createTestRole();
@@ -151,7 +164,28 @@
         executeWithCredentials(Arrays.asList(cql), CASS_USER, CASS_PW, AuditLogEntryType.LOGIN_SUCCESS);
         assertTrue(getInMemAuditLogger().size() > 0);
         AuditLogEntry logEntry = getInMemAuditLogger().poll();
-        assertLogEntry(logEntry, AuditLogEntryType.ALTER_ROLE, "ALTER ROLE " + TEST_ROLE + " WITH PASSWORD = '" + PasswordObfuscator.OBFUSCATION_TOKEN + "'", CASS_USER, "foo_bar");
+        assertLogEntry(logEntry,
+                       AuditLogEntryType.ALTER_ROLE,
+                       "ALTER ROLE " + TEST_ROLE + " WITH PASSWORD = '" + PasswordObfuscator.OBFUSCATION_TOKEN + "'",
+                       CASS_USER,
+                       "foo_bar");
+        assertEquals(0, getInMemAuditLogger().size());
+    }
+
+    @Test
+    public void testCqlALTERRoleAuditingWithHashedPwd()
+    {
+        createTestRole();
+        String cql = "ALTER ROLE " + TEST_ROLE + " WITH HASHED PASSWORD = '" + TEST_PW_HASH + "'";
+        executeWithCredentials(Arrays.asList(cql), CASS_USER, CASS_PW, AuditLogEntryType.LOGIN_SUCCESS);
+        assertTrue(getInMemAuditLogger().size() > 0);
+        AuditLogEntry logEntry = getInMemAuditLogger().poll();
+        assertLogEntry(logEntry,
+                       AuditLogEntryType.ALTER_ROLE,
+                       "ALTER ROLE " + TEST_ROLE +
+                       " WITH HASHED PASSWORD = '" + PasswordObfuscator.OBFUSCATION_TOKEN + "'",
+                       CASS_USER,
+                       TEST_PW_HASH);
         assertEquals(0, getInMemAuditLogger().size());
     }
 
@@ -260,6 +294,45 @@
                        TEST_PW);
     }
 
+    @Test
+    public void testCqlUSERCommandsAuditingWithHashedPwd()
+    {
+        //CREATE USER and ALTER USER are supported only for backwards compatibility.
+
+        String user = TEST_ROLE + "userHasedPwd";
+        String cql = "CREATE USER " + user + " WITH HASHED PASSWORD '" + TEST_PW_HASH + "'";
+        executeWithCredentials(Arrays.asList(cql), CASS_USER, CASS_PW, AuditLogEntryType.LOGIN_SUCCESS);
+        assertTrue(getInMemAuditLogger().size() > 0);
+        AuditLogEntry logEntry = getInMemAuditLogger().poll();
+        assertLogEntry(logEntry,
+                       AuditLogEntryType.CREATE_ROLE,
+                       "CREATE USER " + user + " WITH HASHED PASSWORD '" + PasswordObfuscator.OBFUSCATION_TOKEN + "'",
+                       CASS_USER,
+                       TEST_PW_HASH);
+
+        cql = "ALTER USER " + user + " WITH HASHED PASSWORD '" + TEST_PW_HASH + "'";
+        executeWithCredentials(Arrays.asList(cql), CASS_USER, CASS_PW, AuditLogEntryType.LOGIN_SUCCESS);
+        assertTrue(getInMemAuditLogger().size() > 0);
+        logEntry = getInMemAuditLogger().poll();
+        assertLogEntry(logEntry,
+                       AuditLogEntryType.ALTER_ROLE,
+                       "ALTER USER " + user + " WITH HASHED PASSWORD '" + PasswordObfuscator.OBFUSCATION_TOKEN + "'",
+                       CASS_USER,
+                       TEST_PW_HASH);
+
+        cql = "ALTER USER " + user + " WITH HASHED PASSWORD " + TEST_PW_HASH;
+        executeWithCredentials(Arrays.asList(cql), CASS_USER, CASS_PW, AuditLogEntryType.LOGIN_SUCCESS);
+        assertTrue(getInMemAuditLogger().size() > 0);
+        logEntry = getInMemAuditLogger().poll();
+        assertLogEntry(logEntry,
+                       AuditLogEntryType.REQUEST_FAILURE,
+                       "ALTER USER " + user
+                       + " WITH HASHED PASSWORD " + PasswordObfuscator.OBFUSCATION_TOKEN
+                       + "; Syntax Exception. Obscured for security reasons.",
+                       CASS_USER,
+                       TEST_PW_HASH);
+    }
+
     /**
      * Helper methods
      */
@@ -329,8 +402,8 @@
 
     private static void assertSource(AuditLogEntry logEntry, String username)
     {
-        assertEquals(InetAddressAndPort.getLoopbackAddress().address, logEntry.getSource().address);
-        assertTrue(logEntry.getSource().port > 0);
+        assertEquals(InetAddressAndPort.getLoopbackAddress().getAddress(), logEntry.getSource().getAddress());
+        assertTrue(logEntry.getSource().getPort() > 0);
         if (logEntry.getType() != AuditLogEntryType.LOGIN_ERROR)
             assertEquals(username, logEntry.getUser());
     }
@@ -353,4 +426,4 @@
         assertLogEntry(logEntry, AuditLogEntryType.CREATE_ROLE, getCreateRoleCql(TEST_ROLE, true, false, true), CASS_USER, "");
         assertEquals(0, getInMemAuditLogger().size());
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/audit/AuditLoggerTest.java b/test/unit/org/apache/cassandra/audit/AuditLoggerTest.java
index ac0170f..1ee66f7 100644
--- a/test/unit/org/apache/cassandra/audit/AuditLoggerTest.java
+++ b/test/unit/org/apache/cassandra/audit/AuditLoggerTest.java
@@ -21,7 +21,7 @@
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.Map;
+import java.util.Collections;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -717,6 +717,34 @@
         assertEquals(0, AuthEvents.instance.listenerCount());
     }
 
+    @Test
+    public void testJMXArchiveCommand()
+    {
+        disableAuditLogOptions();
+        AuditLogOptions options = new AuditLogOptions();
+
+        try
+        {
+            StorageService.instance.enableAuditLog("BinAuditLogger", Collections.emptyMap(), "", "", "", "",
+                                                   "", "", 10, true, options.roll_cycle,
+                                                   1000L, 1000, "/xyz/not/null");
+            fail("not allowed");
+        }
+        catch (ConfigurationException e)
+        {
+            assertTrue(e.getMessage().contains("Can't enable audit log archiving via nodetool"));
+        }
+
+        options.archive_command = "/xyz/not/null";
+        options.audit_logs_dir = "/tmp/abc";
+        DatabaseDescriptor.setAuditLoggingOptions(options);
+        StorageService.instance.enableAuditLog("BinAuditLogger", Collections.emptyMap(), "", "", "", "",
+                                               "", "", 10, true, options.roll_cycle,
+                                               1000L, 1000, null);
+        assertTrue(AuditLogManager.instance.isEnabled());
+        assertEquals("/xyz/not/null", AuditLogManager.instance.getAuditLogOptions().archive_command);
+    }
+
     /**
      * Helper methods for Audit Log CQL Testing
      */
diff --git a/test/unit/org/apache/cassandra/auth/AuthCacheTest.java b/test/unit/org/apache/cassandra/auth/AuthCacheTest.java
index da97225..0e22346 100644
--- a/test/unit/org/apache/cassandra/auth/AuthCacheTest.java
+++ b/test/unit/org/apache/cassandra/auth/AuthCacheTest.java
@@ -17,16 +17,23 @@
  */
 package org.apache.cassandra.auth;
 
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BooleanSupplier;
 import java.util.function.Function;
 import java.util.function.IntConsumer;
 import java.util.function.IntSupplier;
+import java.util.function.Supplier;
 
 import org.junit.Test;
 
 import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.exceptions.UnavailableException;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -39,27 +46,23 @@
     private int validity = 2000;
     private boolean isCacheEnabled = true;
 
+    private final int MAX_ENTRIES = 10;
+
     @Test
     public void testCacheLoaderIsCalledOnFirst()
     {
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
-
-        int result = authCache.get("10");
-
-        assertEquals(10, result);
+        TestCache authCache = newCache();
+        assertEquals(10, (int)authCache.get("10"));
         assertEquals(1, loadCounter);
     }
 
     @Test
     public void testCacheLoaderIsNotCalledOnSecond()
     {
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+        TestCache authCache = newCache();
         authCache.get("10");
         assertEquals(1, loadCounter);
-
-        int result = authCache.get("10");
-
-        assertEquals(10, result);
+        assertEquals(10, (int)authCache.get("10"));
         assertEquals(1, loadCounter);
     }
 
@@ -67,12 +70,9 @@
     public void testCacheLoaderIsAlwaysCalledWhenDisabled()
     {
         isCacheEnabled = false;
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache authCache = newCache();
         authCache.get("10");
-        int result = authCache.get("10");
-
-        assertEquals(10, result);
+        assertEquals(10, (int)authCache.get("10"));
         assertEquals(2, loadCounter);
     }
 
@@ -80,45 +80,42 @@
     public void testCacheLoaderIsAlwaysCalledWhenValidityIsZero()
     {
         setValidity(0);
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache authCache = newCache();
         authCache.get("10");
-        int result = authCache.get("10");
-
-        assertEquals(10, result);
+        assertEquals(10, (int)authCache.get("10"));
         assertEquals(2, loadCounter);
     }
 
     @Test
     public void testCacheLoaderIsCalledAfterFullInvalidate()
     {
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+        TestCache authCache = newCache();
         authCache.get("10");
-
-        authCache.invalidate();
-        int result = authCache.get("10");
-
-        assertEquals(10, result);
+        authCache.get("11");
         assertEquals(2, loadCounter);
+        authCache.invalidate();
+        assertEquals(10, (int)authCache.get("10"));
+        assertEquals(11, (int)authCache.get("11"));
+        assertEquals(4, loadCounter);
     }
 
     @Test
     public void testCacheLoaderIsCalledAfterInvalidateKey()
     {
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+        TestCache authCache = newCache();
         authCache.get("10");
-
-        authCache.invalidate("10");
-        int result = authCache.get("10");
-
-        assertEquals(10, result);
+        authCache.get("11"); // second key that should not be invalidated
         assertEquals(2, loadCounter);
+        authCache.invalidate("10");
+        assertEquals(10, (int)authCache.get("10"));
+        assertEquals(11, (int)authCache.get("11"));
+        assertEquals(3, loadCounter);
     }
 
     @Test
     public void testCacheLoaderIsCalledAfterReset()
     {
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+        TestCache authCache = newCache();
         authCache.get("10");
 
         authCache.cache = null;
@@ -132,7 +129,7 @@
     public void testThatZeroValidityTurnOffCaching()
     {
         setValidity(0);
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+        TestCache authCache = newCache();
         authCache.get("10");
         int result = authCache.get("10");
 
@@ -145,8 +142,7 @@
     public void testThatRaisingValidityTurnOnCaching()
     {
         setValidity(0);
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache authCache = newCache();
         authCache.setValidity(2000);
         authCache.cache = authCache.initCache(null);
 
@@ -157,8 +153,7 @@
     public void testDisableCache()
     {
         isCacheEnabled = false;
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache authCache = newCache();
         assertNull(authCache.cache);
     }
 
@@ -166,8 +161,7 @@
     public void testDynamicallyEnableCache()
     {
         isCacheEnabled = false;
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache authCache = newCache();
         isCacheEnabled = true;
         authCache.cache = authCache.initCache(null);
 
@@ -177,8 +171,7 @@
     @Test
     public void testDefaultPolicies()
     {
-        TestCache<String, Integer> authCache = new TestCache<>(this::countingLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache authCache = newCache();
         assertTrue(authCache.cache.policy().expireAfterWrite().isPresent());
         assertTrue(authCache.cache.policy().refreshAfterWrite().isPresent());
         assertTrue(authCache.cache.policy().eviction().isPresent());
@@ -187,8 +180,7 @@
     @Test(expected = UnavailableException.class)
     public void testCassandraExceptionPassThroughWhenCacheEnabled()
     {
-        TestCache<String, Integer> cache = new TestCache<>(s -> { throw UnavailableException.create(ConsistencyLevel.QUORUM, 3, 1); }, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache cache = newCache(s -> { throw UnavailableException.create(ConsistencyLevel.QUORUM, 3, 1); });
         cache.get("expect-exception");
     }
 
@@ -196,8 +188,7 @@
     public void testCassandraExceptionPassThroughWhenCacheDisable()
     {
         isCacheEnabled = false;
-        TestCache<String, Integer> cache = new TestCache<>(s -> { throw UnavailableException.create(ConsistencyLevel.QUORUM, 3, 1); }, this::setValidity, () -> validity, () -> isCacheEnabled);
-
+        TestCache cache = newCache(s -> { throw UnavailableException.create(ConsistencyLevel.QUORUM, 3, 1); });
         cache.get("expect-exception");
     }
 
@@ -205,7 +196,7 @@
     public void testCassandraExceptionPassThroughWhenCacheRefreshed() throws InterruptedException
     {
         setValidity(50);
-        TestCache<String, Integer> cache = new TestCache<>(this::countingLoaderWithException, this::setValidity, () -> validity, () -> isCacheEnabled);
+        TestCache cache = new TestCache(this::countingLoaderWithException, this::emptyBulkLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
         cache.get("10");
 
         // wait until the cached record expires
@@ -224,6 +215,111 @@
         }
     }
 
+    @Test
+    public void warmCacheUsingEntryProvider()
+    {
+        AtomicBoolean provided = new AtomicBoolean(false);
+        Supplier<Map<String, Integer>> bulkLoader = () -> {
+            provided.set(true);
+            return Collections.singletonMap("0", 0);
+        };
+        TestCache cache = newCache(bulkLoader);
+        cache.warm();
+        assertEquals(1, cache.getEstimatedSize());
+        assertEquals(0, (int)cache.get("0")); // warmed entry
+        assertEquals(0, loadCounter);
+        assertEquals(10, (int)cache.get("10")); // cold entry
+        assertEquals(1, loadCounter);
+        assertTrue(provided.get());
+    }
+
+    @Test
+    public void warmCacheIsSafeIfCachingIsDisabled()
+    {
+        isCacheEnabled = false;
+        TestCache cache = newCache(() -> Collections.singletonMap("0", 0));
+        cache.warm();
+        assertEquals(0, cache.getEstimatedSize());
+    }
+
+    @Test
+    public void providerSuppliesMoreEntriesThanCapacity()
+    {
+        Supplier<Map<String, Integer>> bulkLoader = () -> {
+            Map<String, Integer> entries = new HashMap<>();
+            for (int i = 0; i < MAX_ENTRIES * 2; i++)
+                entries.put(Integer.toString(i), i);
+            return entries;
+        };
+        TestCache cache = new TestCache(this::countingLoader,
+                                        bulkLoader,
+                                        this::setValidity,
+                                        () -> validity,
+                                        () -> isCacheEnabled);
+        cache.warm();
+        cache.cleanup(); // Force the cleanup task rather than waiting for it to be scheduled to get accurate count
+        assertEquals(MAX_ENTRIES, cache.getEstimatedSize());
+    }
+
+    @Test
+    public void handleProviderErrorDuringWarming()
+    {
+        System.setProperty(AuthCache.CACHE_LOAD_RETRIES_PROPERTY, "3");
+        System.setProperty(AuthCache.CACHE_LOAD_RETRY_INTERVAL_PROPERTY, "0");
+        final AtomicInteger attempts = new AtomicInteger(0);
+
+        Supplier<Map<String, Integer>> bulkLoader = () -> {
+            if (attempts.incrementAndGet() < 3)
+                throw new RuntimeException("BOOM");
+
+            return Collections.singletonMap("0", 99);
+        };
+
+        TestCache cache = newCache(bulkLoader);
+        cache.warm();
+        assertEquals(1, cache.getEstimatedSize());
+        assertEquals(99, (int)cache.get("0"));
+        // We should have made 3 attempts to get the initial entries
+        assertEquals(3, attempts.get());
+    }
+
+    @Test
+    public void testCacheLoaderIsNotCalledOnGetAllWhenCacheIsDisabled()
+    {
+        isCacheEnabled = false;
+        TestCache authCache = new TestCache(this::countingLoader, this::emptyBulkLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+        authCache.get("10");
+        Map<String, Integer> result = authCache.getAll();
+
+        // even though the cache is disabled and nothing is cache we still use loadFunction on get operation, so
+        // its counter has been incremented
+        assertThat(result).isEmpty();
+        assertEquals(1, loadCounter);
+    }
+
+    @Test
+    public void testCacheLoaderIsNotCalledOnGetAllWhenCacheIsEmpty()
+    {
+        TestCache authCache = new TestCache(this::countingLoader, this::emptyBulkLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+
+        Map<String, Integer> result = authCache.getAll();
+
+        assertThat(result).isEmpty();
+        assertEquals(0, loadCounter);
+    }
+
+    @Test
+    public void testCacheLoaderIsNotCalledOnGetAllWhenCacheIsNotEmpty()
+    {
+        TestCache authCache = new TestCache(this::countingLoader, this::emptyBulkLoader, this::setValidity, () -> validity, () -> isCacheEnabled);
+        authCache.get("10");
+        Map<String, Integer> result = authCache.getAll();
+
+        assertThat(result).hasSize(1);
+        assertThat(result).containsEntry("10", 10);
+        assertEquals(1, loadCounter);
+    }
+
     private void setValidity(int validity)
     {
         this.validity = validity;
@@ -245,21 +341,65 @@
         return loadedValue;
     }
 
-    private static class TestCache<K, V> extends AuthCache<K, V>
+    private Map<String, Integer> emptyBulkLoader()
+    {
+        return Collections.emptyMap();
+    }
+
+    private TestCache newCache()
+    {
+        return new TestCache(this::countingLoader,
+                             this::emptyBulkLoader,
+                             this::setValidity,
+                             () -> validity,
+                             () -> isCacheEnabled);
+    }
+
+    private TestCache newCache(Function<String, Integer> loadFunction)
+    {
+        return new TestCache(loadFunction,
+                             this::emptyBulkLoader,
+                             this::setValidity,
+                             () -> validity,
+                             () -> isCacheEnabled);
+    }
+
+    private TestCache newCache(Supplier<Map<String, Integer>> bulkLoader)
+    {
+        return new TestCache(this::countingLoader,
+                             bulkLoader,
+                             this::setValidity,
+                             () -> validity,
+                             () -> isCacheEnabled);
+    }
+
+    private static class TestCache extends AuthCache<String, Integer>
     {
         private static int nameCounter = 0; // Allow us to create many instances of cache with same name prefix
 
-        TestCache(Function<K, V> loadFunction, IntConsumer setValidityDelegate, IntSupplier getValidityDelegate, BooleanSupplier cacheEnabledDelegate)
+        TestCache(Function<String, Integer> loadFunction,
+                  Supplier<Map<String, Integer>> bulkLoadFunction,
+                  IntConsumer setValidityDelegate,
+                  IntSupplier getValidityDelegate,
+                  BooleanSupplier cacheEnabledDelegate)
         {
             super("TestCache" + nameCounter++,
                   setValidityDelegate,
                   getValidityDelegate,
-                  (updateInterval) -> {},
-                  () -> 1000,
-                  (maxEntries) -> {},
-                  () -> 10,
+                  (updateInterval) -> {},               // set update interval
+                  () -> 1000,                           // get update interval
+                  (MAX_ENTRIES) -> {},                   // set max entries
+                  () -> 10,                             // get max entries
+                  (updateActiveUpdate) -> {},           // set active update enabled
+                  () -> false,                          // get active update enabled
                   loadFunction,
+                  bulkLoadFunction,
                   cacheEnabledDelegate);
         }
+
+        void cleanup()
+        {
+            cache.cleanUp();
+        }
     }
 }
diff --git a/test/unit/org/apache/cassandra/auth/AuthPropertiesTest.java b/test/unit/org/apache/cassandra/auth/AuthPropertiesTest.java
new file mode 100644
index 0000000..9a01449
--- /dev/null
+++ b/test/unit/org/apache/cassandra/auth/AuthPropertiesTest.java
@@ -0,0 +1,53 @@
+/*
+ * 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.auth;
+
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+
+public class AuthPropertiesTest
+{
+    @BeforeClass
+    public static void beforeClass()
+    {
+        if (!DatabaseDescriptor.isDaemonInitialized())
+        {
+            DatabaseDescriptor.daemonInitialization();
+        }
+    }
+
+    @Test
+    public void setReadCL_LegitValue()
+    {
+        AuthProperties authProperties = new AuthProperties(ConsistencyLevel.ANY, ConsistencyLevel.THREE, false);
+        authProperties.setReadConsistencyLevel(ConsistencyLevel.LOCAL_QUORUM);
+        Assert.assertEquals(ConsistencyLevel.LOCAL_QUORUM, AuthProperties.instance.getReadConsistencyLevel());
+    }
+
+    @Test (expected = IllegalArgumentException.class)
+    public void setReadCL_BadValue()
+    {
+        AuthProperties authProperties = new AuthProperties(ConsistencyLevel.ANY, ConsistencyLevel.THREE, false);
+        authProperties.setReadConsistencyLevel(ConsistencyLevel.valueOf("ILLEGAL_CL"));
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/auth/AuthTestUtils.java b/test/unit/org/apache/cassandra/auth/AuthTestUtils.java
new file mode 100644
index 0000000..c78520e
--- /dev/null
+++ b/test/unit/org/apache/cassandra/auth/AuthTestUtils.java
@@ -0,0 +1,174 @@
+/*
+ * 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.auth;
+
+import java.util.concurrent.Callable;
+
+import org.apache.cassandra.auth.jmx.AuthorizationProxy;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.cql3.statements.BatchStatement;
+import org.apache.cassandra.cql3.statements.SelectStatement;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.exceptions.RequestExecutionException;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.transport.messages.ResultMessage;
+
+
+public class AuthTestUtils
+{
+
+    public static final RoleResource ROLE_A = RoleResource.role("role_a");
+    public static final RoleResource ROLE_B = RoleResource.role("role_b");
+    public static final RoleResource ROLE_B_1 = RoleResource.role("role_b_1");
+    public static final RoleResource ROLE_B_2 = RoleResource.role("role_b_2");
+    public static final RoleResource ROLE_B_3 = RoleResource.role("role_b_3");
+    public static final RoleResource ROLE_C = RoleResource.role("role_c");
+    public static final RoleResource ROLE_C_1 = RoleResource.role("role_c_1");
+    public static final RoleResource ROLE_C_2 = RoleResource.role("role_c_2");
+    public static final RoleResource ROLE_C_3 = RoleResource.role("role_c_3");
+    public static final RoleResource[] ALL_ROLES  = new RoleResource[] {ROLE_A,
+                                                                        ROLE_B, ROLE_B_1, ROLE_B_2, ROLE_B_3,
+                                                                        ROLE_C, ROLE_C_1, ROLE_C_2, ROLE_C_3};
+    /**
+     * This just extends the internal IRoleManager implementation to ensure that
+     * all access to underlying tables is made via
+     * QueryProcessor.executeOnceInternal/CQLStatement.executeInternal and not
+     * StorageProxy so that it can be used in unit tests.
+     */
+    public static class LocalCassandraRoleManager extends CassandraRoleManager
+    {
+        @Override
+        ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
+        {
+            return statement.executeLocally(QueryState.forInternalCalls(), options);
+        }
+
+        @Override
+        UntypedResultSet process(String query, ConsistencyLevel consistencyLevel)
+        {
+            return QueryProcessor.executeInternal(query);
+        }
+
+        @Override
+        protected void scheduleSetupTask(final Callable<Void> setupTask)
+        {
+            // skip data migration or setting up default role for tests
+        }
+    }
+
+    public static class LocalCassandraAuthorizer extends CassandraAuthorizer
+    {
+        @Override
+        ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
+        {
+            return statement.executeLocally(QueryState.forInternalCalls(), options);
+        }
+
+        @Override
+        UntypedResultSet process(String query, ConsistencyLevel cl) throws RequestExecutionException
+        {
+            return QueryProcessor.executeInternal(query);
+        }
+
+        @Override
+        void processBatch(BatchStatement statement)
+        {
+            statement.executeLocally(QueryState.forInternalCalls(), QueryOptions.DEFAULT);
+        }
+    }
+
+    public static class LocalCassandraNetworkAuthorizer extends CassandraNetworkAuthorizer
+    {
+        @Override
+        ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
+        {
+            return statement.executeLocally(QueryState.forInternalCalls(), options);
+        }
+
+        @Override
+        UntypedResultSet process(String query, ConsistencyLevel cl)
+        {
+            return QueryProcessor.executeInternal(query);
+        }
+    }
+
+    public static class LocalPasswordAuthenticator extends PasswordAuthenticator
+    {
+        @Override
+        ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
+        {
+            return statement.executeLocally(QueryState.forInternalCalls(), options);
+        }
+
+        @Override
+        UntypedResultSet process(String query, ConsistencyLevel cl)
+        {
+            return QueryProcessor.executeInternal(query);
+        }
+    }
+
+    public static class NoAuthSetupAuthorizationProxy extends AuthorizationProxy
+    {
+        public NoAuthSetupAuthorizationProxy()
+        {
+            super();
+            this.isAuthSetupComplete = () -> true;
+        }
+    }
+
+    public static void grantRolesTo(IRoleManager roleManager, RoleResource grantee, RoleResource...granted)
+    {
+        for(RoleResource toGrant : granted)
+            roleManager.grantRole(AuthenticatedUser.ANONYMOUS_USER, toGrant, grantee);
+    }
+
+    public static long getNetworkPermissionsReadCount()
+    {
+        ColumnFamilyStore networkPemissionsTable =
+                Keyspace.open(SchemaConstants.AUTH_KEYSPACE_NAME).getColumnFamilyStore(AuthKeyspace.NETWORK_PERMISSIONS);
+        return networkPemissionsTable.metric.readLatency.latency.getCount();
+    }
+
+    public static long getRolePermissionsReadCount()
+    {
+        ColumnFamilyStore rolesPemissionsTable =
+                Keyspace.open(SchemaConstants.AUTH_KEYSPACE_NAME).getColumnFamilyStore(AuthKeyspace.ROLE_PERMISSIONS);
+        return rolesPemissionsTable.metric.readLatency.latency.getCount();
+    }
+
+    public static long getRolesReadCount()
+    {
+        ColumnFamilyStore rolesTable = Keyspace.open(SchemaConstants.AUTH_KEYSPACE_NAME).getColumnFamilyStore(AuthKeyspace.ROLES);
+        return rolesTable.metric.readLatency.latency.getCount();
+    }
+
+    public static RoleOptions getLoginRoleOptions()
+    {
+        RoleOptions roleOptions = new RoleOptions();
+        roleOptions.setOption(IRoleManager.Option.SUPERUSER, false);
+        roleOptions.setOption(IRoleManager.Option.LOGIN, true);
+        roleOptions.setOption(IRoleManager.Option.PASSWORD, "ignored");
+        return roleOptions;
+    }
+}
diff --git a/test/unit/org/apache/cassandra/auth/CacheRefresherTest.java b/test/unit/org/apache/cassandra/auth/CacheRefresherTest.java
new file mode 100644
index 0000000..7600c29
--- /dev/null
+++ b/test/unit/org/apache/cassandra/auth/CacheRefresherTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.auth;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.function.BooleanSupplier;
+
+import com.google.common.util.concurrent.MoreExecutors;
+
+import com.github.benmanes.caffeine.cache.CacheLoader;
+import com.github.benmanes.caffeine.cache.Caffeine;
+import com.github.benmanes.caffeine.cache.LoadingCache;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CacheRefresherTest
+{
+    @Test
+    public void refresh() throws Exception
+    {
+        Map<String, String> src = new HashMap<>();
+        CacheLoader<String, String> loader = src::get;
+
+        // Supply the directExecutor so the refresh() call executes within the refresher task like AuthCache (rather than async)
+        LoadingCache<String, String> cache = Caffeine.newBuilder()
+                                                     .executor(MoreExecutors.directExecutor())
+                                                     .build(loader);
+
+        AtomicBoolean skipRefresh = new AtomicBoolean(false);
+        BooleanSupplier skipCondition = skipRefresh::get;
+
+        CacheRefresher<String, String> refresher = CacheRefresher.create("test", cache, (k, v) -> v.equals("removed"), skipCondition);
+        src.put("some", "thing");
+        Assert.assertEquals("thing", cache.get("some"));
+
+        // Cache should still have old value...
+        src.put("some", "one");
+        Assert.assertEquals("thing", cache.get("some"));
+
+        // ... but refresher should update it
+        refresher.run();
+        Assert.assertEquals("one", cache.get("some"));
+
+        // If we just remove the value from the src, the cache should still contain it
+        src.remove("some");
+        Assert.assertEquals("one", cache.get("some"));
+
+        // If we insert the special sentinel value into the src, the refresher will invalidate it from the cache.
+        // This time when it's removed from the underlying storage, it's not returned from the cache
+        src.put("some", "removed");
+        refresher.run();
+        src.remove("some");
+
+        // Remove from src
+        Assert.assertNull(cache.get("some"));
+
+        // If the skip condition returns true, don't refresh
+        src.put("some", "one");
+        Assert.assertEquals("one", cache.get("some"));
+        skipRefresh.set(true);
+        src.put("some", "body");
+        refresher.run();
+        Assert.assertEquals("one", cache.get("some"));
+
+        // Change the skip condition back to false and refresh
+        skipRefresh.set(false);
+        refresher.run();
+        Assert.assertEquals("body", cache.get("some"));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/auth/CassandraAuthorizerTest.java b/test/unit/org/apache/cassandra/auth/CassandraAuthorizerTest.java
index 61235d2..643b2df 100644
--- a/test/unit/org/apache/cassandra/auth/CassandraAuthorizerTest.java
+++ b/test/unit/org/apache/cassandra/auth/CassandraAuthorizerTest.java
@@ -18,80 +18,78 @@
 
 package org.apache.cassandra.auth;
 
-import java.util.Collections;
-
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.CassandraRelevantProperties;
 import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.cql3.statements.CreateRoleStatement;
-import org.apache.cassandra.cql3.statements.ListPermissionsStatement;
-import org.apache.cassandra.exceptions.UnauthorizedException;
-import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.transport.messages.ResultMessage;
-import org.assertj.core.api.Assertions;
 
-import static org.apache.cassandra.auth.AuthenticatedUser.SYSTEM_USER;
+import static java.lang.String.format;
 
 public class CassandraAuthorizerTest extends CQLTester
 {
-    private static final RoleResource PARENT_ROLE = RoleResource.role("parent");
-    private static final RoleResource CHILD_ROLE = RoleResource.role("child");
-    private static final RoleResource OTHER_ROLE = RoleResource.role("other");
+    private static final String PARENT = "parent";
+    private static final String CHILD = "child";
+    private static final String OTHER = "other";
+    private static final String PASSWORD = "secret";
 
     @BeforeClass
     public static void setupClass()
     {
+        CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(true);
         CQLTester.setUpClass();
-        SchemaLoader.setupAuth(new RoleTestUtils.LocalCassandraRoleManager(),
-                               new PasswordAuthenticator(),
-                               new RoleTestUtils.LocalCassandraAuthorizer(),
-                               new RoleTestUtils.LocalCassandraNetworkAuthorizer());
+        requireAuthentication();
+        requireNetwork();
     }
 
     @Test
-    public void testListPermissionsOfChildByParent()
+    public void testListPermissionsOfChildByParent() throws Throwable
     {
-        // create parent role by system user
-        DatabaseDescriptor.getRoleManager()
-                          .createRole(SYSTEM_USER, PARENT_ROLE, RoleTestUtils.getLoginRoleOptions());
+        useSuperUser();
+
+        // create parent role by super user
+        executeNet(format("CREATE ROLE %s WITH login=true AND password='%s'", PARENT, PASSWORD));
+        executeNet(format("GRANT CREATE ON ALL ROLES TO %s", PARENT));
+        assertRowsNet(executeNet(format("LIST ALL PERMISSIONS OF %s", PARENT)),
+                      row(PARENT, PARENT, "<all roles>", "CREATE"));
+
+        // create other role by super user
+        executeNet(format("CREATE ROLE %s WITH login=true AND password='%s'", OTHER, PASSWORD));
+        assertRowsNet(executeNet(format("LIST ALL PERMISSIONS OF %s", OTHER)));
+
+        useUser(PARENT, PASSWORD);
 
         // create child role by parent
-        String createRoleQuery = String.format("CREATE ROLE %s", CHILD_ROLE.getRoleName());
-        CreateRoleStatement createRoleStatement = (CreateRoleStatement) QueryProcessor.parseStatement(createRoleQuery)
-                                                                                      .prepare(ClientState.forInternalCalls());
-        createRoleStatement.execute(getClientState(PARENT_ROLE.getRoleName()));
+        executeNet(format("CREATE ROLE %s WITH login = true AND password='%s'", CHILD, PASSWORD));
 
-        // grant SELECT permission on ALL KEYSPACES to child
-        DatabaseDescriptor.getAuthorizer()
-                          .grant(SYSTEM_USER,
-                                 Collections.singleton(Permission.SELECT),
-                                 DataResource.root(),
-                                 CHILD_ROLE);
+        // list permissions by parent
+        assertRowsNet(executeNet(format("LIST ALL PERMISSIONS OF %s", PARENT)),
+                      row(PARENT, PARENT, "<all roles>", "CREATE"),
+                      row(PARENT, PARENT, "<role child>", "ALTER"),
+                      row(PARENT, PARENT, "<role child>", "DROP"),
+                      row(PARENT, PARENT, "<role child>", "AUTHORIZE"),
+                      row(PARENT, PARENT, "<role child>", "DESCRIBE"));
+        assertRowsNet(executeNet(format("LIST ALL PERMISSIONS OF %s", CHILD)));
+        assertInvalidMessageNet(format("You are not authorized to view %s's permissions", OTHER),
+                                format("LIST ALL PERMISSIONS OF %s", OTHER));
 
-        // list child permissions by parent
-        String listPermissionsQuery = String.format("LIST ALL PERMISSIONS OF %s", CHILD_ROLE.getRoleName());
-        ListPermissionsStatement listPermissionsStatement = (ListPermissionsStatement) QueryProcessor.parseStatement(listPermissionsQuery)
-                                                                                                     .prepare(ClientState.forInternalCalls());
-        ResultMessage message = listPermissionsStatement.execute(getClientState(PARENT_ROLE.getRoleName()));
-        assertRows(UntypedResultSet.create(((ResultMessage.Rows) message).result),
-                   row("child", "child", "<all keyspaces>", "SELECT"));
+        useUser(CHILD, PASSWORD);
 
-        // list child permissions by other user that is not their parent
-        DatabaseDescriptor.getRoleManager().createRole(SYSTEM_USER, OTHER_ROLE, RoleTestUtils.getLoginRoleOptions());
-        Assertions.assertThatThrownBy(() -> listPermissionsStatement.execute(getClientState(OTHER_ROLE.getRoleName())))
-                  .isInstanceOf(UnauthorizedException.class)
-                  .hasMessage("You are not authorized to view child's permissions");
-    }
+        // list permissions by child
+        assertInvalidMessageNet(format("You are not authorized to view %s's permissions", PARENT),
+                                format("LIST ALL PERMISSIONS OF %s", PARENT));
+        assertRowsNet(executeNet(format("LIST ALL PERMISSIONS OF %s", CHILD)));
+        assertInvalidMessageNet(format("You are not authorized to view %s's permissions", OTHER),
+                                format("LIST ALL PERMISSIONS OF %s", OTHER));
 
-    private static ClientState getClientState(String username)
-    {
-        ClientState state = ClientState.forInternalCalls();
-        state.login(new AuthenticatedUser(username));
-        return state;
+        // try to create role by child
+        assertInvalidMessageNet(format("User %s does not have sufficient privileges to perform the requested operation", CHILD),
+                                format("CREATE ROLE %s WITH login=true AND password='%s'", "nope", PASSWORD));
+
+        useUser(PARENT, PASSWORD);
+
+        // alter child's role by parent
+        executeNet(format("ALTER ROLE %s WITH login = false", CHILD));
+        executeNet(format("DROP ROLE %s", CHILD));
     }
 }
diff --git a/test/unit/org/apache/cassandra/auth/CassandraAuthorizerTruncatingTest.java b/test/unit/org/apache/cassandra/auth/CassandraAuthorizerTruncatingTest.java
new file mode 100644
index 0000000..3806a23
--- /dev/null
+++ b/test/unit/org/apache/cassandra/auth/CassandraAuthorizerTruncatingTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.auth;
+
+import java.util.EnumSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.utils.Pair;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ALL_ROLES;
+import static org.apache.cassandra.auth.AuthTestUtils.LocalCassandraRoleManager;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B_1;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B_2;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_C;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_C_1;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_C_2;
+import static org.apache.cassandra.auth.AuthTestUtils.grantRolesTo;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * For Authorizer based tests where we need to fully truncate the roles, members, and permissions between tests
+ */
+public class CassandraAuthorizerTruncatingTest extends CQLTester
+{
+    @BeforeClass
+    public static void setupClass()
+    {
+        CassandraRelevantProperties.ORG_APACHE_CASSANDRA_DISABLE_MBEAN_REGISTRATION.setBoolean(true);
+        DatabaseDescriptor.daemonInitialization();
+        DatabaseDescriptor.setAuthorizer(new StubAuthorizer());
+        requireAuthentication();
+        requireNetwork();
+    }
+
+    @Before
+    public void setup()
+    {
+        ColumnFamilyStore.getIfExists(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES).truncateBlocking();
+        ColumnFamilyStore.getIfExists(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLE_MEMBERS).truncateBlocking();
+        ColumnFamilyStore.getIfExists(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLE_PERMISSIONS).truncateBlocking();
+    }
+
+    @Test
+    public void testBulkLoadingForAuthCache()
+    {
+        IResource table1 = Resources.fromName("data/ks1/t1");
+        IResource table2 = Resources.fromName("data/ks2/t2");
+
+        // Setup a hierarchy of roles. ROLE_B is granted LOGIN privs, ROLE_B_1 and ROLE_B_2.
+        // ROLE_C is granted LOGIN along with ROLE_C_1 & ROLE_C_2
+        IRoleManager roleManager = new LocalCassandraRoleManager();
+        roleManager.setup();
+
+        for (RoleResource role : ALL_ROLES)
+            roleManager.createRole(AuthenticatedUser.ANONYMOUS_USER, role, new RoleOptions());
+
+        RoleOptions withLogin = new RoleOptions();
+        withLogin.setOption(IRoleManager.Option.LOGIN, Boolean.TRUE);
+        roleManager.alterRole(AuthenticatedUser.ANONYMOUS_USER, ROLE_B, withLogin);
+        roleManager.alterRole(AuthenticatedUser.ANONYMOUS_USER, ROLE_C, withLogin);
+        grantRolesTo(roleManager, ROLE_B, ROLE_B_1, ROLE_B_2);
+        grantRolesTo(roleManager, ROLE_C, ROLE_C_1, ROLE_C_2);
+
+        CassandraAuthorizer authorizer = new CassandraAuthorizer();
+        // Granted on ks1.t1: B1 -> {SELECT, MODIFY}, B2 -> {AUTHORIZE}, so B -> {SELECT, MODIFY, AUTHORIZE}
+        authorizer.grant(AuthenticatedUser.SYSTEM_USER, EnumSet.of(Permission.SELECT, Permission.MODIFY), table1, ROLE_B_1);
+        authorizer.grant(AuthenticatedUser.SYSTEM_USER, EnumSet.of(Permission.AUTHORIZE), table1, ROLE_B_2);
+
+        // Granted on ks2.t2: C1 -> {SELECT, MODIFY}, C2 -> {AUTHORIZE}, so C -> {SELECT, MODIFY, AUTHORIZE}
+        authorizer.grant(AuthenticatedUser.SYSTEM_USER, EnumSet.of(Permission.SELECT, Permission.MODIFY), table2, ROLE_C_1);
+        authorizer.grant(AuthenticatedUser.SYSTEM_USER, EnumSet.of(Permission.AUTHORIZE), table2, ROLE_C_2);
+
+        Map<Pair<AuthenticatedUser, IResource>, Set<Permission>> cacheEntries = authorizer.bulkLoader().get();
+
+        // Only ROLE_B and ROLE_C have LOGIN privs, so only they should be in the cached
+        assertEquals(2, cacheEntries.size());
+        assertEquals(EnumSet.of(Permission.SELECT, Permission.MODIFY, Permission.AUTHORIZE),
+                     cacheEntries.get(Pair.create(new AuthenticatedUser(ROLE_B.getRoleName()), table1)));
+        assertEquals(EnumSet.of(Permission.SELECT, Permission.MODIFY, Permission.AUTHORIZE),
+                     cacheEntries.get(Pair.create(new AuthenticatedUser(ROLE_C.getRoleName()), table2)));
+    }
+
+    @Test
+    public void testBulkLoadingForAuthCachWithEmptyTable()
+    {
+        CassandraAuthorizer authorizer = new CassandraAuthorizer();
+        Map<Pair<AuthenticatedUser, IResource>, Set<Permission>> cacheEntries = authorizer.bulkLoader().get();
+        assertTrue(cacheEntries.isEmpty());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java b/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java
index 350ee20..3a208f8 100644
--- a/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java
+++ b/test/unit/org/apache/cassandra/auth/CassandraNetworkAuthorizerTest.java
@@ -43,9 +43,8 @@
 import org.apache.cassandra.service.ClientState;
 
 import static org.apache.cassandra.auth.AuthKeyspace.NETWORK_PERMISSIONS;
-import static org.apache.cassandra.auth.RoleTestUtils.LocalCassandraRoleManager;
+import static org.apache.cassandra.auth.AuthTestUtils.getRolesReadCount;
 import static org.apache.cassandra.schema.SchemaConstants.AUTH_KEYSPACE_NAME;
-import static org.apache.cassandra.auth.RoleTestUtils.getReadCount;
 
 public class CassandraNetworkAuthorizerTest
 {
@@ -63,13 +62,12 @@
     public static void defineSchema() throws ConfigurationException
     {
         SchemaLoader.prepareServer();
-        SchemaLoader.setupAuth(new LocalCassandraRoleManager(),
-                               new PasswordAuthenticator(),
-                               new RoleTestUtils.LocalCassandraAuthorizer(),
-                               new RoleTestUtils.LocalCassandraNetworkAuthorizer());
+        SchemaLoader.setupAuth(new AuthTestUtils.LocalCassandraRoleManager(),
+                               new AuthTestUtils.LocalPasswordAuthenticator(),
+                               new AuthTestUtils.LocalCassandraAuthorizer(),
+                               new AuthTestUtils.LocalCassandraNetworkAuthorizer());
+        AuthCacheService.initializeAndRegisterCaches();
         setupSuperUser();
-        // not strictly necessary to init the cache here, but better to be explicit
-        Roles.initRolesCache(DatabaseDescriptor.getRoleManager(), () -> true);
     }
 
     @Before
@@ -122,7 +120,7 @@
         AuthenticationStatement authStmt = (AuthenticationStatement) statement;
 
         // invalidate roles cache so that any changes to the underlying roles are picked up
-        Roles.clearCache();
+        Roles.cache.invalidate();
         authStmt.execute(getClientState());
     }
 
@@ -193,7 +191,7 @@
         assertDcPermRow(username, "dc1");
 
         // clear the roles cache to lose the (non-)superuser status for the user
-        Roles.clearCache();
+        Roles.cache.invalidate();
         auth("ALTER ROLE %s WITH superuser = true", username);
         Assert.assertEquals(DCPermissions.all(), dcPerms(username));
     }
@@ -207,14 +205,14 @@
     }
 
     @Test
-    public void getLoginPrivilegeFromRolesCache() throws Exception
+    public void getLoginPrivilegeFromRolesCache()
     {
         String username = createName();
         auth("CREATE ROLE %s", username);
-        long readCount = getReadCount();
+        long readCount = getRolesReadCount();
         dcPerms(username);
-        Assert.assertEquals(++readCount, getReadCount());
+        Assert.assertEquals(++readCount, getRolesReadCount());
         dcPerms(username);
-        Assert.assertEquals(readCount, getReadCount());
+        Assert.assertEquals(readCount, getRolesReadCount());
     }
 }
diff --git a/test/unit/org/apache/cassandra/auth/CassandraRoleManagerTest.java b/test/unit/org/apache/cassandra/auth/CassandraRoleManagerTest.java
index 6583c49..7b6b910 100644
--- a/test/unit/org/apache/cassandra/auth/CassandraRoleManagerTest.java
+++ b/test/unit/org/apache/cassandra/auth/CassandraRoleManagerTest.java
@@ -18,23 +18,28 @@
 
 package org.apache.cassandra.auth;
 
+import java.util.Map;
 import java.util.Set;
 
 import com.google.common.collect.Iterables;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
 
-import static org.apache.cassandra.auth.RoleTestUtils.*;
+import static org.apache.cassandra.auth.AuthTestUtils.*;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class CassandraRoleManagerTest
 {
-
     @BeforeClass
     public static void setupClass()
     {
@@ -43,6 +48,19 @@
         SchemaLoader.createKeyspace(SchemaConstants.AUTH_KEYSPACE_NAME,
                                     KeyspaceParams.simple(1),
                                     Iterables.toArray(AuthKeyspace.metadata().tables, TableMetadata.class));
+        // We start StorageService because confirmFastRoleSetup confirms that CassandraRoleManager will
+        // take a faster path once the cluster is already setup, which includes checking MessagingService
+        // and issuing queries with QueryProcessor.process, which uses TokenMetadata
+        DatabaseDescriptor.daemonInitialization();
+        StorageService.instance.initServer(0);
+        AuthCacheService.initializeAndRegisterCaches();
+    }
+
+    @Before
+    public void setup() throws Exception
+    {
+        ColumnFamilyStore.getIfExists(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES).truncateBlocking();
+        ColumnFamilyStore.getIfExists(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLE_MEMBERS).truncateBlocking();
     }
 
     @Test
@@ -55,7 +73,7 @@
         // collects all of the necessary info with a single query for each granted role.
         // This just tests that that is the case, i.e. we perform 1 read per role in the
         // transitive set of granted roles
-        IRoleManager roleManager = new LocalCassandraRoleManager();
+        IRoleManager roleManager = new AuthTestUtils.LocalCassandraRoleManager();
         roleManager.setup();
         for (RoleResource r : ALL_ROLES)
             roleManager.createRole(AuthenticatedUser.ANONYMOUS_USER, r, new RoleOptions());
@@ -80,9 +98,73 @@
 
     private void fetchRolesAndCheckReadCount(IRoleManager roleManager, RoleResource primaryRole)
     {
-        long before = getReadCount();
+        long before = getRolesReadCount();
         Set<Role> granted = roleManager.getRoleDetails(primaryRole);
-        long after = getReadCount();
+        long after = getRolesReadCount();
         assertEquals(granted.size(), after - before);
     }
+
+    @Test
+    public void confirmFastRoleSetup()
+    {
+        IRoleManager roleManager = new AuthTestUtils.LocalCassandraRoleManager();
+        roleManager.setup();
+        for (RoleResource r : ALL_ROLES)
+            roleManager.createRole(AuthenticatedUser.ANONYMOUS_USER, r, new RoleOptions());
+
+        CassandraRoleManager crm = new CassandraRoleManager();
+
+        assertTrue("Expected the role manager to have existing roles before CassandraRoleManager setup", CassandraRoleManager.hasExistingRoles());
+    }
+
+    @Test
+    public void warmCacheLoadsAllEntries()
+    {
+        IRoleManager roleManager = new AuthTestUtils.LocalCassandraRoleManager();
+        roleManager.setup();
+        for (RoleResource r : ALL_ROLES)
+            roleManager.createRole(AuthenticatedUser.ANONYMOUS_USER, r, new RoleOptions());
+
+        // Multi level role hierarchy
+        grantRolesTo(roleManager, ROLE_B, ROLE_B_1, ROLE_B_2, ROLE_B_3);
+        grantRolesTo(roleManager, ROLE_C, ROLE_C_1, ROLE_C_2, ROLE_C_3);
+
+        // Use CassandraRoleManager to get entries for pre-warming a cache, then verify those entries
+        CassandraRoleManager crm = new CassandraRoleManager();
+        crm.setup();
+        Map<RoleResource, Set<Role>> cacheEntries = crm.bulkLoader().get();
+
+        Set<Role> roleBRoles = cacheEntries.get(ROLE_B);
+        assertRoleSet(roleBRoles, ROLE_B, ROLE_B_1, ROLE_B_2, ROLE_B_3);
+
+        Set<Role> roleCRoles = cacheEntries.get(ROLE_C);
+        assertRoleSet(roleCRoles, ROLE_C, ROLE_C_1, ROLE_C_2, ROLE_C_3);
+
+        for (RoleResource r : ALL_ROLES)
+        {
+            // We already verified ROLE_B and ROLE_C
+            if (r.equals(ROLE_B) || r.equals(ROLE_C))
+                continue;
+
+            // Check the cache entries for the roles without any further grants
+            assertRoleSet(cacheEntries.get(r), r);
+        }
+    }
+
+    @Test
+    public void warmCacheWithEmptyTable()
+    {
+        CassandraRoleManager crm = new CassandraRoleManager();
+        crm.setup();
+        Map<RoleResource, Set<Role>> cacheEntries = crm.bulkLoader().get();
+        assertTrue(cacheEntries.isEmpty());
+    }
+
+    private void assertRoleSet(Set<Role> actual, RoleResource...expected)
+    {
+        assertEquals(expected.length, actual.size());
+
+        for (RoleResource expectedRole : expected)
+            assertTrue(actual.stream().anyMatch(role -> role.resource.equals(expectedRole)));
+    }
 }
diff --git a/test/unit/org/apache/cassandra/auth/CreateAndAlterRoleTest.java b/test/unit/org/apache/cassandra/auth/CreateAndAlterRoleTest.java
new file mode 100644
index 0000000..33ae129
--- /dev/null
+++ b/test/unit/org/apache/cassandra/auth/CreateAndAlterRoleTest.java
@@ -0,0 +1,149 @@
+/*
+ * 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.auth;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.exceptions.AuthenticationException;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.junit.Assert.assertTrue;
+import static org.mindrot.jbcrypt.BCrypt.gensalt;
+import static org.mindrot.jbcrypt.BCrypt.hashpw;
+
+public class CreateAndAlterRoleTest extends CQLTester
+{
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+        requireAuthentication();
+        requireNetwork();
+    }
+
+    @Test
+    public void createAlterRoleWithHashedPassword() throws Throwable
+    {
+        String user1 = "hashed_pw_role";
+        String user2 = "pw_role";
+        String plainTextPwd = "super_secret_thing";
+        String plainTextPwd2 = "much_safer_password";
+        String hashedPassword = hashpw(plainTextPwd, gensalt(4));
+        String hashedPassword2 = hashpw(plainTextPwd2, gensalt(4));
+
+        useSuperUser();
+
+        assertInvalidMessage("Invalid hashed password value",
+                             String.format("CREATE ROLE %s WITH login=true AND hashed password='%s'",
+                                           user1, "this_is_an_invalid_hash"));
+        assertInvalidMessage("Options 'password' and 'hashed password' are mutually exclusive",
+                             String.format("CREATE ROLE %s WITH login=true AND password='%s' AND hashed password='%s'",
+                                           user1, plainTextPwd, hashedPassword));
+        executeNet(String.format("CREATE ROLE %s WITH login=true AND hashed password='%s'", user1, hashedPassword));
+        executeNet(String.format("CREATE ROLE %s WITH login=true AND password='%s'", user2, plainTextPwd));
+
+        useUser(user1, plainTextPwd);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+
+        useUser(user2, plainTextPwd);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+
+        useSuperUser();
+
+        assertInvalidMessage("Options 'password' and 'hashed password' are mutually exclusive",
+                             String.format("ALTER ROLE %s WITH password='%s' AND hashed password='%s'",
+                                           user1, plainTextPwd2, hashedPassword2));
+        executeNet(String.format("ALTER ROLE %s WITH password='%s'", user1, plainTextPwd2));
+        executeNet(String.format("ALTER ROLE %s WITH hashed password='%s'", user2, hashedPassword2));
+
+        useUser(user1, plainTextPwd2);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+
+        useUser(user2, plainTextPwd2);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+    }
+
+    @Test
+    public void createAlterUserWithHashedPassword() throws Throwable
+    {
+        String user1 = "hashed_pw_user";
+        String user2 = "pw_user";
+        String plainTextPwd = "super_secret_thing";
+        String plainTextPwd2 = "much_safer_password";
+        String hashedPassword = hashpw(plainTextPwd, gensalt(4));
+        String hashedPassword2 = hashpw(plainTextPwd2, gensalt(4));
+
+        useSuperUser();
+
+        assertInvalidMessage("Invalid hashed password value",
+                             String.format("CREATE USER %s WITH hashed password '%s'",
+                                           user1, "this_is_an_invalid_hash"));
+        executeNet(String.format("CREATE USER %s WITH hashed password '%s'", user1, hashedPassword));
+        executeNet(String.format("CREATE USER %s WITH password '%s'",  user2, plainTextPwd));
+
+        useUser(user1, plainTextPwd);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+
+        useUser(user2, plainTextPwd);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+
+        useSuperUser();
+
+        executeNet(String.format("ALTER USER %s WITH password '%s'", user1, plainTextPwd2));
+        executeNet(String.format("ALTER USER %s WITH hashed password '%s'", user2, hashedPassword2));
+
+        useUser(user1, plainTextPwd2);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+
+        useUser(user2, plainTextPwd2);
+
+        executeNetWithAuthSpin("SELECT key FROM system.local");
+    }
+
+    /**
+     * Altering or creating auth may take some time to be effective
+     *
+     * @param query
+     */
+    void executeNetWithAuthSpin(String query)
+    {
+        Util.spinAssertEquals(true, () -> {
+            try
+            {
+                executeNet(query);
+                return true;
+            }
+            catch (Throwable e)
+            {
+                assertTrue("Unexpected exception: " + e, e instanceof AuthenticationException);
+                reinitializeNetwork();
+                return false;
+            }
+        }, 10);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/auth/FunctionResourceTest.java b/test/unit/org/apache/cassandra/auth/FunctionResourceTest.java
index 8da811d..fa4421b 100644
--- a/test/unit/org/apache/cassandra/auth/FunctionResourceTest.java
+++ b/test/unit/org/apache/cassandra/auth/FunctionResourceTest.java
@@ -111,7 +111,6 @@
         String expected = String.format("%s is not a valid function resource name. It must end with \"[]\"", invalidInput);
         assertThatExceptionOfType(IllegalArgumentException.class).isThrownBy(() -> FunctionResource.fromName(invalidInput))
                                                                  .withMessage(expected);
-        ;
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/auth/GrantAndRevokeTest.java b/test/unit/org/apache/cassandra/auth/GrantAndRevokeTest.java
new file mode 100644
index 0000000..5c1c2a0
--- /dev/null
+++ b/test/unit/org/apache/cassandra/auth/GrantAndRevokeTest.java
@@ -0,0 +1,388 @@
+/*
+ * 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.auth;
+
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.ResultSet;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.junit.Assert.assertTrue;
+
+public class GrantAndRevokeTest extends CQLTester
+{
+    private static final String user = "user";
+    private static final String pass = "12345";
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        DatabaseDescriptor.setPermissionsValidity(0);
+        CQLTester.setUpClass();
+        requireAuthentication();
+        requireNetwork();
+    }
+
+    @After
+    public void tearDown() throws Throwable
+    {
+        useSuperUser();
+        executeNet("DROP ROLE " + user);
+    }
+
+    @Test
+    public void testGrantedKeyspace() throws Throwable
+    {
+        useSuperUser();
+
+        executeNet(String.format("CREATE ROLE %s WITH LOGIN = TRUE AND password='%s'", user, pass));
+        executeNet("GRANT CREATE ON KEYSPACE " + KEYSPACE_PER_TEST + " TO " + user);
+        String table = KEYSPACE_PER_TEST + '.' + createTable(KEYSPACE_PER_TEST, "CREATE TABLE %s (pk int, ck int, val int, val_2 text, PRIMARY KEY (pk, ck))");
+        String index = KEYSPACE_PER_TEST + '.' + createIndex(KEYSPACE_PER_TEST, "CREATE INDEX ON %s (val_2)");
+        String type = KEYSPACE_PER_TEST + '.' + createType(KEYSPACE_PER_TEST, "CREATE TYPE %s (a int, b text)");
+        String mv = KEYSPACE_PER_TEST + ".ks_mv_01";
+        executeNet("CREATE MATERIALIZED VIEW " + mv + " AS SELECT * FROM " + table + " WHERE val IS NOT NULL AND pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (val, pk, ck)");
+
+        useUser(user, pass);
+
+        // ALTER and DROP tables created by somebody else
+        // Spin assert for effective auth changes.
+        final String spinAssertTable = table;
+        Util.spinAssertEquals(false, () -> {
+            try
+            {
+                assertUnauthorizedQuery("User user has no MODIFY permission on <table " + spinAssertTable + "> or any of its parents",
+                                        formatQuery(KEYSPACE_PER_TEST, "INSERT INTO %s (pk, ck, val, val_2) VALUES (1, 1, 1, '1')"));
+            }
+            catch(Throwable e)
+            {
+                return true;
+            }
+            return false;
+        }, 10);
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "UPDATE %s SET val = 1 WHERE pk = 1 AND ck = 1"));
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "DELETE FROM %s WHERE pk = 1 AND ck = 2"));
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "SELECT * FROM %s WHERE pk = 1 AND ck = 1"));
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                "SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "TRUNCATE TABLE %s"));
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE %s ADD val_3 int"));
+        assertUnauthorizedQuery("User user has no DROP permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "DROP TABLE %s"));
+        assertUnauthorizedQuery("User user has no ALTER permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "ALTER TYPE " + type + " ADD c bigint");
+        assertUnauthorizedQuery("User user has no DROP permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "DROP TYPE " + type);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP MATERIALIZED VIEW " + mv);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP INDEX " + index);
+
+
+        useSuperUser();
+
+        executeNet("GRANT ALTER, DROP, SELECT, MODIFY ON KEYSPACE " + KEYSPACE_PER_TEST + " TO " + user);
+
+        useUser(user, pass);
+
+        // Spin assert for effective auth changes.
+        Util.spinAssertEquals(false, () -> {
+            try
+            {
+                executeNet("ALTER KEYSPACE " + KEYSPACE_PER_TEST + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}");
+            }
+            catch(Throwable e)
+            {
+                return true;
+            }
+            return false;
+        }, 10);
+
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "INSERT INTO %s (pk, ck, val, val_2) VALUES (1, 1, 1, '1')"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "UPDATE %s SET val = 1 WHERE pk = 1 AND ck = 1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DELETE FROM %s WHERE pk = 1 AND ck = 2"));
+        assertRowsNet(executeNet(formatQuery(KEYSPACE_PER_TEST, "SELECT * FROM %s WHERE pk = 1 AND ck = 1")), row(1, 1, 1, "1"));
+        assertRowsNet(executeNet("SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1"), row(1, 1, 1, "1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "TRUNCATE TABLE %s"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE %s ADD val_3 int"));
+        executeNet("DROP MATERIALIZED VIEW " + mv);
+        executeNet("DROP INDEX " + index);
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DROP TABLE %s"));
+        executeNet("ALTER TYPE " + type + " ADD c bigint");
+        executeNet("DROP TYPE " + type);
+
+        // calling creatTableName to create a new table name that will be used by the formatQuery
+        table = createTableName();
+        type = KEYSPACE_PER_TEST + "." + createTypeName();
+        mv = KEYSPACE_PER_TEST + ".ks_mv_02";
+        executeNet("CREATE TYPE " + type + " (a int, b text)");
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "CREATE TABLE %s (pk int, ck int, val int, val_2 text, PRIMARY KEY (pk, ck))"));
+        executeNet("CREATE MATERIALIZED VIEW " + mv + " AS SELECT * FROM " + table + " WHERE val IS NOT NULL AND pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (val, pk, ck)");
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "INSERT INTO %s (pk, ck, val, val_2) VALUES (1, 1, 1, '1')"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "UPDATE %s SET val = 1 WHERE pk = 1 AND ck = 1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DELETE FROM %s WHERE pk = 1 AND ck = 2"));
+        assertRowsNet(executeNet(formatQuery(KEYSPACE_PER_TEST, "SELECT * FROM %s WHERE pk = 1 AND ck = 1")), row(1, 1, 1, "1"));
+        assertRowsNet(executeNet("SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1"), row(1, 1, 1, "1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "TRUNCATE TABLE %s"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE %s ADD val_3 int"));
+        executeNet("DROP MATERIALIZED VIEW " + mv);
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DROP TABLE %s"));
+        executeNet("ALTER TYPE " + type + " ADD c bigint");
+        executeNet("DROP TYPE " + type);
+
+        useSuperUser();
+
+        executeNet("REVOKE ALTER, DROP, MODIFY, SELECT ON KEYSPACE " + KEYSPACE_PER_TEST + " FROM " + user);
+
+        table = KEYSPACE_PER_TEST + "." + createTable(KEYSPACE_PER_TEST, "CREATE TABLE %s (pk int, ck int, val int, val_2 text, PRIMARY KEY (pk, ck))");
+        type = KEYSPACE_PER_TEST + "." + createType(KEYSPACE_PER_TEST, "CREATE TYPE %s (a int, b text)");
+        index = KEYSPACE_PER_TEST + '.' + createIndex(KEYSPACE_PER_TEST, "CREATE INDEX ON %s (val_2)");
+        mv = KEYSPACE_PER_TEST + ".ks_mv_03";
+        executeNet("CREATE MATERIALIZED VIEW " + mv + " AS SELECT * FROM " + table + " WHERE val IS NOT NULL AND pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (val, pk, ck)");
+
+        useUser(user, pass);
+
+        // Spin assert for effective auth changes.
+        final String spinAssertTable2 = table;
+        Util.spinAssertEquals(false, () -> {
+            try
+            {
+                assertUnauthorizedQuery("User user has no MODIFY permission on <table " + spinAssertTable2 + "> or any of its parents",
+                                        "INSERT INTO " + spinAssertTable2 + " (pk, ck, val, val_2) VALUES (1, 1, 1, '1')");
+            }
+            catch(Throwable e)
+            {
+                return true;
+            }
+            return false;
+        }, 10);
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                "UPDATE " + table + " SET val = 1 WHERE pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                "DELETE FROM " + table + " WHERE pk = 1 AND ck = 2");
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                "SELECT * FROM " + table + " WHERE pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                "SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                "TRUNCATE TABLE " + table);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE " + table + " ADD val_3 int"));
+        assertUnauthorizedQuery("User user has no DROP permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "DROP TABLE " + table));
+        assertUnauthorizedQuery("User user has no ALTER permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "ALTER TYPE " + type + " ADD c bigint");
+        assertUnauthorizedQuery("User user has no DROP permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "DROP TYPE " + type);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP MATERIALIZED VIEW " + mv);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP INDEX " + index);
+
+    }
+
+    @Test
+    public void testGrantedAllTables() throws Throwable
+    {
+        useSuperUser();
+
+        executeNet(String.format("CREATE ROLE %s WITH LOGIN = TRUE AND password='%s'", user, pass));
+        executeNet("GRANT CREATE ON ALL TABLES IN KEYSPACE " + KEYSPACE_PER_TEST + " TO " + user);
+        String table = KEYSPACE_PER_TEST + "." + createTable(KEYSPACE_PER_TEST, "CREATE TABLE %s (pk int, ck int, val int, val_2 text, PRIMARY KEY (pk, ck))");
+        String index = KEYSPACE_PER_TEST + '.' + createIndex(KEYSPACE_PER_TEST, "CREATE INDEX ON %s (val_2)");
+        String type = KEYSPACE_PER_TEST + "." + createType(KEYSPACE_PER_TEST, "CREATE TYPE %s (a int, b text)");
+        String mv = KEYSPACE_PER_TEST + ".alltables_mv_01";
+        executeNet("CREATE MATERIALIZED VIEW " + mv + " AS SELECT * FROM " + table + " WHERE val IS NOT NULL AND pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (val, pk, ck)");
+
+        useUser(user, pass);
+
+        // ALTER and DROP tables created by somebody else
+        // Spin assert for effective auth changes.
+        final String spinAssertTable = table;
+        Util.spinAssertEquals(false, () -> {
+            try
+            {
+                assertUnauthorizedQuery("User user has no MODIFY permission on <table " + spinAssertTable + "> or any of its parents",
+                                        formatQuery(KEYSPACE_PER_TEST, "INSERT INTO %s (pk, ck, val, val_2) VALUES (1, 1, 1, '1')"));
+            }
+            catch(Throwable e)
+            {
+                return true;
+            }
+            return false;
+        }, 10);
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "UPDATE %s SET val = 1 WHERE pk = 1 AND ck = 1"));
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "DELETE FROM %s WHERE pk = 1 AND ck = 2"));
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "SELECT * FROM %s WHERE pk = 1 AND ck = 1"));
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                "SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "TRUNCATE TABLE %s"));
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE %s ADD val_3 int"));
+        assertUnauthorizedQuery("User user has no DROP permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "DROP TABLE %s"));
+        assertUnauthorizedQuery("User user has no ALTER permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "ALTER TYPE " + type + " ADD c bigint");
+        assertUnauthorizedQuery("User user has no DROP permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "DROP TYPE " + type);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP MATERIALIZED VIEW " + mv);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP INDEX " + index);
+
+        useSuperUser();
+
+        executeNet("GRANT ALTER, DROP, SELECT, MODIFY ON ALL TABLES IN KEYSPACE " + KEYSPACE_PER_TEST + " TO " + user);
+
+        useUser(user, pass);
+
+        // Spin assert for effective auth changes.
+        Util.spinAssertEquals(false, () -> {
+            try
+            {
+                assertUnauthorizedQuery("User user has no ALTER permission on <keyspace " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                        "ALTER KEYSPACE " + KEYSPACE_PER_TEST + " WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}");
+            }
+            catch(Throwable e)
+            {
+                return true;
+            }
+            return false;
+        }, 10);
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "INSERT INTO %s (pk, ck, val, val_2) VALUES (1, 1, 1, '1')"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "UPDATE %s SET val = 1 WHERE pk = 1 AND ck = 1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DELETE FROM %s WHERE pk = 1 AND ck = 2"));
+        assertRowsNet(executeNet(formatQuery(KEYSPACE_PER_TEST, "SELECT * FROM %s WHERE pk = 1 AND ck = 1")), row(1, 1, 1, "1"));
+        assertRowsNet(executeNet("SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1"), row(1, 1, 1, "1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "TRUNCATE TABLE %s"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE %s ADD val_3 int"));
+        executeNet("DROP MATERIALIZED VIEW " + mv);
+        executeNet("DROP INDEX " + index);
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DROP TABLE %s"));
+        executeNet("ALTER TYPE " + type + " ADD c bigint");
+        executeNet("DROP TYPE " + type);
+
+        // calling creatTableName to create a new table name that will be used by the formatQuery
+        table = createTableName();
+        type = KEYSPACE_PER_TEST + "." + createTypeName();
+        mv = KEYSPACE_PER_TEST + ".alltables_mv_02";
+        executeNet("CREATE TYPE " + type + " (a int, b text)");
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "CREATE TABLE %s (pk int, ck int, val int, val_2 text, PRIMARY KEY (pk, ck))"));
+        index = KEYSPACE_PER_TEST + '.' + createIndex(KEYSPACE_PER_TEST, "CREATE INDEX ON %s (val_2)");
+        executeNet("CREATE MATERIALIZED VIEW " + mv + " AS SELECT * FROM " + table + " WHERE val IS NOT NULL AND pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (val, pk, ck)");
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "INSERT INTO %s (pk, ck, val, val_2) VALUES (1, 1, 1, '1')"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "UPDATE %s SET val = 1 WHERE pk = 1 AND ck = 1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DELETE FROM %s WHERE pk = 1 AND ck = 2"));
+        assertRowsNet(executeNet(formatQuery(KEYSPACE_PER_TEST, "SELECT * FROM %s WHERE pk = 1 AND ck = 1")), row(1, 1, 1, "1"));
+        assertRowsNet(executeNet("SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1"), row(1, 1, 1, "1"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "TRUNCATE TABLE %s"));
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE %s ADD val_3 int"));
+        executeNet("DROP MATERIALIZED VIEW " + mv);
+        executeNet("DROP INDEX " + index);
+        executeNet(formatQuery(KEYSPACE_PER_TEST, "DROP TABLE %s"));
+        executeNet("ALTER TYPE " + type + " ADD c bigint");
+        executeNet("DROP TYPE " + type);
+
+        useSuperUser();
+
+        executeNet("REVOKE ALTER, DROP, SELECT, MODIFY ON ALL TABLES IN KEYSPACE " + KEYSPACE_PER_TEST + " FROM " + user);
+
+        table = KEYSPACE_PER_TEST + "." + createTable(KEYSPACE_PER_TEST, "CREATE TABLE %s (pk int, ck int, val int, val_2 text, PRIMARY KEY (pk, ck))");
+        index = KEYSPACE_PER_TEST + '.' + createIndex(KEYSPACE_PER_TEST, "CREATE INDEX ON %s (val_2)");
+        type = KEYSPACE_PER_TEST + "." + createType(KEYSPACE_PER_TEST, "CREATE TYPE %s (a int, b text)");
+        mv = KEYSPACE_PER_TEST + ".alltables_mv_03";
+        executeNet("CREATE MATERIALIZED VIEW " + mv + " AS SELECT * FROM " + table + " WHERE val IS NOT NULL AND pk IS NOT NULL AND ck IS NOT NULL PRIMARY KEY (val, pk, ck)");
+
+        useUser(user, pass);
+
+        // Spin assert for effective auth changes.
+        final String spinAssertTable2 = table;
+        Util.spinAssertEquals(false, () -> {
+            try
+            {
+                assertUnauthorizedQuery("User user has no MODIFY permission on <table " + spinAssertTable2 + "> or any of its parents",
+                                        "INSERT INTO " + spinAssertTable2 + " (pk, ck, val, val_2) VALUES (1, 1, 1, '1')");
+            }
+            catch(Throwable e)
+            {
+                return true;
+            }
+            return false;
+        }, 10);
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                "UPDATE " + table + " SET val = 1 WHERE pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                "DELETE FROM " + table + " WHERE pk = 1 AND ck = 2");
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                "SELECT * FROM " + table + " WHERE pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no SELECT permission on <table " + table + "> or any of its parents",
+                                "SELECT * FROM " + mv + " WHERE val = 1 AND pk = 1 AND ck = 1");
+        assertUnauthorizedQuery("User user has no MODIFY permission on <table " + table + "> or any of its parents",
+                                "TRUNCATE TABLE " + table);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "ALTER TABLE " + table + " ADD val_3 int"));
+        assertUnauthorizedQuery("User user has no DROP permission on <table " + table + "> or any of its parents",
+                                formatQuery(KEYSPACE_PER_TEST, "DROP TABLE " + table));
+        assertUnauthorizedQuery("User user has no ALTER permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "ALTER TYPE " + type + " ADD c bigint");
+        assertUnauthorizedQuery("User user has no DROP permission on <all tables in " + KEYSPACE_PER_TEST + "> or any of its parents",
+                                "DROP TYPE " + type);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP MATERIALIZED VIEW " + mv);
+        assertUnauthorizedQuery("User user has no ALTER permission on <table " + table + "> or any of its parents",
+                                "DROP INDEX " + index);
+    }
+
+    @Test
+    public void testWarnings() throws Throwable
+    {
+        useSuperUser();
+
+        executeNet("CREATE KEYSPACE revoke_yeah WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}");
+        executeNet("CREATE TABLE revoke_yeah.t1 (id int PRIMARY KEY, val text)");
+        executeNet("CREATE USER '" + user + "' WITH PASSWORD '" + pass + "'");
+
+        ResultSet res = executeNet("REVOKE CREATE ON KEYSPACE revoke_yeah FROM " + user);
+        assertWarningsContain(res.getExecutionInfo().getWarnings(), "Role '" + user + "' was not granted CREATE on <keyspace revoke_yeah>");
+
+        res = executeNet("GRANT SELECT ON KEYSPACE revoke_yeah TO " + user);
+        assertTrue(res.getExecutionInfo().getWarnings().isEmpty());
+
+        res = executeNet("GRANT SELECT ON KEYSPACE revoke_yeah TO " + user);
+        assertWarningsContain(res.getExecutionInfo().getWarnings(), "Role '" + user + "' was already granted SELECT on <keyspace revoke_yeah>");
+
+        res = executeNet("REVOKE SELECT ON TABLE revoke_yeah.t1 FROM " + user);
+        assertWarningsContain(res.getExecutionInfo().getWarnings(), "Role '" + user + "' was not granted SELECT on <table revoke_yeah.t1>");
+
+        res = executeNet("REVOKE SELECT, MODIFY ON KEYSPACE revoke_yeah FROM " + user);
+        assertWarningsContain(res.getExecutionInfo().getWarnings(), "Role '" + user + "' was not granted MODIFY on <keyspace revoke_yeah>");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java b/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java
index 8cd74d8..e1033ff 100644
--- a/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java
+++ b/test/unit/org/apache/cassandra/auth/PasswordAuthenticatorTest.java
@@ -19,35 +19,58 @@
 
 
 import java.nio.charset.StandardCharsets;
+import java.util.Map;
 
-import com.google.common.collect.Iterables;
-import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.mindrot.jbcrypt.BCrypt;
+
 import com.datastax.driver.core.Authenticator;
 import com.datastax.driver.core.EndPoint;
 import com.datastax.driver.core.PlainTextAuthProvider;
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.exceptions.AuthenticationException;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
 
-import static org.apache.cassandra.auth.CassandraRoleManager.*;
-import static org.apache.cassandra.auth.PasswordAuthenticator.*;
+import static org.apache.cassandra.auth.AuthTestUtils.ALL_ROLES;
+import static org.apache.cassandra.auth.CassandraRoleManager.DEFAULT_SUPERUSER_PASSWORD;
+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.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.mindrot.jbcrypt.BCrypt.hashpw;
 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();
 
-    private static PasswordAuthenticator authenticator = new PasswordAuthenticator();
+    @BeforeClass
+    public static void setupClass() throws Exception
+    {
+        SchemaLoader.loadSchema();
+        DatabaseDescriptor.daemonInitialization();
+        StorageService.instance.initServer(0);
+    }
+
+    @Before
+    public void setup() throws Exception
+    {
+        ColumnFamilyStore.getIfExists(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLES).truncateBlocking();
+        ColumnFamilyStore.getIfExists(SchemaConstants.AUTH_KEYSPACE_NAME, AuthKeyspace.ROLE_MEMBERS).truncateBlocking();
+    }
 
     @Test
     public void testCheckpw()
@@ -112,7 +135,6 @@
         }
     }
 
-
     @Test(expected = AuthenticationException.class)
     public void testEmptyUsername()
     {
@@ -161,18 +183,28 @@
         negotiator.getAuthenticatedUser();
     }
 
-    @BeforeClass
-    public static void setUp()
+    @Test
+    public void warmCacheLoadsAllEntriesFromTables()
     {
-        SchemaLoader.createKeyspace(SchemaConstants.AUTH_KEYSPACE_NAME,
-                                    KeyspaceParams.simple(1),
-                                    Iterables.toArray(AuthKeyspace.metadata().tables, TableMetadata.class));
-        authenticator.setup();
+        IRoleManager roleManager = new AuthTestUtils.LocalCassandraRoleManager();
+        roleManager.setup();
+        for (RoleResource r : ALL_ROLES)
+        {
+            RoleOptions options = new RoleOptions();
+            options.setOption(IRoleManager.Option.PASSWORD, "hash_for_" + r.getRoleName());
+            roleManager.createRole(AuthenticatedUser.ANONYMOUS_USER, r, options);
+        }
+
+        Map<String, String> cacheEntries = authenticator.bulkLoader().get();
+
+        assertEquals(ALL_ROLES.length, cacheEntries.size());
+        cacheEntries.forEach((username, hash) -> assertTrue(BCrypt.checkpw("hash_for_" + username, hash)));
     }
 
-    @AfterClass
-    public static void tearDown()
+    @Test
+    public void warmCacheWithEmptyTable()
     {
-        schemaChange("DROP KEYSPACE " + SchemaConstants.AUTH_KEYSPACE_NAME);
+        Map<String, String> cacheEntries = authenticator.bulkLoader().get();
+        assertTrue(cacheEntries.isEmpty());
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/auth/ResourcesTest.java b/test/unit/org/apache/cassandra/auth/ResourcesTest.java
index bb279d9..ca4d3dc 100644
--- a/test/unit/org/apache/cassandra/auth/ResourcesTest.java
+++ b/test/unit/org/apache/cassandra/auth/ResourcesTest.java
@@ -50,6 +50,9 @@
         assertEquals(DataResource.keyspace("ks1"), Resources.fromName("data/ks1"));
         assertEquals("data/ks1", DataResource.keyspace("ks1").getName());
 
+        assertEquals(DataResource.allTables("ks1"), Resources.fromName("data/ks1/*"));
+        assertEquals("data/ks1/*", DataResource.allTables("ks1").getName());
+
         assertEquals(DataResource.table("ks1", "t1"), Resources.fromName("data/ks1/t1"));
         assertEquals("data/ks1/t1", DataResource.table("ks1", "t1").getName());
     }
diff --git a/test/unit/org/apache/cassandra/auth/RoleOptionsTest.java b/test/unit/org/apache/cassandra/auth/RoleOptionsTest.java
index 6dea2b5..8a224eb 100644
--- a/test/unit/org/apache/cassandra/auth/RoleOptionsTest.java
+++ b/test/unit/org/apache/cassandra/auth/RoleOptionsTest.java
@@ -52,10 +52,23 @@
         assertInvalidOptions(opts, "Invalid value for property 'SUPERUSER'. It must be a boolean");
 
         opts = new RoleOptions();
+        opts.setOption(IRoleManager.Option.HASHED_PASSWORD, 99);
+        assertInvalidOptions(opts, "Invalid value for property 'HASHED_PASSWORD'. It must be a string");
+
+        opts = new RoleOptions();
+        opts.setOption(IRoleManager.Option.HASHED_PASSWORD, "invalid_hash");
+        assertInvalidOptions(opts, "Invalid hashed password value. Please use jBcrypt.");
+
+        opts = new RoleOptions();
         opts.setOption(IRoleManager.Option.OPTIONS, false);
         assertInvalidOptions(opts, "Invalid value for property 'OPTIONS'. It must be a map");
 
         opts = new RoleOptions();
+        opts.setOption(IRoleManager.Option.PASSWORD, "abc");
+        opts.setOption(IRoleManager.Option.HASHED_PASSWORD, "$2a$10$JSJEMFm6GeaW9XxT5JIheuEtPvat6i7uKbnTcxX3c1wshIIsGyUtG");
+        assertInvalidOptions(opts, "Properties 'PASSWORD' and 'HASHED_PASSWORD' are mutually exclusive");
+
+        opts = new RoleOptions();
         opts.setOption(IRoleManager.Option.LOGIN, true);
         opts.setOption(IRoleManager.Option.SUPERUSER, false);
         opts.setOption(IRoleManager.Option.PASSWORD, "test");
@@ -111,7 +124,7 @@
         }
         catch (InvalidRequestException e)
         {
-            assertTrue(e.getMessage().equals(message));
+            assertEquals(message, e.getMessage());
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/auth/RoleTestUtils.java b/test/unit/org/apache/cassandra/auth/RoleTestUtils.java
deleted file mode 100644
index bcbdf83..0000000
--- a/test/unit/org/apache/cassandra/auth/RoleTestUtils.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.auth;
-
-import java.util.concurrent.Callable;
-
-import org.apache.cassandra.cql3.QueryOptions;
-import org.apache.cassandra.cql3.QueryProcessor;
-import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.cql3.statements.BatchStatement;
-import org.apache.cassandra.cql3.statements.SelectStatement;
-import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.exceptions.RequestExecutionException;
-import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.service.QueryState;
-import org.apache.cassandra.transport.messages.ResultMessage;
-
-
-public class RoleTestUtils
-{
-
-    public static final RoleResource ROLE_A = RoleResource.role("role_a");
-    public static final RoleResource ROLE_B = RoleResource.role("role_b");
-    public static final RoleResource ROLE_B_1 = RoleResource.role("role_b_1");
-    public static final RoleResource ROLE_B_2 = RoleResource.role("role_b_2");
-    public static final RoleResource ROLE_B_3 = RoleResource.role("role_b_3");
-    public static final RoleResource ROLE_C = RoleResource.role("role_c");
-    public static final RoleResource ROLE_C_1 = RoleResource.role("role_c_1");
-    public static final RoleResource ROLE_C_2 = RoleResource.role("role_c_2");
-    public static final RoleResource ROLE_C_3 = RoleResource.role("role_c_3");
-    public static final RoleResource[] ALL_ROLES  = new RoleResource[] {ROLE_A,
-                                                                        ROLE_B, ROLE_B_1, ROLE_B_2, ROLE_B_3,
-                                                                        ROLE_C, ROLE_C_1, ROLE_C_2, ROLE_C_3};
-    /**
-     * This just extends the internal IRoleManager implementation to ensure that
-     * all access to underlying tables is made via
-     * QueryProcessor.executeOnceInternal/CQLStatement.executeInternal and not
-     * StorageProxy so that it can be used in unit tests.
-     */
-    public static class LocalCassandraRoleManager extends CassandraRoleManager
-    {
-        @Override
-        ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
-        {
-            return statement.executeLocally(QueryState.forInternalCalls(), options);
-        }
-
-        @Override
-        UntypedResultSet process(String query, ConsistencyLevel consistencyLevel)
-        {
-            return QueryProcessor.executeInternal(query);
-        }
-
-        @Override
-        protected void scheduleSetupTask(final Callable<Void> setupTask)
-        {
-            // skip data migration or setting up default role for tests
-        }
-    }
-
-    public static class LocalCassandraAuthorizer extends CassandraAuthorizer
-    {
-        @Override
-        ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
-        {
-            return statement.executeLocally(QueryState.forInternalCalls(), options);
-        }
-
-        @Override
-        UntypedResultSet process(String query) throws RequestExecutionException
-        {
-            return QueryProcessor.executeInternal(query);
-        }
-
-        @Override
-        void processBatch(BatchStatement statement)
-        {
-            statement.executeLocally(QueryState.forInternalCalls(), QueryOptions.DEFAULT);
-        }
-    }
-
-    public static class LocalCassandraNetworkAuthorizer extends CassandraNetworkAuthorizer
-    {
-        @Override
-        ResultMessage.Rows select(SelectStatement statement, QueryOptions options)
-        {
-            return statement.executeLocally(QueryState.forInternalCalls(), options);
-        }
-
-        @Override
-        void process(String query)
-        {
-            QueryProcessor.executeInternal(query);
-        }
-    }
-
-    public static void grantRolesTo(IRoleManager roleManager, RoleResource grantee, RoleResource...granted)
-    {
-        for(RoleResource toGrant : granted)
-            roleManager.grantRole(AuthenticatedUser.ANONYMOUS_USER, toGrant, grantee);
-    }
-
-    public static long getReadCount()
-    {
-        ColumnFamilyStore rolesTable = Keyspace.open(SchemaConstants.AUTH_KEYSPACE_NAME).getColumnFamilyStore(AuthKeyspace.ROLES);
-        return rolesTable.metric.readLatency.latency.getCount();
-    }
-
-    public static RoleOptions getLoginRoleOptions()
-    {
-        RoleOptions roleOptions = new RoleOptions();
-        roleOptions.setOption(IRoleManager.Option.SUPERUSER, false);
-        roleOptions.setOption(IRoleManager.Option.LOGIN, true);
-        roleOptions.setOption(IRoleManager.Option.PASSWORD, "ignored");
-        return roleOptions;
-    }
-}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/auth/RolesTest.java b/test/unit/org/apache/cassandra/auth/RolesTest.java
index 94322a7..5eced33 100644
--- a/test/unit/org/apache/cassandra/auth/RolesTest.java
+++ b/test/unit/org/apache/cassandra/auth/RolesTest.java
@@ -21,15 +21,20 @@
 import java.util.Set;
 
 import com.google.common.collect.Iterables;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
 
-import static org.apache.cassandra.auth.RoleTestUtils.*;
+import static org.apache.cassandra.auth.AuthTestUtils.ALL_ROLES;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_C;
+import static org.apache.cassandra.auth.AuthTestUtils.getRolesReadCount;
+import static org.apache.cassandra.auth.AuthTestUtils.grantRolesTo;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -40,56 +45,75 @@
     public static void setupClass()
     {
         SchemaLoader.prepareServer();
-        // create the system_auth keyspace so the IRoleManager can function as normal
-        SchemaLoader.createKeyspace(SchemaConstants.AUTH_KEYSPACE_NAME,
-                                    KeyspaceParams.simple(1),
-                                    Iterables.toArray(AuthKeyspace.metadata().tables, TableMetadata.class));
+        IRoleManager roleManager = new AuthTestUtils.LocalCassandraRoleManager();
+        SchemaLoader.setupAuth(roleManager,
+                               new AuthTestUtils.LocalPasswordAuthenticator(),
+                               new AuthTestUtils.LocalCassandraAuthorizer(),
+                               new AuthTestUtils.LocalCassandraNetworkAuthorizer());
 
-        IRoleManager roleManager = new LocalCassandraRoleManager();
-        roleManager.setup();
-        Roles.initRolesCache(roleManager, () -> true);
         for (RoleResource role : ALL_ROLES)
             roleManager.createRole(AuthenticatedUser.ANONYMOUS_USER, role, new RoleOptions());
         grantRolesTo(roleManager, ROLE_A, ROLE_B, ROLE_C);
+
+        roleManager.setup();
+        AuthCacheService.initializeAndRegisterCaches();
     }
 
     @Test
     public void superuserStatusIsCached()
     {
         boolean hasSuper = Roles.hasSuperuserStatus(ROLE_A);
-        long count = getReadCount();
+        long count = getRolesReadCount();
 
         assertEquals(hasSuper, Roles.hasSuperuserStatus(ROLE_A));
-        assertEquals(count, getReadCount());
+        assertEquals(count, getRolesReadCount());
     }
 
     @Test
     public void loginPrivilegeIsCached()
     {
         boolean canLogin = Roles.canLogin(ROLE_A);
-        long count = getReadCount();
+        long count = getRolesReadCount();
 
         assertEquals(canLogin, Roles.canLogin(ROLE_A));
-        assertEquals(count, getReadCount());
+        assertEquals(count, getRolesReadCount());
     }
 
     @Test
     public void grantedRoleDetailsAreCached()
     {
         Iterable<Role> granted = Roles.getRoleDetails(ROLE_A);
-        long count = getReadCount();
+        long count = getRolesReadCount();
 
         assertTrue(Iterables.elementsEqual(granted, Roles.getRoleDetails(ROLE_A)));
-        assertEquals(count, getReadCount());
+        assertEquals(count, getRolesReadCount());
     }
 
     @Test
     public void grantedRoleResourcesAreCached()
     {
         Set<RoleResource> granted = Roles.getRoles(ROLE_A);
-        long count = getReadCount();
+        long count = getRolesReadCount();
 
         assertEquals(granted, Roles.getRoles(ROLE_A));
-        assertEquals(count, getReadCount());
+        assertEquals(count, getRolesReadCount());
+    }
+
+    @Test
+    public void confirmSuperUserConsistency()
+    {
+        // Confirm special treatment of superuser
+        ConsistencyLevel readLevel = CassandraRoleManager.consistencyForRoleRead(CassandraRoleManager.DEFAULT_SUPERUSER_NAME);
+        Assert.assertEquals(CassandraRoleManager.DEFAULT_SUPERUSER_CONSISTENCY_LEVEL, readLevel);
+
+        ConsistencyLevel writeLevel = CassandraRoleManager.consistencyForRoleWrite(CassandraRoleManager.DEFAULT_SUPERUSER_NAME);
+        Assert.assertEquals(CassandraRoleManager.DEFAULT_SUPERUSER_CONSISTENCY_LEVEL, writeLevel);
+
+        // Confirm standard config-based treatment of non
+        ConsistencyLevel nonPrivReadLevel = CassandraRoleManager.consistencyForRoleRead("non-privilaged");
+        Assert.assertEquals(nonPrivReadLevel, DatabaseDescriptor.getAuthReadConsistencyLevel());
+
+        ConsistencyLevel nonPrivWriteLevel = CassandraRoleManager.consistencyForRoleWrite("non-privilaged");
+        Assert.assertEquals(nonPrivWriteLevel, DatabaseDescriptor.getAuthWriteConsistencyLevel());
     }
 }
diff --git a/test/unit/org/apache/cassandra/auth/StubAuthorizer.java b/test/unit/org/apache/cassandra/auth/StubAuthorizer.java
index 8e0d141..e9f7d22 100644
--- a/test/unit/org/apache/cassandra/auth/StubAuthorizer.java
+++ b/test/unit/org/apache/cassandra/auth/StubAuthorizer.java
@@ -21,6 +21,8 @@
 import java.util.*;
 import java.util.stream.Collectors;
 
+import com.google.common.collect.Sets;
+
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.RequestExecutionException;
 import org.apache.cassandra.exceptions.RequestValidationException;
@@ -42,34 +44,36 @@
         return perms != null ? perms : Collections.emptySet();
     }
 
-    public void grant(AuthenticatedUser performer,
-                      Set<Permission> permissions,
-                      IResource resource,
-                      RoleResource grantee) throws RequestValidationException, RequestExecutionException
+    public Set<Permission> grant(AuthenticatedUser performer,
+                                 Set<Permission> permissions,
+                                 IResource resource,
+                                 RoleResource grantee) throws RequestValidationException, RequestExecutionException
     {
         Pair<String, IResource> key = Pair.create(grantee.getRoleName(), resource);
-        Set<Permission> perms = userPermissions.get(key);
-        if (null == perms)
-        {
-            perms = new HashSet<>();
-            userPermissions.put(key, perms);
-        }
-        perms.addAll(permissions);
+        Set<Permission> oldPermissions = userPermissions.computeIfAbsent(key, k -> Collections.emptySet());
+        Set<Permission> nonExisting = Sets.difference(permissions, oldPermissions);
+
+        if (!nonExisting.isEmpty())
+            userPermissions.put(key, Sets.union(oldPermissions, nonExisting));
+
+        return nonExisting;
     }
 
-    public void revoke(AuthenticatedUser performer,
-                       Set<Permission> permissions,
-                       IResource resource,
-                       RoleResource revokee) throws RequestValidationException, RequestExecutionException
+    public Set<Permission> revoke(AuthenticatedUser performer,
+                                  Set<Permission> permissions,
+                                  IResource resource,
+                                  RoleResource revokee) throws RequestValidationException, RequestExecutionException
     {
         Pair<String, IResource> key = Pair.create(revokee.getRoleName(), resource);
-        Set<Permission> perms = userPermissions.get(key);
-        if (null != perms)
-        {
-            perms.removeAll(permissions);
-            if (perms.isEmpty())
-                userPermissions.remove(key);
-        }
+        Set<Permission> oldPermissions = userPermissions.computeIfAbsent(key, k -> Collections.emptySet());
+        Set<Permission> existing = Sets.intersection(permissions, oldPermissions);
+
+        if (existing.isEmpty())
+            userPermissions.remove(key);
+        else
+            userPermissions.put(key, Sets.difference(oldPermissions, existing));
+
+        return existing;
     }
 
     public Set<PermissionDetails> list(AuthenticatedUser performer,
diff --git a/test/unit/org/apache/cassandra/batchlog/BatchlogManagerTest.java b/test/unit/org/apache/cassandra/batchlog/BatchlogManagerTest.java
index b86b0d3..1fb3735 100644
--- a/test/unit/org/apache/cassandra/batchlog/BatchlogManagerTest.java
+++ b/test/unit/org/apache/cassandra/batchlog/BatchlogManagerTest.java
@@ -51,10 +51,13 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.TimeUUID.Generator.atUnixMillis;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.*;
 
 public class BatchlogManagerTest
@@ -95,7 +98,7 @@
         TokenMetadata metadata = StorageService.instance.getTokenMetadata();
         InetAddressAndPort localhost = InetAddressAndPort.getByName("127.0.0.1");
         metadata.updateNormalToken(Util.token("A"), localhost);
-        metadata.updateHostId(UUIDGen.getTimeUUID(), localhost);
+        metadata.updateHostId(UUID.randomUUID(), localhost);
         Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).truncateBlocking();
     }
 
@@ -146,14 +149,14 @@
             }
 
             long timestamp = i < 50
-                           ? (System.currentTimeMillis() - BatchlogManager.getBatchlogTimeout())
-                           : (System.currentTimeMillis() + BatchlogManager.getBatchlogTimeout());
+                           ? (currentTimeMillis() - BatchlogManager.getBatchlogTimeout())
+                           : (currentTimeMillis() + BatchlogManager.getBatchlogTimeout());
 
-            BatchlogManager.store(Batch.createLocal(UUIDGen.getTimeUUID(timestamp, i), timestamp * 1000, mutations));
+            BatchlogManager.store(Batch.createLocal(atUnixMillis(timestamp, i), timestamp * 1000, mutations));
         }
 
         // Flush the batchlog to disk (see CASSANDRA-6822).
-        Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).forceBlockingFlush();
+        Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         assertEquals(100, BatchlogManager.instance.countAllBatches() - initialAllBatches);
         assertEquals(0, BatchlogManager.instance.getTotalBatchesReplayed() - initialReplayedBatches);
@@ -220,7 +223,7 @@
             List<Mutation> mutations = Lists.newArrayList(mutation1, mutation2);
 
             // Make sure it's ready to be replayed, so adjust the timestamp.
-            long timestamp = System.currentTimeMillis() - BatchlogManager.getBatchlogTimeout();
+            long timestamp = currentTimeMillis() - BatchlogManager.getBatchlogTimeout();
 
             if (i == 500)
                 SystemKeyspace.saveTruncationRecord(Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD2),
@@ -233,11 +236,11 @@
             else
                 timestamp--;
 
-            BatchlogManager.store(Batch.createLocal(UUIDGen.getTimeUUID(timestamp, i), FBUtilities.timestampMicros(), mutations));
+            BatchlogManager.store(Batch.createLocal(atUnixMillis(timestamp, i), FBUtilities.timestampMicros(), mutations));
         }
 
         // Flush the batchlog to disk (see CASSANDRA-6822).
-        Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).forceBlockingFlush();
+        Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         // Force batchlog replay and wait for it to complete.
         BatchlogManager.instance.startBatchlogReplay().get();
@@ -275,8 +278,8 @@
         long initialAllBatches = BatchlogManager.instance.countAllBatches();
         TableMetadata cfm = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD5).metadata();
 
-        long timestamp = (System.currentTimeMillis() - DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2) * 1000;
-        UUID uuid = UUIDGen.getTimeUUID();
+        long timestamp = (currentTimeMillis() - DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2) * 1000;
+        TimeUUID uuid = nextTimeUUID();
 
         // Add a batch with 10 mutations
         List<Mutation> mutations = new ArrayList<>(10);
@@ -307,8 +310,8 @@
         long initialAllBatches = BatchlogManager.instance.countAllBatches();
         TableMetadata cfm = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD5).metadata();
 
-        long timestamp = (System.currentTimeMillis() - DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2) * 1000;
-        UUID uuid = UUIDGen.getTimeUUID();
+        long timestamp = (currentTimeMillis() - DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2) * 1000;
+        TimeUUID uuid = nextTimeUUID();
 
         // Add a batch with 10 mutations
         List<Mutation> mutations = new ArrayList<>(10);
@@ -349,8 +352,8 @@
 
         TableMetadata cfm = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1).metadata();
 
-        long timestamp = (System.currentTimeMillis() - DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2) * 1000;
-        UUID uuid = UUIDGen.getTimeUUID();
+        long timestamp = (currentTimeMillis() - DatabaseDescriptor.getWriteRpcTimeout(MILLISECONDS) * 2) * 1000;
+        TimeUUID uuid = nextTimeUUID();
 
         // Add a batch with 10 mutations
         List<Mutation> mutations = new ArrayList<>(10);
@@ -365,7 +368,7 @@
         assertEquals(1, BatchlogManager.instance.countAllBatches() - initialAllBatches);
 
         // Flush the batchlog to disk (see CASSANDRA-6822).
-        Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).forceBlockingFlush();
+        Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES).forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         assertEquals(1, BatchlogManager.instance.countAllBatches() - initialAllBatches);
         assertEquals(0, BatchlogManager.instance.getTotalBatchesReplayed() - initialReplayedBatches);
diff --git a/test/unit/org/apache/cassandra/batchlog/BatchlogTest.java b/test/unit/org/apache/cassandra/batchlog/BatchlogTest.java
index 8fa4afc..194ae91 100644
--- a/test/unit/org/apache/cassandra/batchlog/BatchlogTest.java
+++ b/test/unit/org/apache/cassandra/batchlog/BatchlogTest.java
@@ -22,7 +22,6 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import java.util.UUID;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -40,9 +39,10 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 
 public class BatchlogTest
@@ -66,7 +66,7 @@
 
         long now = FBUtilities.timestampMicros();
         int version = MessagingService.current_version;
-        UUID uuid = UUIDGen.getTimeUUID();
+        TimeUUID uuid = nextTimeUUID();
 
         List<Mutation> mutations = new ArrayList<>(10);
         for (int i = 0; i < 10; i++)
diff --git a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java
index bb5129a..040409e 100644
--- a/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java
+++ b/test/unit/org/apache/cassandra/cache/AutoSavingCacheTest.java
@@ -34,6 +34,8 @@
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class AutoSavingCacheTest
 {
     private static final String KEYSPACE1 = "AutoSavingCacheTest1";
@@ -71,10 +73,10 @@
         for (int i = 0; i < 2; i++)
         {
             ColumnMetadata colDef = ColumnMetadata.regularColumn(cfs.metadata(), ByteBufferUtil.bytes("col1"), AsciiType.instance);
-            RowUpdateBuilder rowBuilder = new RowUpdateBuilder(cfs.metadata(), System.currentTimeMillis(), "key1");
+            RowUpdateBuilder rowBuilder = new RowUpdateBuilder(cfs.metadata(), currentTimeMillis(), "key1");
             rowBuilder.add(colDef, "val1");
             rowBuilder.build().apply();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         Assert.assertEquals(2, cfs.getLiveSSTables().size());
diff --git a/test/unit/org/apache/cassandra/cache/CacheProviderTest.java b/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
index 7ed8a60..8ec536b 100644
--- a/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
+++ b/test/unit/org/apache/cassandra/cache/CacheProviderTest.java
@@ -45,6 +45,7 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -80,7 +81,7 @@
 
     private CachedBTreePartition createPartition()
     {
-        PartitionUpdate update = new RowUpdateBuilder(cfm, System.currentTimeMillis(), "key1")
+        PartitionUpdate update = new RowUpdateBuilder(cfm, currentTimeMillis(), "key1")
                                  .add("col1", "val1")
                                  .buildUpdate();
 
@@ -113,12 +114,12 @@
 
     private void concurrentCase(final CachedBTreePartition partition, final ICache<MeasureableString, IRowCacheEntry> cache) throws InterruptedException
     {
-        final long startTime = System.currentTimeMillis() + 500;
+        final long startTime = currentTimeMillis() + 500;
         Runnable runnable = new Runnable()
         {
             public void run()
             {
-                while (System.currentTimeMillis() < startTime) {}
+                while (currentTimeMillis() < startTime) {}
                 for (int j = 0; j < 1000; j++)
                 {
                     cache.put(key1, partition);
@@ -133,7 +134,7 @@
         List<Thread> threads = new ArrayList<>(100);
         for (int i = 0; i < 100; i++)
         {
-            Thread thread = NamedThreadFactory.createThread(runnable);
+            Thread thread = NamedThreadFactory.createAnonymousThread(runnable);
             threads.add(thread);
             thread.start();
         }
diff --git a/test/unit/org/apache/cassandra/concurrent/AbstractExecutorPlusTest.java b/test/unit/org/apache/cassandra/concurrent/AbstractExecutorPlusTest.java
new file mode 100644
index 0000000..52650ad
--- /dev/null
+++ b/test/unit/org/apache/cassandra/concurrent/AbstractExecutorPlusTest.java
@@ -0,0 +1,202 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
+
+import org.junit.Assert;
+import org.junit.Ignore;
+
+import org.apache.cassandra.utils.Closeable;
+import org.apache.cassandra.utils.WithResources;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.Semaphore;
+
+import static org.apache.cassandra.utils.concurrent.Semaphore.newSemaphore;
+
+@Ignore
+public abstract class AbstractExecutorPlusTest
+{
+    interface Verify<V>
+    {
+        void test(V test) throws Throwable;
+    }
+
+    static <V> Verify<V> ignoreNull(Verify<V> verify)
+    {
+        return test -> { if (test != null) verify.test(test); };
+    }
+
+    public <E extends ExecutorPlus> void testPooled(Supplier<ExecutorBuilder<? extends E>> builders) throws Throwable
+    {
+        testSuccess(builders);
+        testFailure(builders);
+    }
+
+    public <E extends SequentialExecutorPlus> void testSequential(Supplier<ExecutorBuilder<? extends E>> builders) throws Throwable
+    {
+        testSuccess(builders);
+        testFailure(builders);
+        testAtLeastOnce(builders);
+    }
+
+    Runnable wrapSubmit(Runnable submit)
+    {
+        return submit;
+    }
+
+    public <E extends ExecutorPlus> void testSuccess(Supplier<ExecutorBuilder<? extends E>> builders) throws Throwable
+    {
+        testExecution(builders.get().build(), wrapSubmit(() -> {}), ignoreNull(Future::get));
+        testExecution(builders.get().build(), WithResources.none(), wrapSubmit(() -> {}), ignoreNull(Future::get));
+    }
+
+    public <E extends ExecutorPlus> void testFailure(Supplier<ExecutorBuilder<? extends E>> builders) throws Throwable
+    {
+        ExecutorBuilder<? extends E> builder = builders.get();
+        AtomicReference<Throwable> failure = new AtomicReference<>();
+        Thread.UncaughtExceptionHandler ueh = (thread, f) -> failure.set(f);
+        builder.withUncaughtExceptionHandler(ueh);
+        Verify<Future<?>> verify = f -> {
+            int c = 0;
+            while (f == null && failure.get() == null && c++ < 100000)
+                Thread.yield();
+            Assert.assertTrue(failure.get() instanceof OutOfMemoryError);
+            if (f != null)
+                Assert.assertTrue(f.cause() instanceof OutOfMemoryError);
+            failure.set(null);
+        };
+        Runnable submit = wrapSubmit(() -> { throw new OutOfMemoryError(); });
+        testExecution(builder.build(), submit, verify);
+        testExecution(builder.build(), WithResources.none(), submit, verify);
+        testFailGetWithResources(builder.build(), () -> { throw new OutOfMemoryError(); }, verify);
+        testFailCloseWithResources(builder.build(), () -> () -> { throw new OutOfMemoryError(); }, verify);
+    }
+
+    public <E extends SequentialExecutorPlus> void testAtLeastOnce(Supplier<ExecutorBuilder<? extends E>> builders) throws Throwable
+    {
+        ExecutorBuilder<? extends E> builder = builders.get();
+        AtomicReference<Throwable> failure = new AtomicReference<>();
+        Thread.UncaughtExceptionHandler ueh = (thread, f) -> failure.set(f);
+        builder.withUncaughtExceptionHandler(ueh);
+
+        SequentialExecutorPlus exec = builder.build();
+
+        Semaphore enter = newSemaphore(0);
+        Semaphore exit = newSemaphore(0);
+        Semaphore runAfter = newSemaphore(0);
+        SequentialExecutorPlus.AtLeastOnceTrigger trigger;
+        trigger = exec.atLeastOnceTrigger(() -> { enter.release(1); exit.acquireThrowUncheckedOnInterrupt(1); });
+
+        // check runAfter runs immediately
+        trigger.runAfter(() -> runAfter.release(1));
+        Assert.assertTrue(runAfter.tryAcquire(1, 1L, TimeUnit.SECONDS));
+
+        Assert.assertTrue(trigger.trigger());
+        enter.acquire(1);
+        Assert.assertTrue(trigger.trigger());
+        Assert.assertFalse(trigger.trigger());
+        trigger.runAfter(() -> runAfter.release(1));
+        Assert.assertFalse(runAfter.tryAcquire(1, 10L, TimeUnit.MILLISECONDS));
+        exit.release(1);
+        enter.acquire(1);
+        Assert.assertFalse(runAfter.tryAcquire(1, 10L, TimeUnit.MILLISECONDS));
+        Assert.assertTrue(trigger.trigger());
+        Assert.assertFalse(trigger.trigger());
+        exit.release(1);
+        Assert.assertTrue(runAfter.tryAcquire(1, 1L, TimeUnit.SECONDS));
+        exit.release(1);
+
+        trigger = exec.atLeastOnceTrigger(() -> { throw new OutOfMemoryError(); });
+        trigger.trigger();
+        trigger.sync();
+        Assert.assertTrue(failure.get() instanceof OutOfMemoryError);
+    }
+
+    void testExecution(ExecutorPlus e, WithResources withResources, Runnable submit, Verify<Future<?>> verify) throws Throwable
+    {
+        AtomicInteger i = new AtomicInteger();
+        e.execute(() -> { i.incrementAndGet(); return withResources.get(); } , () -> { i.incrementAndGet(); submit.run(); });
+        while (i.get() < 2) Thread.yield();
+        verify.test(null);
+        verify.test(e.submit(() -> { i.incrementAndGet(); return withResources.get(); }, () -> { i.incrementAndGet(); submit.run(); return null; }).await());
+        Assert.assertEquals(4, i.get());
+        verify.test(e.submit(() -> { i.incrementAndGet(); return withResources.get(); }, () -> { i.incrementAndGet(); submit.run(); }).await());
+        Assert.assertEquals(6, i.get());
+        verify.test(e.submit(() -> { i.incrementAndGet(); return withResources.get(); }, () -> { i.incrementAndGet(); submit.run(); }, null).await());
+        Assert.assertEquals(8, i.get());
+    }
+
+    void testExecution(ExecutorPlus e, Runnable submit, Verify<Future<?>> verify) throws Throwable
+    {
+        AtomicInteger i = new AtomicInteger();
+        e.execute(() -> { i.incrementAndGet(); submit.run(); });
+        while (i.get() < 1) Thread.yield();
+        verify.test(null);
+        e.maybeExecuteImmediately(() -> { i.incrementAndGet(); submit.run(); });
+        while (i.get() < 2) Thread.yield();
+        verify.test(null);
+        verify.test(e.submit(() -> { i.incrementAndGet(); submit.run(); return null; }).await());
+        Assert.assertEquals(3, i.get());
+        verify.test(e.submit(() -> { i.incrementAndGet(); submit.run(); }).await());
+        Assert.assertEquals(4, i.get());
+        verify.test(e.submit(() -> { i.incrementAndGet(); submit.run(); }, null).await());
+        Assert.assertEquals(5, i.get());
+    }
+
+    void testFailGetWithResources(ExecutorPlus e, WithResources withResources, Verify<Future<?>> verify) throws Throwable
+    {
+        AtomicInteger i = new AtomicInteger();
+        WithResources countingOnGetResources = () -> { i.incrementAndGet(); return withResources.get(); };
+        AtomicBoolean executed = new AtomicBoolean();
+        e.execute(countingOnGetResources, () -> executed.set(true));
+        while (i.get() < 1) Thread.yield();
+        verify.test(null);
+        Assert.assertFalse(executed.get());
+        verify.test(e.submit(countingOnGetResources, () -> { executed.set(true); return null; } ).await());
+        Assert.assertEquals(2, i.get());
+        Assert.assertFalse(executed.get());
+        verify.test(e.submit(countingOnGetResources, () -> { executed.set(true); }).await());
+        Assert.assertEquals(3, i.get());
+        Assert.assertFalse(executed.get());
+        verify.test(e.submit(countingOnGetResources, () -> { executed.set(true); }, null).await());
+        Assert.assertEquals(4, i.get());
+        Assert.assertFalse(executed.get());
+    }
+
+    void testFailCloseWithResources(ExecutorPlus e, WithResources withResources, Verify<Future<?>> verify) throws Throwable
+    {
+        AtomicInteger i = new AtomicInteger();
+        WithResources countingOnCloseResources = () -> { Closeable close = withResources.get(); return () -> { i.incrementAndGet(); close.close(); }; };
+        e.execute(countingOnCloseResources, i::incrementAndGet);
+        while (i.get() < 2) Thread.yield();
+        verify.test(null);
+        verify.test(e.submit(countingOnCloseResources, () -> { i.incrementAndGet(); return null; } ).await());
+        Assert.assertEquals(4, i.get());
+        verify.test(e.submit(countingOnCloseResources, () -> { i.incrementAndGet(); }).await());
+        Assert.assertEquals(6, i.get());
+        verify.test(e.submit(countingOnCloseResources, () -> { i.incrementAndGet(); }, null).await());
+        Assert.assertEquals(8, i.get());
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java b/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java
index 1aac470..c719d6b 100644
--- a/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java
+++ b/test/unit/org/apache/cassandra/concurrent/DebuggableScheduledThreadPoolExecutorTest.java
@@ -26,13 +26,18 @@
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.junit.Assert;
+
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 import org.apache.cassandra.service.StorageService;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
 public class DebuggableScheduledThreadPoolExecutorTest
 {
 
@@ -41,16 +46,20 @@
     @BeforeClass
     public static void startup() throws IOException
     {
-        //The DSTPE checks for if we are in the service shutdown hook so
-        //to test it we need to start C* internally.
-        service = new EmbeddedCassandraService();
-        service.start();
+        service = ServerTestUtils.startEmbeddedCassandraService();
+    }
+
+    @AfterClass
+    public static void tearDown()
+    {
+        if (service != null)
+            service.stop();
     }
 
     @Test
     public void testShutdown() throws ExecutionException, InterruptedException, IOException
     {
-        DebuggableScheduledThreadPoolExecutor testPool = new DebuggableScheduledThreadPoolExecutor("testpool");
+        ScheduledExecutorPlus testPool = executorFactory().scheduled("testpool");
 
         final AtomicInteger value = new AtomicInteger(0);
 
diff --git a/test/unit/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutorTest.java b/test/unit/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutorTest.java
index 43c0fdf..061957d 100644
--- a/test/unit/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutorTest.java
+++ b/test/unit/org/apache/cassandra/concurrent/DebuggableThreadPoolExecutorTest.java
@@ -21,18 +21,12 @@
  */
 
 
-import java.util.UUID;
-import java.util.concurrent.Callable;
-import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.RunnableFuture;
-import java.util.concurrent.TimeUnit;
+import java.lang.Thread.UncaughtExceptionHandler;
+import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.Supplier;
 
-import com.google.common.base.Throwables;
 import com.google.common.net.InetAddresses;
-import com.google.common.util.concurrent.ListenableFutureTask;
 import com.google.common.util.concurrent.Uninterruptibles;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -45,10 +39,15 @@
 import org.apache.cassandra.tracing.TraceStateImpl;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.FailingRunnable;
 import org.apache.cassandra.utils.WrappedRunnable;
-import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class DebuggableThreadPoolExecutorTest
 {
@@ -61,12 +60,7 @@
     @Test
     public void testSerialization()
     {
-        LinkedBlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>(1);
-        DebuggableThreadPoolExecutor executor = new DebuggableThreadPoolExecutor(1,
-                                                                                 Integer.MAX_VALUE,
-                                                                                 TimeUnit.MILLISECONDS,
-                                                                                 q,
-                                                                                 new NamedThreadFactory("TEST"));
+        ExecutorPlus executor = executorFactory().configureSequential("TEST").withQueueLimit(1).build();
         WrappedRunnable runnable = new WrappedRunnable()
         {
             public void runMayThrow() throws InterruptedException
@@ -74,22 +68,23 @@
                 Thread.sleep(50);
             }
         };
-        long start = System.nanoTime();
+        long start = nanoTime();
         for (int i = 0; i < 10; i++)
         {
             executor.execute(runnable);
         }
-        assert q.size() > 0 : q.size();
+        assert executor.getPendingTaskCount() > 0 : executor.getPendingTaskCount();
         while (executor.getCompletedTaskCount() < 10)
             continue;
-        long delta = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - start);
+        long delta = TimeUnit.NANOSECONDS.toMillis(nanoTime() - start);
         assert delta >= 9 * 50 : delta;
     }
 
     @Test
     public void testLocalStatePropagation()
     {
-        DebuggableThreadPoolExecutor executor = DebuggableThreadPoolExecutor.createWithFixedPoolSize("TEST", 1);
+        ExecutorPlus executor = executorFactory().localAware().sequential("TEST");
+        assertThat(executor).isInstanceOf(LocalAwareExecutorPlus.class);
         try
         {
             checkLocalStateIsPropagated(executor);
@@ -100,7 +95,22 @@
         }
     }
 
-    public static void checkLocalStateIsPropagated(LocalAwareExecutorService executor)
+    @Test
+    public void testNoLocalStatePropagation() throws InterruptedException
+    {
+        ExecutorPlus executor = executorFactory().sequential("TEST");
+        assertThat(executor).isNotInstanceOf(LocalAwareExecutorPlus.class);
+        try
+        {
+            checkLocalStateIsPropagated(executor);
+        }
+        finally
+        {
+            executor.shutdown();
+        }
+    }
+
+    public static void checkLocalStateIsPropagated(ExecutorPlus executor)
     {
         checkClientWarningsArePropagated(executor, () -> executor.execute(() -> ClientWarn.instance.warn("msg")));
         checkClientWarningsArePropagated(executor, () -> executor.submit(() -> ClientWarn.instance.warn("msg")));
@@ -119,9 +129,9 @@
         }));
     }
 
-    public static void checkClientWarningsArePropagated(LocalAwareExecutorService executor, Runnable schedulingTask) {
+    public static void checkClientWarningsArePropagated(ExecutorPlus executor, Runnable schedulingTask) {
         ClientWarn.instance.captureWarnings();
-        Assertions.assertThat(ClientWarn.instance.getWarnings()).isNullOrEmpty();
+        assertThat(ClientWarn.instance.getWarnings()).isNullOrEmpty();
 
         ClientWarn.instance.warn("msg0");
         long initCompletedTasks = executor.getCompletedTaskCount();
@@ -129,15 +139,18 @@
         while (executor.getCompletedTaskCount() == initCompletedTasks) Uninterruptibles.sleepUninterruptibly(10, MILLISECONDS);
         ClientWarn.instance.warn("msg1");
 
-        Assertions.assertThat(ClientWarn.instance.getWarnings()).containsExactlyInAnyOrder("msg0", "msg", "msg1");
+        if (executor instanceof LocalAwareExecutorPlus)
+            assertThat(ClientWarn.instance.getWarnings()).containsExactlyInAnyOrder("msg0", "msg", "msg1");
+        else
+            assertThat(ClientWarn.instance.getWarnings()).containsExactlyInAnyOrder("msg0", "msg1");
     }
 
-    public static void checkTracingIsPropagated(LocalAwareExecutorService executor, Runnable schedulingTask) {
+    public static void checkTracingIsPropagated(ExecutorPlus executor, Runnable schedulingTask) {
         ClientWarn.instance.captureWarnings();
-        Assertions.assertThat(ClientWarn.instance.getWarnings()).isNullOrEmpty();
+        assertThat(ClientWarn.instance.getWarnings()).isNullOrEmpty();
 
         ConcurrentLinkedQueue<String> q = new ConcurrentLinkedQueue<>();
-        Tracing.instance.set(new TraceState(FBUtilities.getLocalAddressAndPort(), UUID.randomUUID(), Tracing.TraceType.NONE)
+        Tracing.instance.set(new TraceState(FBUtilities.getLocalAddressAndPort(), nextTimeUUID(), Tracing.TraceType.NONE)
         {
             @Override
             protected void traceImpl(String message)
@@ -151,27 +164,30 @@
         while (executor.getCompletedTaskCount() == initCompletedTasks) Uninterruptibles.sleepUninterruptibly(10, MILLISECONDS);
         Tracing.trace("msg1");
 
-        Assertions.assertThat(q.toArray()).containsExactlyInAnyOrder("msg0", "msg", "msg1");
+        if (executor instanceof LocalAwareExecutorPlus)
+            assertThat(q.toArray()).containsExactlyInAnyOrder("msg0", "msg", "msg1");
+        else
+            assertThat(q.toArray()).containsExactlyInAnyOrder("msg0", "msg1");
     }
 
     @Test
     public void testExecuteFutureTaskWhileTracing()
     {
-        LinkedBlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>(1);
-        DebuggableThreadPoolExecutor executor = new DebuggableThreadPoolExecutor(1,
-                                                                                 Integer.MAX_VALUE,
-                                                                                 TimeUnit.MILLISECONDS,
-                                                                                 q,
-                                                                                 new NamedThreadFactory("TEST"));
+        SettableUncaughtExceptionHandler ueh = new SettableUncaughtExceptionHandler();
+        ExecutorPlus executor = executorFactory()
+                                .localAware()
+                                .configureSequential("TEST")
+                                .withUncaughtExceptionHandler(ueh)
+                                .withQueueLimit(1).build();
         Runnable test = () -> executor.execute(failingTask());
         try
         {
             // make sure the non-tracing case works
-            Throwable cause = catchUncaughtExceptions(test);
+            Throwable cause = catchUncaughtExceptions(ueh, test);
             Assert.assertEquals(DebuggingThrowsException.class, cause.getClass());
 
             // tracing should have the same semantics
-            cause = catchUncaughtExceptions(() -> withTracing(test));
+            cause = catchUncaughtExceptions(ueh, () -> withTracing(test));
             Assert.assertEquals(DebuggingThrowsException.class, cause.getClass());
         }
         finally
@@ -183,21 +199,20 @@
     @Test
     public void testSubmitFutureTaskWhileTracing()
     {
-        LinkedBlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>(1);
-        DebuggableThreadPoolExecutor executor = new DebuggableThreadPoolExecutor(1,
-                                                                                 Integer.MAX_VALUE,
-                                                                                 TimeUnit.MILLISECONDS,
-                                                                                 q,
-                                                                                 new NamedThreadFactory("TEST"));
+        SettableUncaughtExceptionHandler ueh = new SettableUncaughtExceptionHandler();
+        ExecutorPlus executor = executorFactory().localAware()
+                                                 .configureSequential("TEST")
+                                                 .withUncaughtExceptionHandler(ueh)
+                                                 .withQueueLimit(1).build();
         FailingRunnable test = () -> executor.submit(failingTask()).get();
         try
         {
             // make sure the non-tracing case works
-            Throwable cause = catchUncaughtExceptions(test);
+            Throwable cause = catchUncaughtExceptions(ueh, test);
             Assert.assertEquals(DebuggingThrowsException.class, cause.getClass());
 
             // tracing should have the same semantics
-            cause = catchUncaughtExceptions(() -> withTracing(test));
+            cause = catchUncaughtExceptions(ueh, () -> withTracing(test));
             Assert.assertEquals(DebuggingThrowsException.class, cause.getClass());
         }
         finally
@@ -210,17 +225,17 @@
     public void testSubmitWithResultFutureTaskWhileTracing()
     {
         LinkedBlockingQueue<Runnable> q = new LinkedBlockingQueue<Runnable>(1);
-        DebuggableThreadPoolExecutor executor = new DebuggableThreadPoolExecutor(1,
-                                                                                 Integer.MAX_VALUE,
-                                                                                 TimeUnit.MILLISECONDS,
-                                                                                 q,
-                                                                                 new NamedThreadFactory("TEST"));
+        SettableUncaughtExceptionHandler ueh = new SettableUncaughtExceptionHandler();
+        ExecutorPlus executor = executorFactory().localAware()
+                                                 .configureSequential("TEST")
+                                                 .withUncaughtExceptionHandler(ueh)
+                                                 .withQueueLimit(1).build();
         FailingRunnable test = () -> executor.submit(failingTask(), 42).get();
         try
         {
-            Throwable cause = catchUncaughtExceptions(test);
+            Throwable cause = catchUncaughtExceptions(ueh, test);
             Assert.assertEquals(DebuggingThrowsException.class, cause.getClass());
-            cause = catchUncaughtExceptions(() -> withTracing(test));
+            cause = catchUncaughtExceptions(ueh, () -> withTracing(test));
             Assert.assertEquals(DebuggingThrowsException.class, cause.getClass());
         }
         finally
@@ -233,7 +248,7 @@
     {
         TraceState state = Tracing.instance.get();
         try {
-            Tracing.instance.set(new TraceStateImpl(InetAddressAndPort.getByAddress(InetAddresses.forString("127.0.0.1")), UUID.randomUUID(), Tracing.TraceType.NONE));
+            Tracing.instance.set(new TraceStateImpl(InetAddressAndPort.getByAddress(InetAddresses.forString("127.0.0.1")), nextTimeUUID(), Tracing.TraceType.NONE));
             fn.run();
         }
         finally
@@ -242,14 +257,34 @@
         }
     }
 
-    private static Throwable catchUncaughtExceptions(Runnable fn)
+    private static class SettableUncaughtExceptionHandler implements UncaughtExceptionHandler
     {
-        Thread.UncaughtExceptionHandler defaultHandler = Thread.getDefaultUncaughtExceptionHandler();
+        volatile Supplier<UncaughtExceptionHandler> cur;
+
+        @Override
+        public void uncaughtException(Thread t, Throwable e)
+        {
+            cur.get().uncaughtException(t, e);
+        }
+
+        void set(Supplier<UncaughtExceptionHandler> set)
+        {
+            cur = set;
+        }
+
+        void clear()
+        {
+            cur = Thread::getDefaultUncaughtExceptionHandler;
+        }
+    }
+
+    private static Throwable catchUncaughtExceptions(SettableUncaughtExceptionHandler ueh, Runnable fn)
+    {
         try
         {
             AtomicReference<Throwable> ref = new AtomicReference<>(null);
             CountDownLatch latch = new CountDownLatch(1);
-            Thread.setDefaultUncaughtExceptionHandler((thread, cause) -> {
+            ueh.set(() -> (thread, cause) -> {
                 ref.set(cause);
                 latch.countDown();
             });
@@ -266,7 +301,7 @@
         }
         finally
         {
-            Thread.setDefaultUncaughtExceptionHandler(defaultHandler);
+            ueh.clear();
         }
     }
 
@@ -277,29 +312,10 @@
 
     private static RunnableFuture<String> failingTask()
     {
-        return ListenableFutureTask.create(DebuggableThreadPoolExecutorTest::failingFunction);
+        return new FutureTask<>(DebuggableThreadPoolExecutorTest::failingFunction);
     }
 
     private static final class DebuggingThrowsException extends RuntimeException {
 
     }
-
-    // REVIEWER : I know this is the same as WrappedRunnable, but that doesn't support lambda...
-    private interface FailingRunnable extends Runnable
-    {
-        void doRun() throws Throwable;
-
-        default void run()
-        {
-            try
-            {
-                doRun();
-            }
-            catch (Throwable t)
-            {
-                Throwables.throwIfUnchecked(t);
-                throw new RuntimeException(t);
-            }
-        }
-    }
 }
diff --git a/test/unit/org/apache/cassandra/concurrent/ExecutorPlusTest.java b/test/unit/org/apache/cassandra/concurrent/ExecutorPlusTest.java
new file mode 100644
index 0000000..08af142
--- /dev/null
+++ b/test/unit/org/apache/cassandra/concurrent/ExecutorPlusTest.java
@@ -0,0 +1,38 @@
+/*
+ * 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.concurrent;
+
+import org.junit.Test;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
+public class ExecutorPlusTest extends AbstractExecutorPlusTest
+{
+    @Test
+    public void testPooled() throws Throwable
+    {
+        testPooled(() -> executorFactory().configurePooled("test", 1));
+    }
+
+    @Test
+    public void testSequential() throws Throwable
+    {
+        testSequential(() -> executorFactory().configureSequential("test"));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/concurrent/InfiniteLoopExecutorTest.java b/test/unit/org/apache/cassandra/concurrent/InfiniteLoopExecutorTest.java
new file mode 100644
index 0000000..9ec702d
--- /dev/null
+++ b/test/unit/org/apache/cassandra/concurrent/InfiniteLoopExecutorTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.concurrent;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.apache.cassandra.concurrent.InfiniteLoopExecutor.Daemon.DAEMON;
+
+public class InfiniteLoopExecutorTest
+{
+    @Test
+    public void testShutdownNow() throws InterruptedException, ExecutionException, TimeoutException
+    {
+        Semaphore semaphore = new Semaphore(0);
+        InfiniteLoopExecutor e1 = new InfiniteLoopExecutor("test", ignore -> semaphore.acquire(1), DAEMON);
+        ExecutorService exec = Executors.newCachedThreadPool();
+        Future<?> f = exec.submit(() -> e1.awaitTermination(1L, TimeUnit.MINUTES));
+        e1.shutdownNow();
+        f.get(1L, TimeUnit.SECONDS);
+    }
+
+    @Test
+    public void testShutdown() throws InterruptedException, ExecutionException, TimeoutException
+    {
+        AtomicBoolean active = new AtomicBoolean(false);
+        Semaphore semaphore = new Semaphore(0);
+        InfiniteLoopExecutor e1 = new InfiniteLoopExecutor("test", ignore -> {
+            active.set(true);
+            semaphore.acquire(1);
+            active.set(false);
+            semaphore.release();
+        }, DAEMON);
+        ExecutorService exec = Executors.newCachedThreadPool();
+        Future<?> f = exec.submit(() -> e1.awaitTermination(1L, TimeUnit.MINUTES));
+        // do ten normal loops
+        for (int i = 0 ; i < 10 ; ++i)
+        {
+            semaphore.release();
+            semaphore.acquire();
+        }
+        // confirm we've re-entered the runnable
+        while (!active.get()) Thread.yield();
+        // then shutdown, and expect precisely one more
+        e1.shutdown();
+        try
+        {
+            f.get(10L, TimeUnit.MILLISECONDS);
+            Assert.fail();
+        }
+        catch (TimeoutException ignore)
+        {
+        }
+        semaphore.release();
+        f.get(1L, TimeUnit.SECONDS);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/concurrent/LocalAwareExecutorPlusTest.java b/test/unit/org/apache/cassandra/concurrent/LocalAwareExecutorPlusTest.java
new file mode 100644
index 0000000..f47046c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/concurrent/LocalAwareExecutorPlusTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.concurrent;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
+public class LocalAwareExecutorPlusTest extends AbstractExecutorPlusTest
+{
+    final ExecutorLocals locals = new ExecutorLocals(null, null);
+
+    @Test
+    public void testPooled() throws Throwable
+    {
+        locals.get();
+        testPooled(() -> executorFactory().localAware().configurePooled("test", 1));
+    }
+
+    @Test
+    public void testSequential() throws Throwable
+    {
+        locals.get();
+        testSequential(() -> executorFactory().localAware().configureSequential("test"));
+    }
+
+    @Override
+    Runnable wrapSubmit(Runnable submit)
+    {
+        return () -> {
+            Assert.assertEquals(locals, ExecutorLocals.current());
+            submit.run();
+        };
+    }
+}
diff --git a/test/unit/org/apache/cassandra/concurrent/SEPExecutorTest.java b/test/unit/org/apache/cassandra/concurrent/SEPExecutorTest.java
index 97e389c..7a682ed 100644
--- a/test/unit/org/apache/cassandra/concurrent/SEPExecutorTest.java
+++ b/test/unit/org/apache/cassandra/concurrent/SEPExecutorTest.java
@@ -39,6 +39,7 @@
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.MINUTES;
 import static org.apache.cassandra.concurrent.DebuggableThreadPoolExecutorTest.checkLocalStateIsPropagated;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class SEPExecutorTest
 {
@@ -96,7 +97,7 @@
         final AtomicInteger notifiedMaxPoolSize = new AtomicInteger();
 
         SharedExecutorPool sharedPool;
-        LocalAwareExecutorService executor;
+        LocalAwareExecutorPlus executor;
 
         Thread makeBusy;
         AtomicBoolean stayBusy;
@@ -141,7 +142,7 @@
             sharedPool.shutdownAndWait(1L, MINUTES);
         }
 
-        public LocalAwareExecutorService getExecutor()
+        public LocalAwareExecutorPlus getExecutor()
         {
             return executor;
         }
@@ -156,7 +157,7 @@
     public void changingMaxWorkersMeetsConcurrencyGoalsTest() throws InterruptedException, TimeoutException
     {
         BusyExecutor busyExecutor = new BusyExecutor("ChangingMaxWorkersMeetsConcurrencyGoalsTest", "resizetest");
-        LocalAwareExecutorService executor = busyExecutor.getExecutor();
+        LocalAwareExecutorPlus executor = busyExecutor.getExecutor();
 
         busyExecutor.start();
         try
@@ -188,12 +189,11 @@
         }
     }
 
-
     @Test
     public void stoppedWorkersProcessTasksWhenConcurrencyIncreases() throws InterruptedException
     {
         BusyExecutor busyExecutor = new BusyExecutor("StoppedWorkersProcessTasksWhenConcurrencyIncreases", "stoptest");
-        LocalAwareExecutorService executor = busyExecutor.getExecutor();
+        LocalAwareExecutorPlus executor = busyExecutor.getExecutor();
         busyExecutor.start();
         try
         {
@@ -258,7 +258,7 @@
         }
     }
 
-    void assertMaxTaskConcurrency(LocalAwareExecutorService executor, int concurrency) throws InterruptedException
+    void assertMaxTaskConcurrency(LocalAwareExecutorPlus executor, int concurrency) throws InterruptedException
     {
         executor.setMaximumPoolSize(concurrency);
 
@@ -277,7 +277,8 @@
         SharedExecutorPool sharedPool = new SharedExecutorPool("TestPool");
         try
         {
-            LocalAwareExecutorService executor = sharedPool.newExecutor(1, "TEST", "TEST");
+            LocalAwareExecutorPlus executor = sharedPool.newExecutor(1, "TEST", "TEST");
+            assertThat(executor).isInstanceOf(LocalAwareExecutorPlus.class);
             checkLocalStateIsPropagated(executor);
         }
         finally
diff --git a/test/unit/org/apache/cassandra/concurrent/WaitQueueTest.java b/test/unit/org/apache/cassandra/concurrent/WaitQueueTest.java
index ac2a9c0..a9049a9 100644
--- a/test/unit/org/apache/cassandra/concurrent/WaitQueueTest.java
+++ b/test/unit/org/apache/cassandra/concurrent/WaitQueueTest.java
@@ -29,6 +29,7 @@
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import static org.apache.cassandra.utils.concurrent.WaitQueue.newWaitQueue;
 import static org.junit.Assert.*;
 
 public class WaitQueueTest
@@ -37,14 +38,14 @@
     @Test
     public void testSerial() throws InterruptedException
     {
-        testSerial(new WaitQueue());
+        testSerial(newWaitQueue());
     }
     public void testSerial(final WaitQueue queue) throws InterruptedException
     {
         final AtomicInteger ready = new AtomicInteger();
         Thread[] ts = new Thread[4];
         for (int i = 0 ; i < ts.length ; i++)
-            ts[i] = NamedThreadFactory.createThread(new Runnable()
+            ts[i] = NamedThreadFactory.createAnonymousThread(new Runnable()
         {
             @Override
             public void run()
@@ -77,14 +78,14 @@
     @Test
     public void testCondition() throws InterruptedException
     {
-        testCondition(new WaitQueue());
+        testCondition(newWaitQueue());
     }
     public void testCondition(final WaitQueue queue) throws InterruptedException
     {
         final AtomicBoolean ready = new AtomicBoolean(false);
         final AtomicBoolean condition = new AtomicBoolean(false);
         final AtomicBoolean fail = new AtomicBoolean(false);
-        Thread t = NamedThreadFactory.createThread(new Runnable()
+        Thread t = NamedThreadFactory.createAnonymousThread(new Runnable()
         {
             @Override
             public void run()
diff --git a/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java b/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java
index 1086521..de6e0d2 100644
--- a/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java
+++ b/test/unit/org/apache/cassandra/config/CassandraRelevantPropertiesTest.java
@@ -142,4 +142,4 @@
             System.clearProperty(TEST_PROP.getKey());
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/config/ConfigCompatabilityTest.java b/test/unit/org/apache/cassandra/config/ConfigCompatabilityTest.java
new file mode 100644
index 0000000..8d1e5e2
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/ConfigCompatabilityTest.java
@@ -0,0 +1,435 @@
+/*
+ * 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.config;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.TreeSet;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import com.fasterxml.jackson.annotation.JsonValue;
+import com.fasterxml.jackson.core.JsonGenerator;
+import com.fasterxml.jackson.core.JsonParser;
+import com.fasterxml.jackson.core.TreeNode;
+import com.fasterxml.jackson.databind.DeserializationContext;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializerProvider;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.deser.std.StdDeserializer;
+import com.fasterxml.jackson.databind.node.TextNode;
+import com.fasterxml.jackson.databind.ser.std.StdSerializer;
+import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
+import org.yaml.snakeyaml.introspector.Property;
+
+/**
+ * To create the test files used by this class, run {@link org.apache.cassandra.distributed.upgrade.ConfigCompatabilityTestGenerate}.
+ */
+public class ConfigCompatabilityTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(ConfigCompatabilityTest.class);
+
+    public static final String TEST_DIR = "test/data/config";
+
+    // see CASSANDRA-11115
+    private static final Set<String> THRIFT = ImmutableSet.of("rpc_server_type",
+                                                              "rpc_port",
+                                                              "rpc_listen_backlog",
+                                                              "start_rpc",
+                                                              "thrift_max_message_length_in_mb",
+                                                              "rpc_max_threads",
+                                                              "rpc_min_threads",
+                                                              "rpc_recv_buff_size_in_bytes",
+                                                              "rpc_send_buff_size_in_bytes",
+                                                              "thrift_framed_transport_size_in_mb",
+                                                              "thrift_prepared_statements_cache_size_mb",
+                                                              "request_scheduler",
+                                                              "request_scheduler_id",
+                                                              "request_scheduler_options");
+    // see // CASSANDRA-16956
+    private static final Set<String> WINDOWS = ImmutableSet.of("windows_timer_interval");
+
+    private static final Set<String> REMOVED_IN_40 = ImmutableSet.<String>builder()
+                                                     .addAll(THRIFT)
+                                                     .addAll(WINDOWS) // windows was removed later, but support was dropped in 4.0
+                                                     .add("encryption_options") // CASSANDRA-10404
+                                                     .add("index_interval") // CASSANDRA-10671
+                                                     .add("streaming_socket_timeout_in_ms") // CASSANDRA-12229
+                                                     .build();
+
+    /**
+     * Not all converts make sense as backwards compatible as they use things like String to handle the conversion more
+     * generically.
+     */
+    private static final Set<Converters> IGNORED_CONVERTERS = EnumSet.of(Converters.SECONDS_CUSTOM_DURATION);
+
+    @Test
+    public void diff_3_0() throws IOException
+    {
+        diff(TEST_DIR + "/version=3.0.0-alpha1.yml", REMOVED_IN_40);
+    }
+
+    @Test
+    public void diff_3_11() throws IOException
+    {
+        diff(TEST_DIR + "/version=3.11.0.yml", REMOVED_IN_40);
+    }
+
+    @Test
+    public void diff_4_0() throws IOException
+    {
+        diff(TEST_DIR + "/version=4.0-alpha1.yml", ImmutableSet.<String>builder()
+                                                        .addAll(WINDOWS)
+                                                        .build());
+    }
+
+    private void diff(String original, Set<String> ignore) throws IOException
+    {
+        Class<Config> type = Config.class;
+        ClassTree previous = load(original);
+        Loader loader = Properties.defaultLoader();
+        Map<Class<?>, Map<String, Replacement>> replacements = Replacements.getNameReplacements(type);
+        Set<String> missing = new HashSet<>();
+        Set<String> errors = new HashSet<>();
+        diff(loader, replacements, previous, type, "", missing, errors);
+        missing = Sets.difference(missing, ignore);
+        StringBuilder msg = new StringBuilder();
+        if (!missing.isEmpty())
+            msg.append(String.format("Unable to find the following properties:\n%s", String.join("\n", new TreeSet<>(missing))));
+        if (!errors.isEmpty())
+        {
+            if (msg.length() > 0)
+                msg.append('\n');
+            msg.append(String.format("Errors detected:\n%s", String.join("\n", new TreeSet<>(errors))));
+        }
+        if (msg.length() > 0)
+            throw new AssertionError(msg);
+    }
+
+    private void diff(Loader loader, Map<Class<?>, Map<String, Replacement>> replacements, ClassTree previous, Class<?> type, String prefix, Set<String> missing, Set<String> errors)
+    {
+        Map<String, Replacement> replaces = replacements.getOrDefault(type, Collections.emptyMap());
+        Map<String, Property> properties = loader.getProperties(type);
+        Sets.SetView<String> missingInCurrent = Sets.difference(previous.properties.keySet(), properties.keySet());
+        Sets.SetView<String> inBoth = Sets.intersection(previous.properties.keySet(), properties.keySet());
+        for (String name : missingInCurrent)
+        {
+            Replacement replacement = replaces.get(name);
+            // can we find the property in @Replaces?
+            if (replacement == null)
+            {
+                missing.add(prefix + name);
+            }
+            else
+            {
+                // do types match?
+                Node node = previous.properties.get(name);
+                if (node instanceof Leaf && replacement.oldType != null)
+                    typeCheck(replacement.converter, toString(replacement.oldType), ((Leaf) node).type, name, errors);
+            }
+        }
+        for (String name : inBoth)
+        {
+            Property prop = properties.get(name);
+            Node node = previous.properties.get(name);
+            // do types match?
+            // if nested, look at sub-fields
+            if (node instanceof ClassTree)
+            {
+                // current is nested type
+                diff(loader, replacements, (ClassTree) node, prop.getType(), prefix + name + ".", missing, errors);
+            }
+            else
+            {
+                // current is flat type
+                Replacement replacement = replaces.get(name);
+                if (replacement != null && replacement.oldType != null)
+                {
+                    typeCheck(replacement.converter, toString(replacement.oldType), ((Leaf) node).type, name, errors);
+                }
+                else
+                {
+                    // previous is leaf, is current?
+                    Map<String, Property> children = Properties.isPrimitive(prop) || Properties.isCollection(prop) ? Collections.emptyMap() : loader.getProperties(prop.getType());
+                    if (!children.isEmpty())
+                        errors.add(String.format("Property %s used to be a value-type, but now is nested type %s", name, prop.getType()));
+                    typeCheck(null, toString(prop.getType()), ((Leaf) node).type, name, errors);
+                }
+            }
+        }
+    }
+
+    private static void typeCheck(Converters converters, String lhs, String rhs, String name, Set<String> errors)
+    {
+        if (IGNORED_CONVERTERS.contains(converters))
+            return;
+        if (!lhs.equals(rhs))
+            errors.add(String.format("%s types do not match; %s != %s%s", name, lhs, rhs, converters != null ? ", converter " + converters.name() : ""));
+    }
+
+    private static ClassTree load(String path) throws IOException
+    {
+        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+        return mapper.readValue(new File(path), ClassTree.class);
+    }
+
+    public static void dump(ClassTree classTree, String path) throws IOException
+    {
+        logger.info("Dumping class to {}", path);
+        ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+        mapper.writeValue(new File(path), classTree);
+
+        // validate that load works as expected
+        ClassTree loaded = load(path);
+        assert loaded.equals(classTree);
+    }
+
+    public static ClassTree toTree(Class<?> klass)
+    {
+        ClassTree node = new ClassTree(klass);
+        addProperties(Properties.defaultLoader(), node, klass);
+        return node;
+    }
+
+    private static void addProperties(Loader loader, ClassTree node, Class<?> type)
+    {
+        SortedMap<String, Property> properties = new TreeMap<>(loader.getProperties(type));
+        for (Map.Entry<String, Property> e : properties.entrySet())
+        {
+            Property property = e.getValue();
+            Map<String, Property> subProperties = Properties.isPrimitive(property) || Properties.isCollection(property) ? Collections.emptyMap() : loader.getProperties(property.getType());
+            Node child;
+            if (subProperties.isEmpty())
+            {
+                child = new Leaf(toString(property.getType()));
+            }
+            else
+            {
+                ClassTree subTree = new ClassTree(property.getType());
+                addProperties(loader, subTree, property.getType());
+                child = subTree;
+            }
+            node.addProperty(e.getKey(), child);
+        }
+    }
+
+    private static String toString(Class<?> type)
+    {
+        return normalize(type).getCanonicalName();
+    }
+
+    private static Class<?> normalize(Class<?> type)
+    {
+        // convert primitives to Number, allowing null in the doamin
+        // this means that switching between int to Integer, and Integer to int are seen as the same while diffing; null
+        // added/removed from domain is ignored by diff
+        if (type.equals(Byte.TYPE))
+            return Byte.class;
+        else if (type.equals(Short.TYPE))
+            return Short.class;
+        else if (type.equals(Integer.TYPE))
+            return Integer.class;
+        else if (type.equals(Long.TYPE))
+            return Long.class;
+        else if (type.equals(Float.TYPE))
+            return Float.class;
+        else if (type.equals(Double.TYPE))
+            return Double.class;
+        else if (type.equals(Boolean.TYPE))
+            return Boolean.class;
+        else if (type.isArray())
+            return List.class;
+        return type;
+    }
+
+    @JsonSerialize(using = NodeSerializer.class)
+    @JsonDeserialize(using = NodeDeserializer.class)
+    private interface Node
+    {
+
+    }
+
+    private static final class NodeSerializer extends StdSerializer<Node>
+    {
+        NodeSerializer()
+        {
+            super(Node.class);
+        }
+
+        @Override
+        public void serialize(Node node, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException
+        {
+            if (node instanceof Leaf)
+            {
+                jsonGenerator.writeString(((Leaf) node).type);
+            }
+            else if (node instanceof ClassTree)
+            {
+                ClassTree classTree = (ClassTree) node;
+                jsonGenerator.writeStartObject();
+                for (Map.Entry<String, Node> e : classTree.properties.entrySet())
+                    jsonGenerator.writeObjectField(e.getKey(), e.getValue());
+                jsonGenerator.writeEndObject();
+            }
+        }
+    }
+
+    private static final class NodeDeserializer extends StdDeserializer<Node>
+    {
+
+        protected NodeDeserializer()
+        {
+            super(Node.class);
+        }
+
+        @Override
+        public Node deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException
+        {
+            return toNode(jsonParser.getCodec().readTree(jsonParser));
+        }
+
+        private static Node toNode(TreeNode node)
+        {
+            if (node.isValueNode())
+                return new Leaf(((TextNode) node).textValue());
+            Map<String, Node> props = new HashMap<>();
+            Iterator<String> it = node.fieldNames();
+            while (it.hasNext())
+            {
+                String name = it.next();
+                Node value = toNode(node.get(name));
+                Node previous = props.put(name, value);
+                if (previous != null)
+                    throw new AssertionError("Duplicate properties found: " + name);
+            }
+            ClassTree classTree = new ClassTree();
+            classTree.setProperties(props);
+            return classTree;
+        }
+    }
+
+    private static class ClassTree implements Node
+    {
+        private Class<?> type = null;
+        private Map<String, Node> properties = new HashMap<>();
+
+        ClassTree()
+        {
+
+        }
+
+        ClassTree(Class<?> type)
+        {
+            this.type = type;
+        }
+
+        public Map<String, Node> getProperties()
+        {
+            return properties;
+        }
+
+        public void setProperties(Map<String, Node> properties)
+        {
+            this.properties = properties;
+        }
+
+        public void addProperty(String key, Node node)
+        {
+            Node previous = properties.put(key, node);
+            if (previous != null)
+                throw new AssertionError("Duplicate property name: " + key);
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            ClassTree classTree = (ClassTree) o;
+            return Objects.equals(properties, classTree.properties);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hash(properties);
+        }
+
+        @Override
+        public String toString()
+        {
+            return "Klass{" +
+                   "type=" + type +
+                   ", properties=" + properties +
+                   '}';
+        }
+    }
+
+    private static class Leaf implements Node
+    {
+        private final String type;
+
+        public Leaf(String type)
+        {
+            this.type = type;
+        }
+
+        @JsonValue
+        public String getType()
+        {
+            return type;
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Leaf leaf = (Leaf) o;
+            return Objects.equals(type, leaf.type);
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hash(type);
+        }
+
+        @Override
+        public String toString()
+        {
+            return type;
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/config/DataRateSpecTest.java b/test/unit/org/apache/cassandra/config/DataRateSpecTest.java
new file mode 100644
index 0000000..be0973e
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/DataRateSpecTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.config;
+
+import org.junit.Test;
+
+import org.quicktheories.core.Gen;
+import org.quicktheories.generators.SourceDSL;
+
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.*;
+import static org.quicktheories.QuickTheory.qt;
+
+public class DataRateSpecTest
+{
+    @Test
+    public void testConversions()
+    {
+        assertEquals(10, new DataRateSpec.LongBytesPerSecondBound("10B/s").toBytesPerSecond(), 0);
+        assertEquals(10240, new DataRateSpec.LongBytesPerSecondBound("10KiB/s").toBytesPerSecond(), 0);
+        assertEquals(0, new DataRateSpec.LongBytesPerSecondBound("10KiB/s").toMebibytesPerSecond(), 0.1);
+        assertEquals(10240, new DataRateSpec.LongBytesPerSecondBound("10MiB/s").toKibibytesPerSecond(), 0);
+        assertEquals(10485760, new DataRateSpec.LongBytesPerSecondBound("10MiB/s").toBytesPerSecond(), 0);
+        assertEquals(10, new DataRateSpec.LongBytesPerSecondBound("10MiB/s").toMebibytesPerSecond(), 0);
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound("25000000B/s").toString(), DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(200L).toString());
+    }
+
+    @Test
+    public void testOverflowingDuringConversion()
+    {
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound(Long.MAX_VALUE + "B/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: " +
+                              "9223372036854775807B/s. It shouldn't be " +
+                              "more than 9223372036854775806 in bytes_per_second");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("9007199254740992KiB/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: " +
+                              "9007199254740992KiB/s. It shouldn't be " +
+                              "more than 9223372036854775806 in bytes_per_second");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("8796093022208MiB/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: " +
+                              "8796093022208MiB/s. It shouldn't be " +
+                              "more than 9223372036854775806 in bytes_per_second");
+
+        assertEquals(Integer.MAX_VALUE, new DataRateSpec.LongBytesPerSecondBound(Integer.MAX_VALUE + "MiB/s").toMegabitsPerSecondAsInt());
+        assertEquals(Integer.MAX_VALUE, new DataRateSpec.LongBytesPerSecondBound(2147483649L + "KiB/s").toKibibytesPerSecondAsInt());
+        assertEquals(Integer.MAX_VALUE, new DataRateSpec.LongBytesPerSecondBound(2147483649L / 1024L + "MiB/s").toKibibytesPerSecondAsInt());
+        assertEquals(Integer.MAX_VALUE, new DataRateSpec.LongBytesPerSecondBound(2147483649L + "MiB/s").toMebibytesPerSecondAsInt());
+
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound(Long.MAX_VALUE + "MiB/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 9223372036854775807MiB/s. " +
+                              "It shouldn't be more than 9223372036854775806 in bytes_per_second");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound(Long.MAX_VALUE))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 9.223372036854776E18 bytes_per_second. " +
+                              "It shouldn't be more than 9223372036854775806 in bytes_per_second");
+
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("9007199254740992KiB/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 9007199254740992KiB/s. " +
+                              "It shouldn't be more than 9223372036854775806 in bytes_per_second");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("8796093022208MiB/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 8796093022208MiB/s. " +
+                                                                                                                                                    "It shouldn't be more than 9223372036854775806 in bytes_per_second");
+        assertThatThrownBy(() -> DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(Integer.MAX_VALUE))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 2147483647 megabits per second; " +
+                                                                                                                                                  "stream_throughput_outbound and " +
+                                                                                                                                                  "inter_dc_stream_throughput_outbound should " +
+                                                                                                                                                  "be between 0 and 2147483646 in megabits per second");
+    }
+
+    @Test
+    public void testFromSymbol()
+    {
+        assertEquals(DataRateSpec.DataRateUnit.fromSymbol("B/s"), DataRateSpec.DataRateUnit.BYTES_PER_SECOND);
+        assertEquals(DataRateSpec.DataRateUnit.fromSymbol("KiB/s"), DataRateSpec.DataRateUnit.KIBIBYTES_PER_SECOND);
+        assertEquals(DataRateSpec.DataRateUnit.fromSymbol("MiB/s"), DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND);
+        assertThatThrownBy(() -> DataRateSpec.DataRateUnit.fromSymbol("n"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Unsupported data rate unit: n");
+    }
+
+    @Test
+    public void testInvalidInputs()
+    {
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("10")).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid data rate: 10");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("-10b/s")).isInstanceOf(IllegalArgumentException.class)
+                                                                                    .hasMessageContaining("Invalid data rate: -10b/s");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound(-10, DataRateSpec.DataRateUnit.BYTES_PER_SECOND))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: value must be non-negative");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("10xb/s")).isInstanceOf(IllegalArgumentException.class)
+                                                                                    .hasMessageContaining("Invalid data rate: 10xb/s");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("9223372036854775809B/s")
+                                 .toBytesPerSecond()).isInstanceOf(NumberFormatException.class)
+                                                     .hasMessageContaining("For input string: \"9223372036854775809\"");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("9223372036854775809KiB/s")
+                                 .toBytesPerSecond()).isInstanceOf(NumberFormatException.class)
+                                                     .hasMessageContaining("For input string: \"9223372036854775809\"");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound("9223372036854775809MiB/s")
+                                 .toBytesPerSecond()).isInstanceOf(NumberFormatException.class)
+                                                     .hasMessageContaining("For input string: \"9223372036854775809\"");
+    }
+
+    @Test
+    public void testInvalidForConversion()
+    {
+        //just test the cast to Int as currently we don't even have any long bound rates and there is a very low probability of ever having them
+        assertEquals(Integer.MAX_VALUE, new DataRateSpec.LongBytesPerSecondBound("92233720368547758B/s").toBytesPerSecondAsInt());
+
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound(Long.MAX_VALUE + "B/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 9223372036854775807B/s. " +
+                              "It shouldn't be more than 9223372036854775806 in bytes_per_second");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound(Long.MAX_VALUE + "MiB/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 9223372036854775807MiB/s. " +
+                              "It shouldn't be more than 9223372036854775806 in bytes_per_second");
+        assertThatThrownBy(() -> new DataRateSpec.LongBytesPerSecondBound(Long.MAX_VALUE - 5 + "KiB/s"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Invalid data rate: 9223372036854775802KiB/s. " +
+                              "It shouldn't be more than 9223372036854775806 in bytes_per_second");
+    }
+
+    @Test
+    public void testValidUnits()
+    {
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound("25000000B/s"), DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(200));
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound("24MiB/s"), new DataRateSpec.LongBytesPerSecondBound("25165824B/s"));
+    }
+
+    @Test
+    public void testEquals()
+    {
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound("10B/s"), new DataRateSpec.LongBytesPerSecondBound("10B/s"));
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound("10KiB/s"), new DataRateSpec.LongBytesPerSecondBound("10240B/s"));
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound("10240B/s"), new DataRateSpec.LongBytesPerSecondBound("10KiB/s"));
+        assertNotEquals(new DataRateSpec.LongBytesPerSecondBound("0KiB/s"), new DataRateSpec.LongBytesPerSecondBound("10MiB/s"));
+    }
+
+    @Test
+    public void thereAndBackLongBytesPerSecondBound()
+    {
+        Gen<DataRateSpec.DataRateUnit> unitGen = SourceDSL.arbitrary().enumValues(DataRateSpec.DataRateUnit.class);
+        Gen<Long> valueGen = SourceDSL.longs().between(0, 8796093022207L); // the biggest value in MiB/s that won't lead to B/s overflow
+        qt().forAll(valueGen, unitGen).check((value, unit) -> {
+            DataRateSpec.LongBytesPerSecondBound there = new DataRateSpec.LongBytesPerSecondBound(value, unit);
+            DataRateSpec.LongBytesPerSecondBound back = new DataRateSpec.LongBytesPerSecondBound(there.toString());
+            return there.equals(back) && back.equals(there);
+        });
+    }
+
+    @Test
+    public void testToString()
+    {
+        DataRateSpec testProperty = new DataRateSpec.LongBytesPerSecondBound("5B/s");
+        assertEquals("5B/s", testProperty.toString());
+    }
+
+    @Test
+    public void eq()
+    {
+        qt().forAll(gen(), gen()).check((a, b) -> a.equals(b) == b.equals(a));
+    }
+
+    @Test
+    public void eqAndHash()
+    {
+        qt().forAll(gen(), gen()).check((a, b) -> !a.equals(b) || a.hashCode() == b.hashCode());
+    }
+
+    private static Gen<DataRateSpec> gen()
+    {
+        Gen<DataRateSpec.DataRateUnit> unitGen = SourceDSL.arbitrary().enumValues(DataRateSpec.DataRateUnit.class);
+        Gen<Long> valueGen = SourceDSL.longs().between(0, Long.MAX_VALUE/1024L/1024/1024);
+        Gen<DataRateSpec> gen = rs -> new DataRateSpec.LongBytesPerSecondBound(valueGen.generate(rs), unitGen.generate(rs));
+        return gen.describedAs(DataRateSpec::toString);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/DataStorageSpecTest.java b/test/unit/org/apache/cassandra/config/DataStorageSpecTest.java
new file mode 100644
index 0000000..334e33f
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/DataStorageSpecTest.java
@@ -0,0 +1,269 @@
+/*
+ * 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.config;
+
+import java.util.Locale;
+
+import org.junit.Test;
+
+import org.quicktheories.core.Gen;
+import org.quicktheories.generators.SourceDSL;
+
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.BYTES;
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.GIBIBYTES;
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.*;
+import static org.quicktheories.QuickTheory.qt;
+
+public class DataStorageSpecTest
+{
+    private static final long MAX_LONG_CONFIG_VALUE = Long.MAX_VALUE - 1;
+    @Test
+    public void testConversions()
+    {
+        assertEquals(10, new DataStorageSpec.LongBytesBound("10B").toBytes());
+        assertEquals(10240, new DataStorageSpec.LongBytesBound("10KiB").toBytes());
+        assertEquals(10485760, new DataStorageSpec.LongBytesBound("10MiB").toBytes());
+        assertEquals(1073741824, new DataStorageSpec.LongBytesBound("1GiB").toBytes());
+
+        assertEquals(1024, new DataStorageSpec.LongMebibytesBound("1GiB").toMebibytes());
+        assertEquals(10485760, new DataStorageSpec.LongMebibytesBound("10MiB").toBytes());
+        assertEquals(10240, new DataStorageSpec.LongMebibytesBound("10MiB").toKibibytes());
+        assertEquals(1024 * 1024 * 1024, new DataStorageSpec.IntBytesBound("1GiB").toBytes());
+        assertEquals(10240, new DataStorageSpec.IntKibibytesBound("10MiB").toKibibytes());
+        assertEquals(1024, new DataStorageSpec.IntMebibytesBound("1GiB").toMebibytes());
+
+        assertEquals(10, new DataStorageSpec.LongBytesBound(10, BYTES).toBytes());
+        assertEquals(10240, new DataStorageSpec.LongBytesBound(10, KIBIBYTES).toBytes());
+        assertEquals(10485760, new DataStorageSpec.LongBytesBound(10, MEBIBYTES).toBytes());
+        assertEquals(1073741824, new DataStorageSpec.LongBytesBound(1, GIBIBYTES).toBytes());
+
+        assertEquals(1024, new DataStorageSpec.LongMebibytesBound(1, GIBIBYTES).toMebibytes());
+        assertEquals(1024 * 1024, new DataStorageSpec.LongMebibytesBound(1, GIBIBYTES).toKibibytes());
+        assertEquals(10485760, new DataStorageSpec.LongMebibytesBound(10, MEBIBYTES).toBytes());
+        assertEquals(10240, new DataStorageSpec.IntKibibytesBound(10, MEBIBYTES).toKibibytes());
+        assertEquals(1024, new DataStorageSpec.IntMebibytesBound(1, GIBIBYTES).toMebibytes());
+    }
+
+    @Test
+    public void testOverflowingConversion()
+    {
+        assertThatThrownBy(() -> new DataStorageSpec.IntBytesBound("2147483648B")).isInstanceOf(IllegalArgumentException.class)
+                                                                                  .hasMessageContaining("Invalid data storage: 2147483648B. " +
+                                                                                                        "It shouldn't be more than 2147483646 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntBytesBound(2147483648L)).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid data storage: 2147483648 bytes. " +
+                                                                                                      "It shouldn't be more than 2147483646 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntBytesBound("2147483648KiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                    .hasMessageContaining("Invalid data storage: 2147483648KiB. " +
+                                                                                                          "It shouldn't be more than 2147483646 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntBytesBound("35791395MiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                  .hasMessageContaining("Invalid data storage: 35791395MiB. " +
+                                                                                                        "It shouldn't be more than 2147483646 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntBytesBound("34954GiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid data storage: 34954GiB. " +
+                                                                                                     "It shouldn't be more than 2147483646 in bytes");
+
+        assertThatThrownBy(() -> new DataStorageSpec.IntKibibytesBound("2147483648B")).isInstanceOf(IllegalArgumentException.class)
+                                                                                      .hasMessageContaining("Invalid data storage: 2147483648B " +
+                                                                                                            "Accepted units:[KIBIBYTES, MEBIBYTES, GIBIBYTES]");
+        assertThatThrownBy(() -> new DataStorageSpec.IntKibibytesBound(2147483648L, BYTES)).isInstanceOf(IllegalArgumentException.class)
+                                                                                           .hasMessageContaining("Invalid data storage: 2147483648B " +
+                                                                                                                 "Accepted units:[KIBIBYTES, MEBIBYTES, GIBIBYTES]");
+        assertThatThrownBy(() -> new DataStorageSpec.IntKibibytesBound("2147483648KiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                        .hasMessageContaining("Invalid data storage: 2147483648KiB. " +
+                                                                                                              "It shouldn't be more than 2147483646 in kibibytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntKibibytesBound("35791395MiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                      .hasMessageContaining("Invalid data storage: 35791395MiB. " +
+                                                                                                            "It shouldn't be more than 2147483646 in kibibytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntKibibytesBound("34954GiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                   .hasMessageContaining("Invalid data storage: 34954GiB. " +
+                                                                                                         "It shouldn't be more than 2147483646 in kibibytes");
+
+        assertThatThrownBy(() -> new DataStorageSpec.IntMebibytesBound("2147483648B")).isInstanceOf(IllegalArgumentException.class)
+                                                                                      .hasMessageContaining("Invalid data storage: 2147483648B " +
+                                                                                                            "Accepted units:[MEBIBYTES, GIBIBYTES]");
+        assertThatThrownBy(() -> new DataStorageSpec.IntMebibytesBound("2147483648MiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                        .hasMessageContaining("Invalid data storage: 2147483648MiB. " +
+                                                                                                              "It shouldn't be more than 2147483646 in mebibytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntMebibytesBound(2147483648L, MEBIBYTES)).isInstanceOf(IllegalArgumentException.class)
+                                                                                               .hasMessageContaining("Invalid data storage: 2147483648 mebibytes. " +
+                                                                                                                     "It shouldn't be more than 2147483646 in mebibytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntMebibytesBound("2097152GiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                     .hasMessageContaining("Invalid data storage: 2097152GiB. " +
+                                                                                                           "It shouldn't be more than 2147483646 in mebibytes");
+        assertThatThrownBy(() -> new DataStorageSpec.IntMebibytesBound(2147483648L)).isInstanceOf(IllegalArgumentException.class)
+                                                                                    .hasMessageContaining("Invalid data storage: 2147483648 mebibytes." +
+                                                                                                          " It shouldn't be more than 2147483646 in mebibytes");
+
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE + "B")).isInstanceOf(IllegalArgumentException.class)
+                                                                                          .hasMessageContaining("Invalid data storage: 9223372036854775807B. " +
+                                                                                                                "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE, BYTES)).isInstanceOf(IllegalArgumentException.class)
+                                                                                           .hasMessageContaining("Invalid data storage: 9223372036854775807 bytes. " +
+                                                                                                                 "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE)).isInstanceOf(IllegalArgumentException.class)
+                                                                                    .hasMessageContaining("Invalid data storage: 9223372036854775807 bytes. " +
+                                                                                                          "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE + "KiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                            .hasMessageContaining("Invalid data storage: 9223372036854775807KiB. " +
+                                                                                                                  "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound("9223372036854775MiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                  .hasMessageContaining("Invalid data storage: 9223372036854775MiB. " +
+                                                                                                        "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound("9223372036854775GiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                           .hasMessageContaining("Invalid data storage: 9223372036854775GiB. " +
+                                                                                                                 "It shouldn't be more than 9223372036854775806 in bytes");
+
+        assertThatThrownBy(() -> new DataStorageSpec.LongMebibytesBound(Long.MAX_VALUE + "B")).isInstanceOf(IllegalArgumentException.class)
+                                                                                              .hasMessageContaining("Invalid data storage: 9223372036854775807B " +
+                                                                                                                    "Accepted units:[MEBIBYTES, GIBIBYTES]");
+        assertThatThrownBy(() -> new DataStorageSpec.LongMebibytesBound(Long.MAX_VALUE, BYTES)).isInstanceOf(IllegalArgumentException.class)
+                                                                                              .hasMessageContaining("Invalid data storage: 9223372036854775807B " +
+                                                                                                                    "Accepted units:[MEBIBYTES, GIBIBYTES]");
+        assertThatThrownBy(() -> new DataStorageSpec.LongMebibytesBound(Long.MAX_VALUE + "KiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                                .hasMessageContaining("Invalid data storage: 9223372036854775807KiB " +
+                                                                                                                      "Accepted units:[MEBIBYTES, GIBIBYTES]");
+        assertThatThrownBy(() -> new DataStorageSpec.LongMebibytesBound(Long.MAX_VALUE + "MiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                                .hasMessageContaining("Invalid data storage: 9223372036854775807MiB. " +
+                                                                                                                      "It shouldn't be more than 9223372036854775806 in mebibytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongMebibytesBound("9223372036854775555GiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                                  .hasMessageContaining("Invalid data storage: 9223372036854775555GiB. " +
+                                                                                                                        "It shouldn't be more than 9223372036854775806 in mebibytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongMebibytesBound(Long.MAX_VALUE)).isInstanceOf(IllegalArgumentException.class)
+                                                                                        .hasMessageContaining("Invalid data storage: 9223372036854775807 mebibytes." +
+                                                                                                              " It shouldn't be more than 9223372036854775806 in mebibytes");
+    }
+
+    @Test
+    public void testFromSymbol()
+    {
+        assertEquals(DataStorageSpec.DataStorageUnit.fromSymbol("B"), BYTES);
+        assertEquals(DataStorageSpec.DataStorageUnit.fromSymbol("KiB"), DataStorageSpec.DataStorageUnit.KIBIBYTES);
+        assertEquals(DataStorageSpec.DataStorageUnit.fromSymbol("MiB"), DataStorageSpec.DataStorageUnit.MEBIBYTES);
+        assertEquals(DataStorageSpec.DataStorageUnit.fromSymbol("GiB"), DataStorageSpec.DataStorageUnit.GIBIBYTES);
+        assertThatThrownBy(() -> DataStorageSpec.DataStorageUnit.fromSymbol("n"))
+        .isInstanceOf(IllegalArgumentException.class)
+        .hasMessageContaining("Unsupported data storage unit: n");
+    }
+
+    @Test
+    public void testInvalidInputs()
+    {
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound("10")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid data storage: 10");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound("-10bps")).isInstanceOf(IllegalArgumentException.class)
+                                                                              .hasMessageContaining("Invalid data storage: -10bps");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound("-10b")).isInstanceOf(IllegalArgumentException.class)
+                                                                            .hasMessageContaining("Invalid data storage: -10b");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(-10, BYTES)).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid data storage: value must be non-negative");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound("10HG")).isInstanceOf(IllegalArgumentException.class)
+                                                                            .hasMessageContaining("Invalid data storage: 10HG");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound("9223372036854775809B")
+                                 .toBytes()).isInstanceOf(NumberFormatException.class)
+                                            .hasMessageContaining("For input string: \"9223372036854775809\"");
+
+        assertThatThrownBy(() -> new DataStorageSpec.IntKibibytesBound("10B")).isInstanceOf(IllegalArgumentException.class)
+                                                                              .hasMessageContaining("Invalid data storage: 10B Accepted units");
+        assertThatThrownBy(() -> new DataStorageSpec.IntMebibytesBound("10B")).isInstanceOf(IllegalArgumentException.class)
+                                                                              .hasMessageContaining("Invalid data storage: 10B Accepted units");
+
+        assertThatThrownBy(() -> new DataStorageSpec.LongMebibytesBound("10B")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid data storage: 10B Accepted units");
+    }
+
+    @Test
+    public void testValidUnits()
+    {
+        assertEquals(10240L, new DataStorageSpec.IntBytesBound("10KiB").toBytes());
+        assertEquals(10L, new DataStorageSpec.IntKibibytesBound("10KiB").toKibibytes());
+        assertEquals(10L, new DataStorageSpec.IntMebibytesBound("10MiB").toMebibytes());
+    }
+
+    @Test
+    public void testInvalidForConversion()
+    {
+       //just test the cast to Int
+//        assertEquals(Integer.MAX_VALUE, new DataStorageSpec.LongBytesBound("9223372036854775806B").toBytesAsInt());
+
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE + "B")).isInstanceOf(IllegalArgumentException.class)
+                                                                                          .hasMessageContaining("Invalid data storage: 9223372036854775807B. " +
+                                                                                                                "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE + "KiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                            .hasMessageContaining("Invalid data storage: 9223372036854775807KiB. " +
+                                                                                                                  "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE-5L + "MiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                               .hasMessageContaining("Invalid data storage: 9223372036854775802MiB. " +
+                                                                                                                     "It shouldn't be more than 9223372036854775806 in bytes");
+        assertThatThrownBy(() -> new DataStorageSpec.LongBytesBound(Long.MAX_VALUE-5L + "GiB")).isInstanceOf(IllegalArgumentException.class)
+                                                                                               .hasMessageContaining("Invalid data storage: 9223372036854775802GiB. " +
+                                                                                                                     "It shouldn't be more than 9223372036854775806 in bytes");
+    }
+
+    @Test
+    public void testEquals()
+    {
+        assertEquals(new DataStorageSpec.LongBytesBound("10B"), new DataStorageSpec.LongBytesBound("10B"));
+
+        assertEquals(new DataStorageSpec.LongBytesBound.LongBytesBound("10KiB"), new DataStorageSpec.LongBytesBound.LongBytesBound("10240B"));
+        assertEquals(new DataStorageSpec.LongBytesBound.LongBytesBound("10240B"), new DataStorageSpec.LongBytesBound("10KiB"));
+
+        assertEquals(new DataStorageSpec.LongBytesBound("10MiB"), new DataStorageSpec.LongBytesBound("10240KiB"));
+        assertEquals(new DataStorageSpec.LongBytesBound("10240KiB"), new DataStorageSpec.LongBytesBound("10MiB"));
+
+        assertEquals(new DataStorageSpec.LongBytesBound("10GiB"), new DataStorageSpec.LongBytesBound("10240MiB"));
+        assertEquals(new DataStorageSpec.LongBytesBound("10240MiB"), new DataStorageSpec.LongBytesBound("10GiB"));
+
+        assertEquals(new DataStorageSpec.LongBytesBound(MAX_LONG_CONFIG_VALUE, BYTES), new DataStorageSpec.LongBytesBound(MAX_LONG_CONFIG_VALUE, BYTES));
+
+        assertNotEquals(new DataStorageSpec.LongBytesBound("0MiB"), new DataStorageSpec.LongBytesBound("10KiB"));
+    }
+
+    @Test
+    public void thereAndBackLongBytesBound()
+    {
+        qt().forAll(gen()).check(there -> {
+            DataStorageSpec.LongBytesBound back = new DataStorageSpec.LongBytesBound(there.toString());
+            DataStorageSpec.LongBytesBound BACK = new DataStorageSpec.LongBytesBound(there.toString().toUpperCase(Locale.ROOT).replace("I", "i"));
+            return there.equals(back) && there.equals(BACK);
+        });
+    }
+
+    @Test
+    public void eq()
+    {
+        qt().forAll(gen(), gen()).check((a, b) -> a.equals(b) == b.equals(a));
+    }
+
+    @Test
+    public void eqAndHash()
+    {
+        qt().forAll(gen(), gen()).check((a, b) -> !a.equals(b) || a.hashCode() == b.hashCode());
+    }
+
+    private static Gen<DataStorageSpec.LongBytesBound> gen()
+    {
+        Gen<DataStorageSpec.LongBytesBound.DataStorageUnit> unitGen = SourceDSL.arbitrary().enumValues(DataStorageSpec.LongBytesBound.DataStorageUnit.class);
+        Gen<Long> valueGen = SourceDSL.longs().between(0, Long.MAX_VALUE/1024L/1024/1024); // max in GiB we can have without overflowing
+        Gen<DataStorageSpec.LongBytesBound> gen = rs -> new DataStorageSpec.LongBytesBound(valueGen.generate(rs), unitGen.generate(rs));
+        return gen.describedAs(DataStorageSpec.LongBytesBound::toString);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java
index a832679..3ee05cf 100644
--- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java
+++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorRefTest.java
@@ -37,6 +37,7 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import com.google.common.base.Throwables;
 import org.junit.Test;
 
 import org.apache.cassandra.utils.Pair;
@@ -60,12 +61,16 @@
     "org.apache.cassandra.audit.BinLogAuditLogger",
     "org.apache.cassandra.audit.IAuditLogger",
     "org.apache.cassandra.auth.AllowAllInternodeAuthenticator",
+    "org.apache.cassandra.auth.AuthCache$BulkLoader",
+    "org.apache.cassandra.auth.Cacheable",
     "org.apache.cassandra.auth.IInternodeAuthenticator",
     "org.apache.cassandra.auth.IAuthenticator",
     "org.apache.cassandra.auth.IAuthorizer",
     "org.apache.cassandra.auth.IRoleManager",
     "org.apache.cassandra.auth.INetworkAuthorizer",
     "org.apache.cassandra.config.DatabaseDescriptor",
+    "org.apache.cassandra.config.CassandraRelevantProperties",
+    "org.apache.cassandra.config.CassandraRelevantProperties$PropertyConverter",
     "org.apache.cassandra.config.ConfigurationLoader",
     "org.apache.cassandra.config.Config",
     "org.apache.cassandra.config.Config$1",
@@ -77,22 +82,56 @@
     "org.apache.cassandra.config.Config$FlushCompression",
     "org.apache.cassandra.config.Config$InternodeCompression",
     "org.apache.cassandra.config.Config$MemtableAllocationType",
+    "org.apache.cassandra.config.Config$PaxosOnLinearizabilityViolation",
+    "org.apache.cassandra.config.Config$PaxosStatePurging",
+    "org.apache.cassandra.config.Config$PaxosVariant",
     "org.apache.cassandra.config.Config$RepairCommandPoolFullStrategy",
     "org.apache.cassandra.config.Config$UserFunctionTimeoutPolicy",
     "org.apache.cassandra.config.Config$CorruptedTombstoneStrategy",
     "org.apache.cassandra.config.DatabaseDescriptor$ByteUnit",
-    "org.apache.cassandra.config.ParameterizedClass",
+    "org.apache.cassandra.config.DataRateSpec",
+    "org.apache.cassandra.config.DataRateSpec$DataRateUnit",
+    "org.apache.cassandra.config.DataRateSpec$DataRateUnit$1",
+    "org.apache.cassandra.config.DataRateSpec$DataRateUnit$2",
+    "org.apache.cassandra.config.DataRateSpec$DataRateUnit$3",
+    "org.apache.cassandra.config.DataStorageSpec",
+    "org.apache.cassandra.config.DataStorageSpec$DataStorageUnit",
+    "org.apache.cassandra.config.DataStorageSpec$DataStorageUnit$1",
+    "org.apache.cassandra.config.DataStorageSpec$DataStorageUnit$2",
+    "org.apache.cassandra.config.DataStorageSpec$DataStorageUnit$3",
+    "org.apache.cassandra.config.DataStorageSpec$DataStorageUnit$4",
+    "org.apache.cassandra.config.DataStorageSpec$IntBytesBound",
+    "org.apache.cassandra.config.DataStorageSpec$IntKibibytesBound",
+    "org.apache.cassandra.config.DataStorageSpec$IntMebibytesBound",
+    "org.apache.cassandra.config.DataStorageSpec$LongBytesBound",
+    "org.apache.cassandra.config.DataStorageSpec$LongMebibytesBound",
+    "org.apache.cassandra.config.DurationSpec",
+    "org.apache.cassandra.config.DataRateSpec$LongBytesPerSecondBound",
+    "org.apache.cassandra.config.DurationSpec$LongMillisecondsBound",
+    "org.apache.cassandra.config.DurationSpec$LongNanosecondsBound",
+    "org.apache.cassandra.config.DurationSpec$LongSecondsBound",
+    "org.apache.cassandra.config.DurationSpec$IntMillisecondsBound",
+    "org.apache.cassandra.config.DurationSpec$IntSecondsBound",
+    "org.apache.cassandra.config.DurationSpec$IntMinutesBound",
     "org.apache.cassandra.config.EncryptionOptions",
     "org.apache.cassandra.config.EncryptionOptions$ClientEncryptionOptions",
     "org.apache.cassandra.config.EncryptionOptions$ServerEncryptionOptions",
     "org.apache.cassandra.config.EncryptionOptions$ServerEncryptionOptions$InternodeEncryption",
     "org.apache.cassandra.config.EncryptionOptions$ServerEncryptionOptions$OutgoingEncryptedPortSource",
+    "org.apache.cassandra.config.GuardrailsOptions",
+    "org.apache.cassandra.config.GuardrailsOptions$Config",
+    "org.apache.cassandra.config.GuardrailsOptions$ConsistencyLevels",
+    "org.apache.cassandra.config.GuardrailsOptions$TableProperties",
+    "org.apache.cassandra.config.ParameterizedClass",
     "org.apache.cassandra.config.ReplicaFilteringProtectionOptions",
     "org.apache.cassandra.config.YamlConfigurationLoader",
     "org.apache.cassandra.config.YamlConfigurationLoader$PropertiesChecker",
     "org.apache.cassandra.config.YamlConfigurationLoader$PropertiesChecker$1",
     "org.apache.cassandra.config.YamlConfigurationLoader$CustomConstructor",
     "org.apache.cassandra.config.TransparentDataEncryptionOptions",
+    "org.apache.cassandra.config.StartupChecksOptions",
+    "org.apache.cassandra.config.SubnetGroups",
+    "org.apache.cassandra.config.TrackWarnings",
     "org.apache.cassandra.db.ConsistencyLevel",
     "org.apache.cassandra.db.commitlog.CommitLogSegmentManagerFactory",
     "org.apache.cassandra.db.commitlog.DefaultCommitLogSegmentMgrFactory",
@@ -101,6 +140,11 @@
     "org.apache.cassandra.db.commitlog.CommitLogSegmentManagerStandard",
     "org.apache.cassandra.db.commitlog.CommitLog",
     "org.apache.cassandra.db.commitlog.CommitLogMBean",
+    "org.apache.cassandra.db.guardrails.GuardrailsConfig",
+    "org.apache.cassandra.db.guardrails.GuardrailsConfigMBean",
+    "org.apache.cassandra.db.guardrails.GuardrailsConfig$ConsistencyLevels",
+    "org.apache.cassandra.db.guardrails.GuardrailsConfig$TableProperties",
+    "org.apache.cassandra.db.guardrails.Values$Config",
     "org.apache.cassandra.dht.IPartitioner",
     "org.apache.cassandra.distributed.api.IInstance",
     "org.apache.cassandra.distributed.api.IIsolatedExecutor",
@@ -122,9 +166,11 @@
     "org.apache.cassandra.exceptions.ConfigurationException",
     "org.apache.cassandra.exceptions.RequestValidationException",
     "org.apache.cassandra.exceptions.CassandraException",
+    "org.apache.cassandra.exceptions.InvalidRequestException",
     "org.apache.cassandra.exceptions.TransportException",
     "org.apache.cassandra.fql.FullQueryLogger",
     "org.apache.cassandra.fql.FullQueryLoggerOptions",
+    "org.apache.cassandra.gms.IFailureDetector",
     "org.apache.cassandra.locator.IEndpointSnitch",
     "org.apache.cassandra.io.FSWriteError",
     "org.apache.cassandra.io.FSError",
@@ -133,23 +179,33 @@
     "org.apache.cassandra.io.compress.LZ4Compressor",
     "org.apache.cassandra.io.sstable.metadata.MetadataType",
     "org.apache.cassandra.io.util.BufferedDataOutputStreamPlus",
+    "org.apache.cassandra.io.util.RebufferingInputStream",
+    "org.apache.cassandra.io.util.FileInputStreamPlus",
+    "org.apache.cassandra.io.util.FileOutputStreamPlus",
+    "org.apache.cassandra.io.util.File",
     "org.apache.cassandra.io.util.DataOutputBuffer",
     "org.apache.cassandra.io.util.DataOutputBufferFixed",
     "org.apache.cassandra.io.util.DataOutputStreamPlus",
     "org.apache.cassandra.io.util.DataOutputPlus",
+    "org.apache.cassandra.io.util.DataInputPlus",
     "org.apache.cassandra.io.util.DiskOptimizationStrategy",
     "org.apache.cassandra.io.util.SpinningDiskOptimizationStrategy",
+    "org.apache.cassandra.io.util.PathUtils$IOToLongFunction",
     "org.apache.cassandra.locator.Replica",
+    "org.apache.cassandra.locator.ReplicaCollection",
     "org.apache.cassandra.locator.SimpleSeedProvider",
     "org.apache.cassandra.locator.SeedProvider",
+    "org.apache.cassandra.security.ISslContextFactory",
     "org.apache.cassandra.security.SSLFactory",
     "org.apache.cassandra.security.EncryptionContext",
     "org.apache.cassandra.service.CacheService$CacheType",
+    "org.apache.cassandra.transport.ProtocolException",
     "org.apache.cassandra.utils.binlog.BinLogOptions",
     "org.apache.cassandra.utils.FBUtilities",
     "org.apache.cassandra.utils.FBUtilities$1",
     "org.apache.cassandra.utils.CloseableIterator",
     "org.apache.cassandra.utils.Pair",
+    "org.apache.cassandra.utils.concurrent.UncheckedInterruptedException",
     "org.apache.cassandra.ConsoleAppender",
     "org.apache.cassandra.ConsoleAppender$1",
     "org.apache.cassandra.LogbackStatusListener",
@@ -295,7 +351,7 @@
         {
             Method method = databaseDescriptorClass.getDeclaredMethod(methodName);
             method.invoke(null);
-            
+
             if (threadCount != threads.getThreadCount())
             {
                 for (ThreadInfo threadInfo : threads.getThreadInfo(threads.getAllThreadIds()))
@@ -311,15 +367,15 @@
     {
         if (!violations.isEmpty())
         {
+            StringBuilder sb = new StringBuilder();
             for (Pair<String, Exception> violation : new ArrayList<>(violations))
-            {
-                err.println();
-                err.println();
-                err.println("VIOLATION: " + violation.left);
-                violation.right.printStackTrace(err);
-            }
+                sb.append("\n\n")
+                  .append("VIOLATION: ").append(violation.left).append('\n')
+                  .append(Throwables.getStackTraceAsString(violation.right));
+            String msg = sb.toString();
+            err.println(msg);
 
-            fail();
+            fail(msg);
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
index 0038938..2b72cd7 100644
--- a/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
+++ b/test/unit/org/apache/cassandra/config/DatabaseDescriptorTest.java
@@ -25,6 +25,7 @@
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Enumeration;
+import java.util.function.Consumer;
 
 
 import com.google.common.base.Throwables;
@@ -34,8 +35,11 @@
 
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.assertj.core.api.Assertions;
 
+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;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -110,7 +114,7 @@
     }
 
     @Test
-    public void testRpcInterface() throws Exception
+    public void testRpcInterface()
     {
         Config testConfig = DatabaseDescriptor.loadConfig();
         testConfig.rpc_interface = suitableInterface.getName();
@@ -195,7 +199,7 @@
     }
 
     @Test
-    public void testRpcAddress() throws Exception
+    public void testRpcAddress()
     {
         Config testConfig = DatabaseDescriptor.loadConfig();
         testConfig.rpc_address = suitableInterface.getInterfaceAddresses().get(0).getAddress().getHostAddress();
@@ -264,7 +268,7 @@
             }
         }
     }
-    
+
     @Test
     public void testTokensFromString()
     {
@@ -279,15 +283,15 @@
         try
         {
             DatabaseDescriptor.setColumnIndexCacheSize(-1);
-            fail("Should have received a ConfigurationException column_index_cache_size_in_kb = -1");
+            fail("Should have received a IllegalArgumentException column_index_cache_size = -1");
         }
-        catch (ConfigurationException ignored) { }
+        catch (IllegalArgumentException ignored) { }
         Assert.assertEquals(2048, DatabaseDescriptor.getColumnIndexCacheSize());
 
         try
         {
             DatabaseDescriptor.setColumnIndexCacheSize(2 * 1024 * 1024);
-            fail("Should have received a ConfigurationException column_index_cache_size_in_kb = 2GiB");
+            fail("Should have received a ConfigurationException column_index_cache_size= 2GiB");
         }
         catch (ConfigurationException ignored) { }
         Assert.assertEquals(2048, DatabaseDescriptor.getColumnIndexCacheSize());
@@ -295,105 +299,131 @@
         try
         {
             DatabaseDescriptor.setColumnIndexSize(-1);
-            fail("Should have received a ConfigurationException column_index_size_in_kb = -1");
+            fail("Should have received a IllegalArgumentException column_index_size = -1");
         }
-        catch (ConfigurationException ignored) { }
+        catch (IllegalArgumentException ignored) { }
         Assert.assertEquals(4096, DatabaseDescriptor.getColumnIndexSize());
 
         try
         {
             DatabaseDescriptor.setColumnIndexSize(2 * 1024 * 1024);
-            fail("Should have received a ConfigurationException column_index_size_in_kb = 2GiB");
+            fail("Should have received a ConfigurationException column_index_size = 2GiB");
         }
         catch (ConfigurationException ignored) { }
         Assert.assertEquals(4096, DatabaseDescriptor.getColumnIndexSize());
 
         try
         {
-            DatabaseDescriptor.setBatchSizeWarnThresholdInKB(-1);
-            fail("Should have received a ConfigurationException batch_size_warn_threshold_in_kb = -1");
+            DatabaseDescriptor.setBatchSizeWarnThresholdInKiB(-1);
+            fail("Should have received a IllegalArgumentException batch_size_warn_threshold = -1");
         }
-        catch (ConfigurationException ignored) { }
+        catch (IllegalArgumentException ignored) { }
         Assert.assertEquals(5120, DatabaseDescriptor.getBatchSizeWarnThreshold());
 
         try
         {
-            DatabaseDescriptor.setBatchSizeWarnThresholdInKB(2 * 1024 * 1024);
-            fail("Should have received a ConfigurationException batch_size_warn_threshold_in_kb = 2GiB");
+            DatabaseDescriptor.setBatchSizeWarnThresholdInKiB(2 * 1024 * 1024);
+            fail("Should have received a ConfigurationException batch_size_warn_threshold = 2GiB");
         }
         catch (ConfigurationException ignored) { }
-        Assert.assertEquals(4096, DatabaseDescriptor.getColumnIndexSize());
+        Assert.assertEquals(5120, DatabaseDescriptor.getBatchSizeWarnThreshold());
+    }
+
+    @Test
+    public void testWidenToLongInBytes() throws ConfigurationException
+    {
+        Config conf = DatabaseDescriptor.getRawConfig();
+        int maxInt = Integer.MAX_VALUE - 1;
+        long maxIntMebibytesAsBytes = (long) maxInt * 1024 * 1024;
+        long maxIntKibibytesAsBytes = (long) maxInt * 1024;
+
+        conf.compaction_large_partition_warning_threshold = new DataStorageSpec.IntMebibytesBound(maxInt);
+        Assert.assertEquals(maxIntMebibytesAsBytes, DatabaseDescriptor.getCompactionLargePartitionWarningThreshold());
+
+        conf.min_free_space_per_drive = new DataStorageSpec.IntMebibytesBound(maxInt);
+        Assert.assertEquals(maxIntMebibytesAsBytes, DatabaseDescriptor.getMinFreeSpacePerDriveInBytes());
+
+        conf.max_hints_file_size = new DataStorageSpec.IntMebibytesBound(maxInt);
+        Assert.assertEquals(maxIntMebibytesAsBytes, DatabaseDescriptor.getMaxHintsFileSize());
+
+        DatabaseDescriptor.setBatchSizeFailThresholdInKiB(maxInt);
+        Assert.assertEquals((maxIntKibibytesAsBytes), DatabaseDescriptor.getBatchSizeFailThreshold());
     }
 
     @Test
     public void testLowestAcceptableTimeouts() throws ConfigurationException
     {
         Config testConfig = new Config();
-        testConfig.read_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT + 1;
-        testConfig.range_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT + 1;
-        testConfig.write_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT + 1;
-        testConfig.truncate_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT + 1;
-        testConfig.cas_contention_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT + 1;
-        testConfig.counter_write_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT + 1;
-        testConfig.request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT + 1;
-        
-        assertTrue(testConfig.read_request_timeout_in_ms > DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.range_request_timeout_in_ms > DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.write_request_timeout_in_ms > DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.truncate_request_timeout_in_ms > DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.cas_contention_timeout_in_ms > DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.counter_write_request_timeout_in_ms > DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.request_timeout_in_ms > DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+
+        DurationSpec.LongMillisecondsBound greaterThanLowestTimeout = new DurationSpec.LongMillisecondsBound(DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT.toMilliseconds() + 1);
+
+        testConfig.read_request_timeout = greaterThanLowestTimeout;
+        testConfig.range_request_timeout = greaterThanLowestTimeout;
+        testConfig.write_request_timeout = greaterThanLowestTimeout;
+        testConfig.truncate_request_timeout = greaterThanLowestTimeout;
+        testConfig.cas_contention_timeout = greaterThanLowestTimeout;
+        testConfig.counter_write_request_timeout = greaterThanLowestTimeout;
+        testConfig.request_timeout = greaterThanLowestTimeout;
+
+        assertEquals(testConfig.read_request_timeout, greaterThanLowestTimeout);
+        assertEquals(testConfig.range_request_timeout, greaterThanLowestTimeout);
+        assertEquals(testConfig.write_request_timeout, greaterThanLowestTimeout);
+        assertEquals(testConfig.truncate_request_timeout, greaterThanLowestTimeout);
+        assertEquals(testConfig.cas_contention_timeout, greaterThanLowestTimeout);
+        assertEquals(testConfig.counter_write_request_timeout, greaterThanLowestTimeout);
+        assertEquals(testConfig.request_timeout, greaterThanLowestTimeout);
 
         //set less than Lowest acceptable value
-        testConfig.read_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT - 1;
-        testConfig.range_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT - 1;
-        testConfig.write_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT - 1;
-        testConfig.truncate_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT - 1;
-        testConfig.cas_contention_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT - 1;
-        testConfig.counter_write_request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT - 1;
-        testConfig.request_timeout_in_ms = DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT - 1;
+        DurationSpec.LongMillisecondsBound lowerThanLowestTimeout = new DurationSpec.LongMillisecondsBound(DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT.toMilliseconds() - 1);
+
+        testConfig.read_request_timeout = lowerThanLowestTimeout;
+        testConfig.range_request_timeout = lowerThanLowestTimeout;
+        testConfig.write_request_timeout = lowerThanLowestTimeout;
+        testConfig.truncate_request_timeout = lowerThanLowestTimeout;
+        testConfig.cas_contention_timeout = lowerThanLowestTimeout;
+        testConfig.counter_write_request_timeout = lowerThanLowestTimeout;
+        testConfig.request_timeout = lowerThanLowestTimeout;
 
         DatabaseDescriptor.checkForLowestAcceptedTimeouts(testConfig);
 
-        assertTrue(testConfig.read_request_timeout_in_ms == DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.range_request_timeout_in_ms == DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.write_request_timeout_in_ms == DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.truncate_request_timeout_in_ms == DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.cas_contention_timeout_in_ms == DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.counter_write_request_timeout_in_ms == DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
-        assertTrue(testConfig.request_timeout_in_ms == DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+        assertEquals(testConfig.read_request_timeout, DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+        assertEquals(testConfig.range_request_timeout, DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+        assertEquals(testConfig.write_request_timeout, DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+        assertEquals(testConfig.truncate_request_timeout, DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+        assertEquals(testConfig.cas_contention_timeout, DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+        assertEquals(testConfig.counter_write_request_timeout, DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
+        assertEquals(testConfig.request_timeout, DatabaseDescriptor.LOWEST_ACCEPTED_TIMEOUT);
     }
 
     @Test
     public void testRepairSessionMemorySizeToggles()
     {
-        int previousSize = DatabaseDescriptor.getRepairSessionSpaceInMegabytes();
+        int previousSize = DatabaseDescriptor.getRepairSessionSpaceInMiB();
         try
         {
             Assert.assertEquals((Runtime.getRuntime().maxMemory() / (1024 * 1024) / 16),
-                                DatabaseDescriptor.getRepairSessionSpaceInMegabytes());
+                                DatabaseDescriptor.getRepairSessionSpaceInMiB());
 
             int targetSize = (int) (Runtime.getRuntime().maxMemory() / (1024 * 1024) / 4) + 1;
 
-            DatabaseDescriptor.setRepairSessionSpaceInMegabytes(targetSize);
-            Assert.assertEquals(targetSize, DatabaseDescriptor.getRepairSessionSpaceInMegabytes());
+            DatabaseDescriptor.setRepairSessionSpaceInMiB(targetSize);
+            Assert.assertEquals(targetSize, DatabaseDescriptor.getRepairSessionSpaceInMiB());
 
-            DatabaseDescriptor.setRepairSessionSpaceInMegabytes(10);
-            Assert.assertEquals(10, DatabaseDescriptor.getRepairSessionSpaceInMegabytes());
+            DatabaseDescriptor.setRepairSessionSpaceInMiB(10);
+            Assert.assertEquals(10, DatabaseDescriptor.getRepairSessionSpaceInMiB());
 
             try
             {
-                DatabaseDescriptor.setRepairSessionSpaceInMegabytes(0);
+                DatabaseDescriptor.setRepairSessionSpaceInMiB(0);
                 fail("Should have received a ConfigurationException for depth of 9");
             }
             catch (ConfigurationException ignored) { }
 
-            Assert.assertEquals(10, DatabaseDescriptor.getRepairSessionSpaceInMegabytes());
+            Assert.assertEquals(10, DatabaseDescriptor.getRepairSessionSpaceInMiB());
         }
         finally
         {
-            DatabaseDescriptor.setRepairSessionSpaceInMegabytes(previousSize);
+            DatabaseDescriptor.setRepairSessionSpaceInMiB(previousSize);
         }
     }
 
@@ -433,25 +463,25 @@
     }
 
     @Test
-    public void testCalculateDefaultSpaceInMB()
+    public void testCalculateDefaultSpaceInMiB()
     {
         // check prefered size is used for a small storage volume
-        int preferredInMB = 667;
+        int preferredInMiB = 667;
         int numerator = 2;
         int denominator = 3;
         int spaceInBytes = 999 * 1024 * 1024;
 
         assertEquals(666, // total size is less than preferred, so return lower limit
-                     DatabaseDescriptor.calculateDefaultSpaceInMB("type", "/path", "setting_name", preferredInMB, spaceInBytes, numerator, denominator));
+                     DatabaseDescriptor.calculateDefaultSpaceInMiB("type", "/path", "setting_name", preferredInMiB, spaceInBytes, numerator, denominator));
 
         // check preferred size is used for a small storage volume
-        preferredInMB = 100;
+        preferredInMiB = 100;
         numerator = 1;
         denominator = 3;
         spaceInBytes = 999 * 1024 * 1024;
 
         assertEquals(100, // total size is more than preferred so keep the configured limit
-                     DatabaseDescriptor.calculateDefaultSpaceInMB("type", "/path", "setting_name", preferredInMB, spaceInBytes, numerator, denominator));
+                     DatabaseDescriptor.calculateDefaultSpaceInMiB("type", "/path", "setting_name", preferredInMiB, spaceInBytes, numerator, denominator));
     }
 
     @Test
@@ -557,6 +587,44 @@
     }
 
     @Test
+    public void testUpperBoundStreamingConfigOnStartup()
+    {
+        Config config = DatabaseDescriptor.loadConfig();
+
+        String expectedMsg = "Invalid value of entire_sstable_stream_throughput_outbound:";
+        config.entire_sstable_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(Integer.MAX_VALUE, DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND);
+        validateProperty(expectedMsg);
+
+        expectedMsg = "Invalid value of entire_sstable_stream_throughput_outbound:";
+        config.entire_sstable_inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(Integer.MAX_VALUE, DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND);
+        validateProperty(expectedMsg);
+
+        expectedMsg = "Invalid value of stream_throughput_outbound:";
+        config.stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(Integer.MAX_VALUE * 125_000L);
+        validateProperty(expectedMsg);
+
+        expectedMsg = "Invalid value of inter_dc_stream_throughput_outbound:";
+        config.inter_dc_stream_throughput_outbound = new DataRateSpec.LongBytesPerSecondBound(Integer.MAX_VALUE * 125_000L);
+        validateProperty(expectedMsg);
+
+        expectedMsg = "compaction_throughput:";
+        config.compaction_throughput = new DataRateSpec.LongBytesPerSecondBound(Integer.MAX_VALUE, DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND);
+        validateProperty(expectedMsg);
+    }
+
+    private static void validateProperty(String expectedMsg)
+    {
+        try
+        {
+            DatabaseDescriptor.validateUpperBoundStreamingConfig();
+        }
+        catch (ConfigurationException ex)
+        {
+            Assert.assertEquals(expectedMsg, ex.getMessage());
+        }
+    }
+
+    @Test
     public void testApplyTokensConfigInitialTokensNotSetNumTokensSet()
     {
         Config config = DatabaseDescriptor.loadConfig();
@@ -590,4 +658,161 @@
         Assert.assertEquals(Integer.valueOf(1), config.num_tokens);
         Assert.assertEquals(1, DatabaseDescriptor.tokensFromString(config.initial_token).size());
     }
+
+    @Test
+    public void testDenylistInvalidValuesRejected()
+    {
+        DatabaseDescriptor.loadConfig();
+
+        expectIllegalArgumentException(DatabaseDescriptor::setDenylistRefreshSeconds, 0, "denylist_refresh must be a positive integer.");
+        expectIllegalArgumentException(DatabaseDescriptor::setDenylistRefreshSeconds, -1, "denylist_refresh must be a positive integer.");
+        expectIllegalArgumentException(DatabaseDescriptor::setDenylistMaxKeysPerTable, 0, "denylist_max_keys_per_table must be a positive integer.");
+        expectIllegalArgumentException(DatabaseDescriptor::setDenylistMaxKeysPerTable, -1, "denylist_max_keys_per_table must be a positive integer.");
+        expectIllegalArgumentException(DatabaseDescriptor::setDenylistMaxKeysTotal, 0, "denylist_max_keys_total must be a positive integer.");
+        expectIllegalArgumentException(DatabaseDescriptor::setDenylistMaxKeysTotal, -1, "denylist_max_keys_total must be a positive integer.");
+    }
+
+    private void expectIllegalArgumentException(Consumer<Integer> c, int val, String expectedMessage)
+    {
+        assertThatThrownBy(() -> c.accept(val))
+            .isInstanceOf(IllegalArgumentException.class)
+            .hasMessageContaining(expectedMessage);
+    }
+
+    // coordinator read
+    @Test
+    public void testClientLargeReadWarnGreaterThanAbort()
+    {
+        Config conf = new Config();
+        conf.coordinator_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.coordinator_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(1, KIBIBYTES);
+        Assertions.assertThatThrownBy(() -> DatabaseDescriptor.applyReadThresholdsValidations(conf))
+                  .isInstanceOf(ConfigurationException.class)
+                  .hasMessage("coordinator_read_size_fail_threshold (1KiB) must be greater than or equal to coordinator_read_size_warn_threshold (2KiB)");
+    }
+
+    @Test
+    public void testClientLargeReadWarnEqAbort()
+    {
+        Config conf = new Config();
+        conf.coordinator_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.coordinator_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    @Test
+    public void testClientLargeReadWarnEnabledAbortDisabled()
+    {
+        Config conf = new Config();
+        conf.coordinator_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.coordinator_read_size_fail_threshold = null;
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    @Test
+    public void testClientLargeReadAbortEnabledWarnDisabled()
+    {
+        Config conf = new Config();
+        conf.coordinator_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(0, KIBIBYTES);
+        conf.coordinator_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    // local read
+
+    @Test
+    public void testLocalLargeReadWarnGreaterThanAbort()
+    {
+        Config conf = new Config();
+        conf.local_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.local_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(1, KIBIBYTES);
+        Assertions.assertThatThrownBy(() -> DatabaseDescriptor.applyReadThresholdsValidations(conf))
+                  .isInstanceOf(ConfigurationException.class)
+                  .hasMessage("local_read_size_fail_threshold (1KiB) must be greater than or equal to local_read_size_warn_threshold (2KiB)");
+    }
+
+    @Test
+    public void testLocalLargeReadWarnEqAbort()
+    {
+        Config conf = new Config();
+        conf.local_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.local_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    @Test
+    public void testLocalLargeReadWarnEnabledAbortDisabled()
+    {
+        Config conf = new Config();
+        conf.local_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.local_read_size_fail_threshold = null;
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    @Test
+    public void testLocalLargeReadAbortEnabledWarnDisabled()
+    {
+        Config conf = new Config();
+        conf.local_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(0, KIBIBYTES);
+        conf.local_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    // row index entry
+
+    @Test
+    public void testRowIndexSizeWarnGreaterThanAbort()
+    {
+        Config conf = new Config();
+        conf.row_index_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.row_index_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(1, KIBIBYTES);
+        Assertions.assertThatThrownBy(() -> DatabaseDescriptor.applyReadThresholdsValidations(conf))
+                  .isInstanceOf(ConfigurationException.class)
+                  .hasMessage("row_index_read_size_fail_threshold (1KiB) must be greater than or equal to row_index_read_size_warn_threshold (2KiB)");
+    }
+
+    @Test
+    public void testRowIndexSizeWarnEqAbort()
+    {
+        Config conf = new Config();
+        conf.row_index_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.row_index_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    @Test
+    public void testRowIndexSizeWarnEnabledAbortDisabled()
+    {
+        Config conf = new Config();
+        conf.row_index_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        conf.row_index_read_size_fail_threshold = null;
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    @Test
+    public void testRowIndexSizeAbortEnabledWarnDisabled()
+    {
+        Config conf = new Config();
+        conf.row_index_read_size_warn_threshold = new DataStorageSpec.LongBytesBound(0, KIBIBYTES);
+        conf.row_index_read_size_fail_threshold = new DataStorageSpec.LongBytesBound(2, KIBIBYTES);
+        DatabaseDescriptor.applyReadThresholdsValidations(conf);
+    }
+
+    @Test
+    public void testDefaultSslContextFactoryConfiguration()
+    {
+        Config config = DatabaseDescriptor.loadConfig();
+        Assert.assertEquals("org.apache.cassandra.security.DefaultSslContextFactory",
+                            config.client_encryption_options.ssl_context_factory.class_name);
+        Assert.assertTrue(config.client_encryption_options.ssl_context_factory.parameters.isEmpty());
+        Assert.assertEquals("org.apache.cassandra.security.DefaultSslContextFactory",
+                            config.server_encryption_options.ssl_context_factory.class_name);
+        Assert.assertTrue(config.server_encryption_options.ssl_context_factory.parameters.isEmpty());
+    }
+
+    @Test (expected = IllegalArgumentException.class)
+    public void testInvalidSub1DefaultRFs() throws IllegalArgumentException
+    {
+        DatabaseDescriptor.setDefaultKeyspaceRF(0);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/config/DefaultLoaderTest.java b/test/unit/org/apache/cassandra/config/DefaultLoaderTest.java
new file mode 100644
index 0000000..6e122f8
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/DefaultLoaderTest.java
@@ -0,0 +1,224 @@
+/*
+ * 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.config;
+
+import org.junit.Test;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.yaml.snakeyaml.introspector.FieldProperty;
+import org.yaml.snakeyaml.introspector.MethodProperty;
+import org.yaml.snakeyaml.introspector.Property;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DefaultLoaderTest
+{
+    private static final DefaultLoader LOADER = new DefaultLoader();
+
+    // field, no getter, no setter -> Example0
+    // field, no/ignored getter, setter -> Example1 && Example5
+    // field, getter, no/ignored setter -> Example3 && Example4
+    // field, getter, setter -> Example2
+
+    // no field, no getter, setter -> Example9 && Example10
+    // no field, getter, no/ignored setter -> Example7 && Example8
+    // no field, getter, setter -> Example6
+
+    @Test
+    public void fieldPresentWithoutGetterOrSetter()
+    {
+        // when the field is present and no getter, then the field property is used
+        assertThat(get(Example0.class, "first")).isInstanceOf(FieldProperty.class);
+    }
+
+    @Test
+    public void fieldPresentWithoutGetter()
+    {
+        // when the field is present and no getter, then the field property is used
+        assertThat(get(Example1.class, "first")).isInstanceOf(FieldProperty.class);
+        assertThat(get(Example5.class, "first")).isInstanceOf(FieldProperty.class);
+    }
+
+    @Test
+    public void fieldPresentWithGetter()
+    {
+        // if setter/getter present, methods take precendents over field
+        assertThat(get(Example2.class, "first")).isInstanceOf(MethodProperty.class);
+    }
+
+    @Test
+    public void fieldPresentWithoutSetter()
+    {
+        assertThat(get(Example3.class, "first")).isInstanceOf(FieldProperty.class);
+        assertThat(get(Example4.class, "first")).isInstanceOf(FieldProperty.class);
+    }
+
+    @Test
+    public void noFieldWithGetterAndSetter()
+    {
+        assertThat(get(Example6.class, "first")).isInstanceOf(MethodProperty.class);
+    }
+
+    @Test
+    public void noFieldWithGetterAndNoSetter()
+    {
+        assertThat(get(Example7.class, "first")).isNull();
+        assertThat(get(Example8.class, "first")).isNull();
+    }
+
+    @Test
+    public void noFieldWithoutGetterAndWithSetter()
+    {
+        assertThat(get(Example9.class, "first")).isInstanceOf(MethodProperty.class);
+        assertThat(get(Example10.class, "first")).isInstanceOf(MethodProperty.class);
+    }
+
+    private static Property get(Class<?> klass, String name)
+    {
+        return LOADER.getProperties(klass).get(name);
+    }
+
+    public static class Example0
+    {
+        public int first;
+    }
+
+    public static class Example1
+    {
+        public int first;
+
+        public void setFirst(int first)
+        {
+            this.first = first;
+        }
+    }
+
+    public static class Example2
+    {
+        public int first;
+
+        public void setFirst(int first)
+        {
+            this.first = first;
+        }
+
+        public int getFirst()
+        {
+            return first;
+        }
+    }
+
+    public static class Example3
+    {
+        public int first;
+
+        public int getFirst()
+        {
+            return first;
+        }
+    }
+
+    public static class Example4
+    {
+        public int first;
+
+        @JsonIgnore
+        public void setFirst(int first)
+        {
+            this.first = first;
+        }
+
+        public int getFirst()
+        {
+            return first;
+        }
+    }
+
+    public static class Example5
+    {
+        public int first;
+
+        public void setFirst(int first)
+        {
+            this.first = first;
+        }
+
+        @JsonIgnore
+        public int getFirst()
+        {
+            return first;
+        }
+    }
+
+    public static class Example6
+    {
+        public int getFirst()
+        {
+            return 42;
+        }
+
+        public void setFirst(int first)
+        {
+            // no-op
+        }
+    }
+
+    public static class Example7
+    {
+        public int getFirst()
+        {
+            return 42;
+        }
+    }
+
+    public static class Example8
+    {
+        public int getFirst()
+        {
+            return 42;
+        }
+
+        @JsonIgnore
+        public void setFirst(int first)
+        {
+            // no-op
+        }
+    }
+
+    public static class Example9
+    {
+        public void setFirst(int first)
+        {
+            // no-op
+        }
+    }
+
+    public static class Example10
+    {
+        @JsonIgnore
+        public int getFirst()
+        {
+            return 42;
+        }
+
+        public void setFirst(int first)
+        {
+            // no-op
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/config/DurationSpecTest.java b/test/unit/org/apache/cassandra/config/DurationSpecTest.java
new file mode 100644
index 0000000..22846fc
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/DurationSpecTest.java
@@ -0,0 +1,319 @@
+/*
+ * 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.config;
+
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Test;
+
+import org.quicktheories.core.Gen;
+import org.quicktheories.generators.SourceDSL;
+
+import static java.util.concurrent.TimeUnit.MICROSECONDS;
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+import static org.junit.Assert.*;
+import static org.quicktheories.QuickTheory.qt;
+
+public class DurationSpecTest
+{
+    private static final long MAX_INT_CONFIG_VALUE = Integer.MAX_VALUE - 1;
+
+    @SuppressWarnings("AssertBetweenInconvertibleTypes")
+    @Test
+    public void testConversions()
+    {
+        assertEquals(10000000000L, new DurationSpec.LongNanosecondsBound ("10s").toNanoseconds());
+        assertEquals(MAX_INT_CONFIG_VALUE, new DurationSpec.IntSecondsBound(MAX_INT_CONFIG_VALUE + "s").toSeconds());
+        assertEquals(MAX_INT_CONFIG_VALUE, new DurationSpec.LongMillisecondsBound(MAX_INT_CONFIG_VALUE + "ms").toMilliseconds());
+        assertEquals(600000000000L, new DurationSpec.LongNanosecondsBound ("10m").toNanoseconds());
+        assertEquals(MAX_INT_CONFIG_VALUE, new DurationSpec.IntMinutesBound(MAX_INT_CONFIG_VALUE + "m").toMinutes());
+        assertEquals(MAX_INT_CONFIG_VALUE, new DurationSpec.IntSecondsBound(MAX_INT_CONFIG_VALUE + "s").toSeconds());
+        assertEquals(new DurationSpec.IntMillisecondsBound(0.7, TimeUnit.MILLISECONDS), new DurationSpec.LongNanosecondsBound("1ms"));
+        assertEquals(new DurationSpec.IntMillisecondsBound(0.33, TimeUnit.MILLISECONDS), new DurationSpec.LongNanosecondsBound("0ms"));
+        assertEquals(new DurationSpec.IntMillisecondsBound(0.333, TimeUnit.MILLISECONDS), new DurationSpec.LongNanosecondsBound("0ms"));
+    }
+
+    @Test
+    public void testFromSymbol()
+    {
+        assertEquals(DurationSpec.fromSymbol("ms"), TimeUnit.MILLISECONDS);
+        assertEquals(DurationSpec.fromSymbol("d"), TimeUnit.DAYS);
+        assertEquals(DurationSpec.fromSymbol("h"), TimeUnit.HOURS);
+        assertEquals(DurationSpec.fromSymbol("m"), TimeUnit.MINUTES);
+        assertEquals(DurationSpec.fromSymbol("s"), TimeUnit.SECONDS);
+        assertEquals(DurationSpec.fromSymbol("us"), TimeUnit.MICROSECONDS);
+        assertEquals(DurationSpec.fromSymbol("µs"), TimeUnit.MICROSECONDS);
+        assertEquals(DurationSpec.fromSymbol("ns"), NANOSECONDS);
+        assertThatThrownBy(() -> DurationSpec.fromSymbol("n")).isInstanceOf(IllegalArgumentException.class);
+    }
+
+    @Test
+    public void testGetSymbol()
+    {
+        assertEquals(DurationSpec.symbol(TimeUnit.MILLISECONDS), "ms");
+        assertEquals(DurationSpec.symbol(TimeUnit.DAYS), "d");
+        assertEquals(DurationSpec.symbol(TimeUnit.HOURS), "h");
+        assertEquals(DurationSpec.symbol(TimeUnit.MINUTES), "m");
+        assertEquals(DurationSpec.symbol(TimeUnit.SECONDS), "s");
+        assertEquals(DurationSpec.symbol(TimeUnit.MICROSECONDS), "us");
+        assertEquals(DurationSpec.symbol(NANOSECONDS), "ns");
+    }
+
+    @Test
+    public void testInvalidInputs()
+    {
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound("10")).isInstanceOf(IllegalArgumentException.class)
+                                                                             .hasMessageContaining("Invalid duration: 10");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound("-10s")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: -10s");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(-10, SECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: value must be non-negativ");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound("10xd")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 10xd");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound("0.333555555ms")).isInstanceOf(IllegalArgumentException.class)
+                                                                                        .hasMessageContaining("Invalid duration: 0.333555555ms");
+    }
+
+    @Test
+    public void testInvalidForConversion()
+    {
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(Long.MAX_VALUE + "ns")).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 9223372036854775807ns. " +
+                                                                                                 "It shouldn't be more than 9223372036854775806 in nanoseconds");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(Long.MAX_VALUE + "ms")).isInstanceOf(IllegalArgumentException.class)
+                                                                             .hasMessageContaining("Invalid duration: 9223372036854775807ms. " +
+                                                                                                   "It shouldn't be more than 9223372036854775806 in nanoseconds");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(Long.MAX_VALUE-5 + "µs")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 9223372036854775802µs. " +
+                                                                                                     "It shouldn't be more than 9223372036854775806 in nanoseconds");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(Long.MAX_VALUE-5 + "us")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 9223372036854775802us. " +
+                                                                                                     "It shouldn't be more than 9223372036854775806 in nanoseconds");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(Long.MAX_VALUE-5 + "s")).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 9223372036854775802s. " +
+                                                                                                 "It shouldn't be more than 9223372036854775806 in nanoseconds");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(Long.MAX_VALUE-5 + "h")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 9223372036854775802h. " +
+                                                                                                "It shouldn't be more than 9223372036854775806 in nanoseconds");
+        assertThatThrownBy(() -> new DurationSpec.LongNanosecondsBound(Long.MAX_VALUE-5 + "d")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 9223372036854775802d. " +
+                                                                                                "It shouldn't be more than 9223372036854775806 in nanoseconds");
+    }
+
+    @Test
+    public void testOverflowingConversion()
+    {
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("2147483648ms")).isInstanceOf(IllegalArgumentException.class)
+                                                                                       .hasMessageContaining("Invalid duration: 2147483648ms." +
+                                                                                                             " It shouldn't be more than 2147483646 in milliseconds");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound(2147483648L)).isInstanceOf(IllegalArgumentException.class)
+                                                                                    .hasMessageContaining("Invalid duration: 2147483648 milliseconds. " +
+                                                                                                          "It shouldn't be more than 2147483646 in milliseconds");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("2147483648s")).isInstanceOf(IllegalArgumentException.class)
+                                                                                      .hasMessageContaining("Invalid duration: 2147483648s. " +
+                                                                                                            "It shouldn't be more than 2147483646 in milliseconds");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("35791395m")).isInstanceOf(IllegalArgumentException.class)
+                                                                                    .hasMessageContaining("Invalid duration: 35791395m. " +
+                                                                                                          "It shouldn't be more than 2147483646 in milliseconds");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("597h")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 597h. " +
+                                                                                                     "It shouldn't be more than 2147483646 in milliseconds");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("24856d")).isInstanceOf(IllegalArgumentException.class)
+                                                                                 .hasMessageContaining("Invalid duration: 24856d. " +
+                                                                                                       "It shouldn't be more than 2147483646 in milliseconds");
+
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("2147483648s")).isInstanceOf(IllegalArgumentException.class)
+                                                                                 .hasMessageContaining("Invalid duration: 2147483648s. " +
+                                                                                                       "It shouldn't be more than 2147483646 in seconds");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound(2147483648L)).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 2147483648 seconds. " +
+                                                                                                     "It shouldn't be more than 2147483646 in seconds");
+        assertThatThrownBy(() -> DurationSpec.IntSecondsBound.inSecondsString("2147483648")).isInstanceOf(NumberFormatException.class)
+                                                                                            .hasMessageContaining("For input string: \"2147483648\"");
+        assertThatThrownBy(() -> DurationSpec.IntSecondsBound.inSecondsString("2147483648s")).isInstanceOf(IllegalArgumentException.class)
+                                                                                             .hasMessageContaining("Invalid duration: 2147483648s. " +
+                                                                                                                   "It shouldn't be more than 2147483646 in seconds");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("35791395m")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 35791395m. " +
+                                                                                                     "It shouldn't be more than 2147483646 in seconds");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("596524h")).isInstanceOf(IllegalArgumentException.class)
+                                                                             .hasMessageContaining("Invalid duration: 596524h. " +
+                                                                                                   "It shouldn't be more than 2147483646 in seconds");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("24856d")).isInstanceOf(IllegalArgumentException.class)
+                                                                            .hasMessageContaining("Invalid duration: 24856d. " +
+                                                                                                  "It shouldn't be more than 2147483646 in seconds");
+
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("2147483648s")).isInstanceOf(IllegalArgumentException.class)
+                                                                                 .hasMessageContaining("Invalid duration: 2147483648s " +
+                                                                                                       "Accepted units:[MINUTES, HOURS, DAYS]");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("2147483648m")).isInstanceOf(IllegalArgumentException.class)
+                                                                                 .hasMessageContaining("Invalid duration: 2147483648m. " +
+                                                                                                       "It shouldn't be more than 2147483646 in minutes");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("35791395h")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 35791395h. " +
+                                                                                                     "It shouldn't be more than 2147483646 in minutes");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("1491309d")).isInstanceOf(IllegalArgumentException.class)
+                                                                              .hasMessageContaining("Invalid duration: 1491309d. " +
+                                                                                                    "It shouldn't be more than 2147483646 in minutes");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound(2147483648L)).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 2147483648 minutes. " +
+                                                                                                     "It shouldn't be more than 2147483646 in minutes");
+    }
+
+    @SuppressWarnings("AssertBetweenInconvertibleTypes")
+    @Test
+    public void testEquals()
+    {
+        assertEquals(new DurationSpec.LongNanosecondsBound ("10s"), new DurationSpec.LongNanosecondsBound ("10s"));
+        assertEquals(new DurationSpec.LongNanosecondsBound ("10s"), new DurationSpec.LongNanosecondsBound ("10000ms"));
+        assertEquals(new DurationSpec.LongNanosecondsBound ("10000ms"), new DurationSpec.LongNanosecondsBound ("10s"));
+        assertEquals(new DurationSpec.LongNanosecondsBound ("4h"), new DurationSpec.LongNanosecondsBound ("14400s"));
+        assertEquals(DurationSpec.LongNanosecondsBound .IntSecondsBound.inSecondsString("14400"), new DurationSpec.LongNanosecondsBound ("14400s"));
+        assertEquals(DurationSpec.LongNanosecondsBound .IntSecondsBound.inSecondsString("4h"), new DurationSpec.LongNanosecondsBound ("14400s"));
+        assertEquals(DurationSpec.LongNanosecondsBound .IntSecondsBound.inSecondsString("14400s"), new DurationSpec.LongNanosecondsBound ("14400s"));
+        assertNotEquals(new DurationSpec.LongNanosecondsBound ("0m"), new DurationSpec.LongNanosecondsBound ("10ms"));
+        assertEquals(Long.MAX_VALUE-1, new DurationSpec.LongNanosecondsBound ("9223372036854775806ns").toNanoseconds());
+    }
+
+    @Test
+    public void thereAndBack()
+    {
+        Gen<TimeUnit> unitGen = SourceDSL.arbitrary().enumValues(TimeUnit.class);
+        Gen<Long> valueGen = SourceDSL.longs().between(0, Long.MAX_VALUE/24/60/60/1000L/1000L/1000L);
+        qt().forAll(valueGen, unitGen).check((value, unit) -> {
+            DurationSpec.LongNanosecondsBound  there = new DurationSpec.LongNanosecondsBound (value, unit);
+            DurationSpec.LongNanosecondsBound  back = new DurationSpec.LongNanosecondsBound (there.toString());
+            return there.equals(back);
+        });
+    }
+
+    @Test
+    public void testValidUnits()
+    {
+        assertEquals(10L, new DurationSpec.IntMillisecondsBound("10ms").toMilliseconds());
+        assertEquals(10L, new DurationSpec.IntSecondsBound("10s").toSeconds());
+        assertEquals(new DurationSpec.IntSecondsBound("10s"), DurationSpec.IntSecondsBound.inSecondsString("10"));
+        assertEquals(new DurationSpec.IntSecondsBound("10s"), DurationSpec.IntSecondsBound.inSecondsString("10s"));
+
+        assertEquals(10L, new DurationSpec.LongMillisecondsBound("10ms").toMilliseconds());
+        assertEquals(10L, new DurationSpec.LongSecondsBound("10s").toSeconds());
+    }
+
+    @Test
+    public void testInvalidUnits()
+    {
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("10ns")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 10ns " +
+                                                                                                     "Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound(10, NANOSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 10 NANOSECONDS " +
+                                                                                                     "Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("10us")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 10us " +
+                                                                                                     "Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 10 MICROSECONDS " +
+                                                                                                     "Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("10µs")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 10µs " +
+                                                                                                     "Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: 10 MICROSECONDS " +
+                                                                                                     "Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]");
+        assertThatThrownBy(() -> new DurationSpec.IntMillisecondsBound("-10s")).isInstanceOf(IllegalArgumentException.class)
+                                                                               .hasMessageContaining("Invalid duration: -10s " +
+                                                                                                     "Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS]");
+
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("10ms")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10ms Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound(10, MILLISECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 MILLISECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("10ns")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10ns Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound(10, NANOSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 NANOSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("10us")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10us Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("10µs")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10µs Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntSecondsBound("-10s")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: -10s");
+
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("10s")).isInstanceOf(IllegalArgumentException.class)
+                                                                         .hasMessageContaining("Invalid duration: 10s Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound(10, SECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                         .hasMessageContaining("Invalid duration: 10 SECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("10ms")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10ms Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound(10, MILLISECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 MILLISECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("10ns")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10ns Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound(10, NANOSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 NANOSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("10us")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10us Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("10µs")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10µs Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.IntMinutesBound("-10s")).isInstanceOf(IllegalArgumentException.class)
+                                                                          .hasMessageContaining("Invalid duration: -10s");
+
+        assertThatThrownBy(() -> new DurationSpec.LongMillisecondsBound("10ns")).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid duration: 10ns Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongMillisecondsBound(10, NANOSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid duration: 10 NANOSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongMillisecondsBound("10us")).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid duration: 10us Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongMillisecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongMillisecondsBound("10µs")).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid duration: 10µs Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongMillisecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongMillisecondsBound("-10s")).isInstanceOf(IllegalArgumentException.class)
+                                                                                .hasMessageContaining("Invalid duration: -10s");
+
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound("10ms")).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 10ms Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound(10, MILLISECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 10 MILLISECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound("10ns")).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 10ns Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound(10, NANOSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 10 NANOSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound("10µs")).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 10µs Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound(10, MICROSECONDS)).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: 10 MICROSECONDS Accepted units");
+        assertThatThrownBy(() -> new DurationSpec.LongSecondsBound("-10s")).isInstanceOf(IllegalArgumentException.class)
+                                                                           .hasMessageContaining("Invalid duration: -10s");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/EncryptionOptionsEqualityTest.java b/test/unit/org/apache/cassandra/config/EncryptionOptionsEqualityTest.java
new file mode 100644
index 0000000..dbb309b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/EncryptionOptionsEqualityTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.config;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.junit.Test;
+
+import org.apache.cassandra.security.DefaultSslContextFactory;
+import org.apache.cassandra.security.DummySslContextFactoryImpl;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+/**
+ * This class tests the equals and hashCode method of {@link EncryptionOptions} in order to make sure that the
+ * caching done in the {@link org.apache.cassandra.security.SSLFactory} doesn't break.
+ */
+public class EncryptionOptionsEqualityTest
+{
+    @Test
+    public void testKeystoreOptions() {
+        EncryptionOptions encryptionOptions1 =
+        new EncryptionOptions()
+        .withStoreType("JKS")
+        .withKeyStore("test/conf/cassandra.keystore")
+        .withKeyStorePassword("cassandra")
+        .withTrustStore("test/conf/cassandra_ssl_test.truststore")
+        .withTrustStorePassword("cassandra")
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(true)
+        .withRequireEndpointVerification(false);
+
+        EncryptionOptions encryptionOptions2 =
+        new EncryptionOptions()
+        .withStoreType("JKS")
+        .withKeyStore("test/conf/cassandra.keystore")
+        .withKeyStorePassword("cassandra")
+        .withTrustStore("test/conf/cassandra_ssl_test.truststore")
+        .withTrustStorePassword("cassandra")
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(true)
+        .withRequireEndpointVerification(false);
+
+        assertEquals(encryptionOptions1, encryptionOptions2);
+        assertEquals(encryptionOptions1.hashCode(), encryptionOptions2.hashCode());
+    }
+
+    @Test
+    public void testSameCustomSslContextFactoryImplementation() {
+
+        Map<String,String> parameters1 = new HashMap<>();
+        parameters1.put("key1", "value1");
+        parameters1.put("key2", "value2");
+        EncryptionOptions encryptionOptions1 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters1))
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(true)
+        .withRequireEndpointVerification(false);
+
+        Map<String,String> parameters2 = new HashMap<>();
+        parameters2.put("key1", "value1");
+        parameters2.put("key2", "value2");
+        EncryptionOptions encryptionOptions2 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters2))
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(true)
+        .withRequireEndpointVerification(false);
+
+        assertEquals(encryptionOptions1, encryptionOptions2);
+        assertEquals(encryptionOptions1.hashCode(), encryptionOptions2.hashCode());
+    }
+
+    @Test
+    public void testDifferentCustomSslContextFactoryImplementations() {
+
+        Map<String,String> parameters1 = new HashMap<>();
+        parameters1.put("key1", "value1");
+        parameters1.put("key2", "value2");
+        EncryptionOptions encryptionOptions1 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters1))
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(false)
+        .withRequireEndpointVerification(true);
+
+        Map<String,String> parameters2 = new HashMap<>();
+        parameters2.put("key1", "value1");
+        parameters2.put("key2", "value2");
+        EncryptionOptions encryptionOptions2 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DefaultSslContextFactory.class.getName(), parameters2))
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(false)
+        .withRequireEndpointVerification(true);
+
+        assertNotEquals(encryptionOptions1, encryptionOptions2);
+        assertNotEquals(encryptionOptions1.hashCode(), encryptionOptions2.hashCode());
+    }
+
+    @Test
+    public void testDifferentCustomSslContextFactoryParameters() {
+
+        Map<String,String> parameters1 = new HashMap<>();
+        parameters1.put("key1", "value11");
+        parameters1.put("key2", "value12");
+        EncryptionOptions encryptionOptions1 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters1))
+        .withProtocol("TLSv1.1");
+
+        Map<String,String> parameters2 = new HashMap<>();
+        parameters2.put("key1", "value21");
+        parameters2.put("key2", "value22");
+        EncryptionOptions encryptionOptions2 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters2))
+        .withProtocol("TLSv1.1");
+
+        assertNotEquals(encryptionOptions1, encryptionOptions2);
+        assertNotEquals(encryptionOptions1.hashCode(), encryptionOptions2.hashCode());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/EncryptionOptionsTest.java b/test/unit/org/apache/cassandra/config/EncryptionOptionsTest.java
index 23a6c00..a76c24a 100644
--- a/test/unit/org/apache/cassandra/config/EncryptionOptionsTest.java
+++ b/test/unit/org/apache/cassandra/config/EncryptionOptionsTest.java
@@ -18,25 +18,27 @@
 
 package org.apache.cassandra.config;
 
-import java.io.File;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.assertj.core.api.Assertions;
 
-import static org.apache.cassandra.config.EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED;
-import static org.apache.cassandra.config.EncryptionOptions.TlsEncryptionPolicy.OPTIONAL;
-import static org.apache.cassandra.config.EncryptionOptions.TlsEncryptionPolicy.ENCRYPTED;
 import static org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption.all;
 import static org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption.dc;
 import static org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption.none;
 import static org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption.rack;
-import static org.junit.Assert.*;
+import static org.apache.cassandra.config.EncryptionOptions.TlsEncryptionPolicy.ENCRYPTED;
+import static org.apache.cassandra.config.EncryptionOptions.TlsEncryptionPolicy.OPTIONAL;
+import static org.apache.cassandra.config.EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class EncryptionOptionsTest
 {
@@ -55,7 +57,24 @@
 
         public static EncryptionOptionsTestCase of(Boolean optional, String keystorePath, Boolean enabled, EncryptionOptions.TlsEncryptionPolicy expected)
         {
-            return new EncryptionOptionsTestCase(new EncryptionOptions(keystorePath, "dummypass", "dummytruststore", "dummypass",
+            return new EncryptionOptionsTestCase(new EncryptionOptions(new ParameterizedClass("org.apache.cassandra.security.DefaultSslContextFactory",
+                                                                                              new HashMap<>()),
+                                                                       keystorePath, "dummypass",
+                                                                       "dummytruststore", "dummypass",
+                                                                       Collections.emptyList(), null, null, null, "JKS", false, false, enabled, optional)
+                                                 .applyConfig(),
+                                                 expected,
+                                                 String.format("optional=%s keystore=%s enabled=%s", optional, keystorePath, enabled));
+        }
+
+        public static EncryptionOptionsTestCase of(Boolean optional, String keystorePath, Boolean enabled,
+                                                   Map<String,String> customSslContextFactoryParams,
+                                                   EncryptionOptions.TlsEncryptionPolicy expected)
+        {
+            return new EncryptionOptionsTestCase(new EncryptionOptions(new ParameterizedClass("org.apache.cassandra.security.DefaultSslContextFactory",
+                                                                                              customSslContextFactoryParams),
+                                                                       keystorePath, "dummypass",
+                                                                       "dummytruststore", "dummypass",
                                                                        Collections.emptyList(), null, null, null, "JKS", false, false, enabled, optional)
                                                  .applyConfig(),
                                                  expected,
@@ -105,7 +124,8 @@
                                                          EncryptionOptions.ServerEncryptionOptions.InternodeEncryption internodeEncryption,
                                                          EncryptionOptions.TlsEncryptionPolicy expected)
         {
-            return new ServerEncryptionOptionsTestCase(new EncryptionOptions.ServerEncryptionOptions(keystorePath, "dummypass", "dummytruststore", "dummypass",
+            return new ServerEncryptionOptionsTestCase(new EncryptionOptions.ServerEncryptionOptions(new ParameterizedClass("org.apache.cassandra.security.DefaultSslContextFactory",
+                                                                                                                            new HashMap<>()), keystorePath, "dummypass", "dummytruststore", "dummypass",
                                                                                                Collections.emptyList(), null, null, null, "JKS", false, false, optional, internodeEncryption, false)
                                                        .applyConfig(),
                                                  expected,
@@ -175,4 +195,17 @@
             Assert.assertSame(testCase.description, testCase.expected, testCase.encryptionOptions.tlsEncryptionPolicy());
         }
     }
+
+    @Test(expected =  IllegalArgumentException.class)
+    public void testMisplacedConfigKey()
+    {
+        Map<String, String> customSslContextFactoryParams = new HashMap<>();
+
+        for(EncryptionOptions.ConfigKey configKey: EncryptionOptions.ConfigKey.values())
+        {
+            customSslContextFactoryParams.put(configKey.getKeyName(), "my-custom-value");
+        }
+
+        EncryptionOptionsTestCase.of(null, absentKeystore, true, customSslContextFactoryParams, ENCRYPTED);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/config/FailStartupDuplicateParamsTest.java b/test/unit/org/apache/cassandra/config/FailStartupDuplicateParamsTest.java
new file mode 100644
index 0000000..341a0e8
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/FailStartupDuplicateParamsTest.java
@@ -0,0 +1,163 @@
+/*
+ * 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.config;
+
+import java.io.IOException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Predicate;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.Test;
+
+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.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+
+public class FailStartupDuplicateParamsTest
+{
+    private static final List<String> baseConfig = ImmutableList.of(
+        "cluster_name: Test Cluster",
+        "commitlog_sync: batch",
+        "commitlog_directory: build/test/cassandra/commitlog",
+        "hints_directory: build/test/cassandra/hints",
+        "partitioner: org.apache.cassandra.dht.ByteOrderedPartitioner",
+        "saved_caches_directory: build/test/cassandra/saved_caches",
+        "data_file_directories:",
+        "   - build/test/cassandra/data",
+        "seed_provider:" ,
+        "   - class_name: org.apache.cassandra.locator.SimpleSeedProvider",
+        "parameters:",
+        "   - seeds: \"127.0.0.1:7012\"",
+        "endpoint_snitch: org.apache.cassandra.locator.SimpleSnitch");
+
+    @Before
+    public void before()
+    {
+        ALLOW_DUPLICATE_CONFIG_KEYS.setBoolean(true);
+        ALLOW_NEW_OLD_CONFIG_KEYS.setBoolean(false);
+    }
+
+    @Test
+    public void testDuplicateParamThrows() throws IOException
+    {
+        ALLOW_DUPLICATE_CONFIG_KEYS.setBoolean(false);
+        testYaml("found duplicate key endpoint_snitch", true,
+                 "endpoint_snitch: org.apache.cassandra.locator.RackInferringSnitch");
+    }
+
+    @Test
+    public void testReplacementDupesOldFirst() throws IOException
+    {
+        testYaml("[enable_user_defined_functions -> user_defined_functions_enabled]", true,
+                 "enable_user_defined_functions: true",
+                 "user_defined_functions_enabled: false");
+
+        testYaml("[enable_user_defined_functions -> user_defined_functions_enabled]", true,
+                 "enable_user_defined_functions: true",
+                 "user_defined_functions_enabled: true");
+    }
+
+    @Test
+    public void testReplacementDupesNewFirst() throws IOException
+    {
+        testYaml("[enable_user_defined_functions -> user_defined_functions_enabled]", true,
+                 "user_defined_functions_enabled: false",
+                 "enable_user_defined_functions: true");
+
+    }
+
+    @Test
+    public void testReplacementDupesMultiReplace() throws IOException
+    {
+        /*
+        @Replaces(oldName = "internode_socket_send_buffer_size_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+        @Replaces(oldName = "internode_send_buff_size_in_bytes", converter = Converters.BYTES_DATASTORAGE, deprecated = true)
+        public DataStorageSpec internode_socket_send_buffer_size = new DataStorageSpec("0B");
+        */
+        Predicate<String> predicate = (s) -> s.contains("[internode_send_buff_size_in_bytes -> internode_socket_send_buffer_size]") &&
+                                             s.contains("[internode_socket_send_buffer_size_in_bytes -> internode_socket_send_buffer_size]");
+        String message = " does not contain both [internode_send_buff_size_in_bytes] and [internode_socket_send_buffer_size_in_bytes]";
+
+        testYaml(predicate, true,
+                 message,
+                 "internode_send_buff_size_in_bytes: 3",
+                 "internode_socket_send_buffer_size_in_bytes: 2",
+                 "internode_socket_send_buffer_size: 5B");
+
+        // and new first:
+        testYaml(predicate, true,
+                 message,
+                 "internode_socket_send_buffer_size: 5B",
+                 "internode_socket_send_buffer_size_in_bytes: 2",
+                 "internode_send_buff_size_in_bytes: 3");
+    }
+
+    private static void testYaml(String expected, boolean expectFailure, String ... toAdd) throws IOException
+    {
+        testYaml((s) -> s.contains(expected), expectFailure, "does not contain [" + expected + ']', toAdd);
+    }
+
+    private static void testYaml(Predicate<String> exceptionMsgPredicate, boolean expectFailure, String message, String ... toAdd) throws IOException
+    {
+        Path p = Files.createTempFile("config_dupes",".yaml");
+        try
+        {
+            List<String> lines = new ArrayList<>(baseConfig);
+            Collections.addAll(lines, toAdd);
+            Files.write(p, lines);
+            loadConfig(p.toUri().toURL(), message, exceptionMsgPredicate, expectFailure);
+        }
+        finally
+        {
+            Files.delete(p);
+        }
+    }
+
+    private static void loadConfig(URL config, String message, Predicate<String> exceptionMsgPredicate, boolean expectFailure)
+    {
+        try
+        {
+            new YamlConfigurationLoader().loadConfig(config);
+        }
+        catch (Exception e)
+        {
+            assertTrue(expectFailure);
+            e.printStackTrace(System.out);
+            Throwable t = e;
+            do
+            {
+                if (exceptionMsgPredicate.test(t.getMessage()))
+                    return;
+                t = t.getCause();
+            } while (t != null);
+
+            fail("Message\n["+e.getMessage()+ "]\n"+message);
+        }
+        assertFalse(expectFailure);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java b/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java
index 575f04d..0e028cb 100644
--- a/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java
+++ b/test/unit/org/apache/cassandra/config/LoadOldYAMLBackwardCompatibilityTest.java
@@ -18,27 +18,114 @@
 
 package org.apache.cassandra.config;
 
+import java.util.concurrent.TimeUnit;
+
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
 
 public class LoadOldYAMLBackwardCompatibilityTest
 {
     @BeforeClass
     public static void setupDatabaseDescriptor()
     {
-        System.setProperty("cassandra.config", "cassandra_deprecated_parameters_names.yaml");
+        System.setProperty("cassandra.config", "cassandra-old.yaml");
         DatabaseDescriptor.daemonInitialization();
     }
 
-    // CASSANDRA-17141
+    // CASSANDRA-15234
     @Test
     public void testConfigurationLoaderBackwardCompatibility()
     {
         Config config = DatabaseDescriptor.loadConfig();
-        //Confirm parameters were successfully read with the old names from cassandra-old.yaml
-        assertEquals(5, config.internode_socket_send_buffer_size_in_bytes);
-        assertEquals(5, config.internode_socket_receive_buffer_size_in_bytes);
+
+        assertEquals(new DurationSpec.IntMillisecondsBound(10800000), config.max_hint_window);
+        assertEquals(new DurationSpec.IntMillisecondsBound("3h"), config.max_hint_window);
+        assertEquals(new DurationSpec.LongMillisecondsBound(0), config.native_transport_idle_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(10000), config.request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(5000), config.read_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(10000), config.range_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(2000), config.write_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(5000), config.counter_write_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(1800), config.cas_contention_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(60000), config.truncate_request_timeout);
+        assertEquals(new DurationSpec.IntSecondsBound(300), config.streaming_keep_alive_period);
+        assertEquals(new DurationSpec.LongMillisecondsBound(500), config.slow_query_log_timeout);
+        assertNull(config.memtable_heap_space);
+        assertNull(config.memtable_offheap_space);
+        assertNull( config.repair_session_space);
+        assertEquals(new DataStorageSpec.IntBytesBound(4194304), config.internode_application_send_queue_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(134217728), config.internode_application_send_queue_reserve_endpoint_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(536870912), config.internode_application_send_queue_reserve_global_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(4194304), config.internode_application_receive_queue_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(134217728), config.internode_application_receive_queue_reserve_endpoint_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(536870912), config.internode_application_receive_queue_reserve_global_capacity);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.internode_tcp_connect_timeout);
+        assertEquals(new DurationSpec.IntMillisecondsBound(30000), config.internode_tcp_user_timeout);
+        assertEquals(new DurationSpec.IntMillisecondsBound(300000), config.internode_streaming_tcp_user_timeout);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(16), config.native_transport_max_frame_size);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(256), config.max_value_size);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(4), config.column_index_size);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(2), config.column_index_cache_size);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(5), config.batch_size_warn_threshold);
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound(64, DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND), config.compaction_throughput);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(50), config.min_free_space_per_drive);
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound(25000000000000L).toString(), config.stream_throughput_outbound.toString());
+        assertEquals(DataRateSpec.LongBytesPerSecondBound.megabitsPerSecondInBytesPerSecond(200000000), config.stream_throughput_outbound);
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound(24L  * 1024L * 1024L), config.inter_dc_stream_throughput_outbound);
+        assertNull(config.commitlog_total_space);
+        assertEquals(new DurationSpec.IntMillisecondsBound(0.0, TimeUnit.MILLISECONDS), config.commitlog_sync_group_window);
+        assertEquals(new DurationSpec.IntMillisecondsBound(0), config.commitlog_sync_period);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(5), config.commitlog_segment_size);
+        assertNull(config.periodic_commitlog_sync_lag_block);  //Integer
+        assertNull(config.max_mutation_size);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(0), config.cdc_total_space);
+        assertEquals(new DurationSpec.IntMillisecondsBound(250), config.cdc_free_space_check_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(100), config.dynamic_snitch_update_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(600000), config.dynamic_snitch_reset_interval);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(1024), config.hinted_handoff_throttle);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(1024), config.batchlog_replay_throttle);
+        assertEquals(new DurationSpec.IntMillisecondsBound(10000), config.hints_flush_period);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(128), config.max_hints_file_size);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(10240), config.trickle_fsync_interval);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(50), config.sstable_preemptive_open_interval);
+        assertNull( config.key_cache_size);
+        assertEquals(new DataStorageSpec.LongMebibytesBound(16), config.row_cache_size);
+        assertNull(config.counter_cache_size);
+        assertNull(config.networking_cache_size);
+        assertNull(config.file_cache_size);
+        assertNull(config.index_summary_capacity);
+        assertEquals(new DurationSpec.IntMillisecondsBound(200), config.gc_log_threshold);
+        assertEquals(new DurationSpec.IntMillisecondsBound(1000), config.gc_warn_threshold);
+        assertEquals(new DurationSpec.IntSecondsBound(86400), config.trace_type_query_ttl);
+        assertEquals(new DurationSpec.IntSecondsBound(604800), config.trace_type_repair_ttl);
+        assertNull(config.prepared_statements_cache_size);
+        assertTrue(config.user_defined_functions_enabled);
+        assertTrue(config.scripted_user_defined_functions_enabled);
+        assertTrue(config.materialized_views_enabled);
+        assertFalse(config.transient_replication_enabled);
+        assertTrue(config.sasi_indexes_enabled);
+        assertTrue(config.drop_compact_storage_enabled);
+        assertTrue(config.user_defined_functions_threads_enabled);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.permissions_validity);
+        assertNull(config.permissions_update_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.roles_validity);
+        assertNull(config.roles_update_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.credentials_validity);
+        assertNull(config.credentials_update_interval);
+        assertEquals(new DurationSpec.IntMinutesBound(60), config.index_summary_resize_interval);
+
+        //parameters which names have not changed with CASSANDRA-15234
+        assertEquals(DurationSpec.IntSecondsBound.inSecondsString("14400"), config.key_cache_save_period);
+        assertEquals(DurationSpec.IntSecondsBound.inSecondsString("14400s"), config.key_cache_save_period);
+        assertEquals(new DurationSpec.IntSecondsBound(4, TimeUnit.HOURS), config.key_cache_save_period);
+        assertEquals(DurationSpec.IntSecondsBound.inSecondsString("0"), config.row_cache_save_period);
+        assertEquals(new DurationSpec.IntSecondsBound(0), config.row_cache_save_period);
+        assertEquals(new DurationSpec.IntSecondsBound(2, TimeUnit.HOURS), config.counter_cache_save_period);
+        assertEquals(new DurationSpec.IntSecondsBound(35), config.cache_load_timeout);
     }
 }
diff --git a/test/unit/org/apache/cassandra/config/LoaderTest.java b/test/unit/org/apache/cassandra/config/LoaderTest.java
new file mode 100644
index 0000000..5637e98
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/LoaderTest.java
@@ -0,0 +1,59 @@
+/*
+ * 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.config;
+
+import java.util.Map;
+import java.util.Set;
+import java.util.TreeSet;
+
+import org.junit.Test;
+
+import org.assertj.core.api.Assertions;
+import org.yaml.snakeyaml.introspector.Property;
+
+public class LoaderTest
+{
+    /**
+     * This test mostly validates that DefaultLoader will match what SnakeYAML would do (if camel casing gets converted to snake),
+     * if this test fails it is likely a new property was added and not properly picked up by one of the two implementations;
+     * if you added a property and now this test is failing, make sure to follow all of the following rules:
+     *
+     * 1) public field
+     * 2) getter AND setter
+     * 3) if getter of Boolean, use "get" prefix rather than "is"
+     */
+    @Test
+    public void allMatchProperties()
+    {
+        Class<?> klass = Config.class;
+        // treeset makes error cleaner to read
+        Set<String> properties = defaultImpl(klass).keySet();
+        Assertions.assertThat(new TreeSet<>(properties))
+                  .isEqualTo(new TreeSet<>(snake(klass).keySet()));
+    }
+
+    private static Map<String, Property> snake(Class<?> klass)
+    {
+        return new SnakeYamlLoader().flatten(klass);
+    }
+
+    private static Map<String, Property> defaultImpl(Class<?> klass)
+    {
+        return new DefaultLoader().flatten(klass);
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java b/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java
index e0a5576..2ffe91b 100644
--- a/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java
+++ b/test/unit/org/apache/cassandra/config/OverrideConfigurationLoader.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.config;
 
 import java.util.function.Consumer;
-import java.util.function.Function;
 
 import org.apache.cassandra.exceptions.ConfigurationException;
 
diff --git a/test/unit/org/apache/cassandra/config/ParseAndConvertUnitsTest.java b/test/unit/org/apache/cassandra/config/ParseAndConvertUnitsTest.java
new file mode 100644
index 0000000..a21f235
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/ParseAndConvertUnitsTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.config;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.MEBIBYTES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+public class ParseAndConvertUnitsTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    // CASSANDRA-15234
+    @Test
+    public void testConfigurationLoaderParser()
+    {
+        Config config = DatabaseDescriptor.loadConfig();
+
+        //Confirm duration parameters were successfully parsed with the default values in cassandra.yaml
+        assertEquals(new DurationSpec.IntMillisecondsBound(10800000), config.max_hint_window);
+        assertEquals(new DurationSpec.LongMillisecondsBound(0), config.native_transport_idle_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(10000), config.request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(5000), config.read_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(10000), config.range_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(2000), config.write_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(5000), config.counter_write_request_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(1800), config.cas_contention_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(60000), config.truncate_request_timeout);
+        assertEquals(new DurationSpec.IntSecondsBound(300), config.streaming_keep_alive_period);
+        assertEquals(new DurationSpec.LongMillisecondsBound(500), config.slow_query_log_timeout);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.internode_tcp_connect_timeout);
+        assertEquals(new DurationSpec.IntMillisecondsBound(30000), config.internode_tcp_user_timeout);
+        assertEquals(new DurationSpec.IntMillisecondsBound(0), config.commitlog_sync_group_window);
+        assertEquals(new DurationSpec.IntMillisecondsBound(0), config.commitlog_sync_period);
+        assertNull(config.periodic_commitlog_sync_lag_block);
+        assertEquals(new DurationSpec.IntMillisecondsBound(250), config.cdc_free_space_check_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(100), config.dynamic_snitch_update_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(600000), config.dynamic_snitch_reset_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(200), config.gc_log_threshold);
+        assertEquals(new DurationSpec.IntMillisecondsBound(10000), config.hints_flush_period);
+        assertEquals(new DurationSpec.IntMillisecondsBound(1000), config.gc_warn_threshold);
+        assertEquals(new DurationSpec.IntSecondsBound(86400), config.trace_type_query_ttl);
+        assertEquals(new DurationSpec.IntSecondsBound(604800), config.trace_type_repair_ttl);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.permissions_validity);
+        assertNull(config.permissions_update_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.roles_validity);
+        assertNull(config.roles_update_interval);
+        assertEquals(new DurationSpec.IntMillisecondsBound(2000), config.credentials_validity);
+        assertNull(config.credentials_update_interval);
+        assertEquals(new DurationSpec.IntMinutesBound(60), config.index_summary_resize_interval);
+        assertEquals(DurationSpec.IntSecondsBound.inSecondsString("4h"), config.key_cache_save_period);
+        assertEquals(new DurationSpec.IntSecondsBound(30), config.cache_load_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(1500), config.user_defined_functions_fail_timeout);
+        assertEquals(new DurationSpec.LongMillisecondsBound(500), config.user_defined_functions_warn_timeout);
+        assertEquals(new DurationSpec.IntSecondsBound(3600), config.validation_preview_purge_head_start);
+
+        //Confirm space parameters were successfully parsed with the default values in cassandra.yaml
+        assertNull(config.memtable_heap_space);
+        assertNull(config.memtable_offheap_space);
+        assertNull(config.repair_session_space); //null everywhere so should be correct, let's check whether it will bomb
+        assertEquals(new DataStorageSpec.IntBytesBound(4194304), config.internode_application_send_queue_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(134217728), config.internode_application_send_queue_reserve_endpoint_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(536870912), config.internode_application_send_queue_reserve_global_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(4194304), config.internode_application_receive_queue_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(134217728), config.internode_application_receive_queue_reserve_endpoint_capacity);
+        assertEquals(new DataStorageSpec.IntBytesBound(536870912), config.internode_application_receive_queue_reserve_global_capacity);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(16), config.native_transport_max_frame_size);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(256), config.max_value_size);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(4), config.column_index_size);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(2), config.column_index_cache_size);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(5), config.batch_size_warn_threshold);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(50), config.batch_size_fail_threshold);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(100), config.compaction_large_partition_warning_threshold);
+        assertNull(config.commitlog_total_space);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(5), config.commitlog_segment_size);
+        assertNull(config.max_mutation_size); //not set explicitly in the default yaml, check the config; not set there too
+        assertEquals(new DataStorageSpec.IntMebibytesBound(0), config.cdc_total_space);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(1024), config.hinted_handoff_throttle);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(1024), config.batchlog_replay_throttle);
+        assertEquals(new DataStorageSpec.IntKibibytesBound(10240), config.trickle_fsync_interval);
+        assertEquals(new DataStorageSpec.IntMebibytesBound(50), config.sstable_preemptive_open_interval);
+        assertNull(config.counter_cache_size);
+        assertNull(config.file_cache_size);
+        assertNull(config.index_summary_capacity);
+        assertEquals(new DataStorageSpec.LongMebibytesBound(1), config.prepared_statements_cache_size);
+        assertNull(config.key_cache_size);
+        assertEquals(new DataStorageSpec.LongMebibytesBound(16), config.row_cache_size);
+        assertNull(config.native_transport_max_request_data_in_flight);
+        assertNull(config.native_transport_max_request_data_in_flight_per_ip);
+        assertEquals(new DataStorageSpec.IntBytesBound(1, MEBIBYTES), config.native_transport_receive_queue_capacity);
+
+        //Confirm rate parameters were successfully parsed with the default values in cassandra.yaml
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound(0), config.compaction_throughput);
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound(23841858, DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND), config.stream_throughput_outbound);
+        assertEquals(new DataRateSpec.LongBytesPerSecondBound(24, DataRateSpec.DataRateUnit.MEBIBYTES_PER_SECOND), config.inter_dc_stream_throughput_outbound);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/PropertiesTest.java b/test/unit/org/apache/cassandra/config/PropertiesTest.java
new file mode 100644
index 0000000..6fec2df
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/PropertiesTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.config;
+
+import java.util.Map;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Sets;
+import org.junit.Test;
+
+import org.yaml.snakeyaml.introspector.Property;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class PropertiesTest
+{
+    private final Loader loader = Properties.defaultLoader();
+
+    @Test
+    public void backAndForth() throws Exception
+    {
+        Map<String, Property> ps = loader.flatten(Config.class);
+
+        Config config = new Config();
+        Set<String> keys = ImmutableSet.of("server_encryption_options.enabled",
+                                           "client_encryption_options.enabled",
+                                           "server_encryption_options.optional",
+                                           "client_encryption_options.optional");
+        for (Property prop : ps.values())
+        {
+            // skip these properties as they don't allow get/set within the context of this test
+            if (keys.contains(prop.getName()))
+                continue;
+            Object value = prop.get(config);
+            if (value == null)
+                continue;
+            prop.set(config, value);
+            Object back = prop.get(config);
+            assertThat(back).isEqualTo(value);
+        }
+    }
+
+    @Test
+    public void configMutate() throws Exception
+    {
+        Map<String, Property> ps = loader.getProperties(Config.class);
+        assertThat(ps)
+                  .isNotEmpty()
+                  .containsKey("cluster_name") // string / primitive
+                  .containsKey("permissions_validity") // SmallestDurationSeconds
+                  .containsKey("hinted_handoff_disabled_datacenters") // set<string>
+                  .containsKey("disk_access_mode"); // enum
+
+        // can we mutate the config?
+        Config config = new Config();
+
+        ps.get("cluster_name").set(config, "properties testing");
+        assertThat(config.cluster_name).isEqualTo("properties testing");
+
+        ps.get("permissions_validity").set(config, new DurationSpec.IntMillisecondsBound(42));
+        assertThat(config.permissions_validity.toMilliseconds()).isEqualTo(42);
+
+        ps.get("hinted_handoff_disabled_datacenters").set(config, Sets.newHashSet("a", "b", "c"));
+        assertThat(config.hinted_handoff_disabled_datacenters).isEqualTo(Sets.newHashSet("a", "b", "c"));
+
+        ps.get("disk_access_mode").set(config, Config.DiskAccessMode.mmap);
+        assertThat(config.disk_access_mode).isEqualTo(Config.DiskAccessMode.mmap);
+    }
+
+    @Test
+    public void nestedMutate() throws Exception
+    {
+        Map<String, Property> ps = loader.flatten(Config.class);
+
+        assertThat(ps)
+        .containsKey("seed_provider.class_name");
+
+        // can we mutate the config?
+        Config config = new Config();
+
+        ps.get("seed_provider.class_name").set(config, "testing");
+        assertThat(config.seed_provider.class_name).isEqualTo("testing");
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/config/SnakeYamlLoader.java b/test/unit/org/apache/cassandra/config/SnakeYamlLoader.java
new file mode 100644
index 0000000..90c9a1c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/SnakeYamlLoader.java
@@ -0,0 +1,90 @@
+/*
+ * 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.config;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import org.yaml.snakeyaml.error.YAMLException;
+import org.yaml.snakeyaml.introspector.BeanAccess;
+import org.yaml.snakeyaml.introspector.Property;
+import org.yaml.snakeyaml.introspector.PropertyUtils;
+
+import static org.apache.cassandra.utils.FBUtilities.camelToSnake;
+
+public final class SnakeYamlLoader implements Loader
+{
+    private final Helper helper = new Helper();
+
+    @Override
+    public Map<String, Property> getProperties(Class<?> root)
+    {
+        return helper.getPropertiesMap(root, BeanAccess.DEFAULT);
+    }
+
+    private static class Helper extends PropertyUtils
+    {
+        @Override
+        public Map<String, Property> getPropertiesMap(Class<?> type, BeanAccess bAccess)
+        {
+            Map<String, Property> map;
+            try
+            {
+                map = super.getPropertiesMap(type, bAccess);
+            }
+            catch (YAMLException e)
+            {
+                // some classes take a string in constructor and output as toString, these should be treated like
+                // primitive types
+                if (e.getMessage() != null && e.getMessage().startsWith("No JavaBean properties found"))
+                    return Collections.emptyMap();
+                throw e;
+            }
+            // filter out ignores
+            Set<String> ignore = new HashSet<>();
+            Map<String, String> rename = new HashMap<>();
+            map.values().forEach(p -> {
+                if (shouldIgnore(p))
+                {
+                    ignore.add(p.getName());
+                    return;
+                }
+                String snake = camelToSnake(p.getName());
+                if (!p.getName().equals(snake))
+                {
+                    if (map.containsKey(snake))
+                        ignore.add(p.getName());
+                    else
+                        rename.put(p.getName(), snake);
+                }
+            });
+            ignore.forEach(map::remove);
+            rename.forEach((previous, desired) -> map.put(desired, map.remove(previous)));
+            return map;
+        }
+
+        private static boolean shouldIgnore(Property p)
+        {
+            return !p.isWritable() || p.getAnnotation(JsonIgnore.class) != null;
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/StartupCheckOptionsTest.java b/test/unit/org/apache/cassandra/config/StartupCheckOptionsTest.java
new file mode 100644
index 0000000..f613c0e
--- /dev/null
+++ b/test/unit/org/apache/cassandra/config/StartupCheckOptionsTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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.config;
+
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+
+import org.apache.cassandra.service.DataResurrectionCheck;
+import org.apache.cassandra.service.StartupChecks.StartupCheckType;
+import org.apache.cassandra.utils.Pair;
+
+import static org.apache.cassandra.config.StartupChecksOptions.ENABLED_PROPERTY;
+import static org.apache.cassandra.service.StartupChecks.StartupCheckType.check_filesystem_ownership;
+import static org.apache.cassandra.service.StartupChecks.StartupCheckType.non_configurable_check;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class StartupCheckOptionsTest
+{
+    @Test
+    public void testStartupOptionsConfigApplication()
+    {
+        Map<StartupCheckType, Map<String, Object>> config = new EnumMap<StartupCheckType, Map<String, Object>>(StartupCheckType.class) {{
+            put(check_filesystem_ownership, new HashMap<String, Object>() {{
+                put(ENABLED_PROPERTY, true);
+                put("key", "value");
+            }});
+        }};
+
+        StartupChecksOptions options = new StartupChecksOptions(config);
+
+        assertTrue(Boolean.parseBoolean(options.getConfig(check_filesystem_ownership)
+                                               .get(ENABLED_PROPERTY)
+                                               .toString()));
+
+        assertEquals("value", options.getConfig(check_filesystem_ownership).get("key"));
+        options.set(check_filesystem_ownership, "key", "value2");
+        assertEquals("value2", options.getConfig(check_filesystem_ownership).get("key"));
+
+        assertTrue(options.isEnabled(check_filesystem_ownership));
+        options.disable(check_filesystem_ownership);
+        assertFalse(options.isEnabled(check_filesystem_ownership));
+        assertTrue(options.isDisabled(check_filesystem_ownership));
+    }
+
+    @Test
+    public void testNoOptions()
+    {
+        StartupChecksOptions options = new StartupChecksOptions();
+
+        assertTrue(options.isEnabled(non_configurable_check));
+
+        // disabling does not to anything on non-configurable check
+        options.disable(non_configurable_check);
+        assertTrue(options.isEnabled(non_configurable_check));
+
+        options.set(non_configurable_check, "key", "value");
+
+        // we can not put anything into non-configurable check
+        assertFalse(options.getConfig(non_configurable_check).containsKey("key"));
+    }
+
+    @Test
+    public void testEmptyDisabledValues()
+    {
+        Map<StartupCheckType, Map<String, Object>> emptyConfig = new EnumMap<StartupCheckType, Map<String, Object>>(StartupCheckType.class) {{
+            put(check_filesystem_ownership, new HashMap<>());
+        }};
+
+        Map<StartupCheckType, Map<String, Object>> emptyEnabledConfig = new EnumMap<StartupCheckType, Map<String, Object>>(StartupCheckType.class) {{
+            put(check_filesystem_ownership, new HashMap<String, Object>() {{
+                put(ENABLED_PROPERTY, null);
+            }});
+        }};
+
+        // empty enabled property or enabled property with null value are still counted as enabled
+
+        StartupChecksOptions options1 = new StartupChecksOptions(emptyConfig);
+        assertTrue(options1.isDisabled(check_filesystem_ownership));
+
+        StartupChecksOptions options2 = new StartupChecksOptions(emptyEnabledConfig);
+        assertTrue(options2.isDisabled(check_filesystem_ownership));
+    }
+
+    @Test
+    public void testChecksDisabledByDefaultAreNotEnabled()
+    {
+        Map<StartupCheckType, Map<String, Object>> emptyConfig = new EnumMap<>(StartupCheckType.class);
+        StartupChecksOptions options = new StartupChecksOptions(emptyConfig);
+        assertTrue(options.isDisabled(check_filesystem_ownership));
+    }
+
+    @Test
+    public void testExcludedKeyspacesInDataResurrectionCheckOptions()
+    {
+        Map<String, Object> config = new HashMap<String, Object>(){{
+            put("excluded_keyspaces", "ks1,ks2,ks3");
+        }};
+        DataResurrectionCheck check = new DataResurrectionCheck();
+        check.getExcludedKeyspaces(config);
+
+        Set<String> excludedKeyspaces = check.getExcludedKeyspaces(config);
+        assertEquals(3, excludedKeyspaces.size());
+        assertTrue(excludedKeyspaces.contains("ks1"));
+        assertTrue(excludedKeyspaces.contains("ks2"));
+        assertTrue(excludedKeyspaces.contains("ks3"));
+    }
+
+    @Test
+    public void testExcludedTablesInDataResurrectionCheckOptions()
+    {
+        for (String input : new String[]{
+        "ks1.tb1,ks1.tb2,ks3.tb3",
+        " ks1 . tb1,  ks1 .tb2  ,ks3 .tb3  "
+        })
+        {
+            Map<String, Object> config = new HashMap<String, Object>(){{
+                put("excluded_tables", input);
+            }};
+
+            DataResurrectionCheck check = new DataResurrectionCheck();
+            Set<Pair<String, String>> excludedTables = check.getExcludedTables(config);
+            assertEquals(3, excludedTables.size());
+            assertTrue(excludedTables.contains(Pair.create("ks1", "tb1")));
+            assertTrue(excludedTables.contains(Pair.create("ks1", "tb2")));
+            assertTrue(excludedTables.contains(Pair.create("ks3", "tb3")));
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java b/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java
index 3b7e64e..06be1dc 100644
--- a/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java
+++ b/test/unit/org/apache/cassandra/config/YamlConfigurationLoaderTest.java
@@ -18,18 +18,205 @@
 
 package org.apache.cassandra.config;
 
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Predicate;
 
 import com.google.common.collect.ImmutableMap;
 import org.junit.Test;
 
+import org.apache.cassandra.distributed.shared.WithProperties;
+import org.apache.cassandra.io.util.File;
+import org.yaml.snakeyaml.error.YAMLException;
+
+import static org.apache.cassandra.config.CassandraRelevantProperties.CONFIG_ALLOW_SYSTEM_PROPERTIES;
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.KIBIBYTES;
+import static org.apache.cassandra.config.YamlConfigurationLoader.SYSTEM_PROPERTY_PREFIX;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 
 public class YamlConfigurationLoaderTest
 {
     @Test
+    public void validateTypes()
+    {
+        Predicate<Field> isDurationSpec = f -> f.getType().getTypeName().equals("org.apache.cassandra.config.DurationSpec");
+        Predicate<Field> isDataStorageSpec = f -> f.getType().getTypeName().equals("org.apache.cassandra.config.DataStorageSpec");
+        Predicate<Field> isDataRateSpec = f -> f.getType().getTypeName().equals("org.apache.cassandra.config.DataRateSpec");
+
+        assertEquals("You have wrongly defined a config parameter of abstract type DurationSpec, DataStorageSpec or DataRateSpec." +
+                     "Please check the config docs, otherwise Cassandra won't be able to start with this parameter being set in cassandra.yaml.",
+                     Arrays.stream(Config.class.getFields())
+                    .filter(f -> !Modifier.isStatic(f.getModifiers()))
+                    .filter(isDurationSpec.or(isDataRateSpec).or(isDataStorageSpec)).count(), 0);
+    }
+
+    @Test
+    public void updateInPlace()
+    {
+        Config config = new Config();
+        Map<String, Object> map = ImmutableMap.<String, Object>builder().put("storage_port", 123)
+                                                                        .put("commitlog_sync", Config.CommitLogSync.batch)
+                                                                        .put("seed_provider.class_name", "org.apache.cassandra.locator.SimpleSeedProvider")
+                                                                        .put("client_encryption_options.cipher_suites", Collections.singletonList("FakeCipher"))
+                                                                        .put("client_encryption_options.optional", false)
+                                                                        .put("client_encryption_options.enabled", true)
+                                                                        .build();
+        Config updated = YamlConfigurationLoader.updateFromMap(map, true, config);
+        assert updated == config : "Config pointers do not match";
+        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();
+    }
+
+    @Test
+    public void withSystemProperties()
+    {
+        // for primitive types or data-types which use a String constructor, we can support these as nested
+        // if the type is a collection, then the string format doesn't make sense and will fail with an error such as
+        //   Cannot create property=client_encryption_options.cipher_suites for JavaBean=org.apache.cassandra.config.Config@1f59a598
+        //   No single argument constructor found for interface java.util.List : null
+        // 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"
+        ))
+        {
+            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();
+        }
+    }
+
+    @Test
+    public void readConvertersSpecialCasesFromConfig()
+    {
+        Config c = load("test/conf/cassandra-converters-special-cases.yaml");
+        assertThat(c.sstable_preemptive_open_interval).isNull();
+        assertThat(c.index_summary_resize_interval).isNull();
+        assertThat(c.cache_load_timeout).isEqualTo(new DurationSpec.IntSecondsBound("0s"));
+
+        c = load("test/conf/cassandra-converters-special-cases-old-names.yaml");
+        assertThat(c.sstable_preemptive_open_interval).isNull();
+        assertThat(c.index_summary_resize_interval).isNull();
+        assertThat(c.cache_load_timeout).isEqualTo(new DurationSpec.IntSecondsBound("0s"));
+    }
+
+    @Test
+    public void readConvertersSpecialCasesFromMap()
+    {
+        Map<String, Object> map = new HashMap<>();
+        map.put("sstable_preemptive_open_interval", null);
+        map.put("index_summary_resize_interval", null);
+        map.put("credentials_update_interval", null);
+
+        Config c = YamlConfigurationLoader.fromMap(map, true, Config.class);
+        assertThat(c.sstable_preemptive_open_interval).isNull();
+        assertThat(c.index_summary_resize_interval).isNull();
+        assertThat(c.credentials_update_interval).isNull();
+
+        map = ImmutableMap.of(
+        "sstable_preemptive_open_interval_in_mb", "-1",
+        "index_summary_resize_interval_in_minutes", "-1",
+        "cache_load_timeout_seconds", "-1",
+        "credentials_update_interval_in_ms", "-1"
+        );
+        c = YamlConfigurationLoader.fromMap(map, Config.class);
+
+        assertThat(c.sstable_preemptive_open_interval).isNull();
+        assertThat(c.index_summary_resize_interval).isNull();
+        assertThat(c.cache_load_timeout).isEqualTo(new DurationSpec.IntSecondsBound("0s"));
+        assertThat(c.credentials_update_interval).isNull();
+    }
+
+    @Test
+    public void readThresholdsFromConfig()
+    {
+        Config c = load("test/conf/cassandra.yaml");
+
+        assertThat(c.read_thresholds_enabled).isTrue();
+
+        assertThat(c.coordinator_read_size_warn_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1 << 10, KIBIBYTES));
+        assertThat(c.coordinator_read_size_fail_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1 << 12, KIBIBYTES));
+
+        assertThat(c.local_read_size_warn_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1 << 12, KIBIBYTES));
+        assertThat(c.local_read_size_fail_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1 << 13, KIBIBYTES));
+
+        assertThat(c.row_index_read_size_warn_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1 << 12, KIBIBYTES));
+        assertThat(c.row_index_read_size_fail_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1 << 13, KIBIBYTES));
+    }
+
+    @Test
+    public void readThresholdsFromMap()
+    {
+
+        Map<String, Object> map = ImmutableMap.of(
+        "read_thresholds_enabled", true,
+        "coordinator_read_size_warn_threshold", "1024KiB",
+        "local_read_size_fail_threshold", "1024KiB",
+        "row_index_read_size_warn_threshold", "1024KiB",
+        "row_index_read_size_fail_threshold", "1024KiB"
+        );
+
+        Config c = YamlConfigurationLoader.fromMap(map, Config.class);
+        assertThat(c.read_thresholds_enabled).isTrue();
+
+        assertThat(c.coordinator_read_size_warn_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1024, KIBIBYTES));
+        assertThat(c.coordinator_read_size_fail_threshold).isNull();
+
+        assertThat(c.local_read_size_warn_threshold).isNull();
+        assertThat(c.local_read_size_fail_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1024, KIBIBYTES));
+
+        assertThat(c.row_index_read_size_warn_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1024, KIBIBYTES));
+        assertThat(c.row_index_read_size_fail_threshold).isEqualTo(new DataStorageSpec.LongBytesBound(1024, KIBIBYTES));
+    }
+
+    @Test
+    public void notNullableLegacyProperties()
+    {
+        // In  the past commitlog_sync_period and commitlog_sync_group_window were int in Config. So that meant they can't
+        // be assigned null value from the yaml file. To ensure this behavior was not changed when we moved to DurationSpec
+        // in CASSANDRA-15234, we assigned those 0 value.
+
+        Map<String, Object> map = ImmutableMap.of(
+        "commitlog_sync_period", ""
+        );
+        try
+        {
+            Config config = YamlConfigurationLoader.fromMap(map, Config.class);
+        }
+        catch (YAMLException e)
+        {
+            assertTrue(e.getMessage().contains("Cannot create property=commitlog_sync_period for JavaBean=org.apache.cassandra.config.Config"));
+        }
+
+        // loadConfig will catch this exception on startup and throw a ConfigurationException
+    }
+
+    @Test
     public void fromMapTest()
     {
         int storagePort = 123;
@@ -43,8 +230,9 @@
                                  .put("commitlog_sync", commitLogSync)
                                  .put("seed_provider", seedProvider)
                                  .put("client_encryption_options", encryptionOptions)
-                                 .put("internode_send_buff_size_in_bytes", 5)
-                                 .put("internode_recv_buff_size_in_bytes", 5)
+                                 .put("internode_socket_send_buffer_size", "5B")
+                                 .put("internode_socket_receive_buffer_size", "5B")
+                                 .put("commitlog_sync_group_window_in_ms", "42")
                                  .build();
 
         Config config = YamlConfigurationLoader.fromMap(map, Config.class);
@@ -53,7 +241,147 @@
         assertEquals(seedProvider, config.seed_provider); // Check a parameterized class
         assertEquals(false, config.client_encryption_options.optional); // Check a nested object
         assertEquals(true, config.client_encryption_options.enabled); // Check a nested object
-        assertEquals(5, config.internode_socket_send_buffer_size_in_bytes); // Check names backward compatibility (CASSANDRA-17141)
-        assertEquals(5, config.internode_socket_receive_buffer_size_in_bytes); // Check names backward compatibility (CASSANDRA-17141)
+        assertEquals(new DataStorageSpec.IntBytesBound("5B"), config.internode_socket_send_buffer_size); // Check names backward compatibility (CASSANDRA-17141 and CASSANDRA-15234)
+        assertEquals(new DataStorageSpec.IntBytesBound("5B"), config.internode_socket_receive_buffer_size); // Check names backward compatibility (CASSANDRA-17141 and CASSANDRA-15234)
+    }
+
+    @Test
+    public void typeChange()
+    {
+        Config old = YamlConfigurationLoader.fromMap(ImmutableMap.of("key_cache_save_period", 42,
+                                                                     "row_cache_save_period", 42,
+                                                                     "counter_cache_save_period", 42), Config.class);
+        Config latest = YamlConfigurationLoader.fromMap(ImmutableMap.of("key_cache_save_period", "42s",
+                                                                        "row_cache_save_period", "42s",
+                                                                        "counter_cache_save_period", "42s"), Config.class);
+        assertThat(old.key_cache_save_period).isEqualTo(latest.key_cache_save_period).isEqualTo(new DurationSpec.IntSecondsBound(42));
+        assertThat(old.row_cache_save_period).isEqualTo(latest.row_cache_save_period).isEqualTo(new DurationSpec.IntSecondsBound(42));
+        assertThat(old.counter_cache_save_period).isEqualTo(latest.counter_cache_save_period).isEqualTo(new DurationSpec.IntSecondsBound(42));
+    }
+
+    @Test
+    public void sharedErrorReportingExclusions()
+    {
+        Config config = load("data/config/YamlConfigurationLoaderTest/shared_client_error_reporting_exclusions.yaml");
+        SubnetGroups expected = new SubnetGroups(Arrays.asList("127.0.0.1", "127.0.0.0/31"));
+        assertThat(config.client_error_reporting_exclusions).isEqualTo(expected);
+        assertThat(config.internode_error_reporting_exclusions).isEqualTo(expected);
+    }
+
+    @Test
+    public void converters()
+    {
+        // MILLIS_DURATION
+        assertThat(from("permissions_validity_in_ms", "42").permissions_validity.toMilliseconds()).isEqualTo(42);
+        assertThatThrownBy(() -> from("permissions_validity", -2).permissions_validity.toMilliseconds())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid duration: -2 Accepted units:[MILLISECONDS, SECONDS, MINUTES, HOURS, DAYS] where case matters and only non-negative values.");
+
+        // MILLIS_DOUBLE_DURATION
+        assertThat(from("commitlog_sync_group_window_in_ms", "42").commitlog_sync_group_window.toMilliseconds()).isEqualTo(42);
+        assertThat(from("commitlog_sync_group_window_in_ms", "0.2").commitlog_sync_group_window.toMilliseconds()).isEqualTo(0);
+        assertThat(from("commitlog_sync_group_window_in_ms", "42.5").commitlog_sync_group_window.toMilliseconds()).isEqualTo(43);
+        assertThat(from("commitlog_sync_group_window_in_ms", "NaN").commitlog_sync_group_window.toMilliseconds()).isEqualTo(0);
+        assertThatThrownBy(() -> from("commitlog_sync_group_window_in_ms", -2).commitlog_sync_group_window.toMilliseconds())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid duration: value must be non-negative");
+
+        // MILLIS_CUSTOM_DURATION
+        assertThat(from("permissions_update_interval_in_ms", 42).permissions_update_interval).isEqualTo(new DurationSpec.IntMillisecondsBound(42));
+        assertThat(from("permissions_update_interval_in_ms", -1).permissions_update_interval).isNull();
+        assertThatThrownBy(() -> from("permissions_update_interval_in_ms", -2))
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid duration: value must be non-negative");
+
+        // SECONDS_DURATION
+        assertThat(from("streaming_keep_alive_period_in_secs", "42").streaming_keep_alive_period.toSeconds()).isEqualTo(42);
+        assertThatThrownBy(() -> from("streaming_keep_alive_period_in_secs", -2).streaming_keep_alive_period.toSeconds())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid duration: value must be non-negative");
+
+        // NEGATIVE_SECONDS_DURATION
+        assertThat(from("validation_preview_purge_head_start_in_sec", -1).validation_preview_purge_head_start.toSeconds()).isEqualTo(0);
+        assertThat(from("validation_preview_purge_head_start_in_sec", 0).validation_preview_purge_head_start.toSeconds()).isEqualTo(0);
+        assertThat(from("validation_preview_purge_head_start_in_sec", 42).validation_preview_purge_head_start.toSeconds()).isEqualTo(42);
+
+        // SECONDS_CUSTOM_DURATION already tested in type change
+
+        // MINUTES_CUSTOM_DURATION
+        assertThat(from("index_summary_resize_interval_in_minutes", "42").index_summary_resize_interval.toMinutes()).isEqualTo(42);
+        assertThat(from("index_summary_resize_interval_in_minutes", "-1").index_summary_resize_interval).isNull();
+        assertThatThrownBy(() -> from("index_summary_resize_interval_in_minutes", -2).index_summary_resize_interval.toMinutes())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid duration: value must be non-negative");
+
+        // BYTES_CUSTOM_DATASTORAGE
+        assertThat(from("native_transport_max_concurrent_requests_in_bytes_per_ip", -1).native_transport_max_request_data_in_flight_per_ip).isEqualTo(null);
+        assertThat(from("native_transport_max_concurrent_requests_in_bytes_per_ip", 0).native_transport_max_request_data_in_flight_per_ip.toBytes()).isEqualTo(0);
+        assertThat(from("native_transport_max_concurrent_requests_in_bytes_per_ip", 42).native_transport_max_request_data_in_flight_per_ip.toBytes()).isEqualTo(42);
+
+        // MEBIBYTES_DATA_STORAGE
+        assertThat(from("memtable_heap_space_in_mb", "42").memtable_heap_space.toMebibytes()).isEqualTo(42);
+        assertThatThrownBy(() -> from("memtable_heap_space_in_mb", -2).memtable_heap_space.toMebibytes())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid data storage: value must be non-negative");
+
+        // KIBIBYTES_DATASTORAGE
+        assertThat(from("column_index_size_in_kb", "42").column_index_size.toKibibytes()).isEqualTo(42);
+        assertThatThrownBy(() -> from("column_index_size_in_kb", -2).column_index_size.toKibibytes())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid data storage: value must be non-negative");
+
+        // BYTES_DATASTORAGE
+        assertThat(from("internode_max_message_size_in_bytes", "42").internode_max_message_size.toBytes()).isEqualTo(42);
+        assertThatThrownBy(() -> from("internode_max_message_size_in_bytes", -2).internode_max_message_size.toBytes())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid data storage: value must be non-negative");
+
+        // BYTES_DATASTORAGE
+        assertThat(from("internode_max_message_size_in_bytes", "42").internode_max_message_size.toBytes()).isEqualTo(42);
+        assertThatThrownBy(() -> from("internode_max_message_size_in_bytes", -2).internode_max_message_size.toBytes())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid data storage: value must be non-negative");
+
+        // MEBIBYTES_PER_SECOND_DATA_RATE
+        assertThat(from("compaction_throughput_mb_per_sec", "42").compaction_throughput.toMebibytesPerSecondAsInt()).isEqualTo(42);
+        assertThatThrownBy(() -> from("compaction_throughput_mb_per_sec", -2).compaction_throughput.toMebibytesPerSecondAsInt())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid data rate: value must be non-negative");
+
+        // MEGABITS_TO_BYTES_PER_SECOND_DATA_RATE
+        assertThat(from("stream_throughput_outbound_megabits_per_sec", "42").stream_throughput_outbound.toMegabitsPerSecondAsInt()).isEqualTo(42);
+        assertThatThrownBy(() -> from("stream_throughput_outbound_megabits_per_sec", -2).stream_throughput_outbound.toMegabitsPerSecondAsInt())
+        .hasRootCauseInstanceOf(IllegalArgumentException.class)
+        .hasRootCauseMessage("Invalid data rate: value must be non-negative");
+
+        // NEGATIVE_MEBIBYTES_DATA_STORAGE_INT
+        assertThat(from("sstable_preemptive_open_interval_in_mb", "1").sstable_preemptive_open_interval.toMebibytes()).isEqualTo(1);
+        assertThat(from("sstable_preemptive_open_interval_in_mb", -2).sstable_preemptive_open_interval).isNull();
+    }
+
+    private static Config from(Object... values)
+    {
+        assert values.length % 2 == 0 : "Map can only be created with an even number of inputs: given " + values.length;
+        ImmutableMap.Builder<String, Object> builder = ImmutableMap.builder();
+        for (int i = 0; i < values.length; i += 2)
+            builder.put((String) values[i], values[i + 1]);
+        return YamlConfigurationLoader.fromMap(builder.build(), Config.class);
+    }
+
+    private static Config load(String path)
+    {
+        URL url = YamlConfigurationLoaderTest.class.getClassLoader().getResource(path);
+        if (url == null)
+        {
+            try
+            {
+                url = new File(path).toPath().toUri().toURL();
+            }
+            catch (MalformedURLException e)
+            {
+                throw new AssertionError(e);
+            }
+        }
+        return new YamlConfigurationLoader().loadConfig(url);
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/BatchTest.java b/test/unit/org/apache/cassandra/cql3/BatchTest.java
index 28b0d5c..330271e 100644
--- a/test/unit/org/apache/cassandra/cql3/BatchTest.java
+++ b/test/unit/org/apache/cassandra/cql3/BatchTest.java
@@ -22,9 +22,12 @@
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.exceptions.InvalidQueryException;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.service.EmbeddedCassandraService;
+
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -44,8 +47,7 @@
     @BeforeClass()
     public static void setup() throws ConfigurationException, IOException
     {
-        cassandra = new EmbeddedCassandraService();
-        cassandra.start();
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
 
         cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
         session = cluster.connect();
@@ -75,6 +77,15 @@
         clustering = session.prepare("insert into junit.clustering(id, clustering1, clustering2, clustering3, val) values(?,?,?,?,?)");
     }
 
+    @AfterClass
+    public static void tearDown()
+    {
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
+    }
+
     @Test(expected = InvalidQueryException.class)
     public void testMixedInCounterBatch()
     {
diff --git a/test/unit/org/apache/cassandra/cql3/CQL3TypeLiteralTest.java b/test/unit/org/apache/cassandra/cql3/CQL3TypeLiteralTest.java
index 8e6b761..f0d2c19 100644
--- a/test/unit/org/apache/cassandra/cql3/CQL3TypeLiteralTest.java
+++ b/test/unit/org/apache/cassandra/cql3/CQL3TypeLiteralTest.java
@@ -30,10 +30,11 @@
 
 import org.apache.cassandra.db.marshal.*;
 import org.apache.cassandra.serializers.*;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
 import static org.junit.Assert.assertEquals;
 
 /**
@@ -225,8 +226,8 @@
 
         for (int i = 0; i < 20; i++)
         {
-            UUID v = UUIDGen.getTimeUUID(randLong(System.currentTimeMillis()));
-            addNativeValue(v.toString(), CQL3Type.Native.TIMEUUID, TimeUUIDType.instance.decompose(v));
+            TimeUUID v = TimeUUID.Generator.atUnixMillis(randLong(currentTimeMillis()));
+            addNativeValue(v.toString(), CQL3Type.Native.TIMEUUID, v.toBytes());
         }
         addNativeValue("null", CQL3Type.Native.TIMEUUID, ByteBufferUtil.EMPTY_BYTE_BUFFER);
         addNativeValue("null", CQL3Type.Native.TIMEUUID, null);
diff --git a/test/unit/org/apache/cassandra/cql3/CQLTester.java b/test/unit/org/apache/cassandra/cql3/CQLTester.java
index dc6a55e..23b392f 100644
--- a/test/unit/org/apache/cassandra/cql3/CQLTester.java
+++ b/test/unit/org/apache/cassandra/cql3/CQLTester.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.cql3;
 
-import java.io.File;
 import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.BigInteger;
@@ -49,23 +48,37 @@
 import com.google.common.collect.Iterables;
 
 import org.junit.*;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import com.codahale.metrics.Gauge;
 import com.datastax.driver.core.*;
 import com.datastax.driver.core.DataType;
 import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.exceptions.UnauthorizedException;
 
 import com.datastax.shaded.netty.channel.EventLoopGroup;
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.auth.AuthCacheService;
+import org.apache.cassandra.auth.AuthKeyspace;
+import org.apache.cassandra.auth.AuthSchemaChangeListener;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.IRoleManager;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
 import org.apache.cassandra.db.virtual.VirtualSchemaKeyspace;
+import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.index.SecondaryIndexManager;
-import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.io.util.File;
 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;
@@ -90,23 +103,36 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JMXServerUtils;
+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 junit.framework.Assert.assertNotNull;
+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.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * Base class for CQL tests.
  */
 public abstract class CQLTester
 {
+    /**
+     * The super user
+     */
+    private static final User SUPER_USER = new User("cassandra", "cassandra");
+
     protected static final Logger logger = LoggerFactory.getLogger(CQLTester.class);
 
     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_MB = Integer.valueOf(System.getProperty("cassandra.test.row_cache_size_in_mb", "0"));
+    protected static final long ROW_CACHE_SIZE_IN_MIB = new DataStorageSpec.LongMebibytesBound(System.getProperty("cassandra.test.row_cache_size", "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;
@@ -122,8 +148,10 @@
     protected static final int nativePort;
     protected static final InetAddress nativeAddr;
     protected static final Set<InetAddressAndPort> remoteAddrs = new HashSet<>();
-    private static final Map<ProtocolVersion, Cluster> clusters = new HashMap<>();
-    protected static final Map<ProtocolVersion, Session> sessions = new HashMap<>();
+    private static final Map<Pair<User, ProtocolVersion>, Cluster> clusters = new HashMap<>();
+    private static final Map<Pair<User, ProtocolVersion>, Session> sessions = new HashMap<>();
+
+    private static Consumer<Cluster.Builder> clusterBuilderConfigurator;
 
     public static final List<ProtocolVersion> PROTOCOL_VERSIONS = new ArrayList<>(ProtocolVersion.SUPPORTED.size());
 
@@ -169,10 +197,13 @@
 
     private List<String> keyspaces = new ArrayList<>();
     private List<String> tables = new ArrayList<>();
+    private List<String> views = new ArrayList<>();
     private List<String> types = new ArrayList<>();
     private List<String> functions = new ArrayList<>();
     private List<String> aggregates = new ArrayList<>();
 
+    private User user;
+
     // We don't use USE_PREPARED_VALUES in the code below so some test can foce value preparation (if the result
     // is not expected to be the same without preparation)
     private boolean usePrepared = USE_PREPARED_VALUES;
@@ -184,12 +215,30 @@
     }
 
     /**
+     * Use the specified user for executing the queries over the network.
+     * @param username the user name
+     * @param password the user password
+     */
+    public void useUser(String username, String password)
+    {
+        this.user = new User(username, password);
+    }
+
+    /**
+     * Use the super user for executing the queries over the network.
+     */
+    public void useSuperUser()
+    {
+        this.user = SUPER_USER;
+    }
+
+    /**
      * Returns a port number that is automatically allocated,
      * typically from an ephemeral port range.
      *
      * @return a port number
      */
-    private static int getAutomaticallyAllocatedPort(InetAddress address)
+    public static int getAutomaticallyAllocatedPort(InetAddress address)
     {
         try
         {
@@ -269,8 +318,8 @@
     @BeforeClass
     public static void setUpClass()
     {
-        if (ROW_CACHE_SIZE_IN_MB > 0)
-            DatabaseDescriptor.setRowCacheSizeInMB(ROW_CACHE_SIZE_IN_MB);
+        if (ROW_CACHE_SIZE_IN_MIB > 0)
+            DatabaseDescriptor.setRowCacheSizeInMiB(ROW_CACHE_SIZE_IN_MIB);
         StorageService.instance.setPartitionerUnsafe(Murmur3Partitioner.instance);
 
         // Once per-JVM is enough
@@ -327,14 +376,17 @@
 
         final List<String> keyspacesToDrop = copy(keyspaces);
         final List<String> tablesToDrop = copy(tables);
+        final List<String> viewsToDrop = copy(views);
         final List<String> typesToDrop = copy(types);
         final List<String> functionsToDrop = copy(functions);
         final List<String> aggregatesToDrop = copy(aggregates);
         keyspaces = null;
         tables = null;
+        views = null;
         types = null;
         functions = null;
         aggregates = null;
+        user = null;
 
         // We want to clean up after the test, but dropping a table is rather long so just do that asynchronously
         ScheduledExecutors.optionalTasks.execute(new Runnable()
@@ -343,6 +395,9 @@
             {
                 try
                 {
+                    for (int i = viewsToDrop.size() - 1; i >= 0; i--)
+                        schemaChange(String.format("DROP MATERIALIZED VIEW IF EXISTS %s.%s", KEYSPACE, viewsToDrop.get(i)));
+
                     for (int i = tablesToDrop.size() - 1; i >= 0; i--)
                         schemaChange(String.format("DROP TABLE IF EXISTS %s.%s", KEYSPACE, tablesToDrop.get(i)));
 
@@ -385,12 +440,14 @@
 
     public static List<String> buildNodetoolArgs(List<String> args)
     {
+        int port = jmxPort == 0 ? Integer.getInteger("cassandra.jmx.local.port", 7199) : jmxPort;
+        String host = jmxHost == null ? "127.0.0.1" : jmxHost;
         List<String> allArgs = new ArrayList<>();
         allArgs.add("bin/nodetool");
         allArgs.add("-p");
-        allArgs.add(Integer.toString(jmxPort));
+        allArgs.add(String.valueOf(port));
         allArgs.add("-h");
-        allArgs.add(jmxHost == null ? "127.0.0.1" : jmxHost);
+        allArgs.add(host);
         allArgs.addAll(args);
         return allArgs;
     }
@@ -419,31 +476,59 @@
         return allArgs;
     }
 
-    protected static void requireNetworkWithoutDriver()
+    protected static void requireAuthentication()
     {
-        startServices();
-        startServer(server -> {});
+        DatabaseDescriptor.setAuthenticator(new AuthTestUtils.LocalPasswordAuthenticator());
+        DatabaseDescriptor.setAuthorizer(new AuthTestUtils.LocalCassandraAuthorizer());
+        DatabaseDescriptor.setNetworkAuthorizer(new AuthTestUtils.LocalCassandraNetworkAuthorizer());
+
+        // The CassandraRoleManager constructor set the supported and alterable options based on
+        // DatabaseDescriptor authenticator type so it needs to be created only after the authenticator is set.
+        IRoleManager roleManager =  new AuthTestUtils.LocalCassandraRoleManager()
+        {
+            public void setup()
+            {
+                loadRoleStatement();
+                QueryProcessor.executeInternal(createDefaultRoleQuery());
+            }
+        };
+
+        DatabaseDescriptor.setRoleManager(roleManager);
+        SchemaTestUtil.addOrUpdateKeyspace(AuthKeyspace.metadata(), true);
+        DatabaseDescriptor.getRoleManager().setup();
+        DatabaseDescriptor.getAuthenticator().setup();
+        DatabaseDescriptor.getAuthorizer().setup();
+        DatabaseDescriptor.getNetworkAuthorizer().setup();
+        Schema.instance.registerListener(new AuthSchemaChangeListener());
+
+        AuthCacheService.initializeAndRegisterCaches();
     }
 
-    // lazy initialization for all tests that require Java Driver
+    /**
+     *  Initialize Native Transport for test that need it.
+     */
     protected static void requireNetwork() throws ConfigurationException
     {
-        requireNetwork(server -> {});
+        requireNetwork(server -> {}, cluster -> {});
     }
 
-    // lazy initialization for all tests that require Java Driver
-    protected static void requireNetwork(Consumer<Server.Builder> decorator) throws ConfigurationException
+    /**
+     *  Initialize Native Transport for the tests that need it.
+     */
+    protected static void requireNetwork(Consumer<Server.Builder> serverConfigurator,
+                                         Consumer<Cluster.Builder> clusterConfigurator) throws ConfigurationException
     {
         if (server != null)
             return;
 
+        clusterBuilderConfigurator = clusterConfigurator;
+
         startServices();
-        initializeNetwork(decorator, null);
+        startServer(serverConfigurator);
     }
 
     private static void startServices()
     {
-        SystemKeyspace.finishStartup();
         VirtualKeyspaceRegistry.instance.register(VirtualSchemaKeyspace.instance);
         StorageService.instance.initServer();
         SchemaLoader.startGossiper();
@@ -451,10 +536,11 @@
 
     protected static void reinitializeNetwork()
     {
-        reinitializeNetwork(null);
+        reinitializeNetwork(server -> {}, cluster -> {});
     }
 
-    protected static void reinitializeNetwork(Consumer<Cluster.Builder> clusterConfigurator)
+    protected static void reinitializeNetwork(Consumer<Server.Builder> serverConfigurator,
+                                              Consumer<Cluster.Builder> clusterConfigurator)
     {
         if (server != null && server.isRunning())
         {
@@ -470,46 +556,9 @@
         clusters.clear();
         sessions.clear();
 
-        initializeNetwork(server -> {}, clusterConfigurator);
-    }
+        clusterBuilderConfigurator = clusterConfigurator;
 
-    private static void initializeNetwork(Consumer<Server.Builder> decorator, Consumer<Cluster.Builder> clusterConfigurator)
-    {
-        startServer(decorator);
-
-        for (ProtocolVersion version : PROTOCOL_VERSIONS)
-        {
-            if (clusters.containsKey(version))
-                continue;
-
-            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
-
-            logger.info("Timeouts: {} / {}", socketOptions.getConnectTimeoutMillis(), socketOptions.getReadTimeoutMillis());
-
-            Cluster.Builder builder = Cluster.builder()
-                                             .withoutJMXReporting()
-                                             .addContactPoints(nativeAddr)
-                                             .withClusterName("Test Cluster")
-                                             .withPort(nativePort)
-                                             .withSocketOptions(socketOptions)
-                                             .withNettyOptions(IMMEDIATE_CONNECTION_SHUTDOWN_NETTY_OPTIONS);
-
-        if (clusterConfigurator != null)
-                clusterConfigurator.accept(builder);
-
-            if (version.isBeta())
-                builder = builder.allowBetaProtocolVersion();
-            else
-                builder = builder.withProtocolVersion(com.datastax.driver.core.ProtocolVersion.fromInt(version.asInt()));
-
-            Cluster cluster = builder.build();
-            clusters.put(version, cluster);
-            sessions.put(version, cluster.connect());
-
-            logger.info("Started Java Driver instance for protocol version {}", version);
-        }
+        startServer(serverConfigurator);
     }
 
     private static void startServer(Consumer<Server.Builder> decorator)
@@ -521,6 +570,41 @@
         server.start();
     }
 
+    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
+
+        logger.info("Timeouts: {} / {}", socketOptions.getConnectTimeoutMillis(), socketOptions.getReadTimeoutMillis());
+
+        Cluster.Builder builder = Cluster.builder()
+                                         .withoutJMXReporting()
+                                         .addContactPoints(nativeAddr)
+                                         .withClusterName("Test Cluster")
+                                         .withPort(nativePort)
+                                         .withSocketOptions(socketOptions)
+                                         .withNettyOptions(IMMEDIATE_CONNECTION_SHUTDOWN_NETTY_OPTIONS);
+
+        if (user != null)
+            builder.withCredentials(user.username, user.password);
+
+        if (version.isBeta())
+            builder = builder.allowBetaProtocolVersion();
+        else
+            builder = builder.withProtocolVersion(com.datastax.driver.core.ProtocolVersion.fromInt(version.asInt()));
+
+        clusterBuilderConfigurator.accept(builder);
+
+        Cluster cluster = builder.build();
+
+        logger.info("Started Java Driver instance for protocol version {}", version);
+
+        return cluster;
+    }
+
     protected void dropPerTestKeyspace() throws Throwable
     {
         execute(String.format("DROP KEYSPACE IF EXISTS %s", KEYSPACE_PER_TEST));
@@ -545,7 +629,12 @@
         String currentTable = currentTable();
         return currentTable == null
              ? null
-             : Keyspace.open(keyspace).getColumnFamilyStore(currentTable);
+             : getColumnFamilyStore(keyspace, currentTable);
+    }
+
+    public ColumnFamilyStore getColumnFamilyStore(String keyspace, String table)
+    {
+        return Keyspace.open(keyspace).getColumnFamilyStore(table);
     }
 
     public void flush(boolean forceFlush)
@@ -563,7 +652,7 @@
     {
         ColumnFamilyStore store = getCurrentColumnFamilyStore(keyspace);
         if (store != null)
-            store.forceBlockingFlush();
+            Util.flush(store);
     }
 
     public void disableCompaction(String keyspace)
@@ -622,7 +711,7 @@
         // clean up data directory which are stored as data directory/keyspace/data files
         for (File d : Directories.getKSChildDirectories(ks))
         {
-            if (d.exists() && containsAny(d.getName(), tables))
+            if (d.exists() && containsAny(d.name(), tables))
                 FileUtils.deleteRecursive(d);
         }
     }
@@ -649,6 +738,13 @@
         return tables.get(tables.size() - 1);
     }
 
+    protected String currentView()
+    {
+        if (views.isEmpty())
+            return null;
+        return views.get(views.size() - 1);
+    }
+
     protected String currentKeyspace()
     {
         if (keyspaces.isEmpty())
@@ -683,14 +779,20 @@
 
     protected String createType(String keyspace, String query)
     {
-        String typeName = String.format("type_%02d", seqNumber.getAndIncrement());
+        String typeName = createTypeName();
         String fullQuery = String.format(query, keyspace + "." + typeName);
-        types.add(typeName);
         logger.info(fullQuery);
         schemaChange(fullQuery);
         return typeName;
     }
 
+    protected String createTypeName()
+    {
+        String typeName = String.format("type_%02d", seqNumber.getAndIncrement());
+        types.add(typeName);
+        return typeName;
+    }
+
     protected String createFunctionName(String keyspace)
     {
         return String.format("%s.function_%02d", keyspace, seqNumber.getAndIncrement());
@@ -810,6 +912,119 @@
         QueryProcessor.executeOnceInternal(fullQuery);
     }
 
+    /**
+     * Creates a materialized view, waiting for the completion of its builder tasks.
+     *
+     * @param query the {@code CREATE VIEW} query, with {@code %s} placeholders for the view and table names
+     * @return the name of the created view
+     */
+    protected String createView(String query)
+    {
+        return createView(null, query);
+    }
+
+    /**
+     * Creates a materialized view, waiting for the completion of its builder tasks.
+     *
+     * @param viewName the name of the view to be created, or {@code null} for using an automatically generated a name
+     * @param query the {@code CREATE VIEW} query, with {@code %s} placeholders for the view and table names
+     * @return the name of the created view
+     */
+    protected String createView(String viewName, String query)
+    {
+        String currentView = createViewAsync(viewName, query);
+        waitForViewBuild(currentView);
+        return currentView;
+    }
+
+    /**
+     * Creates a materialized view, without waiting for the completion of its builder tasks.
+     *
+     * @param query the {@code CREATE VIEW} query, with {@code %s} placeholders for the view and table names
+     * @return the name of the created view
+     */
+    protected String createViewAsync(String query)
+    {
+        return createViewAsync(null, query);
+    }
+
+    /**
+     * Creates a materialized view, without waiting for the completion of its builder tasks.
+     *
+     * @param viewName the name of the view to be created, or {@code null} for using an automatically generated a name
+     * @param query the {@code CREATE VIEW} query, with {@code %s} placeholders for the view and table names
+     * @return the name of the created view
+     */
+    protected String createViewAsync(String viewName, String query)
+    {
+        String currentView = viewName == null ? createViewName() : viewName;
+        String fullQuery = String.format(query, KEYSPACE + "." + currentView, KEYSPACE + "." + currentTable());
+        logger.info(fullQuery);
+        schemaChange(fullQuery);
+        return currentView;
+    }
+
+    protected void dropView()
+    {
+        dropView(currentView());
+    }
+
+    protected void dropView(String view)
+    {
+        dropFormattedTable(String.format("DROP MATERIALIZED VIEW IF EXISTS %s.%s", KEYSPACE, view));
+        views.remove(view);
+    }
+
+    protected String createViewName()
+    {
+        String currentView = String.format("mv_%02d", seqNumber.getAndIncrement());
+        views.add(currentView);
+        return currentView;
+    }
+
+    protected List<String> getViews()
+    {
+        return copy(views);
+    }
+
+    protected void updateView(String query, Object... params) throws Throwable
+    {
+        updateView(getDefaultVersion(), query, params);
+    }
+
+    protected void updateView(ProtocolVersion version, String query, Object... params) throws Throwable
+    {
+        executeNet(version, query, params);
+        waitForViewMutations();
+    }
+
+    /**
+     * Waits for any pending asynchronous materialized view mutations.
+     */
+    protected static void waitForViewMutations()
+    {
+        Awaitility.await()
+                  .atMost(10, TimeUnit.MINUTES)
+                  .pollDelay(0, TimeUnit.MILLISECONDS)
+                  .pollInterval(1, TimeUnit.MILLISECONDS)
+                  .until(() -> Stage.VIEW_MUTATION.executor().getPendingTaskCount() == 0 &&
+                               Stage.VIEW_MUTATION.executor().getActiveTaskCount() == 0);
+    }
+
+    /**
+     * Waits for the building tasks of the specified materialized view.
+     *
+     * @param view the name of the view
+     */
+    protected void waitForViewBuild(String view)
+    {
+        Awaitility.await()
+                  .atMost(10, TimeUnit.MINUTES)
+                  .pollDelay(0, TimeUnit.MILLISECONDS)
+                  .pollInterval(10, TimeUnit.MILLISECONDS)
+                  .until(() -> SystemKeyspace.isViewBuilt(keyspace(), view));
+    }
+
     protected void alterTable(String query)
     {
         String fullQuery = formatQuery(query);
@@ -889,7 +1104,7 @@
      */
     protected boolean waitForIndex(String keyspace, String table, String index) throws Throwable
     {
-        long start = System.currentTimeMillis();
+        long start = currentTimeMillis();
         boolean indexCreated = false;
         while (!indexCreated)
         {
@@ -903,7 +1118,7 @@
                 }
             }
 
-            if (System.currentTimeMillis() - start > 5000)
+            if (currentTimeMillis() - start > 5000)
                 break;
 
             Thread.sleep(10);
@@ -924,7 +1139,7 @@
      */
     protected boolean waitForIndexBuilds(String keyspace, String indexName) throws InterruptedException
     {
-        long start = System.currentTimeMillis();
+        long start = currentTimeMillis();
         SecondaryIndexManager indexManager = getCurrentColumnFamilyStore(keyspace).indexManager;
 
         while (true)
@@ -933,7 +1148,7 @@
             {
                 return true;
             }
-            else if (System.currentTimeMillis() - start > 5000)
+            else if (currentTimeMillis() - start > 5000)
             {
                 return false;
             }
@@ -975,6 +1190,41 @@
         Assert.assertEquals(expectedArgTypes != null ? Arrays.asList(expectedArgTypes) : null, schemaChange.argTypes);
     }
 
+    protected static void assertWarningsContain(Message.Response response, String message)
+    {
+        assertWarningsContain(response.getWarnings(), message);
+    }
+
+    protected static void assertWarningsContain(List<String> warnings, String message)
+    {
+        Assert.assertNotNull(warnings);
+        assertTrue(warnings.stream().anyMatch(s -> s.contains(message)));
+    }
+
+    protected static void assertWarningsEquals(ResultSet rs, String... messages)
+    {
+        assertWarningsEquals(rs.getExecutionInfo().getWarnings(), messages);
+    }
+
+    protected static void assertWarningsEquals(List<String> warnings, String... messages)
+    {
+        Assert.assertNotNull(warnings);
+        Assertions.assertThat(messages).hasSameElementsAs(warnings);
+    }
+
+    protected static void assertNoWarningContains(Message.Response response, String message)
+    {
+        assertNoWarningContains(response.getWarnings(), message);
+    }
+
+    protected static void assertNoWarningContains(List<String> warnings, String message)
+    {
+        if (warnings != null)
+        {
+            assertFalse(warnings.stream().anyMatch(s -> s.contains(message)));
+        }
+    }
+
     protected static ResultMessage schemaChange(String query)
     {
         try
@@ -1011,12 +1261,17 @@
         return sessionNet().execute(formatQuery(query), values);
     }
 
+    protected com.datastax.driver.core.ResultSet executeViewNet(String query, Object... values)
+    {
+        return sessionNet().execute(formatViewQuery(query), values);
+    }
+
     protected com.datastax.driver.core.ResultSet executeNet(ProtocolVersion protocolVersion, Statement statement)
     {
         return sessionNet(protocolVersion).execute(statement);
     }
 
-    protected com.datastax.driver.core.ResultSet executeNetWithPaging(ProtocolVersion version, String query, int pageSize) throws Throwable
+    protected com.datastax.driver.core.ResultSet executeNetWithPaging(ProtocolVersion version, String query, int pageSize)
     {
         return sessionNet(version).execute(new SimpleStatement(formatQuery(query)).setFetchSize(pageSize));
     }
@@ -1026,7 +1281,7 @@
         return sessionNet(version).execute(new SimpleStatement(formatQuery(KS, query)).setKeyspace(KS).setFetchSize(pageSize));
     }
 
-    protected com.datastax.driver.core.ResultSet executeNetWithPaging(String query, int pageSize) throws Throwable
+    protected com.datastax.driver.core.ResultSet executeNetWithPaging(String query, int pageSize)
     {
         return sessionNet().execute(new SimpleStatement(formatQuery(query)).setFetchSize(pageSize));
     }
@@ -1040,7 +1295,18 @@
     {
         requireNetwork();
 
-        return sessions.get(protocolVersion);
+        return getSession(protocolVersion);
+    }
+
+    private Session getSession(ProtocolVersion protocolVersion)
+    {
+        Cluster cluster = getCluster(protocolVersion);
+        return sessions.computeIfAbsent(Pair.create(user, protocolVersion), userProto -> cluster.connect());
+    }
+
+    private Cluster getCluster(ProtocolVersion protocolVersion)
+    {
+        return clusters.computeIfAbsent(Pair.create(user, protocolVersion), userProto -> initClientCluster(userProto.left, userProto.right));
     }
 
     protected SimpleClient newSimpleClient(ProtocolVersion version) throws IOException
@@ -1060,6 +1326,17 @@
         return currentTable == null ? query : String.format(query, keyspace + "." + currentTable);
     }
 
+    public String formatViewQuery(String query)
+    {
+        return formatViewQuery(KEYSPACE, query);
+    }
+
+    public String formatViewQuery(String keyspace, String query)
+    {
+        String currentView = currentView();
+        return currentView == null ? query : String.format(query, keyspace + "." + currentView);
+    }
+
     protected ResultMessage.Prepared prepare(String query) throws Throwable
     {
         return QueryProcessor.instance.prepare(formatQuery(query), ClientState.forInternalCalls());
@@ -1070,6 +1347,11 @@
         return executeFormattedQuery(formatQuery(query), values);
     }
 
+    public UntypedResultSet executeView(String query, Object... values) throws Throwable
+    {
+        return executeFormattedQuery(formatViewQuery(KEYSPACE, query), values);
+    }
+
     protected UntypedResultSet executeFormattedQuery(String query, Object... values) throws Throwable
     {
         UntypedResultSet rs;
@@ -1142,9 +1424,9 @@
             for (int j = 0; j < meta.size(); j++)
             {
                 DataType type = meta.getType(j);
-                com.datastax.driver.core.TypeCodec<Object> codec = clusters.get(protocolVersion).getConfiguration()
-                                                                                                .getCodecRegistry()
-                                                                                                .codecFor(type);
+                com.datastax.driver.core.TypeCodec<Object> codec = getCluster(protocolVersion).getConfiguration()
+                                                                                              .getCodecRegistry()
+                                                                                              .codecFor(type);
                 ByteBuffer expectedByteValue = codec.serialize(expected[j], com.datastax.driver.core.ProtocolVersion.fromInt(protocolVersion.asInt()));
                 int expectedBytes = expectedByteValue == null ? -1 : expectedByteValue.remaining();
                 ByteBuffer actualValue = actual.getBytesUnsafe(meta.getName(j));
@@ -1204,6 +1486,7 @@
 
             Assert.assertEquals(String.format("Invalid number of (expected) values provided for row %d", i), expected == null ? 1 : expected.length, meta.size());
 
+            StringBuilder error = new StringBuilder();
             for (int j = 0; j < meta.size(); j++)
             {
                 ColumnSpecification column = meta.get(j);
@@ -1216,15 +1499,17 @@
                 {
                     Object actualValueDecoded = actualValue == null ? null : column.type.getSerializer().deserialize(actualValue);
                     if (!Objects.equal(expected != null ? expected[j] : null, actualValueDecoded))
-                        Assert.fail(String.format("Invalid value for row %d column %d (%s of type %s), expected <%s> but got <%s>",
-                                                  i,
-                                                  j,
-                                                  column.name,
-                                                  column.type.asCQL3Type(),
-                                                  formatValue(expectedByteValue != null ? expectedByteValue.duplicate() : null, column.type),
-                                                  formatValue(actualValue, column.type)));
+                        error.append(String.format("Invalid value for row %d column %d (%s of type %s), expected <%s> but got <%s>",
+                                                   i,
+                                                   j,
+                                                   column.name,
+                                                   column.type.asCQL3Type(),
+                                                   formatValue(expectedByteValue != null ? expectedByteValue.duplicate() : null, column.type),
+                                                   formatValue(actualValue, column.type))).append("\n");
                 }
             }
+            if (error.length() > 0)
+                Assert.fail(error.toString());
             i++;
         }
 
@@ -1280,7 +1565,19 @@
             Assert.assertEquals("Invalid number of (expected) values provided for row", expected.length, meta.size());
             List<ByteBuffer> expectedRow = new ArrayList<>(meta.size());
             for (int j = 0; j < meta.size(); j++)
-                expectedRow.add(makeByteBuffer(expected[j], meta.get(j).type));
+            {
+                try
+                {
+                    expectedRow.add(makeByteBuffer(expected[j], meta.get(j).type));
+                }
+                catch (Exception e)
+                {
+                    ColumnSpecification column = meta.get(j);
+                    AssertionError error = new AssertionError("Error with column '" + column.name + " " + column.type.asCQL3Type() + "'; " + e.getLocalizedMessage());
+                    error.addSuppressed(e);
+                    throw error;
+                }
+            }
             expectedRows.add(expectedRow);
         }
 
@@ -1456,6 +1753,11 @@
         assertInvalidThrowMessage(errorMessage, null, query, values);
     }
 
+    protected void assertInvalidMessageNet(String errorMessage, String query, Object... values) throws Throwable
+    {
+        assertInvalidThrowMessage(Optional.of(ProtocolVersion.CURRENT), errorMessage, null, query, values);
+    }
+
     protected void assertInvalidThrow(Class<? extends Throwable> exception, String query, Object... values) throws Throwable
     {
         assertInvalidThrowMessage(null, exception, query, values);
@@ -1542,6 +1844,13 @@
         }
     }
 
+    protected void assertInvalidRequestMessage(String errorMessage, String query, Object... values)
+    {
+        Assertions.assertThatThrownBy(() -> execute(query, values))
+                  .isInstanceOf(InvalidRequestException.class)
+                  .hasMessageContaining(errorMessage);
+    }
+
     /**
      * Asserts that the message of the specified exception contains the specified text.
      *
@@ -1554,6 +1863,21 @@
                 e.getMessage().contains(text));
     }
 
+    /**
+     * Checks that the specified query is not authorized for the current user.
+     * @param errorMessage The expected error message
+     * @param query the query
+     * @param values the query parameters
+     */
+    protected void assertUnauthorizedQuery(String errorMessage, String query, Object... values) throws Throwable
+    {
+        assertInvalidThrowMessage(Optional.of(ProtocolVersion.CURRENT),
+                                  errorMessage,
+                                  UnauthorizedException.class,
+                                  query,
+                                  values);
+    }
+
     @FunctionalInterface
     public interface CheckedFunction {
         void apply() throws Throwable;
@@ -1782,7 +2106,7 @@
         if (value instanceof ByteBuffer)
             return (ByteBuffer)value;
 
-        return type.decompose(serializeTuples(value));
+        return type.decomposeUntyped(serializeTuples(value));
     }
 
     private static String formatValue(ByteBuffer bb, AbstractType<?> type)
@@ -1863,7 +2187,18 @@
     protected com.datastax.driver.core.TupleType tupleTypeOf(ProtocolVersion protocolVersion, com.datastax.driver.core.DataType...types)
     {
         requireNetwork();
-        return clusters.get(protocolVersion).getMetadata().newTupleType(types);
+        return getCluster(protocolVersion).getMetadata().newTupleType(types);
+    }
+
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    protected static Gauge<Integer> getPausedConnectionsGauge()
+    {
+        String metricName = "org.apache.cassandra.metrics.Client.PausedConnections";
+        Map<String, Gauge> metrics = CassandraMetricsRegistry.Metrics.getGauges((name, metric) -> name.equals(metricName));
+        if (metrics.size() != 1)
+            fail(String.format("Expected a single registered metric for paused client connections, found %s",
+                               metrics.size()));
+        return metrics.get(metricName);
     }
 
     // Attempt to find an AbstracType from a value (for serialization/printing sake).
@@ -1915,6 +2250,9 @@
         if (value instanceof UUID)
             return UUIDType.instance;
 
+        if (value instanceof TimeUUID)
+            return TimeUUIDType.instance;
+
         if (value instanceof List)
         {
             List l = (List)value;
@@ -2025,4 +2363,44 @@
             return "UserTypeValue" + toCQLString();
         }
     }
+
+    private static class User
+    {
+        /**
+         * The user name
+         */
+        public final String username;
+
+        /**
+         * The user password
+         */
+        public final String password;
+
+        public User(String username, String password)
+        {
+            this.username = username;
+            this.password = password;
+        }
+
+        @Override
+        public int hashCode()
+        {
+            return Objects.hashCode(username, password);
+        }
+
+        @Override
+        public boolean equals(Object o)
+        {
+            if (this == o)
+                return true;
+
+            if (!(o instanceof User))
+                return false;
+
+            User u = (User) o;
+
+            return Objects.equal(username, u.username)
+                && Objects.equal(password, u.password);
+        }
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/CustomNowInSecondsTest.java b/test/unit/org/apache/cassandra/cql3/CustomNowInSecondsTest.java
index 983acfa..8768b77 100644
--- a/test/unit/org/apache/cassandra/cql3/CustomNowInSecondsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/CustomNowInSecondsTest.java
@@ -34,6 +34,8 @@
 import org.apache.cassandra.transport.messages.ResultMessage;
 
 import static java.lang.String.format;
+import static java.util.Collections.emptyMap;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 
 public class CustomNowInSecondsTest extends CQLTester
@@ -154,7 +156,7 @@
             new BatchStatement(BatchStatement.Type.UNLOGGED, VariableSpecifications.empty(), statements, Attributes.none());
 
         // execute an BATCH message with now set to [now + 1 day], with ttl = 1, making its effective ttl = 1 day + 1.
-        QueryProcessor.instance.processBatch(batch, qs, batchQueryOptions(now + day), Collections.emptyMap(), System.nanoTime());
+        QueryProcessor.instance.processBatch(batch, qs, batchQueryOptions(now + day), emptyMap(), nanoTime());
 
         // verify that despite TTL having passed at now + 1 the rows are still there.
         assertEquals(2, executeSelect(format("SELECT * FROM %s.%s", ks, tbl), now + 1, false).size());
@@ -183,12 +185,12 @@
         if (prepared)
         {
             CQLStatement statement = QueryProcessor.parseStatement(query, cs);
-            return QueryProcessor.instance.processPrepared(statement, qs, queryOptions(nowInSeconds), Collections.emptyMap(), System.nanoTime());
+            return QueryProcessor.instance.processPrepared(statement, qs, queryOptions(nowInSeconds), emptyMap(), nanoTime());
         }
         else
         {
             CQLStatement statement = QueryProcessor.instance.parse(query, qs, queryOptions(nowInSeconds));
-            return QueryProcessor.instance.process(statement, qs, queryOptions(nowInSeconds), Collections.emptyMap(), System.nanoTime());
+            return QueryProcessor.instance.process(statement, qs, queryOptions(nowInSeconds), emptyMap(), nanoTime());
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/cql3/DurationTest.java b/test/unit/org/apache/cassandra/cql3/DurationTest.java
index ef031c4..9b63242 100644
--- a/test/unit/org/apache/cassandra/cql3/DurationTest.java
+++ b/test/unit/org/apache/cassandra/cql3/DurationTest.java
@@ -18,23 +18,21 @@
  */
 package org.apache.cassandra.cql3;
 
-import java.text.ParsePosition;
-import java.text.SimpleDateFormat;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.TimeZone;
-
-import org.apache.commons.lang3.time.DateUtils;
+import java.time.Instant;
+import java.time.LocalDateTime;
+import java.time.OffsetDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
 
 import org.junit.Assert;
 import org.junit.Test;
 
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.serializers.TimeSerializer;
+
 import static org.junit.Assert.assertEquals;
 
-import org.apache.cassandra.exceptions.InvalidRequestException;
-
 import static org.apache.cassandra.cql3.Duration.*;
-import static org.apache.cassandra.cql3.Duration.NANOS_PER_HOUR;
 
 public class DurationTest
 {
@@ -110,72 +108,287 @@
     @Test
     public void testAddTo()
     {
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("0m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("10us").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T00:10:00"), Duration.from("10m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T01:30:00"), Duration.from("90m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T02:10:00"), Duration.from("2h10m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-23T00:10:00"), Duration.from("2d10m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-24T01:00:00"), Duration.from("2d25h").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-10-21T00:00:00"), Duration.from("1mo").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2017-11-21T00:00:00"), Duration.from("14mo").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2017-02-28T00:00:00"), Duration.from("12mo").addTo(toMillis("2016-02-29T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("0m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("10us").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T00:10:00.000", Duration.from("10m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T01:30:00.000", Duration.from("90m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T02:10:00.000", Duration.from("2h10m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-23T00:10:00.000", Duration.from("2d10m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-24T01:00:00.000", Duration.from("2d25h").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-10-21T00:00:00.000", Duration.from("1mo").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2017-11-21T00:00:00.000", Duration.from("14mo").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2017-02-28T00:00:00.000", Duration.from("12mo").addTo(toMillis("2016-02-29T00:00:00")));
     }
 
     @Test
     public void testAddToWithNegativeDurations()
     {
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("-0m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("-10us").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-20T23:50:00"), Duration.from("-10m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-20T22:30:00"), Duration.from("-90m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-20T21:50:00"), Duration.from("-2h10m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-18T23:50:00"), Duration.from("-2d10m").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-17T23:00:00"), Duration.from("-2d25h").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-08-21T00:00:00"), Duration.from("-1mo").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2015-07-21T00:00:00"), Duration.from("-14mo").addTo(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2015-02-28T00:00:00"), Duration.from("-12mo").addTo(toMillis("2016-02-29T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("-0m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("-10us").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-20T23:50:00.000", Duration.from("-10m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-20T22:30:00.000", Duration.from("-90m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-20T21:50:00.000", Duration.from("-2h10m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-18T23:50:00.000", Duration.from("-2d10m").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-17T23:00:00.000", Duration.from("-2d25h").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-08-21T00:00:00.000", Duration.from("-1mo").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2015-07-21T00:00:00.000", Duration.from("-14mo").addTo(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2015-02-28T00:00:00.000", Duration.from("-12mo").addTo(toMillis("2016-02-29T00:00:00")));
     }
 
     @Test
     public void testSubstractFrom()
     {
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("0m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("10us").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-20T23:50:00"), Duration.from("10m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-20T22:30:00"), Duration.from("90m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-20T21:50:00"), Duration.from("2h10m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-18T23:50:00"), Duration.from("2d10m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-17T23:00:00"), Duration.from("2d25h").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-08-21T00:00:00"), Duration.from("1mo").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2015-07-21T00:00:00"), Duration.from("14mo").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2015-02-28T00:00:00"), Duration.from("12mo").substractFrom(toMillis("2016-02-29T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("0m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("10us").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-20T23:50:00.000", Duration.from("10m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-20T22:30:00.000", Duration.from("90m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-20T21:50:00.000", Duration.from("2h10m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-18T23:50:00.000", Duration.from("2d10m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-17T23:00:00.000", Duration.from("2d25h").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-08-21T00:00:00.000", Duration.from("1mo").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2015-07-21T00:00:00.000", Duration.from("14mo").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2015-02-28T00:00:00.000", Duration.from("12mo").substractFrom(toMillis("2016-02-29T00:00:00")));
     }
 
     @Test
     public void testSubstractWithNegativeDurations()
     {
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("-0m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T00:00:00"), Duration.from("-10us").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T00:10:00"), Duration.from("-10m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T01:30:00"), Duration.from("-90m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-21T02:10:00"), Duration.from("-2h10m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-23T00:10:00"), Duration.from("-2d10m").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-09-24T01:00:00"), Duration.from("-2d25h").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2016-10-21T00:00:00"), Duration.from("-1mo").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2017-11-21T00:00:00"), Duration.from("-14mo").substractFrom(toMillis("2016-09-21T00:00:00")));
-        assertEquals(toMillis("2017-02-28T00:00:00"), Duration.from("-12mo").substractFrom(toMillis("2016-02-29T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("-0m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T00:00:00.000", Duration.from("-10us").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T00:10:00.000", Duration.from("-10m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T01:30:00.000", Duration.from("-90m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-21T02:10:00.000", Duration.from("-2h10m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-23T00:10:00.000", Duration.from("-2d10m").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-09-24T01:00:00.000", Duration.from("-2d25h").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2016-10-21T00:00:00.000", Duration.from("-1mo").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2017-11-21T00:00:00.000", Duration.from("-14mo").substractFrom(toMillis("2016-09-21T00:00:00")));
+        assertTimeEquals("2017-02-28T00:00:00.000", Duration.from("-12mo").substractFrom(toMillis("2016-02-29T00:00:00")));
     }
 
-    private long toMillis(String timeAsString)
+    @Test
+    public void testFloorTime()
     {
-        SimpleDateFormat parser = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss");
-        parser.setTimeZone(TimeZone.getTimeZone("UTC"));
-        Date date = parser.parse(timeAsString, new ParsePosition(0));
-        return DateUtils.truncate(date, Calendar.SECOND).getTime();
+        long time = floorTime("16:12:00", "2h");
+        Duration result = Duration.newInstance(0, 0, time);
+        Duration expected = Duration.from("16h");
+        assertEquals(expected, result);
     }
 
-    public void assertInvalidDuration(String duration, String expectedErrorMessage)
+    @Test
+    public void testInvalidFloorTimestamp()
+    {
+        try
+        {
+            floorTimestamp("2016-09-27T16:12:00", "2h", "2017-09-01T00:00:00");
+            Assert.fail();
+        }
+        catch (InvalidRequestException e)
+        {
+            assertEquals("The floor function starting time is greater than the provided time", e.getMessage());
+        }
+
+        try
+        {
+            floorTimestamp("2016-09-27T16:12:00", "-2h", "2016-09-27T00:00:00");
+            Assert.fail();
+        }
+        catch (InvalidRequestException e)
+        {
+            assertEquals("Negative durations are not supported by the floor function", e.getMessage());
+        }
+    }
+
+    @Test
+    public void testFloorTimestampWithDurationInHours()
+    {
+        // Test floor with a timestamp equals to the start time
+        long result = floorTimestamp("2016-09-27T16:12:00", "2h", "2016-09-27T16:12:00");
+        assertTimeEquals("2016-09-27T16:12:00.000", result);
+
+        // Test floor with a duration equals to zero
+        result = floorTimestamp("2016-09-27T18:12:00", "0h", "2016-09-27T16:12:00");
+        assertTimeEquals("2016-09-27T18:12:00.000", result);
+
+        // Test floor with a timestamp exactly equals to the start time + (1 x duration)
+        result = floorTimestamp("2016-09-27T18:12:00", "2h", "2016-09-27T16:12:00");
+        assertTimeEquals("2016-09-27T18:12:00.000", result);
+
+        // Test floor with a timestamp in the first bucket
+        result = floorTimestamp("2016-09-27T16:13:00", "2h", "2016-09-27T16:12:00");
+        assertTimeEquals("2016-09-27T16:12:00.000", result);
+
+        // Test floor with a timestamp in another bucket
+        result = floorTimestamp("2016-09-27T16:12:00", "2h", "2016-09-27T00:00:00");
+        assertTimeEquals("2016-09-27T16:00:00.000", result);
+    }
+
+    @Test
+    public void testFloorTimestampWithDurationInDays()
+    {
+        // Test floor with a start time at the beginning of the month
+        long result = floorTimestamp("2016-09-27T16:12:00", "2d", "2016-09-01T00:00:00");
+        assertTimeEquals("2016-09-27T00:00:00.000", result);
+
+        // Test floor with a start time in the previous month
+        result = floorTimestamp("2016-09-27T16:12:00", "2d", "2016-08-01T00:00:00");
+        assertTimeEquals("2016-09-26T00:00:00.000", result);
+    }
+
+    @Test
+    public void testFloorTimestampWithDurationInDaysAndHours()
+    {
+        long result = floorTimestamp("2016-09-27T16:12:00", "2d12h", "2016-09-01T00:00:00");
+        assertTimeEquals("2016-09-26T00:00:00.000", result);
+    }
+
+    @Test
+    public void testFloorTimestampWithDurationInMonths()
+    {
+        // Test floor with a timestamp equals to the start time
+        long result = floorTimestamp("2016-09-01T00:00:00", "2mo", "2016-09-01T00:00:00");
+        assertTimeEquals("2016-09-01T00:00:00.000", result);
+
+        // Test floor with a timestamp in the first bucket
+        result = floorTimestamp("2016-09-27T16:12:00", "2mo", "2016-09-01T00:00:00");
+        assertTimeEquals("2016-09-01T00:00:00.000", result);
+
+        // Test floor with a start time at the beginning of the year (LEAP YEAR)
+        result = floorTimestamp("2016-09-27T16:12:00", "1mo", "2016-01-01T00:00:00");
+        assertTimeEquals("2016-09-01T00:00:00.000", result);
+
+        // Test floor with a start time at the beginning of the previous year
+        result = floorTimestamp("2016-09-27T16:12:00", "2mo", "2015-01-01T00:00:00");
+        assertTimeEquals("2016-09-01T00:00:00.000", result);
+
+        // Test floor with a start time in the previous year
+        result = floorTimestamp("2016-09-27T16:12:00", "2mo", "2015-02-02T00:00:00");
+        assertTimeEquals("2016-08-02T00:00:00.000", result);
+
+    }
+
+    @Test
+    public void testFloorTimestampWithDurationInMonthsAndDays()
+    {
+        long result = floorTimestamp("2016-09-27T16:12:00", "2mo2d", "2016-01-01T00:00:00");
+        assertTimeEquals("2016-09-09T00:00:00.000", result);
+
+        result = floorTimestamp("2016-09-27T16:12:00", "2mo5d", "2016-01-01T00:00:00");
+        assertTimeEquals("2016-09-21T00:00:00.000", result);
+
+        // Test floor with a timestamp in the first bucket
+        result = floorTimestamp("2016-09-04T16:12:00", "2mo5d", "2016-07-01T00:00:00");
+        assertTimeEquals("2016-07-01T00:00:00.000", result);
+
+        // Test floor with a timestamp in a bucket starting on the last day of the month
+        result = floorTimestamp("2016-09-27T16:12:00", "2mo10d", "2016-01-01T00:00:00");
+        assertTimeEquals("2016-07-31T00:00:00.000", result);
+
+        // Test floor with a timestamp in a bucket starting on the first day of the month
+        result = floorTimestamp("2016-09-27T16:12:00", "2mo12d", "2016-01-01T00:00:00");
+        assertTimeEquals("2016-08-06T00:00:00.000", result);
+
+        // Test leap years
+        result = floorTimestamp("2016-04-27T16:12:00", "1mo30d", "2016-01-01T00:00:00");
+        assertTimeEquals("2016-03-02T00:00:00.000", result);
+
+        result = floorTimestamp("2015-04-27T16:12:00", "1mo30d", "2015-01-01T00:00:00");
+        assertTimeEquals("2015-03-03T00:00:00.000", result);
+    }
+
+    @Test
+    public void testFloorTimestampWithDurationSmallerThanPrecision()
+    {
+        long result = floorTimestamp("2016-09-27T18:14:00", "5us", "2016-09-27T16:12:00");
+        assertTimeEquals("2016-09-27T18:14:00.000", result);
+
+        result = floorTimestamp("2016-09-27T18:14:00", "1h5us", "2016-09-27T16:12:00");
+        assertTimeEquals("2016-09-27T18:12:00.000", result);
+    }
+
+    @Test
+    public void testFloorTimestampWithLeapSecond()
+    {
+        long result = floorTimestamp("2016-07-02T00:00:00", "2m", "2016-06-30T23:58:00");
+        assertTimeEquals("2016-07-02T00:00:00.000", result);
+    }
+
+    @Test
+    public void testFloorTimestampWithComplexDuration()
+    {
+        long result = floorTimestamp("2016-07-02T00:00:00", "2mo2d8h", "2016-01-01T00:00:00");
+        assertTimeEquals("2016-05-05T16:00:00.000", result);
+    }
+
+    @Test
+    public void testInvalidFloorTime()
+    {
+        try
+        {
+            floorTime("16:12:00", "2d");
+            Assert.fail();
+        }
+        catch (InvalidRequestException e)
+        {
+            assertEquals("For time values, the floor can only be computed for durations smaller that a day", e.getMessage());
+        }
+
+        try
+        {
+            floorTime("16:12:00", "25h");
+            Assert.fail();
+        }
+        catch (InvalidRequestException e)
+        {
+            assertEquals("For time values, the floor can only be computed for durations smaller that a day", e.getMessage());
+        }
+
+        try
+        {
+            floorTime("16:12:00", "-2h");
+            Assert.fail();
+        }
+        catch (InvalidRequestException e)
+        {
+            assertEquals("Negative durations are not supported by the floor function", e.getMessage());
+        }
+    }
+
+    private static long toMillis(String timeAsString)
+    {
+        OffsetDateTime dateTime = LocalDateTime.parse(timeAsString, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss"))
+                                               .atOffset(ZoneOffset.UTC);
+
+        return Instant.from(dateTime).toEpochMilli();
+    }
+
+    private static String fromMillis(long timeInMillis)
+    {
+        return Instant.ofEpochMilli(timeInMillis)
+                      .atOffset(ZoneOffset.UTC)
+                      .format(DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS"));
+    }
+
+    private static void assertTimeEquals(String expected, long actualTimeInMillis)
+    {
+        assertEquals(expected, fromMillis(actualTimeInMillis));
+    }
+
+    private static long floorTimestamp(String time, String duration, String startingTime)
+    {
+        return Duration.floorTimestamp(toMillis(time), Duration.from(duration), toMillis(startingTime));
+    }
+
+    private static long floorTime(String time, String duration)
+    {
+        return Duration.floorTime(timeInNanos(time), Duration.from(duration));
+    }
+
+    private static long timeInNanos(String timeAsString)
+    {
+        return TimeSerializer.timeStringToLong(timeAsString);
+    }
+
+    private static void assertInvalidDuration(String duration, String expectedErrorMessage)
     {
         try
         {
diff --git a/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java b/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java
index 21475b6..eded145 100644
--- a/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java
+++ b/test/unit/org/apache/cassandra/cql3/GcCompactionTest.java
@@ -34,6 +34,8 @@
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
+import org.apache.cassandra.io.sstable.SSTableId;
+import org.apache.cassandra.io.sstable.SSTableIdFactory;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.CompactionParams.TombstoneOption;
@@ -173,7 +175,7 @@
       flush();
       assertEquals(1, cfs.getLiveSSTables().size());
       SSTableReader table = cfs.getLiveSSTables().iterator().next();
-      int gen = table.descriptor.generation;
+      SSTableId gen = table.descriptor.id;
       assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(table));
 
       assertEquals(0, table.getSSTableLevel()); // flush writes to L0
@@ -184,8 +186,8 @@
 
       assertEquals(1, cfs.getLiveSSTables().size());
       SSTableReader collected = cfs.getLiveSSTables().iterator().next();
-      int collectedGen = collected.descriptor.generation;
-      assertTrue(collectedGen > gen);
+      SSTableId collectedGen = collected.descriptor.id;
+      assertTrue(SSTableIdFactory.COMPARATOR.compare(collectedGen, gen) > 0);
       assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(collected));
 
       assertEquals(0, collected.getSSTableLevel()); // garbagecollect should leave the LCS level where it was
@@ -194,8 +196,8 @@
 
       assertEquals(1, cfs.getLiveSSTables().size());
       SSTableReader compacted = cfs.getLiveSSTables().iterator().next();
-      int compactedGen = compacted.descriptor.generation;
-      assertTrue(compactedGen > collectedGen);
+      SSTableId compactedGen = compacted.descriptor.id;
+      assertTrue(SSTableIdFactory.COMPARATOR.compare(compactedGen, collectedGen) > 0);
       assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(compacted));
 
       assertEquals(1, compacted.getSSTableLevel()); // full compaction with LCS should move to L1
@@ -205,7 +207,7 @@
 
       assertEquals(1, cfs.getLiveSSTables().size());
       SSTableReader collected2 = cfs.getLiveSSTables().iterator().next();
-      assertTrue(collected2.descriptor.generation > compactedGen);
+      assertTrue(SSTableIdFactory.COMPARATOR.compare(collected2.descriptor.id, compactedGen) > 0);
       assertEquals(KEY_COUNT * CLUSTERING_COUNT, countRows(collected2));
 
       assertEquals(1, collected2.getSSTableLevel()); // garbagecollect should leave the LCS level where it was
@@ -264,7 +266,7 @@
         assertEquals(CompactionManager.AllSSTableOpStatus.SUCCESSFUL, status);
 
         SSTableReader[] tables = cfs.getLiveSSTables().toArray(new SSTableReader[0]);
-        Arrays.sort(tables, (o1, o2) -> Integer.compare(o1.descriptor.generation, o2.descriptor.generation));  // by order of compaction
+        Arrays.sort(tables, SSTableReader.idComparator);  // by order of compaction
 
         // Make sure deleted data was removed
         assertTrue(rowCount0 > countRows(tables[0]));
@@ -407,11 +409,11 @@
         createTable("create table %s (k int, c1 int, primary key (k, c1)) with compaction = {'class': 'SizeTieredCompactionStrategy', 'provide_overlapping_tombstones':'row'}");
         execute("delete from %s where k = 1");
         Set<SSTableReader> readers = new HashSet<>(getCurrentColumnFamilyStore().getLiveSSTables());
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         SSTableReader oldSSTable = getNewTable(readers);
         Thread.sleep(2000);
         execute("delete from %s where k = 1");
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         SSTableReader newTable = getNewTable(readers);
 
         CompactionManager.instance.forceUserDefinedCompaction(oldSSTable.getFilename());
diff --git a/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java b/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
index b1074b2..2b0a3c8 100644
--- a/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
+++ b/test/unit/org/apache/cassandra/cql3/KeyCacheCqlTest.java
@@ -30,12 +30,14 @@
 
 import org.apache.cassandra.cache.KeyCacheKey;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.index.Index;
 import org.apache.cassandra.metrics.CacheMetrics;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry;
 import org.apache.cassandra.schema.CachingParams;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaKeyspace;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.StorageService;
@@ -161,7 +163,7 @@
             }
         }
 
-        StorageService.instance.forceKeyspaceFlush(KEYSPACE_PER_TEST);
+        StorageService.instance.forceKeyspaceFlush(KEYSPACE_PER_TEST, ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         for (int pkInt = 0; pkInt < 20; pkInt++)
         {
@@ -309,7 +311,7 @@
         }
 
         dropTable("DROP TABLE %s");
-        Schema.instance.updateVersion();
+        assert Schema.instance.isSameVersion(SchemaKeyspace.calculateSchemaDigest());
 
         //Test loading for a dropped 2i/table
         CacheService.instance.keyCache.clear();
@@ -567,7 +569,7 @@
 
             if (i % 10 == 9)
             {
-                Keyspace.open(KEYSPACE_PER_TEST).getColumnFamilyStore(table).forceFlush().get();
+                Keyspace.open(KEYSPACE_PER_TEST).getColumnFamilyStore(table).forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS).get();
                 if (index != null)
                     triggerBlockingFlush(Keyspace.open(KEYSPACE_PER_TEST).getColumnFamilyStore(table).indexManager.getIndexByName(index));
             }
@@ -577,7 +579,7 @@
     private static void prepareTable(String table) throws IOException, InterruptedException, java.util.concurrent.ExecutionException
     {
         StorageService.instance.disableAutoCompaction(KEYSPACE_PER_TEST, table);
-        Keyspace.open(KEYSPACE_PER_TEST).getColumnFamilyStore(table).forceFlush().get();
+        Keyspace.open(KEYSPACE_PER_TEST).getColumnFamilyStore(table).forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS).get();
         Keyspace.open(KEYSPACE_PER_TEST).getColumnFamilyStore(table).truncateBlocking();
     }
 
diff --git a/test/unit/org/apache/cassandra/cql3/KeywordSplit1Test.java b/test/unit/org/apache/cassandra/cql3/KeywordSplit1Test.java
index 6d51b34..c301650 100644
--- a/test/unit/org/apache/cassandra/cql3/KeywordSplit1Test.java
+++ b/test/unit/org/apache/cassandra/cql3/KeywordSplit1Test.java
@@ -32,12 +32,12 @@
 {
     static int SPLIT = 1;
     static int TOTAL_SPLITS = 2;
-    
+
     @Parameterized.Parameters(name = "keyword {0} isReserved {1}")
     public static Collection<Object[]> keywords() {
         return KeywordTestBase.getKeywordsForSplit(SPLIT, TOTAL_SPLITS);
     }
-    
+
     public KeywordSplit1Test(String keyword, boolean isReserved)
     {
         super(keyword, isReserved);
diff --git a/test/unit/org/apache/cassandra/cql3/KeywordSplit2Test.java b/test/unit/org/apache/cassandra/cql3/KeywordSplit2Test.java
index f400d4e..7be651a 100644
--- a/test/unit/org/apache/cassandra/cql3/KeywordSplit2Test.java
+++ b/test/unit/org/apache/cassandra/cql3/KeywordSplit2Test.java
@@ -32,7 +32,7 @@
 {
     static int SPLIT = 2;
     static int TOTAL_SPLITS = 2;
-    
+
     @Parameterized.Parameters(name = "keyword {0} isReserved {1}")
     public static Collection<Object[]> keywords() {
         return KeywordTestBase.getKeywordsForSplit(SPLIT, TOTAL_SPLITS);
diff --git a/test/unit/org/apache/cassandra/cql3/KeywordTestBase.java b/test/unit/org/apache/cassandra/cql3/KeywordTestBase.java
index 0b8d2d5..aa6e508 100644
--- a/test/unit/org/apache/cassandra/cql3/KeywordTestBase.java
+++ b/test/unit/org/apache/cassandra/cql3/KeywordTestBase.java
@@ -44,7 +44,7 @@
                                                       return new Object[] { keyword,ReservedKeywords.isReserved(keyword) };
                                                   })
                                                   .collect(Collectors.toList());
-    
+
     public static Collection<Object[]> getKeywordsForSplit(int split, int totalSplits)
     {
         return Sets.newHashSet(Lists.partition(KeywordTestBase.keywords, KeywordTestBase.keywords.size() / totalSplits)
diff --git a/test/unit/org/apache/cassandra/cql3/ListsTest.java b/test/unit/org/apache/cassandra/cql3/ListsTest.java
index 92dcd96..27c36b8 100644
--- a/test/unit/org/apache/cassandra/cql3/ListsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ListsTest.java
@@ -36,6 +36,7 @@
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.UUIDGen;
@@ -141,8 +142,14 @@
 
         ByteBuffer keyBuf = ByteBufferUtil.bytes("key");
         DecoratedKey key = Murmur3Partitioner.instance.decorateKey(keyBuf);
-        UpdateParameters parameters =
-            new UpdateParameters(metaData, null, QueryOptions.DEFAULT, System.currentTimeMillis(), FBUtilities.nowInSeconds(), 1000, Collections.emptyMap());
+        UpdateParameters parameters = new UpdateParameters(metaData,
+                                                           null,
+                                                           ClientState.forInternalCalls(),
+                                                           QueryOptions.DEFAULT,
+                                                           System.currentTimeMillis(),
+                                                           FBUtilities.nowInSeconds(),
+                                                           1000,
+                                                           Collections.emptyMap());
         Clustering<?> clustering = Clustering.make(ByteBufferUtil.bytes(1));
         parameters.newRow(clustering);
         prepender.execute(key, parameters);
diff --git a/test/unit/org/apache/cassandra/cql3/MemtableQuickTest.java b/test/unit/org/apache/cassandra/cql3/MemtableQuickTest.java
new file mode 100644
index 0000000..ee5da92
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/MemtableQuickTest.java
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.cql3;
+
+import java.util.List;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.Util;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+
+@RunWith(Parameterized.class)
+public class MemtableQuickTest extends CQLTester
+{
+    static final Logger logger = LoggerFactory.getLogger(MemtableQuickTest.class);
+
+    static final int partitions = 50_000;
+    static final int rowsPerPartition = 4;
+
+    static final int deletedPartitionsStart = 20_000;
+    static final int deletedPartitionsEnd = deletedPartitionsStart + 10_000;
+
+    static final int deletedRowsStart = 40_000;
+    static final int deletedRowsEnd = deletedRowsStart + 5_000;
+
+    @Parameterized.Parameter()
+    public String memtableClass;
+
+    @Parameterized.Parameters(name = "{0}")
+    public static List<Object> parameters()
+    {
+        return ImmutableList.of("skiplist",
+                                "skiplist_sharded",
+                                "skiplist_sharded_locking");
+    }
+
+    @BeforeClass
+    public static void setUp()
+    {
+        CQLTester.setUpClass();
+        CQLTester.prepareServer();
+        CQLTester.disablePreparedReuseForTest();
+        logger.info("setupClass done.");
+    }
+
+    @Test
+    public void testMemtable() throws Throwable
+    {
+
+        String keyspace = createKeyspace("CREATE KEYSPACE %s with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } and durable_writes = false");
+        String table = createTable(keyspace, "CREATE TABLE %s ( userid bigint, picid bigint, commentid bigint, PRIMARY KEY(userid, picid))" +
+                                             " with compression = {'enabled': false}" +
+                                             " and memtable = '" + memtableClass + "'");
+        execute("use " + keyspace + ';');
+
+        String writeStatement = "INSERT INTO "+table+"(userid,picid,commentid)VALUES(?,?,?)";
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
+        cfs.disableAutoCompaction();
+        Util.flush(cfs);
+
+        long i;
+        long limit = partitions;
+        logger.info("Writing {} partitions of {} rows", partitions, rowsPerPartition);
+        for (i = 0; i < limit; ++i)
+        {
+            for (long j = 0; j < rowsPerPartition; ++j)
+                execute(writeStatement, i, j, i + j);
+        }
+
+        logger.info("Deleting partitions between {} and {}", deletedPartitionsStart, deletedPartitionsEnd);
+        for (i = deletedPartitionsStart; i < deletedPartitionsEnd; ++i)
+        {
+            // no partition exists, but we will create a tombstone
+            execute("DELETE FROM " + table + " WHERE userid = ?", i);
+        }
+
+        logger.info("Deleting rows between {} and {}", deletedRowsStart, deletedRowsEnd);
+        for (i = deletedRowsStart; i < deletedRowsEnd; ++i)
+        {
+            // no row exists, but we will create a tombstone (and partition)
+            execute("DELETE FROM " + table + " WHERE userid = ? AND picid = ?", i, 0L);
+        }
+
+        logger.info("Reading {} partitions", partitions);
+        for (i = 0; i < limit; ++i)
+        {
+            UntypedResultSet result = execute("SELECT * FROM " + table + " WHERE userid = ?", i);
+            if (i >= deletedPartitionsStart && i < deletedPartitionsEnd)
+                assertEmpty(result);
+            else
+            {
+                int start = 0;
+                if (i >= deletedRowsStart && i < deletedRowsEnd)
+                    start = 1;
+                Object[][] rows = new Object[rowsPerPartition - start][];
+                for (long j = start; j < rowsPerPartition; ++j)
+                    rows[(int) (j - start)] = row(i, j, i + j);
+                assertRows(result, rows);
+            }
+        }
+
+        int deletedPartitions = deletedPartitionsEnd - deletedPartitionsStart;
+        int deletedRows = deletedRowsEnd - deletedRowsStart;
+        logger.info("Selecting *");
+        UntypedResultSet result = execute("SELECT * FROM " + table);
+        assertRowCount(result, rowsPerPartition * (partitions - deletedPartitions) - deletedRows);
+
+        Util.flush(cfs);
+
+        logger.info("Selecting *");
+        result = execute("SELECT * FROM " + table);
+        assertRowCount(result, rowsPerPartition * (partitions - deletedPartitions) - deletedRows);
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/cql3/MemtableSizeTest.java b/test/unit/org/apache/cassandra/cql3/MemtableSizeTest.java
index 7d6c6dd..63ff055 100644
--- a/test/unit/org/apache/cassandra/cql3/MemtableSizeTest.java
+++ b/test/unit/org/apache/cassandra/cql3/MemtableSizeTest.java
@@ -18,33 +18,53 @@
 
 package org.apache.cassandra.cql3;
 
+import java.util.List;
+
 import com.google.common.base.Throwables;
+import com.google.common.collect.ImmutableList;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.Memtable;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.ObjectSizes;
 
+@RunWith(Parameterized.class)
 public class MemtableSizeTest extends CQLTester
 {
-    static String keyspace;
-    String table;
-    ColumnFamilyStore cfs;
+    static final Logger logger = LoggerFactory.getLogger(MemtableSizeTest.class);
 
-    int partitions = 50_000;
-    int rowsPerPartition = 4;
+    static final int partitions = 50_000;
+    static final int rowsPerPartition = 4;
 
-    int deletedPartitions = 10_000;
-    int deletedRows = 5_000;
+    static final int deletedPartitions = 10_000;
+    static final int deletedRows = 5_000;
+
+    @Parameterized.Parameter(0)
+    public String memtableClass;
+
+    @Parameterized.Parameter(1)
+    public int differencePerPartition;
+
+    @Parameterized.Parameters(name = "{0}")
+    public static List<Object[]> parameters()
+    {
+        return ImmutableList.of(new Object[]{"skiplist", 50},
+                                new Object[]{"skiplist_sharded", 60});
+    }
 
     // must be within 50 bytes per partition of the actual size
-    final int MAX_DIFFERENCE = (partitions + deletedPartitions + deletedRows) * 50;
+    final long MAX_DIFFERENCE_PARTITIONS = (partitions + deletedPartitions + deletedRows);
 
     @BeforeClass
     public static void setUp()
@@ -52,42 +72,44 @@
         CQLTester.setUpClass();
         CQLTester.prepareServer();
         CQLTester.disablePreparedReuseForTest();
-        System.err.println("setupClass done.");
+        logger.info("setupClass done.");
     }
 
     @Test
-    public void testTruncationReleasesLogSpace()
+    public void testSize()
     {
-        Util.flakyTest(this::testSize, 2, "Fails occasionally, see CASSANDRA-16684");
+        Util.flakyTest(this::testSizeFlaky, 2, "Fails occasionally, see CASSANDRA-16684");
     }
 
-    private void testSize()
+    private void testSizeFlaky()
     {
         try
         {
-            keyspace = createKeyspace("CREATE KEYSPACE %s with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } and durable_writes = false");
-            table = createTable(keyspace, "CREATE TABLE %s ( userid bigint, picid bigint, commentid bigint, PRIMARY KEY(userid, picid)) with compression = {'enabled': false}");
+            String keyspace = createKeyspace("CREATE KEYSPACE %s with replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 } and durable_writes = false");
+            String table = createTable(keyspace, "CREATE TABLE %s ( userid bigint, picid bigint, commentid bigint, PRIMARY KEY(userid, picid))" +
+                                                 " with compression = {'enabled': false}" +
+                                                 " and memtable = '" + memtableClass + "'");
             execute("use " + keyspace + ';');
 
             String writeStatement = "INSERT INTO " + table + "(userid,picid,commentid)VALUES(?,?,?)";
 
-            cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
+            ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
             cfs.disableAutoCompaction();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
 
             long deepSizeBefore = ObjectSizes.measureDeep(cfs.getTracker().getView().getCurrentMemtable());
-            System.out.printf("Memtable deep size before %s\n%n",
-                              FBUtilities.prettyPrintMemory(deepSizeBefore));
+            logger.info("Memtable deep size before {}\n",
+                        FBUtilities.prettyPrintMemory(deepSizeBefore));
             long i;
             long limit = partitions;
-            System.out.println("Writing " + partitions + " partitions of " + rowsPerPartition + " rows");
+            logger.info("Writing {} partitions of {} rows", partitions, rowsPerPartition);
             for (i = 0; i < limit; ++i)
             {
                 for (long j = 0; j < rowsPerPartition; ++j)
                     execute(writeStatement, i, j, i + j);
             }
 
-            System.out.println("Deleting " + deletedPartitions + " partitions");
+            logger.info("Deleting {} partitions", deletedPartitions);
             limit += deletedPartitions;
             for (; i < limit; ++i)
             {
@@ -95,7 +117,7 @@
                 execute("DELETE FROM " + table + " WHERE userid = ?", i);
             }
 
-            System.out.println("Deleting " + deletedRows + " rows");
+            logger.info("Deleting {} rows", deletedRows);
             limit += deletedRows;
             for (; i < limit; ++i)
             {
@@ -103,31 +125,28 @@
                 execute("DELETE FROM " + table + " WHERE userid = ? AND picid = ?", i, 0L);
             }
 
-
             if (!cfs.getLiveSSTables().isEmpty())
-                System.out.println("Warning: " + cfs.getLiveSSTables().size() + " sstables created.");
+                logger.info("Warning: " + cfs.getLiveSSTables().size() + " sstables created.");
 
             Memtable memtable = cfs.getTracker().getView().getCurrentMemtable();
-            long actualHeap = memtable.getAllocator().onHeap().owns();
-            System.out.printf("Memtable in %s mode: %d ops, %s serialized bytes, %s (%.0f%%) on heap, %s (%.0f%%) off-heap%n",
-                              DatabaseDescriptor.getMemtableAllocationType(),
-                              memtable.getOperations(),
-                              FBUtilities.prettyPrintMemory(memtable.getLiveDataSize()),
-                              FBUtilities.prettyPrintMemory(actualHeap),
-                              100 * memtable.getAllocator().onHeap().ownershipRatio(),
-                              FBUtilities.prettyPrintMemory(memtable.getAllocator().offHeap().owns()),
-                              100 * memtable.getAllocator().offHeap().ownershipRatio());
+            Memtable.MemoryUsage usage = Memtable.getMemoryUsage(memtable);
+            long actualHeap = usage.ownsOnHeap;
+            logger.info("Memtable in {} mode: {} ops, {} serialized bytes, {}\n",
+                        DatabaseDescriptor.getMemtableAllocationType(),
+                        memtable.operationCount(),
+                        FBUtilities.prettyPrintMemory(memtable.getLiveDataSize()),
+                        usage);
 
             long deepSizeAfter = ObjectSizes.measureDeep(memtable);
-            System.out.printf("Memtable deep size %s\n%n",
-                              FBUtilities.prettyPrintMemory(deepSizeAfter));
+            logger.info("Memtable deep size {}\n",
+                        FBUtilities.prettyPrintMemory(deepSizeAfter));
 
             long expectedHeap = deepSizeAfter - deepSizeBefore;
             String message = String.format("Expected heap usage close to %s, got %s.\n",
                                            FBUtilities.prettyPrintMemory(expectedHeap),
                                            FBUtilities.prettyPrintMemory(actualHeap));
-            System.out.println(message);
-            Assert.assertTrue(message, Math.abs(actualHeap - expectedHeap) <= MAX_DIFFERENCE);
+            logger.info(message);
+            Assert.assertTrue(message, Math.abs(actualHeap - expectedHeap) <= MAX_DIFFERENCE_PARTITIONS * differencePerPartition);
         }
         catch (Throwable throwable)
         {
diff --git a/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java b/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java
index 7ba9889..975f3cf 100644
--- a/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java
+++ b/test/unit/org/apache/cassandra/cql3/NonNativeTimestampTest.java
@@ -19,8 +19,8 @@
 
 import org.junit.Test;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
 public class NonNativeTimestampTest extends CQLTester
diff --git a/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java b/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java
index b4fe0f5..49195f5 100644
--- a/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java
+++ b/test/unit/org/apache/cassandra/cql3/OutOfSpaceTest.java
@@ -17,8 +17,6 @@
  */
 package org.apache.cassandra.cql3;
 
-import static junit.framework.Assert.fail;
-
 import java.io.Closeable;
 import java.util.concurrent.ExecutionException;
 
@@ -28,6 +26,7 @@
 import org.apache.cassandra.Util;
 import org.apache.cassandra.config.Config.DiskFailurePolicy;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.commitlog.CommitLogSegment;
 import org.apache.cassandra.db.Keyspace;
@@ -37,6 +36,8 @@
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.KillerForTests;
 
+import static org.junit.Assert.fail;
+
 /**
  * Test that TombstoneOverwhelmingException gets thrown when it should be and doesn't when it shouldn't be.
  */
@@ -115,7 +116,10 @@
     {
         try
         {
-            Keyspace.open(KEYSPACE).getColumnFamilyStore(currentTable()).forceFlush().get();
+            Keyspace.open(KEYSPACE)
+                    .getColumnFamilyStore(currentTable())
+                    .forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS)
+                    .get();
             fail("FSWriteError expected.");
         }
         catch (ExecutionException e)
diff --git a/test/unit/org/apache/cassandra/cql3/PagingTest.java b/test/unit/org/apache/cassandra/cql3/PagingTest.java
index 50bba0e..a3387c4 100644
--- a/test/unit/org/apache/cassandra/cql3/PagingTest.java
+++ b/test/unit/org/apache/cassandra/cql3/PagingTest.java
@@ -17,9 +17,7 @@
  */
 package org.apache.cassandra.cql3;
 
-import java.net.InetAddress;
 import java.util.Iterator;
-import java.util.List;
 
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -31,16 +29,16 @@
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.SimpleStatement;
 import com.datastax.driver.core.Statement;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
 
-import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.dht.Murmur3Partitioner.LongToken;
 import org.apache.cassandra.locator.*;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static junit.framework.Assert.assertFalse;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertEquals;
 
 
@@ -54,13 +52,14 @@
                                                     " WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 2 };";
 
     private static final String dropKsStatement = "DROP KEYSPACE IF EXISTS " + KEYSPACE;
+    private static EmbeddedCassandraService cassandra;
 
     @BeforeClass
     public static void setup() throws Exception
     {
         System.setProperty("cassandra.config", "cassandra-murmur.yaml");
-        EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
-        cassandra.start();
+
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
 
         // Currently the native server start method return before the server is fully binded to the socket, so we need
         // to wait slightly before trying to connect to it. We should fix this but in the meantime using a sleep.
@@ -78,7 +77,10 @@
     @AfterClass
     public static void tearDown()
     {
-        cluster.close();
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
     }
 
     /**
diff --git a/test/unit/org/apache/cassandra/cql3/PasswordObfuscatorTest.java b/test/unit/org/apache/cassandra/cql3/PasswordObfuscatorTest.java
index 09a366e..96f97b6 100644
--- a/test/unit/org/apache/cassandra/cql3/PasswordObfuscatorTest.java
+++ b/test/unit/org/apache/cassandra/cql3/PasswordObfuscatorTest.java
@@ -29,13 +29,23 @@
 
 public class PasswordObfuscatorTest
 {
-    private static final RoleOptions opts = new RoleOptions();
-    private static final String optsPassword = "testpassword";
+    private static final RoleOptions plainPwdOpts = new RoleOptions();
+    private static final RoleOptions hashedPwdOpts = new RoleOptions();
+    private static final String plainPwd = "testpassword";
+    private static final String hashedPwd = "$2a$10$1fI9MDCe13ZmEYW4XXZibuASNKyqOY828ELGUtml/t.0Mk/6Kqnsq";
 
     @BeforeClass
     public static void startup()
     {
-        opts.setOption(org.apache.cassandra.auth.IRoleManager.Option.PASSWORD, "testpassword");
+        plainPwdOpts.setOption(org.apache.cassandra.auth.IRoleManager.Option.PASSWORD, plainPwd);
+        hashedPwdOpts.setOption(org.apache.cassandra.auth.IRoleManager.Option.HASHED_PASSWORD, hashedPwd);
+    }
+
+    @Test
+    public void testSpecialCharsObfuscation()
+    {
+        assertEquals("ALTER ROLE testrole WITH HASHED PASSWORD = '" + OBFUSCATION_TOKEN + "'",
+                     obfuscate(format("ALTER ROLE testrole WITH HASHED PASSWORD = '%s'",hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -45,7 +55,13 @@
                      obfuscate("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '123'"));
 
         assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '%s'", optsPassword), opts));
+                     obfuscate(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD = '" + hashedPwd + "'"));
+
+        assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD = '%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD = '%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -55,14 +71,20 @@
                      obfuscate("CREATE ROLE role1 WITH password = '123' AND LOGIN = true"));
 
         assertEquals(format("CREATE ROLE role1 WITH password = '%s' AND LOGIN = true", OBFUSCATION_TOKEN),
-                     obfuscate(format("CREATE ROLE role1 WITH password = '%s' AND LOGIN = true", optsPassword), opts));
+                     obfuscate(format("CREATE ROLE role1 WITH password = '%s' AND LOGIN = true", plainPwd), plainPwdOpts));
+
+        assertEquals(format("CREATE ROLE role1 WITH HASHED password %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE ROLE role1 WITH HASHED password = '%s' AND LOGIN = true", hashedPwd)));
+
+        assertEquals(format("CREATE ROLE role1 WITH HASHED password = '%s' AND LOGIN = true", OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE ROLE role1 WITH HASHED password = '%s' AND LOGIN = true", hashedPwd), hashedPwdOpts));
     }
 
     @Test
     public void testCreateRoleWithoutPassword()
     {
         assertEquals("CREATE ROLE role1", obfuscate("CREATE ROLE role1"));
-        assertEquals("CREATE ROLE role1", obfuscate("CREATE ROLE role1", opts));
+        assertEquals("CREATE ROLE role1", obfuscate("CREATE ROLE role1", plainPwdOpts));
     }
 
     @Test
@@ -70,13 +92,21 @@
     {
         assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD %s", OBFUSCATION_TOKEN),
                      obfuscate("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '123';" +
-                                                  "CREATE ROLE role2 WITH LOGIN = true AND PASSWORD = '123'"));
+                               "CREATE ROLE role2 WITH LOGIN = true AND PASSWORD = '123'"));
 
-        assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '%s';"
-                            + "CREATE ROLE role2 WITH LOGIN = true AND PASSWORD = '%s'", OBFUSCATION_TOKEN, OBFUSCATION_TOKEN),
-                     obfuscate(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '%s';"
-                                                         + "CREATE ROLE role2 WITH LOGIN = true AND PASSWORD = '%s'", optsPassword, optsPassword),
-                                                  opts));
+        assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '%s';" +
+                            "CREATE ROLE role2 WITH LOGIN = true AND PASSWORD = '%s'", OBFUSCATION_TOKEN, OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE ROLE role1 WITH LOGIN = true AND PASSWORD = '%s';" +
+                                      "CREATE ROLE role2 WITH LOGIN = true AND PASSWORD = '%s'", plainPwd, plainPwd), plainPwdOpts));
+
+        assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD = '%s';" +
+                               "CREATE ROLE role2 WITH LOGIN = true AND HASHED PASSWORD = '%s'", hashedPwd, hashedPwd)));
+
+        assertEquals(format("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD = '%s';" +
+                            "CREATE ROLE role2 WITH LOGIN = true AND HASHED PASSWORD = '%s'", OBFUSCATION_TOKEN, OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE ROLE role1 WITH LOGIN = true AND HASHED PASSWORD = '%s';" +
+                                      "CREATE ROLE role2 WITH LOGIN = true AND HASHED PASSWORD = '%s'", hashedPwd, hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -86,7 +116,13 @@
                      obfuscate("ALTER ROLE role1 with PASSWORD = '123'"));
 
         assertEquals(format("ALTER ROLE role1 with PASSWORD = '%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("ALTER ROLE role1 with PASSWORD = '%s'", optsPassword), opts));
+                     obfuscate(format("ALTER ROLE role1 with PASSWORD = '%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("ALTER ROLE role1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER ROLE role1 with HASHED PASSWORD = '%s'", hashedPwd)));
+
+        assertEquals(format("ALTER ROLE role1 with HASHED PASSWORD = '%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER ROLE role1 with HASHED PASSWORD = '%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -96,7 +132,13 @@
                      obfuscate("ALTER ROLE role1 with PASSWORD='123'"));
 
         assertEquals(format("ALTER ROLE role1 with PASSWORD='%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("ALTER ROLE role1 with PASSWORD='%s'", optsPassword), opts));
+                     obfuscate(format("ALTER ROLE role1 with PASSWORD='%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("ALTER ROLE role1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER ROLE role1 with HASHED PASSWORD='%s'", hashedPwd)));
+
+        assertEquals(format("ALTER ROLE role1 with HASHED PASSWORD='%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER ROLE role1 with HASHED PASSWORD='%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -106,7 +148,13 @@
                      obfuscate("ALTER ROLE role1 with PASSWORD= '123'"));
 
         assertEquals(format("ALTER ROLE role1 with PASSWORD= '%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("ALTER ROLE role1 with PASSWORD= '%s'", optsPassword), opts));
+                     obfuscate(format("ALTER ROLE role1 with PASSWORD= '%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("ALTER ROLE role1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER ROLE role1 with HASHED PASSWORD= '%s'", hashedPwd)));
+
+        assertEquals(format("ALTER ROLE role1 with HASHED PASSWORD= '%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER ROLE role1 with HASHED PASSWORD= '%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -114,7 +162,9 @@
     {
         assertEquals("ALTER ROLE role1", obfuscate("ALTER ROLE role1"));
 
-        assertEquals("ALTER ROLE role1", obfuscate("ALTER ROLE role1", opts));
+        assertEquals("ALTER ROLE role1", obfuscate("ALTER ROLE role1", plainPwdOpts));
+
+        assertEquals("ALTER ROLE role1", obfuscate("ALTER ROLE role1", hashedPwdOpts));
     }
 
     @Test
@@ -124,7 +174,13 @@
                      obfuscate("CREATE USER user1 with PASSWORD '123'"));
 
         assertEquals(format("CREATE USER user1 with PASSWORD '%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("CREATE USER user1 with PASSWORD '%s'", optsPassword), opts));
+                     obfuscate(format("CREATE USER user1 with PASSWORD '%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("CREATE USER user1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE USER user1 with HASHED PASSWORD '%s'", hashedPwd)));
+
+        assertEquals(format("CREATE USER user1 with HASHED PASSWORD '%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE USER user1 with HASHED PASSWORD '%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -132,7 +188,9 @@
     {
         assertEquals("CREATE USER user1", obfuscate("CREATE USER user1"));
 
-        assertEquals("CREATE USER user1", obfuscate("CREATE USER user1", opts));
+        assertEquals("CREATE USER user1", obfuscate("CREATE USER user1", plainPwdOpts));
+
+        assertEquals("CREATE USER user1", obfuscate("CREATE USER user1", hashedPwdOpts));
     }
 
     @Test
@@ -142,7 +200,13 @@
                      obfuscate("ALTER USER user1 with PASSWORD '123'"));
 
         assertEquals(format("ALTER USER user1 with PASSWORD '%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("ALTER USER user1 with PASSWORD '%s'", optsPassword), opts));
+                     obfuscate(format("ALTER USER user1 with PASSWORD '%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("ALTER USER user1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER USER user1 with HASHED PASSWORD '%s'", hashedPwd)));
+
+        assertEquals(format("ALTER USER user1 with HASHED PASSWORD '%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER USER user1 with HASHED PASSWORD '%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -152,7 +216,13 @@
                      obfuscate("ALTER USER user1 with paSSwoRd '123'"));
 
         assertEquals(format("ALTER USER user1 with paSSwoRd '%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("ALTER USER user1 with paSSwoRd '%s'", optsPassword), opts));
+                     obfuscate(format("ALTER USER user1 with paSSwoRd '%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("ALTER USER user1 with HASHED paSSwoRd %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER USER user1 with HASHED paSSwoRd '%s'", hashedPwd)));
+
+        assertEquals(format("ALTER USER user1 with HASHED paSSwoRd '%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER USER user1 with HASHED paSSwoRd '%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -162,7 +232,13 @@
                      obfuscate("ALTER USER user1 with PASSWORD\n'123'"));
 
         assertEquals(format("ALTER USER user1 with PASSWORD\n'%s'", OBFUSCATION_TOKEN),
-                     obfuscate(format("ALTER USER user1 with PASSWORD\n'%s'", optsPassword), opts));
+                     obfuscate(format("ALTER USER user1 with PASSWORD\n'%s'", plainPwd), plainPwdOpts));
+
+        assertEquals(format("ALTER USER user1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER USER user1 with HASHED PASSWORD\n'%s'", hashedPwd)));
+
+        assertEquals(format("ALTER USER user1 with HASHED PASSWORD\n'%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("ALTER USER user1 with HASHED PASSWORD\n'%s'", hashedPwd), hashedPwdOpts));
     }
 
     @Test
@@ -175,6 +251,12 @@
         newLinePassOpts.setOption(org.apache.cassandra.auth.IRoleManager.Option.PASSWORD, "test\npassword");
         assertEquals(String.format("CREATE USER user1 with PASSWORD '%s'", OBFUSCATION_TOKEN),
                      obfuscate(format("CREATE USER user1 with PASSWORD '%s'", "test\npassword"), newLinePassOpts));
+
+        assertEquals(String.format("CREATE USER user1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate("CREATE USER user1 with HASHED PASSWORD 'a\nb'"));
+
+        assertEquals(String.format("CREATE USER user1 with HASHED PASSWORD '%s'", OBFUSCATION_TOKEN),
+                     obfuscate(format("CREATE USER user1 with HASHED PASSWORD '%s'", "test\npassword"), newLinePassOpts));
     }
 
     @Test
@@ -187,6 +269,12 @@
         emptyPassOpts.setOption(org.apache.cassandra.auth.IRoleManager.Option.PASSWORD, "");
         assertEquals("CREATE USER user1 with PASSWORD ''",
                      obfuscate("CREATE USER user1 with PASSWORD ''", emptyPassOpts));
+
+        assertEquals(String.format("CREATE USER user1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate("CREATE USER user1 with HASHED PASSWORD ''"));
+
+        assertEquals("CREATE USER user1 with HASHED PASSWORD ''",
+                     obfuscate("CREATE USER user1 with HASHED PASSWORD ''", emptyPassOpts));
     }
 
     @Test
@@ -194,6 +282,9 @@
     {
         assertEquals(String.format("CREATE USER user1 with PASSWORD %s", OBFUSCATION_TOKEN),
                      obfuscate("CREATE USER user1 with PASSWORD 'p a ss wor d'"));
+
+        assertEquals(String.format("CREATE USER user1 with HASHED PASSWORD %s", OBFUSCATION_TOKEN),
+                     obfuscate("CREATE USER user1 with HASHED PASSWORD 'p a ss wor d'"));
     }
 
     @Test
@@ -211,8 +302,23 @@
                             "APPLY BATCH;", OBFUSCATION_TOKEN),
                      obfuscate(format("BEGIN BATCH \n" +
                                       "    CREATE ROLE alice1 WITH PASSWORD = '%s' and LOGIN = true; \n" +
-                                      "APPLY BATCH;", optsPassword),
-                               opts));
+                                      "APPLY BATCH;", plainPwd),
+                               plainPwdOpts));
+
+        assertEquals(format("BEGIN BATCH \n" +
+                            "    CREATE ROLE alice1 WITH HASHED PASSWORD %s",
+                            OBFUSCATION_TOKEN),
+                     obfuscate("BEGIN BATCH \n" +
+                               "    CREATE ROLE alice1 WITH HASHED PASSWORD = '" + hashedPwd + "' and LOGIN = true; \n" +
+                               "APPLY BATCH;"));
+
+        assertEquals(format("BEGIN BATCH \n" +
+                            "    CREATE ROLE alice1 WITH HASHED PASSWORD = '%s' and LOGIN = true; \n" +
+                            "APPLY BATCH;", OBFUSCATION_TOKEN),
+                     obfuscate(format("BEGIN BATCH \n" +
+                          "    CREATE ROLE alice1 WITH HASHED PASSWORD = '%s' and LOGIN = true; \n" +
+                          "APPLY BATCH;", hashedPwd),
+                               hashedPwdOpts));
     }
 
     @Test
@@ -234,7 +340,26 @@
                      obfuscate(format("BEGIN BATCH \n" +
                                       "    CREATE ROLE alice1 WITH PASSWORD = '%s' and LOGIN = true; \n" +
                                       "    CREATE ROLE alice2 WITH PASSWORD = '%s' and LOGIN = true; \n" +
-                                      "APPLY BATCH;", optsPassword, optsPassword),
-                               opts));
+                                      "APPLY BATCH;", plainPwd, plainPwd),
+                               plainPwdOpts));
+
+        assertEquals(format("BEGIN BATCH \n" +
+                            "    CREATE ROLE alice1 WITH HASHED PASSWORD %s",
+                            OBFUSCATION_TOKEN),
+                     obfuscate("BEGIN BATCH \n" +
+                               "    CREATE ROLE alice1 WITH HASHED PASSWORD = '" + hashedPwd + "' and LOGIN = true; \n" +
+                               "    CREATE ROLE alice2 WITH HASHED PASSWORD = '" + hashedPwd + "' and LOGIN = true; \n" +
+                               "APPLY BATCH;"));
+
+        assertEquals(format("BEGIN BATCH \n" +
+                            "    CREATE ROLE alice1 WITH HASHED PASSWORD = '%s' and LOGIN = true; \n" +
+                            "    CREATE ROLE alice2 WITH HASHED PASSWORD = '%s' and LOGIN = true; \n" +
+                            "APPLY BATCH;"
+                            , OBFUSCATION_TOKEN, OBFUSCATION_TOKEN),
+                     obfuscate(format("BEGIN BATCH \n" +
+                                      "    CREATE ROLE alice1 WITH HASHED PASSWORD = '%s' and LOGIN = true; \n" +
+                                      "    CREATE ROLE alice2 WITH HASHED PASSWORD = '%s' and LOGIN = true; \n" +
+                                      "APPLY BATCH;", hashedPwd, hashedPwd),
+                               hashedPwdOpts));
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/PreparedStatementsTest.java b/test/unit/org/apache/cassandra/cql3/PreparedStatementsTest.java
index d885071..ffd7e25 100644
--- a/test/unit/org/apache/cassandra/cql3/PreparedStatementsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/PreparedStatementsTest.java
@@ -58,7 +58,7 @@
     @Test
     public void testInvalidatePreparedStatementsOnDrop()
     {
-        Session session = sessions.get(ProtocolVersion.V5);
+        Session session = sessionNet(ProtocolVersion.V5);
         session.execute(dropKsStatement);
         session.execute(createKsStatement);
 
@@ -102,7 +102,7 @@
 
     private void testInvalidatePreparedStatementOnAlter(ProtocolVersion version, boolean supportsMetadataChange)
     {
-        Session session = sessions.get(version);
+        Session session = sessionNet(version);
         String createTableStatement = "CREATE TABLE IF NOT EXISTS " + KEYSPACE + ".qp_cleanup (a int PRIMARY KEY, b int, c int);";
         String alterTableStatement = "ALTER TABLE " + KEYSPACE + ".qp_cleanup ADD d int;";
 
@@ -162,7 +162,7 @@
 
     private void testInvalidatePreparedStatementOnAlterUnchangedMetadata(ProtocolVersion version)
     {
-        Session session = sessions.get(version);
+        Session session = sessionNet(version);
         String createTableStatement = "CREATE TABLE IF NOT EXISTS " + KEYSPACE + ".qp_cleanup (a int PRIMARY KEY, b int, c int);";
         String alterTableStatement = "ALTER TABLE " + KEYSPACE + ".qp_cleanup ADD d int;";
 
@@ -200,7 +200,7 @@
     @Test
     public void testStatementRePreparationOnReconnect()
     {
-        Session session = sessions.get(ProtocolVersion.V5);
+        Session session = sessionNet(ProtocolVersion.V5);
         session.execute("USE " + keyspace());
 
         session.execute(dropKsStatement);
@@ -241,7 +241,7 @@
     @Test
     public void prepareAndExecuteWithCustomExpressions() throws Throwable
     {
-        Session session = sessions.get(ProtocolVersion.V5);
+        Session session = sessionNet(ProtocolVersion.V5);
 
         session.execute(dropKsStatement);
         session.execute(createKsStatement);
diff --git a/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java b/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java
index 8e3f7f4..2d0ea3b 100644
--- a/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java
+++ b/test/unit/org/apache/cassandra/cql3/PstmtPersistenceTest.java
@@ -32,10 +32,12 @@
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.SchemaKeyspaceTables;
 import org.apache.cassandra.service.ClientState;
-import org.apache.cassandra.service.QueryState;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.MD5Digest;
 
+import static java.util.Collections.emptyMap;
+import static org.apache.cassandra.service.QueryState.forInternalCalls;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.*;
 
 public class PstmtPersistenceTest extends CQLTester
@@ -130,7 +132,7 @@
     {
         QueryProcessor.Prepared prepared = handler.getPrepared(stmtId);
         Assert.assertNotNull(prepared);
-        handler.processPrepared(prepared.statement, QueryState.forInternalCalls(), options, Collections.emptyMap(), System.nanoTime());
+        handler.processPrepared(prepared.statement, forInternalCalls(), options, emptyMap(), nanoTime());
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/cql3/ViewAbstractParameterizedTest.java b/test/unit/org/apache/cassandra/cql3/ViewAbstractParameterizedTest.java
new file mode 100644
index 0000000..629d407
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/ViewAbstractParameterizedTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.cql3;
+
+import java.util.Collection;
+import java.util.stream.Collectors;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import com.datastax.driver.core.ResultSet;
+import org.apache.cassandra.transport.ProtocolVersion;
+
+@Ignore
+@RunWith(Parameterized.class)
+public abstract class ViewAbstractParameterizedTest extends ViewAbstractTest
+{
+    @Parameterized.Parameter
+    public ProtocolVersion version;
+
+    @Parameterized.Parameters()
+    public static Collection<Object[]> versions()
+    {
+        return ProtocolVersion.SUPPORTED.stream()
+                                        .map(v -> new Object[]{v})
+                                        .collect(Collectors.toList());
+    }
+
+    @Before
+    @Override
+    public void beforeTest() throws Throwable
+    {
+        super.beforeTest();
+
+        executeNet("USE " + keyspace());
+    }
+
+    @Override
+    protected com.datastax.driver.core.ResultSet executeNet(String query, Object... values) throws Throwable
+    {
+        return executeNet(version, query, values);
+    }
+
+    @Override
+    protected com.datastax.driver.core.ResultSet executeNetWithPaging(String query, int pageSize)
+    {
+        return executeNetWithPaging(version, query, pageSize);
+    }
+
+    @Override
+    protected void assertRowsNet(ResultSet result, Object[]... rows)
+    {
+        assertRowsNet(version, result, rows);
+    }
+
+    @Override
+    protected void updateView(String query, Object... params) throws Throwable
+    {
+        updateView(version, query, params);
+    }
+
+    protected void updateViewWithFlush(String query, boolean flush, Object... params) throws Throwable
+    {
+        updateView(query, params);
+        if (flush)
+            flush(keyspace());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewAbstractTest.java b/test/unit/org/apache/cassandra/cql3/ViewAbstractTest.java
index bbd21dc..4b96ae2 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewAbstractTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewAbstractTest.java
@@ -18,24 +18,13 @@
 
 package org.apache.cassandra.cql3;
 
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 
-import com.datastax.driver.core.exceptions.OperationTimedOutException;
-import org.apache.cassandra.concurrent.Stage;
-import org.awaitility.Awaitility;
-
 @Ignore
 public abstract class ViewAbstractTest extends CQLTester
 {
-    protected final List<String> views = new ArrayList<>();
-
     @BeforeClass
     public static void startup()
     {
@@ -43,66 +32,12 @@
     }
 
     @Before
-    public void begin()
+    @Override
+    public void beforeTest() throws Throwable
     {
-        begin(views);
-    }
+        super.beforeTest();
 
-    private static void begin(List<String> views)
-    {
-        views.clear();
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        end(views, this);
-    }
-
-    private static void end(List<String> views, CQLTester tester) throws Throwable
-    {
-        for (String viewName : views)
-            tester.executeNet("DROP MATERIALIZED VIEW " + viewName);
-    }
-
-    protected void createView(String name, String query) throws Throwable
-    {
-        createView(name, query, views, this);
-    }
-
-    private static void createView(String name, String query, List<String> views, CQLTester tester) throws Throwable
-    {
-        try
-        {
-            tester.executeNet(String.format(query, name));
-            // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is
-            // the desired behavior
-            views.add(name);
-        }
-        catch (OperationTimedOutException ex)
-        {
-            // ... except for timeout, when we actually do not know whether the view was created or not
-            views.add(name);
-            throw ex;
-        }
-    }
-
-    protected void updateView(String query, Object... params) throws Throwable
-    {
-        updateView(query, this, params);
-    }
-
-    private static void updateView(String query, CQLTester tester, Object... params) throws Throwable
-    {
-        tester.executeNet(query, params);
-        waitForViewMutations();
-    }
-
-    protected static void waitForViewMutations()
-    {
-        Awaitility.await()
-                  .atMost(5, TimeUnit.MINUTES)
-                  .until(() -> Stage.VIEW_MUTATION.executor().getPendingTaskCount() == 0
-                               && Stage.VIEW_MUTATION.executor().getActiveTaskCount() == 0);
+        execute("USE " + keyspace());
+        executeNet("USE " + keyspace());
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsPartialTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsPartialTest.java
index 377621e..a05621c 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsPartialTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsPartialTest.java
@@ -23,8 +23,8 @@
 import org.junit.Ignore;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.FBUtilities;
 
 /* ViewComplexTest 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:
@@ -36,52 +36,62 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexDeletionsPartialTest extends ViewComplexTester
+public class ViewComplexDeletionsPartialTest extends ViewAbstractParameterizedTest
 {
-    // for now, unselected column cannot be fully supported, SEE CASSANDRA-11500
+    // for now, unselected column cannot be fully supported, see CASSANDRA-11500
     @Ignore
     @Test
-    public void testPartialDeleteUnselectedColumn() throws Throwable
+    public void testPartialDeleteUnselectedColumnWithFlush() throws Throwable
     {
-        boolean flush = true;
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
+        testPartialDeleteUnselectedColumn(true);
+    }
+
+    // for now, unselected column cannot be fully supported, see CASSANDRA-11500
+    @Ignore
+    @Test
+    public void testPartialDeleteUnselectedColumnWithoutFlush() throws Throwable
+    {
+        testPartialDeleteUnselectedColumn(false);
+    }
+
+    private void testPartialDeleteUnselectedColumn(boolean flush) throws Throwable
+    {
         createTable("CREATE TABLE %s (k int, c int, a int, b int, PRIMARY KEY (k, c))");
-        String mv = createView("CREATE MATERIALIZED VIEW %s " +
-                                 "AS SELECT k,c FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS " +
+                   "SELECT k,c FROM %s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
         Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         updateView("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, 1));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
+        assertRows(executeView("SELECT * FROM %s"), row(1, 1));
         updateView("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * FROM %s"));
         updateView("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRows(execute("SELECT * from %s"), row(1, 1, 1, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
+        assertRows(executeView("SELECT * FROM %s"), row(1, 1));
 
         execute("truncate %s;");
 
         // removal generated by unselected column should not shadow PK update with smaller timestamp
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET a=1 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, 1, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
+        assertRows(executeView("SELECT * FROM %s"), row(1, 1));
 
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 20 SET a=null WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"));
-        assertRows(execute("SELECT * from " + mv));
+        assertRows(executeView("SELECT * FROM %s"));
 
         updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1));
+        assertRows(executeView("SELECT * FROM %s"), row(1, 1));
     }
 
     @Test
@@ -98,78 +108,76 @@
 
     private void testPartialDeleteSelectedColumn(boolean flush) throws Throwable
     {
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         createTable("CREATE TABLE %s (k int, c int, a int, b int, e int, f int, PRIMARY KEY (k, c))");
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s " +
-                                 "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %s " +
+                     "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
         Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 10 SET b=1 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, 1));
 
         updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 11 WHERE k=1 AND c=1", flush);
         assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
 
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 1 SET a=1 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, 1, null));
 
         updateViewWithFlush("DELETE a FROM %s USING TIMESTAMP 1 WHERE k=1 AND c=1", flush);
         assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
 
         // view livenessInfo should not be affected by selected column ts or tb
         updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 0", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 12 SET b=1 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, 1));
 
         updateViewWithFlush("DELETE b FROM %s USING TIMESTAMP 13 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 14 WHERE k=1 AND c=1", flush);
         assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
 
         updateViewWithFlush("INSERT INTO %s(k,c) VALUES(1,1) USING TIMESTAMP 15", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         updateViewWithFlush("UPDATE %s USING TTL 3 SET b=1 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, 1, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 1));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, 1));
 
         TimeUnit.SECONDS.sleep(4);
 
         assertRows(execute("SELECT * from %s"), row(1, 1, null, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         updateViewWithFlush("DELETE FROM %s USING TIMESTAMP 15 WHERE k=1 AND c=1", flush);
         assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
 
         execute("truncate %s;");
 
         // removal generated by unselected column should not shadow selected column with smaller timestamp
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=1 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, null, null, 1, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 18 SET e=null WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"));
-        assertRows(execute("SELECT * from " + mv));
+        assertRows(executeView("SELECT * from %s"));
 
         updateViewWithFlush("UPDATE %s USING TIMESTAMP 16 SET a=1 WHERE k=1 AND c=1", flush);
         assertRows(execute("SELECT * from %s"), row(1, 1, 1, null, null, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, 1, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, 1, null));
     }
 
     @Test
@@ -189,39 +197,36 @@
         // for partition range deletion, need to know that existing row is shadowed instead of not existed.
         createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                                 "WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                     "WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)");
 
         Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 0", 1, 1, 1, 1);
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"), row(1, 1, 1, 1));
 
         // remove view row
         updateView("UPDATE %s using timestamp 1 set b = null WHERE a=1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"));
         // remove base row, no view updated generated.
         updateView("DELETE FROM %s using timestamp 2 where a=1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"));
 
         // restor view row with b,c column. d is still tombstone
         updateView("UPDATE %s using timestamp 3 set b = 1,c = 1 where a=1"); // upsert
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv), row(1, 1, 1, null));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"), row(1, 1, 1, null));
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java
index 24d76d4..d9fe7f1 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexDeletionsTest.java
@@ -19,23 +19,22 @@
 package org.apache.cassandra.cql3;
 
 import java.util.Arrays;
-import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertEquals;
 
-/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
+/* ViewComplexTest 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:
  * - ViewComplexUpdatesTest
  * - ViewComplexDeletionsTest
@@ -45,7 +44,7 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexDeletionsTest extends ViewComplexTester
+public class ViewComplexDeletionsTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testCommutativeRowDeletionFlush() throws Throwable
@@ -66,57 +65,55 @@
         // CASSANDRA-13409 new update should not resurrect previous deleted data in view
         createTable("create table %s (p int primary key, v1 int, v2 int)");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("create materialized view %s as select * from %%s " +
-                                 "where p is not null and v1 is not null primary key (v1, p)");
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        createView("create materialized view %s as select * from %s " +
+                     "where p is not null and v1 is not null primary key (v1, p)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         // sstable-1, Set initial values TS=1
         updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L));
+        assertRowsIgnoringOrder(executeView("SELECT v2, WRITETIME(v2) from %s WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L));
         // sstable-2
         updateView("Delete from %s using timestamp 2 where p = 3;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"));
         // sstable-3
         updateView("Insert into %s (p, v1) values (3, 1) using timestamp 3;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, null, null));
         // sstable-4
         updateView("UPdate %s using timestamp 4 set v1 = 2 where p = 3;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(2, 3, null, null));
         // sstable-5
         updateView("UPdate %s using timestamp 5 set v1 = 1 where p = 3;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, null, null));
 
         if (flush)
         {
             // compact sstable 2 and 4, 5;
-            ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv);
+            ColumnFamilyStore cfs = ks.getColumnFamilyStore(currentView());
             List<String> sstables = cfs.getLiveSSTables()
                                        .stream()
-                                       .sorted(Comparator.comparingInt(s -> s.descriptor.generation))
+                                       .sorted(SSTableReader.idComparator)
                                        .map(SSTableReader::getFilename)
                                        .collect(Collectors.toList());
             String dataFiles = String.join(",", Arrays.asList(sstables.get(1), sstables.get(3), sstables.get(4)));
@@ -124,7 +121,7 @@
             assertEquals(3, cfs.getLiveSSTables().size());
         }
         // regular tombstone should be retained after compaction
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, null, null));
     }
 
     @Test
@@ -145,60 +142,58 @@
     {
         createTable("create table %s (p1 int, p2 int, v1 int, v2 int, primary key(p1, p2))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("create materialized view %s as select * from %%s " +
-                                 "where p1 is not null and p2 is not null primary key (p2, p1)");
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        createView("create materialized view %s as select * from %s " +
+                     "where p1 is not null and p2 is not null primary key (p2, p1)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         // Set initial values TS=1
         updateView("Insert into %s (p1, p2, v1, v2) values (1, 2, 3, 4) using timestamp 1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2),
+        assertRowsIgnoringOrder(executeView("SELECT v1, v2, WRITETIME(v2) from %s WHERE p1 = ? AND p2 = ?", 1, 2),
                                 row(3, 4, 1L));
         // remove row/mv TS=2
         updateView("Delete from %s using timestamp 2 where p1 = 1 and p2 = 2;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         // view are empty
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"));
         // insert PK with TS=3
         updateView("Insert into %s (p1, p2) values (1, 2) using timestamp 3;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         // deleted column in MV remained dead
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(2, 1, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"), row(2, 1, null, null));
 
-        ks.getColumnFamilyStore(mv).forceMajorCompaction();
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(2, 1, null, null));
+        ks.getColumnFamilyStore(currentView()).forceMajorCompaction();
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"), row(2, 1, null, null));
 
         // reset values
         updateView("Insert into %s (p1, p2, v1, v2) values (1, 2, 3, 4) using timestamp 10;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2),
+        assertRowsIgnoringOrder(executeView("SELECT v1, v2, WRITETIME(v2) from %s WHERE p1 = ? AND p2 = ?", 1, 2),
                                 row(3, 4, 10L));
 
         updateView("UPDATE %s using timestamp 20 SET v2 = 5 WHERE p1 = 1 and p2 = 2");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2),
+        assertRowsIgnoringOrder(executeView("SELECT v1, v2, WRITETIME(v2) from %s WHERE p1 = ? AND p2 = ?", 1, 2),
                                 row(3, 5, 20L));
 
         updateView("DELETE FROM %s using timestamp 10 WHERE p1 = 1 and p2 = 2");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, v2, WRITETIME(v2) from " + mv + " WHERE p1 = ? AND p2 = ?", 1, 2),
+        assertRowsIgnoringOrder(executeView("SELECT v1, v2, WRITETIME(v2) from %s WHERE p1 = ? AND p2 = ?", 1, 2),
                                 row(null, 5, 20L));
     }
 
@@ -206,75 +201,70 @@
     {
         createTable("create table %s (p int primary key, v1 int, v2 int)");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("create materialized view %s as select * from %%s " +
-                                 "where p is not null and v1 is not null primary key (v1, p)");
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        createView("create materialized view %s as select * from %s " +
+                     "where p is not null and v1 is not null primary key (v1, p)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         // Set initial values TS=1
         updateView("Insert into %s (p, v1, v2) values (3, 1, 5) using timestamp 1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(5, 1L));
+        assertRowsIgnoringOrder(executeView("SELECT v2, WRITETIME(v2) from %s WHERE v1 = ? AND p = ?", 1, 3), row(5, 1L));
         // remove row/mv TS=2
         updateView("Delete from %s using timestamp 2 where p = 3;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         // view are empty
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"));
         // insert PK with TS=3
         updateView("Insert into %s (p, v1) values (3, 1) using timestamp 3;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         // deleted column in MV remained dead
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(1, 3, null));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"), row(1, 3, null));
 
         // insert values TS=2, it should be considered dead due to previous tombstone
         updateView("Insert into %s (p, v1, v2) values (3, 1, 5) using timestamp 2;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         // deleted column in MV remained dead
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(1, 3, null));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " limit 1"), row(1, 3, null));
+        assertRowsIgnoringOrder(executeView("SELECT * FROM %s"), row(1, 3, null));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s limit 1"), row(1, 3, null));
 
         // insert values TS=2, it should be considered dead due to previous tombstone
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET v2 = ? WHERE p = ?", 4, 3);
+        executeNet("UPDATE %s USING TIMESTAMP 3 SET v2 = ? WHERE p = ?", 4, 3);
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 4, 3L));
+        assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, 4, 3L));
 
-        ks.getColumnFamilyStore(mv).forceMajorCompaction();
-        assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 4, 3L));
-        assertRows(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(1, 3, 4, 3L));
+        ks.getColumnFamilyStore(currentView()).forceMajorCompaction();
+        assertRows(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, 4, 3L));
+        assertRows(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s limit 1"), row(1, 3, 4, 3L));
     }
 
     @Test
     public void testNoBatchlogCleanupForLocalMutations() throws Throwable
     {
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
         createTable("CREATE TABLE %s (k1 int primary key, v1 int)");
-        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
                    "WHERE k1 IS NOT NULL AND v1 IS NOT NULL PRIMARY KEY (v1, k1)");
 
         ColumnFamilyStore batchlog = Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.BATCHES);
         batchlog.disableAutoCompaction();
-        batchlog.forceBlockingFlush();
+        Util.flush(batchlog);
         int batchlogSSTables = batchlog.getLiveSSTables().size();
 
         updateView("INSERT INTO %s(k1, v1) VALUES(1, 1)");
-        batchlog.forceBlockingFlush();
+        Util.flush(batchlog);
         assertEquals(batchlogSSTables, batchlog.getLiveSSTables().size());
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessLimitTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessLimitTest.java
index 2be826f..0d3ab67 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessLimitTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessLimitTest.java
@@ -22,6 +22,7 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.Keyspace;
 
 import static org.junit.Assert.assertEquals;
@@ -36,7 +37,7 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexLivenessLimitTest extends ViewComplexTester
+public class ViewComplexLivenessLimitTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testExpiredLivenessLimitWithFlush() throws Throwable
@@ -56,13 +57,11 @@
     {
         createTable("CREATE TABLE %s (k int PRIMARY KEY, a int, b int);");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
                                 "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a)");
-        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
                                 "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)");
         ks.getColumnFamilyStore(mv1).disableAutoCompaction();
         ks.getColumnFamilyStore(mv2).disableAutoCompaction();
@@ -76,19 +75,20 @@
             // create expired liveness
             updateView("DELETE a FROM %s WHERE k = ?;", i);
         }
+
         if (flush)
         {
-            ks.getColumnFamilyStore(mv1).forceBlockingFlush();
-            ks.getColumnFamilyStore(mv2).forceBlockingFlush();
+            Util.flushTable(ks, mv1);
+            Util.flushTable(ks, mv2);
         }
 
         for (String view : Arrays.asList(mv1, mv2))
         {
             // paging
-            assertEquals(1, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s limit 1", view), 1).all().size());
-            assertEquals(2, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s limit 2", view), 1).all().size());
-            assertEquals(2, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s", view), 1).all().size());
-            assertRowsNet(version, executeNetWithPaging(version, String.format("SELECT k,a,b FROM %s ", view), 1),
+            assertEquals(1, executeNetWithPaging(String.format("SELECT k,a,b FROM %s limit 1", view), 1).all().size());
+            assertEquals(2, executeNetWithPaging(String.format("SELECT k,a,b FROM %s limit 2", view), 1).all().size());
+            assertEquals(2, executeNetWithPaging(String.format("SELECT k,a,b FROM %s", view), 1).all().size());
+            assertRowsNet(executeNetWithPaging(String.format("SELECT k,a,b FROM %s ", view), 1),
                           row(50, 50, 50),
                           row(100, 100, 100));
             // limit
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java
index 1e327e2..99caecc 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexLivenessTest.java
@@ -20,9 +20,9 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertEquals;
 
@@ -36,28 +36,36 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexLivenessTest extends ViewComplexTester
+public class ViewComplexLivenessTest extends ViewAbstractParameterizedTest
 {
     @Test
-    public void testUnselectedColumnWithExpiredLivenessInfo() throws Throwable
+    public void testUnselectedColumnWithExpiredLivenessInfoWithFlush() throws Throwable
     {
-        boolean flush = true;
+        testUnselectedColumnWithExpiredLivenessInfo(true);
+    }
+
+    @Test
+    public void testUnselectedColumnWithExpiredLivenessInfoWithoutFlush() throws Throwable
+    {
+        testUnselectedColumnWithExpiredLivenessInfo(false);
+    }
+
+    private void testUnselectedColumnWithExpiredLivenessInfo(boolean flush) throws Throwable
+    {
         createTable("create table %s (k int, c int, a int, b int, PRIMARY KEY(k, c))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String name = createView("create materialized view %s as select k,c,b from %%s " +
-                                 "where c is not null and k is not null primary key (c, k)");
-        ks.getColumnFamilyStore(name).disableAutoCompaction();
+        createView("create materialized view %s as select k,c,b from %s " +
+                   "where c is not null and k is not null primary key (c, k)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         // sstable-1, Set initial values TS=1
         updateViewWithFlush("UPDATE %s SET a = 1 WHERE k = 1 AND c = 1;", flush);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, 1, null));
-        assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"),
+        assertRowsIgnoringOrder(executeView("SELECT k,c,b from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, null));
 
         // sstable-2
@@ -65,28 +73,28 @@
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, 1, null));
-        assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"),
+        assertRowsIgnoringOrder(executeView("SELECT k,c,b from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, null));
 
         Thread.sleep(5001);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, 1, null));
-        assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"),
+        assertRowsIgnoringOrder(executeView("SELECT k,c,b from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, null));
 
         // sstable-3
         updateViewWithFlush("Update %s set a = null where k = 1 AND c = 1;", flush);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"));
-        assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"));
+        assertRowsIgnoringOrder(executeView("SELECT k,c,b from %s WHERE k = 1 AND c = 1;"));
 
         // sstable-4
         updateViewWithFlush("Update %s USING TIMESTAMP 1 set b = 1 where k = 1 AND c = 1;", flush);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT k,c,b from " + name + " WHERE k = 1 AND c = 1;"),
+        assertRowsIgnoringOrder(executeView("SELECT k,c,b from %s WHERE k = 1 AND c = 1;"),
                                 row(1, 1, 1));
     }
 
@@ -95,22 +103,20 @@
     {
         createTable("create table %s (p int primary key, v1 int, v2 int)");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String name = createView("create materialized view %s as select * from %%s " +
-                                 "where p is not null and v1 is not null primary key (v1, p) " +
-                                 "with gc_grace_seconds=5");
-        ColumnFamilyStore cfs = ks.getColumnFamilyStore(name);
+        createView("create materialized view %s as select * from %s " +
+                   "where p is not null and v1 is not null primary key (v1, p) " +
+                   "with gc_grace_seconds=5");
+        ColumnFamilyStore cfs = ks.getColumnFamilyStore(currentView());
         cfs.disableAutoCompaction();
 
         updateView("Insert into %s (p, v1, v2) values (1, 1, 1)");
-        assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name), row(1, 1, 1));
+        assertRowsIgnoringOrder(executeView("SELECT p, v1, v2 from %s"), row(1, 1, 1));
 
         updateView("Update %s set v1 = null WHERE p = 1");
-        FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name));
+        Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT p, v1, v2 from %s"));
 
         cfs.forceMajorCompaction(); // before gc grace second, strict-liveness tombstoned dead row remains
         assertEquals(1, cfs.getLiveSSTables().size());
@@ -122,17 +128,17 @@
         assertEquals(0, cfs.getLiveSSTables().size());
 
         updateView("Update %s using ttl 5 set v1 = 1 WHERE p = 1");
-        FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name), row(1, 1, 1));
+        Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT p, v1, v2 from %s"), row(1, 1, 1));
 
         cfs.forceMajorCompaction(); // before ttl+gc_grace_second, strict-liveness ttled dead row remains
         assertEquals(1, cfs.getLiveSSTables().size());
-        assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name), row(1, 1, 1));
+        assertRowsIgnoringOrder(executeView("SELECT p, v1, v2 from %s"), row(1, 1, 1));
 
         Thread.sleep(5500); // after expired, before gc_grace_second
         cfs.forceMajorCompaction();// before ttl+gc_grace_second, strict-liveness ttled dead row remains
         assertEquals(1, cfs.getLiveSSTables().size());
-        assertRowsIgnoringOrder(execute("SELECT p, v1, v2 from " + name));
+        assertRowsIgnoringOrder(executeView("SELECT p, v1, v2 from %s"));
 
         Thread.sleep(5500); // after expired + gc_grace_second
         assertEquals(1, cfs.getLiveSSTables().size()); // no auto compaction.
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java
index b44c8d0..93c25c9 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTTLTest.java
@@ -20,8 +20,8 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -36,7 +36,7 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexTTLTest extends ViewComplexTester
+public class ViewComplexTTLTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testUpdateColumnInViewPKWithTTLWithFlush() throws Throwable
@@ -57,76 +57,74 @@
         // CASSANDRA-13657 if base column used in view pk is ttled, then view row is considered dead
         createTable("create table %s (k int primary key, a int, b int)");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                               "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)");
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (a, k)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         updateView("UPDATE %s SET a = 1 WHERE k = 1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRows(execute("SELECT * from %s"), row(1, 1, null));
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null));
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null));
 
         updateView("DELETE a FROM %s WHERE k = 1");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRows(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
 
         updateView("INSERT INTO %s (k) VALUES (1);");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRows(execute("SELECT * from %s"), row(1, null, null));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
 
         updateView("UPDATE %s USING TTL 5 SET a = 10 WHERE k = 1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRows(execute("SELECT * from %s"), row(1, 10, null));
-        assertRows(execute("SELECT * from " + mv), row(10, 1, null));
+        assertRows(executeView("SELECT * from %s"), row(10, 1, null));
 
         updateView("UPDATE %s SET b = 100 WHERE k = 1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRows(execute("SELECT * from %s"), row(1, 10, 100));
-        assertRows(execute("SELECT * from " + mv), row(10, 1, 100));
+        assertRows(executeView("SELECT * from %s"), row(10, 1, 100));
 
         Thread.sleep(5000);
 
         // 'a' is TTL of 5 and removed.
         assertRows(execute("SELECT * from %s"), row(1, null, 100));
-        assertEmpty(execute("SELECT * from " + mv));
-        assertEmpty(execute("SELECT * from " + mv + " WHERE k = ? AND a = ?", 1, 10));
+        assertEmpty(executeView("SELECT * from %s"));
+        assertEmpty(executeView("SELECT * from %s WHERE k = ? AND a = ?", 1, 10));
 
         updateView("DELETE b FROM %s WHERE k=1");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRows(execute("SELECT * from %s"), row(1, null, null));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
 
         updateView("DELETE FROM %s WHERE k=1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertEmpty(execute("SELECT * from %s"));
-        assertEmpty(execute("SELECT * from " + mv));
+        assertEmpty(executeView("SELECT * from %s"));
     }
     @Test
     public void testUnselectedColumnsTTLWithFlush() throws Throwable
@@ -147,48 +145,46 @@
         // CASSANDRA-13127 not ttled unselected column in base should keep view row alive
         createTable("create table %s (p int, c int, v int, primary key(p, c))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT p, c FROM %%s " +
-                               "WHERE p IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, p)");
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT p, c FROM %s " +
+                   "WHERE p IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, p)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         updateViewWithFlush("INSERT INTO %s (p, c) VALUES (0, 0) USING TTL 3;", flush);
 
         updateViewWithFlush("UPDATE %s USING TTL 1000 SET v = 0 WHERE p = 0 and c = 0;", flush);
 
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         Thread.sleep(3000);
 
         UntypedResultSet.Row row = execute("SELECT v, ttl(v) from %s WHERE c = ? AND p = ?", 0, 0).one();
         assertEquals("row should have value of 0", 0, row.getInt("v"));
         assertTrue("row should have ttl less than 1000", row.getInt("ttl(v)") < 1000);
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         updateViewWithFlush("DELETE FROM %s WHERE p = 0 and c = 0;", flush);
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
 
         updateViewWithFlush("INSERT INTO %s (p, c) VALUES (0, 0) ", flush);
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         // already have a live row, no need to apply the unselected cell ttl
         updateViewWithFlush("UPDATE %s USING TTL 3 SET v = 0 WHERE p = 0 and c = 0;", flush);
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         updateViewWithFlush("INSERT INTO %s (p, c) VALUES (1, 1) USING TTL 3", flush);
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 1, 1), row(1, 1));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 1, 1), row(1, 1));
 
         Thread.sleep(4000);
 
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 1, 1));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 1, 1));
 
         // unselected should keep view row alive
         updateViewWithFlush("UPDATE %s SET v = 0 WHERE p = 1 and c = 1;", flush);
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 1, 1), row(1, 1));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 1, 1), row(1, 1));
 
     } 
 
@@ -198,17 +194,15 @@
         // CASSANDRA-13127 when liveness timestamp tie, greater localDeletionTime should win if both are expiring.
         createTable("create table %s (p int, c int, v int, primary key(p, c))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
         updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) using timestamp 1;");
 
-        FBUtilities.waitOnFutures(ks.flush());
+        Util.flush(ks);
 
         updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING TTL 3 and timestamp 1;");
 
-        FBUtilities.waitOnFutures(ks.flush());
+        Util.flush(ks);
 
         Thread.sleep(4000);
 
@@ -219,11 +213,11 @@
 
         updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING TTL 3 and timestamp 1;");
 
-        FBUtilities.waitOnFutures(ks.flush());
+        Util.flush(ks);
 
         updateView("INSERT INTO %s (p, c, v) VALUES (0, 0, 0) USING timestamp 1;");
 
-        FBUtilities.waitOnFutures(ks.flush());
+        Util.flush(ks);
 
         Thread.sleep(4000);
 
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
index 8098dcf..3231d3b 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTest.java
@@ -27,12 +27,11 @@
 import java.util.Map;
 
 import com.google.common.base.Objects;
-
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.fail;
 
@@ -46,7 +45,7 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexTest extends ViewComplexTester
+public class ViewComplexTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testNonBaseColumnInViewPkWithFlush() throws Throwable
@@ -64,51 +63,49 @@
     {
         createTable("create table %s (p1 int, p2 int, v1 int, v2 int, primary key (p1,p2))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("create materialized view %s as select * from %%s " +
-                               "where p1 is not null and p2 is not null primary key (p2, p1) " +
-                               "with gc_grace_seconds=5");
-        ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv);
+        createView("create materialized view %s as select * from %s " +
+                   "where p1 is not null and p2 is not null primary key (p2, p1) " +
+                   "with gc_grace_seconds=5");
+        ColumnFamilyStore cfs = ks.getColumnFamilyStore(currentView());
         cfs.disableAutoCompaction();
 
         updateView("UPDATE %s USING TIMESTAMP 1 set v1 =1 where p1 = 1 AND p2 = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, 1, null));
-        assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, 1, null));
+        assertRowsIgnoringOrder(executeView("SELECT p1, p2, v1, v2 from %s"), row(1, 1, 1, null));
 
         updateView("UPDATE %s USING TIMESTAMP 2 set v1 = null, v2 = 1 where p1 = 1 AND p2 = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, null, 1));
+        assertRowsIgnoringOrder(executeView("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, 1));
 
         updateView("UPDATE %s USING TIMESTAMP 2 set v2 = null where p1 = 1 AND p2 = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"));
-        assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT p1, p2, v1, v2 from %s"));
 
         updateView("INSERT INTO %s (p1,p2) VALUES(1,1) USING TIMESTAMP 3;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, null));
-        assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, null));
 
         updateView("DELETE FROM %s USING TIMESTAMP 4 WHERE p1 =1 AND p2 = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"));
-        assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT p1, p2, v1, v2 from %s"));
 
         updateView("UPDATE %s USING TIMESTAMP 5 set v2 = 1 where p1 = 1 AND p2 = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT p1, p2, v1, v2 from " + mv), row(1, 1, null, 1));
+        assertRowsIgnoringOrder(executeView("SELECT p1, p2, v1, v2 from %s"), row(1, 1, null, 1));
     }
 
     @Test
@@ -127,22 +124,20 @@
     {
         createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, f int, PRIMARY KEY(a, b))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         List<String> viewNames = new ArrayList<>();
         List<String> mvStatements = Arrays.asList(
                                                   // all selected
-                                                  "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
+                                                  "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
                                                   // unselected e,f
-                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b,c,d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
+                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b,c,d FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
                                                   // no selected
-                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
+                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a,b)",
                                                   // all selected, re-order keys
-                                                  "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b,a)",
+                                                  "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b,a)",
                                                   // unselected e,f, re-order keys
-                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b,c,d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b,a)",
+                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b,c,d FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b,a)",
                                                   // no selected, re-order keys
-                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b,a)");
+                                                  "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b,a)");
 
         Keyspace ks = Keyspace.open(keyspace());
 
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java
deleted file mode 100644
index de30eec..0000000
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTester.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.cql3;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.atomic.AtomicInteger;
-import java.util.stream.Collectors;
-
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import com.datastax.driver.core.exceptions.OperationTimedOutException;
-import org.apache.cassandra.concurrent.Stage;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.transport.ProtocolVersion;
-
-/* ViewComplexTest 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:
- * - ViewComplexUpdatesTest
- * - ViewComplexDeletionsTest
- * - ViewComplexTTLTest
- * - ViewComplexTest
- * - ViewComplexLivenessTest
- * - ...
- * - ViewComplex*Test
- */
-@RunWith(Parameterized.class)
-public abstract class ViewComplexTester extends CQLTester
-{
-    private static final AtomicInteger seqNumber = new AtomicInteger();
-
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ProtocolVersion.SUPPORTED.stream()
-                                        .map(v -> new Object[]{v})
-                                        .collect(Collectors.toList());
-    }
-
-    protected final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        requireNetwork();
-    }
-
-    @Before
-    public void begin() throws Throwable
-    {
-        views.clear();
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        dropMViews();
-    }
-
-    protected void dropMViews() throws Throwable
-    {
-        for (String viewName : views)
-            executeNet(version, "DROP MATERIALIZED VIEW " + viewName);
-    }
-
-    protected String createView(String query) throws Throwable
-    {
-        String name = createViewName();
-
-        try
-        {
-            executeNet(version, String.format(query, name));
-            // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is
-            // the desired behavior
-            views.add(name);
-        }
-        catch (OperationTimedOutException ex)
-        {
-            // ... except for timeout, when we actually do not know whether the view was created or not
-            views.add(name);
-            throw ex;
-        }
-
-        return name;
-    }
-
-    protected static String createViewName()
-    {
-        return "mv" + seqNumber.getAndIncrement();
-    }
-
-    protected void updateView(String query, Object... params) throws Throwable
-    {
-        updateViewWithFlush(query, false, params);
-    }
-
-    protected void updateViewWithFlush(String query, boolean flush, Object... params) throws Throwable
-    {
-        executeNet(version, query, params);
-        while (!(Stage.VIEW_MUTATION.executor().getPendingTaskCount() == 0
-                 && Stage.VIEW_MUTATION.executor().getActiveTaskCount() == 0))
-        {
-            Thread.sleep(1);
-        }
-        if (flush)
-            Keyspace.open(keyspace()).flush();
-    }
-}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexTombstoneTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexTombstoneTest.java
index 3c484ac..a873135 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexTombstoneTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexTombstoneTest.java
@@ -25,11 +25,12 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.io.sstable.SSTableIdFactory;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
-import org.apache.cassandra.utils.FBUtilities;
 
 /* ViewComplexTest 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:
@@ -41,7 +42,7 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexTombstoneTest extends ViewComplexTester
+public class ViewComplexTombstoneTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testCellTombstoneAndShadowableTombstonesWithFlush() throws Throwable
@@ -59,58 +60,56 @@
     {
         createTable("create table %s (p int primary key, v1 int, v2 int)");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("create materialized view %s as select * from %%s " +
-                               "where p is not null and v1 is not null primary key (v1, p)");
-        ks.getColumnFamilyStore(mv).disableAutoCompaction();
+        createView("create materialized view %s as select * from %s " +
+                   "where p is not null and v1 is not null primary key (v1, p)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         // sstable 1, Set initial values TS=1
         updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 1;");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L));
+        assertRowsIgnoringOrder(executeView("SELECT v2, WRITETIME(v2) from %s WHERE v1 = ? AND p = ?", 1, 3), row(3, 1L));
         // sstable 2
         updateView("UPdate %s using timestamp 2 set v2 = null where p = 3");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v2, WRITETIME(v2) from " + mv + " WHERE v1 = ? AND p = ?", 1, 3),
+        assertRowsIgnoringOrder(executeView("SELECT v2, WRITETIME(v2) from %s WHERE v1 = ? AND p = ?", 1, 3),
                                 row(null, null));
         // sstable 3
         updateView("UPdate %s using timestamp 3 set v1 = 2 where p = 3");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(2, 3, null, null));
         // sstable 4
         updateView("UPdate %s using timestamp 4 set v1 = 1 where p = 3");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, null, null));
 
         if (flush)
         {
             // compact sstable 2 and 3;
-            ColumnFamilyStore cfs = ks.getColumnFamilyStore(mv);
+            ColumnFamilyStore cfs = ks.getColumnFamilyStore(currentView());
             List<String> sstables = cfs.getLiveSSTables()
                                        .stream()
-                                       .sorted(Comparator.comparingInt(s -> s.descriptor.generation))
+                                       .sorted(Comparator.comparing(s -> s.descriptor.id, SSTableIdFactory.COMPARATOR))
                                        .map(SSTableReader::getFilename)
                                        .collect(Collectors.toList());
             String dataFiles = String.join(",", Arrays.asList(sstables.get(1), sstables.get(2)));
             CompactionManager.instance.forceUserDefinedCompaction(dataFiles);
         }
         // cell-tombstone in sstable 4 is not compacted away, because the shadowable tombstone is shadowed by new row.
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, null, null));
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(1, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s limit 1"), row(1, 3, null, null));
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java b/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java
index c930fa0..74f4038 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewComplexUpdatesTest.java
@@ -22,8 +22,8 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.FBUtilities;
 
 /* ViewComplexTest 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:
@@ -35,7 +35,7 @@
  * - ...
  * - ViewComplex*Test
  */
-public class ViewComplexUpdatesTest extends ViewComplexTester
+public class ViewComplexUpdatesTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testUpdateColumnNotInViewWithFlush() throws Throwable
@@ -54,92 +54,89 @@
     {
         // CASSANDRA-13127: if base column not selected in view are alive, then pk of view row should be alive
         String baseTable = createTable("create table %s (p int, c int, v1 int, v2 int, primary key(p, c))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT p, c FROM %%s " +
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT p, c from %s " +
                                "WHERE p IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, p)");
         ks.getColumnFamilyStore(mv).disableAutoCompaction();
 
         updateView("UPDATE %s USING TIMESTAMP 0 SET v1 = 1 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, 1, null));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         updateView("DELETE v1 FROM %s USING TIMESTAMP 1 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertEmpty(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
-        assertEmpty(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0));
+        assertEmpty(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
 
         // shadowed by tombstone
         updateView("UPDATE %s USING TIMESTAMP 1 SET v1 = 1 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertEmpty(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
-        assertEmpty(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0));
+        assertEmpty(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
 
         updateView("UPDATE %s USING TIMESTAMP 2 SET v2 = 1 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         updateView("DELETE v1 FROM %s USING TIMESTAMP 3 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         updateView("DELETE v2 FROM %s USING TIMESTAMP 4 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertEmpty(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
-        assertEmpty(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0));
+        assertEmpty(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
 
         updateView("UPDATE %s USING TTL 3 SET v2 = 1 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         Thread.sleep(TimeUnit.SECONDS.toMillis(3));
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
 
         updateView("UPDATE %s SET v2 = 1 WHERE p = 0 AND c = 0");
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0), row(0, 0));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0), row(0, 0));
 
         assertInvalidMessage(String.format("Cannot drop column v2 on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP v2");
         // // drop unselected base column, unselected metadata should be removed, thus view row is dead
         // updateView("ALTER TABLE %s DROP v2");
         // assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
-        // assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE c = ? AND p = ?", 0, 0));
+        // assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE c = ? AND p = ?", 0, 0));
         // assertRowsIgnoringOrder(execute("SELECT * from %s"));
-        // assertRowsIgnoringOrder(execute("SELECT * from " + mv));
+        // assertRowsIgnoringOrder(executeView("SELECT * from %s"));
     }
 
     @Test
@@ -156,51 +153,49 @@
 
     private void testPartialUpdateWithUnselectedCollections(boolean flush) throws Throwable
     {
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         String baseTable = createTable("CREATE TABLE %s (k int, c int, a int, b int, l list<int>, s set<int>, m map<int,int>, PRIMARY KEY (k, c))");
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k FROM %%s " +
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, k from %s " +
                                "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, k)");
         Keyspace ks = Keyspace.open(keyspace());
         ks.getColumnFamilyStore(mv).disableAutoCompaction();
 
         updateView("UPDATE %s SET l=l+[1,2,3] WHERE k = 1 AND c = 1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+            Util.flush(ks);
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         updateView("UPDATE %s SET l=l-[1,2] WHERE k = 1 AND c = 1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, null));
+            Util.flush(ks);
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         updateView("UPDATE %s SET b=3 WHERE k=1 AND c=1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRows(execute("SELECT * from " + mv), row(1, 1, null, 3));
+            Util.flush(ks);
+        assertRows(executeView("SELECT * from %s"), row(1, 1, null, 3));
 
         updateView("UPDATE %s SET b=null, l=l-[3], s=s-{3} WHERE k = 1 AND c = 1");
         if (flush)
         {
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
             ks.getColumnFamilyStore(mv).forceMajorCompaction();
         }
         assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s"));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s"));
 
         updateView("UPDATE %s SET m=m+{3:3}, l=l-[1], s=s-{2} WHERE k = 1 AND c = 1");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s"), row(1, 1, null, null));
-        assertRowsIgnoringOrder(execute("SELECT * from " + mv), row(1, 1, null, null));
+        assertRowsIgnoringOrder(executeView("SELECT * from %s"), row(1, 1, null, null));
 
         assertInvalidMessage(String.format("Cannot drop column m on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP m");
         // executeNet(version, "ALTER TABLE %s DROP m");
         // ks.getColumnFamilyStore(mv).forceMajorCompaction();
         // assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s WHERE k = 1 AND c = 1"));
-        // assertRowsIgnoringOrder(execute("SELECT * from " + mv + " WHERE k = 1 AND c = 1"));
+        // assertRowsIgnoringOrder(executeView("SELECT * from %s WHERE k = 1 AND c = 1"));
         // assertRowsIgnoringOrder(execute("SELECT k,c,a,b from %s"));
-        // assertRowsIgnoringOrder(execute("SELECT * from " + mv));
+        // assertRowsIgnoringOrder(executeView("SELECT * from %s"));
     }
 
     @Test
@@ -219,35 +214,33 @@
     {
         createTable("create table %s (p int primary key, v1 int, v2 int)");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("create materialized view %s as select * from %%s " +
+        String mv = createView("create materialized view %s as select * from %s " +
                                "where p is not null and v1 is not null primary key (v1, p)");
         ks.getColumnFamilyStore(mv).disableAutoCompaction();
 
         // reset value
         updateView("Insert into %s (p, v1, v2) values (3, 1, 3) using timestamp 6;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 3, 6L));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, 3, 6L));
         // increase pk's timestamp to 20
         updateView("Insert into %s (p) values (3) using timestamp 20;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 3, 6L));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, 3, 6L));
         // change v1's to 2 and remove existing view row with ts7
         updateView("UPdate %s using timestamp 7 set v1 = 2 where p = 3;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(2, 3, 3, 6L));
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv + " limit 1"), row(2, 3, 3, 6L));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(2, 3, 3, 6L));
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s" + " limit 1"), row(2, 3, 3, 6L));
         // change v1's to 1 and remove existing view row with ts8
         updateView("UPdate %s using timestamp 8 set v1 = 1 where p = 3;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT v1, p, v2, WRITETIME(v2) from " + mv), row(1, 3, 3, 6L));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT v1, p, v2, WRITETIME(v2) from %s"), row(1, 3, 3, 6L));
     }
 
     @Test
@@ -269,51 +262,49 @@
         // CASSANDRA-11500 able to shadow old view row with column ts greater tahn pk's ts and re-insert the view row
         String baseTable = createTable("CREATE TABLE %s (k int PRIMARY KEY, a int, b int);");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * from %s " +
                                "WHERE k IS NOT NULL AND a IS NOT NULL PRIMARY KEY (k, a)");
         ks.getColumnFamilyStore(mv).disableAutoCompaction();
         updateView("DELETE FROM %s USING TIMESTAMP 0 WHERE k = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         // sstable-1, Set initial values TS=1
         updateView("INSERT INTO %s(k, a, b) VALUES (1, 1, 1) USING TIMESTAMP 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 1));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"), row(1, 1, 1));
         updateView("UPDATE %s USING TIMESTAMP 10 SET b = 2 WHERE k = 1;");
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2));
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"), row(1, 1, 2));
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"), row(1, 1, 2));
         updateView("UPDATE %s USING TIMESTAMP 2 SET a = 2 WHERE k = 1;");
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 2, 2));
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"), row(1, 2, 2));
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
         ks.getColumnFamilyStore(mv).forceMajorCompaction();
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 2, 2));
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv + " limit 1"), row(1, 2, 2));
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"), row(1, 2, 2));
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s limit 1"), row(1, 2, 2));
         updateView("UPDATE %s USING TIMESTAMP 11 SET a = 1 WHERE k = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"), row(1, 1, 2));
         assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, 1, 2));
 
         // set non-key base column as tombstone, view row is removed with shadowable
         updateView("UPDATE %s USING TIMESTAMP 12 SET a = null WHERE k = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"));
         assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, null, 2));
 
         // column b should be alive
         updateView("UPDATE %s USING TIMESTAMP 13 SET a = 1 WHERE k = 1;");
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRowsIgnoringOrder(execute("SELECT k,a,b from " + mv), row(1, 1, 2));
+            Util.flush(ks);
+        assertRowsIgnoringOrder(executeView("SELECT k,a,b from %s"), row(1, 1, 2));
         assertRowsIgnoringOrder(execute("SELECT k,a,b from %s"), row(1, 1, 2));
 
         assertInvalidMessage(String.format("Cannot drop column a on base table %s with materialized views", baseTable), "ALTER TABLE %s DROP a");
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFiltering1Test.java b/test/unit/org/apache/cassandra/cql3/ViewFiltering1Test.java
new file mode 100644
index 0000000..47d5b8e
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/ViewFiltering1Test.java
@@ -0,0 +1,507 @@
+/*
+ * 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.cql3;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.apache.cassandra.Util;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+
+/* 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
+ * - ViewFilteringClustering1Test
+ * - ViewFilteringClustering2Test
+ * - ViewFilteringTest
+ * - ...
+ * - ViewFiltering*Test
+ */
+public class ViewFiltering1Test extends ViewAbstractParameterizedTest
+{
+    @BeforeClass
+    public static void startup()
+    {
+        ViewAbstractParameterizedTest.startup();
+        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "true");
+    }
+
+    @AfterClass
+    public static void tearDown()
+    {
+        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "false");
+    }
+
+    // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
+    @Ignore
+    @Test
+    public void testViewFilteringWithFlush() throws Throwable
+    {
+        testViewFiltering(true);
+    }
+
+    // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
+    @Ignore
+    @Test
+    public void testViewFilteringWithoutFlush() throws Throwable
+    {
+        testViewFiltering(false);
+    }
+
+    public void testViewFiltering(boolean flush) throws Throwable
+    {
+        // CASSANDRA-13547: able to shadow entire view row if base column used in filter condition is modified
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a))");
+
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                "WHERE a IS NOT NULL AND b IS NOT NULL and c = 1  PRIMARY KEY (a, b)");
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT c, d FROM %s " +
+                                "WHERE a IS NOT NULL AND b IS NOT NULL and c = 1 and d = 1 PRIMARY KEY (a, b)");
+        String mv3 = createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, d FROM %%s " +
+                                "WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)");
+        String mv4 = createView("CREATE MATERIALIZED VIEW %s AS SELECT c FROM %s " +
+                                "WHERE a IS NOT NULL AND b IS NOT NULL and c = 1 PRIMARY KEY (a, b)");
+        String mv5 = createView("CREATE MATERIALIZED VIEW %s AS SELECT c FROM %s " +
+                                "WHERE a IS NOT NULL and d = 1 PRIMARY KEY (a, d)");
+        String mv6 = createView("CREATE MATERIALIZED VIEW %s AS SELECT c FROM %s " +
+                                "WHERE a = 1 and d IS NOT NULL PRIMARY KEY (a, d)");
+
+        Keyspace ks = Keyspace.open(keyspace());
+        ks.getColumnFamilyStore(mv1).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv2).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv3).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv4).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv5).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv6).disableAutoCompaction();
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 0", 1, 1, 1, 1);
+        if (flush)
+            Util.flush(ks);
+
+        // views should be updated.
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, 1));
+
+        updateView("UPDATE %s using timestamp 1 set c = ? WHERE a=?", 0, 1);
+        if (flush)
+            Util.flush(ks);
+
+        assertRowCount(execute("SELECT * FROM " + mv1), 0);
+        assertRowCount(execute("SELECT * FROM " + mv2), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 0, 1));
+        assertRowCount(execute("SELECT * FROM " + mv4), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, 0));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, 0));
+
+        updateView("UPDATE %s using timestamp 2 set c = ? WHERE a=?", 1, 1);
+        if (flush)
+            Util.flush(ks);
+
+        // row should be back in views.
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, 1));
+
+        updateView("UPDATE %s using timestamp 3 set d = ? WHERE a=?", 0, 1);
+        if (flush)
+            Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 1, 1, 0));
+        assertRowCount(execute("SELECT * FROM " + mv2), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 1, 0));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1, 1));
+        assertRowCount(execute("SELECT * FROM " + mv5), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 0, 1));
+
+        updateView("UPDATE %s using timestamp 4 set c = ? WHERE a=?", 0, 1);
+        if (flush)
+            Util.flush(ks);
+
+        assertRowCount(execute("SELECT * FROM " + mv1), 0);
+        assertRowCount(execute("SELECT * FROM " + mv2), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 0, 0));
+        assertRowCount(execute("SELECT * FROM " + mv4), 0);
+        assertRowCount(execute("SELECT * FROM " + mv5), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 0, 0));
+
+        updateView("UPDATE %s using timestamp 5 set d = ? WHERE a=?", 1, 1);
+        if (flush)
+            Util.flush(ks);
+
+        // should not update as c=0
+        assertRowCount(execute("SELECT * FROM " + mv1), 0);
+        assertRowCount(execute("SELECT * FROM " + mv2), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 0, 1));
+        assertRowCount(execute("SELECT * FROM " + mv4), 0);
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, 0));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, 0));
+
+        updateView("UPDATE %s using timestamp 6 set c = ? WHERE a=?", 1, 1);
+
+        // row should be back in views.
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, 1));
+
+        updateView("UPDATE %s using timestamp 7 set b = ? WHERE a=?", 2, 1);
+        if (flush)
+        {
+            Util.flush(ks);
+            for (String view : getViews())
+                ks.getColumnFamilyStore(view).forceMajorCompaction();
+        }
+        // row should be back in views.
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 2, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2), row(1, 2, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 2, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 2, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, 1));
+
+        updateView("DELETE b, c FROM %s using timestamp 6 WHERE a=?", 1);
+        if (flush)
+            Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s"), row(1, 2, null, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 2, null, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, null));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, null));
+
+        updateView("DELETE FROM %s using timestamp 8 where a=?", 1);
+        if (flush)
+            Util.flush(ks);
+
+        assertRowCount(execute("SELECT * FROM " + mv1), 0);
+        assertRowCount(execute("SELECT * FROM " + mv2), 0);
+        assertRowCount(execute("SELECT * FROM " + mv3), 0);
+        assertRowCount(execute("SELECT * FROM " + mv4), 0);
+        assertRowCount(execute("SELECT * FROM " + mv5), 0);
+        assertRowCount(execute("SELECT * FROM " + mv6), 0);
+
+        updateView("UPDATE %s using timestamp 9 set b = ?,c = ? where a=?", 1, 1, 1); // upsert
+        if (flush)
+            Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 1, 1, null));
+        assertRows(execute("SELECT * FROM " + mv2));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 1, null));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1, 1));
+        assertRows(execute("SELECT * FROM " + mv5));
+        assertRows(execute("SELECT * FROM " + mv6));
+
+        updateView("DELETE FROM %s using timestamp 10 where a=?", 1);
+        if (flush)
+            Util.flush(ks);
+
+        assertRowCount(execute("SELECT * FROM " + mv1), 0);
+        assertRowCount(execute("SELECT * FROM " + mv2), 0);
+        assertRowCount(execute("SELECT * FROM " + mv3), 0);
+        assertRowCount(execute("SELECT * FROM " + mv4), 0);
+        assertRowCount(execute("SELECT * FROM " + mv5), 0);
+        assertRowCount(execute("SELECT * FROM " + mv6), 0);
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 11", 1, 1, 1, 1);
+        if (flush)
+            Util.flush(ks);
+
+        // row should be back in views.
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv5), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv6), row(1, 1, 1));
+
+        updateView("DELETE FROM %s using timestamp 12 where a=?", 1);
+        if (flush)
+            Util.flush(ks);
+
+        assertRowCount(execute("SELECT * FROM " + mv1), 0);
+        assertRowCount(execute("SELECT * FROM " + mv2), 0);
+        assertRowCount(execute("SELECT * FROM " + mv3), 0);
+        assertRowCount(execute("SELECT * FROM " + mv4), 0);
+        assertRowCount(execute("SELECT * FROM " + mv5), 0);
+        assertRowCount(execute("SELECT * FROM " + mv6), 0);
+
+        dropView(mv1);
+        dropView(mv2);
+        dropView(mv3);
+        dropView(mv4);
+        dropView(mv5);
+        dropView(mv6);
+        dropTable("DROP TABLE %s");
+    }
+
+    // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
+    @Ignore
+    @Test
+    public void testMVFilteringWithComplexColumn() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, l list<int>, s set<int>, m map<int,int>, PRIMARY KEY (a, b))");
+
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT a,b,c FROM %%s " +
+                                "WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND l contains (1) " +
+                                "AND s contains (1) AND m contains key (1) " +
+                                "PRIMARY KEY (a, b, c)");
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s " +
+                                "WHERE a IS NOT NULL and b IS NOT NULL AND l contains (1) " +
+                                "PRIMARY KEY (a, b)");
+        String mv3 = createView("CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s " +
+                                "WHERE a IS NOT NULL AND b IS NOT NULL AND s contains (1) " +
+                                "PRIMARY KEY (a, b)");
+        String mv4 = createView("CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s " +
+                                "WHERE a IS NOT NULL AND b IS NOT NULL AND m contains key (1) " +
+                                "PRIMARY KEY (a, b)");
+
+        // not able to drop base column filtered in view
+        assertInvalidMessage("Cannot drop column l, depended on by materialized views", "ALTER TABLE %s DROP l");
+        assertInvalidMessage("Cannot drop column s, depended on by materialized views", "ALTER TABLE %S DROP s");
+        assertInvalidMessage("Cannot drop column m, depended on by materialized views", "ALTER TABLE %s DROP m");
+
+        Keyspace ks = Keyspace.open(keyspace());
+        ks.getColumnFamilyStore(mv1).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv2).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv3).disableAutoCompaction();
+        ks.getColumnFamilyStore(mv4).disableAutoCompaction();
+
+        execute("INSERT INTO %s (a, b, c, l, s, m) VALUES (?, ?, ?, ?, ?, ?) ",
+                1,
+                1,
+                1,
+                list(1, 1, 2),
+                set(1, 2),
+                map(1, 1, 2, 2));
+        Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2), row(1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1));
+
+        execute("UPDATE %s SET l=l-[1] WHERE a = 1 AND b = 1");
+        Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1));
+
+        execute("UPDATE %s SET s=s-{2}, m=m-{2} WHERE a = 1 AND b = 1");
+        Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT a,b,c FROM %s"), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4), row(1, 1));
+
+        execute("UPDATE %s SET  m=m-{1} WHERE a = 1 AND b = 1");
+        Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT a,b,c FROM %s"), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4));
+
+        // filter conditions result not changed
+        execute("UPDATE %s SET  l=l+[2], s=s-{0}, m=m+{3:3} WHERE a = 1 AND b = 1");
+        Util.flush(ks);
+
+        assertRowsIgnoringOrder(execute("SELECT a,b,c FROM %s"), row(1, 1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv2));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv3), row(1, 1));
+        assertRowsIgnoringOrder(execute("SELECT * FROM " + mv4));
+    }
+
+    @Test
+    public void testMVCreationSelectRestrictions() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY((a, b), c, d))");
+
+        // IS NOT NULL is required on all PK statements that are not otherwise restricted
+        List<String> badStatements = Arrays.asList(
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE b IS NOT NULL AND c IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND c IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c is NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = ? AND b IS NOT NULL AND c is NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = blobAsInt(?) AND b IS NOT NULL AND c is NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s PRIMARY KEY (a, b, c, d)"
+        );
+
+        for (String badStatement : badStatements)
+        {
+            try
+            {
+                createView(badStatement);
+                Assert.fail("Create MV statement should have failed due to missing IS NOT NULL restriction: " + badStatement);
+            }
+            catch (RuntimeException e)
+            {
+                Assert.assertSame(InvalidRequestException.class, e.getCause().getClass());
+            }
+        }
+
+        List<String> goodStatements = Arrays.asList(
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = 1 AND b = 1 AND c IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c = 1 AND d IS NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = 1 AND b = 1 AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = 1 AND b = 1 AND c > 1 AND d IS NOT NULL PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = 1 AND b = 1 AND c = 1 AND d IN (1, 2, 3) PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = 1 AND b = 1 AND (c, d) = (1, 1) PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = 1 AND b = 1 AND (c, d) > (1, 1) PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = 1 AND b = 1 AND (c, d) IN ((1, 1), (2, 2)) PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = (int) 1 AND b = 1 AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)",
+        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a = blobAsInt(intAsBlob(1)) AND b = 1 AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)"
+        );
+
+        for (int i = 0; i < goodStatements.size(); i++)
+        {
+            String mv;
+            try
+            {
+                mv = createView(goodStatements.get(i));
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException("MV creation failed: " + goodStatements.get(i), e);
+            }
+
+            try
+            {
+                executeNet("ALTER MATERIALIZED VIEW " + mv + " WITH compaction = { 'class' : 'LeveledCompactionStrategy' }");
+            }
+            catch (Exception e)
+            {
+                throw new RuntimeException("MV alter failed: " + goodStatements.get(i), e);
+            }
+        }
+    }
+
+    @Test
+    public void testCaseSensitivity() throws Throwable
+    {
+        createTable("CREATE TABLE %s (\"theKey\" int, \"theClustering\" int, \"the\"\"Value\" int, PRIMARY KEY (\"theKey\", \"theClustering\"))");
+
+        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 0, 0, 0);
+        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 0, 1, 0);
+        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 1, 0, 0);
+        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 1, 1, 0);
+
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                "WHERE \"theKey\" = 1 AND \"theClustering\" = 1 AND \"the\"\"Value\" IS NOT NULL " +
+                                "PRIMARY KEY (\"theKey\", \"theClustering\")");
+
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT \"theKey\", \"theClustering\", \"the\"\"Value\" FROM %s " +
+                                "WHERE \"theKey\" = 1 AND \"theClustering\" = 1 AND \"the\"\"Value\" IS NOT NULL " +
+                                "PRIMARY KEY (\"theKey\", \"theClustering\")");
+
+        for (String mvname : Arrays.asList(mv1, mv2))
+        {
+            assertRowsIgnoringOrder(execute("SELECT \"theKey\", \"theClustering\", \"the\"\"Value\" FROM " + mvname),
+                                    row(1, 1, 0));
+        }
+
+        executeNet("ALTER TABLE %s RENAME \"theClustering\" TO \"Col\"");
+
+        for (String mvname : Arrays.asList(mv1, mv2))
+        {
+            assertRowsIgnoringOrder(execute("SELECT \"theKey\", \"Col\", \"the\"\"Value\" FROM " + mvname),
+                                    row(1, 1, 0)
+            );
+        }
+    }
+
+    @Test
+    public void testFilterWithFunction() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 1);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 0, 2);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 1, 3);
+
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE a = blobAsInt(intAsBlob(1)) AND b IS NOT NULL " +
+                   "PRIMARY KEY (a, b)");
+
+        assertRows(executeView("SELECT a, b, c FROM %s"),
+                   row(1, 0, 2),
+                   row(1, 1, 3)
+        );
+
+        executeNet("ALTER TABLE %s RENAME a TO foo");
+
+        assertRows(executeView("SELECT foo, b, c FROM %s"),
+                   row(1, 0, 2),
+                   row(1, 1, 3)
+        );
+    }
+
+    @Test
+    public void testFilterWithTypecast() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 1);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 0, 2);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 1, 3);
+
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE a = (int) 1 AND b IS NOT NULL " +
+                   "PRIMARY KEY (a, b)");
+
+        assertRows(executeView("SELECT a, b, c FROM %s"),
+                   row(1, 0, 2),
+                   row(1, 1, 3)
+        );
+
+        executeNet("ALTER TABLE %s RENAME a TO foo");
+
+        assertRows(executeView("SELECT foo, b, c FROM %s"),
+                   row(1, 0, 2),
+                   row(1, 1, 3)
+        );
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFiltering2Test.java b/test/unit/org/apache/cassandra/cql3/ViewFiltering2Test.java
index 2eb0eca..17709a8 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFiltering2Test.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFiltering2Test.java
@@ -18,14 +18,14 @@
 
 package org.apache.cassandra.cql3;
 
+import org.junit.AfterClass;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
 
+import org.apache.cassandra.Util;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.utils.FBUtilities;
 
 /* 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
@@ -36,9 +36,20 @@
  * - ...
  * - ViewFiltering*Test
  */
-@RunWith(Parameterized.class)
-public class ViewFiltering2Test extends ViewFilteringTester
+public class ViewFiltering2Test extends ViewAbstractParameterizedTest
 {
+    @BeforeClass
+    public static void startup()
+    {
+        ViewFiltering1Test.startup();
+    }
+
+    @AfterClass
+    public static void tearDown()
+    {
+        ViewFiltering1Test.tearDown();
+    }
+
     @Test
     public void testAllTypes() throws Throwable
     {
@@ -92,35 +103,30 @@
         "udtval frozen<" + myType + ">, " +
         "PRIMARY KEY (" + columnNames + "))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView(
-        "mv_test",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " +
-        "asciival = 'abc' AND " +
-        "bigintval = 123 AND " +
-        "blobval = 0xfeed AND " +
-        "booleanval = true AND " +
-        "dateval = '1987-03-23' AND " +
-        "decimalval = 123.123 AND " +
-        "doubleval = 123.123 AND " +
-        "floatval = 123.123 AND " +
-        "inetval = '127.0.0.1' AND " +
-        "intval = 123 AND " +
-        "textval = 'abc' AND " +
-        "timeval = '07:35:07.000111222' AND " +
-        "timestampval = 123123123 AND " +
-        "timeuuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
-        "uuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
-        "varcharval = 'abc' AND " +
-        "varintval = 123123123 AND " +
-        "frozenlistval = [1, 2, 3] AND " +
-        "frozensetval = {6BDDC89A-5644-11E4-97FC-56847AFE9799} AND " +
-        "frozenmapval = {'a': 1, 'b': 2} AND " +
-        "tupleval = (1, 'foobar', 6BDDC89A-5644-11E4-97FC-56847AFE9799) AND " +
-        "udtval = {a: 1, b: 6BDDC89A-5644-11E4-97FC-56847AFE9799, c: {'foo', 'bar'}} " +
-        "PRIMARY KEY (" + columnNames + ")");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE " +
+                   "asciival = 'abc' AND " +
+                   "bigintval = 123 AND " +
+                   "blobval = 0xfeed AND " +
+                   "booleanval = true AND " +
+                   "dateval = '1987-03-23' AND " +
+                   "decimalval = 123.123 AND " +
+                   "doubleval = 123.123 AND " +
+                   "floatval = 123.123 AND " +
+                   "inetval = '127.0.0.1' AND " +
+                   "intval = 123 AND " +
+                   "textval = 'abc' AND " +
+                   "timeval = '07:35:07.000111222' AND " +
+                   "timestampval = 123123123 AND " +
+                   "timeuuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
+                   "uuidval = 6BDDC89A-5644-11E4-97FC-56847AFE9799 AND " +
+                   "varcharval = 'abc' AND " +
+                   "varintval = 123123123 AND " +
+                   "frozenlistval = [1, 2, 3] AND " +
+                   "frozensetval = {6BDDC89A-5644-11E4-97FC-56847AFE9799} AND " +
+                   "frozenmapval = {'a': 1, 'b': 2} AND " +
+                   "tupleval = (1, 'foobar', 6BDDC89A-5644-11E4-97FC-56847AFE9799) AND " +
+                   "udtval = {a: 1, b: 6BDDC89A-5644-11E4-97FC-56847AFE9799, c: {'foo', 'bar'}} " +
+                   "PRIMARY KEY (" + columnNames + ")");
 
         execute("INSERT INTO %s (" + columnNames + ") VALUES (" +
                 "'abc'," +
@@ -146,24 +152,26 @@
                 "(1, 'foobar', 6BDDC89A-5644-11E4-97FC-56847AFE9799)," +
                 "{a: 1, b: 6BDDC89A-5644-11E4-97FC-56847AFE9799, c: {'foo', 'bar'}})");
 
-        assert !execute("SELECT * FROM mv_test").isEmpty();
+        assert !executeView("SELECT * FROM %s").isEmpty();
 
-        executeNet(version, "ALTER TABLE %s RENAME inetval TO foo");
-        assert !execute("SELECT * FROM mv_test").isEmpty();
+        executeNet("ALTER TABLE %s RENAME inetval TO foo");
+        assert !executeView("SELECT * FROM %s").isEmpty();
     }
 
     @Test
-    public void testMVCreationWithNonPrimaryRestrictions() throws Throwable
+    public void testMVCreationWithNonPrimaryRestrictions()
     {
         createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        try {
-            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d = 1 PRIMARY KEY (a, b, c)");
-            dropView("mv_test");
-        } catch(Exception e) {
+        try
+        {
+            String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                   "WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d = 1 " +
+                                   "PRIMARY KEY (a, b, c)");
+            dropView(mv);
+        }
+        catch (Exception e)
+        {
             throw new RuntimeException("MV creation with non primary column restrictions failed.", e);
         }
 
@@ -175,9 +183,6 @@
     {
         createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -188,12 +193,11 @@
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
 
         // only accept rows where c = 1
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (a, b, c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 " +
+                   "PRIMARY KEY (a, b, c)");
 
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0),
                                 row(1, 0, 1, 0),
@@ -203,7 +207,7 @@
         // insert new rows that do not match the filter
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 2, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0),
                                 row(1, 0, 1, 0),
@@ -212,7 +216,7 @@
 
         // insert new row that does match the filter
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 1, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0),
                                 row(1, 0, 1, 0),
@@ -223,7 +227,7 @@
         // update rows that don't match the filter
         execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 2, 2, 0);
         execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 1, 2, 1);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0),
                                 row(1, 0, 1, 0),
@@ -233,7 +237,7 @@
 
         // update a row that does match the filter
         execute("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 1, 1, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0),
                                 row(1, 0, 1, 1),
@@ -243,7 +247,7 @@
 
         // delete rows that don't match the filter
         execute("DELETE FROM %s WHERE a = ? AND b = ?", 2, 0);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0),
                                 row(1, 0, 1, 1),
@@ -253,7 +257,7 @@
 
         // delete a row that does match the filter
         execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 2);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0),
                                 row(1, 0, 1, 1),
@@ -262,12 +266,12 @@
 
         // delete a partition that matches the filter
         execute("DELETE FROM %s WHERE a = ?", 1);
-        assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test"),
+        assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                 row(0, 0, 1, 0),
                                 row(0, 1, 1, 0)
         );
 
-        dropView("mv_test");
+        dropView();
         dropTable("DROP TABLE %s");
     }
 
@@ -286,98 +290,97 @@
     public void complexRestrictedTimestampUpdateTest(boolean flush) throws Throwable
     {
         createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY (a, b))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (c, a, b)");
-        ks.getColumnFamilyStore("mv").disableAutoCompaction();
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                               "WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND c = 1 " +
+                               "PRIMARY KEY (c, a, b)");
+        ks.getColumnFamilyStore(mv).disableAutoCompaction();
 
         //Set initial values TS=0, matching the restriction and verify view
-        executeNet(version, "INSERT INTO %s (a, b, c, d) VALUES (0, 0, 1, 0) USING TIMESTAMP 0");
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
+        executeNet("INSERT INTO %s (a, b, c, d) VALUES (0, 0, 1, 0) USING TIMESTAMP 0");
+        assertRows(executeView("SELECT d FROM %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         //update c's timestamp TS=2
-        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
+        executeNet("UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        assertRows(executeView("SELECT d FROM %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         //change c's value and TS=3, tombstones c=1 and adds c=0 record
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? and b = ? ", 0, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 0, 0, 0));
+        executeNet("UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? and b = ? ", 0, 0, 0);
+        assertRows(executeView("SELECT d FROM %s WHERE c = ? and a = ? and b = ?", 0, 0, 0));
 
-        if(flush)
+        if (flush)
         {
-            ks.getColumnFamilyStore("mv").forceMajorCompaction();
-            FBUtilities.waitOnFutures(ks.flush());
+            ks.getColumnFamilyStore(mv).forceMajorCompaction();
+            Util.flush(ks);
         }
 
         //change c's value back to 1 with TS=4, check we can see d
-        executeNet(version, "UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        executeNet("UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
         if (flush)
         {
-            ks.getColumnFamilyStore("mv").forceMajorCompaction();
-            FBUtilities.waitOnFutures(ks.flush());
+            ks.getColumnFamilyStore(mv).forceMajorCompaction();
+            Util.flush(ks);
         }
 
-        assertRows(execute("SELECT d, e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, null));
+        assertRows(executeView("SELECT d, e FROM %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, null));
 
         //Add e value @ TS=1
-        executeNet(version, "UPDATE %s USING TIMESTAMP 1 SET e = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d, e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, 1));
+        executeNet("UPDATE %s USING TIMESTAMP 1 SET e = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        assertRows(executeView("SELECT d, e FROM %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, 1));
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         //Change d value @ TS=2
-        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET d = ? WHERE a = ? and b = ? ", 2, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(2));
+        executeNet("UPDATE %s USING TIMESTAMP 2 SET d = ? WHERE a = ? and b = ? ", 2, 0, 0);
+        assertRows(executeView("SELECT d FROM %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(2));
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         //Change d value @ TS=3
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(1));
+        executeNet("UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? and b = ? ", 1, 0, 0);
+        assertRows(executeView("SELECT d FROM %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(1));
 
         //Tombstone c
-        executeNet(version, "DELETE FROM %s WHERE a = ? and b = ?", 0, 0);
-        assertRowsIgnoringOrder(execute("SELECT d from mv"));
-        assertRows(execute("SELECT d from mv"));
+        executeNet("DELETE FROM %s WHERE a = ? and b = ?", 0, 0);
+        assertRowsIgnoringOrder(executeView("SELECT d FROM %s"));
+        assertRows(executeView("SELECT d FROM %s"));
 
         //Add back without D
-        executeNet(version, "INSERT INTO %s (a, b, c) VALUES (0, 0, 1)");
+        executeNet("INSERT INTO %s (a, b, c) VALUES (0, 0, 1)");
 
         //Make sure D doesn't pop back in.
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row((Object) null));
+        assertRows(executeView("SELECT d FROM %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row((Object) null));
 
         //New partition
         // insert a row with timestamp 0
-        executeNet(version, "INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?) USING TIMESTAMP 0", 1, 0, 1, 0, 0);
+        executeNet("INSERT INTO %s (a, b, c, d, e) VALUES (?, ?, ?, ?, ?) USING TIMESTAMP 0", 1, 0, 1, 0, 0);
 
         // overwrite pk and e with timestamp 1, but don't overwrite d
-        executeNet(version, "INSERT INTO %s (a, b, c, e) VALUES (?, ?, ?, ?) USING TIMESTAMP 1", 1, 0, 1, 0);
+        executeNet("INSERT INTO %s (a, b, c, e) VALUES (?, ?, ?, ?) USING TIMESTAMP 1", 1, 0, 1, 0);
 
         // delete with timestamp 0 (which should only delete d)
-        executeNet(version, "DELETE FROM %s USING TIMESTAMP 0 WHERE a = ? AND b = ?", 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
+        executeNet("DELETE FROM %s USING TIMESTAMP 0 WHERE a = ? AND b = ?", 1, 0);
+        assertRows(executeView("SELECT a, b, c, d, e FROM %s WHERE c = ? and a = ? and b = ?", 1, 1, 0),
                    row(1, 0, 1, null, 0)
         );
 
-        executeNet(version, "UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? AND b = ?", 1, 1, 1);
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? AND b = ?", 1, 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
+        executeNet("UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? AND b = ?", 1, 1, 1);
+        executeNet("UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? AND b = ?", 1, 1, 0);
+        assertRows(executeView("SELECT a, b, c, d, e FROM %s WHERE c = ? and a = ? and b = ?", 1, 1, 0),
                    row(1, 0, 1, null, 0)
         );
 
-        executeNet(version, "UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? AND b = ?", 0, 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 1, 1, 0),
+        executeNet("UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? AND b = ?", 0, 1, 0);
+        assertRows(executeView("SELECT a, b, c, d, e FROM %s WHERE c = ? and a = ? and b = ?", 1, 1, 0),
                    row(1, 0, 1, 0, 0)
         );
     }
@@ -392,15 +395,14 @@
                     "c int, " +
                     "val int)");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv_rctstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL AND c = 1 PRIMARY KEY (k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE k IS NOT NULL AND c IS NOT NULL AND c = 1 " +
+                   "PRIMARY KEY (k,c)");
 
         updateView("UPDATE %s SET c = ?, val = ? WHERE k = ?", 0, 0, 0);
         updateView("UPDATE %s SET val = ? WHERE k = ?", 1, 0);
         updateView("UPDATE %s SET c = ? WHERE k = ?", 1, 0);
-        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(1, 0, 1));
+        assertRows(executeView("SELECT c, k, val FROM %s"), row(1, 0, 1));
 
         updateView("TRUNCATE %s");
 
@@ -409,7 +411,7 @@
         updateView("UPDATE %s USING TIMESTAMP 2 SET val = ? WHERE k = ?", 1, 0);
         updateView("UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE k = ?", 1, 0);
         updateView("UPDATE %s USING TIMESTAMP 3 SET val = ? WHERE k = ?", 2, 0);
-        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(1, 0, 2));
+        assertRows(executeView("SELECT c, k, val FROM %s"), row(1, 0, 2));
     }
 
     @Test
@@ -421,32 +423,31 @@
                     "val text, " + "" +
                     "PRIMARY KEY(k, c))");
 
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv_tstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL AND val = 'baz' PRIMARY KEY (val,k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL AND val = 'baz' " +
+                   "PRIMARY KEY (val,k,c)");
 
         for (int i = 0; i < 100; i++)
             updateView("INSERT into %s (k,c,val)VALUES(?,?,?)", 0, i % 2, "baz");
 
-        Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush();
+        Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         Assert.assertEquals(2, execute("select * from %s").size());
-        Assert.assertEquals(2, execute("select * from mv_tstest").size());
+        Assert.assertEquals(2, executeView("select * from %s").size());
 
         assertRows(execute("SELECT val from %s where k = 0 and c = 0"), row("baz"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "baz"), row(0), row(1));
 
         //Make sure an old TS does nothing
         updateView("UPDATE %s USING TIMESTAMP 100 SET val = ? where k = ? AND c = ?", "bar", 0, 1);
         assertRows(execute("SELECT val from %s where k = 0 and c = 1"), row("baz"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "baz"), row(0), row(1));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "bar"));
 
         //Latest TS
         updateView("UPDATE %s SET val = ? where k = ? AND c = ?", "bar", 0, 1);
         assertRows(execute("SELECT val from %s where k = 0 and c = 1"), row("bar"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "bar"));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "baz"), row(0));
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java
index 841eb91..5283336 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering1Test.java
@@ -22,10 +22,6 @@
 import java.util.List;
 
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import org.apache.cassandra.db.SystemKeyspace;
 
 /* 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
@@ -36,8 +32,7 @@
  * - ...
  * - ViewFiltering*Test
  */
-@RunWith(Parameterized.class)
-public class ViewFilteringClustering1Test extends ViewFilteringTester
+public class ViewFilteringClustering1Test extends ViewAbstractParameterizedTest
 {
     @Test
     public void testClusteringKeyEQRestrictions() throws Throwable
@@ -47,9 +42,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -62,88 +54,79 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b = 1 AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a IS NOT NULL AND b = 1 AND c IS NOT NULL " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 2, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 0, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 2, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0)
-            );
+                                    row(0, 1, 1, 0));
 
-            dropView("mv_test" + i);
+            dropView();
             dropTable("DROP TABLE %s");
         }
     }
@@ -156,9 +139,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -170,88 +150,79 @@
 
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b >= 1 AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a IS NOT NULL AND b >= 1 AND c IS NOT NULL " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, -1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, -1, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, -1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0)
-            );
+                                    row(0, 1, 1, 0));
 
-            dropView("mv_test" + i);
+            dropView();
             dropTable("DROP TABLE %s");
         }
     }
@@ -264,9 +235,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -280,95 +248,86 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IN (1, 2) AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a IS NOT NULL AND b IN (1, 2) AND c IS NOT NULL " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, -1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, -1, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, -1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0)
-            );
+                                    row(0, 1, 1, 0));
 
-            dropView("mv_test" + i);
+            dropView();
             dropTable("DROP TABLE %s");
         }
     }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
index 219a807..450d87c 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringClustering2Test.java
@@ -22,10 +22,6 @@
 import java.util.List;
 
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import org.apache.cassandra.db.SystemKeyspace;
 
 /* 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
@@ -36,8 +32,7 @@
  * - ...
  * - ViewFiltering*Test
  */
-@RunWith(Parameterized.class)
-public class ViewFilteringClustering2Test extends ViewFilteringTester
+public class ViewFilteringClustering2Test extends ViewAbstractParameterizedTest
 {
     @Test
     public void testClusteringKeyMultiColumnRestrictions() throws Throwable
@@ -47,9 +42,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -63,91 +55,82 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND (b, c) >= (1, 0) PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a IS NOT NULL AND (b, c) >= (1, 0) " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, -1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, -1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, -1, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, -1, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, -1);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, -1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 1, 0, 0),
-                                    row(0, 1, 1, 0)
-            );
+                                    row(0, 1, 1, 0));
 
-            dropView("mv_test" + i);
+            dropView();
             dropTable("DROP TABLE %s");
         }
     }
@@ -160,9 +143,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -176,87 +156,78 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c = 1 PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a IS NOT NULL AND b IS NOT NULL AND c = 1 " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, -1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, -1, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 2, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 2, 1, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 2),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, -1);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, -1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, -1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 2),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
                                     row(1, 0, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
-                                    row(0, 1, 1, 0)
-            );
+                                    row(0, 1, 1, 0));
 
             // insert a partition with one matching and one non-matching row using a batch (CASSANDRA-10614)
             String tableName = KEYSPACE + "." + currentTable();
@@ -266,13 +237,12 @@
                     "APPLY BATCH",
                     4, 4, 0, 0,
                     4, 4, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(0, 0, 1, 0),
                                     row(0, 1, 1, 0),
-                                    row(4, 4, 1, 1)
-            );
+                                    row(4, 4, 1, 1));
 
-            dropView("mv_test" + i);
+            dropView();
             dropTable("DROP TABLE %s");
         }
     }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringComplexPKTest.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringComplexPKTest.java
index da089ca..d18883d 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringComplexPKTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringComplexPKTest.java
@@ -22,10 +22,6 @@
 import java.util.List;
 
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import org.apache.cassandra.db.SystemKeyspace;
 
 /* 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
@@ -36,8 +32,7 @@
  * - ...
  * - ViewFiltering*Test
  */
-@RunWith(Parameterized.class)
-public class ViewFilteringComplexPKTest extends ViewFilteringTester
+public class ViewFilteringComplexPKTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testCompoundPartitionKeyRestrictions() throws Throwable
@@ -47,9 +42,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -62,72 +54,64 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where a = 1 and b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a = 1 AND b = 1 AND c IS NOT NULL " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 0, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 1);
-            assertEmpty(execute("SELECT * FROM mv_test" + i));
+            assertEmpty(executeView("SELECT * FROM %s"));
         }
     }
 
@@ -135,8 +119,6 @@
     public void testCompoundPartitionKeyRestrictionsNotIncludeAll() throws Throwable
     {
         createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
 
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
@@ -148,72 +130,64 @@
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 0);
 
         // only accept rows where a = 1 and b = 1, don't include column d in the selection
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c FROM %%s WHERE a = 1 AND b = 1 AND c IS NOT NULL PRIMARY KEY ((a, b), c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c FROM %s " +
+                   "WHERE a = 1 AND b = 1 AND c IS NOT NULL " +
+                   "PRIMARY KEY ((a, b), c)");
 
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-
-        assertRows(execute("SELECT * FROM mv_test"),
+        assertRows(executeView("SELECT * FROM %s"),
                    row(1, 1, 0),
-                   row(1, 1, 1)
-        );
+                   row(1, 1, 1));
 
         // insert new rows that do not match the filter
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 0, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
+        assertRows(executeView("SELECT * FROM %s"),
                    row(1, 1, 0),
-                   row(1, 1, 1)
-        );
+                   row(1, 1, 1));
 
         // insert new row that does match the filter
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
+        assertRows(executeView("SELECT * FROM %s"),
                    row(1, 1, 0),
                    row(1, 1, 1),
-                   row(1, 1, 2)
-        );
+                   row(1, 1, 2));
 
         // update rows that don't match the filter
         execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
         execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 0, 0);
         execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
+        assertRows(executeView("SELECT * FROM %s"),
                    row(1, 1, 0),
                    row(1, 1, 1),
-                   row(1, 1, 2)
-        );
+                   row(1, 1, 2));
 
         // update a row that does match the filter
         execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
+        assertRows(executeView("SELECT * FROM %s"),
                    row(1, 1, 0),
                    row(1, 1, 1),
-                   row(1, 1, 2)
-        );
+                   row(1, 1, 2));
 
         // delete rows that don't match the filter
         execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
         execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 0, 0);
         execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
         execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
+        assertRows(executeView("SELECT * FROM %s"),
                    row(1, 1, 0),
                    row(1, 1, 1),
-                   row(1, 1, 2)
-        );
+                   row(1, 1, 2));
 
         // delete a row that does match the filter
         execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-        assertRows(execute("SELECT * FROM mv_test"),
+        assertRows(executeView("SELECT * FROM %s"),
                    row(1, 1, 1),
-                   row(1, 1, 2)
-        );
+                   row(1, 1, 2));
 
         // delete a partition that matches the filter
         execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 1);
-        assertEmpty(execute("SELECT * FROM mv_test"));
+        assertEmpty(executeView("SELECT * FROM %s"));
     }
 
     @Test
@@ -224,9 +198,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
@@ -240,71 +211,63 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where b = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b IS NOT NULL AND c = 1 PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a = 1 AND b IS NOT NULL AND c = 1 " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 1, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 1, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, -1, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 0, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 2, 1, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 2),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, -1);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 2, 0, 1);
             execute("DELETE FROM %s WHERE a = ?", 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 2),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 1);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 1, 0),
-                                    row(1, 2, 1, 0)
-            );
+                                    row(1, 2, 1, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertEmpty(execute("SELECT a, b, c, d FROM mv_test" + i));
+            assertEmpty(executeView("SELECT a, b, c, d FROM %s"));
 
-            dropView("mv_test" + i);
+            dropView();
             dropTable("DROP TABLE %s");
         }
     }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringSimplePKTest.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringSimplePKTest.java
index d3b3e4a..9db70e6 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringSimplePKTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewFilteringSimplePKTest.java
@@ -22,10 +22,6 @@
 import java.util.List;
 
 import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import org.apache.cassandra.db.SystemKeyspace;
 
 /* 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
@@ -36,8 +32,7 @@
  * - ...
  * - ViewFiltering*Test
  */
-@RunWith(Parameterized.class)
-public class ViewFilteringSimplePKTest extends ViewFilteringTester
+public class ViewFilteringSimplePKTest extends ViewAbstractParameterizedTest
 {
     @Test
     public void testPartitionKeyFilteringUnrestrictedPart() throws Throwable
@@ -47,9 +42,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
@@ -60,87 +52,79 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where a = 1
-            String viewName= "mv_test" + i;
-            createView(viewName, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                             "WHERE a = 1 AND b IS NOT NULL AND c IS NOT NULL " +
+                             "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            ViewFilteringTest.waitForView(keyspace(), viewName);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 1, 1, 0),
                                     row(1, 1, 2, 0));
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 1);
-            assertEmpty(execute("SELECT * FROM mv_test" + i));
+            assertEmpty(executeView("SELECT * FROM %s"));
         }
     }
 
@@ -152,9 +136,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0,  1, 1);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 10, 1, 2);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0,  2, 1);
@@ -165,70 +146,62 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where a = 1
-            String viewName= "mv_test" + i;
-            createView(viewName, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a > 0 AND b > 5 AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a > 0 AND b > 5 AND c IS NOT NULL " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            ViewFilteringTest.waitForView(keyspace(), viewName);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 10, 2, 2),
-                                    row(2, 10, 3, 2)
-            );
+                                    row(2, 10, 3, 2));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 10, 2, 2),
-                                    row(2, 10, 3, 2)
-            );
+                                    row(2, 10, 3, 2));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 3, 10, 4, 2);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 10, 2, 2),
                                     row(2, 10, 3, 2),
-                                    row(3, 10, 4, 2)
-            );
+                                    row(3, 10, 4, 2));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 10, 2, 2),
                                     row(2, 10, 3, 2),
-                                    row(3, 10, 4, 2)
-            );
+                                    row(3, 10, 4, 2));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 100, 3, 10, 4);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 10, 2, 2),
                                     row(2, 10, 3, 2),
-                                    row(3, 10, 4, 100)
-            );
+                                    row(3, 10, 4, 100));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 10, 2, 2),
                                     row(2, 10, 3, 2),
-                                    row(3, 10, 4, 100)
-            );
+                                    row(3, 10, 4, 100));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 10, 2, 2),
                                     row(2, 10, 3, 2),
-                                    row(3, 10, 4, 100)
-            );
+                                    row(3, 10, 4, 100));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 1, 10);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(2, 10, 3, 2),
                                     row(3, 10, 4, 100));
         }
@@ -242,9 +215,6 @@
         {
             createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-            execute("USE " + keyspace());
-            executeNet(version, "USE " + keyspace());
-
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 1, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 0, 0, 0);
@@ -255,83 +225,75 @@
             logger.info("Testing MV primary key: {}", mvPrimaryKeys.get(i));
 
             // only accept rows where a = 1
-            createView("mv_test" + i, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY " + mvPrimaryKeys.get(i));
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE a = 1 AND b IS NOT NULL AND c IS NOT NULL " +
+                       "PRIMARY KEY " + mvPrimaryKeys.get(i));
 
-            while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test" + i))
-                Thread.sleep(10);
-
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new rows that do not match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 0, 0, 0);
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 2, 1, 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
-                                    row(1, 1, 1, 0)
-            );
+                                    row(1, 1, 1, 0));
 
             // insert new row that does match the filter
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 2, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update rows that don't match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 0, 0);
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 0, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // update a row that does match the filter
             execute("UPDATE %s SET d = ? WHERE a = ? AND b = ? AND c = ?", 1, 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete rows that don't match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 0, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 0, 1, 0);
             execute("DELETE FROM %s WHERE a = ? AND b = ?", 0, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 0, 1),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a row that does match the filter
             execute("DELETE FROM %s WHERE a = ? AND b = ? AND c = ?", 1, 1, 0);
-            assertRowsIgnoringOrder(execute("SELECT a, b, c, d FROM mv_test" + i),
+            assertRowsIgnoringOrder(executeView("SELECT a, b, c, d FROM %s"),
                                     row(1, 0, 0, 0),
                                     row(1, 0, 1, 0),
                                     row(1, 1, 1, 0),
-                                    row(1, 1, 2, 0)
-            );
+                                    row(1, 1, 2, 0));
 
             // delete a partition that matches the filter
             execute("DELETE FROM %s WHERE a = ?", 1);
-            assertEmpty(execute("SELECT * FROM mv_test" + i));
+            assertEmpty(executeView("SELECT * FROM %s"));
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
deleted file mode 100644
index ed2d140..0000000
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringTest.java
+++ /dev/null
@@ -1,529 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.cql3;
-
-import java.util.Arrays;
-import java.util.List;
-
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import com.datastax.driver.core.exceptions.InvalidQueryException;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.utils.FBUtilities;
-
-/* 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
- * - ViewFilteringClustering1Test
- * - ViewFilteringClustering2Test
- * - ViewFilteringTest
- * - ...
- * - ViewFiltering*Test
- */
-@RunWith(Parameterized.class)
-public class ViewFilteringTest extends ViewFilteringTester
-{
-    // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
-    @Ignore
-    @Test
-    public void testViewFilteringWithFlush() throws Throwable
-    {
-        testViewFiltering(true);
-    }
-
-    // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
-    @Ignore
-    @Test
-    public void testViewFilteringWithoutFlush() throws Throwable
-    {
-        testViewFiltering(false);
-    }
-
-    public void testViewFiltering(boolean flush) throws Throwable
-    {
-        // CASSANDRA-13547: able to shadow entire view row if base column used in filter condition is modified
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv_test1",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL and c = 1  PRIMARY KEY (a, b)");
-        createView("mv_test2",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT c, d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL and c = 1 and d = 1 PRIMARY KEY (a, b)");
-        createView("mv_test3",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c, d FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (a, b)");
-        createView("mv_test4",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT c FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL and c = 1 PRIMARY KEY (a, b)");
-        createView("mv_test5",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT c FROM %%s WHERE a IS NOT NULL and d = 1 PRIMARY KEY (a, d)");
-        createView("mv_test6",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT c FROM %%s WHERE a = 1 and d IS NOT NULL PRIMARY KEY (a, d)");
-
-        waitForView(keyspace(), "mv_test1");
-        waitForView(keyspace(), "mv_test2");
-        waitForView(keyspace(), "mv_test3");
-        waitForView(keyspace(), "mv_test4");
-        waitForView(keyspace(), "mv_test5");
-        waitForView(keyspace(), "mv_test6");
-
-        Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore("mv_test1").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test2").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test3").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test4").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test5").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test6").disableAutoCompaction();
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 0", 1, 1, 1, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        // views should be updated.
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, 1));
-
-        updateView("UPDATE %s using timestamp 1 set c = ? WHERE a=?", 0, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowCount(execute("SELECT * FROM mv_test1"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test2"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 0, 1));
-        assertRowCount(execute("SELECT * FROM mv_test4"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, 0));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, 0));
-
-        updateView("UPDATE %s using timestamp 2 set c = ? WHERE a=?", 1, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        // row should be back in views.
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, 1));
-
-        updateView("UPDATE %s using timestamp 3 set d = ? WHERE a=?", 0, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, 0));
-        assertRowCount(execute("SELECT * FROM mv_test2"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 1, 0));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1, 1));
-        assertRowCount(execute("SELECT * FROM mv_test5"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 0, 1));
-
-        updateView("UPDATE %s using timestamp 4 set c = ? WHERE a=?", 0, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowCount(execute("SELECT * FROM mv_test1"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test2"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 0, 0));
-        assertRowCount(execute("SELECT * FROM mv_test4"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test5"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 0, 0));
-
-        updateView("UPDATE %s using timestamp 5 set d = ? WHERE a=?", 1, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        // should not update as c=0
-        assertRowCount(execute("SELECT * FROM mv_test1"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test2"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 0, 1));
-        assertRowCount(execute("SELECT * FROM mv_test4"), 0);
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, 0));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, 0));
-
-        updateView("UPDATE %s using timestamp 6 set c = ? WHERE a=?", 1, 1);
-
-        // row should be back in views.
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, 1));
-
-        updateView("UPDATE %s using timestamp 7 set b = ? WHERE a=?", 2, 1);
-        if (flush)
-        {
-            FBUtilities.waitOnFutures(ks.flush());
-            for (String view : views)
-                ks.getColumnFamilyStore(view).forceMajorCompaction();
-        }
-        // row should be back in views.
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 2, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"), row(1, 2, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 2, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 2, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, 1));
-
-        updateView("DELETE b, c FROM %s using timestamp 6 WHERE a=?", 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s"), row(1, 2, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 2, null, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, null));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, null));
-
-        updateView("DELETE FROM %s using timestamp 8 where a=?", 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowCount(execute("SELECT * FROM mv_test1"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test2"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test3"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test4"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test5"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test6"), 0);
-
-        updateView("UPDATE %s using timestamp 9 set b = ?,c = ? where a=?", 1, 1, 1); // upsert
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, null));
-        assertRows(execute("SELECT * FROM mv_test2"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 1, null));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1, 1));
-        assertRows(execute("SELECT * FROM mv_test5"));
-        assertRows(execute("SELECT * FROM mv_test6"));
-
-        updateView("DELETE FROM %s using timestamp 10 where a=?", 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowCount(execute("SELECT * FROM mv_test1"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test2"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test3"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test4"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test5"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test6"), 0);
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) using timestamp 11", 1, 1, 1, 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        // row should be back in views.
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test5"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test6"), row(1, 1, 1));
-
-        updateView("DELETE FROM %s using timestamp 12 where a=?", 1);
-        if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowCount(execute("SELECT * FROM mv_test1"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test2"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test3"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test4"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test5"), 0);
-        assertRowCount(execute("SELECT * FROM mv_test6"), 0);
-
-        dropView("mv_test1");
-        dropView("mv_test2");
-        dropView("mv_test3");
-        dropView("mv_test4");
-        dropView("mv_test5");
-        dropView("mv_test6");
-        dropTable("DROP TABLE %s");
-    }
-
-    // TODO will revise the non-pk filter condition in MV, see CASSANDRA-11500
-    @Ignore
-    @Test
-    public void testMVFilteringWithComplexColumn() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, l list<int>, s set<int>, m map<int,int>, PRIMARY KEY (a, b))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        createView("mv_test1",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT a,b,c FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL "
-                   + "and l contains (1) AND s contains (1) AND m contains key (1) PRIMARY KEY (a, b, c)");
-        createView("mv_test2",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s WHERE a IS NOT NULL and b IS NOT NULL AND l contains (1) PRIMARY KEY (a, b)");
-        createView("mv_test3",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND s contains (1) PRIMARY KEY (a, b)");
-        createView("mv_test4",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT a,b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND m contains key (1) PRIMARY KEY (a, b)");
-
-        waitForView(keyspace(), "mv_test1");
-        waitForView(keyspace(), "mv_test2");
-        waitForView(keyspace(), "mv_test3");
-        waitForView(keyspace(), "mv_test4");
-
-        // not able to drop base column filtered in view
-        assertInvalidMessage("Cannot drop column l, depended on by materialized views", "ALTER TABLE %s DROP l");
-        assertInvalidMessage("Cannot drop column s, depended on by materialized views", "ALTER TABLE %S DROP s");
-        assertInvalidMessage("Cannot drop column m, depended on by materialized views", "ALTER TABLE %s DROP m");
-
-        Keyspace ks = Keyspace.open(keyspace());
-        ks.getColumnFamilyStore("mv_test1").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test2").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test3").disableAutoCompaction();
-        ks.getColumnFamilyStore("mv_test4").disableAutoCompaction();
-
-        execute("INSERT INTO %s (a, b, c, l, s, m) VALUES (?, ?, ?, ?, ?, ?) ",
-                1,
-                1,
-                1,
-                list(1, 1, 2),
-                set(1, 2),
-                map(1, 1, 2, 2));
-        FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"), row(1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1));
-
-        execute("UPDATE %s SET l=l-[1] WHERE a = 1 AND b = 1" );
-        FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1));
-
-        execute("UPDATE %s SET s=s-{2}, m=m-{2} WHERE a = 1 AND b = 1");
-        FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT a,b,c FROM %s"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"), row(1, 1));
-
-        execute("UPDATE %s SET  m=m-{1} WHERE a = 1 AND b = 1");
-        FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT a,b,c FROM %s"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"));
-
-        // filter conditions result not changed
-        execute("UPDATE %s SET  l=l+[2], s=s-{0}, m=m+{3:3} WHERE a = 1 AND b = 1");
-        FBUtilities.waitOnFutures(ks.flush());
-
-        assertRowsIgnoringOrder(execute("SELECT a,b,c FROM %s"), row(1, 1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test1"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test2"));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test3"), row(1, 1));
-        assertRowsIgnoringOrder(execute("SELECT * FROM mv_test4"));
-    }
-
-    @Test
-    public void testMVCreationSelectRestrictions() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY((a, b), c, d))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        // IS NOT NULL is required on all PK statements that are not otherwise restricted
-        List<String> badStatements = Arrays.asList(
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE b IS NOT NULL AND c IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND c IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c is NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = ? AND b IS NOT NULL AND c is NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = blobAsInt(?) AND b IS NOT NULL AND c is NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s PRIMARY KEY (a, b, c, d)"
-        );
-
-        for (String badStatement : badStatements)
-        {
-            try
-            {
-                createView("mv1_test", badStatement);
-                Assert.fail("Create MV statement should have failed due to missing IS NOT NULL restriction: " + badStatement);
-            }
-            catch (InvalidQueryException exc) {}
-        }
-
-        List<String> goodStatements = Arrays.asList(
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND c IS NOT NULL AND d is NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c = 1 AND d IS NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND c > 1 AND d IS NOT NULL PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND c = 1 AND d IN (1, 2, 3) PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND (c, d) = (1, 1) PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND (c, d) > (1, 1) PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = 1 AND b = 1 AND (c, d) IN ((1, 1), (2, 2)) PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = (int) 1 AND b = 1 AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)",
-        "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a = blobAsInt(intAsBlob(1)) AND b = 1 AND c = 1 AND d = 1 PRIMARY KEY ((a, b), c, d)"
-        );
-
-        for (int i = 0; i < goodStatements.size(); i++)
-        {
-            try
-            {
-                createView("mv" + i + "_test", goodStatements.get(i));
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException("MV creation failed: " + goodStatements.get(i), e);
-            }
-
-            try
-            {
-                executeNet(version, "ALTER MATERIALIZED VIEW mv" + i + "_test WITH compaction = { 'class' : 'LeveledCompactionStrategy' }");
-            }
-            catch (Exception e)
-            {
-                throw new RuntimeException("MV alter failed: " + goodStatements.get(i), e);
-            }
-        }
-    }
-
-    @Test
-    public void testCaseSensitivity() throws Throwable
-    {
-        createTable("CREATE TABLE %s (\"theKey\" int, \"theClustering\" int, \"the\"\"Value\" int, PRIMARY KEY (\"theKey\", \"theClustering\"))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 0, 0, 0);
-        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 0, 1, 0);
-        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 1, 0, 0);
-        execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"the\"\"Value\") VALUES (?, ?, ?)", 1, 1, 0);
-
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                              "WHERE \"theKey\" = 1 AND \"theClustering\" = 1 AND \"the\"\"Value\" IS NOT NULL " +
-                              "PRIMARY KEY (\"theKey\", \"theClustering\")");
-
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-        createView("mv_test2", "CREATE MATERIALIZED VIEW %s AS SELECT \"theKey\", \"theClustering\", \"the\"\"Value\" FROM %%s " +
-                               "WHERE \"theKey\" = 1 AND \"theClustering\" = 1 AND \"the\"\"Value\" IS NOT NULL " +
-                               "PRIMARY KEY (\"theKey\", \"theClustering\")");
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test2"))
-            Thread.sleep(10);
-
-        for (String mvname : Arrays.asList("mv_test", "mv_test2"))
-        {
-            assertRowsIgnoringOrder(execute("SELECT \"theKey\", \"theClustering\", \"the\"\"Value\" FROM " + mvname),
-                                    row(1, 1, 0)
-            );
-        }
-
-        executeNet(version, "ALTER TABLE %s RENAME \"theClustering\" TO \"Col\"");
-
-        for (String mvname : Arrays.asList("mv_test", "mv_test2"))
-        {
-            assertRowsIgnoringOrder(execute("SELECT \"theKey\", \"Col\", \"the\"\"Value\" FROM " + mvname),
-                                    row(1, 1, 0)
-            );
-        }
-    }
-
-    @Test
-    public void testFilterWithFunction() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 1);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 0, 2);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 1, 3);
-
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                              "WHERE a = blobAsInt(intAsBlob(1)) AND b IS NOT NULL " +
-                              "PRIMARY KEY (a, b)");
-
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-
-        assertRows(execute("SELECT a, b, c FROM mv_test"),
-                   row(1, 0, 2),
-                   row(1, 1, 3)
-        );
-
-        executeNet(version, "ALTER TABLE %s RENAME a TO foo");
-
-        assertRows(execute("SELECT foo, b, c FROM mv_test"),
-                   row(1, 0, 2),
-                   row(1, 1, 3)
-        );
-    }
-
-    @Test
-    public void testFilterWithTypecast() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))");
-
-        execute("USE " + keyspace());
-        executeNet(version, "USE " + keyspace());
-
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 1);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 0, 2);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 1, 3);
-
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                              "WHERE a = (int) 1 AND b IS NOT NULL " +
-                              "PRIMARY KEY (a, b)");
-
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-
-        assertRows(execute("SELECT a, b, c FROM mv_test"),
-                   row(1, 0, 2),
-                   row(1, 1, 3)
-        );
-
-        executeNet(version, "ALTER TABLE %s RENAME a TO foo");
-
-        assertRows(execute("SELECT foo, b, c FROM mv_test"),
-                   row(1, 0, 2),
-                   row(1, 1, 3)
-        );
-    } 
-}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewFilteringTester.java b/test/unit/org/apache/cassandra/cql3/ViewFilteringTester.java
deleted file mode 100644
index 782a241..0000000
--- a/test/unit/org/apache/cassandra/cql3/ViewFilteringTester.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.cql3;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-
-import com.datastax.driver.core.exceptions.OperationTimedOutException;
-import org.apache.cassandra.concurrent.Stage;
-import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.transport.ProtocolVersion;
-
-/* ViewComplexTest class has been split into multiple ones because of timeout issues (CASSANDRA-16670)
- * Any changes here check if they apply to the other classes:
- * - ViewComplexUpdatesTest
- * - ViewComplexDeletionsTest
- * - ViewComplexTTLTest
- * - ViewComplexTest
- * - ViewComplexLivenessTest
- * - ...
- * - ViewComplex*Test
- */
-@RunWith(Parameterized.class)
-public abstract class ViewFilteringTester extends CQLTester
-{
-    @Parameterized.Parameter
-    public ProtocolVersion version;
-
-    @Parameterized.Parameters()
-    public static Collection<Object[]> versions()
-    {
-        return ProtocolVersion.SUPPORTED.stream()
-                                        .map(v -> new Object[]{v})
-                                        .collect(Collectors.toList());
-    }
-
-    protected final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        requireNetwork();
-        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "true");
-    }
-
-    @AfterClass
-    public static void tearDown()
-    {
-        System.setProperty("cassandra.mv.allow_filtering_nonkey_columns_unsafe", "false");
-    }
-
-    @Before
-    public void begin()
-    {
-        views.clear();
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        for (String viewName : views)
-            executeNet(version, "DROP MATERIALIZED VIEW " + viewName);
-    }
-
-    protected void createView(String name, String query) throws Throwable
-    {
-        try
-        {
-            executeNet(version, String.format(query, name));
-            // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is
-            // the desired behavior
-            views.add(name);
-        }
-        catch (OperationTimedOutException ex)
-        {
-            // ... except for timeout, when we actually do not know whether the view was created or not
-            views.add(name);
-            throw ex;
-        }
-    }
-
-    protected void updateView(String query, Object... params) throws Throwable
-    {
-        executeNet(version, query, params);
-        while (!(Stage.VIEW_MUTATION.executor().getPendingTaskCount() == 0
-                 && Stage.VIEW_MUTATION.executor().getActiveTaskCount() == 0))
-        {
-            Thread.sleep(1);
-        }
-    }
-
-    protected void dropView(String name) throws Throwable
-    {
-        executeNet(version, "DROP MATERIALIZED VIEW " + name);
-        views.remove(name);
-    }
-
-    protected static void waitForView(String keyspace, String view) throws InterruptedException
-    {
-        while (!SystemKeyspace.isViewBuilt(keyspace, view))
-            Thread.sleep(10);
-    }
-}
diff --git a/test/unit/org/apache/cassandra/cql3/ViewPKTest.java b/test/unit/org/apache/cassandra/cql3/ViewPKTest.java
index 06664cb..6ab27ef 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewPKTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewPKTest.java
@@ -24,9 +24,12 @@
 import org.junit.Test;
 
 import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.exceptions.InvalidQueryException;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.exceptions.RequestValidationException;
+import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
+import org.assertj.core.api.Assertions;
 
 import static org.junit.Assert.assertTrue;
 
@@ -44,33 +47,30 @@
     {
         createTable("CREATE TABLE %s (k1 int, c1 int , val int, PRIMARY KEY (k1, c1))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1, c1, val FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT k1, c1, val FROM %s " +
+                   "WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL " +
+                   "PRIMARY KEY (val, k1, c1)");
 
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)");
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)");
 
         Assert.assertEquals(2, execute("select * from %s").size());
-        Assert.assertEquals(2, execute("select * from view1").size());
+        Assert.assertEquals(2, executeView("select * from %s").size());
 
         updateView("DELETE FROM %s WHERE k1 = 1");
 
         Assert.assertEquals(0, execute("select * from %s").size());
-        Assert.assertEquals(0, execute("select * from view1").size());
+        Assert.assertEquals(0, executeView("select * from %s").size());
     }
 
     @Test
-    public void createMvWithUnrestrictedPKParts() throws Throwable
+    public void createMvWithUnrestrictedPKParts()
     {
         createTable("CREATE TABLE %s (k1 int, c1 int , val int, PRIMARY KEY (k1, c1))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT val, k1, c1 FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)");
-
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT val, k1, c1 FROM %s " +
+                   "WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL " +
+                   "PRIMARY KEY (val, k1, c1)");
     }
 
     @Test
@@ -78,25 +78,24 @@
     {
         createTable("CREATE TABLE %s (k1 int, c1 int , val int, PRIMARY KEY (k1, c1))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("view1", "CREATE MATERIALIZED VIEW view1 AS SELECT k1, c1, val FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT k1, c1, val FROM %s " +
+                   "WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL " +
+                   "PRIMARY KEY (val, k1, c1)");
 
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 2, 200)");
         updateView("INSERT INTO %s (k1, c1, val) VALUES (1, 3, 300)");
 
         Assert.assertEquals(2, execute("select * from %s").size());
-        Assert.assertEquals(2, execute("select * from view1").size());
+        Assert.assertEquals(2, executeView("select * from %s").size());
 
         updateView("DELETE FROM %s WHERE k1 = 1 and c1 = 3");
 
         Assert.assertEquals(1, execute("select * from %s").size());
-        Assert.assertEquals(1, execute("select * from view1").size());
+        Assert.assertEquals(1, executeView("select * from %s").size());
     }
 
     @Test
-    public void testPrimaryKeyIsNotNull() throws Throwable
+    public void testPrimaryKeyIsNotNull()
     {
         createTable("CREATE TABLE %s (" +
                     "k int, " +
@@ -104,27 +103,32 @@
                     "bigintval bigint, " +
                     "PRIMARY KEY((k, asciival)))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         // Must include "IS NOT NULL" for primary keys
         try
         {
-            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s");
             Assert.fail("Should fail if no primary key is filtered as NOT NULL");
         }
         catch (Exception e)
         {
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(SyntaxException.class);
+            Assertions.assertThat(cause.getMessage()).contains("mismatched input");
         }
 
         // Must include both when the partition key is composite
         try
         {
-            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE bigintval IS NOT NULL AND asciival IS NOT NULL PRIMARY KEY (bigintval, k, asciival)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE bigintval IS NOT NULL AND asciival IS NOT NULL " +
+                       "PRIMARY KEY (bigintval, k, asciival)");
             Assert.fail("Should fail if compound primary is not completely filtered as NOT NULL");
         }
         catch (Exception e)
         {
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(InvalidRequestException.class);
+            Assertions.assertThat(cause.getMessage()).contains("Primary key columns k must be restricted");
         }
 
         dropTable("DROP TABLE %s");
@@ -136,21 +140,29 @@
                     "PRIMARY KEY(k, asciival))");
         try
         {
-            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s");
             Assert.fail("Should fail if no primary key is filtered as NOT NULL");
         }
         catch (Exception e)
         {
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(SyntaxException.class);
+            Assertions.assertThat(cause.getMessage()).contains("mismatched input");
         }
 
         // Must still include both even when the partition key is composite
         try
         {
-            createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE bigintval IS NOT NULL AND asciival IS NOT NULL PRIMARY KEY (bigintval, k, asciival)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE bigintval IS NOT NULL AND asciival IS NOT NULL " +
+                       "PRIMARY KEY (bigintval, k, asciival)");
             Assert.fail("Should fail if compound primary is not completely filtered as NOT NULL");
         }
         catch (Exception e)
         {
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(InvalidRequestException.class);
+            Assertions.assertThat(cause.getMessage()).contains("Primary key columns k must be restricted");
         }
     }
 
@@ -165,39 +177,36 @@
 
         TableMetadata metadata = currentTableMetadata();
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         for (ColumnMetadata def : new HashSet<>(metadata.columns()))
         {
+            String asciival = def.name.toString().equals("asciival") ? "" : "AND asciival IS NOT NULL ";
             try
             {
-                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
-                               + (def.name.toString().equals("asciival") ? "" : "AND asciival IS NOT NULL ") + "PRIMARY KEY ("
+                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
+                               + asciival + "PRIMARY KEY ("
                                + def.name + ", k" + (def.name.toString().equals("asciival") ? "" : ", asciival") + ")";
                 createView("mv1_" + def.name, query);
 
                 if (def.type.isMultiCell())
                     Assert.fail("MV on a multicell should fail " + def);
             }
-            catch (InvalidQueryException e)
+            catch (Exception e)
             {
                 if (!def.type.isMultiCell() && !def.isPartitionKey())
                     Assert.fail("MV creation failed on " + def);
             }
 
-
             try
             {
-                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
-                               + (def.name.toString().equals("asciival") ? "" : "AND asciival IS NOT NULL ") + " PRIMARY KEY ("
+                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
+                               + asciival + " PRIMARY KEY ("
                                + def.name + ", asciival" + (def.name.toString().equals("k") ? "" : ", k") + ")";
                 createView("mv2_" + def.name, query);
 
                 if (def.type.isMultiCell())
                     Assert.fail("MV on a multicell should fail " + def);
             }
-            catch (InvalidQueryException e)
+            catch (Exception e)
             {
                 if (!def.type.isMultiCell() && !def.isPartitionKey())
                     Assert.fail("MV creation failed on " + def);
@@ -205,41 +214,42 @@
 
             try
             {
-                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
-                               + (def.name.toString().equals("asciival") ? "" : "AND asciival IS NOT NULL ") + "PRIMARY KEY ((" + def.name + ", k), asciival)";
+                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
+                               + asciival + "PRIMARY KEY ((" + def.name + ", k), asciival)";
                 createView("mv3_" + def.name, query);
 
                 if (def.type.isMultiCell())
                     Assert.fail("MV on a multicell should fail " + def);
             }
-            catch (InvalidQueryException e)
+            catch (Exception e)
             {
                 if (!def.type.isMultiCell() && !def.isPartitionKey())
                     Assert.fail("MV creation failed on " + def);
             }
 
-
             try
             {
-                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
-                               + (def.name.toString().equals("asciival") ? "" : "AND asciival IS NOT NULL ") + "PRIMARY KEY ((" + def.name + ", k), asciival)";
+                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
+                               + asciival + "PRIMARY KEY ((" + def.name + ", k), asciival)";
                 createView("mv3_" + def.name, query);
 
                 Assert.fail("Should fail on duplicate name");
             }
             catch (Exception e)
             {
+                Assertions.assertThat(e.getCause()).isInstanceOf(RequestValidationException.class);
             }
 
             try
             {
-                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
-                               + (def.name.toString().equals("asciival") ? "" : "AND asciival IS NOT NULL ") + "PRIMARY KEY ((" + def.name + ", k), nonexistentcolumn)";
+                String query = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL "
+                               + asciival + "PRIMARY KEY ((" + def.name + ", k), nonexistentcolumn)";
                 createView("mv4_" + def.name, query);
                 Assert.fail("Should fail with unknown base column");
             }
-            catch (InvalidQueryException e)
+            catch (Exception e)
             {
+                Assertions.assertThat(e.getCause()).isInstanceOf(RequestValidationException.class);
             }
         }
 
@@ -288,24 +298,24 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c) WITH CLUSTERING ORDER BY (b DESC, c ASC)");
-        createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c ASC, b ASC)");
-        createView("mv3", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
-        createView("mv4", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c DESC, b ASC)");
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c) WITH CLUSTERING ORDER BY (b DESC, c ASC)");
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c ASC, b ASC)");
+        String mv3 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
+        String mv4 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, c, b) WITH CLUSTERING ORDER BY (c DESC, b ASC)");
 
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 1, 1, 1);
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 1, 2, 2, 2);
 
-        ResultSet mvRows = executeNet("SELECT b FROM mv1");
+        ResultSet mvRows = executeNet("SELECT b FROM " + mv1);
         assertRowsNet(mvRows, row(2), row(1));
 
-        mvRows = executeNet("SELECT c FROM mv2");
+        mvRows = executeNet("SELECT c FROM " + mv2);
         assertRowsNet(mvRows, row(1), row(2));
 
-        mvRows = executeNet("SELECT b FROM mv3");
+        mvRows = executeNet("SELECT b FROM " + mv3);
         assertRowsNet(mvRows, row(1), row(2));
 
-        mvRows = executeNet("SELECT c FROM mv4");
+        mvRows = executeNet("SELECT c FROM " + mv4);
         assertRowsNet(mvRows, row(2), row(1));
     }
 
@@ -320,11 +330,13 @@
         executeNet("USE " + keyspace());
 
         // Cannot use SELECT *, as those are always handled by the includeAll shortcut in View.updateAffectsView
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %s " +
+                   "WHERE a IS NOT NULL AND b IS NOT NULL " +
+                   "PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 1);
 
-        ResultSet mvRows = executeNet("SELECT a, b FROM mv1");
+        ResultSet mvRows = executeViewNet("SELECT a, b FROM %s");
         assertRowsNet(mvRows, row(1, 1));
     }
 
@@ -339,11 +351,11 @@
         executeNet("USE " + keyspace());
 
         // Cannot use SELECT *, as those are always handled by the includeAll shortcut in View.updateAffectsView
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 1);
 
-        ResultSet mvRows = executeNet("SELECT a, b FROM mv1");
+        ResultSet mvRows = executeViewNet("SELECT a, b FROM %s");
         assertRowsNet(mvRows, row(1, 1));
     }
 
@@ -358,18 +370,20 @@
                     "PRIMARY KEY (a, b))");
 
         executeNet("USE " + keyspace());
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND d IS NOT NULL PRIMARY KEY (a, d, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE a IS NOT NULL AND b IS NOT NULL AND d IS NOT NULL " +
+                   "PRIMARY KEY (a, d, b)");
 
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
-        ResultSet mvRows = executeNet("SELECT a, d, b, c FROM mv1");
+        ResultSet mvRows = executeViewNet("SELECT a, d, b, c FROM %s");
         assertRowsNet(mvRows, row(0, 0, 0, 0));
 
         updateView("DELETE c FROM %s WHERE a = ? AND b = ?", 0, 0);
-        mvRows = executeNet("SELECT a, d, b, c FROM mv1");
+        mvRows = executeViewNet("SELECT a, d, b, c FROM %s");
         assertRowsNet(mvRows, row(0, 0, 0, null));
 
         updateView("DELETE d FROM %s WHERE a = ? AND b = ?", 0, 0);
-        mvRows = executeNet("SELECT a, d, b FROM mv1");
+        mvRows = executeViewNet("SELECT a, d, b FROM %s");
         assertTrue(mvRows.isExhausted());
     }
 
@@ -384,23 +398,25 @@
                     "PRIMARY KEY (a, b))");
 
         executeNet("USE " + keyspace());
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND d IS NOT NULL PRIMARY KEY (d, a, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE a IS NOT NULL AND b IS NOT NULL AND d IS NOT NULL " +
+                   "PRIMARY KEY (d, a, b)");
 
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, 0, 0, 0);
-        ResultSet mvRows = executeNet("SELECT a, d, b, c FROM mv1");
+        ResultSet mvRows = executeViewNet("SELECT a, d, b, c FROM %s");
         assertRowsNet(mvRows, row(0, 0, 0, 0));
 
         updateView("DELETE c FROM %s WHERE a = ? AND b = ?", 0, 0);
-        mvRows = executeNet("SELECT a, d, b, c FROM mv1");
+        mvRows = executeViewNet("SELECT a, d, b, c FROM %s");
         assertRowsNet(mvRows, row(0, 0, 0, null));
 
         updateView("DELETE d FROM %s WHERE a = ? AND b = ?", 0, 0);
-        mvRows = executeNet("SELECT a, d, b FROM mv1");
+        mvRows = executeViewNet("SELECT a, d, b FROM %s");
         assertTrue(mvRows.isExhausted());
     }
 
     @Test
-    public void testMultipleNonPrimaryKeysInView() throws Throwable
+    public void testMultipleNonPrimaryKeysInView()
     {
         createTable("CREATE TABLE %s (" +
                     "a int," +
@@ -412,22 +428,27 @@
 
         try
         {
-            createView("mv_de", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d IS NOT NULL AND e IS NOT NULL PRIMARY KEY ((d, a), b, e, c)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d IS NOT NULL AND e IS NOT NULL PRIMARY KEY ((d, a), b, e, c)");
             Assert.fail("Should have rejected a query including multiple non-primary key base columns");
         }
         catch (Exception e)
         {
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(InvalidRequestException.class);
+            Assertions.assertThat(cause.getMessage()).contains("Cannot include more than one non-primary key column");
         }
 
         try
         {
-            createView("mv_de", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d IS NOT NULL AND e IS NOT NULL PRIMARY KEY ((a, b), c, d, e)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL AND d IS NOT NULL AND e IS NOT NULL PRIMARY KEY ((a, b), c, d, e)");
             Assert.fail("Should have rejected a query including multiple non-primary key base columns");
         }
         catch (Exception e)
         {
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(InvalidRequestException.class);
+            Assertions.assertThat(cause.getMessage()).contains("Cannot include more than one non-primary key column");
         }
-
     }
 
     @Test
@@ -437,10 +458,9 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv",
-                   "CREATE MATERIALIZED VIEW %s AS" +
+        createView("CREATE MATERIALIZED VIEW %s AS" +
                    "  SELECT id1, v1, id2, v2" +
-                   "  FROM %%s" +
+                   "  FROM %s" +
                    "  WHERE id1 IS NOT NULL AND v1 IS NOT NULL AND id2 IS NOT NULL" +
                    "  PRIMARY KEY (id1, v1, id2)" +
                    "  WITH CLUSTERING ORDER BY (v1 DESC, id2 ASC)");
@@ -448,14 +468,14 @@
         execute("INSERT INTO %s (id1, id2, v1, v2) VALUES (?, ?, ?, ?)", 0, 1, "foo", "bar");
 
         assertRowsNet(executeNet("SELECT * FROM %s"), row(0, 1, "foo", "bar"));
-        assertRowsNet(executeNet("SELECT * FROM mv"), row(0, "foo", 1, "bar"));
+        assertRowsNet(executeViewNet("SELECT * FROM %s"), row(0, "foo", 1, "bar"));
 
         executeNet("UPDATE %s SET v1=? WHERE id1=? AND id2=?", null, 0, 1);
         assertRowsNet(executeNet("SELECT * FROM %s"), row(0, 1, null, "bar"));
-        assertRowsNet(executeNet("SELECT * FROM mv"));
+        assertRowsNet(executeViewNet("SELECT * FROM %s"));
 
         executeNet("UPDATE %s SET v2=? WHERE id1=? AND id2=?", "rab", 0, 1);
         assertRowsNet(executeNet("SELECT * FROM %s"), row(0, 1, null, "rab"));
-        assertRowsNet(executeNet("SELECT * FROM mv"));
+        assertRowsNet(executeViewNet("SELECT * FROM %s"));
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewRangesTest.java b/test/unit/org/apache/cassandra/cql3/ViewRangesTest.java
index ce67a9b..5d6e8a7 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewRangesTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewRangesTest.java
@@ -21,8 +21,8 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.SystemKeyspace;
 
 /*
  * This test class was too large and used to timeout CASSANDRA-16777. We're splitting it into:
@@ -49,16 +49,14 @@
     {
         createTable("CREATE TABLE %s (k1 int, c1 int, c2 int, v1 int, v2 int, PRIMARY KEY (k1, c1, c2))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("view1",
-                   "CREATE MATERIALIZED VIEW view1 AS SELECT * FROM %%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL PRIMARY KEY (k1, c2, c1)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL " +
+                   "PRIMARY KEY (k1, c2, c1)");
 
         updateView("DELETE FROM %s USING TIMESTAMP 10 WHERE k1 = 1 and c1=1");
 
         if (flush)
-            Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush();
+            Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         String table = KEYSPACE + "." + currentTable();
         updateView("BEGIN BATCH " +
@@ -75,7 +73,7 @@
                                 row(1, 0, 0, 0, 0),
                                 row(1, 0, 1, 0, 1),
                                 row(1, 2, 0, 2, 0));
-        assertRowsIgnoringOrder(execute("select k1,c1,c2,v1,v2 from view1"),
+        assertRowsIgnoringOrder(executeView("select k1,c1,c2,v1,v2 from %s"),
                                 row(1, 0, 0, 0, 0),
                                 row(1, 0, 1, 0, 1),
                                 row(1, 2, 0, 2, 0));
@@ -93,39 +91,37 @@
                     "PRIMARY KEY((k, asciival), bigintval, textval1)" +
                     ")");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv_test1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE textval2 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL AND textval1 IS NOT NULL PRIMARY KEY ((textval2, k), asciival, bigintval, textval1)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE textval2 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL AND textval1 IS NOT NULL " +
+                   "PRIMARY KEY ((textval2, k), asciival, bigintval, textval1)");
 
         for (int i = 0; i < 100; i++)
-            updateView("INSERT into %s (k,asciival,bigintval,textval1,textval2)VALUES(?,?,?,?,?)", 0, "foo", (long) i % 2, "bar" + i, "baz");
+            updateView("INSERT into %s (k,asciival,bigintval,textval1,textval2) VALUES (?,?,?,?,?)",
+                       0, "foo", (long) i % 2, "bar" + i, "baz");
 
         Assert.assertEquals(50, execute("select * from %s where k = 0 and asciival = 'foo' and bigintval = 0").size());
         Assert.assertEquals(50, execute("select * from %s where k = 0 and asciival = 'foo' and bigintval = 1").size());
 
-        Assert.assertEquals(100, execute("select * from mv_test1").size());
+        Assert.assertEquals(100, executeView("select * from %s").size());
 
         //Check the builder works
-        createView("mv_test2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE textval2 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL AND textval1 IS NOT NULL PRIMARY KEY ((textval2, k), asciival, bigintval, textval1)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE textval2 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL AND textval1 IS NOT NULL " +
+                   "PRIMARY KEY ((textval2, k), asciival, bigintval, textval1)");
 
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test2"))
-            Thread.sleep(10);
+        Assert.assertEquals(100, executeView("select * from %s").size());
 
-        Assert.assertEquals(100, execute("select * from mv_test2").size());
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE textval2 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL AND textval1 IS NOT NULL " +
+                   "PRIMARY KEY ((textval2, k), bigintval, textval1, asciival)");
 
-        createView("mv_test3", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE textval2 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL AND textval1 IS NOT NULL PRIMARY KEY ((textval2, k), bigintval, textval1, asciival)");
-
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test3"))
-            Thread.sleep(10);
-
-        Assert.assertEquals(100, execute("select * from mv_test3").size());
-        Assert.assertEquals(100, execute("select asciival from mv_test3 where textval2 = ? and k = ?", "baz", 0).size());
+        Assert.assertEquals(100, executeView("select * from %s").size());
+        Assert.assertEquals(100, executeView("select asciival from %s where textval2 = ? and k = ?", "baz", 0).size());
 
         //Write a RT and verify the data is removed from index
         updateView("DELETE FROM %s WHERE k = ? AND asciival = ? and bigintval = ?", 0, "foo", 0L);
 
-        Assert.assertEquals(50, execute("select asciival from mv_test3 where textval2 = ? and k = ?", "baz", 0).size());
+        Assert.assertEquals(50, executeView("select asciival from %s where textval2 = ? and k = ?", "baz", 0).size());
     }
 
 
@@ -140,10 +136,9 @@
                     "PRIMARY KEY((k, asciival), bigintval)" +
                     ")");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE textval1 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL PRIMARY KEY ((textval1, k), asciival, bigintval)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE textval1 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL " +
+                   "PRIMARY KEY ((textval1, k), asciival, bigintval)");
 
         for (int i = 0; i < 100; i++)
             updateView("INSERT into %s (k,asciival,bigintval,textval1)VALUES(?,?,?,?)", 0, "foo", (long) i % 2, "bar" + i);
@@ -153,13 +148,13 @@
 
 
         Assert.assertEquals(2, execute("select * from %s").size());
-        Assert.assertEquals(2, execute("select * from mv").size());
+        Assert.assertEquals(2, executeView("select * from %s").size());
 
         //Write a RT and verify the data is removed from index
         updateView("DELETE FROM %s WHERE k = ? AND asciival = ? and bigintval = ?", 0, "foo", 0L);
 
         Assert.assertEquals(1, execute("select * from %s").size());
-        Assert.assertEquals(1, execute("select * from mv").size());
+        Assert.assertEquals(1, executeView("select * from %s").size());
     }
 
     @Test
@@ -173,10 +168,9 @@
                     "PRIMARY KEY((k, asciival), bigintval)" +
                     ")");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE textval1 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL PRIMARY KEY ((textval1, k), asciival, bigintval)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE textval1 IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL AND bigintval IS NOT NULL " +
+                   "PRIMARY KEY ((textval1, k), asciival, bigintval)");
 
         for (int i = 0; i < 100; i++)
             updateView("INSERT into %s (k,asciival,bigintval,textval1)VALUES(?,?,?,?)", 0, "foo", (long) i % 2, "bar" + i);
@@ -186,12 +180,12 @@
 
 
         Assert.assertEquals(2, execute("select * from %s").size());
-        Assert.assertEquals(2, execute("select * from mv").size());
+        Assert.assertEquals(2, executeView("select * from %s").size());
 
         //Write a RT and verify the data is removed from index
         updateView("DELETE FROM %s WHERE k = ? AND asciival = ? and bigintval >= ?", 0, "foo", 0L);
 
         Assert.assertEquals(0, execute("select * from %s").size());
-        Assert.assertEquals(0, execute("select * from mv").size());
+        Assert.assertEquals(0, executeView("select * from %s").size());
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
index a1cc34a..09d7e15 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewSchemaTest.java
@@ -22,122 +22,55 @@
 import java.math.BigInteger;
 import java.net.InetAddress;
 import java.text.SimpleDateFormat;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
 import java.util.HashSet;
-import java.util.List;
 import java.util.UUID;
 
 import org.junit.Assert;
-
-import com.datastax.driver.core.exceptions.OperationTimedOutException;
-import org.apache.cassandra.concurrent.SEPExecutor;
-import org.apache.cassandra.concurrent.Stage;
-import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.SchemaCQLHelper;
-import org.apache.cassandra.schema.ColumnMetadata;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.exceptions.InvalidRequestException;
-import org.apache.cassandra.db.SystemKeyspace;
-import org.apache.cassandra.serializers.SimpleDateSerializer;
-import org.apache.cassandra.serializers.TimeSerializer;
-import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.datastax.driver.core.exceptions.InvalidQueryException;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.SchemaCQLHelper;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.serializers.SimpleDateSerializer;
+import org.apache.cassandra.serializers.TimeSerializer;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.assertj.core.api.Assertions;
 
 import static org.junit.Assert.assertTrue;
 
-
-public class ViewSchemaTest extends CQLTester
+public class ViewSchemaTest extends ViewAbstractTest
 {
-    ProtocolVersion protocolVersion = ProtocolVersion.V4;
-    private final List<String> views = new ArrayList<>();
-
-    @BeforeClass
-    public static void startup()
-    {
-        requireNetwork();
-    }
-    @Before
-    public void begin()
-    {
-        views.clear();
-    }
-
-    @After
-    public void end() throws Throwable
-    {
-        for (String viewName : views)
-            executeNet(protocolVersion, "DROP MATERIALIZED VIEW " + viewName);
-    }
-
-    private void createView(String name, String query) throws Throwable
-    {
-        try
-        {
-            executeNet(protocolVersion, String.format(query, name));
-            // If exception is thrown, the view will not be added to the list; since it shouldn't have been created, this is
-            // the desired behavior
-            views.add(name);
-        }
-        catch (OperationTimedOutException ex)
-        {
-            // ... except for timeout, when we actually do not know whether the view was created or not
-            views.add(name);
-            throw ex;
-        }
-    }
-
-    private void updateView(String query, Object... params) throws Throwable
-    {
-        executeNet(protocolVersion, query, params);
-        while (!(((SEPExecutor) Stage.VIEW_MUTATION.executor()).getPendingTaskCount() == 0
-                 && ((SEPExecutor) Stage.VIEW_MUTATION.executor()).getActiveTaskCount() == 0))
-        {
-            Thread.sleep(1);
-        }
-    }
-
     @Test
     public void testCaseSensitivity() throws Throwable
     {
         createTable("CREATE TABLE %s (\"theKey\" int, \"theClustering\" int, \"theValue\" int, PRIMARY KEY (\"theKey\", \"theClustering\"))");
 
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
         execute("INSERT INTO %s (\"theKey\", \"theClustering\", \"theValue\") VALUES (?, ?, ?)", 0, 0, 0);
 
-        createView("mv_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                              "WHERE \"theKey\" IS NOT NULL AND \"theClustering\" IS NOT NULL AND \"theValue\" IS NOT NULL " +
-                              "PRIMARY KEY (\"theKey\", \"theClustering\")");
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                "WHERE \"theKey\" IS NOT NULL AND \"theClustering\" IS NOT NULL AND \"theValue\" IS NOT NULL " +
+                                "PRIMARY KEY (\"theKey\", \"theClustering\")");
 
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test"))
-            Thread.sleep(10);
-        createView("mv_test2", "CREATE MATERIALIZED VIEW %s AS SELECT \"theKey\", \"theClustering\", \"theValue\" FROM %%s " +
-                               "WHERE \"theKey\" IS NOT NULL AND \"theClustering\" IS NOT NULL AND \"theValue\" IS NOT NULL " +
-                               "PRIMARY KEY (\"theKey\", \"theClustering\")");
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv_test2"))
-            Thread.sleep(10);
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT \"theKey\", \"theClustering\", \"theValue\" FROM %s " +
+                                "WHERE \"theKey\" IS NOT NULL AND \"theClustering\" IS NOT NULL AND \"theValue\" IS NOT NULL " +
+                                "PRIMARY KEY (\"theKey\", \"theClustering\")");
 
-        for (String mvname : Arrays.asList("mv_test", "mv_test2"))
+        for (String mvname : Arrays.asList(mv1, mv2))
         {
             assertRows(execute("SELECT \"theKey\", \"theClustering\", \"theValue\" FROM " + mvname),
-               row(0, 0, 0)
-            );
+                       row(0, 0, 0));
         }
 
-        executeNet(protocolVersion, "ALTER TABLE %s RENAME \"theClustering\" TO \"Col\"");
+        executeNet("ALTER TABLE %s RENAME \"theClustering\" TO \"Col\"");
 
-        for (String mvname : Arrays.asList("mv_test", "mv_test2"))
+        for (String mvname : Arrays.asList(mv1, mv2))
         {
             assertRows(execute("SELECT \"theKey\", \"Col\", \"theValue\" FROM " + mvname),
                        row(0, 0, 0)
@@ -154,54 +87,56 @@
                     "bigintval bigint, " +
                     "PRIMARY KEY((k, asciival)))");
 
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
-        createView("mv1_test", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE bigintval IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL PRIMARY KEY (bigintval, k, asciival)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE bigintval IS NOT NULL AND k IS NOT NULL AND asciival IS NOT NULL " +
+                   "PRIMARY KEY (bigintval, k, asciival)");
         updateView("INSERT INTO %s(k,asciival,bigintval)VALUES(?,?,?)", 0, "foo", 1L);
 
         try
         {
-            updateView("INSERT INTO mv1_test(k,asciival,bigintval) VALUES(?,?,?)", 1, "foo", 2L);
+            updateView("INSERT INTO " + currentView() + "(k,asciival,bigintval) VALUES(?,?,?)", 1, "foo", 2L);
             Assert.fail("Shouldn't be able to modify a MV directly");
         }
-        catch (Exception e)
+        catch (InvalidQueryException e)
         {
+            Assertions.assertThat(e.getMessage()).contains("Cannot directly modify a materialized view");
         }
 
         try
         {
-            executeNet(protocolVersion, "ALTER TABLE mv1_test ADD foo text");
+            executeViewNet("ALTER TABLE %s ADD foo text");
             Assert.fail("Should not be able to use alter table with MV");
         }
-        catch (Exception e)
+        catch (InvalidQueryException e)
         {
+            Assertions.assertThat(e.getMessage()).contains("Cannot use ALTER TABLE on a materialized view");
         }
 
         try
         {
-            executeNet(protocolVersion, "ALTER TABLE mv1_test WITH compaction = { 'class' : 'LeveledCompactionStrategy' }");
+            executeViewNet("ALTER TABLE %s WITH compaction = { 'class' : 'LeveledCompactionStrategy' }");
             Assert.fail("Should not be able to use alter table with MV");
         }
-        catch (Exception e)
+        catch (InvalidQueryException e)
         {
+            Assertions.assertThat(e.getMessage()).contains("Cannot use ALTER TABLE on a materialized view");
         }
 
-        executeNet(protocolVersion, "ALTER MATERIALIZED VIEW mv1_test WITH compaction = { 'class' : 'LeveledCompactionStrategy' }");
+        executeViewNet("ALTER MATERIALIZED VIEW %s WITH compaction = { 'class' : 'LeveledCompactionStrategy' }");
 
         //Test alter add
-        executeNet(protocolVersion, "ALTER TABLE %s ADD foo text");
-        TableMetadata metadata = Schema.instance.getTableMetadata(keyspace(), "mv1_test");
+        executeNet("ALTER TABLE %s ADD foo text");
+        TableMetadata metadata = Schema.instance.getTableMetadata(keyspace(), currentView());
         Assert.assertNotNull(metadata.getColumn(ByteBufferUtil.bytes("foo")));
 
         updateView("INSERT INTO %s(k,asciival,bigintval,foo)VALUES(?,?,?,?)", 0, "foo", 1L, "bar");
         assertRows(execute("SELECT foo from %s"), row("bar"));
 
         //Test alter rename
-        executeNet(protocolVersion, "ALTER TABLE %s RENAME asciival TO bar");
+        executeNet("ALTER TABLE %s RENAME asciival TO bar");
 
         assertRows(execute("SELECT bar from %s"), row("foo"));
-        metadata = Schema.instance.getTableMetadata(keyspace(), "mv1_test");
+        metadata = Schema.instance.getTableMetadata(keyspace(), currentView());
         Assert.assertNotNull(metadata.getColumn(ByteBufferUtil.bytes("bar")));
     }
 
@@ -209,36 +144,33 @@
     @Test
     public void testTwoTablesOneView() throws Throwable
     {
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
         createTable("CREATE TABLE " + keyspace() + ".dummy_table (" +
-                "j int, " +
-                "intval int, " +
-                "PRIMARY KEY (j))");
+                    "j int, " +
+                    "intval int, " +
+                    "PRIMARY KEY (j))");
 
         createTable("CREATE TABLE " + keyspace() + ".real_base (" +
-                "k int, " +
-                "intval int, " +
-                "PRIMARY KEY (k))");
+                    "k int, " +
+                    "intval int, " +
+                    "PRIMARY KEY (k))");
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM " + keyspace() + ".real_base WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
-        createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM " + keyspace() + ".dummy_table WHERE j IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, j)");
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM " + keyspace() + ".real_base WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM " + keyspace() + ".dummy_table WHERE j IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, j)");
 
         updateView("INSERT INTO " + keyspace() + ".real_base (k, intval) VALUES (?, ?)", 0, 0);
         assertRows(execute("SELECT k, intval FROM " + keyspace() + ".real_base WHERE k = ?", 0), row(0, 0));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 0), row(0, 0));
+        assertRows(execute("SELECT k, intval from " + mv + " WHERE intval = ?", 0), row(0, 0));
 
         updateView("INSERT INTO " + keyspace() + ".real_base (k, intval) VALUES (?, ?)", 0, 1);
         assertRows(execute("SELECT k, intval FROM " + keyspace() + ".real_base WHERE k = ?", 0), row(0, 1));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 1), row(0, 1));
+        assertRows(execute("SELECT k, intval from " + mv + " WHERE intval = ?", 1), row(0, 1));
 
         assertRows(execute("SELECT k, intval FROM " + keyspace() + ".real_base WHERE k = ?", 0), row(0, 1));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 1), row(0, 1));
+        assertRows(execute("SELECT k, intval from " + mv + " WHERE intval = ?", 1), row(0, 1));
 
-        updateView("INSERT INTO " + keyspace() +".dummy_table (j, intval) VALUES(?, ?)", 0, 1);
+        updateView("INSERT INTO " + keyspace() + ".dummy_table (j, intval) VALUES(?, ?)", 0, 1);
         assertRows(execute("SELECT j, intval FROM " + keyspace() + ".dummy_table WHERE j = ?", 0), row(0, 1));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 1), row(0, 1));
+        assertRows(execute("SELECT k, intval from " + mv + " WHERE intval = ?", 1), row(0, 1));
     }
 
     @Test
@@ -249,23 +181,23 @@
                     "intval int, " +
                     "PRIMARY KEY (k))");
 
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
+        String view = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                 "WHERE k IS NOT NULL AND intval IS NOT NULL " +
+                                 "PRIMARY KEY (intval, k)");
 
         updateView("INSERT INTO %s (k, intval) VALUES (?, ?)", 0, 0);
         assertRows(execute("SELECT k, intval FROM %s WHERE k = ?", 0), row(0, 0));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 0), row(0, 0));
+        assertRows(executeView("SELECT k, intval from %s WHERE intval = ?", 0), row(0, 0));
 
-        executeNet(protocolVersion, "DROP MATERIALIZED VIEW mv");
-        views.remove("mv");
+        executeNet("DROP MATERIALIZED VIEW " + view);
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
+        createView(view, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                         "WHERE k IS NOT NULL AND intval IS NOT NULL " +
+                         "PRIMARY KEY (intval, k)");
 
         updateView("INSERT INTO %s (k, intval) VALUES (?, ?)", 0, 1);
         assertRows(execute("SELECT k, intval FROM %s WHERE k = ?", 0), row(0, 1));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 1), row(0, 1));
+        assertRows(executeView("SELECT k, intval from %s WHERE intval = ?", 1), row(0, 1));
     }
 
     @Test
@@ -303,14 +235,11 @@
 
         TableMetadata metadata = currentTableMetadata();
 
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
         for (ColumnMetadata def : new HashSet<>(metadata.columns()))
         {
             try
             {
-                createView("mv_" + def.name, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL PRIMARY KEY (" + def.name + ",k)");
+                createView("mv_" + def.name, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE " + def.name + " IS NOT NULL AND k IS NOT NULL PRIMARY KEY (" + def.name + ",k)");
 
                 if (def.type.isMultiCell())
                     Assert.fail("MV on a multicell should fail " + def);
@@ -318,7 +247,7 @@
                 if (def.isPartitionKey())
                     Assert.fail("MV on partition key should fail " + def);
             }
-            catch (InvalidQueryException e)
+            catch (Exception e)
             {
                 if (!def.type.isMultiCell() && !def.isPartitionKey())
                     Assert.fail("MV creation failed on " + def);
@@ -678,20 +607,19 @@
     public void testDropTableWithMV() throws Throwable
     {
         createTable("CREATE TABLE %s (" +
-                "a int," +
-                "b int," +
-                "c int," +
-                "d int," +
-                "PRIMARY KEY (a, b, c))");
+                    "a int," +
+                    "b int," +
+                    "c int," +
+                    "d int," +
+                    "PRIMARY KEY (a, b, c))");
 
-        executeNet(protocolVersion, "USE " + keyspace());
+        executeNet("USE " + keyspace());
 
-        createView(keyspace() + ".mv1",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
+        String mv = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (a, b, c)");
 
         try
         {
-            executeNet(protocolVersion, "DROP TABLE " + keyspace() + ".mv1");
+            executeNet("DROP TABLE " + keyspace() + '.' + mv);
             Assert.fail();
         }
         catch (InvalidQueryException e)
@@ -707,12 +635,12 @@
         // format changes.
         createTable("CREATE TABLE %s ( a int, b int, c int, d int, PRIMARY KEY (a, b, c))");
 
-        executeNet(protocolVersion, "USE " + keyspace());
+        executeNet("USE " + keyspace());
 
         assertInvalidMessage("Non-primary key columns can only be restricted with 'IS NOT NULL'",
                              "CREATE MATERIALIZED VIEW " + keyspace() + ".mv AS SELECT * FROM %s "
-                                     + "WHERE b IS NOT NULL AND c IS NOT NULL AND a IS NOT NULL "
-                                     + "AND d = 1 PRIMARY KEY (c, b, a)");
+                             + "WHERE b IS NOT NULL AND c IS NOT NULL AND a IS NOT NULL "
+                             + "AND d = 1 PRIMARY KEY (c, b, a)");
     }
 
     @Test
@@ -720,9 +648,6 @@
     {
         createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY(a))");
 
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
         execute("INSERT into %s (a,b,c,d) VALUES (?,?,?,?)", 1, 2, 3, 4);
 
         assertInvalidThrowMessage("Cannot use token relation when defining a materialized view", InvalidRequestException.class,
@@ -740,11 +665,8 @@
                     "v int, " +
                     "PRIMARY KEY (pk, c1, c2, c3))");
 
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 DESC, c1 ASC, c3 ASC)");
-        createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 ASC, c1 DESC, c3 DESC)");
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 DESC, c1 ASC, c3 ASC)");
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 ASC, c1 DESC, c3 DESC)");
 
         updateView("INSERT INTO %s (pk, c1, c2, c3, v) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 0, 0);
         updateView("INSERT INTO %s (pk, c1, c2, c3, v) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 1, 1);
@@ -767,7 +689,7 @@
                    row(0, 1, 2, 1, 7),
                    row(0, 2, 1, 1, 8));
 
-        assertRows(execute("SELECT * FROM mv1 WHERE pk = ?", 0),
+        assertRows(execute("SELECT * FROM " + mv1 + " WHERE pk = ?", 0),
                    row(0, 2, 1, 1, 7),
                    row(0, 1, 0, 0, 3),
                    row(0, 1, 0, 1, 4),
@@ -778,7 +700,7 @@
                    row(0, 0, 0, 1, 1),
                    row(0, 0, 0, 2, 2));
 
-        assertRows(execute("SELECT * FROM mv2 WHERE pk = ?", 0),
+        assertRows(execute("SELECT * FROM " + mv2 + " WHERE pk = ?", 0),
                    row(0, 0, 0, 2, 2),
                    row(0, 0, 0, 1, 1),
                    row(0, 0, 0, 0, 0),
@@ -801,12 +723,9 @@
                     "v int, " +
                     "PRIMARY KEY (pk, c1, c2, c3)) WITH CLUSTERING ORDER BY (c1 DESC, c2 ASC, c3 DESC)");
 
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
-
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3)");
-        createView("mv2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 DESC, c1 ASC, c3 ASC)");
-        createView("mv3", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 ASC, c1 DESC, c3 DESC)");
+        String mv1 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3)");
+        String mv2 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 DESC, c1 ASC, c3 ASC)");
+        String mv3 = createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE pk IS NOT NULL AND c1 IS NOT NULL AND c2 IS NOT NULL and c3 IS NOT NULL PRIMARY KEY (pk, c2, c1, c3) WITH CLUSTERING ORDER BY (c2 ASC, c1 DESC, c3 DESC)");
 
         updateView("INSERT INTO %s (pk, c1, c2, c3, v) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 0, 0);
         updateView("INSERT INTO %s (pk, c1, c2, c3, v) VALUES (?, ?, ?, ?, ?)", 0, 0, 0, 1, 1);
@@ -827,9 +746,9 @@
                    row(0, 0, 0, 0, 0),
                    row(0, 0, 1, 2, 5),
                    row(0, 0, 1, 1, 4),
-                  row(0, 0, 1, 0, 3));
+                   row(0, 0, 1, 0, 3));
 
-        assertRows(execute("SELECT * FROM mv1 WHERE pk = ?", 0),
+        assertRows(execute("SELECT * FROM " + mv1 + " WHERE pk = ?", 0),
                    row(0, 0, 0, 2, 2),
                    row(0, 0, 0, 1, 1),
                    row(0, 0, 0, 0, 0),
@@ -840,7 +759,7 @@
                    row(0, 1, 0, 0, 3),
                    row(0, 2, 1, 1, 7));
 
-        assertRows(execute("SELECT * FROM mv2 WHERE pk = ?", 0),
+        assertRows(execute("SELECT * FROM " + mv2 + " WHERE pk = ?", 0),
                    row(0, 2, 1, 1, 7),
                    row(0, 1, 0, 0, 3),
                    row(0, 1, 0, 1, 4),
@@ -851,7 +770,7 @@
                    row(0, 0, 0, 1, 1),
                    row(0, 0, 0, 2, 2));
 
-        assertRows(execute("SELECT * FROM mv3 WHERE pk = ?", 0),
+        assertRows(execute("SELECT * FROM " + mv3 + " WHERE pk = ?", 0),
                    row(0, 0, 0, 2, 2),
                    row(0, 0, 0, 1, 1),
                    row(0, 0, 0, 0, 0),
@@ -864,7 +783,7 @@
     }
 
     @Test
-    public void testViewMetadataCQLNotIncludeAllColumn() throws Throwable
+    public void testViewMetadataCQLNotIncludeAllColumn()
     {
         String createBase = "CREATE TABLE IF NOT EXISTS %s (" +
                             "pk1 int," +
@@ -877,7 +796,7 @@
                             "PRIMARY KEY ((pk1, pk2), ck1, ck2)) WITH " +
                             "CLUSTERING ORDER BY (ck1 ASC, ck2 ASC);";
 
-        String createView = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s AS SELECT pk1, pk2, ck1, ck2, reg1, reg2 FROM %%s "
+        String createView = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s AS SELECT pk1, pk2, ck1, ck2, reg1, reg2 FROM %s "
                             + "WHERE pk2 IS NOT NULL AND pk1 IS NOT NULL AND ck2 IS NOT NULL AND ck1 IS NOT NULL PRIMARY KEY((pk2, pk1), ck2, ck1)";
 
         String expectedViewSnapshot = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s.%s AS\n" +
@@ -894,7 +813,7 @@
     }
 
     @Test
-    public void testViewMetadataCQLIncludeAllColumn() throws Throwable
+    public void testViewMetadataCQLIncludeAllColumn()
     {
         String createBase = "CREATE TABLE IF NOT EXISTS %s (" +
                             "pk1 int," +
@@ -907,7 +826,7 @@
                             "PRIMARY KEY ((pk1, pk2), ck1, ck2)) WITH " +
                             "CLUSTERING ORDER BY (ck1 ASC, ck2 DESC);";
 
-        String createView = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s AS SELECT * FROM %%s "
+        String createView = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s AS SELECT * FROM %s "
                             + "WHERE pk2 IS NOT NULL AND pk1 IS NOT NULL AND ck2 IS NOT NULL AND ck1 IS NOT NULL PRIMARY KEY((pk2, pk1), ck2, ck1)";
 
         String expectedViewSnapshot = "CREATE MATERIALIZED VIEW IF NOT EXISTS %s.%s AS\n" +
@@ -923,19 +842,22 @@
                             expectedViewSnapshot);
     }
 
-    private void testViewMetadataCQL(String createBase, String createView, String viewSnapshotSchema) throws Throwable
+    @Test
+    public void testAlterViewIfExists() throws Throwable
     {
-        execute("USE " + keyspace());
-        executeNet(protocolVersion, "USE " + keyspace());
+        executeNet("USE " + keyspace());
+        executeNet("ALTER MATERIALIZED VIEW IF EXISTS mv1_test WITH compaction = { 'class' : 'LeveledCompactionStrategy' }");
+    }
 
+    private void testViewMetadataCQL(String createBase, String createView, String viewSnapshotSchema)
+    {
         String base = createTable(createBase);
 
-        String view = "mv";
-        createView(view, createView);
+        String view = createView(createView);
 
-        ColumnFamilyStore mv = Keyspace.open(keyspace()).getColumnFamilyStore(view);
-        
-        assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(mv.metadata(), true, true, true)
+        Keyspace keyspace = Keyspace.open(keyspace());
+        ColumnFamilyStore mv = keyspace.getColumnFamilyStore(view);
+        assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(mv.metadata(), keyspace.getMetadata())
                                   .startsWith(String.format(viewSnapshotSchema,
                                                             keyspace(),
                                                             view,
diff --git a/test/unit/org/apache/cassandra/cql3/ViewTest.java b/test/unit/org/apache/cassandra/cql3/ViewTest.java
index 853c767..d82fd32 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewTest.java
@@ -21,28 +21,26 @@
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import com.google.common.util.concurrent.Uninterruptibles;
 
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
 import com.datastax.driver.core.ResultSet;
-import com.datastax.driver.core.exceptions.InvalidQueryException;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.view.View;
+import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.SchemaKeyspaceTables;
 import org.apache.cassandra.service.ClientWarn;
 import org.apache.cassandra.utils.FBUtilities;
+import org.assertj.core.api.Assertions;
 import org.awaitility.Awaitility;
 import org.jboss.byteman.contrib.bmunit.BMRule;
 import org.jboss.byteman.contrib.bmunit.BMRules;
@@ -67,7 +65,6 @@
     /** Latch used by {@link #testTruncateWhileBuilding()} Byteman injections. */
     @SuppressWarnings("unused")
     private static final CountDownLatch blockViewBuild = new CountDownLatch(1);
-    private static final AtomicInteger viewNameSeqNumber = new AtomicInteger();
 
     @Test
     public void testNonExistingOnes() throws Throwable
@@ -89,37 +86,37 @@
                     "val text, " +
                     "PRIMARY KEY(k,c))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         try
         {
-            createView("mv_static", "CREATE MATERIALIZED VIEW %%s AS SELECT * FROM %s WHERE sval IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (sval,k,c)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE sval IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (sval,k,c)");
             Assert.fail("Use of static column in a MV primary key should fail");
         }
-        catch (InvalidQueryException e)
+        catch (Exception e)
         {
+            Assert.assertTrue(e.getCause() instanceof InvalidRequestException);
         }
 
         try
         {
-            createView("mv_static", "CREATE MATERIALIZED VIEW %%s AS SELECT val, sval FROM %s WHERE val IS NOT NULL AND  k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val, k, c)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT val, sval FROM %s WHERE val IS NOT NULL AND  k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val, k, c)");
             Assert.fail("Explicit select of static column in MV should fail");
         }
-        catch (InvalidQueryException e)
+        catch (Exception e)
         {
+            Assert.assertTrue(e.getCause() instanceof InvalidRequestException);
         }
 
         try
         {
-            createView("mv_static", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
             Assert.fail("Implicit select of static column in MV should fail");
         }
-        catch (InvalidQueryException e)
+        catch (Exception e)
         {
+            Assert.assertTrue(e.getCause() instanceof InvalidRequestException);
         }
 
-        createView("mv_static", "CREATE MATERIALIZED VIEW %s AS SELECT val,k,c FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT val,k,c FROM %s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
 
         for (int i = 0; i < 100; i++)
             updateView("INSERT into %s (k,c,sval,val)VALUES(?,?,?,?)", 0, i % 2, "bar" + i, "baz");
@@ -128,9 +125,9 @@
 
         assertRows(execute("SELECT sval from %s"), row("bar99"), row("bar99"));
 
-        Assert.assertEquals(2, execute("select * from mv_static").size());
+        Assert.assertEquals(2, executeView("select * from %s").size());
 
-        assertInvalid("SELECT sval from mv_static");
+        assertInvalid("SELECT sval from " + currentView());
     }
 
 
@@ -143,73 +140,66 @@
                     "val text, " +
                     "PRIMARY KEY(k,c))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv_tstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
 
         for (int i = 0; i < 100; i++)
             updateView("INSERT into %s (k,c,val)VALUES(?,?,?)", 0, i % 2, "baz");
 
-        Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush();
+        Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         Assert.assertEquals(2, execute("select * from %s").size());
-        Assert.assertEquals(2, execute("select * from mv_tstest").size());
+        Assert.assertEquals(2, executeView("select * from %s").size());
 
         assertRows(execute("SELECT val from %s where k = 0 and c = 0"), row("baz"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "baz"), row(0), row(1));
 
         //Make sure an old TS does nothing
         updateView("UPDATE %s USING TIMESTAMP 100 SET val = ? where k = ? AND c = ?", "bar", 0, 0);
         assertRows(execute("SELECT val from %s where k = 0 and c = 0"), row("baz"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(0), row(1));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "baz"), row(0), row(1));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "bar"));
 
         //Latest TS
         updateView("UPDATE %s SET val = ? where k = ? AND c = ?", "bar", 0, 0);
         assertRows(execute("SELECT val from %s where k = 0 and c = 0"), row("bar"));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "bar"), row(0));
-        assertRows(execute("SELECT c from mv_tstest where k = 0 and val = ?", "baz"), row(1));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "bar"), row(0));
+        assertRows(executeView("SELECT c from %s where k = 0 and val = ?", "baz"), row(1));
     }
 
     @Test
-    public void testCountersTable() throws Throwable
+    public void testCountersTable()
     {
         createTable("CREATE TABLE %s (" +
                     "k int PRIMARY KEY, " +
                     "count counter)");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         try
         {
-            createView("mv_counter", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE count IS NOT NULL AND k IS NOT NULL PRIMARY KEY (count,k)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE count IS NOT NULL AND k IS NOT NULL PRIMARY KEY (count,k)");
             Assert.fail("MV on counter should fail");
         }
-        catch (InvalidQueryException e)
+        catch (Exception e)
         {
+            Assert.assertTrue(e.getCause() instanceof InvalidRequestException);
         }
     }
 
     @Test
-    public void testDurationsTable() throws Throwable
+    public void testDurationsTable()
     {
         createTable("CREATE TABLE %s (" +
                     "k int PRIMARY KEY, " +
                     "result duration)");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         try
         {
-            createView("mv_duration", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE result IS NOT NULL AND k IS NOT NULL PRIMARY KEY (result,k)");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE result IS NOT NULL AND k IS NOT NULL PRIMARY KEY (result,k)");
             Assert.fail("MV on duration should fail");
         }
-        catch (InvalidQueryException e)
+        catch (Exception e)
         {
-            Assert.assertEquals("duration type is not supported for PRIMARY KEY column 'result'", e.getMessage());
+            Throwable cause = e.getCause();
+            Assert.assertEquals("duration type is not supported for PRIMARY KEY column 'result'", cause.getMessage());
         }
     }
 
@@ -222,21 +212,13 @@
                     "intval int, " +
                     "PRIMARY KEY (k, c))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-
-        for(int i = 0; i < 1024; i++)
+        for (int i = 0; i < 1024; i++)
             execute("INSERT INTO %s (k, c, intval) VALUES (?, ?, ?)", 0, i, 0);
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, c, k)");
-
-
-        while (!SystemKeyspace.isViewBuilt(keyspace(), "mv"))
-            Thread.sleep(1000);
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE k IS NOT NULL AND c IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, c, k)");
 
         assertRows(execute("SELECT count(*) from %s WHERE k = ?", 0), row(1024L));
-        assertRows(execute("SELECT count(*) from mv WHERE intval = ?", 0), row(1024L));
+        assertRows(executeView("SELECT count(*) from %s WHERE intval = ?", 0), row(1024L));
     }
 
     @Test
@@ -248,19 +230,16 @@
                     "listval list<int>, " +
                     "PRIMARY KEY (k))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
 
         updateView("INSERT INTO %s (k, intval, listval) VALUES (?, ?, fromJson(?))", 0, 0, "[1, 2, 3]");
         assertRows(execute("SELECT k, listval FROM %s WHERE k = ?", 0), row(0, list(1, 2, 3)));
-        assertRows(execute("SELECT k, listval from mv WHERE intval = ?", 0), row(0, list(1, 2, 3)));
+        assertRows(executeView("SELECT k, listval from %s WHERE intval = ?", 0), row(0, list(1, 2, 3)));
 
         updateView("INSERT INTO %s (k, intval) VALUES (?, ?)", 1, 1);
         updateView("INSERT INTO %s (k, listval) VALUES (?, fromJson(?))", 1, "[1, 2, 3]");
         assertRows(execute("SELECT k, listval FROM %s WHERE k = ?", 1), row(1, list(1, 2, 3)));
-        assertRows(execute("SELECT k, listval from mv WHERE intval = ?", 1), row(1, list(1, 2, 3)));
+        assertRows(executeView("SELECT k, listval from %s WHERE intval = ?", 1), row(1, list(1, 2, 3)));
     }
 
     @Test
@@ -268,11 +247,7 @@
     {
         createTable("CREATE TABLE %s (k int, intval int,  listval frozen<list<tuple<text,text>>>, PRIMARY KEY (k))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND listval IS NOT NULL PRIMARY KEY (k, listval)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE k IS NOT NULL AND listval IS NOT NULL PRIMARY KEY (k, listval)");
 
         updateView("INSERT INTO %s (k, intval, listval) VALUES (?, ?, fromJson(?))",
                    0,
@@ -282,7 +257,7 @@
         // verify input
         assertRows(execute("SELECT k, listval FROM %s WHERE k = ?", 0),
                    row(0, list(tuple("a", "1"), tuple("b", "2"), tuple("c", "3"))));
-        assertRows(execute("SELECT k, listval from mv"),
+        assertRows(executeView("SELECT k, listval from %s"),
                    row(0, list(tuple("a", "1"), tuple("b", "2"), tuple("c", "3"))));
 
         // update listval with the same value and it will be compared in view generator
@@ -292,7 +267,7 @@
         // verify result
         assertRows(execute("SELECT k, listval FROM %s WHERE k = ?", 0),
                    row(0, list(tuple("a", "1"), tuple("b", "2"), tuple("c", "3"))));
-        assertRows(execute("SELECT k, listval from mv"),
+        assertRows(executeView("SELECT k, listval from %s"),
                    row(0, list(tuple("a", "1"), tuple("b", "2"), tuple("c", "3"))));
     }
 
@@ -304,18 +279,15 @@
                     "intval int, " +
                     "PRIMARY KEY (k))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE k IS NOT NULL AND intval IS NOT NULL PRIMARY KEY (intval, k)");
 
         updateView("INSERT INTO %s (k, intval) VALUES (?, ?)", 0, 0);
         assertRows(execute("SELECT k, intval FROM %s WHERE k = ?", 0), row(0, 0));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 0), row(0, 0));
+        assertRows(executeView("SELECT k, intval from %s WHERE intval = ?", 0), row(0, 0));
 
         updateView("INSERT INTO %s (k, intval) VALUES (?, ?)", 0, 1);
         assertRows(execute("SELECT k, intval FROM %s WHERE k = ?", 0), row(0, 1));
-        assertRows(execute("SELECT k, intval from mv WHERE intval = ?", 1), row(0, 1));
+        assertRows(executeView("SELECT k, intval from %s WHERE intval = ?", 1), row(0, 1));
     }
 
     @Test
@@ -330,32 +302,29 @@
                     "d int, " +
                     "PRIMARY KEY (a, b))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT a, b, c FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b, c FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
-        assertRows(execute("SELECT a, b, c from mv WHERE b = ?", 0), row(0, 0, 0));
+        assertRows(executeView("SELECT a, b, c from %s WHERE b = ?", 0), row(0, 0, 0));
 
         updateView("UPDATE %s SET d = ? WHERE a = ? AND b = ?", 0, 0, 0);
-        assertRows(execute("SELECT a, b, c from mv WHERE b = ?", 0), row(0, 0, 0));
+        assertRows(executeView("SELECT a, b, c from %s WHERE b = ?", 0), row(0, 0, 0));
 
         // Note: errors here may result in the test hanging when the memtables are flushed as part of the table drop,
         // because empty rows in the memtable will cause the flush to fail.  This will result in a test timeout that
         // should not be ignored.
         String table = KEYSPACE + "." + currentTable();
         updateView("BEGIN BATCH " +
-                "INSERT INTO " + table + " (a, b, c, d) VALUES (?, ?, ?, ?); " + // should be accepted
-                "UPDATE " + table + " SET d = ? WHERE a = ? AND b = ?; " +  // should be accepted
-                "APPLY BATCH",
-                0, 0, 0, 0,
-                1, 0, 1);
-        assertRows(execute("SELECT a, b, c from mv WHERE b = ?", 0), row(0, 0, 0));
-        assertRows(execute("SELECT a, b, c from mv WHERE b = ?", 1), row(0, 1, null));
+                   "INSERT INTO " + table + " (a, b, c, d) VALUES (?, ?, ?, ?); " + // should be accepted
+                   "UPDATE " + table + " SET d = ? WHERE a = ? AND b = ?; " +  // should be accepted
+                   "APPLY BATCH",
+                   0, 0, 0, 0,
+                   1, 0, 1);
+        assertRows(executeView("SELECT a, b, c from %s WHERE b = ?", 0), row(0, 0, 0));
+        assertRows(executeView("SELECT a, b, c from %s WHERE b = ?", 1), row(0, 1, null));
 
-        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore("mv");
-        cfs.forceBlockingFlush();
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentView());
+        Util.flush(cfs);
         Assert.assertEquals(1, cfs.getLiveSSTables().size());
     }
 
@@ -371,12 +340,12 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
 
         String table = keyspace() + "." + currentTable();
         updateView("DELETE FROM " + table + " USING TIMESTAMP 6 WHERE a = 1 AND b = 1;");
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) USING TIMESTAMP 3", 1, 1, 1, 1);
-        Assert.assertEquals(0, executeNet("SELECT * FROM mv WHERE c = 1 AND a = 1 AND b = 1").all().size());
+        Assert.assertEquals(0, executeViewNet("SELECT * FROM %s WHERE c = 1 AND a = 1 AND b = 1").all().size());
     }
 
     @Test
@@ -389,13 +358,13 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 1);
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 2);
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 1, 3);
 
-        ResultSet mvRows = executeNet("SELECT a, b FROM mv1");
+        ResultSet mvRows = executeViewNet("SELECT a, b FROM %s");
         assertRowsNet(mvRows, row(1, 1), row(1, 2), row(1, 3));
 
         updateView(String.format("BEGIN UNLOGGED BATCH " +
@@ -403,7 +372,7 @@
                                  "DELETE FROM %s WHERE a = 1;" +
                                  "APPLY BATCH", currentTable(), currentTable()));
 
-        mvRows = executeNet("SELECT a, b FROM mv1");
+        mvRows = executeViewNet("SELECT a, b FROM %s");
         assertRowsNet(mvRows);
     }
 
@@ -417,18 +386,18 @@
                     "PRIMARY KEY (a))");
 
         executeNet("USE " + keyspace());
-        createView("mvmap", "CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT a, b FROM %s WHERE a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (b, a)");
 
         updateView("INSERT INTO %s (a, b) VALUES (?, ?)", 0, 0);
-        ResultSet mvRows = executeNet("SELECT a, b FROM mvmap WHERE b = ?", 0);
+        ResultSet mvRows = executeViewNet("SELECT a, b FROM %s WHERE b = ?", 0);
         assertRowsNet(mvRows, row(0, 0));
 
         updateView("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 1, map(1, "1"));
-        mvRows = executeNet("SELECT a, b FROM mvmap WHERE b = ?", 1);
+        mvRows = executeViewNet("SELECT a, b FROM %s WHERE b = ?", 1);
         assertRowsNet(mvRows, row(1, 1));
 
         updateView("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, map(0, "0"));
-        mvRows = executeNet("SELECT a, b FROM mvmap WHERE b = ?", 0);
+        mvRows = executeViewNet("SELECT a, b FROM %s WHERE b = ?", 0);
         assertRowsNet(mvRows, row(0, 0));
     }
 
@@ -439,17 +408,16 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv",
-                   "CREATE MATERIALIZED VIEW %s AS" +
+        createView("CREATE MATERIALIZED VIEW %s AS" +
                    "  SELECT \"keyspace\", \"token\"" +
-                   "  FROM %%s" +
+                   "  FROM %s" +
                    "  WHERE \"keyspace\" IS NOT NULL AND \"token\" IS NOT NULL" +
                    "  PRIMARY KEY (\"keyspace\", \"token\")");
 
         execute("INSERT INTO %s (\"token\", \"keyspace\") VALUES (?, ?)", 0, 1);
 
         assertRowsNet(executeNet("SELECT * FROM %s"), row(0, 1));
-        assertRowsNet(executeNet("SELECT * FROM mv"), row(1, 0));
+        assertRowsNet(executeViewNet("SELECT * FROM %s"), row(1, 0));
     }
 
     private void testViewBuilderResume(int concurrentViewBuilders) throws Throwable
@@ -460,9 +428,6 @@
                     "val text, " +
                     "PRIMARY KEY(k,c))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         CompactionManager.instance.setConcurrentViewBuilders(concurrentViewBuilders);
         CompactionManager.instance.setCoreCompactorThreads(1);
         CompactionManager.instance.setMaximumCompactorThreads(1);
@@ -470,43 +435,41 @@
         cfs.disableAutoCompaction();
 
         for (int i = 0; i < 1024; i++)
-            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, ""+i);
+            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, String.valueOf(i));
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         for (int i = 0; i < 1024; i++)
-            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, ""+i);
+            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, String.valueOf(i));
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         for (int i = 0; i < 1024; i++)
-            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, ""+i);
+            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, String.valueOf(i));
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         for (int i = 0; i < 1024; i++)
-            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, ""+i);
+            execute("INSERT into %s (k,c,val)VALUES(?,?,?)", i, i, String.valueOf(i));
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
-        String viewName1 = "mv_test_" + concurrentViewBuilders;
-        createView(viewName1, "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
+        String mv1 = createViewAsync("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                     "WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
 
         cfs.enableAutoCompaction();
-        List<Future<?>> futures = CompactionManager.instance.submitBackground(cfs);
+        List<? extends Future<?>> futures = CompactionManager.instance.submitBackground(cfs);
 
-        String viewName2 = viewName1 + "_2";
         //Force a second MV on the same base table, which will restart the first MV builder...
-        createView(viewName2, "CREATE MATERIALIZED VIEW %s AS SELECT val, k, c FROM %%s WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
-
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT val, k, c FROM %s " +
+                   "WHERE val IS NOT NULL AND k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (val,k,c)");
 
         //Compact the base table
         FBUtilities.waitOnFutures(futures);
 
-        while (!SystemKeyspace.isViewBuilt(keyspace(), viewName1))
-            Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
+        waitForViewBuild(mv1);
 
-        assertRows(execute("SELECT count(*) FROM " + viewName1), row(1024L));
+        assertRows(executeView("SELECT count(*) FROM %s"), row(1024L));
     }
 
     @Test
@@ -522,15 +485,13 @@
      * Tests that a client warning is issued on materialized view creation.
      */
     @Test
-    public void testClientWarningOnCreate() throws Throwable
+    public void testClientWarningOnCreate()
     {
         createTable("CREATE TABLE %s (k int PRIMARY KEY, v int)");
 
         ClientWarn.instance.captureWarnings();
-        String viewName = keyspace() + ".warning_view";
-        execute("CREATE MATERIALIZED VIEW " + viewName +
-                " AS SELECT * FROM %s WHERE k IS NOT NULL AND v IS NOT NULL PRIMARY KEY (v, k)");
-        views.add(viewName);
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE k IS NOT NULL AND v IS NOT NULL PRIMARY KEY (v, k)");
         List<String> warnings = ClientWarn.instance.getWarnings();
 
         Assert.assertNotNull(warnings);
@@ -548,21 +509,22 @@
 
         executeNet("USE " + keyspace());
 
-        boolean enableMaterializedViews = DatabaseDescriptor.getEnableMaterializedViews();
+        boolean enableMaterializedViews = DatabaseDescriptor.getMaterializedViewsEnabled();
         try
         {
-            DatabaseDescriptor.setEnableMaterializedViews(false);
-            createView("view1", "CREATE MATERIALIZED VIEW %s AS SELECT v FROM %%s WHERE k IS NOT NULL AND v IS NOT NULL PRIMARY KEY (v, k)");
+            DatabaseDescriptor.setMaterializedViewsEnabled(false);
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT v FROM %s WHERE k IS NOT NULL AND v IS NOT NULL PRIMARY KEY (v, k)");
             Assert.fail("Should not be able to create a materialized view if they are disabled");
         }
-        catch (Throwable e)
+        catch (RuntimeException e)
         {
-            Assert.assertTrue(e instanceof InvalidQueryException);
-            Assert.assertTrue(e.getMessage().contains("Materialized views are disabled"));
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(InvalidRequestException.class);
+            Assertions.assertThat(cause.getMessage()).contains("Materialized views are disabled");
         }
         finally
         {
-            DatabaseDescriptor.setEnableMaterializedViews(enableMaterializedViews);
+            DatabaseDescriptor.setMaterializedViewsEnabled(enableMaterializedViews);
         }
     }
 
@@ -573,8 +535,8 @@
 
         executeNet("USE " + keyspace());
 
-        createView("view1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE \"theKey\" IS NOT NULL AND \"theClustering_1\" IS NOT NULL AND \"theClustering_2\" IS NOT NULL AND \"theValue\" IS NOT NULL  PRIMARY KEY (\"theKey\", \"theClustering_1\", \"theClustering_2\");");
-        createView("view2", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE \"theKey\" IS NOT NULL AND (\"theClustering_1\", \"theClustering_2\") = (1, 2) AND \"theValue\" IS NOT NULL  PRIMARY KEY (\"theKey\", \"theClustering_1\", \"theClustering_2\");");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE \"theKey\" IS NOT NULL AND \"theClustering_1\" IS NOT NULL AND \"theClustering_2\" IS NOT NULL AND \"theValue\" IS NOT NULL  PRIMARY KEY (\"theKey\", \"theClustering_1\", \"theClustering_2\");");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE \"theKey\" IS NOT NULL AND (\"theClustering_1\", \"theClustering_2\") = (1, 2) AND \"theValue\" IS NOT NULL  PRIMARY KEY (\"theKey\", \"theClustering_1\", \"theClustering_2\");");
 
         assertRows(execute("SELECT where_clause FROM system_schema.views"),
                    row("\"theKey\" IS NOT NULL AND \"theClustering_1\" IS NOT NULL AND \"theClustering_2\" IS NOT NULL AND \"theValue\" IS NOT NULL"),
@@ -600,7 +562,7 @@
         assertEmpty(testFunctionInWhereClause("CREATE TABLE %s (k bigint PRIMARY KEY, v int)",
                                               null,
                                               "CREATE MATERIALIZED VIEW %s AS" +
-                                              "   SELECT * FROM %%s WHERE k = token(1) AND v IS NOT NULL " +
+                                              "   SELECT * FROM %s WHERE k = token(1) AND v IS NOT NULL " +
                                               "   PRIMARY KEY (v, k)",
                                               "k = token(1) AND v IS NOT NULL",
                                               "INSERT INTO %s(k, v) VALUES (0, 1)",
@@ -610,7 +572,7 @@
         assertEmpty(testFunctionInWhereClause("CREATE TABLE %s (k bigint PRIMARY KEY, v int)",
                                               null,
                                               "CREATE MATERIALIZED VIEW %s AS" +
-                                              "   SELECT * FROM %%s WHERE k = TOKEN(1) AND v IS NOT NULL" +
+                                              "   SELECT * FROM %s WHERE k = TOKEN(1) AND v IS NOT NULL" +
                                               "   PRIMARY KEY (v, k)",
                                               "k = token(1) AND v IS NOT NULL",
                                               "INSERT INTO %s(k, v) VALUES (0, 1)",
@@ -623,7 +585,7 @@
                                              "   RETURNS int LANGUAGE java" +
                                              "   AS 'return 2;'",
                                              "CREATE MATERIALIZED VIEW %s AS " +
-                                             "   SELECT * FROM %%s WHERE k = fun() AND v IS NOT NULL" +
+                                             "   SELECT * FROM %s WHERE k = fun() AND v IS NOT NULL" +
                                              "   PRIMARY KEY (v, k)",
                                              "k = fun() AND v IS NOT NULL",
                                              "INSERT INTO %s(k, v) VALUES (0, 1)",
@@ -637,7 +599,7 @@
                                              "   LANGUAGE java" +
                                              "   AS 'return 2;'",
                                              "CREATE MATERIALIZED VIEW %s AS " +
-                                             "   SELECT * FROM %%s WHERE k = \"FUN\"() AND v IS NOT NULL" +
+                                             "   SELECT * FROM %s WHERE k = \"FUN\"() AND v IS NOT NULL" +
                                              "   PRIMARY KEY (v, k)",
                                              "k = \"FUN\"() AND v IS NOT NULL",
                                              "INSERT INTO %s(k, v) VALUES (0, 1)",
@@ -652,7 +614,7 @@
                                              "   LANGUAGE java" +
                                              "   AS 'return x;'",
                                              "CREATE MATERIALIZED VIEW %s AS" +
-                                             "   SELECT * FROM %%s WHERE k = \"TOKEN\"(2) AND v IS NOT NULL" +
+                                             "   SELECT * FROM %s WHERE k = \"TOKEN\"(2) AND v IS NOT NULL" +
                                              "   PRIMARY KEY (v, k)",
                                              "k = \"TOKEN\"(2) AND v IS NOT NULL",
                                              "INSERT INTO %s(k, v) VALUES (0, 1)",
@@ -667,7 +629,7 @@
                                              "   LANGUAGE java" +
                                              "   AS 'return x;'",
                                              "CREATE MATERIALIZED VIEW %s AS" +
-                                             "   SELECT * FROM %%s " +
+                                             "   SELECT * FROM %s " +
                                              "   WHERE k = " + keyspace() + ".\"token\"(2) AND v IS NOT NULL" +
                                              "   PRIMARY KEY (v, k)",
                                              "k = " + keyspace() + ".\"token\"(2) AND v IS NOT NULL",
@@ -678,7 +640,7 @@
     /**
      * Tests that truncating a table stops the ongoing builds of its materialized views,
      * so they don't write into the MV data that has been truncated in the base table.
-     *
+     * <p>
      * See CASSANDRA-16567 for further details.
      */
     @Test
@@ -696,33 +658,30 @@
     public void testTruncateWhileBuilding() throws Throwable
     {
         createTable("CREATE TABLE %s (k int, c int, v int, PRIMARY KEY(k, c))");
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
         execute("INSERT INTO %s (k, c, v) VALUES (?, ?, ?)", 0, 0, 0);
-        createView("mv",
-                   "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
-                   "WHERE k IS NOT NULL AND c IS NOT NULL AND v IS NOT NULL " +
-                   "PRIMARY KEY (v, c, k)");
+        createViewAsync("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                        "WHERE k IS NOT NULL AND c IS NOT NULL AND v IS NOT NULL " +
+                        "PRIMARY KEY (v, c, k)");
 
         // check that the delayed view builder tasks are either running or pending,
         // and that they haven't written anything yet
         assertThat(runningViewBuilds()).isPositive();
-        assertFalse(SystemKeyspace.isViewBuilt(KEYSPACE, "mv"));
+        assertFalse(SystemKeyspace.isViewBuilt(KEYSPACE, currentView()));
         waitForViewMutations();
-        assertRows(execute("SELECT * FROM mv"));
+        assertRows(executeView("SELECT * FROM %s"));
 
         // truncate the view, this should unblock the view builders, wait for their cancellation,
         // drop the sstables and, finally, start a new view build
         updateView("TRUNCATE %s");
 
         // check that there aren't any rows after truncating
-        assertRows(execute("SELECT * FROM mv"));
+        assertRows(executeView("SELECT * FROM %s"));
 
         // check that the view builder tasks finish and that the view is still empty after that
         Awaitility.await().untilAsserted(() -> assertEquals(0, runningViewBuilds()));
-        assertTrue(SystemKeyspace.isViewBuilt(KEYSPACE, "mv"));
+        assertTrue(SystemKeyspace.isViewBuilt(KEYSPACE, currentView()));
         waitForViewMutations();
-        assertRows(execute("SELECT * FROM mv"));
+        assertRows(executeView("SELECT * FROM %s"));
     }
 
     private static int runningViewBuilds()
@@ -740,28 +699,24 @@
     {
         createTable(createTableQuery);
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         if (createFunctionQuery != null)
         {
             execute(createFunctionQuery);
         }
 
-        String viewName = "view_" + viewNameSeqNumber.getAndIncrement();
-        createView(viewName, createViewQuery);
+        createView(createViewQuery);
 
         // Test the where clause stored in system_schema.views
         String schemaQuery = String.format("SELECT where_clause FROM %s.%s WHERE keyspace_name = ? AND view_name = ?",
                                            SchemaConstants.SCHEMA_KEYSPACE_NAME,
                                            SchemaKeyspaceTables.VIEWS);
-        assertRows(execute(schemaQuery, keyspace(), viewName), row(expectedSchemaWhereClause));
+        assertRows(execute(schemaQuery, keyspace(), currentView()), row(expectedSchemaWhereClause));
 
         for (String insert : insertQueries)
         {
             execute(insert);
         }
 
-        return execute("SELECT * FROM " + viewName);
+        return executeView("SELECT * FROM %s");
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/ViewTimesTest.java b/test/unit/org/apache/cassandra/cql3/ViewTimesTest.java
index 6d37501..9c45936 100644
--- a/test/unit/org/apache/cassandra/cql3/ViewTimesTest.java
+++ b/test/unit/org/apache/cassandra/cql3/ViewTimesTest.java
@@ -26,8 +26,10 @@
 
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.assertj.core.api.Assertions;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
@@ -51,15 +53,14 @@
                     "c int, " +
                     "val int)");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
-        createView("mv_rctstest", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE k IS NOT NULL AND c IS NOT NULL " +
+                   "PRIMARY KEY (k,c)");
 
         updateView("UPDATE %s SET c = ?, val = ? WHERE k = ?", 0, 0, 0);
         updateView("UPDATE %s SET val = ? WHERE k = ?", 1, 0);
         updateView("UPDATE %s SET c = ? WHERE k = ?", 1, 0);
-        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(1, 0, 1));
+        assertRows(executeView("SELECT c, k, val FROM %s"), row(1, 0, 1));
 
         updateView("TRUNCATE %s");
 
@@ -69,8 +70,8 @@
         updateView("UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE k = ?", 2, 0);
         updateView("UPDATE %s USING TIMESTAMP 3 SET val = ? WHERE k = ?", 2, 0);
 
-        assertRows(execute("SELECT c, k, val FROM mv_rctstest"), row(2, 0, 2));
-        assertRows(execute("SELECT c, k, val FROM mv_rctstest limit 1"), row(2, 0, 2));
+        assertRows(executeView("SELECT c, k, val FROM %s"), row(2, 0, 2));
+        assertRows(executeView("SELECT c, k, val FROM %s limit 1"), row(2, 0, 2));
     }
 
     @Test
@@ -89,34 +90,34 @@
     {
         createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, PRIMARY KEY (a, b))");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
         Keyspace ks = Keyspace.open(keyspace());
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL PRIMARY KEY (c, a, b)");
-        ks.getColumnFamilyStore("mv").disableAutoCompaction();
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                   "WHERE a IS NOT NULL AND b IS NOT NULL AND c IS NOT NULL " +
+                   "PRIMARY KEY (c, a, b)");
+        ks.getColumnFamilyStore(currentView()).disableAutoCompaction();
 
         //Set initial values TS=0, leaving e null and verify view
         executeNet("INSERT INTO %s (a, b, c, d) VALUES (0, 0, 1, 0) USING TIMESTAMP 0");
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
+        assertRows(executeView("SELECT d from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
 
         //update c's timestamp TS=2
         executeNet("UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
+        assertRows(executeView("SELECT d from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0));
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         // change c's value and TS=3, tombstones c=1 and adds c=0 record
         executeNet("UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? and b = ? ", 0, 0, 0);
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0));
+            Util.flush(ks);
+        assertRows(executeView("SELECT d from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0));
 
         if(flush)
         {
-            ks.getColumnFamilyStore("mv").forceMajorCompaction();
-            FBUtilities.waitOnFutures(ks.flush());
+            ks.getColumnFamilyStore(currentView()).forceMajorCompaction();
+            Util.flush(ks);
         }
 
 
@@ -124,43 +125,41 @@
         executeNet("UPDATE %s USING TIMESTAMP 4 SET c = ? WHERE a = ? and b = ? ", 1, 0, 0);
         if (flush)
         {
-            ks.getColumnFamilyStore("mv").forceMajorCompaction();
-            FBUtilities.waitOnFutures(ks.flush());
+            ks.getColumnFamilyStore(currentView()).forceMajorCompaction();
+            Util.flush(ks);
         }
 
-        assertRows(execute("SELECT d,e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, null));
-
+        assertRows(executeView("SELECT d,e from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, null));
 
         //Add e value @ TS=1
         executeNet("UPDATE %s USING TIMESTAMP 1 SET e = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d,e from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, 1));
+        assertRows(executeView("SELECT d,e from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(0, 1));
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
 
         //Change d value @ TS=2
         executeNet("UPDATE %s USING TIMESTAMP 2 SET d = ? WHERE a = ? and b = ? ", 2, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(2));
+        assertRows(executeView("SELECT d from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(2));
 
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
-
+            Util.flush(ks);
 
         //Change d value @ TS=3
         executeNet("UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? and b = ? ", 1, 0, 0);
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(1));
+        assertRows(executeView("SELECT d from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row(1));
 
 
         //Tombstone c
         executeNet("DELETE FROM %s WHERE a = ? and b = ?", 0, 0);
-        assertRows(execute("SELECT d from mv"));
+        assertRows(executeView("SELECT d from %s"));
 
         //Add back without D
         executeNet("INSERT INTO %s (a, b, c) VALUES (0, 0, 1)");
 
         //Make sure D doesn't pop back in.
-        assertRows(execute("SELECT d from mv WHERE c = ? and a = ? and b = ?", 1, 0, 0), row((Object) null));
+        assertRows(executeView("SELECT d from %s WHERE c = ? and a = ? and b = ?", 1, 0, 0), row((Object) null));
 
 
         //New partition
@@ -172,20 +171,17 @@
 
         // delete with timestamp 0 (which should only delete d)
         executeNet("DELETE FROM %s USING TIMESTAMP 0 WHERE a = ? AND b = ?", 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 0, 1, 0),
-                   row(1, 0, 0, null, 0)
-        );
+        assertRows(executeView("SELECT a, b, c, d, e from %s WHERE c = ? and a = ? and b = ?", 0, 1, 0),
+                   row(1, 0, 0, null, 0));
 
         executeNet("UPDATE %s USING TIMESTAMP 2 SET c = ? WHERE a = ? AND b = ?", 1, 1, 0);
         executeNet("UPDATE %s USING TIMESTAMP 3 SET c = ? WHERE a = ? AND b = ?", 0, 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 0, 1, 0),
-                   row(1, 0, 0, null, 0)
-        );
+        assertRows(executeView("SELECT a, b, c, d, e from %s WHERE c = ? and a = ? and b = ?", 0, 1, 0),
+                   row(1, 0, 0, null, 0));
 
         executeNet("UPDATE %s USING TIMESTAMP 3 SET d = ? WHERE a = ? AND b = ?", 0, 1, 0);
-        assertRows(execute("SELECT a, b, c, d, e from mv WHERE c = ? and a = ? and b = ?", 0, 1, 0),
-                   row(1, 0, 0, 0, 0)
-        );
+        assertRows(executeView("SELECT a, b, c, d, e from %s WHERE c = ? and a = ? and b = ?", 0, 1, 0),
+                   row(1, 0, 0, 0, 0));
     }
 
     @Test
@@ -200,7 +196,7 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
 
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) USING TTL 3", 1, 1, 1, 1);
 
@@ -208,8 +204,8 @@
         updateView("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, 1, 2);
 
         Thread.sleep(TimeUnit.SECONDS.toMillis(5));
-        List<Row> results = executeNet("SELECT d FROM mv WHERE c = 2 AND a = 1 AND b = 1").all();
-        assertEquals(1, results.size());
+        List<Row> results = executeViewNet("SELECT d FROM %s WHERE c = 2 AND a = 1 AND b = 1").all();
+        Assert.assertEquals(1, results.size());
         Assert.assertTrue("There should be a null result given back due to ttl expiry", results.get(0).isNull(0));
     }
 
@@ -225,12 +221,12 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
 
         updateView("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) USING TTL 3", 1, 1, 1, 1);
 
         Thread.sleep(TimeUnit.SECONDS.toMillis(4));
-        assertEquals(0, executeNet("SELECT * FROM mv WHERE c = 1 AND a = 1 AND b = 1").all().size());
+        Assert.assertEquals(0, executeViewNet("SELECT * FROM %s WHERE c = 1 AND a = 1 AND b = 1").all().size());
     }
 
     @Test
@@ -244,14 +240,14 @@
 
         executeNet("USE " + keyspace());
 
-        createView("mv", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE c IS NOT NULL AND a IS NOT NULL AND b IS NOT NULL PRIMARY KEY (c, a, b)");
 
         for (int i = 0; i < 50; i++)
         {
             updateView("INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP 1", 1, 1, i);
         }
 
-        ResultSet mvRows = executeNet("SELECT c FROM mv");
+        ResultSet mvRows = executeViewNet("SELECT c FROM %s");
         List<Row> rows = executeNet("SELECT c FROM %s").all();
         assertEquals("There should be exactly one row in base", 1, rows.size());
         int expected = rows.get(0).getInt("c");
@@ -259,27 +255,25 @@
     }
 
     @Test
-    public void testCreateMvWithTTL() throws Throwable
+    public void testCreateMvWithTTL()
     {
         createTable("CREATE TABLE %s (" +
                     "k int PRIMARY KEY, " +
                     "c int, " +
                     "val int) WITH default_time_to_live = 60");
 
-        execute("USE " + keyspace());
-        executeNet("USE " + keyspace());
-
         // Must NOT include "default_time_to_live" for Materialized View creation
         try
         {
-            createView("mv_ttl1", "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c) WITH default_time_to_live = 30");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                       "WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c) WITH default_time_to_live = 30");
             fail("Should fail if TTL is provided for materialized view");
         }
-        catch (Exception e)
+        catch (RuntimeException e)
         {
-            assertEquals("Cannot set default_time_to_live for a materialized view. Data in a materialized " +
-                         "view always expire at the same time than the corresponding data in the parent table.",
-                         e.getMessage());
+            Throwable cause = e.getCause();
+            Assertions.assertThat(cause).isInstanceOf(InvalidRequestException.class);
+            Assertions.assertThat(cause.getMessage()).contains("Cannot set default_time_to_live for a materialized view");
         }
     }
 
@@ -291,12 +285,12 @@
                     "c int, " +
                     "val int) WITH default_time_to_live = 60");
 
-        createView("mv_ttl2", "CREATE MATERIALIZED VIEW " + keyspace() + ".%s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
 
         // Must NOT include "default_time_to_live" on alter Materialized View
         try
         {
-            executeNet("ALTER MATERIALIZED VIEW " + keyspace() + ".mv_ttl2 WITH default_time_to_live = 30");
+            executeNet("ALTER MATERIALIZED VIEW " + currentView() + " WITH default_time_to_live = 30");
             fail("Should fail if TTL is provided while altering materialized view");
         }
         catch (Exception e)
@@ -309,7 +303,7 @@
     }
 
     @Test
-    public void testMvWithZeroTTL() throws Throwable
+    public void testMvWithZeroTTL()
     {
         createTable("CREATE TABLE %s (" +
                     "k int PRIMARY KEY, " +
@@ -318,7 +312,7 @@
 
         try
         {
-            createView("mv_ttl3", "CREATE MATERIALIZED VIEW " + keyspace() + ".%s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c) WITH default_time_to_live = 0");
+            createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c) WITH default_time_to_live = 0");
         }
         catch (Exception e)
         {
@@ -334,11 +328,11 @@
                     "c int, " +
                     "val int) WITH default_time_to_live = 60");
 
-        createView("mv_ttl4", "CREATE MATERIALIZED VIEW " + keyspace() + ".%s AS SELECT * FROM %%s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
+        createView("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s WHERE k IS NOT NULL AND c IS NOT NULL PRIMARY KEY (k,c)");
 
         try
         {
-            executeNet("ALTER MATERIALIZED VIEW " + keyspace() + ".mv_ttl4 WITH default_time_to_live = 0");
+            executeNet("ALTER MATERIALIZED VIEW " + currentView() + " WITH default_time_to_live = 0");
         }
         catch (Exception e)
         {
diff --git a/test/unit/org/apache/cassandra/cql3/conditions/ColumnConditionTest.java b/test/unit/org/apache/cassandra/cql3/conditions/ColumnConditionTest.java
index f62119d..dd40cf8 100644
--- a/test/unit/org/apache/cassandra/cql3/conditions/ColumnConditionTest.java
+++ b/test/unit/org/apache/cassandra/cql3/conditions/ColumnConditionTest.java
@@ -32,9 +32,8 @@
 import org.apache.cassandra.db.rows.*;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.schema.ColumnMetadata;
-import org.apache.cassandra.serializers.TimeUUIDSerializer;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -65,8 +64,8 @@
         {
             for (int i = 0, m = values.size(); i < m; i++)
             {
-                UUID uuid = UUIDGen.getTimeUUID(now, i);
-                ByteBuffer key = TimeUUIDSerializer.instance.serialize(uuid);
+                TimeUUID uuid = TimeUUID.Generator.atUnixMillis(now, i);
+                ByteBuffer key = uuid.toBytes();
                 ByteBuffer value = values.get(i);
                 BufferCell cell = new BufferCell(definition,
                                                  0L,
@@ -136,6 +135,22 @@
         return bound.appliesTo(newRow(definition, rowValue));
     }
 
+    private static boolean conditionContainsApplies(List<ByteBuffer> rowValue, Operator op, ByteBuffer conditionValue)
+    {
+        ColumnMetadata definition = ColumnMetadata.regularColumn("ks", "cf", "c", ListType.getInstance(Int32Type.instance, true));
+        ColumnCondition condition = ColumnCondition.condition(definition, op, Terms.of(new Constants.Value(conditionValue)));
+        ColumnCondition.Bound bound = condition.bind(QueryOptions.DEFAULT);
+        return bound.appliesTo(newRow(definition, rowValue));
+    }
+
+    private static boolean conditionContainsApplies(Map<ByteBuffer, ByteBuffer> rowValue, Operator op, ByteBuffer conditionValue)
+    {
+        ColumnMetadata definition = ColumnMetadata.regularColumn("ks", "cf", "c", MapType.getInstance(Int32Type.instance, Int32Type.instance, true));
+        ColumnCondition condition = ColumnCondition.condition(definition, op, Terms.of(new Constants.Value(conditionValue)));
+        ColumnCondition.Bound bound = condition.bind(QueryOptions.DEFAULT);
+        return bound.appliesTo(newRow(definition, rowValue));
+    }
+
     private static boolean conditionApplies(SortedSet<ByteBuffer> rowValue, Operator op, SortedSet<ByteBuffer> conditionValue)
     {
         ColumnMetadata definition = ColumnMetadata.regularColumn("ks", "cf", "c", SetType.getInstance(Int32Type.instance, true));
@@ -144,7 +159,15 @@
         return bound.appliesTo(newRow(definition, rowValue));
     }
 
-    private static boolean conditionApplies(Map<ByteBuffer, ByteBuffer> rowValue, Operator op, SortedMap<ByteBuffer, ByteBuffer> conditionValue)
+    private static boolean conditionContainsApplies(SortedSet<ByteBuffer> rowValue, Operator op, ByteBuffer conditionValue)
+    {
+        ColumnMetadata definition = ColumnMetadata.regularColumn("ks", "cf", "c", SetType.getInstance(Int32Type.instance, true));
+        ColumnCondition condition = ColumnCondition.condition(definition, op, Terms.of(new Constants.Value(conditionValue)));
+        ColumnCondition.Bound bound = condition.bind(QueryOptions.DEFAULT);
+        return bound.appliesTo(newRow(definition, rowValue));
+    }
+
+    private static boolean conditionApplies(SortedMap<ByteBuffer, ByteBuffer> rowValue, Operator op, SortedMap<ByteBuffer, ByteBuffer> conditionValue)
     {
         ColumnMetadata definition = ColumnMetadata.regularColumn("ks", "cf", "c", MapType.getInstance(Int32Type.instance, Int32Type.instance, true));
         ColumnCondition condition = ColumnCondition.condition(definition, op, Terms.of(new Maps.Value(conditionValue)));
@@ -328,6 +351,14 @@
         assertTrue(conditionApplies(list(ONE), GTE, list(ByteBufferUtil.EMPTY_BYTE_BUFFER)));
         assertFalse(conditionApplies(list(ByteBufferUtil.EMPTY_BYTE_BUFFER), GTE, list(ONE)));
         assertTrue(conditionApplies(list(ByteBufferUtil.EMPTY_BYTE_BUFFER), GTE, list(ByteBufferUtil.EMPTY_BYTE_BUFFER)));
+
+        //CONTAINS
+        assertTrue(conditionContainsApplies(list(ZERO, ONE, TWO), CONTAINS, ONE));
+        assertFalse(conditionContainsApplies(list(ZERO, ONE), CONTAINS, TWO));
+
+        assertFalse(conditionContainsApplies(list(ZERO, ONE, TWO), CONTAINS, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+        assertFalse(conditionContainsApplies(list(ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS, ONE));
+        assertTrue(conditionContainsApplies(list(ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS, ByteBufferUtil.EMPTY_BYTE_BUFFER));
     }
 
     private static SortedSet<ByteBuffer> set(ByteBuffer... values)
@@ -423,6 +454,14 @@
         assertTrue(conditionApplies(set(ONE), GTE, set(ByteBufferUtil.EMPTY_BYTE_BUFFER)));
         assertFalse(conditionApplies(set(ByteBufferUtil.EMPTY_BYTE_BUFFER), GTE, set(ONE)));
         assertTrue(conditionApplies(set(ByteBufferUtil.EMPTY_BYTE_BUFFER), GTE, set(ByteBufferUtil.EMPTY_BYTE_BUFFER)));
+
+        // CONTAINS
+        assertTrue(conditionContainsApplies(set(ZERO, ONE, TWO), CONTAINS, ONE));
+        assertFalse(conditionContainsApplies(set(ZERO, ONE), CONTAINS, TWO));
+
+        assertFalse(conditionContainsApplies(set(ZERO, ONE, TWO), CONTAINS, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+        assertFalse(conditionContainsApplies(set(ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS, ONE));
+        assertTrue(conditionContainsApplies(set(ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS, ByteBufferUtil.EMPTY_BYTE_BUFFER));
     }
 
     // values should be a list of key, value, key, value, ...
@@ -551,5 +590,26 @@
         assertFalse(conditionApplies(map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER), GTE, map(ONE, ONE)));
         assertTrue(conditionApplies(map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE), GTE, map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE)));
         assertTrue(conditionApplies(map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER), GTE, map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER)));
+
+        //CONTAINS
+        assertTrue(conditionContainsApplies(map(ZERO, ONE), CONTAINS, ONE));
+        assertFalse(conditionContainsApplies(map(ZERO, ONE), CONTAINS, ZERO));
+
+        assertFalse(conditionContainsApplies(map(ONE, ONE), CONTAINS, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+        assertTrue(conditionContainsApplies(map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE), CONTAINS, ONE));
+        assertFalse(conditionContainsApplies(map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE), CONTAINS, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+        assertFalse(conditionContainsApplies(map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS, ONE));
+        assertTrue(conditionContainsApplies(map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+
+        //CONTAINS KEY
+        assertTrue(conditionContainsApplies(map(ZERO, ONE), CONTAINS_KEY, ZERO));
+        assertFalse(conditionContainsApplies(map(ZERO, ONE), CONTAINS_KEY, ONE));
+
+        assertFalse(conditionContainsApplies(map(ONE, ONE), CONTAINS_KEY, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+        assertFalse(conditionContainsApplies(map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE), CONTAINS_KEY, ONE));
+        assertTrue(conditionContainsApplies(map(ByteBufferUtil.EMPTY_BYTE_BUFFER, ONE), CONTAINS_KEY, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+        assertTrue(conditionContainsApplies(map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS_KEY, ONE));
+        assertFalse(conditionContainsApplies(map(ONE, ByteBufferUtil.EMPTY_BYTE_BUFFER), CONTAINS_KEY, ByteBufferUtil.EMPTY_BYTE_BUFFER));
+
     }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/functions/CastFctsTest.java b/test/unit/org/apache/cassandra/cql3/functions/CastFctsTest.java
index ee6c69f..6efbdc0 100644
--- a/test/unit/org/apache/cassandra/cql3/functions/CastFctsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/functions/CastFctsTest.java
@@ -23,12 +23,12 @@
 import java.time.LocalTime;
 import java.time.ZoneOffset;
 import java.time.ZonedDateTime;
-import java.time.format.DateTimeFormatter;
 import java.util.Date;
 
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.serializers.SimpleDateSerializer;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.TimeUUID;
 
 import org.junit.Test;
 
@@ -39,24 +39,6 @@
     {
         createTable("CREATE TABLE %s (a int primary key, b text, c double)");
 
-        assertInvalidSyntaxMessage("no viable alternative at input '(' (... b, c) VALUES ([CAST](...)",
-                                   "INSERT INTO %s (a, b, c) VALUES (CAST(? AS int), ?, ?)", 1.6, "test", 6.3);
-
-        assertInvalidSyntaxMessage("no viable alternative at input '(' (..." + KEYSPACE + "." + currentTable()
-                + " SET c = [cast](...)",
-                                   "UPDATE %s SET c = cast(? as double) WHERE a = ?", 1, 1);
-
-        assertInvalidSyntaxMessage("no viable alternative at input '(' (...= ? WHERE a = [CAST] (...)",
-                                   "UPDATE %s SET c = ? WHERE a = CAST (? AS INT)", 1, 2.0);
-
-        assertInvalidSyntaxMessage("no viable alternative at input '(' (..." + KEYSPACE + "." + currentTable()
-                + " WHERE a = [CAST] (...)",
-                                   "DELETE FROM %s WHERE a = CAST (? AS INT)", 1, 2.0);
-
-        assertInvalidSyntaxMessage("no viable alternative at input '(' (..." + KEYSPACE + "." + currentTable()
-                + " WHERE a = [CAST] (...)",
-                                   "SELECT * FROM %s WHERE a = CAST (? AS INT)", 1, 2.0);
-
         assertInvalidMessage("a cannot be cast to boolean", "SELECT CAST(a AS boolean) FROM %s");
     }
 
@@ -229,7 +211,7 @@
         long timeInMillis = dateTime.toInstant().toEpochMilli();
 
         execute("INSERT INTO %s (a, b, c, d) VALUES (?, '" + yearMonthDay + " 11:03:02+00', '2015-05-21', '11:03:02')",
-                UUIDGen.getTimeUUID(timeInMillis));
+                TimeUUID.Generator.atUnixMillis(timeInMillis));
 
         assertRows(execute("SELECT CAST(a AS timestamp), " +
                            "CAST(b AS timestamp), " +
@@ -322,4 +304,256 @@
                 "CAST(b AS text) FROM %s"),
                    row((byte) 2, (short) 2, 2, 2L, 2.0F, 2.0, BigDecimal.valueOf(2), "2", "2"));
     }
+
+    /**
+     * Verifies that the {@code CAST} function can be used in the values of {@code INSERT INTO} statements.
+     */
+    @Test
+    public void testCastsInInsertIntoValues() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v int)");
+
+        // Simple cast
+        execute("INSERT INTO %s (k, v) VALUES (1, CAST(1.3 AS int))");
+        assertRows(execute("SELECT v FROM %s"), row(1));
+
+        // Nested casts
+        execute("INSERT INTO %s (k, v) VALUES (1, CAST(CAST(CAST(2.3 AS int) AS float) AS int))");
+        assertRows(execute("SELECT v FROM %s"), row(2));
+
+        // Cast of placeholder with type hint
+        execute("INSERT INTO %s (k, v) VALUES (1, CAST((float) ? AS int))", 3.4f);
+        assertRows(execute("SELECT v FROM %s"), row(3));
+
+        // Cast of placeholder without type hint
+        assertInvalidRequestMessage("Ambiguous call to function system.castAsInt",
+                                    "INSERT INTO %s (k, v) VALUES (1, CAST(? AS int))", 3.4f);
+
+        // Type hint of cast
+        execute("INSERT INTO %s (k, v) VALUES (1, (int) CAST(4.9 AS int))");
+        assertRows(execute("SELECT v FROM %s"), row(4));
+
+        // Function of cast
+        execute(String.format("INSERT INTO %%s (k, v) VALUES (1, %s(CAST(5 AS float)))", floatToInt()));
+        assertRows(execute("SELECT v FROM %s"), row(5));
+
+        // Cast of function
+        execute(String.format("INSERT INTO %%s (k, v) VALUES (1, CAST(%s(6) AS int))", intToFloat()));
+        assertRows(execute("SELECT v FROM %s"), row(6));
+    }
+
+    /**
+     * Verifies that the {@code CAST} function can be used in the values of {@code UPDATE} statements.
+     */
+    @Test
+    public void testCastsInUpdateValues() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v int)");
+
+        // Simple cast
+        execute("UPDATE %s SET v = CAST(1.3 AS int) WHERE k = 1");
+        assertRows(execute("SELECT v FROM %s"), row(1));
+
+        // Nested casts
+        execute("UPDATE %s SET v = CAST(CAST(CAST(2.3 AS int) AS float) AS int) WHERE k = 1");
+        assertRows(execute("SELECT v FROM %s"), row(2));
+
+        // Cast of placeholder with type hint
+        execute("UPDATE %s SET v = CAST((float) ? AS int) WHERE k = 1", 3.4f);
+        assertRows(execute("SELECT v FROM %s"), row(3));
+
+        // Cast of placeholder without type hint
+        assertInvalidRequestMessage("Ambiguous call to function system.castAsInt",
+                                    "UPDATE %s SET v = CAST(? AS int) WHERE k = 1", 3.4f);
+
+        // Type hint of cast
+        execute("UPDATE %s SET v = (int) CAST(4.9 AS int) WHERE k = 1");
+        assertRows(execute("SELECT v FROM %s"), row(4));
+
+        // Function of cast
+        execute(String.format("UPDATE %%s SET v = %s(CAST(5 AS float)) WHERE k = 1", floatToInt()));
+        assertRows(execute("SELECT v FROM %s"), row(5));
+
+        // Cast of function
+        execute(String.format("UPDATE %%s SET v = CAST(%s(6) AS int) WHERE k = 1", intToFloat()));
+        assertRows(execute("SELECT v FROM %s"), row(6));
+    }
+
+    /**
+     * Verifies that the {@code CAST} function can be used in the {@code WHERE} clause of {@code UPDATE} statements.
+     */
+    @Test
+    public void testCastsInUpdateWhereClause() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v int)");
+
+        for (int i = 1; i <= 6; i++)
+        {
+            execute("INSERT INTO %s (k) VALUES (?)", i);
+        }
+
+        // Simple cast
+        execute("UPDATE %s SET v = ? WHERE k = CAST(1.3 AS int)", 1);
+        assertRows(execute("SELECT v FROM %s WHERE k = ?", 1), row(1));
+
+        // Nested casts
+        execute("UPDATE %s SET v = ? WHERE k = CAST(CAST(CAST(2.3 AS int) AS float) AS int)", 2);
+        assertRows(execute("SELECT v FROM %s WHERE k = ?", 2), row(2));
+
+        // Cast of placeholder with type hint
+        execute("UPDATE %s SET v = ? WHERE k = CAST((float) ? AS int)", 3, 3.4f);
+        assertRows(execute("SELECT v FROM %s WHERE k = ?", 3), row(3));
+
+        // Cast of placeholder without type hint
+        assertInvalidRequestMessage("Ambiguous call to function system.castAsInt",
+                                    "UPDATE %s SET v = ? WHERE k = CAST(? AS int)", 3, 3.4f);
+
+        // Type hint of cast
+        execute("UPDATE %s SET v = ? WHERE k = (int) CAST(4.9 AS int)", 4);
+        assertRows(execute("SELECT v FROM %s WHERE k = ?", 4), row(4));
+
+        // Function of cast
+        execute(String.format("UPDATE %%s SET v = ? WHERE k = %s(CAST(5 AS float))", floatToInt()), 5);
+        assertRows(execute("SELECT v FROM %s WHERE k = ?", 5), row(5));
+
+        // Cast of function
+        execute(String.format("UPDATE %%s SET v = ? WHERE k = CAST(%s(6) AS int)", intToFloat()), 6);
+        assertRows(execute("SELECT v FROM %s WHERE k = ?", 6), row(6));
+    }
+
+    /**
+     * Verifies that the {@code CAST} function can be used in the {@code WHERE} clause of {@code SELECT} statements.
+     */
+    @Test
+    public void testCastsInSelectWhereClause() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY)");
+
+        for (int i = 1; i <= 6; i++)
+        {
+            execute("INSERT INTO %s (k) VALUES (?)", i);
+        }
+
+        // Simple cast
+        assertRows(execute("SELECT k FROM %s WHERE k = CAST(1.3 AS int)"), row(1));
+
+        // Nested casts
+        assertRows(execute("SELECT k FROM %s WHERE k = CAST(CAST(CAST(2.3 AS int) AS float) AS int)"), row(2));
+
+        // Cast of placeholder with type hint
+        assertRows(execute("SELECT k FROM %s WHERE k = CAST((float) ? AS int)", 3.4f), row(3));
+
+        // Cast of placeholder without type hint
+        assertInvalidRequestMessage("Ambiguous call to function system.castAsInt",
+                                    "SELECT k FROM %s WHERE k = CAST(? AS int)", 3.4f);
+
+        // Type hint of cast
+        assertRows(execute("SELECT k FROM %s WHERE k = (int) CAST(4.9 AS int)"), row(4));
+
+        // Function of cast
+        assertRows(execute(String.format("SELECT k FROM %%s WHERE k = %s(CAST(5 AS float))", floatToInt())), row(5));
+
+        // Cast of function
+        assertRows(execute(String.format("SELECT k FROM %%s WHERE k = CAST(%s(6) AS int)", intToFloat())), row(6));
+    }
+
+    /**
+     * Verifies that the {@code CAST} function can be used in the {@code WHERE} clause of {@code DELETE} statements.
+     */
+    @Test
+    public void testCastsInDeleteWhereClause() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY)");
+
+        for (int i = 1; i <= 6; i++)
+        {
+            execute("INSERT INTO %s (k) VALUES (?)", i);
+        }
+
+        // Simple cast
+        execute("DELETE FROM %s WHERE k = CAST(1.3 AS int)");
+        assertEmpty(execute("SELECT * FROM %s WHERE k = ?", 1));
+
+        // Nested casts
+        execute("DELETE FROM %s WHERE k = CAST(CAST(CAST(2.3 AS int) AS float) AS int)");
+        assertEmpty(execute("SELECT * FROM %s WHERE k = ?", 2));
+
+        // Cast of placeholder with type hint
+        execute("DELETE FROM %s WHERE k = CAST((float) ? AS int)", 3.4f);
+        assertEmpty(execute("SELECT * FROM %s WHERE k = ?", 3));
+
+        // Cast of placeholder without type hint
+        assertInvalidRequestMessage("Ambiguous call to function system.castAsInt",
+                                    "DELETE FROM %s WHERE k = CAST(? AS int)", 3.4f);
+
+        // Type hint of cast
+        execute("DELETE FROM %s WHERE k = (int) CAST(4.9 AS int)");
+        assertEmpty(execute("SELECT * FROM %s WHERE k = ?", 4));
+
+        // Function of cast
+        execute(String.format("DELETE FROM %%s WHERE k = %s(CAST(5 AS float))", floatToInt()));
+        assertEmpty(execute("SELECT * FROM %s WHERE k = ?", 5));
+
+        // Cast of function
+        execute(String.format("DELETE FROM %%s WHERE k = CAST(%s(6) AS int)", intToFloat()));
+        assertEmpty(execute("SELECT * FROM %s WHERE k = ?", 6));
+    }
+
+    /**
+     * Creates a CQL function that casts an {@code int} argument into a {@code float}.
+     *
+     * @return the name of the created function
+     */
+    private String floatToInt() throws Throwable
+    {
+        return createFunction(KEYSPACE,
+                              "int, int",
+                              "CREATE FUNCTION IF NOT EXISTS %s (x float) " +
+                              "CALLED ON NULL INPUT " +
+                              "RETURNS int " +
+                              "LANGUAGE java " +
+                              "AS 'return Float.valueOf(x).intValue();'");
+    }
+
+    /**
+     * Creates a CQL function that casts a {@code float} argument into an {@code int}.
+     *
+     * @return the name of the created function
+     */
+    private String intToFloat() throws Throwable
+    {
+        return createFunction(KEYSPACE,
+                              "int, int",
+                              "CREATE FUNCTION IF NOT EXISTS %s (x int) " +
+                              "CALLED ON NULL INPUT " +
+                              "RETURNS float " +
+                              "LANGUAGE java " +
+                              "AS 'return (float) x;'");
+    }
+
+    /**
+     * Verifies that the {@code CAST} function can be used in the {@code WHERE} clause of {@code CREATE MATERIALIZED
+     * VIEW} statements.
+     */
+    @Test
+    public void testCastsInCreateViewWhereClause() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v int)");
+
+        String viewName = keyspace() + ".mv_with_cast";
+        execute(String.format("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s" +
+                              "   WHERE k < CAST(3.14 AS int) AND v IS NOT NULL" +
+                              "   PRIMARY KEY (v, k)", viewName));
+
+        // start storage service so MV writes are applied
+        StorageService.instance.initServer();
+
+        execute("INSERT INTO %s (k, v) VALUES (1, 10)");
+        execute("INSERT INTO %s (k, v) VALUES (2, 20)");
+        execute("INSERT INTO %s (k, v) VALUES (3, 30)");
+
+        assertRows(execute(String.format("SELECT * FROM %s", viewName)), row(10, 1), row(20, 2));
+
+        execute("DROP MATERIALIZED VIEW " + viewName);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java b/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java
index 1648a55..c46f6a9 100644
--- a/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/functions/OperationFctsTest.java
@@ -33,6 +33,20 @@
 
 public class OperationFctsTest extends CQLTester
 {
+
+    @Test
+    public void testStringConcatenation() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a text, b ascii, c text, PRIMARY KEY(a, b, c))");
+        execute("INSERT INTO %S (a, b, c) VALUES ('जॉन', 'Doe', 'जॉन Doe')");
+
+        assertColumnNames(execute("SELECT a + a, a + b, b + a, b + b FROM %s WHERE a = 'जॉन' AND b = 'Doe' AND c = 'जॉन Doe'"),
+                "a + a", "a + b", "b + a", "b + b");
+
+        assertRows(execute("SELECT a + ' ' + a, a + ' ' + b, b + ' ' + a, b + ' ' + b FROM %s WHERE a = 'जॉन' AND b = 'Doe' AND c = 'जॉन Doe'"),
+                row("जॉन जॉन", "जॉन Doe", "Doe जॉन", "Doe Doe"));
+    }
+
     @Test
     public void testSingleOperations() throws Throwable
     {
diff --git a/test/unit/org/apache/cassandra/cql3/functions/TimeFctsTest.java b/test/unit/org/apache/cassandra/cql3/functions/TimeFctsTest.java
index b0a4bb9..a124e60 100644
--- a/test/unit/org/apache/cassandra/cql3/functions/TimeFctsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/functions/TimeFctsTest.java
@@ -32,9 +32,10 @@
 import org.apache.cassandra.db.marshal.TimestampType;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.cql3.functions.TimeFcts.*;
+import static org.apache.cassandra.utils.TimeUUID.Generator.atUnixMillisAsBytes;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
@@ -56,7 +57,16 @@
         long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
         ByteBuffer input = TimestampType.instance.fromString(DATE_TIME_STRING + "+00");
         ByteBuffer output = executeFunction(TimeFcts.minTimeuuidFct, input);
-        assertEquals(UUIDGen.minTimeUUID(timeInMillis), TimeUUIDType.instance.compose(output));
+        assertEquals(TimeUUID.minAtUnixMillis(timeInMillis), TimeUUIDType.instance.compose(output));
+    }
+
+    @Test
+    public void testMinTimeUuidFromBigInt()
+    {
+        long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
+        ByteBuffer input = LongType.instance.decompose(timeInMillis);
+        ByteBuffer output = executeFunction(TimeFcts.minTimeuuidFct, input);
+        assertEquals(TimeUUID.minAtUnixMillis(timeInMillis), TimeUUIDType.instance.compose(output));
     }
 
     @Test
@@ -65,7 +75,16 @@
         long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
         ByteBuffer input = TimestampType.instance.fromString(DATE_TIME_STRING + "+00");
         ByteBuffer output = executeFunction(TimeFcts.maxTimeuuidFct, input);
-        assertEquals(UUIDGen.maxTimeUUID(timeInMillis), TimeUUIDType.instance.compose(output));
+        assertEquals(TimeUUID.maxAtUnixMillis(timeInMillis), TimeUUIDType.instance.compose(output));
+    }
+
+    @Test
+    public void testMaxTimeUuidFromBigInt()
+    {
+        long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
+        ByteBuffer input = LongType.instance.decompose(timeInMillis);
+        ByteBuffer output = executeFunction(TimeFcts.maxTimeuuidFct, input);
+        assertEquals(TimeUUID.maxAtUnixMillis(timeInMillis), TimeUUIDType.instance.compose(output));
     }
 
     @Test
@@ -73,7 +92,7 @@
     {
 
         long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
-        ByteBuffer input = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(timeInMillis, 0));
+        ByteBuffer input = ByteBuffer.wrap(atUnixMillisAsBytes(timeInMillis, 0));
         ByteBuffer output = executeFunction(TimeFcts.dateOfFct, input);
         assertEquals(Date.from(DATE_TIME.toInstant()), TimestampType.instance.compose(output));
     }
@@ -82,7 +101,7 @@
     public void testTimeUuidToTimestamp()
     {
         long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
-        ByteBuffer input = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(timeInMillis, 0));
+        ByteBuffer input = ByteBuffer.wrap(atUnixMillisAsBytes(timeInMillis, 0));
         ByteBuffer output = executeFunction(toTimestamp(TimeUUIDType.instance), input);
         assertEquals(Date.from(DATE_TIME.toInstant()), TimestampType.instance.compose(output));
     }
@@ -91,7 +110,7 @@
     public void testUnixTimestampOfFct()
     {
         long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
-        ByteBuffer input = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(timeInMillis, 0));
+        ByteBuffer input = ByteBuffer.wrap(atUnixMillisAsBytes(timeInMillis, 0));
         ByteBuffer output = executeFunction(TimeFcts.unixTimestampOfFct, input);
         assertEquals(timeInMillis, LongType.instance.compose(output).longValue());
     }
@@ -100,7 +119,7 @@
     public void testTimeUuidToUnixTimestamp()
     {
         long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
-        ByteBuffer input = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(timeInMillis, 0));
+        ByteBuffer input = ByteBuffer.wrap(atUnixMillisAsBytes(timeInMillis, 0));
         ByteBuffer output = executeFunction(toUnixTimestamp(TimeUUIDType.instance), input);
         assertEquals(timeInMillis, LongType.instance.compose(output).longValue());
     }
@@ -109,7 +128,7 @@
     public void testTimeUuidToDate()
     {
         long timeInMillis = DATE_TIME.toInstant().toEpochMilli();
-        ByteBuffer input = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes(timeInMillis, 0));
+        ByteBuffer input = ByteBuffer.wrap(atUnixMillisAsBytes(timeInMillis, 0));
         ByteBuffer output = executeFunction(toDate(TimeUUIDType.instance), input);
 
         long expectedTime = DATE.toInstant().toEpochMilli();
@@ -142,6 +161,16 @@
     }
 
     @Test
+    public void testBigIntegerToDate()
+    {
+        long millis = DATE.toInstant().toEpochMilli();
+
+        ByteBuffer input = LongType.instance.decompose(millis);
+        ByteBuffer output = executeFunction(toDate(TimestampType.instance), input);
+        assertEquals(DATE.toInstant().toEpochMilli(), SimpleDateType.instance.toTimeInMillis(output));
+    }
+
+    @Test
     public void testTimestampToDateWithEmptyInput()
     {
         ByteBuffer output = executeFunction(toDate(TimestampType.instance), ByteBufferUtil.EMPTY_BYTE_BUFFER);
@@ -157,6 +186,16 @@
     }
 
     @Test
+    public void testBigIntegerToTimestamp()
+    {
+        long millis = DATE_TIME.toInstant().toEpochMilli();
+
+        ByteBuffer input = LongType.instance.decompose(millis);
+        ByteBuffer output = executeFunction(toTimestamp(TimestampType.instance), input);
+        assertEquals(DATE_TIME.toInstant().toEpochMilli(), LongType.instance.compose(output).longValue());
+    }
+
+    @Test
     public void testTimestampToUnixTimestampWithEmptyInput()
     {
         ByteBuffer output = executeFunction(TimeFcts.toUnixTimestamp(TimestampType.instance), ByteBufferUtil.EMPTY_BYTE_BUFFER);
diff --git a/test/unit/org/apache/cassandra/cql3/selection/SelectorSerializationTest.java b/test/unit/org/apache/cassandra/cql3/selection/SelectorSerializationTest.java
new file mode 100644
index 0000000..ee4dd35
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/selection/SelectorSerializationTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.cql3.selection;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.*;
+import org.apache.cassandra.cql3.Constants.Literal;
+import org.apache.cassandra.cql3.functions.AggregateFcts;
+import org.apache.cassandra.cql3.functions.Function;
+import org.apache.cassandra.cql3.functions.TimeFcts;
+import org.apache.cassandra.cql3.selection.Selectable.RawIdentifier;
+import org.apache.cassandra.cql3.selection.Selector.Serializer;
+import org.apache.cassandra.db.marshal.*;
+import org.apache.cassandra.io.util.DataInputBuffer;
+import org.apache.cassandra.io.util.DataOutputBuffer;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.Pair;
+
+import static java.util.Arrays.asList;
+
+import static org.junit.Assert.assertEquals;
+
+public class SelectorSerializationTest extends CQLTester
+{
+    @Test
+    public void testSerDes() throws IOException
+    {
+        createTable("CREATE TABLE %s (pk int, c1 int, c2 timestamp, v int, PRIMARY KEY(pk, c1, c2))");
+
+        KeyspaceMetadata keyspace = Schema.instance.getKeyspaceMetadata(KEYSPACE);
+        TableMetadata table = keyspace.getTableOrViewNullable(currentTable());
+
+        // Test SimpleSelector serialization
+        checkSerialization(table.getColumn(new ColumnIdentifier("c1", false)), table);
+
+        // Test WritetimeOrTTLSelector serialization
+        checkSerialization(new Selectable.WritetimeOrTTL(table.getColumn(new ColumnIdentifier("v", false)), true), table);
+        checkSerialization(new Selectable.WritetimeOrTTL(table.getColumn(new ColumnIdentifier("v", false)), false), table);
+
+        // Test ListSelector serialization
+        checkSerialization(new Selectable.WithList(asList(table.getColumn(new ColumnIdentifier("v", false)),
+                                                          table.getColumn(new ColumnIdentifier("c1", false)))), table);
+
+        // Test SetSelector serialization
+        checkSerialization(new Selectable.WithSet(asList(table.getColumn(new ColumnIdentifier("v", false)),
+                                                         table.getColumn(new ColumnIdentifier("c1", false)))), table);
+
+        // Test MapSelector serialization
+        Pair<Selectable.Raw, Selectable.Raw> pair = Pair.create(RawIdentifier.forUnquoted("v"),
+                                                                RawIdentifier.forUnquoted("c1"));
+        checkSerialization(new Selectable.WithMapOrUdt(table, asList(pair)), table, MapType.getInstance(Int32Type.instance, Int32Type.instance, false));
+
+        // Test TupleSelector serialization
+        checkSerialization(new Selectable.BetweenParenthesesOrWithTuple(asList(table.getColumn(new ColumnIdentifier("c2", false)),
+                                                                               table.getColumn(new ColumnIdentifier("c1", false)))), table);
+        // Test TermSelector serialization
+        checkSerialization(new Selectable.WithTerm(Literal.duration("5m")), table, DurationType.instance);
+
+        // Test UserTypeSelector serialization
+        String typeName = createType("CREATE TYPE %s (f1 int, f2 int)");
+
+        UserType type = new UserType(KEYSPACE, ByteBufferUtil.bytes(typeName),
+                                     asList(FieldIdentifier.forUnquoted("f1"),
+                                            FieldIdentifier.forUnquoted("f2")),
+                                     asList(Int32Type.instance,
+                                            Int32Type.instance),
+                                     false);
+
+        List<Pair<Selectable.Raw, Selectable.Raw>> list = asList(Pair.create(RawIdentifier.forUnquoted("f1"),
+                                                                             RawIdentifier.forUnquoted("c1")),
+                                                                 Pair.create(RawIdentifier.forUnquoted("f2"),
+                                                                             RawIdentifier.forUnquoted("pk")));
+
+        checkSerialization(new Selectable.WithMapOrUdt(table, list), table, type);
+
+        // Test FieldSelector serialization
+        checkSerialization(new Selectable.WithFieldSelection(new Selectable.WithTypeHint(typeName, type, new Selectable.WithMapOrUdt(table, list)), FieldIdentifier.forUnquoted("f1")), table, type);
+
+        // Test AggregateFunctionSelector serialization
+        Function max = AggregateFcts.makeMaxFunction(Int32Type.instance);
+        checkSerialization(new Selectable.WithFunction(max, asList(table.getColumn(new ColumnIdentifier("v", false)))), table);
+
+        // Test SCalarFunctionSelector serialization
+        Function toDate = TimeFcts.toDate(TimestampType.instance);
+        checkSerialization(new Selectable.WithFunction(toDate, asList(table.getColumn(new ColumnIdentifier("c2", false)))), table);
+
+        Function floor = TimeFcts.FloorTimestampFunction.newInstanceWithStartTimeArgument();
+        checkSerialization(new Selectable.WithFunction(floor, asList(table.getColumn(new ColumnIdentifier("c2", false)),
+                                                                     new Selectable.WithTerm(Literal.duration("5m")),
+                                                                     new Selectable.WithTerm(Literal.string("2016-09-27 16:00:00 UTC")))), table);
+    }
+
+    private static void checkSerialization(Selectable selectable, TableMetadata table) throws IOException
+    {
+        checkSerialization(selectable, table, null);
+    }
+
+    private static void checkSerialization(Selectable selectable, TableMetadata table, AbstractType<?> expectedType) throws IOException
+    {
+        int version = MessagingService.current_version;
+
+        Serializer serializer = Selector.serializer;
+        Selector.Factory factory = selectable.newSelectorFactory(table, expectedType, new ArrayList<>(), VariableSpecifications.empty());
+        Selector selector = factory.newInstance(QueryOptions.DEFAULT);
+        int size = serializer.serializedSize(selector, version);
+        DataOutputBuffer out = new DataOutputBuffer(size);
+        serializer.serialize(selector, out, version);
+        ByteBuffer buffer = out.asNewBuffer();
+        DataInputBuffer in = new DataInputBuffer(buffer, false);
+        Selector deserialized = serializer.deserialize(in, version, table);
+
+        assertEquals(selector, deserialized);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/statements/DescribeStatementTest.java b/test/unit/org/apache/cassandra/cql3/statements/DescribeStatementTest.java
index 940e7b6..52bb3c3 100644
--- a/test/unit/org/apache/cassandra/cql3/statements/DescribeStatementTest.java
+++ b/test/unit/org/apache/cassandra/cql3/statements/DescribeStatementTest.java
@@ -975,6 +975,7 @@
                "    AND comment = ''\n" +
                "    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}\n" +
                "    AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}\n" +
+               "    AND memtable = 'default'\n" +
                "    AND crc_check_chance = 1.0\n" +
                "    AND default_time_to_live = 0\n" +
                "    AND extensions = {}\n" +
@@ -995,6 +996,7 @@
                "    AND comment = ''\n" +
                "    AND compaction = {'class': 'org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4'}\n" +
                "    AND compression = {'chunk_length_in_kb': '16', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor'}\n" +
+               "    AND memtable = 'default'\n" +
                "    AND crc_check_chance = 1.0\n" +
                "    AND extensions = {}\n" +
                "    AND gc_grace_seconds = 864000\n" +
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
index bec2ccd..fedb4e5 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/CollectionsTest.java
@@ -32,6 +32,7 @@
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 
 public class CollectionsTest extends CQLTester
@@ -696,7 +697,7 @@
     public void testMapWithLargePartition() throws Throwable
     {
         Random r = new Random();
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         System.out.println("Seed " + seed);
         r.setSeed(seed);
 
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
index e28e0cb..810ee5a 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/JsonTest.java
@@ -40,6 +40,7 @@
 import java.util.*;
 import java.util.concurrent.*;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -49,8 +50,8 @@
     @BeforeClass
     public static void setUpClass()
     {
-        if (ROW_CACHE_SIZE_IN_MB > 0)
-            DatabaseDescriptor.setRowCacheSizeInMB(ROW_CACHE_SIZE_IN_MB);
+        if (ROW_CACHE_SIZE_IN_MIB > 0)
+            DatabaseDescriptor.setRowCacheSizeInMiB(ROW_CACHE_SIZE_IN_MIB);
 
         StorageService.instance.setPartitionerUnsafe(ByteOrderedPartitioner.instance);
 
@@ -1329,7 +1330,7 @@
         for (int i = 0; i < numRows; i++)
             execute("INSERT INTO %s (k, v) VALUES (?, ?)", "" + i, "" + i);
 
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         System.out.println("Seed " + seed);
         final Random rand = new Random(seed);
 
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexOnStaticColumnTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexOnStaticColumnTest.java
index f69d8d5..1d10eab 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexOnStaticColumnTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexOnStaticColumnTest.java
@@ -214,4 +214,4 @@
         assertEmpty(execute("SELECT id, company FROM %s WHERE home = " + addressString));
         assertRows(execute("SELECT id, company FROM %s WHERE home = " + newAddressString), row(1, companyName));
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
index ff7f18b..34b805d 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/SecondaryIndexTest.java
@@ -59,6 +59,7 @@
 import static org.apache.cassandra.Util.throwAssert;
 import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -114,7 +115,7 @@
                              "CREATE INDEX " + indexName + " ON %s(b)");
 
         // IF NOT EXISTS should apply in cases where the new index differs from an existing one in name only
-        String otherIndexName = "index_" + System.nanoTime();
+        String otherIndexName = "index_" + nanoTime();
         assertEquals(1, getCurrentColumnFamilyStore().metadata().indexes.size());
         createIndex("CREATE INDEX IF NOT EXISTS " + otherIndexName + " ON %s(b)");
         assertEquals(1, getCurrentColumnFamilyStore().metadata().indexes.size());
@@ -611,7 +612,7 @@
     /**
      * Test for CASSANDRA-5732, Can not query secondary index
      * migrated from cql_tests.py:TestCQL.bug_5732_test(),
-     * which was executing with a row cache size of 100 MB
+     * which was executing with a row cache size of 100 MiB
      * and restarting the node, here we just cleanup the cache.
      */
     @Test
@@ -671,14 +672,14 @@
         long batchSizeThreshold = DatabaseDescriptor.getBatchSizeFailThreshold();
         try
         {
-            DatabaseDescriptor.setBatchSizeFailThresholdInKB( (TOO_BIG / 1024) * 2);
+            DatabaseDescriptor.setBatchSizeFailThresholdInKiB((TOO_BIG / 1024) * 2);
             succeedInsert("BEGIN BATCH\n" +
                           "INSERT INTO %s (a, b, c) VALUES (1, 1, ?) IF NOT EXISTS;\n" +
                           "APPLY BATCH", ByteBuffer.allocate(TOO_BIG));
         }
         finally
         {
-            DatabaseDescriptor.setBatchSizeFailThresholdInKB((int) (batchSizeThreshold / 1024));
+            DatabaseDescriptor.setBatchSizeFailThresholdInKiB((int) (batchSizeThreshold / 1024));
         }
     }
 
@@ -724,14 +725,14 @@
         long batchSizeThreshold = DatabaseDescriptor.getBatchSizeFailThreshold();
         try
         {
-            DatabaseDescriptor.setBatchSizeFailThresholdInKB( (TOO_BIG / 1024) * 2);
+            DatabaseDescriptor.setBatchSizeFailThresholdInKiB((TOO_BIG / 1024) * 2);
             succeedInsert("BEGIN BATCH\n" +
                           "INSERT INTO %s (a, b, c) VALUES (1, 1, ?) IF NOT EXISTS;\n" +
                           "APPLY BATCH", ByteBuffer.allocate(TOO_BIG));
         }
         finally
         {
-            DatabaseDescriptor.setBatchSizeFailThresholdInKB((int)(batchSizeThreshold / 1024));
+            DatabaseDescriptor.setBatchSizeFailThresholdInKiB((int)(batchSizeThreshold / 1024));
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/TimestampTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/TimestampTest.java
index 63cd2b7..13090a6 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/TimestampTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/TimestampTest.java
@@ -22,7 +22,7 @@
 import org.junit.Assert;
 import org.apache.cassandra.cql3.CQLTester;
 
-import static junit.framework.Assert.assertNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
 public class TimestampTest extends CQLTester
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/TimeuuidTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/TimeuuidTest.java
index 0f1f8f0..931451e 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/TimeuuidTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/TimeuuidTest.java
@@ -19,14 +19,14 @@
 package org.apache.cassandra.cql3.validation.entities;
 
 import java.util.Date;
-import java.util.UUID;
 
 import org.junit.Test;
 
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.exceptions.SyntaxException;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static org.junit.Assert.assertEquals;
 
 public class TimeuuidTest extends CQLTester
@@ -59,12 +59,13 @@
 
         for (int i = 0; i < 4; i++)
         {
-            long timestamp = UUIDGen.unixTimestamp((UUID) rows[i][1]);
+            long timestamp = ((TimeUUID) rows[i][1]).unix(MILLISECONDS);
             assertRows(execute("SELECT dateOf(t), unixTimestampOf(t) FROM %s WHERE k = 0 AND t = ?", rows[i][1]),
                        row(new Date(timestamp), timestamp));
         }
 
         assertEmpty(execute("SELECT t FROM %s WHERE k = 0 AND t > maxTimeuuid(1234567) AND t < minTimeuuid('2012-11-07 18:18:22-0800')"));
+        assertEmpty(execute("SELECT t FROM %s WHERE k = 0 AND t > maxTimeuuid(1564830182000) AND t < minTimeuuid('2012-11-07 18:18:22-0800')"));
     }
 
     /**
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java
index f9ef4cc..9f53db4 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/TupleTypeTest.java
@@ -33,7 +33,6 @@
 
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.db.SchemaCQLHelper;
 import org.apache.cassandra.db.marshal.TupleType;
 import org.apache.cassandra.utils.AbstractTypeGenerators.TypeSupport;
 import org.quicktheories.core.Gen;
@@ -300,7 +299,6 @@
             TupleType tupleType = testcase.type;
             createTable("CREATE TABLE %s (pk int, ck " + toCqlType(tupleType) + ", value int, PRIMARY KEY(pk, ck))" +
                         " WITH CLUSTERING ORDER BY (ck "+order.name()+")");
-            String cql = SchemaCQLHelper.getTableMetadataAsCQL(currentTableMetadata(), false, false, false);
             SortedMap<ByteBuffer, Integer> map = new TreeMap<>(order.apply(tupleType));
             int count = 0;
             for (ByteBuffer value : testcase.uniqueRows)
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UFScriptTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UFScriptTest.java
index 099e42d..fb33e6f 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFScriptTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFScriptTest.java
@@ -38,7 +38,9 @@
 import org.apache.cassandra.cql3.functions.FunctionName;
 import org.apache.cassandra.exceptions.FunctionExecutionException;
 import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class UFScriptTest extends CQLTester
 {
@@ -323,7 +325,7 @@
     public void testScriptParamReturnTypes() throws Throwable
     {
         UUID ruuid = UUID.randomUUID();
-        UUID tuuid = UUIDGen.getTimeUUID();
+        TimeUUID tuuid = nextTimeUUID();
 
         createTable("CREATE TABLE %s (key int primary key, " +
                     "tival tinyint, sival smallint, ival int, lval bigint, fval float, dval double, vval varint, ddval decimal, " +
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java
index 76b8324..e86b3df 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTest.java
@@ -40,6 +40,7 @@
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.transport.Event.SchemaChange.Change;
 import org.apache.cassandra.transport.Event.SchemaChange.Target;
@@ -864,7 +865,7 @@
                                                             "java",
                                                             f.body(),
                                                             new InvalidRequestException("foo bar is broken"));
-        Schema.instance.load(ksm.withSwapped(ksm.functions.without(f.name(), f.argTypes()).with(broken)));
+        SchemaTestUtil.addOrUpdateKeyspace(ksm.withSwapped(ksm.functions.without(f.name(), f.argTypes()).with(broken)), false);
 
         assertInvalidThrowMessage("foo bar is broken", InvalidRequestException.class,
                                   "SELECT key, " + fName + "(dval) FROM %s");
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTypesTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTypesTest.java
index b9ea27d..eb94fe5 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UFTypesTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UFTypesTest.java
@@ -37,8 +37,8 @@
 import org.apache.cassandra.transport.Event.SchemaChange.Change;
 import org.apache.cassandra.transport.Event.SchemaChange.Target;
 import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.transport.messages.ResultMessage;
-import org.apache.cassandra.utils.UUIDGen;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class UFTypesTest extends CQLTester
 {
@@ -187,7 +187,7 @@
         new TypesTestDef("date", "date", "dt", 12345),
         new TypesTestDef("time", "time", "tim", 12345L),
         new TypesTestDef("uuid", "uuid", "uu", UUID.randomUUID()),
-        new TypesTestDef("timeuuid", "timeuuid", "tu", UUIDGen.getTimeUUID()),
+        new TypesTestDef("timeuuid", "timeuuid", "tu", nextTimeUUID().asUUID()),
         new TypesTestDef("tinyint", "tinyint", "ti", (byte) 42),
         new TypesTestDef("smallint", "smallint", "si", (short) 43),
         new TypesTestDef("int", "int", "i", 44),
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/UserTypesTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/UserTypesTest.java
index e39dd35..0b05e8f 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/UserTypesTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/UserTypesTest.java
@@ -24,6 +24,7 @@
 
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.dht.ByteOrderedPartitioner;
+import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.service.StorageService;
 
 public class UserTypesTest extends CQLTester
@@ -882,4 +883,35 @@
     {
         return keyspace() + '.' + type1;
     }
+
+    @Test
+    public void testAlteringTypeWithIfNotExits() throws Throwable
+    {
+        String columnType = typeWithKs(createType("CREATE TYPE %s (a int)"));
+
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, y frozen<" + columnType + ">)");
+        execute("ALTER TYPE " + columnType + " ADD IF NOT EXISTS a int");
+
+        execute("INSERT INTO %s (k, y) VALUES(?, ?)", 1, userType("a", 1));
+        assertRows(execute("SELECT * FROM %s"), row(1, userType("a", 1)));
+
+        assertInvalidThrowMessage(String.format("Cannot add field %s to type %s: a field with name %s already exists", "a", columnType, "a"),
+                                  InvalidRequestException.class,
+                                  "ALTER TYPE " + columnType + " ADD a int");
+    }
+
+    @Test
+    public void testAlteringTypeRenameWithIfExists() throws Throwable
+    {
+        String columnType = typeWithKs(createType("CREATE TYPE %s (a int)"));
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, y frozen<" + columnType + ">)");
+        execute("ALTER TYPE " + columnType + " RENAME IF EXISTS a TO z AND b TO Y;");
+
+        execute("INSERT INTO %s (k, y) VALUES(?, ?)", 1, userType("z", 1));
+        assertRows(execute("SELECT * FROM %s"), row(1, userType("z", 1)));
+
+        assertInvalidThrowMessage(String.format("Unkown field %s in user type %s", "a", columnType),
+                                  InvalidRequestException.class,
+                                  "ALTER TYPE " + columnType + " RENAME a TO z;");
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java b/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java
index 9808c96..5d3b134 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/entities/VirtualTableTest.java
@@ -18,10 +18,23 @@
 package org.apache.cassandra.cql3.validation.entities;
 
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
+import java.util.NavigableMap;
+
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentSkipListMap;
+import java.util.concurrent.atomic.AtomicReference;
+
+import javax.annotation.Nonnull;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Range;
+
+import org.apache.commons.lang3.tuple.Pair;
+
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -31,18 +44,18 @@
 import org.apache.cassandra.db.marshal.LongType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.db.partitions.Partition;
-import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.virtual.AbstractMutableVirtualTable;
 import org.apache.cassandra.db.virtual.AbstractVirtualTable;
 import org.apache.cassandra.db.virtual.SimpleDataSet;
 import org.apache.cassandra.db.virtual.VirtualKeyspace;
 import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
 import org.apache.cassandra.db.virtual.VirtualTable;
-import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.service.StorageServiceMBean;
 import org.apache.cassandra.triggers.ITrigger;
 
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -52,53 +65,152 @@
     private static final String VT1_NAME = "vt1";
     private static final String VT2_NAME = "vt2";
     private static final String VT3_NAME = "vt3";
+    private static final String VT4_NAME = "vt4";
 
-    private static class WritableVirtualTable extends AbstractVirtualTable
+    // As long as we execute test queries using execute (and not executeNet) the virtual tables implementation
+    // do not need to be thread-safe. We choose to do it to avoid issues if the test framework was changed or somebody
+    // decided to use the class with executeNet. It also provide a better example in case somebody is looking
+    // at the test for learning how to create mutable virtual tables
+    private static class MutableVirtualTable extends AbstractMutableVirtualTable
     {
-        private final ColumnMetadata valueColumn;
-        private final Map<String, Integer> backingMap = new HashMap<>();
+        // <pk1, pk2> -> c1 -> c2 -> <v1, v2>
+        private final Map<Pair<String, String>, NavigableMap<String, NavigableMap<String, Pair<Number, Number>>>> backingMap = new ConcurrentHashMap<>();
 
-        WritableVirtualTable(String keyspaceName, String tableName)
+        MutableVirtualTable(String keyspaceName, String tableName)
         {
             super(TableMetadata.builder(keyspaceName, tableName)
                                .kind(TableMetadata.Kind.VIRTUAL)
-                               .addPartitionKeyColumn("key", UTF8Type.instance)
-                               .addRegularColumn("value", Int32Type.instance)
+                               .addPartitionKeyColumn("pk1", UTF8Type.instance)
+                               .addPartitionKeyColumn("pk2", UTF8Type.instance)
+                               .addClusteringColumn("c1", UTF8Type.instance)
+                               .addClusteringColumn("c2", UTF8Type.instance)
+                               .addRegularColumn("v1", Int32Type.instance)
+                               .addRegularColumn("v2", LongType.instance)
                                .build());
-            valueColumn = metadata().regularColumns().getSimple(0);
         }
 
         @Override
         public DataSet data()
         {
             SimpleDataSet data = new SimpleDataSet(metadata());
-            backingMap.forEach((key, value) -> data.row(key).column("value", value));
+            backingMap.forEach((pkPair, c1Map) ->
+                    c1Map.forEach((c1, c2Map) ->
+                    c2Map.forEach((c2, valuePair) -> data.row(pkPair.getLeft(), pkPair.getRight(), c1, c2)
+                                                         .column("v1", valuePair.getLeft())
+                                                         .column("v2", valuePair.getRight()))));
             return data;
         }
 
         @Override
-        public void apply(PartitionUpdate update)
+        protected void applyPartitionDeletion(ColumnValues partitionKeyColumns)
         {
-            String key = (String) metadata().partitionKeyType.compose(update.partitionKey().getKey());
-            update.forEach(row ->
-                           {
-                               Integer value = Int32Type.instance.compose(row.getCell(valueColumn).buffer());
-                               backingMap.put(key, value);
-                           });
+            backingMap.remove(toPartitionKey(partitionKeyColumns));
+        }
+
+        @Override
+        protected void applyRangeTombstone(ColumnValues partitionKeyColumns, Range<ColumnValues> range)
+        {
+            Optional<NavigableMap<String, NavigableMap<String, Pair<Number, Number>>>> mayBePartition = getPartition(partitionKeyColumns);
+
+            if (!mayBePartition.isPresent())
+                return;
+
+            NavigableMap<String, NavigableMap<String, Pair<Number, Number>>> selection = mayBePartition.get();
+
+            for (String c1 : ImmutableList.copyOf(selection.keySet()))
+            {
+                NavigableMap<String, Pair<Number, Number>> rows = selection.get(c1);
+
+                for (String c2 : ImmutableList.copyOf(selection.get(c1).keySet()))
+                {
+                    if (range.contains(new ColumnValues(metadata().clusteringColumns(), c1, c2)))
+                        rows.remove(c2);
+                }
+
+                if (rows.isEmpty())
+                    selection.remove(c1);
+            }
+        }
+
+        @Override
+        protected void applyRowDeletion(ColumnValues partitionKeyColumns, ColumnValues clusteringColumns)
+        {
+            getRows(partitionKeyColumns, clusteringColumns.value(0)).ifPresent(rows -> rows.remove(clusteringColumns.value(1)));
+        }
+
+        @Override
+        protected void applyColumnDeletion(ColumnValues partitionKeyColumns, ColumnValues clusteringColumns, String columnName)
+        {
+            getRows(partitionKeyColumns, clusteringColumns.value(0)).ifPresent(rows -> rows.computeIfPresent(clusteringColumns.value(1),
+                                                                                                             (c, p) -> updateColumn(p, columnName, null)));
+        }
+
+        @Override
+        protected void applyColumnUpdate(ColumnValues partitionKeyColumns,
+                                         ColumnValues clusteringColumns,
+                                         Optional<ColumnValue> mayBeColumnValue)
+        {
+            Pair<String, String> pkPair = toPartitionKey(partitionKeyColumns);
+            backingMap.computeIfAbsent(pkPair, ignored -> new ConcurrentSkipListMap<>())
+                      .computeIfAbsent(clusteringColumns.value(0), ignored -> new ConcurrentSkipListMap<>())
+                      .compute(clusteringColumns.value(1), (ignored, p) -> updateColumn(p, mayBeColumnValue));
+        }
+
+        @Override
+        public void truncate()
+        {
+            backingMap.clear();
+        }
+
+        private Optional<NavigableMap<String, Pair<Number, Number>>> getRows(ColumnValues partitionKeyColumns, Comparable<?> firstClusteringColumn)
+        {
+            return getPartition(partitionKeyColumns).map(p -> p.get(firstClusteringColumn));
+        }
+
+        private Optional<NavigableMap<String, NavigableMap<String, Pair<Number, Number>>>> getPartition(ColumnValues partitionKeyColumns)
+        {
+            Pair<String, String> pk = toPartitionKey(partitionKeyColumns);
+            return Optional.ofNullable(backingMap.get(pk));
+        }
+
+        private Pair<String, String> toPartitionKey(ColumnValues partitionKey)
+        {
+            return Pair.of(partitionKey.value(0), partitionKey.value(1));
+        }
+
+        private static Pair<Number, Number> updateColumn(@Nonnull Pair<Number, Number> row,
+                                                         String columnName,
+                                                         Number newValue)
+        {
+            return "v1".equals(columnName) ? Pair.of(newValue, row.getRight())
+                                           : Pair.of(row.getLeft(), newValue);
+        }
+
+        private static Pair<Number, Number> updateColumn(Pair<Number, Number> row,
+                                                         Optional<ColumnValue> mayBeColumnValue)
+        {
+            Pair<Number, Number> r = row != null ? row : Pair.of(null, null);
+
+            if (mayBeColumnValue.isPresent())
+            {
+                ColumnValue newValue = mayBeColumnValue.get();
+                return updateColumn(r, newValue.name(), newValue.value());
+            }
+
+            return r;
         }
     }
 
     @BeforeClass
     public static void setUpClass()
     {
-        TableMetadata vt1Metadata =
-        TableMetadata.builder(KS_NAME, VT1_NAME)
-                     .kind(TableMetadata.Kind.VIRTUAL)
-                     .addPartitionKeyColumn("pk", UTF8Type.instance)
-                     .addClusteringColumn("c", UTF8Type.instance)
-                     .addRegularColumn("v1", Int32Type.instance)
-                     .addRegularColumn("v2", LongType.instance)
-                     .build();
+        TableMetadata vt1Metadata = TableMetadata.builder(KS_NAME, VT1_NAME)
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .addPartitionKeyColumn("pk", UTF8Type.instance)
+                .addClusteringColumn("c", UTF8Type.instance)
+                .addRegularColumn("v1", Int32Type.instance)
+                .addRegularColumn("v2", LongType.instance)
+                .build();
 
         SimpleDataSet vt1data = new SimpleDataSet(vt1Metadata);
 
@@ -116,18 +228,17 @@
                 return vt1data;
             }
         };
-        VirtualTable vt2 = new WritableVirtualTable(KS_NAME, VT2_NAME);
+        VirtualTable vt2 = new MutableVirtualTable(KS_NAME, VT2_NAME);
 
-        TableMetadata vt3Metadata =
-        TableMetadata.builder(KS_NAME, VT3_NAME)
-                     .kind(TableMetadata.Kind.VIRTUAL)
-                     .addPartitionKeyColumn("pk1", UTF8Type.instance)
-                     .addPartitionKeyColumn("pk2", UTF8Type.instance)
-                     .addClusteringColumn("ck1", UTF8Type.instance)
-                     .addClusteringColumn("ck2", UTF8Type.instance)
-                     .addRegularColumn("v1", Int32Type.instance)
-                     .addRegularColumn("v2", LongType.instance)
-                     .build();
+        TableMetadata vt3Metadata = TableMetadata.builder(KS_NAME, VT3_NAME)
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .addPartitionKeyColumn("pk1", UTF8Type.instance)
+                .addPartitionKeyColumn("pk2", UTF8Type.instance)
+                .addClusteringColumn("ck1", UTF8Type.instance)
+                .addClusteringColumn("ck2", UTF8Type.instance)
+                .addRegularColumn("v1", Int32Type.instance)
+                .addRegularColumn("v2", LongType.instance)
+                .build();
 
         SimpleDataSet vt3data = new SimpleDataSet(vt3Metadata);
 
@@ -141,13 +252,104 @@
                 return vt3data;
             }
         };
-        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(vt1, vt2, vt3)));
+
+        TableMetadata vt4Metadata = TableMetadata.builder(KS_NAME, VT4_NAME)
+                .kind(TableMetadata.Kind.VIRTUAL)
+                .addPartitionKeyColumn("pk", UTF8Type.instance)
+                .addRegularColumn("v", LongType.instance)
+                .build();
+
+        // As long as we execute test queries using execute (and not executeNet) the virtual tables implementation
+        // do not need to be thread-safe. We choose to do it to avoid issues if the test framework was changed or somebody
+        // decided to use the class with executeNet. It also provide a better example in case somebody is looking
+        // at the test for learning how to create mutable virtual tables
+        VirtualTable vt4 = new AbstractMutableVirtualTable(vt4Metadata)
+        {
+            // CHM cannot be used here as they do not accept null values
+            private final AtomicReference<Map<String, Long>> table = new AtomicReference<Map<String, Long>>(Collections.emptyMap());
+
+            @Override
+            public DataSet data()
+            {
+                SimpleDataSet data = new SimpleDataSet(metadata());
+                table.get().forEach((pk, v) -> data.row(pk).column("v", v));
+                return data;
+            }
+
+            @Override
+            protected void applyPartitionDeletion(ColumnValues partitionKey)
+            {
+                Map<String, Long> oldMap;
+                Map<String, Long> newMap;
+                do
+                {
+                    oldMap = table.get();
+                    newMap = new HashMap<>(oldMap);
+                    newMap.remove(partitionKey.value(0));
+                }
+                while(!table.compareAndSet(oldMap, newMap));
+            }
+
+            @Override
+            protected void applyColumnDeletion(ColumnValues partitionKey,
+                                               ColumnValues clusteringColumns,
+                                               String columnName)
+            {
+                Map<String, Long> oldMap;
+                Map<String, Long> newMap;
+                do
+                {
+                    oldMap = table.get();
+
+                    if (!oldMap.containsKey(partitionKey.value(0)))
+                        break;
+
+                    newMap = new HashMap<>(oldMap);
+                    newMap.put(partitionKey.value(0), null);
+                }
+                while(!table.compareAndSet(oldMap, newMap));
+            }
+
+            @Override
+            protected void applyColumnUpdate(ColumnValues partitionKey,
+                                             ColumnValues clusteringColumns,
+                                             Optional<ColumnValue> columnValue)
+            {
+                Map<String, Long> oldMap;
+                Map<String, Long> newMap;
+                do
+                {
+                    oldMap = table.get();
+                    if (oldMap.containsKey(partitionKey.value(0)) && !columnValue.isPresent())
+                        break;
+                    newMap = new HashMap<>(oldMap);
+                    newMap.put(partitionKey.value(0), columnValue.isPresent() ? columnValue.get().value() : null);
+                }
+                while(!table.compareAndSet(oldMap, newMap));
+            }
+
+            @Override
+            public void truncate()
+            {
+                Map<String, Long> oldMap;
+                do
+                {
+                    oldMap = table.get();
+                    if (oldMap.isEmpty())
+                        break;
+                }
+                while(!table.compareAndSet(oldMap, Collections.emptyMap()));
+            }
+
+        };
+
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(vt1, vt2, vt3, vt4)));
 
         CQLTester.setUpClass();
     }
 
     @Test
-    public void testQueries() throws Throwable
+    public void testReadOperationsOnReadOnlyTable() throws Throwable
     {
         assertRowsNet(executeNet("SELECT * FROM test_virtual_ks.vt1 WHERE pk = 'UNKNOWN'"));
 
@@ -232,7 +434,7 @@
     }
 
     @Test
-    public void testQueriesOnTableWithMultiplePks() throws Throwable
+    public void testReadOperationsOnReadOnlyTableWithMultiplePks() throws Throwable
     {
         assertRowsNet(executeNet("SELECT * FROM test_virtual_ks.vt3 WHERE pk1 = 'UNKNOWN' AND pk2 = 'UNKNOWN'"));
 
@@ -249,76 +451,510 @@
     }
 
     @Test
-    public void testModifications() throws Throwable
+    public void testDMLOperationsOnMutableCompositeTable() throws Throwable
     {
-        // check for clean state
-        assertRows(execute("SELECT * FROM test_virtual_ks.vt2"));
+        // check for a clean state
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
 
         // fill the table, test UNLOGGED batch
         execute("BEGIN UNLOGGED BATCH " +
-                "UPDATE test_virtual_ks.vt2 SET value = 1 WHERE key ='pk1';" +
-                "UPDATE test_virtual_ks.vt2 SET value = 2 WHERE key ='pk2';" +
-                "UPDATE test_virtual_ks.vt2 SET value = 3 WHERE key ='pk3';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  1, v2 =  1 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  2, v2 =  2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_2';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  3, v2 =  3 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  4, v2 =  4 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_3';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  5, v2 =  5 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_5';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  6, v2 =  6 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_6';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  7, v2 =  7 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  8, v2 =  8 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 = 'c1_2' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  9, v2 =  9 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 = 10, v2 = 10 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_2';" +
                 "APPLY BATCH");
-        assertRows(execute("SELECT * FROM test_virtual_ks.vt2"),
-                   row("pk1", 1),
-                   row("pk2", 2),
-                   row("pk3", 3));
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L));
 
-        // test that LOGGED batches don't allow virtual table updates
-        assertInvalidMessage("Cannot include a virtual table statement in a logged batch",
-                             "BEGIN BATCH " +
-                             "UPDATE test_virtual_ks.vt2 SET value = 1 WHERE key ='pk1';" +
-                             "UPDATE test_virtual_ks.vt2 SET value = 2 WHERE key ='pk2';" +
-                             "UPDATE test_virtual_ks.vt2 SET value = 3 WHERE key ='pk3';" +
-                             "APPLY BATCH");
+        // update a single column with UPDATE
+        execute("UPDATE test_virtual_ks.vt2 SET v1 = 11 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1'"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 11, 1L));
 
-        // test that UNLOGGED batch doesn't allow mixing updates for regular and virtual tables
-        createTable("CREATE TABLE %s (key text PRIMARY KEY, value int)");
-        assertInvalidMessage("Mutations for virtual and regular tables cannot exist in the same batch",
-                             "BEGIN UNLOGGED BATCH " +
-                             "UPDATE test_virtual_ks.vt2 SET value = 1 WHERE key ='pk1'" +
-                             "UPDATE %s                  SET value = 2 WHERE key ='pk2'" +
-                             "UPDATE test_virtual_ks.vt2 SET value = 3 WHERE key ='pk3'" +
-                             "APPLY BATCH");
+        // update multiple columns with UPDATE
+        execute("UPDATE test_virtual_ks.vt2 SET v1 = 111, v2 = 111 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1'"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 111, 111L));
 
-        // update a single value with UPDATE
-        execute("UPDATE test_virtual_ks.vt2 SET value = 11 WHERE key ='pk1'");
-        assertRows(execute("SELECT * FROM test_virtual_ks.vt2 WHERE key = 'pk1'"),
-                   row("pk1", 11));
+        // update a single columns with INSERT
+        execute("INSERT INTO test_virtual_ks.vt2 (pk1, pk2, c1, c2, v2) VALUES ('pk1_1', 'pk2_1', 'c1_1', 'c2_2', 22)");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_2'"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 22L));
 
-        // update a single value with INSERT
-        executeNet("INSERT INTO test_virtual_ks.vt2 (key, value) VALUES ('pk2', 22)");
-        assertRows(execute("SELECT * FROM test_virtual_ks.vt2 WHERE key = 'pk2'"),
-                   row("pk2", 22));
+        // update multiple columns with INSERT
+        execute("INSERT INTO test_virtual_ks.vt2 (pk1, pk2, c1, c2, v1, v2) VALUES ('pk1_1', 'pk2_1', 'c1_1', 'c2_2', 222, 222)");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_2'"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 222, 222L));
 
-        // test that deletions are (currently) rejected
-        assertInvalidMessage("Virtual tables don't support DELETE statements",
-                             "DELETE FROM test_virtual_ks.vt2 WHERE key ='pk1'");
+        // delete a single partition
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L));
 
-        // test that TTL is (currently) rejected with INSERT and UPDATE
-        assertInvalidMessage("Expiring columns are not supported by virtual tables",
-                             "INSERT INTO test_virtual_ks.vt2 (key, value) VALUES ('pk1', 11) USING TTL 86400");
-        assertInvalidMessage("Expiring columns are not supported by virtual tables",
-                             "UPDATE test_virtual_ks.vt2 USING TTL 86400 SET value = 11 WHERE key ='pk1'");
+        // delete a first-level range (one-sided limit)
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 <= 'c1_1'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L));
 
-        // test that LWT is (currently) rejected with virtual tables in batches
-        assertInvalidMessage("Conditional BATCH statements cannot include mutations for virtual tables",
-                             "BEGIN UNLOGGED BATCH " +
-                             "UPDATE test_virtual_ks.vt2 SET value = 3 WHERE key ='pk3' IF value = 2;" +
-                             "APPLY BATCH");
+        // delete a first-level range (two-sided limit)
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 > 'c1_1' AND c1 < 'c1_3'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L));
 
-        // test that LWT is (currently) rejected with virtual tables in UPDATEs
-        assertInvalidMessage("Conditional updates are not supported by virtual tables",
-                             "UPDATE test_virtual_ks.vt2 SET value = 3 WHERE key ='pk3' IF value = 2");
+        // delete multiple rows
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L));
 
-        // test that LWT is (currently) rejected with virtual tables in INSERTs
-        assertInvalidMessage("Conditional updates are not supported by virtual tables",
-                             "INSERT INTO test_virtual_ks.vt2 (key, value) VALUES ('pk2', 22) IF NOT EXISTS");
+        // delete a second-level range (one-sided limit)
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 > 'c2_5'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L));
+
+        // delete a second-level range (two-sided limit)
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 >= 'c2_3' AND c2 < 'c2_5'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L));
+
+        // delete a single row
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_5'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L));
+
+        // delete a single column
+        execute("DELETE v1 FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", null, 3L));
+
+        // truncate
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
     }
 
     @Test
-    public void testInvalidDDLOperations() throws Throwable
+    public void testRangeDeletionWithMulticolumnRestrictionsOnMutableTable() throws Throwable
+    {
+        // check for a clean state
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
+
+        // fill the table, test UNLOGGED batch
+        execute("BEGIN UNLOGGED BATCH " +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  1, v2 =  1 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  2, v2 =  2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_2';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  3, v2 =  3 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  4, v2 =  4 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_3';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  5, v2 =  5 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_5';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  6, v2 =  6 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_6';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  7, v2 =  7 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  8, v2 =  8 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 = 'c1_2' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  9, v2 =  9 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 = 10, v2 = 10 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_2';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 = 11, v2 = 11 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_3';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 = 12, v2 = 12 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_4';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 = 13, v2 = 13 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_5';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 = 14, v2 = 14 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_3' AND c2 = 'c2_1';" +
+                "APPLY BATCH");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_4", 12, 12L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_5", 13, 13L),
+                row("pk1_1", "pk2_3", "c1_3", "c2_1", 14, 14L));
+
+        // Test deletion with multiple columns equality
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND (c1, c2) = ('c1_1', 'c2_5')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_4", 12, 12L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_5", 13, 13L),
+                row("pk1_1", "pk2_3", "c1_3", "c2_1", 14, 14L));
+
+        // Test deletion with multiple columns with slice on both side of different length
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 >= 'c1_1' AND (c1, c2) <= ('c1_1', 'c2_5')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_4", 12, 12L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_5", 13, 13L),
+                row("pk1_1", "pk2_3", "c1_3", "c2_1", 14, 14L));
+
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND (c1, c2) > ('c1_2', 'c2_3') AND (c1) < ('c1_3')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L),
+                row("pk1_1", "pk2_3", "c1_3", "c2_1", 14, 14L));
+
+        // Test deletion with multiple columns with slice on both side of different length
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 >= 'c1_1' AND (c1, c2) <= ('c1_1', 'c2_5')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L),
+                row("pk1_1", "pk2_3", "c1_3", "c2_1", 14, 14L));
+
+        // Test deletion with multiple columns with only top slice
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND (c1, c2) < ('c1_2', 'c2_2')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L),
+                row("pk1_1", "pk2_3", "c1_3", "c2_1", 14, 14L));
+
+        // Test deletion with multiple columns with only bottom slice
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND (c1, c2) > ('c1_1', 'c2_1')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L),
+                row("pk1_1", "pk2_3", "c1_3", "c2_1", 14, 14L));
+
+        // Test deletion with multiple columns IN
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND (c1, c2) IN (('c1_2', 'c2_2'), ('c1_3', 'c2_1'), ('c1_4', 'c2_1'))");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_2", "c2_1", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_3", 11, 11L));
+
+        // truncate
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
+    }
+
+    @Test
+    public void testDMLOperationsOnMutableNonCompositeTable() throws Throwable
+    {
+        // check for a clean state
+        execute("TRUNCATE test_virtual_ks.vt4");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt4"));
+
+        // fill the table, test UNLOGGED batch
+        execute("BEGIN UNLOGGED BATCH " +
+                "INSERT INTO test_virtual_ks.vt4 (pk, v) VALUES ('pk1', 1);" +
+                "INSERT INTO test_virtual_ks.vt4 (pk, v) VALUES ('pk2', 2);" +
+                "INSERT INTO test_virtual_ks.vt4 (pk, v) VALUES ('pk3', 3);" +
+                "INSERT INTO test_virtual_ks.vt4 (pk, v) VALUES ('pk4', 4);" +
+                "APPLY BATCH");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt4"),
+                row("pk1", 1L),
+                row("pk2", 2L),
+                row("pk3", 3L),
+                row("pk4", 4L));
+
+         execute("UPDATE test_virtual_ks.vt4 SET v = 3 WHERE pk = 'pk1'");
+         assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt4"),
+                 row("pk1", 3L),
+                 row("pk2", 2L),
+                 row("pk3", 3L),
+                 row("pk4", 4L));
+
+        // update a single columns with INSERT
+         execute("INSERT INTO test_virtual_ks.vt4 (pk, v) VALUES ('pk1', 1);");
+         assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt4"),
+                 row("pk1", 1L),
+                 row("pk2", 2L),
+                 row("pk3", 3L),
+                 row("pk4", 4L));
+
+         // update no column via INSERT
+         execute("INSERT INTO test_virtual_ks.vt4 (pk) VALUES ('pk1');");
+         assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt4"),
+                 row("pk1", 1L),
+                 row("pk2", 2L),
+                 row("pk3", 3L),
+                 row("pk4", 4L));
+
+         // insert new primary key only
+         execute("INSERT INTO test_virtual_ks.vt4 (pk) VALUES ('pk5');");
+         assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt4"),
+                 row("pk1", 1L),
+                 row("pk2", 2L),
+                 row("pk3", 3L),
+                 row("pk4", 4L),
+                 row("pk5", null));
+
+        // delete a single partition
+        execute("DELETE FROM test_virtual_ks.vt4 WHERE pk = 'pk2'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt4"),
+                row("pk1", 1L),
+                row("pk3", 3L),
+                row("pk4", 4L),
+                row("pk5", null));
+
+        // delete a single column
+        execute("DELETE v FROM test_virtual_ks.vt4 WHERE pk = 'pk4'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt4"),
+                row("pk1", 1L),
+                row("pk3", 3L),
+                row("pk4", null),
+                row("pk5", null));
+
+        // truncate
+        execute("TRUNCATE test_virtual_ks.vt4");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt4"));
+    }
+
+    @Test
+    public void testInsertRowWithoutRegularColumnsOperationOnMutableTable() throws Throwable
+    {
+        // check for a clean state
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
+
+        // insert a primary key without columns
+        execute("INSERT INTO test_virtual_ks.vt2 (pk1, pk2, c1, c2) VALUES ('pk1_1', 'pk2_1', 'c1_1', 'c2_2')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_2'"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_2", null, null));
+
+        // truncate
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
+    }
+
+    @Test
+    public void testDeleteWithInOperationsOnMutableTable() throws Throwable
+    {
+        // check for a clean state
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
+
+        // fill the table, test UNLOGGED batch
+        execute("BEGIN UNLOGGED BATCH " +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  1, v2 =  1 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  2, v2 =  2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_2' AND c1 = 'c1_1' AND c2 = 'c2_2';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  3, v2 =  3 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  4, v2 =  4 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_2' AND c2 = 'c2_3';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  5, v2 =  5 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_1' AND c2 = 'c2_5';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  6, v2 =  6 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 = 'c1_2' AND c2 = 'c2_6';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  7, v2 =  7 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  8, v2 =  8 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 = 'c1_1' AND c2 = 'c2_2';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 =  9, v2 =  9 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_1' AND c2 = 'c2_1';" +
+                "UPDATE test_virtual_ks.vt2 SET v1 = 10, v2 = 10 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 = 'c1_2' AND c2 = 'c2_2';" +
+                "APPLY BATCH");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_1", "pk2_1", "c1_1", "c2_1", 1, 1L),
+                row("pk1_1", "pk2_2", "c1_1", "c2_2", 2, 2L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_2", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_1", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L));
+
+        // delete multiple partitions with IN
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 IN('pk2_1', 'pk2_2')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_2", 8, 8L),
+                row("pk1_1", "pk2_3", "c1_1", "c2_1", 9, 9L),
+                row("pk1_1", "pk2_3", "c1_2", "c2_2", 10, 10L));
+
+        // delete multiple rows via first-level IN
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2_3' AND c1 IN('c1_1', 'c1_2')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_6", 6, 6L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_1", 7, 7L),
+                row("pk1_2", "pk2_2", "c1_1", "c2_2", 8, 8L));
+
+        // delete multiple rows via second-level IN
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_2' AND c1 = 'c1_1' AND c2 IN('c2_1', 'c2_2')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_1", 3, 3L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_3", 4, 4L),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_6", 6, 6L));
+
+        // delete multiple rows with first-level IN and second-level range (one-sided limit)
+        execute("DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 IN('c1_1', 'c1_2') AND c2 <= 'c2_3'");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", 5, 5L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_6", 6, 6L));
+
+        // delete multiple rows via first-level and second-level IN
+        execute("DELETE v1 FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2_1' AND c1 IN('c1_1', 'c1_2') AND c2 IN('c2_5', 'c2_6')");
+        assertRowsIgnoringOrder(execute("SELECT * FROM test_virtual_ks.vt2"),
+                row("pk1_2", "pk2_1", "c1_1", "c2_5", null, 5L),
+                row("pk1_2", "pk2_1", "c1_2", "c2_6", null, 6L));
+
+        // truncate
+        execute("TRUNCATE test_virtual_ks.vt2");
+        assertEmpty(execute("SELECT * FROM test_virtual_ks.vt2"));
+    }
+
+    @Test
+    public void testInvalidDMLOperationsOnMutableTable() throws Throwable
+    {
+        // test that LOGGED batch doesn't allow virtual table updates
+        assertInvalidMessage("Cannot include a virtual table statement in a logged batch",
+                "BEGIN BATCH " +
+                        "UPDATE test_virtual_ks.vt2 SET v1 = 1 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2';" +
+                        "UPDATE test_virtual_ks.vt2 SET v1 = 2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2';" +
+                        "UPDATE test_virtual_ks.vt2 SET v1 = 3 WHERE pk1 = 'pk1_3' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2';" +
+                        "APPLY BATCH");
+
+        // test that UNLOGGED batch doesn't allow mixing updates for regular and virtual tables
+        createTable("CREATE TABLE %s (pk1 text, pk2 text, c1 text, c2 text, v1 int, v2 bigint, PRIMARY KEY ((pk1, pk2), c1, c2))");
+        assertInvalidMessage("Mutations for virtual and regular tables cannot exist in the same batch",
+                "BEGIN UNLOGGED BATCH " +
+                        "UPDATE test_virtual_ks.vt2 SET v1 = 1 WHERE pk1 = 'pk1_1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2';" +
+                        "UPDATE %s                  SET v1 = 2 WHERE pk1 = 'pk1_2' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2';" +
+                        "UPDATE test_virtual_ks.vt2 SET v1 = 3 WHERE pk1 = 'pk1_3' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2';" +
+                        "APPLY BATCH");
+
+        // test that TIMESTAMP is (currently) rejected with INSERT and UPDATE
+        assertInvalidMessage("Custom timestamp is not supported by virtual tables",
+                "INSERT INTO test_virtual_ks.vt2 (pk1, pk2, c1, c2, v1, v2) VALUES ('pk1', 'pk2', 'c1', 'c2', 1, 11) USING TIMESTAMP 123456789");
+        assertInvalidMessage("Custom timestamp is not supported by virtual tables",
+                "UPDATE test_virtual_ks.vt2 USING TIMESTAMP 123456789 SET v1 = 1, v2 = 11 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2'");
+
+        // test that TTL is (currently) rejected with INSERT and UPDATE
+        assertInvalidMessage("Expiring columns are not supported by virtual tables",
+                "INSERT INTO test_virtual_ks.vt2 (pk1, pk2, c1, c2, v1, v2) VALUES ('pk1', 'pk2', 'c1', 'c2', 1, 11) USING TTL 86400");
+        assertInvalidMessage("Expiring columns are not supported by virtual tables",
+                "UPDATE test_virtual_ks.vt2 USING TTL 86400 SET v1 = 1, v2 = 11 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2'");
+
+        // test that LWT is (currently) rejected with BATCH
+        assertInvalidMessage("Conditional BATCH statements cannot include mutations for virtual tables",
+                "BEGIN UNLOGGED BATCH " +
+                        "UPDATE test_virtual_ks.vt2 SET v1 = 3 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2' IF v1 = 2;" +
+                        "APPLY BATCH");
+
+        // test that LWT is (currently) rejected with INSERT and UPDATE
+        assertInvalidMessage("Conditional updates are not supported by virtual tables",
+                "INSERT INTO test_virtual_ks.vt2 (pk1, pk2, c1, c2, v1) VALUES ('pk1', 'pk2', 'c1', 'c2', 2) IF NOT EXISTS");
+        assertInvalidMessage("Conditional updates are not supported by virtual tables",
+                "UPDATE test_virtual_ks.vt2 SET v1 = 3 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 = 'c2' IF v1 = 2");
+
+        // test that row DELETE without full primary key with equality relation is (currently) rejected
+        assertInvalidMessage("Some partition key parts are missing: pk2",
+                "DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1' AND c1 = 'c1' AND c2 > 'c2'");
+        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function) for DELETE statements",
+                "DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1' AND pk2 > 'pk2' AND c1 = 'c1' AND c2 > 'c2'");
+        assertInvalidMessage("KEY column \"c2\" cannot be restricted as preceding column \"c1\" is not restricted",
+                "DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c2 > 'c2'");
+        assertInvalidMessage("Clustering column \"c2\" cannot be restricted (preceding column \"c1\" is restricted by a non-EQ relation)",
+                "DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 > 'c1' AND c2 > 'c2'");
+        assertInvalidMessage("DELETE statements must restrict all PRIMARY KEY columns with equality relations",
+                "DELETE FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 > 'c2' IF v1 = 2");
+
+        // test that column DELETE without full primary key with equality relation is (currently) rejected
+        assertInvalidMessage("Range deletions are not supported for specific columns",
+                "DELETE v1 FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 = 'c1'");
+        assertInvalidMessage("Range deletions are not supported for specific columns",
+                "DELETE v1 FROM test_virtual_ks.vt2 WHERE pk1 = 'pk1' AND pk2 = 'pk2' AND c1 = 'c1' AND c2 > 'c2'");
+    }
+
+    @Test
+    public void testInvalidDMLOperationsOnReadOnlyTable() throws Throwable
+    {
+        assertInvalidMessage("Modification is not supported by table test_virtual_ks.vt1",
+                "INSERT INTO test_virtual_ks.vt1 (pk, c, v1, v2) VALUES ('pk1_1', 'ck1_1', 11, 11)");
+
+        assertInvalidMessage("Modification is not supported by table test_virtual_ks.vt1",
+                "UPDATE test_virtual_ks.vt1 SET v1 = 11, v2 = 11 WHERE pk = 'pk1_1' AND c = 'ck1_1'");
+
+        assertInvalidMessage("Modification is not supported by table test_virtual_ks.vt1",
+                "DELETE FROM test_virtual_ks.vt1 WHERE pk = 'pk1_1' AND c = 'ck1_1'");
+
+        assertInvalidMessage("Error during truncate: Truncation is not supported by table test_virtual_ks.vt1",
+                "TRUNCATE TABLE test_virtual_ks.vt1");
+    }
+
+    @Test
+    public void testInvalidDDLOperationsOnVirtualKeyspaceAndReadOnlyTable() throws Throwable
     {
         assertInvalidMessage("Virtual keyspace 'test_virtual_ks' is not user-modifiable",
                              "DROP KEYSPACE test_virtual_ks");
@@ -338,9 +974,6 @@
         assertInvalidMessage("Virtual keyspace 'test_virtual_ks' is not user-modifiable",
                              "ALTER TABLE test_virtual_ks.vt1 DROP v1");
 
-        assertInvalidMessage("Error during truncate: Cannot truncate virtual tables",
-                             "TRUNCATE TABLE test_virtual_ks.vt1");
-
         assertInvalidMessage("Virtual keyspace 'test_virtual_ks' is not user-modifiable",
                              "CREATE INDEX ON test_virtual_ks.vt1 (v1)");
 
diff --git a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/CrcCheckChanceTest.java b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/CrcCheckChanceTest.java
index 246f512..bac7e79 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/CrcCheckChanceTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/CrcCheckChanceTest.java
@@ -24,6 +24,8 @@
 import org.junit.Test;
 
 import org.junit.Assert;
+
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -68,7 +70,7 @@
 
         ColumnFamilyStore cfs = Keyspace.open(CQLTester.KEYSPACE).getColumnFamilyStore(currentTable());
         ColumnFamilyStore indexCfs = cfs.indexManager.getAllIndexColumnFamilyStores().iterator().next();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Assert.assertEquals(0.99, cfs.getCrcCheckChance(), 0.0);
         Assert.assertEquals(0.99, cfs.getLiveSSTables().iterator().next().getCrcCheckChance(), 0.0);
@@ -96,19 +98,19 @@
         execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2");
         execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2");
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1");
         execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2");
         execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2");
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         execute("INSERT INTO %s(p, c, v, s) values (?, ?, ?, ?)", "p1", "k1", "v1", "sv1");
         execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2");
         execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2");
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.forceMajorCompaction();
 
         //Now let's change via JMX
@@ -182,11 +184,11 @@
             execute("INSERT INTO %s(p, c, v) values (?, ?, ?)", "p1", "k2", "v2");
             execute("INSERT INTO %s(p, s) values (?, ?)", "p2", "sv2");
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
-        DatabaseDescriptor.setCompactionThroughputMbPerSec(1);
-        List<Future<?>> futures = CompactionManager.instance.submitMaximal(cfs, CompactionManager.getDefaultGcBefore(cfs, FBUtilities.nowInSeconds()), false); 
+        DatabaseDescriptor.setCompactionThroughputMebibytesPerSec(1);
+        List<? extends Future<?>> futures = CompactionManager.instance.submitMaximal(cfs, CompactionManager.getDefaultGcBefore(cfs, FBUtilities.nowInSeconds()), false);
         execute("DROP TABLE %s");
 
         try
diff --git a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/OverflowTest.java b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/OverflowTest.java
index 71d632d..0d9e043 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/OverflowTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/OverflowTest.java
@@ -21,15 +21,15 @@
 
 import org.junit.Test;
 
-import static junit.framework.Assert.assertNull;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 /**
  * Any tests that do not fit in any other category,
  * migrated from python dtests, CASSANDRA-9160
@@ -293,4 +293,4 @@
         execute("INSERT INTO %s (k, v) VALUES (0, blobAsInt(0x00000001))");
         assertRows(execute("select v from %s where k=0"), row(1));
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/RoleSyntaxTest.java b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/RoleSyntaxTest.java
index f72e3dc..fce88f9 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/RoleSyntaxTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/RoleSyntaxTest.java
@@ -17,6 +17,8 @@
  */
 package org.apache.cassandra.cql3.validation.miscellaneous;
 
+import java.util.Arrays;
+
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -25,8 +27,9 @@
 
 public class RoleSyntaxTest extends CQLTester
 {
-    private final String NO_QUOTED_USERNAME = "Quoted strings are are not supported for user names " +
-                                              "and USER is deprecated, please use ROLE";
+    private static final String NO_QUOTED_USERNAME = "Quoted strings are are not supported for user names " +
+                                                     "and USER is deprecated, please use ROLE";
+
     @Test
     public void standardOptionsSyntaxTest() throws Throwable
     {
@@ -100,6 +103,9 @@
         assertValidSyntax("ALTER USER 'u1' WITH PASSWORD 'password'");
         assertValidSyntax("ALTER USER $$u1$$ WITH PASSWORD 'password'");
         assertValidSyntax("ALTER USER $$ u1 ' x $ x ' $$ WITH PASSWORD 'password'");
+        // ALTER with IF EXISTS syntax
+        assertValidSyntax("ALTER ROLE IF EXISTS r1 WITH PASSWORD = 'password'");
+        assertValidSyntax("ALTER USER IF EXISTS u1 WITH PASSWORD 'password'");
         // user names may not be quoted names
         assertInvalidSyntax("ALTER USER \"u1\" WITH PASSWORD 'password'", NO_QUOTED_USERNAME);
     }
@@ -107,49 +113,63 @@
     @Test
     public void grantRevokePermissionsSyntaxTest() throws Throwable
     {
-        // grant/revoke on RoleResource
-        assertValidSyntax("GRANT ALTER ON ROLE r1 TO r2");
-        assertValidSyntax("GRANT ALTER ON ROLE 'r1' TO \"r2\"");
-        assertValidSyntax("GRANT ALTER ON ROLE \"r1\" TO 'r2'");
-        assertValidSyntax("GRANT ALTER ON ROLE $$r1$$ TO $$ r '2' $$");
-        assertValidSyntax("REVOKE ALTER ON ROLE r1 FROM r2");
-        assertValidSyntax("REVOKE ALTER ON ROLE 'r1' FROM \"r2\"");
-        assertValidSyntax("REVOKE ALTER ON ROLE \"r1\" FROM 'r2'");
-        assertValidSyntax("REVOKE ALTER ON ROLE $$r1$$ FROM $$ r '2' $$");
+        for (String r1 : Arrays.asList("r1", "'r1'", "\"r1\"", "$$r1$$"))
+        {
+            for (String r2 : Arrays.asList("r2", "\"r2\"", "'r2'", "$$ r '2' $$"))
+            {
+                // grant/revoke on RoleResource
+                assertValidSyntax(String.format("GRANT ALTER ON ROLE %s TO %s", r1, r2));
+                assertValidSyntax(String.format("GRANT ALTER PERMISSION ON ROLE %s TO %s", r1, r2));
+                assertValidSyntax(String.format("REVOKE ALTER ON ROLE %s FROM %s", r1, r2));
+                assertValidSyntax(String.format("REVOKE ALTER PERMISSION ON ROLE %s FROM %s", r1, r2));
 
-        // grant/revoke on DataResource
-        assertValidSyntax("GRANT SELECT ON KEYSPACE ks TO r1");
-        assertValidSyntax("GRANT SELECT ON KEYSPACE ks TO 'r1'");
-        assertValidSyntax("GRANT SELECT ON KEYSPACE ks TO \"r1\"");
-        assertValidSyntax("GRANT SELECT ON KEYSPACE ks TO $$ r '1' $$");
-        assertValidSyntax("REVOKE SELECT ON KEYSPACE ks FROM r1");
-        assertValidSyntax("REVOKE SELECT ON KEYSPACE ks FROM 'r1'");
-        assertValidSyntax("REVOKE SELECT ON KEYSPACE ks FROM \"r1\"");
-        assertValidSyntax("REVOKE SELECT ON KEYSPACE ks FROM $$ r '1' $$");
+                // grant/revoke multiple permissions in a single statement
+                assertValidSyntax(String.format("GRANT CREATE, ALTER ON ROLE %s TO %s", r1, r2));
+                assertValidSyntax(String.format("GRANT CREATE PERMISSION, ALTER PERMISSION ON ROLE %s TO %s", r1, r2));
+                assertValidSyntax(String.format("REVOKE CREATE, ALTER ON ROLE %s FROM %s", r1, r2));
+                assertValidSyntax(String.format("REVOKE CREATE PERMISSION, ALTER PERMISSION ON ROLE %s FROM %s", r1, r2));
+            }
+        }
+
+        for (String r1 : Arrays.asList("r1", "'r1'", "\"r1\"", "$$r1$$", "$$ r '1' $$"))
+        {
+            // grant/revoke on DataResource
+            assertValidSyntax(String.format("GRANT SELECT ON KEYSPACE ks TO %s", r1));
+            assertValidSyntax(String.format("GRANT SELECT PERMISSION ON KEYSPACE ks TO %s", r1));
+            assertValidSyntax(String.format("REVOKE SELECT ON KEYSPACE ks FROM %s", r1));
+            assertValidSyntax(String.format("REVOKE SELECT PERMISSION ON KEYSPACE ks FROM %s", r1));
+
+            // grant/revoke multiple permissions in a single statement
+            assertValidSyntax(String.format("GRANT MODIFY, SELECT ON KEYSPACE ks TO %s", r1));
+            assertValidSyntax(String.format("GRANT MODIFY PERMISSION, SELECT PERMISSION ON KEYSPACE ks TO %s", r1));
+            assertValidSyntax(String.format("GRANT MODIFY, SELECT ON ALL KEYSPACES TO %s", r1));
+            assertValidSyntax(String.format("GRANT MODIFY PERMISSION, SELECT PERMISSION ON ALL KEYSPACES TO %s", r1));
+            assertValidSyntax(String.format("REVOKE MODIFY, SELECT ON KEYSPACE ks FROM %s", r1));
+            assertValidSyntax(String.format("REVOKE MODIFY PERMISSION, SELECT PERMISSION ON KEYSPACE ks FROM %s", r1));
+            assertValidSyntax(String.format("REVOKE MODIFY, SELECT ON ALL KEYSPACES FROM %s", r1));
+            assertValidSyntax(String.format("REVOKE MODIFY PERMISSION, SELECT PERMISSION ON ALL KEYSPACES FROM %s", r1));
+        }
     }
 
     @Test
     public void listPermissionsSyntaxTest() throws Throwable
     {
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL ROLES OF r1");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL ROLES OF 'r1'");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL ROLES OF \"r1\"");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL ROLES OF $$ r '1' $$");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ROLE 'r1' OF r2");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ROLE \"r1\" OF r2");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ROLE $$ r '1' $$ OF r2");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ROLE 'r1' OF 'r2'");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ROLE \"r1\" OF \"r2\"");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ROLE $$r1$$ OF $$ r '2' $$");
+        for (String r1 : Arrays.asList("r1", "'r1'", "\"r1\"", "$$r1$$", "$$ r '1' $$"))
+        {
+            assertValidSyntax(String.format("LIST ALL PERMISSIONS ON ALL ROLES OF %s", r1));
+            assertValidSyntax(String.format("LIST ALL PERMISSIONS ON ALL KEYSPACES OF %s", r1));
+            assertValidSyntax(String.format("LIST ALL PERMISSIONS OF %s", r1));
+            assertValidSyntax(String.format("LIST MODIFY PERMISSION ON KEYSPACE ks OF %s", r1));
+            assertValidSyntax(String.format("LIST MODIFY, SELECT OF %s", r1));
+            assertValidSyntax(String.format("LIST MODIFY, SELECT PERMISSION ON KEYSPACE ks OF %s", r1));
 
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL KEYSPACES OF r1");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL KEYSPACES OF 'r1'");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL KEYSPACES OF \"r1\"");
-        assertValidSyntax("LIST ALL PERMISSIONS ON ALL KEYSPACES OF $$ r '1' $$");
-        assertValidSyntax("LIST ALL PERMISSIONS OF r1");
-        assertValidSyntax("LIST ALL PERMISSIONS OF 'r1'");
-        assertValidSyntax("LIST ALL PERMISSIONS OF \"r1\"");
-        assertValidSyntax("LIST ALL PERMISSIONS OF $$ r '1' $$");
+            for (String r2 : Arrays.asList("r2", "\"r2\"", "'r2'", "$$ r '2' $$"))
+            {
+                assertValidSyntax(String.format("LIST ALL PERMISSIONS ON ROLE %s OF %s", r1, r2));
+                assertValidSyntax(String.format("LIST ALTER PERMISSION ON ROLE %s OF %s", r1, r2));
+                assertValidSyntax(String.format("LIST ALTER, DROP PERMISSION ON ROLE %s OF %s", r1, r2));
+            }
+        }
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java
index 5d367de..9ecc3ae 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/SSTableMetadataTrackingTest.java
@@ -19,6 +19,7 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
@@ -40,7 +41,7 @@
         createTable("CREATE TABLE %s (a int, b int, c text, PRIMARY KEY (a, b))");
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
         execute("INSERT INTO %s (a,b,c) VALUES (1,1,'1') using timestamp 9999");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata();
         assertEquals(9999, metadata.minTimestamp);
         assertEquals(Integer.MAX_VALUE, metadata.maxLocalDeletionTime);
@@ -57,7 +58,7 @@
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
         execute("INSERT INTO %s (a,b,c) VALUES (1,1,'1') using timestamp 10000");
         execute("DELETE FROM %s USING TIMESTAMP 9999 WHERE a = 1 and b = 1");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata();
         assertEquals(9999, metadata.minTimestamp);
         assertEquals(10000, metadata.maxTimestamp);
@@ -76,7 +77,7 @@
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
         execute("INSERT INTO %s (a,b,c) VALUES (1,1,'1') using timestamp 10000");
         execute("DELETE FROM %s USING TIMESTAMP 9999 WHERE a = 1");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata();
         assertEquals(9999, metadata.minTimestamp);
         assertEquals(10000, metadata.maxTimestamp);
@@ -95,7 +96,7 @@
         createTable("CREATE TABLE %s (a int, b int, c text, PRIMARY KEY (a, b)) WITH gc_grace_seconds = 10000");
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
         execute("DELETE FROM %s USING TIMESTAMP 9999 WHERE a = 1 and b = 1");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(1, cfs.getLiveSSTables().size());
         StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata();
         assertEquals(9999, metadata.minTimestamp);
@@ -115,7 +116,7 @@
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
         execute("DELETE FROM %s USING TIMESTAMP 9999 WHERE a = 1");
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(1, cfs.getLiveSSTables().size());
         StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata();
         assertEquals(9999, metadata.minTimestamp);
@@ -135,7 +136,7 @@
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
         execute("INSERT INTO %s (a) VALUES (1) USING TIMESTAMP 9999");
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(1, cfs.getLiveSSTables().size());
         StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata();
         assertEquals(9999, metadata.minTimestamp);
@@ -154,7 +155,7 @@
         createTable("CREATE TABLE %s (a int, PRIMARY KEY (a))");
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
         execute("DELETE FROM %s USING TIMESTAMP 9999 WHERE a=1");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(1, cfs.getLiveSSTables().size());
         StatsMetadata metadata = cfs.getLiveSSTables().iterator().next().getSSTableMetadata();
         assertEquals(9999, metadata.minTimestamp);
diff --git a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/TombstonesTest.java b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/TombstonesTest.java
index 85048ae..dc7cccf 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/TombstonesTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/miscellaneous/TombstonesTest.java
@@ -31,9 +31,9 @@
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.filter.TombstoneOverwhelmingException;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * Test that TombstoneOverwhelmingException gets thrown when it should be and doesn't when it shouldn't be.
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterNTSTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterNTSTest.java
index 4cc95e1..e8f9842 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterNTSTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterNTSTest.java
@@ -19,12 +19,21 @@
 package org.apache.cassandra.cql3.validation.operations;
 
 import java.util.List;
+import java.util.UUID;
 
 import org.junit.Test;
 
 import com.datastax.driver.core.PreparedStatement;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.locator.IEndpointSnitch;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.ReplicaCollection;
+import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.service.StorageService;
 import org.assertj.core.api.Assertions;
 
 import static org.junit.Assert.assertEquals;
@@ -100,4 +109,43 @@
         warnings = ClientWarn.instance.getWarnings();
         assertNull(warnings);
     }
+
+    @Test
+    public void testAlterKeyspaceSystem_AuthWithNTSOnlyAcceptsConfiguredDataCenterNames() throws Throwable
+    {
+        requireAuthentication();
+
+        // Add a peer
+        StorageService.instance.getTokenMetadata().updateHostId(UUID.randomUUID(), InetAddressAndPort.getByName("127.0.0.2"));
+
+        // Register an Endpoint snitch which returns fixed value for data center.
+        DatabaseDescriptor.setEndpointSnitch(new IEndpointSnitch()
+        {
+            public String getRack(InetAddressAndPort endpoint) { return RACK1; }
+            public String getDatacenter(InetAddressAndPort endpoint)
+            {
+                if(endpoint.getHostAddress(false).equalsIgnoreCase("127.0.0.2"))
+                    return "datacenter2";
+                return DATA_CENTER;
+            }
+            public <C extends ReplicaCollection<? extends C>> C sortedByProximity(InetAddressAndPort address, C addresses)
+            {
+                return null;
+            }
+
+            public int compareEndpoints(InetAddressAndPort target, Replica r1, Replica r2)
+            {
+                return 0;
+            }
+
+            // NOOP
+            public void gossiperStarting() { }
+
+            public boolean isWorthMergingForRangeQuery(ReplicaCollection<?> merged, ReplicaCollection<?> l1, ReplicaCollection<?> l2) { return false; }
+        });
+
+        // try modifying the system_auth keyspace without second DC which has active node.
+        assertInvalidThrow(ConfigurationException.class, "ALTER KEYSPACE system_auth WITH replication = { 'class' : 'NetworkTopologyStrategy', '" + DATA_CENTER + "' : 2 }");
+        execute("ALTER KEYSPACE " + SchemaConstants.AUTH_KEYSPACE_NAME + " WITH replication = {'class' : 'NetworkTopologyStrategy', '" + DATA_CENTER + "' : 1 , '" + DATA_CENTER_REMOTE + "' : 1 }");
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java
index 2741f94..fddd59b 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/AlterTest.java
@@ -19,17 +19,23 @@
 
 import java.util.UUID;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.memtable.SkipListMemtable;
+import org.apache.cassandra.db.memtable.TestMemtable;
 import org.apache.cassandra.dht.OrderPreservingPartitioner;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.TokenMetadata;
+import org.apache.cassandra.schema.MemtableParams;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.SchemaKeyspaceTables;
 import org.apache.cassandra.service.StorageService;
@@ -37,6 +43,8 @@
 
 import static java.lang.String.format;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -280,6 +288,14 @@
                                         row(KEYSPACE_PER_TEST, true, map("class", "org.apache.cassandra.locator.SimpleStrategy", "replication_factor", "1")),
                                         row(ks1, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER_REMOTE, "3")));
 
+        schemaChange("ALTER KEYSPACE " + ks1 + " WITH replication = { 'class' : 'NetworkTopologyStrategy', '" + DATA_CENTER_REMOTE + "': 3 }");
+
+        // Removal is a two-step process as the "0" filter has been removed from NTS.prepareOptions
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(KEYSPACE, true, map("class", "org.apache.cassandra.locator.SimpleStrategy", "replication_factor", "1")),
+                                        row(KEYSPACE_PER_TEST, true, map("class", "org.apache.cassandra.locator.SimpleStrategy", "replication_factor", "1")),
+                                        row(ks1, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER_REMOTE, "3")));
+
         // The auto-expansion should not change existing replication counts; do not let the user shoot themselves in the foot
         schemaChange("ALTER KEYSPACE " + ks1 + " WITH replication = { 'class' : 'NetworkTopologyStrategy', 'replication_factor' : 1 } AND durable_writes=True");
 
@@ -339,29 +355,93 @@
                                         row(ks1, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER, "2", DATA_CENTER_REMOTE, "2")));
     }
 
-    /**
-     * Test {@link ConfigurationException} thrown on alter keyspace to no DC option in replication configuration.
-     */
     @Test
-    public void testAlterKeyspaceWithNoOptionThrowsConfigurationException() throws Throwable
+    public void testDefaultRF() throws Throwable
     {
-        // Create keyspaces
-        execute("CREATE KEYSPACE testABC WITH replication={ 'class' : 'NetworkTopologyStrategy', '" + DATA_CENTER + "' : 3 }");
-        execute("CREATE KEYSPACE testXYZ WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : 3 }");
+        TokenMetadata metadata = StorageService.instance.getTokenMetadata();
+        metadata.clearUnsafe();
+        InetAddressAndPort local = FBUtilities.getBroadcastAddressAndPort();
+        InetAddressAndPort remote = InetAddressAndPort.getByName("127.0.0.4");
+        metadata.updateHostId(UUID.randomUUID(), local);
+        metadata.updateNormalToken(new OrderPreservingPartitioner.StringToken("A"), local);
+        metadata.updateHostId(UUID.randomUUID(), remote);
+        metadata.updateNormalToken(new OrderPreservingPartitioner.StringToken("B"), remote);
 
-        // Try to alter the created keyspace without any option
-        assertInvalidThrow(ConfigurationException.class, "ALTER KEYSPACE testABC WITH replication={ 'class' : 'NetworkTopologyStrategy' }");
-        assertInvalidThrow(ConfigurationException.class, "ALTER KEYSPACE testXYZ WITH replication={ 'class' : 'SimpleStrategy' }");
+        DatabaseDescriptor.setDefaultKeyspaceRF(3);
 
-        // Make sure that the alter works as expected
-        alterTable("ALTER KEYSPACE testABC WITH replication={ 'class' : 'NetworkTopologyStrategy', '" + DATA_CENTER + "' : 2 }");
-        alterTable("ALTER KEYSPACE testXYZ WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : 2 }");
+        //ensure default rf is being taken into account during creation, and user can choose to override the default
+        String ks1 = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'SimpleStrategy' }");
+        String ks2 = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : 2 }");
+        String ks3 = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'NetworkTopologyStrategy' }");
+        String ks4 = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'NetworkTopologyStrategy', 'replication_factor' : 2 }");
 
-        // clean up
-        execute("DROP KEYSPACE IF EXISTS testABC");
-        execute("DROP KEYSPACE IF EXISTS testXYZ");
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks1, true, map("class","org.apache.cassandra.locator.SimpleStrategy","replication_factor", Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF()))),
+                                        row(ks2, true, map("class","org.apache.cassandra.locator.SimpleStrategy","replication_factor", "2")),
+                                        row(ks3, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER,
+                                                           Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF()), DATA_CENTER_REMOTE, Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF()))),
+                                        row(ks4, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER, "2", DATA_CENTER_REMOTE, "2")));
+
+        //ensure alter keyspace does not default to default rf unless altering from NTS to SS
+        //no change alter
+        schemaChange("ALTER KEYSPACE " + ks4 + " WITH durable_writes=true");
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks4, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER, "2", DATA_CENTER_REMOTE, "2")));
+        schemaChange("ALTER KEYSPACE " + ks4 + " WITH replication={ 'class' : 'NetworkTopologyStrategy' }");
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks4, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER, "2", DATA_CENTER_REMOTE, "2")));
+
+        // change from SS to NTS
+        // without specifying RF
+        schemaChange("ALTER KEYSPACE " + ks2 + " WITH replication={ 'class' : 'NetworkTopologyStrategy' } AND durable_writes=true");
+        // verify that RF of SS is retained
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks2, true, map("class","org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER, "2", DATA_CENTER_REMOTE, "2")));
+        // with specifying RF
+        schemaChange("ALTER KEYSPACE " + ks1 + " WITH replication={ 'class' : 'NetworkTopologyStrategy', 'replication_factor': '1' } AND durable_writes=true");
+        // verify that explicitly mentioned RF is taken into account
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks1, true, map("class","org.apache.cassandra.locator.NetworkTopologyStrategy", DATA_CENTER, "1", DATA_CENTER_REMOTE, "1")));
+
+        // change from NTS to SS
+        // without specifying RF
+        schemaChange("ALTER KEYSPACE " + ks4 + " WITH replication={ 'class' : 'SimpleStrategy' } AND durable_writes=true");
+        // verify that default RF is taken into account
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks4, true, map("class","org.apache.cassandra.locator.SimpleStrategy","replication_factor", Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF()))));
+        // with specifying RF
+        schemaChange("ALTER KEYSPACE " + ks3 + " WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : '1' } AND durable_writes=true");
+        // verify that explicitly mentioned RF is taken into account
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks3, true, map("class","org.apache.cassandra.locator.SimpleStrategy","replication_factor", "1")));
+
+        // verify updated default does not effect existing keyspaces
+        // create keyspaces
+        String ks5 = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'SimpleStrategy' }");
+        String ks6 = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'NetworkTopologyStrategy' }");
+        String oldRF = Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF());
+        // change default
+        DatabaseDescriptor.setDefaultKeyspaceRF(2);
+        // verify RF of existing keyspaces
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks5, true, map("class","org.apache.cassandra.locator.SimpleStrategy","replication_factor", oldRF)));
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(ks6, true, map("class", "org.apache.cassandra.locator.NetworkTopologyStrategy",
+                                                           DATA_CENTER, oldRF, DATA_CENTER_REMOTE, oldRF)));
+
+        //clean up config change
+        DatabaseDescriptor.setDefaultKeyspaceRF(1);
+
+        //clean up keyspaces
+        execute(String.format("DROP KEYSPACE IF EXISTS %s", ks1));
+        execute(String.format("DROP KEYSPACE IF EXISTS %s", ks2));
+        execute(String.format("DROP KEYSPACE IF EXISTS %s", ks3));
+        execute(String.format("DROP KEYSPACE IF EXISTS %s", ks4));
+        execute(String.format("DROP KEYSPACE IF EXISTS %s", ks5));
+        execute(String.format("DROP KEYSPACE IF EXISTS %s", ks6));
     }
 
+
     /**
      * Test {@link ConfigurationException} thrown when altering a keyspace to invalid DC option in replication configuration.
      */
@@ -431,6 +511,37 @@
         alterTable("alter table %s add v1 int");
     }
 
+    @Test(expected = InvalidRequestException.class)
+    public void testDropFixedAddVariable() throws Throwable
+    {
+        createTable("create table %s (k int, c int, v int, PRIMARY KEY (k, c))");
+        execute("alter table %s drop v");
+        execute("alter table %s add v varint");
+    }
+
+    @Test(expected = InvalidRequestException.class)
+    public void testDropFixedCollectionAddVariableCollection() throws Throwable
+    {
+        createTable("create table %s (k int, c int, v list<int>, PRIMARY KEY (k, c))");
+        execute("alter table %s drop v");
+        execute("alter table %s add v list<varint>");
+    }
+
+    @Test(expected = InvalidRequestException.class)
+    public void testDropSimpleAddComplex() throws Throwable
+    {
+        createTable("create table %s (k int, c int, v set<text>, PRIMARY KEY (k, c))");
+        execute("alter table %s drop v");
+        execute("alter table %s add v blob");
+    }
+
+    @Test(expected = SyntaxException.class)
+    public void renameToEmptyTest() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int, c1 int, v int, PRIMARY KEY (k, c1))");
+        execute("ALTER TABLE %s RENAME c1 TO \"\"");
+    }
+
     @Test
     // tests CASSANDRA-9565
     public void testDoubleWith() throws Throwable
@@ -444,71 +555,103 @@
     }
 
     @Test
+    public void testAlterTableWithMemtable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))");
+        assertSame(MemtableParams.DEFAULT.factory(), getCurrentColumnFamilyStore().metadata().params.memtable.factory());
+        assertSchemaOption("memtable", null);
+
+        testMemtableConfig("skiplist", SkipListMemtable.FACTORY, SkipListMemtable.class);
+        testMemtableConfig("test_fullname", TestMemtable.FACTORY, SkipListMemtable.class);
+        testMemtableConfig("test_shortname", SkipListMemtable.FACTORY, SkipListMemtable.class);
+
+        // verify memtable does not change on other ALTER
+        alterTable("ALTER TABLE %s"
+                   + " WITH compression = {'class': 'LZ4Compressor'};");
+        assertSchemaOption("memtable", "test_shortname");
+
+        testMemtableConfig("default", MemtableParams.DEFAULT.factory(), SkipListMemtable.class);
+
+
+        assertAlterTableThrowsException(ConfigurationException.class,
+                                        "The 'class_name' option must be specified.",
+                                        "ALTER TABLE %s"
+                                           + " WITH memtable = 'test_empty_class';");
+
+        assertAlterTableThrowsException(ConfigurationException.class,
+                                        "Memtable class org.apache.cassandra.db.memtable.SkipListMemtable does not accept any futher parameters, but {invalid=throw} were given.",
+                                        "ALTER TABLE %s"
+                                           + " WITH memtable = 'test_invalid_param';");
+
+        assertAlterTableThrowsException(ConfigurationException.class,
+                                        "Could not create memtable factory for class NotExisting",
+                                        "ALTER TABLE %s"
+                                           + " WITH memtable = 'test_unknown_class';");
+
+        assertAlterTableThrowsException(ConfigurationException.class,
+                                        "Memtable class org.apache.cassandra.db.memtable.TestMemtable does not accept any futher parameters, but {invalid=throw} were given.",
+                                        "ALTER TABLE %s"
+                                           + " WITH memtable = 'test_invalid_extra_param';");
+
+        assertAlterTableThrowsException(ConfigurationException.class,
+                                        "Could not create memtable factory for class " + CreateTest.InvalidMemtableFactoryMethod.class.getName(),
+                                        "ALTER TABLE %s"
+                                           + " WITH memtable = 'test_invalid_factory_method';");
+
+        assertAlterTableThrowsException(ConfigurationException.class,
+                                        "Could not create memtable factory for class " + CreateTest.InvalidMemtableFactoryField.class.getName(),
+                                        "ALTER TABLE %s"
+                                           + " WITH memtable = 'test_invalid_factory_field';");
+
+        assertAlterTableThrowsException(ConfigurationException.class,
+                                        "Memtable configuration \"unknown\" not found.",
+                                        "ALTER TABLE %s"
+                                           + " WITH memtable = 'unknown';");
+    }
+
+    void assertSchemaOption(String option, Object expected) throws Throwable
+    {
+        assertRows(execute(format("SELECT " + option + " FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
+                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
+                                  SchemaKeyspaceTables.TABLES),
+                           KEYSPACE,
+                           currentTable()),
+                   row(expected));
+    }
+
+    private void testMemtableConfig(String memtableConfig, Memtable.Factory factoryInstance, Class<? extends Memtable> memtableClass) throws Throwable
+    {
+        alterTable("ALTER TABLE %s"
+                   + " WITH memtable = '" + memtableConfig + "';");
+        assertSame(factoryInstance, getCurrentColumnFamilyStore().metadata().params.memtable.factory());
+        Assert.assertTrue(memtableClass.isInstance(getCurrentColumnFamilyStore().getTracker().getView().getCurrentMemtable()));
+        assertSchemaOption("memtable", MemtableParams.DEFAULT.configurationKey().equals(memtableConfig) ? null : memtableConfig);
+    }
+
+    @Test
     public void testAlterTableWithCompression() throws Throwable
     {
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor"));
 
         alterTable("ALTER TABLE %s WITH compression = { 'class' : 'SnappyCompressor', 'chunk_length_in_kb' : 32 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor"));
 
         alterTable("ALTER TABLE %s WITH compression = { 'class' : 'LZ4Compressor', 'chunk_length_in_kb' : 64 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "64", "class", "org.apache.cassandra.io.compress.LZ4Compressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "64", "class", "org.apache.cassandra.io.compress.LZ4Compressor"));
 
         alterTable("ALTER TABLE %s WITH compression = { 'class' : 'LZ4Compressor', 'min_compress_ratio' : 2 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor", "min_compress_ratio", "2.0")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor", "min_compress_ratio", "2.0"));
 
         alterTable("ALTER TABLE %s WITH compression = { 'class' : 'LZ4Compressor', 'min_compress_ratio' : 1 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor", "min_compress_ratio", "1.0")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor", "min_compress_ratio", "1.0"));
 
         alterTable("ALTER TABLE %s WITH compression = { 'class' : 'LZ4Compressor', 'min_compress_ratio' : 0 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor"));
 
         alterTable("ALTER TABLE %s WITH compression = { 'class' : 'SnappyCompressor', 'chunk_length_in_kb' : 32 };");
         alterTable("ALTER TABLE %s WITH compression = { 'enabled' : 'false'};");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("enabled", "false")));
+        assertSchemaOption("compression", map("enabled", "false"));
 
         assertAlterTableThrowsException(ConfigurationException.class,
                                         "Missing sub-option 'class' for the 'compression' option.",
@@ -543,7 +686,7 @@
     {
         assertThrowsException(clazz, msg, () -> {alterKeyspaceMayThrow(stmt);});
     }
-    
+
     private void assertAlterTableThrowsException(Class<? extends Throwable> clazz, String msg, String stmt)
     {
         assertThrowsException(clazz, msg, () -> {alterTableMayThrow(stmt);});
@@ -655,4 +798,111 @@
         assertInvalidMessage("Cannot add new column to a COMPACT STORAGE table",
                              "ALTER TABLE %s ADD column1 text");
     }
+
+    @Test
+    public void testAlterTableWithoutCreateTableOrIfExistsClause()
+    {
+        String tbl1 = KEYSPACE + "." + createTableName();
+        assertAlterTableThrowsException(InvalidRequestException.class, String.format("Table '%s' doesn't exist", tbl1),
+                                        "ALTER TABLE %s ADD myCollection list<text>;");
+    }
+
+    @Test
+    public void testAlterTableWithoutCreateTableWithIfExists() throws Throwable
+    {
+        String tbl1 = KEYSPACE + "." + createTableName();
+        assertNull(execute(String.format("ALTER TABLE IF EXISTS %s ADD myCollection list<text>;", tbl1)));
+    }
+
+    @Test
+    public void testAlterTableWithIfExists() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)); ");
+        alterTable("ALTER TABLE IF EXISTS %s ADD myCollection list<text>;");
+        execute("INSERT INTO %s (a, b, myCollection) VALUES (1, 2, ['first element']);");
+
+        assertRows(execute("SELECT * FROM %s;"), row(1, 2, list("first element")));
+    }
+
+    @Test
+    public void testAlterTableAddColWithIfNotExists() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)); ");
+        alterTable("ALTER TABLE %s ADD IF NOT EXISTS a int;");
+        execute("INSERT INTO %s (a, b) VALUES (1, 2);");
+
+        assertRows(execute("SELECT * FROM %s;"), row(1, 2));
+    }
+
+    @Test
+    public void testAlterTableAddExistingColumnWithoutIfExists()
+    {
+        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)); ");
+        assertAlterTableThrowsException(InvalidRequestException.class,
+                                        String.format("Column with name '%s' already exists", "a"),
+                                        "ALTER TABLE IF EXISTS %s ADD a int");
+    }
+
+    @Test
+    public void testAlterTableDropNotExistingColWithIfExists() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)); ");
+        alterTable("ALTER TABLE %s DROP IF EXISTS myCollection");
+        execute("INSERT INTO %s (a, b) VALUES (1, 2);");
+
+        assertRows(execute("SELECT * FROM %s;"), row(1, 2));
+    }
+
+    @Test
+    public void testAlterTableDropExistingColWithIfExists() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, myCollection list<text>, PRIMARY KEY (a, b)); ");
+        alterTable("ALTER TABLE %s DROP IF EXISTS myCollection");
+        execute("INSERT INTO %s (a, b) VALUES (1, 2);");
+
+        assertRows(execute("SELECT * FROM %s;"), row(1, 2));
+    }
+
+    @Test
+    public void testAlterTableRenameExistingColWithIfExists() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, myCollection list<text>, PRIMARY KEY (a, b)); ");
+        alterTable("ALTER TABLE %s RENAME IF EXISTS a TO y AND b to z");
+        execute("INSERT INTO %s (y, z, myCollection) VALUES (1, 2, ['first element']);");
+        assertRows(execute("SELECT * FROM %s;"), row(1, 2, list("first element")));
+    }
+
+    @Test
+    public void testAlterTypeWithIfExists() throws Throwable
+    {
+        // frozen UDT used directly in a partition key
+        String type1 = createType("CREATE TYPE %s (v1 int)");
+        String table1 = createTable("CREATE TABLE %s (pk frozen<" + type1 + ">, val int, PRIMARY KEY(pk));");
+
+        // frozen UDT used in a frozen UDT used in a partition key
+        String type2 = createType("CREATE TYPE %s (v1 frozen<" + type1 + ">, v2 frozen<" + type1 + ">)");
+        String table2 = createTable("CREATE TABLE %s (pk frozen<" + type2 + ">, val int, PRIMARY KEY(pk));");
+
+        // frozen UDT used in a frozen collection used in a partition key
+        String table3 = createTable("CREATE TABLE %s (pk frozen<list<frozen<" + type1 + ">>>, val int, PRIMARY KEY(pk));");
+
+        // assert that ALTER fails and that the error message contains all the names of the table referencing it
+        assertInvalidMessage(table1, format("ALTER TYPE %s.%s ADD v2 int;", keyspace(), type1));
+        assertInvalidMessage(table2, format("ALTER TYPE %s.%s ADD v2 int;", keyspace(), type1));
+        assertInvalidMessage(table3, format("ALTER TYPE %s.%s ADD v2 int;", keyspace(), type1));
+    }
+
+    @Test
+    public void testAlterKeyspaceWithIfExists() throws Throwable
+    {
+        String ks1 = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : 1 }");
+        execute("ALTER KEYSPACE IF EXISTS " + ks1 + " WITH durable_writes=true");
+
+        assertRowsIgnoringOrderAndExtra(execute("SELECT keyspace_name, durable_writes, replication FROM system_schema.keyspaces"),
+                                        row(KEYSPACE, true, map("class", "org.apache.cassandra.locator.SimpleStrategy", "replication_factor", "1")),
+                                        row(KEYSPACE_PER_TEST, true, map("class", "org.apache.cassandra.locator.SimpleStrategy", "replication_factor", "1")),
+                                        row(ks1, true, map("class", "org.apache.cassandra.locator.SimpleStrategy", "replication_factor", "1")));
+
+        assertInvalidThrow(InvalidRequestException.class, "ALTER KEYSPACE ks1 WITH replication= { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }");
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/AutoSnapshotTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/AutoSnapshotTest.java
new file mode 100644
index 0000000..eedcdb0
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/AutoSnapshotTest.java
@@ -0,0 +1,192 @@
+/*
+ * 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.cql3.validation.operations;
+
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Map;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.DurationSpec;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
+import org.assertj.core.api.Condition;
+
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static java.lang.String.format;
+import static org.apache.cassandra.db.ColumnFamilyStore.SNAPSHOT_DROP_PREFIX;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(Parameterized.class)
+public class AutoSnapshotTest extends CQLTester
+{
+    static int TTL_SECS = 1;
+
+    public static Boolean enabledBefore;
+    public static DurationSpec.IntSecondsBound ttlBefore;
+
+    @BeforeClass
+    public static void beforeClass()
+    {
+        enabledBefore = DatabaseDescriptor.isAutoSnapshot();
+        ttlBefore = DatabaseDescriptor.getAutoSnapshotTtl();
+    }
+
+    @AfterClass
+    public static void afterClass()
+    {
+        DatabaseDescriptor.setAutoSnapshot(enabledBefore);
+        DatabaseDescriptor.setAutoSnapshotTtl(ttlBefore);
+    }
+
+    // Dynamic parameters used during tests
+    @Parameterized.Parameter(0)
+    public Boolean autoSnapshotEnabled;
+
+    @Parameterized.Parameter(1)
+    public DurationSpec.IntSecondsBound autoSnapshotTTl;
+
+    @Before
+    public void beforeTest() throws Throwable
+    {
+        super.beforeTest();
+        // Make sure we're testing the correct parameterized settings
+        DatabaseDescriptor.setAutoSnapshot(autoSnapshotEnabled);
+        DatabaseDescriptor.setAutoSnapshotTtl(autoSnapshotTTl);
+    }
+
+    // Test for all values of [auto_snapshot=[true,false], ttl=[1s, null]
+    @Parameterized.Parameters( name = "enabled={0},ttl={1}" )
+    public static Collection options() {
+        return Arrays.asList(new Object[][] {
+        { true, new DurationSpec.IntSecondsBound(TTL_SECS, SECONDS) },
+        { false, new DurationSpec.IntSecondsBound(TTL_SECS, SECONDS) },
+        { true, null },
+        { false, null },
+        });
+    }
+
+    @Test
+    public void testAutoSnapshotOnTrucate() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY(a, b))");
+        // Check there are no snapshots
+        ColumnFamilyStore tableDir = getCurrentColumnFamilyStore();
+        assertThat(tableDir.listSnapshots()).isEmpty();
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 1);
+
+        flush();
+
+        execute("DROP TABLE %s");
+
+        verifyAutoSnapshot(SNAPSHOT_DROP_PREFIX, tableDir, currentTable());
+    }
+
+    @Test
+    public void testAutoSnapshotOnDrop() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY(a, b))");
+        // Check there are no snapshots
+        ColumnFamilyStore tableDir = getCurrentColumnFamilyStore();
+        assertThat(tableDir.listSnapshots()).isEmpty();
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 1);
+
+        flush();
+
+        execute("DROP TABLE %s");
+
+        verifyAutoSnapshot(SNAPSHOT_DROP_PREFIX, tableDir, currentTable());
+    }
+
+    @Test
+    public void testAutoSnapshotOnDropKeyspace() throws Throwable
+    {
+        // Create tables A and B and flush
+        ColumnFamilyStore tableA = createAndPopulateTable();
+        ColumnFamilyStore tableB = createAndPopulateTable();
+        flush();
+
+        // Check no snapshots
+        assertThat(tableA.listSnapshots()).isEmpty();
+        assertThat(tableB.listSnapshots()).isEmpty();
+
+        // Drop keyspace, should have snapshot for table A and B
+        execute(format("DROP KEYSPACE %s", keyspace()));
+        verifyAutoSnapshot(SNAPSHOT_DROP_PREFIX, tableA, tableA.name);
+        verifyAutoSnapshot(SNAPSHOT_DROP_PREFIX, tableB, tableB.name);
+    }
+
+    private ColumnFamilyStore createAndPopulateTable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY(a, b))");
+        // Check there are no snapshots
+        ColumnFamilyStore tableA = getCurrentColumnFamilyStore();
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 0, 0);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, 1, 1);
+        return tableA;
+    }
+
+    /**
+     * Verify that:
+     * - A snapshot is created when auto_snapshot = true.
+     * - TTL is added to the snapshot when auto_snapshot_ttl != null
+     */
+    private void verifyAutoSnapshot(String snapshotPrefix, ColumnFamilyStore tableDir, String expectedTableName)
+    {
+        Map<String, TableSnapshot> snapshots = tableDir.listSnapshots();
+        if (autoSnapshotEnabled)
+        {
+            assertThat(snapshots).hasSize(1);
+            assertThat(snapshots).hasKeySatisfying(new Condition<>(k -> k.startsWith(snapshotPrefix), "is dropped snapshot"));
+            TableSnapshot snapshot = snapshots.values().iterator().next();
+            assertThat(snapshot.getTableName()).isEqualTo(expectedTableName);
+            if (autoSnapshotTTl == null)
+            {
+                // check that the snapshot has NO TTL
+                assertThat(snapshot.isExpiring()).isFalse();
+            }
+            else
+            {
+                // check that snapshot has TTL and is expired after 1 second
+                assertThat(snapshot.isExpiring()).isTrue();
+                Uninterruptibles.sleepUninterruptibly(TTL_SECS, SECONDS);
+                assertThat(snapshot.isExpired(Instant.now())).isTrue();
+            }
+        }
+        else
+        {
+            // No snapshot should be created when auto_snapshot = false
+            assertThat(snapshots).isEmpty();
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageSplit1Test.java b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageSplit1Test.java
new file mode 100644
index 0000000..80bf51c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageSplit1Test.java
@@ -0,0 +1,2400 @@
+/*
+ * 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.cql3.validation.operations;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.UUID;
+
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.validation.entities.SecondaryIndexTest;
+
+import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
+import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.fail;
+
+public class CompactStorageSplit1Test extends CQLTester
+{
+    public static final String compactOption = " WITH COMPACT STORAGE";
+
+    @Test
+    public void testSparseCompactTableIndex() throws Throwable
+    {
+        createTable("CREATE TABLE %s (key ascii PRIMARY KEY, val ascii) WITH COMPACT STORAGE");
+
+        // Indexes are allowed only on the sparse compact tables
+        createIndex("CREATE INDEX ON %s(val)");
+        for (int i = 0; i < 10; i++)
+            execute("INSERT INTO %s (key, val) VALUES (?, ?)", Integer.toString(i), Integer.toString(i * 10));
+
+        alterTable("ALTER TABLE %s DROP COMPACT STORAGE");
+
+        assertRows(execute("SELECT * FROM %s WHERE val = '50'"),
+                   row("5", null, "50", null));
+        assertRows(execute("SELECT * FROM %s WHERE key = '5'"),
+                   row("5", null, "50", null));
+    }
+
+    @Test
+    public void before() throws Throwable
+    {
+        createTable("CREATE TABLE %s (key TEXT, column TEXT, value BLOB, PRIMARY KEY (key, column)) WITH COMPACT STORAGE");
+
+        ByteBuffer largeBytes = ByteBuffer.wrap(new byte[100000]);
+        execute("INSERT INTO %s (key, column, value) VALUES (?, ?, ?)", "test", "a", largeBytes);
+        ByteBuffer smallBytes = ByteBuffer.wrap(new byte[10]);
+        execute("INSERT INTO %s (key, column, value) VALUES (?, ?, ?)", "test", "c", smallBytes);
+
+        flush();
+
+        assertRows(execute("SELECT column FROM %s WHERE key = ? AND column IN (?, ?, ?)", "test", "c", "a", "b"),
+                   row("a"),
+                   row("c"));
+    }
+
+    @Test
+    public void testStaticCompactTables() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k text PRIMARY KEY, v1 int, v2 text) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (k, v1, v2) values (?, ?, ?)", "first", 1, "value1");
+        execute("INSERT INTO %s (k, v1, v2) values (?, ?, ?)", "second", 2, "value2");
+        execute("INSERT INTO %s (k, v1, v2) values (?, ?, ?)", "third", 3, "value3");
+
+        assertRows(execute("SELECT * FROM %s WHERE k = ?", "first"),
+                   row("first", 1, "value1")
+        );
+
+        assertRows(execute("SELECT v2 FROM %s WHERE k = ?", "second"),
+                   row("value2")
+        );
+
+        // Murmur3 order
+        assertRows(execute("SELECT * FROM %s"),
+                   row("third", 3, "value3"),
+                   row("second", 2, "value2"),
+                   row("first", 1, "value1")
+        );
+    }
+
+    @Test
+    public void testCompactStorageUpdateWithNull() throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering_1 int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering_1)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 1, 1)");
+
+        flush();
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ?", null, 0, 0);
+
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))", 0, 0, 1),
+                   row(0, 1, 1)
+        );
+    }
+
+    /**
+     * Migrated from cql_tests.py:TestCQL.collection_compact_test()
+     */
+    @Test
+    public void testCompactCollections() throws Throwable
+    {
+        String tableName = KEYSPACE + "." + createTableName();
+        assertInvalid(String.format("CREATE TABLE %s (user ascii PRIMARY KEY, mails list < text >) WITH COMPACT STORAGE;", tableName));
+    }
+
+    /**
+     * Check for a table with counters,
+     * migrated from cql_tests.py:TestCQL.counters_test()
+     */
+    @Test
+    public void testCounters() throws Throwable
+    {
+        createTable("CREATE TABLE %s (userid int, url text, total counter, PRIMARY KEY (userid, url)) WITH COMPACT STORAGE");
+
+        execute("UPDATE %s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(1L));
+
+        execute("UPDATE %s SET total = total - 4 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(-3L));
+
+        execute("UPDATE %s SET total = total+1 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(-2L));
+
+        execute("UPDATE %s SET total = total -2 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(-4L));
+
+        execute("UPDATE %s SET total += 6 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(2L));
+
+        execute("UPDATE %s SET total -= 1 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(1L));
+
+        execute("UPDATE %s SET total += -2 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(-1L));
+
+        execute("UPDATE %s SET total -= -2 WHERE userid = 1 AND url = 'http://foo.com'");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(1L));
+    }
+
+
+    @Test
+    public void testCounterFiltering() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, a counter) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 10; i++)
+            execute("UPDATE %s SET a = a + ? WHERE k = ?", (long) i, i);
+
+        execute("UPDATE %s SET a = a + ? WHERE k = ?", 6L, 10);
+
+        // GT
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a > ? ALLOW FILTERING", 5L),
+                                row(6, 6L),
+                                row(7, 7L),
+                                row(8, 8L),
+                                row(9, 9L),
+                                row(10, 6L));
+
+        // GTE
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a >= ? ALLOW FILTERING", 6L),
+                                row(6, 6L),
+                                row(7, 7L),
+                                row(8, 8L),
+                                row(9, 9L),
+                                row(10, 6L));
+
+        // LT
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a < ? ALLOW FILTERING", 3L),
+                                row(0, 0L),
+                                row(1, 1L),
+                                row(2, 2L));
+
+        // LTE
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a <= ? ALLOW FILTERING", 3L),
+                                row(0, 0L),
+                                row(1, 1L),
+                                row(2, 2L),
+                                row(3, 3L));
+
+        // EQ
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a = ? ALLOW FILTERING", 6L),
+                                row(6, 6L),
+                                row(10, 6L));
+    }
+
+    /**
+     * Test for the bug of #11726.
+     */
+    @Test
+    public void testCounterAndColumnSelection() throws Throwable
+    {
+        for (String compactStorageClause : new String[]{ "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (k int PRIMARY KEY, c counter)" + compactStorageClause);
+
+            // Flush 2 updates in different sstable so that the following select does a merge, which is what triggers
+            // the problem from #11726
+
+            execute("UPDATE %s SET c = c + ? WHERE k = ?", 1L, 0);
+
+            flush();
+
+            execute("UPDATE %s SET c = c + ? WHERE k = ?", 1L, 0);
+
+            flush();
+
+            // Querying, but not including the counter. Pre-CASSANDRA-11726, this made us query the counter but include
+            // it's value, which broke at merge (post-CASSANDRA-11726 are special cases to never skip values).
+            assertRows(execute("SELECT k FROM %s"), row(0));
+        }
+    }
+
+    /*
+     * Check that a counter batch works as intended
+     */
+    @Test
+    public void testCounterBatch() throws Throwable
+    {
+        createTable("CREATE TABLE %s (userid int, url text, total counter, PRIMARY KEY (userid, url)) WITH COMPACT STORAGE");
+
+        // Ensure we handle updates to the same CQL row in the same partition properly
+        execute("BEGIN UNLOGGED BATCH " +
+                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
+                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
+                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
+                "APPLY BATCH; ");
+        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(3L));
+
+        // Ensure we handle different CQL rows in the same partition properly
+        execute("BEGIN UNLOGGED BATCH " +
+                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://bar.com'; " +
+                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://baz.com'; " +
+                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://bad.com'; " +
+                "APPLY BATCH; ");
+        assertRows(execute("SELECT url, total FROM %s WHERE userid = 1"),
+                   row("http://bad.com", 1L),
+                   row("http://bar.com", 1L),
+                   row("http://baz.com", 1L),
+                   row("http://foo.com", 3L)); // from previous batch
+
+        // Different counters in the same CQL Row
+        createTable("CREATE TABLE %s (userid int, url text, first counter, second counter, third counter, PRIMARY KEY (userid, url))");
+        execute("BEGIN UNLOGGED BATCH " +
+                "UPDATE %1$s SET first = first + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
+                "UPDATE %1$s SET first = first + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
+                "UPDATE %1$s SET second = second + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
+                "APPLY BATCH; ");
+        assertRows(execute("SELECT first, second, third FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
+                   row(2L, 1L, null));
+
+        // Different counters in different CQL Rows
+        execute("BEGIN UNLOGGED BATCH " +
+                "UPDATE %1$s SET first = first + 1 WHERE userid = 1 AND url = 'http://bad.com'; " +
+                "UPDATE %1$s SET first = first + 1, second = second + 1 WHERE userid = 1 AND url = 'http://bar.com'; " +
+                "UPDATE %1$s SET first = first - 1, second = second - 1 WHERE userid = 1 AND url = 'http://bar.com'; " +
+                "UPDATE %1$s SET second = second + 1 WHERE userid = 1 AND url = 'http://baz.com'; " +
+                "APPLY BATCH; ");
+        assertRows(execute("SELECT url, first, second, third FROM %s WHERE userid = 1"),
+                   row("http://bad.com", 1L, null, null),
+                   row("http://bar.com", 0L, 0L, null),
+                   row("http://baz.com", null, 1L, null),
+                   row("http://foo.com", 2L, 1L, null)); // from previous batch
+
+
+        // Different counters in different partitions
+        execute("BEGIN UNLOGGED BATCH " +
+                "UPDATE %1$s SET first = first + 1 WHERE userid = 2 AND url = 'http://bad.com'; " +
+                "UPDATE %1$s SET first = first + 1, second = second + 1 WHERE userid = 3 AND url = 'http://bar.com'; " +
+                "UPDATE %1$s SET first = first - 1, second = second - 1 WHERE userid = 4 AND url = 'http://bar.com'; " +
+                "UPDATE %1$s SET second = second + 1 WHERE userid = 5 AND url = 'http://baz.com'; " +
+                "APPLY BATCH; ");
+        assertRowsIgnoringOrder(execute("SELECT userid, url, first, second, third FROM %s WHERE userid IN (2, 3, 4, 5)"),
+                                row(2, "http://bad.com", 1L, null, null),
+                                row(3, "http://bar.com", 1L, 1L, null),
+                                row(4, "http://bar.com", -1L, -1L, null),
+                                row(5, "http://baz.com", null, 1L, null));
+    }
+
+    /**
+     * from FrozenCollectionsTest
+     */
+
+    @Test
+    public void testClusteringKeyUsageSet() throws Throwable
+    {
+        testClusteringKeyUsage("set<int>",
+                               set(),
+                               set(1, 2, 3),
+                               set(4, 5, 6),
+                               set(7, 8, 9));
+    }
+
+    @Test
+    public void testClusteringKeyUsageList() throws Throwable
+    {
+        testClusteringKeyUsage("list<int>",
+                               list(),
+                               list(1, 2, 3),
+                               list(4, 5, 6),
+                               list(7, 8, 9));
+    }
+
+    @Test
+    public void testClusteringKeyUsageMap() throws Throwable
+    {
+        testClusteringKeyUsage("map<int, int>",
+                               map(),
+                               map(1, 10, 2, 20, 3, 30),
+                               map(4, 40, 5, 50, 6, 60),
+                               map(7, 70, 8, 80, 9, 90));
+    }
+
+    private void testClusteringKeyUsage(String type, Object v1, Object v2, Object v3, Object v4) throws Throwable
+    {
+        createTable(String.format("CREATE TABLE %%s (a int, b frozen<%s>, c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE",
+                                  type));
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v1, 1);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v2, 1);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v3, 0);
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v4, 0);
+
+        // overwrite with an update
+        execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v1);
+        execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v2);
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, v1, 0),
+                   row(0, v2, 0),
+                   row(0, v3, 0),
+                   row(0, v4, 0)
+        );
+
+        assertRows(execute("SELECT b FROM %s"),
+                   row(v1),
+                   row(v2),
+                   row(v3),
+                   row(v4)
+        );
+
+        assertRows(execute("SELECT * FROM %s LIMIT 2"),
+                   row(0, v1, 0),
+                   row(0, v2, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v3),
+                   row(0, v3, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v1),
+                   row(0, v1, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b IN ?", 0, list(v3, v1)),
+                   row(0, v1, 0),
+                   row(0, v3, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, v3),
+                   row(0, v4, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, v3),
+                   row(0, v3, 0),
+                   row(0, v4, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, v3),
+                   row(0, v1, 0),
+                   row(0, v2, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, v3),
+                   row(0, v1, 0),
+                   row(0, v2, 0),
+                   row(0, v3, 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, v2, v3),
+                   row(0, v3, 0)
+        );
+
+        execute("DELETE FROM %s WHERE a=? AND b=?", 0, v1);
+        execute("DELETE FROM %s WHERE a=? AND b=?", 0, v3);
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, v2, 0),
+                   row(0, v4, 0)
+        );
+    }
+
+    @Test
+    public void testNestedClusteringKeyUsage() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b frozen<map<set<int>, list<int>>>, c frozen<set<int>>, d int, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(), set(), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(), list(1, 2, 3)), set(), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0);
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, map(), set(), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT b FROM %s"),
+                   row(map()),
+                   row(map(set(), list(1, 2, 3))),
+                   row(map(set(1, 2, 3), list(1, 2, 3))),
+                   row(map(set(4, 5, 6), list(1, 2, 3))),
+                   row(map(set(7, 8, 9), list(1, 2, 3)))
+        );
+
+        assertRows(execute("SELECT c FROM %s"),
+                   row(set()),
+                   row(set()),
+                   row(set(1, 2, 3)),
+                   row(set(1, 2, 3)),
+                   row(set(1, 2, 3))
+        );
+
+        assertRows(execute("SELECT * FROM %s LIMIT 3"),
+                   row(0, map(), set(), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=0 ORDER BY b DESC LIMIT 4"),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map()),
+                   row(0, map(), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(), list(1, 2, 3))),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(1, 2, 3), list(1, 2, 3))),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c) IN ?", 0, list(tuple(map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)),
+                                                                                 tuple(map(), set()))),
+                   row(0, map(), set(), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(), set(), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(), set(), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, map(set(1, 2, 3), list(1, 2, 3)), map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set());
+        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set()));
+
+        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set());
+        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()));
+
+        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3));
+        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)));
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+    }
+
+    @Test
+    public void testNestedClusteringKeyUsageWithReverseOrder() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b frozen<map<set<int>, list<int>>>, c frozen<set<int>>, d int, " +
+                    "PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE AND CLUSTERING ORDER BY (b DESC)");
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(), set(), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(), list(1, 2, 3)), set(), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0);
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0),
+                   row(0, map(), set(), 0)
+        );
+
+        assertRows(execute("SELECT b FROM %s"),
+                   row(map(set(7, 8, 9), list(1, 2, 3))),
+                   row(map(set(4, 5, 6), list(1, 2, 3))),
+                   row(map(set(1, 2, 3), list(1, 2, 3))),
+                   row(map(set(), list(1, 2, 3))),
+                   row(map())
+        );
+
+        assertRows(execute("SELECT c FROM %s"),
+                   row(set(1, 2, 3)),
+                   row(set(1, 2, 3)),
+                   row(set(1, 2, 3)),
+                   row(set()),
+                   row(set())
+        );
+
+        assertRows(execute("SELECT * FROM %s LIMIT 3"),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=0 ORDER BY b DESC LIMIT 4"),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map()),
+                   row(0, map(), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(), list(1, 2, 3))),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(1, 2, 3), list(1, 2, 3))),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c) IN ?", 0, list(tuple(map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)),
+                                                                                 tuple(map(), set()))),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0),
+                   row(0, map(), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(), list(1, 2, 3)), set(), 0),
+                   row(0, map(), set(), 0)
+        );
+
+        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, map(set(1, 2, 3), list(1, 2, 3)), map(set(4, 5, 6), list(1, 2, 3))),
+                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+
+        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set());
+        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set()));
+
+        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set());
+        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()));
+
+        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3));
+        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)));
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
+                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
+        );
+    }
+
+    @Test
+    public void testNormalColumnUsage() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b frozen<map<set<int>, list<int>>>, c frozen<set<int>>)" + compactOption);
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, map(), set());
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, map(set(), list(99999, 999999, 99999)), set());
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 2, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3));
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 3, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3));
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 4, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3));
+
+        // overwrite with update
+        execute("UPDATE %s SET b=? WHERE a=?", map(set(), list(1, 2, 3)), 1);
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s"),
+                                row(0, map(), set()),
+                                row(1, map(set(), list(1, 2, 3)), set()),
+                                row(2, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3)),
+                                row(3, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)),
+                                row(4, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3))
+        );
+
+        assertRowsIgnoringOrder(execute("SELECT b FROM %s"),
+                                row(map()),
+                                row(map(set(), list(1, 2, 3))),
+                                row(map(set(1, 2, 3), list(1, 2, 3))),
+                                row(map(set(4, 5, 6), list(1, 2, 3))),
+                                row(map(set(7, 8, 9), list(1, 2, 3)))
+        );
+
+        assertRowsIgnoringOrder(execute("SELECT c FROM %s"),
+                                row(set()),
+                                row(set()),
+                                row(set(1, 2, 3)),
+                                row(set(1, 2, 3)),
+                                row(set(1, 2, 3))
+        );
+
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 3),
+                                row(3, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3))
+        );
+
+        execute("UPDATE %s SET b=? WHERE a=?", null, 1);
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 1),
+                                row(1, null, set())
+        );
+
+        execute("UPDATE %s SET b=? WHERE a=?", map(), 1);
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 1),
+                                row(1, map(), set())
+        );
+
+        execute("UPDATE %s SET c=? WHERE a=?", null, 2);
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 2),
+                                row(2, map(set(1, 2, 3), list(1, 2, 3)), null)
+        );
+
+        execute("UPDATE %s SET c=? WHERE a=?", set(), 2);
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 2),
+                                row(2, map(set(1, 2, 3), list(1, 2, 3)), set())
+        );
+
+        execute("DELETE b FROM %s WHERE a=?", 3);
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 3),
+                                row(3, null, set(1, 2, 3))
+        );
+
+        execute("DELETE c FROM %s WHERE a=?", 4);
+        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 4),
+                                row(4, map(set(7, 8, 9), list(1, 2, 3)), null)
+        );
+    }
+
+    /**
+     * from SecondaryIndexTest
+     */
+    @Test
+    public void testCompactTableWithValueOver64k() throws Throwable
+    {
+        createTable("CREATE TABLE %s(a int, b blob, PRIMARY KEY (a)) WITH COMPACT STORAGE");
+        createIndex("CREATE INDEX ON %s(b)");
+        failInsert("INSERT INTO %s (a, b) VALUES (0, ?)", ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
+        failInsert("INSERT INTO %s (a, b) VALUES (0, ?) IF NOT EXISTS", ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
+        failInsert("BEGIN BATCH\n" +
+                   "INSERT INTO %s (a, b) VALUES (0, ?);\n" +
+                   "APPLY BATCH",
+                   ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
+        failInsert("BEGIN BATCH\n" +
+                   "INSERT INTO %s (a, b) VALUES (0, ?) IF NOT EXISTS;\n" +
+                   "APPLY BATCH",
+                   ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
+    }
+
+    public void failInsert(String insertCQL, Object... args) throws Throwable
+    {
+        try
+        {
+            execute(insertCQL, args);
+            fail("Expected statement to fail validation");
+        }
+        catch (Exception e)
+        {
+            // as expected
+        }
+    }
+
+    /**
+     * Migrated from cql_tests.py:TestCQL.invalid_clustering_indexing_test()
+     */
+    @Test
+    public void testIndexesOnClusteringInvalid() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b))) WITH COMPACT STORAGE");
+        assertInvalid("CREATE INDEX ON %s (a)");
+        assertInvalid("CREATE INDEX ON %s (b)");
+
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        assertInvalid("CREATE INDEX ON %s (a)");
+        assertInvalid("CREATE INDEX ON %s (b)");
+        assertInvalid("CREATE INDEX ON %s (c)");
+    }
+
+    @Test
+    public void testEmptyRestrictionValueWithSecondaryIndexAndCompactTables() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk blob, c blob, v blob, PRIMARY KEY ((pk), c)) WITH COMPACT STORAGE");
+        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
+                             "CREATE INDEX on %s(c)");
+
+        createTable("CREATE TABLE %s (pk blob PRIMARY KEY, v blob) WITH COMPACT STORAGE");
+        createIndex("CREATE INDEX on %s(v)");
+
+        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", bytes("foo123"), bytes("1"));
+
+        // Test restrictions on non-primary key value
+        assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND v = textAsBlob('');"));
+
+        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", bytes("foo124"), EMPTY_BYTE_BUFFER);
+
+        assertRows(execute("SELECT * FROM %s WHERE v = textAsBlob('');"),
+                   row(bytes("foo124"), EMPTY_BYTE_BUFFER));
+    }
+
+    @Test
+    public void testIndicesOnCompactTable() throws Throwable
+    {
+        assertInvalidMessage("COMPACT STORAGE with composite PRIMARY KEY allows no more than one column not part of the PRIMARY KEY (got: v1, v2)",
+                             "CREATE TABLE " + KEYSPACE + ".test (pk int, c int, v1 int, v2 int, PRIMARY KEY(pk, c)) WITH COMPACT STORAGE");
+
+        createTable("CREATE TABLE %s (pk int, c int, v int, PRIMARY KEY(pk, c)) WITH COMPACT STORAGE");
+        assertInvalidMessage("Secondary indexes are not supported on compact value column of COMPACT STORAGE tables",
+                             "CREATE INDEX ON %s(v)");
+
+        createTable("CREATE TABLE %s (pk int PRIMARY KEY, v int) WITH COMPACT STORAGE");
+        createIndex("CREATE INDEX ON %s(v)");
+
+        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", 1, 1);
+        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", 2, 1);
+        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", 3, 3);
+
+        assertRows(execute("SELECT pk, v FROM %s WHERE v = 1"),
+                   row(1, 1),
+                   row(2, 1));
+
+        assertRows(execute("SELECT pk, v FROM %s WHERE v = 3"),
+                   row(3, 3));
+
+        assertEmpty(execute("SELECT pk, v FROM %s WHERE v = 5"));
+
+        createTable("CREATE TABLE %s (pk int PRIMARY KEY, v1 int, v2 int) WITH COMPACT STORAGE");
+        createIndex("CREATE INDEX ON %s(v1)");
+
+        execute("INSERT INTO %s (pk, v1, v2) VALUES (?, ?, ?)", 1, 1, 1);
+        execute("INSERT INTO %s (pk, v1, v2) VALUES (?, ?, ?)", 2, 1, 2);
+        execute("INSERT INTO %s (pk, v1, v2) VALUES (?, ?, ?)", 3, 3, 3);
+
+        assertRows(execute("SELECT pk, v2 FROM %s WHERE v1 = 1"),
+                   row(1, 1),
+                   row(2, 2));
+
+        assertRows(execute("SELECT pk, v2 FROM %s WHERE v1 = 3"),
+                   row(3, 3));
+
+        assertEmpty(execute("SELECT pk, v2 FROM %s WHERE v1 = 5"));
+    }
+
+    /**
+     * OverflowTest
+     */
+
+    /**
+     * Test regression from #5189,
+     * migrated from cql_tests.py:TestCQL.compact_metadata_test()
+     */
+    @Test
+    public void testCompactMetadata() throws Throwable
+    {
+        createTable("CREATE TABLE %s (id int primary key, i int ) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (id, i) VALUES (1, 2)");
+        assertRows(execute("SELECT * FROM %s"),
+                   row(1, 2));
+    }
+
+    @Test
+    public void testEmpty() throws Throwable
+    {
+        // Same test, but for compact
+        createTable("CREATE TABLE %s (k1 int, k2 int, v int, PRIMARY KEY (k1, k2)) WITH COMPACT STORAGE");
+
+        // Inserts a few rows to make sure we don 't actually query something
+        Object[][] rows = fill();
+
+        assertEmpty(execute("SELECT v FROM %s WHERE k1 IN ()"));
+        assertEmpty(execute("SELECT v FROM %s WHERE k1 = 0 AND k2 IN ()"));
+
+        // Test empty IN() in DELETE
+        execute("DELETE FROM %s WHERE k1 IN ()");
+        assertArrayEquals(rows, getRows(execute("SELECT * FROM %s")));
+
+        // Test empty IN() in UPDATE
+        execute("UPDATE %s SET v = 3 WHERE k1 IN () AND k2 = 2");
+        assertArrayEquals(rows, getRows(execute("SELECT * FROM %s")));
+    }
+
+    private Object[][] fill() throws Throwable
+    {
+        for (int i = 0; i < 2; i++)
+            for (int j = 0; j < 2; j++)
+                execute("INSERT INTO %s (k1, k2, v) VALUES (?, ?, ?)", i, j, i + j);
+
+        return getRows(execute("SELECT * FROM %s"));
+    }
+
+    /**
+     * AggregationTest
+     */
+
+    @Test
+    public void testFunctionsWithCompactStorage() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int , b int, c double, primary key(a, b) ) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 11.5)");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 9.5)");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 9.0)");
+
+        assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c) FROM %s"),
+                   row(3, 1, 6, 2, 11.5, 30.0, 10.0));
+
+        assertRows(execute("SELECT COUNT(*) FROM %s"), row(3L));
+        assertRows(execute("SELECT COUNT(1) FROM %s"), row(3L));
+        assertRows(execute("SELECT COUNT(*) FROM %s WHERE a = 1 AND b > 1"), row(2L));
+        assertRows(execute("SELECT COUNT(1) FROM %s WHERE a = 1 AND b > 1"), row(2L));
+        assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c) FROM %s WHERE a = 1 AND b > 1"),
+                   row(3, 2, 5, 2, 9.5, 18.5, 9.25));
+    }
+
+    /**
+     * BatchTest
+     */
+    @Test
+    public void testBatchRangeDelete() throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering)) WITH COMPACT STORAGE");
+
+        int value = 0;
+        for (int partitionKey = 0; partitionKey < 4; partitionKey++)
+            for (int clustering1 = 0; clustering1 < 5; clustering1++)
+                execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (?, ?, ?)",
+                        partitionKey, clustering1, value++);
+
+        execute("BEGIN BATCH " +
+                "DELETE FROM %1$s WHERE partitionKey = 1;" +
+                "DELETE FROM %1$s WHERE partitionKey = 0 AND  clustering >= 4;" +
+                "DELETE FROM %1$s WHERE partitionKey = 0 AND clustering <= 0;" +
+                "DELETE FROM %1$s WHERE partitionKey = 2 AND clustering >= 0 AND clustering <= 3;" +
+                "DELETE FROM %1$s WHERE partitionKey = 2 AND clustering <= 3 AND clustering >= 4;" +
+                "DELETE FROM %1$s WHERE partitionKey = 3 AND (clustering) >= (3) AND (clustering) <= (6);" +
+                "APPLY BATCH;");
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, 1, 1),
+                   row(0, 2, 2),
+                   row(0, 3, 3),
+                   row(2, 4, 14),
+                   row(3, 0, 15),
+                   row(3, 1, 16),
+                   row(3, 2, 17));
+    }
+
+    /**
+     * CreateTest
+     */
+    /**
+     * /**
+     * Creation and basic operations on a static table with compact storage,
+     * migrated from cql_tests.py:TestCQL.noncomposite_static_cf_test()
+     */
+    @Test
+    public void testDenseStaticTable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (userid uuid PRIMARY KEY, firstname text, lastname text, age int) WITH COMPACT STORAGE");
+
+        UUID id1 = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
+        UUID id2 = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479");
+
+        execute("INSERT INTO %s (userid, firstname, lastname, age) VALUES (?, ?, ?, ?)", id1, "Frodo", "Baggins", 32);
+        execute("UPDATE %s SET firstname = ?, lastname = ?, age = ? WHERE userid = ?", "Samwise", "Gamgee", 33, id2);
+
+        assertRows(execute("SELECT firstname, lastname FROM %s WHERE userid = ?", id1),
+                   row("Frodo", "Baggins"));
+
+        assertRows(execute("SELECT * FROM %s WHERE userid = ?", id1),
+                   row(id1, 32, "Frodo", "Baggins"));
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(id2, 33, "Samwise", "Gamgee"),
+                   row(id1, 32, "Frodo", "Baggins")
+        );
+
+        String batch = "BEGIN BATCH "
+                       + "INSERT INTO %1$s (userid, age) VALUES (?, ?) "
+                       + "UPDATE %1$s SET age = ? WHERE userid = ? "
+                       + "DELETE firstname, lastname FROM %1$s WHERE userid = ? "
+                       + "DELETE firstname, lastname FROM %1$s WHERE userid = ? "
+                       + "APPLY BATCH";
+
+        execute(batch, id1, 36, 37, id2, id1, id2);
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(id2, 37, null, null),
+                   row(id1, 36, null, null));
+    }
+
+    /**
+     * Creation and basic operations on a non-composite table with compact storage,
+     * migrated from cql_tests.py:TestCQL.dynamic_cf_test()
+     */
+    @Test
+    public void testDenseNonCompositeTable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (userid uuid, url text, time bigint, PRIMARY KEY (userid, url)) WITH COMPACT STORAGE");
+
+        UUID id1 = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
+        UUID id2 = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479");
+        UUID id3 = UUID.fromString("810e8500-e29b-41d4-a716-446655440000");
+
+        execute("INSERT INTO %s (userid, url, time) VALUES (?, ?, ?)", id1, "http://foo.bar", 42L);
+        execute("INSERT INTO %s (userid, url, time) VALUES (?, ?, ?)", id1, "http://foo-2.bar", 24L);
+        execute("INSERT INTO %s (userid, url, time) VALUES (?, ?, ?)", id1, "http://bar.bar", 128L);
+        execute("UPDATE %s SET time = 24 WHERE userid = ? and url = 'http://bar.foo'", id2);
+        execute("UPDATE %s SET time = 12 WHERE userid IN (?, ?) and url = 'http://foo-3'", id2, id1);
+
+        assertRows(execute("SELECT url, time FROM %s WHERE userid = ?", id1),
+                   row("http://bar.bar", 128L),
+                   row("http://foo-2.bar", 24L),
+                   row("http://foo-3", 12L),
+                   row("http://foo.bar", 42L));
+
+        assertRows(execute("SELECT * FROM %s WHERE userid = ?", id2),
+                   row(id2, "http://bar.foo", 24L),
+                   row(id2, "http://foo-3", 12L));
+
+        assertRows(execute("SELECT time FROM %s"),
+                   row(24L), // id2
+                   row(12L),
+                   row(128L), // id1
+                   row(24L),
+                   row(12L),
+                   row(42L)
+        );
+
+        // Check we don't allow empty values for url since this is the full underlying cell name (#6152)
+        assertInvalid("INSERT INTO %s (userid, url, time) VALUES (?, '', 42)", id3);
+    }
+
+    /**
+     * Creation and basic operations on a composite table with compact storage,
+     * migrated from cql_tests.py:TestCQL.dense_cf_test()
+     */
+    @Test
+    public void testDenseCompositeTable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (userid uuid, ip text, port int, time bigint, PRIMARY KEY (userid, ip, port)) WITH COMPACT STORAGE");
+
+        UUID id1 = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
+        UUID id2 = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479");
+
+        execute("INSERT INTO %s (userid, ip, port, time) VALUES (?, '192.168.0.1', 80, 42)", id1);
+        execute("INSERT INTO %s (userid, ip, port, time) VALUES (?, '192.168.0.2', 80, 24)", id1);
+        execute("INSERT INTO %s (userid, ip, port, time) VALUES (?, '192.168.0.2', 90, 42)", id1);
+        execute("UPDATE %s SET time = 24 WHERE userid = ? AND ip = '192.168.0.2' AND port = 80", id2);
+
+        // we don't have to include all of the clustering columns (see CASSANDRA-7990)
+        execute("INSERT INTO %s (userid, ip, time) VALUES (?, '192.168.0.3', 42)", id2);
+        execute("UPDATE %s SET time = 42 WHERE userid = ? AND ip = '192.168.0.4'", id2);
+
+        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ?", id1),
+                   row("192.168.0.1", 80, 42L),
+                   row("192.168.0.2", 80, 24L),
+                   row("192.168.0.2", 90, 42L));
+
+        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? and ip >= '192.168.0.2'", id1),
+                   row("192.168.0.2", 80, 24L),
+                   row("192.168.0.2", 90, 42L));
+
+        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? and ip = '192.168.0.2'", id1),
+                   row("192.168.0.2", 80, 24L),
+                   row("192.168.0.2", 90, 42L));
+
+        assertEmpty(execute("SELECT ip, port, time FROM %s WHERE userid = ? and ip > '192.168.0.2'", id1));
+
+        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? AND ip = '192.168.0.3'", id2),
+                   row("192.168.0.3", null, 42L));
+
+        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? AND ip = '192.168.0.4'", id2),
+                   row("192.168.0.4", null, 42L));
+
+        execute("DELETE time FROM %s WHERE userid = ? AND ip = '192.168.0.2' AND port = 80", id1);
+
+        assertRowCount(execute("SELECT * FROM %s WHERE userid = ?", id1), 2);
+
+        execute("DELETE FROM %s WHERE userid = ?", id1);
+        assertEmpty(execute("SELECT * FROM %s WHERE userid = ?", id1));
+
+        execute("DELETE FROM %s WHERE userid = ? AND ip = '192.168.0.3'", id2);
+        assertEmpty(execute("SELECT * FROM %s WHERE userid = ? AND ip = '192.168.0.3'", id2));
+    }
+
+    @Test
+    public void testCreateIndexOnCompactTableWithClusteringColumns() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int , c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE;");
+
+        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
+                             "CREATE INDEX ON %s (a);");
+
+        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
+                             "CREATE INDEX ON %s (b);");
+
+        assertInvalidMessage("Secondary indexes are not supported on compact value column of COMPACT STORAGE tables",
+                             "CREATE INDEX ON %s (c);");
+    }
+
+    @Test
+    public void testCreateIndexOnCompactTableWithoutClusteringColumns() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int) WITH COMPACT STORAGE;");
+
+        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
+                             "CREATE INDEX ON %s (a);");
+
+        createIndex("CREATE INDEX ON %s (b);");
+
+        execute("INSERT INTO %s (a, b) values (1, 1)");
+        execute("INSERT INTO %s (a, b) values (2, 4)");
+        execute("INSERT INTO %s (a, b) values (3, 6)");
+
+        assertRows(execute("SELECT * FROM %s WHERE b = ?", 4), row(2, 4));
+    }
+
+    /**
+     * DeleteTest
+     */
+
+    @Test
+    public void testDeleteWithNoClusteringColumns() throws Throwable
+    {
+        testDeleteWithNoClusteringColumns(false);
+        testDeleteWithNoClusteringColumns(true);
+    }
+
+    private void testDeleteWithNoClusteringColumns(boolean forceFlush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int PRIMARY KEY," +
+                    "value int)" + compactOption);
+
+        execute("INSERT INTO %s (partitionKey, value) VALUES (0, 0)");
+        execute("INSERT INTO %s (partitionKey, value) VALUES (1, 1)");
+        execute("INSERT INTO %s (partitionKey, value) VALUES (2, 2)");
+        execute("INSERT INTO %s (partitionKey, value) VALUES (3, 3)");
+        flush(forceFlush);
+
+        execute("DELETE value FROM %s WHERE partitionKey = ?", 0);
+        flush(forceFlush);
+
+        assertEmpty(execute("SELECT * FROM %s WHERE partitionKey = ?", 0));
+
+        execute("DELETE FROM %s WHERE partitionKey IN (?, ?)", 0, 1);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s"),
+                   row(2, 2),
+                   row(3, 3));
+
+        // test invalid queries
+
+        // token function
+        assertInvalidMessage("The token function cannot be used in WHERE clauses for DELETE statements",
+                             "DELETE FROM %s WHERE token(partitionKey) = token(?)", 0);
+
+        // multiple time same primary key element in WHERE clause
+        assertInvalidMessage("partitionkey cannot be restricted by more than one relation if it includes an Equal",
+                             "DELETE FROM %s WHERE partitionKey = ? AND partitionKey = ?", 0, 1);
+
+        // Undefined column names
+        assertInvalidMessage("Undefined column name unknown",
+                             "DELETE unknown FROM %s WHERE partitionKey = ?", 0);
+
+        assertInvalidMessage("Undefined column name partitionkey1",
+                             "DELETE FROM %s WHERE partitionKey1 = ?", 0);
+
+        // Invalid operator in the where clause
+        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
+                             "DELETE FROM %s WHERE partitionKey > ? ", 0);
+
+        assertInvalidMessage("Cannot use DELETE with CONTAINS",
+                             "DELETE FROM %s WHERE partitionKey CONTAINS ?", 0);
+
+        // Non primary key in the where clause
+        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
+                             "DELETE FROM %s WHERE partitionKey = ? AND value = ?", 0, 1);
+    }
+
+
+    @Test
+    public void testDeleteWithOneClusteringColumns() throws Throwable
+    {
+        testDeleteWithOneClusteringColumns(false);
+        testDeleteWithOneClusteringColumns(true);
+    }
+
+    private void testDeleteWithOneClusteringColumns(boolean forceFlush) throws Throwable
+    {
+        String compactOption = " WITH COMPACT STORAGE";
+
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering))" + compactOption);
+
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 1, 1)");
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 2, 2)");
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 3, 3)");
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 4, 4)");
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 5, 5)");
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (1, 0, 6)");
+        flush(forceFlush);
+
+        execute("DELETE value FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1);
+        flush(forceFlush);
+
+        assertEmpty(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1));
+
+        execute("DELETE FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1);
+        flush(forceFlush);
+        assertEmpty(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1));
+
+        execute("DELETE FROM %s WHERE partitionKey IN (?, ?) AND clustering = ?", 0, 1, 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
+                   row(0, 2, 2),
+                   row(0, 3, 3),
+                   row(0, 4, 4),
+                   row(0, 5, 5));
+
+        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering) IN ((?), (?))", 0, 4, 5);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
+                   row(0, 2, 2),
+                   row(0, 3, 3));
+
+        // test invalid queries
+
+        // missing primary key element
+        assertInvalidMessage("Some partition key parts are missing: partitionkey",
+                             "DELETE FROM %s WHERE clustering = ?", 1);
+
+        // token function
+        assertInvalidMessage("The token function cannot be used in WHERE clauses for DELETE statements",
+                             "DELETE FROM %s WHERE token(partitionKey) = token(?) AND clustering = ? ", 0, 1);
+
+        // multiple time same primary key element in WHERE clause
+        assertInvalidMessage("clustering cannot be restricted by more than one relation if it includes an Equal",
+                             "DELETE FROM %s WHERE partitionKey = ? AND clustering = ? AND clustering = ?", 0, 1, 1);
+
+        // Undefined column names
+        assertInvalidMessage("Undefined column name value1",
+                             "DELETE value1 FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1);
+
+        assertInvalidMessage("Undefined column name partitionkey1",
+                             "DELETE FROM %s WHERE partitionKey1 = ? AND clustering = ?", 0, 1);
+
+        assertInvalidMessage("Undefined column name clustering_3",
+                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_3 = ?", 0, 1);
+
+        // Invalid operator in the where clause
+        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
+                             "DELETE FROM %s WHERE partitionKey > ? AND clustering = ?", 0, 1);
+
+        assertInvalidMessage("Cannot use DELETE with CONTAINS",
+                             "DELETE FROM %s WHERE partitionKey CONTAINS ? AND clustering = ?", 0, 1);
+
+        // Non primary key in the where clause
+        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
+                             "DELETE FROM %s WHERE partitionKey = ? AND clustering = ? AND value = ?", 0, 1, 3);
+    }
+
+    @Test
+    public void testDeleteWithTwoClusteringColumns() throws Throwable
+    {
+        testDeleteWithTwoClusteringColumns(false);
+        testDeleteWithTwoClusteringColumns(true);
+    }
+
+    private void testDeleteWithTwoClusteringColumns(boolean forceFlush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering_1 int," +
+                    "clustering_2 int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering_1, clustering_2))" + compactOption);
+
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 1, 1)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 2, 2)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 3, 3)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 1, 4)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 2, 5)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (1, 0, 0, 6)");
+        flush(forceFlush);
+
+        execute("DELETE value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
+        flush(forceFlush);
+
+        assertEmpty(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
+                            0, 1, 1));
+
+        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) = (?, ?)", 0, 1, 1);
+        flush(forceFlush);
+        assertEmpty(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
+                            0, 1, 1));
+
+        execute("DELETE FROM %s WHERE partitionKey IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 0, 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
+                   row(0, 0, 1, 1),
+                   row(0, 0, 2, 2),
+                   row(0, 0, 3, 3),
+                   row(0, 1, 2, 5));
+
+        Object[][] rows = new Object[][]{ row(0, 0, 1, 1), row(0, 1, 2, 5) };
+
+        execute("DELETE value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 IN (?, ?)", 0, 0, 2, 3);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1), rows);
+
+        rows = new Object[][]{ row(0, 0, 1, 1) };
+
+        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))", 0, 0, 2, 1, 2);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1), rows);
+
+        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?)) AND clustering_2 = ?", 0, 0, 2, 3);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
+                   row(0, 0, 1, 1));
+
+        // test invalid queries
+
+        // missing primary key element
+        assertInvalidMessage("Some partition key parts are missing: partitionkey",
+                             "DELETE FROM %s WHERE clustering_1 = ? AND clustering_2 = ?", 1, 1);
+
+        assertInvalidMessage("PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted",
+                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_2 = ?", 0, 1);
+
+        // token function
+        assertInvalidMessage("The token function cannot be used in WHERE clauses for DELETE statements",
+                             "DELETE FROM %s WHERE token(partitionKey) = token(?) AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
+
+        // multiple time same primary key element in WHERE clause
+        assertInvalidMessage("clustering_1 cannot be restricted by more than one relation if it includes an Equal",
+                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND clustering_1 = ?", 0, 1, 1, 1);
+
+        // Undefined column names
+        assertInvalidMessage("Undefined column name value1",
+                             "DELETE value1 FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
+
+        assertInvalidMessage("Undefined column name partitionkey1",
+                             "DELETE FROM %s WHERE partitionKey1 = ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
+
+        assertInvalidMessage("Undefined column name clustering_3",
+                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_3 = ?", 0, 1, 1);
+
+        // Invalid operator in the where clause
+        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
+                             "DELETE FROM %s WHERE partitionKey > ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
+
+        assertInvalidMessage("Cannot use DELETE with CONTAINS",
+                             "DELETE FROM %s WHERE partitionKey CONTAINS ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
+
+        // Non primary key in the where clause
+        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
+                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND value = ?", 0, 1, 1, 3);
+    }
+
+    /**
+     * InsertTest
+     */
+
+    @Test
+    public void testInsertWithCompactFormat() throws Throwable
+    {
+        testInsertWithCompactFormat(false);
+        testInsertWithCompactFormat(true);
+    }
+
+    private void testInsertWithCompactFormat(boolean forceFlush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 1, 1)");
+        flush(forceFlush);
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, 0, 0),
+                   row(0, 1, 1));
+
+        // Invalid Null values for the clustering key or the regular column
+        assertInvalidMessage("Some clustering keys are missing: clustering",
+                             "INSERT INTO %s (partitionKey, value) VALUES (0, 0)");
+        assertInvalidMessage("Column value is mandatory for this COMPACT STORAGE table",
+                             "INSERT INTO %s (partitionKey, clustering) VALUES (0, 0)");
+
+        // Missing primary key columns
+        assertInvalidMessage("Some partition key parts are missing: partitionkey",
+                             "INSERT INTO %s (clustering, value) VALUES (0, 1)");
+
+        // multiple time the same value
+        assertInvalidMessage("The column names contains duplicates",
+                             "INSERT INTO %s (partitionKey, clustering, value, value) VALUES (0, 0, 2, 2)");
+
+        // multiple time same primary key element in WHERE clause
+        assertInvalidMessage("The column names contains duplicates",
+                             "INSERT INTO %s (partitionKey, clustering, clustering, value) VALUES (0, 0, 0, 2)");
+
+        // Undefined column names
+        assertInvalidMessage("Undefined column name clusteringx",
+                             "INSERT INTO %s (partitionKey, clusteringx, value) VALUES (0, 0, 2)");
+
+        assertInvalidMessage("Undefined column name valuex",
+                             "INSERT INTO %s (partitionKey, clustering, valuex) VALUES (0, 0, 2)");
+    }
+
+    @Test
+    public void testInsertWithCompactStorageAndTwoClusteringColumns() throws Throwable
+    {
+        testInsertWithCompactStorageAndTwoClusteringColumns(false);
+        testInsertWithCompactStorageAndTwoClusteringColumns(true);
+    }
+
+    private void testInsertWithCompactStorageAndTwoClusteringColumns(boolean forceFlush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering_1 int," +
+                    "clustering_2 int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering_1, clustering_2)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 1, 1)");
+        flush(forceFlush);
+
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, 0, null, 0),
+                   row(0, 0, 0, 0),
+                   row(0, 0, 1, 1));
+
+        // Invalid Null values for the clustering key or the regular column
+        assertInvalidMessage("PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted",
+                             "INSERT INTO %s (partitionKey, clustering_2, value) VALUES (0, 0, 0)");
+        assertInvalidMessage("Column value is mandatory for this COMPACT STORAGE table",
+                             "INSERT INTO %s (partitionKey, clustering_1, clustering_2) VALUES (0, 0, 0)");
+
+        // Missing primary key columns
+        assertInvalidMessage("Some partition key parts are missing: partitionkey",
+                             "INSERT INTO %s (clustering_1, clustering_2, value) VALUES (0, 0, 1)");
+        assertInvalidMessage("PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted",
+                             "INSERT INTO %s (partitionKey, clustering_2, value) VALUES (0, 0, 2)");
+
+        // multiple time the same value
+        assertInvalidMessage("The column names contains duplicates",
+                             "INSERT INTO %s (partitionKey, clustering_1, value, clustering_2, value) VALUES (0, 0, 2, 0, 2)");
+
+        // multiple time same primary key element in WHERE clause
+        assertInvalidMessage("The column names contains duplicates",
+                             "INSERT INTO %s (partitionKey, clustering_1, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0, 2)");
+
+        // Undefined column names
+        assertInvalidMessage("Undefined column name clustering_1x",
+                             "INSERT INTO %s (partitionKey, clustering_1x, clustering_2, value) VALUES (0, 0, 0, 2)");
+
+        assertInvalidMessage("Undefined column name valuex",
+                             "INSERT INTO %s (partitionKey, clustering_1, clustering_2, valuex) VALUES (0, 0, 0, 2)");
+    }
+
+    /**
+     * InsertUpdateIfConditionTest
+     */
+    /**
+     * Test for CAS with compact storage table, and #6813 in particular,
+     * migrated from cql_tests.py:TestCQL.cas_and_compact_test()
+     */
+    @Test
+    public void testCompactStorage() throws Throwable
+    {
+        createTable("CREATE TABLE %s (partition text, key text, owner text, PRIMARY KEY (partition, key) ) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (partition, key, owner) VALUES ('a', 'b', null)");
+        assertRows(execute("UPDATE %s SET owner='z' WHERE partition='a' AND key='b' IF owner=null"), row(true));
+
+        assertRows(execute("UPDATE %s SET owner='b' WHERE partition='a' AND key='b' IF owner='a'"), row(false, "z"));
+        assertRows(execute("UPDATE %s SET owner='b' WHERE partition='a' AND key='b' IF owner='z'"), row(true));
+
+        assertRows(execute("INSERT INTO %s (partition, key, owner) VALUES ('a', 'c', 'x') IF NOT EXISTS"), row(true));
+    }
+
+    /**
+     * SelectGroupByTest
+     */
+
+    @Test
+    public void testGroupByWithoutPaging() throws Throwable
+    {
+
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, primary key (a, b, c, d))"
+                    + compactOption);
+
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 3, 6)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 6, 12)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 3, 2, 12, 24)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 4, 2, 12, 24)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 4, 2, 6, 12)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (2, 2, 3, 3, 6)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (2, 4, 3, 6, 12)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (3, 3, 2, 12, 24)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (4, 8, 2, 12, 24)");
+
+        // Makes sure that we have some tombstones
+        execute("DELETE FROM %s WHERE a = 1 AND b = 3 AND c = 2 AND d = 12");
+        execute("DELETE FROM %s WHERE a = 3");
+
+        // Range queries
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a"),
+                   row(1, 2, 6, 4L, 24),
+                   row(2, 2, 6, 2L, 12),
+                   row(4, 8, 24, 1L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b"),
+                   row(1, 2, 6, 2L, 12),
+                   row(1, 4, 12, 2L, 24),
+                   row(2, 2, 6, 1L, 6),
+                   row(2, 4, 12, 1L, 12),
+                   row(4, 8, 24, 1L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE b = 2 GROUP BY a, b ALLOW FILTERING"),
+                   row(1, 2, 6, 2L, 12),
+                   row(2, 2, 6, 1L, 6));
+
+        assertEmpty(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE b IN () GROUP BY a, b ALLOW FILTERING"));
+
+        // Range queries without aggregates
+        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(1, 4, 2, 6),
+                   row(2, 2, 3, 3),
+                   row(2, 4, 3, 6),
+                   row(4, 8, 2, 12));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b"),
+                   row(1, 2, 1, 3),
+                   row(1, 4, 2, 6),
+                   row(2, 2, 3, 3),
+                   row(2, 4, 3, 6),
+                   row(4, 8, 2, 12));
+
+        // Range queries with wildcard
+        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12),
+                   row(1, 4, 2, 6, 12),
+                   row(2, 2, 3, 3, 6),
+                   row(2, 4, 3, 6, 12),
+                   row(4, 8, 2, 12, 24));
+
+        assertRows(execute("SELECT * FROM %s GROUP BY a, b"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 4, 2, 6, 12),
+                   row(2, 2, 3, 3, 6),
+                   row(2, 4, 3, 6, 12),
+                   row(4, 8, 2, 12, 24));
+
+        // Range query with LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b LIMIT 2"),
+                   row(1, 2, 6, 2L, 12),
+                   row(1, 4, 12, 2L, 24));
+
+        // Range queries with PER PARTITION LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b PER PARTITION LIMIT 1"),
+                   row(1, 2, 6, 2L, 12),
+                   row(2, 2, 6, 1L, 6),
+                   row(4, 8, 24, 1L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a PER PARTITION LIMIT 2"),
+                   row(1, 2, 6, 4L, 24),
+                   row(2, 2, 6, 2L, 12),
+                   row(4, 8, 24, 1L, 24));
+
+        // Range query with PER PARTITION LIMIT and LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b PER PARTITION LIMIT 1 LIMIT 2"),
+                   row(1, 2, 6, 2L, 12),
+                   row(2, 2, 6, 1L, 6));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a PER PARTITION LIMIT 2"),
+                   row(1, 2, 6, 4L, 24),
+                   row(2, 2, 6, 2L, 12),
+                   row(4, 8, 24, 1L, 24));
+
+        // Range queries without aggregates and with LIMIT
+        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c LIMIT 3"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(1, 4, 2, 6));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b LIMIT 3"),
+                   row(1, 2, 1, 3),
+                   row(1, 4, 2, 6),
+                   row(2, 2, 3, 3));
+
+        // Range queries with wildcard and with LIMIT
+        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c LIMIT 3"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12),
+                   row(1, 4, 2, 6, 12));
+
+        assertRows(execute("SELECT * FROM %s GROUP BY a, b LIMIT 3"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 4, 2, 6, 12),
+                   row(2, 2, 3, 3, 6));
+
+        // Range queries without aggregates and with PER PARTITION LIMIT
+        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(2, 2, 3, 3),
+                   row(2, 4, 3, 6),
+                   row(4, 8, 2, 12));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b PER PARTITION LIMIT 1"),
+                   row(1, 2, 1, 3),
+                   row(2, 2, 3, 3),
+                   row(4, 8, 2, 12));
+
+        // Range queries with wildcard and with PER PARTITION LIMIT
+        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12),
+                   row(2, 2, 3, 3, 6),
+                   row(2, 4, 3, 6, 12),
+                   row(4, 8, 2, 12, 24));
+
+        assertRows(execute("SELECT * FROM %s GROUP BY a, b PER PARTITION LIMIT 1"),
+                   row(1, 2, 1, 3, 6),
+                   row(2, 2, 3, 3, 6),
+                   row(4, 8, 2, 12, 24));
+
+        // Range queries without aggregates, with PER PARTITION LIMIT and LIMIT
+        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2 LIMIT 3"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(2, 2, 3, 3));
+
+        // Range queries with wildcard, with PER PARTITION LIMIT and LIMIT
+        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2 LIMIT 3"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12),
+                   row(2, 2, 3, 3, 6));
+
+        // Range query with DISTINCT
+        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s GROUP BY a"),
+                   row(1, 1L),
+                   row(2, 1L),
+                   row(4, 1L));
+
+        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
+                             "SELECT DISTINCT a, count(a)FROM %s GROUP BY a, b");
+
+        // Range query with DISTINCT and LIMIT
+        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s GROUP BY a LIMIT 2"),
+                   row(1, 1L),
+                   row(2, 1L));
+
+        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
+                             "SELECT DISTINCT a, count(a)FROM %s GROUP BY a, b LIMIT 2");
+
+        // Range query with ORDER BY
+        assertInvalidMessage("ORDER BY is only supported when the partition key is restricted by an EQ or an IN",
+                             "SELECT a, b, c, count(b), max(e) FROM %s GROUP BY a, b ORDER BY b DESC, c DESC");
+
+        // Single partition queries
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12),
+                   row(1, 4, 12, 2L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY b, c"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12),
+                   row(1, 4, 12, 2L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 AND b = 2 GROUP BY a, b, c"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 AND b = 2 GROUP BY a, c"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 AND b = 2 GROUP BY c"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12));
+
+        // Single partition queries without aggregates
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b"),
+                   row(1, 2, 1, 3),
+                   row(1, 4, 2, 6));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b, c"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(1, 4, 2, 6));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY b, c"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(1, 4, 2, 6));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 and token(a) = token(1) GROUP BY b, c"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(1, 4, 2, 6));
+
+        // Single partition queries with wildcard
+        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b, c"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12),
+                   row(1, 4, 2, 6, 12));
+
+        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 4, 2, 6, 12));
+
+        // Single partition queries with DISTINCT
+        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s WHERE a = 1 GROUP BY a"),
+                   row(1, 1L));
+
+        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
+                             "SELECT DISTINCT a, count(a)FROM %s WHERE a = 1 GROUP BY a, b");
+
+        // Single partition queries with LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 10"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12),
+                   row(1, 4, 12, 2L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 2"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12));
+
+        assertRows(execute("SELECT count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 1"),
+                   row(1L, 6));
+
+        // Single partition queries with PER PARTITION LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 10"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12),
+                   row(1, 4, 12, 2L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 2"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12));
+
+        assertRows(execute("SELECT count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 1"),
+                   row(1L, 6));
+
+        // Single partition queries without aggregates and with LIMIT
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b LIMIT 2"),
+                   row(1, 2, 1, 3),
+                   row(1, 4, 2, 6));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b LIMIT 1"),
+                   row(1, 2, 1, 3));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 2"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6));
+
+        // Single partition queries with wildcard and with LIMIT
+        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 2"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12));
+
+        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b LIMIT 1"),
+                   row(1, 2, 1, 3, 6));
+
+        // Single partition queries without aggregates and with PER PARTITION LIMIT
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b PER PARTITION LIMIT 2"),
+                   row(1, 2, 1, 3),
+                   row(1, 4, 2, 6));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b PER PARTITION LIMIT 1"),
+                   row(1, 2, 1, 3));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 2"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6));
+
+        // Single partition queries with wildcard and with PER PARTITION LIMIT
+        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 2"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12));
+
+        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b PER PARTITION LIMIT 1"),
+                   row(1, 2, 1, 3, 6));
+
+        // Single partition queries with ORDER BY
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c ORDER BY b DESC, c DESC"),
+                   row(1, 4, 24, 2L, 24),
+                   row(1, 2, 12, 1L, 12),
+                   row(1, 2, 6, 1L, 6));
+
+        // Single partition queries with ORDER BY and PER PARTITION LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c ORDER BY b DESC, c DESC PER PARTITION LIMIT 1"),
+                   row(1, 4, 24, 2L, 24));
+
+        // Single partition queries with ORDER BY and LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c ORDER BY b DESC, c DESC LIMIT 2"),
+                   row(1, 4, 24, 2L, 24),
+                   row(1, 2, 12, 1L, 12));
+
+        // Multi-partitions queries
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12),
+                   row(1, 4, 12, 2L, 24),
+                   row(2, 2, 6, 1L, 6),
+                   row(2, 4, 12, 1L, 12),
+                   row(4, 8, 24, 1L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) AND b = 2 GROUP BY a, b, c"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12),
+                   row(2, 2, 6, 1L, 6));
+
+        // Multi-partitions queries without aggregates
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b"),
+                   row(1, 2, 1, 3),
+                   row(1, 4, 2, 6),
+                   row(2, 2, 3, 3),
+                   row(2, 4, 3, 6),
+                   row(4, 8, 2, 12));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c"),
+                   row(1, 2, 1, 3),
+                   row(1, 2, 2, 6),
+                   row(1, 4, 2, 6),
+                   row(2, 2, 3, 3),
+                   row(2, 4, 3, 6),
+                   row(4, 8, 2, 12));
+
+        // Multi-partitions with wildcard
+        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12),
+                   row(1, 4, 2, 6, 12),
+                   row(2, 2, 3, 3, 6),
+                   row(2, 4, 3, 6, 12),
+                   row(4, 8, 2, 12, 24));
+
+        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 4, 2, 6, 12),
+                   row(2, 2, 3, 3, 6),
+                   row(2, 4, 3, 6, 12),
+                   row(4, 8, 2, 12, 24));
+
+        // Multi-partitions query with DISTINCT
+        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s WHERE a IN (1, 2, 4) GROUP BY a"),
+                   row(1, 1L),
+                   row(2, 1L),
+                   row(4, 1L));
+
+        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
+                             "SELECT DISTINCT a, count(a)FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b");
+
+        // Multi-partitions query with DISTINCT and LIMIT
+        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s WHERE a IN (1, 2, 4) GROUP BY a LIMIT 2"),
+                   row(1, 1L),
+                   row(2, 1L));
+
+        // Multi-partitions queries with PER PARTITION LIMIT
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c PER PARTITION LIMIT 1"),
+                   row(1, 2, 6, 1L, 6),
+                   row(2, 2, 6, 1L, 6),
+                   row(4, 8, 24, 1L, 24));
+
+        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c PER PARTITION LIMIT 2"),
+                   row(1, 2, 6, 1L, 6),
+                   row(1, 2, 12, 1L, 12),
+                   row(2, 2, 6, 1L, 6),
+                   row(2, 4, 12, 1L, 12),
+                   row(4, 8, 24, 1L, 24));
+
+        // Multi-partitions with wildcard and PER PARTITION LIMIT
+        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c PER PARTITION LIMIT 2"),
+                   row(1, 2, 1, 3, 6),
+                   row(1, 2, 2, 6, 12),
+                   row(2, 2, 3, 3, 6),
+                   row(2, 4, 3, 6, 12),
+                   row(4, 8, 2, 12, 24));
+
+        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b PER PARTITION LIMIT 1"),
+                   row(1, 2, 1, 3, 6),
+                   row(2, 2, 3, 3, 6),
+                   row(4, 8, 2, 12, 24));
+
+        // Multi-partitions queries with ORDER BY
+        assertRows(execute("SELECT a, b, c, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b ORDER BY b DESC, c DESC"),
+                   row(4, 8, 2, 1L, 24),
+                   row(2, 4, 3, 1L, 12),
+                   row(1, 4, 2, 2L, 24),
+                   row(2, 2, 3, 1L, 6),
+                   row(1, 2, 2, 2L, 12));
+
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c ORDER BY b DESC, c DESC"),
+                   row(4, 8, 2, 12),
+                   row(2, 4, 3, 6),
+                   row(1, 4, 2, 12),
+                   row(2, 2, 3, 3),
+                   row(1, 2, 2, 6),
+                   row(1, 2, 1, 3));
+
+        // Multi-partitions queries with ORDER BY and LIMIT
+        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b ORDER BY b DESC, c DESC LIMIT 3"),
+                   row(4, 8, 2, 12),
+                   row(2, 4, 3, 6),
+                   row(1, 4, 2, 12));
+
+        // Multi-partitions with wildcard, ORDER BY and LIMIT
+        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c ORDER BY b DESC, c DESC LIMIT 3"),
+                   row(4, 8, 2, 12, 24),
+                   row(2, 4, 3, 6, 12),
+                   row(1, 4, 2, 12, 24));
+
+        // Invalid queries
+        assertInvalidMessage("Group by is currently only supported on the columns of the PRIMARY KEY, got e",
+                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY a, e");
+
+        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
+                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY c");
+
+        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
+                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY a, c, b");
+
+        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
+                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY a, a");
+
+        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
+                             "SELECT a, b, c, d FROM %s WHERE token(a) = token(1) GROUP BY b, c");
+
+        assertInvalidMessage("Undefined column name clustering1",
+                             "SELECT a, b as clustering1, max(c) FROM %s WHERE a = 1 GROUP BY a, clustering1");
+
+        assertInvalidMessage("Undefined column name z",
+                             "SELECT a, b, max(c) FROM %s WHERE a = 1 GROUP BY a, b, z");
+
+        // Test with composite partition key
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, primary key ((a, b), c, d))" + compactOption);
+
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 1, 1, 3, 6)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 1, 2, 6, 12)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 1, 3, 12, 24)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 12, 24)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 6, 12)");
+
+        assertInvalidMessage("Group by is not supported on only a part of the partition key",
+                             "SELECT a, b, max(d) FROM %s GROUP BY a");
+
+        assertRows(execute("SELECT a, b, max(d) FROM %s GROUP BY a, b"),
+                   row(1, 2, 12),
+                   row(1, 1, 12));
+
+        assertRows(execute("SELECT a, b, max(d) FROM %s WHERE a = 1 AND b = 1 GROUP BY b"),
+                   row(1, 1, 12));
+
+        // Test with table without clustering key
+        createTable("CREATE TABLE %s (a int primary key, b int, c int)" + compactOption);
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 6)");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 6, 12)");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 12, 24)");
+
+        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
+                             "SELECT a, max(c) FROM %s WHERE a = 1 GROUP BY a, a");
+    }
+
+    @Test
+    public void testGroupByWithoutPagingWithDeletions() throws Throwable
+    {
+
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, primary key (a, b, c, d))"
+                    + compactOption);
+
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 3, 6)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 6, 12)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 9, 18)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 12, 24)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 3, 6)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 6, 12)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 9, 18)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 12, 24)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 3, 6)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 6, 12)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 9, 18)");
+        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 12, 24)");
+
+        execute("DELETE FROM %s WHERE a = 1 AND b = 2 AND c = 1 AND d = 12");
+        execute("DELETE FROM %s WHERE a = 1 AND b = 2 AND c = 2 AND d = 9");
+
+        assertRows(execute("SELECT a, b, c, count(b), max(d) FROM %s GROUP BY a, b, c"),
+                   row(1, 2, 1, 3L, 9),
+                   row(1, 2, 2, 3L, 12),
+                   row(1, 2, 3, 4L, 12));
+    }
+
+    @Test
+    public void testGroupByWithRangeNamesQueryWithoutPaging() throws Throwable
+    {
+
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, primary key (a, b, c))"
+                    + compactOption);
+
+        for (int i = 1; i < 5; i++)
+            for (int j = 1; j < 5; j++)
+                for (int k = 1; k < 5; k++)
+                    execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", i, j, k, i + j);
+
+        // Makes sure that we have some tombstones
+        execute("DELETE FROM %s WHERE a = 3");
+
+        // Range queries
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3),
+                   row(4, 1, 5, 2L, 5));
+
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3),
+                   row(4, 1, 5, 2L, 5));
+
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(1, 2, 3, 2L, 3),
+                   row(2, 1, 3, 2L, 3),
+                   row(2, 2, 4, 2L, 4),
+                   row(4, 1, 5, 2L, 5),
+                   row(4, 2, 6, 2L, 6));
+
+        // Range queries with LIMIT
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a LIMIT 5 ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3),
+                   row(4, 1, 5, 2L, 5));
+
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b LIMIT 3 ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3),
+                   row(4, 1, 5, 2L, 5));
+
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b LIMIT 3 ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(1, 2, 3, 2L, 3),
+                   row(2, 1, 3, 2L, 3));
+
+        // Range queries with PER PARTITION LIMIT
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 2 ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3),
+                   row(4, 1, 5, 2L, 5));
+
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 1 ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3),
+                   row(4, 1, 5, 2L, 5));
+
+        // Range queries with PER PARTITION LIMIT and LIMIT
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 2 LIMIT 5 ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3),
+                   row(4, 1, 5, 2L, 5));
+
+        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 1 LIMIT 2 ALLOW FILTERING"),
+                   row(1, 1, 2, 2L, 2),
+                   row(2, 1, 3, 2L, 3));
+    }
+
+    /**
+     * SelectSingleColumn
+     */
+    @Test
+    public void testClusteringColumnRelationsWithCompactStorage() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a text, b int, c int, d int, primary key(a, b, c)) WITH COMPACT STORAGE;");
+        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 1, 5, 1);
+        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 2, 6, 2);
+        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 3, 7, 3);
+        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "second", 4, 8, 4);
+
+        assertRows(execute("select * from %s where a in (?, ?)", "first", "second"),
+                   row("first", 1, 5, 1),
+                   row("first", 2, 6, 2),
+                   row("first", 3, 7, 3),
+                   row("second", 4, 8, 4));
+
+        assertRows(execute("select * from %s where a = ? and b = ? and c in (?, ?)", "first", 2, 6, 7),
+                   row("first", 2, 6, 2));
+
+        assertRows(execute("select * from %s where a = ? and b in (?, ?) and c in (?, ?)", "first", 2, 3, 6, 7),
+                   row("first", 2, 6, 2),
+                   row("first", 3, 7, 3));
+
+        assertRows(execute("select * from %s where a = ? and b in (?, ?) and c in (?, ?)", "first", 3, 2, 7, 6),
+                   row("first", 2, 6, 2),
+                   row("first", 3, 7, 3));
+
+        assertRows(execute("select * from %s where a = ? and c in (?, ?) and b in (?, ?)", "first", 7, 6, 3, 2),
+                   row("first", 2, 6, 2),
+                   row("first", 3, 7, 3));
+
+        assertRows(execute("select c, d from %s where a = ? and c in (?, ?) and b in (?, ?)", "first", 7, 6, 3, 2),
+                   row(6, 2),
+                   row(7, 3));
+
+        assertRows(execute("select c, d from %s where a = ? and c in (?, ?) and b in (?, ?, ?)", "first", 7, 6, 3, 2, 3),
+                   row(6, 2),
+                   row(7, 3));
+
+        assertRows(execute("select * from %s where a = ? and b in (?, ?) and c = ?", "first", 3, 2, 7),
+                   row("first", 3, 7, 3));
+
+        assertRows(execute("select * from %s where a = ? and b in ? and c in ?",
+                           "first", Arrays.asList(3, 2), Arrays.asList(7, 6)),
+                   row("first", 2, 6, 2),
+                   row("first", 3, 7, 3));
+
+        assertInvalidMessage("Invalid null value for column b",
+                             "select * from %s where a = ? and b in ? and c in ?", "first", null, Arrays.asList(7, 6));
+
+        assertRows(execute("select * from %s where a = ? and c >= ? and b in (?, ?)", "first", 6, 3, 2),
+                   row("first", 2, 6, 2),
+                   row("first", 3, 7, 3));
+
+        assertRows(execute("select * from %s where a = ? and c > ? and b in (?, ?)", "first", 6, 3, 2),
+                   row("first", 3, 7, 3));
+
+        assertRows(execute("select * from %s where a = ? and c <= ? and b in (?, ?)", "first", 6, 3, 2),
+                   row("first", 2, 6, 2));
+
+        assertRows(execute("select * from %s where a = ? and c < ? and b in (?, ?)", "first", 7, 3, 2),
+                   row("first", 2, 6, 2));
+
+        assertRows(execute("select * from %s where a = ? and c >= ? and c <= ? and b in (?, ?)", "first", 6, 7, 3, 2),
+                   row("first", 2, 6, 2),
+                   row("first", 3, 7, 3));
+
+        assertRows(execute("select * from %s where a = ? and c > ? and c <= ? and b in (?, ?)", "first", 6, 7, 3, 2),
+                   row("first", 3, 7, 3));
+
+        assertEmpty(execute("select * from %s where a = ? and c > ? and c < ? and b in (?, ?)", "first", 6, 7, 3, 2));
+
+        assertInvalidMessage("Column \"c\" cannot be restricted by both an equality and an inequality relation",
+                             "select * from %s where a = ? and c > ? and c = ? and b in (?, ?)", "first", 6, 7, 3, 2);
+
+        assertInvalidMessage("c cannot be restricted by more than one relation if it includes an Equal",
+                             "select * from %s where a = ? and c = ? and c > ?  and b in (?, ?)", "first", 6, 7, 3, 2);
+
+        assertRows(execute("select * from %s where a = ? and c in (?, ?) and b in (?, ?) order by b DESC",
+                           "first", 7, 6, 3, 2),
+                   row("first", 3, 7, 3),
+                   row("first", 2, 6, 2));
+
+        assertInvalidMessage("More than one restriction was found for the start bound on b",
+                             "select * from %s where a = ? and b > ? and b > ?", "first", 6, 3, 2);
+
+        assertInvalidMessage("More than one restriction was found for the end bound on b",
+                             "select * from %s where a = ? and b < ? and b <= ?", "first", 6, 3, 2);
+    }
+
+    /**
+     * SelectTest
+     */
+    /**
+     * Check query with KEY IN clause for wide row tables
+     * migrated from cql_tests.py:TestCQL.in_clause_wide_rows_test()
+     */
+    @Test
+    public void testSelectKeyInForWideRows() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int, c int, v int, PRIMARY KEY (k, c)) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 10; i++)
+            execute("INSERT INTO %s (k, c, v) VALUES (0, ?, ?)", i, i);
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c IN (5, 2, 8)"),
+                   row(2), row(5), row(8));
+
+        createTable("CREATE TABLE %s (k int, c1 int, c2 int, v int, PRIMARY KEY (k, c1, c2)) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 10; i++)
+            execute("INSERT INTO %s (k, c1, c2, v) VALUES (0, 0, ?, ?)", i, i);
+
+        assertEmpty(execute("SELECT v FROM %s WHERE k = 0 AND c1 IN (5, 2, 8) AND c2 = 3"));
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c1 = 0 AND c2 IN (5, 2, 8)"),
+                   row(2), row(5), row(8));
+    }
+
+    /**
+     * Check SELECT respects inclusive and exclusive bounds
+     * migrated from cql_tests.py:TestCQL.exclusive_slice_test()
+     */
+    @Test
+    public void testSelectBounds() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int, c int, v int, PRIMARY KEY (k, c)) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 10; i++)
+            execute("INSERT INTO %s (k, c, v) VALUES (0, ?, ?)", i, i);
+
+        assertRowCount(execute("SELECT v FROM %s WHERE k = 0"), 10);
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c >= 2 AND c <= 6"),
+                   row(2), row(3), row(4), row(5), row(6));
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c > 2 AND c <= 6"),
+                   row(3), row(4), row(5), row(6));
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c >= 2 AND c < 6"),
+                   row(2), row(3), row(4), row(5));
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c > 2 AND c < 6"),
+                   row(3), row(4), row(5));
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c > 2 AND c <= 6 LIMIT 2"),
+                   row(3), row(4));
+
+        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c >= 2 AND c < 6 ORDER BY c DESC LIMIT 2"),
+                   row(5), row(4));
+    }
+
+    /**
+     * Test for #4716 bug and more generally for good behavior of ordering,
+     * migrated from cql_tests.py:TestCQL.reversed_compact_test()
+     */
+    @Test
+    public void testReverseCompact() throws Throwable
+    {
+        createTable("CREATE TABLE %s ( k text, c int, v int, PRIMARY KEY (k, c) ) WITH COMPACT STORAGE AND CLUSTERING ORDER BY (c DESC)");
+
+        for (int i = 0; i < 10; i++)
+            execute("INSERT INTO %s (k, c, v) VALUES ('foo', ?, ?)", i, i);
+
+        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo'"),
+                   row(5), row(4), row(3));
+
+        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo'"),
+                   row(6), row(5), row(4), row(3), row(2));
+
+        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c ASC"),
+                   row(3), row(4), row(5));
+
+        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c ASC"),
+                   row(2), row(3), row(4), row(5), row(6));
+
+        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c DESC"),
+                   row(5), row(4), row(3));
+
+        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c DESC"),
+                   row(6), row(5), row(4), row(3), row(2));
+
+        createTable("CREATE TABLE %s ( k text, c int, v int, PRIMARY KEY (k, c) ) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 10; i++)
+            execute("INSERT INTO %s(k, c, v) VALUES ('foo', ?, ?)", i, i);
+
+        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo'"),
+                   row(3), row(4), row(5));
+
+        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo'"),
+                   row(2), row(3), row(4), row(5), row(6));
+
+        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c ASC"),
+                   row(3), row(4), row(5));
+
+        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c ASC"),
+                   row(2), row(3), row(4), row(5), row(6));
+
+        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c DESC"),
+                   row(5), row(4), row(3));
+
+        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c DESC"),
+                   row(6), row(5), row(4), row(3), row(2));
+    }
+
+    /**
+     * Test for the bug from #4760 and #4759,
+     * migrated from cql_tests.py:TestCQL.reversed_compact_multikey_test()
+     */
+    @Test
+    public void testReversedCompactMultikey() throws Throwable
+    {
+        createTable("CREATE TABLE %s (key text, c1 int, c2 int, value text, PRIMARY KEY(key, c1, c2) ) WITH COMPACT STORAGE AND CLUSTERING ORDER BY(c1 DESC, c2 DESC)");
+
+        for (int i = 0; i < 3; i++)
+            for (int j = 0; j < 3; j++)
+                execute("INSERT INTO %s (key, c1, c2, value) VALUES ('foo', ?, ?, 'bar')", i, j);
+
+        // Equalities
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 = 1"),
+                   row(1, 2), row(1, 1), row(1, 0));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 = 1 ORDER BY c1 ASC, c2 ASC"),
+                   row(1, 0), row(1, 1), row(1, 2));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 = 1 ORDER BY c1 DESC, c2 DESC"),
+                   row(1, 2), row(1, 1), row(1, 0));
+
+        // GT
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 > 1"),
+                   row(2, 2), row(2, 1), row(2, 0));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 > 1 ORDER BY c1 ASC, c2 ASC"),
+                   row(2, 0), row(2, 1), row(2, 2));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 > 1 ORDER BY c1 DESC, c2 DESC"),
+                   row(2, 2), row(2, 1), row(2, 0));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1"),
+                   row(2, 2), row(2, 1), row(2, 0), row(1, 2), row(1, 1), row(1, 0));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1 ORDER BY c1 ASC, c2 ASC"),
+                   row(1, 0), row(1, 1), row(1, 2), row(2, 0), row(2, 1), row(2, 2));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1 ORDER BY c1 ASC"),
+                   row(1, 0), row(1, 1), row(1, 2), row(2, 0), row(2, 1), row(2, 2));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1 ORDER BY c1 DESC, c2 DESC"),
+                   row(2, 2), row(2, 1), row(2, 0), row(1, 2), row(1, 1), row(1, 0));
+
+        // LT
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 < 1"),
+                   row(0, 2), row(0, 1), row(0, 0));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 < 1 ORDER BY c1 ASC, c2 ASC"),
+                   row(0, 0), row(0, 1), row(0, 2));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 < 1 ORDER BY c1 DESC, c2 DESC"),
+                   row(0, 2), row(0, 1), row(0, 0));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1"),
+                   row(1, 2), row(1, 1), row(1, 0), row(0, 2), row(0, 1), row(0, 0));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1 ORDER BY c1 ASC, c2 ASC"),
+                   row(0, 0), row(0, 1), row(0, 2), row(1, 0), row(1, 1), row(1, 2));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1 ORDER BY c1 ASC"),
+                   row(0, 0), row(0, 1), row(0, 2), row(1, 0), row(1, 1), row(1, 2));
+
+        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1 ORDER BY c1 DESC, c2 DESC"),
+                   row(1, 2), row(1, 1), row(1, 0), row(0, 2), row(0, 1), row(0, 0));
+    }
+
+    /**
+     * Migrated from cql_tests.py:TestCQL.multi_in_compact_non_composite_test()
+     */
+    @Test
+    public void testMultiSelectsNonCompositeCompactStorage() throws Throwable
+    {
+        createTable("CREATE TABLE %s (key int, c int, v int, PRIMARY KEY (key, c)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (key, c, v) VALUES (0, 0, 0)");
+        execute("INSERT INTO %s (key, c, v) VALUES (0, 1, 1)");
+        execute("INSERT INTO %s (key, c, v) VALUES (0, 2, 2)");
+
+        assertRows(execute("SELECT * FROM %s WHERE key=0 AND c IN (0, 2)"),
+                   row(0, 0, 0), row(0, 2, 2));
+    }
+
+    @Test
+    public void testSelectDistinct() throws Throwable
+    {
+        //Test a 'compact storage' table.
+        createTable("CREATE TABLE %s (pk0 int, pk1 int, val int, PRIMARY KEY((pk0, pk1))) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 3; i++)
+            execute("INSERT INTO %s (pk0, pk1, val) VALUES (?, ?, ?)", i, i, i);
+
+        assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s LIMIT 1"),
+                   row(0, 0));
+
+        assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s LIMIT 3"),
+                   row(0, 0),
+                   row(2, 2),
+                   row(1, 1));
+
+        // Test a 'wide row' thrift table.
+        createTable("CREATE TABLE %s (pk int, name text, val int, PRIMARY KEY(pk, name)) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 3; i++)
+        {
+            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name0', 0)", i);
+            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name1', 1)", i);
+        }
+
+        assertRows(execute("SELECT DISTINCT pk FROM %s LIMIT 1"),
+                   row(1));
+
+        assertRows(execute("SELECT DISTINCT pk FROM %s LIMIT 3"),
+                   row(1),
+                   row(0),
+                   row(2));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageSplit2Test.java b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageSplit2Test.java
new file mode 100644
index 0000000..e399feb
--- /dev/null
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageSplit2Test.java
@@ -0,0 +1,2782 @@
+/*
+ * 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.cql3.validation.operations;
+
+import java.util.Arrays;
+import java.util.EnumSet;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.db.RowUpdateBuilder;
+import org.apache.cassandra.db.SchemaCQLHelper;
+import org.apache.cassandra.db.marshal.AsciiType;
+import org.apache.cassandra.db.marshal.CounterColumnType;
+import org.apache.cassandra.db.marshal.IntegerType;
+import org.apache.cassandra.db.marshal.ReversedType;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
+import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+import static org.apache.commons.lang3.StringUtils.isEmpty;
+import static org.junit.Assert.assertTrue;
+
+public class CompactStorageSplit2Test extends CQLTester
+{
+    @Test
+    public void testFilteringOnCompactTablesWithoutIndices() throws Throwable
+    {
+        //----------------------------------------------
+        // Test COMPACT table with clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 6)");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, 7)");
+
+        // Adds tomstones
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 2, 7)");
+        execute("DELETE FROM %s WHERE a = 1 AND b = 1");
+        execute("DELETE FROM %s WHERE a = 2 AND b = 2");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4 ALLOW FILTERING"),
+                       row(1, 4, 4));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7)");
+
+            assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING"),
+                       row(1, 3, 6),
+                       row(2, 3, 7));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > 4 ALLOW FILTERING"),
+                       row(1, 3, 6),
+                       row(2, 3, 7));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b < 3 AND c <= 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= 4 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= 3 AND c <= 6");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= 3 AND c <= 6 ALLOW FILTERING"),
+                       row(1, 2, 4),
+                       row(1, 3, 6),
+                       row(1, 4, 4));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+
+        //----------------------------------------------
+        // Test COMPACT table without clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, 6)");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, 7)");
+
+        // Adds tomstones
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (5, 2, 7)");
+        execute("DELETE FROM %s WHERE a = 0");
+        execute("DELETE FROM %s WHERE a = 5");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = 4 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7)");
+
+            assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING"),
+                       row(2, 1, 6));
+
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > 4 ALLOW FILTERING"),
+                       row(2, 1, 6),
+                       row(4, 1, 7));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b < 3 AND c <= 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= 4 ALLOW FILTERING"),
+                       row(1, 2, 4),
+                       row(3, 2, 4));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= 3 AND c <= 6");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= 3 AND c <= 6 ALLOW FILTERING"),
+                       row(1, 2, 4),
+                       row(2, 1, 6),
+                       row(3, 2, 4));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+
+        // // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+    }
+
+    @Test
+    public void testFilteringOnCompactTablesWithoutIndicesAndWithLists() throws Throwable
+    {
+        //----------------------------------------------
+        // Test COMPACT table with clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c frozen<list<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, [6, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, [4, 1])");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, [7, 1])");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = [4, 1]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = [4, 1] ALLOW FILTERING"),
+                       row(1, 4, list(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > [4, 2] ALLOW FILTERING"),
+                       row(1, 3, list(6, 2)),
+                       row(2, 3, list(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b <= 3 AND c < [6, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE b <= 3 AND c < [6, 2] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= [4, 2] AND c <= [6, 4]");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= [4, 2] AND c <= [6, 4] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)),
+                       row(1, 3, list(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)),
+                       row(1, 3, list(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(1, 3, list(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
+                             unset());
+
+        //----------------------------------------------
+        // Test COMPACT table without clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<list<int>>) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, [6, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, [4, 1])");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, [7, 1])");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = [4, 2] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > [4, 2] ALLOW FILTERING"),
+                       row(2, 1, list(6, 2)),
+                       row(4, 1, list(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b < 3 AND c <= [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= [4, 2] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)),
+                       row(3, 2, list(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= [4, 3] AND c <= [7]");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= [4, 3] AND c <= [7] ALLOW FILTERING"),
+                       row(2, 1, list(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)),
+                       row(2, 1, list(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(2, 1, list(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
+                             unset());
+    }
+
+    @Test
+    public void testFilteringOnCompactTablesWithoutIndicesAndWithSets() throws Throwable
+    {
+        //----------------------------------------------
+        // Test COMPACT table with clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c frozen<set<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4, 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7, 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4, 1}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4, 1} ALLOW FILTERING"),
+                       row(1, 4, set(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > {4, 2} ALLOW FILTERING"),
+                       row(1, 3, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b <= 3 AND c < {6, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE b <= 3 AND c < {6, 2} ALLOW FILTERING"),
+                       row(1, 2, set(2, 4)),
+                       row(2, 3, set(1, 7)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= {4, 2} AND c <= {6, 4}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= {4, 2} AND c <= {6, 4} ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(1, 3, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(1, 3, set(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(1, 3, set(6, 2)));
+        });
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
+                             unset());
+
+        //----------------------------------------------
+        // Test COMPACT table without clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<set<int>>) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4, 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7, 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4, 2} ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > {4, 2} ALLOW FILTERING"),
+                       row(2, 1, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b < 3 AND c <= {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= {4, 2} ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(4, 1, set(1, 7)),
+                       row(3, 2, set(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= {4, 3} AND c <= {7}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= {5, 2} AND c <= {7} ALLOW FILTERING"),
+                       row(2, 1, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(2, 1, set(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(2, 1, set(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
+                             unset());
+    }
+
+    @Test
+    public void testAllowFilteringOnPartitionKeyWithDistinct() throws Throwable
+    {
+        // Test a 'compact storage' table.
+        createTable("CREATE TABLE %s (pk0 int, pk1 int, val int, PRIMARY KEY((pk0, pk1))) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 3; i++)
+            execute("INSERT INTO %s (pk0, pk1, val) VALUES (?, ?, ?)", i, i, i);
+
+        beforeAndAfterFlush(() -> {
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT DISTINCT pk0, pk1 FROM %s WHERE pk1 = 1 LIMIT 3");
+
+            assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s WHERE pk0 < 2 AND pk1 = 1 LIMIT 1 ALLOW FILTERING"),
+                       row(1, 1));
+
+            assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s WHERE pk1 > 1 LIMIT 3 ALLOW FILTERING"),
+                       row(2, 2));
+        });
+
+        // Test a 'wide row' thrift table.
+        createTable("CREATE TABLE %s (pk int, name text, val int, PRIMARY KEY(pk, name)) WITH COMPACT STORAGE");
+
+        for (int i = 0; i < 3; i++)
+        {
+            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name0', 0)", i);
+            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name1', 1)", i);
+        }
+
+        beforeAndAfterFlush(() -> {
+            assertRows(execute("SELECT DISTINCT pk FROM %s WHERE pk > 1 LIMIT 1 ALLOW FILTERING"),
+                       row(2));
+
+            assertRows(execute("SELECT DISTINCT pk FROM %s WHERE pk > 0 LIMIT 3 ALLOW FILTERING"),
+                       row(1),
+                       row(2));
+        });
+    }
+
+    @Test
+    public void testAllowFilteringOnPartitionKeyWithCounters() throws Throwable
+    {
+        for (String compactStorageClause : new String[]{ "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (a int, b int, c int, cnt counter, PRIMARY KEY ((a, b), c))"
+                        + compactStorageClause);
+
+            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 14L, 11, 12, 13);
+            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 21, 22, 23);
+            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 27L, 21, 22, 26);
+            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 34L, 31, 32, 33);
+            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 41, 42, 43);
+
+            beforeAndAfterFlush(() -> {
+
+                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt = 24"),
+                           row(41, 42, 43, 24L),
+                           row(21, 22, 23, 24L));
+                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 22 AND cnt = 24"),
+                           row(41, 42, 43, 24L));
+                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND b < 25 AND cnt = 24"),
+                           row(21, 22, 23, 24L));
+                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND c < 25 AND cnt = 24"),
+                           row(21, 22, 23, 24L));
+
+                assertInvalidMessage(
+                "ORDER BY is only supported when the partition key is restricted by an EQ or an IN.",
+                "SELECT * FROM %s WHERE a = 21 AND b > 10 AND cnt > 23 ORDER BY c DESC ALLOW FILTERING");
+
+                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a = 21 AND b = 22 AND cnt > 23 ORDER BY c DESC"),
+                           row(21, 22, 26, 27L),
+                           row(21, 22, 23, 24L));
+
+                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt > 20 AND cnt < 30"),
+                           row(41, 42, 43, 24L),
+                           row(21, 22, 23, 24L),
+                           row(21, 22, 26, 27L));
+            });
+        }
+    }
+
+    @Test
+    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndicesAndWithLists() throws Throwable
+    {
+        // ----------------------------------------------
+        // Test COMPACT table with clustering columns
+        // ----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c frozen<list<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, [6, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, [4, 1])");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, [7, 1])");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = [4, 1]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b >= 4 AND c = [4, 1] ALLOW FILTERING"),
+                       row(1, 4, list(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 0 AND c > [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > [4, 2] ALLOW FILTERING"),
+                       row(1, 3, list(6, 2)),
+                       row(2, 3, list(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 1 AND b <= 3 AND c < [6, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a <= 1 AND b <= 3 AND c < [6, 2] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a <= 1 AND c >= [4, 2] AND c <= [6, 4]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND b <= 3 AND c >= [4, 2] AND c <= [6, 4] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)),
+                       row(1, 3, list(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 1 AND c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)),
+                       row(1, 3, list(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE a > 1 AND c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(1, 3, list(6, 2)));
+        });
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a > 1 AND c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a > 1 AND c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS ? ALLOW FILTERING",
+                             unset());
+
+        // ----------------------------------------------
+        // Test COMPACT table without clustering columns
+        // ----------------------------------------------
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<list<int>>) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, [6, 2])");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, [4, 1])");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, [7, 1])");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = [4, 2] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 1 AND c > [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 3 AND c > [4, 2] ALLOW FILTERING"),
+                       row(4, 1, list(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a < 1 AND b < 3 AND c <= [4, 2]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND b < 3 AND c <= [4, 2] ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 1 AND c >= [4, 3] AND c <= [7]");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c >= [4, 3] AND c <= [7] ALLOW FILTERING"),
+                       row(2, 1, list(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 3 AND c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, list(4, 2)),
+                       row(2, 1, list(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE a >=1 AND c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(2, 1, list(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a > 1 AND c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a > 1 AND c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS ? ALLOW FILTERING",
+                             unset());
+    }
+
+
+    @Test
+    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndicesAndWithMaps() throws Throwable
+    {
+        //----------------------------------------------
+        // Test COMPACT table with clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c frozen<map<int, int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4 : 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7 : 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = {4 : 1}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a <= 1 AND b = 4 AND c = {4 : 1} ALLOW FILTERING"),
+                       row(1, 4, map(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 1 AND c > {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 1 AND c > {4 : 2} ALLOW FILTERING"),
+                       row(2, 3, map(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 1 AND b <= 3 AND c < {6 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b <= 3 AND c < {6 : 2} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 1 AND c >= {4 : 2} AND c <= {6 : 4}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c >= {4 : 2} AND c <= {6 : 4} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(1, 3, map(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a > 10 AND c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(1, 3, map(6, 2)));
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
+                       row(1, 3, map(6, 2)));
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
+                       row(1, 3, map(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY ? ALLOW FILTERING",
+                             unset());
+
+        //----------------------------------------------
+        // Test COMPACT table without clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<map<int, int>>) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4 : 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7 : 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4 : 2} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c > {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > {4 : 2} ALLOW FILTERING"),
+                       row(2, 1, map(6, 2)),
+                       row(4, 1, map(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b < 3 AND c <= {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b < 3 AND c <= {4 : 2} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(3, 2, map(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c >= {4 : 3} AND c <= {7 : 1}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c >= {5 : 2} AND c <= {7 : 0} ALLOW FILTERING"),
+                       row(2, 1, map(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(2, 1, map(6, 2)));
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c CONTAINS KEY 4 ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(3, 2, map(4, 1)));
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
+                       row(2, 1, map(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY ? ALLOW FILTERING",
+                             unset());
+    }
+
+    @Test
+    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndicesAndWithSets() throws Throwable
+    {
+        //----------------------------------------------
+        // Test COMPACT table with clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c frozen<set<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4, 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7, 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = {4, 1}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = {4, 1} ALLOW FILTERING"),
+                       row(1, 4, set(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c > {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > {4, 2} ALLOW FILTERING"),
+                       row(1, 3, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b <= 3 AND c < {6, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND b <= 3 AND c < {6, 2} ALLOW FILTERING"),
+                       row(1, 2, set(2, 4)),
+                       row(2, 3, set(1, 7)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c >= {4, 2} AND c <= {6, 4}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 0 AND c >= {4, 2} AND c <= {6, 4} ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(1, 3, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(1, 3, set(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(1, 3, set(6, 2)));
+        });
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
+                             unset());
+
+        //----------------------------------------------
+        // Test COMPACT table without clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<set<int>>) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6, 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4, 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7, 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4, 2} ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c > {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > {4, 2} ALLOW FILTERING"),
+                       row(2, 1, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND b < 3 AND c <= {4, 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a <= 4 AND b < 3 AND c <= {4, 2} ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(4, 1, set(1, 7)),
+                       row(3, 2, set(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c >= {4, 3} AND c <= {7}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND c >= {5, 2} AND c <= {7} ALLOW FILTERING"),
+                       row(2, 1, set(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 0 AND c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, set(4, 2)),
+                       row(2, 1, set(6, 2)));
+
+            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
+                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY 2 ALLOW FILTERING");
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
+                       row(2, 1, set(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
+                             unset());
+    }
+
+    @Test
+    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndices() throws Throwable
+    {
+        // ----------------------------------------------
+        // Test COMPACT table with clustering columns
+        // ----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 2, 4, 5)");
+        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 3, 6, 7)");
+        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 4, 4, 5)");
+        execute("INSERT INTO %s (a, b, c, d) VALUES (2, 3, 7, 8)");
+
+        // Adds tomstones
+        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 1, 4, 5)");
+        execute("INSERT INTO %s (a, b, c, d) VALUES (2, 2, 7, 8)");
+        execute("DELETE FROM %s WHERE a = 1 AND b = 1 AND c = 4");
+        execute("DELETE FROM %s WHERE a = 2 AND b = 2 AND c = 7");
+
+        beforeAndAfterFlush(() -> {
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4"),
+                       row(1, 4, 4, 5));
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4 AND d = 5");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4 ALLOW FILTERING"),
+                       row(1, 4, 4, 5));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a IN (1, 2) AND b = 3 AND d IN (6, 7)");
+
+            assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2) AND b = 3 AND d IN (6, 7) ALLOW FILTERING"),
+                       row(1, 3, 6, 7));
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c > 4 AND c <= 6 ALLOW FILTERING"),
+                       row(1, 3, 6, 7));
+
+            assertRows(execute("SELECT * FROM %s WHERE a <= 1 AND b >= 2 AND c >= 4 AND d <= 8 ALLOW FILTERING"),
+                       row(1, 3, 6, 7),
+                       row(1, 4, 4, 5),
+                       row(1, 2, 4, 5));
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND c >= 4 AND d <= 8 ALLOW FILTERING"),
+                       row(1, 3, 6, 7),
+                       row(1, 4, 4, 5),
+                       row(1, 2, 4, 5));
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c >= 4 AND d <= 8 ALLOW FILTERING"),
+                       row(2, 3, 7, 8));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE d = null");
+        assertInvalidMessage("Unsupported null value for column a",
+                             "SELECT * FROM %s WHERE a = null ALLOW FILTERING");
+        assertInvalidMessage("Unsupported null value for column a",
+                             "SELECT * FROM %s WHERE a > null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column a",
+                             "SELECT * FROM %s WHERE a = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column a",
+                             "SELECT * FROM %s WHERE a > ? ALLOW FILTERING",
+                             unset());
+
+        //----------------------------------------------
+        // Test COMPACT table without clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int primary key, b int, c int) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, 6)");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, 7)");
+
+        // Adds tomstones
+        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES (5, 2, 7)");
+        execute("DELETE FROM %s WHERE a = 0");
+        execute("DELETE FROM %s WHERE a = 5");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = 4 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE b >= 2 AND c <= 4 ALLOW FILTERING"),
+                       row(1, 2, 4),
+                       row(3, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE b >= 2 ALLOW FILTERING"),
+                       row(1, 2, 4),
+                       row(3, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND b <=1 ALLOW FILTERING"),
+                       row(2, 1, 6),
+                       row(4, 1, 7));
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND c >= 4 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b IN (1, 2) AND c IN (6, 7)");
+
+            assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING"),
+                       row(2, 1, 6));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > 4");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > 4 ALLOW FILTERING"),
+                       row(2, 1, 6),
+                       row(4, 1, 7));
+
+            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b >= 2 AND c <= 4 ALLOW FILTERING"),
+                       row(1, 2, 4),
+                       row(3, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND c <= 4 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND b >= 2 AND c <= 4 ALLOW FILTERING"),
+                       row(1, 2, 4));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= 3 AND c <= 6");
+
+            assertRows(execute("SELECT * FROM %s WHERE c <=6 ALLOW FILTERING"),
+                       row(1, 2, 4),
+                       row(2, 1, 6),
+                       row(3, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(2)"),
+                       row(2, 1, 6),
+                       row(4, 1, 7),
+                       row(3, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(2) ALLOW FILTERING"),
+                       row(2, 1, 6),
+                       row(4, 1, 7),
+                       row(3, 2, 4));
+
+            assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(2) AND b = 1 ALLOW FILTERING"),
+                       row(2, 1, 6),
+                       row(4, 1, 7));
+        });
+    }
+
+    @Test
+    public void testFilteringOnCompactTablesWithoutIndicesAndWithMaps() throws Throwable
+    {
+        //----------------------------------------------
+        // Test COMPACT table with clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int, b int, c frozen<map<int, int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4 : 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7 : 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4 : 1}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4 : 1} ALLOW FILTERING"),
+                       row(1, 4, map(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > {4 : 2} ALLOW FILTERING"),
+                       row(1, 3, map(6, 2)),
+                       row(2, 3, map(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b <= 3 AND c < {6 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE b <= 3 AND c < {6 : 2} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= {4 : 2} AND c <= {6 : 4}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= {4 : 2} AND c <= {6 : 4} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(1, 3, map(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(1, 3, map(6, 2)));
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS KEY 6 ALLOW FILTERING"),
+                       row(1, 3, map(6, 2)));
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
+                       row(1, 3, map(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS KEY null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS KEY ? ALLOW FILTERING",
+                             unset());
+
+        //----------------------------------------------
+        // Test COMPACT table without clustering columns
+        //----------------------------------------------
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<map<int, int>>) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6 : 2})");
+        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4 : 1})");
+        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7 : 1})");
+
+        beforeAndAfterFlush(() -> {
+
+            // Checks filtering
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4 : 2} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c > {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c > {4 : 2} ALLOW FILTERING"),
+                       row(2, 1, map(6, 2)),
+                       row(4, 1, map(7, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE b < 3 AND c <= {4 : 2}");
+
+            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= {4 : 2} ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(3, 2, map(4, 1)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c >= {4 : 3} AND c <= {7 : 1}");
+
+            assertRows(execute("SELECT * FROM %s WHERE c >= {5 : 2} AND c <= {7 : 0} ALLOW FILTERING"),
+                       row(2, 1, map(6, 2)));
+
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                 "SELECT * FROM %s WHERE c CONTAINS 2");
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(2, 1, map(6, 2)));
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS KEY 4 ALLOW FILTERING"),
+                       row(1, 2, map(4, 2)),
+                       row(3, 2, map(4, 1)));
+
+            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
+                       row(2, 1, map(6, 2)));
+        });
+
+        // Checks filtering with null
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c = null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c > null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c CONTAINS null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT * FROM %s WHERE c CONTAINS KEY null");
+        assertInvalidMessage("Unsupported null value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS KEY null ALLOW FILTERING");
+
+        // Checks filtering with unset
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
+                             unset());
+        assertInvalidMessage("Unsupported unset value for column c",
+                             "SELECT * FROM %s WHERE c CONTAINS KEY ? ALLOW FILTERING",
+                             unset());
+    }
+
+    @Test
+    public void filteringOnCompactTable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 11, 12, 13, 14);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 22, 23, 24);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 25, 26, 27);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 31, 32, 33, 34);
+
+        beforeAndAfterFlush(() -> {
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13"),
+                       row(21, 22, 23, 24),
+                       row(21, 25, 26, 27),
+                       row(31, 32, 33, 34));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13 AND c < 33"),
+                       row(21, 22, 23, 24),
+                       row(21, 25, 26, 27));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13 AND b < 32"),
+                       row(21, 22, 23, 24),
+                       row(21, 25, 26, 27));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a = 21 AND c > 13 AND b < 32 ORDER BY b DESC"),
+                       row(21, 25, 26, 27),
+                       row(21, 22, 23, 24));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a IN (21, 31) AND c > 13 ORDER BY b DESC"),
+                       row(31, 32, 33, 34),
+                       row(21, 25, 26, 27),
+                       row(21, 22, 23, 24));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13 AND d < 34"),
+                       row(21, 22, 23, 24),
+                       row(21, 25, 26, 27));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13"),
+                       row(21, 22, 23, 24),
+                       row(21, 25, 26, 27),
+                       row(31, 32, 33, 34));
+        });
+
+        // with frozen in clustering key
+        createTable("CREATE TABLE %s (a int, b int, c frozen<list<int>>, d int, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 11, 12, list(1, 3), 14);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 22, list(2, 3), 24);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 25, list(2, 6), 27);
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 31, 32, list(3, 3), 34);
+
+        beforeAndAfterFlush(() -> {
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c CONTAINS 2"),
+                       row(21, 22, list(2, 3), 24),
+                       row(21, 25, list(2, 6), 27));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c CONTAINS 2 AND b < 25"),
+                       row(21, 22, list(2, 3), 24));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 3"),
+                       row(21, 22, list(2, 3), 24));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 12 AND c CONTAINS 2 AND d < 27"),
+                       row(21, 22, list(2, 3), 24));
+        });
+
+        // with frozen in value
+        createTable("CREATE TABLE %s (a int, b int, c int, d frozen<list<int>>, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
+
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 11, 12, 13, list(1, 4));
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 22, 23, list(2, 4));
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 25, 25, list(2, 6));
+        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 31, 32, 34, list(3, 4));
+
+        beforeAndAfterFlush(() -> {
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE d CONTAINS 2"),
+                       row(21, 22, 23, list(2, 4)),
+                       row(21, 25, 25, list(2, 6)));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE d CONTAINS 2 AND b < 25"),
+                       row(21, 22, 23, list(2, 4)));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE d CONTAINS 2 AND d CONTAINS 4"),
+                       row(21, 22, 23, list(2, 4)));
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 12 AND c < 25 AND d CONTAINS 2"),
+                       row(21, 22, 23, list(2, 4)));
+        });
+    }
+
+    private UntypedResultSet executeFilteringOnly(String statement) throws Throwable
+    {
+        assertInvalid(statement);
+        return execute(statement + " ALLOW FILTERING");
+    }
+
+    @Test
+    public void testFilteringWithCounters() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, c int, cnt counter, PRIMARY KEY (a, b, c))" + CompactStorageSplit1Test.compactOption);
+
+        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 14L, 11, 12, 13);
+        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 21, 22, 23);
+        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 27L, 21, 25, 26);
+        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 34L, 31, 32, 33);
+        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 41, 42, 43);
+
+        beforeAndAfterFlush(() -> {
+
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt = 24"),
+                       row(21, 22, 23, 24L),
+                       row(41, 42, 43, 24L));
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 22 AND cnt = 24"),
+                       row(41, 42, 43, 24L));
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND b < 25 AND cnt = 24"),
+                       row(21, 22, 23, 24L));
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND c < 25 AND cnt = 24"),
+                       row(21, 22, 23, 24L));
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a = 21 AND b > 10 AND cnt > 23 ORDER BY b DESC"),
+                       row(21, 25, 26, 27L),
+                       row(21, 22, 23, 24L));
+            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt > 20 AND cnt < 30"),
+                       row(21, 22, 23, 24L),
+                       row(21, 25, 26, 27L),
+                       row(41, 42, 43, 24L));
+        });
+    }
+
+    /**
+     * Check select with and without compact storage, with different column
+     * order. See CASSANDRA-10988
+     */
+    @Test
+    public void testClusteringOrderWithSlice() throws Throwable
+    {
+        final String compactOption = " WITH COMPACT STORAGE AND";
+
+        // non-compound, ASC order
+        createTable("CREATE TABLE %s (a text, b int, PRIMARY KEY (a, b)) " +
+                    compactOption +
+                    " CLUSTERING ORDER BY (b ASC)");
+
+        execute("INSERT INTO %s (a, b) VALUES ('a', 2)");
+        execute("INSERT INTO %s (a, b) VALUES ('a', 3)");
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
+                   row("a", 2),
+                   row("a", 3));
+
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b DESC"),
+                   row("a", 3),
+                   row("a", 2));
+
+        // non-compound, DESC order
+        createTable("CREATE TABLE %s (a text, b int, PRIMARY KEY (a, b))" +
+                    compactOption +
+                    " CLUSTERING ORDER BY (b DESC)");
+
+        execute("INSERT INTO %s (a, b) VALUES ('a', 2)");
+        execute("INSERT INTO %s (a, b) VALUES ('a', 3)");
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
+                   row("a", 3),
+                   row("a", 2));
+
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b ASC"),
+                   row("a", 2),
+                   row("a", 3));
+
+        // compound, first column DESC order
+        createTable("CREATE TABLE %s (a text, b int, c int, PRIMARY KEY (a, b, c)) " +
+                    compactOption +
+                    " CLUSTERING ORDER BY (b DESC)"
+        );
+
+        execute("INSERT INTO %s (a, b, c) VALUES ('a', 2, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES ('a', 3, 5)");
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
+                   row("a", 3, 5),
+                   row("a", 2, 4));
+
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b ASC"),
+                   row("a", 2, 4),
+                   row("a", 3, 5));
+
+        // compound, mixed order
+        createTable("CREATE TABLE %s (a text, b int, c int, PRIMARY KEY (a, b, c)) " +
+                    compactOption +
+                    " CLUSTERING ORDER BY (b ASC, c DESC)"
+        );
+
+        execute("INSERT INTO %s (a, b, c) VALUES ('a', 2, 4)");
+        execute("INSERT INTO %s (a, b, c) VALUES ('a', 3, 5)");
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
+                   row("a", 2, 4),
+                   row("a", 3, 5));
+
+        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b ASC"),
+                   row("a", 2, 4),
+                   row("a", 3, 5));
+    }
+
+
+    @Test
+    public void testEmptyRestrictionValue() throws Throwable
+    {
+        for (String options : new String[]{ "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk blob, c blob, v blob, PRIMARY KEY ((pk), c))" + options);
+            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                    bytes("foo123"), bytes("1"), bytes("1"));
+            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                    bytes("foo123"), bytes("2"), bytes("2"));
+
+            beforeAndAfterFlush(() -> {
+
+                assertInvalidMessage("Key may not be empty", "SELECT * FROM %s WHERE pk = textAsBlob('');");
+                assertInvalidMessage("Key may not be empty", "SELECT * FROM %s WHERE pk IN (textAsBlob(''), textAsBlob('1'));");
+
+                assertInvalidMessage("Key may not be empty",
+                                     "INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                                     EMPTY_BYTE_BUFFER, bytes("2"), bytes("2"));
+
+                // Test clustering columns restrictions
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c = textAsBlob('');"));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) = (textAsBlob(''));"));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c IN (textAsBlob(''), textAsBlob('1'));"),
+                           row(bytes("foo123"), bytes("1"), bytes("1")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) IN ((textAsBlob('')), (textAsBlob('1')));"),
+                           row(bytes("foo123"), bytes("1"), bytes("1")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('');"),
+                           row(bytes("foo123"), bytes("1"), bytes("1")),
+                           row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) > (textAsBlob(''));"),
+                           row(bytes("foo123"), bytes("1"), bytes("1")),
+                           row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('');"),
+                           row(bytes("foo123"), bytes("1"), bytes("1")),
+                           row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) >= (textAsBlob(''));"),
+                           row(bytes("foo123"), bytes("1"), bytes("1")),
+                           row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c <= textAsBlob('');"));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) <= (textAsBlob(''));"));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c < textAsBlob('');"));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) < (textAsBlob(''));"));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('') AND c < textAsBlob('');"));
+            });
+
+            if (options.contains("COMPACT"))
+            {
+                assertInvalidMessage("Invalid empty or null value for column c",
+                                     "INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                                     bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4"));
+            }
+            else
+            {
+                execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                        bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4"));
+
+                beforeAndAfterFlush(() -> {
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c = textAsBlob('');"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) = (textAsBlob(''));"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c IN (textAsBlob(''), textAsBlob('1'));"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
+                               row(bytes("foo123"), bytes("1"), bytes("1")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) IN ((textAsBlob('')), (textAsBlob('1')));"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
+                               row(bytes("foo123"), bytes("1"), bytes("1")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('');"),
+                               row(bytes("foo123"), bytes("1"), bytes("1")),
+                               row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) > (textAsBlob(''));"),
+                               row(bytes("foo123"), bytes("1"), bytes("1")),
+                               row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('');"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
+                               row(bytes("foo123"), bytes("1"), bytes("1")),
+                               row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) >= (textAsBlob(''));"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
+                               row(bytes("foo123"), bytes("1"), bytes("1")),
+                               row(bytes("foo123"), bytes("2"), bytes("2")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c <= textAsBlob('');"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
+
+                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) <= (textAsBlob(''));"),
+                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
+
+                    assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c < textAsBlob('');"));
+
+                    assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) < (textAsBlob(''));"));
+
+                    assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('') AND c < textAsBlob('');"));
+                });
+            }
+
+            // Test restrictions on non-primary key value
+            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND v = textAsBlob('') ALLOW FILTERING;"));
+
+            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                    bytes("foo123"), bytes("3"), EMPTY_BYTE_BUFFER);
+
+            beforeAndAfterFlush(() -> {
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND v = textAsBlob('') ALLOW FILTERING;"),
+                           row(bytes("foo123"), bytes("3"), EMPTY_BYTE_BUFFER));
+            });
+        }
+    }
+
+    @Test
+    public void testEmptyRestrictionValueWithMultipleClusteringColumns() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk blob, c1 blob, c2 blob, v blob, PRIMARY KEY (pk, c1, c2))" + CompactStorageSplit1Test.compactOption);
+        execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("1"), bytes("1"));
+        execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("2"), bytes("2"));
+
+        beforeAndAfterFlush(() -> {
+
+            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('');"));
+
+            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 = textAsBlob('');"));
+
+            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) = (textAsBlob('1'), textAsBlob(''));"));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 IN (textAsBlob(''), textAsBlob('1')) AND c2 = textAsBlob('1');"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 IN (textAsBlob(''), textAsBlob('1'));"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) IN ((textAsBlob(''), textAsBlob('1')), (textAsBlob('1'), textAsBlob('1')));"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 > textAsBlob('');"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 > textAsBlob('');"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'));"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 >= textAsBlob('');"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
+
+            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 <= textAsBlob('');"));
+
+            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) <= (textAsBlob('1'), textAsBlob(''));"));
+        });
+
+        execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)",
+                bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4"));
+
+        beforeAndAfterFlush(() -> {
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('');"),
+                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('') AND c2 = textAsBlob('1');"),
+                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) = (textAsBlob(''), textAsBlob('1'));"),
+                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 IN (textAsBlob(''), textAsBlob('1')) AND c2 = textAsBlob('1');"),
+                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) IN ((textAsBlob(''), textAsBlob('1')), (textAsBlob('1'), textAsBlob('1')));"),
+                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'));"),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) >= (textAsBlob(''), textAsBlob('1'));"),
+                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")),
+                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
+
+            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) <= (textAsBlob(''), textAsBlob('1'));"),
+                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
+
+            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) < (textAsBlob(''), textAsBlob('1'));"));
+        });
+    }
+
+    @Test
+    public void testEmptyRestrictionValueWithOrderBy() throws Throwable
+    {
+        for (String options : new String[]{ " WITH COMPACT STORAGE",
+                                            " WITH COMPACT STORAGE AND CLUSTERING ORDER BY (c DESC)" })
+        {
+            String orderingClause = options.contains("ORDER") ? "" : "ORDER BY c DESC";
+
+            createTable("CREATE TABLE %s (pk blob, c blob, v blob, PRIMARY KEY ((pk), c))" + options);
+            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                    bytes("foo123"),
+                    bytes("1"),
+                    bytes("1"));
+            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                    bytes("foo123"),
+                    bytes("2"),
+                    bytes("2"));
+
+            beforeAndAfterFlush(() -> {
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('')" + orderingClause),
+                           row(bytes("foo123"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('')" + orderingClause),
+                           row(bytes("foo123"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1")));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c < textAsBlob('')" + orderingClause));
+
+                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c <= textAsBlob('')" + orderingClause));
+            });
+
+            assertInvalidMessage("Invalid empty or null value for column c",
+                                 "INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
+                                 bytes("foo123"),
+                                 EMPTY_BYTE_BUFFER,
+                                 bytes("4"));
+        }
+    }
+
+    @Test
+    public void testEmptyRestrictionValueWithMultipleClusteringColumnsAndOrderBy() throws Throwable
+    {
+        for (String options : new String[]{ " WITH COMPACT STORAGE",
+                                            " WITH COMPACT STORAGE AND CLUSTERING ORDER BY (c1 DESC, c2 DESC)" })
+        {
+            String orderingClause = options.contains("ORDER") ? "" : "ORDER BY c1 DESC, c2 DESC";
+
+            createTable("CREATE TABLE %s (pk blob, c1 blob, c2 blob, v blob, PRIMARY KEY (pk, c1, c2))" + options);
+            execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("1"), bytes("1"));
+            execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("2"), bytes("2"));
+
+            beforeAndAfterFlush(() -> {
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 > textAsBlob('')" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 > textAsBlob('')" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'))" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 >= textAsBlob('')" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+            });
+
+            execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)",
+                    bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4"));
+
+            beforeAndAfterFlush(() -> {
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 IN (textAsBlob(''), textAsBlob('1')) AND c2 = textAsBlob('1')" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                           row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) IN ((textAsBlob(''), textAsBlob('1')), (textAsBlob('1'), textAsBlob('1')))" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                           row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'))" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
+
+                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) >= (textAsBlob(''), textAsBlob('1'))" + orderingClause),
+                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
+                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
+                           row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
+            });
+        }
+    }
+
+    /**
+     * UpdateTest
+     */
+    @Test
+    public void testUpdate() throws Throwable
+    {
+        testUpdate(false);
+        testUpdate(true);
+    }
+
+    private void testUpdate(boolean forceFlush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering_1 int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering_1))" + CompactStorageSplit1Test.compactOption);
+
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 1, 1)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 2, 2)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 3, 3)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (1, 0, 4)");
+
+        flush(forceFlush);
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ?", 7, 0, 1);
+        flush(forceFlush);
+        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ?",
+                           0, 1),
+                   row(7));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1) = (?)", 8, 0, 2);
+        flush(forceFlush);
+        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ?",
+                           0, 2),
+                   row(8));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey IN (?, ?) AND clustering_1 = ?", 9, 0, 1, 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?) AND clustering_1 = ?",
+                           0, 1, 0),
+                   row(0, 0, 9),
+                   row(1, 0, 9));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey IN ? AND clustering_1 = ?", 19, Arrays.asList(0, 1), 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN ? AND clustering_1 = ?",
+                           Arrays.asList(0, 1), 0),
+                   row(0, 0, 19),
+                   row(1, 0, 19));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 IN (?, ?)", 10, 0, 1, 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 IN (?, ?)",
+                           0, 1, 0),
+                   row(0, 0, 10),
+                   row(0, 1, 10));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))", 20, 0, 0, 1);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))",
+                           0, 0, 1),
+                   row(0, 0, 20),
+                   row(0, 1, 20));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ?", null, 0, 0);
+        flush(forceFlush);
+
+        if (isEmpty(CompactStorageSplit1Test.compactOption))
+        {
+            assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))",
+                               0, 0, 1),
+                       row(0, 0, null),
+                       row(0, 1, 20));
+        }
+        else
+        {
+            assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))",
+                               0, 0, 1),
+                       row(0, 1, 20));
+        }
+
+        // test invalid queries
+
+        // missing primary key element
+        assertInvalidMessage("Some partition key parts are missing: partitionkey",
+                             "UPDATE %s SET value = ? WHERE clustering_1 = ? ", 7, 1);
+
+        assertInvalidMessage("Some clustering keys are missing: clustering_1",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ?", 7, 0);
+
+        assertInvalidMessage("Some clustering keys are missing: clustering_1",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ?", 7, 0);
+
+        // token function
+        assertInvalidMessage("The token function cannot be used in WHERE clauses for UPDATE statements",
+                             "UPDATE %s SET value = ? WHERE token(partitionKey) = token(?) AND clustering_1 = ?",
+                             7, 0, 1);
+
+        // multiple time the same value
+        assertInvalidSyntax("UPDATE %s SET value = ?, value = ? WHERE partitionKey = ? AND clustering_1 = ?", 7, 0, 1);
+
+        // multiple time same primary key element in WHERE clause
+        assertInvalidMessage("clustering_1 cannot be restricted by more than one relation if it includes an Equal",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_1 = ?", 7, 0, 1, 1);
+
+        // Undefined column names
+        assertInvalidMessage("Undefined column name value1",
+                             "UPDATE %s SET value1 = ? WHERE partitionKey = ? AND clustering_1 = ?", 7, 0, 1);
+
+        assertInvalidMessage("Undefined column name partitionkey1",
+                             "UPDATE %s SET value = ? WHERE partitionKey1 = ? AND clustering_1 = ?", 7, 0, 1);
+
+        assertInvalidMessage("Undefined column name clustering_3",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_3 = ?", 7, 0, 1);
+
+        // Invalid operator in the where clause
+        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
+                             "UPDATE %s SET value = ? WHERE partitionKey > ? AND clustering_1 = ?", 7, 0, 1);
+
+        assertInvalidMessage("Cannot use UPDATE with CONTAINS",
+                             "UPDATE %s SET value = ? WHERE partitionKey CONTAINS ? AND clustering_1 = ?", 7, 0, 1);
+
+        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND value = ?", 7, 0, 1, 3);
+
+        assertInvalidMessage("Slice restrictions are not supported on the clustering columns in UPDATE statements",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 > ?", 7, 0, 1);
+    }
+
+    @Test
+    public void testUpdateWithTwoClusteringColumns() throws Throwable
+    {
+        testUpdateWithTwoClusteringColumns(false);
+        testUpdateWithTwoClusteringColumns(true);
+    }
+
+    private void testUpdateWithTwoClusteringColumns(boolean forceFlush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey int," +
+                    "clustering_1 int," +
+                    "clustering_2 int," +
+                    "value int," +
+                    " PRIMARY KEY (partitionKey, clustering_1, clustering_2))" + CompactStorageSplit1Test.compactOption);
+
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 1, 1)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 2, 2)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 3, 3)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 1, 4)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 2, 5)");
+        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (1, 0, 0, 6)");
+        flush(forceFlush);
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
+        flush(forceFlush);
+        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
+                           0, 1, 1),
+                   row(7));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1, clustering_2) = (?, ?)", 8, 0, 1, 2);
+        flush(forceFlush);
+        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
+                           0, 1, 2),
+                   row(8));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?", 9, 0, 1, 0, 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?",
+                           0, 1, 0, 0),
+                   row(0, 0, 0, 9),
+                   row(1, 0, 0, 9));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey IN ? AND clustering_1 = ? AND clustering_2 = ?", 9, Arrays.asList(0, 1), 0, 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN ? AND clustering_1 = ? AND clustering_2 = ?",
+                           Arrays.asList(0, 1), 0, 0),
+                   row(0, 0, 0, 9),
+                   row(1, 0, 0, 9));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 IN (?, ?)", 12, 0, 1, 1, 2);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 IN (?, ?)",
+                           0, 1, 1, 2),
+                   row(0, 1, 1, 12),
+                   row(0, 1, 2, 12));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 IN (?, ?) AND clustering_2 IN (?, ?)", 10, 0, 1, 0, 1, 2);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 IN (?, ?) AND clustering_2 IN (?, ?)",
+                           0, 1, 0, 1, 2),
+                   row(0, 0, 1, 10),
+                   row(0, 0, 2, 10),
+                   row(0, 1, 1, 10),
+                   row(0, 1, 2, 10));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))", 20, 0, 0, 2, 1, 2);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))",
+                           0, 0, 2, 1, 2),
+                   row(0, 0, 2, 20),
+                   row(0, 1, 2, 20));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", null, 0, 0, 2);
+        flush(forceFlush);
+
+
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))",
+                           0, 0, 2, 1, 2),
+                   row(0, 1, 2, 20));
+
+
+        // test invalid queries
+
+        // missing primary key element
+        assertInvalidMessage("Some partition key parts are missing: partitionkey",
+                             "UPDATE %s SET value = ? WHERE clustering_1 = ? AND clustering_2 = ?", 7, 1, 1);
+
+        String errorMsg = "PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted";
+
+        assertInvalidMessage(errorMsg,
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_2 = ?", 7, 0, 1);
+
+        assertInvalidMessage("Some clustering keys are missing: clustering_1, clustering_2",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ?", 7, 0);
+
+        // token function
+        assertInvalidMessage("The token function cannot be used in WHERE clauses for UPDATE statements",
+                             "UPDATE %s SET value = ? WHERE token(partitionKey) = token(?) AND clustering_1 = ? AND clustering_2 = ?",
+                             7, 0, 1, 1);
+
+        // multiple time the same value
+        assertInvalidSyntax("UPDATE %s SET value = ?, value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
+
+        // multiple time same primary key element in WHERE clause
+        assertInvalidMessage("clustering_1 cannot be restricted by more than one relation if it includes an Equal",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND clustering_1 = ?", 7, 0, 1, 1, 1);
+
+        // Undefined column names
+        assertInvalidMessage("Undefined column name value1",
+                             "UPDATE %s SET value1 = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
+
+        assertInvalidMessage("Undefined column name partitionkey1",
+                             "UPDATE %s SET value = ? WHERE partitionKey1 = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
+
+        assertInvalidMessage("Undefined column name clustering_3",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_3 = ?", 7, 0, 1, 1);
+
+        // Invalid operator in the where clause
+        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
+                             "UPDATE %s SET value = ? WHERE partitionKey > ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
+
+        assertInvalidMessage("Cannot use UPDATE with CONTAINS",
+                             "UPDATE %s SET value = ? WHERE partitionKey CONTAINS ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
+
+        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND value = ?", 7, 0, 1, 1, 3);
+
+        assertInvalidMessage("Slice restrictions are not supported on the clustering columns in UPDATE statements",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 > ?", 7, 0, 1);
+
+        assertInvalidMessage("Slice restrictions are not supported on the clustering columns in UPDATE statements",
+                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1, clustering_2) > (?, ?)", 7, 0, 1, 1);
+    }
+
+    @Test
+    public void testUpdateWithMultiplePartitionKeyComponents() throws Throwable
+    {
+        testUpdateWithMultiplePartitionKeyComponents(false);
+        testUpdateWithMultiplePartitionKeyComponents(true);
+    }
+
+    public void testUpdateWithMultiplePartitionKeyComponents(boolean forceFlush) throws Throwable
+    {
+        createTable("CREATE TABLE %s (partitionKey_1 int," +
+                    "partitionKey_2 int," +
+                    "clustering_1 int," +
+                    "clustering_2 int," +
+                    "value int," +
+                    " PRIMARY KEY ((partitionKey_1, partitionKey_2), clustering_1, clustering_2))" + CompactStorageSplit1Test.compactOption);
+
+        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0, 0)");
+        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (0, 1, 0, 1, 1)");
+        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (0, 1, 1, 1, 2)");
+        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (1, 0, 0, 1, 3)");
+        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (1, 1, 0, 1, 3)");
+        flush(forceFlush);
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey_1 = ? AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 0, 0, 0);
+        flush(forceFlush);
+        assertRows(execute("SELECT value FROM %s WHERE partitionKey_1 = ? AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?",
+                           0, 0, 0, 0),
+                   row(7));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey_1 IN (?, ?) AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?", 9, 0, 1, 1, 0, 1);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s WHERE partitionKey_1 IN (?, ?) AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?",
+                           0, 1, 1, 0, 1),
+                   row(0, 1, 0, 1, 9),
+                   row(1, 1, 0, 1, 9));
+
+        execute("UPDATE %s SET value = ? WHERE partitionKey_1 IN (?, ?) AND partitionKey_2 IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?", 10, 0, 1, 0, 1, 0, 1);
+        flush(forceFlush);
+        assertRows(execute("SELECT * FROM %s"),
+                   row(0, 0, 0, 0, 7),
+                   row(0, 0, 0, 1, 10),
+                   row(0, 1, 0, 1, 10),
+                   row(0, 1, 1, 1, 2),
+                   row(1, 0, 0, 1, 10),
+                   row(1, 1, 0, 1, 10));
+
+        // missing primary key element
+        assertInvalidMessage("Some partition key parts are missing: partitionkey_2",
+                             "UPDATE %s SET value = ? WHERE partitionKey_1 = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 1, 1);
+    }
+
+    @Test
+    public void testCfmCompactStorageCQL()
+    {
+        String keyspace = "cql_test_keyspace_compact";
+        String table = "test_table_compact";
+
+        TableMetadata.Builder metadata =
+        TableMetadata.builder(keyspace, table)
+                     .flags(EnumSet.of(TableMetadata.Flag.DENSE))
+                     .addPartitionKeyColumn("pk1", IntegerType.instance)
+                     .addPartitionKeyColumn("pk2", AsciiType.instance)
+                     .addClusteringColumn("ck1", ReversedType.getInstance(IntegerType.instance))
+                     .addClusteringColumn("ck2", IntegerType.instance)
+                     .addRegularColumn("reg", IntegerType.instance);
+
+        SchemaLoader.createKeyspace(keyspace, KeyspaceParams.simple(1), metadata);
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
+
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
+        String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_compact.test_table_compact (\n" +
+                          "    pk1 varint,\n" +
+                          "    pk2 ascii,\n" +
+                          "    ck1 varint,\n" +
+                          "    ck2 varint,\n" +
+                          "    reg varint,\n" +
+                          "    PRIMARY KEY ((pk1, pk2), ck1, ck2)\n" +
+                          ") WITH COMPACT STORAGE\n" +
+                          "    AND ID = " + cfs.metadata.id + "\n" +
+                          "    AND CLUSTERING ORDER BY (ck1 DESC, ck2 ASC)";
+        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
+                   actual.contains(expected));
+    }
+
+    @Test
+    public void testCfmCounterCQL()
+    {
+        String keyspace = "cql_test_keyspace_counter";
+        String table = "test_table_counter";
+
+        TableMetadata.Builder metadata;
+        metadata = TableMetadata.builder(keyspace, table)
+                                .flags(EnumSet.of(TableMetadata.Flag.DENSE,
+                                       TableMetadata.Flag.COUNTER))
+                                .isCounter(true)
+                                .addPartitionKeyColumn("pk1", IntegerType.instance)
+                                .addPartitionKeyColumn("pk2", AsciiType.instance)
+                                .addClusteringColumn("ck1", ReversedType.getInstance(IntegerType.instance))
+                                .addClusteringColumn("ck2", IntegerType.instance)
+                                .addRegularColumn("cnt", CounterColumnType.instance);
+
+        SchemaLoader.createKeyspace(keyspace, KeyspaceParams.simple(1), metadata);
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
+
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
+        String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_counter.test_table_counter (\n" +
+                          "    pk1 varint,\n" +
+                          "    pk2 ascii,\n" +
+                          "    ck1 varint,\n" +
+                          "    ck2 varint,\n" +
+                          "    cnt counter,\n" +
+                          "    PRIMARY KEY ((pk1, pk2), ck1, ck2)\n" +
+                          ") WITH COMPACT STORAGE\n" +
+                          "    AND ID = " + cfs.metadata.id + "\n" +
+                          "    AND CLUSTERING ORDER BY (ck1 DESC, ck2 ASC)";
+        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
+                   actual.contains(expected));
+    }
+
+    @Test
+    public void testDenseTable() throws Throwable
+    {
+        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
+                                       "pk1 varint PRIMARY KEY," +
+                                       "reg1 int)" +
+                                       " WITH COMPACT STORAGE");
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
+
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
+        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
+                        "    pk1 varint,\n" +
+                        "    reg1 int,\n" +
+                        "    PRIMARY KEY (pk1)\n" +
+                        ") WITH COMPACT STORAGE\n" +
+                        "    AND ID = " + cfs.metadata.id + "\n";
+
+        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
+                   actual.contains(expected));
+    }
+
+    @Test
+    public void testStaticCompactTable()
+    {
+        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
+                                       "pk1 varint PRIMARY KEY," +
+                                       "reg1 int," +
+                                       "reg2 int)" +
+                                       " WITH COMPACT STORAGE");
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
+        assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata()).contains(
+        "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
+        "    pk1 varint,\n" +
+        "    reg1 int,\n" +
+        "    reg2 int,\n" +
+        "    PRIMARY KEY (pk1)\n" +
+        ") WITH COMPACT STORAGE\n" +
+        "    AND ID = " + cfs.metadata.id));
+    }
+
+    @Test
+    public void testStaticCompactWithCounters()
+    {
+        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
+                                       "pk1 varint PRIMARY KEY," +
+                                       "reg1 counter," +
+                                       "reg2 counter)" +
+                                       " WITH COMPACT STORAGE");
+
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
+
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
+        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
+                          "    pk1 varint,\n" +
+                          "    reg1 counter,\n" +
+                          "    reg2 counter,\n" +
+                          "    PRIMARY KEY (pk1)\n" +
+                          ") WITH COMPACT STORAGE\n" +
+                          "    AND ID = " + cfs.metadata.id + "\n";
+        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
+                   actual.contains(expected));
+    }
+
+    @Test
+    public void testDenseCompactTableWithoutRegulars() throws Throwable
+    {
+        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
+                                       "pk1 varint," +
+                                       "ck1 int," +
+                                       "PRIMARY KEY (pk1, ck1))" +
+                                       " WITH COMPACT STORAGE");
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
+
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
+        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
+                          "    pk1 varint,\n" +
+                          "    ck1 int,\n" +
+                          "    PRIMARY KEY (pk1, ck1)\n" +
+                          ") WITH COMPACT STORAGE\n" +
+                          "    AND ID = " + cfs.metadata.id;
+        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
+                   actual.contains(expected));
+    }
+
+    @Test
+    public void testCompactDynamic() throws Throwable
+    {
+        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
+                                       "pk1 varint," +
+                                       "ck1 int," +
+                                       "reg int," +
+                                       "PRIMARY KEY (pk1, ck1))" +
+                                       " WITH COMPACT STORAGE");
+
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
+
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
+        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
+                          "    pk1 varint,\n" +
+                          "    ck1 int,\n" +
+                          "    reg int,\n" +
+                          "    PRIMARY KEY (pk1, ck1)\n" +
+                          ") WITH COMPACT STORAGE\n" +
+                          "    AND ID = " + cfs.metadata.id;
+
+        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
+                   actual.contains(expected));
+    }
+
+    /**
+     * PartitionUpdateTest
+     */
+
+    @Test
+    public void testOperationCountWithCompactTable()
+    {
+        createTable("CREATE TABLE %s (key text PRIMARY KEY, a int) WITH COMPACT STORAGE");
+        TableMetadata cfm = currentTableMetadata();
+
+        PartitionUpdate update = new RowUpdateBuilder(cfm, FBUtilities.timestampMicros(), "key0").add("a", 1)
+                                                                                                 .buildUpdate();
+        Assert.assertEquals(1, update.operationCount());
+
+        update = new RowUpdateBuilder(cfm, FBUtilities.timestampMicros(), "key0").buildUpdate();
+        Assert.assertEquals(0, update.operationCount());
+    }
+
+    /**
+     * AlterTest
+     */
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testAlterWithCompactStaticFormat() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
+
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "ALTER TABLE %s RENAME column1 TO column2");
+    }
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testAlterWithCompactNonStaticFormat() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "ALTER TABLE %s RENAME column1 TO column2");
+
+        createTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "ALTER TABLE %s RENAME column1 TO column2");
+    }
+
+    /**
+     * CreateTest
+     */
+
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testCreateIndextWithCompactStaticFormat() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "CREATE INDEX column1_index on %s (column1)");
+        assertInvalidMessage("Undefined column name value in table",
+                             "CREATE INDEX value_index on %s (value)");
+    }
+
+    /**
+     * DeleteTest
+     */
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testDeleteWithCompactStaticFormat() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
+        testDeleteWithCompactFormat();
+
+        // if column1 is present, hidden column is called column2
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
+        assertInvalidMessage("Undefined column name column2 in table",
+                             "DELETE FROM %s WHERE a = 1 AND column2= 1");
+        assertInvalidMessage("Undefined column name column2 in table",
+                             "DELETE FROM %s WHERE a = 1 AND column2 = 1 AND value1 = 1");
+        assertInvalidMessage("Undefined column name column2",
+                             "DELETE column2 FROM %s WHERE a = 1");
+
+        // if value is present, hidden column is called value1
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
+        assertInvalidMessage("Undefined column name value1 in table",
+                             "DELETE FROM %s WHERE a = 1 AND value1 = 1");
+        assertInvalidMessage("Undefined column name value1 in table",
+                             "DELETE FROM %s WHERE a = 1 AND value1 = 1 AND column1 = 1");
+        assertInvalidMessage("Undefined column name value1",
+                             "DELETE value1 FROM %s WHERE a = 1");
+    }
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testDeleteWithCompactNonStaticFormat() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b) VALUES (1, 1)");
+        execute("INSERT INTO %s (a, b) VALUES (2, 1)");
+        assertRows(execute("SELECT a, b FROM %s"),
+                   row(1, 1),
+                   row(2, 1));
+        testDeleteWithCompactFormat();
+
+        createTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, v) VALUES (1, 1, 3)");
+        execute("INSERT INTO %s (a, b, v) VALUES (2, 1, 4)");
+        assertRows(execute("SELECT a, b, v FROM %s"),
+                   row(1, 1, 3),
+                   row(2, 1, 4));
+        testDeleteWithCompactFormat();
+    }
+
+    private void testDeleteWithCompactFormat() throws Throwable
+    {
+        assertInvalidMessage("Undefined column name value in table",
+                             "DELETE FROM %s WHERE a = 1 AND value = 1");
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "DELETE FROM %s WHERE a = 1 AND column1= 1");
+        assertInvalidMessage("Undefined column name value in table",
+                             "DELETE FROM %s WHERE a = 1 AND value = 1 AND column1 = 1");
+        assertInvalidMessage("Undefined column name value",
+                             "DELETE value FROM %s WHERE a = 1");
+        assertInvalidMessage("Undefined column name column1",
+                             "DELETE column1 FROM %s WHERE a = 1");
+    }
+
+    /**
+     * InsertTest
+     */
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testInsertWithCompactStaticFormat() throws Throwable
+    {
+        testInsertWithCompactTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
+
+        // if column1 is present, hidden column is called column2
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, c, column1) VALUES (1, 1, 1, 1)");
+        assertInvalidMessage("Undefined column name column2",
+                             "INSERT INTO %s (a, b, c, column2) VALUES (1, 1, 1, 1)");
+
+        // if value is present, hidden column is called value1
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, c, value) VALUES (1, 1, 1, 1)");
+        assertInvalidMessage("Undefined column name value1",
+                             "INSERT INTO %s (a, b, c, value1) VALUES (1, 1, 1, 1)");
+    }
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testInsertWithCompactNonStaticFormat() throws Throwable
+    {
+        testInsertWithCompactTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        testInsertWithCompactTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+    }
+
+    private void testInsertWithCompactTable(String tableQuery) throws Throwable
+    {
+        createTable(tableQuery);
+
+        // pass correct types to the hidden columns
+        assertInvalidMessage("Undefined column name column1",
+                             "INSERT INTO %s (a, b, column1) VALUES (?, ?, ?)",
+                             1, 1, 1, ByteBufferUtil.bytes('a'));
+        assertInvalidMessage("Undefined column name value",
+                             "INSERT INTO %s (a, b, value) VALUES (?, ?, ?)",
+                             1, 1, 1, ByteBufferUtil.bytes('a'));
+        assertInvalidMessage("Undefined column name column1",
+                             "INSERT INTO %s (a, b, column1, value) VALUES (?, ?, ?, ?)",
+                             1, 1, 1, ByteBufferUtil.bytes('a'), ByteBufferUtil.bytes('b'));
+        assertInvalidMessage("Undefined column name value",
+                             "INSERT INTO %s (a, b, value, column1) VALUES (?, ?, ?, ?)",
+                             1, 1, 1, ByteBufferUtil.bytes('a'), ByteBufferUtil.bytes('b'));
+
+        // pass incorrect types to the hidden columns
+        assertInvalidMessage("Undefined column name value",
+                             "INSERT INTO %s (a, b, value) VALUES (?, ?, ?)",
+                             1, 1, 1, 1);
+        assertInvalidMessage("Undefined column name column1",
+                             "INSERT INTO %s (a, b, column1) VALUES (?, ?, ?)",
+                             1, 1, 1, 1);
+        assertEmpty(execute("SELECT * FROM %s"));
+
+        // pass null to the hidden columns
+        assertInvalidMessage("Undefined column name value",
+                             "INSERT INTO %s (a, b, value) VALUES (?, ?, ?)",
+                             1, 1, null);
+        assertInvalidMessage("Undefined column name column1",
+                             "INSERT INTO %s (a, b, column1) VALUES (?, ?, ?)",
+                             1, 1, null);
+    }
+
+    /**
+     * SelectTest
+     */
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testSelectWithCompactStaticFormat() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 1)");
+        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, 1)");
+        assertRows(execute("SELECT a, b, c FROM %s"),
+                   row(1, 1, 1),
+                   row(2, 1, 1));
+        testSelectWithCompactFormat();
+
+        // if column column1 is present, hidden column is called column2
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, c, column1) VALUES (1, 1, 1, 1)");
+        execute("INSERT INTO %s (a, b, c, column1) VALUES (2, 1, 1, 2)");
+        assertRows(execute("SELECT a, b, c, column1 FROM %s"),
+                   row(1, 1, 1, 1),
+                   row(2, 1, 1, 2));
+        assertInvalidMessage("Undefined column name column2 in table",
+                             "SELECT a, column2, value FROM %s");
+
+        // if column value is present, hidden column is called value1
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, c, value) VALUES (1, 1, 1, 1)");
+        execute("INSERT INTO %s (a, b, c, value) VALUES (2, 1, 1, 2)");
+        assertRows(execute("SELECT a, b, c, value FROM %s"),
+                   row(1, 1, 1, 1),
+                   row(2, 1, 1, 2));
+        assertInvalidMessage("Undefined column name value1 in table",
+                             "SELECT a, value1, value FROM %s");
+    }
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testSelectWithCompactNonStaticFormat() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b) VALUES (1, 1)");
+        execute("INSERT INTO %s (a, b) VALUES (2, 1)");
+        assertRows(execute("SELECT a, b FROM %s"),
+                   row(1, 1),
+                   row(2, 1));
+        testSelectWithCompactFormat();
+
+        createTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, v) VALUES (1, 1, 3)");
+        execute("INSERT INTO %s (a, b, v) VALUES (2, 1, 4)");
+        assertRows(execute("SELECT a, b, v FROM %s"),
+                   row(1, 1, 3),
+                   row(2, 1, 4));
+        testSelectWithCompactFormat();
+    }
+
+    private void testSelectWithCompactFormat() throws Throwable
+    {
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "SELECT column1 FROM %s");
+        assertInvalidMessage("Undefined column name value in table",
+                             "SELECT value FROM %s");
+        assertInvalidMessage("Undefined column name value in table",
+                             "SELECT value, column1 FROM %s");
+        assertInvalid("Undefined column name column1 in table ('column1 = NULL')",
+                      "SELECT * FROM %s WHERE column1 = null ALLOW FILTERING");
+        assertInvalid("Undefined column name value in table ('value = NULL')",
+                      "SELECT * FROM %s WHERE value = null ALLOW FILTERING");
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "SELECT WRITETIME(column1) FROM %s");
+        assertInvalidMessage("Undefined column name value in table",
+                             "SELECT WRITETIME(value) FROM %s");
+    }
+
+    /**
+     * UpdateTest
+     */
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testUpdateWithCompactStaticFormat() throws Throwable
+    {
+        testUpdateWithCompactFormat("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
+
+        assertInvalidMessage("Undefined column name column1 in table",
+                             "UPDATE %s SET b = 1 WHERE column1 = ?",
+                             ByteBufferUtil.bytes('a'));
+        assertInvalidMessage("Undefined column name value in table",
+                             "UPDATE %s SET b = 1 WHERE value = ?",
+                             ByteBufferUtil.bytes('a'));
+
+        // if column1 is present, hidden column is called column2
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, c, column1) VALUES (1, 1, 1, 1)");
+        execute("UPDATE %s SET column1 = 6 WHERE a = 1");
+        assertInvalidMessage("Undefined column name column2", "UPDATE %s SET column2 = 6 WHERE a = 0");
+        assertInvalidMessage("Undefined column name value", "UPDATE %s SET value = 6 WHERE a = 0");
+
+        // if value is present, hidden column is called value1
+        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
+        execute("INSERT INTO %s (a, b, c, value) VALUES (1, 1, 1, 1)");
+        execute("UPDATE %s SET value = 6 WHERE a = 1");
+        assertInvalidMessage("Undefined column name column1", "UPDATE %s SET column1 = 6 WHERE a = 1");
+        assertInvalidMessage("Undefined column name value1", "UPDATE %s SET value1 = 6 WHERE a = 1");
+    }
+
+    /**
+     * Test for CASSANDRA-13917
+     */
+    @Test
+    public void testUpdateWithCompactNonStaticFormat() throws Throwable
+    {
+        testUpdateWithCompactFormat("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+        testUpdateWithCompactFormat("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
+    }
+
+    private void testUpdateWithCompactFormat(String tableQuery) throws Throwable
+    {
+        createTable(tableQuery);
+        // pass correct types to hidden columns
+        assertInvalidMessage("Undefined column name column1",
+                             "UPDATE %s SET column1 = ? WHERE a = 0",
+                             ByteBufferUtil.bytes('a'));
+        assertInvalidMessage("Undefined column name value",
+                             "UPDATE %s SET value = ? WHERE a = 0",
+                             ByteBufferUtil.bytes('a'));
+
+        // pass incorrect types to hidden columns
+        assertInvalidMessage("Undefined column name column1", "UPDATE %s SET column1 = 6 WHERE a = 0");
+        assertInvalidMessage("Undefined column name value", "UPDATE %s SET value = 6 WHERE a = 0");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageTest.java
deleted file mode 100644
index 276abde..0000000
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactStorageTest.java
+++ /dev/null
@@ -1,5138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.cql3.validation.operations;
-
-import java.nio.ByteBuffer;
-import java.util.Arrays;
-import java.util.EnumSet;
-import java.util.UUID;
-
-import org.junit.Assert;
-import org.junit.Test;
-
-import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
-import org.apache.cassandra.cql3.validation.entities.SecondaryIndexTest;
-import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.RowUpdateBuilder;
-import org.apache.cassandra.db.SchemaCQLHelper;
-import org.apache.cassandra.db.marshal.AsciiType;
-import org.apache.cassandra.db.marshal.CounterColumnType;
-import org.apache.cassandra.db.marshal.IntegerType;
-import org.apache.cassandra.db.marshal.ReversedType;
-import org.apache.cassandra.db.partitions.PartitionUpdate;
-import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
-
-import static junit.framework.TestCase.assertTrue;
-import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
-import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
-import static org.junit.Assert.assertArrayEquals;
-import static org.junit.Assert.fail;
-
-public class CompactStorageTest extends CQLTester
-{
-    private static final String compactOption = " WITH COMPACT STORAGE";
-
-    @Test
-    public void testSparseCompactTableIndex() throws Throwable
-    {
-        createTable("CREATE TABLE %s (key ascii PRIMARY KEY, val ascii) WITH COMPACT STORAGE");
-
-        // Indexes are allowed only on the sparse compact tables
-        createIndex("CREATE INDEX ON %s(val)");
-        for (int i = 0; i < 10; i++)
-            execute("INSERT INTO %s (key, val) VALUES (?, ?)", Integer.toString(i), Integer.toString(i * 10));
-
-        alterTable("ALTER TABLE %s DROP COMPACT STORAGE");
-
-        assertRows(execute("SELECT * FROM %s WHERE val = '50'"),
-                   row("5", null, "50", null));
-        assertRows(execute("SELECT * FROM %s WHERE key = '5'"),
-                   row("5", null, "50", null));
-    }
-
-    @Test
-    public void before() throws Throwable
-    {
-        createTable("CREATE TABLE %s (key TEXT, column TEXT, value BLOB, PRIMARY KEY (key, column)) WITH COMPACT STORAGE");
-
-        ByteBuffer largeBytes = ByteBuffer.wrap(new byte[100000]);
-        execute("INSERT INTO %s (key, column, value) VALUES (?, ?, ?)", "test", "a", largeBytes);
-        ByteBuffer smallBytes = ByteBuffer.wrap(new byte[10]);
-        execute("INSERT INTO %s (key, column, value) VALUES (?, ?, ?)", "test", "c", smallBytes);
-
-        flush();
-
-        assertRows(execute("SELECT column FROM %s WHERE key = ? AND column IN (?, ?, ?)", "test", "c", "a", "b"),
-                   row("a"),
-                   row("c"));
-    }
-
-    @Test
-    public void testStaticCompactTables() throws Throwable
-    {
-        createTable("CREATE TABLE %s (k text PRIMARY KEY, v1 int, v2 text) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (k, v1, v2) values (?, ?, ?)", "first", 1, "value1");
-        execute("INSERT INTO %s (k, v1, v2) values (?, ?, ?)", "second", 2, "value2");
-        execute("INSERT INTO %s (k, v1, v2) values (?, ?, ?)", "third", 3, "value3");
-
-        assertRows(execute("SELECT * FROM %s WHERE k = ?", "first"),
-                   row("first", 1, "value1")
-        );
-
-        assertRows(execute("SELECT v2 FROM %s WHERE k = ?", "second"),
-                   row("value2")
-        );
-
-        // Murmur3 order
-        assertRows(execute("SELECT * FROM %s"),
-                   row("third", 3, "value3"),
-                   row("second", 2, "value2"),
-                   row("first", 1, "value1")
-        );
-    }
-
-    @Test
-    public void testCompactStorageUpdateWithNull() throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering_1 int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering_1)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 1, 1)");
-
-        flush();
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ?", null, 0, 0);
-
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))", 0, 0, 1),
-                   row(0, 1, 1)
-        );
-    }
-
-    /**
-     * Migrated from cql_tests.py:TestCQL.collection_compact_test()
-     */
-    @Test
-    public void testCompactCollections() throws Throwable
-    {
-        String tableName = KEYSPACE + "." + createTableName();
-        assertInvalid(String.format("CREATE TABLE %s (user ascii PRIMARY KEY, mails list < text >) WITH COMPACT STORAGE;", tableName));
-    }
-
-    /**
-     * Check for a table with counters,
-     * migrated from cql_tests.py:TestCQL.counters_test()
-     */
-    @Test
-    public void testCounters() throws Throwable
-    {
-        createTable("CREATE TABLE %s (userid int, url text, total counter, PRIMARY KEY (userid, url)) WITH COMPACT STORAGE");
-
-        execute("UPDATE %s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(1L));
-
-        execute("UPDATE %s SET total = total - 4 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(-3L));
-
-        execute("UPDATE %s SET total = total+1 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(-2L));
-
-        execute("UPDATE %s SET total = total -2 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(-4L));
-
-        execute("UPDATE %s SET total += 6 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(2L));
-
-        execute("UPDATE %s SET total -= 1 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(1L));
-
-        execute("UPDATE %s SET total += -2 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(-1L));
-
-        execute("UPDATE %s SET total -= -2 WHERE userid = 1 AND url = 'http://foo.com'");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(1L));
-    }
-
-
-    @Test
-    public void testCounterFiltering() throws Throwable
-    {
-        createTable("CREATE TABLE %s (k int PRIMARY KEY, a counter) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 10; i++)
-            execute("UPDATE %s SET a = a + ? WHERE k = ?", (long) i, i);
-
-        execute("UPDATE %s SET a = a + ? WHERE k = ?", 6L, 10);
-
-        // GT
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a > ? ALLOW FILTERING", 5L),
-                                row(6, 6L),
-                                row(7, 7L),
-                                row(8, 8L),
-                                row(9, 9L),
-                                row(10, 6L));
-
-        // GTE
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a >= ? ALLOW FILTERING", 6L),
-                                row(6, 6L),
-                                row(7, 7L),
-                                row(8, 8L),
-                                row(9, 9L),
-                                row(10, 6L));
-
-        // LT
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a < ? ALLOW FILTERING", 3L),
-                                row(0, 0L),
-                                row(1, 1L),
-                                row(2, 2L));
-
-        // LTE
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a <= ? ALLOW FILTERING", 3L),
-                                row(0, 0L),
-                                row(1, 1L),
-                                row(2, 2L),
-                                row(3, 3L));
-
-        // EQ
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a = ? ALLOW FILTERING", 6L),
-                                row(6, 6L),
-                                row(10, 6L));
-    }
-
-    /**
-     * Test for the bug of #11726.
-     */
-    @Test
-    public void testCounterAndColumnSelection() throws Throwable
-    {
-        for (String compactStorageClause : new String[]{ "", " WITH COMPACT STORAGE" })
-        {
-            createTable("CREATE TABLE %s (k int PRIMARY KEY, c counter)" + compactStorageClause);
-
-            // Flush 2 updates in different sstable so that the following select does a merge, which is what triggers
-            // the problem from #11726
-
-            execute("UPDATE %s SET c = c + ? WHERE k = ?", 1L, 0);
-
-            flush();
-
-            execute("UPDATE %s SET c = c + ? WHERE k = ?", 1L, 0);
-
-            flush();
-
-            // Querying, but not including the counter. Pre-CASSANDRA-11726, this made us query the counter but include
-            // it's value, which broke at merge (post-CASSANDRA-11726 are special cases to never skip values).
-            assertRows(execute("SELECT k FROM %s"), row(0));
-        }
-    }
-
-    /*
-     * Check that a counter batch works as intended
-     */
-    @Test
-    public void testCounterBatch() throws Throwable
-    {
-        createTable("CREATE TABLE %s (userid int, url text, total counter, PRIMARY KEY (userid, url)) WITH COMPACT STORAGE");
-
-        // Ensure we handle updates to the same CQL row in the same partition properly
-        execute("BEGIN UNLOGGED BATCH " +
-                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
-                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
-                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
-                "APPLY BATCH; ");
-        assertRows(execute("SELECT total FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(3L));
-
-        // Ensure we handle different CQL rows in the same partition properly
-        execute("BEGIN UNLOGGED BATCH " +
-                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://bar.com'; " +
-                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://baz.com'; " +
-                "UPDATE %1$s SET total = total + 1 WHERE userid = 1 AND url = 'http://bad.com'; " +
-                "APPLY BATCH; ");
-        assertRows(execute("SELECT url, total FROM %s WHERE userid = 1"),
-                   row("http://bad.com", 1L),
-                   row("http://bar.com", 1L),
-                   row("http://baz.com", 1L),
-                   row("http://foo.com", 3L)); // from previous batch
-
-        // Different counters in the same CQL Row
-        createTable("CREATE TABLE %s (userid int, url text, first counter, second counter, third counter, PRIMARY KEY (userid, url))");
-        execute("BEGIN UNLOGGED BATCH " +
-                "UPDATE %1$s SET first = first + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
-                "UPDATE %1$s SET first = first + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
-                "UPDATE %1$s SET second = second + 1 WHERE userid = 1 AND url = 'http://foo.com'; " +
-                "APPLY BATCH; ");
-        assertRows(execute("SELECT first, second, third FROM %s WHERE userid = 1 AND url = 'http://foo.com'"),
-                   row(2L, 1L, null));
-
-        // Different counters in different CQL Rows
-        execute("BEGIN UNLOGGED BATCH " +
-                "UPDATE %1$s SET first = first + 1 WHERE userid = 1 AND url = 'http://bad.com'; " +
-                "UPDATE %1$s SET first = first + 1, second = second + 1 WHERE userid = 1 AND url = 'http://bar.com'; " +
-                "UPDATE %1$s SET first = first - 1, second = second - 1 WHERE userid = 1 AND url = 'http://bar.com'; " +
-                "UPDATE %1$s SET second = second + 1 WHERE userid = 1 AND url = 'http://baz.com'; " +
-                "APPLY BATCH; ");
-        assertRows(execute("SELECT url, first, second, third FROM %s WHERE userid = 1"),
-                   row("http://bad.com", 1L, null, null),
-                   row("http://bar.com", 0L, 0L, null),
-                   row("http://baz.com", null, 1L, null),
-                   row("http://foo.com", 2L, 1L, null)); // from previous batch
-
-
-        // Different counters in different partitions
-        execute("BEGIN UNLOGGED BATCH " +
-                "UPDATE %1$s SET first = first + 1 WHERE userid = 2 AND url = 'http://bad.com'; " +
-                "UPDATE %1$s SET first = first + 1, second = second + 1 WHERE userid = 3 AND url = 'http://bar.com'; " +
-                "UPDATE %1$s SET first = first - 1, second = second - 1 WHERE userid = 4 AND url = 'http://bar.com'; " +
-                "UPDATE %1$s SET second = second + 1 WHERE userid = 5 AND url = 'http://baz.com'; " +
-                "APPLY BATCH; ");
-        assertRowsIgnoringOrder(execute("SELECT userid, url, first, second, third FROM %s WHERE userid IN (2, 3, 4, 5)"),
-                                row(2, "http://bad.com", 1L, null, null),
-                                row(3, "http://bar.com", 1L, 1L, null),
-                                row(4, "http://bar.com", -1L, -1L, null),
-                                row(5, "http://baz.com", null, 1L, null));
-    }
-
-    /**
-     * from FrozenCollectionsTest
-     */
-
-    @Test
-    public void testClusteringKeyUsageSet() throws Throwable
-    {
-        testClusteringKeyUsage("set<int>",
-                               set(),
-                               set(1, 2, 3),
-                               set(4, 5, 6),
-                               set(7, 8, 9));
-    }
-
-    @Test
-    public void testClusteringKeyUsageList() throws Throwable
-    {
-        testClusteringKeyUsage("list<int>",
-                               list(),
-                               list(1, 2, 3),
-                               list(4, 5, 6),
-                               list(7, 8, 9));
-    }
-
-    @Test
-    public void testClusteringKeyUsageMap() throws Throwable
-    {
-        testClusteringKeyUsage("map<int, int>",
-                               map(),
-                               map(1, 10, 2, 20, 3, 30),
-                               map(4, 40, 5, 50, 6, 60),
-                               map(7, 70, 8, 80, 9, 90));
-    }
-
-    private void testClusteringKeyUsage(String type, Object v1, Object v2, Object v3, Object v4) throws Throwable
-    {
-        createTable(String.format("CREATE TABLE %%s (a int, b frozen<%s>, c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE",
-                                  type));
-
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v1, 1);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v2, 1);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v3, 0);
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, v4, 0);
-
-        // overwrite with an update
-        execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v1);
-        execute("UPDATE %s SET c=? WHERE a=? AND b=?", 0, 0, v2);
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, v1, 0),
-                   row(0, v2, 0),
-                   row(0, v3, 0),
-                   row(0, v4, 0)
-        );
-
-        assertRows(execute("SELECT b FROM %s"),
-                   row(v1),
-                   row(v2),
-                   row(v3),
-                   row(v4)
-        );
-
-        assertRows(execute("SELECT * FROM %s LIMIT 2"),
-                   row(0, v1, 0),
-                   row(0, v2, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v3),
-                   row(0, v3, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, v1),
-                   row(0, v1, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b IN ?", 0, list(v3, v1)),
-                   row(0, v1, 0),
-                   row(0, v3, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, v3),
-                   row(0, v4, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, v3),
-                   row(0, v3, 0),
-                   row(0, v4, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, v3),
-                   row(0, v1, 0),
-                   row(0, v2, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, v3),
-                   row(0, v1, 0),
-                   row(0, v2, 0),
-                   row(0, v3, 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, v2, v3),
-                   row(0, v3, 0)
-        );
-
-        execute("DELETE FROM %s WHERE a=? AND b=?", 0, v1);
-        execute("DELETE FROM %s WHERE a=? AND b=?", 0, v3);
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, v2, 0),
-                   row(0, v4, 0)
-        );
-    }
-
-    @Test
-    public void testNestedClusteringKeyUsage() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b frozen<map<set<int>, list<int>>>, c frozen<set<int>>, d int, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(), set(), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(), list(1, 2, 3)), set(), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0);
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, map(), set(), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT b FROM %s"),
-                   row(map()),
-                   row(map(set(), list(1, 2, 3))),
-                   row(map(set(1, 2, 3), list(1, 2, 3))),
-                   row(map(set(4, 5, 6), list(1, 2, 3))),
-                   row(map(set(7, 8, 9), list(1, 2, 3)))
-        );
-
-        assertRows(execute("SELECT c FROM %s"),
-                   row(set()),
-                   row(set()),
-                   row(set(1, 2, 3)),
-                   row(set(1, 2, 3)),
-                   row(set(1, 2, 3))
-        );
-
-        assertRows(execute("SELECT * FROM %s LIMIT 3"),
-                   row(0, map(), set(), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=0 ORDER BY b DESC LIMIT 4"),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map()),
-                   row(0, map(), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(), list(1, 2, 3))),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(1, 2, 3), list(1, 2, 3))),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c) IN ?", 0, list(tuple(map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)),
-                                                                                 tuple(map(), set()))),
-                   row(0, map(), set(), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(), set(), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(), set(), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, map(set(1, 2, 3), list(1, 2, 3)), map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set());
-        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set()));
-
-        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set());
-        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()));
-
-        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3));
-        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)));
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-    }
-
-    @Test
-    public void testNestedClusteringKeyUsageWithReverseOrder() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b frozen<map<set<int>, list<int>>>, c frozen<set<int>>, d int, " +
-                    "PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE AND CLUSTERING ORDER BY (b DESC)");
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(), set(), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(), list(1, 2, 3)), set(), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0);
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0),
-                   row(0, map(), set(), 0)
-        );
-
-        assertRows(execute("SELECT b FROM %s"),
-                   row(map(set(7, 8, 9), list(1, 2, 3))),
-                   row(map(set(4, 5, 6), list(1, 2, 3))),
-                   row(map(set(1, 2, 3), list(1, 2, 3))),
-                   row(map(set(), list(1, 2, 3))),
-                   row(map())
-        );
-
-        assertRows(execute("SELECT c FROM %s"),
-                   row(set(1, 2, 3)),
-                   row(set(1, 2, 3)),
-                   row(set(1, 2, 3)),
-                   row(set()),
-                   row(set())
-        );
-
-        assertRows(execute("SELECT * FROM %s LIMIT 3"),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=0 ORDER BY b DESC LIMIT 4"),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map()),
-                   row(0, map(), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(), list(1, 2, 3))),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=?", 0, map(set(1, 2, 3), list(1, 2, 3))),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND (b, c) IN ?", 0, list(tuple(map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)),
-                                                                                 tuple(map(), set()))),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b >= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b < ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0),
-                   row(0, map(), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b <= ?", 0, map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(), list(1, 2, 3)), set(), 0),
-                   row(0, map(), set(), 0)
-        );
-
-        assertRows(execute("SELECT * FROM %s WHERE a=? AND b > ? AND b <= ?", 0, map(set(1, 2, 3), list(1, 2, 3)), map(set(4, 5, 6), list(1, 2, 3))),
-                   row(0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-
-        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set());
-        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(), set()));
-
-        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set());
-        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(), list(1, 2, 3)), set()));
-
-        execute("DELETE FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3));
-        assertEmpty(execute("SELECT * FROM %s WHERE a=? AND b=? AND c=?", 0, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)));
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3), 0),
-                   row(0, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3), 0)
-        );
-    }
-
-    @Test
-    public void testNormalColumnUsage() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b frozen<map<set<int>, list<int>>>, c frozen<set<int>>)" + compactOption);
-
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 0, map(), set());
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 1, map(set(), list(99999, 999999, 99999)), set());
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 2, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3));
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 3, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3));
-        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", 4, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3));
-
-        // overwrite with update
-        execute("UPDATE %s SET b=? WHERE a=?", map(set(), list(1, 2, 3)), 1);
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s"),
-                                row(0, map(), set()),
-                                row(1, map(set(), list(1, 2, 3)), set()),
-                                row(2, map(set(1, 2, 3), list(1, 2, 3)), set(1, 2, 3)),
-                                row(3, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3)),
-                                row(4, map(set(7, 8, 9), list(1, 2, 3)), set(1, 2, 3))
-        );
-
-        assertRowsIgnoringOrder(execute("SELECT b FROM %s"),
-                                row(map()),
-                                row(map(set(), list(1, 2, 3))),
-                                row(map(set(1, 2, 3), list(1, 2, 3))),
-                                row(map(set(4, 5, 6), list(1, 2, 3))),
-                                row(map(set(7, 8, 9), list(1, 2, 3)))
-        );
-
-        assertRowsIgnoringOrder(execute("SELECT c FROM %s"),
-                                row(set()),
-                                row(set()),
-                                row(set(1, 2, 3)),
-                                row(set(1, 2, 3)),
-                                row(set(1, 2, 3))
-        );
-
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 3),
-                                row(3, map(set(4, 5, 6), list(1, 2, 3)), set(1, 2, 3))
-        );
-
-        execute("UPDATE %s SET b=? WHERE a=?", null, 1);
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 1),
-                                row(1, null, set())
-        );
-
-        execute("UPDATE %s SET b=? WHERE a=?", map(), 1);
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 1),
-                                row(1, map(), set())
-        );
-
-        execute("UPDATE %s SET c=? WHERE a=?", null, 2);
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 2),
-                                row(2, map(set(1, 2, 3), list(1, 2, 3)), null)
-        );
-
-        execute("UPDATE %s SET c=? WHERE a=?", set(), 2);
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 2),
-                                row(2, map(set(1, 2, 3), list(1, 2, 3)), set())
-        );
-
-        execute("DELETE b FROM %s WHERE a=?", 3);
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 3),
-                                row(3, null, set(1, 2, 3))
-        );
-
-        execute("DELETE c FROM %s WHERE a=?", 4);
-        assertRowsIgnoringOrder(execute("SELECT * FROM %s WHERE a=?", 4),
-                                row(4, map(set(7, 8, 9), list(1, 2, 3)), null)
-        );
-    }
-
-    /**
-     * from SecondaryIndexTest
-     */
-    @Test
-    public void testCompactTableWithValueOver64k() throws Throwable
-    {
-        createTable("CREATE TABLE %s(a int, b blob, PRIMARY KEY (a)) WITH COMPACT STORAGE");
-        createIndex("CREATE INDEX ON %s(b)");
-        failInsert("INSERT INTO %s (a, b) VALUES (0, ?)", ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
-        failInsert("INSERT INTO %s (a, b) VALUES (0, ?) IF NOT EXISTS", ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
-        failInsert("BEGIN BATCH\n" +
-                   "INSERT INTO %s (a, b) VALUES (0, ?);\n" +
-                   "APPLY BATCH",
-                   ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
-        failInsert("BEGIN BATCH\n" +
-                   "INSERT INTO %s (a, b) VALUES (0, ?) IF NOT EXISTS;\n" +
-                   "APPLY BATCH",
-                   ByteBuffer.allocate(SecondaryIndexTest.TOO_BIG));
-    }
-
-    public void failInsert(String insertCQL, Object... args) throws Throwable
-    {
-        try
-        {
-            execute(insertCQL, args);
-            fail("Expected statement to fail validation");
-        }
-        catch (Exception e)
-        {
-            // as expected
-        }
-    }
-
-    /**
-     * Migrated from cql_tests.py:TestCQL.invalid_clustering_indexing_test()
-     */
-    @Test
-    public void testIndexesOnClusteringInvalid() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b))) WITH COMPACT STORAGE");
-        assertInvalid("CREATE INDEX ON %s (a)");
-        assertInvalid("CREATE INDEX ON %s (b)");
-
-        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        assertInvalid("CREATE INDEX ON %s (a)");
-        assertInvalid("CREATE INDEX ON %s (b)");
-        assertInvalid("CREATE INDEX ON %s (c)");
-    }
-
-    @Test
-    public void testEmptyRestrictionValueWithSecondaryIndexAndCompactTables() throws Throwable
-    {
-        createTable("CREATE TABLE %s (pk blob, c blob, v blob, PRIMARY KEY ((pk), c)) WITH COMPACT STORAGE");
-        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
-                             "CREATE INDEX on %s(c)");
-
-        createTable("CREATE TABLE %s (pk blob PRIMARY KEY, v blob) WITH COMPACT STORAGE");
-        createIndex("CREATE INDEX on %s(v)");
-
-        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", bytes("foo123"), bytes("1"));
-
-        // Test restrictions on non-primary key value
-        assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND v = textAsBlob('');"));
-
-        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", bytes("foo124"), EMPTY_BYTE_BUFFER);
-
-        assertRows(execute("SELECT * FROM %s WHERE v = textAsBlob('');"),
-                   row(bytes("foo124"), EMPTY_BYTE_BUFFER));
-    }
-
-    @Test
-    public void testIndicesOnCompactTable() throws Throwable
-    {
-        assertInvalidMessage("COMPACT STORAGE with composite PRIMARY KEY allows no more than one column not part of the PRIMARY KEY (got: v1, v2)",
-                             "CREATE TABLE " + KEYSPACE + ".test (pk int, c int, v1 int, v2 int, PRIMARY KEY(pk, c)) WITH COMPACT STORAGE");
-
-        createTable("CREATE TABLE %s (pk int, c int, v int, PRIMARY KEY(pk, c)) WITH COMPACT STORAGE");
-        assertInvalidMessage("Secondary indexes are not supported on compact value column of COMPACT STORAGE tables",
-                             "CREATE INDEX ON %s(v)");
-
-        createTable("CREATE TABLE %s (pk int PRIMARY KEY, v int) WITH COMPACT STORAGE");
-        createIndex("CREATE INDEX ON %s(v)");
-
-        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", 1, 1);
-        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", 2, 1);
-        execute("INSERT INTO %s (pk, v) VALUES (?, ?)", 3, 3);
-
-        assertRows(execute("SELECT pk, v FROM %s WHERE v = 1"),
-                   row(1, 1),
-                   row(2, 1));
-
-        assertRows(execute("SELECT pk, v FROM %s WHERE v = 3"),
-                   row(3, 3));
-
-        assertEmpty(execute("SELECT pk, v FROM %s WHERE v = 5"));
-
-        createTable("CREATE TABLE %s (pk int PRIMARY KEY, v1 int, v2 int) WITH COMPACT STORAGE");
-        createIndex("CREATE INDEX ON %s(v1)");
-
-        execute("INSERT INTO %s (pk, v1, v2) VALUES (?, ?, ?)", 1, 1, 1);
-        execute("INSERT INTO %s (pk, v1, v2) VALUES (?, ?, ?)", 2, 1, 2);
-        execute("INSERT INTO %s (pk, v1, v2) VALUES (?, ?, ?)", 3, 3, 3);
-
-        assertRows(execute("SELECT pk, v2 FROM %s WHERE v1 = 1"),
-                   row(1, 1),
-                   row(2, 2));
-
-        assertRows(execute("SELECT pk, v2 FROM %s WHERE v1 = 3"),
-                   row(3, 3));
-
-        assertEmpty(execute("SELECT pk, v2 FROM %s WHERE v1 = 5"));
-    }
-
-    /**
-     * OverflowTest
-     */
-
-    /**
-     * Test regression from #5189,
-     * migrated from cql_tests.py:TestCQL.compact_metadata_test()
-     */
-    @Test
-    public void testCompactMetadata() throws Throwable
-    {
-        createTable("CREATE TABLE %s (id int primary key, i int ) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (id, i) VALUES (1, 2)");
-        assertRows(execute("SELECT * FROM %s"),
-                   row(1, 2));
-    }
-
-    @Test
-    public void testEmpty() throws Throwable
-    {
-        // Same test, but for compact
-        createTable("CREATE TABLE %s (k1 int, k2 int, v int, PRIMARY KEY (k1, k2)) WITH COMPACT STORAGE");
-
-        // Inserts a few rows to make sure we don 't actually query something
-        Object[][] rows = fill();
-
-        assertEmpty(execute("SELECT v FROM %s WHERE k1 IN ()"));
-        assertEmpty(execute("SELECT v FROM %s WHERE k1 = 0 AND k2 IN ()"));
-
-        // Test empty IN() in DELETE
-        execute("DELETE FROM %s WHERE k1 IN ()");
-        assertArrayEquals(rows, getRows(execute("SELECT * FROM %s")));
-
-        // Test empty IN() in UPDATE
-        execute("UPDATE %s SET v = 3 WHERE k1 IN () AND k2 = 2");
-        assertArrayEquals(rows, getRows(execute("SELECT * FROM %s")));
-    }
-
-    private Object[][] fill() throws Throwable
-    {
-        for (int i = 0; i < 2; i++)
-            for (int j = 0; j < 2; j++)
-                execute("INSERT INTO %s (k1, k2, v) VALUES (?, ?, ?)", i, j, i + j);
-
-        return getRows(execute("SELECT * FROM %s"));
-    }
-
-    /**
-     * AggregationTest
-     */
-
-    @Test
-    public void testFunctionsWithCompactStorage() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int , b int, c double, primary key(a, b) ) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 11.5)");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 9.5)");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 9.0)");
-
-        assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c) FROM %s"),
-                   row(3, 1, 6, 2, 11.5, 30.0, 10.0));
-
-        assertRows(execute("SELECT COUNT(*) FROM %s"), row(3L));
-        assertRows(execute("SELECT COUNT(1) FROM %s"), row(3L));
-        assertRows(execute("SELECT COUNT(*) FROM %s WHERE a = 1 AND b > 1"), row(2L));
-        assertRows(execute("SELECT COUNT(1) FROM %s WHERE a = 1 AND b > 1"), row(2L));
-        assertRows(execute("SELECT max(b), min(b), sum(b), avg(b) , max(c), sum(c), avg(c) FROM %s WHERE a = 1 AND b > 1"),
-                   row(3, 2, 5, 2, 9.5, 18.5, 9.25));
-    }
-
-    /**
-     * BatchTest
-     */
-    @Test
-    public void testBatchRangeDelete() throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering)) WITH COMPACT STORAGE");
-
-        int value = 0;
-        for (int partitionKey = 0; partitionKey < 4; partitionKey++)
-            for (int clustering1 = 0; clustering1 < 5; clustering1++)
-                execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (?, ?, ?)",
-                        partitionKey, clustering1, value++);
-
-        execute("BEGIN BATCH " +
-                "DELETE FROM %1$s WHERE partitionKey = 1;" +
-                "DELETE FROM %1$s WHERE partitionKey = 0 AND  clustering >= 4;" +
-                "DELETE FROM %1$s WHERE partitionKey = 0 AND clustering <= 0;" +
-                "DELETE FROM %1$s WHERE partitionKey = 2 AND clustering >= 0 AND clustering <= 3;" +
-                "DELETE FROM %1$s WHERE partitionKey = 2 AND clustering <= 3 AND clustering >= 4;" +
-                "DELETE FROM %1$s WHERE partitionKey = 3 AND (clustering) >= (3) AND (clustering) <= (6);" +
-                "APPLY BATCH;");
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, 1, 1),
-                   row(0, 2, 2),
-                   row(0, 3, 3),
-                   row(2, 4, 14),
-                   row(3, 0, 15),
-                   row(3, 1, 16),
-                   row(3, 2, 17));
-    }
-
-    /**
-     * CreateTest
-     */
-    /**
-     * /**
-     * Creation and basic operations on a static table with compact storage,
-     * migrated from cql_tests.py:TestCQL.noncomposite_static_cf_test()
-     */
-    @Test
-    public void testDenseStaticTable() throws Throwable
-    {
-        createTable("CREATE TABLE %s (userid uuid PRIMARY KEY, firstname text, lastname text, age int) WITH COMPACT STORAGE");
-
-        UUID id1 = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
-        UUID id2 = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479");
-
-        execute("INSERT INTO %s (userid, firstname, lastname, age) VALUES (?, ?, ?, ?)", id1, "Frodo", "Baggins", 32);
-        execute("UPDATE %s SET firstname = ?, lastname = ?, age = ? WHERE userid = ?", "Samwise", "Gamgee", 33, id2);
-
-        assertRows(execute("SELECT firstname, lastname FROM %s WHERE userid = ?", id1),
-                   row("Frodo", "Baggins"));
-
-        assertRows(execute("SELECT * FROM %s WHERE userid = ?", id1),
-                   row(id1, 32, "Frodo", "Baggins"));
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(id2, 33, "Samwise", "Gamgee"),
-                   row(id1, 32, "Frodo", "Baggins")
-        );
-
-        String batch = "BEGIN BATCH "
-                       + "INSERT INTO %1$s (userid, age) VALUES (?, ?) "
-                       + "UPDATE %1$s SET age = ? WHERE userid = ? "
-                       + "DELETE firstname, lastname FROM %1$s WHERE userid = ? "
-                       + "DELETE firstname, lastname FROM %1$s WHERE userid = ? "
-                       + "APPLY BATCH";
-
-        execute(batch, id1, 36, 37, id2, id1, id2);
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(id2, 37, null, null),
-                   row(id1, 36, null, null));
-    }
-
-    /**
-     * Creation and basic operations on a non-composite table with compact storage,
-     * migrated from cql_tests.py:TestCQL.dynamic_cf_test()
-     */
-    @Test
-    public void testDenseNonCompositeTable() throws Throwable
-    {
-        createTable("CREATE TABLE %s (userid uuid, url text, time bigint, PRIMARY KEY (userid, url)) WITH COMPACT STORAGE");
-
-        UUID id1 = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
-        UUID id2 = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479");
-        UUID id3 = UUID.fromString("810e8500-e29b-41d4-a716-446655440000");
-
-        execute("INSERT INTO %s (userid, url, time) VALUES (?, ?, ?)", id1, "http://foo.bar", 42L);
-        execute("INSERT INTO %s (userid, url, time) VALUES (?, ?, ?)", id1, "http://foo-2.bar", 24L);
-        execute("INSERT INTO %s (userid, url, time) VALUES (?, ?, ?)", id1, "http://bar.bar", 128L);
-        execute("UPDATE %s SET time = 24 WHERE userid = ? and url = 'http://bar.foo'", id2);
-        execute("UPDATE %s SET time = 12 WHERE userid IN (?, ?) and url = 'http://foo-3'", id2, id1);
-
-        assertRows(execute("SELECT url, time FROM %s WHERE userid = ?", id1),
-                   row("http://bar.bar", 128L),
-                   row("http://foo-2.bar", 24L),
-                   row("http://foo-3", 12L),
-                   row("http://foo.bar", 42L));
-
-        assertRows(execute("SELECT * FROM %s WHERE userid = ?", id2),
-                   row(id2, "http://bar.foo", 24L),
-                   row(id2, "http://foo-3", 12L));
-
-        assertRows(execute("SELECT time FROM %s"),
-                   row(24L), // id2
-                   row(12L),
-                   row(128L), // id1
-                   row(24L),
-                   row(12L),
-                   row(42L)
-        );
-
-        // Check we don't allow empty values for url since this is the full underlying cell name (#6152)
-        assertInvalid("INSERT INTO %s (userid, url, time) VALUES (?, '', 42)", id3);
-    }
-
-    /**
-     * Creation and basic operations on a composite table with compact storage,
-     * migrated from cql_tests.py:TestCQL.dense_cf_test()
-     */
-    @Test
-    public void testDenseCompositeTable() throws Throwable
-    {
-        createTable("CREATE TABLE %s (userid uuid, ip text, port int, time bigint, PRIMARY KEY (userid, ip, port)) WITH COMPACT STORAGE");
-
-        UUID id1 = UUID.fromString("550e8400-e29b-41d4-a716-446655440000");
-        UUID id2 = UUID.fromString("f47ac10b-58cc-4372-a567-0e02b2c3d479");
-
-        execute("INSERT INTO %s (userid, ip, port, time) VALUES (?, '192.168.0.1', 80, 42)", id1);
-        execute("INSERT INTO %s (userid, ip, port, time) VALUES (?, '192.168.0.2', 80, 24)", id1);
-        execute("INSERT INTO %s (userid, ip, port, time) VALUES (?, '192.168.0.2', 90, 42)", id1);
-        execute("UPDATE %s SET time = 24 WHERE userid = ? AND ip = '192.168.0.2' AND port = 80", id2);
-
-        // we don't have to include all of the clustering columns (see CASSANDRA-7990)
-        execute("INSERT INTO %s (userid, ip, time) VALUES (?, '192.168.0.3', 42)", id2);
-        execute("UPDATE %s SET time = 42 WHERE userid = ? AND ip = '192.168.0.4'", id2);
-
-        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ?", id1),
-                   row("192.168.0.1", 80, 42L),
-                   row("192.168.0.2", 80, 24L),
-                   row("192.168.0.2", 90, 42L));
-
-        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? and ip >= '192.168.0.2'", id1),
-                   row("192.168.0.2", 80, 24L),
-                   row("192.168.0.2", 90, 42L));
-
-        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? and ip = '192.168.0.2'", id1),
-                   row("192.168.0.2", 80, 24L),
-                   row("192.168.0.2", 90, 42L));
-
-        assertEmpty(execute("SELECT ip, port, time FROM %s WHERE userid = ? and ip > '192.168.0.2'", id1));
-
-        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? AND ip = '192.168.0.3'", id2),
-                   row("192.168.0.3", null, 42L));
-
-        assertRows(execute("SELECT ip, port, time FROM %s WHERE userid = ? AND ip = '192.168.0.4'", id2),
-                   row("192.168.0.4", null, 42L));
-
-        execute("DELETE time FROM %s WHERE userid = ? AND ip = '192.168.0.2' AND port = 80", id1);
-
-        assertRowCount(execute("SELECT * FROM %s WHERE userid = ?", id1), 2);
-
-        execute("DELETE FROM %s WHERE userid = ?", id1);
-        assertEmpty(execute("SELECT * FROM %s WHERE userid = ?", id1));
-
-        execute("DELETE FROM %s WHERE userid = ? AND ip = '192.168.0.3'", id2);
-        assertEmpty(execute("SELECT * FROM %s WHERE userid = ? AND ip = '192.168.0.3'", id2));
-    }
-
-    @Test
-    public void testCreateIndexOnCompactTableWithClusteringColumns() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int , c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE;");
-
-        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
-                             "CREATE INDEX ON %s (a);");
-
-        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
-                             "CREATE INDEX ON %s (b);");
-
-        assertInvalidMessage("Secondary indexes are not supported on compact value column of COMPACT STORAGE tables",
-                             "CREATE INDEX ON %s (c);");
-    }
-
-    @Test
-    public void testCreateIndexOnCompactTableWithoutClusteringColumns() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int) WITH COMPACT STORAGE;");
-
-        assertInvalidMessage("Secondary indexes are not supported on PRIMARY KEY columns in COMPACT STORAGE tables",
-                             "CREATE INDEX ON %s (a);");
-
-        createIndex("CREATE INDEX ON %s (b);");
-
-        execute("INSERT INTO %s (a, b) values (1, 1)");
-        execute("INSERT INTO %s (a, b) values (2, 4)");
-        execute("INSERT INTO %s (a, b) values (3, 6)");
-
-        assertRows(execute("SELECT * FROM %s WHERE b = ?", 4), row(2, 4));
-    }
-
-    /**
-     * DeleteTest
-     */
-
-    @Test
-    public void testDeleteWithNoClusteringColumns() throws Throwable
-    {
-        testDeleteWithNoClusteringColumns(false);
-        testDeleteWithNoClusteringColumns(true);
-    }
-
-    private void testDeleteWithNoClusteringColumns(boolean forceFlush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int PRIMARY KEY," +
-                    "value int)" + compactOption);
-
-        execute("INSERT INTO %s (partitionKey, value) VALUES (0, 0)");
-        execute("INSERT INTO %s (partitionKey, value) VALUES (1, 1)");
-        execute("INSERT INTO %s (partitionKey, value) VALUES (2, 2)");
-        execute("INSERT INTO %s (partitionKey, value) VALUES (3, 3)");
-        flush(forceFlush);
-
-        execute("DELETE value FROM %s WHERE partitionKey = ?", 0);
-        flush(forceFlush);
-
-        assertEmpty(execute("SELECT * FROM %s WHERE partitionKey = ?", 0));
-
-        execute("DELETE FROM %s WHERE partitionKey IN (?, ?)", 0, 1);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s"),
-                   row(2, 2),
-                   row(3, 3));
-
-        // test invalid queries
-
-        // token function
-        assertInvalidMessage("The token function cannot be used in WHERE clauses for DELETE statements",
-                             "DELETE FROM %s WHERE token(partitionKey) = token(?)", 0);
-
-        // multiple time same primary key element in WHERE clause
-        assertInvalidMessage("partitionkey cannot be restricted by more than one relation if it includes an Equal",
-                             "DELETE FROM %s WHERE partitionKey = ? AND partitionKey = ?", 0, 1);
-
-        // Undefined column names
-        assertInvalidMessage("Undefined column name unknown",
-                             "DELETE unknown FROM %s WHERE partitionKey = ?", 0);
-
-        assertInvalidMessage("Undefined column name partitionkey1",
-                             "DELETE FROM %s WHERE partitionKey1 = ?", 0);
-
-        // Invalid operator in the where clause
-        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
-                             "DELETE FROM %s WHERE partitionKey > ? ", 0);
-
-        assertInvalidMessage("Cannot use DELETE with CONTAINS",
-                             "DELETE FROM %s WHERE partitionKey CONTAINS ?", 0);
-
-        // Non primary key in the where clause
-        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
-                             "DELETE FROM %s WHERE partitionKey = ? AND value = ?", 0, 1);
-    }
-
-
-    @Test
-    public void testDeleteWithOneClusteringColumns() throws Throwable
-    {
-        testDeleteWithOneClusteringColumns(false);
-        testDeleteWithOneClusteringColumns(true);
-    }
-
-    private void testDeleteWithOneClusteringColumns(boolean forceFlush) throws Throwable
-    {
-        String compactOption = " WITH COMPACT STORAGE";
-
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering))" + compactOption);
-
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 1, 1)");
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 2, 2)");
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 3, 3)");
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 4, 4)");
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 5, 5)");
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (1, 0, 6)");
-        flush(forceFlush);
-
-        execute("DELETE value FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1);
-        flush(forceFlush);
-
-        assertEmpty(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1));
-
-        execute("DELETE FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1);
-        flush(forceFlush);
-        assertEmpty(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1));
-
-        execute("DELETE FROM %s WHERE partitionKey IN (?, ?) AND clustering = ?", 0, 1, 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
-                   row(0, 2, 2),
-                   row(0, 3, 3),
-                   row(0, 4, 4),
-                   row(0, 5, 5));
-
-        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering) IN ((?), (?))", 0, 4, 5);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
-                   row(0, 2, 2),
-                   row(0, 3, 3));
-
-        // test invalid queries
-
-        // missing primary key element
-        assertInvalidMessage("Some partition key parts are missing: partitionkey",
-                             "DELETE FROM %s WHERE clustering = ?", 1);
-
-        // token function
-        assertInvalidMessage("The token function cannot be used in WHERE clauses for DELETE statements",
-                             "DELETE FROM %s WHERE token(partitionKey) = token(?) AND clustering = ? ", 0, 1);
-
-        // multiple time same primary key element in WHERE clause
-        assertInvalidMessage("clustering cannot be restricted by more than one relation if it includes an Equal",
-                             "DELETE FROM %s WHERE partitionKey = ? AND clustering = ? AND clustering = ?", 0, 1, 1);
-
-        // Undefined column names
-        assertInvalidMessage("Undefined column name value1",
-                             "DELETE value1 FROM %s WHERE partitionKey = ? AND clustering = ?", 0, 1);
-
-        assertInvalidMessage("Undefined column name partitionkey1",
-                             "DELETE FROM %s WHERE partitionKey1 = ? AND clustering = ?", 0, 1);
-
-        assertInvalidMessage("Undefined column name clustering_3",
-                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_3 = ?", 0, 1);
-
-        // Invalid operator in the where clause
-        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
-                             "DELETE FROM %s WHERE partitionKey > ? AND clustering = ?", 0, 1);
-
-        assertInvalidMessage("Cannot use DELETE with CONTAINS",
-                             "DELETE FROM %s WHERE partitionKey CONTAINS ? AND clustering = ?", 0, 1);
-
-        // Non primary key in the where clause
-        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
-                             "DELETE FROM %s WHERE partitionKey = ? AND clustering = ? AND value = ?", 0, 1, 3);
-    }
-
-    @Test
-    public void testDeleteWithTwoClusteringColumns() throws Throwable
-    {
-        testDeleteWithTwoClusteringColumns(false);
-        testDeleteWithTwoClusteringColumns(true);
-    }
-
-    private void testDeleteWithTwoClusteringColumns(boolean forceFlush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering_1 int," +
-                    "clustering_2 int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering_1, clustering_2))" + compactOption);
-
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 1, 1)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 2, 2)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 3, 3)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 1, 4)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 2, 5)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (1, 0, 0, 6)");
-        flush(forceFlush);
-
-        execute("DELETE value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
-        flush(forceFlush);
-
-        assertEmpty(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
-                            0, 1, 1));
-
-        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) = (?, ?)", 0, 1, 1);
-        flush(forceFlush);
-        assertEmpty(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
-                            0, 1, 1));
-
-        execute("DELETE FROM %s WHERE partitionKey IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 0, 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
-                   row(0, 0, 1, 1),
-                   row(0, 0, 2, 2),
-                   row(0, 0, 3, 3),
-                   row(0, 1, 2, 5));
-
-        Object[][] rows = new Object[][]{ row(0, 0, 1, 1), row(0, 1, 2, 5) };
-
-        execute("DELETE value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 IN (?, ?)", 0, 0, 2, 3);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1), rows);
-
-        rows = new Object[][]{ row(0, 0, 1, 1) };
-
-        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))", 0, 0, 2, 1, 2);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1), rows);
-
-        execute("DELETE FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?)) AND clustering_2 = ?", 0, 0, 2, 3);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?)", 0, 1),
-                   row(0, 0, 1, 1));
-
-        // test invalid queries
-
-        // missing primary key element
-        assertInvalidMessage("Some partition key parts are missing: partitionkey",
-                             "DELETE FROM %s WHERE clustering_1 = ? AND clustering_2 = ?", 1, 1);
-
-        assertInvalidMessage("PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted",
-                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_2 = ?", 0, 1);
-
-        // token function
-        assertInvalidMessage("The token function cannot be used in WHERE clauses for DELETE statements",
-                             "DELETE FROM %s WHERE token(partitionKey) = token(?) AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
-
-        // multiple time same primary key element in WHERE clause
-        assertInvalidMessage("clustering_1 cannot be restricted by more than one relation if it includes an Equal",
-                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND clustering_1 = ?", 0, 1, 1, 1);
-
-        // Undefined column names
-        assertInvalidMessage("Undefined column name value1",
-                             "DELETE value1 FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
-
-        assertInvalidMessage("Undefined column name partitionkey1",
-                             "DELETE FROM %s WHERE partitionKey1 = ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
-
-        assertInvalidMessage("Undefined column name clustering_3",
-                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_3 = ?", 0, 1, 1);
-
-        // Invalid operator in the where clause
-        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
-                             "DELETE FROM %s WHERE partitionKey > ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
-
-        assertInvalidMessage("Cannot use DELETE with CONTAINS",
-                             "DELETE FROM %s WHERE partitionKey CONTAINS ? AND clustering_1 = ? AND clustering_2 = ?", 0, 1, 1);
-
-        // Non primary key in the where clause
-        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
-                             "DELETE FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND value = ?", 0, 1, 1, 3);
-    }
-
-    /**
-     * InsertTest
-     */
-
-    @Test
-    public void testInsertWithCompactFormat() throws Throwable
-    {
-        testInsertWithCompactFormat(false);
-        testInsertWithCompactFormat(true);
-    }
-
-    private void testInsertWithCompactFormat(boolean forceFlush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering, value) VALUES (0, 1, 1)");
-        flush(forceFlush);
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, 0, 0),
-                   row(0, 1, 1));
-
-        // Invalid Null values for the clustering key or the regular column
-        assertInvalidMessage("Some clustering keys are missing: clustering",
-                             "INSERT INTO %s (partitionKey, value) VALUES (0, 0)");
-        assertInvalidMessage("Column value is mandatory for this COMPACT STORAGE table",
-                             "INSERT INTO %s (partitionKey, clustering) VALUES (0, 0)");
-
-        // Missing primary key columns
-        assertInvalidMessage("Some partition key parts are missing: partitionkey",
-                             "INSERT INTO %s (clustering, value) VALUES (0, 1)");
-
-        // multiple time the same value
-        assertInvalidMessage("The column names contains duplicates",
-                             "INSERT INTO %s (partitionKey, clustering, value, value) VALUES (0, 0, 2, 2)");
-
-        // multiple time same primary key element in WHERE clause
-        assertInvalidMessage("The column names contains duplicates",
-                             "INSERT INTO %s (partitionKey, clustering, clustering, value) VALUES (0, 0, 0, 2)");
-
-        // Undefined column names
-        assertInvalidMessage("Undefined column name clusteringx",
-                             "INSERT INTO %s (partitionKey, clusteringx, value) VALUES (0, 0, 2)");
-
-        assertInvalidMessage("Undefined column name valuex",
-                             "INSERT INTO %s (partitionKey, clustering, valuex) VALUES (0, 0, 2)");
-    }
-
-    @Test
-    public void testInsertWithCompactStorageAndTwoClusteringColumns() throws Throwable
-    {
-        testInsertWithCompactStorageAndTwoClusteringColumns(false);
-        testInsertWithCompactStorageAndTwoClusteringColumns(true);
-    }
-
-    private void testInsertWithCompactStorageAndTwoClusteringColumns(boolean forceFlush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering_1 int," +
-                    "clustering_2 int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering_1, clustering_2)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 1, 1)");
-        flush(forceFlush);
-
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, 0, null, 0),
-                   row(0, 0, 0, 0),
-                   row(0, 0, 1, 1));
-
-        // Invalid Null values for the clustering key or the regular column
-        assertInvalidMessage("PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted",
-                             "INSERT INTO %s (partitionKey, clustering_2, value) VALUES (0, 0, 0)");
-        assertInvalidMessage("Column value is mandatory for this COMPACT STORAGE table",
-                             "INSERT INTO %s (partitionKey, clustering_1, clustering_2) VALUES (0, 0, 0)");
-
-        // Missing primary key columns
-        assertInvalidMessage("Some partition key parts are missing: partitionkey",
-                             "INSERT INTO %s (clustering_1, clustering_2, value) VALUES (0, 0, 1)");
-        assertInvalidMessage("PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted",
-                             "INSERT INTO %s (partitionKey, clustering_2, value) VALUES (0, 0, 2)");
-
-        // multiple time the same value
-        assertInvalidMessage("The column names contains duplicates",
-                             "INSERT INTO %s (partitionKey, clustering_1, value, clustering_2, value) VALUES (0, 0, 2, 0, 2)");
-
-        // multiple time same primary key element in WHERE clause
-        assertInvalidMessage("The column names contains duplicates",
-                             "INSERT INTO %s (partitionKey, clustering_1, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0, 2)");
-
-        // Undefined column names
-        assertInvalidMessage("Undefined column name clustering_1x",
-                             "INSERT INTO %s (partitionKey, clustering_1x, clustering_2, value) VALUES (0, 0, 0, 2)");
-
-        assertInvalidMessage("Undefined column name valuex",
-                             "INSERT INTO %s (partitionKey, clustering_1, clustering_2, valuex) VALUES (0, 0, 0, 2)");
-    }
-
-    /**
-     * InsertUpdateIfConditionTest
-     */
-    /**
-     * Test for CAS with compact storage table, and #6813 in particular,
-     * migrated from cql_tests.py:TestCQL.cas_and_compact_test()
-     */
-    @Test
-    public void testCompactStorage() throws Throwable
-    {
-        createTable("CREATE TABLE %s (partition text, key text, owner text, PRIMARY KEY (partition, key) ) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (partition, key, owner) VALUES ('a', 'b', null)");
-        assertRows(execute("UPDATE %s SET owner='z' WHERE partition='a' AND key='b' IF owner=null"), row(true));
-
-        assertRows(execute("UPDATE %s SET owner='b' WHERE partition='a' AND key='b' IF owner='a'"), row(false, "z"));
-        assertRows(execute("UPDATE %s SET owner='b' WHERE partition='a' AND key='b' IF owner='z'"), row(true));
-
-        assertRows(execute("INSERT INTO %s (partition, key, owner) VALUES ('a', 'c', 'x') IF NOT EXISTS"), row(true));
-    }
-
-    /**
-     * SelectGroupByTest
-     */
-
-    @Test
-    public void testGroupByWithoutPaging() throws Throwable
-    {
-
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, primary key (a, b, c, d))"
-                    + compactOption);
-
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 3, 6)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 6, 12)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 3, 2, 12, 24)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 4, 2, 12, 24)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 4, 2, 6, 12)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (2, 2, 3, 3, 6)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (2, 4, 3, 6, 12)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (3, 3, 2, 12, 24)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (4, 8, 2, 12, 24)");
-
-        // Makes sure that we have some tombstones
-        execute("DELETE FROM %s WHERE a = 1 AND b = 3 AND c = 2 AND d = 12");
-        execute("DELETE FROM %s WHERE a = 3");
-
-        // Range queries
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a"),
-                   row(1, 2, 6, 4L, 24),
-                   row(2, 2, 6, 2L, 12),
-                   row(4, 8, 24, 1L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b"),
-                   row(1, 2, 6, 2L, 12),
-                   row(1, 4, 12, 2L, 24),
-                   row(2, 2, 6, 1L, 6),
-                   row(2, 4, 12, 1L, 12),
-                   row(4, 8, 24, 1L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE b = 2 GROUP BY a, b ALLOW FILTERING"),
-                   row(1, 2, 6, 2L, 12),
-                   row(2, 2, 6, 1L, 6));
-
-        assertEmpty(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE b IN () GROUP BY a, b ALLOW FILTERING"));
-
-        // Range queries without aggregates
-        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(1, 4, 2, 6),
-                   row(2, 2, 3, 3),
-                   row(2, 4, 3, 6),
-                   row(4, 8, 2, 12));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b"),
-                   row(1, 2, 1, 3),
-                   row(1, 4, 2, 6),
-                   row(2, 2, 3, 3),
-                   row(2, 4, 3, 6),
-                   row(4, 8, 2, 12));
-
-        // Range queries with wildcard
-        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12),
-                   row(1, 4, 2, 6, 12),
-                   row(2, 2, 3, 3, 6),
-                   row(2, 4, 3, 6, 12),
-                   row(4, 8, 2, 12, 24));
-
-        assertRows(execute("SELECT * FROM %s GROUP BY a, b"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 4, 2, 6, 12),
-                   row(2, 2, 3, 3, 6),
-                   row(2, 4, 3, 6, 12),
-                   row(4, 8, 2, 12, 24));
-
-        // Range query with LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b LIMIT 2"),
-                   row(1, 2, 6, 2L, 12),
-                   row(1, 4, 12, 2L, 24));
-
-        // Range queries with PER PARTITION LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b PER PARTITION LIMIT 1"),
-                   row(1, 2, 6, 2L, 12),
-                   row(2, 2, 6, 1L, 6),
-                   row(4, 8, 24, 1L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a PER PARTITION LIMIT 2"),
-                   row(1, 2, 6, 4L, 24),
-                   row(2, 2, 6, 2L, 12),
-                   row(4, 8, 24, 1L, 24));
-
-        // Range query with PER PARTITION LIMIT and LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a, b PER PARTITION LIMIT 1 LIMIT 2"),
-                   row(1, 2, 6, 2L, 12),
-                   row(2, 2, 6, 1L, 6));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s GROUP BY a PER PARTITION LIMIT 2"),
-                   row(1, 2, 6, 4L, 24),
-                   row(2, 2, 6, 2L, 12),
-                   row(4, 8, 24, 1L, 24));
-
-        // Range queries without aggregates and with LIMIT
-        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c LIMIT 3"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(1, 4, 2, 6));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b LIMIT 3"),
-                   row(1, 2, 1, 3),
-                   row(1, 4, 2, 6),
-                   row(2, 2, 3, 3));
-
-        // Range queries with wildcard and with LIMIT
-        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c LIMIT 3"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12),
-                   row(1, 4, 2, 6, 12));
-
-        assertRows(execute("SELECT * FROM %s GROUP BY a, b LIMIT 3"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 4, 2, 6, 12),
-                   row(2, 2, 3, 3, 6));
-
-        // Range queries without aggregates and with PER PARTITION LIMIT
-        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(2, 2, 3, 3),
-                   row(2, 4, 3, 6),
-                   row(4, 8, 2, 12));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b PER PARTITION LIMIT 1"),
-                   row(1, 2, 1, 3),
-                   row(2, 2, 3, 3),
-                   row(4, 8, 2, 12));
-
-        // Range queries with wildcard and with PER PARTITION LIMIT
-        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12),
-                   row(2, 2, 3, 3, 6),
-                   row(2, 4, 3, 6, 12),
-                   row(4, 8, 2, 12, 24));
-
-        assertRows(execute("SELECT * FROM %s GROUP BY a, b PER PARTITION LIMIT 1"),
-                   row(1, 2, 1, 3, 6),
-                   row(2, 2, 3, 3, 6),
-                   row(4, 8, 2, 12, 24));
-
-        // Range queries without aggregates, with PER PARTITION LIMIT and LIMIT
-        assertRows(execute("SELECT a, b, c, d FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2 LIMIT 3"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(2, 2, 3, 3));
-
-        // Range queries with wildcard, with PER PARTITION LIMIT and LIMIT
-        assertRows(execute("SELECT * FROM %s GROUP BY a, b, c PER PARTITION LIMIT 2 LIMIT 3"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12),
-                   row(2, 2, 3, 3, 6));
-
-        // Range query with DISTINCT
-        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s GROUP BY a"),
-                   row(1, 1L),
-                   row(2, 1L),
-                   row(4, 1L));
-
-        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
-                             "SELECT DISTINCT a, count(a)FROM %s GROUP BY a, b");
-
-        // Range query with DISTINCT and LIMIT
-        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s GROUP BY a LIMIT 2"),
-                   row(1, 1L),
-                   row(2, 1L));
-
-        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
-                             "SELECT DISTINCT a, count(a)FROM %s GROUP BY a, b LIMIT 2");
-
-        // Range query with ORDER BY
-        assertInvalidMessage("ORDER BY is only supported when the partition key is restricted by an EQ or an IN",
-                             "SELECT a, b, c, count(b), max(e) FROM %s GROUP BY a, b ORDER BY b DESC, c DESC");
-
-        // Single partition queries
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12),
-                   row(1, 4, 12, 2L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY b, c"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12),
-                   row(1, 4, 12, 2L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 AND b = 2 GROUP BY a, b, c"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 AND b = 2 GROUP BY a, c"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 AND b = 2 GROUP BY c"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12));
-
-        // Single partition queries without aggregates
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b"),
-                   row(1, 2, 1, 3),
-                   row(1, 4, 2, 6));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b, c"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(1, 4, 2, 6));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY b, c"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(1, 4, 2, 6));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 and token(a) = token(1) GROUP BY b, c"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(1, 4, 2, 6));
-
-        // Single partition queries with wildcard
-        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b, c"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12),
-                   row(1, 4, 2, 6, 12));
-
-        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 4, 2, 6, 12));
-
-        // Single partition queries with DISTINCT
-        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s WHERE a = 1 GROUP BY a"),
-                   row(1, 1L));
-
-        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
-                             "SELECT DISTINCT a, count(a)FROM %s WHERE a = 1 GROUP BY a, b");
-
-        // Single partition queries with LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 10"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12),
-                   row(1, 4, 12, 2L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 2"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12));
-
-        assertRows(execute("SELECT count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 1"),
-                   row(1L, 6));
-
-        // Single partition queries with PER PARTITION LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 10"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12),
-                   row(1, 4, 12, 2L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 2"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12));
-
-        assertRows(execute("SELECT count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 1"),
-                   row(1L, 6));
-
-        // Single partition queries without aggregates and with LIMIT
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b LIMIT 2"),
-                   row(1, 2, 1, 3),
-                   row(1, 4, 2, 6));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b LIMIT 1"),
-                   row(1, 2, 1, 3));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 2"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6));
-
-        // Single partition queries with wildcard and with LIMIT
-        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b, c LIMIT 2"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12));
-
-        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b LIMIT 1"),
-                   row(1, 2, 1, 3, 6));
-
-        // Single partition queries without aggregates and with PER PARTITION LIMIT
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b PER PARTITION LIMIT 2"),
-                   row(1, 2, 1, 3),
-                   row(1, 4, 2, 6));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b PER PARTITION LIMIT 1"),
-                   row(1, 2, 1, 3));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 2"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6));
-
-        // Single partition queries with wildcard and with PER PARTITION LIMIT
-        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b, c PER PARTITION LIMIT 2"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12));
-
-        assertRows(execute("SELECT * FROM %s WHERE a = 1 GROUP BY a, b PER PARTITION LIMIT 1"),
-                   row(1, 2, 1, 3, 6));
-
-        // Single partition queries with ORDER BY
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c ORDER BY b DESC, c DESC"),
-                   row(1, 4, 24, 2L, 24),
-                   row(1, 2, 12, 1L, 12),
-                   row(1, 2, 6, 1L, 6));
-
-        // Single partition queries with ORDER BY and PER PARTITION LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c ORDER BY b DESC, c DESC PER PARTITION LIMIT 1"),
-                   row(1, 4, 24, 2L, 24));
-
-        // Single partition queries with ORDER BY and LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a = 1 GROUP BY a, b, c ORDER BY b DESC, c DESC LIMIT 2"),
-                   row(1, 4, 24, 2L, 24),
-                   row(1, 2, 12, 1L, 12));
-
-        // Multi-partitions queries
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12),
-                   row(1, 4, 12, 2L, 24),
-                   row(2, 2, 6, 1L, 6),
-                   row(2, 4, 12, 1L, 12),
-                   row(4, 8, 24, 1L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) AND b = 2 GROUP BY a, b, c"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12),
-                   row(2, 2, 6, 1L, 6));
-
-        // Multi-partitions queries without aggregates
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b"),
-                   row(1, 2, 1, 3),
-                   row(1, 4, 2, 6),
-                   row(2, 2, 3, 3),
-                   row(2, 4, 3, 6),
-                   row(4, 8, 2, 12));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c"),
-                   row(1, 2, 1, 3),
-                   row(1, 2, 2, 6),
-                   row(1, 4, 2, 6),
-                   row(2, 2, 3, 3),
-                   row(2, 4, 3, 6),
-                   row(4, 8, 2, 12));
-
-        // Multi-partitions with wildcard
-        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12),
-                   row(1, 4, 2, 6, 12),
-                   row(2, 2, 3, 3, 6),
-                   row(2, 4, 3, 6, 12),
-                   row(4, 8, 2, 12, 24));
-
-        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 4, 2, 6, 12),
-                   row(2, 2, 3, 3, 6),
-                   row(2, 4, 3, 6, 12),
-                   row(4, 8, 2, 12, 24));
-
-        // Multi-partitions query with DISTINCT
-        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s WHERE a IN (1, 2, 4) GROUP BY a"),
-                   row(1, 1L),
-                   row(2, 1L),
-                   row(4, 1L));
-
-        assertInvalidMessage("Grouping on clustering columns is not allowed for SELECT DISTINCT queries",
-                             "SELECT DISTINCT a, count(a)FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b");
-
-        // Multi-partitions query with DISTINCT and LIMIT
-        assertRows(execute("SELECT DISTINCT a, count(a)FROM %s WHERE a IN (1, 2, 4) GROUP BY a LIMIT 2"),
-                   row(1, 1L),
-                   row(2, 1L));
-
-        // Multi-partitions queries with PER PARTITION LIMIT
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c PER PARTITION LIMIT 1"),
-                   row(1, 2, 6, 1L, 6),
-                   row(2, 2, 6, 1L, 6),
-                   row(4, 8, 24, 1L, 24));
-
-        assertRows(execute("SELECT a, b, e, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c PER PARTITION LIMIT 2"),
-                   row(1, 2, 6, 1L, 6),
-                   row(1, 2, 12, 1L, 12),
-                   row(2, 2, 6, 1L, 6),
-                   row(2, 4, 12, 1L, 12),
-                   row(4, 8, 24, 1L, 24));
-
-        // Multi-partitions with wildcard and PER PARTITION LIMIT
-        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c PER PARTITION LIMIT 2"),
-                   row(1, 2, 1, 3, 6),
-                   row(1, 2, 2, 6, 12),
-                   row(2, 2, 3, 3, 6),
-                   row(2, 4, 3, 6, 12),
-                   row(4, 8, 2, 12, 24));
-
-        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b PER PARTITION LIMIT 1"),
-                   row(1, 2, 1, 3, 6),
-                   row(2, 2, 3, 3, 6),
-                   row(4, 8, 2, 12, 24));
-
-        // Multi-partitions queries with ORDER BY
-        assertRows(execute("SELECT a, b, c, count(b), max(e) FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b ORDER BY b DESC, c DESC"),
-                   row(4, 8, 2, 1L, 24),
-                   row(2, 4, 3, 1L, 12),
-                   row(1, 4, 2, 2L, 24),
-                   row(2, 2, 3, 1L, 6),
-                   row(1, 2, 2, 2L, 12));
-
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c ORDER BY b DESC, c DESC"),
-                   row(4, 8, 2, 12),
-                   row(2, 4, 3, 6),
-                   row(1, 4, 2, 12),
-                   row(2, 2, 3, 3),
-                   row(1, 2, 2, 6),
-                   row(1, 2, 1, 3));
-
-        // Multi-partitions queries with ORDER BY and LIMIT
-        assertRows(execute("SELECT a, b, c, d FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b ORDER BY b DESC, c DESC LIMIT 3"),
-                   row(4, 8, 2, 12),
-                   row(2, 4, 3, 6),
-                   row(1, 4, 2, 12));
-
-        // Multi-partitions with wildcard, ORDER BY and LIMIT
-        assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2, 4) GROUP BY a, b, c ORDER BY b DESC, c DESC LIMIT 3"),
-                   row(4, 8, 2, 12, 24),
-                   row(2, 4, 3, 6, 12),
-                   row(1, 4, 2, 12, 24));
-
-        // Invalid queries
-        assertInvalidMessage("Group by is currently only supported on the columns of the PRIMARY KEY, got e",
-                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY a, e");
-
-        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
-                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY c");
-
-        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
-                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY a, c, b");
-
-        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
-                             "SELECT a, b, d, count(b), max(c) FROM %s WHERE a = 1 GROUP BY a, a");
-
-        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
-                             "SELECT a, b, c, d FROM %s WHERE token(a) = token(1) GROUP BY b, c");
-
-        assertInvalidMessage("Undefined column name clustering1",
-                             "SELECT a, b as clustering1, max(c) FROM %s WHERE a = 1 GROUP BY a, clustering1");
-
-        assertInvalidMessage("Undefined column name z",
-                             "SELECT a, b, max(c) FROM %s WHERE a = 1 GROUP BY a, b, z");
-
-        // Test with composite partition key
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, primary key ((a, b), c, d))" + compactOption);
-
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 1, 1, 3, 6)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 1, 2, 6, 12)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 1, 3, 12, 24)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 12, 24)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 6, 12)");
-
-        assertInvalidMessage("Group by is not supported on only a part of the partition key",
-                             "SELECT a, b, max(d) FROM %s GROUP BY a");
-
-        assertRows(execute("SELECT a, b, max(d) FROM %s GROUP BY a, b"),
-                   row(1, 2, 12),
-                   row(1, 1, 12));
-
-        assertRows(execute("SELECT a, b, max(d) FROM %s WHERE a = 1 AND b = 1 GROUP BY b"),
-                   row(1, 1, 12));
-
-        // Test with table without clustering key
-        createTable("CREATE TABLE %s (a int primary key, b int, c int)" + compactOption);
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 6)");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 6, 12)");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 12, 24)");
-
-        assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
-                             "SELECT a, max(c) FROM %s WHERE a = 1 GROUP BY a, a");
-    }
-
-    @Test
-    public void testGroupByWithoutPagingWithDeletions() throws Throwable
-    {
-
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, e int, primary key (a, b, c, d))"
-                    + compactOption);
-
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 3, 6)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 6, 12)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 9, 18)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 1, 12, 24)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 3, 6)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 6, 12)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 9, 18)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 2, 12, 24)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 3, 6)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 6, 12)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 9, 18)");
-        execute("INSERT INTO %s (a, b, c, d, e) VALUES (1, 2, 3, 12, 24)");
-
-        execute("DELETE FROM %s WHERE a = 1 AND b = 2 AND c = 1 AND d = 12");
-        execute("DELETE FROM %s WHERE a = 1 AND b = 2 AND c = 2 AND d = 9");
-
-        assertRows(execute("SELECT a, b, c, count(b), max(d) FROM %s GROUP BY a, b, c"),
-                   row(1, 2, 1, 3L, 9),
-                   row(1, 2, 2, 3L, 12),
-                   row(1, 2, 3, 4L, 12));
-    }
-
-    @Test
-    public void testGroupByWithRangeNamesQueryWithoutPaging() throws Throwable
-    {
-
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, primary key (a, b, c))"
-                    + compactOption);
-
-        for (int i = 1; i < 5; i++)
-            for (int j = 1; j < 5; j++)
-                for (int k = 1; k < 5; k++)
-                    execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", i, j, k, i + j);
-
-        // Makes sure that we have some tombstones
-        execute("DELETE FROM %s WHERE a = 3");
-
-        // Range queries
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3),
-                   row(4, 1, 5, 2L, 5));
-
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3),
-                   row(4, 1, 5, 2L, 5));
-
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(1, 2, 3, 2L, 3),
-                   row(2, 1, 3, 2L, 3),
-                   row(2, 2, 4, 2L, 4),
-                   row(4, 1, 5, 2L, 5),
-                   row(4, 2, 6, 2L, 6));
-
-        // Range queries with LIMIT
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a LIMIT 5 ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3),
-                   row(4, 1, 5, 2L, 5));
-
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b LIMIT 3 ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3),
-                   row(4, 1, 5, 2L, 5));
-
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b LIMIT 3 ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(1, 2, 3, 2L, 3),
-                   row(2, 1, 3, 2L, 3));
-
-        // Range queries with PER PARTITION LIMIT
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 2 ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3),
-                   row(4, 1, 5, 2L, 5));
-
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 1 ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3),
-                   row(4, 1, 5, 2L, 5));
-
-        // Range queries with PER PARTITION LIMIT and LIMIT
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b = 1 and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 2 LIMIT 5 ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3),
-                   row(4, 1, 5, 2L, 5));
-
-        assertRows(execute("SELECT a, b, d, count(b), max(d) FROM %s WHERE b IN (1, 2) and c IN (1, 2) GROUP BY a, b PER PARTITION LIMIT 1 LIMIT 2 ALLOW FILTERING"),
-                   row(1, 1, 2, 2L, 2),
-                   row(2, 1, 3, 2L, 3));
-    }
-
-    /**
-     * SelectSingleColumn
-     */
-    @Test
-    public void testClusteringColumnRelationsWithCompactStorage() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a text, b int, c int, d int, primary key(a, b, c)) WITH COMPACT STORAGE;");
-        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 1, 5, 1);
-        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 2, 6, 2);
-        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "first", 3, 7, 3);
-        execute("insert into %s (a, b, c, d) values (?, ?, ?, ?)", "second", 4, 8, 4);
-
-        assertRows(execute("select * from %s where a in (?, ?)", "first", "second"),
-                   row("first", 1, 5, 1),
-                   row("first", 2, 6, 2),
-                   row("first", 3, 7, 3),
-                   row("second", 4, 8, 4));
-
-        assertRows(execute("select * from %s where a = ? and b = ? and c in (?, ?)", "first", 2, 6, 7),
-                   row("first", 2, 6, 2));
-
-        assertRows(execute("select * from %s where a = ? and b in (?, ?) and c in (?, ?)", "first", 2, 3, 6, 7),
-                   row("first", 2, 6, 2),
-                   row("first", 3, 7, 3));
-
-        assertRows(execute("select * from %s where a = ? and b in (?, ?) and c in (?, ?)", "first", 3, 2, 7, 6),
-                   row("first", 2, 6, 2),
-                   row("first", 3, 7, 3));
-
-        assertRows(execute("select * from %s where a = ? and c in (?, ?) and b in (?, ?)", "first", 7, 6, 3, 2),
-                   row("first", 2, 6, 2),
-                   row("first", 3, 7, 3));
-
-        assertRows(execute("select c, d from %s where a = ? and c in (?, ?) and b in (?, ?)", "first", 7, 6, 3, 2),
-                   row(6, 2),
-                   row(7, 3));
-
-        assertRows(execute("select c, d from %s where a = ? and c in (?, ?) and b in (?, ?, ?)", "first", 7, 6, 3, 2, 3),
-                   row(6, 2),
-                   row(7, 3));
-
-        assertRows(execute("select * from %s where a = ? and b in (?, ?) and c = ?", "first", 3, 2, 7),
-                   row("first", 3, 7, 3));
-
-        assertRows(execute("select * from %s where a = ? and b in ? and c in ?",
-                           "first", Arrays.asList(3, 2), Arrays.asList(7, 6)),
-                   row("first", 2, 6, 2),
-                   row("first", 3, 7, 3));
-
-        assertInvalidMessage("Invalid null value for column b",
-                             "select * from %s where a = ? and b in ? and c in ?", "first", null, Arrays.asList(7, 6));
-
-        assertRows(execute("select * from %s where a = ? and c >= ? and b in (?, ?)", "first", 6, 3, 2),
-                   row("first", 2, 6, 2),
-                   row("first", 3, 7, 3));
-
-        assertRows(execute("select * from %s where a = ? and c > ? and b in (?, ?)", "first", 6, 3, 2),
-                   row("first", 3, 7, 3));
-
-        assertRows(execute("select * from %s where a = ? and c <= ? and b in (?, ?)", "first", 6, 3, 2),
-                   row("first", 2, 6, 2));
-
-        assertRows(execute("select * from %s where a = ? and c < ? and b in (?, ?)", "first", 7, 3, 2),
-                   row("first", 2, 6, 2));
-
-        assertRows(execute("select * from %s where a = ? and c >= ? and c <= ? and b in (?, ?)", "first", 6, 7, 3, 2),
-                   row("first", 2, 6, 2),
-                   row("first", 3, 7, 3));
-
-        assertRows(execute("select * from %s where a = ? and c > ? and c <= ? and b in (?, ?)", "first", 6, 7, 3, 2),
-                   row("first", 3, 7, 3));
-
-        assertEmpty(execute("select * from %s where a = ? and c > ? and c < ? and b in (?, ?)", "first", 6, 7, 3, 2));
-
-        assertInvalidMessage("Column \"c\" cannot be restricted by both an equality and an inequality relation",
-                             "select * from %s where a = ? and c > ? and c = ? and b in (?, ?)", "first", 6, 7, 3, 2);
-
-        assertInvalidMessage("c cannot be restricted by more than one relation if it includes an Equal",
-                             "select * from %s where a = ? and c = ? and c > ?  and b in (?, ?)", "first", 6, 7, 3, 2);
-
-        assertRows(execute("select * from %s where a = ? and c in (?, ?) and b in (?, ?) order by b DESC",
-                           "first", 7, 6, 3, 2),
-                   row("first", 3, 7, 3),
-                   row("first", 2, 6, 2));
-
-        assertInvalidMessage("More than one restriction was found for the start bound on b",
-                             "select * from %s where a = ? and b > ? and b > ?", "first", 6, 3, 2);
-
-        assertInvalidMessage("More than one restriction was found for the end bound on b",
-                             "select * from %s where a = ? and b < ? and b <= ?", "first", 6, 3, 2);
-    }
-
-    /**
-     * SelectTest
-     */
-    /**
-     * Check query with KEY IN clause for wide row tables
-     * migrated from cql_tests.py:TestCQL.in_clause_wide_rows_test()
-     */
-    @Test
-    public void testSelectKeyInForWideRows() throws Throwable
-    {
-        createTable("CREATE TABLE %s (k int, c int, v int, PRIMARY KEY (k, c)) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 10; i++)
-            execute("INSERT INTO %s (k, c, v) VALUES (0, ?, ?)", i, i);
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c IN (5, 2, 8)"),
-                   row(2), row(5), row(8));
-
-        createTable("CREATE TABLE %s (k int, c1 int, c2 int, v int, PRIMARY KEY (k, c1, c2)) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 10; i++)
-            execute("INSERT INTO %s (k, c1, c2, v) VALUES (0, 0, ?, ?)", i, i);
-
-        assertEmpty(execute("SELECT v FROM %s WHERE k = 0 AND c1 IN (5, 2, 8) AND c2 = 3"));
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c1 = 0 AND c2 IN (5, 2, 8)"),
-                   row(2), row(5), row(8));
-    }
-
-    /**
-     * Check SELECT respects inclusive and exclusive bounds
-     * migrated from cql_tests.py:TestCQL.exclusive_slice_test()
-     */
-    @Test
-    public void testSelectBounds() throws Throwable
-    {
-        createTable("CREATE TABLE %s (k int, c int, v int, PRIMARY KEY (k, c)) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 10; i++)
-            execute("INSERT INTO %s (k, c, v) VALUES (0, ?, ?)", i, i);
-
-        assertRowCount(execute("SELECT v FROM %s WHERE k = 0"), 10);
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c >= 2 AND c <= 6"),
-                   row(2), row(3), row(4), row(5), row(6));
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c > 2 AND c <= 6"),
-                   row(3), row(4), row(5), row(6));
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c >= 2 AND c < 6"),
-                   row(2), row(3), row(4), row(5));
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c > 2 AND c < 6"),
-                   row(3), row(4), row(5));
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c > 2 AND c <= 6 LIMIT 2"),
-                   row(3), row(4));
-
-        assertRows(execute("SELECT v FROM %s WHERE k = 0 AND c >= 2 AND c < 6 ORDER BY c DESC LIMIT 2"),
-                   row(5), row(4));
-    }
-
-    /**
-     * Test for #4716 bug and more generally for good behavior of ordering,
-     * migrated from cql_tests.py:TestCQL.reversed_compact_test()
-     */
-    @Test
-    public void testReverseCompact() throws Throwable
-    {
-        createTable("CREATE TABLE %s ( k text, c int, v int, PRIMARY KEY (k, c) ) WITH COMPACT STORAGE AND CLUSTERING ORDER BY (c DESC)");
-
-        for (int i = 0; i < 10; i++)
-            execute("INSERT INTO %s (k, c, v) VALUES ('foo', ?, ?)", i, i);
-
-        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo'"),
-                   row(5), row(4), row(3));
-
-        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo'"),
-                   row(6), row(5), row(4), row(3), row(2));
-
-        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c ASC"),
-                   row(3), row(4), row(5));
-
-        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c ASC"),
-                   row(2), row(3), row(4), row(5), row(6));
-
-        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c DESC"),
-                   row(5), row(4), row(3));
-
-        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c DESC"),
-                   row(6), row(5), row(4), row(3), row(2));
-
-        createTable("CREATE TABLE %s ( k text, c int, v int, PRIMARY KEY (k, c) ) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 10; i++)
-            execute("INSERT INTO %s(k, c, v) VALUES ('foo', ?, ?)", i, i);
-
-        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo'"),
-                   row(3), row(4), row(5));
-
-        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo'"),
-                   row(2), row(3), row(4), row(5), row(6));
-
-        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c ASC"),
-                   row(3), row(4), row(5));
-
-        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c ASC"),
-                   row(2), row(3), row(4), row(5), row(6));
-
-        assertRows(execute("SELECT c FROM %s WHERE c > 2 AND c < 6 AND k = 'foo' ORDER BY c DESC"),
-                   row(5), row(4), row(3));
-
-        assertRows(execute("SELECT c FROM %s WHERE c >= 2 AND c <= 6 AND k = 'foo' ORDER BY c DESC"),
-                   row(6), row(5), row(4), row(3), row(2));
-    }
-
-    /**
-     * Test for the bug from #4760 and #4759,
-     * migrated from cql_tests.py:TestCQL.reversed_compact_multikey_test()
-     */
-    @Test
-    public void testReversedCompactMultikey() throws Throwable
-    {
-        createTable("CREATE TABLE %s (key text, c1 int, c2 int, value text, PRIMARY KEY(key, c1, c2) ) WITH COMPACT STORAGE AND CLUSTERING ORDER BY(c1 DESC, c2 DESC)");
-
-        for (int i = 0; i < 3; i++)
-            for (int j = 0; j < 3; j++)
-                execute("INSERT INTO %s (key, c1, c2, value) VALUES ('foo', ?, ?, 'bar')", i, j);
-
-        // Equalities
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 = 1"),
-                   row(1, 2), row(1, 1), row(1, 0));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 = 1 ORDER BY c1 ASC, c2 ASC"),
-                   row(1, 0), row(1, 1), row(1, 2));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 = 1 ORDER BY c1 DESC, c2 DESC"),
-                   row(1, 2), row(1, 1), row(1, 0));
-
-        // GT
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 > 1"),
-                   row(2, 2), row(2, 1), row(2, 0));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 > 1 ORDER BY c1 ASC, c2 ASC"),
-                   row(2, 0), row(2, 1), row(2, 2));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 > 1 ORDER BY c1 DESC, c2 DESC"),
-                   row(2, 2), row(2, 1), row(2, 0));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1"),
-                   row(2, 2), row(2, 1), row(2, 0), row(1, 2), row(1, 1), row(1, 0));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1 ORDER BY c1 ASC, c2 ASC"),
-                   row(1, 0), row(1, 1), row(1, 2), row(2, 0), row(2, 1), row(2, 2));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1 ORDER BY c1 ASC"),
-                   row(1, 0), row(1, 1), row(1, 2), row(2, 0), row(2, 1), row(2, 2));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 >= 1 ORDER BY c1 DESC, c2 DESC"),
-                   row(2, 2), row(2, 1), row(2, 0), row(1, 2), row(1, 1), row(1, 0));
-
-        // LT
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 < 1"),
-                   row(0, 2), row(0, 1), row(0, 0));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 < 1 ORDER BY c1 ASC, c2 ASC"),
-                   row(0, 0), row(0, 1), row(0, 2));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 < 1 ORDER BY c1 DESC, c2 DESC"),
-                   row(0, 2), row(0, 1), row(0, 0));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1"),
-                   row(1, 2), row(1, 1), row(1, 0), row(0, 2), row(0, 1), row(0, 0));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1 ORDER BY c1 ASC, c2 ASC"),
-                   row(0, 0), row(0, 1), row(0, 2), row(1, 0), row(1, 1), row(1, 2));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1 ORDER BY c1 ASC"),
-                   row(0, 0), row(0, 1), row(0, 2), row(1, 0), row(1, 1), row(1, 2));
-
-        assertRows(execute("SELECT c1, c2 FROM %s WHERE key='foo' AND c1 <= 1 ORDER BY c1 DESC, c2 DESC"),
-                   row(1, 2), row(1, 1), row(1, 0), row(0, 2), row(0, 1), row(0, 0));
-    }
-
-    /**
-     * Migrated from cql_tests.py:TestCQL.multi_in_compact_non_composite_test()
-     */
-    @Test
-    public void testMultiSelectsNonCompositeCompactStorage() throws Throwable
-    {
-        createTable("CREATE TABLE %s (key int, c int, v int, PRIMARY KEY (key, c)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (key, c, v) VALUES (0, 0, 0)");
-        execute("INSERT INTO %s (key, c, v) VALUES (0, 1, 1)");
-        execute("INSERT INTO %s (key, c, v) VALUES (0, 2, 2)");
-
-        assertRows(execute("SELECT * FROM %s WHERE key=0 AND c IN (0, 2)"),
-                   row(0, 0, 0), row(0, 2, 2));
-    }
-
-    @Test
-    public void testSelectDistinct() throws Throwable
-    {
-        //Test a 'compact storage' table.
-        createTable("CREATE TABLE %s (pk0 int, pk1 int, val int, PRIMARY KEY((pk0, pk1))) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 3; i++)
-            execute("INSERT INTO %s (pk0, pk1, val) VALUES (?, ?, ?)", i, i, i);
-
-        assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s LIMIT 1"),
-                   row(0, 0));
-
-        assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s LIMIT 3"),
-                   row(0, 0),
-                   row(2, 2),
-                   row(1, 1));
-
-        // Test a 'wide row' thrift table.
-        createTable("CREATE TABLE %s (pk int, name text, val int, PRIMARY KEY(pk, name)) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 3; i++)
-        {
-            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name0', 0)", i);
-            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name1', 1)", i);
-        }
-
-        assertRows(execute("SELECT DISTINCT pk FROM %s LIMIT 1"),
-                   row(1));
-
-        assertRows(execute("SELECT DISTINCT pk FROM %s LIMIT 3"),
-                   row(1),
-                   row(0),
-                   row(2));
-    }
-
-    @Test
-    public void testFilteringOnCompactTablesWithoutIndices() throws Throwable
-    {
-        //----------------------------------------------
-        // Test COMPACT table with clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, 6)");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, 7)");
-
-        // Adds tomstones
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 2, 7)");
-        execute("DELETE FROM %s WHERE a = 1 AND b = 1");
-        execute("DELETE FROM %s WHERE a = 2 AND b = 2");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4 ALLOW FILTERING"),
-                       row(1, 4, 4));
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (c) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7)");
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (c) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING");
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > 4 ALLOW FILTERING"),
-                       row(1, 3, 6),
-                       row(2, 3, 7));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b < 3 AND c <= 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= 4 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= 3 AND c <= 6");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= 3 AND c <= 6 ALLOW FILTERING"),
-                       row(1, 2, 4),
-                       row(1, 3, 6),
-                       row(1, 4, 4));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-
-        //----------------------------------------------
-        // Test COMPACT table without clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, 6)");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, 7)");
-
-        // Adds tomstones
-        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (5, 2, 7)");
-        execute("DELETE FROM %s WHERE a = 0");
-        execute("DELETE FROM %s WHERE a = 5");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = 4 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (c) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7)");
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (c) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING");
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > 4 ALLOW FILTERING"),
-                       row(2, 1, 6),
-                       row(4, 1, 7));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b < 3 AND c <= 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= 4 ALLOW FILTERING"),
-                       row(1, 2, 4),
-                       row(3, 2, 4));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= 3 AND c <= 6");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= 3 AND c <= 6 ALLOW FILTERING"),
-                       row(1, 2, 4),
-                       row(2, 1, 6),
-                       row(3, 2, 4));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-
-        // // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-    }
-
-    @Test
-    public void testFilteringOnCompactTablesWithoutIndicesAndWithLists() throws Throwable
-    {
-        //----------------------------------------------
-        // Test COMPACT table with clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c frozen<list<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, [6, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, [4, 1])");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, [7, 1])");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = [4, 1]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = [4, 1] ALLOW FILTERING"),
-                       row(1, 4, list(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > [4, 2] ALLOW FILTERING"),
-                       row(1, 3, list(6, 2)),
-                       row(2, 3, list(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b <= 3 AND c < [6, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE b <= 3 AND c < [6, 2] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= [4, 2] AND c <= [6, 4]");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= [4, 2] AND c <= [6, 4] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)),
-                       row(1, 3, list(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)),
-                       row(1, 3, list(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(1, 3, list(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
-                             unset());
-
-        //----------------------------------------------
-        // Test COMPACT table without clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<list<int>>) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, [6, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, [4, 1])");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, [7, 1])");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = [4, 2] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > [4, 2] ALLOW FILTERING"),
-                       row(2, 1, list(6, 2)),
-                       row(4, 1, list(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b < 3 AND c <= [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= [4, 2] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)),
-                       row(3, 2, list(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= [4, 3] AND c <= [7]");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= [4, 3] AND c <= [7] ALLOW FILTERING"),
-                       row(2, 1, list(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)),
-                       row(2, 1, list(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(2, 1, list(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
-                             unset());
-    }
-
-    @Test
-    public void testFilteringOnCompactTablesWithoutIndicesAndWithSets() throws Throwable
-    {
-        //----------------------------------------------
-        // Test COMPACT table with clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c frozen<set<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4, 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7, 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4, 1}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4, 1} ALLOW FILTERING"),
-                       row(1, 4, set(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > {4, 2} ALLOW FILTERING"),
-                       row(1, 3, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b <= 3 AND c < {6, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE b <= 3 AND c < {6, 2} ALLOW FILTERING"),
-                       row(1, 2, set(2, 4)),
-                       row(2, 3, set(1, 7)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= {4, 2} AND c <= {6, 4}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= {4, 2} AND c <= {6, 4} ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(1, 3, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(1, 3, set(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(1, 3, set(6, 2)));
-        });
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
-                             unset());
-
-        //----------------------------------------------
-        // Test COMPACT table without clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<set<int>>) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4, 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7, 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4, 2} ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > {4, 2} ALLOW FILTERING"),
-                       row(2, 1, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b < 3 AND c <= {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= {4, 2} ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(4, 1, set(1, 7)),
-                       row(3, 2, set(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= {4, 3} AND c <= {7}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= {5, 2} AND c <= {7} ALLOW FILTERING"),
-                       row(2, 1, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(2, 1, set(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(2, 1, set(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
-                             unset());
-    }
-
-    @Test
-    public void testAllowFilteringOnPartitionKeyWithDistinct() throws Throwable
-    {
-        // Test a 'compact storage' table.
-        createTable("CREATE TABLE %s (pk0 int, pk1 int, val int, PRIMARY KEY((pk0, pk1))) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 3; i++)
-            execute("INSERT INTO %s (pk0, pk1, val) VALUES (?, ?, ?)", i, i, i);
-
-        beforeAndAfterFlush(() -> {
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT DISTINCT pk0, pk1 FROM %s WHERE pk1 = 1 LIMIT 3");
-
-            assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s WHERE pk0 < 2 AND pk1 = 1 LIMIT 1 ALLOW FILTERING"),
-                       row(1, 1));
-
-            assertRows(execute("SELECT DISTINCT pk0, pk1 FROM %s WHERE pk1 > 1 LIMIT 3 ALLOW FILTERING"),
-                       row(2, 2));
-        });
-
-        // Test a 'wide row' thrift table.
-        createTable("CREATE TABLE %s (pk int, name text, val int, PRIMARY KEY(pk, name)) WITH COMPACT STORAGE");
-
-        for (int i = 0; i < 3; i++)
-        {
-            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name0', 0)", i);
-            execute("INSERT INTO %s (pk, name, val) VALUES (?, 'name1', 1)", i);
-        }
-
-        beforeAndAfterFlush(() -> {
-            assertRows(execute("SELECT DISTINCT pk FROM %s WHERE pk > 1 LIMIT 1 ALLOW FILTERING"),
-                       row(2));
-
-            assertRows(execute("SELECT DISTINCT pk FROM %s WHERE pk > 0 LIMIT 3 ALLOW FILTERING"),
-                       row(1),
-                       row(2));
-        });
-    }
-
-    @Test
-    public void testAllowFilteringOnPartitionKeyWithCounters() throws Throwable
-    {
-        for (String compactStorageClause : new String[]{ "", " WITH COMPACT STORAGE" })
-        {
-            createTable("CREATE TABLE %s (a int, b int, c int, cnt counter, PRIMARY KEY ((a, b), c))"
-                        + compactStorageClause);
-
-            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 14L, 11, 12, 13);
-            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 21, 22, 23);
-            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 27L, 21, 22, 26);
-            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 34L, 31, 32, 33);
-            execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 41, 42, 43);
-
-            beforeAndAfterFlush(() -> {
-
-                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt = 24"),
-                           row(41, 42, 43, 24L),
-                           row(21, 22, 23, 24L));
-                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 22 AND cnt = 24"),
-                           row(41, 42, 43, 24L));
-                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND b < 25 AND cnt = 24"),
-                           row(21, 22, 23, 24L));
-                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND c < 25 AND cnt = 24"),
-                           row(21, 22, 23, 24L));
-
-                assertInvalidMessage(
-                "ORDER BY is only supported when the partition key is restricted by an EQ or an IN.",
-                "SELECT * FROM %s WHERE a = 21 AND b > 10 AND cnt > 23 ORDER BY c DESC ALLOW FILTERING");
-
-                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a = 21 AND b = 22 AND cnt > 23 ORDER BY c DESC"),
-                           row(21, 22, 26, 27L),
-                           row(21, 22, 23, 24L));
-
-                assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt > 20 AND cnt < 30"),
-                           row(41, 42, 43, 24L),
-                           row(21, 22, 23, 24L),
-                           row(21, 22, 26, 27L));
-            });
-        }
-    }
-
-    @Test
-    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndicesAndWithLists() throws Throwable
-    {
-        // ----------------------------------------------
-        // Test COMPACT table with clustering columns
-        // ----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c frozen<list<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, [6, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, [4, 1])");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, [7, 1])");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = [4, 1]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b >= 4 AND c = [4, 1] ALLOW FILTERING"),
-                       row(1, 4, list(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 0 AND c > [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > [4, 2] ALLOW FILTERING"),
-                       row(1, 3, list(6, 2)),
-                       row(2, 3, list(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 1 AND b <= 3 AND c < [6, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a <= 1 AND b <= 3 AND c < [6, 2] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a <= 1 AND c >= [4, 2] AND c <= [6, 4]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND b <= 3 AND c >= [4, 2] AND c <= [6, 4] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)),
-                       row(1, 3, list(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 1 AND c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)),
-                       row(1, 3, list(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE a > 1 AND c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(1, 3, list(6, 2)));
-        });
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a > 1 AND c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a > 1 AND c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS ? ALLOW FILTERING",
-                             unset());
-
-        // ----------------------------------------------
-        // Test COMPACT table without clustering columns
-        // ----------------------------------------------
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<list<int>>) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, [4, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, [6, 2])");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, [4, 1])");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, [7, 1])");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = [4, 2] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 1 AND c > [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 3 AND c > [4, 2] ALLOW FILTERING"),
-                       row(4, 1, list(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a < 1 AND b < 3 AND c <= [4, 2]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND b < 3 AND c <= [4, 2] ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 1 AND c >= [4, 3] AND c <= [7]");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c >= [4, 3] AND c <= [7] ALLOW FILTERING"),
-                       row(2, 1, list(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 3 AND c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, list(4, 2)),
-                       row(2, 1, list(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE a >=1 AND c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(2, 1, list(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a > 1 AND c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a > 1 AND c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a > 1 AND c CONTAINS ? ALLOW FILTERING",
-                             unset());
-    }
-
-
-    @Test
-    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndicesAndWithMaps() throws Throwable
-    {
-        //----------------------------------------------
-        // Test COMPACT table with clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c frozen<map<int, int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4 : 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7 : 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = {4 : 1}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a <= 1 AND b = 4 AND c = {4 : 1} ALLOW FILTERING"),
-                       row(1, 4, map(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 1 AND c > {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 1 AND c > {4 : 2} ALLOW FILTERING"),
-                       row(2, 3, map(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 1 AND b <= 3 AND c < {6 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b <= 3 AND c < {6 : 2} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 1 AND c >= {4 : 2} AND c <= {6 : 4}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c >= {4 : 2} AND c <= {6 : 4} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(1, 3, map(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a > 10 AND c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(1, 3, map(6, 2)));
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
-                       row(1, 3, map(6, 2)));
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
-                       row(1, 3, map(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY ? ALLOW FILTERING",
-                             unset());
-
-        //----------------------------------------------
-        // Test COMPACT table without clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<map<int, int>>) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4 : 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7 : 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4 : 2} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c > {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > {4 : 2} ALLOW FILTERING"),
-                       row(2, 1, map(6, 2)),
-                       row(4, 1, map(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b < 3 AND c <= {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b < 3 AND c <= {4 : 2} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(3, 2, map(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c >= {4 : 3} AND c <= {7 : 1}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c >= {5 : 2} AND c <= {7 : 0} ALLOW FILTERING"),
-                       row(2, 1, map(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(2, 1, map(6, 2)));
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND c CONTAINS KEY 4 ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(3, 2, map(4, 1)));
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
-                       row(2, 1, map(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY ? ALLOW FILTERING",
-                             unset());
-    }
-
-    @Test
-    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndicesAndWithSets() throws Throwable
-    {
-        //----------------------------------------------
-        // Test COMPACT table with clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c frozen<set<int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4, 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7, 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = {4, 1}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 4 AND c = {4, 1} ALLOW FILTERING"),
-                       row(1, 4, set(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c > {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > {4, 2} ALLOW FILTERING"),
-                       row(1, 3, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b <= 3 AND c < {6, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a > 0 AND b <= 3 AND c < {6, 2} ALLOW FILTERING"),
-                       row(1, 2, set(2, 4)),
-                       row(2, 3, set(1, 7)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c >= {4, 2} AND c <= {6, 4}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 0 AND c >= {4, 2} AND c <= {6, 4} ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(1, 3, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(1, 3, set(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(1, 3, set(6, 2)));
-        });
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
-                             unset());
-
-        //----------------------------------------------
-        // Test COMPACT table without clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<set<int>>) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6, 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4, 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7, 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b = 2 AND c = {4, 2} ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c > {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND c > {4, 2} ALLOW FILTERING"),
-                       row(2, 1, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND b < 3 AND c <= {4, 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a <= 4 AND b < 3 AND c <= {4, 2} ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(4, 1, set(1, 7)),
-                       row(3, 2, set(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c >= {4, 3} AND c <= {7}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND c >= {5, 2} AND c <= {7} ALLOW FILTERING"),
-                       row(2, 1, set(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 0 AND c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, set(4, 2)),
-                       row(2, 1, set(6, 2)));
-
-            assertInvalidMessage("Cannot use CONTAINS KEY on non-map column c",
-                                 "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS KEY 2 ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c CONTAINS 2 AND c CONTAINS 6 ALLOW FILTERING"),
-                       row(2, 1, set(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE a >= 1 AND c CONTAINS ? ALLOW FILTERING",
-                             unset());
-    }
-
-    @Test
-    public void testAllowFilteringOnPartitionKeyOnCompactTablesWithoutIndices() throws Throwable
-    {
-        // ----------------------------------------------
-        // Test COMPACT table with clustering columns
-        // ----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY ((a, b), c)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 2, 4, 5)");
-        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 3, 6, 7)");
-        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 4, 4, 5)");
-        execute("INSERT INTO %s (a, b, c, d) VALUES (2, 3, 7, 8)");
-
-        // Adds tomstones
-        execute("INSERT INTO %s (a, b, c, d) VALUES (1, 1, 4, 5)");
-        execute("INSERT INTO %s (a, b, c, d) VALUES (2, 2, 7, 8)");
-        execute("DELETE FROM %s WHERE a = 1 AND b = 1 AND c = 4");
-        execute("DELETE FROM %s WHERE a = 2 AND b = 2 AND c = 7");
-
-        beforeAndAfterFlush(() -> {
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4"),
-                       row(1, 4, 4, 5));
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4 AND d = 5");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4 ALLOW FILTERING"),
-                       row(1, 4, 4, 5));
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (d) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND b = 3 AND d IN (6, 7)");
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (d) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND b = 3 AND d IN (6, 7) ALLOW FILTERING");
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 2 AND c > 4 AND c <= 6 ALLOW FILTERING"),
-                       row(1, 3, 6, 7));
-
-            assertRows(execute("SELECT * FROM %s WHERE a <= 1 AND b >= 2 AND c >= 4 AND d <= 8 ALLOW FILTERING"),
-                       row(1, 3, 6, 7),
-                       row(1, 4, 4, 5),
-                       row(1, 2, 4, 5));
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND c >= 4 AND d <= 8 ALLOW FILTERING"),
-                       row(1, 3, 6, 7),
-                       row(1, 4, 4, 5),
-                       row(1, 2, 4, 5));
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND c >= 4 AND d <= 8 ALLOW FILTERING"),
-                       row(2, 3, 7, 8));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE d = null");
-        assertInvalidMessage("Unsupported null value for column a",
-                             "SELECT * FROM %s WHERE a = null ALLOW FILTERING");
-        assertInvalidMessage("Unsupported null value for column a",
-                             "SELECT * FROM %s WHERE a > null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column a",
-                             "SELECT * FROM %s WHERE a = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column a",
-                             "SELECT * FROM %s WHERE a > ? ALLOW FILTERING",
-                             unset());
-
-        //----------------------------------------------
-        // Test COMPACT table without clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int primary key, b int, c int) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, 6)");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, 7)");
-
-        // Adds tomstones
-        execute("INSERT INTO %s (a, b, c) VALUES (0, 1, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES (5, 2, 7)");
-        execute("DELETE FROM %s WHERE a = 0");
-        execute("DELETE FROM %s WHERE a = 5");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = 4 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE b >= 2 AND c <= 4 ALLOW FILTERING"),
-                       row(1, 2, 4),
-                       row(3, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE b >= 2 ALLOW FILTERING"),
-                       row(1, 2, 4),
-                       row(3, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 2 AND b <=1 ALLOW FILTERING"),
-                       row(2, 1, 6),
-                       row(4, 1, 7));
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND c >= 4 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (b) is not yet supported",
-                                 "SELECT * FROM %s WHERE a = 1 AND b IN (1, 2) AND c IN (6, 7)");
-
-            assertInvalidMessage("IN predicates on non-primary-key columns (c) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING");
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > 4");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > 4 ALLOW FILTERING"),
-                       row(2, 1, 6),
-                       row(4, 1, 7));
-
-            assertRows(execute("SELECT * FROM %s WHERE a >= 1 AND b >= 2 AND c <= 4 ALLOW FILTERING"),
-                       row(1, 2, 4),
-                       row(3, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND c <= 4 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE a < 3 AND b >= 2 AND c <= 4 ALLOW FILTERING"),
-                       row(1, 2, 4));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= 3 AND c <= 6");
-
-            assertRows(execute("SELECT * FROM %s WHERE c <=6 ALLOW FILTERING"),
-                       row(1, 2, 4),
-                       row(2, 1, 6),
-                       row(3, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(2)"),
-                       row(2, 1, 6),
-                       row(4, 1, 7),
-                       row(3, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(2) ALLOW FILTERING"),
-                       row(2, 1, 6),
-                       row(4, 1, 7),
-                       row(3, 2, 4));
-
-            assertRows(execute("SELECT * FROM %s WHERE token(a) >= token(2) AND b = 1 ALLOW FILTERING"),
-                       row(2, 1, 6),
-                       row(4, 1, 7));
-        });
-    }
-
-    @Test
-    public void testFilteringOnCompactTablesWithoutIndicesAndWithMaps() throws Throwable
-    {
-        //----------------------------------------------
-        // Test COMPACT table with clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int, b int, c frozen<map<int, int>>, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 3, {6 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 4, {4 : 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 3, {7 : 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4 : 1}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 4 AND c = {4 : 1} ALLOW FILTERING"),
-                       row(1, 4, map(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > {4 : 2} ALLOW FILTERING"),
-                       row(1, 3, map(6, 2)),
-                       row(2, 3, map(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b <= 3 AND c < {6 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE b <= 3 AND c < {6 : 2} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= {4 : 2} AND c <= {6 : 4}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= {4 : 2} AND c <= {6 : 4} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(1, 3, map(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(1, 3, map(6, 2)));
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS KEY 6 ALLOW FILTERING"),
-                       row(1, 3, map(6, 2)));
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
-                       row(1, 3, map(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS KEY null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS KEY ? ALLOW FILTERING",
-                             unset());
-
-        //----------------------------------------------
-        // Test COMPACT table without clustering columns
-        //----------------------------------------------
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c frozen<map<int, int>>) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 2, {4 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, {6 : 2})");
-        execute("INSERT INTO %s (a, b, c) VALUES (3, 2, {4 : 1})");
-        execute("INSERT INTO %s (a, b, c) VALUES (4, 1, {7 : 1})");
-
-        beforeAndAfterFlush(() -> {
-
-            // Checks filtering
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE a = 1 AND b = 2 AND c = {4 : 2} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c > {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c > {4 : 2} ALLOW FILTERING"),
-                       row(2, 1, map(6, 2)),
-                       row(4, 1, map(7, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE b < 3 AND c <= {4 : 2}");
-
-            assertRows(execute("SELECT * FROM %s WHERE b < 3 AND c <= {4 : 2} ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(3, 2, map(4, 1)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c >= {4 : 3} AND c <= {7 : 1}");
-
-            assertRows(execute("SELECT * FROM %s WHERE c >= {5 : 2} AND c <= {7 : 0} ALLOW FILTERING"),
-                       row(2, 1, map(6, 2)));
-
-            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                                 "SELECT * FROM %s WHERE c CONTAINS 2");
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(2, 1, map(6, 2)));
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS KEY 4 ALLOW FILTERING"),
-                       row(1, 2, map(4, 2)),
-                       row(3, 2, map(4, 1)));
-
-            assertRows(execute("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS KEY 6 ALLOW FILTERING"),
-                       row(2, 1, map(6, 2)));
-        });
-
-        // Checks filtering with null
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c = null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c = null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c > null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c > null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c CONTAINS null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS null ALLOW FILTERING");
-        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
-                             "SELECT * FROM %s WHERE c CONTAINS KEY null");
-        assertInvalidMessage("Unsupported null value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS KEY null ALLOW FILTERING");
-
-        // Checks filtering with unset
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c = ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c > ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS ? ALLOW FILTERING",
-                             unset());
-        assertInvalidMessage("Unsupported unset value for column c",
-                             "SELECT * FROM %s WHERE c CONTAINS KEY ? ALLOW FILTERING",
-                             unset());
-    }
-
-    @Test
-    public void filteringOnCompactTable() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, d int, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 11, 12, 13, 14);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 22, 23, 24);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 25, 26, 27);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 31, 32, 33, 34);
-
-        beforeAndAfterFlush(() -> {
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13"),
-                       row(21, 22, 23, 24),
-                       row(21, 25, 26, 27),
-                       row(31, 32, 33, 34));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13 AND c < 33"),
-                       row(21, 22, 23, 24),
-                       row(21, 25, 26, 27));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13 AND b < 32"),
-                       row(21, 22, 23, 24),
-                       row(21, 25, 26, 27));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a = 21 AND c > 13 AND b < 32 ORDER BY b DESC"),
-                       row(21, 25, 26, 27),
-                       row(21, 22, 23, 24));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a IN (21, 31) AND c > 13 ORDER BY b DESC"),
-                       row(31, 32, 33, 34),
-                       row(21, 25, 26, 27),
-                       row(21, 22, 23, 24));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13 AND d < 34"),
-                       row(21, 22, 23, 24),
-                       row(21, 25, 26, 27));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c > 13"),
-                       row(21, 22, 23, 24),
-                       row(21, 25, 26, 27),
-                       row(31, 32, 33, 34));
-        });
-
-        // with frozen in clustering key
-        createTable("CREATE TABLE %s (a int, b int, c frozen<list<int>>, d int, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 11, 12, list(1, 3), 14);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 22, list(2, 3), 24);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 25, list(2, 6), 27);
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 31, 32, list(3, 3), 34);
-
-        beforeAndAfterFlush(() -> {
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c CONTAINS 2"),
-                       row(21, 22, list(2, 3), 24),
-                       row(21, 25, list(2, 6), 27));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c CONTAINS 2 AND b < 25"),
-                       row(21, 22, list(2, 3), 24));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE c CONTAINS 2 AND c CONTAINS 3"),
-                       row(21, 22, list(2, 3), 24));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 12 AND c CONTAINS 2 AND d < 27"),
-                       row(21, 22, list(2, 3), 24));
-        });
-
-        // with frozen in value
-        createTable("CREATE TABLE %s (a int, b int, c int, d frozen<list<int>>, PRIMARY KEY (a, b, c)) WITH COMPACT STORAGE");
-
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 11, 12, 13, list(1, 4));
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 22, 23, list(2, 4));
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 21, 25, 25, list(2, 6));
-        execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?)", 31, 32, 34, list(3, 4));
-
-        beforeAndAfterFlush(() -> {
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE d CONTAINS 2"),
-                       row(21, 22, 23, list(2, 4)),
-                       row(21, 25, 25, list(2, 6)));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE d CONTAINS 2 AND b < 25"),
-                       row(21, 22, 23, list(2, 4)));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE d CONTAINS 2 AND d CONTAINS 4"),
-                       row(21, 22, 23, list(2, 4)));
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 12 AND c < 25 AND d CONTAINS 2"),
-                       row(21, 22, 23, list(2, 4)));
-        });
-    }
-
-    private UntypedResultSet executeFilteringOnly(String statement) throws Throwable
-    {
-        assertInvalid(statement);
-        return execute(statement + " ALLOW FILTERING");
-    }
-
-    @Test
-    public void testFilteringWithCounters() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, c int, cnt counter, PRIMARY KEY (a, b, c))" + compactOption);
-
-        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 14L, 11, 12, 13);
-        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 21, 22, 23);
-        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 27L, 21, 25, 26);
-        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 34L, 31, 32, 33);
-        execute("UPDATE %s SET cnt = cnt + ? WHERE a = ? AND b = ? AND c = ?", 24L, 41, 42, 43);
-
-        beforeAndAfterFlush(() -> {
-
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt = 24"),
-                       row(21, 22, 23, 24L),
-                       row(41, 42, 43, 24L));
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 22 AND cnt = 24"),
-                       row(41, 42, 43, 24L));
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND b < 25 AND cnt = 24"),
-                       row(21, 22, 23, 24L));
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE b > 10 AND c < 25 AND cnt = 24"),
-                       row(21, 22, 23, 24L));
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE a = 21 AND b > 10 AND cnt > 23 ORDER BY b DESC"),
-                       row(21, 25, 26, 27L),
-                       row(21, 22, 23, 24L));
-            assertRows(executeFilteringOnly("SELECT * FROM %s WHERE cnt > 20 AND cnt < 30"),
-                       row(21, 22, 23, 24L),
-                       row(21, 25, 26, 27L),
-                       row(41, 42, 43, 24L));
-        });
-    }
-
-    /**
-     * Check select with and without compact storage, with different column
-     * order. See CASSANDRA-10988
-     */
-    @Test
-    public void testClusteringOrderWithSlice() throws Throwable
-    {
-        final String compactOption = " WITH COMPACT STORAGE AND";
-
-        // non-compound, ASC order
-        createTable("CREATE TABLE %s (a text, b int, PRIMARY KEY (a, b)) " +
-                    compactOption +
-                    " CLUSTERING ORDER BY (b ASC)");
-
-        execute("INSERT INTO %s (a, b) VALUES ('a', 2)");
-        execute("INSERT INTO %s (a, b) VALUES ('a', 3)");
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
-                   row("a", 2),
-                   row("a", 3));
-
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b DESC"),
-                   row("a", 3),
-                   row("a", 2));
-
-        // non-compound, DESC order
-        createTable("CREATE TABLE %s (a text, b int, PRIMARY KEY (a, b))" +
-                    compactOption +
-                    " CLUSTERING ORDER BY (b DESC)");
-
-        execute("INSERT INTO %s (a, b) VALUES ('a', 2)");
-        execute("INSERT INTO %s (a, b) VALUES ('a', 3)");
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
-                   row("a", 3),
-                   row("a", 2));
-
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b ASC"),
-                   row("a", 2),
-                   row("a", 3));
-
-        // compound, first column DESC order
-        createTable("CREATE TABLE %s (a text, b int, c int, PRIMARY KEY (a, b, c)) " +
-                    compactOption +
-                    " CLUSTERING ORDER BY (b DESC)"
-        );
-
-        execute("INSERT INTO %s (a, b, c) VALUES ('a', 2, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES ('a', 3, 5)");
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
-                   row("a", 3, 5),
-                   row("a", 2, 4));
-
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b ASC"),
-                   row("a", 2, 4),
-                   row("a", 3, 5));
-
-        // compound, mixed order
-        createTable("CREATE TABLE %s (a text, b int, c int, PRIMARY KEY (a, b, c)) " +
-                    compactOption +
-                    " CLUSTERING ORDER BY (b ASC, c DESC)"
-        );
-
-        execute("INSERT INTO %s (a, b, c) VALUES ('a', 2, 4)");
-        execute("INSERT INTO %s (a, b, c) VALUES ('a', 3, 5)");
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0"),
-                   row("a", 2, 4),
-                   row("a", 3, 5));
-
-        assertRows(execute("SELECT * FROM %s WHERE a = 'a' AND b > 0 ORDER BY b ASC"),
-                   row("a", 2, 4),
-                   row("a", 3, 5));
-    }
-
-
-    @Test
-    public void testEmptyRestrictionValue() throws Throwable
-    {
-        for (String options : new String[]{ "", " WITH COMPACT STORAGE" })
-        {
-            createTable("CREATE TABLE %s (pk blob, c blob, v blob, PRIMARY KEY ((pk), c))" + options);
-            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                    bytes("foo123"), bytes("1"), bytes("1"));
-            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                    bytes("foo123"), bytes("2"), bytes("2"));
-
-            beforeAndAfterFlush(() -> {
-
-                assertInvalidMessage("Key may not be empty", "SELECT * FROM %s WHERE pk = textAsBlob('');");
-                assertInvalidMessage("Key may not be empty", "SELECT * FROM %s WHERE pk IN (textAsBlob(''), textAsBlob('1'));");
-
-                assertInvalidMessage("Key may not be empty",
-                                     "INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                                     EMPTY_BYTE_BUFFER, bytes("2"), bytes("2"));
-
-                // Test clustering columns restrictions
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c = textAsBlob('');"));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) = (textAsBlob(''));"));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c IN (textAsBlob(''), textAsBlob('1'));"),
-                           row(bytes("foo123"), bytes("1"), bytes("1")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) IN ((textAsBlob('')), (textAsBlob('1')));"),
-                           row(bytes("foo123"), bytes("1"), bytes("1")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('');"),
-                           row(bytes("foo123"), bytes("1"), bytes("1")),
-                           row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) > (textAsBlob(''));"),
-                           row(bytes("foo123"), bytes("1"), bytes("1")),
-                           row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('');"),
-                           row(bytes("foo123"), bytes("1"), bytes("1")),
-                           row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) >= (textAsBlob(''));"),
-                           row(bytes("foo123"), bytes("1"), bytes("1")),
-                           row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c <= textAsBlob('');"));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) <= (textAsBlob(''));"));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c < textAsBlob('');"));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) < (textAsBlob(''));"));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('') AND c < textAsBlob('');"));
-            });
-
-            if (options.contains("COMPACT"))
-            {
-                assertInvalidMessage("Invalid empty or null value for column c",
-                                     "INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                                     bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4"));
-            }
-            else
-            {
-                execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                        bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4"));
-
-                beforeAndAfterFlush(() -> {
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c = textAsBlob('');"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) = (textAsBlob(''));"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c IN (textAsBlob(''), textAsBlob('1'));"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
-                               row(bytes("foo123"), bytes("1"), bytes("1")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) IN ((textAsBlob('')), (textAsBlob('1')));"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
-                               row(bytes("foo123"), bytes("1"), bytes("1")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('');"),
-                               row(bytes("foo123"), bytes("1"), bytes("1")),
-                               row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) > (textAsBlob(''));"),
-                               row(bytes("foo123"), bytes("1"), bytes("1")),
-                               row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('');"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
-                               row(bytes("foo123"), bytes("1"), bytes("1")),
-                               row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) >= (textAsBlob(''));"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")),
-                               row(bytes("foo123"), bytes("1"), bytes("1")),
-                               row(bytes("foo123"), bytes("2"), bytes("2")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c <= textAsBlob('');"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
-
-                    assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) <= (textAsBlob(''));"),
-                               row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("4")));
-
-                    assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c < textAsBlob('');"));
-
-                    assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c) < (textAsBlob(''));"));
-
-                    assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('') AND c < textAsBlob('');"));
-                });
-            }
-
-            // Test restrictions on non-primary key value
-            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND v = textAsBlob('') ALLOW FILTERING;"));
-
-            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                    bytes("foo123"), bytes("3"), EMPTY_BYTE_BUFFER);
-
-            beforeAndAfterFlush(() -> {
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND v = textAsBlob('') ALLOW FILTERING;"),
-                           row(bytes("foo123"), bytes("3"), EMPTY_BYTE_BUFFER));
-            });
-        }
-    }
-
-    @Test
-    public void testEmptyRestrictionValueWithMultipleClusteringColumns() throws Throwable
-    {
-        createTable("CREATE TABLE %s (pk blob, c1 blob, c2 blob, v blob, PRIMARY KEY (pk, c1, c2))" + compactOption);
-        execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("1"), bytes("1"));
-        execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("2"), bytes("2"));
-
-        beforeAndAfterFlush(() -> {
-
-            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('');"));
-
-            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 = textAsBlob('');"));
-
-            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) = (textAsBlob('1'), textAsBlob(''));"));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 IN (textAsBlob(''), textAsBlob('1')) AND c2 = textAsBlob('1');"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 IN (textAsBlob(''), textAsBlob('1'));"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) IN ((textAsBlob(''), textAsBlob('1')), (textAsBlob('1'), textAsBlob('1')));"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 > textAsBlob('');"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 > textAsBlob('');"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'));"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 >= textAsBlob('');"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
-
-            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 <= textAsBlob('');"));
-
-            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) <= (textAsBlob('1'), textAsBlob(''));"));
-        });
-
-        execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)",
-                bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4"));
-
-        beforeAndAfterFlush(() -> {
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('');"),
-                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('') AND c2 = textAsBlob('1');"),
-                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) = (textAsBlob(''), textAsBlob('1'));"),
-                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 IN (textAsBlob(''), textAsBlob('1')) AND c2 = textAsBlob('1');"),
-                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) IN ((textAsBlob(''), textAsBlob('1')), (textAsBlob('1'), textAsBlob('1')));"),
-                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'));"),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) >= (textAsBlob(''), textAsBlob('1'));"),
-                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")),
-                       row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                       row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")));
-
-            assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) <= (textAsBlob(''), textAsBlob('1'));"),
-                       row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
-
-            assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) < (textAsBlob(''), textAsBlob('1'));"));
-        });
-    }
-
-    @Test
-    public void testEmptyRestrictionValueWithOrderBy() throws Throwable
-    {
-        for (String options : new String[]{ " WITH COMPACT STORAGE",
-                                            " WITH COMPACT STORAGE AND CLUSTERING ORDER BY (c DESC)" })
-        {
-            String orderingClause = options.contains("ORDER") ? "" : "ORDER BY c DESC";
-
-            createTable("CREATE TABLE %s (pk blob, c blob, v blob, PRIMARY KEY ((pk), c))" + options);
-            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                    bytes("foo123"),
-                    bytes("1"),
-                    bytes("1"));
-            execute("INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                    bytes("foo123"),
-                    bytes("2"),
-                    bytes("2"));
-
-            beforeAndAfterFlush(() -> {
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c > textAsBlob('')" + orderingClause),
-                           row(bytes("foo123"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c >= textAsBlob('')" + orderingClause),
-                           row(bytes("foo123"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1")));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c < textAsBlob('')" + orderingClause));
-
-                assertEmpty(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c <= textAsBlob('')" + orderingClause));
-            });
-
-            assertInvalidMessage("Invalid empty or null value for column c",
-                                 "INSERT INTO %s (pk, c, v) VALUES (?, ?, ?)",
-                                 bytes("foo123"),
-                                 EMPTY_BYTE_BUFFER,
-                                 bytes("4"));
-        }
-    }
-
-    @Test
-    public void testEmptyRestrictionValueWithMultipleClusteringColumnsAndOrderBy() throws Throwable
-    {
-        for (String options : new String[]{ " WITH COMPACT STORAGE",
-                                            " WITH COMPACT STORAGE AND CLUSTERING ORDER BY (c1 DESC, c2 DESC)" })
-        {
-            String orderingClause = options.contains("ORDER") ? "" : "ORDER BY c1 DESC, c2 DESC";
-
-            createTable("CREATE TABLE %s (pk blob, c1 blob, c2 blob, v blob, PRIMARY KEY (pk, c1, c2))" + options);
-            execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("1"), bytes("1"));
-            execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)", bytes("foo123"), bytes("1"), bytes("2"), bytes("2"));
-
-            beforeAndAfterFlush(() -> {
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 > textAsBlob('')" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 > textAsBlob('')" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'))" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 = textAsBlob('1') AND c2 >= textAsBlob('')" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-            });
-
-            execute("INSERT INTO %s (pk, c1, c2, v) VALUES (?, ?, ?, ?)",
-                    bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4"));
-
-            beforeAndAfterFlush(() -> {
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND c1 IN (textAsBlob(''), textAsBlob('1')) AND c2 = textAsBlob('1')" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                           row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) IN ((textAsBlob(''), textAsBlob('1')), (textAsBlob('1'), textAsBlob('1')))" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                           row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) > (textAsBlob(''), textAsBlob('1'))" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")));
-
-                assertRows(execute("SELECT * FROM %s WHERE pk = textAsBlob('foo123') AND (c1, c2) >= (textAsBlob(''), textAsBlob('1'))" + orderingClause),
-                           row(bytes("foo123"), bytes("1"), bytes("2"), bytes("2")),
-                           row(bytes("foo123"), bytes("1"), bytes("1"), bytes("1")),
-                           row(bytes("foo123"), EMPTY_BYTE_BUFFER, bytes("1"), bytes("4")));
-            });
-        }
-    }
-
-    /**
-     * UpdateTest
-     */
-    @Test
-    public void testUpdate() throws Throwable
-    {
-        testUpdate(false);
-        testUpdate(true);
-    }
-
-    private void testUpdate(boolean forceFlush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering_1 int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering_1))" + compactOption);
-
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 1, 1)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 2, 2)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (0, 3, 3)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, value) VALUES (1, 0, 4)");
-
-        flush(forceFlush);
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ?", 7, 0, 1);
-        flush(forceFlush);
-        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ?",
-                           0, 1),
-                   row(7));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1) = (?)", 8, 0, 2);
-        flush(forceFlush);
-        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ?",
-                           0, 2),
-                   row(8));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey IN (?, ?) AND clustering_1 = ?", 9, 0, 1, 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?) AND clustering_1 = ?",
-                           0, 1, 0),
-                   row(0, 0, 9),
-                   row(1, 0, 9));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey IN ? AND clustering_1 = ?", 19, Arrays.asList(0, 1), 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN ? AND clustering_1 = ?",
-                           Arrays.asList(0, 1), 0),
-                   row(0, 0, 19),
-                   row(1, 0, 19));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 IN (?, ?)", 10, 0, 1, 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 IN (?, ?)",
-                           0, 1, 0),
-                   row(0, 0, 10),
-                   row(0, 1, 10));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))", 20, 0, 0, 1);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))",
-                           0, 0, 1),
-                   row(0, 0, 20),
-                   row(0, 1, 20));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ?", null, 0, 0);
-        flush(forceFlush);
-
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1) IN ((?), (?))",
-                           0, 0, 1),
-                   row(0, 1, 20));
-
-        // test invalid queries
-
-        // missing primary key element
-        assertInvalidMessage("Some partition key parts are missing: partitionkey",
-                             "UPDATE %s SET value = ? WHERE clustering_1 = ? ", 7, 1);
-
-        assertInvalidMessage("Some clustering keys are missing: clustering_1",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ?", 7, 0);
-
-        assertInvalidMessage("Some clustering keys are missing: clustering_1",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ?", 7, 0);
-
-        // token function
-        assertInvalidMessage("The token function cannot be used in WHERE clauses for UPDATE statements",
-                             "UPDATE %s SET value = ? WHERE token(partitionKey) = token(?) AND clustering_1 = ?",
-                             7, 0, 1);
-
-        // multiple time the same value
-        assertInvalidSyntax("UPDATE %s SET value = ?, value = ? WHERE partitionKey = ? AND clustering_1 = ?", 7, 0, 1);
-
-        // multiple time same primary key element in WHERE clause
-        assertInvalidMessage("clustering_1 cannot be restricted by more than one relation if it includes an Equal",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_1 = ?", 7, 0, 1, 1);
-
-        // Undefined column names
-        assertInvalidMessage("Undefined column name value1",
-                             "UPDATE %s SET value1 = ? WHERE partitionKey = ? AND clustering_1 = ?", 7, 0, 1);
-
-        assertInvalidMessage("Undefined column name partitionkey1",
-                             "UPDATE %s SET value = ? WHERE partitionKey1 = ? AND clustering_1 = ?", 7, 0, 1);
-
-        assertInvalidMessage("Undefined column name clustering_3",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_3 = ?", 7, 0, 1);
-
-        // Invalid operator in the where clause
-        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
-                             "UPDATE %s SET value = ? WHERE partitionKey > ? AND clustering_1 = ?", 7, 0, 1);
-
-        assertInvalidMessage("Cannot use UPDATE with CONTAINS",
-                             "UPDATE %s SET value = ? WHERE partitionKey CONTAINS ? AND clustering_1 = ?", 7, 0, 1);
-
-        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND value = ?", 7, 0, 1, 3);
-
-        assertInvalidMessage("Slice restrictions are not supported on the clustering columns in UPDATE statements",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 > ?", 7, 0, 1);
-    }
-
-    @Test
-    public void testUpdateWithTwoClusteringColumns() throws Throwable
-    {
-        testUpdateWithTwoClusteringColumns(false);
-        testUpdateWithTwoClusteringColumns(true);
-    }
-
-    private void testUpdateWithTwoClusteringColumns(boolean forceFlush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey int," +
-                    "clustering_1 int," +
-                    "clustering_2 int," +
-                    "value int," +
-                    " PRIMARY KEY (partitionKey, clustering_1, clustering_2))" + compactOption);
-
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 1, 1)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 2, 2)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 0, 3, 3)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 1, 4)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (0, 1, 2, 5)");
-        execute("INSERT INTO %s (partitionKey, clustering_1, clustering_2, value) VALUES (1, 0, 0, 6)");
-        flush(forceFlush);
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
-        flush(forceFlush);
-        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
-                           0, 1, 1),
-                   row(7));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1, clustering_2) = (?, ?)", 8, 0, 1, 2);
-        flush(forceFlush);
-        assertRows(execute("SELECT value FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?",
-                           0, 1, 2),
-                   row(8));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?", 9, 0, 1, 0, 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?",
-                           0, 1, 0, 0),
-                   row(0, 0, 0, 9),
-                   row(1, 0, 0, 9));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey IN ? AND clustering_1 = ? AND clustering_2 = ?", 9, Arrays.asList(0, 1), 0, 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey IN ? AND clustering_1 = ? AND clustering_2 = ?",
-                           Arrays.asList(0, 1), 0, 0),
-                   row(0, 0, 0, 9),
-                   row(1, 0, 0, 9));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 IN (?, ?)", 12, 0, 1, 1, 2);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 IN (?, ?)",
-                           0, 1, 1, 2),
-                   row(0, 1, 1, 12),
-                   row(0, 1, 2, 12));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 IN (?, ?) AND clustering_2 IN (?, ?)", 10, 0, 1, 0, 1, 2);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND clustering_1 IN (?, ?) AND clustering_2 IN (?, ?)",
-                           0, 1, 0, 1, 2),
-                   row(0, 0, 1, 10),
-                   row(0, 0, 2, 10),
-                   row(0, 1, 1, 10),
-                   row(0, 1, 2, 10));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))", 20, 0, 0, 2, 1, 2);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))",
-                           0, 0, 2, 1, 2),
-                   row(0, 0, 2, 20),
-                   row(0, 1, 2, 20));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", null, 0, 0, 2);
-        flush(forceFlush);
-
-
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey = ? AND (clustering_1, clustering_2) IN ((?, ?), (?, ?))",
-                           0, 0, 2, 1, 2),
-                   row(0, 1, 2, 20));
-
-
-        // test invalid queries
-
-        // missing primary key element
-        assertInvalidMessage("Some partition key parts are missing: partitionkey",
-                             "UPDATE %s SET value = ? WHERE clustering_1 = ? AND clustering_2 = ?", 7, 1, 1);
-
-        String errorMsg = "PRIMARY KEY column \"clustering_2\" cannot be restricted as preceding column \"clustering_1\" is not restricted";
-
-        assertInvalidMessage(errorMsg,
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_2 = ?", 7, 0, 1);
-
-        assertInvalidMessage("Some clustering keys are missing: clustering_1, clustering_2",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ?", 7, 0);
-
-        // token function
-        assertInvalidMessage("The token function cannot be used in WHERE clauses for UPDATE statements",
-                             "UPDATE %s SET value = ? WHERE token(partitionKey) = token(?) AND clustering_1 = ? AND clustering_2 = ?",
-                             7, 0, 1, 1);
-
-        // multiple time the same value
-        assertInvalidSyntax("UPDATE %s SET value = ?, value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
-
-        // multiple time same primary key element in WHERE clause
-        assertInvalidMessage("clustering_1 cannot be restricted by more than one relation if it includes an Equal",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND clustering_1 = ?", 7, 0, 1, 1, 1);
-
-        // Undefined column names
-        assertInvalidMessage("Undefined column name value1",
-                             "UPDATE %s SET value1 = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
-
-        assertInvalidMessage("Undefined column name partitionkey1",
-                             "UPDATE %s SET value = ? WHERE partitionKey1 = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
-
-        assertInvalidMessage("Undefined column name clustering_3",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_3 = ?", 7, 0, 1, 1);
-
-        // Invalid operator in the where clause
-        assertInvalidMessage("Only EQ and IN relation are supported on the partition key (unless you use the token() function)",
-                             "UPDATE %s SET value = ? WHERE partitionKey > ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
-
-        assertInvalidMessage("Cannot use UPDATE with CONTAINS",
-                             "UPDATE %s SET value = ? WHERE partitionKey CONTAINS ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 1, 1);
-
-        assertInvalidMessage("Non PRIMARY KEY columns found in where clause: value",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 = ? AND clustering_2 = ? AND value = ?", 7, 0, 1, 1, 3);
-
-        assertInvalidMessage("Slice restrictions are not supported on the clustering columns in UPDATE statements",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND clustering_1 > ?", 7, 0, 1);
-
-        assertInvalidMessage("Slice restrictions are not supported on the clustering columns in UPDATE statements",
-                             "UPDATE %s SET value = ? WHERE partitionKey = ? AND (clustering_1, clustering_2) > (?, ?)", 7, 0, 1, 1);
-    }
-
-    @Test
-    public void testUpdateWithMultiplePartitionKeyComponents() throws Throwable
-    {
-        testUpdateWithMultiplePartitionKeyComponents(false);
-        testUpdateWithMultiplePartitionKeyComponents(true);
-    }
-
-    public void testUpdateWithMultiplePartitionKeyComponents(boolean forceFlush) throws Throwable
-    {
-        createTable("CREATE TABLE %s (partitionKey_1 int," +
-                    "partitionKey_2 int," +
-                    "clustering_1 int," +
-                    "clustering_2 int," +
-                    "value int," +
-                    " PRIMARY KEY ((partitionKey_1, partitionKey_2), clustering_1, clustering_2))" + compactOption);
-
-        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (0, 0, 0, 0, 0)");
-        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (0, 1, 0, 1, 1)");
-        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (0, 1, 1, 1, 2)");
-        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (1, 0, 0, 1, 3)");
-        execute("INSERT INTO %s (partitionKey_1, partitionKey_2, clustering_1, clustering_2, value) VALUES (1, 1, 0, 1, 3)");
-        flush(forceFlush);
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey_1 = ? AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 0, 0, 0, 0);
-        flush(forceFlush);
-        assertRows(execute("SELECT value FROM %s WHERE partitionKey_1 = ? AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?",
-                           0, 0, 0, 0),
-                   row(7));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey_1 IN (?, ?) AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?", 9, 0, 1, 1, 0, 1);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s WHERE partitionKey_1 IN (?, ?) AND partitionKey_2 = ? AND clustering_1 = ? AND clustering_2 = ?",
-                           0, 1, 1, 0, 1),
-                   row(0, 1, 0, 1, 9),
-                   row(1, 1, 0, 1, 9));
-
-        execute("UPDATE %s SET value = ? WHERE partitionKey_1 IN (?, ?) AND partitionKey_2 IN (?, ?) AND clustering_1 = ? AND clustering_2 = ?", 10, 0, 1, 0, 1, 0, 1);
-        flush(forceFlush);
-        assertRows(execute("SELECT * FROM %s"),
-                   row(0, 0, 0, 0, 7),
-                   row(0, 0, 0, 1, 10),
-                   row(0, 1, 0, 1, 10),
-                   row(0, 1, 1, 1, 2),
-                   row(1, 0, 0, 1, 10),
-                   row(1, 1, 0, 1, 10));
-
-        // missing primary key element
-        assertInvalidMessage("Some partition key parts are missing: partitionkey_2",
-                             "UPDATE %s SET value = ? WHERE partitionKey_1 = ? AND clustering_1 = ? AND clustering_2 = ?", 7, 1, 1);
-    }
-
-    @Test
-    public void testCfmCompactStorageCQL()
-    {
-        String keyspace = "cql_test_keyspace_compact";
-        String table = "test_table_compact";
-
-        TableMetadata.Builder metadata =
-        TableMetadata.builder(keyspace, table)
-                     .flags(EnumSet.of(TableMetadata.Flag.DENSE))
-                     .addPartitionKeyColumn("pk1", IntegerType.instance)
-                     .addPartitionKeyColumn("pk2", AsciiType.instance)
-                     .addClusteringColumn("ck1", ReversedType.getInstance(IntegerType.instance))
-                     .addClusteringColumn("ck2", IntegerType.instance)
-                     .addRegularColumn("reg", IntegerType.instance);
-
-        SchemaLoader.createKeyspace(keyspace, KeyspaceParams.simple(1), metadata);
-
-        ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
-
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
-        String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_compact.test_table_compact (\n" +
-                          "    pk1 varint,\n" +
-                          "    pk2 ascii,\n" +
-                          "    ck1 varint,\n" +
-                          "    ck2 varint,\n" +
-                          "    reg varint,\n" +
-                          "    PRIMARY KEY ((pk1, pk2), ck1, ck2)\n" +
-                          ") WITH COMPACT STORAGE\n" +
-                          "    AND ID = " + cfs.metadata.id + "\n" +
-                          "    AND CLUSTERING ORDER BY (ck1 DESC, ck2 ASC)";
-        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
-                   actual.contains(expected));
-    }
-
-    @Test
-    public void testCfmCounterCQL()
-    {
-        String keyspace = "cql_test_keyspace_counter";
-        String table = "test_table_counter";
-
-        TableMetadata.Builder metadata;
-        metadata = TableMetadata.builder(keyspace, table)
-                                .flags(EnumSet.of(TableMetadata.Flag.DENSE,
-                                       TableMetadata.Flag.COUNTER))
-                                .isCounter(true)
-                                .addPartitionKeyColumn("pk1", IntegerType.instance)
-                                .addPartitionKeyColumn("pk2", AsciiType.instance)
-                                .addClusteringColumn("ck1", ReversedType.getInstance(IntegerType.instance))
-                                .addClusteringColumn("ck2", IntegerType.instance)
-                                .addRegularColumn("cnt", CounterColumnType.instance);
-
-        SchemaLoader.createKeyspace(keyspace, KeyspaceParams.simple(1), metadata);
-
-        ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
-
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
-        String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_counter.test_table_counter (\n" +
-                          "    pk1 varint,\n" +
-                          "    pk2 ascii,\n" +
-                          "    ck1 varint,\n" +
-                          "    ck2 varint,\n" +
-                          "    cnt counter,\n" +
-                          "    PRIMARY KEY ((pk1, pk2), ck1, ck2)\n" +
-                          ") WITH COMPACT STORAGE\n" +
-                          "    AND ID = " + cfs.metadata.id + "\n" +
-                          "    AND CLUSTERING ORDER BY (ck1 DESC, ck2 ASC)";
-        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
-                   actual.contains(expected));
-    }
-
-    @Test
-    public void testDenseTable() throws Throwable
-    {
-        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
-                                       "pk1 varint PRIMARY KEY," +
-                                       "reg1 int)" +
-                                       " WITH COMPACT STORAGE");
-
-        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
-
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
-        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
-                        "    pk1 varint,\n" +
-                        "    reg1 int,\n" +
-                        "    PRIMARY KEY (pk1)\n" +
-                        ") WITH COMPACT STORAGE\n" +
-                        "    AND ID = " + cfs.metadata.id + "\n";
-
-        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
-                   actual.contains(expected));
-    }
-
-    @Test
-    public void testStaticCompactTable()
-    {
-        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
-                                       "pk1 varint PRIMARY KEY," +
-                                       "reg1 int," +
-                                       "reg2 int)" +
-                                       " WITH COMPACT STORAGE");
-
-        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
-        assertTrue(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true).contains(
-        "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
-        "    pk1 varint,\n" +
-        "    reg1 int,\n" +
-        "    reg2 int,\n" +
-        "    PRIMARY KEY (pk1)\n" +
-        ") WITH COMPACT STORAGE\n" +
-        "    AND ID = " + cfs.metadata.id));
-    }
-
-    @Test
-    public void testStaticCompactWithCounters()
-    {
-        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
-                                       "pk1 varint PRIMARY KEY," +
-                                       "reg1 counter," +
-                                       "reg2 counter)" +
-                                       " WITH COMPACT STORAGE");
-
-
-        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
-
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
-        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
-                          "    pk1 varint,\n" +
-                          "    reg1 counter,\n" +
-                          "    reg2 counter,\n" +
-                          "    PRIMARY KEY (pk1)\n" +
-                          ") WITH COMPACT STORAGE\n" +
-                          "    AND ID = " + cfs.metadata.id + "\n";
-        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
-                   actual.contains(expected));
-    }
-
-    @Test
-    public void testDenseCompactTableWithoutRegulars() throws Throwable
-    {
-        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
-                                       "pk1 varint," +
-                                       "ck1 int," +
-                                       "PRIMARY KEY (pk1, ck1))" +
-                                       " WITH COMPACT STORAGE");
-
-        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
-
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
-        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
-                          "    pk1 varint,\n" +
-                          "    ck1 int,\n" +
-                          "    PRIMARY KEY (pk1, ck1)\n" +
-                          ") WITH COMPACT STORAGE\n" +
-                          "    AND ID = " + cfs.metadata.id;
-        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
-                   actual.contains(expected));
-    }
-
-    @Test
-    public void testCompactDynamic() throws Throwable
-    {
-        String tableName = createTable("CREATE TABLE IF NOT EXISTS %s (" +
-                                       "pk1 varint," +
-                                       "ck1 int," +
-                                       "reg int," +
-                                       "PRIMARY KEY (pk1, ck1))" +
-                                       " WITH COMPACT STORAGE");
-
-        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
-
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
-        String expected = "CREATE TABLE IF NOT EXISTS " + keyspace() + "." + tableName + " (\n" +
-                          "    pk1 varint,\n" +
-                          "    ck1 int,\n" +
-                          "    reg int,\n" +
-                          "    PRIMARY KEY (pk1, ck1)\n" +
-                          ") WITH COMPACT STORAGE\n" +
-                          "    AND ID = " + cfs.metadata.id;
-
-        assertTrue(String.format("Expected\n%s\nto contain\n%s", actual, expected),
-                   actual.contains(expected));
-    }
-
-    /**
-     * PartitionUpdateTest
-     */
-
-    @Test
-    public void testOperationCountWithCompactTable()
-    {
-        createTable("CREATE TABLE %s (key text PRIMARY KEY, a int) WITH COMPACT STORAGE");
-        TableMetadata cfm = currentTableMetadata();
-
-        PartitionUpdate update = new RowUpdateBuilder(cfm, FBUtilities.timestampMicros(), "key0").add("a", 1)
-                                                                                                 .buildUpdate();
-        Assert.assertEquals(1, update.operationCount());
-
-        update = new RowUpdateBuilder(cfm, FBUtilities.timestampMicros(), "key0").buildUpdate();
-        Assert.assertEquals(0, update.operationCount());
-    }
-
-    /**
-     * AlterTest
-     */
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testAlterWithCompactStaticFormat() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
-
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "ALTER TABLE %s RENAME column1 TO column2");
-    }
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testAlterWithCompactNonStaticFormat() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "ALTER TABLE %s RENAME column1 TO column2");
-
-        createTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "ALTER TABLE %s RENAME column1 TO column2");
-    }
-
-    /**
-     * CreateTest
-     */
-
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testCreateIndextWithCompactStaticFormat() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "CREATE INDEX column1_index on %s (column1)");
-        assertInvalidMessage("Undefined column name value in table",
-                             "CREATE INDEX value_index on %s (value)");
-    }
-
-    /**
-     * DeleteTest
-     */
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testDeleteWithCompactStaticFormat() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
-        testDeleteWithCompactFormat();
-
-        // if column1 is present, hidden column is called column2
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
-        assertInvalidMessage("Undefined column name column2 in table",
-                             "DELETE FROM %s WHERE a = 1 AND column2= 1");
-        assertInvalidMessage("Undefined column name column2 in table",
-                             "DELETE FROM %s WHERE a = 1 AND column2 = 1 AND value1 = 1");
-        assertInvalidMessage("Undefined column name column2",
-                             "DELETE column2 FROM %s WHERE a = 1");
-
-        // if value is present, hidden column is called value1
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
-        assertInvalidMessage("Undefined column name value1 in table",
-                             "DELETE FROM %s WHERE a = 1 AND value1 = 1");
-        assertInvalidMessage("Undefined column name value1 in table",
-                             "DELETE FROM %s WHERE a = 1 AND value1 = 1 AND column1 = 1");
-        assertInvalidMessage("Undefined column name value1",
-                             "DELETE value1 FROM %s WHERE a = 1");
-    }
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testDeleteWithCompactNonStaticFormat() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b) VALUES (1, 1)");
-        execute("INSERT INTO %s (a, b) VALUES (2, 1)");
-        assertRows(execute("SELECT a, b FROM %s"),
-                   row(1, 1),
-                   row(2, 1));
-        testDeleteWithCompactFormat();
-
-        createTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, v) VALUES (1, 1, 3)");
-        execute("INSERT INTO %s (a, b, v) VALUES (2, 1, 4)");
-        assertRows(execute("SELECT a, b, v FROM %s"),
-                   row(1, 1, 3),
-                   row(2, 1, 4));
-        testDeleteWithCompactFormat();
-    }
-
-    private void testDeleteWithCompactFormat() throws Throwable
-    {
-        assertInvalidMessage("Undefined column name value in table",
-                             "DELETE FROM %s WHERE a = 1 AND value = 1");
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "DELETE FROM %s WHERE a = 1 AND column1= 1");
-        assertInvalidMessage("Undefined column name value in table",
-                             "DELETE FROM %s WHERE a = 1 AND value = 1 AND column1 = 1");
-        assertInvalidMessage("Undefined column name value",
-                             "DELETE value FROM %s WHERE a = 1");
-        assertInvalidMessage("Undefined column name column1",
-                             "DELETE column1 FROM %s WHERE a = 1");
-    }
-
-    /**
-     * InsertTest
-     */
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testInsertWithCompactStaticFormat() throws Throwable
-    {
-        testInsertWithCompactTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
-
-        // if column1 is present, hidden column is called column2
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, c, column1) VALUES (1, 1, 1, 1)");
-        assertInvalidMessage("Undefined column name column2",
-                             "INSERT INTO %s (a, b, c, column2) VALUES (1, 1, 1, 1)");
-
-        // if value is present, hidden column is called value1
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, c, value) VALUES (1, 1, 1, 1)");
-        assertInvalidMessage("Undefined column name value1",
-                             "INSERT INTO %s (a, b, c, value1) VALUES (1, 1, 1, 1)");
-    }
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testInsertWithCompactNonStaticFormat() throws Throwable
-    {
-        testInsertWithCompactTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        testInsertWithCompactTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-    }
-
-    private void testInsertWithCompactTable(String tableQuery) throws Throwable
-    {
-        createTable(tableQuery);
-
-        // pass correct types to the hidden columns
-        assertInvalidMessage("Undefined column name column1",
-                             "INSERT INTO %s (a, b, column1) VALUES (?, ?, ?)",
-                             1, 1, 1, ByteBufferUtil.bytes('a'));
-        assertInvalidMessage("Undefined column name value",
-                             "INSERT INTO %s (a, b, value) VALUES (?, ?, ?)",
-                             1, 1, 1, ByteBufferUtil.bytes('a'));
-        assertInvalidMessage("Undefined column name column1",
-                             "INSERT INTO %s (a, b, column1, value) VALUES (?, ?, ?, ?)",
-                             1, 1, 1, ByteBufferUtil.bytes('a'), ByteBufferUtil.bytes('b'));
-        assertInvalidMessage("Undefined column name value",
-                             "INSERT INTO %s (a, b, value, column1) VALUES (?, ?, ?, ?)",
-                             1, 1, 1, ByteBufferUtil.bytes('a'), ByteBufferUtil.bytes('b'));
-
-        // pass incorrect types to the hidden columns
-        assertInvalidMessage("Undefined column name value",
-                             "INSERT INTO %s (a, b, value) VALUES (?, ?, ?)",
-                             1, 1, 1, 1);
-        assertInvalidMessage("Undefined column name column1",
-                             "INSERT INTO %s (a, b, column1) VALUES (?, ?, ?)",
-                             1, 1, 1, 1);
-        assertEmpty(execute("SELECT * FROM %s"));
-
-        // pass null to the hidden columns
-        assertInvalidMessage("Undefined column name value",
-                             "INSERT INTO %s (a, b, value) VALUES (?, ?, ?)",
-                             1, 1, null);
-        assertInvalidMessage("Undefined column name column1",
-                             "INSERT INTO %s (a, b, column1) VALUES (?, ?, ?)",
-                             1, 1, null);
-    }
-
-    /**
-     * SelectTest
-     */
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testSelectWithCompactStaticFormat() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, c) VALUES (1, 1, 1)");
-        execute("INSERT INTO %s (a, b, c) VALUES (2, 1, 1)");
-        assertRows(execute("SELECT a, b, c FROM %s"),
-                   row(1, 1, 1),
-                   row(2, 1, 1));
-        testSelectWithCompactFormat();
-
-        // if column column1 is present, hidden column is called column2
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, c, column1) VALUES (1, 1, 1, 1)");
-        execute("INSERT INTO %s (a, b, c, column1) VALUES (2, 1, 1, 2)");
-        assertRows(execute("SELECT a, b, c, column1 FROM %s"),
-                   row(1, 1, 1, 1),
-                   row(2, 1, 1, 2));
-        assertInvalidMessage("Undefined column name column2 in table",
-                             "SELECT a, column2, value FROM %s");
-
-        // if column value is present, hidden column is called value1
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, c, value) VALUES (1, 1, 1, 1)");
-        execute("INSERT INTO %s (a, b, c, value) VALUES (2, 1, 1, 2)");
-        assertRows(execute("SELECT a, b, c, value FROM %s"),
-                   row(1, 1, 1, 1),
-                   row(2, 1, 1, 2));
-        assertInvalidMessage("Undefined column name value1 in table",
-                             "SELECT a, value1, value FROM %s");
-    }
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testSelectWithCompactNonStaticFormat() throws Throwable
-    {
-        createTable("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b) VALUES (1, 1)");
-        execute("INSERT INTO %s (a, b) VALUES (2, 1)");
-        assertRows(execute("SELECT a, b FROM %s"),
-                   row(1, 1),
-                   row(2, 1));
-        testSelectWithCompactFormat();
-
-        createTable("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, v) VALUES (1, 1, 3)");
-        execute("INSERT INTO %s (a, b, v) VALUES (2, 1, 4)");
-        assertRows(execute("SELECT a, b, v FROM %s"),
-                   row(1, 1, 3),
-                   row(2, 1, 4));
-        testSelectWithCompactFormat();
-    }
-
-    private void testSelectWithCompactFormat() throws Throwable
-    {
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "SELECT column1 FROM %s");
-        assertInvalidMessage("Undefined column name value in table",
-                             "SELECT value FROM %s");
-        assertInvalidMessage("Undefined column name value in table",
-                             "SELECT value, column1 FROM %s");
-        assertInvalid("Undefined column name column1 in table ('column1 = NULL')",
-                      "SELECT * FROM %s WHERE column1 = null ALLOW FILTERING");
-        assertInvalid("Undefined column name value in table ('value = NULL')",
-                      "SELECT * FROM %s WHERE value = null ALLOW FILTERING");
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "SELECT WRITETIME(column1) FROM %s");
-        assertInvalidMessage("Undefined column name value in table",
-                             "SELECT WRITETIME(value) FROM %s");
-    }
-
-    /**
-     * UpdateTest
-     */
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testUpdateWithCompactStaticFormat() throws Throwable
-    {
-        testUpdateWithCompactFormat("CREATE TABLE %s (a int PRIMARY KEY, b int, c int) WITH COMPACT STORAGE");
-
-        assertInvalidMessage("Undefined column name column1 in table",
-                             "UPDATE %s SET b = 1 WHERE column1 = ?",
-                             ByteBufferUtil.bytes('a'));
-        assertInvalidMessage("Undefined column name value in table",
-                             "UPDATE %s SET b = 1 WHERE value = ?",
-                             ByteBufferUtil.bytes('a'));
-
-        // if column1 is present, hidden column is called column2
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, column1 int) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, c, column1) VALUES (1, 1, 1, 1)");
-        execute("UPDATE %s SET column1 = 6 WHERE a = 1");
-        assertInvalidMessage("Undefined column name column2", "UPDATE %s SET column2 = 6 WHERE a = 0");
-        assertInvalidMessage("Undefined column name value", "UPDATE %s SET value = 6 WHERE a = 0");
-
-        // if value is present, hidden column is called value1
-        createTable("CREATE TABLE %s (a int PRIMARY KEY, b int, c int, value int) WITH COMPACT STORAGE");
-        execute("INSERT INTO %s (a, b, c, value) VALUES (1, 1, 1, 1)");
-        execute("UPDATE %s SET value = 6 WHERE a = 1");
-        assertInvalidMessage("Undefined column name column1", "UPDATE %s SET column1 = 6 WHERE a = 1");
-        assertInvalidMessage("Undefined column name value1", "UPDATE %s SET value1 = 6 WHERE a = 1");
-    }
-
-    /**
-     * Test for CASSANDRA-13917
-     */
-    @Test
-    public void testUpdateWithCompactNonStaticFormat() throws Throwable
-    {
-        testUpdateWithCompactFormat("CREATE TABLE %s (a int, b int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-        testUpdateWithCompactFormat("CREATE TABLE %s (a int, b int, v int, PRIMARY KEY (a, b)) WITH COMPACT STORAGE");
-    }
-
-    private void testUpdateWithCompactFormat(String tableQuery) throws Throwable
-    {
-        createTable(tableQuery);
-        // pass correct types to hidden columns
-        assertInvalidMessage("Undefined column name column1",
-                             "UPDATE %s SET column1 = ? WHERE a = 0",
-                             ByteBufferUtil.bytes('a'));
-        assertInvalidMessage("Undefined column name value",
-                             "UPDATE %s SET value = ? WHERE a = 0",
-                             ByteBufferUtil.bytes('a'));
-
-        // pass incorrect types to hidden columns
-        assertInvalidMessage("Undefined column name column1", "UPDATE %s SET column1 = 6 WHERE a = 0");
-        assertInvalidMessage("Undefined column name value", "UPDATE %s SET value = 6 WHERE a = 0");
-    }
-}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java
index 589490f..2281e46 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/CompactTableTest.java
@@ -27,6 +27,7 @@
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaChangeListener;
+import org.apache.cassandra.schema.TableMetadata;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -71,7 +72,8 @@
         // Verify that schema change listeners are told statements are affected with DROP COMPACT STORAGE.
         SchemaChangeListener listener = new SchemaChangeListener()
         {
-            public void onAlterTable(String keyspace, String table, boolean affectsStatements)
+            @Override
+            public void onAlterTable(TableMetadata before, TableMetadata after, boolean affectsStatements)
             {
                 assertTrue(affectsStatements);
             }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
index 9b7cfc0..68751cd 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/CreateTest.java
@@ -21,14 +21,19 @@
 import java.nio.ByteBuffer;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Map;
 import java.util.UUID;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.Duration;
 import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.memtable.SkipListMemtable;
+import org.apache.cassandra.db.memtable.TestMemtable;
 import org.apache.cassandra.db.partitions.Partition;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.InvalidRequestException;
@@ -38,6 +43,7 @@
 import org.apache.cassandra.locator.IEndpointSnitch;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.schema.MemtableParams;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.SchemaKeyspaceTables;
@@ -53,6 +59,7 @@
 import static org.apache.cassandra.cql3.Duration.NANOS_PER_MINUTE;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -405,13 +412,27 @@
     }
 
     /**
-     * Test {@link ConfigurationException} is thrown on create keyspace without any options.
+     * Test {@link ConfigurationException} is not thrown on create NetworkTopologyStrategy keyspace without any options.
      */
     @Test
-    public void testConfigurationExceptionThrownWhenCreateKeyspaceWithNoOptions() throws Throwable
+    public void testCreateKeyspaceWithNetworkTopologyStrategyNoOptions() throws Throwable
     {
-        assertInvalidThrow(ConfigurationException.class, "CREATE KEYSPACE testXYZ with replication = { 'class': 'NetworkTopologyStrategy' }");
-        assertInvalidThrow(ConfigurationException.class, "CREATE KEYSPACE testXYZ WITH replication = { 'class' : 'SimpleStrategy' }");
+        schemaChange("CREATE KEYSPACE testXYZ with replication = { 'class': 'NetworkTopologyStrategy' }");
+
+        // clean-up
+        execute("DROP KEYSPACE IF EXISTS testXYZ");
+    }
+
+    /**
+     * Test {@link ConfigurationException} is not thrown on create SimpleStrategy keyspace without any options.
+     */
+    @Test
+    public void testCreateKeyspaceWithSimpleStrategyNoOptions() throws Throwable
+    {
+        schemaChange("CREATE KEYSPACE testXYZ WITH replication = { 'class' : 'SimpleStrategy' }");
+
+        // clean-up
+        execute("DROP KEYSPACE IF EXISTS testXYZ");
     }
 
     @Test
@@ -572,97 +593,125 @@
             assertInvalidSyntaxMessage("no viable alternative at input 'WITH'", stmt);
     }
 
+    public static class InvalidMemtableFactoryMethod
+    {
+        @SuppressWarnings("unused")
+        public static String factory(Map<String, String> options)
+        {
+            return "invalid";
+        }
+    }
+
+    public static class InvalidMemtableFactoryField
+    {
+        @SuppressWarnings("unused")
+        public static String FACTORY = "invalid";
+    }
+
+    @Test
+    public void testCreateTableWithMemtable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))");
+        assertSame(MemtableParams.DEFAULT.factory(), getCurrentColumnFamilyStore().metadata().params.memtable.factory());
+
+        assertSchemaOption("memtable", null);
+
+        testMemtableConfig("skiplist", SkipListMemtable.FACTORY, SkipListMemtable.class);
+        testMemtableConfig("skiplist_remapped", SkipListMemtable.FACTORY, SkipListMemtable.class);
+        testMemtableConfig("test_fullname", TestMemtable.FACTORY, SkipListMemtable.class);
+        testMemtableConfig("test_shortname", SkipListMemtable.FACTORY, SkipListMemtable.class);
+        testMemtableConfig("default", MemtableParams.DEFAULT.factory(), SkipListMemtable.class);
+
+        assertThrowsConfigurationException("The 'class_name' option must be specified.",
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'test_empty_class';");
+
+        assertThrowsConfigurationException("The 'class_name' option must be specified.",
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'test_missing_class';");
+
+        assertThrowsConfigurationException("Memtable class org.apache.cassandra.db.memtable.SkipListMemtable does not accept any futher parameters, but {invalid=throw} were given.",
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'test_invalid_param';");
+
+        assertThrowsConfigurationException("Could not create memtable factory for class NotExisting",
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'test_unknown_class';");
+
+        assertThrowsConfigurationException("Memtable class org.apache.cassandra.db.memtable.TestMemtable does not accept any futher parameters, but {invalid=throw} were given.",
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'test_invalid_extra_param';");
+
+        assertThrowsConfigurationException("Could not create memtable factory for class " + InvalidMemtableFactoryMethod.class.getName(),
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'test_invalid_factory_method';");
+
+        assertThrowsConfigurationException("Could not create memtable factory for class " + InvalidMemtableFactoryField.class.getName(),
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'test_invalid_factory_field';");
+
+        assertThrowsConfigurationException("Memtable configuration \"unknown\" not found.",
+                                           "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                                           + " WITH memtable = 'unknown';");
+    }
+
+    private void testMemtableConfig(String memtableConfig, Memtable.Factory factoryInstance, Class<? extends Memtable> memtableClass) throws Throwable
+    {
+        createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
+                    + " WITH memtable = '" + memtableConfig + "';");
+        assertSame(factoryInstance, getCurrentColumnFamilyStore().metadata().params.memtable.factory());
+        Assert.assertTrue(memtableClass.isInstance(getCurrentColumnFamilyStore().getTracker().getView().getCurrentMemtable()));
+
+        assertSchemaOption("memtable", MemtableParams.DEFAULT.configurationKey().equals(memtableConfig) ? null : memtableConfig);
+    }
+
+    void assertSchemaOption(String option, Object expected) throws Throwable
+    {
+        assertRows(execute(format("SELECT " + option + " FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
+                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
+                                  SchemaKeyspaceTables.TABLES),
+                           KEYSPACE,
+                           currentTable()),
+                   row(expected));
+    }
+
     @Test
     public void testCreateTableWithCompression() throws Throwable
     {
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.LZ4Compressor"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                 + " WITH compression = { 'class' : 'SnappyCompressor', 'chunk_length_in_kb' : 32 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                 + " WITH compression = { 'class' : 'SnappyCompressor', 'chunk_length_in_kb' : 32, 'enabled' : true };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                 + " WITH compression = { 'sstable_compression' : 'SnappyCompressor', 'chunk_length_kb' : 32 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "32", "class", "org.apache.cassandra.io.compress.SnappyCompressor"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                 + " WITH compression = { 'sstable_compression' : 'SnappyCompressor', 'min_compress_ratio' : 2 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.SnappyCompressor", "min_compress_ratio", "2.0")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.SnappyCompressor", "min_compress_ratio", "2.0"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                     + " WITH compression = { 'sstable_compression' : 'SnappyCompressor', 'min_compress_ratio' : 1 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.SnappyCompressor", "min_compress_ratio", "1.0")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.SnappyCompressor", "min_compress_ratio", "1.0"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                     + " WITH compression = { 'sstable_compression' : 'SnappyCompressor', 'min_compress_ratio' : 0 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.SnappyCompressor")));
+        assertSchemaOption("compression", map("chunk_length_in_kb", "16", "class", "org.apache.cassandra.io.compress.SnappyCompressor"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                 + " WITH compression = { 'sstable_compression' : '', 'chunk_length_kb' : 32 };");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("enabled", "false")));
+        assertSchemaOption("compression", map("enabled", "false"));
 
         createTable("CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
                 + " WITH compression = { 'enabled' : 'false'};");
-
-        assertRows(execute(format("SELECT compression FROM %s.%s WHERE keyspace_name = ? and table_name = ?;",
-                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
-                                  SchemaKeyspaceTables.TABLES),
-                           KEYSPACE,
-                           currentTable()),
-                   row(map("enabled", "false")));
+        assertSchemaOption("compression", map("enabled", "false"));
 
         assertThrowsConfigurationException("Missing sub-option 'class' for the 'compression' option.",
                                            "CREATE TABLE %s (a text, b int, c int, primary key (a, b))"
@@ -740,4 +789,5 @@
             return Collections.emptyList();
         }
     }
+
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/DeleteTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/DeleteTest.java
index eda49a6..980b791 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/DeleteTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/DeleteTest.java
@@ -28,7 +28,6 @@
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.utils.btree.BTree;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/DropRecreateAndRestoreTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/DropRecreateAndRestoreTest.java
index 19aba64..d385639 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/DropRecreateAndRestoreTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/DropRecreateAndRestoreTest.java
@@ -17,9 +17,9 @@
  */
 package org.apache.cassandra.cql3.validation.operations;
 
-import java.io.File;
 import java.util.List;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionCollectionsTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionCollectionsTest.java
index 7ad41e3..c0a5139 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionCollectionsTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionCollectionsTest.java
@@ -154,8 +154,8 @@
             checkInvalidUDT("v >= null", v, InvalidRequestException.class);
             checkInvalidUDT("v IN null", v, SyntaxException.class);
             checkInvalidUDT("v IN 367", v, SyntaxException.class);
-            checkInvalidUDT("v CONTAINS KEY 123", v, SyntaxException.class);
-            checkInvalidUDT("v CONTAINS 'bar'", v, SyntaxException.class);
+            checkInvalidUDT("v CONTAINS KEY 123", v, InvalidRequestException.class);
+            checkInvalidUDT("v CONTAINS 'bar'", v, InvalidRequestException.class);
 
             /////////////////// null suffix on stored udt ////////////////////
             v = userType("a", 0, "b", null);
@@ -433,21 +433,35 @@
 
     void checkAppliesUDT(String condition, Object value) throws Throwable
     {
+        // UPDATE statement
         assertRows(execute("UPDATE %s SET v = ? WHERE k = 0 IF " + condition, value), row(true));
         assertRows(execute("SELECT * FROM %s"), row(0, value));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k = 0 IF " + condition), row(true));
+        assertEmpty(execute("SELECT * FROM %s"));
+        execute("INSERT INTO %s (k, v) VALUES (0, ?)", value);
     }
 
     void checkDoesNotApplyUDT(String condition, Object value) throws Throwable
     {
+        // UPDATE statement
         assertRows(execute("UPDATE %s SET v = ? WHERE k = 0 IF " + condition, value),
                    row(false, value));
         assertRows(execute("SELECT * FROM %s"), row(0, value));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k = 0 IF " + condition),
+                   row(false, value));
+        assertRows(execute("SELECT * FROM %s"), row(0, value));
     }
 
     void checkInvalidUDT(String condition, Object value, Class<? extends Throwable> expected) throws Throwable
     {
+        // UPDATE statement
         assertInvalidThrow(expected, "UPDATE %s SET v = ?  WHERE k = 0 IF " + condition, value);
         assertRows(execute("SELECT * FROM %s"), row(0, value));
+        // DELETE statement
+        assertInvalidThrow(expected, "DELETE FROM %s WHERE k = 0 IF " + condition);
+        assertRows(execute("SELECT * FROM %s"), row(0, value));
     }
 
     /**
@@ -472,10 +486,12 @@
             check_applies_list("l < ['z']");
             check_applies_list("l <= ['z']");
             check_applies_list("l IN (null, ['foo', 'bar', 'foobar'], ['a'])");
+            check_applies_list("l CONTAINS 'bar'");
 
             // multiple conditions
             check_applies_list("l > ['aaa', 'bbb'] AND l > ['aaa']");
             check_applies_list("l != null AND l IN (['foo', 'bar', 'foobar'])");
+            check_applies_list("l CONTAINS 'foo' AND l CONTAINS 'foobar'");
 
             // should not apply
             check_does_not_apply_list("l = ['baz']");
@@ -486,10 +502,12 @@
             check_does_not_apply_list("l <= ['a']");
             check_does_not_apply_list("l IN (['a'], null)");
             check_does_not_apply_list("l IN ()");
+            check_does_not_apply_list("l CONTAINS 'baz'");
 
             // multiple conditions
             check_does_not_apply_list("l IN () AND l IN (['foo', 'bar', 'foobar'])");
             check_does_not_apply_list("l > ['zzz'] AND l < ['zzz']");
+            check_does_not_apply_list("l CONTAINS 'bar' AND l CONTAINS 'baz'");
 
             check_invalid_list("l = [null]", InvalidRequestException.class);
             check_invalid_list("l < null", InvalidRequestException.class);
@@ -498,30 +516,42 @@
             check_invalid_list("l >= null", InvalidRequestException.class);
             check_invalid_list("l IN null", SyntaxException.class);
             check_invalid_list("l IN 367", SyntaxException.class);
-            check_invalid_list("l CONTAINS KEY 123", SyntaxException.class);
-
-            // not supported yet
-            check_invalid_list("m CONTAINS 'bar'", SyntaxException.class);
+            check_invalid_list("l CONTAINS KEY 123", InvalidRequestException.class);
+            check_invalid_list("l CONTAINS null", InvalidRequestException.class);
         }
     }
 
     void check_applies_list(String condition) throws Throwable
     {
+        // UPDATE statement
         assertRows(execute("UPDATE %s SET l = ['foo', 'bar', 'foobar'] WHERE k=0 IF " + condition), row(true));
         assertRows(execute("SELECT * FROM %s"), row(0, list("foo", "bar", "foobar")));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k=0 IF " + condition), row(true));
+        assertEmpty(execute("SELECT * FROM %s"));
+        execute("INSERT INTO %s(k, l) VALUES (0, ['foo', 'bar', 'foobar'])");
     }
 
     void check_does_not_apply_list(String condition) throws Throwable
     {
+        // UPDATE statement
         assertRows(execute("UPDATE %s SET l = ['foo', 'bar', 'foobar'] WHERE k=0 IF " + condition),
                    row(false, list("foo", "bar", "foobar")));
         assertRows(execute("SELECT * FROM %s"), row(0, list("foo", "bar", "foobar")));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k=0 IF " + condition),
+                   row(false, list("foo", "bar", "foobar")));
+        assertRows(execute("SELECT * FROM %s"), row(0, list("foo", "bar", "foobar")));
     }
 
     void check_invalid_list(String condition, Class<? extends Throwable> expected) throws Throwable
     {
+        // UPDATE statement
         assertInvalidThrow(expected, "UPDATE %s SET l = ['foo', 'bar', 'foobar'] WHERE k=0 IF " + condition);
         assertRows(execute("SELECT * FROM %s"), row(0, list("foo", "bar", "foobar")));
+        // DELETE statement
+        assertInvalidThrow(expected, "DELETE FROM %s WHERE k=0 IF " + condition);
+        assertRows(execute("SELECT * FROM %s"), row(0, list("foo", "bar", "foobar")));
     }
 
     /**
@@ -543,7 +573,8 @@
                                  "DELETE FROM %s WHERE k=0 IF l[?] = ?", null, "foobar");
             assertInvalidMessage("Invalid negative list index -2",
                                  "DELETE FROM %s WHERE k=0 IF l[?] = ?", -2, "foobar");
-
+            assertInvalidSyntax("DELETE FROM %s WHERE k=0 IF l[?] CONTAINS ?", 0, "bar");
+            assertInvalidSyntax("DELETE FROM %s WHERE k=0 IF l[?] CONTAINS KEY ?", 0, "bar");
             assertRows(execute("DELETE FROM %s WHERE k=0 IF l[?] = ?", 1, null), row(false, list("foo", "bar", "foobar")));
             assertRows(execute("DELETE FROM %s WHERE k=0 IF l[?] = ?", 1, "foobar"), row(false, list("foo", "bar", "foobar")));
             assertRows(execute("SELECT * FROM %s"), row(0, list("foo", "bar", "foobar")));
@@ -631,10 +662,12 @@
             check_applies_set("s < {'z'}");
             check_applies_set("s <= {'z'}");
             check_applies_set("s IN (null, {'bar', 'foo'}, {'a'})");
+            check_applies_set("s CONTAINS 'foo'");
 
             // multiple conditions
             check_applies_set("s > {'a'} AND s < {'z'}");
             check_applies_set("s IN (null, {'bar', 'foo'}, {'a'}) AND s IN ({'a'}, {'bar', 'foo'}, null)");
+            check_applies_set("s CONTAINS 'foo' AND s CONTAINS 'bar'");
 
             // should not apply
             check_does_not_apply_set("s = {'baz'}");
@@ -646,6 +679,7 @@
             check_does_not_apply_set("s IN ({'a'}, null)");
             check_does_not_apply_set("s IN ()");
             check_does_not_apply_set("s != null AND s IN ()");
+            check_does_not_apply_set("s CONTAINS 'baz'");
 
             check_invalid_set("s = {null}", InvalidRequestException.class);
             check_invalid_set("s < null", InvalidRequestException.class);
@@ -654,32 +688,43 @@
             check_invalid_set("s >= null", InvalidRequestException.class);
             check_invalid_set("s IN null", SyntaxException.class);
             check_invalid_set("s IN 367", SyntaxException.class);
-            check_invalid_set("s CONTAINS KEY 123", SyntaxException.class);
+            check_invalid_set("s CONTAINS null", InvalidRequestException.class);
+            check_invalid_set("s CONTAINS KEY 123", InvalidRequestException.class);
 
             // element access is not allow for sets
             check_invalid_set("s['foo'] = 'foobar'", InvalidRequestException.class);
-
-            // not supported yet
-            check_invalid_set("m CONTAINS 'bar'", SyntaxException.class);
         }
     }
 
     void check_applies_set(String condition) throws Throwable
     {
+        // UPDATE statement
         assertRows(execute("UPDATE %s SET s = {'bar', 'foo'} WHERE k=0 IF " + condition), row(true));
         assertRows(execute("SELECT * FROM %s"), row(0, set("bar", "foo")));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k=0 IF " + condition), row(true));
+        assertEmpty(execute("SELECT * FROM %s"));
+        execute("INSERT INTO %s (k, s) VALUES (0, {'bar', 'foo'})");
     }
 
     void check_does_not_apply_set(String condition) throws Throwable
     {
+        // UPDATE statement
         assertRows(execute("UPDATE %s SET s = {'bar', 'foo'} WHERE k=0 IF " + condition), row(false, set("bar", "foo")));
         assertRows(execute("SELECT * FROM %s"), row(0, set("bar", "foo")));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k=0 IF " + condition), row(false, set("bar", "foo")));
+        assertRows(execute("SELECT * FROM %s"), row(0, set("bar", "foo")));
     }
 
     void check_invalid_set(String condition, Class<? extends Throwable> expected) throws Throwable
     {
+        // UPDATE statement
         assertInvalidThrow(expected, "UPDATE %s SET s = {'bar', 'foo'} WHERE k=0 IF " + condition);
         assertRows(execute("SELECT * FROM %s"), row(0, set("bar", "foo")));
+        // DELETE statement
+        assertInvalidThrow(expected, "DELETE FROM %s WHERE k=0 IF " + condition);
+        assertRows(execute("SELECT * FROM %s"), row(0, set("bar", "foo")));
     }
 
     /**
@@ -704,10 +749,13 @@
             check_applies_map("m <= {'z': 'z'}");
             check_applies_map("m != {'a': 'a'}");
             check_applies_map("m IN (null, {'a': 'a'}, {'foo': 'bar'})");
+            check_applies_map("m CONTAINS 'bar'");
+            check_applies_map("m CONTAINS KEY 'foo'");
 
             // multiple conditions
             check_applies_map("m > {'a': 'a'} AND m < {'z': 'z'}");
             check_applies_map("m != null AND m IN (null, {'a': 'a'}, {'foo': 'bar'})");
+            check_applies_map("m CONTAINS 'bar' AND m CONTAINS KEY 'foo'");
 
             // should not apply
             check_does_not_apply_map("m = {'a': 'a'}");
@@ -719,18 +767,16 @@
             check_does_not_apply_map("m IN ({'a': 'a'}, null)");
             check_does_not_apply_map("m IN ()");
             check_does_not_apply_map("m = null AND m != null");
+            check_does_not_apply_map("m CONTAINS 'foo'");
+            check_does_not_apply_map("m CONTAINS KEY 'bar'");
 
             check_invalid_map("m = {null: null}", InvalidRequestException.class);
             check_invalid_map("m = {'a': null}", InvalidRequestException.class);
             check_invalid_map("m = {null: 'a'}", InvalidRequestException.class);
+            check_invalid_map("m CONTAINS null", InvalidRequestException.class);
+            check_invalid_map("m CONTAINS KEY null", InvalidRequestException.class);
             check_invalid_map("m < null", InvalidRequestException.class);
             check_invalid_map("m IN null", SyntaxException.class);
-
-            // not supported yet
-            check_invalid_map("m CONTAINS 'bar'", SyntaxException.class);
-            check_invalid_map("m CONTAINS KEY 'foo'", SyntaxException.class);
-            check_invalid_map("m CONTAINS null", SyntaxException.class);
-            check_invalid_map("m CONTAINS KEY null", SyntaxException.class);
         }
     }
 
@@ -750,6 +796,8 @@
             execute("INSERT INTO %s (k, m) VALUES (0, {'foo' : 'bar'})");
             assertInvalidMessage("Invalid null value for map element access",
                                  "DELETE FROM %s WHERE k=0 IF m[?] = ?", null, "foo");
+            assertInvalidSyntax("DELETE FROM %s WHERE k=0 IF m[?] CONTAINS ?", "foo", "bar");
+            assertInvalidSyntax("DELETE FROM %s WHERE k=0 IF m[?] CONTAINS KEY ?", "foo", "bar");
             assertRows(execute("DELETE FROM %s WHERE k=0 IF m[?] = ?", "foo", "foo"), row(false, map("foo", "bar")));
             assertRows(execute("DELETE FROM %s WHERE k=0 IF m[?] = ?", "foo", null), row(false, map("foo", "bar")));
             assertRows(execute("SELECT * FROM %s"), row(0, map("foo", "bar")));
@@ -769,17 +817,17 @@
     @Test
     public void testFrozenWithNullValues() throws Throwable
     {
-        createTable(String.format("CREATE TABLE %%s (k int PRIMARY KEY, m %s)", "frozen<list<text>>"));
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, m frozen<list<text>>)");
         execute("INSERT INTO %s (k, m) VALUES (0, null)");
 
         assertRows(execute("UPDATE %s SET m = ? WHERE k = 0 IF m = ?", list("test"), list("comparison")), row(false, null));
 
-        createTable(String.format("CREATE TABLE %%s (k int PRIMARY KEY, m %s)", "frozen<map<text,int>>"));
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, m frozen<map<text,int>>)");
         execute("INSERT INTO %s (k, m) VALUES (0, null)");
 
         assertRows(execute("UPDATE %s SET m = ? WHERE k = 0 IF m = ?", map("test", 3), map("comparison", 2)), row(false, null));
 
-        createTable(String.format("CREATE TABLE %%s (k int PRIMARY KEY, m %s)", "frozen<set<text>>"));
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, m frozen<set<text>>)");
         execute("INSERT INTO %s (k, m) VALUES (0, null)");
 
         assertRows(execute("UPDATE %s SET m = ? WHERE k = 0 IF m = ?", set("test"), set("comparison")), row(false, null));
@@ -838,20 +886,32 @@
 
     void check_applies_map(String condition) throws Throwable
     {
+        // UPDATE statement
         assertRows(execute("UPDATE %s SET m = {'foo': 'bar'} WHERE k=0 IF " + condition), row(true));
         assertRows(execute("SELECT * FROM %s"), row(0, map("foo", "bar")));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k=0 IF " + condition), row(true));
+        assertEmpty(execute("SELECT * FROM %s"));
+        execute("INSERT INTO %s (k, m) VALUES (0, {'foo' : 'bar'})");
     }
 
     void check_does_not_apply_map(String condition) throws Throwable
     {
         assertRows(execute("UPDATE %s SET m = {'foo': 'bar'} WHERE k=0 IF " + condition), row(false, map("foo", "bar")));
         assertRows(execute("SELECT * FROM %s"), row(0, map("foo", "bar")));
+        // DELETE statement
+        assertRows(execute("DELETE FROM %s WHERE k=0 IF " + condition), row(false, map("foo", "bar")));
+        assertRows(execute("SELECT * FROM %s"), row(0, map("foo", "bar")));
     }
 
     void check_invalid_map(String condition, Class<? extends Throwable> expected) throws Throwable
     {
+        // UPDATE statement
         assertInvalidThrow(expected, "UPDATE %s SET m = {'foo': 'bar'} WHERE k=0 IF " + condition);
         assertRows(execute("SELECT * FROM %s"), row(0, map("foo", "bar")));
+        // DELETE statement
+        assertInvalidThrow(expected, "DELETE FROM %s WHERE k=0 IF " + condition);
+        assertRows(execute("SELECT * FROM %s"), row(0, map("foo", "bar")));
     }
 
     @Test
@@ -918,4 +978,111 @@
                                  "UPDATE %s SET v = {a: 0, b: 'bc'} WHERE k = 0 IF v.a IN ?", unset());
         }
     }
+
+    @Test
+    public void testNonFrozenEmptyCollection() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, l list<text>)");
+        execute("INSERT INTO %s (k, l) VALUES (0, null)");
+
+        // Does apply
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l = ?", (ByteBuffer) null),
+                   row(true));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l = ?", list()),
+                   row(true));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l != ?", list("bar")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l < ?", list("a")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l <= ?", list("a")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l IN (?, ?)", null, list("bar")),
+                   row(true));
+
+        // Does not apply
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l = ?", list("bar")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l > ?", list("a")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l >= ?", list("a")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l CONTAINS ?", "bar"),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET l = null WHERE k = 0 IF l CONTAINS ?", unset()),
+                   row(false, null));
+
+        assertInvalidMessage("Invalid comparison with null for operator \"CONTAINS\"",
+                             "UPDATE %s SET l = null WHERE k = 0 IF l CONTAINS ?", (ByteBuffer) null);
+
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, s set<text>)");
+        execute("INSERT INTO %s (k, s) VALUES (0, null)");
+
+        // Does apply
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s = ?", (ByteBuffer) null),
+                   row(true));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s = ?", set()),
+                   row(true));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s != ?", set("bar")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s < ?", set("a")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s <= ?", set("a")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s IN (?, ?)", null, set("bar")),
+                   row(true));
+
+        // Does not apply
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s = ?", set("bar")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s > ?", set("a")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s >= ?", set("a")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s CONTAINS ?", "bar"),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET s = null WHERE k = 0 IF s CONTAINS ?", unset()),
+                   row(false, null));
+
+        assertInvalidMessage("Invalid comparison with null for operator \"CONTAINS\"",
+                             "UPDATE %s SET s = null WHERE k = 0 IF s CONTAINS ?", (ByteBuffer) null);
+
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, m map<text, text>) ");
+        execute("INSERT INTO %s (k, m) VALUES (0, null)");
+
+        // Does apply
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m = ?", (ByteBuffer) null),
+                   row(true));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m = ?", map()),
+                   row(true));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m != ?", map("foo","bar")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m < ?", map("a","a")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m <= ?", map("a","a")),
+                   row(true));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m IN (?, ?)", null, map("foo","bar")),
+                   row(true));
+
+        // Does not apply
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m = ?", map("foo","bar")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m > ?", map("a", "a")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m >= ?", map("a", "a")),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET m = null WHERE k = 0 IF m CONTAINS ?", "bar"),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET m = {} WHERE k = 0 IF m CONTAINS ?", unset()),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET m = {} WHERE k = 0 IF m CONTAINS KEY ?", "foo"),
+                   row(false, null));
+        assertRows(execute("UPDATE %s SET m = {} WHERE k = 0 IF m CONTAINS KEY ?", unset()),
+                   row(false, null));
+
+        assertInvalidMessage("Invalid comparison with null for operator \"CONTAINS\"",
+                             "UPDATE %s SET m = {} WHERE k = 0 IF m CONTAINS ?", (ByteBuffer) null);
+        assertInvalidMessage("Invalid comparison with null for operator \"CONTAINS KEY\"",
+                             "UPDATE %s SET m = {} WHERE k = 0 IF m CONTAINS KEY ?", (ByteBuffer) null);
+    }
+
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java
index ac03cb5..8429ec0 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/InsertUpdateIfConditionTest.java
@@ -36,6 +36,7 @@
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.schema.SchemaKeyspaceTables;
 import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.Pair;
 
 import static java.lang.String.format;
 import static org.junit.Assert.assertEquals;
@@ -61,14 +62,18 @@
     public static Collection<Object[]> data()
     {
         return Arrays.asList(new Object[]{ "3.0", (Runnable) () -> {
-                                 assertTrue(Gossiper.instance.isUpgradingFromVersionLowerThan(new CassandraVersion("3.11")));
+                                 Pair<Boolean, CassandraVersion> res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(new CassandraVersion("3.11"));
+                                 assertTrue(debugMsgCASSANDRA17653(res), res.left);
                              } },
                              new Object[]{ "3.11", (Runnable) () -> {
-                                 assertTrue(Gossiper.instance.isUpgradingFromVersionLowerThan(SystemKeyspace.CURRENT_VERSION));
-                                 assertFalse(Gossiper.instance.isUpgradingFromVersionLowerThan(new CassandraVersion("3.11")));
+                                 Pair<Boolean, CassandraVersion> res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(SystemKeyspace.CURRENT_VERSION);
+                                 assertTrue(debugMsgCASSANDRA17653(res), res.left);
+                                 res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(new CassandraVersion("3.11"));
+                                 assertFalse(debugMsgCASSANDRA17653(res), res.left);
                              } },
                              new Object[]{ SystemKeyspace.CURRENT_VERSION.toString(), (Runnable) () -> {
-                                 assertFalse(Gossiper.instance.isUpgradingFromVersionLowerThan(SystemKeyspace.CURRENT_VERSION));
+                                 Pair<Boolean, CassandraVersion> res = Gossiper.instance.isUpgradingFromVersionLowerThanC17653(SystemKeyspace.CURRENT_VERSION);
+                                 assertFalse(debugMsgCASSANDRA17653(res), res.left);
                              } });
     }
 
@@ -194,6 +199,7 @@
                              "UPDATE %s SET v1 = 'A' WHERE k = 0 AND c IN () IF EXISTS");
         assertInvalidMessage("IN on the clustering key columns is not supported with conditional updates",
                              "UPDATE %s SET v1 = 'A' WHERE k = 0 AND c IN (1, 2) IF EXISTS");
+        assertInvalidMessage("Cannot use CONTAINS on non-collection column v1", "UPDATE %s SET v1 = 'B' WHERE k = 0 IF v1 CONTAINS 'A'");
     }
 
     /**
@@ -958,4 +964,10 @@
 
         assertRows(execute("SELECT * FROM %s WHERE k = 1"), row(1, Duration.from("10s"), 6));
     }
+
+    // Helper to debug on the next occurrence of CASSANDRA-17653
+    private static String debugMsgCASSANDRA17653(Pair<Boolean, CassandraVersion> res)
+    {
+        return("Failed on Cass Version: " + res.right == null ? "null" : res.right + " boolean:" + res.left);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectGroupByTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectGroupByTest.java
index 17d06ac..f46783b 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectGroupByTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectGroupByTest.java
@@ -19,7 +19,19 @@
 
 import org.junit.Test;
 
+import com.datastax.driver.core.LocalDate;
+
+import java.time.LocalDateTime;
+import java.time.ZoneOffset;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.UUID;
+
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.serializers.SimpleDateSerializer;
+import org.apache.cassandra.serializers.TimeSerializer;
+import org.apache.cassandra.serializers.TimestampSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class SelectGroupByTest extends CQLTester
 {
@@ -2132,4 +2144,493 @@
                           row(1, 1, 4L, 3L));
         }
     }
+
+    @Test
+    public void testGroupByTimeRangesWithTimestamTypeAndWithoutPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, time timestamp, v int, primary key (pk, time))" + compactOption);
+
+            assertInvalidMessage("Group by currently only support groups of columns following their declared order in the PRIMARY KEY",
+                                 "SELECT pk, floor(time, 2h, '2016-09-01'), v FROM %s GROUP BY floor(time, 2h, '2016-09-01')");
+
+            assertInvalidMessage("Only monotonic functions are supported in the GROUP BY clause. Got: system.floor : (timestamp, duration(constant), timestamp) -> timestamp",
+                                 "SELECT pk, floor(time, 2h, time), v FROM %s GROUP BY pk, floor(time, 2h, time)");
+
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:10:00 UTC', 1)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:12:00 UTC', 2)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:14:00 UTC', 3)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:15:00 UTC', 4)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:21:00 UTC', 5)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:22:00 UTC', 6)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:26:00 UTC', 7)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:26:20 UTC', 8)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-09-27 16:26:20 UTC', 10)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-09-27 16:30:00 UTC', 11)");
+
+            // Test prepared statement
+            assertRows(execute("SELECT pk, floor(time, 5m, ?), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m, ?)",
+                               toTimestamp("2016-09-27 00:00:00 UTC"),
+                               toTimestamp("2016-09-27 00:00:00 UTC")),
+                       row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                       row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                       row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                       row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                       row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L),
+                       row(2, toTimestamp("2016-09-27 16:30:00 UTC"), 11, 11, 1L));
+
+            for (String startingTime : new String[]{"", ", '2016-09-27 UTC'"})
+            {
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ")"),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                           row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                           row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                           row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                           row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L),
+                           row(2, toTimestamp("2016-09-27 16:30:00 UTC"), 11, 11, 1L));
+
+                // Checks with duration lower than precisions
+                assertInvalidMessage("The floor cannot be computed for the 10us duration as precision is below 1 millisecond",
+                                     "SELECT pk, floor(time, 10us" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 10us" + startingTime + ")");
+
+                // Checks with a negative duration
+                assertInvalidMessage("Negative durations are not supported by the floor function",
+                                     "SELECT pk, floor(time, 10us" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, -5m" + startingTime + ")");
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") LIMIT 2"),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                           row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L));
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") PER PARTITION LIMIT 1"),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                           row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L));
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC"),
+                           row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                           row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                           row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L));
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC LIMIT 2"),
+                           row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                           row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L));
+            }
+
+            // Checks with start time is greater than the timestamp
+            assertInvalidMessage("The floor function starting time is greater than the provided time",
+                                 "SELECT pk, floor(time, 5m, '2016-10-27'), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m, '2016-10-27')");
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithTimeUUIDAndWithoutPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, time timeuuid, v int, primary key (pk, time))" + compactOption);
+
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:10:00"), 1);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:12:00"), 2);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:14:00"), 3);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:15:00"), 4);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:21:00"), 5);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:22:00"), 6);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:26:00"), 7);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:26:20"), 8);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 2, toTimeUUID("2016-09-27 16:26:00"), 10);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 2, toTimeUUID("2016-09-27 16:30:00"), 11);
+
+            for (String startingTime : new String[]{"", ", '2016-09-27 UTC'"})
+            {
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ")"),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                           row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                           row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                           row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                           row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L),
+                           row(2, toTimestamp("2016-09-27 16:30:00 UTC"), 11, 11, 1L));
+
+                assertRows(execute("SELECT pk, floor(toTimestamp(time), 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(toTimestamp(time), 5m" + startingTime + ")"),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                           row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                           row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                           row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                           row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L),
+                           row(2, toTimestamp("2016-09-27 16:30:00 UTC"), 11, 11, 1L));
+
+                // Checks with duration lower than precisions
+                assertInvalidMessage("The floor cannot be computed for the 10us duration as precision is below 1 millisecond",
+                                     "SELECT pk, floor(time, 10us" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 10us" + startingTime + ")");
+
+                // Checks with a negative duration
+                assertInvalidMessage("Negative durations are not supported by the floor function",
+                                     "SELECT pk, floor(time, 10us" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, -5m" + startingTime + ")");
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") LIMIT 2"),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                           row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L));
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") PER PARTITION LIMIT 1"),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                           row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L));
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC"),
+                           row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                           row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                           row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                           row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L));
+
+                assertRows(execute("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC LIMIT 2"),
+                           row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                           row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L));
+            }
+
+            // Checks with start time is greater than the timestamp
+            assertInvalidMessage("The floor function starting time is greater than the provided time",
+                                 "SELECT pk, floor(time, 5m, '2016-10-27'), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m, '2016-10-27')");
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithDateTypeAndWithoutPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, time date, v int, primary key (pk, time))" + compactOption);
+
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27', 1)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-28', 2)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-29', 3)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-30', 4)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-10-01', 5)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-10-04', 6)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-10-20', 7)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-11-27', 8)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-11-01', 10)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-11-02', 11)");
+
+            for (String startingTime : new String[]{"", ", '2016-06-01'"})
+            {
+                assertRows(execute("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1mo" + startingTime + ")"),
+                           row(1, toDate("2016-09-01"), 1, 4, 4L),
+                           row(1, toDate("2016-10-01"), 5, 7, 3L),
+                           row(1, toDate("2016-11-01"), 8, 8, 1L),
+                           row(2, toDate("2016-11-01"), 10, 11, 2L));
+
+                // Checks with duration lower than precisions
+                assertInvalidMessage("The floor on date values cannot be computed for the 1h duration as precision is below 1 day",
+                                     "SELECT pk, floor(time, 1h" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1h" + startingTime + ")");
+
+                // Checks with a negative duration
+                assertInvalidMessage("Negative durations are not supported by the floor function",
+                                     "SELECT pk, floor(time, -1mo" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, -1mo" + startingTime + ")");
+
+                assertRows(execute("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1mo" + startingTime + ") LIMIT 2"),
+                           row(1, toDate("2016-09-01"), 1, 4, 4L),
+                           row(1, toDate("2016-10-01"), 5, 7, 3L));
+
+                assertRows(execute("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1mo" + startingTime + ") PER PARTITION LIMIT 1"),
+                           row(1, toDate("2016-09-01"), 1, 4, 4L),
+                           row(2, toDate("2016-11-01"), 10, 11, 2L));
+
+                assertRows(execute("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 1mo" + startingTime + ") ORDER BY time DESC"),
+                           row(1, toDate("2016-11-01"), 8, 8, 1L),
+                           row(1, toDate("2016-10-01"), 5, 7, 3L),
+                           row(1, toDate("2016-09-01"), 1, 4, 4L));
+
+                assertRows(execute("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 1mo" + startingTime + ") ORDER BY time DESC LIMIT 2"),
+                           row(1, toDate("2016-11-01"), 8, 8, 1L),
+                           row(1, toDate("2016-10-01"), 5, 7, 3L));
+            }
+
+            // Checks with start time is greater than the timestamp
+            assertInvalidMessage("The floor function starting time is greater than the provided time",
+                                 "SELECT pk, floor(time, 1mo, '2017-01-01'), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1mo, '2017-01-01')");
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithTimeTypeAndWithoutPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, date date, time time, v int, primary key (pk, date, time))" + compactOption);
+
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:10:00', 1)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:12:00', 2)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:14:00', 3)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:15:00', 4)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:21:00', 5)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:22:00', 6)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:26:00', 7)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:26:20', 8)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-28', '16:26:20', 9)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-28', '16:26:30', 10)");
+
+            assertInvalidMessage("Functions are only supported on the last element of the GROUP BY clause",
+                                 "SELECT pk, floor(date, 1w), time, min(v), max(v), count(v) FROM %s GROUP BY pk, floor(date, 1w), time");
+
+            assertRows(execute("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s GROUP BY pk, date, floor(time, 5m)"),
+                       row(1, toDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L),
+                       row(1, toDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L),
+                       row(1, toDate("2016-09-27"), toTime("16:20:00"), 5, 6, 2L),
+                       row(1, toDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L),
+                       row(1, toDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L));
+
+            // Checks with duration greater than dayprecisions
+            assertInvalidMessage("For time values, the floor can only be computed for durations smaller that a day",
+                                 "SELECT pk, date, floor(time, 10d), min(v), max(v), count(v) FROM %s GROUP BY pk, date, floor(time, 10d)");
+
+            // Checks with a negative duration
+            assertInvalidMessage("Negative durations are not supported by the floor function",
+                                 "SELECT pk, date, floor(time, -10m), min(v), max(v), count(v) FROM %s GROUP BY pk, date, floor(time, -10m)");
+
+            assertRows(execute("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s GROUP BY pk, date, floor(time, 5m) LIMIT 2"),
+                       row(1, toDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L),
+                       row(1, toDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L));
+
+            assertRows(execute("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, date, floor(time, 5m) ORDER BY date DESC, time DESC"),
+                       row(1, toDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L),
+                       row(1, toDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L),
+                       row(1, toDate("2016-09-27"), toTime("16:20:00"), 5, 6, 2L),
+                       row(1, toDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L),
+                       row(1, toDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L));
+
+            assertRows(execute("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, date, floor(time, 5m) ORDER BY date DESC, time DESC LIMIT 2"),
+                       row(1, toDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L),
+                       row(1, toDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L));
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithTimestampTypeAndPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, time timestamp, v int, primary key (pk, time))"
+                    + compactOption);
+
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:10:00 UTC', 1)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:12:00 UTC', 2)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:14:00 UTC', 3)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:15:00 UTC', 4)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:21:00 UTC', 5)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:22:00 UTC', 6)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:26:00 UTC', 7)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27 16:26:20 UTC', 8)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-09-27 16:26:20 UTC', 10)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-09-27 16:30:00 UTC', 11)");
+
+            for (int pageSize = 1; pageSize < 10; pageSize++)
+            {
+                for (String startingTime : new String[]{"", ", '2016-09-27 UTC'"})
+                {
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ")", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                                  row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                                  row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                                  row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L),
+                                  row(2, toTimestamp("2016-09-27 16:30:00 UTC"), 11, 11, 1L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") LIMIT 2", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                                  row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") PER PARTITION LIMIT 1", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                                  row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC LIMIT 2", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L));
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithTimeUUIDAndPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, time timeuuid, v int, primary key (pk, time))" + compactOption);
+
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:10:00"), 1);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:12:00"), 2);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:14:00"), 3);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:15:00"), 4);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:21:00"), 5);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:22:00"), 6);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:26:00"), 7);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 1, toTimeUUID("2016-09-27 16:26:20"), 8);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 2, toTimeUUID("2016-09-27 16:26:00"), 10);
+            execute("INSERT INTO %s (pk, time, v) VALUES (?, ?, ?)", 2, toTimeUUID("2016-09-27 16:30:00"), 11);
+
+            for (int pageSize = 1; pageSize < 10; pageSize++)
+            {
+                for (String startingTime : new String[]{"", ", '2016-09-27 UTC'"})
+                {
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ")", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                                  row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                                  row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                                  row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L),
+                                  row(2, toTimestamp("2016-09-27 16:30:00 UTC"), 11, 11, 1L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") LIMIT 2", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                                  row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 5m" + startingTime + ") PER PARTITION LIMIT 1", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L),
+                                  row(2, toTimestamp("2016-09-27 16:25:00 UTC"), 10, 10, 1L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:15:00 UTC"), 4, 4, 1L),
+                                  row(1, toTimestamp("2016-09-27 16:10:00 UTC"), 1, 3, 3L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 5m" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 5m" + startingTime + ") ORDER BY time DESC LIMIT 2", pageSize),
+                                  row(1, toTimestamp("2016-09-27 16:25:00 UTC"), 7, 8, 2L),
+                                  row(1, toTimestamp("2016-09-27 16:20:00 UTC"), 5, 6, 2L));
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithDateTypeAndPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, time date, v int, primary key (pk, time))" + compactOption);
+
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-27', 1)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-28', 2)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-29', 3)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-09-30', 4)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-10-01', 5)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-10-04', 6)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-10-20', 7)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (1, '2016-11-27', 8)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-11-01', 10)");
+            execute("INSERT INTO %s (pk, time, v) VALUES (2, '2016-11-02', 11)");
+
+            for (int pageSize = 1; pageSize < 10; pageSize++)
+            {
+                for (String startingTime : new String[]{"", ", '2016-06-01'"})
+                {
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1mo" + startingTime + ")", pageSize),
+                                  row(1, toLocalDate("2016-09-01"), 1, 4, 4L),
+                                  row(1, toLocalDate("2016-10-01"), 5, 7, 3L),
+                                  row(1, toLocalDate("2016-11-01"), 8, 8, 1L),
+                                  row(2, toLocalDate("2016-11-01"), 10, 11, 2L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1mo" + startingTime + ") LIMIT 2", pageSize),
+                                  row(1, toLocalDate("2016-09-01"), 1, 4, 4L),
+                                  row(1, toLocalDate("2016-10-01"), 5, 7, 3L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s GROUP BY pk, floor(time, 1mo" + startingTime + ") PER PARTITION LIMIT 1", pageSize),
+                                  row(1, toLocalDate("2016-09-01"), 1, 4, 4L),
+                                  row(2, toLocalDate("2016-11-01"), 10, 11, 2L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 1mo" + startingTime + ") ORDER BY time DESC", pageSize),
+                                  row(1, toLocalDate("2016-11-01"), 8, 8, 1L),
+                                  row(1, toLocalDate("2016-10-01"), 5, 7, 3L),
+                                  row(1, toLocalDate("2016-09-01"), 1, 4, 4L));
+
+                    assertRowsNet(executeNetWithPaging("SELECT pk, floor(time, 1mo" + startingTime + "), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, floor(time, 1mo" + startingTime + ") ORDER BY time DESC LIMIT 2", pageSize),
+                                  row(1, toLocalDate("2016-11-01"), 8, 8, 1L),
+                                  row(1, toLocalDate("2016-10-01"), 5, 7, 3L));
+                }
+            }
+        }
+    }
+
+    @Test
+    public void testGroupByTimeRangesWithTimeTypeAndPaging() throws Throwable
+    {
+        for (String compactOption : new String[] { "", " WITH COMPACT STORAGE" })
+        {
+            createTable("CREATE TABLE %s (pk int, date date, time time, v int, primary key (pk, date, time))" + compactOption);
+
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:10:00', 1)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:12:00', 2)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:14:00', 3)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:15:00', 4)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:21:00', 5)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:22:00', 6)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:26:00', 7)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-27', '16:26:20', 8)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-28', '16:26:20', 9)");
+            execute("INSERT INTO %s (pk, date, time, v) VALUES (1, '2016-09-28', '16:26:30', 10)");
+
+            for (int pageSize = 1; pageSize < 10; pageSize++)
+            {
+                assertRowsNet(executeNetWithPaging("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s GROUP BY pk, date, floor(time, 5m)", pageSize),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:20:00"), 5, 6, 2L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L),
+                              row(1, toLocalDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L));
+
+                assertRowsNet(executeNetWithPaging("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s GROUP BY pk, date, floor(time, 5m) LIMIT 2", pageSize),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L));
+
+                assertRowsNet(executeNetWithPaging("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, date, floor(time, 5m) ORDER BY date DESC, time DESC", pageSize),
+                              row(1, toLocalDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:20:00"), 5, 6, 2L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:15:00"), 4, 4, 1L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:10:00"), 1, 3, 3L));
+
+                assertRowsNet(executeNetWithPaging("SELECT pk, date, floor(time, 5m), min(v), max(v), count(v) FROM %s WHERE pk = 1 GROUP BY pk, date, floor(time, 5m) ORDER BY date DESC, time DESC LIMIT 2", pageSize),
+                              row(1, toLocalDate("2016-09-28"), toTime("16:25:00"), 9, 10, 2L),
+                              row(1, toLocalDate("2016-09-27"), toTime("16:25:00"), 7, 8, 2L));
+            }
+        }
+    }
+
+    private static UUID toTimeUUID(String string)
+    {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
+        LocalDateTime dateTime = LocalDateTime.parse(string, formatter);
+        long timeInMillis = dateTime.toInstant(ZoneOffset.UTC).toEpochMilli();
+        return TimeUUID.Generator.atUnixMillis(timeInMillis).asUUID();
+    }
+
+    private static Date toTimestamp(String timestampAsString)
+    {
+        return new Date(TimestampSerializer.dateStringToTimestamp(timestampAsString));
+    }
+
+    private static int toDate(String dateAsString)
+    {
+        return SimpleDateSerializer.dateStringToDays(dateAsString);
+    }
+
+    private static LocalDate toLocalDate(String dateAsString)
+    {
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime dateTime = java.time.LocalDate.parse(dateAsString, formatter).atStartOfDay();
+        long timeInMillis = dateTime.toInstant(ZoneOffset.UTC).toEpochMilli();
+
+        return LocalDate.fromMillisSinceEpoch(timeInMillis);
+    }
+
+    private static long toTime(String timeAsString)
+    {
+        return TimeSerializer.timeStringToLong(timeAsString);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java
index 5062448..b69ee37 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectMultiColumnRelationTest.java
@@ -1930,4 +1930,46 @@
         assertInvalidMessage("Undefined column name e", "SELECT c AS e FROM %s WHERE (b, e) IN ((0, 1), (2, 4))");
         assertInvalidMessage("Undefined column name e", "SELECT c AS e FROM %s WHERE (b, e) > (0, 1) and b <= 2");
     }
+
+    @Test
+    public void testInRestrictionsWithAllowFiltering() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int, c1 text, c2 int, c3 int, v int, primary key(pk, c1, c2, c3))");
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "0", 0, 1, 3);
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "1", 0, 2, 4);
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "1", 1, 3, 5);
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "2", 1, 4, 6);
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "2", 2, 5, 7);
+
+        assertRows(execute("SELECT * FROM %s WHERE (c2) IN ((?), (?)) ALLOW FILTERING", 1, 3),
+                   row(1, "1", 1, 3, 5),
+                   row(1, "2", 1, 4, 6));
+
+        assertRows(execute("SELECT * FROM %s WHERE c2 IN (?, ?) ALLOW FILTERING", 1, 3),
+                   row(1, "1", 1, 3, 5),
+                   row(1, "2", 1, 4, 6));
+
+        assertInvalidMessage("Multicolumn IN filters are not supported",
+                             "SELECT * FROM %s WHERE (c2, c3) IN ((?, ?), (?, ?)) ALLOW FILTERING", 1, 0, 2, 0);
+    }
+
+    @Test
+    public void testInRestrictionsWithIndex() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int, c1 text, c2 int, c3 int, v int, primary key(pk, c1, c2, c3))");
+        createIndex("CREATE INDEX ON %s (c3)");
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "0", 0, 1, 3);
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "1", 0, 2, 4);
+        execute("INSERT INTO %s (pk, c1, c2, c3, v) values (?, ?, ?, ?, ?)", 1, "1", 1, 3, 5);
+
+        assertRows(execute("SELECT * FROM %s WHERE (c3) IN ((?), (?)) ALLOW FILTERING", 1, 3),
+                   row(1, "0", 0, 1, 3),
+                   row(1, "1", 1, 3, 5));
+
+        assertInvalidMessage("PRIMARY KEY column \"c2\" cannot be restricted as preceding column \"c1\" is not restricted",
+                             "SELECT * FROM %s WHERE (c2, c3) IN ((?, ?), (?, ?))", 1, 0, 2, 0);
+
+        assertInvalidMessage("Multicolumn IN filters are not supported",
+                             "SELECT * FROM %s WHERE (c2, c3) IN ((?, ?), (?, ?)) ALLOW FILTERING", 1, 0, 2, 0);
+    }
  }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderedPartitionerTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderedPartitionerTest.java
index a14a2a4..fbac1ff 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderedPartitionerTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectOrderedPartitionerTest.java
@@ -25,14 +25,14 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static junit.framework.Assert.assertNull;
-import static org.junit.Assert.assertEquals;
-
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
 import org.apache.cassandra.dht.ByteOrderedPartitioner;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
 /**
  * SELECT statement tests that require a ByteOrderedPartitioner
  */
@@ -368,7 +368,7 @@
 
         Object[][] rows = getRows(execute("SELECT v2 FROM %s"));
         assertEquals(0, rows[0][0]);
-        assertEquals(null, rows[1][0]);
+        assertNull(rows[1][0]);
         assertEquals(2, rows[2][0]);
 
         rows = getRows(execute("SELECT v2 FROM %s WHERE k = 1"));
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectSingleColumnRelationTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectSingleColumnRelationTest.java
index 3795ce5..17c7e87 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectSingleColumnRelationTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectSingleColumnRelationTest.java
@@ -351,9 +351,17 @@
 
         assertRows(execute("SELECT v1 FROM %s WHERE time = 1"), row("B"), row("E"));
 
-        assertInvalidMessage("IN restrictions are not supported on indexed columns",
-                             "SELECT v1 FROM %s WHERE id2 = 0 and time IN (1, 2) ALLOW FILTERING");
+        // Checks that IN restrictions are not used for index queries
+        assertInvalidMessage("PRIMARY KEY column \"time\" cannot be restricted as preceding column \"author\" is not restricted",
+                            "SELECT v1 FROM %s WHERE time IN (1, 2)");
+        assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                             "SELECT v1 FROM %s WHERE id2 IN (0, 2)");
 
+        // Checks that the IN queries works with filtering
+        assertRows(execute("SELECT v1 FROM %s WHERE time IN (1, 2) ALLOW FILTERING"), row("B"), row("C"), row("E"));
+        assertRows(execute("SELECT v1 FROM %s WHERE id2 IN (0, 2) ALLOW FILTERING"), row("A"), row("B"), row("D"));
+
+        // Checks index query with filtering
         assertRows(execute("SELECT v1 FROM %s WHERE author > 'ted' AND time = 1 ALLOW FILTERING"), row("E"));
         assertRows(execute("SELECT v1 FROM %s WHERE author > 'amy' AND author < 'zoe' AND time = 0 ALLOW FILTERING"),
                            row("A"), row("D"));
@@ -639,4 +647,138 @@
         assertInvalidMessage("Cannot use CONTAINS on non-collection column b",
                              "SELECT * FROM %s WHERE b CONTAINS ?", udt);
     }
+
+    @Test
+    public void testInRestrictionWithClusteringColumn() throws Throwable
+    {
+        createTable("CREATE TABLE %s (key int, c1 int, c2 int, s1 text static, PRIMARY KEY ((key, c1), c2))");
+
+        execute("INSERT INTO %s (key, c1, c2, s1) VALUES ( 10, 11, 1, 's1')");
+        execute("INSERT INTO %s (key, c1, c2, s1) VALUES ( 10, 12, 2, 's2')");
+        execute("INSERT INTO %s (key, c1, c2, s1) VALUES ( 10, 13, 3, 's3')");
+        execute("INSERT INTO %s (key, c1, c2, s1) VALUES ( 10, 13, 4, 's4')");
+        execute("INSERT INTO %s (key, c1, c2, s1) VALUES ( 20, 21, 1, 's1')");
+        execute("INSERT INTO %s (key, c1, c2, s1) VALUES ( 20, 22, 2, 's2')");
+        execute("INSERT INTO %s (key, c1, c2, s1) VALUES ( 20, 22, 3, 's3')");
+
+        assertRows(execute("SELECT * from %s WHERE key = ? AND c1 IN (?, ?)", 10, 21, 13),
+                   row(10, 13, 3, "s4"),
+                   row(10, 13, 4, "s4"));
+
+        assertRows(execute("SELECT * from %s WHERE key = ? AND c2 IN (?, ?) ALLOW FILTERING", 20, 1, 2),
+                   row(20, 22, 2, "s3"),
+                   row(20, 21, 1, "s1"));
+
+        assertRows(execute("SELECT * from %s WHERE c1 = ? AND c2 IN (?, ?) ALLOW FILTERING", 13, 2, 3),
+                   row(10, 13, 3, "s4"));
+
+        assertRowsIgnoringOrder(execute("SELECT * from %s WHERE c2 IN (?, ?) ALLOW FILTERING", 1, 2),
+                                row(10, 11, 1, "s1"),
+                                row(10, 12, 2, "s2"),
+                                row(20, 21, 1, "s1"),
+                                row(20, 22, 2, "s3"));
+
+        assertInvalidMessage("Invalid null value in condition for column c2",
+                             "SELECT * from %s WHERE key = 10 AND c2 IN (1, null) ALLOW FILTERING");
+    }
+
+    @Test
+    public void testInRestrictionsWithAllowFiltering() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk1 int, pk2 int, c text, s int static, v int, primary key((pk1, pk2), c))");
+        execute("INSERT INTO %s (pk1, pk2, c, s, v) values (?, ?, ?, ?, ?)", 1, 0, "5", 1, 3);
+        execute("INSERT INTO %s (pk1, pk2, c, s, v) values (?, ?, ?, ?, ?)", 1, 0, "7", 1, 2);
+        execute("INSERT INTO %s (pk1, pk2, c, s, v) values (?, ?, ?, ?, ?)", 1, 1, "7", 1, 3);
+        execute("INSERT INTO %s (pk1, pk2, c, s, v) values (?, ?, ?, ?, ?)", 2, 0, "4", 2, 1);
+        execute("INSERT INTO %s (pk1, pk2, c, s, v) values (?, ?, ?, ?, ?)", 2, 3, "6", 2, 8);
+
+        // Test filtering on regular columns
+        assertRows(execute("SELECT * FROM %s WHERE v IN (?, ?) ALLOW FILTERING", 4, 3),
+                   row(1, 0, "5", 1, 3),
+                   row(1, 1, "7", 1, 3));
+
+        assertRows(execute("SELECT * FROM %s WHERE v IN ? ALLOW FILTERING", list(4, 3)),
+                   row(1, 0, "5", 1, 3),
+                   row(1, 1, "7", 1, 3));
+
+        // Test filtering on clustering columns
+        assertRows(execute("SELECT * FROM %s WHERE c IN (?, ?, ?) ALLOW FILTERING", "7", "6", "8"),
+                   row(2, 3, "6", 2, 8),
+                   row(1, 0, "7", 1, 2),
+                   row(1, 1, "7", 1, 3));
+
+        assertRows(execute("SELECT * FROM %s WHERE c IN ? ALLOW FILTERING", list("7", "6", "8")),
+                   row(2, 3, "6", 2, 8),
+                   row(1, 0, "7", 1, 2),
+                   row(1, 1, "7", 1, 3));
+
+        // Test filtering on partition keys
+        assertRows(execute("SELECT * FROM %s WHERE pk1 IN (?, ?) ALLOW FILTERING", 1, 3),
+                   row(1, 0, "5", 1, 3),
+                   row(1, 0, "7", 1, 2),
+                   row(1, 1, "7", 1, 3));
+
+        assertRows(execute("SELECT * FROM %s WHERE pk1 IN ? ALLOW FILTERING", list(1, 3)),
+                   row(1, 0, "5", 1, 3),
+                   row(1, 0, "7", 1, 2),
+                   row(1, 1, "7", 1, 3));
+
+        // Test filtering on static columns
+        assertRows(execute("SELECT * FROM %s WHERE s IN (?, ?) ALLOW FILTERING", 1, 3),
+                   row(1, 0, "5", 1, 3),
+                   row(1, 0, "7", 1, 2),
+                   row(1, 1, "7", 1, 3));
+
+        assertRows(execute("SELECT * FROM %s WHERE s IN ? ALLOW FILTERING", list(1, 3)),
+                   row(1, 0, "5", 1, 3),
+                   row(1, 0, "7", 1, 2),
+                   row(1, 1, "7", 1, 3));
+    }
+
+    @Test
+    public void testInRestrictionsWithAllowFilteringAndOrdering() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int, c text, v int, primary key(pk, c)) WITH CLUSTERING ORDER BY (c DESC)");
+        execute("INSERT INTO %s (pk, c, v) values (?, ?, ?)", 1, "0", 5);
+        execute("INSERT INTO %s (pk, c, v) values (?, ?, ?)", 1, "1", 7);
+        execute("INSERT INTO %s (pk, c, v) values (?, ?, ?)", 1, "2", 7);
+        execute("INSERT INTO %s (pk, c, v) values (?, ?, ?)", 2, "0", 4);
+        execute("INSERT INTO %s (pk, c, v) values (?, ?, ?)", 2, "2", 6);
+
+        assertRows(execute("SELECT * FROM %s WHERE pk = ? AND c IN (?, ?, ?) ALLOW FILTERING", 1, "2", "0", "8"),
+                   row(1, "2", 7),
+                   row(1, "0", 5));
+
+        assertRows(execute("SELECT * FROM %s WHERE pk = ? AND c IN ? ORDER BY c ASC ALLOW FILTERING", 2, list("2", "8", "0")),
+                   row(2, "0", 4),
+                   row(2, "2", 6));
+
+        assertRows(execute("SELECT * FROM %s WHERE pk IN (?, ?) AND c IN (?, ?, ?) ALLOW FILTERING", 1, 2, "2", "0", "8"),
+                   row(1, "2", 7),
+                   row(1, "0", 5),
+                   row(2, "2", 6),
+                   row(2, "0", 4));
+
+        assertRows(execute("SELECT * FROM %s WHERE pk IN ? AND c IN ? ORDER BY c ASC ALLOW FILTERING", list(1, 2), list("2", "8", "0")),
+                   row(1, "0", 5),
+                   row(2, "0", 4),
+                   row(1, "2", 7),
+                   row(2, "2", 6));
+    }
+
+    @Test
+    public void testInRestrictionsWithCountersAndAllowFiltering() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int, v counter, primary key (pk))");
+
+        assertEmpty(execute("SELECT * FROM %s WHERE v IN (?, ?) ALLOW FILTERING", 0L, 1L));
+
+        execute("UPDATE %s SET v = v + 1 WHERE pk = 1");
+        execute("UPDATE %s SET v = v + 2 WHERE pk = 2");
+        execute("UPDATE %s SET v = v + 1 WHERE pk = 3");
+
+        assertRows(execute("SELECT * FROM %s WHERE v IN (?, ?) ALLOW FILTERING", 0L, 1L),
+                   row(1, 1L),
+                   row(3, 1L));
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
index d0493cf..7bbaa85 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/SelectTest.java
@@ -1276,11 +1276,12 @@
             assertRows(execute("SELECT * FROM %s WHERE s = 1 AND d = 12 ALLOW FILTERING"),
                        row(1, 3, 1, 6, 12));
 
-            assertInvalidMessage("IN predicates on non-primary-key columns (c) is not yet supported",
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                                  "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7)");
 
-            assertInvalidMessage("IN predicates on non-primary-key columns (c) is not yet supported",
-                                 "SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING");
+            assertRows(execute("SELECT * FROM %s WHERE a IN (1, 2) AND c IN (6, 7) ALLOW FILTERING"),
+                       row(1, 3, 1, 6, 12),
+                       row(2, 3, 2, 7, 12));
 
             assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                                  "SELECT * FROM %s WHERE c > 4");
@@ -1669,8 +1670,8 @@
 
         beforeAndAfterFlush(() -> {
 
-            assertInvalidMessage("IN restrictions are not supported when the query involves filtering",
-                    "SELECT * FROM %s WHERE b in (11,12) ALLOW FILTERING");
+            assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                    "SELECT * FROM %s WHERE b in (11,12)");
 
             assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                     "SELECT * FROM %s WHERE a = 11");
@@ -1745,8 +1746,8 @@
 
         beforeAndAfterFlush(() -> {
 
-             assertInvalidMessage("IN restrictions are not supported when the query involves filtering",
-                    "SELECT * FROM %s WHERE b in (11,12) ALLOW FILTERING");
+             assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                    "SELECT * FROM %s WHERE b in (11,12)");
 
             assertInvalidMessage(StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
                     "SELECT * FROM %s WHERE a = 11");
@@ -2838,8 +2839,9 @@
                    row(0, Duration.from("1s")),
                    row(2, Duration.from("1s")));
 
-        assertInvalidMessage("IN predicates on non-primary-key columns (d) is not yet supported",
-                             "SELECT * FROM %s WHERE d IN (1s, 2s) ALLOW FILTERING");
+        assertRows(execute("SELECT * FROM %s WHERE d IN (1s, 3s) ALLOW FILTERING"),
+                   row(0, Duration.from("1s")),
+                   row(2, Duration.from("1s")));
 
         assertInvalidMessage("Slice restrictions are not supported on duration columns",
                              "SELECT * FROM %s WHERE d > 1s ALLOW FILTERING");
@@ -2867,11 +2869,19 @@
             execute("INSERT INTO %s (k, l) VALUES (2, [1s, 3s])");
 
             if (frozen)
+            {
                 assertRows(execute("SELECT * FROM %s WHERE l = [1s, 2s] ALLOW FILTERING"),
                            row(0, list(Duration.from("1s"), Duration.from("2s"))));
 
-            assertInvalidMessage("IN predicates on non-primary-key columns (l) is not yet supported",
-                                 "SELECT * FROM %s WHERE l IN ([1s, 2s], [2s, 3s]) ALLOW FILTERING");
+                assertRows(execute("SELECT * FROM %s WHERE l IN ([1s, 2s], [2s, 3s]) ALLOW FILTERING"),
+                           row(1, list(Duration.from("2s"), Duration.from("3s"))),
+                           row(0, list(Duration.from("1s"), Duration.from("2s"))));
+            }
+            else
+            {
+                assertInvalidMessage("Collection column 'l' (list<duration>) cannot be restricted by a 'IN' relation",
+                        "SELECT * FROM %s WHERE l IN ([1s, 2s], [2s, 3s]) ALLOW FILTERING");
+            }
 
             assertInvalidMessage("Slice restrictions are not supported on collections containing durations",
                                  "SELECT * FROM %s WHERE l > [2s, 3s] ALLOW FILTERING");
@@ -2904,11 +2914,19 @@
             execute("INSERT INTO %s (k, m) VALUES (2, {1:1s, 3:3s})");
 
             if (frozen)
+            {
                 assertRows(execute("SELECT * FROM %s WHERE m = {1:1s, 2:2s} ALLOW FILTERING"),
                            row(0, map(1, Duration.from("1s"), 2, Duration.from("2s"))));
 
-            assertInvalidMessage("IN predicates on non-primary-key columns (m) is not yet supported",
-                    "SELECT * FROM %s WHERE m IN ({1:1s, 2:2s}, {1:1s, 3:3s}) ALLOW FILTERING");
+                assertRows(execute("SELECT * FROM %s WHERE m IN ({1:1s, 2:2s}, {1:1s, 3:3s}) ALLOW FILTERING"),
+                        row(0, map(1, Duration.from("1s"), 2, Duration.from("2s"))),
+                        row(2, map(1, Duration.from("1s"), 3, Duration.from("3s"))));
+            }
+            else
+            {
+                assertInvalidMessage("Collection column 'm' (map<int, duration>) cannot be restricted by a 'IN' relation",
+                        "SELECT * FROM %s WHERE m IN ({1:1s, 2:2s}, {1:1s, 3:3s}) ALLOW FILTERING");
+            }
 
             assertInvalidMessage("Slice restrictions are not supported on collections containing durations",
                     "SELECT * FROM %s WHERE m > {1:1s, 3:3s} ALLOW FILTERING");
@@ -2939,8 +2957,9 @@
         assertRows(execute("SELECT * FROM %s WHERE t = (1, 2s) ALLOW FILTERING"),
                    row(0, tuple(1, Duration.from("2s"))));
 
-        assertInvalidMessage("IN predicates on non-primary-key columns (t) is not yet supported",
-                "SELECT * FROM %s WHERE t IN ((1, 2s), (1, 3s)) ALLOW FILTERING");
+        assertRows(execute("SELECT * FROM %s WHERE t IN ((1, 2s), (1, 3s)) ALLOW FILTERING"),
+                   row(0, tuple(1, Duration.from("2s"))),
+                   row(2, tuple(1, Duration.from("3s"))));
 
         assertInvalidMessage("Slice restrictions are not supported on tuples containing durations",
                 "SELECT * FROM %s WHERE t > (1, 2s) ALLOW FILTERING");
@@ -2970,11 +2989,22 @@
             execute("INSERT INTO %s (k, u) VALUES (2, {i: 1, d:3s})");
 
             if (frozen)
+            {
                 assertRows(execute("SELECT * FROM %s WHERE u = {i: 1, d:2s} ALLOW FILTERING"),
                            row(0, userType("i", 1, "d", Duration.from("2s"))));
 
-            assertInvalidMessage("IN predicates on non-primary-key columns (u) is not yet supported",
-                    "SELECT * FROM %s WHERE u IN ({i: 2, d:3s}, {i: 1, d:3s}) ALLOW FILTERING");
+                assertRows(execute("SELECT * FROM %s WHERE u IN ({i: 2, d:3s}, {i: 1, d:3s}) ALLOW FILTERING"),
+                        row(1, userType("i", 2, "d", Duration.from("3s"))),
+                        row(2, userType("i", 1, "d", Duration.from("3s"))));
+            }
+            else
+            {
+                assertInvalidMessage("Non-frozen UDT column 'u' (" + udt + ") cannot be restricted by any relation",
+                        "SELECT * FROM %s WHERE u = {i: 1, d:2s} ALLOW FILTERING");
+
+                assertInvalidMessage("Non-frozen UDT column 'u' (" + udt + ") cannot be restricted by any relation",
+                        "SELECT * FROM %s WHERE u IN ({i: 2, d:3s}, {i: 1, d:3s}) ALLOW FILTERING");
+            }
 
             assertInvalidMessage("Slice restrictions are not supported on UDTs containing durations",
                     "SELECT * FROM %s WHERE u > {i: 1, d:3s} ALLOW FILTERING");
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 5c24432..9ef2520 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/TTLTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/TTLTest.java
@@ -18,11 +18,11 @@
 
 package org.apache.cassandra.cql3.validation.operations;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
+
 import java.io.IOException;
 
+import org.apache.cassandra.Util;
+import org.apache.cassandra.io.util.File;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -37,10 +37,11 @@
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.rows.AbstractCell;
 import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.apache.cassandra.tools.StandaloneScrubber;
 import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.apache.cassandra.utils.FBUtilities;
 import org.assertj.core.api.Assertions;
 
 import static org.junit.Assert.assertEquals;
@@ -268,7 +269,7 @@
         // Maybe Flush
         Keyspace ks = Keyspace.open(keyspace());
         if (flush)
-            FBUtilities.waitOnFutures(ks.flush());
+            Util.flush(ks);
 
         // Verify data
         verifyData(simple);
@@ -441,7 +442,7 @@
     {
         File destDir = Keyspace.open(keyspace()).getColumnFamilyStore(table).getDirectories().getCFDirectories().iterator().next();
         File sourceDir = getTableDir(table, simple, clustering);
-        for (File file : sourceDir.listFiles())
+        for (File file : sourceDir.tryList())
         {
             copyFile(file, destDir);
         }
@@ -457,12 +458,13 @@
         byte[] buf = new byte[65536];
         if (src.isFile())
         {
-            File target = new File(dest, src.getName());
+            File target = new File(dest, src.name());
             int rd;
-            FileInputStream is = new FileInputStream(src);
-            FileOutputStream os = new FileOutputStream(target);
+            FileInputStreamPlus is = new FileInputStreamPlus(src);
+            FileOutputStreamPlus os = new FileOutputStreamPlus(target);
             while ((rd = is.read(buf)) >= 0)
                 os.write(buf, 0, rd);
+            os.close();
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/UpdateTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/UpdateTest.java
index 0279557..59a0616 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/UpdateTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/UpdateTest.java
@@ -28,6 +28,8 @@
 import org.apache.cassandra.cql3.UntypedResultSet.Row;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.assertj.core.api.Assertions;
 
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertEquals;
@@ -657,4 +659,14 @@
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(currentTable());
         return cfs.metric.allMemtablesLiveDataSize.getValue() == 0;
     }
+
+    @Test
+    public void testAdderNonCounter()
+    {
+        createTable("CREATE TABLE %s (pk int PRIMARY KEY, a int, b text)");
+        Assertions.assertThatThrownBy(() -> execute("UPDATE %s SET a = a + 1, b = b + 'fail' WHERE pk = 1"))
+                  .isInstanceOf(InvalidRequestException.class)
+                  // if error ever includes "b" its safe to update this test
+                  .hasMessage("Invalid operation (a = a + 1) for non counter column a");
+    }
 }
diff --git a/test/unit/org/apache/cassandra/cql3/validation/operations/UseTest.java b/test/unit/org/apache/cassandra/cql3/validation/operations/UseTest.java
index e1498b6..b2a40a3 100644
--- a/test/unit/org/apache/cassandra/cql3/validation/operations/UseTest.java
+++ b/test/unit/org/apache/cassandra/cql3/validation/operations/UseTest.java
@@ -17,15 +17,41 @@
  */
 package org.apache.cassandra.cql3.validation.operations;
 
+import org.assertj.core.api.Assertions;
 import org.junit.Test;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 public class UseTest extends CQLTester
 {
     @Test
     public void testUseStatementWithBindVariable() throws Throwable
     {
+        DatabaseDescriptor.setUseStatementsEnabled(true);
         assertInvalidSyntaxMessage("Bind variables cannot be used for keyspace names", "USE ?");
     }
+
+    @Test
+    public void shouldRejectUseStatementWhenProhibited() throws Throwable
+    {
+        long useCountBefore = QueryProcessor.metrics.useStatementsExecuted.getCount();
+
+        try
+        {
+            DatabaseDescriptor.setUseStatementsEnabled(false);
+            execute("USE cql_test_keyspace");
+            fail("expected USE statement to fail with use_statements_enabled = false");
+        }
+        catch (InvalidRequestException e)
+        {
+            assertEquals(useCountBefore, QueryProcessor.metrics.useStatementsExecuted.getCount());
+            Assertions.assertThat(e).hasMessageContaining("USE statements prohibited");
+        }
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/AbstractReadQueryToCQLStringTest.java b/test/unit/org/apache/cassandra/db/AbstractReadQueryToCQLStringTest.java
new file mode 100644
index 0000000..11582b9
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/AbstractReadQueryToCQLStringTest.java
@@ -0,0 +1,813 @@
+/*
+ * 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;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLStatement;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.cql3.statements.SelectStatement;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.virtual.AbstractVirtualTable;
+import org.apache.cassandra.db.virtual.SimpleDataSet;
+import org.apache.cassandra.db.virtual.VirtualKeyspace;
+import org.apache.cassandra.db.virtual.VirtualKeyspaceRegistry;
+import org.apache.cassandra.db.virtual.VirtualTable;
+import org.apache.cassandra.exceptions.RequestValidationException;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Tests for {@link AbstractReadQuery#toCQLString()}.
+ */
+public class AbstractReadQueryToCQLStringTest extends CQLTester
+{
+    @Test
+    public void testSkinnyTable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int)");
+
+        // column selection on unrestricted partition range query
+        test("SELECT * FROM %s");
+        test("SELECT k FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT v1 FROM %s");
+        test("SELECT v2 FROM %s");
+        test("SELECT k, v1, v2 FROM %s",
+             "SELECT v1, v2 FROM %s");
+
+        // column selection on partition directed query
+        test("SELECT * FROM %s WHERE k = 0");
+        test("SELECT k FROM %s WHERE k = 0",
+             "SELECT * FROM %s WHERE k = 0");
+        test("SELECT v1 FROM %s WHERE k = 0");
+        test("SELECT v2 FROM %s WHERE k = 0");
+        test("SELECT k, v1, v2 FROM %s WHERE k = 0",
+             "SELECT v1, v2 FROM %s WHERE k = 0");
+
+        // token restrictions
+        test("SELECT * FROM %s WHERE token(k) > 0");
+        test("SELECT * FROM %s WHERE token(k) < 0");
+        test("SELECT * FROM %s WHERE token(k) >= 0");
+        test("SELECT * FROM %s WHERE token(k) <= 0");
+        test("SELECT * FROM %s WHERE token(k) = 0",
+             "SELECT * FROM %s WHERE token(k) >= 0 AND token(k) <= 0");
+
+        // row filter without indexed column
+        test("SELECT * FROM %s WHERE v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 < 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 > 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 <= 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 >= 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k = 0 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k) > 0 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k = 0 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k) > 0 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+
+        // row filter with indexed column
+        createIndex("CREATE INDEX ON %s (v1)");
+        test("SELECT * FROM %s WHERE v1 = 1");
+        test("SELECT * FROM %s WHERE v1 < 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 > 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 <= 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 >= 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k) > 0 AND v1 = 1");
+        test("SELECT * FROM %s WHERE k = 0 AND v1 = 1",
+             "SELECT * FROM %s WHERE token(k) >= token(0) AND token(k) <= token(0) AND v1 = 1");
+
+        // grouped partition-directed queries, maybe producing multiple queries
+        test("SELECT * FROM %s WHERE k IN (0)",
+             "SELECT * FROM %s WHERE k = 0");
+        test("SELECT * FROM %s WHERE k IN (0, 1)",
+             "SELECT * FROM %s WHERE k = 0",
+             "SELECT * FROM %s WHERE k = 1");
+    }
+
+    @Test
+    public void testSkinnyTableWithMulticolumnKey() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k1 int, k2 int, v1 int, v2 int, PRIMARY KEY((k1, k2)))");
+
+        // column selection on unrestricted partition range query
+        test("SELECT * FROM %s");
+        test("SELECT k1 FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT k2 FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT v1 FROM %s");
+        test("SELECT v2 FROM %s");
+        test("SELECT k1, k2, v1, v2 FROM %s",
+             "SELECT v1, v2 FROM %s");
+
+        // column selection on partition directed query
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT k1 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT k2 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT v1 FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT v2 FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT k1, k2, v1, v2 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT v1, v2 FROM %s WHERE k1 = 1 AND k2 = 2");
+
+        // token restrictions
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) < 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) >= 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) <= 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) = 0",
+             "SELECT * FROM %s WHERE token(k1, k2) >= 0 AND token(k1, k2) <= 0");
+
+        // row filter without indexed column
+        test("SELECT * FROM %s WHERE k1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND v2 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 = 2 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 = 2 AND v2 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 0 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 0 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 0 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+
+        // row filter with indexed column
+        createIndex("CREATE INDEX ON %s (k1)");
+        createIndex("CREATE INDEX ON %s (k2)");
+        createIndex("CREATE INDEX ON %s (v1)");
+        createIndex("CREATE INDEX ON %s (v2)");
+        test("SELECT * FROM %s WHERE k1 = 1");
+        test("SELECT * FROM %s WHERE k2 = 2");
+        test("SELECT * FROM %s WHERE v1 = 1");
+        test("SELECT * FROM %s WHERE v2 = 2");
+        test("SELECT * FROM %s WHERE k1 > 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 > 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 > 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v2 > 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND v2 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 = 2 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 = 2 AND v2 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND k1 = 1");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND k2 = 2");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v1 = 1");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND v1 = 1",
+             "SELECT * FROM %s WHERE token(k1, k2) >= token(1, 2) AND token(k1, k2) <= token(1, 2) AND v1 = 1");
+
+        // grouped partition-directed queries, maybe producing multiple queries
+        test("SELECT * FROM %s WHERE k1 IN (1) AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 IN (2)",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 IN (1) AND k2 IN (2)",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 IN (0, 1) AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 IN (2, 3)",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 3");
+        test("SELECT * FROM %s WHERE k1 IN (0, 1) AND k2 IN (2, 3)",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 3",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 3");
+    }
+
+    @Test
+    public void testWideTable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int, c int, v1 int, v2 int, s int static, PRIMARY KEY(k, c))");
+
+        // column selection on unrestricted partition range query
+        test("SELECT * FROM %s");
+        test("SELECT k FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT c FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT s FROM %s");
+        test("SELECT v1 FROM %s");
+        test("SELECT v2 FROM %s");
+        test("SELECT k, c, s, v1, v2 FROM %s",
+             "SELECT s, v1, v2 FROM %s");
+
+        // column selection on partition directed query
+        test("SELECT * FROM %s WHERE k = 0");
+        test("SELECT k FROM %s WHERE k = 0",
+             "SELECT * FROM %s WHERE k = 0");
+        test("SELECT s FROM %s WHERE k = 0");
+        test("SELECT v1 FROM %s WHERE k = 0");
+        test("SELECT v2 FROM %s WHERE k = 0");
+        test("SELECT k, c, s, v1, v2 FROM %s WHERE k = 0",
+             "SELECT s, v1, v2 FROM %s WHERE k = 0");
+
+        // clustering filters
+        test("SELECT * FROM %s WHERE k = 0 AND c = 1");
+        test("SELECT * FROM %s WHERE k = 0 AND c < 1");
+        test("SELECT * FROM %s WHERE k = 0 AND c > 1");
+        test("SELECT * FROM %s WHERE k = 0 AND c <= 1");
+        test("SELECT * FROM %s WHERE k = 0 AND c >= 1");
+        test("SELECT * FROM %s WHERE k = 0 AND c > 1 AND c <= 2");
+        test("SELECT * FROM %s WHERE k = 0 AND c >= 1 AND c < 2");
+
+        // token restrictions
+        test("SELECT * FROM %s WHERE token(k) > 0");
+        test("SELECT * FROM %s WHERE token(k) < 0");
+        test("SELECT * FROM %s WHERE token(k) >= 0");
+        test("SELECT * FROM %s WHERE token(k) <= 0");
+        test("SELECT * FROM %s WHERE token(k) = 0",
+             "SELECT * FROM %s WHERE token(k) >= 0 AND token(k) <= 0");
+
+        // row filter without indexed column
+        test("SELECT * FROM %s WHERE c = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE s = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k = 0 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k = 0 AND c = 1 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k) > 0 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k = 0 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k = 0 AND c = 1 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k) > 0 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k) > 0 AND c = 1 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+
+        // expression filter with indexed column
+        createIndex("CREATE INDEX ON %s (c)");
+        createIndex("CREATE INDEX ON %s (s)");
+        createIndex("CREATE INDEX ON %s (v1)");
+        test("SELECT * FROM %s WHERE c = 1");
+        test("SELECT * FROM %s WHERE v1 = 1");
+        test("SELECT * FROM %s WHERE s = 1");
+        test("SELECT * FROM %s WHERE v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k) > 0 AND v1 = 1");
+        test("SELECT * FROM %s WHERE k = 0 AND v1 = 1",
+             "SELECT * FROM %s WHERE token(k) >= token(0) AND token(k) <= token(0) AND v1 = 1");
+        test("SELECT * FROM %s WHERE k = 0 AND v1 = 1 AND c = 1",
+             "SELECT * FROM %s WHERE token(k) >= token(0) AND token(k) <= token(0) AND c = 1 AND v1 = 1 ALLOW FILTERING");
+
+        // grouped partition-directed queries, maybe producing multiple queries
+        test("SELECT * FROM %s WHERE k IN (0)",
+             "SELECT * FROM %s WHERE k = 0");
+        test("SELECT * FROM %s WHERE k IN (0, 1)",
+             "SELECT * FROM %s WHERE k = 0",
+             "SELECT * FROM %s WHERE k = 1");
+        test("SELECT * FROM %s WHERE k IN (0, 1) AND c = 0",
+             "SELECT * FROM %s WHERE k = 0 AND c = 0",
+             "SELECT * FROM %s WHERE k = 1 AND c = 0");
+        test("SELECT * FROM %s WHERE k IN (0, 1) AND c > 0",
+             "SELECT * FROM %s WHERE k = 0 AND c > 0",
+             "SELECT * FROM %s WHERE k = 1 AND c > 0");
+
+        // order by
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c",
+             "SELECT * FROM %s WHERE k = 0");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c ASC",
+             "SELECT * FROM %s WHERE k = 0");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c DESC");
+
+        // order by clustering filter
+        test("SELECT * FROM %s WHERE k = 0 AND c = 1 ORDER BY c",
+             "SELECT * FROM %s WHERE k = 0 AND c = 1");
+        test("SELECT * FROM %s WHERE k = 0 AND c = 1 ORDER BY c ASC",
+             "SELECT * FROM %s WHERE k = 0 AND c = 1");
+        test("SELECT * FROM %s WHERE k = 0 AND c = 1 ORDER BY c DESC");
+    }
+
+    @Test
+    public void testWideTableWithMulticolumnKey() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k1 int, k2 int, c1 int, c2 int, c3 int, v1 int, v2 int, PRIMARY KEY((k1, k2), c1, c2, c3))");
+
+        // column selection on unrestricted partition range query
+        test("SELECT * FROM %s");
+        test("SELECT k1 FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT k2 FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT c1 FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT c2 FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT c3 FROM %s",
+             "SELECT * FROM %s");
+        test("SELECT v1 FROM %s");
+        test("SELECT v2 FROM %s");
+        test("SELECT k1, k2, c1, c2, c3, v1, v2 FROM %s",
+             "SELECT v1, v2 FROM %s");
+
+        // column selection on partition directed query
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT k1 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT k2 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT c1 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT c2 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT v1 FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT v2 FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT k1, k2, c1, c2, v1, v2 FROM %s WHERE k1 = 1 AND k2 = 2",
+             "SELECT v1, v2 FROM %s WHERE k1 = 1 AND k2 = 2");
+
+        // clustering filters
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 < 1");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 > 1");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 <= 1");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 >= 1");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 > 1 AND c1 < 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 > 1 AND c1 <= 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 >= 1 AND c1 < 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 > 1 AND c1 < 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 < 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 > 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 <= 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 >= 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 > 2 AND c2 < 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 > 2 AND c2 <= 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 >= 2 AND c2 < 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 > 2 AND c2 < 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 = 3",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND (c1, c2, c3) = (1, 2, 3)");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 > 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 < 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 >= 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 <= 3");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 > 3 AND c3 < 4");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 > 3 AND c3 <= 4");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 >= 3 AND c3 < 4");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND c2 = 2 AND c3 >= 3 AND c3 <= 4");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND (c1, c2, c3) = (1, 2, 3)");
+
+        // token restrictions
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) < 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) >= 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) <= 0");
+        test("SELECT * FROM %s WHERE token(k1, k2) = 0",
+             "SELECT * FROM %s WHERE token(k1, k2) >= 0 AND token(k1, k2) <= 0");
+
+        // row filter without indexed column
+        test("SELECT * FROM %s WHERE k1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE c1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE c2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE c3 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v1 = 1 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND c1 = 1 AND v1 = 1 AND v2 = 2 ALLOW FILTERING");
+
+        // expression filter with indexed column
+        createIndex("CREATE INDEX ON %s (k1)");
+        createIndex("CREATE INDEX ON %s (k2)");
+        createIndex("CREATE INDEX ON %s (c1)");
+        createIndex("CREATE INDEX ON %s (c2)");
+        createIndex("CREATE INDEX ON %s (c3)");
+        createIndex("CREATE INDEX ON %s (v1)");
+        createIndex("CREATE INDEX ON %s (v2)");
+        test("SELECT * FROM %s WHERE k1 = 1");
+        test("SELECT * FROM %s WHERE k2 = 2");
+        test("SELECT * FROM %s WHERE c1 = 1");
+        test("SELECT * FROM %s WHERE c2 = 2");
+        test("SELECT * FROM %s WHERE c3 = 3");
+        test("SELECT * FROM %s WHERE v1 = 1");
+        test("SELECT * FROM %s WHERE v2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT * FROM %s WHERE c1 = 1 AND c2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE c1 = 1 AND c2 = 2 AND c3 = 3 ALLOW FILTERING",
+             "SELECT * FROM %s WHERE (c1, c2, c3) = (1, 2, 3) ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v1 = 1 AND v2 = 2 ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE token(k1, k2) > 0 AND v1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND v1 = 1",
+             "SELECT * FROM %s WHERE token(k1, k2) >= token(1, 2) AND token(k1, k2) <= token(1, 2) AND v1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 1 AND k2 = 2 AND c1 = 1 AND v1 = 1",
+             "SELECT * FROM %s WHERE token(k1, k2) >= token(1, 2) AND token(k1, k2) <= token(1, 2) AND c1 = 1 AND v1 = 1 ALLOW FILTERING");
+
+        // grouped partition-directed queries, maybe producing multiple queries
+        test("SELECT * FROM %s WHERE k1 IN (1) AND k2 IN (2)",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 IN (1, 2) AND k2 IN (3, 4)",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 3",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 4",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 3",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 4");
+        test("SELECT * FROM %s WHERE k1 IN (1, 2) AND k2 IN (3, 4) AND c1 = 0",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 3 AND c1 = 0",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 4 AND c1 = 0",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 3 AND c1 = 0",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 4 AND c1 = 0");
+        test("SELECT * FROM %s WHERE k1 IN (1, 2) AND k2 IN (3, 4) AND c1 > 0",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 3 AND c1 > 0",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 4 AND c1 > 0",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 3 AND c1 > 0",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 4 AND c1 > 0");
+        test("SELECT * FROM %s WHERE k1 IN (1, 2) AND k2 IN (3, 4) AND (c1, c2, c3) IN ((5, 6, 7), (8, 9, 10))",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 3 AND (c1, c2, c3) IN ((5, 6, 7), (8, 9, 10))",
+             "SELECT * FROM %s WHERE k1 = 1 AND k2 = 4 AND (c1, c2, c3) IN ((5, 6, 7), (8, 9, 10))",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 3 AND (c1, c2, c3) IN ((5, 6, 7), (8, 9, 10))",
+             "SELECT * FROM %s WHERE k1 = 2 AND k2 = 4 AND (c1, c2, c3) IN ((5, 6, 7), (8, 9, 10))");
+
+        // order by
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1 ASC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1 DESC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1 DESC, c2 DESC, c3 DESC");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1, c2",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1, c2 ASC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1 ASC, c2",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1 ASC, c2 ASC, c3 ASC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 ORDER BY c1 DESC, c2 DESC, c3 DESC");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1 ASC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1");
+
+        // order by clustering filter
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1 DESC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1 DESC, c2 DESC, c3 DESC");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1, c2",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1, c2 ASC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1 ASC, c2",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1 ASC, c2 ASC, c3 ASC",
+             "SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1");
+        test("SELECT * FROM %s WHERE k1 = 0 AND k2 = 2 AND c1 = 1 ORDER BY c1 DESC, c2 DESC, c3 DESC");
+    }
+
+    @Test
+    public void testQuotedNames() throws Throwable
+    {
+        createKeyspace("CREATE KEYSPACE \"K\" WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : 1 }");
+        createTable("CREATE TABLE \"K\".\"T\" (\"K\" int, \"C\" int, \"S\" int static, \"V\" int, PRIMARY KEY(\"K\", \"C\"))");
+
+        // column selection on unrestricted partition range query
+        test("SELECT * FROM \"K\".\"T\"");
+        test("SELECT \"K\" FROM \"K\".\"T\"",
+             "SELECT * FROM \"K\".\"T\"");
+        test("SELECT \"S\" FROM \"K\".\"T\"");
+        test("SELECT \"V\" FROM \"K\".\"T\"");
+        test("SELECT \"K\", \"C\", \"S\", \"V\" FROM \"K\".\"T\"",
+             "SELECT \"S\", \"V\" FROM \"K\".\"T\"");
+
+        // column selection on partition directed query
+        test("SELECT * FROM \"K\".\"T\" WHERE \"K\" = 0");
+        test("SELECT \"K\" FROM \"K\".\"T\" WHERE \"K\" = 0",
+             "SELECT * FROM \"K\".\"T\" WHERE \"K\" = 0");
+        test("SELECT \"S\" FROM \"K\".\"T\" WHERE \"K\" = 0");
+        test("SELECT \"V\" FROM \"K\".\"T\" WHERE \"K\" = 0");
+        test("SELECT \"K\", \"C\", \"S\", \"V\" FROM \"K\".\"T\" WHERE \"K\" = 0",
+             "SELECT \"S\", \"V\" FROM \"K\".\"T\" WHERE \"K\" = 0");
+
+        // filters
+        test("SELECT * FROM \"K\".\"T\" WHERE \"K\" = 0 AND \"C\" = 1");
+        test("SELECT * FROM \"K\".\"T\" WHERE \"K\" = 0 AND \"C\" > 1 AND \"C\" <= 2");
+        test("SELECT * FROM \"K\".\"T\" WHERE \"V\" = 0 ALLOW FILTERING");
+        test("SELECT * FROM \"K\".\"T\" WHERE \"S\" = 0 ALLOW FILTERING");
+        test("SELECT * FROM \"K\".\"T\" WHERE \"C\" = 0 ALLOW FILTERING");
+
+        // order by
+        test("SELECT * FROM \"K\".\"T\" WHERE \"K\" = 0 ORDER BY \"C\" DESC");
+        test("SELECT * FROM \"K\".\"T\" WHERE \"K\" = 0 AND \"C\" = 1 ORDER BY \"C\" DESC");
+    }
+
+    @Test
+    public void testLiterals() throws Throwable
+    {
+        // skinny table
+        createTable("CREATE TABLE %s (k text, c text, v text, PRIMARY KEY(k, c))");
+        test("SELECT * FROM %s WHERE k = 'A'");
+        test("SELECT * FROM %s WHERE c = 'A' ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE v = 'A' ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k = 'A' AND c = 'B'");
+        test("SELECT * FROM %s WHERE k = 'A' AND v = 'B' ALLOW FILTERING");
+
+        // wide table
+        createTable("CREATE TABLE %s (k1 text, k2 text, c1 text, c2 text, v text, PRIMARY KEY((k1, k2), c1, c2))");
+        test("SELECT * FROM %s WHERE k1 = 'A' ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k2 = 'A' ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE c1 = 'A' ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE c2 = 'A' ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B'");
+        test("SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B' AND c1 = 'C'");
+        test("SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B' AND c1 > 'C'");
+        test("SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B' AND c1 > 'C' AND c1 <= 'D'");
+        test("SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B' AND c1 = 'C' AND c2 = 'D'",
+             "SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B' AND (c1, c2) = ('C', 'D')");
+        test("SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B' AND c1 = 'C' AND c2 > 'D'");
+        test("SELECT * FROM %s WHERE k1 = 'A' AND k2 = 'B' AND c1 = 'C' AND c2 > 'D' AND c2 <= 'E'");
+    }
+
+    @Test
+    public void testWideTableWithClusteringOrder() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int, c1 int, c2 int, c3 int, PRIMARY KEY(k, c1, c2, c3)) WITH CLUSTERING ORDER BY (c1 DESC, c2 ASC, c3 DESC)");
+
+        // one column
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1",
+             "SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC",
+             "SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1 DESC",
+             "SELECT * FROM %s WHERE k = 0");
+
+        // two columns
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1, c2 DESC",
+             "SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC",
+             "SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1 DESC, c2 ASC",
+             "SELECT * FROM %s WHERE k = 0");
+
+        // three columns
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1, c2 DESC, c3 ASC",
+             "SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1, c2 DESC, c3 ASC",
+             "SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC",
+             "SELECT * FROM %s WHERE k = 0 ORDER BY c1 ASC, c2 DESC, c3 ASC");
+        test("SELECT * FROM %s WHERE k = 0 ORDER BY c1 DESC, c2 ASC, c3 DESC",
+             "SELECT * FROM %s WHERE k = 0");
+    }
+
+    @Test
+    public void testCollections() throws Throwable
+    {
+        String udt = createType("CREATE TYPE %s (a text, b int)");
+        createTable("CREATE TABLE %s (" +
+                    "k int PRIMARY KEY, " +
+                    "l list<text>, " +
+                    "s set<text>, " +
+                    "m map<text, text>, " +
+                    "t tuple<text, int>, " +
+                    "u " + udt + ")");
+
+        // column selections
+        test("SELECT l FROM %s");
+        test("SELECT s FROM %s");
+        test("SELECT m FROM %s");
+        test("SELECT t FROM %s");
+        test("SELECT u FROM %s");
+        testInvalid("SELECT l['a'] FROM %s");
+        test("SELECT s['a'] FROM %s");
+        test("SELECT m['a'] FROM %s");
+        test("SELECT u.a FROM %s",
+             "SELECT u FROM %s");
+        test("SELECT m['a'], m['b'], s['c'], s['d'], t, u.a, u.b FROM %s",
+             "SELECT m['a'], m['b'], s['c'], s['d'], t, u FROM %s");
+
+        // filtering
+        testInvalid("SELECT * FROM %s WHERE l = ['a', 'b'] ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE s = {'a', 'b'} ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE m = {'a': 'b', 'c': 'd'} ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE t = ('a', 1) ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE u = {a: 'a', b: 1} ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE l['a'] = 'b' ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE s['a'] = 'b' ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE m['a'] = 'b' ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE u.a = 'a' ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE u.b = 0 ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE u.a = 'a' ANd u.b = 0 ALLOW FILTERING");
+    }
+
+    @Test
+    public void testFrozenCollections() throws Throwable
+    {
+        String udt = createType("CREATE TYPE %s (a text, b int)");
+        createTable("CREATE TABLE %s (" +
+                    "k int PRIMARY KEY, " +
+                    "l frozen<list<text>>, " +
+                    "s frozen<set<text>>, " +
+                    "m frozen<map<text, text>>, " +
+                    "t frozen<tuple<text, int>>, " +
+                    "u frozen<" + udt + ">)");
+
+        // column selections
+        test("SELECT l FROM %s");
+        test("SELECT s FROM %s");
+        test("SELECT m FROM %s");
+        test("SELECT t FROM %s");
+        test("SELECT u FROM %s");
+        testInvalid("SELECT l['a'] FROM %s");
+        test("SELECT s['a'] FROM %s",
+             "SELECT s FROM %s");
+        test("SELECT m['a'] FROM %s",
+             "SELECT m FROM %s");
+        test("SELECT u.a FROM %s",
+             "SELECT u FROM %s");
+        test("SELECT m['a'], m['b'], s['c'], s['d'], t, u.a, u.b FROM %s",
+             "SELECT m, s, t, u FROM %s");
+
+        // filtering
+        test("SELECT * FROM %s WHERE l = ['a', 'b'] ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE s = {'a', 'b'} ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE m = {'a': 'b', 'c': 'd'} ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE t = ('a', 1) ALLOW FILTERING");
+        test("SELECT * FROM %s WHERE u = {a: 'a', b: 1} ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE l['a'] = 'a' ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE s['a'] = 'a' ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE m['a'] = 'a' ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE u.a = 'a' ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE u.b = 0 ALLOW FILTERING");
+        testInvalid("SELECT * FROM %s WHERE u.a = 'a' ANd u.b = 0 ALLOW FILTERING");
+    }
+
+    @Test
+    public void testVirtualTable() throws Throwable
+    {
+        TableMetadata metadata =
+        TableMetadata.builder("vk", "vt")
+                     .kind(TableMetadata.Kind.VIRTUAL)
+                     .addPartitionKeyColumn("k", Int32Type.instance)
+                     .addClusteringColumn("c", Int32Type.instance)
+                     .addRegularColumn("v", Int32Type.instance)
+                     .addStaticColumn("s", Int32Type.instance)
+                     .build();
+        SimpleDataSet data = new SimpleDataSet(metadata);
+        VirtualTable table = new AbstractVirtualTable(metadata)
+        {
+            public DataSet data()
+            {
+                return data;
+            }
+        };
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace("vk", ImmutableList.of(table)));
+
+        // column selection on unrestricted partition range query
+        test("SELECT * FROM vk.vt");
+        test("SELECT k FROM vk.vt",
+             "SELECT * FROM vk.vt");
+        test("SELECT c FROM vk.vt",
+             "SELECT * FROM vk.vt");
+        test("SELECT s FROM vk.vt");
+        test("SELECT v FROM vk.vt");
+        test("SELECT k, c, s, v FROM vk.vt",
+             "SELECT s, v FROM vk.vt");
+
+        // column selection on partition directed query
+        test("SELECT * FROM vk.vt WHERE k = 1");
+        test("SELECT k FROM vk.vt WHERE k = 1",
+             "SELECT * FROM vk.vt WHERE k = 1");
+        test("SELECT c FROM vk.vt WHERE k = 1",
+             "SELECT * FROM vk.vt WHERE k = 1");
+        test("SELECT v FROM vk.vt WHERE k = 1");
+        test("SELECT s FROM vk.vt WHERE k = 1");
+        test("SELECT k, c, s, v FROM vk.vt WHERE k = 1",
+             "SELECT s, v FROM vk.vt WHERE k = 1");
+
+        // clustering filters
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c = 1");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c < 1");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c > 1");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c <= 1");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c >= 1");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c > 1 AND c <= 2");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c >= 1 AND c < 2");
+
+        // token restrictions
+        test("SELECT * FROM vk.vt WHERE token(k) > 0");
+        test("SELECT * FROM vk.vt WHERE token(k) < 0");
+        test("SELECT * FROM vk.vt WHERE token(k) >= 0");
+        test("SELECT * FROM vk.vt WHERE token(k) <= 0");
+        test("SELECT * FROM vk.vt WHERE token(k) = 0",
+             "SELECT * FROM vk.vt WHERE token(k) >= 0 AND token(k) <= 0");
+
+        // row filters
+        test("SELECT * FROM vk.vt WHERE c = 1 ALLOW FILTERING");
+        test("SELECT * FROM vk.vt WHERE s = 1 ALLOW FILTERING");
+        test("SELECT * FROM vk.vt WHERE v = 1 ALLOW FILTERING");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND v = 1 ALLOW FILTERING");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c = 1 AND v = 1 ALLOW FILTERING");
+        test("SELECT * FROM vk.vt WHERE token(k) > 0 AND v = 1 ALLOW FILTERING");
+        test("SELECT * FROM vk.vt WHERE token(k) > 0 AND c = 1 AND v = 1 ALLOW FILTERING");
+
+        // grouped partition-directed queries, maybe producing multiple queries
+        test("SELECT * FROM vk.vt WHERE k IN (0)",
+             "SELECT * FROM vk.vt WHERE k = 0");
+        test("SELECT * FROM vk.vt WHERE k IN (0, 1)",
+             "SELECT * FROM vk.vt WHERE k = 0",
+             "SELECT * FROM vk.vt WHERE k = 1");
+        test("SELECT * FROM vk.vt WHERE k IN (0, 1) AND c = 0",
+             "SELECT * FROM vk.vt WHERE k = 0 AND c = 0",
+             "SELECT * FROM vk.vt WHERE k = 1 AND c = 0");
+        test("SELECT * FROM vk.vt WHERE k IN (0, 1) AND c > 0",
+             "SELECT * FROM vk.vt WHERE k = 0 AND c > 0",
+             "SELECT * FROM vk.vt WHERE k = 1 AND c > 0");
+
+        // order by
+        test("SELECT * FROM vk.vt WHERE k = 0 ORDER BY c",
+             "SELECT * FROM vk.vt WHERE k = 0");
+        test("SELECT * FROM vk.vt WHERE k = 0 ORDER BY c ASC",
+             "SELECT * FROM vk.vt WHERE k = 0");
+        test("SELECT * FROM vk.vt WHERE k = 0 ORDER BY c DESC");
+
+        // order by clustering filter
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c = 1 ORDER BY c",
+             "SELECT * FROM vk.vt WHERE k = 0 AND c = 1");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c = 1 ORDER BY c ASC",
+             "SELECT * FROM vk.vt WHERE k = 0 AND c = 1");
+        test("SELECT * FROM vk.vt WHERE k = 0 AND c = 1 ORDER BY c DESC");
+    }
+
+    private List<String> toCQLString(String query)
+    {
+        String fullQuery = formatQuery(query);
+        ClientState state = ClientState.forInternalCalls();
+        CQLStatement statement = QueryProcessor.getStatement(fullQuery, state);
+
+        assertTrue(statement instanceof SelectStatement);
+        SelectStatement select = (SelectStatement) statement;
+
+        QueryOptions options = QueryOptions.forInternalCalls(Collections.emptyList());
+        ReadQuery readQuery = select.getQuery(options, FBUtilities.nowInSeconds());
+
+        if (readQuery instanceof SinglePartitionReadCommand.Group)
+        {
+            SinglePartitionReadCommand.Group group = (SinglePartitionReadCommand.Group) readQuery;
+            return group.queries.stream().map(AbstractReadQuery::toCQLString).collect(Collectors.toList());
+        }
+        else
+        {
+            assertTrue(readQuery instanceof AbstractReadQuery);
+            return Collections.singletonList(((AbstractReadQuery) readQuery).toCQLString());
+        }
+    }
+
+    private void test(String query) throws Throwable
+    {
+        test(query, query);
+    }
+
+    private void test(String query, String... expected) throws Throwable
+    {
+        List<String> actual = toCQLString(query);
+        List<String> fullExpected = Stream.of(expected)
+                                          .map(this::formatQuery)
+                                          .map(s -> s.endsWith(" ALLOW FILTERING") ? s : s + " ALLOW FILTERING")
+                                          .collect(Collectors.toList());
+        assertEquals(fullExpected, actual);
+
+        // execute both the expected output commands to verify that they are valid CQL
+        for (String q : expected)
+            execute(q);
+    }
+
+    private void testInvalid(String query) throws Throwable
+    {
+        assertInvalidThrow(RequestValidationException.class, query);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/CellSpecTest.java b/test/unit/org/apache/cassandra/db/CellSpecTest.java
index 4cc886d..3387c78 100644
--- a/test/unit/org/apache/cassandra/db/CellSpecTest.java
+++ b/test/unit/org/apache/cassandra/db/CellSpecTest.java
@@ -22,7 +22,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.function.BiConsumer;
 import java.util.stream.Collectors;
 
@@ -40,13 +39,15 @@
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ObjectSizes;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.memory.NativeAllocator;
 import org.apache.cassandra.utils.memory.NativePool;
-import org.assertj.core.api.Assertions;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 @RunWith(Parameterized.class)
 public class CellSpecTest
@@ -60,6 +61,28 @@
     }
 
     @Test
+    public void unsharedHeapSize()
+    {
+        long empty = ObjectSizes.measure(cell);
+        long actual = ObjectSizes.measureDeep(cell);
+        long expected;
+        if (cell instanceof NativeCell)
+        {
+            // NativeCell stores the contents off-heap, so the cost on-heap is just the object's empty case
+            expected = empty;
+        }
+        else
+        {
+            expected = empty + valueSizeOnHeapOf(cell.value());
+            if (cell.path() != null)
+                expected += cell.path().unsharedHeapSize();
+        }
+
+        assertThat(expected).isEqualTo(actual);
+        assertThat(cell.unsharedHeapSize()).isEqualTo(expected);
+    }
+
+    @Test
     public void unsharedHeapSizeExcludingData()
     {
         long empty = ObjectSizes.measure(cell);
@@ -77,10 +100,24 @@
                 expected += cell.path().unsharedHeapSizeExcludingData();
         }
 
-        Assertions.assertThat(cell.unsharedHeapSizeExcludingData())
+        assertThat(cell.unsharedHeapSizeExcludingData())
                   .isEqualTo(expected);
     }
 
+    private long valueSizeOnHeapOf(Object value)
+    {
+        if (value instanceof ByteBuffer)
+        {
+            ByteBuffer bb = (ByteBuffer) value;
+            return ObjectSizes.sizeOnHeapOf(bb);
+        }
+        else if (value instanceof byte[])
+        {
+            return ObjectSizes.sizeOfArray((byte[]) value);
+        }
+        throw new IllegalArgumentException("Unsupported type: " + value.getClass());
+    }
+
     private static long valuePtrSize(Object value)
     {
         if (value instanceof ByteBuffer)
@@ -98,8 +135,8 @@
 
         byte[] rawBytes = { 0, 1, 2, 3, 4, 5, 6 };
         ByteBuffer bbBytes = ByteBuffer.wrap(rawBytes);
-        NativePool pool = new NativePool(1024, 1024, 1, () -> CompletableFuture.completedFuture(true));
-        NativeAllocator allocator = pool.newAllocator();
+        NativePool pool = new NativePool(1024, 1024, 1, () -> ImmediateFuture.success(true));
+        NativeAllocator allocator = pool.newAllocator(null);
         OpOrder order = new OpOrder();
 
         List<Cell<?>> tests = new ArrayList<>();
@@ -113,7 +150,7 @@
 
         // complex
         // seems NativeCell does not allow CellPath.TOP, or CellPath.BOTTOM
-        fn.accept(ColumnMetadata.regularColumn(table, bytes("complex"), ListType.getInstance(BytesType.instance, true)), CellPath.create(bytes(UUIDGen.getTimeUUID())));
+        fn.accept(ColumnMetadata.regularColumn(table, bytes("complex"), ListType.getInstance(BytesType.instance, true)), CellPath.create(TimeUUID.Serializer.instance.serialize(nextTimeUUID())));
 
         return tests.stream().map(a -> new Object[] {a.getClass().getSimpleName() + ":" + (a.path() == null ? "simple" : "complex"), a}).collect(Collectors.toList());
     }
diff --git a/test/unit/org/apache/cassandra/db/CellTest.java b/test/unit/org/apache/cassandra/db/CellTest.java
index d4dec05..4100c54 100644
--- a/test/unit/org/apache/cassandra/db/CellTest.java
+++ b/test/unit/org/apache/cassandra/db/CellTest.java
@@ -19,16 +19,16 @@
 package org.apache.cassandra.db;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
 import java.util.List;
 
-import com.google.common.collect.Lists;
-
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQL3Type;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.FieldIdentifier;
 import org.apache.cassandra.db.marshal.*;
@@ -39,9 +39,8 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
 
-import static java.util.Arrays.*;
+import static java.util.Arrays.asList;
 
 public class CellTest
 {
@@ -103,6 +102,26 @@
         }
     }
 
+    @Test
+    public void testUnmarshallableInMulticellCollection()
+    {
+        List<CQL3Type.Native> unmarshallableTypes = new ArrayList<>();
+        for (CQL3Type.Native nativeType : CQL3Type.Native.values())
+        {
+            ColumnMetadata c = fakeColumn("c", MapType.getInstance(Int32Type.instance, nativeType.getType(), true));
+            BufferCell cell = BufferCell.tombstone(c, 0, 4, CellPath.create(ByteBufferUtil.bytes(4)));
+            try
+            {
+                Assert.assertEquals("expected #toString failed for type " + nativeType, "[c[4]=<tombstone> ts=0 ldt=4]", cell.toString());
+            }
+            catch (MarshalException m)
+            {
+                unmarshallableTypes.add(nativeType);
+            }
+        }
+        Assert.assertTrue(unmarshallableTypes.isEmpty());
+    }
+
     private void assertValid(Cell<?> cell)
     {
         try
diff --git a/test/unit/org/apache/cassandra/db/CleanupTest.java b/test/unit/org/apache/cassandra/db/CleanupTest.java
index f59bdd6..d82eef8 100644
--- a/test/unit/org/apache/cassandra/db/CleanupTest.java
+++ b/test/unit/org/apache/cassandra/db/CleanupTest.java
@@ -56,6 +56,7 @@
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -157,8 +158,8 @@
 
         ColumnMetadata cdef = cfs.metadata().getColumn(COLUMN);
         String indexName = "birthdate_key_index";
-        long start = System.nanoTime();
-        while (!cfs.getBuiltIndexes().contains(indexName) && System.nanoTime() - start < TimeUnit.SECONDS.toNanos(10))
+        long start = nanoTime();
+        while (!cfs.getBuiltIndexes().contains(indexName) && nanoTime() - start < TimeUnit.SECONDS.toNanos(10))
             Thread.sleep(10);
 
         RowFilter cf = RowFilter.create();
@@ -285,7 +286,7 @@
             .add("val", VALUE)
             .build()
             .applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         Set<SSTableReader> beforeFirstCleanup = Sets.newHashSet(cfs.getLiveSSTables());
@@ -434,7 +435,7 @@
                     .applyUnsafe();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     protected List<Long> getMaxTimestampList(ColumnFamilyStore cfs)
diff --git a/test/unit/org/apache/cassandra/db/CleanupTransientTest.java b/test/unit/org/apache/cassandra/db/CleanupTransientTest.java
index 9789183..d611bfa 100644
--- a/test/unit/org/apache/cassandra/db/CleanupTransientTest.java
+++ b/test/unit/org/apache/cassandra/db/CleanupTransientTest.java
@@ -46,7 +46,6 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
 
 public class CleanupTransientTest
 {
@@ -182,7 +181,7 @@
                     .applyUnsafe();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     protected List<Long> getMaxTimestampList(ColumnFamilyStore cfs)
diff --git a/test/unit/org/apache/cassandra/db/ClusteringHeapSizeTest.java b/test/unit/org/apache/cassandra/db/ClusteringHeapSizeTest.java
index 54d0ce1..e97f067 100644
--- a/test/unit/org/apache/cassandra/db/ClusteringHeapSizeTest.java
+++ b/test/unit/org/apache/cassandra/db/ClusteringHeapSizeTest.java
@@ -20,13 +20,13 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.concurrent.CompletableFuture;
 
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
 import org.apache.cassandra.utils.ObjectSizes;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.memory.NativePool;
 import org.assertj.core.api.Assertions;
@@ -45,12 +45,6 @@
     public void unsharedHeap()
     {
         long measureDeep = ObjectSizes.measureDeep(clustering);
-        if (clustering instanceof BufferClustering)
-        {
-            // jamm (used in measureDeep) uses .remaining() where as .sizeOnHeapOf() done in unsharedHeapSize actually looks at memory cost
-            // without assuming the array is shared (unless capacity > remaining); so account for that
-            measureDeep += ObjectSizes.measureDeep(new byte[0]);
-        }
         long unsharedHeapSize = clustering.unsharedHeapSize();
 
         double allowedDiff = 0.1; // 10% is seen as "close enough"
@@ -70,7 +64,7 @@
     @Parameterized.Parameters(name = "{0}")
     public static Collection<Object[]> data() {
         byte[] rawBytes = { 0, 1, 2, 3, 4, 5, 6 };
-        NativePool pool = new NativePool(1024, 1024, 1, () -> CompletableFuture.completedFuture(true));
+        NativePool pool = new NativePool(1024, 1024, 1, () -> ImmediateFuture.success(true));
         OpOrder order = new OpOrder();
 
         ArrayClustering array = ArrayClustering.make(rawBytes);
@@ -78,7 +72,7 @@
         return Arrays.asList(new Object[][] {
         { array },
         { buffer },
-        { new NativeClustering(pool.newAllocator(), order.getCurrent(), array)}
+        { new NativeClustering(pool.newAllocator(null), order.getCurrent(), array)}
         });
     }
 }
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java
index 0ba7cee..75e311e 100644
--- a/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java
+++ b/test/unit/org/apache/cassandra/db/ColumnFamilyMetricTest.java
@@ -60,7 +60,7 @@
         // late - after the whole system is already running, and some static fields may remain uninitialized
         // OTOH, late initialization of them may have creepy effects (for example NPEs in static initializers)
         // disclaimer: this is not a proper way to fix that
-        StorageService.instance.forceKeyspaceFlush(SchemaConstants.SYSTEM_KEYSPACE_NAME);
+        StorageService.instance.forceKeyspaceFlush(SchemaConstants.SYSTEM_KEYSPACE_NAME, ColumnFamilyStore.FlushReason.UNIT_TESTS);
     }
 
     @Test
@@ -79,7 +79,7 @@
         {
             applyMutation(cfs.metadata(), String.valueOf(j), ByteBufferUtil.EMPTY_BYTE_BUFFER, FBUtilities.timestampMicros());
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Collection<SSTableReader> sstables = cfs.getLiveSSTables();
         long size = 0;
         for (SSTableReader reader : sstables)
@@ -161,7 +161,7 @@
             applyMutation(store.metadata(), "1", bytes(1), FBUtilities.timestampMicros());
 
             // Flushing first SSTable
-            store.forceBlockingFlush();
+            Util.flush(store);
 
             long[] estimatedColumnCountHistogram = store.metric.estimatedColumnCountHistogram.getValue();
             assertNumberOfNonZeroValue(estimatedColumnCountHistogram, 1);
@@ -174,7 +174,7 @@
             applyMutation(store.metadata(), "2", bytes(2), FBUtilities.timestampMicros());
 
             // Flushing second SSTable
-            store.forceBlockingFlush();
+            Util.flush(store);
 
             estimatedColumnCountHistogram = store.metric.estimatedColumnCountHistogram.getValue();
             assertNumberOfNonZeroValue(estimatedColumnCountHistogram, 1);
diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreMBeanTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreMBeanTest.java
new file mode 100644
index 0000000..8d15f67
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreMBeanTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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;
+
+import java.util.Arrays;
+import java.util.Random;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.dht.ByteOrderedPartitioner;
+import org.apache.cassandra.dht.IPartitioner;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.OrderPreservingPartitioner;
+import org.apache.cassandra.dht.RandomPartitioner;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.assertj.core.api.Assertions;
+import org.mockito.Mockito;
+import org.quicktheories.core.Gen;
+import org.quicktheories.impl.Constraint;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.quicktheories.QuickTheory.qt;
+
+public class ColumnFamilyStoreMBeanTest
+{
+    @BeforeClass
+    public static void setup()
+    {
+        // can't use client due to the fact thread pools startup and fail due to config issues
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    @Test
+    public void testToTokenRangesMurmur3Partitioner()
+    {
+        testToTokenRanges(Murmur3Partitioner.instance);
+    }
+
+    @Test
+    public void testToTokenRangesRandomPartitioner()
+    {
+        testToTokenRanges(RandomPartitioner.instance);
+    }
+
+    @Test
+    public void testToTokenRangesOrderPreservingPartitioner()
+    {
+        testToTokenRanges(OrderPreservingPartitioner.instance);
+    }
+
+    @Test
+    public void testToTokenRangesByteOrderedPartitioner()
+    {
+        testToTokenRanges(ByteOrderedPartitioner.instance);
+    }
+
+    @Test
+    public void testInvalidateTokenRangesFormat()
+    {
+        ColumnFamilyStore store = Mockito.mock(ColumnFamilyStore.class);
+        Mockito.doCallRealMethod().when(store).forceCompactionForTokenRanges(Mockito.any());
+        IPartitioner previous = DatabaseDescriptor.getPartitioner();
+        try
+        {
+            DatabaseDescriptor.setPartitionerUnsafe(ByteOrderedPartitioner.instance);
+
+            for (String s : Arrays.asList("testing", "t1:", ":t2", "spaces should not have an impact"))
+                Assertions.assertThatThrownBy(() -> store.forceCompactionForTokenRanges(s))
+                          .hasMessageStartingWith(String.format("Unable to parse token range %s;", s));
+        }
+        finally
+        {
+            DatabaseDescriptor.setPartitionerUnsafe(previous);
+        }
+
+    }
+
+    private static void testToTokenRanges(IPartitioner partitioner)
+    {
+        Token.TokenFactory tokenFactory = partitioner.getTokenFactory();
+        Gen<Token> tokenGen = tokenGen(partitioner);
+        qt().forAll(tokenGen, tokenGen)
+            .checkAssert((left, right) ->
+                         assertThat(ColumnFamilyStore.toTokenRanges(partitioner, toString(tokenFactory, left, right)))
+                         .isEqualTo(ImmutableSet.of(new Range<>(left, right))));
+    }
+
+    private static String toString(Token.TokenFactory tokenFactory, Token left, Token right)
+    {
+        return tokenFactory.toString(left) + ColumnFamilyStore.TOKEN_DELIMITER + tokenFactory.toString(right);
+    }
+
+    private static Gen<Token> tokenGen(IPartitioner partitioner)
+    {
+        // Random and RandomSource can not share the same seed, but there is a workaround...
+        // use RandomSource to generate a seed!
+        return rs -> partitioner.getRandomToken(new Random(rs.next(Constraint.none())));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
index b1c6599..4d871fc 100644
--- a/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
+++ b/test/unit/org/apache/cassandra/db/ColumnFamilyStoreTest.java
@@ -18,56 +18,83 @@
 */
 package org.apache.cassandra.db;
 
-import java.io.File;
-import java.io.FileReader;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.*;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
 
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.Iterators;
 import org.junit.Assert;
 import org.junit.Before;
-import org.junit.Assume;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
-import org.apache.cassandra.utils.Pair;
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-import com.google.common.collect.Iterators;
-import org.apache.cassandra.*;
+import com.googlecode.concurrenttrees.common.Iterables;
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.UpdateBuilder;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.Operator;
+import org.apache.cassandra.db.ColumnFamilyStore.FlushReason;
+import org.apache.cassandra.db.commitlog.CommitLogPosition;
+import org.apache.cassandra.db.filter.ColumnFilter;
+import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.db.lifecycle.SSTableSet;
-import org.apache.cassandra.db.rows.*;
-import org.apache.cassandra.db.partitions.*;
+import org.apache.cassandra.db.memtable.AbstractMemtable;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.partitions.FilteredPartition;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.EncodingStats;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.index.transactions.UpdateTransaction;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
-import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.metrics.ClearableHistogram;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.service.reads.SpeculativeRetryPolicy;
+import org.apache.cassandra.service.snapshot.SnapshotManifest;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.WrappedRunnable;
-import static junit.framework.Assert.assertNotNull;
+import org.apache.cassandra.utils.concurrent.OpOrder.Barrier;
+import org.apache.cassandra.utils.concurrent.OpOrder.Group;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 
 public class ColumnFamilyStoreTest
 {
     public static final String KEYSPACE1 = "ColumnFamilyStoreTest1";
     public static final String KEYSPACE2 = "ColumnFamilyStoreTest2";
+    public static final String KEYSPACE3 = "ColumnFamilyStoreTest3";
     public static final String CF_STANDARD1 = "Standard1";
     public static final String CF_STANDARD2 = "Standard2";
     public static final String CF_INDEX1 = "Indexed1";
+    public static final String CF_SPEC_RETRY1 = "SpeculativeRetryTest1";
 
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
@@ -81,6 +108,11 @@
         SchemaLoader.createKeyspace(KEYSPACE2,
                                     KeyspaceParams.simple(1),
                                     SchemaLoader.standardCFMD(KEYSPACE2, CF_STANDARD1));
+        SchemaLoader.createKeyspace(KEYSPACE3,
+                                    KeyspaceParams.simple(1),
+                                    SchemaLoader.standardCFMD(KEYSPACE3, CF_SPEC_RETRY1)
+                                                .speculativeRetry(SpeculativeRetryPolicy.fromString("50PERCENTILE"))
+                                                .additionalWritePolicy(SpeculativeRetryPolicy.fromString("75PERCENTILE")));
     }
 
     @Before
@@ -88,16 +120,15 @@
     {
         Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1).truncateBlocking();
         Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD2).truncateBlocking();
+        Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_INDEX1).truncateBlocking();
         Keyspace.open(KEYSPACE2).getColumnFamilyStore(CF_STANDARD1).truncateBlocking();
     }
 
     @Test
     public void testMemtableTimestamp() throws Throwable
     {
-        assertEquals(Memtable.NO_MIN_TIMESTAMP,
-                     (new Memtable(Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1).metadata(),
-                                   EncodingStats.NO_STATS.minTimestamp))
-                     .getMinTimestamp());
+        ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1);
+        assertEquals(Memtable.NO_MIN_TIMESTAMP, fakeMemTableWithMinTS(cfs, EncodingStats.NO_STATS.minTimestamp).getMinTimestamp());
     }
 
     @Test
@@ -112,14 +143,14 @@
                 .add("val", "asdf")
                 .build()
                 .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, "key1")
                 .clustering("Column1")
                 .add("val", "asdf")
                 .build()
                 .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         ((ClearableHistogram)cfs.metric.sstablesPerReadHistogram.cf).clear(); // resets counts
         Util.getAll(Util.cmd(cfs, "key1").includeRow("c1").build());
@@ -189,7 +220,7 @@
         assertRangeCount(cfs, col, val, 2);
 
         // flush.
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // insert, don't flush
         new RowUpdateBuilder(cfs.metadata(), 1, "key3").clustering("Column1").add("val", "val1").build().applyUnsafe();
@@ -204,7 +235,7 @@
         assertRangeCount(cfs, col, val, 2);
 
         // flush
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // re-verify delete. // first breakage is right here because of CASSANDRA-1837.
         assertRangeCount(cfs, col, val, 2);
@@ -222,18 +253,13 @@
         assertRangeCount(cfs, col, val, 4);
 
         // and it remains so after flush. (this wasn't failing before, but it's good to check.)
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertRangeCount(cfs, col, val, 4);
     }
 
     @Test
     public void testClearEphemeralSnapshots() throws Throwable
     {
-        // We don't do snapshot-based repair on Windows so we don't have ephemeral snapshots from repair that need clearing.
-        // This test will fail as we'll revert to the WindowsFailedSnapshotTracker and counts will be off, but since we
-        // don't do snapshot-based repair on Windows, we just skip this test.
-        Assume.assumeTrue(!FBUtilities.isWindows);
-
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_INDEX1);
 
         //cleanup any previous test gargbage
@@ -251,14 +277,14 @@
         cfs.snapshot("nonEphemeralSnapshot", null, false, false);
         cfs.snapshot("ephemeralSnapshot", null, true, false);
 
-        Map<String, Directories.SnapshotSizeDetails> snapshotDetails = cfs.getSnapshotDetails();
+        Map<String, TableSnapshot> snapshotDetails = cfs.listSnapshots();
         assertEquals(2, snapshotDetails.size());
         assertTrue(snapshotDetails.containsKey("ephemeralSnapshot"));
         assertTrue(snapshotDetails.containsKey("nonEphemeralSnapshot"));
 
         ColumnFamilyStore.clearEphemeralSnapshots(cfs.getDirectories());
 
-        snapshotDetails = cfs.getSnapshotDetails();
+        snapshotDetails = cfs.listSnapshots();
         assertEquals(1, snapshotDetails.size());
         assertTrue(snapshotDetails.containsKey("nonEphemeralSnapshot"));
 
@@ -267,7 +293,7 @@
     }
 
     @Test
-    public void testSnapshotSize()
+    public void testSnapshotSize() throws IOException
     {
         // cleanup any previous test gargbage
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1);
@@ -279,20 +305,20 @@
         .add("val", "asdf")
         .build()
         .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // snapshot
         cfs.snapshot("basic", null, false, false);
 
         // check snapshot was created
-        Map<String, Directories.SnapshotSizeDetails> snapshotDetails = cfs.getSnapshotDetails();
+        Map<String, TableSnapshot> snapshotDetails = cfs.listSnapshots();
         assertThat(snapshotDetails).hasSize(1);
         assertThat(snapshotDetails).containsKey("basic");
 
         // check that sizeOnDisk > trueSize = 0
-        Directories.SnapshotSizeDetails details = snapshotDetails.get("basic");
-        assertThat(details.sizeOnDiskBytes).isGreaterThan(details.dataSizeBytes);
-        assertThat(details.dataSizeBytes).isZero();
+        TableSnapshot details = snapshotDetails.get("basic");
+        assertThat(details.computeSizeOnDiskBytes()).isGreaterThan(details.computeTrueSizeBytes());
+        assertThat(details.computeTrueSizeBytes()).isEqualTo(getSnapshotManifestAndSchemaFileSizes(details));
 
         // compact base table to make trueSize > 0
         cfs.forceMajorCompaction();
@@ -300,10 +326,9 @@
 
         // sizeOnDisk > trueSize because trueSize does not include manifest.json
         // Check that truesize now is > 0
-        snapshotDetails = cfs.getSnapshotDetails();
+        snapshotDetails = cfs.listSnapshots();
         details = snapshotDetails.get("basic");
-        assertThat(details.sizeOnDiskBytes).isGreaterThan(details.dataSizeBytes);
-        assertThat(details.dataSizeBytes).isPositive();
+        assertThat(details.computeSizeOnDiskBytes()).isEqualTo(details.computeTrueSizeBytes());
     }
 
     @Test
@@ -311,20 +336,63 @@
     {
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE2).getColumnFamilyStore(CF_STANDARD1);
         new RowUpdateBuilder(cfs.metadata(), 0, ByteBufferUtil.bytes("key1")).clustering("Column1").add("val", "asdf").build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         new RowUpdateBuilder(cfs.metadata(), 0, ByteBufferUtil.bytes("key2")).clustering("Column1").add("val", "asdf").build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
-        for (int version = 1; version <= 2; ++version)
+        for (SSTableReader liveSSTable : cfs.getLiveSSTables())
         {
-            Descriptor existing = new Descriptor(cfs.getDirectories().getDirectoryForNewSSTables(), KEYSPACE2, CF_STANDARD1, version,
-                                                 SSTableFormat.Type.BIG);
-            Descriptor desc = new Descriptor(Directories.getBackupsDirectory(existing), KEYSPACE2, CF_STANDARD1, version, SSTableFormat.Type.BIG);
-            for (Component c : new Component[]{ Component.DATA, Component.PRIMARY_INDEX, Component.FILTER, Component.STATS })
+            Descriptor existing = liveSSTable.descriptor;
+            Descriptor desc = new Descriptor(Directories.getBackupsDirectory(existing),
+                                             KEYSPACE2,
+                                             CF_STANDARD1,
+                                             liveSSTable.descriptor.id,
+                                             liveSSTable.descriptor.formatType);
+            for (Component c : liveSSTable.getComponents())
                 assertTrue("Cannot find backed-up file:" + desc.filenameFor(c), new File(desc.filenameFor(c)).exists());
         }
     }
 
+    @Test
+    public void speculationThreshold()
+    {
+        // CF_SPEC_RETRY1 configured to use the 50th percentile for read and 75th percentile for write
+        ColumnFamilyStore cfs = Keyspace.open(KEYSPACE3).getColumnFamilyStore(CF_SPEC_RETRY1);
+
+        cfs.sampleReadLatencyMicros = 123000;
+        cfs.additionalWriteLatencyMicros = 234000;
+
+        // test updating before any stats are present
+        cfs.updateSpeculationThreshold();
+        assertThat(cfs.sampleReadLatencyMicros).isEqualTo(123000);
+        assertThat(cfs.additionalWriteLatencyMicros).isEqualTo(234000);
+
+        // Seed the column family with some latency data.
+        final int count = 10000;
+        for (int millis = 0; millis < count; millis++)
+        {
+            cfs.metric.coordinatorReadLatency.update(millis, TimeUnit.MILLISECONDS);
+            cfs.metric.coordinatorWriteLatency.update(millis, TimeUnit.MILLISECONDS);
+        }
+        // Sanity check the metrics - 50th percentile of linear 0-10000ms
+        // remember, latencies are only an estimate - off by up to 20% by the 1.2 factor between buckets.
+        assertThat(cfs.metric.coordinatorReadLatency.getCount()).isEqualTo(count);
+        assertThat(cfs.metric.coordinatorReadLatency.getSnapshot().getValue(0.5))
+            .isBetween((double) TimeUnit.MILLISECONDS.toMicros(5839),
+                       (double) TimeUnit.MILLISECONDS.toMicros(5840));
+        // Sanity check the metrics - 75th percentileof linear 0-10000ms
+        assertThat(cfs.metric.coordinatorWriteLatency.getCount()).isEqualTo(count);
+        assertThat(cfs.metric.coordinatorWriteLatency.getSnapshot().getValue(0.75))
+        .isBetween((double) TimeUnit.MILLISECONDS.toMicros(8409),
+                   (double) TimeUnit.MILLISECONDS.toMicros(8410));
+
+        // CF_SPEC_RETRY1 configured to use the 50th percentile for speculation
+        cfs.updateSpeculationThreshold();
+
+        assertThat(cfs.sampleReadLatencyMicros).isBetween(TimeUnit.MILLISECONDS.toMicros(5839), TimeUnit.MILLISECONDS.toMicros(5840));
+        assertThat(cfs.additionalWriteLatencyMicros).isBetween(TimeUnit.MILLISECONDS.toMicros(8409), TimeUnit.MILLISECONDS.toMicros(8410));
+    }
+
     // TODO: Fix once we have working supercolumns in 8099
 //    // CASSANDRA-3467.  the key here is that supercolumn and subcolumn comparators are different
 //    @Test
@@ -452,7 +520,7 @@
     public void reTest(ColumnFamilyStore cfs, Runnable verify) throws Exception
     {
         verify.run();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         verify.run();
     }
 
@@ -491,25 +559,81 @@
                                              .add("birthdate", 1L)
                                              .add("notbirthdate", 2L);
         new Mutation(builder.build()).applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         String snapshotName = "newSnapshot";
-        cfs.snapshotWithoutFlush(snapshotName);
+        cfs.snapshotWithoutMemtable(snapshotName);
 
         File snapshotManifestFile = cfs.getDirectories().getSnapshotManifestFile(snapshotName);
-        JSONParser parser = new JSONParser();
-        JSONObject manifest = (JSONObject) parser.parse(new FileReader(snapshotManifestFile));
-        JSONArray files = (JSONArray) manifest.get("files");
+        SnapshotManifest manifest = SnapshotManifest.deserializeFromJsonFile(snapshotManifestFile);
 
         // Keyspace1-Indexed1 and the corresponding index
-        assert files.size() == 2;
+        assertThat(manifest.getFiles()).hasSize(2);
 
         // Snapshot of the secondary index is stored in the subfolder with the same file name
-        String baseTableFile = (String) files.get(0);
-        String indexTableFile = (String) files.get(1);
-        assert !baseTableFile.equals(indexTableFile);
-        assert Directories.isSecondaryIndexFolder(new File(indexTableFile).getParentFile());
-        assert indexTableFile.endsWith(baseTableFile);
+        String baseTableFile = manifest.getFiles().get(0);
+        String indexTableFile = manifest.getFiles().get(1);
+        assertThat(baseTableFile).isNotEqualTo(indexTableFile);
+        assertThat(Directories.isSecondaryIndexFolder(new File(indexTableFile).parent())).isTrue();
+
+        Set<String> originalFiles = new HashSet<>();
+        Iterables.toList(cfs.concatWithIndexes()).stream()
+                 .flatMap(c -> c.getLiveSSTables().stream().map(t -> t.descriptor.filenameFor(Component.DATA)))
+                 .forEach(originalFiles::add);
+        assertThat(originalFiles.stream().anyMatch(f -> f.endsWith(indexTableFile))).isTrue();
+        assertThat(originalFiles.stream().anyMatch(f -> f.endsWith(baseTableFile))).isTrue();
+    }
+
+    private void createSnapshotAndDelete(String ks, String table, boolean writeData)
+    {
+        ColumnFamilyStore cfs = Keyspace.open(ks).getColumnFamilyStore(table);
+        if (writeData)
+        {
+            writeData(cfs);
+        }
+
+        TableSnapshot snapshot = cfs.snapshot("basic");
+
+
+        assertThat(snapshot.exists()).isTrue();
+        assertThat(cfs.listSnapshots().containsKey("basic")).isTrue();
+        assertThat(cfs.listSnapshots().get("basic")).isEqualTo(snapshot);
+
+        snapshot.getDirectories().forEach(FileUtils::deleteRecursive);
+
+        assertThat(snapshot.exists()).isFalse();
+        assertFalse(cfs.listSnapshots().containsKey("basic"));
+    }
+
+    private void writeData(ColumnFamilyStore cfs)
+    {
+        if (cfs.name.equals(CF_INDEX1))
+        {
+            new RowUpdateBuilder(cfs.metadata(), 2, "key").add("birthdate", 1L).add("notbirthdate", 2L).build().applyUnsafe();
+            Util.flush(cfs);
+        }
+        else
+        {
+            new RowUpdateBuilder(cfs.metadata(), 2, "key").clustering("name").add("val", "2").build().applyUnsafe();
+            Util.flush(cfs);
+        }
+    }
+
+    @Test
+    public void testSnapshotCreationAndDeleteEmptyTable() {
+        createSnapshotAndDelete(KEYSPACE1, CF_INDEX1, false);
+        createSnapshotAndDelete(KEYSPACE1, CF_STANDARD1, false);
+        createSnapshotAndDelete(KEYSPACE1, CF_STANDARD2, false);
+        createSnapshotAndDelete(KEYSPACE2, CF_STANDARD1, false);
+        createSnapshotAndDelete(SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.TRANSFERRED_RANGES_V2, false);
+    }
+
+    @Test
+    public void testSnapshotCreationAndDeletePopulatedTable() {
+        createSnapshotAndDelete(KEYSPACE1, CF_INDEX1, true);
+        createSnapshotAndDelete(KEYSPACE1, CF_STANDARD1, true);
+        createSnapshotAndDelete(KEYSPACE1, CF_STANDARD2, true);
+        createSnapshotAndDelete(KEYSPACE2, CF_STANDARD1, true);
     }
 
     @Test
@@ -536,7 +660,7 @@
         ColumnFamilyStore.scrubDataDirectories(cfs.metadata());
 
         new RowUpdateBuilder(cfs.metadata(), 2, "key").clustering("name").add("val", "2").build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // Nuke the metadata and reload that sstable
         Collection<SSTableReader> ssTables = cfs.getLiveSSTables();
@@ -545,7 +669,7 @@
 
         String dataFileName = ssTable.descriptor.filenameFor(Component.DATA);
         String tmpDataFileName = ssTable.descriptor.tmpFilenameFor(Component.DATA);
-        new File(dataFileName).renameTo(new File(tmpDataFileName));
+        new File(dataFileName).tryMove(new File(tmpDataFileName));
 
         ssTable.selfRef().release();
 
@@ -556,4 +680,149 @@
         assertEquals(0, ssTableFiles.size());
         cfs.clearUnsafe();
     }
+
+    @VisibleForTesting
+    public static long getSnapshotManifestAndSchemaFileSizes(TableSnapshot snapshot) throws IOException
+    {
+        Optional<File> schemaFile = snapshot.getSchemaFile();
+        Optional<File> manifestFile = snapshot.getManifestFile();
+
+        long schemaAndManifestFileSizes = 0;
+
+        schemaAndManifestFileSizes += schemaFile.isPresent() ? schemaFile.get().length() : 0;
+        schemaAndManifestFileSizes += manifestFile.isPresent() ? manifestFile.get().length() : 0;
+
+        return schemaAndManifestFileSizes;
+    }
+
+    private Memtable fakeMemTableWithMinTS(ColumnFamilyStore cfs, long minTS)
+    {
+        return new AbstractMemtable(cfs.metadata, minTS)
+        {
+
+            @Override
+            public UnfilteredRowIterator rowIterator(DecoratedKey key,
+                                                     Slices slices,
+                                                     ColumnFilter columnFilter,
+                                                     boolean reversed,
+                                                     SSTableReadsListener listener)
+            {
+                return null;
+            }
+
+            @Override
+            public UnfilteredPartitionIterator
+                   partitionIterator(ColumnFilter columnFilter, DataRange dataRange, SSTableReadsListener listener)
+            {
+                return null;
+            }
+
+            @Override
+            public void switchOut(Barrier writeBarrier, AtomicReference<CommitLogPosition> commitLogUpperBound)
+            {
+            }
+
+            @Override
+            public boolean shouldSwitch(FlushReason reason)
+            {
+                return false;
+            }
+
+            @Override
+            public long put(PartitionUpdate update, UpdateTransaction indexer, Group opGroup)
+            {
+                return 0;
+            }
+
+            @Override
+            public void performSnapshot(String snapshotName)
+            {
+            }
+
+            @Override
+            public long partitionCount()
+            {
+                return 0;
+            }
+
+            @Override
+            public void metadataUpdated()
+            {
+            }
+
+            @Override
+            public boolean mayContainDataBefore(CommitLogPosition position)
+            {
+                return false;
+            }
+
+            @Override
+            public void markExtraOnHeapUsed(long additionalSpace, Group opGroup)
+            {
+            }
+
+            @Override
+            public void markExtraOffHeapUsed(long additionalSpace, Group opGroup)
+            {
+            }
+
+            @Override
+            public void localRangesUpdated()
+            {
+            }
+
+            @Override
+            public boolean isClean()
+            {
+                return false;
+            }
+
+            @Override
+            public long getLiveDataSize()
+            {
+                return 0;
+            }
+
+            @Override
+            public FlushablePartitionSet<?> getFlushSet(PartitionPosition from, PartitionPosition to)
+            {
+                // TODO Auto-generated method stub
+                return null;
+            }
+
+            @Override
+            public LastCommitLogPosition getFinalCommitLogUpperBound()
+            {
+                return null;
+            }
+
+            @Override
+            public CommitLogPosition getCommitLogLowerBound()
+            {
+                return null;
+            }
+
+            @Override
+            public CommitLogPosition getApproximateCommitLogLowerBound()
+            {
+                return null;
+            }
+
+            @Override
+            public void discard()
+            {
+            }
+
+            @Override
+            public void addMemoryUsageTo(MemoryUsage usage)
+            {
+            }
+
+            @Override
+            public boolean accepts(Group opGroup, CommitLogPosition commitLogPosition)
+            {
+                return false;
+            }
+        };
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/ColumnsTest.java b/test/unit/org/apache/cassandra/db/ColumnsTest.java
index 6dc1832..37edcbc 100644
--- a/test/unit/org/apache/cassandra/db/ColumnsTest.java
+++ b/test/unit/org/apache/cassandra/db/ColumnsTest.java
@@ -27,9 +27,8 @@
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
 
-import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.db.commitlog.CommitLog;
-import org.apache.cassandra.db.marshal.BytesType;
+
 import org.junit.AfterClass;
 import org.junit.Test;
 
diff --git a/test/unit/org/apache/cassandra/db/CounterCacheTest.java b/test/unit/org/apache/cassandra/db/CounterCacheTest.java
index 62be22b..2b743a9 100644
--- a/test/unit/org/apache/cassandra/db/CounterCacheTest.java
+++ b/test/unit/org/apache/cassandra/db/CounterCacheTest.java
@@ -22,6 +22,8 @@
 
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.dht.Bounds;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.schema.KeyspaceParams;
@@ -191,7 +193,8 @@
         CacheService.instance.invalidateCounterCache();
         assertEquals(0, CacheService.instance.counterCache.size());
 
-        Keyspace ks = Schema.instance.removeKeyspaceInstance(KEYSPACE1);
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(KEYSPACE1);
+        SchemaTestUtil.dropKeyspaceIfExist(KEYSPACE1, true);
 
         try
         {
@@ -201,7 +204,7 @@
         }
         finally
         {
-            Schema.instance.storeKeyspaceInstance(ks);
+            SchemaTestUtil.addOrUpdateKeyspace(ksm, true);
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/db/DeletePartitionTest.java b/test/unit/org/apache/cassandra/db/DeletePartitionTest.java
index 6ed43f7..34a2b83 100644
--- a/test/unit/org/apache/cassandra/db/DeletePartitionTest.java
+++ b/test/unit/org/apache/cassandra/db/DeletePartitionTest.java
@@ -30,8 +30,8 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static junit.framework.Assert.assertFalse;
-import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class DeletePartitionTest
 {
@@ -75,7 +75,7 @@
         assertTrue(r.getCell(column).value().equals(ByteBufferUtil.bytes("asdf")));
 
         if (flushBeforeRemove)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         // delete the partition
         new Mutation.PartitionUpdateCollector(KEYSPACE1, key)
@@ -84,7 +84,7 @@
                 .applyUnsafe();
 
         if (flushAfterRemove)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         // validate removal
         ImmutableBTreePartition partitionUnfiltered = Util.getOnlyPartitionUnfiltered(Util.cmd(store, key).build());
diff --git a/test/unit/org/apache/cassandra/db/DigestTest.java b/test/unit/org/apache/cassandra/db/DigestTest.java
index 4fd12d0..4719726 100644
--- a/test/unit/org/apache/cassandra/db/DigestTest.java
+++ b/test/unit/org/apache/cassandra/db/DigestTest.java
@@ -29,8 +29,8 @@
 
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.Hex;
-import org.apache.cassandra.utils.UUIDGen;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUIDAsBytes;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
@@ -93,7 +93,7 @@
                            new Digest(Hashing.murmur3_128(1000).newHasher()),
                            new Digest(Hashing.murmur3_128(2000).newHasher())
                            };
-        byte [] random = UUIDGen.getTimeUUIDBytes();
+        byte [] random = nextTimeUUIDAsBytes();
 
         for (Digest digest : digests)
         {
diff --git a/test/unit/org/apache/cassandra/db/DirectoriesTest.java b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
index 022c3a0..c701516 100644
--- a/test/unit/org/apache/cassandra/db/DirectoriesTest.java
+++ b/test/unit/org/apache/cassandra/db/DirectoriesTest.java
@@ -17,16 +17,29 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
-import java.util.*;
+import java.time.Instant;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.IdentityHashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.Callable;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.StringUtils;
@@ -36,7 +49,10 @@
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
+import org.apache.cassandra.Util;
 import org.slf4j.LoggerFactory;
 import org.slf4j.MDC;
 // Our version of Sfl4j seems to be missing the ListAppender class.
@@ -47,14 +63,11 @@
 import ch.qos.logback.classic.spi.ILoggingEvent;
 import ch.qos.logback.core.read.ListAppender;
 
-import org.apache.cassandra.cql3.ColumnIdentifier;
-import org.apache.cassandra.schema.Indexes;
-import org.apache.cassandra.schema.SchemaConstants;
-import org.apache.cassandra.schema.SchemaKeyspaceTables;
-import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.auth.AuthKeyspace;
 import org.apache.cassandra.config.Config.DiskFailurePolicy;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.DurationSpec;
+import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.statements.schema.IndexTarget;
 import org.apache.cassandra.db.Directories.DataDirectories;
 import org.apache.cassandra.db.Directories.DataDirectory;
@@ -63,25 +76,60 @@
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SSTableId;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.io.sstable.UUIDBasedSSTableId;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.IndexMetadata;
+import org.apache.cassandra.schema.Indexes;
+import org.apache.cassandra.schema.MockSchema;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.SchemaKeyspaceTables;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.DefaultFSErrorHandler;
+import org.apache.cassandra.service.snapshot.SnapshotManifest;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 
+import static org.apache.cassandra.schema.MockSchema.sstableId;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.FBUtilities.now;
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+@RunWith(Parameterized.class)
 public class DirectoriesTest
 {
+    public static final String TABLE_NAME = "FakeTable";
+    public static final String SNAPSHOT1 = "snapshot1";
+    public static final String SNAPSHOT2 = "snapshot2";
+
+    public static final String LEGACY_SNAPSHOT_NAME = "42";
     private static File tempDataDir;
     private static final String KS = "ks";
     private static String[] TABLES;
     private static Set<TableMetadata> CFM;
-    private static Map<String, List<File>> files;
+    private static Map<String, List<File>> sstablesByTableName;
+
+    @Parameterized.Parameter(0)
+    public SSTableId.Builder<? extends SSTableId> idBuilder;
+
+    @Parameterized.Parameter(1)
+    public Supplier<? extends SSTableId> idGenerator;
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> idBuilders()
+    {
+        return Arrays.asList(new Object[]{ SequenceBasedSSTableId.Builder.instance, Util.newSeqGen() },
+                             new Object[]{ UUIDBasedSSTableId.Builder.instance, Util.newUUIDGen() });
+    }
 
 
     private static final String MDCID = "test-DirectoriesTest-id";
@@ -100,21 +148,21 @@
     @Before
     public void beforeTest() throws IOException
     {
+        MockSchema.sstableIds.clear();
+        MockSchema.sstableIdGenerator = idGenerator;
+
         TABLES = new String[] { "cf1", "ks" };
         CFM = new HashSet<>(TABLES.length);
-        files = new HashMap<>();
+        sstablesByTableName = new HashMap<>();
 
         for (String table : TABLES)
         {
-            CFM.add(TableMetadata.builder(KS, table)
-                                 .addPartitionKeyColumn("thekey", UTF8Type.instance)
-                                 .addClusteringColumn("thecolumn", UTF8Type.instance)
-                                 .build());
+            CFM.add(createFakeTable(table));
         }
 
         tempDataDir = FileUtils.createTempFile("cassandra", "unittest");
-        tempDataDir.delete(); // hack to create a temp dir
-        tempDataDir.mkdir();
+        tempDataDir.tryDelete(); // hack to create a temp dir
+        tempDataDir.tryCreateDirectory();
 
         // Create two fake data dir for tests, one using CF directories, one that do not.
         createTestFiles();
@@ -148,37 +196,95 @@
         return dirs;
     }
 
-    private static void createTestFiles() throws IOException
+    private void createTestFiles() throws IOException
     {
         for (TableMetadata cfm : CFM)
         {
-            List<File> fs = new ArrayList<>();
-            files.put(cfm.name, fs);
-            File dir = cfDir(cfm);
-            dir.mkdirs();
+            List<File> allSStables = new ArrayList<>();
+            sstablesByTableName.put(cfm.name, allSStables);
+            File tableDir = cfDir(cfm);
+            tableDir.tryCreateDirectories();
 
-            createFakeSSTable(dir, cfm.name, 1, fs);
-            createFakeSSTable(dir, cfm.name, 2, fs);
+            allSStables.addAll(createFakeSSTable(tableDir, cfm.name, 1));
+            allSStables.addAll(createFakeSSTable(tableDir, cfm.name, 2));
 
-            File backupDir = new File(dir, Directories.BACKUPS_SUBDIR);
-            backupDir.mkdir();
-            createFakeSSTable(backupDir, cfm.name, 1, fs);
+            File backupDir = new File(tableDir, Directories.BACKUPS_SUBDIR);
+            backupDir.tryCreateDirectory();
+            allSStables.addAll(createFakeSSTable(backupDir, cfm.name, 1));
 
-            File snapshotDir = new File(dir, Directories.SNAPSHOT_SUBDIR + File.separator + "42");
-            snapshotDir.mkdirs();
-            createFakeSSTable(snapshotDir, cfm.name, 1, fs);
+            File snapshotDir = new File(tableDir, Directories.SNAPSHOT_SUBDIR + File.pathSeparator() + LEGACY_SNAPSHOT_NAME);
+            snapshotDir.tryCreateDirectories();
+            allSStables.addAll(createFakeSSTable(snapshotDir, cfm.name, 1));
         }
     }
 
-    private static void createFakeSSTable(File dir, String cf, int gen, List<File> addTo) throws IOException
+    class FakeSnapshot {
+        final TableMetadata table;
+        final String tag;
+        final File snapshotDir;
+        final SnapshotManifest manifest;
+
+        FakeSnapshot(TableMetadata table, String tag, File snapshotDir, SnapshotManifest manifest)
+        {
+            this.table = table;
+            this.tag = tag;
+            this.snapshotDir = snapshotDir;
+            this.manifest = manifest;
+        }
+
+        public TableSnapshot asTableSnapshot()
+        {
+            Instant createdAt = manifest == null ? null : manifest.createdAt;
+            Instant expiresAt = manifest == null ? null : manifest.expiresAt;
+            return new TableSnapshot(table.keyspace, table.name, table.id.asUUID(), tag, createdAt, expiresAt, Collections.singleton(snapshotDir));
+        }
+    }
+
+    private TableMetadata createFakeTable(String table)
     {
-        Descriptor desc = new Descriptor(dir, KS, cf, gen, SSTableFormat.Type.BIG);
+        return TableMetadata.builder(KS, table)
+                            .addPartitionKeyColumn("thekey", UTF8Type.instance)
+                            .addClusteringColumn("thecolumn", UTF8Type.instance)
+                            .build();
+    }
+
+    public FakeSnapshot createFakeSnapshot(TableMetadata table, String tag, boolean createManifest) throws IOException
+    {
+        File tableDir = cfDir(table);
+        tableDir.tryCreateDirectories();
+        File snapshotDir = new File(tableDir, Directories.SNAPSHOT_SUBDIR + File.pathSeparator() + tag);
+        snapshotDir.tryCreateDirectories();
+
+        Descriptor sstableDesc = new Descriptor(snapshotDir, KS, table.name, sstableId(1), SSTableFormat.Type.BIG);
+        createFakeSSTable(sstableDesc);
+
+        SnapshotManifest manifest = null;
+        if (createManifest)
+        {
+            File manifestFile = Directories.getSnapshotManifestFile(snapshotDir);
+            manifest = new SnapshotManifest(Collections.singletonList(sstableDesc.filenameFor(Component.DATA)), new DurationSpec.IntSecondsBound("1m"), now());
+            manifest.serializeToJsonFile(manifestFile);
+        }
+
+        return new FakeSnapshot(table, tag, snapshotDir, manifest);
+    }
+
+    private List<File> createFakeSSTable(File dir, String cf, int gen)
+    {
+        Descriptor desc = new Descriptor(dir, KS, cf, sstableId(gen), SSTableFormat.Type.BIG);
+        return createFakeSSTable(desc);
+    }
+
+    private List<File> createFakeSSTable(Descriptor desc)
+    {
+        List<File> components = new ArrayList<>(3);
         for (Component c : new Component[]{ Component.DATA, Component.PRIMARY_INDEX, Component.FILTER })
         {
             File f = new File(desc.filenameFor(c));
-            f.createNewFile();
-            addTo.add(f);
+            f.createFileIfNotExists();
+            components.add(f);
         }
+        return components;
     }
 
     private static File cfDir(TableMetadata metadata)
@@ -189,13 +295,13 @@
         {
             // secondary index
             return new File(tempDataDir,
-                            metadata.keyspace + File.separator +
-                            metadata.name.substring(0, idx) + '-' + tableId + File.separator +
+                            metadata.keyspace + File.pathSeparator() +
+                            metadata.name.substring(0, idx) + '-' + tableId + File.pathSeparator() +
                             metadata.name.substring(idx));
         }
         else
         {
-            return new File(tempDataDir, metadata.keyspace + File.separator + metadata.name + '-' + tableId);
+            return new File(tempDataDir, metadata.keyspace + File.pathSeparator() + metadata.name + '-' + tableId);
         }
     }
 
@@ -207,12 +313,93 @@
             Directories directories = new Directories(cfm, toDataDirectories(tempDataDir));
             assertEquals(cfDir(cfm), directories.getDirectoryForNewSSTables());
 
-            Descriptor desc = new Descriptor(cfDir(cfm), KS, cfm.name, 1, SSTableFormat.Type.BIG);
-            File snapshotDir = new File(cfDir(cfm),  File.separator + Directories.SNAPSHOT_SUBDIR + File.separator + "42");
-            assertEquals(snapshotDir.getCanonicalFile(), Directories.getSnapshotDirectory(desc, "42"));
+            Descriptor desc = new Descriptor(cfDir(cfm), KS, cfm.name, sstableId(1), SSTableFormat.Type.BIG);
+            File snapshotDir = new File(cfDir(cfm), File.pathSeparator() + Directories.SNAPSHOT_SUBDIR + File.pathSeparator() + LEGACY_SNAPSHOT_NAME);
+            assertEquals(snapshotDir.toCanonical(), Directories.getSnapshotDirectory(desc, LEGACY_SNAPSHOT_NAME));
 
-            File backupsDir = new File(cfDir(cfm),  File.separator + Directories.BACKUPS_SUBDIR);
-            assertEquals(backupsDir.getCanonicalFile(), Directories.getBackupsDirectory(desc));
+            File backupsDir = new File(cfDir(cfm), File.pathSeparator() + Directories.BACKUPS_SUBDIR);
+            assertEquals(backupsDir.toCanonical(), Directories.getBackupsDirectory(desc));
+
+            Supplier<? extends SSTableId> uidGen = directories.getUIDGenerator(idBuilder);
+            assertThat(Stream.generate(uidGen).limit(100).filter(MockSchema.sstableIds::containsValue).collect(Collectors.toList())).isEmpty();
+        }
+    }
+
+    @Test
+    public void testListSnapshots() throws Exception {
+        // Initial state
+        TableMetadata fakeTable = createFakeTable(TABLE_NAME);
+        Directories directories = new Directories(fakeTable, toDataDirectories(tempDataDir));
+        assertThat(directories.listSnapshots()).isEmpty();
+
+        // Create snapshot with and without manifest
+        FakeSnapshot snapshot1 = createFakeSnapshot(fakeTable, SNAPSHOT1, true);
+        FakeSnapshot snapshot2 = createFakeSnapshot(fakeTable, SNAPSHOT2, false);
+
+        // Both snapshots should be present
+        Map<String, TableSnapshot> snapshots = directories.listSnapshots();
+        assertThat(snapshots.keySet()).isEqualTo(Sets.newHashSet(SNAPSHOT1, SNAPSHOT2));
+        assertThat(snapshots.get(SNAPSHOT1)).isEqualTo(snapshot1.asTableSnapshot());
+        assertThat(snapshots.get(SNAPSHOT2)).isEqualTo(snapshot2.asTableSnapshot());
+
+        // Now remove snapshot1
+        FileUtils.deleteRecursive(snapshot1.snapshotDir);
+
+        // Only snapshot 2 should be present
+        snapshots = directories.listSnapshots();
+        assertThat(snapshots.keySet()).isEqualTo(Sets.newHashSet(SNAPSHOT2));
+        assertThat(snapshots.get(SNAPSHOT2)).isEqualTo(snapshot2.asTableSnapshot());
+    }
+
+    @Test
+    public void testListSnapshotDirsByTag() throws Exception {
+        // Initial state
+        TableMetadata fakeTable = createFakeTable("FakeTable");
+        Directories directories = new Directories(fakeTable, toDataDirectories(tempDataDir));
+        assertThat(directories.listSnapshotDirsByTag()).isEmpty();
+
+        // Create snapshot with and without manifest
+        FakeSnapshot snapshot1 = createFakeSnapshot(fakeTable, SNAPSHOT1, true);
+        FakeSnapshot snapshot2 = createFakeSnapshot(fakeTable, SNAPSHOT2, false);
+
+        // Both snapshots should be present
+        Map<String, Set<File>> snapshotDirs = directories.listSnapshotDirsByTag();
+        assertThat(snapshotDirs.keySet()).isEqualTo(Sets.newHashSet(SNAPSHOT1, SNAPSHOT2));
+        assertThat(snapshotDirs.get(SNAPSHOT1)).allMatch(snapshotDir -> snapshotDir.equals(snapshot1.snapshotDir));
+        assertThat(snapshotDirs.get(SNAPSHOT2)).allMatch(snapshotDir -> snapshotDir.equals(snapshot2.snapshotDir));
+
+        // Now remove snapshot1
+        FileUtils.deleteRecursive(snapshot1.snapshotDir);
+
+        // Only snapshot 2 should be present
+        snapshotDirs = directories.listSnapshotDirsByTag();
+        assertThat(snapshotDirs.keySet()).isEqualTo(Sets.newHashSet(SNAPSHOT2));
+    }
+
+    @Test
+    public void testMaybeManifestLoading() throws Exception {
+        for (TableMetadata cfm : CFM)
+        {
+            String tag = "test";
+            Directories directories = new Directories(cfm, toDataDirectories(tempDataDir));
+            Descriptor parentDesc = new Descriptor(directories.getDirectoryForNewSSTables(), KS, cfm.name, sstableId(0), SSTableFormat.Type.BIG);
+            File parentSnapshotDirectory = Directories.getSnapshotDirectory(parentDesc, tag);
+
+            List<String> files = new LinkedList<>();
+            files.add(parentSnapshotDirectory.toAbsolute().absolutePath());
+
+            File manifestFile = directories.getSnapshotManifestFile(tag);
+
+            SnapshotManifest manifest = new SnapshotManifest(files, new DurationSpec.IntSecondsBound("1m"), now());
+            manifest.serializeToJsonFile(manifestFile);
+
+            Set<File> dirs = new HashSet<>();
+
+            dirs.add(manifestFile.parent());
+            dirs.add(new File("buzz"));
+            SnapshotManifest loadedManifest = Directories.maybeLoadManifest(KS, cfm.name, tag, dirs);
+
+            assertEquals(manifest, loadedManifest);
         }
     }
 
@@ -242,46 +429,44 @@
         {
             assertEquals(cfDir(INDEX_CFM), dir);
         }
-        Descriptor parentDesc = new Descriptor(parentDirectories.getDirectoryForNewSSTables(), KS, PARENT_CFM.name, 0, SSTableFormat.Type.BIG);
-        Descriptor indexDesc = new Descriptor(indexDirectories.getDirectoryForNewSSTables(), KS, INDEX_CFM.name, 0, SSTableFormat.Type.BIG);
+        Descriptor parentDesc = new Descriptor(parentDirectories.getDirectoryForNewSSTables(), KS, PARENT_CFM.name, sstableId(0), SSTableFormat.Type.BIG);
+        Descriptor indexDesc = new Descriptor(indexDirectories.getDirectoryForNewSSTables(), KS, INDEX_CFM.name, sstableId(0), SSTableFormat.Type.BIG);
 
         // snapshot dir should be created under its parent's
         File parentSnapshotDirectory = Directories.getSnapshotDirectory(parentDesc, "test");
         File indexSnapshotDirectory = Directories.getSnapshotDirectory(indexDesc, "test");
-        assertEquals(parentSnapshotDirectory, indexSnapshotDirectory.getParentFile());
+        assertEquals(parentSnapshotDirectory, indexSnapshotDirectory.parent());
 
         // check if snapshot directory exists
+        parentSnapshotDirectory.tryCreateDirectories();
         assertTrue(parentDirectories.snapshotExists("test"));
         assertTrue(indexDirectories.snapshotExists("test"));
 
         // check true snapshot size
-        Descriptor parentSnapshot = new Descriptor(parentSnapshotDirectory, KS, PARENT_CFM.name, 0, SSTableFormat.Type.BIG);
+        Descriptor parentSnapshot = new Descriptor(parentSnapshotDirectory, KS, PARENT_CFM.name, sstableId(0), SSTableFormat.Type.BIG);
         createFile(parentSnapshot.filenameFor(Component.DATA), 30);
-        Descriptor indexSnapshot = new Descriptor(indexSnapshotDirectory, KS, INDEX_CFM.name, 0, SSTableFormat.Type.BIG);
+        Descriptor indexSnapshot = new Descriptor(indexSnapshotDirectory, KS, INDEX_CFM.name, sstableId(0), SSTableFormat.Type.BIG);
         createFile(indexSnapshot.filenameFor(Component.DATA), 40);
 
         assertEquals(30, parentDirectories.trueSnapshotsSize());
         assertEquals(40, indexDirectories.trueSnapshotsSize());
 
         // check snapshot details
-        Map<String, Directories.SnapshotSizeDetails> parentSnapshotDetail = parentDirectories.getSnapshotDetails();
+        Map<String, TableSnapshot> parentSnapshotDetail = parentDirectories.listSnapshots();
         assertTrue(parentSnapshotDetail.containsKey("test"));
-        assertEquals(30L, parentSnapshotDetail.get("test").dataSizeBytes);
-
-        Map<String, Directories.SnapshotSizeDetails> indexSnapshotDetail = indexDirectories.getSnapshotDetails();
-        assertTrue(indexSnapshotDetail.containsKey("test"));
-        assertEquals(40L, indexSnapshotDetail.get("test").dataSizeBytes);
+        // CASSANDRA-17357: include indexes when computing true size of parent table
+        assertEquals(70L, parentSnapshotDetail.get("test").computeTrueSizeBytes());
 
         // check backup directory
         File parentBackupDirectory = Directories.getBackupsDirectory(parentDesc);
         File indexBackupDirectory = Directories.getBackupsDirectory(indexDesc);
-        assertEquals(parentBackupDirectory, indexBackupDirectory.getParentFile());
+        assertEquals(parentBackupDirectory, indexBackupDirectory.parent());
     }
 
     private File createFile(String fileName, int size)
     {
         File newFile = new File(fileName);
-        try (FileOutputStream writer = new FileOutputStream(newFile))
+        try (FileOutputStreamPlus writer = new FileOutputStreamPlus(newFile);)
         {
             writer.write(new byte[size]);
             writer.flush();
@@ -306,9 +491,9 @@
         Set<File> listed;// List all but no snapshot, backup
         lister = directories.sstableLister(Directories.OnTxnErr.THROW);
         listed = new HashSet<>(lister.listFiles());
-        for (File f : files.get(cfm.name))
+        for (File f : sstablesByTableName.get(cfm.name))
         {
-            if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR) || f.getPath().contains(Directories.BACKUPS_SUBDIR))
+            if (f.path().contains(Directories.SNAPSHOT_SUBDIR) || f.path().contains(Directories.BACKUPS_SUBDIR))
                 assertFalse(f + " should not be listed", listed.contains(f));
             else
                 assertTrue(f + " is missing", listed.contains(f));
@@ -317,9 +502,9 @@
         // List all but including backup (but no snapshot)
         lister = directories.sstableLister(Directories.OnTxnErr.THROW).includeBackups(true);
         listed = new HashSet<>(lister.listFiles());
-        for (File f : files.get(cfm.name))
+        for (File f : sstablesByTableName.get(cfm.name))
         {
-            if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR))
+            if (f.path().contains(Directories.SNAPSHOT_SUBDIR))
                 assertFalse(f + " should not be listed", listed.contains(f));
             else
                 assertTrue(f + " is missing", listed.contains(f));
@@ -328,11 +513,11 @@
         // Skip temporary and compacted
         lister = directories.sstableLister(Directories.OnTxnErr.THROW).skipTemporary(true);
         listed = new HashSet<>(lister.listFiles());
-        for (File f : files.get(cfm.name))
+        for (File f : sstablesByTableName.get(cfm.name))
         {
-            if (f.getPath().contains(Directories.SNAPSHOT_SUBDIR) || f.getPath().contains(Directories.BACKUPS_SUBDIR))
+            if (f.path().contains(Directories.SNAPSHOT_SUBDIR) || f.path().contains(Directories.BACKUPS_SUBDIR))
                 assertFalse(f + " should not be listed", listed.contains(f));
-            else if (f.getName().contains("tmp-"))
+            else if (f.name().contains("tmp-"))
                 assertFalse(f + " should not be listed", listed.contains(f));
             else
                 assertTrue(f + " is missing", listed.contains(f));
@@ -347,9 +532,9 @@
             Directories directories = new Directories(cfm, toDataDirectories(tempDataDir));
 
             File tempDir = directories.getTemporaryWriteableDirectoryAsFile(10);
-            tempDir.mkdir();
+            tempDir.tryCreateDirectory();
             File tempFile = new File(tempDir, "tempFile");
-            tempFile.createNewFile();
+            tempFile.createFileIfNotExists();
 
             assertTrue(tempDir.exists());
             assertTrue(tempFile.exists());
@@ -383,14 +568,13 @@
             if (!directories.isEmpty())
             {
                 String[] path = new String[] {KS, "bad"};
-                File dir = new File(first.location, StringUtils.join(path, File.separator));
+                File dir = new File(first.location, StringUtils.join(path, File.pathSeparator()));
                 JVMStabilityInspector.inspectThrowable(new FSWriteError(new IOException("Unable to create directory " + dir), dir));
             }
 
-            File file = new File(first.location, new File(KS, "bad").getPath());
+            File file = new File(first.location, new File(KS, "bad").path());
             assertTrue(DisallowedDirectories.isUnwritable(file));
-
-        } 
+        }
         finally 
         {
             DatabaseDescriptor.setDiskFailurePolicy(origPolicy);
@@ -404,10 +588,10 @@
         {
             final Directories directories = new Directories(cfm, toDataDirectories(tempDataDir));
             assertEquals(cfDir(cfm), directories.getDirectoryForNewSSTables());
-            final String n = Long.toString(System.nanoTime());
+            final String n = Long.toString(nanoTime());
             Callable<File> directoryGetter = new Callable<File>() {
                 public File call() throws Exception {
-                    Descriptor desc = new Descriptor(cfDir(cfm), KS, cfm.name, 1, SSTableFormat.Type.BIG);
+                    Descriptor desc = new Descriptor(cfDir(cfm), KS, cfm.name, sstableId(1), SSTableFormat.Type.BIG);
                     return Directories.getSnapshotDirectory(desc, n);
                 }
             };
@@ -533,8 +717,8 @@
             Directories dirs = new Directories(cfm, paths);
             for (DataDirectory dir : paths)
             {
-                String p = dirs.getLocationForDisk(dir).getAbsolutePath() + File.separator;
-                assertTrue(p.startsWith(dir.location.getAbsolutePath() + File.separator));
+                String p = dirs.getLocationForDisk(dir).absolutePath() + File.pathSeparator();
+                assertTrue(p.startsWith(dir.location.absolutePath() + File.pathSeparator()));
             }
         }
     }
@@ -550,11 +734,11 @@
         Path p2 = Files.createDirectories(ddir.resolve("p2"));
         Path l1 = Files.createSymbolicLink(p2.resolve("ks"), symlinktarget);
 
-        DataDirectory path1 = new DataDirectory(p1.toFile());
-        DataDirectory path2 = new DataDirectory(p2.toFile());
+        DataDirectory path1 = new DataDirectory(new File(p1));
+        DataDirectory path2 = new DataDirectory(new File(p2));
         Directories dirs = new Directories(CFM.iterator().next(), new DataDirectory[] {path1, path2});
-        dirs.getLocationForDisk(new DataDirectory(p1.toFile()));
-        dirs.getLocationForDisk(new DataDirectory(p2.toFile()));
+        dirs.getLocationForDisk(new DataDirectory(new File(p1)));
+        dirs.getLocationForDisk(new DataDirectory(new File(p2)));
 
         assertTrue(dirs.getLocationForDisk(path2).toPath().startsWith(l1));
         assertTrue(dirs.getLocationForDisk(path1).toPath().startsWith(p1));
@@ -574,8 +758,8 @@
             for (DataDirectory dir : paths)
             {
                 Descriptor d = Descriptor.fromFilename(new File(dir.location, getNewFilename(cfm, false)).toString());
-                String p = dirs.getDataDirectoryForFile(d).location.getAbsolutePath() + File.separator;
-                assertTrue(p.startsWith(dir.location.getAbsolutePath() + File.separator));
+                String p = dirs.getDataDirectoryForFile(d).location.absolutePath() + File.pathSeparator();
+                assertTrue(p.startsWith(dir.location.absolutePath() + File.pathSeparator()));
             }
         }
     }
@@ -596,16 +780,16 @@
         Path symlinktarget = Files.createDirectories(p.resolve("symlinktarget"));
         Path ddir1 = Files.createDirectories(p.resolve("datadir1"));
         Path ddir2 = Files.createSymbolicLink(p.resolve("datadir11"), symlinktarget);
-        DataDirectory dd1 = new DataDirectory(ddir1.toFile());
-        DataDirectory dd2 = new DataDirectory(ddir2.toFile());
+        DataDirectory dd1 = new DataDirectory(new File(ddir1));
+        DataDirectory dd2 = new DataDirectory(new File(ddir2));
 
         for (TableMetadata tm : CFM)
         {
             Directories dirs = new Directories(tm, Sets.newHashSet(dd1, dd2));
-            Descriptor desc = Descriptor.fromFilename(ddir1.resolve(getNewFilename(tm, false)).toFile());
-            assertEquals(ddir1.toFile(), dirs.getDataDirectoryForFile(desc).location);
-            desc = Descriptor.fromFilename(ddir2.resolve(getNewFilename(tm, false)).toFile());
-            assertEquals(ddir2.toFile(), dirs.getDataDirectoryForFile(desc).location);
+            Descriptor desc = Descriptor.fromFilename(new File(ddir1.resolve(getNewFilename(tm, false))));
+            assertEquals(new File(ddir1), dirs.getDataDirectoryForFile(desc).location);
+            desc = Descriptor.fromFilename(new File(ddir2.resolve(getNewFilename(tm, false))));
+            assertEquals(new File(ddir2), dirs.getDataDirectoryForFile(desc).location);
         }
     }
 
@@ -647,15 +831,15 @@
             Files.createSymbolicLink(keyspacedir.resolve(tabledir), symlinktarget);
         }
 
-        DataDirectory dd1 = new DataDirectory(ddir1.toFile());
-        DataDirectory dd2 = new DataDirectory(ddir2.toFile());
+        DataDirectory dd1 = new DataDirectory(new File(ddir1));
+        DataDirectory dd2 = new DataDirectory(new File(ddir2));
         for (TableMetadata tm : CFM)
         {
             Directories dirs = new Directories(tm, Sets.newHashSet(dd1, dd2));
-            Descriptor desc = Descriptor.fromFilename(ddir1.resolve(getNewFilename(tm, oldStyle)).toFile());
-            assertEquals(ddir1.toFile(), dirs.getDataDirectoryForFile(desc).location);
-            desc = Descriptor.fromFilename(ddir2.resolve(getNewFilename(tm, oldStyle)).toFile());
-            assertEquals(ddir2.toFile(), dirs.getDataDirectoryForFile(desc).location);
+            Descriptor desc = Descriptor.fromFilename(new File(ddir1.resolve(getNewFilename(tm, oldStyle))));
+            assertEquals(new File(ddir1), dirs.getDataDirectoryForFile(desc).location);
+            desc = Descriptor.fromFilename(new File(ddir2.resolve(getNewFilename(tm, oldStyle))));
+            assertEquals(new File(ddir2), dirs.getDataDirectoryForFile(desc).location);
         }
     }
 
@@ -687,11 +871,11 @@
 
         Iterator<DataDirectory> iter = directories.iterator();
         assertTrue(iter.hasNext());
-        assertEquals(new DataDirectory(subDir_1.toFile()), iter.next());
+        assertEquals(new DataDirectory(new File(subDir_1)), iter.next());
         assertTrue(iter.hasNext());
-        assertEquals(new DataDirectory(subDir_2.toFile()), iter.next());
+        assertEquals(new DataDirectory(new File(subDir_2)), iter.next());
         assertTrue(iter.hasNext());
-        assertEquals(new DataDirectory(subDir_3.toFile()), iter.next());
+        assertEquals(new DataDirectory(new File(subDir_3)), iter.next());
         assertFalse(iter.hasNext());
 
         directories = new DataDirectories(new String[]{subDir_1.toString(), subDir_2.toString()},
@@ -699,15 +883,15 @@
 
         iter = directories.iterator();
         assertTrue(iter.hasNext());
-        assertEquals(new DataDirectory(subDir_1.toFile()), iter.next());
+        assertEquals(new DataDirectory(new File(subDir_1)), iter.next());
         assertTrue(iter.hasNext());
-        assertEquals(new DataDirectory(subDir_2.toFile()), iter.next());
+        assertEquals(new DataDirectory(new File(subDir_2)), iter.next());
         assertFalse(iter.hasNext());
     }
 
     private String getNewFilename(TableMetadata tm, boolean oldStyle)
     {
-        return tm.keyspace + File.separator + tm.name + (oldStyle ? "" : Component.separator + tm.id.toHexString()) + "/na-1-big-Data.db";
+        return tm.keyspace + File.pathSeparator() + tm.name + (oldStyle ? "" : Component.separator + tm.id.toHexString()) + "/na-1-big-Data.db";
     }
 
     private List<Directories.DataDirectoryCandidate> getWriteableDirectories(DataDirectory[] dataDirectories, long writeSize)
@@ -718,14 +902,14 @@
         long totalAvailable = 0L;
 
         for (DataDirectory dataDir : dataDirectories)
-            {
-                Directories.DataDirectoryCandidate candidate = new Directories.DataDirectoryCandidate(dataDir);
-                // exclude directory if its total writeSize does not fit to data directory
-                if (candidate.availableSpace < writeSize)
-                    continue;
-                candidates.add(candidate);
-                totalAvailable += candidate.availableSpace;
-            }
+        {
+            Directories.DataDirectoryCandidate candidate = new Directories.DataDirectoryCandidate(dataDir);
+            // exclude directory if its total writeSize does not fit to data directory
+            if (candidate.availableSpace < writeSize)
+                continue;
+            candidates.add(candidate);
+            totalAvailable += candidate.availableSpace;
+        }
 
         Directories.sortWriteableCandidates(candidates, totalAvailable);
 
diff --git a/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java b/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java
index 3cd501e..cdf9a9a 100644
--- a/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/DiskBoundaryManagerTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.net.UnknownHostException;
 import java.util.List;
 
@@ -27,8 +26,10 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.dht.BootStrapper;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.service.StorageService;
@@ -37,7 +38,6 @@
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 public class DiskBoundaryManagerTest extends CQLTester
@@ -121,7 +121,7 @@
     {
         MockCFS(ColumnFamilyStore cfs, Directories dirs)
         {
-            super(cfs.keyspace, cfs.getTableName(), 0, cfs.metadata, dirs, false, false, true);
+            super(cfs.keyspace, cfs.getTableName(), Util.newSeqGen(), cfs.metadata, dirs, false, false, true);
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/ImportTest.java b/test/unit/org/apache/cassandra/db/ImportTest.java
index a760768..ff843fa 100644
--- a/test/unit/org/apache/cassandra/db/ImportTest.java
+++ b/test/unit/org/apache/cassandra/db/ImportTest.java
@@ -18,9 +18,8 @@
 
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
+import java.nio.channels.FileChannel;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collections;
@@ -33,9 +32,9 @@
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.Assert;
-import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cache.RowCacheKey;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.UntypedResultSet;
@@ -43,10 +42,12 @@
 import org.apache.cassandra.dht.BootStrapper;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertEquals;
@@ -55,6 +56,7 @@
 
 public class ImportTest extends CQLTester
 {
+
     @Test
     public void basicImportByMovingTest() throws Throwable
     {
@@ -84,8 +86,7 @@
         {
             execute("insert into %s (id, d) values (?, ?)", i, i);
         }
-
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
 
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
@@ -110,14 +111,14 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
 
         File backupdir = moveToBackupDir(sstables);
         for (int i = 10; i < 20; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
 
@@ -141,7 +142,7 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
         sstables.forEach(s -> s.selfRef().release());
@@ -156,7 +157,7 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
         for (SSTableReader sstable : sstables)
@@ -193,7 +194,7 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
         for (SSTableReader sstable : sstables)
@@ -227,36 +228,36 @@
     {
         Path temp = Files.createTempDirectory("importtest");
         SSTableReader sst = sstables.iterator().next();
-        String tabledir = sst.descriptor.directory.getName();
-        String ksdir = sst.descriptor.directory.getParentFile().getName();
+        String tabledir = sst.descriptor.directory.name();
+        String ksdir = sst.descriptor.directory.parent().name();
         Path backupdir = createDirectories(temp.toString(), ksdir, tabledir);
         for (SSTableReader sstable : sstables)
         {
             sstable.selfRef().release();
-            for (File f : sstable.descriptor.directory.listFiles())
+            for (File f : sstable.descriptor.directory.tryList())
             {
                 if (f.toString().contains(sstable.descriptor.baseFilename()))
                 {
                     System.out.println("move " + f.toPath() + " to " + backupdir);
-                    File moveFileTo = new File(backupdir.toFile(), f.getName());
+                    File moveFileTo = new File(backupdir, f.name());
                     moveFileTo.deleteOnExit();
                     Files.move(f.toPath(), moveFileTo.toPath());
                 }
             }
         }
-        return backupdir.toFile();
+        return new File(backupdir);
     }
 
     private Path createDirectories(String base, String ... subdirs)
     {
         File b = new File(base);
-        b.mkdir();
+        b.tryCreateDirectory();
         System.out.println("mkdir "+b);
         b.deleteOnExit();
         for (String subdir : subdirs)
         {
             b = new File(b, subdir);
-            b.mkdir();
+            b.tryCreateDirectory();
             System.out.println("mkdir "+b);
             b.deleteOnExit();
         }
@@ -275,7 +276,7 @@
         for (int i = 0; i < 10; i++)
         {
             execute("insert into %s (id, d) values (?, ?)", i, i);
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
         }
 
         Set<SSTableReader> toMove = getCurrentColumnFamilyStore().getLiveSSTables();
@@ -291,8 +292,8 @@
         importer.importNewSSTables(SSTableImporter.Options.options(dir.toString()).build());
         for (SSTableReader sstable : mock.getLiveSSTables())
         {
-            File movedDir = sstable.descriptor.directory.getCanonicalFile();
-            File correctDir = mock.getDiskBoundaries().getCorrectDiskForSSTable(sstable).location.getCanonicalFile();
+            File movedDir = sstable.descriptor.directory.toCanonical();
+            File correctDir = mock.getDiskBoundaries().getCorrectDiskForSSTable(sstable).location.toCanonical();
             assertTrue(movedDir.toString().startsWith(correctDir.toString()));
         }
         for (SSTableReader sstable : mock.getLiveSSTables())
@@ -304,20 +305,20 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         SSTableReader sstableToCorrupt = getCurrentColumnFamilyStore().getLiveSSTables().iterator().next();
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i + 10, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
 
         getCurrentColumnFamilyStore().clearUnsafe();
 
         String filenameToCorrupt = sstableToCorrupt.descriptor.filenameFor(Component.STATS);
-        try (RandomAccessFile file = new RandomAccessFile(filenameToCorrupt, "rw"))
+        try (FileChannel fileChannel = new File(filenameToCorrupt).newReadWriteChannel())
         {
-            file.seek(0);
-            file.writeBytes(StringUtils.repeat('z', 2));
+            fileChannel.position(0);
+            fileChannel.write(ByteBufferUtil.bytes(StringUtils.repeat('z', 2)));
         }
 
         File backupdir = moveToBackupDir(sstables);
@@ -325,13 +326,13 @@
         // now move a correct sstable to another directory to make sure that directory gets properly imported
         for (int i = 100; i < 130; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> correctSSTables = getCurrentColumnFamilyStore().getLiveSSTables();
 
         getCurrentColumnFamilyStore().clearUnsafe();
         File backupdirCorrect = moveToBackupDir(correctSSTables);
 
-        Set<File> beforeImport = Sets.newHashSet(backupdir.listFiles());
+        Set<File> beforeImport = Sets.newHashSet(backupdir.tryList());
         // first we moved out 2 sstables, one correct and one corrupt in to a single directory (backupdir)
         // then we moved out 1 sstable, a correct one (in backupdirCorrect).
         // now import should fail import on backupdir, but import the one in backupdirCorrect.
@@ -346,7 +347,7 @@
             assertTrue("pk = "+pk, pk >= 100 && pk < 130);
         }
         assertEquals("Data dir should contain one file", 1, countFiles(getCurrentColumnFamilyStore().getDirectories().getDirectoryForNewSSTables()));
-        assertEquals("backupdir contained 2 files before import, should still contain 2 after failing to import it", beforeImport, Sets.newHashSet(backupdir.listFiles()));
+        assertEquals("backupdir contained 2 files before import, should still contain 2 after failing to import it", beforeImport, Sets.newHashSet(backupdir.tryList()));
         if (copy)
         {
             assertEquals("backupdirCorrect contained 1 file before import, should contain 1 after import too", 1, countFiles(backupdirCorrect));
@@ -355,14 +356,13 @@
         {
             assertEquals("backupdirCorrect contained 1 file before import, should be empty after import", 0, countFiles(backupdirCorrect));
         }
-
     }
 
     private int countFiles(File dir)
     {
         int fileCount = 0;
 
-        for (File f : dir.listFiles())
+        for (File f : dir.tryList())
         {
             if (f.isFile() && f.toString().contains("-Data.db"))
             {
@@ -402,7 +402,7 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 1000; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
 
         getCurrentColumnFamilyStore().clearUnsafe();
@@ -447,7 +447,7 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 1000; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
 
         getCurrentColumnFamilyStore().clearUnsafe();
@@ -483,7 +483,7 @@
         createTable("create table %s (id int primary key, d int) WITH caching = { 'keys': 'NONE', 'rows_per_partition': 'ALL' }");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         CacheService.instance.setRowCacheCapacityInMB(1);
 
         Set<RowCacheKey> keysToInvalidate = new HashSet<>();
@@ -504,7 +504,7 @@
 
         for (int i = 10; i < 20; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
 
         Set<RowCacheKey> allCachedKeys = new HashSet<>();
 
@@ -551,7 +551,7 @@
         createTable("create table %s (id int primary key, d int) WITH caching = { 'keys': 'NONE', 'rows_per_partition': 'ALL' }");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         CacheService.instance.setRowCacheCapacityInMB(1);
         getCurrentColumnFamilyStore().clearUnsafe();
@@ -568,25 +568,25 @@
         createTable("create table %s (id int primary key, d int) WITH caching = { 'keys': 'NONE', 'rows_per_partition': 'ALL' }");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
         sstables.forEach(s -> s.selfRef().release());
         // corrupt the sstable which is still in the data directory
         SSTableReader sstableToCorrupt = sstables.iterator().next();
         String filenameToCorrupt = sstableToCorrupt.descriptor.filenameFor(Component.STATS);
-        try (RandomAccessFile file = new RandomAccessFile(filenameToCorrupt, "rw"))
+        try (FileChannel fileChannel = new File(filenameToCorrupt).newReadWriteChannel())
         {
-            file.seek(0);
-            file.writeBytes(StringUtils.repeat('z', 2));
+            fileChannel.position(0);
+            fileChannel.write(ByteBufferUtil.bytes(StringUtils.repeat('z', 2)));
         }
 
         for (int i = 10; i < 20; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         for (int i = 20; i < 30; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
 
         Set<SSTableReader> expectedFiles = new HashSet<>(getCurrentColumnFamilyStore().getLiveSSTables());
 
@@ -618,8 +618,8 @@
             assertTrue(new File(sstable.descriptor.filenameFor(Component.DATA)).exists());
         getCurrentColumnFamilyStore().truncateBlocking();
         LifecycleTransaction.waitForDeletions();
-        for (File f : sstableToCorrupt.descriptor.directory.listFiles()) // clean up the corrupt files which truncate does not handle
-            f.delete();
+        for (File f : sstableToCorrupt.descriptor.directory.tryList()) // clean up the corrupt files which truncate does not handle
+            f.tryDelete();
 
     }
 
@@ -632,14 +632,14 @@
         createTable("create table %s (id int primary key, d int)");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
 
         File backupdir = moveToBackupDir(sstables);
         for (int i = 10; i < 20; i++)
             execute("insert into %s (id, d) values (?, ?)", i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         getCurrentColumnFamilyStore().clearUnsafe();
 
@@ -676,8 +676,9 @@
                 for (int i = 0; i < 10; i++)
                     execute(String.format("INSERT INTO %s.%s (id, d) values (?, ?)", KEYSPACE, table), i, i);
 
-                ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(KEYSPACE, unquotedTableName);
-                cfs.forceBlockingFlush();
+                ColumnFamilyStore cfs = getColumnFamilyStore(KEYSPACE, unquotedTableName);
+
+                Util.flush(cfs);
 
                 Set<SSTableReader> sstables = cfs.getLiveSSTables();
                 cfs.clearUnsafe();
@@ -708,7 +709,7 @@
     {
         public MockCFS(ColumnFamilyStore cfs, Directories dirs)
         {
-            super(cfs.keyspace, cfs.getTableName(), 0, cfs.metadata, dirs, false, false, true);
+            super(cfs.keyspace, cfs.getTableName(), Util.newSeqGen(), cfs.metadata, dirs, false, false, true);
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/KeyCacheTest.java b/test/unit/org/apache/cassandra/db/KeyCacheTest.java
index 445fc67..475f1a1 100644
--- a/test/unit/org/apache/cassandra/db/KeyCacheTest.java
+++ b/test/unit/org/apache/cassandra/db/KeyCacheTest.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.db;
 
 import java.io.IOException;
-import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -41,8 +40,8 @@
 import org.apache.cassandra.cache.ICache;
 import org.apache.cassandra.cache.KeyCacheKey;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.compaction.OperationType;
+import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
@@ -75,12 +74,13 @@
     private static final String COLUMN_FAMILY7 = "Standard7";
     private static final String COLUMN_FAMILY8 = "Standard8";
     private static final String COLUMN_FAMILY9 = "Standard9";
+    private static final String COLUMN_FAMILY10 = "Standard10";
 
     private static final String COLUMN_FAMILY_K2_1 = "Standard1";
 
 
     @BeforeClass
-    public static void defineSchema() throws ConfigurationException, UnknownHostException
+    public static void defineSchema() throws ConfigurationException
     {
         SchemaLoader.prepareServer();
         SchemaLoader.createKeyspace(KEYSPACE1,
@@ -93,11 +93,13 @@
                                     SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY6),
                                     SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY7),
                                     SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY8),
-                                    SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY9));
+                                    SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY9),
+                                    SchemaLoader.standardCFMD(KEYSPACE1, COLUMN_FAMILY10));
 
         SchemaLoader.createKeyspace(KEYSPACE2,
                                     KeyspaceParams.simple(1),
                                     SchemaLoader.standardCFMD(KEYSPACE2, COLUMN_FAMILY_K2_1));
+
     }
 
     @AfterClass
@@ -132,7 +134,7 @@
 
         // insert data and force to disk
         SchemaLoader.insertData(KEYSPACE1, cf, 0, 100);
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         // populate the cache
         readData(KEYSPACE1, cf, 0, 100);
@@ -202,7 +204,7 @@
     {
         return ColumnFamilyStore.getIfExists(k.desc.ksname, k.desc.cfname).getLiveSSTables()
                                 .stream()
-                                .filter(sstreader -> sstreader.descriptor.generation == k.desc.generation)
+                                .filter(sstreader -> sstreader.descriptor.id == k.desc.id)
                                 .findFirst().get();
     }
 
@@ -232,7 +234,7 @@
 
         // insert data and force to disk
         SchemaLoader.insertData(KEYSPACE1, cf, 0, 100);
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         Collection<SSTableReader> firstFlushTables = ImmutableList.copyOf(store.getLiveSSTables());
 
@@ -242,7 +244,7 @@
 
         // insert some new data and force to disk
         SchemaLoader.insertData(KEYSPACE1, cf, 100, 50);
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         // check that it's fine
         readData(KEYSPACE1, cf, 100, 50);
@@ -303,7 +305,7 @@
         new RowUpdateBuilder(cfs.metadata(), 0, "key2").clustering("2").build().applyUnsafe();
 
         // to make sure we have SSTable
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // reads to cache key position
         Util.getAll(Util.cmd(cfs, "key1").build());
@@ -317,7 +319,7 @@
             throw new IllegalStateException();
 
         Util.compactAll(cfs, Integer.MAX_VALUE).get();
-        boolean noEarlyOpen = DatabaseDescriptor.getSSTablePreemptiveOpenIntervalInMB() < 0;
+        boolean noEarlyOpen = DatabaseDescriptor.getSSTablePreemptiveOpenIntervalInMiB() < 0;
 
         // after compaction cache should have entries for new SSTables,
         // but since we have kept a reference to the old sstables,
@@ -339,16 +341,16 @@
     }
 
     @Test
-    public void testKeyCacheLoadNegativeCacheLoadTime() throws Exception
+    public void testKeyCacheLoadZeroCacheLoadTime() throws Exception
     {
-        DatabaseDescriptor.setCacheLoadTimeout(-1);
+        DatabaseDescriptor.setCacheLoadTimeout(0);
         String cf = COLUMN_FAMILY7;
 
         createAndInvalidateCache(Collections.singletonList(Pair.create(KEYSPACE1, cf)), 100);
 
         CacheService.instance.keyCache.loadSaved();
 
-        // Here max time to load cache is negative which means no time left to load cache. So the keyCache size should
+        // Here max time to load cache is zero which means no time left to load cache. So the keyCache size should
         // be zero after loadSaved().
         assertKeyCacheSize(0, KEYSPACE1, cf);
     }
@@ -424,7 +426,7 @@
 
             // insert data and force to disk
             SchemaLoader.insertData(keyspace, cf, 0, numberOfRows);
-            store.forceBlockingFlush();
+            Util.flush(store);
         }
         for(Pair<String, String> entry : tables)
         {
diff --git a/test/unit/org/apache/cassandra/db/KeyspaceTest.java b/test/unit/org/apache/cassandra/db/KeyspaceTest.java
index fd15366..2445fe3 100644
--- a/test/unit/org/apache/cassandra/db/KeyspaceTest.java
+++ b/test/unit/org/apache/cassandra/db/KeyspaceTest.java
@@ -21,9 +21,9 @@
 import java.nio.ByteBuffer;
 import java.util.*;
 
+import org.apache.cassandra.schema.Schema;
 import org.assertj.core.api.Assertions;
 import org.junit.Test;
-import org.mockito.Mockito;
 
 import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
@@ -37,7 +37,6 @@
 import org.apache.cassandra.db.partitions.PartitionIterator;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.metrics.ClearableHistogram;
-import org.apache.cassandra.schema.SchemaProvider;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -86,7 +85,7 @@
             Util.assertEmpty(Util.cmd(cfs, "0").columns("c").includeRow(1).build());
 
             if (round == 0)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
         }
     }
 
@@ -121,7 +120,7 @@
             }
 
             if (round == 0)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
         }
     }
 
@@ -138,7 +137,7 @@
         for (String key : new String[]{"0", "2"})
             Util.assertEmpty(Util.cmd(cfs, key).build());
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         for (String key : new String[]{"0", "2"})
             Util.assertEmpty(Util.cmd(cfs, key).build());
@@ -210,7 +209,7 @@
             assertRowsInSlice(cfs, "0", 288, 299, 12, true, prefix);
 
             if (round == 0)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
         }
     }
 
@@ -223,7 +222,7 @@
         for (int i = 0; i < 10; i++)
             execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", "0", i, i);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         for (int i = 10; i < 20; i++)
         {
@@ -337,7 +336,7 @@
             assertRowsInResult(cfs, command);
 
             if (round == 0)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
         }
     }
 
@@ -360,7 +359,7 @@
             assertRowsInResult(cfs, command, 1);
 
             if (round == 0)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
         }
     }
 
@@ -373,7 +372,7 @@
         for (int i = 1; i < 7; i++)
             execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", "0", i, i);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // overwrite three rows with -1
         for (int i = 1; i < 4; i++)
@@ -385,7 +384,7 @@
             assertRowsInResult(cfs, command, -1, -1, 4);
 
             if (round == 0)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
         }
     }
 
@@ -398,7 +397,7 @@
         for (int i = 1000; i < 2000; i++)
             execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", "0", i, i);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         validateSliceLarge(cfs);
 
@@ -415,6 +414,20 @@
     }
 
     @Test
+    public void testSnapshotCreation() throws Throwable {
+        createTable("CREATE TABLE %s (a text, b int, c int, PRIMARY KEY (a, b))");
+
+        execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?)", "0", 0, 0);
+
+        Keyspace ks = Keyspace.open(KEYSPACE_PER_TEST);
+        String table = getCurrentColumnFamilyStore().name;
+        ks.snapshot("test", table);
+
+        assertTrue(ks.snapshotExists("test"));
+        assertEquals(1, ks.getAllSnapshots().count());
+    }
+
+    @Test
     public void testLimitSSTables() throws Throwable
     {
         createTable("CREATE TABLE %s (a text, b int, c int, PRIMARY KEY (a, b))");
@@ -426,7 +439,7 @@
             for (int i = 1000 + (j*100); i < 1000 + ((j+1)*100); i++)
                 execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP ?", "0", i, i, (long)i);
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         ((ClearableHistogram)cfs.metric.sstablesPerReadHistogram.cf).clear();
@@ -499,12 +512,9 @@
     @Test
     public void shouldThrowOnMissingKeyspace()
     {
-        SchemaProvider schema = Mockito.mock(SchemaProvider.class);
         String ksName = "MissingKeyspace";
-        
-        Mockito.when(schema.getKeyspaceMetadata(ksName)).thenReturn(null);
 
-        Assertions.assertThatThrownBy(() -> Keyspace.open(ksName, schema, false))
+        Assertions.assertThatThrownBy(() -> Keyspace.open(ksName, Schema.instance, false))
                   .isInstanceOf(AssertionError.class)
                   .hasMessage("Unknown keyspace " + ksName);
     }
diff --git a/test/unit/org/apache/cassandra/db/MmapFileTest.java b/test/unit/org/apache/cassandra/db/MmapFileTest.java
index 71a218e..4619df3 100644
--- a/test/unit/org/apache/cassandra/db/MmapFileTest.java
+++ b/test/unit/org/apache/cassandra/db/MmapFileTest.java
@@ -17,8 +17,6 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
-import java.io.RandomAccessFile;
 import java.lang.management.ManagementFactory;
 import java.nio.MappedByteBuffer;
 import java.nio.channels.FileChannel;
@@ -26,13 +24,25 @@
 import javax.management.MBeanServer;
 import javax.management.ObjectName;
 
+import org.apache.cassandra.Util;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.io.util.FileUtils;
 
 public class MmapFileTest
 {
+    @BeforeClass
+    public static void setup()
+    {
+        // PathUtils touches StorageService which touches StreamManager which requires configs be setup
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+
     /**
      * Verifies that {@link sun.misc.Cleaner} works and that mmap'd files can be deleted.
      */
@@ -56,20 +66,9 @@
         {
             int size = 1024 * 1024;
 
-            try (RandomAccessFile raf = new RandomAccessFile(f1, "rw"))
-            {
-                raf.setLength(size);
-            }
-
-            try (RandomAccessFile raf = new RandomAccessFile(f2, "rw"))
-            {
-                raf.setLength(size);
-            }
-
-            try (RandomAccessFile raf = new RandomAccessFile(f3, "rw"))
-            {
-                raf.setLength(size);
-            }
+            Util.setFileLength(f1, size);
+            Util.setFileLength(f2, size);
+            Util.setFileLength(f3,size);
 
             try (FileChannel channel = FileChannel.open(f1.toPath(), StandardOpenOption.WRITE, StandardOpenOption.READ))
             {
@@ -148,16 +147,16 @@
             Assert.assertEquals("# of mapped buffers should be 0", Long.valueOf(0L), mmapCount);
             Assert.assertEquals("amount of mapped memory should be 0", Long.valueOf(0L), mmapMemoryUsed);
 
-            Assert.assertTrue(f1.delete());
-            Assert.assertTrue(f2.delete());
-            Assert.assertTrue(f3.delete());
+            Assert.assertTrue(f1.tryDelete());
+            Assert.assertTrue(f2.tryDelete());
+            Assert.assertTrue(f3.tryDelete());
         }
         finally
         {
             Runtime.getRuntime().gc();
-            f1.delete();
-            f2.delete();
-            f3.delete();
+            f1.tryDelete();
+            f2.tryDelete();
+            f3.tryDelete();
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/MultiKeyspaceTest.java b/test/unit/org/apache/cassandra/db/MultiKeyspaceTest.java
index d690253..5ecd5b0 100644
--- a/test/unit/org/apache/cassandra/db/MultiKeyspaceTest.java
+++ b/test/unit/org/apache/cassandra/db/MultiKeyspaceTest.java
@@ -20,7 +20,9 @@
  *
  */
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
+
 import org.junit.Test;
 
 
@@ -38,8 +40,8 @@
         execute("INSERT INTO multikstest1.standard1 (a, b) VALUES (0, 0)");
         execute("INSERT INTO multikstest2.standard1 (a, b) VALUES (0, 0)");
 
-        Keyspace.open("multikstest1").flush();
-        Keyspace.open("multikstest2").flush();
+        Util.flushKeyspace("multikstest1");
+        Util.flushKeyspace("multikstest2");
 
         assertRows(execute("SELECT * FROM multikstest1.standard1"),
                    row(0, 0));
diff --git a/test/unit/org/apache/cassandra/db/MutationExceededMaxSizeExceptionTest.java b/test/unit/org/apache/cassandra/db/MutationExceededMaxSizeExceptionTest.java
index 81d9735..09ab8a1 100644
--- a/test/unit/org/apache/cassandra/db/MutationExceededMaxSizeExceptionTest.java
+++ b/test/unit/org/apache/cassandra/db/MutationExceededMaxSizeExceptionTest.java
@@ -43,4 +43,4 @@
         assertEquals("aaa, bbb and 1 more.", makeTopKeysString(new ArrayList<>(keys), 8));
         assertEquals("aaa, bbb and 1 more.", makeTopKeysString(new ArrayList<>(keys), 10));
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/db/NameSortTest.java b/test/unit/org/apache/cassandra/db/NameSortTest.java
index 0d7b09c..2fdd735 100644
--- a/test/unit/org/apache/cassandra/db/NameSortTest.java
+++ b/test/unit/org/apache/cassandra/db/NameSortTest.java
@@ -84,7 +84,7 @@
             rub.build().applyUnsafe();
         }
         validateNameSort(cfs);
-        keyspace.getColumnFamilyStore("Standard1").forceBlockingFlush();
+        keyspace.getColumnFamilyStore("Standard1").forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
         validateNameSort(cfs);
     }
 
diff --git a/test/unit/org/apache/cassandra/db/NativeCellTest.java b/test/unit/org/apache/cassandra/db/NativeCellTest.java
index f52490d..c70bb3b 100644
--- a/test/unit/org/apache/cassandra/db/NativeCellTest.java
+++ b/test/unit/org/apache/cassandra/db/NativeCellTest.java
@@ -20,7 +20,6 @@
 import java.nio.ByteBuffer;
 import java.util.Random;
 import java.util.UUID;
-import java.util.concurrent.CompletableFuture;
 
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -35,6 +34,7 @@
 import org.apache.cassandra.db.marshal.SetType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.db.rows.*;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.memory.HeapCloner;
 import org.apache.cassandra.utils.memory.NativeAllocator;
@@ -47,7 +47,7 @@
     private static final NativeAllocator nativeAllocator = new NativePool(Integer.MAX_VALUE,
                                                                           Integer.MAX_VALUE,
                                                                           1f,
-                                                                          () -> CompletableFuture.completedFuture(true)).newAllocator();
+                                                                          () -> ImmediateFuture.success(true)).newAllocator(null);
     @SuppressWarnings("resource")
     private static final OpOrder.Group group = new OpOrder().start();
     private static Random rand;
diff --git a/test/unit/org/apache/cassandra/db/PartitionRangeReadTest.java b/test/unit/org/apache/cassandra/db/PartitionRangeReadTest.java
index 986a125..2038748 100644
--- a/test/unit/org/apache/cassandra/db/PartitionRangeReadTest.java
+++ b/test/unit/org/apache/cassandra/db/PartitionRangeReadTest.java
@@ -100,14 +100,14 @@
                 .add("val", "val1")
                 .build()
                 .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, "k1")
                 .clustering(new BigInteger(new byte[]{0, 0, 1}))
                 .add("val", "val2")
                 .build()
                 .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // fetch by the first column name; we should get the second version of the column value
         Row row = Util.getOnlyRow(Util.cmd(cfs, "k1").includeRow(new BigInteger(new byte[]{1})).build());
@@ -157,7 +157,7 @@
             builder.build().applyUnsafe();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         ColumnMetadata cDef = cfs.metadata().getColumn(ByteBufferUtil.bytes("val"));
 
diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
index 8f61a05..83b79ac 100644
--- a/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
+++ b/test/unit/org/apache/cassandra/db/RangeTombstoneListTest.java
@@ -31,10 +31,11 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.marshal.Int32Type;
-import org.apache.cassandra.distributed.impl.IsolatedExecutor;
+import org.apache.cassandra.distributed.shared.ThrowingRunnable;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertSame;
@@ -334,7 +335,7 @@
         int MAX_IT_DISTANCE = 10;
         int MAX_MARKEDAT = 10;
 
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         Random rand = new Random(seed);
 
         for (int i = 0; i < TEST_COUNT; i++)
@@ -609,7 +610,7 @@
         }
     }
 
-    private void assertHasException(IsolatedExecutor.ThrowingRunnable block, Consumer<Throwable> verifier)
+    private void assertHasException(ThrowingRunnable block, Consumer<Throwable> verifier)
     {
         try
         {
diff --git a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
index 755302d..0ce0c14 100644
--- a/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
+++ b/test/unit/org/apache/cassandra/db/RangeTombstoneTest.java
@@ -45,8 +45,8 @@
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -85,7 +85,7 @@
         for (int i = 0; i < 40; i += 2)
             builder.newRow(i).add("val", i);
         builder.applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, key).addRangeTombstone(10, 22).build().applyUnsafe();
 
@@ -235,7 +235,7 @@
 
         int nowInSec = FBUtilities.nowInSeconds();
         new Mutation(PartitionUpdate.fullPartitionDelete(cfs.metadata(), Util.dk(key), 1000, nowInSec)).apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
         assertTimes(sstable.getSSTableMetadata(), 1000, 1000, nowInSec);
@@ -257,7 +257,7 @@
         key = "rt_times2";
         int nowInSec = FBUtilities.nowInSeconds();
         new Mutation(PartitionUpdate.fullPartitionDelete(cfs.metadata(), Util.dk(key), 1000, nowInSec)).apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
         assertTimes(sstable.getSSTableMetadata(), 999, 1000, Integer.MAX_VALUE);
@@ -276,7 +276,7 @@
 
         int nowInSec = FBUtilities.nowInSeconds();
         new RowUpdateBuilder(cfs.metadata(), nowInSec, 1000L, key).addRangeTombstone(1, 2).build().apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
         assertTimes(sstable.getSSTableMetadata(), 1000, 1000, nowInSec);
@@ -298,9 +298,9 @@
         key = "rt_times2";
         int nowInSec = FBUtilities.nowInSeconds();
         new Mutation(PartitionUpdate.fullPartitionDelete(cfs.metadata(), Util.dk(key), 1000, nowInSec)).apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
         assertTimes(sstable.getSSTableMetadata(), 999, 1000, Integer.MAX_VALUE);
         cfs.forceMajorCompaction();
@@ -320,7 +320,7 @@
     {
         Keyspace ks = Keyspace.open(KSNAME);
         ColumnFamilyStore cfs = ks.getColumnFamilyStore(CFNAME);
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(2).build());
 
         String key = "7810";
 
@@ -328,10 +328,10 @@
         for (int i = 10; i < 20; i ++)
             builder.newRow(i).add("val", i);
         builder.apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, key).addRangeTombstone(10, 11).build().apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Thread.sleep(5);
         cfs.forceMajorCompaction();
@@ -343,17 +343,17 @@
     {
         Keyspace ks = Keyspace.open(KSNAME);
         ColumnFamilyStore cfs = ks.getColumnFamilyStore(CFNAME);
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(2).build());
 
         String key = "7808_1";
         UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), key).withTimestamp(0);
         for (int i = 0; i < 40; i += 2)
             builder.newRow(i).add("val", i);
         builder.apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new Mutation(PartitionUpdate.fullPartitionDelete(cfs.metadata(), Util.dk(key), 1, 1)).apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Thread.sleep(5);
         cfs.forceMajorCompaction();
     }
@@ -363,20 +363,20 @@
     {
         Keyspace ks = Keyspace.open(KSNAME);
         ColumnFamilyStore cfs = ks.getColumnFamilyStore(CFNAME);
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(2).build());
 
         String key = "7808_2";
         UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), key).withTimestamp(0);
         for (int i = 10; i < 20; i ++)
             builder.newRow(i).add("val", i);
         builder.apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new Mutation(PartitionUpdate.fullPartitionDelete(cfs.metadata(), Util.dk(key), 0, 0)).apply();
 
         UpdateBuilder.create(cfs.metadata(), key).withTimestamp(1).newRow(5).add("val", 5).apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Thread.sleep(5);
         cfs.forceMajorCompaction();
         assertEquals(1, Util.getOnlyPartitionUnfiltered(Util.cmd(cfs, key).build()).rowCount());
@@ -396,16 +396,16 @@
         for (int i = 0; i < 20; i++)
             builder.newRow(i).add("val", i);
         builder.applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, key).addRangeTombstone(5, 15).build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, key).addRangeTombstone(5, 10).build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 2, key).addRangeTombstone(5, 8).build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Partition partition = Util.getOnlyPartitionUnfiltered(Util.cmd(cfs, key).build());
         int nowInSec = FBUtilities.nowInSeconds();
@@ -447,11 +447,11 @@
         String key = "k3";
 
         UpdateBuilder.create(cfs.metadata(), key).withTimestamp(0).newRow(2).add("val", 2).applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, key).addRangeTombstone(0, 10).build().applyUnsafe();
         UpdateBuilder.create(cfs.metadata(), key).withTimestamp(2).newRow(1).add("val", 1).applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // Get the last value of the row
         FilteredPartition partition = Util.getOnlyPartition(Util.cmd(cfs, key).build());
@@ -489,7 +489,7 @@
                 current.unbuild()
                        .indexes(current.indexes.with(indexDef))
                        .build();
-            MigrationManager.announceTableUpdate(updated, true);
+            SchemaTestUtil.announceTableUpdate(updated);
         }
 
         Future<?> rebuild = cfs.indexManager.addIndex(indexDef, false);
@@ -508,10 +508,10 @@
         for (int i = 0; i < 10; i++)
             builder.newRow(i).add("val", i);
         builder.applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 0, key).addRangeTombstone(0, 7).build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         assertEquals(10, index.rowsInserted.size());
 
@@ -538,10 +538,10 @@
         for (int i = 0; i < 10; i += 2)
             builder.newRow(i).add("val", i);
         builder.applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 0, key).addRangeTombstone(0, 7).build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // there should be 2 sstables
         assertEquals(2, cfs.getLiveSSTables().size());
@@ -595,7 +595,7 @@
                 current.unbuild()
                        .indexes(current.indexes.with(indexDef))
                        .build();
-            MigrationManager.announceTableUpdate(updated, true);
+            SchemaTestUtil.announceTableUpdate(updated);
         }
 
         Future<?> rebuild = cfs.indexManager.addIndex(indexDef, false);
@@ -614,7 +614,7 @@
         // now re-insert that column
         UpdateBuilder.create(cfs.metadata(), key).withTimestamp(2).newRow(1).add("val", 1).applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // We should have 1 insert and 1 update to the indexed "1" column
         // CASSANDRA-6640 changed index update to just update, not insert then delete
diff --git a/test/unit/org/apache/cassandra/db/ReadCommandTest.java b/test/unit/org/apache/cassandra/db/ReadCommandTest.java
index 8eec769..43a7952 100644
--- a/test/unit/org/apache/cassandra/db/ReadCommandTest.java
+++ b/test/unit/org/apache/cassandra/db/ReadCommandTest.java
@@ -72,6 +72,7 @@
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableParams;
 import org.apache.cassandra.service.ActiveRepairService;
@@ -79,11 +80,13 @@
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.EMPTY_BYTE_BUFFER;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -217,7 +220,7 @@
                 .build()
                 .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 0, ByteBufferUtil.bytes("key2"))
                 .clustering("Column1")
@@ -233,7 +236,7 @@
     }
 
     @Test
-    public void testSinglePartitionSliceAbort() throws Exception
+    public void testSinglePartitionSliceAbort()
     {
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(CF2);
 
@@ -245,7 +248,7 @@
                 .build()
                 .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 0, ByteBufferUtil.bytes("key"))
                 .clustering("dd")
@@ -264,7 +267,7 @@
     }
 
     @Test
-    public void testSinglePartitionNamesAbort() throws Exception
+    public void testSinglePartitionNamesAbort()
     {
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(CF2);
 
@@ -276,7 +279,7 @@
                 .build()
                 .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 0, ByteBufferUtil.bytes("key"))
                 .clustering("dd")
@@ -355,9 +358,9 @@
                 commands.add(SinglePartitionReadCommand.create(cfs.metadata(), nowInSeconds, columnFilter, rowFilter, DataLimits.NONE, Util.dk(data[1]), sliceFilter));
             }
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
 
-            ReadQuery query = new SinglePartitionReadCommand.Group(commands, DataLimits.NONE);
+            ReadQuery query = SinglePartitionReadCommand.Group.create(commands, DataLimits.NONE);
 
             try (ReadExecutionController executionController = query.executionController();
                  UnfilteredPartitionIterator iter = query.executeLocally(executionController);
@@ -525,9 +528,9 @@
                         DataLimits.NONE, Util.dk(data[1]), sliceFilter));
             }
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
 
-            ReadQuery query = new SinglePartitionReadCommand.Group(commands, DataLimits.NONE);
+            ReadQuery query = SinglePartitionReadCommand.Group.create(commands, DataLimits.NONE);
 
             try (ReadExecutionController executionController = query.executionController();
                     UnfilteredPartitionIterator iter = query.executeLocally(executionController);
@@ -601,9 +604,9 @@
                         DataLimits.NONE, Util.dk(data[1]), sliceFilter));
             }
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
 
-            ReadQuery query = new SinglePartitionReadCommand.Group(commands, DataLimits.NONE);
+            ReadQuery query = SinglePartitionReadCommand.Group.create(commands, DataLimits.NONE);
 
             try (ReadExecutionController executionController = query.executionController();
                     UnfilteredPartitionIterator iter = query.executeLocally(executionController);
@@ -660,7 +663,7 @@
             .build()
             .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, ByteBufferUtil.bytes("key"))
             .clustering("dd")
@@ -668,10 +671,10 @@
             .build()
             .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         List<SSTableReader> sstables = new ArrayList<>(cfs.getLiveSSTables());
         assertEquals(2, sstables.size());
-        Collections.sort(sstables, SSTableReader.maxTimestampDescending);
+        sstables.sort(SSTableReader.maxTimestampDescending);
 
         ReadCommand readCommand = Util.cmd(cfs, Util.dk("key")).includeRow("dd").columns("a").build();
 
@@ -689,7 +692,7 @@
     }
 
     @Test
-    public void dontIncludeLegacyCounterContextInDigest() throws IOException
+    public void dontIncludeLegacyCounterContextInDigest()
     {
         // Serializations of a CounterContext containing legacy (pre-2.1) shards
         // can legitimately differ across replicas. For this reason, the context
@@ -707,13 +710,13 @@
                 .addLegacyCounterCell("c", 0L)
                 .build()
                 .apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
 
         // execute a read and capture the digest
         ReadCommand readCommand = Util.cmd(cfs, Util.dk("key")).build();
         ByteBuffer digestWithLegacyCounter0 = performReadAndVerifyRepairedInfo(readCommand, 1, 1, true);
-        assertFalse(EMPTY_BYTE_BUFFER.equals(digestWithLegacyCounter0));
+        assertNotEquals(EMPTY_BYTE_BUFFER, digestWithLegacyCounter0);
 
         // truncate, then re-insert the same partition, but this time with a legacy
         // shard having the value 1. The repaired digest should match the previous, as
@@ -724,7 +727,7 @@
                 .addLegacyCounterCell("c", 1L)
                 .build()
                 .apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
 
         ByteBuffer digestWithLegacyCounter1 = performReadAndVerifyRepairedInfo(readCommand, 1, 1, true);
@@ -739,13 +742,13 @@
                 .add("c", 1L)
                 .build()
                 .apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
 
         ByteBuffer digestWithCounterCell = performReadAndVerifyRepairedInfo(readCommand, 1, 1, true);
-        assertFalse(EMPTY_BYTE_BUFFER.equals(digestWithCounterCell));
-        assertFalse(digestWithLegacyCounter0.equals(digestWithCounterCell));
-        assertFalse(digestWithLegacyCounter1.equals(digestWithCounterCell));
+        assertNotEquals(EMPTY_BYTE_BUFFER, digestWithCounterCell);
+        assertNotEquals(digestWithLegacyCounter0, digestWithCounterCell);
+        assertNotEquals(digestWithLegacyCounter1, digestWithCounterCell);
     }
 
     /**
@@ -756,7 +759,7 @@
      * Also, neither digest should be empty as the partition is not made empty by the purging.
      */
     @Test
-    public void purgeGCableTombstonesBeforeCalculatingDigest() throws Exception
+    public void purgeGCableTombstonesBeforeCalculatingDigest()
     {
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(CF8);
         cfs.truncateBlocking();
@@ -765,7 +768,6 @@
 
         DecoratedKey[] keys = new DecoratedKey[] { Util.dk("key0"), Util.dk("key1"), Util.dk("key2"), Util.dk("key3") };
         int nowInSec = FBUtilities.nowInSeconds();
-        TableMetadata cfm = cfs.metadata();
 
         // A simple tombstone
         new RowUpdateBuilder(cfs.metadata(), 0, keys[0]).clustering("cc").delete("a").build().apply();
@@ -783,7 +785,7 @@
         // Partition with 2 rows, one fully deleted
         new RowUpdateBuilder(cfs.metadata.get(), 0, keys[3]).clustering("bb").add("a", ByteBufferUtil.bytes("a")).delete("b").build().apply();
         RowUpdateBuilder.deleteRow(cfs.metadata(), 0, keys[3], "cc").apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
 
         Map<DecoratedKey, ByteBuffer> digestsWithTombstones = new HashMap<>();
@@ -851,7 +853,7 @@
                                                         .build());
         // Insert and repair
         insert(cfs, IntStream.range(0, 10), () -> IntStream.range(0, 10));
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
         // Insert and leave unrepaired
         insert(cfs, IntStream.range(0, 10), () -> IntStream.range(10, 20));
@@ -901,10 +903,7 @@
     {
         TableParams newParams = cfs.metadata().params.unbuild().gcGraceSeconds(gcGrace).build();
         KeyspaceMetadata keyspaceMetadata = Schema.instance.getKeyspaceMetadata(cfs.metadata().keyspace);
-        Schema.instance.load(
-        keyspaceMetadata.withSwapped(
-        keyspaceMetadata.tables.withSwapped(
-        cfs.metadata().withSwapped(newParams))));
+        SchemaTestUtil.addOrUpdateKeyspace(keyspaceMetadata.withSwapped(keyspaceMetadata.tables.withSwapped(cfs.metadata().withSwapped(newParams))), true);
     }
 
     private long getAndResetOverreadCount(ColumnFamilyStore cfs)
@@ -975,7 +974,7 @@
      * the row deletion is eligible for purging, both the result set and the repaired data digest should
      * be empty.
      */
-    private void fullyPurgedPartitionCreatesEmptyDigest(ColumnFamilyStore cfs, ReadCommand command) throws Exception
+    private void fullyPurgedPartitionCreatesEmptyDigest(ColumnFamilyStore cfs, ReadCommand command)
     {
         cfs.truncateBlocking();
         cfs.disableAutoCompaction();
@@ -984,7 +983,7 @@
         // Partition with a fully deleted static row and a single, fully deleted regular row
         RowUpdateBuilder.deleteRow(cfs.metadata(), 0, ByteBufferUtil.bytes("key")).apply();
         RowUpdateBuilder.deleteRow(cfs.metadata(), 0, ByteBufferUtil.bytes("key"), "cc").apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
 
         try (ReadExecutionController controller = command.executionController(true))
@@ -1034,12 +1033,12 @@
 
         // Live partition in a repaired sstable, so included in the digest calculation
         new RowUpdateBuilder(cfs.metadata.get(), 0, ByteBufferUtil.bytes("key-0")).clustering("cc").add("a", ByteBufferUtil.bytes("a")).build().apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
         // Fully deleted partition (static and regular rows) in an unrepaired sstable, so not included in the intial digest
         RowUpdateBuilder.deleteRow(cfs.metadata(), 0, ByteBufferUtil.bytes("key-1")).apply();
         RowUpdateBuilder.deleteRow(cfs.metadata(), 0, ByteBufferUtil.bytes("key-1"), "cc").apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         ByteBuffer digestWithoutPurgedPartition = null;
         
@@ -1067,7 +1066,7 @@
     }
 
     @Test
-    public void purgingConsidersRepairedDataOnly() throws Exception
+    public void purgingConsidersRepairedDataOnly()
     {
         // 2 sstables, first is repaired and contains data that is all purgeable
         // the second is unrepaired and contains non-purgable data. Even though
@@ -1082,11 +1081,11 @@
         DecoratedKey key = Util.dk("key");
         RowUpdateBuilder.deleteRow(cfs.metadata(), 0, key).apply();
         RowUpdateBuilder.deleteRow(cfs.metadata(), 0, key, "cc").apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.getLiveSSTables().forEach(sstable -> mutateRepaired(cfs, sstable, 111, null));
 
         new RowUpdateBuilder(cfs.metadata(), 1, key).clustering("cc").add("a", ByteBufferUtil.bytes("a")).build().apply();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         int nowInSec = FBUtilities.nowInSeconds() + 10;
         ReadCommand cmd = Util.cmd(cfs, key).withNowInSeconds(nowInSec).build();
@@ -1127,7 +1126,7 @@
                 .build()
                 .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         ReadCommand readCommand = Util.cmd(cfs, Util.dk("key")).build();
         assertTrue(cfs.isRowCacheEnabled());
@@ -1191,7 +1190,20 @@
                                                            ReplicaUtils.full(addr, token)));
     }
 
-    private void testRepairedDataTracking(ColumnFamilyStore cfs, ReadCommand readCommand) throws IOException
+    @Test
+    public void testToCQLString()
+    {
+        ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(CF2);
+        DecoratedKey key = Util.dk("key");
+
+        ReadCommand readCommand = Util.cmd(cfs, key).build();
+
+        String result = readCommand.toCQLString();
+
+        assertEquals(result, String.format("SELECT * FROM \"ReadCommandTest\".\"Standard2\" WHERE key = 0x%s ALLOW FILTERING", ByteBufferUtil.bytesToHex(key.getKey())));
+    }
+
+    private void testRepairedDataTracking(ColumnFamilyStore cfs, ReadCommand readCommand)
     {
         cfs.truncateBlocking();
         cfs.disableAutoCompaction();
@@ -1202,7 +1214,7 @@
                 .build()
                 .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 1, ByteBufferUtil.bytes("key"))
                 .clustering("dd")
@@ -1210,7 +1222,7 @@
                 .build()
                 .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         List<SSTableReader> sstables = new ArrayList<>(cfs.getLiveSSTables());
         assertEquals(2, sstables.size());
         sstables.forEach(sstable -> assertFalse(sstable.isRepaired() || sstable.isPendingRepair()));
@@ -1229,13 +1241,13 @@
         digests.add(digest);
 
         // add a pending repair session to table1, digest should remain the same but now we expect it to be marked inconclusive
-        UUID session1 = UUIDGen.getTimeUUID();
+        TimeUUID session1 = nextTimeUUID();
         mutateRepaired(cfs, sstable1, ActiveRepairService.UNREPAIRED_SSTABLE, session1);
         digests.add(performReadAndVerifyRepairedInfo(readCommand, numPartitions, rowsPerPartition, false));
         assertEquals(1, digests.size());
 
         // add a different pending session to table2, digest should remain the same and still consider it inconclusive
-        UUID session2 = UUIDGen.getTimeUUID();
+        TimeUUID session2 = nextTimeUUID();
         mutateRepaired(cfs, sstable2, ActiveRepairService.UNREPAIRED_SSTABLE, session2);
         digests.add(performReadAndVerifyRepairedInfo(readCommand, numPartitions, rowsPerPartition, false));
         assertEquals(1, digests.size());
@@ -1267,13 +1279,13 @@
             assertEquals(EMPTY_BYTE_BUFFER, digest);
 
             // now flush so we have an unrepaired table with the deletion and repeat the check
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
             digest = performReadAndVerifyRepairedInfo(readCommand, 0, rowsPerPartition, false);
             assertEquals(EMPTY_BYTE_BUFFER, digest);
         }
     }
 
-    private void mutateRepaired(ColumnFamilyStore cfs, SSTableReader sstable, long repairedAt, UUID pendingSession)
+    private void mutateRepaired(ColumnFamilyStore cfs, SSTableReader sstable, long repairedAt, TimeUUID pendingSession)
     {
         try
         {
diff --git a/test/unit/org/apache/cassandra/db/ReadCommandVerbHandlerTest.java b/test/unit/org/apache/cassandra/db/ReadCommandVerbHandlerTest.java
index 44c065a..b823f23 100644
--- a/test/unit/org/apache/cassandra/db/ReadCommandVerbHandlerTest.java
+++ b/test/unit/org/apache/cassandra/db/ReadCommandVerbHandlerTest.java
@@ -20,7 +20,6 @@
 
 import java.net.UnknownHostException;
 import java.util.Random;
-import java.util.UUID;
 
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -46,6 +45,7 @@
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.apache.cassandra.net.Verb.*;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -110,7 +110,7 @@
         handler.doVerb(Message.builder(READ_REQ, (ReadCommand) command)
                               .from(peer())
                               .withId(messageId())
-                              .withParam(ParamType.TRACE_SESSION, UUID.randomUUID())
+                              .withParam(ParamType.TRACE_SESSION, nextTimeUUID())
                               .build());
         assertFalse(command.isTrackingRepairedData());
     }
@@ -170,7 +170,8 @@
                   DataLimits.NONE,
                   KEY,
                   new ClusteringIndexSliceFilter(Slices.ALL, false),
-                  null);
+                  null,
+                  false);
         }
 
         @Override
diff --git a/test/unit/org/apache/cassandra/db/ReadResponseTest.java b/test/unit/org/apache/cassandra/db/ReadResponseTest.java
index 29fa784..f8a19fd 100644
--- a/test/unit/org/apache/cassandra/db/ReadResponseTest.java
+++ b/test/unit/org/apache/cassandra/db/ReadResponseTest.java
@@ -262,7 +262,8 @@
                   DataLimits.NONE,
                   metadata.partitioner.decorateKey(ByteBufferUtil.bytes(key)),
                   null,
-                  null);
+                  null,
+                  false);
            
         }
 
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerFlushedTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerFlushedTest.java
index d395439..acca6ed 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManagerFlushedTest.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManagerFlushedTest.java
@@ -35,6 +35,7 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.ParameterizedClass;
 import org.apache.cassandra.io.compress.ZstdCompressor;
@@ -101,8 +102,8 @@
     public void testWithFlush() throws Exception
     {
         // Flush everything that may be in the commit log now to start fresh
-        FBUtilities.waitOnFutures(Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).flush());
-        FBUtilities.waitOnFutures(Keyspace.open(SchemaConstants.SCHEMA_KEYSPACE_NAME).flush());
+        Util.flushKeyspace(SchemaConstants.SYSTEM_KEYSPACE_NAME);
+        Util.flushKeyspace(SchemaConstants.SCHEMA_KEYSPACE_NAME);
 
 
         CompactionManager.instance.disableAutoCompaction();
@@ -119,7 +120,7 @@
         Keyspace keyspace1 = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore cfs = keyspace1.getColumnFamilyStore("Standard1");
         logger.debug("forcing flush");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         logger.debug("begin manual replay");
         // replay the commit log (nothing on Standard1 should be replayed since everything was flushed, so only the row on Standard2
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerMissingHeaderTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerMissingHeaderTest.java
index 4044fff..2105867 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManagerMissingHeaderTest.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManagerMissingHeaderTest.java
@@ -18,12 +18,12 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -112,9 +112,9 @@
         keyspace2.getColumnFamilyStore("Standard3").clearUnsafe();
 
         // nuke the header
-        for (File file : new File(DatabaseDescriptor.getCommitLogLocation()).listFiles())
+        for (File file : new File(DatabaseDescriptor.getCommitLogLocation()).tryList())
         {
-            if (file.getName().endsWith(".header"))
+            if (file.name().endsWith(".header"))
                 FileUtils.deleteWithConfirm(file);
         }
 
diff --git a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
index 013f30b..c60bb97 100644
--- a/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/RecoveryManagerTest.java
@@ -23,11 +23,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Date;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.Semaphore;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
+import java.util.concurrent.*;
 import java.util.concurrent.atomic.AtomicReference;
 
 import org.junit.Assert;
@@ -61,6 +57,7 @@
 import org.apache.cassandra.security.EncryptionContext;
 import org.apache.cassandra.security.EncryptionContextGenerator;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.concurrent.AsyncFuture;
 
 import static org.junit.Assert.assertEquals;
 
@@ -160,7 +157,7 @@
             Assert.assertTrue(Util.getAllUnfiltered(Util.cmd(keyspace2.getColumnFamilyStore(CF_STANDARD3), dk).build()).isEmpty());
 
             final AtomicReference<Throwable> err = new AtomicReference<Throwable>();
-            Thread t = NamedThreadFactory.createThread(() ->
+            Thread t = NamedThreadFactory.createAnonymousThread(() ->
             {
                 try
                 {
@@ -345,33 +342,23 @@
         final Semaphore blocked = new Semaphore(0);
 
         @Override
-        protected Future<Integer> initiateMutation(final Mutation mutation,
-                final long segmentId,
-                final int serializedSize,
-                final int entryLocation,
-                final CommitLogReplayer clr)
+        protected org.apache.cassandra.utils.concurrent.Future<Integer> initiateMutation(final Mutation mutation,
+                                                                                         final long segmentId,
+                                                                                         final int serializedSize,
+                                                                                         final int entryLocation,
+                                                                                         final CommitLogReplayer clr)
         {
-            final Future<Integer> toWrap = super.initiateMutation(mutation,
-                                                                  segmentId,
-                                                                  serializedSize,
-                                                                  entryLocation,
-                                                                  clr);
-            return new Future<Integer>()
+            final org.apache.cassandra.utils.concurrent.Future<Integer> toWrap =
+                super.initiateMutation(mutation,
+                                       segmentId,
+                                       serializedSize,
+                                       entryLocation,
+                                       clr);
+
+            return new AsyncFuture<Integer>()
             {
 
                 @Override
-                public boolean cancel(boolean mayInterruptIfRunning)
-                {
-                    throw new UnsupportedOperationException();
-                }
-
-                @Override
-                public boolean isCancelled()
-                {
-                    throw new UnsupportedOperationException();
-                }
-
-                @Override
                 public boolean isDone()
                 {
                     return blocker.availablePermits() > 0 && toWrap.isDone();
@@ -380,7 +367,6 @@
                 @Override
                 public Integer get() throws InterruptedException, ExecutionException
                 {
-                    System.out.println("Got blocker once");
                     blocked.release();
                     blocker.acquire();
                     return toWrap.get();
diff --git a/test/unit/org/apache/cassandra/db/RemoveCellTest.java b/test/unit/org/apache/cassandra/db/RemoveCellTest.java
index 01fe255..1c28d1c 100644
--- a/test/unit/org/apache/cassandra/db/RemoveCellTest.java
+++ b/test/unit/org/apache/cassandra/db/RemoveCellTest.java
@@ -20,6 +20,7 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 
 public class RemoveCellTest extends CQLTester
@@ -30,7 +31,7 @@
         String tableName = createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))");
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(tableName);
         execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP ?", 0, 0, 0, 0L);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         execute("DELETE c FROM %s USING TIMESTAMP ? WHERE a = ? AND b = ?", 1L, 0, 0);
         assertRows(execute("SELECT * FROM %s WHERE a = ? AND b = ?", 0, 0), row(0, 0, null));
         assertRows(execute("SELECT c FROM %s WHERE a = ? AND b = ?", 0, 0), row(new Object[]{null}));
diff --git a/test/unit/org/apache/cassandra/db/RowCacheTest.java b/test/unit/org/apache/cassandra/db/RowCacheTest.java
index 59ce213..0bf8c5d 100644
--- a/test/unit/org/apache/cassandra/db/RowCacheTest.java
+++ b/test/unit/org/apache/cassandra/db/RowCacheTest.java
@@ -33,6 +33,7 @@
 import org.apache.cassandra.cache.RowCacheKey;
 import org.apache.cassandra.db.marshal.ValueAccessors;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.db.marshal.AsciiType;
 import org.apache.cassandra.db.rows.*;
@@ -48,6 +49,7 @@
 import org.apache.cassandra.metrics.ClearableHistogram;
 import org.apache.cassandra.schema.CachingParams;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.service.CacheService;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -94,7 +96,7 @@
         // empty the row cache
         CacheService.instance.invalidateRowCache();
 
-        // set global row cache size to 1 MB
+        // set global row cache size to 1 MiB
         CacheService.instance.setRowCacheCapacityInMB(1);
 
         ByteBuffer key = ByteBufferUtil.bytes("rowcachekey");
@@ -139,7 +141,7 @@
         // empty the row cache
         CacheService.instance.invalidateRowCache();
 
-        // set global row cache size to 1 MB
+        // set global row cache size to 1 MiB
         CacheService.instance.setRowCacheCapacityInMB(1);
 
         // inserting 100 rows into both column families
@@ -221,7 +223,7 @@
         // empty the row cache
         CacheService.instance.invalidateRowCache();
 
-        // set global row cache size to 1 MB
+        // set global row cache size to 1 MiB
         CacheService.instance.setRowCacheCapacityInMB(1);
 
         // inserting 100 rows into column family
@@ -367,7 +369,9 @@
         CacheService.instance.setRowCacheCapacityInMB(1);
         rowCacheLoad(100, 50, 0);
         CacheService.instance.rowCache.submitWrite(Integer.MAX_VALUE).get();
-        Keyspace instance = Schema.instance.removeKeyspaceInstance(KEYSPACE_CACHED);
+
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(KEYSPACE_CACHED);
+        SchemaTestUtil.dropKeyspaceIfExist(KEYSPACE_CACHED, true);
         try
         {
             CacheService.instance.rowCache.size();
@@ -378,7 +382,7 @@
         }
         finally
         {
-            Schema.instance.storeKeyspaceInstance(instance);
+            SchemaTestUtil.addOrUpdateKeyspace(ksm, true);
         }
     }
 
@@ -409,7 +413,7 @@
         // empty the row cache
         CacheService.instance.invalidateRowCache();
 
-        // set global row cache size to 1 MB
+        // set global row cache size to 1 MiB
         CacheService.instance.setRowCacheCapacityInMB(1);
 
         ByteBuffer key = ByteBufferUtil.bytes("rowcachekey");
@@ -484,14 +488,14 @@
         // empty the row cache
         CacheService.instance.invalidateRowCache();
 
-        // set global row cache size to 1 MB
+        // set global row cache size to 1 MiB
         CacheService.instance.setRowCacheCapacityInMB(1);
 
         // inserting 100 rows into both column families
         SchemaLoader.insertData(KEYSPACE_CACHED, CF_CACHED, 0, 100);
 
         //force flush for confidence that SSTables exists
-        cachedStore.forceBlockingFlush();
+        Util.flush(cachedStore);
 
         ((ClearableHistogram)cachedStore.metric.sstablesPerReadHistogram.cf).clear();
 
diff --git a/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java b/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java
index 7b774eb..a2fb57d 100644
--- a/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java
+++ b/test/unit/org/apache/cassandra/db/RowIndexEntryTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -65,8 +64,8 @@
 import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.btree.BTree;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 public class RowIndexEntryTest extends CQLTester
 {
diff --git a/test/unit/org/apache/cassandra/db/RowIterationTest.java b/test/unit/org/apache/cassandra/db/RowIterationTest.java
index b0cd4fc..894744a 100644
--- a/test/unit/org/apache/cassandra/db/RowIterationTest.java
+++ b/test/unit/org/apache/cassandra/db/RowIterationTest.java
@@ -36,7 +36,7 @@
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(tableName);
         for (int i = 0; i < 10; i++)
             execute("INSERT INTO %s (a, b, c, d) VALUES (?, ?, ?, ?) USING TIMESTAMP ?", i, 0, i, i, (long)i);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(10, execute("SELECT * FROM %s").size());
     }
 
@@ -49,7 +49,7 @@
         execute("INSERT INTO %s (a, b) VALUES (?, ?) USING TIMESTAMP ?", 0, 0, 0L);
         execute("DELETE FROM %s USING TIMESTAMP ? WHERE a = ?", 0L, 0);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // Delete row in second sstable with higher timestamp
         execute("INSERT INTO %s (a, b) VALUES (?, ?) USING TIMESTAMP ?", 0, 0, 1L);
@@ -57,7 +57,7 @@
 
         int localDeletionTime = Util.getOnlyPartitionUnfiltered(Util.cmd(cfs).build()).partitionLevelDeletion().localDeletionTime();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         DeletionTime dt = Util.getOnlyPartitionUnfiltered(Util.cmd(cfs).build()).partitionLevelDeletion();
         assertEquals(1L, dt.markedForDeleteAt());
@@ -72,7 +72,7 @@
 
         // Delete a row in first sstable
         execute("DELETE FROM %s USING TIMESTAMP ? WHERE a = ?", 0L, 0);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         assertFalse(Util.getOnlyPartitionUnfiltered(Util.cmd(cfs).build()).isEmpty());
     }
diff --git a/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java b/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java
index 8cb1e15..63ef861 100644
--- a/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java
+++ b/test/unit/org/apache/cassandra/db/SchemaCQLHelperTest.java
@@ -22,6 +22,7 @@
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.Files;
 
+import org.apache.cassandra.io.util.FileReader;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -40,7 +41,6 @@
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
 
-import java.io.FileReader;
 import java.nio.ByteBuffer;
 import java.nio.charset.Charset;
 import java.util.Arrays;
@@ -167,7 +167,7 @@
                           "    reg2 varint,\n" +
                           "    st1 varint static,\n" +
                           "    PRIMARY KEY (pk1, ck1)\n) WITH ID =";
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
 
         assertThat(actual,
                    allOf(startsWith(expected),
@@ -208,7 +208,7 @@
         ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
 
         // when re-adding, column is present as both column and as dropped column record.
-        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true);
+        String actual = SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata());
         String expected = "CREATE TABLE IF NOT EXISTS cql_test_keyspace_readded_columns.test_table_readded_columns (\n" +
                           "    pk1 varint,\n" +
                           "    ck1 varint,\n" +
@@ -247,7 +247,7 @@
 
         ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
 
-        assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true),
+        assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata()),
                    startsWith(
                    "CREATE TABLE IF NOT EXISTS cql_test_keyspace_create_table.test_table_create_table (\n" +
                    "    pk1 varint,\n" +
@@ -294,7 +294,7 @@
 
         ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(table);
 
-        assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), true, true, true),
+        assertThat(SchemaCQLHelper.getTableMetadataAsCQL(cfs.metadata(), cfs.keyspace.getMetadata()),
                    containsString("CLUSTERING ORDER BY (cl1 ASC)\n" +
                             "    AND additional_write_policy = 'ALWAYS'\n" +
                             "    AND bloom_filter_fp_chance = 1.0\n" +
@@ -303,6 +303,7 @@
                             "    AND comment = 'comment'\n" +
                             "    AND compaction = {'class': 'org.apache.cassandra.db.compaction.LeveledCompactionStrategy', 'max_threshold': '32', 'min_threshold': '4', 'sstable_size_in_mb': '1'}\n" +
                             "    AND compression = {'chunk_length_in_kb': '64', 'class': 'org.apache.cassandra.io.compress.LZ4Compressor', 'min_compress_ratio': '2.0'}\n" +
+                            "    AND memtable = 'default'\n" +
                             "    AND crc_check_chance = 0.3\n" +
                             "    AND default_time_to_live = 4\n" +
                             "    AND extensions = {'ext1': 0x76616c31}\n" +
@@ -402,7 +403,7 @@
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(tableName);
         cfs.snapshot(SNAPSHOT);
 
-        String schema = Files.toString(cfs.getDirectories().getSnapshotSchemaFile(SNAPSHOT), Charset.defaultCharset());
+        String schema = Files.toString(cfs.getDirectories().getSnapshotSchemaFile(SNAPSHOT).toJavaIOFile(), Charset.defaultCharset());
         assertThat(schema,
                    allOf(containsString(String.format("CREATE TYPE IF NOT EXISTS %s.%s (\n" +
                                                       "    a1 varint,\n" +
diff --git a/test/unit/org/apache/cassandra/db/ScrubTest.java b/test/unit/org/apache/cassandra/db/ScrubTest.java
index ad09da9..dfe9165 100644
--- a/test/unit/org/apache/cassandra/db/ScrubTest.java
+++ b/test/unit/org/apache/cassandra/db/ScrubTest.java
@@ -18,11 +18,10 @@
  */
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.io.IOError;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -33,13 +32,12 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.StringUtils;
 
-import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -85,6 +83,7 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.SchemaLoader.counterCFMD;
 import static org.apache.cassandra.SchemaLoader.createKeyspace;
@@ -354,7 +353,7 @@
         assertOrderedAll(cfs, 10);
 
         for (SSTableReader sstable : cfs.getLiveSSTables())
-            assertTrue(new File(sstable.descriptor.filenameFor(Component.PRIMARY_INDEX)).delete());
+            assertTrue(new File(sstable.descriptor.filenameFor(Component.PRIMARY_INDEX)).tryDelete());
 
         CompactionManager.instance.performScrub(cfs, false, true, 2);
 
@@ -370,10 +369,10 @@
         DatabaseDescriptor.setPartitionerUnsafe(new ByteOrderedPartitioner());
 
         // Create out-of-order SSTable
-        File tempDir = FileUtils.createTempFile("ScrubTest.testScrubOutOfOrder", "").getParentFile();
+        File tempDir = FileUtils.createTempFile("ScrubTest.testScrubOutOfOrder", "").parent();
         // create ks/cf directory
-        File tempDataDir = new File(tempDir, String.join(File.separator, ksName, CF));
-        assertTrue(tempDataDir.mkdirs());
+        File tempDataDir = new File(tempDir, String.join(File.pathSeparator(), ksName, CF));
+        assertTrue(tempDataDir.tryCreateDirectories());
         try
         {
             CompactionManager.instance.disableAutoCompaction();
@@ -468,10 +467,10 @@
 
     private static void overrideWithGarbage(SSTableReader sstable, long startPosition, long endPosition) throws IOException
     {
-        try (RandomAccessFile file = new RandomAccessFile(sstable.getFilename(), "rw"))
+        try (FileChannel fileChannel = new File(sstable.getFilename()).newReadWriteChannel())
         {
-            file.seek(startPosition);
-            file.writeBytes(StringUtils.repeat('z', (int) (endPosition - startPosition)));
+            fileChannel.position(startPosition);
+            fileChannel.write(ByteBufferUtil.bytes(StringUtils.repeat('z', (int) (endPosition - startPosition))));
         }
         if (ChunkCache.instance != null)
             ChunkCache.instance.invalidateFile(sstable.getFilename());
@@ -508,7 +507,7 @@
             new Mutation(update).applyUnsafe();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     public static void fillIndexCF(ColumnFamilyStore cfs, boolean composite, long ... values)
@@ -532,7 +531,7 @@
             new Mutation(builder.build()).applyUnsafe();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     protected static void fillCounterCF(ColumnFamilyStore cfs, int partitionsPerSSTable) throws WriteTimeoutException
@@ -545,7 +544,7 @@
             new CounterMutation(new Mutation(update), ConsistencyLevel.ONE).apply();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     @Test
@@ -556,14 +555,14 @@
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("test_compact_static_columns");
 
         QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_static_columns (a, b, c, d) VALUES (123, c3db07e8-b602-11e3-bc6b-e0b9a54a6d93, true, 'foobar')", ksName));
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         CompactionManager.instance.performScrub(cfs, false, true, 2);
 
         QueryProcessor.process(String.format("CREATE TABLE \"%s\".test_scrub_validation (a text primary key, b int)", ksName), ConsistencyLevel.ONE);
         ColumnFamilyStore cfs2 = keyspace.getColumnFamilyStore("test_scrub_validation");
 
         new Mutation(UpdateBuilder.create(cfs2.metadata(), "key").newRow().add("b", Int32Type.instance.decompose(1)).build()).apply();
-        cfs2.forceBlockingFlush();
+        Util.flush(cfs2);
 
         CompactionManager.instance.performScrub(cfs2, false, false, 2);
     }
@@ -582,7 +581,7 @@
         QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'a', 'foo')", ksName));
         QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'b', 'bar')", ksName));
         QueryProcessor.executeInternal(String.format("INSERT INTO \"%s\".test_compact_dynamic_columns (a, b, c) VALUES (0, 'c', 'boo')", ksName));
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         CompactionManager.instance.performScrub(cfs, true, true, 2);
 
         // Scrub is silent, but it will remove broken records. So reading everything back to make sure nothing to "scrubbed away"
@@ -705,7 +704,7 @@
      */
     private static class TestWriter extends BigTableWriter
     {
-        TestWriter(Descriptor descriptor, long keyCount, long repairedAt, UUID pendingRepair, boolean isTransient, TableMetadataRef metadata,
+        TestWriter(Descriptor descriptor, long keyCount, long repairedAt, TimeUUID pendingRepair, boolean isTransient, TableMetadataRef metadata,
                    MetadataCollector collector, SerializationHeader header, LifecycleTransaction txn)
         {
             super(descriptor, keyCount, repairedAt, pendingRepair, isTransient, metadata, collector, header, Collections.emptySet(), txn);
diff --git a/test/unit/org/apache/cassandra/db/SecondaryIndexTest.java b/test/unit/org/apache/cassandra/db/SecondaryIndexTest.java
index e7bfb12..14137f1 100644
--- a/test/unit/org/apache/cassandra/db/SecondaryIndexTest.java
+++ b/test/unit/org/apache/cassandra/db/SecondaryIndexTest.java
@@ -40,8 +40,8 @@
 import org.apache.cassandra.index.Index;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
@@ -300,7 +300,7 @@
         new RowUpdateBuilder(cfs.metadata(), 1, "k1").noRowMarker().add("birthdate", 1L).build().applyUnsafe();
 
         // force a flush, so our index isn't being read from a memtable
-        keyspace.getColumnFamilyStore(WITH_KEYS_INDEX).forceBlockingFlush();
+        Util.flushTable(keyspace, WITH_KEYS_INDEX);
 
         // now apply another update, but force the index update to be skipped
         keyspace.apply(new RowUpdateBuilder(cfs.metadata(), 2, "k1").noRowMarker().add("birthdate", 2L).build(),
@@ -356,7 +356,7 @@
         assertIndexedOne(cfs, col, 10l);
 
         // force a flush and retry the query, so our index isn't being read from a memtable
-        keyspace.getColumnFamilyStore(cfName).forceBlockingFlush();
+        Util.flushTable(keyspace, cfName);
         assertIndexedOne(cfs, col, 10l);
 
         // now apply another update, but force the index update to be skipped
@@ -482,7 +482,7 @@
             current.unbuild()
                    .indexes(current.indexes.with(indexDef))
                    .build();
-        MigrationManager.announceTableUpdate(updated, true);
+        SchemaTestUtil.announceTableUpdate(updated);
 
         // wait for the index to be built
         Index index = cfs.indexManager.getIndex(indexDef);
@@ -522,7 +522,7 @@
             new RowUpdateBuilder(cfs.metadata(), 0, "k" + i).noRowMarker().add("birthdate", 1l).build().applyUnsafe();
 
         assertIndexedCount(cfs, ByteBufferUtil.bytes("birthdate"), 1l, 10);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertIndexedCount(cfs, ByteBufferUtil.bytes("birthdate"), 1l, 10);
     }
 
@@ -537,7 +537,7 @@
         new RowUpdateBuilder(cfs.metadata(), 0, "k3").clustering("c").add("birthdate", 1L).add("notbirthdate", 3L).build().applyUnsafe();
         new RowUpdateBuilder(cfs.metadata(), 0, "k4").clustering("c").add("birthdate", 1L).add("notbirthdate", 3L).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         ReadCommand rc = Util.cmd(cfs)
                              .fromKeyIncl("k1")
                              .toKeyIncl("k3")
diff --git a/test/unit/org/apache/cassandra/db/SerializationHeaderTest.java b/test/unit/org/apache/cassandra/db/SerializationHeaderTest.java
index c9649b1..8f7e24b 100644
--- a/test/unit/org/apache/cassandra/db/SerializationHeaderTest.java
+++ b/test/unit/org/apache/cassandra/db/SerializationHeaderTest.java
@@ -19,6 +19,8 @@
 package org.apache.cassandra.db;
 
 import com.google.common.io.Files;
+
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.db.compaction.OperationType;
@@ -30,9 +32,9 @@
 import org.apache.cassandra.db.rows.Cell;
 import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.db.rows.UnfilteredRowIterator;
-import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableWriter;
@@ -45,13 +47,14 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.Collections;
 import java.util.concurrent.Callable;
-import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.BiFunction;
 import java.util.function.Function;
+import java.util.function.Supplier;
+
+import org.apache.cassandra.io.util.File;
 
 public class SerializationHeaderTest
 {
@@ -84,12 +87,12 @@
         schemaWithStatic = schemaWithStatic.unbuild().recordColumnDrop(columnRegular, 0L).build();
         schemaWithRegular = schemaWithRegular.unbuild().recordColumnDrop(columnStatic, 0L).build();
 
-        final AtomicInteger generation = new AtomicInteger();
-        File dir = Files.createTempDir();
+        Supplier<SequenceBasedSSTableId> id = Util.newSeqGen();
+        File dir = new File(Files.createTempDir());
         try
         {
             BiFunction<TableMetadata, Function<ByteBuffer, Clustering<?>>, Callable<Descriptor>> writer = (schema, clusteringFunction) -> () -> {
-                Descriptor descriptor = new Descriptor(BigFormat.latestVersion, dir, schema.keyspace, schema.name, generation.incrementAndGet(), SSTableFormat.Type.BIG);
+                Descriptor descriptor = new Descriptor(BigFormat.latestVersion, dir, schema.keyspace, schema.name, id.get(), SSTableFormat.Type.BIG);
 
                 SerializationHeader header = SerializationHeader.makeWithoutStats(schema);
                 try (LifecycleTransaction txn = LifecycleTransaction.offline(OperationType.WRITE);
diff --git a/test/unit/org/apache/cassandra/db/SinglePartitionReadCommandCQLTest.java b/test/unit/org/apache/cassandra/db/SinglePartitionReadCommandCQLTest.java
index 1c891ec..47e866c 100644
--- a/test/unit/org/apache/cassandra/db/SinglePartitionReadCommandCQLTest.java
+++ b/test/unit/org/apache/cassandra/db/SinglePartitionReadCommandCQLTest.java
@@ -31,10 +31,10 @@
     {
         createTable("CREATE TABLE %s (bucket_id TEXT,name TEXT,data TEXT,PRIMARY KEY (bucket_id, name))");
         execute("insert into %s (bucket_id, name, data) values ('8772618c9009cf8f5a5e0c18', 'test', 'hello')");
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         execute("insert into %s (bucket_id, name, data) values ('8772618c9009cf8f5a5e0c19', 'test2', 'hello');");
         execute("delete from %s where bucket_id = '8772618c9009cf8f5a5e0c18'");
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         UntypedResultSet res = execute("select * from %s where bucket_id = '8772618c9009cf8f5a5e0c18' and name = 'test'");
         assertTrue(res.isEmpty());
     }
diff --git a/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java b/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java
index 692b0c5..ab790dc 100644
--- a/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java
+++ b/test/unit/org/apache/cassandra/db/SinglePartitionSliceCommandTest.java
@@ -180,7 +180,7 @@
                                                      ck1));
 
         if (flush)
-            Keyspace.open(KEYSPACE).getColumnFamilyStore(TABLE_SCLICES).forceBlockingFlush();
+            Util.flushTable(KEYSPACE, TABLE_SCLICES);
 
         AbstractClusteringIndexFilter clusteringFilter = createClusteringFilter(uniqueCk1, uniqueCk2, isSlice);
         ReadCommand cmd = SinglePartitionReadCommand.create(CFM_SLICES,
@@ -279,7 +279,7 @@
         }
 
         // check (de)serialized iterator for sstable static cell
-        Schema.instance.getColumnFamilyStoreInstance(metadata.id).forceBlockingFlush();
+        Schema.instance.getColumnFamilyStoreInstance(metadata.id).forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
         try (ReadExecutionController executionController = cmd.executionController(); UnfilteredPartitionIterator pi = cmd.executeLocally(executionController))
         {
             response = ReadResponse.createDataResponse(pi, cmd, executionController.getRepairedDataInfo());
@@ -318,7 +318,7 @@
             QueryProcessor.executeOnceInternal("DELETE FROM ks.test_read_rt USING TIMESTAMP 10 WHERE k=1 AND c1=1");
 
             List<Unfiltered> memtableUnfiltereds = assertQueryReturnsSingleRT(query);
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
             List<Unfiltered> sstableUnfiltereds = assertQueryReturnsSingleRT(query);
 
             String errorMessage = String.format("Expected %s but got %s with postfix '%s'",
@@ -356,17 +356,17 @@
                                                                   timestamp,
                                                                   "DELETE FROM ks.partition_row_deletion USING TIMESTAMP 10 WHERE k=1");
             if (flush && multiSSTable)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
             QueryProcessor.executeOnceInternalWithNowAndTimestamp(nowInSec,
                                                                   timestamp,
                                                                   "DELETE FROM ks.partition_row_deletion USING TIMESTAMP 10 WHERE k=1 and c=1");
             if (flush)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
 
             QueryProcessor.executeOnceInternal("INSERT INTO ks.partition_row_deletion(k,c,v) VALUES(1,1,1) using timestamp 11");
             if (flush)
             {
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
                 try
                 {
                     cfs.forceMajorCompaction();
@@ -424,17 +424,17 @@
                                                                   timestamp,
                                                                   "DELETE FROM ks.partition_range_deletion USING TIMESTAMP 10 WHERE k=1");
             if (flush && multiSSTable)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
             QueryProcessor.executeOnceInternalWithNowAndTimestamp(nowInSec,
                                                                   timestamp,
                                                                   "DELETE FROM ks.partition_range_deletion USING TIMESTAMP 10 WHERE k=1 and c1=1");
             if (flush)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
 
             QueryProcessor.executeOnceInternal("INSERT INTO ks.partition_range_deletion(k,c1,c2,v) VALUES(1,1,1,1) using timestamp 11");
             if (flush)
             {
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
                 try
                 {
                     cfs.forceMajorCompaction();
@@ -544,7 +544,7 @@
         QueryProcessor.executeOnceInternal("INSERT INTO ks.legacy_mc_inaccurate_min_max (k, c1, c2, c3, v) VALUES (100, 2, 2, 2, 2)");
         QueryProcessor.executeOnceInternal("DELETE FROM ks.legacy_mc_inaccurate_min_max WHERE k=100 AND c1=1");
         assertQueryReturnsSingleRT("SELECT * FROM ks.legacy_mc_inaccurate_min_max WHERE k=100 AND c1=1 AND c2=1");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertQueryReturnsSingleRT("SELECT * FROM ks.legacy_mc_inaccurate_min_max WHERE k=100 AND c1=1 AND c2=1");
         assertQueryReturnsSingleRT("SELECT * FROM ks.legacy_mc_inaccurate_min_max WHERE k=100 AND c1=1 AND c2=1 AND c3=1"); // clustering names
 
@@ -560,7 +560,7 @@
         new Mutation(builder.build()).apply();
 
         assertQueryReturnsSingleRT("SELECT * FROM ks.legacy_mc_inaccurate_min_max WHERE k=100 AND c1=3 AND c2=2");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertQueryReturnsSingleRT("SELECT * FROM ks.legacy_mc_inaccurate_min_max WHERE k=100 AND c1=3 AND c2=2");
         assertQueryReturnsSingleRT("SELECT * FROM ks.legacy_mc_inaccurate_min_max WHERE k=100 AND c1=3 AND c2=2 AND c3=2"); // clustering names
 
diff --git a/test/unit/org/apache/cassandra/db/SnapshotTest.java b/test/unit/org/apache/cassandra/db/SnapshotTest.java
index a406048..aa726ec 100644
--- a/test/unit/org/apache/cassandra/db/SnapshotTest.java
+++ b/test/unit/org/apache/cassandra/db/SnapshotTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.db;
 
-import java.io.File;
 import java.nio.file.Files;
 import java.nio.file.StandardOpenOption;
 
@@ -27,6 +26,7 @@
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 
 public class SnapshotTest extends CQLTester
 {
@@ -35,7 +35,7 @@
     {
         createTable("create table %s (id int primary key, k int)");
         execute("insert into %s (id, k) values (1,1)");
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        getCurrentColumnFamilyStore().forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
         for (SSTableReader sstable : getCurrentColumnFamilyStore().getLiveSSTables())
         {
             File toc = new File(sstable.descriptor.filenameFor(Component.TOC));
diff --git a/test/unit/org/apache/cassandra/db/SystemKeyspaceMigrator40Test.java b/test/unit/org/apache/cassandra/db/SystemKeyspaceMigrator40Test.java
deleted file mode 100644
index a14db00..0000000
--- a/test/unit/org/apache/cassandra/db/SystemKeyspaceMigrator40Test.java
+++ /dev/null
@@ -1,218 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.db;
-
-import java.net.InetAddress;
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.ImmutableSet;
-import org.junit.Test;
-
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.db.marshal.BytesType;
-import org.apache.cassandra.db.marshal.Int32Type;
-import org.apache.cassandra.db.marshal.UTF8Type;
-import org.apache.cassandra.db.marshal.UUIDType;
-import org.apache.cassandra.dht.Range;
-import org.apache.cassandra.dht.Token;
-import org.apache.cassandra.utils.UUIDGen;
-
-import static org.junit.Assert.assertEquals;
-
-public class SystemKeyspaceMigrator40Test extends CQLTester
-{
-    @Test
-    public void testMigratePeers() throws Throwable
-    {
-        String insert = String.format("INSERT INTO %s ("
-                                      + "peer, "
-                                      + "data_center, "
-                                      + "host_id, "
-                                      + "preferred_ip, "
-                                      + "rack, "
-                                      + "release_version, "
-                                      + "rpc_address, "
-                                      + "schema_version, "
-                                      + "tokens) "
-                                      + " values ( ?, ?, ? , ? , ?, ?, ?, ?, ?)",
-                                      SystemKeyspaceMigrator40.legacyPeersName);
-        UUID hostId = UUIDGen.getTimeUUID();
-        UUID schemaVersion = UUIDGen.getTimeUUID();
-        execute(insert,
-                InetAddress.getByName("127.0.0.1"),
-                "dcFoo",
-                hostId,
-                InetAddress.getByName("127.0.0.2"),
-                "rackFoo", "4.0",
-                InetAddress.getByName("127.0.0.3"),
-                schemaVersion,
-                ImmutableSet.of("foobar"));
-        SystemKeyspaceMigrator40.migrate();
-
-        int rowCount = 0;
-        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", SystemKeyspaceMigrator40.peersName)))
-        {
-            rowCount++;
-            assertEquals(InetAddress.getByName("127.0.0.1"), row.getInetAddress("peer"));
-            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("peer_port"));
-            assertEquals("dcFoo", row.getString("data_center"));
-            assertEquals(hostId, row.getUUID("host_id"));
-            assertEquals(InetAddress.getByName("127.0.0.2"), row.getInetAddress("preferred_ip"));
-            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("preferred_port"));
-            assertEquals("rackFoo", row.getString("rack"));
-            assertEquals("4.0", row.getString("release_version"));
-            assertEquals(InetAddress.getByName("127.0.0.3"), row.getInetAddress("native_address"));
-            assertEquals(DatabaseDescriptor.getNativeTransportPort(), row.getInt("native_port"));
-            assertEquals(schemaVersion, row.getUUID("schema_version"));
-            assertEquals(ImmutableSet.of("foobar"), row.getSet("tokens", UTF8Type.instance));
-        }
-        assertEquals(1, rowCount);
-
-        //Test nulls/missing don't prevent the row from propagating
-        execute(String.format("TRUNCATE %s", SystemKeyspaceMigrator40.legacyPeersName));
-        execute(String.format("TRUNCATE %s", SystemKeyspaceMigrator40.peersName));
-
-        execute(String.format("INSERT INTO %s (peer) VALUES (?)", SystemKeyspaceMigrator40.legacyPeersName),
-                              InetAddress.getByName("127.0.0.1"));
-        SystemKeyspaceMigrator40.migrate();
-
-        rowCount = 0;
-        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", SystemKeyspaceMigrator40.peersName)))
-        {
-            rowCount++;
-        }
-        assertEquals(1, rowCount);
-    }
-
-    @Test
-    public void testMigratePeerEvents() throws Throwable
-    {
-        String insert = String.format("INSERT INTO %s ("
-                                      + "peer, "
-                                      + "hints_dropped) "
-                                      + " values ( ?, ? )",
-                                      SystemKeyspaceMigrator40.legacyPeerEventsName);
-        UUID uuid = UUIDGen.getTimeUUID();
-        execute(insert,
-                InetAddress.getByName("127.0.0.1"),
-                ImmutableMap.of(uuid, 42));
-        SystemKeyspaceMigrator40.migrate();
-
-        int rowCount = 0;
-        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", SystemKeyspaceMigrator40.peerEventsName)))
-        {
-            rowCount++;
-            assertEquals(InetAddress.getByName("127.0.0.1"), row.getInetAddress("peer"));
-            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("peer_port"));
-            assertEquals(ImmutableMap.of(uuid, 42), row.getMap("hints_dropped", UUIDType.instance, Int32Type.instance));
-        }
-        assertEquals(1, rowCount);
-
-        //Test nulls/missing don't prevent the row from propagating
-        execute(String.format("TRUNCATE %s", SystemKeyspaceMigrator40.legacyPeerEventsName));
-        execute(String.format("TRUNCATE %s", SystemKeyspaceMigrator40.peerEventsName));
-
-        execute(String.format("INSERT INTO %s (peer) VALUES (?)", SystemKeyspaceMigrator40.legacyPeerEventsName),
-                InetAddress.getByName("127.0.0.1"));
-        SystemKeyspaceMigrator40.migrate();
-
-        rowCount = 0;
-        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", SystemKeyspaceMigrator40.peerEventsName)))
-        {
-            rowCount++;
-        }
-        assertEquals(1, rowCount);
-    }
-
-    @Test
-    public void testMigrateTransferredRanges() throws Throwable
-    {
-        String insert = String.format("INSERT INTO %s ("
-                                      + "operation, "
-                                      + "peer, "
-                                      + "keyspace_name, "
-                                      + "ranges) "
-                                      + " values ( ?, ?, ?, ? )",
-                                      SystemKeyspaceMigrator40.legacyTransferredRangesName);
-        execute(insert,
-                "foo",
-                InetAddress.getByName("127.0.0.1"),
-                "bar",
-                ImmutableSet.of(ByteBuffer.wrap(new byte[] { 42 })));
-        SystemKeyspaceMigrator40.migrate();
-
-        int rowCount = 0;
-        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", SystemKeyspaceMigrator40.transferredRangesName)))
-        {
-            rowCount++;
-            assertEquals("foo", row.getString("operation"));
-            assertEquals(InetAddress.getByName("127.0.0.1"), row.getInetAddress("peer"));
-            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("peer_port"));
-            assertEquals("bar", row.getString("keyspace_name"));
-            assertEquals(ImmutableSet.of(ByteBuffer.wrap(new byte[] { 42 })), row.getSet("ranges", BytesType.instance));
-        }
-        assertEquals(1, rowCount);
-
-        //Test nulls/missing don't prevent the row from propagating
-        execute(String.format("TRUNCATE %s", SystemKeyspaceMigrator40.legacyTransferredRangesName));
-        execute(String.format("TRUNCATE %s", SystemKeyspaceMigrator40.transferredRangesName));
-
-        execute(String.format("INSERT INTO %s (operation, peer, keyspace_name) VALUES (?, ?, ?)", SystemKeyspaceMigrator40.legacyTransferredRangesName),
-                "foo",
-                InetAddress.getByName("127.0.0.1"),
-                "bar");
-        SystemKeyspaceMigrator40.migrate();
-
-        rowCount = 0;
-        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", SystemKeyspaceMigrator40.transferredRangesName)))
-        {
-            rowCount++;
-        }
-        assertEquals(1, rowCount);
-    }
-
-    @Test
-    public void testMigrateAvailableRanges() throws Throwable
-    {
-        Range<Token> testRange = new Range<>(DatabaseDescriptor.getPartitioner().getRandomToken(), DatabaseDescriptor.getPartitioner().getRandomToken());
-        String insert = String.format("INSERT INTO %s ("
-                                      + "keyspace_name, "
-                                      + "ranges) "
-                                      + " values ( ?, ? )",
-                                      SystemKeyspaceMigrator40.legacyAvailableRangesName);
-        execute(insert,
-                "foo",
-                ImmutableSet.of(SystemKeyspace.rangeToBytes(testRange)));
-        SystemKeyspaceMigrator40.migrate();
-
-        int rowCount = 0;
-        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", SystemKeyspaceMigrator40.availableRangesName)))
-        {
-            rowCount++;
-            assertEquals("foo", row.getString("keyspace_name"));
-            assertEquals(ImmutableSet.of(testRange), SystemKeyspace.rawRangesToRangeSet(row.getSet("full_ranges", BytesType.instance), DatabaseDescriptor.getPartitioner()));
-        }
-        assertEquals(1, rowCount);
-    }
-}
diff --git a/test/unit/org/apache/cassandra/db/SystemKeyspaceMigrator41Test.java b/test/unit/org/apache/cassandra/db/SystemKeyspaceMigrator41Test.java
new file mode 100644
index 0000000..b543679
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/SystemKeyspaceMigrator41Test.java
@@ -0,0 +1,267 @@
+/*
+ * 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;
+
+import java.net.InetAddress;
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.TimeUUIDType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+import static org.junit.Assert.assertEquals;
+
+public class SystemKeyspaceMigrator41Test extends CQLTester
+{
+    @Test
+    public void testMigratePeers() throws Throwable
+    {
+        String legacyTab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_PEERS);
+        String tab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.PEERS_V2);
+        String insert = String.format("INSERT INTO %s ("
+                                      + "peer, "
+                                      + "data_center, "
+                                      + "host_id, "
+                                      + "preferred_ip, "
+                                      + "rack, "
+                                      + "release_version, "
+                                      + "rpc_address, "
+                                      + "schema_version, "
+                                      + "tokens) "
+                                      + " values ( ?, ?, ? , ? , ?, ?, ?, ?, ?)",
+                                      legacyTab);
+        UUID hostId = UUID.randomUUID();
+        UUID schemaVersion = UUID.randomUUID();
+        execute(insert,
+                InetAddress.getByName("127.0.0.1"),
+                "dcFoo",
+                hostId,
+                InetAddress.getByName("127.0.0.2"),
+                "rackFoo", "4.0",
+                InetAddress.getByName("127.0.0.3"),
+                schemaVersion,
+                ImmutableSet.of("foobar"));
+        SystemKeyspaceMigrator41.migratePeers();
+
+        int rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+            assertEquals(InetAddress.getByName("127.0.0.1"), row.getInetAddress("peer"));
+            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("peer_port"));
+            assertEquals("dcFoo", row.getString("data_center"));
+            assertEquals(hostId, row.getUUID("host_id"));
+            assertEquals(InetAddress.getByName("127.0.0.2"), row.getInetAddress("preferred_ip"));
+            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("preferred_port"));
+            assertEquals("rackFoo", row.getString("rack"));
+            assertEquals("4.0", row.getString("release_version"));
+            assertEquals(InetAddress.getByName("127.0.0.3"), row.getInetAddress("native_address"));
+            assertEquals(DatabaseDescriptor.getNativeTransportPort(), row.getInt("native_port"));
+            assertEquals(schemaVersion, row.getUUID("schema_version"));
+            assertEquals(ImmutableSet.of("foobar"), row.getSet("tokens", UTF8Type.instance));
+        }
+        assertEquals(1, rowCount);
+
+        //Test nulls/missing don't prevent the row from propagating
+        execute(String.format("TRUNCATE %s", legacyTab));
+        execute(String.format("TRUNCATE %s", tab));
+
+        execute(String.format("INSERT INTO %s (peer) VALUES (?)", legacyTab),
+                              InetAddress.getByName("127.0.0.1"));
+        SystemKeyspaceMigrator41.migratePeers();
+
+        rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+        }
+        assertEquals(1, rowCount);
+    }
+
+    @Test
+    public void testMigratePeerEvents() throws Throwable
+    {
+        String legacyTab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_PEER_EVENTS);
+        String tab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.PEER_EVENTS_V2);
+        String insert = String.format("INSERT INTO %s ("
+                                      + "peer, "
+                                      + "hints_dropped) "
+                                      + " values ( ?, ? )",
+                                      legacyTab);
+        TimeUUID uuid = nextTimeUUID();
+        execute(insert,
+                InetAddress.getByName("127.0.0.1"),
+                ImmutableMap.of(uuid, 42));
+        SystemKeyspaceMigrator41.migratePeerEvents();
+
+        int rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+            assertEquals(InetAddress.getByName("127.0.0.1"), row.getInetAddress("peer"));
+            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("peer_port"));
+            assertEquals(ImmutableMap.of(uuid, 42), row.getMap("hints_dropped", TimeUUIDType.instance, Int32Type.instance));
+        }
+        assertEquals(1, rowCount);
+
+        //Test nulls/missing don't prevent the row from propagating
+        execute(String.format("TRUNCATE %s", legacyTab));
+        execute(String.format("TRUNCATE %s", tab));
+
+        execute(String.format("INSERT INTO %s (peer) VALUES (?)", legacyTab),
+                InetAddress.getByName("127.0.0.1"));
+        SystemKeyspaceMigrator41.migratePeerEvents();
+
+        rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+        }
+        assertEquals(1, rowCount);
+    }
+
+    @Test
+    public void testMigrateTransferredRanges() throws Throwable
+    {
+        String legacyTab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_TRANSFERRED_RANGES);
+        String tab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.TRANSFERRED_RANGES_V2);
+        String insert = String.format("INSERT INTO %s ("
+                                      + "operation, "
+                                      + "peer, "
+                                      + "keyspace_name, "
+                                      + "ranges) "
+                                      + " values ( ?, ?, ?, ? )",
+                                      legacyTab);
+        execute(insert,
+                "foo",
+                InetAddress.getByName("127.0.0.1"),
+                "bar",
+                ImmutableSet.of(ByteBuffer.wrap(new byte[] { 42 })));
+        SystemKeyspaceMigrator41.migrateTransferredRanges();
+
+        int rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+            assertEquals("foo", row.getString("operation"));
+            assertEquals(InetAddress.getByName("127.0.0.1"), row.getInetAddress("peer"));
+            assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("peer_port"));
+            assertEquals("bar", row.getString("keyspace_name"));
+            assertEquals(ImmutableSet.of(ByteBuffer.wrap(new byte[] { 42 })), row.getSet("ranges", BytesType.instance));
+        }
+        assertEquals(1, rowCount);
+
+        //Test nulls/missing don't prevent the row from propagating
+        execute(String.format("TRUNCATE %s", legacyTab));
+        execute(String.format("TRUNCATE %s", tab));
+
+        execute(String.format("INSERT INTO %s (operation, peer, keyspace_name) VALUES (?, ?, ?)", legacyTab),
+                "foo",
+                InetAddress.getByName("127.0.0.1"),
+                "bar");
+        SystemKeyspaceMigrator41.migrateTransferredRanges();
+
+        rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+        }
+        assertEquals(1, rowCount);
+    }
+
+    @Test
+    public void testMigrateAvailableRanges() throws Throwable
+    {
+        String legacyTab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_AVAILABLE_RANGES);
+        String tab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.AVAILABLE_RANGES_V2);
+        Range<Token> testRange = new Range<>(DatabaseDescriptor.getPartitioner().getRandomToken(), DatabaseDescriptor.getPartitioner().getRandomToken());
+        String insert = String.format("INSERT INTO %s ("
+                                      + "keyspace_name, "
+                                      + "ranges) "
+                                      + " values ( ?, ? )",
+                                      legacyTab);
+        execute(insert,
+                "foo",
+                ImmutableSet.of(SystemKeyspace.rangeToBytes(testRange)));
+        SystemKeyspaceMigrator41.migrateAvailableRanges();
+
+        int rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+            assertEquals("foo", row.getString("keyspace_name"));
+            assertEquals(ImmutableSet.of(testRange), SystemKeyspace.rawRangesToRangeSet(row.getSet("full_ranges", BytesType.instance), DatabaseDescriptor.getPartitioner()));
+        }
+        assertEquals(1, rowCount);
+    }
+
+    @Test
+    public void testMigrateSSTableActivity() throws Throwable
+    {
+        FBUtilities.setPreviousReleaseVersionString(CassandraVersion.NULL_VERSION.toString());
+        String legacyTab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.LEGACY_SSTABLE_ACTIVITY);
+        String tab = String.format("%s.%s", SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.SSTABLE_ACTIVITY_V2);
+
+        String insert = String.format("INSERT INTO %s (%s) VALUES (%s)",
+                                      legacyTab,
+                                      StringUtils.join(new String[] {"keyspace_name",
+                                                       "columnfamily_name",
+                                                       "generation",
+                                                       "rate_120m",
+                                                       "rate_15m"}, ", "),
+                                      StringUtils.repeat("?", ", ", 5));
+
+        execute(insert, "ks", "tab", 5, 123.234d, 345.456d);
+
+        ColumnFamilyStore cf = getColumnFamilyStore(SchemaConstants.SYSTEM_KEYSPACE_NAME, SystemKeyspace.SSTABLE_ACTIVITY_V2);
+        cf.truncateBlocking();
+        cf.clearUnsafe();
+        SystemKeyspaceMigrator41.migrateSSTableActivity();
+
+        int rowCount = 0;
+        for (UntypedResultSet.Row row : execute(String.format("SELECT * FROM %s", tab)))
+        {
+            rowCount++;
+            assertEquals("ks", row.getString("keyspace_name"));
+            assertEquals("tab", row.getString("table_name"));
+            assertEquals(new SequenceBasedSSTableId(5).toString(), row.getString("id"));
+            assertEquals(123.234d, row.getDouble("rate_120m"), 0.001d);
+            assertEquals(345.456d, row.getDouble("rate_15m"), 0.001d);
+        }
+        assertEquals(1, rowCount);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java b/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java
index 97f3874..bf59b62 100644
--- a/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java
+++ b/test/unit/org/apache/cassandra/db/SystemKeyspaceTest.java
@@ -25,19 +25,24 @@
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.commitlog.CommitLog;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.dht.ByteOrderedPartitioner.BytesToken;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.SchemaKeyspace;
+import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.FBUtilities;
 
+import static java.lang.String.format;
+import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
+import static org.apache.cassandra.db.SystemKeyspace.LOCAL;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 public class SystemKeyspaceTest
@@ -47,9 +52,6 @@
     {
         DatabaseDescriptor.daemonInitialization();
         CommitLog.instance.start();
-
-        if (FBUtilities.isWindows)
-            WindowsFailedSnapshotTracker.deleteOldSnapshots();
     }
 
     @Test
@@ -92,26 +94,9 @@
         assert firstId.equals(secondId) : String.format("%s != %s%n", firstId.toString(), secondId.toString());
     }
 
-    private void assertDeletedOrDeferred(int expectedCount)
+    private void assertDeleted()
     {
-        if (FBUtilities.isWindows)
-            assertEquals(expectedCount, getDeferredDeletionCount());
-        else
-            assertTrue(getSystemSnapshotFiles(SchemaConstants.SYSTEM_KEYSPACE_NAME).isEmpty());
-    }
-
-    private int getDeferredDeletionCount()
-    {
-        try
-        {
-            Class c = Class.forName("java.io.DeleteOnExitHook");
-            LinkedHashSet<String> files = (LinkedHashSet<String>)FBUtilities.getProtectedField(c, "files").get(c);
-            return files.size();
-        }
-        catch (Exception e)
-        {
-            throw new RuntimeException(e);
-        }
+        assertTrue(getSystemSnapshotFiles(SchemaConstants.SYSTEM_KEYSPACE_NAME).isEmpty());
     }
 
     @Test
@@ -122,15 +107,13 @@
             cfs.clearUnsafe();
         Keyspace.clearSnapshot(null, SchemaConstants.SYSTEM_KEYSPACE_NAME);
 
-        int baseline = getDeferredDeletionCount();
-
         SystemKeyspace.snapshotOnVersionChange();
-        assertDeletedOrDeferred(baseline);
+        assertDeleted();
 
         // now setup system.local as if we're upgrading from a previous version
         setupReleaseVersion(getOlderVersionString());
         Keyspace.clearSnapshot(null, SchemaConstants.SYSTEM_KEYSPACE_NAME);
-        assertDeletedOrDeferred(baseline);
+        assertDeleted();
 
         // Compare versions again & verify that snapshots were created for all tables in the system ks
         SystemKeyspace.snapshotOnVersionChange();
@@ -138,7 +121,7 @@
         Set<String> snapshottedSystemTables = getSystemSnapshotFiles(SchemaConstants.SYSTEM_KEYSPACE_NAME);
         SystemKeyspace.metadata().tables.forEach(t -> assertTrue(snapshottedSystemTables.contains(t.name)));
         Set<String> snapshottedSchemaTables = getSystemSnapshotFiles(SchemaConstants.SCHEMA_KEYSPACE_NAME);
-        Schema.getSystemKeyspaceMetadata().tables.forEach(t -> assertTrue(snapshottedSchemaTables.contains(t.name)));
+        SchemaKeyspace.metadata().tables.forEach(t -> assertTrue(snapshottedSchemaTables.contains(t.name)));
 
         // clear out the snapshots & set the previous recorded version equal to the latest, we shouldn't
         // see any new snapshots created this time.
@@ -147,14 +130,38 @@
 
         SystemKeyspace.snapshotOnVersionChange();
 
-        // snapshotOnVersionChange for upgrade case will open a SSTR when the CFS is flushed. On Windows, we won't be
-        // able to delete hard-links to that file while segments are memory-mapped, so they'll be marked for deferred deletion.
+        // snapshotOnVersionChange for upgrade case will open a SSTR when the CFS is flushed.
         // 10 files expected.
-        assertDeletedOrDeferred(baseline + 10);
+        assertDeleted();
 
         Keyspace.clearSnapshot(null, SchemaConstants.SYSTEM_KEYSPACE_NAME);
     }
 
+    @Test
+    public void testPersistLocalMetadata()
+    {
+        SystemKeyspace.persistLocalMetadata();
+
+        UntypedResultSet result = executeInternal(format("SELECT * FROM system.%s WHERE key='%s'", LOCAL, LOCAL));
+
+        assertNotNull(result);
+        UntypedResultSet.Row row = result.one();
+
+        assertEquals(DatabaseDescriptor.getClusterName(), row.getString("cluster_name"));
+        assertEquals(FBUtilities.getReleaseVersionString(), row.getString("release_version"));
+        assertEquals(QueryProcessor.CQL_VERSION.toString(), row.getString("cql_version"));
+        assertEquals(String.valueOf(ProtocolVersion.CURRENT.asInt()), row.getString("native_protocol_version"));
+        assertEquals(DatabaseDescriptor.getEndpointSnitch().getLocalDatacenter(), row.getString("data_center"));
+        assertEquals(DatabaseDescriptor.getEndpointSnitch().getLocalRack(), row.getString("rack"));
+        assertEquals(DatabaseDescriptor.getPartitioner().getClass().getName(), row.getString("partitioner"));
+        assertEquals(FBUtilities.getJustBroadcastNativeAddress(), row.getInetAddress("rpc_address"));
+        assertEquals(DatabaseDescriptor.getNativeTransportPort(), row.getInt("rpc_port"));
+        assertEquals(FBUtilities.getJustBroadcastAddress(), row.getInetAddress("broadcast_address"));
+        assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("broadcast_port"));
+        assertEquals(FBUtilities.getJustLocalAddress(), row.getInetAddress("listen_address"));
+        assertEquals(DatabaseDescriptor.getStoragePort(), row.getInt("listen_port"));
+    }
+
     private String getOlderVersionString()
     {
         String version = FBUtilities.getReleaseVersionString();
@@ -168,7 +175,7 @@
         Set<String> snapshottedTableNames = new HashSet<>();
         for (ColumnFamilyStore cfs : Keyspace.open(keyspace).getColumnFamilyStores())
         {
-            if (!cfs.getSnapshotDetails().isEmpty())
+            if (!cfs.listSnapshots().isEmpty())
                 snapshottedTableNames.add(cfs.getTableName());
         }
         return snapshottedTableNames;
diff --git a/test/unit/org/apache/cassandra/db/TimeSortTest.java b/test/unit/org/apache/cassandra/db/TimeSortTest.java
index 8ae05ea..b45ab96 100644
--- a/test/unit/org/apache/cassandra/db/TimeSortTest.java
+++ b/test/unit/org/apache/cassandra/db/TimeSortTest.java
@@ -36,7 +36,7 @@
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE).getColumnFamilyStore(tableName);
 
         execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP ?", 0, 100, 0, 100L);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP ?", 0, 0, 1, 0L);
 
         assertRows(execute("SELECT * FROM %s WHERE a = ? AND b >= ? LIMIT 1000", 0, 10), row(0, 100, 0));
@@ -53,7 +53,7 @@
                 execute("INSERT INTO %s (a, b, c) VALUES (?, ?, ?) USING TIMESTAMP ?", i, j * 2, 0, (long)j * 2);
 
         validateTimeSort();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         validateTimeSort();
 
         // interleave some new data to test memtable + sstable
diff --git a/test/unit/org/apache/cassandra/db/TopPartitionTrackerTest.java b/test/unit/org/apache/cassandra/db/TopPartitionTrackerTest.java
new file mode 100644
index 0000000..417bda0
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/TopPartitionTrackerTest.java
@@ -0,0 +1,334 @@
+/*
+ * 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;
+
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+import org.junit.Test;
+
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.TokenMetadata;
+import org.apache.cassandra.metrics.TopPartitionTracker;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.Pair;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class TopPartitionTrackerTest extends CQLTester
+{
+    @Test
+    public void testSizeLimit()
+    {
+        createTable("create table %s (id bigint primary key, x int)");
+        DatabaseDescriptor.setMaxTopSizePartitionCount(5);
+        DatabaseDescriptor.setMinTrackedPartitionSizeInBytes(new DataStorageSpec.LongBytesBound("12B"));
+
+        Collection<Range<Token>> fullRange = Collections.singleton(r(0, 0));
+        TopPartitionTracker tpt = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        TopPartitionTracker.Collector collector = new TopPartitionTracker.Collector(fullRange);
+        for (int i = 5; i < 15; i++)
+            collector.trackPartitionSize(dk(i), i);
+        tpt.merge(collector);
+        assertEquals(3, tpt.topSizes().top.size());
+        assertTrue(tpt.topSizes().top.stream().allMatch(tp -> tp.value >= 12));
+
+        Collection<Range<Token>> keyRange = rangesFor(7);
+        collector = new TopPartitionTracker.Collector(keyRange);
+        collector.trackPartitionSize(dk(7), 7);
+        tpt.merge(collector);
+        assertEquals(3, tpt.topSizes().top.size());
+        assertTrue(tpt.topSizes().top.stream().allMatch(tp -> tp.value >= 12));
+        assertFalse(tpt.topSizes().top.contains(tp(7, 7)));
+
+        collector = new TopPartitionTracker.Collector(keyRange);
+        collector.trackPartitionSize(dk(7), 100);
+        tpt.merge(collector);
+        assertEquals(4, tpt.topSizes().top.size());
+        assertTrue(tpt.topSizes().top.stream().allMatch(tp -> tp.value >= 12));
+        assertTrue(tpt.topSizes().top.contains(tp(7, 100)));
+    }
+
+    @Test
+    public void testCountLimit()
+    {
+        createTable("create table %s (id bigint primary key, x int)");
+        DatabaseDescriptor.setMinTrackedPartitionSizeInBytes(new DataStorageSpec.LongBytesBound("0B"));
+        DatabaseDescriptor.setMaxTopSizePartitionCount(5);
+        Collection<Range<Token>> fullRange = Collections.singleton(r(0, 0));
+        TopPartitionTracker tpt = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        TopPartitionTracker.Collector collector = new TopPartitionTracker.Collector(fullRange);
+        for (int i = 5; i < 15; i++)
+            collector.trackPartitionSize(dk(i), i);
+        tpt.merge(collector);
+        assertEquals(5, tpt.topSizes().top.size());
+
+        collector = new TopPartitionTracker.Collector(fullRange);
+        for (int i = 5; i < 15; i++)
+            collector.trackPartitionSize(dk(i), i + 1);
+        tpt.merge(collector);
+        assertEquals(5, tpt.topSizes().top.size());
+
+        collector = new TopPartitionTracker.Collector(rangesFor(15));
+        collector.trackPartitionSize(dk(15), 14);
+        tpt.merge(collector);
+        assertEquals(5, tpt.topSizes().top.size());
+    }
+
+    @Test
+    public void testSubRangeMerge()
+    {
+        createTable("create table %s (id bigint primary key, x int)");
+        DatabaseDescriptor.setMinTrackedPartitionSizeInBytes(new DataStorageSpec.LongBytesBound("0B"));
+        DatabaseDescriptor.setMaxTopSizePartitionCount(10);
+        Collection<Range<Token>> fullRange = Collections.singleton(r(0, 0));
+        TopPartitionTracker tpt = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        TopPartitionTracker.Collector collector = new TopPartitionTracker.Collector(fullRange);
+        for (int i = 0; i < 10; i++)
+            collector.trackPartitionSize(dk(i), 10);
+        tpt.merge(collector);
+        assertEquals(10, tpt.topSizes().top.size());
+        collector = new TopPartitionTracker.Collector(rangesFor(0,1,2,3,4));
+        for (int i = 0; i < 5; i++)
+            collector.trackPartitionSize(dk(i), 8);
+        tpt.merge(collector);
+
+        assertEquals(10, tpt.topSizes().top.size());
+        for (TopPartitionTracker.TopPartition tp : tpt.topSizes().top)
+        {
+            long key = ByteBufferUtil.toLong(tp.key.getKey());
+            if (key < 5)
+                assertEquals(8, tp.value);
+            else
+                assertEquals(10, tp.value);
+        }
+    }
+
+    @Test
+    public void testSaveLoad()
+    {
+        createTable("create table %s (id bigint primary key, x int)");
+        DatabaseDescriptor.setMinTrackedPartitionSizeInBytes(new DataStorageSpec.LongBytesBound("0B"));
+        DatabaseDescriptor.setMinTrackedPartitionTombstoneCount(0);
+        DatabaseDescriptor.setMaxTopSizePartitionCount(10);
+        DatabaseDescriptor.setMaxTopTombstonePartitionCount(10);
+        Collection<Range<Token>> fullRange = Collections.singleton(r(0, 0));
+        TopPartitionTracker tpt = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        assertEquals(0, tpt.topSizes().lastUpdate);
+        assertEquals(0, tpt.topTombstones().lastUpdate);
+        long start = System.currentTimeMillis();
+        TopPartitionTracker.Collector collector = new TopPartitionTracker.Collector(fullRange);
+        for (int i = 0; i < 10; i++)
+        {
+            collector.trackPartitionSize(dk(i), 10);
+            collector.trackTombstoneCount(dk(i + 10), 100);
+        }
+        tpt.merge(collector);
+        long sizeUpdate = tpt.topSizes().lastUpdate;
+        long tombstoneUpdate = tpt.topTombstones().lastUpdate;
+        assertTrue(sizeUpdate >= start && sizeUpdate <= System.currentTimeMillis());
+        assertTrue(tombstoneUpdate >= start && tombstoneUpdate <= System.currentTimeMillis());
+
+        assertEquals(10, tpt.topSizes().top.size());
+        assertEquals(10, tpt.topTombstones().top.size());
+        tpt.save();
+        TopPartitionTracker tptLoaded = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        assertEquals(sizeUpdate, tptLoaded.topSizes().lastUpdate);
+        assertEquals(tombstoneUpdate, tptLoaded.topTombstones().lastUpdate);
+
+        assertEquals(tpt.topSizes().top, tptLoaded.topSizes().top);
+        assertEquals(tpt.topTombstones().top, tptLoaded.topTombstones().top);
+
+        DatabaseDescriptor.setMaxTopSizePartitionCount(5);
+        DatabaseDescriptor.setMaxTopTombstonePartitionCount(5);
+
+        tptLoaded = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        assertEquals(5, tptLoaded.topSizes().top.size());
+        assertEquals(5, tptLoaded.topTombstones().top.size());
+        assertEquals(sizeUpdate, tptLoaded.topSizes().lastUpdate);
+        assertEquals(tombstoneUpdate, tptLoaded.topTombstones().lastUpdate);
+
+        Iterator<TopPartitionTracker.TopPartition> oldIter = tpt.topSizes().top.iterator();
+        Iterator<TopPartitionTracker.TopPartition> loadedIter = tptLoaded.topSizes().top.iterator();
+        while (loadedIter.hasNext())
+        {
+            TopPartitionTracker.TopPartition old = oldIter.next();
+            TopPartitionTracker.TopPartition loaded = loadedIter.next();
+            assertEquals(old.key, loaded.key);
+            assertEquals(old.value, loaded.value);
+        }
+
+        oldIter = tpt.topTombstones().top.iterator();
+        loadedIter = tptLoaded.topTombstones().top.iterator();
+        while (loadedIter.hasNext())
+        {
+            TopPartitionTracker.TopPartition old = oldIter.next();
+            TopPartitionTracker.TopPartition loaded = loadedIter.next();
+            assertEquals(old.key, loaded.key);
+            assertEquals(old.value, loaded.value);
+        }
+    }
+
+    @Test
+    public void randomTest()
+    {
+        createTable("create table %s (id bigint primary key, x int)");
+        DatabaseDescriptor.setMinTrackedPartitionSizeInBytes(new DataStorageSpec.LongBytesBound("0B"));
+        DatabaseDescriptor.setMaxTopSizePartitionCount(1000);
+        int keyCount = 10000;
+        long seed = System.currentTimeMillis();
+        Random r = new Random(seed);
+        List<DecoratedKey> keys = new ArrayList<>(keyCount);
+        for (int i = 0; i < keyCount; i++)
+            keys.add(dk(i));
+
+        Collection<Range<Token>> fullRange = Collections.singleton(r(0, 0));
+        List<Pair<DecoratedKey, Long>> expected = new ArrayList<>();
+        TopPartitionTracker tpt = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        TopPartitionTracker.Collector collector = new TopPartitionTracker.Collector(fullRange);
+        Set<Long> uniqueValues = new HashSet<>();
+        for (int i = 0; i < keys.size(); i++)
+        {
+            DecoratedKey key = keys.get(i);
+            long value;
+            do
+            {
+                value = Math.abs(r.nextLong() % 100000);
+            } while (!uniqueValues.add(value));
+            expected.add(Pair.create(key, value));
+            collector.trackPartitionSize(key, value);
+        }
+        assertEquals(keyCount, expected.size());
+        tpt.merge(collector);
+        expected.sort((o1, o2) -> {
+            int cmp = -o1.right.compareTo(o2.right);
+            if (cmp != 0)
+                return cmp;
+            return o1.left.compareTo(o2.left);
+        });
+        Iterator<Pair<DecoratedKey, Long>> expectedTop = expected.subList(0,1000).iterator();
+        Iterator<TopPartitionTracker.TopPartition> trackedTop = tpt.topSizes().top.iterator();
+
+        while (expectedTop.hasNext())
+        {
+            Pair<DecoratedKey, Long> ex = expectedTop.next();
+            TopPartitionTracker.TopPartition tracked = trackedTop.next();
+            assertEquals("seed "+seed, ex.left, tracked.key);
+            assertEquals("seed "+seed, (long)ex.right, tracked.value);
+        }
+    }
+
+    @Test
+    public void testRanges() throws UnknownHostException
+    {
+        createTable("create table %s (id bigint primary key, x int)");
+        DatabaseDescriptor.setMinTrackedPartitionSizeInBytes(new DataStorageSpec.LongBytesBound("0B"));
+        DatabaseDescriptor.setMaxTopSizePartitionCount(1000);
+        long seed = System.currentTimeMillis();
+        Random r = new Random(seed);
+        List<Pair<DecoratedKey, Long>> keys = new ArrayList<>(10000);
+        for (int i = 0; i < 10000; i++)
+            keys.add(Pair.create(dk(i), Math.abs(r.nextLong() % 20000)));
+
+        Collection<Range<Token>> fullRange = Collections.singleton(r(0, 0));
+        TopPartitionTracker tpt = new TopPartitionTracker(getCurrentColumnFamilyStore().metadata());
+        TopPartitionTracker.Collector collector = new TopPartitionTracker.Collector(fullRange);
+        for (int i = 0; i < keys.size(); i++)
+        {
+            Pair<DecoratedKey, Long> entry = keys.get(i);
+            collector.trackPartitionSize(entry.left, entry.right);
+        }
+        tpt.merge(collector);
+        TokenMetadata tmd = StorageService.instance.getTokenMetadata();
+        tmd.updateNormalToken(t(0), InetAddressAndPort.getByName("127.0.0.1"));
+        tmd.updateNormalToken(t(Long.MAX_VALUE - 1), InetAddressAndPort.getByName("127.0.0.2"));
+        Iterator<TopPartitionTracker.TopPartition> trackedTop = tpt.topSizes().top.iterator();
+        Collection<Range<Token>> localRanges = StorageService.instance.getLocalReplicas(keyspace()).ranges();
+        int outOfRangeCount = 0;
+        while (trackedTop.hasNext())
+        {
+            if (!Range.isInRanges(trackedTop.next().key.getToken(), localRanges))
+                outOfRangeCount++;
+        }
+        assertTrue(outOfRangeCount > 0);
+        collector = new TopPartitionTracker.Collector(localRanges);
+        for (int i = 0; i < keys.size(); i++)
+        {
+            Pair<DecoratedKey, Long> entry = keys.get(i);
+            // we don't need this check during compaction since we know we won't track any tokens outside the owned ranges
+            // but the TopPartitionTracker might still be tracking outside of the local ranges - these are cleared in .merge()
+            if (Range.isInRanges(entry.left.getToken(), localRanges))
+                collector.trackPartitionSize(entry.left, entry.right);
+        }
+        tpt.merge(collector);
+        outOfRangeCount = 0;
+        trackedTop = tpt.topSizes().top.iterator();
+        while (trackedTop.hasNext())
+        {
+            if (!Range.isInRanges(trackedTop.next().key.getToken(), localRanges))
+                outOfRangeCount++;
+        }
+        assertEquals(0, outOfRangeCount);
+        assertTrue(tpt.topSizes().top.size() > 0);
+    }
+
+    private static TopPartitionTracker.TopPartition tp(int i, long c)
+    {
+        return new TopPartitionTracker.TopPartition(dk(i), c);
+    }
+    private static DecoratedKey dk(long i)
+    {
+        return Murmur3Partitioner.instance.decorateKey(ByteBufferUtil.bytes(i));
+    }
+    private static Range<Token> r(long start, long end)
+    {
+        return new Range<>(t(start), t(end));
+    }
+    private static Token t(long v)
+    {
+        return new Murmur3Partitioner.LongToken(v);
+    }
+    private static long tokenValue(long key)
+    {
+        return (long) dk(key).getToken().getTokenValue();
+    }
+    private static Collection<Range<Token>> rangesFor(long ... keys)
+    {
+        List<Range<Token>> ranges = new ArrayList<>(keys.length);
+        for (long key : keys)
+            ranges.add(r(tokenValue(key) - 1, tokenValue(key)));
+        return ranges;
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/VerifyTest.java b/test/unit/org/apache/cassandra/db/VerifyTest.java
index b2f4344..a58837a 100644
--- a/test/unit/org/apache/cassandra/db/VerifyTest.java
+++ b/test/unit/org/apache/cassandra/db/VerifyTest.java
@@ -19,16 +19,13 @@
 package org.apache.cassandra.db;
 
 import java.io.BufferedWriter;
-import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.net.UnknownHostException;
+import java.nio.channels.FileChannel;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.zip.CRC32;
 import java.util.zip.CheckedInputStream;
@@ -56,7 +53,10 @@
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.schema.CompressionParams;
@@ -68,6 +68,7 @@
 import static org.apache.cassandra.SchemaLoader.createKeyspace;
 import static org.apache.cassandra.SchemaLoader.loadSchema;
 import static org.apache.cassandra.SchemaLoader.standardCFMD;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -306,9 +307,9 @@
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
 
 
-        try (RandomAccessFile file = new RandomAccessFile(sstable.descriptor.filenameFor(Component.DIGEST), "rw"))
+        try (RandomAccessReader file = RandomAccessReader.open(new File(sstable.descriptor.filenameFor(Component.DIGEST))))
         {
-            Long correctChecksum = Long.valueOf(file.readLine());
+            Long correctChecksum = file.readLong();
 
             writeChecksum(++correctChecksum, sstable.descriptor.filenameFor(Component.DIGEST));
         }
@@ -348,9 +349,9 @@
         long startPosition = row0Start < row1Start ? row0Start : row1Start;
         long endPosition = row0Start < row1Start ? row1Start : row0Start;
 
-        RandomAccessFile file = new RandomAccessFile(sstable.getFilename(), "rw");
-        file.seek(startPosition);
-        file.writeBytes(StringUtils.repeat('z', (int) 2));
+        FileChannel file = new File(sstable.getFilename()).newReadWriteChannel();
+        file.position(startPosition);
+        file.write(ByteBufferUtil.bytes(StringUtils.repeat('z', 2)));
         file.close();
         if (ChunkCache.instance != null)
             ChunkCache.instance.invalidateFile(sstable.getFilename());
@@ -400,9 +401,9 @@
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
 
         String filenameToCorrupt = sstable.descriptor.filenameFor(Component.STATS);
-        RandomAccessFile file = new RandomAccessFile(filenameToCorrupt, "rw");
-        file.seek(0);
-        file.writeBytes(StringUtils.repeat('z', 2));
+        FileChannel file = new File(filenameToCorrupt).newReadWriteChannel();
+        file.position(0);
+        file.write(ByteBufferUtil.bytes(StringUtils.repeat('z', 2)));
         file.close();
         try (Verifier verifier = new Verifier(cfs, sstable, false, Verifier.options().invokeDiskFailurePolicy(true).build()))
         {
@@ -439,9 +440,9 @@
 
         // break the sstable:
         Long correctChecksum;
-        try (RandomAccessFile file = new RandomAccessFile(sstable.descriptor.filenameFor(Component.DIGEST), "rw"))
+        try (RandomAccessReader file = RandomAccessReader.open(new File(sstable.descriptor.filenameFor(Component.DIGEST))))
         {
-            correctChecksum = Long.parseLong(file.readLine());
+            correctChecksum = file.readLong();
         }
         writeChecksum(++correctChecksum, sstable.descriptor.filenameFor(Component.DIGEST));
         try (Verifier verifier = new Verifier(cfs, sstable, false, Verifier.options().mutateRepairStatus(false).invokeDiskFailurePolicy(true).build()))
@@ -508,9 +509,9 @@
 
         sstable = cfs.getLiveSSTables().iterator().next();
         Long correctChecksum;
-        try (RandomAccessFile file = new RandomAccessFile(sstable.descriptor.filenameFor(Component.DIGEST), "rw"))
+        try (RandomAccessReader file = RandomAccessReader.open(new File(sstable.descriptor.filenameFor(Component.DIGEST))))
         {
-            correctChecksum = Long.parseLong(file.readLine());
+            correctChecksum = file.readLong();
         }
         writeChecksum(++correctChecksum, sstable.descriptor.filenameFor(Component.DIGEST));
         try (Verifier verifier = new Verifier(cfs, sstable, false, Verifier.options().invokeDiskFailurePolicy(true).mutateRepairStatus(true).build()))
@@ -554,9 +555,9 @@
             verifier.verify(); //still not corrupt, should pass
         }
         String filenameToCorrupt = sstable.descriptor.filenameFor(componentToBreak);
-        try (RandomAccessFile file = new RandomAccessFile(filenameToCorrupt, "rw"))
+        try(FileChannel fileChannel = new File(filenameToCorrupt).newReadWriteChannel())
         {
-            file.setLength(3);
+            fileChannel.truncate(3);
         }
 
         try (Verifier verifier = new Verifier(cfs, sstable, false, Verifier.options().invokeDiskFailurePolicy(true).build()))
@@ -584,9 +585,9 @@
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
 
 
-        try (RandomAccessFile file = new RandomAccessFile(sstable.descriptor.filenameFor(Component.DIGEST), "rw"))
+        try (RandomAccessReader file = RandomAccessReader.open(new File(sstable.descriptor.filenameFor(Component.DIGEST))))
         {
-            Long correctChecksum = Long.valueOf(file.readLine());
+            Long correctChecksum = file.readLong();
 
             writeChecksum(++correctChecksum, sstable.descriptor.filenameFor(Component.DIGEST));
         }
@@ -699,10 +700,10 @@
         tmd.updateNormalToken(new ByteOrderedPartitioner.BytesToken(tk1), InetAddressAndPort.getByName("127.0.0.1"));
         tmd.updateNormalToken(new ByteOrderedPartitioner.BytesToken(tk2), InetAddressAndPort.getByName("127.0.0.2"));
         // write some bogus to a localpartitioner table
-        Batch bogus = Batch.createLocal(UUID.randomUUID(), 0, Collections.emptyList());
+        Batch bogus = Batch.createLocal(nextTimeUUID(), 0, Collections.emptyList());
         BatchlogManager.store(bogus);
         ColumnFamilyStore cfs = Keyspace.open("system").getColumnFamilyStore("batches");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         for (SSTableReader sstable : cfs.getLiveSSTables())
         {
 
@@ -760,7 +761,7 @@
                          .apply();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     protected void fillCounterCF(ColumnFamilyStore cfs, int partitionsPerSSTable) throws WriteTimeoutException
@@ -772,12 +773,12 @@
                          .apply();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     protected long simpleFullChecksum(String filename) throws IOException
     {
-        try (FileInputStream inputStream = new FileInputStream(filename))
+        try (FileInputStreamPlus inputStream = new FileInputStreamPlus(filename))
         {
             CRC32 checksum = new CRC32();
             CheckedInputStream cinStream = new CheckedInputStream(inputStream, checksum);
diff --git a/test/unit/org/apache/cassandra/db/aggregation/GroupMakerTest.java b/test/unit/org/apache/cassandra/db/aggregation/GroupMakerTest.java
index 8ff262d..13fb0df 100644
--- a/test/unit/org/apache/cassandra/db/aggregation/GroupMakerTest.java
+++ b/test/unit/org/apache/cassandra/db/aggregation/GroupMakerTest.java
@@ -18,17 +18,30 @@
 package org.apache.cassandra.db.aggregation;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Arrays;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.cql3.Constants.Literal;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.VariableSpecifications;
+import org.apache.cassandra.cql3.functions.ScalarFunction;
+import org.apache.cassandra.cql3.functions.TimeFcts;
+import org.apache.cassandra.cql3.selection.Selectable;
+import org.apache.cassandra.cql3.selection.Selector;
 import org.apache.cassandra.db.Clustering;
 import org.apache.cassandra.db.ClusteringComparator;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.marshal.AbstractType;
 import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.marshal.ReversedType;
+import org.apache.cassandra.db.marshal.TimestampType;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableMetadata;
 
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -45,7 +58,7 @@
     public void testIsNewGroupWithClusteringColumns()
     {
         ClusteringComparator comparator = newComparator(false, false, false);
-        GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2);
+        GroupMaker groupMaker = GroupMaker.newPkPrefixGroupMaker(comparator, 2);
 
         assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1)));
         assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2)));
@@ -63,7 +76,7 @@
     public void testIsNewGroupWithOneClusteringColumnsPrefix()
     {
         ClusteringComparator comparator = newComparator(false, false, false);
-        GroupMaker groupMaker = GroupMaker.newInstance(comparator, 1);
+        GroupMaker groupMaker = GroupMaker.newPkPrefixGroupMaker(comparator, 1);
 
         assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1)));
         assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2)));
@@ -82,7 +95,7 @@
     {
         ClusteringComparator comparator = newComparator(true, true, true);
 
-        GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2);
+        GroupMaker groupMaker = GroupMaker.newPkPrefixGroupMaker(comparator, 2);
 
         assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 2)));
         assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 1)));
@@ -102,7 +115,7 @@
     {
         ClusteringComparator comparator = newComparator(true, false, false);
 
-        GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2);
+        GroupMaker groupMaker = GroupMaker.newPkPrefixGroupMaker(comparator, 2);
 
         assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 1)));
         assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 3, 2)));
@@ -121,7 +134,7 @@
     public void testIsNewGroupWithStaticClusteringColumns()
     {
         ClusteringComparator comparator = newComparator(false, false, false);
-        GroupMaker groupMaker = GroupMaker.newInstance(comparator, 2);
+        GroupMaker groupMaker = GroupMaker.newPkPrefixGroupMaker(comparator, 2);
 
         assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 1)));
         assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, 1, 2)));
@@ -135,7 +148,7 @@
     public void testIsNewGroupWithOnlyPartitionKeyComponents()
     {
         ClusteringComparator comparator = newComparator(false, false, false);
-        GroupMaker goupMaker = GroupMaker.newInstance(comparator, 2);
+        GroupMaker goupMaker = GroupMaker.newPkPrefixGroupMaker(comparator, 2);
 
         assertTrue(goupMaker.isNewGroup(partitionKey(1, 1), clustering(1, 1, 1)));
         assertFalse(goupMaker.isNewGroup(partitionKey(1, 1), clustering(1, 1, 2)));
@@ -146,6 +159,100 @@
         assertTrue(goupMaker.isNewGroup(partitionKey(2, 2), clustering(1, 1, 2)));
     }
 
+    @Test
+    public void testIsNewGroupWithFunction()
+    {
+        GroupMaker groupMaker = newSelectorGroupMaker(false);
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:10:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:12:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:14:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:15:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:21:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:22:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:20 UTC")));
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering("2016-09-27 16:26:20 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering("2016-09-27 16:30:00 UTC")));
+    }
+
+    @Test
+    public void testIsNewGroupWithFunctionAndReversedOrder()
+    {
+        GroupMaker groupMaker = newSelectorGroupMaker(true);
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:20 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:22:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:21:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:15:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:14:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:12:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:10:00 UTC")));
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering("2016-09-27 16:30:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering("2016-09-27 16:26:20 UTC")));
+    }
+
+    @Test
+    public void testIsNewGroupWithFunctionWithStaticColumn()
+    {
+        GroupMaker groupMaker = newSelectorGroupMaker(false);
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:10:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:12:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:14:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:15:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:21:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:22:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:20 UTC")));
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), Clustering.STATIC_CLUSTERING));
+        assertTrue(groupMaker.isNewGroup(partitionKey(3), Clustering.STATIC_CLUSTERING));
+        assertTrue(groupMaker.isNewGroup(partitionKey(4), clustering("2016-09-27 16:26:20 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(4), clustering("2016-09-27 16:30:00 UTC")));
+    }
+
+    @Test
+    public void testIsNewGroupWithFunctionAndReversedOrderWithStaticColumns()
+    {
+        GroupMaker groupMaker = newSelectorGroupMaker(true);
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:20 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:26:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:22:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:21:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:15:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:14:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:12:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering("2016-09-27 16:10:00 UTC")));
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), Clustering.STATIC_CLUSTERING));
+        assertTrue(groupMaker.isNewGroup(partitionKey(3), Clustering.STATIC_CLUSTERING));
+        assertTrue(groupMaker.isNewGroup(partitionKey(4), clustering("2016-09-27 16:30:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(4), clustering("2016-09-27 16:26:20 UTC")));
+    }
+
+    @Test
+    public void testIsNewGroupWithPrefixAndFunction()
+    {
+        GroupMaker groupMaker = newSelectorGroupMaker(false, false);
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, "2016-09-27 16:10:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, "2016-09-27 16:12:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(1, "2016-09-27 16:14:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(1, "2016-09-27 16:15:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(2, "2016-09-27 16:16:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(2, "2016-09-27 16:22:00 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(1), clustering(2, "2016-09-27 16:26:00 UTC")));
+        assertFalse(groupMaker.isNewGroup(partitionKey(1), clustering(2, "2016-09-27 16:26:20 UTC")));
+
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering(1, "2016-09-27 16:26:20 UTC")));
+        assertTrue(groupMaker.isNewGroup(partitionKey(2), clustering(1, "2016-09-27 16:30:00 UTC")));
+    }
+
     private static DecoratedKey partitionKey(int... components)
     {
         ByteBuffer buffer = ByteBuffer.allocate(components.length * 4);
@@ -162,6 +269,19 @@
         return Clustering.make(toByteBufferArray(components));
     }
 
+    private static Clustering<?> clustering(String timeComponent)
+    {
+        ByteBuffer buffer = TimestampType.instance.fromString(timeComponent);
+        return Clustering.make(buffer);
+    }
+
+    private static Clustering<?> clustering(int component, String timeComponent)
+    {
+        ByteBuffer first = Int32Type.instance.decompose(component);
+        ByteBuffer second = TimestampType.instance.fromString(timeComponent);
+        return Clustering.make(first, second);
+    }
+
     private static ByteBuffer[] toByteBufferArray(int[] values)
     {
         ByteBuffer[] buffers = new ByteBuffer[values.length];
@@ -182,4 +302,31 @@
 
         return new ClusteringComparator(types);
     }
+
+    private GroupMaker newSelectorGroupMaker(boolean... reversed)
+    {
+        TableMetadata.Builder builder = TableMetadata.builder("keyspace", "test")
+                                                     .addPartitionKeyColumn("partition_key", Int32Type.instance);
+
+        int last = reversed.length - 1;
+        for (int i = 0; i < reversed.length; i++)
+        {
+            AbstractType<?> type = i == last ? TimestampType.instance : Int32Type.instance;
+            builder.addClusteringColumn("clustering" + i, reversed[i] ? ReversedType.getInstance(type) : type);
+        }
+
+        TableMetadata table = builder.build();
+
+        ColumnMetadata column = table.getColumn(new ColumnIdentifier("clustering" + last, false));
+
+        Selectable.WithTerm duration = new Selectable.WithTerm(Literal.duration("5m"));
+        Selectable.WithTerm startTime = new Selectable.WithTerm(Literal.string("2016-09-27 16:00:00 UTC"));
+        ScalarFunction function = TimeFcts.FloorTimestampFunction.newInstanceWithStartTimeArgument();
+
+        Selectable.WithFunction selectable = new Selectable.WithFunction(function, Arrays.asList(column, duration, startTime));
+        Selector.Factory factory = selectable.newSelectorFactory(table, null, new ArrayList<>(), VariableSpecifications.empty());
+        Selector selector = factory.newInstance(QueryOptions.DEFAULT);
+
+        return GroupMaker.newSelectorGroupMaker(table.comparator, reversed.length, selector);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/columniterator/SSTableReverseIteratorTest.java b/test/unit/org/apache/cassandra/db/columniterator/SSTableReverseIteratorTest.java
index 9040f11..9f9b7bb 100644
--- a/test/unit/org/apache/cassandra/db/columniterator/SSTableReverseIteratorTest.java
+++ b/test/unit/org/apache/cassandra/db/columniterator/SSTableReverseIteratorTest.java
@@ -28,6 +28,7 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -81,7 +82,7 @@
         QueryProcessor.executeInternal(String.format("UPDATE %s.%s SET v1=? WHERE k=? AND c=?", KEYSPACE, table), bytes(0x20000), key, 2);
         QueryProcessor.executeInternal(String.format("UPDATE %s.%s SET v1=? WHERE k=? AND c=?", KEYSPACE, table), bytes(0x20000), key, 3);
 
-        tbl.forceBlockingFlush();
+        Util.flush(tbl);
         SSTableReader sstable = Iterables.getOnlyElement(tbl.getLiveSSTables());
         DecoratedKey dk = tbl.getPartitioner().decorateKey(Int32Type.instance.decompose(key));
         RowIndexEntry indexEntry = sstable.getPosition(dk, SSTableReader.Operator.EQ);
diff --git a/test/unit/org/apache/cassandra/db/commitlog/AbstractCommitLogServiceTest.java b/test/unit/org/apache/cassandra/db/commitlog/AbstractCommitLogServiceTest.java
index 741b145..a918e3c 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/AbstractCommitLogServiceTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/AbstractCommitLogServiceTest.java
@@ -30,6 +30,8 @@
 import org.apache.cassandra.db.commitlog.AbstractCommitLogService.SyncRunnable;
 import org.apache.cassandra.utils.FreeRunningClock;
 
+import static org.apache.cassandra.concurrent.Interruptible.State.NORMAL;
+import static org.apache.cassandra.concurrent.Interruptible.State.SHUTTING_DOWN;
 import static org.apache.cassandra.db.commitlog.AbstractCommitLogService.DEFAULT_MARKER_INTERVAL_MILLIS;
 
 public class AbstractCommitLogServiceTest
@@ -111,7 +113,7 @@
     }
 
     @Test
-    public void testSync()
+    public void testSync() throws InterruptedException
     {
         long syncTimeMillis = AbstractCommitLogService.DEFAULT_MARKER_INTERVAL_MILLIS * 2;
         FreeRunningClock clock = new FreeRunningClock();
@@ -120,26 +122,25 @@
         FakeCommitLog commitLog = (FakeCommitLog) commitLogService.commitLog;
 
         // at time 0
-        Assert.assertTrue(syncRunnable.sync());
+        syncRunnable.run(NORMAL);
         Assert.assertEquals(1, commitLog.markCount.get());
         Assert.assertEquals(0, commitLog.syncCount.get());
 
         // at time DEFAULT_MARKER_INTERVAL_MILLIS
         clock.advance(DEFAULT_MARKER_INTERVAL_MILLIS, TimeUnit.MILLISECONDS);
-        Assert.assertTrue(syncRunnable.sync());
+        syncRunnable.run(NORMAL);
         Assert.assertEquals(2, commitLog.markCount.get());
         Assert.assertEquals(0, commitLog.syncCount.get());
 
         // at time DEFAULT_MARKER_INTERVAL_MILLIS * 2
         clock.advance(DEFAULT_MARKER_INTERVAL_MILLIS, TimeUnit.MILLISECONDS);
-        Assert.assertTrue(syncRunnable.sync());
+        syncRunnable.run(NORMAL);
         Assert.assertEquals(2, commitLog.markCount.get());
         Assert.assertEquals(1, commitLog.syncCount.get());
 
         // at time DEFAULT_MARKER_INTERVAL_MILLIS * 3, but with shutdown!
         clock.advance(DEFAULT_MARKER_INTERVAL_MILLIS, TimeUnit.MILLISECONDS);
-        commitLogService.shutdown();
-        Assert.assertFalse(syncRunnable.sync());
+        syncRunnable.run(SHUTTING_DOWN);
         Assert.assertEquals(2, commitLog.markCount.get());
         Assert.assertEquals(2, commitLog.syncCount.get());
     }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/BatchCommitLogTest.java b/test/unit/org/apache/cassandra/db/commitlog/BatchCommitLogTest.java
index fb7dda1..e9ec640 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/BatchCommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/BatchCommitLogTest.java
@@ -34,6 +34,9 @@
 import org.apache.cassandra.db.RowUpdateBuilder;
 import org.apache.cassandra.security.EncryptionContext;
 
+import static org.junit.Assert.assertEquals;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class BatchCommitLogTest extends CommitLogTest
 {
     private static final long CL_BATCH_SYNC_WINDOW = 1000; // 1 second
@@ -60,19 +63,37 @@
                      .add("val", ByteBuffer.allocate(10 * 1024))
                      .build();
 
-        long startNano = System.nanoTime();
+        long startNano = nanoTime();
         CommitLog.instance.add(m);
-        long delta = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNano);
+        long delta = TimeUnit.NANOSECONDS.toMillis(nanoTime() - startNano);
         Assert.assertTrue("Expect batch commitlog sync immediately, but took " + delta, delta < CL_BATCH_SYNC_WINDOW);
     }
 
     @Test
     public void testBatchCLShutDownImmediately() throws InterruptedException
     {
-        long startNano = System.nanoTime();
+        long startNano = nanoTime();
         CommitLog.instance.shutdownBlocking();
-        long delta = TimeUnit.NANOSECONDS.toMillis(System.nanoTime() - startNano);
+        long delta = TimeUnit.NANOSECONDS.toMillis(nanoTime() - startNano);
         Assert.assertTrue("Expect batch commitlog shutdown immediately, but took " + delta, delta < CL_BATCH_SYNC_WINDOW);
         CommitLog.instance.start();
     }
+
+    @Test
+    public void testFlushAndWaitingMetrics()
+    {
+        ColumnFamilyStore cfs1 = Keyspace.open(KEYSPACE1).getColumnFamilyStore(STANDARD1);
+        Mutation m = new RowUpdateBuilder(cfs1.metadata.get(), 0, "key").clustering("bytes")
+                                                                        .add("val", ByteBuffer.allocate(10 * 1024))
+                                                                        .build();
+
+        long startingFlushCount = CommitLog.instance.metrics.waitingOnFlush.getCount();
+        long startingWaitCount = CommitLog.instance.metrics.waitingOnCommit.getCount();
+
+        CommitLog.instance.add(m);
+
+        // We should register single new flush and waiting data points.
+        assertEquals(startingFlushCount + 1, CommitLog.instance.metrics.waitingOnFlush.getCount());
+        assertEquals(startingWaitCount + 1, CommitLog.instance.metrics.waitingOnCommit.getCount());
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CDCTestReplayer.java b/test/unit/org/apache/cassandra/db/commitlog/CDCTestReplayer.java
index fa3295a..7624590 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CDCTestReplayer.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CDCTestReplayer.java
@@ -17,9 +17,9 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.io.IOException;
 
+import org.apache.cassandra.io.util.File;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -45,7 +45,7 @@
 
     public void examineCommitLog() throws IOException
     {
-        replayFiles(new File(DatabaseDescriptor.getCommitLogLocation()).listFiles());
+        replayFiles(new File(DatabaseDescriptor.getCommitLogLocation()).tryList());
     }
 
     private class CommitLogTestReader extends CommitLogReader
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogCQLTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogCQLTest.java
index 4725bcf..2fd38d8 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogCQLTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogCQLTest.java
@@ -18,12 +18,19 @@
 
 package org.apache.cassandra.db.commitlog;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ConcurrentLinkedQueue;
+import java.util.concurrent.atomic.AtomicBoolean;
 
+import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 
 public class CommitLogCQLTest extends CQLTester
@@ -45,7 +52,7 @@
         // Calling switchMemtable directly applies Flush even though memtable is empty. This can happen with some races
         // (flush with recycling by segment manager). It should still tell commitlog that the memtable's region is clean.
         // CASSANDRA-12436
-        cfs.switchMemtable();
+        cfs.switchMemtable(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         execute("INSERT INTO %s (idx, data) VALUES (?, ?)", 15, Integer.toString(17));
 
@@ -56,4 +63,66 @@
         active.retainAll(CommitLog.instance.segmentManager.getActiveSegments());
         assert active.isEmpty();
     }
+    
+    @Test
+    public void testSwitchMemtable() throws Throwable
+    {
+        createTable("CREATE TABLE %s (idx INT, data TEXT, PRIMARY KEY(idx));");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+        
+        AtomicBoolean shouldStop = new AtomicBoolean(false);
+        ConcurrentLinkedQueue<Throwable> errors = new ConcurrentLinkedQueue<>();
+        List<Thread> threads = new ArrayList<>();
+        
+        final String stmt = String.format("INSERT INTO %s.%s (idx, data) VALUES(?, ?)", KEYSPACE, currentTable());
+        for (int i = 0; i < 10; ++i)
+        {
+            threads.add(new Thread("" + i)
+            {
+                public void run()
+                {
+                    try
+                    {
+                        while (!shouldStop.get())
+                        {
+                            for (int i = 0; i < 50; i++)
+                            {
+                                QueryProcessor.executeInternal(stmt, i, Integer.toString(i));
+                            }
+                            cfs.dumpMemtable();
+                        }
+                    }
+                    catch (Throwable t)
+                    {
+                        errors.add(t);
+                        shouldStop.set(true);
+                    }
+                }
+            });
+        }
+
+        for (Thread t : threads)
+            t.start();
+
+        Thread.sleep(15_000);
+        shouldStop.set(true);
+        
+        for (Thread t : threads)
+            t.join();
+
+        if (!errors.isEmpty())
+        {
+            StringBuilder sb = new StringBuilder();
+            for(Throwable error: errors)
+            {
+                sb.append("Got error during memtable switching:\n");
+                sb.append(error.getMessage() + "\n");
+                ByteArrayOutputStream os = new ByteArrayOutputStream();
+                PrintStream ps = new PrintStream(os);
+                error.printStackTrace(ps);
+                sb.append(os.toString("UTF-8"));
+            }
+            Assert.fail(sb.toString());
+        }
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogChainedMarkersTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogChainedMarkersTest.java
index fb90d59..319e75b 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogChainedMarkersTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogChainedMarkersTest.java
@@ -18,12 +18,12 @@
 
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Random;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogDescriptorTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogDescriptorTest.java
index 53c6769..5ef83b4 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogDescriptorTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogDescriptorTest.java
@@ -29,15 +29,18 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.ParameterizedClass;
 import org.apache.cassandra.config.TransparentDataEncryptionOptions;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.compress.LZ4Compressor;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileDataInput;
 import org.apache.cassandra.io.util.FileSegmentInputStream;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.security.EncryptionContext;
 import org.apache.cassandra.security.EncryptionContextGenerator;
+import org.assertj.core.api.Assertions;
 
 public class CommitLogDescriptorTest
 {
@@ -86,6 +89,21 @@
         Assert.assertEquals(MessagingService.current_version, CommitLogDescriptor.fromFileName(newCLName).getMessagingVersion());
     }
 
+    @Test
+    public void testExactIdFromFileName()
+    {
+        Assertions.assertThatThrownBy(() -> CommitLogDescriptor.idFromFileName("CommitLog-1340512736956320000.log"))
+                  .hasMessageContaining("Commitlog segment is too old to open")
+                  .isInstanceOf(UnsupportedOperationException.class);
+
+        Assertions.assertThatThrownBy(() -> CommitLogDescriptor.idFromFileName("CommitLog--1340512736956320000.log"))
+                  .hasMessageContaining("Cannot parse the version of the file")
+                  .isInstanceOf(RuntimeException.class);
+
+        Assertions.assertThat(CommitLogDescriptor.idFromFileName("CommitLog-2-1340512736956320000.log"))
+                  .isEqualTo(1340512736956320000L);
+    }
+
     // migrated from CommitLogTest
     private void testDescriptorPersistence(CommitLogDescriptor desc) throws IOException
     {
@@ -309,4 +327,19 @@
         CommitLogDescriptor desc2 = new CommitLogDescriptor(CommitLogDescriptor.current_version, 1, compression, enabledEncryption);
         Assert.assertEquals(desc1, desc2);
     }
+
+    @Test
+    public void testInferCDCIndexFile()
+    {
+        DatabaseDescriptor.daemonInitialization();
+        String fileNameSuffix = "CommitLog-2-1340512736956320000";
+        File validCdcLink = new File(fileNameSuffix + ".log");
+        File inferredIndexFile = CommitLogDescriptor.inferCdcIndexFile(validCdcLink);
+        Assert.assertNotNull(inferredIndexFile);
+        Assert.assertEquals(fileNameSuffix + "_cdc.idx", inferredIndexFile.name());
+
+        File invalidCdcLink = new File(fileNameSuffix + ".invalidlog");
+        inferredIndexFile = CommitLogDescriptor.inferCdcIndexFile(invalidCdcLink);
+        Assert.assertNull(inferredIndexFile);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
index 79f83fe..aadd2fd 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogFailurePolicyTest.java
@@ -25,7 +25,6 @@
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.service.CassandraDaemon;
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogInitWithExceptionTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogInitWithExceptionTest.java
index 21d207b..b3cff94 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogInitWithExceptionTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogInitWithExceptionTest.java
@@ -19,22 +19,23 @@
 package org.apache.cassandra.db.commitlog;
 
 
+import org.apache.cassandra.Util;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.apache.cassandra.CassandraIsolatedJunit4ClassRunner;
-import org.apache.cassandra.Util;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.utils.JVMStabilityInspector;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+
 
 @RunWith(CassandraIsolatedJunit4ClassRunner.class)
 public class CommitLogInitWithExceptionTest
 {
-    private final static SimpleCondition killed = new SimpleCondition();
-
+    private static Thread initThread;
+    private final static Condition killed = Condition.newOneTimeCondition();
     @BeforeClass
     public static void setUp()
     {
@@ -58,7 +59,7 @@
             }
             finally
             {
-                killed.signalAll();
+                killed.signal();
             }
         };
     }
@@ -66,12 +67,12 @@
     @Test
     public void testCommitLogInitWithException() {
         // This line will trigger initialization process because it's the first time to access CommitLog class.
-        Thread initThread = new Thread(CommitLog.instance::start);
+        initThread = new Thread(CommitLog.instance::start);
 
         initThread.setName("initThread");
         initThread.start();
 
-        Util.spinAssertEquals(true, killed::isSignaled, 120);
+        Util.spinAssertEquals(true, killed::isSignalled, 10);
     }
 
     private static class MockCommitLogSegmentMgr extends CommitLogSegmentManagerStandard {
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogReaderTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogReaderTest.java
index 794f99f..02ce3f6 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogReaderTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogReaderTest.java
@@ -17,16 +17,17 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.Config;
@@ -191,7 +192,7 @@
     static ArrayList<File> getCommitLogs()
     {
         File dir = new File(DatabaseDescriptor.getCommitLogLocation());
-        File[] files = dir.listFiles();
+        File[] files = dir.tryList();
         ArrayList<File> results = new ArrayList<>();
         for (File f : files)
         {
@@ -261,7 +262,9 @@
         for (int i = midpoint; i < entryCount; i++)
             execute("INSERT INTO %s (idx, data) VALUES (?, ?)", i, Integer.toString(i));
 
-        Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush();
+        Keyspace.open(keyspace())
+                .getColumnFamilyStore(currentTable())
+                .forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
         return result;
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentBackpressureTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentBackpressureTest.java
index 6b167b2..e28c25e 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentBackpressureTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentBackpressureTest.java
@@ -66,12 +66,12 @@
     @Test
     @BMRules(rules = {@BMRule(name = "Acquire Semaphore before sync",
                               targetClass = "AbstractCommitLogService$SyncRunnable",
-                              targetMethod = "sync",
+                              targetMethod = "run",
                               targetLocation = "AT INVOKE org.apache.cassandra.db.commitlog.CommitLog.sync(boolean)",
                               action = "org.apache.cassandra.db.commitlog.CommitLogSegmentBackpressureTest.allowSync.acquire()"),
                       @BMRule(name = "Release Semaphore after sync",
                               targetClass = "AbstractCommitLogService$SyncRunnable",
-                              targetMethod = "sync",
+                              targetMethod = "run",
                               targetLocation = "AFTER INVOKE org.apache.cassandra.db.commitlog.CommitLog.sync(boolean)",
                               action = "org.apache.cassandra.db.commitlog.CommitLogSegmentBackpressureTest.allowSync.release()")})
     public void testCompressedCommitLogBackpressure() throws Throwable
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDCTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDCTest.java
index 4128b71..3789b51 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDCTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogSegmentManagerCDCTest.java
@@ -18,12 +18,17 @@
 
 package org.apache.cassandra.db.commitlog;
 
-import java.io.*;
+import java.io.BufferedReader;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.*;
+import java.util.concurrent.TimeUnit;
 
+import com.google.monitoring.runtime.instrumentation.common.util.concurrent.Uninterruptibles;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileReader;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -31,6 +36,7 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.RowUpdateBuilder;
 import org.apache.cassandra.db.commitlog.CommitLogSegment.CDCState;
@@ -46,7 +52,7 @@
     public static void setUpClass()
     {
         DatabaseDescriptor.setCDCEnabled(true);
-        DatabaseDescriptor.setCDCSpaceInMB(1024);
+        DatabaseDescriptor.setCDCTotalSpaceInMiB(1024);
         CQLTester.setUpClass();
     }
 
@@ -63,31 +69,8 @@
     @Test
     public void testCDCWriteFailure() throws Throwable
     {
-        createTable("CREATE TABLE %s (idx int, data text, primary key(idx)) WITH cdc=true;");
-        CommitLogSegmentManagerCDC cdcMgr = (CommitLogSegmentManagerCDC)CommitLog.instance.segmentManager;
-        TableMetadata cfm = currentTableMetadata();
-
-        // Confirm that logic to check for whether or not we can allocate new CDC segments works
-        Integer originalCDCSize = DatabaseDescriptor.getCDCSpaceInMB();
-        try
-        {
-            DatabaseDescriptor.setCDCSpaceInMB(32);
-            // Spin until we hit CDC capacity and make sure we get a CDCWriteException
-            try
-            {
-                // Should trigger on anything < 20:1 compression ratio during compressed test
-                for (int i = 0; i < 100; i++)
-                {
-                    new RowUpdateBuilder(cfm, 0, i)
-                        .add("data", randomizeBuffer(DatabaseDescriptor.getCommitLogSegmentSize() / 3))
-                        .build().apply();
-                }
-                Assert.fail("Expected CDCWriteException from full CDC but did not receive it.");
-            }
-            catch (CDCWriteException e)
-            {
-                // expected, do nothing
-            }
+        testWithCDCSpaceInMb(32, () -> {
+            createTableAndBulkWrite();
             expectCurrentCDCState(CDCState.FORBIDDEN);
 
             // Confirm we can create a non-cdc table and write to it even while at cdc capacity
@@ -95,69 +78,68 @@
             execute("INSERT INTO %s (idx, data) VALUES (1, '1');");
 
             // Confirm that, on flush+recyle, we see files show up in cdc_raw
-            Keyspace.open(keyspace()).getColumnFamilyStore(currentTable()).forceBlockingFlush();
+            CommitLogSegmentManagerCDC cdcMgr = (CommitLogSegmentManagerCDC)CommitLog.instance.segmentManager;
+            Keyspace.open(keyspace())
+                    .getColumnFamilyStore(currentTable())
+                    .forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
             CommitLog.instance.forceRecycleAllSegments();
             cdcMgr.awaitManagementTasksCompletion();
             Assert.assertTrue("Expected files to be moved to overflow.", getCDCRawCount() > 0);
 
             // Simulate a CDC consumer reading files then deleting them
-            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).listFiles())
+            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).tryList())
                 FileUtils.deleteWithConfirm(f);
 
             // Update size tracker to reflect deleted files. Should flip flag on current allocatingFrom to allow.
             cdcMgr.updateCDCTotalSize();
             expectCurrentCDCState(CDCState.PERMITTED);
-        }
-        finally
-        {
-            DatabaseDescriptor.setCDCSpaceInMB(originalCDCSize);
-        }
+        });
     }
 
     @Test
     public void testSegmentFlaggingOnCreation() throws Throwable
     {
-        CommitLogSegmentManagerCDC cdcMgr = (CommitLogSegmentManagerCDC)CommitLog.instance.segmentManager;
-        String ct = createTable("CREATE TABLE %s (idx int, data text, primary key(idx)) WITH cdc=true;");
+        testSegmentFlaggingOnCreation0();
+    }
 
-        int origSize = DatabaseDescriptor.getCDCSpaceInMB();
-        try
-        {
-            DatabaseDescriptor.setCDCSpaceInMB(16);
-            TableMetadata ccfm = Keyspace.open(keyspace()).getColumnFamilyStore(ct).metadata();
-            // Spin until we hit CDC capacity and make sure we get a CDCWriteException
-            try
-            {
-                for (int i = 0; i < 1000; i++)
-                {
-                    new RowUpdateBuilder(ccfm, 0, i)
-                        .add("data", randomizeBuffer(DatabaseDescriptor.getCommitLogSegmentSize() / 3))
-                        .build().apply();
-                }
-                Assert.fail("Expected CDCWriteException from full CDC but did not receive it.");
-            }
-            catch (CDCWriteException e) { }
+    @Test
+    public void testSegmentFlaggingWithNonblockingOnCreation() throws Throwable
+    {
+        testWithNonblockingMode(this::testSegmentFlaggingOnCreation0);
+    }
 
-            expectCurrentCDCState(CDCState.FORBIDDEN);
-            CommitLog.instance.forceRecycleAllSegments();
+    @Test
+    public void testNonblockingShouldMaintainSteadyDiskUsage() throws Throwable
+    {
+        final int commitlogSize = DatabaseDescriptor.getCommitLogSegmentSize() / 1024 / 1024;
+        final int targetFilesCount = 3;
+        final long cdcSizeLimit = commitlogSize * targetFilesCount;
+        final int mutationSize = DatabaseDescriptor.getCommitLogSegmentSize() / 3;
+        testWithNonblockingMode(() -> testWithCDCSpaceInMb((int) cdcSizeLimit, () -> {
+            CommitLogSegmentManagerCDC cdcMgr = (CommitLogSegmentManagerCDC)CommitLog.instance.segmentManager;
 
-            cdcMgr.awaitManagementTasksCompletion();
-            // Delete all files in cdc_raw
-            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).listFiles())
-                f.delete();
-            cdcMgr.updateCDCTotalSize();
-            // Confirm cdc update process changes flag on active segment
-            expectCurrentCDCState(CDCState.PERMITTED);
+            createTableAndBulkWrite(mutationSize);
 
-            // Clear out archived CDC files
-            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).listFiles()) {
-                FileUtils.deleteWithConfirm(f);
-            }
-        }
-        finally
-        {
-            DatabaseDescriptor.setCDCSpaceInMB(origSize);
-        }
+            long actualSize = cdcMgr.updateCDCTotalSize();
+            long cdcSizeLimitBytes = cdcSizeLimit * 1024 * 1024;
+            Assert.assertTrue(String.format("Actual size (%s) should not exceed the size limit (%s)", actualSize, cdcSizeLimitBytes),
+                              actualSize <= cdcSizeLimitBytes * targetFilesCount);
+            Assert.assertTrue(String.format("Actual size (%s) should be at least the mutation size (%s)", actualSize, mutationSize),
+                              actualSize >= mutationSize);
+        }));
+    }
+
+    @Test // switch from blocking to nonblocking, then back to blocking
+    public void testSwitchingCDCWriteModes() throws Throwable
+    {
+        String tableName = createTableAndBulkWrite();
+        expectCurrentCDCState(CDCState.FORBIDDEN);
+        testWithNonblockingMode(() -> {
+            bulkWrite(tableName);
+            expectCurrentCDCState(CDCState.CONTAINS);
+        });
+        bulkWrite(tableName);
+        expectCurrentCDCState(CDCState.FORBIDDEN);
     }
 
     @Test
@@ -177,38 +159,37 @@
         Assert.assertTrue("Index file not written: " + cdcIndexFile, cdcIndexFile.exists());
 
         // Read index value and confirm it's == end from last sync
-        BufferedReader in = new BufferedReader(new FileReader(cdcIndexFile));
-        String input = in.readLine();
-        Integer offset = Integer.parseInt(input);
-        Assert.assertEquals(syncOffset, (long)offset);
-        in.close();
+        String input = null;
+        // There could be a race between index file update (truncate & write) and read. See CASSANDRA-17416
+        // It is possible to read an empty line. In this case, re-try at most 5 times.
+        for (int i = 0; input == null && i < 5; i++)
+        {
+            if (i != 0) // add a little pause between each attempt
+                Uninterruptibles.sleepUninterruptibly(10, TimeUnit.MILLISECONDS);
+
+            try (BufferedReader in = new BufferedReader(new FileReader(cdcIndexFile)))
+            {
+                input = in.readLine();
+            }
+        }
+
+        if (input == null)
+        {
+            Assert.fail("Unable to read the CDC index file after several attempts");
+        }
+
+        int indexOffset = Integer.parseInt(input);
+        Assert.assertTrue("The offset read from CDC index file should be equal or larger than the offset after sync. See CASSANDRA-17416",
+                          syncOffset <= indexOffset);
     }
 
     @Test
-    public void testCompletedFlag() throws IOException
+    public void testCompletedFlag() throws Throwable
     {
-        createTable("CREATE TABLE %s (idx int, data text, primary key(idx)) WITH cdc=true;");
+        String tableName = createTable("CREATE TABLE %s (idx int, data text, primary key(idx)) WITH cdc=true;");
         CommitLogSegment initialSegment = CommitLog.instance.segmentManager.allocatingFrom();
-        Integer originalCDCSize = DatabaseDescriptor.getCDCSpaceInMB();
 
-        DatabaseDescriptor.setCDCSpaceInMB(8);
-        try
-        {
-            for (int i = 0; i < 1000; i++)
-            {
-                new RowUpdateBuilder(currentTableMetadata(), 0, 1)
-                .add("data", randomizeBuffer(DatabaseDescriptor.getCommitLogSegmentSize() / 3))
-                .build().apply();
-            }
-        }
-        catch (CDCWriteException ce)
-        {
-            // pass. Expected since we'll have a file or two linked on restart of CommitLog due to replay
-        }
-        finally
-        {
-            DatabaseDescriptor.setCDCSpaceInMB(originalCDCSize);
-        }
+        testWithCDCSpaceInMb(8, () -> bulkWrite(tableName));
 
         CommitLog.instance.forceRecycleAllSegments();
 
@@ -234,7 +215,7 @@
         CommitLogSegment currentSegment = CommitLog.instance.segmentManager.allocatingFrom();
 
         // Confirm that, with no CDC data present, we've hard-linked but have no index file
-        Path linked = new File(DatabaseDescriptor.getCDCLogLocation(), currentSegment.logFile.getName()).toPath();
+        Path linked = new File(DatabaseDescriptor.getCDCLogLocation(), currentSegment.logFile.name()).toPath();
         File cdcIndexFile = currentSegment.getCDCIndexFile();
         Assert.assertTrue("File does not exist: " + linked, Files.exists(linked));
         Assert.assertFalse("Expected index file to not be created but found: " + cdcIndexFile, cdcIndexFile.exists());
@@ -262,7 +243,7 @@
             .add("data", randomizeBuffer(DatabaseDescriptor.getCommitLogSegmentSize() / 3))
             .build().apply();
 
-        Path linked = new File(DatabaseDescriptor.getCDCLogLocation(), currentSegment.logFile.getName()).toPath();
+        Path linked = new File(DatabaseDescriptor.getCDCLogLocation(), currentSegment.logFile.name()).toPath();
         // Confirm that, with CDC data present but not yet flushed, we've hard-linked but have no index file
         Assert.assertTrue("File does not exist: " + linked, Files.exists(linked));
 
@@ -278,45 +259,23 @@
     }
 
     @Test
-    public void testReplayLogic() throws IOException
+    public void testReplayLogic() throws Throwable
     {
-        // Assert.assertEquals(0, new File(DatabaseDescriptor.getCDCLogLocation()).listFiles().length);
-        String table_name = createTable("CREATE TABLE %s (idx int, data text, primary key(idx)) WITH cdc=true;");
-        Integer originalCDCSize = DatabaseDescriptor.getCDCSpaceInMB();
-
-        DatabaseDescriptor.setCDCSpaceInMB(8);
-        TableMetadata ccfm = Keyspace.open(keyspace()).getColumnFamilyStore(table_name).metadata();
-        try
-        {
-            for (int i = 0; i < 1000; i++)
-            {
-                new RowUpdateBuilder(ccfm, 0, i)
-                    .add("data", randomizeBuffer(DatabaseDescriptor.getCommitLogSegmentSize() / 3))
-                    .build().apply();
-            }
-            Assert.fail("Expected CDCWriteException from full CDC but did not receive it.");
-        }
-        catch (CDCWriteException e)
-        {
-            // pass
-        }
-        finally
-        {
-            DatabaseDescriptor.setCDCSpaceInMB(originalCDCSize);
-        }
+        // Assert.assertEquals(0, new File(DatabaseDescriptor.getCDCLogLocation()).tryList().length);
+        testWithCDCSpaceInMb(8, this::createTableAndBulkWrite);
 
         CommitLog.instance.sync(true);
         CommitLog.instance.stopUnsafe(false);
 
         // Build up a list of expected index files after replay and then clear out cdc_raw
         List<CDCIndexData> oldData = parseCDCIndexData();
-        for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).listFiles())
-            FileUtils.deleteWithConfirm(f.getAbsolutePath());
+        for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).tryList())
+            FileUtils.deleteWithConfirm(f.absolutePath());
 
         try
         {
             Assert.assertEquals("Expected 0 files in CDC folder after deletion. ",
-                                0, new File(DatabaseDescriptor.getCDCLogLocation()).listFiles().length);
+                                0, new File(DatabaseDescriptor.getCDCLogLocation()).tryList().length);
         }
         finally
         {
@@ -331,7 +290,7 @@
 
         // Rough sanity check -> should be files there now.
         Assert.assertTrue("Expected non-zero number of files in CDC folder after restart.",
-                          new File(DatabaseDescriptor.getCDCLogLocation()).listFiles().length > 0);
+                          new File(DatabaseDescriptor.getCDCLogLocation()).tryList().length > 0);
 
         // Confirm all the old indexes in old are present and >= the original offset, as we flag the entire segment
         // as cdc written on a replay.
@@ -377,9 +336,9 @@
         List<CDCIndexData> results = new ArrayList<>();
         try
         {
-            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).listFiles())
+            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).tryList())
             {
-                if (f.getName().contains("_cdc.idx"))
+                if (f.name().contains("_cdc.idx"))
                     results.add(new CDCIndexData(f));
             }
         }
@@ -398,7 +357,7 @@
         CDCIndexData(File f) throws IOException
         {
             String line = "";
-            try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(f))))
+            try (BufferedReader br = new BufferedReader(new FileReader(f)))
             {
                 line = br.readLine();
             }
@@ -406,7 +365,7 @@
             {
                 throw e;
             }
-            fileName = f.getName();
+            fileName = f.name();
             offset = Integer.parseInt(line);
         }
 
@@ -433,7 +392,7 @@
 
     private int getCDCRawCount()
     {
-        return new File(DatabaseDescriptor.getCDCLogLocation()).listFiles().length;
+        return new File(DatabaseDescriptor.getCDCLogLocation()).tryList().length;
     }
 
     private void expectCurrentCDCState(CDCState expectedState)
@@ -447,4 +406,108 @@
                         expectedState, currentState));
         }
     }
+
+    private void testWithNonblockingMode(Testable test) throws Throwable
+    {
+        boolean original = DatabaseDescriptor.getCDCBlockWrites();
+        CommitLog.instance.setCDCBlockWrites(false);
+        try
+        {
+            test.run();
+        }
+        finally
+        {
+            CommitLog.instance.setCDCBlockWrites(original);
+        }
+    }
+
+    private void testWithCDCSpaceInMb(int size, Testable test) throws Throwable
+    {
+        int origSize = (int) DatabaseDescriptor.getCDCTotalSpace() / 1024 / 1024;
+        DatabaseDescriptor.setCDCTotalSpaceInMiB(size);
+        try
+        {
+            test.run();
+        }
+        finally
+        {
+            DatabaseDescriptor.setCDCTotalSpaceInMiB(origSize);
+        }
+    }
+
+    private String createTableAndBulkWrite() throws Throwable
+    {
+        return createTableAndBulkWrite(DatabaseDescriptor.getCommitLogSegmentSize() / 3);
+    }
+
+    private String createTableAndBulkWrite(int mutationSize) throws Throwable
+    {
+        String tableName = createTable("CREATE TABLE %s (idx int, data text, primary key(idx)) WITH cdc=true;");
+        bulkWrite(tableName, mutationSize);
+        return tableName;
+    }
+
+    private void bulkWrite(String tableName) throws Throwable
+    {
+        bulkWrite(tableName, DatabaseDescriptor.getCommitLogSegmentSize() / 3);
+    }
+
+    private void bulkWrite(String tableName, int mutationSize) throws Throwable
+    {
+        TableMetadata ccfm = Keyspace.open(keyspace()).getColumnFamilyStore(tableName).metadata();
+        boolean blockWrites = DatabaseDescriptor.getCDCBlockWrites();
+        // Spin to make sure we hit CDC capacity
+        try
+        {
+            for (int i = 0; i < 1000; i++)
+            {
+                new RowUpdateBuilder(ccfm, 0, i)
+                .add("data", randomizeBuffer(mutationSize))
+                .build().applyFuture().get();
+            }
+            if (blockWrites)
+                Assert.fail("Expected CDCWriteException from full CDC but did not receive it.");
+        }
+        catch (CDCWriteException e)
+        {
+            if (!blockWrites)
+                Assert.fail("Excepted no CDCWriteException when not blocking writes but received it.");
+        }
+    }
+
+    private void testSegmentFlaggingOnCreation0() throws Throwable
+    {
+        testWithCDCSpaceInMb(16, () -> {
+            boolean blockWrites = DatabaseDescriptor.getCDCBlockWrites();
+
+            createTableAndBulkWrite();
+
+            CommitLogSegmentManagerCDC cdcMgr = (CommitLogSegmentManagerCDC)CommitLog.instance.segmentManager;
+            expectCurrentCDCState(blockWrites? CDCState.FORBIDDEN : CDCState.CONTAINS);
+
+            // When block writes, releasing CDC commit logs should update the CDC state to PERMITTED
+            if (blockWrites)
+            {
+                CommitLog.instance.forceRecycleAllSegments();
+
+                cdcMgr.awaitManagementTasksCompletion();
+                // Delete all files in cdc_raw
+                for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).tryList())
+                    f.delete();
+                cdcMgr.updateCDCTotalSize();
+                // Confirm cdc update process changes flag on active segment
+                expectCurrentCDCState(CDCState.PERMITTED);
+            }
+
+            // Clear out archived CDC files
+            for (File f : new File(DatabaseDescriptor.getCDCLogLocation()).tryList()) {
+                FileUtils.deleteWithConfirm(f);
+            }
+        });
+    }
+
+    private interface Testable
+    {
+        void run() throws Throwable;
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
index da3b83e..17bbece 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTest.java
@@ -18,7 +18,13 @@
 */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.*;
+import org.apache.cassandra.io.util.File;
+
+import java.io.ByteArrayOutputStream;
+import java.io.Closeable;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
 import java.math.BigInteger;
 import java.nio.ByteBuffer;
 import java.util.*;
@@ -29,9 +35,12 @@
 import java.util.zip.CRC32;
 import java.util.zip.Checksum;
 
+import javax.crypto.Cipher;
+
 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;
@@ -39,8 +48,12 @@
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.Util;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.memtable.SkipListMemtable;
 import org.apache.cassandra.io.compress.ZstdCompressor;
 import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.schema.MemtableParams;
+import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -61,6 +74,7 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.security.CipherFactory;
 import org.apache.cassandra.security.EncryptionContext;
 import org.apache.cassandra.security.EncryptionContextGenerator;
 import org.apache.cassandra.service.StorageService;
@@ -71,14 +85,13 @@
 import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.vint.VIntCoding;
 
-import org.junit.After;
-
 import static org.apache.cassandra.db.commitlog.CommitLogSegment.ENTRY_OVERHEAD_SIZE;
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import org.apache.cassandra.db.marshal.IntegerType;
 import org.apache.cassandra.db.marshal.MapType;
@@ -105,15 +118,25 @@
     }
 
     @Parameters()
-    public static Collection<Object[]> generateData()
+    public static Collection<Object[]> generateData() throws Exception
     {
-        return Arrays.asList(new Object[][]{
-            {null, EncryptionContextGenerator.createDisabledContext()}, // No compression, no encryption
-            {null, EncryptionContextGenerator.createContext(true)}, // 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()}});
+        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()}
+        });
+    }
+
+    private static EncryptionContext newEncryptionContext() throws Exception
+    {
+        EncryptionContext context = EncryptionContextGenerator.createContext(true);
+        CipherFactory cipherFactory = new CipherFactory(context.getTransparentDataEncryptionOptions());
+        Cipher cipher = cipherFactory.getEncryptor(context.getTransparentDataEncryptionOptions().cipher, context.getTransparentDataEncryptionOptions().key_alias);
+        return EncryptionContextGenerator.createContext(cipher.getIV(), true);
     }
 
     public static void beforeClass() throws ConfigurationException
@@ -126,22 +149,25 @@
         SchemaLoader.prepareServer();
         StorageService.instance.getTokenMetadata().updateHostId(UUID.randomUUID(), FBUtilities.getBroadcastAddressAndPort());
 
+        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);
+                         .addStaticColumn("s", IntegerType.instance)
+                         .memtable(skipListMemtable);
 
         SchemaLoader.createKeyspace(KEYSPACE1,
                                     KeyspaceParams.simple(1),
-                                    SchemaLoader.standardCFMD(KEYSPACE1, STANDARD1, 0, AsciiType.instance, BytesType.instance),
-                                    SchemaLoader.standardCFMD(KEYSPACE1, STANDARD2, 0, AsciiType.instance, BytesType.instance),
+                                    SchemaLoader.standardCFMD(KEYSPACE1, STANDARD1, 0, AsciiType.instance, BytesType.instance).memtable(skipListMemtable),
+                                    SchemaLoader.standardCFMD(KEYSPACE1, STANDARD2, 0, AsciiType.instance, BytesType.instance).memtable(skipListMemtable),
                                     custom);
         SchemaLoader.createKeyspace(KEYSPACE2,
                                     KeyspaceParams.simpleTransient(1),
-                                    SchemaLoader.standardCFMD(KEYSPACE1, STANDARD1, 0, AsciiType.instance, BytesType.instance),
-                                    SchemaLoader.standardCFMD(KEYSPACE1, STANDARD2, 0, AsciiType.instance, BytesType.instance));
+                                    SchemaLoader.standardCFMD(KEYSPACE2, STANDARD1, 0, AsciiType.instance, BytesType.instance).memtable(skipListMemtable),
+                                    SchemaLoader.standardCFMD(KEYSPACE2, STANDARD2, 0, AsciiType.instance, BytesType.instance).memtable(skipListMemtable));
         CompactionManager.instance.disableAutoCompaction();
 
         testKiller = new KillerForTests();
@@ -167,6 +193,8 @@
     @After
     public void afterTest()
     {
+        CommitLogSegmentReader.setAllowSkipSyncMarkerCrc(false);
+        System.clearProperty("cassandra.replayList");
         testKiller.reset();
     }
 
@@ -174,10 +202,8 @@
     public void testRecoveryWithEmptyLog() throws Exception
     {
         runExpecting(() -> {
-            CommitLog.instance.recoverFiles(new File[]{
-            tmpFile(CommitLogDescriptor.current_version),
-            tmpFile(CommitLogDescriptor.current_version)
-            });
+            CommitLog.instance.recoverFiles(tmpFile(CommitLogDescriptor.current_version),
+                                            tmpFile(CommitLogDescriptor.current_version));
             return null;
         }, CommitLogReplayException.class);
     }
@@ -196,7 +222,9 @@
     @Test
     public void testHeaderOnlyFileFiltering() throws Exception
     {
-        File directory = Files.createTempDir();
+        Assume.assumeTrue(!DatabaseDescriptor.getEncryptionContext().isEnabled());
+
+        File directory = new File(Files.createTempDir());
 
         CommitLogDescriptor desc1 = new CommitLogDescriptor(CommitLogDescriptor.current_version, 1, null, DatabaseDescriptor.getEncryptionContext());
         CommitLogDescriptor desc2 = new CommitLogDescriptor(CommitLogDescriptor.current_version, 2, null, DatabaseDescriptor.getEncryptionContext());
@@ -213,7 +241,7 @@
         buffer.putInt(5);
         buffer.putInt(6);
 
-        try (OutputStream lout = new FileOutputStream(file1))
+        try (OutputStream lout = new FileOutputStreamPlus(file1))
         {
             lout.write(buffer.array());
         }
@@ -222,7 +250,7 @@
         File file2 = new File(directory, desc2.fileName());
         buffer = ByteBuffer.allocate(1024);
         CommitLogDescriptor.writeHeader(buffer, desc2);
-        try (OutputStream lout = new FileOutputStream(file2))
+        try (OutputStream lout = new FileOutputStreamPlus(file2))
         {
             lout.write(buffer.array());
         }
@@ -317,7 +345,7 @@
         ColumnFamilyStore cfs1 = ks.getColumnFamilyStore(STANDARD1);
         ColumnFamilyStore cfs2 = ks.getColumnFamilyStore(STANDARD2);
 
-        // Roughly 32 MB mutation
+        // Roughly 32 MiB mutation
         Mutation m = new RowUpdateBuilder(cfs1.metadata(), 0, "k")
                      .clustering("bytes")
                      .add("val", ByteBuffer.allocate(DatabaseDescriptor.getCommitLogSegmentSize() / 4))
@@ -353,7 +381,7 @@
         ColumnFamilyStore cfs1 = ks.getColumnFamilyStore(STANDARD1);
         ColumnFamilyStore cfs2 = ks.getColumnFamilyStore(STANDARD2);
 
-        // Roughly 32 MB mutation
+        // Roughly 32 MiB mutation
          Mutation rm = new RowUpdateBuilder(cfs1.metadata(), 0, "k")
                   .clustering("bytes")
                   .add("val", ByteBuffer.allocate((DatabaseDescriptor.getCommitLogSegmentSize()/4) - 1))
@@ -424,7 +452,7 @@
                       .add("val", ByteBuffer.allocate(allocSize)).build();
 
         int max = DatabaseDescriptor.getMaxMutationSize();
-        max -= CommitLogSegment.ENTRY_OVERHEAD_SIZE; // log entry overhead
+        max -= ENTRY_OVERHEAD_SIZE; // log entry overhead
 
         // Note that the size of the value if vint encoded. So we first compute the ovehead of the mutation without the value and it's size
         int mutationOverhead = rm.serializedSize(MessagingService.current_version) - (VIntCoding.computeVIntSize(allocSize) + allocSize);
@@ -470,7 +498,7 @@
         }
         catch (MutationExceededMaxSizeException e)
         {
-            Assert.assertEquals(cnt + 1, CommitLog.instance.metrics.oversizedMutations.getCount());
+            assertEquals(cnt + 1, CommitLog.instance.metrics.oversizedMutations.getCount());
             throw e;
         }
         throw new AssertionError("mutation larger than limit was accepted");
@@ -508,7 +536,7 @@
             String message = exception.getMessage();
 
             long mutationSize = mutation.serializedSize(MessagingService.current_version) + ENTRY_OVERHEAD_SIZE;
-            final String expectedMessagePrefix = String.format("Encountered an oversized mutation (%d/%d) for keyspace: %s.",
+            final String expectedMessagePrefix = String.format("Rejected an oversized mutation (%d/%d) for keyspace: %s.",
                                                                mutationSize,
                                                                DatabaseDescriptor.getMaxMutationSize(),
                                                                KEYSPACE1);
@@ -557,7 +585,7 @@
 
         File logFile = new File(DatabaseDescriptor.getCommitLogLocation(), desc.fileName());
 
-        try (OutputStream lout = new FileOutputStream(logFile))
+        try (OutputStream lout = new FileOutputStreamPlus(logFile))
         {
             lout.write(buf.array(), 0, buf.limit());
         }
@@ -586,11 +614,11 @@
     protected Void testRecovery(byte[] logData, int version) throws Exception
     {
         File logFile = tmpFile(version);
-        try (OutputStream lout = new FileOutputStream(logFile))
+        try (OutputStream lout = new FileOutputStreamPlus(logFile))
         {
             lout.write(logData);
             //statics make it annoying to test things correctly
-            CommitLog.instance.recover(logFile.getPath()); //CASSANDRA-1119 / CASSANDRA-1179 throw on failure*/
+            CommitLog.instance.recover(logFile.path()); //CASSANDRA-1119 / CASSANDRA-1179 throw on failure*/
         }
         return null;
     }
@@ -598,17 +626,17 @@
     protected Void testRecovery(CommitLogDescriptor desc, byte[] logData) throws Exception
     {
         File logFile = tmpFile(desc.version);
-        CommitLogDescriptor fromFile = CommitLogDescriptor.fromFileName(logFile.getName());
+        CommitLogDescriptor fromFile = CommitLogDescriptor.fromFileName(logFile.name());
         // Change id to match file.
         desc = new CommitLogDescriptor(desc.version, fromFile.id, desc.compression, desc.getEncryptionContext());
         ByteBuffer buf = ByteBuffer.allocate(1024);
         CommitLogDescriptor.writeHeader(buf, desc, getAdditionalHeaders(desc.getEncryptionContext()));
-        try (OutputStream lout = new FileOutputStream(logFile))
+        try (OutputStream lout = new FileOutputStreamPlus(logFile))
         {
             lout.write(buf.array(), 0, buf.position());
             lout.write(logData);
             //statics make it annoying to test things correctly
-            CommitLog.instance.recover(logFile.getPath()); //CASSANDRA-1119 / CASSANDRA-1179 throw on failure*/
+            CommitLog.instance.recover(logFile.path()); //CASSANDRA-1119 / CASSANDRA-1179 throw on failure*/
         }
         return null;
     }
@@ -620,12 +648,12 @@
         File logFile = tmpFile(desc.version);
         ByteBuffer buf = ByteBuffer.allocate(1024);
         CommitLogDescriptor.writeHeader(buf, desc);
-        try (OutputStream lout = new FileOutputStream(logFile))
+        try (OutputStream lout = new FileOutputStreamPlus(logFile))
         {
             lout.write(buf.array(), 0, buf.position());
 
             runExpecting(() -> {
-                CommitLog.instance.recover(logFile.getPath()); //CASSANDRA-1119 / CASSANDRA-1179 throw on failure*/
+                CommitLog.instance.recover(logFile.path()); //CASSANDRA-1119 / CASSANDRA-1179 throw on failure*/
                 return null;
             }, CommitLogReplayException.class);
         }
@@ -655,20 +683,18 @@
             caught = t;
         }
         if (expected != null && caught == null)
-            Assert.fail("Expected exception " + expected + " but call completed successfully.");
+            fail("Expected exception " + expected + " but call completed successfully.");
 
         assertEquals("JVM kill state doesn't match expectation.", expected != null, testKiller.wasKilled());
     }
 
     protected void testRecovery(final byte[] logData, Class<?> expected) throws Exception
     {
-        ParameterizedClass commitLogCompression = DatabaseDescriptor.getCommitLogCompression();
-        EncryptionContext encryptionContext = DatabaseDescriptor.getEncryptionContext();
         runExpecting(() -> testRecovery(logData, CommitLogDescriptor.current_version), expected);
     }
 
     @Test
-    public void testTruncateWithoutSnapshot() throws ExecutionException, InterruptedException, IOException
+    public void testTruncateWithoutSnapshot()
     {
         boolean originalState = DatabaseDescriptor.isAutoSnapshot();
         try
@@ -758,13 +784,81 @@
         List<String> activeSegments = CommitLog.instance.getActiveSegmentNames();
         assertFalse(activeSegments.isEmpty());
 
-        File[] files = new File(CommitLog.instance.segmentManager.storageDirectory).listFiles((file, name) -> activeSegments.contains(name));
+        File[] files = new File(CommitLog.instance.segmentManager.storageDirectory).tryList((file, name) -> activeSegments.contains(name));
         replayer.replayFiles(files);
 
         assertEquals(cellCount, replayer.cells);
     }
 
     @Test
+    public void replayWithBadSyncMarkerCRC() throws IOException
+    {
+        ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(STANDARD1);
+
+        Mutation rm2 = new RowUpdateBuilder(cfs.metadata(), 0, "k2").clustering("bytes")
+                                                                    .add("val", bytes("this is a string"))
+                                                                    .build();
+        CommitLog.instance.add(rm2);
+        CommitLog.instance.sync(true);
+
+        List<String> activeSegments = CommitLog.instance.getActiveSegmentNames();
+        assertFalse(activeSegments.isEmpty());
+
+        File directory = new File(CommitLog.instance.segmentManager.storageDirectory);
+        File firstActiveFile = Objects.requireNonNull(directory.tryList((file, name) -> activeSegments.contains(name)))[0];
+        zeroFirstSyncMarkerCRC(firstActiveFile);
+
+        CommitLogSegmentReader.setAllowSkipSyncMarkerCrc(true);
+
+        if (DatabaseDescriptor.getCommitLogCompression() != null || DatabaseDescriptor.getEncryptionContext().isEnabled())
+        {
+            // If compression or encryption are enabled, expect an error, and do not attempt to replay using only mutation CRCs.
+            runExpecting(() ->
+                         {
+                             CommitLog.instance.recoverFiles(firstActiveFile);
+                             return null;
+                         },
+                         CommitLogReplayException.class);
+        }
+        else
+        {
+            SimpleCountingReplayer replayer = new SimpleCountingReplayer(CommitLog.instance, CommitLogPosition.NONE, cfs.metadata());
+            replayer.replayPath(firstActiveFile, false);
+            assertEquals(1, replayer.cells);
+        }
+    }
+
+    private void zeroFirstSyncMarkerCRC(File file) throws IOException
+    {
+        // Get the position of the first sync marker...
+        int firstSyncMarkerPosition = -1;
+
+        try (RandomAccessReader reader = RandomAccessReader.open(file))
+        {
+            CommitLogDescriptor.readHeader(reader, DatabaseDescriptor.getEncryptionContext());
+            firstSyncMarkerPosition = (int) reader.getFilePointer();
+        }
+
+        // ...buffer the file into memory...
+        ByteBuffer buffer = ByteBuffer.allocate((int) file.length());
+
+        try (RandomAccessReader reader = RandomAccessReader.open(file))
+        {
+            reader.readFully(buffer);
+        }
+
+        // ...overwrite the sync marker CRC with zero...
+        buffer.position(firstSyncMarkerPosition + 4);
+        buffer.putInt(0);
+
+        // ...and write the file back out.
+        try (OutputStream out = new FileOutputStreamPlus(file))
+        {
+            out.write(buffer.array());
+        }
+    }
+
+    @Test
     public void replayWithDiscard() throws IOException
     {
         int cellCount = 0;
@@ -795,7 +889,7 @@
         List<String> activeSegments = CommitLog.instance.getActiveSegmentNames();
         assertFalse(activeSegments.isEmpty());
 
-        File[] files = new File(CommitLog.instance.segmentManager.storageDirectory).listFiles((file, name) -> activeSegments.contains(name));
+        File[] files = new File(CommitLog.instance.segmentManager.storageDirectory).tryList((file, name) -> activeSegments.contains(name));
         replayer.replayFiles(files);
 
         assertEquals(cellCount, replayer.cells);
@@ -842,6 +936,7 @@
         }
     }
 
+    @Test
     public void testUnwriteableFlushRecovery() throws ExecutionException, InterruptedException, IOException
     {
         CommitLog.instance.resetUnsafe(true);
@@ -864,7 +959,7 @@
                 {
                     try (Closeable c = Util.markDirectoriesUnwriteable(cfs))
                     {
-                        cfs.forceBlockingFlush();
+                        Util.flush(cfs);
                     }
                     catch (Throwable t)
                     {
@@ -874,7 +969,7 @@
                     }
                 }
                 else
-                    cfs.forceBlockingFlush();
+                    Util.flush(cfs);
             }
         }
         finally
@@ -886,7 +981,7 @@
         System.setProperty("cassandra.replayList", 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.
-        Assert.assertEquals(1, CommitLog.instance.resetUnsafe(false));
+        assertEquals(1, CommitLog.instance.resetUnsafe(false));
         System.clearProperty("cassandra.replayList");
     }
 
@@ -906,7 +1001,7 @@
 
             Memtable current = cfs.getTracker().getView().getCurrentMemtable();
             if (i == 2)
-                current.makeUnflushable();
+                ((SkipListMemtable) current).makeUnflushable();
 
             flushAction.accept(cfs, current);
         }
@@ -921,15 +1016,14 @@
         // 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.
-        Assert.assertEquals(1, CommitLog.instance.resetUnsafe(false));
-        System.clearProperty("cassandra.replayList");
+        assertEquals(1, CommitLog.instance.resetUnsafe(false));
     }
 
     BiConsumer<ColumnFamilyStore, Memtable> flush = (cfs, current) ->
     {
         try
         {
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         catch (Throwable t)
         {
@@ -937,7 +1031,7 @@
             while (!(t instanceof FSWriteError))
                 t = t.getCause();
             // Wait for started flushes to complete.
-            cfs.switchMemtableIfCurrent(current);
+            waitForStartedFlushes(cfs, current);
         }
     };
 
@@ -949,9 +1043,14 @@
         CommitLog.instance.forceRecycleAllSegments();
 
         // Wait for started flushes to complete.
-        cfs.switchMemtableIfCurrent(current);
+        waitForStartedFlushes(cfs, current);
     };
 
+    private void waitForStartedFlushes(ColumnFamilyStore cfs, Memtable current)
+    {
+        FBUtilities.waitOnFuture(cfs.switchMemtableIfCurrent(current, ColumnFamilyStore.FlushReason.UNIT_TESTS));
+    }
+
     @Test
     public void testOutOfOrderFlushRecovery() throws ExecutionException, InterruptedException, IOException
     {
@@ -1000,7 +1099,7 @@
             System.clearProperty(CommitLogReplayer.IGNORE_REPLAY_ERRORS_PROPERTY);
         }
 
-        Assert.assertEquals(replayed, 1);
+        assertEquals(replayed, 1);
     }
 }
 
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTestReplayer.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTestReplayer.java
index 5b87d68..0519af9 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogTestReplayer.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogTestReplayer.java
@@ -18,7 +18,7 @@
 */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
+import org.apache.cassandra.io.util.File;
 import java.io.IOException;
 
 import com.google.common.base.Predicate;
@@ -48,7 +48,7 @@
 
     public void examineCommitLog() throws IOException
     {
-        replayFiles(new File(DatabaseDescriptor.getCommitLogLocation()).listFiles());
+        replayFiles(new File(DatabaseDescriptor.getCommitLogLocation()).tryList());
     }
 
     private class CommitLogTestReader extends CommitLogReader
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTest.java
index 4705919..96b32d2 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTest.java
@@ -21,10 +21,12 @@
  *
  */
 
-import java.io.*;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Properties;
 
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.junit.Assert;
 
 import com.google.common.base.Predicate;
@@ -40,6 +42,7 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.rows.Cell;
 import org.apache.cassandra.db.rows.Row;
@@ -116,7 +119,7 @@
     public void testRestore(String location) throws IOException, InterruptedException
     {
         Properties prop = new Properties();
-        prop.load(new FileInputStream(new File(location + File.separatorChar + PROPERTIES_FILE)));
+        prop.load(new FileInputStreamPlus(new File(location + File.pathSeparator() + PROPERTIES_FILE)));
         int hash = Integer.parseInt(prop.getProperty(HASH_PROPERTY));
         int cells = Integer.parseInt(prop.getProperty(CELLS_PROPERTY));
 
@@ -125,12 +128,15 @@
         {
             TableId tableId = TableId.fromString(cfidString);
             if (Schema.instance.getTableMetadata(tableId) == null)
-                Schema.instance.load(KeyspaceMetadata.create(KEYSPACE, KeyspaceParams.simple(1), Tables.of(metadata.unbuild().id(tableId).build())));
+                SchemaTestUtil.addOrUpdateKeyspace(KeyspaceMetadata.create(KEYSPACE,
+                                                                           KeyspaceParams.simple(1),
+                                                                           Tables.of(metadata.unbuild().id(tableId).build())),
+                                                   true);
         }
 
         Hasher hasher = new Hasher();
         CommitLogTestReplayer replayer = new CommitLogTestReplayer(hasher);
-        File[] files = new File(location).listFiles((file, name) -> name.endsWith(".log"));
+        File[] files = new File(location).tryList((file, name) -> name.endsWith(".log"));
         replayer.replayFiles(files);
 
         Assert.assertEquals(cells, hasher.cells);
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTestMaker.java b/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTestMaker.java
index 680a0e7..b97cad2 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTestMaker.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitLogUpgradeTestMaker.java
@@ -21,7 +21,7 @@
  *
  */
 
-import java.io.*;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
@@ -33,6 +33,9 @@
 import java.util.concurrent.atomic.AtomicLong;
 
 import com.google.common.util.concurrent.RateLimiter;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.junit.Assert;
 
 import org.apache.cassandra.SchemaLoader;
@@ -82,7 +85,7 @@
 
     static public void initialize() throws IOException, ConfigurationException
     {
-        try (FileInputStream fis = new FileInputStream("CHANGES.txt"))
+        try (FileInputStreamPlus fis = new FileInputStreamPlus("CHANGES.txt"))
         {
             dataSource = ByteBuffer.allocateDirect((int) fis.getChannel().size());
             while (dataSource.hasRemaining())
@@ -128,15 +131,15 @@
         if (dataDir.exists())
             FileUtils.deleteRecursive(dataDir);
 
-        dataDir.mkdirs();
-        for (File f : new File(DatabaseDescriptor.getCommitLogLocation()).listFiles())
-            FileUtils.createHardLink(f, new File(dataDir, f.getName()));
+        dataDir.tryCreateDirectories();
+        for (File f : new File(DatabaseDescriptor.getCommitLogLocation()).tryList())
+            FileUtils.createHardLink(f, new File(dataDir, f.name()));
 
         Properties prop = new Properties();
         prop.setProperty(CFID_PROPERTY, Schema.instance.getTableMetadata(KEYSPACE, TABLE).id.toString());
         prop.setProperty(CELLS_PROPERTY, Integer.toString(cells));
         prop.setProperty(HASH_PROPERTY, Integer.toString(hash));
-        prop.store(new FileOutputStream(new File(dataDir, PROPERTIES_FILE)),
+        prop.store(new FileOutputStreamPlus(new File(dataDir, PROPERTIES_FILE)),
                    "CommitLog upgrade test, version " + FBUtilities.getReleaseVersionString());
         System.out.println("Done");
     }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java b/test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java
index 711cf65..e962450 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/CommitlogShutdownTest.java
@@ -18,12 +18,11 @@
 
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.Random;
-import java.util.UUID;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -94,6 +93,6 @@
         CommitLog.instance.shutdownBlocking();
 
         // the shutdown should block until all logs except the currently active one and perhaps a new, empty one are gone
-        Assert.assertTrue(new File(DatabaseDescriptor.getCommitLogLocation()).listFiles().length <= 2);
+        Assert.assertTrue(new File(DatabaseDescriptor.getCommitLogLocation()).tryList().length <= 2);
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java b/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java
index ce20935..4166759 100644
--- a/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java
+++ b/test/unit/org/apache/cassandra/db/commitlog/SegmentReaderTest.java
@@ -17,10 +17,8 @@
  */
 package org.apache.cassandra.db.commitlog;
 
-import java.io.File;
-import java.io.FileOutputStream;
+import org.apache.cassandra.io.util.*;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.Collections;
@@ -42,9 +40,6 @@
 import org.apache.cassandra.io.compress.LZ4Compressor;
 import org.apache.cassandra.io.compress.SnappyCompressor;
 import org.apache.cassandra.io.compress.ZstdCompressor;
-import org.apache.cassandra.io.util.FileDataInput;
-import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.security.CipherFactory;
 import org.apache.cassandra.security.EncryptionUtils;
 import org.apache.cassandra.security.EncryptionContext;
@@ -103,7 +98,7 @@
 
         File compressedFile = FileUtils.createTempFile("compressed-segment-", ".log");
         compressedFile.deleteOnExit();
-        FileOutputStream fos = new FileOutputStream(compressedFile);
+        FileOutputStreamPlus fos = new FileOutputStreamPlus(compressedFile);
         fos.getChannel().write(compBuffer);
         fos.close();
 
@@ -190,7 +185,7 @@
         Cipher cipher = cipherFactory.getEncryptor(context.getTransparentDataEncryptionOptions().cipher, context.getTransparentDataEncryptionOptions().key_alias);
         File encryptedFile = FileUtils.createTempFile("encrypted-segment-", ".log");
         encryptedFile.deleteOnExit();
-        FileChannel channel = new RandomAccessFile(encryptedFile, "rw").getChannel();
+        FileChannel channel = encryptedFile.newReadWriteChannel();
         channel.write(ByteBufferUtil.bytes(plainTextLength));
         EncryptionUtils.encryptAndWrite(compressedBuffer, channel, true, cipher);
         channel.close();
diff --git a/test/unit/org/apache/cassandra/db/commitlog/SnapshotDeletingTest.java b/test/unit/org/apache/cassandra/db/commitlog/SnapshotDeletingTest.java
deleted file mode 100644
index b3dc070..0000000
--- a/test/unit/org/apache/cassandra/db/commitlog/SnapshotDeletingTest.java
+++ /dev/null
@@ -1,107 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.db.commitlog;
-
-import org.junit.Assume;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import static org.junit.Assert.*;
-
-import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.Util;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.DecoratedKey;
-import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.RowUpdateBuilder;
-import org.apache.cassandra.db.WindowsFailedSnapshotTracker;
-import org.apache.cassandra.io.sstable.SnapshotDeletingTask;
-import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.service.GCInspector;
-import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.FBUtilities;
-
-public class SnapshotDeletingTest
-{
-    private static final String KEYSPACE1 = "Keyspace1";
-    private static final String CF_STANDARD1 = "CF_STANDARD1";
-
-    @BeforeClass
-    public static void defineSchema() throws Exception
-    {
-        DatabaseDescriptor.daemonInitialization();
-        GCInspector.register();
-        // Needed to init the output file where we print failed snapshots. This is called on node startup.
-        WindowsFailedSnapshotTracker.deleteOldSnapshots();
-        SchemaLoader.prepareServer();
-        SchemaLoader.createKeyspace(KEYSPACE1,
-                                    KeyspaceParams.simple(1),
-                                    SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1));
-    }
-
-    @Test
-    public void testCompactionHook() throws Exception
-    {
-        Assume.assumeTrue(FBUtilities.isWindows);
-
-        Keyspace keyspace = Keyspace.open(KEYSPACE1);
-        ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_STANDARD1);
-        store.clearUnsafe();
-
-        populate(10000);
-        store.snapshot("snapshot1");
-
-        // Confirm snapshot deletion fails. Sleep for a bit just to make sure the SnapshotDeletingTask has
-        // time to run and fail.
-        Thread.sleep(500);
-        store.clearSnapshot("snapshot1");
-        assertEquals(1, SnapshotDeletingTask.pendingDeletionCount());
-
-        // Compact the cf and confirm that the executor's after hook calls rescheduleDeletion
-        populate(20000);
-        store.forceBlockingFlush();
-        store.forceMajorCompaction();
-
-        long start = System.currentTimeMillis();
-        while (System.currentTimeMillis() - start < 1000 && SnapshotDeletingTask.pendingDeletionCount() > 0)
-        {
-            Thread.yield();
-        }
-
-        assertEquals(0, SnapshotDeletingTask.pendingDeletionCount());
-    }
-
-    private void populate(int rowCount) {
-        long timestamp = System.currentTimeMillis();
-        TableMetadata cfm = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1).metadata();
-        for (int i = 0; i <= rowCount; i++)
-        {
-            DecoratedKey key = Util.dk(Integer.toString(i));
-            for (int j = 0; j < 10; j++)
-            {
-                new RowUpdateBuilder(cfm, timestamp, 0, key.getKey())
-                    .clustering(Integer.toString(j))
-                    .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
-                    .build()
-                    .applyUnsafe();
-            }
-        }
-    }
-}
diff --git a/test/unit/org/apache/cassandra/db/compaction/AbstractCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/AbstractCompactionStrategyTest.java
index 4092f54..bd4b28f 100644
--- a/test/unit/org/apache/cassandra/db/compaction/AbstractCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/AbstractCompactionStrategyTest.java
@@ -139,6 +139,6 @@
         .add("val", "val")
         .build()
         .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/compaction/AbstractPendingRepairTest.java b/test/unit/org/apache/cassandra/db/compaction/AbstractPendingRepairTest.java
index de7ddfc..b0bb23c 100644
--- a/test/unit/org/apache/cassandra/db/compaction/AbstractPendingRepairTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/AbstractPendingRepairTest.java
@@ -21,13 +21,13 @@
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.UUID;
 
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -39,6 +39,7 @@
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 @Ignore
 public class AbstractPendingRepairTest extends AbstractRepairTest
@@ -86,7 +87,7 @@
         int pk = nextSSTableKey++;
         Set<SSTableReader> pre = cfs.getLiveSSTables();
         QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v) VALUES(?, ?)", ks, tbl), pk, pk);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Set<SSTableReader> post = cfs.getLiveSSTables();
         Set<SSTableReader> diff = new HashSet<>(post);
         diff.removeAll(pre);
@@ -99,7 +100,7 @@
         return sstable;
     }
 
-    public static void mutateRepaired(SSTableReader sstable, long repairedAt, UUID pendingRepair, boolean isTransient)
+    public static void mutateRepaired(SSTableReader sstable, long repairedAt, TimeUUID pendingRepair, boolean isTransient)
     {
         try
         {
@@ -117,7 +118,7 @@
         mutateRepaired(sstable, repairedAt, ActiveRepairService.NO_PENDING_REPAIR, false);
     }
 
-    public static void mutateRepaired(SSTableReader sstable, UUID pendingRepair, boolean isTransient)
+    public static void mutateRepaired(SSTableReader sstable, TimeUUID pendingRepair, boolean isTransient)
     {
         mutateRepaired(sstable, ActiveRepairService.UNREPAIRED_SSTABLE, pendingRepair, isTransient);
     }
diff --git a/test/unit/org/apache/cassandra/db/compaction/ActiveCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/ActiveCompactionsTest.java
index 08c76bf..56d6c40 100644
--- a/test/unit/org/apache/cassandra/db/compaction/ActiveCompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/ActiveCompactionsTest.java
@@ -38,6 +38,7 @@
 import org.apache.cassandra.cache.AutoSavingCache;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.db.view.View;
 import org.apache.cassandra.db.view.ViewBuilderTask;
@@ -67,7 +68,7 @@
         for (int i = 0; i < 5; i++)
         {
             execute("INSERT INTO %s (pk, ck, a, b) VALUES (" + i + ", 2, 3, 4)");
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            getCurrentColumnFamilyStore().forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
         }
 
         Index idx = getCurrentColumnFamilyStore().indexManager.getIndexByName(idxName);
@@ -111,7 +112,7 @@
         for (int i = 0; i < 5; i++)
         {
             execute("INSERT INTO %s (pk, ck, a, b) VALUES (" + i + ", 2, 3, 4)");
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
         }
 
         Index idx = getCurrentColumnFamilyStore().indexManager.getIndexByName(idxName);
@@ -134,7 +135,7 @@
         for (int i = 0; i < 5; i++)
         {
             execute("INSERT INTO %s (pk, ck, a, b) VALUES (" + i + ", 2, 3, 4)");
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
         }
         Set<SSTableReader> sstables = getCurrentColumnFamilyStore().getLiveSSTables();
         try (LifecycleTransaction txn = getCurrentColumnFamilyStore().getTracker().tryModify(sstables, OperationType.INDEX_SUMMARY))
@@ -159,7 +160,7 @@
         for (int i = 0; i < 5; i++)
         {
             execute("INSERT INTO %s (k1, c1, val) VALUES (" + i + ", 2, 3)");
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
         }
         execute(String.format("CREATE MATERIALIZED VIEW %s.view1 AS SELECT k1, c1, val FROM %s.%s WHERE k1 IS NOT NULL AND c1 IS NOT NULL AND val IS NOT NULL PRIMARY KEY (val, k1, c1)", keyspace(), keyspace(), currentTable()));
         View view = Iterables.getOnlyElement(getCurrentColumnFamilyStore().viewManager);
@@ -183,7 +184,7 @@
         for (int i = 0; i < 5; i++)
         {
             execute("INSERT INTO %s (pk, ck, a, b) VALUES (" + i + ", 2, 3, 4)");
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
         }
 
         SSTableReader sstable = Iterables.getFirst(getCurrentColumnFamilyStore().getLiveSSTables(), null);
@@ -208,7 +209,7 @@
         for (int i = 0; i < 5; i++)
         {
             execute("INSERT INTO %s (pk, ck, a, b) VALUES (" + i + ", 2, 3, 4)");
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
         }
 
         SSTableReader sstable = Iterables.getFirst(getCurrentColumnFamilyStore().getLiveSSTables(), null);
diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionBytemanTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionBytemanTest.java
index 38d2607..c858930 100644
--- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionBytemanTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionBytemanTest.java
@@ -23,7 +23,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 
@@ -48,6 +47,7 @@
 import org.jboss.byteman.contrib.bmunit.BMRules;
 import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 
@@ -67,7 +67,7 @@
         execute("insert into %s (id, i) values (1, 1)");
         execute("insert into %s (id, i) values (2, 1)");
         execute("insert into %s (id, i) values (3, 1)");
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         UntypedResultSet res = execute("select token(id) as tok from %s");
         Iterator<UntypedResultSet.Row> it = res.iterator();
         List<Long> tokens = new ArrayList<>();
@@ -126,7 +126,7 @@
 
         try (LifecycleTransaction txn = getCurrentColumnFamilyStore().getTracker().tryModify(getCurrentColumnFamilyStore().getLiveSSTables(), OperationType.ANTICOMPACTION))
         {
-            CompactionManager.instance.antiCompactGroup(getCurrentColumnFamilyStore(), ranges, txn, UUID.randomUUID(), () -> false);
+            CompactionManager.instance.antiCompactGroup(getCurrentColumnFamilyStore(), ranges, txn, nextTimeUUID(), () -> false);
         }
         finished.set(true);
         t.join();
@@ -134,4 +134,4 @@
         assertFalse(getCurrentColumnFamilyStore().getLiveSSTables().contains(sstableBefore));
         Util.assertOnDiskState(getCurrentColumnFamilyStore(), 3);
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java
index b2618e5..d3112d8 100644
--- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.db.compaction;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -26,14 +25,15 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+
+import org.apache.cassandra.Util;
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.After;
@@ -43,6 +43,7 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
 import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
@@ -62,7 +63,7 @@
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Refs;
 import org.apache.cassandra.UpdateBuilder;
 import org.apache.cassandra.utils.concurrent.Transactional;
@@ -70,6 +71,7 @@
 import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
 import static org.apache.cassandra.service.ActiveRepairService.UNREPAIRED_SSTABLE;
 import static org.apache.cassandra.Util.assertOnDiskState;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.hamcrest.CoreMatchers.is;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -107,7 +109,7 @@
         store.truncateBlocking();
     }
 
-    private void registerParentRepairSession(UUID sessionID, Iterable<Range<Token>> ranges, long repairedAt, UUID pendingRepair) throws IOException
+    private void registerParentRepairSession(TimeUUID sessionID, Iterable<Range<Token>> ranges, long repairedAt, TimeUUID pendingRepair) throws IOException
     {
         ActiveRepairService.instance.registerParentRepairSession(sessionID,
                                                                  InetAddressAndPort.getByName("10.0.0.1"),
@@ -143,7 +145,7 @@
 
     private SSTableStats antiCompactRanges(ColumnFamilyStore store, RangesAtEndpoint ranges) throws IOException
     {
-        UUID sessionID = UUID.randomUUID();
+        TimeUUID sessionID = nextTimeUUID();
         Collection<SSTableReader> sstables = getUnrepairedSSTables(store);
         try (LifecycleTransaction txn = store.getTracker().tryModify(sstables, OperationType.ANTICOMPACTION);
              Refs<SSTableReader> refs = Refs.ref(sstables))
@@ -237,7 +239,7 @@
     }
 
     @Test
-    public void antiCompactionSizeTest() throws InterruptedException, IOException
+    public void antiCompactionSizeTest() throws InterruptedException, IOException, NoSuchRepairSessionException
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF);
@@ -247,8 +249,8 @@
         Range<Token> range = new Range<Token>(new BytesToken(ByteBufferUtil.bytes(0)), new BytesToken(ByteBufferUtil.bytes(500)));
         List<Range<Token>> ranges = Arrays.asList(range);
         Collection<SSTableReader> sstables = cfs.getLiveSSTables();
-        UUID parentRepairSession = UUID.randomUUID();
-        registerParentRepairSession(parentRepairSession, ranges, UNREPAIRED_SSTABLE, UUIDGen.getTimeUUID());
+        TimeUUID parentRepairSession = nextTimeUUID();
+        registerParentRepairSession(parentRepairSession, ranges, UNREPAIRED_SSTABLE, nextTimeUUID());
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.ANTICOMPACTION);
              Refs<SSTableReader> refs = Refs.ref(sstables))
         {
@@ -299,11 +301,11 @@
                     .build()
                     .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
     }
 
     @Test
-    public void antiCompactTenFull() throws InterruptedException, IOException
+    public void antiCompactTenFull() throws IOException, NoSuchRepairSessionException
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF);
@@ -326,7 +328,7 @@
     }
 
     @Test
-    public void antiCompactTenTrans() throws InterruptedException, IOException
+    public void antiCompactTenTrans() throws IOException, NoSuchRepairSessionException
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF);
@@ -349,7 +351,7 @@
     }
 
     @Test
-    public void antiCompactTenMixed() throws InterruptedException, IOException
+    public void antiCompactTenMixed() throws IOException, NoSuchRepairSessionException
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF);
@@ -368,7 +370,7 @@
     }
 
     @Test
-    public void shouldMutatePendingRepair() throws InterruptedException, IOException
+    public void shouldMutatePendingRepair() throws InterruptedException, IOException, NoSuchRepairSessionException
     {
         ColumnFamilyStore store = prepareColumnFamilyStore();
         Collection<SSTableReader> sstables = getUnrepairedSSTables(store);
@@ -376,7 +378,7 @@
         // the sstables start at "0".getBytes() = 48, we need to include that first token, with "/".getBytes() = 47
         Range<Token> range = new Range<Token>(new BytesToken("/".getBytes()), new BytesToken("9999".getBytes()));
         List<Range<Token>> ranges = Arrays.asList(range);
-        UUID pendingRepair = UUID.randomUUID();
+        TimeUUID pendingRepair = nextTimeUUID();
         registerParentRepairSession(pendingRepair, ranges, UNREPAIRED_SSTABLE, pendingRepair);
 
         try (LifecycleTransaction txn = store.getTracker().tryModify(sstables, OperationType.ANTICOMPACTION);
@@ -394,7 +396,7 @@
     }
 
     @Test
-    public void shouldSkipAntiCompactionForNonIntersectingRange() throws InterruptedException, IOException
+    public void shouldSkipAntiCompactionForNonIntersectingRange() throws IOException
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF);
@@ -410,7 +412,7 @@
 
         Range<Token> range = new Range<Token>(new BytesToken("-1".getBytes()), new BytesToken("-10".getBytes()));
         List<Range<Token>> ranges = Arrays.asList(range);
-        UUID parentRepairSession = UUID.randomUUID();
+        TimeUUID parentRepairSession = nextTimeUUID();
         registerParentRepairSession(parentRepairSession, ranges, UNREPAIRED_SSTABLE, null);
         boolean gotException = false;
         try (LifecycleTransaction txn = store.getTracker().tryModify(sstables, OperationType.ANTICOMPACTION);
@@ -442,7 +444,7 @@
                 .build()
                 .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         return store;
     }
 
@@ -479,7 +481,7 @@
         Range<Token> range = new Range<Token>(new BytesToken("-1".getBytes()), new BytesToken("-10".getBytes()));
         List<Range<Token>> ranges = Arrays.asList(range);
 
-        UUID missingRepairSession = UUIDGen.getTimeUUID();
+        TimeUUID missingRepairSession = nextTimeUUID();
         try (LifecycleTransaction txn = store.getTracker().tryModify(sstables, OperationType.ANTICOMPACTION);
              Refs<SSTableReader> refs = Refs.ref(sstables))
         {
@@ -509,7 +511,7 @@
         Range<Token> r = new Range<>(t(10), t(100)); // should include sstable 1 and 2 above, but none is fully contained (Range is (x, y])
 
         Iterator<SSTableReader> sstableIterator = sstables.iterator();
-        Set<SSTableReader> fullyContainedSSTables = CompactionManager.findSSTablesToAnticompact(sstableIterator, Collections.singletonList(r), UUID.randomUUID());
+        Set<SSTableReader> fullyContainedSSTables = CompactionManager.findSSTablesToAnticompact(sstableIterator, Collections.singletonList(r), nextTimeUUID());
         assertTrue(fullyContainedSSTables.isEmpty());
         assertEquals(2, sstables.size());
     }
@@ -527,7 +529,7 @@
         Range<Token> r = new Range<>(t(9), t(100)); // sstable 1 is fully contained
 
         Iterator<SSTableReader> sstableIterator = sstables.iterator();
-        Set<SSTableReader> fullyContainedSSTables = CompactionManager.findSSTablesToAnticompact(sstableIterator, Collections.singletonList(r), UUID.randomUUID());
+        Set<SSTableReader> fullyContainedSSTables = CompactionManager.findSSTablesToAnticompact(sstableIterator, Collections.singletonList(r), nextTimeUUID());
         assertEquals(Collections.singleton(sstable1), fullyContainedSSTables);
         assertEquals(Collections.singletonList(sstable2), sstables);
     }
@@ -542,7 +544,7 @@
 
         Range<Token> r = new Range<>(t(9), t(100)); // sstable is not intersecting and should not be included
 
-        CompactionManager.validateSSTableBoundsForAnticompaction(UUID.randomUUID(), sstables, atEndpoint(Collections.singletonList(r), NO_RANGES));
+        CompactionManager.validateSSTableBoundsForAnticompaction(nextTimeUUID(), sstables, atEndpoint(Collections.singletonList(r), NO_RANGES));
     }
 
     @Test(expected = IllegalStateException.class)
@@ -557,7 +559,7 @@
 
         Range<Token> r = new Range<>(t(10), t(11)); // no sstable included, throw
 
-        CompactionManager.validateSSTableBoundsForAnticompaction(UUID.randomUUID(), sstables, atEndpoint(Collections.singletonList(r), NO_RANGES));
+        CompactionManager.validateSSTableBoundsForAnticompaction(nextTimeUUID(), sstables, atEndpoint(Collections.singletonList(r), NO_RANGES));
     }
 
     @Test
@@ -573,7 +575,7 @@
         Range<Token> r = new Range<>(t(9), t(200)); // sstable 2 is fully contained - last token is equal
 
         Iterator<SSTableReader> sstableIterator = sstables.iterator();
-        Set<SSTableReader> fullyContainedSSTables = CompactionManager.findSSTablesToAnticompact(sstableIterator, Collections.singletonList(r), UUID.randomUUID());
+        Set<SSTableReader> fullyContainedSSTables = CompactionManager.findSSTablesToAnticompact(sstableIterator, Collections.singletonList(r), nextTimeUUID());
         assertEquals(Sets.newHashSet(sstable1, sstable2), fullyContainedSSTables);
         assertTrue(sstables.isEmpty());
     }
diff --git a/test/unit/org/apache/cassandra/db/compaction/CancelCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CancelCompactionsTest.java
index beed019..67421ba 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CancelCompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CancelCompactionsTest.java
@@ -23,7 +23,6 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Executors;
@@ -35,7 +34,6 @@
 import com.google.common.util.concurrent.Uninterruptibles;
 import org.junit.Test;
 
-import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
@@ -58,7 +56,9 @@
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -255,7 +255,7 @@
             // make sure that sstables are fully contained so that the metadata gets mutated
             Range<Token> range = new Range<>(token(-1), token(49));
 
-            UUID prsid = UUID.randomUUID();
+            TimeUUID prsid = nextTimeUUID();
             ActiveRepairService.instance.registerParentRepairSession(prsid, InetAddressAndPort.getLocalHost(), Collections.singletonList(cfs), Collections.singleton(range), true, 1, true, PreviewKind.NONE);
 
             InetAddressAndPort local = FBUtilities.getBroadcastAddressAndPort();
@@ -398,7 +398,7 @@
             txn = cfs.getTracker().tryModify(sstables, OperationType.COMPACTION);
             assertNotNull(txn);
             controller = new CompactionController(cfs, sstables, Integer.MIN_VALUE);
-            ci = new CompactionIterator(txn.opType(), scanners, controller, FBUtilities.nowInSeconds(), UUID.randomUUID());
+            ci = new CompactionIterator(txn.opType(), scanners, controller, FBUtilities.nowInSeconds(), nextTimeUUID());
             CompactionManager.instance.active.beginCompaction(ci);
         }
 
@@ -462,7 +462,7 @@
         for (int i = 0; i < 10; i++)
         {
             execute("insert into %s (id, something) values (?,?)", i, i);
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
         }
         AbstractCompactionTask ct = null;
 
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionControllerTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionControllerTest.java
index 500a881..9d81b61 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionControllerTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionControllerTest.java
@@ -21,7 +21,6 @@
 import java.nio.ByteBuffer;
 import java.util.Set;
 import java.util.function.LongPredicate;
-import java.util.function.Predicate;
 
 import com.google.common.collect.Sets;
 import org.junit.BeforeClass;
@@ -91,7 +90,7 @@
         {
             assertPurgeBoundary(controller.getPurgeEvaluator(key), timestamp1); //memtable only
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
             assertTrue(controller.getPurgeEvaluator(key).test(Long.MAX_VALUE)); //no memtables and no sstables
         }
 
@@ -99,7 +98,7 @@
 
         // create another sstable
         applyMutation(cfs.metadata(), key, timestamp2);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // check max purgeable timestamp when compacting the first sstable with and without a memtable
         try (CompactionController controller = new CompactionController(cfs, compacting, 0))
@@ -112,7 +111,7 @@
         }
 
         // check max purgeable timestamp again without any sstables but with different insertion orders on the memtable
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         //newest to oldest
         try (CompactionController controller = new CompactionController(cfs, null, 0))
@@ -124,7 +123,7 @@
             assertPurgeBoundary(controller.getPurgeEvaluator(key), timestamp3); //memtable only
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         //oldest to newest
         try (CompactionController controller = new CompactionController(cfs, null, 0))
@@ -152,14 +151,14 @@
 
         // create sstable with tombstone that should be expired in no older timestamps
         applyDeleteMutation(cfs.metadata(), key, timestamp2);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // first sstable with tombstone is compacting
         Set<SSTableReader> compacting = Sets.newHashSet(cfs.getLiveSSTables());
 
         // create another sstable with more recent timestamp
         applyMutation(cfs.metadata(), key, timestamp1);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // second sstable is overlapping
         Set<SSTableReader> overlapping = Sets.difference(Sets.newHashSet(cfs.getLiveSSTables()), compacting);
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java
index cca2997..813d12e 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionExecutorTest.java
@@ -18,15 +18,14 @@
 
 package org.apache.cassandra.db.compaction;
 
+import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.concurrent.ExecutorFactory;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
@@ -34,36 +33,15 @@
 public class CompactionExecutorTest
 {
     static Throwable testTaskThrowable = null;
-    static SimpleCondition afterExecuteCompleted = null;
-    private static class TestTaskExecutor extends CompactionManager.CompactionExecutor
-    {
-        // afterExecute runs immediately after the task completes, but it may
-        // race with the main thread checking the result, so make the main thread wait
-        // with a simple condition
-        @Override
-        public void afterExecute(Runnable r, Throwable t)
-        {
-            if (t == null)
-            {
-                t = DebuggableThreadPoolExecutor.extractThrowable(r);
-            }
-            testTaskThrowable = t;
-            afterExecuteCompleted.signalAll();
-        }
-        @Override
-        protected void beforeExecute(Thread t, Runnable r)
-        {
-        }
-    }
     private CompactionManager.CompactionExecutor executor;
 
     @Before
     public void setup()
     {
-        DatabaseDescriptor.daemonInitialization();
-        executor = new TestTaskExecutor();
-        testTaskThrowable = null;
-        afterExecuteCompleted = new SimpleCondition();
+        executor = new CompactionManager.CompactionExecutor(new ExecutorFactory.Default(null, null, (thread, throwable) -> {
+            if (throwable != null)
+                testTaskThrowable = throwable;
+        }), 1, "test", Integer.MAX_VALUE);
     }
 
     @After
@@ -73,19 +51,16 @@
         Assert.assertTrue(executor.awaitTermination(1, TimeUnit.MINUTES));
     }
 
-    void awaitExecution() throws Exception
-    {
-        assert afterExecuteCompleted.await(10, TimeUnit.SECONDS) : "afterExecute failed to complete";
-    }
-
     @Test
     public void testFailedRunnable() throws Exception
     {
-        executor.submitIfRunning(
+        testTaskThrowable = null;
+        Future<?> tt = executor.submitIfRunning(
             () -> { assert false : "testFailedRunnable"; }
             , "compactionExecutorTest");
 
-        awaitExecution();
+        while (!tt.isDone())
+            Thread.sleep(10);
         assertNotNull(testTaskThrowable);
         assertEquals(testTaskThrowable.getMessage(), "testFailedRunnable");
     }
@@ -93,11 +68,13 @@
     @Test
     public void testFailedCallable() throws Exception
     {
-        executor.submitIfRunning(
+        testTaskThrowable = null;
+        Future<?> tt = executor.submitIfRunning(
             () -> { assert false : "testFailedCallable"; return 1; }
             , "compactionExecutorTest");
 
-        awaitExecution();
+        while (!tt.isDone())
+            Thread.sleep(10);
         assertNotNull(testTaskThrowable);
         assertEquals(testTaskThrowable.getMessage(), "testFailedCallable");
     }
@@ -105,11 +82,13 @@
     @Test
     public void testExceptionRunnable() throws Exception
     {
-        executor.submitIfRunning(
+        testTaskThrowable = null;
+        Future<?> tt = executor.submitIfRunning(
         () -> { throw new RuntimeException("testExceptionRunnable"); }
         , "compactionExecutorTest");
 
-        awaitExecution();
+        while (!tt.isDone())
+            Thread.sleep(10);
         assertNotNull(testTaskThrowable);
         assertEquals(testTaskThrowable.getMessage(), "testExceptionRunnable");
     }
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionInfoTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionInfoTest.java
index c0196e8..753a185 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionInfoTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionInfoTest.java
@@ -20,24 +20,25 @@
 
 import java.util.ArrayList;
 import java.util.UUID;
-import java.util.regex.Pattern;
 
-import org.junit.Assert;
 import org.junit.Test;
 
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.repair.AbstractPendingAntiCompactionTest;
 import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.utils.TimeUUID;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class CompactionInfoTest extends AbstractPendingAntiCompactionTest
 {
     @Test
     public void testCompactionInfoToStringContainsTaskId()
     {
         ColumnFamilyStore cfs = MockSchema.newCFS();
-        UUID expectedTaskId = UUID.randomUUID();
+        TimeUUID expectedTaskId = nextTimeUUID();
         CompactionInfo compactionInfo = new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, 0, 1000, expectedTaskId, new ArrayList<>());
         Assertions.assertThat(compactionInfo.toString())
                   .contains(expectedTaskId.toString());
@@ -47,7 +48,7 @@
     public void testCompactionInfoToStringFormat()
     {
         UUID tableId = UUID.randomUUID();
-        UUID taskId = UUID.randomUUID();
+        TimeUUID taskId = nextTimeUUID();
         ColumnFamilyStore cfs = MockSchema.newCFS(builder -> builder.id(TableId.fromUUID(tableId)));
         CompactionInfo compactionInfo = new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, 0, 1000, taskId, new ArrayList<>());
         Assertions.assertThat(compactionInfo.toString())
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java
index 0aab021..ff3f210 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionIteratorTest.java
@@ -466,7 +466,7 @@
         createTable("CREATE TABLE %s (pk text, ck1 int, ck2 int, v int, PRIMARY KEY (pk, ck1, ck2))");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (pk, ck1, ck2, v) values (?, ?, ?, ?)", "key", i, i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
 
         DatabaseDescriptor.setSnapshotOnDuplicateRowDetection(true);
         TableMetadata metadata = getCurrentColumnFamilyStore().metadata();
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerPendingRepairTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerPendingRepairTest.java
index 9f2bc2e..76bbd88 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerPendingRepairTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerPendingRepairTest.java
@@ -20,7 +20,6 @@
 
 import java.util.Collections;
 import java.util.List;
-import java.util.UUID;
 
 import com.google.common.collect.Iterables;
 import org.junit.Assert;
@@ -31,9 +30,11 @@
 import org.apache.cassandra.notifications.SSTableDeletingNotification;
 import org.apache.cassandra.notifications.SSTableListChangedNotification;
 import org.apache.cassandra.notifications.SSTableRepairStatusChanged;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
 import org.apache.cassandra.repair.consistent.LocalSessionAccessor;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * Tests CompactionStrategyManager's handling of pending repair sstables
@@ -61,12 +62,12 @@
         return csm.getUnrepairedUnsafe().containsSSTable(sstable);
     }
 
-    private boolean hasPendingStrategiesFor(UUID sessionID)
+    private boolean hasPendingStrategiesFor(TimeUUID sessionID)
     {
         return !Iterables.isEmpty(csm.getPendingRepairsUnsafe().getStrategiesFor(sessionID));
     }
 
-    private boolean hasTransientStrategiesFor(UUID sessionID)
+    private boolean hasTransientStrategiesFor(TimeUUID sessionID)
     {
         return !Iterables.isEmpty(csm.getTransientRepairsUnsafe().getStrategiesFor(sessionID));
     }
@@ -77,7 +78,7 @@
     @Test
     public void sstableAdded()
     {
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         Assert.assertTrue(Iterables.isEmpty(csm.getPendingRepairsUnsafe().allStrategies()));
 
@@ -103,7 +104,7 @@
     @Test
     public void sstableListChangedAddAndRemove()
     {
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
 
         SSTableReader sstable1 = makeSSTable(true);
@@ -152,7 +153,7 @@
     @Test
     public void sstableRepairStatusChanged()
     {
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
 
         // add as unrepaired
@@ -186,7 +187,7 @@
     @Test
     public void sstableDeleted()
     {
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
 
         SSTableReader sstable = makeSSTable(true);
@@ -209,7 +210,7 @@
     @Test
     public void getStrategies()
     {
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
 
         List<List<AbstractCompactionStrategy>> strategies;
@@ -232,9 +233,9 @@
      * which reclassify the sstables as repaired
      */
     @Test
-    public void cleanupCompactionFinalized()
+    public void cleanupCompactionFinalized() throws NoSuchRepairSessionException
     {
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -274,7 +275,7 @@
     @Test
     public void cleanupCompactionFailed()
     {
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -310,7 +311,7 @@
     public void finalizedSessionTransientCleanup()
     {
         Assert.assertTrue(cfs.getLiveSSTables().isEmpty());
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, true);
@@ -341,7 +342,7 @@
     public void failedSessionTransientCleanup()
     {
         Assert.assertTrue(cfs.getLiveSSTables().isEmpty());
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, true);
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerTest.java
index d29ab52..9960e8e 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionStrategyManagerTest.java
@@ -18,14 +18,12 @@
 
 package org.apache.cassandra.db.compaction;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.stream.Collectors;
@@ -38,7 +36,6 @@
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,14 +53,15 @@
 import org.apache.cassandra.dht.ByteOrderedPartitioner;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.notifications.SSTableAddedNotification;
 import org.apache.cassandra.notifications.SSTableDeletingNotification;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -134,7 +132,7 @@
             else if (i % 3 == 1)
             {
                 //make 1 third of sstables pending repair
-                cfs.getCompactionStrategyManager().mutateRepaired(newSSTables, 0, UUIDGen.getTimeUUID(), false);
+                cfs.getCompactionStrategyManager().mutateRepaired(newSSTables, 0, nextTimeUUID(), false);
             }
             previousSSTables = currentSSTables;
         }
@@ -355,8 +353,8 @@
             repaired.add(createSSTableWithKey(cfs.keyspace.getName(), cfs.name, key++));
         }
 
-        cfs.getCompactionStrategyManager().mutateRepaired(transientRepairs, 0, UUID.randomUUID(), true);
-        cfs.getCompactionStrategyManager().mutateRepaired(pendingRepair, 0, UUID.randomUUID(), false);
+        cfs.getCompactionStrategyManager().mutateRepaired(transientRepairs, 0, nextTimeUUID(), true);
+        cfs.getCompactionStrategyManager().mutateRepaired(pendingRepair, 0, nextTimeUUID(), false);
         cfs.getCompactionStrategyManager().mutateRepaired(repaired, 1000, null, false);
 
         DiskBoundaries boundaries = new DiskBoundaries(cfs, cfs.getDirectories().getWriteableLocations(),
@@ -403,7 +401,7 @@
         Directories.DataDirectory[] directories = new Directories.DataDirectory[disks];
         for (int i = 0; i < disks; ++i)
         {
-            File tempDir = Files.createTempDir();
+            File tempDir = new File(Files.createTempDir());
             tempDir.deleteOnExit();
             directories[i] = new Directories.DataDirectory(tempDir);
         }
@@ -462,7 +460,7 @@
         int firstKey = Integer.parseInt(new String(ByteBufferUtil.getArray(reader.first.getKey())));
         while (boundaries[index] <= firstKey)
             index++;
-        logger.debug("Index for SSTable {} on boundary {} is {}", reader.descriptor.generation, Arrays.toString(boundaries), index);
+        logger.debug("Index for SSTable {} on boundary {} is {}", reader.descriptor.id, Arrays.toString(boundaries), index);
         return index;
     }
 
@@ -511,7 +509,7 @@
         .build()
         .applyUnsafe();
         Set<SSTableReader> before = cfs.getLiveSSTables();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Set<SSTableReader> after = cfs.getLiveSSTables();
         return Iterables.getOnlyElement(Sets.difference(after, before));
     }
@@ -521,7 +519,7 @@
     {
         MockCFS(ColumnFamilyStore cfs, Directories dirs)
         {
-            super(cfs.keyspace, cfs.getTableName(), 0, cfs.metadata, dirs, false, false, true);
+            super(cfs.keyspace, cfs.getTableName(), Util.newSeqGen(), cfs.metadata, dirs, false, false, true);
         }
     }
 
@@ -532,7 +530,7 @@
 
         private MockCFSForCSM(ColumnFamilyStore cfs, CountDownLatch latch, AtomicInteger upgradeTaskCount)
         {
-            super(cfs.keyspace, cfs.name, 10, cfs.metadata, cfs.getDirectories(), true, false, false);
+            super(cfs.keyspace, cfs.name, Util.newSeqGen(10), cfs.metadata, cfs.getDirectories(), true, false, false);
             this.latch = latch;
             this.upgradeTaskCount = upgradeTaskCount;
         }
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionTaskTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionTaskTest.java
index bdd2014..24b0c3d 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionTaskTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionTaskTest.java
@@ -23,7 +23,6 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -31,6 +30,7 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -41,9 +41,12 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
+import static org.apache.cassandra.service.ActiveRepairService.UNREPAIRED_SSTABLE;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class CompactionTaskTest
 {
     private static TableMetadata cfm;
@@ -53,7 +56,7 @@
     public static void setUpClass() throws Exception
     {
         SchemaLoader.prepareServer();
-        cfm = CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", "coordinatorsessiontest").build();
+        cfm = CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", "ks").build();
         SchemaLoader.createKeyspace("ks", KeyspaceParams.simple(1), cfm);
         cfs = Schema.instance.getColumnFamilyStoreInstance(cfm.id);
     }
@@ -71,10 +74,10 @@
         cfs.getCompactionStrategyManager().disable();
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (1, 1);");
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (2, 2);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (3, 3);");
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (4, 4);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Set<SSTableReader> sstables = cfs.getLiveSSTables();
 
         Assert.assertEquals(2, sstables.size());
@@ -96,7 +99,7 @@
         Assert.assertEquals(Transactional.AbstractTransactional.State.ABORTED, txn.state());
     }
 
-    private static void mutateRepaired(SSTableReader sstable, long repairedAt, UUID pendingRepair, boolean isTransient) throws IOException
+    private static void mutateRepaired(SSTableReader sstable, long repairedAt, TimeUUID pendingRepair, boolean isTransient) throws IOException
     {
         sstable.descriptor.getMetadataSerializer().mutateRepairMetadata(sstable.descriptor, repairedAt, pendingRepair, isTransient);
         sstable.reloadSSTableMetadata();
@@ -111,13 +114,13 @@
     {
         cfs.getCompactionStrategyManager().disable();
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (1, 1);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (2, 2);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (3, 3);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (4, 4);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         List<SSTableReader> sstables = new ArrayList<>(cfs.getLiveSSTables());
         Assert.assertEquals(4, sstables.size());
@@ -128,8 +131,8 @@
         SSTableReader pending2 = sstables.get(3);
 
         mutateRepaired(repaired, FBUtilities.nowInSeconds(), ActiveRepairService.NO_PENDING_REPAIR, false);
-        mutateRepaired(pending1, ActiveRepairService.UNREPAIRED_SSTABLE, UUIDGen.getTimeUUID(), false);
-        mutateRepaired(pending2, ActiveRepairService.UNREPAIRED_SSTABLE, UUIDGen.getTimeUUID(), false);
+        mutateRepaired(pending1, UNREPAIRED_SSTABLE, nextTimeUUID(), false);
+        mutateRepaired(pending2, UNREPAIRED_SSTABLE, nextTimeUUID(), false);
 
         LifecycleTransaction txn = null;
         List<SSTableReader> toCompact = new ArrayList<>(sstables);
@@ -160,13 +163,13 @@
     {
         cfs.getCompactionStrategyManager().disable();
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (1, 1);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (2, 2);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (3, 3);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         QueryProcessor.executeInternal("INSERT INTO ks.tbl (k, v) VALUES (4, 4);");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Set<SSTableReader> sstables = cfs.getLiveSSTables();
         Assert.assertEquals(4, sstables.size());
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsBytemanTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsBytemanTest.java
index 1c02699..462d406 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsBytemanTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsBytemanTest.java
@@ -18,9 +18,9 @@
 
 package org.apache.cassandra.db.compaction;
 
-import java.util.concurrent.TimeUnit;
 import java.util.Collection;
 import java.util.Collections;
+import java.util.concurrent.TimeUnit;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -35,6 +35,7 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Throwables;
 import org.jboss.byteman.contrib.bmunit.BMRule;
 import org.jboss.byteman.contrib.bmunit.BMRules;
 import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
@@ -129,7 +130,7 @@
 
         execute("INSERT INTO %s (k, c, v) VALUES (?, ?, ?)", 0, 1, 1);
         Util.spinAssertEquals(true, () -> CompactionManager.instance.compactingCF.count(cfs) == 0, 5);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Util.spinAssertEquals(true, () -> CompactionManager.instance.compactingCF.count(cfs) == 0, 5);
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(cfs));
@@ -147,7 +148,7 @@
         {
             execute("INSERT INTO %s (id, val) values (2, 'immortal')");
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     private void createLowGCGraceTable(){
@@ -194,7 +195,7 @@
             {
                 execute("insert into %s (k, c, v) values (?, ?, ?)", i, j, i*j);
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         cfs.getCompactionStrategyManager().mutateRepaired(cfs.getLiveSSTables(), System.currentTimeMillis(), null, false);
         for (int i = 0; i < 5; i++)
@@ -203,7 +204,7 @@
             {
                 execute("insert into %s (k, c, v) values (?, ?, ?)", i, j, i*j);
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         assertTrue(cfs.getTracker().getCompacting().isEmpty());
@@ -216,7 +217,7 @@
         }
         catch (RuntimeException t)
         {
-            if (!(t.getCause().getCause() instanceof CompactionInterruptedException))
+            if (!Throwables.isCausedBy(t, CompactionInterruptedException.class::isInstance))
                 throw t;
             //expected
         }
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsCQLTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsCQLTest.java
index e169548..65eea6a 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsCQLTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsCQLTest.java
@@ -31,6 +31,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.config.Config;
@@ -216,7 +217,7 @@
         getCurrentColumnFamilyStore().setCompactionParameters(localOptions);
         assertTrue(verifyStrategies(getCurrentColumnFamilyStore().getCompactionStrategyManager(), DateTieredCompactionStrategy.class));
         // Invalidate disk boundaries to ensure that boundary invalidation will not cause the old strategy to be reloaded
-        getCurrentColumnFamilyStore().invalidateDiskBoundaries();
+        getCurrentColumnFamilyStore().invalidateLocalRanges();
         // altering something non-compaction related
         execute("ALTER TABLE %s WITH gc_grace_seconds = 1000");
         // should keep the local compaction strat
@@ -297,7 +298,7 @@
         RangeTombstone rt = new RangeTombstone(Slice.ALL, new DeletionTime(System.currentTimeMillis(), -1));
         RowUpdateBuilder rub = new RowUpdateBuilder(getCurrentColumnFamilyStore().metadata(), System.currentTimeMillis() * 1000, 22).clustering(33).addRangeTombstone(rt);
         rub.build().apply();
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         compactAndValidate();
         readAndValidate(true);
         readAndValidate(false);
@@ -311,7 +312,7 @@
         // write a standard tombstone with negative local deletion time (LDTs are not set by user and should not be negative):
         RowUpdateBuilder rub = new RowUpdateBuilder(getCurrentColumnFamilyStore().metadata(), -1, System.currentTimeMillis() * 1000, 22).clustering(33).delete("b");
         rub.build().apply();
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         compactAndValidate();
         readAndValidate(true);
         readAndValidate(false);
@@ -325,7 +326,7 @@
         // write a partition deletion with negative local deletion time (LDTs are not set by user and should not be negative)::
         PartitionUpdate pu = PartitionUpdate.simpleBuilder(getCurrentColumnFamilyStore().metadata(), 22).nowInSec(-1).delete().build();
         new Mutation(pu).apply();
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         compactAndValidate();
         readAndValidate(true);
         readAndValidate(false);
@@ -338,7 +339,7 @@
         prepare();
         // write a row deletion with negative local deletion time (LDTs are not set by user and should not be negative):
         RowUpdateBuilder.deleteRowAt(getCurrentColumnFamilyStore().metadata(), System.currentTimeMillis() * 1000, -1, 22, 33).apply();
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         compactAndValidate();
         readAndValidate(true);
         readAndValidate(false);
@@ -356,11 +357,11 @@
     {
         // write enough data to make sure we use an IndexedReader when doing a read, and make sure it fails when reading a corrupt row deletion
         DatabaseDescriptor.setCorruptedTombstoneStrategy(Config.CorruptedTombstoneStrategy.exception);
-        int maxSizePre = DatabaseDescriptor.getColumnIndexSizeInKB();
+        int maxSizePre = DatabaseDescriptor.getColumnIndexSizeInKiB();
         DatabaseDescriptor.setColumnIndexSize(1024);
         prepareWide();
         RowUpdateBuilder.deleteRowAt(getCurrentColumnFamilyStore().metadata(), System.currentTimeMillis() * 1000, -1, 22, 33).apply();
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         readAndValidate(true);
         readAndValidate(false);
         DatabaseDescriptor.setColumnIndexSize(maxSizePre);
@@ -371,12 +372,12 @@
     {
         // write enough data to make sure we use an IndexedReader when doing a read, and make sure it fails when reading a corrupt standard tombstone
         DatabaseDescriptor.setCorruptedTombstoneStrategy(Config.CorruptedTombstoneStrategy.exception);
-        int maxSizePre = DatabaseDescriptor.getColumnIndexSizeInKB();
+        int maxSizePre = DatabaseDescriptor.getColumnIndexSizeInKiB();
         DatabaseDescriptor.setColumnIndexSize(1024);
         prepareWide();
         RowUpdateBuilder rub = new RowUpdateBuilder(getCurrentColumnFamilyStore().metadata(), -1, System.currentTimeMillis() * 1000, 22).clustering(33).delete("b");
         rub.build().apply();
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         readAndValidate(true);
         readAndValidate(false);
         DatabaseDescriptor.setColumnIndexSize(maxSizePre);
@@ -387,16 +388,16 @@
     {
         // write enough data to make sure we use an IndexedReader when doing a read, and make sure it fails when reading a corrupt range tombstone
         DatabaseDescriptor.setCorruptedTombstoneStrategy(Config.CorruptedTombstoneStrategy.exception);
-        final int maxSizePreKB = DatabaseDescriptor.getColumnIndexSizeInKB();
+        final int maxSizePreKiB = DatabaseDescriptor.getColumnIndexSizeInKiB();
         DatabaseDescriptor.setColumnIndexSize(1024);
         prepareWide();
         RangeTombstone rt = new RangeTombstone(Slice.ALL, new DeletionTime(System.currentTimeMillis(), -1));
         RowUpdateBuilder rub = new RowUpdateBuilder(getCurrentColumnFamilyStore().metadata(), System.currentTimeMillis() * 1000, 22).clustering(33).addRangeTombstone(rt);
         rub.build().apply();
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         readAndValidate(true);
         readAndValidate(false);
-        DatabaseDescriptor.setColumnIndexSize(maxSizePreKB);
+        DatabaseDescriptor.setColumnIndexSize(maxSizePreKiB);
     }
 
 
@@ -415,7 +416,7 @@
             {
                 execute("insert into %s (id, id2, t) values (?, ?, ?)", i, j, value);
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         assertEquals(50, cfs.getLiveSSTables().size());
         LeveledCompactionStrategy lcs = (LeveledCompactionStrategy) cfs.getCompactionStrategyManager().getUnrepairedUnsafe().first();
@@ -432,7 +433,7 @@
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
         cfs.disableAutoCompaction();
         execute("insert into %s (id, id2, t) values (?, ?, ?)", 1,1,"L1");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.forceMajorCompaction();
         SSTableReader l1sstable = cfs.getLiveSSTables().iterator().next();
         assertEquals(1, l1sstable.getSSTableLevel());
@@ -446,7 +447,7 @@
             {
                 execute("insert into %s (id, id2, t) values (?, ?, ?)", i, j, value);
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         assertEquals(51, cfs.getLiveSSTables().size());
 
@@ -473,14 +474,14 @@
             r.nextBytes(b);
             execute("insert into %s (id, x) values (?, ?)", i, ByteBuffer.wrap(b));
         }
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        getCurrentColumnFamilyStore().forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
         getCurrentColumnFamilyStore().disableAutoCompaction();
         for (int i = 0; i < 1000; i++)
         {
             r.nextBytes(b);
             execute("insert into %s (id, x) values (?, ?)", i, ByteBuffer.wrap(b));
         }
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        getCurrentColumnFamilyStore().forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         LeveledCompactionStrategy lcs = (LeveledCompactionStrategy) getCurrentColumnFamilyStore().getCompactionStrategyManager().getUnrepairedUnsafe().first();
         LeveledCompactionTask lcsTask;
@@ -507,7 +508,7 @@
             r.nextBytes(b);
             execute("insert into %s (id, x) values (?, ?)", i, ByteBuffer.wrap(b));
         }
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        getCurrentColumnFamilyStore().forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
         // now we have a bunch of sstables in L2 and one in L0 - bump the L0 one to L1:
         for (SSTableReader sstable : getCurrentColumnFamilyStore().getLiveSSTables())
         {
@@ -649,7 +650,7 @@
         {
             execute("INSERT INTO %s (id, b) VALUES (?, ?)", i, String.valueOf(i));
         }
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
 
         assertTombstones(getCurrentColumnFamilyStore().getLiveSSTables().iterator().next(), false);
         if (deletedCell)
@@ -657,7 +658,7 @@
         else
             execute("DELETE FROM %s WHERE id = ?", 50);
         getCurrentColumnFamilyStore().setNeverPurgeTombstones(false);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Thread.sleep(2000); // wait for gcgs to pass
         getCurrentColumnFamilyStore().forceMajorCompaction();
         assertTombstones(getCurrentColumnFamilyStore().getLiveSSTables().iterator().next(), false);
@@ -666,7 +667,7 @@
         else
             execute("DELETE FROM %s WHERE id = ?", 44);
         getCurrentColumnFamilyStore().setNeverPurgeTombstones(true);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         Thread.sleep(1100);
         getCurrentColumnFamilyStore().forceMajorCompaction();
         assertTombstones(getCurrentColumnFamilyStore().getLiveSSTables().iterator().next(), true);
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
index a0d52aa..4f1b639 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsPurgeTest.java
@@ -102,14 +102,14 @@
                    .build().applyUnsafe();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // deletes
         for (int i = 0; i < 10; i++)
         {
             RowUpdateBuilder.deleteRow(cfs.metadata(), 1, key, String.valueOf(i)).applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // resurrect one column
         RowUpdateBuilder builder = new RowUpdateBuilder(cfs.metadata(), 2, key);
@@ -117,7 +117,7 @@
                .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                .build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // major compact and test that all columns but the resurrected one is completely gone
         FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(cfs, Integer.MAX_VALUE, false));
@@ -146,14 +146,14 @@
                    .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                    .build().applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // deletes
         for (int i = 0; i < 10; i++)
         {
             RowUpdateBuilder.deleteRow(cfs.metadata(), Long.MAX_VALUE, key, String.valueOf(i)).applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // major compact - tombstones should be purged
         FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(cfs, Integer.MAX_VALUE, false));
@@ -164,7 +164,7 @@
                .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                .build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         cfs.invalidateCachedPartition(dk(key));
 
@@ -191,13 +191,13 @@
                    .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                    .build().applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new Mutation.PartitionUpdateCollector(KEYSPACE1, dk(key))
             .add(PartitionUpdate.fullPartitionDelete(cfs.metadata(), dk(key), Long.MAX_VALUE, FBUtilities.nowInSeconds()))
             .build()
             .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // major compact - tombstones should be purged
         FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(cfs, Integer.MAX_VALUE, false));
@@ -208,7 +208,7 @@
                .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                .build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         cfs.invalidateCachedPartition(dk(key));
 
@@ -235,11 +235,11 @@
                    .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                    .build().applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), Long.MAX_VALUE, dk(key))
             .addRangeTombstone(String.valueOf(0), String.valueOf(9)).build().applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // major compact - tombstones should be purged
         FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(cfs, Integer.MAX_VALUE, false));
@@ -250,7 +250,7 @@
                .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                .build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         cfs.invalidateCachedPartition(dk(key));
 
@@ -278,7 +278,7 @@
                         .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                         .build().applyUnsafe();
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
 
             // deletes
             for (int i = 0; i < 10; i++)
@@ -286,7 +286,7 @@
                 RowUpdateBuilder.deleteRow(cfs.metadata(), 1, key, String.valueOf(i)).applyUnsafe();
             }
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         DecoratedKey key1 = Util.dk("key1");
@@ -294,7 +294,7 @@
 
         // flush, remember the current sstable and then resurrect one column
         // for first key. Then submit minor compaction on remembered sstables.
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Collection<SSTableReader> sstablesIncomplete = cfs.getLiveSSTables();
 
         RowUpdateBuilder builder = new RowUpdateBuilder(cfs.metadata(), 2, "key1");
@@ -302,7 +302,7 @@
                 .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                 .build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         try (CompactionTasks tasks = cfs.getCompactionStrategyManager().getUserDefinedTasks(sstablesIncomplete, Integer.MAX_VALUE))
         {
             Iterables.getOnlyElement(tasks).execute(ActiveCompactionsTracker.NOOP);
@@ -343,16 +343,16 @@
         .add("val", ByteBufferUtil.EMPTY_BYTE_BUFFER)
         .build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         // delete c1
         RowUpdateBuilder.deleteRow(cfs.metadata(), 10, key3, "c1").applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Collection<SSTableReader> sstablesIncomplete = cfs.getLiveSSTables();
 
         // delete c2 so we have new delete in a diffrent SSTable
         RowUpdateBuilder.deleteRow(cfs.metadata(), 9, key3, "c2").applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // compact the sstables with the c1/c2 data and the c1 tombstone
         try (CompactionTasks tasks = cfs.getCompactionStrategyManager().getUserDefinedTasks(sstablesIncomplete, Integer.MAX_VALUE))
@@ -393,7 +393,7 @@
         {
             RowUpdateBuilder.deleteRow(cfs.metadata(), 1, key, String.valueOf(i)).applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(String.valueOf(cfs.getLiveSSTables()), 1, cfs.getLiveSSTables().size()); // inserts & deletes were in the same memtable -> only deletes in sstable
 
         // compact and test that the row is completely gone
@@ -438,7 +438,7 @@
         assertFalse(Util.getOnlyPartitionUnfiltered(Util.cmd(cfs, key).build()).isEmpty());
 
         // flush and major compact
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Util.compactAll(cfs, Integer.MAX_VALUE).get();
 
         // Since we've force purging (by passing MAX_VALUE for gc_before), the row should have been invalidated and we should have no deletion info anymore
@@ -474,7 +474,7 @@
         assertFalse(partition.partitionLevelDeletion().isLive());
 
         // flush and major compact (with tombstone purging)
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Util.compactAll(cfs, Integer.MAX_VALUE).get();
         assertFalse(Util.getOnlyPartitionUnfiltered(Util.cmd(cfs, key).build()).isEmpty());
 
@@ -504,14 +504,14 @@
         // write a row out to one sstable
         QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v1, v2) VALUES (%d, '%s', %d)",
                                                      keyspace, table, 1, "foo", 1));
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         UntypedResultSet result = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s WHERE k = %d", keyspace, table, 1));
         assertEquals(1, result.size());
 
         // write a row tombstone out to a second sstable
         QueryProcessor.executeInternal(String.format("DELETE FROM %s.%s WHERE k = %d", keyspace, table, 1));
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // basic check that the row is considered deleted
         assertEquals(2, cfs.getLiveSSTables().size());
@@ -529,14 +529,14 @@
         // write a row out to one sstable
         QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v1, v2) VALUES (%d, '%s', %d)",
                                                      keyspace, table, 1, "foo", 1));
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(2, cfs.getLiveSSTables().size());
         result = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s WHERE k = %d", keyspace, table, 1));
         assertEquals(1, result.size());
 
         // write a row tombstone out to a different sstable
         QueryProcessor.executeInternal(String.format("DELETE FROM %s.%s WHERE k = %d", keyspace, table, 1));
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // compact the two sstables with a gcBefore that *does* allow the row tombstone to be purged
         FBUtilities.waitOnFutures(CompactionManager.instance.submitMaximal(cfs, (int) (System.currentTimeMillis() / 1000) + 10000, false));
diff --git a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
index dd51f61..fcf5c51 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CompactionsTest.java
@@ -18,7 +18,6 @@
 */
 package org.apache.cassandra.db.compaction;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -64,15 +63,19 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.ISSTableScanner;
+import org.apache.cassandra.io.sstable.SSTableId;
+import org.apache.cassandra.io.sstable.SSTableIdFactory;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -131,14 +134,14 @@
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_STANDARD1);
         store.clearUnsafe();
-        MigrationManager.announceTableUpdate(store.metadata().unbuild().gcGraceSeconds(1).build(), true);
+        SchemaTestUtil.announceTableUpdate(store.metadata().unbuild().gcGraceSeconds(1).build());
 
         // disable compaction while flushing
         store.disableAutoCompaction();
 
         long timestamp = populate(KEYSPACE1, CF_STANDARD1, 0, 9, 3); //ttl=3s
 
-        store.forceBlockingFlush();
+        Util.flush(store);
         assertEquals(1, store.getLiveSSTables().size());
         long originalSize = store.getLiveSSTables().iterator().next().uncompressedLength();
 
@@ -173,18 +176,18 @@
         ColumnFamilyStore store = keyspace.getColumnFamilyStore(CF_STANDARD1);
         store.clearUnsafe();
 
-        MigrationManager.announceTableUpdate(store.metadata().unbuild().gcGraceSeconds(1).compaction(CompactionParams.stcs(compactionOptions)).build(), true);
+        SchemaTestUtil.announceTableUpdate(store.metadata().unbuild().gcGraceSeconds(1).compaction(CompactionParams.stcs(compactionOptions)).build());
 
         // disable compaction while flushing
         store.disableAutoCompaction();
 
         //Populate sstable1 with with keys [0..9]
         populate(KEYSPACE1, CF_STANDARD1, 0, 9, 3); //ttl=3s
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         //Populate sstable2 with with keys [10..19] (keys do not overlap with SSTable1)
         long timestamp2 = populate(KEYSPACE1, CF_STANDARD1, 10, 19, 3); //ttl=3s
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         assertEquals(2, store.getLiveSSTables().size());
 
@@ -216,7 +219,7 @@
 
         // now let's enable the magic property
         compactionOptions.put("unchecked_tombstone_compaction", "true");
-        MigrationManager.announceTableUpdate(store.metadata().unbuild().gcGraceSeconds(1).compaction(CompactionParams.stcs(compactionOptions)).build(), true);
+        SchemaTestUtil.announceTableUpdate(store.metadata().unbuild().gcGraceSeconds(1).compaction(CompactionParams.stcs(compactionOptions)).build());
 
         //submit background task again and wait for it to complete
         FBUtilities.waitOnFutures(CompactionManager.instance.submitBackground(store));
@@ -264,14 +267,14 @@
             .add("val", "val1")
             .build().applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Collection<SSTableReader> sstables = cfs.getLiveSSTables();
 
         assertEquals(1, sstables.size());
         SSTableReader sstable = sstables.iterator().next();
 
-        int prevGeneration = sstable.descriptor.generation;
-        String file = new File(sstable.descriptor.filenameFor(Component.DATA)).getAbsolutePath();
+        SSTableId prevGeneration = sstable.descriptor.id;
+        String file = new File(sstable.descriptor.filenameFor(Component.DATA)).absolutePath();
         // submit user defined compaction on flushed sstable
         CompactionManager.instance.forceUserDefinedCompaction(file);
         // wait until user defined compaction finishes
@@ -282,7 +285,7 @@
         // CF should have only one sstable with generation number advanced
         sstables = cfs.getLiveSSTables();
         assertEquals(1, sstables.size());
-        assertEquals( prevGeneration + 1, sstables.iterator().next().descriptor.generation);
+        assertThat(SSTableIdFactory.COMPARATOR.compare(prevGeneration, sstables.iterator().next().descriptor.id)).isLessThan(0);
     }
 
     public static void writeSSTableWithRangeTombstoneMaskingOneColumn(ColumnFamilyStore cfs, TableMetadata table, int[] dks) {
@@ -299,7 +302,7 @@
             notYetDeletedRowUpdateBuilder.clustering("02").add("val", "a"); //Range tombstone doesn't cover this (timestamp 3 > 2)
             notYetDeletedRowUpdateBuilder.build().applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     @Test
@@ -384,7 +387,7 @@
         rowUpdateBuilder.clustering("c").add("val", "a");
         rowUpdateBuilder.build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Collection<SSTableReader> sstablesBefore = cfs.getLiveSSTables();
 
@@ -402,7 +405,7 @@
         // Sleep one second so that the removal is indeed purgeable even with gcgrace == 0
         Thread.sleep(1000);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Collection<SSTableReader> sstablesAfter = cfs.getLiveSSTables();
         Collection<SSTableReader> toCompact = new ArrayList<SSTableReader>();
@@ -484,7 +487,7 @@
             insertRowWithKey(i + 100);
             insertRowWithKey(i + 200);
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         assertEquals(1, store.getLiveSSTables().size());
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
diff --git a/test/unit/org/apache/cassandra/db/compaction/CorruptedSSTablesCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/CorruptedSSTablesCompactionsTest.java
index 95542a1..33dfc25 100644
--- a/test/unit/org/apache/cassandra/db/compaction/CorruptedSSTablesCompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/CorruptedSSTablesCompactionsTest.java
@@ -21,7 +21,8 @@
  */
 
 
-import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
 import java.util.*;
 
 import org.junit.After;
@@ -32,6 +33,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 
@@ -43,6 +45,7 @@
 import org.apache.cassandra.db.marshal.LongType;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.*;
 
@@ -71,7 +74,7 @@
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
     {
-        long seed = System.nanoTime();
+        long seed = nanoTime();
 
         //long seed = 754271160974509L; // CASSANDRA-9530: use this seed to reproduce compaction failures if reading empty rows
         //long seed = 2080431860597L; // CASSANDRA-12359: use this seed to reproduce undetected corruptions
@@ -108,7 +111,7 @@
     public static void closeStdErr()
     {
         // These tests generate an error message per CorruptSSTableException since it goes through
-        // DebuggableThreadPoolExecutor, which will log it in afterExecute.  We could stop that by
+        // ExecutorPlus, which will log it in afterExecute.  We could stop that by
         // creating custom CompactionStrategy and CompactionTask classes, but that's kind of a
         // ridiculous amount of effort, especially since those aren't really intended to be wrapped
         // like that.
@@ -162,7 +165,7 @@
                 maxTimestampExpected = Math.max(timestamp, maxTimestampExpected);
                 inserted.add(key);
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
             CompactionsTest.assertMaxTimestamp(cfs, maxTimestampExpected);
             assertEquals(inserted.toString(), inserted.size(), Util.getAll(Util.cmd(cfs).build()).size());
         }
@@ -176,29 +179,29 @@
             if (currentSSTable + 1 > SSTABLES_TO_CORRUPT)
                 break;
 
-            RandomAccessFile raf = null;
+            FileChannel fc = null;
 
             try
             {
                 int corruptionSize = 100;
-                raf = new RandomAccessFile(sstable.getFilename(), "rw");
-                assertNotNull(raf);
-                assertTrue(raf.length() > corruptionSize);
-                long pos = random.nextInt((int)(raf.length() - corruptionSize));
-                logger.info("Corrupting sstable {} [{}] at pos {} / {}", currentSSTable, sstable.getFilename(), pos, raf.length());
-                raf.seek(pos);
+                fc = new File(sstable.getFilename()).newReadWriteChannel();
+                assertNotNull(fc);
+                assertTrue(fc.size() > corruptionSize);
+                long pos = random.nextInt((int)(fc.size() - corruptionSize));
+                logger.info("Corrupting sstable {} [{}] at pos {} / {}", currentSSTable, sstable.getFilename(), pos, fc.size());
+                fc.position(pos);
                 // We want to write something large enough that the corruption cannot get undetected
                 // (even without compression)
                 byte[] corruption = new byte[corruptionSize];
                 random.nextBytes(corruption);
-                raf.write(corruption);
+                fc.write(ByteBuffer.wrap(corruption));
                 if (ChunkCache.instance != null)
                     ChunkCache.instance.invalidateFile(sstable.getFilename());
 
             }
             finally
             {
-                FileUtils.closeQuietly(raf);
+                FileUtils.closeQuietly(fc);
             }
 
             currentSSTable++;
diff --git a/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java
index f75842d..4df210a 100644
--- a/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/DateTieredCompactionStrategyTest.java
@@ -231,9 +231,9 @@
                 .clustering("column")
                 .add("val", value).build().applyUnsafe();
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         List<SSTableReader> sstrs = new ArrayList<>(cfs.getLiveSSTables());
 
@@ -267,9 +267,9 @@
                 .clustering("column")
                 .add("val", value).build().applyUnsafe();
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Iterable<SSTableReader> filtered;
         List<SSTableReader> sstrs = new ArrayList<>(cfs.getLiveSSTables());
@@ -304,7 +304,7 @@
             .clustering("column")
             .add("val", value).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         SSTableReader expiredSSTable = cfs.getLiveSSTables().iterator().next();
         Thread.sleep(10);
 
@@ -313,7 +313,7 @@
             .clustering("column")
             .add("val", value).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(cfs.getLiveSSTables().size(), 2);
 
         Map<String, String> options = new HashMap<>();
@@ -357,7 +357,7 @@
                     .clustering("column")
                     .add("val", bigValue).build().applyUnsafe();
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         // and small ones:
         for (int r = 0; r < numSSTables / 2; r++)
@@ -366,7 +366,7 @@
             new RowUpdateBuilder(cfs.metadata(), timestamp, key.getKey())
                 .clustering("column")
                 .add("val", value).build().applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         Map<String, String> options = new HashMap<>();
         options.put(SizeTieredCompactionStrategyOptions.MIN_SSTABLE_SIZE_KEY, "1");
diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
index 88ddb0b..07a45e7 100644
--- a/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/LeveledCompactionStrategyTest.java
@@ -30,7 +30,6 @@
 import java.util.Map;
 import java.util.Random;
 import java.util.Set;
-import java.util.UUID;
 import java.util.stream.Collectors;
 
 import com.google.common.collect.Iterables;
@@ -57,20 +56,23 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.notifications.SSTableAddedNotification;
 import org.apache.cassandra.notifications.SSTableRepairStatusChanged;
-import org.apache.cassandra.repair.RepairJobDesc;
 import org.apache.cassandra.repair.ValidationManager;
+import org.apache.cassandra.repair.state.ValidationState;
+import org.apache.cassandra.schema.MockSchema;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.repair.RepairJobDesc;
 import org.apache.cassandra.repair.Validator;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.TimeUUID;
 import org.awaitility.Awaitility;
 
 import static java.util.Collections.singleton;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -122,7 +124,7 @@
      */
     @Test
     public void testGrouperLevels() throws Exception{
-        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KiB value, make it easy to have multiple files
 
         //Need entropy to prevent compression so size is predictable with compression enabled/disabled
         new Random().nextBytes(value.array());
@@ -138,7 +140,7 @@
             for (int c = 0; c < columns; c++)
                 update.newRow("column" + c).add("val", value);
             update.applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         waitForLeveling(cfs);
@@ -180,7 +182,7 @@
     {
         byte [] b = new byte[100 * 1024];
         new Random().nextBytes(b);
-        ByteBuffer value = ByteBuffer.wrap(b); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(b); // 100 KiB value, make it easy to have multiple files
 
         // Enough data to have a level 1 and 2
         int rows = 40;
@@ -193,7 +195,7 @@
             for (int c = 0; c < columns; c++)
                 update.newRow("column" + c).add("val", value);
             update.applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         waitForLeveling(cfs);
@@ -204,7 +206,7 @@
 
         Range<Token> range = new Range<>(Util.token(""), Util.token(""));
         int gcBefore = keyspace.getColumnFamilyStore(CF_STANDARDDLEVELED).gcBefore(FBUtilities.nowInSeconds());
-        UUID parentRepSession = UUID.randomUUID();
+        TimeUUID parentRepSession = nextTimeUUID();
         ActiveRepairService.instance.registerParentRepairSession(parentRepSession,
                                                                  FBUtilities.getBroadcastAddressAndPort(),
                                                                  Arrays.asList(cfs),
@@ -213,8 +215,8 @@
                                                                  ActiveRepairService.UNREPAIRED_SSTABLE,
                                                                  true,
                                                                  PreviewKind.NONE);
-        RepairJobDesc desc = new RepairJobDesc(parentRepSession, UUID.randomUUID(), KEYSPACE1, CF_STANDARDDLEVELED, Arrays.asList(range));
-        Validator validator = new Validator(desc, FBUtilities.getBroadcastAddressAndPort(), gcBefore, PreviewKind.NONE);
+        RepairJobDesc desc = new RepairJobDesc(parentRepSession, nextTimeUUID(), KEYSPACE1, CF_STANDARDDLEVELED, Arrays.asList(range));
+        Validator validator = new Validator(new ValidationState(desc, FBUtilities.getBroadcastAddressAndPort()), gcBefore, PreviewKind.NONE);
 
         ValidationManager.instance.submitValidation(cfs, validator).get();
     }
@@ -267,7 +269,7 @@
             for (int c = 0; c < columns; c++)
                 update.newRow("column" + c).add("val", value);
             update.applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         waitForLeveling(cfs);
@@ -291,7 +293,7 @@
     public void testMutateLevel() throws Exception
     {
         cfs.disableAutoCompaction();
-        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KiB value, make it easy to have multiple files
 
         // Enough data to have a level 1 and 2
         int rows = 40;
@@ -304,9 +306,9 @@
             for (int c = 0; c < columns; c++)
                 update.newRow("column" + c).add("val", value);
             update.applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         LeveledCompactionStrategy strategy = (LeveledCompactionStrategy) cfs.getCompactionStrategyManager().getStrategies().get(1).get(0);
         cfs.forceMajorCompaction();
 
@@ -332,7 +334,7 @@
     {
         byte [] b = new byte[100 * 1024];
         new Random().nextBytes(b);
-        ByteBuffer value = ByteBuffer.wrap(b); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(b); // 100 KiB value, make it easy to have multiple files
 
         // Enough data to have a level 1 and 2
         int rows = 40;
@@ -345,7 +347,7 @@
             for (int c = 0; c < columns; c++)
                 update.newRow("column" + c).add("val", value);
             update.applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         waitForLeveling(cfs);
         cfs.disableAutoCompaction();
@@ -400,7 +402,7 @@
         // Disable auto compaction so cassandra does not compact
         CompactionManager.instance.disableAutoCompaction();
 
-        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KB value, make it easy to have multiple files
+        ByteBuffer value = ByteBuffer.wrap(new byte[100 * 1024]); // 100 KiB value, make it easy to have multiple files
 
         DecoratedKey key1 = Util.dk(String.valueOf(1));
         DecoratedKey key2 = Util.dk(String.valueOf(2));
@@ -420,7 +422,7 @@
                     update.newRow("column" + c).add("val", value);
                 update.applyUnsafe();
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         // create 20 more sstables with 10 containing data for key1 and other 10 containing data for key2
@@ -430,7 +432,7 @@
                 for (int c = 0; c < columns; c++)
                     update.newRow("column" + c).add("val", value);
                 update.applyUnsafe();
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
             }
         }
 
@@ -470,7 +472,7 @@
                     update.newRow("column" + c).add("val", value);
                 update.applyUnsafe();
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         // create 20 more sstables with 10 containing data for key1 and other 10 containing data for key2
@@ -482,7 +484,7 @@
                 for (int c = 0; c < columns; c++)
                     update.newRow("column" + c).add("val", value);
                 update.applyUnsafe();
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
             }
         }
 
@@ -526,7 +528,7 @@
             for (int c = 0; c < columns; c++)
                 update.newRow("column" + c).add("val", value);
             update.applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         LeveledCompactionStrategy strategy = (LeveledCompactionStrategy) (cfs.getCompactionStrategyManager()).getStrategies().get(1).get(0);
         // get readers for level 0 sstables
@@ -768,6 +770,53 @@
         }
         return newLevels;
     }
+    @Test
+    public void testPerLevelSizeBytes() throws IOException
+    {
+        byte [] b = new byte[100];
+        new Random().nextBytes(b);
+        ByteBuffer value = ByteBuffer.wrap(b);
+        int rows = 5;
+        int columns = 5;
+
+        cfs.disableAutoCompaction();
+        for (int r = 0; r < rows; r++)
+        {
+            UpdateBuilder update = UpdateBuilder.create(cfs.metadata(), String.valueOf(r));
+            for (int c = 0; c < columns; c++)
+                update.newRow("column" + c).add("val", value);
+            update.applyUnsafe();
+        }
+        Util.flush(cfs);
+
+        SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
+        long [] levelSizes = cfs.getPerLevelSizeBytes();
+        for (int i = 0; i < levelSizes.length; i++)
+        {
+            if (i != 0)
+                assertEquals(0, levelSizes[i]);
+            else
+                assertEquals(sstable.onDiskLength(), levelSizes[i]);
+        }
+
+        assertEquals(sstable.onDiskLength(), cfs.getPerLevelSizeBytes()[0]);
+
+        LeveledCompactionStrategy strategy = (LeveledCompactionStrategy) ( cfs.getCompactionStrategyManager()).getStrategies().get(1).get(0);
+        strategy.manifest.remove(sstable);
+        sstable.descriptor.getMetadataSerializer().mutateLevel(sstable.descriptor, 2);
+        sstable.reloadSSTableMetadata();
+        strategy.manifest.addSSTables(Collections.singleton(sstable));
+
+        levelSizes = cfs.getPerLevelSizeBytes();
+        for (int i = 0; i < levelSizes.length; i++)
+        {
+            if (i != 2)
+                assertEquals(0, levelSizes[i]);
+            else
+                assertEquals(sstable.onDiskLength(), levelSizes[i]);
+        }
+
+    }
 
     /**
      * brute-force checks if the new sstables can be added to the correct level in manifest
diff --git a/test/unit/org/apache/cassandra/db/compaction/LeveledGenerationsTest.java b/test/unit/org/apache/cassandra/db/compaction/LeveledGenerationsTest.java
index 0e20d63..d47ffd2 100644
--- a/test/unit/org/apache/cassandra/db/compaction/LeveledGenerationsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/LeveledGenerationsTest.java
@@ -37,7 +37,7 @@
 import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
-import static junit.framework.Assert.assertFalse;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -194,6 +194,6 @@
 
     private void print(SSTableReader sstable)
     {
-        System.out.println(String.format("%d %s %s %d", sstable.descriptor.generation, sstable.first, sstable.last, sstable.getSSTableLevel()));
+        System.out.println(String.format("%d %s %s %d", sstable.descriptor.id, sstable.first, sstable.last, sstable.getSSTableLevel()));
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java b/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java
index a5388ca..4253731 100644
--- a/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/NeverPurgeTest.java
@@ -23,6 +23,7 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
@@ -74,13 +75,13 @@
             {
                 execute("INSERT INTO %s (a, b, c) VALUES (" + j + ", 2, '3')");
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         execute("UPDATE %s SET c = null WHERE a=1 AND b=2");
         execute("DELETE FROM %s WHERE a=2 AND b=2");
         execute("DELETE FROM %s WHERE a=3");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.enableAutoCompaction();
         while (cfs.getLiveSSTables().size() > 1 || !cfs.getTracker().getCompacting().isEmpty())
             Thread.sleep(100);
@@ -94,7 +95,7 @@
         execute("INSERT INTO %s (a, b, c) VALUES (1, 2, '3')");
         execute(deletionStatement);
         Thread.sleep(1000);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.forceMajorCompaction();
         verifyContainsTombstones(cfs.getLiveSSTables(), 1);
     }
diff --git a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java
index 0c469dc..9bb2abd 100644
--- a/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/OneCompactionTest.java
@@ -71,7 +71,7 @@
                 .applyUnsafe();
 
             inserted.add(key);
-            store.forceBlockingFlush();
+            Util.flush(store);
             assertEquals(inserted.size(), Util.getAll(Util.cmd(store).build()).size());
         }
         CompactionManager.instance.performMaximal(store, false);
diff --git a/test/unit/org/apache/cassandra/db/compaction/PartialCompactionsTest.java b/test/unit/org/apache/cassandra/db/compaction/PartialCompactionsTest.java
index 9cb3872..b922ca80 100644
--- a/test/unit/org/apache/cassandra/db/compaction/PartialCompactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/PartialCompactionsTest.java
@@ -144,7 +144,7 @@
             .build()
             .applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
     }
 
     private static void createTombstonesSSTable(ColumnFamilyStore cfs, int firstKey, int endKey)
@@ -153,7 +153,7 @@
         {
             RowUpdateBuilder.deleteRow(cfs.metadata(), 1, "key1", String.valueOf(i)).applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS);
     }
 
     private static class LimitableDataDirectory extends Directories.DataDirectory
@@ -188,7 +188,7 @@
             Keyspace keyspace = Keyspace.open(ks);
             ColumnFamilyStore store = keyspace.getColumnFamilyStore(cf);
             TableMetadataRef metadata = store.metadata;
-            keyspace.dropCf(metadata.id);
+            keyspace.dropCf(metadata.id, true);
             ColumnFamilyStore cfs = ColumnFamilyStore.createColumnFamilyStore(keyspace, cf, metadata, wrapDirectoriesOf(store), false, false, true);
             keyspace.initCfCustom(cfs);
         }
diff --git a/test/unit/org/apache/cassandra/db/compaction/PendingRepairManagerTest.java b/test/unit/org/apache/cassandra/db/compaction/PendingRepairManagerTest.java
index 9f4cf8d..d2b3693 100644
--- a/test/unit/org/apache/cassandra/db/compaction/PendingRepairManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/PendingRepairManagerTest.java
@@ -20,7 +20,6 @@
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.UUID;
 
 import com.google.common.collect.Lists;
 import org.junit.Assert;
@@ -30,7 +29,9 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.repair.consistent.LocalSessionAccessor;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class PendingRepairManagerTest extends AbstractPendingRepairTest
 {
@@ -42,7 +43,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -60,7 +61,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -79,7 +80,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -93,7 +94,7 @@
     @Test
     public void needsCleanupNoSession()
     {
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
         PendingRepairManager prm = new PendingRepairManager(cfs, null, false);
         Assert.assertTrue(prm.canCleanup(fakeID));
     }
@@ -103,7 +104,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -119,7 +120,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -137,7 +138,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -180,7 +181,7 @@
     public void getNextBackgroundTaskAllCleanup() throws Exception
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
 
         SSTableReader sstable = makeSSTable(true);
@@ -199,7 +200,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairID, false);
@@ -223,7 +224,7 @@
     public void userDefinedTaskTest()
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
-        UUID repairId = registerSession(cfs, true, true);
+        TimeUUID repairId = registerSession(cfs, true, true);
         SSTableReader sstable = makeSSTable(true);
         mutateRepaired(sstable, repairId, false);
         prm.addSSTable(sstable);
@@ -238,8 +239,8 @@
     public void mixedPendingSessionsTest()
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
-        UUID repairId = registerSession(cfs, true, true);
-        UUID repairId2 = registerSession(cfs, true, true);
+        TimeUUID repairId = registerSession(cfs, true, true);
+        TimeUUID repairId2 = registerSession(cfs, true, true);
         SSTableReader sstable = makeSSTable(true);
         SSTableReader sstable2 = makeSSTable(true);
 
@@ -282,7 +283,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
 
-        UUID repairID = registerSession(cfs, true, true);
+        TimeUUID repairID = registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(repairID, COORDINATOR, PARTICIPANTS);
 
         Assert.assertFalse(prm.hasDataForSession(repairID));
@@ -297,7 +298,7 @@
     {
         PendingRepairManager prm = csm.getPendingRepairManagers().get(0);
         SSTableReader sstable = makeSSTable(false);
-        UUID id = UUID.randomUUID();
+        TimeUUID id = nextTimeUUID();
         mutateRepaired(sstable, id, false);
         prm.getOrCreate(sstable);
         cfs.truncateBlocking();
diff --git a/test/unit/org/apache/cassandra/db/compaction/SingleSSTableLCSTaskTest.java b/test/unit/org/apache/cassandra/db/compaction/SingleSSTableLCSTaskTest.java
index 61cf302..bb1d1f0 100644
--- a/test/unit/org/apache/cassandra/db/compaction/SingleSSTableLCSTaskTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/SingleSSTableLCSTaskTest.java
@@ -18,18 +18,21 @@
 
 package org.apache.cassandra.db.compaction;
 
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
 import java.util.Random;
 
 import org.apache.commons.lang3.StringUtils;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.utils.ByteBufferUtil;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
@@ -42,7 +45,7 @@
         createTable("create table %s (id int primary key, t text) with compaction = {'class':'LeveledCompactionStrategy','single_sstable_uplevel':true}");
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
         execute("insert into %s (id, t) values (1, 'meep')");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
 
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(sstable, OperationType.COMPACTION))
@@ -95,7 +98,7 @@
                 execute("insert into %s (id, id2, t) values (?, ?, ?)", i, j, value);
             }
             if (i % 100 == 0)
-                cfs.forceBlockingFlush();
+                Util.flush(cfs);
         }
         // now we have a bunch of data in L0, first compaction will be a normal one, containing all sstables:
         LeveledCompactionStrategy lcs = (LeveledCompactionStrategy) cfs.getCompactionStrategyManager().getUnrepairedUnsafe().first();
@@ -123,14 +126,15 @@
         createTable("create table %s (id int primary key, t text) with compaction = {'class':'LeveledCompactionStrategy','single_sstable_uplevel':true}");
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
         execute("insert into %s (id, t) values (1, 'meep')");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
 
         String filenameToCorrupt = sstable.descriptor.filenameFor(Component.STATS);
-        RandomAccessFile file = new RandomAccessFile(filenameToCorrupt, "rw");
-        file.seek(0);
-        file.writeBytes(StringUtils.repeat('z', 2));
-        file.close();
+        try(FileChannel fc = new File(filenameToCorrupt).newReadWriteChannel())
+        {
+            fc.position(0);
+            fc.write(ByteBufferUtil.bytes(StringUtils.repeat('z', 2)));
+        }
         boolean gotException = false;
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(sstable, OperationType.COMPACTION))
         {
diff --git a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
index 00c4a86..fc98a9c 100644
--- a/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategyTest.java
@@ -28,6 +28,7 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.RowUpdateBuilder;
@@ -165,9 +166,9 @@
             new RowUpdateBuilder(cfs.metadata(), 0, key)
                 .clustering("column").add("val", value)
                 .build().applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         List<SSTableReader> sstrs = new ArrayList<>(cfs.getLiveSSTables());
         Pair<List<SSTableReader>, Double> bucket;
diff --git a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java
index c20316a..0e3fb76 100644
--- a/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/TTLExpiryTest.java
@@ -29,6 +29,8 @@
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.Util;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.ColumnFilter;
@@ -38,9 +40,7 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.io.sstable.ISSTableScanner;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.tools.SSTableExpiredBlockers;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
@@ -80,7 +80,7 @@
     {
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1");
         cfs.disableAutoCompaction();
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(0).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(0).build());
         String key = "ttl";
         new RowUpdateBuilder(cfs.metadata(), 1L, 1, key)
                     .add("col1", ByteBufferUtil.EMPTY_BYTE_BUFFER)
@@ -91,7 +91,7 @@
                     .add("col2", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                     .build()
                     .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         new RowUpdateBuilder(cfs.metadata(), 2L, 1, key)
                     .add("col1", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                     .build()
@@ -102,7 +102,7 @@
                     .build()
                     .applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), 4L, 1, key)
                     .add("col1", ByteBufferUtil.EMPTY_BYTE_BUFFER)
@@ -114,7 +114,7 @@
                     .build()
                     .applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
 
         new RowUpdateBuilder(cfs.metadata(), 6L, 3, key)
@@ -127,7 +127,7 @@
                     .build()
                     .applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         Set<SSTableReader> sstables = Sets.newHashSet(cfs.getLiveSSTables());
         int now = (int)(System.currentTimeMillis() / 1000);
@@ -161,7 +161,7 @@
         cfs.truncateBlocking();
         cfs.disableAutoCompaction();
         // To reproduce #10944, we need our gcBefore to be equal to the locaDeletionTime. A gcGrace of 1 will (almost always) give us that.
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(force10944Bug ? 1 : 0).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(force10944Bug ? 1 : 0).build());
         long timestamp = System.currentTimeMillis();
         String key = "ttl";
         new RowUpdateBuilder(cfs.metadata(), timestamp, 1, key)
@@ -170,7 +170,7 @@
                         .build()
                         .applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         new RowUpdateBuilder(cfs.metadata(), timestamp, 1, key)
             .add("col2", ByteBufferUtil.EMPTY_BYTE_BUFFER)
@@ -180,7 +180,7 @@
             .applyUnsafe();
 
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         // To reproduce #10944, we need to avoid the optimization that get rid of full sstable because everything
         // is known to be gcAble, so keep some data non-expiring in that case.
         new RowUpdateBuilder(cfs.metadata(), timestamp, force10944Bug ? 0 : 1, key)
@@ -189,14 +189,14 @@
                     .applyUnsafe();
 
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         new RowUpdateBuilder(cfs.metadata(), timestamp, 1, key)
                             .add("col311", ByteBufferUtil.EMPTY_BYTE_BUFFER)
                             .build()
                             .applyUnsafe();
 
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Thread.sleep(2000); // wait for ttl to expire
         assertEquals(4, cfs.getLiveSSTables().size());
         cfs.enableAutoCompaction(true);
@@ -209,7 +209,7 @@
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1");
         cfs.truncateBlocking();
         cfs.disableAutoCompaction();
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(0).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(0).build());
         long timestamp = System.currentTimeMillis();
         String key = "ttl";
         new RowUpdateBuilder(cfs.metadata(), timestamp, 1, key)
@@ -218,32 +218,32 @@
             .build()
             .applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         new RowUpdateBuilder(cfs.metadata(), timestamp, 1, key)
             .add("col2", ByteBufferUtil.EMPTY_BYTE_BUFFER)
             .build()
             .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         new RowUpdateBuilder(cfs.metadata(), timestamp, 1, key)
             .add("col3", ByteBufferUtil.EMPTY_BYTE_BUFFER)
             .build()
             .applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         String noTTLKey = "nottl";
         new RowUpdateBuilder(cfs.metadata(), timestamp, noTTLKey)
             .add("col311", ByteBufferUtil.EMPTY_BYTE_BUFFER)
             .build()
             .applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Thread.sleep(2000); // wait for ttl to expire
         assertEquals(4, cfs.getLiveSSTables().size());
         cfs.enableAutoCompaction(true);
         assertEquals(1, cfs.getLiveSSTables().size());
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
-        ISSTableScanner scanner = sstable.getScanner(ColumnFilter.all(cfs.metadata()),
-                                                     DataRange.allData(cfs.getPartitioner()),
-                                                     SSTableReadsListener.NOOP_LISTENER);
+        UnfilteredPartitionIterator scanner = sstable.partitionIterator(ColumnFilter.all(cfs.metadata()),
+                                                                        DataRange.allData(cfs.getPartitioner()),
+                                                                        SSTableReadsListener.NOOP_LISTENER);
         assertTrue(scanner.hasNext());
         while(scanner.hasNext())
         {
@@ -259,7 +259,7 @@
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore("Standard1");
         cfs.truncateBlocking();
         cfs.disableAutoCompaction();
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(0).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().gcGraceSeconds(0).build());
 
         new RowUpdateBuilder(cfs.metadata(), System.currentTimeMillis(), "test")
                 .noRowMarker()
@@ -267,7 +267,7 @@
                 .build()
                 .applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         SSTableReader blockingSSTable = cfs.getSSTables(SSTableSet.LIVE).iterator().next();
         for (int i = 0; i < 10; i++)
         {
@@ -276,7 +276,7 @@
                             .delete("col1")
                             .build()
                             .applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         Multimap<SSTableReader, SSTableReader> blockers = SSTableExpiredBlockers.checkForExpiredSSTableBlockers(cfs.getSSTables(SSTableSet.LIVE), (int) (System.currentTimeMillis() / 1000) + 100);
         assertEquals(1, blockers.keySet().size());
diff --git a/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java b/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java
index 88c6308..de60286 100644
--- a/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/TimeWindowCompactionStrategyTest.java
@@ -36,7 +36,6 @@
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.fail;
 
 import org.apache.cassandra.SchemaLoader;
@@ -184,7 +183,7 @@
                 .clustering("column")
                 .add("val", value).build().applyUnsafe();
 
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         // Decrement the timestamp to simulate a timestamp in the past hour
         for (int r = 3; r < 5; r++)
@@ -194,10 +193,10 @@
             new RowUpdateBuilder(cfs.metadata(), r, key.getKey())
                 .clustering("column")
                 .add("val", value).build().applyUnsafe();
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         HashMultimap<Long, SSTableReader> buckets = HashMultimap.create();
         List<SSTableReader> sstrs = new ArrayList<>(cfs.getLiveSSTables());
@@ -240,7 +239,7 @@
                     .clustering("column")
                     .add("val", value).build().applyUnsafe();
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         // Reset the buckets, overfill it now
@@ -275,7 +274,7 @@
             .clustering("column")
             .add("val", value).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         SSTableReader expiredSSTable = cfs.getLiveSSTables().iterator().next();
         Thread.sleep(10);
 
@@ -285,7 +284,7 @@
             .clustering("column")
             .add("val", value).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(cfs.getLiveSSTables().size(), 2);
 
         Map<String, String> options = new HashMap<>();
@@ -327,7 +326,7 @@
             .clustering("column")
             .add("val", value).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         SSTableReader expiredSSTable = cfs.getLiveSSTables().iterator().next();
         Thread.sleep(10);
 
@@ -340,7 +339,7 @@
             .clustering("column")
             .add("val", value).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(cfs.getLiveSSTables().size(), 2);
 
         Map<String, String> options = new HashMap<>();
diff --git a/test/unit/org/apache/cassandra/db/compaction/ValidationExecutorTest.java b/test/unit/org/apache/cassandra/db/compaction/ValidationExecutorTest.java
index aef4bb6..a5f2072 100644
--- a/test/unit/org/apache/cassandra/db/compaction/ValidationExecutorTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/ValidationExecutorTest.java
@@ -23,7 +23,6 @@
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.concurrent.locks.Condition;
 
 import com.google.common.util.concurrent.Uninterruptibles;
 
@@ -33,7 +32,7 @@
 
 import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -65,7 +64,7 @@
     @Test
     public void testQueueOnValidationSubmission() throws InterruptedException
     {
-        Condition taskBlocked = new SimpleCondition();
+        CountDownLatch taskBlocked = new CountDownLatch(1);
         AtomicInteger threadsAvailable = new AtomicInteger(DatabaseDescriptor.getConcurrentValidations());
         CountDownLatch taskComplete = new CountDownLatch(5);
         validationExecutor = new CompactionManager.ValidationExecutor();
@@ -85,7 +84,7 @@
         Util.spinAssertEquals(2, () -> validationExecutor.getActiveTaskCount(), 1);
         assertEquals(3, validationExecutor.getPendingTaskCount());
 
-        taskBlocked.signalAll();
+        taskBlocked.countDown();
         taskComplete.await(10, TimeUnit.SECONDS);
         validationExecutor.shutdownNow();
     }
@@ -110,10 +109,10 @@
 
     private static class Task implements Runnable
     {
-        private final Condition blocked;
+        private final CountDownLatch blocked;
         private final CountDownLatch complete;
 
-        Task(Condition blocked, CountDownLatch complete)
+        Task(CountDownLatch blocked, CountDownLatch complete)
         {
             this.blocked = blocked;
             this.complete = complete;
@@ -121,7 +120,7 @@
 
         public void run()
         {
-            Uninterruptibles.awaitUninterruptibly(blocked, 10, TimeUnit.SECONDS);
+            Uninterruptibles.awaitUninterruptibly(blocked);
             complete.countDown();
         }
     }
diff --git a/test/unit/org/apache/cassandra/db/compaction/writers/CompactionAwareWriterTest.java b/test/unit/org/apache/cassandra/db/compaction/writers/CompactionAwareWriterTest.java
index 5e127dd..a641be1 100644
--- a/test/unit/org/apache/cassandra/db/compaction/writers/CompactionAwareWriterTest.java
+++ b/test/unit/org/apache/cassandra/db/compaction/writers/CompactionAwareWriterTest.java
@@ -17,13 +17,13 @@
  */
 package org.apache.cassandra.db.compaction.writers;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.*;
 
 import com.google.common.primitives.Longs;
 import org.junit.*;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.*;
@@ -33,10 +33,12 @@
 import org.apache.cassandra.db.compaction.OperationType;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
 
+import static org.apache.cassandra.db.compaction.OperationType.COMPACTION;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 
 public class CompactionAwareWriterTest extends CQLTester
@@ -208,7 +210,7 @@
         int nowInSec = FBUtilities.nowInSeconds();
         try (AbstractCompactionStrategy.ScannerList scanners = cfs.getCompactionStrategyManager().getScanners(txn.originals());
              CompactionController controller = new CompactionController(cfs, txn.originals(), cfs.gcBefore(nowInSec));
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, scanners.scanners, controller, nowInSec, UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, scanners.scanners, controller, nowInSec, nextTimeUUID()))
         {
             while (ci.hasNext())
             {
@@ -231,7 +233,7 @@
                 execute(String.format("INSERT INTO %s.%s(k, t, v) VALUES (?, ?, ?)", KEYSPACE, TABLE), i, j, b);
 
         ColumnFamilyStore cfs = getColumnFamilyStore();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         if (cfs.getLiveSSTables().size() > 1)
         {
             // we want just one big sstable to avoid doing actual compaction in compact() above
diff --git a/test/unit/org/apache/cassandra/db/filter/ColumnFilterTest.java b/test/unit/org/apache/cassandra/db/filter/ColumnFilterTest.java
index 86b81e5..b23aa07 100644
--- a/test/unit/org/apache/cassandra/db/filter/ColumnFilterTest.java
+++ b/test/unit/org/apache/cassandra/db/filter/ColumnFilterTest.java
@@ -92,8 +92,12 @@
     @BeforeClass
     public static void beforeClass()
     {
+        // Gossiper touches StorageService which touches StreamManager which requires configs be setup
+        DatabaseDescriptor.daemonInitialization();
         DatabaseDescriptor.setSeedProvider(Arrays::asList);
         DatabaseDescriptor.setEndpointSnitch(new SimpleSnitch());
+        DatabaseDescriptor.setDefaultFailureDetector();
+        DatabaseDescriptor.setPartitionerUnsafe(new Murmur3Partitioner());
         Gossiper.instance.start(0);
     }
 
diff --git a/test/unit/org/apache/cassandra/db/filter/SliceTest.java b/test/unit/org/apache/cassandra/db/filter/SliceTest.java
index 77c0ec2..c83880c 100644
--- a/test/unit/org/apache/cassandra/db/filter/SliceTest.java
+++ b/test/unit/org/apache/cassandra/db/filter/SliceTest.java
@@ -21,7 +21,6 @@
 
 import java.nio.ByteBuffer;
 import java.util.*;
-import java.util.List;
 
 import org.apache.cassandra.db.*;
 import org.junit.Test;
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailAllowFilteringTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailAllowFilteringTest.java
new file mode 100644
index 0000000..c46498c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailAllowFilteringTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.guardrails;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.SchemaKeyspaceTables;
+
+public class GuardrailAllowFilteringTest extends GuardrailTester
+{
+    private boolean enableState;
+
+    @Before
+    public void setupTest()
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, a int, b int)");
+        enableState = getGuardrial();
+    }
+
+    @After
+    public void teardownTest()
+    {
+        setGuardrail(enableState);
+    }
+
+    private void setGuardrail(boolean allowFilteringEnabled)
+    {
+        guardrails().setAllowFilteringEnabled(allowFilteringEnabled);
+    }
+
+    private boolean getGuardrial()
+    {
+        return guardrails().getAllowFilteringEnabled();
+    }
+
+    @Test
+    public void testAllowFilteringDisabled() throws Throwable
+    {
+        setGuardrail(false);
+        assertFails("SELECT * FROM %s WHERE a = 5 ALLOW FILTERING", "Querying with ALLOW FILTERING is not allowed");
+    }
+
+    @Test
+    public void testAllowFilteringDisabedNotUsed() throws Throwable
+    {
+        setGuardrail(false);
+        execute("INSERT INTO %s (k, a, b) VALUES (1, 1, 1)");
+        assertValid("SELECT * FROM %s");
+    }
+
+    @Test
+    public void testAllowFilteringEnabled() throws Throwable
+    {
+        setGuardrail(true);
+        execute("INSERT INTO %s (k, a, b) VALUES (1, 1, 1)");
+        assertValid("SELECT * FROM %s WHERE a = 5 ALLOW FILTERING");
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        setGuardrail(false);
+        testExcludedUsers(() -> "SELECT * FROM %s WHERE a = 5 ALLOW FILTERING");
+    }
+
+    @Test
+    public void testSystemTable() throws Throwable
+    {
+        setGuardrail(false);
+        assertValid(String.format("SELECT * FROM %s.%s WHERE table_name = '%s' ALLOW FILTERING",
+                                  SchemaConstants.SCHEMA_KEYSPACE_NAME,
+                                  SchemaKeyspaceTables.TABLES,
+                                  currentTable()));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailAllowUncompressedTablesTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailAllowUncompressedTablesTest.java
new file mode 100644
index 0000000..27f13f1
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailAllowUncompressedTablesTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+
+public class GuardrailAllowUncompressedTablesTest extends GuardrailTester
+{
+    private void setGuardrail(boolean enabled)
+    {
+        guardrails().setUncompressedTablesEnabled(enabled);
+    }
+
+    /**
+     * If the guardrail has been set, creating tables with compression disabled should work
+     */
+    @Test
+    public void createSuccess()
+    {
+        setGuardrail(true);
+        String table = createTableName();
+        schemaChange(String.format("CREATE TABLE %s.%s (k int primary key, v int) WITH compression={'sstable_compression':''}", KEYSPACE, table));
+        TableMetadata tmd = Schema.instance.getTableMetadata(KEYSPACE, table);
+        Assert.assertFalse(tmd.params.compression.isEnabled());
+    }
+
+    /**
+     * If the guardrail is false, creating tables with compression disabled should fail
+     */
+    @Test
+    public void createFailure() throws Throwable
+    {
+        setGuardrail(false);
+        String table = createTableName();
+        assertFails(String.format("CREATE TABLE %s.%s (k int primary key, v int) WITH compression={'sstable_compression':''}", KEYSPACE, table), "Uncompressed table is not allowed");
+    }
+
+    @Test
+    public void alterSuccess()
+    {
+        setGuardrail(true);
+        String table = createTableName();
+        schemaChange(String.format("CREATE TABLE %s.%s (k int primary key, v int)", KEYSPACE, table));
+        schemaChange(String.format("ALTER TABLE %s.%s WITH compression = {'sstable_compression': ''}", KEYSPACE, table));
+        TableMetadata tmd = Schema.instance.getTableMetadata(KEYSPACE, table);
+        Assert.assertFalse(tmd.params.compression.isEnabled());
+    }
+
+    @Test
+    public void alterFailure() throws Throwable
+    {
+        setGuardrail(false);
+        String table = createTableName();
+        schemaChange(String.format("CREATE TABLE %s.%s (k int primary key, v int)", KEYSPACE, table));
+        assertFails(String.format("ALTER TABLE %s.%s WITH compression = {'sstable_compression': ''}", KEYSPACE, table), "Uncompressed table is not allowed");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailCollectionSizeTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailCollectionSizeTest.java
new file mode 100644
index 0000000..1483e81
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailCollectionSizeTest.java
@@ -0,0 +1,265 @@
+/*
+ * 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.guardrails;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Collections;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
+import org.junit.After;
+import org.junit.Test;
+
+import org.apache.cassandra.db.marshal.BytesType;
+import org.apache.cassandra.db.marshal.ListType;
+import org.apache.cassandra.db.marshal.MapType;
+import org.apache.cassandra.db.marshal.SetType;
+
+import static java.nio.ByteBuffer.allocate;
+
+/**
+ * Tests the guardrail for the size of collections, {@link Guardrails#collectionSize}.
+ * <p>
+ * This test doesn't include the activation of the guardrail during sstable writes, these cases are covered by the dtest
+ * {@link org.apache.cassandra.distributed.test.guardrails.GuardrailCollectionSizeOnSSTableWriteTest}.
+ */
+public class GuardrailCollectionSizeTest extends ThresholdTester
+{
+    private static final int WARN_THRESHOLD = 1024; // bytes
+    private static final int FAIL_THRESHOLD = WARN_THRESHOLD * 4; // bytes
+
+    public GuardrailCollectionSizeTest()
+    {
+        super(WARN_THRESHOLD + "B",
+              FAIL_THRESHOLD + "B",
+              Guardrails.collectionSize,
+              Guardrails::setCollectionSizeThreshold,
+              Guardrails::getCollectionSizeWarnThreshold,
+              Guardrails::getCollectionSizeFailThreshold);
+    }
+
+    @After
+    public void after()
+    {
+        // immediately drop the created table so its async cleanup doesn't interfere with the next tests
+        if (currentTable() != null)
+            dropTable("DROP TABLE %s");
+    }
+
+    @Test
+    public void testSetSize() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v set<blob>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", set());
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", set(allocate(1)));
+        assertValid("INSERT INTO %s (k, v) VALUES (3, ?)", set(allocate(WARN_THRESHOLD / 2)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (4, ?)", set(allocate(WARN_THRESHOLD)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", set(allocate(WARN_THRESHOLD / 4), allocate(WARN_THRESHOLD * 3 / 4)));
+
+        assertFails("INSERT INTO %s (k, v) VALUES (6, ?)", set(allocate(FAIL_THRESHOLD)));
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", set(allocate(FAIL_THRESHOLD / 4), allocate(FAIL_THRESHOLD * 3 / 4)));
+    }
+
+    @Test
+    public void testSetSizeFrozen() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v frozen<set<blob>>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", set());
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", set(allocate(1)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (4, ?)", set(allocate(WARN_THRESHOLD)));
+        assertFails("INSERT INTO %s (k, v) VALUES (5, ?)", set(allocate(FAIL_THRESHOLD)));
+    }
+
+    @Test
+    public void testSetSizeWithUpdates() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v set<blob>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, ?)", set(allocate(1)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 0", set(allocate(1)));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", set(allocate(WARN_THRESHOLD / 4)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 1", set(allocate(WARN_THRESHOLD * 3 / 4)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (2, ?)", set(allocate(FAIL_THRESHOLD / 4)));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 2", set(allocate(FAIL_THRESHOLD * 3 / 4)));
+    }
+
+    @Test
+    public void testListSize() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v list<blob>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", list());
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", list(allocate(1)));
+        assertValid("INSERT INTO %s (k, v) VALUES (3, ?)", list(allocate(WARN_THRESHOLD / 2)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (4, ?)", list(allocate(WARN_THRESHOLD)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", list(allocate(WARN_THRESHOLD / 2), allocate(WARN_THRESHOLD / 2)));
+
+        assertFails("INSERT INTO %s (k, v) VALUES (6, ?)", list(allocate(FAIL_THRESHOLD)));
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", list(allocate(FAIL_THRESHOLD / 2), allocate(FAIL_THRESHOLD / 2)));
+    }
+
+    @Test
+    public void testListSizeFrozen() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v frozen<list<blob>>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", list());
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", list(allocate(1)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (4, ?)", list(allocate(WARN_THRESHOLD)));
+        assertFails("INSERT INTO %s (k, v) VALUES (5, ?)", list(allocate(FAIL_THRESHOLD)));
+    }
+
+    @Test
+    public void testListSizeWithUpdates() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v list<blob>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, ?)", list(allocate(1)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 0", list(allocate(1)));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", list(allocate(WARN_THRESHOLD / 2)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 1", list(allocate(WARN_THRESHOLD / 2)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (2, ?)", list(allocate(FAIL_THRESHOLD / 2)));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 2", list(allocate(FAIL_THRESHOLD / 2)));
+    }
+
+    @Test
+    public void testMapSize() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v map<blob, blob>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", map());
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", map(allocate(1), allocate(1)));
+        assertValid("INSERT INTO %s (k, v) VALUES (3, ?)", map(allocate(1), allocate(WARN_THRESHOLD / 2)));
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", map(allocate(WARN_THRESHOLD / 2), allocate(1)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", map(allocate(WARN_THRESHOLD), allocate(1)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", map(allocate(1), allocate(WARN_THRESHOLD)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (7, ?)", map(allocate(WARN_THRESHOLD), allocate(WARN_THRESHOLD)));
+
+        assertFails("INSERT INTO %s (k, v) VALUES (8, ?)", map(allocate(FAIL_THRESHOLD), allocate(1)));
+        assertFails("INSERT INTO %s (k, v) VALUES (9, ?)", map(allocate(1), allocate(FAIL_THRESHOLD)));
+        assertFails("INSERT INTO %s (k, v) VALUES (10, ?)", map(allocate(FAIL_THRESHOLD), allocate(FAIL_THRESHOLD)));
+    }
+
+    @Test
+    public void testMapSizeFrozen() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v frozen<map<blob, blob>>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", map());
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", map(allocate(1), allocate(1)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (4, ?)", map(allocate(1), allocate(WARN_THRESHOLD)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", map(allocate(WARN_THRESHOLD), allocate(1)));
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", map(allocate(WARN_THRESHOLD), allocate(WARN_THRESHOLD)));
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", map(allocate(1), allocate(FAIL_THRESHOLD)));
+        assertFails("INSERT INTO %s (k, v) VALUES (8, ?)", map(allocate(FAIL_THRESHOLD), allocate(1)));
+        assertFails("INSERT INTO %s (k, v) VALUES (9, ?)", map(allocate(FAIL_THRESHOLD), allocate(FAIL_THRESHOLD)));
+    }
+
+    @Test
+    public void testMapSizeWithUpdates() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v map<blob, blob>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, ?)", map(allocate(1), allocate(1)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 0", map(allocate(1), allocate(1)));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", map(allocate(1), allocate(WARN_THRESHOLD / 2)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 1", map(allocate(2), allocate(WARN_THRESHOLD / 2)));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", map(allocate(WARN_THRESHOLD / 4), allocate(1)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 2", map(allocate(WARN_THRESHOLD * 3 / 4), allocate(1)));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (3, ?)", map(allocate(WARN_THRESHOLD / 4), allocate(WARN_THRESHOLD / 4)));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 3", map(allocate(WARN_THRESHOLD / 4 + 1), allocate(WARN_THRESHOLD / 4)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (4, ?)", map(allocate(1), allocate(FAIL_THRESHOLD / 2)));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 4", map(allocate(2), allocate(FAIL_THRESHOLD / 2)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", map(allocate(FAIL_THRESHOLD / 4), allocate(1)));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 5", map(allocate(FAIL_THRESHOLD * 3 / 4), allocate(1)));
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", map(allocate(FAIL_THRESHOLD / 4), allocate(FAIL_THRESHOLD / 4)));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 6", map(allocate(FAIL_THRESHOLD / 4 + 1), allocate(FAIL_THRESHOLD / 4)));
+    }
+
+    @Override
+    protected String createTable(String query)
+    {
+        String table = super.createTable(query);
+        disableCompaction();
+        return table;
+    }
+
+    private void assertValid(String query, ByteBuffer... values) throws Throwable
+    {
+        assertValid(execute(query, values));
+    }
+
+    private void assertWarns(String query, ByteBuffer... values) throws Throwable
+    {
+        assertWarns(execute(query, values), "Detected collection v");
+    }
+
+    private void assertFails(String query, ByteBuffer... values) throws Throwable
+    {
+        assertFails(execute(query, values), "Detected collection v");
+    }
+
+    private CheckedFunction execute(String query, ByteBuffer... values)
+    {
+        return () -> execute(userClientState, query, Arrays.asList(values));
+    }
+
+    private static ByteBuffer set(ByteBuffer... values)
+    {
+        return SetType.getInstance(BytesType.instance, true).decompose(ImmutableSet.copyOf(values));
+    }
+
+    private static ByteBuffer list(ByteBuffer... values)
+    {
+        return ListType.getInstance(BytesType.instance, true).decompose(ImmutableList.copyOf(values));
+    }
+
+    private ByteBuffer map()
+    {
+        return MapType.getInstance(BytesType.instance, BytesType.instance, true).decompose(Collections.emptyMap());
+    }
+
+    private ByteBuffer map(ByteBuffer key, ByteBuffer value)
+    {
+        return MapType.getInstance(BytesType.instance, BytesType.instance, true).decompose(ImmutableMap.of(key, value));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailColumnsPerTableTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailColumnsPerTableTest.java
new file mode 100644
index 0000000..0c47335
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailColumnsPerTableTest.java
@@ -0,0 +1,190 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Test;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for the number of columns in a table, {@link Guardrails#columnsPerTable}.
+ */
+public class GuardrailColumnsPerTableTest extends ThresholdTester
+{
+    private static final int COLUMNS_PER_TABLE_WARN_THRESHOLD = 2;
+    private static final int COLUMNS_PER_TABLE_FAIL_THRESHOLD = 4;
+
+    public GuardrailColumnsPerTableTest()
+    {
+        super(COLUMNS_PER_TABLE_WARN_THRESHOLD,
+              COLUMNS_PER_TABLE_FAIL_THRESHOLD,
+              Guardrails.columnsPerTable,
+              Guardrails::setColumnsPerTableThreshold,
+              Guardrails::getColumnsPerTableWarnThreshold,
+              Guardrails::getColumnsPerTableFailThreshold);
+    }
+
+    @Override
+    protected long currentValue()
+    {
+        return getCurrentColumnFamilyStore().metadata().columns().size();
+    }
+
+    @Test
+    public void testCreateTable() throws Throwable
+    {
+        // partition key on skinny table
+        assertCreateTableValid("CREATE TABLE %s (k1 int, v int, PRIMARY KEY((k1)))");
+        assertCreateTableWarns(3, "CREATE TABLE %s (k1 int, k2 int, v int, PRIMARY KEY((k1, k2)))");
+        assertCreateTableWarns(4, "CREATE TABLE %s (k1 int, k2 int, k3 int, v int, PRIMARY KEY((k1, k2, k3)))");
+        assertCreateTableFails(5, "CREATE TABLE %s (k1 int, k2 int, k3 int, k4 int, v int, PRIMARY KEY((k1, k2, k3, k4)))");
+        assertCreateTableFails(6, "CREATE TABLE %s (k1 int, k2 int, k3 int, k4 int, k5 int, v int, PRIMARY KEY((k1, k2, k3, k4, k5)))");
+
+        // partition key on wide table
+        assertCreateTableWarns(3, "CREATE TABLE %s (k1 int, c int, v int, PRIMARY KEY(k1, c))");
+        assertCreateTableWarns(4, "CREATE TABLE %s (k1 int, k2 int, c int, v int, PRIMARY KEY((k1, k2), c))");
+        assertCreateTableFails(5, "CREATE TABLE %s (k1 int, k2 int, k3 int, c int, v int, PRIMARY KEY((k1, k2, k3), c))");
+        assertCreateTableFails(6, "CREATE TABLE %s (k1 int, k2 int, k3 int, k4 int, c int, v int, PRIMARY KEY((k1, k2, k3, k4), c))");
+
+        // clustering key
+        assertCreateTableWarns(3, "CREATE TABLE %s (k int, c1 int, v int, PRIMARY KEY(k, c1))");
+        assertCreateTableWarns(4, "CREATE TABLE %s (k int, c1 int, c2 int, v int, PRIMARY KEY(k, c1, c2))");
+        assertCreateTableFails(5, "CREATE TABLE %s (k int, c1 int, c2 int, c3 int, v int, PRIMARY KEY(k, c1, c2, c3))");
+        assertCreateTableFails(6, "CREATE TABLE %s (k int, c1 int, c2 int, c3 int, c4 int, v int, PRIMARY KEY(k, c1, c2, c3, c4))");
+
+        // static column
+        assertCreateTableWarns(3, "CREATE TABLE %s (k int, c int, s1 int STATIC, PRIMARY KEY(k, c))");
+        assertCreateTableWarns(4, "CREATE TABLE %s (k int, c int, s1 int STATIC, s2 int STATIC, PRIMARY KEY(k, c))");
+        assertCreateTableFails(5, "CREATE TABLE %s (k int, c int, s1 int STATIC, s2 int STATIC, s3 int STATIC, PRIMARY KEY(k, c))");
+        assertCreateTableFails(6, "CREATE TABLE %s (k int, c int, s1 int STATIC, s2 int STATIC, s3 int STATIC, s4 int STATIC, PRIMARY KEY(k, c))");
+
+        // regular column on skinny table
+        assertCreateTableValid("CREATE TABLE %s (k int PRIMARY KEY, v1 int)");
+        assertCreateTableWarns(3, "CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int)");
+        assertCreateTableWarns(4, "CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int)");
+        assertCreateTableFails(5, "CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int, v4 int)");
+        assertCreateTableFails(6, "CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int, v4 int, v5 int)");
+
+        // regular column on wide table
+        assertCreateTableWarns(3, "CREATE TABLE %s (k int, c int, v1 int, PRIMARY KEY(k, c))");
+        assertCreateTableWarns(4, "CREATE TABLE %s (k int, c int, v1 int, v2 int, PRIMARY KEY(k, c))");
+        assertCreateTableFails(5, "CREATE TABLE %s (k int, c int, v1 int, v2 int, v3 int, PRIMARY KEY(k, c))");
+        assertCreateTableFails(6, "CREATE TABLE %s (k int, c int, v1 int, v2 int, v3 int, v4 int, PRIMARY KEY(k, c))");
+
+        // udt
+        String udt = createType("CREATE TYPE %s (a int, b int, c int, d int)");
+        assertValid(format("CREATE TABLE %s (k int PRIMARY KEY, v %s)", createTableName(), udt));
+    }
+
+    @Test
+    public void testAlterTableAddColumn() throws Throwable
+    {
+        // skinny table under threshold
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int)");
+        assertAddColumnWarns("ALTER TABLE %s ADD v2 int");
+        assertAddColumnWarns("ALTER TABLE %s ADD v3 int");
+        assertAddColumnFails("ALTER TABLE %s ADD v4 int");
+
+        // skinny table at threshold
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int)");
+        assertAddColumnFails("ALTER TABLE %s ADD v4 int");
+
+        // wide table
+        createTable("CREATE TABLE %s (k int, c int, v1 int, v2 int, PRIMARY KEY(k, c))");
+        assertAddColumnFails("ALTER TABLE %s ADD v3 int");
+        assertAddColumnFails("ALTER TABLE %s ADD s int STATIC");
+
+        // udt
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int)");
+        String udt = createType("CREATE TYPE %s (a int, b int, c int, d int)");
+        assertAddColumnWarns("ALTER TABLE %s ADD v2 " + udt);
+    }
+
+    /**
+     * Verifies that its possible to drop columns from a table that has more columns than the current threshold.
+     */
+    @Test
+    public void testAlterTableDropColumn() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int)");
+        guardrails().setColumnsPerTableThreshold(2, 2);
+        assertDropColumnValid("ALTER TABLE %s DROP v2");
+        assertDropColumnValid("ALTER TABLE %s DROP v3");
+        assertAddColumnFails("ALTER TABLE %s ADD v2 int");
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        String table = keyspace() + '.' + createTableName();
+        testExcludedUsers(() -> format("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int, v4 int)", table),
+                          () -> format("ALTER TABLE %s ADD v5 int", table),
+                          () -> format("DROP TABLE %s", table));
+    }
+
+    private void assertCreateTableValid(String query) throws Throwable
+    {
+        assertMaxThresholdValid(format(query, keyspace() + '.' + createTableName()));
+    }
+
+    private void assertDropColumnValid(String query) throws Throwable
+    {
+        assertValid(format(query, keyspace() + '.' + currentTable()));
+    }
+
+    private void assertCreateTableWarns(int numColumns, String query) throws Throwable
+    {
+        assertWarns(numColumns, query, createTableName());
+    }
+
+    private void assertAddColumnWarns(String query) throws Throwable
+    {
+        assertWarns(currentValue() + 1, query, currentTable());
+    }
+
+    private void assertWarns(long numColumns, String query, String tableName) throws Throwable
+    {
+        assertThresholdWarns(format(query, keyspace() + '.' + tableName),
+                             format("The table %s has %s columns, this exceeds the warning threshold of %s.",
+                                    tableName,
+                                    numColumns,
+                                    guardrails().getColumnsPerTableWarnThreshold())
+        );
+    }
+
+    private void assertAddColumnFails(String query) throws Throwable
+    {
+        assertFails(currentValue() + 1, query, currentTable());
+    }
+
+    private void assertCreateTableFails(long numColumns, String query) throws Throwable
+    {
+        assertFails(numColumns, query, FAIL_TABLE);
+    }
+
+    private void assertFails(long numColumns, String query, String tableName) throws Throwable
+    {
+        assertThresholdFails(format(query, keyspace() + '.' + tableName),
+                             format("Tables cannot have more than %s columns, but %s provided for table %s",
+                                    guardrails().getColumnsPerTableFailThreshold(),
+                                    numColumns,
+                                    tableName)
+        );
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailConsistencyLevelsTester.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailConsistencyLevelsTester.java
new file mode 100644
index 0000000..14c3a58
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailConsistencyLevelsTester.java
@@ -0,0 +1,134 @@
+/*
+ * 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.guardrails;
+
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+
+/**
+ * Utilty class for testing the guardrails for read/write consistency levels.
+ */
+public abstract class GuardrailConsistencyLevelsTester extends GuardrailTester
+{
+    private final String warnedPropertyName;
+    private final String disallowePropertyName;
+    private final Function<Guardrails, Set<String>> warnedGetter;
+    private final Function<Guardrails, Set<String>> disallowedGetter;
+    private final Function<Guardrails, String> warnedCSVGetter;
+    private final Function<Guardrails, String> disallowedCSVGetter;
+    private final BiConsumer<Guardrails, Set<String>> warnedSetter;
+    private final BiConsumer<Guardrails, Set<String>> disallowedSetter;
+    private final BiConsumer<Guardrails, String> warnedCSVSetter;
+    private final BiConsumer<Guardrails, String> disallowedCSVSetter;
+
+    public GuardrailConsistencyLevelsTester(String warnedPropertyName,
+                                            String disallowePropertyName,
+                                            Values<ConsistencyLevel> guardrail,
+                                            Function<Guardrails, Set<String>> warnedGetter,
+                                            Function<Guardrails, Set<String>> disallowedGetter,
+                                            Function<Guardrails, String> warnedCSVGetter,
+                                            Function<Guardrails, String> disallowedCSVGetter,
+                                            BiConsumer<Guardrails, Set<String>> warnedSetter,
+                                            BiConsumer<Guardrails, Set<String>> disallowedSetter,
+                                            BiConsumer<Guardrails, String> warnedCSVSetter,
+                                            BiConsumer<Guardrails, String> disallowedCSVSetter)
+    {
+        super(guardrail);
+        this.warnedPropertyName = warnedPropertyName;
+        this.disallowePropertyName = disallowePropertyName;
+        this.warnedGetter = warnedGetter;
+        this.disallowedGetter = disallowedGetter;
+        this.warnedCSVGetter = g -> sortCSV(warnedCSVGetter.apply(g));
+        this.disallowedCSVGetter = g -> sortCSV(disallowedCSVGetter.apply(g));
+        this.warnedSetter = warnedSetter;
+        this.disallowedSetter = disallowedSetter;
+        this.warnedCSVSetter = warnedCSVSetter;
+        this.disallowedCSVSetter = disallowedCSVSetter;
+    }
+
+    @Before
+    public void before()
+    {
+        warnConsistencyLevels();
+        disableConsistencyLevels();
+    }
+
+    protected void warnConsistencyLevels(ConsistencyLevel... consistencyLevels)
+    {
+        warnedSetter.accept(guardrails(), Stream.of(consistencyLevels).map(ConsistencyLevel::name).collect(Collectors.toSet()));
+    }
+
+    protected void disableConsistencyLevels(ConsistencyLevel... consistencyLevels)
+    {
+        disallowedSetter.accept(guardrails(), Stream.of(consistencyLevels).map(ConsistencyLevel::name).collect(Collectors.toSet()));
+    }
+
+    @Test
+    public void testConfigValidation()
+    {
+        String message = "Invalid value for %s: null is not allowed";
+        assertInvalidProperty(warnedSetter, null, message, warnedPropertyName);
+        assertInvalidProperty(disallowedSetter, null, message, disallowePropertyName);
+
+        assertValidProperty(Collections.emptySet());
+        assertValidProperty(EnumSet.allOf(ConsistencyLevel.class));
+
+        assertValidPropertyCSV("");
+        assertValidPropertyCSV(EnumSet.allOf(ConsistencyLevel.class)
+                                      .stream()
+                                      .map(ConsistencyLevel::toString)
+                                      .collect(Collectors.joining(",")));
+
+        assertInvalidPropertyCSV("invalid", "INVALID");
+        assertInvalidPropertyCSV("ONE,invalid1,invalid2", "INVALID1");
+        assertInvalidPropertyCSV("invalid1,invalid2,ONE", "INVALID1");
+        assertInvalidPropertyCSV("invalid1,ONE,invalid2", "INVALID1");
+    }
+
+    private void assertValidProperty(Set<ConsistencyLevel> input)
+    {
+        Set<String> properties = input.stream().map(ConsistencyLevel::name).collect(Collectors.toSet());
+        assertValidProperty(warnedSetter, warnedGetter, properties);
+        assertValidProperty(disallowedSetter, disallowedGetter, properties);
+    }
+
+    private void assertValidPropertyCSV(String csv)
+    {
+        csv = sortCSV(csv);
+        assertValidProperty(warnedCSVSetter, warnedCSVGetter, csv);
+        assertValidProperty(disallowedCSVSetter, disallowedCSVGetter, csv);
+    }
+
+    private void assertInvalidPropertyCSV(String properties, String rejected)
+    {
+        String message = "No enum constant org.apache.cassandra.db.ConsistencyLevel.%s";
+        assertInvalidProperty(warnedCSVSetter, properties, message, rejected);
+        assertInvalidProperty(disallowedCSVSetter, properties, message, rejected);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailDiskUsageTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailDiskUsageTest.java
new file mode 100644
index 0000000..86e4df0
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailDiskUsageTest.java
@@ -0,0 +1,631 @@
+/*
+ * 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.guardrails;
+
+import java.io.IOException;
+import java.net.UnknownHostException;
+import java.nio.file.FileStore;
+import java.util.Arrays;
+import java.util.function.Consumer;
+
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Multimap;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.cassandra.config.DataStorageSpec;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.VersionedValue;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.service.disk.usage.DiskUsageBroadcaster;
+import org.apache.cassandra.service.disk.usage.DiskUsageMonitor;
+import org.apache.cassandra.service.disk.usage.DiskUsageState;
+import org.apache.cassandra.utils.FBUtilities;
+import org.jboss.byteman.contrib.bmunit.BMRule;
+import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
+import org.mockito.Mockito;
+
+import static org.apache.cassandra.service.disk.usage.DiskUsageState.FULL;
+import static org.apache.cassandra.service.disk.usage.DiskUsageState.NOT_AVAILABLE;
+import static org.apache.cassandra.service.disk.usage.DiskUsageState.SPACIOUS;
+import static org.apache.cassandra.service.disk.usage.DiskUsageState.STUFFED;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.mockito.Mockito.doCallRealMethod;
+import static org.mockito.Mockito.doReturn;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.when;
+
+/**
+ * Tests the guardrails for disk usage, {@link Guardrails#localDataDiskUsage} and {@link Guardrails#replicaDiskUsage}.
+ */
+@RunWith(BMUnitRunner.class)
+@BMRule(name = "Always returns a physical disk size of 1000TiB",
+targetClass = "DiskUsageMonitor",
+targetMethod = "totalDiskSpace",
+action = "return " + (1000L * 1024 * 1024 * 1024 * 1024) + "L;") // 1000TiB
+public class GuardrailDiskUsageTest extends GuardrailTester
+{
+    private static int defaultDataDiskUsagePercentageWarnThreshold;
+    private static int defaultDataDiskUsagePercentageFailThreshold;
+
+    @BeforeClass
+    public static void beforeClass()
+    {
+        defaultDataDiskUsagePercentageWarnThreshold = Guardrails.instance.getDataDiskUsagePercentageWarnThreshold();
+        defaultDataDiskUsagePercentageFailThreshold = Guardrails.instance.getDataDiskUsagePercentageFailThreshold();
+
+        Guardrails.instance.setDataDiskUsagePercentageThreshold(-1, -1);
+    }
+
+    @AfterClass
+    public static void afterClass()
+    {
+        Guardrails.instance.setDataDiskUsagePercentageThreshold(defaultDataDiskUsagePercentageWarnThreshold,
+                                                                defaultDataDiskUsagePercentageFailThreshold);
+    }
+
+    @Test
+    public void testConfigValidation()
+    {
+        assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize(null));
+        assertNull(guardrails().getDataDiskUsageMaxDiskSize());
+
+        assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize("0B"), "0 is not allowed");
+        assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize("0KiB"), "0 is not allowed");
+        assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize("0MiB"), "0 is not allowed");
+        assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize("0GiB"), "0 is not allowed");
+
+        assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize("10B"));
+        assertEquals("10B", guardrails().getDataDiskUsageMaxDiskSize());
+
+        assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize("20KiB"));
+        assertEquals("20KiB", guardrails().getDataDiskUsageMaxDiskSize());
+
+        assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize("30MiB"));
+        assertEquals("30MiB", guardrails().getDataDiskUsageMaxDiskSize());
+
+        assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize("40GiB"));
+        assertEquals("40GiB", guardrails().getDataDiskUsageMaxDiskSize());
+
+        long diskSize = DiskUsageMonitor.totalDiskSpace();
+        String message = String.format("only %s are actually available on disk", FileUtils.stringifyFileSize(diskSize));
+        assertConfigValid(x -> x.setDataDiskUsageMaxDiskSize(diskSize + "B"));
+        assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize(diskSize + 1 + "B"), message);
+        // We want to test with very big number, Long.MAX_VALUE is not allowed so it was easy to use Intger.MAX_VALUE
+        assertConfigFails(x -> x.setDataDiskUsageMaxDiskSize(Integer.MAX_VALUE + "GiB"), message);
+
+        // warn threshold smaller than lower bound
+        assertConfigFails(x -> x.setDataDiskUsagePercentageThreshold(0, 80), "0 is not allowed");
+
+        // fail threshold bigger than upper bound
+        assertConfigFails(x -> x.setDataDiskUsagePercentageThreshold(1, 110), "maximum allowed value is 100");
+
+        // warn threshold larger than fail threshold
+        assertConfigFails(x -> x.setDataDiskUsagePercentageThreshold(60, 50),
+                          "The warn threshold 60 for data_disk_usage_percentage_warn_threshold should be lower than the fail threshold 50");
+    }
+
+    @Test
+    public void testDiskUsageState()
+    {
+        guardrails().setDataDiskUsagePercentageThreshold(50, 90);
+
+        // under usage
+        assertEquals(SPACIOUS, DiskUsageMonitor.instance.getState(10));
+        assertEquals(SPACIOUS, DiskUsageMonitor.instance.getState(50));
+
+        // exceed warning threshold
+        assertEquals(STUFFED, DiskUsageMonitor.instance.getState(51));
+        assertEquals(STUFFED, DiskUsageMonitor.instance.getState(56));
+        assertEquals(STUFFED, DiskUsageMonitor.instance.getState(90));
+
+        // exceed fail threshold
+        assertEquals(FULL, DiskUsageMonitor.instance.getState(91));
+        assertEquals(FULL, DiskUsageMonitor.instance.getState(100));
+
+        // shouldn't be possible to go over 100% but just to be sure
+        assertEquals(FULL, DiskUsageMonitor.instance.getState(101));
+        assertEquals(FULL, DiskUsageMonitor.instance.getState(500));
+    }
+
+    @Test
+    public void testDiskUsageDetectorWarnDisabled()
+    {
+        guardrails().setDataDiskUsagePercentageThreshold(-1, 90);
+
+        // under usage
+        assertEquals(SPACIOUS, DiskUsageMonitor.instance.getState(0));
+        assertEquals(SPACIOUS, DiskUsageMonitor.instance.getState(50));
+        assertEquals(SPACIOUS, DiskUsageMonitor.instance.getState(90));
+
+        // exceed fail threshold
+        assertEquals(FULL, DiskUsageMonitor.instance.getState(91));
+        assertEquals(FULL, DiskUsageMonitor.instance.getState(100));
+    }
+
+    @Test
+    public void testDiskUsageDetectorFailDisabled()
+    {
+        guardrails().setDataDiskUsagePercentageThreshold(50, -1);
+
+        // under usage
+        assertEquals(SPACIOUS, DiskUsageMonitor.instance.getState(50));
+
+        // exceed warning threshold
+        assertEquals(STUFFED, DiskUsageMonitor.instance.getState(51));
+        assertEquals(STUFFED, DiskUsageMonitor.instance.getState(80));
+        assertEquals(STUFFED, DiskUsageMonitor.instance.getState(100));
+    }
+
+    @Test
+    public void testDiskUsageGuardrailDisabled()
+    {
+        guardrails().setDataDiskUsagePercentageThreshold(-1, -1);
+
+        assertEquals(NOT_AVAILABLE, DiskUsageMonitor.instance.getState(0));
+        assertEquals(NOT_AVAILABLE, DiskUsageMonitor.instance.getState(60));
+        assertEquals(NOT_AVAILABLE, DiskUsageMonitor.instance.getState(100));
+    }
+
+    @Test
+    public void testMemtableSizeIncluded() throws Throwable
+    {
+        DiskUsageMonitor monitor = new DiskUsageMonitor();
+
+        createTable(keyspace(), "CREATE TABLE %s (k text PRIMARY KEY, v text) WITH compression = { 'enabled': false }");
+
+        long memtableSizeBefore = monitor.getAllMemtableSize();
+        int rows = 10;
+        int mb = 1024 * 1024;
+
+        for (int i = 0; i < rows; i++)
+        {
+            char[] chars = new char[mb];
+            Arrays.fill(chars, (char) i);
+            String value = String.copyValueOf(chars);
+            execute("INSERT INTO %s (k, v) VALUES(?, ?)", i, value);
+        }
+
+        // verify memtables are included
+        long memtableSizeAfterInsert = monitor.getAllMemtableSize();
+        assertTrue(String.format("Expect at least 10MB more data, but got before: %s and after: %d",
+                                 memtableSizeBefore, memtableSizeAfterInsert),
+                   memtableSizeAfterInsert - memtableSizeBefore >= rows * mb);
+
+        // verify memtable size are reduced after flush
+        flush();
+        long memtableSizeAfterFlush = monitor.getAllMemtableSize();
+        assertEquals(memtableSizeBefore, memtableSizeAfterFlush, mb);
+    }
+
+    @Test
+    public void testMonitorLogsOnStateChange()
+    {
+        guardrails().setDataDiskUsagePercentageThreshold(50, 90);
+
+        Guardrails.localDataDiskUsage.resetLastNotifyTime();
+
+        DiskUsageMonitor monitor = new DiskUsageMonitor();
+
+        // transit to SPACIOUS, no logging
+        assertMonitorStateTransition(0.50, SPACIOUS, monitor);
+
+        // transit to STUFFED, expect warning
+        assertMonitorStateTransition(0.50001, STUFFED, monitor, true, "Local data disk usage 51%(Stuffed) exceeds warning threshold of 50%");
+
+        // remain as STUFFED, no logging because of min log interval
+        assertMonitorStateTransition(0.90, STUFFED, monitor);
+
+        // transit to FULL, expect failure
+        assertMonitorStateTransition(0.90001, FULL, monitor, false, "Local data disk usage 91%(Full) exceeds failure threshold of 90%, will stop accepting writes");
+
+        // remain as FULL, no logging because of min log interval
+        assertMonitorStateTransition(0.99, FULL, monitor);
+
+        // remain as FULL, no logging because of min log interval
+        assertMonitorStateTransition(5.0, FULL, monitor);
+
+        // transit back to STUFFED, no warning  because of min log interval
+        assertMonitorStateTransition(0.90, STUFFED, monitor);
+
+        // transit back to FULL, no logging  because of min log interval
+        assertMonitorStateTransition(0.900001, FULL, monitor);
+
+        // transit back to STUFFED, no logging  because of min log interval
+        assertMonitorStateTransition(0.90, STUFFED, monitor);
+
+        // transit to SPACIOUS, no logging
+        assertMonitorStateTransition(0.50, SPACIOUS, monitor);
+    }
+
+    @Test
+    public void testDiskUsageBroadcaster() throws UnknownHostException
+    {
+        DiskUsageBroadcaster broadcaster = new DiskUsageBroadcaster(null);
+        Gossiper.instance.unregister(broadcaster);
+
+        InetAddressAndPort node1 = InetAddressAndPort.getByName("127.0.0.1");
+        InetAddressAndPort node2 = InetAddressAndPort.getByName("127.0.0.2");
+        InetAddressAndPort node3 = InetAddressAndPort.getByName("127.0.0.3");
+
+        // initially it's NOT_AVAILABLE
+        assertFalse(broadcaster.hasStuffedOrFullNode());
+        assertFalse(broadcaster.isFull(node1));
+        assertFalse(broadcaster.isFull(node2));
+        assertFalse(broadcaster.isFull(node3));
+
+        // adding 1st node: Spacious, cluster has no Full node
+        broadcaster.onChange(node1, ApplicationState.DISK_USAGE, value(SPACIOUS));
+        assertFalse(broadcaster.hasStuffedOrFullNode());
+        assertFalse(broadcaster.isFull(node1));
+
+        // adding 2nd node with wrong ApplicationState
+        broadcaster.onChange(node2, ApplicationState.RACK, value(FULL));
+        assertFalse(broadcaster.hasStuffedOrFullNode());
+        assertFalse(broadcaster.isFull(node2));
+
+        // adding 2nd node: STUFFED
+        broadcaster.onChange(node2, ApplicationState.DISK_USAGE, value(STUFFED));
+        assertTrue(broadcaster.hasStuffedOrFullNode());
+        assertTrue(broadcaster.isStuffed(node2));
+
+        // adding 3rd node: FULL
+        broadcaster.onChange(node3, ApplicationState.DISK_USAGE, value(FULL));
+        assertTrue(broadcaster.hasStuffedOrFullNode());
+        assertTrue(broadcaster.isFull(node3));
+
+        // remove 2nd node, cluster has Full node
+        broadcaster.onRemove(node2);
+        assertTrue(broadcaster.hasStuffedOrFullNode());
+        assertFalse(broadcaster.isStuffed(node2));
+
+        // remove 3nd node, cluster has no Full node
+        broadcaster.onRemove(node3);
+        assertFalse(broadcaster.hasStuffedOrFullNode());
+        assertFalse(broadcaster.isFull(node3));
+    }
+
+    @Test
+    public void testDiskUsageCalculationWithMaxDiskSize() throws IOException
+    {
+        Directories.DataDirectory directory = mock(Directories.DataDirectory.class);
+        when(directory.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("5GiB").toBytes());
+
+        FileStore store = mock(FileStore.class);
+        when(store.getUsableSpace()).thenReturn(new DataStorageSpec.LongBytesBound("95GiB").toBytes()); // 100GiB disk - 5GiB
+
+        Multimap<FileStore, Directories.DataDirectory> directories = HashMultimap.create();
+        directories.put(store, directory);
+        DiskUsageMonitor monitor = spy(new DiskUsageMonitor(() -> directories));
+
+        doCallRealMethod().when(monitor).getDiskUsage();
+        doReturn(0L).when(monitor).getAllMemtableSize();
+
+        guardrails().setDataDiskUsageMaxDiskSize(null);
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.05);
+
+        // 5G are used of 10G
+        guardrails().setDataDiskUsageMaxDiskSize("10GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.5);
+
+        // max disk size = space used
+        guardrails().setDataDiskUsageMaxDiskSize("5GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(1.0);
+
+        // max disk size < space used
+        guardrails().setDataDiskUsageMaxDiskSize("1GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(5.0);
+    }
+
+    @Test
+    public void testDiskUsageCalculationWithMaxDiskSizeAndSmallUnits() throws IOException
+    {
+        // 5GiB used out of 100GiB disk
+        long freeDiskSizeInBytes = new DataStorageSpec.LongBytesBound("100GiB").toBytes() - new DataStorageSpec.LongBytesBound("5MiB").toBytes();
+
+        FileStore store = mock(FileStore.class);
+        when(store.getUsableSpace()).thenReturn(new DataStorageSpec.LongBytesBound(freeDiskSizeInBytes + "B").toBytes()); // 100GiB disk
+
+        Directories.DataDirectory directory = mock(Directories.DataDirectory.class);
+        when(directory.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("5MiB").toBytes());
+
+        Multimap<FileStore, Directories.DataDirectory> directories = HashMultimap.create();
+        directories.put(store, directory);
+        DiskUsageMonitor monitor = spy(new DiskUsageMonitor(() -> directories));
+
+        doCallRealMethod().when(monitor).getDiskUsage();
+        doReturn(0L).when(monitor).getAllMemtableSize();
+
+        guardrails().setDataDiskUsageMaxDiskSize(null);
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.00005);
+
+        // 5MiB are used of 10MiB
+        guardrails().setDataDiskUsageMaxDiskSize("10MiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.5);
+
+        // max disk size = space used
+        guardrails().setDataDiskUsageMaxDiskSize("5MiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(1.0);
+
+        // max disk size < space used
+        guardrails().setDataDiskUsageMaxDiskSize("1MiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(5.0);
+    }
+
+    @Test
+    public void testDiskUsageCalculationWithMaxDiskSizeAndMultipleVolumes() throws IOException
+    {
+        Mockito.reset();
+
+        Multimap<FileStore, Directories.DataDirectory> directories = HashMultimap.create();
+
+        Directories.DataDirectory directory1 = mock(Directories.DataDirectory.class);
+        FileStore store1 = mock(FileStore.class);
+        when(directory1.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("5GiB").toBytes());
+        when(store1.getUsableSpace()).thenReturn(new DataStorageSpec.LongBytesBound("95GiB").toBytes()); // 100 GiB disk - 5 GiB
+        directories.put(store1, directory1);
+
+        Directories.DataDirectory directory2 = mock(Directories.DataDirectory.class);
+        FileStore store2 = mock(FileStore.class);
+        when(directory2.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("25GiB").toBytes());
+        when(store2.getUsableSpace()).thenReturn(new DataStorageSpec.LongBytesBound("75GiB").toBytes()); // 100 GiB disk - 25 GiB
+        directories.put(store2, directory2);
+
+        Directories.DataDirectory directory3 = mock(Directories.DataDirectory.class);
+        FileStore store3 = mock(FileStore.class);
+        when(directory3.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("20GiB").toBytes());
+        when(store3.getUsableSpace()).thenReturn(new DataStorageSpec.LongBytesBound("80GiB").toBytes()); // 100 GiB disk - 20 GiB
+        directories.put(store3, directory3);
+
+        DiskUsageMonitor monitor = spy(new DiskUsageMonitor(() -> directories));
+
+        doCallRealMethod().when(monitor).getDiskUsage();
+        doReturn(0L).when(monitor).getAllMemtableSize();
+
+        // 50G/300G as each disk has a capacity of 100G
+        guardrails().setDataDiskUsageMaxDiskSize(null);
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.16667);
+
+        // 50G/100G
+        guardrails().setDataDiskUsageMaxDiskSize("100GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.5);
+
+        // 50G/75G
+        guardrails().setDataDiskUsageMaxDiskSize("75GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.66667);
+
+        // 50G/50G
+        guardrails().setDataDiskUsageMaxDiskSize("50GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(1.0);
+
+        // 50G/49G
+        guardrails().setDataDiskUsageMaxDiskSize("49GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(1.02041);
+    }
+
+    @Test
+    public void testDiskUsageCalculationWithMaxDiskSizeAndMultipleDirectories() throws IOException
+    {
+        Mockito.reset();
+
+        Directories.DataDirectory directory1 = mock(Directories.DataDirectory.class);
+        when(directory1.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("5GiB").toBytes());
+
+        Directories.DataDirectory directory2 = mock(Directories.DataDirectory.class);
+        when(directory2.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("25GiB").toBytes());
+
+        Directories.DataDirectory directory3 = mock(Directories.DataDirectory.class);
+        when(directory3.getRawSize()).thenReturn(new DataStorageSpec.LongBytesBound("20GiB").toBytes());
+
+        FileStore store = mock(FileStore.class);
+        when(store.getUsableSpace()).thenReturn(new DataStorageSpec.LongBytesBound("250GiB").toBytes()); // 100 GiB disk (300 - 5 - 25 - 20)
+
+        Multimap<FileStore, Directories.DataDirectory> directories = HashMultimap.create();
+        directories.putAll(store, ImmutableSet.of(directory1, directory2, directory3));
+
+        DiskUsageMonitor monitor = spy(new DiskUsageMonitor(() -> directories));
+
+        doCallRealMethod().when(monitor).getDiskUsage();
+        doReturn(0L).when(monitor).getAllMemtableSize();
+
+        // 50G/300G as disk has a capacity of 300G
+        guardrails().setDataDiskUsageMaxDiskSize(null);
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.16667);
+
+        // 50G/100G
+        guardrails().setDataDiskUsageMaxDiskSize("100GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.5);
+
+        // 50G/75G
+        guardrails().setDataDiskUsageMaxDiskSize("75GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(0.66667);
+
+        // 50G/50G
+        guardrails().setDataDiskUsageMaxDiskSize("50GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(1.0);
+
+        // 50G/49G
+        guardrails().setDataDiskUsageMaxDiskSize("49GiB");
+        assertThat(monitor.getDiskUsage()).isEqualTo(1.02041);
+    }
+
+    @Test
+    public void testWriteRequests() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v int)");
+
+        InetAddressAndPort local = FBUtilities.getBroadcastAddressAndPort();
+        InetAddressAndPort node1 = InetAddressAndPort.getByName("127.0.0.11");
+        InetAddressAndPort node2 = InetAddressAndPort.getByName("127.0.0.21");
+        InetAddressAndPort node3 = InetAddressAndPort.getByName("127.0.0.31");
+
+        Guardrails.replicaDiskUsage.resetLastNotifyTime();
+        guardrails().setDataDiskUsagePercentageThreshold(98, 99);
+
+        ConsistencyLevel cl = ConsistencyLevel.LOCAL_QUORUM;
+        String select = "SELECT * FROM %s";
+        String insert = "INSERT INTO %s (k, v) VALUES (0, 0)";
+        String batch = "BEGIN BATCH " +
+                       "INSERT INTO %s (k, v) VALUES (1, 1);" +
+                       "INSERT INTO %<s (k, v) VALUES (2, 2); " +
+                       "APPLY BATCH";
+        CheckedFunction userSelect = () -> execute(userClientState, select, cl);
+        CheckedFunction userInsert = () -> execute(userClientState, insert, cl);
+        CheckedFunction userBatch = () -> execute(userClientState, batch, cl);
+
+        // default state, write request works fine
+        assertValid(userSelect);
+        assertValid(userInsert);
+        assertValid(userBatch);
+
+        // verify node1 NOT_AVAILABLE won't affect writes
+        setDiskUsageState(node1, NOT_AVAILABLE);
+        assertValid(userSelect);
+        assertValid(userInsert);
+        assertValid(userBatch);
+
+        // verify node2 Spacious won't affect writes
+        setDiskUsageState(node2, SPACIOUS);
+        assertValid(userSelect);
+        assertValid(userInsert);
+        assertValid(userBatch);
+
+        // verify node3 STUFFED won't trigger warning as it's not write replica
+        setDiskUsageState(node3, STUFFED);
+        assertValid(userSelect);
+        assertValid(userInsert);
+        assertValid(userBatch);
+
+        // verify node3 Full won't affect writes as it's not write replica
+        setDiskUsageState(node3, FULL);
+        assertValid(userSelect);
+        assertValid(userInsert);
+        assertValid(userBatch);
+
+        // verify local node STUFF, will log warning
+        setDiskUsageState(local, STUFFED);
+        assertValid(userSelect);
+        assertWarns(userInsert);
+        assertWarns(userBatch);
+
+        // verify local node Full, will reject writes
+        setDiskUsageState(local, FULL);
+        assertValid(userSelect);
+        assertFails(userInsert);
+        assertFails(userBatch);
+
+        // excluded users can write to FULL cluster
+        useSuperUser();
+        Guardrails.replicaDiskUsage.resetLastNotifyTime();
+        for (ClientState excludedUser : Arrays.asList(systemClientState, superClientState))
+        {
+            assertValid(() -> execute(excludedUser, select, cl));
+            assertValid(() -> execute(excludedUser, insert, cl));
+            assertValid(() -> execute(excludedUser, batch, cl));
+        }
+
+        // verify local node STUFFED won't reject writes
+        setDiskUsageState(local, STUFFED);
+        assertValid(userSelect);
+        assertWarns(userInsert);
+        assertWarns(userBatch);
+    }
+
+    @Override
+    protected void assertValid(CheckedFunction function) throws Throwable
+    {
+        Guardrails.replicaDiskUsage.resetLastNotifyTime();
+        super.assertValid(function);
+    }
+
+    protected void assertWarns(CheckedFunction function) throws Throwable
+    {
+        Guardrails.replicaDiskUsage.resetLastNotifyTime();
+        super.assertWarns(function, "Replica disk usage exceeds warning threshold");
+    }
+
+    protected void assertFails(CheckedFunction function) throws Throwable
+    {
+        Guardrails.replicaDiskUsage.resetLastNotifyTime();
+        super.assertFails(function, "Write request failed because disk usage exceeds failure threshold");
+    }
+
+    private static void setDiskUsageState(InetAddressAndPort endpoint, DiskUsageState state)
+    {
+        DiskUsageBroadcaster.instance.onChange(endpoint, ApplicationState.DISK_USAGE, value(state));
+    }
+
+    private static VersionedValue value(DiskUsageState state)
+    {
+        return StorageService.instance.valueFactory.diskUsage(state.name());
+    }
+
+    private void assertMonitorStateTransition(double usageRatio, DiskUsageState state, DiskUsageMonitor monitor)
+    {
+        assertMonitorStateTransition(usageRatio, state, monitor, false, null);
+    }
+
+    private void assertMonitorStateTransition(double usageRatio, DiskUsageState state, DiskUsageMonitor monitor,
+                                              boolean isWarn, String msg)
+    {
+        boolean stateChanged = state != monitor.state();
+        Consumer<DiskUsageState> notifier = newState -> {
+            if (stateChanged)
+                assertEquals(state, newState);
+            else
+                fail("Expect no notification if state remains the same");
+        };
+
+        monitor.updateLocalState(usageRatio, notifier);
+        assertEquals(state, monitor.state());
+
+        if (msg == null)
+        {
+            listener.assertNotFailed();
+            listener.assertNotWarned();
+        }
+        else if (isWarn)
+        {
+            listener.assertWarned(msg);
+            listener.assertNotFailed();
+        }
+        else
+        {
+            listener.assertFailed(msg);
+            listener.assertNotWarned();
+        }
+
+        listener.clear();
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailDropTruncateTableTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailDropTruncateTableTest.java
new file mode 100644
index 0000000..761dcdc
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailDropTruncateTableTest.java
@@ -0,0 +1,91 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.guardrails;
+
+import org.junit.After;
+import org.junit.Test;
+
+import static java.lang.String.format;
+
+public class GuardrailDropTruncateTableTest extends GuardrailTester
+{
+    private String tableQuery = "CREATE TABLE %s(pk int, ck int, v int, PRIMARY KEY(pk, ck))";
+
+    private void setGuardrail(boolean enabled)
+    {
+        Guardrails.instance.setDropTruncateTableEnabled(enabled);
+    }
+
+    @After
+    public void afterTest()
+    {
+        setGuardrail(true);
+    }
+
+    @Test
+    public void testCanDropWhileFeatureEnabled() throws Throwable
+    {
+        setGuardrail(true);
+        createTable(tableQuery);
+        assertValid(String.format("DROP TABLE %s", currentTable()));
+    }
+
+    @Test
+    public void testCannotDropWhileFeatureDisabled() throws Throwable
+    {
+        setGuardrail(false);
+        createTable(tableQuery);
+        assertFails("DROP TABLE %s", "DROP and TRUNCATE TABLE functionality is not allowed");
+    }
+
+    @Test
+    public void testIfExistsDoesNotBreakGuardrail() throws Throwable
+    {
+        setGuardrail(false);
+        createTable(tableQuery);
+        assertFails("DROP TABLE IF EXISTS %s", "DROP and TRUNCATE TABLE functionality is not allowed");
+    }
+
+    @Test
+    public void testCanTruncateWhileFeatureEnabled() throws Throwable
+    {
+        setGuardrail(true);
+        createTable(tableQuery);
+        assertValid(String.format("TRUNCATE TABLE %s", currentTable()));
+    }
+
+    @Test
+    public void testCannotTruncateWhileFeatureDisabled() throws Throwable
+    {
+        setGuardrail(false);
+        createTable(tableQuery);
+        assertFails("TRUNCATE TABLE %s", "DROP and TRUNCATE TABLE functionality is not allowed");
+    }
+
+    @Test
+    public void testExcludedUsersCanAlwaysDropAndTruncate() throws Throwable
+    {
+        String table = keyspace() + '.' + createTableName();
+        setGuardrail(false);
+        testExcludedUsers(() -> format("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int, v4 int)", table),
+                          () -> format("TRUNCATE TABLE %s", table),
+                          () -> format("DROP TABLE %s", table));
+
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailFieldsPerUDTTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailFieldsPerUDTTest.java
new file mode 100644
index 0000000..96ad28a
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailFieldsPerUDTTest.java
@@ -0,0 +1,109 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Test;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for the number of fields in a user-defined type, {@link Guardrails#fieldsPerUDT}.
+ */
+public class GuardrailFieldsPerUDTTest extends ThresholdTester
+{
+    private static final int WARN_THRESHOLD = 2;
+    private static final int FAIL_THRESHOLD = 4;
+
+    public GuardrailFieldsPerUDTTest()
+    {
+        super(WARN_THRESHOLD,
+              FAIL_THRESHOLD,
+              Guardrails.fieldsPerUDT,
+              Guardrails::setFieldsPerUDTThreshold,
+              Guardrails::getFieldsPerUDTWarnThreshold,
+              Guardrails::getFieldsPerUDTFailThreshold);
+    }
+
+    @Test
+    public void testCreateType() throws Throwable
+    {
+        assertValid("CREATE TYPE %s (a int)");
+        assertValid("CREATE TYPE %s (a int, b int)");
+        assertWarns("CREATE TYPE %s (a int, b int, c int)", 3);
+        assertWarns("CREATE TYPE %s (a int, b int, c int, d int)", 4);
+        assertFails("CREATE TYPE %s (a int, b int, c int, d int, e int)", 5);
+        assertFails("CREATE TYPE %s (a int, b int, c int, d int, e int, f int)", 6);
+    }
+
+    @Test
+    public void testAlterType() throws Throwable
+    {
+        String name = createType("CREATE TYPE %s (a int)");
+
+        assertValid("ALTER TYPE %s ADD b int", name);
+        assertWarns("ALTER TYPE %s ADD c int", name, 3);
+        assertWarns("ALTER TYPE %s ADD d int", name, 4);
+        assertFails("ALTER TYPE %s ADD e int", name, 5);
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        String name = createTypeName();
+        testExcludedUsers(() -> format("CREATE TYPE %s (a int, b int, c int, d int, e int)", name),
+                          () -> format("ALTER TYPE %s ADD f int", name),
+                          () -> format("DROP TYPE %s", name));
+    }
+
+    protected void assertValid(String query) throws Throwable
+    {
+        assertValid(query, createTypeName());
+    }
+
+    private void assertValid(String query, String typeName) throws Throwable
+    {
+        super.assertValid(format(query, typeName));
+    }
+
+    private void assertWarns(String query, int numFields) throws Throwable
+    {
+        String typeName = createTypeName();
+        assertWarns(query, typeName, numFields);
+    }
+
+    private void assertWarns(String query, String typeName, int numFields) throws Throwable
+    {
+        assertWarns(format(query, typeName),
+                    format("The user type %s has %s columns, this exceeds the warning threshold of %s.",
+                           typeName, numFields, WARN_THRESHOLD));
+    }
+
+    private void assertFails(String query, int numFields) throws Throwable
+    {
+        String typeName = createTypeName();
+        assertFails(query, typeName, numFields);
+    }
+
+    private void assertFails(String query, String typeName, int numFields) throws Throwable
+    {
+        assertFails(format(query, typeName),
+                    format("User types cannot have more than %s columns, but %s provided for user type %s",
+                           FAIL_THRESHOLD, numFields, typeName));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailGroupByTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailGroupByTest.java
new file mode 100644
index 0000000..f25cba2
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailGroupByTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Test;
+
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.SchemaKeyspaceTables;
+
+public class GuardrailGroupByTest extends GuardrailTester
+{
+    private static final String query = String.format("SELECT * FROM %s.%s WHERE keyspace_name='%s' GROUP BY table_name",
+                                                      SchemaConstants.SCHEMA_KEYSPACE_NAME,
+                                                      SchemaKeyspaceTables.TABLES,
+                                                      KEYSPACE);
+
+    private void setGuardrail(boolean enabled)
+    {
+        Guardrails.instance.setGroupByEnabled(enabled);
+    }
+
+    @Test
+    public void checkExplicitlyDisabled() throws Throwable
+    {
+        setGuardrail(false);
+        assertFails(query, "GROUP BY functionality is not allowed");
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        setGuardrail(false);
+        testExcludedUsers(() -> query);
+    }
+
+    @Test
+    public void checkEnabled() throws Throwable
+    {
+        setGuardrail(true);
+        assertValid(query);
+    }
+
+    @Test
+    public void checkView() throws Throwable
+    {
+        setGuardrail(false);
+        createTable( "CREATE TABLE %s(pk int, ck int, v int, PRIMARY KEY(pk, ck))");
+        String viewName = createView("CREATE MATERIALIZED VIEW %s AS " +
+                                     "SELECT * FROM %s WHERE pk IS NOT null and ck IS NOT null " +
+                                     "PRIMARY KEY(ck, pk)");
+        String viewQuery = "SELECT * FROM " + viewName + " WHERE ck=0 GROUP BY pk";
+        assertFails(viewQuery, "GROUP BY functionality is not allowed");
+        testExcludedUsers(() -> viewQuery);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailInSelectCartesianProductTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailInSelectCartesianProductTest.java
new file mode 100644
index 0000000..ef61ee4
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailInSelectCartesianProductTest.java
@@ -0,0 +1,210 @@
+/*
+ * 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.guardrails;
+
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.db.marshal.Int32Type;
+
+/**
+ * Tests the guardrail for the max number of restrictions produced by the cartesian product of the {@code IN}
+ * restrictions of a query, {@link Guardrails#inSelectCartesianProduct}.
+ */
+public class GuardrailInSelectCartesianProductTest extends ThresholdTester
+{
+    private static final int WARN_THRESHOLD = 16;
+    private static final int FAIL_THRESHOLD = 25;
+
+    private static final String WARN_MESSAGE = "The cartesian product of the IN restrictions on %s produces %d " +
+                                               "values, this exceeds warning threshold of " + WARN_THRESHOLD;
+    private static final String FAIL_MESSAGE = "Aborting query because the cartesian product of the IN restrictions " +
+                                               "on %s produces %d values, this exceeds fail threshold of " + FAIL_THRESHOLD;
+
+    public GuardrailInSelectCartesianProductTest()
+    {
+        super(WARN_THRESHOLD,
+              FAIL_THRESHOLD,
+              Guardrails.inSelectCartesianProduct,
+              Guardrails::setInSelectCartesianProductThreshold,
+              Guardrails::getInSelectCartesianProductWarnThreshold,
+              Guardrails::getInSelectCartesianProductFailThreshold);
+    }
+
+    @Override
+    protected long currentValue()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    @Before
+    public void initSchema()
+    {
+        createTable("CREATE TABLE %s (pk1 int, pk2 int, ck1 int, ck2 int, PRIMARY KEY((pk1, pk2), ck1, ck2))");
+    }
+
+    @Test
+    public void testPkCartesianProduct() throws Throwable
+    {
+        // below both thresholds
+        testPkCartesianProduct(1, 1);
+        testPkCartesianProduct(1, 4);
+        testPkCartesianProduct(4, 4);
+
+        // above warn threshold
+        testPkCartesianProduct(5, 5);
+        testPkCartesianProduct(2, 12);
+        testPkCartesianProduct(8, 3);
+
+        // above cartesian product limit
+        testPkCartesianProduct(1, 26);
+        testPkCartesianProduct(5, 6);
+        testPkCartesianProduct(26, 1);
+    }
+
+    @Test
+    public void testCkCartesianProduct() throws Throwable
+    {
+        // below both thresholds
+        testCkCartesianProduct(3, 8);
+        testCkCartesianProduct(5, 5);
+
+        // above cartesian product limit
+        testCkCartesianProduct(1, 26);
+        testCkCartesianProduct(5, 6);
+        testCkCartesianProduct(6, 5);
+        testCkCartesianProduct(26, 1);
+    }
+
+    @Test
+    public void testPkCkCartesianProduct() throws Throwable
+    {
+        // below both thresholds
+        testCartesianProduct(1, 10, 1, 10);
+        testCartesianProduct(10, 1, 10, 1);
+        testCartesianProduct(5, 5, 5, 5);
+
+        // above cartesian product limit
+        testCartesianProduct(5, 6, 5, 5);
+        testCartesianProduct(6, 5, 5, 5);
+        testCartesianProduct(5, 5, 6, 5);
+        testCartesianProduct(5, 5, 5, 6);
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        testExcludedUsers(() -> String.format("SELECT * FROM %%s WHERE pk1 in (%s) AND pk2 in (%s)",
+                                              terms(5), terms(5)),
+                          () -> String.format("SELECT * FROM %%s WHERE pk1 in (%s) AND pk2 in (%s) AND ck1 in (%s) AND ck2 in (%s)",
+                                              terms(5), terms(5), terms(5), terms(6)));
+    }
+
+    @Test
+    public void testPkCartesianProductMultiColumnBelowThreshold() throws Throwable
+    {
+        String inTerms = IntStream.range(0, 5).mapToObj(i -> String.format("(%d, %d)", i, i + 1)).collect(Collectors.joining(", "));
+        String query = String.format("SELECT * FROM %%s WHERE (pk1, pk2) in (%s)", inTerms);
+        assertInvalidMessage("Multi-column relations can only be applied to clustering columns but was applied to: pk1", query);
+    }
+
+    private void testPkCartesianProduct(int pk1Terms, int pk2Terms) throws Throwable
+    {
+        testCartesianProduct(pk1Terms, pk2Terms, 1, 1);
+    }
+
+    private void testCkCartesianProduct(int ck1Terms, int ck2Terms) throws Throwable
+    {
+        testCartesianProduct(1, 1, ck1Terms, ck2Terms);
+    }
+
+    private void testCartesianProduct(int pk1, int pk2, int ck1, int ck2) throws Throwable
+    {
+        int keys = pk1 * pk2;
+        int clusterings = ck1 * ck2;
+
+        String query = String.format("SELECT * FROM %%s WHERE pk1 in (%s) AND pk2 in (%s) AND ck1 in (%s) AND ck2 in (%s)",
+                                     terms(pk1), terms(pk2), terms(ck1), terms(ck2));
+        testCartesianProduct(() -> execute(userClientState, query), keys, clusterings);
+
+        String queryWithBindVariables = String.format("SELECT * FROM %%s WHERE pk1 in (%s) AND pk2 in (%s) AND ck1 in (%s) AND ck2 in (%s)",
+                                                      markers(pk1), markers(pk2), markers(ck1), markers(ck2));
+        testCartesianProduct(() -> execute(userClientState, queryWithBindVariables, bindValues(pk1, pk2, ck1, ck2)), keys, clusterings);
+    }
+
+    private void testCartesianProduct(CheckedFunction function, int keys, int clusterings) throws Throwable
+    {
+        String keysFailMessage = String.format(FAIL_MESSAGE, "partition key", keys);
+        String keysWarnMessage = String.format(WARN_MESSAGE, "partition key", keys);
+        String clusteringsFailMessage = String.format(FAIL_MESSAGE, "clustering key", clusterings);
+        String clusteringsWarnMessage = String.format(WARN_MESSAGE, "clustering key", clusterings);
+
+        if (keys > FAIL_THRESHOLD)
+        {
+            assertFails(function, keysFailMessage);
+        }
+        else if (keys > WARN_THRESHOLD)
+        {
+            if (clusterings > FAIL_THRESHOLD)
+                assertFails(function, Arrays.asList(keysWarnMessage, clusteringsFailMessage));
+            else if (clusterings > WARN_THRESHOLD)
+                assertWarns(function, Arrays.asList(keysWarnMessage, clusteringsWarnMessage));
+            else
+                assertWarns(function, keysWarnMessage);
+        }
+        else if (clusterings > FAIL_THRESHOLD)
+        {
+            assertFails(function, clusteringsFailMessage);
+        }
+        else if (clusterings > WARN_THRESHOLD)
+        {
+            assertWarns(function, clusteringsWarnMessage);
+        }
+        else
+        {
+            assertValid(function);
+        }
+    }
+
+    private static String terms(int terms)
+    {
+        assert terms > 0;
+        return IntStream.range(0, terms).mapToObj(String::valueOf).collect(Collectors.joining(", "));
+    }
+
+    private static String markers(int terms)
+    {
+        assert terms > 0;
+        return IntStream.range(0, terms).mapToObj(i -> "?").collect(Collectors.joining(", "));
+    }
+
+    private static List<ByteBuffer> bindValues(int... termCounts)
+    {
+        return IntStream.of(termCounts)
+                        .boxed()
+                        .flatMap(terms -> IntStream.range(0, terms).boxed().map(Int32Type.instance::decompose))
+                        .collect(Collectors.toList());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailItemsPerCollectionTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailItemsPerCollectionTest.java
new file mode 100644
index 0000000..a13e9b3
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailItemsPerCollectionTest.java
@@ -0,0 +1,289 @@
+/*
+ * 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.guardrails;
+
+import java.nio.ByteBuffer;
+import java.util.Collections;
+import java.util.stream.Collector;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.junit.After;
+import org.junit.Test;
+
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.ListType;
+import org.apache.cassandra.db.marshal.MapType;
+import org.apache.cassandra.db.marshal.SetType;
+
+/**
+ * Tests the guardrail for the number of items on a collection, {@link Guardrails#itemsPerCollection}.
+ * <p>
+ * This test doesn't include the activation of the guardrail during sstable writes, these cases are covered by the dtest
+ * {@link org.apache.cassandra.distributed.test.guardrails.GuardrailItemsPerCollectionOnSSTableWriteTest}.
+ */
+public class GuardrailItemsPerCollectionTest extends ThresholdTester
+{
+    private static final int WARN_THRESHOLD = 10;
+    private static final int FAIL_THRESHOLD = 20;
+
+    public GuardrailItemsPerCollectionTest()
+    {
+        super(WARN_THRESHOLD,
+              FAIL_THRESHOLD,
+              Guardrails.itemsPerCollection,
+              Guardrails::setItemsPerCollectionThreshold,
+              Guardrails::getItemsPerCollectionWarnThreshold,
+              Guardrails::getItemsPerCollectionFailThreshold);
+    }
+
+    @After
+    public void after()
+    {
+        // immediately drop the created table so its async cleanup doesn't interfere with the next tests
+        if (currentTable() != null)
+            dropTable("DROP TABLE %s");
+    }
+
+    @Test
+    public void testSetSize() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v set<int>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", set(0));
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", set(1));
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", set(WARN_THRESHOLD));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", set(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", set(FAIL_THRESHOLD), FAIL_THRESHOLD);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", set(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+        assertFails("INSERT INTO %s (k, v) VALUES (8, ?)", set(FAIL_THRESHOLD + 10), FAIL_THRESHOLD + 10);
+    }
+
+    @Test
+    public void testSetSizeFrozen() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v frozen<set<int>>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", set(0));
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", set(1));
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", set(WARN_THRESHOLD));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", set(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", set(FAIL_THRESHOLD), FAIL_THRESHOLD);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", set(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+    }
+
+    @Test
+    public void testSetSizeWithUpdates() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v set<int>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, ?)", set(1));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 0", set(1, WARN_THRESHOLD));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 0", set(1, FAIL_THRESHOLD), FAIL_THRESHOLD - 1);
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (1, ?)", set(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertValid("UPDATE %s SET v = v - ? WHERE k = 1", set(1));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", set(1));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 2", set(1, WARN_THRESHOLD + 1));
+
+        assertFails("INSERT INTO %s (k, v) VALUES (3, ?)", set(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+        assertValid("UPDATE %s SET v = v - ? WHERE k = 3", set(1));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", set(1));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 4", set(1, FAIL_THRESHOLD + 1), FAIL_THRESHOLD);
+    }
+
+    @Test
+    public void testListSize() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v list<int>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", list(0));
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", list(1));
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", list(WARN_THRESHOLD));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", list(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", list(FAIL_THRESHOLD), FAIL_THRESHOLD);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", list(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", list(FAIL_THRESHOLD + 10), FAIL_THRESHOLD + 10);
+    }
+
+    @Test
+    public void testListSizeFrozen() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v frozen<list<int>>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", list(0));
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", list(1));
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", list(WARN_THRESHOLD));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", list(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", list(FAIL_THRESHOLD), FAIL_THRESHOLD);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", list(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+    }
+
+    @Test
+    public void testListSizeWithUpdates() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v list<int>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, ?)", list(1));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 0", list(1, WARN_THRESHOLD));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 0", list(1, FAIL_THRESHOLD), FAIL_THRESHOLD - 1);
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (1, ?)", list(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertValid("UPDATE %s SET v = v - ? WHERE k = 1", list(1));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", list(1));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 2", list(1, WARN_THRESHOLD + 1));
+
+        assertFails("INSERT INTO %s (k, v) VALUES (3, ?)", list(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+        assertValid("UPDATE %s SET v = v - ? WHERE k = 3", list(1));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", list(1));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 4", list(1, FAIL_THRESHOLD + 1), FAIL_THRESHOLD);
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", set(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertValid("UPDATE %s SET v[0] = null WHERE k = 5");
+    }
+
+    @Test
+    public void testMapSize() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v map<int, int>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", map(0));
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", map(1));
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", map(WARN_THRESHOLD));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", map(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", map(FAIL_THRESHOLD), FAIL_THRESHOLD);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", map(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", map(FAIL_THRESHOLD + 10), FAIL_THRESHOLD + 10);
+    }
+
+    @Test
+    public void testMapSizeFrozen() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v frozen<map<int, int>>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, null)");
+        assertValid("INSERT INTO %s (k, v) VALUES (1, ?)", map(0));
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", map(1));
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", map(WARN_THRESHOLD));
+        assertWarns("INSERT INTO %s (k, v) VALUES (5, ?)", map(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertWarns("INSERT INTO %s (k, v) VALUES (6, ?)", map(FAIL_THRESHOLD), FAIL_THRESHOLD);
+        assertFails("INSERT INTO %s (k, v) VALUES (7, ?)", map(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+    }
+
+    @Test
+    public void testMapSizeWithUpdates() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v map<int, int>)");
+
+        assertValid("INSERT INTO %s (k, v) VALUES (0, ?)", map(1));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 0", map(1, WARN_THRESHOLD));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 0", map(1, FAIL_THRESHOLD), FAIL_THRESHOLD - 1);
+
+        assertWarns("INSERT INTO %s (k, v) VALUES (1, ?)", map(WARN_THRESHOLD + 1), WARN_THRESHOLD + 1);
+        assertValid("UPDATE %s SET v = v - ? WHERE k = 1", set(1));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (2, ?)", map(1));
+        assertValid("UPDATE %s SET v = v + ? WHERE k = 2", map(1, WARN_THRESHOLD + 1));
+
+        assertFails("INSERT INTO %s (k, v) VALUES (3, ?)", map(FAIL_THRESHOLD + 1), FAIL_THRESHOLD + 1);
+        assertValid("UPDATE %s SET v = v - ? WHERE k = 3", set(1));
+
+        assertValid("INSERT INTO %s (k, v) VALUES (4, ?)", map(1));
+        assertWarns("UPDATE %s SET v = v + ? WHERE k = 4", map(1, FAIL_THRESHOLD + 1), FAIL_THRESHOLD);
+    }
+
+    @Override
+    protected String createTable(String query)
+    {
+        String table = super.createTable(query);
+        disableCompaction();
+        return table;
+    }
+
+    private void assertValid(String query, ByteBuffer collection) throws Throwable
+    {
+        assertValid(execute(query, collection));
+    }
+
+    private void assertWarns(String query, ByteBuffer collection, int numItems) throws Throwable
+    {
+        assertWarns(execute(query, collection),
+                    String.format("Detected collection v with %d items, this exceeds the warning threshold of %d.",
+                                  numItems, WARN_THRESHOLD));
+    }
+
+    private void assertFails(String query, ByteBuffer collection, int numItems) throws Throwable
+    {
+        assertFails(execute(query, collection),
+                    String.format("Detected collection v with %d items, this exceeds the failure threshold of %d.",
+                                  numItems, FAIL_THRESHOLD));
+    }
+
+    private CheckedFunction execute(String query, ByteBuffer collection)
+    {
+        return () -> execute(userClientState, query, Collections.singletonList(collection));
+    }
+
+    private static ByteBuffer set(int numElements)
+    {
+        return set(0, numElements);
+    }
+
+    private static ByteBuffer set(int startInclusive, int endExclusive)
+    {
+        return SetType.getInstance(Int32Type.instance, true)
+                      .decompose(collection(startInclusive, endExclusive, Collectors.toSet()));
+    }
+
+    private static ByteBuffer list(int numElements)
+    {
+        return list(0, numElements);
+    }
+
+    private static ByteBuffer list(int startInclusive, int endExclusive)
+    {
+        return ListType.getInstance(Int32Type.instance, false)
+                       .decompose(collection(startInclusive, endExclusive, Collectors.toList()));
+    }
+
+    private static ByteBuffer map(int numElements)
+    {
+        return map(0, numElements);
+    }
+
+    private static ByteBuffer map(int startInclusive, int endExclusive)
+    {
+        return MapType.getInstance(Int32Type.instance, Int32Type.instance, true)
+                      .decompose(collection(startInclusive, endExclusive, Collectors.toMap(x -> x, x -> x)));
+    }
+
+    private static <R, A> R collection(int startInclusive, int endExclusive, Collector<Integer, A, R> collector)
+    {
+        return IntStream.range(startInclusive, endExclusive).boxed().collect(collector);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailKeyspacesTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailKeyspacesTest.java
new file mode 100644
index 0000000..6c60093
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailKeyspacesTest.java
@@ -0,0 +1,118 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Test;
+
+import org.apache.cassandra.schema.Schema;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for the max number of user keyspaces, {@link Guardrails#keyspaces}.
+ */
+public class GuardrailKeyspacesTest extends ThresholdTester
+{
+    private static final int WARN_THRESHOLD = 3; // CQLTester creates two keyspaces
+    private static final int FAIL_THRESHOLD = WARN_THRESHOLD + 1;
+
+    public GuardrailKeyspacesTest()
+    {
+        super(WARN_THRESHOLD,
+              FAIL_THRESHOLD,
+              Guardrails.keyspaces,
+              Guardrails::setKeyspacesThreshold,
+              Guardrails::getKeyspacesWarnThreshold,
+              Guardrails::getKeyspacesFailThreshold);
+    }
+
+    @Override
+    protected long currentValue()
+    {
+        return Schema.instance.getUserKeyspaces().size();
+    }
+
+    @Test
+    public void testCreateKeyspace() throws Throwable
+    {
+        // create keyspaces until hitting the two warn/fail thresholds
+        String k1 = assertCreateKeyspaceValid();
+        String k2 = assertCreateKeyspaceWarns();
+        assertCreateKeyspaceFails();
+
+        // drop a keyspace and hit the warn/fail threshold again
+        dropKeyspace(k2);
+        String k3 = assertCreateKeyspaceWarns();
+        assertCreateKeyspaceFails();
+
+        // drop two keyspaces and hit the warn/fail threshold again
+        dropKeyspace(k1);
+        dropKeyspace(k3);
+        assertCreateKeyspaceValid();
+        assertCreateKeyspaceWarns();
+        assertCreateKeyspaceFails();
+
+        // test excluded users
+        testExcludedUsers(this::createKeyspaceQuery,
+                          this::createKeyspaceQuery,
+                          this::createKeyspaceQuery);
+    }
+
+    private void dropKeyspace(String keyspaceName)
+    {
+        schemaChange(format("DROP KEYSPACE %s", keyspaceName));
+    }
+
+    private String assertCreateKeyspaceValid() throws Throwable
+    {
+        String keyspaceName = createKeyspaceName();
+        assertMaxThresholdValid(createKeyspaceQuery(keyspaceName));
+        return keyspaceName;
+    }
+
+    private String assertCreateKeyspaceWarns() throws Throwable
+    {
+        String keyspaceName = createKeyspaceName();
+        assertThresholdWarns(createKeyspaceQuery(keyspaceName),
+                             format("Creating keyspace %s, current number of keyspaces %d exceeds warning threshold of %d",
+                                    keyspaceName, currentValue() + 1, WARN_THRESHOLD)
+        );
+        return keyspaceName;
+    }
+
+    private void assertCreateKeyspaceFails() throws Throwable
+    {
+        String keyspaceName = createKeyspaceName();
+        assertThresholdFails(createKeyspaceQuery(keyspaceName),
+                             format("Cannot have more than %d keyspaces, aborting the creation of keyspace %s",
+                                    FAIL_THRESHOLD, keyspaceName)
+        );
+    }
+
+    private String createKeyspaceQuery()
+    {
+        return createKeyspaceQuery(createKeyspaceName());
+    }
+
+    private String createKeyspaceQuery(String keyspaceName)
+    {
+        return format("CREATE KEYSPACE %s WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : 1 }",
+                      keyspaceName);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailMinimumReplicationFactorTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailMinimumReplicationFactorTest.java
new file mode 100644
index 0000000..d3df983
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailMinimumReplicationFactorTest.java
@@ -0,0 +1,276 @@
+/*
+ * 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.guardrails;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.locator.AbstractEndpointSnitch;
+import org.apache.cassandra.locator.IEndpointSnitch;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.service.StorageService;
+import org.assertj.core.api.Assertions;
+
+import static java.lang.String.format;
+import static org.junit.Assert.assertNotNull;
+
+public class GuardrailMinimumReplicationFactorTest extends ThresholdTester
+{
+    private static final int MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD = 4;
+    private static int MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD = 1;
+    private static final int DEFAULT_REPLICATION_FACTOR = 2;
+    private static final int DISABLED_GUARDRAIL = -1;
+    private static final String WHAT = "minimum_replication_factor";
+    private static final String DATACENTER1 = "datacenter1";
+    private static final String KS = "ks";
+    private final TriConsumer<Guardrails, Integer, Integer> setter;
+
+    public GuardrailMinimumReplicationFactorTest()
+    {
+        super(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD,
+              MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD,
+              Guardrails.minimumReplicationFactor,
+              Guardrails::setMinimumReplicationFactorThreshold,
+              Guardrails::getMinimumReplicationFactorWarnThreshold,
+              Guardrails::getMinimumReplicationFactorFailThreshold);
+
+        this.setter = Guardrails::setMinimumReplicationFactorThreshold;
+    }
+
+    @Before
+    public void setupTest() throws Throwable
+    {
+        DatabaseDescriptor.setDefaultKeyspaceRF(DEFAULT_REPLICATION_FACTOR);
+        MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD = 2;
+    }
+
+    @After
+    public void cleanupTest() throws Throwable
+    {
+        execute("DROP KEYSPACE IF EXISTS ks");
+    }
+
+    @Override
+    protected long currentValue()
+    {
+        return Long.parseLong((Keyspace.open(KS).getReplicationStrategy()).configOptions.get(DATACENTER1));
+    }
+
+    @Override
+    protected List<String> getWarnings()
+    {
+        List<String> warnings = ClientWarn.instance.getWarnings();
+
+        return warnings == null
+               ? Collections.emptyList()
+               : warnings.stream()
+                         .filter(w -> !w.contains("keyspace ks is higher than the number of nodes 1 for datacenter") &&
+                                      !w.contains("When increasing replication factor you need to run a full (-full) repair to distribute the data") &&
+                                      !w.contains("keyspace ks is higher than the number of nodes") &&
+                                      !w.contains("Your replication factor 4 for keyspace ks is higher than the number of nodes 2 for datacenter datacenter2"))
+                         .collect(Collectors.toList());
+    }
+
+    @Test
+    public void testConfigValidation()
+    {
+        assertNotNull(guardrail);
+        setter.accept(guardrails(), DISABLED_GUARDRAIL, DISABLED_GUARDRAIL);
+
+        assertInvalidPositiveIntProperty((g, a) -> setter.accept(g, DISABLED_GUARDRAIL, a), Integer.MIN_VALUE, Integer.MAX_VALUE, WHAT + "_fail_threshold");
+        assertInvalidPositiveIntProperty((g, a) -> setter.accept(g, DISABLED_GUARDRAIL, a), -2, Integer.MAX_VALUE, WHAT + "_fail_threshold");
+        assertValidProperty((g, a) -> setter.accept(g, DISABLED_GUARDRAIL, a), DISABLED_GUARDRAIL);
+        assertInvalidPositiveIntProperty((g, a) -> setter.accept(g, DISABLED_GUARDRAIL, a), 0, Integer.MAX_VALUE, WHAT + "_fail_threshold");
+        assertValidProperty((g, a) -> setter.accept(g, DISABLED_GUARDRAIL, a), 1);
+        assertValidProperty((g, a) -> setter.accept(g, DISABLED_GUARDRAIL, a), 2);
+
+        assertInvalidPositiveIntProperty((g, w) -> setter.accept(g, w, DISABLED_GUARDRAIL), Integer.MIN_VALUE, Integer.MAX_VALUE, WHAT + "_warn_threshold");
+        assertInvalidPositiveIntProperty((g, w) -> setter.accept(g, w, DISABLED_GUARDRAIL), -2, Integer.MAX_VALUE, WHAT + "_warn_threshold");
+        assertValidProperty((g, w) -> setter.accept(g, w, DISABLED_GUARDRAIL), DISABLED_GUARDRAIL);
+        assertInvalidPositiveIntProperty((g, w) -> setter.accept(g, w, DISABLED_GUARDRAIL), 0, Integer.MAX_VALUE, WHAT + "_warn_threshold");
+        assertValidProperty((g, w) -> setter.accept(g, w, DISABLED_GUARDRAIL), 1);
+        assertValidProperty((g, w) -> setter.accept(g, w, DISABLED_GUARDRAIL), 2);
+
+        Assertions.assertThatThrownBy(() -> setter.accept(guardrails(), 1, 2))
+                  .hasMessageContaining(guardrail.name + "_warn_threshold should be greater than the fail threshold");
+    }
+
+    @Test
+    public void testMinKeyspaceRFDisabled() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(DISABLED_GUARDRAIL, DISABLED_GUARDRAIL);
+        assertMinThresholdValid("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 1}");
+        assertMinThresholdValid("ALTER KEYSPACE ks WITH replication = { 'class' : 'NetworkTopologyStrategy', 'datacenter1': 3}");
+    }
+
+    @Test
+    public void testSimpleStrategy() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        assertWarns("CREATE KEYSPACE ks WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 3}",
+                    format("The keyspace %s has a replication factor of 3, below the warning threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD));
+        assertFails("ALTER KEYSPACE ks WITH replication = { 'class': 'SimpleStrategy', 'replication_factor': 1}",
+                    format("The keyspace %s has a replication factor of 1, below the failure threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD));
+    }
+
+    @Test
+    public void testMultipleDatacenter() throws Throwable
+    {
+        IEndpointSnitch snitch = DatabaseDescriptor.getEndpointSnitch();
+        DatabaseDescriptor.setEndpointSnitch(new AbstractEndpointSnitch()
+        {
+            public static final String RACK1 = ServerTestUtils.RACK1;
+
+            @Override
+            public String getRack(InetAddressAndPort endpoint) { return RACK1; }
+
+            @Override
+            public String getDatacenter(InetAddressAndPort endpoint) { return "datacenter2"; }
+
+            @Override
+            public int compareEndpoints(InetAddressAndPort target, Replica a1, Replica a2) { return 0; }
+        });
+
+        List<String> twoWarnings = Arrays.asList(format("The keyspace %s has a replication factor of 2, below the warning threshold of %d.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD),
+                                                 format("The keyspace %s has a replication factor of 2, below the warning threshold of %d.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD));
+        
+        StorageService.instance.getTokenMetadata().updateHostId(UUID.randomUUID(), InetAddressAndPort.getByName("127.0.0.255"));
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        assertValid("CREATE KEYSPACE ks WITH replication = { 'class' : 'NetworkTopologyStrategy', 'datacenter1': 4, 'datacenter2' : 4 };");
+        assertWarns("ALTER KEYSPACE ks WITH replication = { 'class' : 'NetworkTopologyStrategy', 'datacenter1': 4, 'datacenter2' : 2 };",
+                    format("The keyspace %s has a replication factor of 2, below the warning threshold of %d.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD));
+        assertWarns("ALTER KEYSPACE ks WITH replication = { 'class' : 'NetworkTopologyStrategy', 'datacenter1': 2, 'datacenter2' : 2 };", twoWarnings);
+        assertFails("ALTER KEYSPACE ks WITH replication = { 'class' : 'NetworkTopologyStrategy', 'datacenter1': 4, 'datacenter2' : 1 };",
+                    format("The keyspace %s has a replication factor of 1, below the failure threshold of %d.", KS, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD));
+        assertFails("CREATE KEYSPACE ks1 WITH replication = { 'class' : 'NetworkTopologyStrategy', 'datacenter1': 1, 'datacenter2' : 1 };",
+                    format("The keyspace ks1 has a replication factor of 1, below the failure threshold of %d.", MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD));
+
+        DatabaseDescriptor.setEndpointSnitch(snitch);
+        execute("DROP KEYSPACE IF EXISTS ks1");
+    }
+
+    @Test
+    public void testMinKeyspaceRFOnlyWarnAbove() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, DISABLED_GUARDRAIL);
+        assertMinThresholdValid("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 6}");
+        assertMinThresholdValid("ALTER KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 5}");
+    }
+
+    @Test
+    public void testMinKeyspaceRFOnlyWarnBelow() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, DISABLED_GUARDRAIL);
+        assertWarns("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 3}",
+                    format("The keyspace %s has a replication factor of 3, below the warning threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD));
+        assertWarns("ALTER KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 2}",
+                    format("The keyspace %s has a replication factor of 2, below the warning threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD));
+    }
+
+    @Test
+    public void testMinKeyspaceRFOnlyFailAbove() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(DISABLED_GUARDRAIL, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        assertMinThresholdValid("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 4}");
+        assertMinThresholdValid("ALTER KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 2}");
+    }
+
+    @Test
+    public void testMinKeyspaceRFOnlyFailBelow() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(DISABLED_GUARDRAIL, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        assertFails("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 1}",
+                    format("The keyspace %s has a replication factor of 1, below the failure threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD));
+    }
+
+    @Test
+    public void testMinKeyspaceRFOnlyFailBelowAlter() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(DISABLED_GUARDRAIL, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        execute("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 3}");
+        assertFails("ALTER KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 1}",
+                    format("The keyspace %s has a replication factor of 1, below the failure threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD));
+    }
+
+    @Test
+    public void testMinKeyspaceRFWarnAbove() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        assertMinThresholdValid("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 6}");
+        assertMinThresholdValid("ALTER KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 5}");
+    }
+
+    @Test
+    public void testMinKeyspaceRFWarnFailBetween() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        assertWarns("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 3}",
+                    format("The keyspace %s has a replication factor of 3, below the warning threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD));
+        assertWarns("ALTER KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 2}",
+                    format("The keyspace %s has a replication factor of 2, below the warning threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD));
+    }
+
+    @Test
+    public void testMinKeyspaceRFFailBelow() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        assertFails("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 1}",
+                    format("The keyspace %s has a replication factor of 1, below the failure threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD));
+    }
+
+    @Test
+    public void testMinKeyspaceRFFailBelowAlter() throws Throwable
+    {
+        guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        execute("CREATE KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 4}");
+        assertFails("ALTER KEYSPACE ks WITH replication = { 'class': 'NetworkTopologyStrategy', 'datacenter1': 1}",
+                    format("The keyspace %s has a replication factor of 1, below the failure threshold of %s.", KS, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD));
+    }
+
+    @Test
+    public void testMinRFGreaterThanDefaultRF()
+    {
+        try
+        {
+            DatabaseDescriptor.setDefaultKeyspaceRF(1);
+            guardrails().setMinimumReplicationFactorThreshold(MINIMUM_REPLICATION_FACTOR_WARN_THRESHOLD, MINIMUM_REPLICATION_FACTOR_FAIL_THRESHOLD);
+        }
+        catch (IllegalArgumentException e)
+        {
+            String expectedMessage = "";
+
+            if(guardrails().getMinimumReplicationFactorFailThreshold() > DatabaseDescriptor.getDefaultKeyspaceRF())
+                expectedMessage = format("%s_fail_threshold to be set (%d) cannot be greater than default_keyspace_rf (%d)",
+                                         WHAT, guardrails().getMinimumReplicationFactorFailThreshold(), DatabaseDescriptor.getDefaultKeyspaceRF());
+            Assertions.assertThat(e.getMessage()).contains(expectedMessage);
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailNewCompactStorageTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailNewCompactStorageTest.java
new file mode 100644
index 0000000..ce786ed
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailNewCompactStorageTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.guardrails;
+
+import org.junit.Test;
+
+public class GuardrailNewCompactStorageTest extends GuardrailTester
+{
+    private void setGuardrail(boolean enabled)
+    {
+        Guardrails.instance.setCompactTablesEnabled(enabled);
+    }
+
+    @Test
+    public void testFeatureEnabled() throws Throwable
+    {
+        setGuardrail(true);
+        assertValid("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck)) WITH COMPACT STORAGE");
+    }
+
+    @Test
+    public void testFeatureDisabled() throws Throwable
+    {
+        setGuardrail(false);
+        assertFails("CREATE TABLE " + KEYSPACE + ".tbl (pk int, ck int, v int, PRIMARY KEY (pk, ck)) WITH COMPACT STORAGE",
+                    "Creation of new COMPACT STORAGE tables");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailPageSizeTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailPageSizeTest.java
new file mode 100644
index 0000000..68122f2
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailPageSizeTest.java
@@ -0,0 +1,147 @@
+/*
+ * 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.guardrails;
+
+import java.util.Collections;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLStatement;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.transport.ProtocolVersion;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for the page size, {@link Guardrails#pageSize}.
+ */
+public class GuardrailPageSizeTest extends ThresholdTester
+{
+    private static final int PAGE_SIZE_WARN_THRESHOLD = 5;
+    private static final int PAGE_SIZE_FAIL_THRESHOLD = 10;
+
+    public GuardrailPageSizeTest()
+    {
+        super(PAGE_SIZE_WARN_THRESHOLD,
+              PAGE_SIZE_FAIL_THRESHOLD,
+              Guardrails.pageSize,
+              Guardrails::setPageSizeThreshold,
+              Guardrails::getPageSizeWarnThreshold,
+              Guardrails::getPageSizeFailThreshold);
+    }
+
+    @Before
+    public void setupTest()
+    {
+        createTable("CREATE TABLE IF NOT EXISTS %s (k INT, c INT, v TEXT, PRIMARY KEY(k, c))");
+    }
+
+    @Test
+    public void testSelectStatementAgainstPageSize() throws Throwable
+    {
+        // regular query
+        String query = "SELECT * FROM %s";
+        assertPagingValid(query, 3);
+        assertPagingValid(query, PAGE_SIZE_WARN_THRESHOLD);
+        assertPagingWarns(query, 6);
+        assertPagingWarns(query, PAGE_SIZE_FAIL_THRESHOLD);
+        assertPagingFails(query, 11);
+
+        // aggregation query
+        query = "SELECT COUNT(*) FROM %s WHERE k=0";
+        assertPagingValid(query, 3);
+        assertPagingValid(query, PAGE_SIZE_WARN_THRESHOLD);
+        assertPagingWarns(query, 6);
+        assertPagingWarns(query, PAGE_SIZE_FAIL_THRESHOLD);
+        assertPagingFails(query, 11);
+
+        // query with limit over thresholds
+        query = "SELECT * FROM %s LIMIT 100";
+        assertPagingValid(query, 3);
+        assertPagingValid(query, PAGE_SIZE_WARN_THRESHOLD);
+        assertPagingWarns(query, 6);
+        assertPagingWarns(query, PAGE_SIZE_FAIL_THRESHOLD);
+        assertPagingFails(query, 11);
+
+        // query with limit under thresholds
+        query = "SELECT * FROM %s LIMIT 1";
+        assertPagingValid(query, 3);
+        assertPagingValid(query, PAGE_SIZE_WARN_THRESHOLD);
+        assertPagingValid(query, 6);
+        assertPagingValid(query, PAGE_SIZE_FAIL_THRESHOLD);
+        assertPagingValid(query, 11);
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        assertPagingIgnored("SELECT * FROM %s", PAGE_SIZE_WARN_THRESHOLD + 1);
+        assertPagingIgnored("SELECT * FROM %s", PAGE_SIZE_FAIL_THRESHOLD + 1);
+    }
+
+    private void assertPagingValid(String query, int pageSize) throws Throwable
+    {
+        assertValid(() -> executeWithPaging(userClientState, query, pageSize));
+    }
+
+    private void assertPagingIgnored(String query, int pageSize) throws Throwable
+    {
+        assertValid(() -> executeWithPaging(superClientState, query, pageSize));
+        assertValid(() -> executeWithPaging(systemClientState, query, pageSize));
+    }
+
+    private void assertPagingWarns(String query, int pageSize) throws Throwable
+    {
+        assertWarns(() -> executeWithPaging(userClientState, query, pageSize),
+                    format("Query for table %s with page size %s exceeds warning threshold of %s.",
+                           currentTable(), pageSize, PAGE_SIZE_WARN_THRESHOLD));
+    }
+
+    private void assertPagingFails(String query, int pageSize) throws Throwable
+    {
+        assertFails(() -> executeWithPaging(userClientState, query, pageSize),
+                    format("Aborting query for table %s, page size %s exceeds fail threshold of %s.",
+                           currentTable(), pageSize, PAGE_SIZE_FAIL_THRESHOLD));
+    }
+
+    private void executeWithPaging(ClientState state, String query, int pageSize)
+    {
+        QueryState queryState = new QueryState(state);
+
+        String formattedQuery = formatQuery(query);
+        CQLStatement statement = QueryProcessor.parseStatement(formattedQuery, queryState.getClientState());
+        statement.validate(state);
+
+        QueryOptions options = QueryOptions.create(ConsistencyLevel.ONE,
+                                                   Collections.emptyList(),
+                                                   false,
+                                                   pageSize,
+                                                   null,
+                                                   null,
+                                                   ProtocolVersion.CURRENT,
+                                                   KEYSPACE);
+
+        statement.executeLocally(queryState, options);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailPartitionKeysInSelectTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailPartitionKeysInSelectTest.java
new file mode 100644
index 0000000..d4b913e
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailPartitionKeysInSelectTest.java
@@ -0,0 +1,70 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Before;
+import org.junit.Test;
+
+public class GuardrailPartitionKeysInSelectTest extends ThresholdTester
+{
+    private static final int PARTITION_KEYS_SELECT_WARN_THRESHOLD = 3;
+    private static final int PARTITION_KEYS_SELECT_FAIL_THRESHOLD = 5;
+    private String tableName;
+
+    public GuardrailPartitionKeysInSelectTest()
+    {
+        super(PARTITION_KEYS_SELECT_WARN_THRESHOLD,
+              PARTITION_KEYS_SELECT_FAIL_THRESHOLD,
+              Guardrails.partitionKeysInSelect,
+              Guardrails::setPartitionKeysInSelectThreshold,
+              Guardrails::getPartitionKeysInSelectWarnThreshold,
+              Guardrails::getPartitionKeysInSelectFailThreshold);
+    }
+
+    @Before
+    public void setupTest()
+    {
+        tableName = createTable("CREATE TABLE %s (k INT, c INT, v TEXT, PRIMARY KEY(k, c))");
+    }
+
+    @Test
+    public void testSelectStatementAgainstInClausePartitionKeys() throws Throwable
+    {
+        assertValid("SELECT k, c, v FROM %s WHERE k=10");
+
+        assertValid("SELECT k, c, v FROM %s WHERE k IN (2, 3)");
+
+        assertValid("SELECT k, c, v FROM %s WHERE k = 2 and c IN (2, 3, 4, 5, 6, 7)");
+
+        assertWarns("SELECT k, c, v FROM %s WHERE k IN (2, 3, 4, 5)",
+                    String.format("Query with partition keys in IN clause on table %s, with " +
+                                  "number of partition keys 4 exceeds warning threshold of 3.", tableName));
+
+        assertFails("SELECT k, c, v FROM %s WHERE k IN (2, 3, 4, 5, 6, 7)",
+                    String.format("Aborting query with partition keys in IN clause on table %s, " +
+                                  "number of partition keys 6 exceeds fail threshold of 5.", tableName));
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        testExcludedUsers(() -> "SELECT k, c, v FROM %s WHERE k IN (2, 3, 4, 5)",
+                          () -> "SELECT k, c, v FROM %s WHERE k IN (2, 3, 4, 5, 6, 7)");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailReadBeforeWriteListOperationsTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailReadBeforeWriteListOperationsTest.java
new file mode 100644
index 0000000..8184fa6
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailReadBeforeWriteListOperationsTest.java
@@ -0,0 +1,182 @@
+/*
+ * 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.guardrails;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ * Tests the guardrail for read-before-write list operations, {@link Guardrails#readBeforeWriteListOperationsEnabled}.
+ */
+@RunWith(Parameterized.class)
+public class GuardrailReadBeforeWriteListOperationsTest extends GuardrailTester
+{
+    @Parameterized.Parameter
+    public boolean enabled;
+
+    @Parameterized.Parameters(name = "read_before_write_list_operations_enabled={0}")
+    public static Collection<Object> data()
+    {
+        return Arrays.asList(false, true);
+    }
+
+    public GuardrailReadBeforeWriteListOperationsTest()
+    {
+        super(Guardrails.readBeforeWriteListOperationsEnabled);
+    }
+
+    @Before
+    public void before()
+    {
+        guardrails().setReadBeforeWriteListOperationsEnabled(enabled);
+        Assert.assertEquals(enabled, guardrails().getReadBeforeWriteListOperationsEnabled());
+
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, l list<int>)");
+    }
+
+    @Test
+    public void tesInsertFullValue() throws Throwable
+    {
+        // insert from scratch
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2])");
+        assertRows(row(0, list(1, 2)));
+
+        // insert overriding previous value
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [2, 3])");
+        assertRows(row(0, list(2, 3)));
+    }
+
+    @Test
+    public void testUpdateFullValue() throws Throwable
+    {
+        // update from scratch
+        assertValid("UPDATE %s SET l = [1, 2] WHERE k = 0");
+        assertRows(row(0, list(1, 2)));
+
+        // update overriding previous value
+        assertValid("UPDATE %s SET l = [2, 3] WHERE k = 0");
+        assertRows(row(0, list(2, 3)));
+    }
+
+    @Test
+    public void testDeleteFullValue() throws Throwable
+    {
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2])");
+        assertValid("DELETE l FROM %s WHERE k = 0");
+        assertRows(row(0, null));
+    }
+
+    @Test
+    public void testAppend() throws Throwable
+    {
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2])");
+        assertValid("UPDATE %s SET l = l + [3, 4] WHERE k = 0");
+        assertRows(row(0, list(1, 2, 3, 4)));
+    }
+
+    @Test
+    public void testPrepend() throws Throwable
+    {
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2])");
+        assertValid("UPDATE %s SET l = [3, 4] + l WHERE k = 0");
+        assertRows(row(0, list(3, 4, 1, 2)));
+    }
+
+    @Test
+    public void testUpdateByIndex() throws Throwable
+    {
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2, 3])");
+        testGuardrail("UPDATE %s SET l[1] = 4 WHERE k = 0",
+                      "Setting of list items by index requiring read before write is not allowed",
+                      row(0, list(1, 4, 3)));
+    }
+
+    @Test
+    public void testDeleteByIndex() throws Throwable
+    {
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2, 3])");
+        testGuardrail("DELETE l[1] FROM %s WHERE k = 0",
+                      "Removal of list items by index requiring read before write is not allowed",
+                      row(0, list(1, 3)));
+    }
+
+    @Test
+    public void testDeleteByItem() throws Throwable
+    {
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2, 3])");
+        testGuardrail("UPDATE %s SET l = l - [2] WHERE k = 0",
+                      "Removal of list items requiring read before write is not allowed",
+                      row(0, list(1, 3)));
+    }
+
+    @Test
+    public void testBatch() throws Throwable
+    {
+        assertValid("INSERT INTO %s (k, l) VALUES (0, [1, 2, 3])");
+
+        testGuardrail("BEGIN BATCH UPDATE %s SET l[1] = 0 WHERE k = 0; APPLY BATCH",
+                      "Setting of list items by index requiring read before write is not allowed",
+                      row(0, list(1, 0, 3)));
+
+        testGuardrail("BEGIN BATCH DELETE l[1] FROM %s WHERE k = 0; APPLY BATCH",
+                      "Removal of list items by index requiring read before write is not allowed",
+                      row(0, list(1, 3)));
+
+        testGuardrail("BEGIN BATCH UPDATE %s SET l = l - [3] WHERE k = 0; APPLY BATCH",
+                      "Removal of list items requiring read before write is not allowed",
+                      row(0, list(1)));
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        testExcludedUsers(() -> "INSERT INTO %s (k, l) VALUES (0, [1, 2, 3, 4, 5])",
+                          () -> "UPDATE %s SET l[1] = 4 WHERE k = 0",
+                          () -> "DELETE l[1] FROM %s WHERE k = 0",
+                          () -> "INSERT INTO %s (k, l) VALUES (0, [1, 2, 3])",
+                          () -> "UPDATE %s SET l = l - [2] WHERE k = 0",
+                          () -> "BEGIN BATCH UPDATE %s SET l[1] = 0 WHERE k = 0; APPLY BATCH",
+                          () -> "BEGIN BATCH DELETE l[1] FROM %s WHERE k = 0; APPLY BATCH",
+                          () -> "BEGIN BATCH UPDATE %s SET l = l - [3] WHERE k = 0; APPLY BATCH");
+    }
+
+    private void testGuardrail(String query, String expectedMessage, Object[]... rows) throws Throwable
+    {
+        if (enabled)
+        {
+            assertValid(query);
+            assertRows(rows);
+        }
+        else
+        {
+            assertFails(query, expectedMessage);
+        }
+    }
+
+    private void assertRows(Object[]... rows) throws Throwable
+    {
+        assertRowsNet(executeNet("SELECT * FROM %s"), rows);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailReadConsistencyLevelsTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailReadConsistencyLevelsTest.java
new file mode 100644
index 0000000..2d189a2
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailReadConsistencyLevelsTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Test;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+
+import static java.lang.String.format;
+import static org.apache.cassandra.db.ConsistencyLevel.ALL;
+import static org.apache.cassandra.db.ConsistencyLevel.EACH_QUORUM;
+import static org.apache.cassandra.db.ConsistencyLevel.LOCAL_ONE;
+import static org.apache.cassandra.db.ConsistencyLevel.LOCAL_QUORUM;
+import static org.apache.cassandra.db.ConsistencyLevel.ONE;
+import static org.apache.cassandra.db.ConsistencyLevel.QUORUM;
+
+/**
+ * Tests the guardrail for read consistency levels, {@link Guardrails#readConsistencyLevels}.
+ */
+public class GuardrailReadConsistencyLevelsTest extends GuardrailConsistencyLevelsTester
+{
+    public GuardrailReadConsistencyLevelsTest()
+    {
+        super("read_consistency_levels_warned",
+              "read_consistency_levels_disallowed",
+              Guardrails.readConsistencyLevels,
+              Guardrails::getReadConsistencyLevelsWarned,
+              Guardrails::getReadConsistencyLevelsDisallowed,
+              Guardrails::getReadConsistencyLevelsWarnedCSV,
+              Guardrails::getReadConsistencyLevelsDisallowedCSV,
+              Guardrails::setReadConsistencyLevelsWarned,
+              Guardrails::setReadConsistencyLevelsDisallowed,
+              Guardrails::setReadConsistencyLevelsWarnedCSV,
+              Guardrails::setReadConsistencyLevelsDisallowedCSV);
+    }
+
+    @Test
+    public void testSelect() throws Throwable
+    {
+        createTable("CREATE TABLE IF NOT EXISTS %s (k INT, c INT, v INT, PRIMARY KEY(k, c))");
+
+        execute("INSERT INTO %s (k, c, v) VALUES (0, 0, 0)");
+        execute("INSERT INTO %s (k, c, v) VALUES (0, 1, 1)");
+        execute("INSERT INTO %s (k, c, v) VALUES (1, 0, 2)");
+        execute("INSERT INTO %s (k, c, v) VALUES (1, 1, 3)");
+
+        testQuery("SELECT * FROM %s");
+        testQuery("SELECT * FROM %s WHERE k = 0");
+        testQuery("SELECT * FROM %s WHERE k = 0 AND c = 0");
+    }
+
+    private void testQuery(String query) throws Throwable
+    {
+        testQuery(query, ONE);
+        testQuery(query, ALL);
+        testQuery(query, QUORUM);
+        testQuery(query, EACH_QUORUM);
+        testQuery(query, LOCAL_ONE);
+        testQuery(query, LOCAL_QUORUM);
+    }
+
+    private void testQuery(String query, ConsistencyLevel cl) throws Throwable
+    {
+        warnConsistencyLevels();
+        disableConsistencyLevels();
+        assertValid(query, cl);
+
+        warnConsistencyLevels(cl);
+        assertWarns(query, cl);
+
+        disableConsistencyLevels(cl);
+        assertFails(query, cl);
+    }
+
+    private void assertValid(String query, ConsistencyLevel cl) throws Throwable
+    {
+        assertValid(() -> execute(userClientState, query, cl));
+    }
+
+    private void assertWarns(String query, ConsistencyLevel cl) throws Throwable
+    {
+        assertWarns(() -> execute(userClientState, query, cl),
+                    format("Provided values [%s] are not recommended for read consistency levels (warned values are: %s)",
+                           cl, guardrails().getReadConsistencyLevelsWarned()));
+
+        assertExcludedUsers(query, cl);
+    }
+
+    private void assertFails(String query, ConsistencyLevel cl) throws Throwable
+    {
+        assertFails(() -> execute(userClientState, query, cl),
+                    format("Provided values [%s] are not allowed for read consistency levels (disallowed values are: %s)",
+                           cl, guardrails().getReadConsistencyLevelsDisallowed()));
+
+        assertExcludedUsers(query, cl);
+    }
+
+    private void assertExcludedUsers(String query, ConsistencyLevel cl) throws Throwable
+    {
+        assertValid(() -> execute(superClientState, query, cl));
+        assertValid(() -> execute(systemClientState, query, cl));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailSecondaryIndexTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailSecondaryIndexTest.java
new file mode 100644
index 0000000..910bd01
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailSecondaryIndexTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for disabling user creation of secondary indexes, {@link Guardrails#setSecondaryIndexesEnabled(boolean)}.
+ */
+public class GuardrailSecondaryIndexTest extends GuardrailTester
+{
+    public GuardrailSecondaryIndexTest()
+    {
+        super(Guardrails.createSecondaryIndexesEnabled);
+    }
+
+    @Before
+    public void setupTest()
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int, v4 int)");
+    }
+
+    private void setGuardrail(boolean enabled)
+    {
+        guardrails().setSecondaryIndexesEnabled(enabled);
+    }
+
+    @Test
+    public void testCreateIndex() throws Throwable
+    {
+        setGuardrail(true);
+        assertValid(String.format("CREATE INDEX %s ON %s.%s(%s)", "v1_idx", keyspace(), currentTable(), "v1"));
+        assertValid(String.format("CREATE INDEX %s ON %s.%s(%s)", "v2_idx", keyspace(), currentTable(), "v2"));
+
+        setGuardrail(false);
+        assertFails(String.format("CREATE INDEX %s ON %s.%s(%s)", "v3_idx", keyspace(), currentTable(), "v3"), "Creating secondary indexes");
+        assertFails(String.format("CREATE INDEX %s ON %s.%s(%s)", "v4_idx", keyspace(), currentTable(), "v4"), "Creating secondary indexes");
+        assertFails(String.format("CREATE INDEX %s ON %s.%s(%s)", "v2_idx", keyspace(), currentTable(), "v2"), "Creating secondary indexes");
+
+        setGuardrail(true);
+        assertValid(String.format("CREATE INDEX %s ON %s.%s(%s)", "v3_idx", keyspace(), currentTable(), "v3"));
+        assertValid(String.format("CREATE INDEX %s ON %s.%s(%s)", "v4_idx", keyspace(), currentTable(), "v4"));
+
+        // Confirm can drop in either state
+        setGuardrail(false);
+        dropIndex(format("DROP INDEX %s.%s", keyspace(), "v1_idx"));
+
+        setGuardrail(true);
+        dropIndex(format("DROP INDEX %s.%s", keyspace(), "v2_idx"));
+    }
+
+    @Test
+    public void testCustomIndex() throws Throwable
+    {
+        // 2i guardrail will also affect custom indexes
+        setGuardrail(false);
+        assertFails(format("CREATE CUSTOM INDEX ON %%s (%s) USING 'org.apache.cassandra.index.sasi.SASIIndex'", "v4"),
+                    format("Creating secondary indexes", currentTable())
+        );
+
+        // Confirm custom creation will work on flip
+        setGuardrail(true);
+        assertValid(format("CREATE CUSTOM INDEX ON %%s (%s) USING 'org.apache.cassandra.index.sasi.SASIIndex'", "v4"));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailSecondaryIndexesPerTableTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailSecondaryIndexesPerTableTest.java
new file mode 100644
index 0000000..628aead
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailSecondaryIndexesPerTableTest.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.guardrails;
+
+import com.google.common.base.Strings;
+import org.junit.Test;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for the number of secondary indexes in a table, {@link Guardrails#secondaryIndexesPerTable}.
+ */
+public class GuardrailSecondaryIndexesPerTableTest extends ThresholdTester
+{
+    private static final int INDEXES_PER_TABLE_WARN_THRESHOLD = 1;
+    private static final int INDEXES_PER_TABLE_FAIL_THRESHOLD = 3;
+
+    public GuardrailSecondaryIndexesPerTableTest()
+    {
+        super(INDEXES_PER_TABLE_WARN_THRESHOLD,
+              INDEXES_PER_TABLE_FAIL_THRESHOLD,
+              Guardrails.secondaryIndexesPerTable,
+              Guardrails::setSecondaryIndexesPerTableThreshold,
+              Guardrails::getSecondaryIndexesPerTableWarnThreshold,
+              Guardrails::getSecondaryIndexesPerTableFailThreshold);
+    }
+
+    @Override
+    protected long currentValue()
+    {
+        return getCurrentColumnFamilyStore().indexManager.listIndexes().size();
+    }
+
+    @Test
+    public void testCreateIndex() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int, v4 int)");
+        assertCreateIndexSucceeds("v1", "v1_idx");
+        assertCurrentValue(1);
+
+        assertCreateIndexWarns("v2", "");
+        assertCreateIndexWarns("v3", "v3_idx");
+        assertCreateIndexFails("v4", "");
+        assertCreateIndexFails("v2", "v2_idx");
+        assertCurrentValue(3);
+
+        // 2i guardrail will also affect custom indexes
+        assertCreateCustomIndexFails("v2");
+
+        // drop the two first indexes, we should be able to create new indexes again
+        dropIndex(format("DROP INDEX %s.%s", keyspace(), "v3_idx"));
+        assertCurrentValue(2);
+
+        assertCreateIndexWarns("v3", "");
+        assertCreateCustomIndexFails("v4");
+        assertCurrentValue(3);
+
+        // previous guardrail should not apply to another base table
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int, v3 int, v4 int)");
+        assertCreateIndexSucceeds("v4", "");
+        assertCreateIndexWarns("v3", "");
+        assertCreateIndexWarns("v2", "");
+        assertCreateIndexFails("v1", "");
+        assertCurrentValue(3);
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int primary key, v1 int, v2 int)");
+        testExcludedUsers(() -> "CREATE INDEX excluded_1 ON %s(v1)",
+                          () -> "CREATE INDEX excluded_2 ON %s(v2)",
+                          () -> "DROP INDEX excluded_1",
+                          () -> "DROP INDEX excluded_2");
+    }
+
+    private void assertCreateIndexSucceeds(String column, String indexName) throws Throwable
+    {
+        assertMaxThresholdValid(format("CREATE INDEX %s ON %s.%s(%s)", indexName, keyspace(), currentTable(), column));
+    }
+
+    private void assertCreateIndexWarns(String column, String indexName) throws Throwable
+    {
+        assertThresholdWarns(format("CREATE INDEX %s ON %%s(%s)", indexName, column),
+                             format("Creating secondary index %son table %s, current number of indexes %s exceeds warning threshold of %s.",
+                                    (Strings.isNullOrEmpty(indexName) ? "" : indexName + " "),
+                                    currentTable(),
+                                    currentValue() + 1,
+                                    guardrails().getSecondaryIndexesPerTableWarnThreshold())
+        );
+    }
+
+    private void assertCreateIndexFails(String column, String indexName) throws Throwable
+    {
+        assertThresholdFails(format("CREATE INDEX %s ON %%s(%s)", indexName, column),
+                             format("aborting the creation of secondary index %son table %s",
+                                    Strings.isNullOrEmpty(indexName) ? "" : indexName + " ", currentTable())
+        );
+    }
+
+    private void assertCreateCustomIndexFails(String column) throws Throwable
+    {
+        assertThresholdFails(format("CREATE CUSTOM INDEX ON %%s (%s) USING 'org.apache.cassandra.index.sasi.SASIIndex'", column),
+                             format("aborting the creation of secondary index on table %s", currentTable())
+        );
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailTablePropertiesTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailTablePropertiesTest.java
new file mode 100644
index 0000000..5754c51
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailTablePropertiesTest.java
@@ -0,0 +1,224 @@
+/*
+ * 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.guardrails;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.statements.schema.TableAttributes;
+
+import static java.lang.String.format;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * Tests the guardrail for table properties, {@link Guardrails#tableProperties}.
+ */
+public class GuardrailTablePropertiesTest extends GuardrailTester
+{
+    private static final String CREATE_TABLE = "CREATE TABLE %s.%s(pk int, ck int, v int, PRIMARY KEY(pk, ck)) %s";
+    private static final String CREATE_VIEW = "CREATE MATERIALIZED VIEW %s.%s as SELECT * FROM %s.%s " +
+                                              "WHERE pk IS NOT null and ck IS NOT null PRIMARY KEY(ck, pk) %s";
+    private static final String ALTER_VIEW = "ALTER MATERIALIZED VIEW %s.%s WITH %s";
+
+    private static final String WARNED_PROPERTY_NAME = "table_properties_warned";
+    private static final String IGNORED_PROPERTY_NAME = "table_properties_ignored";
+    private static final String DISALLOWED_PROPERTY_NAME = "table_properties_disallowed";
+
+    public GuardrailTablePropertiesTest()
+    {
+        super(Guardrails.tableProperties);
+    }
+
+    @Before
+    public void before()
+    {
+        // only allow "gc_grace_seconds", "comments" and "default_time_to_live"
+        Set<String> allowed = new HashSet<>(Arrays.asList("gc_grace_seconds", "comment", "default_time_to_live"));
+        guardrails().setTablePropertiesDisallowed(TableAttributes.validKeywords()
+                                                                 .stream()
+                                                                 .filter(p -> !allowed.contains(p))
+                                                                 .map(String::toUpperCase)
+                                                                 .collect(Collectors.toSet()));
+        // but actually ignore "comment" and warn about "default_time_to_live"
+        guardrails().setTablePropertiesIgnored("comment");
+        guardrails().setTablePropertiesWarned("default_time_to_live");
+    }
+
+    @Test
+    public void testConfigValidation()
+    {
+        String message = "Invalid value for %s: null is not allowed";
+        assertInvalidProperty(Guardrails::setTablePropertiesWarned, (Set<String>) null, message, WARNED_PROPERTY_NAME);
+        assertInvalidProperty(Guardrails::setTablePropertiesIgnored, (Set<String>) null, message, IGNORED_PROPERTY_NAME);
+        assertInvalidProperty(Guardrails::setTablePropertiesDisallowed, (Set<String>) null, message, DISALLOWED_PROPERTY_NAME);
+
+        assertValidProperty(Collections.emptySet());
+        assertValidProperty(TableAttributes.allKeywords());
+
+        assertValidPropertyCSV("");
+        assertValidPropertyCSV(String.join(",", TableAttributes.allKeywords()));
+
+        assertInvalidProperty(Collections.singleton("invalid"), Collections.singleton("invalid"));
+        assertInvalidProperty(ImmutableSet.of("comment", "invalid1", "invalid2"), ImmutableSet.of("invalid1", "invalid2"));
+        assertInvalidProperty(ImmutableSet.of("invalid1", "invalid2", "comment"), ImmutableSet.of("invalid1", "invalid2"));
+        assertInvalidProperty(ImmutableSet.of("invalid1", "comment", "invalid2"), ImmutableSet.of("invalid1", "invalid2"));
+
+        assertInvalidPropertyCSV("invalid", "[invalid]");
+        assertInvalidPropertyCSV("comment,invalid1,invalid2", "[invalid1, invalid2]");
+        assertInvalidPropertyCSV("invalid1,invalid2,comment", "[invalid1, invalid2]");
+        assertInvalidPropertyCSV("invalid1,comment,invalid2", "[invalid1, invalid2]");
+    }
+
+    private void assertValidProperty(Set<String> properties)
+    {
+        assertValidProperty(Guardrails::setTablePropertiesWarned, Guardrails::getTablePropertiesWarned, properties);
+        assertValidProperty(Guardrails::setTablePropertiesIgnored, Guardrails::getTablePropertiesIgnored, properties);
+        assertValidProperty(Guardrails::setTablePropertiesDisallowed, Guardrails::getTablePropertiesDisallowed, properties);
+    }
+
+    private void assertValidPropertyCSV(String csv)
+    {
+        csv = sortCSV(csv);
+        assertValidProperty(Guardrails::setTablePropertiesWarnedCSV, g -> sortCSV(g.getTablePropertiesWarnedCSV()), csv);
+        assertValidProperty(Guardrails::setTablePropertiesIgnoredCSV, g -> sortCSV(g.getTablePropertiesIgnoredCSV()), csv);
+        assertValidProperty(Guardrails::setTablePropertiesDisallowedCSV, g -> sortCSV(g.getTablePropertiesDisallowedCSV()), csv);
+    }
+
+    private void assertInvalidProperty(Set<String> properties, Set<String> rejected)
+    {
+        String message = "Invalid value for %s: '%s' do not parse as valid table properties";
+        assertInvalidProperty(Guardrails::setTablePropertiesWarned, properties, message, WARNED_PROPERTY_NAME, rejected);
+        assertInvalidProperty(Guardrails::setTablePropertiesIgnored, properties, message, IGNORED_PROPERTY_NAME, rejected);
+        assertInvalidProperty(Guardrails::setTablePropertiesDisallowed, properties, message, DISALLOWED_PROPERTY_NAME, rejected);
+    }
+
+    private void assertInvalidPropertyCSV(String properties, String rejected)
+    {
+        String message = "Invalid value for %s: '%s' do not parse as valid table properties";
+        assertInvalidProperty(Guardrails::setTablePropertiesWarnedCSV, properties, message, WARNED_PROPERTY_NAME, rejected);
+        assertInvalidProperty(Guardrails::setTablePropertiesIgnoredCSV, properties, message, IGNORED_PROPERTY_NAME, rejected);
+        assertInvalidProperty(Guardrails::setTablePropertiesDisallowedCSV, properties, message, DISALLOWED_PROPERTY_NAME, rejected);
+    }
+
+    @Test
+    public void testTableProperties() throws Throwable
+    {
+        // most table properties are not allowed
+        assertValid(this::createTableWithProperties);
+        assertFails(() -> createTableWithProperties("with id = " + UUID.randomUUID()), "[id]");
+        assertFails(() -> createTableWithProperties("with compression = { 'enabled': 'false' }"), "[compression]");
+        assertFails(() -> createTableWithProperties("with compression = { 'enabled': 'false' } AND id = " + UUID.randomUUID()), "[compression, id]");
+        assertFails(() -> createTableWithProperties("with compaction = { 'class': 'SizeTieredCompactionStrategy' }"), "[compaction]");
+        assertFails(() -> createTableWithProperties("with gc_grace_seconds = 1000 and compression = { 'enabled': 'false' }"), "[compression]");
+
+        // though gc_grace_seconds alone is
+        assertValid(() -> createTableWithProperties("with gc_grace_seconds = 1000"));
+
+        // and comment is "ignored". So it should warn, and getting the comment on the created table should be empty,
+        // not the one we set.
+        AtomicReference<String> tableName = new AtomicReference<>();
+        assertWarns(() -> tableName.set(createTableWithProperties("with comment = 'my table'")), "[comment]");
+        assertEquals("", executeNet("SELECT comment FROM system_schema.tables WHERE keyspace_name=? AND table_name=?",
+                                    keyspace(),
+                                    tableName.get()).one().getString("comment"));
+
+        // default_time_to_live is "warned". So it should warn, and getting the default ttl on the created table should
+        // not be empty, since we don't ignore it.
+        assertWarns(() -> tableName.set(createTableWithProperties("with default_time_to_live = 1000")), "[default_time_to_live]");
+        assertEquals(1000, executeNet("SELECT default_time_to_live FROM system_schema.tables WHERE keyspace_name=? AND table_name=?",
+                                      keyspace(),
+                                      tableName.get()).one().getInt("default_time_to_live"));
+
+        // alter column is allowed
+        assertValid(this::createTableWithProperties);
+        assertValid("ALTER TABLE %s ADD v1 int");
+        assertValid("ALTER TABLE %s DROP v1");
+        assertValid("ALTER TABLE %s RENAME pk to pk1");
+    }
+
+    @Test
+    public void testViewProperties() throws Throwable
+    {
+        // view properties is not allowed
+        createTableWithProperties();
+        assertValid(() -> createViewWithProperties(""));
+        assertFails(() -> createViewWithProperties("with compression = { 'enabled': 'false' }"), "[compression]");
+        assertValid(() -> createViewWithProperties("with gc_grace_seconds = 1000"));
+
+        // alter mv properties except "gc_grace_seconds" is not allowed
+        assertValid(() -> alterViewWithProperties("gc_grace_seconds = 1000"));
+        assertFails(() -> alterViewWithProperties("compaction = { 'class': 'SizeTieredCompactionStrategy' } AND crc_check_chance = 1"),
+                    "[compaction, crc_check_chance]");
+    }
+
+    @Test
+    public void testInvalidTableProperties()
+    {
+        assertConfigFails(c -> c.setTablePropertiesDisallowed("ID1", "gc_grace_seconds"), "[id1]");
+        assertConfigFails(c -> c.setTablePropertiesDisallowed("ID2", "Gc_Grace_Seconds"), "[id2]");
+        assertConfigFails(c -> c.setTablePropertiesIgnored("ID3", "gc_grace_seconds"), "[id3]");
+        assertConfigFails(c -> c.setTablePropertiesIgnored("ID4", "Gc_Grace_Seconds"), "[id4]");
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        testExcludedUsers(
+        () -> format(CREATE_TABLE, keyspace(), createTableName(), "WITH compaction = { 'class': 'SizeTieredCompactionStrategy' }"),
+        () -> format(CREATE_TABLE, keyspace(), createTableName(), "WITH gc_grace_seconds = 1000"),
+        () -> "ALTER TABLE %s WITH gc_grace_seconds = 1000 and default_time_to_live = 1000",
+        () -> "ALTER TABLE %s WITH compaction = { 'class': 'SizeTieredCompactionStrategy' }",
+        () -> format(CREATE_VIEW, keyspace(), createViewName(), keyspace(), currentTable(), "with compression = { 'enabled': 'false' }"),
+        () -> format(ALTER_VIEW, keyspace(), currentView(), "compaction = { 'class': 'SizeTieredCompactionStrategy' }"),
+        () -> format(ALTER_VIEW, keyspace(), currentView(), "gc_grace_seconds = 1000"),
+        () -> format(ALTER_VIEW, keyspace(), currentView(), "gc_grace_seconds = 1000 and crc_check_chance = 1"),
+        () -> format(ALTER_VIEW, keyspace(), currentView(), "compaction = { 'class': 'SizeTieredCompactionStrategy' }"));
+    }
+
+    private void createTableWithProperties()
+    {
+        createTableWithProperties("");
+    }
+
+    private String createTableWithProperties(String withClause)
+    {
+        String name = createTableName();
+        execute(userClientState, format(CREATE_TABLE, keyspace(), name, withClause));
+        return name;
+    }
+
+    private void createViewWithProperties(String withClause)
+    {
+        execute(userClientState, format(CREATE_VIEW, keyspace(), createViewName(), keyspace(), currentTable(), withClause));
+    }
+
+    private void alterViewWithProperties(String withClause)
+    {
+        execute(userClientState, format(ALTER_VIEW, keyspace(), currentView(), withClause));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailTablesTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailTablesTest.java
new file mode 100644
index 0000000..7e69636
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailTablesTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Test;
+
+import org.apache.cassandra.db.Keyspace;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for the max number of user tables, {@link Guardrails#tables}.
+ */
+public class GuardrailTablesTest extends ThresholdTester
+{
+    private static final int TABLES_LIMIT_WARN_THRESHOLD = 1;
+    private static final int TABLES_LIMIT_FAIL_THRESHOLD = 2;
+
+    public GuardrailTablesTest()
+    {
+        super(TABLES_LIMIT_WARN_THRESHOLD,
+              TABLES_LIMIT_FAIL_THRESHOLD,
+              Guardrails.tables,
+              Guardrails::setTablesThreshold,
+              Guardrails::getTablesWarnThreshold,
+              Guardrails::getTablesFailThreshold);
+    }
+
+    @Override
+    protected long currentValue()
+    {
+        return Keyspace.open(keyspace()).getColumnFamilyStores().size();
+    }
+
+    @Test
+    public void testCreateTable() throws Throwable
+    {
+        // create tables until hitting the two warn/fail thresholds
+        String t1 = assertCreateTableValid();
+        String t2 = assertCreateTableWarns();
+        assertCreateTableFails();
+
+        // drop a table and hit the warn/fail threshold again
+        dropTable(t2);
+        String t3 = assertCreateTableWarns();
+        assertCreateTableFails();
+
+        // drop two tables and hit the warn/fail threshold again
+        dropTable(t1);
+        dropTable(t3);
+        assertCreateTableValid();
+        assertCreateTableWarns();
+        assertCreateTableFails();
+
+        // test excluded users
+        testExcludedUsers(this::createTableQuery,
+                          this::createTableQuery,
+                          this::createTableQuery);
+    }
+
+    @Override
+    protected void dropTable(String tableName)
+    {
+        dropFormattedTable(format("DROP TABLE %s.%s", keyspace(), tableName));
+    }
+
+    private String assertCreateTableValid() throws Throwable
+    {
+        String tableName = createTableName();
+        assertMaxThresholdValid(createTableQuery(tableName));
+        return tableName;
+    }
+
+    private String assertCreateTableWarns() throws Throwable
+    {
+        String tableName = createTableName();
+        assertThresholdWarns(createTableQuery(tableName),
+                             format("Creating table %s, current number of tables 2 exceeds warning threshold of 1", tableName)
+        );
+        return tableName;
+    }
+
+    private void assertCreateTableFails() throws Throwable
+    {
+        String tableName = createTableName();
+        assertThresholdFails(createTableQuery(tableName),
+                             format("Cannot have more than 2 tables, aborting the creation of table %s", tableName)
+        );
+    }
+
+    private String createTableQuery()
+    {
+        return createTableQuery(createTableName());
+    }
+
+    private String createTableQuery(String tableName)
+    {
+        return format("CREATE TABLE %s.%s (k1 int, v int, PRIMARY KEY((k1)))", keyspace(), tableName);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailTester.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailTester.java
new file mode 100644
index 0000000..7c94702
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailTester.java
@@ -0,0 +1,581 @@
+/*
+ * 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.guardrails;
+
+import java.io.Serializable;
+import java.net.InetSocketAddress;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeSet;
+import java.util.concurrent.CopyOnWriteArrayList;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+import javax.annotation.Nullable;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.CassandraRoleManager;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLStatement;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.guardrails.GuardrailEvent.GuardrailEventType;
+import org.apache.cassandra.db.view.View;
+import org.apache.cassandra.diag.DiagnosticEventService;
+import org.apache.cassandra.index.sasi.SASIIndex;
+import org.apache.cassandra.service.ClientState;
+import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.service.QueryState;
+import org.apache.cassandra.transport.ProtocolVersion;
+import org.apache.cassandra.transport.messages.ResultMessage;
+import org.apache.cassandra.utils.Clock;
+import org.assertj.core.api.Assertions;
+
+import static java.lang.String.format;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public abstract class GuardrailTester extends CQLTester
+{
+    // Name used when testing CREATE TABLE that should be aborted (we need to provide it as assertFails, which
+    // is used to assert the failure, does not know that it is a CREATE TABLE and would thus reuse the name of the
+    // previously created table, which is not what we want).
+    protected static final String FAIL_TABLE = "abort_table_creation_test";
+
+    private static final String USERNAME = "guardrail_user";
+    private static final String PASSWORD = "guardrail_password";
+
+    protected static ClientState systemClientState, userClientState, superClientState;
+
+    /** The tested guardrail, if we are testing a specific one. */
+    @Nullable
+    protected final Guardrail guardrail;
+
+    /** A listener for emitted diagnostic events. */
+    protected final Listener listener;
+
+    public GuardrailTester()
+    {
+        this(null);
+    }
+
+    public GuardrailTester(@Nullable Guardrail guardrail)
+    {
+        this.guardrail = guardrail;
+        this.listener = new Listener();
+    }
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+        requireAuthentication();
+        requireNetwork();
+        DatabaseDescriptor.setDiagnosticEventsEnabled(true);
+
+        systemClientState = ClientState.forInternalCalls();
+        userClientState = ClientState.forExternalCalls(InetSocketAddress.createUnresolved("127.0.0.1", 123));
+        superClientState = ClientState.forExternalCalls(InetSocketAddress.createUnresolved("127.0.0.1", 321));
+        superClientState.login(new AuthenticatedUser(CassandraRoleManager.DEFAULT_SUPERUSER_NAME));
+    }
+
+    /**
+     * Creates an ordinary user that is not excluded from guardrails, that is, a user that is not super not internal.
+     */
+    @Before
+    public void beforeGuardrailTest() throws Throwable
+    {
+        useSuperUser();
+        executeNet(format("CREATE USER IF NOT EXISTS %s WITH PASSWORD '%s'", USERNAME, PASSWORD));
+        executeNet(format("GRANT ALL ON KEYSPACE %s TO %s", KEYSPACE, USERNAME));
+        useUser(USERNAME, PASSWORD);
+
+        String useKeyspaceQuery = "USE " + keyspace();
+        execute(userClientState, useKeyspaceQuery);
+        execute(systemClientState, useKeyspaceQuery);
+        execute(superClientState, useKeyspaceQuery);
+
+        DiagnosticEventService.instance().subscribe(GuardrailEvent.class, listener);
+    }
+
+    @After
+    public void afterGuardrailTest() throws Throwable
+    {
+        DiagnosticEventService.instance().unsubscribe(listener);
+    }
+
+    static Guardrails guardrails()
+    {
+        return Guardrails.instance;
+    }
+
+    protected <T> void assertValidProperty(BiConsumer<Guardrails, T> setter, T value)
+    {
+        setter.accept(guardrails(), value);
+    }
+
+    protected <T> void assertValidProperty(BiConsumer<Guardrails, T> setter, Function<Guardrails, T> getter, T value)
+    {
+        setter.accept(guardrails(), value);
+        assertEquals(value, getter.apply(guardrails()));
+    }
+
+    protected <T> void assertInvalidProperty(BiConsumer<Guardrails, T> setter,
+                                             T value,
+                                             String message,
+                                             Object... messageArgs)
+    {
+        Assertions.assertThatThrownBy(() -> setter.accept(guardrails(), value))
+                  .isInstanceOf(IllegalArgumentException.class)
+                  .hasMessage(format(message, messageArgs));
+    }
+
+    @SafeVarargs
+    protected final void testExcludedUsers(Supplier<String>... queries) throws Throwable
+    {
+        execute("USE " + keyspace());
+        assertSuperuserIsExcluded(queries);
+        assertInternalQueriesAreExcluded(queries);
+    }
+
+    @SafeVarargs
+    private final void assertInternalQueriesAreExcluded(Supplier<String>... queries) throws Throwable
+    {
+        for (Supplier<String> query : queries)
+        {
+            assertValid(() -> execute(systemClientState, query.get()));
+        }
+    }
+
+    @SafeVarargs
+    private final void assertSuperuserIsExcluded(Supplier<String>... queries) throws Throwable
+    {
+        for (Supplier<String> query : queries)
+        {
+            assertValid(() -> execute(superClientState, query.get()));
+        }
+    }
+
+    protected void assertValid(CheckedFunction function) throws Throwable
+    {
+        ClientWarn.instance.captureWarnings();
+        try
+        {
+            function.apply();
+            assertEmptyWarnings();
+            listener.assertNotWarned();
+            listener.assertNotFailed();
+        }
+        catch (GuardrailViolatedException e)
+        {
+            fail("Expected not to fail, but failed with error message: " + e.getMessage());
+        }
+        finally
+        {
+            ClientWarn.instance.resetWarnings();
+            listener.clear();
+        }
+    }
+
+    protected void assertValid(String query) throws Throwable
+    {
+        assertValid(() -> execute(userClientState, query));
+    }
+
+    protected void assertWarns(String query, String message) throws Throwable
+    {
+        assertWarns(query, message, message);
+    }
+
+    protected void assertWarns(String query, String message, String redactedMessage) throws Throwable
+    {
+        assertWarns(query, Collections.singletonList(message), Collections.singletonList(redactedMessage));
+    }
+
+    protected void assertWarns(String query, List<String> messages) throws Throwable
+    {
+        assertWarns(() -> execute(userClientState, query), messages, messages);
+    }
+
+    protected void assertWarns(String query, List<String> messages, List<String> redactedMessages) throws Throwable
+    {
+        assertWarns(() -> execute(userClientState, query), messages, redactedMessages);
+    }
+
+    protected void assertWarns(CheckedFunction function, String message) throws Throwable
+    {
+        assertWarns(function, message, message);
+    }
+
+    protected void assertWarns(CheckedFunction function, String message, String redactedMessage) throws Throwable
+    {
+        assertWarns(function, Collections.singletonList(message), Collections.singletonList(redactedMessage));
+    }
+
+    protected void assertWarns(CheckedFunction function, List<String> messages) throws Throwable
+    {
+        assertWarns(function, messages, messages);
+    }
+
+    protected void assertWarns(CheckedFunction function, List<String> messages, List<String> redactedMessages) throws Throwable
+    {
+        // We use client warnings to check we properly warn as this is the most convenient. Technically,
+        // this doesn't validate we also log the warning, but that's probably fine ...
+        ClientWarn.instance.captureWarnings();
+        try
+        {
+            function.apply();
+            assertWarnings(messages);
+            listener.assertWarned(redactedMessages);
+            listener.assertNotFailed();
+        }
+        finally
+        {
+            ClientWarn.instance.resetWarnings();
+            listener.clear();
+        }
+    }
+
+    protected void assertFails(String query, String message) throws Throwable
+    {
+        assertFails(query, message, message);
+    }
+
+    protected void assertFails(String query, String message, String redactedMessage) throws Throwable
+    {
+        assertFails(query, Collections.singletonList(message), Collections.singletonList(redactedMessage));
+    }
+
+    protected void assertFails(String query, List<String> messages) throws Throwable
+    {
+        assertFails(query, messages, messages);
+    }
+
+    protected void assertFails(String query, List<String> messages, List<String> redactedMessages) throws Throwable
+    {
+        assertFails(() -> execute(userClientState, query), messages, redactedMessages);
+    }
+
+    protected void assertFails(CheckedFunction function, String message) throws Throwable
+    {
+        assertFails(function, message, message);
+    }
+
+    protected void assertFails(CheckedFunction function, String message, String redactedMessage) throws Throwable
+    {
+        assertFails(function, true, message, redactedMessage);
+    }
+
+    protected void assertFails(CheckedFunction function, boolean thrown, String message) throws Throwable
+    {
+        assertFails(function, thrown, message, message);
+    }
+
+    protected void assertFails(CheckedFunction function, boolean thrown, String message, String redactedMessage) throws Throwable
+    {
+        assertFails(function, thrown, Collections.singletonList(message), Collections.singletonList(redactedMessage));
+    }
+
+    protected void assertFails(CheckedFunction function, List<String> messages) throws Throwable
+    {
+        assertFails(function, messages, messages);
+    }
+
+    protected void assertFails(CheckedFunction function, List<String> messages, List<String> redactedMessages) throws Throwable
+    {
+        assertFails(function, true, messages, redactedMessages);
+    }
+
+    protected void assertFails(CheckedFunction function, boolean thrown, List<String> messages, List<String> redactedMessages) throws Throwable
+    {
+        ClientWarn.instance.captureWarnings();
+        try
+        {
+            function.apply();
+
+            if (thrown)
+                fail("Expected to fail, but it did not");
+        }
+        catch (GuardrailViolatedException e)
+        {
+            assertTrue("Expect no exception thrown", thrown);
+
+            // the last message is the one raising the guardrail failure, the previous messages are warnings
+            String failMessage = messages.get(messages.size() - 1);
+
+            if (guardrail != null)
+            {
+                String prefix = guardrail.decorateMessage("");
+                assertTrue(format("Full error message '%s' doesn't start with the prefix '%s'", e.getMessage(), prefix),
+                           e.getMessage().startsWith(prefix));
+            }
+
+            assertTrue(format("Full error message '%s' does not contain expected message '%s'", e.getMessage(), failMessage),
+                       e.getMessage().contains(failMessage));
+
+            assertWarnings(messages);
+            if (messages.size() > 1)
+                listener.assertWarned(redactedMessages.subList(0, messages.size() - 1));
+            else
+                listener.assertNotWarned();
+            listener.assertFailed(redactedMessages.get(messages.size() - 1));
+        }
+        finally
+        {
+            ClientWarn.instance.resetWarnings();
+            listener.clear();
+        }
+    }
+
+    protected void assertFails(String query, String... messages) throws Throwable
+    {
+        assertFails(() -> execute(userClientState, query), Arrays.asList(messages));
+    }
+
+    protected void assertThrows(CheckedFunction function, Class<? extends Throwable> exception, String message)
+    {
+        try
+        {
+            function.apply();
+            fail("Expected to fail, but it did not");
+        }
+        catch (Throwable e)
+        {
+            if (!exception.isAssignableFrom(e.getClass()))
+                Assert.fail(format("Expected to fail with %s but got %s", exception.getName(), e.getClass().getName()));
+
+            assertTrue(format("Error message '%s' does not contain expected message '%s'", e.getMessage(), message),
+                       e.getMessage().contains(message));
+        }
+    }
+
+    private void assertWarnings(List<String> messages)
+    {
+        List<String> warnings = getWarnings();
+
+        assertFalse("Expected to warn, but no warning was received", warnings == null || warnings.isEmpty());
+        assertEquals(format("Expected %d warnings but got %d: %s", messages.size(), warnings.size(), warnings),
+                     messages.size(),
+                     warnings.size());
+
+        for (int i = 0; i < messages.size(); i++)
+        {
+            String message = messages.get(i);
+            String warning = warnings.get(i);
+            if (guardrail != null)
+            {
+                String prefix = guardrail.decorateMessage("");
+                assertTrue(format("Warning log message '%s' doesn't start with the prefix '%s'", warning, prefix),
+                           warning.startsWith(prefix));
+            }
+
+            assertTrue(format("Warning log message '%s' does not contain expected message '%s'", warning, message),
+                       warning.contains(message));
+        }
+    }
+
+    private void assertEmptyWarnings()
+    {
+        List<String> warnings = getWarnings();
+
+        if (warnings == null) // will always be the case in practice currently, but being defensive if this change
+            warnings = Collections.emptyList();
+
+        assertTrue(format("Expect no warning messages but got %s", warnings), warnings.isEmpty());
+    }
+
+    protected List<String> getWarnings()
+    {
+        List<String> warnings = ClientWarn.instance.getWarnings();
+
+        return warnings == null
+               ? Collections.emptyList()
+               : warnings.stream()
+                         .filter(w -> !w.equals(View.USAGE_WARNING) && !w.equals(SASIIndex.USAGE_WARNING))
+                         .collect(Collectors.toList());
+    }
+
+    protected void assertConfigValid(Consumer<Guardrails> consumer)
+    {
+        consumer.accept(guardrails());
+    }
+
+    protected void assertConfigFails(Consumer<Guardrails> consumer, String message)
+    {
+        try
+        {
+            consumer.accept(guardrails());
+            fail("Expected failure");
+        }
+        catch (IllegalArgumentException e)
+        {
+            String actualMessage = e.getMessage();
+            assertTrue(String.format("Failure message '%s' does not contain expected message '%s'", actualMessage, message),
+                       actualMessage.contains(message));
+        }
+    }
+
+    protected ResultMessage execute(ClientState state, String query)
+    {
+        return execute(state, query, Collections.emptyList());
+    }
+
+    protected ResultMessage execute(ClientState state, String query, List<ByteBuffer> values)
+    {
+        QueryOptions options = QueryOptions.forInternalCalls(values);
+
+        return execute(state, query, options);
+    }
+
+    protected ResultMessage execute(ClientState state, String query, ConsistencyLevel cl)
+    {
+        return execute(state, query, cl, null);
+    }
+
+    protected ResultMessage execute(ClientState state, String query, ConsistencyLevel cl, ConsistencyLevel serialCl)
+    {
+        QueryOptions options = QueryOptions.create(cl,
+                                                   Collections.emptyList(),
+                                                   false,
+                                                   10,
+                                                   null,
+                                                   serialCl,
+                                                   ProtocolVersion.CURRENT,
+                                                   KEYSPACE);
+
+        return execute(state, query, options);
+    }
+
+    protected ResultMessage execute(ClientState state, String query, QueryOptions options)
+    {
+        QueryState queryState = new QueryState(state);
+
+        String formattedQuery = formatQuery(query);
+        CQLStatement statement = QueryProcessor.parseStatement(formattedQuery, queryState.getClientState());
+        statement.validate(state);
+
+        return statement.execute(queryState, options, Clock.Global.nanoTime());
+    }
+
+    protected static String sortCSV(String csv)
+    {
+        return String.join(",", (new TreeSet<>(ImmutableSet.copyOf((csv.split(","))))));
+    }
+
+    /**
+     * A listener for guardrails diagnostic events.
+     */
+    public class Listener implements Consumer<GuardrailEvent>
+    {
+        private final List<String> warnings = new CopyOnWriteArrayList<>();
+        private final List<String> failures = new CopyOnWriteArrayList<>();
+
+        @Override
+        public void accept(GuardrailEvent event)
+        {
+            assertNotNull(event);
+            Map<String, Serializable> map = event.toMap();
+
+            if (guardrail != null)
+                assertEquals(guardrail.name, map.get("name"));
+
+            GuardrailEventType type = (GuardrailEventType) event.getType();
+            String message = map.toString();
+
+            switch (type)
+            {
+                case WARNED:
+                    warnings.add(message);
+                    break;
+                case FAILED:
+                    failures.add(message);
+                    break;
+                default:
+                    fail("Unexpected diagnostic event:" + type);
+            }
+        }
+
+        public void clear()
+        {
+            warnings.clear();
+            failures.clear();
+        }
+
+        public void assertNotWarned()
+        {
+            assertTrue(format("Expect no warning diagnostic events but got %s", warnings), warnings.isEmpty());
+        }
+
+        public void assertWarned(String message)
+        {
+            assertWarned(Collections.singletonList(message));
+        }
+
+        public void assertWarned(List<String> messages)
+        {
+            assertFalse("Expected to emit warning diagnostic event, but no warning was emitted", warnings.isEmpty());
+            assertEquals(format("Expected %d warning diagnostic events but got %d: %s)", messages.size(), warnings.size(), warnings),
+                         messages.size(), warnings.size());
+
+            for (int i = 0; i < messages.size(); i++)
+            {
+                String message = messages.get(i);
+                String warning = warnings.get(i);
+                assertTrue(format("Warning diagnostic event '%s' does not contain expected message '%s'", warning, message),
+                           warning.contains(message));
+            }
+        }
+
+        public void assertNotFailed()
+        {
+            assertTrue(format("Expect no failure diagnostic events but got %s", failures), failures.isEmpty());
+        }
+
+        public void assertFailed(String... messages)
+        {
+            assertFalse("Expected to emit failure diagnostic event, but no failure was emitted", failures.isEmpty());
+            assertEquals(format("Expected %d failure diagnostic events but got %d: %s)", messages.length, failures.size(), failures),
+                         messages.length, failures.size());
+
+            for (int i = 0; i < messages.length; i++)
+            {
+                String message = messages[i];
+                String failure = failures.get(i);
+                assertTrue(format("Failure diagnostic event '%s' does not contain expected message '%s'", failure, message),
+                           failure.contains(message));
+            }
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailUserTimestampsTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailUserTimestampsTest.java
new file mode 100644
index 0000000..d7c0c7b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailUserTimestampsTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * Tests the guardrail for disabling user-provided timestamps, {@link Guardrails#userTimestampsEnabled}.
+ */
+public class GuardrailUserTimestampsTest extends GuardrailTester
+{
+    public GuardrailUserTimestampsTest()
+    {
+        super(Guardrails.userTimestampsEnabled);
+    }
+
+    @Before
+    public void setupTest()
+    {
+        createTable("CREATE TABLE IF NOT EXISTS %s (k INT, c INT, v TEXT, PRIMARY KEY(k, c))");
+    }
+
+    private void setGuardrail(boolean userTimestampsEnabled)
+    {
+        guardrails().setUserTimestampsEnabled(userTimestampsEnabled);
+    }
+
+    @Test
+    public void testInsertWithDisabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(false);
+        assertFails("INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') USING TIMESTAMP 1");
+    }
+
+    @Test
+    public void testInsertWithEnabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(true);
+        assertValid("INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') USING TIMESTAMP 1");
+    }
+
+    @Test
+    public void testUpdateWithDisabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(false);
+        assertFails("UPDATE %s USING TIMESTAMP 1 SET v = 'val2' WHERE k = 1 and c = 2");
+    }
+
+    @Test
+    public void testUpdateWithEnabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(true);
+        assertValid("UPDATE %s USING TIMESTAMP 1 SET v = 'val2' WHERE k = 1 and c = 2");
+    }
+
+    @Test
+    public void testDeleteWithDisabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(false);
+        assertFails("DELETE FROM %s USING TIMESTAMP 1 WHERE k=1");
+    }
+
+    @Test
+    public void testDeleteWithEnabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(true);
+        assertValid("DELETE FROM %s USING TIMESTAMP 1 WHERE k=1");
+    }
+
+    @Test
+    public void testBatchWithDisabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(false);
+        assertValid("BEGIN BATCH USING TIMESTAMP 1 " +
+                    "INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') " +
+                    "APPLY BATCH");
+        assertFails("BEGIN BATCH " +
+                    "INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') USING TIMESTAMP 1 " +
+                    "APPLY BATCH");
+    }
+
+    @Test
+    public void testBatchWithEnabledUserTimestamps() throws Throwable
+    {
+        setGuardrail(true);
+        assertValid("BEGIN BATCH USING TIMESTAMP 1 " +
+                    "INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') " +
+                    "APPLY BATCH");
+        assertValid("BEGIN BATCH " +
+                    "INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') USING TIMESTAMP 1 " +
+                    "APPLY BATCH");
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        for (boolean userTimestampsEnabled : new boolean[]{ false, true })
+        {
+            setGuardrail(userTimestampsEnabled);
+            testExcludedUsers(() -> "INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') USING TIMESTAMP 1",
+                              () -> "UPDATE %s USING TIMESTAMP 1 SET v = 'val2' WHERE k = 1 and c = 2",
+                              () -> "DELETE FROM %s USING TIMESTAMP 1 WHERE k=1",
+                              () -> "BEGIN BATCH USING TIMESTAMP 1 INSERT INTO %s (k, c, v) VALUES (1, 2, 'v'); APPLY BATCH",
+                              () -> "BEGIN BATCH INSERT INTO %s (k, c, v) VALUES (1, 2, 'v') USING TIMESTAMP 1; APPLY BATCH");
+        }
+    }
+
+    private void assertFails(String query) throws Throwable
+    {
+        assertFails(query, "User provided timestamps (USING TIMESTAMP) is not allowed");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailViewsPerTableTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailViewsPerTableTest.java
new file mode 100644
index 0000000..3be58b0
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailViewsPerTableTest.java
@@ -0,0 +1,123 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.guardrails;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import static java.lang.String.format;
+
+/**
+ * Tests the guardrail for the number of materialized views in a table, {@link Guardrails#materializedViewsPerTable}.
+ */
+public class GuardrailViewsPerTableTest extends ThresholdTester
+{
+    private static final int VIEWS_PER_TABLE_WARN_THRESHOLD = 1;
+    private static final int VIEWS_PER_TABLE_FAIL_THRESHOLD = 3;
+
+    private static final String CREATE_TABLE = "CREATE TABLE %s (k int PRIMARY KEY, v int)";
+    private static final String CREATE_VIEW = "CREATE MATERIALIZED VIEW %s AS SELECT * FROM %%s " +
+                                              "WHERE k IS NOT NULL AND v IS NOT NULL PRIMARY KEY (v, k)";
+
+    public GuardrailViewsPerTableTest()
+    {
+        super(VIEWS_PER_TABLE_WARN_THRESHOLD,
+              VIEWS_PER_TABLE_FAIL_THRESHOLD,
+              Guardrails.materializedViewsPerTable,
+              Guardrails::setMaterializedViewsPerTableThreshold,
+              Guardrails::getMaterializedViewsPerTableWarnThreshold,
+              Guardrails::getMaterializedViewsPerTableFailThreshold);
+    }
+
+    @Override
+    protected long currentValue()
+    {
+        return getCurrentColumnFamilyStore().viewManager.size();
+    }
+
+    @Before
+    public void before()
+    {
+        super.before();
+        createTable(CREATE_TABLE);
+    }
+
+    @Test
+    public void testCreateView() throws Throwable
+    {
+        String view1 = assertCreateViewSucceeds();
+        assertCurrentValue(1);
+
+        assertCreateViewWarns();
+        assertCreateViewWarns();
+        assertCreateViewFails();
+        assertCurrentValue(3);
+
+        // drop the first view, we should be able to create new MV again
+        dropView(view1);
+        assertCurrentValue(2);
+        assertCreateViewWarns();
+        assertCreateViewFails();
+        assertCurrentValue(3);
+
+        // previous guardrail should not apply to another base table
+        createTable("CREATE TABLE %s (k int primary key, v int)");
+        assertCreateViewSucceeds();
+        assertCreateViewWarns();
+        assertCreateViewWarns();
+        assertCreateViewFails();
+        assertCurrentValue(3);
+    }
+
+    @Test
+    public void testExcludedUsers() throws Throwable
+    {
+        createTable("CREATE TABLE %s (k int PRIMARY KEY, v1 int, v2 int)");
+
+        testExcludedUsers(() -> format("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                       "  WHERE k IS NOT NULL AND v1 IS NOT NULL PRIMARY KEY (v1, k)",
+                                       createViewName(), currentTable()),
+                          () -> format("CREATE MATERIALIZED VIEW %s AS SELECT * FROM %s " +
+                                       "  WHERE k IS NOT NULL AND v2 IS NOT NULL PRIMARY KEY (v2, k)",
+                                       createViewName(), currentTable()));
+    }
+
+    private String assertCreateViewSucceeds() throws Throwable
+    {
+        String viewName = createViewName();
+        assertMaxThresholdValid(format(CREATE_VIEW, viewName));
+        return viewName;
+    }
+
+    private void assertCreateViewWarns() throws Throwable
+    {
+        String viewName = createViewName();
+        assertThresholdWarns(format(CREATE_VIEW, viewName),
+                             format("Creating materialized view %s on table %s, current number of views %s exceeds warning threshold of %s.",
+                                    viewName, currentTable(), currentValue() + 1, guardrails().getMaterializedViewsPerTableWarnThreshold()));
+    }
+
+    private void assertCreateViewFails() throws Throwable
+    {
+        String viewName = createViewName();
+        assertThresholdFails(format(CREATE_VIEW, viewName),
+                             format("aborting the creation of materialized view %s on table %s",
+                                    viewName, currentTable()));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailWriteConsistencyLevelsTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailWriteConsistencyLevelsTest.java
new file mode 100644
index 0000000..f2ad40f
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailWriteConsistencyLevelsTest.java
@@ -0,0 +1,209 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+
+import static java.lang.String.format;
+import static org.apache.cassandra.db.ConsistencyLevel.ALL;
+import static org.apache.cassandra.db.ConsistencyLevel.ANY;
+import static org.apache.cassandra.db.ConsistencyLevel.LOCAL_ONE;
+import static org.apache.cassandra.db.ConsistencyLevel.LOCAL_QUORUM;
+import static org.apache.cassandra.db.ConsistencyLevel.LOCAL_SERIAL;
+import static org.apache.cassandra.db.ConsistencyLevel.ONE;
+import static org.apache.cassandra.db.ConsistencyLevel.QUORUM;
+import static org.apache.cassandra.db.ConsistencyLevel.SERIAL;
+
+/**
+ * Tests the guardrail for write consistency levels, {@link Guardrails#writeConsistencyLevels}.
+ */
+public class GuardrailWriteConsistencyLevelsTest extends GuardrailConsistencyLevelsTester
+{
+    public GuardrailWriteConsistencyLevelsTest()
+    {
+        super("write_consistency_levels_warned",
+              "write_consistency_levels_disallowed",
+              Guardrails.writeConsistencyLevels,
+              Guardrails::getWriteConsistencyLevelsWarned,
+              Guardrails::getWriteConsistencyLevelsDisallowed,
+              Guardrails::getWriteConsistencyLevelsWarnedCSV,
+              Guardrails::getWriteConsistencyLevelsDisallowedCSV,
+              Guardrails::setWriteConsistencyLevelsWarned,
+              Guardrails::setWriteConsistencyLevelsDisallowed,
+              Guardrails::setWriteConsistencyLevelsWarnedCSV,
+              Guardrails::setWriteConsistencyLevelsDisallowedCSV);
+    }
+
+    @Before
+    public void before()
+    {
+        super.before();
+        createTable("CREATE TABLE IF NOT EXISTS %s (k INT, c INT, v TEXT, PRIMARY KEY(k, c))");
+    }
+
+    @Test
+    public void testInsert() throws Throwable
+    {
+        testQuery("INSERT INTO %s (k, c, v) VALUES (1, 2, 'val')");
+        testLWTQuery("INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') IF NOT EXISTS");
+    }
+
+    @Test
+    public void testUpdate() throws Throwable
+    {
+        testQuery("UPDATE %s SET v = 'val2' WHERE k = 1 AND c = 2");
+        testLWTQuery("UPDATE %s SET v = 'val2' WHERE k = 1 AND c = 2 IF EXISTS");
+    }
+
+    @Test
+    public void testDelete() throws Throwable
+    {
+        testQuery("DELETE FROM %s WHERE k=1");
+        testLWTQuery("DELETE FROM %s WHERE k=1 AND c=2 IF EXISTS");
+    }
+
+    @Test
+    public void testBatch() throws Throwable
+    {
+        testQuery("BEGIN BATCH INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') APPLY BATCH");
+        testQuery("BEGIN BATCH UPDATE %s SET v = 'val2' WHERE k = 1 AND c = 2 APPLY BATCH");
+        testQuery("BEGIN BATCH DELETE FROM %s WHERE k=1 APPLY BATCH");
+
+        testLWTQuery("BEGIN BATCH INSERT INTO %s (k, c, v) VALUES (1, 2, 'val') IF NOT EXISTS APPLY BATCH");
+        testLWTQuery("BEGIN BATCH UPDATE %s SET v = 'val2' WHERE k = 1 AND c = 2 IF EXISTS APPLY BATCH");
+        testLWTQuery("BEGIN BATCH DELETE FROM %s WHERE k=1 AND c=2 IF EXISTS APPLY BATCH");
+    }
+
+    private void testQuery(String query) throws Throwable
+    {
+        testQuery(query, ONE);
+        testQuery(query, ALL);
+        testQuery(query, ANY);
+        testQuery(query, QUORUM);
+        testQuery(query, LOCAL_ONE);
+        testQuery(query, LOCAL_QUORUM);
+    }
+
+    private void testQuery(String query, ConsistencyLevel cl) throws Throwable
+    {
+        warnConsistencyLevels();
+        disableConsistencyLevels();
+        assertValid(query, cl, null);
+
+        warnConsistencyLevels(cl);
+        assertWarns(query, cl, null, cl);
+
+        warnConsistencyLevels();
+        disableConsistencyLevels(cl);
+        assertFails(query, cl, null, cl);
+    }
+
+    private void testLWTQuery(String query) throws Throwable
+    {
+        testLWTQuery(query, ONE);
+        testLWTQuery(query, ALL);
+        testLWTQuery(query, QUORUM);
+        testLWTQuery(query, LOCAL_ONE);
+        testLWTQuery(query, LOCAL_QUORUM);
+    }
+
+    private void testLWTQuery(String query, ConsistencyLevel cl) throws Throwable
+    {
+        disableConsistencyLevels();
+
+        warnConsistencyLevels();
+        assertValid(query, cl, SERIAL);
+        assertValid(query, cl, LOCAL_SERIAL);
+        assertValid(query, cl, null);
+
+        warnConsistencyLevels(cl);
+        assertWarns(query, cl, SERIAL, cl);
+        assertWarns(query, cl, LOCAL_SERIAL, cl);
+        assertWarns(query, cl, null, cl);
+
+        warnConsistencyLevels(SERIAL);
+        assertWarns(query, cl, SERIAL, SERIAL);
+        assertValid(query, cl, LOCAL_SERIAL);
+        assertWarns(query, cl, null, SERIAL);
+
+        warnConsistencyLevels(LOCAL_SERIAL);
+        assertValid(query, cl, SERIAL);
+        assertWarns(query, cl, LOCAL_SERIAL, LOCAL_SERIAL);
+        assertValid(query, cl, null);
+
+        warnConsistencyLevels(SERIAL, LOCAL_SERIAL);
+        assertWarns(query, cl, SERIAL, SERIAL);
+        assertWarns(query, cl, LOCAL_SERIAL, LOCAL_SERIAL);
+        assertWarns(query, cl, null, SERIAL);
+
+        warnConsistencyLevels();
+
+        disableConsistencyLevels(cl);
+        assertFails(query, cl, SERIAL, cl);
+        assertFails(query, cl, LOCAL_SERIAL, cl);
+        assertFails(query, cl, null, cl);
+
+        disableConsistencyLevels(SERIAL);
+        assertFails(query, cl, SERIAL, SERIAL);
+        assertValid(query, cl, LOCAL_SERIAL);
+        assertFails(query, cl, null, SERIAL);
+
+        disableConsistencyLevels(LOCAL_SERIAL);
+        assertValid(query, cl, SERIAL);
+        assertFails(query, cl, LOCAL_SERIAL, LOCAL_SERIAL);
+        assertValid(query, cl, null);
+
+        disableConsistencyLevels(SERIAL, LOCAL_SERIAL);
+        assertFails(query, cl, SERIAL, SERIAL);
+        assertFails(query, cl, LOCAL_SERIAL, LOCAL_SERIAL);
+        assertFails(query, cl, null, SERIAL);
+    }
+
+    private void assertValid(String query, ConsistencyLevel cl, ConsistencyLevel serialCl) throws Throwable
+    {
+        assertValid(() -> execute(userClientState, query, cl, serialCl));
+    }
+
+    private void assertWarns(String query, ConsistencyLevel cl, ConsistencyLevel serialCl, ConsistencyLevel warnedCl) throws Throwable
+    {
+        assertWarns(() -> execute(userClientState, query, cl, serialCl),
+                    format("Provided values [%s] are not recommended for write consistency levels (warned values are: %s)",
+                           warnedCl, guardrails().getWriteConsistencyLevelsWarned()));
+
+        assertExcludedUsers(query, cl, serialCl);
+    }
+
+    private void assertFails(String query, ConsistencyLevel cl, ConsistencyLevel serialCl, ConsistencyLevel rejectedCl) throws Throwable
+    {
+        assertFails(() -> execute(userClientState, query, cl, serialCl),
+                    format("Provided values [%s] are not allowed for write consistency levels (disallowed values are: %s)",
+                           rejectedCl, guardrails().getWriteConsistencyLevelsDisallowed()));
+
+        assertExcludedUsers(query, cl, serialCl);
+    }
+
+    private void assertExcludedUsers(String query, ConsistencyLevel cl, ConsistencyLevel serialCl) throws Throwable
+    {
+        assertValid(() -> execute(superClientState, query, cl, serialCl));
+        assertValid(() -> execute(systemClientState, query, cl, serialCl));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailsConfigProviderTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailsConfigProviderTest.java
new file mode 100644
index 0000000..e99b736
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailsConfigProviderTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.guardrails;
+
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.GuardrailsOptions;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.service.ClientState;
+import org.assertj.core.api.Assertions;
+
+import static java.lang.String.format;
+
+public class GuardrailsConfigProviderTest extends GuardrailTester
+{
+    @Test
+    public void testBuildCustom() throws Throwable
+    {
+        String name = getClass().getCanonicalName() + '$' + CustomProvider.class.getSimpleName();
+        GuardrailsConfigProvider provider = GuardrailsConfigProvider.build(name);
+        MaxThreshold guard = new MaxThreshold("test_guardrail",
+                                        state -> provider.getOrCreate(state).getTablesWarnThreshold(),
+                                        state -> provider.getOrCreate(state).getTablesFailThreshold(),
+                                        (isWarn, what, v, t) -> format("%s: for %s, %s > %s",
+                                                                       isWarn ? "Warning" : "Aborting", what, v, t));
+
+        assertValid(() -> guard.guard(5, "Z", false, userClientState));
+        assertWarns(() -> guard.guard(25, "A", false, userClientState), "Warning: for A, 25 > 10");
+        assertWarns(() -> guard.guard(100, "B", false, userClientState), "Warning: for B, 100 > 10");
+        assertFails(() -> guard.guard(101, "X", false, userClientState), "Aborting: for X, 101 > 100");
+        assertFails(() -> guard.guard(200, "Y", false, userClientState), "Aborting: for Y, 200 > 100");
+        assertValid(() -> guard.guard(5, "Z", false, userClientState));
+
+        assertValid(() -> guard.guard(5, "Z", true, userClientState));
+        assertWarns(() -> guard.guard(25, "A", true, userClientState), "Warning: for A, 25 > 10", "Warning: for <redacted>, 25 > 10");
+        assertWarns(() -> guard.guard(100, "B", true, userClientState), "Warning: for B, 100 > 10", "Warning: for <redacted>, 100 > 10");
+        assertFails(() -> guard.guard(101, "X", true, userClientState), "Aborting: for X, 101 > 100", "Aborting: for <redacted>, 101 > 100");
+        assertFails(() -> guard.guard(200, "Y", true, userClientState), "Aborting: for Y, 200 > 100", "Aborting: for <redacted>, 200 > 100");
+        assertValid(() -> guard.guard(5, "Z", true, userClientState));
+
+        Assertions.assertThatThrownBy(() -> GuardrailsConfigProvider.build("unexistent_class"))
+                  .isInstanceOf(ConfigurationException.class)
+                  .hasMessageContaining("Unable to find custom guardrails config provider class 'unexistent_class'");
+    }
+
+    /**
+     * Custom {@link GuardrailsConfigProvider} implementation that simply duplicates the threshold values.
+     */
+    public static class CustomProvider extends GuardrailsConfigProvider.Default
+    {
+        public GuardrailsConfig getOrCreate(ClientState state)
+        {
+            return new CustomConfig(DatabaseDescriptor.getRawConfig());
+        }
+    }
+
+    public static class CustomConfig extends GuardrailsOptions
+    {
+        public CustomConfig(Config config)
+        {
+            super(config);
+        }
+
+        @Override
+        public int getTablesWarnThreshold()
+        {
+            return 10;
+        }
+
+        @Override
+        public int getTablesFailThreshold()
+        {
+            return 100;
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/GuardrailsTest.java b/test/unit/org/apache/cassandra/db/guardrails/GuardrailsTest.java
new file mode 100644
index 0000000..a0a5823
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/GuardrailsTest.java
@@ -0,0 +1,456 @@
+/*
+ * 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.guardrails;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Consumer;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static java.lang.String.format;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class GuardrailsTest extends GuardrailTester
+{
+    public static final int DISABLED = -1;
+
+
+    private void testDisabledThreshold(Threshold guard) throws Throwable
+    {
+        assertFalse(guard.enabled(userClientState));
+
+        for (boolean containsUserData : Arrays.asList(true, false))
+        {
+            assertValid(() -> guard.guard(5, "Z", containsUserData, null));
+            assertValid(() -> guard.guard(25, "A", containsUserData, userClientState));
+            assertValid(() -> guard.guard(100, "B", containsUserData, userClientState));
+            assertValid(() -> guard.guard(101, "X", containsUserData, userClientState));
+            assertValid(() -> guard.guard(200, "Y", containsUserData, userClientState));
+        }
+    }
+
+    @Test
+    public void testDisabledMaxThreshold() throws Throwable
+    {
+        Threshold.ErrorMessageProvider errorMessageProvider = (isWarn, what, v, t) -> "Should never trigger";
+        testDisabledThreshold(new MaxThreshold("x", state -> DISABLED, state -> DISABLED, errorMessageProvider));
+    }
+
+    @Test
+    public void testMaxThreshold() throws Throwable
+    {
+        MaxThreshold guard = new MaxThreshold("x",
+                                        state -> 10,
+                                        state -> 100,
+                                        (isWarn, what, v, t) -> format("%s: for %s, %s > %s",
+                                                                       isWarn ? "Warning" : "Aborting", what, v, t));
+
+        assertTrue(guard.enabled(userClientState));
+
+        assertValid(() -> guard.guard(5, "Z", false, userClientState));
+        assertWarns(() -> guard.guard(25, "A", false, userClientState), "Warning: for A, 25 > 10");
+        assertWarns(() -> guard.guard(100, "B", false, userClientState), "Warning: for B, 100 > 10");
+        assertFails(() -> guard.guard(101, "X", false, userClientState), "Aborting: for X, 101 > 100");
+        assertFails(() -> guard.guard(200, "Y", false, userClientState), "Aborting: for Y, 200 > 100");
+        assertValid(() -> guard.guard(5, "Z", false, userClientState));
+
+        assertValid(() -> guard.guard(5, "Z", true, userClientState));
+        assertWarns(() -> guard.guard(25, "A", true, userClientState), "Warning: for A, 25 > 10", "Warning: for <redacted>, 25 > 10");
+        assertWarns(() -> guard.guard(100, "B", true, userClientState), "Warning: for B, 100 > 10", "Warning: for <redacted>, 100 > 10");
+        assertFails(() -> guard.guard(101, "X", true, userClientState), "Aborting: for X, 101 > 100", "Aborting: for <redacted>, 101 > 100");
+        assertFails(() -> guard.guard(200, "Y", true, userClientState), "Aborting: for Y, 200 > 100", "Aborting: for <redacted>, 200 > 100");
+        assertValid(() -> guard.guard(5, "Z", true, userClientState));
+    }
+
+    @Test
+    public void testWarnOnlyMaxThreshold() throws Throwable
+    {
+        MaxThreshold guard = new MaxThreshold("x",
+                                        state -> 10,
+                                        state -> DISABLED,
+                                        (isWarn, what, v, t) -> format("%s: for %s, %s > %s",
+                                                                       isWarn ? "Warning" : "Aborting", what, v, t));
+
+        assertTrue(guard.enabled(userClientState));
+
+        assertValid(() -> guard.guard(5, "Z", false, userClientState));
+        assertWarns(() -> guard.guard(11, "A", false, userClientState), "Warning: for A, 11 > 10");
+
+        assertValid(() -> guard.guard(5, "Z", true, userClientState));
+        assertWarns(() -> guard.guard(11, "A", true, userClientState), "Warning: for A, 11 > 10", "Warning: for <redacted>, 11 > 10");
+    }
+
+    @Test
+    public void testFailOnlyMaxThreshold() throws Throwable
+    {
+        MaxThreshold guard = new MaxThreshold("x",
+                                        state -> DISABLED,
+                                        state -> 10,
+                                        (isWarn, what, v, t) -> format("%s: for %s, %s > %s",
+                                                                       isWarn ? "Warning" : "Aborting", what, v, t));
+
+        assertTrue(guard.enabled(userClientState));
+
+        assertValid(() -> guard.guard(5, "Z", false, userClientState));
+        assertFails(() -> guard.guard(11, "A", false, userClientState), "Aborting: for A, 11 > 10");
+
+        assertValid(() -> guard.guard(5, "Z", true, userClientState));
+        assertFails(() -> guard.guard(11, "A", true, userClientState), "Aborting: for A, 11 > 10", "Aborting: for <redacted>, 11 > 10");
+    }
+
+    @Test
+    public void testMaxThresholdUsers() throws Throwable
+    {
+        MaxThreshold guard = new MaxThreshold("x",
+                                        state -> 10,
+                                        state -> 100,
+                                        (isWarn, what, v, t) -> format("%s: for %s, %s > %s",
+                                                                       isWarn ? "Warning" : "Failure", what, v, t));
+
+        // value under both thresholds
+        assertValid(() -> guard.guard(5, "x", false, null));
+        assertValid(() -> guard.guard(5, "x", false, userClientState));
+        assertValid(() -> guard.guard(5, "x", false, systemClientState));
+        assertValid(() -> guard.guard(5, "x", false, superClientState));
+
+        // value over warning threshold
+        assertWarns(() -> guard.guard(100, "y", false, null), "Warning: for y, 100 > 10");
+        assertWarns(() -> guard.guard(100, "y", false, userClientState), "Warning: for y, 100 > 10");
+        assertValid(() -> guard.guard(100, "y", false, systemClientState));
+        assertValid(() -> guard.guard(100, "y", false, superClientState));
+
+        // value over fail threshold. An undefined user means that the check comes from a background process, so we
+        // still emit failure messages and events, but we don't throw an exception to prevent interrupting that process.
+        assertFails(() -> guard.guard(101, "z", false, null), false, "Failure: for z, 101 > 100");
+        assertFails(() -> guard.guard(101, "z", false, userClientState), "Failure: for z, 101 > 100");
+        assertValid(() -> guard.guard(101, "z", false, systemClientState));
+        assertValid(() -> guard.guard(101, "z", false, superClientState));
+    }
+
+    @Test
+    public void testDisabledMinThreshold() throws Throwable
+    {
+        Threshold.ErrorMessageProvider errorMessageProvider = (isWarn, what, v, t) -> "Should never trigger";
+        testDisabledThreshold(new MinThreshold("x", state -> DISABLED, state -> DISABLED, errorMessageProvider));
+    }
+
+    @Test
+    public void testMinThreshold() throws Throwable
+    {
+        MinThreshold guard = new MinThreshold("x",
+                                              state -> 100,
+                                              state -> 10,
+                                              (isWarn, what, v, t) -> format("%s: for %s, %s < %s",
+                                                                             isWarn ? "Warning" : "Aborting", what, v, t));
+
+        assertTrue(guard.enabled(userClientState));
+
+        assertValid(() -> guard.guard(200, "Z", false, userClientState));
+        assertWarns(() -> guard.guard(25, "A", false, userClientState), "Warning: for A, 25 < 100");
+        assertWarns(() -> guard.guard(10, "B", false, userClientState), "Warning: for B, 10 < 100");
+        assertFails(() -> guard.guard(9, "X", false, userClientState), "Aborting: for X, 9 < 10");
+        assertFails(() -> guard.guard(1, "Y", false, userClientState), "Aborting: for Y, 1 < 10");
+        assertValid(() -> guard.guard(200, "Z", false, userClientState));
+
+        assertValid(() -> guard.guard(200, "Z", true, userClientState));
+        assertWarns(() -> guard.guard(25, "A", true, userClientState), "Warning: for A, 25 < 100", "Warning: for <redacted>, 25 < 100");
+        assertWarns(() -> guard.guard(10, "B", true, userClientState), "Warning: for B, 10 < 100", "Warning: for <redacted>, 10 < 100");
+        assertFails(() -> guard.guard(9, "X", true, userClientState), "Aborting: for X, 9 < 10", "Aborting: for <redacted>, 9 < 10");
+        assertFails(() -> guard.guard(1, "Y", true, userClientState), "Aborting: for Y, 1 < 10", "Aborting: for <redacted>, 1 < 10");
+        assertValid(() -> guard.guard(200, "Z", true, userClientState));
+    }
+
+    @Test
+    public void testWarnOnlyMinThreshold() throws Throwable
+    {
+        MinThreshold guard = new MinThreshold("x",
+                                              state -> 10,
+                                              state -> DISABLED,
+                                              (isWarn, what, v, t) -> format("%s: for %s, %s < %s",
+                                                                             isWarn ? "Warning" : "Aborting", what, v, t));
+
+        assertTrue(guard.enabled(userClientState));
+
+        assertValid(() -> guard.guard(11, "Z", false, userClientState));
+        assertWarns(() -> guard.guard(5, "A", false, userClientState), "Warning: for A, 5 < 10");
+
+        assertValid(() -> guard.guard(11, "Z", true, userClientState));
+        assertWarns(() -> guard.guard(5, "A", true, userClientState), "Warning: for A, 5 < 10", "Warning: for <redacted>, 5 < 10");
+    }
+
+    @Test
+    public void testFailOnlyMinThreshold() throws Throwable
+    {
+        MinThreshold guard = new MinThreshold("x",
+                                              state -> DISABLED,
+                                              state -> 10,
+                                              (isWarn, what, v, t) -> format("%s: for %s, %s < %s",
+                                                                             isWarn ? "Warning" : "Aborting", what, v, t));
+
+        assertTrue(guard.enabled(userClientState));
+
+        assertValid(() -> guard.guard(11, "Z", false, userClientState));
+        assertFails(() -> guard.guard(5, "A", false, userClientState), "Aborting: for A, 5 < 10");
+
+        assertValid(() -> guard.guard(11, "Z", true, userClientState));
+        assertFails(() -> guard.guard(5, "A", true, userClientState), "Aborting: for A, 5 < 10", "Aborting: for <redacted>, 5 < 10");
+    }
+
+    @Test
+    public void testMinThresholdUsers() throws Throwable
+    {
+        MinThreshold guard = new MinThreshold("x",
+                                              state -> 100,
+                                              state -> 10,
+                                              (isWarn, what, v, t) -> format("%s: for %s, %s < %s",
+                                                                             isWarn ? "Warning" : "Failure", what, v, t));
+
+        // value above both thresholds
+        assertValid(() -> guard.guard(200, "x", false, null));
+        assertValid(() -> guard.guard(200, "x", false, userClientState));
+        assertValid(() -> guard.guard(200, "x", false, systemClientState));
+        assertValid(() -> guard.guard(200, "x", false, superClientState));
+
+        // value under warning threshold
+        assertWarns(() -> guard.guard(10, "y", false, null), "Warning: for y, 10 < 100");
+        assertWarns(() -> guard.guard(10, "y", false, userClientState), "Warning: for y, 10 < 100");
+        assertValid(() -> guard.guard(10, "y", false, systemClientState));
+        assertValid(() -> guard.guard(10, "y", false, superClientState));
+
+        // value under fail threshold. An undefined user means that the check comes from a background process, so we
+        // still emit failure messages and events, but we don't throw an exception to prevent interrupting that process.
+        assertFails(() -> guard.guard(9, "z", false, null), false, "Failure: for z, 9 < 10");
+        assertFails(() -> guard.guard(9, "z", false, userClientState), "Failure: for z, 9 < 10");
+        assertValid(() -> guard.guard(9, "z", false, systemClientState));
+        assertValid(() -> guard.guard(9, "z", false, superClientState));
+    }
+
+    @Test
+    public void testDisableFlag() throws Throwable
+    {
+        assertFails(() -> new DisableFlag("x", state -> true, "X").ensureEnabled(userClientState), "X is not allowed");
+        assertValid(() -> new DisableFlag("x", state -> false, "X").ensureEnabled(userClientState));
+
+        assertFails(() -> new DisableFlag("x", state -> true, "X").ensureEnabled("Y", userClientState), "Y is not allowed");
+        assertValid(() -> new DisableFlag("x", state -> false, "X").ensureEnabled("Y", userClientState));
+    }
+
+    @Test
+    public void testDisableFlagUsers() throws Throwable
+    {
+        DisableFlag enabled = new DisableFlag("x", state -> false, "X");
+        assertValid(() -> enabled.ensureEnabled(null));
+        assertValid(() -> enabled.ensureEnabled(userClientState));
+        assertValid(() -> enabled.ensureEnabled(systemClientState));
+        assertValid(() -> enabled.ensureEnabled(superClientState));
+
+        DisableFlag disabled = new DisableFlag("x", state -> true, "X");
+        assertFails(() -> disabled.ensureEnabled(userClientState), "X is not allowed");
+        assertValid(() -> disabled.ensureEnabled(systemClientState));
+        assertValid(() -> disabled.ensureEnabled(superClientState));
+    }
+
+    @Test
+    public void testValuesWarned() throws Throwable
+    {
+        // Using a sorted set below to ensure the order in the warning message checked below is not random
+        Values<Integer> warned = new Values<>("x",
+                                              state -> insertionOrderedSet(4, 6, 20),
+                                              state -> Collections.emptySet(),
+                                              state -> Collections.emptySet(),
+                                              "integer");
+
+        Consumer<Integer> action = i -> Assert.fail("The ignore action shouldn't have been triggered");
+        assertValid(() -> warned.guard(set(3), action, userClientState));
+        assertWarns(() -> warned.guard(set(4), action, userClientState),
+                    "Provided values [4] are not recommended for integer (warned values are: [4, 6, 20])");
+        assertWarns(() -> warned.guard(set(4, 6), action, null),
+                    "Provided values [4, 6] are not recommended for integer (warned values are: [4, 6, 20])");
+        assertWarns(() -> warned.guard(set(4, 5, 6, 7), action, null),
+                    "Provided values [4, 6] are not recommended for integer (warned values are: [4, 6, 20])");
+    }
+
+    @Test
+    public void testValuesIgnored() throws Throwable
+    {
+        // Using a sorted set below to ensure the order in the error message checked below are not random
+        Values<Integer> ignored = new Values<>("x",
+                                               state -> Collections.emptySet(),
+                                               state -> insertionOrderedSet(4, 6, 20),
+                                               state -> Collections.emptySet(),
+                                               "integer");
+
+        Set<Integer> triggeredOn = set();
+        assertValid(() -> ignored.guard(set(3), triggeredOn::add, userClientState));
+        assertEquals(set(), triggeredOn);
+
+        assertWarns(() -> ignored.guard(set(4), triggeredOn::add, userClientState),
+                    "Ignoring provided values [4] as they are not supported for integer (ignored values are: [4, 6, 20])");
+        assertEquals(set(4), triggeredOn);
+        triggeredOn.clear();
+
+        assertWarns(() -> ignored.guard(set(4, 6), triggeredOn::add, null),
+                    "Ignoring provided values [4, 6] as they are not supported for integer (ignored values are: [4, 6, 20])");
+        assertEquals(set(4, 6), triggeredOn);
+        triggeredOn.clear();
+
+        assertWarns(() -> ignored.guard(set(4, 5, 6, 7), triggeredOn::add, null),
+                    "Ignoring provided values [4, 6] as they are not supported for integer (ignored values are: [4, 6, 20])");
+        assertEquals(set(4, 6), triggeredOn);
+        triggeredOn.clear();
+
+        assertThrows(() -> ignored.guard(set(4), userClientState),
+                     AssertionError.class,
+                     "There isn't an ignore action for integer, but value 4 is setup to be ignored");
+    }
+
+    @Test
+    public void testValuesDisallowed() throws Throwable
+    {
+        // Using a sorted set below to ensure the order in the error message checked below are not random
+        Values<Integer> disallowed = new Values<>("x",
+                                                  state -> Collections.emptySet(),
+                                                  state -> Collections.emptySet(),
+                                                  state -> insertionOrderedSet(4, 6, 20),
+                                                  "integer");
+
+        Consumer<Integer> action = i -> Assert.fail("The ignore action shouldn't have been triggered");
+        assertValid(() -> disallowed.guard(set(3), action, userClientState));
+        assertFails(() -> disallowed.guard(set(4), action, userClientState),
+                    "Provided values [4] are not allowed for integer (disallowed values are: [4, 6, 20])");
+        assertValid(() -> disallowed.guard(set(10), action, userClientState));
+        assertFails(() -> disallowed.guard(set(20), action, userClientState),
+                    "Provided values [20] are not allowed for integer (disallowed values are: [4, 6, 20])");
+        assertValid(() -> disallowed.guard(set(200), action, userClientState));
+        assertValid(() -> disallowed.guard(set(1, 2, 3), action, userClientState));
+
+        assertFails(() -> disallowed.guard(set(4, 6), action, null), false,
+                    "Provided values [4, 6] are not allowed for integer (disallowed values are: [4, 6, 20])");
+        assertFails(() -> disallowed.guard(set(4, 5, 6, 7), action, null), false,
+                    "Provided values [4, 6] are not allowed for integer (disallowed values are: [4, 6, 20])");
+    }
+
+    @Test
+    public void testValuesUsers() throws Throwable
+    {
+        Values<Integer> disallowed = new Values<>("x",
+                                                  state -> Collections.singleton(2),
+                                                  state -> Collections.singleton(3),
+                                                  state -> Collections.singleton(4),
+                                                  "integer");
+
+        Consumer<Integer> action = i -> Assert.fail("The ignore action shouldn't have been triggered");
+
+        assertValid(() -> disallowed.guard(set(1), action, null));
+        assertValid(() -> disallowed.guard(set(1), action, userClientState));
+        assertValid(() -> disallowed.guard(set(1), action, systemClientState));
+        assertValid(() -> disallowed.guard(set(1), action, superClientState));
+
+        String message = "Provided values [2] are not recommended for integer (warned values are: [2])";
+        assertWarns(() -> disallowed.guard(set(2), action, null), message);
+        assertWarns(() -> disallowed.guard(set(2), action, userClientState), message);
+        assertValid(() -> disallowed.guard(set(2), action, systemClientState));
+        assertValid(() -> disallowed.guard(set(2), action, superClientState));
+
+        message = "Ignoring provided values [3] as they are not supported for integer (ignored values are: [3])";
+        List<Integer> triggeredOn = new ArrayList<>();
+        assertWarns(() -> disallowed.guard(set(3), triggeredOn::add, null), message);
+        assertWarns(() -> disallowed.guard(set(3), triggeredOn::add, userClientState), message);
+        assertValid(() -> disallowed.guard(set(3), triggeredOn::add, systemClientState));
+        assertValid(() -> disallowed.guard(set(3), triggeredOn::add, superClientState));
+        Assert.assertEquals(list(3, 3), triggeredOn);
+
+        message = "Provided values [4] are not allowed for integer (disallowed values are: [4])";
+        assertFails(() -> disallowed.guard(set(4), action, null), false, message);
+        assertFails(() -> disallowed.guard(set(4), action, userClientState), message);
+        assertValid(() -> disallowed.guard(set(4), action, systemClientState));
+        assertValid(() -> disallowed.guard(set(4), action, superClientState));
+    }
+
+    @Test
+    public void testPredicates() throws Throwable
+    {
+        Predicates<Integer> guard = new Predicates<>("x",
+                                                     state -> x -> x > 10,
+                                                     state -> x -> x > 100,
+                                                     (isWarn, value) -> format("%s: %s", isWarn ? "Warning" : "Aborting", value));
+
+        assertValid(() -> guard.guard(5, userClientState));
+        assertWarns(() -> guard.guard(25, userClientState), "Warning: 25");
+        assertWarns(() -> guard.guard(100,  userClientState), "Warning: 100");
+        assertFails(() -> guard.guard(101,  userClientState), "Aborting: 101");
+        assertFails(() -> guard.guard(200,  userClientState), "Aborting: 200");
+        assertValid(() -> guard.guard(5,  userClientState));
+    }
+
+    @Test
+    public void testPredicatesUsers() throws Throwable
+    {
+        Predicates<Integer> guard = new Predicates<>("x",
+                                                     state -> x -> x > 10,
+                                                     state -> x -> x > 100,
+                                                     (isWarn, value) -> format("%s: %s", isWarn ? "Warning" : "Aborting", value));
+
+        assertTrue(guard.enabled());
+        assertTrue(guard.enabled(null));
+        assertTrue(guard.enabled(userClientState));
+        assertFalse(guard.enabled(systemClientState));
+        assertFalse(guard.enabled(superClientState));
+
+        assertValid(() -> guard.guard(5, null));
+        assertValid(() -> guard.guard(5, userClientState));
+        assertValid(() -> guard.guard(5, systemClientState));
+        assertValid(() -> guard.guard(5, superClientState));
+
+        assertWarns(() -> guard.guard(25, null), "Warning: 25");
+        assertWarns(() -> guard.guard(25, userClientState), "Warning: 25");
+        assertValid(() -> guard.guard(25, systemClientState));
+        assertValid(() -> guard.guard(25, superClientState));
+
+        assertFails(() -> guard.guard(101,  null), false, "Aborting: 101");
+        assertFails(() -> guard.guard(101,  userClientState), "Aborting: 101");
+        assertValid(() -> guard.guard(101, systemClientState));
+        assertValid(() -> guard.guard(101, superClientState));
+    }
+
+    private static Set<Integer> set(Integer value)
+    {
+        return Collections.singleton(value);
+    }
+
+    private static Set<Integer> set(Integer... values)
+    {
+        return new HashSet<>(Arrays.asList(values));
+    }
+
+    @SafeVarargs
+    private static <T> Set<T> insertionOrderedSet(T... values)
+    {
+        return new LinkedHashSet<>(Arrays.asList(values));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/guardrails/ThresholdTester.java b/test/unit/org/apache/cassandra/db/guardrails/ThresholdTester.java
new file mode 100644
index 0000000..fae305a
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/guardrails/ThresholdTester.java
@@ -0,0 +1,285 @@
+/*
+ * 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.guardrails;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+import java.util.function.ToIntFunction;
+import java.util.function.ToLongFunction;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DataStorageSpec;
+import org.assertj.core.api.Assertions;
+
+import static java.lang.String.format;
+import static org.apache.cassandra.config.DataStorageSpec.DataStorageUnit.BYTES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.fail;
+
+/**
+ * Utility class for testing a {@link Threshold} guardrail.
+ */
+public abstract class ThresholdTester extends GuardrailTester
+{
+    private final long warnThreshold;
+    private final long failThreshold;
+    private final TriConsumer<Guardrails, Long, Long> setter;
+    private final ToLongFunction<Guardrails> warnGetter;
+    private final ToLongFunction<Guardrails> failGetter;
+    private final long maxValue;
+    private final Long disabledValue;
+
+    protected ThresholdTester(int warnThreshold,
+                              int failThreshold,
+                              Threshold threshold,
+                              TriConsumer<Guardrails, Integer, Integer> setter,
+                              ToIntFunction<Guardrails> warnGetter,
+                              ToIntFunction<Guardrails> failGetter)
+    {
+        super(threshold);
+        this.warnThreshold = warnThreshold;
+        this.failThreshold = failThreshold;
+        this.setter = (g, w, a) -> setter.accept(g, w.intValue(), a.intValue());
+        this.warnGetter = g -> (long) warnGetter.applyAsInt(g);
+        this.failGetter = g -> (long) failGetter.applyAsInt(g);
+        maxValue = Integer.MAX_VALUE;
+        disabledValue = -1L;
+    }
+
+    protected ThresholdTester(long warnThreshold,
+                              long failThreshold,
+                              Threshold threshold,
+                              TriConsumer<Guardrails, Long, Long> setter,
+                              ToLongFunction<Guardrails> warnGetter,
+                              ToLongFunction<Guardrails> failGetter)
+    {
+        super(threshold);
+        this.warnThreshold = warnThreshold;
+        this.failThreshold = failThreshold;
+        this.setter = setter;
+        this.warnGetter = warnGetter;
+        this.failGetter = failGetter;
+        maxValue = Long.MAX_VALUE;
+        disabledValue = -1L;
+    }
+
+    protected ThresholdTester(String warnThreshold,
+                              String failThreshold,
+                              Threshold threshold,
+                              TriConsumer<Guardrails, String, String> setter,
+                              Function<Guardrails, String> warnGetter,
+                              Function<Guardrails, String> failGetter)
+    {
+        super(threshold);
+        this.warnThreshold = new DataStorageSpec.LongBytesBound(warnThreshold).toBytes();
+        this.failThreshold = new DataStorageSpec.LongBytesBound(failThreshold).toBytes();
+        this.setter = (g, w, a) -> setter.accept(g, w == null ? null : new DataStorageSpec.LongBytesBound(w, BYTES).toString(), a == null ? null : new DataStorageSpec.LongBytesBound(a, BYTES).toString());
+        this.warnGetter = g -> new DataStorageSpec.LongBytesBound(warnGetter.apply(g)).toBytes();
+        this.failGetter = g -> new DataStorageSpec.LongBytesBound(failGetter.apply(g)).toBytes();
+        maxValue = Long.MAX_VALUE - 1;
+        disabledValue = null;
+    }
+
+    protected long currentValue()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+    protected void assertCurrentValue(int count)
+    {
+        assertEquals(count, currentValue());
+    }
+
+    @Before
+    public void before()
+    {
+        setter.accept(guardrails(), warnThreshold, failThreshold);
+    }
+
+    @Test
+    public void testConfigValidation()
+    {
+        assertNotNull(guardrail);
+        testValidationOfThresholdProperties(guardrail.name + "_warn_threshold", guardrail.name + "_fail_threshold");
+    }
+
+    protected void testValidationOfThresholdProperties(String warnName, String failName)
+    {
+        setter.accept(guardrails(), disabledValue, disabledValue);
+
+        testValidationOfStrictlyPositiveProperty((g, a) -> setter.accept(g, disabledValue, a), failName);
+        testValidationOfStrictlyPositiveProperty((g, w) -> setter.accept(g, w, disabledValue), warnName);
+
+        setter.accept(guardrails(), disabledValue, disabledValue);
+        Assertions.assertThatThrownBy(() -> setter.accept(guardrails(), 2L, 1L))
+                  .hasMessageContaining(guardrail.name + "_warn_threshold should be lower than the fail threshold");
+    }
+
+    protected void assertMaxThresholdValid(String query) throws Throwable
+    {
+        assertValid(query);
+
+        long warnValue = warnGetter.applyAsLong(guardrails());
+        long failValue = failGetter.applyAsLong(guardrails());
+        long current = currentValue();
+
+        if (warnValue != disabledValue)
+            Assertions.assertThat(current)
+                      .isLessThanOrEqualTo(warnValue);
+
+        if (failValue != disabledValue)
+            Assertions.assertThat(current)
+                      .isLessThanOrEqualTo(failValue);
+    }
+
+    protected void assertMinThresholdValid(String query) throws Throwable
+    {
+        assertValid(query);
+
+        long warnValue = warnGetter.applyAsLong(guardrails());
+        long failValue = failGetter.applyAsLong(guardrails());
+        long current = currentValue();
+
+        if (warnValue != disabledValue)
+            Assertions.assertThat(current)
+                      .isGreaterThanOrEqualTo(warnValue);
+
+        if (failValue != disabledValue)
+            Assertions.assertThat(current)
+                      .isGreaterThanOrEqualTo(failValue);
+    }
+
+
+    protected void assertThresholdWarns(String query, String message) throws Throwable
+    {
+        assertThresholdWarns(query, message, message);
+    }
+
+    protected void assertThresholdWarns(String query, String message, String redactedMessage) throws Throwable
+    {
+        assertThresholdWarns(query, Collections.singletonList(message), Collections.singletonList(redactedMessage));
+    }
+
+    protected void assertThresholdWarns(String query, List<String> messages) throws Throwable
+    {
+        assertThresholdWarns(query, messages, messages);
+    }
+
+    protected void assertThresholdWarns(String query, List<String> messages, List<String> redactedMessages) throws Throwable
+    {
+        assertWarns(query, messages, redactedMessages);
+
+        Assertions.assertThat(currentValue())
+                  .isGreaterThan(warnGetter.applyAsLong(guardrails()))
+                  .isLessThanOrEqualTo(failGetter.applyAsLong(guardrails()));
+    }
+
+    protected void assertThresholdFails(String query, String message) throws Throwable
+    {
+        assertThresholdFails(query, message, message);
+    }
+
+    protected void assertThresholdFails(String query, String message, String redactedMessage) throws Throwable
+    {
+        assertThresholdFails(query, Collections.singletonList(message), Collections.singletonList(redactedMessage));
+    }
+
+    protected void assertThresholdFails(String query, List<String> messages) throws Throwable
+    {
+        assertThresholdFails(query, messages, messages);
+    }
+
+    protected void assertThresholdFails(String query, List<String> messages, List<String> redactedMessages) throws Throwable
+    {
+        assertFails(query, messages, redactedMessages);
+
+        Assertions.assertThat(currentValue())
+                  .isGreaterThanOrEqualTo(warnGetter.applyAsLong(guardrails()))
+                  .isEqualTo(failGetter.applyAsLong(guardrails()));
+    }
+
+    protected void assertInvalidPositiveProperty(BiConsumer<Guardrails, Long> setter,
+                                               long value,
+                                               long maxValue,
+                                               String name)
+    {
+        try
+        {
+            assertValidProperty(setter, value);
+            fail(format("Expected exception for guardrails.%s value: %d", name, value));
+        }
+        catch (IllegalArgumentException e)
+        {
+            String expectedMessage = null;
+
+            if (value > maxValue)
+                expectedMessage = format("Invalid value %d for %s: maximum allowed value is %d",
+                                         value, name, maxValue);
+
+            if (value == 0 && value != disabledValue)
+                expectedMessage = format("Invalid value for %s: 0 is not allowed; if attempting to disable use %s",
+                                         name, disabledValue);
+
+            if (value < 0 && disabledValue != null && value != disabledValue)
+                expectedMessage = format("Invalid value %d for %s: negative values are not "
+                                         + "allowed, outside of %s which disables the guardrail",
+                                         value, name, disabledValue);
+
+            if (expectedMessage == null && value < 0)
+                expectedMessage = format("Invalid data storage: value must be non-negative");
+
+            assertEquals(format("Exception message '%s' does not contain '%s'", e.getMessage(), expectedMessage),
+                         expectedMessage, e.getMessage());
+        }
+    }
+
+    private void assertInvalidStrictlyPositiveProperty(BiConsumer<Guardrails, Long> setter, long value, String name)
+    {
+        assertInvalidPositiveProperty(setter, value, maxValue, name);
+    }
+
+    protected void assertInvalidPositiveIntProperty (BiConsumer<Guardrails, Integer> setter, int value,
+                                                     int maxValue,
+                                                     String name)
+    {
+        assertInvalidPositiveProperty((g, l) -> setter.accept(g, l.intValue()), (long) value, maxValue, name);
+    }
+
+    protected void testValidationOfStrictlyPositiveProperty(BiConsumer<Guardrails, Long> setter, String name)
+    {
+        assertInvalidStrictlyPositiveProperty(setter, Integer.MIN_VALUE, name);
+        assertInvalidStrictlyPositiveProperty(setter, -2, name);
+        assertValidProperty(setter, disabledValue);
+        assertInvalidStrictlyPositiveProperty(setter, disabledValue == null ? -1 : 0, name);
+        assertValidProperty(setter, 1L);
+        assertValidProperty(setter, 2L);
+        assertValidProperty(setter, maxValue);
+    }
+
+    @FunctionalInterface
+    public interface TriConsumer<T, U, V>
+    {
+        void accept(T t, U u, V v);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/lifecycle/HelpersTest.java b/test/unit/org/apache/cassandra/db/lifecycle/HelpersTest.java
index 7acd3e6..1b121c1 100644
--- a/test/unit/org/apache/cassandra/db/lifecycle/HelpersTest.java
+++ b/test/unit/org/apache/cassandra/db/lifecycle/HelpersTest.java
@@ -38,8 +38,8 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.MockSchema;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
 public class HelpersTest
diff --git a/test/unit/org/apache/cassandra/db/lifecycle/LifecycleTransactionTest.java b/test/unit/org/apache/cassandra/db/lifecycle/LifecycleTransactionTest.java
index 1e0d157..781a468 100644
--- a/test/unit/org/apache/cassandra/db/lifecycle/LifecycleTransactionTest.java
+++ b/test/unit/org/apache/cassandra/db/lifecycle/LifecycleTransactionTest.java
@@ -30,7 +30,6 @@
 import org.junit.Assert;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.Memtable;
 import org.apache.cassandra.db.commitlog.CommitLogPosition;
 import org.apache.cassandra.db.compaction.OperationType;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction.ReaderState.Action;
@@ -77,7 +76,7 @@
     public void testUpdates() // (including obsoletion)
     {
         ColumnFamilyStore cfs = MockSchema.newCFS();
-        Tracker tracker = new Tracker(null, false);
+        Tracker tracker = Tracker.newDummyTracker();
         SSTableReader[] readers = readersArray(0, 3, cfs);
         SSTableReader[] readers2 = readersArray(0, 4, cfs);
         SSTableReader[] readers3 = readersArray(0, 4, cfs);
@@ -141,7 +140,7 @@
     public void testCancellation()
     {
         ColumnFamilyStore cfs = MockSchema.newCFS();
-        Tracker tracker = new Tracker(null, false);
+        Tracker tracker = Tracker.newDummyTracker();
         List<SSTableReader> readers = readers(0, 3, cfs);
         tracker.addInitialSSTables(readers);
         LifecycleTransaction txn = tracker.tryModify(readers, OperationType.UNKNOWN);
@@ -185,7 +184,7 @@
     public void testSplit()
     {
         ColumnFamilyStore cfs = MockSchema.newCFS();
-        Tracker tracker = new Tracker(null, false);
+        Tracker tracker = Tracker.newDummyTracker();
         List<SSTableReader> readers = readers(0, 4, cfs);
         tracker.addInitialSSTables(readers);
         LifecycleTransaction txn = tracker.tryModify(readers, OperationType.UNKNOWN);
@@ -271,7 +270,7 @@
 
         private static Tracker tracker(ColumnFamilyStore cfs, List<SSTableReader> readers)
         {
-            Tracker tracker = new Tracker(new Memtable(new AtomicReference<>(CommitLogPosition.NONE), cfs), false);
+            Tracker tracker = new Tracker(cfs, cfs.createMemtable(new AtomicReference<>(CommitLogPosition.NONE)), false);
             tracker.addInitialSSTables(readers);
             return tracker;
         }
diff --git a/test/unit/org/apache/cassandra/db/lifecycle/LogTransactionTest.java b/test/unit/org/apache/cassandra/db/lifecycle/LogTransactionTest.java
index a4e74ce..2812353 100644
--- a/test/unit/org/apache/cassandra/db/lifecycle/LogTransactionTest.java
+++ b/test/unit/org/apache/cassandra/db/lifecycle/LogTransactionTest.java
@@ -17,11 +17,11 @@
  */
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
-import java.io.IOError;
+
 import java.io.IOException;
-import java.io.RandomAccessFile;
+import java.io.UncheckedIOException;
 import java.nio.file.Files;
+import java.nio.file.NoSuchFileException;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -32,6 +32,7 @@
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterables;
@@ -39,21 +40,25 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.compaction.OperationType;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.io.sstable.metadata.MetadataType;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileHandle;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.utils.AlwaysPresentFilter;
+import org.apache.cassandra.utils.Throwables;
 import org.apache.cassandra.utils.concurrent.AbstractTransactionalTest;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
@@ -141,9 +146,9 @@
 
             void assertInProgress() throws Exception
             {
-                assertFiles(dataFolder.getPath(), Sets.newHashSet(Iterables.concat(sstableNew.getAllFilePaths(),
-                                                                                   sstableOld.getAllFilePaths(),
-                                                                                   txnLogs.logFilePaths())));
+                assertFiles(dataFolder.path(), Sets.newHashSet(Iterables.concat(sstableNew.getAllFilePaths(),
+                                                                                sstableOld.getAllFilePaths(),
+                                                                                txnLogs.logFilePaths())));
             }
 
             void assertPrepared() throws Exception
@@ -152,12 +157,12 @@
 
             void assertAborted() throws Exception
             {
-                assertFiles(dataFolder.getPath(), new HashSet<>(sstableOld.getAllFilePaths()));
+                assertFiles(dataFolder.path(), new HashSet<>(sstableOld.getAllFilePaths()));
             }
 
             void assertCommitted() throws Exception
             {
-                assertFiles(dataFolder.getPath(), new HashSet<>(sstableNew.getAllFilePaths()));
+                assertFiles(dataFolder.path(), new HashSet<>(sstableNew.getAllFilePaths()));
             }
         }
 
@@ -225,15 +230,15 @@
         Thread.sleep(1);
         LogTransaction.waitForDeletions();
 
-        assertFiles(dataFolder.getPath(), Collections.<String>emptySet());
+        assertFiles(dataFolder.path(), Collections.<String>emptySet());
     }
 
     @Test
     public void testUntrackIdenticalLogFilesOnDisk() throws Throwable
     {
         ColumnFamilyStore cfs = MockSchema.newCFS(KEYSPACE);
-        File datadir1 = Files.createTempDirectory("datadir1").toFile();
-        File datadir2 = Files.createTempDirectory("datadir2").toFile();
+        File datadir1 = new File(Files.createTempDirectory("datadir1"));
+        File datadir2 = new File(Files.createTempDirectory("datadir2"));
         SSTableReader sstable1 = sstable(datadir1, cfs, 1, 128);
         SSTableReader sstable2 = sstable(datadir2, cfs, 1, 128);
 
@@ -285,7 +290,7 @@
         sstableOld1.selfRef().release();
         sstableOld2.selfRef().release();
 
-        assertFiles(dataFolder.getPath(), new HashSet<>(sstableNew.getAllFilePaths()));
+        assertFiles(dataFolder.path(), new HashSet<>(sstableNew.getAllFilePaths()));
 
         sstableNew.selfRef().release();
     }
@@ -303,7 +308,7 @@
         log.trackNew(sstable);
         log.finish();
 
-        assertFiles(dataFolder.getPath(), new HashSet<>(sstable.getAllFilePaths()));
+        assertFiles(dataFolder.path(), new HashSet<>(sstable.getAllFilePaths()));
 
         sstable.selfRef().release();
     }
@@ -325,7 +330,7 @@
         sstable.markObsolete(tidier);
         sstable.selfRef().release();
 
-        assertFiles(dataFolder.getPath(), new HashSet<>());
+        assertFiles(dataFolder.path(), new HashSet<>());
     }
 
     @Test
@@ -361,8 +366,8 @@
         Arrays.stream(sstables).forEach(s -> s.selfRef().release());
         LogTransaction.waitForDeletions();
 
-        assertFiles(dataFolder1.getPath(), new HashSet<>(sstables[1].getAllFilePaths()));
-        assertFiles(dataFolder2.getPath(), new HashSet<>(sstables[3].getAllFilePaths()));
+        assertFiles(dataFolder1.path(), new HashSet<>(sstables[1].getAllFilePaths()));
+        assertFiles(dataFolder2.path(), new HashSet<>(sstables[3].getAllFilePaths()));
     }
 
     @Test
@@ -380,7 +385,7 @@
 
         sstable.selfRef().release();
 
-        assertFiles(dataFolder.getPath(), new HashSet<>());
+        assertFiles(dataFolder.path(), new HashSet<>());
     }
 
     @Test
@@ -401,7 +406,7 @@
 
         sstable.selfRef().release();
 
-        assertFiles(dataFolder.getPath(), new HashSet<>(sstable.getAllFilePaths()));
+        assertFiles(dataFolder.path(), new HashSet<>(sstable.getAllFilePaths()));
     }
 
     @Test
@@ -435,8 +440,8 @@
         Arrays.stream(sstables).forEach(s -> s.selfRef().release());
         LogTransaction.waitForDeletions();
 
-        assertFiles(dataFolder1.getPath(), new HashSet<>(sstables[0].getAllFilePaths()));
-        assertFiles(dataFolder2.getPath(), new HashSet<>(sstables[2].getAllFilePaths()));
+        assertFiles(dataFolder1.path(), new HashSet<>(sstables[0].getAllFilePaths()));
+        assertFiles(dataFolder2.path(), new HashSet<>(sstables[2].getAllFilePaths()));
     }
 
 
@@ -470,7 +475,7 @@
         Map<Descriptor, Set<Component>> sstables = directories.sstableLister(Directories.OnTxnErr.THROW).list();
         assertEquals(1, sstables.size());
 
-        assertFiles(dataFolder.getPath(), new HashSet<>(sstableOld.getAllFilePaths()));
+        assertFiles(dataFolder.path(), new HashSet<>(sstableOld.getAllFilePaths()));
 
         // complete the transaction before releasing files
         tidier.run();
@@ -510,7 +515,7 @@
         Map<Descriptor, Set<Component>> sstables = directories.sstableLister(Directories.OnTxnErr.THROW).list();
         assertEquals(1, sstables.size());
 
-        assertFiles(dataFolder.getPath(), new HashSet<>(sstableNew.getAllFilePaths()));
+        assertFiles(dataFolder.path(), new HashSet<>(sstableNew.getAllFilePaths()));
 
         // complete the transaction to avoid LEAK errors
         tidier.run();
@@ -560,8 +565,8 @@
         assertTrue(LogTransaction.removeUnfinishedLeftovers(Arrays.asList(dataFolder1, dataFolder2)));
 
         // new tables should be only table left
-        assertFiles(dataFolder1.getPath(), new HashSet<>(sstables[1].getAllFilePaths()));
-        assertFiles(dataFolder2.getPath(), new HashSet<>(sstables[3].getAllFilePaths()));
+        assertFiles(dataFolder1.path(), new HashSet<>(sstables[1].getAllFilePaths()));
+        assertFiles(dataFolder2.path(), new HashSet<>(sstables[3].getAllFilePaths()));
 
         // complete the transaction to avoid LEAK errors
         Arrays.stream(tidiers).forEach(LogTransaction.SSTableTidier::run);
@@ -611,8 +616,8 @@
         assertTrue(LogTransaction.removeUnfinishedLeftovers(Arrays.asList(dataFolder1, dataFolder2)));
 
         // old tables should be only table left
-        assertFiles(dataFolder1.getPath(), new HashSet<>(sstables[0].getAllFilePaths()));
-        assertFiles(dataFolder2.getPath(), new HashSet<>(sstables[2].getAllFilePaths()));
+        assertFiles(dataFolder1.path(), new HashSet<>(sstables[0].getAllFilePaths()));
+        assertFiles(dataFolder2.path(), new HashSet<>(sstables[2].getAllFilePaths()));
 
         // complete the transaction to avoid LEAK errors
         Arrays.stream(tidiers).forEach(LogTransaction.SSTableTidier::run);
@@ -780,18 +785,18 @@
         if (shouldCommit)
         {
             // only new sstables should still be there
-            assertFiles(dataFolder1.getPath(), new HashSet<>(sstables[1].getAllFilePaths()));
-            assertFiles(dataFolder2.getPath(), new HashSet<>(sstables[3].getAllFilePaths()));
+            assertFiles(dataFolder1.path(), new HashSet<>(sstables[1].getAllFilePaths()));
+            assertFiles(dataFolder2.path(), new HashSet<>(sstables[3].getAllFilePaths()));
         }
         else
         {
             // all files should still be there
-            assertFiles(dataFolder1.getPath(), Sets.newHashSet(Iterables.concat(sstables[0].getAllFilePaths(),
-                                                                                sstables[1].getAllFilePaths(),
-                                                                                Collections.singleton(log.logFilePaths().get(0)))));
-            assertFiles(dataFolder2.getPath(), Sets.newHashSet(Iterables.concat(sstables[2].getAllFilePaths(),
-                                                                                sstables[3].getAllFilePaths(),
-                                                                                Collections.singleton(log.logFilePaths().get(1)))));
+            assertFiles(dataFolder1.path(), Sets.newHashSet(Iterables.concat(sstables[0].getAllFilePaths(),
+                                                                             sstables[1].getAllFilePaths(),
+                                                                             Collections.singleton(log.logFilePaths().get(0)))));
+            assertFiles(dataFolder2.path(), Sets.newHashSet(Iterables.concat(sstables[2].getAllFilePaths(),
+                                                                             sstables[3].getAllFilePaths(),
+                                                                             Collections.singleton(log.logFilePaths().get(1)))));
         }
 
 
@@ -816,7 +821,7 @@
         {
             Directories directories = new Directories(cfs.metadata());
 
-            File[] beforeSecondSSTable = dataFolder.listFiles(pathname -> !pathname.isDirectory());
+            File[] beforeSecondSSTable = dataFolder.tryList(pathname -> !pathname.isDirectory());
 
             SSTableReader sstable2 = sstable(dataFolder, cfs, 1, 128);
             log.trackNew(sstable2);
@@ -825,7 +830,7 @@
             assertEquals(2, sstables.size());
 
             // this should contain sstable1, sstable2 and the transaction log file
-            File[] afterSecondSSTable = dataFolder.listFiles(pathname -> !pathname.isDirectory());
+            File[] afterSecondSSTable = dataFolder.tryList(pathname -> !pathname.isDirectory());
 
             int numNewFiles = afterSecondSSTable.length - beforeSecondSSTable.length;
             assertEquals(numNewFiles - 1, sstable2.getAllFilePaths().size()); // new files except for transaction log file
@@ -1070,7 +1075,7 @@
             LogTransaction.removeUnfinishedLeftovers(cfs.metadata());
 
             // make sure to exclude the old files that were deleted by the modifier
-            assertFiles(dataFolder.getPath(), oldFiles);
+            assertFiles(dataFolder.path(), oldFiles);
         }
         else
         { // if an intermediate line was also modified, it should ignore the tx log file
@@ -1078,9 +1083,9 @@
             //This should not remove any files
             LogTransaction.removeUnfinishedLeftovers(cfs.metadata());
 
-            assertFiles(dataFolder.getPath(), Sets.newHashSet(Iterables.concat(newFiles,
-                                                                               oldFiles,
-                                                                               log.logFilePaths())));
+            assertFiles(dataFolder.path(), Sets.newHashSet(Iterables.concat(newFiles,
+                                                                            oldFiles,
+                                                                            log.logFilePaths())));
         }
 
         // make sure to run the tidier to avoid any leaks in the logs
@@ -1096,7 +1101,7 @@
                                       for (String filePath : sstable.getAllFilePaths())
                                       {
                                           if (filePath.endsWith("Data.db"))
-                                              assertTrue(new File(filePath).setLastModified(System.currentTimeMillis() + 60000)); //one minute later
+                                              assertTrue(new File(filePath).trySetLastModified(System.currentTimeMillis() + 60000)); //one minute later
                                       }
                                   });
     }
@@ -1124,7 +1129,7 @@
         //This should not remove the old files
         LogTransaction.removeUnfinishedLeftovers(cfs.metadata());
 
-        assertFiles(dataFolder.getPath(), Sets.newHashSet(Iterables.concat(
+        assertFiles(dataFolder.path(), Sets.newHashSet(Iterables.concat(
                                                                           sstableNew.getAllFilePaths(),
                                                                           sstableOld.getAllFilePaths(),
                                                                           log.logFilePaths())));
@@ -1135,9 +1140,9 @@
         // complete the transaction to avoid LEAK errors
         assertNull(log.complete(null));
 
-        assertFiles(dataFolder.getPath(), Sets.newHashSet(Iterables.concat(sstableNew.getAllFilePaths(),
-                                                                           sstableOld.getAllFilePaths(),
-                                                                           log.logFilePaths())));
+        assertFiles(dataFolder.path(), Sets.newHashSet(Iterables.concat(sstableNew.getAllFilePaths(),
+                                                                        sstableOld.getAllFilePaths(),
+                                                                        log.logFilePaths())));
 
         // make sure to run the tidier to avoid any leaks in the logs
         tidier.run();
@@ -1156,7 +1161,7 @@
                                       {
                                           File f = new File(filePath);
                                           long lastModified = f.lastModified();
-                                          f.setLastModified(lastModified - (lastModified % 1000));
+                                          f.trySetLastModified(lastModified - (lastModified % 1000));
                                       }
                                   });
     }
@@ -1184,13 +1189,13 @@
         LogTransaction.removeUnfinishedLeftovers(cfs.metadata());
 
         // only the new files should be there
-        assertFiles(dataFolder.getPath(), Sets.newHashSet(sstableNew.getAllFilePaths()));
+        assertFiles(dataFolder.path(), Sets.newHashSet(sstableNew.getAllFilePaths()));
         sstableNew.selfRef().release();
 
         // complete the transaction to avoid LEAK errors
         assertNull(log.complete(null));
 
-        assertFiles(dataFolder.getPath(), Sets.newHashSet(sstableNew.getAllFilePaths()));
+        assertFiles(dataFolder.path(), Sets.newHashSet(sstableNew.getAllFilePaths()));
 
         // make sure to run the tidier to avoid any leaks in the logs
         tidier.run();
@@ -1256,17 +1261,15 @@
 
     private static SSTableReader sstable(File dataFolder, ColumnFamilyStore cfs, int generation, int size) throws IOException
     {
-        Descriptor descriptor = new Descriptor(dataFolder, cfs.keyspace.getName(), cfs.getTableName(), generation, SSTableFormat.Type.BIG);
+        Descriptor descriptor = new Descriptor(dataFolder, cfs.keyspace.getName(), cfs.getTableName(), new SequenceBasedSSTableId(generation), SSTableFormat.Type.BIG);
         Set<Component> components = ImmutableSet.of(Component.DATA, Component.PRIMARY_INDEX, Component.FILTER, Component.TOC);
         for (Component component : components)
         {
             File file = new File(descriptor.filenameFor(component));
             if (!file.exists())
-                assertTrue(file.createNewFile());
-            try (RandomAccessFile raf = new RandomAccessFile(file, "rw"))
-            {
-                raf.setLength(size);
-            }
+                assertTrue(file.createFileIfNotExists());
+
+            Util.setFileLength(file, size);
         }
 
         FileHandle dFile = new FileHandle.Builder(descriptor.filenameFor(Component.DATA)).complete();
@@ -1300,8 +1303,8 @@
     {
         LogTransaction.waitForDeletions();
 
-        File dir = new File(dirPath).getCanonicalFile();
-        File[] files = dir.listFiles();
+        File dir = new File(dirPath).toCanonical();
+        File[] files = dir.tryList();
         if (files != null)
         {
             for (File file : files)
@@ -1309,7 +1312,7 @@
                 if (file.isDirectory())
                     continue;
 
-                String filePath = file.getPath();
+                String filePath = file.path();
                 assertTrue(String.format("%s not in [%s]", filePath, expectedFiles), expectedFiles.contains(filePath));
                 expectedFiles.remove(filePath);
             }
@@ -1329,8 +1332,7 @@
     }
 
     // Check either that a temporary file is expected to exist (in the existingFiles) or that
-    // it does not exist any longer (on Windows we need to check File.exists() because a list
-    // might return a file as existing even if it does not)
+    // it does not exist any longer.
     private static void assertFiles(Iterable<String> existingFiles, Set<File> temporaryFiles)
     {
         for (String filePath : existingFiles)
@@ -1359,6 +1361,28 @@
         return listFiles(folder, Directories.FileType.FINAL);
     }
 
+    // Used by listFiles - this test is deliberately racing with files being
+    // removed and cleaned up, so it is possible that files are removed between listing and getting their
+    // canonical names, in which case they can be dropped from the stream.
+    private static Stream<File> toCanonicalIgnoringNotFound(File file)
+    {
+        try
+        {
+            return Stream.of(file.toCanonical());
+        }
+        catch (UncheckedIOException io)
+        {
+            if (Throwables.isCausedBy(io, t -> t instanceof NoSuchFileException))
+            {
+                return Stream.empty();
+            }
+            else
+            {
+                throw io;
+            }
+        }
+    }
+
     static Set<File> listFiles(File folder, Directories.FileType... types)
     {
         Collection<Directories.FileType> match = Arrays.asList(types);
@@ -1366,16 +1390,7 @@
                                       (file, type) -> match.contains(type),
                                       Directories.OnTxnErr.IGNORE).list()
                        .stream()
-                       .map(f -> {
-                           try
-                           {
-                               return f.getCanonicalFile();
-                           }
-                           catch (IOException e)
-                           {
-                               throw new IOError(e);
-                           }
-                       })
+                       .flatMap(LogTransactionTest::toCanonicalIgnoringNotFound)
                        .collect(Collectors.toSet());
     }
 }
diff --git a/test/unit/org/apache/cassandra/db/lifecycle/RealTransactionsTest.java b/test/unit/org/apache/cassandra/db/lifecycle/RealTransactionsTest.java
index b7b7d4a..0420957 100644
--- a/test/unit/org/apache/cassandra/db/lifecycle/RealTransactionsTest.java
+++ b/test/unit/org/apache/cassandra/db/lifecycle/RealTransactionsTest.java
@@ -18,13 +18,13 @@
 
 package org.apache.cassandra.db.lifecycle;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -47,6 +47,7 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -84,8 +85,8 @@
         LogTransaction.waitForDeletions();
 
         // both sstables are in the same folder
-        assertFiles(oldSSTable.descriptor.directory.getPath(), new HashSet<>(newSSTable.getAllFilePaths()));
-        assertFiles(newSSTable.descriptor.directory.getPath(), new HashSet<>(newSSTable.getAllFilePaths()));
+        assertFiles(oldSSTable.descriptor.directory.path(), new HashSet<>(newSSTable.getAllFilePaths()));
+        assertFiles(newSSTable.descriptor.directory.path(), new HashSet<>(newSSTable.getAllFilePaths()));
     }
 
     @Test
@@ -100,7 +101,7 @@
         replaceSSTable(cfs, txn, true);
         LogTransaction.waitForDeletions();
 
-        assertFiles(oldSSTable.descriptor.directory.getPath(), new HashSet<>(oldSSTable.getAllFilePaths()));
+        assertFiles(oldSSTable.descriptor.directory.path(), new HashSet<>(oldSSTable.getAllFilePaths()));
     }
 
     @Test
@@ -111,7 +112,7 @@
 
         SSTableReader ssTableReader = getSSTable(cfs, 100);
 
-        String dataFolder = cfs.getLiveSSTables().iterator().next().descriptor.directory.getPath();
+        String dataFolder = cfs.getLiveSSTables().iterator().next().descriptor.directory.path();
         assertFiles(dataFolder, new HashSet<>(ssTableReader.getAllFilePaths()));
     }
 
@@ -155,7 +156,7 @@
                  CompactionIterator ci = new CompactionIterator(txn.opType(), scanners.scanners, controller, nowInSec, txn.opId())
             )
             {
-                long lastCheckObsoletion = System.nanoTime();
+                long lastCheckObsoletion = nanoTime();
                 File directory = txn.originals().iterator().next().descriptor.directory;
                 Descriptor desc = cfs.newSSTableDescriptor(directory);
                 TableMetadataRef metadata = Schema.instance.getTableMetadataRef(desc);
@@ -173,10 +174,10 @@
                 {
                     rewriter.append(ci.next());
 
-                    if (System.nanoTime() - lastCheckObsoletion > TimeUnit.MINUTES.toNanos(1L))
+                    if (nanoTime() - lastCheckObsoletion > TimeUnit.MINUTES.toNanos(1L))
                     {
                         controller.maybeRefreshOverlaps();
-                        lastCheckObsoletion = System.nanoTime();
+                        lastCheckObsoletion = nanoTime();
                     }
                 }
 
@@ -201,12 +202,12 @@
     private void assertFiles(String dirPath, Set<String> expectedFiles)
     {
         File dir = new File(dirPath);
-        for (File file : dir.listFiles())
+        for (File file : dir.tryList())
         {
             if (file.isDirectory())
                 continue;
 
-            String filePath = file.getPath();
+            String filePath = file.path();
             assertTrue(filePath, expectedFiles.contains(filePath));
             expectedFiles.remove(filePath);
         }
diff --git a/test/unit/org/apache/cassandra/db/lifecycle/TrackerTest.java b/test/unit/org/apache/cassandra/db/lifecycle/TrackerTest.java
index 4390b20..e39f71f 100644
--- a/test/unit/org/apache/cassandra/db/lifecycle/TrackerTest.java
+++ b/test/unit/org/apache/cassandra/db/lifecycle/TrackerTest.java
@@ -24,23 +24,22 @@
 import java.util.Optional;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicReference;
-
 import javax.annotation.Nullable;
 
 import com.google.common.base.Function;
 import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Iterables;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.junit.Assert;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.Memtable;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.commitlog.CommitLogPosition;
 import org.apache.cassandra.db.compaction.OperationType;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.notifications.*;
 import org.apache.cassandra.schema.CachingParams;
@@ -85,7 +84,7 @@
     public void testTryModify()
     {
         ColumnFamilyStore cfs = MockSchema.newCFS();
-        Tracker tracker = new Tracker(null, false);
+        Tracker tracker = Tracker.newDummyTracker();
         List<SSTableReader> readers = ImmutableList.of(MockSchema.sstable(0, true, cfs), MockSchema.sstable(1, cfs), MockSchema.sstable(2, cfs));
         tracker.addInitialSSTables(copyOf(readers));
         Assert.assertNull(tracker.tryModify(ImmutableList.of(MockSchema.sstable(0, cfs)), OperationType.COMPACTION));
@@ -108,7 +107,7 @@
     public void testApply()
     {
         final ColumnFamilyStore cfs = MockSchema.newCFS();
-        final Tracker tracker = new Tracker(null, false);
+        final Tracker tracker = Tracker.newDummyTracker();
         final View resultView = ViewTest.fakeView(0, 0, cfs);
         final AtomicInteger count = new AtomicInteger();
         tracker.apply(new Predicate<View>()
@@ -277,15 +276,15 @@
         Tracker tracker = cfs.getTracker();
         tracker.subscribe(listener);
 
-        Memtable prev1 = tracker.switchMemtable(true, new Memtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition()), cfs));
+        Memtable prev1 = tracker.switchMemtable(true, cfs.createMemtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition())));
         OpOrder.Group write1 = cfs.keyspace.writeOrder.getCurrent();
         OpOrder.Barrier barrier1 = cfs.keyspace.writeOrder.newBarrier();
-        prev1.setDiscarding(barrier1, new AtomicReference<>(CommitLog.instance.getCurrentPosition()));
+        prev1.switchOut(barrier1, new AtomicReference<>(CommitLog.instance.getCurrentPosition()));
         barrier1.issue();
-        Memtable prev2 = tracker.switchMemtable(false, new Memtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition()), cfs));
+        Memtable prev2 = tracker.switchMemtable(false, cfs.createMemtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition())));
         OpOrder.Group write2 = cfs.keyspace.writeOrder.getCurrent();
         OpOrder.Barrier barrier2 = cfs.keyspace.writeOrder.newBarrier();
-        prev2.setDiscarding(barrier2, new AtomicReference<>(CommitLog.instance.getCurrentPosition()));
+        prev2.switchOut(barrier2, new AtomicReference<>(CommitLog.instance.getCurrentPosition()));
         barrier2.issue();
         Memtable cur = tracker.getView().getCurrentMemtable();
         OpOrder.Group writecur = cfs.keyspace.writeOrder.getCurrent();
@@ -325,7 +324,7 @@
         tracker = cfs.getTracker();
         listener = new MockListener(false);
         tracker.subscribe(listener);
-        prev1 = tracker.switchMemtable(false, new Memtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition()), cfs));
+        prev1 = tracker.switchMemtable(false, cfs.createMemtable(new AtomicReference<>(CommitLog.instance.getCurrentPosition())));
         tracker.markFlushing(prev1);
         reader = MockSchema.sstable(0, 10, true, cfs);
         cfs.invalidate(false);
@@ -348,7 +347,7 @@
     {
         ColumnFamilyStore cfs = MockSchema.newCFS();
         SSTableReader r1 = MockSchema.sstable(0, cfs), r2 = MockSchema.sstable(1, cfs);
-        Tracker tracker = new Tracker(null, false);
+        Tracker tracker = Tracker.newDummyTracker();
         MockListener listener = new MockListener(false);
         tracker.subscribe(listener);
         tracker.notifyAdded(singleton(r1), false);
diff --git a/test/unit/org/apache/cassandra/db/lifecycle/ViewTest.java b/test/unit/org/apache/cassandra/db/lifecycle/ViewTest.java
index fd32087..eb162d5 100644
--- a/test/unit/org/apache/cassandra/db/lifecycle/ViewTest.java
+++ b/test/unit/org/apache/cassandra/db/lifecycle/ViewTest.java
@@ -34,9 +34,9 @@
 import org.junit.Assert;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.Memtable;
 import org.apache.cassandra.db.PartitionPosition;
 import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.db.memtable.Memtable;
 import org.apache.cassandra.dht.AbstractBounds;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.schema.MockSchema;
diff --git a/test/unit/org/apache/cassandra/db/marshal/CollectionTypesTest.java b/test/unit/org/apache/cassandra/db/marshal/CollectionTypesTest.java
index 971af76..889364b 100644
--- a/test/unit/org/apache/cassandra/db/marshal/CollectionTypesTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/CollectionTypesTest.java
@@ -31,7 +31,6 @@
 import org.junit.Test;
 
 import org.apache.cassandra.cql3.CQL3Type;
-import org.apache.cassandra.transport.ProtocolVersion;
 
 import static org.apache.cassandra.db.marshal.ValueAccessors.ACCESSORS;
 
diff --git a/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java
index eb838d3..ecdf0d7 100644
--- a/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/CompositeTypeTest.java
@@ -26,6 +26,8 @@
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.fail;
 import static org.junit.Assert.assertEquals;
 
@@ -40,6 +42,7 @@
 import org.apache.cassandra.exceptions.SyntaxException;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.serializers.MarshalException;
+import org.apache.cassandra.serializers.UUIDSerializer;
 import org.apache.cassandra.utils.*;
 
 public class CompositeTypeTest
@@ -57,11 +60,11 @@
     }
 
     private static final int UUID_COUNT = 3;
-    private static final UUID[] uuids = new UUID[UUID_COUNT];
+    private static final TimeUUID[] uuids = new TimeUUID[UUID_COUNT];
     static
     {
         for (int i = 0; i < UUID_COUNT; ++i)
-            uuids[i] = UUIDGen.getTimeUUID();
+            uuids[i] = nextTimeUUID();
     }
 
     @BeforeClass
@@ -138,7 +141,7 @@
         ByteBuffer key = createCompositeKey("test1", uuids[1], 42, false);
         comparator.validate(key);
 
-        key = createCompositeKey("test1", null, -1, false);
+        key = createCompositeKey("test1", (ByteBuffer) null, -1, false);
         comparator.validate(key);
 
         key = createCompositeKey("test1", uuids[2], -1, true);
@@ -168,7 +171,7 @@
             assert e.toString().contains("should be 16 or 0 bytes");
         }
 
-        key = createCompositeKey("test1", UUID.randomUUID(), 42, false);
+        key = createCompositeKey("test1", UUIDSerializer.instance.serialize(UUID.randomUUID()), 42, false);
         try
         {
             comparator.validate(key);
@@ -186,7 +189,7 @@
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARDCOMPOSITE);
 
-        ByteBuffer cname1 = createCompositeKey("test1", null, -1, false);
+        ByteBuffer cname1 = createCompositeKey("test1", (ByteBuffer) null, -1, false);
         ByteBuffer cname2 = createCompositeKey("test1", uuids[0], 24, false);
         ByteBuffer cname3 = createCompositeKey("test1", uuids[0], 42, false);
         ByteBuffer cname4 = createCompositeKey("test2", uuids[0], -1, false);
@@ -281,7 +284,12 @@
         }
     }
 
-    private ByteBuffer createCompositeKey(String s, UUID uuid, int i, boolean lastIsOne)
+    private ByteBuffer createCompositeKey(String s, TimeUUID uuid, int i, boolean lastIsOne)
+    {
+        return createCompositeKey(s, uuid == null ? null : uuid.toBytes(), i, lastIsOne);
+    }
+
+    private ByteBuffer createCompositeKey(String s, ByteBuffer uuid, int i, boolean lastIsOne)
     {
         ByteBuffer bytes = ByteBufferUtil.bytes(s);
         int totalSize = 0;
@@ -308,7 +316,7 @@
             if (uuid != null)
             {
                 bb.putShort((short) 16);
-                bb.put(UUIDGen.decompose(uuid));
+                bb.put(uuid);
                 bb.put(i == -1 && lastIsOne ? (byte)1 : (byte)0);
                 if (i != -1)
                 {
diff --git a/test/unit/org/apache/cassandra/db/marshal/DecimalTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/DecimalTypeTest.java
index 108f48f..b1f4a43 100644
--- a/test/unit/org/apache/cassandra/db/marshal/DecimalTypeTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/DecimalTypeTest.java
@@ -24,7 +24,6 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 
-import org.apache.cassandra.db.marshal.DecimalType;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.junit.Test;
 
diff --git a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java
index 9f8eec3..d22a8ac 100644
--- a/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/DynamicCompositeTypeTest.java
@@ -27,6 +27,8 @@
 
 import org.junit.BeforeClass;
 import org.junit.Test;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.fail;
 
 import org.apache.cassandra.SchemaLoader;
@@ -62,7 +64,7 @@
     static
     {
         for (int i = 0; i < UUID_COUNT; ++i)
-            uuids[i] = UUIDGen.getTimeUUID();
+            uuids[i] = nextTimeUUID().asUUID();
     }
 
     @BeforeClass
diff --git a/test/unit/org/apache/cassandra/db/marshal/JsonConversionTest.java b/test/unit/org/apache/cassandra/db/marshal/JsonConversionTest.java
index 847ebef..bab0611 100644
--- a/test/unit/org/apache/cassandra/db/marshal/JsonConversionTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/JsonConversionTest.java
@@ -18,6 +18,7 @@
 */
 package org.apache.cassandra.db.marshal;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 
 import java.nio.ByteBuffer;
@@ -25,7 +26,7 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.transport.ProtocolVersion;
-import org.apache.cassandra.utils.UUIDGen;
+
 import org.junit.Test;
 
 public class JsonConversionTest
@@ -282,7 +283,7 @@
     public void testTimeUUID() throws Exception
     {
         String type = "TimeUUIDType";
-        String json = "\"" + UUIDGen.getTimeUUID() + "\"";
+        String json = "\"" + nextTimeUUID() + "\"";
         assertBytebufferPositionAndOutput(json, type);
     }
 
diff --git a/test/unit/org/apache/cassandra/db/marshal/RoundTripTest.java b/test/unit/org/apache/cassandra/db/marshal/RoundTripTest.java
index 9f46850..9a4711a 100644
--- a/test/unit/org/apache/cassandra/db/marshal/RoundTripTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/RoundTripTest.java
@@ -22,6 +22,7 @@
 
 import org.apache.cassandra.serializers.*;
 import org.apache.cassandra.utils.Hex;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.UUIDGen;
 import org.junit.Test;
 
@@ -30,6 +31,8 @@
 import java.nio.charset.StandardCharsets;
 import java.util.UUID;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class RoundTripTest
 {
     @Test
@@ -88,7 +91,7 @@
     @Test
     public void testLexicalUUID()
     {
-        UUID uuid = UUIDGen.getTimeUUID();
+        UUID uuid = nextTimeUUID().asUUID();
         assert LexicalUUIDType.instance.fromString(LexicalUUIDType.instance.getString(ByteBuffer.wrap(UUIDGen.decompose(uuid))))
                 .equals(ByteBuffer.wrap(UUIDGen.decompose(uuid)));
         assert LexicalUUIDType.instance.compose(ByteBuffer.wrap(UUIDGen.decompose(uuid))).equals(uuid);
@@ -98,15 +101,15 @@
     @Test
     public void testTimeUUID()
     {
-        UUID uuid = UUIDGen.getTimeUUID();
+        TimeUUID uuid = nextTimeUUID();
         assert TimeUUIDType.instance.getString(TimeUUIDType.instance.fromString(uuid.toString()))
                 .equals(uuid.toString());
-        assert TimeUUIDType.instance.fromString(TimeUUIDType.instance.getString(ByteBuffer.wrap(UUIDGen.decompose(uuid))))
-                .equals(ByteBuffer.wrap(UUIDGen.decompose(uuid)));
-        assert TimeUUIDType.instance.compose(ByteBuffer.wrap(UUIDGen.decompose(uuid))).equals(uuid);
+        assert TimeUUIDType.instance.fromString(TimeUUIDType.instance.getString(uuid.toBytes()))
+                .equals(uuid.toBytes());
+        assert TimeUUIDType.instance.compose(uuid.toBytes()).equals(uuid);
 
         assert uuid.equals(TimeUUIDType.instance.compose(TimeUUIDType.instance.fromString(uuid.toString())));
-        assert UUIDSerializer.instance.toString(uuid).equals(uuid.toString());
+        assert uuid.toString().equals(uuid.toString());
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java
index 9a71e06..8e2dc31 100644
--- a/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/TimeUUIDTypeTest.java
@@ -24,8 +24,12 @@
 import org.junit.Assert;
 import org.apache.cassandra.serializers.MarshalException;
 import org.junit.Test;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 
+import org.apache.cassandra.serializers.UUIDSerializer;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.UUIDGen;
 
 public class TimeUUIDTypeTest
@@ -35,44 +39,44 @@
     @Test
     public void testEquality()
     {
-        UUID a = UUIDGen.getTimeUUID();
-        UUID b = new UUID(a.getMostSignificantBits(), a.getLeastSignificantBits());
+        TimeUUID a = nextTimeUUID();
+        TimeUUID b = TimeUUID.fromBytes(a.msb(), a.lsb());
 
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(a)));
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(b)));
-        assertEquals(0, timeUUIDType.compare(ByteBuffer.wrap(UUIDGen.decompose(a)), ByteBuffer.wrap(UUIDGen.decompose(b))));
+        timeUUIDType.validate(a.toBytes());
+        timeUUIDType.validate(b.toBytes());
+        assertEquals(0, timeUUIDType.compare(a.toBytes(), b.toBytes()));
     }
 
     @Test
     public void testSmaller()
     {
-        UUID a = UUIDGen.getTimeUUID();
-        UUID b = UUIDGen.getTimeUUID();
-        UUID c = UUIDGen.getTimeUUID();
+        TimeUUID a = nextTimeUUID();
+        TimeUUID b = nextTimeUUID();
+        TimeUUID c = nextTimeUUID();
 
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(a)));
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(b)));
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(c)));
+        timeUUIDType.validate(a.toBytes());
+        timeUUIDType.validate(b.toBytes());
+        timeUUIDType.validate(c.toBytes());
 
-        assert timeUUIDType.compare(ByteBuffer.wrap(UUIDGen.decompose(a)), ByteBuffer.wrap(UUIDGen.decompose(b))) < 0;
-        assert timeUUIDType.compare(ByteBuffer.wrap(UUIDGen.decompose(b)), ByteBuffer.wrap(UUIDGen.decompose(c))) < 0;
-        assert timeUUIDType.compare(ByteBuffer.wrap(UUIDGen.decompose(a)), ByteBuffer.wrap(UUIDGen.decompose(c))) < 0;
+        assert timeUUIDType.compare(a.toBytes(), b.toBytes()) < 0;
+        assert timeUUIDType.compare(b.toBytes(), c.toBytes()) < 0;
+        assert timeUUIDType.compare(a.toBytes(), c.toBytes()) < 0;
     }
 
     @Test
     public void testBigger()
     {
-        UUID a = UUIDGen.getTimeUUID();
-        UUID b = UUIDGen.getTimeUUID();
-        UUID c = UUIDGen.getTimeUUID();
+        TimeUUID a = nextTimeUUID();
+        TimeUUID b = nextTimeUUID();
+        TimeUUID c = nextTimeUUID();
 
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(a)));
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(b)));
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(c)));
+        timeUUIDType.validate(a.toBytes());
+        timeUUIDType.validate(b.toBytes());
+        timeUUIDType.validate(c.toBytes());
 
-        assert timeUUIDType.compare(ByteBuffer.wrap(UUIDGen.decompose(c)), ByteBuffer.wrap(UUIDGen.decompose(b))) > 0;
-        assert timeUUIDType.compare(ByteBuffer.wrap(UUIDGen.decompose(b)), ByteBuffer.wrap(UUIDGen.decompose(a))) > 0;
-        assert timeUUIDType.compare(ByteBuffer.wrap(UUIDGen.decompose(c)), ByteBuffer.wrap(UUIDGen.decompose(a))) > 0;
+        assert timeUUIDType.compare(c.toBytes(), b.toBytes()) > 0;
+        assert timeUUIDType.compare(b.toBytes(), a.toBytes()) > 0;
+        assert timeUUIDType.compare(c.toBytes(), a.toBytes()) > 0;
     }
 
     @Test
@@ -153,7 +157,7 @@
     {
         UUID uuid1 = UUID.fromString("00000000-0000-1000-0000-000000000000");
         assert uuid1.version() == 1;
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(uuid1)));
+        timeUUIDType.validate(UUIDSerializer.instance.serialize(uuid1));
     }
 
     @Test(expected = MarshalException.class)
@@ -161,7 +165,7 @@
     {
         UUID uuid2 = UUID.fromString("00000000-0000-2100-0000-000000000000");
         assert uuid2.version() == 2;
-        timeUUIDType.validate(ByteBuffer.wrap(UUIDGen.decompose(uuid2)));
+        timeUUIDType.validate(UUIDSerializer.instance.serialize(uuid2));
     }
 
 
diff --git a/test/unit/org/apache/cassandra/db/marshal/TimestampTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/TimestampTypeTest.java
index b34207f..3ec63c0 100644
--- a/test/unit/org/apache/cassandra/db/marshal/TimestampTypeTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/TimestampTypeTest.java
@@ -42,4 +42,4 @@
                       .isEqualTo(buffer);
         });
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/db/marshal/TypeValidationTest.java b/test/unit/org/apache/cassandra/db/marshal/TypeValidationTest.java
index 7c0c863..4d25a1f 100644
--- a/test/unit/org/apache/cassandra/db/marshal/TypeValidationTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/TypeValidationTest.java
@@ -40,6 +40,7 @@
 import static org.apache.cassandra.utils.AbstractTypeGenerators.getTypeSupport;
 import static org.apache.cassandra.utils.AbstractTypeGenerators.primitiveTypeGen;
 import static org.apache.cassandra.utils.AbstractTypeGenerators.userTypeGen;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUIDAsBytes;
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
 import static org.quicktheories.QuickTheory.qt;
 
@@ -61,7 +62,7 @@
     @Test
     public void testValidTimeUUID()
     {
-        TimeUUIDType.instance.validate(ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes()));
+        TimeUUIDType.instance.validate(ByteBuffer.wrap(nextTimeUUIDAsBytes()));
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java b/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java
index e82f3f5..87cbbe9 100644
--- a/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java
+++ b/test/unit/org/apache/cassandra/db/marshal/UUIDTypeTest.java
@@ -21,6 +21,7 @@
  *
  */
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 
 import java.nio.ByteBuffer;
@@ -55,8 +56,8 @@
     public void testRandomCompare()
     {
 
-        UUID t1 = UUIDGen.getTimeUUID();
-        UUID t2 = UUIDGen.getTimeUUID();
+        UUID t1 = nextTimeUUID().asUUID();
+        UUID t2 = nextTimeUUID().asUUID();
 
         testCompare(null, t2, -1);
         testCompare(t1, null, 1);
@@ -179,7 +180,7 @@
     @Test
     public void testTimeEquality()
     {
-        UUID a = UUIDGen.getTimeUUID();
+        UUID a = nextTimeUUID().asUUID();
         UUID b = new UUID(a.getMostSignificantBits(),
                 a.getLeastSignificantBits());
 
@@ -189,9 +190,9 @@
     @Test
     public void testTimeSmaller()
     {
-        UUID a = UUIDGen.getTimeUUID();
-        UUID b = UUIDGen.getTimeUUID();
-        UUID c = UUIDGen.getTimeUUID();
+        UUID a = nextTimeUUID().asUUID();
+        UUID b = nextTimeUUID().asUUID();
+        UUID c = nextTimeUUID().asUUID();
 
         assert uuidType.compare(bytebuffer(a), bytebuffer(b)) < 0;
         assert uuidType.compare(bytebuffer(b), bytebuffer(c)) < 0;
@@ -201,9 +202,9 @@
     @Test
     public void testTimeBigger()
     {
-        UUID a = UUIDGen.getTimeUUID();
-        UUID b = UUIDGen.getTimeUUID();
-        UUID c = UUIDGen.getTimeUUID();
+        UUID a = nextTimeUUID().asUUID();
+        UUID b = nextTimeUUID().asUUID();
+        UUID c = nextTimeUUID().asUUID();
 
         assert uuidType.compare(bytebuffer(c), bytebuffer(b)) > 0;
         assert uuidType.compare(bytebuffer(b), bytebuffer(a)) > 0;
diff --git a/test/unit/org/apache/cassandra/db/memtable/TestMemtable.java b/test/unit/org/apache/cassandra/db/memtable/TestMemtable.java
new file mode 100644
index 0000000..ec10c1a
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/memtable/TestMemtable.java
@@ -0,0 +1,35 @@
+/*
+ * 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.memtable;
+
+import java.util.Map;
+
+public class TestMemtable
+{
+    public static Memtable.Factory factory(Map<String, String> options)
+    {
+        String skiplist = options.remove("skiplist");
+        if (Boolean.parseBoolean(skiplist))
+            return SkipListMemtable.FACTORY;
+        else
+            return FACTORY;
+    }
+
+    public static Memtable.Factory FACTORY = SkipListMemtable::new;
+}
diff --git a/test/unit/org/apache/cassandra/db/monitoring/MonitoringTaskTest.java b/test/unit/org/apache/cassandra/db/monitoring/MonitoringTaskTest.java
index dc8c317..9c1e8b1 100644
--- a/test/unit/org/apache/cassandra/db/monitoring/MonitoringTaskTest.java
+++ b/test/unit/org/apache/cassandra/db/monitoring/MonitoringTaskTest.java
@@ -22,7 +22,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -32,11 +31,12 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.cassandra.utils.ApproximateTime;
-
+import static java.lang.Thread.currentThread;
+import static java.util.UUID.randomUUID;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -98,8 +98,8 @@
         long timeout = operations.stream().map(Monitorable::timeoutNanos).reduce(0L, Long::max);
         Thread.sleep(NANOSECONDS.toMillis(timeout * 2 + approxTime.error()));
 
-        long start = System.nanoTime();
-        while(System.nanoTime() - start <= MAX_SPIN_TIME_NANOS)
+        long start = nanoTime();
+        while(nanoTime() - start <= MAX_SPIN_TIME_NANOS)
         {
             long numInProgress = operations.stream().filter(Monitorable::isInProgress).count();
             if (numInProgress == 0)
@@ -117,8 +117,8 @@
         long timeout = operations.stream().map(Monitorable::slowTimeoutNanos).reduce(0L, Long::max);
         Thread.sleep(NANOSECONDS.toMillis(timeout * 2 + approxTime.error()));
 
-        long start = System.nanoTime();
-        while(System.nanoTime() - start <= MAX_SPIN_TIME_NANOS)
+        long start = nanoTime();
+        while(nanoTime() - start <= MAX_SPIN_TIME_NANOS)
         {
             long numSlow = operations.stream().filter(Monitorable::isSlow).count();
             if (numSlow == operations.size())
@@ -129,7 +129,7 @@
     @Test
     public void testAbort() throws InterruptedException
     {
-        Monitorable operation = new TestMonitor("Test abort", System.nanoTime(), false, timeout, slowTimeout);
+        Monitorable operation = new TestMonitor("Test abort", nanoTime(), false, timeout, slowTimeout);
         waitForOperationsToComplete(operation);
 
         assertTrue(operation.isAborted());
@@ -140,7 +140,7 @@
     @Test
     public void testAbortIdemPotent() throws InterruptedException
     {
-        Monitorable operation = new TestMonitor("Test abort", System.nanoTime(), false, timeout, slowTimeout);
+        Monitorable operation = new TestMonitor("Test abort", nanoTime(), false, timeout, slowTimeout);
         waitForOperationsToComplete(operation);
 
         assertTrue(operation.abort());
@@ -153,7 +153,7 @@
     @Test
     public void testAbortCrossNode() throws InterruptedException
     {
-        Monitorable operation = new TestMonitor("Test for cross node", System.nanoTime(), true, timeout, slowTimeout);
+        Monitorable operation = new TestMonitor("Test for cross node", nanoTime(), true, timeout, slowTimeout);
         waitForOperationsToComplete(operation);
 
         assertTrue(operation.isAborted());
@@ -164,7 +164,7 @@
     @Test
     public void testComplete() throws InterruptedException
     {
-        Monitorable operation = new TestMonitor("Test complete", System.nanoTime(), false, timeout, slowTimeout);
+        Monitorable operation = new TestMonitor("Test complete", nanoTime(), false, timeout, slowTimeout);
         operation.complete();
         waitForOperationsToComplete(operation);
 
@@ -176,7 +176,7 @@
     @Test
     public void testCompleteIdemPotent() throws InterruptedException
     {
-        Monitorable operation = new TestMonitor("Test complete", System.nanoTime(), false, timeout, slowTimeout);
+        Monitorable operation = new TestMonitor("Test complete", nanoTime(), false, timeout, slowTimeout);
         operation.complete();
         waitForOperationsToComplete(operation);
 
@@ -190,7 +190,7 @@
     @Test
     public void testReportSlow() throws InterruptedException
     {
-        Monitorable operation = new TestMonitor("Test report slow", System.nanoTime(), false, timeout, slowTimeout);
+        Monitorable operation = new TestMonitor("Test report slow", nanoTime(), false, timeout, slowTimeout);
         waitForOperationsToBeReportedAsSlow(operation);
 
         assertTrue(operation.isSlow());
@@ -204,7 +204,7 @@
     public void testNoReportSlowIfZeroSlowTimeout() throws InterruptedException
     {
         // when the slow timeout is set to zero then operation won't be reported as slow
-        Monitorable operation = new TestMonitor("Test report slow disabled", System.nanoTime(), false, timeout, 0);
+        Monitorable operation = new TestMonitor("Test report slow disabled", nanoTime(), false, timeout, 0);
         waitForOperationsToBeReportedAsSlow(operation);
 
         assertTrue(operation.isSlow());
@@ -217,7 +217,7 @@
     @Test
     public void testReport() throws InterruptedException
     {
-        Monitorable operation = new TestMonitor("Test report", System.nanoTime(), false, timeout, slowTimeout);
+        Monitorable operation = new TestMonitor("Test report", nanoTime(), false, timeout, slowTimeout);
         waitForOperationsToComplete(operation);
 
         assertTrue(operation.isSlow());
@@ -238,13 +238,13 @@
         MonitoringTask.instance = MonitoringTask.make(10, -1);
         try
         {
-            Monitorable operation1 = new TestMonitor("Test report 1", System.nanoTime(), false, timeout, slowTimeout);
+            Monitorable operation1 = new TestMonitor("Test report 1", nanoTime(), false, timeout, slowTimeout);
             waitForOperationsToComplete(operation1);
 
             assertTrue(operation1.isAborted());
             assertFalse(operation1.isCompleted());
 
-            Monitorable operation2 = new TestMonitor("Test report 2", System.nanoTime(), false, timeout, slowTimeout);
+            Monitorable operation2 = new TestMonitor("Test report 2", nanoTime(), false, timeout, slowTimeout);
             waitForOperationsToBeReportedAsSlow(operation2);
 
             operation2.complete();
@@ -271,7 +271,7 @@
         for (int i = 0; i < opCount; i++)
         {
             executorService.submit(() ->
-                operations.add(new TestMonitor(UUID.randomUUID().toString(), System.nanoTime(), false, timeout, slowTimeout))
+                operations.add(new TestMonitor(randomUUID().toString(), nanoTime(), false, timeout, slowTimeout))
             );
         }
 
@@ -316,14 +316,14 @@
                         for (int j = 0; j < numTimes; j++)
                         {
                             Monitorable operation1 = new TestMonitor(operationName,
-                                                                     System.nanoTime(),
+                                                                     nanoTime(),
                                                                      false,
                                                                      timeout,
                                                                      slowTimeout);
                             waitForOperationsToComplete(operation1);
 
                             Monitorable operation2 = new TestMonitor(operationName,
-                                                                     System.nanoTime(),
+                                                                     nanoTime(),
                                                                      false,
                                                                      timeout,
                                                                      slowTimeout);
@@ -371,7 +371,7 @@
                 try
                 {
                     Monitorable operation = new TestMonitor("Test testMultipleThreadsSameName failed",
-                                                            System.nanoTime(),
+                                                            nanoTime(),
                                                             false,
                                                             timeout,
                                                             slowTimeout);
@@ -405,7 +405,7 @@
                 try
                 {
                     Monitorable operation = new TestMonitor("Test testMultipleThreadsSameName slow",
-                                                            System.nanoTime(),
+                                                            nanoTime(),
                                                             false,
                                                             timeout,
                                                             slowTimeout);
@@ -440,8 +440,8 @@
             executorService.submit(() -> {
                 try
                 {
-                    Monitorable operation = new TestMonitor("Test thread " + Thread.currentThread().getName(),
-                                                            System.nanoTime(),
+                    Monitorable operation = new TestMonitor("Test thread " + currentThread().getName(),
+                                                            nanoTime(),
                                                             false,
                                                             timeout,
                                                             slowTimeout);
diff --git a/test/unit/org/apache/cassandra/db/partition/PartitionUpdateTest.java b/test/unit/org/apache/cassandra/db/partition/PartitionUpdateTest.java
index a4555c8..771facf 100644
--- a/test/unit/org/apache/cassandra/db/partition/PartitionUpdateTest.java
+++ b/test/unit/org/apache/cassandra/db/partition/PartitionUpdateTest.java
@@ -58,7 +58,7 @@
         builder.newRow().add("s", 1);
         builder.newRow(1).add("a", 2);
         int size1 = builder.build().dataSize();
-        Assert.assertEquals(44, size1);
+        Assert.assertEquals(94, size1);
 
         builder = UpdateBuilder.create(cfm, "key0");
         builder.newRow(1).add("a", 2);
diff --git a/test/unit/org/apache/cassandra/db/partitions/AtomicBTreePartitionMemtableAccountingTest.java b/test/unit/org/apache/cassandra/db/partitions/AtomicBTreePartitionMemtableAccountingTest.java
index 125015f..04196f6 100644
--- a/test/unit/org/apache/cassandra/db/partitions/AtomicBTreePartitionMemtableAccountingTest.java
+++ b/test/unit/org/apache/cassandra/db/partitions/AtomicBTreePartitionMemtableAccountingTest.java
@@ -21,7 +21,6 @@
 import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.List;
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.BeforeClass;
@@ -38,10 +37,10 @@
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.DeletionTime;
 
-import org.apache.cassandra.db.Memtable;
 import org.apache.cassandra.db.filter.ColumnFilter;
 import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.marshal.SetType;
+import org.apache.cassandra.db.memtable.AbstractAllocatorMemtable;
 import org.apache.cassandra.db.rows.BTreeRow;
 import org.apache.cassandra.db.rows.BufferCell;
 import org.apache.cassandra.db.rows.Cell;
@@ -60,6 +59,7 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.btree.BTree;
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 import org.apache.cassandra.utils.memory.Cloner;
 import org.apache.cassandra.utils.memory.MemtableAllocator;
@@ -97,7 +97,7 @@
     public static final long HEAP_LIMIT = 1 << 20;
     public static final long OFF_HEAP_LIMIT = 1 << 20;
     public static final float MEMTABLE_CLEANUP_THRESHOLD = 0.25f;
-    public static final MemtableCleaner DUMMY_CLEANER = () -> CompletableFuture.completedFuture(null);
+    public static final MemtableCleaner DUMMY_CLEANER = () -> ImmediateFuture.failure(new IllegalStateException());
 
     @Parameterized.Parameters(name="allocationType={0}")
     public static Iterable<? extends Object> data()
@@ -293,10 +293,10 @@
         opOrder.start();
         UpdateTransaction indexer = UpdateTransaction.NO_OP;
 
-        MemtablePool memtablePool = Memtable.createMemtableAllocatorPoolInternal(allocationType,
-                                                                                 HEAP_LIMIT, OFF_HEAP_LIMIT, MEMTABLE_CLEANUP_THRESHOLD, DUMMY_CLEANER);
-        MemtableAllocator allocator = memtablePool.newAllocator();
-        MemtableAllocator recreatedAllocator = memtablePool.newAllocator();
+        MemtablePool memtablePool = AbstractAllocatorMemtable.createMemtableAllocatorPoolInternal(allocationType,
+                                                                                                  HEAP_LIMIT, OFF_HEAP_LIMIT, MEMTABLE_CLEANUP_THRESHOLD, DUMMY_CLEANER);
+        MemtableAllocator allocator = memtablePool.newAllocator("test");
+        MemtableAllocator recreatedAllocator = memtablePool.newAllocator("recreated");
         try
         {
             // Prepare a partition to receive updates
@@ -331,7 +331,6 @@
             }).sum();
 
             // Now recreate the partition to see if there's a leak in the accounting
-
             AtomicBTreePartition recreated = new AtomicBTreePartition(metadataRef, partitionKey, recreatedAllocator);
             try (UnfilteredRowIterator iter = partition.unfilteredIterator())
             {
@@ -346,7 +345,7 @@
             long unreleasableOnHeap = 0, unreleasableOffHeap = 0;
             if (allocator.offHeap().owns() > 0) unreleasableOffHeap = unreleasable;
             else unreleasableOnHeap = unreleasable;
-            
+
             assertThat(recreatedAllocator.offHeap().owns()).isEqualTo(allocator.offHeap().owns() - unreleasableOffHeap);
             assertThat(recreatedAllocator.onHeap().owns()).isEqualTo(allocator.onHeap().owns() - unreleasableOnHeap);
         }
diff --git a/test/unit/org/apache/cassandra/db/repair/AbstractPendingAntiCompactionTest.java b/test/unit/org/apache/cassandra/db/repair/AbstractPendingAntiCompactionTest.java
index 62b7db1..79be4c8 100644
--- a/test/unit/org/apache/cassandra/db/repair/AbstractPendingAntiCompactionTest.java
+++ b/test/unit/org/apache/cassandra/db/repair/AbstractPendingAntiCompactionTest.java
@@ -20,7 +20,6 @@
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.UUID;
 
 import com.google.common.collect.Sets;
 import org.junit.Assert;
@@ -29,6 +28,7 @@
 import org.junit.Ignore;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.ColumnIdentifier;
 import org.apache.cassandra.cql3.QueryProcessor;
@@ -46,6 +46,7 @@
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 @Ignore
 public abstract class AbstractPendingAntiCompactionTest
@@ -109,14 +110,14 @@
             int val = i * rowsPerSSTable;  // multiplied to prevent ranges from overlapping
             for (int j = 0; j < rowsPerSSTable; j++)
                 QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v) VALUES (?, ?)", ks, cfs.getTableName()), val + j, val + j);
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         Assert.assertEquals(num, cfs.getLiveSSTables().size());
     }
 
-    UUID prepareSession()
+    TimeUUID prepareSession()
     {
-        UUID sessionID = AbstractRepairTest.registerSession(cfs, true, true);
+        TimeUUID sessionID = AbstractRepairTest.registerSession(cfs, true, true);
         LocalSessionAccessor.prepareUnsafe(sessionID, AbstractRepairTest.COORDINATOR, Sets.newHashSet(AbstractRepairTest.COORDINATOR));
         return sessionID;
     }
diff --git a/test/unit/org/apache/cassandra/db/repair/CompactionManagerGetSSTablesForValidationTest.java b/test/unit/org/apache/cassandra/db/repair/CompactionManagerGetSSTablesForValidationTest.java
index 3b29cc5..bcf7582 100644
--- a/test/unit/org/apache/cassandra/db/repair/CompactionManagerGetSSTablesForValidationTest.java
+++ b/test/unit/org/apache/cassandra/db/repair/CompactionManagerGetSSTablesForValidationTest.java
@@ -18,10 +18,8 @@
 
 package org.apache.cassandra.db.repair;
 
-import java.util.Collections;
 import java.util.Iterator;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -31,7 +29,9 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.repair.state.ValidationState;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.Schema;
@@ -47,9 +47,11 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
+import static java.util.Collections.singleton;
 import static org.apache.cassandra.db.repair.CassandraValidationIterator.getSSTablesToValidate;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * Tests correct sstables are returned from CompactionManager.getSSTablesForValidation
@@ -68,7 +70,7 @@
     private SSTableReader unrepaired;
     private SSTableReader pendingRepair;
 
-    private UUID sessionID;
+    private TimeUUID sessionID;
     private RepairJobDesc desc;
 
     @BeforeClass
@@ -93,7 +95,7 @@
         for (int i=0; i<3; i++)
         {
             QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v) VALUES(?, ?)", ks, tbl), i, i);
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
         Assert.assertEquals(3, cfs.getLiveSSTables().size());
 
@@ -101,7 +103,7 @@
 
     private void registerRepair(boolean incremental) throws Exception
     {
-        sessionID = UUIDGen.getTimeUUID();
+        sessionID = nextTimeUUID();
         Range<Token> range = new Range<>(MT, MT);
         ActiveRepairService.instance.registerParentRepairSession(sessionID,
                                                                  coordinator,
@@ -111,7 +113,7 @@
                                                                  incremental ? System.currentTimeMillis() : ActiveRepairService.UNREPAIRED_SSTABLE,
                                                                  true,
                                                                  PreviewKind.NONE);
-        desc = new RepairJobDesc(sessionID, UUIDGen.getTimeUUID(), ks, tbl, Collections.singleton(range));
+        desc = new RepairJobDesc(sessionID, nextTimeUUID(), ks, tbl, singleton(range));
     }
 
     private void modifySSTables() throws Exception
@@ -139,7 +141,7 @@
         modifySSTables();
 
         // get sstables for repair
-        Validator validator = new Validator(desc, coordinator, FBUtilities.nowInSeconds(), true, PreviewKind.NONE);
+        Validator validator = new Validator(new ValidationState(desc, coordinator), FBUtilities.nowInSeconds(), true, PreviewKind.NONE);
         Set<SSTableReader> sstables = Sets.newHashSet(getSSTablesToValidate(cfs, validator.desc.ranges, validator.desc.parentSessionId, validator.isIncremental));
         Assert.assertNotNull(sstables);
         Assert.assertEquals(1, sstables.size());
@@ -154,7 +156,7 @@
         modifySSTables();
 
         // get sstables for repair
-        Validator validator = new Validator(desc, coordinator, FBUtilities.nowInSeconds(), false, PreviewKind.NONE);
+        Validator validator = new Validator(new ValidationState(desc, coordinator), FBUtilities.nowInSeconds(), false, PreviewKind.NONE);
         Set<SSTableReader> sstables = Sets.newHashSet(getSSTablesToValidate(cfs, validator.desc.ranges, validator.desc.parentSessionId, validator.isIncremental));
         Assert.assertNotNull(sstables);
         Assert.assertEquals(2, sstables.size());
@@ -170,7 +172,7 @@
         modifySSTables();
 
         // get sstables for repair
-        Validator validator = new Validator(desc, coordinator, FBUtilities.nowInSeconds(), false, PreviewKind.NONE);
+        Validator validator = new Validator(new ValidationState(desc, coordinator), FBUtilities.nowInSeconds(), false, PreviewKind.NONE);
         Set<SSTableReader> sstables = Sets.newHashSet(getSSTablesToValidate(cfs, validator.desc.ranges, validator.desc.parentSessionId, validator.isIncremental));
         Assert.assertNotNull(sstables);
         Assert.assertEquals(3, sstables.size());
diff --git a/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionBytemanTest.java b/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionBytemanTest.java
index 127a0a4..e43027d 100644
--- a/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionBytemanTest.java
+++ b/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionBytemanTest.java
@@ -21,7 +21,6 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -36,6 +35,7 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.utils.TimeUUID;
 import org.jboss.byteman.contrib.bmunit.BMRule;
 import org.jboss.byteman.contrib.bmunit.BMRules;
 import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
@@ -50,7 +50,7 @@
     @BMRules(rules = { @BMRule(name = "Throw exception anticompaction",
                                targetClass = "Range$OrderedRangeContainmentChecker",
                                targetMethod = "test",
-                               action = "throw new org.apache.cassandra.db.compaction.CompactionInterruptedException(null);")} )
+                               action = "throw new org.apache.cassandra.db.compaction.CompactionInterruptedException(\"antiCompactionExceptionTest\");")} )
     @Test
     public void testExceptionAnticompaction() throws InterruptedException
     {
@@ -65,7 +65,7 @@
         {
             ranges.add(new Range<>(sstable.first.getToken(), sstable.last.getToken()));
         }
-        UUID prsid = prepareSession();
+        TimeUUID prsid = prepareSession();
         try
         {
             PendingAntiCompaction pac = new PendingAntiCompaction(prsid, Lists.newArrayList(cfs, cfs2), atEndpoint(ranges, NO_RANGES), es, () -> false);
diff --git a/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionTest.java b/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionTest.java
index 1c5c245..a559478 100644
--- a/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionTest.java
+++ b/test/unit/org/apache/cassandra/db/repair/PendingAntiCompactionTest.java
@@ -24,12 +24,10 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.stream.Collectors;
@@ -41,9 +39,14 @@
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.ListenableFutureTask;
-import com.google.common.util.concurrent.ListeningExecutorService;
 import com.google.common.util.concurrent.MoreExecutors;
+
+import org.apache.cassandra.Util;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.concurrent.FutureTask;
+import org.apache.cassandra.concurrent.ImmediateExecutor;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Future;
 import org.junit.Assert;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -76,10 +79,12 @@
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
 import org.apache.cassandra.utils.WrappedRunnable;
 import org.apache.cassandra.utils.concurrent.Transactional;
 
+import static java.util.Collections.emptyList;
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -93,18 +98,18 @@
 
     private static class InstrumentedAcquisitionCallback extends PendingAntiCompaction.AcquisitionCallback
     {
-        public InstrumentedAcquisitionCallback(UUID parentRepairSession, RangesAtEndpoint ranges)
+        public InstrumentedAcquisitionCallback(TimeUUID parentRepairSession, RangesAtEndpoint ranges)
         {
             super(parentRepairSession, ranges, () -> false);
         }
 
         Set<TableId> submittedCompactions = new HashSet<>();
 
-        ListenableFuture<?> submitPendingAntiCompaction(PendingAntiCompaction.AcquireResult result)
+        Future<Void> submitPendingAntiCompaction(PendingAntiCompaction.AcquireResult result)
         {
             submittedCompactions.add(result.cfs.metadata.id);
             result.abort();  // prevent ref leak complaints
-            return ListenableFutureTask.create(() -> {}, null);
+            return new FutureTask<>(() -> {});
         }
     }
 
@@ -122,12 +127,12 @@
         {
             QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v) VALUES (?, ?)", ks, tbl), i, i);
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         for (int i = 8; i < 12; i++)
         {
             QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v) VALUES (?, ?)", ks, tbl), i, i);
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(2, cfs.getLiveSSTables().size());
 
         Token left = ByteOrderedPartitioner.instance.getToken(ByteBufferUtil.bytes((int) 6));
@@ -136,7 +141,7 @@
         Collection<Range<Token>> ranges = Collections.singleton(new Range<>(left, right));
 
         // create a session so the anti compaction can fine it
-        UUID sessionID = UUIDGen.getTimeUUID();
+        TimeUUID sessionID = nextTimeUUID();
         ActiveRepairService.instance.registerParentRepairSession(sessionID, InetAddressAndPort.getLocalHost(), tables, ranges, true, 1, true, PreviewKind.NONE);
 
         PendingAntiCompaction pac;
@@ -174,7 +179,7 @@
             ranges.add(new Range<>(sstable.first.getToken(), sstable.last.getToken()));
         }
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, ranges, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, ranges, nextTimeUUID(), 0, 0);
 
         logger.info("SSTables: {}", sstables);
         logger.info("Expected: {}", expected);
@@ -208,7 +213,7 @@
         repaired.descriptor.getMetadataSerializer().mutateRepairMetadata(repaired.descriptor, 1, null, false);
         repaired.reloadSSTableMetadata();
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
         assertNotNull(result);
 
@@ -231,13 +236,13 @@
         assertTrue(repaired.intersects(FULL_RANGE));
         assertTrue(unrepaired.intersects(FULL_RANGE));
 
-        UUID sessionId = prepareSession();
+        TimeUUID sessionId = prepareSession();
         LocalSessionAccessor.finalizeUnsafe(sessionId);
         repaired.descriptor.getMetadataSerializer().mutateRepairMetadata(repaired.descriptor, 0, sessionId, false);
         repaired.reloadSSTableMetadata();
         assertTrue(repaired.isPendingRepair());
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
         assertNotNull(result);
 
@@ -260,12 +265,12 @@
         assertTrue(repaired.intersects(FULL_RANGE));
         assertTrue(unrepaired.intersects(FULL_RANGE));
 
-        UUID sessionId = prepareSession();
+        TimeUUID sessionId = prepareSession();
         repaired.descriptor.getMetadataSerializer().mutateRepairMetadata(repaired.descriptor, 0, sessionId, false);
         repaired.reloadSSTableMetadata();
         assertTrue(repaired.isPendingRepair());
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
         assertNull(result);
     }
@@ -277,7 +282,7 @@
 
         assertEquals(0, cfs.getLiveSSTables().size());
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
         assertNotNull(result);
 
@@ -293,11 +298,11 @@
         cfs.disableAutoCompaction();
         makeSSTables(2);
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
         assertNotNull(result);
 
-        InstrumentedAcquisitionCallback cb = new InstrumentedAcquisitionCallback(UUIDGen.getTimeUUID(), atEndpoint(FULL_RANGE, NO_RANGES));
+        InstrumentedAcquisitionCallback cb = new InstrumentedAcquisitionCallback(nextTimeUUID(), atEndpoint(FULL_RANGE, NO_RANGES));
         assertTrue(cb.submittedCompactions.isEmpty());
         cb.apply(Lists.newArrayList(result));
 
@@ -316,12 +321,12 @@
         cfs.disableAutoCompaction();
         makeSSTables(2);
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
         assertNotNull(result);
         assertEquals(Transactional.AbstractTransactional.State.IN_PROGRESS, result.txn.state());
 
-        InstrumentedAcquisitionCallback cb = new InstrumentedAcquisitionCallback(UUIDGen.getTimeUUID(), atEndpoint(FULL_RANGE, Collections.emptyList()));
+        InstrumentedAcquisitionCallback cb = new InstrumentedAcquisitionCallback(nextTimeUUID(), atEndpoint(FULL_RANGE, emptyList()));
         assertTrue(cb.submittedCompactions.isEmpty());
         cb.apply(Lists.newArrayList(result, null));
 
@@ -339,14 +344,14 @@
         cfs.disableAutoCompaction();
         makeSSTables(2);
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
         assertNotNull(result);
 
         ColumnFamilyStore cfs2 = Schema.instance.getColumnFamilyStoreInstance(Schema.instance.getTableMetadata("system", "peers").id);
         PendingAntiCompaction.AcquireResult fakeResult = new PendingAntiCompaction.AcquireResult(cfs2, null, null);
 
-        InstrumentedAcquisitionCallback cb = new InstrumentedAcquisitionCallback(UUIDGen.getTimeUUID(), atEndpoint(FULL_RANGE, NO_RANGES));
+        InstrumentedAcquisitionCallback cb = new InstrumentedAcquisitionCallback(nextTimeUUID(), atEndpoint(FULL_RANGE, NO_RANGES));
         assertTrue(cb.submittedCompactions.isEmpty());
         cb.apply(Lists.newArrayList(result, fakeResult));
 
@@ -362,9 +367,9 @@
         cfs.disableAutoCompaction();
         makeSSTables(2);
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
-        UUID sessionID = UUIDGen.getTimeUUID();
+        TimeUUID sessionID = nextTimeUUID();
         ActiveRepairService.instance.registerParentRepairSession(sessionID,
                                                                  InetAddressAndPort.getByName("127.0.0.1"),
                                                                  Lists.newArrayList(cfs),
@@ -382,9 +387,9 @@
         cfs.disableAutoCompaction();
         makeSSTables(1);
 
-        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, UUIDGen.getTimeUUID(), 0, 0);
+        PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, FULL_RANGE, nextTimeUUID(), 0, 0);
         PendingAntiCompaction.AcquireResult result = acquisitionCallable.call();
-        UUID sessionID = UUIDGen.getTimeUUID();
+        TimeUUID sessionID = nextTimeUUID();
         ActiveRepairService.instance.registerParentRepairSession(sessionID,
                                                                  InetAddressAndPort.getByName("127.0.0.1"),
                                                                  Lists.newArrayList(cfs),
@@ -410,22 +415,22 @@
     {
         cfs.disableAutoCompaction();
         makeSSTables(2);
-        UUID prsid = UUID.randomUUID();
-        ListeningExecutorService es = MoreExecutors.listeningDecorator(MoreExecutors.newDirectExecutorService());
+        TimeUUID prsid = nextTimeUUID();
+        ExecutorPlus es = ImmediateExecutor.INSTANCE;
         PendingAntiCompaction pac = new PendingAntiCompaction(prsid, Collections.singleton(cfs), atEndpoint(FULL_RANGE, NO_RANGES), es, () -> false) {
             @Override
-            protected AcquisitionCallback getAcquisitionCallback(UUID prsId, RangesAtEndpoint tokenRanges)
+            protected AcquisitionCallback getAcquisitionCallback(TimeUUID prsId, RangesAtEndpoint tokenRanges)
             {
                 return new AcquisitionCallback(prsid, tokenRanges, () -> false)
                 {
                     @Override
-                    ListenableFuture<?> submitPendingAntiCompaction(AcquireResult result)
+                    Future submitPendingAntiCompaction(AcquireResult result)
                     {
                         Runnable r = new WrappedRunnable()
                         {
                             protected void runMayThrow()
                             {
-                                throw new CompactionInterruptedException(null);
+                                throw new CompactionInterruptedException("antiCompactionExceptionTest");
                             }
                         };
                         return es.submit(r);
@@ -451,14 +456,14 @@
         ExecutorService es = Executors.newFixedThreadPool(1);
 
         makeSSTables(2);
-        UUID prsid = UUID.randomUUID();
+        TimeUUID prsid = nextTimeUUID();
         Set<SSTableReader> sstables = cfs.getLiveSSTables();
         List<ISSTableScanner> scanners = sstables.stream().map(SSTableReader::getScanner).collect(Collectors.toList());
         try
         {
             try (LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.ANTICOMPACTION);
                  CompactionController controller = new CompactionController(cfs, sstables, 0);
-                 CompactionIterator ci = CompactionManager.getAntiCompactionIterator(scanners, controller, 0, UUID.randomUUID(), CompactionManager.instance.active, () -> false))
+                 CompactionIterator ci = CompactionManager.getAntiCompactionIterator(scanners, controller, 0, nextTimeUUID(), CompactionManager.instance.active, () -> false))
             {
                 // `ci` is our imaginary ongoing anticompaction which makes no progress until after 30s
                 // now we try to start a new AC, which will try to cancel all ongoing compactions
@@ -505,14 +510,14 @@
         cfs.disableAutoCompaction();
         ExecutorService es = Executors.newFixedThreadPool(1);
         makeSSTables(2);
-        UUID prsid = prepareSession();
+        TimeUUID prsid = prepareSession();
         Set<SSTableReader> sstables = cfs.getLiveSSTables();
         List<ISSTableScanner> scanners = sstables.stream().map(SSTableReader::getScanner).collect(Collectors.toList());
         try
         {
             try (LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.ANTICOMPACTION);
                  CompactionController controller = new CompactionController(cfs, sstables, 0);
-                 CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, scanners, controller, 0, UUID.randomUUID()))
+                 CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, scanners, controller, 0, nextTimeUUID()))
             {
                 // `ci` is our imaginary ongoing anticompaction which makes no progress until after 5s
                 // now we try to start a new AC, which will try to cancel all ongoing compactions
@@ -584,7 +589,7 @@
         for (int i = 1; i <= 10; i++)
         {
             SSTableReader sstable = MockSchema.sstable(i + 20, i * 10, i * 10 + 9, cfs);
-            AbstractPendingRepairTest.mutateRepaired(sstable, UUID.randomUUID(), false);
+            AbstractPendingRepairTest.mutateRepaired(sstable, nextTimeUUID(), false);
             pendingSSTables.add(sstable);
         }
 
@@ -604,7 +609,7 @@
         {
             public CompactionInfo getCompactionInfo()
             {
-                return new CompactionInfo(cfs.metadata(), OperationType.ANTICOMPACTION, 0, 1000, UUID.randomUUID(), compacting);
+                return new CompactionInfo(cfs.metadata(), OperationType.ANTICOMPACTION, 0, 1000, nextTimeUUID(), compacting);
             }
 
             public boolean isGlobal()
@@ -617,7 +622,7 @@
         {
             PendingAntiCompaction.AntiCompactionPredicate predicate =
             new PendingAntiCompaction.AntiCompactionPredicate(Collections.singleton(new Range<>(new Murmur3Partitioner.LongToken(0), new Murmur3Partitioner.LongToken(100))),
-                                                              UUID.randomUUID());
+                                                              nextTimeUUID());
             Set<SSTableReader> live = cfs.getLiveSSTables().stream().filter(predicate).collect(Collectors.toSet());
             if (shouldFail)
                 fail("should fail - we try to grab already anticompacting sstables for anticompaction");
@@ -640,12 +645,12 @@
         ColumnFamilyStore cfs = MockSchema.newCFS();
         cfs.addSSTable(MockSchema.sstable(1, true, cfs));
         CountDownLatch cdl = new CountDownLatch(5);
-        ExecutorService es = Executors.newFixedThreadPool(1);
+        ExecutorPlus es = executorFactory().sequential("test");
         CompactionInfo.Holder holder = new CompactionInfo.Holder()
         {
             public CompactionInfo getCompactionInfo()
             {
-                return new CompactionInfo(cfs.metadata(), OperationType.ANTICOMPACTION, 0, 0, UUID.randomUUID(), cfs.getLiveSSTables());
+                return new CompactionInfo(cfs.metadata(), OperationType.ANTICOMPACTION, 0, 0, nextTimeUUID(), cfs.getLiveSSTables());
             }
 
             public boolean isGlobal()
@@ -655,7 +660,7 @@
         };
         try
         {
-            PendingAntiCompaction.AntiCompactionPredicate acp = new PendingAntiCompaction.AntiCompactionPredicate(FULL_RANGE, UUID.randomUUID())
+            PendingAntiCompaction.AntiCompactionPredicate acp = new PendingAntiCompaction.AntiCompactionPredicate(FULL_RANGE, nextTimeUUID())
             {
                 @Override
                 public boolean apply(SSTableReader sstable)
@@ -667,7 +672,7 @@
                 }
             };
             CompactionManager.instance.active.beginCompaction(holder);
-            PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, UUID.randomUUID(), 10, 1, acp);
+            PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, nextTimeUUID(), 10, 1, acp);
             Future f = es.submit(acquisitionCallable);
             cdl.await();
             assertNotNull(f.get());
@@ -684,12 +689,12 @@
     {
         ColumnFamilyStore cfs = MockSchema.newCFS();
         cfs.addSSTable(MockSchema.sstable(1, true, cfs));
-        ExecutorService es = Executors.newFixedThreadPool(1);
+        ExecutorPlus es = executorFactory().sequential("test");
         CompactionInfo.Holder holder = new CompactionInfo.Holder()
         {
             public CompactionInfo getCompactionInfo()
             {
-                return new CompactionInfo(cfs.metadata(), OperationType.ANTICOMPACTION, 0, 0, UUID.randomUUID(), cfs.getLiveSSTables());
+                return new CompactionInfo(cfs.metadata(), OperationType.ANTICOMPACTION, 0, 0, nextTimeUUID(), cfs.getLiveSSTables());
             }
 
             public boolean isGlobal()
@@ -699,7 +704,7 @@
         };
         try
         {
-            PendingAntiCompaction.AntiCompactionPredicate acp = new PendingAntiCompaction.AntiCompactionPredicate(FULL_RANGE, UUID.randomUUID())
+            PendingAntiCompaction.AntiCompactionPredicate acp = new PendingAntiCompaction.AntiCompactionPredicate(FULL_RANGE, nextTimeUUID())
             {
                 @Override
                 public boolean apply(SSTableReader sstable)
@@ -708,7 +713,7 @@
                 }
             };
             CompactionManager.instance.active.beginCompaction(holder);
-            PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, UUID.randomUUID(), 2, 1000, acp);
+            PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, nextTimeUUID(), 2, 1000, acp);
             Future fut = es.submit(acquisitionCallable);
             assertNull(fut.get());
         }
@@ -728,7 +733,7 @@
         ExecutorService es = Executors.newFixedThreadPool(1);
         try
         {
-            UUID prsid = prepareSession();
+            TimeUUID prsid = prepareSession();
             for (SSTableReader sstable : cfs2.getLiveSSTables())
                 assertFalse(sstable.isPendingRepair());
 
diff --git a/test/unit/org/apache/cassandra/db/rows/RowAndDeletionMergeIteratorTest.java b/test/unit/org/apache/cassandra/db/rows/RowAndDeletionMergeIteratorTest.java
index c90694d..17c9bec 100644
--- a/test/unit/org/apache/cassandra/db/rows/RowAndDeletionMergeIteratorTest.java
+++ b/test/unit/org/apache/cassandra/db/rows/RowAndDeletionMergeIteratorTest.java
@@ -32,7 +32,6 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.db.ClusteringPrefix;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.filter.ColumnFilter;
diff --git a/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java b/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java
index 1ceacbc..8049af3 100644
--- a/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java
+++ b/test/unit/org/apache/cassandra/db/rows/RowsMergingTest.java
@@ -214,8 +214,8 @@
                 catch (Throwable e)
                 {
                     throw new AssertionError("Executing the following queries did not lead to the expected result: \n"
-                                + Joiner.on("; \n").join(queries) 
-                                + "\n when executing: \n" + query, e); 
+                                + Joiner.on("; \n").join(queries)
+                                + "\n when executing: \n" + query, e);
                 }
             }
 
@@ -224,7 +224,7 @@
                 if (expectedRow != null)
                 {
                     expectedRow[0] = pk;
-                    assertRows(execute("SELECT * FROM %s WHERE pk = ?" , pk), 
+                    assertRows(execute("SELECT * FROM %s WHERE pk = ?" , pk),
                                expectedRow);
                 }
                 else
@@ -234,7 +234,7 @@
             }
             catch (Throwable e)
             {
-                throw new AssertionError("Executing the following queries did not lead to the expected result: \n" + Joiner.on("; \n").join(queries), e); 
+                throw new AssertionError("Executing the following queries did not lead to the expected result: \n" + Joiner.on("; \n").join(queries), e);
             }
             pk++;
         }
diff --git a/test/unit/org/apache/cassandra/db/rows/ThrottledUnfilteredIteratorTest.java b/test/unit/org/apache/cassandra/db/rows/ThrottledUnfilteredIteratorTest.java
index d5e6348..0c4a79d 100644
--- a/test/unit/org/apache/cassandra/db/rows/ThrottledUnfilteredIteratorTest.java
+++ b/test/unit/org/apache/cassandra/db/rows/ThrottledUnfilteredIteratorTest.java
@@ -21,7 +21,6 @@
 import static org.apache.cassandra.SchemaLoader.standardCFMD;
 import static org.junit.Assert.*;
 
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
@@ -50,7 +49,6 @@
 import org.apache.cassandra.db.ReadExecutionController;
 import org.apache.cassandra.db.RegularAndStaticColumns;
 import org.apache.cassandra.db.RowUpdateBuilder;
-import org.apache.cassandra.db.marshal.ByteBufferAccessor;
 import org.apache.cassandra.db.marshal.Int32Type;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.db.partitions.AbstractUnfilteredPartitionIterator;
@@ -112,7 +110,7 @@
 
         // flush and generate 1 sstable
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.disableAutoCompaction();
         cfs.forceMajorCompaction();
 
@@ -147,7 +145,7 @@
 
         // flush and generate 1 sstable
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.disableAutoCompaction();
         cfs.forceMajorCompaction();
 
@@ -205,7 +203,7 @@
 
         // flush and generate 1 sstable
         ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.disableAutoCompaction();
         cfs.forceMajorCompaction();
 
@@ -623,7 +621,7 @@
 
         new RowUpdateBuilder(cfs.metadata(), 1, key).addRangeTombstone(10, 22).build().applyUnsafe();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         builder = UpdateBuilder.create(cfs.metadata(), key).withTimestamp(2);
         for (int i = 1; i < 40; i += 2)
diff --git a/test/unit/org/apache/cassandra/db/rows/UnfilteredRowsGenerator.java b/test/unit/org/apache/cassandra/db/rows/UnfilteredRowsGenerator.java
index 2804733..c6deb24 100644
--- a/test/unit/org/apache/cassandra/db/rows/UnfilteredRowsGenerator.java
+++ b/test/unit/org/apache/cassandra/db/rows/UnfilteredRowsGenerator.java
@@ -337,4 +337,4 @@
     {
         System.out.println(str(list));
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriterTest.java b/test/unit/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriterTest.java
index 58d26c1..a65b2ea 100644
--- a/test/unit/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriterTest.java
+++ b/test/unit/org/apache/cassandra/db/streaming/CassandraEntireSSTableStreamWriterTest.java
@@ -23,8 +23,8 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Queue;
-import java.util.UUID;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -49,7 +49,7 @@
 import org.apache.cassandra.net.AsyncStreamingOutputPlus;
 import org.apache.cassandra.schema.CachingParams;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.streaming.DefaultConnectionFactory;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.SessionInfo;
 import org.apache.cassandra.streaming.StreamCoordinator;
@@ -62,6 +62,7 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -102,7 +103,7 @@
             .build()
             .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         sstable = store.getLiveSSTables().iterator().next();
@@ -129,7 +130,7 @@
     }
 
     @Test
-    public void testBlockReadingAndWritingOverWire() throws Exception
+    public void testBlockReadingAndWritingOverWire() throws Throwable
     {
         StreamSession session = setupStreamingSessionForTest();
         InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
@@ -204,13 +205,13 @@
 
     private StreamSession setupStreamingSessionForTest()
     {
-        StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new DefaultConnectionFactory(), false, false, null, PreviewKind.NONE);
-        StreamResultFuture future = StreamResultFuture.createInitiator(UUID.randomUUID(), StreamOperation.BOOTSTRAP, Collections.<StreamEventHandler>emptyList(), streamCoordinator);
+        StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new NettyStreamingConnectionFactory(), false, false, null, PreviewKind.NONE);
+        StreamResultFuture future = StreamResultFuture.createInitiator(nextTimeUUID(), StreamOperation.BOOTSTRAP, Collections.<StreamEventHandler>emptyList(), streamCoordinator);
 
         InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
         streamCoordinator.addSessionInfo(new SessionInfo(peer, 0, peer, Collections.emptyList(), Collections.emptyList(), StreamSession.State.INITIALIZED));
 
-        StreamSession session = streamCoordinator.getOrCreateNextSession(peer);
+        StreamSession session = streamCoordinator.getOrCreateOutboundSession(peer);
         session.init(future);
         return session;
     }
diff --git a/test/unit/org/apache/cassandra/db/streaming/CassandraOutgoingFileTest.java b/test/unit/org/apache/cassandra/db/streaming/CassandraOutgoingFileTest.java
index 9d663b5..93b6e71 100644
--- a/test/unit/org/apache/cassandra/db/streaming/CassandraOutgoingFileTest.java
+++ b/test/unit/org/apache/cassandra/db/streaming/CassandraOutgoingFileTest.java
@@ -25,6 +25,7 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.Keyspace;
@@ -78,7 +79,7 @@
             .build()
             .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         sstable = store.getLiveSSTables().iterator().next();
diff --git a/test/unit/org/apache/cassandra/db/streaming/CassandraStreamHeaderTest.java b/test/unit/org/apache/cassandra/db/streaming/CassandraStreamHeaderTest.java
index 999a44e..0e5187c 100644
--- a/test/unit/org/apache/cassandra/db/streaming/CassandraStreamHeaderTest.java
+++ b/test/unit/org/apache/cassandra/db/streaming/CassandraStreamHeaderTest.java
@@ -26,6 +26,7 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DecoratedKey;
@@ -80,7 +81,7 @@
             .build()
             .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         sstable = store.getLiveSSTables().iterator().next();
diff --git a/test/unit/org/apache/cassandra/db/streaming/CassandraStreamManagerTest.java b/test/unit/org/apache/cassandra/db/streaming/CassandraStreamManagerTest.java
index 0b37d66..e7795c8 100644
--- a/test/unit/org/apache/cassandra/db/streaming/CassandraStreamManagerTest.java
+++ b/test/unit/org/apache/cassandra/db/streaming/CassandraStreamManagerTest.java
@@ -24,7 +24,6 @@
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -34,6 +33,7 @@
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Uninterruptibles;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.junit.Assert;
 import org.junit.Before;
@@ -52,27 +52,30 @@
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.streaming.DefaultConnectionFactory;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.streaming.OutgoingStream;
 import org.apache.cassandra.streaming.PreviewKind;
-import org.apache.cassandra.streaming.StreamConnectionFactory;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.streaming.StreamSession;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Ref;
 
 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;
 
 public class CassandraStreamManagerTest
 {
     private static final String KEYSPACE = null;
     private String keyspace = null;
     private static final String table = "tbl";
-    private static final StreamConnectionFactory connectionFactory = new DefaultConnectionFactory();
+    private static final StreamingChannel.Factory connectionFactory = new NettyStreamingConnectionFactory();
 
     private TableMetadata tbm;
     private ColumnFamilyStore cfs;
@@ -92,13 +95,15 @@
         cfs = Schema.instance.getColumnFamilyStoreInstance(tbm.id);
     }
 
-    private static StreamSession session(UUID pendingRepair)
+    private static StreamSession session(TimeUUID pendingRepair)
     {
         try
         {
             return new StreamSession(StreamOperation.REPAIR,
                                      InetAddressAndPort.getByName("127.0.0.1"),
                                      connectionFactory,
+                                     null,
+                                     MessagingService.current_version,
                                      false,
                                      0,
                                      pendingRepair,
@@ -114,14 +119,14 @@
     {
         Set<SSTableReader> before = cfs.getLiveSSTables();
         queryable.run();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Set<SSTableReader> after = cfs.getLiveSSTables();
 
         Set<SSTableReader> diff = Sets.difference(after, before);
         return Iterables.getOnlyElement(diff);
     }
 
-    private static void mutateRepaired(SSTableReader sstable, long repairedAt, UUID pendingRepair, boolean isTransient) throws IOException
+    private static void mutateRepaired(SSTableReader sstable, long repairedAt, TimeUUID pendingRepair, boolean isTransient) throws IOException
     {
         Descriptor descriptor = sstable.descriptor;
         descriptor.getMetadataSerializer().mutateRepairMetadata(descriptor, repairedAt, pendingRepair, isTransient);
@@ -150,7 +155,7 @@
         return sstablesFromStreams(streams);
     }
 
-    private Set<SSTableReader> selectReaders(UUID pendingRepair)
+    private Set<SSTableReader> selectReaders(TimeUUID pendingRepair)
     {
         IPartitioner partitioner = DatabaseDescriptor.getPartitioner();
         Collection<Range<Token>> ranges = Lists.newArrayList(new Range<Token>(partitioner.getMinimumToken(), partitioner.getMinimumToken()));
@@ -171,10 +176,10 @@
         SSTableReader sstable4 = createSSTable(() -> QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v) VALUES (4, 4)", keyspace, table)));
 
 
-        UUID pendingRepair = UUIDGen.getTimeUUID();
+        TimeUUID pendingRepair = nextTimeUUID();
         long repairedAt = System.currentTimeMillis();
         mutateRepaired(sstable2, ActiveRepairService.UNREPAIRED_SSTABLE, pendingRepair, false);
-        mutateRepaired(sstable3, ActiveRepairService.UNREPAIRED_SSTABLE, UUIDGen.getTimeUUID(), false);
+        mutateRepaired(sstable3, UNREPAIRED_SSTABLE, nextTimeUUID(), false);
         mutateRepaired(sstable4, repairedAt, NO_PENDING_REPAIR, false);
 
 
@@ -199,7 +204,7 @@
         Collection<SSTableReader> allSSTables = cfs.getLiveSSTables();
         Assert.assertEquals(1, allSSTables.size());
         final Token firstToken = allSSTables.iterator().next().first.getToken();
-        DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMB(1);
+        DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMiB(1);
 
         Set<SSTableReader> sstablesBeforeRewrite = getReadersForRange(new Range<>(firstToken, firstToken));
         Assert.assertEquals(1, sstablesBeforeRewrite.size());
@@ -222,7 +227,7 @@
                 }
             }
         };
-        Thread t = NamedThreadFactory.createThread(r);
+        Thread t = NamedThreadFactory.createAnonymousThread(r);
         try
         {
             t.start();
@@ -231,7 +236,7 @@
         }
         finally
         {
-            DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMB(50);
+            DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMiB(50);
             done.set(true);
             t.join(20);
         }
diff --git a/test/unit/org/apache/cassandra/db/streaming/EntireSSTableStreamConcurrentComponentMutationTest.java b/test/unit/org/apache/cassandra/db/streaming/EntireSSTableStreamConcurrentComponentMutationTest.java
index 3cc8943..8b63ba5 100644
--- a/test/unit/org/apache/cassandra/db/streaming/EntireSSTableStreamConcurrentComponentMutationTest.java
+++ b/test/unit/org/apache/cassandra/db/streaming/EntireSSTableStreamConcurrentComponentMutationTest.java
@@ -22,7 +22,6 @@
 import java.nio.channels.WritableByteChannel;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
@@ -46,6 +45,7 @@
 import io.netty.channel.ChannelPromise;
 import io.netty.channel.embedded.EmbeddedChannel;
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.RowUpdateBuilder;
@@ -68,10 +68,10 @@
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.SharedDefaultFileRegion;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.streaming.DefaultConnectionFactory;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.streaming.OutgoingStream;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.SessionInfo;
@@ -88,6 +88,7 @@
 import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
 
 import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertTrue;
 
 @RunWith(BMUnitRunner.class)
@@ -128,7 +129,7 @@
             .build()
             .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         Token start = ByteOrderedPartitioner.instance.getTokenFactory().fromString(Long.toHexString(0));
@@ -160,7 +161,7 @@
     }
 
     @Test
-    public void testStream() throws Exception
+    public void testStream() throws Throwable
     {
         testStreamWithConcurrentComponentMutation(NO_OP, NO_OP);
     }
@@ -170,12 +171,12 @@
      * update causes the actual transfered file size to be different from the one in {@link ComponentManifest}
      */
     @Test
-    public void testStreamWithStatsMutation() throws Exception
+    public void testStreamWithStatsMutation() throws Throwable
     {
         testStreamWithConcurrentComponentMutation(() -> {
 
             Descriptor desc = sstable.descriptor;
-            desc.getMetadataSerializer().mutate(desc, "testing", stats -> stats.mutateRepairedMetadata(0, UUID.randomUUID(), false));
+            desc.getMetadataSerializer().mutate(desc, "testing", stats -> stats.mutateRepairedMetadata(0, nextTimeUUID(), false));
 
             return null;
         }, NO_OP);
@@ -188,7 +189,7 @@
             targetLocation = "AFTER INVOKE serialize",
             condition = "$descriptor.cfname.contains(\"Standard1\")",
             action = "org.apache.cassandra.db.streaming.EntireSSTableStreamConcurrentComponentMutationTest.countDown();Thread.sleep(5000);")
-    public void testStreamWithIndexSummaryRedistributionDelaySavingSummary() throws Exception
+    public void testStreamWithIndexSummaryRedistributionDelaySavingSummary() throws Throwable
     {
         testStreamWithConcurrentComponentMutation(() -> {
             // wait until new index summary is partially written
@@ -203,7 +204,7 @@
         latch.countDown();
     }
 
-    private void testStreamWithConcurrentComponentMutation(Callable<?> runBeforeStreaming, Callable<?> runConcurrentWithStreaming) throws Exception
+    private void testStreamWithConcurrentComponentMutation(Callable<?> runBeforeStreaming, Callable<?> runConcurrentWithStreaming) throws Throwable
     {
         ByteBuf serializedFile = Unpooled.buffer(8192);
         InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
@@ -247,7 +248,7 @@
 
         // rewrite index summary file with new min/max index interval
         TableMetadata origin = store.metadata();
-        MigrationManager.announceTableUpdate(origin.unbuild().minIndexInterval(1).maxIndexInterval(2).build(), true);
+        SchemaTestUtil.announceTableUpdate(origin.unbuild().minIndexInterval(1).maxIndexInterval(2).build());
 
         try (LifecycleTransaction txn = store.getTracker().tryModify(sstable, OperationType.INDEX_SUMMARY))
         {
@@ -257,7 +258,7 @@
         }
 
         // reset min/max index interval
-        MigrationManager.announceTableUpdate(origin, true);
+        SchemaTestUtil.announceTableUpdate(origin);
         return true;
     }
 
@@ -319,13 +320,13 @@
 
     private StreamSession setupStreamingSessionForTest()
     {
-        StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new DefaultConnectionFactory(), false, false, null, PreviewKind.NONE);
-        StreamResultFuture future = StreamResultFuture.createInitiator(UUID.randomUUID(), StreamOperation.BOOTSTRAP, Collections.emptyList(), streamCoordinator);
+        StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new NettyStreamingConnectionFactory(), false, false, null, PreviewKind.NONE);
+        StreamResultFuture future = StreamResultFuture.createInitiator(nextTimeUUID(), StreamOperation.BOOTSTRAP, Collections.emptyList(), streamCoordinator);
 
         InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
         streamCoordinator.addSessionInfo(new SessionInfo(peer, 0, peer, Collections.emptyList(), Collections.emptyList(), StreamSession.State.INITIALIZED));
 
-        StreamSession session = streamCoordinator.getOrCreateNextSession(peer);
+        StreamSession session = streamCoordinator.getOrCreateOutboundSession(peer);
         session.init(future);
         return session;
     }
diff --git a/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java b/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java
index 2e2ee8f..e44cbcd 100644
--- a/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java
+++ b/test/unit/org/apache/cassandra/db/transform/DuplicateRowCheckerTest.java
@@ -65,7 +65,7 @@
         createTable("CREATE TABLE %s (pk text, ck1 int, ck2 int, v int, PRIMARY KEY (pk, ck1, ck2))");
         for (int i = 0; i < 10; i++)
             execute("insert into %s (pk, ck1, ck2, v) values (?, ?, ?, ?)", "key", i, i, i);
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
 
         metadata = getCurrentColumnFamilyStore().metadata();
         cfs = getCurrentColumnFamilyStore();
diff --git a/test/unit/org/apache/cassandra/db/view/ViewBuilderTaskTest.java b/test/unit/org/apache/cassandra/db/view/ViewBuilderTaskTest.java
index 2341c73..c6df898 100644
--- a/test/unit/org/apache/cassandra/db/view/ViewBuilderTaskTest.java
+++ b/test/unit/org/apache/cassandra/db/view/ViewBuilderTaskTest.java
@@ -24,6 +24,7 @@
 
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.SystemKeyspace;
@@ -84,8 +85,8 @@
                               int expectedRowsInView) throws Throwable
             {
                 // Truncate the materialized view (not the base table)
-                cfs.viewManager.forceBlockingFlush();
-                cfs.viewManager.truncateBlocking(cfs.forceBlockingFlush(), System.currentTimeMillis());
+                Util.flush(cfs.viewManager);
+                cfs.viewManager.truncateBlocking(cfs.forceBlockingFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS), System.currentTimeMillis());
                 assertRowCount(execute("SELECT * FROM " + viewName), 0);
 
                 // Get the tokens from the referenced inserted rows
diff --git a/test/unit/org/apache/cassandra/db/view/ViewUtilsTest.java b/test/unit/org/apache/cassandra/db/view/ViewUtilsTest.java
index 7855150..e0ef3d6 100644
--- a/test/unit/org/apache/cassandra/db/view/ViewUtilsTest.java
+++ b/test/unit/org/apache/cassandra/db/view/ViewUtilsTest.java
@@ -18,36 +18,41 @@
 
 package org.apache.cassandra.db.view;
 
+import java.io.IOException;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Optional;
 
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.junit.Assert;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.locator.Replica;
-import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.dht.OrderPreservingPartitioner.StringToken;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.locator.IEndpointSnitch;
+import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.NetworkTopologyStrategy;
 import org.apache.cassandra.locator.PropertyFileSnitch;
+import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.ReplicationParams;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.service.StorageService;
 
 public class ViewUtilsTest
 {
+    private final String KS = "Keyspace1";
+
     @BeforeClass
-    public static void setUp() throws ConfigurationException
+    public static void setUp() throws ConfigurationException, IOException
     {
         DatabaseDescriptor.daemonInitialization();
+        ServerTestUtils.cleanupAndLeaveDirs();
         IEndpointSnitch snitch = new PropertyFileSnitch();
         DatabaseDescriptor.setEndpointSnitch(snitch);
         Keyspace.setInitialized();
@@ -73,11 +78,9 @@
         replicationMap.put("DC1", "1");
         replicationMap.put("DC2", "1");
 
-        Keyspace.clear("Keyspace1");
-        KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, replicationMap));
-        Schema.instance.load(meta);
+        recreateKeyspace(replicationMap);
 
-        Optional<Replica> naturalEndpoint = ViewUtils.getViewNaturalEndpoint(Keyspace.open("Keyspace1").getReplicationStrategy(),
+        Optional<Replica> naturalEndpoint = ViewUtils.getViewNaturalEndpoint(Keyspace.open(KS).getReplicationStrategy(),
                                                                              new StringToken("CA"),
                                                                              new StringToken("BB"));
 
@@ -106,11 +109,9 @@
         replicationMap.put("DC1", "2");
         replicationMap.put("DC2", "2");
 
-        Keyspace.clear("Keyspace1");
-        KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, replicationMap));
-        Schema.instance.load(meta);
+        recreateKeyspace(replicationMap);
 
-        Optional<Replica> naturalEndpoint = ViewUtils.getViewNaturalEndpoint(Keyspace.open("Keyspace1").getReplicationStrategy(),
+        Optional<Replica> naturalEndpoint = ViewUtils.getViewNaturalEndpoint(Keyspace.open(KS).getReplicationStrategy(),
                                                                              new StringToken("CA"),
                                                                              new StringToken("BB"));
 
@@ -138,14 +139,19 @@
         replicationMap.put("DC1", "1");
         replicationMap.put("DC2", "1");
 
-        Keyspace.clear("Keyspace1");
-        KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, replicationMap));
-        Schema.instance.load(meta);
+        recreateKeyspace(replicationMap);
 
-        Optional<Replica> naturalEndpoint = ViewUtils.getViewNaturalEndpoint(Keyspace.open("Keyspace1").getReplicationStrategy(),
+        Optional<Replica> naturalEndpoint = ViewUtils.getViewNaturalEndpoint(Keyspace.open(KS).getReplicationStrategy(),
                                                                              new StringToken("AB"),
                                                                              new StringToken("BB"));
 
         Assert.assertFalse(naturalEndpoint.isPresent());
     }
+
+    private void recreateKeyspace(Map<String, String> replicationMap)
+    {
+        SchemaTestUtil.dropKeyspaceIfExist(KS, true);
+        KeyspaceMetadata meta = KeyspaceMetadata.create(KS, KeyspaceParams.create(false, replicationMap));
+        SchemaTestUtil.addOrUpdateKeyspace(meta, true);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/db/virtual/BatchMetricsTableTest.java b/test/unit/org/apache/cassandra/db/virtual/BatchMetricsTableTest.java
new file mode 100644
index 0000000..8c34759
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/BatchMetricsTableTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.virtual;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.codahale.metrics.Histogram;
+import com.codahale.metrics.Snapshot;
+import com.datastax.driver.core.ResultSet;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.statements.BatchStatement;
+import org.apache.cassandra.metrics.BatchMetrics;
+
+import static java.lang.String.format;
+import static org.junit.Assert.assertEquals;
+
+public class BatchMetricsTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+    }
+
+    @Before
+    public void config()
+    {
+        BatchMetricsTable table = new BatchMetricsTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+    }
+
+    @Test
+    public void testSelectAll() throws Throwable
+    {
+        BatchMetrics metrics = BatchStatement.metrics;
+
+        for (int i = 0; i < 10; i++)
+        {
+            metrics.partitionsPerLoggedBatch.update(i);
+            metrics.partitionsPerUnloggedBatch.update(i + 10);
+            metrics.partitionsPerCounterBatch.update(i * 10);
+        }
+
+        ResultSet result = executeNet(format("SELECT * FROM %s.batch_metrics", KS_NAME));
+        assertEquals(5, result.getColumnDefinitions().size());
+        AtomicInteger rowCount = new AtomicInteger(0);
+        result.forEach(r -> {
+            Snapshot snapshot = getExpectedHistogram(metrics, r.getString("name")).getSnapshot();
+            assertEquals(snapshot.getMedian(), r.getDouble("p50th"), 0.0);
+            assertEquals(snapshot.get99thPercentile(), r.getDouble("p99th"), 0.0);
+            rowCount.addAndGet(1);
+        });
+
+        assertEquals(3, rowCount.get());
+    }
+
+    private Histogram getExpectedHistogram(BatchMetrics metrics, String name)
+    {
+        if ("partitions_per_logged_batch".equals(name))
+            return metrics.partitionsPerLoggedBatch;
+
+        if ("partitions_per_unlogged_batch".equals(name))
+            return metrics.partitionsPerUnloggedBatch;
+
+        return metrics.partitionsPerCounterBatch;
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/CQLMetricsTableTest.java b/test/unit/org/apache/cassandra/db/virtual/CQLMetricsTableTest.java
new file mode 100644
index 0000000..658b841
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/CQLMetricsTableTest.java
@@ -0,0 +1,126 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.virtual;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.google.common.collect.ImmutableList;
+
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.Test;
+import org.junit.BeforeClass;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryProcessor;
+import org.apache.cassandra.metrics.CQLMetrics;
+
+public class CQLMetricsTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+    }
+
+    private void queryAndValidateMetrics(CQLMetrics expectedMetrics) throws Throwable
+    {
+        String getMetricsQuery = "SELECT * FROM " + KS_NAME + "." + CQLMetricsTable.TABLE_NAME;
+        ResultSet vtsRows = executeNet(getMetricsQuery);
+
+        assertEquals(2, vtsRows.getColumnDefinitions().size());
+
+        AtomicInteger rowCount = new AtomicInteger(0);
+        vtsRows.forEach(r -> {
+            final double metricValue = r.getDouble(CQLMetricsTable.VALUE_COL);
+            switch (r.getString(CQLMetricsTable.NAME_COL))
+            {
+                case CQLMetricsTable.PREPARED_STATEMENTS_COUNT:
+                    assertEquals(expectedMetrics.preparedStatementsCount.getValue(), metricValue, 0);
+                    break;
+                case CQLMetricsTable.PREPARED_STATEMENTS_EVICTED:
+                    assertEquals(expectedMetrics.preparedStatementsEvicted.getCount(), metricValue, 0);
+                    break;
+                case CQLMetricsTable.PREPARED_STATEMENTS_EXECUTED:
+                    assertEquals(expectedMetrics.preparedStatementsExecuted.getCount(), metricValue, 0);
+                    break;
+                case CQLMetricsTable.PREPARED_STATEMENTS_RATIO:
+                    assertEquals(expectedMetrics.preparedStatementsRatio.getValue(), metricValue, 0.01);
+                    break;
+                case CQLMetricsTable.REGULAR_STATEMENTS_EXECUTED:
+                    assertEquals(expectedMetrics.regularStatementsExecuted.getCount(), metricValue, 0);
+                    break;
+            }
+            rowCount.getAndIncrement();
+        });
+
+        assertEquals(5, rowCount.get());
+    }
+
+    @Test
+    public void testUsingPrepareStmts() throws Throwable
+    {
+        CQLMetricsTable table = new CQLMetricsTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+
+        String ks = createKeyspace("CREATE KEYSPACE %s WITH replication={ 'class' : 'SimpleStrategy', 'replication_factor' : 1 }");
+        String tbl = createTable(ks, "CREATE TABLE %s (id int PRIMARY KEY, cid int, val text)");
+        Session session = sessionNet();
+
+        String insertCQL = "INSERT INTO " + ks + "." + tbl + " (id, cid, val) VALUES (?, ?, ?)";
+        PreparedStatement preparedInsert = session.prepare(insertCQL);
+
+        String selectCQL = "Select * from " + ks + "." + tbl + " where id = ?";
+        PreparedStatement preparedSelect = session.prepare(selectCQL);
+
+        for (int i = 0; i < 10; i++)
+        {
+            session.execute(preparedInsert.bind(i, i, "value" + i));
+            session.execute(preparedSelect.bind(i));
+        }
+
+        queryAndValidateMetrics(QueryProcessor.metrics);
+    }
+
+    @Test
+    public void testUsingInjectedValues() throws Throwable
+    {
+        CQLMetrics cqlMetrics = new CQLMetrics();
+        CQLMetricsTable table = new CQLMetricsTable(KS_NAME, cqlMetrics);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+
+        // With initial injected values
+        cqlMetrics.preparedStatementsExecuted.inc(50);
+        cqlMetrics.regularStatementsExecuted.inc(100);
+        cqlMetrics.preparedStatementsEvicted.inc(25);
+        queryAndValidateMetrics(cqlMetrics);
+
+        // Test again with updated values
+        cqlMetrics.preparedStatementsExecuted.inc(150);
+        cqlMetrics.regularStatementsExecuted.inc(200);
+        cqlMetrics.preparedStatementsEvicted.inc(50);
+        queryAndValidateMetrics(cqlMetrics);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/ClientsTableTest.java b/test/unit/org/apache/cassandra/db/virtual/ClientsTableTest.java
new file mode 100644
index 0000000..5b9aa14
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/ClientsTableTest.java
@@ -0,0 +1,74 @@
+/*
+ * 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.virtual;
+
+import java.net.InetAddress;
+
+import com.google.common.collect.ImmutableList;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Row;
+import org.apache.cassandra.cql3.CQLTester;
+import org.assertj.core.api.Assertions;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ClientsTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+    
+    private ClientsTable table;
+    
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+    }
+
+    @Before
+    public void config()
+    {
+        table = new ClientsTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+    }
+    
+    @Test
+    public void testSelectAll() throws Throwable
+    {
+        ResultSet result = executeNet("SELECT * FROM vts.clients");
+        
+        for (Row r : result)
+        {
+            Assert.assertEquals(InetAddress.getLoopbackAddress(), r.getInet("address"));
+            r.getInt("port");
+            Assert.assertTrue(r.getInt("port") > 0);
+            Assert.assertNotNull(r.getMap("client_options", String.class, String.class));
+            Assert.assertTrue(r.getLong("request_count") > 0 );
+            // the following are questionable if they belong here
+            Assert.assertEquals("localhost", r.getString("hostname"));
+            Assertions.assertThat(r.getMap("client_options", String.class, String.class))
+                      .hasEntrySatisfying("DRIVER_VERSION", value -> assertThat(value.contains(r.getString("driver_name"))))
+                      .hasEntrySatisfying("DRIVER_VERSION", value -> assertThat(value.contains(r.getString("driver_version"))));
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/CredentialsCacheKeysTableTest.java b/test/unit/org/apache/cassandra/db/virtual/CredentialsCacheKeysTableTest.java
new file mode 100644
index 0000000..45132a9
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/CredentialsCacheKeysTableTest.java
@@ -0,0 +1,169 @@
+/*
+ * 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.virtual;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.EndPoint;
+import com.datastax.driver.core.PlainTextAuthProvider;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.IAuthenticator;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+
+public class CredentialsCacheKeysTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+    private static AuthTestUtils.LocalPasswordAuthenticator passwordAuthenticator;
+
+    @SuppressWarnings("FieldCanBeLocal")
+    private CredentialsCacheKeysTable table;
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        // high value is used for convenient debugging
+        DatabaseDescriptor.setCredentialsValidity(20_000);
+
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+        passwordAuthenticator = (AuthTestUtils.LocalPasswordAuthenticator) DatabaseDescriptor.getAuthenticator();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+    }
+
+    @Before
+    public void config()
+    {
+        table = new CredentialsCacheKeysTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+
+        // ensure nothing keeps cached between tests
+        passwordAuthenticator.getCredentialsCache().invalidate();
+        disablePreparedReuseForTest();
+    }
+
+    @AfterClass
+    public static void tearDownClass()
+    {
+        DatabaseDescriptor.setCredentialsValidity(DatabaseDescriptor.getRawConfig().credentials_validity.toMilliseconds());
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.credentials_cache_keys"));
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.credentials_cache_keys"),
+                row("role_a"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.credentials_cache_keys WHERE role='role_a'"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.credentials_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testDeletePartition() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("DELETE FROM vts.credentials_cache_keys WHERE role='role_a'");
+
+        assertRows(execute("SELECT * FROM vts.credentials_cache_keys"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testDeletePartitionWithInvalidValues() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+
+        execute("DELETE FROM vts.credentials_cache_keys WHERE role='invalid_role'");
+
+        assertRows(execute("SELECT * FROM vts.credentials_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testTruncateTable() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("TRUNCATE vts.credentials_cache_keys");
+
+        assertEmpty(execute("SELECT * FROM vts.credentials_cache_keys"));
+    }
+
+    @Test
+    public void testUnsupportedOperations() throws Throwable
+    {
+        // range tombstone is not supported, however, this table has no clustering columns, so it is not covered by tests
+
+        // column deletion is not supported, however, this table has no regular columns, so it is not covered by tests
+
+        // insert is not supported
+        assertInvalidMessage("Column modification is not supported by table vts.credentials_cache_keys",
+                "INSERT INTO vts.credentials_cache_keys (role) VALUES ('role_e')");
+
+        // update is not supported, however, this table has no regular columns, so it is not covered by tests
+    }
+
+    private void cachePermissions(RoleResource roleResource)
+    {
+        IAuthenticator.SaslNegotiator saslNegotiator = passwordAuthenticator.newSaslNegotiator(null);
+        saslNegotiator.evaluateResponse(new PlainTextAuthProvider(roleResource.getRoleName(), "ignored")
+                .newAuthenticator((EndPoint) null, null)
+                .initialResponse());
+        saslNegotiator.getAuthenticatedUser();
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/GossipInfoTableTest.java b/test/unit/org/apache/cassandra/db/virtual/GossipInfoTableTest.java
new file mode 100644
index 0000000..a2c2a2b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/GossipInfoTableTest.java
@@ -0,0 +1,195 @@
+/*
+ * 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.virtual;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Supplier;
+
+import org.awaitility.Awaitility;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+import static com.google.common.collect.ImmutableList.of;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class GossipInfoTableTest extends CQLTester
+{
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+    }
+
+    @Test
+    public void testSelectAllWhenGossipInfoIsEmpty() throws Throwable
+    {
+        // we have not triggered gossiper yet
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace("vts_1",
+                                                                      of(new GossipInfoTable("vts_1", HashMap::new))));
+        assertEmpty(execute("SELECT * FROM vts_1.gossip_info"));
+    }
+
+    @Test
+    public void testSelectAllWithStateTransitions() throws Throwable
+    {
+        try
+        {
+            requireNetwork(); // triggers gossiper
+
+            ConcurrentMap<InetAddressAndPort, EndpointState> states = Gossiper.instance.endpointStateMap;
+            Awaitility.await().until(() -> !states.isEmpty());
+            Map.Entry<InetAddressAndPort, EndpointState> entry = states.entrySet().stream().findFirst()
+                    .orElseThrow(AssertionError::new);
+            InetAddressAndPort endpoint = entry.getKey();
+            EndpointState localState = new EndpointState(entry.getValue());
+
+            Supplier<Map<InetAddressAndPort, EndpointState>> endpointStateMapSupplier = () -> new HashMap<InetAddressAndPort, EndpointState>() {{put(endpoint, localState);}};
+
+            VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace("vts_2",
+                                                                          of(new GossipInfoTable("vts_2", endpointStateMapSupplier))));
+
+            UntypedResultSet resultSet = execute("SELECT * FROM vts_2.gossip_info");
+
+            assertThat(resultSet.size()).isEqualTo(1);
+            UntypedResultSet.Row row = resultSet.one();
+            assertThat(row.getColumns().size()).isEqualTo(64);
+
+            assertThat(endpoint).isNotNull();
+            assertThat(localState).isNotNull();
+            assertThat(row.getInetAddress("address")).isEqualTo(endpoint.getAddress());
+            assertThat(row.getInt("port")).isEqualTo(endpoint.getPort());
+            assertThat(row.getString("hostname")).isEqualTo(endpoint.getHostName());
+            assertThat(row.getInt("generation")).isEqualTo(localState.getHeartBeatState().getGeneration());
+            assertThat(row.getInt("heartbeat")).isNotNull();
+
+            assertValue(row, "status", localState, ApplicationState.STATUS);
+            assertValue(row, "load", localState, ApplicationState.LOAD);
+            assertValue(row, "schema", localState, ApplicationState.SCHEMA);
+            assertValue(row, "dc", localState, ApplicationState.DC);
+            assertValue(row, "rack", localState, ApplicationState.RACK);
+            assertValue(row, "release_version", localState, ApplicationState.RELEASE_VERSION);
+            assertValue(row, "removal_coordinator", localState, ApplicationState.REMOVAL_COORDINATOR);
+            assertValue(row, "internal_ip", localState, ApplicationState.INTERNAL_IP);
+            assertValue(row, "rpc_address", localState, ApplicationState.RPC_ADDRESS);
+            assertValue(row, "severity", localState, ApplicationState.SEVERITY);
+            assertValue(row, "net_version", localState, ApplicationState.NET_VERSION);
+            assertValue(row, "host_id", localState, ApplicationState.HOST_ID);
+            assertValue(row, "rpc_ready", localState, ApplicationState.RPC_READY);
+            assertValue(row, "internal_address_and_port", localState, ApplicationState.INTERNAL_ADDRESS_AND_PORT);
+            assertValue(row, "native_address_and_port", localState, ApplicationState.NATIVE_ADDRESS_AND_PORT);
+            assertValue(row, "status_with_port", localState, ApplicationState.STATUS_WITH_PORT);
+            assertValue(row, "sstable_versions", localState, ApplicationState.SSTABLE_VERSIONS);
+            assertValue(row, "disk_usage", localState, ApplicationState.DISK_USAGE);
+            assertValue(row, "x_11_padding", localState, ApplicationState.X_11_PADDING);
+            assertValue(row, "x1", localState, ApplicationState.X1);
+            assertValue(row, "x2", localState, ApplicationState.X2);
+            assertValue(row, "x3", localState, ApplicationState.X3);
+            assertValue(row, "x4", localState, ApplicationState.X4);
+            assertValue(row, "x5", localState, ApplicationState.X5);
+            assertValue(row, "x6", localState, ApplicationState.X6);
+            assertValue(row, "x7", localState, ApplicationState.X7);
+            assertValue(row, "x8", localState, ApplicationState.X8);
+            assertValue(row, "x9", localState, ApplicationState.X9);
+            assertValue(row, "x10", localState, ApplicationState.X10);
+
+            assertVersion(row, "status_version", localState, ApplicationState.STATUS);
+            assertVersion(row, "load_version", localState, ApplicationState.LOAD);
+            assertVersion(row, "schema_version", localState, ApplicationState.SCHEMA);
+            assertVersion(row, "dc_version", localState, ApplicationState.DC);
+            assertVersion(row, "rack_version", localState, ApplicationState.RACK);
+            assertVersion(row, "release_version_version", localState, ApplicationState.RELEASE_VERSION);
+            assertVersion(row, "removal_coordinator_version", localState, ApplicationState.REMOVAL_COORDINATOR);
+            assertVersion(row, "internal_ip_version", localState, ApplicationState.INTERNAL_IP);
+            assertVersion(row, "rpc_address_version", localState, ApplicationState.RPC_ADDRESS);
+            assertVersion(row, "severity_version", localState, ApplicationState.SEVERITY);
+            assertVersion(row, "net_version_version", localState, ApplicationState.NET_VERSION);
+            assertVersion(row, "host_id_version", localState, ApplicationState.HOST_ID);
+            assertVersion(row, "tokens_version", localState, ApplicationState.TOKENS);
+            assertVersion(row, "rpc_ready_version", localState, ApplicationState.RPC_READY);
+            assertVersion(row, "internal_address_and_port_version", localState, ApplicationState.INTERNAL_ADDRESS_AND_PORT);
+            assertVersion(row, "native_address_and_port_version", localState, ApplicationState.NATIVE_ADDRESS_AND_PORT);
+            assertVersion(row, "status_with_port_version", localState, ApplicationState.STATUS_WITH_PORT);
+            assertVersion(row, "sstable_versions_version", localState, ApplicationState.SSTABLE_VERSIONS);
+            assertVersion(row, "disk_usage_version", localState, ApplicationState.DISK_USAGE);
+            assertVersion(row, "x_11_padding", localState, ApplicationState.X_11_PADDING);
+            assertVersion(row, "x1", localState, ApplicationState.X1);
+            assertVersion(row, "x2", localState, ApplicationState.X2);
+            assertVersion(row, "x3", localState, ApplicationState.X3);
+            assertVersion(row, "x4", localState, ApplicationState.X4);
+            assertVersion(row, "x5", localState, ApplicationState.X5);
+            assertVersion(row, "x6", localState, ApplicationState.X6);
+            assertVersion(row, "x7", localState, ApplicationState.X7);
+            assertVersion(row, "x8", localState, ApplicationState.X8);
+            assertVersion(row, "x9", localState, ApplicationState.X9);
+            assertVersion(row, "x10", localState, ApplicationState.X10);
+        }
+        finally
+        {
+            // clean up the gossip states
+            Gossiper.instance.clearUnsafe();
+        }
+    }
+
+    private void assertValue(UntypedResultSet.Row row, String column, EndpointState localState, ApplicationState key)
+    {
+        if (row.has(column))
+        {
+            assertThat(localState.getApplicationState(key)).as("'%s' is expected to be not-null", key)
+                                                           .isNotNull();
+            String tableString = row.getString(column);
+            String stateString = localState.getApplicationState(key).value;
+            assertThat(tableString).as("'%s' is expected to match column '%s', table string: %s, state string: %s",
+                                       key, column, tableString, stateString).isEqualTo(stateString);
+        }
+        else
+        {
+            assertThat(localState.getApplicationState(key)).as("'%s' is expected to be null", key)
+                                                           .isNull();
+        }
+    }
+
+    private void assertVersion(UntypedResultSet.Row row, String column, EndpointState localState, ApplicationState key)
+    {
+        if (row.has(column))
+        {
+            assertThat(localState.getApplicationState(key)).as("'%s' is expected to be not-null", key)
+                                                           .isNotNull();
+
+            int tableVersion = row.getInt(column);
+            int stateVersion = localState.getApplicationState(key).version;
+
+            assertThat(tableVersion).as("'%s' is expected to match column '%s', table int: %s, state int: %s",
+                                        key, column, tableVersion, stateVersion).isEqualTo(stateVersion);
+        }
+        else
+        {
+            assertThat(localState.getApplicationState(key)).as("'%s' is expected to be null", key)
+                                                           .isNull();
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/JmxPermissionsCacheKeysTableTest.java b/test/unit/org/apache/cassandra/db/virtual/JmxPermissionsCacheKeysTableTest.java
new file mode 100644
index 0000000..1dfe622
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/JmxPermissionsCacheKeysTableTest.java
@@ -0,0 +1,189 @@
+/*
+ * 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.virtual;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import javax.security.auth.Subject;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.CassandraPrincipal;
+import org.apache.cassandra.auth.IAuthorizer;
+import org.apache.cassandra.auth.IResource;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.JMXResource;
+import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.auth.jmx.AuthorizationProxy;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+
+public class JmxPermissionsCacheKeysTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+    private static final AuthorizationProxy authorizationProxy = new AuthTestUtils.NoAuthSetupAuthorizationProxy();
+
+    @SuppressWarnings("FieldCanBeLocal")
+    private JmxPermissionsCacheKeysTable table;
+
+    // this method is intentionally not called "setUpClass" to let it throw exception brought by startJMXServer method 
+    @BeforeClass
+    public static void setup() throws Exception {
+        // high value is used for convenient debugging
+        DatabaseDescriptor.setPermissionsValidity(20_000);
+
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+
+        List<IResource> resources = Arrays.asList(
+                JMXResource.root(),
+                JMXResource.mbean("org.apache.cassandra.db:type=Tables,*"));
+
+        IAuthorizer authorizer = DatabaseDescriptor.getAuthorizer();
+        for (IResource resource : resources)
+        {
+            Set<Permission> permissions = resource.applicablePermissions();
+            authorizer.grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_A);
+            authorizer.grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_B);
+        }
+
+        startJMXServer();
+    }
+
+    @Before
+    public void config()
+    {
+        table = new JmxPermissionsCacheKeysTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+
+        // ensure nothing keeps cached between tests
+        AuthorizationProxy.jmxPermissionsCache.invalidate();
+        disablePreparedReuseForTest();
+    }
+
+    @AfterClass
+    public static void tearDownClass()
+    {
+        DatabaseDescriptor.setPermissionsValidity(DatabaseDescriptor.getRawConfig().permissions_validity.toMilliseconds());
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.jmx_permissions_cache_keys"));
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.jmx_permissions_cache_keys"),
+                row("role_a"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.jmx_permissions_cache_keys WHERE role='role_a'"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.jmx_permissions_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testDeletePartition() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("DELETE FROM vts.jmx_permissions_cache_keys WHERE role='role_a'");
+
+        assertRows(execute("SELECT * FROM vts.jmx_permissions_cache_keys"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testDeletePartitionWithInvalidValues() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+
+        execute("DELETE FROM vts.jmx_permissions_cache_keys WHERE role='invalid_role'");
+
+        assertRows(execute("SELECT * FROM vts.jmx_permissions_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testTruncateTable() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("TRUNCATE vts.jmx_permissions_cache_keys");
+
+        assertEmpty(execute("SELECT * FROM vts.jmx_permissions_cache_keys"));
+    }
+
+    @Test
+    public void testUnsupportedOperations() throws Throwable
+    {
+        // range tombstone is not supported, however, this table has no clustering columns, so it is not covered by tests
+
+        // column deletion is not supported, however, this table has no regular columns, so it is not covered by tests
+
+        // insert is not supported
+        assertInvalidMessage("Column modification is not supported by table vts.jmx_permissions_cache_keys",
+                "INSERT INTO vts.jmx_permissions_cache_keys (role) VALUES ('role_e')");
+
+        // update is not supported, however, this table has no regular columns, so it is not covered by tests
+    }
+
+    private void cachePermissions(RoleResource roleResource)
+    {
+        Subject userSubject = new Subject();
+        userSubject.getPrincipals().add(new CassandraPrincipal(roleResource.getRoleName()));
+
+        authorizationProxy.authorize(userSubject, "queryNames", null);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/LocalRepairTablesTest.java b/test/unit/org/apache/cassandra/db/virtual/LocalRepairTablesTest.java
new file mode 100644
index 0000000..2a6da1a
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/LocalRepairTablesTest.java
@@ -0,0 +1,335 @@
+/*
+ * 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.virtual;
+
+import java.net.UnknownHostException;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Date;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.CommonRange;
+import org.apache.cassandra.repair.RepairJobDesc;
+import org.apache.cassandra.repair.RepairRunnable;
+import org.apache.cassandra.repair.messages.PrepareMessage;
+import org.apache.cassandra.repair.messages.RepairOption;
+import org.apache.cassandra.repair.state.Completable;
+import org.apache.cassandra.repair.state.CoordinatorState;
+import org.apache.cassandra.repair.state.JobState;
+import org.apache.cassandra.repair.state.ParticipateState;
+import org.apache.cassandra.repair.state.SessionState;
+import org.apache.cassandra.repair.state.State;
+import org.apache.cassandra.repair.state.ValidationState;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
+
+public class LocalRepairTablesTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+    private static final ImmutableSet<InetAddressAndPort> ADDRESSES = ImmutableSet.of(address(127, 0, 0, 1));
+    private static final List<String> ADDRESSES_STR = ADDRESSES.stream().map(Object::toString).collect(Collectors.toList());
+    private static final CommonRange COMMON_RANGE = new CommonRange(ADDRESSES, Collections.emptySet(), Collections.singleton(range(0, 100)));
+    private static final String REPAIR_KS = "system";
+    private static final String REPAIR_TABLE = "peers";
+
+    @BeforeClass
+    public static void before()
+    {
+        CQLTester.setUpClass();
+
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, LocalRepairTables.getAll(KS_NAME)));
+    }
+
+    @Before
+    public void cleanupRepairs()
+    {
+        ActiveRepairService.instance.clearLocalRepairState();
+    }
+
+    @Test
+    public void repairs() throws Throwable
+    {
+        assertEmpty("repairs");
+
+        CoordinatorState state = coordinator();
+        assertInit("repairs", state);
+
+        state.phase.setup();
+        assertState("repairs", state, CoordinatorState.State.SETUP);
+
+        List<ColumnFamilyStore> tables = Collections.singletonList(table());
+        RepairRunnable.NeighborsAndRanges neighbors = neighbors();
+        state.phase.start(tables, neighbors);
+        assertState("repairs", state, CoordinatorState.State.START);
+        List<List<String>> expectedRanges = neighbors.commonRanges.stream().map(a -> a.ranges.stream().map(Object::toString).collect(Collectors.toList())).collect(Collectors.toList());
+        assertRowsIgnoringOrder(execute(t("SELECT id, completed, participants, table_names, ranges, unfiltered_ranges, participants FROM %s.repairs")),
+                                row(state.id, false, ADDRESSES_STR, tables.stream().map(a -> a.name).collect(Collectors.toList()), expectedRanges, expectedRanges, neighbors.participants.stream().map(Object::toString).collect(Collectors.toList())));
+
+        state.phase.prepareStart();
+        assertState("repairs", state, CoordinatorState.State.PREPARE_START);
+
+        state.phase.prepareComplete();
+        assertState("repairs", state, CoordinatorState.State.PREPARE_COMPLETE);
+
+        state.phase.repairSubmitted();
+        assertState("repairs", state, CoordinatorState.State.REPAIR_START);
+
+        state.phase.repairCompleted();
+        assertState("repairs", state, CoordinatorState.State.REPAIR_COMPLETE);
+
+        state.phase.success("testing");
+        assertSuccess("repairs", state);
+
+        // make sure serialization works
+        execute(t("SELECT * FROM %s.repairs"));
+    }
+
+    @Test
+    public void sessions() throws Throwable
+    {
+        assertEmpty("repair_sessions");
+
+        SessionState state = session();
+        assertInit("repair_sessions", state);
+
+        state.phase.start();
+        assertState("repair_sessions", state, SessionState.State.START);
+
+        state.phase.jobsSubmitted();
+        assertState("repair_sessions", state, SessionState.State.JOBS_START);
+
+        state.phase.success("testing");
+        assertSuccess("repair_sessions", state);
+
+        assertRowsIgnoringOrder(execute(t("SELECT participants FROM %s.repair_sessions WHERE id=?"), state.id),
+                                row(ADDRESSES_STR));
+
+        // make sure serialization works
+        execute(t("SELECT * FROM %s.repair_sessions"));
+    }
+
+    @Test
+    public void jobs() throws Throwable
+    {
+        assertEmpty("repair_jobs");
+
+        JobState state = job();
+        assertInit("repair_jobs", state);
+
+        state.phase.start();
+        assertState("repair_jobs", state, JobState.State.START);
+
+        state.phase.snapshotsSubmitted();
+        assertState("repair_jobs", state, JobState.State.SNAPSHOT_START);
+        state.phase.snapshotsCompleted();
+        assertState("repair_jobs", state, JobState.State.SNAPSHOT_COMPLETE);
+        state.phase.validationSubmitted();
+        assertState("repair_jobs", state, JobState.State.VALIDATION_START);
+        state.phase.validationCompleted();
+        assertState("repair_jobs", state, JobState.State.VALIDATION_COMPLETE);
+        state.phase.streamSubmitted();
+        assertState("repair_jobs", state, JobState.State.STREAM_START);
+
+        state.phase.success("testing");
+        assertSuccess("repair_jobs", state);
+
+        assertRowsIgnoringOrder(execute(t("SELECT participants FROM %s.repair_jobs WHERE id=?"), state.id),
+                                row(ADDRESSES_STR));
+
+        // make sure serialization works
+        execute(t("SELECT * FROM %s.repair_jobs"));
+    }
+
+    @Test
+    public void participates() throws Throwable
+    {
+        assertEmpty("repair_participates");
+        ParticipateState state = participate();
+
+        assertInit("repair_participates", state);
+        state.phase.success("testing");
+        assertRowsIgnoringOrder(execute(t("SELECT id, initiator, ranges, failure_cause, success_message, state_init_timestamp, state_success_timestamp, state_failure_timestamp FROM %s.repair_participates WHERE id = ?"), state.id),
+                                row(state.getId(), FBUtilities.getBroadcastAddressAndPort().toString(), Arrays.asList("(0,42]"), null, "testing", new Date(state.getInitializedAtMillis()), new Date(state.getLastUpdatedAtMillis()), null));
+
+        state = participate();
+        assertInit("repair_participates", state);
+        state.phase.fail("testing");
+        assertRowsIgnoringOrder(execute(t("SELECT id, completed, initiator, ranges, failure_cause, success_message, state_init_timestamp, state_success_timestamp, state_failure_timestamp FROM %s.repair_participates WHERE id = ?"), state.id),
+                                row(state.getId(), true, FBUtilities.getBroadcastAddressAndPort().toString(), Arrays.asList("(0,42]"), "testing", null, new Date(state.getInitializedAtMillis()), null, new Date(state.getLastUpdatedAtMillis())));
+
+        // make sure serialization works
+        execute(t("SELECT * FROM %s.repair_participates"));
+    }
+
+    @Test
+    public void validations() throws Throwable
+    {
+        assertEmpty("repair_validations");
+
+        ValidationState state = validation();
+        assertInit("repair_validations", state);
+
+        // progress is defined by estimated partitions and how many partitions have been processed; disable checking in shared functions
+        state.phase.start(100, 100);
+        assertState("repair_validations", state, ValidationState.State.START);
+
+        for (int i = 0; i < 10; i++)
+        {
+            state.partitionsProcessed += 10;
+            state.bytesRead += 10;
+            state.updated();
+
+            // min 99% is because >= 100 gets lowered to 99% and the last 1% is when validation is actualy complete
+            assertRowsIgnoringOrder(execute(t("SELECT id, initiator, status, progress_percentage, estimated_partitions, estimated_total_bytes, partitions_processed, bytes_read, failure_cause, success_message FROM %s.repair_validations")),
+                                    row(state.getId(), FBUtilities.getBroadcastAddressAndPort().toString(), "start", Math.min(99.0F, (float) state.partitionsProcessed), 100L, 100L, state.partitionsProcessed, state.bytesRead, null, null));
+        }
+
+        state.phase.sendingTrees();
+        assertState("repair_validations", state, ValidationState.State.SENDING_TREES);
+
+        state.phase.success("testing");
+        assertSuccess("repair_validations", state);
+
+        // make sure serialization works
+        execute(t("SELECT * FROM %s.repair_validations"));
+    }
+
+    private void assertEmpty(String table) throws Throwable
+    {
+        assertRowCount(execute(t("SELECT * FROM %s." + table)), 0);
+    }
+
+    private void assertInit(String table, Completable<?> state) throws Throwable
+    {
+        assertRowsIgnoringOrder(execute(t("SELECT id, state_init_timestamp, failure_cause, success_message FROM %s." + table + " WHERE id = ?"), state.getId()),
+                                row(state.getId(), new Date(state.getInitializedAtMillis()), null, null));
+    }
+
+    private void assertInit(String table, State<?, ?> state) throws Throwable
+    {
+        assertRowsIgnoringOrder(execute(t("SELECT id, status, state_init_timestamp, failure_cause, success_message FROM %s." + table + " WHERE id = ?"), state.getId()),
+                                row(state.getId(), "init", new Date(state.getInitializedAtMillis()), null, null));
+    }
+
+    private <T extends Enum<T>> void assertState(String table, State<?, ?> state, T expectedState) throws Throwable
+    {
+        assertRowsIgnoringOrder(execute(t("SELECT id, completed, status, failure_cause, success_message FROM %s." + table + " WHERE id = ?"), state.getId()),
+                                row(state.getId(), false, expectedState.name().toLowerCase(), null, null));
+    }
+
+    private void assertSuccess(String table, State<?, ?> state) throws Throwable
+    {
+        assertRowsIgnoringOrder(execute(t("SELECT id, completed, status, failure_cause, success_message FROM %s." + table + " WHERE id = ?"), state.getId()),
+                                row(state.getId(), true, "success", null, "testing"));
+    }
+
+    private static ColumnFamilyStore table()
+    {
+        return table(REPAIR_KS, REPAIR_TABLE);
+    }
+
+    private static ColumnFamilyStore table(String ks, String name)
+    {
+        return Schema.instance.getColumnFamilyStoreInstance(Schema.instance.getTableMetadata(ks, name).id);
+    }
+
+    private static RepairRunnable.NeighborsAndRanges neighbors()
+    {
+        return new RepairRunnable.NeighborsAndRanges(false, ADDRESSES, ImmutableList.of(COMMON_RANGE));
+    }
+
+    private static Range<Token> range(long a, long b)
+    {
+        return new Range<>(new Murmur3Partitioner.LongToken(a), new Murmur3Partitioner.LongToken(b));
+    }
+
+    private static InetAddressAndPort address(int a, int b, int c, int d)
+    {
+        try
+        {
+            return InetAddressAndPort.getByAddress(new byte[] {(byte) a, (byte) b, (byte) c, (byte) d});
+        }
+        catch (UnknownHostException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    private static CoordinatorState coordinator()
+    {
+        RepairOption options = RepairOption.parse(Collections.emptyMap(), DatabaseDescriptor.getPartitioner());
+        CoordinatorState state = new CoordinatorState(0, "test", options);
+        ActiveRepairService.instance.register(state);
+        return state;
+    }
+
+    private static SessionState session()
+    {
+        CoordinatorState parent = coordinator();
+        SessionState state = new SessionState(parent.id, REPAIR_KS, new String[]{ REPAIR_TABLE }, COMMON_RANGE);
+        parent.register(state);
+        return state;
+    }
+
+    private static JobState job()
+    {
+        SessionState session = session();
+        JobState state = new JobState(new RepairJobDesc(session.parentRepairSession, session.id, session.keyspace, session.cfnames[0], session.commonRange.ranges), session.commonRange.endpoints);
+        session.register(state);
+        return state;
+    }
+
+    private ValidationState validation()
+    {
+        JobState job = job(); // job isn't needed but makes getting the descriptor easier
+        ParticipateState participate = participate();
+        ValidationState state = new ValidationState(job.desc, ADDRESSES.stream().findFirst().get());
+        participate.register(state);
+        return state;
+    }
+
+    private ParticipateState participate()
+    {
+        List<Range<Token>> ranges = Arrays.asList(new Range<>(new Murmur3Partitioner.LongToken(0), new Murmur3Partitioner.LongToken(42)));
+        ParticipateState state = new ParticipateState(FBUtilities.getBroadcastAddressAndPort(), new PrepareMessage(TimeUUID.Generator.nextTimeUUID(), Collections.emptyList(), ranges, true, 42, true, PreviewKind.ALL));
+        ActiveRepairService.instance.register(state);
+        return state;
+    }
+
+    private static String t(String string)
+    {
+        return String.format(string, KS_NAME);
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/db/virtual/NetworkPermissionsCacheKeysTableTest.java b/test/unit/org/apache/cassandra/db/virtual/NetworkPermissionsCacheKeysTableTest.java
new file mode 100644
index 0000000..f944884
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/NetworkPermissionsCacheKeysTableTest.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.virtual;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.DCPermissions;
+import org.apache.cassandra.auth.INetworkAuthorizer;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+
+public class NetworkPermissionsCacheKeysTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+
+    @SuppressWarnings("FieldCanBeLocal")
+    private NetworkPermissionsCacheKeysTable table;
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        // high value is used for convenient debugging
+        DatabaseDescriptor.setPermissionsValidity(20_000);
+
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+
+        INetworkAuthorizer networkAuthorizer = DatabaseDescriptor.getNetworkAuthorizer();
+        networkAuthorizer.setRoleDatacenters(ROLE_A, DCPermissions.all());
+        networkAuthorizer.setRoleDatacenters(ROLE_B, DCPermissions.subset(DATA_CENTER, DATA_CENTER_REMOTE));
+    }
+
+    @Before
+    public void config()
+    {
+        table = new NetworkPermissionsCacheKeysTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+
+        // ensure nothing keeps cached between tests
+        AuthenticatedUser.networkPermissionsCache.invalidate();
+        disablePreparedReuseForTest();
+    }
+
+    @AfterClass
+    public static void tearDownClass()
+    {
+        DatabaseDescriptor.setPermissionsValidity(DatabaseDescriptor.getRawConfig().permissions_validity.toMilliseconds());
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.network_permissions_cache_keys"));
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.network_permissions_cache_keys"),
+                row("role_a"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.network_permissions_cache_keys WHERE role='role_a'"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.network_permissions_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testDeletePartition() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("DELETE FROM vts.network_permissions_cache_keys WHERE role='role_a'");
+
+        assertRows(execute("SELECT * FROM vts.network_permissions_cache_keys"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testDeletePartitionWithInvalidValues() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+
+        execute("DELETE FROM vts.network_permissions_cache_keys WHERE role='invalid_role'");
+
+        assertRows(execute("SELECT * FROM vts.network_permissions_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testTruncateTable() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("TRUNCATE vts.network_permissions_cache_keys");
+
+        assertEmpty(execute("SELECT * FROM vts.network_permissions_cache_keys"));
+    }
+
+    @Test
+    public void testUnsupportedOperations() throws Throwable
+    {
+        // range tombstone is not supported, however, this table has no clustering columns, so it is not covered by tests
+
+        // column deletion is not supported, however, this table has no regular columns, so it is not covered by tests
+
+        // insert is not supported
+        assertInvalidMessage("Column modification is not supported by table vts.network_permissions_cache_keys",
+                "INSERT INTO vts.network_permissions_cache_keys (role) VALUES ('role_e')");
+
+        // update is not supported, however, this table has no regular columns, so it is not covered by tests
+    }
+
+    private void cachePermissions(RoleResource roleResource)
+    {
+        AuthenticatedUser.networkPermissionsCache.get(roleResource);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/PermissionsCacheKeysTableTest.java b/test/unit/org/apache/cassandra/db/virtual/PermissionsCacheKeysTableTest.java
new file mode 100644
index 0000000..2171b2d
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/PermissionsCacheKeysTableTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.virtual;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.DataResource;
+import org.apache.cassandra.auth.IAuthorizer;
+import org.apache.cassandra.auth.IResource;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+
+public class PermissionsCacheKeysTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+
+    @SuppressWarnings("FieldCanBeLocal")
+    private PermissionsCacheKeysTable table;
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        // high value is used for convenient debugging
+        DatabaseDescriptor.setPermissionsValidity(20_000);
+
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+
+        List<IResource> resources = Arrays.asList(
+                DataResource.root(),
+                DataResource.keyspace(KEYSPACE),
+                DataResource.table(KEYSPACE, "t1"));
+
+        IAuthorizer authorizer = DatabaseDescriptor.getAuthorizer();
+        for (IResource resource : resources)
+        {
+            Set<Permission> permissions = resource.applicablePermissions();
+            authorizer.grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_A);
+            authorizer.grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_B);
+        }
+    }
+
+    @Before
+    public void config()
+    {
+        table = new PermissionsCacheKeysTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+
+        // ensure nothing keeps cached between tests
+        AuthenticatedUser.permissionsCache.invalidate();
+        disablePreparedReuseForTest();
+    }
+
+    @AfterClass
+    public static void tearDownClass()
+    {
+        DatabaseDescriptor.setPermissionsValidity(DatabaseDescriptor.getRawConfig().permissions_validity.toMilliseconds());
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.permissions_cache_keys"));
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissionsForResource(ROLE_A, DataResource.root());
+        cachePermissionsForResource(ROLE_A, DataResource.keyspace(KEYSPACE));
+        cachePermissionsForResource(ROLE_B, DataResource.table(KEYSPACE, "t1"));
+
+        assertRows(execute("SELECT * FROM vts.permissions_cache_keys"),
+                row("role_a", "data"),
+                row("role_a", "data/cql_test_keyspace"),
+                row("role_b", "data/cql_test_keyspace/t1"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.permissions_cache_keys WHERE role='role_a' AND resource='data'"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissionsForResource(ROLE_A, DataResource.root());
+        cachePermissionsForResource(ROLE_A, DataResource.keyspace(KEYSPACE));
+        cachePermissionsForResource(ROLE_B, DataResource.table(KEYSPACE, "t1"));
+
+        assertRows(execute("SELECT * FROM vts.permissions_cache_keys WHERE role='role_a' AND resource='data'"),
+                row("role_a", "data"));
+    }
+
+    @Test
+    public void testDeletePartition() throws Throwable
+    {
+        cachePermissionsForResource(ROLE_A, DataResource.root());
+        cachePermissionsForResource(ROLE_A, DataResource.keyspace(KEYSPACE));
+
+        execute("DELETE FROM vts.permissions_cache_keys WHERE role='role_a' AND resource='data'");
+
+        assertRows(execute("SELECT * FROM vts.permissions_cache_keys"),
+                row("role_a", "data/cql_test_keyspace"));
+    }
+
+    @Test
+    public void testDeletePartitionWithInvalidValues() throws Throwable
+    {
+        cachePermissionsForResource(ROLE_A, DataResource.root());
+
+        execute("DELETE FROM vts.permissions_cache_keys WHERE role='invalid_role' AND resource='data'");
+        execute("DELETE FROM vts.permissions_cache_keys WHERE role='role_a' AND resource='invalid_resource'");
+
+        assertRows(execute("SELECT * FROM vts.permissions_cache_keys WHERE role='role_a' AND resource='data'"),
+                row("role_a", "data"));
+    }
+
+    @Test
+    public void testTruncateTable() throws Throwable
+    {
+        cachePermissionsForResource(ROLE_A, DataResource.root());
+        cachePermissionsForResource(ROLE_B, DataResource.table(KEYSPACE, "t1"));
+
+        execute("TRUNCATE vts.permissions_cache_keys");
+
+        assertEmpty(execute("SELECT * FROM vts.permissions_cache_keys"));
+    }
+
+    @Test
+    public void testUnsupportedOperations() throws Throwable
+    {
+        // range tombstone is not supported, however, this table has no clustering columns, so it is not covered by tests
+
+        // column deletion is not supported, however, this table has no regular columns, so it is not covered by tests
+
+        // insert is not supported
+        assertInvalidMessage("Column modification is not supported by table vts.permissions_cache_keys",
+                "INSERT INTO vts.permissions_cache_keys (role, resource) VALUES ('role_e', 'data')");
+
+        // update is not supported, however, this table has no regular columns, so it is not covered by tests
+    }
+
+    private void cachePermissionsForResource(RoleResource roleResource, IResource resource)
+    {
+        AuthenticatedUser role = new AuthenticatedUser(roleResource.getRoleName());
+        role.getPermissions(resource);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/RolesCacheKeysTableTest.java b/test/unit/org/apache/cassandra/db/virtual/RolesCacheKeysTableTest.java
new file mode 100644
index 0000000..40c3037
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/RolesCacheKeysTableTest.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.db.virtual;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.auth.Roles;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_C;
+
+public class RolesCacheKeysTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+
+    @SuppressWarnings("FieldCanBeLocal")
+    private RolesCacheKeysTable table;
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        // high value is used for convenient debugging
+        DatabaseDescriptor.setRolesValidity(20_000);
+
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_C, AuthTestUtils.getLoginRoleOptions());
+
+        AuthTestUtils.grantRolesTo(roleManager, ROLE_A, ROLE_C);
+        AuthTestUtils.grantRolesTo(roleManager, ROLE_B, ROLE_C);
+    }
+
+    @Before
+    public void config()
+    {
+        table = new RolesCacheKeysTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+
+        // ensure nothing keeps cached between tests
+        Roles.cache.invalidate();
+        disablePreparedReuseForTest();
+    }
+
+    @AfterClass
+    public static void tearDownClass()
+    {
+        DatabaseDescriptor.setRolesValidity(DatabaseDescriptor.getRawConfig().roles_validity.toMilliseconds());
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.roles_cache_keys"));
+    }
+
+    @Test
+    public void testSelectAllWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.roles_cache_keys"),
+                row("role_a"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreNotCached() throws Throwable
+    {
+        assertEmpty(execute("SELECT * FROM vts.roles_cache_keys WHERE role='role_a'"));
+    }
+
+    @Test
+    public void testSelectPartitionWhenPermissionsAreCached() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        assertRows(execute("SELECT * FROM vts.roles_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testDeletePartition() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("DELETE FROM vts.roles_cache_keys WHERE role='role_a'");
+
+        assertRows(execute("SELECT * FROM vts.roles_cache_keys"),
+                row("role_b"));
+    }
+
+    @Test
+    public void testDeletePartitionWithInvalidValues() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+
+        execute("DELETE FROM vts.roles_cache_keys WHERE role='invalid_role'");
+
+        assertRows(execute("SELECT * FROM vts.roles_cache_keys WHERE role='role_a'"),
+                row("role_a"));
+    }
+
+    @Test
+    public void testTruncateTable() throws Throwable
+    {
+        cachePermissions(ROLE_A);
+        cachePermissions(ROLE_B);
+
+        execute("TRUNCATE vts.roles_cache_keys");
+
+        assertEmpty(execute("SELECT * FROM vts.roles_cache_keys"));
+    }
+
+    @Test
+    public void testUnsupportedOperations() throws Throwable
+    {
+        // range tombstone is not supported, however, this table has no clustering columns, so it is not covered by tests
+
+        // column deletion is not supported, however, this table has no regular columns, so it is not covered by tests
+
+        // insert is not supported
+        assertInvalidMessage("Column modification is not supported by table vts.roles_cache_keys",
+                "INSERT INTO vts.roles_cache_keys (role) VALUES ('role_e')");
+
+        // update is not supported, however, this table has no regular columns, so it is not covered by tests
+    }
+
+    private void cachePermissions(RoleResource roleResource)
+    {
+        Roles.getRoleDetails(roleResource);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/SSTableTasksTableTest.java b/test/unit/org/apache/cassandra/db/virtual/SSTableTasksTableTest.java
new file mode 100644
index 0000000..f642a2f
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/SSTableTasksTableTest.java
@@ -0,0 +1,99 @@
+/*
+ * 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.virtual;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.compaction.CompactionInfo;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.compaction.OperationType;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.schema.MockSchema;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+public class SSTableTasksTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+
+    @SuppressWarnings("FieldCanBeLocal")
+    private SSTableTasksTable table;
+
+    @BeforeClass
+    public static void setUpClass()
+    {
+        CQLTester.setUpClass();
+        CompactionManager.instance.disableAutoCompaction();
+    }
+
+    @Before
+    public void config()
+    {
+        table = new SSTableTasksTable(KS_NAME);
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+        disablePreparedReuseForTest();
+    }
+
+    @Test
+    public void testSelectAll() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck))");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+
+        long bytesCompacted = 123;
+        long bytesTotal = 123456;
+        TimeUUID compactionId = nextTimeUUID();
+        List<SSTableReader> sstables = IntStream.range(0, 10)
+                .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+                .collect(Collectors.toList());
+        CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
+        {
+            public CompactionInfo getCompactionInfo()
+            {
+                return new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, bytesCompacted, bytesTotal, compactionId, sstables);
+            }
+
+            public boolean isGlobal()
+            {
+                return false;
+            }
+        };
+
+        CompactionManager.instance.active.beginCompaction(compactionHolder);
+        UntypedResultSet result = execute("SELECT * FROM vts.sstable_tasks");
+        assertRows(result, row(CQLTester.KEYSPACE, currentTable(), compactionId, 1.0 * bytesCompacted / bytesTotal,
+                OperationType.COMPACTION.toString().toLowerCase(), bytesCompacted, sstables.size(),
+                bytesTotal, CompactionInfo.Unit.BYTES.toString()));
+
+        CompactionManager.instance.active.finishCompaction(compactionHolder);
+        result = execute("SELECT * FROM vts.sstable_tasks");
+        assertEmpty(result);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java b/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java
index a2fda49..a5c69cd 100644
--- a/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java
+++ b/test/unit/org/apache/cassandra/db/virtual/SettingsTableTest.java
@@ -18,10 +18,8 @@
 
 package org.apache.cassandra.db.virtual;
 
-import java.lang.reflect.Field;
-import java.lang.reflect.Modifier;
-import java.util.Arrays;
 import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 import com.google.common.collect.ImmutableList;
@@ -33,10 +31,12 @@
 import com.datastax.driver.core.ResultSet;
 import com.datastax.driver.core.Row;
 import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DurationSpec;
 import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions.InternodeEncryption;
 import org.apache.cassandra.config.ParameterizedClass;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.security.SSLFactory;
+import org.yaml.snakeyaml.introspector.Property;
 
 public class SettingsTableTest extends CQLTester
 {
@@ -57,24 +57,14 @@
         config = new Config();
         config.client_encryption_options.applyConfig();
         config.server_encryption_options.applyConfig();
+        config.sstable_preemptive_open_interval = null;
+        config.index_summary_resize_interval = null;
+        config.cache_load_timeout = new DurationSpec.IntSecondsBound(0);
+        config.commitlog_sync_group_window = new DurationSpec.IntMillisecondsBound(0);
+        config.credentials_update_interval = null;
         table = new SettingsTable(KS_NAME, config);
         VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
-    }
-
-    private String getValue(Field f)
-    {
-        Object untypedValue = table.getValue(f);
-        String value = null;
-        if (untypedValue != null)
-        {
-            if (untypedValue.getClass().isArray())
-            {
-                value = Arrays.toString((Object[]) untypedValue);
-            }
-            else
-                value = untypedValue.toString();
-        }
-        return value;
+        disablePreparedReuseForTest();
     }
 
     @Test
@@ -87,26 +77,22 @@
         {
             i++;
             String name = r.getString("name");
-            Field f = SettingsTable.FIELDS.get(name);
-            if (f != null) // skip overrides
-                Assert.assertEquals(getValue(f), r.getString("value"));
+            Property prop = SettingsTable.PROPERTIES.get(name);
+            if (prop != null) // skip overrides
+                Assert.assertEquals(getValue(prop), r.getString("value"));
         }
-        Assert.assertTrue(SettingsTable.FIELDS.size() <= i);
+        Assert.assertTrue(SettingsTable.PROPERTIES.size() <= i);
     }
 
     @Test
     public void testSelectPartition() throws Throwable
     {
-        List<Field> fields = Arrays.stream(Config.class.getFields())
-                                   .filter(f -> !Modifier.isStatic(f.getModifiers()))
-                                   .collect(Collectors.toList());
-        for (Field f : fields)
+        for (Map.Entry<String, Property> e : SettingsTable.PROPERTIES.entrySet())
         {
-            if (table.overrides.containsKey(f.getName()))
-                continue;
-
-            String q = "SELECT * FROM vts.settings WHERE name = '"+f.getName()+'\'';
-            assertRowsNet(executeNet(q), new Object[] {f.getName(), getValue(f)});
+            String name = e.getKey();
+            Property prop = e.getValue();
+            String q = "SELECT * FROM vts.settings WHERE name = '"+name+'\'';
+            assertRowsNet(executeNet(q), new Object[] { name, getValue(prop) });
         }
     }
 
@@ -126,10 +112,59 @@
         assertRowsNet(executeNet(q));
     }
 
+    @Test
+    public void virtualTableBackwardCompatibility() throws Throwable
+    {
+        // test NEGATIVE_MEBIBYTES_DATA_STORAGE_INT converter
+        String q = "SELECT * FROM vts.settings WHERE name = 'sstable_preemptive_open_interval';";
+        assertRowsNet(executeNet(q), new Object[] {"sstable_preemptive_open_interval", null});
+        q = "SELECT * FROM vts.settings WHERE name = 'sstable_preemptive_open_interval_in_mb';";
+        assertRowsNet(executeNet(q), new Object[] {"sstable_preemptive_open_interval_in_mb", "-1"});
+
+        // test MINUTES_CUSTOM_DURATION converter
+        q = "SELECT * FROM vts.settings WHERE name = 'index_summary_resize_interval';";
+        assertRowsNet(executeNet(q), new Object[] {"index_summary_resize_interval", null});
+        q = "SELECT * FROM vts.settings WHERE name = 'index_summary_resize_interval_in_minutes';";
+        assertRowsNet(executeNet(q), new Object[] {"index_summary_resize_interval_in_minutes", "-1"});
+
+        // test NEGATIVE_SECONDS_DURATION converter
+        q = "SELECT * FROM vts.settings WHERE name = 'cache_load_timeout';";
+        assertRowsNet(executeNet(q), new Object[] {"cache_load_timeout", "0s"});
+        q = "SELECT * FROM vts.settings WHERE name = 'cache_load_timeout_seconds';";
+        assertRowsNet(executeNet(q), new Object[] {"cache_load_timeout_seconds", "0"});
+
+        // test MILLIS_DURATION_DOUBLE converter
+        q = "SELECT * FROM vts.settings WHERE name = 'commitlog_sync_group_window';";
+        assertRowsNet(executeNet(q), new Object[] {"commitlog_sync_group_window", "0ms"});
+        q = "SELECT * FROM vts.settings WHERE name = 'commitlog_sync_group_window_in_ms';";
+        assertRowsNet(executeNet(q), new Object[] {"commitlog_sync_group_window_in_ms", "0.0"});
+
+        //test MILLIS_CUSTOM_DURATION converter
+        q = "SELECT * FROM vts.settings WHERE name = 'credentials_update_interval';";
+        assertRowsNet(executeNet(q), new Object[] {"credentials_update_interval", null});
+        q = "SELECT * FROM vts.settings WHERE name = 'credentials_update_interval_in_ms';";
+        assertRowsNet(executeNet(q), new Object[] {"credentials_update_interval_in_ms", "-1"});
+    }
+
+    private String getValue(Property prop)
+    {
+        Object v = prop.get(config);
+        if (v != null)
+            return v.toString();
+        return null;
+    }
+
     private void check(String setting, String expected) throws Throwable
     {
         String q = "SELECT * FROM vts.settings WHERE name = '"+setting+'\'';
-        assertRowsNet(executeNet(q), new Object[] {setting, expected});
+        try
+        {
+            assertRowsNet(executeNet(q), new Object[] {setting, expected});
+        }
+        catch (AssertionError e)
+        {
+            throw new AssertionError(e.getMessage() + " for query " + q);
+        }
     }
 
     @Test
@@ -140,7 +175,8 @@
         String all = "SELECT * FROM vts.settings WHERE " +
                      "name > 'server_encryption' AND name < 'server_encryptionz' ALLOW FILTERING";
 
-        Assert.assertEquals(9, executeNet(all).all().size());
+        List<String> expectedNames = SettingsTable.PROPERTIES.keySet().stream().filter(n -> n.startsWith("server_encryption")).collect(Collectors.toList());
+        Assert.assertEquals(expectedNames.size(), executeNet(all).all().size());
 
         check(pre + "algorithm", null);
         config.server_encryption_options = config.server_encryption_options.withAlgorithm("SUPERSSL");
@@ -150,6 +186,7 @@
         config.server_encryption_options = config.server_encryption_options.withCipherSuites("c1", "c2");
         check(pre + "cipher_suites", "[c1, c2]");
 
+        // name doesn't match yaml
         check(pre + "protocol", null);
         config.server_encryption_options = config.server_encryption_options.withProtocol("TLSv5");
         check(pre + "protocol", "[TLSv5]");
@@ -169,10 +206,12 @@
         config.server_encryption_options = config.server_encryption_options.withOptional(true);
         check(pre + "optional", "true");
 
+        // name doesn't match yaml
         check(pre + "client_auth", "false");
         config.server_encryption_options = config.server_encryption_options.withRequireClientAuth(true);
         check(pre + "client_auth", "true");
 
+        // name doesn't match yaml
         check(pre + "endpoint_verification", "false");
         config.server_encryption_options = config.server_encryption_options.withRequireEndpointVerification(true);
         check(pre + "endpoint_verification", "true");
@@ -182,6 +221,7 @@
         check(pre + "internode_encryption", "all");
         check(pre + "enabled", "true");
 
+        // name doesn't match yaml
         check(pre + "legacy_ssl_storage_port", "false");
         config.server_encryption_options = config.server_encryption_options.withLegacySslStoragePort(true);
         check(pre + "legacy_ssl_storage_port", "true");
@@ -196,9 +236,11 @@
                      "name > 'audit_logging' AND name < 'audit_loggingz' ALLOW FILTERING";
 
         config.audit_logging_options.enabled = true;
-        Assert.assertEquals(9, executeNet(all).all().size());
+        List<String> expectedNames = SettingsTable.PROPERTIES.keySet().stream().filter(n -> n.startsWith("audit_logging")).collect(Collectors.toList());
+        Assert.assertEquals(expectedNames.size(), executeNet(all).all().size());
         check(pre + "enabled", "true");
 
+        // name doesn't match yaml
         check(pre + "logger", "BinAuditLogger");
         config.audit_logging_options.logger = new ParameterizedClass("logger", null);
         check(pre + "logger", "logger");
@@ -241,7 +283,8 @@
                      "name < 'transparent_data_encryption_optionsz' ALLOW FILTERING";
 
         config.transparent_data_encryption_options.enabled = true;
-        Assert.assertEquals(4, executeNet(all).all().size());
+        List<String> expectedNames = SettingsTable.PROPERTIES.keySet().stream().filter(n -> n.startsWith("transparent_data_encryption_options")).collect(Collectors.toList());
+        Assert.assertEquals(expectedNames.size(), executeNet(all).all().size());
         check(pre + "enabled", "true");
 
         check(pre + "cipher", "AES/CBC/PKCS5Padding");
diff --git a/test/unit/org/apache/cassandra/db/virtual/StreamingVirtualTableTest.java b/test/unit/org/apache/cassandra/db/virtual/StreamingVirtualTableTest.java
new file mode 100644
index 0000000..c8e3d89
--- /dev/null
+++ b/test/unit/org/apache/cassandra/db/virtual/StreamingVirtualTableTest.java
@@ -0,0 +1,272 @@
+/*
+ * 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.virtual;
+
+import java.net.UnknownHostException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Date;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.streaming.ProgressInfo;
+import org.apache.cassandra.streaming.ProgressInfo.Direction;
+import org.apache.cassandra.streaming.SessionInfo;
+import org.apache.cassandra.streaming.StreamCoordinator;
+import org.apache.cassandra.streaming.StreamEvent;
+import org.apache.cassandra.streaming.StreamEvent.ProgressEvent;
+import org.apache.cassandra.streaming.StreamManager;
+import org.apache.cassandra.streaming.StreamOperation;
+import org.apache.cassandra.streaming.StreamResultFuture;
+import org.apache.cassandra.streaming.StreamSession;
+import org.apache.cassandra.streaming.StreamState;
+import org.apache.cassandra.streaming.StreamSummary;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.StreamingState;
+import org.apache.cassandra.utils.FBUtilities;
+import org.assertj.core.util.Throwables;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+public class StreamingVirtualTableTest extends CQLTester
+{
+    private static final String KS_NAME = "vts";
+    private static final InetAddressAndPort PEER1 = address(127, 0, 0, 1);
+    private static final InetAddressAndPort PEER2 = address(127, 0, 0, 2);
+    private static final InetAddressAndPort PEER3 = address(127, 0, 0, 3);
+    private static String TABLE_NAME;
+
+    @BeforeClass
+    public static void setup()
+    {
+        CQLTester.setUpClass();
+        StreamingVirtualTable table = new StreamingVirtualTable(KS_NAME);
+        TABLE_NAME = table.toString();
+        VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+    }
+
+    @Before
+    public void clearState()
+    {
+        StreamManager.instance.clearStates();
+    }
+
+    @Test
+    public void empty() throws Throwable
+    {
+        assertEmpty(execute(t("select * from %s")));
+    }
+
+    @Test
+    public void single() throws Throwable
+    {
+        StreamingState state = stream(true);
+        assertRows(execute(t("select id, follower, operation, peers, status, progress_percentage, last_updated_at, failure_cause, success_message from %s")),
+                   new Object[] { state.id(), true, "Repair", Collections.emptyList(), "init", 0F, new Date(state.lastUpdatedAtMillis()), null, null });
+
+        state.phase.start();
+        assertRows(execute(t("select id, follower, operation, peers, status, progress_percentage, last_updated_at, failure_cause, success_message from %s")),
+                   new Object[] { state.id(), true, "Repair", Collections.emptyList(), "start", 0F, new Date(state.lastUpdatedAtMillis()), null, null });
+
+        state.handleStreamEvent(new StreamEvent.SessionPreparedEvent(state.id(), new SessionInfo(PEER2, 1, PEER1, Collections.emptyList(), Collections.emptyList(), StreamSession.State.PREPARING), StreamSession.PrepareDirection.ACK));
+
+        state.onSuccess(new StreamState(state.id(), StreamOperation.REPAIR, ImmutableSet.of(new SessionInfo(PEER2, 1, PEER1, Collections.emptyList(), Collections.emptyList(), StreamSession.State.COMPLETE))));
+        assertRows(execute(t("select id, follower, operation, peers, status, progress_percentage, last_updated_at, failure_cause, success_message from %s")),
+                   new Object[] { state.id(), true, "Repair", Arrays.asList(address(127, 0, 0, 2).toString()), "success", 100F, new Date(state.lastUpdatedAtMillis()), null, null });
+    }
+
+    @Test
+    public void progressInitiator() throws Throwable
+    {
+        progress(false);
+    }
+
+    @Test
+    public void progressFollower() throws Throwable
+    {
+        progress(true);
+    }
+
+    public void progress(boolean follower) throws Throwable
+    {
+        StreamingState state = stream(follower);
+        StreamResultFuture future = state.future();
+        state.phase.start();
+
+        SessionInfo s1 = new SessionInfo(PEER2, 0, FBUtilities.getBroadcastAddressAndPort(), Arrays.asList(streamSummary()), Arrays.asList(streamSummary(), streamSummary()), StreamSession.State.PREPARING);
+        SessionInfo s2 = new SessionInfo(PEER3, 0, FBUtilities.getBroadcastAddressAndPort(), Arrays.asList(streamSummary()), Arrays.asList(streamSummary(), streamSummary()), StreamSession.State.PREPARING);
+
+        // we only update stats on ACK
+        state.handleStreamEvent(new StreamEvent.SessionPreparedEvent(state.id(), s1, StreamSession.PrepareDirection.ACK));
+        state.handleStreamEvent(new StreamEvent.SessionPreparedEvent(state.id(), s2, StreamSession.PrepareDirection.ACK));
+
+        long bytesToReceive = 0, bytesToSend = 0;
+        long filesToReceive = 0, filesToSend = 0;
+        for (SessionInfo s : Arrays.asList(s1, s2))
+        {
+            bytesToReceive += s.getTotalSizeToReceive();
+            bytesToSend += s.getTotalSizeToSend();
+            filesToReceive += s.getTotalFilesToReceive();
+            filesToSend += s.getTotalFilesToSend();
+        }
+        assertRows(execute(t("select id, follower, peers, status, progress_percentage, bytes_to_receive, bytes_received, bytes_to_send, bytes_sent, files_to_receive, files_received, files_to_send, files_sent from %s")),
+                   new Object[] { state.id(), follower, Arrays.asList(PEER2.toString(), PEER3.toString()), "start", 0F, bytesToReceive, 0L, bytesToSend, 0L, filesToReceive, 0L, filesToSend, 0L });
+
+        // update progress; sent all but 1 file
+        long bytesReceived = 0, bytesSent = 0;
+        long filesReceived = 0, filesSent = 0;
+        for (SessionInfo s : Arrays.asList(s1, s2))
+        {
+            List<StreamSummary> receiving = deterministic(s.receivingSummaries);
+            bytesReceived += progressEvent(state, s, receiving, Direction.IN);
+            filesReceived += receiving.stream().mapToInt(ss -> ss.files - 1).sum();
+
+            List<StreamSummary> sending = deterministic(s.sendingSummaries);
+            bytesSent += progressEvent(state, s, sending, Direction.OUT);
+            filesSent += sending.stream().mapToInt(ss -> ss.files - 1).sum();
+        }
+
+        assertRows(execute(t("select id, follower, peers, status, bytes_to_receive, bytes_received, bytes_to_send, bytes_sent, files_to_receive, files_received, files_to_send, files_sent from %s")),
+                   new Object[] { state.id(), follower, Arrays.asList(PEER2.toString(), PEER3.toString()), "start", bytesToReceive, bytesReceived, bytesToSend, bytesSent, filesToReceive, filesReceived, filesToSend, filesSent });
+
+        // finish
+        for (SessionInfo s : Arrays.asList(s1, s2))
+        {
+            // complete the rest
+            List<StreamSummary> receiving = deterministic(s.receivingSummaries);
+            bytesReceived += completeEvent(state, s, receiving, Direction.IN);
+            filesReceived += receiving.stream().mapToInt(ss -> ss.files - 1).sum();
+
+            List<StreamSummary> sending = deterministic(s.sendingSummaries);
+            bytesSent += completeEvent(state, s, sending, Direction.OUT);
+            filesSent += sending.stream().mapToInt(ss -> ss.files - 1).sum();
+        }
+
+        assertRows(execute(t("select id, follower, peers, status, progress_percentage, bytes_to_receive, bytes_received, bytes_to_send, bytes_sent, files_to_receive, files_received, files_to_send, files_sent from %s")),
+                   new Object[] { state.id(), follower, Arrays.asList(PEER2.toString(), PEER3.toString()), "start", 99F, bytesToReceive, bytesToReceive, bytesToSend, bytesToSend, filesToReceive, filesToReceive, filesToSend, filesToSend });
+
+        state.onSuccess(future.getCurrentState());
+        assertRows(execute(t("select id, follower, peers, status, progress_percentage, last_updated_at, failure_cause, success_message from %s")),
+                   new Object[] { state.id(), follower, Arrays.asList(PEER2.toString(), PEER3.toString()), "success", 100F, new Date(state.lastUpdatedAtMillis()), null, null });
+    }
+
+    private static long progressEvent(StreamingState state, SessionInfo s, List<StreamSummary> summaries, Direction direction)
+    {
+        long counter = 0;
+        for (StreamSummary summary : summaries)
+        {
+            long fileSize = summary.totalSize / summary.files;
+            for (int i = 0; i < summary.files - 1; i++)
+            {
+                String fileName = summary.tableId + "-" + direction.name().toLowerCase() + "-" + i;
+                state.handleStreamEvent(new ProgressEvent(state.id(), new ProgressInfo((InetAddressAndPort) s.peer, 0, fileName, direction, fileSize, fileSize, fileSize)));
+                counter += fileSize;
+            }
+        }
+        return counter;
+    }
+
+    private static long completeEvent(StreamingState state, SessionInfo s, List<StreamSummary> summaries, Direction direction)
+    {
+        long counter = 0;
+        for (StreamSummary summary : summaries)
+        {
+            long fileSize = summary.totalSize / summary.files;
+            String fileName = summary.tableId + "-" + direction.name().toLowerCase() + "-" + summary.files;
+            state.handleStreamEvent(new ProgressEvent(state.id(), new ProgressInfo((InetAddressAndPort) s.peer, 0, fileName, direction, fileSize, fileSize, fileSize)));
+            counter += fileSize;
+        }
+        return counter;
+    }
+
+    private List<StreamSummary> deterministic(Collection<StreamSummary> summaries)
+    {
+        // SessionInfo uses a ImmutableSet... so create a list
+        List<StreamSummary> list = new ArrayList<>(summaries);
+        // need to order so all calls with the same input return the same order
+        // if duplicates are found, the object order may be different but the contents will match
+        Collections.sort(list, Comparator.comparing((StreamSummary a) -> a.tableId.asUUID())
+                                         .thenComparingInt(a -> a.files)
+                                         .thenComparingLong(a -> a.totalSize));
+        return list;
+    }
+
+    private static StreamSummary streamSummary()
+    {
+        int files = ThreadLocalRandom.current().nextInt(2, 10);
+        return new StreamSummary(TableId.fromUUID(UUID.randomUUID()), files, files * 1024);
+    }
+
+    @Test
+    public void failed() throws Throwable
+    {
+        StreamingState state = stream(true);
+        RuntimeException t = new RuntimeException("You failed!");
+        state.onFailure(t);
+        assertRows(execute(t("select id, follower, peers, status, progress_percentage, last_updated_at, failure_cause, success_message from %s")),
+                   new Object[] { state.id(), true, Collections.emptyList(), "failure", 100F, new Date(state.lastUpdatedAtMillis()), Throwables.getStackTrace(t), null });
+    }
+
+    private static String t(String query)
+    {
+        return String.format(query, TABLE_NAME);
+    }
+
+    private static StreamingState stream(boolean follower)
+    {
+        StreamResultFuture future = new StreamResultFuture(nextTimeUUID(), StreamOperation.REPAIR, new StreamCoordinator(StreamOperation.REPAIR, 0, StreamingChannel.Factory.Global.streamingFactory(), follower, false, null, null) {
+            // initiator requires active sessions exist, else the future becomes success right away.
+            @Override
+            public synchronized boolean hasActiveSessions()
+            {
+                return true;
+            }
+        });
+        StreamingState state = new StreamingState(future);
+        if (follower) StreamManager.instance.putFollowerStream(future);
+        else StreamManager.instance.putInitiatorStream(future);
+        StreamManager.instance.putStreamingState(state);
+        future.addEventListener(state);
+        return state;
+    }
+
+    private static InetAddressAndPort address(int a, int b, int c, int d)
+    {
+        try
+        {
+            return InetAddressAndPort.getByAddress(new byte[] {(byte) a, (byte) b, (byte) c, (byte) d});
+        }
+        catch (UnknownHostException e)
+        {
+            throw new AssertionError(e);
+        }
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java b/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
index 2ec0683..5242d55 100644
--- a/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
+++ b/test/unit/org/apache/cassandra/db/virtual/SystemPropertiesTableTest.java
@@ -56,6 +56,7 @@
     {
         table = new SystemPropertiesTable(KS_NAME);
         VirtualKeyspaceRegistry.instance.register(new VirtualKeyspace(KS_NAME, ImmutableList.of(table)));
+        disablePreparedReuseForTest();
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java
index 05d42cf..395ff40 100644
--- a/test/unit/org/apache/cassandra/dht/BootStrapperTest.java
+++ b/test/unit/org/apache/cassandra/dht/BootStrapperTest.java
@@ -74,7 +74,7 @@
     public void testSourceTargetComputation() throws UnknownHostException
     {
         final int[] clusterSizes = new int[] { 1, 3, 5, 10, 100};
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             int replicationFactor = Keyspace.open(keyspaceName).getReplicationStrategy().getReplicationFactor().allReplicas;
             for (int clusterSize : clusterSizes)
diff --git a/test/unit/org/apache/cassandra/dht/LengthPartitioner.java b/test/unit/org/apache/cassandra/dht/LengthPartitioner.java
index bd6f3d4..c4e5db8 100644
--- a/test/unit/org/apache/cassandra/dht/LengthPartitioner.java
+++ b/test/unit/org/apache/cassandra/dht/LengthPartitioner.java
@@ -172,4 +172,4 @@
     {
         return new PartitionerDefinedOrder(this);
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java b/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java
index 8574786..bb02f40 100644
--- a/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java
+++ b/test/unit/org/apache/cassandra/dht/RangeFetchMapCalculatorTest.java
@@ -25,7 +25,6 @@
 import java.util.Collections;
 import java.util.Map;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.Multimap;
 import org.apache.cassandra.locator.EndpointsByRange;
 import org.junit.Assert;
@@ -70,7 +69,7 @@
 
             private int getIPLastPart(InetAddressAndPort endpoint)
             {
-                String str = endpoint.address.toString();
+                String str = endpoint.getAddress().toString();
                 int index = str.lastIndexOf(".");
                 return Integer.parseInt(str.substring(index + 1).trim());
             }
diff --git a/test/unit/org/apache/cassandra/dht/RangeTest.java b/test/unit/org/apache/cassandra/dht/RangeTest.java
index 7cdb788..84ca124 100644
--- a/test/unit/org/apache/cassandra/dht/RangeTest.java
+++ b/test/unit/org/apache/cassandra/dht/RangeTest.java
@@ -29,7 +29,6 @@
 import com.google.common.base.Joiner;
 import com.google.common.collect.Sets;
 import org.apache.commons.lang3.StringUtils;
-import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
diff --git a/test/unit/org/apache/cassandra/dht/StreamStateStoreTest.java b/test/unit/org/apache/cassandra/dht/StreamStateStoreTest.java
index b18d249..d731385 100644
--- a/test/unit/org/apache/cassandra/dht/StreamStateStoreTest.java
+++ b/test/unit/org/apache/cassandra/dht/StreamStateStoreTest.java
@@ -26,13 +26,14 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.streaming.DefaultConnectionFactory;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.StreamEvent;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.net.MessagingService.current_version;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
@@ -55,7 +56,7 @@
         Range<Token> range = new Range<>(factory.fromString("0"), factory.fromString("100"));
 
         InetAddressAndPort local = FBUtilities.getBroadcastAddressAndPort();
-        StreamSession session = new StreamSession(StreamOperation.BOOTSTRAP, local, new DefaultConnectionFactory(), false, 0, null, PreviewKind.NONE);
+        StreamSession session = new StreamSession(StreamOperation.BOOTSTRAP, local, new NettyStreamingConnectionFactory(), null, current_version, false, 0, null, PreviewKind.NONE);
         session.addStreamRequest("keyspace1", RangesAtEndpoint.toDummyList(Collections.singleton(range)), RangesAtEndpoint.toDummyList(Collections.emptyList()), Collections.singleton("cf"));
 
         StreamStateStore store = new StreamStateStore();
@@ -76,7 +77,7 @@
 
         // add different range within the same keyspace
         Range<Token> range2 = new Range<>(factory.fromString("100"), factory.fromString("200"));
-        session = new StreamSession(StreamOperation.BOOTSTRAP, local, new DefaultConnectionFactory(), false, 0, null, PreviewKind.NONE);
+        session = new StreamSession(StreamOperation.BOOTSTRAP, local, new NettyStreamingConnectionFactory(), null, current_version,false, 0, null, PreviewKind.NONE);
         session.addStreamRequest("keyspace1", RangesAtEndpoint.toDummyList(Collections.singleton(range2)), RangesAtEndpoint.toDummyList(Collections.emptyList()), Collections.singleton("cf"));
         session.state(StreamSession.State.COMPLETE);
         store.handleStreamEvent(new StreamEvent.SessionCompleteEvent(session));
diff --git a/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorGenerationsTest.java b/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorGenerationsTest.java
new file mode 100644
index 0000000..bed078b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorGenerationsTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.dht.tokenallocator;
+
+import org.junit.Before;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.dht.IPartitioner;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.RandomPartitioner;
+import org.apache.cassandra.tools.Util;
+
+import static org.apache.cassandra.dht.tokenallocator.OfflineTokenAllocator.allocate;
+import static org.apache.cassandra.dht.tokenallocator.OfflineTokenAllocatorTestUtils.assertTokensAndNodeCount;
+import static org.apache.cassandra.dht.tokenallocator.OfflineTokenAllocatorTestUtils.makeRackCountArray;
+
+
+/**
+ * We break the testTokenGenerations test out as it runs long and pushes the rest of the test suite to timeout on both
+ * ci environments and local laptops.
+ */
+public class OfflineTokenAllocatorGenerationsTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(OfflineTokenAllocatorGenerationsTest.class);
+
+    @Before
+    public void setup()
+    {
+        Util.initDatabaseDescriptor();
+    }
+
+    // We run with a subset of even, odd, boundary, etc. combinations, however we can't afford to walk through every entry
+    // for each parameter we test as the tests end up taking too long and timing out.
+    private final int[] racks = { 1, 2, 3, 5, 6, 9, 10 };
+    private final int[] rfs = { 1, 2, 3, 5 };
+    private final int[] tokens = { 1, 2, 3, 5, 6, 9, 10, 13, 15, 16 };
+
+    /**
+     * Cycle through a matrix of valid ranges.
+     */
+    @Test
+    public void testTokenGenerations()
+    {
+        for (int numTokens : tokens)
+        {
+            for (int rf : rfs)
+            {
+                int nodeCount = 32;
+                for (int rack: racks)
+                {
+                    int[] nodeToRack = makeRackCountArray(nodeCount, rack);
+                    for (IPartitioner partitioner : new IPartitioner[] { Murmur3Partitioner.instance, RandomPartitioner.instance })
+                    {
+                        logger.info("Testing offline token allocator for numTokens={}, rf={}, racks={}, nodeToRack={}, partitioner={}",
+                                    numTokens, rf, rack, nodeToRack, partitioner);
+                        assertTokensAndNodeCount(numTokens, nodeCount, allocate(rf,
+                                                                                numTokens,
+                                                                                nodeToRack,
+                                                                                new OfflineTokenAllocatorTestUtils.SystemOutputImpl(rf, rack),
+                                                                                partitioner));
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorTest.java b/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorTest.java
index 832d13d..4b2e04d 100644
--- a/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorTest.java
+++ b/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorTest.java
@@ -18,37 +18,22 @@
 
 package org.apache.cassandra.dht.tokenallocator;
 
-import java.util.Collection;
 import java.util.List;
 
-import com.google.common.collect.Lists;
-
-import org.assertj.core.api.Assertions;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
 
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import org.apache.cassandra.dht.ByteOrderedPartitioner;
-import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Murmur3Partitioner;
-import org.apache.cassandra.dht.RandomPartitioner;
-import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.tools.Util;
-import org.apache.cassandra.utils.OutputHandler;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
 import static org.apache.cassandra.dht.tokenallocator.OfflineTokenAllocator.allocate;
+import static org.apache.cassandra.dht.tokenallocator.OfflineTokenAllocatorTestUtils.FAIL_ON_WARN_OUTPUT;
+import static org.apache.cassandra.dht.tokenallocator.OfflineTokenAllocatorTestUtils.assertTokensAndNodeCount;
 
 public class OfflineTokenAllocatorTest
 {
-    private static final Logger logger = LoggerFactory.getLogger(OfflineTokenAllocatorTest.class);
-    private static final OutputHandler FAIL_ON_WARN_OUTPUT = new SystemOutputImpl();
-
     @Before
     public void setup()
     {
@@ -62,63 +47,6 @@
         Assert.assertEquals(3, nodes.size());
     }
 
-    /**
-     * Cycle through a matrix of valid ranges.
-     */
-    @Test
-    public void testTokenGenerations()
-    {
-        for (int numTokens = 1; numTokens <= 16 ; ++numTokens)
-        {
-            for (int rf = 1; rf <=5; ++rf)
-            {
-                int nodeCount = 32;
-                for (int racks = 1; racks <= 10; ++racks)
-                {
-                    int[] nodeToRack = makeRackCountArray(nodeCount, racks);
-                    for (IPartitioner partitioner : new IPartitioner[] { Murmur3Partitioner.instance, RandomPartitioner.instance })
-                    {
-                        logger.info("Testing offline token allocator for numTokens={}, rf={}, racks={}, nodeToRack={}, partitioner={}",
-                                    numTokens, rf, racks, nodeToRack, partitioner);
-                        assertTokensAndNodeCount(numTokens, nodeCount, allocate(rf,
-                                                                                numTokens,
-                                                                                nodeToRack,
-                                                                                new SystemOutputImpl(rf, racks),
-                                                                                partitioner));
-                    }
-                }
-            }
-        }
-    }
-
-    private void assertTokensAndNodeCount(int numTokens, int nodeCount, List<OfflineTokenAllocator.FakeNode> nodes)
-    {
-        assertEquals(nodeCount, nodes.size());
-        Collection<Token> allTokens = Lists.newArrayList();
-        for (OfflineTokenAllocator.FakeNode node : nodes)
-        {
-            Assertions.assertThat(node.tokens()).hasSize(numTokens);
-            Assertions.assertThat(allTokens).doesNotContainAnyElementsOf(node.tokens());
-            allTokens.addAll(node.tokens());
-        }
-    }
-
-    private static int[] makeRackCountArray(int nodes, int racks)
-    {
-        assert nodes > 0;
-        assert racks > 0;
-        // Distribute nodes among the racks in round-robin fashion in the order the user is supposed to start them.
-        int[] rackCounts = new int[racks];
-        int rack = 0;
-        for (int node = 0; node < nodes; node++)
-        {
-            rackCounts[rack]++;
-            if (++rack == racks)
-                rack = 0;
-        }
-        return rackCounts;
-    }
-
     @Test(expected = IllegalArgumentException.class)
     public void testTokenGenerator_more_rf_than_racks()
     {
@@ -180,43 +108,4 @@
                                                         FAIL_ON_WARN_OUTPUT,
                                                         Murmur3Partitioner.instance));
     }
-
-    private static class SystemOutputImpl extends OutputHandler.SystemOutput
-    {
-        private final int rf;
-        private final int racks;
-
-        private SystemOutputImpl()
-        {
-            super(true, true);
-            rf = racks = 1;
-        }
-
-        private SystemOutputImpl(int rf, int racks)
-        {
-            super(true, true);
-            this.rf = rf;
-            this.racks = racks;
-        }
-
-        @Override
-        public void warn(String msg)
-        {
-            // We can only guarantee that ownership stdev won't increase above the warn threshold for racks==1 or racks==rf
-            if (racks == 1 || racks == rf)
-                fail(msg);
-            else
-                super.warn(msg);
-        }
-
-        @Override
-        public void warn(String msg, Throwable th)
-        {
-            // We can only guarantee that ownership stdev won't increase above the warn threshold for racks==1 or racks==rf
-            if (racks == 1 || racks == rf)
-                fail(msg);
-            else
-                super.warn(msg, th);
-        }
-    }
 }
diff --git a/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorTestUtils.java b/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorTestUtils.java
new file mode 100644
index 0000000..e580461
--- /dev/null
+++ b/test/unit/org/apache/cassandra/dht/tokenallocator/OfflineTokenAllocatorTestUtils.java
@@ -0,0 +1,103 @@
+/*
+ * 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.dht.tokenallocator;
+
+import java.util.Collection;
+import java.util.List;
+
+import com.google.common.collect.Lists;
+
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.utils.OutputHandler;
+import org.assertj.core.api.Assertions;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class OfflineTokenAllocatorTestUtils
+{
+    static final OutputHandler FAIL_ON_WARN_OUTPUT = new SystemOutputImpl();
+
+    static void assertTokensAndNodeCount(int numTokens, int nodeCount, List<OfflineTokenAllocator.FakeNode> nodes)
+    {
+        assertEquals(nodeCount, nodes.size());
+        Collection<Token> allTokens = Lists.newArrayList();
+        for (OfflineTokenAllocator.FakeNode node : nodes)
+        {
+            Assertions.assertThat(node.tokens()).hasSize(numTokens);
+            Assertions.assertThat(allTokens).doesNotContainAnyElementsOf(node.tokens());
+            allTokens.addAll(node.tokens());
+        }
+    }
+
+    static int[] makeRackCountArray(int nodes, int racks)
+    {
+        assert nodes > 0;
+        assert racks > 0;
+        // Distribute nodes among the racks in round-robin fashion in the order the user is supposed to start them.
+        int[] rackCounts = new int[racks];
+        int rack = 0;
+        for (int node = 0; node < nodes; node++)
+        {
+            rackCounts[rack]++;
+            if (++rack == racks)
+                rack = 0;
+        }
+        return rackCounts;
+    }
+
+    static class SystemOutputImpl extends OutputHandler.SystemOutput
+    {
+        final int rf;
+        final int racks;
+
+        SystemOutputImpl()
+        {
+            super(true, true);
+            rf = racks = 1;
+        }
+
+        SystemOutputImpl(int rf, int racks)
+        {
+            super(true, true);
+            this.rf = rf;
+            this.racks = racks;
+        }
+
+        @Override
+        public void warn(String msg)
+        {
+            // We can only guarantee that ownership stdev won't increase above the warn threshold for racks==1 or racks==rf
+            if (racks == 1 || racks == rf)
+                fail(msg);
+            else
+                super.warn(msg);
+        }
+
+        @Override
+        public void warn(String msg, Throwable th)
+        {
+            // We can only guarantee that ownership stdev won't increase above the warn threshold for racks==1 or racks==rf
+            if (racks == 1 || racks == rf)
+                fail(msg);
+            else
+                super.warn(msg, th);
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/fql/FullQueryLoggerTest.java b/test/unit/org/apache/cassandra/fql/FullQueryLoggerTest.java
index 712f049..799484f 100644
--- a/test/unit/org/apache/cassandra/fql/FullQueryLoggerTest.java
+++ b/test/unit/org/apache/cassandra/fql/FullQueryLoggerTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.fql;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.nio.file.Path;
 import java.util.ArrayList;
@@ -30,6 +29,7 @@
 
 import javax.annotation.Nullable;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.After;
 import org.junit.BeforeClass;
@@ -136,42 +136,42 @@
     @Test(expected = IllegalArgumentException.class)
     public void testCanRead() throws Exception
     {
-        tempDir.toFile().setReadable(false);
+        new File(tempDir).trySetReadable(false);
         try
         {
             configureFQL();
         }
         finally
         {
-            tempDir.toFile().setReadable(true);
+            new File(tempDir).trySetReadable(true);
         }
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testCanWrite() throws Exception
     {
-        tempDir.toFile().setWritable(false);
+        new File(tempDir).trySetWritable(false);
         try
         {
             configureFQL();
         }
         finally
         {
-            tempDir.toFile().setWritable(true);
+            new File(tempDir).trySetWritable(true);
         }
     }
 
     @Test(expected = IllegalArgumentException.class)
     public void testCanExecute() throws Exception
     {
-        tempDir.toFile().setExecutable(false);
+        new File(tempDir).trySetExecutable(false);
         try
         {
             configureFQL();
         }
         finally
         {
-            tempDir.toFile().setExecutable(true);
+            new File(tempDir).trySetExecutable(true);
         }
     }
 
@@ -196,10 +196,10 @@
     public void testResetCleansPaths() throws Exception
     {
         configureFQL();
-        File tempA = File.createTempFile("foo", "bar", tempDir.toFile());
+        File tempA = FileUtils.createTempFile("foo", "bar", new File(tempDir));
         assertTrue(tempA.exists());
-        File tempB = File.createTempFile("foo", "bar", BinLogTest.tempDir().toFile());
-        FullQueryLogger.instance.reset(tempB.getParent());
+        File tempB = FileUtils.createTempFile("foo", "bar", new File(BinLogTest.tempDir()));
+        FullQueryLogger.instance.reset(tempB.parentPath());
         assertFalse(tempA.exists());
         assertFalse(tempB.exists());
     }
@@ -211,9 +211,9 @@
     public void testResetSamePath() throws Exception
     {
         configureFQL();
-        File tempA = File.createTempFile("foo", "bar", tempDir.toFile());
+        File tempA = FileUtils.createTempFile("foo", "bar", new File(tempDir));
         assertTrue(tempA.exists());
-        FullQueryLogger.instance.reset(tempA.getParent());
+        FullQueryLogger.instance.reset(tempA.parentPath());
         assertFalse(tempA.exists());
     }
 
@@ -227,10 +227,10 @@
     @Test
     public void testCleansDirectory() throws Exception
     {
-        assertTrue(new File(tempDir.toFile(), "foobar").createNewFile());
+        assertTrue(new File(tempDir, "foobar").createFileIfNotExists());
         configureFQL();
-        assertEquals(tempDir.toFile().listFiles().length, 1);
-        assertEquals("metadata.cq4t", tempDir.toFile().listFiles()[0].getName());
+        assertEquals(new File(tempDir).tryList().length, 1);
+        assertEquals("metadata.cq4t", new File(tempDir).tryList()[0].name());
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java b/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java
index ea59300..3a07ea3 100644
--- a/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java
+++ b/test/unit/org/apache/cassandra/gms/ArrivalWindowTest.java
@@ -23,13 +23,21 @@
 
 import static org.junit.Assert.*;
 
+import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.utils.FBUtilities;
 
 public class ArrivalWindowTest
 {
+    @BeforeClass
+    public static void beforeClass()
+    {
+        DatabaseDescriptor.setDefaultFailureDetector();
+    }
+
     @Test
     public void testWithNanoTime()
     {
diff --git a/test/unit/org/apache/cassandra/gms/EndpointStateTest.java b/test/unit/org/apache/cassandra/gms/EndpointStateTest.java
index 103653e..aa57d80 100644
--- a/test/unit/org/apache/cassandra/gms/EndpointStateTest.java
+++ b/test/unit/org/apache/cassandra/gms/EndpointStateTest.java
@@ -33,7 +33,6 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.dht.Token;
-import org.apache.cassandra.locator.InetAddressAndPort;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
diff --git a/test/unit/org/apache/cassandra/gms/GossiperTest.java b/test/unit/org/apache/cassandra/gms/GossiperTest.java
index a48b5fb..68841ea 100644
--- a/test/unit/org/apache/cassandra/gms/GossiperTest.java
+++ b/test/unit/org/apache/cassandra/gms/GossiperTest.java
@@ -47,6 +47,7 @@
 import org.apache.cassandra.locator.TokenMetadata;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.CassandraVersion;
+import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -63,6 +64,8 @@
         CommitLog.instance.start();
     }
 
+    private static final CassandraVersion CURRENT_VERSION = new CassandraVersion(FBUtilities.getReleaseVersionString());
+
     static final IPartitioner partitioner = new RandomPartitioner();
     StorageService ss = StorageService.instance;
     TokenMetadata tmd = StorageService.instance.getTokenMetadata();
@@ -116,7 +119,7 @@
 
         VersionedValue.VersionedValueFactory factory = new VersionedValue.VersionedValueFactory(null);
         EndpointState es = new EndpointState((HeartBeatState) null);
-        es.addApplicationState(ApplicationState.RELEASE_VERSION, factory.releaseVersion(SystemKeyspace.CURRENT_VERSION.toString()));
+        es.addApplicationState(ApplicationState.RELEASE_VERSION, factory.releaseVersion(CURRENT_VERSION.toString()));
         Gossiper.instance.endpointStateMap.put(InetAddressAndPort.getByName("127.0.0.1"), es);
         Gossiper.instance.liveEndpoints.add(InetAddressAndPort.getByName("127.0.0.1"));
 
@@ -271,12 +274,12 @@
         {
             gossiper.seeds.add(addr);
             nextSeeds.add(addr);
-            addr = InetAddressAndPort.getByAddress(InetAddresses.increment(addr.address));
+            addr = InetAddressAndPort.getByAddress(InetAddresses.increment(addr.getAddress()));
         }
         Assert.assertEquals(nextSize, gossiper.seeds.size());
 
         // Add another unique address to the list
-        addr = InetAddressAndPort.getByAddress(InetAddresses.increment(addr.address));
+        addr = InetAddressAndPort.getByAddress(InetAddresses.increment(addr.getAddress()));
         nextSeeds.add(addr);
         nextSize++;
         DatabaseDescriptor.setSeedProvider(new TestSeedProvider(nextSeeds));
@@ -315,7 +318,7 @@
         for (int i = 0; i < disjointSize; i ++)
         {
             disjointSeeds.add(addr);
-            addr = InetAddressAndPort.getByAddress(InetAddresses.increment(addr.address));
+            addr = InetAddressAndPort.getByAddress(InetAddresses.increment(addr.getAddress()));
         }
         DatabaseDescriptor.setSeedProvider(new TestSeedProvider(disjointSeeds));
         loadedList = gossiper.reloadSeeds();
diff --git a/test/unit/org/apache/cassandra/gms/SerializationsTest.java b/test/unit/org/apache/cassandra/gms/SerializationsTest.java
index 90ce10b..0422ac0 100644
--- a/test/unit/org/apache/cassandra/gms/SerializationsTest.java
+++ b/test/unit/org/apache/cassandra/gms/SerializationsTest.java
@@ -22,8 +22,8 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Token;
-import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus;
 import org.apache.cassandra.io.util.DataOutputStreamPlus;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
@@ -68,7 +68,7 @@
         if (EXECUTE_WRITES)
             testEndpointStateWrite();
 
-        DataInputStreamPlus in = getInput("gms.EndpointState.bin");
+        FileInputStreamPlus in = getInput("gms.EndpointState.bin");
         assert HeartBeatState.serializer.deserialize(in, getVersion()) != null;
         assert EndpointState.serializer.deserialize(in, getVersion()) != null;
         assert VersionedValue.serializer.deserialize(in, getVersion()) != null;
@@ -110,7 +110,7 @@
             testGossipDigestWrite();
 
         int count = 0;
-        DataInputStreamPlus in = getInput("gms.Gossip.bin");
+        FileInputStreamPlus in = getInput("gms.Gossip.bin");
         while (count < Statics.Digests.size())
             assert GossipDigestAck2.serializer.deserialize(in, getVersion()) != null;
         assert GossipDigestAck.serializer.deserialize(in, getVersion()) != null;
diff --git a/test/unit/org/apache/cassandra/hints/AlteredHints.java b/test/unit/org/apache/cassandra/hints/AlteredHints.java
index 9b8e32f..4bb6178 100644
--- a/test/unit/org/apache/cassandra/hints/AlteredHints.java
+++ b/test/unit/org/apache/cassandra/hints/AlteredHints.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -28,6 +27,7 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.Files;
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 
@@ -37,7 +37,6 @@
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.RowUpdateBuilder;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.utils.UUIDGen;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
 
@@ -81,11 +80,11 @@
         int bufferSize = HintsWriteExecutor.WRITE_BUFFER_SIZE;
         List<Hint> hints = new LinkedList<>();
 
-        UUID hostId = UUIDGen.getTimeUUID();
+        UUID hostId = UUID.randomUUID();
         long ts = System.currentTimeMillis();
 
         HintsDescriptor descriptor = new HintsDescriptor(hostId, ts, params());
-        File dir = Files.createTempDir();
+        File dir = new File(Files.createTempDir());
         try (HintsWriter writer = HintsWriter.create(dir, descriptor))
         {
             Assert.assertTrue(looksLegit(writer));
@@ -103,7 +102,7 @@
             }
         }
 
-        try (HintsReader reader = HintsReader.open(new File(dir, descriptor.fileName())))
+        try (HintsReader reader = HintsReader.open(descriptor.file(dir)))
         {
             Assert.assertTrue(looksLegit(reader.getInput()));
             List<Hint> deserialized = new ArrayList<>(hintNum);
diff --git a/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java b/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java
index 9f4cdfb..cc29163 100644
--- a/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java
+++ b/test/unit/org/apache/cassandra/hints/ChecksummedDataInputTest.java
@@ -17,13 +17,12 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
-import java.util.Arrays;
 import java.util.zip.CRC32;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -35,9 +34,10 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 
 public class ChecksummedDataInputTest
 {
@@ -104,12 +104,12 @@
             assertEquals(127, reader.read());
             byte[] bytes = new byte[b.length];
             reader.readFully(bytes);
-            assertTrue(Arrays.equals(bytes, b));
-            assertEquals(false, reader.readBoolean());
+            assertArrayEquals(bytes, b);
+            assertFalse(reader.readBoolean());
             assertEquals(10, reader.readByte());
             assertEquals('t', reader.readChar());
-            assertEquals(3.3, reader.readDouble());
-            assertEquals(2.2f, reader.readFloat());
+            assertEquals(3.3, reader.readDouble(), 0.0);
+            assertEquals(2.2f, reader.readFloat(), 0.0);
             assertEquals(42, reader.readInt());
             assertEquals(Long.MAX_VALUE, reader.readLong());
             assertEquals(Short.MIN_VALUE, reader.readShort());
@@ -176,14 +176,14 @@
 
             // assert that we read all the right values back
             assertEquals(127, reader.read());
-            assertEquals(false, reader.readBoolean());
+            assertFalse(reader.readBoolean());
             assertEquals(10, reader.readByte());
             assertEquals('t', reader.readChar());
             assertTrue(reader.checkCrc());
 
             reader.resetCrc();
-            assertEquals(3.3, reader.readDouble());
-            assertEquals(2.2f, reader.readFloat());
+            assertEquals(3.3, reader.readDouble(), 0.0);
+            assertEquals(2.2f, reader.readFloat(), 0.0);
             assertEquals(42, reader.readInt());
             assertTrue(reader.checkCrc());
             assertTrue(reader.isEOF());
@@ -232,7 +232,7 @@
 
             // assert that we read all the right values back
             assertEquals(127, reader.read());
-            assertEquals(false, reader.readBoolean());
+            assertFalse(reader.readBoolean());
             assertEquals(10, reader.readByte());
             assertEquals('t', reader.readChar());
             assertFalse(reader.checkCrc());
diff --git a/test/unit/org/apache/cassandra/hints/DTestSerializer.java b/test/unit/org/apache/cassandra/hints/DTestSerializer.java
index 1e308dc..61bd77c 100644
--- a/test/unit/org/apache/cassandra/hints/DTestSerializer.java
+++ b/test/unit/org/apache/cassandra/hints/DTestSerializer.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.util.UUID;
 
-import com.google.common.annotations.VisibleForTesting;
 import com.google.common.primitives.Ints;
 
 import org.apache.cassandra.db.TypeSizes;
diff --git a/test/unit/org/apache/cassandra/hints/HintServiceBytemanTest.java b/test/unit/org/apache/cassandra/hints/HintServiceBytemanTest.java
new file mode 100644
index 0000000..b7f431d
--- /dev/null
+++ b/test/unit/org/apache/cassandra/hints/HintServiceBytemanTest.java
@@ -0,0 +1,117 @@
+/*
+ * 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.hints;
+
+import java.time.Duration;
+import java.util.Collections;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+
+import org.junit.After;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.MockMessagingService;
+import org.apache.cassandra.net.MockMessagingSpy;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
+import org.awaitility.Awaitility;
+import org.jboss.byteman.contrib.bmunit.BMRule;
+import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
+
+import static org.apache.cassandra.hints.HintsTestUtil.MockFailureDetector;
+import static org.apache.cassandra.hints.HintsTestUtil.sendHintsAndResponses;
+import static org.junit.Assert.assertEquals;
+
+@RunWith(BMUnitRunner.class)
+public class HintServiceBytemanTest
+{
+    private static final String KEYSPACE = "hints_service_test";
+    private static final String TABLE = "table";
+
+    private final MockFailureDetector failureDetector = new HintsTestUtil.MockFailureDetector();
+    private static TableMetadata metadata;
+
+    @BeforeClass
+    public static void defineSchema()
+    {
+        SchemaLoader.prepareServer();
+        StorageService.instance.initServer();
+        SchemaLoader.createKeyspace(KEYSPACE,
+                                    KeyspaceParams.simple(1),
+                                    SchemaLoader.standardCFMD(KEYSPACE, TABLE));
+        metadata = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+    }
+
+    @After
+    public void cleanup()
+    {
+        MockMessagingService.cleanup();
+    }
+
+    @Before
+    public void reinstanciateService() throws Throwable
+    {
+        MessagingService.instance().inboundSink.clear();
+        MessagingService.instance().outboundSink.clear();
+
+        if (!HintsService.instance.isShutDown())
+        {
+            HintsService.instance.shutdownBlocking();
+            HintsService.instance.deleteAllHints();
+        }
+
+        failureDetector.isAlive = true;
+
+        HintsService.instance = new HintsService(failureDetector);
+
+        HintsService.instance.startDispatch();
+    }
+
+    @Test
+    @BMRule(name = "Delay delivering hints",
+    targetClass = "DispatchHintsTask",
+    targetMethod = "run",
+    action = "Thread.sleep(DatabaseDescriptor.getHintsFlushPeriodInMS() * 3L)")
+    public void testListPendingHints() throws InterruptedException, ExecutionException
+    {
+        HintsService.instance.resumeDispatch();
+        MockMessagingSpy spy = sendHintsAndResponses(metadata, 20000, -1);
+        Awaitility.await("For the hints file to flush")
+                  .atMost(Duration.ofMillis(DatabaseDescriptor.getHintsFlushPeriodInMS() * 2L))
+                  .until(() -> !HintsService.instance.getPendingHints().isEmpty());
+
+        List<PendingHintsInfo> pendingHints = HintsService.instance.getPendingHintsInfo();
+        assertEquals(1, pendingHints.size());
+        PendingHintsInfo info = pendingHints.get(0);
+        assertEquals(StorageService.instance.getLocalHostUUID(), info.hostId);
+        assertEquals(1, info.totalFiles);
+        assertEquals(info.oldestTimestamp, info.newestTimestamp); // there is 1 descriptor with only 1 timestamp
+
+        spy.interceptMessageOut(20000).get();
+        assertEquals(Collections.emptyList(), HintsService.instance.getPendingHints());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/hints/HintTest.java b/test/unit/org/apache/cassandra/hints/HintTest.java
index e3e26d0..c762973 100644
--- a/test/unit/org/apache/cassandra/hints/HintTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintTest.java
@@ -18,8 +18,8 @@
 package org.apache.cassandra.hints;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.UUID;
+import java.util.concurrent.TimeUnit;
 
 import com.google.common.collect.ImmutableList;
 
@@ -46,13 +46,14 @@
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.service.StorageProxy;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static junit.framework.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 import static org.apache.cassandra.Util.dk;
 import static org.apache.cassandra.hints.HintsTestUtil.assertHintsEqual;
@@ -87,7 +88,7 @@
         tokenMeta.updateNormalTokens(BootStrapper.getRandomTokens(tokenMeta, 1), local);
 
         for (TableMetadata table : Schema.instance.getTablesAndViews(KEYSPACE))
-            MigrationManager.announceTableUpdate(table.unbuild().gcGraceSeconds(864000).build(), true);
+            SchemaTestUtil.announceTableUpdate(table.unbuild().gcGraceSeconds(864000).build());
     }
 
     @Test
@@ -177,7 +178,7 @@
                   .unbuild()
                   .gcGraceSeconds(0)
                   .build();
-        MigrationManager.announceTableUpdate(updated, true);
+        SchemaTestUtil.announceTableUpdate(updated);
 
         Mutation mutation = createMutation(key, now);
         Hint.create(mutation, now / 1000).apply();
@@ -206,7 +207,7 @@
                   .unbuild()
                   .gcGraceSeconds(0)
                   .build();
-        MigrationManager.announceTableUpdate(updated, true);
+        SchemaTestUtil.announceTableUpdate(updated);
 
         Mutation mutation = createMutation(key, now);
         Hint hint = Hint.create(mutation, now / 1000);
@@ -306,6 +307,26 @@
         }
     }
 
+    @Test
+    public void testCalculateHintExpiration()
+    {
+        // create a hint with gcgs
+        long now = FBUtilities.timestampMicros();
+        long nowInMillis = TimeUnit.MICROSECONDS.toMillis(now);
+        int gcgs = 10; // It is less than the default mutation gcgs
+        String key = "testExpiration";
+        Mutation mutation = createMutation(key, now);
+        // create a hint with explicit small gcgs
+        Hint hint = Hint.create(mutation, nowInMillis, gcgs);
+        assertEquals(nowInMillis + TimeUnit.SECONDS.toMillis(gcgs),
+                     hint.expirationInMillis());
+
+        // create a hint with mutation's gcgs.
+        hint = Hint.create(mutation, nowInMillis);
+        assertEquals(nowInMillis + TimeUnit.SECONDS.toMillis(mutation.smallestGCGS()),
+                     hint.expirationInMillis());
+    }
+
     private static Mutation createMutation(String key, long now)
     {
         Mutation.SimpleBuilder builder = Mutation.simpleBuilder(KEYSPACE, dk(key));
diff --git a/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java b/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java
index 21dbd7e..e24ff76 100644
--- a/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintWriteTTLTest.java
@@ -18,15 +18,16 @@
 
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -42,7 +43,6 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
 
 public class HintWriteTTLTest
 {
@@ -94,8 +94,8 @@
         ttldHint = makeHint(tbm, 2, nowInSeconds - (TTL + 1), GC_GRACE);
 
 
-        File directory = Files.createTempDirectory(null).toFile();
-        HintsDescriptor descriptor = new HintsDescriptor(UUIDGen.getTimeUUID(), s2m(nowInSeconds));
+        File directory = new File(Files.createTempDirectory(null));
+        HintsDescriptor descriptor = new HintsDescriptor(UUID.randomUUID(), s2m(nowInSeconds));
 
         try (HintsWriter writer = HintsWriter.create(directory, descriptor);
              HintsWriter.Session session = writer.newSession(ByteBuffer.allocate(1024)))
diff --git a/test/unit/org/apache/cassandra/hints/HintsBufferPoolTest.java b/test/unit/org/apache/cassandra/hints/HintsBufferPoolTest.java
index 1374d80..d658c88 100644
--- a/test/unit/org/apache/cassandra/hints/HintsBufferPoolTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintsBufferPoolTest.java
@@ -26,12 +26,12 @@
 
 import com.google.common.collect.ImmutableList;
 
-import static junit.framework.Assert.*;
-
 import java.util.Queue;
 import java.util.UUID;
 import java.util.concurrent.ConcurrentLinkedQueue;
 
+import static org.junit.Assert.assertTrue;
+
 @RunWith(BMUnitRunner.class)
 public class HintsBufferPoolTest
 {
diff --git a/test/unit/org/apache/cassandra/hints/HintsBufferTest.java b/test/unit/org/apache/cassandra/hints/HintsBufferTest.java
index 0dcf747..42daebf 100644
--- a/test/unit/org/apache/cassandra/hints/HintsBufferTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintsBufferTest.java
@@ -26,6 +26,7 @@
 import com.google.common.collect.Iterables;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.concurrent.NamedThreadFactory;
@@ -40,12 +41,20 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.utils.Clock;
+import org.jboss.byteman.contrib.bmunit.BMRule;
+import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
 
-import static junit.framework.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
 import static org.apache.cassandra.utils.FBUtilities.updateChecksum;
 
+@RunWith(BMUnitRunner.class)
 public class HintsBufferTest
 {
     private static final String KEYSPACE = "hints_buffer_test";
@@ -116,7 +125,7 @@
         // create HINT_THREADS_COUNT, start them, and wait for them to finish
         List<Thread> threads = new ArrayList<>(HINT_THREADS_COUNT);
         for (int i = 0; i < HINT_THREADS_COUNT; i ++)
-            threads.add(NamedThreadFactory.createThread(new Writer(buffer, load, hintSize, i, baseTimestamp)));
+            threads.add(NamedThreadFactory.createAnonymousThread(new Writer(buffer, load, hintSize, i, baseTimestamp)));
         threads.forEach(java.lang.Thread::start);
         for (Thread thread : threads)
             thread.join();
@@ -157,6 +166,48 @@
         buffer.free();
     }
 
+    static volatile long timestampForHint = 0;
+    // BM rule to get the timestamp that was used to store the hint so that we avoid any flakiness in timestamps between
+    // when we send the hint and when it actually got written.
+    @Test
+    @BMRule(name = "GetHintTS",
+            targetClass="HintsBuffer$Allocation",
+            targetMethod="write(Iterable, Hint)",
+            targetLocation="AFTER INVOKE putIfAbsent",
+            action="org.apache.cassandra.hints.HintsBufferTest.timestampForHint = $ts")
+    public void testEarliestHintTime()
+    {
+        int hintSize = (int) Hint.serializer.serializedSize(createHint(0, Clock.Global.currentTimeMillis()), MessagingService.current_version);
+        int entrySize = hintSize + HintsBuffer.ENTRY_OVERHEAD_SIZE;
+        // allocate a slab to fit 10 hints
+        int slabSize = entrySize * 10;
+
+        // use a fixed timestamp base for all mutation timestamps
+        long baseTimestamp = Clock.Global.currentTimeMillis();
+
+        HintsBuffer buffer = HintsBuffer.create(slabSize);
+        UUID uuid = UUID.randomUUID();
+        // Track the first hints time
+        try (HintsBuffer.Allocation allocation = buffer.allocate(hintSize))
+        {
+            Hint hint = createHint(100, baseTimestamp);
+            allocation.write(Collections.singleton(uuid), hint);
+        }
+        long oldestHintTime = timestampForHint;
+
+        // Write some more hints to ensure we actually test getting the earliest
+        for (int i = 0; i < 9; i++)
+        {
+            try (HintsBuffer.Allocation allocation = buffer.allocate(hintSize))
+            {
+                Hint hint = createHint(i, baseTimestamp);
+                allocation.write(Collections.singleton(uuid), hint);
+            }
+        }
+        long earliest = buffer.getEarliestHintTime(uuid);
+        assertEquals(oldestHintTime, earliest);
+    }
+
     private static int validateEntry(UUID hostId, ByteBuffer buffer, long baseTimestamp, UUID[] load) throws IOException
     {
         CRC32 crc = new CRC32();
diff --git a/test/unit/org/apache/cassandra/hints/HintsCatalogTest.java b/test/unit/org/apache/cassandra/hints/HintsCatalogTest.java
index 92cfc71..af73d1b 100644
--- a/test/unit/org/apache/cassandra/hints/HintsCatalogTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintsCatalogTest.java
@@ -17,22 +17,29 @@
  */
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.nio.file.Files;
 import java.util.*;
 
 import com.google.common.collect.ImmutableMap;
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.utils.Clock;
 import org.apache.cassandra.utils.FBUtilities;
 import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
-import static junit.framework.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
 import static org.apache.cassandra.Util.dk;
 
 public class HintsCatalogTest
@@ -54,18 +61,14 @@
                 SchemaLoader.standardCFMD(KEYSPACE, TABLE2));
     }
 
+    @Rule
+    public TemporaryFolder testFolder = new TemporaryFolder();
+
     @Test
     public void loadCompletenessAndOrderTest() throws IOException
     {
-        File directory = Files.createTempDirectory(null).toFile();
-        try
-        {
-            loadCompletenessAndOrderTest(directory);
-        }
-        finally
-        {
-            directory.deleteOnExit();
-        }
+        File directory = new File(testFolder.newFolder());
+        loadCompletenessAndOrderTest(directory);
     }
 
     private void loadCompletenessAndOrderTest(File directory) throws IOException
@@ -73,10 +76,10 @@
         UUID hostId1 = UUID.randomUUID();
         UUID hostId2 = UUID.randomUUID();
 
-        long timestamp1 = System.currentTimeMillis();
-        long timestamp2 = System.currentTimeMillis() + 1;
-        long timestamp3 = System.currentTimeMillis() + 2;
-        long timestamp4 = System.currentTimeMillis() + 3;
+        long timestamp1 = Clock.Global.currentTimeMillis();
+        long timestamp2 = Clock.Global.currentTimeMillis() + 1;
+        long timestamp3 = Clock.Global.currentTimeMillis() + 2;
+        long timestamp4 = Clock.Global.currentTimeMillis() + 3;
 
         HintsDescriptor descriptor1 = new HintsDescriptor(hostId1, timestamp1);
         HintsDescriptor descriptor2 = new HintsDescriptor(hostId2, timestamp3);
@@ -107,10 +110,10 @@
     @Test
     public void deleteHintsTest() throws IOException
     {
-        File directory = Files.createTempDirectory(null).toFile();
+        File directory = new File(testFolder.newFolder());
         UUID hostId1 = UUID.randomUUID();
         UUID hostId2 = UUID.randomUUID();
-        long now = System.currentTimeMillis();
+        long now = Clock.Global.currentTimeMillis();
         writeDescriptor(directory, new HintsDescriptor(hostId1, now));
         writeDescriptor(directory, new HintsDescriptor(hostId1, now + 1));
         writeDescriptor(directory, new HintsDescriptor(hostId2, now + 2));
@@ -138,14 +141,27 @@
     @Test
     public void exciseHintFiles() throws IOException
     {
-        File directory = Files.createTempDirectory(null).toFile();
-        try
+        File directory = new File(testFolder.newFolder());
+        exciseHintFiles(directory);
+    }
+
+    @Test
+    public void hintsTotalSizeTest() throws IOException
+    {
+        File directory = new File(testFolder.newFolder());
+        UUID hostId = UUID.randomUUID();
+        long now = Clock.Global.currentTimeMillis();
+        long totalSize = 0;
+        HintsCatalog catalog = HintsCatalog.load(directory, ImmutableMap.of());
+        HintsStore store = catalog.get(hostId);
+        assertEquals(totalSize, store.getTotalFileSize());
+        for (int i = 0; i < 3; i++)
         {
-            exciseHintFiles(directory);
-        }
-        finally
-        {
-            directory.deleteOnExit();
+            HintsDescriptor descriptor = new HintsDescriptor(hostId, now + i);
+            writeDescriptor(directory, descriptor);
+            store.offerLast(descriptor);
+            assertTrue("Total file size should increase after writing more hints", store.getTotalFileSize() > totalSize);
+            totalSize = store.getTotalFileSize();
         }
     }
 
@@ -153,10 +169,10 @@
     {
         UUID hostId = UUID.randomUUID();
 
-        HintsDescriptor descriptor1 = new HintsDescriptor(hostId, System.currentTimeMillis());
-        HintsDescriptor descriptor2 = new HintsDescriptor(hostId, System.currentTimeMillis() + 1);
-        HintsDescriptor descriptor3 = new HintsDescriptor(hostId, System.currentTimeMillis() + 2);
-        HintsDescriptor descriptor4 = new HintsDescriptor(hostId, System.currentTimeMillis() + 3);
+        HintsDescriptor descriptor1 = new HintsDescriptor(hostId, Clock.Global.currentTimeMillis());
+        HintsDescriptor descriptor2 = new HintsDescriptor(hostId, Clock.Global.currentTimeMillis() + 1);
+        HintsDescriptor descriptor3 = new HintsDescriptor(hostId, Clock.Global.currentTimeMillis() + 2);
+        HintsDescriptor descriptor4 = new HintsDescriptor(hostId, Clock.Global.currentTimeMillis() + 3);
 
         createHintFile(directory, descriptor1);
         createHintFile(directory, descriptor2);
diff --git a/test/unit/org/apache/cassandra/hints/HintsDescriptorTest.java b/test/unit/org/apache/cassandra/hints/HintsDescriptorTest.java
index 2fad733..596727f 100644
--- a/test/unit/org/apache/cassandra/hints/HintsDescriptorTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintsDescriptorTest.java
@@ -18,7 +18,6 @@
 package org.apache.cassandra.hints;
 
 import java.io.DataInput;
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -27,15 +26,16 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.io.ByteStreams;
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import org.apache.cassandra.io.compress.LZ4Compressor;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.net.MessagingService;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotSame;
-import static junit.framework.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotSame;
+import static org.junit.Assert.fail;
 import static org.assertj.core.api.Assertions.assertThat;
 
 public class HintsDescriptorTest
@@ -104,18 +104,18 @@
         ImmutableMap<String, Object> parameters = ImmutableMap.of();
         HintsDescriptor expected = new HintsDescriptor(hostId, version, timestamp, parameters);
 
-        Path directory = Files.createTempDirectory("hints");
+        File directory = new File(Files.createTempDirectory("hints"));
         try
         {
-            try (HintsWriter ignored = HintsWriter.create(directory.toFile(), expected))
+            try (HintsWriter ignored = HintsWriter.create(directory, expected))
             {
             }
-            HintsDescriptor actual = HintsDescriptor.readFromFile(directory.resolve(expected.fileName()));
+            HintsDescriptor actual = HintsDescriptor.readFromFile(expected.file(directory));
             assertEquals(expected, actual);
         }
         finally
         {
-            directory.toFile().deleteOnExit();
+            directory.deleteOnExit();
         }
     }
 
@@ -146,7 +146,7 @@
         HintsDescriptor.handleDescriptorIOE(new IOException("test"), p);
         File newFile = new File(p.getParent().toFile(), p.getFileName().toString().replace(".hints", ".corrupt.hints"));
         assertThat(p).doesNotExist();
-        assertThat(newFile).exists();
+        assertThat(newFile.exists());
         newFile.deleteOnExit();
     }
 
diff --git a/test/unit/org/apache/cassandra/hints/HintsReaderTest.java b/test/unit/org/apache/cassandra/hints/HintsReaderTest.java
index f05d4ce..3e3c649 100644
--- a/test/unit/org/apache/cassandra/hints/HintsReaderTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintsReaderTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.hints;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
@@ -29,6 +28,7 @@
 import java.util.function.Function;
 
 import com.google.common.collect.Iterables;
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -43,12 +43,12 @@
 import org.apache.cassandra.io.util.DataInputBuffer;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertNotNull;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.apache.cassandra.Util.dk;
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
 
@@ -108,7 +108,7 @@
     {
         long baseTimestamp = descriptor.timestamp;
         int index = 0;
-        try (HintsReader reader = HintsReader.open(new File(directory, descriptor.fileName())))
+        try (HintsReader reader = HintsReader.open(descriptor.file(directory)))
         {
             for (HintsReader.Page page : reader)
             {
@@ -196,7 +196,7 @@
                                     SchemaLoader.standardCFMD(ks, CF_STANDARD1),
                                     SchemaLoader.standardCFMD(ks, CF_STANDARD2));
         int numTable = 2;
-        directory = Files.createTempDirectory(null).toFile();
+        directory = new File(Files.createTempDirectory(null));
         try
         {
             generateHints(3, ks);
@@ -206,7 +206,7 @@
         }
         finally
         {
-            directory.delete();
+            directory.deleteRecursive();
         }
     }
 
@@ -219,7 +219,7 @@
                                     SchemaLoader.standardCFMD(ks, CF_STANDARD1),
                                     SchemaLoader.standardCFMD(ks, CF_STANDARD2));
         int numTable = 2;
-        directory = Files.createTempDirectory(null).toFile();
+        directory = new File(Files.createTempDirectory(null));
         try
         {
             generateHints(3, ks);
@@ -227,7 +227,7 @@
         }
         finally
         {
-            directory.delete();
+            directory.tryDelete();
         }
     }
 
@@ -240,16 +240,16 @@
                                     SchemaLoader.standardCFMD(ks, CF_STANDARD1),
                                     SchemaLoader.standardCFMD(ks, CF_STANDARD2));
 
-        directory = Files.createTempDirectory(null).toFile();
+        directory = new File(Files.createTempDirectory(null));
         try
         {
             generateHints(3, ks);
-            MigrationManager.announceTableDrop(ks, CF_STANDARD1, true);
+            SchemaTestUtil.announceTableDrop(ks, CF_STANDARD1);
             readHints(3, 1);
         }
         finally
         {
-            directory.delete();
+            directory.tryDelete();
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/hints/HintsServiceTest.java b/test/unit/org/apache/cassandra/hints/HintsServiceTest.java
index dddf336..10a7040 100644
--- a/test/unit/org/apache/cassandra/hints/HintsServiceTest.java
+++ b/test/unit/org/apache/cassandra/hints/HintsServiceTest.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.hints;
 
+import java.util.Collections;
 import java.util.UUID;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -30,38 +31,38 @@
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
+import org.junit.runner.RunWith;
 
 import com.datastax.driver.core.utils.MoreFutures;
 import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.NoPayload;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
-import org.apache.cassandra.gms.IFailureDetectionEventListener;
-import org.apache.cassandra.gms.IFailureDetector;
 import org.apache.cassandra.metrics.StorageMetrics;
-import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
 import org.apache.cassandra.net.MockMessagingService;
 import org.apache.cassandra.net.MockMessagingSpy;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.TableMetadata;
 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.Util.dk;
-import static org.apache.cassandra.net.Verb.HINT_REQ;
-import static org.apache.cassandra.net.Verb.HINT_RSP;
-import static org.apache.cassandra.net.MockMessagingService.verb;
+import static org.apache.cassandra.hints.HintsTestUtil.MockFailureDetector;
+import static org.apache.cassandra.hints.HintsTestUtil.sendHintsAndResponses;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
+@RunWith(BMUnitRunner.class)
 public class HintsServiceTest
 {
     private static final String KEYSPACE = "hints_service_test";
     private static final String TABLE = "table";
 
     private final MockFailureDetector failureDetector = new MockFailureDetector();
+    private static TableMetadata metadata;
 
     @BeforeClass
     public static void defineSchema()
@@ -71,6 +72,7 @@
         SchemaLoader.createKeyspace(KEYSPACE,
                 KeyspaceParams.simple(1),
                 SchemaLoader.standardCFMD(KEYSPACE, TABLE));
+        metadata = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
     }
 
     @After
@@ -104,7 +106,7 @@
         long cnt = StorageMetrics.totalHints.getCount();
 
         // create spy for hint messages
-        MockMessagingSpy spy = sendHintsAndResponses(100, -1);
+        MockMessagingSpy spy = sendHintsAndResponses(metadata, 100, -1);
 
         // metrics should have been updated with number of create hints
         assertEquals(cnt + 100, StorageMetrics.totalHints.getCount());
@@ -120,7 +122,7 @@
         HintsService.instance.pauseDispatch();
 
         // create spy for hint messages
-        MockMessagingSpy spy = sendHintsAndResponses(100, -1);
+        MockMessagingSpy spy = sendHintsAndResponses(metadata, 100, -1);
 
         // we should not send any hints while paused
         ListenableFuture<Boolean> noMessagesWhilePaused = spy.interceptNoMsg(15, TimeUnit.SECONDS);
@@ -143,7 +145,7 @@
     public void testPageRetry() throws InterruptedException, ExecutionException, TimeoutException
     {
         // create spy for hint messages, but only create responses for 5 hints
-        MockMessagingSpy spy = sendHintsAndResponses(20, 5);
+        MockMessagingSpy spy = sendHintsAndResponses(metadata, 20, 5);
 
         Futures.allAsList(
                 // the dispatcher will always send all hints within the current page
@@ -164,7 +166,7 @@
     public void testPageSeek() throws InterruptedException, ExecutionException
     {
         // create spy for hint messages, stop replying after 12k (should be on 3rd page)
-        MockMessagingSpy spy = sendHintsAndResponses(20000, 12000);
+        MockMessagingSpy spy = sendHintsAndResponses(metadata, 20000, 12000);
 
         // At this point the dispatcher will constantly retry the page we stopped acking,
         // thus we receive the same hints from the page multiple times and in total more than
@@ -182,73 +184,41 @@
         assertTrue(((ChecksummedDataInput.Position) dispatchOffset).sourcePosition > 0);
     }
 
-    private MockMessagingSpy sendHintsAndResponses(int noOfHints, int noOfResponses)
+    // BM rule to get the timestamp that was used to store the hint so that we avoid any flakiness in timestamps between
+    // when we send the hint and when it actually got written.
+    static volatile long timestampForHint = 0L;
+    @Test
+    @BMRule(name = "GetHintTS",
+    targetClass="HintsBuffer$Allocation",
+    targetMethod="write(Iterable, Hint)",
+    targetLocation="AFTER INVOKE putIfAbsent",
+    action="org.apache.cassandra.hints.HintsServiceTest.timestampForHint = $ts")
+    public void testEarliestHint() throws InterruptedException
     {
-        // create spy for hint messages, but only create responses for noOfResponses hints
-        Message<NoPayload> message = Message.internalResponse(HINT_RSP, NoPayload.noPayload);
-
-        MockMessagingSpy spy;
-        if (noOfResponses != -1)
-        {
-            spy = MockMessagingService.when(verb(HINT_REQ)).respondN(message, noOfResponses);
-        }
-        else
-        {
-            spy = MockMessagingService.when(verb(HINT_REQ)).respond(message);
-        }
-
         // create and write noOfHints using service
         UUID hostId = StorageService.instance.getLocalHostUUID();
-        for (int i = 0; i < noOfHints; i++)
-        {
-            long now = System.currentTimeMillis();
-            DecoratedKey dkey = dk(String.valueOf(i));
-            TableMetadata metadata = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
-            PartitionUpdate.SimpleBuilder builder = PartitionUpdate.simpleBuilder(metadata, dkey).timestamp(now);
-            builder.row("column0").add("val", "value0");
-            Hint hint = Hint.create(builder.buildAsMutation(), now);
-            HintsService.instance.write(hostId, hint);
-        }
-        return spy;
+        TableMetadata metadata = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+
+        long ts = System.currentTimeMillis();
+        DecoratedKey dkey = Util.dk(String.valueOf(1));
+        PartitionUpdate.SimpleBuilder builder = PartitionUpdate.simpleBuilder(metadata, dkey).timestamp(ts);
+        builder.row("column0").add("val", "value0");
+        Hint hint = Hint.create(builder.buildAsMutation(), ts);
+        HintsService.instance.write(hostId, hint);
+        long oldestHintTime = timestampForHint;
+        Thread.sleep(1);
+        HintsService.instance.write(hostId, hint);
+        Thread.sleep(1);
+        HintsService.instance.write(hostId, hint);
+
+        // Close and fsync so that we get the timestamp from the descriptor rather than the buffer.
+        HintsStore store = HintsService.instance.getCatalog().get(hostId);
+        HintsService.instance.flushAndFsyncBlockingly(Collections.singletonList(hostId));
+        store.closeWriter();
+
+        long earliest = HintsService.instance.getEarliestHintForHost(hostId);
+        assertEquals(oldestHintTime, earliest);
+        assertNotEquals(oldestHintTime, timestampForHint);
     }
 
-    private static class MockFailureDetector implements IFailureDetector
-    {
-        private boolean isAlive = true;
-
-        public boolean isAlive(InetAddressAndPort ep)
-        {
-            return isAlive;
-        }
-
-        public void interpret(InetAddressAndPort ep)
-        {
-            throw new UnsupportedOperationException();
-        }
-
-        public void report(InetAddressAndPort ep)
-        {
-            throw new UnsupportedOperationException();
-        }
-
-        public void registerFailureDetectionEventListener(IFailureDetectionEventListener listener)
-        {
-            throw new UnsupportedOperationException();
-        }
-
-        public void unregisterFailureDetectionEventListener(IFailureDetectionEventListener listener)
-        {
-            throw new UnsupportedOperationException();
-        }
-
-        public void remove(InetAddressAndPort ep)
-        {
-            throw new UnsupportedOperationException();
-        }
-
-        public void forceConviction(InetAddressAndPort ep)
-        {
-            throw new UnsupportedOperationException();
-        }
-    }
 }
diff --git a/test/unit/org/apache/cassandra/hints/HintsStoreTest.java b/test/unit/org/apache/cassandra/hints/HintsStoreTest.java
new file mode 100644
index 0000000..93e6a11
--- /dev/null
+++ b/test/unit/org/apache/cassandra/hints/HintsStoreTest.java
@@ -0,0 +1,188 @@
+/*
+ * 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.hints;
+
+import java.io.Closeable;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.nio.file.Files;
+import java.util.UUID;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+
+import com.google.common.collect.ImmutableMap;
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.db.RowUpdateBuilder;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.schema.KeyspaceParams;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
+
+public class HintsStoreTest
+{
+    private static final String KEYSPACE = "hints_store_test";
+    private static final String TABLE = "table";
+    private File directory;
+    private UUID hostId;
+
+    @Before
+    public void testSetup() throws IOException
+    {
+        directory = new File(Files.createTempDirectory(null));
+        directory.deleteOnExit();
+        hostId = UUID.randomUUID();
+    }
+
+    @BeforeClass
+    public static void setup()
+    {
+        SchemaLoader.prepareServer();
+        SchemaLoader.createKeyspace(KEYSPACE, KeyspaceParams.simple(1), SchemaLoader.standardCFMD(KEYSPACE, TABLE));
+    }
+
+    @Test
+    public void testDeleteAllExpiredHints() throws IOException
+    {
+        final long now = System.currentTimeMillis();
+        // hints to delete
+        writeHints(directory, new HintsDescriptor(hostId, now), 100, now);
+        writeHints(directory, new HintsDescriptor(hostId, now + 1000), 1, now);
+        HintsStore store = HintsCatalog.load(directory, ImmutableMap.of()).get(hostId);
+        assertTrue("Hints store should have files", store.hasFiles());
+        assertEquals(2, store.getDispatchQueueSize());
+
+        // jump to the future and delete.
+        store.deleteExpiredHints(now + TimeUnit.SECONDS.toMillis(Hint.maxHintTTL) + 10);
+
+        assertFalse("All hints files should be deleted", store.hasFiles());
+    }
+
+    @Test
+    public void testDeleteAllExpiredHintsByHittingExpirationsCache() throws IOException
+    {
+        final long now = System.currentTimeMillis();
+        HintsDescriptor hintsDescriptor = new HintsDescriptor(hostId, now);
+        writeHints(directory, hintsDescriptor, 100, now);
+
+        HintsStore store = HintsCatalog.load(directory, ImmutableMap.of()).get(hostId);
+        assertTrue("Hints store should have files", store.hasFiles());
+        assertEquals("Hints store should not have cached expiration yet", 0, store.getHintsExpirationsMapSize());
+        assertEquals(1, store.getDispatchQueueSize());
+
+        store.deleteExpiredHints(now + 1); // Not expired yet. Wont delete.
+        assertEquals("Hint should not be deleted yet", 1, store.getDispatchQueueSize());
+        assertEquals("Found no cached hints expiration", 1, store.getHintsExpirationsMapSize());
+        // jump to the future and delete. It should not re-read all the file
+        store.deleteExpiredHints(now + TimeUnit.SECONDS.toMillis(Hint.maxHintTTL) + 10);
+        assertFalse("All hints files should be deleted", store.hasFiles());
+    }
+
+    /**
+     * Test multiple threads delete hints files.
+     * It could happen when hint service is running a removal process, meanwhile operator issues a NodeTool command to delete.
+     *
+     * Thread contends and delete part of the files in the store. The final effect should all files get deleted.
+     */
+    @Test
+    public void testConcurrentDeleteExpiredHints() throws Exception
+    {
+        final long now = System.currentTimeMillis();
+        for (int i = 100; i >= 0; i--)
+        {
+            writeHints(directory, new HintsDescriptor(hostId, now - i), 100, now);
+        }
+
+        HintsStore store = HintsCatalog.load(directory, ImmutableMap.of()).get(hostId);
+        int concurrency = 3;
+        CountDownLatch start = new CountDownLatch(1);
+        Runnable removal = () -> {
+            Uninterruptibles.awaitUninterruptibly(start);
+            store.deleteExpiredHints(now + TimeUnit.SECONDS.toMillis(Hint.maxHintTTL) + 10); // jump to the future and delete
+        };
+        ExecutorService es = Executors.newFixedThreadPool(concurrency);
+        try (Closeable ignored = es::shutdown)
+        {
+            for (int i = 0; i < concurrency; i++)
+                es.submit(removal);
+            start.countDown();
+        }
+        assertTrue(es.awaitTermination(2, TimeUnit.SECONDS));
+        assertFalse("All hints files should be deleted", store.hasFiles());
+    }
+
+    @Test
+    public void testPendingHintsInfo() throws Exception
+    {
+        HintsStore store = HintsCatalog.load(directory, ImmutableMap.of()).get(hostId);
+        assertNull(store.getPendingHintsInfo());
+
+        final long t1 = 10;
+        writeHints(directory, new HintsDescriptor(hostId, t1), 100, t1);
+        store = HintsCatalog.load(directory, ImmutableMap.of()).get(hostId);
+        assertEquals(new PendingHintsInfo(store.hostId, 1, t1, t1),
+                     store.getPendingHintsInfo());
+        final long t2 = t1 + 1;
+        writeHints(directory, new HintsDescriptor(hostId, t2), 100, t2);
+        store = HintsCatalog.load(directory, ImmutableMap.of()).get(hostId);
+        assertEquals(new PendingHintsInfo(store.hostId, 2, t1, t2),
+                     store.getPendingHintsInfo());
+    }
+
+    private long writeHints(File directory, HintsDescriptor descriptor, int hintsCount, long hintCreationTime) throws IOException
+    {
+        try (HintsWriter writer = HintsWriter.create(directory, descriptor))
+        {
+            ByteBuffer buffer = ByteBuffer.allocateDirect(256 * 1024);
+            try (HintsWriter.Session session = writer.newSession(buffer))
+            {
+                for (int i = 0; i < hintsCount; i++)
+                    session.append(createHint(i, hintCreationTime));
+            }
+            FileUtils.clean(buffer);
+        }
+        return new File(directory, descriptor.fileName()).lastModified(); // hint file last modified time
+    }
+
+    private Hint createHint(int idx, long creationTime)
+    {
+        TableMetadata table = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
+        Mutation mutation = new RowUpdateBuilder(table, creationTime, bytes(idx))
+                            .clustering(bytes(idx))
+                            .add("val", bytes(idx))
+                            .build();
+
+        return Hint.create(mutation, creationTime, 1);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/hints/HintsTestUtil.java b/test/unit/org/apache/cassandra/hints/HintsTestUtil.java
index c1c6192..727404e 100644
--- a/test/unit/org/apache/cassandra/hints/HintsTestUtil.java
+++ b/test/unit/org/apache/cassandra/hints/HintsTestUtil.java
@@ -17,13 +17,30 @@
  */
 package org.apache.cassandra.hints;
 
+import java.util.UUID;
+
 import com.google.common.collect.Iterators;
 
+import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.partitions.AbstractBTreePartition;
 import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.gms.IFailureDetectionEventListener;
+import org.apache.cassandra.gms.IFailureDetector;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MockMessagingService;
+import org.apache.cassandra.net.MockMessagingSpy;
+import org.apache.cassandra.net.NoPayload;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.Clock;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.apache.cassandra.Util.dk;
+import static org.apache.cassandra.net.MockMessagingService.verb;
+import static org.apache.cassandra.net.Verb.HINT_REQ;
+import static org.apache.cassandra.net.Verb.HINT_RSP;
 
 final class HintsTestUtil
 {
@@ -45,4 +62,73 @@
         assertEquals(expected.creationTime, actual.creationTime);
         assertEquals(expected.gcgs, actual.gcgs);
     }
+
+    static MockMessagingSpy sendHintsAndResponses(TableMetadata metadata, int noOfHints, int noOfResponses)
+    {
+        // create spy for hint messages, but only create responses for noOfResponses hints
+        Message<NoPayload> message = Message.internalResponse(HINT_RSP, NoPayload.noPayload);
+
+        MockMessagingSpy spy;
+        if (noOfResponses != -1)
+        {
+            spy = MockMessagingService.when(verb(HINT_REQ)).respondN(message, noOfResponses);
+        }
+        else
+        {
+            spy = MockMessagingService.when(verb(HINT_REQ)).respond(message);
+        }
+
+        // create and write noOfHints using service
+        UUID hostId = StorageService.instance.getLocalHostUUID();
+        for (int i = 0; i < noOfHints; i++)
+        {
+            long now = Clock.Global.currentTimeMillis();
+            DecoratedKey dkey = dk(String.valueOf(i));
+            PartitionUpdate.SimpleBuilder builder = PartitionUpdate.simpleBuilder(metadata, dkey).timestamp(now);
+            builder.row("column0").add("val", "value0");
+            Hint hint = Hint.create(builder.buildAsMutation(), now);
+            HintsService.instance.write(hostId, hint);
+        }
+        return spy;
+    }
+
+    static class MockFailureDetector implements IFailureDetector
+    {
+        boolean isAlive = true;
+
+        public boolean isAlive(InetAddressAndPort ep)
+        {
+            return isAlive;
+        }
+
+        public void interpret(InetAddressAndPort ep)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        public void report(InetAddressAndPort ep)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        public void registerFailureDetectionEventListener(IFailureDetectionEventListener listener)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        public void unregisterFailureDetectionEventListener(IFailureDetectionEventListener listener)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        public void remove(InetAddressAndPort ep)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        public void forceConviction(InetAddressAndPort ep)
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
 }
diff --git a/test/unit/org/apache/cassandra/index/CustomIndexTest.java b/test/unit/org/apache/cassandra/index/CustomIndexTest.java
index 84a36df..0d7fc9f 100644
--- a/test/unit/org/apache/cassandra/index/CustomIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/CustomIndexTest.java
@@ -639,7 +639,7 @@
 
         try
         {
-            getCurrentColumnFamilyStore().forceBlockingFlush();
+            flush();
             fail("Exception should have been propagated");
         }
         catch (Throwable t)
@@ -648,7 +648,7 @@
         }
 
         // SSTables remain uncommitted.
-        assertEquals(1, getCurrentColumnFamilyStore().getDirectories().getDirectoryForNewSSTables().listFiles().length);
+        assertEquals(1, getCurrentColumnFamilyStore().getDirectories().getDirectoryForNewSSTables().tryList().length);
     }
 
     @Test
@@ -661,7 +661,7 @@
         // Insert a single wide partition to be indexed
         for (int i = 0; i < totalRows; i++)
             execute("INSERT INTO %s (k, c, v) VALUES (0, ?, ?)", i, i);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // Create the index, which won't automatically start building
         String indexName = "build_single_partition_idx";
@@ -718,7 +718,7 @@
         execute("INSERT INTO %s (k, c, v) VALUES (?, ?, ?)", 5, 3, 3);
         execute("DELETE FROM %s WHERE k = ?", 5);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         String indexName = "partition_index_test_idx";
         createIndex(String.format("CREATE CUSTOM INDEX %s ON %%s(v) USING '%s'",
@@ -780,7 +780,7 @@
         // Insert a single row partition to be indexed
         for (int i = 0; i < totalRows; i++)
             execute("INSERT INTO %s (k, c, v) VALUES (0, ?, ?)", i, i);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // Create the index, which won't automatically start building
         String indexName = "partition_overindex_test_idx";
@@ -806,7 +806,7 @@
 
         // Insert a single range tombstone
         execute("DELETE FROM %s WHERE k=1 and c > 2");
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // Create the index, which won't automatically start building
         String indexName = "range_tombstone_idx";
diff --git a/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java b/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java
index 2c46bdb..84eb8d0 100644
--- a/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/internal/CassandraIndexTest.java
@@ -569,7 +569,7 @@
         Awaitility.await()
                   .atMost(1, TimeUnit.MINUTES)
                   .pollDelay(1, TimeUnit.SECONDS)
-                  .untilAsserted(() -> assertRows(execute(selectBuiltIndexesQuery)));
+                  .untilAsserted(() -> assertRows(execute(selectBuiltIndexesQuery), row("system", "PaxosUncommittedIndex", null)));
 
         String indexName = "build_remove_test_idx";
         String tableName = createTable("CREATE TABLE %s (a int, b int, c int, PRIMARY KEY (a, b))");
@@ -577,18 +577,18 @@
         waitForIndex(KEYSPACE, tableName, indexName);
 
         // check that there are no other rows in the built indexes table
-        assertRows(execute(selectBuiltIndexesQuery), row(KEYSPACE, indexName, null));
+        assertRows(execute(selectBuiltIndexesQuery), row(KEYSPACE, indexName, null), row("system", "PaxosUncommittedIndex", null));
 
         // rebuild the index and verify the built status table
         getCurrentColumnFamilyStore().rebuildSecondaryIndex(indexName);
         waitForIndex(KEYSPACE, tableName, indexName);
 
         // check that there are no other rows in the built indexes table
-        assertRows(execute(selectBuiltIndexesQuery), row(KEYSPACE, indexName, null));
+        assertRows(execute(selectBuiltIndexesQuery), row(KEYSPACE, indexName, null), row("system", "PaxosUncommittedIndex", null));
 
         // check that dropping the index removes it from the built indexes table
         dropIndex("DROP INDEX %s." + indexName);
-        assertRows(execute(selectBuiltIndexesQuery));
+        assertRows(execute(selectBuiltIndexesQuery), row("system", "PaxosUncommittedIndex", null));
     }
 
 
diff --git a/test/unit/org/apache/cassandra/index/internal/CustomCassandraIndex.java b/test/unit/org/apache/cassandra/index/internal/CustomCassandraIndex.java
index 51bb6bb..04579b0 100644
--- a/test/unit/org/apache/cassandra/index/internal/CustomCassandraIndex.java
+++ b/test/unit/org/apache/cassandra/index/internal/CustomCassandraIndex.java
@@ -30,6 +30,7 @@
 
 import com.google.common.collect.ImmutableSet;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.index.TargetParser;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -135,7 +136,7 @@
     public Callable<Void> getBlockingFlushTask()
     {
         return () -> {
-            indexCfs.forceBlockingFlush();
+            Util.flush(indexCfs);
             return null;
         };
     }
@@ -597,7 +598,7 @@
         CompactionManager.instance.interruptCompactionForCFs(cfss, (sstable) -> true, true);
         CompactionManager.instance.waitForCessation(cfss, (sstable) -> true);
         indexCfs.keyspace.writeOrder.awaitNewBarrier();
-        indexCfs.forceBlockingFlush();
+        Util.flush(indexCfs);
         indexCfs.readOrdering.awaitNewBarrier();
         indexCfs.invalidate();
     }
@@ -622,7 +623,7 @@
 
     private void buildBlocking()
     {
-        baseCfs.forceBlockingFlush();
+        Util.flush(baseCfs);
 
         try (ColumnFamilyStore.RefViewFragment viewFragment = baseCfs.selectAndReference(View.selectFunction(SSTableSet.CANONICAL));
              Refs<SSTableReader> sstables = viewFragment.refs)
@@ -646,7 +647,7 @@
                                                                          ImmutableSet.copyOf(sstables));
             Future<?> future = CompactionManager.instance.submitIndexBuild(builder);
             FBUtilities.waitOnFuture(future);
-            indexCfs.forceBlockingFlush();
+            Util.flush(indexCfs);
         }
         logger.info("Index build of {} complete", metadata.name);
     }
diff --git a/test/unit/org/apache/cassandra/index/sasi/SASICQLTest.java b/test/unit/org/apache/cassandra/index/sasi/SASICQLTest.java
index 695f040..e746fab 100644
--- a/test/unit/org/apache/cassandra/index/sasi/SASICQLTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/SASICQLTest.java
@@ -19,6 +19,7 @@
 package org.apache.cassandra.index.sasi;
 
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 
 import com.google.common.collect.Sets;
@@ -32,8 +33,10 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.restrictions.StatementRestrictions;
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.service.ClientWarn;
+import org.apache.cassandra.transport.ProtocolVersion;
 
 public class SASICQLTest extends CQLTester
 {
@@ -109,10 +112,10 @@
     {
         createTable("CREATE TABLE %s (k int PRIMARY KEY, v int)");
 
-        boolean enableSASIIndexes = DatabaseDescriptor.getEnableSASIIndexes();
+        boolean enableSASIIndexes = DatabaseDescriptor.getSASIIndexesEnabled();
         try
         {
-            DatabaseDescriptor.setEnableSASIIndexes(false);
+            DatabaseDescriptor.setSASIIndexesEnabled(false);
             createIndex("CREATE CUSTOM INDEX ON %s (v) USING 'org.apache.cassandra.index.sasi.SASIIndex'");
             Assert.fail("Should not be able to create a SASI index if they are disabled");
         }
@@ -125,7 +128,7 @@
         }
         finally
         {
-            DatabaseDescriptor.setEnableSASIIndexes(enableSASIIndexes);
+            DatabaseDescriptor.setSASIIndexesEnabled(enableSASIIndexes);
         }
     }
 
@@ -348,4 +351,17 @@
             }
         }
     }
+
+    @Test
+    public void testInOperator() throws Throwable
+    {
+        createTable("CREATE TABLE %s (pk int primary key, v int);");
+
+        createIndex("CREATE CUSTOM INDEX ON %s (v) USING 'org.apache.cassandra.index.sasi.SASIIndex';");
+
+        assertInvalidThrowMessage(Optional.of(ProtocolVersion.CURRENT),
+                                  StatementRestrictions.REQUIRES_ALLOW_FILTERING_MESSAGE,
+                                  InvalidQueryException.class,
+                                  "SELECT * FROM %s WHERE v IN (200, 250, 300)");
+    }
 }
diff --git a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
index 945a5e9..441d7b0 100644
--- a/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/SASIIndexTest.java
@@ -17,16 +17,15 @@
  */
 package org.apache.cassandra.index.sasi;
 
-import java.io.File;
-import java.io.FileReader;
-import java.io.FileWriter;
 import java.io.IOException;
-import java.io.Writer;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.FileSystems;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import java.nio.file.attribute.BasicFileAttributes;
 import java.util.*;
 import java.util.concurrent.ExecutorService;
@@ -38,12 +37,14 @@
 import java.util.stream.Stream;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.Operator;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.index.Index;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
@@ -86,6 +87,8 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.serializers.MarshalException;
 import org.apache.cassandra.serializers.TypeSerializer;
+import org.apache.cassandra.service.snapshot.SnapshotManifest;
+import org.apache.cassandra.service.snapshot.TableSnapshot;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
@@ -95,12 +98,10 @@
 import com.google.common.collect.Sets;
 import com.google.common.util.concurrent.Uninterruptibles;
 
-import org.json.simple.JSONArray;
-import org.json.simple.JSONObject;
-import org.json.simple.parser.JSONParser;
 import org.junit.*;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.db.ColumnFamilyStoreTest.getSnapshotManifestAndSchemaFileSizes;
 
 public class SASIIndexTest
 {
@@ -165,17 +166,16 @@
         try
         {
             store.snapshot(snapshotName);
+
             // Compact to make true snapshot size != 0
             store.forceMajorCompaction();
             LifecycleTransaction.waitForDeletions();
 
-            FileReader reader = new FileReader(store.getDirectories().getSnapshotManifestFile(snapshotName));
-            JSONObject manifest = (JSONObject) new JSONParser().parse(reader);
-            JSONArray files = (JSONArray) manifest.get("files");
+            SnapshotManifest manifest = SnapshotManifest.deserializeFromJsonFile(store.getDirectories().getSnapshotManifestFile(snapshotName));
 
             Assert.assertFalse(ssTableReaders.isEmpty());
-            Assert.assertFalse(files.isEmpty());
-            Assert.assertEquals(ssTableReaders.size(), files.size());
+            Assert.assertFalse(manifest.files.isEmpty());
+            Assert.assertEquals(ssTableReaders.size(), manifest.files.size());
 
             Map<Descriptor, Set<Component>> snapshotSSTables = store.getDirectories()
                                                                     .sstableLister(Directories.OnTxnErr.IGNORE)
@@ -191,7 +191,7 @@
                 Descriptor snapshotSSTable = new Descriptor(snapshotDirectory,
                                                             sstable.getKeyspaceName(),
                                                             sstable.getColumnFamilyName(),
-                                                            sstable.descriptor.generation,
+                                                            sstable.descriptor.id,
                                                             sstable.descriptor.formatType);
 
                 Set<Component> components = snapshotSSTables.get(snapshotSSTable);
@@ -208,11 +208,12 @@
                         tableSize += componentSize;
                 }
             }
-
-            Map<String, Directories.SnapshotSizeDetails> details = store.getSnapshotDetails();
+            
+            TableSnapshot details = store.listSnapshots().get(snapshotName);
 
             // check that SASI components are included in the computation of snapshot size
-            Assert.assertEquals(tableSize + indexSize, (long) details.get(snapshotName).dataSizeBytes);
+            long snapshotSize = tableSize + indexSize + getSnapshotManifestAndSchemaFileSizes(details);
+            Assert.assertEquals(snapshotSize, details.computeTrueSizeBytes());
         }
         finally
         {
@@ -546,7 +547,7 @@
 
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         final UntypedResultSet results = executeCQL(FTS_CF_NAME, "SELECT * FROM %s.%s WHERE artist LIKE 'lady%%'");
         Assert.assertNotNull(results);
@@ -898,7 +899,7 @@
         rm3.build().apply();
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         final ByteBuffer dataOutputId = UTF8Type.instance.decompose("/data/output/id");
 
@@ -1060,7 +1061,7 @@
     {
         setMinIndexInterval(minIndexInterval);
         IndexSummaryManager.instance.redistributeSummaries();
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         Set<String> rows = getIndexed(store, 100, buildExpression(firstName, Operator.LIKE_CONTAINS, UTF8Type.instance.decompose("a")));
         Assert.assertEquals(rows.toString(), expected, rows.size());
@@ -1304,7 +1305,7 @@
         rm.build().apply();
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         Set<String> rows;
 
@@ -1376,7 +1377,7 @@
         rm.build().apply();
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         Set<String> rows;
 
@@ -1437,7 +1438,7 @@
             rows = getIndexed(store, 10, buildExpression(comment, Operator.LIKE_MATCHES, bigValue.duplicate()));
             Assert.assertEquals(0, rows.size());
 
-            store.forceBlockingFlush();
+            Util.flush(store);
 
             rows = getIndexed(store, 10, buildExpression(comment, Operator.LIKE_MATCHES, bigValue.duplicate()));
             Assert.assertEquals(0, rows.size());
@@ -1540,7 +1541,7 @@
         update(rm, fullName, UTF8Type.instance.decompose("利久 寺地"), 8000);
         rm.build().apply();
 
-        store.forceBlockingFlush();
+        Util.flush(store);
 
 
         Set<String> rows;
@@ -1577,7 +1578,7 @@
         rm.build().apply();
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         Set<String> rows;
 
@@ -1662,7 +1663,7 @@
         rm.build().apply();
 
         // first flush would make interval for name - 'johnny' -> 'pavel'
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         rm = new Mutation.PartitionUpdateCollector(KS_NAME, decoratedKey("key6"));
         update(rm, name, UTF8Type.instance.decompose("Jason"), 6000);
@@ -1677,7 +1678,7 @@
         rm.build().apply();
 
         // this flush is going to produce range - 'jason' -> 'vijay'
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         // make sure that overlap of the prefixes is properly handled across sstables
         // since simple interval tree lookup is not going to cover it, prefix lookup actually required.
@@ -1841,7 +1842,7 @@
         executeCQL(CLUSTERING_CF_NAME_1 ,"INSERT INTO %s.%s (name, nickname, location, age, height, score) VALUES (?, ?, ?, ?, ?, ?)", "Jordan", "jrwest", "US", 27, 182, 1.0);
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         UntypedResultSet results;
 
@@ -1928,7 +1929,7 @@
         executeCQL(CLUSTERING_CF_NAME_2 ,"INSERT INTO %s.%s (name, nickname, location, age, height, score) VALUES (?, ?, ?, ?, ?, ?)", "Christopher", "chis", "US", 27, 180, 1.0);
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         results = executeCQL(CLUSTERING_CF_NAME_2 ,"SELECT * FROM %s.%s WHERE location LIKE 'US' AND age = 43 ALLOW FILTERING");
         Assert.assertNotNull(results);
@@ -1954,7 +1955,7 @@
         executeCQL(STATIC_CF_NAME, "INSERT INTO %s.%s (sensor_id,date,value,variance) VALUES(?, ?, ?, ?)", 1, 20160403L, 24.96, 4);
 
         if (shouldFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         executeCQL(STATIC_CF_NAME, "INSERT INTO %s.%s (sensor_id,sensor_type) VALUES(?, ?)", 2, "PRESSURE");
         executeCQL(STATIC_CF_NAME, "INSERT INTO %s.%s (sensor_id,date,value,variance) VALUES(?, ?, ?, ?)", 2, 20160401L, 1.03, 9);
@@ -1962,7 +1963,7 @@
         executeCQL(STATIC_CF_NAME, "INSERT INTO %s.%s (sensor_id,date,value,variance) VALUES(?, ?, ?, ?)", 2, 20160403L, 1.01, 4);
 
         if (shouldFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         UntypedResultSet results;
 
@@ -2043,15 +2044,15 @@
         executeCQL(CLUSTERING_CF_NAME_1, "INSERT INTO %s.%s (name, location, age, height, score) VALUES (?, ?, ?, ?, ?)", "Pavel", "BY", 28, 182, 2.0);
         executeCQL(CLUSTERING_CF_NAME_1, "INSERT INTO %s.%s (name, nickname, location, age, height, score) VALUES (?, ?, ?, ?, ?, ?)", "Jordan", "jrwest", "US", 27, 182, 1.0);
 
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         SSTable ssTable = store.getSSTables(SSTableSet.LIVE).iterator().next();
         Path path = FileSystems.getDefault().getPath(ssTable.getFilename().replace("-Data", "-SI_" + CLUSTERING_CF_NAME_1 + "_age"));
 
         // Overwrite index file with garbage
-        try (Writer writer = new FileWriter(path.toFile(), false))
+        try(FileChannel fc = FileChannel.open(path, StandardOpenOption.WRITE))
         {
-            writer.write("garbage");
+            fc.truncate(8).write(ByteBuffer.wrap("grabage".getBytes(StandardCharsets.UTF_8)));
         }
 
         long size1 = Files.readAttributes(path, BasicFileAttributes.class).size();
@@ -2082,7 +2083,7 @@
 
         executeCQL(CLUSTERING_CF_NAME_1, "INSERT INTO %s.%s (name, nickname) VALUES (?, ?)", "Alex", "ifesdjeen");
 
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         for (Index index : store.indexManager.listIndexes())
         {
@@ -2208,7 +2209,7 @@
         {
             Keyspace keyspace = Keyspace.open(KS_NAME);
             for (String table : Arrays.asList(containsTable, prefixTable, analyzedPrefixTable))
-                keyspace.getColumnFamilyStore(table).forceBlockingFlush();
+                Util.flushTable(keyspace, table);
         }
 
         UntypedResultSet results;
@@ -2442,7 +2443,7 @@
 
         Assert.assertTrue(rangesSize(beforeFlushMemtable, expression) > 0);
 
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         IndexMemtable afterFlushMemtable = index.getCurrentMemtable();
 
@@ -2620,7 +2621,7 @@
         ColumnFamilyStore store = Keyspace.open(KS_NAME).getColumnFamilyStore(CF_NAME);
 
         if (forceFlush)
-            store.forceBlockingFlush();
+            Util.flush(store);
 
         return store;
     }
@@ -2679,7 +2680,6 @@
                     }
                 }
             }
-
         }
         while (count == pageSize);
 
diff --git a/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java b/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java
index 1afb7b4..0abddd9 100644
--- a/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/disk/OnDiskIndexTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.index.sasi.disk;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.ThreadLocalRandom;
@@ -38,6 +37,7 @@
 import org.apache.cassandra.db.marshal.LongType;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.io.util.DataOutputBuffer;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.MurmurHash;
 import org.apache.cassandra.utils.Pair;
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 97b3433..ad0caff 100644
--- a/test/unit/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriterTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/disk/PerSSTableIndexWriterTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.index.sasi.disk;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.Callable;
@@ -40,13 +39,14 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.FSError;
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.Tables;
-import org.apache.cassandra.schema.MigrationManager;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
 import com.google.common.util.concurrent.Futures;
@@ -65,9 +65,9 @@
     {
         System.setProperty("cassandra.config", "cassandra-murmur.yaml");
         SchemaLoader.loadSchema();
-        MigrationManager.announceNewKeyspace(KeyspaceMetadata.create(KS_NAME,
-                                                                     KeyspaceParams.simpleTransient(1),
-                                                                     Tables.of(SchemaLoader.sasiCFMD(KS_NAME, CF_NAME).build())));
+        SchemaTestUtil.announceNewKeyspace(KeyspaceMetadata.create(KS_NAME,
+                                                                   KeyspaceParams.simpleTransient(1),
+                                                                   Tables.of(SchemaLoader.sasiCFMD(KS_NAME, CF_NAME).build())));
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java b/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java
index 4339a62..6d067a1 100644
--- a/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/disk/TokenTreeTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.index.sasi.disk;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
@@ -36,6 +35,7 @@
 import org.apache.cassandra.index.sasi.utils.RangeIterator;
 import org.apache.cassandra.db.marshal.LongType;
 import org.apache.cassandra.index.sasi.utils.RangeUnionIterator;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.SequentialWriterOption;
 import org.apache.cassandra.utils.MurmurHash;
diff --git a/test/unit/org/apache/cassandra/index/sasi/plan/ExpressionTest.java b/test/unit/org/apache/cassandra/index/sasi/plan/ExpressionTest.java
index 7457a85..5eeb5ef 100644
--- a/test/unit/org/apache/cassandra/index/sasi/plan/ExpressionTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/plan/ExpressionTest.java
@@ -24,7 +24,6 @@
 import org.junit.Test;
 
 import org.apache.cassandra.db.marshal.UTF8Type;
-import org.apache.cassandra.index.sasi.plan.Expression.Bound;
 
 public class ExpressionTest
 {
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 4468f2c..8620f5c 100644
--- a/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/plan/OperationTest.java
@@ -38,6 +38,7 @@
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
 import org.junit.*;
@@ -651,6 +652,15 @@
         {
             throw new UnsupportedOperationException();
         }
+
+        @Override
+        protected String toString(boolean cql)
+        {
+            return String.format("%s %s %s",
+                                 cql ? column.name.toCQLString() : column.name.toString(),
+                                 operator,
+                                 ByteBufferUtil.bytesToHex(value));
+        }
     }
 
     private static Unfiltered buildRow(Cell<?>... cells)
diff --git a/test/unit/org/apache/cassandra/index/sasi/utils/LongIteratorTest.java b/test/unit/org/apache/cassandra/index/sasi/utils/LongIteratorTest.java
index 05db33a..f61252a 100644
--- a/test/unit/org/apache/cassandra/index/sasi/utils/LongIteratorTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/utils/LongIteratorTest.java
@@ -22,8 +22,6 @@
 
 import java.io.IOException;
 
-import static org.apache.cassandra.index.sasi.utils.LongIterator.convert;
-
 public class LongIteratorTest
 {
     @Test
@@ -53,4 +51,4 @@
 
         it.close();
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java b/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java
index e55f6ba..dcd79b9 100644
--- a/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/utils/MappedBufferTest.java
@@ -25,6 +25,7 @@
 
 import org.apache.cassandra.db.marshal.LongType;
 import org.apache.cassandra.io.util.ChannelProxy;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 
 import org.junit.Assert;
@@ -452,7 +453,7 @@
         File tmp = FileUtils.createTempFile("mapped-buffer", "tmp");
         tmp.deleteOnExit();
 
-        RandomAccessFile file = new RandomAccessFile(tmp, "rw");
+        RandomAccessFile file = new RandomAccessFile(tmp.toJavaIOFile(), "rw");
 
         long numValues = 1000;
         for (long i = 0; i < numValues; i++)
@@ -460,7 +461,7 @@
 
         file.getFD().sync();
 
-        try (MappedBuffer buffer = new MappedBuffer(new ChannelProxy(tmp.getAbsolutePath(), file.getChannel())))
+        try (MappedBuffer buffer = new MappedBuffer(new ChannelProxy(tmp.absolutePath(), file.getChannel())))
         {
             Assert.assertEquals(numValues * 8, buffer.limit());
             Assert.assertEquals(numValues * 8, buffer.capacity());
@@ -493,7 +494,7 @@
         final File testFile = FileUtils.createTempFile("mapped-buffer-test", "db");
         testFile.deleteOnExit();
 
-        RandomAccessFile file = new RandomAccessFile(testFile, "rw");
+        RandomAccessFile file = new RandomAccessFile(testFile.toJavaIOFile(), "rw");
 
         for (long i = 0; i < numCount; i++)
         {
@@ -529,7 +530,7 @@
 
         try
         {
-            return new MappedBuffer(new ChannelProxy(testFile.getAbsolutePath(), file.getChannel()), numPageBits);
+            return new MappedBuffer(new ChannelProxy(testFile.absolutePath(), file.getChannel()), numPageBits);
         }
         finally
         {
diff --git a/test/unit/org/apache/cassandra/index/sasi/utils/RangeUnionIteratorTest.java b/test/unit/org/apache/cassandra/index/sasi/utils/RangeUnionIteratorTest.java
index 162b1c6..581f4e5 100644
--- a/test/unit/org/apache/cassandra/index/sasi/utils/RangeUnionIteratorTest.java
+++ b/test/unit/org/apache/cassandra/index/sasi/utils/RangeUnionIteratorTest.java
@@ -373,4 +373,4 @@
         Assert.assertTrue(range.hasNext());
         Assert.assertEquals(10, range.getCount());
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/io/DiskSpaceMetricsTest.java b/test/unit/org/apache/cassandra/io/DiskSpaceMetricsTest.java
index 8760f43..be8b162 100644
--- a/test/unit/org/apache/cassandra/io/DiskSpaceMetricsTest.java
+++ b/test/unit/org/apache/cassandra/io/DiskSpaceMetricsTest.java
@@ -28,6 +28,7 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.compaction.CompactionInterruptedException;
@@ -96,7 +97,7 @@
             execute("INSERT INTO %s (pk) VALUES (?)", base + i);
 
         // flush to write the sstable
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
     }
 
     private void assertDiskSpaceEqual(ColumnFamilyStore cfs)
diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
index d3d81f0..c398ac4 100644
--- a/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/compress/CompressedRandomAccessReaderTest.java
@@ -19,9 +19,8 @@
 package org.apache.cassandra.io.compress;
 
 import java.io.EOFException;
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
+import java.io.RandomAccessFile; //checkstyle: permit this import
 import java.util.Arrays;
 import java.util.Random;
 
@@ -97,7 +96,7 @@
     public void test6791() throws IOException, ConfigurationException
     {
         File f = FileUtils.createTempFile("compressed6791_", "3");
-        String filename = f.getAbsolutePath();
+        String filename = f.absolutePath();
         MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
         try(CompressedSequentialWriter writer = new CompressedSequentialWriter(f, filename + ".metadata",
                                                                                null, SequentialWriterOption.DEFAULT,
@@ -132,10 +131,10 @@
         finally
         {
             if (f.exists())
-                assertTrue(f.delete());
+                assertTrue(f.tryDelete());
             File metadata = new File(filename+ ".metadata");
             if (metadata.exists())
-                metadata.delete();
+                metadata.tryDelete();
         }
     }
 
@@ -145,8 +144,8 @@
     @Test
     public void testChunkIndexOverflow() throws IOException
     {
-        File file = File.createTempFile("chunk_idx_overflow", "1");
-        String filename = file.getAbsolutePath();
+        File file = FileUtils.createTempFile("chunk_idx_overflow", "1");
+        String filename = file.absolutePath();
         int chunkLength = 4096; // 4k
 
         try
@@ -166,16 +165,16 @@
         finally
         {
             if (file.exists())
-                assertTrue(file.delete());
+                assertTrue(file.tryDelete());
             File metadata = new File(filename + ".metadata");
             if (metadata.exists())
-                metadata.delete();
+                metadata.tryDelete();
         }
     }
 
     private static void testResetAndTruncate(File f, boolean compressed, boolean usemmap, int junkSize, double minCompressRatio) throws IOException
     {
-        final String filename = f.getAbsolutePath();
+        final String filename = f.absolutePath();
         writeSSTable(f, compressed ? CompressionParams.snappy() : null, junkSize);
 
         CompressionMetadata compressionMetadata = compressed ? new CompressionMetadata(filename + ".metadata", f.length(), true) : null;
@@ -192,16 +191,16 @@
         finally
         {
             if (f.exists())
-                assertTrue(f.delete());
+                assertTrue(f.tryDelete());
             File metadata = new File(filename + ".metadata");
             if (compressed && metadata.exists())
-                metadata.delete();
+                metadata.tryDelete();
         }
     }
 
     private static void writeSSTable(File f, CompressionParams params, int junkSize) throws IOException
     {
-        final String filename = f.getAbsolutePath();
+        final String filename = f.absolutePath();
         MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
         try(SequentialWriter writer = params != null
                 ? new CompressedSequentialWriter(f, filename + ".metadata",
@@ -237,14 +236,14 @@
         File file = new File("testDataCorruptionDetection");
         file.deleteOnExit();
 
-        File metadata = new File(file.getPath() + ".meta");
+        File metadata = new File(file.path() + ".meta");
         metadata.deleteOnExit();
 
-        assertTrue(file.createNewFile());
-        assertTrue(metadata.createNewFile());
+        assertTrue(file.createFileIfNotExists());
+        assertTrue(metadata.createFileIfNotExists());
 
         MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
-        try (SequentialWriter writer = new CompressedSequentialWriter(file, metadata.getPath(),
+        try (SequentialWriter writer = new CompressedSequentialWriter(file, metadata.path(),
                                                                       null, SequentialWriterOption.DEFAULT,
                                                                       CompressionParams.snappy(), sstableMetadataCollector))
         {
@@ -253,16 +252,16 @@
         }
 
         // open compression metadata and get chunk information
-        CompressionMetadata meta = new CompressionMetadata(metadata.getPath(), file.length(), true);
+        CompressionMetadata meta = new CompressionMetadata(metadata.path(), file.length(), true);
         CompressionMetadata.Chunk chunk = meta.chunkFor(0);
 
-        try (FileHandle.Builder builder = new FileHandle.Builder(file.getPath()).withCompressionMetadata(meta);
+        try (FileHandle.Builder builder = new FileHandle.Builder(file.path()).withCompressionMetadata(meta);
              FileHandle fh = builder.complete();
              RandomAccessReader reader = fh.createReader())
         {// read and verify compressed data
             assertEquals(CONTENT, reader.readLine());
             Random random = new Random();
-            try(RandomAccessFile checksumModifier = new RandomAccessFile(file, "rw"))
+            try(RandomAccessFile checksumModifier = new RandomAccessFile(file.toJavaIOFile(), "rw"))
             {
                 byte[] checksum = new byte[4];
 
@@ -311,6 +310,6 @@
     {
         file.seek(checksumOffset);
         file.write(checksum);
-        SyncUtil.sync(file);
+        SyncUtil.sync(file.getFD());
     }
 }
diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterReopenTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterReopenTest.java
index 461c13c..08072f6 100644
--- a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterReopenTest.java
+++ b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterReopenTest.java
@@ -78,13 +78,13 @@
         {
             execute("insert into %s (id, t) values (?, ?)", i, ByteBuffer.wrap(blob));
         }
-        getCurrentColumnFamilyStore().forceBlockingFlush();
+        flush();
         for (int i = 0; i < 10000; i++)
         {
             execute("insert into %s (id, t) values (?, ?)", i, ByteBuffer.wrap(blob));
         }
-        getCurrentColumnFamilyStore().forceBlockingFlush();
-        DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMB(1);
+        flush();
+        DatabaseDescriptor.setSSTablePreemptiveOpenIntervalInMiB(1);
         getCurrentColumnFamilyStore().forceMajorCompaction();
     }
 
diff --git a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java
index 57802cb..2b50633 100644
--- a/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/compress/CompressedSequentialWriterTest.java
@@ -19,7 +19,6 @@
 
 import java.io.ByteArrayInputStream;
 import java.io.DataInputStream;
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
@@ -113,7 +112,7 @@
 
     private void testWrite(File f, int bytesToTest, boolean useMemmap) throws IOException
     {
-        final String filename = f.getAbsolutePath();
+        final String filename = f.absolutePath();
         MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(Collections.singletonList(BytesType.instance)));
 
         byte[] dataPre = new byte[bytesToTest];
@@ -171,10 +170,10 @@
         finally
         {
             if (f.exists())
-                f.delete();
+                f.tryDelete();
             File metadata = new File(f + ".metadata");
             if (metadata.exists())
-                metadata.delete();
+                metadata.tryDelete();
         }
     }
 
@@ -213,12 +212,12 @@
         b.flip();
 
         File f = FileUtils.createTempFile("testUncompressedChunks", "1");
-        String filename = f.getPath();
+        String filename = f.path();
         MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(Collections.singletonList(BytesType.instance)));
         compressionParameters = new CompressionParams(MockCompressor.class.getTypeName(),
                                                       MockCompressor.paramsFor(ratio, extra),
                                                       DEFAULT_CHUNK_LENGTH, ratio);
-        try (CompressedSequentialWriter writer = new CompressedSequentialWriter(f, f.getPath() + ".metadata",
+        try (CompressedSequentialWriter writer = new CompressedSequentialWriter(f, f.path() + ".metadata",
                                                                                 null, SequentialWriterOption.DEFAULT,
                                                                                 compressionParameters,
                                                                                 sstableMetadataCollector))
@@ -244,10 +243,10 @@
         finally
         {
             if (f.exists())
-                f.delete();
+                f.tryDelete();
             File metadata = new File(f + ".metadata");
             if (metadata.exists())
-                metadata.delete();
+                metadata.tryDelete();
         }
 
     }
@@ -272,12 +271,12 @@
     @Override
     public void resetAndTruncateTest()
     {
-        File tempFile = new File(Files.createTempDir(), "reset.txt");
+        File tempFile = new File(Files.createTempDir().toPath(), "reset.txt");
         File offsetsFile = FileUtils.createDeletableTempFile("compressedsequentialwriter.offset", "test");
         final int bufferSize = 48;
         final int writeSize = 64;
         byte[] toWrite = new byte[writeSize];
-        try (SequentialWriter writer = new CompressedSequentialWriter(tempFile, offsetsFile.getPath(),
+        try (SequentialWriter writer = new CompressedSequentialWriter(tempFile, offsetsFile.path(),
                                                                       null, SequentialWriterOption.DEFAULT,
                                                                       CompressionParams.lz4(bufferSize),
                                                                       new MetadataCollector(new ClusteringComparator(UTF8Type.instance))))
@@ -331,7 +330,7 @@
 
         private TestableCSW(File file, File offsetsFile) throws IOException
         {
-            this(file, offsetsFile, new CompressedSequentialWriter(file, offsetsFile.getPath(),
+            this(file, offsetsFile, new CompressedSequentialWriter(file, offsetsFile.path(),
                                                                    null, SequentialWriterOption.DEFAULT,
                                                                    CompressionParams.lz4(BUFFER_SIZE, MAX_COMPRESSED),
                                                                    new MetadataCollector(new ClusteringComparator(UTF8Type.instance))));
@@ -348,7 +347,7 @@
         {
             Assert.assertTrue(file.exists());
             Assert.assertFalse(offsetsFile.exists());
-            byte[] compressed = readFileToByteArray(file);
+            byte[] compressed = readFileToByteArray(file.toJavaIOFile());
             byte[] uncompressed = new byte[partialContents.length];
             LZ4Compressor.create(Collections.<String, String>emptyMap()).uncompress(compressed, 0, compressed.length - 4, uncompressed, 0);
             Assert.assertTrue(Arrays.equals(partialContents, uncompressed));
@@ -358,7 +357,7 @@
         {
             Assert.assertTrue(file.exists());
             Assert.assertTrue(offsetsFile.exists());
-            DataInputStream offsets = new DataInputStream(new ByteArrayInputStream(readFileToByteArray(offsetsFile)));
+            DataInputStream offsets = new DataInputStream(new ByteArrayInputStream(readFileToByteArray(offsetsFile.toJavaIOFile())));
             Assert.assertTrue(offsets.readUTF().endsWith("LZ4Compressor"));
             Assert.assertEquals(0, offsets.readInt());
             Assert.assertEquals(BUFFER_SIZE, offsets.readInt());
@@ -367,7 +366,7 @@
             Assert.assertEquals(2, offsets.readInt());
             Assert.assertEquals(0, offsets.readLong());
             int offset = (int) offsets.readLong();
-            byte[] compressed = readFileToByteArray(file);
+            byte[] compressed = readFileToByteArray(file.toJavaIOFile());
             byte[] uncompressed = new byte[fullContents.length];
             LZ4Compressor.create(Collections.<String, String>emptyMap()).uncompress(compressed, 0, offset - 4, uncompressed, 0);
             LZ4Compressor.create(Collections.<String, String>emptyMap()).uncompress(compressed, offset, compressed.length - (4 + offset), uncompressed, partialContents.length);
@@ -381,8 +380,8 @@
 
         void cleanup()
         {
-            file.delete();
-            offsetsFile.delete();
+            file.tryDelete();
+            offsetsFile.tryDelete();
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/io/compress/CompressorTest.java b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java
index 29e8453..dad3ae4 100644
--- a/test/unit/org/apache/cassandra/io/compress/CompressorTest.java
+++ b/test/unit/org/apache/cassandra/io/compress/CompressorTest.java
@@ -27,6 +27,7 @@
 import java.util.Random;
 
 import com.google.common.io.Files;
+import org.apache.cassandra.io.util.File;
 import static org.junit.Assert.*;
 import org.junit.Assert;
 import org.junit.Test;
@@ -143,7 +144,7 @@
         dest.clear();
         channel.write(dest);
 
-        MappedByteBuffer mappedData = Files.map(temp);
+        MappedByteBuffer mappedData = Files.map(temp.toJavaIOFile());
         ByteBuffer result = makeBB(data.length + 100);
         mappedData.position(outOffset).limit(outOffset + compressedLength);
 
diff --git a/test/unit/org/apache/cassandra/io/sstable/BigTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/BigTableWriterTest.java
index 9e3594b..14d3c5e 100644
--- a/test/unit/org/apache/cassandra/io/sstable/BigTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/BigTableWriterTest.java
@@ -18,7 +18,7 @@
 */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
+import org.apache.cassandra.io.util.File;
 import java.io.IOException;
 
 import org.junit.BeforeClass;
diff --git a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterClientTest.java b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterClientTest.java
index 61ac017..5ee2768 100644
--- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterClientTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterClientTest.java
@@ -17,11 +17,12 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
-import java.io.FilenameFilter;
+
 import java.io.IOException;
+import java.util.function.BiPredicate;
 
 import com.google.common.io.Files;
+import org.apache.cassandra.io.util.File;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -39,8 +40,8 @@
     @Before
     public void setUp()
     {
-        this.testDirectory = Files.createTempDir();
-        DatabaseDescriptor.daemonInitialization();
+        this.testDirectory = new File(Files.createTempDir());
+        DatabaseDescriptor.clientInitialization();
     }
 
     @Test
@@ -73,16 +74,9 @@
         writer.close();
         writer2.close();
 
-        FilenameFilter filter = new FilenameFilter()
-        {
-            @Override
-            public boolean accept(File dir, String name)
-            {
-                return name.endsWith("-Data.db");
-            }
-        };
+        BiPredicate<File, String> filter = (dir, name) -> name.endsWith("-Data.db");
 
-        File[] dataFiles = this.testDirectory.listFiles(filter);
+        File[] dataFiles = this.testDirectory.tryList(filter);
         assertEquals(2, dataFiles.length);
     }
 
diff --git a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
index f43294c..1851314 100644
--- a/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/CQLSSTableWriterTest.java
@@ -17,21 +17,20 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
-import java.io.FilenameFilter;
+
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.BiPredicate;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import com.google.common.io.Files;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
@@ -47,13 +46,11 @@
 import org.apache.cassandra.cql3.functions.types.*;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.commitlog.CommitLog;
-import org.apache.cassandra.db.rows.Row;
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.dht.*;
 import org.apache.cassandra.exceptions.*;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadataRef;
-import org.apache.cassandra.serializers.SimpleDateSerializer;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.*;
@@ -94,8 +91,8 @@
         keyspace = "cql_keyspace" + idGen.incrementAndGet();
         table = "table" + idGen.incrementAndGet();
         qualifiedTable = keyspace + '.' + table;
-        dataDir = new File(tempFolder.newFolder().getAbsolutePath() + File.separator + keyspace + File.separator + table);
-        assert dataDir.mkdirs();
+        dataDir = new File(tempFolder.newFolder().getAbsolutePath() + File.pathSeparator() + keyspace + File.pathSeparator() + table);
+        assert dataDir.tryCreateDirectories();
     }
 
     @Test
@@ -171,7 +168,7 @@
         }
         catch (IllegalArgumentException e)
         {
-            assertEquals(e.getMessage(), "Counter update statements are not supported");
+            assertEquals(e.getMessage(), "Counter modification statements are not supported");
         }
     }
 
@@ -179,8 +176,8 @@
     public void testSyncWithinPartition() throws Exception
     {
         // Check that the write respect the buffer size even if we only insert rows withing the same partition (#7360)
-        // To do that simply, we use a writer with a buffer of 1MB, and write 2 rows in the same partition with a value
-        // > 1MB and validate that this created more than 1 sstable.
+        // To do that simply, we use a writer with a buffer of 1MiB, and write 2 rows in the same partition with a value
+        // > 1MiB and validate that this created more than 1 sstable.
         String schema = "CREATE TABLE " + qualifiedTable + " ("
                       + "  k int PRIMARY KEY,"
                       + "  v blob"
@@ -199,14 +196,8 @@
         writer.addRow(1, val);
         writer.close();
 
-        FilenameFilter filterDataFiles = new FilenameFilter()
-        {
-            public boolean accept(File dir, String name)
-            {
-                return name.endsWith("-Data.db");
-            }
-        };
-        assert dataDir.list(filterDataFiles).length > 1 : Arrays.toString(dataDir.list(filterDataFiles));
+        BiPredicate<File, String> filterDataFiles = (dir, name) -> name.endsWith("-Data.db");
+        assert dataDir.tryListNames(filterDataFiles).length > 1 : Arrays.toString(dataDir.tryListNames(filterDataFiles));
     }
 
 
@@ -234,7 +225,286 @@
 
     }
 
+    @Test
+    public void testDeleteStatement() throws Exception
+    {
 
+        final String schema = "CREATE TABLE " + qualifiedTable + " ("
+                              + "  k int,"
+                              + "  c1 int,"
+                              + "  c2 int,"
+                              + "  v text,"
+                              + "  PRIMARY KEY (k, c1, c2)"
+                              + ")";
+
+        testUpdateStatement(); // start by adding some data
+        UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(2, resultSet.size());
+
+        CQLSSTableWriter writer = CQLSSTableWriter.builder()
+                                                  .inDirectory(dataDir)
+                                                  .forTable(schema)
+                                                  .using("DELETE FROM " + qualifiedTable +
+                                                         " WHERE k = ? AND c1 = ? AND c2 = ?")
+                                                  .build();
+
+        writer.addRow(1, 2, 3);
+        writer.addRow(4, 5, 6);
+        writer.close();
+        loadSSTables(dataDir, keyspace);
+
+        resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(0, resultSet.size());
+        Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+        assertFalse(iter.hasNext());
+    }
+
+    @Test
+    public void testDeletePartition() throws Exception
+    {
+
+        final String schema = "CREATE TABLE " + qualifiedTable + " ("
+                              + "  k int,"
+                              + "  c1 int,"
+                              + "  c2 int,"
+                              + "  v text,"
+                              + "  PRIMARY KEY (k, c1, c2)"
+                              + ")";
+
+        // First, write some rows
+        CQLSSTableWriter writer = CQLSSTableWriter.builder()
+                                                  .inDirectory(dataDir)
+                                                  .forTable(schema)
+                                                  .using("INSERT INTO " + qualifiedTable + " (k, c1, c2, v) " +
+                                                         "VALUES (?, ?, ?, ?)")
+                                                  .build();
+
+        writer.addRow(1, 2, 3, "a");
+        writer.addRow(1, 4, 5, "b");
+        writer.addRow(1, 6, 7, "c");
+        writer.addRow(2, 8, 9, "d");
+
+        writer.close();
+        loadSSTables(dataDir, keyspace);
+
+        UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(4, resultSet.size());
+        Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+        UntypedResultSet.Row r1 = iter.next();
+        assertEquals(1, r1.getInt("k"));
+        assertEquals(2, r1.getInt("c1"));
+        assertEquals(3, r1.getInt("c2"));
+        assertEquals("a", r1.getString("v"));
+        UntypedResultSet.Row r2 = iter.next();
+        assertEquals(1, r2.getInt("k"));
+        assertEquals(4, r2.getInt("c1"));
+        assertEquals(5, r2.getInt("c2"));
+        assertEquals("b", r2.getString("v"));
+        UntypedResultSet.Row r3 = iter.next();
+        assertEquals(1, r3.getInt("k"));
+        assertEquals(6, r3.getInt("c1"));
+        assertEquals(7, r3.getInt("c2"));
+        assertEquals("c", r3.getString("v"));
+        UntypedResultSet.Row r4 = iter.next();
+        assertEquals(2, r4.getInt("k"));
+        assertEquals(8, r4.getInt("c1"));
+        assertEquals(9, r4.getInt("c2"));
+        assertEquals("d", r4.getString("v"));
+        assertFalse(iter.hasNext());
+
+        writer = CQLSSTableWriter.builder()
+                                 .inDirectory(dataDir)
+                                 .forTable(schema)
+                                 .using("DELETE FROM " + qualifiedTable +
+                                        " WHERE k = ?")
+                                 .build();
+
+        writer.addRow(1);
+        writer.close();
+        loadSSTables(dataDir, keyspace);
+
+        resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(1, resultSet.size());
+        iter = resultSet.iterator();
+        UntypedResultSet.Row r5 = iter.next();
+        assertEquals(2, r5.getInt("k"));
+        assertEquals(8, r5.getInt("c1"));
+        assertEquals(9, r5.getInt("c2"));
+        assertEquals("d", r5.getString("v"));
+        assertFalse(iter.hasNext());
+    }
+
+    @Test
+    public void testDeleteRange() throws Exception
+    {
+
+        final String schema = "CREATE TABLE " + qualifiedTable + " ("
+                              + "  k text,"
+                              + "  c1 int,"
+                              + "  c2 int,"
+                              + "  v text,"
+                              + "  PRIMARY KEY (k, c1, c2)"
+                              + ")";
+
+        CQLSSTableWriter updateWriter = CQLSSTableWriter.builder()
+                                                        .inDirectory(dataDir)
+                                                        .forTable(schema)
+                                                        .using(String.format("UPDATE %s SET v=? WHERE k=? AND c1=? AND c2=?", qualifiedTable))
+                                                        .build();
+        CQLSSTableWriter deleteWriter = CQLSSTableWriter.builder()
+                                                        .inDirectory(dataDir)
+                                                        .forTable(schema)
+                                                        .using(String.format("DELETE FROM %s WHERE k=? AND c1=? and c2>=?", qualifiedTable))
+                                                        .build();
+
+        updateWriter.addRow("v0.0", "a", 0, 0);
+        updateWriter.addRow("v0.1", "a", 0, 1);
+        updateWriter.addRow("v0.2", "a", 0, 2);
+        updateWriter.addRow("v0.0", "b", 0, 0);
+        updateWriter.addRow("v0.1", "b", 0, 1);
+        updateWriter.addRow("v0.2", "b", 0, 2);
+        updateWriter.close();
+        deleteWriter.addRow("a", 0, 1);
+        deleteWriter.addRow("b", 0, 2);
+        deleteWriter.close();
+        loadSSTables(dataDir, keyspace);
+
+        UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(3, resultSet.size());
+
+        Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+        UntypedResultSet.Row r1 = iter.next();
+        assertEquals("a", r1.getString("k"));
+        assertEquals(0, r1.getInt("c1"));
+        assertEquals(0, r1.getInt("c2"));
+        UntypedResultSet.Row r2 = iter.next();
+        assertEquals("b", r2.getString("k"));
+        assertEquals(0, r2.getInt("c1"));
+        assertEquals(0, r2.getInt("c2"));
+        UntypedResultSet.Row r3 = iter.next();
+        assertEquals("b", r3.getString("k"));
+        assertEquals(0, r3.getInt("c1"));
+        assertEquals(1, r3.getInt("c2"));
+    }
+
+    @Test
+    public void testDeleteRangeEmptyKeyComponent() throws Exception
+    {
+
+
+        final String schema = "CREATE TABLE " + qualifiedTable + " ("
+                              + "  k text,"
+                              + "  c1 int,"
+                              + "  c2 int,"
+                              + "  v text,"
+                              + "  PRIMARY KEY (k, c1, c2)"
+                              + ")";
+
+        CQLSSTableWriter updateWriter = CQLSSTableWriter.builder()
+                                                        .inDirectory(dataDir)
+                                                        .forTable(schema)
+                                                        .using(String.format("UPDATE %s SET v=? WHERE k=? AND c1=? AND c2=?", qualifiedTable))
+                                                        .build();
+        CQLSSTableWriter deleteWriter = CQLSSTableWriter.builder()
+                                                        .inDirectory(dataDir)
+                                                        .forTable(schema)
+                                                        .using(String.format("DELETE FROM %s WHERE k=? AND c1=?", qualifiedTable))
+                                                        .build();
+
+        updateWriter.addRow("v0.0", "a", 0, 0);
+        updateWriter.addRow("v0.1", "a", 0, 1);
+        updateWriter.addRow("v0.2", "a", 1, 2);
+        updateWriter.addRow("v0.0", "b", 0, 0);
+        updateWriter.addRow("v0.1", "b", 0, 1);
+        updateWriter.addRow("v0.2", "b", 1, 2);
+        updateWriter.close();
+        deleteWriter.addRow("a", 0);
+        deleteWriter.addRow("b", 0);
+        deleteWriter.close();
+        loadSSTables(dataDir, keyspace);
+
+        UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(2, resultSet.size());
+
+        Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+        UntypedResultSet.Row r1 = iter.next();
+        assertEquals("a", r1.getString("k"));
+        assertEquals(1, r1.getInt("c1"));
+        assertEquals(2, r1.getInt("c2"));
+        UntypedResultSet.Row r2 = iter.next();
+        assertEquals("b", r2.getString("k"));
+        assertEquals(1, r2.getInt("c1"));
+        assertEquals(2, r2.getInt("c2"));
+    }
+
+    @Test
+    public void testDeleteValue() throws Exception
+    {
+        final String schema = "CREATE TABLE " + qualifiedTable + " ("
+                              + "  k text,"
+                              + "  c1 int,"
+                              + "  c2 int,"
+                              + "  v text,"
+                              + "  PRIMARY KEY (k, c1, c2)"
+                              + ")";
+
+        CQLSSTableWriter insertWriter = CQLSSTableWriter.builder()
+                                                        .inDirectory(dataDir)
+                                                        .forTable(schema)
+                                                        .using(String.format("INSERT INTO %s (v, k, c1, c2) values (?, ?, ?, ?)", qualifiedTable))
+                                                        .build();
+
+        // UPDATE does not set the row's liveness information, just the cells'. So when we delete the value from rows
+        // added with the updateWriter, the entire row will no longer exist, not just the value.
+        CQLSSTableWriter updateWriter = CQLSSTableWriter.builder()
+                                                        .inDirectory(dataDir)
+                                                        .forTable(schema)
+                                                        .using(String.format("UPDATE %s SET v=? WHERE k=? AND c1=? AND c2=?", qualifiedTable))
+                                                        .build();
+
+        CQLSSTableWriter deleteWriter = CQLSSTableWriter.builder()
+                                                  .inDirectory(dataDir)
+                                                  .forTable(schema)
+                                                  .using("DELETE v FROM " + qualifiedTable +
+                                                         " WHERE k = ? AND c1 = ? AND c2 = ?")
+                                                  .build();
+
+        insertWriter.addRow("v0.2", "a", 1, 2);
+        insertWriter.close();
+
+        updateWriter.addRow("v0.3", "b", 3, 4);
+        updateWriter.close();
+
+        loadSSTables(dataDir, keyspace);
+
+        UntypedResultSet resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(2, resultSet.size());
+        Iterator<UntypedResultSet.Row> iter = resultSet.iterator();
+        UntypedResultSet.Row insertedRow = iter.next();
+        assertEquals("v0.2", insertedRow.getString("v"));
+        assertEquals("a", insertedRow.getString("k"));
+        assertEquals(1, insertedRow.getInt("c1"));
+        assertEquals(2, insertedRow.getInt("c2"));
+        UntypedResultSet.Row updatedRow = iter.next();
+        assertEquals("v0.3", updatedRow.getString("v"));
+        assertEquals("b", updatedRow.getString("k"));
+        assertEquals(3, updatedRow.getInt("c1"));
+        assertEquals(4, updatedRow.getInt("c2"));
+
+        deleteWriter.addRow("a", 1, 2);
+        deleteWriter.addRow("b", 3, 4);
+        deleteWriter.close();
+        loadSSTables(dataDir, keyspace);
+
+        resultSet = QueryProcessor.executeInternal("SELECT * FROM " + qualifiedTable);
+        assertEquals(1, resultSet.size());
+        iter = resultSet.iterator();
+        UntypedResultSet.Row modifiedRow = iter.next();
+        assertFalse(modifiedRow.has("v"));
+        assertEquals("a", modifiedRow.getString("k"));
+        assertEquals(1, modifiedRow.getInt("c1"));
+        assertEquals(2, modifiedRow.getInt("c2"));
+    }
 
     private static final int NUMBER_WRITES_IN_RUNNABLE = 10;
     private class WriterThread extends Thread
diff --git a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
index 03681b8..405f3da 100644
--- a/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/DescriptorTest.java
@@ -17,10 +17,10 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.UUID;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.lang3.StringUtils;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -45,7 +45,7 @@
     public DescriptorTest() throws IOException
     {
         // create CF directories, one without CFID and one with it
-        tempDataDir = FileUtils.createTempFile("DescriptorTest", null).getParentFile();
+        tempDataDir = FileUtils.createTempFile("DescriptorTest", null).parent();
     }
 
     @BeforeClass
@@ -57,39 +57,39 @@
     @Test
     public void testFromFilename() throws Exception
     {
-        File cfIdDir = new File(tempDataDir.getAbsolutePath() + File.separator + ksname + File.separator + cfname + '-' + cfId);
+        File cfIdDir = new File(tempDataDir.absolutePath() + File.pathSeparator() + ksname + File.pathSeparator() + cfname + '-' + cfId);
         testFromFilenameFor(cfIdDir);
     }
 
     @Test
     public void testFromFilenameInBackup() throws Exception
     {
-        File backupDir = new File(StringUtils.join(new String[]{tempDataDir.getAbsolutePath(), ksname, cfname + '-' + cfId, Directories.BACKUPS_SUBDIR}, File.separator));
+        File backupDir = new File(StringUtils.join(new String[]{ tempDataDir.absolutePath(), ksname, cfname + '-' + cfId, Directories.BACKUPS_SUBDIR}, File.pathSeparator()));
         testFromFilenameFor(backupDir);
     }
 
     @Test
     public void testFromFilenameInSnapshot() throws Exception
     {
-        File snapshotDir = new File(StringUtils.join(new String[]{tempDataDir.getAbsolutePath(), ksname, cfname + '-' + cfId, Directories.SNAPSHOT_SUBDIR, "snapshot_name"}, File.separator));
+        File snapshotDir = new File(StringUtils.join(new String[]{ tempDataDir.absolutePath(), ksname, cfname + '-' + cfId, Directories.SNAPSHOT_SUBDIR, "snapshot_name"}, File.pathSeparator()));
         testFromFilenameFor(snapshotDir);
     }
 
     @Test
     public void testFromFilenameInLegacyDirectory() throws Exception
     {
-        File cfDir = new File(tempDataDir.getAbsolutePath() + File.separator + ksname + File.separator + cfname);
+        File cfDir = new File(tempDataDir.absolutePath() + File.pathSeparator() + ksname + File.pathSeparator() + cfname);
         testFromFilenameFor(cfDir);
     }
 
     private void testFromFilenameFor(File dir)
     {
-        checkFromFilename(new Descriptor(dir, ksname, cfname, 1, SSTableFormat.Type.BIG));
+        checkFromFilename(new Descriptor(dir, ksname, cfname, new SequenceBasedSSTableId(1), SSTableFormat.Type.BIG));
 
         // secondary index
         String idxName = "myidx";
-        File idxDir = new File(dir.getAbsolutePath() + File.separator + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName);
-        checkFromFilename(new Descriptor(idxDir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, 4, SSTableFormat.Type.BIG));
+        File idxDir = new File(dir.absolutePath() + File.pathSeparator() + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName);
+        checkFromFilename(new Descriptor(idxDir, ksname, cfname + Directories.SECONDARY_INDEX_NAME_SEPARATOR + idxName, new SequenceBasedSSTableId(4), SSTableFormat.Type.BIG));
     }
 
     private void checkFromFilename(Descriptor original)
@@ -103,7 +103,7 @@
         assertEquals(original.ksname, desc.ksname);
         assertEquals(original.cfname, desc.cfname);
         assertEquals(original.version, desc.version);
-        assertEquals(original.generation, desc.generation);
+        assertEquals(original.id, desc.id);
         assertEquals(Component.DATA, pair.right);
     }
 
@@ -112,8 +112,8 @@
     {
         // Descriptor should be equal when parent directory points to the same directory
         File dir = new File(".");
-        Descriptor desc1 = new Descriptor(dir, "ks", "cf", 1, SSTableFormat.Type.BIG);
-        Descriptor desc2 = new Descriptor(dir.getAbsoluteFile(), "ks", "cf", 1, SSTableFormat.Type.BIG);
+        Descriptor desc1 = new Descriptor(dir, "ks", "cf", new SequenceBasedSSTableId(1), SSTableFormat.Type.BIG);
+        Descriptor desc2 = new Descriptor(dir.toAbsolute(), "ks", "cf", new SequenceBasedSSTableId(1), SSTableFormat.Type.BIG);
         assertEquals(desc1, desc2);
         assertEquals(desc1.hashCode(), desc2.hashCode());
     }
@@ -124,7 +124,7 @@
         String[] names = {
              "ma-1-big-Data.db",
              // 2ndary index
-             ".idx1" + File.separator + "ma-1-big-Data.db",
+             ".idx1" + File.pathSeparator() + "ma-1-big-Data.db",
         };
 
         for (String name : names)
@@ -160,12 +160,12 @@
         // from Cassandra dirs
 
         String[] filePaths = new String[]{
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/nb-22-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
         };
 
         testKeyspaceTableParsing(filePaths, "ks1", "tab1");
@@ -173,12 +173,12 @@
         // indexes
 
         String[] filePathsIndexes = new String[]{
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/.index/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/snapshots/snapshot/.index/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-34234234234234234234234234234234/backups/.index/nb-22-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/snapshots/snapshot/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/ks1/tab1-3424234234324/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
         };
 
         testKeyspaceTableParsing(filePathsIndexes, "ks1", "tab1.index");
@@ -186,23 +186,23 @@
         // what if even a snapshot of a keyspace and table called snapshots is called snapshots?
 
         String[] filePathsWithSnapshotKeyspaceAndTable = new String[]{
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/nb-22-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
         };
 
         testKeyspaceTableParsing(filePathsWithSnapshotKeyspaceAndTable, "snapshots", "snapshots");
 
         String[] filePathsWithSnapshotKeyspaceAndTableWithIndices = new String[]{
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/.index/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/snapshots/snapshots/.index/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-74273842738947874273842738947878/backups/.index/nb-22-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/snapshots/snapshots-742738427389478/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
         };
 
         testKeyspaceTableParsing(filePathsWithSnapshotKeyspaceAndTableWithIndices, "snapshots", "snapshots.index");
@@ -210,12 +210,12 @@
         // what if keyspace and table is called backups?
 
         String[] filePathsWithBackupsKeyspaceAndTable = new String[]{
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/nb-22-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
         };
 
         testKeyspaceTableParsing(filePathsWithBackupsKeyspaceAndTable, "backups", "backups");
@@ -236,60 +236,60 @@
         // what if even a snapshot of a keyspace and table called backups is called snapshots?
 
         String[] filePathsWithBackupsKeyspaceAndTableWithIndices = new String[]{
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/.index/na-1-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/.index/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/snapshots/snapshots/.index/nb-22-big-Index.db",
-        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-74273842738947874273842738947878/backups/.index/nb-22-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/.index/na-1-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/path/to/cassandra/data/dir2/dir5/dir6/backups/backups-742738427389478/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
         };
 
         testKeyspaceTableParsing(filePathsWithBackupsKeyspaceAndTableWithIndices, "backups", "backups.index");
 
         String[] outsideOfCassandra = new String[]{
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/na-1-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/na-1-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/na-1-big-Index.db",
-        "/tmp/tests/keyspace/table-34234234234234234234234234234234/na-1-big-Index.db",
-        "/keyspace/table-34234234234234234234234234234234/nb-22-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/nb-22-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/nb-22-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/nb-22-big-Index.db",
-        "/tmp/tests/keyspace/table-34234234234234234234234234234234/nb-22-big-Index.db",
-        "/keyspace/table-34234234234234234234234234234234/nb-22-big-Index.db"
+        "/tmp/some/path/tests/keyspace/table-3424234234234/na-1-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-3424234234234/snapshots/snapshots/na-1-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-3424234234234/backups/na-1-big-Index.db",
+        "/tmp/tests/keyspace/table-3424234234234/na-1-big-Index.db",
+        "/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-3424234234234/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-3424234234234/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/tests/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/keyspace/table-3424234234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db"
         };
 
         testKeyspaceTableParsing(outsideOfCassandra, "keyspace", "table");
 
         String[] outsideOfCassandraUppercaseKeyspaceAndTable = new String[]{
-        "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/na-1-big-Index.db",
-        "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/snapshots/snapshots/na-1-big-Index.db",
-        "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/backups/na-1-big-Index.db",
-        "/tmp/tests/Keyspace/Table-34234234234234234234234234234234/na-1-big-Index.db",
-        "/Keyspace/Table-34234234234234234234234234234234/nb-22-big-Index.db",
-        "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/nb-22-big-Index.db",
-        "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/snapshots/snapshots/nb-22-big-Index.db",
-        "/tmp/some/path/tests/Keyspace/Table-34234234234234234234234234234234/backups/nb-22-big-Index.db",
-        "/tmp/tests/Keyspace/Table-34234234234234234234234234234234/nb-22-big-Index.db",
-        "/Keyspace/Table-34234234234234234234234234234234/nb-22-big-Index.db"
+        "/tmp/some/path/tests/Keyspace/Table-23424324234234/na-1-big-Index.db",
+        "/tmp/some/path/tests/Keyspace/Table-23424324234234/snapshots/snapshots/na-1-big-Index.db",
+        "/tmp/some/path/tests/Keyspace/Table-23424324234234/backups/na-1-big-Index.db",
+        "/tmp/tests/Keyspace/Table-23424324234234/na-1-big-Index.db",
+        "/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/Keyspace/Table-23424324234234/snapshots/snapshots/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/Keyspace/Table-23424324234234/backups/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/tests/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/Keyspace/Table-23424324234234/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db"
         };
 
         testKeyspaceTableParsing(outsideOfCassandraUppercaseKeyspaceAndTable, "Keyspace", "Table");
 
         String[] outsideOfCassandraIndexes = new String[]{
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/.index/na-1-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/.index/na-1-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/.index/na-1-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/.index/nb-22-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/snapshots/snapshots/.index/nb-22-big-Index.db",
-        "/tmp/some/path/tests/keyspace/table-34234234234234234234234234234234/backups/.index/nb-22-big-Index.db"
+        "/tmp/some/path/tests/keyspace/table-32423423423423/.index/na-1-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-32423423423423/snapshots/snapshots/.index/na-1-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-32423423423423/backups/.index/na-1-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-32423423423423/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-32423423423423/snapshots/snapshots/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db",
+        "/tmp/some/path/tests/keyspace/table-32423423423423/backups/.index/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db"
         };
 
         testKeyspaceTableParsing(outsideOfCassandraIndexes, "keyspace", "table.index");
 
         String[] counterFiles = new String[] {
         "/path/to/cassandra/data/dir2/dir6_other/Keyspace1/counter1-246467e01ea111ebbeafc3f73b4a4f2e/na-3-big-CRC.db",
-        "/path/to/cassandra/data/dir2/dir6_other/Keyspace1/counter1-246467e01ea111ebbeafc3f73b4a4f2e/nb-22-big-Index.db"
+        "/path/to/cassandra/data/dir2/dir6_other/Keyspace1/counter1-246467e01ea111ebbeafc3f73b4a4f2e/nb-3g1m_0nuf_3vj5m2k1125165rxa7-big-Index.db"
         };
 
         testKeyspaceTableParsing(counterFiles, "Keyspace1", "counter1");
diff --git a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java
index 05cbb0b..c494e3c 100644
--- a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryManagerTest.java
@@ -51,7 +51,7 @@
 import org.apache.cassandra.metrics.RestorableMeter;
 import org.apache.cassandra.schema.CachingParams;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
@@ -61,6 +61,7 @@
 import static org.apache.cassandra.io.sstable.Downsampling.BASE_SAMPLING_LEVEL;
 import static org.apache.cassandra.io.sstable.IndexSummaryRedistribution.DOWNSAMPLE_THESHOLD;
 import static org.apache.cassandra.io.sstable.IndexSummaryRedistribution.UPSAMPLE_THRESHOLD;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -121,8 +122,8 @@
         Keyspace keyspace = Keyspace.open(ksname);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(cfname);
 
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval).build(), true);
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(originalMaxIndexInterval).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval).build());
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(originalMaxIndexInterval).build());
 
         IndexSummaryManager.instance.setMemoryPoolCapacityInMB(originalCapacity);
     }
@@ -191,7 +192,7 @@
                     .build()
                     .applyUnsafe();
             }
-            futures.add(cfs.forceFlush());
+            futures.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS));
         }
         for (Future future : futures)
         {
@@ -227,7 +228,7 @@
             assertEquals(cfs.metadata().params.minIndexInterval, sstable.getEffectiveIndexInterval(), 0.001);
 
         // double the min_index_interval
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval * 2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval * 2).build());
         IndexSummaryManager.instance.redistributeSummaries();
         for (SSTableReader sstable : cfs.getLiveSSTables())
         {
@@ -236,7 +237,7 @@
         }
 
         // return min_index_interval to its original value
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval).build());
         IndexSummaryManager.instance.redistributeSummaries();
         for (SSTableReader sstable : cfs.getLiveSSTables())
         {
@@ -246,7 +247,7 @@
 
         // halve the min_index_interval, but constrain the available space to exactly what we have now; as a result,
         // the summary shouldn't change
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval / 2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval / 2).build());
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
         long summarySpace = sstable.getIndexSummaryOffHeapSize();
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(asList(sstable), OperationType.UNKNOWN))
@@ -271,7 +272,7 @@
 
         // return min_index_interval to it's original value (double it), but only give the summary enough space
         // to have an effective index interval of twice the new min
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval).build());
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(asList(sstable), OperationType.UNKNOWN))
         {
             redistributeSummaries(Collections.EMPTY_LIST, of(cfs.metadata.id, txn), (long) Math.ceil(summarySpace / 2.0));
@@ -283,8 +284,8 @@
         // raise the min_index_interval above our current effective interval, but set the max_index_interval lower
         // than what we actually have space for (meaning the index summary would ideally be smaller, but this would
         // result in an effective interval above the new max)
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval * 4).build(), true);
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(originalMinIndexInterval * 4).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval * 4).build());
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(originalMinIndexInterval * 4).build());
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(asList(sstable), OperationType.UNKNOWN))
         {
             redistributeSummaries(Collections.EMPTY_LIST, of(cfs.metadata.id, txn), 10);
@@ -317,7 +318,7 @@
             assertEquals(cfs.metadata().params.maxIndexInterval, sstable.getEffectiveIndexInterval(), 0.01);
 
         // halve the max_index_interval
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(cfs.metadata().params.maxIndexInterval / 2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(cfs.metadata().params.maxIndexInterval / 2).build());
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.UNKNOWN))
         {
             redistributeSummaries(Collections.EMPTY_LIST, of(cfs.metadata.id, txn), 1);
@@ -330,7 +331,7 @@
         }
 
         // return max_index_interval to its original value
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(cfs.metadata().params.maxIndexInterval * 2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().maxIndexInterval(cfs.metadata().params.maxIndexInterval * 2).build());
         try (LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.UNKNOWN))
         {
             redistributeSummaries(Collections.EMPTY_LIST, of(cfs.metadata.id, txn), 1);
@@ -516,7 +517,7 @@
             .applyUnsafe();
         }
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         List<SSTableReader> sstables = new ArrayList<>(cfs.getLiveSSTables());
         assertEquals(1, sstables.size());
@@ -584,7 +585,7 @@
                 .build()
                 .applyUnsafe();
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         assertTrue(manager.getAverageIndexInterval() >= cfs.metadata().params.minIndexInterval);
@@ -644,7 +645,7 @@
         {
             public CompactionInfo getCompactionInfo()
             {
-                return new CompactionInfo(cfs.metadata(), OperationType.UNKNOWN, 0, 0, UUID.randomUUID(), compacting);
+                return new CompactionInfo(cfs.metadata(), OperationType.UNKNOWN, 0, 0, nextTimeUUID(), compacting);
             }
 
             public boolean isGlobal()
@@ -656,7 +657,7 @@
         {
             CompactionManager.instance.active.beginCompaction(ongoingCompaction);
 
-            Thread t = NamedThreadFactory.createThread(new Runnable()
+            Thread t = NamedThreadFactory.createAnonymousThread(new Runnable()
             {
                 public void run()
                 {
diff --git a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryRedistributionTest.java b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryRedistributionTest.java
index 07a2212..57e4d4e 100644
--- a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryRedistributionTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryRedistributionTest.java
@@ -38,7 +38,7 @@
 import org.apache.cassandra.metrics.StorageMetrics;
 import org.apache.cassandra.schema.CachingParams;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 
 import static org.junit.Assert.assertEquals;
 
@@ -88,7 +88,7 @@
 
         int originalMinIndexInterval = cfs.metadata().params.minIndexInterval;
         // double the min_index_interval
-        MigrationManager.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval * 2).build(), true);
+        SchemaTestUtil.announceTableUpdate(cfs.metadata().unbuild().minIndexInterval(originalMinIndexInterval * 2).build());
         IndexSummaryManager.instance.redistributeSummaries();
 
         long newSize = 0;
@@ -125,7 +125,7 @@
                 .build()
                 .applyUnsafe();
             }
-            futures.add(cfs.forceFlush());
+            futures.add(cfs.forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS));
         }
         for (Future future : futures)
         {
diff --git a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java
index 01cd0dd..d0680f8 100644
--- a/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/IndexSummaryTest.java
@@ -42,6 +42,7 @@
 import static org.apache.cassandra.io.sstable.IndexSummaryBuilder.downsample;
 import static org.apache.cassandra.io.sstable.IndexSummaryBuilder.entriesAtSamplingLevel;
 import static org.apache.cassandra.io.sstable.Downsampling.BASE_SAMPLING_LEVEL;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.*;
 
 public class IndexSummaryTest
@@ -53,7 +54,7 @@
     {
         DatabaseDescriptor.daemonInitialization();
 
-        final long seed = System.nanoTime();
+        final long seed = nanoTime();
         System.out.println("Using seed: " + seed);
         random.setSeed(seed);
     }
@@ -63,7 +64,7 @@
     @BeforeClass
     public static void setup()
     {
-        final long seed = System.nanoTime();
+        final long seed = nanoTime();
         System.out.println("Using seed: " + seed);
         random.setSeed(seed);
     }
@@ -111,7 +112,7 @@
     }
 
     /**
-     * Test an index summary whose total size is bigger than 2GB,
+     * Test an index summary whose total size is bigger than 2GiB,
      * the index summary builder should log an error but it should still
      * create an index summary, albeit one that does not cover the entire sstable.
      */
@@ -145,7 +146,7 @@
     }
 
     /**
-     * Test an index summary whose total size is bigger than 2GB,
+     * Test an index summary whose total size is bigger than 2GiB,
      * having updated IndexSummaryBuilder.defaultExpectedKeySize to match the size,
      * the index summary should be downsampled automatically.
      */
diff --git a/test/unit/org/apache/cassandra/io/sstable/LargePartitionsTest.java b/test/unit/org/apache/cassandra/io/sstable/LargePartitionsTest.java
index 7ff7845..17fb0f2 100644
--- a/test/unit/org/apache/cassandra/io/sstable/LargePartitionsTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/LargePartitionsTest.java
@@ -59,24 +59,24 @@
         return new String(ch);
     }
 
-    private static final int rowKBytes = 8;
+    private static final int rowKibibytes = 8;
 
-    private void withPartitionSize(long partitionKBytes, long totalMBytes) throws Throwable
+    private void withPartitionSize(long partitionKibibytes, long totalMBytes) throws Throwable
     {
-        long totalKBytes = totalMBytes * 1024L;
+        long totalKibibytes = totalMBytes * 1024L;
 
         createTable("CREATE TABLE %s (pk text, ck text, val text, PRIMARY KEY (pk, ck))");
 
-        String name = "part=" + partitionKBytes + "k total=" + totalMBytes + 'M';
+        String name = "part=" + partitionKibibytes + "k total=" + totalMBytes + 'M';
 
         measured("INSERTs for " + name, () -> {
-            for (long writtenKBytes = 0L; writtenKBytes < totalKBytes; writtenKBytes += partitionKBytes)
+            for (long writtenKibibytes = 0L; writtenKibibytes < totalKibibytes; writtenKibibytes += partitionKibibytes)
             {
-                String pk = Long.toBinaryString(writtenKBytes);
-                for (long kbytes = 0L; kbytes < partitionKBytes; kbytes += rowKBytes)
+                String pk = Long.toBinaryString(writtenKibibytes);
+                for (long kibibytes = 0L; kibibytes < partitionKibibytes; kibibytes += rowKibibytes)
                 {
-                    String ck = Long.toBinaryString(kbytes);
-                    execute("INSERT INTO %s (pk, ck, val) VALUES (?,?,?)", pk, ck, randomText(rowKBytes * 1024));
+                    String ck = Long.toBinaryString(kibibytes);
+                    execute("INSERT INTO %s (pk, ck, val) VALUES (?,?,?)", pk, ck, randomText(rowKibibytes * 1024));
                 }
             }
         });
@@ -91,20 +91,20 @@
             keyCacheMetrics("after compaction");
         });
 
-        measured("SELECTs 1 for " + name, () -> selects(partitionKBytes, totalKBytes));
+        measured("SELECTs 1 for " + name, () -> selects(partitionKibibytes, totalKibibytes));
 
-        measured("SELECTs 2 for " + name, () -> selects(partitionKBytes, totalKBytes));
+        measured("SELECTs 2 for " + name, () -> selects(partitionKibibytes, totalKibibytes));
 
         CacheService.instance.keyCache.clear();
-        measured("Scan for " + name, () -> scan(partitionKBytes, totalKBytes));
+        measured("Scan for " + name, () -> scan(partitionKibibytes, totalKibibytes));
     }
 
-    private void selects(long partitionKBytes, long totalKBytes) throws Throwable
+    private void selects(long partitionKibibytes, long totalKibibytes) throws Throwable
     {
         for (int i = 0; i < 50000; i++)
         {
-            long pk = ThreadLocalRandom.current().nextLong(totalKBytes / partitionKBytes) * partitionKBytes;
-            long ck = ThreadLocalRandom.current().nextLong(partitionKBytes / rowKBytes) * rowKBytes;
+            long pk = ThreadLocalRandom.current().nextLong(totalKibibytes / partitionKibibytes) * partitionKibibytes;
+            long ck = ThreadLocalRandom.current().nextLong(partitionKibibytes / rowKibibytes) * rowKibibytes;
             execute("SELECT val FROM %s WHERE pk=? AND ck=?",
                     Long.toBinaryString(pk),
                     Long.toBinaryString(ck)).one();
@@ -114,9 +114,9 @@
         keyCacheMetrics("after all selects");
     }
 
-    private void scan(long partitionKBytes, long totalKBytes) throws Throwable
+    private void scan(long partitionKibibytes, long totalKibibytes) throws Throwable
     {
-        long pk = ThreadLocalRandom.current().nextLong(totalKBytes / partitionKBytes) * partitionKBytes;
+        long pk = ThreadLocalRandom.current().nextLong(totalKibibytes / partitionKibibytes) * partitionKibibytes;
         Iterator<UntypedResultSet.Row> iter = execute("SELECT val FROM %s WHERE pk=?", Long.toBinaryString(pk)).iterator();
         int i = 0;
         while (iter.hasNext())
diff --git a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java
index 579fc15..063afe5 100644
--- a/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/LegacySSTableTest.java
@@ -17,19 +17,20 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
+
 import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Random;
-import java.util.UUID;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Iterables;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -41,47 +42,38 @@
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.cql3.QueryOptions;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
-import org.apache.cassandra.cql3.statements.SelectStatement;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.compaction.AbstractCompactionTask;
 import org.apache.cassandra.db.compaction.CompactionManager;
-import org.apache.cassandra.db.compaction.Verifier;
 import org.apache.cassandra.db.repair.PendingAntiCompaction;
 import org.apache.cassandra.db.streaming.CassandraOutgoingFile;
-import org.apache.cassandra.db.ReadExecutionController;
-import org.apache.cassandra.db.SinglePartitionReadCommand;
 import org.apache.cassandra.db.SinglePartitionSliceCommandTest;
 import org.apache.cassandra.db.compaction.Verifier;
-import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
 import org.apache.cassandra.db.rows.RangeTombstoneMarker;
 import org.apache.cassandra.db.rows.Unfiltered;
-import org.apache.cassandra.db.rows.UnfilteredRowIterator;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.sstable.format.big.BigFormat;
-import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.service.CacheService;
-import org.apache.cassandra.service.ClientState;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.streaming.OutgoingStream;
 import org.apache.cassandra.streaming.StreamPlan;
-import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
+import static java.util.Collections.singleton;
 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;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -124,7 +116,7 @@
         String scp = System.getProperty(LEGACY_SSTABLE_PROP);
         Assert.assertNotNull("System property " + LEGACY_SSTABLE_PROP + " not set", scp);
 
-        LEGACY_SSTABLE_ROOT = new File(scp).getAbsoluteFile();
+        LEGACY_SSTABLE_ROOT = new File(scp).toAbsolute();
         Assert.assertTrue("System property " + LEGACY_SSTABLE_ROOT + " does not specify a directory", LEGACY_SSTABLE_ROOT.isDirectory());
 
         SchemaLoader.prepareServer();
@@ -150,14 +142,10 @@
     /**
      * Get a descriptor for the legacy sstable at the given version.
      */
-    protected Descriptor getDescriptor(String legacyVersion, String table)
+    protected Descriptor getDescriptor(String legacyVersion, String table) throws IOException
     {
-        return new Descriptor(SSTableFormat.Type.BIG.info.getVersion(legacyVersion),
-                              getTableDir(legacyVersion, table),
-                              "legacy_tables",
-                              table,
-                              1,
-                              SSTableFormat.Type.BIG);
+        Path file = Files.list(getTableDir(legacyVersion, table).toPath()).findFirst().orElseThrow(() -> new RuntimeException(String.format("No files for version=%s and table=%s", legacyVersion, table)));
+        return Descriptor.fromFilename(new File(file));
     }
 
     @Test
@@ -201,7 +189,7 @@
                 boolean isTransient = false;
                 for (SSTableReader sstable : cfs.getLiveSSTables())
                 {
-                    UUID random = UUID.randomUUID();
+                    TimeUUID random = nextTimeUUID();
                     sstable.descriptor.getMetadataSerializer().mutateRepairMetadata(sstable.descriptor, UNREPAIRED_SSTABLE, random, isTransient);
                     sstable.reloadSSTableMetadata();
                     assertEquals(UNREPAIRED_SSTABLE, sstable.getRepairedAt());
@@ -233,7 +221,7 @@
                 // set pending
                 for (SSTableReader sstable : cfs.getLiveSSTables())
                 {
-                    UUID random = UUID.randomUUID();
+                    TimeUUID random = nextTimeUUID();
                     try
                     {
                         cfs.getCompactionStrategyManager().mutateRepaired(Collections.singleton(sstable), UNREPAIRED_SSTABLE, random, false);
@@ -251,7 +239,7 @@
                 {
                     try
                     {
-                        cfs.getCompactionStrategyManager().mutateRepaired(Collections.singleton(sstable), UNREPAIRED_SSTABLE, UUID.randomUUID(), true);
+                        cfs.getCompactionStrategyManager().mutateRepaired(Collections.singleton(sstable), UNREPAIRED_SSTABLE, nextTimeUUID(), true);
                         if (!sstable.descriptor.version.hasIsTransient())
                             fail("We should fail setting pending repair on unsupported sstables "+sstable);
                     }
@@ -379,7 +367,7 @@
             boolean shouldFail = !cfs.getLiveSSTables().stream().allMatch(sstable -> sstable.descriptor.version.hasPendingRepair());
             IPartitioner p = Iterables.getFirst(cfs.getLiveSSTables(), null).getPartitioner();
             Range<Token> r = new Range<>(p.getMinimumToken(), p.getMinimumToken());
-            PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, Collections.singleton(r), UUIDGen.getTimeUUID(), 0, 0);
+            PendingAntiCompaction.AcquisitionCallable acquisitionCallable = new PendingAntiCompaction.AcquisitionCallable(cfs, singleton(r), nextTimeUUID(), 0, 0);
             PendingAntiCompaction.AcquireResult res = acquisitionCallable.call();
             assertEquals(shouldFail, res == null);
             if (res != null)
@@ -645,10 +633,10 @@
             }
         }
 
-        StorageService.instance.forceKeyspaceFlush("legacy_tables");
+        StorageService.instance.forceKeyspaceFlush("legacy_tables", ColumnFamilyStore.FlushReason.UNIT_TESTS);
 
         File ksDir = new File(LEGACY_SSTABLE_ROOT, String.format("%s/legacy_tables", BigFormat.latestVersion));
-        ksDir.mkdirs();
+        ksDir.tryCreateDirectories();
         copySstablesFromTestData(String.format("legacy_%s_simple", BigFormat.latestVersion), ksDir);
         copySstablesFromTestData(String.format("legacy_%s_simple_counter", BigFormat.latestVersion), ksDir);
         copySstablesFromTestData(String.format("legacy_%s_clust", BigFormat.latestVersion), ksDir);
@@ -658,11 +646,11 @@
     public static void copySstablesFromTestData(String table, File ksDir) throws IOException
     {
         File cfDir = new File(ksDir, table);
-        cfDir.mkdir();
+        cfDir.tryCreateDirectory();
 
         for (File srcDir : Keyspace.open("legacy_tables").getColumnFamilyStore(table).getDirectories().getCFDirectories())
         {
-            for (File file : srcDir.listFiles())
+            for (File file : srcDir.tryList())
             {
                 copyFile(cfDir, file);
             }
@@ -673,7 +661,7 @@
     {
         File tableDir = getTableDir(legacyVersion, table);
         Assert.assertTrue("The table directory " + tableDir + " was not found", tableDir.isDirectory());
-        for (File file : tableDir.listFiles())
+        for (File file : tableDir.tryList())
         {
             copyFile(cfDir, file);
         }
@@ -689,10 +677,10 @@
         byte[] buf = new byte[65536];
         if (file.isFile())
         {
-            File target = new File(cfDir, file.getName());
+            File target = new File(cfDir, file.name());
             int rd;
-            try (FileInputStream is = new FileInputStream(file);
-                 FileOutputStream os = new FileOutputStream(target);) {
+            try (FileInputStreamPlus is = new FileInputStreamPlus(file);
+                 FileOutputStreamPlus os = new FileOutputStreamPlus(target);) {
                 while ((rd = is.read(buf)) >= 0)
                     os.write(buf, 0, rd);
                 }
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java
index 2510c5e..ec01865 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableCorruptionDetectionTest.java
@@ -18,10 +18,9 @@
 
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
 import java.util.*;
 import java.util.function.*;
 
@@ -47,6 +46,7 @@
 import org.apache.cassandra.io.util.*;
 import org.apache.cassandra.schema.*;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -95,7 +95,7 @@
         maxValueSize = DatabaseDescriptor.getMaxValueSize();
         DatabaseDescriptor.setMaxValueSize(1024 * 1024);
 
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         logger.info("Seed {}", seed);
         random = new Random(seed);
 
@@ -117,7 +117,7 @@
                    .add("reg2", ByteBuffer.wrap(reg2));
             writer.append(builder.build().unfilteredIterator());
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         ssTableReader = writer.finish(true);
         txn.update(ssTableReader, false);
@@ -148,18 +148,18 @@
 
     private void bruteForceCorruptionTest(SSTableReader ssTableReader, Consumer<SSTableReader> walker) throws Throwable
     {
-        RandomAccessFile raf = new RandomAccessFile(ssTableReader.getFilename(), "rw");
+        FileChannel fc = new File(ssTableReader.getFilename()).newReadWriteChannel();
 
         int corruptedCounter = 0;
 
-        int fileLength = (int)raf.length(); // in current test, it does fit into int
+        int fileLength = (int)fc.size(); // in current test, it does fit into int
         for (int i = 0; i < numberOfRuns; i++)
         {
             final int corruptionPosition = random.nextInt(fileLength - 1); //ensure at least one byte will be corrupted
             // corrupt max from position to end of file
             final int corruptionSize = Math.min(maxCorruptionSize, random.nextInt(fileLength - corruptionPosition));
 
-            byte[] backup = corruptSstable(raf, corruptionPosition, corruptionSize);
+            byte[] backup = corruptSstable(fc, corruptionPosition, corruptionSize);
 
             try
             {
@@ -174,12 +174,12 @@
                 if (ChunkCache.instance != null)
                     ChunkCache.instance.invalidateFile(ssTableReader.getFilename());
 
-                restore(raf, corruptionPosition, backup);
+                restore(fc, corruptionPosition, backup);
             }
         }
 
         assertTrue(corruptedCounter > 0);
-        FileUtils.closeQuietly(raf);
+        FileUtils.closeQuietly(fc);
     }
 
     private Consumer<SSTableReader> sstableScanner()
@@ -214,11 +214,11 @@
             for (int i = 0; i < numberOfPks; i++)
             {
                 DecoratedKey dk = Util.dk(String.format("pkvalue_%07d", i));
-                try (UnfilteredRowIterator rowIter = sstable.iterator(dk,
-                                                                      Slices.ALL,
-                                                                      ColumnFilter.all(cfs.metadata()),
-                                                                      false,
-                                                                      SSTableReadsListener.NOOP_LISTENER))
+                try (UnfilteredRowIterator rowIter = sstable.rowIterator(dk,
+                                                                         Slices.ALL,
+                                                                         ColumnFilter.all(cfs.metadata()),
+                                                                         false,
+                                                                         SSTableReadsListener.NOOP_LISTENER))
                 {
                     while (rowIter.hasNext())
                     {
@@ -230,29 +230,28 @@
                             // no-op read
                         }
                     }
-                    rowIter.close();
                 }
             }
         };
     }
 
-    private byte[] corruptSstable(RandomAccessFile raf, int position, int corruptionSize) throws IOException
+    private byte[] corruptSstable(FileChannel fc, int position, int corruptionSize) throws IOException
     {
         byte[] backup = new byte[corruptionSize];
-        raf.seek(position);
-        raf.read(backup);
+        fc.position(position);
+        fc.read(ByteBuffer.wrap(backup));
 
-        raf.seek(position);
+        fc.position(position);
         byte[] corruption = new byte[corruptionSize];
         random.nextBytes(corruption);
-        raf.write(corruption);
+        fc.write(ByteBuffer.wrap(corruption));
 
         return backup;
     }
 
-    private void restore(RandomAccessFile raf, int position, byte[] backup) throws IOException
+    private void restore(FileChannel fc, int position, byte[] backup) throws IOException
     {
-        raf.seek(position);
-        raf.write(backup);
+        fc.position(position);
+        fc.write(ByteBuffer.wrap(backup));
     }
 }
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableHeaderFixTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableHeaderFixTest.java
index d07187b..4572e5c 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableHeaderFixTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableHeaderFixTest.java
@@ -17,24 +17,29 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.function.Function;
+import java.util.function.Supplier;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import com.google.common.collect.Sets;
+import org.apache.cassandra.io.util.File;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.ColumnIdentifier;
@@ -62,6 +67,7 @@
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.SequentialWriter;
 import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.MockSchema;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.IndexMetadata;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -76,6 +82,7 @@
  * Test the functionality of {@link SSTableHeaderFix}.
  * It writes an 'big-m' version sstable(s) and executes against these.
  */
+@RunWith(Parameterized.class)
 public class SSTableHeaderFixTest
 {
     static
@@ -85,12 +92,23 @@
 
     private File temporaryFolder;
 
+    @Parameterized.Parameter
+    public Supplier<? extends SSTableId> sstableIdGen;
+
+    @Parameterized.Parameters
+    public static Collection<Object[]> parameters()
+    {
+        return MockSchema.sstableIdGenerators();
+    }
+
     @Before
     public void setup()
     {
+        MockSchema.sstableIds.clear();
+        MockSchema.sstableIdGenerator = sstableIdGen;
         File f = FileUtils.createTempFile("SSTableUDTFixTest", "");
-        f.delete();
-        f.mkdirs();
+        f.tryDelete();
+        f.tryCreateDirectories();
         temporaryFolder = f;
     }
 
@@ -735,6 +753,20 @@
         }
     }
 
+    @Test
+    public void ignoresStaleFilesTest() throws Exception
+    {
+        File dir = temporaryFolder;
+        IntStream.range(1, 2).forEach(g -> generateFakeSSTable(dir, g));
+
+        File newFile = new File(dir.toAbsolute(), "something_something-something.something");
+        Assert.assertTrue(newFile.createFileIfNotExists());
+
+        SSTableHeaderFix headerFix = builder().withPath(dir.toPath())
+                                              .build();
+        headerFix.execute();
+    }
+
     private static final Pattern p = Pattern.compile(".* Column '([^']+)' needs to be updated from type .*");
 
     private SSTableHeaderFix.Builder builder()
@@ -790,11 +822,11 @@
         try
         {
 
-            Descriptor desc = new Descriptor(version, dir, "ks", "cf", generation, SSTableFormat.Type.BIG);
+            Descriptor desc = new Descriptor(version, dir, "ks", "cf", MockSchema.sstableId(generation), SSTableFormat.Type.BIG);
 
             // Just create the component files - we don't really need those.
             for (Component component : requiredComponents)
-                assertTrue(new File(desc.filenameFor(component)).createNewFile());
+                assertTrue(new File(desc.filenameFor(component)).createFileIfNotExists());
 
             AbstractType<?> partitionKey = headerMetadata.partitionKeyType;
             List<AbstractType<?>> clusteringKey = headerMetadata.clusteringColumns()
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableIdTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableIdTest.java
new file mode 100644
index 0000000..82fbf32
--- /dev/null
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableIdTest.java
@@ -0,0 +1,172 @@
+/*
+ * 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.io.sstable;
+
+import java.nio.ByteBuffer;
+import java.time.Duration;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.function.Supplier;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import com.google.common.collect.Sets;
+import com.google.common.primitives.UnsignedBytes;
+import org.junit.Test;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.utils.TimeUUID;
+import org.awaitility.Awaitility;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.quicktheories.QuickTheory.qt;
+import static org.quicktheories.generators.SourceDSL.longs;
+
+public class SSTableIdTest
+{
+    @Test
+    public void testSequenceBasedIdProperties()
+    {
+        testSSTableIdProperties(SequenceBasedSSTableId.Builder.instance);
+    }
+
+    @Test
+    public void testUUIDBasedIdProperties()
+    {
+        testSSTableIdProperties(UUIDBasedSSTableId.Builder.instance);
+    }
+
+    private void testSSTableIdProperties(SSTableId.Builder<?> builder)
+    {
+        List<SSTableId> ids = Stream.generate(builder.generator(Stream.empty()))
+                                    .limit(100).collect(Collectors.toList());
+        assertThat(ids).isSorted();
+        assertThat(Sets.newHashSet(ids)).hasSameSizeAs(ids);
+
+        List<ByteBuffer> serIds = ids.stream().map(SSTableId::asBytes).collect(Collectors.toList());
+        assertThat(serIds).isSortedAccordingTo((o1, o2) -> UnsignedBytes.lexicographicalComparator().compare(o1.array(), o2.array()));
+
+        List<SSTableId> deserIds = serIds.stream().map(builder::fromBytes).collect(Collectors.toList());
+        assertThat(deserIds).containsExactlyElementsOf(ids);
+
+        List<String> stringifiedIds = ids.stream().map(SSTableId::toString).collect(Collectors.toList());
+        if (!(builder instanceof SequenceBasedSSTableId.Builder))
+        {
+            // the legacy string representation is not sortable
+            assertThat(stringifiedIds).isSorted();
+        }
+
+        List<SSTableId> destringifiedIds = stringifiedIds.stream().map(builder::fromString).collect(Collectors.toList());
+        assertThat(destringifiedIds).containsExactlyElementsOf(ids);
+
+        generatorFuzzTest(builder);
+    }
+
+    @Test
+    public void testUUIDBytesSerDe()
+    {
+        qt().forAll(longs().all(), longs().all()).checkAssert((msb, lsb) -> {
+            msb = (msb & ~0xf000) | 0x1000; // v1
+            TimeUUID uuid = TimeUUID.fromBytes(msb, lsb);
+            UUIDBasedSSTableId id = new UUIDBasedSSTableId(uuid);
+
+            testBytesSerialization(id);
+            testStringSerialization(id);
+        });
+    }
+
+    private void testBytesSerialization(UUIDBasedSSTableId id)
+    {
+        ByteBuffer buf = id.asBytes();
+        assertThat(buf.remaining()).isEqualTo(UUIDBasedSSTableId.BYTES_LEN);
+        assertThat(UUIDBasedSSTableId.Builder.instance.isUniqueIdentifier(buf)).isTrue();
+        assertThat(SequenceBasedSSTableId.Builder.instance.isUniqueIdentifier(buf)).isFalse();
+        SSTableId fromBytes = SSTableIdFactory.instance.fromBytes(buf);
+        assertThat(fromBytes).isEqualTo(id);
+    }
+
+    private void testStringSerialization(UUIDBasedSSTableId id)
+    {
+        String s = id.toString();
+        assertThat(s).hasSize(UUIDBasedSSTableId.STRING_LEN);
+        assertThat(s).matches(Pattern.compile("[0-9a-z]{4}_[0-9a-z]{4}_[0-9a-z]{18}"));
+        assertThat(UUIDBasedSSTableId.Builder.instance.isUniqueIdentifier(s)).isTrue();
+        assertThat(SequenceBasedSSTableId.Builder.instance.isUniqueIdentifier(s)).isFalse();
+        SSTableId fromString = SSTableIdFactory.instance.fromString(s);
+        assertThat(fromString).isEqualTo(id);
+    }
+
+    @Test
+    public void testComparator()
+    {
+        List<SSTableId> ids = new ArrayList<>(Collections.nCopies(300, null));
+        for (int i = 0; i < 100; i++)
+        {
+            ids.set(i + 100, new SequenceBasedSSTableId(ThreadLocalRandom.current().nextInt(1000000)));
+            ids.set(i, new UUIDBasedSSTableId(TimeUUID.Generator.atUnixMillis(ThreadLocalRandom.current().nextLong(10000), 0)));
+        }
+
+        List<SSTableId> shuffledIds = new ArrayList<>(ids);
+        Collections.shuffle(shuffledIds);
+        assertThat(shuffledIds).isNotEqualTo(ids);
+
+        List<SSTableId> sortedIds = new ArrayList<>(shuffledIds);
+        sortedIds.sort(SSTableIdFactory.COMPARATOR);
+        assertThat(sortedIds).isNotEqualTo(shuffledIds);
+        assertThat(sortedIds).isSortedAccordingTo(SSTableIdFactory.COMPARATOR);
+
+        assertThat(sortedIds.subList(0, 100)).containsOnlyNulls();
+        assertThat(sortedIds.subList(100, 200)).allMatch(id -> id instanceof SequenceBasedSSTableId);
+        assertThat(sortedIds.subList(200, 300)).allMatch(id -> id instanceof UUIDBasedSSTableId);
+
+        assertThat(sortedIds.subList(100, 200)).isSortedAccordingTo(Comparator.comparing(o -> ((SequenceBasedSSTableId) o)));
+        assertThat(sortedIds.subList(200, 300)).isSortedAccordingTo(Comparator.comparing(o -> ((UUIDBasedSSTableId) o)));
+    }
+
+    private static <T extends SSTableId> void generatorFuzzTest(SSTableId.Builder<T> builder)
+    {
+        final int NUM_THREADS = 10, IDS_PER_THREAD = 10;
+        Set<SSTableId> ids = new CopyOnWriteArraySet<>();
+        Supplier<T> generator = builder.generator(Stream.empty());
+        ExecutorPlus service = executorFactory().pooled("test", NUM_THREADS);
+        CyclicBarrier barrier = new CyclicBarrier(NUM_THREADS);
+        for (int i = 0; i < NUM_THREADS; i++)
+        {
+            service.submit(() -> {
+                for (int k = 0; k < IDS_PER_THREAD; k++)
+                {
+                    barrier.await();
+                    ids.add(generator.get());
+                }
+                return null;
+            });
+        }
+
+        Awaitility.await().atMost(Duration.ofSeconds(10)).untilAsserted(() -> assertThat(service.getCompletedTaskCount()).isEqualTo(NUM_THREADS));
+        assertThat(ids).hasSize(NUM_THREADS * IDS_PER_THREAD);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java
index b187704..c2403dd 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableLoaderTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
@@ -25,6 +24,7 @@
 
 import com.google.common.io.Files;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -33,7 +33,6 @@
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.Util;
 import org.apache.cassandra.locator.Replica;
-import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.TableMetadataRef;
 import org.apache.cassandra.schema.Schema;
@@ -90,7 +89,7 @@
     @Before
     public void setup() throws Exception
     {
-        tmpdir = Files.createTempDir();
+        tmpdir = new File(Files.createTempDir());
     }
 
     @After
@@ -100,7 +99,6 @@
             FileUtils.deleteRecursive(tmpdir);
         } catch (FSWriteError e) {
             /*
-              Windows does not allow a mapped file to be deleted, so we probably forgot to clean the buffers somewhere.
               We force a GC here to force buffer deallocation, and then try deleting the directory again.
               For more information, see: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=4715154
               If this is not the problem, the exception will be rethrown anyway.
@@ -143,7 +141,7 @@
         }
 
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1);
-        cfs.forceBlockingFlush(); // wait for sstables to be on disk else we won't be able to stream them
+        Util.flush(cfs); // wait for sstables to be on disk else we won't be able to stream them
 
         final CountDownLatch latch = new CountDownLatch(1);
         SSTableLoader loader = new SSTableLoader(dataDir, new TestClient(), new OutputHandler.SystemOutput(false, false));
@@ -175,7 +173,7 @@
                                                   .withBufferSizeInMB(1)
                                                   .build();
 
-        int NB_PARTITIONS = 5000; // Enough to write >1MB and get at least one completed sstable before we've closed the writer
+        int NB_PARTITIONS = 5000; // Enough to write >1MiB and get at least one completed sstable before we've closed the writer
 
         for (int i = 0; i < NB_PARTITIONS; i++)
         {
@@ -184,10 +182,10 @@
         }
 
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD2);
-        cfs.forceBlockingFlush(); // wait for sstables to be on disk else we won't be able to stream them
+        Util.flush(cfs); // wait for sstables to be on disk else we won't be able to stream them
 
         //make sure we have some tables...
-        assertTrue(Objects.requireNonNull(dataDir.listFiles()).length > 0);
+        assertTrue(Objects.requireNonNull(dataDir.tryList()).length > 0);
 
         final CountDownLatch latch = new CountDownLatch(2);
         //writer is still open so loader should not load anything
@@ -215,8 +213,8 @@
     @Test
     public void testLoadingSSTableToDifferentKeyspace() throws Exception
     {
-        File dataDir = new File(tmpdir.getAbsolutePath() + File.separator + KEYSPACE1 + File.separator + CF_STANDARD1);
-        assert dataDir.mkdirs();
+        File dataDir = new File(tmpdir.absolutePath() + File.pathSeparator() + KEYSPACE1 + File.pathSeparator() + CF_STANDARD1);
+        assert dataDir.tryCreateDirectories();
         TableMetadata metadata = Schema.instance.getTableMetadata(KEYSPACE1, CF_STANDARD1);
 
         String schema = "CREATE TABLE %s.%s (key ascii, name ascii, val ascii, val1 ascii, PRIMARY KEY (key, name))";
@@ -232,14 +230,14 @@
         }
 
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD1);
-        cfs.forceBlockingFlush(); // wait for sstables to be on disk else we won't be able to stream them
+        Util.flush(cfs); // wait for sstables to be on disk else we won't be able to stream them
 
         final CountDownLatch latch = new CountDownLatch(1);
         SSTableLoader loader = new SSTableLoader(dataDir, new TestClient(), new OutputHandler.SystemOutput(false, false), 1, KEYSPACE2);
         loader.stream(Collections.emptySet(), completionStreamListener(latch)).get();
 
         cfs = Keyspace.open(KEYSPACE2).getColumnFamilyStore(CF_STANDARD1);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         List<FilteredPartition> partitions = Util.getAll(Util.cmd(cfs).build());
 
@@ -269,24 +267,7 @@
 
     private void testLoadingTable(String tableName) throws Exception
     {
-        testLoadingTable(CF_BACKUPS, false);
-    }
-
-    @Test
-    public void testLoadingLegacyBackupsTable() throws Exception
-    {
-        testLoadingTable(CF_BACKUPS, true);
-    }
-
-    @Test
-    public void testLoadingLegacySnapshotsTable() throws Exception
-    {
-        testLoadingTable(CF_SNAPSHOTS, true);
-    }
-
-    private void testLoadingTable(String tableName, boolean isLegacyTable) throws Exception
-    {
-        File dataDir = dataDir(tableName, isLegacyTable);
+        File dataDir = dataDir(tableName);
         TableMetadata metadata = Schema.instance.getTableMetadata(KEYSPACE1, tableName);
 
         try (CQLSSTableWriter writer = CQLSSTableWriter.builder()
@@ -299,7 +280,7 @@
         }
 
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(tableName);
-        cfs.forceBlockingFlush(); // wait for sstables to be on disk else we won't be able to stream them
+        Util.flush(cfs); // wait for sstables to be on disk else we won't be able to stream them
 
         final CountDownLatch latch = new CountDownLatch(1);
         SSTableLoader loader = new SSTableLoader(dataDir, new TestClient(), new OutputHandler.SystemOutput(false, false));
@@ -321,17 +302,10 @@
 
     private File dataDir(String cf)
     {
-        return dataDir(cf, false);
-    }
-
-    private File dataDir(String cf, boolean isLegacyTable)
-    {
-        // Add -{tableUuid} suffix to table dir if not a legacy table
-        File dataDir = new File(tmpdir.getAbsolutePath() + File.separator + SSTableLoaderTest.KEYSPACE1 + File.separator + cf
-                                + (isLegacyTable ? "" : String.format("-%s", TableId.generate().toHexString())));
-        assert dataDir.mkdirs();
+        File dataDir = new File(tmpdir.absolutePath() + File.pathSeparator() + SSTableLoaderTest.KEYSPACE1 + File.pathSeparator() + cf);
+        assert dataDir.tryCreateDirectories();
         //make sure we have no tables...
-        assertEquals(Objects.requireNonNull(dataDir.listFiles()).length, 0);
+        assertEquals(Objects.requireNonNull(dataDir.tryList()).length, 0);
         return dataDir;
     }
 
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java
index aecddf9..2e5a17a 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableMetadataTest.java
@@ -95,7 +95,7 @@
             .build()
             .applyUnsafe();
 
-        store.forceBlockingFlush();
+        Util.flush(store);
         assertEquals(1, store.getLiveSSTables().size());
         int ttltimestamp = (int) (System.currentTimeMillis() / 1000);
         int firstDelTime = 0;
@@ -113,7 +113,7 @@
         .applyUnsafe();
 
         ttltimestamp = (int) (System.currentTimeMillis() / 1000);
-        store.forceBlockingFlush();
+        Util.flush(store);
         assertEquals(2, store.getLiveSSTables().size());
         List<SSTableReader> sstables = new ArrayList<>(store.getLiveSSTables());
         if (sstables.get(0).getSSTableMetadata().maxLocalDeletionTime < sstables.get(1).getSSTableMetadata().maxLocalDeletionTime)
@@ -163,7 +163,7 @@
         .build()
         .applyUnsafe();
 
-        store.forceBlockingFlush();
+        Util.flush(store);
         assertEquals(1, store.getLiveSSTables().size());
         int ttltimestamp = (int) (System.currentTimeMillis() / 1000);
         int firstMaxDelTime = 0;
@@ -175,7 +175,7 @@
 
         RowUpdateBuilder.deleteRow(store.metadata(), timestamp + 1, "deletetest", "todelete").applyUnsafe();
 
-        store.forceBlockingFlush();
+        Util.flush(store);
         assertEquals(2, store.getLiveSSTables().size());
         boolean foundDelete = false;
         for (SSTableReader sstable : store.getLiveSSTables())
@@ -212,7 +212,7 @@
                     .applyUnsafe();
             }
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         assertEquals(1, store.getLiveSSTables().size());
         for (SSTableReader sstable : store.getLiveSSTables())
         {
@@ -233,7 +233,7 @@
             .applyUnsafe();
         }
 
-        store.forceBlockingFlush();
+        Util.flush(store);
         store.forceMajorCompaction();
         assertEquals(1, store.getLiveSSTables().size());
         for (SSTableReader sstable : store.getLiveSSTables())
@@ -260,7 +260,7 @@
         ColumnFamily cells = ArrayBackedSortedColumns.factory.create(cfs.metadata);
         cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE));
         new Mutation(Util.dk("k").getKey(), cells).applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertTrue(cfs.getLiveSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards);
         cfs.truncateBlocking();
 
@@ -271,7 +271,7 @@
         cells = ArrayBackedSortedColumns.factory.create(cfs.metadata);
         cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE));
         new Mutation(Util.dk("k").getKey(), cells).applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertTrue(cfs.getLiveSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards);
         cfs.truncateBlocking();
 
@@ -282,7 +282,7 @@
         cells = ArrayBackedSortedColumns.factory.create(cfs.metadata);
         cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE));
         new Mutation(Util.dk("k").getKey(), cells).applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertTrue(cfs.getLiveSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards);
         cfs.truncateBlocking();
 
@@ -292,7 +292,7 @@
         cells = ArrayBackedSortedColumns.factory.create(cfs.metadata);
         cells.addColumn(new BufferCounterCell(cellname("col"), state.context, 1L, Long.MIN_VALUE));
         new Mutation(Util.dk("k").getKey(), cells).applyUnsafe();
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertFalse(cfs.getLiveSSTables().iterator().next().getSSTableMetadata().hasLegacyCounterShards);
         cfs.truncateBlocking();
     } */
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java
index 1246130..f064f19 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableReaderTest.java
@@ -17,15 +17,16 @@
  */
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.*;
 import java.util.concurrent.*;
+import java.util.stream.Stream;
 
 import com.google.common.collect.Sets;
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
@@ -123,7 +124,7 @@
                 .build()
                 .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         List<Range<Token>> ranges = new ArrayList<>();
@@ -167,7 +168,7 @@
                 .build()
                 .applyUnsafe();
             }
-            store.forceBlockingFlush();
+            Util.flush(store);
             CompactionManager.instance.performMaximal(store, false);
 
             // check that all our keys are found correctly
@@ -207,7 +208,7 @@
             .build()
             .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         clearAndLoad(store);
         assert store.metric.maxPartitionSize.getValue() != 0;
@@ -235,7 +236,7 @@
             .applyUnsafe();
         }
 
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
         assertEquals(0, sstable.getReadMeter().count());
@@ -266,7 +267,7 @@
             .applyUnsafe();
 
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
@@ -297,7 +298,7 @@
             .build()
             .applyUnsafe();
 
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         // check if opening and querying works
         assertIndexQueryWorks(store);
@@ -319,7 +320,7 @@
             .build()
             .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
@@ -354,7 +355,7 @@
                     .build()
                     .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
@@ -421,7 +422,7 @@
                 .build()
                 .applyUnsafe();
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
         Descriptor desc = sstable.descriptor;
@@ -485,7 +486,7 @@
         // check that only the summary is regenerated when it is deleted
         components.add(Component.FILTER);
         summaryModified = Files.getLastModifiedTime(summaryPath).toMillis();
-        summaryFile.delete();
+        summaryFile.tryDelete();
 
         TimeUnit.MILLISECONDS.sleep(1000); // sleep to ensure modified time will be different
         bloomModified = Files.getLastModifiedTime(bloomPath).toMillis();
@@ -522,7 +523,7 @@
         .build()
         .applyUnsafe();
 
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         for(ColumnFamilyStore indexCfs : store.indexManager.getAllIndexColumnFamilyStores())
         {
@@ -550,7 +551,7 @@
             .build()
             .applyUnsafe();
 
-        store.forceBlockingFlush();
+        Util.flush(store);
         boolean foundScanner = false;
         for (SSTableReader s : store.getLiveSSTables())
         {
@@ -582,7 +583,7 @@
             .applyUnsafe();
 
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         // construct a range which is present in the sstable, but whose
@@ -619,7 +620,7 @@
             .applyUnsafe();
 
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         Collection<SSTableReader> sstables = store.getLiveSSTables();
@@ -696,7 +697,7 @@
             .applyUnsafe();
 
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         Collection<SSTableReader> sstables = store.getLiveSSTables();
@@ -751,7 +752,7 @@
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD);
         SSTableReader sstable = getNewSSTable(cfs);
-        Descriptor notLiveDesc = new Descriptor(new File("/tmp"), "", "", 0);
+        Descriptor notLiveDesc = new Descriptor(new File("/tmp"), "", "", SSTableIdFactory.instance.defaultBuilder().generator(Stream.empty()).get());
         SSTableReader.moveAndOpenSSTable(cfs, sstable.descriptor, notLiveDesc, sstable.components, false);
     }
 
@@ -761,7 +762,7 @@
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_STANDARD);
         SSTableReader sstable = getNewSSTable(cfs);
-        Descriptor notLiveDesc = new Descriptor(new File("/tmp"), "", "", 0);
+        Descriptor notLiveDesc = new Descriptor(new File("/tmp"), "", "", SSTableIdFactory.instance.defaultBuilder().generator(Stream.empty()).get());
         SSTableReader.moveAndOpenSSTable(cfs, notLiveDesc, sstable.descriptor, sstable.components, false);
     }
 
@@ -773,9 +774,10 @@
         SSTableReader sstable = getNewSSTable(cfs);
         cfs.clearUnsafe();
         sstable.selfRef().release();
-        File tmpdir = Files.createTempDirectory("testMoveAndOpen").toFile();
+        File tmpdir = new File(Files.createTempDirectory("testMoveAndOpen"));
         tmpdir.deleteOnExit();
-        Descriptor notLiveDesc = new Descriptor(tmpdir, sstable.descriptor.ksname, sstable.descriptor.cfname, 100);
+        SSTableId id = SSTableIdFactory.instance.defaultBuilder().generator(Stream.empty()).get();
+        Descriptor notLiveDesc = new Descriptor(tmpdir, sstable.descriptor.ksname, sstable.descriptor.cfname, id);
         // make sure the new directory is empty and that the old files exist:
         for (Component c : sstable.components)
         {
@@ -789,7 +791,7 @@
         {
             File f = new File(notLiveDesc.filenameFor(c));
             assertTrue(f.exists());
-            assertTrue(f.toString().contains("-100-"));
+            assertTrue(f.toString().contains(String.format("-%s-", id)));
             f.deleteOnExit();
             assertFalse(new File(sstable.descriptor.filenameFor(c)).exists());
         }
@@ -806,7 +808,7 @@
             .build()
             .applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         return Sets.difference(cfs.getLiveSSTables(), before).iterator().next();
     }
 
@@ -836,7 +838,7 @@
 
         // delete the compression info, so it is corrupted.
         File compressionInfoFile = new File(desc.filenameFor(Component.COMPRESSION_INFO));
-        compressionInfoFile.delete();
+        compressionInfoFile.tryDelete();
         assertFalse("CompressionInfo file should not exist", compressionInfoFile.exists());
 
         // discovert the components on disk after deletion
@@ -856,7 +858,7 @@
 
         // mark the toc file not readable in order to trigger the FSReadError
         File tocFile = new File(desc.filenameFor(Component.TOC));
-        tocFile.setReadable(false);
+        tocFile.trySetReadable(false);
 
         expectedException.expect(FSReadError.class);
         expectedException.expectMessage("TOC.txt");
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java
index 1895653..c88e0b0 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableRewriterTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.*;
 import java.util.concurrent.ExecutionException;
@@ -52,13 +51,17 @@
 import org.apache.cassandra.db.lifecycle.SSTableSet;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableWriter;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.metrics.StorageMetrics;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
 
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.db.compaction.OperationType.COMPACTION;
+import static org.apache.cassandra.utils.FBUtilities.nowInSeconds;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.*;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
@@ -80,7 +83,7 @@
                 .build()
                 .apply();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Set<SSTableReader> sstables = new HashSet<>(cfs.getLiveSSTables());
         assertEquals(1, sstables.size());
         assertEquals(sstables.iterator().next().bytesOnDisk(), cfs.metric.liveDiskSpaceUsed.getCount());
@@ -89,7 +92,7 @@
              LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.UNKNOWN);
              SSTableRewriter writer = SSTableRewriter.constructKeepingOriginals(txn, false, 1000);
              CompactionController controller = new CompactionController(cfs, sstables, cfs.gcBefore(nowInSec));
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, scanners.scanners, controller, nowInSec, UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, scanners.scanners, controller, nowInSec, nextTimeUUID()))
         {
             writer.switchWriter(getWriter(cfs, sstables.iterator().next().descriptor.directory, txn));
             while(ci.hasNext())
@@ -99,7 +102,7 @@
             writer.finish();
         }
         LifecycleTransaction.waitForDeletions();
-        assertEquals(1, assertFileCounts(sstables.iterator().next().descriptor.directory.list()));
+        assertEquals(1, assertFileCounts(sstables.iterator().next().descriptor.directory.tryListNames()));
 
         validateCFS(cfs);
         truncate(cfs);
@@ -121,7 +124,7 @@
              LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.UNKNOWN);
              SSTableRewriter writer = new SSTableRewriter(txn, 1000, 10000000, false, true);
              CompactionController controller = new CompactionController(cfs, sstables, cfs.gcBefore(nowInSec));
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, scanners.scanners, controller, nowInSec, UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, scanners.scanners, controller, nowInSec, nextTimeUUID()))
         {
             writer.switchWriter(getWriter(cfs, sstables.iterator().next().descriptor.directory, txn));
             while (ci.hasNext())
@@ -131,7 +134,7 @@
             writer.finish();
         }
         LifecycleTransaction.waitForDeletions();
-        assertEquals(1, assertFileCounts(sstables.iterator().next().descriptor.directory.list()));
+        assertEquals(1, assertFileCounts(sstables.iterator().next().descriptor.directory.tryListNames()));
 
         validateCFS(cfs);
     }
@@ -154,7 +157,7 @@
              LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.UNKNOWN);
              SSTableRewriter writer = new SSTableRewriter(txn, 1000, 10000000, false, true);
              CompactionController controller = new CompactionController(cfs, sstables, cfs.gcBefore(nowInSec));
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, scanners.scanners, controller, nowInSec, UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, scanners.scanners, controller, nowInSec, nextTimeUUID()))
         {
             writer.switchWriter(getWriter(cfs, sstables.iterator().next().descriptor.directory, txn));
             while (ci.hasNext())
@@ -186,7 +189,7 @@
             writer.finish();
         }
         LifecycleTransaction.waitForDeletions();
-        assertEquals(1, assertFileCounts(sstables.iterator().next().descriptor.directory.list()));
+        assertEquals(1, assertFileCounts(sstables.iterator().next().descriptor.directory.tryListNames()));
 
         validateCFS(cfs);
         truncate(cfs);
@@ -211,7 +214,7 @@
              CompactionController controller = new CompactionController(cfs, compacting, 0);
              LifecycleTransaction txn = cfs.getTracker().tryModify(compacting, OperationType.UNKNOWN);
              SSTableRewriter rewriter = new SSTableRewriter(txn, 1000, 10000000, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
         {
             rewriter.switchWriter(getWriter(cfs, s.descriptor.directory, txn));
 
@@ -244,7 +247,7 @@
 
         // tmplink and tmp files should be gone:
         assertEquals(sum, cfs.metric.totalDiskSpaceUsed.getCount());
-        assertFileCounts(s.descriptor.directory.list());
+        assertFileCounts(s.descriptor.directory.tryListNames());
         validateCFS(cfs);
     }
 
@@ -266,7 +269,7 @@
              CompactionController controller = new CompactionController(cfs, compacting, 0);
              LifecycleTransaction txn = cfs.getTracker().tryModify(compacting, OperationType.UNKNOWN);
              SSTableRewriter rewriter = new SSTableRewriter(txn, 1000, 10000000, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
         {
             rewriter.switchWriter(getWriter(cfs, s.descriptor.directory, txn));
 
@@ -287,7 +290,7 @@
         assertEquals(files, cfs.getLiveSSTables().size());
         LifecycleTransaction.waitForDeletions();
 
-        assertFileCounts(s.descriptor.directory.list());
+        assertFileCounts(s.descriptor.directory.tryListNames());
         validateCFS(cfs);
     }
 
@@ -304,7 +307,7 @@
                             SSTableRewriter rewriter,
                             LifecycleTransaction txn)
             {
-                try (CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+                try (CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
                 {
                     int files = 1;
                     while (ci.hasNext())
@@ -335,7 +338,7 @@
                             SSTableRewriter rewriter,
                             LifecycleTransaction txn)
             {
-                try (CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+                try (CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
                 {
                     int files = 1;
                     while (ci.hasNext())
@@ -371,7 +374,7 @@
                             SSTableRewriter rewriter,
                             LifecycleTransaction txn)
             {
-                try(CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+                try(CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
                 {
                     int files = 1;
                     while (ci.hasNext())
@@ -426,7 +429,7 @@
 
         assertEquals(startSize, cfs.metric.liveDiskSpaceUsed.getCount());
         assertEquals(1, cfs.getLiveSSTables().size());
-        assertFileCounts(s.descriptor.directory.list());
+        assertFileCounts(s.descriptor.directory.tryListNames());
         assertEquals(cfs.getLiveSSTables().iterator().next().first, origFirst);
         assertEquals(cfs.getLiveSSTables().iterator().next().last, origLast);
         validateCFS(cfs);
@@ -449,7 +452,7 @@
              CompactionController controller = new CompactionController(cfs, compacting, 0);
              LifecycleTransaction txn = cfs.getTracker().tryModify(compacting, OperationType.UNKNOWN);
              SSTableRewriter rewriter = new SSTableRewriter(txn, 1000, 10000000, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
         {
             rewriter.switchWriter(getWriter(cfs, s.descriptor.directory, txn));
             while(ci.hasNext())
@@ -473,7 +476,7 @@
         LifecycleTransaction.waitForDeletions();
 
         assertEquals(files - 1, cfs.getLiveSSTables().size()); // we never wrote anything to the last file
-        assertFileCounts(s.descriptor.directory.list());
+        assertFileCounts(s.descriptor.directory.tryListNames());
         validateCFS(cfs);
     }
 
@@ -495,7 +498,7 @@
              CompactionController controller = new CompactionController(cfs, compacting, 0);
              LifecycleTransaction txn = cfs.getTracker().tryModify(compacting, OperationType.UNKNOWN);
              SSTableRewriter rewriter = new SSTableRewriter(txn, 1000, 10000000, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
         {
             rewriter.switchWriter(getWriter(cfs, s.descriptor.directory, txn));
             while(ci.hasNext())
@@ -513,7 +516,7 @@
         }
 
         LifecycleTransaction.waitForDeletions();
-        assertFileCounts(s.descriptor.directory.list());
+        assertFileCounts(s.descriptor.directory.tryListNames());
         validateCFS(cfs);
     }
 
@@ -535,7 +538,7 @@
              CompactionController controller = new CompactionController(cfs, compacting, 0);
              LifecycleTransaction txn = cfs.getTracker().tryModify(compacting, OperationType.UNKNOWN);
              SSTableRewriter rewriter = new SSTableRewriter(txn, 1000, 1000000, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID()))
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID()))
         {
             rewriter.switchWriter(getWriter(cfs, s.descriptor.directory, txn));
             while(ci.hasNext())
@@ -554,7 +557,7 @@
         assertEquals(files, sstables.size());
         assertEquals(files, cfs.getLiveSSTables().size());
         LifecycleTransaction.waitForDeletions();
-        assertFileCounts(s.descriptor.directory.list());
+        assertFileCounts(s.descriptor.directory.tryListNames());
 
         validateCFS(cfs);
     }
@@ -572,10 +575,10 @@
             SSTableSplitter splitter = new SSTableSplitter(cfs, txn, 10);
             splitter.split();
 
-            assertFileCounts(s.descriptor.directory.list());
+            assertFileCounts(s.descriptor.directory.tryListNames());
             LifecycleTransaction.waitForDeletions();
 
-            for (File f : s.descriptor.directory.listFiles())
+            for (File f : s.descriptor.directory.tryList())
             {
                 // we need to clear out the data dir, otherwise tests running after this breaks
                 FileUtils.deleteRecursive(f);
@@ -621,7 +624,7 @@
              LifecycleTransaction txn = offline ? LifecycleTransaction.offline(OperationType.UNKNOWN, compacting)
                                        : cfs.getTracker().tryModify(compacting, OperationType.UNKNOWN);
              SSTableRewriter rewriter = new SSTableRewriter(txn, 100, 10000000, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID())
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID())
         )
         {
             rewriter.switchWriter(getWriter(cfs, s.descriptor.directory, txn));
@@ -651,7 +654,7 @@
 
         LifecycleTransaction.waitForDeletions();
 
-        int filecount = assertFileCounts(s.descriptor.directory.list());
+        int filecount = assertFileCounts(s.descriptor.directory.tryListNames());
         assertEquals(filecount, 1);
         if (!offline)
         {
@@ -664,16 +667,16 @@
             assertEquals(0, cfs.getLiveSSTables().size());
             cfs.truncateBlocking();
         }
-        filecount = assertFileCounts(s.descriptor.directory.list());
+        filecount = assertFileCounts(s.descriptor.directory.tryListNames());
         if (offline)
         {
             // the file is not added to the CFS, therefore not truncated away above
             assertEquals(1, filecount);
-            for (File f : s.descriptor.directory.listFiles())
+            for (File f : s.descriptor.directory.tryList())
             {
                 FileUtils.deleteRecursive(f);
             }
-            filecount = assertFileCounts(s.descriptor.directory.list());
+            filecount = assertFileCounts(s.descriptor.directory.tryListNames());
         }
 
         assertEquals(0, filecount);
@@ -697,7 +700,7 @@
                     .build()
                     .apply();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         cfs.forceMajorCompaction();
         validateKeys(keyspace);
 
@@ -711,7 +714,7 @@
              CompactionController controller = new CompactionController(cfs, compacting, 0);
              LifecycleTransaction txn = cfs.getTracker().tryModify(compacting, OperationType.UNKNOWN);
              SSTableRewriter rewriter = new SSTableRewriter(txn, 1000, 1, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID())
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID())
         )
         {
             rewriter.switchWriter(getWriter(cfs, s.descriptor.directory, txn));
@@ -749,7 +752,7 @@
              CompactionController controller = new CompactionController(cfs, sstables, 0);
              LifecycleTransaction txn = cfs.getTracker().tryModify(sstables, OperationType.UNKNOWN);
              SSTableRewriter writer = new SSTableRewriter(txn, 1000, 10000000, false, true);
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, Collections.singletonList(scanner), controller, FBUtilities.nowInSeconds(), UUIDGen.getTimeUUID())
+             CompactionIterator ci = new CompactionIterator(COMPACTION, singletonList(scanner), controller, nowInSeconds(), nextTimeUUID())
         )
         {
             writer.switchWriter(getWriter(cfs, sstables.iterator().next().descriptor.directory, txn));
@@ -792,7 +795,7 @@
              SSTableRewriter writer = SSTableRewriter.constructWithoutEarlyOpening(txn, false, 1000);
              SSTableRewriter writer2 = SSTableRewriter.constructWithoutEarlyOpening(txn, false, 1000);
              CompactionController controller = new CompactionController(cfs, sstables, cfs.gcBefore(nowInSec));
-             CompactionIterator ci = new CompactionIterator(OperationType.COMPACTION, scanners.scanners, controller, nowInSec, UUIDGen.getTimeUUID())
+             CompactionIterator ci = new CompactionIterator(COMPACTION, scanners.scanners, controller, nowInSec, nextTimeUUID())
              )
         {
             writer.switchWriter(getWriter(cfs, sstables.iterator().next().descriptor.directory, txn));
@@ -834,7 +837,7 @@
                 }
             }
         };
-        Thread t = NamedThreadFactory.createThread(r);
+        Thread t = NamedThreadFactory.createAnonymousThread(r);
         try
         {
             t.start();
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java
index eff95fc..922200a 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableScannerTest.java
@@ -30,6 +30,7 @@
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.Util;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.DataRange;
@@ -182,9 +183,9 @@
         assert boundaries.length % 2 == 0;
         for (DataRange range : dataRanges(sstable.metadata(), scanStart, scanEnd))
         {
-            try(ISSTableScanner scanner = sstable.getScanner(ColumnFilter.all(sstable.metadata()),
-                                                             range,
-                                                             SSTableReadsListener.NOOP_LISTENER))
+            try(UnfilteredPartitionIterator scanner = sstable.partitionIterator(ColumnFilter.all(sstable.metadata()),
+                                                                                range,
+                                                                                SSTableReadsListener.NOOP_LISTENER))
             {
                 for (int b = 0; b < boundaries.length; b += 2)
                     for (int i = boundaries[b]; i <= boundaries[b + 1]; i++)
@@ -215,7 +216,7 @@
 
         for (int i = 2; i < 10; i++)
             insertRowWithKey(store.metadata(), i);
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         assertEquals(1, store.getLiveSSTables().size());
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
@@ -321,7 +322,7 @@
         for (int i = 0; i < 3; i++)
             for (int j = 2; j < 10; j++)
                 insertRowWithKey(store.metadata(), i * 100 + j);
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         assertEquals(1, store.getLiveSSTables().size());
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
@@ -441,7 +442,7 @@
         store.disableAutoCompaction();
 
         insertRowWithKey(store.metadata(), 205);
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         assertEquals(1, store.getLiveSSTables().size());
         SSTableReader sstable = store.getLiveSSTables().iterator().next();
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
index 731cee2..cdd3ee0 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableUtils.java
@@ -19,9 +19,10 @@
 
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
+import org.apache.cassandra.io.util.File;
 import java.io.IOException;
 import java.util.*;
+import java.util.stream.Stream;
 
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.schema.TableMetadata;
@@ -70,17 +71,17 @@
     }
     */
 
-    public static File tempSSTableFile(String keyspaceName, String cfname, int generation) throws IOException
+    public static File tempSSTableFile(String keyspaceName, String cfname, SSTableId id) throws IOException
     {
         File tempdir = FileUtils.createTempFile(keyspaceName, cfname);
-        if(!tempdir.delete() || !tempdir.mkdir())
+        if(!tempdir.tryDelete() || !tempdir.tryCreateDirectory())
             throw new IOException("Temporary directory creation failed.");
         tempdir.deleteOnExit();
-        File cfDir = new File(tempdir, keyspaceName + File.separator + cfname);
-        cfDir.mkdirs();
+        File cfDir = new File(tempdir, keyspaceName + File.pathSeparator() + cfname);
+        cfDir.tryCreateDirectories();
         cfDir.deleteOnExit();
-        File datafile = new File(new Descriptor(cfDir, keyspaceName, cfname, generation, SSTableFormat.Type.BIG).filenameFor(Component.DATA));
-        if (!datafile.createNewFile())
+        File datafile = new File(new Descriptor(cfDir, keyspaceName, cfname, id, SSTableFormat.Type.BIG).filenameFor(Component.DATA));
+        if (!datafile.createFileIfNotExists())
             throw new IOException("unable to create file " + datafile);
         datafile.deleteOnExit();
         return datafile;
@@ -132,7 +133,7 @@
         private String cfname = CFNAME;
         private Descriptor dest = null;
         private boolean cleanup = true;
-        private int generation = 0;
+        private SSTableId id = SSTableIdFactory.instance.defaultBuilder().generator(Stream.empty()).get();
 
         Context() {}
 
@@ -160,11 +161,11 @@
         }
 
         /**
-         * Sets the generation number for the generated SSTable. Ignored if "dest()" is set.
+         * Sets the identifier for the generated SSTable. Ignored if "dest()" is set.
          */
-        public Context generation(int generation)
+        public Context id(SSTableId id)
         {
-            this.generation = generation;
+            this.id = id;
             return this;
         }
 
@@ -215,11 +216,11 @@
 
         public Collection<SSTableReader> write(int expectedSize, Appender appender) throws IOException
         {
-            File datafile = (dest == null) ? tempSSTableFile(ksname, cfname, generation) : new File(dest.filenameFor(Component.DATA));
+            File datafile = (dest == null) ? tempSSTableFile(ksname, cfname, id) : new File(dest.filenameFor(Component.DATA));
             TableMetadata metadata = Schema.instance.getTableMetadata(ksname, cfname);
             ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(metadata.id);
             SerializationHeader header = appender.header();
-            SSTableTxnWriter writer = SSTableTxnWriter.create(cfs, Descriptor.fromFilename(datafile.getAbsolutePath()), expectedSize, UNREPAIRED_SSTABLE, NO_PENDING_REPAIR, false, 0, header);
+            SSTableTxnWriter writer = SSTableTxnWriter.create(cfs, Descriptor.fromFilename(datafile.absolutePath()), expectedSize, UNREPAIRED_SSTABLE, NO_PENDING_REPAIR, false, 0, header);
             while (appender.append(writer)) { /* pass */ }
             Collection<SSTableReader> readers = writer.finish(true);
 
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java
index 31d0b89..5d20367 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTest.java
@@ -18,10 +18,9 @@
 
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.nio.ByteBuffer;
-import java.util.UUID;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import org.apache.cassandra.*;
@@ -33,19 +32,20 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableReadsListener;
 import org.apache.cassandra.io.sstable.format.SSTableWriter;
-import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 
-import static junit.framework.Assert.fail;
-import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
-import static org.apache.cassandra.service.ActiveRepairService.UNREPAIRED_SSTABLE;
+import static org.junit.Assert.fail;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
+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;
+
 public class SSTableWriterTest extends SSTableWriterTestBase
 {
     @Test
-    public void testAbortTxnWithOpenEarlyShouldRemoveSSTable() throws InterruptedException
+    public void testAbortTxnWithOpenEarlyShouldRemoveSSTable()
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF);
@@ -65,7 +65,7 @@
 
             SSTableReader s = writer.setMaxDataAge(1000).openEarly();
             assert s != null;
-            assertFileCounts(dir.list());
+            assertFileCounts(dir.tryListNames());
             for (int i = 10000; i < 20000; i++)
             {
                 UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1);
@@ -75,24 +75,20 @@
             }
             SSTableReader s2 = writer.setMaxDataAge(1000).openEarly();
             assertTrue(s.last.compareTo(s2.last) < 0);
-            assertFileCounts(dir.list());
+            assertFileCounts(dir.tryListNames());
             s.selfRef().release();
             s2.selfRef().release();
 
-            int datafiles = assertFileCounts(dir.list());
+            int datafiles = assertFileCounts(dir.tryListNames());
             assertEquals(datafiles, 1);
 
-            // These checks don't work on Windows because the writer has the channel still
-            // open till .abort() is called (via the builder)
-            if (!FBUtilities.isWindows)
-            {
-                LifecycleTransaction.waitForDeletions();
-                assertFileCounts(dir.list());
-            }
+            LifecycleTransaction.waitForDeletions();
+            assertFileCounts(dir.tryListNames());
+
             writer.abort();
             txn.abort();
             LifecycleTransaction.waitForDeletions();
-            datafiles = assertFileCounts(dir.list());
+            datafiles = assertFileCounts(dir.tryListNames());
             assertEquals(datafiles, 0);
             validateCFS(cfs);
         }
@@ -100,7 +96,7 @@
 
 
     @Test
-    public void testAbortTxnWithClosedWriterShouldRemoveSSTable() throws InterruptedException
+    public void testAbortTxnWithClosedWriterShouldRemoveSSTable()
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF);
@@ -118,7 +114,7 @@
                 writer.append(builder.build().unfilteredIterator());
             }
 
-            assertFileCounts(dir.list());
+            assertFileCounts(dir.tryListNames());
             for (int i = 10000; i < 20000; i++)
             {
                 UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1);
@@ -127,28 +123,24 @@
                 writer.append(builder.build().unfilteredIterator());
             }
             SSTableReader sstable = writer.finish(true);
-            int datafiles = assertFileCounts(dir.list());
+            int datafiles = assertFileCounts(dir.tryListNames());
             assertEquals(datafiles, 1);
 
             sstable.selfRef().release();
-            // These checks don't work on Windows because the writer has the channel still
-            // open till .abort() is called (via the builder)
-            if (!FBUtilities.isWindows)
-            {
-                LifecycleTransaction.waitForDeletions();
-                assertFileCounts(dir.list());
-            }
+
+            LifecycleTransaction.waitForDeletions();
+            assertFileCounts(dir.tryListNames());
 
             txn.abort();
             LifecycleTransaction.waitForDeletions();
-            datafiles = assertFileCounts(dir.list());
+            datafiles = assertFileCounts(dir.tryListNames());
             assertEquals(datafiles, 0);
             validateCFS(cfs);
         }
     }
 
     @Test
-    public void testAbortTxnWithClosedAndOpenWriterShouldRemoveAllSSTables() throws InterruptedException
+    public void testAbortTxnWithClosedAndOpenWriterShouldRemoveAllSSTables()
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF);
@@ -169,7 +161,7 @@
                 writer1.append(builder.build().unfilteredIterator());
             }
 
-            assertFileCounts(dir.list());
+            assertFileCounts(dir.tryListNames());
             for (int i = 10000; i < 20000; i++)
             {
                 UpdateBuilder builder = UpdateBuilder.create(cfs.metadata(), random(i, 10)).withTimestamp(1);
@@ -180,21 +172,17 @@
             SSTableReader sstable = writer1.finish(true);
             txn.update(sstable, false);
 
-            assertFileCounts(dir.list());
+            assertFileCounts(dir.tryListNames());
 
-            int datafiles = assertFileCounts(dir.list());
+            int datafiles = assertFileCounts(dir.tryListNames());
             assertEquals(datafiles, 2);
 
-            // These checks don't work on Windows because the writer has the channel still
-            // open till .abort() is called (via the builder)
-            if (!FBUtilities.isWindows)
-            {
-                LifecycleTransaction.waitForDeletions();
-                assertFileCounts(dir.list());
-            }
+            LifecycleTransaction.waitForDeletions();
+            assertFileCounts(dir.tryListNames());
+
             txn.abort();
             LifecycleTransaction.waitForDeletions();
-            datafiles = assertFileCounts(dir.list());
+            datafiles = assertFileCounts(dir.tryListNames());
             assertEquals(datafiles, 0);
             validateCFS(cfs);
         }
@@ -228,11 +216,11 @@
             try
             {
                 DecoratedKey dk = Util.dk("large_value");
-                UnfilteredRowIterator rowIter = sstable.iterator(dk,
-                                                                 Slices.ALL,
-                                                                 ColumnFilter.all(cfs.metadata()),
-                                                                 false,
-                                                                 SSTableReadsListener.NOOP_LISTENER);
+                UnfilteredRowIterator rowIter = sstable.rowIterator(dk,
+                                                                    Slices.ALL,
+                                                                    ColumnFilter.all(cfs.metadata()),
+                                                                    false,
+                                                                    SSTableReadsListener.NOOP_LISTENER);
                 while (rowIter.hasNext())
                 {
                     rowIter.next();
@@ -249,7 +237,7 @@
         }
     }
 
-    private static void assertValidRepairMetadata(long repairedAt, UUID pendingRepair, boolean isTransient)
+    private static void assertValidRepairMetadata(long repairedAt, TimeUUID pendingRepair, boolean isTransient)
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_SMALL_MAX_VALUE);
@@ -269,7 +257,7 @@
         LifecycleTransaction.waitForDeletions();
     }
 
-    private static void assertInvalidRepairMetadata(long repairedAt, UUID pendingRepair, boolean isTransient)
+    private static void assertInvalidRepairMetadata(long repairedAt, TimeUUID pendingRepair, boolean isTransient)
     {
         Keyspace keyspace = Keyspace.open(KEYSPACE);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore(CF_SMALL_MAX_VALUE);
@@ -297,11 +285,11 @@
     {
         assertValidRepairMetadata(UNREPAIRED_SSTABLE, NO_PENDING_REPAIR, false);
         assertValidRepairMetadata(1, NO_PENDING_REPAIR, false);
-        assertValidRepairMetadata(UNREPAIRED_SSTABLE, UUID.randomUUID(), false);
-        assertValidRepairMetadata(UNREPAIRED_SSTABLE, UUID.randomUUID(), true);
+        assertValidRepairMetadata(UNREPAIRED_SSTABLE, nextTimeUUID(), false);
+        assertValidRepairMetadata(UNREPAIRED_SSTABLE, nextTimeUUID(), true);
 
         assertInvalidRepairMetadata(UNREPAIRED_SSTABLE, NO_PENDING_REPAIR, true);
-        assertInvalidRepairMetadata(1, UUID.randomUUID(), false);
+        assertInvalidRepairMetadata(1, nextTimeUUID(), false);
         assertInvalidRepairMetadata(1, NO_PENDING_REPAIR, true);
 
     }
diff --git a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java
index 962e1a1..83ad136 100644
--- a/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java
+++ b/test/unit/org/apache/cassandra/io/sstable/SSTableWriterTestBase.java
@@ -18,15 +18,14 @@
 
 package org.apache.cassandra.io.sstable;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.ThreadLocalRandom;
 import java.util.concurrent.TimeUnit;
 
 import com.google.common.util.concurrent.Uninterruptibles;
+import org.apache.cassandra.io.util.File;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
@@ -44,12 +43,11 @@
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.format.SSTableWriter;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
 
 public class SSTableWriterTestBase extends SchemaLoader
 {
@@ -68,15 +66,6 @@
     {
         DatabaseDescriptor.daemonInitialization();
 
-        if (FBUtilities.isWindows)
-        {
-            standardMode = DatabaseDescriptor.getDiskAccessMode();
-            indexMode = DatabaseDescriptor.getIndexAccessMode();
-
-            DatabaseDescriptor.setDiskAccessMode(Config.DiskAccessMode.standard);
-            DatabaseDescriptor.setIndexAccessMode(Config.DiskAccessMode.standard);
-        }
-
         SchemaLoader.prepareServer();
         SchemaLoader.createKeyspace(KEYSPACE,
                                     KeyspaceParams.simple(1),
@@ -84,7 +73,7 @@
                                     SchemaLoader.standardCFMD(KEYSPACE, CF_SMALL_MAX_VALUE));
 
         maxValueSize = DatabaseDescriptor.getMaxValueSize();
-        DatabaseDescriptor.setMaxValueSize(1024 * 1024); // set max value size to 1MB
+        DatabaseDescriptor.setMaxValueSize(1024 * 1024); // set max value size to 1MiB
     }
 
     @AfterClass
@@ -135,23 +124,23 @@
      */
     public static void validateCFS(ColumnFamilyStore cfs)
     {
-        Set<Integer> liveDescriptors = new HashSet<>();
+        Set<SSTableId> liveDescriptors = new HashSet<>();
         long spaceUsed = 0;
         for (SSTableReader sstable : cfs.getLiveSSTables())
         {
             assertFalse(sstable.isMarkedCompacted());
             assertEquals(1, sstable.selfRef().globalCount());
-            liveDescriptors.add(sstable.descriptor.generation);
+            liveDescriptors.add(sstable.descriptor.id);
             spaceUsed += sstable.bytesOnDisk();
         }
         for (File dir : cfs.getDirectories().getCFDirectories())
         {
-            for (File f : dir.listFiles())
+            for (File f : dir.tryList())
             {
-                if (f.getName().contains("Data"))
+                if (f.name().contains("Data"))
                 {
-                    Descriptor d = Descriptor.fromFilename(f.getAbsolutePath());
-                    assertTrue(d.toString(), liveDescriptors.contains(d.generation));
+                    Descriptor d = Descriptor.fromFilename(f.absolutePath());
+                    assertTrue(d.toString(), liveDescriptors.contains(d.id));
                 }
             }
         }
@@ -163,7 +152,7 @@
             assertFalse(CompactionManager.instance.submitMaximal(cfs, cfs.gcBefore((int) (System.currentTimeMillis() / 1000)), false).isEmpty());
     }
 
-    public static SSTableWriter getWriter(ColumnFamilyStore cfs, File directory, LifecycleTransaction txn, long repairedAt, UUID pendingRepair, boolean isTransient)
+    public static SSTableWriter getWriter(ColumnFamilyStore cfs, File directory, LifecycleTransaction txn, long repairedAt, TimeUUID pendingRepair, boolean isTransient)
     {
         Descriptor desc = cfs.newSSTableDescriptor(directory);
         return SSTableWriter.create(desc, 0, repairedAt, pendingRepair, isTransient, new SerializationHeader(true, cfs.metadata(), cfs.metadata().regularAndStaticColumns(), EncodingStats.NO_STATS), cfs.indexManager.listIndexes(), txn);
diff --git a/test/unit/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriterTest.java
index 7ae69ea..14b48b7 100644
--- a/test/unit/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/format/RangeAwareSSTableWriterTest.java
@@ -24,9 +24,9 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.DiskBoundaries;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.compaction.OperationType;
@@ -69,7 +69,7 @@
     {
 
         SchemaLoader.insertData(KEYSPACE1, CF_STANDARD, 0, 1);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         LifecycleTransaction txn = LifecycleTransaction.offline(OperationType.STREAM);
 
diff --git a/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java b/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java
index 5f19206..b5aaf8e 100644
--- a/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/format/SSTableFlushObserverTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.io.sstable.format;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -26,6 +25,8 @@
 import java.util.Iterator;
 
 import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -85,19 +86,21 @@
         FlushObserver observer = new FlushObserver();
 
         String sstableDirectory = DatabaseDescriptor.getAllDataFileLocations()[0];
-        File directory = new File(sstableDirectory + File.pathSeparator + KS_NAME + File.pathSeparator + CF_NAME);
+        File directory = new File(sstableDirectory + File.pathSeparator() + KS_NAME + File.pathSeparator() + CF_NAME);
         directory.deleteOnExit();
 
-        if (!directory.exists() && !directory.mkdirs())
-            throw new FSWriteError(new IOException("failed to create tmp directory"), directory.getAbsolutePath());
+        if (!directory.exists() && !directory.tryCreateDirectories())
+            throw new FSWriteError(new IOException("failed to create tmp directory"), directory.absolutePath());
 
         SSTableFormat.Type sstableFormat = SSTableFormat.Type.current();
+        Descriptor descriptor = new Descriptor(sstableFormat.info.getLatestVersion(),
+                                               directory,
+                                               cfm.keyspace,
+                                               cfm.name,
+                                               new SequenceBasedSSTableId(0),
+                                               sstableFormat);
 
-        BigTableWriter writer = new BigTableWriter(new Descriptor(sstableFormat.info.getLatestVersion(),
-                                                                  directory,
-                                                                  KS_NAME, CF_NAME,
-                                                                  0,
-                                                                  sstableFormat),
+        BigTableWriter writer = new BigTableWriter(descriptor,
                                                    10L, 0L, null, false, TableMetadataRef.forOfflineTools(cfm),
                                                    new MetadataCollector(cfm.comparator).sstableLevel(0),
                                                    new SerializationHeader(true, cfm, cfm.regularAndStaticColumns(), EncodingStats.NO_STATS),
diff --git a/test/unit/org/apache/cassandra/io/sstable/format/VersionAndTypeTest.java b/test/unit/org/apache/cassandra/io/sstable/format/VersionAndTypeTest.java
index 633993f..4e62b9c 100644
--- a/test/unit/org/apache/cassandra/io/sstable/format/VersionAndTypeTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/format/VersionAndTypeTest.java
@@ -20,7 +20,7 @@
 import org.junit.Test;
 
 import static org.assertj.core.api.Assertions.assertThatThrownBy;
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
 
 public class VersionAndTypeTest
 {
diff --git a/test/unit/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriterTest.java b/test/unit/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriterTest.java
index 3cf96f2..e6d2020 100644
--- a/test/unit/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/format/big/BigTableZeroCopyWriterTest.java
@@ -19,8 +19,9 @@
 package org.apache.cassandra.io.sstable.format.big;
 
 import java.io.ByteArrayInputStream;
-import java.io.File;
+import java.io.UncheckedIOException;
 import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Collection;
@@ -28,6 +29,7 @@
 import java.util.function.Function;
 
 import com.google.common.collect.ImmutableSet;
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -116,7 +118,7 @@
             .applyUnsafe();
             expectedRowCount++;
         }
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         sstable = store.getLiveSSTables().iterator().next();
     }
@@ -161,7 +163,14 @@
             {
                 Pair<DataInputPlus, Long> pair = getSSTableComponentData(sstable, component, bufferMapper);
 
-                btzcw.writeComponent(component.type, pair.left, pair.right);
+                try
+                {
+                    btzcw.writeComponent(component.type, pair.left, pair.right);
+                }
+                catch (ClosedChannelException e)
+                {
+                    throw new UncheckedIOException(e);
+                }
             }
         }
 
@@ -182,11 +191,11 @@
         for (int i = 0; i < store.metadata().params.minIndexInterval; i++)
         {
             DecoratedKey dk = Util.dk(String.valueOf(i));
-            UnfilteredRowIterator rowIter = sstable.iterator(dk,
-                                                             Slices.ALL,
-                                                             ColumnFilter.all(store.metadata()),
-                                                             false,
-                                                             SSTableReadsListener.NOOP_LISTENER);
+            UnfilteredRowIterator rowIter = sstable.rowIterator(dk,
+                                                                Slices.ALL,
+                                                                ColumnFilter.all(store.metadata()),
+                                                                false,
+                                                                SSTableReadsListener.NOOP_LISTENER);
             while (rowIter.hasNext())
             {
                 rowIter.next();
diff --git a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java
index 79cf831..9b5ff62 100644
--- a/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java
+++ b/test/unit/org/apache/cassandra/io/sstable/metadata/MetadataSerializerTest.java
@@ -17,8 +17,8 @@
  */
 package org.apache.cassandra.io.sstable.metadata;
 
-import java.io.File;
-import java.io.FileOutputStream;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.io.util.*;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collections;
@@ -29,6 +29,7 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.SerializationHeader;
 import org.apache.cassandra.db.commitlog.CommitLogPosition;
@@ -39,11 +40,6 @@
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.Version;
 import org.apache.cassandra.io.sstable.format.big.BigFormat;
-import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.io.util.FileUtils;
-import org.apache.cassandra.io.util.RandomAccessReader;
-import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.Throwables;
 
 import static org.junit.Assert.assertEquals;
@@ -66,7 +62,7 @@
         MetadataSerializer serializer = new MetadataSerializer();
         File statsFile = serialize(originalMetadata, serializer, BigFormat.latestVersion);
 
-        Descriptor desc = new Descriptor(statsFile.getParentFile(), "", "", 0, SSTableFormat.Type.BIG);
+        Descriptor desc = new Descriptor(statsFile.parent(), "", "", new SequenceBasedSSTableId(0), SSTableFormat.Type.BIG);
         try (RandomAccessReader in = RandomAccessReader.open(statsFile))
         {
             Map<MetadataType, MetadataComponent> deserialized = serializer.deserialize(desc, in, EnumSet.allOf(MetadataType.class));
@@ -93,7 +89,7 @@
         // Serialize w/ overflowed histograms:
         MetadataSerializer serializer = new MetadataSerializer();
         File statsFile = serialize(originalMetadata, serializer, BigFormat.latestVersion);
-        Descriptor desc = new Descriptor(statsFile.getParentFile(), "", "", 0, SSTableFormat.Type.BIG);
+        Descriptor desc = new Descriptor(statsFile.parent(), "", "", new SequenceBasedSSTableId(0), SSTableFormat.Type.BIG);
 
         try (RandomAccessReader in = RandomAccessReader.open(statsFile))
         {
@@ -110,7 +106,7 @@
     {
         // Serialize to tmp file
         File statsFile = FileUtils.createTempFile(Component.STATS.name, null);
-        try (DataOutputStreamPlus out = new BufferedDataOutputStreamPlus(new FileOutputStream(statsFile)))
+        try (DataOutputStreamPlus out = new FileOutputStreamPlus(statsFile))
         {
             serializer.serialize(metadata, out, version);
         }
@@ -176,7 +172,7 @@
         File statsFileLa = serialize(originalMetadata, serializer, BigFormat.instance.getVersion(oldV));
         // Reading both as earlier version should yield identical results.
         SSTableFormat.Type stype = SSTableFormat.Type.current();
-        Descriptor desc = new Descriptor(stype.info.getVersion(oldV), statsFileLb.getParentFile(), "", "", 0, stype);
+        Descriptor desc = new Descriptor(stype.info.getVersion(oldV), statsFileLb.parent(), "", "", new SequenceBasedSSTableId(0), stype);
         try (RandomAccessReader inLb = RandomAccessReader.open(statsFileLb);
              RandomAccessReader inLa = RandomAccessReader.open(statsFileLa))
         {
diff --git a/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java b/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java
index c5c3b60..040a080 100644
--- a/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java
+++ b/test/unit/org/apache/cassandra/io/util/BufferedDataOutputStreamTest.java
@@ -37,6 +37,7 @@
 import java.util.Arrays;
 import java.util.Random;
 
+import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.vint.VIntCoding;
 import org.junit.Test;
 
@@ -44,6 +45,7 @@
 import com.google.common.primitives.UnsignedInteger;
 import com.google.common.primitives.UnsignedLong;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.apache.cassandra.utils.FBUtilities.preventIllegalAccessWarnings;
 import static org.junit.Assert.*;
 
@@ -171,7 +173,7 @@
 
     static Field baos_bytes;
     static {
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         //seed = 210187780999648L;
         System.out.println("Seed " + seed);
         r = new Random(seed);
@@ -615,4 +617,20 @@
         }
     }
 
+    @Test
+    public void testWriteBytes() throws Exception
+    {
+        setUp();
+        DataOutputStreamPlus dosp = new BufferedDataOutputStreamPlus(adapter, 8);
+        for (int i = 0; i < 1000; i++)
+        {
+            long val = r.nextLong();
+            int size = r.nextInt(9);
+            byte[] bytes = ByteBufferUtil.bytes(val).array();
+            canonical.write(bytes, 0, size);
+            dosp.writeBytes(val, size);
+        }
+        dosp.flush();
+        assertArrayEquals(canonical.toByteArray(), generated.toByteArray());
+    }
 }
diff --git a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java
index 764190c..bb54f25 100644
--- a/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java
+++ b/test/unit/org/apache/cassandra/io/util/BufferedRandomAccessFileTest.java
@@ -21,10 +21,7 @@
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.SyncUtil;
 
-import java.io.File;
-import java.io.FileOutputStream;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Arrays;
@@ -193,7 +190,7 @@
             w.finish();
     
             // will use cachedlength
-            try (FileHandle.Builder builder = new FileHandle.Builder(tmpFile.getPath());
+            try (FileHandle.Builder builder = new FileHandle.Builder(tmpFile.path());
                  FileHandle fh = builder.complete();
                  RandomAccessReader r = fh.createReader())
             {
@@ -354,7 +351,7 @@
             for (final int offset : Arrays.asList(0, 8))
             {
                 File file1 = writeTemporaryFile(new byte[16]);
-                try (FileHandle.Builder builder = new FileHandle.Builder(file1.getPath()).bufferSize(bufferSize);
+                try (FileHandle.Builder builder = new FileHandle.Builder(file1.path()).bufferSize(bufferSize);
                      FileHandle fh = builder.complete();
                      RandomAccessReader file = fh.createReader())
                 {
@@ -366,7 +363,7 @@
             for (final int n : Arrays.asList(1, 2, 4, 8))
             {
                 File file1 = writeTemporaryFile(new byte[16]);
-                try (FileHandle.Builder builder = new FileHandle.Builder(file1.getPath()).bufferSize(bufferSize);
+                try (FileHandle.Builder builder = new FileHandle.Builder(file1.path()).bufferSize(bufferSize);
                      FileHandle fh = builder.complete();
                      RandomAccessReader file = fh.createReader())
                 {
@@ -427,11 +424,11 @@
         tmpFile.deleteOnExit();
 
         // Create the BRAF by filename instead of by file.
-        try (FileHandle.Builder builder = new FileHandle.Builder(tmpFile.getPath());
+        try (FileHandle.Builder builder = new FileHandle.Builder(tmpFile.path());
              FileHandle fh = builder.complete();
              RandomAccessReader r = fh.createReader())
         {
-            assert tmpFile.getPath().equals(r.getPath());
+            assert tmpFile.path().equals(r.getPath());
 
             // Create a mark and move the rw there.
             final DataPosition mark = r.mark();
@@ -607,9 +604,9 @@
     {
         File f = FileUtils.createTempFile("BRAFTestFile", null);
         f.deleteOnExit();
-        FileOutputStream fout = new FileOutputStream(f);
+        FileOutputStreamPlus fout = new FileOutputStreamPlus(f);
         fout.write(data);
-        SyncUtil.sync(fout);
+        fout.sync();
         fout.close();
         return f;
     }
diff --git a/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java
index 4963712..196a0b2 100644
--- a/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/util/ChecksummedRandomAccessReaderTest.java
@@ -18,9 +18,9 @@
 
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
 import java.util.Arrays;
 import java.util.concurrent.ThreadLocalRandom;
 
@@ -119,10 +119,10 @@
         assert data.exists();
 
         // simulate corruption of file
-        try (RandomAccessFile dataFile = new RandomAccessFile(data, "rw"))
+        try (FileChannel dataFile = data.newReadWriteChannel())
         {
-            dataFile.seek(1024);
-            dataFile.write((byte) 5);
+            dataFile.position(1024);
+            dataFile.write(ByteBuffer.wrap(new byte[] {5}));
         }
 
         try (RandomAccessReader reader = ChecksummedRandomAccessReader.open(data, crc))
diff --git a/test/unit/org/apache/cassandra/io/util/ChecksummedSequentialWriterTest.java b/test/unit/org/apache/cassandra/io/util/ChecksummedSequentialWriterTest.java
index 6837d1d..5d92d45 100644
--- a/test/unit/org/apache/cassandra/io/util/ChecksummedSequentialWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/util/ChecksummedSequentialWriterTest.java
@@ -18,7 +18,6 @@
 */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.List;
@@ -44,7 +43,7 @@
     public void cleanup()
     {
         for (TestableSW sw : writers)
-            sw.file.delete();
+            sw.file.tryDelete();
         writers.clear();
     }
 
diff --git a/test/unit/org/apache/cassandra/io/util/DataOutputTest.java b/test/unit/org/apache/cassandra/io/util/DataOutputTest.java
index b6291c0..41631af 100644
--- a/test/unit/org/apache/cassandra/io/util/DataOutputTest.java
+++ b/test/unit/org/apache/cassandra/io/util/DataOutputTest.java
@@ -24,15 +24,12 @@
 import java.io.DataOutput;
 import java.io.DataOutputStream;
 import java.io.EOFException;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.BufferOverflowException;
 import java.nio.ByteBuffer;
 import java.nio.channels.Channels;
 import java.util.ArrayDeque;
+import java.util.Arrays;
 import java.util.Deque;
 import java.util.Random;
 import java.util.concurrent.Callable;
@@ -109,7 +106,7 @@
     @Test
     public void testDataOutputDirectByteBuffer() throws IOException
     {
-        ByteBuffer buf = wrap(new byte[345], true);
+        ByteBuffer buf = wrap(new byte[381], true);
         BufferedDataOutputStreamPlus write = new BufferedDataOutputStreamPlus(null, buf.duplicate());
         DataInput canon = testWrite(write);
         DataInput test = new DataInputStream(new ByteArrayInputStream(ByteBufferUtil.getArray(buf)));
@@ -119,7 +116,7 @@
     @Test
     public void testDataOutputHeapByteBuffer() throws IOException
     {
-        ByteBuffer buf = wrap(new byte[345], false);
+        ByteBuffer buf = wrap(new byte[381], false);
         BufferedDataOutputStreamPlus write = new BufferedDataOutputStreamPlus(null, buf.duplicate());
         DataInput canon = testWrite(write);
         DataInput test = new DataInputStream(new ByteArrayInputStream(ByteBufferUtil.getArray(buf)));
@@ -210,11 +207,11 @@
             checkThrowsException(validateReallocationCallable(write, DataOutputBuffer.MAX_ARRAY_SIZE + 1),
                                  BufferOverflowException.class);
             //Check that it does throw
-            checkThrowsException(() -> 
+            checkThrowsException(() ->
                                  {
                                      write.write(42);
                                      return null;
-                                 }, 
+                                 },
                                  BufferOverflowException.class);
         }
     }
@@ -314,8 +311,8 @@
         try (SafeMemoryWriter write = new SafeMemoryWriter(10))
         {
             DataInput canon = testWrite(write);
-            byte[] bytes = new byte[345];
-            write.currentBuffer().getBytes(0, bytes, 0, 345);
+            byte[] bytes = new byte[381];
+            write.currentBuffer().getBytes(0, bytes, 0, 381);
             DataInput test = new DataInputStream(new ByteArrayInputStream(bytes));
             testRead(test, canon);
         }
@@ -327,16 +324,16 @@
         File file = FileUtils.createTempFile("dataoutput", "test");
         try
         {
-            DataOutputStreamPlus write = new WrappedDataOutputStreamPlus(new FileOutputStream(file));
+            DataOutputStreamPlus write = new WrappedDataOutputStreamPlus(new FileOutputStreamPlus(file));
             DataInput canon = testWrite(write);
             write.close();
-            DataInputStream test = new DataInputStream(new FileInputStream(file));
+            DataInputStream test = new DataInputStream(new FileInputStreamPlus(file));
             testRead(test, canon);
             test.close();
         }
         finally
         {
-            Assert.assertTrue(file.delete());
+            Assert.assertTrue(file.tryDelete());
         }
     }
 
@@ -346,16 +343,16 @@
         File file = FileUtils.createTempFile("dataoutput", "test");
         try
         {
-            DataOutputStreamPlus write = new BufferedDataOutputStreamPlus(new FileOutputStream(file));
+            DataOutputStreamPlus write = new FileOutputStreamPlus(file);
             DataInput canon = testWrite(write);
             write.close();
-            DataInputStream test = new DataInputStream(new FileInputStream(file));
+            DataInputStream test = new DataInputStream(new FileInputStreamPlus(file));
             testRead(test, canon);
             test.close();
         }
         finally
         {
-            Assert.assertTrue(file.delete());
+            Assert.assertTrue(file.tryDelete());
         }
     }
 
@@ -366,17 +363,16 @@
         try
         {
             @SuppressWarnings("resource")
-            final RandomAccessFile raf = new RandomAccessFile(file, "rw");
-            DataOutputStreamPlus write = new BufferedDataOutputStreamPlus(raf.getChannel());
+            DataOutputStreamPlus write = new BufferedDataOutputStreamPlus(file.newReadWriteChannel());
             DataInput canon = testWrite(write);
             write.close();
-            DataInputStream test = new DataInputStream(new FileInputStream(file));
+            DataInputStream test = new DataInputStream(new FileInputStreamPlus(file));
             testRead(test, canon);
             test.close();
         }
         finally
         {
-            Assert.assertTrue(file.delete());
+            Assert.assertTrue(file.tryDelete());
         }
     }
 
@@ -390,10 +386,10 @@
         DataInput canon = testWrite(write);
         write.flush();
         write.close();
-        DataInputStream test = new DataInputStream(new FileInputStream(file));
+        DataInputStream test = new DataInputStream(new FileInputStreamPlus(file));
         testRead(test, canon);
         test.close();
-        Assert.assertTrue(file.delete());
+        Assert.assertTrue(file.tryDelete());
     }
 
     private DataInput testWrite(DataOutputPlus test) throws IOException
@@ -465,6 +461,21 @@
             canon.writeFloat(v);
         }
 
+        byte[] rndBytes = new byte[Long.BYTES];
+        for (int i = 1; i <= Long.BYTES; i++)
+        {
+            Arrays.fill(rndBytes, 0, rndBytes.length, (byte) 0);
+            rnd.nextBytes(rndBytes);
+            // keep only first i random bytes
+            Arrays.fill(rndBytes,  i, rndBytes.length, (byte) 0);
+            long val = ByteBufferUtil.toLong(ByteBuffer.wrap(rndBytes));
+            test.writeBytes(val, i);
+            byte[] arr = new byte[i];
+            System.arraycopy(rndBytes, 0, arr, 0, i);
+            canon.write(arr);
+        }
+
+
         // 27
         return new DataInputStream(new ByteArrayInputStream(bos.toByteArray()));
     }
@@ -483,6 +494,10 @@
         assert test.readByte() == canon.readByte();
         assert test.readDouble() == canon.readDouble();
         assert test.readFloat() == canon.readFloat();
+        for (int i = 1; i <= Long.BYTES; i++)
+        {
+            Assert.assertArrayEquals(ByteBufferUtil.readBytes(canon, i), ByteBufferUtil.readBytes(test, i));
+        }
         try
         {
             test.readInt();
diff --git a/test/unit/org/apache/cassandra/io/util/FileSegmentInputStreamTest.java b/test/unit/org/apache/cassandra/io/util/FileSegmentInputStreamTest.java
index b040d27..0f72e33 100644
--- a/test/unit/org/apache/cassandra/io/util/FileSegmentInputStreamTest.java
+++ b/test/unit/org/apache/cassandra/io/util/FileSegmentInputStreamTest.java
@@ -29,6 +29,7 @@
 
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -38,7 +39,7 @@
     private ByteBuffer allocateBuffer(int size)
     {
         ByteBuffer ret = ByteBuffer.allocate(Ints.checkedCast(size));
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         //seed = 365238103404423L;
         System.out.println("Seed " + seed);
 
diff --git a/test/unit/org/apache/cassandra/io/util/FileTest.java b/test/unit/org/apache/cassandra/io/util/FileTest.java
new file mode 100644
index 0000000..0a7c478
--- /dev/null
+++ b/test/unit/org/apache/cassandra/io/util/FileTest.java
@@ -0,0 +1,388 @@
+/**
+ * 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.io.util;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
+import java.nio.file.Files;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.function.BiFunction;
+import java.util.function.Function;
+import java.util.function.Predicate;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.RateLimiter;
+import org.apache.commons.lang3.RandomUtils;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.assertj.core.api.Assertions;
+import org.psjava.util.Triple;
+
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.config.CassandraRelevantProperties.JAVA_IO_TMPDIR;
+
+public class FileTest
+{
+    private static final java.io.File dir;
+    static
+    {
+        CassandraRelevantProperties.USE_NIX_RECURSIVE_DELETE.setBoolean(false);
+        java.io.File parent = new java.io.File(JAVA_IO_TMPDIR.getString()); //checkstyle: permit this instantiation
+        String dirName = Long.toHexString(ThreadLocalRandom.current().nextLong());
+        while (new java.io.File(parent, dirName).exists()) //checkstyle: permit this instantiation
+            dirName = Long.toHexString(ThreadLocalRandom.current().nextLong());
+        dir = new java.io.File(parent, dirName); //checkstyle: permit this instantiation
+        dir.mkdirs();
+        new File(dir).deleteRecursiveOnExit();
+
+        // PathUtils touches StorageService which touches StreamManager which requires configs be setup
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+
+    @Test
+    public void testEquivalence() throws IOException
+    {
+        java.io.File notExists = new java.io.File(dir, "notExists"); //checkstyle: permit this instantiation
+        java.io.File regular = new java.io.File(dir, "regular"); //checkstyle: permit this instantiation
+        regular.createNewFile();
+        java.io.File regularLink = new java.io.File(dir, "regularLink"); //checkstyle: permit this instantiation
+        Files.createSymbolicLink(regularLink.toPath(), regular.toPath());
+        java.io.File emptySubdir = new java.io.File(dir, "empty"); //checkstyle: permit this instantiation
+        java.io.File emptySubdirLink = new java.io.File(dir, "emptyLink"); //checkstyle: permit this instantiation
+        emptySubdir.mkdir();
+        Files.createSymbolicLink(emptySubdirLink.toPath(), emptySubdir.toPath());
+        java.io.File nonEmptySubdir = new java.io.File(dir, "nonEmpty"); //checkstyle: permit this instantiation
+        java.io.File nonEmptySubdirLink = new java.io.File(dir, "nonEmptyLink"); //checkstyle: permit this instantiation
+        nonEmptySubdir.mkdir();
+        Files.createSymbolicLink(nonEmptySubdirLink.toPath(), nonEmptySubdir.toPath());
+        new java.io.File(nonEmptySubdir, "something").createNewFile(); //checkstyle: permit this instantiation
+
+        testEquivalence("");
+
+        List<Runnable> setup = ImmutableList.of(
+            () -> {},
+            () -> dir.setWritable(false),
+            () -> dir.setReadable(false),
+            () -> dir.setWritable(true)
+        );
+
+        for (Runnable run : setup)
+        {
+            run.run();
+            testEquivalence(notExists.getPath());
+            testEquivalence(nonAbsolute(notExists));
+            testEquivalence(regular.getPath());
+            testEquivalence(nonAbsolute(regular));
+            testEquivalence(regularLink.getPath());
+            testEquivalence(nonAbsolute(regularLink));
+            testEquivalence(emptySubdir.getPath());
+            testEquivalence(nonAbsolute(emptySubdir));
+            testEquivalence(emptySubdirLink.getPath());
+            testEquivalence(nonAbsolute(emptySubdirLink));
+            testEquivalence(nonEmptySubdir.getPath());
+            testEquivalence(nonAbsolute(nonEmptySubdir));
+            testEquivalence(nonEmptySubdirLink.getPath());
+            testEquivalence(nonAbsolute(nonEmptySubdirLink));
+        }
+
+        emptySubdirLink.delete();
+        regularLink.delete();
+        regular.delete();
+        emptySubdir.delete();
+    }
+
+    private static String nonAbsolute(java.io.File file)
+    {
+        return file.getParent() + File.pathSeparator() + ".." + File.pathSeparator() + file.getParentFile().getName() + File.pathSeparator() + file.getName();
+    }
+
+    private void    testEquivalence(String path) throws IOException
+    {
+        java.io.File file = new java.io.File(path); //checkstyle: permit this instantiation
+        if (file.exists()) testExists(path);
+        else testNotExists(path);
+    }
+
+    private void testBasic(String path) throws IOException
+    {
+        // TODO: confirm - it seems that accuracy of lastModified may differ between APIs on Linux??
+        testEquivalence(path, f -> f.lastModified() / 1000, f -> f.lastModified() / 1000);
+        testEquivalence(path, java.io.File::length, File::length);
+        testEquivalence(path, java.io.File::canExecute, File::isExecutable);
+        testEquivalence(path, java.io.File::canRead, File::isReadable);
+        testEquivalence(path, java.io.File::canWrite, File::isWritable);
+        testEquivalence(path, java.io.File::exists, File::exists);
+        testEquivalence(path, java.io.File::isAbsolute, File::isAbsolute);
+        testEquivalence(path, java.io.File::isDirectory, File::isDirectory);
+        testEquivalence(path, java.io.File::isFile, File::isFile);
+        testEquivalence(path, java.io.File::getPath, File::path);
+        testEquivalence(path, java.io.File::getAbsolutePath, File::absolutePath);
+        testEquivalence(path, java.io.File::getCanonicalPath, File::canonicalPath);
+        testEquivalence(path, java.io.File::getParent, File::parentPath);
+        testEquivalence(path, java.io.File::toPath, File::toPath);
+        testEquivalence(path, java.io.File::list, File::tryListNames);
+        testEquivalence(path, java.io.File::listFiles, File::tryList);
+        java.io.File file = new java.io.File(path); //checkstyle: permit this instantiation
+        if (file.getParentFile() != null) testBasic(file.getParent());
+        if (!file.equals(file.getAbsoluteFile())) testBasic(file.getAbsolutePath());
+        if (!file.equals(file.getCanonicalFile())) testBasic(file.getCanonicalPath());
+    }
+
+    private void testPermissionsEquivalence(String path)
+    {
+        ImmutableList<Triple<BiFunction<java.io.File, Boolean, Boolean>, BiFunction<File, Boolean, Boolean>, Function<java.io.File, Boolean>>> tests = ImmutableList.of(
+            Triple.create(java.io.File::setReadable, File::trySetReadable, java.io.File::canRead),
+            Triple.create(java.io.File::setWritable, File::trySetWritable, java.io.File::canWrite),
+            Triple.create(java.io.File::setExecutable, File::trySetExecutable, java.io.File::canExecute)
+        );
+        for (Triple<BiFunction<java.io.File, Boolean, Boolean>, BiFunction<File, Boolean, Boolean>, Function<java.io.File, Boolean>> test : tests)
+        {
+            java.io.File file = new java.io.File(path); //checkstyle: permit this instantiation
+            boolean cur = test.v3.apply(file);
+            boolean canRead = file.canRead();
+            boolean canWrite = file.canWrite();
+            boolean canExecute = file.canExecute();
+            testEquivalence(path, f -> test.v1.apply(f, !cur), f -> test.v2.apply(f, !cur), (f, success) -> {
+                testEquivalence(path, java.io.File::canExecute, File::isExecutable);
+                testEquivalence(path, java.io.File::canRead, File::isReadable);
+                testEquivalence(path, java.io.File::canWrite, File::isWritable);
+                Assert.assertEquals(success != cur, test.v3.apply(file));
+                test.v1.apply(f, cur);
+            });
+            Assert.assertEquals(canRead, file.canRead());
+            Assert.assertEquals(canWrite, file.canWrite());
+            Assert.assertEquals(canExecute, file.canExecute());
+        }
+    }
+
+    private void testCreation(String path, IOConsumer<java.io.File> afterEach)
+    {
+        testEquivalence(path, java.io.File::createNewFile, File::createFileIfNotExists, afterEach);
+        testEquivalence(path, java.io.File::mkdir, File::tryCreateDirectory, afterEach);
+        testEquivalence(path, java.io.File::mkdirs, File::tryCreateDirectories, afterEach);
+    }
+
+    private void testExists(String path) throws IOException
+    {
+        testBasic(path);
+        testPermissionsEquivalence(path);
+        testCreation(path, ignore -> {});
+        testEquivalence(path, java.io.File::delete, File::tryDelete, (f, s) -> {if (s) f.createNewFile(); });
+        testTryVsConfirm(path, java.io.File::delete, File::delete, (f, s) -> {if (s) f.createNewFile(); });
+    }
+
+    private void testNotExists(String path) throws IOException
+    {
+        testBasic(path);
+        testPermissionsEquivalence(path);
+        testCreation(path, java.io.File::delete);
+        testEquivalence(path, java.io.File::delete, File::tryDelete);
+        testTryVsConfirm(path, java.io.File::delete, File::delete);
+    }
+
+    interface IOFn<I, O> { O apply(I in) throws IOException; }
+    interface IOConsumer<I1> { void accept(I1 i1) throws IOException; }
+    interface IOBiConsumer<I1, I2> { void accept(I1 i1, I2 i2) throws IOException; }
+
+    private <T> void testEquivalence(String path, IOFn<java.io.File, T> canonical, IOFn<File, T> test)
+    {
+        testEquivalence(path, canonical, test, ignore -> {});
+    }
+
+    private <T> void testEquivalence(String path, IOFn<java.io.File, T> canonical, IOFn<File, T> test, IOConsumer<java.io.File> afterEach)
+    {
+        testEquivalence(path, canonical, test, (f, ignore) -> afterEach.accept(f));
+    }
+
+    private <T> void testEquivalence(String path, IOFn<java.io.File, T> canonical, IOFn<File, T> test, IOBiConsumer<java.io.File, Boolean> afterEach)
+    {
+        java.io.File file = new java.io.File(path); //checkstyle: permit this instantiation
+        Object expect;
+        try
+        {
+            expect = canonical.apply(file);
+        }
+        catch (Throwable e)
+        {
+            expect = new Failed(e);
+        }
+        try { afterEach.accept(file, !(expect instanceof Failed) && !Boolean.FALSE.equals(expect)); } catch (IOException e) { throw new AssertionError(e); }
+        Object actual;
+        try
+        {
+            actual = test.apply(new File(path));
+        }
+        catch (Throwable e)
+        {
+            actual = new Failed(e);
+        }
+        try { afterEach.accept(file, !(actual instanceof Failed) && !Boolean.FALSE.equals(actual)); } catch (IOException e) { throw new AssertionError(e); }
+        if (expect instanceof String[] && actual instanceof String[]) Assert.assertArrayEquals((String[])expect, (String[])actual);
+        else if (expect instanceof java.io.File[] && actual instanceof File[]) assertArrayEquals((java.io.File[]) expect, (File[]) actual);
+        else Assert.assertEquals(path + "," + canonical.toString(), expect, actual);
+    }
+
+    private void testTryVsConfirm(String path, Predicate<java.io.File> canonical, IOConsumer<File> test)
+    {
+        testTryVsConfirm(path, canonical, test, (f, s) -> {});
+    }
+    private void testTryVsConfirm(String path, Predicate<java.io.File> canonical, IOConsumer<File> test, IOConsumer<java.io.File> afterEach)
+    {
+        testTryVsConfirm(path, canonical, test, (f, ignore) -> afterEach.accept(f));
+    }
+    private void testTryVsConfirm(String path, Predicate<java.io.File> canonical, IOConsumer<File> test, IOBiConsumer<java.io.File, Boolean> afterEach)
+    {
+        java.io.File file = new java.io.File(path); //checkstyle: permit this instantiation
+        boolean expect = canonical.test(file);
+        try { afterEach.accept(file, expect); } catch (IOException e) { throw new AssertionError(e); }
+        boolean actual;
+        try
+        {
+            test.accept(new File(path));
+            actual = true;
+        }
+        catch (Throwable e)
+        {
+            actual = false;
+        }
+        try { afterEach.accept(file, actual); } catch (IOException e) { throw new AssertionError(e); }
+        Assert.assertEquals(path + "," + canonical.toString(), expect, actual);
+    }
+
+    private static void assertArrayEquals(java.io.File[] expect, File[] actual)
+    {
+        Assert.assertEquals(expect.length, actual.length);
+        for (int i = 0 ; i < expect.length ; ++i)
+            Assert.assertEquals(expect[i].getPath(), actual[i].path());
+    }
+
+    private static class Failed
+    {
+        final Throwable with;
+
+        private Failed(Throwable with)
+        {
+            this.with = with;
+        }
+
+        @Override
+        public boolean equals(Object obj)
+        {
+            return obj instanceof Failed;
+        }
+
+        @Override
+        public String toString()
+        {
+            StringWriter sw = new StringWriter();
+            with.printStackTrace(new PrintWriter(sw));
+            return sw.toString();
+        }
+    }
+
+    @Test
+    public void testDeletes() throws IOException
+    {
+        File subdir = new File(dir, "deletes");
+        File file = new File(dir, "f");
+        subdir.tryCreateDirectory();
+        Assert.assertTrue(new File(subdir, "subsubdir").tryCreateDirectory());
+        subdir.deleteRecursive();
+        Assert.assertFalse(subdir.exists());
+
+        subdir.tryCreateDirectory();
+        file.createFileIfNotExists();
+        Assert.assertTrue(new File(subdir, "subsubdir").tryCreateDirectory());
+        long start = System.nanoTime();
+        RateLimiter rateLimiter = RateLimiter.create(2);
+        subdir.deleteRecursive(rateLimiter);
+        file.delete(rateLimiter);
+        long end = System.nanoTime();
+        Assert.assertTrue("" + NANOSECONDS.toMillis(end - start), SECONDS.toNanos(1) <= end - start);
+        Assert.assertFalse(subdir.exists());
+        Assert.assertFalse(file.exists());
+    }
+
+    @Test
+    public void testAncestry()
+    {
+        Assert.assertTrue(new File("somewhere/../").isAncestorOf(new File("somewhere")));
+        Assert.assertTrue(new File("../").isAncestorOf(new File("")));
+    }
+
+    @Test
+    public void testOverwrite() throws Exception
+    {
+        File f = new File(dir, UUID.randomUUID().toString());
+
+        // write
+        ByteBuffer buf = ByteBuffer.wrap(RandomUtils.nextBytes(100));
+        try (FileChannel fc = f.newWriteChannel(File.WriteMode.OVERWRITE))
+        {
+            fc.write(buf);
+        }
+        Assertions.assertThat(f.length()).isEqualTo(buf.array().length);
+        Assertions.assertThat(Files.readAllBytes(f.toPath())).isEqualTo(buf.array());
+
+        // overwrite
+        buf = ByteBuffer.wrap(RandomUtils.nextBytes(50));
+        try (FileChannel fc = f.newWriteChannel(File.WriteMode.OVERWRITE))
+        {
+            fc.write(buf);
+        }
+        Assertions.assertThat(f.length()).isEqualTo(buf.array().length);
+        Assertions.assertThat(Files.readAllBytes(f.toPath())).isEqualTo(buf.array());
+    }
+
+    @Test
+    public void testAppend() throws Exception
+    {
+        File f = new File(dir, UUID.randomUUID().toString());
+
+        // write
+        ByteBuffer buf1 = ByteBuffer.wrap(RandomUtils.nextBytes(100));
+        try (FileChannel fc = f.newWriteChannel(File.WriteMode.APPEND))
+        {
+            fc.write(buf1);
+        }
+        Assertions.assertThat(f.length()).isEqualTo(buf1.array().length);
+        Assertions.assertThat(Files.readAllBytes(f.toPath())).isEqualTo(buf1.array());
+
+        // overwrite
+        ByteBuffer buf2 = ByteBuffer.wrap(RandomUtils.nextBytes(50));
+        try (FileChannel fc = f.newWriteChannel(File.WriteMode.APPEND))
+        {
+            fc.write(buf2);
+        }
+        Assertions.assertThat(f.length()).isEqualTo(buf1.array().length + buf2.array().length);
+        ByteBuffer buf = ByteBuffer.allocate(buf1.array().length + buf2.array().length);
+        buf.put(buf1.array()).put(buf2.array());
+        Assertions.assertThat(Files.readAllBytes(f.toPath())).isEqualTo(buf.array());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/io/util/FileUtilsTest.java b/test/unit/org/apache/cassandra/io/util/FileUtilsTest.java
index 7d19f51..6f25b2e 100644
--- a/test/unit/org/apache/cassandra/io/util/FileUtilsTest.java
+++ b/test/unit/org/apache/cassandra/io/util/FileUtilsTest.java
@@ -18,9 +18,7 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -30,6 +28,7 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.assertj.core.api.Assertions;
 
@@ -53,26 +52,26 @@
         // test straightforward conversions for each unit
         assertEquals("FileUtils.parseFileSize() failed to parse a whole number of bytes",
             256L, FileUtils.parseFileSize("256 bytes"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of kilobytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of kibibytes",
             2048L, FileUtils.parseFileSize("2 KiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of megabytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of mebibytes",
             4194304L, FileUtils.parseFileSize("4 MiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of gigabytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of gibibytes",
             3221225472L, FileUtils.parseFileSize("3 GiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of terabytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a whole number of tebibytes",
             5497558138880L, FileUtils.parseFileSize("5 TiB"));
         // test conversions of fractional units
-        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of kilobytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of kibibytes",
             1536L, FileUtils.parseFileSize("1.5 KiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of kilobytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of kibibytes",
             4434L, FileUtils.parseFileSize("4.33 KiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of megabytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of mebibytes",
             2359296L, FileUtils.parseFileSize("2.25 MiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of megabytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of mebibytes",
             3292529L, FileUtils.parseFileSize("3.14 MiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of gigabytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of gibibytes",
             1299227607L, FileUtils.parseFileSize("1.21 GiB"));
-        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of terabytes",
+        assertEquals("FileUtils.parseFileSize() failed to parse a rational number of tebibytes",
             6621259022467L, FileUtils.parseFileSize("6.022 TiB"));
     }
 
@@ -88,11 +87,11 @@
         byte[] b = Files.readAllBytes(file.toPath());
         assertEquals(expected, new String(b, StandardCharsets.UTF_8));
 
-        FileUtils.truncate(file.getAbsolutePath(), 10);
+        FileUtils.truncate(file.absolutePath(), 10);
         b = Files.readAllBytes(file.toPath());
         assertEquals("The quick ", new String(b, StandardCharsets.UTF_8));
 
-        FileUtils.truncate(file.getAbsolutePath(), 0);
+        FileUtils.truncate(file.absolutePath(), 0);
         b = Files.readAllBytes(file.toPath());
         assertEquals(0, b.length);
     }
@@ -103,7 +102,7 @@
         File folder = createFolder(Paths.get(DatabaseDescriptor.getAllDataFileLocations()[0], "testFolderSize"));
         folder.deleteOnExit();
 
-        File childFolder = createFolder(Paths.get(folder.getPath(), "child"));
+        File childFolder = createFolder(Paths.get(folder.path(), "child"));
 
         File[] files = {
                        createFile(new File(folder, "001"), 10000),
@@ -222,16 +221,16 @@
 
     private File createFolder(Path path)
     {
-        File folder = path.toFile();
+        File folder = new File(path);
         FileUtils.createDirectory(folder);
         return folder;
     }
 
     private File createFile(File file, long size)
     {
-        try (RandomAccessFile f = new RandomAccessFile(file, "rw"))
+        try
         {
-            f.setLength(size);
+            Util.setFileLength(file, size);
         }
         catch (Exception e)
         {
diff --git a/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java b/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java
index 2814bab..7194d30 100644
--- a/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java
+++ b/test/unit/org/apache/cassandra/io/util/MmappedRegionsTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.Random;
@@ -38,12 +37,14 @@
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.schema.CompressionParams;
 
-import static junit.framework.Assert.assertNull;
+import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class MmappedRegionsTest
 {
     private static final Logger logger = LoggerFactory.getLogger(MmappedRegionsTest.class);
@@ -57,7 +58,7 @@
     private static ByteBuffer allocateBuffer(int size)
     {
         ByteBuffer ret = ByteBuffer.allocate(Ints.checkedCast(size));
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         //seed = 365238103404423L;
         logger.info("Seed {}", seed);
 
@@ -301,11 +302,11 @@
         File f = FileUtils.createTempFile("testMapForCompressionMetadata", "1");
         f.deleteOnExit();
 
-        File cf = FileUtils.createTempFile(f.getName() + ".metadata", "1");
+        File cf = FileUtils.createTempFile(f.name() + ".metadata", "1");
         cf.deleteOnExit();
 
         MetadataCollector sstableMetadataCollector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
-        try(SequentialWriter writer = new CompressedSequentialWriter(f, cf.getAbsolutePath(),
+        try(SequentialWriter writer = new CompressedSequentialWriter(f, cf.absolutePath(),
                                                                      null, SequentialWriterOption.DEFAULT,
                                                                      CompressionParams.snappy(), sstableMetadataCollector))
         {
@@ -313,7 +314,7 @@
             writer.finish();
         }
 
-        CompressionMetadata metadata = new CompressionMetadata(cf.getAbsolutePath(), f.length(), true);
+        CompressionMetadata metadata = new CompressionMetadata(cf.absolutePath(), f.length(), true);
         try(ChannelProxy channel = new ChannelProxy(f);
             MmappedRegions regions = MmappedRegions.map(channel, metadata))
         {
diff --git a/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java b/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java
index 829cfcf..31fa53c 100644
--- a/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java
+++ b/test/unit/org/apache/cassandra/io/util/NIODataInputStreamTest.java
@@ -25,10 +25,9 @@
 import java.io.DataInputStream;
 import java.io.DataOutputStream;
 import java.io.EOFException;
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
+import java.nio.channels.FileChannel;
 import java.nio.channels.ReadableByteChannel;
 import java.util.ArrayDeque;
 import java.util.Queue;
@@ -41,6 +40,7 @@
 import com.google.common.primitives.UnsignedInteger;
 import com.google.common.primitives.UnsignedLong;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.*;
 
 public class NIODataInputStreamTest
@@ -51,7 +51,7 @@
 
     void init()
     {
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         //seed = 365238103404423L;
         System.out.println("Seed " + seed);
         r = new Random(seed);
@@ -223,11 +223,11 @@
         assertEquals(8190 - 10 - 4096, is.available());
 
         File f = FileUtils.createTempFile("foo", "bar");
-        RandomAccessFile fos = new RandomAccessFile(f, "rw");
-        fos.write(new byte[10]);
-        fos.seek(0);
+        FileChannel fos = f.newReadWriteChannel();
+        fos.write(ByteBuffer.wrap(new byte[10]));
+        fos.position(0);
 
-        is = new NIODataInputStream(fos.getChannel(), 9);
+        is = new NIODataInputStream(fos, 9);
 
         int remaining = 10;
         assertEquals(10, is.available());
diff --git a/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java b/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java
index 8904daa..f933cf1 100644
--- a/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java
+++ b/test/unit/org/apache/cassandra/io/util/RandomAccessReaderTest.java
@@ -20,7 +20,6 @@
  */
 package org.apache.cassandra.io.util;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -43,6 +42,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.*;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -138,8 +138,8 @@
     @Test
     public void testVeryLarge() throws IOException
     {
-        final long SIZE = 1L << 32; // 2GB
-        Parameters params = new Parameters(SIZE, 1 << 20); // 1MB
+        final long SIZE = 1L << 32; // 2GiB
+        Parameters params = new Parameters(SIZE, 1 << 20); // 1MiB
 
 
         try (ChannelProxy channel = new ChannelProxy("abc", new FakeFileChannel(SIZE));
@@ -290,14 +290,14 @@
     private static void testReadFully(Parameters params) throws IOException
     {
         final File f = writeFile(params);
-        try (FileHandle.Builder builder = new FileHandle.Builder(f.getPath())
+        try (FileHandle.Builder builder = new FileHandle.Builder(f.path())
                                                      .bufferType(params.bufferType).bufferSize(params.bufferSize))
         {
             builder.mmapped(params.mmappedRegions);
             try (FileHandle fh = builder.complete();
                  RandomAccessReader reader = fh.createReader())
             {
-                assertEquals(f.getAbsolutePath(), reader.getPath());
+                assertEquals(f.absolutePath(), reader.getPath());
                 assertEquals(f.length(), reader.length());
                 assertEquals(f.length(), reader.bytesRemaining());
                 assertEquals(Math.min(Integer.MAX_VALUE, f.length()), reader.available());
@@ -331,11 +331,11 @@
 
         assert f.exists();
 
-        try (FileHandle.Builder builder = new FileHandle.Builder(f.getPath());
+        try (FileHandle.Builder builder = new FileHandle.Builder(f.path());
              FileHandle fh = builder.complete();
              RandomAccessReader reader = fh.createReader())
         {
-            assertEquals(f.getAbsolutePath(), reader.getPath());
+            assertEquals(f.absolutePath(), reader.getPath());
             assertEquals(expected.length(), reader.length());
 
             ByteBuffer b = ByteBufferUtil.read(reader, expected.length());
@@ -362,7 +362,7 @@
 
         assert f.exists();
 
-        try (FileHandle.Builder builder = new FileHandle.Builder(f.getPath());
+        try (FileHandle.Builder builder = new FileHandle.Builder(f.path());
              FileHandle fh = builder.complete();
              RandomAccessReader reader = fh.createReader())
         {
@@ -428,7 +428,7 @@
         final File f = FileUtils.createTempFile("testMark", "1");
         final byte[] expected = new byte[1 << 16];
 
-        long seed = System.nanoTime();
+        long seed = nanoTime();
         //seed = 365238103404423L;
         logger.info("Seed {}", seed);
         Random r = new Random(seed);
@@ -442,7 +442,7 @@
 
         assert f.exists();
 
-        try (FileHandle.Builder builder = new FileHandle.Builder(f.getPath()))
+        try (FileHandle.Builder builder = new FileHandle.Builder(f.path()))
         {
             final Runnable worker = () ->
             {
@@ -519,7 +519,7 @@
     {
         Parameters params = new Parameters(8192, 4096);
         final File f = writeFile(params);
-        try (FileHandle.Builder builder = new FileHandle.Builder(f.getPath())
+        try (FileHandle.Builder builder = new FileHandle.Builder(f.path())
                                                      .bufferType(params.bufferType).bufferSize(params.bufferSize))
         {
             builder.mmapped(params.mmappedRegions);
@@ -537,7 +537,7 @@
     {
         Parameters params = new Parameters(8192, 4096);
         final File f = writeFile(params);
-        try (FileHandle.Builder builder = new FileHandle.Builder(f.getPath())
+        try (FileHandle.Builder builder = new FileHandle.Builder(f.path())
                                                      .bufferType(params.bufferType).bufferSize(params.bufferSize))
         {
             try (FileHandle fh = builder.complete();
@@ -552,7 +552,7 @@
     private static void testSkipBytes(Parameters params, int expectationMultiples) throws IOException
     {
         final File f = writeFile(params);
-        try (FileHandle.Builder builder = new FileHandle.Builder(f.getPath())
+        try (FileHandle.Builder builder = new FileHandle.Builder(f.path())
                                                      .bufferType(params.bufferType).bufferSize(params.bufferSize))
         {
             builder.mmapped(params.mmappedRegions);
diff --git a/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java b/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java
deleted file mode 100644
index 08c9ddf..0000000
--- a/test/unit/org/apache/cassandra/io/util/RewindableDataInputStreamPlusTest.java
+++ /dev/null
@@ -1,539 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.io.util;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
-import java.io.File;
-import java.io.IOException;
-
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-public class RewindableDataInputStreamPlusTest
-{
-
-    private final int INITIAL_BUFFER_SIZE = 1;
-
-    private File file;
-
-    @Before
-    public void setup() throws Exception
-    {
-        this.file = new File(FileUtils.getTempDir(), "subdir/test.buffer");
-    }
-
-    @Test
-    public void testMarkAndResetSimple() throws Exception
-    {
-        byte[] testData;
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (DataOutputStream out = new DataOutputStream(baos))
-        {
-            // boolean
-            out.writeBoolean(true);
-            // byte
-            out.writeByte(0x1);
-            // char
-            out.writeChar('a');
-            // short
-            out.writeShort(1);
-            // int
-            out.writeInt(1);
-            // long
-            out.writeLong(1L);
-            // float
-            out.writeFloat(1.0f);
-            // double
-            out.writeDouble(1.0d);
-
-            // String
-            out.writeUTF("abc");
-            testData = baos.toByteArray();
-        }
-
-        for (int memCapacity = 0; memCapacity <= 16; memCapacity++)
-        {
-            int diskCapacity = 16 - memCapacity;
-            try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                          INITIAL_BUFFER_SIZE, memCapacity, file,
-                                                                                          diskCapacity))
-            {
-                try {
-                    //should mark before resetting
-                    reader.reset(null);
-                    fail("Should have thrown IOException");
-                } catch (IOException e) {}
-
-                assertTrue(reader.readBoolean());
-
-                reader.mark();
-
-                try {
-                    //cannot mark already marked stream
-                    reader.mark();
-                    fail("Should have thrown IllegalStateException");
-                } catch (IllegalStateException e) {}
-
-                assertEquals(0x1, reader.readByte());
-                assertEquals('a', reader.readChar());
-                assertEquals(3, reader.bytesPastMark(null));
-                reader.reset(null);
-
-                try {
-                    //cannot mark when reading from cache
-                    reader.mark();
-                    fail("Should have thrown IllegalStateException");
-                } catch (IllegalStateException e) {}
-
-                //read again previous sequence
-                assertEquals(0x1, reader.readByte());
-                assertEquals('a', reader.readChar());
-                //finish reading again previous sequence
-                assertEquals(1, reader.readShort());
-
-                reader.mark();
-                assertEquals(1, reader.readInt());
-                assertEquals(1L, reader.readLong());
-                assertEquals(1.0f, reader.readFloat(), 0);
-                assertEquals(16, reader.bytesPastMark(null));
-                reader.reset(null);
-
-                //read again previous sequence
-                assertEquals(1, reader.readInt());
-                assertEquals(1L, reader.readLong());
-                assertEquals(1.0f, reader.readFloat(), 0);
-                //finish reading again previous sequence
-
-                //mark again
-                reader.mark();
-                assertEquals(1.0d, reader.readDouble(), 0);
-                assertEquals(8, reader.bytesPastMark(null));
-                reader.reset(null);
-
-                //read again previous sequence
-                assertEquals(1.0d, reader.readDouble(), 0);
-                //finish reading again previous sequence
-
-                //mark and reset
-                reader.mark();
-                reader.reset(null);
-
-                assertEquals("abc", reader.readUTF());
-
-                //check max file size
-                assertEquals(diskCapacity, file.length());
-            }
-            assertFalse(file.exists());
-        }
-    }
-
-    @Test
-    public void testVeryLargeCapacity() throws Exception
-    {
-        byte[] testData;
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (DataOutputStream out = new DataOutputStream(baos))
-        {
-            out.writeUTF("abc");
-            testData = baos.toByteArray();
-        }
-
-        try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                      INITIAL_BUFFER_SIZE, Integer.MAX_VALUE, file,
-                                                                                      Integer.MAX_VALUE))
-        {
-            reader.mark();
-            assertEquals("abc", reader.readUTF());
-            reader.reset();
-            assertEquals("abc", reader.readUTF());
-        }
-        assertFalse(file.exists());
-
-
-        baos = new ByteArrayOutputStream();
-        try (DataOutputStream out = new DataOutputStream(baos))
-        {
-            out.writeBoolean(true);
-            out.writeBoolean(true);
-            testData = baos.toByteArray();
-        }
-    }
-
-    @Test
-    public void testMarkAndResetBigBuffer() throws Exception
-    {
-        byte[] testData;
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (DataOutputStream out = new DataOutputStream(baos))
-        {
-            // boolean
-            out.writeBoolean(true);
-            // byte
-            out.writeByte(0x1);
-            // char
-            out.writeChar('a');
-            // short
-            out.writeShort(1);
-            // int
-            out.writeInt(1);
-            // long
-            out.writeLong(1L);
-            // float
-            out.writeFloat(1.0f);
-            // double
-            out.writeDouble(1.0d);
-
-            // String
-            out.writeUTF("abc");
-            testData = baos.toByteArray();
-
-            // 1 (boolean) + 1 (byte) + 2 (char) + 2 (short) + 4 (int) + 8 (long)
-            // + 4 (float) + 8 (double) + 5 bytes (utf string)
-        }
-
-        for (int memCapacity = 0; memCapacity <= 18; memCapacity++)
-        {
-            int diskCapacity = 18 - memCapacity;
-            try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                          INITIAL_BUFFER_SIZE, memCapacity, file,
-                                                                                          diskCapacity))
-            {
-                //read a big amount before resetting
-                reader.mark();
-                assertTrue(reader.readBoolean());
-                assertEquals(0x1, reader.readByte());
-                assertEquals('a', reader.readChar());
-                assertEquals(1, reader.readShort());
-                assertEquals(1, reader.readInt());
-                assertEquals(1L, reader.readLong());
-                reader.reset();
-
-                //read from buffer
-                assertTrue(reader.readBoolean());
-                assertEquals(0x1, reader.readByte());
-                assertEquals('a', reader.readChar());
-                assertEquals(1, reader.readShort());
-                assertEquals(1, reader.readInt());
-                assertEquals(1L, reader.readLong());
-
-                assertEquals(17, reader.available());
-
-                //mark again
-                reader.mark();
-                assertEquals(1.0f, reader.readFloat(), 0);
-                assertEquals(1.0d, reader.readDouble(), 0);
-                assertEquals("abc", reader.readUTF());
-                reader.reset();
-
-                assertEquals(17, reader.available());
-
-                assertEquals(1.0f, reader.readFloat(), 0);
-                assertEquals(1.0d, reader.readDouble(), 0);
-                assertEquals("abc", reader.readUTF());
-            }
-            assertFalse(file.exists());
-        }
-    }
-
-
-    @Test
-    public void testCircularSpillFile() throws Exception
-    {
-        byte[] testData;
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (DataOutputStream out = new DataOutputStream(baos))
-        {
-            // boolean
-            out.writeBoolean(true);
-            // byte
-            out.writeByte(0x1);
-            // char
-            out.writeChar('a');
-            // short
-            out.writeShort(1);
-            // int
-            out.writeInt(1);
-
-            // String
-            out.writeUTF("ab");
-            testData = baos.toByteArray();
-
-            // 1 (boolean) + 1 (byte) + 2 (char) + 2 (short) + 4 (int) + 4 bytes (utf string)
-        }
-
-        //read at most 4 bytes multiple times (and then check file size)
-        int MEM_SIZE = 0;
-        int DISK_SIZE = 4;
-        try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                      INITIAL_BUFFER_SIZE, MEM_SIZE, file,
-                                                                                      DISK_SIZE))
-        {
-            //read 2 bytes and reset
-            reader.mark();
-            assertTrue(reader.readBoolean());
-            assertEquals(0x1, reader.readByte());
-            assertEquals(2, reader.bytesPastMark(null));
-            reader.reset();
-
-            //read again previous sequence
-            assertTrue(reader.readBoolean());
-            assertEquals(0x1, reader.readByte());
-            //finish reading again previous sequence
-
-            //read 4 bytes and reset
-            reader.mark();
-            assertEquals('a', reader.readChar());
-            assertEquals(1, reader.readShort());
-            assertEquals(4, reader.bytesPastMark(null));
-            reader.reset();
-
-            //read again previous sequence
-            assertEquals('a', reader.readChar());
-            assertEquals(1, reader.readShort());
-            //finish reading again previous sequence
-
-            //read 4 bytes and reset
-            reader.mark();
-            assertEquals(1, reader.readInt());
-            assertEquals(4, reader.bytesPastMark(null));
-            reader.reset();
-
-            //read again previous sequence
-            assertEquals(1, reader.readInt());
-
-            //check max file size
-            assertEquals(DISK_SIZE, file.length());
-        }
-        assertFalse(file.exists());
-    }
-
-    @Test
-    public void testExhaustCapacity() throws Exception
-    {
-        byte[] testData;
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (DataOutputStream out = new DataOutputStream(baos))
-        {
-            // boolean
-            out.writeBoolean(true);
-            // byte
-            out.writeByte(0x1);
-            // char
-            out.writeChar('a');
-            // short
-            out.writeShort(1);
-            testData = baos.toByteArray();
-        }
-
-        //test capacity exhausted when reading more than 4 bytes
-        testCapacityExhausted(testData, 0, 2);
-        testCapacityExhausted(testData, 2, 0);
-        testCapacityExhausted(testData, 1, 1);
-    }
-
-    private void testCapacityExhausted(byte[] testData, int memSize, int diskSize) throws IOException
-    {
-        try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                      INITIAL_BUFFER_SIZE, memSize, file,
-                                                                                      diskSize))
-        {
-            //read 2 bytes and reset
-            reader.mark();
-            assertTrue(reader.readBoolean());
-            assertEquals(0x1, reader.readByte());
-            assertEquals(2, reader.bytesPastMark(null));
-            reader.reset();
-
-            //read again previous sequence
-            assertTrue(reader.readBoolean());
-            assertEquals(0x1, reader.readByte());
-            //finish reading again previous sequence
-
-            reader.mark();
-            //read 3 bytes - START
-            assertEquals('a', reader.readChar());
-            //read 1 more bytes - CAPACITY will exhaust when trying to reset :(
-            assertEquals(1, reader.readShort());
-
-            try
-            {
-                reader.reset();
-                fail("Should have thrown IOException");
-            }
-            catch (IOException e) {}
-
-            //check max file size
-            assertEquals(diskSize, file.length());
-        }
-        assertFalse(file.exists());
-    }
-
-    @Test
-    public void testMarkAndResetUnsignedRead() throws Exception
-    {
-        byte[] testData;
-
-        ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        try (DataOutputStream out = new DataOutputStream(baos))
-        {
-            // byte
-            out.writeByte(0x1);
-            // short
-            out.writeShort(2);
-            testData = baos.toByteArray();
-        }
-
-        for (int memCapacity = 0; memCapacity <= 1; memCapacity++)
-        {
-            int diskCapacity = 1 - memCapacity;
-            try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                          INITIAL_BUFFER_SIZE, memCapacity, file,
-                                                                                          diskCapacity))
-            {
-                reader.mark();
-                assertEquals(1, reader.readUnsignedByte());
-                reader.reset();
-                assertEquals(1, reader.readUnsignedByte());
-
-                //will read first byte of short 2
-                reader.mark();
-                assertEquals(0, reader.readUnsignedByte());
-                reader.reset();
-
-                assertEquals(2, reader.readUnsignedShort());
-
-                reader.mark();
-                reader.reset();
-                assertEquals(0, reader.available());
-            }
-        }
-        assertFalse(file.exists());
-    }
-
-    @Test
-    public void testMarkAndResetSkipBytes() throws Exception
-    {
-        String testStr = "1234567890";
-        byte[] testData = testStr.getBytes();
-
-        for (int memCapacity = 0; memCapacity <= 7; memCapacity++)
-        {
-            int diskCapacity = 7 - memCapacity;
-            try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                          INITIAL_BUFFER_SIZE, memCapacity, file,
-                                                                                          diskCapacity))
-            {
-                reader.mark();
-                // read first 5 bytes and rewind
-                byte[] out = new byte[5];
-                reader.readFully(out, 0, 5);
-                assertEquals("12345", new String(out));
-
-                // then skip 2 bytes (67)
-                reader.skipBytes(2);
-
-                assertEquals(7, reader.bytesPastMark(null));
-                reader.reset();
-
-                //now read part of the previously skipped bytes
-                out = new byte[5];
-                reader.readFully(out);
-                assertEquals("12345", new String(out));
-
-                //skip 3 bytes (2 from cache, 1 from stream)
-                reader.skip(3);
-
-                // mark and read 2 more bytes
-                reader.mark();
-                out = new byte[2];
-                reader.readFully(out);
-                assertEquals("90", new String(out));
-                assertEquals(0, reader.available());
-                reader.reset();
-
-                //reset and read only the next byte "9" in the third position
-                reader.readFully(out, 1, 1);
-                assertEquals("99", new String(out));
-
-                //now we read the remainder via readline
-                assertEquals(1, reader.available());
-                assertEquals("0", reader.readLine());
-
-            }
-            assertFalse(file.exists());
-        }
-    }
-
-    @Test
-    public void testMarkAndResetReadFully() throws Exception
-    {
-        String testStr = "1234567890";
-        byte[] testData = testStr.getBytes();
-
-        for (int memCapacity = 0; memCapacity <= 5; memCapacity++)
-        {
-            int diskCapacity = 5 - memCapacity;
-            try (RewindableDataInputStreamPlus reader = new RewindableDataInputStreamPlus(new ByteArrayInputStream(testData),
-                                                                                          INITIAL_BUFFER_SIZE, memCapacity, file,
-                                                                                          diskCapacity))
-            {
-                reader.mark();
-                // read first 5 bytes and rewind
-                byte[] out = new byte[5];
-                reader.readFully(out, 0, 5);
-                assertEquals("12345", new String(out));
-                reader.reset();
-
-                // read half from cache, half from parent stream
-                out = new byte[7];
-                reader.readFully(out);
-                assertEquals("1234567", new String(out));
-
-                // mark and read 3 more bytes
-                reader.mark();
-                out = new byte[3];
-                reader.readFully(out);
-                assertEquals("890", new String(out));
-                assertEquals(0, reader.available());
-                reader.reset();
-
-                //reset and read only the next byte "8" in the third position
-                reader.readFully(out, 2, 1);
-                assertEquals("898", new String(out));
-
-                //now we read the remainder via readline
-                assertEquals(2, reader.available());
-                assertEquals("90", reader.readLine());
-            }
-            assertFalse(file.exists());
-        }
-    }
-}
diff --git a/test/unit/org/apache/cassandra/io/util/SequentialWriterTest.java b/test/unit/org/apache/cassandra/io/util/SequentialWriterTest.java
index c1ffda2..80543b0 100644
--- a/test/unit/org/apache/cassandra/io/util/SequentialWriterTest.java
+++ b/test/unit/org/apache/cassandra/io/util/SequentialWriterTest.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.io.util;
 
 import java.io.DataOutputStream;
-import java.io.File;
 import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -55,7 +54,7 @@
     public void cleanup()
     {
         for (TestableSW sw : writers)
-            sw.file.delete();
+            sw.file.tryDelete();
         writers.clear();
     }
 
@@ -100,14 +99,14 @@
         protected void assertInProgress() throws Exception
         {
             Assert.assertTrue(file.exists());
-            byte[] bytes = readFileToByteArray(file);
+            byte[] bytes = readFileToByteArray(file.toJavaIOFile());
             Assert.assertTrue(Arrays.equals(partialContents, bytes));
         }
 
         protected void assertPrepared() throws Exception
         {
             Assert.assertTrue(file.exists());
-            byte[] bytes = readFileToByteArray(file);
+            byte[] bytes = readFileToByteArray(file.toJavaIOFile());
             Assert.assertTrue(Arrays.equals(fullContents, bytes));
         }
 
@@ -125,7 +124,7 @@
         protected static File tempFile(String prefix)
         {
             File file = FileUtils.createTempFile(prefix, "test");
-            file.delete();
+            file.tryDelete();
             return file;
         }
     }
@@ -133,7 +132,7 @@
     @Test
     public void resetAndTruncateTest()
     {
-        File tempFile = new File(Files.createTempDir(), "reset.txt");
+        File tempFile = new File(Files.createTempDir().toPath(), "reset.txt");
         final int bufferSize = 48;
         final int writeSize = 64;
         byte[] toWrite = new byte[writeSize];
@@ -177,7 +176,7 @@
     @Test
     public void outputStream()
     {
-        File tempFile = new File(Files.createTempDir(), "test.txt");
+        File tempFile = new File(Files.createTempDir().toPath(), "test.txt");
         Assert.assertFalse("temp file shouldn't exist yet", tempFile.exists());
 
         SequentialWriterOption option = SequentialWriterOption.newBuilder().finishOnClose(true).build();
diff --git a/test/unit/org/apache/cassandra/locator/AssureSufficientLiveNodesTest.java b/test/unit/org/apache/cassandra/locator/AssureSufficientLiveNodesTest.java
index d5f62d7..1903e15 100644
--- a/test/unit/org/apache/cassandra/locator/AssureSufficientLiveNodesTest.java
+++ b/test/unit/org/apache/cassandra/locator/AssureSufficientLiveNodesTest.java
@@ -45,7 +45,7 @@
 import org.apache.cassandra.exceptions.UnavailableException;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.Tables;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.service.reads.NeverSpeculativeRetryPolicy;
@@ -253,9 +253,9 @@
                                                       Consumer<Keyspace> test) throws Throwable
     {
         String keyspaceName = keyspaceNameGen.get();
-        KeyspaceMetadata initKsMeta = KeyspaceMetadata.create(keyspaceName, init, Tables.of(SchemaLoader.standardCFMD("Foo", "Bar").build()));
+        KeyspaceMetadata initKsMeta = KeyspaceMetadata.create(keyspaceName, init, Tables.of(SchemaLoader.standardCFMD(keyspaceName, "Bar").build()));
         KeyspaceMetadata alterToKsMeta = initKsMeta.withSwapped(alterTo);
-        MigrationManager.announceNewKeyspace(initKsMeta, true);
+        SchemaTestUtil.announceNewKeyspace(initKsMeta);
         Keyspace racedKs = Keyspace.open(keyspaceName);
         ExecutorService es = Executors.newFixedThreadPool(2);
         try (AutoCloseable ignore = () -> {
diff --git a/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java b/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java
index b7d4243..98a9d16 100644
--- a/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java
+++ b/test/unit/org/apache/cassandra/locator/DynamicEndpointSnitchTest.java
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 import java.util.*;
-import java.util.concurrent.TimeUnit;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
diff --git a/test/unit/org/apache/cassandra/locator/InetAddressAndPortSerializerTest.java b/test/unit/org/apache/cassandra/locator/InetAddressAndPortSerializerTest.java
index c6ea3d7..78ecfb5 100644
--- a/test/unit/org/apache/cassandra/locator/InetAddressAndPortSerializerTest.java
+++ b/test/unit/org/apache/cassandra/locator/InetAddressAndPortSerializerTest.java
@@ -65,8 +65,8 @@
         }
         else
         {
-            assertEquals(address.address, roundtripped.address);
-            assertEquals(InetAddressAndPort.getDefaultPort(), roundtripped.port);
+            assertEquals(address.getAddress(), roundtripped.getAddress());
+            assertEquals(InetAddressAndPort.getDefaultPort(), roundtripped.getPort());
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java b/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java
index 78b9a6f..74e3646 100644
--- a/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java
+++ b/test/unit/org/apache/cassandra/locator/InetAddressAndPortTest.java
@@ -47,13 +47,13 @@
 
         //Test default port
         InetAddressAndPort address = InetAddressAndPort.getByName("127.0.0.1");
-        assertEquals(InetAddress.getByName("127.0.0.1"), address.address);
-        assertEquals(InetAddressAndPort.defaultPort, address.port);
+        assertEquals(InetAddress.getByName("127.0.0.1"), address.getAddress());
+        assertEquals(InetAddressAndPort.defaultPort, address.getPort());
 
         //Test overriding default port
         address = InetAddressAndPort.getByName("127.0.0.1:42");
-        assertEquals(InetAddress.getByName("127.0.0.1"), address.address);
-        assertEquals(42, address.port);
+        assertEquals(InetAddress.getByName("127.0.0.1"), address.getAddress());
+        assertEquals(42, address.getPort());
     }
 
     @Test
@@ -69,13 +69,13 @@
 
         //Test default port
         InetAddressAndPort address = InetAddressAndPort.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329");
-        assertEquals(InetAddress.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329"), address.address);
-        assertEquals(InetAddressAndPort.defaultPort, address.port);
+        assertEquals(InetAddress.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329"), address.getAddress());
+        assertEquals(InetAddressAndPort.defaultPort, address.getPort());
 
         //Test overriding default port
         address = InetAddressAndPort.getByName("[2001:0db8:0000:0000:0000:ff00:0042:8329]:42");
-        assertEquals(InetAddress.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329"), address.address);
-        assertEquals(42, address.port);
+        assertEquals(InetAddress.getByName("2001:0db8:0000:0000:0000:ff00:0042:8329"), address.getAddress());
+        assertEquals(42, address.getPort());
     }
 
     @Test
@@ -165,6 +165,41 @@
         assertEquals(ipv6forJMX, InetAddressAndPort.getByName(ipv6).getHostAddressAndPortForJMX());
     }
 
+    @Test
+    public void getHostNameForIPv4WithoutPortTest() throws Exception
+    {
+        byte[] ipBytes = new byte[] { 127, 0, 0, 1};
+        InetAddressAndPort obj = InetAddressAndPort.getByAddress(InetAddress.getByAddress("resolved4", ipBytes));
+        assertEquals("resolved4", obj.getHostName());
+        assertEquals("resolved4", obj.getHostName(false));
+    }
+
+    @Test
+    public void getHostNameForIPv6WithoutPortTest() throws Exception
+    {
+        byte[] ipBytes = new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29};
+        InetAddressAndPort obj = InetAddressAndPort.getByAddress(InetAddress.getByAddress("resolved6", ipBytes));
+        assertEquals("resolved6", obj.getHostName());
+        assertEquals("resolved6", obj.getHostName(false));
+    }
+
+    @Test
+    public void getHostNameForIPv4WitPortTest() throws Exception
+    {
+        InetAddress ipv4 = InetAddress.getByAddress("resolved4", new byte[] { 127, 0, 0, 1});
+        InetAddressAndPort obj = InetAddressAndPort.getByAddressOverrideDefaults(ipv4, 42);
+        assertEquals("resolved4:42", obj.getHostName(true));
+    }
+
+    @Test
+    public void getHostNameForIPv6WithPortTest() throws Exception
+    {
+        byte[] ipBytes = new byte[] { 0x20, 0x01, 0xd, (byte) 0xb8, 0, 0, 0, 0, 0, 0, (byte) 0xff, 0, 0x00, 0x42, (byte) 0x83, 0x29 };
+        InetAddress ipv6 = InetAddress.getByAddress("resolved6", ipBytes);
+        InetAddressAndPort obj = InetAddressAndPort.getByAddressOverrideDefaults(ipv6, 42);
+        assertEquals("resolved6:42", obj.getHostName(true));
+    }
+
     private void shouldThrow(ThrowingRunnable t, Class expectedClass)
     {
         try
diff --git a/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java b/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java
index ffdb59f..81d6694 100644
--- a/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java
+++ b/test/unit/org/apache/cassandra/locator/NetworkTopologyStrategyTest.java
@@ -481,7 +481,7 @@
         StorageService.instance.getTokenMetadata().updateNormalToken(new LongToken(1), FBUtilities.getBroadcastAddressAndPort());
         
         ClientWarn.instance.captureWarnings();
-        strategy.maybeWarnOnOptions();
+        strategy.maybeWarnOnOptions(null);
         assertTrue(ClientWarn.instance.getWarnings().stream().anyMatch(s -> s.contains("Your replication factor")));
     }
 }
diff --git a/test/unit/org/apache/cassandra/locator/PendingRangesTest.java b/test/unit/org/apache/cassandra/locator/PendingRangesTest.java
index 7959366..992c2dd 100644
--- a/test/unit/org/apache/cassandra/locator/PendingRangesTest.java
+++ b/test/unit/org/apache/cassandra/locator/PendingRangesTest.java
@@ -542,4 +542,4 @@
                                   DatabaseDescriptor.getEndpointSnitch(),
                                   Collections.singletonMap("replication_factor", Integer.toString(replicationFactor)));
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/locator/ReconnectableSnitchHelperTest.java b/test/unit/org/apache/cassandra/locator/ReconnectableSnitchHelperTest.java
index 0c2f272..d5a0ec3 100644
--- a/test/unit/org/apache/cassandra/locator/ReconnectableSnitchHelperTest.java
+++ b/test/unit/org/apache/cassandra/locator/ReconnectableSnitchHelperTest.java
@@ -20,7 +20,6 @@
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
-import java.util.Collections;
 
 import org.junit.After;
 import org.junit.BeforeClass;
diff --git a/test/unit/org/apache/cassandra/locator/ReplicaCollectionTest.java b/test/unit/org/apache/cassandra/locator/ReplicaCollectionTest.java
index e2d4797..cde69d2 100644
--- a/test/unit/org/apache/cassandra/locator/ReplicaCollectionTest.java
+++ b/test/unit/org/apache/cassandra/locator/ReplicaCollectionTest.java
@@ -25,15 +25,14 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Multimap;
-import org.apache.cassandra.dht.Murmur3Partitioner;
+
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.ReplicaCollection.Builder.Conflict;
-import org.apache.cassandra.utils.FBUtilities;
+
 import org.junit.Assert;
 import org.junit.Test;
 
-import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.AbstractMap;
 import java.util.Comparator;
@@ -43,7 +42,6 @@
 import java.util.stream.Collectors;
 
 import static com.google.common.collect.Iterables.*;
-import static com.google.common.collect.Iterables.filter;
 import static org.apache.cassandra.locator.Replica.fullReplica;
 import static org.apache.cassandra.locator.Replica.transientReplica;
 import static org.apache.cassandra.locator.ReplicaUtils.*;
diff --git a/test/unit/org/apache/cassandra/locator/ReplicaPlansTest.java b/test/unit/org/apache/cassandra/locator/ReplicaPlansTest.java
index 4d0dd47..8231b03 100644
--- a/test/unit/org/apache/cassandra/locator/ReplicaPlansTest.java
+++ b/test/unit/org/apache/cassandra/locator/ReplicaPlansTest.java
@@ -89,7 +89,7 @@
                 Keyspace ks = ks(ImmutableSet.of(EP1, EP2, EP3), ImmutableMap.of("DC1", "3", "DC2", "3"));
                 EndpointsForToken natural = EndpointsForToken.of(token, full(EP1), full(EP2), full(EP3), full(EP4), full(EP5), full(EP6));
                 EndpointsForToken pending = EndpointsForToken.empty(token);
-                ReplicaPlan.ForTokenWrite plan = ReplicaPlans.forWrite(ks, ConsistencyLevel.EACH_QUORUM, natural, pending, Predicates.alwaysTrue(), ReplicaPlans.writeNormal);
+                ReplicaPlan.ForWrite plan = ReplicaPlans.forWrite(ks, ConsistencyLevel.EACH_QUORUM, natural, pending, Predicates.alwaysTrue(), ReplicaPlans.writeNormal);
                 assertEquals(natural, plan.liveAndDown);
                 assertEquals(natural, plan.live);
                 assertEquals(natural, plan.contacts());
@@ -99,7 +99,7 @@
                 Keyspace ks = ks(ImmutableSet.of(EP1, EP2, EP3), ImmutableMap.of("DC1", "3", "DC2", "3"));
                 EndpointsForToken natural = EndpointsForToken.of(token, full(EP1), full(EP2), trans(EP3), full(EP4), full(EP5), trans(EP6));
                 EndpointsForToken pending = EndpointsForToken.empty(token);
-                ReplicaPlan.ForTokenWrite plan = ReplicaPlans.forWrite(ks, ConsistencyLevel.EACH_QUORUM, natural, pending, Predicates.alwaysTrue(), ReplicaPlans.writeNormal);
+                ReplicaPlan.ForWrite plan = ReplicaPlans.forWrite(ks, ConsistencyLevel.EACH_QUORUM, natural, pending, Predicates.alwaysTrue(), ReplicaPlans.writeNormal);
                 assertEquals(natural, plan.liveAndDown);
                 assertEquals(natural, plan.live);
                 EndpointsForToken expectContacts = EndpointsForToken.of(token, full(EP1), full(EP2), full(EP4), full(EP5));
diff --git a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java
index 4c1ff26..ca4841d 100644
--- a/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java
+++ b/test/unit/org/apache/cassandra/locator/SimpleStrategyTest.java
@@ -159,7 +159,7 @@
     {
         TokenMetadata tmd;
         AbstractReplicationStrategy strategy;
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             tmd = new TokenMetadata();
             strategy = getStrategy(keyspaceName, tmd, new SimpleSnitch());
@@ -214,7 +214,7 @@
         tmd.addBootstrapToken(bsToken, bootstrapEndpoint);
 
         AbstractReplicationStrategy strategy = null;
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             strategy = getStrategy(keyspaceName, tmd, new SimpleSnitch());
 
@@ -348,7 +348,7 @@
         StorageService.instance.getTokenMetadata().updateHostId(UUID.randomUUID(), FBUtilities.getBroadcastAddressAndPort());
         
         ClientWarn.instance.captureWarnings();
-        strategy.maybeWarnOnOptions();
+        strategy.maybeWarnOnOptions(null);
         assertTrue(ClientWarn.instance.getWarnings().stream().anyMatch(s -> s.contains("Your replication factor")));
     }
 
diff --git a/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java b/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java
index 9e34b93..c1b76b3 100644
--- a/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java
+++ b/test/unit/org/apache/cassandra/locator/TokenMetadataTest.java
@@ -19,17 +19,21 @@
 
 import java.net.UnknownHostException;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 
+import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableMultimap;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Multimap;
 
 import org.junit.BeforeClass;
+import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
@@ -55,7 +59,12 @@
     public static void beforeClass() throws Throwable
     {
         DatabaseDescriptor.daemonInitialization();
-        tmd = StorageService.instance.getTokenMetadata();
+    }
+
+    @Before
+    public void before() throws Throwable
+    {
+        tmd = new TokenMetadata();
         tmd.updateNormalToken(token(ONE), InetAddressAndPort.getByName("127.0.0.1"));
         tmd.updateNormalToken(token(SIX), InetAddressAndPort.getByName("127.0.0.6"));
     }
@@ -348,4 +357,43 @@
         assertEquals(0, tokenMetadata.getSizeOfLeavingEndpoints());
         assertEquals(0, tokenMetadata.getSizeOfMovingEndpoints());
     }
+
+
+    @Test
+    public void testRemoveEndpointTokenChange() throws Exception
+    {
+        TokenMetadata metadata = StorageService.instance.getTokenMetadata();
+        metadata.clearUnsafe();
+
+        Collection<Token> tokens = new HashSet<>();
+        tokens.add(DatabaseDescriptor.getPartitioner().getRandomToken());
+        tokens.add(DatabaseDescriptor.getPartitioner().getRandomToken());
+
+        InetAddressAndPort ep1 = InetAddressAndPort.getByName("127.0.0.1");
+        InetAddressAndPort ep2 = InetAddressAndPort.getByName("127.0.0.2");
+
+        Multimap<InetAddressAndPort, Token> endpointTokens = HashMultimap.create();
+        for (Token token : tokens)
+            endpointTokens.put(ep1, token);
+
+        endpointTokens.put(ep2, DatabaseDescriptor.getPartitioner().getRandomToken());
+
+        long ver = metadata.getRingVersion();
+        metadata.updateNormalTokens(endpointTokens);
+        assertTrue(metadata.getRingVersion() > ver);
+
+        // Remove a normal endpoint
+        assertTrue(metadata.isMember(ep2));
+        ver = metadata.getRingVersion();
+        metadata.removeEndpoint(ep2);
+        assertFalse(metadata.isMember(ep2));
+        assertTrue(metadata.getRingVersion() > ver);
+
+        // Remove a non-exist endpoint (e.g. proxy node is not part of token metadata)
+        InetAddressAndPort ep3 = InetAddressAndPort.getByName("127.0.0.3");
+        assertFalse(metadata.isMember(ep3));
+        ver = metadata.getRingVersion();
+        metadata.removeEndpoint(ep3);
+        assertEquals(ver, metadata.getRingVersion());
+    }
 }
diff --git a/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java b/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java
index 439ed73..b90f19a 100644
--- a/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/BatchMetricsTest.java
@@ -21,6 +21,7 @@
 import java.io.IOException;
 import java.util.concurrent.TimeUnit;
 
+import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -28,21 +29,20 @@
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.EmbeddedCassandraService;
-import org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot;
 
 import static org.apache.cassandra.cql3.statements.BatchStatement.metrics;
-import static org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir.*;
+import static org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot;
+import static org.apache.cassandra.metrics.DecayingEstimatedHistogramReservoir.Range;
 import static org.junit.Assert.assertEquals;
 import static org.quicktheories.QuickTheory.qt;
 import static org.quicktheories.generators.Generate.intArrays;
 import static org.quicktheories.generators.SourceDSL.integers;
 
-public class BatchMetricsTest extends SchemaLoader
+public class BatchMetricsTest
 {
     private static final int MAX_ROUNDS_TO_PERFORM = 3;
     private static final int MAX_DISTINCT_PARTITIONS = 128;
@@ -63,13 +63,11 @@
     @BeforeClass()
     public static void setup() throws ConfigurationException, IOException
     {
-        Schema.instance.clear();
-
-        cassandra = new EmbeddedCassandraService();
-        cassandra.start();
-
+        DatabaseDescriptor.daemonInitialization();
         DatabaseDescriptor.setWriteRpcTimeout(TimeUnit.SECONDS.toMillis(10));
 
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
+
         cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
         session = cluster.connect();
 
@@ -82,6 +80,15 @@
         psCounter = session.prepare("UPDATE " + KEYSPACE + '.' + COUNTER_TABLE + " SET val = val + 1 WHERE id = ?;");
     }
 
+    @AfterClass
+    public static void tearDown()
+    {
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
+    }
+
     private void executeLoggerBatch(BatchStatement.Type batchStatementType, int distinctPartitions, int statementsPerPartition)
     {
         BatchStatement batch = new BatchStatement(batchStatementType);
diff --git a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java
index 3971b9f..c41ded3 100644
--- a/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/CQLMetricsTest.java
@@ -20,35 +20,35 @@
 
 import java.io.IOException;
 
+import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
-import org.apache.cassandra.SchemaLoader;
+import com.datastax.driver.core.exceptions.InvalidQueryException;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
-public class CQLMetricsTest extends SchemaLoader
+public class CQLMetricsTest
 {
-    private static EmbeddedCassandraService cassandra;
-
     private static Cluster cluster;
     private static Session session;
+    private static EmbeddedCassandraService cassandra;
 
     @BeforeClass()
     public static void setup() throws ConfigurationException, IOException
     {
-        Schema.instance.clear();
-
-        cassandra = new EmbeddedCassandraService();
-        cassandra.start();
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
 
         cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
         session = cluster.connect();
@@ -57,11 +57,43 @@
         session.execute("CREATE TABLE IF NOT EXISTS junit.metricstest (id int PRIMARY KEY, val text);");
     }
 
+    @AfterClass
+    public static void tearDown()
+    {
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
+    }
+
+    @Test
+    public void testConnectionWithUseDisabled()
+    {
+        long useCountBefore = QueryProcessor.metrics.useStatementsExecuted.getCount();
+        DatabaseDescriptor.setUseStatementsEnabled(false);
+
+        try (Session ignored = cluster.connect("junit"))
+        {
+            fail("expected USE statement to fail with use_statements_enabled = false");
+        }
+        catch (InvalidQueryException e)
+        {
+            Assert.assertEquals(useCountBefore, QueryProcessor.metrics.useStatementsExecuted.getCount());
+            assertTrue(e.getMessage().contains("USE statements prohibited"));
+        }
+        finally
+        {
+            DatabaseDescriptor.setUseStatementsEnabled(true);
+        }
+    }
+
     @Test
     public void testPreparedStatementsCount()
     {
         int n = QueryProcessor.metrics.preparedStatementsCount.getValue();
+        long useCountBefore = QueryProcessor.metrics.useStatementsExecuted.getCount();
         session.execute("use junit");
+        Assert.assertEquals(useCountBefore + 1, QueryProcessor.metrics.useStatementsExecuted.getCount());
         session.prepare("SELECT * FROM junit.metricstest WHERE id = ?");
         assertEquals(n+2, (int) QueryProcessor.metrics.preparedStatementsCount.getValue());
     }
@@ -104,15 +136,15 @@
         clearMetrics();
         PreparedStatement metricsStatement = session.prepare("INSERT INTO junit.metricstest (id, val) VALUES (?, ?)");
 
-        assertEquals(Double.NaN, QueryProcessor.metrics.preparedStatementsRatio.getValue());
+        assertEquals(Double.NaN, QueryProcessor.metrics.preparedStatementsRatio.getValue(), 0.0);
 
         for (int i = 0; i < 10; i++)
             session.execute(metricsStatement.bind(i, "val" + i));
-        assertEquals(1.0, QueryProcessor.metrics.preparedStatementsRatio.getValue());
+        assertEquals(1.0, QueryProcessor.metrics.preparedStatementsRatio.getValue(), 0.0);
 
         for (int i = 0; i < 10; i++)
             session.execute(String.format("INSERT INTO junit.metricstest (id, val) VALUES (%d, '%s')", i, "val" + i));
-        assertEquals(0.5, QueryProcessor.metrics.preparedStatementsRatio.getValue());
+        assertEquals(0.5, QueryProcessor.metrics.preparedStatementsRatio.getValue(), 0.0);
     }
 
     private void clearMetrics()
diff --git a/test/unit/org/apache/cassandra/metrics/CassandraMetricsRegistryTest.java b/test/unit/org/apache/cassandra/metrics/CassandraMetricsRegistryTest.java
index cd9866c..02e4228 100644
--- a/test/unit/org/apache/cassandra/metrics/CassandraMetricsRegistryTest.java
+++ b/test/unit/org/apache/cassandra/metrics/CassandraMetricsRegistryTest.java
@@ -24,13 +24,17 @@
 
 import java.lang.management.ManagementFactory;
 import java.util.Collection;
+import java.util.concurrent.TimeUnit;
 
+import com.codahale.metrics.Timer;
 import org.apache.cassandra.metrics.CassandraMetricsRegistry.MetricName;
+
 import org.junit.Test;
 
 import com.codahale.metrics.jvm.BufferPoolMetricSet;
 import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
 import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
+import org.apache.cassandra.utils.EstimatedHistogram;
 
 
 public class CassandraMetricsRegistryTest
@@ -107,4 +111,53 @@
         assertArrayEquals(count, CassandraMetricsRegistry.delta(count, new long[3]));
         assertArrayEquals(new long[6], CassandraMetricsRegistry.delta(count, new long[]{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}));
     }
+
+    /**
+     * Test the updated timer values are estimated correctly (i.e., in the valid range, 1.2) in the micros based histogram.
+     */
+    @Test
+    public void testTimer()
+    {
+        long[] offsets = EstimatedHistogram.newOffsets(DecayingEstimatedHistogramReservoir.LOW_BUCKET_COUNT, false);
+        Timer timer = new Timer(CassandraMetricsRegistry.createReservoir(TimeUnit.MICROSECONDS));
+        timer.update(42, TimeUnit.NANOSECONDS);
+        timer.update(100, TimeUnit.NANOSECONDS);
+        timer.update(42, TimeUnit.MICROSECONDS);
+        timer.update(100, TimeUnit.MICROSECONDS);
+        timer.update(42, TimeUnit.MILLISECONDS);
+        timer.update(100, TimeUnit.MILLISECONDS);
+        timer.update(100, TimeUnit.SECONDS);
+        timer.update(100, TimeUnit.MINUTES);
+        int maxSeconds = 21356;
+        timer.update(maxSeconds, TimeUnit.SECONDS);
+        long[] counts = timer.getSnapshot().getValues();
+        int expectedBucketsWithValues = 8;
+        int bucketsWithValues = 0;
+        for (int i = 0; i < counts.length; i++)
+        {
+            if (counts[i] != 0)
+            {
+                bucketsWithValues ++;
+                assertTrue(
+                inRange(offsets[i], TimeUnit.NANOSECONDS.toMicros(42), 1.2)
+                || inRange(offsets[i], TimeUnit.NANOSECONDS.toMicros(100), 1.2)
+                || inRange(offsets[i], TimeUnit.MICROSECONDS.toMicros(42), 1.2)
+                || inRange(offsets[i], TimeUnit.MICROSECONDS.toMicros(100), 1.2)
+                || inRange(offsets[i], TimeUnit.MILLISECONDS.toMicros(42), 1.2)
+                || inRange(offsets[i], TimeUnit.MILLISECONDS.toMicros(100), 1.2)
+                || inRange(offsets[i], TimeUnit.SECONDS.toMicros(100), 1.2)
+                || inRange(offsets[i], TimeUnit.MINUTES.toMicros(100), 1.2)
+                || inRange(offsets[i], TimeUnit.SECONDS.toMicros(maxSeconds), 1.2)
+                );
+            }
+        }
+        assertEquals("42 and 100 nanos should both be put in the first bucket",
+                            2, counts[0]);
+        assertEquals(expectedBucketsWithValues, bucketsWithValues);
+    }
+
+    private boolean inRange(long anchor, long input, double range)
+    {
+        return input / ((double) anchor) < range;
+    }
 }
diff --git a/test/unit/org/apache/cassandra/metrics/ClientRequestMetricsTest.java b/test/unit/org/apache/cassandra/metrics/ClientRequestMetricsTest.java
new file mode 100644
index 0000000..650bd95
--- /dev/null
+++ b/test/unit/org/apache/cassandra/metrics/ClientRequestMetricsTest.java
@@ -0,0 +1,227 @@
+/*
+ * 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.metrics;
+
+import java.io.IOException;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.BatchStatement;
+import com.datastax.driver.core.BoundStatement;
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.PreparedStatement;
+import com.datastax.driver.core.Session;
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.service.EmbeddedCassandraService;
+
+import static com.datastax.driver.core.Cluster.builder;
+import static org.junit.Assert.assertEquals;
+
+public class ClientRequestMetricsTest
+{
+    private static Cluster cluster;
+    private static Session session;
+
+    private static final String KEYSPACE = "junit";
+    private static final String TABLE = "clientrequestsmetricstest";
+
+    private static PreparedStatement writePS;
+    private static PreparedStatement paxosPS;
+    private static PreparedStatement readPS;
+    private static PreparedStatement readRangePS;
+
+    private static final ClientRequestMetrics readMetrics = ClientRequestsMetricsHolder.readMetrics;
+    private static final ClientWriteRequestMetrics writeMetrics = ClientRequestsMetricsHolder.writeMetrics;
+
+    private static EmbeddedCassandraService cassandra;
+
+    @BeforeClass
+    public static void setup() throws ConfigurationException, IOException
+    {
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
+
+        cluster = builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
+        session = cluster.connect();
+
+        session.execute("CREATE KEYSPACE IF NOT EXISTS " + KEYSPACE + " WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };");
+        session.execute("USE " + KEYSPACE);
+        session.execute("CREATE TABLE IF NOT EXISTS " + TABLE + " (id int, ord int, val text, PRIMARY KEY (id, ord));");
+
+        writePS = session.prepare("INSERT INTO " + KEYSPACE + '.' + TABLE + " (id, ord, val) VALUES (?, ?, ?);");
+        paxosPS = session.prepare("INSERT INTO " + KEYSPACE + '.' + TABLE + " (id, ord, val) VALUES (?, ?, ?) IF NOT EXISTS;");
+        readPS = session.prepare("SELECT * FROM " + KEYSPACE + '.' + TABLE + " WHERE id=?;");
+        readRangePS = session.prepare("SELECT * FROM " + KEYSPACE + '.' + TABLE + " WHERE id=? AND ord>=? AND ord <= ?;");
+    }
+
+    @AfterClass
+    public static void tearDown()
+    {
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
+    }
+
+    @Test
+    public void testWriteStatement()
+    {
+        ClientRequestMetricsContainer writeMetricsContainer = new ClientRequestMetricsContainer(writeMetrics);
+        ClientRequestMetricsContainer readMetricsContainer = new ClientRequestMetricsContainer(readMetrics);
+
+        executeWrite(1, 1, "aaaa");
+
+        assertEquals(1, writeMetricsContainer.compareLocalRequest());
+        assertEquals(0, writeMetricsContainer.compareRemoteRequest());
+
+        assertEquals(0, readMetricsContainer.compareLocalRequest());
+        assertEquals(0, readMetricsContainer.compareRemoteRequest());
+    }
+
+    @Test
+    public void testPaxosStatement()
+    {
+        ClientRequestMetricsContainer writeMetricsContainer = new ClientRequestMetricsContainer(writeMetrics);
+        ClientRequestMetricsContainer readMetricsContainer = new ClientRequestMetricsContainer(readMetrics);
+
+        executePAXOS(2, 2, "aaaa");
+
+        assertEquals(1, readMetricsContainer.compareLocalRequest());
+        assertEquals(0, readMetricsContainer.compareRemoteRequest());
+
+        assertEquals(1, writeMetricsContainer.compareLocalRequest());
+        assertEquals(0, writeMetricsContainer.compareRemoteRequest());
+    }
+
+    @Test
+    public void testBatchStatement()
+    {
+        ClientRequestMetricsContainer writeMetricsContainer = new ClientRequestMetricsContainer(writeMetrics);
+        ClientRequestMetricsContainer readMetricsContainer = new ClientRequestMetricsContainer(readMetrics);
+
+        executeBatch(10, 10);
+
+        assertEquals(0, readMetricsContainer.compareLocalRequest());
+        assertEquals(0, readMetricsContainer.compareRemoteRequest());
+
+        assertEquals(10, writeMetricsContainer.compareLocalRequest());
+        assertEquals(0, writeMetricsContainer.compareRemoteRequest());
+    }
+
+    @Test
+    public void testReadStatement()
+    {
+        executeWrite(1, 1, "aaaa");
+
+        ClientRequestMetricsContainer writeMetricsContainer = new ClientRequestMetricsContainer(writeMetrics);
+        ClientRequestMetricsContainer readMetricsContainer = new ClientRequestMetricsContainer(readMetrics);
+
+        executeRead(1);
+
+        assertEquals(1, readMetricsContainer.compareLocalRequest());
+        assertEquals(0, readMetricsContainer.compareRemoteRequest());
+
+        assertEquals(0, writeMetricsContainer.compareLocalRequest());
+        assertEquals(0, writeMetricsContainer.compareRemoteRequest());
+    }
+
+    @Test
+    public void testRangeStatement()
+    {
+        executeBatch(1, 100);
+
+        ClientRequestMetricsContainer writeMetricsContainer = new ClientRequestMetricsContainer(writeMetrics);
+        ClientRequestMetricsContainer readMetricsContainer = new ClientRequestMetricsContainer(readMetrics);
+
+        executeSlice(1, 0, 99);
+
+        assertEquals(1, readMetricsContainer.compareLocalRequest());
+        assertEquals(0, readMetricsContainer.compareRemoteRequest());
+
+        assertEquals(0, writeMetricsContainer.compareLocalRequest());
+        assertEquals(0, writeMetricsContainer.compareRemoteRequest());
+    }
+
+
+    private static class ClientRequestMetricsContainer
+    {
+        private final ClientRequestMetrics metrics;
+
+        private final long localRequests;
+        private final long remoteRequests;
+
+        public ClientRequestMetricsContainer(ClientRequestMetrics clientRequestMetrics)
+        {
+            metrics = clientRequestMetrics;
+            localRequests = metrics.localRequests.getCount();
+            remoteRequests = metrics.remoteRequests.getCount();
+        }
+
+        public long compareLocalRequest()
+        {
+            return metrics.localRequests.getCount() - localRequests;
+        }
+
+        public long compareRemoteRequest()
+        {
+            return metrics.remoteRequests.getCount() - remoteRequests;
+        }
+    }
+
+    private void executeWrite(int id, int ord, String val)
+    {
+        BoundStatement bs = writePS.bind(id, ord, val);
+        session.execute(bs);
+    }
+
+    private void executePAXOS(int id, int ord, String val)
+    {
+        BoundStatement bs = paxosPS.bind(id, ord, val);
+        session.execute(bs);
+    }
+
+    private void executeBatch(int distinctPartitions, int numClusteringKeys)
+    {
+        BatchStatement batch = new BatchStatement();
+
+        for (int i = 0; i < distinctPartitions; i++)
+        {
+            for (int y = 0; y < numClusteringKeys; y++)
+            {
+                batch.add(writePS.bind(i, y, "aaaaaaaa"));
+            }
+        }
+        session.execute(batch);
+    }
+
+    private void executeRead(int id)
+    {
+        BoundStatement bs = readPS.bind(id);
+        session.execute(bs);
+    }
+
+    private void executeSlice(int id, int start_range, int end_range)
+    {
+        BoundStatement bs = readRangePS.bind(id, start_range, end_range);
+        session.execute(bs);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/metrics/ClientRequestSizeMetricsTest.java b/test/unit/org/apache/cassandra/metrics/ClientRequestSizeMetricsTest.java
index 1f2f771..f19fca5 100644
--- a/test/unit/org/apache/cassandra/metrics/ClientRequestSizeMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/ClientRequestSizeMetricsTest.java
@@ -69,7 +69,9 @@
         // We explicitly disable scheme fetching to avoid that effect
         try
         {
-            reinitializeNetwork(builder -> builder.withQueryOptions(new QueryOptions().setMetadataEnabled(false)));
+            reinitializeNetwork(builder -> {}, builder -> builder.withQueryOptions(new QueryOptions().setMetadataEnabled(false)));
+            sessionNet(version); // Ensure that the connection is open
+
             // We want to ignore all the messages sent by the driver upon connection as well as
             // the event sent upon schema updates
             clearMetrics();
diff --git a/test/unit/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoirTest.java b/test/unit/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoirTest.java
index b62078c..64fb00d 100644
--- a/test/unit/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoirTest.java
+++ b/test/unit/org/apache/cassandra/metrics/DecayingEstimatedHistogramReservoirTest.java
@@ -19,593 +19,644 @@
 package org.apache.cassandra.metrics;
 
 import java.util.Arrays;
-import java.util.BitSet;
+import java.util.Collection;
 import java.util.Random;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.LockSupport;
+import java.util.function.Function;
 
-import org.assertj.core.api.Assertions;
+import com.google.common.collect.ImmutableList;
 import org.junit.Assert;
 import org.junit.Ignore;
 import org.junit.Test;
+import org.junit.experimental.runners.Enclosed;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
 
-import com.codahale.metrics.Clock;
 import com.codahale.metrics.Snapshot;
 import org.apache.cassandra.utils.EstimatedHistogram;
+import org.apache.cassandra.utils.MonotonicClock;
+import org.apache.cassandra.utils.MonotonicClockTranslation;
 import org.apache.cassandra.utils.Pair;
 import org.quicktheories.core.Gen;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.quicktheories.QuickTheory.qt;
 import static org.quicktheories.generators.SourceDSL.*;
 
+@RunWith(Enclosed.class)
 public class DecayingEstimatedHistogramReservoirTest
 {
-    private static final double DOUBLE_ASSERT_DELTA = 0;
-
-    public static final int numExamples = 1000000;
-    public static final Gen<long[]> offsets = integers().from(DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT)
-                                                        .upToAndIncluding(DecayingEstimatedHistogramReservoir.MAX_BUCKET_COUNT - 10)
-                                                        .zip(booleans().all(), EstimatedHistogram::newOffsets);
-
-
-    @Test
-    public void testFindIndex()
+    public static class NonParameterizedTests
     {
-        qt().withExamples(numExamples)
-            .forAll(booleans().all()
-                              .flatMap(b -> offsets.flatMap(offs -> this.offsetsAndValue(offs, b, 0))))
-            .check(this::checkFindIndex);
-    }
+        public static final int numExamples = 1000000;
 
-    private boolean checkFindIndex(Pair<long[], Long> offsetsAndValue)
-    {
-        long[] offsets = offsetsAndValue.left;
-        long value = offsetsAndValue.right;
-
-        int model = findIndexModel(offsets, value);
-        int actual = DecayingEstimatedHistogramReservoir.findIndex(offsets, value);
-
-        return model == actual;
-    }
-
-    private int findIndexModel(long[] offsets, long value)
-    {
-        int modelIndex = Arrays.binarySearch(offsets, value);
-        if (modelIndex < 0)
-            modelIndex = -modelIndex - 1;
-
-        return modelIndex;
-    };
-
-    @Test
-    public void showEstimationWorks()
-    {
-        qt().withExamples(numExamples)
-            .forAll(offsets.flatMap(offs -> this.offsetsAndValue(offs, false, 9)))
-            .check(this::checkEstimation);
-    }
-
-    public boolean checkEstimation(Pair<long[], Long> offsetsAndValue)
-    {
-        long[] offsets = offsetsAndValue.left;
-        long value = offsetsAndValue.right;
-        boolean considerZeros = offsets[0] == 0;
-
-        int modelIndex = Arrays.binarySearch(offsets, value);
-        if (modelIndex < 0)
-            modelIndex = -modelIndex - 1;
-
-        int estimate = (int) DecayingEstimatedHistogramReservoir.fastLog12(value);
-
-        if (considerZeros)
-            return estimate - 3 == modelIndex || estimate - 2 == modelIndex;
-        else
-            return estimate - 4 == modelIndex || estimate - 3 == modelIndex;
-    }
-
-
-    private Gen<Pair<long[], Long>> offsetsAndValue(long[] offsets, boolean useMaxLong, long minValue)
-    {
-        return longs().between(minValue, useMaxLong ? Long.MAX_VALUE : offsets[offsets.length - 1] + 100)
-                      .mix(longs().between(minValue, minValue + 10),50)
-                      .map(value -> Pair.create(offsets, value));
-    }
-
-    //shows that the max before overflow is 238 buckets regardless of consider zeros
-    @Test
-    @Ignore
-    public void showHistorgramOffsetOverflow()
-    {
-        qt().forAll(integers().from(DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT).upToAndIncluding(1000))
-            .check(count -> {
-                long[] offsets = EstimatedHistogram.newOffsets(count, false);
-                for (long offset : offsets)
-                    if (offset < 0)
-                        return false;
-
-                return true;
-            });
-    }
-
-    @Test
-    public void testStriping() throws InterruptedException
-    {
-        TestClock clock = new TestClock();
-        int nStripes = 4;
-        DecayingEstimatedHistogramReservoir model = new DecayingEstimatedHistogramReservoir(clock);
-        DecayingEstimatedHistogramReservoir test = new DecayingEstimatedHistogramReservoir(DecayingEstimatedHistogramReservoir.DEFAULT_ZERO_CONSIDERATION,
-                                                                                           DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT,
-                                                                                           nStripes,
-                                                                                           clock);
-
-        long seed = System.nanoTime();
-        System.out.println("DecayingEstimatedHistogramReservoirTest#testStriping.seed = " + seed);
-        Random valGen = new Random(seed);
-        ExecutorService executors = Executors.newFixedThreadPool(nStripes * 2);
-        for (int i = 0; i < 1_000_000; i++)
+        public static final Gen<long[]> offsets = integers().from(DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT)
+                                                            .upToAndIncluding(DecayingEstimatedHistogramReservoir.MAX_BUCKET_COUNT - 10)
+                                                            .zip(booleans().all(), EstimatedHistogram::newOffsets);
+        
+        @Test
+        public void testFindIndex()
         {
-            long value = Math.abs(valGen.nextInt());
-            executors.submit(() -> {
-                model.update(value);
-                LockSupport.parkNanos(2);
-                test.update(value);
-            });
+            qt().withExamples(numExamples)
+                .forAll(booleans().all()
+                                  .flatMap(b -> offsets.flatMap(offs -> this.offsetsAndValue(offs, b, 0))))
+                .check(this::checkFindIndex);
         }
 
-        executors.shutdown();
-        Assert.assertTrue(executors.awaitTermination(1, TimeUnit.MINUTES));
-
-        Snapshot modelSnapshot = model.getSnapshot();
-        Snapshot testSnapshot = test.getSnapshot();
-
-        assertEquals(modelSnapshot.getMean(), testSnapshot.getMean(), DOUBLE_ASSERT_DELTA);
-        assertEquals(modelSnapshot.getMin(), testSnapshot.getMin(), DOUBLE_ASSERT_DELTA);
-        assertEquals(modelSnapshot.getMax(), testSnapshot.getMax(), DOUBLE_ASSERT_DELTA);
-        assertEquals(modelSnapshot.getMedian(), testSnapshot.getMedian(), DOUBLE_ASSERT_DELTA);
-        for (double i = 0.0; i < 1.0; i += 0.1)
-            assertEquals(modelSnapshot.getValue(i), testSnapshot.getValue(i), DOUBLE_ASSERT_DELTA);
-
-
-        int stripedValues = 0;
-        for (int i = model.size(); i < model.size() * model.stripeCount(); i++)
+        @Test
+        public void showEstimationWorks()
         {
-            stripedValues += model.stripedBucketValue(i, true);
+            qt().withExamples(numExamples)
+                .forAll(offsets.flatMap(offs -> this.offsetsAndValue(offs, false, 9)))
+                .check(this::checkEstimation);
         }
-        assertTrue("no striping found", stripedValues > 0);
+
+        //shows that the max before overflow is 238 buckets regardless of consider zeros
+        @Test
+        @Ignore
+        public void showHistogramOffsetOverflow()
+        {
+            qt().forAll(integers().from(DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT).upToAndIncluding(1000))
+                .check(count -> {
+                    long[] offsets = EstimatedHistogram.newOffsets(count, false);
+                    for (long offset : offsets)
+                        if (offset < 0)
+                            return false;
+
+                    return true;
+                });
+        }
+
+        private boolean checkFindIndex(Pair<long[], Long> offsetsAndValue)
+        {
+            long[] offsets = offsetsAndValue.left;
+            long value = offsetsAndValue.right;
+
+            int model = findIndexModel(offsets, value);
+            int actual = DecayingEstimatedHistogramReservoir.findIndex(offsets, value);
+
+            return model == actual;
+        }
+
+        private int findIndexModel(long[] offsets, long value)
+        {
+            int modelIndex = Arrays.binarySearch(offsets, value);
+            if (modelIndex < 0)
+                modelIndex = -modelIndex - 1;
+
+            return modelIndex;
+        }
+
+        private Gen<Pair<long[], Long>> offsetsAndValue(long[] offsets, boolean useMaxLong, long minValue)
+        {
+            return longs().between(minValue, useMaxLong ? Long.MAX_VALUE : offsets[offsets.length - 1] + 100)
+                          .mix(longs().between(minValue, minValue + 10),50)
+                          .map(value -> Pair.create(offsets, value));
+        }
+
+        public boolean checkEstimation(Pair<long[], Long> offsetsAndValue)
+        {
+            long[] offsets = offsetsAndValue.left;
+            long value = offsetsAndValue.right;
+            boolean considerZeros = offsets[0] == 0;
+
+            int modelIndex = Arrays.binarySearch(offsets, value);
+            if (modelIndex < 0)
+                modelIndex = -modelIndex - 1;
+
+            int estimate = (int) DecayingEstimatedHistogramReservoir.fastLog12(value);
+
+            if (considerZeros)
+                return estimate - 3 == modelIndex || estimate - 2 == modelIndex;
+            else
+                return estimate - 4 == modelIndex || estimate - 3 == modelIndex;
+        }
     }
 
-    @Test
-    public void testSimple()
+    @RunWith(Parameterized.class)
+    public static class ParameterizedTests
     {
+        private static final double DOUBLE_ASSERT_DELTA = 0;
+
+        @Parameterized.Parameter
+        public String description;
+        
+        @Parameterized.Parameter(1)
+        public Function<DecayingEstimatedHistogramReservoir, Snapshot> toSnapshot;
+
+        @Parameterized.Parameters(name="{0}")
+        public static Collection<Object[]> suppliers()
         {
-            // 0 and 1 map to the same, first bucket
+            Function<DecayingEstimatedHistogramReservoir, Snapshot> snapshot = DecayingEstimatedHistogramReservoir::getSnapshot;
+            Function<DecayingEstimatedHistogramReservoir, Snapshot> decayingOnly = DecayingEstimatedHistogramReservoir::getPercentileSnapshot;
+            return ImmutableList.of(new Object[] { "normal", snapshot }, new Object[] { "decaying buckets", decayingOnly });
+        }
+
+        @Test
+        public void testStriping() throws InterruptedException
+        {
+            TestClock clock = new TestClock();
+            int nStripes = 4;
+            DecayingEstimatedHistogramReservoir model = new DecayingEstimatedHistogramReservoir(clock);
+            DecayingEstimatedHistogramReservoir test = new DecayingEstimatedHistogramReservoir(DecayingEstimatedHistogramReservoir.DEFAULT_ZERO_CONSIDERATION,
+                                                                                               DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT,
+                                                                                               nStripes,
+                                                                                               clock);
+
+            long seed = nanoTime();
+            System.out.println("DecayingEstimatedHistogramReservoirTest#testStriping.seed = " + seed);
+            Random valGen = new Random(seed);
+            ExecutorService executors = Executors.newFixedThreadPool(nStripes * 2);
+            for (int i = 0; i < 1_000_000; i++)
+            {
+                long value = Math.abs(valGen.nextInt());
+                executors.submit(() -> {
+                    model.update(value);
+                    LockSupport.parkNanos(2);
+                    test.update(value);
+                });
+            }
+
+            executors.shutdown();
+            Assert.assertTrue(executors.awaitTermination(1, TimeUnit.MINUTES));
+
+            Snapshot modelSnapshot = toSnapshot.apply(model);
+            Snapshot testSnapshot = toSnapshot.apply(test);
+
+            assertEquals(modelSnapshot.getMean(), testSnapshot.getMean(), DOUBLE_ASSERT_DELTA);
+            assertEquals(modelSnapshot.getMin(), testSnapshot.getMin(), DOUBLE_ASSERT_DELTA);
+            assertEquals(modelSnapshot.getMax(), testSnapshot.getMax(), DOUBLE_ASSERT_DELTA);
+            assertEquals(modelSnapshot.getMedian(), testSnapshot.getMedian(), DOUBLE_ASSERT_DELTA);
+            for (double i = 0.0; i < 1.0; i += 0.1)
+                assertEquals(modelSnapshot.getValue(i), testSnapshot.getValue(i), DOUBLE_ASSERT_DELTA);
+
+
+            int stripedValues = 0;
+            for (int i = model.size(); i < model.size() * model.stripeCount(); i++)
+            {
+                stripedValues += model.stripedBucketValue(i, true);
+            }
+            assertTrue("no striping found", stripedValues > 0);
+        }
+
+        @Test
+        public void testSimple()
+        {
+            {
+                // 0 and 1 map to the same, first bucket
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir();
+                histogram.update(0);
+                assertEquals(1, histogram.getSnapshot().getValues()[0]);
+                histogram.update(1);
+                assertEquals(2, histogram.getSnapshot().getValues()[0]);
+            }
+            {
+                // 0 and 1 map to different buckets
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(true);
+                histogram.update(0);
+                assertEquals(1, histogram.getSnapshot().getValues()[0]);
+                histogram.update(1);
+                Snapshot snapshot = histogram.getSnapshot();
+                assertEquals(1, snapshot.getValues()[0]);
+                assertEquals(1, snapshot.getValues()[1]);
+            }
+        }
+
+        @Test
+        public void testOverflow()
+        {
+            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(DecayingEstimatedHistogramReservoir.DEFAULT_ZERO_CONSIDERATION, 1, 1);
+            histogram.update(100);
+            assert histogram.isOverflowed();
+            assertEquals(Long.MAX_VALUE, toSnapshot.apply(histogram).getMax());
+        }
+
+        @Test
+        public void testMinMax()
+        {
             DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir();
-            histogram.update(0);
-            assertEquals(1, histogram.getSnapshot().getValues()[0]);
-            histogram.update(1);
-            assertEquals(2, histogram.getSnapshot().getValues()[0]);
-        }
-        {
-            // 0 and 1 map to different buckets
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(true);
-            histogram.update(0);
-            assertEquals(1, histogram.getSnapshot().getValues()[0]);
-            histogram.update(1);
-            Snapshot snapshot = histogram.getSnapshot();
-            assertEquals(1, snapshot.getValues()[0]);
-            assertEquals(1, snapshot.getValues()[1]);
-        }
-    }
-
-    @Test
-    public void testOverflow()
-    {
-        DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(DecayingEstimatedHistogramReservoir.DEFAULT_ZERO_CONSIDERATION, 1, 1);
-        histogram.update(100);
-        assert histogram.isOverflowed();
-        assertEquals(Long.MAX_VALUE, histogram.getSnapshot().getMax());
-    }
-
-    @Test
-    public void testMinMax()
-    {
-        DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir();
-        histogram.update(16);
-        Snapshot snapshot = histogram.getSnapshot();
-        assertEquals(15, snapshot.getMin());
-        assertEquals(17, snapshot.getMax());
-    }
-
-    @Test
-    public void testMean()
-    {
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-            for (int i = 0; i < 40; i++)
-                histogram.update(0);
-            for (int i = 0; i < 20; i++)
-                histogram.update(1);
-            for (int i = 0; i < 10; i++)
-                histogram.update(2);
-            assertEquals(1.14D, histogram.getSnapshot().getMean(), 0.1D);
-        }
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(true,
-                                                                                                    DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT,
-                                                                                                    DecayingEstimatedHistogramReservoir.DEFAULT_STRIPE_COUNT,
-                                                                                                    clock);
-            for (int i = 0; i < 40; i++)
-                histogram.update(0);
-            for (int i = 0; i < 20; i++)
-                histogram.update(1);
-            for (int i = 0; i < 10; i++)
-                histogram.update(2);
-            assertEquals(0.57D, histogram.getSnapshot().getMean(), 0.1D);
-        }
-    }
-
-    @Test
-    public void testStdDev()
-    {
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-            for (int i = 0; i < 20; i++)
-                histogram.update(10);
-            for (int i = 0; i < 40; i++)
-                histogram.update(20);
-            for (int i = 0; i < 20; i++)
-                histogram.update(30);
-
-            Snapshot snapshot = histogram.getSnapshot();
-            assertEquals(20.0D, snapshot.getMean(), 2.0D);
-            assertEquals(7.07D, snapshot.getStdDev(), 2.0D);
-        }
-    }
-
-    @Test
-    public void testFindingCorrectBuckets()
-    {
-        TestClock clock = new TestClock();
-
-        DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(DecayingEstimatedHistogramReservoir.DEFAULT_ZERO_CONSIDERATION, 90, 1, clock);
-        histogram.update(23282687);
-        assertFalse(histogram.isOverflowed());
-        assertEquals(1, histogram.getSnapshot().getValues()[89]);
-
-        histogram.update(9);
-        assertEquals(1, histogram.getSnapshot().getValues()[8]);
-
-        histogram.update(21);
-        histogram.update(22);
-        Snapshot snapshot = histogram.getSnapshot();
-        assertEquals(2, snapshot.getValues()[13]);
-        assertEquals(6277304.5D, snapshot.getMean(), DOUBLE_ASSERT_DELTA);
-    }
-
-    @Test
-    public void testPercentile()
-    {
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-            // percentile of empty histogram is 0
-            assertEquals(0D, histogram.getSnapshot().getValue(0.99), DOUBLE_ASSERT_DELTA);
-
-            histogram.update(1);
-            // percentile of a histogram with one element should be that element
-            assertEquals(1D, histogram.getSnapshot().getValue(0.99), DOUBLE_ASSERT_DELTA);
-
-            histogram.update(10);
-            assertEquals(10D, histogram.getSnapshot().getValue(0.99), DOUBLE_ASSERT_DELTA);
+            histogram.update(16);
+            Snapshot snapshot = toSnapshot.apply(histogram);
+            assertEquals(15, snapshot.getMin());
+            assertEquals(17, snapshot.getMax());
         }
 
+        @Test
+        public void testMean()
         {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-
-            histogram.update(1);
-            histogram.update(2);
-            histogram.update(3);
-            histogram.update(4);
-            histogram.update(5);
-
-            Snapshot snapshot = histogram.getSnapshot();
-            assertEquals(0, snapshot.getValue(0.00), DOUBLE_ASSERT_DELTA);
-            assertEquals(3, snapshot.getValue(0.50), DOUBLE_ASSERT_DELTA);
-            assertEquals(3, snapshot.getValue(0.60), DOUBLE_ASSERT_DELTA);
-            assertEquals(5, snapshot.getValue(1.00), DOUBLE_ASSERT_DELTA);
-        }
-
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-
-            for (int i = 11; i <= 20; i++)
-                histogram.update(i);
-
-            // Right now the histogram looks like:
-            //    10   12   14   17   20
-            //     0    2    2    3    3
-            // %:  0   20   40   70  100
-            Snapshot snapshot = histogram.getSnapshot();
-            assertEquals(12, snapshot.getValue(0.01), DOUBLE_ASSERT_DELTA);
-            assertEquals(14, snapshot.getValue(0.30), DOUBLE_ASSERT_DELTA);
-            assertEquals(17, snapshot.getValue(0.50), DOUBLE_ASSERT_DELTA);
-            assertEquals(17, snapshot.getValue(0.60), DOUBLE_ASSERT_DELTA);
-            assertEquals(20, snapshot.getValue(0.80), DOUBLE_ASSERT_DELTA);
-        }
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(true,
-                                                                                                    DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT,
-                                                                                                    DecayingEstimatedHistogramReservoir.DEFAULT_STRIPE_COUNT,
-                                                                                                    clock);
-            histogram.update(0);
-            histogram.update(0);
-            histogram.update(1);
-
-            Snapshot snapshot = histogram.getSnapshot();
-            assertEquals(0, snapshot.getValue(0.5), DOUBLE_ASSERT_DELTA);
-            assertEquals(1, snapshot.getValue(0.99), DOUBLE_ASSERT_DELTA);
-        }
-    }
-
-
-    @Test
-    public void testDecayingPercentile()
-    {
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-            // percentile of empty histogram is 0
-            assertEquals(0, histogram.getSnapshot().getValue(1.0), DOUBLE_ASSERT_DELTA);
-
-            for (int v = 1; v <= 100; v++)
             {
-                for (int i = 0; i < 10_000; i++)
-                {
-                    histogram.update(v);
-                }
-            }
+                TestClock clock = new TestClock();
 
-            Snapshot snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(05, snapshot.getValue(0.05));
-            assertEstimatedQuantile(20, snapshot.getValue(0.20));
-            assertEstimatedQuantile(40, snapshot.getValue(0.40));
-            assertEstimatedQuantile(99, snapshot.getValue(0.99));
-
-            clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
-            snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(05, snapshot.getValue(0.05));
-            assertEstimatedQuantile(20, snapshot.getValue(0.20));
-            assertEstimatedQuantile(40, snapshot.getValue(0.40));
-            assertEstimatedQuantile(99, snapshot.getValue(0.99));
-
-            for (int v = 1; v <= 50; v++)
-            {
-                for (int i = 0; i < 10_000; i++)
-                {
-                    histogram.update(v);
-                }
-            }
-
-            snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(04, snapshot.getValue(0.05));
-            assertEstimatedQuantile(14, snapshot.getValue(0.20));
-            assertEstimatedQuantile(27, snapshot.getValue(0.40));
-            assertEstimatedQuantile(98, snapshot.getValue(0.99));
-
-            clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
-            snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(04, snapshot.getValue(0.05));
-            assertEstimatedQuantile(14, snapshot.getValue(0.20));
-            assertEstimatedQuantile(27, snapshot.getValue(0.40));
-            assertEstimatedQuantile(98, snapshot.getValue(0.99));
-
-            for (int v = 1; v <= 50; v++)
-            {
-                for (int i = 0; i < 10_000; i++)
-                {
-                    histogram.update(v);
-                }
-            }
-
-            snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(03, snapshot.getValue(0.05));
-            assertEstimatedQuantile(12, snapshot.getValue(0.20));
-            assertEstimatedQuantile(23, snapshot.getValue(0.40));
-            assertEstimatedQuantile(96, snapshot.getValue(0.99));
-
-            clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
-            snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(03, snapshot.getValue(0.05));
-            assertEstimatedQuantile(12, snapshot.getValue(0.20));
-            assertEstimatedQuantile(23, snapshot.getValue(0.40));
-            assertEstimatedQuantile(96, snapshot.getValue(0.99));
-
-            for (int v = 11; v <= 20; v++)
-            {
-                for (int i = 0; i < 5_000; i++)
-                {
-                    histogram.update(v);
-                }
-            }
-
-            snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(04, snapshot.getValue(0.05));
-            assertEstimatedQuantile(12, snapshot.getValue(0.20));
-            assertEstimatedQuantile(20, snapshot.getValue(0.40));
-            assertEstimatedQuantile(95, snapshot.getValue(0.99));
-
-            clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
-            snapshot = histogram.getSnapshot();
-            assertEstimatedQuantile(04, snapshot.getValue(0.05));
-            assertEstimatedQuantile(12, snapshot.getValue(0.20));
-            assertEstimatedQuantile(20, snapshot.getValue(0.40));
-            assertEstimatedQuantile(95, snapshot.getValue(0.99));
-
-        }
-
-        {
-            TestClock clock = new TestClock();
-
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-            // percentile of empty histogram is 0
-            assertEquals(0, histogram.getSnapshot().getValue(0.99), DOUBLE_ASSERT_DELTA);
-
-            for (int m = 0; m < 40; m++)
-            {
-                for (int i = 0; i < 1_000_000; i++)
-                {
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+                for (int i = 0; i < 40; i++)
+                    histogram.update(0);
+                for (int i = 0; i < 20; i++)
+                    histogram.update(1);
+                for (int i = 0; i < 10; i++)
                     histogram.update(2);
-                }
-                // percentile of a histogram with one element should be that element
-                clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
-                assertEquals(2, histogram.getSnapshot().getValue(0.99), DOUBLE_ASSERT_DELTA);
+                assertEquals(1.14D, toSnapshot.apply(histogram).getMean(), 0.1D);
             }
+            {
+                TestClock clock = new TestClock();
 
-            clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S * 100);
-            assertEquals(0, histogram.getSnapshot().getValue(0.99), DOUBLE_ASSERT_DELTA);
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(true,
+                                                                                                        DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT,
+                                                                                                        DecayingEstimatedHistogramReservoir.DEFAULT_STRIPE_COUNT,
+                                                                                                        clock);
+                for (int i = 0; i < 40; i++)
+                    histogram.update(0);
+                for (int i = 0; i < 20; i++)
+                    histogram.update(1);
+                for (int i = 0; i < 10; i++)
+                    histogram.update(2);
+                assertEquals(0.57D, toSnapshot.apply(histogram).getMean(), 0.1D);
+            }
         }
 
+        @Test
+        public void testStdDev()
+        {
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+                for (int i = 0; i < 20; i++)
+                    histogram.update(10);
+                for (int i = 0; i < 40; i++)
+                    histogram.update(20);
+                for (int i = 0; i < 20; i++)
+                    histogram.update(30);
+
+                Snapshot snapshot = toSnapshot.apply(histogram);
+                assertEquals(20.0D, snapshot.getMean(), 2.0D);
+                assertEquals(7.07D, snapshot.getStdDev(), 2.0D);
+            }
+        }
+
+        @Test
+        public void testFindingCorrectBuckets()
         {
             TestClock clock = new TestClock();
 
-            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(DecayingEstimatedHistogramReservoir.DEFAULT_ZERO_CONSIDERATION, 90, 1, clock);
+            histogram.update(23282687);
+            assertFalse(histogram.isOverflowed());
+            assertEquals(1, histogram.getSnapshot().getValues()[89]);
 
-            histogram.update(20);
+            histogram.update(9);
+            assertEquals(1, histogram.getSnapshot().getValues()[8]);
+
             histogram.update(21);
             histogram.update(22);
             Snapshot snapshot = histogram.getSnapshot();
-            assertEquals(1, snapshot.getValues()[12]);
             assertEquals(2, snapshot.getValues()[13]);
-
-            clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
-
-            histogram.update(20);
-            histogram.update(21);
-            histogram.update(22);
-            snapshot = histogram.getSnapshot();
-            assertEquals(2, snapshot.getValues()[12]);
-            assertEquals(4, snapshot.getValues()[13]);
+            assertEquals(6277304.5D, snapshot.getMean(), DOUBLE_ASSERT_DELTA);
         }
-    }
 
-    @Test
-    public void testDecayingMean()
-    {
+        @Test
+        public void testPercentile()
+        {
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+                // percentile of empty histogram is 0
+                assertEquals(0D, toSnapshot.apply(histogram).getValue(0.99), DOUBLE_ASSERT_DELTA);
+
+                histogram.update(1);
+                // percentile of a histogram with one element should be that element
+                assertEquals(1D, toSnapshot.apply(histogram).getValue(0.99), DOUBLE_ASSERT_DELTA);
+
+                histogram.update(10);
+                assertEquals(10D, toSnapshot.apply(histogram).getValue(0.99), DOUBLE_ASSERT_DELTA);
+            }
+
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+
+                histogram.update(1);
+                histogram.update(2);
+                histogram.update(3);
+                histogram.update(4);
+                histogram.update(5);
+
+                Snapshot snapshot = toSnapshot.apply(histogram);
+                assertEquals(0, snapshot.getValue(0.00), DOUBLE_ASSERT_DELTA);
+                assertEquals(3, snapshot.getValue(0.50), DOUBLE_ASSERT_DELTA);
+                assertEquals(3, snapshot.getValue(0.60), DOUBLE_ASSERT_DELTA);
+                assertEquals(5, snapshot.getValue(1.00), DOUBLE_ASSERT_DELTA);
+            }
+
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+
+                for (int i = 11; i <= 20; i++)
+                    histogram.update(i);
+
+                // Right now the histogram looks like:
+                //    10   12   14   17   20
+                //     0    2    2    3    3
+                // %:  0   20   40   70  100
+                Snapshot snapshot = toSnapshot.apply(histogram);
+                assertEquals(12, snapshot.getValue(0.01), DOUBLE_ASSERT_DELTA);
+                assertEquals(14, snapshot.getValue(0.30), DOUBLE_ASSERT_DELTA);
+                assertEquals(17, snapshot.getValue(0.50), DOUBLE_ASSERT_DELTA);
+                assertEquals(17, snapshot.getValue(0.60), DOUBLE_ASSERT_DELTA);
+                assertEquals(20, snapshot.getValue(0.80), DOUBLE_ASSERT_DELTA);
+            }
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(true,
+                                                                                                        DecayingEstimatedHistogramReservoir.DEFAULT_BUCKET_COUNT,
+                                                                                                        DecayingEstimatedHistogramReservoir.DEFAULT_STRIPE_COUNT,
+                                                                                                        clock);
+                histogram.update(0);
+                histogram.update(0);
+                histogram.update(1);
+
+                Snapshot snapshot = toSnapshot.apply(histogram);
+                assertEquals(0, snapshot.getValue(0.5), DOUBLE_ASSERT_DELTA);
+                assertEquals(1, snapshot.getValue(0.99), DOUBLE_ASSERT_DELTA);
+            }
+        }
+
+        @Test
+        public void testDecayingPercentile()
+        {
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+                // percentile of empty histogram is 0
+                assertEquals(0, toSnapshot.apply(histogram).getValue(1.0), DOUBLE_ASSERT_DELTA);
+
+                for (int v = 1; v <= 100; v++)
+                {
+                    for (int i = 0; i < 10_000; i++)
+                    {
+                        histogram.update(v);
+                    }
+                }
+
+                Snapshot snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(5, snapshot.getValue(0.05));
+                assertEstimatedQuantile(20, snapshot.getValue(0.20));
+                assertEstimatedQuantile(40, snapshot.getValue(0.40));
+                assertEstimatedQuantile(99, snapshot.getValue(0.99));
+
+                clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
+                snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(5, snapshot.getValue(0.05));
+                assertEstimatedQuantile(20, snapshot.getValue(0.20));
+                assertEstimatedQuantile(40, snapshot.getValue(0.40));
+                assertEstimatedQuantile(99, snapshot.getValue(0.99));
+
+                for (int v = 1; v <= 50; v++)
+                {
+                    for (int i = 0; i < 10_000; i++)
+                    {
+                        histogram.update(v);
+                    }
+                }
+
+                snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(4, snapshot.getValue(0.05));
+                assertEstimatedQuantile(14, snapshot.getValue(0.20));
+                assertEstimatedQuantile(27, snapshot.getValue(0.40));
+                assertEstimatedQuantile(98, snapshot.getValue(0.99));
+
+                clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
+                snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(4, snapshot.getValue(0.05));
+                assertEstimatedQuantile(14, snapshot.getValue(0.20));
+                assertEstimatedQuantile(27, snapshot.getValue(0.40));
+                assertEstimatedQuantile(98, snapshot.getValue(0.99));
+
+                for (int v = 1; v <= 50; v++)
+                {
+                    for (int i = 0; i < 10_000; i++)
+                    {
+                        histogram.update(v);
+                    }
+                }
+
+                snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(3, snapshot.getValue(0.05));
+                assertEstimatedQuantile(12, snapshot.getValue(0.20));
+                assertEstimatedQuantile(23, snapshot.getValue(0.40));
+                assertEstimatedQuantile(96, snapshot.getValue(0.99));
+
+                clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
+                snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(3, snapshot.getValue(0.05));
+                assertEstimatedQuantile(12, snapshot.getValue(0.20));
+                assertEstimatedQuantile(23, snapshot.getValue(0.40));
+                assertEstimatedQuantile(96, snapshot.getValue(0.99));
+
+                for (int v = 11; v <= 20; v++)
+                {
+                    for (int i = 0; i < 5_000; i++)
+                    {
+                        histogram.update(v);
+                    }
+                }
+
+                snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(4, snapshot.getValue(0.05));
+                assertEstimatedQuantile(12, snapshot.getValue(0.20));
+                assertEstimatedQuantile(20, snapshot.getValue(0.40));
+                assertEstimatedQuantile(95, snapshot.getValue(0.99));
+
+                clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
+                snapshot = toSnapshot.apply(histogram);
+                assertEstimatedQuantile(4, snapshot.getValue(0.05));
+                assertEstimatedQuantile(12, snapshot.getValue(0.20));
+                assertEstimatedQuantile(20, snapshot.getValue(0.40));
+                assertEstimatedQuantile(95, snapshot.getValue(0.99));
+
+            }
+
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+                // percentile of empty histogram is 0
+                assertEquals(0, toSnapshot.apply(histogram).getValue(0.99), DOUBLE_ASSERT_DELTA);
+
+                for (int m = 0; m < 40; m++)
+                {
+                    for (int i = 0; i < 1_000_000; i++)
+                    {
+                        histogram.update(2);
+                    }
+                    // percentile of a histogram with one element should be that element
+                    clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
+                    assertEquals(2, toSnapshot.apply(histogram).getValue(0.99), DOUBLE_ASSERT_DELTA);
+                }
+
+                clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S * 100);
+                assertEquals(0, toSnapshot.apply(histogram).getValue(0.99), DOUBLE_ASSERT_DELTA);
+            }
+
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+
+                histogram.update(20);
+                histogram.update(21);
+                histogram.update(22);
+                Snapshot snapshot = histogram.getSnapshot();
+                assertEquals(1, snapshot.getValues()[12]);
+                assertEquals(2, snapshot.getValues()[13]);
+
+                clock.addSeconds(DecayingEstimatedHistogramReservoir.HALF_TIME_IN_S);
+
+                histogram.update(20);
+                histogram.update(21);
+                histogram.update(22);
+                snapshot = histogram.getSnapshot();
+                assertEquals(2, snapshot.getValues()[12]);
+                assertEquals(4, snapshot.getValues()[13]);
+            }
+        }
+
+        @Test
+        public void testDecayingMean()
+        {
+            {
+                TestClock clock = new TestClock();
+
+                DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+
+                clock.addNanos(DecayingEstimatedHistogramReservoir.LANDMARK_RESET_INTERVAL_IN_NS - TimeUnit.SECONDS.toNanos(1L));
+
+                while (clock.now() < DecayingEstimatedHistogramReservoir.LANDMARK_RESET_INTERVAL_IN_NS + TimeUnit.SECONDS.toNanos(1L))
+                {
+                    clock.addNanos(TimeUnit.MILLISECONDS.toNanos(900));
+                    for (int i = 0; i < 1_000_000; i++)
+                    {
+                        histogram.update(1000);
+                        histogram.update(2000);
+                        histogram.update(3000);
+                        histogram.update(4000);
+                        histogram.update(5000);
+                    }
+                    assertEquals(3000D, toSnapshot.apply(histogram).getMean(), 500D);
+                }
+            }
+        }
+
+        @Test
+        public void testAggregation()
         {
             TestClock clock = new TestClock();
 
             DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+            DecayingEstimatedHistogramReservoir another = new DecayingEstimatedHistogramReservoir(clock);
 
-            clock.addMillis(DecayingEstimatedHistogramReservoir.LANDMARK_RESET_INTERVAL_IN_MS - 1_000L);
+            clock.addNanos(DecayingEstimatedHistogramReservoir.LANDMARK_RESET_INTERVAL_IN_NS - TimeUnit.SECONDS.toNanos(1L));
 
-            while (clock.getTime() < DecayingEstimatedHistogramReservoir.LANDMARK_RESET_INTERVAL_IN_MS + 1_000L)
+            histogram.update(1000);
+            clock.addMillis(100);
+            another.update(2000);
+            clock.addMillis(100);
+            histogram.update(2000);
+            clock.addMillis(100);
+            another.update(3000);
+            clock.addMillis(100);
+            histogram.update(3000);
+            clock.addMillis(100);
+            another.update(4000);
+
+            DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot snapshot = (DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot) histogram.getSnapshot();
+            DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot anotherSnapshot = (DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot) another.getSnapshot();
+
+            assertEquals(2000, snapshot.getMean(), 500D);
+            assertEquals(3000, anotherSnapshot.getMean(), 500D);
+
+            snapshot.add(anotherSnapshot);
+
+            // Another had newer decayLandmark, the aggregated snapshot should use it
+            assertEquals(anotherSnapshot.getSnapshotLandmark(), snapshot.getSnapshotLandmark());
+            assertEquals(2500, snapshot.getMean(), 500D);
+        }
+
+        @Test
+        public void testSize()
+        {
+            TestClock clock = new TestClock();
+
+            DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
+            histogram.update(42);
+            histogram.update(42);
+            assertEquals(2, toSnapshot.apply(histogram).size());
+        }
+
+        private void assertEstimatedQuantile(long expectedValue, double actualValue)
+        {
+            assertTrue("Expected at least [" + expectedValue + "] but actual is [" + actualValue + ']', actualValue >= expectedValue);
+            assertTrue("Expected less than [" + Math.round(expectedValue * 1.2) + "] but actual is [" + actualValue + ']', actualValue < Math.round(expectedValue * 1.2));
+        }
+
+        public static class TestClock implements MonotonicClock
+        {
+            private long tick = 0;
+
+            public void addNanos(long nanos)
             {
-                clock.addMillis(900);
-                for (int i = 0; i < 1_000_000; i++)
-                {
-                    histogram.update(1000);
-                    histogram.update(2000);
-                    histogram.update(3000);
-                    histogram.update(4000);
-                    histogram.update(5000);
-                }
-                assertEquals(3000D, histogram.getSnapshot().getMean(), 500D);
+                tick += nanos;
+            }
+
+            public void addMillis(long millis)
+            {
+                tick += TimeUnit.MILLISECONDS.toNanos(millis);
+            }
+
+            public void addSeconds(long seconds)
+            {
+                tick += TimeUnit.SECONDS.toNanos(seconds);
+            }
+
+            public long now()
+            {
+                return tick;
+            }
+
+            @Override
+            public long error()
+            {
+                return 0;
+            }
+
+            @Override
+            public MonotonicClockTranslation translate()
+            {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public boolean isAfter(long instant)
+            {
+                throw new UnsupportedOperationException();
+            }
+
+            @Override
+            public boolean isAfter(long now, long instant)
+            {
+                throw new UnsupportedOperationException();
             }
         }
     }
-
-    @Test
-    public void testAggregation()
-    {
-        TestClock clock = new TestClock();
-
-        DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-        DecayingEstimatedHistogramReservoir another = new DecayingEstimatedHistogramReservoir(clock);
-
-        clock.addMillis(DecayingEstimatedHistogramReservoir.LANDMARK_RESET_INTERVAL_IN_MS - 1_000L);
-
-        histogram.update(1000);
-        clock.addMillis(100);
-        another.update(2000);
-        clock.addMillis(100);
-        histogram.update(2000);
-        clock.addMillis(100);
-        another.update(3000);
-        clock.addMillis(100);
-        histogram.update(3000);
-        clock.addMillis(100);
-        another.update(4000);
-
-        DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot snapshot = (DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot) histogram.getSnapshot();
-        DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot anotherSnapshot = (DecayingEstimatedHistogramReservoir.EstimatedHistogramReservoirSnapshot) another.getSnapshot();
-
-        assertEquals(2000, snapshot.getMean(), 500D);
-        assertEquals(3000, anotherSnapshot.getMean(), 500D);
-
-        snapshot.add(anotherSnapshot);
-
-        // Another had newer decayLandmark, the aggregated snapshot should use it
-        assertEquals(anotherSnapshot.getSnapshotLandmark(), snapshot.getSnapshotLandmark());
-        assertEquals(2500, snapshot.getMean(), 500D);
-    }
-
-    @Test
-    public void testSize()
-    {
-        TestClock clock = new TestClock();
-
-        DecayingEstimatedHistogramReservoir histogram = new DecayingEstimatedHistogramReservoir(clock);
-        histogram.update(42);
-        histogram.update(42);
-        assertEquals(2, histogram.getSnapshot().size());
-    }
-
-    private void assertEstimatedQuantile(long expectedValue, double actualValue)
-    {
-        assertTrue("Expected at least [" + expectedValue + "] but actual is [" + actualValue + "]", actualValue >= expectedValue);
-        assertTrue("Expected less than [" + Math.round(expectedValue * 1.2) + "] but actual is [" + actualValue + "]", actualValue < Math.round(expectedValue * 1.2));
-    }
-
-    public class TestClock extends Clock {
-        private long tick = 0;
-
-        public void addMillis(long millis)
-        {
-            tick += millis * 1_000_000L;
-        }
-
-        public void addSeconds(long seconds)
-        {
-            tick += seconds * 1_000_000_000L;
-        }
-
-        public long getTick()
-        {
-            return tick;
-        }
-
-        public long getTime()
-        {
-            return tick / 1_000_000L;
-        };
-    }
 }
diff --git a/test/unit/org/apache/cassandra/metrics/HintedHandOffMetricsTest.java b/test/unit/org/apache/cassandra/metrics/HintedHandOffMetricsTest.java
index 15feca4..744c5df 100644
--- a/test/unit/org/apache/cassandra/metrics/HintedHandOffMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/HintedHandOffMetricsTest.java
@@ -52,7 +52,7 @@
     @Test
     public void testHintsMetrics() throws Exception
     {
-        DatabaseDescriptor.getHintsDirectory().mkdirs();
+        DatabaseDescriptor.getHintsDirectory().tryCreateDirectories();
 
         for (int i = 0; i < 99; i++)
             HintsService.instance.metrics.incrPastWindow(InetAddressAndPort.getLocalHost());
diff --git a/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java b/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java
index e941a84..7c00da5 100644
--- a/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/KeyspaceMetricsTest.java
@@ -18,40 +18,37 @@
 
 package org.apache.cassandra.metrics;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
 import java.io.IOException;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.Schema;
-import org.apache.cassandra.service.EmbeddedCassandraService;
-
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.Session;
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.service.EmbeddedCassandraService;
 
-public class KeyspaceMetricsTest extends SchemaLoader
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+public class KeyspaceMetricsTest
 {
     private static Session session;
+    private static Cluster cluster;
+    private static EmbeddedCassandraService cassandra;
 
     @BeforeClass
     public static void setup() throws ConfigurationException, IOException
     {
-        Schema.instance.clear();
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
 
-        EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
-        cassandra.start();
-
-        Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
+        cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
         session = cluster.connect();
     }
 
@@ -73,10 +70,13 @@
         // no metrics after drop
         assertEquals(metrics.get().collect(Collectors.joining(",")), 0, metrics.get().count());
     }
-    
+
     @AfterClass
-    public static void teardown()
+    public static void tearDown()
     {
-        session.close();
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
     }
 }
diff --git a/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java b/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java
index d61c550..3a4dc8a 100644
--- a/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/LatencyMetricsTest.java
@@ -22,8 +22,8 @@
 
 import org.junit.Test;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertFalse;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 
 public class LatencyMetricsTest
 {
@@ -105,4 +105,4 @@
 
         parent.release();
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/metrics/SamplerTest.java b/test/unit/org/apache/cassandra/metrics/SamplerTest.java
index 3d24c1b..dba19a3 100644
--- a/test/unit/org/apache/cassandra/metrics/SamplerTest.java
+++ b/test/unit/org/apache/cassandra/metrics/SamplerTest.java
@@ -224,7 +224,7 @@
     public void waitForEmpty(int timeoutMs) throws TimeoutException
     {
         int timeout = 0;
-        while (!Sampler.samplerExecutor.getQueue().isEmpty())
+        while (Sampler.samplerExecutor.getPendingTaskCount() > 0)
         {
             timeout++;
             Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
diff --git a/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java b/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java
index 1e8175e..4c9de77 100644
--- a/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/TableMetricsTest.java
@@ -31,17 +31,16 @@
 import com.datastax.driver.core.Cluster;
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.exceptions.ConfigurationException;
-import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class TableMetricsTest extends SchemaLoader
+public class TableMetricsTest
 {
     private static Session session;
 
@@ -49,15 +48,15 @@
     private static final String TABLE = "tablemetricstest";
     private static final String COUNTER_TABLE = "tablemetricscountertest";
 
+    private static EmbeddedCassandraService cassandra;
+    private static Cluster cluster;
+
     @BeforeClass
     public static void setup() throws ConfigurationException, IOException
     {
-        Schema.instance.clear();
+        cassandra = ServerTestUtils.startEmbeddedCassandraService();
 
-        EmbeddedCassandraService cassandra = new EmbeddedCassandraService();
-        cassandra.start();
-
-        Cluster cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
+        cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
         session = cluster.connect();
 
         session.execute(String.format("CREATE KEYSPACE IF NOT EXISTS %s WITH replication = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };", KEYSPACE));
@@ -276,9 +275,13 @@
         assertEquals(metrics.get().collect(Collectors.joining(",")), 0, metrics.get().count());
     }
 
+
     @AfterClass
-    public static void teardown()
+    public static void tearDown()
     {
-        session.close();
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
     }
 }
diff --git a/test/unit/org/apache/cassandra/metrics/ThreadPoolMetricsTest.java b/test/unit/org/apache/cassandra/metrics/ThreadPoolMetricsTest.java
index 7302655..5c80b8e 100644
--- a/test/unit/org/apache/cassandra/metrics/ThreadPoolMetricsTest.java
+++ b/test/unit/org/apache/cassandra/metrics/ThreadPoolMetricsTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.cassandra.metrics;
 
-import java.util.concurrent.ArrayBlockingQueue;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
@@ -28,6 +27,7 @@
 import org.apache.cassandra.Util;
 import org.apache.cassandra.concurrent.*;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
 import static org.junit.Assert.*;
 
 public class ThreadPoolMetricsTest
@@ -35,25 +35,23 @@
     @Test
     public void testJMXEnabledThreadPoolMetricsWithNoBlockedThread()
     {
-        JMXEnabledThreadPoolExecutor executor = new JMXEnabledThreadPoolExecutor(2,
-                                                                                 Integer.MAX_VALUE,
-                                                                                 TimeUnit.SECONDS,
-                                                                                 new ArrayBlockingQueue<>(2),
-                                                                                 new NamedThreadFactory("ThreadPoolMetricsTest-1"),
-                                                                                 "internal");
-        testMetricsWithNoBlockedThreads(executor, executor.metrics);
+        ThreadPoolExecutorPlus executor = (ThreadPoolExecutorPlus) executorFactory()
+                .withJmxInternal()
+                .configurePooled("ThreadPoolMetricsTest-1", 2)
+                .withQueueLimit(2)
+                .build();
+        testMetricsWithNoBlockedThreads(executor, ((ThreadPoolExecutorJMXAdapter)executor.onShutdown()).metrics());
     }
 
     @Test
     public void testJMXEnabledThreadPoolMetricsWithBlockedThread()
     {
-        JMXEnabledThreadPoolExecutor executor = new JMXEnabledThreadPoolExecutor(2,
-                                                                                 Integer.MAX_VALUE,
-                                                                                 TimeUnit.SECONDS,
-                                                                                 new ArrayBlockingQueue<>(2),
-                                                                                 new NamedThreadFactory("ThreadPoolMetricsTest-2"),
-                                                                                 "internal");
-        testMetricsWithBlockedThreads(executor, executor.metrics);
+        ThreadPoolExecutorPlus executor = (ThreadPoolExecutorPlus) executorFactory()
+                .withJmxInternal()
+                .configurePooled("ThreadPoolMetricsTest-2", 2)
+                .withQueueLimit(2)
+                .build();
+        testMetricsWithBlockedThreads(executor, ((ThreadPoolExecutorJMXAdapter)executor.onShutdown()).metrics());
     }
 
     @Test
@@ -66,7 +64,7 @@
         testMetricsWithNoBlockedThreads(executor, executor.metrics);
     }
 
-    private static void testMetricsWithBlockedThreads(LocalAwareExecutorService threadPool, ThreadPoolMetrics metrics)
+    private static void testMetricsWithBlockedThreads(ExecutorPlus threadPool, ThreadPoolMetrics metrics)
     {
         assertEquals(2, metrics.maxPoolSize.getValue().intValue());
 
@@ -187,7 +185,7 @@
         spinAssertEquals(2L, metrics.totalBlocked::getCount);
     }
 
-    private static void testMetricsWithNoBlockedThreads(LocalAwareExecutorService threadPool, ThreadPoolMetrics metrics)
+    private static void testMetricsWithNoBlockedThreads(ExecutorPlus threadPool, ThreadPoolMetrics metrics)
     {
         spinAssertEquals(0, metrics.activeTasks::getValue);
         spinAssertEquals(0L, metrics.completedTasks::getValue);
diff --git a/test/unit/org/apache/cassandra/net/AsyncChannelPromiseTest.java b/test/unit/org/apache/cassandra/net/AsyncChannelPromiseTest.java
index c4e6295..4c16f6f 100644
--- a/test/unit/org/apache/cassandra/net/AsyncChannelPromiseTest.java
+++ b/test/unit/org/apache/cassandra/net/AsyncChannelPromiseTest.java
@@ -17,13 +17,21 @@
  */
 package org.apache.cassandra.net;
 
+import java.util.List;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableList;
 import org.junit.After;
+import org.junit.Assert;
 import org.junit.Test;
 
-import io.netty.channel.ChannelPromise;
 import io.netty.channel.embedded.EmbeddedChannel;
+import org.apache.cassandra.utils.concurrent.AbstractTestAsyncPromise;
+import org.apache.cassandra.utils.concurrent.Promise;
 
-public class AsyncChannelPromiseTest extends TestAbstractAsyncPromise
+public class AsyncChannelPromiseTest extends AbstractTestAsyncPromise
 {
     @After
     public void shutdown()
@@ -31,42 +39,66 @@
         exec.shutdownNow();
     }
 
-    private ChannelPromise newPromise()
+    private static List<Supplier<Promise<Void>>> suppliers(AtomicInteger listeners, boolean includedUncancellable)
     {
-        return new AsyncChannelPromise(new EmbeddedChannel());
+        List<Supplier<Promise<Void>>> cancellable = ImmutableList.of(
+            () -> new AsyncChannelPromise(new EmbeddedChannel()),
+            () -> AsyncChannelPromise.withListener(new EmbeddedChannel(), f -> listeners.incrementAndGet())
+        );
+
+        if (!includedUncancellable)
+            return cancellable;
+
+        return ImmutableList.<Supplier<Promise<Void>>>builder()
+               .addAll(cancellable)
+               .addAll(cancellable.stream().map(s -> (Supplier<Promise<Void>>) () -> cancelSuccess(s.get())).collect(Collectors.toList()))
+               .build();
     }
 
     @Test
     public void testSuccess()
     {
-        for (boolean setUncancellable : new boolean[] { false, true })
-            for (boolean tryOrSet : new boolean[]{ false, true })
-                testOneSuccess(newPromise(), setUncancellable, tryOrSet, null, null);
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Void>>> suppliers = suppliers(initialListeners, true);
+        for (boolean tryOrSet : new boolean[]{ false, true })
+                for (Supplier<Promise<Void>> supplier : suppliers)
+                    testOneSuccess(supplier.get(), tryOrSet, null, null);
+        Assert.assertEquals(2 * 2, initialListeners.get());
     }
 
     @Test
     public void testFailure()
     {
-        for (boolean setUncancellable : new boolean[] { false, true })
-            for (boolean tryOrSet : new boolean[] { false, true })
-                for (Throwable v : new Throwable[] { null, new NullPointerException() })
-                    testOneFailure(newPromise(), setUncancellable, tryOrSet, v, null);
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Void>>> suppliers = suppliers(initialListeners, true);
+        for (boolean tryOrSet : new boolean[]{ false, true })
+            for (Throwable v : new Throwable[] { null, new NullPointerException() })
+                for (Supplier<Promise<Void>> supplier : suppliers)
+                    testOneFailure(supplier.get(), tryOrSet, v, null);
+        Assert.assertEquals(2 * 2 * 2, initialListeners.get());
     }
 
 
     @Test
     public void testCancellation()
     {
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Void>>> suppliers = suppliers(initialListeners, false);
         for (boolean interruptIfRunning : new boolean[] { true, false })
-            testOneCancellation(newPromise(), interruptIfRunning, null);
+            for (Supplier<Promise<Void>> supplier : suppliers)
+                testOneCancellation(supplier.get(), interruptIfRunning, null);
+        Assert.assertEquals(2, initialListeners.get());
     }
 
 
     @Test
     public void testTimeout()
     {
-        for (boolean setUncancellable : new boolean[] { true, false })
-            testOneTimeout(newPromise(), setUncancellable);
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Void>>> suppliers = suppliers(initialListeners, true);
+        for (Supplier<Promise<Void>> supplier : suppliers)
+            testOneTimeout(supplier.get());
+        Assert.assertEquals(0, initialListeners.get());
     }
 
 }
diff --git a/test/unit/org/apache/cassandra/net/AsyncOneResponseTest.java b/test/unit/org/apache/cassandra/net/AsyncOneResponseTest.java
index 3d0508c..1ffcdef 100644
--- a/test/unit/org/apache/cassandra/net/AsyncOneResponseTest.java
+++ b/test/unit/org/apache/cassandra/net/AsyncOneResponseTest.java
@@ -23,6 +23,7 @@
 import org.junit.Assert;
 import org.junit.Test;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertTrue;
 
 public class AsyncOneResponseTest
@@ -43,9 +44,9 @@
         final long expectedTimeoutMillis = 1000; // Should time out after roughly this time
         final long schedulingError = 10; // Scheduling is imperfect
 
-        long startTime = System.nanoTime();
+        long startTime = nanoTime();
         boolean timeout = !response.await(expectedTimeoutMillis, TimeUnit.MILLISECONDS);
-        long endTime = System.nanoTime();
+        long endTime = nanoTime();
 
         assertTrue(timeout);
         assertTrue(TimeUnit.NANOSECONDS.toMillis(endTime - startTime) > (expectedTimeoutMillis - schedulingError));
diff --git a/test/unit/org/apache/cassandra/net/AsyncPromiseTest.java b/test/unit/org/apache/cassandra/net/AsyncPromiseTest.java
deleted file mode 100644
index 0d2a2e9..0000000
--- a/test/unit/org/apache/cassandra/net/AsyncPromiseTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.net;
-
-import org.junit.After;
-import org.junit.Test;
-
-import io.netty.util.concurrent.ImmediateEventExecutor;
-import io.netty.util.concurrent.Promise;
-
-public class AsyncPromiseTest extends TestAbstractAsyncPromise
-{
-    @After
-    public void shutdown()
-    {
-        exec.shutdownNow();
-    }
-
-    private <V> Promise<V> newPromise()
-    {
-        return new AsyncPromise<>(ImmediateEventExecutor.INSTANCE);
-    }
-
-    @Test
-    public void testSuccess()
-    {
-        for (boolean setUncancellable : new boolean[] { false, true })
-            for (boolean tryOrSet : new boolean[]{ false, true })
-                for (Integer v : new Integer[]{ null, 1 })
-                    testOneSuccess(newPromise(), setUncancellable, tryOrSet, v, 2);
-    }
-
-    @Test
-    public void testFailure()
-    {
-        for (boolean setUncancellable : new boolean[] { false, true })
-            for (boolean tryOrSet : new boolean[] { false, true })
-                for (Throwable v : new Throwable[] { null, new NullPointerException() })
-                    testOneFailure(newPromise(), setUncancellable, tryOrSet, v, 2);
-    }
-
-
-    @Test
-    public void testCancellation()
-    {
-        for (boolean interruptIfRunning : new boolean[] { true, false })
-            testOneCancellation(newPromise(), interruptIfRunning, 2);
-    }
-
-
-    @Test
-    public void testTimeout()
-    {
-        for (boolean setUncancellable : new boolean[] { true, false })
-            testOneTimeout(newPromise(), setUncancellable);
-    }
-
-}
diff --git a/test/unit/org/apache/cassandra/net/AsyncStreamingInputPlusTest.java b/test/unit/org/apache/cassandra/net/AsyncStreamingInputPlusTest.java
index b575747..1d6dcf4 100644
--- a/test/unit/org/apache/cassandra/net/AsyncStreamingInputPlusTest.java
+++ b/test/unit/org/apache/cassandra/net/AsyncStreamingInputPlusTest.java
@@ -18,10 +18,11 @@
 
 package org.apache.cassandra.net;
 
-import java.io.EOFException;
 import java.io.IOException;
 import java.nio.ByteBuffer;
+import java.nio.channels.ClosedChannelException;
 import java.nio.channels.WritableByteChannel;
+import java.nio.charset.StandardCharsets;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.After;
@@ -33,10 +34,9 @@
 import io.netty.buffer.Unpooled;
 import io.netty.channel.embedded.EmbeddedChannel;
 import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
-import org.apache.cassandra.net.AsyncStreamingInputPlus;
-import org.apache.cassandra.net.AsyncStreamingInputPlus.InputTimeoutException;
 
 import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
 
 public class AsyncStreamingInputPlusTest
 {
@@ -59,14 +59,6 @@
             buf.release(buf.refCnt());
     }
 
-//    @Test
-//    public void isOpen()
-//    {
-//        Assert.assertTrue(inputPlus.isOpen());
-//        inputPlus.requestClosure();
-//        Assert.assertFalse(inputPlus.isOpen());
-//    }
-
     @Test
     public void append_closed()
     {
@@ -104,30 +96,8 @@
         buf.writerIndex(8);
         inputPlus.append(buf);
         Assert.assertEquals(16, inputPlus.unsafeAvailable());
-
-//        ByteBuffer out = ByteBuffer.allocate(4);
-//        int readCount = inputPlus.read(out);
-//        Assert.assertEquals(4, readCount);
-//        out.flip();
-//        Assert.assertEquals(42, out.getInt());
-//        Assert.assertEquals(12, inputPlus.unsafeAvailable());
-
-//        out = ByteBuffer.allocate(8);
-//        readCount = inputPlus.read(out);
-//        Assert.assertEquals(8, readCount);
-//        out.flip();
-//        Assert.assertEquals(42, out.getLong());
-//        Assert.assertEquals(4, inputPlus.unsafeAvailable());
     }
 
-//    @Test (expected = EOFException.class)
-//    public void read_closed() throws IOException
-//    {
-//        inputPlus.requestClosure();
-//        ByteBuffer buf = ByteBuffer.allocate(1);
-//        inputPlus.read(buf);
-//    }
-
     @Test
     public void available_closed()
     {
@@ -160,6 +130,60 @@
     }
 
     @Test
+    public void rebufferAndCloseToleratesInterruption() throws InterruptedException
+    {
+        ByteBuf beforeInterrupt = channel.alloc().heapBuffer(1024);
+        beforeInterrupt.writeCharSequence("BEFORE", StandardCharsets.US_ASCII);
+        ByteBuf afterInterrupt = channel.alloc().heapBuffer(1024);
+        afterInterrupt.writeCharSequence("AFTER", StandardCharsets.US_ASCII);
+        final int totalBytes = beforeInterrupt.readableBytes() + afterInterrupt.readableBytes();
+
+        inputPlus = new AsyncStreamingInputPlus(channel);
+        Thread consumer = new Thread(() -> {
+            try
+            {
+                byte[] buffer = new byte[totalBytes];
+                Assert.assertEquals(totalBytes, inputPlus.read(buffer, 0, totalBytes));
+            }
+            catch (Throwable tr)
+            {
+                fail("Unexpected exception: " + tr);
+            }
+
+            try
+            {
+                inputPlus.readByte();
+                fail("Expected EOFException");
+            }
+            catch (ClosedChannelException ex)
+            {
+                // expected
+            }
+            catch (Throwable tr)
+            {
+                fail("Unexpected: " + tr);
+            }
+        });
+
+        try
+        {
+            consumer.start();
+            inputPlus.append(beforeInterrupt);
+            consumer.interrupt();
+            inputPlus.append(afterInterrupt);
+            inputPlus.requestClosure();
+            consumer.interrupt();
+        }
+        finally
+        {
+            consumer.join(TimeUnit.MINUTES.toMillis(1), 0);
+
+            // Check the input plus is closed by attempting to append to it
+            Assert.assertFalse(inputPlus.append(beforeInterrupt));
+        }
+    }
+
+    @Test
     public void consumeUntil_SingleBuffer_Partial_HappyPath() throws IOException
     {
         consumeUntilTestCycle(1, 8, 0, 4);
@@ -183,13 +207,13 @@
         consumeUntilTestCycle(2, 8, 0, 16);
     }
 
-    @Test(expected = EOFException.class)
+    @Test(expected = ClosedChannelException.class)
     public void consumeUntil_SingleBuffer_Fails() throws IOException
     {
         consumeUntilTestCycle(1, 8, 0, 9);
     }
 
-    @Test(expected = EOFException.class)
+    @Test(expected = ClosedChannelException.class)
     public void consumeUntil_MultipleBuffer_Fails() throws IOException
     {
         consumeUntilTestCycle(2, 8, 0, 17);
@@ -256,25 +280,4 @@
             isOpen = false;
         }
     }
-
-    @Test
-    public void rebufferTimeout() throws IOException
-    {
-        long timeoutMillis = 1000;
-        inputPlus = new AsyncStreamingInputPlus(channel, timeoutMillis, TimeUnit.MILLISECONDS);
-
-        long startNanos = System.nanoTime();
-        try
-        {
-            inputPlus.readInt();
-            Assert.fail("should not have been able to read from the queue");
-        }
-        catch (InputTimeoutException e)
-        {
-            // this is the success case, and is expected. any other exception is a failure.
-        }
-
-        long durationNanos = System.nanoTime() - startNanos;
-        Assert.assertTrue(TimeUnit.MILLISECONDS.toNanos(timeoutMillis) <= durationNanos);
-    }
 }
diff --git a/test/unit/org/apache/cassandra/net/AsyncStreamingOutputPlusTest.java b/test/unit/org/apache/cassandra/net/AsyncStreamingOutputPlusTest.java
index 305dc55..4775fd1 100644
--- a/test/unit/org/apache/cassandra/net/AsyncStreamingOutputPlusTest.java
+++ b/test/unit/org/apache/cassandra/net/AsyncStreamingOutputPlusTest.java
@@ -18,14 +18,13 @@
 
 package org.apache.cassandra.net;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.nio.file.Files;
 import java.util.Random;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import io.netty.buffer.ByteBuf;
@@ -105,7 +104,7 @@
                 buffer.putLong(1);
                 buffer.putLong(2);
                 buffer.flip();
-            }, new StreamManager.StreamRateLimiter(FBUtilities.getBroadcastAddressAndPort()));
+            }, StreamManager.getRateLimiter(FBUtilities.getBroadcastAddressAndPort()));
 
             assertEquals(40, out.position());
             assertEquals(40, out.flushed());
@@ -119,8 +118,26 @@
     }
 
     @Test
-    public void testWriteFileToChannelZeroCopy() throws IOException
+    public void testWriteFileToChannelEntireSSTableNoThrottling() throws IOException
     {
+        // Disable throttling by setting entire SSTable throughput and entire SSTable inter-DC throughput to 0
+        DatabaseDescriptor.setEntireSSTableStreamThroughputOutboundMebibytesPerSec(0);
+        DatabaseDescriptor.setEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec(0);
+        StreamManager.StreamRateLimiter.updateEntireSSTableThroughput();
+        StreamManager.StreamRateLimiter.updateEntireSSTableInterDCThroughput();
+
+        testWriteFileToChannel(true);
+    }
+
+    @Test
+    public void testWriteFileToChannelEntireSSTable() throws IOException
+    {
+        // Enable entire SSTable throttling by setting it to 200 Mbps
+        DatabaseDescriptor.setEntireSSTableStreamThroughputOutboundMebibytesPerSec(200);
+        DatabaseDescriptor.setEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec(200);
+        StreamManager.StreamRateLimiter.updateEntireSSTableThroughput();
+        StreamManager.StreamRateLimiter.updateEntireSSTableInterDCThroughput();
+
         testWriteFileToChannel(true);
     }
 
@@ -136,10 +153,10 @@
         int length = (int) file.length();
 
         EmbeddedChannel channel = new TestChannel(4);
-        StreamManager.StreamRateLimiter limiter = new StreamManager.StreamRateLimiter(FBUtilities.getBroadcastAddressAndPort());
+        StreamManager.StreamRateLimiter limiter = zeroCopy ? StreamManager.getEntireSSTableRateLimiter(FBUtilities.getBroadcastAddressAndPort())
+                                                           : StreamManager.getRateLimiter(FBUtilities.getBroadcastAddressAndPort());
 
-        try (RandomAccessFile raf = new RandomAccessFile(file.getPath(), "r");
-             FileChannel fileChannel = raf.getChannel();
+        try (FileChannel fileChannel = file.newReadChannel();
              AsyncStreamingOutputPlus out = new AsyncStreamingOutputPlus(channel))
         {
             assertTrue(fileChannel.isOpen());
@@ -159,7 +176,7 @@
 
     private File populateTempData(String name) throws IOException
     {
-        File file = Files.createTempFile(name, ".txt").toFile();
+        File file = new File(Files.createTempFile(name, ".txt"));
         file.deleteOnExit();
 
         Random r = new Random();
diff --git a/test/unit/org/apache/cassandra/net/ChunkedInputPlusTest.java b/test/unit/org/apache/cassandra/net/ChunkedInputPlusTest.java
index f90fcd1..36bc53d 100644
--- a/test/unit/org/apache/cassandra/net/ChunkedInputPlusTest.java
+++ b/test/unit/org/apache/cassandra/net/ChunkedInputPlusTest.java
@@ -29,8 +29,6 @@
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.net.ChunkedInputPlus;
-import org.apache.cassandra.net.ShareableBytes;
 
 import static org.junit.Assert.*;
 
@@ -156,4 +154,4 @@
         Arrays.fill(buffer.array(), (byte) fill);
         return ShareableBytes.wrap(buffer);
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/net/ConnectionTest.java b/test/unit/org/apache/cassandra/net/ConnectionTest.java
index 5c637ac..ec447aa 100644
--- a/test/unit/org/apache/cassandra/net/ConnectionTest.java
+++ b/test/unit/org/apache/cassandra/net/ConnectionTest.java
@@ -68,6 +68,7 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 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.net.MessagingService.VERSION_30;
@@ -80,7 +81,8 @@
 import static org.apache.cassandra.net.ConnectionType.SMALL_MESSAGES;
 import static org.apache.cassandra.net.OutboundConnectionSettings.Framing.LZ4;
 import static org.apache.cassandra.net.OutboundConnections.LARGE_MESSAGE_THRESHOLD;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 public class ConnectionTest
 {
@@ -336,7 +338,7 @@
             });
             unsafeSetHandler(Verb._TEST_1, () -> msg -> receiveDone.countDown());
             Message<?> message = Message.builder(Verb._TEST_1, new Object())
-                                        .withExpiresAt(System.nanoTime() + SECONDS.toNanos(30L))
+                                        .withExpiresAt(nanoTime() + SECONDS.toNanos(30L))
                                         .build();
             for (int i = 0 ; i < count ; ++i)
                 outbound.enqueue(message);
@@ -444,7 +446,7 @@
 
             AtomicInteger serialized = new AtomicInteger();
             Message<?> message = Message.builder(Verb._TEST_1, new Object())
-                                        .withExpiresAt(System.nanoTime() + SECONDS.toNanos(30L))
+                                        .withExpiresAt(nanoTime() + SECONDS.toNanos(30L))
                                         .build();
             unsafeSetSerializer(Verb._TEST_1, () -> new IVersionedSerializer<Object>()
             {
@@ -663,7 +665,7 @@
     {
         testManual((settings, inbound, outbound, endpoint) -> {
             Message<?> message = Message.builder(Verb._TEST_1, noPayload)
-                                        .withExpiresAt(System.nanoTime() + SECONDS.toNanos(30L))
+                                        .withExpiresAt(nanoTime() + SECONDS.toNanos(30L))
                                         .build();
 
             for (int i = 0 ; i < 1000 ; ++i)
@@ -683,12 +685,12 @@
                     for (int i = 0; i < 5; i++)
                     {
                         Message<?> message = Message.builder(Verb._TEST_1, noPayload)
-                                                    .withExpiresAt(System.nanoTime() + TimeUnit.MILLISECONDS.toNanos(50L))
+                                                    .withExpiresAt(nanoTime() + MILLISECONDS.toNanos(50L))
                                                     .build();
                         OutboundMessageQueue queue = outbound.queue;
                         while (true)
                         {
-                            try (OutboundMessageQueue.WithLock withLock = queue.lockOrCallback(System.nanoTime(), null))
+                            try (OutboundMessageQueue.WithLock withLock = queue.lockOrCallback(nanoTime(), null))
                             {
                                 if (withLock != null)
                                 {
diff --git a/test/unit/org/apache/cassandra/net/ForwardingInfoTest.java b/test/unit/org/apache/cassandra/net/ForwardingInfoTest.java
index 16dec9f..6e0d11a 100644
--- a/test/unit/org/apache/cassandra/net/ForwardingInfoTest.java
+++ b/test/unit/org/apache/cassandra/net/ForwardingInfoTest.java
@@ -91,9 +91,9 @@
             {
                 InetAddressAndPort original = addresses.get(ii);
                 InetAddressAndPort roundtripped = iterator.next();
-                assertEquals(original.address, roundtripped.address);
+                assertEquals(original.getAddress(), roundtripped.getAddress());
                 //3.0 can't send port numbers so you get the defaults
-                assertEquals(65532, roundtripped.port);
+                assertEquals(65532, roundtripped.getPort());
             }
         }
     }
diff --git a/test/unit/org/apache/cassandra/net/FramingTest.java b/test/unit/org/apache/cassandra/net/FramingTest.java
index 78d0a84..81f95f3 100644
--- a/test/unit/org/apache/cassandra/net/FramingTest.java
+++ b/test/unit/org/apache/cassandra/net/FramingTest.java
@@ -40,10 +40,8 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.io.IVersionedSerializer;
 import org.apache.cassandra.io.compress.BufferType;
-import org.apache.cassandra.io.util.DataInputBuffer;
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputBuffer;
-import org.apache.cassandra.io.util.DataOutputBufferFixed;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.memory.BufferPools;
diff --git a/test/unit/org/apache/cassandra/net/HandshakeTest.java b/test/unit/org/apache/cassandra/net/HandshakeTest.java
index e680b83..75ae103 100644
--- a/test/unit/org/apache/cassandra/net/HandshakeTest.java
+++ b/test/unit/org/apache/cassandra/net/HandshakeTest.java
@@ -23,6 +23,7 @@
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
 import org.junit.AfterClass;
 import org.junit.Assert;
 import org.junit.BeforeClass;
@@ -33,7 +34,6 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.OutboundConnectionInitiator.Result;
 import org.apache.cassandra.net.OutboundConnectionInitiator.Result.MessagingSuccess;
 
 import static org.apache.cassandra.net.MessagingService.VERSION_30;
@@ -83,7 +83,7 @@
                               new OutboundConnectionSettings(endpoint)
                                                     .withAcceptVersions(acceptOutbound)
                                                     .withDefaults(ConnectionCategory.MESSAGING),
-                              req, new AsyncPromise<>(eventLoop));
+                              req, AsyncPromise.withExecutor(eventLoop));
             return future.get();
         }
         finally
diff --git a/test/unit/org/apache/cassandra/net/ManyToOneConcurrentLinkedQueueTest.java b/test/unit/org/apache/cassandra/net/ManyToOneConcurrentLinkedQueueTest.java
index 2c92a39..4f60d01 100644
--- a/test/unit/org/apache/cassandra/net/ManyToOneConcurrentLinkedQueueTest.java
+++ b/test/unit/org/apache/cassandra/net/ManyToOneConcurrentLinkedQueueTest.java
@@ -298,4 +298,4 @@
         assertEquals(numItems, itemsPolled.cardinality());
         assertTrue(queue.relaxedIsEmpty());
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/net/MessageTest.java b/test/unit/org/apache/cassandra/net/MessageTest.java
index d3f5617..3850bc4 100644
--- a/test/unit/org/apache/cassandra/net/MessageTest.java
+++ b/test/unit/org/apache/cassandra/net/MessageTest.java
@@ -21,7 +21,6 @@
 import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.nio.charset.StandardCharsets;
-import java.util.UUID;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Stream;
 
@@ -39,9 +38,9 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.tracing.Tracing;
 import org.apache.cassandra.tracing.Tracing.TraceType;
-import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.FreeRunningClock;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.net.Message.serializer;
 import static org.apache.cassandra.net.MessagingService.VERSION_3014;
@@ -51,7 +50,8 @@
 import static org.apache.cassandra.net.ParamType.RESPOND_TO;
 import static org.apache.cassandra.net.ParamType.TRACE_SESSION;
 import static org.apache.cassandra.net.ParamType.TRACE_TYPE;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 import static org.junit.Assert.*;
 
@@ -100,7 +100,7 @@
                    .withFlag(MessageFlag.CALL_BACK_ON_FAILURE)
                    .withFlag(MessageFlag.TRACK_REPAIRED_DATA)
                    .withParam(TRACE_TYPE, TraceType.QUERY)
-                   .withParam(TRACE_SESSION, UUID.randomUUID())
+                   .withParam(TRACE_SESSION, nextTimeUUID())
                    .build();
 
         testInferMessageSize(msg, VERSION_30);
@@ -138,7 +138,7 @@
         long createAtNanos = approxTime.now();
         long expiresAtNanos = createAtNanos + TimeUnit.SECONDS.toNanos(1);
         TraceType traceType = TraceType.QUERY;
-        UUID traceSession = UUID.randomUUID();
+        TimeUUID traceSession = nextTimeUUID();
 
         Message<NoPayload> msg =
             Message.builder(Verb._TEST_1, noPayload)
@@ -160,7 +160,7 @@
         assertEquals(traceType, msg.traceType());
         assertEquals(traceSession, msg.traceSession());
         assertNull(msg.forwardTo());
-        assertNull(msg.respondTo());
+        assertEquals(from, msg.respondTo());
     }
 
     @Test
@@ -173,7 +173,7 @@
                    .withCreatedAt(approxTime.now())
                    .withExpiresAt(approxTime.now() + TimeUnit.SECONDS.toNanos(1))
                    .withFlag(MessageFlag.CALL_BACK_ON_FAILURE)
-                   .withParam(TRACE_SESSION, UUID.randomUUID())
+                   .withParam(TRACE_SESSION, nextTimeUUID())
                    .build();
         testCycle(msg);
     }
@@ -251,7 +251,7 @@
     {
         try
         {
-            UUID sessionId = Tracing.instance.newSession(traceType);
+            TimeUUID sessionId = Tracing.instance.newSession(traceType);
             Message<NoPayload> msg = Message.builder(Verb._TEST_1, noPayload).withTracingParams().build();
             assertEquals(sessionId, msg.header.traceSession());
             assertEquals(traceType, msg.header.traceType());
diff --git a/test/unit/org/apache/cassandra/net/MessagingServiceTest.java b/test/unit/org/apache/cassandra/net/MessagingServiceTest.java
index fd78e2a..349d865 100644
--- a/test/unit/org/apache/cassandra/net/MessagingServiceTest.java
+++ b/test/unit/org/apache/cassandra/net/MessagingServiceTest.java
@@ -20,8 +20,11 @@
  */
 package org.apache.cassandra.net;
 
+import java.io.IOException;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.UnknownHostException;
+import java.nio.channels.AsynchronousSocketChannel;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
@@ -29,6 +32,9 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
 import java.util.regex.*;
 import java.util.regex.Matcher;
 
@@ -44,6 +50,7 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.utils.FBUtilities;
+import org.awaitility.Awaitility;
 import org.caffinitas.ohc.histo.EstimatedHistogram;
 import org.junit.After;
 import org.junit.Assert;
@@ -57,10 +64,12 @@
 public class MessagingServiceTest
 {
     private final static long[] bucketOffsets = new EstimatedHistogram(160).getBucketOffsets();
+    public static AtomicInteger rejectedConnections = new AtomicInteger();
     public static final IInternodeAuthenticator ALLOW_NOTHING_AUTHENTICATOR = new IInternodeAuthenticator()
     {
         public boolean authenticate(InetAddress remoteAddress, int remotePort)
         {
+            rejectedConnections.incrementAndGet();
             return false;
         }
 
@@ -92,6 +101,7 @@
         messagingService.metrics.resetDroppedMessages();
         messagingService.closeOutbound(InetAddressAndPort.getByName("127.0.0.2"));
         messagingService.closeOutbound(InetAddressAndPort.getByName("127.0.0.3"));
+        DatabaseDescriptor.setInternodeAuthenticator(originalAuthenticator);
     }
 
     @After
@@ -100,7 +110,7 @@
         DatabaseDescriptor.setInternodeAuthenticator(originalAuthenticator);
         DatabaseDescriptor.setInternodeMessagingEncyptionOptions(originalServerEncryptionOptions);
         DatabaseDescriptor.setShouldListenOnBroadcastAddress(false);
-        DatabaseDescriptor.setListenAddress(originalListenAddress.address);
+        DatabaseDescriptor.setListenAddress(originalListenAddress.getAddress());
         FBUtilities.reset();
     }
 
@@ -156,7 +166,7 @@
         addDCLatency(sentAt, now);
         assertNotNull(dcLatency.get("datacenter1"));
         assertEquals(1, dcLatency.get("datacenter1").dcLatency.getCount());
-        long expectedBucket = bucketOffsets[Math.abs(Arrays.binarySearch(bucketOffsets, MILLISECONDS.toNanos(latency))) - 1];
+        long expectedBucket = bucketOffsets[Math.abs(Arrays.binarySearch(bucketOffsets, MILLISECONDS.toMicros(latency))) - 1];
         assertEquals(expectedBucket, dcLatency.get("datacenter1").dcLatency.getSnapshot().getMax());
     }
 
@@ -186,7 +196,7 @@
         Map<Verb, Timer> queueWaitLatency = MessagingService.instance().metrics.internalLatency;
         MessagingService.instance().metrics.recordInternalLatency(verb, latency, MILLISECONDS);
         assertEquals(1, queueWaitLatency.get(verb).getCount());
-        long expectedBucket = bucketOffsets[Math.abs(Arrays.binarySearch(bucketOffsets, MILLISECONDS.toNanos(latency))) - 1];
+        long expectedBucket = bucketOffsets[Math.abs(Arrays.binarySearch(bucketOffsets, MILLISECONDS.toMicros(latency))) - 1];
         assertEquals(expectedBucket, queueWaitLatency.get(verb).getSnapshot().getMax());
     }
 
@@ -216,21 +226,53 @@
      * @throws Exception
      */
     @Test
-    public void testFailedInternodeAuth() throws Exception
+    public void testFailedOutboundInternodeAuth() throws Exception
     {
         MessagingService ms = MessagingService.instance();
         DatabaseDescriptor.setInternodeAuthenticator(ALLOW_NOTHING_AUTHENTICATOR);
         InetAddressAndPort address = InetAddressAndPort.getByName("127.0.0.250");
 
         //Should return null
-        Message messageOut = Message.out(Verb.ECHO_REQ, NoPayload.noPayload);
-        assertFalse(ms.isConnected(address, messageOut));
+        int rejectedBefore = rejectedConnections.get();
+        Message<?> messageOut = Message.out(Verb.ECHO_REQ, NoPayload.noPayload);
+        ms.send(messageOut, address);
+        Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> rejectedConnections.get() > rejectedBefore);
 
         //Should tolerate null
         ms.closeOutbound(address);
         ms.send(messageOut, address);
     }
 
+    @Test
+    public void testFailedInboundInternodeAuth() throws IOException, InterruptedException
+    {
+        ServerEncryptionOptions serverEncryptionOptions = new ServerEncryptionOptions()
+            .withInternodeEncryption(ServerEncryptionOptions.InternodeEncryption.none);
+
+        DatabaseDescriptor.setInternodeAuthenticator(ALLOW_NOTHING_AUTHENTICATOR);
+        InetAddress listenAddress = FBUtilities.getJustLocalAddress();
+
+        InboundConnectionSettings settings = new InboundConnectionSettings().withEncryption(serverEncryptionOptions);
+        InboundSockets connections = new InboundSockets(settings);
+
+        try (AsynchronousSocketChannel testChannel = AsynchronousSocketChannel.open())
+        {
+            connections.open().await();
+            Assert.assertTrue(connections.isListening());
+
+            int rejectedBefore = rejectedConnections.get();
+            Future<Void> connectFuture = testChannel.connect(new InetSocketAddress(listenAddress, DatabaseDescriptor.getStoragePort()));
+            Awaitility.await().atMost(10, TimeUnit.SECONDS).until(() -> rejectedConnections.get() > rejectedBefore);
+
+            connectFuture.cancel(true);
+        }
+        finally
+        {
+            connections.close().await();
+            Assert.assertFalse(connections.isListening());
+        }
+    }
+
 //    @Test
 //    public void reconnectWithNewIp() throws Exception
 //    {
@@ -310,9 +352,12 @@
     @Test
     public void listenOptionalSecureConnection() throws InterruptedException
     {
-        ServerEncryptionOptions serverEncryptionOptions = new ServerEncryptionOptions()
-                                                          .withOptional(true);
-        listen(serverEncryptionOptions, false);
+        for (int i = 0; i < 500; i++) // test used to be flaky, so run in a loop to make sure stable (see CASSANDRA-17033)
+        {
+            ServerEncryptionOptions serverEncryptionOptions = new ServerEncryptionOptions()
+                                                              .withOptional(true);
+            listen(serverEncryptionOptions, false);
+        }
     }
 
     @Test
@@ -329,7 +374,7 @@
         if (listenOnBroadcastAddr)
         {
             DatabaseDescriptor.setShouldListenOnBroadcastAddress(true);
-            listenAddress = InetAddresses.increment(FBUtilities.getBroadcastAddressAndPort().address);
+            listenAddress = InetAddresses.increment(FBUtilities.getBroadcastAddressAndPort().getAddress());
             DatabaseDescriptor.setListenAddress(listenAddress);
             FBUtilities.reset();
         }
@@ -339,18 +384,18 @@
         InboundSockets connections = new InboundSockets(settings);
         try
         {
-            connections.open().await();
-            Assert.assertTrue(connections.isListening());
+            connections.open().sync();
+            Assert.assertTrue("connections is not listening", connections.isListening());
 
             Set<InetAddressAndPort> expect = new HashSet<>();
             expect.add(InetAddressAndPort.getByAddressOverrideDefaults(listenAddress, DatabaseDescriptor.getStoragePort()));
-            if (settings.encryption.enable_legacy_ssl_storage_port)
+            if (settings.encryption.legacy_ssl_storage_port_enabled)
                 expect.add(InetAddressAndPort.getByAddressOverrideDefaults(listenAddress, DatabaseDescriptor.getSSLStoragePort()));
             if (listenOnBroadcastAddr)
             {
-                expect.add(InetAddressAndPort.getByAddressOverrideDefaults(FBUtilities.getBroadcastAddressAndPort().address, DatabaseDescriptor.getStoragePort()));
-                if (settings.encryption.enable_legacy_ssl_storage_port)
-                    expect.add(InetAddressAndPort.getByAddressOverrideDefaults(FBUtilities.getBroadcastAddressAndPort().address, DatabaseDescriptor.getSSLStoragePort()));
+                expect.add(InetAddressAndPort.getByAddressOverrideDefaults(FBUtilities.getBroadcastAddressAndPort().getAddress(), DatabaseDescriptor.getStoragePort()));
+                if (settings.encryption.legacy_ssl_storage_port_enabled)
+                    expect.add(InetAddressAndPort.getByAddressOverrideDefaults(FBUtilities.getBroadcastAddressAndPort().getAddress(), DatabaseDescriptor.getSSLStoragePort()));
             }
 
             Assert.assertEquals(expect.size(), connections.sockets().size());
@@ -358,12 +403,12 @@
             final int legacySslPort = DatabaseDescriptor.getSSLStoragePort();
             for (InboundSockets.InboundSocket socket : connections.sockets())
             {
-                Assert.assertEquals(serverEncryptionOptions.isEnabled(), socket.settings.encryption.isEnabled());
-                Assert.assertEquals(serverEncryptionOptions.isOptional(), socket.settings.encryption.isOptional());
-                if (!serverEncryptionOptions.isEnabled())
-                    assertNotEquals(legacySslPort, socket.settings.bindAddress.port);
-                if (legacySslPort == socket.settings.bindAddress.port)
-                    Assert.assertFalse(socket.settings.encryption.isOptional());
+                Assert.assertEquals(serverEncryptionOptions.getEnabled(), socket.settings.encryption.getEnabled());
+                Assert.assertEquals(serverEncryptionOptions.getOptional(), socket.settings.encryption.getOptional());
+                if (!serverEncryptionOptions.getEnabled())
+                    assertNotEquals(legacySslPort, socket.settings.bindAddress.getPort());
+                if (legacySslPort == socket.settings.bindAddress.getPort())
+                    Assert.assertFalse(socket.settings.encryption.getOptional());
                 Assert.assertTrue(socket.settings.bindAddress.toString(), expect.remove(socket.settings.bindAddress));
             }
         }
diff --git a/test/unit/org/apache/cassandra/net/MockMessagingService.java b/test/unit/org/apache/cassandra/net/MockMessagingService.java
index 3749baf..54f9071 100644
--- a/test/unit/org/apache/cassandra/net/MockMessagingService.java
+++ b/test/unit/org/apache/cassandra/net/MockMessagingService.java
@@ -151,4 +151,4 @@
             return false;
         };
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/net/MockMessagingSpy.java b/test/unit/org/apache/cassandra/net/MockMessagingSpy.java
index 2197787..d3ea8f7 100644
--- a/test/unit/org/apache/cassandra/net/MockMessagingSpy.java
+++ b/test/unit/org/apache/cassandra/net/MockMessagingSpy.java
@@ -22,7 +22,6 @@
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -33,7 +32,7 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import junit.framework.AssertionFailedError;
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 
 /**
  * Allows inspecting the behavior of mocked messaging by observing {@link MatcherResponse}.
@@ -45,8 +44,8 @@
     private final AtomicInteger messagesIntercepted = new AtomicInteger();
     private final AtomicInteger mockedMessageResponses = new AtomicInteger();
 
-    private final BlockingQueue<Message<?>> interceptedMessages = new LinkedBlockingQueue<>();
-    private final BlockingQueue<Message<?>> deliveredResponses = new LinkedBlockingQueue<>();
+    private final BlockingQueue<Message<?>> interceptedMessages = newBlockingQueue();
+    private final BlockingQueue<Message<?>> deliveredResponses = newBlockingQueue();
 
     private static final Executor executor = Executors.newSingleThreadExecutor();
 
@@ -232,7 +231,7 @@
             {
                 T result = queue.poll(time, unit);
                 if (result != null)
-                    setException(new AssertionFailedError("Received unexpected message: " + result));
+                    setException(new AssertionError("Received unexpected message: " + result));
                 else
                     set(true);
             }
@@ -242,4 +241,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/net/OutboundConnectionSettingsTest.java b/test/unit/org/apache/cassandra/net/OutboundConnectionSettingsTest.java
index 66773f8..89549b4 100644
--- a/test/unit/org/apache/cassandra/net/OutboundConnectionSettingsTest.java
+++ b/test/unit/org/apache/cassandra/net/OutboundConnectionSettingsTest.java
@@ -34,8 +34,6 @@
 import org.apache.cassandra.locator.Replica;
 
 import static org.apache.cassandra.config.DatabaseDescriptor.getEndpointSnitch;
-import static org.apache.cassandra.net.MessagingService.current_version;
-import static org.apache.cassandra.net.ConnectionType.*;
 import static org.apache.cassandra.net.OutboundConnectionsTest.LOCAL_ADDR;
 import static org.apache.cassandra.net.OutboundConnectionsTest.REMOTE_ADDR;
 
diff --git a/test/unit/org/apache/cassandra/net/OutboundMessageQueueTest.java b/test/unit/org/apache/cassandra/net/OutboundMessageQueueTest.java
index bb7dc63..5cc9d1a 100644
--- a/test/unit/org/apache/cassandra/net/OutboundMessageQueueTest.java
+++ b/test/unit/org/apache/cassandra/net/OutboundMessageQueueTest.java
@@ -33,7 +33,7 @@
 import org.apache.cassandra.utils.FreeRunningClock;
 
 import static org.apache.cassandra.net.NoPayload.noPayload;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 // TODO: incomplete
 public class OutboundMessageQueueTest
diff --git a/test/unit/org/apache/cassandra/net/ProxyHandlerConnectionsTest.java b/test/unit/org/apache/cassandra/net/ProxyHandlerConnectionsTest.java
index 970ccd2..34aab91 100644
--- a/test/unit/org/apache/cassandra/net/ProxyHandlerConnectionsTest.java
+++ b/test/unit/org/apache/cassandra/net/ProxyHandlerConnectionsTest.java
@@ -54,7 +54,7 @@
 import static java.util.concurrent.TimeUnit.SECONDS;
 import static org.apache.cassandra.net.ConnectionTest.SETTINGS;
 import static org.apache.cassandra.net.OutboundConnectionSettings.Framing.CRC;
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 
 public class ProxyHandlerConnectionsTest
 {
diff --git a/test/unit/org/apache/cassandra/net/PrunableArrayQueueTest.java b/test/unit/org/apache/cassandra/net/PrunableArrayQueueTest.java
index 34f61a6..e9a60cd 100644
--- a/test/unit/org/apache/cassandra/net/PrunableArrayQueueTest.java
+++ b/test/unit/org/apache/cassandra/net/PrunableArrayQueueTest.java
@@ -24,8 +24,6 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import org.apache.cassandra.net.PrunableArrayQueue;
-
 import static org.junit.Assert.*;
 
 public class PrunableArrayQueueTest
@@ -200,4 +198,4 @@
             assertEquals("Queue size should be zero after draining. Seed: " + seed + ". Iteration: " + i, 0, testQueue.size());
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java b/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java
index f2f8a01..5c2ecbe 100644
--- a/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java
+++ b/test/unit/org/apache/cassandra/net/ResourceLimitsTest.java
@@ -23,9 +23,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.function.LongFunction;
 
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.KillerForTests;
 import org.junit.Assert;
diff --git a/test/unit/org/apache/cassandra/net/SocketUtils.java b/test/unit/org/apache/cassandra/net/SocketUtils.java
index a0a1490..78a49bd 100644
--- a/test/unit/org/apache/cassandra/net/SocketUtils.java
+++ b/test/unit/org/apache/cassandra/net/SocketUtils.java
@@ -54,4 +54,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/net/TestAbstractAsyncPromise.java b/test/unit/org/apache/cassandra/net/TestAbstractAsyncPromise.java
deleted file mode 100644
index fd61b09..0000000
--- a/test/unit/org/apache/cassandra/net/TestAbstractAsyncPromise.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.net;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.concurrent.CancellationException;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import com.google.common.util.concurrent.Uninterruptibles;
-import org.junit.Assert;
-
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.GenericFutureListener;
-import io.netty.util.concurrent.Promise;
-
-abstract class TestAbstractAsyncPromise extends TestAbstractPromise
-{
-    <V> void testOneSuccess(Promise<V> promise, boolean setUncancellable, boolean tryOrSet, V value, V otherValue)
-    {
-        List<V> results = new ArrayList<>();
-        List<Integer> order = new ArrayList<>();
-        class ListenerFactory
-        {
-            int count = 0;
-
-            public GenericFutureListener<Future<V>> get()
-            {
-                int id = count++;
-                return p -> { results.add(p.getNow()); order.add(id); };
-            }
-            public GenericFutureListener<Future<V>> getRecursive()
-            {
-                int id = count++;
-                return p -> { promise.addListener(get()); results.add(p.getNow()); order.add(id); };
-            }
-        }
-        ListenerFactory listeners = new ListenerFactory();
-        Async async = new Async();
-        promise.addListener(listeners.get());
-        promise.addListeners(listeners.getRecursive(), listeners.get());
-        promise.addListener(listeners.getRecursive());
-        success(promise, Promise::getNow, null);
-        success(promise, Promise::isSuccess, false);
-        success(promise, Promise::isDone, false);
-        success(promise, Promise::isCancelled, false);
-        success(promise, Promise::isCancellable, true);
-        if (setUncancellable)
-        {
-            success(promise, Promise::setUncancellable, true);
-            success(promise, Promise::setUncancellable, true);
-            success(promise, p -> p.cancel(true), false);
-            success(promise, p -> p.cancel(false), false);
-        }
-        success(promise, Promise::isCancellable, !setUncancellable);
-        async.success(promise, Promise::get, value);
-        async.success(promise, p -> p.get(1L, TimeUnit.SECONDS), value);
-        async.success(promise, Promise::await, promise);
-        async.success(promise, Promise::awaitUninterruptibly, promise);
-        async.success(promise, p -> p.await(1L, TimeUnit.SECONDS), true);
-        async.success(promise, p -> p.await(1000L), true);
-        async.success(promise, p -> p.awaitUninterruptibly(1L, TimeUnit.SECONDS), true);
-        async.success(promise, p -> p.awaitUninterruptibly(1000L), true);
-        async.success(promise, Promise::sync, promise);
-        async.success(promise, Promise::syncUninterruptibly, promise);
-        if (tryOrSet) promise.trySuccess(value);
-        else promise.setSuccess(value);
-        success(promise, p -> p.cancel(true), false);
-        success(promise, p -> p.cancel(false), false);
-        failure(promise, p -> p.setSuccess(null), IllegalStateException.class);
-        failure(promise, p -> p.setFailure(new NullPointerException()), IllegalStateException.class);
-        success(promise, Promise::getNow, value);
-        success(promise, p -> p.trySuccess(otherValue), false);
-        success(promise, p -> p.tryFailure(new NullPointerException()), false);
-        success(promise, Promise::getNow, value);
-        success(promise, Promise::cause, null);
-        promise.addListener(listeners.get());
-        promise.addListeners(listeners.getRecursive(), listeners.get());
-        promise.addListener(listeners.getRecursive());
-        success(promise, Promise::isSuccess, true);
-        success(promise, Promise::isDone, true);
-        success(promise, Promise::isCancelled, false);
-        success(promise, Promise::isCancellable, false);
-        async.verify();
-        Assert.assertEquals(listeners.count, results.size());
-        Assert.assertEquals(listeners.count, order.size());
-        for (V result : results)
-            Assert.assertEquals(value, result);
-        for (int i = 0 ; i < order.size() ; ++i)
-            Assert.assertEquals(i, order.get(i).intValue());
-    }
-
-    <V> void testOneFailure(Promise<V> promise, boolean setUncancellable, boolean tryOrSet, Throwable cause, V otherValue)
-    {
-        List<Throwable> results = new ArrayList<>();
-        List<Integer> order = new ArrayList<>();
-        Async async = new Async();
-        class ListenerFactory
-        {
-            int count = 0;
-
-            public GenericFutureListener<Future<V>> get()
-            {
-                int id = count++;
-                return p -> { results.add(p.cause()); order.add(id); };
-            }
-            public GenericFutureListener<Future<V>> getRecursive()
-            {
-                int id = count++;
-                return p -> { promise.addListener(get()); results.add(p.cause()); order.add(id); };
-            }
-        }
-        ListenerFactory listeners = new ListenerFactory();
-        promise.addListener(listeners.get());
-        promise.addListeners(listeners.getRecursive(), listeners.get());
-        promise.addListener(listeners.getRecursive());
-        success(promise, Promise::isSuccess, false);
-        success(promise, Promise::isDone, false);
-        success(promise, Promise::isCancelled, false);
-        success(promise, Promise::isCancellable, true);
-        if (setUncancellable)
-        {
-            success(promise, Promise::setUncancellable, true);
-            success(promise, Promise::setUncancellable, true);
-            success(promise, p -> p.cancel(true), false);
-            success(promise, p -> p.cancel(false), false);
-        }
-        success(promise, Promise::isCancellable, !setUncancellable);
-        success(promise, Promise::getNow, null);
-        success(promise, Promise::cause, null);
-        async.failure(promise, Promise::get, ExecutionException.class);
-        async.failure(promise, p -> p.get(1L, TimeUnit.SECONDS), ExecutionException.class);
-        async.success(promise, Promise::await, promise);
-        async.success(promise, Promise::awaitUninterruptibly, promise);
-        async.success(promise, p -> p.await(1L, TimeUnit.SECONDS), true);
-        async.success(promise, p -> p.await(1000L), true);
-        async.success(promise, p -> p.awaitUninterruptibly(1L, TimeUnit.SECONDS), true);
-        async.success(promise, p -> p.awaitUninterruptibly(1000L), true);
-        async.failure(promise, Promise::sync, cause);
-        async.failure(promise, Promise::syncUninterruptibly, cause);
-        if (tryOrSet) promise.tryFailure(cause);
-        else promise.setFailure(cause);
-        success(promise, p -> p.cancel(true), false);
-        success(promise, p -> p.cancel(false), false);
-        failure(promise, p -> p.setSuccess(null), IllegalStateException.class);
-        failure(promise, p -> p.setFailure(new NullPointerException()), IllegalStateException.class);
-        success(promise, Promise::cause, cause);
-        success(promise, Promise::getNow, null);
-        success(promise, p -> p.trySuccess(otherValue), false);
-        success(promise, p -> p.tryFailure(new NullPointerException()), false);
-        success(promise, Promise::getNow, null);
-        success(promise, Promise::cause, cause);
-        promise.addListener(listeners.get());
-        promise.addListeners(listeners.getRecursive(), listeners.get());
-        promise.addListener(listeners.getRecursive());
-        success(promise, Promise::isSuccess, false);
-        success(promise, Promise::isDone, true);
-        success(promise, Promise::isCancelled, false);
-        success(promise, Promise::isCancellable, false);
-        async.verify();
-        Assert.assertEquals(listeners.count, results.size());
-        Assert.assertEquals(listeners.count, order.size());
-        for (Throwable result : results)
-            Assert.assertEquals(cause, result);
-        for (int i = 0 ; i < order.size() ; ++i)
-            Assert.assertEquals(i, order.get(i).intValue());
-    }
-
-    public <V> void testOneCancellation(Promise<V> promise, boolean interruptIfRunning, V otherValue)
-    {
-        Async async = new Async();
-        success(promise, Promise::isCancellable, true);
-        success(promise, Promise::getNow, null);
-        success(promise, Promise::cause, null);
-        async.failure(promise, Promise::get, CancellationException.class);
-        async.failure(promise, p -> p.get(1L, TimeUnit.SECONDS), CancellationException.class);
-        async.success(promise, Promise::await, promise);
-        async.success(promise, Promise::awaitUninterruptibly, promise);
-        async.success(promise, p -> p.await(1L, TimeUnit.SECONDS), true);
-        async.success(promise, p -> p.await(1000L), true);
-        async.success(promise, p -> p.awaitUninterruptibly(1L, TimeUnit.SECONDS), true);
-        async.success(promise, p -> p.awaitUninterruptibly(1000L), true);
-        async.failure(promise, Promise::sync, CancellationException.class);
-        async.failure(promise, Promise::syncUninterruptibly, CancellationException.class);
-        promise.cancel(interruptIfRunning);
-        failure(promise, p -> p.setFailure(null), IllegalStateException.class);
-        failure(promise, p -> p.setFailure(null), IllegalStateException.class);
-        Assert.assertTrue(promise.cause() instanceof CancellationException);
-        success(promise, Promise::getNow, null);
-        success(promise, p -> p.trySuccess(otherValue), false);
-        success(promise, Promise::getNow, null);
-        Assert.assertTrue(promise.cause() instanceof CancellationException);
-        success(promise, Promise::isSuccess, false);
-        success(promise, Promise::isDone, true);
-        success(promise, Promise::isCancelled, true);
-        success(promise, Promise::isCancellable, false);
-        async.verify();
-    }
-
-
-    public <V> void testOneTimeout(Promise<V> promise, boolean setUncancellable)
-    {
-        Async async = new Async();
-        if (setUncancellable)
-            success(promise, Promise::setUncancellable, true);
-        success(promise, Promise::isCancellable, !setUncancellable);
-        async.failure(promise, p -> p.get(1L, TimeUnit.MILLISECONDS), TimeoutException.class);
-        async.success(promise, p -> p.await(1L, TimeUnit.MILLISECONDS), false);
-        async.success(promise, p -> p.await(1L), false);
-        async.success(promise, p -> p.awaitUninterruptibly(1L, TimeUnit.MILLISECONDS), false);
-        async.success(promise, p -> p.awaitUninterruptibly(1L), false);
-        Uninterruptibles.sleepUninterruptibly(10L, TimeUnit.MILLISECONDS);
-        async.verify();
-    }
-
-}
diff --git a/test/unit/org/apache/cassandra/net/TestAbstractPromise.java b/test/unit/org/apache/cassandra/net/TestAbstractPromise.java
deleted file mode 100644
index 32d11c3..0000000
--- a/test/unit/org/apache/cassandra/net/TestAbstractPromise.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.net;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Objects;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Predicate;
-
-import org.junit.Assert;
-
-import io.netty.util.concurrent.Promise;
-import net.openhft.chronicle.core.util.ThrowingBiConsumer;
-import net.openhft.chronicle.core.util.ThrowingConsumer;
-import net.openhft.chronicle.core.util.ThrowingFunction;
-
-abstract class TestAbstractPromise
-{
-    final ExecutorService exec = Executors.newCachedThreadPool();
-
-    class Async
-    {
-        final List<ThrowingBiConsumer<Long, TimeUnit, ?>> waitingOn = new ArrayList<>();
-        void verify()
-        {
-            for (int i = 0 ; i < waitingOn.size() ; ++i)
-            {
-                try
-                {
-                    waitingOn.get(i).accept(1L, TimeUnit.SECONDS);
-                }
-                catch (Throwable t)
-                {
-                    throw new AssertionError("" + i, t);
-                }
-            }
-        }
-        <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Throwable failsWith)
-        {
-            waitingOn.add(exec.submit(() -> TestAbstractPromise.failure(promise, action, failsWith))::get);
-        }
-        <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Class<? extends Throwable> failsWith)
-        {
-            waitingOn.add(exec.submit(() -> TestAbstractPromise.failure(promise, action, failsWith))::get);
-        }
-        <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Predicate<Throwable> failsWith)
-        {
-            waitingOn.add(exec.submit(() -> TestAbstractPromise.failure(promise, action, failsWith))::get);
-        }
-        <P extends Promise<?>, R> void success(P promise, ThrowingFunction<P, R, ?> action, R result)
-        {
-            waitingOn.add(exec.submit(() -> TestAbstractPromise.success(promise, action, result))::get);
-        }
-    }
-
-    private static <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Throwable failsWith)
-    {
-        failure(promise, action, t -> Objects.equals(failsWith, t));
-    }
-
-    static <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Class<? extends Throwable> failsWith)
-    {
-        failure(promise, action, failsWith::isInstance);
-    }
-
-    private static <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Predicate<Throwable> failsWith)
-    {
-        Throwable fail = null;
-        try
-        {
-            action.accept(promise);
-        }
-        catch (Throwable t)
-        {
-            fail = t;
-        }
-        if (!failsWith.test(fail))
-            throw new AssertionError(fail);
-    }
-
-    static <P extends Promise<?>, R> void success(P promise, ThrowingFunction<P, R, ?> action, R result)
-    {
-        try
-        {
-            Assert.assertEquals(result, action.apply(promise));
-        }
-        catch (Throwable t)
-        {
-            throw new AssertionError(t);
-        }
-    }
-
-}
diff --git a/test/unit/org/apache/cassandra/net/TestChannel.java b/test/unit/org/apache/cassandra/net/TestChannel.java
index 17da6fa..d76e045 100644
--- a/test/unit/org/apache/cassandra/net/TestChannel.java
+++ b/test/unit/org/apache/cassandra/net/TestChannel.java
@@ -19,28 +19,45 @@
 package org.apache.cassandra.net;
 
 import java.io.IOException;
+import java.net.SocketAddress;
 import java.nio.ByteBuffer;
 import java.nio.channels.WritableByteChannel;
 
+import com.google.common.net.InetAddresses;
+
 import io.netty.buffer.ByteBuf;
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelOutboundBuffer;
 import io.netty.channel.FileRegion;
 import io.netty.channel.embedded.EmbeddedChannel;
+import org.apache.cassandra.locator.InetAddressAndPort;
 
 public class TestChannel extends EmbeddedChannel
 {
+    public static final InetAddressAndPort REMOTE_ADDR = InetAddressAndPort.getByAddressOverrideDefaults(InetAddresses.forString("127.0.0.2"), 0);
+
     final int inFlightLimit;
     int inFlight;
 
     ChannelOutboundBuffer flush;
     long flushBytes;
 
+    public TestChannel()
+    {
+        this(Integer.MAX_VALUE);
+    }
+
     public TestChannel(int inFlightLimit)
     {
         this.inFlightLimit = inFlightLimit;
     }
 
+    @Override
+    public SocketAddress remoteAddress()
+    {
+        return REMOTE_ADDR;
+    }
+
     // we override ByteBuf to prevent retain() from working, to avoid release() since it is not needed in our usage
     // since the lifetime must live longer, we simply copy any outbound ByteBuf here for our tests
     protected void doWrite(ChannelOutboundBuffer in)
diff --git a/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java b/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java
deleted file mode 100644
index b4bf8b7..0000000
--- a/test/unit/org/apache/cassandra/net/WriteCallbackInfoTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*    http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing,
-* software distributed under the License is distributed on an
-* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-* KIND, either express or implied.  See the License for the
-* specific language governing permissions and limitations
-* under the License.
-*/
-package org.apache.cassandra.net;
-
-import java.util.UUID;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import org.junit.Assert;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.db.Mutation;
-import org.apache.cassandra.db.RegularAndStaticColumns;
-import org.apache.cassandra.db.partitions.PartitionUpdate;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.schema.MockSchema;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.service.paxos.Commit;
-import org.apache.cassandra.utils.ByteBufferUtil;
-
-import static org.apache.cassandra.locator.ReplicaUtils.full;
-
-public class WriteCallbackInfoTest
-{
-    @BeforeClass
-    public static void initDD()
-    {
-        DatabaseDescriptor.daemonInitialization();
-    }
-
-    @Test
-    public void testShouldHint() throws Exception
-    {
-        testShouldHint(Verb.COUNTER_MUTATION_REQ, ConsistencyLevel.ALL, true, false);
-        for (Verb verb : new Verb[] { Verb.PAXOS_COMMIT_REQ, Verb.MUTATION_REQ })
-        {
-            testShouldHint(verb, ConsistencyLevel.ALL, true, true);
-            testShouldHint(verb, ConsistencyLevel.ANY, true, false);
-            testShouldHint(verb, ConsistencyLevel.ALL, false, false);
-        }
-    }
-
-    private void testShouldHint(Verb verb, ConsistencyLevel cl, boolean allowHints, boolean expectHint) throws Exception
-    {
-        TableMetadata metadata = MockSchema.newTableMetadata("", "");
-        Object payload = verb == Verb.PAXOS_COMMIT_REQ
-                         ? new Commit(UUID.randomUUID(), new PartitionUpdate.Builder(metadata, ByteBufferUtil.EMPTY_BYTE_BUFFER, RegularAndStaticColumns.NONE, 1).build())
-                         : new Mutation(PartitionUpdate.simpleBuilder(metadata, "").build());
-
-        RequestCallbacks.WriteCallbackInfo wcbi = new RequestCallbacks.WriteCallbackInfo(Message.out(verb, payload), full(InetAddressAndPort.getByName("192.168.1.1")), null, cl, allowHints);
-        Assert.assertEquals(expectHint, wcbi.shouldHint());
-        if (expectHint)
-        {
-            Assert.assertNotNull(wcbi.mutation());
-        }
-        else
-        {
-            boolean fail = false;
-            try
-            {
-                wcbi.mutation();
-            }
-            catch (Throwable t)
-            {
-                fail = true;
-            }
-            Assert.assertTrue(fail);
-        }
-    }
-}
diff --git a/test/unit/org/apache/cassandra/repair/AbstractRepairTest.java b/test/unit/org/apache/cassandra/repair/AbstractRepairTest.java
index d57607a..eb4ca9f 100644
--- a/test/unit/org/apache/cassandra/repair/AbstractRepairTest.java
+++ b/test/unit/org/apache/cassandra/repair/AbstractRepairTest.java
@@ -20,7 +20,6 @@
 
 import java.net.UnknownHostException;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
@@ -36,7 +35,9 @@
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 @Ignore
 public abstract class AbstractRepairTest
@@ -82,9 +83,9 @@
 
     protected static final Set<Range<Token>> ALL_RANGES = ImmutableSet.of(RANGE1, RANGE2, RANGE3);
 
-    public static UUID registerSession(ColumnFamilyStore cfs, boolean isIncremental, boolean isGlobal)
+    public static TimeUUID registerSession(ColumnFamilyStore cfs, boolean isIncremental, boolean isGlobal)
     {
-        UUID sessionId = UUIDGen.getTimeUUID();
+        TimeUUID sessionId = nextTimeUUID();
 
         long repairedAt = isIncremental ? System.currentTimeMillis() : ActiveRepairService.UNREPAIRED_SSTABLE;
         ActiveRepairService.instance.registerParentRepairSession(sessionId,
diff --git a/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java
index 443d59e..47d50a2 100644
--- a/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java
+++ b/test/unit/org/apache/cassandra/repair/LocalSyncTaskTest.java
@@ -21,11 +21,8 @@
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.Set;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
 
 import com.google.common.collect.Iterables;
-import com.google.common.collect.Lists;
 import org.junit.BeforeClass;
 import org.junit.Test;
 import org.apache.cassandra.SchemaLoader;
@@ -42,17 +39,18 @@
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.StreamCoordinator;
-import org.apache.cassandra.streaming.DefaultConnectionFactory;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.streaming.StreamPlan;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.StreamSession;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MerkleTree;
 import org.apache.cassandra.utils.MerkleTrees;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -86,7 +84,7 @@
         final InetAddressAndPort ep2 = InetAddressAndPort.getByName("127.0.0.2");
 
         Range<Token> range = new Range<>(partitioner.getMinimumToken(), partitioner.getRandomToken());
-        RepairJobDesc desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), KEYSPACE1, "Standard1", Arrays.asList(range));
+        RepairJobDesc desc = new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), KEYSPACE1, "Standard1", Arrays.asList(range));
 
         MerkleTrees tree1 = createInitialTree(desc);
 
@@ -107,7 +105,7 @@
     public void testDifference() throws Throwable
     {
         Range<Token> range = new Range<>(partitioner.getMinimumToken(), partitioner.getRandomToken());
-        UUID parentRepairSession = UUID.randomUUID();
+        TimeUUID parentRepairSession = nextTimeUUID();
         Keyspace keyspace = Keyspace.open(KEYSPACE1);
         ColumnFamilyStore cfs = keyspace.getColumnFamilyStore("Standard1");
 
@@ -116,7 +114,7 @@
                                                                  ActiveRepairService.UNREPAIRED_SSTABLE, false,
                                                                  PreviewKind.NONE);
 
-        RepairJobDesc desc = new RepairJobDesc(parentRepairSession, UUID.randomUUID(), KEYSPACE1, "Standard1", Arrays.asList(range));
+        RepairJobDesc desc = new RepairJobDesc(parentRepairSession, nextTimeUUID(), KEYSPACE1, "Standard1", Arrays.asList(range));
 
         MerkleTrees tree1 = createInitialTree(desc);
         MerkleTrees tree2 = createInitialTree(desc);
@@ -136,14 +134,14 @@
         TreeResponse r2 = new TreeResponse(InetAddressAndPort.getByName("127.0.0.2"), tree2);
         LocalSyncTask task = new LocalSyncTask(desc, r1.endpoint, r2.endpoint, MerkleTrees.difference(r1.trees, r2.trees),
                                                NO_PENDING_REPAIR, true, true, PreviewKind.NONE);
-        DefaultConnectionFactory.MAX_CONNECT_ATTEMPTS = 1;
+        NettyStreamingConnectionFactory.MAX_CONNECT_ATTEMPTS = 1;
         try
         {
             task.run();
         }
         finally
         {
-            DefaultConnectionFactory.MAX_CONNECT_ATTEMPTS = 3;
+            NettyStreamingConnectionFactory.MAX_CONNECT_ATTEMPTS = 3;
         }
 
         // ensure that the changed range was recorded
@@ -153,9 +151,9 @@
     @Test
     public void fullRepairStreamPlan() throws Exception
     {
-        UUID sessionID = registerSession(cfs, true, true);
+        TimeUUID sessionID = registerSession(cfs, true, true);
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
-        RepairJobDesc desc = new RepairJobDesc(sessionID, UUIDGen.getTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
+        RepairJobDesc desc = new RepairJobDesc(sessionID, nextTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
 
         TreeResponse r1 = new TreeResponse(local, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
         TreeResponse r2 = new TreeResponse(PARTICIPANT2, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
@@ -179,9 +177,9 @@
     @Test
     public void incrementalRepairStreamPlan() throws Exception
     {
-        UUID sessionID = registerSession(cfs, true, true);
+        TimeUUID sessionID = registerSession(cfs, true, true);
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
-        RepairJobDesc desc = new RepairJobDesc(sessionID, UUIDGen.getTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
+        RepairJobDesc desc = new RepairJobDesc(sessionID, nextTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
 
         TreeResponse r1 = new TreeResponse(local, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
         TreeResponse r2 = new TreeResponse(PARTICIPANT2, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
@@ -199,11 +197,11 @@
      * Don't reciprocate streams if the other endpoint is a transient replica
      */
     @Test
-    public void transientRemoteStreamPlan()
+    public void transientRemoteStreamPlan() throws NoSuchRepairSessionException
     {
-        UUID sessionID = registerSession(cfs, true, true);
+        TimeUUID sessionID = registerSession(cfs, true, true);
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
-        RepairJobDesc desc = new RepairJobDesc(sessionID, UUIDGen.getTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
+        RepairJobDesc desc = new RepairJobDesc(sessionID, nextTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
 
         TreeResponse r1 = new TreeResponse(local, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
         TreeResponse r2 = new TreeResponse(PARTICIPANT2, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
@@ -218,11 +216,11 @@
      * Don't request streams if the other endpoint is a transient replica
      */
     @Test
-    public void transientLocalStreamPlan()
+    public void transientLocalStreamPlan() throws NoSuchRepairSessionException
     {
-        UUID sessionID = registerSession(cfs, true, true);
+        TimeUUID sessionID = registerSession(cfs, true, true);
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
-        RepairJobDesc desc = new RepairJobDesc(sessionID, UUIDGen.getTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
+        RepairJobDesc desc = new RepairJobDesc(sessionID, nextTimeUUID(), KEYSPACE1, CF_STANDARD, prs.getRanges());
 
         TreeResponse r1 = new TreeResponse(local, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
         TreeResponse r2 = new TreeResponse(PARTICIPANT2, createInitialTree(desc, DatabaseDescriptor.getPartitioner()));
@@ -235,10 +233,10 @@
 
     private MerkleTrees createInitialTree(RepairJobDesc desc, IPartitioner partitioner)
     {
-        MerkleTrees tree = new MerkleTrees(partitioner);
-        tree.addMerkleTrees((int) Math.pow(2, 15), desc.ranges);
-        tree.init();
-        return tree;
+        MerkleTrees trees = new MerkleTrees(partitioner);
+        trees.addMerkleTrees((int) Math.pow(2, 15), desc.ranges);
+        trees.init();
+        return trees;
     }
 
     private MerkleTrees createInitialTree(RepairJobDesc desc)
diff --git a/test/unit/org/apache/cassandra/repair/RepairJobTest.java b/test/unit/org/apache/cassandra/repair/RepairJobTest.java
index 87863b5..c7c68c4 100644
--- a/test/unit/org/apache/cassandra/repair/RepairJobTest.java
+++ b/test/unit/org/apache/cassandra/repair/RepairJobTest.java
@@ -27,7 +27,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.Callable;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
@@ -38,19 +37,23 @@
 
 import com.google.common.collect.ImmutableMap;
 import com.google.common.util.concurrent.ListenableFuture;
+import org.assertj.core.api.Assertions;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
+import org.apache.cassandra.concurrent.ExecutorFactory;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.dht.ByteOrderedPartitioner;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.exceptions.RepairException;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.net.MessagingService;
@@ -59,6 +62,10 @@
 import org.apache.cassandra.repair.messages.SyncRequest;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.service.paxos.Paxos;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupRequest;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupResponse;
+import org.apache.cassandra.service.paxos.cleanup.PaxosCleanupSession;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.SessionSummary;
 import org.apache.cassandra.utils.ByteBufferUtil;
@@ -67,13 +74,22 @@
 import org.apache.cassandra.utils.MerkleTrees;
 import org.apache.cassandra.utils.ObjectSizes;
 import org.apache.cassandra.utils.Throwables;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.asserts.SyncTaskListAssert;
 
+import static java.util.Collections.emptySet;
+import static org.apache.cassandra.repair.RepairParallelism.SEQUENTIAL;
+import static org.apache.cassandra.streaming.PreviewKind.NONE;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.apache.cassandra.utils.asserts.SyncTaskAssert.assertThat;
 import static org.apache.cassandra.utils.asserts.SyncTaskListAssert.assertThat;
 import static org.assertj.core.api.Assertions.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_START_PREPARE_REQ;
+import static org.apache.cassandra.net.Verb.PAXOS2_CLEANUP_REQ;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class RepairJobTest
 {
@@ -88,7 +104,7 @@
     private static final Range<Token> RANGE_1 = range(0, 1);
     private static final Range<Token> RANGE_2 = range(2, 3);
     private static final Range<Token> RANGE_3 = range(4, 5);
-    private static final RepairJobDesc JOB_DESC = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), KEYSPACE, CF, Collections.emptyList());
+    private static final RepairJobDesc JOB_DESC = new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), KEYSPACE, CF, Collections.emptyList());
     private static final List<Range<Token>> FULL_RANGE = Collections.singletonList(new Range<>(MURMUR3_PARTITIONER.getMinimumToken(),
                                                                                                MURMUR3_PARTITIONER.getMaximumToken()));
     private static InetAddressAndPort addr1;
@@ -106,18 +122,22 @@
     {
         private final List<Callable<?>> syncCompleteCallbacks = new ArrayList<>();
 
-        public MeasureableRepairSession(UUID parentRepairSession, UUID id, CommonRange commonRange, String keyspace,
+        public MeasureableRepairSession(TimeUUID parentRepairSession, CommonRange commonRange, String keyspace,
                                         RepairParallelism parallelismDegree, boolean isIncremental, boolean pullRepair,
-                                        PreviewKind previewKind, boolean optimiseStreams, String... cfnames)
+                                        PreviewKind previewKind, boolean optimiseStreams, boolean repairPaxos, boolean paxosOnly,
+                                        String... cfnames)
         {
-            super(parentRepairSession, id, commonRange, keyspace, parallelismDegree, isIncremental, pullRepair, previewKind, optimiseStreams, cfnames);
+            super(parentRepairSession, commonRange, keyspace, parallelismDegree, isIncremental, pullRepair,
+                  previewKind, optimiseStreams, repairPaxos, paxosOnly, cfnames);
         }
 
-        protected DebuggableThreadPoolExecutor createExecutor()
+        protected ExecutorPlus createExecutor()
         {
-            DebuggableThreadPoolExecutor executor = super.createExecutor();
-            executor.setKeepAliveTime(THREAD_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS);
-            return executor;
+            return ExecutorFactory.Global.executorFactory()
+                    .configurePooled("RepairJobTask", Integer.MAX_VALUE)
+                    .withDefaultThreadGroup()
+                    .withKeepAlive(THREAD_TIMEOUT_MILLIS, TimeUnit.MILLISECONDS)
+                    .build();
         }
 
         @Override
@@ -162,21 +182,21 @@
     {
         Set<InetAddressAndPort> neighbors = new HashSet<>(Arrays.asList(addr2, addr3));
 
-        UUID parentRepairSession = UUID.randomUUID();
+        TimeUUID parentRepairSession = nextTimeUUID();
         ActiveRepairService.instance.registerParentRepairSession(parentRepairSession, FBUtilities.getBroadcastAddressAndPort(),
                                                                  Collections.singletonList(Keyspace.open(KEYSPACE).getColumnFamilyStore(CF)), FULL_RANGE, false,
                                                                  ActiveRepairService.UNREPAIRED_SSTABLE, false, PreviewKind.NONE);
 
-        this.session = new MeasureableRepairSession(parentRepairSession, UUIDGen.getTimeUUID(),
-                                                    new CommonRange(neighbors, Collections.emptySet(), FULL_RANGE),
-                                                    KEYSPACE, RepairParallelism.SEQUENTIAL, false, false,
-                                                    PreviewKind.NONE, false, CF);
+        this.session = new MeasureableRepairSession(parentRepairSession,
+                                                    new CommonRange(neighbors, emptySet(), FULL_RANGE),
+                                                    KEYSPACE, SEQUENTIAL, false, false,
+                                                    NONE, false, true, false, CF);
 
         this.job = new RepairJob(session, CF);
-        this.sessionJobDesc = new RepairJobDesc(session.parentRepairSession, session.getId(),
-                                                session.keyspace, CF, session.ranges());
+        this.sessionJobDesc = new RepairJobDesc(session.state.parentRepairSession, session.getId(),
+                                                session.state.keyspace, CF, session.ranges());
 
-        FBUtilities.setBroadcastInetAddress(addr1.address);
+        FBUtilities.setBroadcastInetAddress(addr1.getAddress());
     }
 
     @After
@@ -204,6 +224,7 @@
 
         job.run();
 
+        Thread.sleep(1000);
         RepairResult result = job.get(TEST_TIMEOUT_S, TimeUnit.SECONDS);
 
         // Since there are no differences, there should be nothing to sync.
@@ -251,13 +272,17 @@
         // SyncTasks themselves should not contain significant memory
         SyncTaskListAssert.assertThat(syncTasks).hasSizeLessThan(0.2 * singleTreeSize);
 
+        // Remember the size of the session before we've executed any tasks
+        long sizeBeforeExecution = ObjectSizes.measureDeep(session);
+
         // block syncComplete execution until test has verified session still retains the trees
         CompletableFuture<?> future = new CompletableFuture<>();
         session.registerSyncCompleteCallback(future::get);
         ListenableFuture<List<SyncStat>> syncResults = job.executeTasks(syncTasks);
 
         // Immediately following execution the internal execution queue should still retain the trees
-        assertThat(ObjectSizes.measureDeep(session)).isGreaterThan(singleTreeSize);
+        long sizeDuringExecution = ObjectSizes.measureDeep(session);
+        assertThat(sizeDuringExecution).isGreaterThan(sizeBeforeExecution + (syncTasks.size() * singleTreeSize));
         // unblock syncComplete callback, session should remove trees
         future.complete(null);
 
@@ -266,9 +291,8 @@
         long millisUntilFreed;
         for (millisUntilFreed = 0; millisUntilFreed < TEST_TIMEOUT_S * 1000; millisUntilFreed += THREAD_TIMEOUT_MILLIS)
         {
-            // The measured size of the syncingTasks, and result of the computation should be much smaller
             TimeUnit.MILLISECONDS.sleep(THREAD_TIMEOUT_MILLIS);
-            if (ObjectSizes.measureDeep(session) < 0.8 * singleTreeSize)
+            if (ObjectSizes.measureDeep(session) < (sizeDuringExecution - (syncTasks.size() * singleTreeSize)))
                 break;
         }
 
@@ -291,6 +315,34 @@
     }
 
     @Test
+    public void testValidationFailure() throws InterruptedException, TimeoutException
+    {
+        Map<InetAddressAndPort, MerkleTrees> mockTrees = new HashMap<>();
+        mockTrees.put(addr1, createInitialTree(false));
+        mockTrees.put(addr2, createInitialTree(false));
+        mockTrees.put(addr3, null);
+
+        interceptRepairMessages(mockTrees, new ArrayList<>());
+
+        try 
+        {
+            job.run();
+            job.get(TEST_TIMEOUT_S, TimeUnit.SECONDS);
+            fail("The repair job should have failed on a simulated validation error.");
+        }
+        catch (ExecutionException e)
+        {
+            Assertions.assertThat(e.getCause()).isInstanceOf(RepairException.class);
+        }
+
+        // When the job fails, all three outstanding validation tasks should be aborted.
+        List<ValidationTask> tasks = job.validationTasks;
+        assertEquals(3, tasks.size());
+        assertFalse(tasks.stream().anyMatch(ValidationTask::isActive));
+        assertFalse(tasks.stream().allMatch(ValidationTask::isDone));
+    }
+
+    @Test
     public void testCreateStandardSyncTasks()
     {
         testCreateStandardSyncTasks(false);
@@ -525,7 +577,7 @@
         for (InetAddressAndPort local : new InetAddressAndPort[]{ addr1, addr2, addr3 })
         {
             FBUtilities.reset();
-            FBUtilities.setBroadcastInetAddress(local.address);
+            FBUtilities.setBroadcastInetAddress(local.getAddress());
             testLocalSyncWithTransient(local, false);
         }
     }
@@ -536,7 +588,7 @@
         for (InetAddressAndPort local : new InetAddressAndPort[]{ addr1, addr2, addr3 })
         {
             FBUtilities.reset();
-            FBUtilities.setBroadcastInetAddress(local.address);
+            FBUtilities.setBroadcastInetAddress(local.getAddress());
             testLocalSyncWithTransient(local, true);
         }
     }
@@ -592,7 +644,7 @@
 
     private static void testLocalAndRemoteTransient(boolean pullRepair)
     {
-        FBUtilities.setBroadcastInetAddress(addr4.address);
+        FBUtilities.setBroadcastInetAddress(addr4.getAddress());
         List<TreeResponse> treeResponses = Arrays.asList(treeResponse(addr1, RANGE_1, "one", RANGE_2, "one", RANGE_3, "one"),
                                                          treeResponse(addr2, RANGE_1, "two", RANGE_2, "two", RANGE_3, "two"),
                                                          treeResponse(addr3, RANGE_1, "three", RANGE_2, "three", RANGE_3, "three"),
@@ -684,7 +736,7 @@
                                                          treeResponse(addr2, RANGE_1, "different", RANGE_2, "same", RANGE_3, "different"),
                                                          treeResponse(addr3, RANGE_1, "same", RANGE_2, "same", RANGE_3, "same"));
 
-        RepairJobDesc desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), "ks", "cf", Collections.emptyList());
+        RepairJobDesc desc = new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), "ks", "cf", Collections.emptyList());
         Map<SyncNodePair, SyncTask> tasks = toMap(RepairJob.createOptimisedSyncingSyncTasks(desc,
                                                                                             treeResponses,
                                                                                             addr1, // local
@@ -786,19 +838,19 @@
 
     private MerkleTrees createInitialTree(boolean invalidate)
     {
-        MerkleTrees tree = new MerkleTrees(MURMUR3_PARTITIONER);
-        tree.addMerkleTrees((int) Math.pow(2, 15), FULL_RANGE);
-        tree.init();
+        MerkleTrees trees = new MerkleTrees(MURMUR3_PARTITIONER);
+        trees.addMerkleTrees((int) Math.pow(2, 15), FULL_RANGE);
+        trees.init();
 
         if (invalidate)
         {
             // change a range in one of the trees
             Token token = MURMUR3_PARTITIONER.midpoint(FULL_RANGE.get(0).left, FULL_RANGE.get(0).right);
-            tree.invalidate(token);
-            tree.get(token).hash("non-empty hash!".getBytes());
+            trees.invalidate(token);
+            trees.get(token).hash("non-empty hash!".getBytes());
         }
 
-        return tree;
+        return trees;
     }
 
     private void interceptRepairMessages(Map<InetAddressAndPort, MerkleTrees> mockTrees,
@@ -806,32 +858,49 @@
     {
         MessagingService.instance().inboundSink.add(message -> message.verb().isResponse());
         MessagingService.instance().outboundSink.add((message, to) -> {
-            if (message == null || !(message.payload instanceof RepairMessage))
+                if (message == null || !(message.payload instanceof RepairMessage))
+                    return false;
+
+                if (message.verb() == PAXOS2_CLEANUP_START_PREPARE_REQ)
+                {
+                    Message<?> messageIn = message.responseWith(Paxos.newBallot(null, ConsistencyLevel.SERIAL));
+                    MessagingService.instance().inboundSink.accept(messageIn);
+                    return false;
+                }
+
+                if (message.verb() == PAXOS2_CLEANUP_REQ)
+                {
+                    PaxosCleanupRequest request = (PaxosCleanupRequest) message.payload;
+                    PaxosCleanupSession.finishSession(to, new PaxosCleanupResponse(request.session, true, null));
+                    return false;
+                }
+
+                if (!(message.payload instanceof RepairMessage))
+                    return false;
+
+                // So different Thread's messages don't overwrite each other.
+                synchronized (MESSAGE_LOCK)
+                {
+                    messageCapture.add(message);
+                }
+
+                switch (message.verb())
+                {
+                    case SNAPSHOT_MSG:
+                        MessagingService.instance().callbacks.removeAndRespond(message.id(), to, message.emptyResponse());
+                        break;
+                    case VALIDATION_REQ:
+                        session.validationComplete(sessionJobDesc, to, mockTrees.get(to));
+                        break;
+                    case SYNC_REQ:
+                        SyncRequest syncRequest = (SyncRequest) message.payload;
+                        session.syncComplete(sessionJobDesc, new SyncNodePair(syncRequest.src, syncRequest.dst),
+                                             true, Collections.emptyList());
+                        break;
+                    default:
+                        break;
+                }
                 return false;
-
-            // So different Thread's messages don't overwrite each other.
-            synchronized (MESSAGE_LOCK)
-            {
-                messageCapture.add(message);
-            }
-
-            switch (message.verb())
-            {
-                case SNAPSHOT_MSG:
-                    MessagingService.instance().callbacks.removeAndRespond(message.id(), to, message.emptyResponse());
-                    break;
-                case VALIDATION_REQ:
-                    session.validationComplete(sessionJobDesc, to, mockTrees.get(to));
-                    break;
-                case SYNC_REQ:
-                    SyncRequest syncRequest = (SyncRequest) message.payload;
-                    session.syncComplete(sessionJobDesc, new SyncNodePair(syncRequest.src, syncRequest.dst),
-                                         true, Collections.emptyList());
-                    break;
-                default:
-                    break;
-            }
-            return false;
         });
     }
 }
diff --git a/test/unit/org/apache/cassandra/repair/RepairSessionTest.java b/test/unit/org/apache/cassandra/repair/RepairSessionTest.java
index 2ad5831..4db6efb 100644
--- a/test/unit/org/apache/cassandra/repair/RepairSessionTest.java
+++ b/test/unit/org/apache/cassandra/repair/RepairSessionTest.java
@@ -38,8 +38,9 @@
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -58,16 +59,15 @@
         Gossiper.instance.initializeNodeUnsafe(remote, UUID.randomUUID(), 1);
 
         // Set up RepairSession
-        UUID parentSessionId = UUIDGen.getTimeUUID();
-        UUID sessionId = UUID.randomUUID();
+        TimeUUID parentSessionId = nextTimeUUID();
         IPartitioner p = Murmur3Partitioner.instance;
         Range<Token> repairRange = new Range<>(p.getToken(ByteBufferUtil.bytes(0)), p.getToken(ByteBufferUtil.bytes(100)));
         Set<InetAddressAndPort> endpoints = Sets.newHashSet(remote);
-        RepairSession session = new RepairSession(parentSessionId, sessionId,
+        RepairSession session = new RepairSession(parentSessionId,
                                                   new CommonRange(endpoints, Collections.emptySet(), Arrays.asList(repairRange)),
                                                   "Keyspace1", RepairParallelism.SEQUENTIAL,
                                                   false, false,
-                                                  PreviewKind.NONE, false, "Standard1");
+                                                  PreviewKind.NONE, false, false, false, "Standard1");
 
         // perform convict
         session.convict(remote, Double.MAX_VALUE);
diff --git a/test/unit/org/apache/cassandra/repair/StreamingRepairTaskTest.java b/test/unit/org/apache/cassandra/repair/StreamingRepairTaskTest.java
index 1057a67..a499138 100644
--- a/test/unit/org/apache/cassandra/repair/StreamingRepairTaskTest.java
+++ b/test/unit/org/apache/cassandra/repair/StreamingRepairTaskTest.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.repair;
 
-import java.util.UUID;
-
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -35,7 +33,9 @@
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.StreamPlan;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class StreamingRepairTaskTest extends AbstractRepairTest
 {
@@ -60,11 +60,11 @@
     }
 
     @Test
-    public void incrementalStreamPlan()
+    public void incrementalStreamPlan() throws NoSuchRepairSessionException
     {
-        UUID sessionID = registerSession(cfs, true, true);
+        TimeUUID sessionID = registerSession(cfs, true, true);
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
-        RepairJobDesc desc = new RepairJobDesc(sessionID, UUIDGen.getTimeUUID(), ks, tbl, prs.getRanges());
+        RepairJobDesc desc = new RepairJobDesc(sessionID, nextTimeUUID(), ks, tbl, prs.getRanges());
 
         SyncRequest request = new SyncRequest(desc, PARTICIPANT1, PARTICIPANT2, PARTICIPANT3, prs.getRanges(), PreviewKind.NONE, false);
         StreamingRepairTask task = new StreamingRepairTask(desc, request.initiator, request.src, request.dst, request.ranges, desc.sessionId, PreviewKind.NONE, false);
@@ -76,9 +76,9 @@
     @Test
     public void fullStreamPlan() throws Exception
     {
-        UUID sessionID = registerSession(cfs, false, true);
+        TimeUUID sessionID = registerSession(cfs, false, true);
         ActiveRepairService.ParentRepairSession prs = ActiveRepairService.instance.getParentRepairSession(sessionID);
-        RepairJobDesc desc = new RepairJobDesc(sessionID, UUIDGen.getTimeUUID(), ks, tbl, prs.getRanges());
+        RepairJobDesc desc = new RepairJobDesc(sessionID, nextTimeUUID(), ks, tbl, prs.getRanges());
         SyncRequest request = new SyncRequest(desc, PARTICIPANT1, PARTICIPANT2, PARTICIPANT3, prs.getRanges(), PreviewKind.NONE, false);
         StreamingRepairTask task = new StreamingRepairTask(desc, request.initiator, request.src, request.dst, request.ranges, null, PreviewKind.NONE, false);
 
diff --git a/test/unit/org/apache/cassandra/repair/SymmetricRemoteSyncTaskTest.java b/test/unit/org/apache/cassandra/repair/SymmetricRemoteSyncTaskTest.java
index cba64ae..710bee6 100644
--- a/test/unit/org/apache/cassandra/repair/SymmetricRemoteSyncTaskTest.java
+++ b/test/unit/org/apache/cassandra/repair/SymmetricRemoteSyncTaskTest.java
@@ -30,12 +30,12 @@
 import org.apache.cassandra.repair.messages.RepairMessage;
 import org.apache.cassandra.repair.messages.SyncRequest;
 import org.apache.cassandra.streaming.PreviewKind;
-import org.apache.cassandra.utils.MerkleTree;
-import org.apache.cassandra.utils.UUIDGen;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class SymmetricRemoteSyncTaskTest extends AbstractRepairTest
 {
-    private static final RepairJobDesc DESC = new RepairJobDesc(UUIDGen.getTimeUUID(), UUIDGen.getTimeUUID(), "ks", "tbl", ALL_RANGES);
+    private static final RepairJobDesc DESC = new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), "ks", "tbl", ALL_RANGES);
     private static final List<Range<Token>> RANGE_LIST = ImmutableList.of(RANGE1);
     private static class InstrumentedSymmetricRemoteSyncTask extends SymmetricRemoteSyncTask
     {
diff --git a/test/unit/org/apache/cassandra/repair/ValidationTaskTest.java b/test/unit/org/apache/cassandra/repair/ValidationTaskTest.java
new file mode 100644
index 0000000..1ea40e9
--- /dev/null
+++ b/test/unit/org/apache/cassandra/repair/ValidationTaskTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.repair;
+
+import org.apache.cassandra.dht.IPartitioner;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.utils.MerkleTrees;
+
+import org.junit.Test;
+
+import java.net.UnknownHostException;
+import java.util.UUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
+public class ValidationTaskTest 
+{
+    @Test
+    public void shouldDeactivateOnFailure() throws UnknownHostException
+    {
+        ValidationTask task = createTask();
+        assertTrue(task.isActive());
+        task.treesReceived(null);
+        assertFalse(task.isActive());
+    }
+
+    @Test
+    public void shouldIgnoreTreesWhenDeactivated() throws Exception
+    {
+        ValidationTask task = createTask();
+        assertTrue(task.isActive());
+        task.abort();
+        assertFalse(task.isActive());
+        task.treesReceived(new MerkleTrees(null));
+        assertNull(task.get());
+    }
+
+    @Test
+    public void shouldReleaseTreesOnAbort() throws Exception
+    {
+        ValidationTask task = createTask();
+        assertTrue(task.isActive());
+
+        IPartitioner partitioner = Murmur3Partitioner.instance;
+        MerkleTrees trees = new MerkleTrees(partitioner);
+        trees.addMerkleTree(128, new Range<>(partitioner.getMinimumToken(), partitioner.getMaximumToken()));
+        task.treesReceived(trees);
+        assertEquals(1, trees.size());
+        
+        // This relies on the fact that MerkleTrees clears its range -> tree map on release.
+        task.abort();
+        assertEquals(0, trees.size());
+    }
+    
+    private ValidationTask createTask() throws UnknownHostException {
+        InetAddressAndPort addressAndPort = InetAddressAndPort.getByName("127.0.0.1");
+        RepairJobDesc desc = new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), UUID.randomUUID().toString(), UUID.randomUUID().toString(), null);
+        return new ValidationTask(desc, addressAndPort, 0, PreviewKind.NONE);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/repair/ValidatorTest.java b/test/unit/org/apache/cassandra/repair/ValidatorTest.java
index cf3411a..86704d3 100644
--- a/test/unit/org/apache/cassandra/repair/ValidatorTest.java
+++ b/test/unit/org/apache/cassandra/repair/ValidatorTest.java
@@ -23,10 +23,10 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.compaction.CompactionsTest;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
@@ -38,6 +38,7 @@
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.repair.state.ValidationState;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.db.BufferDecoratedKey;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -55,10 +56,10 @@
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.MerkleTree;
 import org.apache.cassandra.utils.MerkleTrees;
-import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
-import static org.junit.Assert.assertArrayEquals;
+import static java.util.Collections.singletonList;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -68,7 +69,7 @@
 public class ValidatorTest
 {
     private static final long TEST_TIMEOUT = 60; //seconds
-    private static int testSizeMegabytes;
+    private static int testSizeMebibytes;
 
     private static final String keyspace = "ValidatorTest";
     private static final String columnFamily = "Standard1";
@@ -82,27 +83,27 @@
                                     KeyspaceParams.simple(1),
                                     SchemaLoader.standardCFMD(keyspace, columnFamily));
         partitioner = Schema.instance.getTableMetadata(keyspace, columnFamily).partitioner;
-        testSizeMegabytes = DatabaseDescriptor.getRepairSessionSpaceInMegabytes();
+        testSizeMebibytes = DatabaseDescriptor.getRepairSessionSpaceInMiB();
     }
 
     @After
     public void tearDown()
     {
         MessagingService.instance().outboundSink.clear();
-        DatabaseDescriptor.setRepairSessionSpaceInMegabytes(testSizeMegabytes);
+        DatabaseDescriptor.setRepairSessionSpaceInMiB(testSizeMebibytes);
     }
 
     @Before
     public void setup()
     {
-        DatabaseDescriptor.setRepairSessionSpaceInMegabytes(testSizeMegabytes);
+        DatabaseDescriptor.setRepairSessionSpaceInMiB(testSizeMebibytes);
     }
 
     @Test
     public void testValidatorComplete() throws Throwable
     {
         Range<Token> range = new Range<>(partitioner.getMinimumToken(), partitioner.getRandomToken());
-        final RepairJobDesc desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), keyspace, columnFamily, Arrays.asList(range));
+        final RepairJobDesc desc = new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), keyspace, columnFamily, Arrays.asList(range));
 
         final CompletableFuture<Message> outgoingMessageSink = registerOutgoingMessageSink();
 
@@ -110,22 +111,23 @@
 
         ColumnFamilyStore cfs = Keyspace.open(keyspace).getColumnFamilyStore(columnFamily);
 
-        Validator validator = new Validator(desc, remote, 0, PreviewKind.NONE);
-        MerkleTrees tree = new MerkleTrees(partitioner);
-        tree.addMerkleTrees((int) Math.pow(2, 15), validator.desc.ranges);
-        validator.prepare(cfs, tree);
+        Validator validator = new Validator(new ValidationState(desc, remote), 0, PreviewKind.NONE);
+        validator.state.phase.start(10, 10);
+        MerkleTrees trees = new MerkleTrees(partitioner);
+        trees.addMerkleTrees((int) Math.pow(2, 15), validator.desc.ranges);
+        validator.prepare(cfs, trees, null);
 
-        // and confirm that the tree was split
-        assertTrue(tree.size() > 1);
+        // and confirm that the trees were split
+        assertTrue(trees.size() > 1);
 
         // add a row
         Token mid = partitioner.midpoint(range.left, range.right);
         validator.add(EmptyIterators.unfilteredRow(cfs.metadata(), new BufferDecoratedKey(mid, ByteBufferUtil.bytes("inconceivable!")), false));
         validator.complete();
 
-        // confirm that the tree was validated
-        Token min = tree.partitioner().getMinimumToken();
-        assertNotNull(tree.hash(new Range<>(min, min)));
+        // confirm that the trees were validated
+        Token min = trees.partitioner().getMinimumToken();
+        assertNotNull(trees.hash(new Range<>(min, min)));
 
         Message message = outgoingMessageSink.get(TEST_TIMEOUT, TimeUnit.SECONDS);
         assertEquals(Verb.VALIDATION_RSP, message.verb());
@@ -140,14 +142,14 @@
     public void testValidatorFailed() throws Throwable
     {
         Range<Token> range = new Range<>(partitioner.getMinimumToken(), partitioner.getRandomToken());
-        final RepairJobDesc desc = new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), keyspace, columnFamily, Arrays.asList(range));
+        final RepairJobDesc desc = new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), keyspace, columnFamily, Arrays.asList(range));
 
         final CompletableFuture<Message> outgoingMessageSink = registerOutgoingMessageSink();
 
         InetAddressAndPort remote = InetAddressAndPort.getByName("127.0.0.2");
 
-        Validator validator = new Validator(desc, remote, 0, PreviewKind.NONE);
-        validator.fail();
+        Validator validator = new Validator(new ValidationState(desc, remote), 0, PreviewKind.NONE);
+        validator.fail(new Throwable());
 
         Message message = outgoingMessageSink.get(TEST_TIMEOUT, TimeUnit.SECONDS);
         assertEquals(Verb.VALIDATION_RSP, message.verb());
@@ -186,16 +188,16 @@
 
         CompactionsTest.populate(keyspace, columnFamily, 0, n, 0); //ttl=3s
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(1, cfs.getLiveSSTables().size());
 
         // wait enough to force single compaction
         TimeUnit.SECONDS.sleep(5);
 
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
-        UUID repairSessionId = UUIDGen.getTimeUUID();
-        final RepairJobDesc desc = new RepairJobDesc(repairSessionId, UUIDGen.getTimeUUID(), cfs.keyspace.getName(),
-                                                     cfs.getTableName(), Collections.singletonList(new Range<>(sstable.first.getToken(),
+        TimeUUID repairSessionId = nextTimeUUID();
+        final RepairJobDesc desc = new RepairJobDesc(repairSessionId, nextTimeUUID(), cfs.keyspace.getName(),
+                                                     cfs.getTableName(), singletonList(new Range<>(sstable.first.getToken(),
                                                                                                                sstable.last.getToken())));
 
         InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.2");
@@ -205,7 +207,7 @@
                                                                  false, PreviewKind.NONE);
 
         final CompletableFuture<Message> outgoingMessageSink = registerOutgoingMessageSink();
-        Validator validator = new Validator(desc, host, 0, true, false, PreviewKind.NONE);
+        Validator validator = new Validator(new ValidationState(desc, host), 0, true, false, PreviewKind.NONE);
         ValidationManager.instance.submitValidation(cfs, validator);
 
         Message message = outgoingMessageSink.get(TEST_TIMEOUT, TimeUnit.SECONDS);
@@ -235,7 +237,7 @@
         ColumnFamilyStore cfs = ks.getColumnFamilyStore(columnFamily);
         cfs.clearUnsafe();
 
-        DatabaseDescriptor.setRepairSessionSpaceInMegabytes(1);
+        DatabaseDescriptor.setRepairSessionSpaceInMiB(1);
 
         // disable compaction while flushing
         cfs.disableAutoCompaction();
@@ -243,16 +245,16 @@
         // 2 ** 14 rows would normally use 2^14 leaves, but with only 1 meg we should only use 2^12
         CompactionsTest.populate(keyspace, columnFamily, 0, 1 << 14, 0);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(1, cfs.getLiveSSTables().size());
 
         // wait enough to force single compaction
         TimeUnit.SECONDS.sleep(5);
 
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
-        UUID repairSessionId = UUIDGen.getTimeUUID();
-        final RepairJobDesc desc = new RepairJobDesc(repairSessionId, UUIDGen.getTimeUUID(), cfs.keyspace.getName(),
-                                                     cfs.getTableName(), Collections.singletonList(new Range<>(sstable.first.getToken(),
+        TimeUUID repairSessionId = nextTimeUUID();
+        final RepairJobDesc desc = new RepairJobDesc(repairSessionId, nextTimeUUID(), cfs.keyspace.getName(),
+                                                     cfs.getTableName(), singletonList(new Range<>(sstable.first.getToken(),
                                                                                                                sstable.last.getToken())));
 
         InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.2");
@@ -262,7 +264,7 @@
                                                                  false, PreviewKind.NONE);
 
         final CompletableFuture<Message> outgoingMessageSink = registerOutgoingMessageSink();
-        Validator validator = new Validator(desc, host, 0, true, false, PreviewKind.NONE);
+        Validator validator = new Validator(new ValidationState(desc, host), 0, true, false, PreviewKind.NONE);
         ValidationManager.instance.submitValidation(cfs, validator);
 
         Message message = outgoingMessageSink.get(TEST_TIMEOUT, TimeUnit.SECONDS);
@@ -294,7 +296,7 @@
         ColumnFamilyStore cfs = ks.getColumnFamilyStore(columnFamily);
         cfs.clearUnsafe();
 
-        DatabaseDescriptor.setRepairSessionSpaceInMegabytes(1);
+        DatabaseDescriptor.setRepairSessionSpaceInMiB(1);
 
         // disable compaction while flushing
         cfs.disableAutoCompaction();
@@ -302,19 +304,19 @@
         // 2 ** 14 rows would normally use 2^14 leaves, but with only 1 meg we should only use 2^12
         CompactionsTest.populate(keyspace, columnFamily, 0, 1 << 14, 0);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertEquals(1, cfs.getLiveSSTables().size());
 
         // wait enough to force single compaction
         TimeUnit.SECONDS.sleep(5);
 
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
-        UUID repairSessionId = UUIDGen.getTimeUUID();
+        TimeUUID repairSessionId = nextTimeUUID();
 
         List<Range<Token>> ranges = splitHelper(new Range<>(sstable.first.getToken(), sstable.last.getToken()), 2);
 
 
-        final RepairJobDesc desc = new RepairJobDesc(repairSessionId, UUIDGen.getTimeUUID(), cfs.keyspace.getName(),
+        final RepairJobDesc desc = new RepairJobDesc(repairSessionId, nextTimeUUID(), cfs.keyspace.getName(),
                                                      cfs.getTableName(), ranges);
 
         InetAddressAndPort host = InetAddressAndPort.getByName("127.0.0.2");
@@ -324,13 +326,13 @@
                                                                  false, PreviewKind.NONE);
 
         final CompletableFuture<Message> outgoingMessageSink = registerOutgoingMessageSink();
-        Validator validator = new Validator(desc, host, 0, true, false, PreviewKind.NONE);
+        Validator validator = new Validator(new ValidationState(desc, host), 0, true, false, PreviewKind.NONE);
         ValidationManager.instance.submitValidation(cfs, validator);
 
         Message message = outgoingMessageSink.get(TEST_TIMEOUT, TimeUnit.SECONDS);
         MerkleTrees trees = ((ValidationResponse) message.payload).trees;
 
-        // Should have 4 trees each with a depth of on average 10 (since each range should have gotten 0.25 megabytes)
+        // Should have 4 trees each with a depth of on average 10 (since each range should have gotten 0.25 mebibytes)
         Iterator<Map.Entry<Range<Token>, MerkleTree>> iterator = trees.iterator();
         int numTrees = 0;
         double totalResolution = 0;
@@ -349,7 +351,7 @@
         assertEquals(trees.rowCount(), 1 << 14);
         assertEquals(4, numTrees);
 
-        // With a single tree and a megabyte we should had a total resolution of 2^12 leaves; with multiple
+        // With a single tree and a mebibyte we should had a total resolution of 2^12 leaves; with multiple
         // ranges we should get similar overall resolution, but not more.
         assertTrue(totalResolution > (1 << 11) && totalResolution < (1 << 13));
     }
diff --git a/test/unit/org/apache/cassandra/repair/asymmetric/DifferenceHolderTest.java b/test/unit/org/apache/cassandra/repair/asymmetric/DifferenceHolderTest.java
index 8ec0177..cab28e9 100644
--- a/test/unit/org/apache/cassandra/repair/asymmetric/DifferenceHolderTest.java
+++ b/test/unit/org/apache/cassandra/repair/asymmetric/DifferenceHolderTest.java
@@ -36,7 +36,7 @@
 import org.apache.cassandra.utils.MerkleTrees;
 import org.apache.cassandra.utils.MerkleTreesTest;
 
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 public class DifferenceHolderTest
@@ -54,13 +54,13 @@
         InetAddressAndPort a1 = InetAddressAndPort.getByName("127.0.0.1");
         InetAddressAndPort a2 = InetAddressAndPort.getByName("127.0.0.2");
 
-        MerkleTrees mt1 = new MerkleTrees(Murmur3Partitioner.instance);
-        MerkleTrees mt2 = new MerkleTrees(Murmur3Partitioner.instance);
-        mt1.init();
-        mt2.init();
+        MerkleTrees mts1 = new MerkleTrees(Murmur3Partitioner.instance);
+        MerkleTrees mts2 = new MerkleTrees(Murmur3Partitioner.instance);
+        mts1.init();
+        mts2.init();
 
-        TreeResponse tr1 = new TreeResponse(a1, mt1);
-        TreeResponse tr2 = new TreeResponse(a2, mt2);
+        TreeResponse tr1 = new TreeResponse(a1, mts1);
+        TreeResponse tr2 = new TreeResponse(a2, mts2);
 
         DifferenceHolder dh = new DifferenceHolder(Lists.newArrayList(tr1, tr2));
         assertTrue(dh.get(a1).get(a2).isEmpty());
@@ -75,35 +75,35 @@
         InetAddressAndPort a1 = InetAddressAndPort.getByName("127.0.0.1");
         InetAddressAndPort a2 = InetAddressAndPort.getByName("127.0.0.2");
         // merkle tree building stolen from MerkleTreesTest:
-        MerkleTrees mt1 = new MerkleTrees(partitioner);
-        MerkleTrees mt2 = new MerkleTrees(partitioner);
-        mt1.addMerkleTree(32, fullRange);
-        mt2.addMerkleTree(32, fullRange);
-        mt1.init();
-        mt2.init();
+        MerkleTrees mts1 = new MerkleTrees(partitioner);
+        MerkleTrees mts2 = new MerkleTrees(partitioner);
+        mts1.addMerkleTree(32, fullRange);
+        mts2.addMerkleTree(32, fullRange);
+        mts1.init();
+        mts2.init();
         // add dummy hashes to both trees
-        for (MerkleTree.TreeRange range : mt1.rangeIterator())
+        for (MerkleTree.TreeRange range : mts1.rangeIterator())
             range.addAll(new MerkleTreesTest.HIterator(range.right));
-        for (MerkleTree.TreeRange range : mt2.rangeIterator())
+        for (MerkleTree.TreeRange range : mts2.rangeIterator())
             range.addAll(new MerkleTreesTest.HIterator(range.right));
 
         MerkleTree.TreeRange leftmost = null;
         MerkleTree.TreeRange middle = null;
 
-        mt1.maxsize(fullRange, maxsize + 2); // give some room for splitting
+        mts1.maxsize(fullRange, maxsize + 2); // give some room for splitting
 
         // split the leftmost
-        Iterator<MerkleTree.TreeRange> ranges = mt1.rangeIterator();
+        Iterator<MerkleTree.TreeRange> ranges = mts1.rangeIterator();
         leftmost = ranges.next();
-        mt1.split(leftmost.right);
+        mts1.split(leftmost.right);
 
         // set the hashes for the leaf of the created split
-        middle = mt1.get(leftmost.right);
+        middle = mts1.get(leftmost.right);
         middle.hash(digest("arbitrary!"));
-        mt1.get(partitioner.midpoint(leftmost.left, leftmost.right)).hash(digest("even more arbitrary!"));
+        mts1.get(partitioner.midpoint(leftmost.left, leftmost.right)).hash(digest("even more arbitrary!"));
 
-        TreeResponse tr1 = new TreeResponse(a1, mt1);
-        TreeResponse tr2 = new TreeResponse(a2, mt2);
+        TreeResponse tr1 = new TreeResponse(a1, mts1);
+        TreeResponse tr2 = new TreeResponse(a2, mts2);
 
         DifferenceHolder dh = new DifferenceHolder(Lists.newArrayList(tr1, tr2));
         assertTrue(dh.get(a1).get(a2).size() == 1);
diff --git a/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java b/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java
index a4327ca..04d7cc4 100644
--- a/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java
+++ b/test/unit/org/apache/cassandra/repair/asymmetric/RangeMapTest.java
@@ -31,7 +31,7 @@
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 
-import static junit.framework.TestCase.assertEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git a/test/unit/org/apache/cassandra/repair/asymmetric/ReduceHelperTest.java b/test/unit/org/apache/cassandra/repair/asymmetric/ReduceHelperTest.java
index be5a553..f2ee14f 100644
--- a/test/unit/org/apache/cassandra/repair/asymmetric/ReduceHelperTest.java
+++ b/test/unit/org/apache/cassandra/repair/asymmetric/ReduceHelperTest.java
@@ -44,9 +44,9 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.InetAddressAndPort;
 
-import static junit.framework.TestCase.fail;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class ReduceHelperTest
 {
diff --git a/test/unit/org/apache/cassandra/repair/asymmetric/StreamFromOptionsTest.java b/test/unit/org/apache/cassandra/repair/asymmetric/StreamFromOptionsTest.java
index e2a7700..d13937e 100644
--- a/test/unit/org/apache/cassandra/repair/asymmetric/StreamFromOptionsTest.java
+++ b/test/unit/org/apache/cassandra/repair/asymmetric/StreamFromOptionsTest.java
@@ -31,7 +31,7 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.InetAddressAndPort;
 
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git a/test/unit/org/apache/cassandra/repair/consistent/AbstractConsistentSessionTest.java b/test/unit/org/apache/cassandra/repair/consistent/AbstractConsistentSessionTest.java
index 4570328..b7d49fc 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/AbstractConsistentSessionTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/AbstractConsistentSessionTest.java
@@ -20,7 +20,6 @@
 
 import java.net.UnknownHostException;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
@@ -36,7 +35,9 @@
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.ByteBufferUtil;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 @Ignore
 public abstract class AbstractConsistentSessionTest
@@ -76,9 +77,9 @@
     protected static final Range<Token> RANGE3 = new Range<>(t(4), t(5));
 
 
-    protected static UUID registerSession(ColumnFamilyStore cfs)
+    protected static TimeUUID registerSession(ColumnFamilyStore cfs)
     {
-        UUID sessionId = UUIDGen.getTimeUUID();
+        TimeUUID sessionId = nextTimeUUID();
 
         ActiveRepairService.instance.registerParentRepairSession(sessionId,
                                                                  COORDINATOR,
diff --git a/test/unit/org/apache/cassandra/repair/consistent/CoordinatorMessagingTest.java b/test/unit/org/apache/cassandra/repair/consistent/CoordinatorMessagingTest.java
index 420cd54..0f457b6 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/CoordinatorMessagingTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/CoordinatorMessagingTest.java
@@ -20,8 +20,6 @@
 
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -31,8 +29,12 @@
 import java.util.function.Supplier;
 
 import com.google.common.collect.Lists;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
+
+import org.apache.cassandra.repair.CoordinatedRepairResult;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.Promise;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -48,6 +50,7 @@
 import org.apache.cassandra.net.MockMessagingSpy;
 import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.repair.AbstractRepairTest;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
 import org.apache.cassandra.repair.RepairSessionResult;
 import org.apache.cassandra.repair.messages.FinalizePromise;
 import org.apache.cassandra.repair.messages.FinalizePropose;
@@ -61,6 +64,7 @@
 import static org.apache.cassandra.net.MockMessagingService.all;
 import static org.apache.cassandra.net.MockMessagingService.to;
 import static org.apache.cassandra.net.MockMessagingService.verb;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.fail;
 
 public class CoordinatorMessagingTest extends AbstractRepairTest
@@ -92,7 +96,7 @@
     }
 
     @Test
-    public void testMockedMessagingHappyPath() throws InterruptedException, ExecutionException, TimeoutException
+    public void testMockedMessagingHappyPath() throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         CountDownLatch prepareLatch = createLatch();
         CountDownLatch finalizeLatch = createLatch();
@@ -101,32 +105,30 @@
         MockMessagingSpy spyFinalize = createFinalizeSpy(Collections.emptySet(), Collections.emptySet(), finalizeLatch);
         MockMessagingSpy spyCommit = createCommitSpy();
 
-        UUID uuid = registerSession(cfs, true, true);
+        TimeUUID uuid = registerSession(cfs, true, true);
         CoordinatorSession coordinator = ActiveRepairService.instance.consistent.coordinated.registerSession(uuid, PARTICIPANTS, false);
         AtomicBoolean repairSubmitted = new AtomicBoolean(false);
-        SettableFuture<List<RepairSessionResult>> repairFuture = SettableFuture.create();
-        Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSupplier = () ->
+        Promise<CoordinatedRepairResult> repairFuture = AsyncPromise.uncancellable();
+        Supplier<Future<CoordinatedRepairResult>> sessionSupplier = () ->
         {
             repairSubmitted.set(true);
             return repairFuture;
         };
 
         // coordinator sends prepare requests to create local session and perform anticompaction
-        AtomicBoolean hasFailures = new AtomicBoolean(false);
         Assert.assertFalse(repairSubmitted.get());
 
         // execute repair and start prepare phase
-        ListenableFuture<Boolean> sessionResult = coordinator.execute(sessionSupplier, hasFailures);
+        Future<CoordinatedRepairResult> sessionResult = coordinator.execute(sessionSupplier);
         Assert.assertFalse(sessionResult.isDone());
-        Assert.assertFalse(hasFailures.get());
+
         // prepare completed
         prepareLatch.countDown();
         spyPrepare.interceptMessageOut(3).get(1, TimeUnit.SECONDS);
         Assert.assertFalse(sessionResult.isDone());
-        Assert.assertFalse(hasFailures.get());
 
         // set result from local repair session
-        repairFuture.set(Lists.newArrayList(createResult(coordinator), createResult(coordinator), createResult(coordinator)));
+        repairFuture.trySuccess(CoordinatedRepairResult.success(Lists.newArrayList(createResult(coordinator), createResult(coordinator), createResult(coordinator))));
 
         // finalize phase
         finalizeLatch.countDown();
@@ -134,8 +136,7 @@
 
         // commit phase
         spyCommit.interceptMessageOut(3).get(1, TimeUnit.SECONDS);
-        Assert.assertTrue(sessionResult.get());
-        Assert.assertFalse(hasFailures.get());
+        Assert.assertFalse(sessionResult.get().hasFailed());
 
         // expect no other messages except from intercepted so far
         spyPrepare.interceptNoMsg(100, TimeUnit.MILLISECONDS);
@@ -148,7 +149,7 @@
 
 
     @Test
-    public void testMockedMessagingPrepareFailureP1() throws InterruptedException, ExecutionException, TimeoutException
+    public void testMockedMessagingPrepareFailureP1() throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         CountDownLatch latch = createLatch();
         createPrepareSpy(Collections.singleton(PARTICIPANT1), Collections.emptySet(), latch);
@@ -156,7 +157,7 @@
     }
 
     @Test
-    public void testMockedMessagingPrepareFailureP12() throws InterruptedException, ExecutionException, TimeoutException
+    public void testMockedMessagingPrepareFailureP12() throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         CountDownLatch latch = createLatch();
         createPrepareSpy(Lists.newArrayList(PARTICIPANT1, PARTICIPANT2), Collections.emptySet(), latch);
@@ -164,7 +165,7 @@
     }
 
     @Test
-    public void testMockedMessagingPrepareFailureP3() throws InterruptedException, ExecutionException, TimeoutException
+    public void testMockedMessagingPrepareFailureP3() throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         CountDownLatch latch = createLatch();
         createPrepareSpy(Collections.singleton(PARTICIPANT3), Collections.emptySet(), latch);
@@ -172,7 +173,7 @@
     }
 
     @Test
-    public void testMockedMessagingPrepareFailureP123() throws InterruptedException, ExecutionException, TimeoutException
+    public void testMockedMessagingPrepareFailureP123() throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         CountDownLatch latch = createLatch();
         createPrepareSpy(Lists.newArrayList(PARTICIPANT1, PARTICIPANT2, PARTICIPANT3), Collections.emptySet(), latch);
@@ -180,34 +181,33 @@
     }
 
     @Test(expected = TimeoutException.class)
-    public void testMockedMessagingPrepareFailureWrongSessionId() throws InterruptedException, ExecutionException, TimeoutException
+    public void testMockedMessagingPrepareFailureWrongSessionId() throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         CountDownLatch latch = createLatch();
-        createPrepareSpy(Collections.singleton(PARTICIPANT1), Collections.emptySet(), (msgOut) -> UUID.randomUUID(), latch);
+        createPrepareSpy(Collections.singleton(PARTICIPANT1), Collections.emptySet(), (msgOut) -> nextTimeUUID(), latch);
         testMockedMessagingPrepareFailure(latch);
     }
 
-    private void testMockedMessagingPrepareFailure(CountDownLatch prepareLatch) throws InterruptedException, ExecutionException, TimeoutException
+    private void testMockedMessagingPrepareFailure(CountDownLatch prepareLatch) throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         // we expect FailSession messages to all participants
         MockMessagingSpy sendFailSessionExpectedSpy = createFailSessionSpy(Lists.newArrayList(PARTICIPANT1, PARTICIPANT2, PARTICIPANT3));
 
-        UUID uuid = registerSession(cfs, true, true);
+        TimeUUID uuid = registerSession(cfs, true, true);
         CoordinatorSession coordinator = ActiveRepairService.instance.consistent.coordinated.registerSession(uuid, PARTICIPANTS, false);
         AtomicBoolean repairSubmitted = new AtomicBoolean(false);
-        SettableFuture<List<RepairSessionResult>> repairFuture = SettableFuture.create();
-        Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSupplier = () ->
+        Promise<CoordinatedRepairResult> repairFuture = AsyncPromise.uncancellable();
+        Supplier<Future<CoordinatedRepairResult>> sessionSupplier = () ->
         {
             repairSubmitted.set(true);
             return repairFuture;
         };
 
         // coordinator sends prepare requests to create local session and perform anticompaction
-        AtomicBoolean proposeFailed = new AtomicBoolean(false);
         Assert.assertFalse(repairSubmitted.get());
 
         // execute repair and start prepare phase
-        ListenableFuture<Boolean> sessionResult = coordinator.execute(sessionSupplier, proposeFailed);
+        Future<CoordinatedRepairResult> sessionResult = coordinator.execute(sessionSupplier);
         prepareLatch.countDown();
         // prepare completed
         try
@@ -220,33 +220,33 @@
         }
         sendFailSessionExpectedSpy.interceptMessageOut(3).get(1, TimeUnit.SECONDS);
         Assert.assertFalse(repairSubmitted.get());
-        Assert.assertTrue(proposeFailed.get());
+        Assert.assertTrue(sessionResult.isDone());
+        Assert.assertNotNull(sessionResult.cause());
         Assert.assertEquals(ConsistentSession.State.FAILED, coordinator.getState());
         Assert.assertFalse(ActiveRepairService.instance.consistent.local.isSessionInProgress(uuid));
     }
 
     @Test
-    public void testMockedMessagingPrepareTimeout() throws InterruptedException, ExecutionException, TimeoutException
+    public void testMockedMessagingPrepareTimeout() throws InterruptedException, ExecutionException, TimeoutException, NoSuchRepairSessionException
     {
         MockMessagingSpy spyPrepare = createPrepareSpy(Collections.emptySet(), Collections.singleton(PARTICIPANT3), new CountDownLatch(0));
         MockMessagingSpy sendFailSessionUnexpectedSpy = createFailSessionSpy(Lists.newArrayList(PARTICIPANT1, PARTICIPANT2, PARTICIPANT3));
 
-        UUID uuid = registerSession(cfs, true, true);
+        TimeUUID uuid = registerSession(cfs, true, true);
         CoordinatorSession coordinator = ActiveRepairService.instance.consistent.coordinated.registerSession(uuid, PARTICIPANTS, false);
         AtomicBoolean repairSubmitted = new AtomicBoolean(false);
-        SettableFuture<List<RepairSessionResult>> repairFuture = SettableFuture.create();
-        Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSupplier = () ->
+        Promise<CoordinatedRepairResult> repairFuture = AsyncPromise.uncancellable();
+        Supplier<Future<CoordinatedRepairResult>> sessionSupplier = () ->
         {
             repairSubmitted.set(true);
             return repairFuture;
         };
 
         // coordinator sends prepare requests to create local session and perform anticompaction
-        AtomicBoolean hasFailures = new AtomicBoolean(false);
         Assert.assertFalse(repairSubmitted.get());
 
         // execute repair and start prepare phase
-        ListenableFuture<Boolean> sessionResult = coordinator.execute(sessionSupplier, hasFailures);
+        Future<CoordinatedRepairResult> sessionResult = coordinator.execute(sessionSupplier);
         try
         {
             sessionResult.get(1, TimeUnit.SECONDS);
@@ -264,7 +264,6 @@
         spyPrepare.expectMockedMessage(2).get(100, TimeUnit.MILLISECONDS);
         sendFailSessionUnexpectedSpy.interceptNoMsg(100, TimeUnit.MILLISECONDS);
         Assert.assertFalse(repairSubmitted.get());
-        Assert.assertFalse(hasFailures.get());
         Assert.assertEquals(ConsistentSession.State.PREPARING, coordinator.getState());
         Assert.assertFalse(ActiveRepairService.instance.consistent.local.isSessionInProgress(uuid));
     }
@@ -278,7 +277,7 @@
 
     private MockMessagingSpy createPrepareSpy(Collection<InetAddressAndPort> failed,
                                               Collection<InetAddressAndPort> timeout,
-                                              Function<PrepareConsistentRequest, UUID> sessionIdFunc,
+                                              Function<PrepareConsistentRequest, TimeUUID> sessionIdFunc,
                                               CountDownLatch latch)
     {
         return MockMessagingService.when(verb(Verb.PREPARE_CONSISTENT_REQ)).respond((msgOut, to) ->
diff --git a/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionTest.java b/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionTest.java
index 1cee312..85574c7 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionTest.java
@@ -19,33 +19,44 @@
 package org.apache.cassandra.repair.consistent;
 
 import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.UUID;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.Supplier;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
-
 import org.junit.Assert;
 import org.junit.Test;
 
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.repair.AbstractRepairTest;
+import org.apache.cassandra.repair.CoordinatedRepairResult;
 import org.apache.cassandra.repair.RepairSessionResult;
 import org.apache.cassandra.repair.messages.FailSession;
 import org.apache.cassandra.repair.messages.FinalizeCommit;
 import org.apache.cassandra.repair.messages.FinalizePropose;
 import org.apache.cassandra.repair.messages.PrepareConsistentRequest;
 import org.apache.cassandra.repair.messages.RepairMessage;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.Promise;
 
-import static org.apache.cassandra.repair.consistent.ConsistentSession.State.*;
+import static org.apache.cassandra.repair.consistent.ConsistentSession.State.FAILED;
+import static org.apache.cassandra.repair.consistent.ConsistentSession.State.FINALIZE_PROMISED;
+import static org.apache.cassandra.repair.consistent.ConsistentSession.State.PREPARED;
+import static org.apache.cassandra.repair.consistent.ConsistentSession.State.PREPARING;
+import static org.apache.cassandra.repair.consistent.ConsistentSession.State.REPAIRING;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class CoordinatorSessionTest extends AbstractRepairTest
 {
@@ -54,9 +65,9 @@
     {
         CoordinatorSession.Builder builder = CoordinatorSession.builder();
         builder.withState(PREPARING);
-        builder.withSessionID(UUIDGen.getTimeUUID());
+        builder.withSessionID(nextTimeUUID());
         builder.withCoordinator(COORDINATOR);
-        builder.withUUIDTableIds(Sets.newHashSet(UUIDGen.getTimeUUID(), UUIDGen.getTimeUUID()));
+        builder.withUUIDTableIds(Sets.newHashSet(UUID.randomUUID(), UUID.randomUUID()));
         builder.withRepairedAt(System.currentTimeMillis());
         builder.withRanges(Sets.newHashSet(RANGE1, RANGE2, RANGE3));
         builder.withParticipants(Sets.newHashSet(PARTICIPANT1, PARTICIPANT2, PARTICIPANT3));
@@ -209,18 +220,17 @@
     {
         InstrumentedCoordinatorSession coordinator = createInstrumentedSession();
         AtomicBoolean repairSubmitted = new AtomicBoolean(false);
-        SettableFuture<List<RepairSessionResult>> repairFuture = SettableFuture.create();
-        Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSupplier = () ->
+        Promise<CoordinatedRepairResult> repairFuture = AsyncPromise.uncancellable();
+        Supplier<Future<CoordinatedRepairResult>> sessionSupplier = () ->
         {
             repairSubmitted.set(true);
             return repairFuture;
         };
 
         // coordinator sends prepare requests to create local session and perform anticompaction
-        AtomicBoolean hasFailures = new AtomicBoolean(false);
         Assert.assertFalse(repairSubmitted.get());
         Assert.assertTrue(coordinator.sentMessages.isEmpty());
-        ListenableFuture sessionResult = coordinator.execute(sessionSupplier, hasFailures);
+        Future<CoordinatedRepairResult> sessionResult = coordinator.execute(sessionSupplier);
 
         for (InetAddressAndPort participant : PARTICIPANTS)
         {
@@ -252,7 +262,7 @@
                                                                     createResult(coordinator));
 
         coordinator.sentMessages.clear();
-        repairFuture.set(results);
+        repairFuture.trySuccess(CoordinatedRepairResult.success(results));
 
         // propose messages should have been sent once all repair sessions completed successfully
         for (InetAddressAndPort participant : PARTICIPANTS)
@@ -285,7 +295,7 @@
         }
 
         Assert.assertTrue(sessionResult.isDone());
-        Assert.assertFalse(hasFailures.get());
+        sessionResult.syncUninterruptibly();
     }
 
     @Test
@@ -293,18 +303,17 @@
     {
         InstrumentedCoordinatorSession coordinator = createInstrumentedSession();
         AtomicBoolean repairSubmitted = new AtomicBoolean(false);
-        SettableFuture<List<RepairSessionResult>> repairFuture = SettableFuture.create();
-        Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSupplier = () ->
+        Promise<CoordinatedRepairResult> repairFuture = AsyncPromise.uncancellable();
+        Supplier<Future<CoordinatedRepairResult>> sessionSupplier = () ->
         {
             repairSubmitted.set(true);
             return repairFuture;
         };
 
         // coordinator sends prepare requests to create local session and perform anticompaction
-        AtomicBoolean hasFailures = new AtomicBoolean(false);
         Assert.assertFalse(repairSubmitted.get());
         Assert.assertTrue(coordinator.sentMessages.isEmpty());
-        ListenableFuture sessionResult = coordinator.execute(sessionSupplier, hasFailures);
+        Future<CoordinatedRepairResult> sessionResult = coordinator.execute(sessionSupplier);
         for (InetAddressAndPort participant : PARTICIPANTS)
         {
             PrepareConsistentRequest expected = new PrepareConsistentRequest(coordinator.sessionID, COORDINATOR, new HashSet<>(PARTICIPANTS));
@@ -329,6 +338,7 @@
 
         Assert.assertEquals(ConsistentSession.State.REPAIRING, coordinator.getState());
 
+        List<Collection<Range<Token>>> ranges = Arrays.asList(coordinator.ranges, coordinator.ranges, coordinator.ranges);
         ArrayList<RepairSessionResult> results = Lists.newArrayList(createResult(coordinator),
                                                                     null,
                                                                     createResult(coordinator));
@@ -336,7 +346,7 @@
         coordinator.sentMessages.clear();
         Assert.assertFalse(coordinator.failCalled);
         coordinator.onFail = () -> Assert.assertEquals(REPAIRING, coordinator.getState());
-        repairFuture.set(results);
+        repairFuture.trySuccess(CoordinatedRepairResult.create(ranges, results));
         Assert.assertTrue(coordinator.failCalled);
 
         // all participants should have been notified of session failure
@@ -347,7 +357,7 @@
         }
 
         Assert.assertTrue(sessionResult.isDone());
-        Assert.assertTrue(hasFailures.get());
+        Assert.assertNotNull(sessionResult.cause());
     }
 
     @Test
@@ -355,18 +365,17 @@
     {
         InstrumentedCoordinatorSession coordinator = createInstrumentedSession();
         AtomicBoolean repairSubmitted = new AtomicBoolean(false);
-        SettableFuture<List<RepairSessionResult>> repairFuture = SettableFuture.create();
-        Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSupplier = () ->
+        Promise<CoordinatedRepairResult> repairFuture = AsyncPromise.uncancellable();
+        Supplier<Future<CoordinatedRepairResult>> sessionSupplier = () ->
         {
             repairSubmitted.set(true);
             return repairFuture;
         };
 
         // coordinator sends prepare requests to create local session and perform anticompaction
-        AtomicBoolean hasFailures = new AtomicBoolean(false);
         Assert.assertFalse(repairSubmitted.get());
         Assert.assertTrue(coordinator.sentMessages.isEmpty());
-        ListenableFuture sessionResult = coordinator.execute(sessionSupplier, hasFailures);
+        Future<CoordinatedRepairResult> sessionResult = coordinator.execute(sessionSupplier);
         for (InetAddressAndPort participant : PARTICIPANTS)
         {
             PrepareConsistentRequest expected = new PrepareConsistentRequest(coordinator.sessionID, COORDINATOR, new HashSet<>(PARTICIPANTS));
@@ -413,7 +422,7 @@
         Assert.assertFalse(coordinator.sentMessages.containsKey(PARTICIPANT2));
 
         Assert.assertTrue(sessionResult.isDone());
-        Assert.assertTrue(hasFailures.get());
+        Assert.assertNotNull(sessionResult.cause());
     }
 
     @Test
@@ -421,18 +430,17 @@
     {
         InstrumentedCoordinatorSession coordinator = createInstrumentedSession();
         AtomicBoolean repairSubmitted = new AtomicBoolean(false);
-        SettableFuture<List<RepairSessionResult>> repairFuture = SettableFuture.create();
-        Supplier<ListenableFuture<List<RepairSessionResult>>> sessionSupplier = () ->
+        Promise<CoordinatedRepairResult> repairFuture = AsyncPromise.uncancellable();
+        Supplier<Future<CoordinatedRepairResult>> sessionSupplier = () ->
         {
             repairSubmitted.set(true);
             return repairFuture;
         };
 
         // coordinator sends prepare requests to create local session and perform anticompaction
-        AtomicBoolean hasFailures = new AtomicBoolean(false);
         Assert.assertFalse(repairSubmitted.get());
         Assert.assertTrue(coordinator.sentMessages.isEmpty());
-        ListenableFuture sessionResult = coordinator.execute(sessionSupplier, hasFailures);
+        Future<CoordinatedRepairResult> sessionResult = coordinator.execute(sessionSupplier);
 
         for (InetAddressAndPort participant : PARTICIPANTS)
         {
@@ -464,7 +472,7 @@
                                                                     createResult(coordinator));
 
         coordinator.sentMessages.clear();
-        repairFuture.set(results);
+        repairFuture.trySuccess(CoordinatedRepairResult.success(results));
 
         // propose messages should have been sent once all repair sessions completed successfully
         for (InetAddressAndPort participant : PARTICIPANTS)
@@ -500,6 +508,6 @@
         }
 
         Assert.assertTrue(sessionResult.isDone());
-        Assert.assertTrue(hasFailures.get());
+        Assert.assertNotNull(sessionResult.cause());
     }
 }
diff --git a/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionsTest.java b/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionsTest.java
index b9b1fbf..725833e 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionsTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/CoordinatorSessionsTest.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.repair.consistent;
 
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.Sets;
 import org.junit.Assert;
@@ -29,6 +28,7 @@
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.repair.AbstractRepairTest;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -38,7 +38,9 @@
 import org.apache.cassandra.repair.messages.PrepareConsistentResponse;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.service.ActiveRepairService;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class CoordinatorSessionsTest extends AbstractRepairTest
 {
@@ -88,12 +90,12 @@
             return new InstrumentedCoordinatorSession(builder);
         }
 
-        public InstrumentedCoordinatorSession getSession(UUID sessionId)
+        public InstrumentedCoordinatorSession getSession(TimeUUID sessionId)
         {
             return (InstrumentedCoordinatorSession) super.getSession(sessionId);
         }
 
-        public InstrumentedCoordinatorSession registerSession(UUID sessionId, Set<InetAddressAndPort> peers, boolean isForced)
+        public InstrumentedCoordinatorSession registerSession(TimeUUID sessionId, Set<InetAddressAndPort> peers, boolean isForced) throws NoSuchRepairSessionException
         {
             return (InstrumentedCoordinatorSession) super.registerSession(sessionId, peers, isForced);
         }
@@ -108,16 +110,16 @@
         cfs = Schema.instance.getColumnFamilyStoreInstance(cfm.id);
     }
 
-    private static UUID registerSession()
+    private static TimeUUID registerSession()
     {
         return registerSession(cfs, true, true);
     }
 
     @Test
-    public void registerSessionTest()
+    public void registerSessionTest() throws NoSuchRepairSessionException
     {
         CoordinatorSessions sessions = new CoordinatorSessions();
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         CoordinatorSession session = sessions.registerSession(sessionID, PARTICIPANTS, false);
 
         Assert.assertEquals(ConsistentSession.State.PREPARING, session.getState());
@@ -134,10 +136,10 @@
     }
 
     @Test
-    public void handlePrepareResponse()
+    public void handlePrepareResponse() throws NoSuchRepairSessionException
     {
         InstrumentedCoordinatorSessions sessions = new InstrumentedCoordinatorSessions();
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
 
         InstrumentedCoordinatorSession session = sessions.registerSession(sessionID, PARTICIPANTS, false);
         Assert.assertEquals(0, session.prepareResponseCalls);
@@ -145,24 +147,24 @@
         sessions.handlePrepareResponse(new PrepareConsistentResponse(sessionID, PARTICIPANT1, true));
         Assert.assertEquals(1, session.prepareResponseCalls);
         Assert.assertEquals(PARTICIPANT1, session.preparePeer);
-        Assert.assertEquals(true, session.prepareSuccess);
+        Assert.assertTrue(session.prepareSuccess);
     }
 
     @Test
     public void handlePrepareResponseNoSession()
     {
         InstrumentedCoordinatorSessions sessions = new InstrumentedCoordinatorSessions();
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
 
         sessions.handlePrepareResponse(new PrepareConsistentResponse(fakeID, PARTICIPANT1, true));
         Assert.assertNull(sessions.getSession(fakeID));
     }
 
     @Test
-    public void handlePromiseResponse()
+    public void handlePromiseResponse() throws NoSuchRepairSessionException
     {
         InstrumentedCoordinatorSessions sessions = new InstrumentedCoordinatorSessions();
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
 
         InstrumentedCoordinatorSession session = sessions.registerSession(sessionID, PARTICIPANTS, false);
         Assert.assertEquals(0, session.finalizePromiseCalls);
@@ -170,24 +172,24 @@
         sessions.handleFinalizePromiseMessage(new FinalizePromise(sessionID, PARTICIPANT1, true));
         Assert.assertEquals(1, session.finalizePromiseCalls);
         Assert.assertEquals(PARTICIPANT1, session.promisePeer);
-        Assert.assertEquals(true, session.promiseSuccess);
+        Assert.assertTrue(session.promiseSuccess);
     }
 
     @Test
     public void handlePromiseResponseNoSession()
     {
         InstrumentedCoordinatorSessions sessions = new InstrumentedCoordinatorSessions();
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
 
         sessions.handleFinalizePromiseMessage(new FinalizePromise(fakeID, PARTICIPANT1, true));
         Assert.assertNull(sessions.getSession(fakeID));
     }
 
     @Test
-    public void handleFailureMessage()
+    public void handleFailureMessage() throws NoSuchRepairSessionException
     {
         InstrumentedCoordinatorSessions sessions = new InstrumentedCoordinatorSessions();
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
 
         InstrumentedCoordinatorSession session = sessions.registerSession(sessionID, PARTICIPANTS, false);
         Assert.assertEquals(0, session.failCalls);
@@ -200,7 +202,7 @@
     public void handleFailureMessageNoSession()
     {
         InstrumentedCoordinatorSessions sessions = new InstrumentedCoordinatorSessions();
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
 
         sessions.handleFailSessionMessage(new FailSession(fakeID));
         Assert.assertNull(sessions.getSession(fakeID));
diff --git a/test/unit/org/apache/cassandra/repair/consistent/LocalSessionAccessor.java b/test/unit/org/apache/cassandra/repair/consistent/LocalSessionAccessor.java
index 790f719..6fd1c9e 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/LocalSessionAccessor.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/LocalSessionAccessor.java
@@ -19,10 +19,11 @@
 package org.apache.cassandra.repair.consistent;
 
 import java.util.Set;
-import java.util.UUID;
 
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.repair.NoSuchRepairSessionException;
 import org.apache.cassandra.service.ActiveRepairService;
+import org.apache.cassandra.utils.TimeUUID;
 
 /**
  * makes package private hacks available to compaction tests
@@ -36,26 +37,34 @@
         ARS.consistent.local.start();
     }
 
-    public static void prepareUnsafe(UUID sessionID, InetAddressAndPort coordinator, Set<InetAddressAndPort> peers)
+    public static void prepareUnsafe(TimeUUID sessionID, InetAddressAndPort coordinator, Set<InetAddressAndPort> peers)
     {
-        ActiveRepairService.ParentRepairSession prs = ARS.getParentRepairSession(sessionID);
+        ActiveRepairService.ParentRepairSession prs = null;
+        try
+        {
+            prs = ARS.getParentRepairSession(sessionID);
+        }
+        catch (NoSuchRepairSessionException e)
+        {
+            throw new RuntimeException(e);
+        }
         assert prs != null;
         LocalSession session = ARS.consistent.local.createSessionUnsafe(sessionID, prs, peers);
         ARS.consistent.local.putSessionUnsafe(session);
     }
 
-    public static long finalizeUnsafe(UUID sessionID)
+    public static long finalizeUnsafe(TimeUUID sessionID)
     {
         LocalSession session = setState(sessionID, ConsistentSession.State.FINALIZED);
         return session.repairedAt;
     }
 
-    public static void failUnsafe(UUID sessionID)
+    public static void failUnsafe(TimeUUID sessionID)
     {
         setState(sessionID, ConsistentSession.State.FAILED);
     }
 
-    public static LocalSession setState(UUID sessionId, ConsistentSession.State state)
+    public static LocalSession setState(TimeUUID sessionId, ConsistentSession.State state)
     {
         LocalSession session = ARS.consistent.local.getSession(sessionId);
         assert session != null;
diff --git a/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java b/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java
index 80a12c0..c83335b 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/LocalSessionTest.java
@@ -32,8 +32,6 @@
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.ListenableFuture;
-import com.google.common.util.concurrent.SettableFuture;
 
 import org.junit.Assert;
 import org.junit.Before;
@@ -67,21 +65,25 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.service.ActiveRepairService;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
+import org.apache.cassandra.utils.concurrent.Future;
+import org.apache.cassandra.utils.concurrent.Promise;
 
 import static org.apache.cassandra.repair.consistent.ConsistentSession.State.*;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.psjava.util.AssertStatus.assertTrue;
 
 public class LocalSessionTest extends AbstractRepairTest
 {
-    private static final UUID TID1 = UUIDGen.getTimeUUID();
-    private static final UUID TID2 = UUIDGen.getTimeUUID();
+    private static final UUID TID1 = UUID.randomUUID();
+    private static final UUID TID2 = UUID.randomUUID();
 
     static LocalSession.Builder createBuilder()
     {
         LocalSession.Builder builder = LocalSession.builder();
         builder.withState(PREPARING);
-        builder.withSessionID(UUIDGen.getTimeUUID());
+        builder.withSessionID(nextTimeUUID());
         builder.withCoordinator(COORDINATOR);
         builder.withUUIDTableIds(Sets.newHashSet(TID1, TID2));
         builder.withRepairedAt(System.currentTimeMillis());
@@ -138,16 +140,16 @@
             sentMessages.get(destination).add(message.payload);
         }
 
-        SettableFuture<Object> prepareSessionFuture = null;
+        AsyncPromise<List<Void>> prepareSessionFuture = null;
         boolean prepareSessionCalled = false;
 
         @Override
-        ListenableFuture prepareSession(KeyspaceRepairManager repairManager,
-                                        UUID sessionID,
-                                        Collection<ColumnFamilyStore> tables,
-                                        RangesAtEndpoint ranges,
-                                        ExecutorService executor,
-                                        BooleanSupplier isCancelled)
+        Future<List<Void>> prepareSession(KeyspaceRepairManager repairManager,
+                                          TimeUUID sessionID,
+                                          Collection<ColumnFamilyStore> tables,
+                                          RangesAtEndpoint ranges,
+                                          ExecutorService executor,
+                                          BooleanSupplier isCancelled)
         {
             prepareSessionCalled = true;
             if (prepareSessionFuture != null)
@@ -161,17 +163,17 @@
         }
 
         boolean failSessionCalled = false;
-        public void failSession(UUID sessionID, boolean sendMessage)
+        public void failSession(TimeUUID sessionID, boolean sendMessage)
         {
             failSessionCalled = true;
             super.failSession(sessionID, sendMessage);
         }
 
-        public LocalSession prepareForTest(UUID sessionID)
+        public LocalSession prepareForTest(TimeUUID sessionID)
         {
-            prepareSessionFuture = SettableFuture.create();
+            prepareSessionFuture = new AsyncPromise<>();
             handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
-            prepareSessionFuture.set(new Object());
+            prepareSessionFuture.trySuccess(null);
             sentMessages.clear();
             return getSession(sessionID);
         }
@@ -192,11 +194,11 @@
             return true;
         }
 
-        public Map<UUID, Integer> completedSessions = new HashMap<>();
+        public Map<TimeUUID, Integer> completedSessions = new HashMap<>();
 
         protected void sessionCompleted(LocalSession session)
         {
-            UUID sessionID = session.sessionID;
+            TimeUUID sessionID = session.sessionID;
             int calls = completedSessions.getOrDefault(sessionID, 0);
             completedSessions.put(sessionID, calls + 1);
         }
@@ -228,7 +230,7 @@
         repairCfs.truncateBlocking();
     }
 
-    private static UUID registerSession()
+    private static TimeUUID registerSession()
     {
         return registerSession(cfs, true, true);
     }
@@ -266,12 +268,12 @@
     @Test
     public void prepareSuccessCase()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
         // replacing future so we can inspect state before and after anti compaction callback
-        sessions.prepareSessionFuture = SettableFuture.create();
+        sessions.prepareSessionFuture = new AsyncPromise<>();
         Assert.assertFalse(sessions.prepareSessionCalled);
         sessions.handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
         Assert.assertTrue(sessions.prepareSessionCalled);
@@ -284,7 +286,7 @@
         Assert.assertEquals(session, sessions.loadUnsafe(sessionID));
 
         // anti compaction has now finished, so state in memory and on disk should be PREPARED
-        sessions.prepareSessionFuture.set(new Object());
+        sessions.prepareSessionFuture.trySuccess(null);
         session = sessions.getSession(sessionID);
         Assert.assertNotNull(session);
         Assert.assertEquals(PREPARED, session.getState());
@@ -301,12 +303,12 @@
     @Test
     public void prepareAntiCompactFailure()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
         // replacing future so we can inspect state before and after anti compaction callback
-        sessions.prepareSessionFuture = SettableFuture.create();
+        sessions.prepareSessionFuture = new AsyncPromise<>();
         Assert.assertFalse(sessions.prepareSessionCalled);
         sessions.handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
         Assert.assertTrue(sessions.prepareSessionCalled);
@@ -319,7 +321,7 @@
         Assert.assertEquals(session, sessions.loadUnsafe(sessionID));
 
         // anti compaction has now finished, so state in memory and on disk should be PREPARED
-        sessions.prepareSessionFuture.setException(new RuntimeException());
+        sessions.prepareSessionFuture.tryFailure(new RuntimeException());
         session = sessions.getSession(sessionID);
         Assert.assertNotNull(session);
         Assert.assertEquals(FAILED, session.getState());
@@ -338,7 +340,7 @@
     @Test
     public void prepareWithNonExistantParentSession()
     {
-        UUID sessionID = UUIDGen.getTimeUUID();
+        TimeUUID sessionID = nextTimeUUID();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
         Assert.assertNull(sessions.getSession(sessionID));
@@ -351,12 +353,12 @@
     @Test
     public void prepareCancellation()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         AtomicReference<BooleanSupplier> isCancelledRef = new AtomicReference<>();
-        SettableFuture future = SettableFuture.create();
+        Promise<List<Void>> future = new AsyncPromise<>();
 
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions() {
-            ListenableFuture prepareSession(KeyspaceRepairManager repairManager, UUID sessionID, Collection<ColumnFamilyStore> tables, RangesAtEndpoint ranges, ExecutorService executor, BooleanSupplier isCancelled)
+            Future<List<Void>> prepareSession(KeyspaceRepairManager repairManager, TimeUUID sessionID, Collection<ColumnFamilyStore> tables, RangesAtEndpoint ranges, ExecutorService executor, BooleanSupplier isCancelled)
             {
                 isCancelledRef.set(isCancelled);
                 return future;
@@ -375,14 +377,14 @@
         Assert.assertTrue(isCancelled.getAsBoolean());
 
         // now that the session has failed, it send a negative response to the coordinator (even if the anti-compaction completed successfully)
-        future.set(new Object());
+        future.trySuccess(null);
         assertMessagesSent(sessions, COORDINATOR, new PrepareConsistentResponse(sessionID, PARTICIPANT1, false));
     }
 
     @Test
     public void maybeSetRepairing()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -403,7 +405,7 @@
     public void maybeSetRepairingDuplicates()
     {
 
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -437,7 +439,7 @@
     public void maybeSetRepairingNonExistantSession()
     {
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
         sessions.maybeSetRepairing(fakeID);
         Assert.assertTrue(sessions.sentMessages.isEmpty());
     }
@@ -449,7 +451,7 @@
     @Test
     public void finalizeProposeSuccessCase()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -475,7 +477,7 @@
     @Test
     public void finalizeProposeInvalidStateFailure()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -494,7 +496,7 @@
     public void finalizeProposeNonExistantSessionFailure()
     {
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
         sessions.handleFinalizeProposeMessage(COORDINATOR, new FinalizePropose(fakeID));
         Assert.assertNull(sessions.getSession(fakeID));
         assertMessagesSent(sessions, COORDINATOR, new FailSession(fakeID));
@@ -507,7 +509,7 @@
     @Test
     public void finalizeCommitSuccessCase()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -532,7 +534,7 @@
     {
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
         sessions.handleFinalizeCommitMessage(PARTICIPANT1, new FinalizeCommit(fakeID));
         Assert.assertNull(sessions.getSession(fakeID));
         Assert.assertTrue(sessions.sentMessages.isEmpty());
@@ -541,7 +543,7 @@
     @Test
     public void failSession()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -563,7 +565,7 @@
     @Test
     public void handleFailMessage()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -579,7 +581,7 @@
     @Test
     public void sendStatusRequest() throws Exception
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         LocalSession session = sessions.prepareForTest(sessionID);
@@ -596,7 +598,7 @@
     @Test
     public void handleStatusRequest() throws Exception
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         LocalSession session = sessions.prepareForTest(sessionID);
@@ -616,7 +618,7 @@
         sessions.start();
 
         sessions.sentMessages.clear();
-        UUID sessionID = UUIDGen.getTimeUUID();
+        TimeUUID sessionID = nextTimeUUID();
         sessions.handleStatusRequest(PARTICIPANT2, new StatusRequest(sessionID));
         assertNoMessagesSent(sessions, PARTICIPANT1);
         assertMessagesSent(sessions, PARTICIPANT2, new StatusResponse(sessionID, FAILED));
@@ -626,7 +628,7 @@
     @Test
     public void handleStatusResponseFinalized() throws Exception
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         LocalSession session = sessions.prepareForTest(sessionID);
@@ -639,7 +641,7 @@
     @Test
     public void handleStatusResponseFinalizedRedundant() throws Exception
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         LocalSession session = sessions.prepareForTest(sessionID);
@@ -652,7 +654,7 @@
     @Test
     public void handleStatusResponseFailed() throws Exception
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         LocalSession session = sessions.prepareForTest(sessionID);
@@ -665,7 +667,7 @@
     @Test
     public void handleStatusResponseFailedRedundant() throws Exception
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         LocalSession session = sessions.prepareForTest(sessionID);
@@ -678,7 +680,7 @@
     @Test
     public void handleStatusResponseNoop() throws Exception
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         LocalSession session = sessions.prepareForTest(sessionID);
@@ -691,7 +693,7 @@
     @Test
     public void handleStatusResponseNoSession() throws Exception
     {
-        UUID sessionID = UUIDGen.getTimeUUID();
+        TimeUUID sessionID = nextTimeUUID();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -705,10 +707,10 @@
     @Test
     public void isSessionInProgress()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
-        sessions.prepareSessionFuture = SettableFuture.create();  // prevent moving to prepared
+        sessions.prepareSessionFuture = new AsyncPromise<>();  // prevent moving to prepared
         sessions.handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
 
         LocalSession session = sessions.getSession(sessionID);
@@ -732,12 +734,12 @@
     @Test
     public void isSessionInProgressFailed()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
-        sessions.prepareSessionFuture = SettableFuture.create();
+        sessions.prepareSessionFuture = new AsyncPromise<>();
         sessions.handlePrepareMessage(PARTICIPANT1, new PrepareConsistentRequest(sessionID, COORDINATOR, PARTICIPANTS));
-        sessions.prepareSessionFuture.set(new Object());
+        sessions.prepareSessionFuture.trySuccess(null);
 
         Assert.assertTrue(sessions.isSessionInProgress(sessionID));
         sessions.failSession(sessionID);
@@ -747,7 +749,7 @@
     @Test
     public void isSessionInProgressNonExistantSession()
     {
-        UUID fakeID = UUIDGen.getTimeUUID();
+        TimeUUID fakeID = nextTimeUUID();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         Assert.assertFalse(sessions.isSessionInProgress(fakeID));
@@ -756,7 +758,7 @@
     @Test
     public void finalRepairedAtFinalized()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -773,7 +775,7 @@
     @Test
     public void finalRepairedAtFailed()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
 
@@ -789,7 +791,7 @@
     @Test
     public void finalRepairedAtNoSession()
     {
-        UUID fakeID = registerSession();
+        TimeUUID fakeID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         long repairedAt = sessions.getFinalSessionRepairedAt(fakeID);
@@ -799,7 +801,7 @@
     @Test(expected = IllegalStateException.class)
     public void finalRepairedAtInProgress()
     {
-        UUID sessionID = registerSession();
+        TimeUUID sessionID = registerSession();
         InstrumentedLocalSessions sessions = new InstrumentedLocalSessions();
         sessions.start();
         sessions.prepareForTest(sessionID);
@@ -816,9 +818,9 @@
         InstrumentedLocalSessions initialSessions = new InstrumentedLocalSessions();
         initialSessions.start();
         Assert.assertEquals(0, initialSessions.getNumSessions());
-        UUID id1 = registerSession();
-        UUID id2 = registerSession();
-        UUID id3 = registerSession();
+        TimeUUID id1 = registerSession();
+        TimeUUID id2 = registerSession();
+        TimeUUID id3 = registerSession();
 
         initialSessions.prepareForTest(id1);
         initialSessions.prepareForTest(id2);
@@ -866,9 +868,9 @@
         InstrumentedLocalSessions initialSessions = new InstrumentedLocalSessions();
         initialSessions.start();
         Assert.assertEquals(0, initialSessions.getNumSessions());
-        UUID id1 = registerSession();
-        UUID id2 = registerSession();
-        UUID id3 = registerSession();
+        TimeUUID id1 = registerSession();
+        TimeUUID id2 = registerSession();
+        TimeUUID id3 = registerSession();
 
         initialSessions.prepareForTest(id1);
         initialSessions.prepareForTest(id2);
diff --git a/test/unit/org/apache/cassandra/repair/consistent/PendingRepairStatTest.java b/test/unit/org/apache/cassandra/repair/consistent/PendingRepairStatTest.java
index 6c42724..b3bab20 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/PendingRepairStatTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/PendingRepairStatTest.java
@@ -21,7 +21,6 @@
 import java.io.IOException;
 import java.util.Collections;
 import java.util.Set;
-import java.util.UUID;
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
@@ -31,6 +30,7 @@
 import org.junit.Test;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
@@ -47,13 +47,14 @@
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 import static org.apache.cassandra.repair.consistent.ConsistentSession.State.FAILED;
 import static org.apache.cassandra.repair.consistent.ConsistentSession.State.FINALIZED;
 import static org.apache.cassandra.repair.consistent.ConsistentSession.State.PREPARING;
 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;
 
 public class PendingRepairStatTest extends AbstractRepairTest
 {
@@ -91,7 +92,7 @@
     {
         LocalSession.Builder builder = LocalSession.builder();
         builder.withState(PREPARING);
-        builder.withSessionID(UUIDGen.getTimeUUID());
+        builder.withSessionID(nextTimeUUID());
         builder.withCoordinator(COORDINATOR);
         builder.withUUIDTableIds(Sets.newHashSet(cfm.id.asUUID()));
         builder.withRepairedAt(System.currentTimeMillis());
@@ -114,11 +115,11 @@
             int key = startKey + i;
             QueryProcessor.executeInternal(String.format("INSERT INTO %s.%s (k, v) VALUES (?, ?)", cfm.keyspace, cfm.name), key, key);
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         return Iterables.getOnlyElement(Sets.difference(cfs.getLiveSSTables(), existing));
     }
 
-    private static void mutateRepaired(SSTableReader sstable, long repairedAt, UUID pendingRepair)
+    private static void mutateRepaired(SSTableReader sstable, long repairedAt, TimeUUID pendingRepair)
     {
         try
         {
diff --git a/test/unit/org/apache/cassandra/repair/consistent/admin/SchemaArgsParserTest.java b/test/unit/org/apache/cassandra/repair/consistent/admin/SchemaArgsParserTest.java
index 9d98c9d..1a5605e 100644
--- a/test/unit/org/apache/cassandra/repair/consistent/admin/SchemaArgsParserTest.java
+++ b/test/unit/org/apache/cassandra/repair/consistent/admin/SchemaArgsParserTest.java
@@ -18,8 +18,6 @@
 
 package org.apache.cassandra.repair.consistent.admin;
 
-import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
 import com.google.common.collect.Sets;
@@ -33,7 +31,6 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.schema.TableMetadata;
-import org.assertj.core.util.Lists;
 
 public class SchemaArgsParserTest
 {
diff --git a/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java b/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java
index 761a77c..634fab3 100644
--- a/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java
+++ b/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializationsTest.java
@@ -51,7 +51,8 @@
 import org.apache.cassandra.streaming.SessionSummary;
 import org.apache.cassandra.streaming.StreamSummary;
 import org.apache.cassandra.utils.MerkleTrees;
-import org.apache.cassandra.utils.UUIDGen;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 public class RepairMessageSerializationsTest
 {
@@ -85,7 +86,7 @@
     private RepairJobDesc buildRepairJobDesc()
     {
         List<Range<Token>> tokenRanges = buildTokenRanges();
-        return new RepairJobDesc(UUID.randomUUID(), UUID.randomUUID(), "serializationsTestKeyspace", "repairMessages", tokenRanges);
+        return new RepairJobDesc(nextTimeUUID(), nextTimeUUID(), "serializationsTestKeyspace", "repairMessages", tokenRanges);
     }
 
     private List<Range<Token>> buildTokenRanges()
@@ -161,8 +162,8 @@
         InetAddressAndPort dst = InetAddressAndPort.getByName("127.0.0.3");
         List<SessionSummary> summaries = new ArrayList<>();
         summaries.add(new SessionSummary(src, dst,
-                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUIDGen.getTimeUUID()), 5, 100)),
-                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUIDGen.getTimeUUID()), 500, 10))
+                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUID.randomUUID()), 5, 100)),
+                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUID.randomUUID()), 500, 10))
         ));
         SyncResponse msg = new SyncResponse(buildRepairJobDesc(), new SyncNodePair(src, dst), true, summaries);
         serializeRoundTrip(msg, SyncResponse.serializer);
@@ -171,7 +172,7 @@
     @Test
     public void prepareMessage() throws IOException
     {
-        PrepareMessage msg = new PrepareMessage(UUID.randomUUID(), new ArrayList<TableId>() {{add(TableId.generate());}},
+        PrepareMessage msg = new PrepareMessage(nextTimeUUID(), new ArrayList<TableId>() {{add(TableId.generate());}},
                                                 buildTokenRanges(), true, 100000L, false,
                                                 PreviewKind.NONE);
         serializeRoundTrip(msg, PrepareMessage.serializer);
@@ -187,7 +188,7 @@
     @Test
     public void cleanupMessage() throws IOException
     {
-        CleanupMessage msg = new CleanupMessage(UUID.randomUUID());
+        CleanupMessage msg = new CleanupMessage(nextTimeUUID());
         serializeRoundTrip(msg, CleanupMessage.serializer);
     }
 }
diff --git a/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializerTest.java b/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializerTest.java
index fedf498..f2e0b5b0 100644
--- a/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializerTest.java
+++ b/test/unit/org/apache/cassandra/repair/messages/RepairMessageSerializerTest.java
@@ -20,7 +20,6 @@
 
 import java.io.IOException;
 
-import com.google.common.collect.Sets;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -29,7 +28,10 @@
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.utils.UUIDGen;
+
+import static com.google.common.collect.Sets.newHashSet;
+import static org.apache.cassandra.locator.InetAddressAndPort.getByName;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 
 /**
  * verifies repair message serializers are working as advertised
@@ -64,7 +66,7 @@
         InetAddressAndPort peer2 = InetAddressAndPort.getByName("10.0.0.3");
         InetAddressAndPort peer3 = InetAddressAndPort.getByName("10.0.0.4");
         PrepareConsistentRequest expected =
-            new PrepareConsistentRequest(UUIDGen.getTimeUUID(), coordinator, Sets.newHashSet(peer1, peer2, peer3));
+            new PrepareConsistentRequest(nextTimeUUID(), coordinator, newHashSet(peer1, peer2, peer3));
         PrepareConsistentRequest actual = serdes(PrepareConsistentRequest.serializer, expected);
         Assert.assertEquals(expected, actual);
     }
@@ -73,7 +75,7 @@
     public void prepareConsistentResponse() throws Exception
     {
         PrepareConsistentResponse expected =
-            new PrepareConsistentResponse(UUIDGen.getTimeUUID(), InetAddressAndPort.getByName("10.0.0.2"), true);
+            new PrepareConsistentResponse(nextTimeUUID(), getByName("10.0.0.2"), true);
         PrepareConsistentResponse actual = serdes(PrepareConsistentResponse.serializer, expected);
         Assert.assertEquals(expected, actual);
     }
@@ -81,7 +83,7 @@
     @Test
     public void failSession() throws Exception
     {
-        FailSession expected = new FailSession(UUIDGen.getTimeUUID());
+        FailSession expected = new FailSession(nextTimeUUID());
         FailSession actual = serdes(FailSession.serializer, expected);
         Assert.assertEquals(expected, actual);;
     }
@@ -89,7 +91,7 @@
     @Test
     public void finalizeCommit() throws Exception
     {
-        FinalizeCommit expected = new FinalizeCommit(UUIDGen.getTimeUUID());
+        FinalizeCommit expected = new FinalizeCommit(nextTimeUUID());
         FinalizeCommit actual = serdes(FinalizeCommit.serializer, expected);
         Assert.assertEquals(expected, actual);;
     }
@@ -97,7 +99,7 @@
     @Test
     public void finalizePromise() throws Exception
     {
-        FinalizePromise expected = new FinalizePromise(UUIDGen.getTimeUUID(), InetAddressAndPort.getByName("10.0.0.2"), true);
+        FinalizePromise expected = new FinalizePromise(nextTimeUUID(), getByName("10.0.0.2"), true);
         FinalizePromise actual = serdes(FinalizePromise.serializer, expected);
         Assert.assertEquals(expected, actual);
     }
@@ -105,7 +107,7 @@
     @Test
     public void finalizePropose() throws Exception
     {
-        FinalizePropose expected = new FinalizePropose(UUIDGen.getTimeUUID());
+        FinalizePropose expected = new FinalizePropose(nextTimeUUID());
         FinalizePropose actual = serdes(FinalizePropose.serializer, expected);
         Assert.assertEquals(expected, actual);;
     }
diff --git a/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java
index 484d7a8..a6ca084 100644
--- a/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java
+++ b/test/unit/org/apache/cassandra/repair/messages/RepairOptionTest.java
@@ -26,16 +26,12 @@
 import org.junit.Assert;
 import org.junit.Test;
 
-import com.google.common.collect.ImmutableMap;
-
-import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.repair.RepairParallelism;
-import org.apache.cassandra.utils.FBUtilities;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -54,11 +50,7 @@
 
         // parse with empty options
         RepairOption option = RepairOption.parse(new HashMap<String, String>(), partitioner);
-
-        if (FBUtilities.isWindows && (DatabaseDescriptor.getDiskAccessMode() != Config.DiskAccessMode.standard || DatabaseDescriptor.getIndexAccessMode() != Config.DiskAccessMode.standard))
-            assertTrue(option.getParallelism() == RepairParallelism.PARALLEL);
-        else
-            assertTrue(option.getParallelism() == RepairParallelism.SEQUENTIAL);
+        assertTrue(option.getParallelism() == RepairParallelism.SEQUENTIAL);
 
         assertFalse(option.isPrimaryRange());
         assertFalse(option.isIncremental());
diff --git a/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java b/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java
index f2abc7c..5541e35 100644
--- a/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java
+++ b/test/unit/org/apache/cassandra/schema/CreateTableValidationTest.java
@@ -58,6 +58,7 @@
         createTable("CREATE TABLE %s (a int PRIMARY KEY, b int) WITH bloom_filter_fp_chance = 0.1");
     }
 
+    @Deprecated // these warning thresholds will be replaced by equivalent guardrails
     @Test
     public void testCreateKeyspaceTableWarning() throws IOException
     {
diff --git a/test/unit/org/apache/cassandra/schema/MemtableParamsTest.java b/test/unit/org/apache/cassandra/schema/MemtableParamsTest.java
new file mode 100644
index 0000000..7db5204
--- /dev/null
+++ b/test/unit/org/apache/cassandra/schema/MemtableParamsTest.java
@@ -0,0 +1,200 @@
+/*
+ * 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.schema;
+
+import java.util.Map;
+
+import com.google.common.collect.ImmutableMap;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.config.InheritingClass;
+import org.apache.cassandra.config.ParameterizedClass;
+import org.apache.cassandra.db.memtable.SkipListMemtableFactory;
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+import static org.junit.Assert.assertEquals;
+
+public class MemtableParamsTest
+{
+    static final ParameterizedClass DEFAULT = SkipListMemtableFactory.CONFIGURATION;
+
+    @Test
+    public void testDefault()
+    {
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions(ImmutableMap.of());
+        assertEquals(ImmutableMap.of("default", DEFAULT), map);
+    }
+
+    @Test
+    public void testDefaultRemapped()
+    {
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions
+        (
+            ImmutableMap.of("remap", new InheritingClass("default", null, null))
+        );
+        assertEquals(ImmutableMap.of("default", DEFAULT,
+                                     "remap", DEFAULT),
+                     map);
+    }
+
+    @Test
+    public void testOne()
+    {
+        final InheritingClass one = new InheritingClass(null, "SkipList", null);
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions(ImmutableMap.of("one", one));
+        assertEquals(ImmutableMap.of("default", DEFAULT,
+                                     "one", one),
+                     map);
+    }
+
+    @Test
+    public void testExtends()
+    {
+        final InheritingClass one = new InheritingClass(null, "SkipList", null);
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions
+        (
+            ImmutableMap.of("one", one,
+                            "two", new InheritingClass("one",
+                                                       null,
+                                                       ImmutableMap.of("extra", "value")))
+        );
+
+        assertEquals(ImmutableMap.of("default", DEFAULT,
+                                     "one", one,
+                                     "two", new ParameterizedClass("SkipList",
+                                                                   ImmutableMap.of("extra", "value"))),
+                     map);
+    }
+
+    @Test
+    public void testExtendsReplace()
+    {
+        final InheritingClass one = new InheritingClass(null,
+                                                        "SkipList",
+                                                        ImmutableMap.of("extra", "valueOne"));
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions
+        (
+            ImmutableMap.of("one", one,
+                            "two", new InheritingClass("one",
+                                                       null,
+                                                       ImmutableMap.of("extra", "value")))
+        );
+        assertEquals(ImmutableMap.of("default", DEFAULT,
+                                     "one", one,
+                                     "two", new ParameterizedClass("SkipList",
+                                                                   ImmutableMap.of("extra", "value"))),
+                     map);
+    }
+
+    @Test
+    public void testDoubleExtends()
+    {
+        final InheritingClass one = new InheritingClass(null, "SkipList", null);
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions
+        (
+            ImmutableMap.of("one", one,
+                            "two", new InheritingClass("one",
+                                                       null,
+                                                       ImmutableMap.of("param", "valueTwo",
+                                                                       "extra", "value")),
+                            "three", new InheritingClass("two",
+                                                         "OtherClass",
+                                                         ImmutableMap.of("param", "valueThree",
+                                                                         "extraThree", "three")))
+        );
+        assertEquals(ImmutableMap.of("default", DEFAULT,
+                                     "one", one,
+                                     "two", new ParameterizedClass("SkipList",
+                                                                   ImmutableMap.of("param", "valueTwo",
+                                                                                   "extra", "value")),
+                                     "three", new ParameterizedClass("OtherClass",
+                                                                     ImmutableMap.of("param", "valueThree",
+                                                                                     "extra", "value",
+                                                                                     "extraThree", "three"))),
+                     map);
+    }
+
+    @Test
+    public void testInvalidExtends()
+    {
+        final InheritingClass one = new InheritingClass(null, "SkipList", null);
+        try
+        {
+            Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions
+            (
+                ImmutableMap.of("two", new InheritingClass("one",
+                                                           null,
+                                                           ImmutableMap.of("extra", "value")),
+                                "one", one)
+            );
+            Assert.fail("Expected exception.");
+        }
+        catch (ConfigurationException e)
+        {
+            // expected
+        }
+    }
+
+    @Test
+    public void testInvalidSelfExtends()
+    {
+        try
+        {
+            Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions
+            (
+                ImmutableMap.of("one", new InheritingClass("one",
+                                                           null,
+                                                           ImmutableMap.of("extra", "value")))
+            );
+            Assert.fail("Expected exception.");
+        }
+        catch (ConfigurationException e)
+        {
+            // expected
+        }
+    }
+
+    @Test
+    public void testReplaceDefault()
+    {
+        final InheritingClass one = new InheritingClass(null,
+                                                        "SkipList",
+                                                        ImmutableMap.of("extra", "valueOne"));
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions(ImmutableMap.of("default", one));
+        assertEquals(ImmutableMap.of("default", one), map);
+    }
+
+    @Test
+    public void testDefaultExtends()
+    {
+        final InheritingClass one = new InheritingClass(null,
+                                                        "SkipList",
+                                                        ImmutableMap.of("extra", "valueOne"));
+        Map<String, ParameterizedClass> map = MemtableParams.expandDefinitions
+        (
+            ImmutableMap.of("one", one,
+                            "default", new InheritingClass("one", null, ImmutableMap.of()))
+        );
+        assertEquals(ImmutableMap.of("one", one,
+                                     "default", one),
+                     map);
+    }
+    // Note: The factories constructed from these parameters are tested in the CreateTest and AlterTest.
+}
diff --git a/test/unit/org/apache/cassandra/schema/MigrationCoordinatorTest.java b/test/unit/org/apache/cassandra/schema/MigrationCoordinatorTest.java
index 7ad5e2d..3783320 100644
--- a/test/unit/org/apache/cassandra/schema/MigrationCoordinatorTest.java
+++ b/test/unit/org/apache/cassandra/schema/MigrationCoordinatorTest.java
@@ -19,31 +19,55 @@
 package org.apache.cassandra.schema;
 
 import java.net.UnknownHostException;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedHashSet;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Queue;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.Future;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.ScheduledFuture;
 
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Futures;
 import org.junit.Assert;
 import org.junit.Test;
-
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import org.apache.cassandra.concurrent.ImmediateExecutor;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.gms.ApplicationState;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.VersionedValue;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.metrics.MessagingMetrics;
+import org.apache.cassandra.net.EndpointMessagingVersions;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.RequestCallback;
+import org.apache.cassandra.net.Verb;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Pair;
 import org.apache.cassandra.utils.concurrent.WaitQueue;
+import org.mockito.ArgumentCaptor;
+import org.mockito.ArgumentMatchers;
+import org.mockito.internal.creation.MockSettingsImpl;
 
 import static com.google.common.util.concurrent.Futures.getUnchecked;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyLong;
+import static org.mockito.Mockito.doAnswer;
+import static org.mockito.Mockito.doNothing;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 public class MigrationCoordinatorTest
 {
@@ -57,6 +81,8 @@
     private static final UUID V1 = UUID.randomUUID();
     private static final UUID V2 = UUID.randomUUID();
 
+    private static final EndpointState validEndpointState = mock(EndpointState.class);
+
     static
     {
         try
@@ -71,105 +97,116 @@
         }
 
         DatabaseDescriptor.daemonInitialization();
+
+        when(validEndpointState.getApplicationState(ApplicationState.RELEASE_VERSION)).thenReturn(VersionedValue.unsafeMakeVersionedValue(FBUtilities.getReleaseVersionString(), 0));
     }
 
-    private static class InstrumentedCoordinator extends MigrationCoordinator
+    private static class Wrapper
     {
+        final Queue<Pair<InetAddressAndPort, RequestCallback<Collection<Mutation>>>> requests = new LinkedList<>();
+        final ScheduledExecutorService oneTimeExecutor = mock(ScheduledExecutorService.class);
+        final Gossiper gossiper = mock(Gossiper.class);
+        final Set<InetAddressAndPort> mergedSchemasFrom = new HashSet<>();
+        final EndpointMessagingVersions versions = mock(EndpointMessagingVersions.class);
+        final MessagingService messagingService = mock(MessagingService.class, new MockSettingsImpl<>().defaultAnswer(a -> {
+            throw new UnsupportedOperationException();
+        }).useConstructor(true, versions, mock(MessagingMetrics.class)));
 
-        Queue<Callback> requests = new LinkedList<>();
-        @Override
-        protected void sendMigrationMessage(MigrationCoordinator.Callback callback)
+        UUID localSchemaVersion = LOCAL_VERSION;
+
+        final MigrationCoordinator coordinator;
+
+        private Wrapper()
         {
-            requests.add(callback);
+            this(3);
         }
 
-        boolean shouldPullSchema = true;
-        @Override
-        protected boolean shouldPullSchema(UUID version)
+        private Wrapper(int maxOutstandingRequests)
         {
-            return shouldPullSchema;
+            when(oneTimeExecutor.scheduleWithFixedDelay(any(), anyLong(), anyLong(), any())).thenAnswer(a -> {
+                a.getArgument(0, Runnable.class).run();
+                return mock(ScheduledFuture.class);
+            });
+            when(gossiper.getEndpointStateForEndpoint(any())).thenReturn(validEndpointState);
+            when(gossiper.isAlive(any())).thenReturn(true);
+            doAnswer(a -> requests.add(Pair.create(a.getArgument(1, InetAddressAndPort.class), a.getArgument(2, RequestCallback.class))))
+                    .when(messagingService)
+                    .sendWithCallback(any(), any(), any());
+
+            when(versions.knows(any())).thenReturn(true);
+            when(versions.getRaw(any())).thenReturn(MessagingService.current_version);
+            this.coordinator = new MigrationCoordinator(messagingService,
+                                                        ImmediateExecutor.INSTANCE,
+                                                        oneTimeExecutor,
+                                                        maxOutstandingRequests,
+                                                        gossiper,
+                                                        () -> localSchemaVersion,
+                                                        (endpoint, ignored) -> mergedSchemasFrom.add(endpoint));
         }
 
-        boolean shouldPullFromEndpoint = true;
-        @Override
-        protected boolean shouldPullFromEndpoint(InetAddressAndPort endpoint)
+        private InetAddressAndPort configureMocksForEndpoint(String endpointName, EndpointState es, Integer msgVersion, boolean gossipOnlyMember) throws UnknownHostException
         {
-            return shouldPullFromEndpoint;
+            InetAddressAndPort endpoint = InetAddressAndPort.getByName(endpointName);
+            return configureMocksForEndpoint(endpoint, es, msgVersion, gossipOnlyMember);
         }
 
-        boolean shouldPullImmediately = true;
-        @Override
-        protected boolean shouldPullImmediately(InetAddressAndPort endpoint, UUID version)
+        private InetAddressAndPort configureMocksForEndpoint(InetAddressAndPort endpoint, EndpointState es, Integer msgVersion, boolean gossipOnlyMember) throws UnknownHostException
         {
-            return shouldPullImmediately;
-        }
+            when(gossiper.getEndpointStateForEndpoint(endpoint)).thenReturn(es);
+            if (msgVersion == null)
+            {
+                when(versions.knows(endpoint)).thenReturn(false);
+                when(versions.getRaw(endpoint)).thenThrow(new IllegalArgumentException());
+            }
+            else
+            {
+                when(versions.knows(endpoint)).thenReturn(true);
+                when(versions.getRaw(endpoint)).thenReturn(msgVersion);
+            }
+            when(gossiper.isGossipOnlyMember(endpoint)).thenReturn(gossipOnlyMember);
+            when(gossiper.isAlive(endpoint)).thenReturn(true);
 
-        Set<InetAddressAndPort> deadNodes = new HashSet<>();
-        protected boolean isAlive(InetAddressAndPort endpoint)
-        {
-            return !deadNodes.contains(endpoint);
-        }
-
-        UUID localVersion = LOCAL_VERSION;
-        @Override
-        protected boolean isLocalVersion(UUID version)
-        {
-            return localVersion.equals(version);
-        }
-
-        int maxOutstandingRequests = 3;
-        @Override
-        protected int getMaxOutstandingVersionRequests()
-        {
-            return maxOutstandingRequests;
-        }
-
-        Set<InetAddressAndPort> mergedSchemasFrom = new HashSet<>();
-        @Override
-        protected void mergeSchemaFrom(InetAddressAndPort endpoint, Collection<Mutation> mutations)
-        {
-            mergedSchemasFrom.add(endpoint);
+            return endpoint;
         }
     }
 
     @Test
     public void requestResponseCycle() throws InterruptedException
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
-        coordinator.maxOutstandingRequests = 1;
+        Wrapper wrapper = new Wrapper(1);
+        MigrationCoordinator coordinator = wrapper.coordinator;
 
-        Assert.assertTrue(coordinator.requests.isEmpty());
+        Assert.assertTrue(wrapper.requests.isEmpty());
 
         // first schema report should send a migration request
         getUnchecked(coordinator.reportEndpointVersion(EP1, V1));
-        Assert.assertEquals(1, coordinator.requests.size());
+        Assert.assertEquals(1, wrapper.requests.size());
         Assert.assertFalse(coordinator.awaitSchemaRequests(1));
 
         // second should not
         getUnchecked(coordinator.reportEndpointVersion(EP2, V1));
-        Assert.assertEquals(1, coordinator.requests.size());
+        Assert.assertEquals(1, wrapper.requests.size());
         Assert.assertFalse(coordinator.awaitSchemaRequests(1));
 
         // until the first request fails, then the second endpoint should be contacted
-        MigrationCoordinator.Callback request1 = coordinator.requests.poll();
-        Assert.assertEquals(EP1, request1.endpoint);
-        getUnchecked(request1.fail());
-        Assert.assertTrue(coordinator.mergedSchemasFrom.isEmpty());
+        Pair<InetAddressAndPort, RequestCallback<Collection<Mutation>>> request1 = wrapper.requests.poll();
+        Assert.assertEquals(EP1, request1.left);
+        request1.right.onFailure(null, null);
+        Assert.assertTrue(wrapper.mergedSchemasFrom.isEmpty());
         Assert.assertFalse(coordinator.awaitSchemaRequests(1));
 
         // ... then the second endpoint should be contacted
-        Assert.assertEquals(1, coordinator.requests.size());
-        MigrationCoordinator.Callback request2 = coordinator.requests.poll();
-        Assert.assertEquals(EP2, request2.endpoint);
+        Assert.assertEquals(1, wrapper.requests.size());
+        Pair<InetAddressAndPort, RequestCallback<Collection<Mutation>>> request2 = wrapper.requests.poll();
+        Assert.assertEquals(EP2, request2.left);
         Assert.assertFalse(coordinator.awaitSchemaRequests(1));
-        getUnchecked(request2.response(Collections.emptyList()));
-        Assert.assertEquals(EP2, Iterables.getOnlyElement(coordinator.mergedSchemasFrom));
+        request2.right.onResponse(Message.remoteResponse(request2.left, Verb.SCHEMA_PULL_RSP, Collections.emptyList()));
+        Assert.assertEquals(EP2, Iterables.getOnlyElement(wrapper.mergedSchemasFrom));
         Assert.assertTrue(coordinator.awaitSchemaRequests(1));
 
         // and migration tasks should not be sent out for subsequent version reports
         getUnchecked(coordinator.reportEndpointVersion(EP3, V1));
-        Assert.assertTrue(coordinator.requests.isEmpty());
-
+        Assert.assertTrue(wrapper.requests.isEmpty());
     }
 
     /**
@@ -179,14 +216,14 @@
     @Test
     public void versionsAreSignaledWhenDeleted()
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
+        Wrapper wrapper = new Wrapper();
 
-        coordinator.reportEndpointVersion(EP1, V1);
-        WaitQueue.Signal signal = coordinator.getVersionInfoUnsafe(V1).register();
+        wrapper.coordinator.reportEndpointVersion(EP1, V1);
+        WaitQueue.Signal signal = wrapper.coordinator.getVersionInfoUnsafe(V1).register();
         Assert.assertFalse(signal.isSignalled());
 
-        coordinator.reportEndpointVersion(EP1, V2);
-        Assert.assertNull(coordinator.getVersionInfoUnsafe(V1));
+        wrapper.coordinator.reportEndpointVersion(EP1, V2);
+        Assert.assertNull(wrapper.coordinator.getVersionInfoUnsafe(V1));
 
         Assert.assertTrue(signal.isSignalled());
     }
@@ -199,31 +236,31 @@
     @Test
     public void versionsAreSignaledWhenEndpointsRemoved()
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
+        Wrapper wrapper = new Wrapper();
 
-        coordinator.reportEndpointVersion(EP1, V1);
-        WaitQueue.Signal signal = coordinator.getVersionInfoUnsafe(V1).register();
+        wrapper.coordinator.reportEndpointVersion(EP1, V1);
+        WaitQueue.Signal signal = wrapper.coordinator.getVersionInfoUnsafe(V1).register();
         Assert.assertFalse(signal.isSignalled());
 
-        coordinator.removeAndIgnoreEndpoint(EP1);
-        Assert.assertNull(coordinator.getVersionInfoUnsafe(V1));
+        wrapper.coordinator.removeAndIgnoreEndpoint(EP1);
+        Assert.assertNull(wrapper.coordinator.getVersionInfoUnsafe(V1));
 
         Assert.assertTrue(signal.isSignalled());
     }
 
 
-    private static void assertNoContact(InstrumentedCoordinator coordinator, InetAddressAndPort endpoint, UUID version, boolean startupShouldBeUnblocked)
+    private static void assertNoContact(Wrapper wrapper, InetAddressAndPort endpoint, UUID version, boolean startupShouldBeUnblocked)
     {
-        Assert.assertTrue(coordinator.requests.isEmpty());
-        Future<Void> future = coordinator.reportEndpointVersion(EP1, V1);
+        Assert.assertTrue(wrapper.requests.isEmpty());
+        Future<Void> future = wrapper.coordinator.reportEndpointVersion(EP1, V1);
         if (future != null)
             getUnchecked(future);
-        Assert.assertTrue(coordinator.requests.isEmpty());
+        Assert.assertTrue(wrapper.requests.isEmpty());
 
-        Assert.assertEquals(startupShouldBeUnblocked, coordinator.awaitSchemaRequests(1));
+        Assert.assertEquals(startupShouldBeUnblocked, wrapper.coordinator.awaitSchemaRequests(1));
     }
 
-    private static void assertNoContact(InstrumentedCoordinator coordinator, boolean startupShouldBeUnblocked)
+    private static void assertNoContact(Wrapper coordinator, boolean startupShouldBeUnblocked)
     {
         assertNoContact(coordinator, EP1, V1, startupShouldBeUnblocked);
     }
@@ -231,91 +268,85 @@
     @Test
     public void dontContactNodesWithSameSchema()
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
+        Wrapper wrapper = new Wrapper();
 
-        coordinator.localVersion = V1;
-        assertNoContact(coordinator, true);
+        wrapper.localSchemaVersion = V1;
+        assertNoContact(wrapper, true);
     }
 
     @Test
     public void dontContactIncompatibleNodes()
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
+        Wrapper wrapper = new Wrapper();
 
-        coordinator.shouldPullFromEndpoint = false;
-        assertNoContact(coordinator, false);
+        when(wrapper.gossiper.getEndpointStateForEndpoint(any())).thenReturn(null); // shouldPullFromEndpoint should return false in this case
+        assertNoContact(wrapper, false);
     }
 
     @Test
     public void dontContactDeadNodes()
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
+        Wrapper wrapper = new Wrapper();
 
-        coordinator.deadNodes.add(EP1);
-        assertNoContact(coordinator, EP1, V1, false);
+        when(wrapper.gossiper.isAlive(ArgumentMatchers.eq(EP1))).thenReturn(false);
+        assertNoContact(wrapper, EP1, V1, false);
     }
 
     /**
-     * If a node has become incompativle between when the task was scheduled and when it
+     * If a node has become incompatible between when the task was scheduled and when it
      * was run, we should detect that and fail the task
      */
     @Test
     public void testGossipRace()
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator() {
-            protected boolean shouldPullImmediately(InetAddressAndPort endpoint, UUID version)
-            {
-                // this is the last thing that gets called before scheduling the pull, so set this flag here
-                shouldPullFromEndpoint = false;
-                return super.shouldPullImmediately(endpoint, version);
-            }
-        };
+        Wrapper wrapper = new Wrapper();
+        when(wrapper.gossiper.getEndpointStateForEndpoint(any())).thenReturn(validEndpointState, (EndpointState) null);
 
-        Assert.assertTrue(coordinator.shouldPullFromEndpoint(EP1));
-        assertNoContact(coordinator, EP1, V1, false);
+        assertNoContact(wrapper, EP1, V1, false);
     }
 
     @Test
     public void testWeKeepSendingRequests() throws Exception
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
+        Wrapper wrapper = new Wrapper();
 
-        getUnchecked(coordinator.reportEndpointVersion(EP3, V2));
-        coordinator.requests.remove().response(Collections.emptyList());
+        getUnchecked(wrapper.coordinator.reportEndpointVersion(EP3, V2));
+        Pair<InetAddressAndPort, RequestCallback<Collection<Mutation>>> cb = wrapper.requests.remove();
+        cb.right.onResponse(Message.remoteResponse(cb.left, Verb.SCHEMA_PULL_RSP, Collections.emptyList()));
 
-        getUnchecked(coordinator.reportEndpointVersion(EP1, V1));
-        getUnchecked(coordinator.reportEndpointVersion(EP2, V1));
+        getUnchecked(wrapper.coordinator.reportEndpointVersion(EP1, V1));
+        getUnchecked(wrapper.coordinator.reportEndpointVersion(EP2, V1));
 
-        MigrationCoordinator.Callback prev = null;
+        Pair<InetAddressAndPort, RequestCallback<Collection<Mutation>>> prev = null;
         Set<InetAddressAndPort> EPs = Sets.newHashSet(EP1, EP2);
         int ep1requests = 0;
         int ep2requests = 0;
 
-        for (int i=0; i<10; i++)
+        for (int i = 0; i < 10; i++)
         {
-            Assert.assertEquals(String.format("%s", i), 2, coordinator.requests.size());
+            Assert.assertEquals(String.format("%s", i), 2, wrapper.requests.size());
 
-            MigrationCoordinator.Callback next = coordinator.requests.remove();
+            Pair<InetAddressAndPort, RequestCallback<Collection<Mutation>>> next = wrapper.requests.remove();
 
             // we should be contacting endpoints in a round robin fashion
-            Assert.assertTrue(EPs.contains(next.endpoint));
-            if (prev != null && prev.endpoint.equals(next.endpoint))
-                Assert.fail(String.format("Not expecting prev %s to be equal to next %s", prev.endpoint, next.endpoint));
+            Assert.assertTrue(EPs.contains(next.left));
+            if (prev != null && prev.left.equals(next.left))
+                Assert.fail(String.format("Not expecting prev %s to be equal to next %s", prev.left, next.left));
 
             // should send a new request
-            next.fail().get();
+            next.right.onFailure(null, null);
             prev = next;
-            Assert.assertFalse(coordinator.awaitSchemaRequests(1));
+            Assert.assertFalse(wrapper.coordinator.awaitSchemaRequests(1));
 
-            Assert.assertEquals(2, coordinator.requests.size());
+            Assert.assertEquals(2, wrapper.requests.size());
         }
         logger.info("{} -> {}", EP1, ep1requests);
         logger.info("{} -> {}", EP2, ep2requests);
 
         // a single success should unblock startup though
-        coordinator.requests.remove().response(Collections.emptyList());
-        Assert.assertTrue(coordinator.awaitSchemaRequests(1));
-
+        cb = wrapper.requests.remove();
+        cb.right.onResponse(Message.remoteResponse(cb.left, Verb.SCHEMA_PULL_RSP, Collections.emptyList()));
+        Assert.assertTrue(wrapper.coordinator.awaitSchemaRequests(1));
     }
 
     /**
@@ -325,15 +356,88 @@
     @Test
     public void pullUnreceived()
     {
-        InstrumentedCoordinator coordinator = new InstrumentedCoordinator();
+        Wrapper wrapper = new Wrapper();
 
-        coordinator.shouldPullFromEndpoint = false;
-        assertNoContact(coordinator, false);
+        when(wrapper.gossiper.getEndpointStateForEndpoint(any())).thenReturn(null); // shouldPullFromEndpoint should return false in this case
+        assertNoContact(wrapper, false);
 
-        coordinator.shouldPullFromEndpoint = true;
-        Assert.assertEquals(0, coordinator.requests.size());
-        List<Future<Void>> futures = coordinator.pullUnreceivedSchemaVersions();
-        futures.forEach(Futures::getUnchecked);
-        Assert.assertEquals(1, coordinator.requests.size());
+        when(wrapper.gossiper.getEndpointStateForEndpoint(any())).thenReturn(validEndpointState);
+        Assert.assertEquals(0, wrapper.requests.size());
+        wrapper.coordinator.start();
+        Assert.assertEquals(1, wrapper.requests.size());
+    }
+
+    @Test
+    public void pushSchemaMutationsOnlyToViableNodes() throws UnknownHostException
+    {
+        Wrapper wrapper = new Wrapper();
+        Collection<Mutation> mutations = Arrays.asList(mock(Mutation.class));
+
+        EndpointState validState = mock(EndpointState.class);
+
+        InetAddressAndPort thisNode = wrapper.configureMocksForEndpoint(FBUtilities.getBroadcastAddressAndPort(), validState, MessagingService.current_version, false);
+        InetAddressAndPort unkonwnNode = wrapper.configureMocksForEndpoint("10.0.0.1:8000", validState, null, false);
+        InetAddressAndPort invalidMessagingVersionNode = wrapper.configureMocksForEndpoint("10.0.0.2:8000", validState, MessagingService.VERSION_30, false);
+        InetAddressAndPort regularNode = wrapper.configureMocksForEndpoint("10.0.0.3:8000", validState, MessagingService.current_version, false);
+
+        when(wrapper.gossiper.getLiveMembers()).thenReturn(Sets.newHashSet(thisNode, unkonwnNode, invalidMessagingVersionNode, regularNode));
+
+        ArgumentCaptor<Message> msg = ArgumentCaptor.forClass(Message.class);
+        ArgumentCaptor<InetAddressAndPort> targetEndpoint = ArgumentCaptor.forClass(InetAddressAndPort.class);
+        doNothing().when(wrapper.messagingService).send(msg.capture(), targetEndpoint.capture());
+
+        Pair<Set<InetAddressAndPort>, Set<InetAddressAndPort>> result = wrapper.coordinator.pushSchemaMutations(mutations);
+        assertThat(result.left()).containsExactlyInAnyOrder(regularNode);
+        assertThat(result.right()).containsExactlyInAnyOrder(thisNode, unkonwnNode, invalidMessagingVersionNode);
+        assertThat(msg.getAllValues()).hasSize(1);
+        assertThat(msg.getValue().payload).isEqualTo(mutations);
+        assertThat(msg.getValue().verb()).isEqualTo(Verb.SCHEMA_PUSH_REQ);
+        assertThat(targetEndpoint.getValue()).isEqualTo(regularNode);
+    }
+
+    @Test
+    public void reset() throws UnknownHostException
+    {
+        Collection<Mutation> mutations = Arrays.asList(mock(Mutation.class));
+
+        Wrapper wrapper = new Wrapper();
+        wrapper.localSchemaVersion = SchemaConstants.emptyVersion;
+
+        EndpointState invalidVersionState = mock(EndpointState.class);
+        when(invalidVersionState.getApplicationState(ApplicationState.RELEASE_VERSION)).thenReturn(VersionedValue.unsafeMakeVersionedValue("3.0", 0));
+        when(invalidVersionState.getSchemaVersion()).thenReturn(V1);
+
+        EndpointState validVersionState = mock(EndpointState.class);
+        when(validVersionState.getApplicationState(ApplicationState.RELEASE_VERSION)).thenReturn(VersionedValue.unsafeMakeVersionedValue(FBUtilities.getReleaseVersionString(), 0));
+        when(validVersionState.getSchemaVersion()).thenReturn(V2);
+
+        EndpointState localVersionState = mock(EndpointState.class);
+        when(localVersionState.getApplicationState(ApplicationState.RELEASE_VERSION)).thenReturn(VersionedValue.unsafeMakeVersionedValue(FBUtilities.getReleaseVersionString(), 0));
+        when(localVersionState.getSchemaVersion()).thenReturn(SchemaConstants.emptyVersion);
+
+        // some nodes
+        InetAddressAndPort thisNode = wrapper.configureMocksForEndpoint(FBUtilities.getBroadcastAddressAndPort(), localVersionState, MessagingService.current_version, false);
+        InetAddressAndPort noStateNode = wrapper.configureMocksForEndpoint("10.0.0.1:8000", null, MessagingService.current_version, false);
+        InetAddressAndPort diffMajorVersionNode = wrapper.configureMocksForEndpoint("10.0.0.2:8000", invalidVersionState, MessagingService.current_version, false);
+        InetAddressAndPort unkonwnNode = wrapper.configureMocksForEndpoint("10.0.0.2:8000", validVersionState, null, false);
+        InetAddressAndPort invalidMessagingVersionNode = wrapper.configureMocksForEndpoint("10.0.0.3:8000", validVersionState, MessagingService.VERSION_30, false);
+        InetAddressAndPort gossipOnlyMemberNode = wrapper.configureMocksForEndpoint("10.0.0.4:8000", validVersionState, MessagingService.current_version, true);
+        InetAddressAndPort regularNode1 = wrapper.configureMocksForEndpoint("10.0.0.5:8000", validVersionState, MessagingService.current_version, false);
+        InetAddressAndPort regularNode2 = wrapper.configureMocksForEndpoint("10.0.0.6:8000", validVersionState, MessagingService.current_version, false);
+        Set<InetAddressAndPort> nodes = new LinkedHashSet<>(Arrays.asList(thisNode, noStateNode, diffMajorVersionNode, unkonwnNode, invalidMessagingVersionNode, gossipOnlyMemberNode, regularNode1, regularNode2));
+        when(wrapper.gossiper.getLiveMembers()).thenReturn(nodes);
+        doAnswer(a -> {
+            Message msg = a.getArgument(0, Message.class);
+            InetAddressAndPort endpoint = a.getArgument(1, InetAddressAndPort.class);
+            RequestCallback callback = a.getArgument(2, RequestCallback.class);
+
+            assertThat(msg.verb()).isEqualTo(Verb.SCHEMA_PULL_REQ);
+            assertThat(endpoint).isEqualTo(regularNode1);
+            callback.onResponse(Message.remoteResponse(regularNode1, Verb.SCHEMA_PULL_RSP, mutations));
+            return null;
+        }).when(wrapper.messagingService).sendWithCallback(any(Message.class), any(InetAddressAndPort.class), any(RequestCallback.class));
+        wrapper.coordinator.reset();
+        assertThat(wrapper.mergedSchemasFrom).anyMatch(ep -> regularNode1.equals(ep) || regularNode2.equals(ep));
+        assertThat(wrapper.mergedSchemasFrom).hasSize(1);
     }
 }
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/schema/MigrationManagerDropKSTest.java b/test/unit/org/apache/cassandra/schema/MigrationManagerDropKSTest.java
index e28a0df..c045b55 100644
--- a/test/unit/org/apache/cassandra/schema/MigrationManagerDropKSTest.java
+++ b/test/unit/org/apache/cassandra/schema/MigrationManagerDropKSTest.java
@@ -24,6 +24,7 @@
 import org.junit.rules.ExpectedException;
 
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Directories;
@@ -54,6 +55,7 @@
                                     SchemaLoader.standardCFMD(KEYSPACE1, TABLE1),
                                     SchemaLoader.standardCFMD(KEYSPACE1, TABLE2));
     }
+
     @Test
     public void dropKS() throws ConfigurationException
     {
@@ -70,10 +72,10 @@
                                            "dropKs", "col" + i, "anyvalue");
         ColumnFamilyStore cfs = Keyspace.open(cfm.keyspace).getColumnFamilyStore(cfm.name);
         assertNotNull(cfs);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         assertTrue(!cfs.getDirectories().sstableLister(Directories.OnTxnErr.THROW).list().isEmpty());
 
-        MigrationManager.announceKeyspaceDrop(ks.name);
+        SchemaTestUtil.announceKeyspaceDrop(ks.name);
 
         assertNull(Schema.instance.getKeyspaceMetadata(ks.name));
 
diff --git a/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java b/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java
index 9a26032..e1556b7 100644
--- a/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java
+++ b/test/unit/org/apache/cassandra/schema/MigrationManagerTest.java
@@ -18,14 +18,13 @@
 
 package org.apache.cassandra.schema;
 
-import java.io.File;
 import java.nio.ByteBuffer;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Optional;
 import java.util.function.Supplier;
 
 import com.google.common.collect.ImmutableMap;
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
@@ -39,7 +38,6 @@
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Directories;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
 import org.apache.cassandra.db.marshal.ByteType;
 import org.apache.cassandra.db.marshal.BytesType;
@@ -50,7 +48,6 @@
 import org.apache.cassandra.locator.NetworkTopologyStrategy;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static java.util.Collections.singleton;
 import static org.apache.cassandra.Util.throwAssert;
 import static org.apache.cassandra.cql3.CQLTester.assertRows;
 import static org.apache.cassandra.cql3.CQLTester.row;
@@ -85,7 +82,7 @@
                                     SchemaLoader.standardCFMD(KEYSPACE1, TABLE2));
         SchemaLoader.createKeyspace(KEYSPACE3,
                                     KeyspaceParams.simple(5),
-                                    SchemaLoader.standardCFMD(KEYSPACE1, TABLE1),
+                                    SchemaLoader.standardCFMD(KEYSPACE3, TABLE1),
                                     SchemaLoader.compositeIndexCFMD(KEYSPACE3, TABLE1i, true));
         SchemaLoader.createKeyspace(KEYSPACE6,
                                     KeyspaceParams.simple(1),
@@ -148,7 +145,7 @@
         TableMetadata newCf = addTestTable("MadeUpKeyspace", "NewCF", "new cf");
         try
         {
-            MigrationManager.announceNewTable(newCf);
+            SchemaTestUtil.announceNewTable(newCf);
             throw new AssertionError("You shouldn't be able to do anything to a keyspace that doesn't exist.");
         }
         catch (ConfigurationException expected)
@@ -166,7 +163,7 @@
         TableMetadata cfm = addTestTable(original.name, tableName, "A New Table");
 
         assertFalse(Schema.instance.getKeyspaceMetadata(ksName).tables.get(cfm.name).isPresent());
-        MigrationManager.announceNewTable(cfm);
+        SchemaTestUtil.announceNewTable(cfm);
 
         assertTrue(Schema.instance.getKeyspaceMetadata(ksName).tables.get(cfm.name).isPresent());
         assertEquals(cfm, Schema.instance.getKeyspaceMetadata(ksName).tables.get(cfm.name).get());
@@ -179,7 +176,7 @@
         // flush to exercise more than just hitting the memtable
         ColumnFamilyStore cfs = Keyspace.open(ksName).getColumnFamilyStore(tableName);
         assertNotNull(cfs);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         // and make sure we get out what we put in
         UntypedResultSet rows = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s", ksName, tableName));
@@ -202,10 +199,10 @@
                                            "dropCf", "col" + i, "anyvalue");
         ColumnFamilyStore store = Keyspace.open(cfm.keyspace).getColumnFamilyStore(cfm.name);
         assertNotNull(store);
-        store.forceBlockingFlush();
+        Util.flush(store);
         assertTrue(store.getDirectories().sstableLister(Directories.OnTxnErr.THROW).list().size() > 0);
 
-        MigrationManager.announceTableDrop(ks.name, cfm.name, false);
+        SchemaTestUtil.announceTableDrop(ks.name, cfm.name);
 
         assertFalse(Schema.instance.getKeyspaceMetadata(ks.name).tables.get(cfm.name).isPresent());
 
@@ -227,7 +224,7 @@
         Supplier<Object> lambda = () -> {
             for (File file : store.getDirectories().sstableLister(Directories.OnTxnErr.THROW).listFiles())
             {
-                if (file.getPath().endsWith("Data.db") && !new File(file.getPath().replace("Data.db", "Compacted")).exists())
+                if (file.path().endsWith("Data.db") && !new File(file.path().replace("Data.db", "Compacted")).exists())
                     return false;
             }
             return true;
@@ -241,7 +238,7 @@
     {
         TableMetadata cfm = addTestTable("newkeyspace1", "newstandard1", "A new cf for a new ks");
         KeyspaceMetadata newKs = KeyspaceMetadata.create(cfm.keyspace, KeyspaceParams.simple(5), Tables.of(cfm));
-        MigrationManager.announceNewKeyspace(newKs);
+        SchemaTestUtil.announceNewKeyspace(newKs);
 
         assertNotNull(Schema.instance.getKeyspaceMetadata(cfm.keyspace));
         assertEquals(Schema.instance.getKeyspaceMetadata(cfm.keyspace), newKs);
@@ -251,7 +248,7 @@
                                        "key0", "col0", "val0");
         ColumnFamilyStore store = Keyspace.open(cfm.keyspace).getColumnFamilyStore(cfm.name);
         assertNotNull(store);
-        store.forceBlockingFlush();
+        Util.flush(store);
 
         UntypedResultSet rows = QueryProcessor.executeInternal("SELECT * FROM newkeyspace1.newstandard1");
         assertRows(rows, row("key0", "col0", "val0"));
@@ -272,7 +269,7 @@
                                                          KEYSPACE3, TABLE1),
                                            "dropKs", "col" + i, "anyvalue");
 
-        MigrationManager.announceKeyspaceDrop(ks.name);
+        SchemaTestUtil.announceKeyspaceDrop(ks.name);
 
         assertNull(Schema.instance.getKeyspaceMetadata(ks.name));
     }
@@ -282,7 +279,7 @@
     {
         assertNull(Schema.instance.getKeyspaceMetadata(EMPTY_KEYSPACE));
         KeyspaceMetadata newKs = KeyspaceMetadata.create(EMPTY_KEYSPACE, KeyspaceParams.simple(5));
-        MigrationManager.announceNewKeyspace(newKs);
+        SchemaTestUtil.announceNewKeyspace(newKs);
         assertNotNull(Schema.instance.getKeyspaceMetadata(EMPTY_KEYSPACE));
 
         String tableName = "added_later";
@@ -292,7 +289,7 @@
         assertFalse(Schema.instance.getKeyspaceMetadata(newKs.name).tables.get(newCf.name).isPresent());
 
         //add the new CF to the empty space
-        MigrationManager.announceNewTable(newCf);
+        SchemaTestUtil.announceNewTable(newCf);
 
         assertTrue(Schema.instance.getKeyspaceMetadata(newKs.name).tables.get(newCf.name).isPresent());
         assertEquals(Schema.instance.getKeyspaceMetadata(newKs.name).tables.get(newCf.name).get(), newCf);
@@ -304,7 +301,7 @@
 
         ColumnFamilyStore cfs = Keyspace.open(newKs.name).getColumnFamilyStore(newCf.name);
         assertNotNull(cfs);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         UntypedResultSet rows = QueryProcessor.executeInternal(String.format("SELECT * FROM %s.%s", EMPTY_KEYSPACE, tableName));
         assertRows(rows, row("key0", "col0", "val0"));
@@ -317,7 +314,7 @@
         TableMetadata cf = addTestTable("UpdatedKeyspace", "AddedStandard1", "A new cf for a new ks");
         KeyspaceMetadata oldKs = KeyspaceMetadata.create(cf.keyspace, KeyspaceParams.simple(5), Tables.of(cf));
 
-        MigrationManager.announceNewKeyspace(oldKs);
+        SchemaTestUtil.announceNewKeyspace(oldKs);
 
         assertNotNull(Schema.instance.getKeyspaceMetadata(cf.keyspace));
         assertEquals(Schema.instance.getKeyspaceMetadata(cf.keyspace), oldKs);
@@ -326,7 +323,7 @@
         KeyspaceMetadata newBadKs2 = KeyspaceMetadata.create(cf.keyspace + "trash", KeyspaceParams.simple(4));
         try
         {
-            MigrationManager.announceKeyspaceUpdate(newBadKs2);
+            SchemaTestUtil.announceKeyspaceUpdate(newBadKs2);
             throw new AssertionError("Should not have been able to update a KS with an invalid KS name.");
         }
         catch (ConfigurationException ex)
@@ -339,7 +336,7 @@
         replicationMap.put("replication_factor", "1");
 
         KeyspaceMetadata newKs = KeyspaceMetadata.create(cf.keyspace, KeyspaceParams.create(true, replicationMap));
-        MigrationManager.announceKeyspaceUpdate(newKs);
+        SchemaTestUtil.announceKeyspaceUpdate(newKs);
 
         KeyspaceMetadata newFetchedKs = Schema.instance.getKeyspaceMetadata(newKs.name);
         assertEquals(newFetchedKs.params.replication.klass, newKs.params.replication.klass);
@@ -459,7 +456,7 @@
                                                     TABLE1i),
                                        "key0", "col0", 1L, 1L);
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         ColumnFamilyStore indexCfs = cfs.indexManager.getIndexByName(indexName)
                                                      .getBackingTable()
                                                      .orElseThrow(throwAssert("Cannot access index cfs"));
@@ -471,7 +468,7 @@
                                      .get(indexName)
                                      .orElseThrow(throwAssert("Index not found"));
 
-        MigrationManager.announceTableUpdate(meta.unbuild().indexes(meta.indexes.without(existing.name)).build());
+        SchemaTestUtil.announceTableUpdate(meta.unbuild().indexes(meta.indexes.without(existing.name)).build());
 
         // check
         assertTrue(cfs.indexManager.listIndexes().isEmpty());
@@ -520,11 +517,14 @@
         TableMetadata table = addTestTable("ks0", "t", "");
         KeyspaceMetadata keyspace = KeyspaceMetadata.create("ks0", KeyspaceParams.simple(1), Tables.of(table));
 
-        Optional<Mutation> mutation = MigrationManager.evolveSystemKeyspace(keyspace, 0);
-        assertTrue(mutation.isPresent());
+        SchemaTransformation transformation = SchemaTransformations.updateSystemKeyspace(keyspace, 0);
+        Keyspaces before = Keyspaces.none();
+        Keyspaces after = transformation.apply(before);
+        Keyspaces.KeyspacesDiff diff = Keyspaces.diff(before, after);
 
-        Schema.instance.merge(singleton(mutation.get()));
-        assertEquals(keyspace, Schema.instance.getKeyspaceMetadata("ks0"));
+        assertTrue(diff.altered.isEmpty());
+        assertTrue(diff.dropped.isEmpty());
+        assertEquals(keyspace, diff.created.getNullable("ks0"));
     }
 
     @Test
@@ -533,12 +533,12 @@
         TableMetadata table = addTestTable("ks1", "t", "");
         KeyspaceMetadata keyspace = KeyspaceMetadata.create("ks1", KeyspaceParams.simple(1), Tables.of(table));
 
-        // create the keyspace, verify it's there
-        Schema.instance.merge(singleton(SchemaKeyspace.makeCreateKeyspaceMutation(keyspace, 0).build()));
-        assertEquals(keyspace, Schema.instance.getKeyspaceMetadata("ks1"));
+        SchemaTransformation transformation = SchemaTransformations.updateSystemKeyspace(keyspace, 0);
+        Keyspaces before = Keyspaces.of(keyspace);
+        Keyspaces after = transformation.apply(before);
+        Keyspaces.KeyspacesDiff diff = Keyspaces.diff(before, after);
 
-        Optional<Mutation> mutation = MigrationManager.evolveSystemKeyspace(keyspace, 0);
-        assertFalse(mutation.isPresent());
+        assertTrue(diff.isEmpty());
     }
 
     @Test
@@ -547,18 +547,18 @@
         TableMetadata table0 = addTestTable("ks2", "t", "");
         KeyspaceMetadata keyspace0 = KeyspaceMetadata.create("ks2", KeyspaceParams.simple(1), Tables.of(table0));
 
-        // create the keyspace, verify it's there
-        Schema.instance.merge(singleton(SchemaKeyspace.makeCreateKeyspaceMutation(keyspace0, 0).build()));
-        assertEquals(keyspace0, Schema.instance.getKeyspaceMetadata("ks2"));
-
         TableMetadata table1 = table0.unbuild().comment("comment").build();
         KeyspaceMetadata keyspace1 = KeyspaceMetadata.create("ks2", KeyspaceParams.simple(1), Tables.of(table1));
 
-        Optional<Mutation> mutation = MigrationManager.evolveSystemKeyspace(keyspace1, 1);
-        assertTrue(mutation.isPresent());
+        SchemaTransformation transformation = SchemaTransformations.updateSystemKeyspace(keyspace1, 1);
+        Keyspaces before = Keyspaces.of(keyspace0);
+        Keyspaces after = transformation.apply(before);
+        Keyspaces.KeyspacesDiff diff = Keyspaces.diff(before, after);
 
-        Schema.instance.merge(singleton(mutation.get()));
-        assertEquals(keyspace1, Schema.instance.getKeyspaceMetadata("ks2"));
+        assertTrue(diff.created.isEmpty());
+        assertTrue(diff.dropped.isEmpty());
+        assertEquals(1, diff.altered.size());
+        assertEquals(keyspace1, diff.altered.get(0).after);
     }
 
     private TableMetadata addTestTable(String ks, String cf, String comment)
diff --git a/test/unit/org/apache/cassandra/schema/MockSchema.java b/test/unit/org/apache/cassandra/schema/MockSchema.java
index 194f3db..f5c9986 100644
--- a/test/unit/org/apache/cassandra/schema/MockSchema.java
+++ b/test/unit/org/apache/cassandra/schema/MockSchema.java
@@ -18,28 +18,37 @@
 */
 package org.apache.cassandra.schema;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
+import java.util.function.Supplier;
 
 import com.google.common.collect.ImmutableSet;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.db.marshal.UTF8Type;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.db.memtable.SkipListMemtable;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.io.sstable.Component;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.IndexSummary;
+import org.apache.cassandra.io.sstable.SSTableId;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.sstable.metadata.MetadataCollector;
 import org.apache.cassandra.io.sstable.metadata.MetadataType;
 import org.apache.cassandra.io.sstable.metadata.StatsMetadata;
 import org.apache.cassandra.io.util.ChannelProxy;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileHandle;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.io.util.Memory;
@@ -50,6 +59,21 @@
 
 public class MockSchema
 {
+    public static Supplier<? extends SSTableId> sstableIdGenerator = Util.newSeqGen();
+
+    public static final ConcurrentMap<Integer, SSTableId> sstableIds = new ConcurrentHashMap<>();
+
+    public static SSTableId sstableId(int idx)
+    {
+        return sstableIds.computeIfAbsent(idx, ignored -> sstableIdGenerator.get());
+    }
+
+    public static Collection<Object[]> sstableIdGenerators()
+    {
+        return Arrays.asList(new Object[]{ Util.newSeqGen() },
+                             new Object[]{ Util.newUUIDGen() });
+    }
+
     static
     {
         Memory offsets = Memory.allocate(4);
@@ -65,7 +89,7 @@
 
     public static Memtable memtable(ColumnFamilyStore cfs)
     {
-        return new Memtable(cfs.metadata());
+        return SkipListMemtable.FACTORY.create(null, cfs.metadata, cfs);
     }
 
     public static SSTableReader sstable(int generation, ColumnFamilyStore cfs)
@@ -122,18 +146,12 @@
         Descriptor descriptor = new Descriptor(cfs.getDirectories().getDirectoryForNewSSTables(),
                                                cfs.keyspace.getName(),
                                                cfs.getTableName(),
-                                               generation, SSTableFormat.Type.BIG);
+                                               sstableId(generation), SSTableFormat.Type.BIG);
         Set<Component> components = ImmutableSet.of(Component.DATA, Component.PRIMARY_INDEX, Component.FILTER, Component.TOC);
         for (Component component : components)
         {
             File file = new File(descriptor.filenameFor(component));
-            try
-            {
-                file.createNewFile();
-            }
-            catch (IOException e)
-            {
-            }
+            file.createFileIfNotExists();
         }
         // .complete() with size to make sstable.onDiskLength work
         try (FileHandle.Builder builder = new FileHandle.Builder(new ChannelProxy(tempFile)).bufferSize(size);
@@ -144,10 +162,7 @@
                 try
                 {
                     File file = new File(descriptor.filenameFor(Component.DATA));
-                    try (RandomAccessFile raf = new RandomAccessFile(file, "rw"))
-                    {
-                        raf.setLength(size);
-                    }
+                    Util.setFileLength(file, size);
                 }
                 catch (IOException e)
                 {
@@ -194,7 +209,7 @@
 
     public static ColumnFamilyStore newCFS(TableMetadata metadata)
     {
-        return new ColumnFamilyStore(ks, metadata.name, 0, new TableMetadataRef(metadata), new Directories(metadata), false, false, false);
+        return new ColumnFamilyStore(ks, metadata.name, Util.newSeqGen(), new TableMetadataRef(metadata), new Directories(metadata), false, false, false);
     }
 
     public static TableMetadata newTableMetadata(String ksname)
@@ -242,7 +257,7 @@
             File dir = new File(dirName);
             if (!dir.exists())
                 continue;
-            String[] children = dir.list();
+            String[] children = dir.tryListNames();
             for (String child : children)
                 FileUtils.deleteRecursive(new File(dir, child));
         }
diff --git a/test/unit/org/apache/cassandra/schema/RemoveWithoutDroppingTest.java b/test/unit/org/apache/cassandra/schema/RemoveWithoutDroppingTest.java
new file mode 100644
index 0000000..9c3271b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/schema/RemoveWithoutDroppingTest.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.schema;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.schema.SchemaTransformation.SchemaTransformationResult;
+import org.mockito.Mockito;
+
+import static org.apache.cassandra.cql3.QueryProcessor.executeInternal;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class RemoveWithoutDroppingTest
+{
+    static volatile boolean dropDataOverride = true;
+
+    static final SchemaChangeListener listener = Mockito.mock(SchemaChangeListener.class);
+
+    @BeforeClass
+    public static void beforeClass()
+    {
+        System.setProperty(SchemaUpdateHandlerFactoryProvider.SUH_FACTORY_CLASS_PROPERTY, TestSchemaUpdateHandlerFactory.class.getName());
+        CQLTester.prepareServer();
+        Schema.instance.registerListener(listener);
+    }
+
+    @Before
+    public void before()
+    {
+        Mockito.reset(listener);
+    }
+
+    public static void callbackOverride(BiConsumer<SchemaTransformationResult, Boolean> updateSchemaCallback, SchemaTransformationResult result, boolean dropData)
+    {
+        updateSchemaCallback.accept(result, dropDataOverride);
+    }
+
+    public static class TestSchemaUpdateHandlerFactory implements SchemaUpdateHandlerFactory
+    {
+        @Override
+        public SchemaUpdateHandler getSchemaUpdateHandler(boolean online, BiConsumer<SchemaTransformationResult, Boolean> updateSchemaCallback)
+        {
+            return online
+                   ? new DefaultSchemaUpdateHandler((result, dropData) -> callbackOverride(updateSchemaCallback, result, dropData))
+                   : new OfflineSchemaUpdateHandler((result, dropData) -> callbackOverride(updateSchemaCallback, result, dropData));
+        }
+    }
+
+    private void testRemoveKeyspace(String ks, String tab, boolean expectDropped) throws Throwable
+    {
+        executeInternal(String.format("CREATE KEYSPACE IF NOT EXISTS %s WITH replication = {'class': 'SimpleStrategy', 'replication_factor': '1'}", ks));
+        executeInternal(String.format("CREATE TABLE %s.%s (id INT PRIMARY KEY, v INT)", ks, tab));
+        executeInternal(String.format("INSERT INTO %s.%s (id, v) VALUES (?, ?)", ks, tab), 1, 2);
+        executeInternal(String.format("INSERT INTO %s.%s (id, v) VALUES (?, ?)", ks, tab), 3, 4);
+        ColumnFamilyStore cfs = ColumnFamilyStore.getIfExists(ks, tab);
+        cfs.forceFlush(ColumnFamilyStore.FlushReason.UNIT_TESTS).get();
+
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(ks);
+        TableMetadata tm = Schema.instance.getTableMetadata(ks, tab);
+
+        List<File> directories = cfs.getDirectories().getCFDirectories();
+        Set<File> filesBefore = directories.stream().flatMap(d -> Arrays.stream(d.tryList(f -> !f.isDirectory()))).collect(Collectors.toSet());
+        assertThat(filesBefore).isNotEmpty();
+
+        executeInternal(String.format("DROP KEYSPACE %s", ks));
+
+        Set<File> filesAfter = directories.stream().flatMap(d -> Arrays.stream(d.tryList(f -> !f.isDirectory()))).collect(Collectors.toSet());
+        if (expectDropped)
+            assertThat(filesAfter).isEmpty();
+        else
+            assertThat(filesAfter).hasSameElementsAs(filesBefore);
+
+        Mockito.verify(listener).onDropTable(tm, expectDropped);
+        Mockito.verify(listener).onDropKeyspace(ksm, expectDropped);
+    }
+
+    @Test
+    public void testRemoveWithoutDropping() throws Throwable
+    {
+        dropDataOverride = false;
+        String ks = "test_remove_without_dropping";
+        String tab = "test_table";
+        testRemoveKeyspace(ks, tab, false);
+    }
+
+    @Test
+    public void testRemoveWithDropping() throws Throwable
+    {
+        dropDataOverride = true;
+        String ks = "test_remove_with_dropping";
+        String tab = "test_table";
+        testRemoveKeyspace(ks, tab, true);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java b/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java
index 4a1ee57..e807730 100644
--- a/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java
+++ b/test/unit/org/apache/cassandra/schema/SchemaKeyspaceTest.java
@@ -19,10 +19,7 @@
 package org.apache.cassandra.schema;
 
 import java.io.IOException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
 import java.nio.ByteBuffer;
-import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -31,6 +28,7 @@
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
+import java.util.stream.Stream;
 
 import com.google.common.collect.ImmutableMap;
 
@@ -49,8 +47,14 @@
 import org.apache.cassandra.db.partitions.PartitionUpdate;
 import org.apache.cassandra.db.rows.UnfilteredRowIterators;
 import org.apache.cassandra.exceptions.ConfigurationException;
+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.reads.repair.ReadRepairStrategy;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
 import org.jboss.byteman.contrib.bmunit.BMRule;
 import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
 
@@ -71,25 +75,8 @@
         SchemaLoader.createKeyspace(KEYSPACE1,
                                     KeyspaceParams.simple(1),
                                     SchemaLoader.standardCFMD(KEYSPACE1, CF_STANDARD1));
-    }
 
-    /** See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes */
-    @Test
-    public void testSchemaPullSynchronicity() throws Exception
-    {
-        for (String methodName : Arrays.asList("schemaKeyspaceAsMutations",
-                                               "truncateSchemaKeyspace",
-                                               "saveSystemKeyspace",
-                                               "updateVersion"))
-        {
-            Method method = Schema.class.getDeclaredMethod(methodName);
-            assertTrue(Modifier.isSynchronized(method.getModifiers()));
-        }
-
-        Method method = Schema.class.getDeclaredMethod("merge", Collection.class);
-        assertTrue(Modifier.isSynchronized(method.getModifiers()));
-        method = Schema.class.getDeclaredMethod("transform", SchemaTransformation.class, boolean.class, long.class);
-        assertTrue(Modifier.isSynchronized(method.getModifiers()));
+        MessagingService.instance().listen();
     }
 
     /** See CASSANDRA-16856/16996. Make sure schema pulls are synchronized to prevent concurrent schema pull/writes */
@@ -104,7 +91,7 @@
         String keyspace = "sandbox";
         ExecutorService pool = Executors.newFixedThreadPool(2);
 
-        Schema.instance.truncateSchemaKeyspace();; // Make sure there's nothing but the create we're about to do
+        SchemaKeyspace.truncate(); // Make sure there's nothing but the create we're about to do
         CyclicBarrier barrier = new CyclicBarrier(2);
 
         Future<Void> creation = pool.submit(() -> {
@@ -115,19 +102,13 @@
 
         Future<Collection<Mutation>> mutationsFromThread = pool.submit(() -> {
             barrier.await();
-
-            Collection<Mutation> mutations = Schema.instance.schemaKeyspaceAsMutations();
-            // Make sure we actually have a mutation to check for partial modification.
-            while (mutations.size() == 0)
-                mutations = Schema.instance.schemaKeyspaceAsMutations();
-
-            return mutations;
+            return Stream.generate(this::getSchemaMutations).filter(m -> !m.isEmpty()).findFirst().get();
         });
 
         creation.get(); // make sure the creation is finished
 
         Collection<Mutation> mutationsFromConcurrentAccess = mutationsFromThread.get();
-        Collection<Mutation> settledMutations = Schema.instance.schemaKeyspaceAsMutations();
+        Collection<Mutation> settledMutations = getSchemaMutations();
 
         // If the worker thread picked up the creation at all, it should have the same modifications.
         // In other words, we should see all modifications or none.
@@ -144,10 +125,20 @@
         pool.shutdownNow();
     }
 
+    private Collection<Mutation> getSchemaMutations()
+    {
+        AsyncPromise<Collection<Mutation>> p = new AsyncPromise<>();
+        MessagingService.instance().sendWithCallback(Message.out(Verb.SCHEMA_PULL_REQ, NoPayload.noPayload),
+                                                     FBUtilities.getBroadcastAddressAndPort(),
+                                                     (RequestCallback<Collection<Mutation>>) msg -> p.setSuccess(msg.payload));
+        p.syncUninterruptibly();
+        return p.getNow();
+    }
+
     @Test
     public void testConversionsInverses() throws Exception
     {
-        for (String keyspaceName : Schema.instance.getNonSystemKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonSystemKeyspaces().names())
         {
             for (ColumnFamilyStore cfs : Keyspace.open(keyspaceName).getColumnFamilyStores())
             {
@@ -194,7 +185,7 @@
     {
         KeyspaceMetadata ksm = Schema.instance.getKeyspaceInstance(keyspace).getMetadata();
         Mutation mutation = SchemaKeyspace.makeUpdateTableMutation(ksm, oldTable, newTable, FBUtilities.timestampMicros()).build();
-        Schema.instance.merge(Collections.singleton(mutation));
+        SchemaTestUtil.mergeAndAnnounceLocally(Collections.singleton(mutation));
     }
 
     private static void createTable(String keyspace, String cql)
@@ -203,7 +194,7 @@
 
         KeyspaceMetadata ksm = KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1), Tables.of(table));
         Mutation mutation = SchemaKeyspace.makeCreateTableMutation(ksm, table, FBUtilities.timestampMicros()).build();
-        Schema.instance.merge(Collections.singleton(mutation));
+        SchemaTestUtil.mergeAndAnnounceLocally(Collections.singleton(mutation));
     }
 
     private static void checkInverses(TableMetadata metadata) throws Exception
diff --git a/test/unit/org/apache/cassandra/schema/SchemaMutationsSerializerTest.java b/test/unit/org/apache/cassandra/schema/SchemaMutationsSerializerTest.java
new file mode 100644
index 0000000..7680697
--- /dev/null
+++ b/test/unit/org/apache/cassandra/schema/SchemaMutationsSerializerTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.schema;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.io.util.DataInputBuffer;
+import org.apache.cassandra.io.util.DataOutputBuffer;
+import org.apache.cassandra.net.MessagingService;
+import org.assertj.core.api.Assertions;
+
+public class SchemaMutationsSerializerTest extends CQLTester
+{
+    @BeforeClass
+    public static void beforeClass()
+    {
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    @Test
+    public void testSerDe() throws IOException
+    {
+        createTable("CREATE TABLE %s (id INT PRIMARY KEY, v INT)");
+        Collection<Mutation> mutations = SchemaKeyspace.convertSchemaToMutations();
+        DataOutputBuffer out = new DataOutputBuffer();
+        SchemaMutationsSerializer.instance.serialize(mutations, out, MessagingService.current_version);
+        DataInputBuffer in = new DataInputBuffer(out.toByteArray());
+        Collection<Mutation> deserializedMutations = SchemaMutationsSerializer.instance.deserialize(in, MessagingService.current_version);
+        DataOutputBuffer out2 = new DataOutputBuffer();
+        SchemaMutationsSerializer.instance.serialize(deserializedMutations, out2, MessagingService.current_version);
+        Assertions.assertThat(out2.toByteArray()).isEqualTo(out.toByteArray());
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/schema/SchemaTest.java b/test/unit/org/apache/cassandra/schema/SchemaTest.java
index 64b1341..4185536 100644
--- a/test/unit/org/apache/cassandra/schema/SchemaTest.java
+++ b/test/unit/org/apache/cassandra/schema/SchemaTest.java
@@ -19,55 +19,55 @@
 package org.apache.cassandra.schema;
 
 import java.io.IOException;
+import java.util.Arrays;
+import java.util.Collection;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.utils.FBUtilities;
 
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
 public class SchemaTest
 {
     @BeforeClass
-    public static void setupDatabaseDescriptor()
+    public static void setup()
     {
         DatabaseDescriptor.daemonInitialization();
+        ServerTestUtils.prepareServer();
+        Schema.instance.loadFromDisk();
     }
 
     @Test
     public void testTransKsMigration() throws IOException
     {
-        CommitLog.instance.start();
-        SchemaLoader.cleanupAndLeaveDirs();
-        Schema.instance.loadFromDisk();
         assertEquals(0, Schema.instance.getNonSystemKeyspaces().size());
 
-        Gossiper.instance.start((int)(System.currentTimeMillis() / 1000));
-        Keyspace.setInitialized();
-
+        Gossiper.instance.start((int) (System.currentTimeMillis() / 1000));
         try
         {
             // add a few.
-            MigrationManager.announceNewKeyspace(KeyspaceMetadata.create("ks0", KeyspaceParams.simple(3)));
-            MigrationManager.announceNewKeyspace(KeyspaceMetadata.create("ks1", KeyspaceParams.simple(3)));
+            saveKeyspaces();
+            Schema.instance.reloadSchemaAndAnnounceVersion();
 
             assertNotNull(Schema.instance.getKeyspaceMetadata("ks0"));
             assertNotNull(Schema.instance.getKeyspaceMetadata("ks1"));
 
-            Schema.instance.unload(Schema.instance.getKeyspaceMetadata("ks0"));
-            Schema.instance.unload(Schema.instance.getKeyspaceMetadata("ks1"));
+            Schema.instance.transform(keyspaces -> keyspaces.without(Arrays.asList("ks0", "ks1")));
 
             assertNull(Schema.instance.getKeyspaceMetadata("ks0"));
             assertNull(Schema.instance.getKeyspaceMetadata("ks1"));
 
-            Schema.instance.loadFromDisk();
+            saveKeyspaces();
+            Schema.instance.reloadSchemaAndAnnounceVersion();
 
             assertNotNull(Schema.instance.getKeyspaceMetadata("ks0"));
             assertNotNull(Schema.instance.getKeyspaceMetadata("ks1"));
@@ -78,4 +78,37 @@
         }
     }
 
+    @Test
+    public void testKeyspaceCreationWhenNotInitialized() {
+        Keyspace.unsetInitialized();
+        try
+        {
+            SchemaTestUtil.addOrUpdateKeyspace(KeyspaceMetadata.create("test", KeyspaceParams.simple(1)), true);
+            assertNotNull(Schema.instance.getKeyspaceMetadata("test"));
+            assertNull(Schema.instance.getKeyspaceInstance("test"));
+
+            SchemaTestUtil.dropKeyspaceIfExist("test", true);
+            assertNull(Schema.instance.getKeyspaceMetadata("test"));
+            assertNull(Schema.instance.getKeyspaceInstance("test"));
+        }
+        finally
+        {
+            Keyspace.setInitialized();
+        }
+
+        SchemaTestUtil.addOrUpdateKeyspace(KeyspaceMetadata.create("test", KeyspaceParams.simple(1)), true);
+        assertNotNull(Schema.instance.getKeyspaceMetadata("test"));
+        assertNotNull(Schema.instance.getKeyspaceInstance("test"));
+
+        SchemaTestUtil.dropKeyspaceIfExist("test", true);
+        assertNull(Schema.instance.getKeyspaceMetadata("test"));
+        assertNull(Schema.instance.getKeyspaceInstance("test"));
+    }
+
+    private void saveKeyspaces()
+    {
+        Collection<Mutation> mutations = Arrays.asList(SchemaKeyspace.makeCreateKeyspaceMutation(KeyspaceMetadata.create("ks0", KeyspaceParams.simple(3)), FBUtilities.timestampMicros()).build(),
+                                                       SchemaKeyspace.makeCreateKeyspaceMutation(KeyspaceMetadata.create("ks1", KeyspaceParams.simple(3)), FBUtilities.timestampMicros()).build());
+        SchemaKeyspace.applyChanges(mutations);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/schema/SchemaTestUtil.java b/test/unit/org/apache/cassandra/schema/SchemaTestUtil.java
new file mode 100644
index 0000000..b937d15
--- /dev/null
+++ b/test/unit/org/apache/cassandra/schema/SchemaTestUtil.java
@@ -0,0 +1,146 @@
+/*
+ * 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.schema;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.concurrent.TimeUnit;
+
+import org.junit.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.concurrent.Stage;
+import org.apache.cassandra.db.Mutation;
+import org.apache.cassandra.exceptions.AlreadyExistsException;
+import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.utils.concurrent.Future;
+
+import static org.apache.cassandra.net.Verb.SCHEMA_PUSH_REQ;
+
+public class SchemaTestUtil
+{
+    private final static Logger logger = LoggerFactory.getLogger(SchemaTestUtil.class);
+
+    public static void announceNewKeyspace(KeyspaceMetadata ksm) throws ConfigurationException
+    {
+        ksm.validate();
+
+        if (Schema.instance.getKeyspaceMetadata(ksm.name) != null)
+            throw new AlreadyExistsException(ksm.name);
+
+        logger.info("Create new Keyspace: {}", ksm);
+        Schema.instance.transform(schema -> schema.withAddedOrUpdated(ksm));
+    }
+
+    public static void announceNewTable(TableMetadata cfm)
+    {
+        announceNewTable(cfm, true);
+    }
+
+    private static void announceNewTable(TableMetadata cfm, boolean throwOnDuplicate)
+    {
+        cfm.validate();
+
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(cfm.keyspace);
+        if (ksm == null)
+            throw new ConfigurationException(String.format("Cannot add table '%s' to non existing keyspace '%s'.", cfm.name, cfm.keyspace));
+            // If we have a table or a view which has the same name, we can't add a new one
+        else if (throwOnDuplicate && ksm.getTableOrViewNullable(cfm.name) != null)
+            throw new AlreadyExistsException(cfm.keyspace, cfm.name);
+
+        logger.info("Create new table: {}", cfm);
+        Schema.instance.transform(schema -> schema.withAddedOrUpdated(ksm.withSwapped(ksm.tables.with(cfm))));
+    }
+
+    static void announceKeyspaceUpdate(KeyspaceMetadata ksm)
+    {
+        ksm.validate();
+
+        KeyspaceMetadata oldKsm = Schema.instance.getKeyspaceMetadata(ksm.name);
+        if (oldKsm == null)
+            throw new ConfigurationException(String.format("Cannot update non existing keyspace '%s'.", ksm.name));
+
+        logger.info("Update Keyspace '{}' From {} To {}", ksm.name, oldKsm, ksm);
+        Schema.instance.transform(schema -> schema.withAddedOrUpdated(ksm));
+    }
+
+    public static void announceTableUpdate(TableMetadata updated)
+    {
+        updated.validate();
+
+        TableMetadata current = Schema.instance.getTableMetadata(updated.keyspace, updated.name);
+        if (current == null)
+            throw new ConfigurationException(String.format("Cannot update non existing table '%s' in keyspace '%s'.", updated.name, updated.keyspace));
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(current.keyspace);
+
+        updated.validateCompatibility(current);
+
+        logger.info("Update table '{}/{}' From {} To {}", current.keyspace, current.name, current, updated);
+        Schema.instance.transform(schema -> schema.withAddedOrUpdated(ksm.withSwapped(ksm.tables.withSwapped(updated))));
+    }
+
+    static void announceKeyspaceDrop(String ksName)
+    {
+        KeyspaceMetadata oldKsm = Schema.instance.getKeyspaceMetadata(ksName);
+        if (oldKsm == null)
+            throw new ConfigurationException(String.format("Cannot drop non existing keyspace '%s'.", ksName));
+
+        logger.info("Drop Keyspace '{}'", oldKsm.name);
+        Schema.instance.transform(schema -> schema.without(ksName));
+    }
+
+    public static SchemaTransformation dropTable(String ksName, String cfName)
+    {
+        return schema -> {
+            KeyspaceMetadata ksm = schema.getNullable(ksName);
+            TableMetadata tm = ksm != null ? ksm.getTableOrViewNullable(cfName) : null;
+            if (tm == null)
+                throw new ConfigurationException(String.format("Cannot drop non existing table '%s' in keyspace '%s'.", cfName, ksName));
+
+            return schema.withAddedOrUpdated(ksm.withSwapped(ksm.tables.without(cfName)));
+        };
+    }
+
+    public static void announceTableDrop(String ksName, String cfName)
+    {
+        logger.info("Drop table '{}/{}'", ksName, cfName);
+        Schema.instance.transform(dropTable(ksName, cfName));
+    }
+
+    public static void addOrUpdateKeyspace(KeyspaceMetadata ksm, boolean locally)
+    {
+        Schema.instance.transform(current -> current.withAddedOrUpdated(ksm));
+    }
+
+    public static void dropKeyspaceIfExist(String ksName, boolean locally)
+    {
+        Schema.instance.transform(current -> current.without(Collections.singletonList(ksName)));
+    }
+
+    public static void mergeAndAnnounceLocally(Collection<Mutation> schemaMutations)
+    {
+        SchemaPushVerbHandler.instance.doVerb(Message.out(SCHEMA_PUSH_REQ, schemaMutations));
+        Future<?> f = Stage.MIGRATION.submit(() -> {});
+        Assert.assertTrue(f.awaitThrowUncheckedOnInterrupt(10, TimeUnit.SECONDS));
+        f.rethrowIfFailed();
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/schema/TableMetadataTest.java b/test/unit/org/apache/cassandra/schema/TableMetadataTest.java
new file mode 100644
index 0000000..357ac01
--- /dev/null
+++ b/test/unit/org/apache/cassandra/schema/TableMetadataTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.schema;
+
+import java.math.BigInteger;
+import java.nio.ByteBuffer;
+import java.util.Arrays;
+
+import org.junit.Test;
+
+import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.db.marshal.BooleanType;
+import org.apache.cassandra.db.marshal.CompositeType;
+import org.apache.cassandra.db.marshal.FloatType;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.marshal.IntegerType;
+import org.apache.cassandra.db.marshal.TupleType;
+import org.apache.cassandra.db.marshal.UTF8Type;
+
+import static org.junit.Assert.assertEquals;
+
+public class TableMetadataTest
+{
+    @Test
+    public void testPartitionKeyAsCQLLiteral()
+    {
+        String keyspaceName = "keyspace";
+        String tableName = "table";
+
+        // composite type
+        CompositeType type1 = CompositeType.getInstance(UTF8Type.instance, UTF8Type.instance, UTF8Type.instance);
+        TableMetadata metadata1 = TableMetadata.builder(keyspaceName, tableName)
+                                               .addPartitionKeyColumn("key", type1)
+                                               .build();
+        assertEquals("('test:', 'composite!', 'type)')",
+                     metadata1.partitionKeyAsCQLLiteral(type1.decompose("test:", "composite!", "type)")));
+
+        // composite type with tuple
+        CompositeType type2 = CompositeType.getInstance(new TupleType(Arrays.asList(FloatType.instance, UTF8Type.instance)),
+                                                        IntegerType.instance);
+        TableMetadata metadata2 = TableMetadata.builder(keyspaceName, tableName)
+                                               .addPartitionKeyColumn("key", type2)
+                                               .build();
+        ByteBuffer tupleValue = TupleType.buildValue(new ByteBuffer[]{ FloatType.instance.decompose(0.33f),
+                                                                       UTF8Type.instance.decompose("tuple test") });
+        assertEquals("((0.33, 'tuple test'), 10)",
+                     metadata2.partitionKeyAsCQLLiteral(type2.decompose(tupleValue, BigInteger.valueOf(10))));
+
+        // plain type
+        TableMetadata metadata3 = TableMetadata.builder(keyspaceName, tableName)
+                                               .addPartitionKeyColumn("key", UTF8Type.instance).build();
+        assertEquals("'non-composite test'",
+                     metadata3.partitionKeyAsCQLLiteral(UTF8Type.instance.decompose("non-composite test")));
+    }
+
+    @Test
+    public void testPrimaryKeyAsCQLLiteral()
+    {
+        String keyspaceName = "keyspace";
+        String tableName = "table";
+
+        TableMetadata metadata;
+
+        // one partition key column, no clustering key
+        metadata = TableMetadata.builder(keyspaceName, tableName)
+                                .addPartitionKeyColumn("key", UTF8Type.instance)
+                                .build();
+        assertEquals("'Test'", metadata.primaryKeyAsCQLLiteral(UTF8Type.instance.decompose("Test"), Clustering.EMPTY));
+
+        // two partition key columns, no clustering key
+        metadata = TableMetadata.builder(keyspaceName, tableName)
+                                .addPartitionKeyColumn("k1", UTF8Type.instance)
+                                .addPartitionKeyColumn("k2", Int32Type.instance)
+                                .build();
+        assertEquals("('Test', -12)",
+                     metadata.primaryKeyAsCQLLiteral(CompositeType.getInstance(UTF8Type.instance, Int32Type.instance)
+                                                                  .decompose("Test", -12), Clustering.EMPTY));
+
+        // one partition key column, one clustering key column
+        metadata = TableMetadata.builder(keyspaceName, tableName)
+                                .addPartitionKeyColumn("key", UTF8Type.instance)
+                                .addClusteringColumn("clustering", UTF8Type.instance)
+                                .build();
+        assertEquals("('k', 'Cluster')",
+                     metadata.primaryKeyAsCQLLiteral(UTF8Type.instance.decompose("k"),
+                                                     Clustering.make(UTF8Type.instance.decompose("Cluster"))));
+        assertEquals("'k'",
+                     metadata.primaryKeyAsCQLLiteral(UTF8Type.instance.decompose("k"), Clustering.EMPTY));
+        assertEquals("'k'",
+                     metadata.primaryKeyAsCQLLiteral(UTF8Type.instance.decompose("k"), Clustering.STATIC_CLUSTERING));
+
+        // one partition key column, two clustering key columns
+        metadata = TableMetadata.builder(keyspaceName, tableName)
+                                .addPartitionKeyColumn("key", UTF8Type.instance)
+                                .addClusteringColumn("c1", UTF8Type.instance)
+                                .addClusteringColumn("c2", UTF8Type.instance)
+                                .build();
+        assertEquals("('k', 'c1', 'c2')",
+                     metadata.primaryKeyAsCQLLiteral(UTF8Type.instance.decompose("k"),
+                                                     Clustering.make(UTF8Type.instance.decompose("c1"),
+                                                                     UTF8Type.instance.decompose("c2"))));
+        assertEquals("'k'",
+                     metadata.primaryKeyAsCQLLiteral(UTF8Type.instance.decompose("k"), Clustering.EMPTY));
+        assertEquals("'k'",
+                     metadata.primaryKeyAsCQLLiteral(UTF8Type.instance.decompose("k"), Clustering.STATIC_CLUSTERING));
+
+        // two partition key columns, two clustering key columns
+        CompositeType composite = CompositeType.getInstance(Int32Type.instance, BooleanType.instance);
+        metadata = TableMetadata.builder(keyspaceName, tableName)
+                                .addPartitionKeyColumn("k1", Int32Type.instance)
+                                .addPartitionKeyColumn("k2", BooleanType.instance)
+                                .addClusteringColumn("c1", UTF8Type.instance)
+                                .addClusteringColumn("c2", UTF8Type.instance)
+                                .build();
+        assertEquals("(0, true, 'Cluster_1', 'Cluster_2')",
+                     metadata.primaryKeyAsCQLLiteral(composite.decompose(0, true),
+                                                     Clustering.make(UTF8Type.instance.decompose("Cluster_1"),
+                                                                     UTF8Type.instance.decompose("Cluster_2"))));
+        assertEquals("(1, true)",
+                     metadata.primaryKeyAsCQLLiteral(composite.decompose(1, true), Clustering.EMPTY));
+        assertEquals("(2, true)",
+                     metadata.primaryKeyAsCQLLiteral(composite.decompose(2, true), Clustering.STATIC_CLUSTERING));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/CustomSslContextFactoryConfigTest.java b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryConfigTest.java
new file mode 100644
index 0000000..c1ab4a4
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryConfigTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.security;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+public class CustomSslContextFactoryConfigTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra-sslcontextfactory.yaml");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor() {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Test
+    public void testValidCustomSslContextFactoryConfiguration() {
+
+        Config config = DatabaseDescriptor.loadConfig();
+        config.client_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.DummySslContextFactoryImpl",
+                            config.client_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.client_encryption_options.ssl_context_factory.class_name,
+                            config.client_encryption_options.sslContextFactoryInstance.getClass().getName());
+        Assert.assertEquals(3, config.client_encryption_options.ssl_context_factory.parameters.size());
+        Assert.assertEquals("value1", config.client_encryption_options.ssl_context_factory.parameters.get("key1"));
+        Assert.assertEquals("value2", config.client_encryption_options.ssl_context_factory.parameters.get("key2"));
+        Assert.assertEquals("value3", config.client_encryption_options.ssl_context_factory.parameters.get("key3"));
+        DummySslContextFactoryImpl dummySslContextFactory =
+        (DummySslContextFactoryImpl)config.client_encryption_options.sslContextFactoryInstance;
+        Assert.assertEquals("dummy-keystore",dummySslContextFactory.getStringValueFor("keystore"));
+    }
+
+    @Test
+    public void testInvalidCustomSslContextFactoryConfiguration() {
+        Config config = DatabaseDescriptor.loadConfig();
+        try {
+            config.server_encryption_options.applyConfig();
+        } catch(ConfigurationException ce) {
+            Assert.assertEquals("Unable to create instance of ISslContextFactory for org.apache.cassandra.security" +
+                                ".MissingSslContextFactoryImpl", ce.getMessage());
+            Assert.assertNotNull("Unable to find root cause of pluggable ISslContextFactory loading failure",
+                                 ce.getCause());
+            Assert.assertTrue(ce.getCause() instanceof ClassNotFoundException);
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/CustomSslContextFactoryInvalidConfigTest.java b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryInvalidConfigTest.java
new file mode 100644
index 0000000..79e7d52
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/CustomSslContextFactoryInvalidConfigTest.java
@@ -0,0 +1,46 @@
+/*
+ * 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.security;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+public class CustomSslContextFactoryInvalidConfigTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra-sslcontextfactory-invalidconfiguration.yaml");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor() {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testValidCustomSslContextFactoryConfiguration() {
+        Config config = DatabaseDescriptor.loadConfig();
+        config.client_encryption_options.applyConfig();
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/DefaultSslContextFactoryTest.java b/test/unit/org/apache/cassandra/security/DefaultSslContextFactoryTest.java
new file mode 100644
index 0000000..0657eb6
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/DefaultSslContextFactoryTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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.security;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import io.netty.handler.ssl.OpenSsl;
+import io.netty.handler.ssl.OpenSslContext;
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslProvider;
+import org.apache.cassandra.config.EncryptionOptions;
+
+public class DefaultSslContextFactoryTest
+{
+    private Map<String,Object> commonConfig = new HashMap<>();
+
+    @Before
+    public void setup()
+    {
+        commonConfig.put("truststore", "test/conf/cassandra_ssl_test.truststore");
+        commonConfig.put("truststore_password", "cassandra");
+        commonConfig.put("require_client_auth", Boolean.FALSE);
+        commonConfig.put("cipher_suites", Arrays.asList("TLS_RSA_WITH_AES_128_CBC_SHA"));
+    }
+
+    private void addKeystoreOptions(Map<String,Object> config)
+    {
+        config.put("keystore", "test/conf/cassandra_ssl_test.keystore");
+        config.put("keystore_password", "cassandra");
+    }
+
+    @Test
+    public void getSslContextOpenSSL() throws IOException
+    {
+        EncryptionOptions options = new EncryptionOptions().withTrustStore("test/conf/cassandra_ssl_test.truststore")
+                                                           .withTrustStorePassword("cassandra")
+                                                           .withKeyStore("test/conf/cassandra_ssl_test.keystore")
+                                                           .withKeyStorePassword("cassandra")
+                                                           .withRequireClientAuth(false)
+                                                           .withCipherSuites("TLS_RSA_WITH_AES_128_CBC_SHA");
+        SslContext sslContext = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
+        Assert.assertNotNull(sslContext);
+        if (OpenSsl.isAvailable())
+            Assert.assertTrue(sslContext instanceof OpenSslContext);
+        else
+            Assert.assertTrue(sslContext instanceof SslContext);
+    }
+
+    @Test(expected = IOException.class)
+    public void buildTrustManagerFactoryWithInvalidTruststoreFile() throws IOException
+    {
+        Map<String,Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put("truststore", "/this/is/probably/not/a/file/on/your/test/machine");
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        defaultSslContextFactoryImpl.checkedExpiry = false;
+        defaultSslContextFactoryImpl.buildTrustManagerFactory();
+    }
+
+    @Test(expected = IOException.class)
+    public void buildTrustManagerFactoryWithBadPassword() throws IOException
+    {
+        Map<String,Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put("truststore_password", "HomeOfBadPasswords");
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        defaultSslContextFactoryImpl.checkedExpiry = false;
+        defaultSslContextFactoryImpl.buildTrustManagerFactory();
+    }
+
+    @Test
+    public void buildTrustManagerFactoryHappyPath() throws IOException
+    {
+        Map<String,Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        defaultSslContextFactoryImpl.checkedExpiry = false;
+        TrustManagerFactory trustManagerFactory = defaultSslContextFactoryImpl.buildTrustManagerFactory();
+        Assert.assertNotNull(trustManagerFactory);
+    }
+
+    @Test(expected = IOException.class)
+    public void buildKeyManagerFactoryWithInvalidKeystoreFile() throws IOException
+    {
+        Map<String,Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put("keystore", "/this/is/probably/not/a/file/on/your/test/machine");
+        config.put("keystore_password","ThisWontMatter");
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        defaultSslContextFactoryImpl.checkedExpiry = false;
+        defaultSslContextFactoryImpl.buildKeyManagerFactory();
+    }
+
+    @Test(expected = IOException.class)
+    public void buildKeyManagerFactoryWithBadPassword() throws IOException
+    {
+        Map<String,Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeystoreOptions(config);
+        config.put("keystore_password", "HomeOfBadPasswords");
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        defaultSslContextFactoryImpl.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildKeyManagerFactoryHappyPath() throws IOException
+    {
+        Map<String,Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        // Make sure the exiry check didn't happen so far for the private key
+        Assert.assertFalse(defaultSslContextFactoryImpl.checkedExpiry);
+
+        addKeystoreOptions(config);
+        DefaultSslContextFactory defaultSslContextFactoryImpl2 = new DefaultSslContextFactory(config);
+        // Trigger the private key loading. That will also check for expired private key
+        defaultSslContextFactoryImpl2.buildKeyManagerFactory();
+        // Now we should have checked the private key's expiry
+        Assert.assertTrue(defaultSslContextFactoryImpl2.checkedExpiry);
+
+        // Make sure that new factory object preforms the fresh private key expiry check
+        DefaultSslContextFactory defaultSslContextFactoryImpl3 = new DefaultSslContextFactory(config);
+        Assert.assertFalse(defaultSslContextFactoryImpl3.checkedExpiry);
+        defaultSslContextFactoryImpl3.buildKeyManagerFactory();
+        Assert.assertTrue(defaultSslContextFactoryImpl3.checkedExpiry);
+    }
+
+    @Test
+    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");
+        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");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/DummySslContextFactoryImpl.java b/test/unit/org/apache/cassandra/security/DummySslContextFactoryImpl.java
new file mode 100644
index 0000000..3a14ff2
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/DummySslContextFactoryImpl.java
@@ -0,0 +1,82 @@
+/*
+ * 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.security;
+
+import java.util.List;
+import java.util.Map;
+import javax.net.ssl.SSLContext;
+import javax.net.ssl.SSLException;
+
+import io.netty.handler.ssl.CipherSuiteFilter;
+import io.netty.handler.ssl.SslContext;
+
+/**
+ * TEST ONLY Class. DON'T use it for anything else.
+ */
+public class DummySslContextFactoryImpl implements ISslContextFactory
+{
+    private Map<String,Object> parameters;
+    public DummySslContextFactoryImpl(Map<String,Object> parameters) {
+        this.parameters=parameters;
+    }
+
+    @Override
+    public SSLContext createJSSESslContext(boolean verifyPeerCertificate) throws SSLException
+    {
+        return null;
+    }
+
+    @Override
+    public SslContext createNettySslContext(boolean verifyPeerCertificate, SocketType socketType,
+                                            CipherSuiteFilter cipherFilter) throws SSLException
+    {
+        return null;
+    }
+
+    @Override
+    public void initHotReloading() throws SSLException
+    {
+
+    }
+
+    @Override
+    public boolean shouldReload()
+    {
+        return false;
+    }
+
+    @Override
+    public List<String> getAcceptedProtocols()
+    {
+        return null;
+    }
+
+    @Override
+    public List<String> getCipherSuites()
+    {
+        return null;
+    }
+
+    /*
+     * For testing only
+     */
+    public String getStringValueFor(String configKey) {
+        return parameters.containsKey(configKey) ? parameters.get(configKey).toString() : null;
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java b/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java
index 0fd46b8..fdeda05 100644
--- a/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java
+++ b/test/unit/org/apache/cassandra/security/EncryptionUtilsTest.java
@@ -17,9 +17,7 @@
  */
 package org.apache.cassandra.security;
 
-import java.io.File;
 import java.io.IOException;
-import java.io.RandomAccessFile;
 import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.util.HashMap;
@@ -29,6 +27,7 @@
 import javax.crypto.IllegalBlockSizeException;
 import javax.crypto.ShortBufferException;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -82,7 +81,7 @@
 
         File f = FileUtils.createTempFile("commitlog-enc-utils-", ".tmp");
         f.deleteOnExit();
-        FileChannel channel = new RandomAccessFile(f, "rw").getChannel();
+        FileChannel channel = f.newReadWriteChannel();
         EncryptionUtils.encryptAndWrite(ByteBuffer.wrap(buf), channel, true, encryptor);
         channel.close();
 
@@ -111,7 +110,7 @@
         Cipher encryptor = cipherFactory.getEncryptor(tdeOptions.cipher, tdeOptions.key_alias);
         File f = FileUtils.createTempFile("commitlog-enc-utils-", ".tmp");
         f.deleteOnExit();
-        FileChannel channel = new RandomAccessFile(f, "rw").getChannel();
+        FileChannel channel = f.newReadWriteChannel();
         EncryptionUtils.encryptAndWrite(compressedBuffer, channel, true, encryptor);
 
         // decrypt
diff --git a/test/unit/org/apache/cassandra/security/FileBasedSslContextFactoryTest.java b/test/unit/org/apache/cassandra/security/FileBasedSslContextFactoryTest.java
new file mode 100644
index 0000000..be49d16
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/FileBasedSslContextFactoryTest.java
@@ -0,0 +1,156 @@
+/*
+ * 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.security;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.net.ssl.SSLException;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.config.ParameterizedClass;
+
+public class FileBasedSslContextFactoryTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(FileBasedSslContextFactoryTest.class);
+
+    private EncryptionOptions.ServerEncryptionOptions encryptionOptions;
+
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra.yaml");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor()
+    {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Before
+    public void setup()
+    {
+        encryptionOptions = new EncryptionOptions.ServerEncryptionOptions()
+                            .withSslContextFactory(new ParameterizedClass(TestFileBasedSSLContextFactory.class.getName(),
+                                                                          new HashMap<>()))
+                            .withTrustStore("test/conf/cassandra_ssl_test.truststore")
+                            .withTrustStorePassword("cassandra")
+                            .withRequireClientAuth(false)
+                            .withCipherSuites("TLS_RSA_WITH_AES_128_CBC_SHA")
+                            .withKeyStore("test/conf/cassandra_ssl_test.keystore")
+                            .withKeyStorePassword("cassandra");
+    }
+
+    @Test
+    public void testHappyPath() throws SSLException
+    {
+        EncryptionOptions.ServerEncryptionOptions localEncryptionOptions = encryptionOptions;
+
+        Assert.assertEquals("org.apache.cassandra.security.FileBasedSslContextFactoryTest$TestFileBasedSSLContextFactory",
+                            localEncryptionOptions.ssl_context_factory.class_name);
+        Assert.assertNotNull("keystore_password must not be null", localEncryptionOptions.keystore_password);
+
+        TestFileBasedSSLContextFactory sslContextFactory =
+        (TestFileBasedSSLContextFactory) localEncryptionOptions.sslContextFactoryInstance;
+        sslContextFactory.buildKeyManagerFactory();
+        sslContextFactory.buildTrustManagerFactory();
+    }
+
+    /**
+     * Tests for empty {@code keystore_password} and empty {@code outbound_keystore_password} configurations.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testEmptyKeystorePasswords() throws SSLException
+    {
+        EncryptionOptions.ServerEncryptionOptions localEncryptionOptions = encryptionOptions.withKeyStorePassword(null);
+
+        Assert.assertEquals("org.apache.cassandra.security.FileBasedSslContextFactoryTest$TestFileBasedSSLContextFactory",
+                            localEncryptionOptions.ssl_context_factory.class_name);
+        Assert.assertNull("keystore_password must be null", localEncryptionOptions.keystore_password);
+
+        TestFileBasedSSLContextFactory sslContextFactory =
+        (TestFileBasedSSLContextFactory) localEncryptionOptions.sslContextFactoryInstance;
+        try
+        {
+            sslContextFactory.buildKeyManagerFactory();
+            sslContextFactory.buildTrustManagerFactory();
+        }
+        catch (Exception e)
+        {
+            Assert.assertEquals("'keystore_password' must be specified", e.getMessage());
+            throw e;
+        }
+    }
+
+    /**
+     * Tests for the empty password for the {@code keystore} used for the client communication.
+     */
+    @Test(expected = IllegalArgumentException.class)
+    public void testEmptyKeystorePassword() throws SSLException
+    {
+        EncryptionOptions.ServerEncryptionOptions localEncryptionOptions = encryptionOptions.withKeyStorePassword(null);
+
+        Assert.assertEquals("org.apache.cassandra.security.FileBasedSslContextFactoryTest$TestFileBasedSSLContextFactory",
+                            localEncryptionOptions.ssl_context_factory.class_name);
+        Assert.assertNull("keystore_password must be null", localEncryptionOptions.keystore_password);
+
+        TestFileBasedSSLContextFactory sslContextFactory =
+        (TestFileBasedSSLContextFactory) localEncryptionOptions.sslContextFactoryInstance;
+        try
+        {
+            sslContextFactory.buildKeyManagerFactory();
+            sslContextFactory.buildTrustManagerFactory();
+        }
+        catch (Exception e)
+        {
+            Assert.assertEquals("'keystore_password' must be specified", e.getMessage());
+            throw e;
+        }
+    }
+
+    @Test
+    public void testEmptyTruststorePassword() throws SSLException
+    {
+        EncryptionOptions.ServerEncryptionOptions localEncryptionOptions = encryptionOptions.withTrustStorePassword(null);
+        Assert.assertEquals("org.apache.cassandra.security.FileBasedSslContextFactoryTest$TestFileBasedSSLContextFactory",
+                            localEncryptionOptions.ssl_context_factory.class_name);
+        Assert.assertNotNull("keystore_password must not be null", localEncryptionOptions.keystore_password);
+        Assert.assertNull("truststore_password must be null", localEncryptionOptions.truststore_password);
+
+        TestFileBasedSSLContextFactory sslContextFactory =
+        (TestFileBasedSSLContextFactory) localEncryptionOptions.sslContextFactoryInstance;
+        sslContextFactory.buildTrustManagerFactory();
+    }
+
+    public static class TestFileBasedSSLContextFactory extends FileBasedSslContextFactory
+    {
+        public TestFileBasedSSLContextFactory(Map<String, Object> parameters)
+        {
+            super(parameters);
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigTest.java
new file mode 100644
index 0000000..ab6b00a
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigTest.java
@@ -0,0 +1,78 @@
+/*
+ * 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.security;
+
+import javax.net.ssl.SSLException;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+public class PEMBasedSslContextFactoryConfigTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory.yaml");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor()
+    {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Test
+    public void testHappyPathInlinePEM() throws SSLException
+    {
+
+        Config config = DatabaseDescriptor.loadConfig();
+        config.client_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.PEMBasedSslContextFactory",
+                            config.client_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.client_encryption_options.ssl_context_factory.class_name,
+                            config.client_encryption_options.sslContextFactoryInstance.getClass().getName());
+        PEMBasedSslContextFactory sslContextFactory =
+        (PEMBasedSslContextFactory) config.client_encryption_options.sslContextFactoryInstance;
+        sslContextFactory.buildKeyManagerFactory();
+        sslContextFactory.buildTrustManagerFactory();
+    }
+
+    @Test
+    public void testHappyPathFileBasedPEM() throws SSLException
+    {
+
+        Config config = DatabaseDescriptor.loadConfig();
+        config.server_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.PEMBasedSslContextFactory",
+                            config.server_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.server_encryption_options.ssl_context_factory.class_name,
+                            config.server_encryption_options.sslContextFactoryInstance.getClass().getName());
+        PEMBasedSslContextFactory sslContextFactory =
+        (PEMBasedSslContextFactory) config.server_encryption_options.sslContextFactoryInstance;
+        sslContextFactory.buildKeyManagerFactory();
+        sslContextFactory.buildTrustManagerFactory();
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest.java
new file mode 100644
index 0000000..c1e2dbe
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest.java
@@ -0,0 +1,92 @@
+/*
+ * 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.security;
+
+import javax.net.ssl.SSLException;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+public class PEMBasedSslContextFactoryConfigWithMismatchingPasswordsTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory-mismatching-passwords.yaml");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor()
+    {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Test(expected = ConfigurationException.class)
+    public void testInLinePEMConfiguration() throws SSLException
+    {
+        Config config = DatabaseDescriptor.loadConfig();
+        try
+        {
+            config.client_encryption_options.applyConfig();
+        }
+        catch (ConfigurationException e)
+        {
+            assertErrorMessageAndRethrow(e);
+        }
+    }
+
+    @Test(expected = ConfigurationException.class)
+    public void testFileBasedPEMConfiguration() throws SSLException
+    {
+        Config config = DatabaseDescriptor.loadConfig();
+        try
+        {
+            config.server_encryption_options.applyConfig();
+        }
+        catch (ConfigurationException e)
+        {
+            assertErrorMessageAndRethrow(e);
+        }
+    }
+
+    private void assertErrorMessageAndRethrow(ConfigurationException e) throws ConfigurationException
+    {
+        String expectedMessage = "'keystore_password' and 'key_password' both configurations are given and the values do not match";
+        Throwable rootCause = getRootCause(e);
+        String actualMessage = rootCause.getMessage();
+        Assert.assertEquals(expectedMessage, actualMessage);
+        throw e;
+    }
+
+    private Throwable getRootCause(Throwable e)
+    {
+        Throwable rootCause = e;
+        while (rootCause.getCause() != null && rootCause.getCause() != rootCause)
+        {
+            rootCause = rootCause.getCause();
+        }
+        return rootCause;
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest.java
new file mode 100644
index 0000000..066de8f
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.security;
+
+import javax.net.ssl.SSLException;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+public class PEMBasedSslContextFactoryConfigWithUnencryptedKeysTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory-unencryptedkeys.yaml");
+        System.setProperty("cassandra.disable_tcactive_openssl", "true");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor()
+    {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Test
+    public void testHappyPathInlinePEM() throws SSLException
+    {
+
+        Config config = DatabaseDescriptor.loadConfig();
+        config.client_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.PEMBasedSslContextFactory",
+                            config.client_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.client_encryption_options.ssl_context_factory.class_name,
+                            config.client_encryption_options.sslContextFactoryInstance.getClass().getName());
+        PEMBasedSslContextFactory sslContextFactory =
+        (PEMBasedSslContextFactory) config.client_encryption_options.sslContextFactoryInstance;
+        sslContextFactory.buildKeyManagerFactory();
+        sslContextFactory.buildTrustManagerFactory();
+    }
+
+    @Test
+    public void testHappyPathFileBasedPEM() throws SSLException
+    {
+
+        Config config = DatabaseDescriptor.loadConfig();
+        config.server_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.PEMBasedSslContextFactory",
+                            config.server_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.server_encryption_options.ssl_context_factory.class_name,
+                            config.server_encryption_options.sslContextFactoryInstance.getClass().getName());
+        PEMBasedSslContextFactory sslContextFactory =
+        (PEMBasedSslContextFactory) config.server_encryption_options.sslContextFactoryInstance;
+        sslContextFactory.buildKeyManagerFactory();
+        sslContextFactory.buildTrustManagerFactory();
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryInvalidConfigTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryInvalidConfigTest.java
new file mode 100644
index 0000000..2281137
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryInvalidConfigTest.java
@@ -0,0 +1,62 @@
+/*
+ * 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.security;
+
+import javax.net.ssl.SSLException;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.exceptions.ConfigurationException;
+
+public class PEMBasedSslContextFactoryInvalidConfigTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra-pem-sslcontextfactory-invalidconfiguration.yaml");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor()
+    {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Test(expected = ConfigurationException.class)
+    public void testFileBasedAndInlinePEMConfiguration() throws SSLException
+    {
+
+        Config config = DatabaseDescriptor.loadConfig();
+        config.client_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.PEMBasedSslContextFactory",
+                            config.client_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.client_encryption_options.ssl_context_factory.class_name,
+                            config.client_encryption_options.sslContextFactoryInstance.getClass().getName());
+        PEMBasedSslContextFactory sslContextFactory =
+        (PEMBasedSslContextFactory) config.client_encryption_options.sslContextFactoryInstance;
+        sslContextFactory.buildKeyManagerFactory();
+        sslContextFactory.buildTrustManagerFactory();
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryTest.java b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryTest.java
new file mode 100644
index 0000000..243d300
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/PEMBasedSslContextFactoryTest.java
@@ -0,0 +1,449 @@
+/*
+ * 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.security;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import javax.net.ssl.TrustManagerFactory;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import io.netty.handler.ssl.OpenSsl;
+import io.netty.handler.ssl.OpenSslContext;
+import io.netty.handler.ssl.SslContext;
+import io.netty.handler.ssl.SslProvider;
+import org.apache.cassandra.config.EncryptionOptions;
+import org.apache.cassandra.config.ParameterizedClass;
+
+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;
+
+public class PEMBasedSslContextFactoryTest
+{
+    private static final String private_key =
+    "-----BEGIN ENCRYPTED PRIVATE KEY-----\n" +
+    "MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/\n" +
+    "g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl\n" +
+    "xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29\n" +
+    "L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V\n" +
+    "sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/\n" +
+    "f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8\n" +
+    "RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR\n" +
+    "0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs\n" +
+    "evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU\n" +
+    "tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6\n" +
+    "wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN\n" +
+    "K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv\n" +
+    "zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5\n" +
+    "mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo\n" +
+    "WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ\n" +
+    "jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6\n" +
+    "eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny\n" +
+    "DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn\n" +
+    "AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY\n" +
+    "Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow\n" +
+    "Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut\n" +
+    "ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr\n" +
+    "bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH\n" +
+    "hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI\n" +
+    "RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw\n" +
+    "pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP\n" +
+    "FujZhqbKUDbYAcqTkoQ=\n" +
+    "-----END ENCRYPTED PRIVATE KEY-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV\n" +
+    "bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD\n" +
+    "VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh\n" +
+    "Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx\n" +
+    "EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu\n" +
+    "a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw\n" +
+    "FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+    "MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d\n" +
+    "ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy\n" +
+    "q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2\n" +
+    "TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto\n" +
+    "TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA\n" +
+    "YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD\n" +
+    "N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v\n" +
+    "iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh\n" +
+    "IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv\n" +
+    "6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG\n" +
+    "qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa\n" +
+    "HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru\n" +
+    "n3MVF9w=\n" +
+    "-----END CERTIFICATE-----";
+    private static final String unencrypted_private_key =
+    "-----BEGIN PRIVATE KEY-----\n" +
+    "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOSZVf8dLj1xLw\n" +
+    "efqjbogbAwhwRXd3tmEfQY1zHyudJF3XR1T0Xp26BKNvAYUxxZRDNg16M3prPRZv\n" +
+    "wkhDJdE9NaN+BpZPJUavRsZOfGDq/CHN8j/2PPKrn3G/b065JjV3GZjfV/Sln047\n" +
+    "DeZptaSyOg7ZN7F8qjGqxEcnw+szV/wTzhnjGjZMlcbOm4jFGQAn6xUOooQCGsoB\n" +
+    "9FgxKB0nvNG3xVe/2eCNfbS4DabT3Y1wfQqZ62hOa5ZS0rwT+pw3tQs3zFFY1Sfi\n" +
+    "G7qYbqZrKTheWIZGojVVm6mqH4yA2ofOe5N3RsBitCwU/D0dpnaG9Wcl98nmXueM\n" +
+    "B6Rk04v7AgMBAAECggEAYnxIKjrFz/JkJ5MmiszM5HV698r9YB0aqHnFIHPoykIL\n" +
+    "uiCjiumantDrFsCkosixULwvI/BRwbxstTpyrheU9psT6P1CONICVPvV8ylgJAYU\n" +
+    "l+ofn56cEXKxVuICSWFLDH7pM1479g+IJJQAchbKQpqxAGTuMu3SpvJolfuj5srt\n" +
+    "bM7/RYhJFLwDuvHNA3ivlogMneItP03+C25aaxstM+lBuBf68+n78zMgSvt6J/6Y\n" +
+    "G2TOMKnxveMlG2qu9l2lAw/2i8daG/qre08nTH7wpRx0gZLZqNpe45exkrzticzF\n" +
+    "FgWYjG2K2brX21jqHroFgMhdXF7zhhRgLoIeC0BrIQKBgQDCfGfWrJESKBbVai5u\n" +
+    "7wqD9nlzjv6N6FXfTDOPXO1vz5frdvtLVWbs0SMPy+NglkaZK0iqHvb9mf2of8eC\n" +
+    "0D5cmewjn7WCDBQMypIMYgT912ak/BBVuGXcxb6UgD+xARfSARo2C8NG1hfprw1W\n" +
+    "ad14CjS5xhFMs44HpVYhI7iPYwKBgQC7SqVG/b37vZ7CINemdvoMujLvvYXDJJM8\n" +
+    "N21LqNJfVXdukdH3T0xuLnh9Z/wPHjJDMF/9+1foxSEPHijtyz5P19EilNEC/3qw\n" +
+    "fI19+VZoY0mdhPtXSGzy+rbTE2v71QgwFLizSos14Gr+eNiIjF7FYccK05++K/zk\n" +
+    "cd8ZA3bwiQKBgQCl+HTFBs9mpz+VMOAfW2+l3hkXPNiPUc62mNkHZ05ZNNd44jjh\n" +
+    "uSf0wSUiveR08MmevQlt5K7zDQ8jVKh2QjB15gVXAVxsdtJFeDnax2trFP9LnLBz\n" +
+    "9sE2/qn9INU5wK0LUlWD+dXUBbCyg+jl7cJKRqtoPldVFYYHkFlIPqup8QKBgHXv\n" +
+    "hyuw1FUVDkdHzwOvn70r8q8sNHKxMVWVwWkHIZGOi+pAQGrusD4hXRX6yKnsZdIR\n" +
+    "QCD6iFy25R5T64nxlYdJaxPPid3NakB/7ckJnPOWseBSwMIxhQlr/nvjmve1Kba9\n" +
+    "FaEwq4B9lGIxToiNe4/nBiM3JzvlDxX67nUdzWOhAoGAdFvriyvjshSJ4JHgIY9K\n" +
+    "37BVB0VKMcFV2P8fLVWO5oyRtE1bJhU4QVpQmauABU4RGSojJ3NPIVH1wxmJeYtj\n" +
+    "Q3b7EZaqI6ovna2eK2qtUx4WwxhRaXTT8xueBI2lgL6sBSTGG+K69ZOzGQzG/Mfr\n" +
+    "RXKInnLInFD9JD94VqmMozo=\n" +
+    "-----END PRIVATE KEY-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV\n" +
+    "bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD\n" +
+    "VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh\n" +
+    "Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx\n" +
+    "EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu\n" +
+    "a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw\n" +
+    "FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+    "MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d\n" +
+    "ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy\n" +
+    "q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2\n" +
+    "TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto\n" +
+    "TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA\n" +
+    "YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD\n" +
+    "N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v\n" +
+    "iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh\n" +
+    "IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv\n" +
+    "6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG\n" +
+    "qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa\n" +
+    "HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru\n" +
+    "n3MVF9w=\n" +
+    "-----END CERTIFICATE-----";
+    private static final String trusted_certificates =
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV\n" +
+    "bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD\n" +
+    "VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh\n" +
+    "Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx\n" +
+    "EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu\n" +
+    "a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw\n" +
+    "FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+    "MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d\n" +
+    "ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy\n" +
+    "q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2\n" +
+    "TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto\n" +
+    "TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA\n" +
+    "YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD\n" +
+    "N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v\n" +
+    "iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh\n" +
+    "IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv\n" +
+    "6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG\n" +
+    "qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa\n" +
+    "HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru\n" +
+    "n3MVF9w=\n" +
+    "-----END CERTIFICATE-----";
+    private final Map<String, Object> commonConfig = new HashMap<>();
+
+    @Before
+    public void setup()
+    {
+        commonConfig.put(ENCODED_CERTIFICATES.getKeyName(), trusted_certificates);
+        commonConfig.put("require_client_auth", Boolean.FALSE);
+        commonConfig.put("cipher_suites", Arrays.asList("TLS_RSA_WITH_AES_128_CBC_SHA"));
+    }
+
+    private void addKeyStoreOptions(Map<String, Object> config)
+    {
+        config.put(ENCODED_KEY.getKeyName(), private_key);
+        config.put(KEY_PASSWORD.getKeyName(), "cassandra");
+    }
+
+    private void addUnencryptedKeyStoreOptions(Map<String, Object> config)
+    {
+        config.put(ENCODED_KEY.getKeyName(), unencrypted_private_key);
+    }
+
+    private void addFileBaseTrustStoreOptions(Map<String, Object> config)
+    {
+        config.put("truststore", "test/conf/cassandra_ssl_test.truststore.pem");
+    }
+
+    private void addFileBaseKeyStoreOptions(Map<String, Object> config)
+    {
+        config.put("keystore", "test/conf/cassandra_ssl_test.keystore.pem");
+        config.put("keystore_password", "cassandra");
+    }
+
+    private void addFileBaseUnencryptedKeyStoreOptions(Map<String, Object> config)
+    {
+        config.put("keystore", "test/conf/cassandra_ssl_test.unencrypted_keystore.pem");
+    }
+
+    @Test
+    public void getSslContextOpenSSL() throws IOException
+    {
+        ParameterizedClass sslContextFactory = new ParameterizedClass(PEMBasedSslContextFactory.class.getSimpleName()
+        , new HashMap<>());
+        EncryptionOptions options = new EncryptionOptions().withTrustStore("test/conf/cassandra_ssl_test.truststore.pem")
+                                                           .withKeyStore("test/conf/cassandra_ssl_test.keystore.pem")
+                                                           .withKeyStorePassword("cassandra")
+                                                           .withRequireClientAuth(false)
+                                                           .withCipherSuites("TLS_RSA_WITH_AES_128_CBC_SHA")
+                                                           .withSslContextFactory(sslContextFactory);
+        SslContext sslContext = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
+        Assert.assertNotNull(sslContext);
+        if (OpenSsl.isAvailable())
+            Assert.assertTrue(sslContext instanceof OpenSslContext);
+        else
+            Assert.assertTrue(sslContext instanceof SslContext);
+    }
+
+    @Test(expected = IOException.class)
+    public void buildTrustManagerFactoryWithInvalidTruststoreFile() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.remove("encoded_certificates");
+        config.put("truststore", "/this/is/probably/not/a/file/on/your/test/machine");
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        defaultSslContextFactoryImpl.checkedExpiry = false;
+        defaultSslContextFactoryImpl.buildTrustManagerFactory();
+    }
+
+    @Test
+    public void buildTrustManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
+        sslContextFactory.checkedExpiry = false;
+        TrustManagerFactory trustManagerFactory = sslContextFactory.buildTrustManagerFactory();
+        Assert.assertNotNull(trustManagerFactory);
+    }
+
+    @Test
+    public void buildFileBasedTrustManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.remove(ENCODED_CERTIFICATES.getKeyName());
+        addFileBaseTrustStoreOptions(config);
+
+        PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
+        sslContextFactory.checkedExpiry = false;
+        TrustManagerFactory trustManagerFactory = sslContextFactory.buildTrustManagerFactory();
+        Assert.assertNotNull(trustManagerFactory);
+    }
+
+    @Test(expected = IOException.class)
+    public void buildKeyManagerFactoryWithInvalidKeystoreFile() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        config.put("keystore", "/this/is/probably/not/a/file/on/your/test/machine");
+
+        PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
+        sslContextFactory.checkedExpiry = false;
+        sslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test(expected = IOException.class)
+    public void buildKeyManagerFactoryWithBadPassword() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeyStoreOptions(config);
+        config.put("keystore_password", "HomeOfBadPasswords");
+
+        DefaultSslContextFactory defaultSslContextFactoryImpl = new DefaultSslContextFactory(config);
+        defaultSslContextFactoryImpl.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildKeyManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        PEMBasedSslContextFactory sslContextFactory1 = new PEMBasedSslContextFactory(config);
+        // Make sure the exiry check didn't happen so far for the private key
+        Assert.assertFalse(sslContextFactory1.checkedExpiry);
+
+        addKeyStoreOptions(config);
+        PEMBasedSslContextFactory sslContextFactory2 = new PEMBasedSslContextFactory(config);
+        // Trigger the private key loading. That will also check for expired private key
+        sslContextFactory2.buildKeyManagerFactory();
+        // Now we should have checked the private key's expiry
+        Assert.assertTrue(sslContextFactory2.checkedExpiry);
+
+        // Make sure that new factory object preforms the fresh private key expiry check
+        PEMBasedSslContextFactory sslContextFactory3 = new PEMBasedSslContextFactory(config);
+        Assert.assertFalse(sslContextFactory3.checkedExpiry);
+        sslContextFactory3.buildKeyManagerFactory();
+        Assert.assertTrue(sslContextFactory3.checkedExpiry);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void buildKeyManagerFactoryWithConflictingPasswordConfigs() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeyStoreOptions(config);
+        config.put("keystore_password", config.get("keyPassword") + "-conflict");
+
+        PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
+        sslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildKeyManagerFactoryWithMatchingPasswordConfigs() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addKeyStoreOptions(config);
+        config.put("keystore_password", config.get("keyPassword"));
+
+        PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
+        sslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildFileBasedKeyManagerFactoryHappyPath() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        PEMBasedSslContextFactory sslContextFactory1 = new PEMBasedSslContextFactory(config);
+        // Make sure the expiry check didn't happen so far for the private key
+        Assert.assertFalse(sslContextFactory1.checkedExpiry);
+
+        addFileBaseKeyStoreOptions(config);
+        PEMBasedSslContextFactory sslContextFactory2 = new PEMBasedSslContextFactory(config);
+        // Trigger the private key loading. That will also check for expired private key
+        sslContextFactory2.buildKeyManagerFactory();
+        // Now we should have checked the private key's expiry
+        Assert.assertTrue(sslContextFactory2.checkedExpiry);
+
+        // Make sure that new factory object preforms the fresh private key expiry check
+        PEMBasedSslContextFactory sslContextFactory3 = new PEMBasedSslContextFactory(config);
+        Assert.assertFalse(sslContextFactory3.checkedExpiry);
+        sslContextFactory3.buildKeyManagerFactory();
+        Assert.assertTrue(sslContextFactory3.checkedExpiry);
+    }
+
+    @Test
+    public void buildKeyManagerFactoryWithUnencryptedKey() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addUnencryptedKeyStoreOptions(config);
+
+        Assert.assertTrue("Unencrypted Key test must not specify a key password",
+                          StringUtils.isEmpty((String) config.get(KEY_PASSWORD.getKeyName())));
+
+        PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
+        sslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test
+    public void buildKeyManagerFactoryWithFileBasedUnencryptedKey() throws IOException
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addFileBaseUnencryptedKeyStoreOptions(config);
+
+        Assert.assertTrue("Unencrypted Key test must not specify a key password",
+                          StringUtils.isEmpty((String) config.get(KEY_PASSWORD.getKeyName())));
+
+        PEMBasedSslContextFactory sslContextFactory = new PEMBasedSslContextFactory(config);
+        sslContextFactory.buildKeyManagerFactory();
+    }
+
+    @Test
+    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");
+        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");
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testMultiplePrivateKeySources()
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addUnencryptedKeyStoreOptions(config);
+
+        // Check with a valid file path for the keystore
+        addFileBaseUnencryptedKeyStoreOptions(config);
+        new PEMBasedSslContextFactory(config);
+    }
+
+    @Test
+    public void testMultiplePrivateKeySourcesWithInvalidKeystorePath()
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+        addUnencryptedKeyStoreOptions(config);
+
+        // Check with an invalid file path for the keystore
+        config.put("keystore", "/path/to/nowhere");
+        new PEMBasedSslContextFactory(config);
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testMultipleTrustedCertificatesSources()
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        // Check with a valid file path for the truststore
+        addFileBaseTrustStoreOptions(config);
+        new PEMBasedSslContextFactory(config);
+    }
+
+    @Test
+    public void testMultipleTrustedCertificatesSourcesWithInvalidTruststorePath()
+    {
+        Map<String, Object> config = new HashMap<>();
+        config.putAll(commonConfig);
+
+        // Check with an invalid file path for the truststore
+        config.put("truststore", "/path/to/nowhere");
+        new PEMBasedSslContextFactory(config);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/PEMJKSSslContextFactoryConfigTest.java b/test/unit/org/apache/cassandra/security/PEMJKSSslContextFactoryConfigTest.java
new file mode 100644
index 0000000..8efd3e4
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/PEMJKSSslContextFactoryConfigTest.java
@@ -0,0 +1,71 @@
+/*
+ * 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.security;
+
+import javax.net.ssl.SSLException;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+public class PEMJKSSslContextFactoryConfigTest
+{
+    @BeforeClass
+    public static void setupDatabaseDescriptor()
+    {
+        System.setProperty("cassandra.config", "cassandra-pem-jks-sslcontextfactory.yaml");
+    }
+
+    @AfterClass
+    public static void tearDownDatabaseDescriptor() {
+        System.clearProperty("cassandra.config");
+    }
+
+    @Test
+    public void testPEMAndJKSCombination() throws SSLException
+    {
+
+        Config config = DatabaseDescriptor.loadConfig();
+        config.client_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.PEMBasedSslContextFactory",
+                            config.client_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.client_encryption_options.ssl_context_factory.class_name,
+                            config.client_encryption_options.sslContextFactoryInstance.getClass().getName());
+        PEMBasedSslContextFactory clientSslContextFactory =
+        (PEMBasedSslContextFactory)config.client_encryption_options.sslContextFactoryInstance;
+        clientSslContextFactory.buildKeyManagerFactory();
+        clientSslContextFactory.buildTrustManagerFactory();
+
+        config.server_encryption_options.applyConfig();
+
+        Assert.assertEquals("org.apache.cassandra.security.DefaultSslContextFactory",
+                            config.server_encryption_options.ssl_context_factory.class_name);
+        Assert.assertEquals(config.server_encryption_options.ssl_context_factory.class_name,
+                            config.server_encryption_options.sslContextFactoryInstance.getClass().getName());
+        DefaultSslContextFactory serverSslContextFactory =
+        (DefaultSslContextFactory)config.server_encryption_options.sslContextFactoryInstance;
+        serverSslContextFactory.buildKeyManagerFactory();
+        serverSslContextFactory.buildTrustManagerFactory();
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/PEMReaderTest.java b/test/unit/org/apache/cassandra/security/PEMReaderTest.java
new file mode 100644
index 0000000..5f4a867
--- /dev/null
+++ b/test/unit/org/apache/cassandra/security/PEMReaderTest.java
@@ -0,0 +1,454 @@
+/*
+ * 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.security;
+
+import java.io.IOException;
+import java.security.GeneralSecurityException;
+import java.security.PrivateKey;
+import java.security.cert.Certificate;
+import java.util.Set;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class PEMReaderTest
+{
+    private static final String encoded_encrypted_key =
+    "-----BEGIN ENCRYPTED PRIVATE KEY-----\n" +
+    "MIIE6jAcBgoqhkiG9w0BDAEDMA4ECOWqSzq5PBIdAgIFxQSCBMjXsCK30J0aT3J/\n" +
+    "g5kcbmevTOY1pIhJGbf5QYYrMUPiuDK2ydxIbiPzoTE4/S+OkCeHhlqwn/YydpBl\n" +
+    "xgjZZ1Z5rLJHO27d2biuESqanDiBVXYuVmHmaifRnFy0uUTFkStB5mjVZEiJgO29\n" +
+    "L83hL60uWru71EVuVriC2WCfmZ/EXp6wyYszOqCFQ8Quk/rDO6XuaBl467MJbx5V\n" +
+    "sucGT6E9XKNd9hB14/Izb2jtVM5kqKxoiHpz1na6yhEYJiE5D1uOonznWjBnjwB/\n" +
+    "f0x+acpDfVDoJKTlRdz+DEcbOF7mb9lBVVjP6P/AAsmQzz6JKwHjvCrjYfQmyyN8\n" +
+    "RI4KRQnWgm4L3dtByLqY8HFU4ogisCMCgI+hZQ+OKMz/hoRO540YGiPcTRY3EOUR\n" +
+    "0bd5JxU6tCJDMTqKP9aSL2KmLoiLowdMkSPz7TCzLsZ2bGJemuCfpAs4XT1vXCHs\n" +
+    "evrUbOnh8et1IA8mZ9auThfqsZtNagJLEXA6hWIKp1FfVL3Q49wvMKZt4eTn/zwU\n" +
+    "tLL0m5yPo6/HAaOA3hbm/oghZS0dseshXl7PZrmZQtvYnIvjyoxEL7ducYDQCDP6\n" +
+    "wZ7Nzyh1QZAauSS15hl3vLFRZCA9hWAVgwQAviTvhB342O0i9qI7TQkcHk+qcTPN\n" +
+    "K+iGNbFZ8ma1izXNKSJ2PgI/QqFNIeJWvZrb9PhJRmaZVsTJ9fERm1ewpebZqkVv\n" +
+    "zMqMhlKgx9ggAaSKgnGZkwXwB6GrSbbzUrwRCKm3FieD1QE4VVYevaadVUU75GG5\n" +
+    "mrFKorJEH7kFZlic8OTjDksYnHbcgU36XZrGEXa2+ldVeGKL3CsXWciaQRcJg8yo\n" +
+    "WQDjZpcutGI0eMJWCqUkv8pYZC2/wZU4htCve5nVJUU4t9uuo9ex7lnwlLWPvheQ\n" +
+    "jUBMgzSRsZ+zwaIusvufAAxiKK/cJm4ubZSZPIjBbfd4U7VPxtirP4Accydu7EK6\n" +
+    "eG/MZwtAMFNJxfxUR+/aYzJU/q1ePw7fWVHrpt58t/22CX2SJBEiUGmSmuyER4Ny\n" +
+    "DPw6d6mhvPUS1jRhIZ9A81ht8MOX7VL5uVp307rt7o5vRpV1mo0iPiRHzGscMpJn\n" +
+    "AP36klEAUNTf0uLTKZa7KHiwhn5iPmsCrENHkOKJjxhRrqHjD2wy3YHs3ow2voyY\n" +
+    "Ua4Cids+c1hvRkNEDGNHm4+rKGFOGOsG/ZU7uj/6gflO4JXxNGiyTLflqMdWBvow\n" +
+    "Zd7hk1zCaGAAn8nZ0hPweGxQ4Q30I9IBZrimGxB0vjiUqNio9+qMf33dCHFJEuut\n" +
+    "ZGJMaUGVaPhXQcTy4uD5hzsPZV5xcsU4H3vBYyBcZgrusJ6OOgkuZQaU7p8rWQWr\n" +
+    "bUEVbXuZdwEmxsCe7H/vEVv5+aA4sF4kWnMMFL7/LIYaiEzkTqdJlRv/KyJJgcAH\n" +
+    "hg2BvR3XTAq8wiX0C98CdmTbsx2eyQdj5tCU606rEohFLKUxWkJYAKxCiUbxGGpI\n" +
+    "RheVmxkef9ErxJiq7hsAsGrSJvMtJuDKIasnD14SOEwD/7jRAq6WdL9VLpxtzlOw\n" +
+    "pWnIl8kUCO3WoaG9Jf+ZTIv2hnxJhaSzYrdXzGPNnaWKhBlwnXJRvQEdrIxZOimP\n" +
+    "FujZhqbKUDbYAcqTkoQ=\n" +
+    "-----END ENCRYPTED PRIVATE KEY-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV\n" +
+    "bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD\n" +
+    "VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh\n" +
+    "Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx\n" +
+    "EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu\n" +
+    "a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw\n" +
+    "FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+    "MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d\n" +
+    "ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy\n" +
+    "q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2\n" +
+    "TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto\n" +
+    "TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA\n" +
+    "YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD\n" +
+    "N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v\n" +
+    "iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh\n" +
+    "IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv\n" +
+    "6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG\n" +
+    "qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa\n" +
+    "HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru\n" +
+    "n3MVF9w=\n" +
+    "-----END CERTIFICATE-----";
+
+    private static final String encoded_certificates =
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV\n" +
+    "bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD\n" +
+    "VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh\n" +
+    "Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx\n" +
+    "EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu\n" +
+    "a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw\n" +
+    "FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+    "MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d\n" +
+    "ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy\n" +
+    "q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2\n" +
+    "TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto\n" +
+    "TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA\n" +
+    "YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD\n" +
+    "N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v\n" +
+    "iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh\n" +
+    "IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv\n" +
+    "6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG\n" +
+    "qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa\n" +
+    "HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru\n" +
+    "n3MVF9w=\n" +
+    "-----END CERTIFICATE-----";
+
+    private static final String encoded_key =
+    "-----BEGIN PRIVATE KEY-----\n" +
+    "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOSZVf8dLj1xLw\n" +
+    "efqjbogbAwhwRXd3tmEfQY1zHyudJF3XR1T0Xp26BKNvAYUxxZRDNg16M3prPRZv\n" +
+    "wkhDJdE9NaN+BpZPJUavRsZOfGDq/CHN8j/2PPKrn3G/b065JjV3GZjfV/Sln047\n" +
+    "DeZptaSyOg7ZN7F8qjGqxEcnw+szV/wTzhnjGjZMlcbOm4jFGQAn6xUOooQCGsoB\n" +
+    "9FgxKB0nvNG3xVe/2eCNfbS4DabT3Y1wfQqZ62hOa5ZS0rwT+pw3tQs3zFFY1Sfi\n" +
+    "G7qYbqZrKTheWIZGojVVm6mqH4yA2ofOe5N3RsBitCwU/D0dpnaG9Wcl98nmXueM\n" +
+    "B6Rk04v7AgMBAAECggEAYnxIKjrFz/JkJ5MmiszM5HV698r9YB0aqHnFIHPoykIL\n" +
+    "uiCjiumantDrFsCkosixULwvI/BRwbxstTpyrheU9psT6P1CONICVPvV8ylgJAYU\n" +
+    "l+ofn56cEXKxVuICSWFLDH7pM1479g+IJJQAchbKQpqxAGTuMu3SpvJolfuj5srt\n" +
+    "bM7/RYhJFLwDuvHNA3ivlogMneItP03+C25aaxstM+lBuBf68+n78zMgSvt6J/6Y\n" +
+    "G2TOMKnxveMlG2qu9l2lAw/2i8daG/qre08nTH7wpRx0gZLZqNpe45exkrzticzF\n" +
+    "FgWYjG2K2brX21jqHroFgMhdXF7zhhRgLoIeC0BrIQKBgQDCfGfWrJESKBbVai5u\n" +
+    "7wqD9nlzjv6N6FXfTDOPXO1vz5frdvtLVWbs0SMPy+NglkaZK0iqHvb9mf2of8eC\n" +
+    "0D5cmewjn7WCDBQMypIMYgT912ak/BBVuGXcxb6UgD+xARfSARo2C8NG1hfprw1W\n" +
+    "ad14CjS5xhFMs44HpVYhI7iPYwKBgQC7SqVG/b37vZ7CINemdvoMujLvvYXDJJM8\n" +
+    "N21LqNJfVXdukdH3T0xuLnh9Z/wPHjJDMF/9+1foxSEPHijtyz5P19EilNEC/3qw\n" +
+    "fI19+VZoY0mdhPtXSGzy+rbTE2v71QgwFLizSos14Gr+eNiIjF7FYccK05++K/zk\n" +
+    "cd8ZA3bwiQKBgQCl+HTFBs9mpz+VMOAfW2+l3hkXPNiPUc62mNkHZ05ZNNd44jjh\n" +
+    "uSf0wSUiveR08MmevQlt5K7zDQ8jVKh2QjB15gVXAVxsdtJFeDnax2trFP9LnLBz\n" +
+    "9sE2/qn9INU5wK0LUlWD+dXUBbCyg+jl7cJKRqtoPldVFYYHkFlIPqup8QKBgHXv\n" +
+    "hyuw1FUVDkdHzwOvn70r8q8sNHKxMVWVwWkHIZGOi+pAQGrusD4hXRX6yKnsZdIR\n" +
+    "QCD6iFy25R5T64nxlYdJaxPPid3NakB/7ckJnPOWseBSwMIxhQlr/nvjmve1Kba9\n" +
+    "FaEwq4B9lGIxToiNe4/nBiM3JzvlDxX67nUdzWOhAoGAdFvriyvjshSJ4JHgIY9K\n" +
+    "37BVB0VKMcFV2P8fLVWO5oyRtE1bJhU4QVpQmauABU4RGSojJ3NPIVH1wxmJeYtj\n" +
+    "Q3b7EZaqI6ovna2eK2qtUx4WwxhRaXTT8xueBI2lgL6sBSTGG+K69ZOzGQzG/Mfr\n" +
+    "RXKInnLInFD9JD94VqmMozo=\n" +
+    "-----END PRIVATE KEY-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV\n" +
+    "bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD\n" +
+    "VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh\n" +
+    "Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx\n" +
+    "EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu\n" +
+    "a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw\n" +
+    "FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+    "MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d\n" +
+    "ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy\n" +
+    "q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2\n" +
+    "TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto\n" +
+    "TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA\n" +
+    "YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD\n" +
+    "N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v\n" +
+    "iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh\n" +
+    "IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv\n" +
+    "6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG\n" +
+    "qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa\n" +
+    "HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru\n" +
+    "n3MVF9w=\n" +
+    "-----END CERTIFICATE-----";
+    private static final String encoded_unencrypted_ec_private_key =
+    "-----BEGIN PRIVATE KEY-----\n" +
+    "MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgMLP6H2Wdl28J5PHU\n" +
+    "gMLApCsjONhbyMd5br0byJaQpXShRANCAASmX26IPehdE1wdLW2fVndT9QbjURro\n" +
+    "h74aMnzlmq8GIBWnRzpd+JVJlHgeWLZIDwapthGCYUGivtH27wiO3g7d\n" +
+    "-----END PRIVATE KEY-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIBizCCATACCQCtgEKhNta70DAKBggqhkjOPQQDAjBNMQswCQYDVQQGEwJVUzEL\n" +
+    "MAkGA1UECAwCQ0ExETAPBgNVBAcMCFNhbiBKb3NlMREwDwYDVQQKDAhQZXJzb25h\n" +
+    "bDELMAkGA1UECwwCSVQwHhcNMjExMDE5MDAzMDU4WhcNMjIxMDE0MDAzMDU4WjBN\n" +
+    "MQswCQYDVQQGEwJVUzELMAkGA1UECAwCQ0ExETAPBgNVBAcMCFNhbiBKb3NlMREw\n" +
+    "DwYDVQQKDAhQZXJzb25hbDELMAkGA1UECwwCSVQwWTATBgcqhkjOPQIBBggqhkjO\n" +
+    "PQMBBwNCAASmX26IPehdE1wdLW2fVndT9QbjURroh74aMnzlmq8GIBWnRzpd+JVJ\n" +
+    "lHgeWLZIDwapthGCYUGivtH27wiO3g7dMAoGCCqGSM49BAMCA0kAMEYCIQDsNMGL\n" +
+    "b4+BEhgNXaXyHWkezUO/3hCmLDw2gUdwMXG+JQIhAIAm8wALKbb9jJDgFQTHyqGJ\n" +
+    "AVAkzYOwmRMYC9BHKjNs\n" +
+    "-----END CERTIFICATE-----";
+    private static final String encoded_encrypted_key_with_multiplecerts_in_chain =
+    "-----BEGIN ENCRYPTED PRIVATE KEY-----\n" +
+    "MIIE6TAbBgkqhkiG9w0BBQMwDgQI4QuRiKYzf88CAggABIIEyPRVmPp38SIFr8H3\n" +
+    "wi+oc6b+HJH7SPflXO6XZe4Tignw/aSyBTsLm2dWrzojRAYMIRd1xC7yQ2ffYrvx\n" +
+    "uoYbtOQeAminNqvwXdRTnwu6oC0rxdBT8RQ9NK7xL2tQyD/shmOeTJG/glXxaeqS\n" +
+    "rT0CZ5P5GJh6xdIWLEu3lEa3NSWVFE2YacUphmxBoaWjBjsJfWTgkF665SgP+2lh\n" +
+    "8R2WTcHrHjD8jR4jHB03wlup0LOmOwzplUmqHB9TyuA4wF6tlJajwBcPa0PNI6ny\n" +
+    "e9YcdcRr7Y0IxnPQr7PhQNV5AQb9TivwX4WaZxR+BXtwMglp+mz0ohjwLS3z6pqr\n" +
+    "tLrFhv2qcacSl+CKukFb9umV/QBkUk/iu+jwLcNJKPC965GWdieNbO0akBQpQsUN\n" +
+    "mqaF9DYHogW5lRnybl8WWPIR8tXmSCbSUIgzw4lRK+o15I4vaMI0NfkwFD/2y1sn\n" +
+    "t3m9LnVBukkpx3g/CPKd9PbZZeWpOTrnRJQfOu9Fj2lmkpGp0peCBqLJpO0pieVl\n" +
+    "87EQ0ZCErtAGLGIAhWnDUqRK0MaWZ+DMQNKYn5klF4YTVBkfRc9tQbIgBaa77wvz\n" +
+    "gvVWBuJtTFpCt9c8jByTH1gLbchC4bhLsy1nO7moevypMmNW4rqw9x5f0EIR3zCU\n" +
+    "L5/buoIh91TG5JB7BaIbVHtbB/Y2siARRXJibuw3ChBjqPOfzQ66j//NCMqhfTwT\n" +
+    "x2wn7L1BB4xyLJgVW9803FUTzaaL3EvJjzpdvrGC7vzcB6Jd0La9cjHhWSAPOKro\n" +
+    "nD9XPCbgLs10vW9g1Tc8drnZklhw6f7xrIQhWFg6VlwmVpvCQhEpX48rCCo2PH9X\n" +
+    "uzeJA+oqFEH3zfDp0r+q6jbAl+5TkkbBBgC2GCoI1vTYSKaWjeKKHkgzGG0QQLAz\n" +
+    "YXWMXvWKOME4wVPkeVxJv80RqDv0JsoOrnVoaFAzAHJMWa7UZQnjkrbVz/y8ZbV4\n" +
+    "oLJjQjvuOnU2PoXXs6SXbzOs1xx5zbX1UUH3Wc7/CCaUec2hemQJ5m6b1XJciyrY\n" +
+    "GHpMKWtXky9Mo1ruTP7ZH1nk03b4PTObKSx2gQD5AZ/ASuTeahMqMb/2PJkDkpHA\n" +
+    "sy8b1zOn2YTbf4K6NWVNIOkiaApmKhhX0Af6Lg8Wr2ymRTXdp/Um8f+SQLADpB/F\n" +
+    "xOydEN622wmihKDge9DrUFqPG/bdIiRGLXLg8efNboC6/cn/i/sheO7/YlrvcUNo\n" +
+    "qxDa/Bb1N/DgmtgAQ1ZP+AKjk6FKkwZRF1X/VZkZ6auscDlaPetF7razPeIJUrKN\n" +
+    "z/x4AD2txGYKmeYztYR577hPXBw+PPKdggRhIugb6z5Tk89C2pDEwfnByA/wcGJr\n" +
+    "w5avxrubosPrp0QtJpZMzouOvcD52VUiZzDfu9dqI/hpinyt5rETj5E19qxBjIZt\n" +
+    "X3Nq5lY2ktbyqVIo8Z8w4EUU+3XHZKqDwjyYvjxCxv5lVVnqvQrH9h3kENBMrPYQ\n" +
+    "4XonQHpUGG7g7pA3ylmHi+nEedr0H5qKHzyFZlRdI7CLVNoAtBSdwvmtGd2cVVXU\n" +
+    "EaToKNbHPXXYYPX/oVAWZYwD7PHXIRJkiEZnrFARNhLypicU7yjvejUPXcVy5HMh\n" +
+    "XqEbrODPp4VXfbYhVg==\n" +
+    "-----END ENCRYPTED PRIVATE KEY-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDXjCCAkYCAhI0MA0GCSqGSIb3DQEBBAUAMHcxCzAJBgNVBAYTAlVTMRMwEQYD\n" +
+    "VQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhTYW4gSm9zZTEXMBUGA1UECgwOUGVy\n" +
+    "c29uYWwsIEluYy4xEDAOBgNVBAsMB1Jvb3QgQ0ExFTATBgNVBAMMDG15ZG9tYWlu\n" +
+    "LmNvbTAeFw0yMTExMjIyMjQ5MzlaFw0yMjExMjIyMjQ5MzlaMHIxCzAJBgNVBAYT\n" +
+    "AlVTMRMwEQYDVQQIDApDYWxpZm9ybmlhMREwDwYDVQQHDAhTYW4gSm9zZTEXMBUG\n" +
+    "A1UECgwOUGVyc29uYWwsIEluYy4xCzAJBgNVBAsMAklUMRUwEwYDVQQDDAxteWRv\n" +
+    "bWFpbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC5fdA7wwD9\n" +
+    "9e5RcdLscvGB+hqJUEHuNC53SYKg5X4Sf0H4ExQUbsy8UaoWzWHhgGbCtTvUVavl\n" +
+    "72xsO74ei0EblopW7QknF0kaTO8Vi3mxhUAdtZFLG/o0NS9J16HdGDGojJwuqU9+\n" +
+    "sMQt1w0HCTMlriELnxaUFKP7M9b0uK5VODEKJ38QKNGXUDt66D7BVYeT/6hz2cXK\n" +
+    "QWDoHk/JadALSzW5ES8KIHfxCLnl2TcKxQhJ4CnL8qeGvc8N3VyTh2AXajaJW5RB\n" +
+    "8Oy4CVoYxcdmP1IapxCD+yNcmNt9XpUTD+6eM5gnvtbye+MSfwPz2MW+fWEDZXOv\n" +
+    "3VxhJyTRFNVTAgMBAAEwDQYJKoZIhvcNAQEEBQADggEBADYK/pn6QG7bvUL0Xnnw\n" +
+    "1KPf1nx36gfJE2V0bNk4uyNNeYufMKS8gPLzC+a3RigCEDc+hIZFE5BJexHd7DXA\n" +
+    "CWgHZJtdjM/Xlgoxbf1yfGV3DWeIZlNFSFZujBIpbm1Ug2BAeV31YRWODPZlUSEZ\n" +
+    "0jv8NEs8/oEz9bM4jwRdn09lo4D9hE6o8qDnrzmN2LBZP5dDIJ6g/M+mq/SJFnho\n" +
+    "qBrfUABZhbgk2+tkZ89OI2xpASCLo6X/vqua2iho6km3x+cz6EI9BbvVr6xOOdVK\n" +
+    "m6gs/Bi4MGTh35jdmvyXoyBUOd1w3yBBj86qbEt2ZHYqreRTxntQYx06598Q9Dsi\n" +
+    "xdg=\n" +
+    "-----END CERTIFICATE-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDajCCAlICCQD/7mxPcMTPIDANBgkqhkiG9w0BAQsFADB3MQswCQYDVQQGEwJV\n" +
+    "UzETMBEGA1UECAwKQ2FsaWZvcm5pYTERMA8GA1UEBwwIU2FuIEpvc2UxFzAVBgNV\n" +
+    "BAoMDlBlcnNvbmFsLCBJbmMuMRAwDgYDVQQLDAdSb290IENBMRUwEwYDVQQDDAxt\n" +
+    "eWRvbWFpbi5jb20wHhcNMjExMTIyMjExODAwWhcNNDkwNDA5MjExODAwWjB3MQsw\n" +
+    "CQYDVQQGEwJVUzETMBEGA1UECAwKQ2FsaWZvcm5pYTERMA8GA1UEBwwIU2FuIEpv\n" +
+    "c2UxFzAVBgNVBAoMDlBlcnNvbmFsLCBJbmMuMRAwDgYDVQQLDAdSb290IENBMRUw\n" +
+    "EwYDVQQDDAxteWRvbWFpbi5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEK\n" +
+    "AoIBAQCkIwuNGv3ckew/o2UwaDlYgXH9bh1jap4ZCb6qpjvR3tq9nCerY6XMli0Z\n" +
+    "Xxg0wMHDNUr/jmVYIdQjbz0DVNz/l6ZBJHzHCEgqR40pNM3NgC5sDyuNhF3WLNvj\n" +
+    "WgHEwYosfb/9kFRjKUPqqtJ0ccj87OP3XrE/4epCTdJdmugroAQSpXt1ZZfwwPO4\n" +
+    "K27DzMD9W01EmeLcUhMfrpUnKGCfL22c0sZZm/6Khk4BExC3pSILP/NREKeUEAHw\n" +
+    "+rxhNqbUyD/e4/DutdtJ5zONA+GVVGYCpu1Iy0W78Jve4MD2/TFPcEzf5omiWpPz\n" +
+    "WjpOWayD43ur0SZnYJ5haUlZ+bSLAgMBAAEwDQYJKoZIhvcNAQELBQADggEBABqN\n" +
+    "/eb+mKEw2zklPZuzy5uhOc7ImG2LP/ha3oc2ntwkqZQ2LmVA/2ZNVfcNrRRngIfn\n" +
+    "Ir9Kual7djmKmIQvanpnSyXOKOlIiuN0VOrewgzlBZZwlFJL/AH1l7K9uZfBbV5h\n" +
+    "oFfaR9wc+vRGsg3nqO9+hEuk6xbp0jk8QCt26EVhEPlijxzbxTQYiNPNSLuf/kPW\n" +
+    "C9xtIKSWIDT4N6DtH7BtHGQKQdRJ2b4SSUF4joEmBe6jcrLBeDybmuFtKqlVJKUk\n" +
+    "tzBd9CPseqMML1c518KzxlSkXNxTCa7PWEnuN5atLZ+pGGjxtGcDKkrZ9Cgi09G8\n" +
+    "MzB8b4C/goypyhBNlyI=\n" +
+    "-----END CERTIFICATE-----";
+    private static final String encoded_encrypted_dsa_key =
+    "-----BEGIN ENCRYPTED PRIVATE KEY-----\n" +
+    "MIICkTAbBgkqhkiG9w0BBQMwDgQIL1GiUDca2x0CAggABIICcCrSiNBy5kZNC7RK\n" +
+    "fVF3IZ9Ecl00OYIjvBhlWGkaiNt9ZAeWPpYx57HSQAygzJ8ba+3jtz1dV8Bhz5D5\n" +
+    "4kggzolC820I/QLPxClH5R6ZPzDHGu/JFuNNZWASq2JHZfolEP+itdnz0F6VvQx9\n" +
+    "imngOGIJMkRWIzvwuCnq8xpNSEJHJcs8kyLBP/3qT+kUiEwJ5KrmJ8DQsHluwpyo\n" +
+    "GoiGEtiA+MNUSzc/DkuLxhC45k7K4afe4QzpWl9eR/z91F9Q06jdc5mnUWke8qCg\n" +
+    "ZopBVWbSI6fMZVlqLxKeSFljDZ+moW+2/Lh8cjEvNMccVTwWQE7JH9RLnVogqixV\n" +
+    "HIpN58wrlHd4uMVH47wD18A11AGEbghO1MEShX4SCEJIdZsr67bNx8mIkhSWjqAx\n" +
+    "BT9OmITzdbnR9sHi4CyEWhGMAMDp7YBySwpt+U7Y6DvRwWJbXUaF8zYJUlrp2IbH\n" +
+    "qdSE+oJPKxGB1s2B5KGrJUA0JkElkBUYm6ghXZlTI32w8HoV9fDOhjx1ATu7SdZY\n" +
+    "8DX0mwVVdc88Msr5RPxdeB3V4yN2iFJs4i3usicPkB0N+29LJ/lKQlm/pia0yl9j\n" +
+    "yDNN3R0RiCJdYHme4t1PqRqeTfjMauz05ObennQmkzMxD8mlBZ0zhaKL5I4TuQod\n" +
+    "PITFgYihTR9OYfa8lryvHQNCIi5iZ6M9myLUxbjPoeVBdp8pSlMAjmekEHo47vn3\n" +
+    "7IGF7AfnKVNymc/1Kim3WQx8D7nryCb8EUyb7BuNA7izGKq+NW51l39J8RGVcFSx\n" +
+    "sVkpFUbqGXusUgLWWwi21EJHCJceFnOWJRgsoeqNeCt5VCUSag==\n" +
+    "-----END ENCRYPTED PRIVATE KEY-----\n" +
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIEeDCCBB4CCQD9UojL1A7cmzAJBgcqhkjOOAQDME0xCzAJBgNVBAYTAlVTMQsw\n" +
+    "CQYDVQQIDAJDQTERMA8GA1UEBwwIU2FuIEpvc2UxETAPBgNVBAoMCFBlcnNvbmFs\n" +
+    "MQswCQYDVQQLDAJJVDAeFw0yMTEwMTgyMzU0MjRaFw0yMjEwMTgyMzU0MjRaME0x\n" +
+    "CzAJBgNVBAYTAlVTMQswCQYDVQQIDAJDQTERMA8GA1UEBwwIU2FuIEpvc2UxETAP\n" +
+    "BgNVBAoMCFBlcnNvbmFsMQswCQYDVQQLDAJJVDCCA0YwggI5BgcqhkjOOAQBMIIC\n" +
+    "LAKCAQEAzxMsktQYQ06q71pwqWAa9YvDIkF34RJgQT5tqCZdzwtP7HXyrwaZBgLK\n" +
+    "oC4grIPKyUlPmIbm+oucucbTzDCYCx2d09VMVR471vqJi7vRCYnBIqMTTOSvbTGw\n" +
+    "8VuwA2prSt4TiqFYeqYM0Afv/KrI2MLNTP+z8RFfiLkijZIxZ9CzyHmTOEqHxOft\n" +
+    "Ln145NNcuPy3U7Bmh5k7i+RR+5jYweuLzOfTK4bTUnG111mjAhAeo+ST14ydfiuQ\n" +
+    "2e85UwLucVheh4REqm+n7g0k0B/+nG+9Os1nxfQVRVKHP4/iTrNLpf35EoPeh9XT\n" +
+    "D0BtV9lqQuttCB1aPLH66TKl9v4FowIhAMXhJ3LooBT7ypUWMtN07FvpPpoLERBr\n" +
+    "Pk9MeGwQnBPFAoIBAAcVYJ+RH1i8JFyD8MUwwOKgkmVzbRvc28B5F17oek76R6fi\n" +
+    "yyqyhHrkxmjwxktXuwRlWQBJqCTqpmMstLplqsVjcETHo7KRaHgDpT9tHf14PZvP\n" +
+    "qpoxYNpa5z4wPpOFhZ3K6VVaFUSlqSSHhaS1HqVzZC0FefFFd3TDKu0EWHDDkLM8\n" +
+    "luOxDUMydKpRtrVba+iF4kx9NcCyXjSMhFAOw3cWhGvoq6R3h4UkRJO67pzYtqK4\n" +
+    "yAETPsQKT0c8NUM+VUiPAHL/+f1EqaVtzatk9G0OHWZXgDxuhx2CAM6QfELew+ys\n" +
+    "D/QUUT0tXHQRxRCKmYE+uacwyQx5G0DeCHN0c9gDggEFAAKCAQBFGXF7flzfRH/8\n" +
+    "r/qDuNC+9y3fRtDWXaados+XQkzujizBBK9dkkAd/j/pgP5p7/bRvoeR507Oyrge\n" +
+    "6xBbfE7SlRu0cx08Ihlw7a6mCowMnP0psFBwW7npKJRYPXxRDpu9oUuuJHi1WYp7\n" +
+    "8/Ekg6hG21zAYO0JLGyU6aH5Rvuls754R+rxqveVqLiig5NTnfw7ymLb2kF1z8g7\n" +
+    "fDvX6OS242ceQIQHvq97cGnysEVSlavuHfbh3PKXklh91ip/BYuzanQjiEb97YIU\n" +
+    "DhMQyPGvk+iDdhD0PwgwOZB0P0mL7Xszw6p+lfzUc+g8jETjrnzksnVEg8On6q3Q\n" +
+    "RDJG9VnuMAkGByqGSM44BAMDSQAwRgIhAIay5hyZrwHslGXmTAx498903l7CQsdi\n" +
+    "fUrmGkxbPiZXAiEAitS8+gyG64c0jV7V/u8Z1NEL8MI47K2P9Jbn3cqzz3k=\n" +
+    "-----END CERTIFICATE-----";
+    private static final String invalid_encoded_private_key =
+    "-----BEGIN PRIVATE KEY-----\n" +
+    "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCOSZVf8dLj1xLw\n" +
+    "efqjbogbAwhwRXd3tmEfQY1zHyudJF3XR1T0Xp26BKNvAYUxxZRDNg16M3prPRZv\n" +
+    "wkhDJdE9NaN+BpZPJUavRsZOfGDq/CHN8j/2PPKrn3G/b065JjV3GZjfV/Sln047\n" +
+    "DeZptaSyOg7ZN7F8qjGqxEcnw+szV/wTzhnjGjZMlcbOm4jFGQAn6xUOooQCGsoB\n" +
+    "9FgxKB0nvNG3xVe/2eCNfbS4DabT3Y1wfQqZ62hOa5ZS0rwT+pw3tQs3zFFY1Sfi\n" +
+    "G7qYbqZrKTheWIZGojVVm6mqH4yA2ofOe5N3RsBitCwU/D0dpnaG9Wcl98nmXueM\n" +
+    "B6Rk04v7AgMBAAECggEAYnxIKjrFz/JkJ5MmiszM5HV698r9YB0aqHnFIHPoykIL\n" +
+    "uiCjiumantDrFsCkosixULwvI/BRwbxstTpyrheU9psT6P1CONICVPvV8ylgJAYU\n" +
+    "l+ofn56cEXKxVuICSWFLDH7pM1479g+IJJQAchbKQpqxAGTuMu3SpvJolfuj5srt\n" +
+    "bM7/RYhJFLwDuvHNA3ivlogMneItP03+C25aaxstM+lBuBf68+n78zMgSvt6J/6Y\n" +
+    "G2TOMKnxveMlG2qu9l2lAw/2i8daG/qre08nTH7wpRx0gZLZqNpe45exkrzticzF\n" +
+    "FgWYjG2K2brX21jqHroFgMhdXF7zhhRgLoIeC0BrIQKBgQDCfGfWrJESKBbVai5u\n" +
+    "7wqD9nlzjv6N6FXfTDOPXO1vz5frdvtLVWbs0SMPy+NglkaZK0iqHvb9mf2of8eC\n" +
+    "0D5cmewjn7WCDBQMypIMYgT912ak/BBVuGXcxb6UgD+xARfSARo2C8NG1hfprw1W\n" +
+    "ad14CjS5xhFMs44HpVYhI7iPYwKBgQC7SqVG/b37vZ7CINemdvoMujLvvYXDJJM8\n" +
+    "N21LqNJfVXdukdH3T0xuLnh9Z/wPHjJDMF/9+1foxSEPHijtyz5P19EilNEC/3qw\n" +
+    "fI19+VZoY0mdhPtXSGzy+rbTE2v71QgwFLizSos14Gr+eNiIjF7FYccK05++K/zk\n" +
+    "cd8ZA3bwiQKBgQCl+HTFBs9mpz+VMOAfW2+l3hkXPNiPUc62mNkHZ05ZNNd44jjh\n" +
+    "uSf0wSUiveR08MmevQlt5K7zDQ8jVKh2QjB15gVXAVxsdtJFeDnax2trFP9LnLBz\n" +
+    "9sE2/qn9INU5wK0LUlWD+dXUBbCyg+jl7cJKRqtoPldVFYYHkFlIPqup8QKBgHXv\n" +
+    "hyuw1FUVDkdHzwOvn70r8q8sNHKxMVWVwWkHIZGOi+pAQGrusD4hXRX6yKnsZdIR\n" +
+    "QCD6iFy25R5T64nxlYdJaxPPid3NakB/7ckJnPOWseBSwMIxhQlr/nvjmve1Kba9\n" +
+    "FaEwq4B9lGIxToiNe4/nBiM3JzvlDxX67nUdzWOhAoGAdFvriyvjshSJ4JHgIY9K\n" +
+    "37BVB0VKMcFV2P8fLVWO5oyRtE1bJhU4QVpQmauABU4RGSojJ3NPIVH1wxmJeYtj\n" +
+    "Q3b7EZaqI6ovna2eK2qtUx4WwxhRaXTT8xueBI2lgL6sBSTGG+K69ZOzGQzG/Mfr\n" +
+    "RXKInnLInFD9JD94VqmMozoInvalidData=\n" +
+    "-----END PRIVATE KEY-----\n";
+    private static final String invalid_encoded_certificate =
+    "-----BEGIN CERTIFICATE-----\n" +
+    "MIIDkTCCAnmgAwIBAgIETxH5JDANBgkqhkiG9w0BAQsFADB5MRAwDgYDVQQGEwdV\n" +
+    "bmtub3duMRAwDgYDVQQIEwdVbmtub3duMRAwDgYDVQQHEwdVbmtub3duMRAwDgYD\n" +
+    "VQQKEwdVbmtub3duMRQwEgYDVQQLDAtzc2xfdGVzdGluZzEZMBcGA1UEAxMQQXBh\n" +
+    "Y2hlIENhc3NhbmRyYTAeFw0xNjAzMTgyMTI4MDJaFw0xNjA2MTYyMTI4MDJaMHkx\n" +
+    "EDAOBgNVBAYTB1Vua25vd24xEDAOBgNVBAgTB1Vua25vd24xEDAOBgNVBAcTB1Vu\n" +
+    "a25vd24xEDAOBgNVBAoTB1Vua25vd24xFDASBgNVBAsMC3NzbF90ZXN0aW5nMRkw\n" +
+    "FwYDVQQDExBBcGFjaGUgQ2Fzc2FuZHJhMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A\n" +
+    "MIIBCgKCAQEAjkmVX/HS49cS8Hn6o26IGwMIcEV3d7ZhH0GNcx8rnSRd10dU9F6d\n" +
+    "ugSjbwGFMcWUQzYNejN6az0Wb8JIQyXRPTWjfgaWTyVGr0bGTnxg6vwhzfI/9jzy\n" +
+    "q59xv29OuSY1dxmY31f0pZ9OOw3mabWksjoO2TexfKoxqsRHJ8PrM1f8E84Z4xo2\n" +
+    "TJXGzpuIxRkAJ+sVDqKEAhrKAfRYMSgdJ7zRt8VXv9ngjX20uA2m092NcH0Kmeto\n" +
+    "TmuWUtK8E/qcN7ULN8xRWNUn4hu6mG6mayk4XliGRqI1VZupqh+MgNqHznuTd0bA\n" +
+    "YrQsFPw9HaZ2hvVnJffJ5l7njAekZNOL+wIDAQABoyEwHzAdBgNVHQ4EFgQUcdiD\n" +
+    "N6aylI91kAd34Hl2AzWY51QwDQYJKoZIhvcNAQELBQADggEBAG9q29ilUgCWQP5v\n" +
+    "iHkZHj10gXGEoMkdfrPBf8grC7dpUcaw1Qfku/DJ7kPvMALeEsmFDk/t78roeNbh\n" +
+    "IYBLJlzI1HZN6VPtpWQGsqxltAy5XN9Xw9mQM/tu70ShgsodGmE1UoW6eE5+/GMv\n" +
+    "6Fg+zLuICPvs2cFNmWUvukN5LW146tJSYCv0Q/rCPB3m9dNQ9pBxrzPUHXw4glwG\n" +
+    "qGnGddXmOC+tSW5lDLLG1BRbKv4zxv3UlrtIjqlJtZb/sQMT6WtG2ihAz7SKOBHa\n" +
+    "HOWUwuPTetWIuJCKP7P4mWWtmSmjLy+BFX5seNEngn3RzJ2L8uuTJQ/88OsqgGru\n" +
+    "n3MVF9wInvalidData=\n" +
+    "-----END CERTIFICATE-----";
+
+    @Test
+    public void readEncryptedKey() throws IOException, GeneralSecurityException
+    {
+        PrivateKey privateKey = PEMReader.extractPrivateKey(encoded_encrypted_key, "cassandra");
+        Assert.assertNotNull(privateKey);
+    }
+
+    @Test
+    public void readEncryptedDSAKey() throws IOException, GeneralSecurityException
+    {
+        PrivateKey privateKey = PEMReader.extractPrivateKey(encoded_encrypted_dsa_key, "mytest");
+        Assert.assertNotNull(privateKey);
+    }
+
+    @Test(expected = GeneralSecurityException.class)
+    public void readEncryptedDSAKeyWithBadPassword() throws IOException, GeneralSecurityException
+    {
+        try
+        {
+            PEMReader.extractPrivateKey(encoded_encrypted_dsa_key, "bad-password");
+        } catch(GeneralSecurityException e) {
+            Assert.assertTrue(e.getMessage().startsWith("Failed to decrypt the private key data. Either the password " +
+                                                        "provided for the key is wrong or the private key data is " +
+                                                        "corrupted. msg="));
+            throw e;
+        }
+    }
+
+    @Test(expected = GeneralSecurityException.class)
+    public void readInvalidEncryptedKey() throws IOException, GeneralSecurityException
+    {
+        // Test by injecting junk data in the given key and making it invalid
+        PrivateKey privateKey = PEMReader.extractPrivateKey(encoded_encrypted_key.replaceAll("\\s",
+                                                                                             String.valueOf(System.nanoTime())),
+                                                            "cassandra");
+        Assert.assertNotNull(privateKey);
+    }
+
+    @Test(expected = GeneralSecurityException.class)
+    public void readInvalidBase64PrivateKey() throws IOException, GeneralSecurityException
+    {
+        PEMReader.extractPrivateKey(invalid_encoded_private_key);
+    }
+
+    @Test
+    public void readUnencryptedKey() throws IOException, GeneralSecurityException
+    {
+        PrivateKey privateKey = PEMReader.extractPrivateKey(encoded_key);
+        Assert.assertNotNull(privateKey);
+    }
+
+    @Test
+    public void readUnencryptedECKey() throws IOException, GeneralSecurityException
+    {
+        PrivateKey privateKey = PEMReader.extractPrivateKey(encoded_unencrypted_ec_private_key);
+        Assert.assertNotNull(privateKey);
+    }
+
+    @Test
+    public void readCertChain() throws GeneralSecurityException
+    {
+        Certificate[] certificates = PEMReader.extractCertificates(encoded_encrypted_key);
+        Assert.assertNotNull("CertChain must not be null", certificates);
+        Assert.assertTrue("CertChain must have only one certificate", certificates.length == 1);
+    }
+
+    @Test
+    public void readCertChainWithMoreThanOneCerts() throws GeneralSecurityException
+    {
+        Certificate[] certificates = PEMReader.extractCertificates(encoded_encrypted_key_with_multiplecerts_in_chain);
+        Assert.assertNotNull("CertChain must not be null", certificates);
+    }
+
+    @Test(expected = GeneralSecurityException.class)
+    public void readInvalidCertificate() throws GeneralSecurityException
+    {
+        // Test by injecting junk data in the given key and making it invalid
+        Certificate[] certificates = PEMReader.extractCertificates(encoded_encrypted_key.replaceAll("\\s",
+                                                                                                    String.valueOf(System.nanoTime())));
+        Assert.assertNotNull("CertChain must not be null", certificates);
+        Assert.assertTrue("CertChain must have only one certificate", certificates.length == 1);
+    }
+
+    @Test(expected = GeneralSecurityException.class)
+    public void readInvalidBase64Certificate() throws GeneralSecurityException
+    {
+        PEMReader.extractCertificates(invalid_encoded_certificate);
+    }
+
+    @Test
+    public void readTrustedCertificates() throws GeneralSecurityException
+    {
+        Certificate[] certificates = PEMReader.extractCertificates(encoded_certificates);
+        Assert.assertNotNull("Trusted certificate list must not be null", certificates);
+        Assert.assertTrue("Trusted certificate list must have only one certificate", certificates.length == 1);
+    }
+
+    @Test(expected = UnsupportedOperationException.class)
+    public void tamperSupportedAlgorithms() throws GeneralSecurityException
+    {
+        Set<String> original = PEMReader.SUPPORTED_PRIVATE_KEY_ALGORITHMS;
+        for (int i = 0; i < original.size(); i++)
+        {
+            original.remove("RSA");
+            original.remove("DSA");
+            original.remove("EC");
+            original.add("TAMPERED");
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/security/SSLFactoryTest.java b/test/unit/org/apache/cassandra/security/SSLFactoryTest.java
index 4cbc095..e5aa4b1 100644
--- a/test/unit/org/apache/cassandra/security/SSLFactoryTest.java
+++ b/test/unit/org/apache/cassandra/security/SSLFactoryTest.java
@@ -18,10 +18,11 @@
 */
 package org.apache.cassandra.security;
 
-import java.io.File;
+import org.apache.cassandra.io.util.File;
 import java.io.IOException;
 import java.security.cert.CertificateException;
-import javax.net.ssl.TrustManagerFactory;
+import java.util.HashMap;
+import java.util.Map;
 
 import org.apache.commons.io.FileUtils;
 import org.junit.Assert;
@@ -30,16 +31,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.netty.handler.ssl.JdkSslContext;
-import io.netty.handler.ssl.OpenSsl;
-import io.netty.handler.ssl.OpenSslContext;
 import io.netty.handler.ssl.SslContext;
 import io.netty.handler.ssl.util.SelfSignedCertificate;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.config.EncryptionOptions.ServerEncryptionOptions;
-
-import static org.junit.Assert.assertArrayEquals;
+import org.apache.cassandra.config.ParameterizedClass;
 
 public class SSLFactoryTest
 {
@@ -69,34 +66,6 @@
                             .withTrustStorePassword("cassandra")
                             .withRequireClientAuth(false)
                             .withCipherSuites("TLS_RSA_WITH_AES_128_CBC_SHA");
-
-        SSLFactory.checkedExpiry = false;
-    }
-
-    @Test
-    public void getSslContext_OpenSSL() throws IOException
-    {
-        // only try this test if OpenSsl is available
-        if (!OpenSsl.isAvailable())
-        {
-            logger.warn("OpenSSL not available in this application, so not testing the netty-openssl code paths");
-            return;
-        }
-
-        EncryptionOptions options = addKeystoreOptions(encryptionOptions);
-        SslContext sslContext = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, true);
-        Assert.assertNotNull(sslContext);
-        Assert.assertTrue(sslContext instanceof OpenSslContext);
-    }
-
-    @Test
-    public void getSslContext_JdkSsl() throws IOException
-    {
-        EncryptionOptions options = addKeystoreOptions(encryptionOptions);
-        SslContext sslContext = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, false);
-        Assert.assertNotNull(sslContext);
-        Assert.assertTrue(sslContext instanceof JdkSslContext);
-        Assert.assertEquals(encryptionOptions.cipher_suites, sslContext.cipherSuites());
     }
 
     private ServerEncryptionOptions addKeystoreOptions(ServerEncryptionOptions options)
@@ -105,48 +74,14 @@
                       .withKeyStorePassword("cassandra");
     }
 
-    @Test(expected = IOException.class)
-    public void buildTrustManagerFactory_NoFile() throws IOException
+    private ServerEncryptionOptions addPEMKeystoreOptions(ServerEncryptionOptions options)
     {
-        SSLFactory.buildTrustManagerFactory(encryptionOptions.withTrustStore("/this/is/probably/not/a/file/on/your/test/machine"));
-    }
-
-    @Test(expected = IOException.class)
-    public void buildTrustManagerFactory_BadPassword() throws IOException
-    {
-        SSLFactory.buildTrustManagerFactory(encryptionOptions.withTrustStorePassword("HomeOfBadPasswords"));
-    }
-
-    @Test
-    public void buildTrustManagerFactory_HappyPath() throws IOException
-    {
-        TrustManagerFactory trustManagerFactory = SSLFactory.buildTrustManagerFactory(encryptionOptions);
-        Assert.assertNotNull(trustManagerFactory);
-    }
-
-    @Test(expected = IOException.class)
-    public void buildKeyManagerFactory_NoFile() throws IOException
-    {
-        EncryptionOptions options = addKeystoreOptions(encryptionOptions)
-                                    .withKeyStore("/this/is/probably/not/a/file/on/your/test/machine");
-        SSLFactory.buildKeyManagerFactory(options);
-    }
-
-    @Test(expected = IOException.class)
-    public void buildKeyManagerFactory_BadPassword() throws IOException
-    {
-        EncryptionOptions options = addKeystoreOptions(encryptionOptions)
-                                    .withKeyStorePassword("HomeOfBadPasswords");
-        SSLFactory.buildKeyManagerFactory(options);
-    }
-
-    @Test
-    public void buildKeyManagerFactory_HappyPath() throws IOException
-    {
-        Assert.assertFalse(SSLFactory.checkedExpiry);
-        EncryptionOptions options = addKeystoreOptions(encryptionOptions);
-        SSLFactory.buildKeyManagerFactory(options);
-        Assert.assertTrue(SSLFactory.checkedExpiry);
+        ParameterizedClass sslContextFactoryClass = new ParameterizedClass("org.apache.cassandra.security.PEMBasedSslContextFactory",
+                                                                           new HashMap<>());
+        return options.withSslContextFactory(sslContextFactoryClass)
+                      .withKeyStore("test/conf/cassandra_ssl_test.keystore.pem")
+                      .withKeyStorePassword("cassandra")
+                      .withTrustStore("test/conf/cassandra_ssl_test.truststore.pem");
     }
 
     @Test
@@ -159,17 +94,47 @@
 
             SSLFactory.initHotReloading(options, options, true);
 
-            SslContext oldCtx = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, OpenSsl
-                                                                                                           .isAvailable());
+            SslContext oldCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
             File keystoreFile = new File(options.keystore);
 
             SSLFactory.checkCertFilesForHotReloading(options, options);
 
-            keystoreFile.setLastModified(System.currentTimeMillis() + 15000);
+            keystoreFile.trySetLastModified(System.currentTimeMillis() + 15000);
 
             SSLFactory.checkCertFilesForHotReloading(options, options);
-            SslContext newCtx = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, OpenSsl
-                                                                                                          .isAvailable());
+            SslContext newCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
+
+            Assert.assertNotSame(oldCtx, newCtx);
+        }
+        catch (Exception e)
+        {
+            throw e;
+        }
+        finally
+        {
+            DatabaseDescriptor.loadConfig();
+        }
+    }
+
+    @Test
+    public void testPEMSslContextReload_HappyPath() throws IOException, InterruptedException
+    {
+        try
+        {
+            ServerEncryptionOptions options = addPEMKeystoreOptions(encryptionOptions)
+                                              .withInternodeEncryption(ServerEncryptionOptions.InternodeEncryption.all);
+
+            SSLFactory.initHotReloading(options, options, true);
+
+            SslContext oldCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
+            File keystoreFile = new File(options.keystore);
+
+            SSLFactory.checkCertFilesForHotReloading(options, options);
+
+            keystoreFile.trySetLastModified(System.currentTimeMillis() + 15000);
+
+            SSLFactory.checkCertFilesForHotReloading(options, options);
+            SslContext newCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
 
             Assert.assertNotSame(oldCtx, newCtx);
         }
@@ -201,18 +166,16 @@
             ServerEncryptionOptions options = addKeystoreOptions(encryptionOptions);
 
             SSLFactory.initHotReloading(options, options, true);
-            SslContext oldCtx = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, OpenSsl
-                                                                                                          .isAvailable());
+            SslContext oldCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
             File keystoreFile = new File(options.keystore);
 
             SSLFactory.checkCertFilesForHotReloading(options, options);
-            keystoreFile.setLastModified(System.currentTimeMillis() + 5000);
+            keystoreFile.trySetLastModified(System.currentTimeMillis() + 5000);
 
             ServerEncryptionOptions modOptions = new ServerEncryptionOptions(options)
                                                  .withKeyStorePassword("bad password");
             SSLFactory.checkCertFilesForHotReloading(modOptions, modOptions);
-            SslContext newCtx = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, OpenSsl
-                                                                                                          .isAvailable());
+            SslContext newCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
 
             Assert.assertSame(oldCtx, newCtx);
         }
@@ -230,21 +193,19 @@
             ServerEncryptionOptions options = addKeystoreOptions(encryptionOptions);
 
             File testKeystoreFile = new File(options.keystore + ".test");
-            FileUtils.copyFile(new File(options.keystore),testKeystoreFile);
-            options = options.withKeyStore(testKeystoreFile.getPath());
+            FileUtils.copyFile(new File(options.keystore).toJavaIOFile(), testKeystoreFile.toJavaIOFile());
+            options = options.withKeyStore(testKeystoreFile.path());
 
 
             SSLFactory.initHotReloading(options, options, true);
-            SslContext oldCtx = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, OpenSsl
-                                                                                                          .isAvailable());
+            SslContext oldCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
             SSLFactory.checkCertFilesForHotReloading(options, options);
 
-            testKeystoreFile.setLastModified(System.currentTimeMillis() + 15000);
-            FileUtils.forceDelete(testKeystoreFile);
+            testKeystoreFile.trySetLastModified(System.currentTimeMillis() + 15000);
+            FileUtils.forceDelete(testKeystoreFile.toJavaIOFile());
 
             SSLFactory.checkCertFilesForHotReloading(options, options);
-            SslContext newCtx = SSLFactory.getOrCreateSslContext(options, true, SSLFactory.SocketType.CLIENT, OpenSsl
-                                                                                                          .isAvailable());
+            SslContext newCtx = SSLFactory.getOrCreateSslContext(options, true, ISslContextFactory.SocketType.CLIENT);
 
             Assert.assertSame(oldCtx, newCtx);
         }
@@ -255,7 +216,7 @@
         finally
         {
             DatabaseDescriptor.loadConfig();
-            FileUtils.deleteQuietly(new File(encryptionOptions.keystore + ".test"));
+            FileUtils.deleteQuietly(new File(encryptionOptions.keystore + ".test").toJavaIOFile());
         }
     }
 
@@ -267,7 +228,7 @@
                                     .withCipherSuites("TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256");
 
         SslContext ctx1 = SSLFactory.getOrCreateSslContext(options, true,
-                                                           SSLFactory.SocketType.SERVER, OpenSsl.isAvailable());
+                                                           ISslContextFactory.SocketType.SERVER);
 
         Assert.assertTrue(ctx1.isServer());
         Assert.assertEquals(ctx1.cipherSuites(), options.cipher_suites);
@@ -275,9 +236,69 @@
         options = options.withCipherSuites("TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256");
 
         SslContext ctx2 = SSLFactory.getOrCreateSslContext(options, true,
-                                                           SSLFactory.SocketType.CLIENT, OpenSsl.isAvailable());
+                                                           ISslContextFactory.SocketType.CLIENT);
 
         Assert.assertTrue(ctx2.isClient());
         Assert.assertEquals(ctx2.cipherSuites(), options.cipher_suites);
     }
+
+    @Test
+    public void testCacheKeyEqualityForCustomSslContextFactory() {
+
+        Map<String,String> parameters1 = new HashMap<>();
+        parameters1.put("key1", "value1");
+        parameters1.put("key2", "value2");
+        EncryptionOptions encryptionOptions1 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters1))
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(true)
+        .withRequireEndpointVerification(false);
+
+        SSLFactory.CacheKey cacheKey1 = new SSLFactory.CacheKey(encryptionOptions1, ISslContextFactory.SocketType.SERVER
+        );
+
+        Map<String,String> parameters2 = new HashMap<>();
+        parameters2.put("key1", "value1");
+        parameters2.put("key2", "value2");
+        EncryptionOptions encryptionOptions2 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters2))
+        .withProtocol("TLSv1.1")
+        .withRequireClientAuth(true)
+        .withRequireEndpointVerification(false);
+
+        SSLFactory.CacheKey cacheKey2 = new SSLFactory.CacheKey(encryptionOptions2, ISslContextFactory.SocketType.SERVER
+        );
+
+        Assert.assertEquals(cacheKey1, cacheKey2);
+    }
+
+    @Test
+    public void testCacheKeyInequalityForCustomSslContextFactory() {
+
+        Map<String,String> parameters1 = new HashMap<>();
+        parameters1.put("key1", "value11");
+        parameters1.put("key2", "value12");
+        EncryptionOptions encryptionOptions1 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters1))
+        .withProtocol("TLSv1.1");
+
+        SSLFactory.CacheKey cacheKey1 = new SSLFactory.CacheKey(encryptionOptions1, ISslContextFactory.SocketType.SERVER
+        );
+
+        Map<String,String> parameters2 = new HashMap<>();
+        parameters2.put("key1", "value21");
+        parameters2.put("key2", "value22");
+        EncryptionOptions encryptionOptions2 =
+        new EncryptionOptions()
+        .withSslContextFactory(new ParameterizedClass(DummySslContextFactoryImpl.class.getName(), parameters2))
+        .withProtocol("TLSv1.1");
+
+        SSLFactory.CacheKey cacheKey2 = new SSLFactory.CacheKey(encryptionOptions2, ISslContextFactory.SocketType.SERVER
+        );
+
+        Assert.assertNotEquals(cacheKey1, cacheKey2);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java b/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java
index ac63f31..e8abbae 100644
--- a/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java
+++ b/test/unit/org/apache/cassandra/serializers/TimestampSerializerTest.java
@@ -26,6 +26,8 @@
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 public class TimestampSerializerTest
 {
     public static final long ONE_SECOND = 1000L;
@@ -200,7 +202,7 @@
     public void testNumeric()
     {
         // now (positive
-        final long now = System.currentTimeMillis();
+        final long now = currentTimeMillis();
         assertEquals(now, TimestampSerializer.dateStringToTimestamp(Long.toString(now)));
 
         // negative
@@ -226,7 +228,7 @@
     public void testNow()
     {
         final long threshold = 5;
-        final long now = System.currentTimeMillis();
+        final long now = currentTimeMillis();
         final long parsed = TimestampSerializer.dateStringToTimestamp("now");
         assertTrue("'now' timestamp not within expected tolerance.", now <= parsed && parsed <= now + threshold);
     }
diff --git a/test/unit/org/apache/cassandra/service/AbstractFilesystemOwnershipCheckTest.java b/test/unit/org/apache/cassandra/service/AbstractFilesystemOwnershipCheckTest.java
new file mode 100644
index 0000000..0fc8559
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/AbstractFilesystemOwnershipCheckTest.java
@@ -0,0 +1,544 @@
+/*
+ * 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.service;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.Properties;
+import java.util.Random;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import org.junit.After;
+import org.junit.Assume;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.config.StartupChecksOptions;
+import org.apache.cassandra.exceptions.StartupException;
+import org.apache.cassandra.io.util.File;
+
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.DEFAULT_FS_OWNERSHIP_FILENAME;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.ERROR_PREFIX;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.INCONSISTENT_FILES_FOUND;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.INVALID_FILE_COUNT;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.INVALID_PROPERTY_VALUE;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.MISMATCHING_TOKEN;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.MISSING_PROPERTY;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.MULTIPLE_OWNERSHIP_FILES;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.NO_OWNERSHIP_FILE;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.READ_EXCEPTION;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.TOKEN;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.UNSUPPORTED_VERSION;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.VERSION;
+import static org.apache.cassandra.service.FileSystemOwnershipCheck.VOLUME_COUNT;
+import static org.apache.cassandra.service.StartupChecks.StartupCheckType.check_filesystem_ownership;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+@Ignore
+public abstract class AbstractFilesystemOwnershipCheckTest
+{
+    protected File tempDir;
+    protected String token;
+
+    protected StartupChecksOptions options = new StartupChecksOptions();
+
+    protected void setup()
+    {
+        cleanTempDir();
+        tempDir = new File(com.google.common.io.Files.createTempDir());
+        token = makeRandomString(10);
+        System.clearProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_FILENAME.getKey());
+        System.clearProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey());
+        System.clearProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.getKey());
+    }
+
+    static File writeFile(File dir, String filename, Properties props) throws IOException
+    {
+        File tokenFile = new File(dir, filename); //checkstyle: permit this instantiation
+        assertTrue(tokenFile.createFileIfNotExists());
+        try (OutputStream os = Files.newOutputStream(tokenFile.toPath()))
+        {
+            props.store(os, "Test properties");
+        }
+        assertTrue(tokenFile.isReadable());
+        return tokenFile;
+    }
+
+    private static void executeAndFail(FileSystemOwnershipCheck checker,
+                                       StartupChecksOptions options,
+                                       String messageTemplate,
+                                       Object...messageArgs)
+    {
+        try
+        {
+            checker.execute(options);
+            fail("Expected an exception but none thrown");
+        } catch (StartupException e) {
+            String expected = ERROR_PREFIX + String.format(messageTemplate, messageArgs);
+            assertEquals(expected, e.getMessage());
+        }
+    }
+
+    private static Properties makeProperties(int version, int volumeCount, String token)
+    {
+        Properties props = new Properties();
+        props.setProperty(VERSION, Integer.toString(version));
+        props.setProperty(VOLUME_COUNT, Integer.toString(volumeCount));
+        props.setProperty(TOKEN, token);
+        return props;
+    }
+
+    private static File writeFile(File dir, int volumeCount, String token) throws IOException
+    {
+        return AbstractFilesystemOwnershipCheckTest.writeFile(dir, DEFAULT_FS_OWNERSHIP_FILENAME, 1, volumeCount, token);
+    }
+
+    private static File writeFile(File dir, final String filename, int version, int volumeCount, String token)
+    throws IOException
+    {
+        return writeFile(dir, filename, AbstractFilesystemOwnershipCheckTest.makeProperties(version, volumeCount, token));
+    }
+
+    private static File mkdirs(File parent, String path)
+    {
+        File childDir = new File(parent, path); //checkstyle: permit this instantiation
+        assertTrue(childDir.tryCreateDirectories());
+        assertTrue(childDir.exists());
+        return childDir;
+    }
+
+    private static FileSystemOwnershipCheck checker(Supplier<Iterable<String>> dirs)
+    {
+        return new FileSystemOwnershipCheck(dirs);
+    }
+
+    private static FileSystemOwnershipCheck checker(File...dirs)
+    {
+        return checker(() -> Arrays.stream(dirs).map(File::absolutePath).collect(Collectors.toList()));
+    }
+
+    private static FileSystemOwnershipCheck checker(String...dirs)
+    {
+        return checker(() -> Arrays.asList(dirs));
+    }
+
+    public static String makeRandomString(int length)
+    {
+        Random random = new Random();
+        char[] chars = new char[length];
+        for (int i = 0; i < length; ++i)
+            chars[i] = (char) ('a' + random.nextInt('z' - 'a' + 1));
+        return new String(chars);
+    }
+
+    protected void cleanTempDir()
+    {
+        if (tempDir != null && tempDir.exists())
+            delete(tempDir);
+    }
+
+    private void delete(File file)
+    {
+        file.trySetReadable(true);
+        file.trySetWritable(true);
+        file.trySetExecutable(true);
+        File[] files = file.tryList();
+        if (files != null)
+        {
+            for (File child : files)
+            {
+                delete(child);
+            }
+        }
+        file.delete();
+    }
+
+    @BeforeClass
+    public static void setupConfig()
+    {
+        // PathUtils touches StorageService which touches StreamManager which requires configs be setup
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    @After
+    public void teardown() throws IOException
+    {
+        cleanTempDir();
+    }
+
+    // tests for enabling/disabling/configuring the check
+    @Test
+    public void skipCheckDisabledIfSystemPropertyIsEmpty() throws Exception
+    {
+        // no exceptions thrown from the supplier because the check is skipped
+        options.disable(check_filesystem_ownership);
+        System.clearProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.getKey());
+        AbstractFilesystemOwnershipCheckTest.checker(() -> { throw new RuntimeException("FAIL"); }).execute(options);
+    }
+
+    @Test
+    public void skipCheckDisabledIfSystemPropertyIsFalseButOptionsEnabled() throws Exception
+    {
+        // 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");
+        AbstractFilesystemOwnershipCheckTest.checker(() -> { throw new RuntimeException("FAIL"); }).execute(options);
+    }
+
+    @Test
+    public void checkEnabledButClusterPropertyIsEmpty()
+    {
+        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey(), "");
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(tempDir), options, MISSING_PROPERTY, CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey());
+    }
+
+    @Test
+    public void checkEnabledButClusterPropertyIsUnset()
+    {
+        Assume.assumeFalse(options.getConfig(check_filesystem_ownership).containsKey("ownership_token"));
+        System.clearProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey());
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(tempDir), options, MISSING_PROPERTY, CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey());
+    }
+
+    // tests for presence/absence of files in dirs
+    @Test
+    public void noRootDirectoryPresent() throws Exception
+    {
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker("/no/such/location"), options, NO_OWNERSHIP_FILE, "'/no/such/location'");
+    }
+
+    @Test
+    public void noDirectoryStructureOrTokenFilePresent() throws Exception
+    {
+        // The root directory exists, but is completely empty
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(tempDir), options, NO_OWNERSHIP_FILE, quote(tempDir.absolutePath()));
+    }
+
+    @Test
+    public void directoryStructureButNoTokenFiles() throws Exception
+    {
+        File childDir = new File(tempDir, "cassandra/data"); //checkstyle: permit this instantiation
+        assertTrue(childDir.tryCreateDirectories());
+        assertTrue(childDir.exists());
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(childDir), options, NO_OWNERSHIP_FILE, quote(childDir.absolutePath()));
+    }
+
+    @Test
+    public void multipleFilesFoundInSameTree() throws Exception
+    {
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir, 1, token);
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir.parent(), 1, token);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir), options, MULTIPLE_OWNERSHIP_FILES, leafDir);
+    }
+
+    @Test
+    public void singleValidFileInEachTree() throws Exception
+    {
+        // Happy path. Each target directory has exactly 1 token file in the
+        // dir above it, they all contain the supplied token and the correct
+        // count.
+        File[] leafDirs = new File[] { AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d1/data"),
+                                       AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d2/commitlogs"),
+                                       AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d3/hints") };
+        for (File dir : leafDirs)
+            AbstractFilesystemOwnershipCheckTest.writeFile(dir.parent(), 3, token);
+        AbstractFilesystemOwnershipCheckTest.checker(leafDirs).execute(options);
+    }
+
+    @Test
+    public void multipleDirsSingleTree() throws Exception
+    {
+        // Happy path. Each target directory has exactly 1 token file in the
+        // dir above it (as they all share a single parent). Each contains
+        // the supplied token and the correct count (1 in this case).
+        File[] leafDirs = new File[] { AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d1/data"),
+                                       AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d2/commitlogs"),
+                                       AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d3/hints") };
+        AbstractFilesystemOwnershipCheckTest.writeFile(tempDir, 1, token);
+        AbstractFilesystemOwnershipCheckTest.checker(leafDirs).execute(options);
+    }
+
+    @Test
+    public void someDirsContainNoFile() throws Exception
+    {
+        File leafDir1 = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir1, 3, token);
+        File leafDir2 = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/commitlogs");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir2, 3, token);
+        File leafDir3 = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/hints");
+
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir1, leafDir2, leafDir3),
+                                                            options,
+                                                            NO_OWNERSHIP_FILE,
+                                                            quote(leafDir3.absolutePath()));
+    }
+
+    @Test
+    public void propsFileUnreadable() throws Exception
+    {
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        File tokenFile = AbstractFilesystemOwnershipCheckTest.writeFile(leafDir.parent(), 1, token);
+        assertTrue(tokenFile.trySetReadable(false));
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            READ_EXCEPTION,
+                                                            leafDir.absolutePath());
+    }
+
+    @Test
+    public void propsFileIllegalContent() throws Exception
+    {
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        File propsFile = new File(leafDir, DEFAULT_FS_OWNERSHIP_FILENAME); //checkstyle: permit this instantiation
+        assertTrue(propsFile.createFileIfNotExists());
+        try (OutputStream os = Files.newOutputStream(propsFile.toPath()))
+        {
+            os.write(AbstractFilesystemOwnershipCheckTest.makeRandomString(40).getBytes());
+        }
+        assertTrue(propsFile.isReadable());
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, VERSION),
+                                                            leafDir.absolutePath());
+    }
+
+    @Test
+    public void propsParentDirUnreadable() throws Exception
+    {
+        // The props file itself is readable, but its dir is not
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir, 1, token);
+        assertTrue(leafDir.trySetReadable(false));
+        AbstractFilesystemOwnershipCheckTest.checker(leafDir).execute(options);
+    }
+
+    @Test
+    public void propsParentDirUntraversable() throws Exception
+    {
+        // top level dir can't be listed, so no files are found
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir.parent(), 1, token);
+        assertTrue(tempDir.trySetExecutable(false));
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            NO_OWNERSHIP_FILE,
+                                                            quote(leafDir.absolutePath()));
+    }
+
+    @Test
+    public void overrideFilename() throws Exception
+    {
+        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");
+        AbstractFilesystemOwnershipCheckTest.checker(leafDir).execute(options);
+    }
+
+    // check consistency between discovered files
+    @Test
+    public void differentTokensFoundInTrees() throws Exception
+    {
+        File file1 = AbstractFilesystemOwnershipCheckTest.writeFile(AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d1/data"), 3, token);
+        File file2 = AbstractFilesystemOwnershipCheckTest.writeFile(AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d2/commitlogs"), 3, token);
+        File file3 = AbstractFilesystemOwnershipCheckTest.writeFile(AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d3/hints"), 3, "mismatchingtoken");
+        String errorSuffix = String.format("['%s', '%s'], ['%s']",
+                                           file1.absolutePath(),
+                                           file2.absolutePath(),
+                                           file3.absolutePath());
+
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(file1.parent(), file2.parent(), file3.parent()),
+                                                            options,
+                                                            INCONSISTENT_FILES_FOUND,
+                                                            errorSuffix);
+    }
+
+    @Test
+    public void differentExpectedCountsFoundInTrees() throws Exception
+    {
+        File file1 = AbstractFilesystemOwnershipCheckTest.writeFile(AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d1/data"), 1, token);
+        File file2 = AbstractFilesystemOwnershipCheckTest.writeFile(AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d2/commitlogs"), 2, token);
+        File file3 = AbstractFilesystemOwnershipCheckTest.writeFile(AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d3/hints"), 3, "mismatchingtoken");
+        String errorSuffix = String.format("['%s'], ['%s'], ['%s']",
+                                           file1.absolutePath(),
+                                           file2.absolutePath(),
+                                           file3.absolutePath());
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(file1.parent(), file2.parent(), file3.parent()),
+                                                            options,
+                                                            INCONSISTENT_FILES_FOUND,
+                                                            errorSuffix);
+    }
+
+    // tests on property values in discovered files
+    @Test
+    public void emptyPropertiesFile() throws Exception
+    {
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        writeFile(leafDir.parent(), DEFAULT_FS_OWNERSHIP_FILENAME, new Properties());
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, VERSION),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void missingVersionProp() throws Exception
+    {
+        Properties p = new Properties();
+        p.setProperty(VOLUME_COUNT, "1");
+        p.setProperty(TOKEN, "foo");
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        writeFile(leafDir.parent(), DEFAULT_FS_OWNERSHIP_FILENAME, p);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, VERSION),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void nonNumericVersionProp() throws Exception
+    {
+        Properties p = new Properties();
+        p.setProperty(VERSION, "abc");
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        writeFile(leafDir.parent(), DEFAULT_FS_OWNERSHIP_FILENAME, p);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, VERSION),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void unsupportedVersionProp() throws Exception
+    {
+        Properties p = new Properties();
+        p.setProperty(VERSION, "99");
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        writeFile(leafDir.parent(), DEFAULT_FS_OWNERSHIP_FILENAME, p);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(UNSUPPORTED_VERSION, "99"),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void missingVolumeCountProp() throws Exception
+    {
+        Properties p = new Properties();
+        p.setProperty(VERSION, "1");
+        p.setProperty(TOKEN, token);
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        writeFile(leafDir.parent(), DEFAULT_FS_OWNERSHIP_FILENAME, p);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, VOLUME_COUNT),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void nonNumericVolumeCountProp() throws Exception
+    {
+        Properties p = new Properties();
+        p.setProperty(VERSION, "1");
+        p.setProperty(VOLUME_COUNT, "bar");
+        p.setProperty(TOKEN, token);
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        writeFile(leafDir.parent(), DEFAULT_FS_OWNERSHIP_FILENAME, p);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, VOLUME_COUNT),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void missingTokenProp() throws Exception
+    {
+        Properties p = new Properties();
+        p.setProperty(VERSION, "1");
+        p.setProperty(VOLUME_COUNT, "1");
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        writeFile(leafDir.parent(), DEFAULT_FS_OWNERSHIP_FILENAME, p);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, TOKEN),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void emptyTokenProp() throws Exception
+    {
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir.parent(), 1, "");
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            String.format(INVALID_PROPERTY_VALUE, TOKEN),
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    @Test
+    public void mismatchingTokenProp() throws Exception
+    {
+        // Ownership token file exists in parent, but content doesn't match property
+        File leafDir = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "cassandra/data");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir.parent(), 1, AbstractFilesystemOwnershipCheckTest.makeRandomString(15));
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir),
+                                                            options,
+                                                            MISMATCHING_TOKEN,
+                                                            leafDir.parent().toPath().resolve(DEFAULT_FS_OWNERSHIP_FILENAME));
+    }
+
+    // Validate volume_count prop values match number of files found
+    @Test
+    public void expectedVolumeCountMoreThanActual() throws Exception
+    {
+        // The files on disk indicate that we should expect 2 ownership files,
+        // but we only read 1, implying a disk mount is missing
+        File[] leafDirs = new File[] { AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d1/data"),
+                                       AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d2/commitlogs"),
+                                       AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d3/hints") };
+        AbstractFilesystemOwnershipCheckTest.writeFile(tempDir, 2, token);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDirs), options, INVALID_FILE_COUNT);
+    }
+
+    @Test
+    public void expectedVolumeCountLessThanActual() throws Exception
+    {
+        // The files on disk indicate that we should expect 1 ownership file,
+        // but we read 2, implying a extra unexpected disk mount is mounted
+        File leafDir1 = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d1/data");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir1, 1, token);
+        File leafDir2 = AbstractFilesystemOwnershipCheckTest.mkdirs(tempDir, "d2/commitlogs");
+        AbstractFilesystemOwnershipCheckTest.writeFile(leafDir2, 1, token);
+        AbstractFilesystemOwnershipCheckTest.executeAndFail(AbstractFilesystemOwnershipCheckTest.checker(leafDir1, leafDir2), options, INVALID_FILE_COUNT);
+    }
+
+    private String quote(String toQuote)
+    {
+        return String.format("'%s'", toQuote);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java b/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java
index ad680f5..9c1660a 100644
--- a/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java
+++ b/test/unit/org/apache/cassandra/service/ActiveRepairServiceTest.java
@@ -27,18 +27,17 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import java.util.UUID;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Condition;
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Sets;
-import com.google.common.util.concurrent.Uninterruptibles;
 
+import org.apache.cassandra.utils.TimeUUID;
+import org.apache.cassandra.utils.concurrent.Condition;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
@@ -46,7 +45,7 @@
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.Util;
-import org.apache.cassandra.concurrent.DebuggableThreadPoolExecutor;
+import org.apache.cassandra.concurrent.ExecutorPlus;
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.ColumnFamilyStore;
@@ -67,7 +66,6 @@
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.concurrent.Refs;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
 
 import static org.apache.cassandra.repair.messages.RepairOption.DATACENTERS_KEY;
 import static org.apache.cassandra.repair.messages.RepairOption.FORCE_REPAIR_KEY;
@@ -76,6 +74,8 @@
 import static org.apache.cassandra.repair.messages.RepairOption.RANGES_KEY;
 import static org.apache.cassandra.service.ActiveRepairService.UNREPAIRED_SSTABLE;
 import static org.apache.cassandra.service.ActiveRepairService.getRepairedAt;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -282,14 +282,14 @@
     public void testSnapshotAddSSTables() throws Exception
     {
         ColumnFamilyStore store = prepareColumnFamilyStore();
-        UUID prsId = UUID.randomUUID();
+        TimeUUID prsId = nextTimeUUID();
         Set<SSTableReader> original = Sets.newHashSet(store.select(View.select(SSTableSet.CANONICAL, (s) -> !s.isRepaired())).sstables);
         Collection<Range<Token>> ranges = Collections.singleton(new Range<>(store.getPartitioner().getMinimumToken(), store.getPartitioner().getMinimumToken()));
         ActiveRepairService.instance.registerParentRepairSession(prsId, FBUtilities.getBroadcastAddressAndPort(), Collections.singletonList(store),
                                                                  ranges, true, System.currentTimeMillis(), true, PreviewKind.NONE);
         store.getRepairManager().snapshot(prsId.toString(), ranges, false);
 
-        UUID prsId2 = UUID.randomUUID();
+        TimeUUID prsId2 = nextTimeUUID();
         ActiveRepairService.instance.registerParentRepairSession(prsId2, FBUtilities.getBroadcastAddressAndPort(),
                                                                  Collections.singletonList(store),
                                                                  ranges,
@@ -326,7 +326,7 @@
                 .build()
                 .applyUnsafe();
             }
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
     }
 
@@ -383,7 +383,7 @@
         ExecutorService validationExecutor = ActiveRepairService.initializeExecutor(2, Config.RepairCommandPoolFullStrategy.reject);
         try
         {
-            Condition blocked = new SimpleCondition();
+            Condition blocked = newOneTimeCondition();
             CountDownLatch completed = new CountDownLatch(2);
 
             /*
@@ -433,8 +433,8 @@
         ExecutorService validationExecutor = ActiveRepairService.initializeExecutor(2, Config.RepairCommandPoolFullStrategy.queue);
         try
         {
-            Condition allSubmitted = new SimpleCondition();
-            Condition blocked = new SimpleCondition();
+            Condition allSubmitted = newOneTimeCondition();
+            Condition blocked = newOneTimeCondition();
             CountDownLatch completed = new CountDownLatch(5);
             ExecutorService testExecutor = Executors.newSingleThreadExecutor();
             for (int i = 0; i < 5; i++)
@@ -452,12 +452,12 @@
             allSubmitted.await(TASK_SECONDS + 1, TimeUnit.SECONDS);
 
             // Give the tasks we expect to execute immediately chance to be scheduled
-            Util.spinAssertEquals(2 , ((DebuggableThreadPoolExecutor) validationExecutor)::getActiveTaskCount, 1);
-            Util.spinAssertEquals(3 , ((DebuggableThreadPoolExecutor) validationExecutor)::getPendingTaskCount, 1);
+            Util.spinAssertEquals(2 , ((ExecutorPlus) validationExecutor)::getActiveTaskCount, 1);
+            Util.spinAssertEquals(3 , ((ExecutorPlus) validationExecutor)::getPendingTaskCount, 1);
 
             // verify that we've reached a steady state with 2 threads actively processing and 3 queued tasks
-            Assert.assertEquals(2, ((DebuggableThreadPoolExecutor) validationExecutor).getActiveTaskCount());
-            Assert.assertEquals(3, ((DebuggableThreadPoolExecutor) validationExecutor).getPendingTaskCount());
+            Assert.assertEquals(2, ((ExecutorPlus) validationExecutor).getActiveTaskCount());
+            Assert.assertEquals(3, ((ExecutorPlus) validationExecutor).getPendingTaskCount());
             // allow executing tests to complete
             blocked.signalAll();
             completed.await(TASK_SECONDS + 1, TimeUnit.SECONDS);
@@ -482,7 +482,7 @@
 
         public void run()
         {
-            Uninterruptibles.awaitUninterruptibly(blocked, TASK_SECONDS, TimeUnit.SECONDS);
+            blocked.awaitUninterruptibly(TASK_SECONDS, TimeUnit.SECONDS);
             complete.countDown();
         }
     }
diff --git a/test/unit/org/apache/cassandra/service/BootstrapTransientTest.java b/test/unit/org/apache/cassandra/service/BootstrapTransientTest.java
index 7bb2b87..ea96765 100644
--- a/test/unit/org/apache/cassandra/service/BootstrapTransientTest.java
+++ b/test/unit/org/apache/cassandra/service/BootstrapTransientTest.java
@@ -22,10 +22,8 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 
-import com.google.common.base.Predicate;
 import com.google.common.collect.ImmutableMap;
 
 import org.apache.cassandra.locator.EndpointsByReplica;
@@ -48,7 +46,6 @@
 import org.apache.cassandra.locator.ReplicaCollection;
 import org.apache.cassandra.locator.SimpleStrategy;
 import org.apache.cassandra.locator.TokenMetadata;
-import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.Pair;
 
 import static org.apache.cassandra.locator.Replica.fullReplica;
diff --git a/test/unit/org/apache/cassandra/service/ClientStateTest.java b/test/unit/org/apache/cassandra/service/ClientStateTest.java
new file mode 100644
index 0000000..56d0893
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/ClientStateTest.java
@@ -0,0 +1,112 @@
+/*
+ * 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.service;
+
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.google.common.collect.Iterables;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.auth.AuthCacheService;
+import org.apache.cassandra.auth.AuthKeyspace;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.DataResource;
+import org.apache.cassandra.auth.IResource;
+import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.auth.Roles;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.SchemaConstants;
+import org.apache.cassandra.schema.TableMetadata;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+public class ClientStateTest
+{
+    @BeforeClass
+    public static void beforeClass()
+    {
+        System.setProperty("org.apache.cassandra.disable_mbean_registration", "true");
+        SchemaLoader.prepareServer();
+        DatabaseDescriptor.setAuthFromRoot(true);
+        // create the system_auth keyspace so the IRoleManager can function as normal
+        SchemaLoader.createKeyspace(SchemaConstants.AUTH_KEYSPACE_NAME,
+                                    KeyspaceParams.simple(1),
+                                    Iterables.toArray(AuthKeyspace.metadata().tables, TableMetadata.class));
+
+        AuthCacheService.initializeAndRegisterCaches();
+    }
+
+    @AfterClass
+    public static void afterClass()
+    {
+        System.clearProperty("org.apache.cassandra.disable_mbean_registration");
+    }
+
+    @Test
+    public void permissionsCheckStartsAtHeadOfResourceChain()
+    {
+        // verify that when performing a permissions check, we start from the
+        // root IResource in the applicable hierarchy and proceed to the more
+        // granular resources until we find the required permission (or until
+        // we reach the end of the resource chain). This is because our typical
+        // usage is to grant blanket permissions on the root resources to users
+        // and so we save lookups, cache misses and cache space by traversing in
+        // this order. e.g. for DataResources, we typically grant perms on the
+        // 'data' resource, so when looking up a users perms on a specific table
+        // it makes sense to follow: data -> keyspace -> table
+
+        final AtomicInteger getPermissionsRequestCount = new AtomicInteger(0);
+        final IResource rootResource = DataResource.root();
+        final IResource tableResource = DataResource.table("test_ks", "test_table");
+        final AuthenticatedUser testUser = new AuthenticatedUser("test_user")
+        {
+            public Set<Permission> getPermissions(IResource resource)
+            {
+                getPermissionsRequestCount.incrementAndGet();
+                if (resource.equals(rootResource))
+                    return Permission.ALL;
+
+                fail(String.format("Permissions requested for unexpected resource %s", resource));
+                // need a return to make the compiler happy
+                return null;
+            }
+
+            public boolean canLogin() { return true; }
+        };
+
+        Roles.cache.invalidate();
+
+        // finally, need to configure CassandraAuthorizer so we don't shortcircuit out of the authz process
+        DatabaseDescriptor.setAuthorizer(new AuthTestUtils.LocalCassandraAuthorizer());
+
+        // check permissions on the table, which should check for the root resource first
+        // & return successfully without needing to proceed further
+        ClientState state = ClientState.forInternalCalls();
+        state.login(testUser);
+        state.ensurePermission(Permission.SELECT, tableResource);
+        assertEquals(1, getPermissionsRequestCount.get());
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/service/ClientWarningsTest.java b/test/unit/org/apache/cassandra/service/ClientWarningsTest.java
index ee652e2..09fda7c 100644
--- a/test/unit/org/apache/cassandra/service/ClientWarningsTest.java
+++ b/test/unit/org/apache/cassandra/service/ClientWarningsTest.java
@@ -27,6 +27,7 @@
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
+import org.apache.cassandra.Util;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.EncryptionOptions;
 import org.apache.cassandra.cql3.CQLTester;
@@ -38,7 +39,7 @@
 import org.apache.cassandra.transport.SimpleClient;
 import org.apache.cassandra.transport.messages.QueryMessage;
 
-import static junit.framework.Assert.assertEquals;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
 @RunWith(Parameterized.class)
@@ -60,7 +61,7 @@
     public static void setUp()
     {
         requireNetwork();
-        DatabaseDescriptor.setBatchSizeWarnThresholdInKB(1);
+        DatabaseDescriptor.setBatchSizeWarnThresholdInKiB(1);
     }
 
     @Test
@@ -122,7 +123,7 @@
                 client.execute(query);
             }
             ColumnFamilyStore store = Keyspace.open(KEYSPACE).getColumnFamilyStore(currentTable());
-            store.forceBlockingFlush();
+            Util.flush(store);
 
             for (int i = 0; i < iterations; i++)
             {
@@ -132,7 +133,7 @@
                                                                     i), QueryOptions.DEFAULT);
                 client.execute(query);
             }
-            store.forceBlockingFlush();
+            Util.flush(store);
 
             {
                 QueryMessage query = new QueryMessage(String.format("SELECT * FROM %s.%s WHERE pk = 1",
diff --git a/test/unit/org/apache/cassandra/service/DiskFailurePolicyTest.java b/test/unit/org/apache/cassandra/service/DiskFailurePolicyTest.java
index c3b4dfa..b041a1c 100644
--- a/test/unit/org/apache/cassandra/service/DiskFailurePolicyTest.java
+++ b/test/unit/org/apache/cassandra/service/DiskFailurePolicyTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.service;
 
-import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
 import java.util.Collection;
@@ -38,6 +37,7 @@
 import org.apache.cassandra.gms.Gossiper;
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.JVMStabilityInspector;
 import org.apache.cassandra.utils.KillerForTests;
@@ -104,7 +104,7 @@
                              { ignore, false, new CorruptSSTableException(new IOException(), "blah"), true, false, false},
                              { stop, false, new CorruptSSTableException(new IOException(), "blah"), true, false, false},
                              { stop_paranoid, false, new CorruptSSTableException(new IOException(), "blah"), false, false, false},
-                             { best_effort, false, new FSReadError(new IOException(new OutOfMemoryError("Java heap space test")), "best_effort_oom"), true, false, false},
+                             { best_effort, false, new FSReadError(new IOException(new OutOfMemoryError("Java heap space")), "best_effort_oom"), true, false, false},
                              { best_effort, false, new FSReadError(new IOException(), "best_effort_io_exception"), true, false, false},
                              }
         );
@@ -141,15 +141,20 @@
         }
         catch (OutOfMemoryError e)
         {
-            if (!e.getMessage().equals("Java heap space test"))
+            if (testPolicy == best_effort)
+            {
+                if (t.getCause().getCause() != e)
+                    throw e;
+            }
+            else
                 throw e;
         }
 
-        if (testPolicy == best_effort && ((FSReadError) t).path.getName().equals("best_effort_io_exception"))
+        if (testPolicy == best_effort && ((FSReadError) t).path.equals("best_effort_io_exception"))
             assertTrue(DisallowedDirectories.isUnreadable(new File("best_effort_io_exception")));
 
         // when we have OOM, as cause, there is no reason to remove data
-        if (testPolicy == best_effort && ((FSReadError) t).path.getName().equals("best_effort_oom"))
+        if (testPolicy == best_effort && ((FSReadError) t).path.equals("best_effort_oom"))
             assertFalse(DisallowedDirectories.isUnreadable(new File("best_effort_oom")));
 
         assertEquals(expectJVMKilled, killerForTests.wasKilled());
diff --git a/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java b/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java
index 02d625c..b6d039b 100644
--- a/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java
+++ b/test/unit/org/apache/cassandra/service/LeaveAndBootstrapTest.java
@@ -123,7 +123,7 @@
         PendingRangeCalculatorService.instance.blockUntilFinished();
 
         AbstractReplicationStrategy strategy;
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             strategy = getStrategy(keyspaceName, tmd);
             for (Token token : keyTokens)
diff --git a/test/unit/org/apache/cassandra/service/MoveTest.java b/test/unit/org/apache/cassandra/service/MoveTest.java
index 9777602..6dce8f3 100644
--- a/test/unit/org/apache/cassandra/service/MoveTest.java
+++ b/test/unit/org/apache/cassandra/service/MoveTest.java
@@ -23,14 +23,12 @@
 import java.util.*;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
-import java.util.concurrent.locks.Condition;
 import java.util.function.Consumer;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multimap;
 
-import org.apache.cassandra.config.OverrideConfigurationLoader;
 import org.apache.cassandra.diag.DiagnosticEventService;
 import org.apache.cassandra.gms.GossiperEvent;
 import org.apache.cassandra.locator.EndpointsForRange;
@@ -40,16 +38,12 @@
 import org.junit.AfterClass;
 import org.junit.Before;
 import org.junit.BeforeClass;
-import org.junit.Rule;
 import org.junit.Test;
-import org.junit.rules.TestRule;
-import org.junit.rules.TestWatcher;
-import org.junit.runner.Description;
 
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
 import org.apache.cassandra.locator.ReplicaCollection;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.marshal.BytesType;
@@ -194,7 +188,7 @@
                                                                                     .addPartitionKeyColumn("key", BytesType.instance)
                                                                                     .build()));
 
-        MigrationManager.announceNewKeyspace(keyspace);
+        SchemaTestUtil.announceNewKeyspace(keyspace);
     }
 
     private static Object[] configOptions(Integer[] replicas)
@@ -563,7 +557,7 @@
     private void assertPendingRanges(TokenMetadata tmd, Map<Range<Token>, EndpointsForRange> pendingRanges, String keyspaceName) throws ConfigurationException
     {
         boolean keyspaceFound = false;
-        for (String nonSystemKeyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String nonSystemKeyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             if(!keyspaceName.equals(nonSystemKeyspaceName))
                 continue;
@@ -632,7 +626,7 @@
         assertTrue(tmd.isMoving(hosts.get(MOVING_NODE)));
 
         AbstractReplicationStrategy strategy;
-        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces())
+        for (String keyspaceName : Schema.instance.getNonLocalStrategyKeyspaces().names())
         {
             strategy = getStrategy(keyspaceName, tmd);
             if(strategy instanceof NetworkTopologyStrategy)
diff --git a/test/unit/org/apache/cassandra/service/NativeTransportServiceTest.java b/test/unit/org/apache/cassandra/service/NativeTransportServiceTest.java
index e70ef0d..d5f825f 100644
--- a/test/unit/org/apache/cassandra/service/NativeTransportServiceTest.java
+++ b/test/unit/org/apache/cassandra/service/NativeTransportServiceTest.java
@@ -23,8 +23,6 @@
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-import javax.xml.crypto.Data;
-
 import com.google.common.collect.Sets;
 import org.junit.After;
 import org.junit.BeforeClass;
diff --git a/test/unit/org/apache/cassandra/service/OptionalTasksTest.java b/test/unit/org/apache/cassandra/service/OptionalTasksTest.java
index 5d141a0..952abcd 100644
--- a/test/unit/org/apache/cassandra/service/OptionalTasksTest.java
+++ b/test/unit/org/apache/cassandra/service/OptionalTasksTest.java
@@ -26,10 +26,11 @@
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.db.ColumnFamilyStore;
-import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 
 import static org.apache.cassandra.SchemaLoader.standardCFMD;
@@ -48,7 +49,7 @@
         SchemaLoader.prepareServer();
         SchemaLoader.createKeyspace(KEYSPACE, KeyspaceParams.simple(1), standardCFMD(KEYSPACE, TABLE));
     }
-    
+
     @Test
     public void shouldIgnoreDroppedKeyspace()
     {
@@ -56,23 +57,24 @@
         TableMetadata metadata = Schema.instance.getTableMetadata(KEYSPACE, TABLE);
         ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(Objects.requireNonNull(metadata).id);
         Objects.requireNonNull(cfs).metric.coordinatorReadLatency.update(100, TimeUnit.NANOSECONDS);
-        
+
         // Remove the Keyspace name to make it invisible to the updater...
-        Keyspace removed = Schema.instance.removeKeyspaceInstance(KEYSPACE);
+        KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(KEYSPACE);
+        SchemaTestUtil.dropKeyspaceIfExist(KEYSPACE, true);
 
         try
         {
-            long originalValue = cfs.sampleReadLatencyNanos;
+            long originalValue = cfs.sampleReadLatencyMicros;
 
             // ...and ensure that the speculation threshold updater doesn't run.
             SPECULATION_THRESHOLD_UPDATER.run();
 
-            assertEquals(originalValue, cfs.sampleReadLatencyNanos);
+            assertEquals(originalValue, cfs.sampleReadLatencyMicros);
         }
         finally
         {
             // Restore the removed Keyspace to put things back the way we found them.
-            Schema.instance.storeKeyspaceInstance(removed);
+            SchemaTestUtil.addOrUpdateKeyspace(ksm, true);
         }
     }
 
@@ -84,11 +86,11 @@
         ColumnFamilyStore cfs = Schema.instance.getColumnFamilyStoreInstance(Objects.requireNonNull(metadata).id);
         Objects.requireNonNull(cfs).metric.coordinatorReadLatency.update(100, TimeUnit.NANOSECONDS);
 
-        long originalValue = cfs.sampleReadLatencyNanos;
-        
+        long originalValue = cfs.sampleReadLatencyMicros;
+
         // ...and ensure that the speculation threshold updater runs.
         SPECULATION_THRESHOLD_UPDATER.run();
-        
-        assertNotEquals(originalValue, cfs.sampleReadLatencyNanos);
+
+        assertNotEquals(originalValue, cfs.sampleReadLatencyMicros);
     }
 }
diff --git a/test/unit/org/apache/cassandra/service/PartitionDenylistTest.java b/test/unit/org/apache/cassandra/service/PartitionDenylistTest.java
new file mode 100644
index 0000000..ed51518
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/PartitionDenylistTest.java
@@ -0,0 +1,495 @@
+/*
+ * 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.service;
+
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.UntypedResultSet;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.exceptions.InvalidRequestException;
+import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.SchemaTestUtil;
+import org.apache.cassandra.schema.Tables;
+
+import static org.apache.cassandra.cql3.QueryProcessor.process;
+import static org.assertj.core.api.Assertions.assertThatThrownBy;
+
+public class PartitionDenylistTest
+{
+    private final static String ks_cql = "partition_denylist_keyspace";
+
+    @BeforeClass
+    public static void init()
+    {
+        CQLTester.prepareServer();
+
+        KeyspaceMetadata schema = KeyspaceMetadata.create(ks_cql,
+                                                          KeyspaceParams.simple(1),
+                                                          Tables.of(
+            CreateTableStatement.parse("CREATE TABLE table1 ("
+                                       + "keyone text, "
+                                       + "keytwo text, "
+                                       + "qux text, "
+                                       + "quz text, "
+                                       + "foo text, "
+                                       + "PRIMARY KEY((keyone, keytwo), qux, quz) ) ", ks_cql).build(),
+            CreateTableStatement.parse("CREATE TABLE table2 ("
+                                       + "keyone text, "
+                                       + "keytwo text, "
+                                       + "keythree text, "
+                                       + "value text, "
+                                       + "PRIMARY KEY((keyone, keytwo), keythree) ) ", ks_cql).build(),
+            CreateTableStatement.parse("CREATE TABLE table3 ("
+                                       + "keyone text, "
+                                       + "keytwo text, "
+                                       + "keythree text, "
+                                       + "value text, "
+                                       + "PRIMARY KEY((keyone, keytwo), keythree) ) ", ks_cql).build()
+        ));
+        SchemaTestUtil.addOrUpdateKeyspace(schema, false);
+        DatabaseDescriptor.setPartitionDenylistEnabled(true);
+        DatabaseDescriptor.setDenylistRangeReadsEnabled(true);
+        DatabaseDescriptor.setDenylistConsistencyLevel(ConsistencyLevel.ONE);
+        DatabaseDescriptor.setDenylistRefreshSeconds(1);
+        StorageService.instance.initServer(0);
+    }
+
+    @Before
+    public void setup()
+    {
+        DatabaseDescriptor.setPartitionDenylistEnabled(true);
+        resetDenylist();
+
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('aaa', 'bbb', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('bbb', 'ccc', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('ccc', 'ddd', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('ddd', 'eee', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('eee', 'fff', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('fff', 'ggg', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('ggg', 'hhh', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('hhh', 'iii', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('iii', 'jjj', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('jjj', 'kkk', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+
+
+        for (int i = 0; i < 50; i++)
+            process(String.format("INSERT INTO " + ks_cql + ".table2 (keyone, keytwo, keythree, value) VALUES ('%d', '%d', '%d', '%d')", i, i, i, i), ConsistencyLevel.ONE);
+
+        for (int i = 0; i < 50; i++)
+            process(String.format("INSERT INTO " + ks_cql + ".table3 (keyone, keytwo, keythree, value) VALUES ('%d', '%d', '%d', '%d')", i, i, i, i), ConsistencyLevel.ONE);
+
+        denylist("table1", "bbb:ccc");
+        refreshList();
+    }
+
+
+    private static void denylist(String table, final String key)
+    {
+        StorageProxy.instance.denylistKey(ks_cql, table, key);
+    }
+
+    private static void refreshList()
+    {
+        StorageProxy.instance.loadPartitionDenylist();
+    }
+
+    /**
+     * @return Whether the *attempt* to remove the denylisted key and refresh succeeded. Doesn't necessarily indicate the key
+     * was previously blocked and found.
+     */
+    private static boolean removeDenylist(final String ks, final String table, final String key)
+    {
+        return StorageProxy.instance.removeDenylistKey(ks, table, key);
+    }
+
+    @Test
+    public void testRead()
+    {
+        process("SELECT * FROM " + ks_cql + ".table1 WHERE keyone='aaa' and keytwo='bbb'", ConsistencyLevel.ONE);
+    }
+
+    @Test
+    public void testReadDenylisted()
+    {
+        assertThatThrownBy(() -> process("SELECT * FROM " + ks_cql + ".table1 WHERE keyone='bbb' and keytwo='ccc'", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Unable to read denylisted partition");
+    }
+
+    @Test
+    public void testIsKeyDenylistedAPI()
+    {
+        Assert.assertTrue(StorageProxy.instance.isKeyDenylisted(ks_cql, "table1", "bbb:ccc"));
+        resetDenylist();
+        Assert.assertFalse(StorageProxy.instance.isKeyDenylisted(ks_cql, "table1", "bbb:ccc"));
+
+        // Confirm an add mutates cache state
+        denylist("table1", "bbb:ccc");
+        Assert.assertTrue(StorageProxy.instance.isKeyDenylisted(ks_cql, "table1", "bbb:ccc"));
+
+        // Confirm removal then mutates cache w/out explicit reload
+        StorageProxy.instance.removeDenylistKey(ks_cql, "table1", "bbb:ccc");
+        Assert.assertFalse(StorageProxy.instance.isKeyDenylisted(ks_cql, "table1", "bbb:ccc"));
+    }
+
+    @Test
+    public void testReadUndenylisted()
+    {
+        resetDenylist();
+        process("SELECT * FROM " + ks_cql + ".table1 WHERE keyone='ccc' and keytwo='ddd'", ConsistencyLevel.ONE);
+    }
+
+    @Test
+    public void testWrite()
+    {
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('eee', 'fff', 'ccc', 'ddd', 'v')", ConsistencyLevel.ONE);
+        process("DELETE FROM " + ks_cql + ".table1 WHERE keyone='eee' and keytwo='fff'", ConsistencyLevel.ONE);
+    }
+
+    @Test
+    public void testWriteDenylisted()
+    {
+        assertThatThrownBy(() -> process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('bbb', 'ccc', 'eee', 'fff', 'w')", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Unable to write to denylisted partition");
+    }
+
+    @Test
+    public void testCASWriteDenylisted()
+    {
+        assertThatThrownBy(() -> process("UPDATE " + ks_cql + ".table1 SET foo='w' WHERE keyone='bbb' AND keytwo='ccc' AND qux='eee' AND quz='fff' IF foo='v'", ConsistencyLevel.LOCAL_SERIAL))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Unable to CAS write to denylisted partition");
+    }
+
+    @Test
+    public void testWriteUndenylisted()
+    {
+        resetDenylist();
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('bbb', 'ccc', 'eee', 'fff', 'w')", ConsistencyLevel.ONE);
+    }
+
+    @Test
+    public void testRangeSlice()
+    {
+        UntypedResultSet rows;
+        rows = process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) < token('bbb', 'ccc')", ConsistencyLevel.ONE);
+        Assert.assertEquals(1, rows.size());
+
+        // 10 entries total in our table
+        rows = process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) > token('bbb', 'ccc')", ConsistencyLevel.ONE);
+        Assert.assertEquals(8, rows.size());
+
+        rows = process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) >= token('aaa', 'bbb') and token(keyone, keytwo) < token('bbb', 'ccc')", ConsistencyLevel.ONE);
+        Assert.assertEquals(1, rows.size());
+
+        rows = process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) > token('bbb', 'ccc') and token(keyone, keytwo) <= token('ddd', 'eee')", ConsistencyLevel.ONE);
+        Assert.assertEquals(2, rows.size());
+    }
+
+    @Test
+    public void testRangeDenylisted()
+    {
+        assertThatThrownBy(() -> process("SELECT * FROM " + ks_cql + ".table1", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Attempted to read a range containing 1 denylisted keys");
+    }
+
+    @Test
+    public void testRangeDenylisted2()
+    {
+        assertThatThrownBy(() -> process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) >= token('aaa', 'bbb') and token (keyone, keytwo) <= token('bbb', 'ccc')", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Attempted to read a range containing 1 denylisted keys");
+    }
+
+    @Test
+    public void testRangeDenylisted3()
+    {
+        assertThatThrownBy(() -> process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) >= token('bbb', 'ccc') and token (keyone, keytwo) <= token('ccc', 'ddd')", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Attempted to read a range containing 1 denylisted keys");
+    }
+
+    @Test
+    public void testRangeDenylisted4()
+    {
+        assertThatThrownBy(() -> process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) > token('aaa', 'bbb') and token (keyone, keytwo) < token('ccc', 'ddd')", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Attempted to read a range containing 1 denylisted keys");
+    }
+
+    @Test
+    public void testRangeDenylisted5()
+    {
+        assertThatThrownBy(() -> process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) > token('aaa', 'bbb')", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Attempted to read a range containing 1 denylisted keys");
+    }
+
+    @Test
+    public void testRangeDenylisted6()
+    {
+        assertThatThrownBy(() -> process("SELECT * FROM " + ks_cql + ".table1 WHERE token(keyone, keytwo) < token('ddd', 'eee')", ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Attempted to read a range containing 1 denylisted keys");
+    }
+
+    @Test
+    public void testInsertUnknownPKIsGraceful()
+    {
+        Assert.assertTrue(StorageProxy.instance.denylistKey(ks_cql, "table1", "hohoho"));
+    }
+
+    @Test
+    public void testInsertInvalidTableIsGraceful()
+    {
+        Assert.assertFalse(StorageProxy.instance.denylistKey(ks_cql, "asldkfjadlskjf", "alksdjfads"));
+    }
+
+    @Test
+    public void testInsertInvalidKSIsGraceful()
+    {
+        Assert.assertFalse(StorageProxy.instance.denylistKey("asdklfjas", "asldkfjadlskjf", "alksdjfads"));
+    }
+
+    @Test
+    public void testDisabledDenylistThrowsNoExceptions()
+    {
+        process(String.format("TRUNCATE TABLE %s.table2", ks_cql), ConsistencyLevel.ONE);
+        process(String.format("TRUNCATE TABLE %s.table3", ks_cql), ConsistencyLevel.ONE);
+        denyAllKeys();
+        DatabaseDescriptor.setPartitionDenylistEnabled(false);
+        process("INSERT INTO " + ks_cql + ".table1 (keyone, keytwo, qux, quz, foo) VALUES ('bbb', 'ccc', 'eee', 'fff', 'w')", ConsistencyLevel.ONE);
+        process("SELECT * FROM " + ks_cql + ".table1 WHERE keyone='bbb' and keytwo='ccc'", ConsistencyLevel.ONE);
+        process("SELECT * FROM " + ks_cql + ".table1", ConsistencyLevel.ONE);
+
+        for (int i = 0; i < 50; i++)
+        {
+            process(String.format("INSERT INTO %s.table2 (keyone, keytwo, keythree, value) VALUES ('%s', '%s', '%s', '%s')", ks_cql, i, i, i, i), ConsistencyLevel.ONE);
+            process(String.format("SELECT * FROM %s.table2 WHERE keyone='%s' and keytwo='%s'", ks_cql, i, i), ConsistencyLevel.ONE);
+        }
+
+        for (int i = 0; i < 50; i++)
+        {
+            process(String.format("INSERT INTO %s.table3 (keyone, keytwo, keythree, value) VALUES ('%s', '%s', '%s', '%s')", ks_cql, i, i, i, i), ConsistencyLevel.ONE);
+            process(String.format("SELECT * FROM %s.table3 WHERE keyone='%s' and keytwo='%s'", ks_cql, i, i), ConsistencyLevel.ONE);
+        }
+    }
+
+    /**
+     * Want to make sure we don't throw anything or explode when people try to remove a key that's not there
+     */
+    @Test
+    public void testRemoveMissingIsGraceful()
+    {
+        confirmDenied("table1", "bbb", "ccc");
+        Assert.assertTrue(removeDenylist(ks_cql, "table1", "bbb:ccc"));
+
+        // We expect this to silently not find and succeed at *trying* to remove it
+        Assert.assertTrue(removeDenylist(ks_cql, "table1", "bbb:ccc"));
+        refreshList();
+
+        confirmAllowed("table1", "bbb", "ccc");
+    }
+
+    /**
+     * We need to confirm that the entire cache is reloaded rather than being an additive change; we don't want keys to
+     * persist after their removal and reload from CQL.
+     */
+    @Test
+    public void testRemoveWorksOnReload()
+    {
+        denyAllKeys();
+        refreshList();
+
+        confirmDenied("table1", "aaa", "bbb");
+        confirmDenied("table1", "eee", "fff");
+        confirmDenied("table1", "iii", "jjj");
+
+        // poke a hole in the middle and reload
+        removeDenylist(ks_cql, "table1", "eee:fff");
+        refreshList();
+
+        confirmAllowed("table1", "eee", "fff");
+        confirmDenied("table1", "aaa", "bbb");
+        confirmDenied("table1", "iii", "jjj");
+    }
+
+    /**
+     * We go through a few steps here:
+     *  1) Add more keys than we're allowed
+     *  2) Confirm that the overflow keys are *not* denied
+     *  3) Raise the allowable limit
+     *  4) Confirm that the overflow keys are now denied (and no longer really "overflow" for that matter)
+     */
+    @Test
+    public void testShrinkAndGrow()
+    {
+        denyAllKeys();
+        refreshList();
+
+        // Initial control; check denial of both initial and final keys
+        confirmDenied("table1", "aaa", "bbb");
+        confirmDenied("table1", "iii", "jjj");
+
+        // Lower our limit to 5 allowable denies and then check and see that things past the limit are ignored
+        StorageProxy.instance.setDenylistMaxKeysPerTable(5);
+        StorageProxy.instance.setDenylistMaxKeysTotal(5);
+        refreshList();
+
+        // Confirm overflowed keys are allowed; first come first served
+        confirmDenied("table1", "aaa", "bbb");
+        confirmAllowed("table1", "iii", "jjj");
+
+        // Now we raise the limit back up and do nothing else and confirm it's blocked
+        StorageProxy.instance.setDenylistMaxKeysPerTable(1000);
+        StorageProxy.instance.setDenylistMaxKeysTotal(1000);
+        refreshList();
+        confirmDenied("table1", "aaa", "bbb");
+        confirmDenied("table1", "iii", "jjj");
+
+        // Unblock via overflow the table 1 sentinel we'll check in a second
+        StorageProxy.instance.setDenylistMaxKeysPerTable(5);
+        StorageProxy.instance.setDenylistMaxKeysTotal(5);
+        refreshList();
+        confirmAllowed("table1", "iii", "jjj");
+
+        // Now, we remove the denylist entries for our first 5, drop the limit back down, and confirm those overflowed keys now block
+        removeDenylist(ks_cql, "table1", "aaa:bbb");
+        removeDenylist(ks_cql, "table1", "bbb:ccc");
+        removeDenylist(ks_cql, "table1", "ccc:ddd");
+        removeDenylist(ks_cql, "table1", "ddd:eee");
+        removeDenylist(ks_cql, "table1", "eee:fff");
+        refreshList();
+        confirmDenied("table1", "iii", "jjj");
+    }
+
+    /*
+    We need to test that, during a violation of our global allowable limit, we still enforce our limit of keys queried
+    on a per-table basis.
+     */
+    @Test
+    public void testTableLimitRespected()
+    {
+        StorageProxy.instance.setDenylistMaxKeysPerTable(5);
+        StorageProxy.instance.setDenylistMaxKeysTotal(12);
+        denyAllKeys();
+        refreshList();
+
+        // Table 1: expect first 5 denied
+        confirmDenied("table1", "aaa", "bbb");
+        confirmDenied("table1", "eee", "fff");
+        confirmAllowed("table1", "fff", "ggg");
+
+        // Table 2: expect first 5 denied
+        for (int i = 0; i < 5; i++)
+            confirmDenied("table2", Integer.toString(i), Integer.toString(i));
+
+        // Confirm remainder are allowed because we hit our table limit at 5
+        for (int i = 5; i < 50; i++)
+            confirmAllowed("table2", Integer.toString(i), Integer.toString(i));
+
+        // Table 3: expect only first 2 denied; global limit enforcement
+        confirmDenied("table3", "0", "0");
+        confirmDenied("table3", "1", "1");
+
+        // And our final 48 should be allowed
+        for (int i = 2; i < 50; i++)
+            confirmAllowed("table3", Integer.toString(i), Integer.toString(i));
+    }
+
+    /**
+     * Test that we don't allow overflowing global limit due to accumulation of allowable table queries
+     */
+    @Test
+    public void testGlobalLimitRespected()
+    {
+        StorageProxy.instance.setDenylistMaxKeysPerTable(50);
+        StorageProxy.instance.setDenylistMaxKeysTotal(15);
+        denyAllKeys();
+        refreshList();
+
+        // Table 1: expect all 10 denied
+        confirmDenied("table1", "aaa", "bbb");
+        confirmDenied("table1", "jjj", "kkk");
+
+        // Table 2: expect only 5 denied up to global limit trigger
+        for (int i = 0; i < 5; i++)
+            confirmDenied("table2", Integer.toString(i), Integer.toString(i));
+
+        // Remainder of Table 2 should be allowed; testing overflow boundary logic
+        for (int i = 5; i < 50; i++)
+            confirmAllowed("table2", Integer.toString(i), Integer.toString(i));
+
+        // Table 3: expect all allowed as we're past global limit by the time we got to this table load. This confirms that
+        // we bypass load completely on tables once we're at our global limit.
+        for (int i = 0; i < 50; i++)
+            confirmAllowed("table3", Integer.toString(i), Integer.toString(i));
+    }
+
+    private void confirmDenied(String table, String keyOne, String keyTwo)
+    {
+        String query = String.format("SELECT * FROM " + ks_cql + "." + table + " WHERE keyone='%s' and keytwo='%s'", keyOne, keyTwo);
+        assertThatThrownBy(() -> process(query, ConsistencyLevel.ONE))
+                           .isInstanceOf(InvalidRequestException.class)
+                           .hasMessageContaining("Unable to read denylisted partition");
+    }
+
+    private void confirmAllowed(String table, String keyOne, String keyTwo)
+    {
+        process(String.format("SELECT * FROM %s.%s WHERE keyone='%s' and keytwo='%s'", ks_cql, table, keyOne, keyTwo), ConsistencyLevel.ONE);
+    }
+
+    private void resetDenylist()
+    {
+        process("TRUNCATE system_distributed.partition_denylist", ConsistencyLevel.ONE);
+        StorageProxy.instance.setDenylistMaxKeysTotal(1000);
+        StorageProxy.instance.setDenylistMaxKeysPerTable(1000);
+        StorageProxy.instance.loadPartitionDenylist();
+    }
+
+    private void denyAllKeys()
+    {
+        denylist("table1", "aaa:bbb");
+        denylist("table1", "bbb:ccc");
+        denylist("table1", "ccc:ddd");
+        denylist("table1", "ddd:eee");
+        denylist("table1", "eee:fff");
+        denylist("table1", "fff:ggg");
+        denylist("table1", "ggg:hhh");
+        denylist("table1", "hhh:iii");
+        denylist("table1", "iii:jjj");
+        denylist("table1", "jjj:kkk");
+
+        for (int i = 0; i < 50; i++)
+        {
+            denylist("table2", String.format("%d:%d", i, i));
+            denylist("table3", String.format("%d:%d", i, i));
+        }
+
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/PaxosStateTest.java b/test/unit/org/apache/cassandra/service/PaxosStateTest.java
index 7d69223..e73147d 100644
--- a/test/unit/org/apache/cassandra/service/PaxosStateTest.java
+++ b/test/unit/org/apache/cassandra/service/PaxosStateTest.java
@@ -18,12 +18,26 @@
 package org.apache.cassandra.service;
 
 import java.nio.ByteBuffer;
-import java.util.UUID;
 
 import com.google.common.collect.Iterables;
-import org.apache.cassandra.service.paxos.PrepareVerbHandler;
-import org.apache.cassandra.service.paxos.ProposeVerbHandler;
+
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.v1.PrepareVerbHandler;
+import org.apache.cassandra.service.paxos.v1.ProposeVerbHandler;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Supplier;
+
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.exceptions.ReadTimeoutException;
+import org.apache.cassandra.service.paxos.PaxosOperationLock;
 import org.junit.AfterClass;
+import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -37,8 +51,10 @@
 import org.apache.cassandra.service.paxos.PaxosState;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.UUIDGen;
 
+import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.atUnixMicros;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.*;
 
 public class PaxosStateTest
@@ -60,7 +76,7 @@
     public void testCommittingAfterTruncation() throws Exception
     {
         ColumnFamilyStore cfs = Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1");
-        String key = "key" + System.nanoTime();
+        String key = "key" + nanoTime();
         ByteBuffer value = ByteBufferUtil.bytes(0);
         RowUpdateBuilder builder = new RowUpdateBuilder(cfs.metadata(), FBUtilities.timestampMicros(), key);
         builder.clustering("a").add("val", value);
@@ -71,25 +87,25 @@
 
         // Commit the proposal & verify the data is present
         Commit beforeTruncate = newProposal(0, update);
-        PaxosState.commit(beforeTruncate);
+        PaxosState.commitDirect(beforeTruncate);
         assertDataPresent(cfs, Util.dk(key), "val", value);
 
         // Truncate then attempt to commit again, mutation should
         // be ignored as the proposal predates the truncation
         cfs.truncateBlocking();
-        PaxosState.commit(beforeTruncate);
+        PaxosState.commitDirect(beforeTruncate);
         assertNoDataPresent(cfs, Util.dk(key));
 
         // Now try again with a ballot created after the truncation
         long timestamp = SystemKeyspace.getTruncatedAt(update.metadata().id) + 1;
         Commit afterTruncate = newProposal(timestamp, update);
-        PaxosState.commit(afterTruncate);
+        PaxosState.commitDirect(afterTruncate);
         assertDataPresent(cfs, Util.dk(key), "val", value);
     }
 
-    private Commit newProposal(long ballotMillis, PartitionUpdate update)
+    private Commit newProposal(long ballotMicros, PartitionUpdate update)
     {
-        return Commit.newProposal(UUIDGen.getTimeUUID(ballotMillis), update);
+        return Commit.newProposal(atUnixMicros(ballotMicros, NONE), update);
     }
 
     private void assertDataPresent(ColumnFamilyStore cfs, DecoratedKey key, String name, ByteBuffer value)
@@ -108,7 +124,7 @@
     public void testPrepareProposePaxos() throws Throwable
     {
         ColumnFamilyStore cfs = Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1");
-        String key = "key" + System.nanoTime();
+        String key = "key" + nanoTime();
         ByteBuffer value = ByteBufferUtil.bytes(0);
         RowUpdateBuilder builder = new RowUpdateBuilder(cfs.metadata(), FBUtilities.timestampMicros(), key);
         builder.clustering("a").add("val", value);
@@ -117,11 +133,44 @@
         // CFS should be empty initially
         assertNoDataPresent(cfs, Util.dk(key));
 
-        UUID ballot = UUIDGen.getRandomTimeUUIDFromMicros(System.currentTimeMillis());
+        Ballot ballot = atUnixMicros(1000 * System.currentTimeMillis(), NONE);
 
         Commit commit = Commit.newPrepare(Util.dk(key), cfs.metadata(), ballot);
 
         assertTrue("paxos prepare stage failed", PrepareVerbHandler.doPrepare(commit).promised);
         assertTrue("paxos propose stage failed", ProposeVerbHandler.doPropose(commit));
     }
+
+    public void testPaxosLock() throws ExecutionException, InterruptedException, ExecutionException
+    {
+        DecoratedKey key = new BufferDecoratedKey(Murmur3Partitioner.MINIMUM, ByteBufferUtil.EMPTY_BYTE_BUFFER);
+        TableMetadata metadata = Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1").metadata.get();
+        Supplier<PaxosOperationLock> locker = () -> PaxosState.lock(key, metadata, System.nanoTime() + TimeUnit.SECONDS.toNanos(1L), ConsistencyLevel.SERIAL, false);
+        ExecutorService executor = Executors.newFixedThreadPool(1);
+        Future<?> future;
+        try (PaxosOperationLock lock = locker.get())
+        {
+            try
+            {
+                try (PaxosOperationLock lock2 = locker.get())
+                {
+                    Assert.fail();
+                }
+            }
+            catch (ReadTimeoutException rte)
+            {
+            }
+
+            future = executor.submit(() -> {
+                try (PaxosOperationLock lock2 = locker.get())
+                {
+                }
+            });
+        }
+        finally
+        {
+            executor.shutdown();
+        }
+        future.get();
+    }
 }
diff --git a/test/unit/org/apache/cassandra/service/ProtocolBetaVersionTest.java b/test/unit/org/apache/cassandra/service/ProtocolBetaVersionTest.java
index a7551f4..a5b32bf 100644
--- a/test/unit/org/apache/cassandra/service/ProtocolBetaVersionTest.java
+++ b/test/unit/org/apache/cassandra/service/ProtocolBetaVersionTest.java
@@ -25,9 +25,9 @@
 import org.apache.cassandra.transport.*;
 import org.apache.cassandra.transport.messages.*;
 
-import static junit.framework.Assert.assertEquals;
-import static junit.framework.Assert.assertTrue;
-import static junit.framework.Assert.fail;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 public class ProtocolBetaVersionTest extends CQLTester
 {
@@ -35,7 +35,7 @@
     public static void setUp()
     {
         requireNetwork();
-        DatabaseDescriptor.setBatchSizeWarnThresholdInKB(1);
+        DatabaseDescriptor.setBatchSizeWarnThresholdInKiB(1);
     }
 
     private ProtocolVersion getBetaVersion()
diff --git a/test/unit/org/apache/cassandra/service/QueryPagerTest.java b/test/unit/org/apache/cassandra/service/QueryPagerTest.java
index 50bb3e2..323de1a 100644
--- a/test/unit/org/apache/cassandra/service/QueryPagerTest.java
+++ b/test/unit/org/apache/cassandra/service/QueryPagerTest.java
@@ -326,7 +326,7 @@
 
     public void multiQueryTest(boolean testPagingState, ProtocolVersion protocolVersion)
     {
-        ReadQuery command = new SinglePartitionReadCommand.Group(new ArrayList<SinglePartitionReadCommand>()
+        ReadQuery command = SinglePartitionReadCommand.Group.create(new ArrayList<SinglePartitionReadCommand>()
         {{
             add(sliceQuery("k1", "c2", "c6", 10));
             add(sliceQuery("k4", "c3", "c5", 10));
diff --git a/test/unit/org/apache/cassandra/service/RemoveTest.java b/test/unit/org/apache/cassandra/service/RemoveTest.java
index ea8c8d8..acc54cb 100644
--- a/test/unit/org/apache/cassandra/service/RemoveTest.java
+++ b/test/unit/org/apache/cassandra/service/RemoveTest.java
@@ -143,7 +143,7 @@
     {
         // start removal in background and send replication confirmations
         final AtomicBoolean success = new AtomicBoolean(false);
-        Thread remover = NamedThreadFactory.createThread(() ->
+        Thread remover = NamedThreadFactory.createAnonymousThread(() ->
         {
             try
             {
diff --git a/test/unit/org/apache/cassandra/service/SSTablesGlobalTrackerTest.java b/test/unit/org/apache/cassandra/service/SSTablesGlobalTrackerTest.java
index e4a5947..5545d93 100644
--- a/test/unit/org/apache/cassandra/service/SSTablesGlobalTrackerTest.java
+++ b/test/unit/org/apache/cassandra/service/SSTablesGlobalTrackerTest.java
@@ -28,8 +28,10 @@
 import org.junit.Test;
 
 import org.apache.cassandra.io.sstable.Descriptor;
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
 import org.apache.cassandra.io.sstable.format.SSTableFormat;
 import org.apache.cassandra.io.sstable.format.VersionAndType;
+import org.apache.cassandra.io.util.File;
 import org.assertj.core.util.Files;
 import org.quicktheories.core.Gen;
 import org.quicktheories.generators.Generate;
@@ -99,7 +101,7 @@
                                         tables(),
                                         generations(),
                                         sstableVersionString(),
-                                        (f, k, t, g, v) -> new Descriptor(v, Files.currentFolder(), k, t, g, f));
+                                        (f, k, t, g, v) -> new Descriptor(v, new File(Files.currentFolder()), k, t, new SequenceBasedSSTableId(g), f));
     }
 
     private Gen<List<Descriptor>> descriptorLists(int minSize)
diff --git a/test/unit/org/apache/cassandra/service/SerializationsTest.java b/test/unit/org/apache/cassandra/service/SerializationsTest.java
index f4b3b1c..f9f4766 100644
--- a/test/unit/org/apache/cassandra/service/SerializationsTest.java
+++ b/test/unit/org/apache/cassandra/service/SerializationsTest.java
@@ -26,6 +26,7 @@
 import java.util.UUID;
 
 import com.google.common.collect.Lists;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -39,25 +40,25 @@
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.IVersionedSerializer;
-import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus;
 import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.repair.SyncNodePair;
 import org.apache.cassandra.repair.RepairJobDesc;
 import org.apache.cassandra.repair.Validator;
 import org.apache.cassandra.repair.messages.*;
+import org.apache.cassandra.repair.state.ValidationState;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.PreviewKind;
 import org.apache.cassandra.streaming.SessionSummary;
 import org.apache.cassandra.streaming.StreamSummary;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.MerkleTrees;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class SerializationsTest extends AbstractSerializationsTester
 {
     private static PartitionerSwitcher partitionerSwitcher;
-    private static UUID RANDOM_UUID;
+    private static TimeUUID RANDOM_UUID;
     private static Range<Token> FULL_RANGE;
     private static RepairJobDesc DESC;
 
@@ -68,7 +69,7 @@
     {
         DatabaseDescriptor.daemonInitialization();
         partitionerSwitcher = Util.switchPartitioner(RandomPartitioner.instance);
-        RANDOM_UUID = UUID.fromString("b5c3d033-75aa-4c2f-a819-947aac7a0c54");
+        RANDOM_UUID = TimeUUID.fromString("743325d0-4c4b-11ec-8a88-2d67081686db");
         FULL_RANGE = new Range<>(Util.testPartitioner().getMinimumToken(), Util.testPartitioner().getMinimumToken());
         DESC = new RepairJobDesc(RANDOM_UUID, RANDOM_UUID, "Keyspace1", "Standard1", Arrays.asList(FULL_RANGE));
     }
@@ -103,7 +104,7 @@
         if (EXECUTE_WRITES)
             testValidationRequestWrite();
 
-        try (DataInputStreamPlus in = getInput("service.ValidationRequest.bin"))
+        try (FileInputStreamPlus in = getInput("service.ValidationRequest.bin"))
         {
             ValidationRequest message = ValidationRequest.serializer.deserialize(in, getVersion());
             assert DESC.equals(message.desc);
@@ -115,20 +116,20 @@
     {
         IPartitioner p = RandomPartitioner.instance;
 
-        MerkleTrees mt = new MerkleTrees(p);
+        MerkleTrees mts = new MerkleTrees(p);
 
         // empty validation
-        mt.addMerkleTree((int) Math.pow(2, 15), FULL_RANGE);
-        Validator v0 = new Validator(DESC, FBUtilities.getBroadcastAddressAndPort(), -1, PreviewKind.NONE);
-        ValidationResponse c0 = new ValidationResponse(DESC, mt);
+        mts.addMerkleTree((int) Math.pow(2, 15), FULL_RANGE);
+        Validator v0 = new Validator(new ValidationState(DESC, FBUtilities.getBroadcastAddressAndPort()), -1, PreviewKind.NONE);
+        ValidationResponse c0 = new ValidationResponse(DESC, mts);
 
         // validation with a tree
-        mt = new MerkleTrees(p);
-        mt.addMerkleTree(Integer.MAX_VALUE, FULL_RANGE);
+        mts = new MerkleTrees(p);
+        mts.addMerkleTree(Integer.MAX_VALUE, FULL_RANGE);
         for (int i = 0; i < 10; i++)
-            mt.split(p.getRandomToken());
-        Validator v1 = new Validator(DESC, FBUtilities.getBroadcastAddressAndPort(), -1, PreviewKind.NONE);
-        ValidationResponse c1 = new ValidationResponse(DESC, mt);
+            mts.split(p.getRandomToken());
+        Validator v1 = new Validator(new ValidationState(DESC, FBUtilities.getBroadcastAddressAndPort()), -1, PreviewKind.NONE);
+        ValidationResponse c1 = new ValidationResponse(DESC, mts);
 
         // validation failed
         ValidationResponse c3 = new ValidationResponse(DESC);
@@ -142,7 +143,7 @@
         if (EXECUTE_WRITES)
             testValidationCompleteWrite();
 
-        try (DataInputStreamPlus in = getInput("service.ValidationComplete.bin"))
+        try (FileInputStreamPlus in = getInput("service.ValidationComplete.bin"))
         {
             // empty validation
             ValidationResponse message = ValidationResponse.serializer.deserialize(in, getVersion());
@@ -187,7 +188,7 @@
         InetAddressAndPort src = InetAddressAndPort.getByNameOverrideDefaults("127.0.0.2", PORT);
         InetAddressAndPort dest = InetAddressAndPort.getByNameOverrideDefaults("127.0.0.3", PORT);
 
-        try (DataInputStreamPlus in = getInput("service.SyncRequest.bin"))
+        try (FileInputStreamPlus in = getInput("service.SyncRequest.bin"))
         {
             SyncRequest message = SyncRequest.serializer.deserialize(in, getVersion());
             assert DESC.equals(message.desc);
@@ -206,8 +207,8 @@
         // sync success
         List<SessionSummary> summaries = new ArrayList<>();
         summaries.add(new SessionSummary(src, dest,
-                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUIDGen.getTimeUUID()), 5, 100)),
-                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUIDGen.getTimeUUID()), 500, 10))
+                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUID.randomUUID()), 5, 100)),
+                                         Lists.newArrayList(new StreamSummary(TableId.fromUUID(UUID.randomUUID()), 500, 10))
         ));
         SyncResponse success = new SyncResponse(DESC, src, dest, true, summaries);
         // sync fail
@@ -226,7 +227,7 @@
         InetAddressAndPort dest = InetAddressAndPort.getByNameOverrideDefaults("127.0.0.3", PORT);
         SyncNodePair nodes = new SyncNodePair(src, dest);
 
-        try (DataInputStreamPlus in = getInput("service.SyncComplete.bin"))
+        try (FileInputStreamPlus in = getInput("service.SyncComplete.bin"))
         {
             // success
             SyncResponse message = SyncResponse.serializer.deserialize(in, getVersion());
diff --git a/test/unit/org/apache/cassandra/service/StartupChecksTest.java b/test/unit/org/apache/cassandra/service/StartupChecksTest.java
index 67217b3..72f8804 100644
--- a/test/unit/org/apache/cassandra/service/StartupChecksTest.java
+++ b/test/unit/org/apache/cassandra/service/StartupChecksTest.java
@@ -17,12 +17,15 @@
  */
 package org.apache.cassandra.service;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.time.Instant;
+import java.util.List;
 
+import org.apache.cassandra.config.StartupChecksOptions;
+import org.apache.cassandra.io.util.File;
 import org.junit.*;
 
 import org.apache.cassandra.SchemaLoader;
@@ -30,9 +33,14 @@
 import org.apache.cassandra.schema.SchemaConstants;
 import org.apache.cassandra.db.*;
 import org.apache.cassandra.exceptions.StartupException;
-import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.service.DataResurrectionCheck.Heartbeat;
+import org.apache.cassandra.utils.Clock;
 
-import static org.junit.Assert.assertFalse;
+import static java.util.Collections.singletonList;
+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;
+import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -41,10 +49,14 @@
     public static final String INVALID_LEGACY_SSTABLE_ROOT_PROP = "invalid-legacy-sstable-root";
     StartupChecks startupChecks;
     Path sstableDir;
+    static File heartbeatFile;
+
+    StartupChecksOptions options = new StartupChecksOptions();
 
     @BeforeClass
     public static void setupServer()
     {
+        heartbeatFile = createTempFile("cassandra-heartbeat-", "");
         SchemaLoader.prepareServer();
     }
 
@@ -54,19 +66,29 @@
         for (ColumnFamilyStore cfs : Keyspace.open(SchemaConstants.SYSTEM_KEYSPACE_NAME).getColumnFamilyStores())
             cfs.clearUnsafe();
         for (File dataDir : Directories.getKSChildDirectories(SchemaConstants.SYSTEM_KEYSPACE_NAME))
-            FileUtils.deleteRecursive(dataDir);
+            dataDir.deleteRecursive();
 
         File dataDir = new File(DatabaseDescriptor.getAllDataFileLocations()[0]);
-        sstableDir = Paths.get(dataDir.getAbsolutePath(), "Keyspace1", "Standard1");
+        sstableDir = Paths.get(dataDir.absolutePath(), "Keyspace1", "Standard1");
         Files.createDirectories(sstableDir);
 
+        options.enable(check_data_resurrection);
+        options.getConfig(check_data_resurrection)
+               .put(HEARTBEAT_FILE_CONFIG_PROPERTY, heartbeatFile.absolutePath());
+
         startupChecks = new StartupChecks();
     }
 
     @After
     public void tearDown() throws IOException
     {
-        FileUtils.deleteRecursive(sstableDir.toFile());
+        new File(sstableDir).deleteRecursive();
+    }
+
+    @AfterClass
+    public static void tearDownClass()
+    {
+        heartbeatFile.delete();
     }
 
     @Test
@@ -79,17 +101,17 @@
         verifyFailure(startupChecks, "Detected unreadable sstables");
 
         // we should ignore invalid sstables in a snapshots directory
-        FileUtils.deleteRecursive(sstableDir.toFile());
+        new File(sstableDir).deleteRecursive();
         Path snapshotDir = sstableDir.resolve("snapshots");
         Files.createDirectories(snapshotDir);
-        copyInvalidLegacySSTables(snapshotDir); startupChecks.verify();
+        copyInvalidLegacySSTables(snapshotDir); startupChecks.verify(options);
 
         // and in a backups directory
-        FileUtils.deleteRecursive(sstableDir.toFile());
+        new File(sstableDir).deleteRecursive();
         Path backupDir = sstableDir.resolve("backups");
         Files.createDirectories(backupDir);
         copyInvalidLegacySSTables(backupDir);
-        startupChecks.verify();
+        startupChecks.verify(options);
     }
 
     @Test
@@ -98,16 +120,41 @@
         startupChecks = startupChecks.withTest(StartupChecks.checkSSTablesFormat);
 
         copyLegacyNonSSTableFiles(sstableDir);
-        assertFalse(sstableDir.toFile().listFiles().length == 0);
+        assertNotEquals(0, new File(sstableDir).tryList().length);
 
-        startupChecks.verify();
+        startupChecks.verify(options);
+    }
+
+    @Test
+    public void checkReadAheadKbSettingCheck() throws Exception
+    {
+        // This test just validates if the verify function
+        // doesn't throw any exceptions
+        startupChecks = startupChecks.withTest(StartupChecks.checkReadAheadKbSetting);
+        startupChecks.verify(options);
+    }
+
+    @Test
+    public void testGetReadAheadKBPath()
+    {
+        Path sdaDirectory = StartupChecks.getReadAheadKBPath("/dev/sda12");
+        Assert.assertEquals(Paths.get("/sys/block/sda/queue/read_ahead_kb"), sdaDirectory);
+
+        Path scsiDirectory = StartupChecks.getReadAheadKBPath("/dev/scsi1");
+        Assert.assertEquals(Paths.get("/sys/block/scsi/queue/read_ahead_kb"), scsiDirectory);
+
+        Path dirWithoutNumbers = StartupChecks.getReadAheadKBPath("/dev/sca");
+        Assert.assertEquals(Paths.get("/sys/block/sca/queue/read_ahead_kb"), dirWithoutNumbers);
+
+        Path invalidDir = StartupChecks.getReadAheadKBPath("/tmp/xpto");
+        Assert.assertNull(invalidDir);
     }
 
     @Test
     public void maxMapCountCheck() throws Exception
     {
         startupChecks = startupChecks.withTest(StartupChecks.checkMaxMapCount);
-        startupChecks.verify();
+        startupChecks.verify(options);
     }
 
     private void copyLegacyNonSSTableFiles(Path targetDir) throws IOException
@@ -122,13 +169,40 @@
             Files.copy(Paths.get(legacySSTableRoot.toString(), filename), targetDir.resolve(filename));
     }
 
+    @Test
+    public void testDataResurrectionCheck() throws Exception
+    {
+        DataResurrectionCheck check = new DataResurrectionCheck() {
+            @Override
+            List<String> getKeyspaces()
+            {
+                return singletonList("abc");
+            }
+
+            @Override
+            List<TableGCPeriod> getTablesGcPeriods(String userKeyspace)
+            {
+                return singletonList(new TableGCPeriod("def", 10));
+            }
+        };
+
+        Heartbeat heartbeat = new Heartbeat(Instant.ofEpochMilli(Clock.Global.currentTimeMillis()));
+        heartbeat.serializeToJsonFile(heartbeatFile);
+
+        Thread.sleep(15 * 1000);
+
+        startupChecks.withTest(check);
+
+        verifyFailure(startupChecks, "Invalid tables: abc.def");
+    }
+
     private void copyInvalidLegacySSTables(Path targetDir) throws IOException
     {
-        File legacySSTableRoot = Paths.get(System.getProperty(INVALID_LEGACY_SSTABLE_ROOT_PROP),
+        File legacySSTableRoot = new File(Paths.get(System.getProperty(INVALID_LEGACY_SSTABLE_ROOT_PROP),
                                            "Keyspace1",
-                                           "Standard1").toFile();
-        for (File f : legacySSTableRoot.listFiles())
-            Files.copy(f.toPath(), targetDir.resolve(f.getName()));
+                                           "Standard1"));
+        for (File f : legacySSTableRoot.tryList())
+            Files.copy(f.toPath(), targetDir.resolve(f.name()));
 
     }
 
@@ -136,7 +210,7 @@
     {
         try
         {
-            tests.verify();
+            tests.verify(options);
             fail("Expected a startup exception but none was thrown");
         }
         catch (StartupException e)
diff --git a/test/unit/org/apache/cassandra/service/StorageProxyTest.java b/test/unit/org/apache/cassandra/service/StorageProxyTest.java
new file mode 100644
index 0000000..6f45673
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/StorageProxyTest.java
@@ -0,0 +1,151 @@
+/*
+ * 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.service;
+
+import java.net.UnknownHostException;
+import java.util.UUID;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.gms.EndpointState;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.gms.HeartBeatState;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.locator.Replica;
+import org.jboss.byteman.contrib.bmunit.BMRule;
+import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
+
+import static org.apache.cassandra.locator.ReplicaUtils.full;
+import static org.assertj.core.api.Assertions.assertThat;
+
+@RunWith(BMUnitRunner.class)
+public class StorageProxyTest
+{
+    @BeforeClass
+    public static void initDD()
+    {
+        DatabaseDescriptor.daemonInitialization();
+        ServerTestUtils.mkdirs();
+    }
+
+    @Test
+    public void testSetGetPaxosVariant()
+    {
+        Assert.assertEquals(Config.PaxosVariant.v1, DatabaseDescriptor.getPaxosVariant());
+        Assert.assertEquals("v1", StorageProxy.instance.getPaxosVariant());
+        StorageProxy.instance.setPaxosVariant("v2");
+        Assert.assertEquals("v2", StorageProxy.instance.getPaxosVariant());
+        Assert.assertEquals(Config.PaxosVariant.v2, DatabaseDescriptor.getPaxosVariant());
+        DatabaseDescriptor.setPaxosVariant(Config.PaxosVariant.v1);
+        Assert.assertEquals(Config.PaxosVariant.v1, DatabaseDescriptor.getPaxosVariant());
+        Assert.assertEquals(Config.PaxosVariant.v1, DatabaseDescriptor.getPaxosVariant());
+    }
+
+    @Test
+    public void testShouldHint() throws Exception
+    {
+        // HAPPY PATH with all defaults
+        shouldHintTest(replica -> {
+            assertThat(StorageProxy.shouldHint(replica)).isTrue();
+            assertThat(StorageProxy.shouldHint(replica, /* tryEnablePersistentWindow */ false)).isTrue();
+        });
+    }
+
+    @Test
+    public void testShouldHintOnWindowExpiry() throws Exception
+    {
+        shouldHintTest(replica -> {
+            // wait for 5 ms, we will shorten the hints window later
+            Uninterruptibles.sleepUninterruptibly(5, TimeUnit.MILLISECONDS);
+
+            final int originalHintWindow = DatabaseDescriptor.getMaxHintWindow();
+            try
+            {
+                DatabaseDescriptor.setMaxHintWindow(1); // 1 ms. It should not hint
+                assertThat(StorageProxy.shouldHint(replica)).isFalse();
+            }
+            finally
+            {
+                DatabaseDescriptor.setMaxHintWindow(originalHintWindow);
+            }
+        });
+    }
+
+    @Test
+    @BMRule(name = "Hints size exceeded the limit",
+            targetClass="org.apache.cassandra.hints.HintsService",
+            targetMethod="getTotalHintsSize",
+            action="return 2097152;") // 2MB
+    public void testShouldHintOnExceedingSize() throws Exception
+    {
+        shouldHintTest(replica -> {
+            final int originalHintsSizeLimit = DatabaseDescriptor.getMaxHintsSizePerHostInMiB();
+            try
+            {
+                DatabaseDescriptor.setMaxHintsSizePerHostInMiB(1);
+                assertThat(StorageProxy.shouldHint(replica)).isFalse();
+            }
+            finally
+            {
+                DatabaseDescriptor.setMaxHintsSizePerHostInMiB(originalHintsSizeLimit);
+            }
+        });
+    }
+
+
+    /**
+     * Ensure that the timer backing the JMX endpoint to transiently enable blocking read repairs both enables
+     * and disables the way we'd expect.
+     */
+    @Test
+    public void testTransientLoggingTimer()
+    {
+        StorageProxy.instance.logBlockingReadRepairAttemptsForNSeconds(2);
+        Assert.assertTrue(StorageProxy.instance.isLoggingReadRepairs());
+        Uninterruptibles.sleepUninterruptibly(5, TimeUnit.SECONDS);
+        Assert.assertFalse(StorageProxy.instance.isLoggingReadRepairs());
+    }
+
+    private void shouldHintTest(Consumer<Replica> test) throws UnknownHostException
+    {
+        InetAddressAndPort testEp = InetAddressAndPort.getByName("192.168.1.1");
+        Replica replica = full(testEp);
+        StorageService.instance.getTokenMetadata().updateHostId(UUID.randomUUID(), testEp);
+        EndpointState state = new EndpointState(new HeartBeatState(0, 0));
+        Gossiper.runInGossipStageBlocking(() -> Gossiper.instance.markDead(replica.endpoint(), state));
+
+        try
+        {
+            test.accept(replica);
+        }
+        finally
+        {
+            StorageService.instance.getTokenMetadata().removeEndpoint(testEp);
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java
index 69b0642..bb78c83 100644
--- a/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java
+++ b/test/unit/org/apache/cassandra/service/StorageServiceServerM3PTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.service;
 
-import java.io.File;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -28,6 +27,7 @@
 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;
 
diff --git a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java
index 60bed4c..119b810 100644
--- a/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java
+++ b/test/unit/org/apache/cassandra/service/StorageServiceServerTest.java
@@ -19,10 +19,7 @@
 
 package org.apache.cassandra.service;
 
-import java.io.File;
-import java.io.FileWriter;
 import java.io.IOException;
-import java.io.PrintWriter;
 import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.*;
@@ -38,7 +35,6 @@
 import org.apache.cassandra.audit.AuditLogManager;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.Keyspace;
-import org.apache.cassandra.db.WindowsFailedSnapshotTracker;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.dht.Murmur3Partitioner.LongToken;
@@ -57,9 +53,10 @@
 import org.apache.cassandra.utils.FBUtilities;
 import org.assertj.core.api.Assertions;
 
+import static org.apache.cassandra.ServerTestUtils.cleanup;
+import static org.apache.cassandra.ServerTestUtils.mkdirs;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
 
 public class StorageServiceServerTest
 {
@@ -72,6 +69,9 @@
         IEndpointSnitch snitch = new PropertyFileSnitch();
         DatabaseDescriptor.setEndpointSnitch(snitch);
         Keyspace.setInitialized();
+        mkdirs();
+        cleanup();
+        StorageService.instance.initServer(0);
     }
 
     @Test
@@ -88,75 +88,6 @@
         StorageService.instance.takeSnapshot(UUID.randomUUID().toString());
     }
 
-    private void checkTempFilePresence(File f, boolean exist)
-    {
-        for (int i = 0; i < 5; i++)
-        {
-            File subdir = new File(f, Integer.toString(i));
-            subdir.mkdir();
-            for (int j = 0; j < 5; j++)
-            {
-                File subF = new File(subdir, Integer.toString(j));
-                assert(exist ? subF.exists() : !subF.exists());
-            }
-        }
-    }
-
-    @Test
-    public void testSnapshotFailureHandler() throws IOException
-    {
-        assumeTrue(FBUtilities.isWindows);
-
-        // Initial "run" of Cassandra, nothing in failed snapshot file
-        WindowsFailedSnapshotTracker.deleteOldSnapshots();
-
-        File f = new File(System.getenv("TEMP") + File.separator + Integer.toString(new Random().nextInt()));
-        f.mkdir();
-        f.deleteOnExit();
-        for (int i = 0; i < 5; i++)
-        {
-            File subdir = new File(f, Integer.toString(i));
-            subdir.mkdir();
-            for (int j = 0; j < 5; j++)
-                new File(subdir, Integer.toString(j)).createNewFile();
-        }
-
-        checkTempFilePresence(f, true);
-
-        // Confirm deletion is recursive
-        for (int i = 0; i < 5; i++)
-            WindowsFailedSnapshotTracker.handleFailedSnapshot(new File(f, Integer.toString(i)));
-
-        assertTrue(new File(WindowsFailedSnapshotTracker.TODELETEFILE).exists());
-
-        // Simulate shutdown and restart of C* node, closing out the list of failed snapshots.
-        WindowsFailedSnapshotTracker.resetForTests();
-
-        // Perform new run, mimicking behavior of C* at startup
-        WindowsFailedSnapshotTracker.deleteOldSnapshots();
-        checkTempFilePresence(f, false);
-
-        // Check to make sure we don't delete non-temp, non-datafile locations
-        WindowsFailedSnapshotTracker.resetForTests();
-        PrintWriter tempPrinter = new PrintWriter(new FileWriter(WindowsFailedSnapshotTracker.TODELETEFILE, true));
-        tempPrinter.println(".safeDir");
-        tempPrinter.close();
-
-        File protectedDir = new File(".safeDir");
-        protectedDir.mkdir();
-        File protectedFile = new File(protectedDir, ".safeFile");
-        protectedFile.createNewFile();
-
-        WindowsFailedSnapshotTracker.handleFailedSnapshot(protectedDir);
-        WindowsFailedSnapshotTracker.deleteOldSnapshots();
-
-        assertTrue(protectedDir.exists());
-        assertTrue(protectedFile.exists());
-
-        protectedFile.delete();
-        protectedDir.delete();
-    }
-
     @Test
     public void testTableSnapshot() throws IOException
     {
@@ -190,9 +121,9 @@
         configOptions.put("DC2", "2");
         configOptions.put(ReplicationParams.CLASS, "NetworkTopologyStrategy");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, configOptions));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         Collection<Range<Token>> primaryRanges = StorageService.instance.getLocalPrimaryRangeForEndpoint(InetAddressAndPort.getByName("127.0.0.1"));
         Assertions.assertThat(primaryRanges.size()).as(primaryRanges.toString()).isEqualTo(1);
@@ -230,9 +161,9 @@
         configOptions.put("DC2", "1");
         configOptions.put(ReplicationParams.CLASS, "NetworkTopologyStrategy");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, configOptions));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangeForEndpointWithinDC(meta.name,
                                                                                                             InetAddressAndPort.getByName("127.0.0.1"));
@@ -273,9 +204,9 @@
         configOptions.put("DC2", "1");
         configOptions.put(ReplicationParams.CLASS, "NetworkTopologyStrategy");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, configOptions));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangesForEndpoint(meta.name, InetAddressAndPort.getByName("127.0.0.1"));
         Assertions.assertThat(primaryRanges.size()).as(primaryRanges.toString()).isEqualTo(1);
@@ -310,9 +241,9 @@
         configOptions.put("DC2", "2");
         configOptions.put(ReplicationParams.CLASS, "NetworkTopologyStrategy");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, configOptions));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         // endpoints in DC1 should not have primary range
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangesForEndpoint(meta.name, InetAddressAndPort.getByName("127.0.0.1"));
@@ -349,9 +280,9 @@
         configOptions.put("DC2", "2");
         configOptions.put(ReplicationParams.CLASS, "NetworkTopologyStrategy");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, configOptions));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         // endpoints in DC1 should not have primary range
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangeForEndpointWithinDC(meta.name, InetAddressAndPort.getByName("127.0.0.1"));
@@ -401,9 +332,9 @@
         configOptions.put("DC2", "2");
         configOptions.put(ReplicationParams.CLASS, "NetworkTopologyStrategy");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, configOptions));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         // endpoints in DC1 should not have primary range
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangesForEndpoint(meta.name, InetAddressAndPort.getByName("127.0.0.1"));
@@ -468,9 +399,9 @@
         configOptions.put("DC2", "2");
         configOptions.put(ReplicationParams.CLASS, "NetworkTopologyStrategy");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.create(false, configOptions));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         // endpoints in DC1 should have primary ranges which also cover DC2
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangeForEndpointWithinDC(meta.name, InetAddressAndPort.getByName("127.0.0.1"));
@@ -527,9 +458,9 @@
         metadata.updateNormalToken(new StringToken("B"), InetAddressAndPort.getByName("127.0.0.2"));
         metadata.updateNormalToken(new StringToken("C"), InetAddressAndPort.getByName("127.0.0.3"));
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.simpleTransient(2));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangesForEndpoint(meta.name, InetAddressAndPort.getByName("127.0.0.1"));
         Assertions.assertThat(primaryRanges.size()).as(primaryRanges.toString()).isEqualTo(1);
@@ -558,9 +489,9 @@
         Map<String, String> configOptions = new HashMap<>();
         configOptions.put("replication_factor", "2");
 
-        Keyspace.clear("Keyspace1");
+        SchemaTestUtil.dropKeyspaceIfExist("Keyspace1", false);
         KeyspaceMetadata meta = KeyspaceMetadata.create("Keyspace1", KeyspaceParams.simpleTransient(2));
-        Schema.instance.load(meta);
+        SchemaTestUtil.addOrUpdateKeyspace(meta, false);
 
         Collection<Range<Token>> primaryRanges = StorageService.instance.getPrimaryRangeForEndpointWithinDC(meta.name, InetAddressAndPort.getByName("127.0.0.1"));
         Assertions.assertThat(primaryRanges.size()).as(primaryRanges.toString()).isEqualTo(1);
@@ -673,7 +604,7 @@
             StorageService.instance.enableAuditLog("foobar", null, null, null, null, null, null, null);
             Assert.fail();
         }
-        catch (IllegalStateException ex)
+        catch (ConfigurationException | IllegalStateException ex)
         {
             StorageService.instance.disableAuditLog();
         }
diff --git a/test/unit/org/apache/cassandra/service/StorageServiceTest.java b/test/unit/org/apache/cassandra/service/StorageServiceTest.java
index 5f9d325..e4589d6 100644
--- a/test/unit/org/apache/cassandra/service/StorageServiceTest.java
+++ b/test/unit/org/apache/cassandra/service/StorageServiceTest.java
@@ -18,30 +18,40 @@
 
 package org.apache.cassandra.service;
 
-import org.apache.cassandra.locator.EndpointsByReplica;
-import org.apache.cassandra.locator.ReplicaCollection;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.atomic.AtomicInteger;
 
 import com.google.common.collect.ImmutableMultimap;
+import org.junit.Assert;
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.dht.RandomPartitioner;
 import org.apache.cassandra.dht.Range;
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.locator.AbstractEndpointSnitch;
 import org.apache.cassandra.locator.AbstractReplicationStrategy;
+import org.apache.cassandra.locator.EndpointsByReplica;
 import org.apache.cassandra.locator.IEndpointSnitch;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
+import org.apache.cassandra.locator.ReplicaCollection;
 import org.apache.cassandra.locator.ReplicaMultimap;
 import org.apache.cassandra.locator.SimpleSnitch;
 import org.apache.cassandra.locator.SimpleStrategy;
 import org.apache.cassandra.locator.TokenMetadata;
 import org.mockito.Mockito;
 
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.awaitility.Awaitility.await;
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 public class StorageServiceTest
@@ -98,6 +108,7 @@
         };
 
         DatabaseDescriptor.setEndpointSnitch(snitch);
+        CommitLog.instance.start();
     }
 
     private AbstractReplicationStrategy simpleStrategy(TokenMetadata tmd)
@@ -163,6 +174,36 @@
     }
 
     @Test
+    public void testSetGetSSTablePreemptiveOpenIntervalInMB()
+    {
+        StorageService.instance.setSSTablePreemptiveOpenIntervalInMB(-1);
+        Assert.assertEquals(-1, StorageService.instance.getSSTablePreemptiveOpenIntervalInMB());
+    }
+
+    @Test
+    public void testScheduledExecutorsShutdownOnDrain() throws Throwable
+    {
+        final AtomicInteger numberOfRuns = new AtomicInteger(0);
+
+        ScheduledFuture<?> f = ScheduledExecutors.scheduledTasks.scheduleAtFixedRate(numberOfRuns::incrementAndGet,
+                                                                                     0, 1, SECONDS);
+
+        // Prove the task was scheduled more than once before checking cancelled.
+        await("first run").atMost(1, MINUTES).until(() -> numberOfRuns.get() > 1);
+
+        assertFalse(f.isCancelled());
+        StorageService.instance.drain();
+        assertTrue(f.isCancelled());
+
+        assertTrue(ScheduledExecutors.scheduledTasks.isTerminated());
+        assertTrue(ScheduledExecutors.nonPeriodicTasks.isTerminated());
+        assertTrue(ScheduledExecutors.optionalTasks.isTerminated());
+
+        // fast tasks are shut down as part of the Runtime shutdown hook.
+        assertFalse(ScheduledExecutors.scheduledFastTasks.isTerminated());
+    }
+
+    @Test
     public void testRebuildFailOnNonExistingDatacenter()
     {
         String nonExistentDC = "NON_EXISTENT_DC";
@@ -174,10 +215,10 @@
         }
         catch (IllegalArgumentException ex)
         {
-            assertEquals(String.format("Provided datacenter '%s' is not a valid datacenter, available datacenters are: %s",
-                                       nonExistentDC,
-                                       SimpleSnitch.DATA_CENTER_NAME),
-                         ex.getMessage());
+            Assert.assertEquals(String.format("Provided datacenter '%s' is not a valid datacenter, available datacenters are: %s",
+                                              nonExistentDC,
+                                              SimpleSnitch.DATA_CENTER_NAME),
+                                ex.getMessage());
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/service/SystemPropertiesBasedFileSystemOwnershipCheckTest.java b/test/unit/org/apache/cassandra/service/SystemPropertiesBasedFileSystemOwnershipCheckTest.java
new file mode 100644
index 0000000..cb54f81
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/SystemPropertiesBasedFileSystemOwnershipCheckTest.java
@@ -0,0 +1,34 @@
+/*
+ * 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.service;
+
+import org.junit.Before;
+
+import org.apache.cassandra.config.CassandraRelevantProperties;
+
+public class SystemPropertiesBasedFileSystemOwnershipCheckTest extends AbstractFilesystemOwnershipCheckTest
+{
+    @Before
+    public void setup()
+    {
+        super.setup();
+        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_OWNERSHIP_TOKEN.getKey(), token);
+        System.setProperty(CassandraRelevantProperties.FILE_SYSTEM_CHECK_ENABLE.getKey(), "true");
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/service/WriteResponseHandlerTest.java b/test/unit/org/apache/cassandra/service/WriteResponseHandlerTest.java
index 5d8d191..7a9bbf3 100644
--- a/test/unit/org/apache/cassandra/service/WriteResponseHandlerTest.java
+++ b/test/unit/org/apache/cassandra/service/WriteResponseHandlerTest.java
@@ -49,7 +49,9 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static java.util.concurrent.TimeUnit.DAYS;
 import static org.apache.cassandra.net.NoPayload.noPayload;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -92,7 +94,7 @@
 
             public String getDatacenter(InetAddressAndPort endpoint)
             {
-                byte[] address = endpoint.address.getAddress();
+                byte[] address = endpoint.getAddress().getAddress();
                 if (address[1] == 1)
                     return "datacenter1";
                 else
@@ -145,7 +147,7 @@
     {
         long startingCount = ks.metric.idealCLWriteLatency.latency.getCount();
         //Specify query start time in past to ensure minimum latency measurement
-        AbstractWriteResponseHandler awr = createWriteResponseHandler(ConsistencyLevel.LOCAL_QUORUM, ConsistencyLevel.EACH_QUORUM, System.nanoTime() - TimeUnit.DAYS.toNanos(1));
+        AbstractWriteResponseHandler awr = createWriteResponseHandler(ConsistencyLevel.LOCAL_QUORUM, ConsistencyLevel.EACH_QUORUM, nanoTime() - DAYS.toNanos(1));
 
         //dc1
         awr.onResponse(createDummyMessage(0));
@@ -260,13 +262,13 @@
 
     private static AbstractWriteResponseHandler createWriteResponseHandler(ConsistencyLevel cl, ConsistencyLevel ideal)
     {
-        return createWriteResponseHandler(cl, ideal, System.nanoTime());
+        return createWriteResponseHandler(cl, ideal, nanoTime());
     }
 
     private static AbstractWriteResponseHandler createWriteResponseHandler(ConsistencyLevel cl, ConsistencyLevel ideal, long queryStartTime)
     {
         return ks.getReplicationStrategy().getWriteResponseHandler(ReplicaPlans.forWrite(ks, cl, targets, pending, Predicates.alwaysTrue(), ReplicaPlans.writeAll),
-                                                                   null, WriteType.SIMPLE, queryStartTime, ideal);
+                                                                   null, WriteType.SIMPLE, null, queryStartTime, ideal);
     }
 
     private static Message createDummyMessage(int target)
diff --git a/test/unit/org/apache/cassandra/service/WriteResponseHandlerTransientTest.java b/test/unit/org/apache/cassandra/service/WriteResponseHandlerTransientTest.java
index 19ed66d..f912c72 100644
--- a/test/unit/org/apache/cassandra/service/WriteResponseHandlerTransientTest.java
+++ b/test/unit/org/apache/cassandra/service/WriteResponseHandlerTransientTest.java
@@ -52,8 +52,6 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
-import static org.apache.cassandra.locator.Replica.fullReplica;
-import static org.apache.cassandra.locator.Replica.transientReplica;
 import static org.apache.cassandra.locator.ReplicaUtils.full;
 import static org.apache.cassandra.locator.ReplicaUtils.trans;
 
@@ -111,7 +109,7 @@
 
             public String getDatacenter(InetAddressAndPort endpoint)
             {
-                byte[] address = endpoint.address.getAddress();
+                byte[] address = endpoint.getAddress().getAddress();
                 if (address[1] == 1)
                     return DC1;
                 else
@@ -152,27 +150,27 @@
         EndpointsForToken natural = EndpointsForToken.of(dummy.getToken(), full(EP1), full(EP2), trans(EP3), full(EP5));
         EndpointsForToken pending = EndpointsForToken.of(dummy.getToken(), full(EP4), trans(EP6));
         ReplicaLayout.ForTokenWrite layout = new ReplicaLayout.ForTokenWrite(ks.getReplicationStrategy(), natural, pending);
-        ReplicaPlan.ForTokenWrite replicaPlan = ReplicaPlans.forWrite(ks, ConsistencyLevel.QUORUM, layout, layout, ReplicaPlans.writeAll);
+        ReplicaPlan.ForWrite replicaPlan = ReplicaPlans.forWrite(ks, ConsistencyLevel.QUORUM, layout, layout, ReplicaPlans.writeAll);
 
         Assert.assertTrue(Iterables.elementsEqual(EndpointsForRange.of(full(EP4), trans(EP6)),
                                                   replicaPlan.pending()));
     }
 
-    private static ReplicaPlan.ForTokenWrite expected(EndpointsForToken natural, EndpointsForToken selected)
+    private static ReplicaPlan.ForWrite expected(EndpointsForToken natural, EndpointsForToken selected)
     {
-        return new ReplicaPlan.ForTokenWrite(ks, ks.getReplicationStrategy(), ConsistencyLevel.QUORUM, EndpointsForToken.empty(dummy.getToken()), natural, natural, selected);
+        return new ReplicaPlan.ForWrite(ks, ks.getReplicationStrategy(), ConsistencyLevel.QUORUM, EndpointsForToken.empty(dummy.getToken()), natural, natural, selected);
     }
 
-    private static ReplicaPlan.ForTokenWrite getSpeculationContext(EndpointsForToken natural, Predicate<InetAddressAndPort> livePredicate)
+    private static ReplicaPlan.ForWrite getSpeculationContext(EndpointsForToken natural, Predicate<InetAddressAndPort> livePredicate)
     {
         ReplicaLayout.ForTokenWrite liveAndDown = new ReplicaLayout.ForTokenWrite(ks.getReplicationStrategy(), natural, EndpointsForToken.empty(dummy.getToken()));
         ReplicaLayout.ForTokenWrite live = new ReplicaLayout.ForTokenWrite(ks.getReplicationStrategy(), natural.filter(r -> livePredicate.test(r.endpoint())), EndpointsForToken.empty(dummy.getToken()));
         return ReplicaPlans.forWrite(ks, ConsistencyLevel.QUORUM, liveAndDown, live, ReplicaPlans.writeNormal);
     }
 
-    private static void assertSpeculationReplicas(ReplicaPlan.ForTokenWrite expected, EndpointsForToken replicas, Predicate<InetAddressAndPort> livePredicate)
+    private static void assertSpeculationReplicas(ReplicaPlan.ForWrite expected, EndpointsForToken replicas, Predicate<InetAddressAndPort> livePredicate)
     {
-        ReplicaPlan.ForTokenWrite actual = getSpeculationContext(replicas, livePredicate);
+        ReplicaPlan.ForWrite actual = getSpeculationContext(replicas, livePredicate);
         assertEquals(expected.pending(), actual.pending());
         assertEquals(expected.live(), actual.live());
         assertEquals(expected.contacts(), actual.contacts());
diff --git a/test/unit/org/apache/cassandra/service/YamlBasedFileSystemOwnershipCheckTest.java b/test/unit/org/apache/cassandra/service/YamlBasedFileSystemOwnershipCheckTest.java
new file mode 100644
index 0000000..9b962e9
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/YamlBasedFileSystemOwnershipCheckTest.java
@@ -0,0 +1,35 @@
+/*
+ * 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.service;
+
+import org.junit.Before;
+
+import static org.apache.cassandra.config.StartupChecksOptions.ENABLED_PROPERTY;
+import static org.apache.cassandra.service.StartupChecks.StartupCheckType.check_filesystem_ownership;
+
+public class YamlBasedFileSystemOwnershipCheckTest extends AbstractFilesystemOwnershipCheckTest
+{
+    @Before
+    public void setup()
+    {
+        super.setup();
+        options.getConfig(check_filesystem_ownership).put(ENABLED_PROPERTY, "true");
+        options.getConfig(check_filesystem_ownership).put("ownership_token", token);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/AbstractPaxosRepairTest.java b/test/unit/org/apache/cassandra/service/paxos/AbstractPaxosRepairTest.java
new file mode 100644
index 0000000..9721879
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/AbstractPaxosRepairTest.java
@@ -0,0 +1,174 @@
+/*
+ * 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.service.paxos;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import com.google.common.collect.Iterables;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.service.paxos.AbstractPaxosRepair.State;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+import static org.apache.cassandra.service.paxos.AbstractPaxosRepair.DONE;
+
+/**
+ * test the state change logic of AbstractPaxosRepair
+ */
+public class AbstractPaxosRepairTest
+{
+    private static DecoratedKey dk(int k)
+    {
+        return Murmur3Partitioner.instance.decorateKey(ByteBufferUtil.bytes(k));
+    }
+
+    private static final DecoratedKey DK1 = dk(1);
+
+    private static State STARTED = new State();
+
+    private static class PaxosTestRepair extends AbstractPaxosRepair
+    {
+        public PaxosTestRepair()
+        {
+            super(Murmur3Partitioner.instance.decorateKey(ByteBufferUtil.bytes(1)), null);
+        }
+
+        public State restart(State state, long waitUntil)
+        {
+            return STARTED;
+        }
+
+        public void setState(State update)
+        {
+            updateState(state(), null, (i1, i2) -> update);
+        }
+    }
+
+    private static class Event
+    {
+        final AbstractPaxosRepair repair;
+        final AbstractPaxosRepair.Result result;
+
+        public Event(AbstractPaxosRepair repair, AbstractPaxosRepair.Result result)
+        {
+            this.repair = repair;
+            this.result = result;
+        }
+
+        public String toString()
+        {
+            return "Event{" +
+                   "repair=" + repair +
+                   ", result=" + result +
+                   '}';
+        }
+
+        public boolean equals(Object o)
+        {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            Event event = (Event) o;
+            return Objects.equals(repair, event.repair) && Objects.equals(result, event.result);
+        }
+
+        public int hashCode()
+        {
+            return Objects.hash(repair, result);
+        }
+    }
+
+    private static class Listener implements AbstractPaxosRepair.Listener
+    {
+
+        final List<Event> events = new ArrayList<>();
+
+        public void onComplete(AbstractPaxosRepair repair, AbstractPaxosRepair.Result result)
+        {
+            events.add(new Event(repair, result));
+        }
+
+        public Event getOnlyEvent()
+        {
+            return Iterables.getOnlyElement(events);
+        }
+    }
+
+    @Test
+    public void stateUpdate()
+    {
+        // listeners shoulnd't be called on state updates
+        PaxosTestRepair repair = new PaxosTestRepair();
+        Listener listener = new Listener();
+        repair.addListener(listener);
+        Assert.assertNull(repair.state());
+        repair.start();
+        Assert.assertSame(STARTED, repair.state());
+        Assert.assertTrue(listener.events.isEmpty());
+    }
+
+    @Test
+    public void resultUpdate()
+    {
+        // listeners should be called on state updates
+        PaxosTestRepair repair = new PaxosTestRepair();
+        Listener listener = new Listener();
+        repair.addListener(listener);
+        repair.start();
+        Assert.assertTrue(listener.events.isEmpty());
+
+        repair.setState(DONE);
+        Assert.assertEquals(new Event(repair, DONE), listener.getOnlyEvent());
+    }
+
+    @Test
+    public void stateUpdateException()
+    {
+        // state should be set to failure and listeners called on exception
+        Throwable e = new Throwable();
+
+        PaxosTestRepair repair = new PaxosTestRepair();
+        Listener listener = new Listener();
+        repair.addListener(listener);
+        repair.start();
+
+        repair.updateState(repair.state(), null, (i1, i2) -> {throw e;});
+        Assert.assertEquals(new Event(repair, new AbstractPaxosRepair.Failure(e)), listener.getOnlyEvent());
+
+    }
+
+    @Test
+    public void postResultListenerAttachment()
+    {
+        // listener should be called immediately if the repair is already complete
+        PaxosTestRepair repair = new PaxosTestRepair();
+        repair.start();
+
+        repair.setState(DONE);
+
+        Listener listener = new Listener();
+        Assert.assertTrue(listener.events.isEmpty());
+        repair.addListener(listener);
+        Assert.assertEquals(new Event(repair, DONE), listener.getOnlyEvent());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/ContentionStrategyTest.java b/test/unit/org/apache/cassandra/service/paxos/ContentionStrategyTest.java
new file mode 100644
index 0000000..8b67c42
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/ContentionStrategyTest.java
@@ -0,0 +1,466 @@
+/*
+ * 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.service.paxos;
+
+import java.util.List;
+import java.util.Random;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.function.BiFunction;
+import java.util.function.Consumer;
+import java.util.function.DoubleSupplier;
+import java.util.function.LongBinaryOperator;
+
+import com.google.common.collect.ImmutableList;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import net.nicoulaj.compilecommand.annotations.Inline;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+import static org.apache.cassandra.service.paxos.ContentionStrategy.*;
+import static org.apache.cassandra.service.paxos.ContentionStrategy.WaitRandomizerFactory.*;
+import static org.apache.cassandra.service.paxos.ContentionStrategyTest.WaitRandomizerType.*;
+
+public class ContentionStrategyTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(ContentionStrategyTest.class);
+
+    static
+    {
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    private static final long MAX = maxQueryTimeoutMicros()/2;
+
+    private static final WaitParseValidator DEFAULT_WAIT_RANDOMIZER_VALIDATOR = new WaitParseValidator(defaultWaitRandomizer(), QEXP, 1.5);
+    private static final BoundParseValidator DEFAULT_MIN_VALIDATOR = new BoundParseValidator(defaultMinWait(), true, assertBound(0, MAX, 0, selectors.maxReadWrite(0f).getClass(), 0.50, 0, modifiers.multiply(0f).getClass(), 0.66));
+    private static final BoundParseValidator DEFAULT_MAX_VALIDATOR = new BoundParseValidator(defaultMaxWait(), false, assertBound(10000, 100000, 100000, selectors.maxReadWrite(0f).getClass(), 0.95, 0, modifiers.multiplyByAttemptsExp(0f).getClass(), 1.8));
+    private static final BoundParseValidator DEFAULT_MIN_DELTA_VALIDATOR = new BoundParseValidator(defaultMinDelta(), true, assertBound(5000, MAX, 5000, selectors.maxReadWrite(0f).getClass(), 0.50, 0, modifiers.multiply(0f).getClass(), 0.5));
+
+    private static List<BoundParseValidator> VALIDATE = ImmutableList.of(
+            new BoundParseValidator("p95(rw)", false, assertBound(0, MAX, MAX, selectors.maxReadWrite(0f).getClass(), 0.95, 0, modifiers.identity().getClass(), 1)),
+            new BoundParseValidator("5ms<=p50(rw)*0.66", false, assertBound(5000, MAX, MAX, selectors.maxReadWrite(0f).getClass(), 0.50, 0, modifiers.multiply(0).getClass(), 0.66)),
+            new BoundParseValidator("5us <= p50(r)*1.66*attempts", true, assertBound(5, MAX, 5, selectors.read(0f).getClass(), 0.50, 0, modifiers.multiplyByAttempts(0f).getClass(), 1.66)),
+            new BoundParseValidator("0<=p50(w)*0.66^attempts", true, assertBound(0, MAX, 0, selectors.write(0f).getClass(), 0.50, 0, modifiers.multiplyByAttemptsExp(0f).getClass(), 0.66)),
+            new BoundParseValidator("125us", true, assertBound(125, 125, 125, selectors.constant(0).getClass(), 0.0f, 125, modifiers.identity().getClass(), 1)),
+            new BoundParseValidator("5us <= p95(r)*1.8^attempts <= 100us", true, assertBound(5, 100, 5, selectors.read(0f).getClass(), 0.95, 0, modifiers.multiplyByAttemptsExp(0f).getClass(), 1.8)),
+            DEFAULT_MIN_VALIDATOR, DEFAULT_MAX_VALIDATOR, DEFAULT_MIN_DELTA_VALIDATOR
+    );
+
+    private static List<WaitParseValidator> VALIDATE_RANDOMIZER = ImmutableList.of(
+            new WaitParseValidator("quantizedexponential(0.5)", QEXP, 0.5),
+            new WaitParseValidator("exponential(2.5)", EXP, 2.5),
+            new WaitParseValidator("exp(10)", EXP, 10),
+            new WaitParseValidator("uniform", UNIFORM, 0),
+            DEFAULT_WAIT_RANDOMIZER_VALIDATOR
+    );
+
+    static class BoundParseValidator
+    {
+        final String spec;
+        final boolean isMin;
+        final Consumer<Bound> validator;
+
+        BoundParseValidator(String spec, boolean isMin, Consumer<Bound> validator)
+        {
+            this.spec = spec;
+            this.isMin = isMin;
+            this.validator = validator;
+        }
+
+        void validate(Bound bound)
+        {
+            validator.accept(bound);
+        }
+    }
+
+    enum WaitRandomizerType
+    {
+        UNIFORM(Uniform.class, (p, f) -> f.uniform()),
+        EXP(Exponential.class, (p, f) -> f.exponential(p)),
+        QEXP(QuantizedExponential.class, (p, f) -> f.quantizedExponential(p));
+
+        final Class<? extends WaitRandomizer> clazz;
+        final BiFunction<Double, WaitRandomizerFactory, WaitRandomizer> getter;
+
+        WaitRandomizerType(Class<? extends WaitRandomizer> clazz, BiFunction<Double, WaitRandomizerFactory, WaitRandomizer> getter)
+        {
+            this.clazz = clazz;
+            this.getter = getter;
+        }
+    }
+
+
+    static class WaitParseValidator
+    {
+        final String spec;
+        final WaitRandomizerType type;
+        final double power;
+
+        WaitParseValidator(String spec, WaitRandomizerType type, double power)
+        {
+            this.spec = spec;
+            this.type = type;
+            this.power = power;
+        }
+
+        void validate(WaitRandomizer randomizer)
+        {
+            Assert.assertSame(type.clazz, randomizer.getClass());
+            if (AbstractExponential.class.isAssignableFrom(type.clazz))
+                Assert.assertEquals(power, ((AbstractExponential) randomizer).power, 0.00001);
+        }
+    }
+
+    private static class WaitRandomizerOutputValidator
+    {
+        static void validate(WaitRandomizerType type, long seed, int trials, int samplesPerTrial)
+        {
+            Random random = new Random(seed);
+            WaitRandomizer randomizer = type.getter.apply(2d, new WaitRandomizerFactory()
+            {
+                @Override public LongBinaryOperator uniformLongSupplier() { return (min, max) -> min + random.nextInt((int) (max - min)); }
+                @Override public DoubleSupplier uniformDoubleSupplier() { return random::nextDouble; }
+            });
+
+            for (int i = 0 ; i < trials ; ++i)
+            {
+                int min = random.nextInt(1 << 20);
+                int max = min + 1024 + random.nextInt(1 << 20);
+                double minMean = minMean(type, min, max);
+                double maxMean = maxMean(type, min, max);
+                double sampleMean = sampleMean(samplesPerTrial, min, max, randomizer);
+                Assert.assertTrue(minMean <= sampleMean);
+                Assert.assertTrue(maxMean >= sampleMean);
+            }
+        }
+
+        private static double minMean(WaitRandomizerType type, int min, int max)
+        {
+            switch (type)
+            {
+                case UNIFORM: return min + (max - min) * (4d/10);
+                case EXP: case QEXP: return min + (max - min) * (6d/10);
+                default: throw new IllegalStateException();
+            }
+        }
+
+        private static double maxMean(WaitRandomizerType type, int min, int max)
+        {
+            switch (type)
+            {
+                case UNIFORM: return min + (max - min) * (6d/10);
+                case EXP: case QEXP: return min + (max - min) * (8d/10);
+                default: throw new IllegalStateException();
+            }
+        }
+
+        private static double sampleMean(int samples, int min, int max, WaitRandomizer randomizer)
+        {
+            double sum = 0;
+            int attempts = 1;
+            for (int i = 0 ; i < samples ; ++i)
+            {
+                long wait = randomizer.wait(min, max, attempts = (attempts & 15) + 1);
+                Assert.assertTrue(wait >= min);
+                Assert.assertTrue(wait <= max);
+                sum += wait;
+            }
+            double mean = sum / samples;
+            Assert.assertTrue(mean >= min);
+            Assert.assertTrue(mean <= max);
+            return mean;
+        }
+    }
+
+    private static Consumer<Bound> assertBound(
+                             long min, long max, long onFailure,
+                             Class<? extends LatencySelector> selectorClass,
+                             double selectorPercentile,
+                             long selectorConst,
+                             Class<? extends LatencyModifier> modifierClass,
+                             double modifierVal
+    )
+    {
+        return bound -> {
+            Assert.assertEquals(min, bound.min);
+            Assert.assertEquals(max, bound.max);
+            Assert.assertEquals(onFailure, bound.onFailure);
+            Assert.assertSame(selectorClass, bound.selector.getClass());
+            if (selectorClass == selectors.constant(0).getClass())
+            {
+                LatencySupplier fail = v -> { throw new UnsupportedOperationException(); };
+                Assert.assertEquals(selectorConst, bound.selector.select(fail, fail));
+            }
+            else
+            {
+                AtomicReference<Double> percentile = new AtomicReference<>();
+                LatencySupplier set = v -> { percentile.set(v); return 0; };
+                bound.selector.select(set, set);
+                Assert.assertNotNull(percentile.get());
+                Assert.assertEquals(selectorPercentile, percentile.get(), 0.00001);
+            }
+            Assert.assertSame(modifierClass, bound.modifier.getClass());
+            Assert.assertEquals(1000000L * modifierVal, bound.modifier.modify(1000000, 1), 0.00001);
+        };
+    }
+
+    private static void assertParseFailure(String spec)
+    {
+
+        try
+        {
+            Bound bound = parseBound(spec, false);
+            Assert.fail("expected parse failure, but got " + bound);
+        }
+        catch (IllegalArgumentException e)
+        {
+            // expected
+        }
+    }
+
+    @Test
+    public void strategyParseTest()
+    {
+        for (BoundParseValidator min : VALIDATE.stream().filter(v -> v.isMin).toArray(BoundParseValidator[]::new))
+        {
+            for (BoundParseValidator max : VALIDATE.stream().filter(v -> !v.isMin).toArray(BoundParseValidator[]::new))
+            {
+                for (BoundParseValidator minDelta : VALIDATE.stream().filter(v -> v.isMin).toArray(BoundParseValidator[]::new))
+                {
+                    for (WaitParseValidator random : VALIDATE_RANDOMIZER)
+                    {
+                        {
+                            ParsedStrategy parsed = parseStrategy("min=" + min.spec + ",max=" + max.spec + ",delta=" + minDelta.spec + ",random=" + random.spec);
+                            Assert.assertEquals(parsed.min, min.spec);
+                            min.validate(parsed.strategy.min);
+                            Assert.assertEquals(parsed.max, max.spec);
+                            max.validate(parsed.strategy.max);
+                            Assert.assertEquals(parsed.minDelta, minDelta.spec);
+                            minDelta.validate(parsed.strategy.minDelta);
+                            Assert.assertEquals(parsed.waitRandomizer, random.spec);
+                            random.validate(parsed.strategy.waitRandomizer);
+                        }
+                        ParsedStrategy parsed = parseStrategy("random=" + random.spec);
+                        Assert.assertEquals(parsed.min, DEFAULT_MIN_VALIDATOR.spec);
+                        DEFAULT_MIN_VALIDATOR.validate(parsed.strategy.min);
+                        Assert.assertEquals(parsed.max, DEFAULT_MAX_VALIDATOR.spec);
+                        DEFAULT_MAX_VALIDATOR.validate(parsed.strategy.max);
+                        Assert.assertEquals(parsed.minDelta, DEFAULT_MIN_DELTA_VALIDATOR.spec);
+                        DEFAULT_MIN_DELTA_VALIDATOR.validate(parsed.strategy.minDelta);
+                        Assert.assertEquals(parsed.waitRandomizer, random.spec);
+                        random.validate(parsed.strategy.waitRandomizer);
+                    }
+                    ParsedStrategy parsed = parseStrategy("delta=" + minDelta.spec);
+                    Assert.assertEquals(parsed.min, DEFAULT_MIN_VALIDATOR.spec);
+                    DEFAULT_MIN_VALIDATOR.validate(parsed.strategy.min);
+                    Assert.assertEquals(parsed.max, DEFAULT_MAX_VALIDATOR.spec);
+                    DEFAULT_MAX_VALIDATOR.validate(parsed.strategy.max);
+                    Assert.assertEquals(parsed.minDelta, minDelta.spec);
+                    minDelta.validate(parsed.strategy.minDelta);
+                }
+                ParsedStrategy parsed = parseStrategy("max=" + max.spec);
+                Assert.assertEquals(parsed.min, DEFAULT_MIN_VALIDATOR.spec);
+                DEFAULT_MIN_VALIDATOR.validate(parsed.strategy.min);
+                Assert.assertEquals(parsed.max, max.spec);
+                max.validate(parsed.strategy.max);
+                Assert.assertEquals(parsed.minDelta, DEFAULT_MIN_DELTA_VALIDATOR.spec);
+                DEFAULT_MIN_DELTA_VALIDATOR.validate(parsed.strategy.minDelta);
+            }
+            ParsedStrategy parsed = parseStrategy("min=" + min.spec);
+            Assert.assertEquals(parsed.min, min.spec);
+            min.validate(parsed.strategy.min);
+            Assert.assertEquals(parsed.max, DEFAULT_MAX_VALIDATOR.spec);
+            DEFAULT_MAX_VALIDATOR.validate(parsed.strategy.max);
+            Assert.assertEquals(parsed.minDelta, DEFAULT_MIN_DELTA_VALIDATOR.spec);
+            DEFAULT_MIN_DELTA_VALIDATOR.validate(parsed.strategy.minDelta);
+        }
+    }
+
+    @Test
+    public void testParseRoundTrip()
+    {
+        LatencySelectorFactory selectorFactory = new LatencySelectorFactory()
+        {
+            LatencySelectorFactory delegate = ContentionStrategy.selectors;
+            public LatencySelector constant(long latency) { return selector(delegate.constant(latency), String.format("%dms", latency)); }
+            public LatencySelector read(double percentile) { return selector(delegate.read(percentile), String.format("p%d(r)", (int) (percentile * 100))); }
+            public LatencySelector write(double percentile) { return selector(delegate.write(percentile), String.format("p%d(w)", (int) (percentile * 100))); }
+            public LatencySelector maxReadWrite(double percentile) { return selector(delegate.maxReadWrite(percentile), String.format("p%d(rw)", (int) percentile * 100)); }
+
+            private LatencySelector selector(LatencySelector selector, String str) {
+                return new LatencySelector()
+                {
+                    public long select(LatencySupplier read, LatencySupplier write)
+                    {
+                        return selector.select(read, write);
+                    }
+
+                    public String toString()
+                    {
+                        return str;
+                    }
+                };
+            }
+        };
+
+        LatencyModifierFactory modifierFactory = new LatencyModifierFactory()
+        {
+            LatencyModifierFactory delegate = ContentionStrategy.modifiers;
+            public LatencyModifier identity() { return modifier(delegate.identity(), ""); }
+            public LatencyModifier multiply(double constant) { return modifier(delegate.multiply(constant), String.format(" * %.2f", constant)); }
+            public LatencyModifier multiplyByAttempts(double multiply) { return modifier(delegate.multiplyByAttempts(multiply), String.format(" * %.2f * attempts", multiply)); }
+            public LatencyModifier multiplyByAttemptsExp(double base) { return modifier(delegate.multiplyByAttemptsExp(base), String.format(" * %.2f ^ attempts", base)); }
+
+            private LatencyModifier modifier(LatencyModifier modifier, String str) {
+                return new LatencyModifier()
+                {
+                    @Inline
+                    public long modify(long latency, int attempts)
+                    {
+                        return modifier.modify(latency, attempts);
+                    }
+
+                    public String toString()
+                    {
+                        return str;
+                    }
+                };
+            }
+        };
+
+        LatencyModifier[] latencyModifiers = new LatencyModifier[]{
+        modifierFactory.multiply(0.5),
+        modifierFactory.multiplyByAttempts(0.5),
+        modifierFactory.multiplyByAttemptsExp(0.5)
+        };
+
+        LatencySelector[] latencySelectors = new LatencySelector[]{
+        selectorFactory.read(0.5),
+        selectorFactory.write(0.5),
+        selectorFactory.maxReadWrite(0.99)
+        };
+
+        for (boolean min : new boolean[] { true, false})
+        {
+            String left = min ? "10ms <= " : "";
+            for (boolean max : new boolean[] { true, false})
+            {
+                String right = max ? " <= 10ms" : "";
+
+                for (LatencySelector selector : latencySelectors)
+                {
+                    for (LatencyModifier modifier : latencyModifiers)
+                    {
+                        String mid = String.format("%s%s", selector, modifier);
+                        String input = left + mid + right;
+                        Bound bound = parseBound(input, false, selectorFactory, modifierFactory);
+                        Assert.assertTrue(String.format("Bound: %d" , bound.min), !min || bound.min == 10000);
+                        Assert.assertTrue(String.format("Bound: %d" , bound.max), !max || bound.max == 10000);
+                        Assert.assertEquals(selector.toString(), bound.selector.toString());
+                        Assert.assertEquals(modifier.toString(), bound.modifier.toString());
+                    }
+                }
+            }
+        }
+    }
+
+    @Test
+    public void boundParseTest()
+    {
+        VALIDATE.forEach(v -> v.validate(parseBound(v.spec, v.isMin)));
+    }
+
+    @Test
+    public void waitRandomizerParseTest()
+    {
+        VALIDATE_RANDOMIZER.forEach(v -> v.validate(parseWaitRandomizer(v.spec)));
+    }
+
+    @Test
+    public void waitRandomizerSampleTest()
+    {
+        waitRandomizerSampleTest(2);
+    }
+
+    private void waitRandomizerSampleTest(int count)
+    {
+        while (count-- > 0)
+        {
+            long seed = ThreadLocalRandom.current().nextLong();
+            logger.info("Seed {}", seed);
+            for (WaitRandomizerType type : WaitRandomizerType.values())
+            {
+                WaitRandomizerOutputValidator.validate(type, seed, 100, 1000000);
+            }
+        }
+    }
+
+    @Test
+    public void boundParseFailureTest()
+    {
+        assertParseFailure("10ms <= p95(r) <= 5ms");
+        assertParseFailure("10 <= p95(r)");
+        assertParseFailure("10 <= 20 <= 30");
+        assertParseFailure("p95(r) < 5");
+        assertParseFailure("p95(x)");
+        assertParseFailure("p95()");
+        assertParseFailure("p95");
+        assertParseFailure("p50(rw)+0.66");
+    }
+
+    @Test
+    public void testBackoffTime()
+    {
+        ContentionStrategy strategy = parseStrategy("min=0ms,max=100ms,random=uniform").strategy;
+        double total = 0;
+        int count = 100000;
+        for (int i = 0 ; i < count ; ++i)
+        {
+            long now = System.nanoTime();
+            long waitUntil = strategy.computeWaitUntilForContention(1, null, null, null, null);
+            long waitLength = Math.max(waitUntil - now, 0);
+            total += waitLength;
+        }
+        Assert.assertTrue(Math.abs(TimeUnit.MILLISECONDS.toNanos(50) - (total / count)) < TimeUnit.MILLISECONDS.toNanos(1L));
+    }
+
+    @Test
+    public void testBackoffTimeElapsed()
+    {
+        ContentionStrategy strategy = parseStrategy("min=0ms,max=10ms,random=uniform").strategy;
+        double total = 0;
+        int count = 1000;
+        for (int i = 0 ; i < count ; ++i)
+        {
+            long start = System.nanoTime();
+            strategy.doWaitForContention(Long.MAX_VALUE, 1, null, null, null, null);
+            long end = System.nanoTime();
+            total += end - start;
+        }
+        // make sure we have slept at least 4ms on average, given a mean wait time of 5ms
+        double avg = total / count;
+        double nanos = avg - TimeUnit.MILLISECONDS.toNanos(4);
+        Assert.assertTrue(nanos > 0);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/PaxosProposeTest.java b/test/unit/org/apache/cassandra/service/paxos/PaxosProposeTest.java
new file mode 100644
index 0000000..7872490
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/PaxosProposeTest.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.service.paxos;
+
+import java.util.Arrays;
+import java.util.concurrent.atomic.AtomicLongFieldUpdater;
+
+import org.junit.Test;
+
+import static org.apache.cassandra.service.paxos.PaxosPropose.*;
+
+public class PaxosProposeTest
+{
+    static class V
+    {
+        static final AtomicLongFieldUpdater<V> updater = AtomicLongFieldUpdater.newUpdater(V.class, "v");
+        volatile long v;
+        public boolean valid()
+        {
+            return v == 0;
+        }
+    }
+    @Test
+    public void testShouldSignal()
+    {
+        int[] signalledAtK = new int[12];
+        V[] v = new V[] { new V(), new V(), new V(), new V(), new V(), new V(), new V(), new V(), new V(), new V(), new V(), new V() };
+        boolean[] signalled = new boolean[12];
+        for (int total = 2 ; total < 16 ; ++total)
+        {
+            for (int required = (total/2) + 1 ; required < total ; ++required)
+            {
+                for (int i = 0 ; i < total ; ++i)
+                {
+                    for (int j = 0 ; j < total - i ; ++j)
+                    {
+                        Arrays.fill(signalled, false);
+                        Arrays.fill(signalledAtK, Integer.MAX_VALUE);
+                        for (int x = 0 ; x < v.length ; ++x)
+                            v[x].v = 0;
+
+                        for (int k = 0 ; k <= total - (i + j) ; ++k)
+                        {
+                            signalled[0] = v[0].valid() && shouldSignal(responses(i, j, k), required, total, true, V.updater, v[0]);
+                            signalled[1] = v[1].valid() && shouldSignal(responses(j, i, k), required, total, true, V.updater, v[1]);
+                            signalled[2] = v[2].valid() && shouldSignal(responses(j, k, i), required, total, true, V.updater, v[2]);
+                            signalled[3] = v[3].valid() && shouldSignal(responses(k, i, j), required, total, true, V.updater, v[3]);
+                            signalled[4] = v[4].valid() && shouldSignal(responses(i, k, j), required, total, true, V.updater, v[4]);
+                            signalled[5] = v[5].valid() && shouldSignal(responses(k, j, i), required, total, true, V.updater, v[5]);
+                            signalled[6] = v[6].valid() && shouldSignal(responses(i, j, k), required, total, false, V.updater, v[6]);
+                            signalled[7] = v[7].valid() && shouldSignal(responses(j, i, k), required, total, false, V.updater, v[7]);
+                            signalled[8] = v[8].valid() && shouldSignal(responses(j, k, i), required, total, false, V.updater, v[8]);
+                            signalled[9] = v[9].valid() && shouldSignal(responses(k, i, j), required, total, false, V.updater, v[9]);
+                            signalled[10] = v[10].valid() && shouldSignal(responses(i, k, j), required, total, false, V.updater, v[10]);
+                            signalled[11] = v[11].valid() && shouldSignal(responses(k, j, i), required, total, false, V.updater, v[11]);
+                            for (int x = 0 ; x < 12 ; ++x)
+                            {
+                                if (signalled[x] && signalledAtK[x] < k)
+                                    throw new IllegalStateException(String.format("(%d,%d,%d): (%d,%d,%d,%d)", total, required, x, i, j, k, signalledAtK[x]));
+                                else if (signalled[x])
+                                    signalledAtK[x] = k;
+                            }
+                        }
+
+                        for (int x = 0 ; x < 12 ; ++x)
+                        {
+                            if (signalledAtK[x] == Integer.MAX_VALUE)
+                                throw new IllegalStateException(String.format("(%d,%d,%d): (%d, %d)", total, required, x, i, j));
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    private static long responses(int i, int j, int k)
+    {
+        return i * ACCEPT_INCREMENT + j * REFUSAL_INCREMENT + k * FAILURE_INCREMENT;
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/PaxosRepairHistoryTest.java b/test/unit/org/apache/cassandra/service/paxos/PaxosRepairHistoryTest.java
new file mode 100644
index 0000000..387ec65
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/PaxosRepairHistoryTest.java
@@ -0,0 +1,531 @@
+/*
+ * 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.service.paxos;
+
+import java.util.*;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+import java.util.stream.LongStream;
+import java.util.stream.Stream;
+
+import com.google.common.collect.Lists;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.dht.Murmur3Partitioner.LongToken;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.Pair;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+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;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.atUnixMicros;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.nextBallot;
+import static org.apache.cassandra.service.paxos.Commit.latest;
+import static org.apache.cassandra.service.paxos.PaxosRepairHistory.trim;
+
+public class PaxosRepairHistoryTest
+{
+    static final Logger logger = LoggerFactory.getLogger(PaxosRepairHistoryTest.class);
+    private static final AtomicInteger tableNum = new AtomicInteger();
+    static
+    {
+        System.setProperty("cassandra.partitioner", Murmur3Partitioner.class.getName());
+        DatabaseDescriptor.daemonInitialization();
+        assert DatabaseDescriptor.getPartitioner() instanceof Murmur3Partitioner;
+    }
+
+    private static final Token MIN_TOKEN = Murmur3Partitioner.instance.getMinimumToken();
+
+    private static Token t(long t)
+    {
+        return new LongToken(t);
+    }
+
+    private static Ballot b(int b)
+    {
+        return Ballot.atUnixMicrosWithLsb(b, 0, NONE);
+    }
+
+    private static Range<Token> r(Token l, Token r)
+    {
+        return new Range<>(l, r);
+    }
+
+    private static Range<Token> r(long l, long r)
+    {
+        return r(t(l), t(r));
+    }
+
+    private static Pair<Token, Ballot> pt(long t, int b)
+    {
+        return Pair.create(t(t), b(b));
+    }
+
+    private static Pair<Token, Ballot> pt(long t, Ballot b)
+    {
+        return Pair.create(t(t), b);
+    }
+
+    private static Pair<Token, Ballot> pt(Token t, int b)
+    {
+        return Pair.create(t, b(b));
+    }
+
+    private static PaxosRepairHistory h(Pair<Token, Ballot>... points)
+    {
+        int length = points.length + (points[points.length - 1].left == null ? 0 : 1);
+        Token[] tokens = new Token[length - 1];
+        Ballot[] ballots = new Ballot[length];
+        for (int i = 0 ; i < length - 1 ; ++i)
+        {
+            tokens[i] = points[i].left;
+            ballots[i] = points[i].right;
+        }
+        ballots[length - 1] = length == points.length ? points[length - 1].right : none();
+        return new PaxosRepairHistory(tokens, ballots);
+    }
+
+    static
+    {
+        assert t(100).equals(t(100));
+        assert b(111).equals(b(111));
+    }
+
+    private static class Builder
+    {
+        PaxosRepairHistory history = PaxosRepairHistory.EMPTY;
+
+        Builder add(Ballot ballot, Range<Token>... ranges)
+        {
+            history = PaxosRepairHistory.add(history, Lists.newArrayList(ranges), ballot);
+            return this;
+        }
+
+        Builder clear()
+        {
+            history = PaxosRepairHistory.EMPTY;
+            return this;
+        }
+    }
+
+    static Builder builder()
+    {
+        return new Builder();
+    }
+
+    private static void checkSystemTableIO(PaxosRepairHistory history)
+    {
+        Assert.assertEquals(history, PaxosRepairHistory.fromTupleBufferList(history.toTupleBufferList()));
+        String tableName = "test" + tableNum.getAndIncrement();
+        SystemKeyspace.savePaxosRepairHistory("test", tableName, history, false);
+        Assert.assertEquals(history, SystemKeyspace.loadPaxosRepairHistory("test", tableName));
+    }
+
+    @BeforeClass
+    public static void init() throws Exception
+    {
+        SchemaLoader.prepareServer();
+    }
+
+    @Test
+    public void testAdd()
+    {
+        Builder builder = builder();
+        Assert.assertEquals(h(pt(10, none()), pt(20, 5), pt(30, none()), pt(40, 5)),
+                            builder.add(b(5), r(10, 20), r(30, 40)).history);
+
+        Assert.assertEquals(none(), builder.history.ballotForToken(t(0)));
+        Assert.assertEquals(none(), builder.history.ballotForToken(t(10)));
+        Assert.assertEquals(b(5), builder.history.ballotForToken(t(11)));
+        Assert.assertEquals(b(5), builder.history.ballotForToken(t(20)));
+        Assert.assertEquals(none(), builder.history.ballotForToken(t(21)));
+
+        builder.clear();
+        Assert.assertEquals(h(pt(10, none()), pt(20, 5), pt(30, none()), pt(40, 6)),
+                            builder.add(b(5), r(10, 20)).add(b(6), r(30, 40)).history);
+        builder.clear();
+        Assert.assertEquals(h(pt(10, none()), pt(20, 5), pt(30, 6), pt(40, 5)),
+                            builder.add(b(5), r(10, 40)).add(b(6), r(20, 30)).history);
+
+        builder.clear();
+        Assert.assertEquals(h(pt(10, none()), pt(20, 6), pt(30, 5)),
+                            builder.add(b(6), r(10, 20)).add(b(5), r(15, 30)).history);
+
+        builder.clear();
+        Assert.assertEquals(h(pt(10, none()), pt(20, 5), pt(30, 6)),
+                            builder.add(b(5), r(10, 25)).add(b(6), r(20, 30)).history);
+    }
+
+    @Test
+    public void testTrim()
+    {
+        Assert.assertEquals(h(pt(10, none()), pt(20, 5), pt(30, none()), pt(40, 5), pt(50, none()), pt(60, 5)),
+                            trim(h(pt(0, none()), pt(70, 5)), Lists.newArrayList(r(10, 20), r(30, 40), r(50, 60))));
+
+        Assert.assertEquals(h(pt(10, none()), pt(20, 5)),
+                            trim(h(pt(0, none()), pt(20, 5)), Lists.newArrayList(r(10, 30))));
+
+        Assert.assertEquals(h(pt(10, none()), pt(20, 5)),
+                            trim(h(pt(10, none()), pt(30, 5)), Lists.newArrayList(r(0, 20))));
+    }
+
+    @Test
+    public void testFullRange()
+    {
+        // test full range is collapsed
+        Builder builder = builder();
+        Assert.assertEquals(h(pt(null, 5)),
+                            builder.add(b(5), r(MIN_TOKEN, MIN_TOKEN)).history);
+
+        Assert.assertEquals(b(5), builder.history.ballotForToken(MIN_TOKEN));
+        Assert.assertEquals(b(5), builder.history.ballotForToken(t(0)));
+    }
+
+    @Test
+    public void testWrapAroundRange()
+    {
+        Builder builder = builder();
+        Assert.assertEquals(h(pt(-100, 5), pt(100, none()), pt(null, 5)),
+                            builder.add(b(5), r(100, -100)).history);
+
+        Assert.assertEquals(b(5), builder.history.ballotForToken(MIN_TOKEN));
+        Assert.assertEquals(b(5), builder.history.ballotForToken(t(-101)));
+        Assert.assertEquals(b(5), builder.history.ballotForToken(t(-100)));
+        Assert.assertEquals(none(), builder.history.ballotForToken(t(-99)));
+        Assert.assertEquals(none(), builder.history.ballotForToken(t(0)));
+        Assert.assertEquals(none(), builder.history.ballotForToken(t(100)));
+        Assert.assertEquals(b(5), builder.history.ballotForToken(t(101)));
+    }
+
+    private static Token[] tks(long ... tks)
+    {
+        return LongStream.of(tks).mapToObj(LongToken::new).toArray(Token[]::new);
+    }
+
+    private static Ballot[] uuids(String ... uuids)
+    {
+        return Stream.of(uuids).map(Ballot::fromString).toArray(Ballot[]::new);
+    }
+
+    @Test
+    public void testRegression()
+    {
+        Assert.assertEquals(none(), trim(
+                new PaxosRepairHistory(
+                        tks(-9223372036854775807L, -3952873730080618203L, -1317624576693539401L, 1317624576693539401L, 6588122883467697005L),
+                        uuids("1382954c-1dd2-11b2-8fb2-f45d70d6d6d8", "138260a4-1dd2-11b2-abb2-c13c36b179e1", "1382951a-1dd2-11b2-1dd8-b7e242b38dbe", "138294fc-1dd2-11b2-83c4-43fb3a552386", "13829510-1dd2-11b2-f353-381f2ed963fa", "1382954c-1dd2-11b2-8fb2-f45d70d6d6d8")),
+                Collections.singleton(new Range<>(new LongToken(-1317624576693539401L), new LongToken(1317624576693539401L))))
+            .ballotForToken(new LongToken(-4208619967696141037L)));
+    }
+
+    @Test
+    public void testInequality()
+    {
+        Collection<Range<Token>> ranges = Collections.singleton(new Range<>(Murmur3Partitioner.MINIMUM, Murmur3Partitioner.MINIMUM));
+        PaxosRepairHistory a = PaxosRepairHistory.add(PaxosRepairHistory.EMPTY, ranges, none());
+        PaxosRepairHistory b = PaxosRepairHistory.add(PaxosRepairHistory.EMPTY, ranges, nextBallot(NONE));
+        Assert.assertNotEquals(a, b);
+    }
+
+    @Test
+    public void testRandomTrims()
+    {
+        ExecutorService executor = Executors.newFixedThreadPool(FBUtilities.getAvailableProcessors());
+        List<Future<?>> results = new ArrayList<>();
+        int count = 1000;
+        for (int numberOfAdditions : new int[] { 1, 10, 100 })
+        {
+            for (float maxCoveragePerRange : new float[] { 0.01f, 0.1f, 0.5f })
+            {
+                for (float chanceOfMinToken : new float[] { 0.01f, 0.1f })
+                {
+                    results.addAll(testRandomTrims(executor, count, numberOfAdditions, 3, maxCoveragePerRange, chanceOfMinToken));
+                }
+            }
+        }
+        FBUtilities.waitOnFutures(results);
+        executor.shutdown();
+    }
+
+    private List<Future<?>> testRandomTrims(ExecutorService executor, int tests, int numberOfAdditions, int maxNumberOfRangesPerAddition, float maxCoveragePerRange, float chanceOfMinToken)
+    {
+        return ThreadLocalRandom.current()
+                .longs(tests)
+                .mapToObj(seed -> executor.submit(() -> testRandomTrims(seed, numberOfAdditions, maxNumberOfRangesPerAddition, maxCoveragePerRange, chanceOfMinToken)))
+                .collect(Collectors.toList());
+    }
+
+    private void testRandomTrims(long seed, int numberOfAdditions, int maxNumberOfRangesPerAddition, float maxCoveragePerRange, float chanceOfMinToken)
+    {
+        Random random = new Random(seed);
+        logger.info("Seed {} ({}, {}, {}, {})", seed, numberOfAdditions, maxNumberOfRangesPerAddition, maxCoveragePerRange, chanceOfMinToken);
+        PaxosRepairHistory history = RandomPaxosRepairHistory.build(random, numberOfAdditions, maxNumberOfRangesPerAddition, maxCoveragePerRange, chanceOfMinToken);
+        // generate a random list of ranges that cover the whole ring
+        long[] tokens = random.longs(16).distinct().toArray();
+        if (random.nextBoolean())
+            tokens[0] = Long.MIN_VALUE;
+        Arrays.sort(tokens);
+        List<List<Range<Token>>> ranges = IntStream.range(0, tokens.length <= 3 ? 1 : 1 + random.nextInt((tokens.length - 1) / 2))
+                .mapToObj(ignore -> new ArrayList<Range<Token>>())
+                .collect(Collectors.toList());
+
+        for (int i = 1 ; i < tokens.length ; ++i)
+            ranges.get(random.nextInt(ranges.size())).add(new Range<>(new LongToken(tokens[i - 1]), new LongToken(tokens[i])));
+        ranges.get(random.nextInt(ranges.size())).add(new Range<>(new LongToken(tokens[tokens.length - 1]), new LongToken(tokens[0])));
+
+        List<PaxosRepairHistory> splits = new ArrayList<>();
+        for (List<Range<Token>> rs : ranges)
+        {
+            PaxosRepairHistory trimmed = PaxosRepairHistory.trim(history, rs);
+            splits.add(trimmed);
+            if (rs.isEmpty())
+                continue;
+
+            Range<Token> prev = rs.get(rs.size() - 1);
+            for (Range<Token> range : rs)
+            {
+                if (prev.right.equals(range.left))
+                {
+                    Assert.assertEquals(history.ballotForToken(((LongToken)range.left).decreaseSlightly()), trimmed.ballotForToken(((LongToken)range.left).decreaseSlightly()));
+                    Assert.assertEquals(history.ballotForToken(range.left), trimmed.ballotForToken(range.left));
+                }
+                else
+                {
+                    if (!range.left.isMinimum())
+                        Assert.assertEquals(none(), trimmed.ballotForToken(range.left));
+                    if (!prev.right.isMinimum())
+                        Assert.assertEquals(none(), trimmed.ballotForToken(prev.right.increaseSlightly()));
+                }
+                Assert.assertEquals(history.ballotForToken(range.left.increaseSlightly()), trimmed.ballotForToken(range.left.increaseSlightly()));
+                if (!range.left.increaseSlightly().equals(range.right))
+                    Assert.assertEquals(history.ballotForToken(((LongToken)range.right).decreaseSlightly()), trimmed.ballotForToken(((LongToken)range.right).decreaseSlightly()));
+
+                if (range.right.isMinimum())
+                    Assert.assertEquals(history.ballotForToken(new LongToken(Long.MAX_VALUE)), trimmed.ballotForToken(new LongToken(Long.MAX_VALUE)));
+                else
+                    Assert.assertEquals(history.ballotForToken(range.right), trimmed.ballotForToken(range.right));
+                prev = range;
+            }
+        }
+
+        PaxosRepairHistory merged = PaxosRepairHistory.EMPTY;
+        for (PaxosRepairHistory split : splits)
+            merged = PaxosRepairHistory.merge(merged, split);
+
+        Assert.assertEquals(history, merged);
+        checkSystemTableIO(history);
+    }
+
+    @Test
+    public void testRandomAdds()
+    {
+        ExecutorService executor = Executors.newFixedThreadPool(FBUtilities.getAvailableProcessors());
+        List<Future<?>> results = new ArrayList<>();
+        int count = 1000;
+        for (int numberOfAdditions : new int[] { 1, 10, 100 })
+        {
+            for (float maxCoveragePerRange : new float[] { 0.01f, 0.1f, 0.5f })
+            {
+                for (float chanceOfMinToken : new float[] { 0.01f, 0.1f })
+                {
+                    results.addAll(testRandomAdds(executor, count, 3, numberOfAdditions, 3, maxCoveragePerRange, chanceOfMinToken));
+                }
+            }
+        }
+        FBUtilities.waitOnFutures(results);
+        executor.shutdown();
+    }
+
+    private List<Future<?>> testRandomAdds(ExecutorService executor, int tests, int numberOfMerges, int numberOfAdditions, int maxNumberOfRangesPerAddition, float maxCoveragePerRange, float chanceOfMinToken)
+    {
+        return ThreadLocalRandom.current()
+                .longs(tests)
+                .mapToObj(seed -> executor.submit(() -> testRandomAdds(seed, numberOfMerges, numberOfAdditions, maxNumberOfRangesPerAddition, maxCoveragePerRange, chanceOfMinToken)))
+                .collect(Collectors.toList());
+    }
+
+    private void testRandomAdds(long seed, int numberOfMerges, int numberOfAdditions, int maxNumberOfRangesPerAddition, float maxCoveragePerRange, float chanceOfMinToken)
+    {
+        Random random = new Random(seed);
+        String id = String.format("%d, %d, %d, %d, %f, %f", seed, numberOfMerges, numberOfAdditions, maxNumberOfRangesPerAddition, maxCoveragePerRange, chanceOfMinToken);
+        logger.info(id);
+        List<RandomWithCanonical> merge = new ArrayList<>();
+        while (numberOfMerges-- > 0)
+        {
+            RandomWithCanonical build = new RandomWithCanonical();
+            build.addRandom(random, numberOfAdditions, maxNumberOfRangesPerAddition, maxCoveragePerRange, chanceOfMinToken);
+            merge.add(build);
+        }
+
+        RandomWithCanonical check = new RandomWithCanonical();
+        for (RandomWithCanonical add : merge)
+            check = check.merge(add);
+        check.serdeser();
+
+        for (Token token : check.canonical.keySet())
+        {
+            LongToken tk = (LongToken) token;
+            Assert.assertEquals(id, check.ballotForToken(tk.decreaseSlightly()), check.test.ballotForToken(tk.decreaseSlightly()));
+            Assert.assertEquals(id, check.ballotForToken(tk), check.test.ballotForToken(token));
+            Assert.assertEquals(id, check.ballotForToken(tk.increaseSlightly()), check.test.ballotForToken(token.increaseSlightly()));
+        }
+
+        // check some random
+        {
+            int count = 1000;
+            while (count-- > 0)
+            {
+                LongToken token = new LongToken(random.nextLong());
+                Assert.assertEquals(id, check.ballotForToken(token), check.test.ballotForToken(token));
+            }
+        }
+
+    }
+
+    static class RandomPaxosRepairHistory
+    {
+        PaxosRepairHistory test = PaxosRepairHistory.EMPTY;
+
+        void add(Collection<Range<Token>> ranges, Ballot ballot)
+        {
+            test = PaxosRepairHistory.add(test, ranges, ballot);
+        }
+
+        void merge(RandomPaxosRepairHistory other)
+        {
+            test = PaxosRepairHistory.merge(test, other.test);
+        }
+
+        void addOneRandom(Random random, int maxRangeCount, float maxCoverage, float minChance)
+        {
+            int count = maxRangeCount == 1 ? 1 : 1 + random.nextInt(maxRangeCount - 1);
+            Ballot ballot = atUnixMicros(random.nextInt(Integer.MAX_VALUE), NONE);
+            List<Range<Token>> ranges = new ArrayList<>();
+            while (count-- > 0)
+            {
+                long length = (long) (2 * random.nextDouble() * maxCoverage * Long.MAX_VALUE);
+                if (length == 0) length = 1;
+                Range<Token> range;
+                if (random.nextFloat() <= minChance)
+                {
+                    if (random.nextBoolean()) range = new Range<>(Murmur3Partitioner.MINIMUM, new LongToken(Long.MIN_VALUE + length));
+                    else range = new Range<>(new LongToken(Long.MAX_VALUE - length), Murmur3Partitioner.MINIMUM);
+                }
+                else
+                {
+                    long start = random.nextLong();
+                    range = new Range<>(new LongToken(start), new LongToken(start + length));
+                }
+                ranges.add(range);
+            }
+            ranges.sort(Range::compareTo);
+            add(deoverlap(ranges), ballot);
+        }
+
+        void addRandom(Random random, int count, int maxNumberOfRangesPerAddition, float maxCoveragePerAddition, float minTokenChance)
+        {
+            while (count-- > 0)
+                addOneRandom(random, maxNumberOfRangesPerAddition, maxCoveragePerAddition, minTokenChance);
+        }
+
+        static PaxosRepairHistory build(Random random, int count, int maxNumberOfRangesPerAddition, float maxCoveragePerRange, float chanceOfMinToken)
+        {
+            RandomPaxosRepairHistory result = new RandomPaxosRepairHistory();
+            result.addRandom(random, count, maxNumberOfRangesPerAddition, maxCoveragePerRange, chanceOfMinToken);
+            return result.test;
+        }
+    }
+
+    static class RandomWithCanonical extends RandomPaxosRepairHistory
+    {
+        NavigableMap<Token, Ballot> canonical = new TreeMap<>();
+        {
+            canonical.put(Murmur3Partitioner.MINIMUM, none());
+        }
+
+        Ballot ballotForToken(LongToken token)
+        {
+            return canonical
+                    .floorEntry(token.token == Long.MIN_VALUE ? token : token.decreaseSlightly())
+                    .getValue();
+        }
+
+        RandomWithCanonical merge(RandomWithCanonical other)
+        {
+            RandomWithCanonical result = new RandomWithCanonical();
+            result.test = PaxosRepairHistory.merge(test, other.test);
+            result.canonical = new TreeMap<>();
+            result.canonical.putAll(canonical);
+            for (Map.Entry<Token, Ballot> entry : other.canonical.entrySet())
+            {
+                Token left = entry.getKey();
+                Token right = other.canonical.higherKey(left);
+                if (right == null) right = Murmur3Partitioner.MINIMUM;
+                result.addCanonical(new Range<>(left, right), entry.getValue());
+            }
+            return result;
+        }
+
+        void serdeser()
+        {
+            PaxosRepairHistory tmp = PaxosRepairHistory.fromTupleBufferList(test.toTupleBufferList());
+            Assert.assertEquals(test, tmp);
+            test = tmp;
+        }
+
+        void add(Collection<Range<Token>> addRanges, Ballot ballot)
+        {
+            super.add(addRanges, ballot);
+            for (Range<Token> range : addRanges)
+                addCanonical(range, ballot);
+        }
+
+        void addCanonical(Range<Token> range, Ballot ballot)
+        {
+            canonical.put(range.left, canonical.floorEntry(range.left).getValue());
+            if (!range.right.isMinimum())
+                canonical.put(range.right, canonical.floorEntry(range.right).getValue());
+
+            for (Range<Token> r : range.unwrap())
+            {
+                (r.right.isMinimum()
+                        ? canonical.subMap(r.left, true, new LongToken(Long.MAX_VALUE), true)
+                        : canonical.subMap(r.left, true, r.right, false)
+                ).entrySet().forEach(e -> e.setValue(latest(e.getValue(), ballot)));
+            }
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/PaxosRepairTest.java b/test/unit/org/apache/cassandra/service/paxos/PaxosRepairTest.java
new file mode 100644
index 0000000..e226cf3
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/PaxosRepairTest.java
@@ -0,0 +1,172 @@
+/*
+ * 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.service.paxos;
+
+import java.net.UnknownHostException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.junit.Test;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+
+import org.apache.cassandra.utils.CassandraVersion;
+
+import static org.apache.cassandra.service.paxos.PaxosRepair.validateVersionCompatibility;
+import static org.junit.Assert.*;
+
+import static org.apache.cassandra.service.paxos.PaxosRepairTest.Requirements.*;
+
+public class PaxosRepairTest
+{
+    private static final String DC0 = "DC0";
+    private static final String DC1 = "DC1";
+    private static final String DC2 = "DC2";
+
+    private static InetAddressAndPort intToInet(int i)
+    {
+        try
+        {
+            return InetAddressAndPort.getByAddress(new byte[]{127, 0, 0, (byte)i});
+        }
+        catch (UnknownHostException e)
+        {
+            throw new AssertionError(e);
+        }
+    }
+
+    // should make reading the tests slightly easier
+    enum Requirements
+    {
+        NORMAL(false, false),
+        STRICT_QUORUM(true, false),
+        NO_DC_CHECKS(false, true),
+        STRICT_QUORUM_AND_NO_DC_CHECKS(true, true);
+
+        final boolean strict_quorum;
+        final boolean no_dc_check;
+
+        Requirements(boolean strict_quorum, boolean no_dc_check)
+        {
+            this.strict_quorum = strict_quorum;
+            this.no_dc_check = no_dc_check;
+        }
+    }
+
+    private static class Topology
+    {
+        Set<InetAddressAndPort> dead = new HashSet<>();
+        Map<InetAddressAndPort, String> endpointToDc = new HashMap<>();
+
+
+        Topology alive(String dc, int... epNums)
+        {
+            for (int e : epNums)
+            {
+                InetAddressAndPort ep = intToInet(e);
+                endpointToDc.put(ep, dc);
+                dead.remove(ep);
+            }
+            return this;
+        }
+
+        Topology dead(int... eps)
+        {
+            for (int i : eps)
+            {
+                InetAddressAndPort ep = intToInet(i);
+                assert endpointToDc.containsKey(ep);
+                dead.add(ep);
+            }
+            return this;
+        }
+
+        String getDc(InetAddressAndPort ep)
+        {
+            assert endpointToDc.containsKey(ep);
+            return endpointToDc.get(ep);
+        }
+
+        Set<InetAddressAndPort> all()
+        {
+            return new HashSet<>(endpointToDc.keySet());
+        }
+
+        Set<InetAddressAndPort> live()
+        {
+            Set<InetAddressAndPort> eps = all();
+            eps.removeAll(dead);
+            return eps;
+        }
+
+        boolean hasSufficientLiveNodes(Requirements requirements)
+        {
+            return PaxosRepair.hasSufficientLiveNodesForTopologyChange(all(), live(), this::getDc, requirements.no_dc_check, requirements.strict_quorum);
+        }
+    }
+
+    static Topology topology(String dc, int... epNums)
+    {
+        Topology t = new Topology();
+        t.alive(dc, epNums);
+        return t;
+    }
+
+    @Test
+    public void singleDcHasSufficientLiveNodesTest()
+    {
+        assertTrue(topology(DC0, 1).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2).dead(1).hasSufficientLiveNodes(NORMAL));
+        assertFalse(topology(DC0, 1, 2).dead(1, 2).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2, 3).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2, 3).dead(1).hasSufficientLiveNodes(NORMAL));
+        assertFalse(topology(DC0, 1, 2, 3).dead(1, 2).hasSufficientLiveNodes(NORMAL));
+    }
+
+    @Test
+    public void multiDcHasSufficientLiveNodesTest()
+    {
+        assertTrue(topology(DC0, 1, 2, 3).alive(DC1, 4, 5, 6).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2, 3).alive(DC1, 4, 5, 6).dead(1, 4).hasSufficientLiveNodes(NORMAL));
+        assertFalse(topology(DC0, 1, 2, 3).alive(DC1, 4, 5, 6).dead(4, 5).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2, 3).alive(DC1, 4, 5, 6).dead(4, 5).hasSufficientLiveNodes(NO_DC_CHECKS));
+        assertFalse(topology(DC0, 1, 2, 3).alive(DC1, 4, 5, 6).dead(1, 4, 5).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2).alive(DC1, 3, 4).alive(DC2, 5, 6).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2).alive(DC1, 3, 4).alive(DC2, 5, 6).dead(1).hasSufficientLiveNodes(NORMAL));
+        assertFalse(topology(DC0, 1, 2).alive(DC1, 3, 4).alive(DC2, 5, 6).dead(1).hasSufficientLiveNodes(STRICT_QUORUM));
+        assertFalse(topology(DC0, 1, 2).alive(DC1, 3, 4).alive(DC2, 5, 6).dead(5, 6).hasSufficientLiveNodes(NORMAL));
+        assertTrue(topology(DC0, 1, 2).alive(DC1, 3, 4).alive(DC2, 5, 6).dead(5, 6).hasSufficientLiveNodes(STRICT_QUORUM_AND_NO_DC_CHECKS));
+    }
+
+    private static CassandraVersion version(String v)
+    {
+        return new CassandraVersion(v);
+    }
+
+    @Test
+    public void versionValidationTest()
+    {
+        assertTrue(validateVersionCompatibility(version("4.1.0")));
+        assertTrue(validateVersionCompatibility(version("4.1.0-SNAPSHOT")));
+        assertFalse(validateVersionCompatibility(null));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/PaxosStateTest.java b/test/unit/org/apache/cassandra/service/paxos/PaxosStateTest.java
new file mode 100644
index 0000000..23488fb
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/PaxosStateTest.java
@@ -0,0 +1,322 @@
+/*
+ * 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.service.paxos;
+
+import java.nio.ByteBuffer;
+import java.util.function.Function;
+
+import com.google.common.collect.Iterables;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.schema.TableMetadata;
+
+import org.junit.AfterClass;
+import org.junit.Assert;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.gms.Gossiper;
+import org.apache.cassandra.service.paxos.PaxosState.Snapshot;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.apache.cassandra.config.Config.PaxosStatePurging.gc_grace;
+import static org.apache.cassandra.config.Config.PaxosStatePurging.legacy;
+import static org.apache.cassandra.config.Config.PaxosStatePurging.repaired;
+import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.atUnixMicros;
+import static org.apache.cassandra.service.paxos.Commit.*;
+import static org.junit.Assert.*;
+
+public class PaxosStateTest
+{
+    static TableMetadata metadata;
+    @BeforeClass
+    public static void setUpClass() throws Throwable
+    {
+        SchemaLoader.loadSchema();
+        SchemaLoader.schemaDefinition("PaxosStateTest");
+        metadata = Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1").metadata.get();
+        metadata.withSwapped(metadata.params.unbuild().gcGraceSeconds(3600).build());
+    }
+
+    @AfterClass
+    public static void stopGossiper()
+    {
+        Gossiper.instance.stop();
+    }
+
+    @Test
+    public void testCommittingAfterTruncation() throws Exception
+    {
+        ColumnFamilyStore cfs = Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1");
+        String key = "key" + System.nanoTime();
+        ByteBuffer value = ByteBufferUtil.bytes(0);
+        RowUpdateBuilder builder = new RowUpdateBuilder(metadata, FBUtilities.timestampMicros(), key);
+        builder.clustering("a").add("val", value);
+        PartitionUpdate update = Iterables.getOnlyElement(builder.build().getPartitionUpdates());
+
+        // CFS should be empty initially
+        assertNoDataPresent(cfs, Util.dk(key));
+
+        // Commit the proposal & verify the data is present
+        Commit beforeTruncate = newProposal(0, update);
+        PaxosState.commitDirect(beforeTruncate);
+        assertDataPresent(cfs, Util.dk(key), "val", value);
+
+        // Truncate then attempt to commit again, mutation should
+        // be ignored as the proposal predates the truncation
+        cfs.truncateBlocking();
+        PaxosState.commitDirect(beforeTruncate);
+        assertNoDataPresent(cfs, Util.dk(key));
+
+        // Now try again with a ballot created after the truncation
+        long timestamp = SystemKeyspace.getTruncatedAt(update.metadata().id) + 1;
+        Commit afterTruncate = newProposal(timestamp, update);
+        PaxosState.commitDirect(afterTruncate);
+        assertDataPresent(cfs, Util.dk(key), "val", value);
+    }
+
+    @Test
+    public void testReadExpired()
+    {
+        DatabaseDescriptor.setPaxosStatePurging(gc_grace);
+
+        String key = "key" + System.nanoTime();
+        Accepted accepted = newProposal(1, key).accepted();
+        PaxosState.legacyPropose(accepted);
+
+        DatabaseDescriptor.setPaxosStatePurging(repaired);
+        // not expired if read in the past
+        assertPaxosState(key, accepted, state -> state.current(accepted.ballot).accepted);
+        // not expired if read with paxos state purging enabled
+        assertPaxosState(key, accepted, state -> state.current(Integer.MAX_VALUE).accepted);
+        DatabaseDescriptor.setPaxosStatePurging(gc_grace);
+        // not expired if read in the past
+        assertPaxosState(key, accepted, state -> state.current(accepted.ballot).accepted);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, null, state -> state.current(Integer.MAX_VALUE).accepted);
+        // clear cache to read from disk
+        PaxosState.RECENT.clear();
+
+        Committed committed = accepted.committed();
+        Committed empty = emptyProposal(key).accepted().committed();
+        PaxosState.commitDirect(committed);
+        DatabaseDescriptor.setPaxosStatePurging(repaired);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(committed.ballot).committed);
+        // not expired if read with paxos state purging enabled
+        assertPaxosState(key, committed, state -> state.current(Integer.MAX_VALUE).committed);
+        DatabaseDescriptor.setPaxosStatePurging(gc_grace);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(committed.ballot).committed);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, empty, state -> state.current(Integer.MAX_VALUE).committed);
+        DatabaseDescriptor.setPaxosStatePurging(repaired);
+    }
+
+    @Test
+    public void testReadTTLd()
+    {
+        String key = "key" + System.nanoTime();
+        String key2 = key + 'A';
+        Accepted accepted = new AcceptedWithTTL(newProposal(1, key), 1);
+        PaxosState.legacyPropose(accepted);
+        PaxosState.legacyPropose(new AcceptedWithTTL(newProposal(1, key2), 10000));
+
+        DatabaseDescriptor.setPaxosStatePurging(repaired);
+        // not expired if read in the past
+        assertPaxosState(key, accepted, state -> state.current(0).accepted);
+        // TTL, so still expired if read with paxos state purging enabled
+        assertPaxosState(key, null, state -> state.current(Integer.MAX_VALUE).accepted);
+        DatabaseDescriptor.setPaxosStatePurging(gc_grace);
+        // not expired if read in the past
+        assertPaxosState(key, accepted, state -> state.current(0).accepted);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, null, state -> state.current(Integer.MAX_VALUE).accepted);
+        DatabaseDescriptor.setPaxosStatePurging(legacy);
+        // not expired if read in the past
+        assertPaxosState(key, accepted, state -> state.current(0).accepted);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, null, state -> state.current(Integer.MAX_VALUE).accepted);
+        // clear cache to read from disk
+        PaxosState.RECENT.clear();
+
+        Committed committed = new CommittedWithTTL(accepted, 1);
+        Committed empty = emptyProposal(key).accepted().committed();
+        PaxosState.commitDirect(committed);
+
+        DatabaseDescriptor.setPaxosStatePurging(repaired);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(0).committed);
+        // not expired if read with paxos state purging enabled
+        assertPaxosState(key, empty, state -> state.current(Integer.MAX_VALUE).committed);
+        DatabaseDescriptor.setPaxosStatePurging(gc_grace);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(0).committed);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, empty, state -> state.current(Integer.MAX_VALUE).committed);
+        DatabaseDescriptor.setPaxosStatePurging(legacy);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(0).committed);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, empty, state -> state.current(Integer.MAX_VALUE).committed);
+    }
+
+    @Test
+    public void testWriteTTLd()
+    {
+        String key = "key" + System.nanoTime();
+        Accepted accepted = newProposal(1, key).accepted();
+
+        DatabaseDescriptor.setPaxosStatePurging(legacy); // write with TTLs
+        PaxosState.legacyPropose(accepted);
+        accepted = new AcceptedWithTTL(accepted, -1); // for equality test
+
+        DatabaseDescriptor.setPaxosStatePurging(repaired);
+        // not expired if read in the past (or now)
+        assertPaxosState(key, accepted, state -> state.current(0).accepted);
+        // TTL, so still expired if read with paxos state purging enabled
+        assertPaxosState(key, null, state -> state.current(Integer.MAX_VALUE).accepted);
+
+        DatabaseDescriptor.setPaxosStatePurging(gc_grace);
+        // not expired if read in the past (or now)
+        assertPaxosState(key, accepted, state -> state.current(0).accepted);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, null, state -> state.current(Integer.MAX_VALUE).accepted);
+
+        DatabaseDescriptor.setPaxosStatePurging(legacy);
+        // not expired if read in the past (or now)
+        assertPaxosState(key, accepted, state -> state.current(0).accepted);
+        // TTL, so expired in the future
+        assertPaxosState(key, null, state -> state.current(Integer.MAX_VALUE).accepted);
+
+        PaxosState.RECENT.clear();
+
+        Committed committed = new Committed(accepted);
+        Committed empty = emptyProposal(key).accepted().committed();
+        DatabaseDescriptor.setPaxosStatePurging(legacy); // write with TTLs
+        committed = new CommittedWithTTL(committed, -1); // for equality test
+        PaxosState.commitDirect(committed);
+
+        DatabaseDescriptor.setPaxosStatePurging(repaired);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(0).committed);
+        // not expired if read with paxos state purging enabled
+        assertPaxosState(key, empty, state -> state.current(Integer.MAX_VALUE).committed);
+        DatabaseDescriptor.setPaxosStatePurging(gc_grace);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(0).committed);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, empty, state -> state.current(Integer.MAX_VALUE).committed);
+        DatabaseDescriptor.setPaxosStatePurging(legacy);
+        // not expired if read in the past
+        assertPaxosState(key, committed, state -> state.current(0).committed);
+        // expired if read with paxos state purging disabled
+        assertPaxosState(key, empty, state -> state.current(Integer.MAX_VALUE).committed);
+    }
+
+    private static void assertPaxosState(String key, Commit expect, Function<PaxosState, Object> test)
+    {
+        // TODO: test from cache after write
+        PaxosState.RECENT.clear();
+        // test from disk
+        try (PaxosState state = PaxosState.get(Util.dk(key), metadata))
+        {
+            Assert.assertEquals(expect, test.apply(state));
+        }
+        // test from cache
+        try (PaxosState state = PaxosState.get(Util.dk(key), metadata))
+        {
+            Assert.assertEquals(expect, test.apply(state));
+        }
+    }
+
+    private Commit newProposal(long ballotMillis, PartitionUpdate update)
+    {
+        return Commit.newProposal(atUnixMicros(ballotMillis, NONE), update);
+    }
+
+    private Proposal emptyProposal(String k)
+    {
+        return Proposal.empty(Ballot.none(), Util.dk(k), Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1").metadata.get());
+    }
+
+    private Proposal newProposal(long ballotMicros, String k)
+    {
+        return Proposal.empty(atUnixMicros(ballotMicros, NONE), Util.dk(k), Keyspace.open("PaxosStateTestKeyspace1").getColumnFamilyStore("Standard1").metadata.get());
+    }
+
+    private void assertDataPresent(ColumnFamilyStore cfs, DecoratedKey key, String name, ByteBuffer value)
+    {
+        Row row = Util.getOnlyRowUnfiltered(Util.cmd(cfs, key).build());
+        assertEquals(0, ByteBufferUtil.compareUnsigned(value,
+                row.getCell(cfs.metadata.get().getColumn(ByteBufferUtil.bytes(name))).buffer()));
+    }
+
+    private void assertNoDataPresent(ColumnFamilyStore cfs, DecoratedKey key)
+    {
+        Util.assertEmpty(Util.cmd(cfs, key).build());
+    }
+
+    private static void assertAcceptedMerge(Accepted expected, Accepted left, Accepted right)
+    {
+        Committed empty = Committed.none(expected.update.partitionKey(), expected.update.metadata());
+        Snapshot snapshotLeft = new Snapshot(null, null, left, empty);
+        Snapshot snapshotRight = new Snapshot(null, null, right, empty);
+        Accepted merged = Snapshot.merge(snapshotLeft, snapshotRight).accepted;
+        Assert.assertSame(expected, merged);
+    }
+
+    @Test
+    public void testAcceptMerging()
+    {
+        Accepted accepted = newProposal(1, "1").accepted();
+        AcceptedWithTTL acceptedWithTTL1 = new AcceptedWithTTL(accepted, 100);
+        AcceptedWithTTL acceptedWithTTL2 = new AcceptedWithTTL(accepted, 200);
+
+        assertAcceptedMerge(accepted, accepted, acceptedWithTTL1);
+        assertAcceptedMerge(accepted, acceptedWithTTL1, accepted);
+        assertAcceptedMerge(acceptedWithTTL2, acceptedWithTTL1, acceptedWithTTL2);
+        assertAcceptedMerge(acceptedWithTTL2, acceptedWithTTL2, acceptedWithTTL1);
+    }
+
+    private static void assertCommittedMerge(Committed expected, Committed left, Committed right)
+    {
+        Committed merged = Snapshot.merge(new Snapshot(null, null, null, left), new Snapshot(null, null, null, right)).committed;
+        Assert.assertSame(expected, merged);
+    }
+
+    @Test
+    public void testCommitMerging()
+    {
+        Committed committed = newProposal(1, "1").accepted().committed();
+        Committed committedWithTTL1 = new CommittedWithTTL(committed, 100);
+        Committed committedWithTTL2 = new CommittedWithTTL(committed, 200);
+
+        assertCommittedMerge(committed, committed, committedWithTTL1);
+        assertCommittedMerge(committed, committedWithTTL1, committed);
+        assertCommittedMerge(committedWithTTL2, committedWithTTL1, committedWithTTL2);
+        assertCommittedMerge(committedWithTTL2, committedWithTTL2, committedWithTTL1);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/cleanup/PaxosTableRepairsTest.java b/test/unit/org/apache/cassandra/service/paxos/cleanup/PaxosTableRepairsTest.java
new file mode 100644
index 0000000..22441fe
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/cleanup/PaxosTableRepairsTest.java
@@ -0,0 +1,262 @@
+/*
+ * 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.service.paxos.cleanup;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.AbstractPaxosRepair;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.BallotGenerator;
+import org.apache.cassandra.service.paxos.cleanup.PaxosTableRepairs.KeyRepair;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
+
+public class PaxosTableRepairsTest
+{
+    private static DecoratedKey dk(int k)
+    {
+        return Murmur3Partitioner.instance.decorateKey(ByteBufferUtil.bytes(k));
+    }
+
+    private static final DecoratedKey DK1 = dk(1);
+    private static final DecoratedKey DK2 = dk(2);
+
+    private static class MockRepair extends AbstractPaxosRepair
+    {
+        private static State STARTED = new State();
+        private boolean reportCompleted = false;
+        private boolean failOnStart = false;
+
+        public MockRepair(DecoratedKey key)
+        {
+            super(key, null);
+        }
+
+        public State restart(State state, long waitUntil)
+        {
+            if (failOnStart)
+                throw new RuntimeException();
+            return STARTED;
+        }
+
+        void complete()
+        {
+            set(DONE);
+        }
+
+        public boolean isComplete()
+        {
+            return reportCompleted || super.isComplete();
+        }
+    }
+
+    private static class MockTableRepairs extends PaxosTableRepairs
+    {
+        @Override
+        MockRepair createRepair(DecoratedKey key, Ballot incompleteBallot, ConsistencyLevel consistency, TableMetadata cfm)
+        {
+            return new MockRepair(key);
+        }
+
+        MockRepair startOrGetOrQueue(DecoratedKey key, int i)
+        {
+            return (MockRepair) startOrGetOrQueue(key, BallotGenerator.Global.atUnixMicros(i, NONE), ConsistencyLevel.SERIAL, null, r -> {});
+        }
+    }
+
+    /**
+     * repairs with different keys shouldn't interfere with each other
+     */
+    @Test
+    public void testMultipleRepairs()
+    {
+        MockTableRepairs repairs = new MockTableRepairs();
+
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK2, 1);
+
+        Assert.assertTrue(repair1.isStarted());
+        Assert.assertTrue(repair2.isStarted());
+        Assert.assertTrue(repairs.hasActiveRepairs(DK1));
+        Assert.assertTrue(repairs.hasActiveRepairs(DK2));
+
+        repair1.complete();
+        repair2.complete();
+
+        // completing the repairs should have cleaned repairs map
+        Assert.assertFalse(repairs.hasActiveRepairs(DK1));
+        Assert.assertFalse(repairs.hasActiveRepairs(DK2));
+    }
+
+    @Test
+    public void testRepairQueueing()
+    {
+        MockTableRepairs repairs = new MockTableRepairs();
+
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK1, 1);
+        MockRepair repair3 = repairs.startOrGetOrQueue(DK1, 2);
+
+        Assert.assertTrue(repair1.isStarted());
+        Assert.assertFalse(repair2.isStarted());
+        Assert.assertFalse(repair3.isStarted());
+
+        KeyRepair keyRepair = repairs.getKeyRepairUnsafe(DK1);
+        Assert.assertEquals(repair1, keyRepair.activeRepair());
+        Assert.assertTrue(keyRepair.queueContains(repair2));
+        Assert.assertTrue(keyRepair.queueContains(repair3));
+
+        repair1.complete();
+        Assert.assertTrue(repair2.isStarted());
+        Assert.assertTrue(repairs.hasActiveRepairs(DK1));
+        Assert.assertEquals(repair2, keyRepair.activeRepair());
+        Assert.assertTrue(keyRepair.queueContains(repair3));
+
+        repair2.complete();
+        Assert.assertTrue(repair3.isStarted());
+        Assert.assertTrue(repairs.hasActiveRepairs(DK1));
+
+        // completing the final repair should cleanup the map
+        repair3.complete();
+        Assert.assertFalse(repairs.hasActiveRepairs(DK1));
+    }
+
+    @Test
+    public void testRepairCancellation()
+    {
+        MockTableRepairs repairs = new MockTableRepairs();
+
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK1, 1);
+        MockRepair repair3 = repairs.startOrGetOrQueue(DK1, 2);
+
+        Assert.assertTrue(repair1.isStarted());
+        Assert.assertFalse(repair2.isStarted());
+        Assert.assertFalse(repair3.isStarted());
+        Assert.assertTrue(repairs.hasActiveRepairs(DK1));
+
+        repairs.clear();
+        Assert.assertTrue(repair2.isComplete());
+        Assert.assertTrue(repair3.isComplete());
+        Assert.assertFalse(repairs.hasActiveRepairs(DK1));
+
+        MockRepair repair4 = repairs.startOrGetOrQueue(DK1, 0);
+        Assert.assertTrue(repair4.isStarted());
+        Assert.assertTrue(repairs.hasActiveRepairs(DK1));
+        repair4.complete();
+    }
+
+    @Test
+    public void testQueuedCancellation()
+    {
+        // if a queued repair is cancelled, it should be removed without affecting the active repair
+        MockTableRepairs repairs = new MockTableRepairs();
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK1, 1);
+        MockRepair repair3 = repairs.startOrGetOrQueue(DK1, 2);
+
+        KeyRepair keyRepair = repairs.getKeyRepairUnsafe(DK1);
+        Assert.assertEquals(repair1, keyRepair.activeRepair());
+        Assert.assertTrue(keyRepair.queueContains(repair2));
+
+        repair2.cancel();
+        Assert.assertEquals(repair1, keyRepair.activeRepair());
+        Assert.assertFalse(keyRepair.queueContains(repair2));
+
+        repair1.complete();
+        Assert.assertEquals(repair3, keyRepair.activeRepair());
+        Assert.assertFalse(keyRepair.queueContains(repair2));
+    }
+
+    @Test
+    public void testFailureToStart()
+    {
+        // if an exception is thrown during repair scheduling, the next repair should be scheduled or things should be cleaned up
+        MockTableRepairs repairs = new MockTableRepairs();
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK1, 1);
+        MockRepair repair3 = repairs.startOrGetOrQueue(DK1, 2);
+
+        repair2.failOnStart = true;
+        KeyRepair keyRepair = repairs.getKeyRepairUnsafe(DK1);
+        Assert.assertEquals(repair1, keyRepair.activeRepair());
+        Assert.assertTrue(keyRepair.queueContains(repair2));
+        Assert.assertTrue(keyRepair.queueContains(repair3));
+        Assert.assertFalse(repair2.isComplete());
+
+        repair1.complete();
+        Assert.assertEquals(repair3, keyRepair.activeRepair());
+        Assert.assertFalse(keyRepair.queueContains(repair2));
+        Assert.assertTrue(repair2.isComplete());
+    }
+
+    @Test
+    public void testCompletedQueuedRepair()
+    {
+        // if a queued repair has been somehow completed (or cancelled) without also being removed, it should be skipped
+        MockTableRepairs repairs = new MockTableRepairs();
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK1, 1);
+        MockRepair repair3 = repairs.startOrGetOrQueue(DK1, 2);
+
+        repair2.reportCompleted = true;
+        KeyRepair keyRepair = repairs.getKeyRepairUnsafe(DK1);
+        Assert.assertEquals(repair1, keyRepair.activeRepair());
+        Assert.assertTrue(keyRepair.queueContains(repair2));
+        Assert.assertTrue(keyRepair.queueContains(repair3));
+
+        repair1.complete();
+        Assert.assertEquals(repair3, keyRepair.activeRepair());
+        Assert.assertFalse(keyRepair.queueContains(repair2));
+    }
+
+    @Test
+    public void testEviction()
+    {
+        MockTableRepairs repairs = new MockTableRepairs();
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK1, 1);
+
+        repairs.evictHungRepairs(System.nanoTime());
+        KeyRepair keyRepair = repairs.getKeyRepairUnsafe(DK1);
+        Assert.assertTrue(repair1.isComplete());
+        Assert.assertEquals(repair2, keyRepair.activeRepair());
+    }
+
+    @Test
+    public void testClearRepairs()
+    {
+        MockTableRepairs repairs = new MockTableRepairs();
+        MockRepair repair1 = repairs.startOrGetOrQueue(DK1, 0);
+        MockRepair repair2 = repairs.startOrGetOrQueue(DK1, 1);
+
+        KeyRepair keyRepair = repairs.getKeyRepairUnsafe(DK1);
+        Assert.assertEquals(repair1, keyRepair.activeRepair());
+
+        repairs.clear();
+        Assert.assertEquals(0, keyRepair.pending());
+        Assert.assertNull(repairs.getKeyRepairUnsafe(DK1));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosBallotTrackerTest.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosBallotTrackerTest.java
new file mode 100644
index 0000000..1f9db08
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosBallotTrackerTest.java
@@ -0,0 +1,258 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOException;
+
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.PaxosState.MaybePromise.Outcome;
+import org.junit.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.ConsistencyLevel;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.service.paxos.Paxos;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+import static org.apache.cassandra.service.paxos.PaxosState.MaybePromise.Outcome.REJECT;
+import static org.apache.cassandra.service.paxos.PaxosState.ballotTracker;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.PAXOS_CFS;
+
+public class PaxosBallotTrackerTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(PaxosBallotTrackerTest.class);
+
+    protected static String ks;
+    protected static final String tbl = "tbl";
+    protected static TableMetadata cfm;
+
+    // which stage the ballot is tested at
+    enum Stage { PREPARE, PROPOSE, COMMIT }
+    enum Order
+    {
+        FIRST, // first ballot
+        SUBSEQUENT, // newest ballot
+        SUPERSEDED // ballot
+    }
+
+    @BeforeClass
+    public static void setUpClass() throws Exception
+    {
+        SchemaLoader.prepareServer();
+
+        ks = "coordinatorsessiontest";
+        cfm = CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", ks).build();
+        SchemaLoader.createKeyspace(ks, KeyspaceParams.simple(1), cfm);
+    }
+
+    @Before
+    public void setUp()
+    {
+        PAXOS_CFS.truncateBlocking();
+        PaxosState.unsafeReset();
+    }
+
+    private static DecoratedKey dk(int v)
+    {
+        return DatabaseDescriptor.getPartitioner().decorateKey(ByteBufferUtil.bytes(v));
+    }
+
+    private static void testHighBound(Stage stage, Order order)
+    {
+        logger.info("testHighBound for {} {} ", stage, order);
+        Ballot ballot1 = Paxos.ballotForConsistency(1001, ConsistencyLevel.SERIAL);
+        Ballot ballot2 = Paxos.ballotForConsistency(1002, ConsistencyLevel.SERIAL);
+
+        Ballot opBallot;
+        Ballot expected;
+        switch (order)
+        {
+            case FIRST:
+                opBallot = ballot1;
+                expected = ballot1;
+                break;
+            case SUBSEQUENT:
+                ballotTracker().updateHighBoundUnsafe(Ballot.none(), ballot1);
+                Assert.assertEquals(ballot1, ballotTracker().getHighBound());
+                opBallot = ballot2;
+                expected = ballot2;
+                break;
+            case SUPERSEDED:
+                ballotTracker().updateHighBoundUnsafe(Ballot.none(), ballot2);
+                Assert.assertEquals(ballot2, ballotTracker().getHighBound());
+                opBallot = ballot1;
+                expected = ballot2;
+                break;
+            default:
+                throw new AssertionError();
+        }
+
+        DecoratedKey key = dk(1);
+        Commit.Proposal commit = new Commit.Proposal(opBallot, PaxosRowsTest.nonEmptyUpdate(opBallot, cfm, key));
+
+        switch (stage)
+        {
+            case PREPARE:
+                try (PaxosState state = PaxosState.get(commit))
+                {
+                    state.promiseIfNewer(commit.ballot, true);
+                }
+                break;
+            case PROPOSE:
+                try (PaxosState state = PaxosState.get(commit))
+                {
+                    state.acceptIfLatest(commit);
+                }
+                break;
+            case COMMIT:
+                PaxosState.commitDirect(commit);
+                break;
+            default:
+                throw new AssertionError();
+        }
+
+        Assert.assertEquals(expected, ballotTracker().getHighBound());
+    }
+
+    /**
+     * Tests that the ballot high bound is set correctly for all update types
+     */
+    @Test
+    public void highBound()
+    {
+        for (Stage stage: Stage.values())
+        {
+            for (Order order: Order.values())
+            {
+                setUp();
+                testHighBound(stage, order);
+            }
+        }
+    }
+
+    @Test
+    public void lowBoundSet() throws IOException
+    {
+        PaxosBallotTracker ballotTracker = ballotTracker();
+        Ballot ballot1 = Paxos.ballotForConsistency(1001, ConsistencyLevel.SERIAL);
+        Ballot ballot2 = Paxos.ballotForConsistency(1002, ConsistencyLevel.SERIAL);
+        Ballot ballot3 = Paxos.ballotForConsistency(1003, ConsistencyLevel.SERIAL);
+
+        Assert.assertEquals(Ballot.none(), ballotTracker.getLowBound());
+
+        ballotTracker.updateLowBound(ballot2);
+        Assert.assertEquals(ballot2, ballotTracker.getLowBound());
+
+        ballotTracker.updateLowBound(ballot1);
+        Assert.assertEquals(ballot2, ballotTracker.getLowBound());
+
+        ballotTracker.updateLowBound(ballot3);
+        Assert.assertEquals(ballot3, ballotTracker.getLowBound());
+    }
+
+    @Test
+    public void lowBoundPrepare() throws IOException
+    {
+        PaxosBallotTracker ballotTracker = ballotTracker();
+        Ballot ballot1 = Paxos.ballotForConsistency(1001, ConsistencyLevel.SERIAL);
+        Ballot ballot2 = Paxos.ballotForConsistency(1002, ConsistencyLevel.SERIAL);
+        Ballot ballot3 = Paxos.ballotForConsistency(1003, ConsistencyLevel.SERIAL);
+        Ballot ballot4 = Paxos.ballotForConsistency(1004, ConsistencyLevel.SERIAL);
+
+        ballotTracker.updateLowBound(ballot1);
+        Assert.assertNotNull(ballotTracker.getLowBound());
+
+        DecoratedKey key = dk(1);
+        try (PaxosState state = PaxosState.get(key, cfm))
+        {
+            PaxosState.MaybePromise promise = state.promiseIfNewer(ballot2, true);
+            Assert.assertEquals(Outcome.PROMISE, promise.outcome());
+            Assert.assertNull(promise.supersededBy());
+        }
+
+        // set the lower bound into the 'future', and prepare with an earlier ballot
+        ballotTracker.updateLowBound(ballot4);
+        try (PaxosState state = PaxosState.get(key, cfm))
+        {
+            PaxosState.MaybePromise promise = state.promiseIfNewer(ballot3, true);
+            Assert.assertEquals(REJECT, promise.outcome());
+            Assert.assertEquals(ballot4, promise.supersededBy());
+        }
+    }
+
+    @Test
+    public void lowBoundAccept() throws IOException
+    {
+        PaxosBallotTracker ballotTracker = ballotTracker();
+        Ballot ballot1 = Paxos.ballotForConsistency(1001, ConsistencyLevel.SERIAL);
+        Ballot ballot2 = Paxos.ballotForConsistency(1002, ConsistencyLevel.SERIAL);
+        Ballot ballot3 = Paxos.ballotForConsistency(1003, ConsistencyLevel.SERIAL);
+        Ballot ballot4 = Paxos.ballotForConsistency(1004, ConsistencyLevel.SERIAL);
+
+        ballotTracker.updateLowBound(ballot1);
+        Assert.assertNotNull(ballotTracker.getLowBound());
+
+        DecoratedKey key = dk(1);
+        try (PaxosState state = PaxosState.get(key, cfm))
+        {
+            Ballot result = state.acceptIfLatest(new Commit.Proposal(ballot2, PartitionUpdate.emptyUpdate(cfm, key)));
+            Assert.assertNull(result);
+        }
+
+        // set the lower bound into the 'future', and prepare with an earlier ballot
+        ballotTracker.updateLowBound(ballot4);
+        try (PaxosState state = PaxosState.get(key, cfm))
+        {
+            Ballot result = state.acceptIfLatest(new Commit.Proposal(ballot3, PartitionUpdate.emptyUpdate(cfm, key)));
+            Assert.assertEquals(ballot4, result);
+        }
+    }
+
+    /**
+     * updating the lower bound should persist it to disk
+     */
+    @Test
+    public void persistentLowBound() throws IOException
+    {
+        PaxosBallotTracker ballotTracker = ballotTracker();
+        Ballot ballot1 = Paxos.ballotForConsistency(1001, ConsistencyLevel.SERIAL);
+        Assert.assertEquals(Ballot.none(), ballotTracker.getLowBound());
+
+        // a new tracker shouldn't load a ballot
+        PaxosBallotTracker tracker2 = PaxosBallotTracker.load(ballotTracker.getDirectory());
+        Assert.assertEquals(Ballot.none(), tracker2.getLowBound());
+
+        // updating the lower bound should flush it to disk
+        ballotTracker.updateLowBound(ballot1);
+        Assert.assertEquals(ballot1, ballotTracker.getLowBound());
+
+        // then loading a new tracker should find the lower bound
+        PaxosBallotTracker tracker3 = PaxosBallotTracker.load(ballotTracker.getDirectory());
+        Assert.assertEquals(ballot1, tracker3.getLowBound());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosMockUpdateSupplier.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosMockUpdateSupplier.java
new file mode 100644
index 0000000..d1733b4
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosMockUpdateSupplier.java
@@ -0,0 +1,113 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.util.*;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.PartitionPosition;
+import org.apache.cassandra.db.memtable.Memtable;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.CloseableIterator;
+
+public class PaxosMockUpdateSupplier implements PaxosUncommittedTracker.UpdateSupplier
+{
+    private final Map<TableId, NavigableMap<PartitionPosition, PaxosKeyState>> states = new HashMap<>();
+
+    private NavigableMap<PartitionPosition, PaxosKeyState> mapFor(TableId tableId)
+    {
+        return states.computeIfAbsent(tableId, key -> new TreeMap<>());
+    }
+
+    private void updateTo(TableId tableId, PaxosKeyState newState)
+    {
+        NavigableMap<PartitionPosition, PaxosKeyState> map = mapFor(tableId);
+        PaxosKeyState current = map.get(newState.key);
+        if (current != null && PaxosKeyState.BALLOT_COMPARATOR.compare(current, newState) > 0)
+            return;
+
+        map.put(newState.key, newState);
+    }
+
+    void inProgress(TableId tableId, DecoratedKey key, Ballot ballot)
+    {
+        updateTo(tableId, new PaxosKeyState(tableId, key, ballot, false));
+    }
+
+    void committed(TableId tableId, DecoratedKey key, Ballot ballot)
+    {
+        updateTo(tableId, new PaxosKeyState(tableId, key, ballot, true));
+    }
+
+    public CloseableIterator<PaxosKeyState> repairIterator(TableId tableId, Collection<Range<Token>> ranges)
+    {
+        Iterator<PaxosKeyState> iterator = Iterators.filter(mapFor(tableId).values().iterator(), k -> Iterables.any(ranges, r -> r.contains(k.key.getToken())));
+
+        return new CloseableIterator<PaxosKeyState>()
+        {
+            public void close() {}
+
+            public boolean hasNext()
+            {
+                return iterator.hasNext();
+            }
+
+            public PaxosKeyState next()
+            {
+                return iterator.next();
+            }
+        };
+    }
+
+    public CloseableIterator<PaxosKeyState> flushIterator(Memtable memtable)
+    {
+        ArrayList<PaxosKeyState> keyStates = new ArrayList<>();
+        for (Map.Entry<TableId, NavigableMap<PartitionPosition, PaxosKeyState>> statesEntry : states.entrySet())
+        {
+            for (Map.Entry<PartitionPosition, PaxosKeyState> entry : statesEntry.getValue().entrySet())
+            {
+                keyStates.add(entry.getValue());
+            }
+        }
+        states.clear();
+
+        Iterator<PaxosKeyState> iterator = keyStates.iterator();
+
+        return new CloseableIterator<PaxosKeyState>()
+        {
+            public void close() {}
+
+            public boolean hasNext()
+            {
+                return iterator.hasNext();
+            }
+
+            public PaxosKeyState next()
+            {
+                return iterator.next();
+            }
+        };
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosRowsTest.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosRowsTest.java
new file mode 100644
index 0000000..911ac72
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosRowsTest.java
@@ -0,0 +1,164 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+import org.junit.*;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.marshal.UUIDType;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.partitions.UnfilteredPartitionIterator;
+import org.apache.cassandra.db.rows.BTreeRow;
+import org.apache.cassandra.db.rows.BufferCell;
+import org.apache.cassandra.db.rows.Cell;
+import org.apache.cassandra.db.rows.Row;
+import org.apache.cassandra.db.rows.UnfilteredRowIterator;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.Commit;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.CloseableIterator;
+import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.btree.BTree;
+
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.PAXOS_CFM;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.PAXOS_CFS;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.createBallots;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.dk;
+
+public class PaxosRowsTest
+{
+    protected static String ks;
+    protected static final String tbl = "tbl";
+    protected static TableMetadata metadata;
+    protected static TableId tableId;
+
+    static Commit emptyCommitFor(Ballot ballot, DecoratedKey key)
+    {
+        return new Commit(ballot, PartitionUpdate.emptyUpdate(metadata, key));
+    }
+
+    static Commit nonEmptyCommitFor(Ballot ballot, DecoratedKey key)
+    {
+        return new Commit(ballot, nonEmptyUpdate(ballot, metadata, key));
+    }
+
+    static PartitionUpdate nonEmptyUpdate(Ballot ballot, TableMetadata cfm, DecoratedKey key)
+    {
+        ColumnMetadata valueColumn = cfm.getColumn(new ColumnIdentifier("v", false));
+        return PartitionUpdate.singleRowUpdate(cfm, key, BTreeRow.create(Clustering.EMPTY, LivenessInfo.EMPTY, Row.Deletion.LIVE, BTree.singleton(new BufferCell(valueColumn, ballot.unixMicros(), Cell.NO_TTL, Cell.NO_DELETION_TIME, ByteBufferUtil.bytes(1), null))));
+    }
+
+    static Row paxosRowFor(DecoratedKey key)
+    {
+        SinglePartitionReadCommand command = SinglePartitionReadCommand.create(PAXOS_CFM,
+                FBUtilities.nowInSeconds(),
+                key,
+                new BufferClustering(UUIDType.instance.decompose(tableId.asUUID())));
+        try (ReadExecutionController opGroup = command.executionController();
+             UnfilteredPartitionIterator iterator = command.executeLocally(opGroup);
+             UnfilteredRowIterator partition = Iterators.getOnlyElement(iterator))
+        {
+            return (Row) Iterators.getOnlyElement(partition);
+        }
+    }
+
+    @BeforeClass
+    public static void setUpClass() throws Exception
+    {
+        SchemaLoader.prepareServer();
+
+        ks = "coordinatorsessiontest";
+        metadata = CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", ks).build();
+        tableId = metadata.id;
+    }
+
+    @Before
+    public void setUp() throws Exception
+    {
+        PAXOS_CFS.truncateBlocking();
+    }
+
+    @Test
+    public void testRowInterpretation()
+    {
+        DecoratedKey key = dk(5);
+        Ballot[] ballots = createBallots(3);
+
+        SystemKeyspace.savePaxosWritePromise(key, metadata, ballots[0]);
+        Assert.assertEquals(new PaxosKeyState(tableId, key, ballots[0], false), PaxosRows.getCommitState(key, paxosRowFor(key), null));
+        SystemKeyspace.savePaxosProposal(emptyCommitFor(ballots[0], key));
+        Assert.assertEquals(new PaxosKeyState(tableId, key, ballots[0], true), PaxosRows.getCommitState(key, paxosRowFor(key), null));
+
+        SystemKeyspace.savePaxosWritePromise(key, metadata, ballots[1]);
+        Assert.assertEquals(new PaxosKeyState(tableId, key, ballots[1], false), PaxosRows.getCommitState(key, paxosRowFor(key), null));
+        SystemKeyspace.savePaxosProposal(nonEmptyCommitFor(ballots[1], key));
+        Assert.assertEquals(new PaxosKeyState(tableId, key, ballots[1], false), PaxosRows.getCommitState(key, paxosRowFor(key), null));
+        SystemKeyspace.savePaxosCommit(nonEmptyCommitFor(ballots[1], key));
+        Assert.assertEquals(new PaxosKeyState(tableId, key, ballots[1], true), PaxosRows.getCommitState(key, paxosRowFor(key), null));
+
+        // test cfid filter mismatch
+        Assert.assertNull(PaxosRows.getCommitState(key, paxosRowFor(key), TableId.fromUUID(UUID.randomUUID())));
+
+        SystemKeyspace.savePaxosCommit(emptyCommitFor(ballots[2], key));
+        Assert.assertEquals(new PaxosKeyState(tableId, key, ballots[2], true), PaxosRows.getCommitState(key, paxosRowFor(key), null));
+    }
+
+    @Test
+    public void testIterator()
+    {
+        Ballot[] ballots = createBallots(10);
+        List<PaxosKeyState> expected = new ArrayList<>(ballots.length);
+        for (int i=0; i<ballots.length; i++)
+        {
+            Ballot ballot = ballots[i];
+            DecoratedKey key = dk(i);
+
+            if (i%2 == 0)
+            {
+                SystemKeyspace.savePaxosProposal(nonEmptyCommitFor(ballot, key));
+                expected.add(new PaxosKeyState(tableId, key, ballot, false));
+            }
+            else
+            {
+                SystemKeyspace.savePaxosCommit(nonEmptyCommitFor(ballot, key));
+                expected.add(new PaxosKeyState(tableId, key, ballot, true));
+            }
+        }
+
+        PartitionRangeReadCommand command = PartitionRangeReadCommand.allDataRead(PAXOS_CFM, FBUtilities.nowInSeconds());
+        try (ReadExecutionController opGroup = command.executionController();
+             UnfilteredPartitionIterator partitions = command.executeLocally(opGroup);
+             CloseableIterator<PaxosKeyState> iterator = PaxosRows.toIterator(partitions, metadata.id, true))
+        {
+            Assert.assertEquals(expected, Lists.newArrayList(iterator));
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTrackerTest.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTrackerTest.java
new file mode 100644
index 0000000..ee0878c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosStateTrackerTest.java
@@ -0,0 +1,242 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.service.paxos.uncommitted;
+
+import java.io.IOException;
+import java.util.Collections;
+
+import com.google.common.collect.Sets;
+import com.google.common.io.Files;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.ColumnIdentifier;
+import org.apache.cassandra.db.Clustering;
+import org.apache.cassandra.db.SystemKeyspace;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.db.partitions.PartitionUpdate;
+import org.apache.cassandra.db.rows.BTreeRow;
+import org.apache.cassandra.db.rows.BufferCell;
+import org.apache.cassandra.db.rows.Cell;
+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.io.util.File;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.schema.ColumnMetadata;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+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.service.paxos.uncommitted.PaxosStateTracker.stateDirectory;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.*;
+import static org.apache.cassandra.service.paxos.uncommitted.UncommittedTableDataTest.assertIteratorContents;
+import static org.apache.cassandra.service.paxos.uncommitted.UncommittedTableDataTest.uncommitted;
+
+
+public class PaxosStateTrackerTest
+{
+    private File directory1 = null;
+    private File directory2 = null;
+    private File[] directories = null;
+    protected static String ks;
+    protected static TableMetadata cfm1;
+    protected static TableMetadata cfm2;
+
+    @BeforeClass
+    public static void setUpClass() throws Exception
+    {
+        SchemaLoader.prepareServer();
+
+        ks = "coordinatorsessiontest";
+        cfm1 = TableMetadata.builder(ks, "tbl1").addPartitionKeyColumn("k", Int32Type.instance).addRegularColumn("v", Int32Type.instance).build();
+        cfm2 = TableMetadata.builder(ks, "tbl2").addPartitionKeyColumn("k", Int32Type.instance).addRegularColumn("v", Int32Type.instance).build();
+        SchemaLoader.createKeyspace(ks, KeyspaceParams.simple(1), cfm1, cfm2);
+    }
+
+    @Before
+    public void setUp() throws Exception
+    {
+        PAXOS_CFS.truncateBlocking();
+        PAXOS_REPAIR_CFS.truncateBlocking();
+
+        if (directory1 != null)
+            FileUtils.deleteRecursive(directory1);
+        if (directory2 != null)
+            FileUtils.deleteRecursive(directory2);
+
+        directory1 = new File(Files.createTempDir());
+        directory2 = new File(Files.createTempDir());
+        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));
+        Cell cell = BufferCell.live(col, ballot.unixMicros(), ByteBufferUtil.bytes(0));
+        Row row = BTreeRow.singleCellRow(Clustering.EMPTY, cell);
+        return PartitionUpdate.singleRowUpdate(cfm, dk(k), row);
+    }
+
+    private static Commit commit(TableMetadata cfm, int k, Ballot ballot)
+    {
+        return new Commit(ballot, update(cfm, k, ballot));
+    }
+
+    private static void savePaxosRepair(TableMetadata cfm, Range<Token> range, Ballot lowBound)
+    {
+        PaxosRepairHistory current = SystemKeyspace.loadPaxosRepairHistory(cfm.keyspace, cfm.name);
+        PaxosRepairHistory updated = PaxosRepairHistory.add(current, Collections.singleton(range), lowBound);
+        SystemKeyspace.savePaxosRepairHistory(cfm.keyspace, cfm.name, updated, true);
+    }
+
+    private static void savePaxosRepair(TableMetadata cfm, int left, int right, Ballot lowBound)
+    {
+        IPartitioner partitioner = DatabaseDescriptor.getPartitioner();
+        Range<Token> range = new Range<>(partitioner.getToken(ByteBufferUtil.bytes(left)), partitioner.getToken(ByteBufferUtil.bytes(right)));
+        savePaxosRepair(cfm, range, lowBound);
+    }
+
+    private static void initDirectory(File directory) throws IOException
+    {
+        PaxosStateTracker.create(new File[]{directory}).ballots().flush();
+    }
+
+    @Test
+    public void autoRebuild() throws Throwable
+    {
+        Ballot[] ballots = createBallots(6);
+
+        // save a promise, proposal, and commit to each table
+        SystemKeyspace.savePaxosWritePromise(dk(0), cfm1, ballots[0]);
+        SystemKeyspace.savePaxosWritePromise(dk(1), cfm2, ballots[1]);
+        SystemKeyspace.savePaxosProposal(commit(cfm1, 2, ballots[2]));
+        SystemKeyspace.savePaxosProposal(commit(cfm2, 3, ballots[3]));
+        SystemKeyspace.savePaxosCommit(commit(cfm1, 4, ballots[4]));
+        SystemKeyspace.savePaxosCommit(commit(cfm2, 5, ballots[5]));
+
+        PaxosStateTracker tracker = PaxosStateTracker.create(directories);
+        Assert.assertTrue(tracker.isRebuildNeeded());
+        Assert.assertEquals(Sets.newHashSet(), tracker.uncommitted().tableIds());
+
+        tracker.maybeRebuild();
+
+        Assert.assertEquals(stateDirectory(directory1), tracker.uncommitted().getDirectory());
+
+        Assert.assertEquals(Sets.newHashSet(cfm1.id, cfm2.id), tracker.uncommitted().tableIds());
+
+        UncommittedTableData tableData1 = tracker.uncommitted().getTableState(cfm1.id);
+        assertIteratorContents(tableData1.iterator(ALL_RANGES),  kl(uncommitted(0, ballots[0]),
+                                                                    uncommitted(2, ballots[2])));
+
+        UncommittedTableData tableData2 = tracker.uncommitted().getTableState(cfm2.id);
+        assertIteratorContents(tableData2.iterator(ALL_RANGES),  kl(uncommitted(1, ballots[1]),
+                                                                    uncommitted(3, ballots[3])));
+    }
+
+    @Test
+    public void manualRebuild() throws Throwable
+    {
+        initDirectory(directory1);
+        {
+            PaxosStateTracker tracker = PaxosStateTracker.create(directories);
+            Assert.assertFalse(tracker.isRebuildNeeded());
+            Assert.assertEquals(Ballot.none(), tracker.ballots().getLowBound());
+        }
+
+        Ballot[] ballots = createBallots(4);
+        savePaxosRepair(cfm1, 0, 10, ballots[0]);
+        savePaxosRepair(cfm1, 10, 20, ballots[1]);
+        SystemKeyspace.savePaxosWritePromise(dk(0), cfm1, ballots[2]);
+        SystemKeyspace.savePaxosProposal(commit(cfm1, 2, ballots[3]));
+
+        try (SystemProp forceRebuild = SystemProp.set(PaxosStateTracker.FORCE_REBUILD_PROP, true))
+        {
+            PaxosStateTracker tracker = PaxosStateTracker.create(directories);
+            Assert.assertTrue(tracker.isRebuildNeeded());
+            Assert.assertEquals(Ballot.none(), tracker.ballots().getLowBound());
+            tracker.maybeRebuild();
+
+            UncommittedTableData tableData1 = tracker.uncommitted().getTableState(cfm1.id);
+            assertIteratorContents(tableData1.iterator(ALL_RANGES),  kl(uncommitted(0, ballots[2]),
+                                                                        uncommitted(2, ballots[3])));
+            Assert.assertEquals(ballots[1], tracker.ballots().getLowBound());
+            Assert.assertEquals(ballots[3], tracker.ballots().getHighBound());
+        }
+    }
+
+    // test we can find paxos data in any directory
+    @Test
+    public void testMultiDirectories() throws Throwable
+    {
+        initDirectory(directory2);
+        PaxosStateTracker tracker = PaxosStateTracker.create(directories);
+        Assert.assertFalse(tracker.isRebuildNeeded());
+        Assert.assertEquals(stateDirectory(directory2), tracker.uncommitted().getDirectory());
+    }
+
+    // test multiple paxos directories throws exception
+    @Test(expected=IllegalStateException.class)
+    public void testConflictingDirectories() throws Throwable
+    {
+        initDirectory(directory1);
+        initDirectory(directory2);
+        PaxosStateTracker tracker = PaxosStateTracker.create(directories);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTests.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTests.java
new file mode 100644
index 0000000..2804508
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTests.java
@@ -0,0 +1,93 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.util.*;
+
+import com.google.common.collect.Lists;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.db.*;
+import org.apache.cassandra.db.commitlog.CommitLog;
+import org.apache.cassandra.dht.*;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.ByteBufferUtil;
+
+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.nextBallot;
+
+class PaxosUncommittedTests
+{
+    static
+    {
+        DatabaseDescriptor.daemonInitialization();
+        CommitLog.instance.start();
+    }
+
+    static final IPartitioner PARTITIONER = new ByteOrderedPartitioner();
+    static final Token MIN_TOKEN = PARTITIONER.getMinimumToken();
+    static final Range<Token> FULL_RANGE = new Range<>(MIN_TOKEN, MIN_TOKEN);
+    static final Collection<Range<Token>> ALL_RANGES = Collections.singleton(FULL_RANGE);
+    static final ColumnFamilyStore PAXOS_CFS = Keyspace.open(SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.PAXOS);
+    static final TableMetadata PAXOS_CFM = PAXOS_CFS.metadata.get();
+    static final ColumnFamilyStore PAXOS_REPAIR_CFS = Keyspace.open(SYSTEM_KEYSPACE_NAME).getColumnFamilyStore(SystemKeyspace.PAXOS_REPAIR_HISTORY);
+    static final TableMetadata PAXOS_REPAIR_CFM = PAXOS_REPAIR_CFS.metadata();
+
+    static Ballot[] createBallots(int num)
+    {
+        Ballot[] ballots = new Ballot[num];
+        for (int i=0; i<num; i++)
+            ballots[i] = nextBallot(0, GLOBAL);
+
+        return ballots;
+    }
+
+    static DecoratedKey dk(int v)
+    {
+        return DatabaseDescriptor.getPartitioner().decorateKey(ByteBufferUtil.bytes(v));
+    }
+
+    static List<PaxosKeyState> kl(Iterator<PaxosKeyState> iter)
+    {
+        return Lists.newArrayList(iter);
+    }
+
+    static List<PaxosKeyState> kl(PaxosKeyState... states)
+    {
+        return Lists.newArrayList(states);
+    }
+
+    static Token tk(int v)
+    {
+        return dk(v).getToken();
+    }
+
+    static Range<Token> r(Token start, Token stop)
+    {
+        return new Range<>(start != null ? start : MIN_TOKEN, stop != null ? stop : MIN_TOKEN);
+    }
+
+    static Range<Token> r(int start, int stop)
+    {
+        return r(PARTITIONER.getToken(ByteBufferUtil.bytes(start)), PARTITIONER.getToken(ByteBufferUtil.bytes(stop)));
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTrackerIntegrationTest.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTrackerIntegrationTest.java
new file mode 100644
index 0000000..8c3dd25
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTrackerIntegrationTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Lists;
+import org.junit.*;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.PaxosState;
+import org.apache.cassandra.utils.ByteBufferUtil;
+import org.apache.cassandra.utils.CloseableIterator;
+
+import static org.apache.cassandra.service.paxos.Ballot.Flag.NONE;
+import static org.apache.cassandra.service.paxos.BallotGenerator.Global.nextBallot;
+import static org.apache.cassandra.service.paxos.Commit.*;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.ALL_RANGES;
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.PAXOS_CFS;
+
+public class PaxosUncommittedTrackerIntegrationTest
+{
+    protected static String ks;
+    protected static final String tbl = "tbl";
+    protected static TableMetadata cfm;
+
+    @BeforeClass
+    public static void setUpClass() throws Exception
+    {
+        SchemaLoader.prepareServer();
+
+        ks = "coordinatorsessiontest";
+        cfm = CreateTableStatement.parse("CREATE TABLE tbl (k INT PRIMARY KEY, v INT)", ks).build();
+        SchemaLoader.createKeyspace(ks, KeyspaceParams.simple(1), cfm);
+    }
+
+    @Before
+    public void setUp() throws Exception
+    {
+        PAXOS_CFS.truncateBlocking();
+    }
+
+    private static DecoratedKey dk(int v)
+    {
+        return DatabaseDescriptor.getPartitioner().decorateKey(ByteBufferUtil.bytes(v));
+    }
+
+    @Test
+    public void commitCycle()
+    {
+        PaxosUncommittedTracker tracker = PaxosState.uncommittedTracker();
+        PaxosBallotTracker ballotTracker = PaxosState.ballotTracker();
+        Assert.assertNull(tracker.getTableState(cfm.id));
+        Assert.assertEquals(Ballot.none(), ballotTracker.getLowBound());
+        Assert.assertEquals(Ballot.none(), ballotTracker.getHighBound());
+
+        try (CloseableIterator<UncommittedPaxosKey> iterator = tracker.uncommittedKeyIterator(cfm.id, ALL_RANGES))
+        {
+            Assert.assertFalse(iterator.hasNext());
+        }
+
+        DecoratedKey key = dk(1);
+        Ballot ballot = nextBallot(NONE);
+        Proposal proposal = new Proposal(ballot, PaxosRowsTest.nonEmptyUpdate(ballot, cfm, key));
+
+        try (PaxosState state = PaxosState.get(key, cfm))
+        {
+            state.promiseIfNewer(proposal.ballot, true);
+        }
+
+        try (CloseableIterator<UncommittedPaxosKey> iterator = tracker.uncommittedKeyIterator(cfm.id, ALL_RANGES))
+        {
+            Assert.assertEquals(key, Iterators.getOnlyElement(iterator).getKey());
+        }
+
+        try (PaxosState state = PaxosState.get(key, cfm))
+        {
+            state.acceptIfLatest(proposal);
+        }
+
+        try (CloseableIterator<UncommittedPaxosKey> iterator = tracker.uncommittedKeyIterator(cfm.id, ALL_RANGES))
+        {
+            Assert.assertEquals(key, Iterators.getOnlyElement(iterator).getKey());
+        }
+
+        PaxosState.commitDirect(proposal.agreed());
+        try (CloseableIterator<UncommittedPaxosKey> iterator = tracker.uncommittedKeyIterator(cfm.id, ALL_RANGES))
+        {
+            Assert.assertFalse(iterator.hasNext());
+        }
+    }
+
+    @Test
+    public void inMemoryCommit()
+    {
+        PaxosUncommittedTracker tracker = PaxosState.uncommittedTracker();
+
+        DecoratedKey key = dk(1);
+        Ballot ballot = nextBallot(NONE);
+        Proposal proposal = new Proposal(ballot, PaxosRowsTest.nonEmptyUpdate(ballot, cfm, key));
+
+        try (PaxosState state = PaxosState.get(key, cfm))
+        {
+            state.promiseIfNewer(proposal.ballot, true);
+            state.acceptIfLatest(proposal);
+        }
+        try (CloseableIterator<UncommittedPaxosKey> iterator = tracker.uncommittedKeyIterator(cfm.id, ALL_RANGES))
+        {
+            Assert.assertEquals(key, Iterators.getOnlyElement(iterator).getKey());
+        }
+
+        Util.flush(PAXOS_CFS);
+
+        PaxosState.commitDirect(proposal.agreed());
+        try (CloseableIterator<UncommittedPaxosKey> iterator = tracker.uncommittedKeyIterator(cfm.id, ALL_RANGES))
+        {
+            Assert.assertEquals(Lists.newArrayList(), Lists.newArrayList(iterator));
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTrackerTest.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTrackerTest.java
new file mode 100644
index 0000000..fa9f0e5
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/PaxosUncommittedTrackerTest.java
@@ -0,0 +1,248 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.util.*;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.schema.TableMetadata;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.utils.CloseableIterator;
+
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.*;
+
+public class PaxosUncommittedTrackerTest
+{
+    private static final String KS = "ks";
+    private static final String TBL = "tbl";
+    private static TableId cfid;
+    private File directory = null;
+    private PaxosUncommittedTracker tracker;
+    private PaxosMockUpdateSupplier updates;
+    private UncommittedTableData state;
+
+    @BeforeClass
+    public static void setupClass()
+    {
+        SchemaLoader.prepareServer();
+        TableMetadata tableMetadata = TableMetadata.builder("ks", "tbl")
+                                                   .addPartitionKeyColumn("k", Int32Type.instance)
+                                                   .addRegularColumn("v", Int32Type.instance)
+                                                   .build();
+        cfid = tableMetadata.id;
+        SchemaLoader.createKeyspace(KS, KeyspaceParams.simple(1), tableMetadata);
+    }
+
+    @Before
+    public void setUp()
+    {
+        if (directory != null)
+            FileUtils.deleteRecursive(directory);
+
+        directory = new File(Files.createTempDir());
+
+        tracker = new PaxosUncommittedTracker(directory);
+        tracker.start();
+        updates = new PaxosMockUpdateSupplier();
+        PaxosUncommittedTracker.unsafSetUpdateSupplier(updates);
+        state = tracker.getOrCreateTableState(cfid);
+    }
+
+    private static List<UncommittedPaxosKey> uncommittedList(PaxosUncommittedTracker tracker, Collection<Range<Token>> ranges)
+    {
+        try (CloseableIterator<UncommittedPaxosKey> iterator = tracker.uncommittedKeyIterator(cfid, ranges))
+        {
+            return Lists.newArrayList(iterator);
+        }
+    }
+
+    private static List<UncommittedPaxosKey> uncommittedList(PaxosUncommittedTracker tracker, Range<Token> range)
+    {
+        return uncommittedList(tracker, Collections.singleton(range));
+    }
+
+    private static List<UncommittedPaxosKey> uncommittedList(PaxosUncommittedTracker tracker)
+    {
+        return uncommittedList(tracker, FULL_RANGE);
+    }
+
+    @Test
+    public void inmemory() throws Exception
+    {
+        Assert.assertEquals(0, state.numFiles());
+        int size = 5;
+        List<PaxosKeyState> expected = new ArrayList<>(size);
+        int key = 0;
+        for (Ballot ballot : createBallots(size))
+        {
+            DecoratedKey dk = dk(key++);
+            updates.inProgress(cfid, dk, ballot);
+            expected.add(new PaxosKeyState(cfid, dk, ballot, false));
+        }
+
+        Assert.assertEquals(expected, uncommittedList(tracker));
+        Assert.assertEquals(0, state.numFiles());
+    }
+
+    @Test
+    public void onDisk() throws Exception
+    {
+        Assert.assertEquals(0, state.numFiles());
+        int size = 5;
+        List<PaxosKeyState> expected = new ArrayList<>(size);
+        int key = 0;
+        for (Ballot ballot : createBallots(size))
+        {
+            DecoratedKey dk = dk(key++);
+            updates.inProgress(cfid, dk, ballot);
+            expected.add(new PaxosKeyState(cfid, dk, ballot, false));
+        }
+        tracker.flushUpdates(null);
+
+        Assert.assertEquals(expected, uncommittedList(tracker));
+
+        Assert.assertEquals(1, state.numFiles());
+        Assert.assertEquals(expected, kl(state.iterator(Collections.singleton(FULL_RANGE))));
+    }
+
+    @Test
+    public void mixed() throws Exception
+    {
+        Assert.assertEquals(0, state.numFiles());
+        int size = 10;
+        PaxosKeyState[] expectedArr = new PaxosKeyState[size];
+        List<PaxosKeyState> inMemory = new ArrayList<>(size / 2);
+        List<PaxosKeyState> onDisk = new ArrayList<>(size / 2);
+        Ballot[] ballots = createBallots(size);
+
+        for (int i=0; i<size; i+=2)
+        {
+            Ballot ballot = ballots[i];
+            DecoratedKey dk = dk(i);
+            updates.inProgress(cfid, dk, ballot);
+            PaxosKeyState ballotState = new PaxosKeyState(cfid, dk, ballot, false);;
+            onDisk.add(ballotState);
+            expectedArr[i] = ballotState;
+        }
+
+        tracker.flushUpdates(null);
+
+        for (int i=1; i<size; i+=2)
+        {
+            Ballot ballot = ballots[i];
+            DecoratedKey dk = dk(i);
+            updates.inProgress(cfid, dk, ballot);
+            PaxosKeyState ballotState = new PaxosKeyState(cfid, dk, ballot, false);;
+            inMemory.add(ballotState);
+            expectedArr[i] = ballotState;
+        }
+
+        List<PaxosKeyState> expected = kl(expectedArr);
+
+        Assert.assertEquals(expected, uncommittedList(tracker));
+
+        Assert.assertEquals(1, state.numFiles());
+        Assert.assertEquals(onDisk, kl(state.iterator(Collections.singleton(FULL_RANGE))));
+    }
+
+    @Test
+    public void committed()
+    {
+        UncommittedTableData tableData = UncommittedTableData.load(directory, cfid);
+        Assert.assertEquals(0, tableData.numFiles());
+        Ballot ballot = createBallots(1)[0];
+
+        DecoratedKey dk = dk(1);
+        updates.inProgress(cfid, dk, ballot);
+
+        Assert.assertEquals(kl(new PaxosKeyState(cfid, dk, ballot, false)), uncommittedList(tracker));
+
+        updates.committed(cfid, dk, ballot);
+        Assert.assertTrue(uncommittedList(tracker).isEmpty());
+    }
+
+    /**
+     * Test that commits don't resolve in progress transactions with more recent ballots
+     */
+    @Test
+    public void pastCommit()
+    {
+        Ballot[] ballots = createBallots(2);
+        DecoratedKey dk = dk(1);
+        Assert.assertTrue(ballots[1].uuidTimestamp() > ballots[0].uuidTimestamp());
+
+        updates.inProgress(cfid, dk, ballots[1]);
+        updates.committed(cfid, dk, ballots[0]);
+
+        Assert.assertEquals(kl(new PaxosKeyState(cfid, dk, ballots[1], false)), uncommittedList(tracker));
+    }
+
+    @Test
+    public void tokenRange() throws Exception
+    {
+        Assert.assertEquals(0, state.numFiles());
+        int size = 10;
+        PaxosKeyState[] expectedArr = new PaxosKeyState[size];
+        Ballot[] ballots = createBallots(size);
+
+        for (int i=0; i<size; i+=2)
+        {
+            Ballot ballot = ballots[i];
+            DecoratedKey dk = dk(i);
+            updates.inProgress(cfid, dk, ballot);
+            PaxosKeyState ballotState = new PaxosKeyState(cfid, dk, ballot, false);;
+            expectedArr[i] = ballotState;
+        }
+
+        tracker.flushUpdates(null);
+
+        for (int i=1; i<size; i+=2)
+        {
+            Ballot ballot = ballots[i];
+            DecoratedKey dk = dk(i);
+            updates.inProgress(cfid, dk, ballot);
+            PaxosKeyState ballotState = new PaxosKeyState(cfid, dk, ballot, false);;
+            expectedArr[i] = ballotState;
+        }
+
+        List<PaxosKeyState> expected = kl(expectedArr);
+
+        Assert.assertEquals(expected.subList(0, 5), uncommittedList(tracker, r(null, tk(4))));
+        Assert.assertEquals(expected.subList(3, 7), uncommittedList(tracker, r(2, 6)));
+        Assert.assertEquals(expected.subList(8, 10), uncommittedList(tracker, r(tk(7), null)));
+        Assert.assertEquals(Lists.newArrayList(Iterables.concat(expected.subList(1, 5), expected.subList(6, 9))),
+                                             uncommittedList(tracker, Lists.newArrayList(r(0, 4), r(5, 8))));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/paxos/uncommitted/UncommittedTableDataTest.java b/test/unit/org/apache/cassandra/service/paxos/uncommitted/UncommittedTableDataTest.java
new file mode 100644
index 0000000..70b1f25
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/paxos/uncommitted/UncommittedTableDataTest.java
@@ -0,0 +1,650 @@
+/*
+ * 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.service.paxos.uncommitted;
+
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.UUID;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Lists;
+import com.google.common.io.Files;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.db.DecoratedKey;
+import org.apache.cassandra.dht.Range;
+import org.apache.cassandra.dht.Token;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.service.paxos.Ballot;
+import org.apache.cassandra.service.paxos.PaxosRepairHistory;
+import org.apache.cassandra.service.paxos.uncommitted.UncommittedTableData.Data;
+import org.apache.cassandra.service.paxos.uncommitted.UncommittedTableData.FilterFactory;
+import org.apache.cassandra.service.paxos.uncommitted.UncommittedTableData.FlushWriter;
+import org.apache.cassandra.service.paxos.uncommitted.UncommittedTableData.Merge;
+import org.apache.cassandra.utils.CloseableIterator;
+
+import static org.apache.cassandra.service.paxos.uncommitted.PaxosUncommittedTests.*;
+
+public class UncommittedTableDataTest
+{
+    private static final String KS = "ks";
+    private static final String TBL = "tbl";
+    private static final TableId CFID = TableId.fromUUID(UUID.randomUUID());
+
+    private static final String TBL2 = "tbl2";
+    private static final TableId CFID2 = TableId.fromUUID(UUID.randomUUID());
+
+    private File directory = null;
+
+    private static class MockDataFile
+    {
+        final File data;
+        final File crc;
+
+        public MockDataFile(File data, File crc)
+        {
+            this.data = data;
+            this.crc = crc;
+        }
+
+        boolean exists()
+        {
+            return data.exists() && crc.exists();
+        }
+
+        boolean isDeleted()
+        {
+            return !data.exists() && !crc.exists();
+        }
+    }
+
+    private static final FilterFactory NOOP_FACTORY = new FilterFactory()
+    {
+        List<Range<Token>> getReplicatedRanges()
+        {
+            return new ArrayList<>(ALL_RANGES);
+        }
+
+        PaxosRepairHistory getPaxosRepairHistory()
+        {
+            return PaxosRepairHistory.EMPTY;
+        }
+    };
+
+    private static UncommittedTableData load(File directory, TableId cfid)
+    {
+        return UncommittedTableData.load(directory, cfid, NOOP_FACTORY);
+    }
+
+    MockDataFile mockFile(String table, TableId cfid, long generation, boolean temp)
+    {
+        String fname = UncommittedDataFile.fileName(KS, table, cfid, generation) + (temp ? UncommittedDataFile.TMP_SUFFIX : "");
+        File data = new File(directory, fname);
+        File crc = new File(directory, UncommittedDataFile.crcName(fname));
+        try
+        {
+            Files.write("data", data.toJavaIOFile(), Charset.defaultCharset());
+            Files.write("crc", crc.toJavaIOFile(), Charset.defaultCharset());
+        }
+        catch (IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+
+        MockDataFile file = new MockDataFile(data, crc);
+        Assert.assertTrue(file.exists());
+        return file;
+    }
+
+    MockDataFile mockFile(long generation, boolean temp)
+    {
+        return mockFile(TBL, CFID, generation, temp);
+    }
+
+    @Before
+    public void setUp() throws Exception
+    {
+        if (directory != null)
+            FileUtils.deleteRecursive(directory);
+
+        directory = new File(Files.createTempDir());
+    }
+
+    static PaxosKeyState uncommitted(int key, Ballot ballot)
+    {
+        return new PaxosKeyState(CFID, dk(key), ballot, false);
+    }
+
+    static PaxosKeyState committed(int key, Ballot ballot)
+    {
+        return new PaxosKeyState(CFID, dk(key), ballot, true);
+    }
+
+    private static FlushWriter startFlush(UncommittedTableData tableData, List<PaxosKeyState> updates) throws IOException
+    {
+        FlushWriter writer = tableData.flushWriter();
+        writer.appendAll(updates);
+        return writer;
+    }
+
+    private static FlushWriter startFlush(UncommittedTableData tableData, PaxosKeyState... updates) throws IOException
+    {
+        return startFlush(tableData, Lists.newArrayList(updates));
+    }
+
+    private static void flush(UncommittedTableData tableData, List<PaxosKeyState> updates) throws IOException
+    {
+        startFlush(tableData, updates).finish();
+    }
+
+    private static void flush(UncommittedTableData tableData, PaxosKeyState... states) throws IOException
+    {
+        flush(tableData, Lists.newArrayList(states));
+    }
+
+    private void mergeWithUpdates(UncommittedTableData tableData, List<PaxosKeyState> toAdd) throws IOException
+    {
+        flush(tableData, toAdd);
+        tableData.createMergeTask().run();
+    }
+
+    static void assertIteratorContents(CloseableIterator<PaxosKeyState> iterator, Iterable<PaxosKeyState> expected)
+    {
+        try (CloseableIterator<PaxosKeyState> iter = iterator)
+        {
+            Assert.assertEquals(Lists.newArrayList(expected), Lists.newArrayList(iter));
+        }
+    }
+
+    static void assertFileContents(UncommittedDataFile file, int generation, List<PaxosKeyState> expected)
+    {
+        Assert.assertEquals(generation, file.generation());
+        assertIteratorContents(file.iterator(ALL_RANGES), expected);
+    }
+
+    static void assertIteratorContents(UncommittedTableData tableData, int generation, List<PaxosKeyState> expected)
+    {
+        Assert.assertEquals(generation, tableData.nextGeneration() - 1);
+        assertIteratorContents(tableData.iterator(ALL_RANGES), expected);
+    }
+
+
+    /**
+     * Test various merge scenarios
+     */
+    @Test
+    public void testMergeWriter() throws IOException
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+
+        mergeWithUpdates(tableData, kl(new PaxosKeyState(CFID, dk(3), ballots[1], false),
+                                       new PaxosKeyState(CFID, dk(5), ballots[1], false),
+                                       new PaxosKeyState(CFID, dk(7), ballots[1], false),
+                                       new PaxosKeyState(CFID, dk(9), ballots[1], false)));
+
+        assertIteratorContents(tableData, 1, kl(new PaxosKeyState(CFID, dk(3), ballots[1], false),
+                                                new PaxosKeyState(CFID, dk(5), ballots[1], false),
+                                                new PaxosKeyState(CFID, dk(7), ballots[1], false),
+                                                new PaxosKeyState(CFID, dk(9), ballots[1], false)));
+
+        // add a commit from the past for key 3, update key 5, and commit key 7
+        mergeWithUpdates(tableData, kl(new PaxosKeyState(CFID, dk(3), ballots[0], true),
+                                       new PaxosKeyState(CFID, dk(5), ballots[2], false),
+                                       new PaxosKeyState(CFID, dk(7), ballots[2], true)));
+
+        // key 7 should be gone because committed keys aren't written out
+        assertIteratorContents(tableData, 3, kl(new PaxosKeyState(CFID, dk(3), ballots[1], false),
+                                                new PaxosKeyState(CFID, dk(5), ballots[2], false),
+                                                new PaxosKeyState(CFID, dk(9), ballots[1], false)));
+
+        // add a new key and update an adjacent one
+        mergeWithUpdates(tableData, kl(new PaxosKeyState(CFID, dk(4), ballots[3], false),
+                                       new PaxosKeyState(CFID, dk(5), ballots[3], false)));
+        assertIteratorContents(tableData, 5, kl(new PaxosKeyState(CFID, dk(3), ballots[1], false),
+                                                new PaxosKeyState(CFID, dk(4), ballots[3], false),
+                                                new PaxosKeyState(CFID, dk(5), ballots[3], false),
+                                                new PaxosKeyState(CFID, dk(9), ballots[1], false)));
+
+        // add 2 new keys
+        mergeWithUpdates(tableData, kl(new PaxosKeyState(CFID, dk(6), ballots[4], false),
+                                       new PaxosKeyState(CFID, dk(7), ballots[4], false)));
+        assertIteratorContents(tableData, 7, kl(new PaxosKeyState(CFID, dk(3), ballots[1], false),
+                                                new PaxosKeyState(CFID, dk(4), ballots[3], false),
+                                                new PaxosKeyState(CFID, dk(5), ballots[3], false),
+                                                new PaxosKeyState(CFID, dk(6), ballots[4], false),
+                                                new PaxosKeyState(CFID, dk(7), ballots[4], false),
+                                                new PaxosKeyState(CFID, dk(9), ballots[1], false)));
+    }
+
+    @Test
+    public void committedOpsArentWritten() throws Exception
+    {
+        Ballot[] ballots = createBallots(2);
+
+        UncommittedTableData tableData = load(directory, CFID);
+        mergeWithUpdates(tableData, kl(new PaxosKeyState(CFID, dk(1), ballots[0], false)));
+        assertIteratorContents(tableData, 1, kl(new PaxosKeyState(CFID, dk(1), ballots[0], false)));
+
+        mergeWithUpdates(tableData, kl(new PaxosKeyState(CFID, dk(1), ballots[1], true)));
+        assertIteratorContents(tableData, 3, kl());
+    }
+
+    @Test
+    public void testIterator() throws Exception
+    {
+        Ballot[] ballots = createBallots(10);
+        List<PaxosKeyState> expected = new ArrayList<>(ballots.length);
+        UncommittedTableData tableData = load(directory, CFID);
+
+        for (int i=0; i<ballots.length; i++)
+        {
+            Ballot ballot = ballots[i];
+            DecoratedKey dk = dk(i);
+            expected.add(new PaxosKeyState(CFID, dk, ballot, false));
+        }
+
+        mergeWithUpdates(tableData, expected);
+
+        assertIteratorContents(tableData.iterator(Collections.singleton(r(null, tk(4)))), expected.subList(0, 5));
+        assertIteratorContents(tableData.iterator(Collections.singleton(r(2, 6))), expected.subList(3, 7));
+        assertIteratorContents(tableData.iterator(Collections.singleton(r(tk(7), null))), expected.subList(8, 10));
+        assertIteratorContents(tableData.iterator(Lists.newArrayList(r(0, 4), r(5, 8))),
+                               Iterables.concat(expected.subList(1, 5), expected.subList(6, 9)));
+
+
+    }
+
+    @Test
+    public void flush() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+
+        List<PaxosKeyState> updates = kl(uncommitted(3, ballots[1]),
+                                         uncommitted(5, ballots[1]),
+                                         committed(7, ballots[1]),
+                                         uncommitted(9, ballots[1]));
+        flush(tableData, updates);
+
+        Data data = tableData.data();
+        UncommittedDataFile updateFile = Iterables.getOnlyElement(data.files);
+        assertFileContents(updateFile, 0, updates);
+        assertIteratorContents(tableData.iterator(ALL_RANGES), updates);
+    }
+
+    @Test
+    public void merge() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+        flush(tableData,
+              uncommitted(3, ballots[1]),
+              committed(7, ballots[1]));
+        flush(tableData,
+              uncommitted(5, ballots[1]),
+              uncommitted(9, ballots[1]));
+
+        List<File> updateFiles = tableData.data().files.stream().map(UncommittedDataFile::file).collect(Collectors.toList());
+        Assert.assertTrue(Iterables.all(updateFiles, File::exists));
+
+        tableData.createMergeTask().run();
+
+        Assert.assertFalse(Iterables.any(updateFiles, File::exists));
+
+        Data data = tableData.data();
+        Assert.assertEquals(1, data.files.size());
+
+        List<PaxosKeyState> expected = kl(uncommitted(3, ballots[1]),
+                                          uncommitted(5, ballots[1]),
+                                          uncommitted(9, ballots[1]));
+        assertFileContents(Iterables.getOnlyElement(data.files), 2, expected);
+        assertIteratorContents(tableData.iterator(ALL_RANGES), expected);
+    }
+
+    /**
+     * nothing should break when a merge results in an empty file
+     */
+    @Test
+    public void emptyMerge() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+        flush(tableData,
+              committed(3, ballots[1]),
+              committed(7, ballots[1]));
+
+        tableData.createMergeTask().run();
+
+        Data data = tableData.data();
+
+        assertFileContents(Iterables.getOnlyElement(data.files), 1, Collections.emptyList());
+        assertIteratorContents(tableData.iterator(ALL_RANGES), Collections.emptyList());
+    }
+
+    @Test
+    public void load() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+        flush(tableData,
+              uncommitted(3, ballots[1]),
+              committed(7, ballots[1]));
+        tableData.createMergeTask().run();
+        flush(tableData,
+              uncommitted(5, ballots[1]),
+              uncommitted(9, ballots[1]));
+        List<PaxosKeyState> expected = kl(uncommitted(3, ballots[1]),
+                                          uncommitted(5, ballots[1]),
+                                          uncommitted(9, ballots[1]));
+        assertIteratorContents(tableData.iterator(ALL_RANGES), expected);
+
+        // cleanup shouldn't touch files for other tables
+        MockDataFile mockStateFile = mockFile(TBL2, CFID2, 2, false);
+        MockDataFile mockUpdateFile = mockFile(TBL2, CFID2, 3, false);
+        MockDataFile mockTempUpdate = mockFile(TBL2, CFID2, 4, true);
+
+        UncommittedTableData tableData2 = load(directory, CFID);
+        assertIteratorContents(tableData2.iterator(ALL_RANGES), expected);
+        Assert.assertTrue(mockStateFile.exists() && mockUpdateFile.exists() && mockTempUpdate.exists());
+    }
+
+    /**
+     * Shouldn't break if there wasn't a merge before shutdown
+     */
+    @Test
+    public void loadWithoutStateFile() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+
+        List<PaxosKeyState> updates = kl(uncommitted(3, ballots[1]),
+                                         uncommitted(5, ballots[1]),
+                                         committed(7, ballots[1]),
+                                         uncommitted(9, ballots[1]));
+        flush(tableData, updates);
+        assertIteratorContents(tableData.iterator(ALL_RANGES), updates);
+
+        UncommittedTableData data2 = load(directory, CFID);
+        assertIteratorContents(data2.iterator(ALL_RANGES), updates);
+    }
+
+    /**
+     * Test that incomplete update flushes are cleaned up
+     */
+    @Test
+    public void updateRecovery() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+
+        List<PaxosKeyState> updates = kl(uncommitted(3, ballots[1]),
+                                         uncommitted(5, ballots[1]),
+                                         committed(7, ballots[1]),
+                                         uncommitted(9, ballots[1]));
+        flush(tableData, updates);
+        assertIteratorContents(tableData.iterator(ALL_RANGES), updates);
+        MockDataFile tmpUpdate = mockFile(tableData.nextGeneration(), true);
+
+        UncommittedTableData tableData2 = load(directory, CFID);
+        Assert.assertEquals(1, tableData2.nextGeneration());
+        assertIteratorContents(tableData2.iterator(ALL_RANGES), updates);
+        Assert.assertTrue(tmpUpdate.isDeleted());
+    }
+
+    /**
+     * Test that incomplete state merges are cleaned up
+     */
+    @Test
+    public void stateRecovery() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+
+        List<PaxosKeyState> updates = kl(uncommitted(3, ballots[1]),
+                                         uncommitted(5, ballots[1]),
+                                         committed(7, ballots[1]),
+                                         uncommitted(9, ballots[1]));
+        flush(tableData, updates);
+        assertIteratorContents(tableData.iterator(ALL_RANGES), updates);
+        MockDataFile tmpUpdate = mockFile(tableData.nextGeneration(), true);
+
+        UncommittedTableData tableData2 = load(directory, CFID);
+        Assert.assertEquals(1, tableData2.nextGeneration());
+        assertIteratorContents(tableData2.iterator(ALL_RANGES), updates);
+        Assert.assertTrue(tmpUpdate.isDeleted());
+    }
+
+    @Test
+    public void orphanCrc() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+
+        List<PaxosKeyState> updates = kl(uncommitted(3, ballots[1]),
+                                         uncommitted(5, ballots[1]),
+                                         uncommitted(7, ballots[1]),
+                                         uncommitted(9, ballots[1]));
+        flush(tableData, updates);
+        long updateGeneration = Iterables.getOnlyElement(tableData.data().files).generation();
+        tableData.createMergeTask().run();
+        assertIteratorContents(tableData.iterator(ALL_RANGES), updates);
+
+        MockDataFile oldUpdate = mockFile(updateGeneration, false);
+        FileUtils.deleteWithConfirm(oldUpdate.data);
+        UncommittedTableData tableData2 = load(directory, CFID);
+        assertIteratorContents(tableData2.iterator(ALL_RANGES), updates);
+        Assert.assertTrue(oldUpdate.isDeleted());
+    }
+
+    @Test
+    public void referenceCountingTest() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+        flush(tableData,
+              uncommitted(3, ballots[1]),
+              committed(7, ballots[1]));
+
+        // initial state
+        UncommittedDataFile updateFile = Iterables.getOnlyElement(tableData.data().files);
+        Assert.assertEquals(0, updateFile.getActiveReaders());
+        Assert.assertFalse(updateFile.isMarkedDeleted());
+
+        // referenced state
+        CloseableIterator<PaxosKeyState> iterator = tableData.iterator(ALL_RANGES);
+        Assert.assertEquals(1, updateFile.getActiveReaders());
+        Assert.assertFalse(updateFile.isMarkedDeleted());
+
+        // marked deleted state
+        tableData.createMergeTask().run();
+        Assert.assertEquals(1, updateFile.getActiveReaders());
+        Assert.assertTrue(updateFile.isMarkedDeleted());
+        Assert.assertTrue(updateFile.file().exists());
+
+        // unreference and delete
+        iterator.close();
+        Assert.assertEquals(0, updateFile.getActiveReaders());
+        Assert.assertTrue(updateFile.isMarkedDeleted());
+        Assert.assertFalse(updateFile.file().exists());
+    }
+
+    /**
+     * Test that we don't compact update sequences with gaps. ie: we shouldn't compact update generation 4
+     * if we can't include generation 3
+     */
+    @Test
+    public void outOfOrderFlush() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+        FlushWriter pendingFlush = startFlush(tableData,
+                                              uncommitted(3, ballots[1]),
+                                              committed(7, ballots[1]));
+        Assert.assertNull(tableData.currentMerge());
+
+        flush(tableData,
+              uncommitted(5, ballots[1]),
+              uncommitted(9, ballots[1]));
+
+        // schedule a merge
+        Merge merge = tableData.createMergeTask();
+        Assert.assertFalse(!merge.dependsOnActiveFlushes());
+        Assert.assertFalse(merge.isScheduled);
+
+        // completing the first flush should cause the merge to be scheduled
+        pendingFlush.finish();
+        Assert.assertTrue(!merge.dependsOnActiveFlushes());
+        Assert.assertTrue(merge.isScheduled);
+
+        while (tableData.currentMerge() != null)
+            Thread.sleep(1);
+
+        // confirm that the merge has completed
+        Assert.assertEquals(3, tableData.nextGeneration());
+        Data data = tableData.data();
+        Assert.assertEquals(2, Iterables.getOnlyElement(data.files).generation());
+        assertIteratorContents(tableData.iterator(ALL_RANGES), kl(uncommitted(3, ballots[1]),
+                                                                  uncommitted(5, ballots[1]),
+                                                                  uncommitted(9, ballots[1])));
+    }
+
+    @Test
+    public void abortedFlush() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = load(directory, CFID);
+        FlushWriter pendingFlush = startFlush(tableData,
+                                              uncommitted(3, ballots[1]),
+                                              committed(7, ballots[1]));
+        Assert.assertNull(tableData.currentMerge());
+
+        List<PaxosKeyState> secondFlushUpdates = kl(uncommitted(5, ballots[1]),
+                                                    uncommitted(9, ballots[1]));
+        flush(tableData, secondFlushUpdates);
+        tableData.createMergeTask();
+
+        // the second flush should have triggered a merge
+        Merge merge = tableData.currentMerge();
+        Assert.assertFalse(!merge.dependsOnActiveFlushes());
+        Assert.assertFalse(merge.isScheduled);
+
+        // completing the first merge should cause the merge to be scheduled
+        pendingFlush.abort(null);
+        Assert.assertTrue(!merge.dependsOnActiveFlushes());
+        Assert.assertTrue(merge.isScheduled);
+
+        while (tableData.currentMerge() != null)
+            Thread.sleep(1);
+
+        // confirm that the merge has completed
+        Assert.assertEquals(3, tableData.nextGeneration());
+        Data data = tableData.data();
+        Assert.assertEquals(2, Iterables.getOnlyElement(data.files).generation());
+        assertIteratorContents(tableData.iterator(ALL_RANGES), secondFlushUpdates);
+    }
+
+    /**
+     * keys that aren't locally replicated shouldn't be written on merge
+     */
+    @Test
+    public void rangePurge() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = UncommittedTableData.load(directory, CFID, new FilterFactory() {
+            List<Range<Token>> getReplicatedRanges()
+            {
+                return Lists.newArrayList(new Range<>(tk(4), tk(7)));
+            }
+
+            PaxosRepairHistory getPaxosRepairHistory()
+            {
+                return PaxosRepairHistory.EMPTY;
+            }
+        });
+
+        flush(tableData, uncommitted(3, ballots[1]),
+                         uncommitted(5, ballots[1]),
+                         uncommitted(7, ballots[1]),
+                         uncommitted(9, ballots[1]));
+        tableData.createMergeTask().run();
+        assertIteratorContents(tableData.iterator(ALL_RANGES), kl(uncommitted(5, ballots[1]),
+                                                                  uncommitted(7, ballots[1])));
+    }
+
+    @Test
+    public void rangePurge2() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = UncommittedTableData.load(directory, CFID, new FilterFactory() {
+            List<Range<Token>> getReplicatedRanges()
+            {
+                return Lists.newArrayList(new Range<>(tk(4), tk(6)), new Range(tk(8), tk(10)));
+            }
+
+            PaxosRepairHistory getPaxosRepairHistory()
+            {
+                return PaxosRepairHistory.EMPTY;
+            }
+        });
+
+        flush(tableData, uncommitted(3, ballots[1]),
+              uncommitted(5, ballots[1]),
+              uncommitted(7, ballots[1]),
+              uncommitted(9, ballots[1]));
+        tableData.createMergeTask().run();
+        assertIteratorContents(tableData.iterator(ALL_RANGES), kl(uncommitted(5, ballots[1]),
+                                                                  uncommitted(9, ballots[1])));
+    }
+
+    /**
+     * ballots below the low bound should be purged
+     */
+    @Test
+    public void lowBoundPurge() throws Throwable
+    {
+        Ballot[] ballots = createBallots(5);
+        UncommittedTableData tableData = UncommittedTableData.load(directory, CFID, new FilterFactory() {
+            List<Range<Token>> getReplicatedRanges()
+            {
+                return Lists.newArrayList(ALL_RANGES);
+            }
+
+            PaxosRepairHistory getPaxosRepairHistory()
+            {
+                return PaxosRepairHistory.add(PaxosRepairHistory.EMPTY, ALL_RANGES, ballots[1]);
+            }
+        });
+
+        flush(tableData, uncommitted(3, ballots[0]),
+                         uncommitted(5, ballots[1]),
+                         uncommitted(7, ballots[2]));
+        tableData.createMergeTask().run();
+        assertIteratorContents(tableData.iterator(ALL_RANGES),  kl(uncommitted(5, ballots[1]),
+                                                                   uncommitted(7, ballots[2])));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/reads/DataResolverTest.java b/test/unit/org/apache/cassandra/service/reads/DataResolverTest.java
index 900a40f..593e3e4 100644
--- a/test/unit/org/apache/cassandra/service/reads/DataResolverTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/DataResolverTest.java
@@ -76,6 +76,8 @@
 import static org.apache.cassandra.Util.assertColumn;
 import static org.apache.cassandra.Util.assertColumns;
 import static org.apache.cassandra.db.ClusteringBound.Kind;
+import static org.apache.cassandra.db.ConsistencyLevel.ALL;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -131,7 +133,7 @@
     public void testResolveNewerSingleRow()
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         resolver.preprocess(response(command, peer1, iter(new RowUpdateBuilder(cfm, nowInSec, 0L, dk).clustering("1")
                                                                                                      .add("c1", "v1")
@@ -163,7 +165,7 @@
     public void testResolveDisjointSingleRow()
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         resolver.preprocess(response(command, peer1, iter(new RowUpdateBuilder(cfm, nowInSec, 0L, dk).clustering("1")
                                                                                                      .add("c1", "v1")
@@ -200,7 +202,7 @@
     public void testResolveDisjointMultipleRows() throws UnknownHostException
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         resolver.preprocess(response(command, peer1, iter(new RowUpdateBuilder(cfm, nowInSec, 0L, dk).clustering("1")
                                                                                                      .add("c1", "v1")
@@ -247,7 +249,7 @@
     public void testResolveDisjointMultipleRowsWithRangeTombstones()
     {
         EndpointsForRange replicas = makeReplicas(4);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
 
         RangeTombstone tombstone1 = tombstone("1", "11", 1, nowInSec);
         RangeTombstone tombstone2 = tombstone("3", "31", 1, nowInSec);
@@ -328,7 +330,7 @@
     public void testResolveWithOneEmpty()
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         resolver.preprocess(response(command, peer1, iter(new RowUpdateBuilder(cfm, nowInSec, 1L, dk).clustering("1")
                                                                                                      .add("c2", "v2")
@@ -359,7 +361,7 @@
     {
         EndpointsForRange replicas = makeReplicas(2);
         TestableReadRepair readRepair = new TestableReadRepair(command);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         resolver.preprocess(response(command, replicas.get(0).endpoint(), EmptyIterators.unfilteredPartition(cfm)));
         resolver.preprocess(response(command, replicas.get(1).endpoint(), EmptyIterators.unfilteredPartition(cfm)));
 
@@ -375,7 +377,7 @@
     public void testResolveDeleted()
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         // one response with columns timestamped before a delete in another response
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         resolver.preprocess(response(command, peer1, iter(new RowUpdateBuilder(cfm, nowInSec, 0L, dk).clustering("1")
@@ -401,7 +403,7 @@
     public void testResolveMultipleDeleted()
     {
         EndpointsForRange replicas = makeReplicas(4);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         // deletes and columns with interleaved timestamp, with out of order return sequence
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         resolver.preprocess(response(command, peer1, fullPartitionDelete(cfm, dk, 0, nowInSec)));
@@ -486,7 +488,7 @@
     private void resolveRangeTombstonesOnBoundary(long timestamp1, long timestamp2)
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         InetAddressAndPort peer2 = replicas.get(1).endpoint();
 
@@ -560,7 +562,7 @@
     private void testRepairRangeTombstoneBoundary(int timestamp1, int timestamp2, int timestamp3) throws UnknownHostException
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         InetAddressAndPort peer2 = replicas.get(1).endpoint();
 
@@ -613,7 +615,7 @@
     {
         EndpointsForRange replicas = makeReplicas(2);
 
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         InetAddressAndPort peer2 = replicas.get(1).endpoint();
 
@@ -652,7 +654,7 @@
     public void testRepairRangeTombstoneWithPartitionDeletion2()
     {
         EndpointsForRange replicas = makeReplicas(2);
-        DataResolver resolver = new DataResolver(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(command, plan(replicas, ALL), readRepair, nanoTime());
         InetAddressAndPort peer1 = replicas.get(0).endpoint();
         InetAddressAndPort peer2 = replicas.get(1).endpoint();
 
@@ -736,7 +738,7 @@
         EndpointsForRange replicas = makeReplicas(2);
         ReadCommand cmd = Util.cmd(cfs2, dk).withNowInSeconds(nowInSec).build();
         TestableReadRepair readRepair = new TestableReadRepair(cmd);
-        DataResolver resolver = new DataResolver(cmd, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(cmd, plan(replicas, ALL), readRepair, nanoTime());
 
         long[] ts = {100, 200};
 
@@ -788,7 +790,7 @@
         EndpointsForRange replicas = makeReplicas(2);
         ReadCommand cmd = Util.cmd(cfs2, dk).withNowInSeconds(nowInSec).build();
         TestableReadRepair readRepair = new TestableReadRepair(cmd);
-        DataResolver resolver = new DataResolver(cmd, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(cmd, plan(replicas, ALL), readRepair, nanoTime());
 
         long[] ts = {100, 200};
 
@@ -832,7 +834,7 @@
         EndpointsForRange replicas = makeReplicas(2);
         ReadCommand cmd = Util.cmd(cfs2, dk).withNowInSeconds(nowInSec).build();
         TestableReadRepair readRepair = new TestableReadRepair(cmd);
-        DataResolver resolver = new DataResolver(cmd, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(cmd, plan(replicas, ALL), readRepair, nanoTime());
 
         long[] ts = {100, 200};
 
@@ -882,7 +884,7 @@
         EndpointsForRange replicas = makeReplicas(2);
         ReadCommand cmd = Util.cmd(cfs2, dk).withNowInSeconds(nowInSec).build();
         TestableReadRepair readRepair = new TestableReadRepair(cmd);
-        DataResolver resolver = new DataResolver(cmd, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime());
+        DataResolver resolver = new DataResolver(cmd, plan(replicas, ALL), readRepair, nanoTime());
 
         long[] ts = {100, 200};
 
@@ -938,7 +940,7 @@
         verifier.expectDigest(peer1, digest1, true);
         verifier.expectDigest(peer2, digest1, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, true, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, true, command));
@@ -958,7 +960,7 @@
         verifier.expectDigest(peer1, digest1, false);
         verifier.expectDigest(peer2, digest1, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, true, command));
@@ -978,7 +980,7 @@
         verifier.expectDigest(peer1, digest1, false);
         verifier.expectDigest(peer2, digest1, false);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(), verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
@@ -998,7 +1000,7 @@
         verifier.expectDigest(peer1, digest1, true);
         verifier.expectDigest(peer2, digest1, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(), verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm,dk)), digest1, true, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, true, command));
@@ -1018,7 +1020,7 @@
         verifier.expectDigest(peer1, digest1, true);
         verifier.expectDigest(peer2, digest1, false);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(), verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm,dk)), digest1, true, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
@@ -1038,7 +1040,7 @@
         verifier.expectDigest(peer1, digest1, false);
         verifier.expectDigest(peer2, digest1, false);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
@@ -1059,7 +1061,7 @@
         verifier.expectDigest(peer1, digest1, true);
         verifier.expectDigest(peer2, digest1, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(new RowUpdateBuilder(cfm, nowInSec, 1L, dk).clustering("1") .buildUpdate()), digest1, true, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, true, command));
@@ -1080,7 +1082,7 @@
         verifier.expectDigest(peer1, digest1, true);
         verifier.expectDigest(peer2, digest2, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, true, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest2, true, command));
@@ -1101,7 +1103,7 @@
         verifier.expectDigest(peer1, digest1, false);
         verifier.expectDigest(peer2, digest2, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest2, true, command));
@@ -1122,7 +1124,7 @@
         verifier.expectDigest(peer1, digest1, false);
         verifier.expectDigest(peer2, digest2, false);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest1, false, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest2, false, command));
@@ -1143,7 +1145,7 @@
         verifier.expectDigest(peer1, digest1, true);
         verifier.expectDigest(peer2, digest2, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(new RowUpdateBuilder(cfm, nowInSec, 1L, dk).clustering("1") .buildUpdate()), digest1, true, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm, dk)), digest2, true, command));
@@ -1163,7 +1165,7 @@
         TestRepairedDataVerifier verifier = new TestRepairedDataVerifier();
         verifier.expectDigest(peer1, digest1, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm,dk)), digest1, true, command));
 
@@ -1185,7 +1187,7 @@
         InetAddressAndPort peer2 = replicas.get(1).endpoint();
         verifier.expectDigest(peer1, digest1, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm,dk)), digest1, true, command));
         // peer2 is advertising an older version, so when we deserialize its response there are two things to note:
@@ -1217,7 +1219,7 @@
         InetAddressAndPort peer2 = replicas.get(1).endpoint();
         verifier.expectDigest(peer1, digest1, true);
 
-        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ConsistencyLevel.ALL), readRepair, System.nanoTime(),  verifier);
+        DataResolver resolver = resolverWithVerifier(command, plan(replicas, ALL), readRepair, nanoTime(), verifier);
 
         resolver.preprocess(response(peer1, iter(PartitionUpdate.emptyUpdate(cfm,dk)), digest1, true, command));
         resolver.preprocess(response(peer2, iter(PartitionUpdate.emptyUpdate(cfm,dk)), digest2, true, command));
diff --git a/test/unit/org/apache/cassandra/service/reads/ReadExecutorTest.java b/test/unit/org/apache/cassandra/service/reads/ReadExecutorTest.java
index 6fc8fbf..6f6bf36 100644
--- a/test/unit/org/apache/cassandra/service/reads/ReadExecutorTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/ReadExecutorTest.java
@@ -45,8 +45,11 @@
 import org.apache.cassandra.net.Verb;
 import org.apache.cassandra.schema.KeyspaceParams;
 
+import static java.util.concurrent.TimeUnit.DAYS;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.db.ConsistencyLevel.LOCAL_QUORUM;
 import static org.apache.cassandra.locator.ReplicaUtils.full;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
 import static org.junit.Assert.assertTrue;
@@ -72,7 +75,7 @@
                 full(InetAddressAndPort.getByName("127.0.0.254")),
                 full(InetAddressAndPort.getByName("127.0.0.253"))
         );
-        cfs.sampleReadLatencyNanos = 0;
+        cfs.sampleReadLatencyMicros = 0;
     }
 
     @Before
@@ -92,7 +95,7 @@
     {
         assertEquals(0, cfs.metric.speculativeInsufficientReplicas.getCount());
         assertEquals(0, ks.metric.speculativeInsufficientReplicas.getCount());
-        AbstractReadExecutor executor = new AbstractReadExecutor.NeverSpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(), plan(targets, ConsistencyLevel.LOCAL_QUORUM), System.nanoTime(), true);
+        AbstractReadExecutor executor = new AbstractReadExecutor.NeverSpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(), plan(targets, LOCAL_QUORUM), nanoTime(), true);
         executor.maybeTryAdditionalReplicas();
         try
         {
@@ -107,7 +110,7 @@
         assertEquals(1, ks.metric.speculativeInsufficientReplicas.getCount());
 
         //Shouldn't increment
-        executor = new AbstractReadExecutor.NeverSpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(), plan(targets, ConsistencyLevel.LOCAL_QUORUM), System.nanoTime(), false);
+        executor = new AbstractReadExecutor.NeverSpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(), plan(targets, LOCAL_QUORUM), nanoTime(), false);
         executor.maybeTryAdditionalReplicas();
         try
         {
@@ -133,7 +136,7 @@
         assertEquals(0, cfs.metric.speculativeFailedRetries.getCount());
         assertEquals(0, ks.metric.speculativeRetries.getCount());
         assertEquals(0, ks.metric.speculativeFailedRetries.getCount());
-        AbstractReadExecutor executor = new AbstractReadExecutor.SpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(TimeUnit.DAYS.toMillis(365)), plan(ConsistencyLevel.LOCAL_QUORUM, targets, targets.subList(0, 2)), System.nanoTime());
+        AbstractReadExecutor executor = new AbstractReadExecutor.SpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(DAYS.toMillis(365)), plan(LOCAL_QUORUM, targets, targets.subList(0, 2)), nanoTime());
         executor.maybeTryAdditionalReplicas();
         new Thread()
         {
@@ -174,7 +177,7 @@
         assertEquals(0, cfs.metric.speculativeFailedRetries.getCount());
         assertEquals(0, ks.metric.speculativeRetries.getCount());
         assertEquals(0, ks.metric.speculativeFailedRetries.getCount());
-        AbstractReadExecutor executor = new AbstractReadExecutor.SpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(), plan(ConsistencyLevel.LOCAL_QUORUM, targets, targets.subList(0, 2)), System.nanoTime());
+        AbstractReadExecutor executor = new AbstractReadExecutor.SpeculatingReadExecutor(cfs, new MockSinglePartitionReadCommand(), plan(LOCAL_QUORUM, targets, targets.subList(0, 2)), nanoTime());
         executor.maybeTryAdditionalReplicas();
         try
         {
@@ -200,13 +203,13 @@
     {
         MockSinglePartitionReadCommand command = new MockSinglePartitionReadCommand(TimeUnit.DAYS.toMillis(365));
         ReplicaPlan.ForTokenRead plan = plan(ConsistencyLevel.LOCAL_ONE, targets, targets.subList(0, 1));
-        AbstractReadExecutor executor = new AbstractReadExecutor.SpeculatingReadExecutor(cfs, command, plan, System.nanoTime());
+        AbstractReadExecutor executor = new AbstractReadExecutor.SpeculatingReadExecutor(cfs, command, plan, nanoTime());
 
         // Issue an initial request against the first endpoint...
         executor.executeAsync();
 
         // ...and then force a speculative retry against another endpoint.
-        cfs.sampleReadLatencyNanos = 0L;
+        cfs.sampleReadLatencyMicros = 0L;
         executor.maybeTryAdditionalReplicas();
 
         new Thread(() ->
@@ -246,7 +249,7 @@
 
         MockSinglePartitionReadCommand(long timeout)
         {
-            super(false, 0, false, cfs.metadata(), 0, null, null, null, Util.dk("ry@n_luvs_teh_y@nk33z"), null, null);
+            super(false, 0, false, cfs.metadata(), 0, null, null, null, Util.dk("ry@n_luvs_teh_y@nk33z"), null, null, false);
             this.timeout = timeout;
         }
 
diff --git a/test/unit/org/apache/cassandra/service/reads/SpeculativeRetryParseTest.java b/test/unit/org/apache/cassandra/service/reads/SpeculativeRetryParseTest.java
index 86b307e..dca62f6 100644
--- a/test/unit/org/apache/cassandra/service/reads/SpeculativeRetryParseTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/SpeculativeRetryParseTest.java
@@ -150,4 +150,4 @@
             SpeculativeRetryPolicy.fromString(string);
         }
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/service/reads/range/RangeCommandIteratorTest.java b/test/unit/org/apache/cassandra/service/reads/range/RangeCommandIteratorTest.java
index d82a503..2542202 100644
--- a/test/unit/org/apache/cassandra/service/reads/range/RangeCommandIteratorTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/range/RangeCommandIteratorTest.java
@@ -42,6 +42,7 @@
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.utils.CloseableIterator;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 
 public class RangeCommandIteratorTest
@@ -97,34 +98,34 @@
             builder.add("val", String.valueOf(i));
             builder.build().applyUnsafe();
         }
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         PartitionRangeReadCommand command = (PartitionRangeReadCommand) Util.cmd(cfs).build();
         AbstractBounds<PartitionPosition> keyRange = command.dataRange().keyRange();
 
         // without range merger, there will be 2 batches requested: 1st batch with 1 range and 2nd batch with remaining ranges
         CloseableIterator<ReplicaPlan.ForRangeRead> replicaPlans = replicaPlanIterator(keyRange, keyspace, false);
-        RangeCommandIterator data = new RangeCommandIterator(replicaPlans, command, 1, 1000, vnodeCount, System.nanoTime());
+        RangeCommandIterator data = new RangeCommandIterator(replicaPlans, command, 1, 1000, vnodeCount, nanoTime());
         verifyRangeCommandIterator(data, rows, 2, vnodeCount);
 
         // without range merger and initial cf=5, there will be 1 batches requested: 5 vnode ranges for 1st batch
         replicaPlans = replicaPlanIterator(keyRange, keyspace, false);
-        data = new RangeCommandIterator(replicaPlans, command, vnodeCount, 1000, vnodeCount, System.nanoTime());
+        data = new RangeCommandIterator(replicaPlans, command, vnodeCount, 1000, vnodeCount, nanoTime());
         verifyRangeCommandIterator(data, rows, 1, vnodeCount);
 
         // without range merger and max cf=1, there will be 5 batches requested: 1 vnode range per batch
         replicaPlans = replicaPlanIterator(keyRange, keyspace, false);
-        data = new RangeCommandIterator(replicaPlans, command, 1, 1, vnodeCount, System.nanoTime());
+        data = new RangeCommandIterator(replicaPlans, command, 1, 1, vnodeCount, nanoTime());
         verifyRangeCommandIterator(data, rows, vnodeCount, vnodeCount);
 
         // with range merger, there will be only 1 batch requested, as all ranges share the same replica - localhost
         replicaPlans = replicaPlanIterator(keyRange, keyspace, true);
-        data = new RangeCommandIterator(replicaPlans, command, 1, 1000, vnodeCount, System.nanoTime());
+        data = new RangeCommandIterator(replicaPlans, command, 1, 1000, vnodeCount, nanoTime());
         verifyRangeCommandIterator(data, rows, 1, vnodeCount);
 
         // with range merger and max cf=1, there will be only 1 batch requested, as all ranges share the same replica - localhost
         replicaPlans = replicaPlanIterator(keyRange, keyspace, true);
-        data = new RangeCommandIterator(replicaPlans, command, 1, 1, vnodeCount, System.nanoTime());
+        data = new RangeCommandIterator(replicaPlans, command, 1, 1, vnodeCount, nanoTime());
         verifyRangeCommandIterator(data, rows, 1, vnodeCount);
     }
 
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 294be2a..259a65f 100644
--- a/test/unit/org/apache/cassandra/service/reads/range/RangeCommandsTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/range/RangeCommandsTest.java
@@ -39,6 +39,7 @@
 import org.apache.cassandra.schema.IndexMetadata;
 
 import static org.apache.cassandra.db.ConsistencyLevel.ONE;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 
 /**
@@ -73,7 +74,7 @@
 
         // verify that a low concurrency factor is not capped by the max concurrency factor
         PartitionRangeReadCommand command = command(cfs, 50, 50);
-        try (RangeCommandIterator partitions = RangeCommands.rangeCommandIterator(command, ONE, System.nanoTime());
+        try (RangeCommandIterator partitions = RangeCommands.rangeCommandIterator(command, ONE, nanoTime());
              ReplicaPlanIterator ranges = new ReplicaPlanIterator(command.dataRange().keyRange(), keyspace, ONE))
         {
             assertEquals(2, partitions.concurrencyFactor());
@@ -83,7 +84,7 @@
 
         // verify that a high concurrency factor is capped by the max concurrency factor
         command = command(cfs, 1000, 50);
-        try (RangeCommandIterator partitions = RangeCommands.rangeCommandIterator(command, ONE, System.nanoTime());
+        try (RangeCommandIterator partitions = RangeCommands.rangeCommandIterator(command, ONE, nanoTime());
              ReplicaPlanIterator ranges = new ReplicaPlanIterator(command.dataRange().keyRange(), keyspace, ONE))
         {
             assertEquals(MAX_CONCURRENCY_FACTOR, partitions.concurrencyFactor());
@@ -93,7 +94,7 @@
 
         // with 0 estimated results per range the concurrency factor should be 1
         command = command(cfs, 1000, 0);
-        try (RangeCommandIterator partitions = RangeCommands.rangeCommandIterator(command, ONE, System.nanoTime());
+        try (RangeCommandIterator partitions = RangeCommands.rangeCommandIterator(command, ONE, nanoTime());
              ReplicaPlanIterator ranges = new ReplicaPlanIterator(command.dataRange().keyRange(), keyspace, ONE))
         {
             assertEquals(1, partitions.concurrencyFactor());
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/AbstractReadRepairTest.java b/test/unit/org/apache/cassandra/service/reads/repair/AbstractReadRepairTest.java
index d36808f..bb10c67 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/AbstractReadRepairTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/AbstractReadRepairTest.java
@@ -71,7 +71,7 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.Tables;
 import org.apache.cassandra.service.StorageService;
@@ -80,6 +80,7 @@
 import static org.apache.cassandra.locator.Replica.fullReplica;
 import static org.apache.cassandra.locator.ReplicaUtils.FULL_RANGE;
 import static org.apache.cassandra.net.Verb.INTERNAL_RSP;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 @Ignore
 public abstract  class AbstractReadRepairTest
@@ -96,9 +97,9 @@
     static Replica replica2;
     static Replica replica3;
     static EndpointsForRange replicas;
-    static ReplicaPlan.ForRead<?> replicaPlan;
+    static ReplicaPlan.ForRead<?, ?> replicaPlan;
 
-    static long now = TimeUnit.NANOSECONDS.toMicros(System.nanoTime());
+    static long now = TimeUnit.NANOSECONDS.toMicros(nanoTime());
     static DecoratedKey key;
     static Cell<?> cell1;
     static Cell<?> cell2;
@@ -222,13 +223,13 @@
         cfm = CreateTableStatement.parse(ddl, ksName).build();
         assert cfm.params.readRepair == repairStrategy;
         KeyspaceMetadata ksm = KeyspaceMetadata.create(ksName, KeyspaceParams.simple(3), Tables.of(cfm));
-        MigrationManager.announceNewKeyspace(ksm, false);
+        SchemaTestUtil.announceNewKeyspace(ksm);
 
         ks = Keyspace.open(ksName);
         cfs = ks.getColumnFamilyStore("tbl");
 
-        cfs.sampleReadLatencyNanos = 0;
-        cfs.additionalWriteLatencyNanos = 0;
+        cfs.sampleReadLatencyMicros = 0;
+        cfs.additionalWriteLatencyMicros = 0;
 
         target1 = InetAddressAndPort.getByName("127.0.0.255");
         target2 = InetAddressAndPort.getByName("127.0.0.254");
@@ -273,8 +274,8 @@
     {
         assert configured : "configureClass must be called in a @BeforeClass method";
 
-        cfs.sampleReadLatencyNanos = 0;
-        cfs.additionalWriteLatencyNanos = 0;
+        cfs.sampleReadLatencyMicros = 0;
+        cfs.additionalWriteLatencyMicros = 0;
     }
 
     static ReplicaPlan.ForRangeRead replicaPlan(ConsistencyLevel consistencyLevel, EndpointsForRange replicas)
@@ -282,17 +283,17 @@
         return replicaPlan(ks, consistencyLevel, replicas, replicas);
     }
 
-    static ReplicaPlan.ForTokenWrite repairPlan(ReplicaPlan.ForRangeRead readPlan)
+    static ReplicaPlan.ForWrite repairPlan(ReplicaPlan.ForRangeRead readPlan)
     {
-        return repairPlan(readPlan, readPlan.candidates());
+        return repairPlan(readPlan, readPlan.readCandidates());
     }
 
-    static ReplicaPlan.ForTokenWrite repairPlan(EndpointsForRange liveAndDown, EndpointsForRange targets)
+    static ReplicaPlan.ForWrite repairPlan(EndpointsForRange liveAndDown, EndpointsForRange targets)
     {
         return repairPlan(replicaPlan(liveAndDown, targets), liveAndDown);
     }
 
-    static ReplicaPlan.ForTokenWrite repairPlan(ReplicaPlan.ForRangeRead readPlan, EndpointsForRange liveAndDown)
+    static ReplicaPlan.ForWrite repairPlan(ReplicaPlan.ForRangeRead readPlan, EndpointsForRange liveAndDown)
     {
         Token token = readPlan.range().left.getToken();
         EndpointsForToken pending = EndpointsForToken.empty(token);
@@ -320,7 +321,7 @@
 
     public InstrumentedReadRepair createInstrumentedReadRepair(ReplicaPlan.Shared<?, ?> replicaPlan)
     {
-        return createInstrumentedReadRepair(command, replicaPlan, System.nanoTime());
+        return createInstrumentedReadRepair(command, replicaPlan, nanoTime());
 
     }
 
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/BlockingReadRepairTest.java b/test/unit/org/apache/cassandra/service/reads/repair/BlockingReadRepairTest.java
index 43a1275..3a938a2 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/BlockingReadRepairTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/BlockingReadRepairTest.java
@@ -43,12 +43,15 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.service.reads.ReadCallback;
 
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class BlockingReadRepairTest extends AbstractReadRepairTest
 {
     private static class InstrumentedReadRepairHandler
             extends BlockingPartitionRepair
     {
-        public InstrumentedReadRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForTokenWrite writePlan)
+        public InstrumentedReadRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForWrite writePlan)
         {
             super(Util.dk("not a real usable value"), repairs, writePlan, e -> targets.contains(e));
         }
@@ -67,7 +70,7 @@
         configureClass(ReadRepairStrategy.BLOCKING);
     }
 
-    private static InstrumentedReadRepairHandler createRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForTokenWrite writePlan)
+    private static InstrumentedReadRepairHandler createRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForWrite writePlan)
     {
         return new InstrumentedReadRepairHandler(repairs, writePlan);
     }
@@ -78,7 +81,7 @@
         return createRepairHandler(repairs, repairPlan(replicas, replicas));
     }
 
-    private static class InstrumentedBlockingReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+    private static class InstrumentedBlockingReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
             extends BlockingReadRepair<E, P> implements InstrumentedReadRepair<E, P>
     {
         public InstrumentedBlockingReadRepair(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
@@ -140,7 +143,7 @@
         repairs.put(replica1, repair1);
         repairs.put(replica2, repair2);
 
-        ReplicaPlan.ForTokenWrite writePlan = repairPlan(replicas, EndpointsForRange.copyOf(Lists.newArrayList(repairs.keySet())));
+        ReplicaPlan.ForWrite writePlan = repairPlan(replicas, EndpointsForRange.copyOf(Lists.newArrayList(repairs.keySet())));
         InstrumentedReadRepairHandler handler = createRepairHandler(repairs, writePlan);
 
         Assert.assertTrue(handler.mutationsSent.isEmpty());
@@ -266,7 +269,7 @@
         repairs.put(remote1, mutation(cell1));
 
         EndpointsForRange participants = EndpointsForRange.of(replica1, replica2, remote1, remote2);
-        ReplicaPlan.ForTokenWrite writePlan = repairPlan(replicaPlan(ks, ConsistencyLevel.LOCAL_QUORUM, participants));
+        ReplicaPlan.ForWrite writePlan = repairPlan(replicaPlan(ks, ConsistencyLevel.LOCAL_QUORUM, participants));
         InstrumentedReadRepairHandler handler = createRepairHandler(repairs, writePlan);
         handler.sendInitialRepairs();
         Assert.assertEquals(2, handler.mutationsSent.size());
@@ -287,6 +290,6 @@
 
     private boolean getCurrentRepairStatus(BlockingPartitionRepair handler)
     {
-        return handler.awaitRepairsUntil(System.nanoTime(), TimeUnit.NANOSECONDS);
+        return handler.awaitRepairsUntil(nanoTime(), NANOSECONDS);
     }
 }
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/DiagEventsBlockingReadRepairTest.java b/test/unit/org/apache/cassandra/service/reads/repair/DiagEventsBlockingReadRepairTest.java
index ae83efb..8399c83 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/DiagEventsBlockingReadRepairTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/DiagEventsBlockingReadRepairTest.java
@@ -49,6 +49,9 @@
 import org.apache.cassandra.service.reads.ReadCallback;
 import org.apache.cassandra.service.reads.repair.ReadRepairEvent.ReadRepairEventType;
 
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 /**
  * Variation of {@link BlockingReadRepair} using diagnostic events instead of instrumentation for test validation.
  */
@@ -82,7 +85,7 @@
         repairs.put(replica2, repair2);
 
 
-        ReplicaPlan.ForTokenWrite writePlan = repairPlan(replicas, EndpointsForRange.copyOf(Lists.newArrayList(repairs.keySet())));
+        ReplicaPlan.ForWrite writePlan = repairPlan(replicas, EndpointsForRange.copyOf(Lists.newArrayList(repairs.keySet())));
         DiagnosticPartitionReadRepairHandler handler = createRepairHandler(repairs, writePlan);
 
         Assert.assertTrue(handler.updatesByEp.isEmpty());
@@ -110,7 +113,7 @@
 
     private boolean getCurrentRepairStatus(BlockingPartitionRepair handler)
     {
-        return handler.awaitRepairsUntil(System.nanoTime(), TimeUnit.NANOSECONDS);
+        return handler.awaitRepairsUntil(nanoTime(), NANOSECONDS);
     }
 
     public InstrumentedReadRepair createInstrumentedReadRepair(ReadCommand command, ReplicaPlan.Shared<?,?> replicaPlan, long queryStartNanoTime)
@@ -118,7 +121,7 @@
         return new DiagnosticBlockingRepairHandler(command, replicaPlan, queryStartNanoTime);
     }
 
-    private static DiagnosticPartitionReadRepairHandler createRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForTokenWrite writePlan)
+    private static DiagnosticPartitionReadRepairHandler createRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForWrite writePlan)
     {
         return new DiagnosticPartitionReadRepairHandler(key, repairs, writePlan);
     }
@@ -165,7 +168,7 @@
         }
     }
 
-    private static class DiagnosticPartitionReadRepairHandler<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+    private static class DiagnosticPartitionReadRepairHandler<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
             extends BlockingPartitionRepair
     {
         private final Map<InetAddressAndPort, String> updatesByEp = new HashMap<>();
@@ -176,7 +179,7 @@
             return e -> candidates.contains(e);
         }
 
-        DiagnosticPartitionReadRepairHandler(DecoratedKey key, Map<Replica, Mutation> repairs, ReplicaPlan.ForTokenWrite writePlan)
+        DiagnosticPartitionReadRepairHandler(DecoratedKey key, Map<Replica, Mutation> repairs, ReplicaPlan.ForWrite writePlan)
         {
             super(key, repairs, writePlan, isLocal());
             DiagnosticEventService.instance().subscribe(PartitionRepairEvent.class, this::onRepairEvent);
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/InstrumentedReadRepair.java b/test/unit/org/apache/cassandra/service/reads/repair/InstrumentedReadRepair.java
index 81ab07e..f9bbea9 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/InstrumentedReadRepair.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/InstrumentedReadRepair.java
@@ -22,14 +22,13 @@
 
 import org.apache.cassandra.locator.Endpoints;
 import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.locator.ReplicaLayout;
 import org.apache.cassandra.locator.ReplicaPlan;
 import org.apache.cassandra.service.reads.ReadCallback;
 
-public interface InstrumentedReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+public interface InstrumentedReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
         extends ReadRepair<E, P>
 {
     Set<InetAddressAndPort> getReadRecipients();
 
-    ReadCallback getReadCallback();
+    ReadCallback<E, P> getReadCallback();
 }
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepairTest.java b/test/unit/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepairTest.java
index 5ea790b..82bb8de 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepairTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/ReadOnlyReadRepairTest.java
@@ -32,12 +32,11 @@
 import org.apache.cassandra.locator.Endpoints;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
-import org.apache.cassandra.locator.ReplicaLayout;
 import org.apache.cassandra.service.reads.ReadCallback;
 
 public class ReadOnlyReadRepairTest extends AbstractReadRepairTest
 {
-    private static class InstrumentedReadOnlyReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+    private static class InstrumentedReadOnlyReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
             extends ReadOnlyReadRepair implements InstrumentedReadRepair
     {
         public InstrumentedReadOnlyReadRepair(ReadCommand command, ReplicaPlan.Shared<E, P> replicaPlan, long queryStartNanoTime)
@@ -93,7 +92,7 @@
     public void repairPartitionFailure()
     {
         ReplicaPlan.SharedForRangeRead readPlan = ReplicaPlan.shared(replicaPlan(replicas, replicas));
-        ReplicaPlan.ForTokenWrite writePlan = repairPlan(replicas, replicas);
+        ReplicaPlan.ForWrite writePlan = repairPlan(replicas, replicas);
         InstrumentedReadRepair repair = createInstrumentedReadRepair(readPlan);
         repair.repairPartition(null, Collections.emptyMap(), writePlan);
     }
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/ReadRepairTest.java b/test/unit/org/apache/cassandra/service/reads/repair/ReadRepairTest.java
index dad9aa4..8b5b2c1 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/ReadRepairTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/ReadRepairTest.java
@@ -53,12 +53,14 @@
 import org.apache.cassandra.net.Message;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
-import org.apache.cassandra.schema.MigrationManager;
+import org.apache.cassandra.schema.SchemaTestUtil;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.Tables;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static java.util.concurrent.TimeUnit.NANOSECONDS;
 import static org.apache.cassandra.locator.ReplicaUtils.full;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class ReadRepairTest
 {
@@ -70,10 +72,10 @@
     static Replica target3;
     static EndpointsForRange targets;
 
-    private static class InstrumentedReadRepairHandler<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+    private static class InstrumentedReadRepairHandler<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
             extends BlockingPartitionRepair
     {
-        public InstrumentedReadRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForTokenWrite writePlan)
+        public InstrumentedReadRepairHandler(Map<Replica, Mutation> repairs, ReplicaPlan.ForWrite writePlan)
         {
             super(Util.dk("not a valid key"), repairs, writePlan, e -> targets.endpoints().contains(e));
         }
@@ -86,7 +88,7 @@
         }
     }
 
-    static long now = TimeUnit.NANOSECONDS.toMicros(System.nanoTime());
+    static long now = TimeUnit.NANOSECONDS.toMicros(nanoTime());
     static DecoratedKey key;
     static Cell<?> cell1;
     static Cell<?> cell2;
@@ -117,12 +119,12 @@
 
         cfm = CreateTableStatement.parse("CREATE TABLE tbl (k int primary key, v text)", ksName).build();
         KeyspaceMetadata ksm = KeyspaceMetadata.create(ksName, KeyspaceParams.simple(3), Tables.of(cfm));
-        MigrationManager.announceNewKeyspace(ksm, false);
+        SchemaTestUtil.announceNewKeyspace(ksm);
 
         ks = Keyspace.open(ksName);
         cfs = ks.getColumnFamilyStore("tbl");
 
-        cfs.sampleReadLatencyNanos = 0;
+        cfs.sampleReadLatencyMicros = 0;
 
         target1 = full(InetAddressAndPort.getByName("127.0.0.255"));
         target2 = full(InetAddressAndPort.getByName("127.0.0.254"));
@@ -162,7 +164,7 @@
     private static InstrumentedReadRepairHandler createRepairHandler(Map<Replica, Mutation> repairs, EndpointsForRange all, EndpointsForRange targets)
     {
         ReplicaPlan.ForRangeRead readPlan = AbstractReadRepairTest.replicaPlan(ks, ConsistencyLevel.LOCAL_QUORUM, all, targets);
-        ReplicaPlan.ForTokenWrite writePlan = AbstractReadRepairTest.repairPlan(readPlan);
+        ReplicaPlan.ForWrite writePlan = AbstractReadRepairTest.repairPlan(readPlan);
         return new InstrumentedReadRepairHandler(repairs, writePlan);
     }
 
@@ -348,6 +350,6 @@
 
     private boolean getCurrentRepairStatus(BlockingPartitionRepair handler)
     {
-        return handler.awaitRepairsUntil(System.nanoTime(), TimeUnit.NANOSECONDS);
+        return handler.awaitRepairsUntil(nanoTime(), NANOSECONDS);
     }
 }
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/RepairedDataVerifierTest.java b/test/unit/org/apache/cassandra/service/reads/repair/RepairedDataVerifierTest.java
index 169e09d..592bff8 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/RepairedDataVerifierTest.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/RepairedDataVerifierTest.java
@@ -287,7 +287,8 @@
                   DataLimits.NONE,
                   metadata.partitioner.decorateKey(ByteBufferUtil.bytes(key)),
                   new ClusteringIndexSliceFilter(Slices.ALL, false),
-                  null);
+                  null,
+                  false);
         }
     }
 }
diff --git a/test/unit/org/apache/cassandra/service/reads/repair/TestableReadRepair.java b/test/unit/org/apache/cassandra/service/reads/repair/TestableReadRepair.java
index 84276d5..eecd106 100644
--- a/test/unit/org/apache/cassandra/service/reads/repair/TestableReadRepair.java
+++ b/test/unit/org/apache/cassandra/service/reads/repair/TestableReadRepair.java
@@ -23,7 +23,6 @@
 import java.util.Map;
 import java.util.function.Consumer;
 
-import org.apache.cassandra.db.ConsistencyLevel;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.ReadCommand;
@@ -35,11 +34,10 @@
 import org.apache.cassandra.locator.Endpoints;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.Replica;
-import org.apache.cassandra.locator.ReplicaLayout;
 import org.apache.cassandra.locator.ReplicaPlan;
 import org.apache.cassandra.service.reads.DigestResolver;
 
-public class TestableReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E>>
+public class TestableReadRepair<E extends Endpoints<E>, P extends ReplicaPlan.ForRead<E, P>>
         implements ReadRepair<E, P>
 {
     public final Map<InetAddressAndPort, Mutation> sent = new HashMap<>();
@@ -113,7 +111,7 @@
     }
 
     @Override
-    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForTokenWrite writePlan)
+    public void repairPartition(DecoratedKey partitionKey, Map<Replica, Mutation> mutations, ReplicaPlan.ForWrite writePlan)
     {
         for (Map.Entry<Replica, Mutation> entry: mutations.entrySet())
             sent.put(entry.getKey().endpoint(), entry.getValue());
@@ -128,4 +126,4 @@
     {
         return partitionListenerClosed && rowListenerClosed;
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/service/reads/thresholds/WarningsSnapshotTest.java b/test/unit/org/apache/cassandra/service/reads/thresholds/WarningsSnapshotTest.java
new file mode 100644
index 0000000..2102b0b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/reads/thresholds/WarningsSnapshotTest.java
@@ -0,0 +1,187 @@
+/*
+ * 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.service.reads.thresholds;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.quicktheories.core.Gen;
+import org.quicktheories.generators.SourceDSL;
+import org.quicktheories.impl.Constraint;
+
+import static org.apache.cassandra.service.reads.thresholds.WarningsSnapshot.*;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.quicktheories.QuickTheory.qt;
+
+public class WarningsSnapshotTest
+{
+    private static final InetAddressAndPort HOME = address(127, 0, 0, 1);
+    private static final InetAddressAndPort VACATION_HOME = address(127, 0, 0, 2);
+
+    @Test
+    public void staticMergeEmtpy()
+    {
+        WarningsSnapshot result = merge(null, empty(), null, empty());
+        assertThat(result).isNull();
+    }
+
+    @Test
+    public void staticMergeNonEmtpy()
+    {
+        qt().forAll(nonEmpty(), nonEmpty()).check((a, b) -> {
+            WarningsSnapshot result = merge(a, b, null, empty());
+            return result != null && !result.isEmpty();
+        });
+    }
+
+    @Test
+    public void mergeEmtpy()
+    {
+        WarningsSnapshot result = empty().merge(empty());
+        assertThat(result).isEqualTo(empty());
+    }
+
+    @Test
+    public void mergeSelf()
+    {
+        qt().forAll(all()).check(self -> self.merge(self).equals(self));
+    }
+
+    @Test
+    public void mergeSelfWithEmpty()
+    {
+        qt().forAll(all()).check(self -> self.merge(empty()).equals(self) && empty().merge(self).equals(self));
+    }
+
+    @Test
+    public void mergeNonEmpty()
+    {
+        WarningsSnapshot expected = builder()
+                                    .tombstonesAbort(ImmutableSet.of(HOME), 42)
+                                    .localReadSizeWarning(ImmutableSet.of(VACATION_HOME), 12)
+                                    .build();
+        // validate builder to protect against empty = empty passing this test
+        assertThat(expected.tombstones.aborts.instances).isEqualTo(ImmutableSet.of(HOME));
+        assertThat(expected.tombstones.aborts.maxValue).isEqualTo(42);
+        assertThat(expected.localReadSize.warnings.instances).isEqualTo(ImmutableSet.of(VACATION_HOME));
+        assertThat(expected.localReadSize.warnings.maxValue).isEqualTo(12);
+
+        WarningsSnapshot output = empty().merge(expected);
+        assertThat(output).isEqualTo(expected).isEqualTo(expected.merge(empty()));
+        assertThat(output.merge(expected)).isEqualTo(expected);
+    }
+
+    @Test
+    public void mergeNonEmpty2()
+    {
+        WarningsSnapshot a = builder()
+                             .tombstonesAbort(ImmutableSet.of(HOME), 42)
+                             .build();
+        WarningsSnapshot b = builder()
+                             .localReadSizeWarning(ImmutableSet.of(VACATION_HOME), 12)
+                             .build();
+        WarningsSnapshot expected = builder()
+                                    .tombstonesAbort(ImmutableSet.of(HOME), 42)
+                                    .localReadSizeWarning(ImmutableSet.of(VACATION_HOME), 12)
+                                    .build();
+
+        // validate builder to protect against empty = empty passing this test
+        assertThat(a.tombstones.aborts.instances).isEqualTo(expected.tombstones.aborts.instances).isEqualTo(ImmutableSet.of(HOME));
+        assertThat(a.tombstones.aborts.maxValue).isEqualTo(expected.tombstones.aborts.maxValue).isEqualTo(42);
+        assertThat(b.localReadSize.warnings.instances).isEqualTo(expected.localReadSize.warnings.instances).isEqualTo(ImmutableSet.of(VACATION_HOME));
+        assertThat(b.localReadSize.warnings.maxValue).isEqualTo(expected.localReadSize.warnings.maxValue).isEqualTo(12);
+
+        WarningsSnapshot output = a.merge(b);
+        assertThat(output).isEqualTo(expected).isEqualTo(expected.merge(empty()));
+        assertThat(output.merge(expected)).isEqualTo(expected);
+    }
+
+    @Test
+    public void mergeConflict()
+    {
+        WarningsSnapshot a          = builder().tombstonesAbort(ImmutableSet.of(HOME), 42).build();
+        WarningsSnapshot b          = builder().tombstonesAbort(ImmutableSet.of(VACATION_HOME), 12).build();
+        WarningsSnapshot expected   = builder().tombstonesAbort(ImmutableSet.of(HOME, VACATION_HOME), 42).build();
+
+        // validate builder to protect against empty = empty passing this test
+        assertThat(a.tombstones.aborts.instances).isEqualTo(ImmutableSet.of(HOME));
+        assertThat(a.tombstones.aborts.maxValue).isEqualTo(42);
+        assertThat(b.tombstones.aborts.instances).isEqualTo(ImmutableSet.of(VACATION_HOME));
+        assertThat(b.tombstones.aborts.maxValue).isEqualTo(12);
+        assertThat(expected.tombstones.aborts.instances).isEqualTo(ImmutableSet.of(HOME, VACATION_HOME));
+        assertThat(expected.tombstones.aborts.maxValue).isEqualTo(42);
+
+        WarningsSnapshot output = a.merge(b);
+        assertThat(output).isEqualTo(expected).isEqualTo(expected.merge(empty()));
+        assertThat(output.merge(expected)).isEqualTo(expected);
+    }
+
+    private static InetAddressAndPort address(int a, int b, int c, int d)
+    {
+        try
+        {
+            InetAddress address = InetAddress.getByAddress(new byte[]{ (byte) a, (byte) b, (byte) c, (byte) d });
+            return InetAddressAndPort.getByAddress(address);
+        }
+        catch (UnknownHostException e)
+        {
+            throw new AssertionError(e);
+        }
+    }
+
+    private static Gen<WarningsSnapshot> all()
+    {
+        Gen<Boolean> empty = SourceDSL.booleans().all();
+        Gen<WarningsSnapshot> nonEmpty = nonEmpty();
+        Gen<WarningsSnapshot> gen = rs ->
+            empty.generate(rs) ? empty() : nonEmpty.generate(rs);
+        return gen.describedAs(WarningsSnapshot::toString);
+    }
+
+    private static Gen<WarningsSnapshot> nonEmpty()
+    {
+        Gen<Counter> counter = counter();
+        Gen<WarningsSnapshot> gen = rs -> {
+            Builder builder = builder();
+            builder.tombstonesWarning(counter.generate(rs));
+            builder.tombstonesAbort(counter.generate(rs));
+            builder.localReadSizeWarning(counter.generate(rs));
+            builder.localReadSizeAbort(counter.generate(rs));
+            builder.rowIndexSizeWarning(counter.generate(rs));
+            builder.rowIndexSizeAbort(counter.generate(rs));
+            return builder.build();
+        };
+        return gen.assuming(WarningsSnapshot::isDefined).describedAs(WarningsSnapshot::toString);
+    }
+
+    private static Gen<Counter> counter()
+    {
+        Gen<Boolean> empty = SourceDSL.booleans().all();
+        Constraint maxValue = Constraint.between(1, Long.MAX_VALUE);
+        Gen<ImmutableSet<InetAddressAndPort>> instances = SourceDSL.arbitrary()
+                                                                   .pick(ImmutableSet.of(HOME), ImmutableSet.of(VACATION_HOME), ImmutableSet.of(HOME, VACATION_HOME));
+        Gen<Counter> gen = rs ->
+                           empty.generate(rs) ? Counter.empty()
+                                              : new Counter(instances.generate(rs), rs.next(maxValue));
+        return gen.describedAs(Counter::toString);
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/service/snapshot/SnapshotLoaderTest.java b/test/unit/org/apache/cassandra/service/snapshot/SnapshotLoaderTest.java
new file mode 100644
index 0000000..d03a2dd
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/snapshot/SnapshotLoaderTest.java
@@ -0,0 +1,236 @@
+/*
+ * 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.service.snapshot;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+import java.util.concurrent.ThreadLocalRandom;
+
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.cassandra.config.DurationSpec;
+import org.apache.cassandra.db.Directories;
+import org.apache.cassandra.io.util.File;
+import org.assertj.core.util.Lists;
+
+import static org.apache.cassandra.service.snapshot.SnapshotLoader.SNAPSHOT_DIR_PATTERN;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class SnapshotLoaderTest
+{
+    static String DATA_DIR_1 = "data1";
+    static String DATA_DIR_2 = "data2";
+    static String DATA_DIR_3 = "data3";
+    static String[] DATA_DIRS = new String[]{DATA_DIR_1, DATA_DIR_2, DATA_DIR_3};
+
+    static String KEYSPACE_1 = "ks1";
+    static String TABLE1_NAME = "table_1";
+    static UUID TABLE1_ID = UUID.randomUUID();
+    static String TABLE2_NAME = "table2";
+    static UUID TABLE2_ID = UUID.randomUUID();
+
+    static String KEYSPACE_2 = "ks2";
+    static String TABLE3_NAME = "table_3";
+    static UUID TABLE3_ID = UUID.randomUUID();
+
+    static String TAG1 = "tag1";
+    static String TAG2 = "tag2";
+    static String TAG3 = "tag3";
+
+    static String INVALID_NAME = "#test#";
+    static String INVALID_ID = "XPTO";
+
+    @ClassRule
+    public static TemporaryFolder tmpDir = new TemporaryFolder();
+
+    @Test
+    public void testMatcher()
+    {
+        String INDEX_SNAPSHOT = "/user/.ccm/test/node1/data0/ks/indexed_table-24b241e0c58f11eca526336fc2c671ab/snapshots/test";
+        assertThat(SNAPSHOT_DIR_PATTERN.matcher(INDEX_SNAPSHOT).find()).isTrue();
+
+        String TABLE_SNAPSHOT = "/Users/pmottagomes/.ccm/test/node1/data0/ks/my_table-1a025b40c58f11eca526336fc2c671ab/snapshots/test";
+        assertThat(SNAPSHOT_DIR_PATTERN.matcher(TABLE_SNAPSHOT).find()).isTrue();
+
+        String DROPPED_SNAPSHOT = "/Users/pmottagomes/.ccm/test/node1/data0/ks/my_table-e5c58330c58d11eca526336fc2c671ab/snapshots/dropped-1650997415751-my_table";
+        assertThat(SNAPSHOT_DIR_PATTERN.matcher(DROPPED_SNAPSHOT).find()).isTrue();
+    }
+
+    @Test
+    public void testNoSnapshots() throws IOException
+    {
+        // Create table directories on all data directories without snapshots
+        File baseDir  = new File(tmpDir.newFolder());
+        for (String dataDir : DATA_DIRS)
+        {
+            createDir(baseDir, dataDir, KEYSPACE_1, tableDirName(TABLE1_NAME, TABLE1_ID));
+            createDir(baseDir, dataDir, KEYSPACE_1, tableDirName(TABLE2_NAME, TABLE2_ID));
+            createDir(baseDir, dataDir, KEYSPACE_2, tableDirName(TABLE3_NAME, TABLE3_ID));
+        }
+
+        // Check no snapshots are found
+        SnapshotLoader loader = new SnapshotLoader(Arrays.asList(Paths.get(baseDir.toString(), DATA_DIR_1),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_2),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_3)));
+        assertThat(loader.loadSnapshots()).isEmpty();
+    }
+
+    @Test
+    public void testSnapshotsWithoutManifests() throws IOException
+    {
+        Set<File> tag1Files = new HashSet<>();
+        Set<File> tag2Files = new HashSet<>();
+        Set<File> tag3Files = new HashSet<>();
+
+        // Create one snapshot per table - without manifests:
+        // - ks1.t1 : tag1
+        // - ks1.t2 : tag2
+        // - ks2.t3 : tag3
+        File baseDir  = new File(tmpDir.newFolder());
+        for (String dataDir : DATA_DIRS)
+        {
+            tag1Files.add(createDir(baseDir, dataDir, KEYSPACE_1, tableDirName(TABLE1_NAME, TABLE1_ID), Directories.SNAPSHOT_SUBDIR, TAG1));
+            tag2Files.add(createDir(baseDir, dataDir, KEYSPACE_1, tableDirName(TABLE2_NAME, TABLE2_ID), Directories.SNAPSHOT_SUBDIR, TAG2));
+            tag3Files.add(createDir(baseDir, dataDir, KEYSPACE_2, tableDirName(TABLE3_NAME, TABLE3_ID), Directories.SNAPSHOT_SUBDIR, TAG3));
+        }
+
+        // Verify all 3 snapshots are found correctly from data directories
+        SnapshotLoader loader = new SnapshotLoader(Arrays.asList(Paths.get(baseDir.toString(), DATA_DIR_1),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_2),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_3)));
+        Set<TableSnapshot> snapshots = loader.loadSnapshots();
+        assertThat(snapshots).hasSize(3);
+        assertThat(snapshots).contains(new TableSnapshot(KEYSPACE_1, TABLE1_NAME, TABLE1_ID, TAG1, null, null, tag1Files));
+        assertThat(snapshots).contains(new TableSnapshot(KEYSPACE_1, TABLE2_NAME, TABLE2_ID,  TAG2, null, null, tag2Files));
+        assertThat(snapshots).contains(new TableSnapshot(KEYSPACE_2, TABLE3_NAME, TABLE3_ID,  TAG3, null, null, tag3Files));
+    }
+
+    @Test
+    public void testSnapshotsWithManifests() throws IOException
+    {
+        Set<File> tag1Files = new HashSet<>();
+        Set<File> tag2Files = new HashSet<>();
+        Set<File> tag3Files = new HashSet<>();
+
+        // Create one snapshot per table:
+        // - ks1.t1 : tag1
+        // - ks1.t2 : tag2
+        // - ks2.t3 : tag3
+        File baseDir  = new File(tmpDir.newFolder());
+        for (String dataDir : DATA_DIRS)
+        {
+            tag1Files.add(createDir(baseDir, dataDir, KEYSPACE_1, tableDirName(TABLE1_NAME, TABLE1_ID), Directories.SNAPSHOT_SUBDIR, TAG1));
+            tag2Files.add(createDir(baseDir, dataDir, KEYSPACE_1, tableDirName(TABLE2_NAME, TABLE2_ID), Directories.SNAPSHOT_SUBDIR, TAG2));
+            tag3Files.add(createDir(baseDir, dataDir, KEYSPACE_2, tableDirName(TABLE3_NAME, TABLE3_ID), Directories.SNAPSHOT_SUBDIR, TAG3));
+        }
+
+        // Write manifest for snapshot tag1 on random location
+        Instant tag1Ts = Instant.now();
+        File tag1ManifestLocation = tag1Files.toArray(new File[0])[ThreadLocalRandom.current().nextInt(tag1Files.size())];
+        writeManifest(tag1ManifestLocation, tag1Ts, null);
+
+        // Write manifest for snapshot tag2 on random location
+        Instant tag2Ts = Instant.now().plusSeconds(10);
+        DurationSpec.IntSecondsBound tag2Ttl = new DurationSpec.IntSecondsBound("10h");
+        File tag2ManifestLocation = tag2Files.toArray(new File[0])[ThreadLocalRandom.current().nextInt(tag2Files.size())];
+        writeManifest(tag2ManifestLocation, tag2Ts, tag2Ttl);
+
+        // Write manifest for snapshot tag3 on random location
+        Instant tag3Ts = Instant.now().plusSeconds(20);
+        File tag3ManifestLocation = tag3Files.toArray(new File[0])[ThreadLocalRandom.current().nextInt(tag3Files.size())];
+        writeManifest(tag3ManifestLocation, tag3Ts, null);
+
+        // Verify all 3 snapshots are found correctly from data directories
+        SnapshotLoader loader = new SnapshotLoader(Arrays.asList(Paths.get(baseDir.toString(), DATA_DIR_1),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_2),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_3)));
+        Set<TableSnapshot> snapshots = loader.loadSnapshots();
+        assertThat(snapshots).hasSize(3);
+        assertThat(snapshots).contains(new TableSnapshot(KEYSPACE_1, TABLE1_NAME, TABLE1_ID, TAG1, tag1Ts, null, tag1Files));
+        assertThat(snapshots).contains(new TableSnapshot(KEYSPACE_1, TABLE2_NAME, TABLE2_ID,  TAG2, tag2Ts, tag2Ts.plusSeconds(tag2Ttl.toSeconds()), tag2Files));
+        assertThat(snapshots).contains(new TableSnapshot(KEYSPACE_2, TABLE3_NAME, TABLE3_ID,  TAG3, tag3Ts, null, tag3Files));
+    }
+
+    @Test
+    public void testInvalidSnapshotsAreNotLoaded() throws IOException
+    {
+        Set<File> tag1Files = new HashSet<>();
+        Set<File> tag2Files = new HashSet<>();
+        Set<File> tag3Files = new HashSet<>();
+
+        // Create invalid snapshot directory structure
+        // - /data_dir/#test#/table1-validuuid/snapshot/tag1
+        // - /data_dir/ks1/#test#-validuuid/snapshot/tag2
+        // - /data_dir/ks2/table3-invaliduuid/snapshot/tag3
+        File baseDir  = new File(tmpDir.newFolder());
+        for (String dataDir : DATA_DIRS)
+        {
+            tag1Files.add(createDir(baseDir, dataDir, INVALID_NAME, tableDirName(TABLE1_NAME, TABLE1_ID), Directories.SNAPSHOT_SUBDIR, TAG1));
+            tag2Files.add(createDir(baseDir, dataDir, KEYSPACE_1, tableDirName(INVALID_NAME, TABLE2_ID), Directories.SNAPSHOT_SUBDIR, TAG2));
+            tag3Files.add(createDir(baseDir, dataDir, KEYSPACE_2, String.format("%s-%s", TABLE3_NAME, INVALID_ID), Directories.SNAPSHOT_SUBDIR, TAG3));
+        }
+
+        // Check no snapshots are loaded
+        SnapshotLoader loader = new SnapshotLoader(Arrays.asList(Paths.get(baseDir.toString(), DATA_DIR_1),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_2),
+                                                                 Paths.get(baseDir.toString(), DATA_DIR_3)));
+        assertThat(loader.loadSnapshots()).isEmpty();
+    }
+
+    @Test
+    public void testParseUUID()
+    {
+        assertThat(SnapshotLoader.Visitor.parseUUID("c7e513243f0711ec9bbc0242ac130002")).isEqualTo(UUID.fromString("c7e51324-3f07-11ec-9bbc-0242ac130002"));
+    }
+
+    private void writeManifest(File snapshotDir, Instant creationTime, DurationSpec.IntSecondsBound ttl) throws IOException
+    {
+        SnapshotManifest manifest = new SnapshotManifest(Lists.newArrayList("f1", "f2", "f3"), ttl, creationTime);
+        manifest.serializeToJsonFile(getManifestFile(snapshotDir));
+    }
+
+    private static File createDir(File baseDir, String... subdirs)
+    {
+        File file = new File(Paths.get(baseDir.toString(), subdirs).toString());
+        file.toJavaIOFile().mkdirs();
+        return file;
+    }
+
+    static String tableDirName(String tableName, UUID tableId)
+    {
+        return String.format("%s-%s", tableName, removeDashes(tableId));
+    }
+
+    static String removeDashes(UUID id)
+    {
+        return id.toString().replace("-", "");
+    }
+
+    public static File getManifestFile(File snapshotDir)
+    {
+        return new File(snapshotDir, "manifest.json");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/snapshot/SnapshotManagerTest.java b/test/unit/org/apache/cassandra/service/snapshot/SnapshotManagerTest.java
new file mode 100644
index 0000000..edbfff2
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/snapshot/SnapshotManagerTest.java
@@ -0,0 +1,207 @@
+/*
+ * 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.service.snapshot;
+
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.List;
+import java.util.UUID;
+import java.util.concurrent.atomic.AtomicReference;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.service.DefaultFSErrorHandler;
+
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.service.snapshot.TableSnapshotTest.createFolders;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.FBUtilities.now;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.awaitility.Awaitility.await;
+import static org.junit.Assert.assertTrue;
+
+public class SnapshotManagerTest
+{
+    static long ONE_DAY_SECS = 86400;
+
+    @BeforeClass
+    public static void beforeClass()
+    {
+        DatabaseDescriptor.daemonInitialization();
+        FileUtils.setFSErrorHandler(new DefaultFSErrorHandler());
+    }
+
+    @ClassRule
+    public static TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+    private TableSnapshot generateSnapshotDetails(String tag, Instant expiration)
+    {
+        try
+        {
+            return new TableSnapshot("ks",
+                                     "tbl",
+                                     UUID.randomUUID(),
+                                     tag,
+                                     Instant.EPOCH,
+                                     expiration,
+                                     createFolders(temporaryFolder));
+        }
+        catch (Exception ex)
+        {
+            throw new RuntimeException(ex);
+        }
+    }
+
+
+    @Test
+    public void testLoadSnapshots() throws Exception
+    {
+        TableSnapshot expired = generateSnapshotDetails("expired", Instant.EPOCH);
+        TableSnapshot nonExpired = generateSnapshotDetails("non-expired", now().plusSeconds(ONE_DAY_SECS));
+        TableSnapshot nonExpiring = generateSnapshotDetails("non-expiring", null);
+        List<TableSnapshot> snapshots = Arrays.asList(expired, nonExpired, nonExpiring);
+
+        // Create SnapshotManager with 3 snapshots: expired, non-expired and non-expiring
+        SnapshotManager manager = new SnapshotManager(3, 3);
+        manager.addSnapshots(snapshots);
+
+        // Only expiring snapshots should be loaded
+        assertThat(manager.getExpiringSnapshots()).hasSize(2);
+        assertThat(manager.getExpiringSnapshots()).contains(expired);
+        assertThat(manager.getExpiringSnapshots()).contains(nonExpired);
+    }
+
+    @Test
+    public void testClearExpiredSnapshots()
+    {
+        SnapshotManager manager = new SnapshotManager(3, 3);
+
+        // Add 3 snapshots: expired, non-expired and non-expiring
+        TableSnapshot expired = generateSnapshotDetails("expired", Instant.EPOCH);
+        TableSnapshot nonExpired = generateSnapshotDetails("non-expired", now().plusMillis(ONE_DAY_SECS));
+        TableSnapshot nonExpiring = generateSnapshotDetails("non-expiring", null);
+        manager.addSnapshot(expired);
+        manager.addSnapshot(nonExpired);
+        manager.addSnapshot(nonExpiring);
+
+        // Only expiring snapshot should be indexed and all should exist
+        assertThat(manager.getExpiringSnapshots()).hasSize(2);
+        assertThat(manager.getExpiringSnapshots()).contains(expired);
+        assertThat(manager.getExpiringSnapshots()).contains(nonExpired);
+        assertThat(expired.exists()).isTrue();
+        assertThat(nonExpired.exists()).isTrue();
+        assertThat(nonExpiring.exists()).isTrue();
+
+        // After clearing expired snapshots, expired snapshot should be removed while the others should remain
+        manager.clearExpiredSnapshots();
+        assertThat(manager.getExpiringSnapshots()).hasSize(1);
+        assertThat(manager.getExpiringSnapshots()).contains(nonExpired);
+        assertThat(expired.exists()).isFalse();
+        assertThat(nonExpired.exists()).isTrue();
+        assertThat(nonExpiring.exists()).isTrue();
+    }
+
+    @Test
+    public void testScheduledCleanup() throws Exception
+    {
+        SnapshotManager manager = new SnapshotManager(0, 1);
+        try
+        {
+            // Start snapshot manager which should start expired snapshot cleanup thread
+            manager.start();
+
+            // Add 2 expiring snapshots: one to expire in 2 seconds, another in 1 day
+            TableSnapshot toExpire = generateSnapshotDetails("to-expire", now().plusSeconds(2));
+            TableSnapshot nonExpired = generateSnapshotDetails("non-expired", now().plusMillis(ONE_DAY_SECS));
+            manager.addSnapshot(toExpire);
+            manager.addSnapshot(nonExpired);
+
+            // Check both snapshots still exist
+            assertThat(toExpire.exists()).isTrue();
+            assertThat(nonExpired.exists()).isTrue();
+            assertThat(manager.getExpiringSnapshots()).hasSize(2);
+            assertThat(manager.getExpiringSnapshots()).contains(toExpire);
+            assertThat(manager.getExpiringSnapshots()).contains(nonExpired);
+
+            await().pollInterval(2, SECONDS)
+                   .timeout(10, SECONDS)
+                   .until(() -> manager.getExpiringSnapshots().size() == 1);
+
+            assertThat(manager.getExpiringSnapshots()).contains(nonExpired);
+            assertThat(toExpire.exists()).isFalse();
+            assertThat(nonExpired.exists()).isTrue();
+        }
+        finally
+        {
+            manager.stop();
+        }
+    }
+
+    @Test // see CASSANDRA-18211
+    public void testConcurrentClearingOfSnapshots() throws Exception
+    {
+
+        AtomicReference<Long> firstInvocationTime = new AtomicReference<>(0L);
+        AtomicReference<Long> secondInvocationTime = new AtomicReference<>(0L);
+
+        SnapshotManager manager = new SnapshotManager(0, 5)
+        {
+            @Override
+            public synchronized void clearSnapshot(TableSnapshot snapshot)
+            {
+                if (snapshot.getTag().equals("mysnapshot"))
+                {
+                    firstInvocationTime.set(currentTimeMillis());
+                    Uninterruptibles.sleepUninterruptibly(10, SECONDS);
+                }
+                else if (snapshot.getTag().equals("mysnapshot2"))
+                {
+                    secondInvocationTime.set(currentTimeMillis());
+                }
+                super.clearSnapshot(snapshot);
+            }
+        };
+
+        TableSnapshot expiringSnapshot = generateSnapshotDetails("mysnapshot", Instant.now().plusSeconds(15));
+        manager.addSnapshot(expiringSnapshot);
+
+        manager.resumeSnapshotCleanup();
+
+        Thread nonExpiringSnapshotCleanupThred = new Thread(() -> manager.clearSnapshot(generateSnapshotDetails("mysnapshot2", null)));
+
+        // wait until the first snapshot expires
+        await().pollInterval(1, SECONDS)
+               .pollDelay(0, SECONDS)
+               .timeout(1, MINUTES)
+               .until(() -> firstInvocationTime.get() > 0);
+
+        // this will block until the first snapshot is cleaned up
+        nonExpiringSnapshotCleanupThred.start();
+        nonExpiringSnapshotCleanupThred.join();
+
+        assertTrue(secondInvocationTime.get() - firstInvocationTime.get() > 10_000);
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/service/snapshot/SnapshotManifestTest.java b/test/unit/org/apache/cassandra/service/snapshot/SnapshotManifestTest.java
new file mode 100644
index 0000000..d3b11c0
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/snapshot/SnapshotManifestTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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.service.snapshot;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.time.Instant;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Arrays;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.assertj.core.api.Assertions.assertThatIOException;
+import static org.assertj.core.api.Assertions.assertThat;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.cassandra.config.DurationSpec;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
+
+public class SnapshotManifestTest
+{
+    @Rule
+    public TemporaryFolder tempFolder = new TemporaryFolder();
+
+    @Test
+    public void testDeserializeFromInvalidFile() throws IOException {
+        File manifestFile = new File(tempFolder.newFile("invalid"));
+        assertThatIOException().isThrownBy(
+            () -> {
+                SnapshotManifest.deserializeFromJsonFile(manifestFile);
+            });
+
+        FileOutputStreamPlus out = new FileOutputStreamPlus(manifestFile);
+        out.write(1);
+        out.write(2);
+        out.write(3);
+        out.close();
+        assertThatIOException().isThrownBy(
+            () -> SnapshotManifest.deserializeFromJsonFile(manifestFile));
+    }
+
+    @Test
+    public void testDeserializeManifest() throws IOException
+    {
+        Map<String, Object> map = new HashMap<>();
+        String createdAt = "2021-07-03T10:37:30Z";
+        String expiresAt = "2021-08-03T10:37:30Z";
+        map.put("created_at", createdAt);
+        map.put("expires_at", expiresAt);
+        map.put("files", Arrays.asList("db1", "db2", "db3"));
+
+        ObjectMapper mapper = new ObjectMapper();
+        File manifestFile = new File(tempFolder.newFile("manifest.json"));
+        mapper.writeValue((OutputStream) new FileOutputStreamPlus(manifestFile), map);
+        SnapshotManifest manifest = SnapshotManifest.deserializeFromJsonFile(manifestFile);
+
+        assertThat(manifest.getExpiresAt()).isEqualTo(Instant.parse(expiresAt));
+        assertThat(manifest.getCreatedAt()).isEqualTo(Instant.parse(createdAt));
+        assertThat(manifest.getFiles()).contains("db1").contains("db2").contains("db3").hasSize(3);
+    }
+
+    @Test
+    public void testOptionalFields() throws IOException {
+        Map<String, Object> map = new HashMap<>();
+        map.put("files", Arrays.asList("db1", "db2", "db3"));
+        ObjectMapper mapper = new ObjectMapper();
+        File manifestFile = new File(tempFolder.newFile("manifest.json"));
+        mapper.writeValue((OutputStream) new FileOutputStreamPlus(manifestFile), map);
+        SnapshotManifest manifest = SnapshotManifest.deserializeFromJsonFile(manifestFile);
+
+        assertThat(manifest.getExpiresAt()).isNull();
+        assertThat(manifest.getCreatedAt()).isNull();
+        assertThat(manifest.getFiles()).contains("db1").contains("db2").contains("db3").hasSize(3);
+    }
+
+    @Test
+    public void testIngoredFields() throws IOException {
+        Map<String, Object> map = new HashMap<>();
+        map.put("files", Arrays.asList("db1", "db2", "db3"));
+        map.put("dummy", "dummy");
+        ObjectMapper mapper = new ObjectMapper();
+        File manifestFile = new File(tempFolder.newFile("manifest.json"));
+        mapper.writeValue((OutputStream) new FileOutputStreamPlus(manifestFile), map);
+        SnapshotManifest manifest = SnapshotManifest.deserializeFromJsonFile(manifestFile);
+        assertThat(manifest.getFiles()).contains("db1").contains("db2").contains("db3").hasSize(3);
+    }
+
+    @Test
+    public void testSerializeAndDeserialize() throws Exception {
+        SnapshotManifest manifest = new SnapshotManifest(Arrays.asList("db1", "db2", "db3"), new DurationSpec.IntSecondsBound("2m"), Instant.ofEpochMilli(currentTimeMillis()));
+        File manifestFile = new File(tempFolder.newFile("manifest.json"));
+
+        manifest.serializeToJsonFile(manifestFile);
+        manifest = SnapshotManifest.deserializeFromJsonFile(manifestFile);
+        assertThat(manifest.getExpiresAt()).isNotNull();
+        assertThat(manifest.getCreatedAt()).isNotNull();
+        assertThat(manifest.getFiles()).contains("db1").contains("db2").contains("db3").hasSize(3);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/service/snapshot/TableSnapshotTest.java b/test/unit/org/apache/cassandra/service/snapshot/TableSnapshotTest.java
new file mode 100644
index 0000000..4bb1756
--- /dev/null
+++ b/test/unit/org/apache/cassandra/service/snapshot/TableSnapshotTest.java
@@ -0,0 +1,250 @@
+/*
+ * 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.service.snapshot;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.time.Instant;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
+import java.util.UUID;
+
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.io.util.File;
+import org.apache.cassandra.io.util.FileOutputStreamPlus;
+import org.apache.cassandra.io.util.FileUtils;
+
+import static org.apache.cassandra.utils.FBUtilities.now;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TableSnapshotTest
+{
+    @Before
+    public void setup()
+    {
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    @ClassRule
+    public static TemporaryFolder tempFolder = new TemporaryFolder();
+
+    public static Set<File> createFolders(TemporaryFolder temp) throws IOException {
+        File folder = new File(temp.newFolder());
+        Set<File> folders = new HashSet<>();
+        for (String folderName : Arrays.asList("foo", "bar", "buzz")) {
+            File subfolder = new File(folder, folderName);
+            subfolder.tryCreateDirectories();
+            assertThat(subfolder.exists());
+            folders.add(subfolder);
+        };
+        return folders;
+    }
+
+    @Test
+    public void testSnapshotExists() throws IOException
+    {
+        Set<File> folders = createFolders(tempFolder);
+
+        TableSnapshot snapshot = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some",
+        null,
+        null,
+        folders);
+
+        assertThat(snapshot.exists()).isTrue();
+
+        folders.forEach(FileUtils::deleteRecursive);
+
+        assertThat(snapshot.exists()).isFalse();
+    }
+
+    @Test
+    public void testSnapshotExpiring() throws IOException
+    {
+        Set<File> folders = createFolders(tempFolder);
+
+        TableSnapshot snapshot = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some",
+        null,
+        null,
+        folders);
+
+        assertThat(snapshot.isExpiring()).isFalse();
+        assertThat(snapshot.isExpired(now())).isFalse();
+
+        snapshot = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some",
+        now(),
+        null,
+        folders);
+
+        assertThat(snapshot.isExpiring()).isFalse();
+        assertThat(snapshot.isExpired(now())).isFalse();
+
+        snapshot = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some",
+        now(),
+        now().plusSeconds(1000),
+        folders);
+
+        assertThat(snapshot.isExpiring()).isTrue();
+        assertThat(snapshot.isExpired(now())).isFalse();
+
+        snapshot = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some",
+        now(),
+        now().minusSeconds(1000),
+        folders);
+
+        assertThat(snapshot.isExpiring()).isTrue();
+        assertThat(snapshot.isExpired(now())).isTrue();
+    }
+
+    private Long writeBatchToFile(File file) throws IOException
+    {
+        FileOutputStreamPlus out = new FileOutputStreamPlus(file);
+        out.write(1);
+        out.write(2);
+        out.write(3);
+        out.close();
+        return 3L;
+    }
+
+    @Test
+    public void testComputeSizeOnDisk() throws IOException
+    {
+        Set<File> folders = createFolders(tempFolder);
+
+        TableSnapshot tableDetails = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some",
+        null,
+        null,
+        folders);
+
+        Long res = 0L;
+
+        for (File dir : folders)
+        {
+            writeBatchToFile(new File(dir, "tmp"));
+            res += FileUtils.folderSize(dir);
+        }
+
+        assertThat(tableDetails.computeSizeOnDiskBytes()).isGreaterThan(0L);
+        assertThat(tableDetails.computeSizeOnDiskBytes()).isEqualTo(res);
+    }
+
+    @Test
+    public void testComputeTrueSize() throws IOException
+    {
+        Set<File> folders = createFolders(tempFolder);
+
+        TableSnapshot tableDetails = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some",
+        null,
+        null,
+        folders);
+
+        Long res = 0L;
+
+        for (File dir : folders)
+        {
+            File file = new File(dir, "tmp");
+            writeBatchToFile(file);
+            res += file.length();
+        }
+
+        assertThat(tableDetails.computeTrueSizeBytes()).isGreaterThan(0L);
+        assertThat(tableDetails.computeTrueSizeBytes()).isEqualTo(res);
+    }
+
+    @Test
+    public void testGetCreatedAt() throws IOException
+    {
+        Set<File> folders = createFolders(tempFolder);
+
+        // When createdAt is not null, getCreatedAt() should return it
+        Instant createdAt = Instant.EPOCH;
+        TableSnapshot withCreatedAt = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some1",
+        createdAt,
+        null,
+        folders);
+        assertThat(withCreatedAt.getCreatedAt()).isEqualTo(createdAt);
+
+        // When createdAt is  null, it should return the snapshot folder minimum update time
+        TableSnapshot withoutCreatedAt = new TableSnapshot(
+        "ks",
+        "tbl",
+        UUID.randomUUID(),
+        "some1",
+        null,
+        null,
+        folders);
+        assertThat(withoutCreatedAt.getCreatedAt()).isEqualTo(Instant.ofEpochMilli(folders.stream().mapToLong(f -> f.lastModified()).min().getAsLong()));
+    }
+
+    @Test
+    public void testGetLiveFileFromSnapshotFile()
+    {
+        testGetLiveFileFromSnapshotFile("~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/snapshots/1643481737850/me-1-big-Data.db",
+                                        "~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/me-1-big-Data.db");
+    }
+
+    @Test
+    public void testGetLiveFileFromSnapshotIndexFile()
+    {
+        testGetLiveFileFromSnapshotFile("~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/snapshots/1643481737850/.tbl_val_idx/me-1-big-Summary.db",
+                                        "~/.ccm/test/node1/data0/test_ks/tbl-e03faca0813211eca100c705ea09b5ef/.tbl_val_idx/me-1-big-Summary.db");
+    }
+
+    public void testGetLiveFileFromSnapshotFile(String snapshotFile, String expectedLiveFile)
+    {
+        assertThat(TableSnapshot.getLiveFileFromSnapshotFile(Paths.get(snapshotFile)).toString()).isEqualTo(expectedLiveFile);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/streaming/EntireSSTableStreamingCorrectFilesCountTest.java b/test/unit/org/apache/cassandra/streaming/EntireSSTableStreamingCorrectFilesCountTest.java
index 085302f..34ce09c 100644
--- a/test/unit/org/apache/cassandra/streaming/EntireSSTableStreamingCorrectFilesCountTest.java
+++ b/test/unit/org/apache/cassandra/streaming/EntireSSTableStreamingCorrectFilesCountTest.java
@@ -24,7 +24,8 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.UUID;
+
+import javax.annotation.Nullable;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -36,6 +37,7 @@
 import io.netty.channel.ChannelPromise;
 import io.netty.channel.embedded.EmbeddedChannel;
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
 import org.apache.cassandra.db.RowUpdateBuilder;
@@ -47,7 +49,6 @@
 import org.apache.cassandra.dht.Token;
 import org.apache.cassandra.io.sstable.Descriptor;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.locator.RangesAtEndpoint;
 import org.apache.cassandra.net.AsyncStreamingOutputPlus;
@@ -55,12 +56,12 @@
 import org.apache.cassandra.net.SharedDefaultFileRegion;
 import org.apache.cassandra.schema.CompactionParams;
 import org.apache.cassandra.schema.KeyspaceParams;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
 
-import javax.annotation.Nullable;
-
 import static org.apache.cassandra.service.ActiveRepairService.NO_PENDING_REPAIR;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
@@ -102,7 +103,7 @@
             .applyUnsafe();
         }
 
-        store.forceBlockingFlush();
+        Util.flush(store);
         CompactionManager.instance.performMaximal(store, false);
 
         sstable = store.getLiveSSTables().iterator().next();
@@ -194,13 +195,13 @@
     {
         StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP,
                                                                     1,
-                                                                    new DefaultConnectionFactory(),
+                                                                    new NettyStreamingConnectionFactory(),
                                                                     false,
                                                                     false,
                                                                     null,
                                                                     PreviewKind.NONE);
 
-        StreamResultFuture future = StreamResultFuture.createInitiator(UUID.randomUUID(),
+        StreamResultFuture future = StreamResultFuture.createInitiator(nextTimeUUID(),
                                                                        StreamOperation.BOOTSTRAP,
                                                                        Collections.singleton(streamEventHandler),
                                                                        streamCoordinator);
@@ -213,7 +214,7 @@
                                                          Collections.emptyList(),
                                                          StreamSession.State.INITIALIZED));
 
-        StreamSession session = streamCoordinator.getOrCreateNextSession(peer);
+        StreamSession session = streamCoordinator.getOrCreateOutboundSession(peer);
         session.init(future);
 
         return session;
diff --git a/test/unit/org/apache/cassandra/streaming/SessionInfoTest.java b/test/unit/org/apache/cassandra/streaming/SessionInfoTest.java
index 4f0c494..45172fe 100644
--- a/test/unit/org/apache/cassandra/streaming/SessionInfoTest.java
+++ b/test/unit/org/apache/cassandra/streaming/SessionInfoTest.java
@@ -57,13 +57,13 @@
         assert info.getTotalFilesSent() == 0;
 
         // receive in progress
-        info.updateProgress(new ProgressInfo(local, 0, "test.txt", ProgressInfo.Direction.IN, 50, 100));
+        info.updateProgress(new ProgressInfo(local, 0, "test.txt", ProgressInfo.Direction.IN, 50, 50, 100));
         // still in progress, but not completed yet
         assert info.getTotalSizeReceived() == 50;
         assert info.getTotalSizeSent() == 0;
         assert info.getTotalFilesReceived() == 0;
         assert info.getTotalFilesSent() == 0;
-        info.updateProgress(new ProgressInfo(local, 0, "test.txt", ProgressInfo.Direction.IN, 100, 100));
+        info.updateProgress(new ProgressInfo(local, 0, "test.txt", ProgressInfo.Direction.IN, 100, 100, 100));
         // 1 file should be completed
         assert info.getTotalSizeReceived() == 100;
         assert info.getTotalSizeSent() == 0;
diff --git a/test/unit/org/apache/cassandra/streaming/StreamManagerTest.java b/test/unit/org/apache/cassandra/streaming/StreamManagerTest.java
index 625d9d5..a32c1a9 100644
--- a/test/unit/org/apache/cassandra/streaming/StreamManagerTest.java
+++ b/test/unit/org/apache/cassandra/streaming/StreamManagerTest.java
@@ -22,24 +22,38 @@
 import org.junit.Test;
 
 import org.apache.cassandra.config.Config;
+import org.apache.cassandra.config.DataRateSpec;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.service.StorageService;
 
 import static org.apache.cassandra.streaming.StreamManager.StreamRateLimiter;
-import static org.apache.cassandra.streaming.StreamManager.StreamRateLimiter.BYTES_PER_MEGABIT;
+import static org.apache.cassandra.streaming.StreamManager.StreamRateLimiter.BYTES_PER_MEBIBYTE;
 import static org.junit.Assert.assertEquals;
 
 public class StreamManagerTest
 {
-    private static int defaultStreamThroughputMbPerSec;
-    private static int defaultInterDCStreamThroughputMbPerSec;
+    private static double defaultStreamThroughputBytesPerSec;
+    private static double defaultInterDCStreamThroughputBytesPerSec;
+    private static final int MAX_INT_CONFIG_VALUE = Integer.MAX_VALUE - 1;
+    private static final double INTEGER_MAX_VALUE_MEGABITS_IN_BYTES = DataRateSpec.LongBytesPerSecondBound
+                                                                          .megabitsPerSecondInBytesPerSecond(MAX_INT_CONFIG_VALUE)
+                                                                          .toBytesPerSecond();
+
+    private static double defaultEntireSSTableStreamThroughputBytesPerSec;
+    private static double defaultEntireSSTableInterDCStreamThroughputBytesPerSec;
+
+    private static final double BYTES_PER_MEGABIT = 125_000;
 
     @BeforeClass
     public static void setupClass()
     {
         Config c = DatabaseDescriptor.loadConfig();
-        defaultStreamThroughputMbPerSec = c.stream_throughput_outbound_megabits_per_sec;
-        defaultInterDCStreamThroughputMbPerSec = c.inter_dc_stream_throughput_outbound_megabits_per_sec;
+
+        defaultStreamThroughputBytesPerSec = c.stream_throughput_outbound.toBytesPerSecond();
+        defaultInterDCStreamThroughputBytesPerSec = c.inter_dc_stream_throughput_outbound.toBytesPerSecond();
+        defaultEntireSSTableStreamThroughputBytesPerSec = c.entire_sstable_stream_throughput_outbound.toBytesPerSecond();
+        defaultEntireSSTableInterDCStreamThroughputBytesPerSec = c.entire_sstable_inter_dc_stream_throughput_outbound.toBytesPerSecond();
+
         DatabaseDescriptor.daemonInitialization(() -> c);
     }
 
@@ -47,45 +61,75 @@
     public void testUpdateStreamThroughput()
     {
         // Initialized value check
-        assertEquals(defaultStreamThroughputMbPerSec * BYTES_PER_MEGABIT, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
+        assertEquals(defaultStreamThroughputBytesPerSec, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
 
         // Positive value check
-        StorageService.instance.setStreamThroughputMbPerSec(500);
-        assertEquals(500.0d * BYTES_PER_MEGABIT, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
+        StorageService.instance.setStreamThroughputMbitPerSec(500); //60MiB/s
+        assertEquals(500 * BYTES_PER_MEGABIT, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
 
         // Max positive value check
-        StorageService.instance.setStreamThroughputMbPerSec(Integer.MAX_VALUE);
-        assertEquals(Integer.MAX_VALUE * BYTES_PER_MEGABIT, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
+        StorageService.instance.setStreamThroughputMbitPerSec(MAX_INT_CONFIG_VALUE);
+        assertEquals(INTEGER_MAX_VALUE_MEGABITS_IN_BYTES, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
 
         // Zero value check
-        StorageService.instance.setStreamThroughputMbPerSec(0);
+        StorageService.instance.setStreamThroughputMbitPerSec(0);
         assertEquals(Double.MAX_VALUE, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
+    }
 
-        // Negative value check
-        StorageService.instance.setStreamThroughputMbPerSec(-200);
-        assertEquals(Double.MAX_VALUE, StreamRateLimiter.getRateLimiterRateInBytes(), 0);
+    @Test
+    public void testUpdateEntireSSTableStreamThroughput()
+    {
+        // Initialized value check (defaults to StreamRateLimiter.getRateLimiterRateInBytes())
+        assertEquals(defaultEntireSSTableStreamThroughputBytesPerSec, StreamRateLimiter.getEntireSSTableRateLimiterRateInBytes(), 0);
+
+        // Positive value check
+        StorageService.instance.setEntireSSTableStreamThroughputMebibytesPerSec(1500);
+        assertEquals(1500d * BYTES_PER_MEBIBYTE, StreamRateLimiter.getEntireSSTableRateLimiterRateInBytes(), 0);
+
+        // Max positive value check
+        StorageService.instance.setEntireSSTableStreamThroughputMebibytesPerSec(MAX_INT_CONFIG_VALUE);
+        assertEquals((MAX_INT_CONFIG_VALUE) * BYTES_PER_MEBIBYTE, StreamRateLimiter.getEntireSSTableRateLimiterRateInBytes(), 0);
+
+        // Zero value check
+        StorageService.instance.setEntireSSTableStreamThroughputMebibytesPerSec(0);
+        assertEquals(Double.MAX_VALUE, StreamRateLimiter.getEntireSSTableRateLimiterRateInBytes(), 0);
     }
 
     @Test
     public void testUpdateInterDCStreamThroughput()
     {
         // Initialized value check
-        assertEquals(defaultInterDCStreamThroughputMbPerSec * BYTES_PER_MEGABIT, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
+        assertEquals(defaultInterDCStreamThroughputBytesPerSec, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
 
         // Positive value check
-        StorageService.instance.setInterDCStreamThroughputMbPerSec(200);
-        assertEquals(200.0d * BYTES_PER_MEGABIT, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(200); //approximately 24MiB/s
+        assertEquals(200 * BYTES_PER_MEGABIT, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
 
         // Max positive value check
-        StorageService.instance.setInterDCStreamThroughputMbPerSec(Integer.MAX_VALUE);
-        assertEquals(Integer.MAX_VALUE * BYTES_PER_MEGABIT, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(MAX_INT_CONFIG_VALUE);
+        assertEquals(INTEGER_MAX_VALUE_MEGABITS_IN_BYTES, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
 
         // Zero value check
-        StorageService.instance.setInterDCStreamThroughputMbPerSec(0);
-        assertEquals(Double.MAX_VALUE, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
-
-        // Negative value check
-        StorageService.instance.setInterDCStreamThroughputMbPerSec(-200);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(0);
         assertEquals(Double.MAX_VALUE, StreamRateLimiter.getInterDCRateLimiterRateInBytes(), 0);
     }
-}
+
+    @Test
+    public void testUpdateEntireSSTableInterDCStreamThroughput()
+    {
+        // Initialized value check (Defaults to StreamRateLimiter.getInterDCRateLimiterRateInBytes())
+        assertEquals(defaultEntireSSTableInterDCStreamThroughputBytesPerSec, StreamRateLimiter.getEntireSSTableInterDCRateLimiterRateInBytes(), 0);
+
+        // Positive value check
+        StorageService.instance.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(1200);
+        assertEquals(1200.0d * BYTES_PER_MEBIBYTE, StreamRateLimiter.getEntireSSTableInterDCRateLimiterRateInBytes(), 0);
+
+        // Max positive value check
+        StorageService.instance.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(MAX_INT_CONFIG_VALUE);
+        assertEquals(MAX_INT_CONFIG_VALUE * BYTES_PER_MEBIBYTE, StreamRateLimiter.getEntireSSTableInterDCRateLimiterRateInBytes(), 0);
+
+        // Zero value check
+        StorageService.instance.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(0);
+        assertEquals(Double.MAX_VALUE, StreamRateLimiter.getEntireSSTableInterDCRateLimiterRateInBytes(), 0);
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/streaming/StreamRateLimiterTest.java b/test/unit/org/apache/cassandra/streaming/StreamRateLimiterTest.java
new file mode 100644
index 0000000..3b72c4d
--- /dev/null
+++ b/test/unit/org/apache/cassandra/streaming/StreamRateLimiterTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.streaming;
+
+import java.net.UnknownHostException;
+
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+public class StreamRateLimiterTest
+{
+    InetAddressAndPort REMOTE_PEER_ADDRESS;
+
+    @Before
+    public void prepareServer() throws UnknownHostException
+    {
+        ServerTestUtils.daemonInitialization();
+        ServerTestUtils.prepareServer();
+        REMOTE_PEER_ADDRESS = InetAddressAndPort.getByName("127.0.0.4");
+    }
+
+    @Test
+    public void testIsRateLimited()
+    {
+        // Enable rate limiting for local traffic and inter-DC traffic
+        StorageService.instance.setStreamThroughputMbitPerSec(200);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(200);
+
+        // Rate-limiter enabled for a local peer
+        assertTrue(StreamManager.getRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+
+        // Rate-limiter enabled for a remote peer
+        assertTrue(StreamManager.getRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+
+        // Disable rate limiting for local traffic, but enable it for inter-DC traffic
+        StorageService.instance.setStreamThroughputMbitPerSec(0);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(200);
+
+        // Rate-limiter disabled for a local peer
+        assertFalse(StreamManager.getRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+
+        // Rate-limiter enabled for a remote peer
+        assertTrue(StreamManager.getRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+
+        // Enable rate limiting for local traffic, but disable it for inter-DC traffic
+        StorageService.instance.setStreamThroughputMbitPerSec(200);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(0);
+
+        // Rate-limiter enabled for a local peer
+        assertTrue(StreamManager.getRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+
+        // Rate-limiter enabled for a remote peer (because there is a local rate-limit)
+        assertTrue(StreamManager.getRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+
+        // Disable rate liming for local and inter-DC traffic
+        StorageService.instance.setStreamThroughputMbitPerSec(0);
+        StorageService.instance.setInterDCStreamThroughputMbitPerSec(0);
+
+        // Rate-limiter enabled for a local and remote peers
+        assertFalse(StreamManager.getRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+        assertFalse(StreamManager.getRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+    }
+
+    @Test
+    public void testEntireSSTableStreamingIsRateLimited()
+    {
+        // Enable rate limiting for local traffic and inter-DC traffic
+        StorageService.instance.setEntireSSTableStreamThroughputMebibytesPerSec(200);
+        StorageService.instance.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(200);
+
+        // Rate-limiter enabled for a local peer
+        assertTrue(StreamManager.getEntireSSTableRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+
+        // Rate-limiter enabled for a remote peer
+        assertTrue(StreamManager.getEntireSSTableRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+
+        // Disable rate limiting for local traffic, but enable it for inter-DC traffic
+        StorageService.instance.setEntireSSTableStreamThroughputMebibytesPerSec(0);
+        StorageService.instance.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(200);
+
+        // Rate-limiter disabled for a local peer
+        assertFalse(StreamManager.getEntireSSTableRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+
+        // Rate-limiter enabled for a remote peer
+        assertTrue(StreamManager.getEntireSSTableRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+
+        // Enable rate limiting for local traffic, but disable it for inter-DC traffic
+        StorageService.instance.setEntireSSTableStreamThroughputMebibytesPerSec(200);
+        StorageService.instance.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(0);
+
+        // Rate-limiter enabled for a local peer
+        assertTrue(StreamManager.getEntireSSTableRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+
+        // Rate-limiter enabled for a remote peer (because there is a local rate-limit)
+        assertTrue(StreamManager.getEntireSSTableRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+
+        // Disable rate liming for local and inter-DC traffic
+        StorageService.instance.setEntireSSTableStreamThroughputMebibytesPerSec(0);
+        StorageService.instance.setEntireSSTableInterDCStreamThroughputMebibytesPerSec(0);
+
+        // Rate-limiter enabled for a local and remote peers
+        assertFalse(StreamManager.getEntireSSTableRateLimiter(FBUtilities.getBroadcastAddressAndPort()).isRateLimited());
+        assertFalse(StreamManager.getEntireSSTableRateLimiter(REMOTE_PEER_ADDRESS).isRateLimited());
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java
index 0bf7f20..dad1e79 100644
--- a/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java
+++ b/test/unit/org/apache/cassandra/streaming/StreamTransferTaskTest.java
@@ -17,12 +17,12 @@
  */
 package org.apache.cassandra.streaming;
 
+import java.net.InetSocketAddress;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.UUID;
 import java.util.concurrent.CancellationException;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
@@ -31,9 +31,9 @@
 import org.junit.After;
 import org.junit.Test;
 
-import io.netty.channel.embedded.EmbeddedChannel;
 import org.junit.Assert;
 import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.Util;
 import org.apache.cassandra.concurrent.ScheduledExecutors;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Keyspace;
@@ -43,12 +43,17 @@
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.net.TestChannel;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.TableId;
+import org.apache.cassandra.streaming.async.NettyStreamingChannel;
+import org.apache.cassandra.streaming.async.NettyStreamingConnectionFactory;
 import org.apache.cassandra.streaming.messages.OutgoingStreamMessage;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.concurrent.Ref;
 
+import static org.apache.cassandra.net.MessagingService.current_version;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
@@ -57,6 +62,15 @@
     public static final String KEYSPACE1 = "StreamTransferTaskTest";
     public static final String CF_STANDARD = "Standard1";
 
+    static final StreamingChannel.Factory FACTORY = new NettyStreamingConnectionFactory()
+    {
+        @Override
+        public NettyStreamingChannel create(InetSocketAddress to, int messagingVersion, StreamingChannel.Kind kind)
+        {
+            return new NettyStreamingChannel(messagingVersion, new TestChannel(), kind);
+        }
+    };
+
     @BeforeClass
     public static void defineSchema() throws ConfigurationException
     {
@@ -77,14 +91,15 @@
     public void testScheduleTimeout() throws Exception
     {
         InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
-        StreamSession session = new StreamSession(StreamOperation.BOOTSTRAP, peer, (template, messagingVersion) -> new EmbeddedChannel(), false, 0, UUID.randomUUID(), PreviewKind.ALL);
+        StreamSession session = new StreamSession(StreamOperation.BOOTSTRAP, peer, FACTORY, null, current_version, false, 0, nextTimeUUID(), PreviewKind.ALL);
+        session.init(new StreamResultFuture(nextTimeUUID(), StreamOperation.OTHER, nextTimeUUID(), PreviewKind.NONE));
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD);
 
         // create two sstables
         for (int i = 0; i < 2; i++)
         {
             SchemaLoader.insertData(KEYSPACE1, CF_STANDARD, i, 1);
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         // create streaming task that streams those two sstables
@@ -125,9 +140,9 @@
     public void testFailSessionDuringTransferShouldNotReleaseReferences() throws Exception
     {
         InetAddressAndPort peer = FBUtilities.getBroadcastAddressAndPort();
-        StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new DefaultConnectionFactory(), false, false, null, PreviewKind.NONE);
-        StreamResultFuture future = StreamResultFuture.createInitiator(UUID.randomUUID(), StreamOperation.OTHER, Collections.<StreamEventHandler>emptyList(), streamCoordinator);
-        StreamSession session = new StreamSession(StreamOperation.BOOTSTRAP, peer, null, false, 0, null, PreviewKind.NONE);
+        StreamCoordinator streamCoordinator = new StreamCoordinator(StreamOperation.BOOTSTRAP, 1, new NettyStreamingConnectionFactory(), false, false, null, PreviewKind.NONE);
+        StreamResultFuture future = StreamResultFuture.createInitiator(nextTimeUUID(), StreamOperation.OTHER, Collections.<StreamEventHandler>emptyList(), streamCoordinator);
+        StreamSession session = new StreamSession(StreamOperation.BOOTSTRAP, peer, FACTORY, null, current_version, false, 0, null, PreviewKind.NONE);
         session.init(future);
         ColumnFamilyStore cfs = Keyspace.open(KEYSPACE1).getColumnFamilyStore(CF_STANDARD);
 
@@ -135,7 +150,7 @@
         for (int i = 0; i < 2; i++)
         {
             SchemaLoader.insertData(KEYSPACE1, CF_STANDARD, i, 1);
-            cfs.forceBlockingFlush();
+            Util.flush(cfs);
         }
 
         // create streaming task that streams those two sstables
@@ -174,7 +189,7 @@
 
         //wait for stream to abort asynchronously
         int tries = 10;
-        while (ScheduledExecutors.nonPeriodicTasks.getActiveCount() > 0)
+        while (ScheduledExecutors.nonPeriodicTasks.getActiveTaskCount() > 0)
         {
             if(tries < 1)
                 throw new RuntimeException("test did not complete in time");
diff --git a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java
index a4aa77f..cffd3b2 100644
--- a/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java
+++ b/test/unit/org/apache/cassandra/streaming/StreamingTransferTest.java
@@ -54,6 +54,7 @@
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.utils.ByteBufferUtil;
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.concurrent.Refs;
 
 import static org.apache.cassandra.SchemaLoader.compositeIndexCFMD;
@@ -116,7 +117,7 @@
     public void testEmptyStreamPlan() throws Exception
     {
         StreamResultFuture futureResult = new StreamPlan(StreamOperation.OTHER).execute();
-        final UUID planId = futureResult.planId;
+        final TimeUUID planId = futureResult.planId;
         Futures.addCallback(futureResult, new FutureCallback<StreamState>()
         {
             public void onSuccess(StreamState result)
@@ -148,7 +149,7 @@
                                                   .requestRanges(LOCAL, KEYSPACE2, RangesAtEndpoint.toDummyList(ranges), RangesAtEndpoint.toDummyList(Collections.emptyList()))
                                                   .execute();
 
-        UUID planId = futureResult.planId;
+        TimeUUID planId = futureResult.planId;
         StreamState result = futureResult.get();
         assert planId.equals(result.planId);
         assert result.streamOperation == StreamOperation.OTHER;
@@ -174,7 +175,7 @@
         long timestamp = 1234;
         for (int i = 1; i <= 3; i++)
             mutator.mutate("key" + i, "col" + i, timestamp);
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Util.compactAll(cfs, Integer.MAX_VALUE).get();
         assertEquals(1, cfs.getLiveSSTables().size());
 
@@ -362,7 +363,7 @@
                 .build()
                 .apply();
 
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
 
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
         cfs.clearUnsafe();
@@ -554,7 +555,7 @@
         // write a lot more data so the data is spread in more than 1 chunk.
         for (int i = 1; i <= 6000; i++)
             mutator.mutate("key" + i, "col" + i, System.currentTimeMillis());
-        cfs.forceBlockingFlush();
+        Util.flush(cfs);
         Util.compactAll(cfs, Integer.MAX_VALUE).get();
         SSTableReader sstable = cfs.getLiveSSTables().iterator().next();
         cfs.clearUnsafe();
diff --git a/test/unit/org/apache/cassandra/streaming/async/NettyStreamingMessageSenderTest.java b/test/unit/org/apache/cassandra/streaming/async/NettyStreamingMessageSenderTest.java
deleted file mode 100644
index 76bfa76..0000000
--- a/test/unit/org/apache/cassandra/streaming/async/NettyStreamingMessageSenderTest.java
+++ /dev/null
@@ -1,205 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.streaming.async;
-
-import java.util.UUID;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.Future;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-import com.google.common.net.InetAddresses;
-import org.junit.After;
-import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import io.netty.channel.ChannelPromise;
-import org.apache.cassandra.config.DatabaseDescriptor;
-import org.apache.cassandra.locator.InetAddressAndPort;
-import org.apache.cassandra.net.TestChannel;
-import org.apache.cassandra.net.TestScheduledFuture;
-import org.apache.cassandra.streaming.PreviewKind;
-import org.apache.cassandra.streaming.StreamOperation;
-import org.apache.cassandra.streaming.StreamResultFuture;
-import org.apache.cassandra.streaming.StreamSession;
-import org.apache.cassandra.streaming.messages.CompleteMessage;
-
-public class NettyStreamingMessageSenderTest
-{
-    private static final InetAddressAndPort REMOTE_ADDR = InetAddressAndPort.getByAddressOverrideDefaults(InetAddresses.forString("127.0.0.2"), 0);
-
-    private TestChannel channel;
-    private StreamSession session;
-    private NettyStreamingMessageSender sender;
-    private NettyStreamingMessageSender.FileStreamTask fileStreamTask;
-
-    @BeforeClass
-    public static void before()
-    {
-        DatabaseDescriptor.daemonInitialization();
-    }
-
-    @Before
-    public void setUp()
-    {
-        channel = new TestChannel(Integer.MAX_VALUE);
-        channel.attr(NettyStreamingMessageSender.TRANSFERRING_FILE_ATTR).set(Boolean.FALSE);
-        UUID pendingRepair = UUID.randomUUID();
-        session = new StreamSession(StreamOperation.BOOTSTRAP, REMOTE_ADDR, (template, messagingVersion) -> null, true, 0, pendingRepair, PreviewKind.ALL);
-        StreamResultFuture future = StreamResultFuture.createFollower(0, UUID.randomUUID(), StreamOperation.REPAIR, REMOTE_ADDR, channel, pendingRepair, session.getPreviewKind());
-        session.init(future);
-        session.attachOutbound(channel);
-
-        sender = session.getMessageSender();
-        sender.setControlMessageChannel(channel);
-    }
-
-    @After
-    public void tearDown()
-    {
-        if (fileStreamTask != null)
-            fileStreamTask.unsetChannel();
-    }
-
-    @Test
-    public void KeepAliveTask_normalSend()
-    {
-        Assert.assertTrue(channel.isOpen());
-        NettyStreamingMessageSender.KeepAliveTask task = sender.new KeepAliveTask(channel, session);
-        task.run();
-        Assert.assertTrue(channel.releaseOutbound());
-    }
-
-    @Test
-    public void KeepAliveTask_channelClosed()
-    {
-        channel.close();
-        Assert.assertFalse(channel.isOpen());
-        channel.releaseOutbound();
-        NettyStreamingMessageSender.KeepAliveTask task = sender.new KeepAliveTask(channel, session);
-        task.future = new TestScheduledFuture();
-        Assert.assertFalse(task.future.isCancelled());
-        task.run();
-        Assert.assertTrue(task.future.isCancelled());
-        Assert.assertFalse(channel.releaseOutbound());
-    }
-
-    @Test
-    public void KeepAliveTask_closed()
-    {
-        Assert.assertTrue(channel.isOpen());
-        NettyStreamingMessageSender.KeepAliveTask task = sender.new KeepAliveTask(channel, session);
-        task.future = new TestScheduledFuture();
-        Assert.assertFalse(task.future.isCancelled());
-
-        sender.setClosed();
-        Assert.assertFalse(sender.connected());
-        task.run();
-        Assert.assertTrue(task.future.isCancelled());
-        Assert.assertFalse(channel.releaseOutbound());
-    }
-
-    @Test
-    public void KeepAliveTask_CurrentlyStreaming()
-    {
-        Assert.assertTrue(channel.isOpen());
-        channel.attr(NettyStreamingMessageSender.TRANSFERRING_FILE_ATTR).set(Boolean.TRUE);
-        NettyStreamingMessageSender.KeepAliveTask task = sender.new KeepAliveTask(channel, session);
-        task.future = new TestScheduledFuture();
-        Assert.assertFalse(task.future.isCancelled());
-
-        Assert.assertTrue(sender.connected());
-        task.run();
-        Assert.assertFalse(task.future.isCancelled());
-        Assert.assertFalse(channel.releaseOutbound());
-    }
-
-    @Test
-    public void FileStreamTask_acquirePermit_closed()
-    {
-        fileStreamTask = sender.new FileStreamTask(null);
-        sender.setClosed();
-        Assert.assertFalse(fileStreamTask.acquirePermit(1));
-    }
-
-    @Test
-    public void FileStreamTask_acquirePermit_HapppyPath()
-    {
-        int permits = sender.semaphoreAvailablePermits();
-        fileStreamTask = sender.new FileStreamTask(null);
-        Assert.assertTrue(fileStreamTask.acquirePermit(1));
-        Assert.assertEquals(permits - 1, sender.semaphoreAvailablePermits());
-    }
-
-    @Test
-    public void FileStreamTask_BadChannelAttr()
-    {
-        int permits = sender.semaphoreAvailablePermits();
-        channel.attr(NettyStreamingMessageSender.TRANSFERRING_FILE_ATTR).set(Boolean.TRUE);
-        fileStreamTask = sender.new FileStreamTask(null);
-        fileStreamTask.injectChannel(channel);
-        fileStreamTask.run();
-        Assert.assertEquals(StreamSession.State.FAILED, session.state());
-        Assert.assertTrue(channel.releaseOutbound()); // when the session fails, it will send a SessionFailed msg
-        Assert.assertEquals(permits, sender.semaphoreAvailablePermits());
-    }
-
-    @Test
-    public void FileStreamTask_HappyPath()
-    {
-        int permits = sender.semaphoreAvailablePermits();
-        fileStreamTask = sender.new FileStreamTask(new CompleteMessage());
-        fileStreamTask.injectChannel(channel);
-        fileStreamTask.run();
-        Assert.assertNotEquals(StreamSession.State.FAILED, session.state());
-        Assert.assertTrue(channel.releaseOutbound());
-        Assert.assertEquals(permits, sender.semaphoreAvailablePermits());
-    }
-
-    @Test
-    public void onControlMessageComplete_HappyPath()
-    {
-        Assert.assertTrue(channel.isOpen());
-        Assert.assertTrue(sender.connected());
-        ChannelPromise promise = channel.newPromise();
-        promise.setSuccess();
-        Assert.assertNull(sender.onControlMessageComplete(promise, new CompleteMessage()));
-        Assert.assertTrue(channel.isOpen());
-        Assert.assertTrue(sender.connected());
-        Assert.assertNotEquals(StreamSession.State.FAILED, session.state());
-    }
-
-    @Test
-    public void onControlMessageComplete_Exception() throws InterruptedException, ExecutionException, TimeoutException
-    {
-        Assert.assertTrue(channel.isOpen());
-        Assert.assertTrue(sender.connected());
-        ChannelPromise promise = channel.newPromise();
-        promise.setFailure(new RuntimeException("this is just a testing exception"));
-        Future f = sender.onControlMessageComplete(promise, new CompleteMessage());
-
-        f.get(5, TimeUnit.SECONDS);
-
-        Assert.assertFalse(channel.isOpen());
-        Assert.assertFalse(sender.connected());
-        Assert.assertEquals(StreamSession.State.FAILED, session.state());
-    }
-}
diff --git a/test/unit/org/apache/cassandra/streaming/async/StreamingInboundHandlerTest.java b/test/unit/org/apache/cassandra/streaming/async/StreamingInboundHandlerTest.java
index a43b116..b156ab7 100644
--- a/test/unit/org/apache/cassandra/streaming/async/StreamingInboundHandlerTest.java
+++ b/test/unit/org/apache/cassandra/streaming/async/StreamingInboundHandlerTest.java
@@ -20,9 +20,7 @@
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
-import java.util.UUID;
 
-import com.google.common.net.InetAddresses;
 import org.junit.After;
 import org.junit.Assert;
 import org.junit.Before;
@@ -36,28 +34,32 @@
 import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputBuffer;
 import org.apache.cassandra.io.util.DataOutputPlus;
-import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.net.AsyncStreamingInputPlus;
+import org.apache.cassandra.net.TestChannel;
 import org.apache.cassandra.schema.TableId;
 import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.streaming.StreamDeserializingTask;
 import org.apache.cassandra.streaming.StreamManager;
 import org.apache.cassandra.streaming.StreamOperation;
 import org.apache.cassandra.streaming.StreamResultFuture;
 import org.apache.cassandra.streaming.StreamSession;
+import org.apache.cassandra.streaming.StreamingChannel;
 import org.apache.cassandra.streaming.messages.CompleteMessage;
 import org.apache.cassandra.streaming.messages.IncomingStreamMessage;
 import org.apache.cassandra.streaming.messages.StreamInitMessage;
 import org.apache.cassandra.streaming.messages.StreamMessageHeader;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+import static org.apache.cassandra.net.TestChannel.REMOTE_ADDR;
 
 public class StreamingInboundHandlerTest
 {
     private static final int VERSION = MessagingService.current_version;
-    private static final InetAddressAndPort REMOTE_ADDR = InetAddressAndPort.getByAddressOverrideDefaults(InetAddresses.forString("127.0.0.2"), 0);
 
-    private StreamingInboundHandler handler;
+    private NettyStreamingChannel streamingChannel;
     private EmbeddedChannel channel;
-    private AsyncStreamingInputPlus buffers;
     private ByteBuf buf;
 
     @BeforeClass
@@ -69,10 +71,9 @@
     @Before
     public void setup()
     {
-        handler = new StreamingInboundHandler(REMOTE_ADDR, VERSION, null);
-        channel = new EmbeddedChannel(handler);
-        buffers = new AsyncStreamingInputPlus(channel);
-        handler.setPendingBuffers(buffers);
+        channel = new TestChannel();
+        streamingChannel = new NettyStreamingChannel(VERSION, channel, StreamingChannel.Kind.CONTROL);
+        channel.pipeline().addLast("stream", streamingChannel);
     }
 
     @After
@@ -88,32 +89,18 @@
     }
 
     @Test
-    public void channelRead_Closed()
-    {
-        int size = 8;
-        buf = channel.alloc().buffer(size);
-        Assert.assertEquals(1, buf.refCnt());
-        buf.writerIndex(size);
-        handler.close();
-        channel.writeInbound(buf);
-        Assert.assertEquals(0, buffers.unsafeAvailable());
-        Assert.assertEquals(0, buf.refCnt());
-        Assert.assertFalse(channel.releaseInbound());
-    }
-
-    @Test
     public void channelRead_WrongObject()
     {
         channel.writeInbound("homer");
-        Assert.assertEquals(0, buffers.unsafeAvailable());
+        Assert.assertEquals(0, streamingChannel.in.unsafeAvailable());
         Assert.assertFalse(channel.releaseInbound());
     }
 
     @Test
     public void StreamDeserializingTask_deriveSession_StreamInitMessage()
     {
-        StreamInitMessage msg = new StreamInitMessage(REMOTE_ADDR, 0, UUID.randomUUID(), StreamOperation.REPAIR, UUID.randomUUID(), PreviewKind.ALL);
-        StreamingInboundHandler.StreamDeserializingTask task = handler.new StreamDeserializingTask(null, channel);
+        StreamInitMessage msg = new StreamInitMessage(REMOTE_ADDR, 0, nextTimeUUID(), StreamOperation.REPAIR, nextTimeUUID(), PreviewKind.ALL);
+        StreamDeserializingTask task = new StreamDeserializingTask(null, streamingChannel, streamingChannel.messagingVersion);
         StreamSession session = task.deriveSession(msg);
         Assert.assertNotNull(session);
     }
@@ -122,15 +109,15 @@
     public void StreamDeserializingTask_deriveSession_NoSession()
     {
         CompleteMessage msg = new CompleteMessage();
-        StreamingInboundHandler.StreamDeserializingTask task = handler.new StreamDeserializingTask(null, channel);
+        StreamDeserializingTask task = new StreamDeserializingTask(null, streamingChannel, streamingChannel.messagingVersion);
         task.deriveSession(msg);
     }
 
     @Test (expected = IllegalStateException.class)
     public void StreamDeserializingTask_deserialize_ISM_NoSession() throws IOException
     {
-        StreamMessageHeader header = new StreamMessageHeader(TableId.generate(), REMOTE_ADDR, UUID.randomUUID(), true,
-                                                             0, 0, 0, UUID.randomUUID());
+        StreamMessageHeader header = new StreamMessageHeader(TableId.generate(), REMOTE_ADDR, nextTimeUUID(), true,
+                                                             0, 0, 0, nextTimeUUID());
 
         ByteBuffer temp = ByteBuffer.allocate(1024);
         DataOutputPlus out = new DataOutputBuffer(temp);
@@ -145,11 +132,11 @@
     @Test
     public void StreamDeserializingTask_deserialize_ISM_HasSession()
     {
-        UUID planId = UUID.randomUUID();
-        StreamResultFuture future = StreamResultFuture.createFollower(0, planId, StreamOperation.REPAIR, REMOTE_ADDR, channel, UUID.randomUUID(), PreviewKind.ALL);
+        TimeUUID planId = nextTimeUUID();
+        StreamResultFuture future = StreamResultFuture.createFollower(0, planId, StreamOperation.REPAIR, REMOTE_ADDR, streamingChannel, streamingChannel.messagingVersion, nextTimeUUID(), PreviewKind.ALL);
         StreamManager.instance.registerFollower(future);
         StreamMessageHeader header = new StreamMessageHeader(TableId.generate(), REMOTE_ADDR, planId, false,
-                                                             0, 0, 0, UUID.randomUUID());
+                                                             0, 0, 0, nextTimeUUID());
 
         // IncomingStreamMessage.serializer.deserialize
         StreamSession session = StreamManager.instance.findSession(header.sender, header.planId, header.sessionIndex, header.sendByFollower);
diff --git a/test/unit/org/apache/cassandra/streaming/async/StreamingMultiplexedChannelTest.java b/test/unit/org/apache/cassandra/streaming/async/StreamingMultiplexedChannelTest.java
new file mode 100644
index 0000000..d43f6d5
--- /dev/null
+++ b/test/unit/org/apache/cassandra/streaming/async/StreamingMultiplexedChannelTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.streaming.async;
+
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import io.netty.channel.ChannelPromise;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.net.TestChannel;
+import org.apache.cassandra.streaming.PreviewKind;
+import org.apache.cassandra.streaming.StreamOperation;
+import org.apache.cassandra.streaming.StreamResultFuture;
+import org.apache.cassandra.streaming.StreamSession;
+import org.apache.cassandra.streaming.StreamingChannel;
+import org.apache.cassandra.streaming.messages.CompleteMessage;
+import org.apache.cassandra.utils.TimeUUID;
+
+import static org.apache.cassandra.net.MessagingService.current_version;
+import static org.apache.cassandra.net.TestChannel.REMOTE_ADDR;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
+public class StreamingMultiplexedChannelTest
+{
+    private NettyStreamingChannel streamingChannel;
+    private TestChannel channel;
+    private StreamSession session;
+    private StreamingMultiplexedChannel sender;
+    private StreamingMultiplexedChannel.FileStreamTask fileStreamTask;
+
+    @BeforeClass
+    public static void before()
+    {
+        DatabaseDescriptor.daemonInitialization();
+    }
+
+    @Before
+    public void setUp()
+    {
+        channel = new TestChannel();
+        streamingChannel = new NettyStreamingChannel(current_version, channel, StreamingChannel.Kind.CONTROL);
+        TimeUUID pendingRepair = nextTimeUUID();
+        session = new StreamSession(StreamOperation.BOOTSTRAP, REMOTE_ADDR, new NettyStreamingConnectionFactory(), streamingChannel, current_version, true, 0, pendingRepair, PreviewKind.ALL);
+        StreamResultFuture future = StreamResultFuture.createFollower(0, nextTimeUUID(), StreamOperation.REPAIR, REMOTE_ADDR, streamingChannel, current_version, pendingRepair, session.getPreviewKind());
+        session.init(future);
+        session.attachOutbound(streamingChannel);
+
+        sender = session.getChannel();
+        sender.setControlChannel(streamingChannel);
+    }
+
+    @After
+    public void tearDown()
+    {
+        if (fileStreamTask != null)
+            fileStreamTask.unsetChannel();
+    }
+
+    @Test
+    public void FileStreamTask_acquirePermit_closed()
+    {
+        fileStreamTask = sender.new FileStreamTask(null);
+        sender.setClosed();
+        Assert.assertFalse(fileStreamTask.acquirePermit(1));
+    }
+
+    @Test
+    public void FileStreamTask_acquirePermit_HapppyPath()
+    {
+        int permits = sender.semaphoreAvailablePermits();
+        fileStreamTask = sender.new FileStreamTask(null);
+        Assert.assertTrue(fileStreamTask.acquirePermit(1));
+        Assert.assertEquals(permits - 1, sender.semaphoreAvailablePermits());
+    }
+
+    @Test
+    public void FileStreamTask_BadChannelAttr()
+    {
+        int permits = sender.semaphoreAvailablePermits();
+        channel.attr(NettyStreamingChannel.TRANSFERRING_FILE_ATTR).set(Boolean.TRUE);
+        fileStreamTask = sender.new FileStreamTask(null);
+        fileStreamTask.injectChannel(streamingChannel);
+        fileStreamTask.run();
+        Assert.assertEquals(StreamSession.State.FAILED, session.state());
+        Assert.assertTrue(channel.releaseOutbound()); // when the session fails, it will send a SessionFailed msg
+        Assert.assertEquals(permits, sender.semaphoreAvailablePermits());
+    }
+
+    @Test
+    public void FileStreamTask_HappyPath()
+    {
+        int permits = sender.semaphoreAvailablePermits();
+        fileStreamTask = sender.new FileStreamTask(new CompleteMessage());
+        fileStreamTask.injectChannel(streamingChannel);
+        fileStreamTask.run();
+        Assert.assertNotEquals(StreamSession.State.FAILED, session.state());
+        Assert.assertTrue(channel.releaseOutbound());
+        Assert.assertEquals(permits, sender.semaphoreAvailablePermits());
+    }
+
+    @Test
+    public void onControlMessageComplete_HappyPath()
+    {
+        Assert.assertTrue(channel.isOpen());
+        Assert.assertTrue(sender.connected());
+        ChannelPromise promise = channel.newPromise();
+        promise.setSuccess();
+        Assert.assertNull(sender.onMessageComplete(promise, new CompleteMessage()));
+        Assert.assertTrue(channel.isOpen());
+        Assert.assertTrue(sender.connected());
+        Assert.assertNotEquals(StreamSession.State.FAILED, session.state());
+    }
+
+    @Test
+    public void onControlMessageComplete_Exception() throws InterruptedException, ExecutionException, TimeoutException
+    {
+        Assert.assertTrue(channel.isOpen());
+        Assert.assertTrue(sender.connected());
+        ChannelPromise promise = channel.newPromise();
+        promise.setFailure(new RuntimeException("this is just a testing exception"));
+        Future f = sender.onMessageComplete(promise, new CompleteMessage());
+
+        f.get(5, TimeUnit.SECONDS);
+
+        Assert.assertFalse(channel.isOpen());
+        Assert.assertFalse(sender.connected());
+        Assert.assertEquals(StreamSession.State.FAILED, session.state());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java b/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java
index 11f6b55..619e0d9 100644
--- a/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java
+++ b/test/unit/org/apache/cassandra/streaming/compression/CompressedInputStreamTest.java
@@ -17,9 +17,14 @@
  */
 package org.apache.cassandra.streaming.compression;
 
-import java.io.*;
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.EOFException;
+import java.io.IOException;
 import java.util.*;
 
+import org.apache.cassandra.io.sstable.SequenceBasedSSTableId;
+import org.apache.cassandra.io.util.File;
 import org.junit.BeforeClass;
 import org.junit.Rule;
 import org.junit.Test;
@@ -32,7 +37,7 @@
 import org.apache.cassandra.io.compress.CompressionMetadata;
 import org.apache.cassandra.io.sstable.format.SSTableReader;
 import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus;
-import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.io.util.RandomAccessReader;
 import org.apache.cassandra.io.util.SequentialWriterOption;
 import org.apache.cassandra.schema.CompressionParams;
 import org.apache.cassandra.io.sstable.Component;
@@ -114,8 +119,8 @@
         assert valuesToCheck != null && valuesToCheck.length > 0;
 
         // write compressed data file of longs
-        File parentDir = tempFolder.newFolder();
-        Descriptor desc = new Descriptor(parentDir, "ks", "cf", 1);
+        File parentDir = new File(tempFolder.newFolder());
+        Descriptor desc = new Descriptor(parentDir, "ks", "cf", new SequenceBasedSSTableId(1));
         File tmp = new File(desc.filenameFor(Component.DATA));
         MetadataCollector collector = new MetadataCollector(new ClusteringComparator(BytesType.instance));
         CompressionParams param = CompressionParams.snappy(32, minCompressRatio);
@@ -134,7 +139,7 @@
             writer.finish();
         }
 
-        CompressionMetadata comp = CompressionMetadata.create(tmp.getAbsolutePath());
+        CompressionMetadata comp = CompressionMetadata.create(tmp.absolutePath());
         List<SSTableReader.PartitionPositionBounds> sections = new ArrayList<>();
         for (long l : valuesToCheck)
         {
@@ -154,7 +159,7 @@
             size += (c.length + 4); // 4bytes CRC
         byte[] toRead = new byte[size];
 
-        try (RandomAccessFile f = new RandomAccessFile(tmp, "r"))
+        try (RandomAccessReader f = RandomAccessReader.open(tmp))
         {
             int pos = 0;
             for (CompressionMetadata.Chunk c : chunks)
diff --git a/test/unit/org/apache/cassandra/streaming/messages/KeepAliveMessageTest.java b/test/unit/org/apache/cassandra/streaming/messages/KeepAliveMessageTest.java
new file mode 100644
index 0000000..7ba637b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/streaming/messages/KeepAliveMessageTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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.streaming.messages;
+
+import java.io.IOException;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertThat;
+import static org.hamcrest.CoreMatchers.equalTo;
+
+public class KeepAliveMessageTest
+{
+
+    @Test
+    public void testSerializedSize() throws IOException
+    {
+        assertThat(StreamMessage.serializedSize(new KeepAliveMessage(), 0), equalTo(1L));
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/tools/AuditLogViewerTest.java b/test/unit/org/apache/cassandra/tools/AuditLogViewerTest.java
index 5c0cb9d..514857e 100644
--- a/test/unit/org/apache/cassandra/tools/AuditLogViewerTest.java
+++ b/test/unit/org/apache/cassandra/tools/AuditLogViewerTest.java
@@ -28,6 +28,7 @@
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.Lists;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.io.FileUtils;
 
 import org.junit.After;
@@ -65,10 +66,10 @@
     @After
     public void tearDown() throws IOException
     {
-        if (path.toFile().exists() && path.toFile().isDirectory())
+        if (new File(path).exists() && new File(path).isDirectory())
         {
             //Deletes directory and all of it's contents
-            FileUtils.deleteDirectory(path.toFile());
+            FileUtils.deleteDirectory(new File(path).toJavaIOFile());
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/tools/BulkLoaderTest.java b/test/unit/org/apache/cassandra/tools/BulkLoaderTest.java
index fce4cda..507aa53 100644
--- a/test/unit/org/apache/cassandra/tools/BulkLoaderTest.java
+++ b/test/unit/org/apache/cassandra/tools/BulkLoaderTest.java
@@ -21,6 +21,7 @@
 import org.junit.Test;
 
 import com.datastax.driver.core.exceptions.NoHostAvailableException;
+import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.tools.ToolRunner.ToolResult;
 import org.hamcrest.CoreMatchers;
 
@@ -36,7 +37,9 @@
         assertEquals(1, tool.getExitCode());
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsString("Missing sstable directory argument"));
         
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(new String[] { "ObjectCleanerThread",
+                                                        "Shutdown-checker",
+                                                        "cluster[0-9]-connection-reaper-[0-9]" });
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -58,7 +61,11 @@
         if (!(tool.getException().getCause().getCause().getCause() instanceof NoHostAvailableException))
             throw tool.getException();
 
-        assertNoUnexpectedThreadsStarted(null, new String[]{"globalEventExecutor-1-1", "globalEventExecutor-1-2"});
+        assertNoUnexpectedThreadsStarted(new String[] { "ObjectCleanerThread",
+                                                        "globalEventExecutor-[1-9]-[1-9]",
+                                                        "globalEventExecutor-[1-9]-[1-9]",
+                                                        "Shutdown-checker",
+                                                        "cluster[0-9]-connection-reaper-[0-9]" });
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -82,7 +89,11 @@
         if (!(tool.getException().getCause().getCause().getCause() instanceof NoHostAvailableException))
             throw tool.getException();
 
-        assertNoUnexpectedThreadsStarted(null, new String[] { "globalEventExecutor-1-1", "globalEventExecutor-1-2" });
+        assertNoUnexpectedThreadsStarted(new String[] { "ObjectCleanerThread",
+                                                        "globalEventExecutor-[1-9]-[1-9]",
+                                                        "globalEventExecutor-[1-9]-[1-9]",
+                                                        "Shutdown-checker",
+                                                        "cluster[0-9]-connection-reaper-[0-9]" });
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -106,7 +117,11 @@
         if (!(tool.getException().getCause().getCause().getCause() instanceof NoHostAvailableException))
             throw tool.getException();
 
-        assertNoUnexpectedThreadsStarted(null, new String[] { "globalEventExecutor-1-1", "globalEventExecutor-1-2" });
+        assertNoUnexpectedThreadsStarted(new String[] { "ObjectCleanerThread",
+                                                        "globalEventExecutor-[1-9]-[1-9]",
+                                                        "globalEventExecutor-[1-9]-[1-9]",
+                                                        "Shutdown-checker",
+                                                        "cluster[0-9]-connection-reaper-[0-9]" });
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -137,4 +152,50 @@
         assertEquals(-1, tool.getExitCode());
         throw tool.getException().getCause().getCause().getCause();
     }
+
+    @Test(expected = NoHostAvailableException.class)
+    public void testBulkLoader_WithArgs5() throws Throwable
+    {
+        ToolResult tool = ToolRunner.invokeClass(BulkLoader.class,
+                                                 "-d",
+                                                 "127.9.9.1:9041",
+                                                 "--throttle",
+                                                 "10",
+                                                 "--inter-dc-throttle",
+                                                 "15",
+                                                 "--entire-sstable-throttle-mib",
+                                                 "20",
+                                                 "--entire-sstable-inter-dc-throttle-mib",
+                                                 "25",
+                                                 OfflineToolUtils.sstableDirName("legacy_sstables", "legacy_ma_simple"));
+        assertEquals(-1, tool.getExitCode());
+        assertEquals(10 * 125_000, DatabaseDescriptor.getStreamThroughputOutboundBytesPerSec(), 0.0);
+        assertEquals(15 * 125_000, DatabaseDescriptor.getInterDCStreamThroughputOutboundBytesPerSec(), 0.0);
+        assertEquals(20, DatabaseDescriptor.getEntireSSTableStreamThroughputOutboundMebibytesPerSec(), 0.0);
+        assertEquals(25, DatabaseDescriptor.getEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec(), 0.0);
+        throw tool.getException().getCause().getCause().getCause();
+    }
+
+    @Test(expected = NoHostAvailableException.class)
+    public void testBulkLoader_WithArgs6() throws Throwable
+    {
+        ToolResult tool = ToolRunner.invokeClass(BulkLoader.class,
+                                                 "-d",
+                                                 "127.9.9.1:9041",
+                                                 "--throttle-mib",
+                                                 "3",
+                                                 "--inter-dc-throttle-mib",
+                                                 "4",
+                                                 "--entire-sstable-throttle-mib",
+                                                 "5",
+                                                 "--entire-sstable-inter-dc-throttle-mib",
+                                                 "6",
+                                                 OfflineToolUtils.sstableDirName("legacy_sstables", "legacy_ma_simple"));
+        assertEquals(-1, tool.getExitCode());
+        assertEquals(3 * 1024 * 1024, DatabaseDescriptor.getStreamThroughputOutboundBytesPerSec(), 0.0);
+        assertEquals(4 * 1024 * 1024, DatabaseDescriptor.getInterDCStreamThroughputOutboundBytesPerSec(), 0.0);
+        assertEquals(5, DatabaseDescriptor.getEntireSSTableStreamThroughputOutboundMebibytesPerSec(), 0.0);
+        assertEquals(6, DatabaseDescriptor.getEntireSSTableInterDCStreamThroughputOutboundMebibytesPerSec(), 0.0);
+        throw tool.getException().getCause().getCause().getCause();
+    }
 }
diff --git a/test/unit/org/apache/cassandra/tools/ClearSnapshotTest.java b/test/unit/org/apache/cassandra/tools/ClearSnapshotTest.java
deleted file mode 100644
index 975e45b..0000000
--- a/test/unit/org/apache/cassandra/tools/ClearSnapshotTest.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.tools;
-
-import java.io.IOException;
-import java.util.Map;
-
-import javax.management.openmbean.TabularData;
-
-import org.junit.AfterClass;
-import org.junit.Assert;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.hamcrest.CoreMatchers;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-
-public class ClearSnapshotTest extends CQLTester
-{
-    private static NodeProbe probe;
-
-    @BeforeClass
-    public static void setup() throws Exception
-    {
-        startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
-    }
-
-    @Test
-    public void testClearSnapshot_NoArgs()
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("clearsnapshot");
-        assertEquals(2, tool.getExitCode());
-        assertTrue("Tool stderr: " +  tool.getCleanedStderr(), tool.getCleanedStderr().contains("Specify snapshot name or --all"));
-        
-        tool = ToolRunner.invokeNodetool("clearsnapshot", "--all");
-        tool.assertOnCleanExit();
-    }
-
-    @Test
-    public void testClearSnapshot_AllAndName()
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("clearsnapshot", "-t", "some-name", "--all");
-        assertEquals(2, tool.getExitCode());
-        assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Specify only one of snapshot name or --all"));
-    }
-
-    @Test
-    public void testClearSnapshot_RemoveByName()
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("snapshot","-t","some-name");
-        tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
-        
-        Map<String, TabularData> snapshots_before = probe.getSnapshotDetails();
-        Assert.assertTrue(snapshots_before.containsKey("some-name"));
-        
-        tool = ToolRunner.invokeNodetool("clearsnapshot","-t","some-name");
-        tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
-        
-        Map<String, TabularData> snapshots_after = probe.getSnapshotDetails();
-        Assert.assertFalse(snapshots_after.containsKey("some-name"));
-    }
-
-    @Test
-    public void testClearSnapshot_RemoveMultiple()
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("snapshot","-t","some-name");
-        tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
-
-        tool = ToolRunner.invokeNodetool("snapshot","-t","some-other-name");
-        tool.assertOnCleanExit();
-            assertTrue(!tool.getStdout().isEmpty());
-
-        Map<String, TabularData> snapshots_before = probe.getSnapshotDetails();
-        Assert.assertTrue(snapshots_before.size() == 2);
-
-        tool = ToolRunner.invokeNodetool("clearsnapshot","--all");
-        tool.assertOnCleanExit();
-        assertTrue(!tool.getStdout().isEmpty());
-        
-        Map<String, TabularData> snapshots_after = probe.getSnapshotDetails();
-        Assert.assertTrue(snapshots_after.size() == 0);
-    }
-    
-}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/tools/CompactionStressTest.java b/test/unit/org/apache/cassandra/tools/CompactionStressTest.java
index 7125f2f..176a240 100644
--- a/test/unit/org/apache/cassandra/tools/CompactionStressTest.java
+++ b/test/unit/org/apache/cassandra/tools/CompactionStressTest.java
@@ -18,8 +18,8 @@
 
 package org.apache.cassandra.tools;
 
-import java.io.File;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import org.apache.cassandra.tools.ToolRunner.ToolResult;
@@ -38,7 +38,7 @@
     {
         ClassLoader classLoader = getClass().getClassLoader();
         File file = new File(classLoader.getResource("blogpost.yaml").getFile());
-        String profileFile = file.getAbsolutePath();
+        String profileFile = file.absolutePath();
 
         ToolResult tool = ToolRunner.invokeClass("org.apache.cassandra.stress.CompactionStress",
                                                  "write",
diff --git a/test/unit/org/apache/cassandra/tools/GetFullQueryLogTest.java b/test/unit/org/apache/cassandra/tools/GetFullQueryLogTest.java
deleted file mode 100644
index 44007a5..0000000
--- a/test/unit/org/apache/cassandra/tools/GetFullQueryLogTest.java
+++ /dev/null
@@ -1,151 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.tools;
-
-import java.io.IOException;
-
-import org.junit.After;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.ClassRule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.fql.FullQueryLoggerOptions;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-public class GetFullQueryLogTest extends CQLTester
-{
-    private static NodeProbe probe;
-
-    @ClassRule
-    public static TemporaryFolder temporaryFolder = new TemporaryFolder();
-
-    @BeforeClass
-    public static void setup() throws Exception
-    {
-        startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
-    }
-
-    @After
-    public void afterTest() throws InterruptedException
-    {
-        disableFullQueryLog();
-    }
-
-    @Test
-    public void getFullQueryLogTest()
-    {
-        testDefaultOutput(getFullQueryLog());
-    }
-
-    @Test
-    public void enableFullQueryLogTest()
-    {
-        enableFullQueryLog();
-        testChangedOutput(getFullQueryLog());
-    }
-
-    @Test
-    public void resetFullQueryLogTest()
-    {
-        enableFullQueryLog();
-        testChangedOutput(getFullQueryLog());
-
-        // reset and get and test that it reset configuration into defaults
-        resetFullQueryLog();
-
-        testDefaultOutput(getFullQueryLog());
-    }
-
-    private String getFullQueryLog()
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("getfullquerylog");
-        tool.assertOnCleanExit();
-        return tool.getStdout();
-    }
-
-    private void resetFullQueryLog()
-    {
-        ToolRunner.invokeNodetool("resetfullquerylog").assertOnCleanExit();
-    }
-
-    private void disableFullQueryLog()
-    {
-        ToolRunner.invokeNodetool("disablefullquerylog").assertOnCleanExit();
-    }
-
-    private void enableFullQueryLog()
-    {
-        ToolRunner.invokeNodetool("enablefullquerylog",
-                                  "--path",
-                                  temporaryFolder.getRoot().toString(),
-                                  "--blocking",
-                                  "false",
-                                  "--max-archive-retries",
-                                  "5",
-                                  "--archive-command",
-                                  "/path/to/script.sh %path",
-                                  "--max-log-size",
-                                  "100000",
-                                  "--max-queue-weight",
-                                  "10000",
-                                  "--roll-cycle",
-                                  "DAILY")
-                  .assertOnCleanExit();
-    }
-
-    private void testChangedOutput(final String getFullQueryLogOutput)
-    {
-        final String output = getFullQueryLogOutput.replaceAll("( )+", " ").trim();
-        assertTrue(output.contains("enabled true"));
-        assertTrue(output.contains("log_dir " + temporaryFolder.getRoot().toString()));
-        assertTrue(output.contains("archive_command /path/to/script.sh %path"));
-        assertTrue(output.contains("roll_cycle DAILY"));
-        assertTrue(output.contains("max_log_size 100000"));
-        assertTrue(output.contains("max_queue_weight 10000"));
-        assertTrue(output.contains("max_archive_retries 5"));
-        assertTrue(output.contains("block false"));
-    }
-
-    private void testDefaultOutput(final String getFullQueryLogOutput)
-    {
-        final FullQueryLoggerOptions options = new FullQueryLoggerOptions();
-        final String output = getFullQueryLogOutput.replaceAll("( )+", " ").trim();
-        assertTrue(output.contains("enabled false"));
-        assertFalse(output.contains("log_dir " + temporaryFolder.getRoot().toString()));
-        assertFalse(output.contains("archive_command /path/to/script.sh %path"));
-        assertTrue(output.contains("roll_cycle " + options.roll_cycle));
-        assertTrue(output.contains("max_log_size " + options.max_log_size));
-        assertTrue(output.contains("max_queue_weight " + options.max_queue_weight));
-        assertTrue(output.contains("max_archive_retries " + options.max_archive_retries));
-        assertTrue(output.contains("block " + options.block));
-    }
-}
diff --git a/test/unit/org/apache/cassandra/tools/GetVersionTest.java b/test/unit/org/apache/cassandra/tools/GetVersionTest.java
index b23c1fe..9eaf57f 100644
--- a/test/unit/org/apache/cassandra/tools/GetVersionTest.java
+++ b/test/unit/org/apache/cassandra/tools/GetVersionTest.java
@@ -29,7 +29,7 @@
     {
         ToolResult tool = ToolRunner.invokeClass(GetVersion.class);
         tool.assertOnCleanExit();
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/HashPasswordTest.java b/test/unit/org/apache/cassandra/tools/HashPasswordTest.java
new file mode 100644
index 0000000..f84bd8b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/HashPasswordTest.java
@@ -0,0 +1,150 @@
+/*
+ * 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.tools;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.util.Arrays;
+import java.util.Collections;
+
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner.ToolResult;
+import org.mindrot.jbcrypt.BCrypt;
+
+import static org.hamcrest.Matchers.containsString;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+public class HashPasswordTest extends CQLTester
+{
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+    private static final String plaintextPassword = "foobar";
+    private static final String hashPasswordTool = "tools/bin/hash_password";
+
+    /* If help changed you also need to change the docs*/
+    @Test
+    public void testHelpAndShouldChangeDocs()
+    {
+        ToolResult tool = ToolRunner.invoke(hashPasswordTool, "-h");
+        tool.assertOnCleanExit();
+        String help = "usage: hash_password [options]\n" +
+                       "--\n" +
+                       "Hashes a plain text password and prints the hashed password.\n" +
+                       "Options are:\n" +
+                       " -e,--environment-var <arg>   Use value of the specified environment\n" +
+                       "                              variable as the password\n" +
+                       " -h,--help                    Display this help message\n" +
+                       " -i,--input <arg>             Input is a file (or - for stdin) to read the\n" +
+                       "                              password from. Make sure that the whole input including newlines is\n" +
+                       "                              considered. For example, the shell command 'echo -n foobar | hash_password\n" +
+                       "                              -i -' will work as intended and just hash 'foobar'.\n" +
+                       " -p,--plain <arg>             Argument is the plain text password\n" +
+                       " -r,--logrounds <arg>         Number of hash rounds (default: 10).\n";
+        assertEquals(help, tool.getStdout());
+    }
+
+    @Test
+    public void testPlain()
+    {
+        ToolResult tool = ToolRunner.invoke(hashPasswordTool, "--plain", plaintextPassword);
+        tool.assertOnCleanExit();
+        String hashed = tool.getStdout();
+        assertTrue("Hashed password does not validate: " + hashed, BCrypt.checkpw(plaintextPassword, hashed));
+    }
+
+    @Test
+    public void testStdIn()
+    {
+        ToolResult tool = ToolRunner.invoke(Collections.emptyMap(),
+                                            new ByteArrayInputStream(plaintextPassword.getBytes()),
+                                            Arrays.asList(hashPasswordTool, "--input", "-"));
+        tool.assertOnCleanExit();
+        String hashed = tool.getStdout();
+        assertTrue("Hashed password does not validate: " + hashed, BCrypt.checkpw(plaintextPassword, hashed));
+    }
+
+    @Test
+    public void testFile() throws IOException
+    {
+        File file = temporaryFolder.newFile();
+        Files.write(file.toPath(), plaintextPassword.getBytes());
+
+        ToolResult tool = ToolRunner.invoke(hashPasswordTool, "--input", file.getAbsolutePath());
+        tool.assertOnCleanExit();
+        String hashed = tool.getStdout();
+        assertTrue("Hashed password does not validate: " + hashed, BCrypt.checkpw(plaintextPassword, hashed));
+    }
+
+    @Test
+    public void testEnvVar()
+    {
+        ToolResult tool = ToolRunner.invoke(Collections.singletonMap("THE_PASSWORD", plaintextPassword),
+                                            null,
+                                            Arrays.asList(hashPasswordTool, "--environment-var", "THE_PASSWORD"));
+        tool.assertOnCleanExit();
+        String hashed = tool.getStdout();
+        assertTrue("Hashed password does not validate: " + hashed, BCrypt.checkpw(plaintextPassword, hashed));
+    }
+
+    @Test
+    public void testLogRounds()
+    {
+        ToolResult tool = ToolRunner.invoke(hashPasswordTool, "--plain", plaintextPassword, "-r", "10");
+        tool.assertOnCleanExit();
+        String hashed = tool.getStdout();
+        assertTrue("Hashed password does not validate: " + hashed, BCrypt.checkpw(plaintextPassword, hashed));
+    }
+
+    @Test
+    public void testShortPass()
+    {
+        ToolResult tool = ToolRunner.invoke(hashPasswordTool, "--plain", "A");
+        tool.assertOnExitCode();
+        assertThat(tool.getStderr(), containsString("password is very short"));
+    }
+
+    @Test
+    public void testErrorMessages()
+    {
+        assertToolError("One of the options --environment-var, --plain or --input must be used.", hashPasswordTool);
+        assertToolError("Environment variable 'non_existing_environment_variable_name' is undefined.",
+                        hashPasswordTool,
+                        "--environment-var",
+                        "non_existing_environment_variable_name");
+        assertToolError("Failed to read from '/foo/bar/baz/blah/yadda': ",
+                        hashPasswordTool,
+                        "--input",
+                        "/foo/bar/baz/blah/yadda");
+    }
+
+    private static void assertToolError(String expectedMessage, String... args)
+    {
+        ToolResult tool = ToolRunner.invoke(args);
+        assertEquals(1, tool.getExitCode());
+        assertThat(tool.getStderr(), containsString(expectedMessage));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/JMXCompatabilityTest.java b/test/unit/org/apache/cassandra/tools/JMXCompatabilityTest.java
index cb9f5a5..ede3d6c 100644
--- a/test/unit/org/apache/cassandra/tools/JMXCompatabilityTest.java
+++ b/test/unit/org/apache/cassandra/tools/JMXCompatabilityTest.java
@@ -160,6 +160,16 @@
         diff(excludeObjects, excludeAttributes, excludeOperations, "test/data/jmxdump/cassandra-4.0-jmx.yaml");
     }
 
+    @Test
+    public void diff41() throws Throwable
+    {
+        List<String> excludeObjects = Arrays.asList();
+        List<String> excludeAttributes = Arrays.asList();
+        List<String> excludeOperations = Arrays.asList();
+
+        diff(excludeObjects, excludeAttributes, excludeOperations, "test/data/jmxdump/cassandra-4.1-jmx.yaml");
+    }
+
     private void diff(List<String> excludeObjects, List<String> excludeAttributes, List<String> excludeOperations, String original) throws Throwable
     {
         setupStandardTables();
diff --git a/test/unit/org/apache/cassandra/tools/JMXStandardsTest.java b/test/unit/org/apache/cassandra/tools/JMXStandardsTest.java
new file mode 100644
index 0000000..87b9ff9
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/JMXStandardsTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.tools;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.SortedMap;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+import javax.management.openmbean.OpenDataException;
+import javax.management.openmbean.TabularData;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.apache.cassandra.utils.BreaksJMX;
+import org.assertj.core.api.Assertions;
+import org.reflections.Reflections;
+import org.reflections.scanners.Scanners;
+import org.reflections.util.ConfigurationBuilder;
+
+public class JMXStandardsTest
+{
+    private static final Logger logger = LoggerFactory.getLogger(JMXStandardsTest.class);
+
+    /**
+     * JMX typlically works well with java.* and javax.*, but not all types are serializable and will work, so this class
+     * goes with a explicit approval list, new APIs may fail if a java.* or javax.* is used not in this allow list, if
+     * that is the case it is fine to add here.
+     * <p>
+     * It is never fine to allow non java.* and javax.* types, they can not be handled by clients, so should never be
+     * allowed.
+     */
+    private static final Set<Class<?>> ALLOWED_TYPES = ImmutableSet.<Class<?>>builder()
+                                                       .add(Void.class).add(Void.TYPE)
+                                                       .add(Boolean.class).add(Boolean.TYPE)
+                                                       .add(Byte.class).add(Byte.TYPE)
+                                                       .add(Short.class).add(Short.TYPE)
+                                                       .add(Integer.class).add(Integer.TYPE)
+                                                       .add(Long.class).add(Long.TYPE)
+                                                       .add(Float.class).add(Float.TYPE)
+                                                       .add(Double.class).add(Double.TYPE)
+                                                       .add(String.class)
+                                                       .add(ByteBuffer.class)
+                                                       .add(InetAddress.class)
+                                                       .add(File.class)
+                                                       .add(List.class).add(Map.class).add(Set.class).add(SortedMap.class).add(Collection.class)
+                                                       .add(ObjectName.class).add(TabularData.class).add(CompositeData.class)
+                                                       // Exceptions
+                                                       // https://www.oracle.com/java/technologies/javase/management-extensions-best-practices.html
+                                                       // "It is recommended that exceptions thrown by MBeans be drawn from
+                                                       // the standard set defined in the java.* and javax.* packages on the
+                                                       // Java SE platform. If an MBean throws a non-standard exception, a
+                                                       // client that does not have that exception class will likely see
+                                                       // another exception such as ClassNotFoundException instead."
+                                                       .add(ExecutionException.class)
+                                                       .add(InterruptedException.class)
+                                                       .add(UnknownHostException.class)
+                                                       .add(IOException.class)
+                                                       .add(TimeoutException.class)
+                                                       .add(IllegalStateException.class)
+                                                       .add(ClassNotFoundException.class)
+                                                       .add(OpenDataException.class)
+                                                       .build();
+    /**
+     * This list is a set of types under java.* and javax.*, but are too vague that could cause issues; this does not
+     * mean issues will happen with JMX, only that issues may happen only after running and can not be detected at
+     * compile time.
+     */
+    private static final Set<Class<?>> DANGEROUS_TYPES = ImmutableSet.<Class<?>>builder()
+                                                         .add(Object.class)
+                                                         .add(Comparable.class)
+                                                         .add(Serializable.class)
+                                                         .add(Exception.class)
+                                                         .build();
+
+    @Test
+    public void interfaces() throws ClassNotFoundException
+    {
+        Reflections reflections = new Reflections(ConfigurationBuilder.build("org.apache.cassandra").setExpandSuperTypes(false));
+        Pattern mbeanPattern = Pattern.compile(".*MBean$");
+        Set<String> matches = reflections.getAll(Scanners.SubTypes).stream()
+                                         .filter(s -> mbeanPattern.matcher(s).find())
+                                         .collect(Collectors.toSet());
+
+        List<String> warnings = new ArrayList<>();
+        List<String> errors = new ArrayList<>();
+        for (String className : matches)
+        {
+            for (Class<?> klass = Class.forName(className); klass != null && !Object.class.equals(klass); klass = klass.getSuperclass())
+            {
+                Assertions.assertThat(klass).isInterface();
+                Method[] methods = klass.getDeclaredMethods();
+                for (int i = 0; i < methods.length; i++)
+                {
+                    Method method = methods[i];
+                    checkType(method, "return", method.getGenericReturnType(), warnings, errors);
+                    Stream.of(method.getGenericParameterTypes()).forEach(t -> checkType(method, "parameter", t, warnings, errors));
+                    Stream.of(method.getGenericExceptionTypes()).forEach(t -> checkType(method, "throws", t, warnings, errors));
+                }
+            }
+        }
+        if (!warnings.isEmpty())
+            warnings.forEach(logger::warn);
+        if (!errors.isEmpty())
+            throw new AssertionError("Errors detected while validating MBeans\n" + String.join("\n", errors));
+    }
+
+    private static void checkType(Method method, String sig, Type type, Collection<String> warnings, Collection<String> errors)
+    {
+        if (type instanceof Class<?>)
+        {
+            Class<?> klass = (Class<?>) type;
+            int numArrays = 0;
+            while (klass.isArray())
+            {
+                numArrays++;
+                klass = klass.getComponentType();
+            }
+            if (!ALLOWED_TYPES.contains(klass))
+            {
+                StringBuilder typeName = new StringBuilder(klass.getCanonicalName());
+                for (int i = 0; i < numArrays; i++)
+                    typeName.append("[]");
+                if (DANGEROUS_TYPES.contains(klass))
+                {
+                    warnings.add(String.format("Dangerous type used at signature %s, type %s; method '%s'", sig, typeName, method));
+                }
+                else
+                {
+                    String msg = String.format("Error at signature %s; type %s is not in the supported set of types, method method '%s'", sig, typeName, method);
+                    (method.isAnnotationPresent(BreaksJMX.class) ? warnings : errors).add(msg);
+                }
+            }
+        }
+        else if (type instanceof ParameterizedType)
+        {
+            ParameterizedType param = (ParameterizedType) type;
+            Type klass = param.getRawType();
+            Type[] args = param.getActualTypeArguments();
+            checkType(method, sig + ": " + param, klass, warnings, errors);
+            Stream.of(args).forEach(t -> checkType(method, sig + " of " + param, t, warnings, errors));
+        }
+        else
+        {
+            Assert.fail("Unknown type: " + type.getClass());
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/JMXToolTest.java b/test/unit/org/apache/cassandra/tools/JMXToolTest.java
index e6f4615..dbd18f3 100644
--- a/test/unit/org/apache/cassandra/tools/JMXToolTest.java
+++ b/test/unit/org/apache/cassandra/tools/JMXToolTest.java
@@ -187,4 +187,4 @@
     {
         return SourceDSL.maps().of(Generators.IDENTIFIER_GEN, infoGen).ofSizeBetween(0, 10);
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/tools/LoaderOptionsTest.java b/test/unit/org/apache/cassandra/tools/LoaderOptionsTest.java
index b1fe732..4fc2325 100644
--- a/test/unit/org/apache/cassandra/tools/LoaderOptionsTest.java
+++ b/test/unit/org/apache/cassandra/tools/LoaderOptionsTest.java
@@ -17,32 +17,38 @@
  */
 
 package org.apache.cassandra.tools;
-import java.io.File;
+
+import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
 import java.nio.file.Paths;
+import java.security.Permission;
 
 import com.google.common.net.HostAndPort;
 import org.junit.Test;
 
+import org.apache.cassandra.io.util.File;
+
 import static org.apache.cassandra.tools.OfflineToolUtils.sstableDirName;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 
 // LoaderOptionsTester for custom configuration
 public class LoaderOptionsTest
 {
     @Test
-    public void testNativePort() throws Exception {
+    public void testNativePort() throws Exception
+    {
         //Default Cassandra config
-        File config = Paths.get(".", "test", "conf", "cassandra.yaml").normalize().toFile();
-        String[] args = {"-d", "127.9.9.1", "-f", config.getAbsolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple")};
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
         LoaderOptions options = LoaderOptions.builder().parseArgs(args).build();
         assertEquals(9042, options.nativePort);
 
 
         // SSL Enabled Cassandra config
-        config = Paths.get(".", "test", "conf", "unit-test-conf/test-native-port.yaml").normalize().toFile();
-        String[] args2 = {"-d", "127.9.9.1", "-f", config.getAbsolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple")};
+        config = new File(Paths.get(".", "test", "conf", "unit-test-conf/test-native-port.yaml").normalize());
+        String[] args2 = { "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
         options = LoaderOptions.builder().parseArgs(args2).build();
         assertEquals(9142, options.nativePort);
 
@@ -52,8 +58,8 @@
 
         // test native port set from command line
 
-        config = Paths.get(".", "test", "conf", "unit-test-conf/test-native-port.yaml").normalize().toFile();
-        String[] args3 = {"-d", "127.9.9.1", "-p", "9300", "-f", config.getAbsolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple")};
+        config = new File(Paths.get(".", "test", "conf", "unit-test-conf/test-native-port.yaml").normalize().toFile());
+        String[] args3 = { "-d", "127.9.9.1", "-p", "9300", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
         options = LoaderOptions.builder().parseArgs(args3).build();
         assertEquals(9300, options.nativePort);
 
@@ -72,11 +78,142 @@
     public void testEncryptionSettings() throws Exception
     {
         String[] args = { "-d", "127.9.9.1", "-ts", "test.jks", "-tspw", "truststorePass1", "-ks", "test.jks", "-kspw",
-                "testdata1", "--ssl-ciphers", "TLS_RSA_WITH_AES_256_CBC_SHA",
-                "--ssl-alg", "SunX509", "--store-type", "JKS", "--ssl-protocol", "TLS",
-                sstableDirName("legacy_sstables", "legacy_ma_simple") };
+                          "testdata1", "--ssl-ciphers", "TLS_RSA_WITH_AES_256_CBC_SHA",
+                          "--ssl-alg", "SunX509", "--store-type", "JKS", "--ssl-protocol", "TLS",
+                          sstableDirName("legacy_sstables", "legacy_ma_simple") };
         LoaderOptions options = LoaderOptions.builder().parseArgs(args).build();
         assertEquals("test.jks", options.clientEncOptions.keystore);
     }
+
+    @Test
+    public void testThrottleDefaultSettings()
+    {
+        LoaderOptions options = LoaderOptions.builder().build();
+        assertEquals(0, options.throttleBytes, 0);
+        assertEquals(0, options.interDcThrottleBytes, 0);
+    }
+
+    @Test
+    public void testDeprecatedThrottleSettings() throws IOException
+    {
+        // Default Cassandra config
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "-t", "200", "-idct", "400", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+        LoaderOptions options = LoaderOptions.builder().parseArgs(args).build();
+        // converts from megabits to bytes
+        assertEquals(200 * 125_000, options.throttleBytes, 0);
+        assertEquals(400 * 125_000, options.interDcThrottleBytes, 0);
+    }
+
+    @Test
+    public void testDeprecatedThrottleSettingsWithLongSettingNames() throws IOException
+    {
+        // Default Cassandra config
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "--throttle", "200", "--inter-dc-throttle", "400", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+        LoaderOptions options = LoaderOptions.builder().parseArgs(args).build();
+        // converts from megabits to bytes
+        assertEquals(200 * 125_000, options.throttleBytes, 0);
+        assertEquals(400 * 125_000, options.interDcThrottleBytes, 0);
+    }
+
+    @Test
+    public void testThrottleSettingsWithLongSettingNames() throws IOException
+    {
+        // Default Cassandra config
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "--throttle-mib", "24", "--inter-dc-throttle-mib", "48", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+        LoaderOptions options = LoaderOptions.builder().parseArgs(args).build();
+        // converts from mebibytes to bytes
+        assertEquals(24 * 1024 * 1024, options.throttleBytes, 0);
+        assertEquals(48 * 1024 * 1024, options.interDcThrottleBytes, 0);
+    }
+
+    @Test
+    public void failsWhenThrottleSettingAndDeprecatedAreProvided() throws IOException
+    {
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "-t", "200", "-tmib", "200", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+
+        failureHelper(args, 1);
+    }
+
+    @Test
+    public void failsWhenThrottleSettingAndDeprecatedAreProvidedWithLongSettingNames() throws IOException
+    {
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "--throttle", "200", "--throttle-mib", "200", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+
+        failureHelper(args, 1);
+    }
+
+    @Test
+    public void failsWhenInterDCThrottleSettingAndDeprecatedAreProvided() throws IOException
+    {
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "-idct", "200", "-idctmib", "200", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+
+        failureHelper(args, 1);
+    }
+
+    @Test
+    public void failsWhenInterDCThrottleSettingAndDeprecatedAreProvidedWithLongSettingNames() throws IOException
+    {
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = { "--inter-dc-throttle", "200", "--inter-dc-throttle-mib", "200", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+
+        failureHelper(args, 1);
+    }
+
+    @Test
+    public void testEntireSSTableDefaultSettings()
+    {
+        LoaderOptions options = LoaderOptions.builder().build();
+        assertEquals(0, options.entireSSTableThrottleMebibytes);
+        assertEquals(0, options.entireSSTableInterDcThrottleMebibytes);
+    }
+
+    @Test
+    public void testEntireSSTableSettingsWithLongSettingNames() throws IOException
+    {
+        // Use long names for the args, i.e. entire-sstable-throttle
+        File config = new File(Paths.get(".", "test", "conf", "cassandra.yaml").normalize());
+        String[] args = new String[]{ "--entire-sstable-throttle-mib", "350", "--entire-sstable-inter-dc-throttle-mib", "600", "-d", "127.9.9.1", "-f", config.absolutePath(), sstableDirName("legacy_sstables", "legacy_ma_simple") };
+        LoaderOptions options = LoaderOptions.builder().parseArgs(args).build();
+        assertEquals(350, options.entireSSTableThrottleMebibytes);
+        assertEquals(600, options.entireSSTableInterDcThrottleMebibytes);
+    }
+
+    private void failureHelper(String[] args, int expectedErrorCode)
+    {
+        // install security manager to get informed about the exit-code
+        System.setSecurityManager(new SecurityManager()
+        {
+            public void checkExit(int status)
+            {
+                throw new SystemExitException(status);
+            }
+
+            public void checkPermission(Permission perm)
+            {
+            }
+
+            public void checkPermission(Permission perm, Object context)
+            {
+            }
+        });
+        try
+        {
+            LoaderOptions.builder().parseArgs(args).build();
+        }
+        catch (SystemExitException e)
+        {
+            assertEquals(expectedErrorCode, e.status);
+        }
+        finally
+        {
+            System.setSecurityManager(null);
+        }
+    }
 }
 
diff --git a/test/unit/org/apache/cassandra/tools/NodeToolGossipInfoTest.java b/test/unit/org/apache/cassandra/tools/NodeToolGossipInfoTest.java
deleted file mode 100644
index 8e9735b..0000000
--- a/test/unit/org/apache/cassandra/tools/NodeToolGossipInfoTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.tools;
-
-import java.io.IOException;
-
-import org.apache.commons.lang3.StringUtils;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.net.NoPayload;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
-
-import static org.apache.cassandra.net.Verb.ECHO_REQ;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-
-public class NodeToolGossipInfoTest extends CQLTester
-{
-    private static NodeProbe probe;
-
-    @BeforeClass
-    public static void setup() throws Exception
-    {
-        requireNetwork();
-        startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
-    }
-
-    @Test
-    public void testMaybeChangeDocs()
-    {
-        // If you added, modified options or help, please update docs if necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "gossipinfo");
-        String help =   "NAME\n" + 
-                        "        nodetool gossipinfo - Shows the gossip information for the cluster\n" + 
-                        "\n" + 
-                        "SYNOPSIS\n" + 
-                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" + 
-                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" + 
-                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" + 
-                        "                [(-u <username> | --username <username>)] gossipinfo\n" + 
-                        "\n" + 
-                        "OPTIONS\n" + 
-                        "        -h <host>, --host <host>\n" + 
-                        "            Node hostname or ip address\n" + 
-                        "\n" + 
-                        "        -p <port>, --port <port>\n" + 
-                        "            Remote jmx agent port number\n" + 
-                        "\n" + 
-                        "        -pp, --print-port\n" + 
-                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" + 
-                        "\n" + 
-                        "        -pw <password>, --password <password>\n" + 
-                        "            Remote jmx agent password\n" + 
-                        "\n" + 
-                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + 
-                        "            Path to the JMX password file\n" + 
-                        "\n" + 
-                        "        -u <username>, --username <username>\n" + 
-                        "            Remote jmx agent username\n" + 
-                        "\n" + 
-                        "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
-    }
-
-    @Test
-    public void testGossipInfo() throws Throwable
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("gossipinfo");
-        Assertions.assertThat(tool.getStdout()).contains("/127.0.0.1");
-        Assertions.assertThat(tool.getStdout()).containsPattern("heartbeat:[0-9]+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("STATUS:[0-9]+:NORMAL,.+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("SCHEMA:.+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("DC:[0-9]+:datacenter1");
-        Assertions.assertThat(tool.getStdout()).containsPattern("RACK:[0-9]+:rack1");
-        Assertions.assertThat(tool.getStdout()).containsPattern("RELEASE_VERSION:.+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("RPC_ADDRESS:[0-9]+:127.0.0.1");
-        Assertions.assertThat(tool.getStdout()).containsPattern("NET_VERSION:[0-9]+:.+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("HOST_ID:[0-9]+:.+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("NATIVE_ADDRESS_AND_PORT:[0-9]+:127.0.0.1:[0-9]+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("STATUS_WITH_PORT:[0-9]+:NORMAL,.+");
-        Assertions.assertThat(tool.getStdout()).containsPattern("TOKENS:[0-9]+:<hidden>");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-
-        // Make sure heartbeats are detected
-        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, NoPayload.noPayload);
-        MessagingService.instance().send(echoMessageOut, FBUtilities.getBroadcastAddressAndPort());
-
-        String origHeartbeatCount = StringUtils.substringBetween(tool.getStdout(), "heartbeat:", "\n");
-        tool = ToolRunner.invokeNodetool("gossipinfo");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-        String newHeartbeatCount = StringUtils.substringBetween(tool.getStdout(), "heartbeat:", "\n");
-        assertTrue(Integer.parseInt(origHeartbeatCount) <= Integer.parseInt(newHeartbeatCount));
-    }
-}
diff --git a/test/unit/org/apache/cassandra/tools/NodeToolTPStatsTest.java b/test/unit/org/apache/cassandra/tools/NodeToolTPStatsTest.java
deleted file mode 100644
index b4acc1b..0000000
--- a/test/unit/org/apache/cassandra/tools/NodeToolTPStatsTest.java
+++ /dev/null
@@ -1,215 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.tools;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.tuple.Pair;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.net.Message;
-import org.apache.cassandra.net.MessagingService;
-import org.apache.cassandra.net.NoPayload;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
-import org.yaml.snakeyaml.Yaml;
-
-import static org.apache.cassandra.net.Verb.ECHO_REQ;
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
-
-public class NodeToolTPStatsTest extends CQLTester
-{
-    private static NodeProbe probe;
-
-    @BeforeClass
-    public static void setup() throws Exception
-    {
-        requireNetwork();
-        startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
-    }
-
-    @Test
-    @SuppressWarnings("SingleCharacterStringConcatenation")
-    public void testMaybeChangeDocs()
-    {
-        // If you added, modified options or help, please update docs if necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "tpstats");
-        String help =   "NAME\n" + 
-                        "        nodetool tpstats - Print usage statistics of thread pools\n" + 
-                        "\n" + 
-                        "SYNOPSIS\n" + 
-                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" + 
-                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" + 
-                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" + 
-                        "                [(-u <username> | --username <username>)] tpstats\n" + 
-                        "                [(-F <format> | --format <format>)]\n" + 
-                        "\n" + 
-                        "OPTIONS\n" + 
-                        "        -F <format>, --format <format>\n" + 
-                        "            Output format (json, yaml)\n" + 
-                        "\n" + 
-                        "        -h <host>, --host <host>\n" + 
-                        "            Node hostname or ip address\n" + 
-                        "\n" + 
-                        "        -p <port>, --port <port>\n" + 
-                        "            Remote jmx agent port number\n" + 
-                        "\n" + 
-                        "        -pp, --print-port\n" + 
-                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" + 
-                        "\n" + 
-                        "        -pw <password>, --password <password>\n" + 
-                        "            Remote jmx agent password\n" + 
-                        "\n" + 
-                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + 
-                        "            Path to the JMX password file\n" + 
-                        "\n" + 
-                        "        -u <username>, --username <username>\n" + 
-                        "            Remote jmx agent username\n" +  
-                        "\n" + 
-                        "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
-    }
-
-    @Test
-    public void testTPStats() throws Throwable
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("tpstats");
-        Assertions.assertThat(tool.getStdout()).containsPattern("Pool Name \\s* Active Pending Completed Blocked All time blocked");
-        Assertions.assertThat(tool.getStdout()).containsIgnoringCase("Latencies waiting in queue (micros) per dropped message types");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-
-        // Does inserting data alter tpstats?
-        String nonZeroedThreadsRegExp = "((?m)\\D.*[1-9].*)";
-        ArrayList<String> origStats = getAllGroupMatches(nonZeroedThreadsRegExp, tool.getStdout());
-        Collections.sort(origStats);
-
-        createTable("CREATE TABLE %s (pk int, c int, PRIMARY KEY(pk))");
-        execute("INSERT INTO %s (pk, c) VALUES (?, ?)", 1, 1);
-        flush();
-
-        tool = ToolRunner.invokeNodetool("tpstats");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-        ArrayList<String> newStats = getAllGroupMatches(nonZeroedThreadsRegExp, tool.getStdout());
-        Collections.sort(newStats);
-
-        assertNotEquals(origStats, newStats);
-
-        // Does sending a message alter Gossip & ECHO stats?
-        String origGossip = getAllGroupMatches("((?m)GossipStage.*)", tool.getStdout()).get(0);
-        Assertions.assertThat(tool.getStdout()).doesNotContainPattern("ECHO_REQ\\D.*[1-9].*");
-        Assertions.assertThat(tool.getStdout()).doesNotContainPattern("ECHO_RSP\\D.*[1-9].*");
-
-        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, NoPayload.noPayload);
-        MessagingService.instance().send(echoMessageOut, FBUtilities.getBroadcastAddressAndPort());
-
-        tool = ToolRunner.invokeNodetool("tpstats");
-        assertTrue(tool.getCleanedStderr().isEmpty());
-        assertEquals(0, tool.getExitCode());
-        String newGossip = getAllGroupMatches("((?m)GossipStage.*)", tool.getStdout()).get(0);
-
-        assertNotEquals(origGossip, newGossip);
-        Assertions.assertThat(tool.getStdout()).containsPattern("ECHO_REQ\\D.*[1-9].*");
-        Assertions.assertThat(tool.getStdout()).containsPattern("ECHO_RSP\\D.*[1-9].*");
-    }
-
-    @Test
-    public void testFormatArg()
-    {
-        Arrays.asList(Pair.of("-F", "json"), Pair.of("--format", "json")).forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tpstats", arg.getLeft(), arg.getRight());
-            String json = tool.getStdout();
-            assertThat(isJSONString(json)).isTrue();
-            assertThat(json).containsPattern("\"WaitLatencies\"\\s*:\\s*\\{\\s*\"");
-            assertTrue(tool.getCleanedStderr().isEmpty());
-            assertEquals(0, tool.getExitCode());
-        });
-
-        Arrays.asList( Pair.of("-F", "yaml"), Pair.of("--format", "yaml")).forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tpstats", arg.getLeft(), arg.getRight());
-            String yaml = tool.getStdout();
-            assertThat(isYAMLString(yaml)).isTrue();
-            assertThat(yaml).containsPattern("WaitLatencies:\\s*[A-Z|_]+:\\s+-\\s");
-            assertTrue(tool.getCleanedStderr().isEmpty());
-            assertEquals(0, tool.getExitCode());
-        });
-    }
-
-    public static boolean isJSONString(String str)
-    {
-        try
-        {
-            ObjectMapper mapper = new ObjectMapper();
-            mapper.readTree(str);
-            return true;
-        }
-        catch(IOException e)
-        {
-            return false;
-        }
-    }
-
-    public static boolean isYAMLString(String str)
-    {
-        try
-        {
-            Yaml yaml = new Yaml();
-            yaml.load(str);
-            return true;
-        }
-        catch(Exception e)
-        {
-            return false;
-        }
-    }
-
-    private ArrayList<String> getAllGroupMatches(String regExp, String in)
-    {
-        Pattern pattern = Pattern.compile(regExp);
-        Matcher m = pattern.matcher(in);
-
-        ArrayList<String> matches = new ArrayList<>();
-        while (m.find())
-            matches.add(m.group(1));
-
-        return matches;
-    }
-}
diff --git a/test/unit/org/apache/cassandra/tools/NodetoolNetStatsTest.java b/test/unit/org/apache/cassandra/tools/NodetoolNetStatsTest.java
deleted file mode 100644
index bcf8704..0000000
--- a/test/unit/org/apache/cassandra/tools/NodetoolNetStatsTest.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.tools;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintStream;
-import java.nio.charset.StandardCharsets;
-import java.util.Collections;
-import java.util.List;
-
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import org.apache.cassandra.cql3.CQLTester;
-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.schema.TableId;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.streaming.SessionInfo;
-import org.apache.cassandra.streaming.StreamSession.State;
-import org.apache.cassandra.streaming.StreamSummary;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.apache.cassandra.tools.nodetool.NetStats;
-import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
-import org.hamcrest.CoreMatchers;
-
-import static org.apache.cassandra.net.Verb.ECHO_REQ;
-import static org.junit.Assert.assertThat;
-
-public class NodetoolNetStatsTest extends CQLTester
-{
-    private static NodeProbe probe;
-
-    @BeforeClass
-    public static void setup() throws Exception
-    {
-        StorageService.instance.initServer();
-        startJMXServer();
-        probe = new NodeProbe(jmxHost, jmxPort);
-    }
-
-    @AfterClass
-    public static void teardown() throws IOException
-    {
-        probe.close();
-    }
-
-    @Test
-    public void testMaybeChangeDocs()
-    {
-        // If you added, modified options or help, please update docs if necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "netstats");
-        String help =   "NAME\n" + 
-                        "        nodetool netstats - Print network information on provided host\n" + 
-                        "        (connecting node by default)\n" + 
-                        "\n" + 
-                        "SYNOPSIS\n" + 
-                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" + 
-                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" + 
-                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" + 
-                        "                [(-u <username> | --username <username>)] netstats\n" + 
-                        "                [(-H | --human-readable)]\n" + 
-                        "\n" + 
-                        "OPTIONS\n" + 
-                        "        -h <host>, --host <host>\n" + 
-                        "            Node hostname or ip address\n" + 
-                        "\n" + 
-                        "        -H, --human-readable\n" + 
-                        "            Display bytes in human readable form, i.e. KiB, MiB, GiB, TiB\n" + 
-                        "\n" + 
-                        "        -p <port>, --port <port>\n" + 
-                        "            Remote jmx agent port number\n" + 
-                        "\n" + 
-                        "        -pp, --print-port\n" + 
-                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" + 
-                        "\n" + 
-                        "        -pw <password>, --password <password>\n" + 
-                        "            Remote jmx agent password\n" + 
-                        "\n" + 
-                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + 
-                        "            Path to the JMX password file\n" + 
-                        "\n" + 
-                        "        -u <username>, --username <username>\n" + 
-                        "            Remote jmx agent username\n" + 
-                        "\n" + 
-                        "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
-        tool.assertOnCleanExit();
-    }
-
-    @Test
-    public void testNetStats()
-    {
-        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, NoPayload.noPayload);
-        MessagingService.instance().send(echoMessageOut, FBUtilities.getBroadcastAddressAndPort());
-        
-        ToolResult tool = ToolRunner.invokeNodetool("netstats");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Gossip messages                 n/a         0              2         0"));
-        tool.assertOnCleanExit();
-    }
-
-    @Test
-    public void testHumanReadable() throws IOException
-    {
-        List<StreamSummary> streamSummaries = Collections.singletonList(new StreamSummary(TableId.generate(), 1, 1024));
-        SessionInfo info = new SessionInfo(InetAddressAndPort.getLocalHost(),
-                                           1,
-                                           InetAddressAndPort.getLocalHost(),
-                                           streamSummaries,
-                                           streamSummaries,
-                                           State.COMPLETE);
-
-        try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream out = new PrintStream(baos))
-        {
-            NetStats nstats = new NetStats();
-
-            nstats.printReceivingSummaries(out, info, false);
-            String stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).doesNotContain("Kib");
-
-            baos.reset();
-            nstats.printSendingSummaries(out, info, false);
-            stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).doesNotContain("KiB");
-
-            baos.reset();
-            nstats.printReceivingSummaries(out, info, true);
-            stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).contains("KiB");
-
-            baos.reset();
-            nstats.printSendingSummaries(out, info, true);
-            stdout = getSummariesStdout(baos, out);
-            Assertions.assertThat(stdout).contains("KiB");            
-        }
-    }
-
-    private String getSummariesStdout(ByteArrayOutputStream baos, PrintStream ps) throws IOException
-    {
-        baos.flush();
-        ps.flush();
-        return baos.toString(StandardCharsets.UTF_8.toString());
-    }
-}
diff --git a/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java b/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java
index 7bd1143..3bb2825 100644
--- a/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java
+++ b/test/unit/org/apache/cassandra/tools/OfflineToolUtils.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.io.IOException;
 import java.lang.management.ManagementFactory;
 import java.lang.management.ThreadInfo;
@@ -32,6 +31,7 @@
 import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
+import org.apache.cassandra.io.util.File;
 import org.apache.commons.io.FileUtils;
 import org.junit.BeforeClass;
 import org.slf4j.LoggerFactory;
@@ -53,17 +53,12 @@
 
     private static List<ThreadInfo> initialThreads;
 
-    static final String[] EXPECTED_THREADS_WITH_SCHEMA = {
-    "PerDiskMemtableFlushWriter_0:[1-9]",
-    "MemtablePostFlush:[1-9]",
-    "MemtableFlushWriter:[1-9]",
-    "MemtableReclaimMemory:[1-9]",
-    };
     static final String[] OPTIONAL_THREADS_WITH_SCHEMA = {
     "ScheduledTasks:[1-9]",
+    "ScheduledFastTasks:[1-9]",
     "OptionalTasks:[1-9]",
-    "Reference-Reaper:[1-9]",
-    "LocalPool-Cleaner:[1-9]",
+    "Reference-Reaper",
+    "LocalPool-Cleaner(-networking|-chunk-cache)",
     "CacheCleanupExecutor:[1-9]",
     "CompactionExecutor:[1-9]",
     "ValidationExecutor:[1-9]",
@@ -73,9 +68,13 @@
     "Strong-Reference-Leak-Detector:[1-9]",
     "Background_Reporter:[1-9]",
     "EXPIRING-MAP-REAPER:[1-9]",
+    "ObjectCleanerThread",
+    "process reaper",  // spawned by the jvm when executing external processes
+                       // and may still be active when we check
+    "Attach Listener", // spawned in intellij IDEA
     };
 
-    public void assertNoUnexpectedThreadsStarted(String[] expectedThreadNames, String[] optionalThreadNames)
+    public void assertNoUnexpectedThreadsStarted(String[] optionalThreadNames)
     {
         ThreadMXBean threads = ManagementFactory.getThreadMXBean();
 
@@ -89,31 +88,20 @@
                                     .map(ThreadInfo::getThreadName)
                                     .collect(Collectors.toSet());
 
-        List<Pattern> expected = expectedThreadNames != null
-                                 ? Arrays.stream(expectedThreadNames).map(Pattern::compile).collect(Collectors.toList())
-                                 : Collections.emptyList();
-
         List<Pattern> optional = optionalThreadNames != null
                                  ? Arrays.stream(optionalThreadNames).map(Pattern::compile).collect(Collectors.toList())
                                  : Collections.emptyList();
 
         current.removeAll(initial);
 
-        List<Pattern> notPresent = expected.stream()
-                                           .filter(threadNamePattern -> !current.stream().anyMatch(threadName -> threadNamePattern.matcher(threadName).matches()))
-                                           .collect(Collectors.toList());
-
         Set<String> remain = current.stream()
-                                    .filter(threadName -> expected.stream().anyMatch(pattern -> pattern.matcher(threadName).matches()))
-                                    .filter(threadName -> optional.stream().anyMatch(pattern -> pattern.matcher(threadName).matches()))
+                                    .filter(threadName -> optional.stream().noneMatch(pattern -> pattern.matcher(threadName).matches()))
                                     .collect(Collectors.toSet());
 
         if (!remain.isEmpty())
             System.err.println("Unexpected thread names: " + remain);
-        if (!notPresent.isEmpty())
-            System.err.println("Mandatory thread missing: " + notPresent);
 
-        assertTrue("Wrong thread status", remain.isEmpty() && notPresent.isEmpty());
+        assertTrue("Wrong thread status, active threads unaccounted for: " + remain, remain.isEmpty());
     }
 
     public void assertSchemaNotLoaded()
@@ -204,20 +192,20 @@
     public static String findOneSSTable(String ks, String cf) throws IOException
     {
         File cfDir = sstableDir(ks, cf);
-        File[] sstableFiles = cfDir.listFiles((file) -> file.isFile() && file.getName().endsWith("-Data.db"));
-        return sstableFiles[0].getAbsolutePath();
+        File[] sstableFiles = cfDir.tryList((file) -> file.isFile() && file.name().endsWith("-Data.db"));
+        return sstableFiles[0].absolutePath();
     }
 
     public static String sstableDirName(String ks, String cf) throws IOException
     {
-        return sstableDir(ks, cf).getAbsolutePath();
+        return sstableDir(ks, cf).absolutePath();
     }
 
     public static File sstableDir(String ks, String cf) throws IOException
     {
         File dataDir = copySSTables();
         File ksDir = new File(dataDir, ks);
-        File[] cfDirs = ksDir.listFiles((dir, name) -> cf.equals(name) || name.startsWith(cf + '-'));
+        File[] cfDirs = ksDir.tryList((dir, name) -> cf.equals(name) || name.startsWith(cf + '-'));
         return cfDirs[0];
     }
 
@@ -225,13 +213,13 @@
     {
         File dataDir = new File("build/test/cassandra/data");
         File srcDir = new File("test/data/legacy-sstables/ma");
-        FileUtils.copyDirectory(new File(srcDir, "legacy_tables"), new File(dataDir, "legacy_sstables"));
+        FileUtils.copyDirectory(new File(srcDir, "legacy_tables").toJavaIOFile(), new File(dataDir, "legacy_sstables").toJavaIOFile());
         return dataDir;
     }
     
     protected void assertCorrectEnvPostTest()
     {
-        assertNoUnexpectedThreadsStarted(EXPECTED_THREADS_WITH_SCHEMA, OPTIONAL_THREADS_WITH_SCHEMA);
+        assertNoUnexpectedThreadsStarted(OPTIONAL_THREADS_WITH_SCHEMA);
         assertSchemaLoaded();
         assertServerNotLoaded();
     }
diff --git a/test/unit/org/apache/cassandra/tools/SSTableExpiredBlockersTest.java b/test/unit/org/apache/cassandra/tools/SSTableExpiredBlockersTest.java
index 4fc2cbe..e76769e 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableExpiredBlockersTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableExpiredBlockersTest.java
@@ -37,7 +37,7 @@
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
         assertEquals(1, tool.getExitCode());
 
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/SSTableExportSchemaLoadingTest.java b/test/unit/org/apache/cassandra/tools/SSTableExportSchemaLoadingTest.java
index f8d0f99..1530a2e 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableExportSchemaLoadingTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableExportSchemaLoadingTest.java
@@ -182,7 +182,7 @@
      */
     private void assertPostTestEnv()
     {
-        assertNoUnexpectedThreadsStarted(null, OPTIONAL_THREADS_WITH_SCHEMA);
+        assertNoUnexpectedThreadsStarted(OPTIONAL_THREADS_WITH_SCHEMA);
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
         assertKeyspaceNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
index 6b5395c..a5b70a2 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableExportTest.java
@@ -108,7 +108,7 @@
      */
     private void assertPostTestEnv()
     {
-        assertNoUnexpectedThreadsStarted(null, OPTIONAL_THREADS_WITH_SCHEMA);
+        assertNoUnexpectedThreadsStarted(OPTIONAL_THREADS_WITH_SCHEMA);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java b/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java
index a6606bf..e6d7adc 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableLevelResetterTest.java
@@ -36,7 +36,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java b/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java
index 2f6e64b..4998b6e 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableMetadataViewerTest.java
@@ -55,7 +55,7 @@
             assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Options:"));
             assertEquals(1, tool.getExitCode());
         }
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -218,7 +218,7 @@
 
     private void assertGoodEnvPostTest()
     {
-        assertNoUnexpectedThreadsStarted(null, OPTIONAL_THREADS_WITH_SCHEMA);
+        assertNoUnexpectedThreadsStarted(OPTIONAL_THREADS_WITH_SCHEMA);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/SSTableOfflineRelevelTest.java b/test/unit/org/apache/cassandra/tools/SSTableOfflineRelevelTest.java
index ee07f99..3f4314c 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableOfflineRelevelTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableOfflineRelevelTest.java
@@ -36,7 +36,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/SSTableRepairedAtSetterTest.java b/test/unit/org/apache/cassandra/tools/SSTableRepairedAtSetterTest.java
index 859b6b8..3531075 100644
--- a/test/unit/org/apache/cassandra/tools/SSTableRepairedAtSetterTest.java
+++ b/test/unit/org/apache/cassandra/tools/SSTableRepairedAtSetterTest.java
@@ -18,10 +18,10 @@
 
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import org.apache.cassandra.io.util.FileUtils;
@@ -41,7 +41,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -79,7 +79,7 @@
                                                        "--is-repaired",
                                                        findOneSSTable("legacy_sstables", "legacy_ma_simple"));
         tool.assertOnCleanExit();
-        assertNoUnexpectedThreadsStarted(null, OPTIONAL_THREADS_WITH_SCHEMA);
+        assertNoUnexpectedThreadsStarted(OPTIONAL_THREADS_WITH_SCHEMA);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -95,7 +95,7 @@
                                                  "--is-unrepaired",
                                                  findOneSSTable("legacy_sstables", "legacy_ma_simple"));
         tool.assertOnCleanExit();
-        assertNoUnexpectedThreadsStarted(null, OPTIONAL_THREADS_WITH_SCHEMA);
+        assertNoUnexpectedThreadsStarted(OPTIONAL_THREADS_WITH_SCHEMA);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -110,10 +110,10 @@
         tmpFile.deleteOnExit();
         Files.write(tmpFile.toPath(), findOneSSTable("legacy_sstables", "legacy_ma_simple").getBytes());
         
-        String file = tmpFile.getAbsolutePath();
+        String file = tmpFile.absolutePath();
         ToolResult tool = ToolRunner.invokeClass(SSTableRepairedAtSetter.class, "--really-set", "--is-repaired", "-f", file);
         tool.assertOnCleanExit();
-        assertNoUnexpectedThreadsStarted(null, OPTIONAL_THREADS_WITH_SCHEMA);
+        assertNoUnexpectedThreadsStarted(OPTIONAL_THREADS_WITH_SCHEMA);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java b/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java
index 62e0166..944b8de 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneSplitterWithCQLTesterTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -26,6 +25,8 @@
 import java.util.stream.Collectors;
 
 import org.junit.Before;
+
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import org.apache.cassandra.cql3.CQLTester;
@@ -64,10 +65,10 @@
     public void testSplittingSSTable() throws Throwable
     {
         ToolResult tool  = ToolRunner.invokeClass(StandaloneSplitter.class, "-s", "1", sstableFileName);
-        List<File> splitFiles = Arrays.asList(sstablesDir.listFiles());
+        List<File> splitFiles = Arrays.asList(sstablesDir.tryList());
         splitFiles.stream().forEach(f -> {
-            if (f.getName().endsWith("Data.db") && !origSstables.contains(f))
-                assertTrue(f.getName() + " is way bigger than 1MB: [" + f.length() + "] bytes",
+            if (f.name().endsWith("Data.db") && !origSstables.contains(f))
+                assertTrue(f.name() + " is way bigger than 1MiB: [" + f.length() + "] bytes",
                            f.length() <= 1024 * 1024 * 1.2); //give a 20% margin on size check
         });
         assertTrue(origSstables.size() < splitFiles.size());
@@ -81,16 +82,16 @@
     {
         ArrayList<String> args = new ArrayList<>(Arrays.asList("-s", "1"));
 
-        args.addAll(Arrays.asList(sstablesDir.listFiles())
+        args.addAll(Arrays.asList(sstablesDir.tryList())
                           .stream()
-                          .map(f -> f.getAbsolutePath())
+                          .map(f -> f.absolutePath())
                           .collect(Collectors.toList()));
 
         ToolResult tool  = ToolRunner.invokeClass(StandaloneSplitter.class, args.toArray(new String[args.size()]));
-        List<File> splitFiles = Arrays.asList(sstablesDir.listFiles());
+        List<File> splitFiles = Arrays.asList(sstablesDir.tryList());
         splitFiles.stream().forEach(f -> {
-            if (f.getName().endsWith("Data.db") && !origSstables.contains(f))
-                assertTrue(f.getName() + " is way bigger than 1MB: [" + f.length() + "] bytes",
+            if (f.name().endsWith("Data.db") && !origSstables.contains(f))
+                assertTrue(f.name() + " is way bigger than 1MiB: [" + f.length() + "] bytes",
                            f.length() <= 1024 * 1024 * 1.2); //give a 20% margin on size check
         });
         assertTrue(origSstables.size() < splitFiles.size());
@@ -102,7 +103,7 @@
     public void testNoSnapshotOption() throws Throwable
     {
         ToolResult tool  = ToolRunner.invokeClass(StandaloneSplitter.class, "-s", "1", "--no-snapshot", sstableFileName);
-        assertTrue(origSstables.size() < Arrays.asList(sstablesDir.listFiles()).size());
+        assertTrue(origSstables.size() < Arrays.asList(sstablesDir.tryList()).size());
         assertTrue(tool.getStdout(), tool.getStdout().isEmpty());
         assertTrue(tool.getCleanedStderr(), tool.getCleanedStderr().isEmpty());
         assertEquals(0, tool.getExitCode());
@@ -116,13 +117,13 @@
             executeFormattedQuery(formatQuery("INSERT INTO %s (id, val) VALUES (?, ?)"), "mockData" + i, "mockData" + i);
 
         ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
-        cfs.forceBlockingFlush();
+        org.apache.cassandra.Util.flush(cfs);
 
         Set<SSTableReader> sstables = cfs.getLiveSSTables();
         sstableFileName = sstables.iterator().next().getFilename();
-        assertTrue("Generated sstable must be at least 1MB", (new File(sstableFileName)).length() > 1024*1024);
-        sstablesDir = new File(sstableFileName).getParentFile();
-        origSstables = Arrays.asList(sstablesDir.listFiles());
+        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
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java b/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java
index ca1c649..e9d2070 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneUpgraderOnSStablesTest.java
@@ -18,13 +18,13 @@
 
 package org.apache.cassandra.tools;
 
-import java.io.File;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -141,7 +141,7 @@
     private List<String> getSStableFiles(String ks, String table) throws StartupException
     {
         ColumnFamilyStore cfs = Keyspace.open(ks).getColumnFamilyStore(table);
-        cfs.forceBlockingFlush();
+        org.apache.cassandra.Util.flush(cfs);
         ColumnFamilyStore.scrubDataDirectories(cfs.metadata());
 
         Set<SSTableReader> sstables = cfs.getLiveSSTables();
@@ -149,8 +149,8 @@
             return Lists.emptyList();
 
         String sstableFileName = sstables.iterator().next().getFilename();
-        File sstablesDir = new File(sstableFileName).getParentFile();
-        return Arrays.asList(sstablesDir.listFiles())
+        File sstablesDir = new File(sstableFileName).parent();
+        return Arrays.asList(sstablesDir.tryList())
                      .stream()
                      .filter(f -> f.isFile())
                      .map(file -> file.toString())
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java b/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java
index 7df28d2..65dd125 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneVerifierOnSSTablesTest.java
@@ -83,9 +83,8 @@
 
         createAndPopulateTable(keyspaceName, workingTable, x -> {});
 
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, workingTable, "-c");
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, workingTable, "--force", "-c");
         assertEquals(0, tool.getExitCode());
-        assertCorrectEnvPostTest();
         tool.assertOnCleanExit();
     }
 
@@ -98,13 +97,13 @@
         createAndPopulateTable(keyspace, tableName, cfs -> {
             // let's just copy old version files from test data into the source dir
             File testDataDir = new File("test/data/legacy-sstables/ma/legacy_tables/legacy_ma_simple");
-            for (File cfsDir : cfs.getDirectories().getCFDirectories())
+            for (org.apache.cassandra.io.util.File cfsDir : cfs.getDirectories().getCFDirectories())
             {
-                FileUtils.copyDirectory(testDataDir, cfsDir);
+                FileUtils.copyDirectory(testDataDir, cfsDir.toJavaIOFile());
             }
         });
 
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspace, tableName, "-c");
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspace, tableName, "-f", "-c");
 
         assertEquals(1, tool.getExitCode());
         Assertions.assertThat(tool.getStdout()).contains("is not the latest version, run upgradesstables");
@@ -118,9 +117,8 @@
 
         createAndPopulateTable(keyspaceName, workingTable, x -> {});
 
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, workingTable);
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, workingTable, "--force");
         assertEquals(0, tool.getExitCode());
-        assertCorrectEnvPostTest();
         tool.assertOnCleanExit();
     }
 
@@ -138,7 +136,7 @@
             }
         });
 
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, corruptStatsTable);
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, corruptStatsTable, "-f");
 
         assertEquals(1, tool.getExitCode());
         Assertions.assertThat(tool.getStderr()).contains("Error Loading", corruptStatsTable);
@@ -163,7 +161,7 @@
             }
         });
 
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, corruptDataTable);
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, keyspaceName, corruptDataTable, "--force");
         assertEquals(1, tool.getExitCode());
         Assertions.assertThat(tool.getStdout()).contains("Invalid SSTable", corruptDataTable);
     }
@@ -217,6 +215,6 @@
                          .apply();
         }
 
-        cfs.forceBlockingFlush();
+        org.apache.cassandra.Util.flush(cfs);
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java b/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java
index 9e6bb14..9d8f797 100644
--- a/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java
+++ b/test/unit/org/apache/cassandra/tools/StandaloneVerifierTest.java
@@ -30,7 +30,7 @@
 import static org.junit.Assert.assertThat;
 
 /**
-* Note: the complete coverage is composed of:
+ * Note: the complete coverage is composed of:
  * - {@link StandaloneVerifierOnSSTablesTest}
  * - {@link StandaloneVerifierTest}
  * - {@link org.apache.cassandra.db.VerifyTest}
@@ -42,15 +42,23 @@
     {
         // If you added, modified options or help, please update docs if necessary
         ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "-h");
-        String help = "usage: sstableverify [options] <keyspace> <column_family>\n" + 
+        String help = "usage: sstableverify [options] <keyspace> <column_family> force\n" +
                        "--\n" + 
                        "Verify the sstable for the provided table.\n" + 
-                       "--\n" + 
-                       "Options are:\n" + 
+                       "--\n" +
+                       "NOTE: There are significant risks associated with using this tool; it\n" +
+                       "likely doesn't do what you expect and there are known edge cases. You must\n" +
+                       "provide a -f or --force argument in order to allow usage of the tool ->\n" +
+                       "see CASSANDRA-9947 and CASSANDRA-17017 for known risks.\n" +
+                       "https://issues.apache.org/jira/browse/CASSANDRA-9947\n" +
+                       "https://issues.apache.org/jira/browse/CASSANDRA-17017\n" +
+                       "--\n" +
+                       "Options are:\n" +
                        " -c,--check_version          make sure sstables are the latest version\n" + 
                        "    --debug                  display stack traces\n" + 
-                       " -e,--extended               extended verification\n" + 
-                       " -h,--help                   display this help message\n" + 
+                       " -e,--extended               extended verification\n" +
+                       " -f,--force                  force verify - see CASSANDRA-17017\n" +
+                       " -h,--help                   display this help message\n" +
                        " -q,--quick                  do a quick check, don't read all data\n" + 
                        " -r,--mutate_repair_status   don't mutate repair status\n" + 
                        " -t,--token_range <range>    long token range of the format left,right.\n" + 
@@ -62,7 +70,7 @@
     @Test
     public void testWrongArgFailsAndPrintsHelp()
     {
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "--debugwrong", "system_schema", "tables");
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "--debugwrong", "system_schema", "tables", "-f");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Unrecognized option"));
         assertEquals(1, tool.getExitCode());
@@ -71,24 +79,24 @@
     @Test
     public void testDefaultCall()
     {
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "system_schema", "tables");
-        assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("using the following options"));
-        Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
-        assertEquals(0, tool.getExitCode());
-        assertCorrectEnvPostTest();
-        tool.assertOnCleanExit();
-
+        Arrays.asList("-f", "--force").forEach(arg -> {
+            ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "system_schema", "tables", arg);
+            assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("using the following options"));
+            Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
+            assertEquals(0, tool.getExitCode());
+            assertCorrectEnvPostTest();
+            tool.assertOnCleanExit();
+        });
     }
 
     @Test
     public void testDebugArg()
     {
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "--debug", "system_schema", "tables");
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "--debug", "system_schema", "tables", "-f");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("debug=true"));
         Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
         assertCorrectEnvPostTest();
         tool.assertOnCleanExit();
-
     }
 
     @Test
@@ -96,9 +104,10 @@
     {
         Arrays.asList("-e", "--extended").forEach(arg -> {
             ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class,
-                                                       arg,
-                                                       "system_schema",
-                                                       "tables");
+                                                     arg,
+                                                     "system_schema",
+                                                     "tables",
+                                                     "--force");
             assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("extended=true"));
             Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
             assertCorrectEnvPostTest();
@@ -111,9 +120,10 @@
     {
         Arrays.asList("-q", "--quick").forEach(arg -> {
             ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class,
-                                                       arg,
-                                                       "system_schema",
-                                                       "tables");
+                                                     arg,
+                                                     "system_schema",
+                                                     "tables",
+                                                     "-f");
             assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("quick=true"));
             Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
             assertCorrectEnvPostTest();
@@ -126,9 +136,10 @@
     {
         Arrays.asList("-r", "--mutate_repair_status").forEach(arg -> {
             ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class,
-                                                       arg,
-                                                       "system_schema",
-                                                       "tables");
+                                                     arg,
+                                                     "system_schema",
+                                                     "tables",
+                                                     "--force");
             assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("mutateRepairStatus=true"));
             Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
             assertCorrectEnvPostTest();
@@ -153,9 +164,10 @@
     {
         Arrays.asList("-v", "--verbose").forEach(arg -> {
             ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class,
-                                                       arg,
-                                                       "system_schema",
-                                                       "tables");
+                                                     arg,
+                                                     "system_schema",
+                                                     "tables",
+                                                     "-f");
             assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("verbose=true"));
             Assertions.assertThat(tool.getCleanedStderr()).isEmpty();
             assertCorrectEnvPostTest();
@@ -164,11 +176,47 @@
     }
 
     @Test
+    public void testTooFewArgs()
+    {
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "one_arg");
+        assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
+        assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Missing arguments"));
+        assertEquals(1, tool.getExitCode());
+    }
+
+    @Test
     public void testTooManyArgs()
     {
-        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "another arg", "system_schema", "tables");
+        ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class, "one_arg", "two_arg", "toomany_arg");
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Too many arguments"));
         assertEquals(1, tool.getExitCode());
     }
+
+    @Test
+    public void testFailsWithoutForce()
+    {
+        Arrays.asList("-r", "--mutate_repair_status").forEach(arg -> {
+            ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class,
+                                                     arg,
+                                                     "system_schema",
+                                                     "tables",
+                                                     "debug");
+            assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
+            assertEquals(1, tool.getExitCode());
+        });
+    }
+
+    @Test
+    public void testBadForceArgument()
+    {
+        Arrays.asList("bf", "badforce", "garbage", "forrce").forEach(arg -> {
+            ToolResult tool = ToolRunner.invokeClass(StandaloneVerifier.class,
+                                                     "system_schema",
+                                                     "tables",
+                                                     arg);
+            assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage"));
+            assertEquals(1, tool.getExitCode());
+        });
+    }
 }
diff --git a/test/unit/org/apache/cassandra/tools/ToolRunner.java b/test/unit/org/apache/cassandra/tools/ToolRunner.java
index 0ad88ef..e3b9595 100644
--- a/test/unit/org/apache/cassandra/tools/ToolRunner.java
+++ b/test/unit/org/apache/cassandra/tools/ToolRunner.java
@@ -34,6 +34,7 @@
 import java.util.Objects;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import com.google.common.base.Throwables;
 import com.google.common.collect.ImmutableList;
@@ -47,6 +48,7 @@
 import org.apache.cassandra.utils.Pair;
 import org.assertj.core.util.Lists;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
@@ -119,11 +121,13 @@
 
         private final InputStream input;
         private final T out;
+        private final boolean autoCloseOut;
 
-        private StreamGobbler(InputStream input, T out)
+        private StreamGobbler(InputStream input, T out, boolean autoCloseOut)
         {
             this.input = input;
             this.out = out;
+            this.autoCloseOut = autoCloseOut;
         }
 
         public void run()
@@ -136,6 +140,8 @@
                     int read = input.read(buffer);
                     if (read == -1)
                     {
+                        if (autoCloseOut)
+                            out.close();
                         return;
                     }
                     out.write(buffer, 0, read);
@@ -394,8 +400,11 @@
          */
         public void assertCleanStdErr()
         {
-            assertTrue("Failed because cleaned stdErr wasn't empty: " + getCleanedStderr(),
-                       getCleanedStderr().isEmpty());
+            String raw = getStderr();
+            String cleaned = getCleanedStderr();
+            assertTrue("Failed to clean stderr completely.\nRaw (length=" + raw.length() + "):\n" + raw + 
+                       "\nCleaned (length=" + cleaned.length() + "):\n" + cleaned,
+                       cleaned.trim().isEmpty());
         }
 
         public void assertOnExitCode()
@@ -451,6 +460,55 @@
             assertOnExitCode();
             assertCleanStdErr();
         }
+
+        public AssertHelp asserts()
+        {
+            return new AssertHelp();
+        }
+
+        public final class AssertHelp
+        {
+            public AssertHelp success()
+            {
+                if (exitCode != 0)
+                    fail("was not successful");
+                return this;
+            }
+
+            public AssertHelp failure()
+            {
+                if (exitCode == 0)
+                    fail("was not successful");
+                return this;
+            }
+
+            public AssertHelp errorContains(String messages)
+            {
+                return errorContainsAny(messages);
+            }
+
+            public AssertHelp errorContainsAny(String... messages)
+            {
+                assertThat(messages).hasSizeGreaterThan(0);
+                assertThat(stderr).isNotNull();
+                if (!Stream.of(messages).anyMatch(stderr::contains))
+                    fail("stderr does not contain " + Arrays.toString(messages));
+                return this;
+            }
+
+            private void fail(String msg)
+            {
+                StringBuilder sb = new StringBuilder();
+                sb.append("nodetool command ").append(String.join(" ", allArgs)).append(": ").append(msg).append('\n');
+                if (stdout != null)
+                    sb.append("stdout:\n").append(stdout).append('\n');
+                if (stderr != null)
+                    sb.append("stderr:\n").append(stderr).append('\n');
+                if (e != null)
+                    sb.append("Exception:\n").append(Throwables.getStackTraceAsString(e)).append('\n');
+                throw new AssertionError(sb.toString());
+            }
+        }
     }
 
     public interface ObservableTool extends AutoCloseable
@@ -536,19 +594,19 @@
             if (includeStdinWatcher)
                 numWatchers = 3;
             ioWatchers = new Thread[numWatchers];
-            ioWatchers[0] = new Thread(new StreamGobbler<>(process.getErrorStream(), err));
+            ioWatchers[0] = new Thread(new StreamGobbler<>(process.getErrorStream(), err, false));
             ioWatchers[0].setDaemon(true);
             ioWatchers[0].setName("IO Watcher stderr");
             ioWatchers[0].start();
 
-            ioWatchers[1] = new Thread(new StreamGobbler<>(process.getInputStream(), out));
+            ioWatchers[1] = new Thread(new StreamGobbler<>(process.getInputStream(), out, false));
             ioWatchers[1].setDaemon(true);
             ioWatchers[1].setName("IO Watcher stdout");
             ioWatchers[1].start();
 
             if (includeStdinWatcher)
             {
-                ioWatchers[2] = new Thread(new StreamGobbler<>(stdin, process.getOutputStream()));
+                ioWatchers[2] = new Thread(new StreamGobbler<>(stdin, process.getOutputStream(), true));
                 ioWatchers[2].setDaemon(true);
                 ioWatchers[2].setName("IO Watcher stdin");
                 ioWatchers[2].start();
diff --git a/test/unit/org/apache/cassandra/tools/ToolsSchemaLoadingTest.java b/test/unit/org/apache/cassandra/tools/ToolsSchemaLoadingTest.java
index 58a444c..1a99643 100644
--- a/test/unit/org/apache/cassandra/tools/ToolsSchemaLoadingTest.java
+++ b/test/unit/org/apache/cassandra/tools/ToolsSchemaLoadingTest.java
@@ -34,7 +34,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Missing arguments"));
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -49,7 +49,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Missing arguments"));
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -64,7 +64,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("No sstables to split"));
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -79,7 +79,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Missing arguments"));
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
@@ -94,7 +94,7 @@
         assertThat(tool.getStdout(), CoreMatchers.containsStringIgnoringCase("usage:"));
         assertThat(tool.getCleanedStderr(), CoreMatchers.containsStringIgnoringCase("Missing arguments"));
         assertEquals(1, tool.getExitCode());
-        assertNoUnexpectedThreadsStarted(null, null);
+        assertNoUnexpectedThreadsStarted(null);
         assertSchemaNotLoaded();
         assertCLSMNotLoaded();
         assertSystemKSNotLoaded();
diff --git a/test/unit/org/apache/cassandra/tools/cassandrastress/CassandrastressTest.java b/test/unit/org/apache/cassandra/tools/cassandrastress/CassandrastressTest.java
index aa64dac..8d0711a 100644
--- a/test/unit/org/apache/cassandra/tools/cassandrastress/CassandrastressTest.java
+++ b/test/unit/org/apache/cassandra/tools/cassandrastress/CassandrastressTest.java
@@ -23,7 +23,6 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.service.GCInspector;
 import org.apache.cassandra.tools.ToolRunner;
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java b/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
new file mode 100644
index 0000000..0e172f3
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/ClearSnapshotTest.java
@@ -0,0 +1,111 @@
+/*
+ * 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.tools.nodetool;
+
+import java.io.IOException;
+import java.util.Map;
+import javax.management.openmbean.TabularData;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.NodeProbe;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ClearSnapshotTest extends CQLTester
+{
+    private static NodeProbe probe;
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+        probe = new NodeProbe(jmxHost, jmxPort);
+    }
+
+    @AfterClass
+    public static void teardown() throws IOException
+    {
+        probe.close();
+    }
+
+    @Test
+    public void testClearSnapshot_NoArgs()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clearsnapshot");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getCleanedStderr()).contains("Specify snapshot name or --all");
+        
+        tool = ToolRunner.invokeNodetool("clearsnapshot", "--all");
+        tool.assertOnCleanExit();
+    }
+
+    @Test
+    public void testClearSnapshot_AllAndName()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clearsnapshot", "-t", "some-name", "--all");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getCleanedStderr()).contains("Specify only one of snapshot name or --all");
+    }
+
+    @Test
+    public void testClearSnapshot_RemoveByName()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("snapshot","-t","some-name");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isNotEmpty();
+        
+        Map<String, TabularData> snapshots_before = probe.getSnapshotDetails();
+        assertThat(snapshots_before).containsKey("some-name");
+
+        tool = ToolRunner.invokeNodetool("clearsnapshot","-t","some-name");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isNotEmpty();
+        
+        Map<String, TabularData> snapshots_after = probe.getSnapshotDetails();
+        assertThat(snapshots_after).doesNotContainKey("some-name");
+    }
+
+    @Test
+    public void testClearSnapshot_RemoveMultiple()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("snapshot","-t","some-name");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isNotEmpty();
+
+        tool = ToolRunner.invokeNodetool("snapshot","-t","some-other-name");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isNotEmpty();
+
+        Map<String, TabularData> snapshots_before = probe.getSnapshotDetails();
+        assertThat(snapshots_before).hasSize(2);
+
+        tool = ToolRunner.invokeNodetool("clearsnapshot","--all");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isNotEmpty();
+        
+        Map<String, TabularData> snapshots_after = probe.getSnapshotDetails();
+        assertThat(snapshots_after).isEmpty();
+    }
+    
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
new file mode 100644
index 0000000..5975f66
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/ClientStatsTest.java
@@ -0,0 +1,207 @@
+/*
+ * 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.tools.nodetool;
+
+import java.net.InetAddress;
+
+import org.junit.After;
+import org.junit.AfterClass;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.slf4j.LoggerFactory;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.Logger;
+import ch.qos.logback.classic.spi.ILoggingEvent;
+import ch.qos.logback.core.read.ListAppender;
+import com.datastax.driver.core.Cluster;
+import com.datastax.driver.core.ResultSet;
+import com.datastax.driver.core.Session;
+import org.apache.cassandra.ServerTestUtils;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.service.EmbeddedCassandraService;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.tools.ToolRunner;
+import org.assertj.core.groups.Tuple;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class ClientStatsTest
+{
+    private static Cluster cluster;
+    private Session session;
+
+    private static EmbeddedCassandraService cassandra;
+
+    @BeforeClass
+    public static void setup() throws Throwable
+    {
+        // 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 = ServerTestUtils.startEmbeddedCassandraService();
+        cluster = Cluster.builder().addContactPoint("127.0.0.1").withPort(DatabaseDescriptor.getNativeTransportPort()).build();
+    }
+
+    @Before
+    public void config() throws Throwable
+    {
+        session = cluster.connect();
+        ResultSet result = session.execute("select release_version from system.local");
+    }
+
+    @After
+    public void afterTest()
+    {
+        if (session != null)
+            session.close();
+    }
+
+    @AfterClass
+    public static void tearDown()
+    {
+        if (cluster != null)
+            cluster.close();
+        if (cassandra != null)
+            cassandra.stop();
+    }
+
+    @Test
+    public void testClientStatsHelp()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "clientstats");
+        tool.assertOnCleanExit();
+
+        String help = "NAME\n" +
+                      "        nodetool clientstats - Print information about connected clients\n" +
+                      "\n" +
+                      "SYNOPSIS\n" +
+                      "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                      "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                      "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                      "                [(-u <username> | --username <username>)] clientstats [--all]\n" +
+                        "                [--by-protocol] [--clear-history] [--client-options]\n" +
+                      "\n" +
+                      "OPTIONS\n" +
+                      "        --all\n" +
+                      "            Lists all connections\n" +
+                      "\n" +
+                      "        --by-protocol\n" +
+                      "            Lists most recent client connections by protocol version\n" +
+                      "\n" +
+                      "        --clear-history\n" +
+                      "            Clear the history of connected clients\n" +
+                        "\n" +
+                        "        --client-options\n" +
+                        "            Lists all connections and the client options\n" +
+                      "\n" +
+                      "        -h <host>, --host <host>\n" +
+                      "            Node hostname or ip address\n" +
+                      "\n" +
+                      "        -p <port>, --port <port>\n" +
+                      "            Remote jmx agent port number\n" +
+                      "\n" +
+                      "        -pp, --print-port\n" +
+                      "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                      "\n" +
+                      "        -pw <password>, --password <password>\n" +
+                      "            Remote jmx agent password\n" +
+                      "\n" +
+                      "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                      "            Path to the JMX password file\n" +
+                      "\n" +
+                      "        -u <username>, --username <username>\n" +
+                      "            Remote jmx agent username\n" +
+                      "\n" +
+                      "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testClientStats()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clientstats");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("Total connected clients: 2");
+        assertThat(stdout).contains("User      Connections");
+        assertThat(stdout).contains("anonymous 2");
+    }
+
+    @Test
+    public void testClientStatsByProtocol()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clientstats", "--by-protocol");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("Clients by protocol version");
+        assertThat(stdout).contains("Protocol-Version IP-Address Last-Seen");
+        assertThat(stdout).containsPattern("[0-9]/v[0-9] +/127.0.0.1 [a-zA-Z]{3} [0-9]+, [0-9]{4} [0-9]{2}:[0-9]{2}:[0-9]{2}");
+    }
+
+    @Test
+    public void testClientStatsAll()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clientstats", "--all");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).containsPattern("Address +SSL +Cipher +Protocol +Version +User +Keyspace +Requests +Driver-Name +Driver-Version");
+        assertThat(stdout).containsPattern("/127.0.0.1:[0-9]+ false undefined undefined [0-9]+ +anonymous +[0-9]+ +DataStax Java Driver 3.11.0");
+        assertThat(stdout).contains("Total connected clients: 2");
+        assertThat(stdout).contains("User      Connections");
+        assertThat(stdout).contains("anonymous 2");
+    }
+
+    @Test
+    public void testClientStatsClientOptions()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clientstats", "--client-options");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).containsPattern("Address +SSL +Cipher +Protocol +Version +User +Keyspace +Requests +Driver-Name +Driver-Version +Client-Options");
+        assertThat(stdout).containsPattern("/127.0.0.1:[0-9]+ false undefined undefined [0-9]+ +anonymous +[0-9]+ +DataStax Java Driver 3.11.0");
+        assertThat(stdout).containsPattern("DRIVER_NAME=DataStax Java Driver");
+        assertThat(stdout).containsPattern("DRIVER_VERSION=3.11.0");
+        assertThat(stdout).containsPattern("CQL_VERSION=3.0.0");
+        assertThat(stdout).contains("Total connected clients: 2");
+        assertThat(stdout).contains("User      Connections");
+        assertThat(stdout).contains("anonymous 2");
+    }
+
+    @Test
+    public void testClientStatsClearHistory()
+    {
+        ListAppender<ILoggingEvent> listAppender = new ListAppender<>();
+        Logger ssLogger = (Logger) LoggerFactory.getLogger(StorageService.class);
+
+        ssLogger.addAppender(listAppender);
+        listAppender.start();
+
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("clientstats", "--clear-history");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("Clearing connection history");
+        assertThat(listAppender.list)
+        .extracting(ILoggingEvent::getMessage, ILoggingEvent::getLevel)
+        .contains(Tuple.tuple("Cleared connection history", Level.INFO));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/CompactTest.java b/test/unit/org/apache/cassandra/tools/nodetool/CompactTest.java
new file mode 100644
index 0000000..34059aa
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/CompactTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.Arrays;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.Keyspace;
+import org.apache.cassandra.dht.Murmur3Partitioner;
+import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.tools.ToolRunner.invokeNodetool;
+
+public class CompactTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Throwable
+    {
+        startJMXServer();
+    }
+
+    @Test
+    public void keyPresent() throws Throwable
+    {
+        long token = 42;
+        long key = Murmur3Partitioner.LongToken.keyForToken(token).getLong();
+        createTable("CREATE TABLE %s (id bigint, value text, PRIMARY KEY ((id)))");
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
+        cfs.disableAutoCompaction();
+        // write SSTables for the specific key
+        for (int i = 0; i < 10; i++)
+        {
+            execute("INSERT INTO %s (id, value) VALUES (?, ?)", key, "This is just some text... part " + i);
+            flush(keyspace());
+        }
+        Assertions.assertThat(cfs.getTracker().getView().liveSSTables()).hasSize(10);
+        invokeNodetool("compact", "--partition", Long.toString(key), keyspace(), currentTable()).assertOnCleanExit();
+
+        // only 1 SSTable should exist
+        Assertions.assertThat(cfs.getTracker().getView().liveSSTables()).hasSize(1);
+    }
+
+    @Test
+    public void keyNotPresent() throws Throwable
+    {
+        long token = 42;
+        long key = Murmur3Partitioner.LongToken.keyForToken(token).getLong();
+        createTable("CREATE TABLE %s (id bigint, value text, PRIMARY KEY ((id)))");
+        ColumnFamilyStore cfs = Keyspace.open(keyspace()).getColumnFamilyStore(currentTable());
+        cfs.disableAutoCompaction();
+        // write SSTables for the specific key
+        for (int i = 0; i < 10; i++)
+        {
+            execute("INSERT INTO %s (id, value) VALUES (?, ?)", key, "This is just some text... part " + i);
+            flush(keyspace());
+        }
+        Assertions.assertThat(cfs.getTracker().getView().liveSSTables()).hasSize(10);
+
+        for (long keyNotFound : Arrays.asList(key - 1, key + 1))
+        {
+            invokeNodetool("compact", "--partition", Long.toString(keyNotFound), keyspace(), currentTable()).assertOnCleanExit();
+
+            // only 1 SSTable should exist
+            Assertions.assertThat(cfs.getTracker().getView().liveSSTables()).hasSize(10);
+        }
+    }
+
+    @Test
+    public void tableNotFound()
+    {
+        invokeNodetool("compact", "--partition", Long.toString(42), keyspace(), "doesnotexist")
+        .asserts()
+        .failure()
+        .errorContains(String.format("java.lang.IllegalArgumentException: Unknown keyspace/cf pair (%s.doesnotexist)", keyspace()));
+    }
+
+    @Test
+    public void keyWrongType()
+    {
+        createTable("CREATE TABLE %s (id bigint, value text, PRIMARY KEY ((id)))");
+
+        invokeNodetool("compact", "--partition", "this_will_not_work", keyspace(), currentTable())
+        .asserts()
+        .failure()
+        .errorContains(String.format("Unable to parse partition key 'this_will_not_work' for table %s.%s; Unable to make long from 'this_will_not_work'", keyspace(), currentTable()));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
new file mode 100644
index 0000000..b42a166
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/CompactionStatsTest.java
@@ -0,0 +1,269 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.ColumnFamilyStore;
+import org.apache.cassandra.db.compaction.CompactionInfo;
+import org.apache.cassandra.db.compaction.CompactionManager;
+import org.apache.cassandra.db.compaction.OperationType;
+import org.apache.cassandra.io.sstable.format.SSTableReader;
+import org.apache.cassandra.schema.MockSchema;
+import org.apache.cassandra.tools.ToolRunner;
+import org.apache.cassandra.utils.TimeUUID;
+import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class CompactionStatsTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "compactionstats");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                "        nodetool compactionstats - Print statistics on compactions\n" +
+                "\n" +
+                "SYNOPSIS\n" +
+                "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                "                [(-u <username> | --username <username>)] compactionstats\n" +
+                "                [(-H | --human-readable)] [(-V | --vtable)]\n" +
+                "\n" +
+                "OPTIONS\n" +
+                "        -h <host>, --host <host>\n" +
+                "            Node hostname or ip address\n" +
+                "\n" +
+                "        -H, --human-readable\n" +
+                "            Display bytes in human readable form, i.e. KiB, MiB, GiB, TiB\n" +
+                "\n" +
+                "        -p <port>, --port <port>\n" +
+                "            Remote jmx agent port number\n" +
+                "\n" +
+                "        -pp, --print-port\n" +
+                "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                "\n" +
+                "        -pw <password>, --password <password>\n" +
+                "            Remote jmx agent password\n" +
+                "\n" +
+                "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                "            Path to the JMX password file\n" +
+                "\n" +
+                "        -u <username>, --username <username>\n" +
+                "            Remote jmx agent username\n" +
+                "\n" +
+                "        -V, --vtable\n" +
+                "            Display fields matching vtable output\n" +
+                "\n" +
+                "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testCompactionStats()
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck))");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+
+        long bytesCompacted = 123;
+        long bytesTotal = 123456;
+        TimeUUID compactionId = nextTimeUUID();
+        List<SSTableReader> sstables = IntStream.range(0, 10)
+                .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+                .collect(Collectors.toList());
+        CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
+        {
+            public CompactionInfo getCompactionInfo()
+            {
+                return new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, bytesCompacted, bytesTotal, compactionId, sstables);
+            }
+
+            public boolean isGlobal()
+            {
+                return false;
+            }
+        };
+
+        CompactionManager.instance.active.beginCompaction(compactionHolder);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("compactionstats");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 1");
+        Assertions.assertThat(stdout).containsPattern("id\\s+compaction type\\s+keyspace\\s+table\\s+completed\\s+total\\s+unit\\s+progress");
+        String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%.2f%%",
+            compactionId, OperationType.COMPACTION, CQLTester.KEYSPACE, currentTable(), bytesCompacted, bytesTotal,
+            CompactionInfo.Unit.BYTES, (double) bytesCompacted / bytesTotal * 100);
+        Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+
+        CompactionManager.instance.active.finishCompaction(compactionHolder);
+        tool = ToolRunner.invokeNodetool("compactionstats");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 0");
+    }
+
+    @Test
+    public void testCompactionStatsVtable()
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck))");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+
+        long bytesCompacted = 123;
+        long bytesTotal = 123456;
+        TimeUUID compactionId = nextTimeUUID();
+        List<SSTableReader> sstables = IntStream.range(0, 10)
+            .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+            .collect(Collectors.toList());
+        CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
+        {
+            public CompactionInfo getCompactionInfo()
+            {
+                return new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, bytesCompacted, bytesTotal, compactionId, sstables);
+            }
+
+            public boolean isGlobal()
+            {
+                return false;
+            }
+        };
+
+        CompactionManager.instance.active.beginCompaction(compactionHolder);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("compactionstats", "-V");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 1");
+        Assertions.assertThat(stdout).containsPattern("keyspace\\s+table\\s+task id\\s+completion ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit");
+        String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%.2f%%\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s",
+            CQLTester.KEYSPACE, currentTable(), compactionId, (double) bytesCompacted / bytesTotal * 100,
+            OperationType.COMPACTION, bytesCompacted, sstables.size(), bytesTotal, CompactionInfo.Unit.BYTES);
+        Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+
+        CompactionManager.instance.active.finishCompaction(compactionHolder);
+        tool = ToolRunner.invokeNodetool("compactionstats", "-V");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 0");
+    }
+
+    @Test
+    public void testCompactionStatsHumanReadable()
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck))");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+
+        long bytesCompacted = 123;
+        long bytesTotal = 123456;
+        TimeUUID compactionId = nextTimeUUID();
+        List<SSTableReader> sstables = IntStream.range(0, 10)
+            .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+            .collect(Collectors.toList());
+        CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
+        {
+            public CompactionInfo getCompactionInfo()
+            {
+                return new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, bytesCompacted, bytesTotal, compactionId, sstables);
+            }
+
+            public boolean isGlobal()
+            {
+                return false;
+            }
+        };
+
+        CompactionManager.instance.active.beginCompaction(compactionHolder);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("compactionstats", "--human-readable");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 1");
+        Assertions.assertThat(stdout).containsPattern("id\\s+compaction type\\s+keyspace\\s+table\\s+completed\\s+total\\s+unit\\s+progress");
+        String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s\\s+%.2f%%",
+            compactionId, OperationType.COMPACTION, CQLTester.KEYSPACE, currentTable(), "123 bytes", "120.56 KiB",
+            CompactionInfo.Unit.BYTES, (double) bytesCompacted / bytesTotal * 100);
+        Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+
+        CompactionManager.instance.active.finishCompaction(compactionHolder);
+        tool = ToolRunner.invokeNodetool("compactionstats", "--human-readable");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 0");
+    }
+
+    @Test
+    public void testCompactionStatsVtableHumanReadable()
+    {
+        createTable("CREATE TABLE %s (pk int, ck int, PRIMARY KEY (pk, ck))");
+        ColumnFamilyStore cfs = getCurrentColumnFamilyStore();
+
+        long bytesCompacted = 123;
+        long bytesTotal = 123456;
+        TimeUUID compactionId = nextTimeUUID();
+        List<SSTableReader> sstables = IntStream.range(0, 10)
+            .mapToObj(i -> MockSchema.sstable(i, i * 10L, i * 10L + 9, cfs))
+            .collect(Collectors.toList());
+        CompactionInfo.Holder compactionHolder = new CompactionInfo.Holder()
+        {
+            public CompactionInfo getCompactionInfo()
+            {
+                return new CompactionInfo(cfs.metadata(), OperationType.COMPACTION, bytesCompacted, bytesTotal, compactionId, sstables);
+            }
+
+            public boolean isGlobal()
+            {
+                return false;
+            }
+        };
+
+        CompactionManager.instance.active.beginCompaction(compactionHolder);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("compactionstats", "--vtable", "--human-readable");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 1");
+        Assertions.assertThat(stdout).containsPattern("keyspace\\s+table\\s+task id\\s+completion ratio\\s+kind\\s+progress\\s+sstables\\s+total\\s+unit");
+        String expectedStatsPattern = String.format("%s\\s+%s\\s+%s\\s+%.2f%%\\s+%s\\s+%s\\s+%s\\s+%s\\s+%s",
+            CQLTester.KEYSPACE, currentTable(), compactionId, (double) bytesCompacted / bytesTotal * 100,
+            OperationType.COMPACTION, "123 bytes", sstables.size(), "120.56 KiB", CompactionInfo.Unit.BYTES);
+        Assertions.assertThat(stdout).containsPattern(expectedStatsPattern);
+
+        CompactionManager.instance.active.finishCompaction(compactionHolder);
+        tool = ToolRunner.invokeNodetool("compactionstats", "--vtable", "--human-readable");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        assertThat(stdout).contains("pending tasks: 0");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/DataPathsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/DataPathsTest.java
new file mode 100644
index 0000000..d09aceb
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/DataPathsTest.java
@@ -0,0 +1,170 @@
+/*
+ * 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.tools.nodetool;
+
+import org.apache.commons.lang3.StringUtils;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class DataPathsTest extends CQLTester
+{
+    private static final String SUBCOMMAND = "datapaths";
+    
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+    }
+
+    @Test
+    public void testHelp()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", SUBCOMMAND);
+        tool.assertOnCleanExit();
+        
+        String help = "NAME\n" +
+                      "        nodetool datapaths - Print all directories where data of tables are\n" +
+                      "        stored\n" +
+                      '\n' +
+                      "SYNOPSIS\n" +
+                      "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                      "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                      "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                      "                [(-u <username> | --username <username>)] datapaths\n" +
+                      "                [(-F <format> | --format <format>)] [--] [<keyspace.table>...]\n" +
+                      '\n' +
+                      "OPTIONS\n" +
+                      "        -F <format>, --format <format>\n" +
+                      "            Output format (json, yaml)\n" +
+                      '\n' +
+                      "        -h <host>, --host <host>\n" +
+                      "            Node hostname or ip address\n" +
+                      '\n' +
+                      "        -p <port>, --port <port>\n" +
+                      "            Remote jmx agent port number\n" +
+                      '\n' +
+                      "        -pp, --print-port\n" +
+                      "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                      '\n' +
+                      "        -pw <password>, --password <password>\n" +
+                      "            Remote jmx agent password\n" +
+                      '\n' +
+                      "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                      "            Path to the JMX password file\n" +
+                      '\n' +
+                      "        -u <username>, --username <username>\n" +
+                      "            Remote jmx agent username\n" +
+                      '\n' +
+                      "        --\n" +
+                      "            This option can be used to separate command-line options from the\n" +
+                      "            list of argument, (useful when arguments might be mistaken for\n" +
+                      "            command-line options\n" +
+                      '\n' +
+                      "        [<keyspace.table>...]\n" +
+                      "            List of table (or keyspace) names\n" +
+                      '\n' +
+                      '\n';
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testAllOutput()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND);
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace: system_schema");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Keyspace:")).isGreaterThan(1);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tTable:")).isGreaterThan(1);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tPaths:")).isGreaterThan(1);
+    }
+
+    @Test
+    public void testSelectedKeyspace()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND, "system_traces");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace: system_traces");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Keyspace:")).isEqualTo(1);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tTable:")).isGreaterThan(1);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tPaths:")).isGreaterThan(1);
+    }
+
+    @Test
+    public void testSelectedMultipleKeyspaces()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND, "system_traces", "system_auth");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace: system_traces");
+        assertThat(tool.getStdout()).contains("Keyspace: system_auth");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Keyspace:")).isEqualTo(2);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tTable:")).isGreaterThan(1);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tPaths:")).isGreaterThan(1);
+    }
+
+    @Test
+    public void testSelectedTable()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND, "system_auth.roles");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace: system_auth");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Keyspace:")).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("Table: roles");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tTable:")).isEqualTo(1);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tPaths:")).isEqualTo(1);
+    }
+
+    @Test
+    public void testSelectedMultipleTables()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND, "system_auth.roles", "system_auth.role_members");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace: system_auth");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Keyspace:")).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("Table: roles");
+        assertThat(tool.getStdout()).contains("Table: role_members");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tTable:")).isEqualTo(2);
+        assertThat(StringUtils.countMatches(tool.getStdout(), "\tPaths:")).isEqualTo(2);
+    }
+
+    @Test
+    public void testFormatArgJson()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND, "--format", "json");
+        tool.assertOnCleanExit();
+    }
+
+    @Test
+    public void testFormatArgYaml()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND, "--format", "yaml");
+        tool.assertOnCleanExit();
+    }
+
+    @Test
+    public void testFormatArgBad()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(SUBCOMMAND, "--format", "bad");
+        assertThat(tool.getStdout()).contains("arguments for -F are yaml and json only.");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/GetAuditLogTest.java b/test/unit/org/apache/cassandra/tools/nodetool/GetAuditLogTest.java
new file mode 100644
index 0000000..069710b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetAuditLogTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class GetAuditLogTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+    }
+
+    @After
+    public void afterTest()
+    {
+        disableAuditLog();
+    }
+
+    @Test
+    public void getDefaultOutputTest()
+    {
+        testDefaultOutput(getAuditLog());
+    }
+
+    @Test
+    public void getSimpleOutputTest()
+    {
+        enableAuditLogSimple();
+        testChangedOutputSimple(getAuditLog());
+    }
+
+    @Test
+    public void getComplexOutputTest()
+    {
+        enableAuditLogComplex();
+        testChangedOutputComplex(getAuditLog());
+    }
+
+    @Test
+    public void disablingAuditLogResetsOutputTest()
+    {
+        enableAuditLogComplex();
+        disableAuditLog();
+        testDefaultOutput(getAuditLog());
+    }
+
+    private String getAuditLog()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("getauditlog");
+        tool.assertOnCleanExit();
+        return tool.getStdout();
+    }
+
+    private void disableAuditLog()
+    {
+        ToolRunner.invokeNodetool("disableauditlog").assertOnCleanExit();
+    }
+
+    private void enableAuditLogSimple()
+    {
+        ToolRunner.invokeNodetool("enableauditlog").assertOnCleanExit();
+    }
+
+    private void enableAuditLogComplex()
+    {
+        ToolRunner.invokeNodetool("enableauditlog",
+                                  "--included-keyspaces", "ks1,ks2,ks3",
+                                  "--excluded-categories", "ddl,dcl").assertOnCleanExit();
+    }
+
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
+    private void testChangedOutputSimple(final String getAuditLogOutput)
+    {
+        final String output = getAuditLogOutput.replaceAll("( )+", " ").trim();
+        assertThat(output).startsWith("enabled true");
+        assertThat(output).contains("logger BinAuditLogger");
+        assertThat(output).contains("roll_cycle HOURLY");
+        assertThat(output).contains("block true");
+        assertThat(output).contains("max_log_size 17179869184");
+        assertThat(output).contains("max_queue_weight 268435456");
+        assertThat(output).contains("max_archive_retries 10");
+        assertThat(output).contains("included_keyspaces \n");
+        assertThat(output).contains("excluded_keyspaces system,system_schema,system_virtual_schema");
+        assertThat(output).contains("included_categories \n");
+        assertThat(output).contains("excluded_categories \n");
+        assertThat(output).contains("included_users \n");
+        assertThat(output).endsWith("excluded_users");
+    }
+
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
+    private void testChangedOutputComplex(final String getAuditLogOutput)
+    {
+        final String output = getAuditLogOutput.replaceAll("( )+", " ").trim();
+        assertThat(output).startsWith("enabled true");
+        assertThat(output).contains("logger BinAuditLogger");
+        assertThat(output).contains("roll_cycle HOURLY");
+        assertThat(output).contains("block true");
+        assertThat(output).contains("max_log_size 17179869184");
+        assertThat(output).contains("max_queue_weight 268435456");
+        assertThat(output).contains("max_archive_retries 10");
+        assertThat(output).contains("included_keyspaces ks1,ks2,ks3");
+        assertThat(output).contains("excluded_keyspaces system,system_schema,system_virtual_schema");
+        assertThat(output).contains("included_categories \n");
+        assertThat(output).contains("excluded_categories DDL,DCL");
+        assertThat(output).contains("included_users \n");
+        assertThat(output).endsWith("excluded_users");
+    }
+
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
+    private void testDefaultOutput(final String getAuditLogOutput)
+    {
+        final String output = getAuditLogOutput.replaceAll("( )+", " ").trim();
+        assertThat(output).startsWith("enabled false");
+        assertThat(output).contains("logger BinAuditLogger");
+        assertThat(output).contains("roll_cycle HOURLY");
+        assertThat(output).contains("block true");
+        assertThat(output).contains("max_log_size 17179869184");
+        assertThat(output).contains("max_queue_weight 268435456");
+        assertThat(output).contains("max_archive_retries 10");
+        assertThat(output).contains("included_keyspaces \n");
+        assertThat(output).contains("excluded_keyspaces system,system_schema,system_virtual_schema");
+        assertThat(output).contains("included_categories \n");
+        assertThat(output).contains("excluded_categories \n");
+        assertThat(output).contains("included_users \n");
+        assertThat(output).endsWith("excluded_users");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/GetAuthCacheConfigTest.java b/test/unit/org/apache/cassandra/tools/nodetool/GetAuthCacheConfigTest.java
new file mode 100644
index 0000000..6afc179
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetAuthCacheConfigTest.java
@@ -0,0 +1,141 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthCache;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.NetworkPermissionsCacheMBean;
+import org.apache.cassandra.auth.PasswordAuthenticator;
+import org.apache.cassandra.auth.PermissionsCacheMBean;
+import org.apache.cassandra.auth.Roles;
+import org.apache.cassandra.auth.RolesCacheMBean;
+import org.apache.cassandra.auth.jmx.AuthorizationProxy;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class GetAuthCacheConfigTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "getauthcacheconfig");
+        tool.assertOnCleanExit();
+
+        String help = "NAME\n" +
+                      "        nodetool getauthcacheconfig - Get configuration of Auth cache\n" +
+                      "\n" +
+                      "SYNOPSIS\n" +
+                      "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                      "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                      "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                      "                [(-u <username> | --username <username>)] getauthcacheconfig\n" +
+                      "                --cache-name <cache-name>\n" +
+                      "\n" +
+                      "OPTIONS\n" +
+                      "        --cache-name <cache-name>\n" +
+                      "            Name of Auth cache (required)\n" +
+                      "\n" +
+                      "        -h <host>, --host <host>\n" +
+                      "            Node hostname or ip address\n" +
+                      "\n" +
+                      "        -p <port>, --port <port>\n" +
+                      "            Remote jmx agent port number\n" +
+                      "\n" +
+                      "        -pp, --print-port\n" +
+                      "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                      "\n" +
+                      "        -pw <password>, --password <password>\n" +
+                      "            Remote jmx agent password\n" +
+                      "\n" +
+                      "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                      "            Path to the JMX password file\n" +
+                      "\n" +
+                      "        -u <username>, --username <username>\n" +
+                      "            Remote jmx agent username\n" +
+                      "\n" +
+                      "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testInvalidCacheName()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("getauthcacheconfig");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("Required option '--cache-name' is missing"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("getauthcacheconfig", "--cache-name");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("Required values for option 'cache-name' not provided"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("getauthcacheconfig", "--cache-name", "wrong");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("Unknown cache name: wrong"));
+        assertThat(tool.getStderr()).isEmpty();
+    }
+
+    @Test
+    public void testGetConfig()
+    {
+        assertGetConfig(AuthenticatedUser.permissionsCache, PermissionsCacheMBean.CACHE_NAME);
+
+        PasswordAuthenticator passwordAuthenticator = (PasswordAuthenticator) DatabaseDescriptor.getAuthenticator();
+        assertGetConfig(passwordAuthenticator.getCredentialsCache(), PasswordAuthenticator.CredentialsCacheMBean.CACHE_NAME);
+
+        assertGetConfig(AuthorizationProxy.jmxPermissionsCache, AuthorizationProxy.JmxPermissionsCacheMBean.CACHE_NAME);
+
+        assertGetConfig(AuthenticatedUser.networkPermissionsCache, NetworkPermissionsCacheMBean.CACHE_NAME);
+
+        assertGetConfig(Roles.cache, RolesCacheMBean.CACHE_NAME);
+    }
+
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    private void assertGetConfig(AuthCache<?, ?> authCache, String cacheName)
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("getauthcacheconfig", "--cache-name", cacheName);
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEqualTo("Validity Period: " + authCache.getValidity() + "\n" +
+                                               "Update Interval: " + authCache.getUpdateInterval() + "\n" +
+                                               "Max Entries: " + authCache.getMaxEntries() + "\n" +
+                                               "Active Update: " + authCache.getActiveUpdate() + "\n");
+    }
+
+    private String wrapByDefaultNodetoolMessage(String s)
+    {
+        return "nodetool: " + s + "\nSee 'nodetool help' or 'nodetool help <command>'.\n";
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/GetDefaultKeyspaceRFTest.java b/test/unit/org/apache/cassandra/tools/nodetool/GetDefaultKeyspaceRFTest.java
new file mode 100644
index 0000000..7db6f10
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetDefaultKeyspaceRFTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class GetDefaultKeyspaceRFTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "getdefaultrf");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool getdefaultrf - Gets default keyspace replication factor.\n" +
+                        "\n" +
+                        "SYNOPSIS\n" +
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)] getdefaultrf\n" +
+                        "\n" +
+                        "OPTIONS\n" +
+                        "        -h <host>, --host <host>\n" +
+                        "            Node hostname or ip address\n" +
+                        "\n" +
+                        "        -p <port>, --port <port>\n" +
+                        "            Remote jmx agent port number\n" +
+                        "\n" +
+                        "        -pp, --print-port\n" +
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                        "\n" +
+                        "        -pw <password>, --password <password>\n" +
+                        "            Remote jmx agent password\n" +
+                        "\n" +
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                        "            Path to the JMX password file\n" +
+                        "\n" +
+                        "        -u <username>, --username <username>\n" +
+                        "            Remote jmx agent username\n" +
+                        "\n" +
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testGetDefaultRF()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("getdefaultrf");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout().trim()).isEqualTo(Integer.toString(DatabaseDescriptor.getDefaultKeyspaceRF()));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java b/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
new file mode 100644
index 0000000..61d34ec
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GetFullQueryLogTest.java
@@ -0,0 +1,140 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.After;
+import org.junit.BeforeClass;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.fql.FullQueryLoggerOptions;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class GetFullQueryLogTest extends CQLTester
+{
+    @ClassRule
+    public static TemporaryFolder temporaryFolder = new TemporaryFolder();
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+    }
+
+    @After
+    public void afterTest() throws InterruptedException
+    {
+        disableFullQueryLog();
+    }
+
+    @Test
+    public void getFullQueryLogTest()
+    {
+        testDefaultOutput(getFullQueryLog());
+    }
+
+    @Test
+    public void enableFullQueryLogTest()
+    {
+        enableFullQueryLog();
+        testChangedOutput(getFullQueryLog());
+    }
+
+    @Test
+    public void resetFullQueryLogTest()
+    {
+        enableFullQueryLog();
+        testChangedOutput(getFullQueryLog());
+
+        // reset and get and test that it reset configuration into defaults
+        resetFullQueryLog();
+
+        testDefaultOutput(getFullQueryLog());
+    }
+
+    private String getFullQueryLog()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("getfullquerylog");
+        tool.assertOnCleanExit();
+        return tool.getStdout();
+    }
+
+    private void resetFullQueryLog()
+    {
+        ToolRunner.invokeNodetool("resetfullquerylog").assertOnCleanExit();
+    }
+
+    private void disableFullQueryLog()
+    {
+        ToolRunner.invokeNodetool("disablefullquerylog").assertOnCleanExit();
+    }
+
+    private void enableFullQueryLog()
+    {
+        ToolRunner.invokeNodetool("enablefullquerylog",
+                                  "--path",
+                                  temporaryFolder.getRoot().toString(),
+                                  "--blocking",
+                                  "false",
+                                  "--max-archive-retries",
+                                  "5",
+                                  "--archive-command",
+                                  "/path/to/script.sh %path",
+                                  "--max-log-size",
+                                  "100000",
+                                  "--max-queue-weight",
+                                  "10000",
+                                  "--roll-cycle",
+                                  "DAILY")
+                  .assertOnCleanExit();
+    }
+
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
+    private void testChangedOutput(final String getFullQueryLogOutput)
+    {
+        final String output = getFullQueryLogOutput.replaceAll("( )+", " ").trim();
+        assertThat(output).contains("enabled true");
+        assertThat(output).contains("log_dir " + temporaryFolder.getRoot().toString());
+        assertThat(output).contains("archive_command /path/to/script.sh %path");
+        assertThat(output).contains("roll_cycle DAILY");
+        assertThat(output).contains("max_log_size 100000");
+        assertThat(output).contains("max_queue_weight 10000");
+        assertThat(output).contains("max_archive_retries 5");
+        assertThat(output).contains("block false");
+    }
+
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
+    private void testDefaultOutput(final String getFullQueryLogOutput)
+    {
+        final FullQueryLoggerOptions options = new FullQueryLoggerOptions();
+        final String output = getFullQueryLogOutput.replaceAll("( )+", " ").trim();
+        assertThat(output).contains("enabled false");
+        assertThat(output).doesNotContain("log_dir " + temporaryFolder.getRoot().toString());
+        assertThat(output).doesNotContain("archive_command /path/to/script.sh %path");
+        assertThat(output).contains("roll_cycle " + options.roll_cycle);
+        assertThat(output).contains("max_log_size " + options.max_log_size);
+        assertThat(output).contains("max_queue_weight " + options.max_queue_weight);
+        assertThat(output).contains("max_archive_retries " + options.max_archive_retries);
+        assertThat(output).contains("block " + options.block);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/GossipInfoTest.java b/test/unit/org/apache/cassandra/tools/nodetool/GossipInfoTest.java
new file mode 100644
index 0000000..7ae4b77
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/GossipInfoTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.tools.nodetool;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.NoPayload;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.tools.ToolRunner;
+import org.apache.cassandra.utils.FBUtilities;
+import org.assertj.core.api.Assertions;
+
+import static org.apache.cassandra.net.Verb.ECHO_REQ;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class GossipInfoTest extends CQLTester
+{
+    private static String token;
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+        token = StorageService.instance.getTokens().get(0);
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "gossipinfo");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                "        nodetool gossipinfo - Shows the gossip information for the cluster\n" +
+                "\n" +
+                "SYNOPSIS\n" +
+                "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                "                [(-u <username> | --username <username>)] gossipinfo\n" +
+                "                [(-r | --resolve-ip)]\n" +
+                "\n" +
+                "OPTIONS\n" +
+                "        -h <host>, --host <host>\n" +
+                "            Node hostname or ip address\n" +
+                "\n" +
+                "        -p <port>, --port <port>\n" +
+                "            Remote jmx agent port number\n" +
+                "\n" +
+                "        -pp, --print-port\n" +
+                "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                "\n" +
+                "        -pw <password>, --password <password>\n" +
+                "            Remote jmx agent password\n" +
+                "\n" +
+                "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                "            Path to the JMX password file\n" +
+                "\n" +
+                "        -r, --resolve-ip\n" +
+                "            Show node domain names instead of IPs\n" +
+                "\n" +
+                "        -u <username>, --username <username>\n" +
+                "            Remote jmx agent username\n" +
+                "\n" +
+                "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testGossipInfo()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("gossipinfo");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        Assertions.assertThat(stdout).contains("/127.0.0.1");
+        Assertions.assertThat(stdout).containsPattern("\\s+generation:[0-9]+");
+        Assertions.assertThat(stdout).containsPattern("heartbeat:[0-9]+");
+        Assertions.assertThat(stdout).containsPattern("STATUS:[0-9]+:NORMAL," + token);
+        Assertions.assertThat(stdout).containsPattern("SCHEMA:.+");
+        Assertions.assertThat(stdout).containsPattern("DC:[0-9]+:datacenter1");
+        Assertions.assertThat(stdout).containsPattern("RACK:[0-9]+:rack1");
+        Assertions.assertThat(stdout).containsPattern("RELEASE_VERSION:.+");
+        Assertions.assertThat(stdout).containsPattern("RPC_ADDRESS:[0-9]+:127.0.0.1");
+        Assertions.assertThat(stdout).containsPattern("NET_VERSION:[0-9]+:.+");
+        Assertions.assertThat(stdout).containsPattern("HOST_ID:[0-9]+:.+");
+        Assertions.assertThat(stdout).containsPattern("NATIVE_ADDRESS_AND_PORT:[0-9]+:127.0.0.1:[0-9]+");
+        Assertions.assertThat(stdout).containsPattern("SSTABLE_VERSIONS:[0-9]+:");
+        Assertions.assertThat(stdout).containsPattern("STATUS_WITH_PORT:[0-9]+:NORMAL,.+");
+        Assertions.assertThat(stdout).containsPattern("TOKENS:[0-9]+:<hidden>");
+
+        // Make sure heartbeats are detected
+        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, NoPayload.noPayload);
+        MessagingService.instance().send(echoMessageOut, FBUtilities.getBroadcastAddressAndPort());
+
+        String origHeartbeatCount = StringUtils.substringBetween(stdout, "heartbeat:", "\n");
+        tool = ToolRunner.invokeNodetool("gossipinfo");
+        tool.assertOnCleanExit();
+        String newHeartbeatCount = StringUtils.substringBetween(stdout, "heartbeat:", "\n");
+        assertThat(Integer.parseInt(origHeartbeatCount)).isLessThanOrEqualTo(Integer.parseInt(newHeartbeatCount));
+    }
+
+    @Test
+    public void testGossipInfoWithPortPrint()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("-pp", "gossipinfo");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        Assertions.assertThat(stdout).containsPattern("/127.0.0.1\\:[0-9]+\\s+generation");
+    }
+
+    @Test
+    public void testGossipInfoWithResolveIp()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("gossipinfo", "--resolve-ip");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        Assertions.assertThat(stdout).containsPattern("^localhost\\s+generation");
+    }
+
+    @Test
+    public void testGossipInfoWithPortPrintAndResolveIp()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("-pp", "gossipinfo", "--resolve-ip");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        Assertions.assertThat(stdout).containsPattern("^localhost\\:[0-9]+\\s+generation");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCacheTest.java b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCacheTest.java
new file mode 100644
index 0000000..40d7ffb
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateCredentialsCacheTest.java
@@ -0,0 +1,166 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.datastax.driver.core.EndPoint;
+import com.datastax.driver.core.PlainTextAuthProvider;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.IAuthenticator;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.PasswordAuthenticator;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.getRolesReadCount;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class InvalidateCredentialsCacheTest extends CQLTester
+{
+    private static IAuthenticator.SaslNegotiator roleANegotiator;
+    private static IAuthenticator.SaslNegotiator roleBNegotiator;
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+
+        PasswordAuthenticator passwordAuthenticator = (PasswordAuthenticator) DatabaseDescriptor.getAuthenticator();
+        roleANegotiator = passwordAuthenticator.newSaslNegotiator(null);
+        roleANegotiator.evaluateResponse(new PlainTextAuthProvider(ROLE_A.getRoleName(), "ignored")
+                .newAuthenticator((EndPoint) null, null)
+                .initialResponse());
+        roleBNegotiator = passwordAuthenticator.newSaslNegotiator(null);
+        roleBNegotiator.evaluateResponse(new PlainTextAuthProvider(ROLE_B.getRoleName(), "ignored")
+                .newAuthenticator((EndPoint) null, null)
+                .initialResponse());
+
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "invalidatecredentialscache");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool invalidatecredentialscache - Invalidate the credentials cache\n" +
+                        "\n" +
+                        "SYNOPSIS\n" +
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)] invalidatecredentialscache\n" +
+                        "                [--] [<role>...]\n" +
+                        "\n" +
+                        "OPTIONS\n" +
+                        "        -h <host>, --host <host>\n" +
+                        "            Node hostname or ip address\n" +
+                        "\n" +
+                        "        -p <port>, --port <port>\n" +
+                        "            Remote jmx agent port number\n" +
+                        "\n" +
+                        "        -pp, --print-port\n" +
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                        "\n" +
+                        "        -pw <password>, --password <password>\n" +
+                        "            Remote jmx agent password\n" +
+                        "\n" +
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                        "            Path to the JMX password file\n" +
+                        "\n" +
+                        "        -u <username>, --username <username>\n" +
+                        "            Remote jmx agent username\n" +
+                        "\n" +
+                        "        --\n" +
+                        "            This option can be used to separate command-line options from the\n" +
+                        "            list of argument, (useful when arguments might be mistaken for\n" +
+                        "            command-line options\n" +
+                        "\n" +
+                        "        [<role>...]\n" +
+                        "            List of roles to invalidate. By default, all roles\n" +
+                        "\n" +
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testInvalidateSingleCredential()
+    {
+        // cache credential
+        roleANegotiator.getAuthenticatedUser();
+        long originalReadsCount = getRolesReadCount();
+
+        // enure credential is cached
+        assertThat(roleANegotiator.getAuthenticatedUser()).isEqualTo(new AuthenticatedUser(ROLE_A.getRoleName()));
+        assertThat(originalReadsCount).isEqualTo(getRolesReadCount());
+
+        // invalidate credential
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatecredentialscache", ROLE_A.getRoleName());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure credential is reloaded
+        assertThat(roleANegotiator.getAuthenticatedUser()).isEqualTo(new AuthenticatedUser(ROLE_A.getRoleName()));
+        assertThat(originalReadsCount).isLessThan(getRolesReadCount());
+    }
+
+    @Test
+    public void testInvalidateAllCredentials()
+    {
+        // cache credentials
+        roleANegotiator.getAuthenticatedUser();
+        roleBNegotiator.getAuthenticatedUser();
+        long originalReadsCount = getRolesReadCount();
+
+        // enure credentials are cached
+        assertThat(roleANegotiator.getAuthenticatedUser()).isEqualTo(new AuthenticatedUser(ROLE_A.getRoleName()));
+        assertThat(roleBNegotiator.getAuthenticatedUser()).isEqualTo(new AuthenticatedUser(ROLE_B.getRoleName()));
+        assertThat(originalReadsCount).isEqualTo(getRolesReadCount());
+
+        // invalidate both credentials
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatecredentialscache");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure credential for roleA is reloaded
+        assertThat(roleANegotiator.getAuthenticatedUser()).isEqualTo(new AuthenticatedUser(ROLE_A.getRoleName()));
+        long readsCountAfterFirstReLoad = getRolesReadCount();
+        assertThat(originalReadsCount).isLessThan(readsCountAfterFirstReLoad);
+
+        // ensure credential for roleB is reloaded
+        assertThat(roleBNegotiator.getAuthenticatedUser()).isEqualTo(new AuthenticatedUser(ROLE_B.getRoleName()));
+        long readsCountAfterSecondReLoad = getRolesReadCount();
+        assertThat(readsCountAfterFirstReLoad).isLessThan(readsCountAfterSecondReLoad);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCacheTest.java b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCacheTest.java
new file mode 100644
index 0000000..f44a274
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateJmxPermissionsCacheTest.java
@@ -0,0 +1,183 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.Set;
+import javax.security.auth.Subject;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthCacheService;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.CassandraPrincipal;
+import org.apache.cassandra.auth.IAuthorizer;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.JMXResource;
+import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.auth.jmx.AuthorizationProxy;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.getRolePermissionsReadCount;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class InvalidateJmxPermissionsCacheTest extends CQLTester
+{
+    private static final AuthorizationProxy authorizationProxy = new AuthTestUtils.NoAuthSetupAuthorizationProxy();
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+
+        JMXResource rootJmxResource = JMXResource.root();
+        Set<Permission> jmxPermissions = rootJmxResource.applicablePermissions();
+
+        IAuthorizer authorizer = DatabaseDescriptor.getAuthorizer();
+        authorizer.grant(AuthenticatedUser.SYSTEM_USER, jmxPermissions, rootJmxResource, ROLE_A);
+        authorizer.grant(AuthenticatedUser.SYSTEM_USER, jmxPermissions, rootJmxResource, ROLE_B);
+
+        AuthCacheService.initializeAndRegisterCaches();
+
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "invalidatejmxpermissionscache");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool invalidatejmxpermissionscache - Invalidate the JMX permissions\n" +
+                        "        cache\n" +
+                        "\n" +
+                        "SYNOPSIS\n" +
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)] invalidatejmxpermissionscache\n" +
+                        "                [--] [<role>...]\n" +
+                        "\n" +
+                        "OPTIONS\n" +
+                        "        -h <host>, --host <host>\n" +
+                        "            Node hostname or ip address\n" +
+                        "\n" +
+                        "        -p <port>, --port <port>\n" +
+                        "            Remote jmx agent port number\n" +
+                        "\n" +
+                        "        -pp, --print-port\n" +
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                        "\n" +
+                        "        -pw <password>, --password <password>\n" +
+                        "            Remote jmx agent password\n" +
+                        "\n" +
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                        "            Path to the JMX password file\n" +
+                        "\n" +
+                        "        -u <username>, --username <username>\n" +
+                        "            Remote jmx agent username\n" +
+                        "\n" +
+                        "        --\n" +
+                        "            This option can be used to separate command-line options from the\n" +
+                        "            list of argument, (useful when arguments might be mistaken for\n" +
+                        "            command-line options\n" +
+                        "\n" +
+                        "        [<role>...]\n" +
+                        "            List of roles to invalidate. By default, all roles\n" +
+                        "\n" +
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testInvalidateSingleJMXPermission()
+    {
+        Subject userSubject = subject(ROLE_A.getRoleName());
+
+        // cache role permission
+        authorizationProxy.authorize(userSubject, "queryNames", null);
+        long originalReadsCount = getRolePermissionsReadCount();
+
+        // enure role permission is cached
+        assertThat(authorizationProxy.authorize(userSubject, "queryNames", null)).isTrue();
+        assertThat(originalReadsCount).isEqualTo(getRolePermissionsReadCount());
+
+        // invalidate role permission
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatejmxpermissionscache", ROLE_A.getRoleName());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure role permission is reloaded
+        assertThat(authorizationProxy.authorize(userSubject, "queryNames", null)).isTrue();
+        assertThat(originalReadsCount).isLessThan(getRolePermissionsReadCount());
+    }
+
+    @Test
+    public void testInvalidateAllJMXPermissions()
+    {
+        Subject roleASubject = subject(ROLE_A.getRoleName());
+        Subject roleBSubject = subject(ROLE_B.getRoleName());
+
+        // cache role permissions
+        authorizationProxy.authorize(roleASubject, "queryNames", null);
+        authorizationProxy.authorize(roleBSubject, "queryNames", null);
+        long originalReadsCount = getRolePermissionsReadCount();
+
+        // enure role permissions are cached
+        assertThat(authorizationProxy.authorize(roleASubject, "queryNames", null)).isTrue();
+        assertThat(authorizationProxy.authorize(roleBSubject, "queryNames", null)).isTrue();
+        assertThat(originalReadsCount).isEqualTo(getRolePermissionsReadCount());
+
+        // invalidate both role permissions
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatejmxpermissionscache");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure role permission for roleA is reloaded
+        assertThat(authorizationProxy.authorize(roleASubject, "queryNames", null)).isTrue();
+        long readsCountAfterFirstReLoad = getRolePermissionsReadCount();
+        assertThat(originalReadsCount).isLessThan(readsCountAfterFirstReLoad);
+
+        // ensure role permission for roleB is reloaded
+        assertThat(authorizationProxy.authorize(roleBSubject, "queryNames", null)).isTrue();
+        long readsCountAfterSecondReLoad = getRolePermissionsReadCount();
+        assertThat(readsCountAfterFirstReLoad).isLessThan(readsCountAfterSecondReLoad);
+    }
+
+    private static Subject subject(String roleName)
+    {
+        Subject subject = new Subject();
+        subject.getPrincipals().add(new CassandraPrincipal(roleName));
+        return subject;
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCacheTest.java b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCacheTest.java
new file mode 100644
index 0000000..c54e526
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateNetworkPermissionsCacheTest.java
@@ -0,0 +1,157 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthCacheService;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.getNetworkPermissionsReadCount;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class InvalidateNetworkPermissionsCacheTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+        AuthCacheService.initializeAndRegisterCaches();
+
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "invalidatenetworkpermissionscache");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool invalidatenetworkpermissionscache - Invalidate the network\n" +
+                        "        permissions cache\n" +
+                        "\n" +
+                        "SYNOPSIS\n" +
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)]\n" +
+                        "                invalidatenetworkpermissionscache [--] [<role>...]\n" +
+                        "\n" +
+                        "OPTIONS\n" +
+                        "        -h <host>, --host <host>\n" +
+                        "            Node hostname or ip address\n" +
+                        "\n" +
+                        "        -p <port>, --port <port>\n" +
+                        "            Remote jmx agent port number\n" +
+                        "\n" +
+                        "        -pp, --print-port\n" +
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                        "\n" +
+                        "        -pw <password>, --password <password>\n" +
+                        "            Remote jmx agent password\n" +
+                        "\n" +
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                        "            Path to the JMX password file\n" +
+                        "\n" +
+                        "        -u <username>, --username <username>\n" +
+                        "            Remote jmx agent username\n" +
+                        "\n" +
+                        "        --\n" +
+                        "            This option can be used to separate command-line options from the\n" +
+                        "            list of argument, (useful when arguments might be mistaken for\n" +
+                        "            command-line options\n" +
+                        "\n" +
+                        "        [<role>...]\n" +
+                        "            List of roles to invalidate. By default, all roles\n" +
+                        "\n" +
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testInvalidateSingleNetworkPermission()
+    {
+        AuthenticatedUser role = new AuthenticatedUser(ROLE_A.getRoleName());
+
+        // cache network permission
+        role.hasLocalAccess();
+        long originalReadsCount = getNetworkPermissionsReadCount();
+
+        // enure network permission is cached
+        assertThat(role.hasLocalAccess()).isTrue();
+        assertThat(originalReadsCount).isEqualTo(getNetworkPermissionsReadCount());
+
+        // invalidate network permission
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatenetworkpermissionscache", ROLE_A.getRoleName());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure network permission is reloaded
+        assertThat(role.hasLocalAccess()).isTrue();
+        assertThat(originalReadsCount).isLessThan(getNetworkPermissionsReadCount());
+    }
+
+    @Test
+    public void testInvalidateAllNetworkPermissions()
+    {
+        AuthenticatedUser roleA = new AuthenticatedUser(ROLE_A.getRoleName());
+        AuthenticatedUser roleB = new AuthenticatedUser(ROLE_B.getRoleName());
+
+        // cache network permissions
+        roleA.hasLocalAccess();
+        roleB.hasLocalAccess();
+        long originalReadsCount = getNetworkPermissionsReadCount();
+
+        // enure network permissions are cached
+        assertThat(roleA.hasLocalAccess()).isTrue();
+        assertThat(roleB.hasLocalAccess()).isTrue();
+        assertThat(originalReadsCount).isEqualTo(getNetworkPermissionsReadCount());
+
+        // invalidate both network permissions
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatenetworkpermissionscache");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure network permission for roleA is reloaded
+        assertThat(roleA.hasLocalAccess()).isTrue();
+        long readsCountAfterFirstReLoad = getNetworkPermissionsReadCount();
+        assertThat(originalReadsCount).isLessThan(readsCountAfterFirstReLoad);
+
+        // ensure network permission for roleB is reloaded
+        assertThat(roleB.hasLocalAccess()).isTrue();
+        long readsCountAfterSecondReLoad = getNetworkPermissionsReadCount();
+        assertThat(readsCountAfterFirstReLoad).isLessThan(readsCountAfterSecondReLoad);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCacheTest.java b/test/unit/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCacheTest.java
new file mode 100644
index 0000000..e6d2ba1
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/InvalidatePermissionsCacheTest.java
@@ -0,0 +1,332 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthCacheService;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.DataResource;
+import org.apache.cassandra.auth.FunctionResource;
+import org.apache.cassandra.auth.IAuthorizer;
+import org.apache.cassandra.auth.IResource;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.auth.JMXResource;
+import org.apache.cassandra.auth.Permission;
+import org.apache.cassandra.auth.RoleResource;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.db.marshal.Int32Type;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.getRolePermissionsReadCount;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class InvalidatePermissionsCacheTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+        AuthCacheService.initializeAndRegisterCaches();
+
+        List<IResource> resources = Arrays.asList(
+                DataResource.root(),
+                DataResource.keyspace(KEYSPACE),
+                DataResource.allTables(KEYSPACE),
+                DataResource.table(KEYSPACE, "t1"),
+                RoleResource.root(),
+                RoleResource.role("role_x"),
+                FunctionResource.root(),
+                FunctionResource.keyspace(KEYSPACE),
+                // Particular function is excluded from here and covered by a separate test because in order to grant
+                // permissions we need to have a function registered. However, the function cannot be registered via
+                // CQLTester.createFunction from static contex. That's why we initialize it in a separate test case.
+                JMXResource.root(),
+                JMXResource.mbean("org.apache.cassandra.auth:type=*"));
+
+        IAuthorizer authorizer = DatabaseDescriptor.getAuthorizer();
+        for (IResource resource : resources)
+        {
+            Set<Permission> permissions = resource.applicablePermissions();
+            authorizer.grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_A);
+            authorizer.grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_B);
+        }
+
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "invalidatepermissionscache");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool invalidatepermissionscache - Invalidate the permissions cache\n" +
+                        "\n" +
+                        "SYNOPSIS\n" +
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)] invalidatepermissionscache\n" +
+                        "                [--all-functions] [--all-keyspaces] [--all-mbeans] [--all-roles]\n" +
+                        "                [--all-tables] [--function <function>]\n" +
+                        "                [--functions-in-keyspace <functions-in-keyspace>]\n" +
+                        "                [--keyspace <keyspace>] [--mbean <mbean>] [--role <role>]\n" +
+                        "                [--table <table>] [--] [<role>]\n" +
+                        "\n" +
+                        "OPTIONS\n" +
+                        "        --all-functions\n" +
+                        "            Invalidate permissions for 'ALL FUNCTIONS'\n" +
+                        "\n" +
+                        "        --all-keyspaces\n" +
+                        "            Invalidate permissions for 'ALL KEYSPACES'\n" +
+                        "\n" +
+                        "        --all-mbeans\n" +
+                        "            Invalidate permissions for 'ALL MBEANS'\n" +
+                        "\n" +
+                        "        --all-roles\n" +
+                        "            Invalidate permissions for 'ALL ROLES'\n" +
+                        "\n" +
+                        "        --all-tables\n" +
+                        "            Invalidate permissions for 'ALL TABLES'\n" +
+                        "\n" +
+                        "        --function <function>\n" +
+                        "            Function to invalidate permissions for (you must specify\n" +
+                        "            --functions-in-keyspace for using this option; function format:\n" +
+                        "            name[arg1^..^agrN], for example: foo[Int32Type^DoubleType])\n" +
+                        "\n" +
+                        "        --functions-in-keyspace <functions-in-keyspace>\n" +
+                        "            Keyspace to invalidate permissions for\n" +
+                        "\n" +
+                        "        -h <host>, --host <host>\n" +
+                        "            Node hostname or ip address\n" +
+                        "\n" +
+                        "        --keyspace <keyspace>\n" +
+                        "            Keyspace to invalidate permissions for\n" +
+                        "\n" +
+                        "        --mbean <mbean>\n" +
+                        "            MBean to invalidate permissions for\n" +
+                        "\n" +
+                        "        -p <port>, --port <port>\n" +
+                        "            Remote jmx agent port number\n" +
+                        "\n" +
+                        "        -pp, --print-port\n" +
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                        "\n" +
+                        "        -pw <password>, --password <password>\n" +
+                        "            Remote jmx agent password\n" +
+                        "\n" +
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                        "            Path to the JMX password file\n" +
+                        "\n" +
+                        "        --role <role>\n" +
+                        "            Role to invalidate permissions for\n" +
+                        "\n" +
+                        "        --table <table>\n" +
+                        "            Table to invalidate permissions for (you must specify --keyspace for\n" +
+                        "            using this option)\n" +
+                        "\n" +
+                        "        -u <username>, --username <username>\n" +
+                        "            Remote jmx agent username\n" +
+                        "\n" +
+                        "        --\n" +
+                        "            This option can be used to separate command-line options from the\n" +
+                        "            list of argument, (useful when arguments might be mistaken for\n" +
+                        "            command-line options\n" +
+                        "\n" +
+                        "        [<role>]\n" +
+                        "            A role for which permissions to specified resources need to be\n" +
+                        "            invalidated\n" +
+                        "\n" +
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testInvalidatePermissionsWithIncorrectParameters()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatepermissionscache", "--all-keyspaces");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout())
+                .isEqualTo(wrapByDefaultNodetoolMessage("No resource options allowed without a <role> being specified"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("invalidatepermissionscache", "role1");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout())
+                .isEqualTo(wrapByDefaultNodetoolMessage("No resource options specified"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("invalidatepermissionscache", "role1", "--invalid-option");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout())
+                .isEqualTo(wrapByDefaultNodetoolMessage("A single <role> is only supported / you have a typo in the resource options spelling"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("invalidatepermissionscache", "role1", "--all-tables");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout())
+                .isEqualTo(wrapByDefaultNodetoolMessage("--all-tables option should be passed along with --keyspace option"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("invalidatepermissionscache", "role1", "--table", "t1");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout())
+                .isEqualTo(wrapByDefaultNodetoolMessage("--table option should be passed along with --keyspace option"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("invalidatepermissionscache", "role1", "--function", "f[Int32Type]");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout())
+                .isEqualTo(wrapByDefaultNodetoolMessage("--function option should be passed along with --functions-in-keyspace option"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("invalidatepermissionscache", "role1", "--functions-in-keyspace",
+                KEYSPACE, "--function", "f[x]");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout())
+                .isEqualTo(wrapByDefaultNodetoolMessage("An error was encountered when looking up function definition: Unable to find abstract-type class 'org.apache.cassandra.db.marshal.x'"));
+        assertThat(tool.getStderr()).isEmpty();
+    }
+
+    @Test
+    public void testInvalidatePermissionsForEveryResourceExceptFunction()
+    {
+        assertInvalidation(DataResource.root(), Collections.singletonList("--all-keyspaces"));
+        assertInvalidation(DataResource.keyspace(KEYSPACE), Arrays.asList("--keyspace", KEYSPACE));
+        assertInvalidation(DataResource.allTables(KEYSPACE), Arrays.asList("--keyspace", KEYSPACE, "--all-tables"));
+        assertInvalidation(DataResource.table(KEYSPACE, "t1"),
+                Arrays.asList("--keyspace", KEYSPACE, "--table", "t1"));
+        assertInvalidation(RoleResource.root(), Collections.singletonList("--all-roles"));
+        assertInvalidation(RoleResource.role("role_x"), Arrays.asList("--role", "role_x"));
+        assertInvalidation(FunctionResource.root(), Collections.singletonList("--all-functions"));
+        assertInvalidation(FunctionResource.keyspace(KEYSPACE), Arrays.asList("--functions-in-keyspace", KEYSPACE));
+        assertInvalidation(JMXResource.root(), Collections.singletonList("--all-mbeans"));
+        assertInvalidation(JMXResource.mbean("org.apache.cassandra.auth:type=*"),
+                Arrays.asList("--mbean", "org.apache.cassandra.auth:type=*"));
+    }
+
+    @Test
+    public void testInvalidatePermissionsForFunction() throws Throwable
+    {
+        String keyspaceAndFunctionName = createFunction(KEYSPACE, "int",
+                " CREATE FUNCTION %s (val int)" +
+                        " CALLED ON NULL INPUT" +
+                        " RETURNS int" +
+                        " LANGUAGE java" +
+                        " AS 'return val;'");
+        String functionName = StringUtils.split(keyspaceAndFunctionName, ".")[1];
+
+        FunctionResource resource = FunctionResource.function(KEYSPACE, functionName, Collections.singletonList(Int32Type.instance));
+        Set<Permission> permissions = resource.applicablePermissions();
+        DatabaseDescriptor.getAuthorizer().grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_A);
+        DatabaseDescriptor.getAuthorizer().grant(AuthenticatedUser.SYSTEM_USER, permissions, resource, ROLE_B);
+
+        assertInvalidation(resource,
+                Arrays.asList("--functions-in-keyspace", KEYSPACE, "--function", functionName + "[Int32Type]"));
+    }
+
+    private void assertInvalidation(IResource resource, List<String> options)
+    {
+        Set<Permission> dataPermissions = resource.applicablePermissions();
+
+        AuthenticatedUser role = new AuthenticatedUser(ROLE_A.getRoleName());
+
+        // cache permission
+        role.getPermissions(resource);
+        long originalReadsCount = getRolePermissionsReadCount();
+
+        // enure permission is cached
+        assertThat(role.getPermissions(resource)).isEqualTo(dataPermissions);
+        assertThat(originalReadsCount).isEqualTo(getRolePermissionsReadCount());
+
+        // invalidate permission
+        List<String> args = new ArrayList<>();
+        args.add("invalidatepermissionscache");
+        args.add(ROLE_A.getRoleName());
+        args.addAll(options);
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(args);
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure permission is reloaded
+        assertThat(role.getPermissions(resource)).isEqualTo(dataPermissions);
+        assertThat(originalReadsCount).isLessThan(getRolePermissionsReadCount());
+    }
+
+    @Test
+    public void testInvalidatePermissionsForAllRoles()
+    {
+        DataResource rootDataResource = DataResource.root();
+        Set<Permission> dataPermissions = rootDataResource.applicablePermissions();
+
+        AuthenticatedUser roleA = new AuthenticatedUser(ROLE_A.getRoleName());
+        AuthenticatedUser roleB = new AuthenticatedUser(ROLE_B.getRoleName());
+
+        // cache permissions
+        roleA.getPermissions(rootDataResource);
+        roleB.getPermissions(rootDataResource);
+        long originalReadsCount = getRolePermissionsReadCount();
+
+        // enure permissions are cached
+        assertThat(roleA.getPermissions(rootDataResource)).isEqualTo(dataPermissions);
+        assertThat(roleB.getPermissions(rootDataResource)).isEqualTo(dataPermissions);
+        assertThat(originalReadsCount).isEqualTo(getRolePermissionsReadCount());
+
+        // invalidate both permissions
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidatepermissionscache");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure permission for roleA is reloaded
+        assertThat(roleA.getPermissions(rootDataResource)).isEqualTo(dataPermissions);
+        long readsCountAfterFirstReLoad = getRolePermissionsReadCount();
+        assertThat(originalReadsCount).isLessThan(readsCountAfterFirstReLoad);
+
+        // ensure permission for roleB is reloaded
+        assertThat(roleB.getPermissions(rootDataResource)).isEqualTo(dataPermissions);
+        long readsCountAfterSecondReLoad = getRolePermissionsReadCount();
+        assertThat(readsCountAfterFirstReLoad).isLessThan(readsCountAfterSecondReLoad);
+    }
+
+    private String wrapByDefaultNodetoolMessage(String s)
+    {
+        return "nodetool: " + s + "\nSee 'nodetool help' or 'nodetool help <command>'.\n";
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/InvalidateRolesCacheTest.java b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateRolesCacheTest.java
new file mode 100644
index 0000000..bb8fb92
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/InvalidateRolesCacheTest.java
@@ -0,0 +1,156 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthCacheService;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.IRoleManager;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.apache.cassandra.auth.AuthTestUtils.getRolesReadCount;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class InvalidateRolesCacheTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+
+        IRoleManager roleManager = DatabaseDescriptor.getRoleManager();
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+        AuthCacheService.initializeAndRegisterCaches();
+
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "invalidaterolescache");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool invalidaterolescache - Invalidate the roles cache\n" +
+                        "\n" +
+                        "SYNOPSIS\n" +
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)] invalidaterolescache [--]\n" +
+                        "                [<role>...]\n" +
+                        "\n" +
+                        "OPTIONS\n" +
+                        "        -h <host>, --host <host>\n" +
+                        "            Node hostname or ip address\n" +
+                        "\n" +
+                        "        -p <port>, --port <port>\n" +
+                        "            Remote jmx agent port number\n" +
+                        "\n" +
+                        "        -pp, --print-port\n" +
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                        "\n" +
+                        "        -pw <password>, --password <password>\n" +
+                        "            Remote jmx agent password\n" +
+                        "\n" +
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                        "            Path to the JMX password file\n" +
+                        "\n" +
+                        "        -u <username>, --username <username>\n" +
+                        "            Remote jmx agent username\n" +
+                        "\n" +
+                        "        --\n" +
+                        "            This option can be used to separate command-line options from the\n" +
+                        "            list of argument, (useful when arguments might be mistaken for\n" +
+                        "            command-line options\n" +
+                        "\n" +
+                        "        [<role>...]\n" +
+                        "            List of roles to invalidate. By default, all roles\n" +
+                        "\n" +
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testInvalidateSingleRole()
+    {
+        AuthenticatedUser role = new AuthenticatedUser(ROLE_A.getRoleName());
+
+        // cache role
+        role.canLogin();
+        long originalReadsCount = getRolesReadCount();
+
+        // enure role is cached
+        assertThat(role.canLogin()).isTrue();
+        assertThat(originalReadsCount).isEqualTo(getRolesReadCount());
+
+        // invalidate role
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidaterolescache", ROLE_A.getRoleName());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure role is reloaded
+        assertThat(role.canLogin()).isTrue();
+        assertThat(originalReadsCount).isLessThan(getRolesReadCount());
+    }
+
+    @Test
+    public void testInvalidateAllRoles()
+    {
+        AuthenticatedUser roleA = new AuthenticatedUser(ROLE_A.getRoleName());
+        AuthenticatedUser roleB = new AuthenticatedUser(ROLE_B.getRoleName());
+
+        // cache roles
+        roleA.canLogin();
+        roleB.canLogin();
+        long originalReadsCount = getRolesReadCount();
+
+        // enure roles are cached
+        assertThat(roleA.canLogin()).isTrue();
+        assertThat(roleB.canLogin()).isTrue();
+        assertThat(originalReadsCount).isEqualTo(getRolesReadCount());
+
+        // invalidate both roles
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("invalidaterolescache");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        // ensure role for roleA is reloaded
+        assertThat(roleA.canLogin()).isTrue();
+        long readsCountAfterFirstReLoad = getRolesReadCount();
+        assertThat(originalReadsCount).isLessThan(readsCountAfterFirstReLoad);
+
+        // ensure role for roleB is reloaded
+        assertThat(roleB.canLogin()).isTrue();
+        long readsCountAfterSecondReLoad = getRolesReadCount();
+        assertThat(readsCountAfterFirstReLoad).isLessThan(readsCountAfterSecondReLoad);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/NetStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/NetStatsTest.java
new file mode 100644
index 0000000..f8bd530
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/NetStatsTest.java
@@ -0,0 +1,153 @@
+/*
+ * 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.tools.nodetool;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.nio.charset.StandardCharsets;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+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.schema.TableId;
+import org.apache.cassandra.streaming.SessionInfo;
+import org.apache.cassandra.streaming.StreamSession.State;
+import org.apache.cassandra.streaming.StreamSummary;
+import org.apache.cassandra.tools.ToolRunner;
+import org.apache.cassandra.utils.FBUtilities;
+
+import static org.apache.cassandra.net.Verb.ECHO_REQ;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class NetStatsTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "netstats");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool netstats - Print network information on provided host\n" + 
+                        "        (connecting node by default)\n" + 
+                        "\n" + 
+                        "SYNOPSIS\n" + 
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" + 
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" + 
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" + 
+                        "                [(-u <username> | --username <username>)] netstats\n" + 
+                        "                [(-H | --human-readable)]\n" + 
+                        "\n" + 
+                        "OPTIONS\n" + 
+                        "        -h <host>, --host <host>\n" + 
+                        "            Node hostname or ip address\n" + 
+                        "\n" + 
+                        "        -H, --human-readable\n" + 
+                        "            Display bytes in human readable form, i.e. KiB, MiB, GiB, TiB\n" + 
+                        "\n" + 
+                        "        -p <port>, --port <port>\n" + 
+                        "            Remote jmx agent port number\n" + 
+                        "\n" + 
+                        "        -pp, --print-port\n" + 
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" + 
+                        "\n" + 
+                        "        -pw <password>, --password <password>\n" + 
+                        "            Remote jmx agent password\n" + 
+                        "\n" + 
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + 
+                        "            Path to the JMX password file\n" + 
+                        "\n" + 
+                        "        -u <username>, --username <username>\n" + 
+                        "            Remote jmx agent username\n" + 
+                        "\n" + 
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testNetStats()
+    {
+        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, NoPayload.noPayload);
+        MessagingService.instance().send(echoMessageOut, FBUtilities.getBroadcastAddressAndPort());
+
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("netstats");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Gossip messages                 n/a         0              2         0");
+    }
+
+    @Test
+    public void testHumanReadable() throws IOException
+    {
+        List<StreamSummary> streamSummaries = Collections.singletonList(new StreamSummary(TableId.generate(), 1, 1024));
+        SessionInfo info = new SessionInfo(InetAddressAndPort.getLocalHost(),
+                                           1,
+                                           InetAddressAndPort.getLocalHost(),
+                                           streamSummaries,
+                                           streamSummaries,
+                                           State.COMPLETE);
+
+        try (ByteArrayOutputStream baos = new ByteArrayOutputStream(); PrintStream out = new PrintStream(baos))
+        {
+            NetStats nstats = new NetStats();
+
+            nstats.printReceivingSummaries(out, info, false);
+            String stdout = getSummariesStdout(baos, out);
+            assertThat(stdout).doesNotContain("Kib");
+
+            baos.reset();
+            nstats.printSendingSummaries(out, info, false);
+            stdout = getSummariesStdout(baos, out);
+            assertThat(stdout).doesNotContain("Kib");
+
+            baos.reset();
+            nstats.printReceivingSummaries(out, info, true);
+            stdout = getSummariesStdout(baos, out);
+            assertThat(stdout).contains("KiB");
+
+            baos.reset();
+            nstats.printSendingSummaries(out, info, true);
+            stdout = getSummariesStdout(baos, out);
+            assertThat(stdout).contains("KiB");
+        }
+    }
+
+    private String getSummariesStdout(ByteArrayOutputStream baos, PrintStream ps) throws IOException
+    {
+        baos.flush();
+        ps.flush();
+        return baos.toString(StandardCharsets.UTF_8.toString());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java b/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java
index bc83f50..00c8bba 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/RingTest.java
@@ -28,13 +28,8 @@
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.utils.FBUtilities;
-import org.assertj.core.api.Assertions;
 
-import static org.hamcrest.CoreMatchers.*;
-import static org.hamcrest.Matchers.matchesPattern;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class RingTest extends CQLTester
 {
@@ -43,9 +38,9 @@
     @BeforeClass
     public static void setup() throws Exception
     {
-        StorageService.instance.initServer();
-        token = StorageService.instance.getTokens().get(0);
+        requireNetwork();
         startJMXServer();
+        token = StorageService.instance.getTokens().get(0);
     }
 
     /**
@@ -56,27 +51,21 @@
     {
         final HostStatWithPort host = new HostStatWithPort(null, FBUtilities.getBroadcastAddressAndPort(),
                                                            false, null);
-        validateRingOutput(host.ipOrDns(false),
-                            "ring");
-        Arrays.asList("-pp", "--print-port").forEach(arg -> {
-            validateRingOutput(host.ipOrDns(true),
-                               "-pp", "ring");
-        });
+        validateRingOutput(host.ipOrDns(false), "ring");
+        Arrays.asList("-pp", "--print-port").forEach(arg -> validateRingOutput(host.ipOrDns(true), "-pp", "ring"));
 
         final HostStatWithPort hostResolved = new HostStatWithPort(null, FBUtilities.getBroadcastAddressAndPort(),
                                                                    true, null);
-        Arrays.asList("-r", "--resolve-ip").forEach(arg -> {
-            validateRingOutput(hostResolved.ipOrDns(false),
-                               "ring", "-r");
-        });
-        validateRingOutput(hostResolved.ipOrDns(true),
-                            "-pp", "ring", "-r");
+        Arrays.asList("-r", "--resolve-ip").forEach(arg ->
+                validateRingOutput(hostResolved.ipOrDns(false), "ring", "-r"));
+        validateRingOutput(hostResolved.ipOrDns(true), "-pp", "ring", "-r");
     }
 
+    @SuppressWarnings("DynamicRegexReplaceableByCompiledPattern")
     private void validateRingOutput(String hostForm, String... args)
     {
-        ToolRunner.ToolResult nodetool = ToolRunner.invokeNodetool(args);
-        nodetool.assertOnCleanExit();
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(args);
+        tool.assertOnCleanExit();
         /*
          Datacenter: datacenter1
          ==========
@@ -85,35 +74,37 @@
          127.0.0.1       rack1       Up     Normal  45.71 KiB       100.00%             4652409154190094022
 
          */
-        String[] lines = nodetool.getStdout().split("\\R");
-        assertThat(lines[1].trim(), endsWith(SimpleSnitch.DATA_CENTER_NAME));
-        assertThat(lines[3], matchesPattern("Address *Rack *Status *State *Load *Owns *Token *"));
+        String[] lines = tool.getStdout().split("\\R");
+        assertThat(lines[1].trim()).endsWith(SimpleSnitch.DATA_CENTER_NAME);
+        assertThat(lines[3]).containsPattern("Address *Rack *Status *State *Load *Owns *Token *");
         String hostRing = lines[lines.length-4].trim(); // this command has a couple extra newlines and an empty error message at the end. Not messing with it.
-        assertThat(hostRing, startsWith(hostForm));
-        assertThat(hostRing, containsString(SimpleSnitch.RACK_NAME));
-        assertThat(hostRing, containsString("Up"));
-        assertThat(hostRing, containsString("Normal"));
-        assertThat(hostRing, matchesPattern(".*\\d+\\.\\d+ KiB.*"));
-        assertThat(hostRing, matchesPattern(".*\\d+\\.\\d+%.*"));
-        assertThat(hostRing, endsWith(token));
-        assertThat(hostRing, not(containsString("?")));
+        assertThat(hostRing).startsWith(hostForm);
+        assertThat(hostRing).contains(SimpleSnitch.RACK_NAME);
+        assertThat(hostRing).contains("Up");
+        assertThat(hostRing).contains("Normal");
+        assertThat(hostRing).containsPattern("\\d+\\.?\\d+ KiB");
+        assertThat(hostRing).containsPattern("\\d+\\.\\d+%");
+        assertThat(hostRing).endsWith(token);
+        assertThat(hostRing).doesNotContain("?");
     }
 
     @Test
     public void testWrongArgFailsAndPrintsHelp()
     {
         ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("--wrongarg", "ring");
-        Assertions.assertThat(tool.getStdout()).containsIgnoringCase("nodetool help");
-        assertEquals(1, tool.getExitCode());
-        assertTrue(tool.getCleanedStderr().isEmpty());
+        tool.assertCleanStdErr();
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("nodetool help");
     }
 
     @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
     public void testMaybeChangeDocs()
     {
         // If you added, modified options or help, please update docs if necessary
 
         ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "ring");
+        tool.assertOnCleanExit();
 
         String help = "NAME\n" + "        nodetool ring - Print information about the token ring\n"
                       + "\n"
@@ -156,7 +147,7 @@
                       + "            awareness)\n"
                       + "\n"
                       + "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
+        assertThat(tool.getStdout()).isEqualTo(help);
     }
 
     @Test
@@ -164,14 +155,12 @@
     {
         // Bad KS
         ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("ring", "mockks");
-        Assertions.assertThat(tool.getStdout()).contains("The keyspace mockks, does not exist");
-        assertEquals(0, tool.getExitCode());
-        assertTrue(tool.getCleanedStderr().isEmpty());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("The keyspace mockks, does not exist");
 
         // Good KS
         tool = ToolRunner.invokeNodetool("ring", "system_schema");
-        Assertions.assertThat(tool.getStdout()).contains("Datacenter: datacenter1");
-        assertEquals(0, tool.getExitCode());
-        assertTrue(tool.getCleanedStderr().isEmpty());
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Datacenter: datacenter1");
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetAuthCacheConfigTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetAuthCacheConfigTest.java
new file mode 100644
index 0000000..2c90486
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetAuthCacheConfigTest.java
@@ -0,0 +1,224 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.auth.AuthCache;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.auth.NetworkPermissionsCacheMBean;
+import org.apache.cassandra.auth.PasswordAuthenticator;
+import org.apache.cassandra.auth.PermissionsCacheMBean;
+import org.apache.cassandra.auth.Roles;
+import org.apache.cassandra.auth.RolesCacheMBean;
+import org.apache.cassandra.auth.jmx.AuthorizationProxy;
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class SetAuthCacheConfigTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        CQLTester.setUpClass();
+        CQLTester.requireAuthentication();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "setauthcacheconfig");
+        tool.assertOnCleanExit();
+
+        String help = "NAME\n" +
+                      "        nodetool setauthcacheconfig - Set configuration for Auth cache\n" +
+                      "\n" +
+                      "SYNOPSIS\n" +
+                      "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                      "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                      "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                      "                [(-u <username> | --username <username>)] setauthcacheconfig\n" +
+                      "                --cache-name <cache-name> [--disable-active-update]\n" +
+                      "                [--enable-active-update] [--max-entries <max-entries>]\n" +
+                      "                [--update-interval <update-interval>]\n" +
+                      "                [--validity-period <validity-period>]\n" +
+                      "\n" +
+                      "OPTIONS\n" +
+                      "        --cache-name <cache-name>\n" +
+                      "            Name of Auth cache (required)\n" +
+                      "\n" +
+                      "        --disable-active-update\n" +
+                      "            Disable active update\n" +
+                      "\n" +
+                      "        --enable-active-update\n" +
+                      "            Enable active update\n" +
+                      "\n" +
+                      "        -h <host>, --host <host>\n" +
+                      "            Node hostname or ip address\n" +
+                      "\n" +
+                      "        --max-entries <max-entries>\n" +
+                      "            Max entries\n" +
+                      "\n" +
+                      "        -p <port>, --port <port>\n" +
+                      "            Remote jmx agent port number\n" +
+                      "\n" +
+                      "        -pp, --print-port\n" +
+                      "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                      "\n" +
+                      "        -pw <password>, --password <password>\n" +
+                      "            Remote jmx agent password\n" +
+                      "\n" +
+                      "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                      "            Path to the JMX password file\n" +
+                      "\n" +
+                      "        -u <username>, --username <username>\n" +
+                      "            Remote jmx agent username\n" +
+                      "\n" +
+                      "        --update-interval <update-interval>\n" +
+                      "            Update interval in milliseconds\n" +
+                      "\n" +
+                      "        --validity-period <validity-period>\n" +
+                      "            Validity period in milliseconds\n" +
+                      "\n" +
+                      "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testInvalidCacheName()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("setauthcacheconfig");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("Required option '--cache-name' is missing"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("setauthcacheconfig", "--cache-name");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("Required values for option 'cache-name' not provided"));
+        assertThat(tool.getStderr()).isEmpty();
+
+        tool = ToolRunner.invokeNodetool("setauthcacheconfig", "--cache-name", "wrong", "--validity-period", "1");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("Unknown cache name: wrong"));
+        assertThat(tool.getStderr()).isEmpty();
+    }
+
+    @Test
+    public void testNoOptionalParameters()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("setauthcacheconfig", "--cache-name", "PermissionCache");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("At least one optional parameter need to be passed"));
+        assertThat(tool.getStderr()).isEmpty();
+    }
+
+    @Test
+    public void testBothEnableAndDisableActiveUpdate()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("setauthcacheconfig",
+                                                               "--cache-name", "PermissionCache",
+                                                               "--enable-active-update",
+                                                               "--disable-active-update");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).isEqualTo(wrapByDefaultNodetoolMessage("enable-active-update and disable-active-update cannot be used together"));
+        assertThat(tool.getStderr()).isEmpty();
+    }
+
+    @Test
+    public void testSetConfig()
+    {
+        assertSetConfig(AuthenticatedUser.permissionsCache, PermissionsCacheMBean.CACHE_NAME);
+
+        PasswordAuthenticator passwordAuthenticator = (PasswordAuthenticator) DatabaseDescriptor.getAuthenticator();
+        assertSetConfig(passwordAuthenticator.getCredentialsCache(), PasswordAuthenticator.CredentialsCacheMBean.CACHE_NAME);
+
+        assertSetConfig(AuthorizationProxy.jmxPermissionsCache, AuthorizationProxy.JmxPermissionsCacheMBean.CACHE_NAME);
+
+        assertSetConfig(AuthenticatedUser.networkPermissionsCache, NetworkPermissionsCacheMBean.CACHE_NAME);
+
+        assertSetConfig(Roles.cache, RolesCacheMBean.CACHE_NAME);
+    }
+
+    @Test
+    public void testSetConfigDisabled()
+    {
+        assertSetConfigDisabled(AuthenticatedUser.permissionsCache, PermissionsCacheMBean.CACHE_NAME);
+
+        PasswordAuthenticator passwordAuthenticator = (PasswordAuthenticator) DatabaseDescriptor.getAuthenticator();
+        assertSetConfigDisabled(passwordAuthenticator.getCredentialsCache(), PasswordAuthenticator.CredentialsCacheMBean.CACHE_NAME);
+
+        assertSetConfigDisabled(AuthorizationProxy.jmxPermissionsCache, AuthorizationProxy.JmxPermissionsCacheMBean.CACHE_NAME);
+
+        assertSetConfigDisabled(AuthenticatedUser.networkPermissionsCache, NetworkPermissionsCacheMBean.CACHE_NAME);
+
+        assertSetConfigDisabled(Roles.cache, RolesCacheMBean.CACHE_NAME);
+    }
+
+    private void assertSetConfig(AuthCache<?, ?> authCache, String cacheName)
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("setauthcacheconfig",
+                                                               "--cache-name", cacheName,
+                                                               "--validity-period", "1",
+                                                               "--update-interval", "2",
+                                                               "--max-entries", "3",
+                                                               "--disable-active-update");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEqualTo("Changed Validity Period to 1\n" +
+                                               "Changed Update Interval to 2\n" +
+                                               "Changed Max Entries to 3\n" +
+                                               "Changed Active Update to false\n");
+
+        assertThat(authCache.getValidity()).isEqualTo(1);
+        assertThat(authCache.getUpdateInterval()).isEqualTo(2);
+        assertThat(authCache.getMaxEntries()).isEqualTo(3);
+        assertThat(authCache.getActiveUpdate()).isFalse();
+    }
+
+    private void assertSetConfigDisabled(AuthCache<?, ?> authCache, String cacheName)
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("setauthcacheconfig",
+                                                               "--cache-name", cacheName,
+                                                               "--validity-period", "1",
+                                                               "--update-interval", "-1",
+                                                               "--max-entries", "3",
+                                                               "--disable-active-update");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEqualTo("Changed Validity Period to 1\n" +
+                                               "Changed Update Interval to -1\n" +
+                                               "Changed Max Entries to 3\n" +
+                                               "Changed Active Update to false\n");
+        // -1 means disabled and means update_interval will be assigned the value of validity_period
+        assertThat(authCache.getValidity()).isEqualTo(1);
+        assertThat(authCache.getUpdateInterval()).isEqualTo(1);
+        assertThat(authCache.getMaxEntries()).isEqualTo(3);
+        assertThat(authCache.getActiveUpdate()).isFalse();
+    }
+
+    private String wrapByDefaultNodetoolMessage(String s)
+    {
+        return "nodetool: " + s + "\nSee 'nodetool help' or 'nodetool help <command>'.\n";
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetDefaultKeyspaceRFTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetDefaultKeyspaceRFTest.java
new file mode 100644
index 0000000..92250a3
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetDefaultKeyspaceRFTest.java
@@ -0,0 +1,94 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class SetDefaultKeyspaceRFTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "setdefaultrf");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool setdefaultrf - Sets default keyspace replication factor.\n" +
+                        "\n" +
+                        "SYNOPSIS\n" +
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)] setdefaultrf [--] <value>\n" +
+                        "\n" +
+                        "OPTIONS\n" +
+                        "        -h <host>, --host <host>\n" +
+                        "            Node hostname or ip address\n" +
+                        "\n" +
+                        "        -p <port>, --port <port>\n" +
+                        "            Remote jmx agent port number\n" +
+                        "\n" +
+                        "        -pp, --print-port\n" +
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+                        "\n" +
+                        "        -pw <password>, --password <password>\n" +
+                        "            Remote jmx agent password\n" +
+                        "\n" +
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+                        "            Path to the JMX password file\n" +
+                        "\n" +
+                        "        -u <username>, --username <username>\n" +
+                        "            Remote jmx agent username\n" +
+                        "\n" +
+                        "        --\n" +
+                        "            This option can be used to separate command-line options from the\n" +
+                        "            list of argument, (useful when arguments might be mistaken for\n" +
+                        "            command-line options\n" +
+                        "\n" +
+                        "        <value>\n" +
+                        "            Default replication factor\n" +
+                        "\n" +
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testSetDefaultRF()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("setdefaultrf", "2");
+        tool.assertOnCleanExit();
+        assertThat(DatabaseDescriptor.getDefaultKeyspaceRF()).isEqualTo(2);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetGetColumnIndexSizeTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetGetColumnIndexSizeTest.java
new file mode 100644
index 0000000..40f82b0
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetGetColumnIndexSizeTest.java
@@ -0,0 +1,110 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.service.StorageService;
+
+import static org.apache.cassandra.tools.ToolRunner.ToolResult;
+import static org.apache.cassandra.tools.ToolRunner.invokeNodetool;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Tests for {@code nodetool setcolumnindexsize} and {@code nodetool getcolumnindexsize}.
+ */
+public class SetGetColumnIndexSizeTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+    }
+
+    @Test
+    public void testNull()
+    {
+        assertSetInvalidColumnIndexSize(null, "Required parameters are missing: column_index_size", 1);
+    }
+
+    @Test
+    public void testPositive()
+    {
+        assertSetGetValidColumnIndexSize(7);
+    }
+
+    @Test
+    public void testMaxValue()
+    {
+        assertSetGetValidColumnIndexSize(2097151);
+    }
+
+    @Test
+    public void testZero()
+    {
+        assertSetGetValidColumnIndexSize(0);
+    }
+
+    @Test
+    public void testNegative()
+    {
+        assertSetInvalidColumnIndexSize("-7", "Invalid data storage: value must be non-negative", 1);
+    }
+
+    @Test
+    public void testInvalidValue()
+    {
+        assertSetInvalidColumnIndexSize("2097152", "column_index_size must be positive value <= 2147483646B, but was 2147483648B", 2);
+    }
+
+    @Test
+    public void testUnparseable()
+    {
+        assertSetInvalidColumnIndexSize("1.2", "column_index_size: can not convert \"1.2\" to a int", 1);
+        assertSetInvalidColumnIndexSize("value", "column_index_size: can not convert \"value\" to a int", 1);
+    }
+
+    private static void assertSetGetValidColumnIndexSize(int columnIndexSizeInKB)
+    {
+        ToolResult tool = invokeNodetool("setcolumnindexsize", String.valueOf(columnIndexSizeInKB));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughput(columnIndexSizeInKB);
+
+        assertThat(StorageService.instance.getColumnIndexSizeInKiB()).isEqualTo(columnIndexSizeInKB);
+    }
+
+    private static void assertSetInvalidColumnIndexSize(String columnIndexSizeInKB, String expectedErrorMessage, int expectedErrorCode)
+    {
+        ToolResult tool = columnIndexSizeInKB == null ? invokeNodetool("setcolumnindexsize")
+                                             : invokeNodetool("setcolumnindexsize", columnIndexSizeInKB);
+        assertThat(tool.getExitCode()).isEqualTo(expectedErrorCode);
+        assertThat(expectedErrorCode == 1 ? tool.getStdout() : tool.getStderr()).contains(expectedErrorMessage);
+    }
+
+    private static void assertGetThroughput(int expected)
+    {
+        ToolResult tool = invokeNodetool("getcolumnindexsize");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Current value for column_index_size: " + expected + " KiB");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetGetCompactionThroughputTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetGetCompactionThroughputTest.java
new file mode 100644
index 0000000..d15cc0c
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetGetCompactionThroughputTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.tools.ToolRunner.ToolResult;
+import static org.apache.cassandra.tools.ToolRunner.invokeNodetool;
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * Tests for {@code nodetool setcompactionthroughput} and {@code nodetool getcompactionthroughput}.
+ */
+public class SetGetCompactionThroughputTest extends CQLTester
+{
+    private static final int MAX_INT_CONFIG_VALUE_IN_MBIT = Integer.MAX_VALUE - 1;
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+    }
+
+    @Test
+    public void testNull()
+    {
+        assertSetInvalidThroughput(null, "Required parameters are missing: compaction_throughput");
+    }
+
+    @Test
+    public void testPositive()
+    {
+        assertSetGetValidThroughput(7);
+    }
+
+    @Test
+    public void testMaxValue()
+    {
+        assertSetGetValidThroughput(MAX_INT_CONFIG_VALUE_IN_MBIT);
+    }
+
+    @Test
+    public void testUpperBound()
+    {
+        assertSetInvalidThroughputMib(String.valueOf(Integer.MAX_VALUE));
+    }
+
+    @Test
+    public void testZero()
+    {
+        assertSetGetValidThroughput(0);
+    }
+
+    @Test
+    public void testUnparseable()
+    {
+        assertSetInvalidThroughput("1.2", "compaction_throughput: can not convert \"1.2\" to a Integer");
+        assertSetInvalidThroughput("value", "compaction_throughput: can not convert \"value\" to a Integer");
+        assertSetInvalidThroughput();
+        assertPreciseMibFlagNeeded();
+    }
+
+    private static void assertSetGetValidThroughput(int throughput)
+    {
+        ToolResult tool = invokeNodetool("setcompactionthroughput", String.valueOf(throughput));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughput(throughput);
+        assertGetThroughputDouble(throughput);
+    }
+
+    private static void assertSetInvalidThroughput(String throughput, String expectedErrorMessage)
+    {
+        ToolResult tool = throughput == null ? invokeNodetool("setcompactionthroughput")
+                                             : invokeNodetool("setcompactionthroughput", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains(expectedErrorMessage);
+    }
+
+    private static void assertSetInvalidThroughput()
+    {
+        DatabaseDescriptor.setCompactionThroughputBytesPerSec(500);
+        ToolResult tool = invokeNodetool("getstreamthroughput");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getStderr()).contains("Use the -d flag to quiet this error and get the exact throughput in megabits/s");
+    }
+
+    private static void assertSetInvalidThroughputMib(String throughput)
+    {
+        ToolResult tool = invokeNodetool("setcompactionthroughput", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("compaction_throughput: 2147483647 is too large; it should be less than" +
+                                              " 2147483647 in MiB/s");
+    }
+
+    private static void assertPreciseMibFlagNeeded()
+    {
+        DatabaseDescriptor.setCompactionThroughputBytesPerSec(15);
+        ToolResult tool = invokeNodetool("getcompactionthroughput");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getStderr()).contains("Use the -d flag to quiet this error and get the exact throughput in MiB/s");
+    }
+
+    private static void assertGetThroughput(int expected)
+    {
+        ToolResult tool = invokeNodetool("getcompactionthroughput");
+        tool.assertOnCleanExit();
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current compaction throughput: " + expected + " MB/s");
+        else
+            assertThat(tool.getStdout()).contains("Current compaction throughput: 0 MB/s");
+    }
+
+    private static void assertGetThroughputDouble(double expected)
+    {
+        ToolResult tool = invokeNodetool("getcompactionthroughput", "-d");
+        tool.assertOnCleanExit();
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current compaction throughput: " + expected + " MiB/s");
+        else
+            assertThat(tool.getStdout()).contains("Current compaction throughput: 0.0 MiB/s");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableInterDCStreamThroughputTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableInterDCStreamThroughputTest.java
new file mode 100644
index 0000000..4aea013
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableInterDCStreamThroughputTest.java
@@ -0,0 +1,119 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.streaming.StreamManager.StreamRateLimiter;
+import static org.apache.cassandra.tools.ToolRunner.ToolResult;
+import static org.apache.cassandra.tools.ToolRunner.invokeNodetool;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.withPrecision;
+
+/**
+ * Tests for entire SSTable {@code nodetool setinterdcstreamthroughput} and {@code nodetool getinterdcstreamthroughput}.
+ */
+public class SetGetEntireSSTableInterDCStreamThroughputTest extends CQLTester
+{
+    private static final int MAX_INT_CONFIG_VALUE_MIB = Integer.MAX_VALUE - 1;
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+    }
+
+    @Test
+    public void testNull()
+    {
+        assertSetInvalidThroughput(null, "Required parameters are missing: inter_dc_stream_throughput");
+    }
+
+    @Test
+    public void testPositive()
+    {
+        assertSetGetValidThroughput(7, 7 * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+    }
+
+    @Test
+    public void testMaxValue()
+    {
+        assertSetGetValidThroughput(MAX_INT_CONFIG_VALUE_MIB, MAX_INT_CONFIG_VALUE_MIB * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+    }
+
+    @Test
+    public void testUpperBound()
+    {
+        assertSetInvalidEntireSStableInterDCThroughputMib(String.valueOf(Integer.MAX_VALUE));
+    }
+
+    @Test
+    public void testZero()
+    {
+        assertSetGetValidThroughput(0, Double.MAX_VALUE);
+    }
+
+    @Test
+    public void testUnparseable()
+    {
+        assertSetInvalidThroughput("1.2", "inter_dc_stream_throughput: can not convert \"1.2\" to a int");
+        assertSetInvalidThroughput("value", "inter_dc_stream_throughput: can not convert \"value\" to a int");
+    }
+
+    private static void assertSetGetValidThroughput(int throughput, double rateInBytes)
+    {
+        ToolResult tool = invokeNodetool("setinterdcstreamthroughput", "-e", String.valueOf(throughput));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughput(throughput);
+
+        assertThat(StreamRateLimiter.getEntireSSTableInterDCRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.01));
+    }
+
+    private static void assertSetInvalidThroughput(String throughput, String expectedErrorMessage)
+    {
+        ToolResult tool = throughput == null ? invokeNodetool("setinterdcstreamthroughput", "-e")
+                                             : invokeNodetool("setinterdcstreamthroughput", "-e", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains(expectedErrorMessage);
+    }
+
+    private static void assertSetInvalidEntireSStableInterDCThroughputMib(String throughput)
+    {
+        ToolResult tool = invokeNodetool("setinterdcstreamthroughput", "-e", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("entire_sstable_inter_dc_stream_throughput_outbound: 2147483647 is too large;" +
+                                              " it should be less than 2147483647 in MiB/s");
+    }
+
+    private static void assertGetThroughput(double expected)
+    {
+        ToolResult tool = invokeNodetool("getinterdcstreamthroughput", "-e");
+        tool.assertOnCleanExit();
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current entire SSTable inter-datacenter stream throughput: " + expected + " MiB/s");
+        else
+            assertThat(tool.getStdout()).contains("Current entire SSTable inter-datacenter stream throughput: unlimited");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableStreamThroughputTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableStreamThroughputTest.java
new file mode 100644
index 0000000..028f32e
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetGetEntireSSTableStreamThroughputTest.java
@@ -0,0 +1,124 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.cql3.CQLTester;
+
+import static org.apache.cassandra.streaming.StreamManager.StreamRateLimiter;
+import static org.apache.cassandra.tools.ToolRunner.ToolResult;
+import static org.apache.cassandra.tools.ToolRunner.invokeNodetool;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.withPrecision;
+
+/**
+ * Tests for entire SSTable {@code nodetool setstreamthroughput} and {@code nodetool getstreamthroughput}.
+ */
+public class SetGetEntireSSTableStreamThroughputTest extends CQLTester
+{
+    private static final int MAX_INT_CONFIG_VALUE_MIB = Integer.MAX_VALUE - 1;
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        startJMXServer();
+    }
+
+    @Test
+    public void testNull()
+    {
+        assertSetInvalidThroughput(null, "Required parameters are missing: stream_throughput");
+    }
+
+    @Test
+    public void testPositive()
+    {
+        assertSetGetValidThroughput(7, 7 * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+    }
+
+    @Test
+    public void testMaxValue()
+    {
+        assertSetGetValidThroughput(MAX_INT_CONFIG_VALUE_MIB, MAX_INT_CONFIG_VALUE_MIB * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+    }
+
+    @Test
+    public void testUpperBound()
+    {
+        assertSetInvalidEntireSStableThroughputMib(String.valueOf(Integer.MAX_VALUE));
+    }
+
+    @Test
+    public void testZero()
+    {
+        assertSetGetValidThroughput(0, Double.MAX_VALUE);
+    }
+
+    @Test
+    public void testUnparseable()
+    {
+        assertSetInvalidThroughput("1.2", "stream_throughput: can not convert \"1.2\" to a int");
+        assertSetInvalidThroughput("value", "stream_throughput: can not convert \"value\" to a int");
+    }
+
+    private static void assertSetGetValidThroughput(int throughput)
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", "-e", String.valueOf(throughput));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughput(throughput);
+    }
+
+    private static void assertSetGetValidThroughput(int throughput, double rateInBytes)
+    {
+        assertSetGetValidThroughput(throughput);
+
+        assertThat(StreamRateLimiter.getEntireSSTableRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.01));
+    }
+
+    private static void assertSetInvalidEntireSStableThroughputMib(String throughput)
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", "-e", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("entire_sstable_stream_throughput_outbound: 2147483647 is too large; it " +
+                                              "should be less than 2147483647 in MiB/s");
+    }
+
+    private static void assertSetInvalidThroughput(String throughput, String expectedErrorMessage)
+    {
+        ToolResult tool = throughput == null ? invokeNodetool("setstreamthroughput", "-e")
+                                             : invokeNodetool("setstreamthroughput", "-e", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains(expectedErrorMessage);
+    }
+
+    private static void assertGetThroughput(double expected)
+    {
+        ToolResult tool = invokeNodetool("getstreamthroughput", "-e");
+        tool.assertOnCleanExit();
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current entire SSTable stream throughput: " + expected + " MiB/s");
+        else
+            assertThat(tool.getStdout()).contains("Current entire SSTable stream throughput: unlimited");
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java
index 699c27b..0ef6b2c 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetGetInterDCStreamThroughputTest.java
@@ -21,6 +21,7 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.config.DataRateSpec;
 import org.apache.cassandra.cql3.CQLTester;
 
 import static org.apache.cassandra.streaming.StreamManager.StreamRateLimiter;
@@ -34,6 +35,14 @@
  */
 public class SetGetInterDCStreamThroughputTest extends CQLTester
 {
+    private static final int MAX_INT_CONFIG_VALUE_IN_MBIT = Integer.MAX_VALUE - 1;
+    private static final double BYTES_PER_MEGABIT = 125_000;
+    private static final int MAX_INT_CONFIG_VALUE_MIB = (int) (MAX_INT_CONFIG_VALUE_IN_MBIT * BYTES_PER_MEGABIT) / 1024 / 1024;
+    private static final double INTEGER_MAX_VALUE_MEGABITS_IN_BYTES = DataRateSpec.LongBytesPerSecondBound
+                                                                      .megabitsPerSecondInBytesPerSecond(MAX_INT_CONFIG_VALUE_IN_MBIT)
+                                                                      .toBytesPerSecond();
+    private static final double MEBIBYTES_PER_MEGABIT = 0.11920928955078125;
+
     @BeforeClass
     public static void setup() throws Exception
     {
@@ -49,25 +58,43 @@
     @Test
     public void testPositive()
     {
-        assertSetGetValidThroughput(7, 7 * StreamRateLimiter.BYTES_PER_MEGABIT);
+        assertSetGetValidThroughput(7, 7 * BYTES_PER_MEGABIT);
+        assertSetGetValidThroughputMiB(7, 7 * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+        assertSetMbitGetMibValidThroughput(7, 7 * BYTES_PER_MEGABIT);
+    }
+
+    @Test
+    public void testSmallPositive()
+    {
+        // As part of CASSANDRA-15234 we had to do some tweaks with precision. This test has to ensure no regressions
+        // happen, hopefully. Internally data rate parameters values and rate limitter are set in double. Users can set
+        // and get only integers
+        assertSetGetValidThroughput(1, 1 * BYTES_PER_MEGABIT);
+        assertSetGetValidThroughputMiB(1, 1 * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+        assertSetMbitGetMibValidThroughput(1, 1 * BYTES_PER_MEGABIT);
     }
 
     @Test
     public void testMaxValue()
     {
-        assertSetGetValidThroughput(Integer.MAX_VALUE, Integer.MAX_VALUE * StreamRateLimiter.BYTES_PER_MEGABIT);
+        assertSetGetValidThroughput(MAX_INT_CONFIG_VALUE_IN_MBIT, INTEGER_MAX_VALUE_MEGABITS_IN_BYTES);
+        assertSetGetValidThroughputMiB(MAX_INT_CONFIG_VALUE_MIB, MAX_INT_CONFIG_VALUE_MIB * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+        assertSetMbitGetMibValidThroughput(MAX_INT_CONFIG_VALUE_IN_MBIT, INTEGER_MAX_VALUE_MEGABITS_IN_BYTES);
+    }
+
+    @Test
+    public void testUpperBound()
+    {
+        assertSetInvalidThroughputMib(String.valueOf(Integer.MAX_VALUE));
+        assertSetInvalidThroughputMbit(String.valueOf(Integer.MAX_VALUE));
     }
 
     @Test
     public void testZero()
     {
         assertSetGetValidThroughput(0, Double.MAX_VALUE);
-    }
-
-    @Test
-    public void testNegative()
-    {
-        assertSetGetValidThroughput(-7, Double.MAX_VALUE);
+        assertSetGetValidThroughputMiB(0, Double.MAX_VALUE);
+        assertSetMbitGetMibValidThroughput(0, Double.MAX_VALUE);
     }
 
     @Test
@@ -75,6 +102,8 @@
     {
         assertSetInvalidThroughput("1.2", "inter_dc_stream_throughput: can not convert \"1.2\" to a int");
         assertSetInvalidThroughput("value", "inter_dc_stream_throughput: can not convert \"value\" to a int");
+        assertSetGetMoreFlagsIsInvalid();
+        assertDFlagNeeded();
     }
 
     private static void assertSetGetValidThroughput(int throughput, double rateInBytes)
@@ -85,6 +114,39 @@
 
         assertGetThroughput(throughput);
 
+        assertThat(StreamRateLimiter.getInterDCRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.04));
+    }
+
+    private static void assertDFlagNeeded()
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", "-m", String.valueOf(1));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        tool = invokeNodetool("getstreamthroughput");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getStderr()).contains("Use the -d flag to quiet this error and get the exact throughput in megabits/s");
+    }
+
+    private static void assertSetGetValidThroughputMiB(int throughput, double rateInBytes)
+    {
+        ToolResult tool = invokeNodetool("setinterdcstreamthroughput", "-m", String.valueOf(throughput));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughputMiB(throughput);
+
+        assertThat(StreamRateLimiter.getInterDCRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.01));
+    }
+
+    private static void assertSetMbitGetMibValidThroughput(int throughput, double rateInBytes)
+    {
+        ToolResult tool = invokeNodetool("setinterdcstreamthroughput", String.valueOf(throughput));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughputMiB(throughput * MEBIBYTES_PER_MEGABIT);
+
         assertThat(StreamRateLimiter.getInterDCRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.01));
     }
 
@@ -96,10 +158,65 @@
         assertThat(tool.getStdout()).contains(expectedErrorMessage);
     }
 
+    private static void assertSetInvalidThroughputMib(String throughput)
+    {
+        ToolResult tool = invokeNodetool("setinterdcstreamthroughput", "-m", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("inter_dc_stream_throughput_outbound: 2147483647 is too large; it should be" +
+                                              " less than 2147483647 in megabits/s");
+    }
+
+    private static void assertSetInvalidThroughputMbit(String throughput)
+    {
+        ToolResult tool = invokeNodetool("setinterdcstreamthroughput", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("Invalid data rate: 2147483647 megabits per second; stream_throughput_outbound" +
+                                              " and inter_dc_stream_throughput_outbound should be between 0 and 2147483646 in " +
+                                              "megabits per second");
+    }
+
+    private static void assertSetGetMoreFlagsIsInvalid()
+    {
+        ToolResult tool = invokeNodetool("setinterdcstreamthroughput", "-m", "5", "-e", "5");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use -e and -m at the same time");
+
+        tool = invokeNodetool("getinterdcstreamthroughput", "-m", "-e");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+
+        tool = invokeNodetool("getinterdcstreamthroughput", "-m", "-d");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+
+        tool = invokeNodetool("getinterdcstreamthroughput", "-d", "-e");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+
+        tool = invokeNodetool("getinterdcstreamthroughput", "-m", "-e", "-d");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+    }
+
     private static void assertGetThroughput(int expected)
     {
         ToolResult tool = invokeNodetool("getinterdcstreamthroughput");
         tool.assertOnCleanExit();
-        assertThat(tool.getStdout()).contains("Current inter-datacenter stream throughput: " + expected + " Mb/s");
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current inter-datacenter stream throughput: " + expected + " Mb/s");
+        else
+            assertThat(tool.getStdout()).contains("Current inter-datacenter stream throughput: unlimited");
+    }
+
+    private static void assertGetThroughputMiB(double expected)
+    {
+        ToolResult tool = invokeNodetool("getinterdcstreamthroughput", "-m");
+        tool.assertOnCleanExit();
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current inter-datacenter stream throughput: " + expected + " MiB/s");
+        else
+            assertThat(tool.getStdout()).contains("Current inter-datacenter stream throughput: unlimited");
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java
index 3bab4e8..911e0dc 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SetGetStreamThroughputTest.java
@@ -21,6 +21,7 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
+import org.apache.cassandra.config.DataRateSpec;
 import org.apache.cassandra.cql3.CQLTester;
 
 import static org.assertj.core.api.Assertions.withPrecision;
@@ -35,6 +36,14 @@
  */
 public class SetGetStreamThroughputTest extends CQLTester
 {
+    private static final int MAX_INT_CONFIG_VALUE_IN_MBIT = Integer.MAX_VALUE - 1;
+    private static final double BYTES_PER_MEGABIT = 125_000;
+    private static final int MAX_INT_CONFIG_VALUE_MIB = (int) (MAX_INT_CONFIG_VALUE_IN_MBIT * BYTES_PER_MEGABIT) / 1024 / 1024;
+    private static final double INTEGER_MAX_VALUE_MEGABITS_IN_BYTES = DataRateSpec.LongBytesPerSecondBound
+                                                                      .megabitsPerSecondInBytesPerSecond(MAX_INT_CONFIG_VALUE_IN_MBIT)
+                                                                      .toBytesPerSecond();
+    private static final double MEBIBYTES_PER_MEGABIT = 0.11920928955078125;
+
     @BeforeClass
     public static void setup() throws Exception
     {
@@ -50,25 +59,43 @@
     @Test
     public void testPositive()
     {
-        assertSetGetValidThroughput(7, 7 * StreamRateLimiter.BYTES_PER_MEGABIT);
+        assertSetGetValidThroughput(7, 7 * BYTES_PER_MEGABIT);
+        assertSetGetValidThroughputMiB(7, 7 * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+        assertSetMbitGetMibValidThroughput(7, 7 * BYTES_PER_MEGABIT);
+    }
+
+    @Test
+    public void testSmallPositive()
+    {
+        // As part of CASSANDRA-15234 we had to do some tweaks with precision. This test has to ensure no regressions
+        // happen, hopefully. Internally data rate parameters values and rate limitter are set in double. Users can set
+        // and get only integers
+        assertSetGetValidThroughput(1, 1 * BYTES_PER_MEGABIT);
+        assertSetGetValidThroughputMiB(1, 1 * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+        assertSetMbitGetMibValidThroughput(1, 1 * BYTES_PER_MEGABIT);
     }
 
     @Test
     public void testMaxValue()
     {
-        assertSetGetValidThroughput(Integer.MAX_VALUE, Integer.MAX_VALUE * StreamRateLimiter.BYTES_PER_MEGABIT);
+        assertSetGetValidThroughput(MAX_INT_CONFIG_VALUE_IN_MBIT, INTEGER_MAX_VALUE_MEGABITS_IN_BYTES);
+        assertSetGetValidThroughputMiB(MAX_INT_CONFIG_VALUE_MIB, MAX_INT_CONFIG_VALUE_MIB * StreamRateLimiter.BYTES_PER_MEBIBYTE);
+        assertSetMbitGetMibValidThroughput(MAX_INT_CONFIG_VALUE_IN_MBIT, INTEGER_MAX_VALUE_MEGABITS_IN_BYTES);
+    }
+
+    @Test
+    public void testUpperBound()
+    {
+        assertSetInvalidThroughputMib(String.valueOf(Integer.MAX_VALUE));
+        assertSetInvalidThroughputMbit(String.valueOf(Integer.MAX_VALUE));
     }
 
     @Test
     public void testZero()
     {
         assertSetGetValidThroughput(0, Double.MAX_VALUE);
-    }
-
-    @Test
-    public void testNegative()
-    {
-        assertSetGetValidThroughput(-7, Double.MAX_VALUE);
+        assertSetGetValidThroughputMiB(0, Double.MAX_VALUE);
+        assertSetMbitGetMibValidThroughput(0, Double.MAX_VALUE);
     }
 
     @Test
@@ -76,6 +103,9 @@
     {
         assertSetInvalidThroughput("1.2", "stream_throughput: can not convert \"1.2\" to a int");
         assertSetInvalidThroughput("value", "stream_throughput: can not convert \"value\" to a int");
+        assertSetGetMoreFlagsIsInvalid();
+        assertDFlagNeeded();
+        assertSetGetMoreFlagsIsInvalid();
     }
 
     private static void assertSetGetValidThroughput(int throughput, double rateInBytes)
@@ -86,6 +116,39 @@
 
         assertGetThroughput(throughput);
 
+        assertThat(StreamRateLimiter.getRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.04));
+    }
+
+    private static void assertSetGetValidThroughputMiB(int throughput, double rateInBytes)
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", "-m", String.valueOf(throughput));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughputMiB(throughput);
+
+        assertThat(StreamRateLimiter.getRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.01));
+    }
+
+    private static void assertDFlagNeeded()
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", "-m", String.valueOf(1));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        tool = invokeNodetool("getstreamthroughput");
+        assertThat(tool.getExitCode()).isEqualTo(2);
+        assertThat(tool.getStderr()).contains("Use the -d flag to quiet this error and get the exact throughput in megabits/s");
+    }
+
+    private static void assertSetMbitGetMibValidThroughput(int throughput, double rateInBytes)
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", String.valueOf(throughput));
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).isEmpty();
+
+        assertGetThroughputMiB(throughput * MEBIBYTES_PER_MEGABIT);
+
         assertThat(StreamRateLimiter.getRateLimiterRateInBytes()).isEqualTo(rateInBytes, withPrecision(0.01));
     }
 
@@ -97,10 +160,64 @@
         assertThat(tool.getStdout()).contains(expectedErrorMessage);
     }
 
+    private static void assertSetInvalidThroughputMib(String throughput)
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", "-m", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("stream_throughput_outbound: 2147483647 is too large; it should be less " +
+                                              "than 2147483647 in megabits/s");
+    }
+
+    private static void assertSetInvalidThroughputMbit(String throughput)
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", throughput);
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("Invalid data rate: 2147483647 megabits per second; stream_throughput_outbound " +
+                                              "and inter_dc_stream_throughput_outbound should be between 0 and 2147483646 in megabits per second");
+    }
+
+    private static void assertSetGetMoreFlagsIsInvalid()
+    {
+        ToolResult tool = invokeNodetool("setstreamthroughput", "-m", "5", "-e", "5");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use -e and -m at the same time");
+
+        tool = invokeNodetool("getstreamthroughput", "-m", "-e");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+
+        tool = invokeNodetool("getstreamthroughput", "-m", "-d");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+
+        tool = invokeNodetool("getstreamthroughput", "-d", "-e");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+
+        tool = invokeNodetool("getstreamthroughput", "-m", "-e", "-d");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("You cannot use more than one flag with this command");
+    }
+
     private static void assertGetThroughput(int expected)
     {
         ToolResult tool = invokeNodetool("getstreamthroughput");
         tool.assertOnCleanExit();
-        assertThat(tool.getStdout()).contains("Current stream throughput: " + expected + " Mb/s");
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current stream throughput: " + expected + " Mb/s");
+        else
+            assertThat(tool.getStdout()).contains("Current stream throughput: unlimited");
+    }
+
+    private static void assertGetThroughputMiB(double expected)
+    {
+        ToolResult tool = invokeNodetool("getstreamthroughput", "-m");
+        tool.assertOnCleanExit();
+
+        if (expected > 0)
+            assertThat(tool.getStdout()).contains("Current stream throughput: " + expected + " MiB/s");
+        else
+            assertThat(tool.getStdout()).contains("Current stream throughput: unlimited");
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java
index c183edf..9812ef2 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SjkTest.java
@@ -26,7 +26,7 @@
     @Test
     public void sjkHelpReturnsRc0()
     {
-        ToolRunner.ToolResult result = ToolRunner.invokeNodetool("sjk", "--help");
-        result.assertOnExitCode();
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("sjk", "--help");
+        tool.assertOnExitCode();
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java b/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java
index 428438f..2fbaf95 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/SnapshotTest.java
@@ -18,12 +18,11 @@
 
 package org.apache.cassandra.tools.nodetool;
 
-import java.io.File;
-
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.io.util.File;
 import org.apache.cassandra.tools.ToolRunner;
 
 import static org.apache.cassandra.tools.ToolRunner.invokeNodetool;
@@ -83,9 +82,9 @@
     @Test
     public void testInvalidSnapshotName()
     {
-        ToolRunner.ToolResult tool = invokeNodetool("snapshot", "-t", "invalid" + File.pathSeparatorChar + "name");
+        ToolRunner.ToolResult tool = invokeNodetool("snapshot", "-t", "invalid" + File.pathSeparator() + "name");
         assertThat(tool.getExitCode()).isEqualTo(2);
-        assertThat(tool.getStderr()).contains("Snapshot name cannot contain " + File.pathSeparatorChar);
+        assertThat(tool.getStderr()).contains("Snapshot name cannot contain " + File.pathSeparator());
     }
 
     @Test
@@ -99,6 +98,24 @@
     }
 
     @Test
+    public void testTTLOption()
+    {
+        ToolRunner.ToolResult tool = invokeNodetool("snapshot", "-t", "ttl", "--ttl", "5h");
+        tool.assertOnCleanExit();
+
+        assertThat(tool.getExitCode()).isEqualTo(0);
+        assertThat(tool.getStdout()).contains("Requested creating snapshot(s) for [all keyspaces] with snapshot name [ttl] and options {skipFlush=false, ttl=5h}");
+    }
+
+    @Test
+    public void testInvalidTTLOption()
+    {
+        ToolRunner.ToolResult tool = invokeNodetool("snapshot", "-t", "ttl", "--ttl", "infinity");
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("Invalid duration: infinity");
+    }
+
+    @Test
     public void testTableOption()
     {
         ToolRunner.ToolResult tool = invokeNodetool("snapshot", "-t", "table", "--table", "keyspaces", "system_schema");
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java b/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java
index 13acb19..9d8496c 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/StatusTest.java
@@ -30,9 +30,7 @@
 import org.apache.cassandra.tools.ToolRunner;
 import org.apache.cassandra.utils.FBUtilities;
 
-import static org.hamcrest.CoreMatchers.*;
-import static org.hamcrest.Matchers.matchesPattern;
-import static org.junit.Assert.assertThat;
+import static org.assertj.core.api.Assertions.assertThat;
 
 public class StatusTest extends CQLTester
 {
@@ -43,10 +41,10 @@
     @BeforeClass
     public static void setup() throws Exception
     {
-        StorageService.instance.initServer();
+        requireNetwork();
+        startJMXServer();
         localHostId = StorageService.instance.getLocalHostId();
         token = StorageService.instance.getTokens().get(0);
-        startJMXServer();
     }
 
     /**
@@ -78,26 +76,27 @@
         schemaChange("DROP KEYSPACE " + CQLTester.KEYSPACE);
         schemaChange("DROP KEYSPACE " + CQLTester.KEYSPACE_PER_TEST);
 
-        ToolRunner.ToolResult nodetool = ToolRunner.invokeNodetool("status");
-        nodetool.assertOnCleanExit();
-        String[] lines = PATTERN.split(nodetool.getStdout());
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("status");
+        tool.assertOnCleanExit();
+        String[] lines = PATTERN.split(tool.getStdout());
 
         String hostStatus = lines[lines.length-3].trim();
-        assertThat(hostStatus, startsWith("UN"));
-        assertThat(hostStatus, containsString(FBUtilities.getJustLocalAddress().getHostAddress()));
-        assertThat(hostStatus, matchesPattern(".*\\d+\\.?\\d+ KiB.*"));
-        assertThat(hostStatus, containsString(localHostId));
-        assertThat(hostStatus, containsString(token));
-        assertThat(hostStatus, endsWith(SimpleSnitch.RACK_NAME));
+        assertThat(hostStatus).startsWith("UN");
+        assertThat(hostStatus).contains(FBUtilities.getJustLocalAddress().getHostAddress());
+        assertThat(hostStatus).containsPattern("\\d+\\.?\\d+ KiB");
+        assertThat(hostStatus).contains(localHostId);
+        assertThat(hostStatus).contains(token);
+        assertThat(hostStatus).endsWith(SimpleSnitch.RACK_NAME);
 
         String bootstrappingWarn = lines[lines.length-1].trim();
-        assertThat(bootstrappingWarn, containsString("probably still bootstrapping. Effective ownership information is meaningless."));
+        assertThat(bootstrappingWarn)
+                .contains("probably still bootstrapping. Effective ownership information is meaningless.");
     }
 
     private void validateStatusOutput(String hostForm, String... args)
     {
-        ToolRunner.ToolResult nodetool = ToolRunner.invokeNodetool(args);
-        nodetool.assertOnCleanExit();
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool(args);
+        tool.assertOnCleanExit();
         /*
          Datacenter: datacenter1
          =======================
@@ -106,16 +105,16 @@
          --  Address    Load       Owns (effective)  Host ID                               Token                Rack
          UN  localhost  45.71 KiB  100.0%            0b1b5e91-ad3b-444e-9c24-50578486978a  1849950853373272258  rack1
          */
-        String[] lines = PATTERN.split(nodetool.getStdout());
-        assertThat(lines[0].trim(), endsWith(SimpleSnitch.DATA_CENTER_NAME));
+        String[] lines = PATTERN.split(tool.getStdout());
+        assertThat(lines[0].trim()).endsWith(SimpleSnitch.DATA_CENTER_NAME);
         String hostStatus = lines[lines.length-1].trim();
-        assertThat(hostStatus, startsWith("UN"));
-        assertThat(hostStatus, containsString(hostForm));
-        assertThat(hostStatus, matchesPattern(".*\\d+\\.?\\d+ KiB.*"));
-        assertThat(hostStatus, matchesPattern(".*\\d+\\.\\d+%.*"));
-        assertThat(hostStatus, containsString(localHostId));
-        assertThat(hostStatus, containsString(token));
-        assertThat(hostStatus, endsWith(SimpleSnitch.RACK_NAME));
-        assertThat(hostStatus, not(containsString("?")));
+        assertThat(hostStatus).startsWith("UN");
+        assertThat(hostStatus).contains(hostForm);
+        assertThat(hostStatus).containsPattern("\\d+\\.?\\d+ KiB");
+        assertThat(hostStatus).containsPattern("\\d+\\.\\d+%");
+        assertThat(hostStatus).contains(localHostId);
+        assertThat(hostStatus).contains(token);
+        assertThat(hostStatus).endsWith(SimpleSnitch.RACK_NAME);
+        assertThat(hostStatus).doesNotContain("?");
     }
 }
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/TableStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/TableStatsTest.java
new file mode 100644
index 0000000..578bd88
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/TableStatsTest.java
@@ -0,0 +1,255 @@
+/*
+ * 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.tools.nodetool;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.StringUtils;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+import org.yaml.snakeyaml.Yaml;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.assertj.core.api.Assertions.assertThatCode;
+
+public class TableStatsTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "tablestats");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool tablestats - Print statistics on tables\n" + 
+                        "\n" + 
+                        "SYNOPSIS\n" + 
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+                        "                [(-u <username> | --username <username>)] tablestats\n" +
+                        "                [(-F <format> | --format <format>)] [(-H | --human-readable)] [-i]\n" +
+                        "                [(-l | --sstable-location-check)] [(-s <sort_key> | --sort <sort_key>)]\n" +
+                        "                [(-t <top> | --top <top>)] [--] [<keyspace.table>...]\n" +
+                        "\n" + 
+                        "OPTIONS\n" +
+                        "        -F <format>, --format <format>\n" +
+                        "            Output format (json, yaml)\n" + 
+                        "\n" + 
+                        "        -h <host>, --host <host>\n" + 
+                        "            Node hostname or ip address\n" + 
+                        "\n" + 
+                        "        -H, --human-readable\n" + 
+                        "            Display bytes in human readable form, i.e. KiB, MiB, GiB, TiB\n" + 
+                        "\n" + 
+                        "        -i\n" + 
+                        "            Ignore the list of tables and display the remaining tables\n" +
+                        "\n" +
+                        "        -l, --sstable-location-check\n" +
+                        "            Check whether or not the SSTables are in the correct location.\n" +
+                        "\n" + 
+                        "        -p <port>, --port <port>\n" + 
+                        "            Remote jmx agent port number\n" + 
+                        "\n" + 
+                        "        -pp, --print-port\n" + 
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" + 
+                        "\n" + 
+                        "        -pw <password>, --password <password>\n" + 
+                        "            Remote jmx agent password\n" + 
+                        "\n" + 
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + 
+                        "            Path to the JMX password file\n" + 
+                        "\n" + 
+                        "        -s <sort_key>, --sort <sort_key>\n" + 
+                        "            Sort tables by specified sort key\n" + 
+                        "            (average_live_cells_per_slice_last_five_minutes,\n" + 
+                        "            average_tombstones_per_slice_last_five_minutes,\n" + 
+                        "            bloom_filter_false_positives, bloom_filter_false_ratio,\n" + 
+                        "            bloom_filter_off_heap_memory_used, bloom_filter_space_used,\n" + 
+                        "            compacted_partition_maximum_bytes, compacted_partition_mean_bytes,\n" + 
+                        "            compacted_partition_minimum_bytes,\n" + 
+                        "            compression_metadata_off_heap_memory_used, dropped_mutations,\n" + 
+                        "            full_name, index_summary_off_heap_memory_used, local_read_count,\n" + 
+                        "            local_read_latency_ms, local_write_latency_ms,\n" + 
+                        "            maximum_live_cells_per_slice_last_five_minutes,\n" + 
+                        "            maximum_tombstones_per_slice_last_five_minutes, memtable_cell_count,\n" + 
+                        "            memtable_data_size, memtable_off_heap_memory_used,\n" + 
+                        "            memtable_switch_count, number_of_partitions_estimate,\n" + 
+                        "            off_heap_memory_used_total, pending_flushes, percent_repaired,\n" + 
+                        "            read_latency, reads, space_used_by_snapshots_total, space_used_live,\n" + 
+                        "            space_used_total, sstable_compression_ratio, sstable_count,\n" + 
+                        "            table_name, write_latency, writes)\n" + 
+                        "\n" + 
+                        "        -t <top>, --top <top>\n" + 
+                        "            Show only the top K tables for the sort key (specify the number K of\n" + 
+                        "            tables to be shown\n" + 
+                        "\n" + 
+                        "        -u <username>, --username <username>\n" + 
+                        "            Remote jmx agent username\n" + 
+                        "\n" + 
+                        "        --\n" + 
+                        "            This option can be used to separate command-line options from the\n" + 
+                        "            list of argument, (useful when arguments might be mistaken for\n" + 
+                        "            command-line options\n" + 
+                        "\n" + 
+                        "        [<keyspace.table>...]\n" + 
+                        "            List of tables (or keyspace) names\n" + 
+                        "\n" + 
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testTableStats()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace : system_schema");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Table:")).isGreaterThan(1);
+
+        tool = ToolRunner.invokeNodetool("tablestats", "system_distributed");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace : system_distributed");
+        assertThat(tool.getStdout()).doesNotContain("Keyspace : system_schema");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Table:")).isGreaterThan(1);
+    }
+
+    @Test
+    public void testTableIgnoreArg()
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-i", "system_schema.aggregates");
+        tool.assertOnCleanExit();
+        assertThat(tool.getStdout()).contains("Keyspace : system_schema");
+        assertThat(tool.getStdout()).doesNotContain("Table: system_schema.aggregates");
+        assertThat(StringUtils.countMatches(tool.getStdout(), "Table:")).isGreaterThan(1);
+    }
+
+    @Test
+    public void testHumanReadableArg()
+    {
+        Arrays.asList("-H", "--human-readable").forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg);
+            tool.assertOnCleanExit();
+            assertThat(tool.getStdout()).contains(" KiB");
+        });
+    }
+
+    @Test
+    public void testSortArg()
+    {
+        Pattern regExp = Pattern.compile("((?m)Table: .*$)");
+
+        Arrays.asList("-s", "--sort").forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "table_name");
+            Matcher m = regExp.matcher(tool.getStdout());
+            ArrayList<String> orig = new ArrayList<>();
+            while (m.find())
+                orig.add(m.group(1));
+
+            tool = ToolRunner.invokeNodetool("tablestats", arg, "sstable_count");
+            tool.assertOnCleanExit();
+            m = regExp.matcher(tool.getStdout());
+            ArrayList<String> sorted = new ArrayList<>();
+            while (m.find())
+                sorted.add(m.group(1));
+
+            assertThat(sorted).isNotEqualTo(orig);
+            Collections.sort(orig);
+            Collections.sort(sorted);
+            assertThat(sorted).isEqualTo(orig);
+        });
+
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", "wrongSort");
+        assertThat(tool.getStdout()).contains("argument for sort must be one of");
+        tool.assertCleanStdErr();
+        assertThat(tool.getExitCode()).isEqualTo(1);
+    }
+
+    @Test
+    public void testTopArg()
+    {
+        Arrays.asList("-t", "--top").forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", "table_name", arg, "1");
+            tool.assertOnCleanExit();
+            assertThat(StringUtils.countMatches(tool.getStdout(), "Table:")).isEqualTo(1);
+        });
+
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", "table_name", "-t", "-1");
+        tool.assertCleanStdErr();
+        assertThat(tool.getExitCode()).isEqualTo(1);
+        assertThat(tool.getStdout()).contains("argument for top must be a positive integer");
+    }
+
+    @Test
+    public void testSSTableLocationCheckArg()
+    {
+        Arrays.asList("-l", "--sstable-location-check").forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "system.local");
+            tool.assertOnCleanExit();
+            assertThat(StringUtils.countMatches(tool.getStdout(), "SSTables in correct location: ")).isEqualTo(1);
+        });
+
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", "system.local");
+        tool.assertCleanStdErr();
+        assertThat(tool.getStdout()).doesNotContain("SSTables in correct location: ");
+    }
+
+    @Test
+    public void testFormatJson()
+    {
+        Arrays.asList("-F", "--format").forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "json");
+            tool.assertOnCleanExit();
+            String json = tool.getStdout();
+            assertThatCode(() -> new ObjectMapper().readTree(json)).doesNotThrowAnyException();
+            assertThat(json).containsPattern("\"sstable_count\"\\s*:\\s*[0-9]+")
+                            .containsPattern("\"old_sstable_count\"\\s*:\\s*[0-9]+");
+        });
+    }
+
+    @Test
+    public void testFormatYaml()
+    {
+        Arrays.asList("-F", "--format").forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "yaml");
+            tool.assertOnCleanExit();
+            String yaml = tool.getStdout();
+            assertThatCode(() -> new Yaml().load(yaml)).doesNotThrowAnyException();
+            assertThat(yaml).containsPattern("sstable_count:\\s*[0-9]+")
+                            .containsPattern("old_sstable_count:\\s*[0-9]+");
+        });
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/TpStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/TpStatsTest.java
new file mode 100644
index 0000000..124f297
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/TpStatsTest.java
@@ -0,0 +1,201 @@
+/*
+ * 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.tools.nodetool;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.net.Message;
+import org.apache.cassandra.net.MessagingService;
+import org.apache.cassandra.net.NoPayload;
+import org.apache.cassandra.tools.ToolRunner;
+import org.apache.cassandra.utils.FBUtilities;
+import org.yaml.snakeyaml.Yaml;
+
+import static org.apache.cassandra.net.Verb.ECHO_REQ;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class TpStatsTest extends CQLTester
+{
+
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        requireNetwork();
+        startJMXServer();
+    }
+
+    @Test
+    @SuppressWarnings("SingleCharacterStringConcatenation")
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "tpstats");
+        tool.assertOnCleanExit();
+
+        String help =   "NAME\n" +
+                        "        nodetool tpstats - Print usage statistics of thread pools\n" + 
+                        "\n" + 
+                        "SYNOPSIS\n" + 
+                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" + 
+                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" + 
+                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" + 
+                        "                [(-u <username> | --username <username>)] tpstats\n" + 
+                        "                [(-F <format> | --format <format>)]\n" + 
+                        "\n" + 
+                        "OPTIONS\n" + 
+                        "        -F <format>, --format <format>\n" + 
+                        "            Output format (json, yaml)\n" + 
+                        "\n" + 
+                        "        -h <host>, --host <host>\n" + 
+                        "            Node hostname or ip address\n" + 
+                        "\n" + 
+                        "        -p <port>, --port <port>\n" + 
+                        "            Remote jmx agent port number\n" + 
+                        "\n" + 
+                        "        -pp, --print-port\n" + 
+                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" + 
+                        "\n" + 
+                        "        -pw <password>, --password <password>\n" + 
+                        "            Remote jmx agent password\n" + 
+                        "\n" + 
+                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + 
+                        "            Path to the JMX password file\n" + 
+                        "\n" + 
+                        "        -u <username>, --username <username>\n" + 
+                        "            Remote jmx agent username\n" +  
+                        "\n" + 
+                        "\n";
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+
+    @Test
+    public void testTpStats() throws Throwable
+    {
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tpstats");
+        tool.assertOnCleanExit();
+        String stdout = tool.getStdout();
+        assertThat(stdout).containsPattern("Pool Name \\s+ Active Pending Completed Blocked All time blocked");
+        assertThat(stdout).contains("Latencies waiting in queue (micros) per dropped message types");
+
+        // Does inserting data alter tpstats?
+        String nonZeroedThreadsRegExp = "((?m)\\D.*[1-9].*)";
+        ArrayList<String> origStats = getAllGroupMatches(nonZeroedThreadsRegExp, stdout);
+        Collections.sort(origStats);
+
+        createTable("CREATE TABLE %s (pk int, c int, PRIMARY KEY(pk))");
+        execute("INSERT INTO %s (pk, c) VALUES (?, ?)", 1, 1);
+        flush();
+
+        tool = ToolRunner.invokeNodetool("tpstats");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        ArrayList<String> newStats = getAllGroupMatches(nonZeroedThreadsRegExp, stdout);
+        Collections.sort(newStats);
+
+        assertThat(origStats).isNotEqualTo(newStats);
+
+        // Does sending a message alter Gossip & ECHO stats?
+        String origGossip = getAllGroupMatches("((?m)GossipStage.*)", stdout).get(0);
+        assertThat(stdout).doesNotContainPattern("ECHO_REQ\\D.*[1-9].*");
+        assertThat(stdout).doesNotContainPattern("ECHO_RSP\\D.*[1-9].*");
+
+        Message<NoPayload> echoMessageOut = Message.out(ECHO_REQ, NoPayload.noPayload);
+        MessagingService.instance().send(echoMessageOut, FBUtilities.getBroadcastAddressAndPort());
+
+        tool = ToolRunner.invokeNodetool("tpstats");
+        tool.assertOnCleanExit();
+        stdout = tool.getStdout();
+        String newGossip = getAllGroupMatches("((?m)GossipStage.*)", stdout).get(0);
+
+        assertThat(origGossip).isNotEqualTo(newGossip);
+        assertThat(stdout).containsPattern("ECHO_REQ\\D.*[1-9].*");
+        assertThat(stdout).containsPattern("ECHO_RSP\\D.*[0-9].*");
+    }
+
+    @Test
+    public void testFormatArg()
+    {
+        Arrays.asList(Pair.of("-F", "json"), Pair.of("--format", "json")).forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tpstats", arg.getLeft(), arg.getRight());
+            tool.assertOnCleanExit();
+            String json = tool.getStdout();
+            assertThat(isJSONString(json)).isTrue();
+            assertThat(json).containsPattern("\"WaitLatencies\"\\s*:\\s*\\{\\s*\"");
+        });
+
+        Arrays.asList( Pair.of("-F", "yaml"), Pair.of("--format", "yaml")).forEach(arg -> {
+            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tpstats", arg.getLeft(), arg.getRight());
+            tool.assertOnCleanExit();
+            String yaml = tool.getStdout();
+            assertThat(isYAMLString(yaml)).isTrue();
+            assertThat(yaml).containsPattern("WaitLatencies:\\s*[A-Z|_]+:\\s+-\\s");
+        });
+    }
+
+    public static boolean isJSONString(String str)
+    {
+        try
+        {
+            ObjectMapper mapper = new ObjectMapper();
+            mapper.readTree(str);
+            return true;
+        }
+        catch(IOException e)
+        {
+            return false;
+        }
+    }
+
+    public static boolean isYAMLString(String str)
+    {
+        try
+        {
+            Yaml yaml = new Yaml();
+            yaml.load(str);
+            return true;
+        }
+        catch(Exception e)
+        {
+            return false;
+        }
+    }
+
+    private ArrayList<String> getAllGroupMatches(String regExp, String in)
+    {
+        Pattern pattern = Pattern.compile(regExp);
+        Matcher m = pattern.matcher(in);
+
+        ArrayList<String> matches = new ArrayList<>();
+        while (m.find())
+            matches.add(m.group(1));
+
+        return matches;
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/VerifyTest.java b/test/unit/org/apache/cassandra/tools/nodetool/VerifyTest.java
new file mode 100644
index 0000000..47ca5fe
--- /dev/null
+++ b/test/unit/org/apache/cassandra/tools/nodetool/VerifyTest.java
@@ -0,0 +1,128 @@
+/*
+ * 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.tools.nodetool;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.apache.cassandra.SchemaLoader;
+import org.apache.cassandra.auth.AuthTestUtils;
+import org.apache.cassandra.auth.AuthenticatedUser;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.tools.ToolRunner;
+
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_A;
+import static org.apache.cassandra.auth.AuthTestUtils.ROLE_B;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class VerifyTest extends CQLTester
+{
+    @BeforeClass
+    public static void setup() throws Exception
+    {
+        SchemaLoader.prepareServer();
+        AuthTestUtils.LocalCassandraRoleManager roleManager = new AuthTestUtils.LocalCassandraRoleManager();
+        SchemaLoader.setupAuth(roleManager,
+                               new AuthTestUtils.LocalPasswordAuthenticator(),
+                               new AuthTestUtils.LocalCassandraAuthorizer(),
+                               new AuthTestUtils.LocalCassandraNetworkAuthorizer());
+
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_A, AuthTestUtils.getLoginRoleOptions());
+        roleManager.createRole(AuthenticatedUser.SYSTEM_USER, ROLE_B, AuthTestUtils.getLoginRoleOptions());
+
+        startJMXServer();
+    }
+
+    /**
+     * We calcify the help file as last seen as a "trigger" to notify a developer that, upon addition of a new flag or
+     * functionality to this tool option, they will need to update help output and/or documentation as necessary.
+     */
+    @Test
+    public void testMaybeChangeDocs()
+    {
+        // If you added, modified options or help, please update docs if necessary
+        ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("help", "verify");
+        tool.assertOnCleanExit();
+
+        String help =
+        "NAME\n" +
+        "        nodetool verify - Verify (check data checksum for) one or more tables\n" +
+        "\n" +
+        "SYNOPSIS\n" +
+        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
+        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
+        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
+        "                [(-u <username> | --username <username>)] verify\n" +
+        "                [(-c | --check-version)] [(-d | --dfp)] [(-e | --extended-verify)]\n" +
+        "                [(-f | --force)] [(-q | --quick)] [(-r | --rsc)] [(-t | --check-tokens)]\n" +
+        "                [--] [<keyspace> <tables>...]\n" +
+        "\n" +
+
+        "OPTIONS\n" +
+        "        -c, --check-version\n" +
+        "            Also check that all sstables are the latest version\n" +
+        "\n" +
+        "        -d, --dfp\n" +
+        "            Invoke the disk failure policy if a corrupt sstable is found\n" +
+        "\n" +
+        "        -e, --extended-verify\n" +
+        "            Verify each cell data, beyond simply checking sstable checksums\n" +
+        "\n" +
+        "        -f, --force\n" +
+        "            Override disabling of verify tool - see CASSANDRA-9947 for caveats\n" +
+        "\n" +
+        "        -h <host>, --host <host>\n" +
+        "            Node hostname or ip address\n" +
+        "\n" +
+        "        -p <port>, --port <port>\n" +
+        "            Remote jmx agent port number\n" +
+        "\n" +
+        "        -pp, --print-port\n" +
+        "            Operate in 4.0 mode with hosts disambiguated by port number\n" +
+        "\n" +
+        "        -pw <password>, --password <password>\n" +
+        "            Remote jmx agent password\n" +
+        "\n" +
+        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" +
+        "            Path to the JMX password file\n" +
+        "\n" +
+        "        -q, --quick\n" +
+        "            Do a quick check - avoid reading all data to verify checksums\n" +
+        "\n" +
+        "        -r, --rsc\n" +
+        "            Mutate the repair status on corrupt sstables\n" +
+        "\n" +
+        "        -t, --check-tokens\n" +
+        "            Verify that all tokens in sstables are owned by this node\n" +
+        "\n" +
+        "        -u <username>, --username <username>\n" +
+        "            Remote jmx agent username\n" +
+        "\n" +
+        "        --\n" +
+        "            This option can be used to separate command-line options from the\n" +
+        "            list of argument, (useful when arguments might be mistaken for\n" +
+        "            command-line options\n" +
+        "\n" +
+        "        [<keyspace> <tables>...]\n" +
+        "            The keyspace followed by one or many tables\n" +
+        "\n\n";
+
+        assertThat(tool.getStdout()).isEqualTo(help);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/formatter/TableBuilderTest.java b/test/unit/org/apache/cassandra/tools/nodetool/formatter/TableBuilderTest.java
index 9782b5b..99a6929 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/formatter/TableBuilderTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/formatter/TableBuilderTest.java
@@ -111,4 +111,4 @@
         }
         assertEquals(String.format("a\tbb\tccc%n"), baos.toString());
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/stats/NodetoolTableStatsTest.java b/test/unit/org/apache/cassandra/tools/nodetool/stats/NodetoolTableStatsTest.java
deleted file mode 100644
index ce3ee22..0000000
--- a/test/unit/org/apache/cassandra/tools/nodetool/stats/NodetoolTableStatsTest.java
+++ /dev/null
@@ -1,280 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.apache.cassandra.tools.nodetool.stats;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.apache.commons.lang3.StringUtils;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-
-import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.cassandra.cql3.CQLTester;
-import org.apache.cassandra.service.StorageService;
-import org.apache.cassandra.tools.ToolRunner;
-import org.apache.cassandra.tools.ToolRunner.ToolResult;
-import org.assertj.core.api.Assertions;
-import org.hamcrest.CoreMatchers;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.assertTrue;
-import org.yaml.snakeyaml.Yaml;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.assertj.core.api.Assertions.assertThatCode;
-
-public class NodetoolTableStatsTest extends CQLTester
-{
-    @BeforeClass
-    public static void setup() throws Exception
-    {
-        StorageService.instance.initServer();
-        startJMXServer();
-    }
-
-    @Test
-    public void testMaybeChangeDocs()
-    {
-        // If you added, modified options or help, please update docs if necessary
-        ToolResult tool = ToolRunner.invokeNodetool("help", "tablestats");
-        String help =   "NAME\n" +
-                        "        nodetool tablestats - Print statistics on tables\n" + 
-                        "\n" + 
-                        "SYNOPSIS\n" + 
-                        "        nodetool [(-h <host> | --host <host>)] [(-p <port> | --port <port>)]\n" +
-                        "                [(-pp | --print-port)] [(-pw <password> | --password <password>)]\n" +
-                        "                [(-pwf <passwordFilePath> | --password-file <passwordFilePath>)]\n" +
-                        "                [(-u <username> | --username <username>)] tablestats\n" +
-                        "                [(-F <format> | --format <format>)] [(-H | --human-readable)] [-i]\n" +
-                        "                [(-l | --sstable-location-check)] [(-s <sort_key> | --sort <sort_key>)]\n" +
-                        "                [(-t <top> | --top <top>)] [--] [<keyspace.table>...]\n" +
-                        "\n" + 
-                        "OPTIONS\n" +
-                        "        -F <format>, --format <format>\n" +
-                        "            Output format (json, yaml)\n" + 
-                        "\n" + 
-                        "        -h <host>, --host <host>\n" + 
-                        "            Node hostname or ip address\n" + 
-                        "\n" + 
-                        "        -H, --human-readable\n" + 
-                        "            Display bytes in human readable form, i.e. KiB, MiB, GiB, TiB\n" + 
-                        "\n" + 
-                        "        -i\n" + 
-                        "            Ignore the list of tables and display the remaining tables\n" +
-                        "\n" +
-                        "        -l, --sstable-location-check\n" +
-                        "            Check whether or not the SSTables are in the correct location.\n" +
-                        "\n" + 
-                        "        -p <port>, --port <port>\n" + 
-                        "            Remote jmx agent port number\n" + 
-                        "\n" + 
-                        "        -pp, --print-port\n" + 
-                        "            Operate in 4.0 mode with hosts disambiguated by port number\n" + 
-                        "\n" + 
-                        "        -pw <password>, --password <password>\n" + 
-                        "            Remote jmx agent password\n" + 
-                        "\n" + 
-                        "        -pwf <passwordFilePath>, --password-file <passwordFilePath>\n" + 
-                        "            Path to the JMX password file\n" + 
-                        "\n" + 
-                        "        -s <sort_key>, --sort <sort_key>\n" + 
-                        "            Sort tables by specified sort key\n" + 
-                        "            (average_live_cells_per_slice_last_five_minutes,\n" + 
-                        "            average_tombstones_per_slice_last_five_minutes,\n" + 
-                        "            bloom_filter_false_positives, bloom_filter_false_ratio,\n" + 
-                        "            bloom_filter_off_heap_memory_used, bloom_filter_space_used,\n" + 
-                        "            compacted_partition_maximum_bytes, compacted_partition_mean_bytes,\n" + 
-                        "            compacted_partition_minimum_bytes,\n" + 
-                        "            compression_metadata_off_heap_memory_used, dropped_mutations,\n" + 
-                        "            full_name, index_summary_off_heap_memory_used, local_read_count,\n" + 
-                        "            local_read_latency_ms, local_write_latency_ms,\n" + 
-                        "            maximum_live_cells_per_slice_last_five_minutes,\n" + 
-                        "            maximum_tombstones_per_slice_last_five_minutes, memtable_cell_count,\n" + 
-                        "            memtable_data_size, memtable_off_heap_memory_used,\n" + 
-                        "            memtable_switch_count, number_of_partitions_estimate,\n" + 
-                        "            off_heap_memory_used_total, pending_flushes, percent_repaired,\n" + 
-                        "            read_latency, reads, space_used_by_snapshots_total, space_used_live,\n" + 
-                        "            space_used_total, sstable_compression_ratio, sstable_count,\n" + 
-                        "            table_name, write_latency, writes)\n" + 
-                        "\n" + 
-                        "        -t <top>, --top <top>\n" + 
-                        "            Show only the top K tables for the sort key (specify the number K of\n" + 
-                        "            tables to be shown\n" + 
-                        "\n" + 
-                        "        -u <username>, --username <username>\n" + 
-                        "            Remote jmx agent username\n" + 
-                        "\n" + 
-                        "        --\n" + 
-                        "            This option can be used to separate command-line options from the\n" + 
-                        "            list of argument, (useful when arguments might be mistaken for\n" + 
-                        "            command-line options\n" + 
-                        "\n" + 
-                        "        [<keyspace.table>...]\n" + 
-                        "            List of tables (or keyspace) names\n" + 
-                        "\n" + 
-                        "\n";
-        Assertions.assertThat(tool.getStdout()).isEqualTo(help);
-        tool.assertOnCleanExit();
-    }
-
-    @Test
-    public void testTableStats()
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats");
-
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Keyspace : system_schema"));
-        assertTrue(StringUtils.countMatches(tool.getStdout(), "Table:") > 1);
-        tool.assertOnCleanExit();
-
-        tool = ToolRunner.invokeNodetool("tablestats", "system_distributed");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Keyspace : system_distributed"));
-        assertThat(tool.getStdout(), CoreMatchers.not(CoreMatchers.containsString("Keyspace : system_schema")));
-        assertTrue(StringUtils.countMatches(tool.getStdout(), "Table:") > 1);
-        tool.assertOnCleanExit();
-    }
-
-    @Test
-    public void testTableIgnoreArg()
-    {
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-i", "system_schema.aggregates");
-
-        assertThat(tool.getStdout(), CoreMatchers.containsString("Keyspace : system_schema"));
-        assertThat(tool.getStdout(), CoreMatchers.not(CoreMatchers.containsString("Table: system_schema.aggregates")));
-        assertTrue(StringUtils.countMatches(tool.getStdout(), "Table:") > 1);
-        tool.assertOnCleanExit();
-    }
-
-    @Test
-    public void testHumanReadableArg()
-    {
-        Arrays.asList("-H", "--human-readable").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg);
-            assertThat(argFormat(arg), tool.getStdout(), CoreMatchers.containsString(" KiB"));
-            assertTrue(String.format("Expected empty stderr for option [%s] but found: %s",
-                                     arg,
-                                     tool.getCleanedStderr()),
-                       tool.getCleanedStderr().isEmpty());
-            assertEquals(String.format("Expected exit code 0 for option [%s] but found: %s", arg, tool.getExitCode()),
-                         0,
-                         tool.getExitCode());
-        });
-    }
-
-    @Test
-    public void testSortArg()
-    {
-        Pattern regExp = Pattern.compile("((?m)Table: .*$)");
-
-        Arrays.asList("-s", "--sort").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "table_name");
-            Matcher m = regExp.matcher(tool.getStdout());
-            ArrayList<String> orig = new ArrayList<>();
-            while (m.find())
-                orig.add(m.group(1));
-
-            tool = ToolRunner.invokeNodetool("tablestats", arg, "sstable_count");
-            m = regExp.matcher(tool.getStdout());
-            ArrayList<String> sorted = new ArrayList<>();
-            while (m.find())
-                sorted.add(m.group(1));
-
-            assertNotEquals(argFormat(arg), orig, sorted);
-            Collections.sort(orig);
-            Collections.sort(sorted);
-            assertEquals(argFormat(arg), orig, sorted);
-            assertTrue(argFormat(arg), tool.getCleanedStderr().isEmpty());
-            assertEquals(0, tool.getExitCode());
-        });
-
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", "wrongSort");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("argument for sort must be one of"));
-        tool.assertCleanStdErr();
-        assertEquals(1, tool.getExitCode());
-    }
-
-    @Test
-    public void testTopArg()
-    {
-        Arrays.asList("-t", "--top").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", "table_name", arg, "1");
-            assertEquals(argFormat(arg), StringUtils.countMatches(tool.getStdout(), "Table:"), 1);
-            assertTrue(argFormat(arg), tool.getCleanedStderr().isEmpty());
-            assertEquals(argFormat(arg), 0, tool.getExitCode());
-        });
-
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", "-s", "table_name", "-t", "-1");
-        assertThat(tool.getStdout(), CoreMatchers.containsString("argument for top must be a positive integer"));
-        tool.assertCleanStdErr();
-        assertEquals(1, tool.getExitCode());
-    }
-
-    @Test
-    public void testSSTableLocationCheckArg()
-    {
-        Arrays.asList("-l", "--sstable-location-check").forEach(arg -> {
-            ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "system.local");
-            assertEquals(argFormat(arg), StringUtils.countMatches(tool.getStdout(), "SSTables in correct location: "), 1);
-            assertTrue(argFormat(arg), tool.getCleanedStderr().isEmpty());
-            assertEquals(argFormat(arg), 0, tool.getExitCode());
-        });
-
-        ToolResult tool = ToolRunner.invokeNodetool("tablestats", "system.local");
-        assertThat(tool.getStdout(), CoreMatchers.not(CoreMatchers.containsString("SSTables in correct location: ")));
-        tool.assertCleanStdErr();
-        assertEquals(0, tool.getExitCode());
-    }
-
-    private String argFormat(String arg)
-    {
-        return "Arg: [" + arg + ']';
-    }
-
-    @Test
-    public void testFormatJson()
-    {
-        Arrays.asList("-F", "--format").forEach(arg -> {
-            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "json");
-            tool.assertOnCleanExit();
-            String json = tool.getStdout();
-            assertThatCode(() -> new ObjectMapper().readTree(json)).doesNotThrowAnyException();
-            assertThat(json).containsPattern("\"sstable_count\"\\s*:\\s*[0-9]+")
-                            .containsPattern("\"old_sstable_count\"\\s*:\\s*[0-9]+");
-        });
-    }
-
-    @Test
-    public void testFormatYaml()
-    {
-        Arrays.asList("-F", "--format").forEach(arg -> {
-            ToolRunner.ToolResult tool = ToolRunner.invokeNodetool("tablestats", arg, "yaml");
-            tool.assertOnCleanExit();
-            String yaml = tool.getStdout();
-            assertThatCode(() -> new Yaml().load(yaml)).doesNotThrowAnyException();
-            assertThat(yaml).containsPattern("sstable_count:\\s*[0-9]+")
-                            .containsPattern("old_sstable_count:\\s*[0-9]+");
-        });
-    }
-}
diff --git a/test/unit/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinterTest.java b/test/unit/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinterTest.java
index 025f812..81687ba 100644
--- a/test/unit/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinterTest.java
+++ b/test/unit/org/apache/cassandra/tools/nodetool/stats/TableStatsPrinterTest.java
@@ -397,6 +397,7 @@
                                  "    \"tables\" : {\n" +
                                  "      \"table6\" : {\n" +
                                  "        \"average_tombstones_per_slice_last_five_minutes\" : 6.0,\n" +
+                                 "        \"top_tombstone_partitions\" : null,\n" +
                                  "        \"bloom_filter_off_heap_memory_used\" : \"667408\",\n" +
                                  "        \"bytes_pending_repair\" : 0,\n" +
                                  "        \"memtable_switch_count\" : 6,\n" +
@@ -412,6 +413,7 @@
                                  "        \"local_read_count\" : 5,\n" +
                                  "        \"sstable_compression_ratio\" : 0.68,\n" +
                                  "        \"dropped_mutations\" : \"666666\",\n" +
+                                 "        \"top_size_partitions\" : null,\n" +
                                  "        \"bloom_filter_false_positives\" : 400,\n" +
                                  "        \"off_heap_memory_used_total\" : \"162470810\",\n" +
                                  "        \"memtable_off_heap_memory_used\" : \"161803398\",\n" +
@@ -419,6 +421,7 @@
                                  "        \"bloom_filter_space_used\" : \"101112\",\n" +
                                  "        \"sstables_in_each_level\" : [ ],\n" +
                                  "        \"compacted_partition_maximum_bytes\" : 20,\n" +
+                                 "        \"sstable_bytes_in_each_level\" : [ ],\n" +
                                  "        \"space_used_total\" : \"0\",\n" +
                                  "        \"local_write_count\" : 0,\n" +
                                  "        \"droppable_tombstone_ratio\" : \"0.66667\",\n" +
@@ -460,6 +463,7 @@
                                  "  tables:\n" +
                                  "    table6:\n" +
                                  "      average_tombstones_per_slice_last_five_minutes: 6.0\n" +
+                                 "      top_tombstone_partitions: null\n" +
                                  "      bloom_filter_off_heap_memory_used: '667408'\n" +
                                  "      bytes_pending_repair: 0\n" +
                                  "      memtable_switch_count: 6\n" +
@@ -475,6 +479,7 @@
                                  "      local_read_count: 5\n" +
                                  "      sstable_compression_ratio: 0.68\n" +
                                  "      dropped_mutations: '666666'\n" +
+                                 "      top_size_partitions: null\n" +
                                  "      bloom_filter_false_positives: 400\n" +
                                  "      off_heap_memory_used_total: '162470810'\n" +
                                  "      memtable_off_heap_memory_used: '161803398'\n" +
@@ -482,6 +487,7 @@
                                  "      bloom_filter_space_used: '101112'\n" +
                                  "      sstables_in_each_level: []\n" +
                                  "      compacted_partition_maximum_bytes: 20\n" +
+                                 "      sstable_bytes_in_each_level: []\n" +
                                  "      space_used_total: '0'\n" +
                                  "      local_write_count: 0\n" +
                                  "      droppable_tombstone_ratio: '0.66667'\n" +
diff --git a/test/unit/org/apache/cassandra/tracing/TracingTest.java b/test/unit/org/apache/cassandra/tracing/TracingTest.java
index 61e08b0..0f181d7 100644
--- a/test/unit/org/apache/cassandra/tracing/TracingTest.java
+++ b/test/unit/org/apache/cassandra/tracing/TracingTest.java
@@ -25,13 +25,13 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
-import java.util.UUID;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.utils.TimeUUID;
 import org.apache.cassandra.utils.progress.ProgressEvent;
 import org.apache.commons.lang3.StringUtils;
 
@@ -88,7 +88,7 @@
     {
         List<String> traces = new ArrayList<>();
         Tracing tracing = new TracingImpl(traces);
-        UUID uuid = tracing.newSession(Tracing.TraceType.NONE);
+        TimeUUID uuid = tracing.newSession(Tracing.TraceType.NONE);
         tracing.begin("test-request", Collections.<String,String>emptyMap());
         tracing.get(uuid).trace("test-1");
         tracing.get(uuid).trace("test-2");
@@ -189,7 +189,7 @@
             return get();
         }
 
-        protected UUID newSession(UUID sessionId, TraceType traceType, Map<String,ByteBuffer> customPayload)
+        protected TimeUUID newSession(TimeUUID sessionId, TraceType traceType, Map<String,ByteBuffer> customPayload)
         {
             if (!customPayload.isEmpty())
                 logger.info("adding custom payload items {}", StringUtils.join(customPayload.keySet(), ','));
@@ -198,7 +198,7 @@
             return super.newSession(sessionId, traceType, customPayload);
         }
 
-        protected TraceState newTraceState(InetAddressAndPort ia, UUID uuid, Tracing.TraceType tt)
+        protected TraceState newTraceState(InetAddressAndPort ia, TimeUUID uuid, Tracing.TraceType tt)
         {
             return new TraceState(ia, uuid, tt)
             {
diff --git a/test/unit/org/apache/cassandra/transport/CQLConnectionTest.java b/test/unit/org/apache/cassandra/transport/CQLConnectionTest.java
index fef25fb..b538417 100644
--- a/test/unit/org/apache/cassandra/transport/CQLConnectionTest.java
+++ b/test/unit/org/apache/cassandra/transport/CQLConnectionTest.java
@@ -30,6 +30,7 @@
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.*;
 
+import org.apache.cassandra.transport.ClientResourceLimits.Overload;
 import org.junit.Before;
 import org.junit.Test;
 import org.slf4j.Logger;
@@ -54,11 +55,15 @@
 import org.apache.cassandra.transport.CQLMessageHandler.MessageConsumer;
 import org.apache.cassandra.transport.messages.*;
 import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.concurrent.SimpleCondition;
+import org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter;
+import org.apache.cassandra.utils.concurrent.Condition;
 
 import static org.apache.cassandra.config.EncryptionOptions.TlsEncryptionPolicy.UNENCRYPTED;
+import static org.apache.cassandra.io.util.FileUtils.ONE_MIB;
 import static org.apache.cassandra.net.FramingTest.randomishBytes;
 import static org.apache.cassandra.transport.Flusher.MAX_FRAMED_PAYLOAD_SIZE;
+import static org.apache.cassandra.utils.concurrent.Condition.newOneTimeCondition;
+import static org.apache.cassandra.utils.concurrent.NonBlockingRateLimiter.NO_OP_LIMITER;
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
@@ -101,6 +106,8 @@
         alloc = GlobalBufferPoolAllocator.instance;
         // set connection-local queue size to 0 so that all capacity is allocated from reserves
         DatabaseDescriptor.setNativeTransportReceiveQueueCapacityInBytes(0);
+        // set transport to max frame size possible
+        DatabaseDescriptor.setNativeTransportMaxFrameSize(256 * (int) ONE_MIB);
     }
 
     @Test
@@ -630,7 +637,7 @@
             this.frameEncoder = frameEncoder;
         }
 
-        public void accept(Channel channel, Message.Request message, Dispatcher.FlushItemConverter toFlushItem)
+        public void accept(Channel channel, Message.Request message, Dispatcher.FlushItemConverter toFlushItem, Overload backpressure)
         {
             if (flusher == null)
                 flusher = new SimpleClient.SimpleFlusher(frameEncoder);
@@ -652,7 +659,7 @@
 
     static class ServerConfigurator extends PipelineConfigurator
     {
-        private final SimpleCondition pipelineReady = new SimpleCondition();
+        private final Condition pipelineReady = newOneTimeCondition();
         private final MessageConsumer<Message.Request> consumer;
         private final AllocationObserver allocationObserver;
         private final Message.Decoder<Message.Request> decoder;
@@ -763,6 +770,12 @@
                     return delegate.endpointWaitQueue();
                 }
 
+                @Override
+                public NonBlockingRateLimiter requestRateLimiter()
+                {
+                    return NO_OP_LIMITER;
+                }
+                
                 public void release()
                 {
                     delegate.release();
diff --git a/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java b/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
index 7f3c9cb..120de2a 100644
--- a/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
+++ b/test/unit/org/apache/cassandra/transport/CQLUserAuditTest.java
@@ -26,7 +26,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
@@ -39,17 +38,18 @@
 import com.datastax.driver.core.PreparedStatement;
 import com.datastax.driver.core.Session;
 import com.datastax.driver.core.exceptions.AuthenticationException;
+import org.apache.cassandra.ServerTestUtils;
 import org.apache.cassandra.audit.AuditEvent;
 import org.apache.cassandra.audit.AuditLogEntryType;
 import org.apache.cassandra.audit.AuditLogManager;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.config.OverrideConfigurationLoader;
 import org.apache.cassandra.config.ParameterizedClass;
-import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.diag.DiagnosticEventService;
 import org.apache.cassandra.locator.InetAddressAndPort;
 import org.apache.cassandra.service.EmbeddedCassandraService;
 
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -57,7 +57,7 @@
 public class CQLUserAuditTest
 {
     private static EmbeddedCassandraService embedded;
-    private static final BlockingQueue<AuditEvent> auditEvents = new LinkedBlockingQueue<>();
+    private static final BlockingQueue<AuditEvent> auditEvents = newBlockingQueue();
 
     @BeforeClass
     public static void setup() throws Exception
@@ -69,11 +69,10 @@
             config.audit_logging_options.enabled = true;
             config.audit_logging_options.logger = new ParameterizedClass("DiagnosticEventAuditLogger", null);
         });
-        CQLTester.prepareServer();
 
         System.setProperty("cassandra.superuser_setup_delay_ms", "0");
-        embedded = new EmbeddedCassandraService();
-        embedded.start();
+
+        embedded = ServerTestUtils.startEmbeddedCassandraService();
 
         executeAs(Arrays.asList("CREATE ROLE testuser WITH LOGIN = true AND SUPERUSER = false AND PASSWORD = 'foo'",
                                 "CREATE ROLE testuser_nologin WITH LOGIN = false AND SUPERUSER = false AND PASSWORD = 'foo'",
@@ -230,9 +229,9 @@
         AuditEvent event = auditEvents.poll(100, TimeUnit.MILLISECONDS);
         assertEquals(expectedAuthType, event.getType());
         assertTrue(!authFailed || event.getType() == AuditLogEntryType.LOGIN_ERROR);
-        assertEquals(InetAddressAndPort.getLoopbackAddress().address,
-                     event.getEntry().getSource().address);
-        assertTrue(event.getEntry().getSource().port > 0);
+        assertEquals(InetAddressAndPort.getLoopbackAddress().getAddress(),
+                     event.getEntry().getSource().getAddress());
+        assertTrue(event.getEntry().getSource().getPort() > 0);
         if (event.getType() != AuditLogEntryType.LOGIN_ERROR)
             assertEquals(username, event.toMap().get("user"));
 
@@ -250,4 +249,4 @@
         auditEvents.drainTo(ret);
         return ret;
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/transport/ClientNotificiationsTest.java b/test/unit/org/apache/cassandra/transport/ClientNotificiationsTest.java
index bd1ec63..9f95784 100644
--- a/test/unit/org/apache/cassandra/transport/ClientNotificiationsTest.java
+++ b/test/unit/org/apache/cassandra/transport/ClientNotificiationsTest.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.transport;
 
 import java.util.Collections;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.Before;
@@ -29,6 +28,8 @@
 
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.locator.InetAddressAndPort;
+import org.apache.cassandra.schema.KeyspaceMetadata;
+import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.service.StorageService;
 import org.apache.cassandra.transport.messages.RegisterMessage;
 import org.apache.cassandra.utils.FBUtilities;
@@ -43,7 +44,7 @@
     @Before
     public void setup()
     {
-        requireNetwork(builder -> builder.withEventNotifier(notifier));
+        requireNetwork(builder -> builder.withEventNotifier(notifier), builder -> {});
     }
 
     @Parameterized.Parameter(0)
@@ -74,6 +75,7 @@
 
             InetAddressAndPort broadcastAddress = FBUtilities.getBroadcastAddressAndPort();
             InetAddressAndPort nativeAddress = FBUtilities.getBroadcastNativeAddressAndPort();
+            KeyspaceMetadata ks = KeyspaceMetadata.create("ks", KeyspaceParams.simple(1));
 
             // Necessary or else the NEW_NODE notification is deferred (CASSANDRA-11038)
             // (note: this works because the notifications are for the local address)
@@ -84,9 +86,9 @@
             notifier.onJoinCluster(broadcastAddress);
             notifier.onMove(broadcastAddress);
             notifier.onLeaveCluster(broadcastAddress);
-            notifier.onCreateKeyspace("ks");
-            notifier.onAlterKeyspace("ks");
-            notifier.onDropKeyspace("ks");
+            notifier.onCreateKeyspace(ks);
+            notifier.onAlterKeyspace(ks, ks);
+            notifier.onDropKeyspace(ks, true);
 
             handler.assertNextEvent(Event.StatusChange.nodeUp(nativeAddress));
             handler.assertNextEvent(Event.StatusChange.nodeDown(nativeAddress));
diff --git a/test/unit/org/apache/cassandra/transport/ClientResourceLimitsTest.java b/test/unit/org/apache/cassandra/transport/ClientResourceLimitsTest.java
index 9cc900a..8e94997 100644
--- a/test/unit/org/apache/cassandra/transport/ClientResourceLimitsTest.java
+++ b/test/unit/org/apache/cassandra/transport/ClientResourceLimitsTest.java
@@ -19,7 +19,6 @@
 package org.apache.cassandra.transport;
 
 import java.io.IOException;
-import java.util.Map;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.CyclicBarrier;
 import java.util.concurrent.TimeUnit;
@@ -29,9 +28,9 @@
 
 import com.google.common.collect.ImmutableList;
 import com.google.common.primitives.Ints;
+import org.apache.cassandra.service.StorageService;
 import org.junit.*;
 
-import com.codahale.metrics.Gauge;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.cql3.CQLTester;
 import org.apache.cassandra.cql3.QueryOptions;
@@ -40,13 +39,11 @@
 import org.apache.cassandra.db.marshal.UTF8Type;
 import org.apache.cassandra.db.virtual.*;
 import org.apache.cassandra.exceptions.OverloadedException;
-import org.apache.cassandra.metrics.CassandraMetricsRegistry;
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.transport.messages.QueryMessage;
 import org.apache.cassandra.utils.FBUtilities;
 import org.awaitility.Awaitility;
 
-import static org.apache.cassandra.Util.spinAssertEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -55,36 +52,34 @@
 
 public class ClientResourceLimitsTest extends CQLTester
 {
-
     private static final long LOW_LIMIT = 600L;
     private static final long HIGH_LIMIT = 5000000000L;
 
-    private static final QueryOptions V5_DEFAULT_OPTIONS = QueryOptions.create(
-        QueryOptions.DEFAULT.getConsistency(),
-        QueryOptions.DEFAULT.getValues(),
-        QueryOptions.DEFAULT.skipMetadata(),
-        QueryOptions.DEFAULT.getPageSize(),
-        QueryOptions.DEFAULT.getPagingState(),
-        QueryOptions.DEFAULT.getSerialConsistency(),
-        ProtocolVersion.V5,
-        KEYSPACE);
+    private static final QueryOptions V5_DEFAULT_OPTIONS = 
+        QueryOptions.create(QueryOptions.DEFAULT.getConsistency(),
+                            QueryOptions.DEFAULT.getValues(),
+                            QueryOptions.DEFAULT.skipMetadata(),
+                            QueryOptions.DEFAULT.getPageSize(),
+                            QueryOptions.DEFAULT.getPagingState(),
+                            QueryOptions.DEFAULT.getSerialConsistency(),
+                            ProtocolVersion.V5,
+                            KEYSPACE);
 
     @BeforeClass
     public static void setUp()
     {
         DatabaseDescriptor.setNativeTransportReceiveQueueCapacityInBytes(1);
-        DatabaseDescriptor.setNativeTransportMaxConcurrentRequestsInBytesPerIp(LOW_LIMIT);
-        DatabaseDescriptor.setNativeTransportMaxConcurrentRequestsInBytes(LOW_LIMIT);
+        DatabaseDescriptor.setNativeTransportMaxRequestDataInFlightPerIpInBytes(LOW_LIMIT);
+        DatabaseDescriptor.setNativeTransportConcurrentRequestDataInFlightInBytes(LOW_LIMIT);
 
-        // The driver control connections would send queries that might interfere with the tests.
-        requireNetworkWithoutDriver();
+        requireNetwork();
     }
 
     @AfterClass
     public static void tearDown()
     {
-        DatabaseDescriptor.setNativeTransportMaxConcurrentRequestsInBytesPerIp(3000000000L);
-        DatabaseDescriptor.setNativeTransportMaxConcurrentRequestsInBytes(HIGH_LIMIT);
+        DatabaseDescriptor.setNativeTransportMaxRequestDataInFlightPerIpInBytes(3000000000L);
+        DatabaseDescriptor.setNativeTransportConcurrentRequestDataInFlightInBytes(HIGH_LIMIT);
     }
 
     @Before
@@ -124,7 +119,7 @@
         }
     }
 
-    @SuppressWarnings("resource")
+    @SuppressWarnings({"resource", "SameParameterValue"})
     private SimpleClient client(boolean throwOnOverload, int largeMessageThreshold)
     {
         try
@@ -184,27 +179,34 @@
                          (provider) -> provider.endpointWaitQueue().signal());
     }
 
-    private void backPressureTest(Runnable limitLifter, Consumer<ClientResourceLimits.ResourceProvider> signaller)
-    throws Throwable
+    private void backPressureTest(Runnable limitLifter, Consumer<ClientResourceLimits.ResourceProvider> signaller) throws Throwable
     {
         final AtomicReference<Exception> error = new AtomicReference<>();
         final CountDownLatch started = new CountDownLatch(1);
         final CountDownLatch complete = new CountDownLatch(1);
-        try(SimpleClient client = client(false))
+        
+        try (SimpleClient client = client(false))
         {
-            QueryMessage queryMessage = new QueryMessage("CREATE TABLE atable (pk int PRIMARY KEY, v text)",
-                                                         V5_DEFAULT_OPTIONS);
-            client.execute(queryMessage);
+            // The first query does not trigger backpressure/pause the connection:
+            QueryMessage queryMessage = 
+                    new QueryMessage("CREATE TABLE atable (pk int PRIMARY KEY, v text)", V5_DEFAULT_OPTIONS);
+            Message.Response belowThresholdResponse = client.execute(queryMessage);
+            assertEquals(0, getPausedConnectionsGauge().getValue().intValue());
+            assertNoWarningContains(belowThresholdResponse, "bytes in flight");
+            
+            // A second query triggers backpressure but is allowed to complete...
+            Message.Response aboveThresholdResponse = client.execute(queryMessage());
+            assertEquals(1, getPausedConnectionsGauge().getValue().intValue());
+            assertWarningsContain(aboveThresholdResponse, "bytes in flight");
 
-            // There should be no paused client connections yet
-            Gauge<Integer> pausedConnections = getPausedConnectionsGauge();
-            int before = pausedConnections.getValue();
-
+            // ...and a third request is paused.
+            final AtomicReference<Message.Response> response = new AtomicReference<>();
+            
             Thread t = new Thread(() -> {
                 try
                 {
                     started.countDown();
-                    client.execute(queryMessage());
+                    response.set(client.execute(queryMessage()));
                     complete.countDown();
                 }
                 catch (Exception e)
@@ -216,19 +218,13 @@
             });
             t.start();
 
-            // When the client attempts to execute the second query, the backpressure
-            // mechanism should report the client connection is paused
-            assertTrue(started.await(5, TimeUnit.SECONDS));
-            spinAssertEquals("Timed out after waiting 5 seconds for paused " +
-                             "connections metric to increment due to backpressure",
-                             before + 1, pausedConnections::getValue, 5, TimeUnit.SECONDS);
-
             // verify the request hasn't completed
             assertFalse(complete.await(1, TimeUnit.SECONDS));
 
             // backpressure has been applied, if we increase the limits of the exhausted reserve and signal
             // the appropriate WaitQueue, it should be released and the client request will complete
             limitLifter.run();
+            
             // We need a ResourceProvider to get access to the WaitQueue
             ClientResourceLimits.Allocator allocator = ClientResourceLimits.getAllocatorForEndpoint(FBUtilities.getJustLocalAddress());
             ClientResourceLimits.ResourceProvider queueHandle = new ClientResourceLimits.ResourceProvider.Default(allocator);
@@ -237,8 +233,10 @@
             // SimpleClient has a 10 second timeout, so if we have to wait
             // longer than that assume that we're not going to receive a
             // reply. If all's well, the completion should happen immediately
-            assertTrue(complete.await(11, TimeUnit.SECONDS));
+            assertTrue(complete.await(SimpleClient.TIMEOUT_SECONDS + 1, TimeUnit.SECONDS));
             assertNull(error.get());
+            assertEquals(0, getPausedConnectionsGauge().getValue().intValue());
+            assertNoWarningContains(response.get(), "bytes in flight");
         }
     }
 
@@ -304,17 +302,6 @@
         return new QueryMessage(query.toString(), V5_DEFAULT_OPTIONS);
     }
 
-    @SuppressWarnings({"rawtypes", "unchecked"})
-    private Gauge<Integer> getPausedConnectionsGauge()
-    {
-        String metricName = "org.apache.cassandra.metrics.Client.PausedConnections";
-        Map<String, Gauge> metrics = CassandraMetricsRegistry.Metrics.getGauges((name, metric) -> name.equals(metricName));
-        if (metrics.size() != 1)
-            fail(String.format("Expected a single registered metric for paused client connections, found %s",
-                               metrics.size()));
-        return metrics.get(metricName);
-    }
-
     @Test
     public void testQueryUpdatesConcurrentMetricsUpdate() throws Throwable
     {
@@ -395,7 +382,7 @@
             // change global limit, query will still fail because endpoint limit
             ClientResourceLimits.setGlobalLimit(HIGH_LIMIT);
             Assert.assertEquals("new global limit not returned by EndpointPayloadTrackers", HIGH_LIMIT, ClientResourceLimits.getGlobalLimit());
-            Assert.assertEquals("new global limit not returned by DatabaseDescriptor", HIGH_LIMIT, DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytes());
+            Assert.assertEquals("new global limit not returned by DatabaseDescriptor", HIGH_LIMIT, DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightInBytes());
 
             try
             {
@@ -410,7 +397,7 @@
             // change endpoint limit, query will now succeed
             ClientResourceLimits.setEndpointLimit(HIGH_LIMIT);
             Assert.assertEquals("new endpoint limit not returned by EndpointPayloadTrackers", HIGH_LIMIT, ClientResourceLimits.getEndpointLimit());
-            Assert.assertEquals("new endpoint limit not returned by DatabaseDescriptor", HIGH_LIMIT, DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytesPerIp());
+            Assert.assertEquals("new endpoint limit not returned by DatabaseDescriptor", HIGH_LIMIT, DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightPerIpInBytes());
             client.execute(queryMessage());
 
             // ensure new clients also see the new raised limits
@@ -421,7 +408,7 @@
             // lower the global limit and ensure the query fails again
             ClientResourceLimits.setGlobalLimit(LOW_LIMIT);
             Assert.assertEquals("new global limit not returned by EndpointPayloadTrackers", LOW_LIMIT, ClientResourceLimits.getGlobalLimit());
-            Assert.assertEquals("new global limit not returned by DatabaseDescriptor", LOW_LIMIT, DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytes());
+            Assert.assertEquals("new global limit not returned by DatabaseDescriptor", LOW_LIMIT, DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightInBytes());
             try
             {
                 client.execute(queryMessage());
@@ -435,7 +422,7 @@
             // lower the endpoint limit and ensure existing clients also have requests that fail
             ClientResourceLimits.setEndpointLimit(60);
             Assert.assertEquals("new endpoint limit not returned by EndpointPayloadTrackers", 60, ClientResourceLimits.getEndpointLimit());
-            Assert.assertEquals("new endpoint limit not returned by DatabaseDescriptor", 60, DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytesPerIp());
+            Assert.assertEquals("new endpoint limit not returned by DatabaseDescriptor", 60, DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightPerIpInBytes());
             try
             {
                 client.execute(smallMessage);
@@ -462,11 +449,30 @@
             // put the test state back
             ClientResourceLimits.setEndpointLimit(LOW_LIMIT);
             Assert.assertEquals("new endpoint limit not returned by EndpointPayloadTrackers", LOW_LIMIT, ClientResourceLimits.getEndpointLimit());
-            Assert.assertEquals("new endpoint limit not returned by DatabaseDescriptor", LOW_LIMIT, DatabaseDescriptor.getNativeTransportMaxConcurrentRequestsInBytesPerIp());
+            Assert.assertEquals("new endpoint limit not returned by DatabaseDescriptor", LOW_LIMIT, DatabaseDescriptor.getNativeTransportMaxRequestDataInFlightPerIpInBytes());
         }
         finally
         {
             client.close();
         }
     }
+
+    @Test
+    public void shouldChangeRequestsPerSecondAtRuntime()
+    {
+        StorageService.instance.setNativeTransportMaxRequestsPerSecond(100);
+        assertEquals(100, ClientResourceLimits.getNativeTransportMaxRequestsPerSecond(), 0);
+        assertEquals(100, ClientResourceLimits.GLOBAL_REQUEST_LIMITER.getRate(), 0);
+        assertEquals(100, StorageService.instance.getNativeTransportMaxRequestsPerSecond());
+
+        StorageService.instance.setNativeTransportMaxRequestsPerSecond(1000);
+        assertEquals(1000, ClientResourceLimits.getNativeTransportMaxRequestsPerSecond(), 0);
+        assertEquals(1000, ClientResourceLimits.GLOBAL_REQUEST_LIMITER.getRate(), 0);
+        assertEquals(1000, StorageService.instance.getNativeTransportMaxRequestsPerSecond());
+
+        StorageService.instance.setNativeTransportMaxRequestsPerSecond(500);
+        assertEquals(500, ClientResourceLimits.getNativeTransportMaxRequestsPerSecond(), 0);
+        assertEquals(500, ClientResourceLimits.GLOBAL_REQUEST_LIMITER.getRate(), 0);
+        assertEquals(500, StorageService.instance.getNativeTransportMaxRequestsPerSecond());
+    }
 }
diff --git a/test/unit/org/apache/cassandra/transport/ErrorMessageTest.java b/test/unit/org/apache/cassandra/transport/ErrorMessageTest.java
index cfeddba..c0e3f5e 100644
--- a/test/unit/org/apache/cassandra/transport/ErrorMessageTest.java
+++ b/test/unit/org/apache/cassandra/transport/ErrorMessageTest.java
@@ -101,7 +101,7 @@
         int contentions = 1;
         int receivedBlockFor = 3;
         ConsistencyLevel consistencyLevel = ConsistencyLevel.SERIAL;
-        CasWriteTimeoutException ex = new CasWriteTimeoutException(WriteType.CAS, consistencyLevel, receivedBlockFor, receivedBlockFor, contentions);
+        CasWriteTimeoutException ex = new CasWriteTimeoutException(WriteType.CAS, consistencyLevel, 0, receivedBlockFor, contentions);
 
         ErrorMessage deserialized = encodeThenDecode(ErrorMessage.fromException(ex), ProtocolVersion.V5);
         assertTrue(deserialized.error instanceof CasWriteTimeoutException);
@@ -110,10 +110,10 @@
         assertEquals(WriteType.CAS, deserializedEx.writeType);
         assertEquals(contentions, deserializedEx.contentions);
         assertEquals(consistencyLevel, deserializedEx.consistency);
-        assertEquals(receivedBlockFor, deserializedEx.received);
+        assertEquals(0, deserializedEx.received);
         assertEquals(receivedBlockFor, deserializedEx.blockFor);
         assertEquals(ex.getMessage(), deserializedEx.getMessage());
-        assertTrue(deserializedEx.getMessage().contains("CAS operation timed out - encountered contentions"));
+        assertTrue(deserializedEx.getMessage().contains("CAS operation timed out: received 0 of 3 required responses after 1 contention retries"));
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/transport/RateLimitingTest.java b/test/unit/org/apache/cassandra/transport/RateLimitingTest.java
new file mode 100644
index 0000000..0b3fb34
--- /dev/null
+++ b/test/unit/org/apache/cassandra/transport/RateLimitingTest.java
@@ -0,0 +1,331 @@
+/*
+ * 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.transport;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.stream.Collectors;
+
+import com.codahale.metrics.Meter;
+import com.google.common.base.Ticker;
+import org.awaitility.Awaitility;
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.cql3.CQLTester;
+import org.apache.cassandra.cql3.QueryOptions;
+import org.apache.cassandra.exceptions.OverloadedException;
+import org.apache.cassandra.metrics.CassandraMetricsRegistry;
+import org.apache.cassandra.service.StorageService;
+import org.apache.cassandra.transport.messages.QueryMessage;
+import org.apache.cassandra.utils.Throwables;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import static org.apache.cassandra.Util.spinAssertEquals;
+import static org.apache.cassandra.transport.ProtocolVersion.V4;
+
+@SuppressWarnings("UnstableApiUsage")
+@RunWith(Parameterized.class)
+public class RateLimitingTest extends CQLTester
+{
+    public static final String BACKPRESSURE_WARNING_SNIPPET = "Request breached global limit";
+    
+    private static final int LARGE_PAYLOAD_THRESHOLD_BYTES = 1000;
+    private static final int OVERLOAD_PERMITS_PER_SECOND = 1;
+
+    private static final long MAX_LONG_CONFIG_VALUE = Long.MAX_VALUE - 1;
+
+    @Parameterized.Parameter
+    public ProtocolVersion version;
+
+    @Parameterized.Parameters(name="{0}")
+    public static Collection<Object[]> versions()
+    {
+        return ProtocolVersion.SUPPORTED.stream()
+                                        .map(v -> new Object[]{v})
+                                        .collect(Collectors.toList());
+    }
+
+    private AtomicLong tick;
+    private Ticker ticker;
+
+    @BeforeClass
+    public static void setup()
+    {
+        // If we don't exceed the queue capacity, we won't actually use the global/endpoint 
+        // bytes-in-flight limits, and the assertions we make below around releasing them would be useless.
+        DatabaseDescriptor.setNativeTransportReceiveQueueCapacityInBytes(1);
+
+        requireNetwork();
+    }
+
+    @Before
+    public void resetLimits()
+    {
+        // Reset to the original start time in case a test advances the clock.
+        tick = new AtomicLong(ClientResourceLimits.GLOBAL_REQUEST_LIMITER.getStartedNanos());
+
+        ticker = new Ticker()
+        {
+            @Override
+            public long read()
+            {
+                return tick.get();
+            }
+        };
+
+        ClientResourceLimits.setGlobalLimit(MAX_LONG_CONFIG_VALUE);
+    }
+
+    @Test
+    public void shouldThrowOnOverloadSmallMessages() throws Exception
+    {
+        int payloadSize = LARGE_PAYLOAD_THRESHOLD_BYTES / 4;
+        testOverload(payloadSize, true);
+    }
+
+    @Test
+    public void shouldThrowOnOverloadLargeMessages() throws Exception
+    {
+        int payloadSize = LARGE_PAYLOAD_THRESHOLD_BYTES * 2;
+        testOverload(payloadSize, true);
+    }
+
+    @Test
+    public void shouldBackpressureSmallMessages() throws Exception
+    {
+        int payloadSize = LARGE_PAYLOAD_THRESHOLD_BYTES / 4;
+        testOverload(payloadSize, false);
+    }
+
+    @Test
+    public void shouldBackpressureLargeMessages() throws Exception
+    {
+        int payloadSize = LARGE_PAYLOAD_THRESHOLD_BYTES * 2;
+        testOverload(payloadSize, false);
+    }
+
+    @Test
+    public void shouldReleaseSmallMessageOnBytesInFlightOverload() throws Exception
+    {
+        testBytesInFlightOverload(LARGE_PAYLOAD_THRESHOLD_BYTES / 4);
+    }
+
+    @Test
+    public void shouldReleaseLargeMessageOnBytesInFlightOverload() throws Exception
+    {
+        testBytesInFlightOverload(LARGE_PAYLOAD_THRESHOLD_BYTES * 2);
+    }
+
+    private void testBytesInFlightOverload(int payloadSize) throws Exception
+    {
+        try (SimpleClient client = client().connect(false, true))
+        {
+            StorageService.instance.setNativeTransportRateLimitingEnabled(false);
+            QueryMessage queryMessage = new QueryMessage("CREATE TABLE IF NOT EXISTS " + KEYSPACE + ".atable (pk int PRIMARY KEY, v text)", queryOptions());
+            client.execute(queryMessage);
+
+            StorageService.instance.setNativeTransportRateLimitingEnabled(true);
+            ClientResourceLimits.GLOBAL_REQUEST_LIMITER.setRate(OVERLOAD_PERMITS_PER_SECOND, ticker);
+            ClientResourceLimits.setGlobalLimit(1);
+
+            try
+            {
+                // The first query takes the one available permit, but should fail on the bytes in flight limit.
+                client.execute(queryMessage(payloadSize));
+            }
+            catch (RuntimeException e)
+            {
+                assertTrue(Throwables.anyCauseMatches(e, cause -> cause instanceof OverloadedException));
+            }
+        }
+        finally
+        {
+            // Sanity check bytes in flight limiter.
+            Awaitility.await().untilAsserted(() -> assertEquals(0, ClientResourceLimits.getCurrentGlobalUsage()));
+            StorageService.instance.setNativeTransportRateLimitingEnabled(false);
+        }
+    }
+
+    private void testOverload(int payloadSize, boolean throwOnOverload) throws Exception
+    {
+        try (SimpleClient client = client().connect(false, throwOnOverload))
+        {
+            StorageService.instance.setNativeTransportRateLimitingEnabled(false);
+            QueryMessage queryMessage = new QueryMessage("CREATE TABLE IF NOT EXISTS " + KEYSPACE + ".atable (pk int PRIMARY KEY, v text)", queryOptions());
+            client.execute(queryMessage);
+
+            StorageService.instance.setNativeTransportRateLimitingEnabled(true);
+            ClientResourceLimits.GLOBAL_REQUEST_LIMITER.setRate(OVERLOAD_PERMITS_PER_SECOND, ticker);
+
+            if (throwOnOverload)
+                testThrowOnOverload(payloadSize, client);
+            else
+            {
+                testBackpressureOnOverload(payloadSize, client);
+            }   
+        }
+        finally
+        {
+            // Sanity the check bytes in flight limiter.
+            Awaitility.await().untilAsserted(() -> assertEquals(0, ClientResourceLimits.getCurrentGlobalUsage()));
+            StorageService.instance.setNativeTransportRateLimitingEnabled(false);
+        }
+    }
+
+    private void testBackpressureOnOverload(int payloadSize, SimpleClient client) throws Exception
+    {
+        // The first query takes the one available permit.
+        Message.Response firstResponse = client.execute(queryMessage(payloadSize));
+        assertEquals(0, getPausedConnectionsGauge().getValue().intValue());
+        assertNoWarningContains(firstResponse, BACKPRESSURE_WARNING_SNIPPET);
+        
+        // The second query activates backpressure.
+        long overloadQueryStartTime = System.currentTimeMillis();
+        Message.Response response = client.execute(queryMessage(payloadSize));
+
+        // V3 does not support client warnings, but otherwise we should get one for this query.
+        if (version.isGreaterOrEqualTo(V4))
+            assertWarningsContain(response, BACKPRESSURE_WARNING_SNIPPET);
+
+        AtomicReference<Throwable> error = new AtomicReference<>();
+        CountDownLatch started = new CountDownLatch(1);
+        CountDownLatch complete = new CountDownLatch(1);
+        AtomicReference<Message.Response> pausedQueryResponse = new AtomicReference<>();
+        
+        Thread queryRunner = new Thread(() ->
+        {
+            try
+            {
+                started.countDown();
+                pausedQueryResponse.set(client.execute(queryMessage(payloadSize)));
+                complete.countDown();
+            }
+            catch (Throwable t)
+            {
+                error.set(t);
+            }
+        });
+
+        // Advance the rater limiter so that this query will see an available permit. This also
+        // means it should not produce a client warning, which we verify below.
+        // (Note that we advance 2 intervals for the 2 prior queries.)
+        tick.addAndGet(2 * ClientResourceLimits.GLOBAL_REQUEST_LIMITER.getIntervalNanos());
+        
+        queryRunner.start();
+
+        // ...and the request should complete without error.
+        assertTrue(complete.await(SimpleClient.TIMEOUT_SECONDS + 1, TimeUnit.SECONDS));
+        assertNull(error.get());
+        assertNoWarningContains(pausedQueryResponse.get(), BACKPRESSURE_WARNING_SNIPPET);
+
+        // At least the number of milliseconds in the permit interval should already have elapsed 
+        // since the start of the query that pauses the connection.
+        double permitIntervalMillis = (double) TimeUnit.SECONDS.toMillis(1L) / OVERLOAD_PERMITS_PER_SECOND;
+        long sinceQueryStarted = System.currentTimeMillis() - overloadQueryStartTime;
+        long remainingMillis = ((long) permitIntervalMillis) - sinceQueryStarted;
+        assertTrue("Query completed before connection unpause!", remainingMillis <= 0);
+        
+        spinAssertEquals("Timed out after waiting 5 seconds for paused connections metric to normalize.",
+                         0, () -> getPausedConnectionsGauge().getValue(), 5, TimeUnit.SECONDS);
+    }
+
+    private void testThrowOnOverload(int payloadSize, SimpleClient client)
+    {
+        // The first query takes the one available permit...
+        long dispatchedPrior = getRequestDispatchedMeter().getCount();
+        client.execute(queryMessage(payloadSize));
+        assertEquals(dispatchedPrior + 1, getRequestDispatchedMeter().getCount());
+        
+        try
+        {   
+            // ...and the second breaches the limit....
+            client.execute(queryMessage(payloadSize));
+        }
+        catch (RuntimeException e)
+        {
+            assertTrue(Throwables.anyCauseMatches(e, cause -> cause instanceof OverloadedException));
+        }
+
+        // The last request attempt was rejected and therefore not dispatched.
+        assertEquals(dispatchedPrior + 1, getRequestDispatchedMeter().getCount());
+
+        // Advance the timeline and verify that we can take a permit again.
+        // (Note that we don't take one when we throw on overload.)
+        tick.addAndGet(ClientResourceLimits.GLOBAL_REQUEST_LIMITER.getIntervalNanos());
+        client.execute(queryMessage(payloadSize));
+
+        assertEquals(dispatchedPrior + 2, getRequestDispatchedMeter().getCount());
+    }
+
+    private QueryMessage queryMessage(int length)
+    {
+        StringBuilder query = new StringBuilder("INSERT INTO " + KEYSPACE + ".atable (pk, v) VALUES (1, '");
+        
+        for (int i = 0; i < length; i++)
+        {
+            query.append('a');
+        }
+        
+        query.append("')");
+        return new QueryMessage(query.toString(), queryOptions());
+    }
+
+    private SimpleClient client()
+    {
+        return SimpleClient.builder(nativeAddr.getHostAddress(), nativePort)
+                           .protocolVersion(version)
+                           .useBeta()
+                           .largeMessageThreshold(LARGE_PAYLOAD_THRESHOLD_BYTES)
+                           .build();
+    }
+
+    private QueryOptions queryOptions()
+    {
+        return QueryOptions.create(QueryOptions.DEFAULT.getConsistency(),
+                                   QueryOptions.DEFAULT.getValues(),
+                                   QueryOptions.DEFAULT.skipMetadata(),
+                                   QueryOptions.DEFAULT.getPageSize(),
+                                   QueryOptions.DEFAULT.getPagingState(),
+                                   QueryOptions.DEFAULT.getSerialConsistency(),
+                                   version,
+                                   KEYSPACE);
+    }
+
+    protected static Meter getRequestDispatchedMeter()
+    {
+        String metricName = "org.apache.cassandra.metrics.Client.RequestDispatched";
+        Map<String, Meter> metrics = CassandraMetricsRegistry.Metrics.getMeters((name, metric) -> name.equals(metricName));
+        if (metrics.size() != 1)
+            fail(String.format("Expected a single registered metric for request dispatched, found %s",metrics.size()));
+        return metrics.get(metricName);
+    }
+}
diff --git a/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java b/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java
index 199e637..257d0c2 100644
--- a/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java
+++ b/test/unit/org/apache/cassandra/triggers/TriggerExecutorTest.java
@@ -34,13 +34,11 @@
 import org.apache.cassandra.exceptions.InvalidRequestException;
 import org.apache.cassandra.schema.TriggerMetadata;
 import org.apache.cassandra.schema.Triggers;
-import org.apache.cassandra.triggers.TriggerExecutorTest.SameKeySameCfTrigger;
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.bytes;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
 
 public class TriggerExecutorTest
 {
diff --git a/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java b/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java
index 31111bd..6b875a3 100644
--- a/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java
+++ b/test/unit/org/apache/cassandra/triggers/TriggersSchemaTest.java
@@ -22,23 +22,24 @@
 
 import org.apache.cassandra.SchemaLoader;
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
-import org.apache.cassandra.schema.TableMetadata;
-import org.apache.cassandra.schema.Schema;
 import org.apache.cassandra.exceptions.ConfigurationException;
+import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTestUtil;
+import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.schema.KeyspaceMetadata;
 import org.apache.cassandra.schema.KeyspaceParams;
 import org.apache.cassandra.schema.Tables;
 import org.apache.cassandra.schema.TriggerMetadata;
 import org.apache.cassandra.schema.Triggers;
-import org.apache.cassandra.schema.MigrationManager;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.*;
 
 public class TriggersSchemaTest
 {
-    String ksName = "ks" + System.nanoTime();
-    String cfName = "cf" + System.nanoTime();
-    String triggerName = "trigger_" + System.nanoTime();
+    String ksName = "ks" + nanoTime();
+    String cfName = "cf" + nanoTime();
+    String triggerName = "trigger_" + nanoTime();
     String triggerClass = "org.apache.cassandra.triggers.NoSuchTrigger.class";
 
     @BeforeClass
@@ -57,7 +58,7 @@
                                 .build();
 
         KeyspaceMetadata ksm = KeyspaceMetadata.create(ksName, KeyspaceParams.simple(1), Tables.of(tm));
-        MigrationManager.announceNewKeyspace(ksm);
+        SchemaTestUtil.announceNewKeyspace(ksm);
 
         TableMetadata tm2 = Schema.instance.getTableMetadata(ksName, cfName);
         assertFalse(tm2.triggers.isEmpty());
@@ -69,14 +70,14 @@
     public void addNewCfWithTriggerToKs() throws Exception
     {
         KeyspaceMetadata ksm = KeyspaceMetadata.create(ksName, KeyspaceParams.simple(1));
-        MigrationManager.announceNewKeyspace(ksm);
+        SchemaTestUtil.announceNewKeyspace(ksm);
 
         TableMetadata metadata =
             CreateTableStatement.parse(String.format("CREATE TABLE %s (k int PRIMARY KEY, v int)", cfName), ksName)
                                 .triggers(Triggers.of(TriggerMetadata.create(triggerName, triggerClass)))
                                 .build();
 
-        MigrationManager.announceNewTable(metadata);
+        SchemaTestUtil.announceNewTable(metadata);
 
         metadata = Schema.instance.getTableMetadata(ksName, cfName);
         assertFalse(metadata.triggers.isEmpty());
@@ -91,7 +92,7 @@
             CreateTableStatement.parse(String.format("CREATE TABLE %s (k int PRIMARY KEY, v int)", cfName), ksName)
                                 .build();
         KeyspaceMetadata ksm = KeyspaceMetadata.create(ksName, KeyspaceParams.simple(1), Tables.of(tm1));
-        MigrationManager.announceNewKeyspace(ksm);
+        SchemaTestUtil.announceNewKeyspace(ksm);
 
         TriggerMetadata td = TriggerMetadata.create(triggerName, triggerClass);
         TableMetadata tm2 =
@@ -100,7 +101,7 @@
                   .unbuild()
                   .triggers(Triggers.of(td))
                   .build();
-        MigrationManager.announceTableUpdate(tm2);
+        SchemaTestUtil.announceTableUpdate(tm2);
 
         TableMetadata tm3 = Schema.instance.getTableMetadata(ksName, cfName);
         assertFalse(tm3.triggers.isEmpty());
@@ -117,14 +118,14 @@
                                 .triggers(Triggers.of(td))
                                 .build();
         KeyspaceMetadata ksm = KeyspaceMetadata.create(ksName, KeyspaceParams.simple(1), Tables.of(tm));
-        MigrationManager.announceNewKeyspace(ksm);
+        SchemaTestUtil.announceNewKeyspace(ksm);
 
         TableMetadata tm1 = Schema.instance.getTableMetadata(ksName, cfName);
         TableMetadata tm2 =
             tm1.unbuild()
                .triggers(tm1.triggers.without(triggerName))
                .build();
-        MigrationManager.announceTableUpdate(tm2);
+        SchemaTestUtil.announceTableUpdate(tm2);
 
         TableMetadata tm3 = Schema.instance.getTableMetadata(ksName, cfName);
         assertTrue(tm3.triggers.isEmpty());
diff --git a/test/unit/org/apache/cassandra/triggers/TriggersTest.java b/test/unit/org/apache/cassandra/triggers/TriggersTest.java
index 2cf0e84..892a022 100644
--- a/test/unit/org/apache/cassandra/triggers/TriggersTest.java
+++ b/test/unit/org/apache/cassandra/triggers/TriggersTest.java
@@ -29,8 +29,6 @@
 import org.apache.cassandra.cql3.QueryProcessor;
 import org.apache.cassandra.cql3.UntypedResultSet;
 import org.apache.cassandra.db.*;
-import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.db.Mutation;
 import org.apache.cassandra.db.partitions.Partition;
 import org.apache.cassandra.exceptions.ConfigurationException;
 import org.apache.cassandra.exceptions.RequestExecutionException;
@@ -38,6 +36,7 @@
 import org.apache.cassandra.utils.FBUtilities;
 
 import static org.apache.cassandra.utils.ByteBufferUtil.toInt;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
@@ -123,7 +122,7 @@
     @Test(expected=org.apache.cassandra.exceptions.InvalidRequestException.class)
     public void onCqlUpdateWithConditionsRejectGeneratedUpdatesForDifferentPartition() throws Exception
     {
-        String cf = "cf" + System.nanoTime();
+        String cf = "cf" + nanoTime();
         try
         {
             setupTableWithTrigger(cf, CrossPartitionTrigger.class);
@@ -139,7 +138,7 @@
     @Test(expected=org.apache.cassandra.exceptions.InvalidRequestException.class)
     public void onCqlUpdateWithConditionsRejectGeneratedUpdatesForDifferentTable() throws Exception
     {
-        String cf = "cf" + System.nanoTime();
+        String cf = "cf" + nanoTime();
         try
         {
             setupTableWithTrigger(cf, CrossTableTrigger.class);
@@ -155,7 +154,7 @@
     @Test(expected=org.apache.cassandra.exceptions.InvalidRequestException.class)
     public void ifTriggerThrowsErrorNoMutationsAreApplied() throws Exception
     {
-        String cf = "cf" + System.nanoTime();
+        String cf = "cf" + nanoTime();
         try
         {
             setupTableWithTrigger(cf, ErrorTrigger.class);
diff --git a/test/unit/org/apache/cassandra/utils/AbstractIteratorTest.java b/test/unit/org/apache/cassandra/utils/AbstractIteratorTest.java
index 8119dcb..c6b49d9 100644
--- a/test/unit/org/apache/cassandra/utils/AbstractIteratorTest.java
+++ b/test/unit/org/apache/cassandra/utils/AbstractIteratorTest.java
@@ -389,4 +389,4 @@
     private static class SomeUncheckedException extends RuntimeException
     {
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/utils/AssertionUtils.java b/test/unit/org/apache/cassandra/utils/AssertionUtils.java
new file mode 100644
index 0000000..d5b1981
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/AssertionUtils.java
@@ -0,0 +1,124 @@
+/*
+ * 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.utils;
+
+import com.google.common.base.Throwables;
+
+import org.assertj.core.api.Condition;
+
+public class AssertionUtils
+{
+    private AssertionUtils()
+    {
+    }
+
+    /**
+     * When working with jvm-dtest the thrown error is in a different {@link ClassLoader} causing type checks
+     * to fail; this method relies on naming instead.
+     */
+    public static Condition<Object> is(Class<?> klass)
+    {
+        String name = klass.getCanonicalName();
+        return new Condition<Object>() {
+            @Override
+            public boolean matches(Object value)
+            {
+                return value.getClass().getCanonicalName().equals(name);
+            }
+
+            @Override
+            public String toString()
+            {
+                return name;
+            }
+        };
+    }
+
+    public static <T extends Throwable> Condition<Throwable> isThrowable(Class<T> klass)
+    {
+        // org.assertj.core.api.AbstractAssert.is has <? super ? extends Throwable> which blocks <T>, so need to
+        // always return Throwable
+        return (Condition<Throwable>) (Condition<?>) is(klass);
+    }
+
+    /**
+     * When working with jvm-dtest the thrown error is in a different {@link ClassLoader} causing type checks
+     * to fail; this method relies on naming instead.
+     *
+     * This method is different than {@link #is(Class)} as it tries to mimic instanceOf rather than equality.
+     */
+    public static Condition<Object> isInstanceof(Class<?> klass)
+    {
+        String name = klass.getCanonicalName();
+        return new Condition<Object>() {
+            @Override
+            public boolean matches(Object value)
+            {
+                if (value == null)
+                    return false;
+                return matches(value.getClass());
+            }
+
+            private boolean matches(Class<?> input)
+            {
+                for (Class<?> klass = input; klass != null; klass = klass.getSuperclass())
+                {
+                    // extends
+                    if (klass.getCanonicalName().equals(name))
+                        return true;
+                    // implements
+                    for (Class<?> i : klass.getInterfaces())
+                    {
+                        if (matches(i))
+                            return true;
+                    }
+                }
+                return false;
+            }
+
+            @Override
+            public String toString()
+            {
+                return name;
+            }
+        };
+    }
+
+    public static Condition<Throwable> rootCause(Condition<Throwable> other)
+    {
+        return new Condition<Throwable>() {
+            @Override
+            public boolean matches(Throwable value)
+            {
+                return other.matches(Throwables.getRootCause(value));
+            }
+
+            @Override
+            public String toString()
+            {
+                return "Root cause " + other;
+            }
+        };
+    }
+
+    public static Condition<Throwable> rootCauseIs(Class<? extends Throwable> klass)
+    {
+        return rootCause((Condition<Throwable>) (Condition<?>) is(klass));
+    }
+}
diff --git a/test/unit/org/apache/cassandra/utils/AssertionUtilsTest.java b/test/unit/org/apache/cassandra/utils/AssertionUtilsTest.java
new file mode 100644
index 0000000..e3ec93a
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/AssertionUtilsTest.java
@@ -0,0 +1,45 @@
+/*
+ * 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.utils;
+
+import org.junit.Test;
+
+import org.assertj.core.api.Assertions;
+
+public class AssertionUtilsTest
+{
+    @Test
+    public void isInstanceof()
+    {
+        Assertions.assertThat(new C())
+                  .is(AssertionUtils.isInstanceof(A.class));
+
+        Assertions.assertThat(new D())
+                  .is(AssertionUtils.isInstanceof(A.class))
+                  .is(AssertionUtils.isInstanceof(B.class));
+
+        Assertions.assertThat(null instanceof A)
+                  .isEqualTo(AssertionUtils.isInstanceof(A.class).matches(null));
+    }
+
+    interface A {}
+    interface B extends A {}
+    static class C implements A {}
+    static class D implements B {}
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/utils/BloomFilterTest.java b/test/unit/org/apache/cassandra/utils/BloomFilterTest.java
index 1c3afff..96464c9 100644
--- a/test/unit/org/apache/cassandra/utils/BloomFilterTest.java
+++ b/test/unit/org/apache/cassandra/utils/BloomFilterTest.java
@@ -18,7 +18,11 @@
 */
 package org.apache.cassandra.utils;
 
-import java.io.*;
+import org.apache.cassandra.io.util.*;
+
+import java.io.ByteArrayInputStream;
+import java.io.DataInputStream;
+import java.io.IOException;
 import java.nio.ByteBuffer;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -29,10 +33,6 @@
 
 import org.apache.cassandra.dht.IPartitioner;
 import org.apache.cassandra.dht.Murmur3Partitioner;
-import org.apache.cassandra.io.util.BufferedDataOutputStreamPlus;
-import org.apache.cassandra.io.util.DataOutputBuffer;
-import org.apache.cassandra.io.util.DataOutputStreamPlus;
-import org.apache.cassandra.io.util.FileUtils;
 import org.apache.cassandra.utils.IFilter.FilterKey;
 import org.apache.cassandra.utils.KeyGenerator.RandomStringGenerator;
 import org.apache.cassandra.utils.obs.IBitSet;
@@ -210,12 +210,12 @@
         File file = FileUtils.createDeletableTempFile("bloomFilterTest-", ".dat");
         BloomFilter filter = (BloomFilter) FilterFactory.getFilter(((long) Integer.MAX_VALUE / 8) + 1, 0.01d);
         filter.add(FilterTestHelper.wrap(test));
-        DataOutputStreamPlus out = new BufferedDataOutputStreamPlus(new FileOutputStream(file));
+        DataOutputStreamPlus out = new FileOutputStreamPlus(file);
         BloomFilterSerializer.serialize(filter, out);
         out.close();
         filter.close();
 
-        DataInputStream in = new DataInputStream(new FileInputStream(file));
+        DataInputStream in = new DataInputStream(new FileInputStreamPlus(file));
         BloomFilter filter2 = BloomFilterSerializer.deserialize(in, false);
         Assert.assertTrue(filter2.isPresent(FilterTestHelper.wrap(test)));
         FileUtils.closeQuietly(in);
diff --git a/test/unit/org/apache/cassandra/utils/CassandraGenerators.java b/test/unit/org/apache/cassandra/utils/CassandraGenerators.java
index 4d51f5c..ad9cb6b 100644
--- a/test/unit/org/apache/cassandra/utils/CassandraGenerators.java
+++ b/test/unit/org/apache/cassandra/utils/CassandraGenerators.java
@@ -283,7 +283,7 @@
                 {
                     // to make sure the correct indents are taken, convert to CQL, then replace newlines with the indents
                     // then prefix with the indents.
-                    String cql = SchemaCQLHelper.getTableMetadataAsCQL((TableMetadata) value, true, true, false);
+                    String cql = SchemaCQLHelper.getTableMetadataAsCQL((TableMetadata) value, null);
                     cql = NEWLINE_PATTERN.matcher(cql).replaceAll(Matcher.quoteReplacement("\n  " + spacer));
                     cql = "\n  " + spacer + cql;
                     value = cql;
diff --git a/test/unit/org/apache/cassandra/utils/CassandraVersionTest.java b/test/unit/org/apache/cassandra/utils/CassandraVersionTest.java
index b9789f5..6f34499 100644
--- a/test/unit/org/apache/cassandra/utils/CassandraVersionTest.java
+++ b/test/unit/org/apache/cassandra/utils/CassandraVersionTest.java
@@ -25,7 +25,6 @@
 import java.util.List;
 
 import com.google.common.base.Splitter;
-
 import org.apache.commons.lang3.ArrayUtils;
 
 import org.junit.Assert;
@@ -253,6 +252,16 @@
         v2 = new CassandraVersion("4.0");
         assertTrue(v1.compareTo(v2) < 0);
         assertTrue(v2.compareTo(v1) > 0);
+
+        assertEquals(-1, v1.compareTo(v2));
+
+        v1 = new CassandraVersion("1.2.3");
+        v2 = new CassandraVersion("1.2.3.1");
+        assertEquals(-1, v1.compareTo(v2));
+
+        v1 = new CassandraVersion("1.2.3.1");
+        v2 = new CassandraVersion("1.2.3.2");
+        assertEquals(-1, v1.compareTo(v2));
     }
 
     @Test
@@ -347,7 +356,7 @@
     @Test
     public void testParseIdentifiersPositive() throws Throwable
     {
-        String[] result = parseIdentifiers("DUMMY", "+a.b.cde.f_g.");
+        String[] result = parseIdentifiers("DUMMY", "a.b.cde.f_g.");
         String[] expected = {"a", "b", "cde", "f_g"};
         assertArrayEquals(expected, result);
     }
diff --git a/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java b/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java
index 833f2e4..e0ee67c 100644
--- a/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java
+++ b/test/unit/org/apache/cassandra/utils/FBUtilitiesTest.java
@@ -23,6 +23,7 @@
 import java.nio.ByteBuffer;
 import java.nio.charset.CharacterCodingException;
 import java.nio.charset.StandardCharsets;
+import java.util.Arrays;
 import java.util.Map;
 import java.util.Optional;
 import java.util.TreeMap;
@@ -46,6 +47,7 @@
 import org.apache.cassandra.config.Config;
 import org.apache.cassandra.config.DatabaseDescriptor;
 
+import static org.assertj.core.api.Assertions.assertThat;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
@@ -227,4 +229,29 @@
             executor.shutdown();
         }
     }
+
+    @Test
+    public void testCamelToSnake()
+    {
+        AssertionError error = null;
+        for (Pair<String, String> a : Arrays.asList(Pair.create("Testing", "testing"),
+                                                    Pair.create("fooBarBaz", "foo_bar_baz"),
+                                                    Pair.create("foo_bar_baz", "foo_bar_baz")
+        ))
+        {
+            try
+            {
+                assertThat(FBUtilities.camelToSnake(a.left)).isEqualTo(a.right);
+            }
+            catch (AssertionError e)
+            {
+                if (error == null)
+                    error = e;
+                else
+                    error.addSuppressed(e);
+            }
+        }
+        if (error != null)
+            throw error;
+    }
 }
diff --git a/test/unit/org/apache/cassandra/utils/FailingRunnable.java b/test/unit/org/apache/cassandra/utils/FailingRunnable.java
new file mode 100644
index 0000000..ab5dbc8
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/FailingRunnable.java
@@ -0,0 +1,38 @@
+/*
+ * 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.utils;
+
+import com.google.common.base.Throwables;
+
+public interface FailingRunnable extends Runnable
+{
+    void doRun() throws Throwable;
+
+    default void run()
+    {
+        try
+        {
+            doRun();
+        }
+        catch (Throwable t)
+        {
+            Throwables.throwIfUnchecked(t);
+            throw new RuntimeException(t);
+        }
+    }
+}
diff --git a/test/unit/org/apache/cassandra/utils/GeneratorsTest.java b/test/unit/org/apache/cassandra/utils/GeneratorsTest.java
index 7fa0561..b9358cc 100644
--- a/test/unit/org/apache/cassandra/utils/GeneratorsTest.java
+++ b/test/unit/org/apache/cassandra/utils/GeneratorsTest.java
@@ -45,4 +45,4 @@
     {
         qt().forAll(Generators.DNS_DOMAIN_NAME).checkAssert(InternetDomainName::from);
     }
-}
\ No newline at end of file
+}
diff --git a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
index a8dd22a..3a3415e 100644
--- a/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
+++ b/test/unit/org/apache/cassandra/utils/JVMStabilityInspectorTest.java
@@ -20,6 +20,7 @@
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.net.SocketException;
+import java.util.Arrays;
 
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -29,6 +30,11 @@
 import org.apache.cassandra.io.FSReadError;
 import org.apache.cassandra.io.FSWriteError;
 import org.apache.cassandra.io.sstable.CorruptSSTableException;
+import org.assertj.core.api.Assertions;
+import org.apache.cassandra.io.util.FileUtils;
+import org.apache.cassandra.service.CassandraDaemon;
+import org.apache.cassandra.service.DefaultFSErrorHandler;
+import org.apache.cassandra.service.StorageService;
 
 import static java.util.Arrays.asList;
 import static org.junit.Assert.assertEquals;
@@ -53,43 +59,62 @@
 
         Config.DiskFailurePolicy oldPolicy = DatabaseDescriptor.getDiskFailurePolicy();
         Config.CommitFailurePolicy oldCommitPolicy = DatabaseDescriptor.getCommitFailurePolicy();
+        FileUtils.setFSErrorHandler(new DefaultFSErrorHandler());
         try
         {
-            killerForTests.reset();
-            JVMStabilityInspector.inspectThrowable(new IOException());
-            assertFalse(killerForTests.wasKilled());
+            CassandraDaemon daemon = new CassandraDaemon();
+            daemon.completeSetup();
+            for (boolean daemonSetupCompleted : Arrays.asList(false, true))
+            {
+                // disk policy acts differently depending on if setup is complete or not; which is defined by
+                // the daemon thread not being null
+                StorageService.instance.registerDaemon(daemonSetupCompleted ? daemon : null);
 
-            DatabaseDescriptor.setDiskFailurePolicy(Config.DiskFailurePolicy.die);
-            killerForTests.reset();
-            JVMStabilityInspector.inspectThrowable(new FSReadError(new IOException(), "blah"));
-            assertTrue(killerForTests.wasKilled());
+                try
+                {
+                    killerForTests.reset();
+                    JVMStabilityInspector.inspectThrowable(new IOException());
+                    assertFalse(killerForTests.wasKilled());
 
-            killerForTests.reset();
-            JVMStabilityInspector.inspectThrowable(new FSWriteError(new IOException(), "blah"));
-            assertTrue(killerForTests.wasKilled());
+                    DatabaseDescriptor.setDiskFailurePolicy(Config.DiskFailurePolicy.die);
+                    killerForTests.reset();
+                    JVMStabilityInspector.inspectThrowable(new FSReadError(new IOException(), "blah"));
+                    assertTrue(killerForTests.wasKilled());
 
-            killerForTests.reset();
-            JVMStabilityInspector.inspectThrowable(new CorruptSSTableException(new IOException(), "blah"));
-            assertTrue(killerForTests.wasKilled());
+                    killerForTests.reset();
+                    JVMStabilityInspector.inspectThrowable(new FSWriteError(new IOException(), "blah"));
+                    assertTrue(killerForTests.wasKilled());
 
-            killerForTests.reset();
-            JVMStabilityInspector.inspectThrowable(new RuntimeException(new CorruptSSTableException(new IOException(), "blah")));
-            assertTrue(killerForTests.wasKilled());
+                    killerForTests.reset();
+                    JVMStabilityInspector.inspectThrowable(new CorruptSSTableException(new IOException(), "blah"));
+                    assertTrue(killerForTests.wasKilled());
 
-            DatabaseDescriptor.setCommitFailurePolicy(Config.CommitFailurePolicy.die);
-            killerForTests.reset();
-            JVMStabilityInspector.inspectCommitLogThrowable(new Throwable());
-            assertTrue(killerForTests.wasKilled());
+                    killerForTests.reset();
+                    JVMStabilityInspector.inspectThrowable(new RuntimeException(new CorruptSSTableException(new IOException(), "blah")));
+                    assertTrue(killerForTests.wasKilled());
 
-            killerForTests.reset();
-            JVMStabilityInspector.inspectThrowable(new Exception(new IOException()));
-            assertFalse(killerForTests.wasKilled());
+                    DatabaseDescriptor.setCommitFailurePolicy(Config.CommitFailurePolicy.die);
+                    killerForTests.reset();
+                    JVMStabilityInspector.inspectCommitLogThrowable(new Throwable());
+                    assertTrue(killerForTests.wasKilled());
+
+                    killerForTests.reset();
+                    JVMStabilityInspector.inspectThrowable(new Exception(new IOException()));
+                    assertFalse(killerForTests.wasKilled());
+                }
+                catch (Exception | Error e)
+                {
+                    throw new AssertionError("Failure when daemonSetupCompleted=" + daemonSetupCompleted, e);
+                }
+            }
         }
         finally
         {
             JVMStabilityInspector.replaceKiller(originalKiller);
             DatabaseDescriptor.setDiskFailurePolicy(oldPolicy);
             DatabaseDescriptor.setCommitFailurePolicy(oldCommitPolicy);
+            StorageService.instance.registerDaemon(null);
+            FileUtils.setFSErrorHandler(null);
         }
     }
 
@@ -126,6 +151,15 @@
     }
 
     @Test
+    public void testForceHeapSpaceOomExclude()
+    {
+        OutOfMemoryError error = new OutOfMemoryError("Java heap space");
+        Assertions.assertThatThrownBy(() -> JVMStabilityInspector.inspectThrowable(error))
+                  .isInstanceOf(OutOfMemoryError.class)
+                  .isEqualTo(error);
+    }
+
+    @Test
     public void fileHandleTest()
     {
         KillerForTests killerForTests = new KillerForTests();
diff --git a/test/unit/org/apache/cassandra/utils/KeyGenerator.java b/test/unit/org/apache/cassandra/utils/KeyGenerator.java
index df958678..f1ff7e3 100644
--- a/test/unit/org/apache/cassandra/utils/KeyGenerator.java
+++ b/test/unit/org/apache/cassandra/utils/KeyGenerator.java
@@ -18,8 +18,13 @@
 */
 package org.apache.cassandra.utils;
 
-import java.io.*;
+import org.apache.cassandra.io.util.FileInputStreamPlus;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
 import java.nio.ByteBuffer;
+import java.nio.file.NoSuchFileException;
 import java.util.Random;
 
 public class KeyGenerator
@@ -119,7 +124,7 @@
 
         static 
         {
-            try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("/usr/share/dict/words")))) 
+            try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStreamPlus("/usr/share/dict/words"))))
             {
                 while (br.ready()) 
                 {
@@ -154,9 +159,9 @@
         {
             try 
             {
-                reader = new BufferedReader(new InputStreamReader(new FileInputStream("/usr/share/dict/words")));
+                reader = new BufferedReader(new InputStreamReader(new FileInputStreamPlus("/usr/share/dict/words")));
             } 
-            catch (FileNotFoundException e) 
+            catch (NoSuchFileException e)
             {
                 throw new RuntimeException(e);
             }
diff --git a/test/unit/org/apache/cassandra/utils/MergeIteratorComparisonTest.java b/test/unit/org/apache/cassandra/utils/MergeIteratorComparisonTest.java
index 6d9d2f6..1b52fb5 100644
--- a/test/unit/org/apache/cassandra/utils/MergeIteratorComparisonTest.java
+++ b/test/unit/org/apache/cassandra/utils/MergeIteratorComparisonTest.java
@@ -23,7 +23,7 @@
 
 import com.google.common.base.Function;
 import com.google.common.base.Objects;
-import org.apache.cassandra.utils.AbstractIterator;
+
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Lists;
@@ -38,6 +38,8 @@
 import org.apache.cassandra.db.marshal.UUIDType;
 import org.apache.cassandra.utils.MergeIterator.Reducer;
 
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+
 public class MergeIteratorComparisonTest
 {
     private static class CountingComparator<T> implements Comparator<T>
@@ -231,7 +233,7 @@
             @Override
             public UUID next()
             {
-                return UUIDGen.getTimeUUID();
+                return nextTimeUUID().asUUID();
             }
         }.result;
         testMergeIterator(reducer, lists);
@@ -257,14 +259,14 @@
     public void testTimeUuidType()
     {
         System.out.println("testTimeUuidType");
-        final AbstractType<UUID> type = TimeUUIDType.instance;
+        final AbstractType<TimeUUID> type = TimeUUIDType.instance;
         Reducer<ByteBuffer, Counted<ByteBuffer>> reducer = new Counter<ByteBuffer>();
 
         List<List<ByteBuffer>> lists = new SimpleListGenerator<ByteBuffer>(type, ITERATOR_COUNT, LIST_LENGTH) {
             @Override
             public ByteBuffer next()
             {
-                return type.decompose(UUIDGen.getTimeUUID());
+                return type.decompose(nextTimeUUID());
             }
         }.result;
         testMergeIterator(reducer, lists, type);
@@ -281,7 +283,7 @@
             @Override
             public ByteBuffer next()
             {
-                return type.decompose(UUIDGen.getTimeUUID());
+                return type.decompose(nextTimeUUID().asUUID());
             }
         }.result;
         testMergeIterator(reducer, lists, type);
@@ -300,7 +302,7 @@
             @Override
             public KeyedSet<Integer, UUID> next()
             {
-                return new KeyedSet<>(r.nextInt(5 * LIST_LENGTH), UUIDGen.getTimeUUID());
+                return new KeyedSet<>(r.nextInt(5 * LIST_LENGTH), nextTimeUUID().asUUID());
             }
         }.result;
         testMergeIterator(reducer, lists);
diff --git a/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java b/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java
index fe2cecf..056a4a7 100644
--- a/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java
+++ b/test/unit/org/apache/cassandra/utils/MergeIteratorTest.java
@@ -21,7 +21,6 @@
 import java.util.Arrays;
 import java.util.Iterator;
 
-import org.apache.cassandra.utils.AbstractIterator;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Ordering;
 import org.junit.Before;
diff --git a/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java b/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java
index 1cdcc22..ae70fd4 100644
--- a/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java
+++ b/test/unit/org/apache/cassandra/utils/MerkleTreeTest.java
@@ -600,19 +600,19 @@
         Assert.assertEquals(1, MerkleTree.estimatedMaxDepthForBytes(Murmur3Partitioner.instance, 0, 32));
         Assert.assertEquals(1, MerkleTree.estimatedMaxDepthForBytes(Murmur3Partitioner.instance, 1, 32));
 
-        // The minimum of 1 megabyte split between RF=3 should yield trees of around 10
+        // The minimum of 1 mebibyte split between RF=3 should yield trees of around 10
         Assert.assertEquals(10, MerkleTree.estimatedMaxDepthForBytes(Murmur3Partitioner.instance,
                                                                      1048576 / 3, 32));
 
-        // With a single megabyte of space we should get 12
+        // With a single mebibyte of space we should get 12
         Assert.assertEquals(12, MerkleTree.estimatedMaxDepthForBytes(Murmur3Partitioner.instance,
                                                                      1048576, 32));
 
-        // With 100 megabytes we should get a limit of 19
+        // With 100 mebibytes we should get a limit of 19
         Assert.assertEquals(19, MerkleTree.estimatedMaxDepthForBytes(Murmur3Partitioner.instance,
                                                                      100 * 1048576, 32));
 
-        // With 300 megabytes we should get the old limit of 20
+        // With 300 mebibytes we should get the old limit of 20
         Assert.assertEquals(20, MerkleTree.estimatedMaxDepthForBytes(Murmur3Partitioner.instance,
                                                                      300 * 1048576, 32));
         Assert.assertEquals(20, MerkleTree.estimatedMaxDepthForBytes(RandomPartitioner.instance,
@@ -635,7 +635,7 @@
         Range<Token> fullRange = new Range<>(partitioner.getMinimumToken(), partitioner.getMinimumToken());
         MerkleTree tree = new MerkleTree(partitioner, fullRange, RECOMMENDED_DEPTH, 0);
 
-        // Test 16 kilobyte -> 16 megabytes
+        // Test 16 kibibyte -> 16 mebibytes
         for (int i = 14; i < 24; i ++)
         {
             long numBytes = 1 << i;
diff --git a/test/unit/org/apache/cassandra/utils/MonotonicClockTest.java b/test/unit/org/apache/cassandra/utils/MonotonicClockTest.java
index b2891a9..3839be0 100644
--- a/test/unit/org/apache/cassandra/utils/MonotonicClockTest.java
+++ b/test/unit/org/apache/cassandra/utils/MonotonicClockTest.java
@@ -17,7 +17,8 @@
  */
 package org.apache.cassandra.utils;
 
-import static org.apache.cassandra.utils.MonotonicClock.approxTime;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+import static org.apache.cassandra.utils.MonotonicClock.Global.approxTime;
 import static org.junit.Assert.*;
 
 import org.junit.Test;
@@ -27,7 +28,7 @@
     @Test
     public void testTimestampOrdering() throws Exception
     {
-        long nowNanos = System.nanoTime();
+        long nowNanos = nanoTime();
         long now = System.currentTimeMillis();
         long lastConverted = 0;
         for (long ii = 0; ii < 10000000; ii++)
@@ -39,14 +40,14 @@
                 Thread.sleep(1);
             }
 
-            nowNanos = Math.max(nowNanos, System.nanoTime());
+            nowNanos = Math.max(nowNanos, nanoTime());
             long convertedNow = approxTime.translate().toMillisSinceEpoch(nowNanos);
 
-            int maxDiff = FBUtilities.isWindows ? 15 : 1;
+            int maxDiff = 1;
             assertTrue("convertedNow = " + convertedNow + " lastConverted = " + lastConverted + " in iteration " + ii,
                        convertedNow >= (lastConverted - maxDiff));
 
-            maxDiff = FBUtilities.isWindows ? 25 : 2;
+            maxDiff = 2;
             assertTrue("now = " + now + " convertedNow = " + convertedNow + " in iteration " + ii,
                        (maxDiff - 2) <= convertedNow);
 
diff --git a/test/unit/org/apache/cassandra/utils/NativeLibraryTest.java b/test/unit/org/apache/cassandra/utils/NativeLibraryTest.java
index 1a26351..52a7f84 100644
--- a/test/unit/org/apache/cassandra/utils/NativeLibraryTest.java
+++ b/test/unit/org/apache/cassandra/utils/NativeLibraryTest.java
@@ -18,8 +18,8 @@
  */
 package org.apache.cassandra.utils;
 
-import java.io.File;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -32,7 +32,7 @@
     {
         File file = FileUtils.createDeletableTempFile("testSkipCache", "1");
 
-        NativeLibrary.trySkipCache(file.getPath(), 0, 0);
+        NativeLibrary.trySkipCache(file.path(), 0, 0);
     }
 
     @Test
diff --git a/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java b/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java
index 58e6ea0..73aef09 100644
--- a/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java
+++ b/test/unit/org/apache/cassandra/utils/NoSpamLoggerTest.java
@@ -18,13 +18,13 @@
 */
 package org.apache.cassandra.utils;
 
-import static org.junit.Assert.*;
-
 import java.util.ArrayDeque;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Queue;
 import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
 
 import org.apache.cassandra.utils.NoSpamLogger.Level;
 import org.apache.cassandra.utils.NoSpamLogger.NoSpamLogStatement;
@@ -34,146 +34,138 @@
 import org.slf4j.Logger;
 import org.slf4j.helpers.SubstituteLogger;
 
+import static org.junit.Assert.*;
 
 public class NoSpamLoggerTest
 {
     Map<Level, Queue<Pair<String, Object[]>>> logged = new HashMap<>();
 
-   Logger mock = new SubstituteLogger(null, null, true)
-   {
-
-       @Override
-       public void info(String statement, Object... args)
-       {
-           logged.get(Level.INFO).offer(Pair.create(statement, args));
-       }
-
-       @Override
-       public void warn(String statement, Object... args)
-       {
-           logged.get(Level.WARN).offer(Pair.create(statement, args));
-       }
-
-       @Override
-       public void error(String statement, Object... args)
-       {
-           logged.get(Level.ERROR).offer(Pair.create(statement, args));
-       }
-
-       @Override
-       public int hashCode()
-       {
-           return 42;//It's a valid hash code
-       }
-
-       @Override
-       public boolean equals(Object o)
-       {
-           return this == o;
-       }
-   };
-
-
-   static final String statement = "swizzle{}";
-   static final String param = "";
-   static long now;
-
-   @BeforeClass
-   public static void setUpClass() throws Exception
-   {
-       NoSpamLogger.CLOCK = new NoSpamLogger.Clock()
-       {
+    Logger mock = new SubstituteLogger(null, null, true)
+    {
         @Override
-        public long nanoTime()
+        public void info(String statement, Object... args)
         {
-            return now;
+            logged.get(Level.INFO).offer(Pair.create(statement, args));
         }
-       };
-   }
 
-   @Before
-   public void setUp() throws Exception
-   {
-       logged.put(Level.INFO, new ArrayDeque<Pair<String, Object[]>>());
-       logged.put(Level.WARN, new ArrayDeque<Pair<String, Object[]>>());
-       logged.put(Level.ERROR, new ArrayDeque<Pair<String, Object[]>>());
-       NoSpamLogger.clearWrappedLoggersForTest();
-   }
+        @Override
+        public void warn(String statement, Object... args)
+        {
+            logged.get(Level.WARN).offer(Pair.create(statement, args));
+        }
 
-   @Test
-   public void testNoSpamLogger() throws Exception
-   {
-       testLevel(Level.INFO);
-       testLevel(Level.WARN);
-       testLevel(Level.ERROR);
-   }
+        @Override
+        public void error(String statement, Object... args)
+        {
+            logged.get(Level.ERROR).offer(Pair.create(statement, args));
+        }
 
-   private void testLevel(Level l) throws Exception
-   {
-       setUp();
-       now = 5;
+        @Override
+        public int hashCode()
+        {
+            return 42; //It's a valid hash code
+        }
 
-       assertTrue(NoSpamLogger.log( mock, l, 5,  TimeUnit.NANOSECONDS, statement, param));
+        @Override
+        public boolean equals(Object o)
+        {
+            return this == o;
+        }
+    };
 
-       assertEquals(1, logged.get(l).size());
+    static final String statement = "swizzle{}";
+    static final String param = "";
+    static long now;
 
-       assertFalse(NoSpamLogger.log( mock, l, 5,  TimeUnit.NANOSECONDS, statement, param));
+    @BeforeClass
+    public static void setUpClass() throws Exception
+    {
+        NoSpamLogger.CLOCK = () -> now;
+    }
 
-       assertEquals(1, logged.get(l).size());
+    @Before
+    public void setUp() throws Exception
+    {
+        logged.put(Level.INFO, new ArrayDeque<Pair<String, Object[]>>());
+        logged.put(Level.WARN, new ArrayDeque<Pair<String, Object[]>>());
+        logged.put(Level.ERROR, new ArrayDeque<Pair<String, Object[]>>());
+        NoSpamLogger.clearWrappedLoggersForTest();
+    }
 
-       now += 5;
+    @Test
+    public void testNoSpamLogger() throws Exception
+    {
+        testLevel(Level.INFO);
+        testLevel(Level.WARN);
+        testLevel(Level.ERROR);
+    }
 
-       assertTrue(NoSpamLogger.log( mock, l, 5,  TimeUnit.NANOSECONDS, statement, param));
+    private void testLevel(Level l) throws Exception
+    {
+        setUp();
+        now = 5;
 
-       assertEquals(2, logged.get(l).size());
+        assertTrue(NoSpamLogger.log(mock, l, 5, TimeUnit.NANOSECONDS, statement, param));
 
-       assertTrue(NoSpamLogger.log( mock, l, "key", 5,  TimeUnit.NANOSECONDS, statement, param));
+        assertEquals(1, logged.get(l).size());
 
-       assertEquals(3, logged.get(l).size());
+        assertFalse(NoSpamLogger.log(mock, l, 5, TimeUnit.NANOSECONDS, statement, param));
 
-       assertFalse(NoSpamLogger.log( mock, l, "key", 5,  TimeUnit.NANOSECONDS, statement, param));
+        assertEquals(1, logged.get(l).size());
 
-       assertEquals(3, logged.get(l).size());
-   }
+        now += 5;
 
-   private void assertLoggedSizes(int info, int warn, int error)
-   {
-       assertEquals(info, logged.get(Level.INFO).size());
-       assertEquals(warn, logged.get(Level.WARN).size());
-       assertEquals(error, logged.get(Level.ERROR).size());
-   }
+        assertTrue(NoSpamLogger.log(mock, l, 5, TimeUnit.NANOSECONDS, statement, param));
 
-   @Test
-   public void testNoSpamLoggerDirect() throws Exception
-   {
-       now = 5;
-       NoSpamLogger logger = NoSpamLogger.getLogger( mock, 5, TimeUnit.NANOSECONDS);
+        assertEquals(2, logged.get(l).size());
 
-       assertTrue(logger.info(statement, param));
-       assertFalse(logger.info(statement, param));
-       assertFalse(logger.warn(statement, param));
-       assertFalse(logger.error(statement, param));
+        assertTrue(NoSpamLogger.log(mock, l, "key", 5, TimeUnit.NANOSECONDS, statement, param));
 
-       assertLoggedSizes(1, 0, 0);
+        assertEquals(3, logged.get(l).size());
 
-       NoSpamLogStatement statement = logger.getStatement("swizzle2{}", 10, TimeUnit.NANOSECONDS);
-       assertTrue(statement.warn(param)); // since a statement of this key hasn't logged yet
-       assertLoggedSizes(1, 1, 0);
+        assertFalse(NoSpamLogger.log(mock, l, "key", 5, TimeUnit.NANOSECONDS, statement, param));
 
-       now = 10;
-       assertFalse(statement.warn(param)); // we logged it above
-       assertLoggedSizes(1, 1, 0);
+        assertEquals(3, logged.get(l).size());
+    }
 
-       now = 15;
-       assertTrue(statement.warn(param)); // First log was at 5, now past the interval
-       assertLoggedSizes(1, 2, 0);
-   }
+    private void assertLoggedSizes(int info, int warn, int error)
+    {
+        assertEquals(info, logged.get(Level.INFO).size());
+        assertEquals(warn, logged.get(Level.WARN).size());
+        assertEquals(error, logged.get(Level.ERROR).size());
+    }
+
+    @Test
+    public void testNoSpamLoggerDirect() throws Exception
+    {
+        now = 5;
+        NoSpamLogger logger = NoSpamLogger.getLogger(mock, 5, TimeUnit.NANOSECONDS);
+
+        assertTrue(logger.info(statement, param));
+        assertFalse(logger.info(statement, param));
+        assertFalse(logger.warn(statement, param));
+        assertFalse(logger.error(statement, param));
+
+        assertLoggedSizes(1, 0, 0);
+
+        NoSpamLogStatement statement = logger.getStatement("swizzle2{}", 10, TimeUnit.NANOSECONDS);
+        assertTrue(statement.warn(param)); // since a statement of this key hasn't logged yet
+        assertLoggedSizes(1, 1, 0);
+
+        now = 10;
+        assertFalse(statement.warn(param)); // we logged it above
+        assertLoggedSizes(1, 1, 0);
+
+        now = 15;
+        assertTrue(statement.warn(param)); // First log was at 5, now past the interval
+        assertLoggedSizes(1, 2, 0);
+    }
 
     @Test
     public void testNegativeNowNanos() throws Exception
     {
         now = -6;
-        NoSpamLogger logger = NoSpamLogger.getLogger( mock, 5, TimeUnit.NANOSECONDS);
+        NoSpamLogger logger = NoSpamLogger.getLogger(mock, 5, TimeUnit.NANOSECONDS);
 
         assertTrue(logger.info(statement, param));
         assertFalse(logger.info(statement, param));
@@ -204,84 +196,114 @@
     }
 
     @Test
-   public void testNoSpamLoggerStatementDirect() throws Exception
-   {
-       NoSpamLogger.NoSpamLogStatement nospam = NoSpamLogger.getStatement( mock, statement, 5, TimeUnit.NANOSECONDS);
+    public void testNoSpamLoggerStatementDirect()
+    {
+        NoSpamLogger.NoSpamLogStatement nospam = NoSpamLogger.getStatement(mock, statement, 5, TimeUnit.NANOSECONDS);
 
-       now = 5;
+        now = 5;
 
-       assertTrue(nospam.info(statement, param));
-       assertFalse(nospam.info(statement, param));
-       assertFalse(nospam.warn(statement, param));
-       assertFalse(nospam.error(statement, param));
+        assertTrue(nospam.info(statement, param));
+        assertFalse(nospam.info(statement, param));
+        assertFalse(nospam.warn(statement, param));
+        assertFalse(nospam.error(statement, param));
 
-       assertLoggedSizes(1, 0, 0);
-   }
+        assertLoggedSizes(1, 0, 0);
+    }
 
-   private void checkMock(Level l)
-   {
-       Pair<String, Object[]> p = logged.get(l).poll();
-       assertNotNull(p);
-       assertEquals(statement, p.left);
-       Object objs[] = p.right;
-       assertEquals(1, objs.length);
-       assertEquals(param, objs[0]);
-       assertTrue(logged.get(l).isEmpty());
-   }
+    private void checkMock(Level l)
+    {
+        Pair<String, Object[]> p = logged.get(l).poll();
+        assertNotNull(p);
+        assertEquals(statement, p.left);
+        Object[] objs = p.right;
+        assertEquals(1, objs.length);
+        assertEquals(param, objs[0]);
+        assertTrue(logged.get(l).isEmpty());
+    }
 
-   /*
-    * Make sure that what is passed to the underlying logger is the correct set of objects
-    */
-   @Test
-   public void testLoggedResult() throws Exception
-   {
-       now = 5;
+    /*
+     * Make sure that what is passed to the underlying logger is the correct set of objects
+     */
+    @Test
+    public void testLoggedResult()
+    {
+        now = 5;
 
-       assertTrue(NoSpamLogger.log( mock, Level.INFO, 5,  TimeUnit.NANOSECONDS, statement, param));
-       checkMock(Level.INFO);
+        assertTrue(NoSpamLogger.log(mock, Level.INFO, 5, TimeUnit.NANOSECONDS, statement, param));
+        checkMock(Level.INFO);
 
-       now = 10;
+        now = 10;
 
-       assertTrue(NoSpamLogger.log( mock, Level.WARN, 5,  TimeUnit.NANOSECONDS, statement, param));
-       checkMock(Level.WARN);
+        assertTrue(NoSpamLogger.log(mock, Level.WARN, 5, TimeUnit.NANOSECONDS, statement, param));
+        checkMock(Level.WARN);
 
-       now = 15;
+        now = 15;
 
-       assertTrue(NoSpamLogger.log( mock, Level.ERROR, 5,  TimeUnit.NANOSECONDS, statement, param));
-       checkMock(Level.ERROR);
+        assertTrue(NoSpamLogger.log(mock, Level.ERROR, 5, TimeUnit.NANOSECONDS, statement, param));
+        checkMock(Level.ERROR);
 
-       now = 20;
+        now = 20;
 
-       NoSpamLogger logger = NoSpamLogger.getLogger(mock, 5, TimeUnit.NANOSECONDS);
+        NoSpamLogger logger = NoSpamLogger.getLogger(mock, 5, TimeUnit.NANOSECONDS);
 
-       assertTrue(logger.info(statement, param));
-       checkMock(Level.INFO);
+        assertTrue(logger.info(statement, param));
+        checkMock(Level.INFO);
 
-       now = 25;
+        now = 25;
 
-       assertTrue(logger.warn(statement, param));
-       checkMock(Level.WARN);
+        assertTrue(logger.warn(statement, param));
+        checkMock(Level.WARN);
 
-       now = 30;
+        now = 30;
 
-       assertTrue(logger.error(statement, param));
-       checkMock(Level.ERROR);
+        assertTrue(logger.error(statement, param));
+        checkMock(Level.ERROR);
 
-       NoSpamLogger.NoSpamLogStatement nospamStatement = logger.getStatement(statement);
+        NoSpamLogger.NoSpamLogStatement nospamStatement = logger.getStatement(statement);
 
-       now = 35;
+        now = 35;
 
-       assertTrue(nospamStatement.info(param));
-       checkMock(Level.INFO);
+        assertTrue(nospamStatement.info(param));
+        checkMock(Level.INFO);
 
-       now = 40;
+        now = 40;
 
-       assertTrue(nospamStatement.warn(param));
-       checkMock(Level.WARN);
+        assertTrue(nospamStatement.warn(param));
+        checkMock(Level.WARN);
 
-       now = 45;
+        now = 45;
 
-       assertTrue(nospamStatement.error(param));
-       checkMock(Level.ERROR);
-   }
+        assertTrue(nospamStatement.error(param));
+        checkMock(Level.ERROR);
+    }
+
+    @Test
+    public void testSupplierLogging()
+    {
+        AtomicInteger evaluationTimes = new AtomicInteger();
+        Object [] params = new Object[] {"hello"};
+        Supplier<Object[]> paramSupplier = () -> {
+            evaluationTimes.incrementAndGet();
+            return params;
+        };
+
+        now = 5;
+
+        NoSpamLogger.log(mock, Level.INFO, 5, TimeUnit.NANOSECONDS, "TESTING {}", paramSupplier);
+        assertEquals(1, evaluationTimes.get());
+        Pair<String, Object[]> loggedMsg = logged.get(Level.INFO).remove();
+        assertEquals("TESTING {}", loggedMsg.left);
+        assertArrayEquals(params, loggedMsg.right);
+
+        NoSpamLogger.log(mock, Level.INFO, 5, TimeUnit.NANOSECONDS, "TESTING {}", paramSupplier);
+        assertEquals(1, evaluationTimes.get());
+        assertTrue(logged.get(Level.INFO).isEmpty());
+
+        now = 10;
+        NoSpamLogger.log(mock, Level.INFO, 5, TimeUnit.NANOSECONDS, "TESTING {}", paramSupplier);
+        assertEquals(2, evaluationTimes.get());
+        loggedMsg = logged.get(Level.INFO).remove();
+        assertEquals("TESTING {}", loggedMsg.left);
+        assertArrayEquals(params, loggedMsg.right);
+    }
 }
diff --git a/test/unit/org/apache/cassandra/utils/SerializationsTest.java b/test/unit/org/apache/cassandra/utils/SerializationsTest.java
index 6597f3b..be235e6 100644
--- a/test/unit/org/apache/cassandra/utils/SerializationsTest.java
+++ b/test/unit/org/apache/cassandra/utils/SerializationsTest.java
@@ -21,6 +21,7 @@
 import java.io.DataInputStream;
 import java.io.IOException;
 
+import org.apache.cassandra.io.util.FileInputStreamPlus;
 import org.junit.Assert;
 import org.junit.BeforeClass;
 import org.junit.Test;
@@ -30,14 +31,12 @@
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.db.DecoratedKey;
 import org.apache.cassandra.db.marshal.Int32Type;
-import org.apache.cassandra.io.util.DataInputPlus.DataInputStreamPlus;
 import org.apache.cassandra.io.util.DataOutputPlus;
 import org.apache.cassandra.io.util.DataOutputStreamPlus;
 import org.apache.cassandra.dht.Murmur3Partitioner;
 import org.apache.cassandra.utils.obs.OffHeapBitSet;
 
-import java.io.File;
-import java.io.FileInputStream;
+import org.apache.cassandra.io.util.File;
 
 public class SerializationsTest extends AbstractSerializationsTester
 {
@@ -80,7 +79,7 @@
             testBloomFilterWrite1000(true);
         }
 
-        try (DataInputStream in = getInput("4.0", "utils.BloomFilter1000.bin");
+        try (FileInputStreamPlus in = getInput("4.0", "utils.BloomFilter1000.bin");
              IFilter filter = BloomFilterSerializer.deserialize(in, false))
         {
             boolean present;
@@ -96,7 +95,7 @@
             }
         }
 
-        try (DataInputStream in = getInput("3.0", "utils.BloomFilter1000.bin");
+        try (FileInputStreamPlus in = getInput("3.0", "utils.BloomFilter1000.bin");
              IFilter filter = BloomFilterSerializer.deserialize(in, true))
         {
             boolean present;
@@ -123,7 +122,7 @@
     {
         Murmur3Partitioner partitioner = new Murmur3Partitioner();
 
-        try (DataInputStream in = new DataInputStream(new FileInputStream(new File(file)));
+        try (DataInputStream in = new DataInputStream(new FileInputStreamPlus(new File(file)));
              IFilter filter = BloomFilterSerializer.deserialize(in, oldBfFormat))
         {
             for (int i = 1; i <= 10; i++)
@@ -176,7 +175,7 @@
         if (EXECUTE_WRITES)
             testEstimatedHistogramWrite();
 
-        try (DataInputStreamPlus in = getInput("utils.EstimatedHistogram.bin"))
+        try (FileInputStreamPlus in = getInput("utils.EstimatedHistogram.bin"))
         {
             Assert.assertNotNull(EstimatedHistogram.serializer.deserialize(in));
             Assert.assertNotNull(EstimatedHistogram.serializer.deserialize(in));
diff --git a/test/unit/org/apache/cassandra/utils/SlidingTimeRateTest.java b/test/unit/org/apache/cassandra/utils/SlidingTimeRateTest.java
deleted file mode 100644
index 8dc4a14..0000000
--- a/test/unit/org/apache/cassandra/utils/SlidingTimeRateTest.java
+++ /dev/null
@@ -1,161 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils;
-
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-import java.util.concurrent.TimeUnit;
-
-import org.junit.Assert;
-import org.junit.Ignore;
-import org.junit.Test;
-
-/**
- * No objects are created currently from SlidingTimeRate in Cassandra 4.0.
- * If you decide to use it, please check CASSANDRA-16713.
- * There still might be a bug, flaky test to be fixed before using it again.
- *
- * Skipping all tests for running now to clean he noise before 4.0 GA release.
- */
-public class SlidingTimeRateTest
-{
-    @Ignore
-    @Test
-    public void testUpdateAndGet()
-    {
-        SlidingTimeRate rate = new SlidingTimeRate(new TestTimeSource(), 10, 1, TimeUnit.SECONDS);
-        int updates = 100;
-        for (int i = 0; i < updates; i++)
-        {
-            rate.update(1);
-        }
-        Assert.assertEquals(updates, rate.get(TimeUnit.SECONDS), 0.0);
-    }
-
-    @Ignore
-    @Test
-    public void testUpdateAndGetBetweenWindows()
-    {
-        TestTimeSource time = new TestTimeSource();
-        SlidingTimeRate rate = new SlidingTimeRate(time, 5, 1, TimeUnit.SECONDS);
-        int updates = 100;
-        for (int i = 0; i < updates; i++)
-        {
-            rate.update(1);
-            time.sleep(100, TimeUnit.MILLISECONDS);
-        }
-        Assert.assertEquals(10, rate.get(TimeUnit.SECONDS), 0.0);
-    }
-
-    @Ignore
-    @Test
-    public void testUpdateAndGetPastWindowSize()
-    {
-        TestTimeSource time = new TestTimeSource();
-        SlidingTimeRate rate = new SlidingTimeRate(time, 5, 1, TimeUnit.SECONDS);
-        int updates = 100;
-        for (int i = 0; i < updates; i++)
-        {
-            rate.update(1);
-        }
-
-        time.sleep(6, TimeUnit.SECONDS);
-
-        Assert.assertEquals(0, rate.get(TimeUnit.SECONDS), 0.0);
-    }
-
-    @Ignore
-    @Test
-    public void testUpdateAndGetToPointInTime()
-    {
-        TestTimeSource time = new TestTimeSource();
-        SlidingTimeRate rate = new SlidingTimeRate(time, 5, 1, TimeUnit.SECONDS);
-        int updates = 10;
-        for (int i = 0; i < updates; i++)
-        {
-            rate.update(1);
-            time.sleep(100, TimeUnit.MILLISECONDS);
-        }
-
-        time.sleep(1, TimeUnit.SECONDS);
-
-        Assert.assertEquals(5, rate.get(TimeUnit.SECONDS), 0.0);
-        Assert.assertEquals(10, rate.get(1, TimeUnit.SECONDS), 0.0);
-    }
-
-    @Ignore
-    @Test
-    public void testDecay() throws InterruptedException
-    {
-        TestTimeSource time = new TestTimeSource();
-        SlidingTimeRate rate = new SlidingTimeRate(time, 5, 1, TimeUnit.SECONDS);
-        int updates = 10;
-        for (int i = 0; i < updates; i++)
-        {
-            rate.update(1);
-            time.sleep(100, TimeUnit.MILLISECONDS);
-        }
-        Assert.assertEquals(10, rate.get(TimeUnit.SECONDS), 0.0);
-
-        time.sleep(1, TimeUnit.SECONDS);
-
-        Assert.assertEquals(5, rate.get(TimeUnit.SECONDS), 0.0);
-
-        time.sleep(2, TimeUnit.SECONDS);
-
-        Assert.assertEquals(2.5, rate.get(TimeUnit.SECONDS), 0.0);
-    }
-
-    @Ignore
-    @Test
-    public void testPruning()
-    {
-        TestTimeSource time = new TestTimeSource();
-        SlidingTimeRate rate = new SlidingTimeRate(time, 5, 1, TimeUnit.SECONDS);
-
-        rate.update(1);
-        Assert.assertEquals(1, rate.size());
-
-        time.sleep(6, TimeUnit.SECONDS);
-
-        rate.prune();
-        Assert.assertEquals(0, rate.size());
-    }
-
-    @Ignore
-    @Test
-    public void testConcurrentUpdateAndGet() throws InterruptedException
-    {
-        final ExecutorService executor = Executors.newFixedThreadPool(FBUtilities.getAvailableProcessors());
-        final TestTimeSource time = new TestTimeSource();
-        final SlidingTimeRate rate = new SlidingTimeRate(time, 5, 1, TimeUnit.SECONDS);
-        int updates = 100000;
-        for (int i = 0; i < updates; i++)
-        {
-            executor.submit(() -> {
-                time.sleep(1, TimeUnit.MILLISECONDS);
-                rate.update(1);
-            });
-        }
-
-        executor.shutdown();
-
-        Assert.assertTrue(executor.awaitTermination(1, TimeUnit.MINUTES));
-        Assert.assertEquals(1000, rate.get(TimeUnit.SECONDS), 100.0);
-    }
-}
diff --git a/test/unit/org/apache/cassandra/utils/TestTimeSource.java b/test/unit/org/apache/cassandra/utils/TestTimeSource.java
deleted file mode 100644
index 4ecd086..0000000
--- a/test/unit/org/apache/cassandra/utils/TestTimeSource.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *     http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.cassandra.utils;
-
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-public class TestTimeSource implements TimeSource
-{
-    private final AtomicLong timeInMillis = new AtomicLong(System.currentTimeMillis());
-
-    @Override
-    public long currentTimeMillis()
-    {
-        return timeInMillis.get();
-    }
-
-    @Override
-    public long nanoTime()
-    {
-        return timeInMillis.get() * 1_000_000;
-    }
-
-    @Override
-    public TimeSource sleep(long sleepFor, TimeUnit unit)
-    {
-        long current = timeInMillis.get();
-        long sleepInMillis = TimeUnit.MILLISECONDS.convert(sleepFor, unit);
-        boolean elapsed;
-        do
-        {
-            long newTime = current + sleepInMillis;
-            elapsed = timeInMillis.compareAndSet(current, newTime);
-            if (!elapsed)
-            {
-                long updated = timeInMillis.get();
-                if (updated - current >= sleepInMillis)
-                {
-                    elapsed = true;
-                }
-                else
-                {
-                    sleepInMillis -= updated - current;
-                    current = updated;
-                }
-            }
-        }
-        while (!elapsed);
-        return this;
-    }
-
-    @Override
-    public TimeSource sleepUninterruptibly(long sleepFor, TimeUnit unit)
-    {
-        return sleep(sleepFor, unit);
-    }
-}
diff --git a/test/unit/org/apache/cassandra/utils/UUIDTest.java b/test/unit/org/apache/cassandra/utils/UUIDTest.java
index ec0839a..62946b6 100644
--- a/test/unit/org/apache/cassandra/utils/UUIDTest.java
+++ b/test/unit/org/apache/cassandra/utils/UUIDTest.java
@@ -37,6 +37,10 @@
 import org.apache.cassandra.db.marshal.TimeUUIDType;
 import org.cliffc.high_scale_lib.NonBlockingHashMap;
 
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUID;
+import static org.apache.cassandra.utils.TimeUUID.Generator.nextTimeUUIDAsBytes;
+
 
 public class UUIDTest
 {
@@ -44,22 +48,22 @@
     public void verifyType1()
     {
 
-        UUID uuid = UUIDGen.getTimeUUID();
+        UUID uuid = nextTimeUUID().asUUID();
         assert uuid.version() == 1;
     }
 
     @Test
     public void verifyOrdering1()
     {
-        UUID one = UUIDGen.getTimeUUID();
-        UUID two = UUIDGen.getTimeUUID();
+        UUID one = nextTimeUUID().asUUID();
+        UUID two = nextTimeUUID().asUUID();
         assert one.timestamp() < two.timestamp();
     }
 
     @Test
     public void testDecomposeAndRaw()
     {
-        UUID a = UUIDGen.getTimeUUID();
+        UUID a = nextTimeUUID().asUUID();
         byte[] decomposed = UUIDGen.decompose(a);
         UUID b = UUIDGen.getUUID(ByteBuffer.wrap(decomposed));
         assert a.equals(b);
@@ -68,7 +72,7 @@
     @Test
     public void testToFromByteBuffer()
     {
-        UUID a = UUIDGen.getTimeUUID();
+        UUID a = nextTimeUUID().asUUID();
         ByteBuffer bb = UUIDGen.toByteBuffer(a);
         UUID b = UUIDGen.getUUID(bb);
         assert a.equals(b);
@@ -78,8 +82,8 @@
     public void testTimeUUIDType()
     {
         TimeUUIDType comp = TimeUUIDType.instance;
-        ByteBuffer first = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes());
-        ByteBuffer second = ByteBuffer.wrap(UUIDGen.getTimeUUIDBytes());
+        ByteBuffer first = ByteBuffer.wrap(nextTimeUUIDAsBytes());
+        ByteBuffer second = ByteBuffer.wrap(nextTimeUUIDAsBytes());
         assert comp.compare(first, second) < 0;
         assert comp.compare(second, first) > 0;
         ByteBuffer sameAsFirst = ByteBuffer.wrap(UUIDGen.decompose(UUIDGen.getUUID(first)));
@@ -90,8 +94,8 @@
     public void testUUIDTimestamp()
     {
         long now = System.currentTimeMillis();
-        UUID uuid = UUIDGen.getTimeUUID();
-        long tstamp = UUIDGen.getAdjustedTimestamp(uuid);
+        TimeUUID uuid = nextTimeUUID();
+        long tstamp = uuid.unix(MILLISECONDS);
 
         // I'll be damn is the uuid timestamp is more than 10ms after now
         assert now <= tstamp && now >= tstamp - 10 : "now = " + now + ", timestamp = " + tstamp;
@@ -118,7 +122,7 @@
 
                 for (long i = 0; i < iterations; i++)
                 {
-                    UUID uuid = UUIDGen.getTimeUUID();
+                    UUID uuid = nextTimeUUID().asUUID();
                     newTimestamp = uuid.timestamp();
 
                     if (lastTimestamp >= newTimestamp)
diff --git a/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java b/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java
index 311b924..5227e51 100644
--- a/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java
+++ b/test/unit/org/apache/cassandra/utils/binlog/BinLogTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils.binlog;
 
-import java.io.File;
 import java.nio.file.Path;
 import java.nio.file.Files;
 import java.util.ArrayList;
@@ -29,8 +28,11 @@
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Supplier;
 
+import org.apache.cassandra.config.DatabaseDescriptor;
+import org.apache.cassandra.io.util.File;
 import org.junit.After;
 import org.junit.Before;
+import org.junit.BeforeClass;
 import org.junit.Test;
 
 import net.openhft.chronicle.queue.ChronicleQueue;
@@ -40,6 +42,7 @@
 import net.openhft.chronicle.wire.WireOut;
 import org.apache.cassandra.Util;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
@@ -50,7 +53,7 @@
 {
     public static Path tempDir() throws Exception
     {
-        return Files.createTempDirectory("binlogtest" + System.nanoTime());
+        return Files.createTempDirectory("binlogtest" + nanoTime());
     }
 
     private static final String testString = "ry@nlikestheyankees";
@@ -59,6 +62,13 @@
     private BinLog binLog;
     private Path path;
 
+    @BeforeClass
+    public static void setup()
+    {
+        // PathUtils touches StorageService which touches StreamManager which requires configs be setup
+        DatabaseDescriptor.daemonInitialization();
+    }
+
     @Before
     public void setUp() throws Exception
     {
@@ -78,9 +88,9 @@
         {
             binLog.stop();
         }
-        for (File f : path.toFile().listFiles())
+        for (File f : new File(path).tryList())
         {
-            f.delete();
+            f.tryDelete();
         }
     }
 
diff --git a/test/unit/org/apache/cassandra/utils/binlog/DeletingArchiverTest.java b/test/unit/org/apache/cassandra/utils/binlog/DeletingArchiverTest.java
index cd6b7a3..940d121 100644
--- a/test/unit/org/apache/cassandra/utils/binlog/DeletingArchiverTest.java
+++ b/test/unit/org/apache/cassandra/utils/binlog/DeletingArchiverTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils.binlog;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -26,6 +25,7 @@
 import java.util.List;
 import java.util.Random;
 
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
@@ -40,7 +40,7 @@
         DeletingArchiver da = new DeletingArchiver(45);
         List<File> files = generateFiles(10, 5);
         for (File f : files)
-            da.onReleased(1, f);
+            da.onReleased(1, f.toJavaIOFile());
         // adding 5 files, each with size 10, this means the first one should have been deleted:
         assertFalse(files.get(0).exists());
         for (int i = 1; i < files.size(); i++)
@@ -53,7 +53,7 @@
     {
         DeletingArchiver da = new DeletingArchiver(45);
         List<File> largeFiles = generateFiles(50, 1);
-        da.onReleased(1, largeFiles.get(0));
+        da.onReleased(1, largeFiles.get(0).toJavaIOFile());
         assertFalse(largeFiles.get(0).exists());
         assertEquals(0, da.getBytesInStoreFiles());
     }
@@ -67,11 +67,11 @@
 
         for (File f : smallFiles)
         {
-            da.onReleased(1, f);
+            da.onReleased(1, f.toJavaIOFile());
         }
         assertEquals(40, da.getBytesInStoreFiles());
         // we now have 40 bytes in deleting archiver, adding the large 40 byte file should delete all the small ones
-        da.onReleased(1, largeFiles.get(0));
+        da.onReleased(1, largeFiles.get(0).toJavaIOFile());
         for (File f : smallFiles)
             assertFalse(f.exists());
 
@@ -79,7 +79,7 @@
 
         // make sure that size tracking is ok - all 4 new small files should still be there and the large one should be gone
         for (File f : smallFiles)
-            da.onReleased(1, f);
+            da.onReleased(1, f.toJavaIOFile());
 
         assertFalse(largeFiles.get(0).exists());
         for (File f : smallFiles)
@@ -99,7 +99,7 @@
         {
             Path p = Files.createTempFile("logfile", ".cq4");
             Files.write(p, content);
-            files.add(p.toFile());
+            files.add(new File(p));
         }
         files.forEach(File::deleteOnExit);
         return files;
diff --git a/test/unit/org/apache/cassandra/utils/binlog/ExternalArchiverTest.java b/test/unit/org/apache/cassandra/utils/binlog/ExternalArchiverTest.java
index 284ff5a..8e3c2db 100644
--- a/test/unit/org/apache/cassandra/utils/binlog/ExternalArchiverTest.java
+++ b/test/unit/org/apache/cassandra/utils/binlog/ExternalArchiverTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils.binlog;
 
-import java.io.File;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
@@ -30,6 +29,7 @@
 import java.util.concurrent.atomic.AtomicInteger;
 
 import com.google.common.collect.Sets;
+import org.apache.cassandra.io.util.File;
 import org.junit.Test;
 
 import net.openhft.chronicle.queue.impl.single.SingleChronicleQueue;
@@ -48,21 +48,21 @@
         String script = s.left;
         String dir = s.right;
         Path logdirectory = Files.createTempDirectory("logdirectory");
-        File logfileToArchive = Files.createTempFile(logdirectory, "logfile", "xyz").toFile();
+        File logfileToArchive = new File(Files.createTempFile(logdirectory, "logfile", "xyz"));
         Files.write(logfileToArchive.toPath(), "content".getBytes());
 
         ExternalArchiver ea = new ExternalArchiver(script+" %path", null, 10);
-        ea.onReleased(1, logfileToArchive);
+        ea.onReleased(1, logfileToArchive.toJavaIOFile());
         while (logfileToArchive.exists())
         {
             Thread.sleep(100);
         }
 
-        File movedFile = new File(dir, logfileToArchive.getName());
+        File movedFile = new File(dir, logfileToArchive.name());
         assertTrue(movedFile.exists());
         movedFile.deleteOnExit();
         ea.stop();
-        assertEquals(0, logdirectory.toFile().listFiles().length);
+        assertEquals(0, new File(logdirectory).tryList().length);
     }
 
     @Test
@@ -75,7 +75,7 @@
         Path dir = Files.createTempDirectory("archive");
         for (int i = 0; i < 10; i++)
         {
-            File logfileToArchive = Files.createTempFile(dir, "logfile", SingleChronicleQueue.SUFFIX).toFile();
+            File logfileToArchive = new File(Files.createTempFile(dir, "logfile", SingleChronicleQueue.SUFFIX));
             logfileToArchive.deleteOnExit();
             Files.write(logfileToArchive.toPath(), ("content"+i).getBytes());
             existingFiles.add(logfileToArchive);
@@ -94,13 +94,13 @@
                     Thread.sleep(100);
                     break;
                 }
-                File movedFile = new File(moveDir, f.getName());
+                File movedFile = new File(moveDir, f.name());
                 assertTrue(movedFile.exists());
                 movedFile.deleteOnExit();
             }
         }
         ea.stop();
-        assertEquals(0, dir.toFile().listFiles().length);
+        assertEquals(0, new File(dir).tryList().length);
     }
 
     @Test
@@ -114,7 +114,7 @@
         List<File> existingFiles = new ArrayList<>();
         for (int i = 0; i < 10; i++)
         {
-            File logfileToArchive = Files.createTempFile(dir, "logfile", SingleChronicleQueue.SUFFIX).toFile();
+            File logfileToArchive = new File(Files.createTempFile(dir, "logfile", SingleChronicleQueue.SUFFIX));
             logfileToArchive.deleteOnExit();
             Files.write(logfileToArchive.toPath(), ("content"+i).getBytes());
             existingFiles.add(logfileToArchive);
@@ -124,7 +124,7 @@
         for (File f : existingFiles)
         {
             assertFalse(f.exists());
-            File movedFile = new File(moveDir, f.getName());
+            File movedFile = new File(moveDir, f.name());
             assertTrue(movedFile.exists());
             movedFile.deleteOnExit();
         }
@@ -144,7 +144,7 @@
         String script = s.left;
         String moveDir = s.right;
         Path logdirectory = Files.createTempDirectory("logdirectory");
-        File logfileToArchive = Files.createTempFile(logdirectory, "logfile", "xyz").toFile();
+        File logfileToArchive = new File(Files.createTempFile(logdirectory, "logfile", "xyz"));
         Files.write(logfileToArchive.toPath(), "content".getBytes());
         AtomicInteger tryCounter = new AtomicInteger();
         AtomicBoolean success = new AtomicBoolean();
@@ -154,7 +154,7 @@
             ExternalArchiver.exec(cmd);
             success.set(true);
         });
-        ea.onReleased(0, logfileToArchive);
+        ea.onReleased(0, logfileToArchive.toJavaIOFile());
         while (tryCounter.get() < 2) // while we have only executed this 0 or 1 times, the file should still be on disk
         {
             Thread.sleep(100);
@@ -167,7 +167,7 @@
         // there will be 3 attempts in total, 2 failing ones, then the successful one:
         assertEquals(3, tryCounter.get());
         assertFalse(logfileToArchive.exists());
-        File movedFile = new File(moveDir, logfileToArchive.getName());
+        File movedFile = new File(moveDir, logfileToArchive.name());
         assertTrue(movedFile.exists());
         ea.stop();
     }
@@ -188,7 +188,7 @@
         String script = s.left;
         String moveDir = s.right;
         Path logdirectory = Files.createTempDirectory("logdirectory");
-        File logfileToArchive = Files.createTempFile(logdirectory, "logfile", "xyz").toFile();
+        File logfileToArchive = new File(Files.createTempFile(logdirectory, "logfile", "xyz"));
         Files.write(logfileToArchive.toPath(), "content".getBytes());
 
         AtomicInteger tryCounter = new AtomicInteger();
@@ -206,7 +206,7 @@
                 throw t;
             }
         });
-        ea.onReleased(0, logfileToArchive);
+        ea.onReleased(0, logfileToArchive.toJavaIOFile());
         while (tryCounter.get() < 3)
             Thread.sleep(500);
         assertTrue(logfileToArchive.exists());
@@ -214,9 +214,9 @@
         Thread.sleep(5000);
         assertTrue(logfileToArchive.exists());
         assertFalse(success.get());
-        File [] fs = new File(moveDir).listFiles(f ->
+        File [] fs = new File(moveDir).tryList(f ->
                                                  {
-                                                     if (f.getName().startsWith("file."))
+                                                     if (f.name().startsWith("file."))
                                                      {
                                                          f.deleteOnExit();
                                                          return true;
@@ -230,24 +230,24 @@
 
     private Pair<String, String> createScript() throws IOException
     {
-        File f = Files.createTempFile("script", "", PosixFilePermissions.asFileAttribute(Sets.newHashSet(PosixFilePermission.OWNER_WRITE,
+        File f = new File(Files.createTempFile("script", "", PosixFilePermissions.asFileAttribute(Sets.newHashSet(PosixFilePermission.OWNER_WRITE,
                                                                                                          PosixFilePermission.OWNER_READ,
-                                                                                                         PosixFilePermission.OWNER_EXECUTE))).toFile();
+                                                                                                         PosixFilePermission.OWNER_EXECUTE))));
         f.deleteOnExit();
-        File dir = Files.createTempDirectory("archive").toFile();
+        File dir = new File(Files.createTempDirectory("archive"));
         dir.deleteOnExit();
-        String script = "#!/bin/sh\nmv $1 "+dir.getAbsolutePath();
+        String script = "#!/bin/sh\nmv $1 "+dir.absolutePath();
         Files.write(f.toPath(), script.getBytes());
-        return Pair.create(f.getAbsolutePath(), dir.getAbsolutePath());
+        return Pair.create(f.absolutePath(), dir.absolutePath());
     }
 
     private Pair<String, String> createFailingScript(int failures) throws IOException
     {
-        File f = Files.createTempFile("script", "", PosixFilePermissions.asFileAttribute(Sets.newHashSet(PosixFilePermission.OWNER_WRITE,
+        File f = new File(Files.createTempFile("script", "", PosixFilePermissions.asFileAttribute(Sets.newHashSet(PosixFilePermission.OWNER_WRITE,
                                                                                                          PosixFilePermission.OWNER_READ,
-                                                                                                         PosixFilePermission.OWNER_EXECUTE))).toFile();
+                                                                                                         PosixFilePermission.OWNER_EXECUTE))));
         f.deleteOnExit();
-        File dir = Files.createTempDirectory("archive").toFile();
+        File dir = new File(Files.createTempDirectory("archive"));
         dir.deleteOnExit();
         // this script counts files in dir.getAbsolutePath, then if there are more than failures files in there, it moves the actual file
         String script = "#!/bin/bash%n" +
@@ -262,7 +262,7 @@
                         "    mv $1 $DIR%n"+
                         "fi%n";
 
-        Files.write(f.toPath(), String.format(script, dir.getAbsolutePath(), failures).getBytes());
-        return Pair.create(f.getAbsolutePath(), dir.getAbsolutePath());
+        Files.write(f.toPath(), String.format(script, dir.absolutePath(), failures).getBytes());
+        return Pair.create(f.absolutePath(), dir.absolutePath());
     }
 }
diff --git a/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java b/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java
index 739807e..73f0ff7 100644
--- a/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java
+++ b/test/unit/org/apache/cassandra/utils/btree/BTreeTest.java
@@ -26,7 +26,6 @@
 import org.junit.Assert;
 
 import static org.junit.Assert.*;
-import static org.junit.Assert.assertEquals;
 
 public class BTreeTest
 {
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestAsyncPromise.java b/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestAsyncPromise.java
new file mode 100644
index 0000000..8420ba5
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestAsyncPromise.java
@@ -0,0 +1,503 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+import javax.annotation.Nullable;
+
+import com.google.common.util.concurrent.FutureCallback;
+import com.google.common.util.concurrent.MoreExecutors;
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Assert;
+
+import io.netty.util.concurrent.GenericFutureListener;
+import org.apache.cassandra.config.DatabaseDescriptor;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public abstract class AbstractTestAsyncPromise extends AbstractTestPromise
+{
+    static
+    {
+        DatabaseDescriptor.clientInitialization();
+    }
+
+    public static <V> Promise<V> cancelSuccess(Promise<V> promise)
+    {
+        success(promise, Promise::isCancellable, true);
+        return cancelShared(promise);
+    }
+
+    public static <V> Promise<V> cancelExclusiveSuccess(Promise<V> promise)
+    {
+        success(promise, Promise::isCancellable, true);
+        success(promise, Promise::setUncancellableExclusive, true);
+        return cancelShared(promise);
+    }
+
+    private static <V> Promise<V> cancelShared(Promise<V> promise)
+    {
+        success(promise, Promise::setUncancellable, true);
+        success(promise, Promise::setUncancellable, true);
+        success(promise, Promise::setUncancellableExclusive, false);
+        success(promise, p -> p.cancel(true), false);
+        success(promise, p -> p.cancel(false), false);
+        success(promise, Promise::isCancellable, false);
+        success(promise, Promise::isCancelled, false);
+        return promise;
+    }
+
+    public static <V> Promise<V> cancelFailure(Promise<V> promise)
+    {
+        success(promise, Promise::isCancellable, false);
+        return cancelShared(promise);
+    }
+
+    protected <V> void testOneSuccess(Promise<V> promise, boolean tryOrSet, V value, V otherValue)
+    {
+        List<V> results = new ArrayList<>();
+        List<Integer> order = new ArrayList<>();
+        class ListenerFactory
+        {
+            int count = 0;
+
+            public GenericFutureListener<Future<V>> get()
+            {
+                int id = count++;
+                return p -> { results.add(p.getNow()); order.add(id); };
+            }
+            public GenericFutureListener<Future<V>> getListenerToFailure(Promise<V> promise)
+            {
+                int id = count++;
+                return p -> { Assert.assertTrue(p.cause() instanceof RuntimeException); results.add(promise.getNow()); order.add(id); };
+            }
+            public GenericFutureListener<Future<V>> getRecursive()
+            {
+                int id = count++;
+                return p -> { promise.addListener(get()); results.add(p.getNow()); order.add(id); };
+            }
+            public Runnable getRunnable(Future<V> p)
+            {
+                int id = count++;
+                return () -> { results.add(p.getNow()); order.add(id); };
+            }
+            public Runnable getRecursiveRunnable(Future<V> p)
+            {
+                int id = count++;
+                return () -> { promise.addListener(getRunnable(p)); results.add(p.getNow()); order.add(id); };
+            }
+            public Consumer<V> getConsumer()
+            {
+                int id = count++;
+                return result -> { results.add(result); order.add(id); };
+            }
+            public Consumer<V> getRecursiveConsumer()
+            {
+                int id = count++;
+                return result -> { promise.addCallback(getConsumer(), fail -> Assert.fail()); results.add(result); order.add(id); };
+            }
+            public Function<V, Future<V>> getAsyncFunction()
+            {
+                int id = count++;
+                return result -> { results.add(result); order.add(id); return ImmediateFuture.success(result); };
+            }
+            public Function<V, V> getFunction()
+            {
+                int id = count++;
+                return result -> { results.add(result); order.add(id); return result; };
+            }
+            public Function<V, Future<V>> getRecursiveAsyncFunction(Promise<V> promise)
+            {
+                int id = count++;
+                return result -> { promise.flatMap(getAsyncFunction()); results.add(result); order.add(id); return ImmediateFuture.success(result); };
+            }
+            public Function<V, Future<V>> getAsyncFailingFunction()
+            {
+                int id = count++;
+                return result -> { results.add(result); order.add(id); return ImmediateFuture.failure(new RuntimeException()); };
+            }
+            public Function<V, V> getFailingFunction()
+            {
+                int id = count++;
+                return result -> { results.add(result); order.add(id); throw new RuntimeException(); };
+            }
+            public Function<V, Future<V>> getRecursiveAsyncFailingFunction(Promise<V> promise)
+            {
+                int id = count++;
+                return result -> { promise.flatMap(getAsyncFailingFunction()); results.add(result); order.add(id); return ImmediateFuture.failure(new RuntimeException()); };
+            }
+            public FutureCallback<V> getCallback(Future<V> p)
+            {
+                int id = count++;
+                return new FutureCallback<V>()
+                {
+                    @Override
+                    public void onSuccess(@Nullable Object o)
+                    {
+                        results.add(p.getNow());
+                        order.add(id);
+                    }
+
+                    @Override
+                    public void onFailure(Throwable throwable)
+                    {
+                        Assert.fail();
+                    }
+                };
+            }
+            public FutureCallback<V> getRecursiveCallback(Future<V> p)
+            {
+                int id = count++;
+                return new FutureCallback<V>()
+                {
+                    @Override
+                    public void onSuccess(@Nullable Object o)
+                    {
+                        promise.addCallback(getCallback(p));
+                        results.add(p.getNow());
+                        order.add(id);
+                    }
+
+                    @Override
+                    public void onFailure(Throwable throwable)
+                    {
+                        Assert.fail();
+                    }
+                };
+            }
+        }
+        ListenerFactory listeners = new ListenerFactory();
+        Async async = new Async();
+        promise.addListener(listeners.get());
+        promise.addListener(listeners.getRunnable(promise));
+        promise.addListener(listeners.getRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListeners(listeners.getRecursive(), listeners.get());
+        promise.addListener(listeners.getRecursiveRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListener(listeners.getRecursive());
+        promise.addCallback(listeners.getCallback(promise));
+        promise.addCallback(listeners.getCallback(promise), MoreExecutors.directExecutor());
+        promise.addCallback(listeners.getRecursiveCallback(promise));
+        promise.addCallback(listeners.getRecursiveCallback(promise), MoreExecutors.directExecutor());
+        promise.addCallback(listeners.getConsumer(), fail -> Assert.fail());
+        promise.addCallback(listeners.getConsumer(), fail -> Assert.fail(), MoreExecutors.directExecutor());
+        promise.addCallback(listeners.getRecursiveConsumer(), fail -> Assert.fail());
+        promise.addCallback(listeners.getRecursiveConsumer(), fail -> Assert.fail(), MoreExecutors.directExecutor());
+        promise.map(listeners.getFunction()).addListener(listeners.get());
+        promise.map(listeners.getFunction(), MoreExecutors.directExecutor()).addListener(listeners.get());
+        promise.map(listeners.getFailingFunction()).addListener(listeners.getListenerToFailure(promise));
+        promise.map(listeners.getFailingFunction(), MoreExecutors.directExecutor()).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getAsyncFunction()).addListener(listeners.get());
+        promise.flatMap(listeners.getAsyncFunction(), MoreExecutors.directExecutor()).addListener(listeners.get());
+        promise.flatMap(listeners.getRecursiveAsyncFunction(promise)).addListener(listeners.get());
+        promise.flatMap(listeners.getRecursiveAsyncFunction(promise), MoreExecutors.directExecutor()).addListener(listeners.get());
+        promise.flatMap(listeners.getAsyncFailingFunction()).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getAsyncFailingFunction(), MoreExecutors.directExecutor()).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getRecursiveAsyncFailingFunction(promise)).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getRecursiveAsyncFailingFunction(promise), MoreExecutors.directExecutor()).addListener(listeners.getListenerToFailure(promise));
+
+        success(promise, Promise::getNow, null);
+        success(promise, Promise::isSuccess, false);
+        success(promise, Promise::isDone, false);
+        success(promise, Promise::isCancelled, false);
+        async.success(promise, Promise::get, value);
+        async.success(promise, p -> p.get(1L, SECONDS), value);
+        async.success(promise, Promise::await, promise);
+        async.success(promise, Promise::awaitUninterruptibly, promise);
+        async.success(promise, p -> p.await(1L, SECONDS), true);
+        async.success(promise, p -> p.await(1000L), true);
+        async.success(promise, p -> p.awaitUninterruptibly(1L, SECONDS), true);
+        async.success(promise, p -> p.awaitUninterruptibly(1000L), true);
+        async.success(promise, Promise::sync, promise);
+        async.success(promise, Promise::syncUninterruptibly, promise);
+        if (tryOrSet) promise.trySuccess(value);
+        else promise.setSuccess(value);
+        success(promise, p -> p.cancel(true), false);
+        success(promise, p -> p.cancel(false), false);
+        failure(promise, p -> p.setSuccess(null), IllegalStateException.class);
+        failure(promise, p -> p.setFailure(new NullPointerException()), IllegalStateException.class);
+        success(promise, Promise::getNow, value);
+        success(promise, p -> p.trySuccess(otherValue), false);
+        success(promise, p -> p.tryFailure(new NullPointerException()), false);
+        success(promise, Promise::getNow, value);
+        success(promise, Promise::cause, null);
+        promise.addListener(listeners.get());
+        promise.addListener(listeners.getRunnable(promise));
+        promise.addListener(listeners.getRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListeners(listeners.getRecursive(), listeners.get());
+        promise.addListener(listeners.getRecursiveRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListener(listeners.getRecursive());
+        promise.addCallback(listeners.getCallback(promise));
+        promise.addCallback(listeners.getCallback(promise), MoreExecutors.directExecutor());
+        promise.addCallback(listeners.getRecursiveCallback(promise));
+        promise.addCallback(listeners.getRecursiveCallback(promise), MoreExecutors.directExecutor());
+        promise.addCallback(listeners.getConsumer(), fail -> Assert.fail());
+        promise.addCallback(listeners.getConsumer(), fail -> Assert.fail(), MoreExecutors.directExecutor());
+        promise.addCallback(listeners.getRecursiveConsumer(), fail -> Assert.fail());
+        promise.addCallback(listeners.getRecursiveConsumer(), fail -> Assert.fail(), MoreExecutors.directExecutor());
+        promise.map(listeners.getFunction()).addListener(listeners.get());
+        promise.map(listeners.getFunction(), MoreExecutors.directExecutor()).addListener(listeners.get());
+        promise.map(listeners.getFailingFunction()).addListener(listeners.getListenerToFailure(promise));
+        promise.map(listeners.getFailingFunction(), MoreExecutors.directExecutor()).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getAsyncFunction()).addListener(listeners.get());
+        promise.flatMap(listeners.getAsyncFunction(), MoreExecutors.directExecutor()).addListener(listeners.get());
+        promise.flatMap(listeners.getRecursiveAsyncFunction(promise)).addListener(listeners.get());
+        promise.flatMap(listeners.getRecursiveAsyncFunction(promise), MoreExecutors.directExecutor()).addListener(listeners.get());
+        promise.flatMap(listeners.getAsyncFailingFunction()).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getAsyncFailingFunction(), MoreExecutors.directExecutor()).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getRecursiveAsyncFailingFunction(promise)).addListener(listeners.getListenerToFailure(promise));
+        promise.flatMap(listeners.getRecursiveAsyncFailingFunction(promise), MoreExecutors.directExecutor()).addListener(listeners.getListenerToFailure(promise));
+        success(promise, Promise::isSuccess, true);
+        success(promise, Promise::isDone, true);
+        success(promise, Promise::isCancelled, false);
+        async.verify();
+        Assert.assertEquals(listeners.count, results.size());
+        Assert.assertEquals(listeners.count, order.size());
+        for (V result : results)
+            Assert.assertEquals(value, result);
+        for (int i = 0 ; i < order.size() ; ++i)
+            Assert.assertEquals(i, order.get(i).intValue());
+    }
+
+    protected <V> void testOneFailure(Promise<V> promise, boolean tryOrSet, Throwable cause, V otherValue)
+    {
+        List<Throwable> results = new ArrayList<>();
+        List<Integer> order = new ArrayList<>();
+        Async async = new Async();
+        class ListenerFactory
+        {
+            int count = 0;
+
+            public GenericFutureListener<Future<V>> get()
+            {
+                int id = count++;
+                return p -> { results.add(p.cause()); order.add(id); };
+            }
+            public GenericFutureListener<Future<V>> getRecursive()
+            {
+                int id = count++;
+                return p -> { promise.addListener(get()); results.add(p.cause()); order.add(id); };
+            }
+            public Runnable getRunnable(Future<V> p)
+            {
+                int id = count++;
+                return () -> { results.add(p.cause()); order.add(id); };
+            }
+            public Runnable getRecursiveRunnable(Future<V> p)
+            {
+                int id = count++;
+                return () -> { promise.addListener(getRunnable(p)); results.add(p.cause()); order.add(id); };
+            }
+            public Consumer<Throwable> getConsumer()
+            {
+                int id = count++;
+                return result -> { results.add(result); order.add(id); };
+            }
+            public Consumer<Throwable> getRecursiveConsumer()
+            {
+                int id = count++;
+                return result -> { promise.addCallback(fail -> Assert.fail(), getConsumer()); results.add(result); order.add(id); };
+            }
+            public Function<V, Future<V>> getAsyncFunction()
+            {
+                return result -> { Assert.fail(); return ImmediateFuture.success(result); };
+            }
+            public Function<V, Future<V>> getRecursiveAsyncFunction()
+            {
+                return result -> { promise.flatMap(getAsyncFunction()); return ImmediateFuture.success(result); };
+            }
+            public FutureCallback<V> getCallback(Future<V> p)
+            {
+                int id = count++;
+                return new FutureCallback<V>()
+                {
+                    @Override
+                    public void onSuccess(@Nullable Object o)
+                    {
+                        Assert.fail();
+                    }
+
+                    @Override
+                    public void onFailure(Throwable throwable)
+                    {
+                        results.add(p.cause());
+                        order.add(id);
+                    }
+                };
+            }
+            public FutureCallback<V> getRecursiveCallback(Future<V> p)
+            {
+                int id = count++;
+                return new FutureCallback<V>()
+                {
+                    @Override
+                    public void onSuccess(@Nullable Object o)
+                    {
+                        Assert.fail();
+                    }
+
+                    @Override
+                    public void onFailure(Throwable throwable)
+                    {
+                        promise.addCallback(getCallback(p));
+                        results.add(p.cause());
+                        order.add(id);
+                    }
+                };
+            }
+        }
+        ListenerFactory listeners = new ListenerFactory();
+        promise.addListener(listeners.get());
+        promise.addListeners(listeners.getRecursive(), listeners.get());
+        promise.addListener(listeners.getRecursive());
+        promise.addListener(listeners.getRunnable(promise));
+        promise.addListener(listeners.getRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListener(listeners.getRecursiveRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListener(listeners.getRecursive());
+        promise.addCallback(listeners.getCallback(promise));
+        promise.addCallback(listeners.getRecursiveCallback(promise));
+        promise.addCallback(fail -> Assert.fail(), listeners.getConsumer());
+        promise.addCallback(fail -> Assert.fail(), listeners.getRecursiveConsumer());
+        promise.flatMap(listeners.getAsyncFunction()).addListener(listeners.get());
+        promise.flatMap(listeners.getAsyncFunction(), MoreExecutors.directExecutor()).addListener(listeners.get());
+        promise.flatMap(listeners.getRecursiveAsyncFunction()).addListener(listeners.get());
+        promise.flatMap(listeners.getRecursiveAsyncFunction(), MoreExecutors.directExecutor()).addListener(listeners.get());
+        success(promise, Promise::isSuccess, false);
+        success(promise, Promise::isDone, false);
+        success(promise, Promise::isCancelled, false);
+        success(promise, Promise::getNow, null);
+        success(promise, Promise::cause, null);
+        async.failure(promise, p -> p.get(), ExecutionException.class);
+        async.failure(promise, p -> p.get(1L, SECONDS), ExecutionException.class);
+        async.success(promise, Promise::await, promise);
+        async.success(promise, Promise::awaitThrowUncheckedOnInterrupt, promise);
+        async.success(promise, Promise::awaitUninterruptibly, promise);
+        async.success(promise, p -> p.await(1L, SECONDS), true);
+        async.success(promise, p -> p.await(1000L), true);
+        async.success(promise, p -> p.awaitUninterruptibly(1L, SECONDS), true);
+        async.success(promise, p -> p.awaitThrowUncheckedOnInterrupt(1L, SECONDS), true);
+        async.success(promise, p -> p.awaitUninterruptibly(1000L), true);
+        async.success(promise, p -> p.awaitUntil(nanoTime() + SECONDS.toNanos(1L)), true);
+        async.success(promise, p -> p.awaitUntilUninterruptibly(nanoTime() + SECONDS.toNanos(1L)), true);
+        async.success(promise, p -> p.awaitUntilThrowUncheckedOnInterrupt(nanoTime() + SECONDS.toNanos(1L)), true);
+        async.failure(promise, p -> p.sync(), cause);
+        async.failure(promise, p -> p.syncUninterruptibly(), cause);
+        if (tryOrSet) promise.tryFailure(cause);
+        else promise.setFailure(cause);
+        success(promise, p -> p.cancel(true), false);
+        success(promise, p -> p.cancel(false), false);
+        failure(promise, p -> p.setSuccess(null), IllegalStateException.class);
+        failure(promise, p -> p.setFailure(new NullPointerException()), IllegalStateException.class);
+        success(promise, Promise::cause, cause);
+        success(promise, Promise::getNow, null);
+        success(promise, p -> p.trySuccess(otherValue), false);
+        success(promise, p -> p.tryFailure(new NullPointerException()), false);
+        success(promise, Promise::getNow, null);
+        success(promise, Promise::cause, cause);
+        promise.addListener(listeners.get());
+        promise.addListeners(listeners.getRecursive(), listeners.get());
+        promise.addListener(listeners.getRecursive());
+        promise.addListener(listeners.getRunnable(promise));
+        promise.addListener(listeners.getRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListener(listeners.getRecursiveRunnable(promise), MoreExecutors.directExecutor());
+        promise.addListener(listeners.getRecursive());
+        promise.addCallback(listeners.getCallback(promise));
+        promise.addCallback(listeners.getRecursiveCallback(promise));
+        promise.addCallback(fail -> Assert.fail(), listeners.getConsumer());
+        promise.addCallback(fail -> Assert.fail(), listeners.getRecursiveConsumer());
+        promise.flatMap(listeners.getAsyncFunction()).addListener(listeners.get());
+        promise.flatMap(listeners.getAsyncFunction(), MoreExecutors.directExecutor()).addListener(listeners.get());
+        success(promise, Promise::isSuccess, false);
+        success(promise, Promise::isDone, true);
+        success(promise, Promise::isCancelled, false);
+        success(promise, Promise::isCancellable, false);
+        async.verify();
+        Assert.assertEquals(listeners.count, results.size());
+        Assert.assertEquals(listeners.count, order.size());
+        for (Throwable result : results)
+            Assert.assertEquals(cause, result);
+        for (int i = 0 ; i < order.size() ; ++i)
+            Assert.assertEquals(i, order.get(i).intValue());
+    }
+
+    // TODO: test listeners?
+    public <V> void testOneCancellation(Promise<V> promise, boolean interruptIfRunning, V otherValue)
+    {
+        Async async = new Async();
+        success(promise, Promise::isCancellable, true);
+        success(promise, Promise::getNow, null);
+        success(promise, Promise::cause, null);
+        async.failure(promise, p -> p.get(), CancellationException.class);
+        async.failure(promise, p -> p.get(1L, SECONDS), CancellationException.class);
+        async.success(promise, Promise::await, promise);
+        async.success(promise, Promise::awaitThrowUncheckedOnInterrupt, promise);
+        async.success(promise, Promise::awaitUninterruptibly, promise);
+        async.success(promise, p -> p.await(1L, SECONDS), true);
+        async.success(promise, p -> p.await(1000L), true);
+        async.success(promise, p -> p.awaitUninterruptibly(1L, SECONDS), true);
+        async.success(promise, p -> p.awaitThrowUncheckedOnInterrupt(1L, SECONDS), true);
+        async.success(promise, p -> p.awaitUninterruptibly(1000L), true);
+        async.success(promise, p -> p.awaitUntil(nanoTime() + SECONDS.toNanos(1L)), true);
+        async.success(promise, p -> p.awaitUntilUninterruptibly(nanoTime() + SECONDS.toNanos(1L)), true);
+        async.success(promise, p -> p.awaitUntilThrowUncheckedOnInterrupt(nanoTime() + SECONDS.toNanos(1L)), true);
+        async.failure(promise, p -> p.sync(), CancellationException.class);
+        async.failure(promise, p -> p.syncUninterruptibly(), CancellationException.class);
+        promise.cancel(interruptIfRunning);
+        failure(promise, p -> p.setFailure(null), IllegalStateException.class);
+        failure(promise, p -> p.setFailure(null), IllegalStateException.class);
+        Assert.assertTrue(promise.cause() instanceof CancellationException);
+        success(promise, Promise::getNow, null);
+        success(promise, p -> p.trySuccess(otherValue), false);
+        success(promise, Promise::getNow, null);
+        Assert.assertTrue(promise.cause() instanceof CancellationException);
+        success(promise, Promise::isSuccess, false);
+        success(promise, Promise::isDone, true);
+        success(promise, Promise::isCancelled, true);
+        success(promise, Promise::isCancellable, false);
+        async.verify();
+    }
+
+
+    public <V> void testOneTimeout(Promise<V> promise)
+    {
+        Async async = new Async();
+        async.failure(promise, p -> p.get(1L, MILLISECONDS), TimeoutException.class);
+        async.success(promise, p -> p.await(1L, MILLISECONDS), false);
+        async.success(promise, p -> p.awaitThrowUncheckedOnInterrupt(1L, MILLISECONDS), false);
+        async.success(promise, p -> p.await(1L), false);
+        async.success(promise, p -> p.awaitUninterruptibly(1L, MILLISECONDS), false);
+        async.success(promise, p -> p.awaitThrowUncheckedOnInterrupt(1L, MILLISECONDS), false);
+        async.success(promise, p -> p.awaitUninterruptibly(1L), false);
+        async.success(promise, p -> p.awaitUntil(nanoTime() + MILLISECONDS.toNanos(1L)), false);
+        async.success(promise, p -> p.awaitUntilUninterruptibly(nanoTime() + MILLISECONDS.toNanos(1L)), false);
+        async.success(promise, p -> p.awaitUntilThrowUncheckedOnInterrupt(nanoTime() + MILLISECONDS.toNanos(1L)), false);
+        Uninterruptibles.sleepUninterruptibly(10L, MILLISECONDS);
+        async.verify();
+    }
+
+}
+
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestAwaitable.java b/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestAwaitable.java
new file mode 100644
index 0000000..8b95eaf
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestAwaitable.java
@@ -0,0 +1,177 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.utils.concurrent;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+import java.util.function.Consumer;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.Assert;
+
+import net.openhft.chronicle.core.util.ThrowingBiConsumer;
+import net.openhft.chronicle.core.util.ThrowingConsumer;
+import net.openhft.chronicle.core.util.ThrowingFunction;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public abstract class AbstractTestAwaitable<A extends Awaitable>
+{
+    protected final ExecutorService exec = Executors.newCachedThreadPool();
+
+    protected void testOneSuccess(A awaitable, Consumer<A> signal)
+    {
+        Async async = new Async();
+        //noinspection Convert2MethodRef
+        async.success(awaitable, a -> a.await(), awaitable);
+        async.success(awaitable, a -> a.awaitUninterruptibly(), awaitable);
+        async.success(awaitable, a -> a.awaitThrowUncheckedOnInterrupt(), awaitable);
+        async.success(awaitable, a -> a.await(1L, SECONDS), true);
+        async.success(awaitable, a -> a.awaitUninterruptibly(1L, SECONDS), true);
+        async.success(awaitable, a -> a.awaitThrowUncheckedOnInterrupt(1L, SECONDS), true);
+        async.success(awaitable, a -> a.awaitUntil(Long.MAX_VALUE), true);
+        async.success(awaitable, a -> a.awaitUntilUninterruptibly(Long.MAX_VALUE), true);
+        async.success(awaitable, a -> a.awaitUntilThrowUncheckedOnInterrupt(Long.MAX_VALUE), true);
+        signal.accept(awaitable);
+        async.verify();
+    }
+
+    public void testOneTimeout(A awaitable)
+    {
+        Async async = new Async();
+        async.success(awaitable, a -> a.await(1L, MILLISECONDS), false);
+        async.success(awaitable, a -> a.awaitUninterruptibly(1L, MILLISECONDS), false);
+        async.success(awaitable, a -> a.awaitThrowUncheckedOnInterrupt(1L, MILLISECONDS), false);
+        async.success(awaitable, a -> a.awaitUntil(nanoTime() + MILLISECONDS.toNanos(1L)), false);
+        async.success(awaitable, a -> a.awaitUntilUninterruptibly(nanoTime() + MILLISECONDS.toNanos(1L)), false);
+        async.success(awaitable, a -> a.awaitUntilThrowUncheckedOnInterrupt(nanoTime() + MILLISECONDS.toNanos(1L)), false);
+        Uninterruptibles.sleepUninterruptibly(10L, MILLISECONDS);
+        async.verify();
+    }
+
+    public void testOneInterrupt(A awaitable)
+    {
+        Async async = new Async();
+        async.failure(awaitable, a -> { Thread.currentThread().interrupt(); a.await(); }, InterruptedException.class);
+        async.failure(awaitable, a -> { Thread.currentThread().interrupt(); a.await(1L, SECONDS); }, InterruptedException.class);
+        async.success(awaitable, a -> { Thread.currentThread().interrupt(); return a.awaitUninterruptibly(1L, SECONDS); }, false);
+        async.failure(awaitable, a -> { Thread.currentThread().interrupt(); a.awaitThrowUncheckedOnInterrupt(1L, SECONDS); }, UncheckedInterruptedException.class);
+        async.failure(awaitable, a -> { Thread.currentThread().interrupt(); a.awaitUntil(nanoTime() + SECONDS.toNanos(1L)); }, InterruptedException.class);
+        async.success(awaitable, a -> { Thread.currentThread().interrupt(); return a.awaitUntilUninterruptibly(nanoTime() + SECONDS.toNanos(1L)); }, false);
+        async.failure(awaitable, a -> { Thread.currentThread().interrupt(); a.awaitUntilThrowUncheckedOnInterrupt(nanoTime() + SECONDS.toNanos(1L)); }, UncheckedInterruptedException.class);
+        Uninterruptibles.sleepUninterruptibly(2L, SECONDS);
+        async.verify();
+    }
+
+    class Async
+    {
+        final List<ThrowingBiConsumer<Long, TimeUnit, ?>> waitingOn = new ArrayList<>();
+        void verify()
+        {
+            for (int i = 0 ; i < waitingOn.size() ; ++i)
+            {
+                try
+                {
+                    waitingOn.get(i).accept(100L, MILLISECONDS);
+                }
+                catch (Throwable t)
+                {
+                    throw new AssertionError("" + i, t);
+                }
+            }
+        }
+        void failure(A awaitable, ThrowingConsumer<A, ?> action, Throwable failsWith)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestAwaitable.failure(awaitable, action, failsWith))::get);
+        }
+        void failure(A awaitable, ThrowingConsumer<A, ?> action, Class<? extends Throwable> failsWith)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestAwaitable.failure(awaitable, action, failsWith))::get);
+        }
+        void failure(A awaitable, ThrowingConsumer<A, ?> action, Predicate<Throwable> failsWith)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestAwaitable.failure(awaitable, action, failsWith))::get);
+        }
+        <P extends A, R> void success(P awaitable, ThrowingFunction<P, R, ?> action, R result)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestAwaitable.success(awaitable, action, result))::get);
+        }
+        <P extends A, R> void success(P awaitable, ThrowingFunction<P, R, ?> action, Predicate<R> result)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestAwaitable.success(awaitable, action, result))::get);
+        }
+    }
+
+    private static <A extends Awaitable> void failure(A awaitable, ThrowingConsumer<A, ?> action, Throwable failsWith)
+    {
+        failure(awaitable, action, t -> Objects.equals(failsWith, t));
+    }
+
+    static <A extends Awaitable> void failure(A awaitable, ThrowingConsumer<A, ?> action, Class<? extends Throwable> failsWith)
+    {
+        failure(awaitable, action, failsWith::isInstance);
+    }
+
+    private static <A extends Awaitable> void failure(A awaitable, ThrowingConsumer<A, ?> action, Predicate<Throwable> failsWith)
+    {
+        Throwable fail = null;
+        try
+        {
+            action.accept(awaitable);
+        }
+        catch (Throwable t)
+        {
+            fail = t;
+        }
+        if (!failsWith.test(fail))
+            throw new AssertionError(fail);
+    }
+
+    static <A extends Awaitable, R> void success(A awaitable, ThrowingFunction<A, R, ?> action, R result)
+    {
+        try
+        {
+            Assert.assertEquals(result, action.apply(awaitable));
+        }
+        catch (Throwable t)
+        {
+            throw new AssertionError(t);
+        }
+    }
+
+    static <A extends Awaitable, R> void success(A awaitable, ThrowingFunction<A, R, ?> action, Predicate<R> result)
+    {
+        try
+        {
+            Assert.assertTrue(result.test(action.apply(awaitable)));
+        }
+        catch (Throwable t)
+        {
+            throw new AssertionError(t);
+        }
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestPromise.java b/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestPromise.java
new file mode 100644
index 0000000..982d42d
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/AbstractTestPromise.java
@@ -0,0 +1,112 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
+import java.util.function.Predicate;
+
+import org.junit.Assert;
+
+import io.netty.util.concurrent.Promise;
+import net.openhft.chronicle.core.util.ThrowingBiConsumer;
+import net.openhft.chronicle.core.util.ThrowingConsumer;
+import net.openhft.chronicle.core.util.ThrowingFunction;
+
+public abstract class AbstractTestPromise
+{
+    protected final ExecutorService exec = Executors.newCachedThreadPool();
+
+    class Async
+    {
+        final List<ThrowingBiConsumer<Long, TimeUnit, ?>> waitingOn = new ArrayList<>();
+        void verify()
+        {
+            for (int i = 0 ; i < waitingOn.size() ; ++i)
+            {
+                try
+                {
+                    waitingOn.get(i).accept(1L, TimeUnit.SECONDS);
+                }
+                catch (Throwable t)
+                {
+                    throw new AssertionError("" + i, t);
+                }
+            }
+        }
+        <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Throwable failsWith)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestPromise.failure(promise, action, failsWith))::get);
+        }
+        <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Class<? extends Throwable> failsWith)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestPromise.failure(promise, action, failsWith))::get);
+        }
+        <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Predicate<Throwable> failsWith)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestPromise.failure(promise, action, failsWith))::get);
+        }
+        <P extends Promise<?>, R> void success(P promise, ThrowingFunction<P, R, ?> action, R result)
+        {
+            waitingOn.add(exec.submit(() -> AbstractTestPromise.success(promise, action, result))::get);
+        }
+    }
+
+    private static <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Throwable failsWith)
+    {
+        failure(promise, action, t -> Objects.equals(failsWith, t));
+    }
+
+    static <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Class<? extends Throwable> failsWith)
+    {
+        failure(promise, action, failsWith::isInstance);
+    }
+
+    private static <V> void failure(Promise<V> promise, ThrowingConsumer<Promise<V>, ?> action, Predicate<Throwable> failsWith)
+    {
+        Throwable fail = null;
+        try
+        {
+            action.accept(promise);
+        }
+        catch (Throwable t)
+        {
+            fail = t;
+        }
+        if (!failsWith.test(fail))
+            throw new AssertionError(fail);
+    }
+
+    static <P extends Promise<?>, R> void success(P promise, ThrowingFunction<P, R, ?> action, R result)
+    {
+        try
+        {
+            Assert.assertEquals(result, action.apply(promise));
+        }
+        catch (Throwable t)
+        {
+            throw new AssertionError(t);
+        }
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/AsyncPromiseTest.java b/test/unit/org/apache/cassandra/utils/concurrent/AsyncPromiseTest.java
new file mode 100644
index 0000000..cb1da09
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/AsyncPromiseTest.java
@@ -0,0 +1,250 @@
+/*
+ * 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.utils.concurrent;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.function.Supplier;
+import java.util.stream.Collectors;
+
+import com.google.common.collect.ImmutableList;
+import com.google.common.util.concurrent.MoreExecutors;
+
+import io.netty.util.concurrent.Future;
+import io.netty.util.concurrent.GenericFutureListener;
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.utils.WithResources;
+
+public class AsyncPromiseTest extends AbstractTestAsyncPromise
+{
+    @After
+    public void shutdown()
+    {
+        exec.shutdownNow();
+    }
+
+    private static <V> List<Supplier<Promise<V>>> suppliers(AtomicInteger listeners, boolean includeUncancellable)
+    {
+        List<Supplier<Promise<V>>> cancellable = ImmutableList.of(
+            () -> new AsyncPromise<>(),
+            () -> new AsyncPromise<>(f -> listeners.incrementAndGet()),
+            () -> AsyncPromise.withExecutor(TestInExecutor.INSTANCE));
+        List<Supplier<Promise<V>>> uncancellable = ImmutableList.of(
+            () -> AsyncPromise.uncancellable(),
+            () -> AsyncPromise.uncancellable((GenericFutureListener<? extends Future<? super V>>) f -> listeners.incrementAndGet()),
+            () -> AsyncPromise.uncancellable(MoreExecutors.directExecutor()),
+            () -> AsyncPromise.uncancellable(TestInExecutor.INSTANCE)
+        );
+
+        if (!includeUncancellable)
+            return cancellable;
+
+        ImmutableList.Builder<Supplier<Promise<V>>> builder = ImmutableList.builder();
+        builder.addAll(cancellable)
+               .addAll(cancellable.stream().map(s -> (Supplier<Promise<V>>) () -> cancelSuccess(s.get())).collect(Collectors.toList()))
+               .addAll(cancellable.stream().map(s -> (Supplier<Promise<V>>) () -> cancelExclusiveSuccess(s.get())).collect(Collectors.toList()))
+               .addAll(uncancellable)
+               .addAll(uncancellable.stream().map(s -> (Supplier<Promise<V>>) () -> cancelFailure(s.get())).collect(Collectors.toList()));
+        return builder.build();
+    }
+
+    @Test
+    public void testSuccess()
+    {
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Integer>>> suppliers = suppliers(initialListeners, true);
+        for (boolean tryOrSet : new boolean[]{ false, true })
+            for (Integer v : new Integer[]{ null, 1 })
+                for (Supplier<Promise<Integer>> supplier : suppliers)
+                    testOneSuccess(supplier.get(), tryOrSet, v, 2);
+        Assert.assertEquals(5 * 2 * 2, initialListeners.get());
+    }
+
+    @Test
+    public void testFailure()
+    {
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Integer>>> suppliers = suppliers(initialListeners, true);
+        for (boolean tryOrSet : new boolean[] { false, true })
+            for (Throwable v : new Throwable[] { null, new NullPointerException() })
+                for (Supplier<Promise<Integer>> supplier : suppliers)
+                    testOneFailure(supplier.get(), tryOrSet, v, 2);
+        Assert.assertEquals(5 * 2 * 2, initialListeners.get());
+    }
+
+
+    @Test
+    public void testCancellation()
+    {
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Integer>>> suppliers = suppliers(initialListeners, false);
+        for (boolean interruptIfRunning : new boolean[] { true, false })
+            for (Supplier<Promise<Integer>> supplier : suppliers)
+                testOneCancellation(supplier.get(), interruptIfRunning, 2);
+        Assert.assertEquals(2, initialListeners.get());
+    }
+
+
+    @Test
+    public void testTimeout()
+    {
+        final AtomicInteger initialListeners = new AtomicInteger();
+        List<Supplier<Promise<Integer>>> suppliers = suppliers(initialListeners, true);
+        for (Supplier<Promise<Integer>> supplier : suppliers)
+            testOneTimeout(supplier.get());
+        Assert.assertEquals(0, initialListeners.get());
+    }
+
+    private static final class TestInExecutor implements ExecutorPlus
+    {
+        static final TestInExecutor INSTANCE = new TestInExecutor();
+        @Override
+        public void shutdown()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public List<Runnable> shutdownNow()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isShutdown()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean isTerminated()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean awaitTermination(long timeout, TimeUnit unit) throws InterruptedException
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public <T> org.apache.cassandra.utils.concurrent.Future<T> submit(Callable<T> task)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public <T> org.apache.cassandra.utils.concurrent.Future<T> submit(Runnable task, T result)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public org.apache.cassandra.utils.concurrent.Future<?> submit(Runnable task)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void execute(WithResources withResources, Runnable task)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public <T> org.apache.cassandra.utils.concurrent.Future<T> submit(WithResources withResources, Callable<T> task)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public org.apache.cassandra.utils.concurrent.Future<?> submit(WithResources withResources, Runnable task)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public <T> org.apache.cassandra.utils.concurrent.Future<T> submit(WithResources withResources, Runnable task, T result)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public boolean inExecutor()
+        {
+            return true;
+        }
+
+        @Override
+        public void execute(Runnable command)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int getCorePoolSize()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void setCorePoolSize(int newCorePoolSize)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int getMaximumPoolSize()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public void setMaximumPoolSize(int newMaximumPoolSize)
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int getActiveTaskCount()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public long getCompletedTaskCount()
+        {
+            throw new UnsupportedOperationException();
+        }
+
+        @Override
+        public int getPendingTaskCount()
+        {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+}
+
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/ConditionTest.java b/test/unit/org/apache/cassandra/utils/concurrent/ConditionTest.java
new file mode 100644
index 0000000..290ad70
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/ConditionTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.function.Supplier;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class ConditionTest extends AbstractTestAwaitable<Condition>
+{
+    @Test
+    public void testAsync()
+    {
+        testOne(Condition.Async::new);
+    }
+
+    @Test
+    public void testSync()
+    {
+        testOne(Condition.Sync::new);
+    }
+
+    void testOne(Supplier<Condition> cs)
+    {
+        Condition c = cs.get();
+        testOneTimeout(c);
+        Assert.assertFalse(c.isSignalled());
+
+        testOneInterrupt(c);
+        Assert.assertFalse(c.isSignalled());
+
+        testOneSuccess(c, Condition::signal);
+        Assert.assertTrue(c.isSignalled());
+
+        Condition c2 = cs.get();
+        testOneSuccess(c2, Condition::signalAll);
+        Assert.assertTrue(c2.isSignalled());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/CountDownLatchTest.java b/test/unit/org/apache/cassandra/utils/concurrent/CountDownLatchTest.java
new file mode 100644
index 0000000..3361eab
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/CountDownLatchTest.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.utils.concurrent;
+
+import java.util.function.Supplier;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class CountDownLatchTest extends AbstractTestAwaitable<CountDownLatch>
+{
+    @Test
+    public void testAsync()
+    {
+        testOne(() -> new CountDownLatch.Async(1));
+        testNone(() -> new CountDownLatch.Async(0));
+    }
+
+    @Test
+    public void testSync()
+    {
+        testOne(() -> new CountDownLatch.Sync(1));
+        testNone(() -> new CountDownLatch.Sync(0));
+    }
+
+    void testOne(Supplier<CountDownLatch> cs)
+    {
+        CountDownLatch c = cs.get();
+        testOneTimeout(c);
+        Assert.assertEquals(1, c.count());
+
+        testOneInterrupt(c);
+        Assert.assertEquals(1, c.count());
+
+        testOneSuccess(c, CountDownLatch::decrement);
+        Assert.assertEquals(0, c.count());
+    }
+
+    void testNone(Supplier<CountDownLatch> cs)
+    {
+        CountDownLatch c = cs.get();
+        Assert.assertEquals(0, c.count());
+        testOneSuccess(c, ignore -> {});
+    }
+}
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/ImmediateFutureTest.java b/test/unit/org/apache/cassandra/utils/concurrent/ImmediateFutureTest.java
new file mode 100644
index 0000000..c9c96db
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/ImmediateFutureTest.java
@@ -0,0 +1,106 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.concurrent.CancellationException;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.function.Predicate;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.cassandra.distributed.shared.ThrowingRunnable;
+
+public class ImmediateFutureTest
+{
+
+    private void testSimple(ImmediateFuture<Boolean> p, boolean isCancelled) throws InterruptedException
+    {
+        Assert.assertEquals(p, p.await());
+        Assert.assertEquals(p, p.awaitUninterruptibly());
+        Assert.assertEquals(p, p.awaitThrowUncheckedOnInterrupt());
+        Assert.assertTrue(p.await(1L, TimeUnit.MILLISECONDS));
+        Assert.assertTrue(p.await(1L));
+        Assert.assertTrue(p.awaitUntil(Long.MAX_VALUE));
+        Assert.assertTrue(p.awaitUntilUninterruptibly(Long.MAX_VALUE));
+        Assert.assertTrue(p.awaitUntilThrowUncheckedOnInterrupt(Long.MAX_VALUE));
+        Assert.assertTrue(p.isDone());
+        Assert.assertFalse(p.isCancellable());
+        Assert.assertEquals(isCancelled, p.isCancelled());
+        Assert.assertEquals(!isCancelled, p.setUncancellable());
+        Assert.assertFalse(p.setUncancellableExclusive());
+        Assert.assertFalse(p.cancel(true));
+        Assert.assertFalse(p.cancel(false));
+        Assert.assertFalse(p.trySuccess(false));
+        Assert.assertFalse(p.tryFailure(new InterruptedException()));
+    }
+
+    @Test
+    public void testSucceeded() throws InterruptedException, ExecutionException, TimeoutException
+    {
+        ImmediateFuture<Boolean> p = ImmediateFuture.success(true);
+        Assert.assertTrue(p.getNow());
+        Assert.assertTrue(p.get());
+        Assert.assertTrue(p.get(1L, TimeUnit.MILLISECONDS));
+        Assert.assertEquals(p, p.sync());
+        Assert.assertEquals(p, p.syncUninterruptibly());
+        Assert.assertFalse(p.isCancelled());
+        testSimple(p, false);
+    }
+
+    @Test
+    public void testFailed() throws InterruptedException
+    {
+        testFailed(ImmediateFuture.failure(new RuntimeException()), false, t -> t instanceof ExecutionException, t -> t instanceof RuntimeException);
+    }
+
+    @Test
+    public void testCancelled() throws InterruptedException
+    {
+        testFailed(ImmediateFuture.cancelled(), true, t -> t instanceof CancellationException, t -> t instanceof CancellationException);
+    }
+
+    private void testFailed(ImmediateFuture<Boolean> p, boolean isCancelled, Predicate<Throwable> get, Predicate<Throwable> sync) throws InterruptedException
+    {
+        Assert.assertNull(p.getNow());
+        assertFailure(p::get, get);
+        assertFailure(() -> p.get(1L, TimeUnit.MILLISECONDS), get);
+        assertFailure(p::sync, sync);
+        assertFailure(p::syncUninterruptibly, sync);
+        testSimple(p, isCancelled);
+    }
+
+    private static void assertFailure(ThrowingRunnable run, Predicate<Throwable> test)
+    {
+        Throwable failure = null;
+        try
+        {
+            run.run();
+        }
+        catch (Throwable t)
+        {
+            failure = t;
+        }
+        if (failure == null || !test.test(failure))
+            Assert.fail();
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/LoadingMapTest.java b/test/unit/org/apache/cassandra/utils/concurrent/LoadingMapTest.java
new file mode 100644
index 0000000..822e9eb
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/LoadingMapTest.java
@@ -0,0 +1,442 @@
+/*
+ * 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.utils.concurrent;
+
+import java.time.Duration;
+import java.time.Instant;
+import java.util.concurrent.CyclicBarrier;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+
+import com.google.common.util.concurrent.Uninterruptibles;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import org.apache.cassandra.concurrent.ExecutorPlus;
+import org.apache.cassandra.utils.Throwables;
+import org.awaitility.Awaitility;
+import org.awaitility.core.ConditionFactory;
+
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+import static org.apache.cassandra.utils.FBUtilities.now;
+import static org.assertj.core.api.Assertions.assertThat;
+
+public class LoadingMapTest
+{
+    private LoadingMap<Integer, String> map;
+    private final ExecutorPlus executor = executorFactory().pooled("TEST", 10);
+    private final CyclicBarrier b1 = new CyclicBarrier(2);
+    private final CyclicBarrier b2 = new CyclicBarrier(2);
+
+    private Future<String> f1, f2;
+
+    @Before
+    public void beforeTest()
+    {
+        map = new LoadingMap<>();
+    }
+
+    @After
+    public void afterTest() throws TimeoutException
+    {
+        Instant deadline = now().plus(Duration.ofSeconds(5));
+        while (executor.getPendingTaskCount() > 0 || executor.getActiveTaskCount() > 0)
+        {
+            if (now().isAfter(deadline))
+                throw new TimeoutException();
+
+            Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
+        }
+
+        b1.reset();
+        b2.reset();
+        f1 = f2 = null;
+    }
+
+    @Test
+    public void loadForDifferentKeysShouldNotBlockEachOther() throws Exception
+    {
+        f1 = submitLoad(1, "one", b1, null);
+        await().untilAsserted(() -> assertThat(b1.getNumberWaiting()).isGreaterThan(0)); // wait until we enter loading function
+
+        f2 = submitLoad(2, "two", b2, null);
+        await().untilAsserted(() -> assertThat(b2.getNumberWaiting()).isGreaterThan(0)); // wait until we enter loading function
+
+        assertThat(map.get(1)).isNotNull();
+        assertThat(map.get(2)).isNotNull();
+        assertThat(map.getIfReady(1)).isNull();
+        assertThat(map.getIfReady(2)).isNull();
+        assertThat(f1).isNotDone();
+        assertThat(f2).isNotDone();
+
+        // since we were able to enter both loading functions, it means the can work concurrently
+
+        b2.await();
+        assertFuture(f2, "two");
+
+        assertThat(f1).isNotDone();
+
+        b1.await();
+        assertFuture(f1, "one");
+
+        assertThat(map.getIfReady(1)).isEqualTo("one");
+        assertThat(map.getIfReady(2)).isEqualTo("two");
+    }
+
+    @Test
+    public void loadInsideLoadShouldNotCauseDeadlock()
+    {
+        String v = map.blockingLoadIfAbsent(1, () -> {
+            assertThat(map.blockingLoadIfAbsent(2, () -> "two")).isEqualTo("two");
+            return "one";
+        });
+
+        assertThat(v).isEqualTo("one");
+
+        assertThat(map.getIfReady(1)).isEqualTo("one");
+        assertThat(map.getIfReady(2)).isEqualTo("two");
+    }
+
+    @Test
+    public void unloadForDifferentKeysShouldNotBlockEachOther() throws Exception
+    {
+        initMap();
+
+        f1 = submitUnload(1, "one", b1, null);
+        await().untilAsserted(() -> assertThat(b1.getNumberWaiting()).isGreaterThan(0)); // wait until we enter unloading function
+
+        f2 = submitUnload(2, "two", b2, null);
+        await().untilAsserted(() -> assertThat(b2.getNumberWaiting()).isGreaterThan(0)); // wait until we enter unloading function
+
+        assertThat(map.get(1)).isNotNull();
+        assertThat(map.get(2)).isNotNull();
+        assertThat(map.getIfReady(1)).isNull();
+        assertThat(map.getIfReady(2)).isNull();
+        assertThat(f1).isNotDone();
+        assertThat(f2).isNotDone();
+
+        // since we were able to enter both unloading functions, it means the can work concurrently
+
+        b2.await();
+        assertFuture(f2, "two");
+
+        assertThat(f1).isNotDone();
+
+        b1.await();
+        assertFuture(f1, "one");
+
+        assertThat(map.get(1)).isNull();
+        assertThat(map.get(2)).isNull();
+    }
+
+    @Test
+    public void unloadInsideUnloadShouldNotCauseDeadlock() throws LoadingMap.UnloadExecutionException
+    {
+        initMap();
+
+        String v = map.blockingUnloadIfPresent(1, v1 -> {
+            assertThat(map.getIfReady(1)).isNull();
+
+            try
+            {
+                assertThat(map.blockingUnloadIfPresent(2, v2 -> assertThat(map.getIfReady(2)).isNull())).isEqualTo("two");
+            }
+            catch (LoadingMap.UnloadExecutionException e)
+            {
+                throw Throwables.unchecked(e);
+            }
+        });
+
+        assertThat(v).isEqualTo("one");
+
+        assertThat(map.get(1)).isNull();
+        assertThat(map.get(2)).isNull();
+    }
+
+    @Test
+    public void twoConcurrentLoadAttemptsFirstOneShouldWin() throws Exception
+    {
+        f1 = submitLoad(1, "one", b1, null);
+        await().untilAsserted(() -> assertThat(b1.getNumberWaiting()).isGreaterThan(0)); // wait until we enter loading function
+
+        f2 = submitLoad(1, "two", b2, null);
+        Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
+
+        assertThat(f1).isNotDone();
+        assertThat(f2).isNotDone();
+
+        b1.await();
+
+        assertFutures("one", "one");
+        assertThat(map.getIfReady(1)).isEqualTo("one");
+        assertThat(b2.getNumberWaiting()).isZero();
+    }
+
+    @Test
+    public void twoConcurrentUnloadAttemptsFirstOneShouldWin() throws Exception
+    {
+        initMap();
+        f1 = submitUnload(1, "one", b1, null);
+        await().untilAsserted(() -> assertThat(b1.getNumberWaiting()).isGreaterThan(0)); // wait until we enter unloading function
+
+        f2 = submitUnload(1, "one", b2, null);
+
+        assertFuture(f2, null); // f2 should return immediately
+
+        b1.await(); // let f1 continue
+        assertFuture(f1, "one");
+
+        assertThat(map.getIfReady(1)).isNull();
+        assertThat(b2.getNumberWaiting()).isZero();
+    }
+
+    @Test
+    public void loadWhileUnloading() throws Exception
+    {
+        initMap();
+
+        f1 = submitUnload(1, "one", b1, null);
+        await().untilAsserted(() -> assertThat(b1.getNumberWaiting()).isGreaterThan(0)); // wait until we enter unloading function
+
+        f2 = submitLoad(1, "two", null, null);
+        Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
+
+        assertThat(f1).isNotDone();
+        assertThat(f2).isNotDone();
+
+        b1.await();
+
+        assertFutures("one", "two");
+        assertThat(map.getIfReady(1)).isEqualTo("two");
+    }
+
+    @Test
+    public void unloadWhileLoading() throws Exception
+    {
+        f1 = submitLoad(1, "one", b1, null);
+        await().untilAsserted(() -> assertThat(b1.getNumberWaiting()).isGreaterThan(0)); // wait until we enter loading function
+
+        f2 = submitUnload(1, "one", null, null);
+        Uninterruptibles.sleepUninterruptibly(1, TimeUnit.SECONDS);
+
+        assertThat(f1).isNotDone();
+        assertThat(f2).isNotDone();
+
+        b1.await();
+
+        assertFutures("one", "one");
+        assertThat(map.getIfReady(1)).isNull();
+    }
+
+    @Test
+    public void loadWhenExists()
+    {
+        initMap();
+
+        f1 = submitLoad(1, "three", b1, null);
+        assertThat(b1.getNumberWaiting()).isZero();
+        assertFuture(f1, "one");
+    }
+
+    @Test
+    public void unloadWhenMissing()
+    {
+        f1 = submitUnload(1, null, b1, null);
+        assertThat(b1.getNumberWaiting()).isZero();
+        assertFuture(f1, null);
+    }
+
+    @Test
+    public void nullLoad()
+    {
+        f1 = submitLoad(1, null, null, null);
+        f1.awaitThrowUncheckedOnInterrupt(5, TimeUnit.SECONDS);
+        assertThat(f1.cause()).isInstanceOf(NullPointerException.class);
+
+        assertThat(map.get(1)).isNull();
+        assertThat(map.get(2)).isNull();
+    }
+
+    @Test
+    public void failedLoad()
+    {
+        f1 = submitLoad(1, null, null, () -> {
+            throw new RuntimeException("abc");
+        });
+        f1.awaitThrowUncheckedOnInterrupt(5, TimeUnit.SECONDS);
+        assertThat(f1.cause()).isInstanceOf(RuntimeException.class);
+        assertThat(f1.cause()).hasMessage("abc");
+
+        assertThat(map.get(1)).isNull();
+        assertThat(map.get(2)).isNull();
+    }
+
+    @Test
+    public void failedUnload()
+    {
+        initMap();
+
+        f1 = submitUnload(1, "one", null, () -> {
+            throw new RuntimeException("abc");
+        });
+        f1.awaitThrowUncheckedOnInterrupt(5, TimeUnit.SECONDS);
+        assertThat(f1.cause()).isInstanceOf(LoadingMap.UnloadExecutionException.class);
+        LoadingMap.UnloadExecutionException ex = (LoadingMap.UnloadExecutionException) f1.cause();
+
+        assertThat(ex).hasRootCauseInstanceOf(RuntimeException.class);
+        assertThat(ex).hasRootCauseMessage("abc");
+        assertThat((String) ex.value()).isEqualTo("one");
+
+        assertThat(map.get(1)).isNull();
+    }
+
+    @Test
+    public void fuzzTest()
+    {
+        AtomicInteger failures = new AtomicInteger();
+        AtomicInteger state = new AtomicInteger();
+        CyclicBarrier barrier = new CyclicBarrier(10);
+        AtomicBoolean stop = new AtomicBoolean();
+        for (int i = 0; i < 5; i++)
+        {
+            executor.submit(() -> {
+                while (!Thread.currentThread().isInterrupted() && !stop.get())
+                {
+                    try
+                    {
+                        barrier.await();
+                        Uninterruptibles.sleepUninterruptibly(ThreadLocalRandom.current().nextInt(50), TimeUnit.MILLISECONDS);
+                        map.blockingLoadIfAbsent(1, () -> {
+                            int s = state.get();
+                            Uninterruptibles.sleepUninterruptibly(ThreadLocalRandom.current().nextInt(50, 100), TimeUnit.MILLISECONDS);
+                            if (!state.compareAndSet(s, s + 1))
+                                failures.incrementAndGet();
+                            if (ThreadLocalRandom.current().nextInt(100) < 10)
+                                return null;
+                            if (ThreadLocalRandom.current().nextInt(100) < 10)
+                                throw new RuntimeException();
+                            return "one";
+                        });
+                    }
+                    catch (InterruptedException e)
+                    {
+                        break;
+                    }
+                    catch (Exception ignored)
+                    {
+                    }
+                }
+            });
+            executor.submit(() -> {
+                while (!Thread.currentThread().isInterrupted() && !stop.get())
+                {
+                    try
+                    {
+                        barrier.await();
+                        Uninterruptibles.sleepUninterruptibly(ThreadLocalRandom.current().nextInt(50), TimeUnit.MILLISECONDS);
+                        map.blockingUnloadIfPresent(1, v -> {
+                            int s = state.incrementAndGet();
+                            Uninterruptibles.sleepUninterruptibly(ThreadLocalRandom.current().nextInt(50, 100), TimeUnit.MILLISECONDS);
+                            if (!state.compareAndSet(s, s + 1))
+                                failures.incrementAndGet();
+                            if (ThreadLocalRandom.current().nextInt(100) < 10)
+                                throw new RuntimeException();
+                        });
+                    }
+                    catch (InterruptedException e)
+                    {
+                        break;
+                    }
+                    catch (Exception ignored)
+                    {
+                    }
+                }
+            });
+        }
+
+        Uninterruptibles.sleepUninterruptibly(15, TimeUnit.SECONDS);
+        stop.set(true);
+        while (executor.getActiveTaskCount() > 0)
+        {
+            barrier.reset();
+            Uninterruptibles.sleepUninterruptibly(100, TimeUnit.MILLISECONDS);
+        }
+        assertThat(failures.get()).isZero();
+        assertThat(state.get()).isGreaterThan(0);
+    }
+
+    private void assertFuture(Future<String> f, String v)
+    {
+        assertThat(f.awaitThrowUncheckedOnInterrupt(5, TimeUnit.SECONDS)).isTrue();
+        f.rethrowIfFailed();
+        assertThat(f.getNow()).isEqualTo(v);
+    }
+
+    private void assertFutures(String v1, String v2)
+    {
+        assertFuture(f1, v1);
+        assertFuture(f2, v2);
+    }
+
+    private Future<String> submitLoad(int key, String value, CyclicBarrier b, Throwables.DiscreteAction<?> extraAction)
+    {
+        return executor.submit(() -> map.blockingLoadIfAbsent(key, () -> {
+            Throwable a = null;
+            if (extraAction != null)
+                a = Throwables.perform(a, extraAction);
+            if (b != null)
+                a = Throwables.perform(a, b::await);
+            if (a != null)
+                throw Throwables.unchecked(a);
+            return value;
+        }));
+    }
+
+    private Future<String> submitUnload(int key, String expectedValue, CyclicBarrier b, Throwables.DiscreteAction<?> extraAction)
+    {
+        return executor.submit(() -> map.blockingUnloadIfPresent(key, v -> {
+            assertThat(v).isEqualTo(expectedValue);
+            Throwable a = null;
+            if (extraAction != null)
+                a = Throwables.perform(a, extraAction);
+            if (b != null)
+                a = Throwables.perform(a, b::await);
+            if (a != null)
+                throw Throwables.unchecked(a);
+        }));
+    }
+
+    private void initMap()
+    {
+        map.blockingLoadIfAbsent(1, () -> "one");
+        map.blockingLoadIfAbsent(2, () -> "two");
+
+        assertThat(map.getIfReady(1)).isEqualTo("one");
+        assertThat(map.getIfReady(2)).isEqualTo("two");
+    }
+
+    private ConditionFactory await()
+    {
+        return Awaitility.await().pollDelay(10, TimeUnit.MILLISECONDS).atMost(5, TimeUnit.SECONDS);
+    }
+}
\ No newline at end of file
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/NonBlockingRateLimiterTest.java b/test/unit/org/apache/cassandra/utils/concurrent/NonBlockingRateLimiterTest.java
new file mode 100644
index 0000000..d63cef3
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/NonBlockingRateLimiterTest.java
@@ -0,0 +1,121 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.cassandra.utils.concurrent;
+
+import com.google.common.base.Ticker;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+@SuppressWarnings("UnstableApiUsage")
+public class NonBlockingRateLimiterTest
+{
+    private static final AtomicLong CLOCK = new AtomicLong(0);
+    private static final TimeUnit DELAY_UNIT = TimeUnit.NANOSECONDS;
+
+    private static final Ticker TICKER = new Ticker()
+    {
+        @Override
+        public long read() {
+            return CLOCK.get();
+        }
+    };
+
+    @Before
+    public void resetTicker()
+    {
+        CLOCK.set(0);
+    }
+
+    @Test
+    public void testUnconditionalReservation()
+    {
+        NonBlockingRateLimiter limiter = new NonBlockingRateLimiter(4, 0, TICKER);
+        long oneSecond = DELAY_UNIT.convert(1, TimeUnit.SECONDS);
+        long oneDelay = oneSecond / 4;
+
+        // Delays should begin accumulating without any ticker movement...
+        assertEquals(0, limiter.reserveAndGetDelay(DELAY_UNIT));
+        assertEquals(oneDelay, limiter.reserveAndGetDelay(DELAY_UNIT));
+        assertEquals(oneDelay * 2, limiter.reserveAndGetDelay(DELAY_UNIT));
+        assertEquals(oneDelay * 3, limiter.reserveAndGetDelay(DELAY_UNIT));
+
+        // ...but should be gone after advancing enough to free up a permit.
+        CLOCK.addAndGet(NonBlockingRateLimiter.NANOS_PER_SECOND);
+        assertEquals(0, limiter.reserveAndGetDelay(DELAY_UNIT));
+    }
+
+    @Test
+    public void testConditionalReservation()
+    {
+        NonBlockingRateLimiter limiter = new NonBlockingRateLimiter(1, 0, TICKER);
+        
+        // Take the available permit, but then fail a subsequent attempt.
+        assertTrue(limiter.tryReserve());
+        assertFalse(limiter.tryReserve());
+
+        // We only need to advance one second, as the second attempt should not get a permit.
+        CLOCK.addAndGet(NonBlockingRateLimiter.NANOS_PER_SECOND);
+        assertTrue(limiter.tryReserve());
+    }
+
+    @Test
+    public void testBurstPermitConsumption()
+    {
+        // Create a limiter that produces 2 permits/second and allows 1-second bursts.
+        NonBlockingRateLimiter limiter = new NonBlockingRateLimiter(1, NonBlockingRateLimiter.DEFAULT_BURST_NANOS, TICKER);
+
+        // Advance the clock to create a 1-second idle period, which makes one burst permit available.
+        CLOCK.addAndGet(NonBlockingRateLimiter.NANOS_PER_SECOND);
+        
+        // Take the burst permit.
+        assertTrue(limiter.tryReserve());
+        
+        // Take the "normal" permit.
+        assertTrue(limiter.tryReserve());
+        
+        // Then fail, as we've consumed both.
+        assertFalse(limiter.tryReserve());
+
+        // Advance 1 interval again...
+        CLOCK.addAndGet(NonBlockingRateLimiter.NANOS_PER_SECOND);
+
+        // ...and only one permit should be available, as we've reached a steady state.
+        assertTrue(limiter.tryReserve());
+        assertFalse(limiter.tryReserve());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testMaximumRate()
+    {
+        new NonBlockingRateLimiter(Integer.MAX_VALUE, 0, Ticker.systemTicker());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void testMinimumRate()
+    {
+        new NonBlockingRateLimiter(-1, 0, Ticker.systemTicker());
+    }
+}
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java b/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java
index 0d1f9f6..e99d368 100644
--- a/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java
+++ b/test/unit/org/apache/cassandra/utils/concurrent/RefCountedTest.java
@@ -22,7 +22,7 @@
 
 import org.junit.Assert;
 
-import java.io.File;
+import org.apache.cassandra.io.util.File;
 import java.lang.ref.WeakReference;
 import java.util.HashMap;
 import java.util.HashSet;
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/SemaphoreTest.java b/test/unit/org/apache/cassandra/utils/concurrent/SemaphoreTest.java
new file mode 100644
index 0000000..d52598b
--- /dev/null
+++ b/test/unit/org/apache/cassandra/utils/concurrent/SemaphoreTest.java
@@ -0,0 +1,101 @@
+/*
+ * 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.utils.concurrent;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.Future;
+import java.util.concurrent.TimeoutException;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
+import static java.util.concurrent.TimeUnit.MINUTES;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
+public class SemaphoreTest
+{
+
+    @Test
+    public void testUnfair() throws InterruptedException
+    {
+        Semaphore s = Semaphore.newSemaphore(2);
+        List<Future<Boolean>> fs = start(s);
+        s.release(1);
+        while (s.permits() == 1) Thread.yield();
+        Assert.assertEquals(1, fs.stream().filter(Future::isDone).count());
+        s.release(1);
+        while (s.permits() == 1) Thread.yield();
+        Assert.assertEquals(2, fs.stream().filter(Future::isDone).count());
+        s.release(1);
+        while (s.permits() == 1) Thread.yield();
+        Assert.assertEquals(3, fs.stream().filter(Future::isDone).count());
+        s.release(1);
+        Assert.assertEquals(1, s.permits());
+    }
+
+    @Test
+    public void testFair() throws InterruptedException, ExecutionException, TimeoutException
+    {
+        Semaphore s = Semaphore.newFairSemaphore(2);
+        List<Future<Boolean>> fs = start(s);
+        s.release(1);
+        fs.get(0).get(1L, MINUTES);
+        s.release(1);
+        fs.get(1).get(1L, MINUTES);
+        s.release(1);
+        fs.get(2).get(1L, MINUTES);
+        s.release(1);
+        Assert.assertEquals(1, s.permits());
+    }
+
+    private List<java.util.concurrent.Future<Boolean>> start(Semaphore s) throws InterruptedException
+    {
+        ExecutorService exec = Executors.newCachedThreadPool();
+        try
+        {
+            Assert.assertTrue(s.tryAcquire(1));
+            s.drain();
+            Assert.assertFalse(s.tryAcquire(1));
+            Assert.assertFalse(s.tryAcquire(1, 1L, MILLISECONDS));
+            Thread.currentThread().interrupt();
+            try { s.acquireThrowUncheckedOnInterrupt(1); Assert.fail(); } catch (UncheckedInterruptedException ignore) { }
+            Thread.currentThread().interrupt();
+            try { s.tryAcquire(1, 1L, MILLISECONDS); Assert.fail(); } catch (InterruptedException ignore) { }
+            Thread.currentThread().interrupt();
+            try { s.tryAcquireUntil(1, nanoTime() + MILLISECONDS.toNanos(1L)); Assert.fail(); } catch (InterruptedException ignore) { }
+            List<Future<Boolean>> fs = new ArrayList<>();
+            fs.add(exec.submit(() -> s.tryAcquire(1, 1L, MINUTES)));
+            while (s instanceof Semaphore.Standard && ((Semaphore.Standard) s).waiting() == 0) Thread.yield();
+            fs.add(exec.submit(() -> s.tryAcquireUntil(1, System.nanoTime() + MINUTES.toNanos(1L))));
+            while (s instanceof Semaphore.Standard && ((Semaphore.Standard) s).waiting() == 1) Thread.yield();
+            fs.add(exec.submit(() -> { s.acquire(1); return true; } ));
+            return fs;
+        }
+        finally
+        {
+            exec.shutdown();
+        }
+    }
+
+}
diff --git a/test/unit/org/apache/cassandra/utils/concurrent/WeightedQueueTest.java b/test/unit/org/apache/cassandra/utils/concurrent/WeightedQueueTest.java
index 544e95c..d1ef045 100644
--- a/test/unit/org/apache/cassandra/utils/concurrent/WeightedQueueTest.java
+++ b/test/unit/org/apache/cassandra/utils/concurrent/WeightedQueueTest.java
@@ -22,12 +22,13 @@
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.concurrent.BlockingQueue;
-import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.TimeUnit;
 
 import org.junit.Before;
 import org.junit.Test;
 
+import static org.apache.cassandra.utils.concurrent.BlockingQueues.newBlockingQueue;
+import static org.apache.cassandra.utils.concurrent.WeightedQueue.NATURAL_WEIGHER;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -205,9 +206,9 @@
     public void testOfferWrappedQueueRefuses() throws Exception
     {
         queue = new WeightedQueue<>(10, new BadQueue(true), WeightedQueue.NATURAL_WEIGHER);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         assertFalse(queue.offer(new Object()));
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
     /**
@@ -217,7 +218,7 @@
     public void testOfferWrappedQueueThrows() throws Exception
     {
         queue = new WeightedQueue<>(10, new BadQueue(false), WeightedQueue.NATURAL_WEIGHER);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         try
         {
             assertFalse(queue.offer(new Object()));
@@ -227,7 +228,7 @@
         {
             //expected and desired
         }
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
     /**
@@ -246,7 +247,7 @@
     @Test
     public void testCustomWeigher() throws Exception
     {
-        queue = new WeightedQueue<>(10, new LinkedBlockingQueue<>(), weighable -> 10 );
+        queue = new WeightedQueue<>(10, newBlockingQueue(), weighable -> 10 );
         assertTrue(queue.offer(new Object()));
         assertFalse(queue.offer(new Object()));
     }
@@ -319,9 +320,9 @@
     public void testTimedOfferWrappedQueueRefuses() throws Exception
     {
         queue = new WeightedQueue<>(10, new BadQueue(true), WeightedQueue.NATURAL_WEIGHER);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         assertFalse(queue.offer(new Object(), 1, TimeUnit.MICROSECONDS));
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
     /**
@@ -331,7 +332,7 @@
     public void testTimedOfferWrappedQueueThrows() throws Exception
     {
         queue = new WeightedQueue<>(10, new BadQueue(false), WeightedQueue.NATURAL_WEIGHER);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         try
         {
             assertFalse(queue.offer(new Object(), 1, TimeUnit.MICROSECONDS));
@@ -341,26 +342,26 @@
         {
             //expected and desired
         }
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
 
     @Test
     public void testPoll() throws Exception
     {
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         assertNull(queue.poll());
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         Object o = new Object();
         assertTrue(queue.offer(o));
-        assertEquals(9, queue.availableWeight.availablePermits());
+        assertEquals(9, queue.availableWeight.permits());
         WeightedQueue.Weighable weighable = weighable(9);
         assertTrue(queue.offer(weighable));
-        assertEquals(0, queue.availableWeight.availablePermits());
+        assertEquals(0, queue.availableWeight.permits());
         assertEquals(o, queue.poll());
-        assertEquals(1, queue.availableWeight.availablePermits());
+        assertEquals(1, queue.availableWeight.permits());
         assertEquals(weighable, queue.poll());
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
     @Test(expected = NullPointerException.class)
@@ -373,9 +374,9 @@
     public void testPutFullBlocks() throws Exception
     {
         WeightedQueue.Weighable weighable = weighable(10);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         queue.put(weighable);
-        assertEquals(0, queue.availableWeight.availablePermits());
+        assertEquals(0, queue.availableWeight.permits());
         Object o = new Object();
         Thread t = new Thread(() -> {
             try
@@ -389,19 +390,19 @@
         t.start();
         Thread.sleep(100);
         assertTrue(t.getState() != Thread.State.TERMINATED);
-        assertEquals(0, queue.availableWeight.availablePermits());
+        assertEquals(0, queue.availableWeight.permits());
         assertEquals(weighable, queue.poll());
-        assertTrue(queue.availableWeight.availablePermits() > 0);
+        assertTrue(queue.availableWeight.permits() > 0);
         t.join();
         assertEquals(o, queue.poll());
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
     @Test
     public void testPutWrappedQueueThrows() throws Exception
     {
         queue = new WeightedQueue<>(10, new BadQueue(false), WeightedQueue.NATURAL_WEIGHER);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         try
         {
             queue.put(new Object());
@@ -411,7 +412,7 @@
         {
             //expected and desired
         }
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -448,11 +449,11 @@
         t.start();
         Thread.sleep(500);
         assertTrue(t.getState() != Thread.State.TERMINATED);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
         queue.offer(new Object());
         t.join(60 * 1000);
         assertEquals(t.getState(), Thread.State.TERMINATED);
-        assertEquals(10, queue.availableWeight.availablePermits());
+        assertEquals(10, queue.availableWeight.permits());
     }
 
     @Test(expected = IllegalArgumentException.class)
@@ -464,7 +465,7 @@
     @Test(expected = IllegalArgumentException.class)
     public void testConstructor2LTZeroWeightThrows() throws Exception
     {
-        new WeightedQueue(0, new LinkedBlockingQueue<>(), WeightedQueue.NATURAL_WEIGHER);
+        new WeightedQueue(0, newBlockingQueue(), NATURAL_WEIGHER);
     }
 
     @Test(expected = NullPointerException.class)
@@ -476,7 +477,7 @@
     @Test(expected = NullPointerException.class)
     public void testConstructorNullWeigherThrows() throws Exception
     {
-        new WeightedQueue(1, new LinkedBlockingQueue<>(), null);
+        new WeightedQueue(1, newBlockingQueue(), null);
     }
 
     /**
diff --git a/test/unit/org/apache/cassandra/utils/memory/BufferPoolTest.java b/test/unit/org/apache/cassandra/utils/memory/BufferPoolTest.java
index 2b5df29..ab68e40 100644
--- a/test/unit/org/apache/cassandra/utils/memory/BufferPoolTest.java
+++ b/test/unit/org/apache/cassandra/utils/memory/BufferPoolTest.java
@@ -376,7 +376,7 @@
     @Test
     public void testChunkExhausted()
     {
-        final int size = BufferPool.NORMAL_CHUNK_SIZE / 64; // 1kbit
+        final int size = BufferPool.NORMAL_CHUNK_SIZE / 64; // 1kibibit
         int[] sizes = new int[128];
         Arrays.fill(sizes, size);
 
@@ -875,8 +875,8 @@
     @Test
     public void testRecyclePartialFreeChunk()
     {
-        // normal chunk size is 128kb
-        int halfNormalChunk = BufferPool.NORMAL_CHUNK_SIZE / 2; // 64kb, half of normal chunk
+        // normal chunk size is 128KiB
+        int halfNormalChunk = BufferPool.NORMAL_CHUNK_SIZE / 2; // 64KiB, half of normal chunk
         List<ByteBuffer> toRelease = new ArrayList<>();
 
         // allocate three buffers on different chunks
diff --git a/test/unit/org/apache/cassandra/utils/memory/MemtableCleanerThreadTest.java b/test/unit/org/apache/cassandra/utils/memory/MemtableCleanerThreadTest.java
index 7100a2a..2ce9a8e 100644
--- a/test/unit/org/apache/cassandra/utils/memory/MemtableCleanerThreadTest.java
+++ b/test/unit/org/apache/cassandra/utils/memory/MemtableCleanerThreadTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.cassandra.utils.memory;
 
-import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CountDownLatch;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
@@ -29,12 +28,12 @@
 import org.junit.Test;
 
 import org.apache.cassandra.utils.FBUtilities;
+import org.apache.cassandra.utils.concurrent.AsyncPromise;
 import org.mockito.Mock;
 import org.mockito.MockitoAnnotations;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.Mockito.when;
 
@@ -46,9 +45,8 @@
     @Mock
     private MemtablePool pool;
 
-    @Mock
+//    @Mock
     private MemtableCleaner cleaner;
-
     private MemtableCleanerThread<MemtablePool> cleanerThread;
 
     @Before
@@ -57,14 +55,9 @@
         MockitoAnnotations.initMocks(this);
     }
 
-    private void startThread()
+    private void startThread(MemtableCleaner cleaner)
     {
         cleanerThread = new MemtableCleanerThread<>(pool, cleaner);
-        assertNotNull(cleanerThread);
-        cleanerThread.start();
-
-        for (int i = 0; i < TIMEOUT_MILLIS && !cleanerThread.isAlive(); i++)
-            FBUtilities.sleepQuietly(1);
     }
 
     private void stopThread() throws InterruptedException
@@ -86,20 +79,19 @@
     public void testCleanerInvoked() throws Exception
     {
         CountDownLatch cleanerExecutedLatch = new CountDownLatch(1);
-        CompletableFuture<Boolean> fut = new CompletableFuture<>();
+        AsyncPromise<Boolean > fut = new AsyncPromise<>();
         AtomicBoolean needsCleaning = new AtomicBoolean(false);
 
         when(pool.needsCleaning()).thenAnswer(invocation -> needsCleaning.get());
-
-        when(cleaner.clean()).thenAnswer(invocation -> {
+        cleaner = () -> {
             needsCleaning.set(false);
             cleanerExecutedLatch.countDown();
             return fut;
-        });
+        };
 
         // start the thread with needsCleaning returning false, the cleaner should not be invoked
         needsCleaning.set(false);
-        startThread();
+        startThread(cleaner);
         assertFalse(cleanerExecutedLatch.await(TIMEOUT_SECONDS, TimeUnit.SECONDS));
         assertEquals(1, cleanerExecutedLatch.getCount());
         assertEquals(0, cleanerThread.numPendingTasks());
@@ -113,7 +105,7 @@
 
         // now complete the cleaning task
         needsCleaning.set(false);
-        fut.complete(true);
+        fut.setSuccess(true);
         waitForPendingTasks();
 
         stopThread();
@@ -123,22 +115,22 @@
     public void testCleanerError() throws Exception
     {
         AtomicReference<CountDownLatch> cleanerLatch = new AtomicReference<>(new CountDownLatch(1));
-        AtomicReference<CompletableFuture<Boolean>> fut = new AtomicReference<>(new CompletableFuture<>());
+        AtomicReference<AsyncPromise<Boolean>> fut = new AtomicReference<>(new AsyncPromise<>());
         AtomicBoolean needsCleaning = new AtomicBoolean(false);
         AtomicInteger numTimeCleanerInvoked = new AtomicInteger(0);
 
         when(pool.needsCleaning()).thenAnswer(invocation -> needsCleaning.get());
 
-        when(cleaner.clean()).thenAnswer(invocation -> {
+        cleaner = () -> {
             needsCleaning.set(false);
             numTimeCleanerInvoked.incrementAndGet();
             cleanerLatch.get().countDown();
             return fut.get();
-        });
+        };
 
         // start the thread with needsCleaning returning true, the cleaner should be invoked
         needsCleaning.set(true);
-        startThread();
+        startThread(cleaner);
         assertTrue(cleanerLatch.get().await(TIMEOUT_SECONDS, TimeUnit.SECONDS));
         assertEquals(0, cleanerLatch.get().getCount());
         assertEquals(1, cleanerThread.numPendingTasks());
@@ -146,17 +138,17 @@
 
         // complete the cleaning task with an error, no other cleaning task should be invoked
         cleanerLatch.set(new CountDownLatch(1));
-        CompletableFuture<Boolean> oldFut = fut.get();
-        fut.set(new CompletableFuture<>());
+        AsyncPromise<Boolean> oldFut = fut.get();
+        fut.set(new AsyncPromise<>());
         needsCleaning.set(false);
-        oldFut.completeExceptionally(new RuntimeException("Test"));
+        oldFut.setFailure(new RuntimeException("Test"));
         assertFalse(cleanerLatch.get().await(TIMEOUT_SECONDS, TimeUnit.SECONDS));
         assertEquals(1, cleanerLatch.get().getCount());
         assertEquals(1, numTimeCleanerInvoked.get());
 
         // now trigger cleaning again and verify that a new task is invoked
         cleanerLatch.set(new CountDownLatch(1));
-        fut.set(new CompletableFuture<>());
+        fut.set(new AsyncPromise<>());
         needsCleaning.set(true);
         cleanerThread.trigger();
         assertTrue(cleanerLatch.get().await(TIMEOUT_SECONDS, TimeUnit.SECONDS));
@@ -166,16 +158,16 @@
         //  complete the cleaning task with false (nothing should be scheduled)
         cleanerLatch.set(new CountDownLatch(1));
         oldFut = fut.get();
-        fut.set(new CompletableFuture<>());
+        fut.set(new AsyncPromise<>());
         needsCleaning.set(false);
-        oldFut.complete(false);
+        oldFut.setSuccess(false);
         assertFalse(cleanerLatch.get().await(TIMEOUT_SECONDS, TimeUnit.SECONDS));
         assertEquals(1, cleanerLatch.get().getCount());
         assertEquals(2, numTimeCleanerInvoked.get());
 
         // now trigger cleaning again and verify that a new task is invoked
         cleanerLatch.set(new CountDownLatch(1));
-        fut.set(new CompletableFuture<>());
+        fut.set(new AsyncPromise<>());
         needsCleaning.set(true);
         cleanerThread.trigger();
         assertTrue(cleanerLatch.get().await(TIMEOUT_SECONDS, TimeUnit.SECONDS));
diff --git a/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java b/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java
index 031e089..79a54cd 100644
--- a/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java
+++ b/test/unit/org/apache/cassandra/utils/memory/NativeAllocatorTest.java
@@ -26,6 +26,7 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import org.apache.cassandra.utils.concurrent.ImmediateFuture;
 import org.apache.cassandra.utils.concurrent.OpOrder;
 
 public class NativeAllocatorTest
@@ -65,7 +66,7 @@
                 allocatorRef.get().offHeap().released(80);
                 isClean.countDown();
             }
-            return CompletableFuture.completedFuture(true);
+            return ImmediateFuture.success(true);
         });
         allocator = new NativeAllocator(pool);
         allocatorRef.set(allocator);
diff --git a/test/unit/org/apache/cassandra/utils/streamhist/StreamingTombstoneHistogramBuilderTest.java b/test/unit/org/apache/cassandra/utils/streamhist/StreamingTombstoneHistogramBuilderTest.java
old mode 100755
new mode 100644
diff --git a/test/unit/org/apache/cassandra/utils/vint/VIntCodingTest.java b/test/unit/org/apache/cassandra/utils/vint/VIntCodingTest.java
index c7c3324..15f9cdc 100644
--- a/test/unit/org/apache/cassandra/utils/vint/VIntCodingTest.java
+++ b/test/unit/org/apache/cassandra/utils/vint/VIntCodingTest.java
@@ -18,19 +18,28 @@
 */
 package org.apache.cassandra.utils.vint;
 
+import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
+import java.io.InputStream;
+import java.nio.BufferOverflowException;
+import java.nio.ByteBuffer;
 
-import io.netty.buffer.Unpooled;
+import org.apache.cassandra.io.util.DataInputPlus;
 import org.apache.cassandra.io.util.DataOutputBuffer;
+import org.apache.cassandra.io.util.WrappedDataOutputStreamPlus;
 
 import org.junit.Test;
 
 import org.junit.Assert;
 
+import static org.junit.Assert.fail;
+
 public class VIntCodingTest
 {
+    private static final long[] LONGS = new long[] {53L, 10201L, 1097151L,
+                                                    168435455L, 33251130335L, 3281283447775L,
+                                                    417672546086779L, 52057592037927932L, 72057594037927937L};
 
     @Test
     public void testComputeSize() throws Exception
@@ -49,9 +58,9 @@
     {
         Assert.assertEquals(expectedSize, VIntCoding.computeUnsignedVIntSize(value));
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        DataOutputStream dos = new DataOutputStream(baos);
-        VIntCoding.writeUnsignedVInt(value, dos);
-        dos.flush();
+        WrappedDataOutputStreamPlus out = new WrappedDataOutputStreamPlus(baos);
+        VIntCoding.writeUnsignedVInt(value, out);
+        out.flush();
         Assert.assertEquals( expectedSize, baos.toByteArray().length);
 
         DataOutputBuffer dob = new DataOutputBuffer();
@@ -75,9 +84,9 @@
         int biggestOneByte = 127;
 
         ByteArrayOutputStream baos = new ByteArrayOutputStream();
-        DataOutputStream dos = new DataOutputStream(baos);
-        VIntCoding.writeUnsignedVInt(biggestOneByte, dos);
-        dos.flush();
+        WrappedDataOutputStreamPlus out = new WrappedDataOutputStreamPlus(baos);
+        VIntCoding.writeUnsignedVInt(biggestOneByte, out);
+        out.flush();
         Assert.assertEquals( 1, baos.toByteArray().length);
 
         DataOutputBuffer dob = new DataOutputBuffer();
@@ -97,4 +106,99 @@
             Assert.assertEquals(i, result);
         }
     }
+
+    @Test
+    public void testWriteUnsignedVIntBufferedDOP() throws IOException
+    {
+        for (int i = 0; i < VIntCoding.MAX_SIZE - 1; i++)
+        {
+            long val = LONGS[i];
+            Assert.assertEquals(i + 1, VIntCoding.computeUnsignedVIntSize(val));
+            try (DataOutputBuffer out = new DataOutputBuffer())
+            {
+                VIntCoding.writeUnsignedVInt(val, out);
+                // read as ByteBuffer
+                Assert.assertEquals(val, VIntCoding.getUnsignedVInt(out.buffer(), 0));
+                // read as DataInput
+                InputStream is = new ByteArrayInputStream(out.toByteArray());
+                Assert.assertEquals(val, VIntCoding.readUnsignedVInt(new DataInputPlus.DataInputStreamPlus(is)));
+            }
+        }
+    }
+
+    @Test
+    public void testWriteUnsignedVIntUnbufferedDOP() throws IOException
+    {
+        for (int i = 0; i < VIntCoding.MAX_SIZE - 1; i++)
+        {
+            long val = LONGS[i];
+            Assert.assertEquals(i + 1, VIntCoding.computeUnsignedVIntSize(val));
+            ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            try (WrappedDataOutputStreamPlus out = new WrappedDataOutputStreamPlus(baos))
+            {
+                VIntCoding.writeUnsignedVInt(val, out);
+                out.flush();
+                Assert.assertEquals( i + 1, baos.toByteArray().length);
+                // read as ByteBuffer
+                Assert.assertEquals(val, VIntCoding.getUnsignedVInt(ByteBuffer.wrap(baos.toByteArray()), 0));
+                // read as DataInput
+                InputStream is = new ByteArrayInputStream(baos.toByteArray());
+                Assert.assertEquals(val, VIntCoding.readUnsignedVInt(new DataInputPlus.DataInputStreamPlus(is)));
+            }
+        }
+    }
+
+    @Test
+    public void testWriteUnsignedVIntBB() throws IOException
+    {
+        for (int i = 0; i < VIntCoding.MAX_SIZE - 1; i++)
+        {
+            long val = LONGS[i];
+            Assert.assertEquals(i + 1, VIntCoding.computeUnsignedVIntSize(val));
+            ByteBuffer bb = ByteBuffer.allocate(VIntCoding.MAX_SIZE);
+            VIntCoding.writeUnsignedVInt(val, bb);
+            // read as ByteBuffer
+            Assert.assertEquals(val, VIntCoding.getUnsignedVInt(bb, 0));
+            // read as DataInput
+            InputStream is = new ByteArrayInputStream(bb.array());
+            Assert.assertEquals(val, VIntCoding.readUnsignedVInt(new DataInputPlus.DataInputStreamPlus(is)));
+        }
+    }
+
+    @Test
+    public void testWriteUnsignedVIntBBLessThan8Bytes() throws IOException
+    {
+        long val = 10201L;
+        Assert.assertEquals(2, VIntCoding.computeUnsignedVIntSize(val));
+        ByteBuffer bb = ByteBuffer.allocate(2);
+        VIntCoding.writeUnsignedVInt(val, bb);
+        // read as ByteBuffer
+        Assert.assertEquals(val, VIntCoding.getUnsignedVInt(bb, 0));
+        // read as DataInput
+        InputStream is = new ByteArrayInputStream(bb.array());
+        Assert.assertEquals(val, VIntCoding.readUnsignedVInt(new DataInputPlus.DataInputStreamPlus(is)));
+    }
+
+    @Test
+    public void testWriteUnsignedVIntBBHasLessThan8BytesLeft()
+    {
+        long val = 10201L;
+        Assert.assertEquals(2, VIntCoding.computeUnsignedVIntSize(val));
+        ByteBuffer bb = ByteBuffer.allocate(3);
+        bb.position(1);
+        VIntCoding.writeUnsignedVInt(val, bb);
+        // read as ByteBuffer
+        Assert.assertEquals(val, VIntCoding.getUnsignedVInt(bb, 1));
+    }
+
+    @Test
+    public void testWriteUnsignedVIntBBDoesNotHaveEnoughSpaceOverflows()
+    {
+        ByteBuffer bb = ByteBuffer.allocate(3);
+        try
+        {
+            VIntCoding.writeUnsignedVInt(52057592037927932L, bb);
+            fail();
+        } catch (BufferOverflowException e) {}
+    }
 }
diff --git a/tools/bin/cassandra-stressd b/tools/bin/cassandra-stressd
deleted file mode 100755
index 83f8006..0000000
--- a/tools/bin/cassandra-stressd
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/bin/sh
-
-# 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.
-
-DESC="Cassandra Stress Test Daemon"
-if [ "x$CASSANDRA_INCLUDE" = "x" ]; then
-    # Locations (in order) to use when searching for an include file.
-    for include in "`dirname "$0"`/cassandra.in.sh" \
-                   "$HOME/.cassandra.in.sh" \
-                   /usr/share/cassandra/cassandra.in.sh \
-                   /usr/local/share/cassandra/cassandra.in.sh \
-                   /opt/cassandra/cassandra.in.sh; do
-        if [ -r "$include" ]; then
-            . "$include"
-            break
-        fi
-    done
-elif [ -r "$CASSANDRA_INCLUDE" ]; then
-    . "$CASSANDRA_INCLUDE"
-fi
-
-if [ -z "$CLASSPATH" ]; then
-    echo "You must set the CLASSPATH var" >&2
-    exit 1
-fi
-
-case "$1" in
-  start)
-    echo "Starting $DESC: "
-    "$JAVA" -server -cp "$CLASSPATH" $JVM_OPTS \
-            -Dcassandra.storagedir="$cassandra_storagedir" \
-            -Dlogback.configurationFile=logback-tools.xml \
-            org.apache.cassandra.stress.StressServer $@ 1> ./stressd.out.log 2> ./stressd.err.log &
-    echo $! > ./stressd.pid
-    echo "done."
-  ;;
-  
-  stop)
-    PID=`cat ./stressd.pid 2> /dev/null`
-    
-    if [ "x$PID" = "x" ]; then
-      echo "$DESC is not running."
-    else
-      kill -9 $PID
-      rm ./stressd.pid
-      echo "$DESC is stopped."
-    fi
-  ;;
-
-  status)
-    PID=`cat ./stressd.pid 2> /dev/null`
-
-    if [ "x$PID" = "x" ]; then
-      echo "$DESC is not running."
-    else
-      echo "$DESC is running with pid $PID."
-    fi
-  ;;
-
-  *)
-    echo "Usage: $0 start|stop|status [-h <host>]"
-  ;;
-esac
-
-# vi:ai sw=4 ts=4 tw=0 et
diff --git a/tools/bin/hash_password b/tools/bin/hash_password
new file mode 100755
index 0000000..dc48ce1
--- /dev/null
+++ b/tools/bin/hash_password
@@ -0,0 +1,53 @@
+#!/bin/sh
+
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+if [ "x$CASSANDRA_INCLUDE" = "x" ]; then
+    # Locations (in order) to use when searching for an include file.
+    for include in "`dirname "$0"`/cassandra.in.sh" \
+                   "$HOME/.cassandra.in.sh" \
+                   /usr/share/cassandra/cassandra.in.sh \
+                   /usr/local/share/cassandra/cassandra.in.sh \
+                   /opt/cassandra/cassandra.in.sh; do
+        if [ -r "$include" ]; then
+            . "$include"
+            break
+        fi
+    done
+elif [ -r "$CASSANDRA_INCLUDE" ]; then
+    . "$CASSANDRA_INCLUDE"
+fi
+
+if [ -z "$CLASSPATH" ]; then
+    echo "You must set the CLASSPATH var" >&2
+    exit 1
+fi
+
+if [ "x${MAX_HEAP_SIZE}" = "x" ]; then
+    MAX_HEAP_SIZE="256M"
+fi
+
+if [ "x${MAX_DIRECT_MEMORY}" = "x" ]; then
+    MAX_DIRECT_MEMORY="2G"
+fi
+
+JVM_OPTS="${JVM_OPTS} -Xmx${MAX_HEAP_SIZE} -XX:MaxDirectMemorySize=${MAX_DIRECT_MEMORY}"
+
+"${JAVA}" ${JAVA_AGENT} -ea -cp "${CLASSPATH}" ${JVM_OPTS} \
+        -Dcassandra.storagedir="${cassandra_storagedir}" \
+        -Dlogback.configurationFile=logback-tools.xml \
+        org.apache.cassandra.tools.HashPassword "$@"
diff --git a/tools/fqltool/src/org/apache/cassandra/fqltool/QueryReplayer.java b/tools/fqltool/src/org/apache/cassandra/fqltool/QueryReplayer.java
index 4524e33..1cff804 100644
--- a/tools/fqltool/src/org/apache/cassandra/fqltool/QueryReplayer.java
+++ b/tools/fqltool/src/org/apache/cassandra/fqltool/QueryReplayer.java
@@ -27,7 +27,6 @@
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -47,11 +46,13 @@
 import com.datastax.driver.core.Statement;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static org.apache.cassandra.concurrent.ExecutorFactory.Global.executorFactory;
+
 public class QueryReplayer implements Closeable
 {
     private static final Logger logger = LoggerFactory.getLogger(QueryReplayer.class);
     private static final int PRINT_RATE = 5000;
-    private final ExecutorService es = Executors.newFixedThreadPool(1);
+    private final ExecutorService es = executorFactory().sequential("QueryReplayer");
     private final Iterator<List<FQLQuery>> queryIterator;
     private final List<Predicate<FQLQuery>> filters;
     private final List<Session> sessions;
diff --git a/tools/fqltool/src/org/apache/cassandra/fqltool/ResultComparator.java b/tools/fqltool/src/org/apache/cassandra/fqltool/ResultComparator.java
index eeebe20..3935e94 100644
--- a/tools/fqltool/src/org/apache/cassandra/fqltool/ResultComparator.java
+++ b/tools/fqltool/src/org/apache/cassandra/fqltool/ResultComparator.java
@@ -151,4 +151,4 @@
         }
         return sb.toString();
     }
-}
\ No newline at end of file
+}
diff --git a/tools/stress/src/org/apache/cassandra/io/sstable/StressCQLSSTableWriter.java b/tools/stress/src/org/apache/cassandra/io/sstable/StressCQLSSTableWriter.java
index bc6756b..8aa9867 100644
--- a/tools/stress/src/org/apache/cassandra/io/sstable/StressCQLSSTableWriter.java
+++ b/tools/stress/src/org/apache/cassandra/io/sstable/StressCQLSSTableWriter.java
@@ -35,6 +35,7 @@
 import org.apache.cassandra.schema.TableMetadata;
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.schema.Schema;
+import org.apache.cassandra.schema.SchemaTransformations;
 import org.apache.cassandra.cql3.CQLFragmentParser;
 import org.apache.cassandra.cql3.ColumnSpecification;
 import org.apache.cassandra.cql3.CqlParser;
@@ -58,6 +59,8 @@
 import org.apache.cassandra.transport.ProtocolVersion;
 import org.apache.cassandra.utils.ByteBufferUtil;
 
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+
 /**
  * Utility to write SSTables.
  * <p>
@@ -242,14 +245,16 @@
             throw new InvalidRequestException(String.format("Invalid number of arguments, expecting %d values but got %d", boundNames.size(), values.size()));
 
         QueryOptions options = QueryOptions.forInternalCalls(null, values);
-        List<ByteBuffer> keys = insert.buildPartitionKeyNames(options);
-        SortedSet<Clustering<?>> clusterings = insert.createClustering(options);
+        ClientState state = ClientState.forInternalCalls();
+        List<ByteBuffer> keys = insert.buildPartitionKeyNames(options, state);
+        SortedSet<Clustering<?>> clusterings = insert.createClustering(options, state);
 
-        long now = System.currentTimeMillis();
+        long now = currentTimeMillis();
         // Note that we asks indexes to not validate values (the last 'false' arg below) because that triggers a 'Keyspace.open'
         // and that forces a lot of initialization that we don't want.
         UpdateParameters params = new UpdateParameters(insert.metadata(),
                                                        insert.updatedColumns(),
+                                                       ClientState.forInternalCalls(),
                                                        options,
                                                        insert.getTimestamp(TimeUnit.MILLISECONDS.toMicros(now), options),
                                                        (int) TimeUnit.MILLISECONDS.toSeconds(now),
@@ -329,7 +334,7 @@
      */
     public File getInnermostDirectory()
     {
-        return cfs.getDirectories().getDirectoryForNewSSTables();
+        return cfs.getDirectories().getDirectoryForNewSSTables().toJavaIOFile();
     }
 
     /**
@@ -350,7 +355,7 @@
         private IPartitioner partitioner;
 
         private boolean sorted = false;
-        private long bufferSizeInMB = 128;
+        private long bufferSizeInMiB = 128;
 
         protected Builder()
         {
@@ -496,19 +501,38 @@
          * The size of the buffer to use.
          * <p>
          * This defines how much data will be buffered before being written as
-         * a new SSTable. This correspond roughly to the data size that will have the created
+         * a new SSTable. This corresponds roughly to the data size that will have the created
          * sstable.
          * <p>
-         * The default is 128MB, which should be reasonable for a 1GB heap. If you experience
+         * The default is 128MiB, which should be reasonable for a 1GiB heap. If you experience
          * OOM while using the writer, you should lower this value.
          *
-         * @param size the size to use in MB.
+         * @param size the size to use in MiB.
+         * @return this builder.
+         */
+        public Builder withBufferSizeInMiB(int size)
+        {
+            this.bufferSizeInMiB = size;
+            return this;
+        }
+
+        /**
+         * This method is deprecated in favor of the new withBufferSizeInMiB(int size)
+         * The size of the buffer to use.
+         * <p>
+         * This defines how much data will be buffered before being written as
+         * a new SSTable. This corresponds roughly to the data size that will have the created
+         * sstable.
+         * <p>
+         * The default is 128MiB, which should be reasonable for a 1GiB heap. If you experience
+         * OOM while using the writer, you should lower this value.
+         *
+         * @param size the size to use in MiB.
          * @return this builder.
          */
         public Builder withBufferSizeInMB(int size)
         {
-            this.bufferSizeInMB = size;
-            return this;
+            return withBufferSizeInMiB(size);
         }
 
         /**
@@ -524,7 +548,7 @@
          * the rows in order, which is rarely the case. If you can provide the
          * rows in order however, using this sorted might be more efficient.
          * <p>
-         * Note that if used, some option like withBufferSizeInMB will be ignored.
+         * Note that if used, some option like withBufferSizeInMiB will be ignored.
          *
          * @return this builder.
          */
@@ -555,7 +579,7 @@
                 UpdateStatement preparedInsert = prepareInsert();
                 AbstractSSTableSimpleWriter writer = sorted
                                                      ? new SSTableSimpleWriter(cfs.getDirectories().getDirectoryForNewSSTables(), cfs.metadata, preparedInsert.updatedColumns())
-                                                     : new SSTableSimpleUnsortedWriter(cfs.getDirectories().getDirectoryForNewSSTables(), cfs.metadata, preparedInsert.updatedColumns(), bufferSizeInMB);
+                                                     : new SSTableSimpleUnsortedWriter(cfs.getDirectories().getDirectoryForNewSSTables(), cfs.metadata, preparedInsert.updatedColumns(), bufferSizeInMiB);
 
                 if (formatType != null)
                     writer.setSSTableFormatType(formatType);
@@ -566,15 +590,14 @@
             }
         }
 
-        private static void createTypes(String keyspace, List<CreateTypeStatement.Raw> typeStatements)
+        private static Types createTypes(String keyspace, List<CreateTypeStatement.Raw> typeStatements)
         {
             KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace);
             Types.RawBuilder builder = Types.rawBuilder(keyspace);
             for (CreateTypeStatement.Raw st : typeStatements)
                 st.addToRawBuilder(builder);
 
-            ksm = ksm.withSwapped(builder.build());
-            Schema.instance.load(ksm);
+            return builder.build();
         }
 
         public static ColumnFamilyStore createOfflineTable(String schema, List<File> directoryList)
@@ -590,10 +613,10 @@
         {
             String keyspace = schemaStatement.keyspace();
 
-            if (Schema.instance.getKeyspaceMetadata(keyspace) == null)
-                Schema.instance.load(KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1)));
+            Schema.instance.transform(SchemaTransformations.addKeyspace(KeyspaceMetadata.create(keyspace, KeyspaceParams.simple(1)), true));
 
-            createTypes(keyspace, typeStatements);
+            Types types = createTypes(keyspace, typeStatements);
+            Schema.instance.transform(SchemaTransformations.addTypes(types, true));
 
             KeyspaceMetadata ksm = Schema.instance.getKeyspaceMetadata(keyspace);
 
@@ -611,13 +634,13 @@
                                      .build();
 
             Keyspace.setInitialized();
-            Directories directories = new Directories(tableMetadata, directoryList.stream().map(Directories.DataDirectory::new).collect(Collectors.toList()));
+            Directories directories = new Directories(tableMetadata, directoryList.stream().map(f -> new Directories.DataDirectory(new org.apache.cassandra.io.util.File(f.toPath()))).collect(Collectors.toList()));
 
             Keyspace ks = Keyspace.openWithoutSSTables(keyspace);
             ColumnFamilyStore cfs =  ColumnFamilyStore.createColumnFamilyStore(ks, tableMetadata.name, TableMetadataRef.forOfflineTools(tableMetadata), directories, false, false, true);
 
             ks.initCfCustom(cfs);
-            Schema.instance.load(ksm.withSwapped(ksm.tables.with(cfs.metadata())));
+            Schema.instance.transform(SchemaTransformations.addTable(tableMetadata, true));
 
             return cfs;
         }
diff --git a/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java b/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java
index 88aa6a4..0e7eec5 100644
--- a/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java
+++ b/tools/stress/src/org/apache/cassandra/stress/CompactionStress.java
@@ -22,7 +22,10 @@
 import java.io.IOError;
 import java.net.URI;
 import java.util.*;
-import java.util.concurrent.*;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.TimeUnit;
 import javax.inject.Inject;
 
 import com.google.common.collect.Lists;
@@ -33,7 +36,6 @@
 import org.apache.cassandra.cql3.statements.schema.CreateTableStatement;
 import org.apache.cassandra.db.ColumnFamilyStore;
 import org.apache.cassandra.db.Directories;
-import org.apache.cassandra.db.SystemKeyspace;
 import org.apache.cassandra.db.commitlog.CommitLog;
 import org.apache.cassandra.db.compaction.CompactionManager;
 import org.apache.cassandra.db.lifecycle.LifecycleTransaction;
@@ -54,6 +56,7 @@
 import org.apache.cassandra.tools.nodetool.CompactionStats;
 import org.apache.cassandra.utils.FBUtilities;
 import org.apache.cassandra.utils.JVMStabilityInspector;
+import org.apache.cassandra.utils.concurrent.Future;
 
 /**
  * Tool that allows fast route to loading data for arbitrary schemas to disk
@@ -212,10 +215,9 @@
         public void run()
         {
             //Setup
-            SystemKeyspace.finishStartup(); //needed for early-open
             CompactionManager.instance.setMaximumCompactorThreads(threads);
             CompactionManager.instance.setCoreCompactorThreads(threads);
-            CompactionManager.instance.setRate(0);
+            CompactionManager.instance.setRateInBytes(0);
 
             StressProfile stressProfile = getStressProfile();
             ColumnFamilyStore cfs = initCf(stressProfile, true);
@@ -269,10 +271,10 @@
     @Command(name = "write", description = "write data directly to disk")
     public static class DataWriter extends CompactionStress
     {
-        private static double BYTES_IN_GB = 1024 * 1014 * 1024;
+        private static double BYTES_IN_GIB = 1024 * 1014 * 1024;
 
         @Option(name = { "-g", "--gbsize"}, description = "Total GB size on disk you wish to write", required = true)
-        Integer totalSizeGb;
+        Integer totalSizeGiB;
 
         @Option(name = { "-t", "--threads" }, description = "Number of sstable writer threads (default 2)")
         Integer threads = 2;
@@ -280,7 +282,7 @@
         @Option(name = { "-c", "--partition-count"}, description = "Number of partitions to loop over (default 1000000)")
         Integer partitions = 1000000;
 
-        @Option(name = { "-b", "--buffer-size-mb"}, description = "Buffer in MB writes before writing new sstable (default 128)")
+        @Option(name = { "-b", "--buffer-size-mb"}, description = "Buffer in MiB writes before writing new sstable (default 128)")
         Integer bufferSize = 128;
 
         @Option(name = { "-r", "--range-aware"}, description = "Splits the local ranges in number of data directories and makes sure we never write the same token in two different directories (default true)")
@@ -322,13 +324,13 @@
                 });
             }
 
-            double currentSizeGB;
-            while ((currentSizeGB = directories.getRawDiretoriesSize() / BYTES_IN_GB) < totalSizeGb)
+            double currentSizeGiB;
+            while ((currentSizeGiB = directories.getRawDiretoriesSize() / BYTES_IN_GIB) < totalSizeGiB)
             {
                 if (finished.getCount() == 0)
                     break;
 
-                System.out.println(String.format("Written %.2fGB of %dGB", currentSizeGB, totalSizeGb));
+                System.out.println(String.format("Written %.2fGB of %dGB", currentSizeGiB, totalSizeGiB));
 
                 Uninterruptibles.sleepUninterruptibly(3, TimeUnit.SECONDS);
             }
@@ -336,8 +338,8 @@
             workManager.stop();
             Uninterruptibles.awaitUninterruptibly(finished);
 
-            currentSizeGB = directories.getRawDiretoriesSize() / BYTES_IN_GB;
-            System.out.println(String.format("Finished writing %.2fGB", currentSizeGB));
+            currentSizeGiB = directories.getRawDiretoriesSize() / BYTES_IN_GIB;
+            System.out.println(String.format("Finished writing %.2fGB", currentSizeGiB));
         }
     }
 
diff --git a/tools/stress/src/org/apache/cassandra/stress/Stress.java b/tools/stress/src/org/apache/cassandra/stress/Stress.java
index 1fd808f..c104e5c 100644
--- a/tools/stress/src/org/apache/cassandra/stress/Stress.java
+++ b/tools/stress/src/org/apache/cassandra/stress/Stress.java
@@ -18,14 +18,10 @@
 package org.apache.cassandra.stress;
 
 import java.io.*;
-import java.net.Socket;
-import java.net.SocketException;
 
 import org.apache.cassandra.config.DatabaseDescriptor;
 import org.apache.cassandra.stress.settings.StressSettings;
 import org.apache.cassandra.stress.util.MultiResultLogger;
-import org.apache.cassandra.utils.FBUtilities;
-import org.apache.cassandra.utils.WindowsTimer;
 import org.apache.commons.lang3.exception.ExceptionUtils;
 
 public final class Stress
@@ -53,22 +49,11 @@
      *   thread count with a high error rate / low count to get some basic numbers
      */
 
-    private static volatile boolean stopped = false;
-
     public static void main(String[] arguments) throws Exception
     {
-        if (FBUtilities.isWindows)
-            WindowsTimer.startTimerPeriod(1);
-
-        int exitCode = run(arguments);
-
-        if (FBUtilities.isWindows)
-            WindowsTimer.endTimerPeriod(1);
-
-        System.exit(exitCode);
+        System.exit(run(arguments));
     }
 
-
     private static int run(String[] arguments)
     {
         try
@@ -112,52 +97,11 @@
                 logout.addStream(new PrintStream(settings.graph.temporaryLogFile));
             }
 
-            if (settings.sendToDaemon != null)
-            {
-                Socket socket = new Socket(settings.sendToDaemon, 2159);
-
-                ObjectOutputStream out = new ObjectOutputStream(socket.getOutputStream());
-                BufferedReader inp = new BufferedReader(new InputStreamReader(socket.getInputStream()));
-
-                Runtime.getRuntime().addShutdownHook(new ShutDown(socket, out));
-
-                out.writeObject(settings);
-
-                String line;
-
-                try
-                {
-                    while (!socket.isClosed() && (line = inp.readLine()) != null)
-                    {
-                        if (line.equals("END") || line.equals("FAILURE"))
-                        {
-                            out.writeInt(1);
-                            break;
-                        }
-
-                        logout.println(line);
-                    }
-                }
-                catch (SocketException e)
-                {
-                    if (!stopped)
-                        e.printStackTrace();
-                }
-
-                out.close();
-                inp.close();
-
-                socket.close();
-            }
-            else
-            {
-                StressAction stressAction = new StressAction(settings, logout);
-                stressAction.run();
-                logout.flush();
-                if (settings.graph.inGraphMode())
-                    new StressGraph(settings, arguments).generateGraph();
-            }
-
+            StressAction stressAction = new StressAction(settings, logout);
+            stressAction.run();
+            logout.flush();
+            if (settings.graph.inGraphMode())
+                new StressGraph(settings, arguments).generateGraph();
         }
         catch (Throwable t)
         {
@@ -175,37 +119,4 @@
     {
         StressSettings.printHelp();
     }
-
-    private static class ShutDown extends Thread
-    {
-        private final Socket socket;
-        private final ObjectOutputStream out;
-
-        public ShutDown(Socket socket, ObjectOutputStream out)
-        {
-            this.out = out;
-            this.socket = socket;
-        }
-
-        public void run()
-        {
-            try
-            {
-                if (!socket.isClosed())
-                {
-                    System.out.println("Control-C caught. Canceling running action and shutting down...");
-
-                    out.writeInt(1);
-                    out.close();
-
-                    stopped = true;
-                }
-            }
-            catch (IOException e)
-            {
-                e.printStackTrace();
-            }
-        }
-    }
-
 }
diff --git a/tools/stress/src/org/apache/cassandra/stress/StressAction.java b/tools/stress/src/org/apache/cassandra/stress/StressAction.java
index 3268182..f9912ac 100644
--- a/tools/stress/src/org/apache/cassandra/stress/StressAction.java
+++ b/tools/stress/src/org/apache/cassandra/stress/StressAction.java
@@ -39,6 +39,8 @@
 
 import com.google.common.util.concurrent.Uninterruptibles;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 public class StressAction implements Runnable
 {
 
@@ -315,7 +317,7 @@
 
         void start()
         {
-            start = System.nanoTime();
+            start = nanoTime();
         }
 
         /**
@@ -361,7 +363,7 @@
                 long intendedTime = rateLimiter.acquire(partitionCount);
                 op.intendedStartNs(intendedTime);
                 long now;
-                while ((now = System.nanoTime()) < intendedTime)
+                while ((now = nanoTime()) < intendedTime)
                 {
                     LockSupport.parkNanos(intendedTime - now);
                 }
diff --git a/tools/stress/src/org/apache/cassandra/stress/StressGraph.java b/tools/stress/src/org/apache/cassandra/stress/StressGraph.java
index 7a865b4..76a86db 100644
--- a/tools/stress/src/org/apache/cassandra/stress/StressGraph.java
+++ b/tools/stress/src/org/apache/cassandra/stress/StressGraph.java
@@ -20,7 +20,6 @@
 
 import java.io.BufferedReader;
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InputStreamReader;
diff --git a/tools/stress/src/org/apache/cassandra/stress/StressProfile.java b/tools/stress/src/org/apache/cassandra/stress/StressProfile.java
index 5eb478c..cc668b5 100644
--- a/tools/stress/src/org/apache/cassandra/stress/StressProfile.java
+++ b/tools/stress/src/org/apache/cassandra/stress/StressProfile.java
@@ -35,7 +35,6 @@
 import com.google.common.util.concurrent.Uninterruptibles;
 
 import com.datastax.driver.core.*;
-import com.datastax.driver.core.TableMetadata;
 import com.datastax.driver.core.exceptions.AlreadyExistsException;
 import org.antlr.runtime.RecognitionException;
 import org.apache.cassandra.cql3.CQLFragmentParser;
diff --git a/tools/stress/src/org/apache/cassandra/stress/StressServer.java b/tools/stress/src/org/apache/cassandra/stress/StressServer.java
deleted file mode 100644
index c00fb54..0000000
--- a/tools/stress/src/org/apache/cassandra/stress/StressServer.java
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
-* Licensed to the Apache Software Foundation (ASF) under one
-* or more contributor license agreements.  See the NOTICE file
-* distributed with this work for additional information
-* regarding copyright ownership.  The ASF licenses this file
-* to you under the Apache License, Version 2.0 (the
-* "License"); you may not use this file except in compliance
-* with the License.  You may obtain a copy of the License at
-*
-*     http://www.apache.org/licenses/LICENSE-2.0
-*
-* Unless required by applicable law or agreed to in writing, software
-* distributed under the License is distributed on an "AS IS" BASIS,
-* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-* See the License for the specific language governing permissions and
-* limitations under the License.
-*/
-package org.apache.cassandra.stress;
-
-import java.io.IOException;
-import java.io.ObjectInputStream;
-import java.io.PrintStream;
-import java.net.InetAddress;
-import java.net.ServerSocket;
-import java.net.Socket;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.commons.cli.*;
-
-import org.apache.cassandra.concurrent.NamedThreadFactory;
-import org.apache.cassandra.stress.settings.StressSettings;
-import org.apache.cassandra.stress.util.MultiResultLogger;
-import org.apache.cassandra.stress.util.ResultLogger;
-
-public class StressServer
-{
-    private static final Options availableOptions = new Options();
-
-    static
-    {
-        availableOptions.addOption("h", "host", true, "Host to listen for connections.");
-    }
-
-    private static final AtomicInteger threadCounter = new AtomicInteger(1);
-
-    public static void main(String[] args) throws Exception
-    {
-        ServerSocket serverSocket = null;
-        CommandLineParser parser  = new PosixParser();
-
-        InetAddress address = InetAddress.getByName("127.0.0.1");
-
-        try
-        {
-            CommandLine cmd = parser.parse(availableOptions, args);
-
-            if (cmd.hasOption("h"))
-            {
-                address = InetAddress.getByName(cmd.getOptionValue("h"));
-            }
-        }
-        catch (ParseException e)
-        {
-            System.err.printf("Usage: ./bin/stressd start|stop|status [-h <host>]");
-            System.exit(1);
-        }
-
-        try
-        {
-            serverSocket = new ServerSocket(2159, 0, address);
-        }
-        catch (IOException e)
-        {
-            System.err.printf("Could not listen on port: %s:2159.%n", address.getHostAddress());
-            System.exit(1);
-        }
-
-        for (;;)
-            new StressThread(serverSocket.accept()).start();
-    }
-
-    public static class StressThread extends Thread
-    {
-        private final Socket socket;
-
-        public StressThread(Socket client)
-        {
-            this.socket = client;
-        }
-
-        public void run()
-        {
-            try
-            {
-                ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
-                PrintStream out = new PrintStream(socket.getOutputStream());
-                ResultLogger log = new MultiResultLogger(out);
-
-                StressAction action = new StressAction((StressSettings) in.readObject(), log);
-                Thread actionThread = NamedThreadFactory.createThread(action, "stress-" + threadCounter.incrementAndGet());
-                actionThread.start();
-
-                while (actionThread.isAlive())
-                {
-                    try
-                    {
-                        if (in.readInt() == 1)
-                        {
-                            actionThread.interrupt();
-                            break;
-                        }
-                    }
-                    catch (Exception e)
-                    {
-                        // continue without problem
-                    }
-                }
-
-                out.close();
-                in.close();
-                socket.close();
-            }
-            catch (IOException e)
-            {
-                throw new RuntimeException(e.getMessage(), e);
-            }
-            catch (Exception e)
-            {
-                e.printStackTrace();
-            }
-        }
-
-    }
-
-}
diff --git a/tools/stress/src/org/apache/cassandra/stress/generate/PartitionGenerator.java b/tools/stress/src/org/apache/cassandra/stress/generate/PartitionGenerator.java
index 882b8b4..2196fe0 100644
--- a/tools/stress/src/org/apache/cassandra/stress/generate/PartitionGenerator.java
+++ b/tools/stress/src/org/apache/cassandra/stress/generate/PartitionGenerator.java
@@ -104,10 +104,10 @@
     public ByteBuffer convert(int c, Object v)
     {
         if (c < 0)
-            return partitionKey.get(-1-c).type.decompose(v);
+            return partitionKey.get(-1-c).type.decomposeUntyped(v);
         if (c < clusteringComponents.size())
-            return clusteringComponents.get(c).type.decompose(v);
-        return valueComponents.get(c - clusteringComponents.size()).type.decompose(v);
+            return clusteringComponents.get(c).type.decomposeUntyped(v);
+        return valueComponents.get(c - clusteringComponents.size()).type.decomposeUntyped(v);
     }
 
     public Object convert(int c, ByteBuffer v)
diff --git a/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java b/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java
index f485ab7..d4867fa 100644
--- a/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java
+++ b/tools/stress/src/org/apache/cassandra/stress/generate/PartitionIterator.java
@@ -42,6 +42,7 @@
 import org.apache.cassandra.db.marshal.BytesType;
 import org.apache.cassandra.stress.generate.values.Generator;
 import org.apache.cassandra.utils.Pair;
+import org.apache.cassandra.utils.TimeUUID;
 
 // a partition is re-used to reduce garbage generation, as is its internal RowIterator
 // TODO: we should batch the generation of clustering components so we can bound the time and size necessary to
@@ -746,9 +747,13 @@
         {
             return seed * 31 + (((UUID) object).getLeastSignificantBits() ^ ((UUID) object).getMostSignificantBits());
         }
+        else if (object instanceof TimeUUID)
+        {
+            return seed * 31 + (((TimeUUID) object).lsb() ^ ((TimeUUID) object).msb());
+        }
         else
         {
-            return seed(type.decompose(object), BytesType.instance, seed);
+            return seed(type.decomposeUntyped(object), BytesType.instance, seed);
         }
     }
 
@@ -766,7 +771,7 @@
             if (i > 0)
                 sb.append("|");
             AbstractType type = generator.partitionKey.get(i++).type;
-            sb.append(type.getString(type.decompose(key)));
+            sb.append(type.getString(type.decomposeUntyped(key)));
         }
         return sb.toString();
     }
diff --git a/tools/stress/src/org/apache/cassandra/stress/generate/values/Bytes.java b/tools/stress/src/org/apache/cassandra/stress/generate/values/Bytes.java
index 3c15c87..f95061f 100644
--- a/tools/stress/src/org/apache/cassandra/stress/generate/values/Bytes.java
+++ b/tools/stress/src/org/apache/cassandra/stress/generate/values/Bytes.java
@@ -51,4 +51,4 @@
                 bytes[i++] = (byte)v;
         return ByteBuffer.wrap(Arrays.copyOf(bytes, size));
     }
-}
\ No newline at end of file
+}
diff --git a/tools/stress/src/org/apache/cassandra/stress/generate/values/Generator.java b/tools/stress/src/org/apache/cassandra/stress/generate/values/Generator.java
index 6b39d08..631e9b8 100644
--- a/tools/stress/src/org/apache/cassandra/stress/generate/values/Generator.java
+++ b/tools/stress/src/org/apache/cassandra/stress/generate/values/Generator.java
@@ -30,14 +30,14 @@
 {
 
     public final String name;
-    public final AbstractType<T> type;
+    public final AbstractType<?> type;
     public final Class<?> clazz;
     final long salt;
     final Distribution identityDistribution;
     final Distribution sizeDistribution;
     public final Distribution clusteringDistribution;
 
-    public Generator(AbstractType<T> type, GeneratorConfig config, String name, Class<?> clazz)
+    public Generator(AbstractType<?> type, GeneratorConfig config, String name, Class<?> clazz)
     {
         this.type = type;
         this.name = name;
diff --git a/tools/stress/src/org/apache/cassandra/stress/generate/values/TimeUUIDs.java b/tools/stress/src/org/apache/cassandra/stress/generate/values/TimeUUIDs.java
index 537d54e..969ecbf 100644
--- a/tools/stress/src/org/apache/cassandra/stress/generate/values/TimeUUIDs.java
+++ b/tools/stress/src/org/apache/cassandra/stress/generate/values/TimeUUIDs.java
@@ -24,7 +24,7 @@
 import java.util.UUID;
 
 import org.apache.cassandra.db.marshal.TimeUUIDType;
-import org.apache.cassandra.utils.UUIDGen;
+import org.apache.cassandra.utils.TimeUUID;
 
 public class TimeUUIDs extends Generator<UUID>
 {
@@ -46,6 +46,6 @@
     @Override
     public UUID generate()
     {
-        return UUIDGen.getTimeUUID(dateGen.generate().getTime(), 0L, clockSeqAndNode);
+        return TimeUUID.atUnixMicrosWithLsb(dateGen.generate().getTime() * 1000L, clockSeqAndNode).asUUID();
     }
 }
diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistribution.java b/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistribution.java
index 6d7f9e4..92580a5 100644
--- a/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistribution.java
+++ b/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistribution.java
@@ -25,7 +25,6 @@
 
 import org.apache.cassandra.stress.Operation;
 import org.apache.cassandra.stress.generate.Distribution;
-import org.apache.commons.math3.util.Pair;
 
 public class SampledOpDistribution implements OpDistribution
 {
diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java b/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java
index 59f2394..5757640 100644
--- a/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java
+++ b/tools/stress/src/org/apache/cassandra/stress/operations/SampledOpDistributionFactory.java
@@ -30,7 +30,6 @@
 import org.apache.cassandra.stress.StressAction.MeasurementSink;
 import org.apache.cassandra.stress.generate.DistributionFactory;
 import org.apache.cassandra.stress.generate.DistributionFixed;
-import org.apache.cassandra.stress.generate.PartitionGenerator;
 import org.apache.cassandra.stress.report.Timer;
 import org.apache.commons.math3.distribution.EnumeratedDistribution;
 import org.apache.commons.math3.util.Pair;
diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/CASQuery.java b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/CASQuery.java
index 8750790..1487a0d 100644
--- a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/CASQuery.java
+++ b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/CASQuery.java
@@ -33,7 +33,6 @@
 import org.apache.cassandra.cql3.conditions.ColumnCondition;
 import org.apache.cassandra.cql3.statements.ModificationStatement;
 import org.apache.cassandra.db.ConsistencyLevel;
-import org.apache.cassandra.schema.ColumnMetadata;
 import org.apache.cassandra.stress.generate.DistributionFixed;
 import org.apache.cassandra.stress.generate.PartitionGenerator;
 import org.apache.cassandra.stress.generate.Row;
@@ -225,4 +224,4 @@
         }
         return statement.bind(bindBuffer);
     }
-}
\ No newline at end of file
+}
diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaInsert.java b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaInsert.java
index 4cfea82..258e688 100644
--- a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaInsert.java
+++ b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/SchemaInsert.java
@@ -151,7 +151,7 @@
     {
         return StressCQLSSTableWriter.builder()
                                .withCfs(cfs)
-                               .withBufferSizeInMB(bufferSize)
+                               .withBufferSizeInMiB(bufferSize)
                                .forTable(tableSchema)
                                .using(insertStatement)
                                .rangeAware(makeRangeAware)
diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/TokenRangeQuery.java b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/TokenRangeQuery.java
index fe5f129..ac06793 100644
--- a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/TokenRangeQuery.java
+++ b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/TokenRangeQuery.java
@@ -24,8 +24,6 @@
 import java.util.Set;
 import java.util.stream.Collectors;
 
-import javax.naming.OperationNotSupportedException;
-
 import com.datastax.driver.core.ColumnMetadata;
 import com.datastax.driver.core.PagingState;
 import com.datastax.driver.core.ResultSet;
diff --git a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java
index 6d93f4c..e8a640f 100644
--- a/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java
+++ b/tools/stress/src/org/apache/cassandra/stress/operations/userdefined/ValidatingSchemaQuery.java
@@ -22,7 +22,6 @@
 
 
 import java.io.IOException;
-import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
diff --git a/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java b/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java
index b2afd1b..b50dfd2 100644
--- a/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java
+++ b/tools/stress/src/org/apache/cassandra/stress/report/StressMetrics.java
@@ -54,7 +54,10 @@
 import org.apache.cassandra.stress.util.Uncertainty;
 import org.apache.cassandra.utils.FBUtilities;
 
+import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.concurrent.TimeUnit.NANOSECONDS;
+import static org.apache.cassandra.utils.Clock.Global.currentTimeMillis;
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
 
 public class StressMetrics implements MeasurementSink
 {
@@ -65,8 +68,8 @@
     private final CountDownLatch stopped = new CountDownLatch(1);
     private final Callable<JmxCollector.GcStats> gcStatsCollector;
     private final HistogramLogWriter histogramWriter;
-    private final long epochNs = System.nanoTime();
-    private final long epochMs = System.currentTimeMillis();
+    private final long epochNs = nanoTime();
+    private final long epochMs = currentTimeMillis();
 
     private volatile JmxCollector.GcStats totalGcStats = new GcStats(0);
 
@@ -159,10 +162,10 @@
     private void reportingLoop(final long logIntervalMillis)
     {
         // align report timing to the nearest second
-        final long currentTimeMs = System.currentTimeMillis();
+        final long currentTimeMs = currentTimeMillis();
         final long startTimeMs = currentTimeMs - (currentTimeMs % 1000);
         // reporting interval starts rounded to the second
-        long reportingStartNs = (System.nanoTime() - TimeUnit.MILLISECONDS.toNanos(currentTimeMs - startTimeMs));
+        long reportingStartNs = (nanoTime() - MILLISECONDS.toNanos(currentTimeMs - startTimeMs));
         final long parkIntervalNs = TimeUnit.MILLISECONDS.toNanos(logIntervalMillis);
         try
         {
@@ -178,7 +181,7 @@
                 reportingStartNs += parkIntervalNs;
             }
 
-            final long end = System.nanoTime();
+            final long end = nanoTime();
             recordInterval(end, end - reportingStartNs);
         }
         catch (Exception e)
@@ -198,7 +201,7 @@
     {
         long parkFor;
         while (!stop &&
-               (parkFor = until - System.nanoTime()) > 0)
+               (parkFor = until - nanoTime()) > 0)
         {
             LockSupport.parkNanos(parkFor);
         }
diff --git a/tools/stress/src/org/apache/cassandra/stress/report/Timer.java b/tools/stress/src/org/apache/cassandra/stress/report/Timer.java
index b3df52f..3938b0c 100644
--- a/tools/stress/src/org/apache/cassandra/stress/report/Timer.java
+++ b/tools/stress/src/org/apache/cassandra/stress/report/Timer.java
@@ -23,6 +23,8 @@
 
 import org.apache.cassandra.stress.StressAction.MeasurementSink;
 
+import static org.apache.cassandra.utils.Clock.Global.nanoTime;
+
 // a timer - this timer must be used by a single thread, and co-ordinates with other timers by
 public final class Timer
 {
@@ -42,7 +44,7 @@
 
     public void stop(long partitionCount, long rowCount, boolean error)
     {
-        sink.record(opType, intendedTimeNs, startTimeNs, System.nanoTime(), rowCount, partitionCount, error);
+        sink.record(opType, intendedTimeNs, startTimeNs, nanoTime(), rowCount, partitionCount, error);
         resetTimes();
     }
 
@@ -58,6 +60,6 @@
 
     public void start()
     {
-        startTimeNs = System.nanoTime();
+        startTimeNs = nanoTime();
     }
-}
\ No newline at end of file
+}
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/CliOption.java b/tools/stress/src/org/apache/cassandra/stress/settings/CliOption.java
index 018669a..eba276e 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/CliOption.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/CliOption.java
@@ -37,7 +37,6 @@
     LOG("Where to log progress to, and the interval at which to do it", SettingsLog.helpPrinter()),
     TRANSPORT("Custom transport factories", SettingsTransport.helpPrinter()),
     PORT("The port to connect to cassandra nodes on", SettingsPort.helpPrinter()),
-    SENDTO("-send-to", "Specify a stress server to send this command to", SettingsMisc.sendToDaemonHelpPrinter()),
     GRAPH("-graph", "Graph recorded metrics", SettingsGraph.helpPrinter()),
     TOKENRANGE("Token range settings", SettingsTokenRange.helpPrinter())
     ;
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/Command.java b/tools/stress/src/org/apache/cassandra/stress/settings/Command.java
index d8ac5d1..8840209 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/Command.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/Command.java
@@ -138,4 +138,4 @@
         throw new AssertionError();
     }
 
-}
\ No newline at end of file
+}
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java b/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java
index ba94e3f..c026874 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/Legacy.java
@@ -65,7 +65,6 @@
         availableOptions.addOption("R",  "replication-strategy", true,   "Replication strategy to use (only on insert if keyspace does not exist), default:org.apache.cassandra.locator.SimpleStrategy");
         availableOptions.addOption("O",  "strategy-properties",  true,   "Replication strategy properties in the following format <dc_name>:<num>,<dc_name>:<num>,...");
         availableOptions.addOption("V",  "average-size-values",  false,  "Generate column values of average rather than specific size");
-        availableOptions.addOption("T",  "send-to",              true,   "Send this as a request to the stress daemon at specified address.");
         availableOptions.addOption("I",  "compression",          true,   "Specify the compression to use for sstable, default:no compression");
         availableOptions.addOption("Q",  "query-names",          true,   "Comma-separated list of column names to retrieve from each row.");
         availableOptions.addOption("Z",  "compaction-strategy",  true,   "CompactionStrategy to use.");
@@ -238,10 +237,6 @@
             if (cmd.hasOption("D"))
                 r.add("-node", "file=" + cmd.getOptionValue("D"));
 
-
-            if (cmd.hasOption("send-to"))
-                r.add("-send-to", cmd.getOptionValue("send-to"));
-
             if (cmd.hasOption("Z"))
                 r.add("-schema", "compaction=" + cmd.getOptionValue("Z"));
 
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommand.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommand.java
index 314774a..af10719 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommand.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommand.java
@@ -233,16 +233,4 @@
     {
         GroupedOptions.printOptions(System.out, type.toLowerCase(), new Uncertainty(), new Count(), new Duration());
     }
-
-    static Runnable helpPrinter(final Command type)
-    {
-        return new Runnable()
-        {
-            @Override
-            public void run()
-            {
-                printHelp(type);
-            }
-        };
-    }
 }
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandPreDefinedMixed.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandPreDefinedMixed.java
index 1df2a06..c272829 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandPreDefinedMixed.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandPreDefinedMixed.java
@@ -25,7 +25,6 @@
 
 import org.apache.cassandra.stress.Operation;
 import org.apache.cassandra.stress.generate.DistributionFactory;
-import org.apache.cassandra.stress.generate.PartitionGenerator;
 import org.apache.cassandra.stress.generate.SeedManager;
 import org.apache.cassandra.stress.operations.OpDistributionFactory;
 import org.apache.cassandra.stress.operations.SampledOpDistributionFactory;
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandUser.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandUser.java
index cbf8a3a..c96060c 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandUser.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsCommandUser.java
@@ -22,7 +22,6 @@
 
 
 import java.io.File;
-import java.io.FileNotFoundException;
 import java.net.URI;
 import java.util.Arrays;
 import java.util.Collections;
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java
index d040ccc..e953c15 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsGraph.java
@@ -22,7 +22,6 @@
 
 
 import java.io.File;
-import java.io.IOException;
 import java.io.Serializable;
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
@@ -55,7 +54,7 @@
 
         if (inGraphMode())
         {
-            temporaryLogFile = FileUtils.createTempFile("cassandra-stress", ".log");
+            temporaryLogFile = FileUtils.createTempFile("cassandra-stress", ".log").toJavaIOFile();
         }
         else
         {
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMisc.java b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMisc.java
index 3e69754..1f21a61 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMisc.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/SettingsMisc.java
@@ -216,29 +216,4 @@
             }
         });
     }
-
-    static Runnable sendToDaemonHelpPrinter()
-    {
-        return () -> {
-            System.out.println("Usage: -sendto <host>");
-            System.out.println();
-            System.out.println("Specify a host running the stress server to send this stress command to");
-        };
-    }
-
-    static String getSendToDaemon(Map<String, String[]> clArgs)
-    {
-        String[] params = clArgs.remove("-send-to");
-        if (params == null)
-            params = clArgs.remove("-sendto");
-        if (params == null)
-            return null;
-        if (params.length != 1)
-        {
-            sendToDaemonHelpPrinter().run();
-            System.out.println("Invalid -sendto specifier: " + Arrays.toString(params));
-            System.exit(1);
-        }
-        return params[0];
-    }
 }
diff --git a/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java b/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java
index 4287123..2f76dfb 100644
--- a/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java
+++ b/tools/stress/src/org/apache/cassandra/stress/settings/StressSettings.java
@@ -43,7 +43,6 @@
     public final SettingsSchema schema;
     public final SettingsTransport transport;
     public final SettingsPort port;
-    public final String sendToDaemon;
     public final SettingsGraph graph;
     public final SettingsTokenRange tokenRange;
 
@@ -59,7 +58,6 @@
                           SettingsSchema schema,
                           SettingsTransport transport,
                           SettingsPort port,
-                          String sendToDaemon,
                           SettingsGraph graph,
                           SettingsTokenRange tokenRange)
     {
@@ -75,7 +73,6 @@
         this.schema = schema;
         this.transport = transport;
         this.port = port;
-        this.sendToDaemon = sendToDaemon;
         this.graph = graph;
         this.tokenRange = tokenRange;
     }
@@ -189,7 +186,6 @@
         SettingsCommand command = SettingsCommand.get(clArgs);
         if (command == null)
             throw new IllegalArgumentException("No command specified");
-        String sendToDaemon = SettingsMisc.getSendToDaemon(clArgs);
         SettingsPort port = SettingsPort.get(clArgs);
         SettingsRate rate = SettingsRate.get(clArgs, command);
         SettingsPopulation generate = SettingsPopulation.get(clArgs, command);
@@ -220,7 +216,7 @@
             System.exit(1);
         }
 
-        return new StressSettings(command, rate, generate, insert, columns, errors, log, mode, node, schema, transport, port, sendToDaemon, graph, tokenRange);
+        return new StressSettings(command, rate, generate, insert, columns, errors, log, mode, node, schema, transport, port, graph, tokenRange);
     }
 
     private static Map<String, String[]> parseMap(String[] args)
@@ -294,8 +290,6 @@
         transport.printSettings(out);
         out.println("Port:");
         port.printSettings(out);
-        out.println("Send To Daemon:");
-        out.printf("  " + (sendToDaemon != null ? sendToDaemon : "*not set*") + "%n");
         out.println("Graph:");
         graph.printSettings(out);
         out.println("TokenRange:");
diff --git a/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java b/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java
index cf0eede..f05c513 100644
--- a/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java
+++ b/tools/stress/src/org/apache/cassandra/stress/util/JavaDriverClient.java
@@ -158,7 +158,7 @@
         if (loadBalancingPolicy != null)
             clusterBuilder.withLoadBalancingPolicy(loadBalancingPolicy);
         clusterBuilder.withCompression(compression);
-        if (encryptionOptions.isEnabled())
+        if (encryptionOptions.getEnabled())
         {
             SSLContext sslContext;
             sslContext = SSLFactory.createSSLContext(encryptionOptions, true);
diff --git a/tools/stress/test/unit/org/apache/cassandra/stress/util/MultiResultLoggerTest.java b/tools/stress/test/unit/org/apache/cassandra/stress/util/MultiResultLoggerTest.java
index f0c99b8..417251f 100644
--- a/tools/stress/test/unit/org/apache/cassandra/stress/util/MultiResultLoggerTest.java
+++ b/tools/stress/test/unit/org/apache/cassandra/stress/util/MultiResultLoggerTest.java
@@ -102,4 +102,4 @@
 
         assertEquals("\n", output.toString());
     }
-}
\ No newline at end of file
+}
